ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyZjQ5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13c2MtYXhpcy5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkMGMyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLmF4aXM8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NWRmMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2Uud3NjLWF4aXMuamFyID0gc3JjLwotYmluLmluY2x1ZGVzID0gd3NjLWF4aXMuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcmVhZG1lLmh0bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICByZWFkbWUuaHRtbCxcCi0gICAgICAgICAgICAgICBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOWZmN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIHNlcnZpY2UgQXhpcyBDb25zdW1wdGlvbiBDb3JlCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OWUxOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZSIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgbmFtZT0iJVBMVUdJTl9OQU1FIgotICAgcHJvdmlkZXItbmFtZT0iJVBMVUdJTl9QUk9WSURFUiI+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLmF4aXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuYXBhY2hlLmFudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0id3NjLWF4aXMuamFyIj4KLSAgICAgIAk8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLndzZmluZGVyIj4KLSAgICAgIDx3c2ZpbmRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUud3NmaW5kZXIuV1NGaW5kZXJBeGlzIgotICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS53c2ZpbmRlci5XU0ZpbmRlckF4aXMiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS53c2ZpbmRlci5XU0ZpbmRlckF4aXMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS53c2ZpbmRlci5XU0ZpbmRlckF4aXMiPgotICAgICAgPC93c2ZpbmRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL2NvcmUvY29uc3VtcHRpb24ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb25zdW1wdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM4ZWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb25zdW1wdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBmb3IgQXhpc0RlcGxveUNvbW1hbmQKLSMKLU1TR19FUlJPUl9QUk9KRUNUX1VSTF9QQVJBTV9OT1RfU0VUPUlXQUIwMDU0RSBXZWIgcHJvamVjdCBVUkwgZm9yIGRlcGxveW1lbnQgb2YgV2ViIHNlcnZpY2UgaXMgbm90IHNldCBpbiBBeGlzRGVwbG95Q29tbWFuZAotTVNHX0VSUk9SX0RFUExPWV9GSUxFX1BBUkFNX05PVF9TRVQ9SVdBQjA0ODhFIExvY2F0aW9uIG9mIEF4aXMgZGVwbG95bWVudCBmaWxlIGlzIG5vdCBzZXQgaW4gQXhpc0RlcGxveUNvbW1hbmQKLU1TR19FUlJPUl9BWElTX0RFUExPWT1JV0FCMDQ4OUUgRXJyb3Igd2hlbiBkZXBsb3lpbmcgV2ViIHNlcnZpY2UgdG8gQXhpcyBydW50aW1lCi1NU0dfQVhJU19ERVBMT1k9RGVwbG95aW5nIFdlYiBzZXJ2aWNlIHRvIEF4aXMgcnVuLXRpbWUgZW52aXJvbm1lbnQKLU1TR19BWElTX0RFUExPWV9PSz1XZWIgc2VydmljZSBzdWNjZXNzZnVseSBkZXBsb3llZCB0byBBeGlzIHJ1bi10aW1lIGVudmlyb25tZW50Ci0KLVRBU0tfTEFCRUxfV1NETF9KQVZBX0NPTU1BTkQ9V1NETDJKYXZhQ29tbWFuZAotVEFTS19ERVNDX1dTRExfSkFWQV9DT01NQU5EPUNhbGxzIHRvIEFYSVMgV1NETDJKYXZhQ29tbWFuZC4KLSMKLSMgTWVzc2FnZXMgZm9yIEphdmEyV1NETENvbW1hbmQKLSMKLVRBU0tfTEFCRUxfSkFWQV9XU0RMX0NPTU1BTkQ9SmF2YTJXU0RMQ29tbWFuZAotVEFTS19ERVNDX0pBVkFfV1NETF9DT01NQU5EPUNhbGxzIHRvIEFYSVMgSmF2YTJXU0RMQ29tbWFuZC4KLU1TR19HRU5FUkFURV9XU0RMPUdlbmVyYXRpbmcgV1NETCBmaWxlOiB7MH0KLU1TR19FUlJPUl9KQVZBX1dTRExfR0VORVJBVEU9SVdBQjAzOThFIEVycm9yIGluIGdlbmVyYXRpbmcgV1NETCBmcm9tIEphdmEKLQotIwotIyBNZXNzYWdlcyBmb3IgV1NETDJKYXZhQ29tbWFuZAotIwotVEFTS19MQUJFTF9XU0RMX0pBVkFfQ09NTUFORD1XU0RMMkphdmFDb21tYW5kCi1UQVNLX0RFU0NfV1NETF9KQVZBX0NPTU1BTkQ9Q2FsbHMgdG8gQVhJUyBXU0RMMkphdmFDb21tYW5kLgotTVNHX1BBUlNJTkdfV1NETD1QYXJzaW5nIFdTREwgZmlsZTogezB9Ci1NU0dfRVJST1JfV1NETF9KQVZBX0dFTkVSQVRFPUlXQUIwMzk5RSBFcnJvciBpbiBnZW5lcmF0aW5nIEphdmEgZnJvbSBXU0RMCi0KLSMKLSMgTWVzc2FnZXMgY29tbW9uIGZvciBhbGwKLSMKLU1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVD1JV0FCMDM5N0UgSmF2YVdTRExQYXJhbSBub3Qgc2V0Ci0KLSMKLSMgTWVzc2FnZXMgY29tbW9uIGZvciBKYXZhMldTRExDb21tYW5kIGFuZCAgV1NETDJKYXZhQ29tbWFuZAotIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvQXhpc0RlcGxveUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXNEZXBsb3lDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjM2FhYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvQXhpc0RlcGxveUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy50b29scy5hbnQuYXhpcy5BZG1pbkNsaWVudFRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSAqIENvbW1hbmRzIGFyZSBleGVjdXRhYmxlLCB1bmRvYWJsZSwgcmVkb2FibGUgb2JqZWN0cy4gRXZlcnkgQ29tbWFuZCBoYXMgYSBuYW1lIGFuZCBhIGRlc2NyaXB0aW9uLgotICovCi0KLXB1YmxpYyBjbGFzcyBBeGlzRGVwbG95Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfRVhUID0gIi9zZXJ2aWNlcy9BZG1pblNlcnZpY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtOwotICBwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEF4aXNEZXBsb3lDb21tYW5kLgotICAgKiBAcGFyYW0gU3RyaW5nIGRlc2NyaXB0aW9uCi0gICAqIEBwYXJhbSBTdHJpbmcgbmFtZQotICAgKiAKLSAgICovCi0gIHB1YmxpYyBBeGlzRGVwbG95Q29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkF4aXNEZXBsb3lDb21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5BeGlzRGVwbG95Q29tbWFuZCIpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgaWYgKGphdmFXU0RMUGFyYW0gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgIGdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotICAgIH0KLQotICAgIGlmIChqYXZhV1NETFBhcmFtLmdldFByb2plY3RVUkwoKSA9PSBudWxsIHx8IGphdmFXU0RMUGFyYW0uZ2V0UHJvamVjdFVSTCgpLmVxdWFscygiIikpCi0gICAgeyAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgIGdldE1lc3NhZ2UoIk1TR19FUlJPUl9QUk9KRUNUX1VSTF9QQVJBTV9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgfQotCi0gICAgaWYgKGphdmFXU0RMUGFyYW0uZ2V0RGVwbG95bWVudEZpbGVzKCkgPT0gbnVsbCB8fCBqYXZhV1NETFBhcmFtLmdldERlcGxveW1lbnRGaWxlcygpLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCJKYXZhMldTRExDb21tYW5kIiwgLy8kTk9OLU5MUy0xJAotICAgICAgZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0RFUExPWV9GSUxFX1BBUkFNX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0KLSAgICBlbnZpcm9ubWVudC5nZXRQcm9ncmVzc01vbml0b3IoKS5yZXBvcnQoZ2V0TWVzc2FnZSgiTVNHX0FYSVNfREVQTE9ZIikpOwotCi0gICAgU3RhdHVzIHN0YXR1cyA9IGV4ZWN1dGVBbnRUYXNrKCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICB7Ci0gICAgCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0YXR1cyBleGVjdXRlQW50VGFzaygpCi0gIHsKLSAgICBmaW5hbCBjbGFzcyBEZXBsb3lUYXNrIGV4dGVuZHMgQWRtaW5DbGllbnRUYXNrCi0gICAgewotICAgICAgcHVibGljIERlcGxveVRhc2soKQotICAgICAgewotICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLSAgICAgICAgcHJvamVjdC5pbml0KCk7Ci0gICAgICAgIHRhc2tUeXBlID0gImF4aXMiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRhc2tOYW1lID0gImF4aXMtYWRtaW4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRhcmdldCA9IG5ldyBUYXJnZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBEZXBsb3lUYXNrIGFkbWluQ2xpZW50ID0gbmV3IERlcGxveVRhc2soKTsKLSAgICBTdHJpbmcgdXJsID0gamF2YVdTRExQYXJhbS5nZXRQcm9qZWN0VVJMKCkgKyBTRVJWSUNFX0VYVDsKLSAgICBhZG1pbkNsaWVudC5zZXRVcmwodXJsKTsKLSAgICBhZG1pbkNsaWVudC5zZXRYbWxGaWxlKG5ldyBGaWxlKGphdmFXU0RMUGFyYW0uZ2V0RGVwbG95bWVudEZpbGVzKClbMF0pKTsKLQotICAgIC8vIFNpbmNlIHRoZSBhZG1pbiBzZXJ2ZXIgbWF5IG5vdCBiZSBhdmFpbGFibGUgcmlnaHQgYXdheSB3ZSB3aWxsIHRyeQotICAgIC8vIHNldmVyYWwgdGltZXMgdG8gZXhlY3V0ZSBpdC4KLSAgICB0cnkKLSAgICB7Ci0gICAgICBCdWlsZEV4Y2VwdGlvbiBsYXN0RXhjZXB0aW9uID0gbnVsbDsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IDIwOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBsYXN0RXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgICBhZG1pbkNsaWVudC5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEJ1aWxkRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsKLSAgICAgICAgICBsYXN0RXhjZXB0aW9uID0gZXhjOwotICAgICAgICAgIAotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCggMjAwICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aHJlYWRFeGNlcHRpb24gICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiBubyBleGNlcHRpb24gb2NjdXJlZCB0aGVuIHdlIHNob3VsZCBicmVhayBvdXQgb2YgdGhlIGxvb3AuCi0gICAgICAgIGlmKCBsYXN0RXhjZXB0aW9uID09IG51bGwgKSBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gSWYgYWZ0ZXIgbWFueSB0cmllcyB3ZSBzdGlsbCBnZXQgYW4gZXhjZXB0aW9uLCB0aGVuIHdlIHdpbGwgcmUgdGhyb3cgaXQuCi0gICAgICBpZiggbGFzdEV4Y2VwdGlvbiAhPSBudWxsICkgdGhyb3cgbGFzdEV4Y2VwdGlvbjsKLSAgICB9Ci0gICAgY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIFN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0gICAgICBpZiAoZS5nZXRDYXVzZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBlLmdldENhdXNlKCkudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RhdHVzW10gY2hpbGRTdGF0dXMgPSBuZXcgU3RhdHVzWzFdOwotICAgICAgY2hpbGRTdGF0dXNbMF0gPSBuZXcgU2ltcGxlU3RhdHVzKCJBeGlzRGVwbG95Q29tbWFuZCIsIG1lc3NhZ2UsIFN0YXR1cy5FUlJPUik7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiQXhpc0RlcGxveUNvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0gICAgICBnZXRNZXNzYWdlKCJNU0dfRVJST1JfQVhJU19ERVBMT1kiKSwgY2hpbGRTdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiQXhpc0RlcGxveUNvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0gICAgZ2V0TWVzc2FnZSgiTVNHX0FYSVNfREVQTE9ZX09LIiksIFN0YXR1cy5PSyk7Ci0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIHBhcm0xKQotICB7Ci0gICAgU3RyaW5nIG1lc3NhZ2UgPSByZXNvdXJjZS5nZXRTdHJpbmcobWVzc2FnZUlkKTsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgbmV3IFN0cmluZ1tdIHsgcGFybTEgfSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20gcGx1Z2luLnByb3BlcnRpZXMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlLmdldFN0cmluZyhrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBqYXZhV1NETFBhcmFtIFRoZSBqYXZhV1NETFBhcmFtIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkKLSAgewotICAgIHRoaXMuamF2YVdTRExQYXJhbSA9IGphdmFXU0RMUGFyYW07Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvSmF2YTJXU0RMQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvSmF2YTJXU0RMQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODBkM2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0phdmEyV1NETENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzLnRvb2xzLmFudC53c2RsLkphdmEyV3NkbEFudFRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzLnRvb2xzLmFudC53c2RsLk5hbWVzcGFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0gKiBDb21tYW5kcyBhcmUgZXhlY3V0YWJsZSwgdW5kb2FibGUsIHJlZG9hYmxlIG9iamVjdHMuCi0gKiBFdmVyeSBDb21tYW5kIGhhcyBhIG5hbWUgYW5kIGEgZGVzY3JpcHRpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIEphdmEyV1NETENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9KQVZBX1dTRExfQ09NTUFORCI7Ci0JcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX0pBVkFfV1NETF9DT01NQU5EIjsKLQotCXB1YmxpYyBKYXZhMldTRExDb21tYW5kKCkgewotCQlzdXBlcigpOwotCSAgICBzZXROYW1lIChnZXRNZXNzYWdlKExBQkVMKSk7Ci0JCXNldERlc2NyaXB0aW9uKGdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQl9CQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhMldTRExDb21tYW5kLgotCSAqLwotCXB1YmxpYyBKYXZhMldTRExDb21tYW5kKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkJc3VwZXIoKTsKLQkgICAgc2V0TmFtZSAoZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbihnZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlTdGF0dXMgc3RhdHVzOwotCQlpZiAoamF2YVdTRExQYXJhbV8gPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCWdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJaWYgKGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkgPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCWdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJZW52aXJvbm1lbnQuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KAotCQkJZ2V0TWVzc2FnZSgiTVNHX0dFTkVSQVRFX1dTREwiLCBqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpICkgKTsKLQotCQlyZXR1cm4gZXhlY3V0ZUFudFRhc2soZW52aXJvbm1lbnQpOwotCX0KLQotCXByb3RlY3RlZCBTdGF0dXMgZXhlY3V0ZUFudFRhc2soRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLQotCQlmaW5hbCBjbGFzcyBFbWl0dGVyIGV4dGVuZHMgSmF2YTJXc2RsQW50VGFzayB7Ci0JCQlwdWJsaWMgRW1pdHRlcigpIHsKLQkJCQlwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLQkJCQlwcm9qZWN0LmluaXQoKTsKLQkJCQl0YXNrVHlwZSA9ICJheGlzIjsgLy8kTk9OLU5MUy0xJAotCQkJCXRhc2tOYW1lID0gImF4aXMtamF2YTJ3c2RsIjsgLy8kTk9OLU5MUy0xJAotCQkJCXRhcmdldCA9IG5ldyBUYXJnZXQoKTsKLQkJCX0KLQkJfQotCi0JCUVtaXR0ZXIgZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7Ci0JCWVtaXR0ZXIuY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UGF0aChqYXZhV1NETFBhcmFtXy5nZXRDbGFzc3BhdGgoKSk7Ci0JCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTAwOCwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIkNsYXNzIFBhdGggPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRDbGFzc3BhdGgoKSk7Ci0JCQotCQllbWl0dGVyLnNldFBvcnRUeXBlTmFtZShqYXZhV1NETFBhcmFtXy5nZXRQb3J0VHlwZU5hbWUoKSk7Ci0JCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTAwOSwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIlBvcnQgVHlwZSBOYW1lID0gIisgamF2YVdTRExQYXJhbV8uZ2V0UG9ydFR5cGVOYW1lKCkpOwotCQkKLQkJZW1pdHRlci5zZXRTZXJ2aWNlRWxlbWVudE5hbWUoamF2YVdTRExQYXJhbV8uZ2V0U2VydmljZU5hbWUoKSk7Ci0JCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTAxMCwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIlNlcnZpY2UgTmFtZSA9ICIrIGphdmFXU0RMUGFyYW1fLmdldFNlcnZpY2VOYW1lKCkpOwotCQkKLQkJZW1pdHRlci5zZXRMb2NhdGlvbihqYXZhV1NETFBhcmFtXy5nZXRVcmxMb2NhdGlvbigpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDExLCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiVVJMIExvY2F0aW9uID0gIisgamF2YVdTRExQYXJhbV8uZ2V0VXJsTG9jYXRpb24oKSk7Ci0JCQotCQllbWl0dGVyLnNldE1ldGhvZHMoamF2YVdTRExQYXJhbV8uZ2V0TWV0aG9kU3RyaW5nKCkpOwotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwMTIsIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJNZXRob2RzID0gIisgamF2YVdTRExQYXJhbV8uZ2V0TWV0aG9kU3RyaW5nKCkpOwotCQkKLQkJZW1pdHRlci5zZXRTdHlsZShqYXZhV1NETFBhcmFtXy5nZXRTdHlsZSgpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDEzLCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiU3R5bGUgPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRTdHlsZSgpKTsKLQkJCi0JCWVtaXR0ZXIuc2V0VXNlKGphdmFXU0RMUGFyYW1fLmdldFVzZSgpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDE0LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiVXNlID0gIisgamF2YVdTRExQYXJhbV8uZ2V0VXNlKCkpOwotCQkKLQkJZW1pdHRlci5zZXRPdXRwdXQobmV3IEZpbGUoamF2YVdTRExQYXJhbV8uZ2V0T3V0cHV0V3NkbExvY2F0aW9uKCkpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDE1LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiV1NETCBMb2NhdGlvbiA9ICIrIGphdmFXU0RMUGFyYW1fLmdldE91dHB1dFdzZGxMb2NhdGlvbigpKTsKLQkJCi0JCWVtaXR0ZXIuc2V0TmFtZXNwYWNlKGphdmFXU0RMUGFyYW1fLmdldE5hbWVzcGFjZSgpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDE2LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiTmFtZSBTcGFjZSA9ICIrIGphdmFXU0RMUGFyYW1fLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWVtaXR0ZXIuc2V0Q2xhc3NOYW1lKGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkpOwotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwMTcsIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJCZWFuIG5hbWUgPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpKTsKLQkJCi0JCWVtaXR0ZXIuc2V0SW1wbENsYXNzKGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkpOwotCQkKLQkJSGFzaE1hcCBtYXBwaW5ncyA9IGphdmFXU0RMUGFyYW1fLmdldE1hcHBpbmdzKCk7Ci0JCWlmKG1hcHBpbmdzICE9IG51bGwpewotCQkJSXRlcmF0b3Iga2V5cyA9IG1hcHBpbmdzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShrZXlzLmhhc05leHQoKSl7Ci0JCQkJU3RyaW5nIHBha2FnZSA9IChTdHJpbmcpa2V5cy5uZXh0KCk7Ci0JCQkJU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpbWFwcGluZ3MuZ2V0KHBha2FnZSk7Ci0JCQkJTmFtZXNwYWNlTWFwcGluZyBtYXAgPSBuZXcgTmFtZXNwYWNlTWFwcGluZygpOwotCQkJCW1hcC5zZXRQYWNrYWdlKHBha2FnZSk7Ci0JCQkJbWFwLnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQkJCWVtaXR0ZXIuYWRkTWFwcGluZyhtYXApOwkJCi0JCQl9Ci0JCX0KLQkJCi0JCi0JCXRyeSB7Ci0JCQllbWl0dGVyLmV4ZWN1dGUoKTsKLQkJfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotCQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5FUlJPUiwgNTAxOCwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgZSk7Ci0JCQlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCWdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfR0VORVJBVEUiKSArICIgIiAvLyROT04tTkxTLTEkCi0JCQkrZS5nZXRDYXVzZSgpLnRvU3RyaW5nKCksIFN0YXR1cy5FUlJPUik7Ci0JCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0KLQl9Ci0JCi0JcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgcmVkbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBqYXZhV1NETFBhcmFtLgotCSAqIEByZXR1cm4gSmF2YVdTRExQYXJhbWV0ZXIKLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpIHsKLQkJcmV0dXJuIGphdmFXU0RMUGFyYW1fOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIHBhcm0xKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gcmVzb3VyY2UuZ2V0U3RyaW5nKG1lc3NhZ2VJZCk7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtZXNzYWdlLCBuZXcgU3RyaW5nW10geyBwYXJtMSB9KTsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0JKiBwbHVnaW4ucHJvcGVydGllcy4KLQkqIEByZXR1cm4gVGhlIFN0cmluZyBtZXNzYWdlLgotCSovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIHJlc291cmNlLmdldFN0cmluZyhrZXkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJtKSB7Ci0JCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcm07Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0JewotCSAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZ2V0SmF2YVdTRExQYXJhbSgpLmdldE91dHB1dFdzZGxMb2NhdGlvbigpKTsgCi0JICAgIFN0cmluZyB1cmwgPSAiIjsKLQkJICB0cnkgewotCSAgICAJdXJsID0gZmlsZS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0JICAgIH0KLQkJICBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKXt9Ci0JCXJldHVybiB1cmw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvV1NETDJKYXZhQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvV1NETDJKYXZhQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI1MjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL1dTREwySmF2YUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy53c2RsLnRvSmF2YS5FbWl0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy53c2RsLnRvSmF2YS5HZW5lcmF0ZWRGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVQTE9ZX1RZUEUgPSAiZGVwbG95IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFVOREVQTE9ZX1RZUEUgPSAidW5kZXBsb3kiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtOwotCXByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotCXByaXZhdGUgU3RyaW5nIGh0dHBCYXNpY0F1dGhQYXNzd29yZDsKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1dTRExfSkFWQV9DT01NQU5EIjsKLQlwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfV1NETF9KQVZBX0NPTU1BTkQiOwotCQotCi0JcHVibGljIFdTREwySmF2YUNvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE5hbWUoZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbihnZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JfQotCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCVN0YXR1cyBzdGF0dXM7Ci0JCWlmIChqYXZhV1NETFBhcmFtID09IG51bGwpIHsKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIldTREwySmF2YUNvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJaWYgKHdzZGxVUkkgIT0gbnVsbCkgLy9ib3R0b20gdXAgY2FzZSBoYXMgYWxyZWFkeSBoYXMgdGhlIGNvcnJlY3QgV1NETCBvbiBqYXZhV1NETFBhcmFtCi0JCXsKLQkJCWphdmFXU0RMUGFyYW0uc2V0SW5wdXRXc2RsTG9jYXRpb24od3NkbFVSSSk7Ci0JCX0KLQkJamF2YVdTRExQYXJhbS5zZXRIVFRQVXNlcm5hbWUoaHR0cEJhc2ljQXV0aFVzZXJuYW1lKTsKLQkJamF2YVdTRExQYXJhbS5zZXRIVFRQUGFzc3dvcmQoaHR0cEJhc2ljQXV0aFBhc3N3b3JkKTsKLQkJCi0JCUVtaXR0ZXIgd3NkbDJKYXZhID0gbmV3IEVtaXR0ZXIoKTsKLQkJaWYgKGVudmlyb25tZW50LmdldExvZygpLmlzRW5hYmxlZCgiZW1pdHRlciIpKSB7Ci0JCQl3c2RsMkphdmEuc2V0VmVyYm9zZSh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXdzZGwySmF2YS5zZXRWZXJib3NlKGZhbHNlKTsKLQkJfQotCQlib29sZWFuIHNlcnZlclNpZGUgPSBqYXZhV1NETFBhcmFtLmdldFNlcnZlclNpZGUoKSA9PSBKYXZhV1NETFBhcmFtZXRlci5TRVJWRVJfU0lERV9CRUFOOwotCQl3c2RsMkphdmEuc2V0U2VydmVyU2lkZShzZXJ2ZXJTaWRlKTsKLQkJaWYgKHNlcnZlclNpZGUpIHsKLQkJCXdzZGwySmF2YS5zZXRTa2VsZXRvbldhbnRlZChqYXZhV1NETFBhcmFtLmlzU2tlbGV0b25EZXBsb3koKSk7Ci0JCX0KLQkJaWYgKGphdmFXU0RMUGFyYW0uaXNNZXRhSW5mT25seSgpKSB7Ci0JCQkvLyBmb3IgdGhlIGNhc2UgSmF2YTJXU0RMLVdTREwySmF2YQotCQkJd3NkbDJKYXZhLnNldE91dHB1dERpcihyZW1vdmVGaWxlUHJvdG9jb2woamF2YVdTRExQYXJhbS5nZXRPdXRwdXQoKSkpOwotCQkJSGFzaE1hcCBwY2sybnNNYXAgPSBqYXZhV1NETFBhcmFtLmdldE1hcHBpbmdzKCk7Ci0JCQlpZiAocGNrMm5zTWFwICE9IG51bGwpIHsKLQkJCQlIYXNoTWFwIG5zMnBja01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJSXRlcmF0b3Iga2V5cyA9IHBjazJuc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJCQlTdHJpbmcgcGFrYWdlID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0JCQkJCVN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKSBwY2sybnNNYXAuZ2V0KHBha2FnZSk7Ci0JCQkJCW5zMnBja01hcC5wdXQobmFtZXNwYWNlLCBwYWthZ2UpOwotCQkJCX0KLQkJCQl3c2RsMkphdmEuc2V0TmFtZXNwYWNlTWFwKG5zMnBja01hcCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyAgZm9yIHRoZSBjYXNlIFdTREwySmF2YQotCQkJd3NkbDJKYXZhLnNldE91dHB1dERpcihyZW1vdmVGaWxlUHJvdG9jb2woamF2YVdTRExQYXJhbS5nZXRKYXZhT3V0cHV0KCkpKTsKLQkJCWlmIChqYXZhV1NETFBhcmFtLmdldE1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJCXdzZGwySmF2YS5zZXROYW1lc3BhY2VNYXAoamF2YVdTRExQYXJhbS5nZXRNYXBwaW5ncygpKTsKLQkJCX0KLQkJfQotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwMTksIHRoaXMsICJleGVjdXRlIiwgIkphdmEgb3V0cHV0ID0gIiArIGphdmFXU0RMUGFyYW0uZ2V0SmF2YU91dHB1dCgpKTsKLQkJaWYgKGphdmFXU0RMUGFyYW0uZ2V0SFRUUFBhc3N3b3JkKCkgIT0gbnVsbCkgewotCQkJd3NkbDJKYXZhLnNldFBhc3N3b3JkKGphdmFXU0RMUGFyYW0uZ2V0SFRUUFBhc3N3b3JkKCkpOwotCQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDgxLCB0aGlzLCAiZXhlY3V0ZSIsICJwYXNzd29yZDogIiArIGphdmFXU0RMUGFyYW0uZ2V0SFRUUFBhc3N3b3JkKCkpOwotCQl9Ci0JCWlmIChqYXZhV1NETFBhcmFtLmdldEhUVFBVc2VybmFtZSgpICE9IG51bGwpIHsKLQkJCXdzZGwySmF2YS5zZXRVc2VybmFtZShqYXZhV1NETFBhcmFtLmdldEhUVFBVc2VybmFtZSgpKTsKLQkJCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTA4MiwgdGhpcywgImV4ZWN1dGUiLCAidXNlcm5hbWU6ICIgKyBqYXZhV1NETFBhcmFtLmdldEhUVFBVc2VybmFtZSgpKTsKLQkJfQotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwMjAsIHRoaXMsICJleGVjdXRlIiwgIldTREwgTG9jYXRpb24gPSAiICsgamF2YVdTRExQYXJhbS5nZXRJbnB1dFdzZGxMb2NhdGlvbigpKTsKLQkJZW52aXJvbm1lbnQuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KGdldE1lc3NhZ2UoIk1TR19QQVJTSU5HX1dTREwiLCBqYXZhV1NETFBhcmFtLmdldElucHV0V3NkbExvY2F0aW9uKCkgKSApOwotCQl0cnkgewotCQkJd3NkbDJKYXZhLnJ1bihqYXZhV1NETFBhcmFtLmdldElucHV0V3NkbExvY2F0aW9uKCkpOwotCQkJaWYgKHNlcnZlclNpZGUpIHsKLQkJCQkvLyBzZXQgZGVwbG95bWVudCBmaWxlcwotCQkJCUxpc3QgZGVwbG95bWVudEZpbGVzMSA9IHdzZGwySmF2YS5nZXRHZW5lcmF0ZWRGaWxlSW5mbygpLmZpbmRUeXBlKERFUExPWV9UWVBFKTsKLQkJCQlMaXN0IGRlcGxveW1lbnRGaWxlczIgPSB3c2RsMkphdmEuZ2V0R2VuZXJhdGVkRmlsZUluZm8oKS5maW5kVHlwZShVTkRFUExPWV9UWVBFKTsKLQkJCQlBcnJheUxpc3QgZGVwbEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChkZXBsb3ltZW50RmlsZXMxICE9IG51bGwgJiYgZGVwbG95bWVudEZpbGVzMiAhPSBudWxsKSB7Ci0JCQkJCWRlcGxveW1lbnRGaWxlczEuYWRkQWxsKGRlcGxveW1lbnRGaWxlczIpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcGxveW1lbnRGaWxlczEuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCUdlbmVyYXRlZEZpbGVJbmZvLkVudHJ5IGVudHJ5ID0gKEdlbmVyYXRlZEZpbGVJbmZvLkVudHJ5KSBkZXBsb3ltZW50RmlsZXMxLmdldChpKTsKLQkJCQkJCWRlcGxGaWxlcy5hZGQoZW50cnkuZmlsZU5hbWUpOwotCQkJCQl9Ci0JCQkJCVN0cmluZ1tdIGRlcGxGaWxlc0FycmF5ID0gbmV3IFN0cmluZ1tkZXBsRmlsZXMuc2l6ZSgpXTsKLQkJCQkJZGVwbEZpbGVzLnRvQXJyYXkoZGVwbEZpbGVzQXJyYXkpOwotCQkJCQlqYXZhV1NETFBhcmFtLnNldERlcGxveW1lbnRGaWxlcyhkZXBsRmlsZXNBcnJheSk7Ci0JCQkJfQotCQkJCS8vIHNldCBqYXZhIGZpbGVzCi0JCQkJTGlzdCBqYXZhRmlsZXMgPSB3c2RsMkphdmEuZ2V0R2VuZXJhdGVkRmlsZU5hbWVzKCk7Ci0JCQkJamF2YUZpbGVzLnJlbW92ZUFsbChkZXBsRmlsZXMpOwotCQkJCVN0cmluZ1tdIGphdmFGaWxlTmFtZXMgPSBuZXcgU3RyaW5nW2phdmFGaWxlcy5zaXplKCldOwotCQkJCWphdmFGaWxlcy50b0FycmF5KGphdmFGaWxlTmFtZXMpOwotCQkJCWphdmFXU0RMUGFyYW0uc2V0SmF2YUZpbGVzKGphdmFGaWxlTmFtZXMpOwotCQkJfQotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLkVSUk9SLCA1MDIxLCB0aGlzLCAiZXhlY3V0ZSIsIGUpOwotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dTRExfSkFWQV9HRU5FUkFURSIpICsgIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSwgU3RhdHVzLkVSUk9SKTsKLQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JfQotCi0JLyoKLQkgKiBIYWNrOiBBeGlzIGRvZXNuJ3QgbGlrZSBmaWxlIFVSTHMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZW1vdmVGaWxlUHJvdG9jb2woU3RyaW5nIHMpIHsKLQkJaWYgKHMuc3RhcnRzV2l0aCgiZmlsZToiKSkgewotCQkJU3RyaW5nIG5ld1MgPSBzLnN1YnN0cmluZyg1LCBzLmxlbmd0aCgpKTsKLQkJCWludCBpID0gbmV3Uy5pbmRleE9mKCc6Jyk7Ci0JCQlpZiAoaSAhPSAtMSkgewotCQkJCVN0cmluZyBwcm90b2NvbCA9IG5ld1Muc3Vic3RyaW5nKDAsIGkpOwotCQkJCWludCBqID0gcHJvdG9jb2wuaW5kZXhPZignLycpOwotCQkJCWludCBrID0gcHJvdG9jb2wuaW5kZXhPZignXFwnKTsKLQkJCQlpbnQgbWF4ID0gTWF0aC5tYXgoaiwgayk7Ci0JCQkJaWYgKG1heCAhPSAtMSkKLQkJCQkJbmV3UyA9IG5ld1Muc3Vic3RyaW5nKG1heCArIDEsIG5ld1MubGVuZ3RoKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ld1M7Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgcmVkbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBwYXJtMSkgewotCQlTdHJpbmcgbWVzc2FnZSA9IHJlc291cmNlLmdldFN0cmluZyhtZXNzYWdlSWQpOwotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgbmV3IFN0cmluZ1tde3Bhcm0xfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLQkgKiBwbHVnaW4ucHJvcGVydGllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gcmVzb3VyY2UuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0JCXRoaXMuamF2YVdTRExQYXJhbSA9IGphdmFXU0RMUGFyYW07Ci0JfQotCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0JCXJldHVybiBqYXZhV1NETFBhcmFtOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBodHRwQmFzaWNBdXRoUGFzc3dvcmQKLQkgKiAgICAgICAgICAgIFRoZSBodHRwQmFzaWNBdXRoUGFzc3dvcmQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh0dHBCYXNpY0F1dGhQYXNzd29yZChTdHJpbmcgaHR0cEJhc2ljQXV0aFBhc3N3b3JkKSB7Ci0JCXRoaXMuaHR0cEJhc2ljQXV0aFBhc3N3b3JkID0gaHR0cEJhc2ljQXV0aFBhc3N3b3JkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBodHRwQmFzaWNBdXRoVXNlcm5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBodHRwQmFzaWNBdXRoVXNlcm5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh0dHBCYXNpY0F1dGhVc2VybmFtZShTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lKSB7Ci0JCXRoaXMuaHR0cEJhc2ljQXV0aFVzZXJuYW1lID0gaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpIHsKLQkJdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tb24vSmF2YVdTRExQYXJhbWV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tb24vSmF2YVdTRExQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkYTc4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL2NvcmUvY29tbW9uL0phdmFXU0RMUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhV1NETFBhcmFtZXRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VSVkVSX1NJREVfTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNFUlZFUl9TSURFX0JFQU4gPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVJWRVJfU0lERV9FSkIgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfUlBDID0gIlJQQyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRV9ET0NVTUVOVCA9ICJET0NVTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRV9XUkFQUEVEID0gIldSQVBQRUQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfTElURVJBTCA9ICJMSVRFUkFMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9FTkNPREVEID0gIkVOQ09ERUQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBiZWFuTmFtZSA9IG51bGw7IC8vIFRoZSBuYW1lIG9mIHRoZSBKYXZhIGJlYW4KLQlwcml2YXRlIFN0cmluZyBjbGFzc3BhdGggPSBudWxsOwotCS8vIFRoZSBjbGFzcyBwYXRoIGZvciBsb2FkaW5nIHRoZSBiZWFuIGFuZCBjb21tYW5kIGV4ZWN1dGlvbgotCXByaXZhdGUgU3RyaW5nIGJlYW5QYWNrYWdlID0gbnVsbDsgLy8gVGhlIHBhY2thZ2UgbG9jYXRpb24gb2YgdGhlIGJlYW4KLQlwcml2YXRlIFN0cmluZyBwb3J0VHlwZU5hbWUgPSBudWxsOyAvLyBUaGUgbmFtZSBvZiB0aGUgcG9ydCB0eXBlIGVsZW1lbnQKLQlwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7IC8vIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGVsZW1lbnQKLQlwcml2YXRlIFN0cmluZyBvdXRwdXRXc2RsTG9jYXRpb24gPSBudWxsOwotCS8vIFRoZSBvdXRwdXQgbG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZQotCXByaXZhdGUgU3RyaW5nIGlucHV0V3NkbExvY2F0aW9uID0gbnVsbDsKLQkvLyBUaGUgaW5wdXQgbG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZQotCXByaXZhdGUgU3RyaW5nIHVybExvY2F0aW9uID0gbnVsbDsgLy8gVGhlIFVSTCBsb2NhdGlvbiBvZiB0aGUgd2ViIHNlcnZpY2UKLQlwcml2YXRlIEhhc2h0YWJsZSBtZXRob2RzID0gbnVsbDsgLy8gVGhlIGFycmF5IG9mIG1ldGhvZCBuYW1lcwotCXByaXZhdGUgU3RyaW5nIHN0eWxlID0gbnVsbDsKLQkvLyBUaGUgc3R5bGUgKFJQQyB8IERPQ1VNRU5UIHwgV1JBUFBFRCkgYXR0cmlidXRlIGZvciB0aGUgZ2VuZXJhdGVkIFdTREwKLQlwcml2YXRlIFN0cmluZyB1c2UgPSBudWxsOwotCS8vIFRoZSB1c2UgKExJVEVSQUwgfCBFTkNPREVEKSBhdHRyaWJ0dWUgZm9yIHRoZSBnZW5lcmF0ZWQgV1NETAotCXByaXZhdGUgU3RyaW5nIG91dHB1dCA9IG51bGw7Ci0JLy8gVGhlIG91dHB1dCBsb2NhdGlvbiBmb3IgZGVwbG95bWVudCBkZXNjcmlwdG9ycyAmIEphdmEgY29kZSAob3V0cHV0IGZyb20gV1NETDJKYXZhIGNvbW1hbmQpCi0JcHJpdmF0ZSBTdHJpbmcgamF2YU91dHB1dCA9IG51bGw7Ci0JLy8gVGhlIG91dHB1dCBsb2NhdGlvbiBmb3IgSmF2YSBjb2RlIChvdXRwdXQgZnJvbSBXU0RMMkphdmEgY29tbWFuZCkKLQlwcml2YXRlIGJvb2xlYW4gbWV0YUluZk9ubHkgPSBmYWxzZTsgLy8gTUVUQS1JTkYtT05MWSBmbGFnCi0JcHJpdmF0ZSBieXRlIHNlcnZlclNpZGUgPSBTRVJWRVJfU0lERV9OT05FOwotCS8vIHNlcnZlci1zaWRlIGZsYWcgKFNFUlZFUl9TSURFX05PTkUgfCBTRVJWRVJfU0lERV9CRUFOIHwgU0VSVkVSX1NJREVfRUpCKQotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHNrZWxldG9uRGVwbG95ID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBjb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nW10gZGVwbG95bWVudEZpbGVzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIGphdmFGaWxlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvamVjdFVSTCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIG1hcHBpbmdQYWlyczsKLQlwcml2YXRlIFN0cmluZyBodHRwVXNlcm5hbWVfID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBodHRwUGFzc3dvcmRfID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihTdHJpbmcgY29udGFpbmVyKSB7Ci0JCXRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhV1NETFBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmVhbk5hbWUuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJlYW5OYW1lKCkgewotCQlyZXR1cm4gYmVhbk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCZWFuUGFja2FnZSgpIHsKLQkJcmV0dXJuIGJlYW5QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvcnRUeXBlTmFtZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydFR5cGVOYW1lKCkgewotCQlyZXR1cm4gcG9ydFR5cGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZpY2VOYW1lLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG91dHB1dC4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0KCkgewotCQlyZXR1cm4gb3V0cHV0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZHMuCi0JICogQHJldHVybiBTdHJpbmdbXQotCSAqLwotCXB1YmxpYyBIYXNodGFibGUgZ2V0TWV0aG9kcygpIHsKLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tbWEgc2VwZXJhdGVkIHN0cmluZyByZXByZXNldGF0aW9uIG9mIHRoZSBtZXRob2RzLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2RTdHJpbmcoKSB7Ci0JCVN0cmluZyBtZXRob2RTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlFbnVtZXJhdGlvbiBlID0gbWV0aG9kcy5rZXlzKCk7Ci0gCQlmb3IgKGludCBpPTA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKykKLSAgICAJewotCi0JCQlTdHJpbmcgc2lnbmF0dXJlID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKCgoQm9vbGVhbikgbWV0aG9kcy5nZXQoc2lnbmF0dXJlKSkuYm9vbGVhblZhbHVlKCkpewotCQkJCQkJCWludCBpbmRleCA9IHNpZ25hdHVyZS5pbmRleE9mKCcoJyk7Ci0JCQkJCQkJU3RyaW5nIG5hbWUgPSBzaWduYXR1cmUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCQltZXRob2RTdHJpbmcgKz0gbmFtZTsKLQkJCX0KLQkgICAgCWlmIChpICE9IG1ldGhvZHMuc2l6ZSgpIC0xKSAvLyB0aGlzIGlzIG5vdCB0aGUgbGFzdCBhcnJheSBpdGVtCQotCQkJewotCQkJCW1ldGhvZFN0cmluZyArPSAiLCI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHlsZSBhdHRyaWJ1dGUuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0eWxlKCkgewotCQlyZXR1cm4gc3R5bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXJsTG9jYXRpb24uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybExvY2F0aW9uKCkgewotCQlyZXR1cm4gdXJsTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlKCkgewotCQlyZXR1cm4gdXNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG91dHB1dFdzZGxMb2NhdGlvbi4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0V3NkbExvY2F0aW9uKCkgewotCQlyZXR1cm4gb3V0cHV0V3NkbExvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJlYW5OYW1lLgotCSAqIEBwYXJhbSBiZWFuTmFtZSBUaGUgYmVhbk5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QmVhbk5hbWUoU3RyaW5nIGJlYW5OYW1lKSB7Ci0JCXRoaXMuYmVhbk5hbWUgPSBiZWFuTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCZWFuUGFja2FnZShTdHJpbmcgYmVhblBhY2thZ2UpIHsKLQkJdGhpcy5iZWFuUGFja2FnZSA9IGJlYW5QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBvcnRUeXBlTmFtZS4KLQkgKiBAcGFyYW0gcG9ydFR5cGVOYW1lIFRoZSBwb3J0VHlwZU5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UG9ydFR5cGVOYW1lKFN0cmluZyBwb3J0VHlwZU5hbWUpIHsKLQkJdGhpcy5wb3J0VHlwZU5hbWUgPSBwb3J0VHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VydmljZU5hbWUuCi0JICogQHBhcmFtIHNlcnZpY2VOYW1lIFRoZSBzZXJ2aWNlTmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLQkJdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG91dHB1dC4KLQkgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0KFN0cmluZyBvdXRwdXQpIHsKLQkJdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWV0aG9kcy4KLQkgKiBAcGFyYW0gbWV0aG9kcyBUaGUgbWV0aG9kcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RzKEhhc2h0YWJsZSBtZXRob2RzKSB7Ci0JCXRoaXMubWV0aG9kcyA9IG1ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3R5bGUuCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHJpbmcgc3R5bGUpIHsKLQkJdGhpcy5zdHlsZSA9IHN0eWxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVybExvY2F0aW9uLgotCSAqIEBwYXJhbSB1cmxMb2NhdGlvbiBUaGUgdXJsTG9jYXRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VXJsTG9jYXRpb24oU3RyaW5nIHVybExvY2F0aW9uKSB7Ci0JCXRoaXMudXJsTG9jYXRpb24gPSB1cmxMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2UuCi0JICogQHBhcmFtIHVzZSBUaGUgdXNlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgdXNlKSB7Ci0JCXRoaXMudXNlID0gdXNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG91dHB1dFdzZGxMb2NhdGlvbi4KLQkgKiBAcGFyYW0gb3V0cHV0V3NkbExvY2F0aW9uIFRoZSBvdXRwdXRXc2RsTG9jYXRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0V3NkbExvY2F0aW9uKFN0cmluZyB3c2RsTG9jYXRpb24pIHsKLQkJdGhpcy5vdXRwdXRXc2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YUluZk9ubHkuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRhSW5mT25seSgpIHsKLQkJcmV0dXJuIG1ldGFJbmZPbmx5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGFJbmZPbmx5LgotCSAqIEBwYXJhbSBtZXRhSW5mT25seSBUaGUgbWV0YUluZk9ubHkgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0YUluZk9ubHkoYm9vbGVhbiBtZXRhSW5mT25seSkgewotCQl0aGlzLm1ldGFJbmZPbmx5ID0gbWV0YUluZk9ubHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyU2lkZS4KLQkgKiBAcmV0dXJuIGJ5dGUKLQkgKi8KLQlwdWJsaWMgYnl0ZSBnZXRTZXJ2ZXJTaWRlKCkgewotCQlyZXR1cm4gc2VydmVyU2lkZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZXJ2ZXJTaWRlLgotCSAqIEBwYXJhbSBzZXJ2ZXJTaWRlIFRoZSBzZXJ2ZXJTaWRlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlclNpZGUoYnl0ZSBzZXJ2ZXJTaWRlKSB7Ci0JCXRoaXMuc2VydmVyU2lkZSA9IHNlcnZlclNpZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5wdXRXc2RsTG9jYXRpb24uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0V3NkbExvY2F0aW9uKCkgewotCQlyZXR1cm4gaW5wdXRXc2RsTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5wdXRXc2RsTG9jYXRpb24uCi0JICogQHBhcmFtIGlucHV0V3NkbExvY2F0aW9uIFRoZSBpbnB1dFdzZGxMb2NhdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dFdzZGxMb2NhdGlvbihTdHJpbmcgaW5wdXRXc2RsTG9jYXRpb24pIHsKLQkJdGhpcy5pbnB1dFdzZGxMb2NhdGlvbiA9IGlucHV0V3NkbExvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWVzcGFjZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWVzcGFjZS4KLQkgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YSBvdXRwdXQuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFPdXRwdXQoKSB7Ci0JCXJldHVybiBqYXZhT3V0cHV0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGphdmFPdXRwdXQuCi0JICogQHBhcmFtIGphdmFPdXRwdXQgVGhlIEphdmEgb3V0cHV0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFPdXRwdXQoU3RyaW5nIGphdmFPdXRwdXQpIHsKLQkJdGhpcy5qYXZhT3V0cHV0ID0gamF2YU91dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChTdHJpbmcgc3RyaW5nKSB7Ci0JCWNsYXNzcGF0aCA9IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTa2VsZXRvbkRlcGxveSgpIHsKLQkJcmV0dXJuIHNrZWxldG9uRGVwbG95OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2tlbGV0b25EZXBsb3koYm9vbGVhbiBiKSB7Ci0JCXNrZWxldG9uRGVwbG95ID0gYjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldERlcGxveW1lbnRGaWxlcygpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnRGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnRGaWxlcyhTdHJpbmdbXSBzdHJpbmdzKSB7Ci0JCWRlcGxveW1lbnRGaWxlcyA9IHN0cmluZ3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRKYXZhRmlsZXMoKSB7Ci0JCXJldHVybiBqYXZhRmlsZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhRmlsZXMoU3RyaW5nW10gc3RyaW5ncykgewotCQlqYXZhRmlsZXMgPSBzdHJpbmdzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RVUkwoKSB7Ci0JCXJldHVybiBwcm9qZWN0VVJMOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0VVJMKFN0cmluZyBzdHJpbmcpIHsKLQkJcHJvamVjdFVSTCA9IHN0cmluZzsKLQl9Ci0JCi0JcHVibGljIEhhc2hNYXAgZ2V0TWFwcGluZ3MoKQotCXsKLQkJCXJldHVybiBtYXBwaW5nUGFpcnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwcGluZ3MoSGFzaE1hcCBtYXApCi0JewotCQkJbWFwcGluZ1BhaXJzID0gbWFwOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1c2VyIG5hbWUgZm9yIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SFRUUFVzZXJuYW1lKCkKLQl7Ci0JICByZXR1cm4gaHR0cFVzZXJuYW1lXzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2VyIG5hbWUgZm9yIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24KLQkgKiBAcGFyYW0gU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SFRUUFVzZXJuYW1lKFN0cmluZyBodHRwVXNlcm5hbWUpCi0JewotCSAgaHR0cFVzZXJuYW1lXyA9IGh0dHBVc2VybmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXNzd29yZCBmb3IgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIVFRQUGFzc3dvcmQoKQotCXsKLQkgIHJldHVybiBodHRwUGFzc3dvcmRfOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIVFRQUGFzc3dvcmQoU3RyaW5nIGh0dHBQYXNzd29yZCkgewotCQlodHRwUGFzc3dvcmRfID0gaHR0cFBhc3N3b3JkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3dzZmluZGVyL1dTRmluZGVyQXhpcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3dzZmluZGVyL1dTRmluZGVyQXhpcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGNkNWY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS93c2ZpbmRlci9XU0ZpbmRlckF4aXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS53c2ZpbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkoyRUVXZWJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ud3NmaW5kZXIuTGl2ZVdTRExGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLndzZmluZGVyLldTRmluZGVyQ29tbW9uOwotCi1wdWJsaWMgY2xhc3MgV1NGaW5kZXJBeGlzIGV4dGVuZHMgV1NGaW5kZXJDb21tb24KLXsKLSAgcHVibGljIFdTRmluZGVyQXhpcygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZmluZCgpCi0gIHsKLSAgICBmaW5hbCBWZWN0b3Igd3NkbFVSTHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IGdldFdvcmtzcGFjZVByb2plY3RzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBKMkVFV2ViTmF0dXJlUnVudGltZSB3ZWJOYXR1cmUgPSBnZXRXZWJOYXR1cmUocHJvamVjdHNbaV0pOwotICAgICAgaWYgKHdlYk5hdHVyZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgd2ViUHJvamVjdFVSTCA9IFJlc291cmNlVXRpbHMuZ2V0V2ViUHJvamVjdFVSTChwcm9qZWN0c1tpXSk7Ci0gICAgICAgIGlmICh3ZWJQcm9qZWN0VVJMICE9IG51bGwgJiYgd2ViUHJvamVjdFVSTC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBmaW5hbCBJRm9sZGVyIGZvbGRlcldTREwgPSBnZXRGb2xkZXJSb290UHVibGlzaGFibGUod2ViTmF0dXJlKS5nZXRGb2xkZXIoIndzZGwiKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb2xkZXJXU0RMLmFjY2VwdCgKLSAgICAgICAgICAgICAgbmV3IElSZXNvdXJjZVZpc2l0b3IoKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHQgPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHQgIT0gbnVsbCAmJiBleHQuZXF1YWxzSWdub3JlQ2FzZSgid3NkbCIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc1BhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvbGRlclBhdGggPSBmb2xkZXJXU0RMLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSByZXNQYXRoLmluZGV4T2YoZm9sZGVyUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzUGF0aCA9IHJlc1BhdGguc3Vic3RyaW5nKGluZGV4K2ZvbGRlclBhdGgubGVuZ3RoKCksIHJlc1BhdGgubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIod2ViUHJvamVjdFVSTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvd3NkbCIpOwotICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChyZXNQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICB3c2RsVVJMcy5hZGQoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBMaXZlV1NETEZpbHRlcltdIGZpbHRlcnMgPSBuZXcgTGl2ZVdTRExGaWx0ZXJbd3NkbFVSTHMuc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgZmlsdGVyc1tpXSA9IG5ldyBMaXZlV1NETEZpbHRlcigoU3RyaW5nKXdzZGxVUkxzLmdldChpKSk7Ci0gICAgICBmaWx0ZXJzW2ldLnN0YXJ0KCk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIWZpbHRlcnNbaV0uaXNGaW5pc2goKSkKLSAgICAgIHsKLSAgICAgICAgVGhyZWFkLnlpZWxkKCk7Ci0gICAgICAgIGkgPSAtMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghZmlsdGVyc1tpXS5pc1dTRExMaXZlKCkpCi0gICAgICAgIHdzZGxVUkxzLnJlbW92ZShmaWx0ZXJzW2ldLmdldFdTRExVUkwoKSk7Ci0gICAgfQotICAgIHJldHVybiB3c2RsVVJMczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWU5ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXdzYy1heGlzLXVpLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMGVlMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5kaXNjb3ZlcnkuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3Qud3NkbDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlcjwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY0ODdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLndzYy1heGlzLXVpLmphciA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IHdzYy1heGlzLXVpLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiN2E4M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYnNlcnZpY2UgQXhpcyBDb25zdW1wdGlvbiBVSQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLVdFQlNFUlZJQ0VDTElFTlRUWVBFX05BTUVfSkFWQV9BWElTPUphdmEgcHJveHkKLUxBQkVMX1JVTlRJTUVfQVhJU18xMT1BcGFjaGUgQXhpcyAxLjEKLURFU0NfUlVOVElNRV9BWElTXzExPUFwYWNoZSBBeGlzIDEuMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmI4MWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIG5hbWU9IiVQTFVHSU5fTkFNRSIKLSAgIHByb3ZpZGVyLW5hbWU9IiVQTFVHSU5fUFJPVklERVIiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0id3NjLWF4aXMtdWkuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud2ViIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS5heGlzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8IS0tIFdlYiBTZXJ2aWNlIENsaWVudCBUeXBlcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlQ2xpZW50VHlwZSI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjMyIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4zMi5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQzMl9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MC5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ0MF9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MS5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ0MV9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MC5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ1MF9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlUnVudGltZQotICAgICAgICAgICAgbGFiZWw9IiVMQUJFTF9SVU5USU1FX0FYSVNfMTEiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJURFU0NfUlVOVElNRV9BWElTXzExIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIGoyZWV2ZXJzaW9uPSIxMyAxNCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiPgotICAgICAgPC93ZWJTZXJ2aWNlUnVudGltZT4KLQotICAgICAgPHdlYlNlcnZpY2VDbGllbnRUeXBlCi0gICAgICAgICAgICBuYW1lPSIlV0VCU0VSVklDRUNMSUVOVFRZUEVfTkFNRV9KQVZBX0FYSVMiCi0gICAgICAgICAgICBydW50aW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiCi0gICAgICAgICAgICBjbGllbnRUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50LnR5cGUuamF2YSIKLSAgICAgICAgICAgIGFzc2VtYmx5QmluZGluZz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5XZWJTZXJ2aWNlQ2xpZW50QXhpc1R5cGUiCi0gICAgICAgICAgICBzZXJ2ZXI9IlNFUlZFUl9JRF9UT01DQVQzMl9MT0NBTCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LldlYlNlcnZpY2VDbGllbnRBeGlzVHlwZS5heGlzMTEuVG9tY2F0MzJMb2NhbCI+Ci0gICAgICA8L3dlYlNlcnZpY2VDbGllbnRUeXBlPgotCi0gICAgICA8d2ViU2VydmljZUNsaWVudFR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVXRUJTRVJWSUNFQ0xJRU5UVFlQRV9OQU1FX0pBVkFfQVhJUyIKLSAgICAgICAgICAgIHJ1bnRpbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSIKLSAgICAgICAgICAgIGNsaWVudFR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICAgICAgYXNzZW1ibHlCaW5kaW5nPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LldlYlNlcnZpY2VDbGllbnRBeGlzVHlwZSIKLSAgICAgICAgICAgIHNlcnZlcj0iU0VSVkVSX0lEX1RPTUNBVDQwX0xPQ0FMIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuV2ViU2VydmljZUNsaWVudEF4aXNUeXBlLmF4aXMxMS5Ub21jYXQ0MExvY2FsIj4KLSAgICAgIDwvd2ViU2VydmljZUNsaWVudFR5cGU+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlQ2xpZW50VHlwZQotICAgICAgICAgICAgbmFtZT0iJVdFQlNFUlZJQ0VDTElFTlRUWVBFX05BTUVfSkFWQV9BWElTIgotICAgICAgICAgICAgcnVudGltZT0ib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIgotICAgICAgICAgICAgY2xpZW50VHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLmNsaWVudC50eXBlLmphdmEiCi0gICAgICAgICAgICBhc3NlbWJseUJpbmRpbmc9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuV2ViU2VydmljZUNsaWVudEF4aXNUeXBlIgotICAgICAgICAgICAgc2VydmVyPSJTRVJWRVJfSURfVE9NQ0FUNDFfTE9DQUwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5XZWJTZXJ2aWNlQ2xpZW50QXhpc1R5cGUuYXhpczExLlRvbWNhdDQxTG9jYWwiPgotICAgICAgPC93ZWJTZXJ2aWNlQ2xpZW50VHlwZT4KLQotICAgICAgPHdlYlNlcnZpY2VDbGllbnRUeXBlCi0gICAgICAgICAgICBuYW1lPSIlV0VCU0VSVklDRUNMSUVOVFRZUEVfTkFNRV9KQVZBX0FYSVMiCi0gICAgICAgICAgICBydW50aW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiCi0gICAgICAgICAgICBjbGllbnRUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50LnR5cGUuamF2YSIKLSAgICAgICAgICAgIGFzc2VtYmx5QmluZGluZz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5XZWJTZXJ2aWNlQ2xpZW50QXhpc1R5cGUiCi0gICAgICAgICAgICBzZXJ2ZXI9IlNFUlZFUl9JRF9UT01DQVQ1MF9MT0NBTCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LldlYlNlcnZpY2VDbGllbnRBeGlzVHlwZS5heGlzMTEuVG9tY2F0NTBMb2NhbCI+Ci0gICAgICA8L3dlYlNlcnZpY2VDbGllbnRUeXBlPgotCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBKMkVFIFNlcnZpY2UgUmVmZXJlbmNlIEdlbmVyYXRvciAtLT4KLSAgICAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLldlYlNlcnZpY2VDbGllbnRHZW5lcmF0b3IiPgotICAgICA8Z2VuZXJhdG9yCi0gICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5BeGlzQ2xpZW50R2VuZXJhdG9yIj4KLSAgICAgICAgPHJ1bnRpbWUKLSAgICAgICAgICAgICAgc2VydmVyVGFyZ2V0PSJHZW5lcmljIEoyRUUgQ29udGFpbmVyIj4KLSAgICAgICAgPC9ydW50aW1lPiAgICAgICAgIAotICAgICA8L2dlbmVyYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeSAgIAotICAgICAgICAgICAgIGlkPSJBeGlzQ2xpZW50Q29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5EZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi53c3J0LkF4aXNDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5Ii8+Ci0gICAgPC9leHRlbnNpb24+IAotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpcy9jb25zdW1wdGlvbi91aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzJkOWMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLQotTVNHX0VSUk9SX0RFRkFVTFRfQkVBTj1JV0FCMDQ5MUUgRXJyb3IgZW5jb3VudGVyZWQgd2hpbGUgc2V0dGluZyB1cCBkZWZhdWx0IHZhbHVlcyBmb3IgSmF2YSBiZWFuCi1NU0dfRVJST1JfUkVBRF9XU0RMPUlXQUIwNDk0RSBFcnJvciBpbiByZWFkaW5nIFdTREwgZmlsZSB7MH0KLU1TR19FUlJPUl9XU0RMX05PX0RFRklOSVRJT049SVdBQjA0OTVFIFdTREwgZmlsZSBhdCB7MH0gaGFzIG5vIGRlZmluaXRpb24gZWxlbWVudAotTVNHX0VSUk9SX1dTRExfTk9fUE9SVD1JV0FCMDQ5NkUgV1NETCBmaWxlIGF0IHswfSBoYXMgbm8gcG9ydCBlbGVtZW50Ci1NU0dfRVJST1JfV1JJVEVfV1NETD1JV0FCMDQ5N0UgRXJyb3IgaW4gd3JpdGluZyBXU0RMIGZpbGUgezB9Ci0KLQotCi0jCi0jIE1lc3NhZ2VzIGZvciBDb3B5Q2xpZW50V1NETFRhc2sKLSMKLU1TR19FUlJPUl9JTVBPUlRfV1NETD1JV0FCMDUzMUUgRXJyb3IgaW4gcmVzb2x2aW5nIFdTREwgZmlsZSB7MH0sIGltcG9ydCBXU0RMIGZpbGUgbXVzdCBoYXZlIGFic29sdXRlIFVSTCBvciByZWxhdGl2ZSBVUkwgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Ci0KLQotIwotI0RlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kCi0jCi1UQVNLX0xBQkVMX0NMSUVOVF9KQVZBX1dTRExfREVGQVVMVFM9RGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETAotVEFTS19ERVNDX0NMSUVOVF9KQVZBX1dTRExfREVGQVVMVFM9QnVpbGRzIHRoZSBKYXZhV1NETFBhcmFtZXRlciBmb3IgY2xpZW50IHNpZGUuCi1NU0dfRVJST1JfV1NETF9MT0NBVElPTl9OT1RfU0VUPUlXQUIwNTAxRSBXU0RMIGxvY2F0aW9uIG5vdCBzZXQuCi0KLSMKLSNBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzawotIwotVEFTS19MQUJFTF9KQVJTX1RPX1BST0pFQ1Q9QWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2sKLVRBU0tfREVTQ19KQVJTX1RPX1BST0pFQ1Q9QWRkIEphcnMgdG8gcHJvamVjdCBidWlsZCBwYXRoLgotTVNHX1dBUk5fTk9fSkFWQV9OQVRVUkU9SVdBQjA1MDJXIFRoZSBwcm9qZWN0IGlzIG5vdCBhIEphdmEgcHJvamVjdC4KLU1TR19FUlJPUl9CQURfQlVJTERQQVRIPUlXQUIwNTAzRSBVbmFibGUgdG8gdXBkYXRlIEphdmEgYnVpbGQgcGF0aC4gUGxlYXNlIGNoZWNrIHlvdXIgc3lzdGVtIGVudmlyb25tZW50LgotCi0jCi0jQ29weUF4aXNKYXJDb21tYW5kCi0jCi1UQVNLX0RFU0NfQ09QWV9KQVJTX1RPX1BST0pFQ1Q9Q29weUF4aXNKYXJDb21tYW5kCi1UQVNLX0xBQkVMX0NPUFlfSkFSU19UT19QUk9KRUNUPUNvcHkgcmVxdWlyZWQgQXhpcyBydW50aW1lIGphcnMgZnJvbSBwbHVnaW4gdG8gd2ViIHByb2plY3QuCi1QUk9HUkVTU19JTkZPX0NPUFlfQVhJU19DRkc9SVdBQjA1MDVJIENvcHlpbmcgQXhpcyBqYXIgZmlsZXMgdG8gd2ViIHByb2plY3QuCi1NU0dfRVJST1JfRklMRUNPUFk9SVdBQjA1MDZFIEVycm9yIHdoZW4gY29weWluZyBBeGlzIGphciBmaWxlcyB0byB3ZWIgcHJvamVjdAotCi0jCi0jUmVmcmVzaFByb2plY3RUYXNrCi0jCi1UQVNLX0xBQkVMX1JFRkVTSF9QUk9KRUNUPVJlZnJlc2hQcm9qZWN0VGFzawotVEFTS19ERVNDX1JFRkVTSF9QUk9KRUNUPVJlZnJlc2ggdGhlIGZpbGVzIG9uIHRoZSBwcm9qZWN0IHdpdGggdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotTVNHX0VSUk9SX1JFRlJFU0hfUFJPSkVDVD1JV0FCMDUwOEUgVW5hYmxlIHRvIHJlZnJlc2ggcHJvamVjdC4KLQotCi0jCi0jV2ViU2VydmljZUF4aXNQcm94eUZyYWdtZW50Ci0jCi0KLSMKLSNXZWJTZXJ2aWNlQXhpc1Byb3h5UGFnZQotIwotVE9PTFRJUF9QV0pCX1BBR0U9UGFnZQotVE9PTFRJUF9QV0pCX1RFWFRfRk9MREVSPUZvbGRlciBmb3IgcHJveHkgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGUgc2VsZWN0ZWQgYmluZGluZy4KLVRPT0xUSVBfUFdKQl9DSEVDS0JPWF9HRU5QUk9YWT1DaGVjayB0byBlbmFibGUvZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBhIHByb3h5LgotCi1QQUdFX1RJVExFX1dTX0FYSVNfUFJPWFk9V2ViIFNlcnZpY2UgUHJveHkgUGFnZQotUEFHRV9ERVNDX1dTX0FYSVNfUFJPWFk9U2VsZWN0IGdlbmVyYXRlIHByb3h5IGlmIHlvdSB3YW50IHRvIGdlbmVyYXRlIHByb3h5IGZvciB5b3VyIHNlcnZpY2UuCi1DSEVDS0JPWF9HRU5QUk9YWT1HZW5lcmF0ZSBwcm94eQotTEFCRUxfRk9MREVSX05BTUU9T3V0cHV0IGZvbGRlcgotCi0jCi0jIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2sKLSMKLUNIRUNLX1dTX0REX1RBU0tfREVTQ1JJUFRJT049Q2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzawotQ0hFQ0tfV1NfRERfVEFTS19MQUJFTD1DaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrCi0KLSMKLSNDbGFzc3BhdGhVdGlscwotIwotTVNHX0VSUk9SX0NMQVNTUEFUSF9VVElMU19JT0VYQ0VQVElPTj1JV0FCMDUwOUUgSU9FeGNlcHRpb24gaW4gQ2xhc3NwYXRoVXRpbHMKLQotIwotIyBNZXNzYWdlcyBmb3IgV2ViU2VyaXZjZUF4aXNNYXBwaW5nc1BhZ2UKLSMKLVBBR0VfVElUTEVfV1NfQkVBTjJYTUw9V2ViIFNlcnZpY2UgcGFja2FnZSB0byBuYW1lc3BhY2UgbWFwcGluZwotUEFHRV9USVRMRV9XU19YTUwyUFJPWFk9V2ViIFNlcnZpY2UgQ2xpZW50IG5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmcKLVBBR0VfREVTQ19QMk5fTUFQUElOR1M9RGVmaW5lIGN1c3RvbSBtYXBwaW5nIGZvciBwYWNrYWdlIHRvIG5hbWVzcGFjZS4KLUxBQkVMX01BUFBJTkdfUEFJUlM9TWFwcGluZyBwYWlycwotVEFCTEVfQ09MVU1OX0xBQkVMX1BBQ0tBR0U9cGFja2FnZQotVEFCTEVfQ09MVU1OX0xBQkVMX05BTUVTUEFDRT1uYW1lc3BhY2UKLUxBQkVMX0VYUExPUkVfTUFQUElOR1NfWE1MMkJFQU49RGVmaW5lIGN1c3RvbSBtYXBwaW5nIGZvciBuYW1lc3BhY2UgdG8gcGFja2FnZS4KLVRPT0xUSVBfTjJQX1NIT1dfTUFQUElOR1M9RGVmaW5lIG5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmcgZm9yIGN1c3RvbWl6YXRpb24uCi0KLSMKLSMgTWVzc2FnZXMgZm9yIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2sKLSMKLU1TR19FUlJPUl9YTUxfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQ9SVdBQjA1MzJFIERvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgQXBhY2hlIEF4aXMgZGVwbG95bWVudCBkZXNjcmlwdG9yPwotCi0jCi0jTWVzc2FnZXMgZm9yIENvcHlDbGllbnRXU0RMQ29tbWFuZAotIwotVEFTS19ERVNDX0NPUFlfQ0xJRU5UX1dTREw9Q29waWVzIFdTREwgdG8gQ2xpZW50IHByb2plY3QKLVRBU0tfTEFCRUxfQ09QWV9DTElFTlRfV1NETD1Db3B5IFdTREwgdG8gQ2xpZW50IHByb2plY3QKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQWRkQXhpc0pBUlRvQnVpbGRQYXRoQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BZGRBeGlzSkFSVG9CdWlsZFBhdGhDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzFlMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BZGRBeGlzSkFSVG9CdWlsZFBhdGhDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENvbW1hbmQgdG8gYWRkIGF4aXMuamFyIHRvIHRoZSBidWlsZCBwYXRoIG9mIGEgcHJvamVjdCBhcyBhbiBleHRlcm5hbCB2YXJpYWJsZQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotICogQGF1dGhvciByc2luaGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRBeGlzSkFSVG9CdWlsZFBhdGhDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLSAgcHJpdmF0ZSBTdHJpbmcgamFyUGx1Z2luSWQgPSAib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS5heGlzIjsKLSAgcHJpdmF0ZSBTdHJpbmcgamFyUGx1Z2luUmVsUGF0aCA9ICJsaWIiOwotICBwcml2YXRlIFN0cmluZyBqYXJOYW1lID0gImF4aXMuamFyIjsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kI2V4ZWN1dGUob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50KQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICAvL0FkZCBKQVJzIHRvIHRoZSBjbGFzc3BhdGgKLSAgICBJQ2xhc3NwYXRoRW50cnlbXSBvbGRDbGFzc3BhdGg7Ci0gICAgSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoOwotICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLSAgICAKLSAgICAvL0dldCB0aGUgb2xkIGNsYXNzcGF0aAotICAgIHRyeQotICAgIHsgICAgCi0gICAgICBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsgICAgCi0gICAgICBpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RhdHVzIHdTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfV0FSTklOR19OT1RfQ09NUElMRSIpLCBTdGF0dXMuV0FSTklORyk7Ci0gICAgICAgIHJldHVybiB3U3RhdHVzOwotICAgICAgfQotCi0gICAgICBvbGRDbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN0YXR1cyB3U3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1dBUk5JTkdfTk9UX0NPTVBJTEUiKSwgU3RhdHVzLldBUk5JTkcpOwotICAgICAgcmV0dXJuIHdTdGF0dXM7Ci0gICAgfQotICAgIAotICAgIC8vQ2hlY2sgaWYgdGhlIGF4aXMuamFyIGlzIGFscmVhZHkgb24gdGhlIGJ1aWxkIHBhdGgKLSAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JZm9yIChpbnQgaT0wOyBpPG9sZENsYXNzcGF0aC5sZW5ndGg7IGkrKykKLQl7Ci0JICBmb3VuZCA9IGZvdW5kIHx8IG9sZENsYXNzcGF0aFtpXS5nZXRQYXRoKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGphck5hbWUudG9Mb3dlckNhc2UoKSk7Ci0gICAgfQotCi0JaWYgKGZvdW5kKSAKLQl7Ci0JICByZXR1cm4gc3RhdHVzOwotCX0gICAgCi0gICAgCi0JLy9BZGQgYXhpcy5qYXIgdG8gdGhlIGJ1aWxkIHBhdGgKLQluZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZENsYXNzcGF0aC5sZW5ndGggKyAxXTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChpPTAgOyBpIDwgb2xkQ2xhc3NwYXRoLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIG5ld0NsYXNzcGF0aFtpXSA9IG9sZENsYXNzcGF0aFtpXTsKLSAgICB9Ci0gICAgCi0gICAgSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5ID0gZ2V0Q2xhc3NwYXRoRW50cnkoKTsKLSAgICBpZiAobmV3RW50cnk9PW51bGwpCi0gICAgewotICAgICAgU3RhdHVzIHdTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfV0FSTklOR19OT1RfQ09NUElMRSIpLCBTdGF0dXMuV0FSTklORyk7Ci0gICAgICByZXR1cm4gd1N0YXR1czsKLSAgICB9Ci0gICAgbmV3Q2xhc3NwYXRoW2ldID0gbmV3RW50cnk7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCxudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN0YXR1cyB3U3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1dBUk5JTkdfTk9UX0NPTVBJTEUiKSwgU3RhdHVzLldBUk5JTkcpOwotICAgICAgcmV0dXJuIHdTdGF0dXM7Ci0gICAgfQotICAgIAotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgSUNsYXNzcGF0aEVudHJ5IGdldENsYXNzcGF0aEVudHJ5KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElQbHVnaW5SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0gICAgICBJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gcGx1Z2luUmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcihqYXJQbHVnaW5JZCk7Ci0KLSAgICAgIFN0cmluZ0J1ZmZlciB0aGVKYXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICB0aGVKYXIuYXBwZW5kKGphclBsdWdpblJlbFBhdGgpOwotCi0gICAgICBpZiAoamFyUGx1Z2luUmVsUGF0aC5sZW5ndGgoKT4wKQotICAgICAgICB0aGVKYXIuYXBwZW5kKElQYXRoLlNFUEFSQVRPUik7Ci0KLSAgICAgIHRoZUphci5hcHBlbmQoamFyTmFtZSk7Ci0gICAgICAKLSAgICAgIFVSTCBsb2NhbFVSTCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKSx0aGVKYXIudG9TdHJpbmcoKSkpOwotICAgICAgUGF0aCBqYXJQYXRoID0gIG5ldyBQYXRoKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0gICAgICBJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShqYXJQYXRoLCBudWxsLCBudWxsKTsKLSAgICAgIHJldHVybiBjcEVudHJ5OwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICB9Ci0gCi0gIAotICAvKioKLSAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZWI0YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLS8qKgotICogCi0gKiBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50U2NlbmFyaW9fICA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGN1c3RvbWl6ZU1hcHBpbmdzXyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVByb3h5XyA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgY2xpZW50UnVudGltZUlkXzsKLQlwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotCXByaXZhdGUgSVByb2plY3QgcHJveHlQcm9qZWN0XyA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvamVjdCBjbGllbnRQcm9qZWN0RUFSXyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgd3NkbFVSTF87Ci0JcHJpdmF0ZSBib29sZWFuIHRlc3RQcm94eVNlbGVjdGVkXzsKLQlwcml2YXRlIElTZXJ2ZXIgY2xpZW50RXhpc3RpbmdTZXJ2ZXJfOwotCXByaXZhdGUgU3RyaW5nIGNsaWVudFNlcnZlcl87Ci0JcHJpdmF0ZSBTdHJpbmcgY2xpZW50U2VydmVyVHlwZUlkXzsKLQlwcml2YXRlIGJvb2xlYW4gY2xpZW50SXNFeGlzdGluZ1NlcnZlcl87Ci0JcHJpdmF0ZSBTdHJpbmcgcHJveHlQcm9qZWN0Rm9sZGVyXzsKLQlwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyXzsKLQkKLQkKLQlwdWJsaWMgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZCNleGVjdXRlKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCkKLQkgKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCQkKLQkJY2xpZW50RXhpc3RpbmdTZXJ2ZXJfID0gZ2V0U2VydmVyRnJvbVNlcnZlckxhYmVsKCk7Ci0JCWlmIChjbGllbnRFeGlzdGluZ1NlcnZlcl8gIT0gbnVsbCkgewotCQkJY2xpZW50U2VydmVyVHlwZUlkXyA9IGNsaWVudEV4aXN0aW5nU2VydmVyXy5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLQkJfSBlbHNlIHsKLQkJCS8vVE9ETyBnZXQgdGhlIGZhY3RvcnkgaWQgZm9yIHRoZSB0eXBlLgotCQl9Ci0JCS8vamF2YVdTRExQYXJhbQotCQlqYXZhV1NETFBhcmFtXyA9IG5ldyBKYXZhV1NETFBhcmFtZXRlcigpOwotCQkKLQkJLy8gcHJveHlQcm9qZWN0Rm9sYmVyXwotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGllbnRSdW50aW1lSUQoU3RyaW5nIGNsaWVudFJ1bnRpbWVJZCkgewotCQljbGllbnRSdW50aW1lSWRfID0gY2xpZW50UnVudGltZUlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UnVudGltZUlEKCkgewotCQlyZXR1cm4gdGhpcy5jbGllbnRSdW50aW1lSWRfOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbS4KLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpIHsKLQkJcmV0dXJuIGphdmFXU0RMUGFyYW1fOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50UHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0Q2xpZW50UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb3h5UHJvamVjdF87Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsaWVudFByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBjbGllbnRQcm9qZWN0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0KElQcm9qZWN0IGNsaWVudFByb2plY3QpIHsKLQkJdGhpcy5wcm94eVByb2plY3RfID0gY2xpZW50UHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsaWVudFByb2plY3RFQVIuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldENsaWVudFByb2plY3RFQVIoKSB7Ci0JCXJldHVybiBjbGllbnRQcm9qZWN0RUFSXzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xpZW50UHJvamVjdEVBUgotCSAqICAgICAgICAgICAgVGhlIGNsaWVudFByb2plY3RFQVIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3RFQVIoSVByb2plY3QgY2xpZW50UHJvamVjdEVBUikgewotCQl0aGlzLmNsaWVudFByb2plY3RFQVJfID0gY2xpZW50UHJvamVjdEVBUjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRlc3RQcm94eVNlbGVjdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFRlc3RQcm94eVNlbGVjdGVkKCkgewotCQlyZXR1cm4gdGVzdFByb3h5U2VsZWN0ZWRfOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0ZXN0UHJveHlTZWxlY3RlZAotCSAqICAgICAgICAgICAgVGhlIHRlc3RQcm94eVNlbGVjdGVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXN0UHJveHlTZWxlY3RlZChib29sZWFuIHRlc3RQcm94eVNlbGVjdGVkKSB7Ci0JCXRoaXMudGVzdFByb3h5U2VsZWN0ZWRfID0gdGVzdFByb3h5U2VsZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsVVJMLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSTCgpIHsKLQkgIHJldHVybiB3c2RsVVJMXzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3NkbFVSTAotCSAqICAgICAgICAgICAgVGhlIHdzZGxVUkwgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdzZGxVUkwoU3RyaW5nIHdzZGxVUkwpIHsKLQkJdGhpcy53c2RsVVJMXyA9IHdzZGxVUkw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRTZXJ2ZXIuCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0Q2xpZW50RXhpc3RpbmdTZXJ2ZXIoKSB7Ci0JCXJldHVybiBjbGllbnRFeGlzdGluZ1NlcnZlcl87Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsaWVudFNlcnZlcgotCSAqICAgICAgICAgICAgVGhlIGNsaWVudFNlcnZlciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50U2VydmVyKFN0cmluZyBjbGllbnRTZXJ2ZXIpIHsKLQkJdGhpcy5jbGllbnRTZXJ2ZXJfID0gY2xpZW50U2VydmVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50SXNFeGlzdGluZ1NlcnZlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NsaWVudElzRXhpc3RpbmdTZXJ2ZXIoKSB7Ci0JCXJldHVybiBjbGllbnRJc0V4aXN0aW5nU2VydmVyXzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xpZW50SXNFeGlzdGluZ1NlcnZlcgotCSAqICAgICAgICAgICAgVGhlIGNsaWVudElzRXhpc3RpbmdTZXJ2ZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaWVudElzRXhpc3RpbmdTZXJ2ZXIoYm9vbGVhbiBjbGllbnRJc0V4aXN0aW5nU2VydmVyKSB7Ci0JCXRoaXMuY2xpZW50SXNFeGlzdGluZ1NlcnZlcl8gPSBjbGllbnRJc0V4aXN0aW5nU2VydmVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEN1c3RvbWl6ZUNsaWVudE1hcHBpbmdzKCkgewotCQlyZXR1cm4gY3VzdG9taXplTWFwcGluZ3NfOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZUNsaWVudE1hcHBpbmdzKGJvb2xlYW4gdmFsdWUpIHsKLQkJY3VzdG9taXplTWFwcGluZ3NfID0gdmFsdWU7Ci0JfQotCi0JcHJpdmF0ZSBJU2VydmVyIGdldFNlcnZlckZyb21TZXJ2ZXJMYWJlbCgpIHsKLQkJaWYgKHRydWUpCi0JCS8vIHJzayByZXZpc2l0IGlmIChjbGllbnRJc0V4aXN0aW5nU2VydmVyXykKLQkJewotCQkJLy8gTWF5YmUgdGhpcyBzaG91bGQgYmUgaW4gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkKLQkJCVZlY3RvciBzZXJ2ZXJJZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCQl7Ci0JCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJCQlpZiAoc2VydmVycyAhPSBudWxsICYmIHNlcnZlcnMubGVuZ3RoIT0wKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgc2VydmVyc1tpXTsKLQkJCQkJCWlmICgoc2VydmVyLmdldE5hbWUoKSkuZXF1YWxzKGNsaWVudFNlcnZlcl8pKQotCQkJCQkJCXJldHVybiBzZXJ2ZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLwotCQl9IGVsc2UgewotCQkJLy9UT0RPIGNyZWF0ZSB0aGUgc2VydmVyCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJveHlQcm9qZWN0Rm9sZGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJveHlQcm9qZWN0Rm9sZGVyKCkgewotCQlpZiAocHJveHlQcm9qZWN0XyE9bnVsbCkgewotCQkJcHJveHlQcm9qZWN0Rm9sZGVyXyA9IFJlc291cmNlVXRpbHMuZ2V0SmF2YVNvdXJjZUxvY2F0aW9uKHByb3h5UHJvamVjdF8pLnRvU3RyaW5nKCk7Ci0JCX0JCQotCQlyZXR1cm4gcHJveHlQcm9qZWN0Rm9sZGVyXzsgIAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZXNQYXJzZXIuCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkgewotCQlyZXR1cm4gd2ViU2VydmljZXNQYXJzZXJfOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gd2ViU2VydmljZXNQYXJzZXIgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikgewotCQl0aGlzLndlYlNlcnZpY2VzUGFyc2VyXyA9IHdlYlNlcnZpY2VzUGFyc2VyOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGdlbmVyYXRlUHJveHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpIHsKLQkJcmV0dXJuIGdlbmVyYXRlUHJveHlfOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZ2VuZXJhdGVQcm94eSBUaGUgZ2VuZXJhdGVQcm94eSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHkpIHsKLQkJdGhpcy5nZW5lcmF0ZVByb3h5XyA9IGdlbmVyYXRlUHJveHk7Ci0JfQotCQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNDbGllbnRTY2VuYXJpb18uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SXNDbGllbnRTY2VuYXJpbygpCi0gICAgewotICAgICAgcmV0dXJuIGlzQ2xpZW50U2NlbmFyaW9fOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaXNDbGllbnRTY2VuYXJpb18gVGhlIGlzQ2xpZW50U2NlbmFyaW9fIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJc0NsaWVudFNjZW5hcmlvKGJvb2xlYW4gaXNDbGllbnRTY2VuYXJpbykKLSAgICB7Ci0gICAgICBpc0NsaWVudFNjZW5hcmlvXyA9IGlzQ2xpZW50U2NlbmFyaW87Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZXRFbmRwb2ludE1ldGhvZCBUaGUgc2V0RW5kcG9pbnRNZXRob2QgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2V0RW5kcG9pbnRNZXRob2QoKQotICAgIHsKLSAgICAgIHJldHVybiAic2V0RW5kcG9pbnQiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQXhpc0NsaWVudEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDhhZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VDbGllbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmVudi5KMkVFRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkNvcHlBeGlzSmFyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkRlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5SZWZyZXNoUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suVmFsaWRhdGVXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzQ2xpZW50R2VuZXJhdG9yIGV4dGVuZHMgV2ViU2VydmljZUNsaWVudEdlbmVyYXRvciAKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGdlbldlYlNlcnZpY2VDbGllbnRBcnRpZmFjdHMoV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyIGRhdGFNb2RlbCkKLSAgewotICAJLy9nZXQgaW5mbyBmcm9tIHRoZSBtb2RlbAotICAJU3RyaW5nIHdzZGxVUkwgPSBkYXRhTW9kZWwuZ2V0V1NETFVybCgpOwotICAgIFN0cmluZyBwcm9qZWN0ID0gZGF0YU1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgU3RyaW5nIG91dHB1dFdTRExGaWxlUGF0aE5hbWUgPSBkYXRhTW9kZWwuZ2V0T3V0cHV0V1NETEZpbGVOYW1lKCk7Ci0gICAgU3RyaW5nIHNlcnZpY2VRTmFtZSA9IGRhdGFNb2RlbC5nZXRTZXJ2aWNlUU5hbWUoKTsKLSAgICBib29sZWFuIHNob3VsZERlcGxveSA9IGRhdGFNb2RlbC5zaG91bGREZXBsb3koKTsKLSAgICAKLSAgICAKLSAgICAvL0dlbmVyYXRlIHRoZSBhcnRpZmFjdHMKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgLy9BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQKLSAgICBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQgYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kID0gbmV3IEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLnNldFdzZGxVUkwod3NkbFVSTCk7Ci0gICAgYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLnNldFdlYlNlcnZpY2VzUGFyc2VyKG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpKTsKLSAgICBheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuc2V0Q2xpZW50UHJvamVjdCgoSVByb2plY3QpKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0ocHJvamVjdCkpKTsKLSAgICBheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuc2V0VGVzdFByb3h5U2VsZWN0ZWQoZmFsc2UpOwotICAgIGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5zZXRJc0NsaWVudFNjZW5hcmlvKHRydWUpOwotICAgIGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5zZXRHZW5lcmF0ZVByb3h5KHRydWUpOwotICAgIEoyRUVFbnZpcm9ubWVudCBqMmVlRW52aXJvbm1lbnQgPSBuZXcgSjJFRUVudmlyb25tZW50KCk7Ci0gICAgc3RhdHVzID0gYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmV4ZWN1dGUoajJlZUVudmlyb25tZW50KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICByZXR1cm4gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0U3RhdHVzVG9JU3RhdHVzKHN0YXR1cywgcGx1Z2luSWRfKTsKLSAgICB9Ci0gICAgCi0vLyAgRmlndXJlIG91dCBpZiB0aGlzIGlzIGEgV2ViLCBFSkIsIG9yIEFwcENsaWVudCBwcm9qZWN0Ci0gICAgYm9vbGVhbiBpc1dlYlByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0Q2xpZW50UHJvamVjdCgpKTsKLSAgICAKLSAgICAvL0RlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQKLSAgICBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kIGh0dHBDb21tYW5kID0gbmV3IERlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQoKTsKLSAgICBodHRwQ29tbWFuZC5zZXRKYXZhV1NETFBhcmFtKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRKYXZhV1NETFBhcmFtKCkpOwotICAgIGh0dHBDb21tYW5kLnNldFdzZGxTZXJ2aWNlVVJMKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXc2RsVVJMKCkpOwotICAgIGh0dHBDb21tYW5kLnNldFdlYlNlcnZpY2VzUGFyc2VyKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXZWJTZXJ2aWNlc1BhcnNlcigpKTsKLSAgICBzdGF0dXMgPSBodHRwQ29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spCi0gICAgewotICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgfQotICAgIAotICAgIC8vQ29weUF4aXNKYXJDb21tYW5kCi0gICAgLy9UaGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIEF4aXMgV1NETDJKYXZhIGVtaXR0ZXIgcmVxdWlyZXMgYXhpcy5qYXIgaW4gb3JkZXIgdG8gY29tcGlsZS4KLSAgICAvL0luIHRoZSBjYXNlIG9mIGEgV2ViIHByb2plY3QsIHdlIGFkZCBpdCB0byB0aGUgbGliIGRpcmVjdG9yeS4KLSAgICAvL0luIHRoZSBjYXNlIG9mIGFuIEVKQiBvciBBcHAgQ2xpZW50IHByb2plY3QsIHdlIGFkZCBpdCBhcyBhbiBleHRlcm5hbCBKQVIuIFRoaXMgYnJlYWtzCi0gICAgLy90aGUgdGVhbSBlbnZpcm9ubWVudCBzY2VuYXJpby4gV2Ugd2lsbCBoYXZlIHRvIHRoaW5rIG9mIGEgYmV0dGVyIHdheSB0byBkZWFsIHdpdGggdGhpcyAKLSAgICAvL2luIHRoZSBmdXR1cmUuCi0gICAgaWYgKGlzV2ViUHJvamVjdCkKLSAgICB7Ci0JICAgIENvcHlBeGlzSmFyQ29tbWFuZCBheGpDb21tYW5kID0gbmV3IENvcHlBeGlzSmFyQ29tbWFuZCgpOwotCSAgICBheGpDb21tYW5kLnNldFByb2plY3QoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldENsaWVudFByb2plY3QoKSk7Ci0JICAgIHN0YXR1cyA9IGF4akNvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotCSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSykKLQkgICAgewotCSAgICAgIHJldHVybiBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoc3RhdHVzLCBwbHVnaW5JZF8pOwotCSAgICB9Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgQWRkQXhpc0pBUlRvQnVpbGRQYXRoQ29tbWFuZCBhZGRBeGlzQ29tbWFuZCA9IG5ldyBBZGRBeGlzSkFSVG9CdWlsZFBhdGhDb21tYW5kKCk7Ci0gICAgICBhZGRBeGlzQ29tbWFuZC5zZXRQcm9qZWN0KGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRDbGllbnRQcm9qZWN0KCkpOwotICAgICAgc3RhdHVzID0gYWRkQXhpc0NvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotCSAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IFN0YXR1cy5PSykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIC8vQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2sKLSAgICBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzayBhZGRKYXJzQ29tbWFuZCA9IG5ldyBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzaygpOwotICAgIGFkZEphcnNDb21tYW5kLnNldFByb2plY3QoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldENsaWVudFByb2plY3QoKSk7Ci0gICAgc3RhdHVzID0gYWRkSmFyc0NvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLk9LKQotICAgIHsKLSAgICAgIHJldHVybiBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoc3RhdHVzLCBwbHVnaW5JZF8pOwotICAgIH0gICAgCi0gICAgCi0gICAgLy9EZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZAotICAgIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kIGRlZkNsaWVudENvbW1hbmQgPSBuZXcgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQoKTsKLSAgICBkZWZDbGllbnRDb21tYW5kLnNldEphdmFXU0RMUGFyYW0oYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldEphdmFXU0RMUGFyYW0oKSk7Ci0gICAgZGVmQ2xpZW50Q29tbWFuZC5zZXRQcm94eVByb2plY3QoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldENsaWVudFByb2plY3QoKSk7Ci0gICAgZGVmQ2xpZW50Q29tbWFuZC5zZXRXU0RMU2VydmljZVVSTChheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0V3NkbFVSTCgpKTsKLSAgICBzdGF0dXMgPSBkZWZDbGllbnRDb21tYW5kLmV4ZWN1dGUoajJlZUVudmlyb25tZW50KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICByZXR1cm4gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0U3RhdHVzVG9JU3RhdHVzKHN0YXR1cywgcGx1Z2luSWRfKTsKLSAgICB9ICAgICAgICAKLSAgICAKLSAgICAvL1ZhbGlkYXRlV1NETENvbW1hbmQKLSAgICBWYWxpZGF0ZVdTRExDb21tYW5kIHZhbFdTRExDb21tYW5kID0gbmV3IFZhbGlkYXRlV1NETENvbW1hbmQoKTsKLSAgICB2YWxXU0RMQ29tbWFuZC5zZXRXc2RsVVJJKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXc2RsVVJMKCkpOwotICAgIHZhbFdTRExDb21tYW5kLnNldFdlYlNlcnZpY2VzUGFyc2VyKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXZWJTZXJ2aWNlc1BhcnNlcigpKTsKLSAgICBzdGF0dXMgPSB2YWxXU0RMQ29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spCi0gICAgewotICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvL1dTREwySmF2YUNvbW1hbmQKLSAgICBXU0RMMkphdmFDb21tYW5kIHcyakNvbW1hbmQgPSBuZXcgV1NETDJKYXZhQ29tbWFuZCgpOwotICAgIHcyakNvbW1hbmQuc2V0SmF2YVdTRExQYXJhbShheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0SmF2YVdTRExQYXJhbSgpKTsKLSAgICB3MmpDb21tYW5kLnNldFdzZGxVUkkoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldFdzZGxVUkwoKSk7Ci0gICAgc3RhdHVzID0gdzJqQ29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spCi0gICAgewotICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgfSAgICAKLQotICAgIC8vUmVmcmVzaFByb2plY3RDb21tYW5kCi0gICAgUmVmcmVzaFByb2plY3RDb21tYW5kIHJlZnJlc2hDb21tYW5kID0gbmV3IFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpOwotICAgIHJlZnJlc2hDb21tYW5kLnNldFByb2plY3QoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldENsaWVudFByb2plY3QoKSk7Ci0gICAgc3RhdHVzID0gcmVmcmVzaENvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLk9LKQotICAgIHsKLSAgICAgIHJldHVybiBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoc3RhdHVzLCBwbHVnaW5JZF8pOwotICAgIH0gICAgCi0gICAgCi0gICAgU3R1YjJCZWFuQ29tbWFuZCBzMmJDb21tYW5kID0gbmV3IFN0dWIyQmVhbkNvbW1hbmQoKTsKLSAgICBzMmJDb21tYW5kLnNldEphdmFXU0RMUGFyYW0oYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldEphdmFXU0RMUGFyYW0oKSk7Ci0gICAgczJiQ29tbWFuZC5zZXRXZWJTZXJ2aWNlc1BhcnNlcihheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0V2ViU2VydmljZXNQYXJzZXIoKSk7Ci0gICAgczJiQ29tbWFuZC5zZXRDbGllbnRQcm9qZWN0KGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRDbGllbnRQcm9qZWN0KCkpOwotICAgIHN0YXR1cyA9IHMyYkNvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOyAKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICByZXR1cm4gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0U3RhdHVzVG9JU3RhdHVzKHN0YXR1cywgcGx1Z2luSWRfKTsKLSAgICB9Ci0KLSAgICAvL0NvcHlDbGllbnRXU0RMQ29tbWFuZAotICAgIENvcHlDbGllbnRXU0RMQ29tbWFuZCBjb3B5Q29tbWFuZCA9IG5ldyBDb3B5Q2xpZW50V1NETENvbW1hbmQoKTsKLSAgICBjb3B5Q29tbWFuZC5zZXRXc2RsVVJMKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXc2RsVVJMKCkpOwotICAgIGNvcHlDb21tYW5kLnNldENsaWVudFdTRExQYXRoTmFtZShvdXRwdXRXU0RMRmlsZVBhdGhOYW1lKTsKLSAgICBjb3B5Q29tbWFuZC5zZXRXc1BhcnNlcihheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0V2ViU2VydmljZXNQYXJzZXIoKSk7Ci0gICAgc3RhdHVzID0gY29weUNvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLk9LKQotICAgIHsKLSAgICAgIHJldHVybiBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoc3RhdHVzLCBwbHVnaW5JZF8pOwotICAgIH0gICAgCi0gICAgCi0gICAgCi0gICAgLy9CdWlsZFByb2plY3RDb21tYW5kCi0gICAgQnVpbGRQcm9qZWN0Q29tbWFuZCBidWlsZENvbW1hbmQgPSBuZXcgQnVpbGRQcm9qZWN0Q29tbWFuZCgpOwotICAgIGJ1aWxkQ29tbWFuZC5zZXRQcm9qZWN0KGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRDbGllbnRQcm9qZWN0KCkpOwotICAgIGJ1aWxkQ29tbWFuZC5zZXRGb3JjZUJ1aWxkKHRydWUpOwotICAgIHN0YXR1cyA9IGJ1aWxkQ29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spCi0gICAgewotICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgfSAgICAKLSAgICAgICAgCi0gICAgLy9DYWxjdWxhdGUgdGhlIHNlcnZpY2UgaW50ZXJmYWNlIGFuZCBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSBuYW1lcwotICAgIEludGVyZmFjZU5hbWVzIGludGVyZmFjZU5hbWVzID0gY2FsY3VsYXRlU0lhbmRTRUlOYW1lKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXc2RsVVJMKCksIHNlcnZpY2VRTmFtZSwgYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldFdlYlNlcnZpY2VzUGFyc2VyKCkpOwotICAgIFN0cmluZyBzaU5hbWUgPSBpbnRlcmZhY2VOYW1lcy5nZXRTaU5hbWUoKTsgCi0gICAgU3RyaW5nW10gc2VpTmFtZXMgPSBpbnRlcmZhY2VOYW1lcy5nZXRTZWlOYW1lcygpOwotICAgIGlmIChzaU5hbWU9PW51bGwgfHwgc2lOYW1lLmxlbmd0aCgpPT0wIHx8IHNlaU5hbWVzPT1udWxsIHx8IHNlaU5hbWVzLmxlbmd0aD09MCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMoSVN0YXR1cy5FUlJPUixwbHVnaW5JZF8sMCwiUHJvYmxlbXMhISIsbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8vU2V0IGluZm8gb24gdGhlIGRhdGFNb2RlbAotICAgIGRhdGFNb2RlbC5zZXRTZXJ2aWNlSW50ZXJmYWNlTmFtZShzaU5hbWUpOwotICAgIGRhdGFNb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lcyhzZWlOYW1lcyk7Ci0gICAgZGF0YU1vZGVsLnNldERpZEdlbkRlc2NyaXB0b3JzKGZhbHNlKTsKLSAgICAKLSAgICByZXR1cm4gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0U3RhdHVzVG9JU3RhdHVzKHN0YXR1cywgcGx1Z2luSWRfKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBJbnRlcmZhY2VOYW1lcyBjYWxjdWxhdGVTSWFuZFNFSU5hbWUoU3RyaW5nIHdzZGxVUkwsIFN0cmluZyBzZXJ2aWNlUU5hbWUsIFdlYlNlcnZpY2VzUGFyc2VyIHdzUGFyc2VyKQotICB7Ci0gICAgSW50ZXJmYWNlTmFtZXMgaU5hbWVzID0gbmV3IEludGVyZmFjZU5hbWVzKCk7Ci0gICAgU3RyaW5nIHNlcnZpY2VMb2NhbFBhcnQgPSBzZXJ2aWNlUU5hbWUuc3Vic3RyaW5nKHNlcnZpY2VRTmFtZS5sYXN0SW5kZXhPZignOicpKzEpOwotICAgIE1hcCBwa2cybnNNYXBwaW5nID0gbnVsbDsKLSAgICBEZWZpbml0aW9uIGRlZiA9IHdzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotIAotICAgIE1hcCBzZXJ2aWNlcyA9IGRlZi5nZXRTZXJ2aWNlcygpOwotICAgIFNlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgc2VydmljZSA9IChTZXJ2aWNlKWl0Lm5leHQoKTsKLSAgICAgIGlmIChzZXJ2aWNlTG9jYWxQYXJ0LmVxdWFscyhzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKQotICAgICAgICBicmVhazsKLSAgICB9ICAgICAgICAKLSAgICAgIAotICAgIGlmIChzZXJ2aWNlIT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBzZXJ2aWNlUGtnTmFtZSA9IFdTRExVdGlscy5nZXRQYWNrYWdlTmFtZShzZXJ2aWNlLCBwa2cybnNNYXBwaW5nKTsKLSAgICAgIFN0cmluZyBzZXJ2aWNlQ2xhc3NOYW1lID0gc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgU3RyaW5nIGpuZGlOYW1lID0gc2VydmljZUNsYXNzTmFtZTsKLSAgICAgIE1hcCBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQyID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXJ2aWNlQ2xhc3NOYW1lLmVxdWFscygoKFBvcnQpaXQyLm5leHQoKSkuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2aWNlQ2xhc3NOYW1lID0gc2VydmljZUNsYXNzTmFtZSArICJfU2VydmljZSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIEFycmF5TGlzdCBzZWlOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQyID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KWl0Mi5uZXh0KCk7Ci0gICAgICAgIFNPQVBBZGRyZXNzIHNvYXBBZGRyZXNzID0gbnVsbDsKLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0MyA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOyBpdDMuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXQzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc29hcEFkZHJlc3MgPSAoU09BUEFkZHJlc3Mpb2JqZWN0OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvYXBBZGRyZXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IHBvcnQuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCk7Ci0gICAgICAgICAgUU5hbWUgcG9ydFR5cGVRTmFtZSA9IHBvcnRUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHBvcnRUeXBlUGtnTmFtZSA9IFdTRExVdGlscy5nZXRQYWNrYWdlTmFtZShwb3J0VHlwZSwgcGtnMm5zTWFwcGluZyk7Ci0gICAgICAgICAgU3RyaW5nIHBvcnRUeXBlQ2xhc3NOYW1lID0gcG9ydFR5cGVRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICBpZiAoam5kaU5hbWUuZXF1YWxzKHBvcnRUeXBlQ2xhc3NOYW1lKSkKLSAgICAgICAgICAgICAgcG9ydFR5cGVDbGFzc05hbWUgPSBwb3J0VHlwZUNsYXNzTmFtZSArICJfUG9ydCI7Ci0gICAgICAgICAgc2VpTmFtZXMuYWRkKHBvcnRUeXBlUGtnTmFtZSsiLiIrcG9ydFR5cGVDbGFzc05hbWUpOyAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaU5hbWVzLnNldFNpTmFtZShzZXJ2aWNlUGtnTmFtZSsiLiIrc2VydmljZUNsYXNzTmFtZSk7Ci0gICAgICBpTmFtZXMuc2V0U0VJTmFtZXMoY29udmVydFRvU3RyaW5nQXJyYXkoc2VpTmFtZXMudG9BcnJheSgpKSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gaU5hbWVzOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZ1tdIGNvbnZlcnRUb1N0cmluZ0FycmF5KE9iamVjdFtdIGEpCi0gIHsKLSAgCWlmIChhPT1udWxsKSByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgCQotICAJaW50IGxlbmd0aCA9IGEubGVuZ3RoOwotICAJU3RyaW5nW10gc2EgPSBuZXcgU3RyaW5nW2xlbmd0aF07Ci0gIAlmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspCi0gIAl7Ci0gIAkJT2JqZWN0IG9iaiA9IGFbaV07Ci0gIAkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykKLSAgCQl7Ci0gIAkJCXNhW2ldID0gKFN0cmluZylvYmo7Ci0gIAkJfQotICAJfQotICAJcmV0dXJuIHNhOwotICB9ICAKLSAgcHJpdmF0ZSBjbGFzcyBJbnRlcmZhY2VOYW1lcwotICB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2lOYW1lXzsKLSAgICBwcml2YXRlIFN0cmluZ1tdIHNlaU5hbWVzXzsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNpTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuIHNpTmFtZV87Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFNlaU5hbWVzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2VpTmFtZXNfOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTaU5hbWUoU3RyaW5nIHNpTmFtZSkKLSAgICB7Ci0gICAgICBzaU5hbWVfID0gc2lOYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTRUlOYW1lcyhTdHJpbmdbXSBzZWlOYW1lcykKLSAgICB7Ci0gICAgICBzZWlOYW1lc18gPSBzZWlOYW1lczsKLSAgICB9Ci0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQXhpc0NsaWVudElucHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50SW5wdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4M2U2ZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50SW5wdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotCi1wdWJsaWMgY2xhc3MgQXhpc0NsaWVudElucHV0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfQlVfQVhJU19JTlBVVCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19CVV9BWElTX0lOUFVUIjsKLQkKLQlwcml2YXRlIElXZWJTZXJ2aWNlQ2xpZW50IHdzY187Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmVyUHJvamVjdF87IAotCXByaXZhdGUgSUNvbnRleHQgY29udGV4dF87Ci0KLQkgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSURfOwotCSAgCi0JCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVByb3h5XyA9IHRydWU7Ci0JCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JCXByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3RfID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgd3NkbFVSTF87Ci0JCXByaXZhdGUgSVNlcnZlciBjbGllbnRFeGlzdGluZ1NlcnZlcl87Ci0JCXByaXZhdGUgU3RyaW5nIGNsaWVudFNlcnZlcl87Ci0JCXByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXJfOwotCQkKLQkgIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkgIAotCQkvKioKLQkJKiBEZWZhdWx0IENUT1IKLQkJKi8KLQkJcHVibGljIEF4aXNDbGllbnRJbnB1dENvbW1hbmQoKSB7Ci0JCQlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkJICAgIHNldE5hbWUgKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7Ci0JCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkJfQotCQkKLQkJcHVibGljIEF4aXNDbGllbnRJbnB1dENvbW1hbmQoSVdlYlNlcnZpY2VDbGllbnQgd3NjLCBJQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbW9kdWxlKSB7Ci0JCQlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkJICAgIHNldE5hbWUgKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7Ci0JCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkJCXdzY18gPSB3c2M7Ci0JCQljb250ZXh0XyA9IGNvbnRleHQ7Ci0JCQljbGllbnRQcm9qZWN0XyA9IG1vZHVsZTsgCi0JCX0KLQkJCi0JICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCSAgewotCSAgICAKLQkgIAlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCSAgICAKLQkJZ2VuZXJhdGVQcm94eV8gPSBjb250ZXh0Xy5nZXRDbGllbnQoKTsKLQkJd3NkbFVSTF8gPSB3c2NfLmdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuZ2V0V3NkbFVSTCgpOwotCQljbGllbnRTZXJ2ZXJfID0gd3NjXy5nZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLmdldFNlcnZlckluc3RhbmNlSWQoKTsKLQkJCi0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkgIH0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50U2VydmVyKCkgewotCQlyZXR1cm4gY2xpZW50U2VydmVyXzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsaWVudFByb2plY3QoKSB7Ci0JCXJldHVybiBjbGllbnRQcm9qZWN0XzsKLQl9Ci0KLQlwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKSB7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlc1BhcnNlcl87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXc2RsVVJMKCkgewotCQlyZXR1cm4gd3NkbFVSTF87Ci0JfQotCSAgCi0JCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50T3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50T3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjUyODEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQXhpc0NsaWVudE91dHB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBBeGlzQ2xpZW50T3V0cHV0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfQVhJU19DTElFTlRfT1VUUFVUIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX0FYSVNfQ0xJRU5UX09VVFBVVCI7Ci0JCi0JcHJpdmF0ZSBJV2ViU2VydmljZUNsaWVudCB3c2NfOwotCXByaXZhdGUgU3RyaW5nIHByb3h5QmVhbl87Ci0JCQotCSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCSAgCi0JCS8qKgotCQkqIERlZmF1bHQgQ1RPUgotCQkqLwotCQlwdWJsaWMgQXhpc0NsaWVudE91dHB1dENvbW1hbmQoKSB7Ci0JCQlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkJICAgIHNldE5hbWUgKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7Ci0JCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkJfQotCQkKLQkJcHVibGljIEF4aXNDbGllbnRPdXRwdXRDb21tYW5kKElXZWJTZXJ2aWNlQ2xpZW50IHdzYywgSUNvbnRleHQgY29udGV4dCwgU3RyaW5nIG1vZHVsZSkgewotCQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkJICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCQl3c2NfID0gd3NjOwotCQl9Ci0JCQotCSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQkgIHsKLQkgICAgCi0JICAJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsJCi0JCQotCQl3c2NfLmdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuc2V0SW1wbFVSTChwcm94eUJlYW5fKTsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCSAgfQotCi0JcHVibGljIHZvaWQgc2V0UHJveHlCZWFuKFN0cmluZyBwcm94eUJlYW4pIHsKLQkJdGhpcy5wcm94eUJlYW5fID0gcHJveHlCZWFuOwotCX0KLQkgIAotCQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQ29weUNsaWVudFdTRExDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9jb21tYW5kL0NvcHlDbGllbnRXU0RMQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjE5YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQ29weUNsaWVudFdTRExDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29weUNsaWVudFdTRExDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfQ09QWV9DTElFTlRfV1NETCI7Ci0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfQ09QWV9DTElFTlRfV1NETCI7Ci0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsgIAotICBwcml2YXRlIFN0cmluZyB3c2RsVVJMXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50V1NETFBhdGhOYW1lXzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3c1BhcnNlcl87Ci0gIAotICBwdWJsaWMgQ29weUNsaWVudFdTRExDb21tYW5kKCkKLSAgewotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgRGVmaW5pdGlvbiBkZWYgPSB3c1BhcnNlcl8uZ2V0V1NETERlZmluaXRpb24od3NkbFVSTF8pOwotICAgIGlmKGRlZj09bnVsbCkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKHBsdWdpbklkXywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XU0RMX05PX0RFRklOSVRJT04iLG5ldyBTdHJpbmdbXXt3c2RsVVJMX30pLFN0YXR1cy5FUlJPUik7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBJUGF0aCBjbGllbnRXU0RMUGF0aCA9IG5ldyBQYXRoKGNsaWVudFdTRExQYXRoTmFtZV8pOwotICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBGaWxlUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCk7Ci0gICAgc3RhdHVzID0gcmVzb2x2ZVdTREwod29ya3NwYWNlUm9vdCwgZGVmLCBjbGllbnRXU0RMUGF0aCxlbnYpOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotCXByaXZhdGUgU3RhdHVzIHJlc29sdmVXU0RMKAotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2UsCi0JCURlZmluaXRpb24gd3NkbERlZiwKLQkJSVBhdGggd3NkbFBhdGgsCi0JCUVudmlyb25tZW50IGVudikgewotCQl0cnkgewotCQkJd3JpdGVXU0RMRmlsZSh3b3Jrc3BhY2UsIHdzZGxEZWYsIHdzZGxQYXRoLCBlbnYpOwotCQkJTWFwIGltcG9ydERlZnMgPSB3c2RsRGVmLmdldEltcG9ydHMoKTsKLQkJCVNldCBrZXlzU2V0ID0gaW1wb3J0RGVmcy5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgZSA9IGtleXNTZXQuaXRlcmF0b3IoKTsgZS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleU5hbWUgPSBlLm5leHQoKTsKLQkJCQlWZWN0b3IgdmVjdG9yID0gKFZlY3RvcikgaW1wb3J0RGVmcy5nZXQoa2V5TmFtZSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3Iuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSW1wb3J0IGltcG9ydERlZiA9IChJbXBvcnQpIHZlY3Rvci5nZXQoaSk7Ci0JCQkJCURlZmluaXRpb24gZGVmID0gaW1wb3J0RGVmLmdldERlZmluaXRpb24oKTsKLQkJCQkJU3RyaW5nIG5ld1BhdGhTdHJpbmcgPQotCQkJCQkJd3NkbFBhdGgudG9TdHJpbmcoKS5zdWJzdHJpbmcoCi0JCQkJCQkJMCwKLQkJCQkJCQl3c2RsUGF0aC50b1N0cmluZygpLmxhc3RJbmRleE9mKCIvIikgKyAxKTsJIC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGlzSW52YWxpZEltcG9ydFdTREwoaW1wb3J0RGVmLmdldExvY2F0aW9uVVJJKCkpKSB7Ci0JCQkJCSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhwbHVnaW5JZF8sIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU1QT1JUX1dTREwiLG5ldyBTdHJpbmdbXXtpbXBvcnREZWYuZ2V0TG9jYXRpb25VUkkoKX0pLCBTdGF0dXMuRVJST1IpOwotCQkJCQl9Ci0JCQkJCUlQYXRoIG5ld1BhdGggPQotCQkJCQkJbmV3IFBhdGgobmV3UGF0aFN0cmluZyArIGltcG9ydERlZi5nZXRMb2NhdGlvblVSSSgpKTsKLQkJCQkJU3RhdHVzIHN0YXR1cyA9IHJlc29sdmVXU0RMKHdvcmtzcGFjZSwgZGVmLCBuZXdQYXRoLCBlbnYpOwotCQkJCQlpZiAoc3RhdHVzICE9IG51bGwKLQkJCQkJCSYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgewotCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKHBsdWdpbklkXywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XUklURV9XU0RMIixuZXcgU3RyaW5nW10geyB3c2RsUGF0aC50b1N0cmluZygpIH0pLCBTdGF0dXMuRVJST1IsIGUpOwotCQl9Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnZhbGlkSW1wb3J0V1NETChTdHJpbmcgd3NkbFBhdGgpIHsKLQotCQkvLyByZWxhdGl2ZSB1cmwKLQkJaWYgKCF3c2RsUGF0aC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICh3c2RsUGF0aC5pbmRleE9mKCIvIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICghd3NkbFBhdGguc3RhcnRzV2l0aCgiLi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVXU0RMRmlsZSgKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlLAotCQlEZWZpbml0aW9uIHdzZGxEZWYsCi0JCUlQYXRoIHdzZGxQYXRoLAotCQlFbnZpcm9ubWVudCBlbnYpCi0JCXRocm93cyBFeGNlcHRpb24gewotCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkvL1dTRExGYWN0b3J5IHdzZGxGYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJLy9XU0RMV3JpdGVyIHdzZGxXcml0ZXIgPSB3c2RsRmFjdG9yeS5uZXdXU0RMV3JpdGVyKCk7Ci0JCVdTRExXcml0ZXIgd3NkbFdyaXRlciA9IChuZXcgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGouV1NETEZhY3RvcnlJbXBsKCkpLm5ld1dTRExXcml0ZXIoKTsKLQkJd3NkbFdyaXRlci53cml0ZVdTREwod3NkbERlZiwgYmFvcyk7Ci0JCWJ5dGVbXSBiID0gYmFvcy50b0J5dGVBcnJheSgpOwotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpOwotCi0JCVJlc291cmNlQ29udGV4dCBjb250ZXh0ID0KLQkJCVdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZUNvbnRleHQoKTsKLQkJRmlsZVJlc291cmNlVXRpbHMuY3JlYXRlRmlsZSgKLQkJCWNvbnRleHQsCi0JCQl3c2RsUGF0aC5tYWtlQWJzb2x1dGUoKSwKLQkJCWJhaXMsCi0JCQllbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksCi0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpKTsKLQotCQliYW9zLmNsb3NlKCk7Ci0JCWJhaXMuY2xvc2UoKTsKLQotCX0gIAotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBjbGllbnRXU0RMUGF0aE5hbWVfIFRoZSBjbGllbnRXU0RMUGF0aE5hbWVfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFdTRExQYXRoTmFtZShTdHJpbmcgY2xpZW50V1NETFBhdGhOYW1lKQotICB7Ci0gICAgdGhpcy5jbGllbnRXU0RMUGF0aE5hbWVfID0gY2xpZW50V1NETFBhdGhOYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gd3NkbFVSTF8gVGhlIHdzZGxVUkxfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkwoU3RyaW5nIHdzZGxVUkwpCi0gIHsKLSAgICB0aGlzLndzZGxVUkxfID0gd3NkbFVSTDsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHdzUGFyc2VyXyBUaGUgd3NQYXJzZXJfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53c1BhcnNlcl8gPSB3c1BhcnNlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9EZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9EZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ5NjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnV0aWwuUGxhdGZvcm1VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm94eVByb2plY3RfOwotCXByaXZhdGUgU3RyaW5nIFdTRExTZXJ2aWNlVVJMXzsKLQlwcml2YXRlIFN0cmluZyBXU0RMU2VydmljZVBhdGhuYW1lXzsKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgY29yZU1zZ1V0aWxzXzsKLQkKLQlwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0NMSUVOVF9KQVZBX1dTRExfREVGQVVMVFMiOwotCXByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19DTElFTlRfSkFWQV9XU0RMX0RFRkFVTFRTIjsKLQotCXB1YmxpYyBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZCgpIHsKLQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkgICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsJCQotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuCi0JICovCi0JcHVibGljIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kKAotCQlKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtLAotCQlNb2RlbCBtb2RlbCkgewotCQkvL3N1cGVyKCk7Ci0JCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQkgICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlTdGF0dXMgc3RhdHVzOwotCQlpZiAoamF2YVdTRExQYXJhbV8gPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0JCQkJCWNvcmVNc2dVdGlsc18uZ2V0TWVzc2FnZSgKLQkJCQkiTVNHX0VSUk9SX0pBVkFfV1NETF9QQVJBTV9OT1RfU0VUIiksCi0JCQkJU3RhdHVzLkVSUk9SKTsKLQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCWphdmFXU0RMUGFyYW1fLnNldE1ldGFJbmZPbmx5KGZhbHNlKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0U2VydmVyU2lkZShKYXZhV1NETFBhcmFtZXRlci5TRVJWRVJfU0lERV9OT05FKTsKLQkJCi0JCUlQYXRoIHdlYk1vZHVsZVNlcnZlclJvb3QgPSBSZXNvdXJjZVV0aWxzLmdldEphdmFTb3VyY2VMb2NhdGlvbihwcm94eVByb2plY3RfKTsKLQkJLy9TdHJpbmcgb3V0cHV0ID0gUGxhdGZvcm1VdGlscy5nZXRQbGF0Zm9ybVVSTCh3ZWJNb2R1bGVTZXJ2ZXJSb290KTsKLQkJU3RyaW5nIG91dHB1dCA9CVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHdlYk1vZHVsZVNlcnZlclJvb3QpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQotCQlqYXZhV1NETFBhcmFtXy5zZXRKYXZhT3V0cHV0KG91dHB1dCk7Ci0KLQotCQlJQ29udGFpbmVyIHdlYk1vZHVsZUNvbnRhaW5lciA9IFJlc291cmNlVXRpbHMuZ2V0V2ViTW9kdWxlU2VydmVyUm9vdChwcm94eVByb2plY3RfKTsKLQkJaWYgKHdlYk1vZHVsZUNvbnRhaW5lciAhPW51bGwpCi0JCXsKLQkJICBJUGF0aCB3ZWJNb2R1bGVQYXRoID0gd2ViTW9kdWxlQ29udGFpbmVyLmdldEZ1bGxQYXRoKCk7Ci0JCSAgLy9vdXRwdXQgPSAgUGxhdGZvcm1VdGlscy5nZXRQbGF0Zm9ybVVSTCh3ZWJNb2R1bGVQYXRoKTsKLQkJICBvdXRwdXQgPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSh3ZWJNb2R1bGVQYXRoKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCSAgamF2YVdTRExQYXJhbV8uc2V0T3V0cHV0KG91dHB1dCk7Ci0JCX0KLQotCi0JCWlmIChXU0RMU2VydmljZVBhdGhuYW1lXyA9PSBudWxsKSB7Ci0JCQkKLQkJCWlmIChXU0RMU2VydmljZVVSTF8gPT0gbnVsbCkgewotCQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkRlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoCi0JCQkJCSJNU0dfRVJST1JfV1NETF9MT0NBVElPTl9OT1RfU0VUIiksCi0JCQkJCVN0YXR1cy5FUlJPUik7Ci0JCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVdTRExTZXJ2aWNlVVJMXyA9IFBsYXRmb3JtVXRpbHMuZ2V0RmlsZUZyb21QbGF0Zm9ybShXU0RMU2VydmljZVBhdGhuYW1lXyk7Ci0JCX0KLQotCQlqYXZhV1NETFBhcmFtXy5zZXRJbnB1dFdzZGxMb2NhdGlvbihXU0RMU2VydmljZVVSTF8pOwotCi0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGphdmFXU0RMUGFyYW0uCi0JICogQHJldHVybiBKYXZhV1NETFBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkgewotCQlyZXR1cm4gamF2YVdTRExQYXJhbV87Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLQkgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkJdGhpcy5qYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3h5UHJvamVjdF8gVGhlIHByb3h5UHJvamVjdF8gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3h5UHJvamVjdChJUHJvamVjdCBwcm94eVByb2plY3QpIHsKLQkJdGhpcy5wcm94eVByb2plY3RfID0gcHJveHlQcm9qZWN0OwotCX0KLQkvKioKLQkgKiBAcGFyYW0gc2VydmljZVVSTF8gVGhlIHdTRExTZXJ2aWNlVVJMXyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0V1NETFNlcnZpY2VVUkwoU3RyaW5nIHNlcnZpY2VVUkwpIHsKLQkJV1NETFNlcnZpY2VVUkxfID0gc2VydmljZVVSTDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNlcnZpY2VQYXRobmFtZV8gVGhlIHdTRExTZXJ2aWNlUGF0aG5hbWVfIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXU0RMU2VydmljZVBhdGhuYW1lKFN0cmluZyBzZXJ2aWNlUGF0aG5hbWUpIHsKLQkJV1NETFNlcnZpY2VQYXRobmFtZV8gPSBzZXJ2aWNlUGF0aG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVDb21tYW5kTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVDb21tYW5kTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmU1NmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFQ29tbWFuZE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuZW52OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSjJFRUNvbW1hbmRNYW5hZ2VyIGltcGxlbWVudHMgQ29tbWFuZE1hbmFnZXIKLXsKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmRNYW5hZ2VyI2lzVW5kb0VuYWJsZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotcHVibGljIERhdGFNYXBwaW5nUmVnaXN0cnkgZ2V0TWFwcGluZ1JlZ2lzdHJ5KCkgewotCXJldHVybiBudWxsOwotfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFRW52aXJvbm1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiNzJhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9lbnYvSjJFRUVudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5lbnY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkphdmFDb21waWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlNpbXBsZVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSUZhY3Rvcnk7Ci0KLQotLyoqCi0qCi0qLwotcHVibGljIGNsYXNzIEoyRUVFbnZpcm9ubWVudCBpbXBsZW1lbnRzIEVudmlyb25tZW50Ci17Ci0gIEoyRUVMb2cgajJlZUxvZ187Ci0gIEoyRUVQcm9ncmVzc01vbml0b3IgajJlZVByb2dyZXNzTW9uaXRvcl87Ci0gIEoyRUVTdGF0dXNIYW5kbGVyIGoyZWVTdGF0dXNIYW5kbGVyXzsKLSAgU2ltcGxlVVJJRmFjdG9yeSBzaW1wbGVVUklGYWN0b3J5XzsKLSAgSjJFRUNvbW1hbmRNYW5hZ2VyIGoyZWVDb21tYW5kTWFuYWdlcl87Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldExvZygpCi0gICAqLwotICBwdWJsaWMgTG9nIGdldExvZygpCi0gIHsKLSAgICBpZiAoajJlZUxvZ18gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBqMmVlTG9nXyA9IG5ldyBKMkVFTG9nKCk7Ci0gICAgfQotICAgIHJldHVybiBqMmVlTG9nXzsKLSAgICAKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldFByb2dyZXNzTW9uaXRvcigpCi0gICAqLwotICBwdWJsaWMgUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpCi0gIHsKLSAgICBpZiAoajJlZVByb2dyZXNzTW9uaXRvcl89PW51bGwpCi0gICAgewotICAgICAgajJlZVByb2dyZXNzTW9uaXRvcl8gPSBuZXcgSjJFRVByb2dyZXNzTW9uaXRvcigpOwotICAgICAgCi0gICAgfQotICAgIHJldHVybiBqMmVlUHJvZ3Jlc3NNb25pdG9yXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRTdGF0dXNIYW5kbGVyKCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXNIYW5kbGVyIGdldFN0YXR1c0hhbmRsZXIoKQotICB7Ci0gICAgaWYgKGoyZWVTdGF0dXNIYW5kbGVyXz09bnVsbCkKLSAgICB7Ci0gICAgICBqMmVlU3RhdHVzSGFuZGxlcl8gPSBuZXcgSjJFRVN0YXR1c0hhbmRsZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGoyZWVTdGF0dXNIYW5kbGVyXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRVUklGYWN0b3J5KCkKLSAgICovCi0gIHB1YmxpYyBVUklGYWN0b3J5IGdldFVSSUZhY3RvcnkoKQotICB7Ci0gICAgaWYgKHNpbXBsZVVSSUZhY3RvcnlfID09IG51bGwpCi0gICAgeyAKLSAgICAgIHNpbXBsZVVSSUZhY3RvcnlfID0gbmV3IFNpbXBsZVVSSUZhY3RvcnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNpbXBsZVVSSUZhY3RvcnlfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldEphdmFDb21waWxlcigpCi0gICAqLwotICBwdWJsaWMgSmF2YUNvbXBpbGVyIGdldEphdmFDb21waWxlcigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRDb21tYW5kTWFuYWdlcigpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZE1hbmFnZXIgZ2V0Q29tbWFuZE1hbmFnZXIoKQotICB7Ci0gICAgaWYoajJlZUNvbW1hbmRNYW5hZ2VyXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGoyZWVDb21tYW5kTWFuYWdlcl8gPSBuZXcgSjJFRUNvbW1hbmRNYW5hZ2VyKCk7IAotICAgIH0KLSAgICByZXR1cm4gajJlZUNvbW1hbmRNYW5hZ2VyXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVMb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5N2Q2YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVMb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuZW52OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSoKLSovCi1wdWJsaWMgY2xhc3MgSjJFRUxvZyBpbXBsZW1lbnRzIExvZwotewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjaXNFbmFibGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nI2lzRW5hYmxlZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChTdHJpbmcgb3B0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwKLQkJCVN0YXR1cyBzdGF0dXMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwKLQkJCVRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwKLQkJCVN0cmluZyBtZXRob2QsIE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwKLQkJCVN0cmluZyBtZXRob2QsIFN0YXR1cyBzdGF0dXMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwKLQkJCVN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFUHJvZ3Jlc3NNb25pdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9lbnYvSjJFRVByb2dyZXNzTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjFhOGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmVudjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogQGF1dGhvciByc2luaGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFUHJvZ3Jlc3NNb25pdG9yIGltcGxlbWVudHMgUHJvZ3Jlc3NNb25pdG9yCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yI3JlcG9ydChqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0KFN0cmluZyBwcm9ncmVzcykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvciNnZXRDaGlsZFByb2dyZXNzTW9uaXRvcigpCi0gICAqLwotICBwdWJsaWMgUHJvZ3Jlc3NNb25pdG9yIGdldENoaWxkUHJvZ3Jlc3NNb25pdG9yKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvciNpc0NhbmNlbFJlcXVlc3RlZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbFJlcXVlc3RlZCgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9lbnYvSjJFRVN0YXR1c0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmE5YzljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5lbnY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEoyRUVTdGF0dXNIYW5kbGVyIGltcGxlbWVudHMgU3RhdHVzSGFuZGxlcgotewotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5DaG9pY2VbXSkKLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgcmVwb3J0KFN0YXR1cyBzdGF0dXMsIENob2ljZVtdIGNob2ljZXMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0KFN0YXR1cyBzdGF0dXMpIHRocm93cyBTdGF0dXNFeGNlcHRpb24KLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydEluZm8ob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEluZm8oU3RhdHVzIHN0YXR1cykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTJiOTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkucGx1Z2luOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgcGx1Z2luLgotKiA8cD4KLSogVGhpcyBwbHVnaW4gY29udGFpbnMgdGhlIGdyYXBoaWMgdXNlciBpbnRlcmZhY2UgdG8gdGhlCi0qIFdlYiBTZXJ2aWNlcyBydW50aW1lIGZvdW5kIGluIG9yZy5lY2xpcHNlLmpzdC53cy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUF4aXNDb25zdW1wdGlvblVJUGx1Z2luIGV4dGVuZHMgUGx1Z2luCi17Ci0KLQkvKioKLQkqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgcGx1Z2luIGluIHBsdWdpbi54bWwuCi0JKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9Ci0JCSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0KLQkvKioKLQkqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkqLwotCXByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbiBpbnN0YW5jZV87Ci0JcHJpdmF0ZSBMb2cgbG9nXzsKLQotCS8qKgotCSogQ29uc3RydWN0cyBhIHJ1bnRpbWUgcGx1Z2luIG9iamVjdCBmb3IgdGhpcyBwbHVnaW4uCi0JKiBUaGUgInBsdWdpbiIgZWxlbWVudCBpbiBwbHVnaW4ueG1sIHNob3VsZCBpbmNsdWRlIHRoZSBhdHRyaWJ1dGUKLQkqIGNsYXNzID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbiIuCi0JKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbi4KLQkqLwotCXB1YmxpYyBXZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uVUlQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlzdXBlcihkZXNjcmlwdG9yKTsKLQkJaWYgKGluc3RhbmNlXyA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZV8gPSB0aGlzOwotCQl9Ci0JCWxvZ18gPSBuZXcgRWNsaXBzZUxvZygpOwotCi0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotCSogKFdlYlNlcnZpY2VXYXNDb25zdW1wdGlvblBsdWdpbilQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmpzdC53cy53YXMudjUudHAiKTsKLQkqIEByZXR1cm4gVGhlIFdlYlNlcnZpY2VXYXNDb25zdW1wdGlvblBsdWdpbiBzaW5nbGV0b24uCi0JKi8KLQlzdGF0aWMgcHVibGljIFdlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlXzsKLQl9Ci0KLQkvKioKLQkqIENhbGxlZCBvbmNlIGJ5IHRoZSBwbGF0Zm9ybSB3aGVuIHRoaXMgcGx1Z2luIGlzIGZpcnN0IGxvYWRlZC4KLQkqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBJZiB0aGlzIHBsdWdpbiBmYWlscyB0byBzdGFydC4KLQkqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxvZ18ubG9nKExvZy5JTkZPLCA1MDY2LCB0aGlzLCAic3RhcnR1cCIsICJTdGFydGluZyBwbHVnaW4gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiKTsKLQkJc3VwZXIuc3RhcnR1cCgpOwotCX0KLQotCS8qKgotCSogQ2FsbGVkIG9uY2UgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhpcyBwbHVnaW4gaXMgdW5sb2FkZWQuCi0JKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhpcyBwbHVnaW4gZmFpbHMgdG8gc2h1dGRvd24uCi0JKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9nXy5sb2coTG9nLklORk8sIDUwNjcsIHRoaXMsICJzaHV0ZG93biIsICJTaHV0dGluZyBwbHVnaW4gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiKTsKLQkJc3VwZXIuc2h1dGRvd24oKTsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0JKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLQkqIEBwYXJhbSBrZXkgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuCi0JKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotCSogd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotCSogZm9ybTogIktFWSA9IHZhbHVlIi4KLQkqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotCSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBpbnN0YW5jZV8uZ2V0RGVzY3JpcHRvcigpLmdldFJlc291cmNlU3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotCSogdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0JKiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotCSogYXJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBhcnJheSBvZiBzdWJzdGl0dXRpb24gb2JqZWN0cyAod2hpY2gKLQkqIGFyZSBtb3N0IGZyZXF1ZW50bHkgc3RyaW5ncykuIFNlZSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBmb3IKLQkqIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0JKiBAcGFyYW0ga2V5IFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLgotCSogVGhhdCBpcywgdGhlIHN0cmluZyBwYXNzZWQgaW4gbXVzdCBiZSBvZiB0aGUgZm9ybSAiJUtFWSIKLQkqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLQkqIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0JKiBAcGFyYW0gYXJncyBUaGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UKLQkqIGFzIHJlcXVpcmVkIGJ5IHRoZSBtZXNzYWdlIGluIHBsdWdpbi5wcm9wZXJ0aWVzIGFuZAotCSogYnkgdGhlIHJ1bGVzIG9mIGNsYXNzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LgotCSogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSwgYXJncyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gUGxhdGZvcm0KLQkJCS5nZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKHRoaXMpCi0JCQkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKQotCQkJLnRvT1NTdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbkluc3RhbGxMb2NhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCkpLmdldEZpbGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzZlOWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2s7Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5JV2ViTmF0dXJlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkoyRUVXZWJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS5lY2xpcHNlLkVjbGlwc2VQcm9ncmVzc01vbml0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzayBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVhJU19SVU5USU1FX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5ydCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19KQVJTX1RPX1BST0pFQ1QiOwotCXByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfSkFSU19UT19QUk9KRUNUIjsKLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0XzsKLQlwcml2YXRlIElDbGFzc3BhdGhFbnRyeVtdIG9sZENsYXNzcGF0aF87Ci0JcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGhfOwotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBib29sZWFuIGlzSjJFRV8xMyA9IHRydWU7Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCQotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCXB1YmxpYyBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzaygpCi0gIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLQkJbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0JCXNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCXNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQl9Ci0KLQkvKioKLQkqIEV4ZWN1dGUgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2sKLQkqLwotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQl0cnkgewotCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpKSB7Ci0JCQkJSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViTmF0dXJlUnVudGltZSA9Ci0JCQkJCShKMkVFV2ViTmF0dXJlUnVudGltZSkgcHJvamVjdC5nZXROYXR1cmUoCi0JCQkJCQlJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKTsKLQkJCQlpc0oyRUVfMTMgPSB3ZWJOYXR1cmVSdW50aW1lLmlzSjJFRTFfMygpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCQlpZiAoIWlzSjJFRV8xMykKLQkJewotCQkvLwlBZGRKYXIocHJvamVjdCwgbnVsbCwgIlhFUkNFU19BUElfSkFSIiwgc3RhdHVzLCBlbnZpcm9ubWVudCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgQWRkSmFyKElQcm9qZWN0IHdlYlByb2plY3QsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGphck5hbWUsIFN0YXR1cyBzdGF0dXMsIEVudmlyb25tZW50IGVudikgIHsKLQkgICAvLwotCSAgIC8vIEdldCB0aGUgY3VycmVudCBjbGFzc3BhdGguCi0JICAgLy8KLQkgICBqYXZhUHJvamVjdF8gPSBudWxsOwotCSAgIG9sZENsYXNzcGF0aF8gPSBudWxsOwotCSAgIHRyeQotCSAgIHsgICAgCi0JCSBqYXZhUHJvamVjdF8gPSBKYXZhQ29yZS5jcmVhdGUod2ViUHJvamVjdCk7ICAgIAotCQkgaWYgKGphdmFQcm9qZWN0XyAhPSBudWxsKQotCQkgewotCQkgICBvbGRDbGFzc3BhdGhfID0gamF2YVByb2plY3RfLmdldFJhd0NsYXNzcGF0aCgpOwotCQkgfQotCQkgZWxzZQotCQkgewotCQkgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX1dBUk5fTk9fSkFWQV9OQVRVUkUiKSwgU3RhdHVzLkVSUk9SKTsJCi0JCSAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICAgcmV0dXJuOwotCQkgfQotCSAgIH0KLQkgICBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpCi0JICAgewotCQkgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX1dBUk5fTk9fSkFWQV9OQVRVUkUiKSwgU3RhdHVzLkVSUk9SKTsKLQkJICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICByZXR1cm47CSAgIAkKLQkgICB9Ci0KLQkgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JICAgZm9yIChpbnQgaT0wOyBpPG9sZENsYXNzcGF0aF8ubGVuZ3RoOyBpKyspCi0JICAgewotCQkgZm91bmQgPSBmb3VuZCB8fCBvbGRDbGFzc3BhdGhfW2ldLmdldFBhdGgoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoamFyTmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkgICB9Ci0KLQkgICBpZiAoZm91bmQpIAotCSAgIHsKLQkJIHJldHVybjsKLQkgICB9Ci0KLQkgICBuZXdDbGFzc3BhdGhfID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRDbGFzc3BhdGhfLmxlbmd0aCArIDFdOwotCSAgIGludCBpPTA7Ci0JICAgd2hpbGUgKGk8b2xkQ2xhc3NwYXRoXy5sZW5ndGgpCi0JICAgewotCQkgbmV3Q2xhc3NwYXRoX1tpXSA9IG9sZENsYXNzcGF0aF9baV07Ci0JCSBpKys7Ci0JICAgfQotCi0JICAgdHJ5Ci0JICAgewotCQkgaWYocGx1Z2luSWQhPW51bGwpCi0JCSB7Ci0JCSAgIG5ld0NsYXNzcGF0aF9baSsrXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShnZXRUaGVKYXJQYXRoKHBsdWdpbklkLGphck5hbWUpLCBudWxsLCBudWxsKTsKLQkJIH0KLQkJIGVsc2UKLQkJIHsKLQkJICAgbmV3Q2xhc3NwYXRoX1tpKytdID0gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShnZXRUaGVKYXJQYXRoKHBsdWdpbklkLGphck5hbWUpLCBudWxsLCBudWxsKTsKLQkJIH0KLQkgICB9Ci0JICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkgICB7Ci0JCSBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0JBRF9CVUlMRFBBVEgiKSwgU3RhdHVzLldBUk5JTkcsIGUpOwotCQkgdHJ5Ci0JCSB7Ci0JCSAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzKTsKLQkJIH0KLQkJIGNhdGNoKFN0YXR1c0V4Y2VwdGlvbiBzZSkKLQkJIHsKLQkJIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCJVc2VyIGFib3J0ZWQiLFN0YXR1cy5FUlJPUik7Ci0JCSB9Ci0JCSByZXR1cm47Ci0JICAgfQotCi0JICAgLy8KLQkgICAvLyBUaGVuIHVwZGF0ZSB0aGUgcHJvamVjdCBjbGFzc3BhdGguCi0JICAgLy8KLQkgICB0cnkKLQkgICB7Ci0JICAgCSBQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGVudi5nZXRQcm9ncmVzc01vbml0b3IoKTsKLQkgICAJIElQcm9ncmVzc01vbml0b3IgZWNsaXBzZU1vbml0b3IgPSBudWxsOwotCSAgIAkgaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKQotCSAgIAkgewotCSAgIAkgCWVjbGlwc2VNb25pdG9yID0gKChFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKW1vbml0b3IpLmdldE1vbml0b3IoKTsKLQkgICAJIH0KLQkJIGphdmFQcm9qZWN0Xy5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoXyxlY2xpcHNlTW9uaXRvcik7Ci0JICAgfQotCSAgIGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkKLQkgICB7Ci0JCSBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0JBRF9CVUlMRFBBVEgiKSwgU3RhdHVzLldBUk5JTkcsIGUpOwotCQkgdHJ5Ci0JCSB7Ci0JCSAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzKTsJCi0JCSB9Ci0JCSBjYXRjaChTdGF0dXNFeGNlcHRpb24gc2UpCi0JCSB7Ci0JCSAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgIlVzZXIgYWJvcnRlZCIsIFN0YXR1cy5FUlJPUik7Ci0JCSB9Ci0JCSByZXR1cm47Ci0JICAgfQotCSB9Ci0KLQkvLwotCS8vIFJldHVybnMgdGhlIGxvY2FsIG5hdGl2ZSBwYXRobmFtZSBvZiB0aGUgamFyLgotCS8vCi0JcHJpdmF0ZSBJUGF0aCBnZXRUaGVKYXJQYXRoKFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIHRoZUphcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKHBsdWdpbklkICE9IG51bGwpIHsKLQkJCQlJUGx1Z2luUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotCQkJCUlQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPQotCQkJCQlwbHVnaW5SZWdpc3RyeS5nZXRQbHVnaW5EZXNjcmlwdG9yKHBsdWdpbklkKTsKLQkJCQlVUkwgbG9jYWxVUkwgPQotCQkJCQlQbGF0Zm9ybS5hc0xvY2FsVVJMKAotCQkJCQkJbmV3IFVSTChwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKSwgdGhlSmFyKSk7Ci0JCQkJcmV0dXJuIG5ldyBQYXRoKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgUGF0aCh0aGVKYXIpOwotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMoCi0JCQkJCUlTdGF0dXMuV0FSTklORywKLQkJCQkJV2ViU2VydmljZUF4aXNDb25zdW1wdGlvblVJUGx1Z2luLklELAotCQkJCQkwLAotCQkJCQltc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0JBRF9BWElTX0pBUl9VUkwiKSwKLQkJCQkJZSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQluZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cygKLQkJCQkJSVN0YXR1cy5XQVJOSU5HLAotCQkJCQlXZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uVUlQbHVnaW4uSUQsCi0JCQkJCTAsCi0JCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfQkFEX0FYSVNfSkFSX1VSTCIpLAotCQkJCQllKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0JewotCSAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL0NoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzlhMDcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklXZWJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSjJFRVdlYk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0JCi0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIGNvcmVNc2dVdGlsc187Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0OwotICAgIAotICBwdWJsaWMgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzaygpCi0gIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZSgiQ0hFQ0tfV1NfRERfVEFTS19ERVNDUklQVElPTiIpKTsKLSAgICBzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJDSEVDS19XU19ERF9UQVNLX0xBQkVMIikpOyAgICAgICAgCi0gIH0KLQkKLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotCQlpZihFbnZpcm9ubWVudFV0aWxzLmdldFJlc291cmNlQ29udGV4dChlbnYpLmlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkpIHsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQlJUGF0aCBmaWxlUGF0aCA9IG51bGw7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IHNlcnZlclByb2plY3Q7Ci0gICAgZmlsZVBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCkpIHsKLSAgICAgICAgSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViUHJvamVjdCA9IChKMkVFV2ViTmF0dXJlUnVudGltZSkgcHJvamVjdC5nZXROYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCk7Ci0gICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGguYXBwZW5kKHdlYlByb2plY3QuZ2V0V0VCSU5GUGF0aCgpKTsKLSAgICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aC5hcHBlbmQoIi9zZXJ2ZXItY29uZmlnLndzZGQiKTsKLSAgICAgIH0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0RFRkFVTFRfQkVBTiIpLCBTdGF0dXMuRVJST1IsIGUpOwotCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCWlmKGZpbGVQYXRoPT1udWxsIHx8IGZpbGVQYXRoLmlzRW1wdHkoKSkKLQkJewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgY29yZU1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSkFWQV9XU0RMX1BBUkFNX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SKTsKLQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXM7CQkJCi0JCX0KLQotCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgIUVudmlyb25tZW50VXRpbHMuZ2V0UmVzb3VyY2VDb250ZXh0KGVudikuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSkgICB7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1hNTF9GSUxFX09WRVJXUklURV9ESVNBQkxFRCIpLCBTdGF0dXMuV0FSTklORyk7Ci0JCQl0cnkKLQkJCXsKLQkJCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwotCQkJfQotCQkJY2F0Y2goU3RhdHVzRXhjZXB0aW9uIHNlKQotCQkJewotCQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsICJVc2VyIGFib3J0ZWQiLFN0YXR1cy5FUlJPUik7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KElQcm9qZWN0IHNlcnZlclByb2plY3QpCi0JewotCSAgdGhpcy5zZXJ2ZXJQcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL0NvcHlBeGlzSmFyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9Db3B5QXhpc0phckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzN2IxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL0NvcHlBeGlzSmFyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzazsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBDb3B5QXhpc0phckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBBWElTX1JVTlRJTUVfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUuYXhpcyI7IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfQ09QWV9KQVJTX1RPX1BST0pFQ1QiOwotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0NPUFlfSkFSU19UT19QUk9KRUNUIjsKLQotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIGJhc2VDb25Nc2dVdGlsc187Ci0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgcHJpdmF0ZSBCb29sZWFuIHByb2plY3RSZXN0YXJ0UmVxdWlyZWRfID0gQm9vbGVhbi5GQUxTRTsKLQotICAvKioKLSAgICogRGVmYXVsdCBDVE9SOwotICAgKi8KLSAgcHVibGljIENvcHlBeGlzSmFyQ29tbWFuZCgpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIGJhc2VDb25Nc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKS5yZXBvcnQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlBST0dSRVNTX0lORk9fQ09QWV9BWElTX0NGRyIpKTsKLSAgICBjb3B5QXhpc0phcnNUb1Byb2plY3QocHJvamVjdCwgc3RhdHVzLCBlbnYpOwotICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjb3B5QXhpc0phcnNUb1Byb2plY3QoSVByb2plY3QgcHJvamVjdCwgU3RhdHVzIHN0YXR1cywgRW52aXJvbm1lbnQgZW52KSB7Ci0vLyAgICBJUGF0aCB3ZWJNb2R1bGVQYXRoID0gUmVzb3VyY2VVdGlscy5nZXRXZWJNb2R1bGVTZXJ2ZXJSb290KHByb2plY3QpLmdldEZ1bGxQYXRoKCk7Ci0JSVBhdGggd2ViTW9kdWxlUGF0aCA9IEoyRUVVdGlscy5nZXRGaXJzdFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotICAgIGlmICh3ZWJNb2R1bGVQYXRoID09IG51bGwpIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIGJhc2VDb25Nc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BST0pFQ1RfTk9UX0ZPVU5EIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29weUlGaWxlKCJsaWIvYXhpcy5qYXIiLCAvLyROT04tTkxTLTEkCi0gICAgICAgIHdlYk1vZHVsZVBhdGgsICJXRUItSU5GL2xpYi9heGlzLmphciIsIHN0YXR1cywgZW52KTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICByZXR1cm47Ci0gICAgY29weUlGaWxlKCJsaWIvbG9nNGotMS4yLjguamFyIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICB3ZWJNb2R1bGVQYXRoLCAiV0VCLUlORi9saWIvbG9nNGotMS4yLjguamFyIiwgc3RhdHVzLCBlbnYpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgIHJldHVybjsKLSAgICBjb3B5SUZpbGUoImxpYi9jb21tb25zLWRpc2NvdmVyeS5qYXIiLCAvLyROT04tTkxTLTEkCi0gICAgICAgIHdlYk1vZHVsZVBhdGgsICJXRUItSU5GL2xpYi9jb21tb25zLWRpc2NvdmVyeS5qYXIiLCBzdGF0dXMsIGVudik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgcmV0dXJuOwotICAgIGNvcHlJRmlsZSgibGliL2NvbW1vbnMtbG9nZ2luZy5qYXIiLCAvLyROT04tTkxTLTEkCi0gICAgICAgIHdlYk1vZHVsZVBhdGgsICJXRUItSU5GL2xpYi9jb21tb25zLWxvZ2dpbmcuamFyIiwgc3RhdHVzLCBlbnYpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgIHJldHVybjsKLSAgICBjb3B5SUZpbGUoImxpYi9zYWFqLmphciIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2ViTW9kdWxlUGF0aCwgIldFQi1JTkYvbGliL3NhYWouamFyIiwgc3RhdHVzLCBlbnYpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgIHJldHVybjsKLSAgICBjb3B5SUZpbGUoImxpYi9qYXhycGMuamFyIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICB3ZWJNb2R1bGVQYXRoLCAiV0VCLUlORi9saWIvamF4cnBjLmphciIsIHN0YXR1cywgZW52KTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICByZXR1cm47Ci0gICAgY29weUlGaWxlKCJsaWIvd3NkbDRqLmphciIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2ViTW9kdWxlUGF0aCwgIldFQi1JTkYvbGliL3dzZGw0ai5qYXIiLCBzdGF0dXMsIGVudik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgcmV0dXJuOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8qKgotICAgKiAgCi0gICAqLwotICBwcml2YXRlIHZvaWQgY29weUlGaWxlKFN0cmluZyBzb3VyY2UsIElQYXRoIHRhcmdldFBhdGgsIFN0cmluZyB0YXJnZXRGaWxlLCBTdGF0dXMgc3RhdHVzLCBFbnZpcm9ubWVudCBlbnYpIHsKLSAgICBJUGF0aCB0YXJnZXQgPSB0YXJnZXRQYXRoLmFwcGVuZChuZXcgUGF0aCh0YXJnZXRGaWxlKSk7Ci0gICAgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLnJlcG9ydChiYXNlQ29uTXNnVXRpbHNfLmdldE1lc3NhZ2UoIlBST0dSRVNTX0lORk9fQ09QWUlOR19GSUxFIikpOwotCi0gICAgdHJ5IHsKLSAgICAgIFJlc291cmNlQ29udGV4dCBjb250ZXh0ID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotICAgICAgY29udGV4dC5zZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICBjb250ZXh0LnNldENyZWF0ZUZvbGRlcnNFbmFibGVkKHRydWUpOwotICAgICAgY29udGV4dC5zZXRDaGVja291dEZpbGVzRW5hYmxlZCh0cnVlKTsKLSAgICAgIElQbHVnaW5SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0gICAgICBJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gcGx1Z2luUmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcihBWElTX1JVTlRJTUVfUExVR0lOX0lEKTsKLSAgICAgIFBsdWdpbiBheGlzcnRfcGx1Z2luID0gcGx1Z2luRGVzY3JpcHRvci5nZXRQbHVnaW4oKTsKLSAgICAgIElGaWxlIHJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0RmlsZSh0YXJnZXQpOwotICAgICAgaWYgKCFyZXNvdXJjZS5leGlzdHMoKSkgewotICAgICAgICBJRmlsZSBmaWxlID0gRmlsZVJlc291cmNlVXRpbHMuY3JlYXRlRmlsZShjb250ZXh0LCB0YXJnZXQsIGF4aXNydF9wbHVnaW4ub3BlblN0cmVhbShuZXcgUGF0aChzb3VyY2UpKSwgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLCBlbnYKLSAgICAgICAgICAgIC5nZXRTdGF0dXNIYW5kbGVyKCkpOwotICAgICAgICBpZiAocHJvamVjdFJlc3RhcnRSZXF1aXJlZF8uYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UgJiYgZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgIHByb2plY3RSZXN0YXJ0UmVxdWlyZWRfID0gQm9vbGVhbi5UUlVFOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIElGaWxlIGZpbGUgPSBGaWxlUmVzb3VyY2VVdGlscy5jcmVhdGVGaWxlKGNvbnRleHQsIHRhcmdldCwgYXhpc3J0X3BsdWdpbi5vcGVuU3RyZWFtKG5ldyBQYXRoKHNvdXJjZSkpLCBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIGVudgotICAgICAgICAgIC5nZXRTdGF0dXNIYW5kbGVyKCkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfRklMRUNPUFkiKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRQcm9qZWN0UmVzdGFydFJlcXVpcmVkKCkgewotICAgIHJldHVybiBwcm9qZWN0UmVzdGFydFJlcXVpcmVkXy5ib29sZWFuVmFsdWUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9EZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL0RlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0MjYxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL0RlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbC5EaWFsb2dXV1dBdXRoZW50aWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFNlcnZpY2VVUkw7Ci0gIHByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbTsKLSAgcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQotICBwdWJsaWMgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5EZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZCIpOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgLy9XZWJTZXJ2aWNlRWxlbWVudCB3c2UgPSBXZWJTZXJ2aWNlRWxlbWVudC5nZXRXZWJTZXJ2aWNlRWxlbWVudChtb2RlbCk7Ci0gICAgLy9zZXRXZWJTZXJ2aWNlc1BhcnNlcigoV2ViU2VydmljZXNQYXJzZXIpd3NlLmdldFdTUGFyc2VyKCkpOwotICAgIC8vc2V0V3NkbFNlcnZpY2VVUkwod3NlLmdldFdTRExTZXJ2aWNlVVJMKCkpOwotICAgIC8vaWYgKHdzZGxTZXJ2aWNlVVJMID09IG51bGwgfHwgd3NkbFNlcnZpY2VVUkwubGVuZ3RoKCkgPD0gMCkKLSAgICAvLyAgc2V0V3NkbFNlcnZpY2VVUkwoKG5ldyBVdGlscygpKS50b0ZpbGVTeXN0ZW1VUkkod3NlLmdldFdTRExTZXJ2aWNlUGF0aG5hbWUoKSkpOwotICAgIAotICAgIGlmICh3c2RsU2VydmljZVVSTCAhPSBudWxsICYmIHdzZGxTZXJ2aWNlVVJMLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBpZiAod2ViU2VydmljZXNQYXJzZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd2ViU2VydmljZXNQYXJzZXIgPSBuZXcgV2ViU2VydmljZXNQYXJzZXJFeHQoKTsKLSAgICAgICAgLy93c2Uuc2V0V1NQYXJzZXIod2ViU2VydmljZXNQYXJzZXIpOwotICAgICAgfQotICAgICAgV2ViU2VydmljZUVudGl0eSB3c0VudGl0eSA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh3c2RsU2VydmljZVVSTCk7Ci0gICAgICBpZiAod3NFbnRpdHkgPT0gbnVsbCB8fCAhd3NFbnRpdHkuaXNFbnRpdHlSZXNvbHZlZCgpKQotICAgICAgewotICAgICAgICB3ZWJTZXJ2aWNlc1BhcnNlci5zZXRVUkkod3NkbFNlcnZpY2VVUkwpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHdlYlNlcnZpY2VzUGFyc2VyLnBhcnNlKFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX05PTkUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB3d3dhZSkKLSAgICAgICAgewotICAgICAgICAgIERpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uIGRpYWxvZyA9IG5ldyBEaWFsb2dXV1dBdXRoZW50aWNhdGlvbihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotICAgICAgICAgIGRpYWxvZy5oYW5kbGVXV1dBdXRoZW50aWNhdGlvbih3d3dhZSk7Ci0gICAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gZGlhbG9nLmdldFVzZXJuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gZGlhbG9nLmdldFBhc3N3b3JkKCk7Ci0gICAgICAgICAgaWYgKHVzZXJuYW1lICE9IG51bGwgJiYgcGFzc3dvcmQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3ZWJTZXJ2aWNlc1BhcnNlci5zZXRIVFRQQmFzaWNBdXRoVXNlcm5hbWUodXNlcm5hbWUpOwotICAgICAgICAgICAgd2ViU2VydmljZXNQYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKHBhc3N3b3JkKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB3ZWJTZXJ2aWNlc1BhcnNlci5wYXJzZShXZWJTZXJ2aWNlc1BhcnNlci5QQVJTRV9OT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdlYlNlcnZpY2VzUGFyc2VyLnNldEhUVFBCYXNpY0F1dGhVc2VybmFtZShudWxsKTsKLSAgICAgICAgICAgIHdlYlNlcnZpY2VzUGFyc2VyLnNldEhUVFBCYXNpY0F1dGhQYXNzd29yZChudWxsKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgd3NFbnRpdHkgPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkod3NkbFNlcnZpY2VVUkwpOwotICAgICAgfQotICAgICAgaWYgKHdzRW50aXR5ICE9IG51bGwgJiYgd3NFbnRpdHkuZ2V0VHlwZSgpID09IFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0RMKQotICAgICAgewotICAgICAgICBTdHJpbmcgaHR0cFVzZXJuYW1lID0gd3NFbnRpdHkuZ2V0SFRUUFVzZXJuYW1lKCk7Ci0gICAgICAgIFN0cmluZyBodHRwUGFzc3dvcmQgPSB3c0VudGl0eS5nZXRIVFRQUGFzc3dvcmQoKTsKLSAgICAgICAgaWYgKGh0dHBVc2VybmFtZSAhPSBudWxsICYmIGh0dHBQYXNzd29yZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgamF2YVdTRExQYXJhbS5zZXRIVFRQVXNlcm5hbWUoaHR0cFVzZXJuYW1lKTsKLSAgICAgICAgICBqYXZhV1NETFBhcmFtLnNldEhUVFBQYXNzd29yZChodHRwUGFzc3dvcmQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGphdmFXU0RMUGFyYW0gVGhlIGphdmFXU0RMUGFyYW0gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0gICAgdGhpcy5qYXZhV1NETFBhcmFtID0gamF2YVdTRExQYXJhbTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKE1vZGVsIG1vZGVsKSB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2RsU2VydmljZVVSTCBUaGUgd3NkbFNlcnZpY2VVUkwgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbFNlcnZpY2VVUkwoU3RyaW5nIHdzZGxTZXJ2aWNlVVJMKSB7Ci0gICAgdGhpcy53c2RsU2VydmljZVVSTCA9IHdzZGxTZXJ2aWNlVVJMOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbS4KLSAgICovCi0gIHB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkgewotICAgIHJldHVybiBqYXZhV1NETFBhcmFtOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZXNQYXJzZXIuCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKSB7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlc1BhcnNlciBUaGUgd2ViU2VydmljZXNQYXJzZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpIHsKLSAgICB0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9SZWZyZXNoUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svUmVmcmVzaFByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMDg4MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9SZWZyZXNoUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzazsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZWZyZXNoUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfUkVGRVNIX1BST0pFQ1QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfUkVGRVNIX1BST0pFQ1QiOwotCQotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLQlwdWJsaWMgUmVmcmVzaFByb2plY3RDb21tYW5kKCkKLQl7Ci0JCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS5wbHVnaW4iLCB0aGlzICk7Ci0JCXNldE5hbWUoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCBMQUJFTCApICk7Ci0JCXNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggREVTQ1JJUFRJT04gKSk7Ci0JfQotCi0JLyoqCi0JKiBFeGVjdXRlIFJlZnJlc2hQcm9qZWN0VGFzawotCSovCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQl7Ci0JCXRyeQotCQl7Ci0JCQlpZiAocHJvamVjdCE9bnVsbCkKLQkJCXByb2plY3QucmVmcmVzaExvY2FsKElQcm9qZWN0LkRFUFRIX0lORklOSVRFLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQl7Ci0JCSAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUF4aXNDb25zdW1wdGlvblVJUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JFRlJFU0hfUFJPSkVDVCIpLCBTdGF0dXMuRVJST1IsIGUpOwotCQkgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICByZXR1cm4gc3RhdHVzOwotCQl9Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9TdHViMkJlYW5Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1N0dWIyQmVhbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3MzUwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1N0dWIyQmVhbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udXRpbC5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotCi1wdWJsaWMgY2xhc3MgU3R1YjJCZWFuQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZGlzY292ZXJlZFdzZGxQb3J0RWxlbWVudE5hbWU7Ci0gIHByaXZhdGUgVmVjdG9yIHBvcnRUeXBlc187Ci0gIHByaXZhdGUgU3RyaW5nIHByb3h5QmVhbl87Ci0gIAotICBwcml2YXRlIElQcm9qZWN0IGNsaWVudFByb2plY3RfOwotCi0gIHB1YmxpYyBTdHViMkJlYW5Db21tYW5kKCkKLSAgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3Mud2FzLmNyZWF0aW9uLnVpLnRhc2suU3R1YjJCZWFuQ29tbWFuZCIsICJvcmcuZWNsaXBzZS5qc3Qud3Mud2FzLmNyZWF0aW9uLnVpLnRhc2suU3R1YjJCZWFuQ29tbWFuZCIpOwotICAgIHBvcnRUeXBlc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgLy9zZXRSdW5JbldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgKiBFeGVjdXRlCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsgICAgICAgIAotICAgIFN0cmluZyBpbnB1dFdzZGxMb2NhdGlvbiA9IGphdmFXU0RMUGFyYW1fLmdldElucHV0V3NkbExvY2F0aW9uKCk7Ci0gICAgRGVmaW5pdGlvbiBkZWYgPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvbihpbnB1dFdzZGxMb2NhdGlvbik7Ci0gICAgLyoKLSAgICAqIEhhY2s6IEF4aXMgaXMgbm90IHVzaW5nIGEgcHJvcGVyIGphdmEubmV0LlVSTCBhcyBpdHMgaW5wdXRXc2RsTG9jYXRpb24uCi0gICAgKiBXZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gYSBwcm9wZXIgZmlsZSBVUkwuCi0gICAgKi8KLSAgICBpZiAoZGVmID09IG51bGwpCi0gICAgewotICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoaW5wdXRXc2RsTG9jYXRpb24pOwotICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZGVmID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24oZmlsZS50b1VSTCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBNYXAgcGtnMm5zTWFwcGluZyA9IGphdmFXU0RMUGFyYW1fLmdldE1hcHBpbmdzKCk7Ci0gICAgTWFwIHNlcnZpY2VzID0gZGVmLmdldFNlcnZpY2VzKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpaXQubmV4dCgpOwotICAgICAgU3RyaW5nIHNlcnZpY2VQa2dOYW1lID0gV1NETFV0aWxzLmdldFBhY2thZ2VOYW1lKHNlcnZpY2UsIHBrZzJuc01hcHBpbmcpOwotICAgICAgU3RyaW5nIHNlcnZpY2VDbGFzc05hbWUgPSBjb21wdXRlQ2xhc3NOYW1lKHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICBTdHJpbmcgam5kaU5hbWUgPSBzZXJ2aWNlQ2xhc3NOYW1lOwotICAgICAgTWFwIHBvcnRzID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdDIgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgaWYgKHNlcnZpY2VDbGFzc05hbWUuZXF1YWxzKGNvbXB1dGVDbGFzc05hbWUoKChQb3J0KWl0Mi5uZXh0KCkpLmdldEJpbmRpbmcoKS5nZXRQb3J0VHlwZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKSkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZpY2VDbGFzc05hbWUgPSBzZXJ2aWNlQ2xhc3NOYW1lICsgIl9TZXJ2aWNlIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9yIChJdGVyYXRvciBpdDIgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpaXQyLm5leHQoKTsKLSAgICAgICAgaWYgKGRpc2NvdmVyZWRXc2RsUG9ydEVsZW1lbnROYW1lICE9IG51bGwgJiYgIWRpc2NvdmVyZWRXc2RsUG9ydEVsZW1lbnROYW1lLmVxdWFscyhwb3J0LmdldE5hbWUoKSkpCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIFNPQVBBZGRyZXNzIHNvYXBBZGRyZXNzID0gbnVsbDsKLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0MyA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOyBpdDMuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXQzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc29hcEFkZHJlc3MgPSAoU09BUEFkZHJlc3Mpb2JqZWN0OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvYXBBZGRyZXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IHBvcnQuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCk7Ci0gICAgICAgICAgUU5hbWUgcG9ydFR5cGVRTmFtZSA9IHBvcnRUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIHBvcnRUeXBlSUQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgcG9ydFR5cGVJRC5hcHBlbmQocG9ydFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgcG9ydFR5cGVJRC5hcHBlbmQoIiMiKTsKLSAgICAgICAgICBwb3J0VHlwZUlELmFwcGVuZChwb3J0VHlwZVFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICBpZiAoIXBvcnRUeXBlc18uY29udGFpbnMocG9ydFR5cGVJRC50b1N0cmluZygpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwb3J0VHlwZXNfLmFkZChwb3J0VHlwZUlELnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgU3R1YjJCZWFuSW5mbyBzdHViMkJlYW5JbmZvID0gbmV3IFN0dWIyQmVhbkluZm8oKTsKLSAgICAgICAgICAgIHN0dWIyQmVhbkluZm8uc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0Xyk7Ci0gICAgICAgICAgICBTdHJpbmcgcG9ydFR5cGVQa2dOYW1lID0gV1NETFV0aWxzLmdldFBhY2thZ2VOYW1lKHBvcnRUeXBlLCBwa2cybnNNYXBwaW5nKTsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0VHlwZUNsYXNzTmFtZSA9IGNvbXB1dGVDbGFzc05hbWUocG9ydFR5cGVRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBzdHViMkJlYW5JbmZvLnNldFBhY2thZ2UocG9ydFR5cGVQa2dOYW1lKTsKLSAgICAgICAgICAgIHN0dWIyQmVhbkluZm8uc2V0Q2xhc3MocG9ydFR5cGVDbGFzc05hbWUgKyAiUHJveHkiKTsKLSAgICAgICAgICAgIHByb3h5QmVhbl8gPSBwb3J0VHlwZVBrZ05hbWUrIi4iK3BvcnRUeXBlQ2xhc3NOYW1lKyJQcm94eSI7Ci0gICAgICAgICAgICBpZiAoam5kaU5hbWUuZXF1YWxzKHBvcnRUeXBlQ2xhc3NOYW1lKSkKLSAgICAgICAgICAgICAgcG9ydFR5cGVDbGFzc05hbWUgPSBwb3J0VHlwZUNsYXNzTmFtZSArICJfUG9ydCI7Ci0gICAgICAgICAgICBzdHViMkJlYW5JbmZvLmFkZFNFSShwb3J0VHlwZVBrZ05hbWUsIHBvcnRUeXBlQ2xhc3NOYW1lLCBzZXJ2aWNlUGtnTmFtZSwgc2VydmljZUNsYXNzTmFtZSwgam5kaU5hbWUsIHBvcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIHN0dWIyQmVhbkluZm8ud3JpdGUoIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKSwgZW52LmdldFN0YXR1c0hhbmRsZXIoKSApOwotICAgICAgICAgICAgICBpZiAoZGlzY292ZXJlZFdzZGxQb3J0RWxlbWVudE5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkaXNjb3ZlcmVkIHBvcnQgd2FzIHByb2Nlc3NlZC4gSWdub3JlIGFsbCBvdGhlciBwb3J0cyBhbmQgc2VydmljZXMuCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIFVOREVSU0NPUkUgPSAnXyc7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgU3RyaW5nIGNsYXNzTmFtZUNvcHkgPSBjbGFzc05hbWU7Ci0gICAgaW50IGkgPSBjbGFzc05hbWVDb3B5LmluZGV4T2YoVU5ERVJTQ09SRSk7Ci0gICAgd2hpbGUgKGkgIT0gLTEpCi0gICAgewotICAgICAgY2hhciBjID0gY2xhc3NOYW1lQ29weS5jaGFyQXQoaSsxKTsKLSAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoYykpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKGNsYXNzTmFtZUNvcHkuc3Vic3RyaW5nKDAsIGkrMSkpOwotICAgICAgICBzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLSAgICAgICAgc2IuYXBwZW5kKGNsYXNzTmFtZUNvcHkuc3Vic3RyaW5nKGkrMiwgY2xhc3NOYW1lQ29weS5sZW5ndGgoKSkpOwotICAgICAgICBjbGFzc05hbWVDb3B5ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGkgPSBjbGFzc05hbWVDb3B5LmluZGV4T2YoVU5ERVJTQ09SRSwgaSsxKTsKLSAgICB9Ci0gICAgY2hhcltdIGNBcnJheSA9IG5ldyBjaGFyW2NsYXNzTmFtZUNvcHkubGVuZ3RoKCldOwotICAgIGJvb2xlYW4gZm91bmREaWdpdCA9IGZhbHNlOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgY0FycmF5Lmxlbmd0aDsgaisrKQotICAgIHsKLSAgICAgIGNoYXIgYyA9IGNsYXNzTmFtZUNvcHkuY2hhckF0KGopOwotICAgICAgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGMpKQotICAgICAgewotICAgICAgICBjQXJyYXlbal0gPSBjOwotICAgICAgICBmb3VuZERpZ2l0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKGZvdW5kRGlnaXQpCi0gICAgICAgICAgY0FycmF5W2pdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgY0FycmF5W2pdID0gYzsKLSAgICAgICAgZm91bmREaWdpdCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV3IFN0cmluZyhjQXJyYXkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbS4KLSAgKiBAcmV0dXJuIEphdmFXU0RMUGFyYW1ldGVyCi0gICovCi0gIHB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkKLSAgewotICAgIHJldHVybiBqYXZhV1NETFBhcmFtXzsKLSAgfQotCi0gIC8qKgotICAqIFNldHMgdGhlIGphdmFXU0RMUGFyYW0uCi0gICogQHBhcmFtIGphdmFXU0RMUGFyYW0gVGhlIGphdmFXU0RMUGFyYW0gdG8gc2V0Ci0gICovCi0gIHB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkKLSAgewotICAgIGphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlc1BhcnNlci4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpIHsKLSAgICByZXR1cm4gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdlYlNlcnZpY2VzUGFyc2VyIFRoZSB3ZWJTZXJ2aWNlc1BhcnNlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEBwYXJhbSBkaXNjb3ZlcmVkV3NkbFBvcnRFbGVtZW50TmFtZSBUaGUgZGlzY292ZXJlZFdzZGxQb3J0RWxlbWVudE5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGlzY292ZXJlZFdzZGxQb3J0RWxlbWVudE5hbWUoU3RyaW5nIGRpc2NvdmVyZWRXc2RsUG9ydEVsZW1lbnROYW1lKSB7Ci0gICAgdGhpcy5kaXNjb3ZlcmVkV3NkbFBvcnRFbGVtZW50TmFtZSA9IGRpc2NvdmVyZWRXc2RsUG9ydEVsZW1lbnROYW1lOwotICB9Ci0KLSAgLyoqCi0JKiBAcGFyYW0gY2xpZW50UHJvamVjdCBUaGUgY2xpZW50UHJvamVjdCB0byBzZXQuCi0JKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChJUHJvamVjdCBjbGllbnRQcm9qZWN0KSB7Ci0JCXRoaXMuY2xpZW50UHJvamVjdF8gPSBjbGllbnRQcm9qZWN0OwotICB9Ci0JCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm94eUJlYW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm94eUJlYW4oKSB7Ci0JCXJldHVybiBwcm94eUJlYW5fOwotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1N0dWIyQmVhbkluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svU3R1YjJCZWFuSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDM3YzlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svU3R1YjJCZWFuSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFFTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5KYXZhUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgU3R1YjJCZWFuSW5mbwotewotICBwcml2YXRlIGZpbmFsIFN0cmluZyBORVdfTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICBwcml2YXRlIGludCBpbmRlbnRDb3VudDsKLQotICBwcml2YXRlIFN0cmluZyBwYWNrYWdlXzsKLSAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgaW1wb3J0c187Ci0gIHByaXZhdGUgU3RyaW5nQnVmZmVyIHNlaXNfOwotICBwcml2YXRlIFN0cmluZ0J1ZmZlciBzZXJ2aWNlc187Ci0gIHByaXZhdGUgU3RyaW5nQnVmZmVyIGpuZGlOYW1lc187Ci0gIHByaXZhdGUgU3RyaW5nQnVmZmVyIHBvcnRzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NfOwotICBwcml2YXRlIFZlY3RvciB1c2VkTmFtZXM7Ci0gIAotICBwcml2YXRlIElQcm9qZWN0IGNsaWVudFByb2plY3RfOwotCi0gIHB1YmxpYyBTdHViMkJlYW5JbmZvKCkKLSAgewotICAgIGluZGVudENvdW50ID0gMDsKLSAgICBwYWNrYWdlXyA9IG51bGw7Ci0gICAgaW1wb3J0c18gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgc2Vpc18gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgc2VydmljZXNfID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGpuZGlOYW1lc18gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgcG9ydHNfID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGNsYXNzXyA9ICJTRUlCZWFuIjsKLSAgICB1c2VkTmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0KElQcm9qZWN0IGNsaWVudFByb2plY3QpIHsKLSAgCXRoaXMuY2xpZW50UHJvamVjdF8gPSAgY2xpZW50UHJvamVjdDsKLSAgfQotICAKLQotICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlKFN0cmluZyBwa2dOYW1lKQotICB7Ci0gICAgaWYgKHBrZ05hbWUgIT0gbnVsbCAmJiBwa2dOYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgIHBhY2thZ2VfID0gbWFuZ2xlUGFja2FnZU5hbWUocGtnTmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRJbXBvcnRzKFN0cmluZyBwa2dOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgaW1wb3J0c18uYXBwZW5kKHRvRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUocGtnTmFtZSwgY2xhc3NOYW1lKSk7Ci0gICAgaW1wb3J0c18uYXBwZW5kKCI7Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRTRUkoU3RyaW5nIHNlaVBrZ05hbWUsIFN0cmluZyBzZWlDbGFzc05hbWUsIFN0cmluZyBzZXJ2aWNlUGtnTmFtZSwgU3RyaW5nIHNlcnZpY2VDbGFzc05hbWUsIFN0cmluZyBwb3J0TmFtZSkKLSAgewotICAgIGFkZFNFSShzZWlQa2dOYW1lLCBzZWlDbGFzc05hbWUsIHNlcnZpY2VQa2dOYW1lLCBzZXJ2aWNlQ2xhc3NOYW1lLCBzZXJ2aWNlQ2xhc3NOYW1lLCBwb3J0TmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRTRUkoU3RyaW5nIHNlaVBrZ05hbWUsIFN0cmluZyBzZWlDbGFzc05hbWUsIFN0cmluZyBzZXJ2aWNlUGtnTmFtZSwgU3RyaW5nIHNlcnZpY2VDbGFzc05hbWUsIFN0cmluZyBqbmRpTmFtZSwgU3RyaW5nIHBvcnROYW1lKQotICB7Ci0gICAgc2Vpc18uYXBwZW5kKHRvRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoc2VpUGtnTmFtZSwgc2VpQ2xhc3NOYW1lKSk7Ci0gICAgc2Vpc18uYXBwZW5kKCI7Iik7Ci0gICAgc2VydmljZXNfLmFwcGVuZCh0b0Z1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKHNlcnZpY2VQa2dOYW1lLCBzZXJ2aWNlQ2xhc3NOYW1lKSk7Ci0gICAgc2VydmljZXNfLmFwcGVuZCgiOyIpOwotICAgIGpuZGlOYW1lc18uYXBwZW5kKGpuZGlOYW1lKTsKLSAgICBqbmRpTmFtZXNfLmFwcGVuZCgiOyIpOwotICAgIHBvcnRzXy5hcHBlbmQocG9ydE5hbWUpOwotICAgIHBvcnRzXy5hcHBlbmQoIjsiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzKFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgIGNsYXNzXyA9IG1hbmdsZUNsYXNzTmFtZShjbGFzc05hbWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgdG9GdWxseVF1YWxpZmllZENsYXNzTmFtZShTdHJpbmcgcGtnTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBzYi5hcHBlbmQobWFuZ2xlUGFja2FnZU5hbWUocGtnTmFtZSkpOwotICAgIHNiLmFwcGVuZCgiLiIpOwotICAgIHNiLmFwcGVuZChtYW5nbGVDbGFzc05hbWUoY2xhc3NOYW1lKSk7Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgcW5hbWUpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBxbmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHJldHVybiBxbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBxbmFtZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgcW5hbWUpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBxbmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHJldHVybiBxbmFtZS5zdWJzdHJpbmcoaW5kZXgrMSwgcW5hbWUubGVuZ3RoKCkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBxbmFtZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIG1hbmdsZVBhY2thZ2VOYW1lKFN0cmluZyBzKQotICB7Ci0gICAgcmV0dXJuIHJlcGxhY2VJbnZhbGlkSmF2YUNoYXJzKHMpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgbWFuZ2xlQ2xhc3NOYW1lKFN0cmluZyBzKQotICB7Ci0gICAgcyA9IGZpcnN0Q2hhclRvVXBwZXJDYXNlKFdTRExVdGlscy5yZXNvbHZlRG90SW5Qb3J0TmFtZShzKSk7Ci0gICAgcmV0dXJuIHJlcGxhY2VJbnZhbGlkSmF2YUNoYXJzKHMpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZUludmFsaWRKYXZhQ2hhcnMoU3RyaW5nIHMpCi0gIHsKLSAgICBjaGFyW10gYyA9IHMudG9DaGFyQXJyYXkoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY1tpXSkpCi0gICAgICAgIGNbaV0gPSAnLic7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU3RyaW5nKGMpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZmlyc3RDaGFyVG9VcHBlckNhc2UoU3RyaW5nIHMpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgc2IuYXBwZW5kKHMuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkpOwotICAgIHNiLmFwcGVuZChzLnN1YnN0cmluZygxLCBzLmxlbmd0aCgpKSk7Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBmaXJzdENoYXJUb0xvd2VyQ2FzZShTdHJpbmcgcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBzYi5hcHBlbmQocy5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSk7Ci0gICAgc2IuYXBwZW5kKHMuc3Vic3RyaW5nKDEsIHMubGVuZ3RoKCkpKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHRyaW1BcnJheVN5bWJvbChTdHJpbmcgcykKLSAgewotICAgIGludCBpbmRleCA9IHMuaW5kZXhPZigiWyIpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHJldHVybiBzLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHM7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoSmF2YUhlbHBlcnMgamF2YUhlbHBlcnMpCi0gIHsKLSAgICBpZiAoamF2YUhlbHBlcnMuaXNQcmltaXRpdmUoKSkKLSAgICAgIHJldHVybiBqYXZhSGVscGVycy5nZXRKYXZhTmFtZSgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBqYXZhSGVscGVycy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZShQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBTdGF0dXNIYW5kbGVyIHN0YXR1c01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigyMDQ4KTsKLSAgICB3cml0ZVBhY2thZ2Uoc3cpOwotICAgIHdyaXRlSW1wb3J0cyhzdyk7Ci0gICAgd3JpdGVDbGFzcyhzdyk7Ci0gICAgc3cuY2xvc2UoKTsKLSAgICBieXRlW10gYnl0ZXMgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpLmdldEJ5dGVzKCk7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChwYWNrYWdlXyAhPSBudWxsICYmIHBhY2thZ2VfLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBzYi5hcHBlbmQocGFja2FnZV8pOwotICAgICAgc2IuYXBwZW5kKCIuIik7Ci0gICAgfQotICAgIHNiLmFwcGVuZChjbGFzc18pOwotICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzYi50b1N0cmluZygpLnJlcGxhY2UoJy4nLCAnLycpKTsKLSAgICBzYi5hcHBlbmQoIi5qYXZhIik7Ci0vLyAgICBXZWJTZXJ2aWNlRWxlbWVudCB3c2UgPSBXZWJTZXJ2aWNlRWxlbWVudC5nZXRXZWJTZXJ2aWNlRWxlbWVudChtb2RlbF8pOwotLy8gICAgSVByb2plY3QgY2xpZW50UHJvamVjdCA9IHdzZS5nZXRQcm94eVByb2plY3QoKTsKLSAgICBKYXZhRU1GTmF0dXJlIGphdmFNT0YgPSAoSmF2YUVNRk5hdHVyZSlKYXZhRU1GTmF0dXJlLmNyZWF0ZVJ1bnRpbWUoY2xpZW50UHJvamVjdF8pOwotICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgIEZpbGVSZXNvdXJjZVV0aWxzLmNyZWF0ZUZpbGUoV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlQ29udGV4dCgpLCBKYXZhUHJvamVjdFV0aWxpdGllcy5nZXRTb3VyY2VGb2xkZXJPckZpcnN0KGphdmFNT0YuZ2V0UHJvamVjdCgpLCBudWxsKS5nZXRGaWxlKG5ldyBQYXRoKHNiLnRvU3RyaW5nKCkpKS5nZXRGdWxsUGF0aCgpLCBiYWlzLCBwcm9ncmVzc01vbml0b3IsIHN0YXR1c01vbml0b3IpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlUGFja2FnZShXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAocGFja2FnZV8gIT0gbnVsbCAmJiBwYWNrYWdlXy5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgdy53cml0ZSgicGFja2FnZSAiKTsKLSAgICAgIHcud3JpdGUocGFja2FnZV8pOwotICAgICAgdy53cml0ZSgiOyIpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVJbXBvcnRzKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW1wb3J0c18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIHcud3JpdGUoImltcG9ydCAiKTsKLSAgICAgIHcud3JpdGUoc3QubmV4dFRva2VuKCkpOwotICAgICAgdy53cml0ZSgiOyIpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVDbGFzcyhXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoInB1YmxpYyBjbGFzcyAiKTsKLSAgICB3LndyaXRlKGNsYXNzXyk7Ci0gICAgdy53cml0ZSgiICIpOwotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2Vpc18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICBpZiAoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgdy53cml0ZSgiaW1wbGVtZW50cyAiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIHcud3JpdGUoc3QubmV4dFRva2VuKCkpOwotICAgICAgaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgdy53cml0ZSgiLCAiKTsKLSAgICB9Ci0gICAgdy53cml0ZSgiIHsiKTsKLSAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHdyaXRlRmllbGRzRGVjbGFyYXRpb25zKHcpOwotICAgIHdyaXRlQ29uc3RydWN0b3Iodyk7Ci0gICAgd3JpdGVJbml0KHcpOwotICAgIC8qCi0gICAgKiBDYW5ub3QgdXNlIEpOREkgbG9va3VwIGZvciBBWElTCi0gICAgKgotICAgIHdyaXRlVXNlSk5ESSh3KTsKLSAgICAqLwotICAgIHdyaXRlR2V0U2V0RW5kcG9pbnQodyk7Ci0gICAgd3JpdGVTRUlHZXR0ZXJzKHcpOwotICAgIHdyaXRlU0VJTWV0aG9kcyh3KTsKLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIn0iKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZUZpZWxkc0RlY2xhcmF0aW9ucyhXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvKgotICAgICogQ2Fubm90IHVzZSBKTkRJIGxvb2t1cCBmb3IgQVhJUwotICAgICoKLSAgICB3LndyaXRlKCJwcml2YXRlIGJvb2xlYW4gX3VzZUpOREkgPSB0cnVlOyIpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgKi8KLSAgICB3LndyaXRlKCJwcml2YXRlIFN0cmluZyBfZW5kcG9pbnQgPSBudWxsOyIpOwotICAgIHVzZWROYW1lcy5hZGQoIl9lbmRwb2ludCIpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWlzXy50b1N0cmluZygpLCAiOyIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgdy53cml0ZSgicHJpdmF0ZSAiKTsKLSAgICAgIFN0cmluZyBzZWkgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIHcud3JpdGUoc2VpKTsKLSAgICAgIHcud3JpdGUoIiAiKTsKLSAgICAgIFN0cmluZyBzdHViTmFtZSA9IGZpcnN0Q2hhclRvTG93ZXJDYXNlKGdldENsYXNzTmFtZShzZWkpKTsKLSAgICAgIHcud3JpdGUoc3R1Yk5hbWUpOwotICAgICAgdXNlZE5hbWVzLmFkZChzdHViTmFtZSk7Ci0gICAgICB3LndyaXRlKCIgPSBudWxsOyIpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVDb25zdHJ1Y3RvcihXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoInB1YmxpYyAiKTsKLSAgICB3LndyaXRlKGNsYXNzXyk7Ci0gICAgdy53cml0ZSgiKCkgeyIpOwotICAgIGluY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgiX2luaXQiKTsKLSAgICB3LndyaXRlKGNsYXNzXyk7Ci0gICAgdy53cml0ZSgiKCk7Iik7Ci0gICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJ9Iik7Ci0gICAgbmV3TGluZSh3KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZUluaXQoV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJwcml2YXRlIHZvaWQgX2luaXQiKTsKLSAgICB3LndyaXRlKGNsYXNzXyk7Ci0gICAgdy53cml0ZSgiKCkgeyIpOwotICAgIGluY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgidHJ5IHsiKTsKLSAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIC8qCi0gICAgKiBDYW5ub3QgdXNlIEpOREkgbG9va3VwIGZvciBBWElTCi0gICAgKgotICAgIHcud3JpdGUoImlmIChfdXNlSk5ESSkgeyIpOwotICAgIGluY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgKi8KLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlaXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHNlcnZpY2VUb2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlcnZpY2VzXy50b1N0cmluZygpLCAiOyIpOwotICAgIFN0cmluZ1Rva2VuaXplciBqbmRpTmFtZVRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoam5kaU5hbWVzXy50b1N0cmluZygpLCAiOyIpOwotICAgIFN0cmluZ1Rva2VuaXplciBwb3J0VG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihwb3J0c18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICAvKgotICAgIGlmIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgdy53cml0ZSgiamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0IGN0eCA9IG5ldyBqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHQoKTsiKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgfQotICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgdy53cml0ZShmaXJzdENoYXJUb0xvd2VyQ2FzZShnZXRDbGFzc05hbWUoc3QubmV4dFRva2VuKCkpKSk7Ci0gICAgICB3LndyaXRlKCIgPSAoKCIpOwotICAgICAgdy53cml0ZShzZXJ2aWNlVG9rZW5zLm5leHRUb2tlbigpKTsKLSAgICAgIHcud3JpdGUoIiljdHgubG9va3VwKFwiamF2YTpjb21wL2Vudi9zZXJ2aWNlLyIpOwotICAgICAgdy53cml0ZShqbmRpTmFtZVRva2Vucy5uZXh0VG9rZW4oKSk7Ci0gICAgICB3LndyaXRlKCJcIikpLmdldCIpOwotICAgICAgdy53cml0ZShtYW5nbGVDbGFzc05hbWUocG9ydFRva2Vucy5uZXh0VG9rZW4oKSkpOwotICAgICAgdy53cml0ZSgiKCk7Iik7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgIH0KLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIn0iKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoImVsc2UgeyIpOwotICAgIGluY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlaXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgc2VydmljZVRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2VydmljZXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgcG9ydFRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocG9ydHNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgKi8KLSAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWlOYW1lID0gZmlyc3RDaGFyVG9Mb3dlckNhc2UoZ2V0Q2xhc3NOYW1lKHN0Lm5leHRUb2tlbigpKSk7Ci0gICAgICB3LndyaXRlKHNlaU5hbWUpOwotICAgICAgdy53cml0ZSgiID0gKG5ldyAiKTsKLSAgICAgIHcud3JpdGUoc2VydmljZVRva2Vucy5uZXh0VG9rZW4oKSk7Ci0gICAgICB3LndyaXRlKCJMb2NhdG9yKCkpLmdldCIpOwotICAgICAgdy53cml0ZShyZXBsYWNlSW52YWxpZEphdmFDaGFycyhXU0RMVXRpbHMucmVzb2x2ZURvdEluUG9ydE5hbWUocG9ydFRva2Vucy5uZXh0VG9rZW4oKSkpKTsKLSAgICAgIHcud3JpdGUoIigpOyIpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICAgIHcud3JpdGUoImlmICgiKTsKLSAgICAgIHcud3JpdGUoc2VpTmFtZSk7Ci0gICAgICB3LndyaXRlKCIgIT0gbnVsbCkgeyIpOwotICAgICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgICAgdy53cml0ZSgiaWYgKF9lbmRwb2ludCAhPSBudWxsKSIpOwotICAgICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgICAgdy53cml0ZSgiKChqYXZheC54bWwucnBjLlN0dWIpIik7Ci0gICAgICB3LndyaXRlKHNlaU5hbWUpOwotICAgICAgdy53cml0ZSgiKS5fc2V0UHJvcGVydHkoXCJqYXZheC54bWwucnBjLnNlcnZpY2UuZW5kcG9pbnQuYWRkcmVzc1wiLCBfZW5kcG9pbnQpOyIpOwotICAgICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgICAgdy53cml0ZSgiZWxzZSIpOwotICAgICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgICAgdy53cml0ZSgiX2VuZHBvaW50ID0gKFN0cmluZykoKGphdmF4LnhtbC5ycGMuU3R1YikiKTsKLSAgICAgIHcud3JpdGUoc2VpTmFtZSk7Ci0gICAgICB3LndyaXRlKCIpLl9nZXRQcm9wZXJ0eShcImphdmF4LnhtbC5ycGMuc2VydmljZS5lbmRwb2ludC5hZGRyZXNzXCIpOyIpOwotICAgICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgICB3LndyaXRlKCJ9Iik7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgIH0KLSAgICAvKgotICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgifSIpOwotICAgICovCi0gICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJ9Iik7Ci0gICAgbmV3TGluZSh3KTsKLSAgICAvKgotICAgIHcud3JpdGUoImNhdGNoIChqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uIG5hbWluZ0V4Y2VwdGlvbikge30iKTsKLSAgICBuZXdMaW5lKHcpOwotICAgICovCi0gICAgdy53cml0ZSgiY2F0Y2ggKGphdmF4LnhtbC5ycGMuU2VydmljZUV4Y2VwdGlvbiBzZXJ2aWNlRXhjZXB0aW9uKSB7fSIpOwotICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgifSIpOwotICAgIG5ld0xpbmUodyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVTZXRQcm9wZXJ0eUVuZHBvaW50KFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2Vpc18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWlOYW1lID0gZmlyc3RDaGFyVG9Mb3dlckNhc2UoZ2V0Q2xhc3NOYW1lKHN0Lm5leHRUb2tlbigpKSk7Ci0gICAgICB3LndyaXRlKCJpZiAoIik7Ci0gICAgICB3LndyaXRlKHNlaU5hbWUpOwotICAgICAgdy53cml0ZSgiICE9IG51bGwpIik7Ci0gICAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgICB3LndyaXRlKCIoKGphdmF4LnhtbC5ycGMuU3R1YikiKTsKLSAgICAgIHcud3JpdGUoc2VpTmFtZSk7Ci0gICAgICB3LndyaXRlKCIpLl9zZXRQcm9wZXJ0eShcImphdmF4LnhtbC5ycGMuc2VydmljZS5lbmRwb2ludC5hZGRyZXNzXCIsIF9lbmRwb2ludCk7Iik7Ci0gICAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlVXNlSk5ESShXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoInB1YmxpYyB2b2lkIHVzZUpOREkoYm9vbGVhbiB1c2VKTkRJKSB7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJfdXNlSk5ESSA9IHVzZUpOREk7Iik7Ci0gICAgbmV3TGluZSh3KTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlaXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB3LndyaXRlKGZpcnN0Q2hhclRvTG93ZXJDYXNlKGdldENsYXNzTmFtZShzdC5uZXh0VG9rZW4oKSkpKTsKLSAgICAgIHcud3JpdGUoIiA9IG51bGw7Iik7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgIH0KLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIn0iKTsKLSAgICBuZXdMaW5lKHcpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlU0VJR2V0dGVycyhXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlaXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VpID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICBTdHJpbmcgc2VpQ2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKHNlaSk7Ci0gICAgICBTdHJpbmcgc2VpRmllbGROYW1lID0gZmlyc3RDaGFyVG9Mb3dlckNhc2Uoc2VpQ2xhc3NOYW1lKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgICB3LndyaXRlKCJwdWJsaWMgIik7Ci0gICAgICB3LndyaXRlKHNlaSk7Ci0gICAgICB3LndyaXRlKCIgZ2V0Iik7Ci0gICAgICB3LndyaXRlKHNlaUNsYXNzTmFtZSk7Ci0gICAgICB3LndyaXRlKCIoKSB7Iik7Ci0gICAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgICB3LndyaXRlKCJpZiAoIik7Ci0gICAgICB3LndyaXRlKHNlaUZpZWxkTmFtZSk7Ci0gICAgICB3LndyaXRlKCIgPT0gbnVsbCkiKTsKLSAgICAgIGluY3JlbWVudEluZGVudCgpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICAgIHcud3JpdGUoIl9pbml0Iik7Ci0gICAgICB3LndyaXRlKGNsYXNzXyk7Ci0gICAgICB3LndyaXRlKCIoKTsiKTsKLSAgICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICAgIHcud3JpdGUoInJldHVybiAiKTsKLSAgICAgIHcud3JpdGUoc2VpRmllbGROYW1lKTsKLSAgICAgIHcud3JpdGUoIjsiKTsKLSAgICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICAgIHcud3JpdGUoIn0iKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlU0VJTWV0aG9kcyhXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBuZXdMaW5lKHcpOwotICAgIC8vV2ViU2VydmljZUVsZW1lbnQgd3NlID0gV2ViU2VydmljZUVsZW1lbnQuZ2V0V2ViU2VydmljZUVsZW1lbnQobW9kZWxfKTsKLSAgICBpZiAoY2xpZW50UHJvamVjdF8gPT0gbnVsbCkgcmV0dXJuOy8vd3NlLmdldFByb3h5UHJvamVjdCgpOwotICAgIEphdmFFTUZOYXR1cmUgamF2YU1PRiA9IChKYXZhRU1GTmF0dXJlKUphdmFFTUZOYXR1cmUuY3JlYXRlUnVudGltZShjbGllbnRQcm9qZWN0Xyk7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWlzXy50b1N0cmluZygpLCAiOyIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgU3RyaW5nIHNlaSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpSmF2YUNsYXNzSW1wbC5yZWZsZWN0KGdldFBhY2thZ2VOYW1lKHNlaSksIGdldENsYXNzTmFtZShzZWkpLCBqYXZhTU9GLmdldFJlc291cmNlU2V0KCkpOwotICAgICAgaWYgKGphdmFDbGFzcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBMaXN0IG1ldGhvZHMgPSBqYXZhQ2xhc3MuZ2V0TWV0aG9kcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbWV0aG9kcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpaXQubmV4dCgpOwotICAgICAgICAgIGlmICghbWV0aG9kLmlzQ29uc3RydWN0b3IoKSAmJiAhbWV0aG9kLmlzTmF0aXZlKCkgJiYgbWV0aG9kLmdldEphdmFWaXNpYmlsaXR5KCkuZ2V0VmFsdWUoKSA9PSBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDKQotICAgICAgICAgICAgd3JpdGVTRUlNZXRob2RzKHcsIGphdmFDbGFzcywgbWV0aG9kKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZVNFSU1ldGhvZHMoV3JpdGVyIHcsIEphdmFDbGFzcyBqYXZhQ2xhc3MsIE1ldGhvZCBtZXRob2QpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgdy53cml0ZSgicHVibGljICIpOwotICAgIC8vIGlzVm9pZAotICAgIGlmIChtZXRob2QuaXNWb2lkKCkpCi0gICAgICB3LndyaXRlKCJ2b2lkICIpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICB3LndyaXRlKGdldEZ1bGx5UXVhbGlmaWVkTmFtZShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSk7Ci0gICAgICB3LndyaXRlKCIgIik7Ci0gICAgfQotICAgIC8vIG1ldGhvZCBuYW1lCi0gICAgdy53cml0ZShtZXRob2QuZ2V0TmFtZSgpKTsKLSAgICB3LndyaXRlKCIoIik7Ci0gICAgLy8gaW5wdXQgcGFyYW1ldGVycwotICAgIEphdmFQYXJhbWV0ZXJbXSBpbnB1dFBhcmFtcyA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0UGFyYW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpID4gMCkKLSAgICAgICAgdy53cml0ZSgiLCAiKTsKLSAgICAgIEphdmFIZWxwZXJzIGphdmFIZWxwZXJzID0gaW5wdXRQYXJhbXNbaV0uZ2V0SmF2YVR5cGUoKTsKLSAgICAgIHcud3JpdGUoZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGphdmFIZWxwZXJzKSk7Ci0gICAgICB3LndyaXRlKCIgIik7Ci0gICAgICBTdHJpbmcgcGFyYW1OYW1lID0gZ2V0Q2xhc3NOYW1lKGlucHV0UGFyYW1zW2ldLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICB3LndyaXRlKGdldFVudXNlZE5hbWUocGFyYW1OYW1lKSk7Ci0gICAgfQotICAgIHcud3JpdGUoIikiKTsKLSAgICAvLyBleGNlcHRpb25zCi0gICAgTGlzdCBleGNlcHRpb25zID0gbWV0aG9kLmdldEphdmFFeGNlcHRpb25zKCk7Ci0gICAgaWYgKCFleGNlcHRpb25zLmlzRW1wdHkoKSkKLSAgICAgIHcud3JpdGUoIiB0aHJvd3MgIik7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IGV4Y2VwdGlvbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBKYXZhQ2xhc3MgZXhjZXB0aW9uID0gKEphdmFDbGFzcylpdC5uZXh0KCk7Ci0gICAgICB3LndyaXRlKGV4Y2VwdGlvbi5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpKTsKLSAgICAgIGlmIChpdC5oYXNOZXh0KCkpCi0gICAgICAgIHcud3JpdGUoIiwgIik7Ci0gICAgfQotICAgIC8vIG1ldGhvZCBib2R5Ci0gICAgdy53cml0ZSgieyIpOwotICAgIGluY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgU3RyaW5nIHN0dWJOYW1lID0gZmlyc3RDaGFyVG9Mb3dlckNhc2UoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0gICAgdy53cml0ZSgiaWYgKCIpOwotICAgIHcud3JpdGUoc3R1Yk5hbWUpOwotICAgIHcud3JpdGUoIiA9PSBudWxsKSIpOwotICAgIGluY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgiX2luaXQiKTsKLSAgICB3LndyaXRlKGNsYXNzXyk7Ci0gICAgdy53cml0ZSgiKCk7Iik7Ci0gICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICBpZiAoIW1ldGhvZC5pc1ZvaWQoKSkKLSAgICAgIHcud3JpdGUoInJldHVybiAiKTsKLSAgICB3LndyaXRlKHN0dWJOYW1lKTsKLSAgICB3LndyaXRlKCIuIik7Ci0gICAgdy53cml0ZShtZXRob2QuZ2V0TmFtZSgpKTsKLSAgICB3LndyaXRlKCIoIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dFBhcmFtcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSA+IDApCi0gICAgICAgIHcud3JpdGUoIiwgIik7Ci0gICAgICBTdHJpbmcgcGFyYW1OYW1lID0gZ2V0Q2xhc3NOYW1lKGlucHV0UGFyYW1zW2ldLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICB3LndyaXRlKGdldFVudXNlZE5hbWUocGFyYW1OYW1lKSk7Ci0gICAgfQotICAgIHcud3JpdGUoIik7Iik7Ci0gICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJ9Iik7Ci0gICAgbmV3TGluZSh3KTsKLSAgICBuZXdMaW5lKHcpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlR2V0U2V0RW5kcG9pbnQoV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJwdWJsaWMgU3RyaW5nIGdldEVuZHBvaW50KCkgeyIpOwotICAgIGluY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgicmV0dXJuIF9lbmRwb2ludDsiKTsKLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIn0iKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgicHVibGljIHZvaWQgc2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50KSB7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJfZW5kcG9pbnQgPSBlbmRwb2ludDsiKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHdyaXRlU2V0UHJvcGVydHlFbmRwb2ludCh3KTsKLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIn0iKTsKLSAgICBuZXdMaW5lKHcpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhcmVudEZvbGRlcihJUmVzb3VyY2UgcmVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHBhcmVudCA9IHJlcy5nZXRQYXJlbnQoKTsKLSAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50ICE9IHJlcyAmJiBwYXJlbnQgaW5zdGFuY2VvZiBJRm9sZGVyKQotICAgIHsKLSAgICAgIElGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpcGFyZW50OwotICAgICAgaWYgKCFmb2xkZXIuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIGNyZWF0ZVBhcmVudEZvbGRlcihmb2xkZXIpOwotICAgICAgICBmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbmNyZW1lbnRJbmRlbnQoKQotICB7Ci0gICAgaW5kZW50Q291bnQrKzsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBkZWNyZW1lbnRJbmRlbnQoKQotICB7Ci0gICAgaW5kZW50Q291bnQtLTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbmRlbnQoV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRDb3VudDsgaSsrKQotICAgICAgdy53cml0ZSgiICAiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBuZXdMaW5lKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHcud3JpdGUoTkVXX0xJTkUpOwotICAgIGluZGVudCh3KTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW51c2VkTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGlmICh1c2VkTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld05hbWUgPSAobmV3IFN0cmluZ0J1ZmZlcihuYW1lKSkuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGkpKS50b1N0cmluZygpOwotICAgICAgICBpZiAoIXVzZWROYW1lcy5jb250YWlucyhuZXdOYW1lKSkKLSAgICAgICAgICByZXR1cm4gbmV3TmFtZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svVmFsaWRhdGVXU0RMQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9WYWxpZGF0ZVdTRExDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZDc3YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9WYWxpZGF0ZVdTRExDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzazsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLQotcHVibGljIGNsYXNzIFZhbGlkYXRlV1NETENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0KLSAgcHVibGljIFZhbGlkYXRlV1NETENvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suVmFsaWRhdGVXU0RMQ29tbWFuZCIsICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLlZhbGlkYXRlV1NETENvbW1hbmQiKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLQlNZXNzYWdlVXRpbHMgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpLnBsdWdpbiIsIHRoaXMgKTsKLQkKLSAgICBpZiAod3NkbFVSSSAhPSBudWxsICYmIHdzZGxVUkkubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkkpOwotICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IG51bVNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnNpemUoKTsKLSAgICAgICAgaWYgKG51bVNlcnZpY2VzIDwgMSkKLSAgICAgICAgewotICAgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dTRExfSEFTX05PX1NFUlZJQ0VfRUxFTUVOVCIsIG5ldyBPYmplY3RbXSB7d3NkbFVSSX0pLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gd3NkbFVSSSBUaGUgd3NkbFVSSSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gd2ViU2VydmljZXNQYXJzZXIgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc0NsaWVudENvbW1hbmRzRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc0NsaWVudENvbW1hbmRzRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2OTM0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNDbGllbnRDb21tYW5kc0ZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuV1NETDJKYXZhQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kLkRlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5Db3B5QXhpc0phckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5EZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suUmVmcmVzaFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suU3R1YjJCZWFuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLlZhbGlkYXRlV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkJ1aWxkUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQXhpc0NsaWVudENvbW1hbmRzRnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBib29sZWFuIGdlblByb3h5XzsKLSAgCi0gIHB1YmxpYyBBeGlzQ2xpZW50Q29tbWFuZHNGcmFnbWVudCgpCi0gIHsKLSAgICBTZXF1ZW5jZUZyYWdtZW50IHJvb3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgIAotICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZCgpLCAiIikpOwotICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQ29weUF4aXNKYXJDb21tYW5kKCksICIiKSk7Ci0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzaygpLCAiIikpOwotICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQoKSwgIiIpKTsgCi0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBWYWxpZGF0ZVdTRExDb21tYW5kKCksICIiKSk7Ci0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBXU0RMMkphdmFDb21tYW5kKCksICIiKSk7IAotICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBTdHViMkJlYW5Db21tYW5kKCksICIiKSk7Ci0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBCdWlsZFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgCi0gICAgc2V0Q29uZGl0aW9uKCBuZXcgQ29uZGl0aW9uKCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlblByb3h5XzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KCByb290ICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoIGJvb2xlYW4gZ2VuUHJveHkgKQotICB7Ci0gICAgZ2VuUHJveHlfID0gZ2VuUHJveHk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc0NsaWVudEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNDbGllbnRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU3Mzk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc0NsaWVudEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5EZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQ29weUF4aXNKYXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLlJlZnJlc2hQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLlN0dWIyQmVhbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5WYWxpZGF0ZVdTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBBeGlzQ2xpZW50RnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50IAotewotCi0JcHVibGljIEF4aXNDbGllbnRGcmFnbWVudCgpIAotCXsKLQkJYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0JCWFkZChuZXcgU2ltcGxlRnJhZ21lbnQoIkF4aXNDbGllbnRTdGFydCIpKTsKLQkJYWRkKG5ldyBNYXBwaW5nRnJhZ21lbnQoKSk7Ci0JCWFkZChuZXcgQXhpc0NsaWVudENvbW1hbmRzRnJhZ21lbnQoKSk7Ci0JCS8vIFRPRE86IExvb2sgaW50byBBZGRXU0RMdG9XU0lMQ29tbWFuZCBmb3IgdGhlIGNsaWVudCBzY2VuYXJpbwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5KSAKLQl7Ci0JCS8vIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZAotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLAotCQkJCW5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRSdW50aW1lIiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UnVudGltZUlEIiwKLQkJCQludWxsKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RFQVIiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0JCQkJIkNsaWVudFByb2plY3RFQVIiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkwiLCBudWxsKTsgLy8gVVJJCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0bwotCQkvLyBVUkwKLQkJLy8gdHJhbnNmb3JtZXIKLQkJLy8gcmVxJ2Q/PwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFByb3h5U2VsZWN0ZWQiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0JCQkJIlRlc3RQcm94eVNlbGVjdGVkIiwgbnVsbCk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXIiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSXNDbGllbnRTY2VuYXJpbyIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQkJLy8gRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZCgpCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIERlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQuY2xhc3MpOyAvL09LCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSTCIsIERlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQuY2xhc3MsICJXc2RsU2VydmljZVVSTCIsIG51bGwpOyAvL09LCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmNsYXNzKTsgLy9PSwotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkN1c3RvbWl6ZUNsaWVudE1hcHBpbmdzIiwgTWFwcGluZ0ZyYWdtZW50LmNsYXNzICk7ICAgIAotCQkvL3JlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLAotCQkvLyAiU2VydmljZVByb2plY3QiLAotCQkvLyBDcmVhdGVXZWJQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0JCS8vcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0JCS8vICJFSkJQcm9qZWN0TmFtZSIsCi0JCS8vIENyZWF0ZVdlYlByb2plY3RDb21tYW5kLmNsYXNzKTsKLQkJLy8gQ29weUF4aXNKYXJDb21tYW5kKCkKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQ29weUF4aXNKYXJDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIG51bGwpOwotCQkvLyBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzaygpCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrLmNsYXNzLCAiUHJvamVjdCIsIG51bGwpOwotCQkvLyBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZCgpIC8vIGphdmFQYXJhbV8sIG1vZGVsXwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kLmNsYXNzLCAiUHJveHlQcm9qZWN0IiwKLQkJCQludWxsKTsKLQkJLy8JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSTCIsCi0JCS8vIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kLmNsYXNzLCJXU0RMU2VydmljZVBhdGhuYW1lIixudWxsKTsKLQkJLy8gLy8KLQkJLy8gVVJMIHRvIFVSTD8/Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSTCIsIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kLmNsYXNzLCAiV1NETFNlcnZpY2VVUkwiLCBudWxsKTsgLy8gVVJJCi0JCS8vIHRvCi0JCS8vIFVSTD8/Ci0JCS8vIFZhbGlkYXRlV1NETENvbW1hbmQoKQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBWYWxpZGF0ZVdTRExDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsU2VydmljZVVSTCIsIFZhbGlkYXRlV1NETENvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgVmFsaWRhdGVXU0RMQ29tbWFuZC5jbGFzcyk7Ci0JCS8vIFdTREwySmF2YUNvbW1hbmQoKSAvLyBqYXZhUGFyYW1fCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkwiLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIG51bGwpOyAvLyBVUkwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdG8KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gVVJJPz8KLQkJLy8gUmVmcmVzaFByb2plY3RDb21tYW5kKCkKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgUmVmcmVzaFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIG51bGwpOwotCQkvLyBTdHViMkJlYW5Db21tYW5kKCkKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgU3R1YjJCZWFuQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBTdHViMkJlYW5Db21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgU3R1YjJCZWFuQ29tbWFuZC5jbGFzcyk7Ci0JCS8vIEJ1aWxkUHJvamVjdENvbW1hbmQoKQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIG51bGwpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkZvcmNlQnVpbGQiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJWYWxpZGF0aW9uTWFuYWdlciIsIEJ1aWxkUHJvamVjdENvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKFN0dWIyQmVhbkNvbW1hbmQuY2xhc3MsICJQcm94eUJlYW4iLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIiwgbnVsbCk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEF4aXNDbGllbnRDb21tYW5kc0ZyYWdtZW50LmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2V0RW5kcG9pbnRNZXRob2QiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgTWFwcGluZ0ZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50IHsKLQotCQlwcml2YXRlIGJvb2xlYW4gc2hvd01hcHBpbmdzXzsKLQkJcHVibGljIE1hcHBpbmdGcmFnbWVudCgpIHsKLQotCQkJc3VwZXIoKTsKLQkJCXNldFRydWVGcmFnbWVudChuZXcgU2ltcGxlRnJhZ21lbnQoIkF4aXNDbGllbnRCZWFuTWFwcGluZyIpKTsKLQkJCXNldENvbmRpdGlvbihuZXcgQ29uZGl0aW9uKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKSB7Ci0KLQkJCQkJcmV0dXJuIHNob3dNYXBwaW5nc187Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Q3VzdG9taXplQ2xpZW50TWFwcGluZ3MoYm9vbGVhbiBzaG93TWFwcGluZ3MpIHsKLQotCQkJc2hvd01hcHBpbmdzXyA9IHNob3dNYXBwaW5nczsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNNYXBwaW5nc0ZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNNYXBwaW5nc0ZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNGE2NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzTWFwcGluZ3NGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci0KLQotcHVibGljIGNsYXNzIEF4aXNNYXBwaW5nc0ZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50Ci17Ci0gIHByaXZhdGUgYm9vbGVhbiBzaG93TWFwcGluZ3NfOwotCi0gIHB1YmxpYyBBeGlzTWFwcGluZ3NGcmFnbWVudCgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNldFRydWVGcmFnbWVudCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQXhpc01hcHBpbmdzV2lkZ2V0IiApKTsKLSAgICBzZXRDb25kaXRpb24oIG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hvd01hcHBpbmdzXzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfSApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTaG93TWFwcGluZyggYm9vbGVhbiBzaG93TWFwcGluZ3MgKQotICB7Ci0gICAgc2hvd01hcHBpbmdzXyA9IHNob3dNYXBwaW5nczsKLSAgfSAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc01hcHBpbmdzV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNNYXBwaW5nc1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzUyNWVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc01hcHBpbmdzV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlRhYmxlVmlld2VyV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBBeGlzTWFwcGluZ3NXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLSAgCi0gIHByaXZhdGUgVGFibGVWaWV3ZXJXaWRnZXQgbWFwcGluZ3NfOwotCi0gIHByaXZhdGUgYnl0ZSBtb2RlXzsKLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhUGFyYW1ldGVyXzsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9CRUFOMlhNTCA9IChieXRlKTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX1hNTDJCRUFOID0gKGJ5dGUpMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfWE1MMlBST1hZID0gKGJ5dGUpMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfWE1MMkVKQiA9IChieXRlKTM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX0VKQjJYTUwgPSAoYnl0ZSk0OwotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9QQUNLQUdFID0gImRlZmF1bHQuamF2YXBhY2thZ2UiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX05BTUVTUEFDRSA9ICJodHRwOi8vZGVmYXVsdC5uYW1lc3BhY2UiOwotICAKLSAgLypDT05URVhUX0lEIFBXSk0wMDAxIGZvciB0aGUgV1NETCB0byBKYXZhIE1hcHBpbmdzIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXSk1fUEFHRSA9ICJQV0pNMDAwMSI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHB1YmxpYyBBeGlzTWFwcGluZ3NXaWRnZXQoIGJ5dGUgbW9kZSApCi0gIHsKLSAgICBtb2RlXyA9IG1vZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBVSVV0aWxzICAgICAgdWlVdGlscyAgPSBuZXcgVUlVdGlscyhtc2dVdGlscywgcGx1Z2luSWRfICk7Ci0gICAgICAgIAotICAgIC8vIFRPRE8gVGhlIFRPT0xUSVBfUFdKTV9QQUdFIGtleSBkb2Vzbid0IHNlZW0gdG8gZXhpc3QgYW55d2hlcmU/Pz8KLQkvL3BhcmVudC5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHMuZ2V0TWVzc2FnZSggIlRPT0xUSVBfUFdKTV9QQUdFIiApICk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggcGFyZW50LCBwbHVnaW5JZF8gKyAiLiIgKyBJTkZPUE9QX1BXSk1fUEFHRSApOwotICAgIAotICAgIC8vIFRPRE8gTm8gdG9vbHRpcCBvciBpbmZvcG9wIGZvciB0aGlzIGdyb3VwLgotICAgIEdyb3VwIG1hcHBpbmdHcm91cCA9IHVpVXRpbHMuY3JlYXRlR3JvdXAoIHBhcmVudCwgIkxBQkVMX01BUFBJTkdfUEFJUlMiLCBudWxsLCBudWxsICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExpc3QgaW5pdFZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICBpZiggbW9kZV8gPT0gTU9ERV9CRUFOMlhNTCB8fCBtb2RlXyA9PSBNT0RFX0VKQjJYTUwpIAotICAgIHsKLQkJU3RyaW5nW10gY29sdW1ucyA9IHsgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiVEFCTEVfQ09MVU1OX0xBQkVMX1BBQ0tBR0UiKSwKLQkJICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiVEFCTEVfQ09MVU1OX0xBQkVMX05BTUVTUEFDRSIgKX07Ci0JCW1hcHBpbmdzXyA9IG5ldyBUYWJsZVZpZXdlcldpZGdldCggY29sdW1ucywgaW5pdFZhbHVlcywgbmV3IFN0cmluZ1tdIHtERUZBVUxUX1BBQ0tBR0UsIERFRkFVTFRfTkFNRVNQQUNFfSwgVGFibGVWaWV3ZXJXaWRnZXQuTUFQX09ORV9UT19PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCWVsc2UgCi0JewotICAgICAgCVN0cmluZ1tdIGNvbHVtbnMgPSB7IG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRBQkxFX0NPTFVNTl9MQUJFTF9OQU1FU1BBQ0UiKSwKLQkJICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiVEFCTEVfQ09MVU1OX0xBQkVMX1BBQ0tBR0UiKX07Ci0JCW1hcHBpbmdzXyA9IG5ldyBUYWJsZVZpZXdlcldpZGdldCggY29sdW1ucywgaW5pdFZhbHVlcywgbmV3IFN0cmluZ1tdIHtERUZBVUxUX05BTUVTUEFDRSwgREVGQVVMVF9QQUNLQUdFIH0sIFRhYmxlVmlld2VyV2lkZ2V0Lk1BUF9NQU5ZX1RPX09ORSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0gICAgCi0JbWFwcGluZ3NfLmFkZENvbnRyb2xzKCBtYXBwaW5nR3JvdXAsIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKQotICB7Ci0gICAgcmV0dXJuIG1hcHBpbmdzXy5nZXRTdGF0dXMoKTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKYXZhUGFyYW1ldGVyKCBKYXZhV1NETFBhcmFtZXRlciBwYXJhbWV0ZXIgKQotICB7Ci0gICAgamF2YVBhcmFtZXRlcl8gPSBwYXJhbWV0ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhUGFyYW1ldGVyKCkKLSAgewotICAgIGlmKCBtb2RlXyA9PSBNT0RFX0JFQU4yWE1MIHx8IG1vZGVfID09IE1PREVfRUpCMlhNTCB8fCBtb2RlXyA9PSBNT0RFX1hNTDJCRUFOIHx8IG1vZGVfID09IE1PREVfWE1MMlBST1hZKQotICAgIHsKLSAgICAgIC8vU2V0IHRoZSBtYXBwaW5ncyBvbiBqYXZhUGFyYW1ldGVyCi0gICAgICBUYWJsZUl0ZW1bXSBwYWlycyA9IG1hcHBpbmdzXy5nZXRJdGVtcygpOwotICAJICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIAkgIGZvciAoaW50IGk9MDsgaTxwYWlycy5sZW5ndGg7IGkrKykKLSAgCSAgewotICAJCW1hcC5wdXQocGFpcnNbaV0uZ2V0VGV4dCgwKSxwYWlyc1tpXS5nZXRUZXh0KDEpKTsKLSAgCSAgfQotICAJICBqYXZhUGFyYW1ldGVyXy5zZXRNYXBwaW5ncyhtYXApOwotICAJICAKLSAgCSAgLy9TZXQgdGhlIG5hbWVzcGFjZSBvbiB0aGUgamF2YVBhcmFtZXRlcgotICAJICBTdHJpbmcgYmVhbk5hbWUgPSBqYXZhUGFyYW1ldGVyXy5nZXRCZWFuTmFtZSgpOwotCSAgaWYoYmVhbk5hbWUgIT0gbnVsbCAmJiAhYmVhbk5hbWUuZXF1YWxzKCIiKSkKLQkgIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gYmVhbk5hbWUuc3Vic3RyaW5nKDAsIGJlYW5OYW1lLmxhc3RJbmRleE9mKCcuJykpOwotCQlpZihtYXAuY29udGFpbnNLZXkocGFja2FnZU5hbWUpKQotCQl7Ci0JCSAgU3RyaW5nIHRucyA9IChTdHJpbmcpbWFwLmdldChwYWNrYWdlTmFtZSk7Ci0JCSAgamF2YVBhcmFtZXRlcl8uc2V0TmFtZXNwYWNlKHRucyk7Ci0JCX0JCQotCSAgfQotCi0gICAgfQotICAgIHJldHVybiBqYXZhUGFyYW1ldGVyXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzUHJveHlXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc1Byb3h5V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNDBjYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzUHJveHlXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBBeGlzUHJveHlXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV0pCMDAwMSBmb3IgdGhlIFdTREwgdG8gSmF2YSBCaW5kaW5ncyBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QV0pCX1BBR0UgPSAiUFdKQjAwMDEiOwkvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUFdKQl9QQUdFID0gIlRPT0xUSVBfUFdKQl9QQUdFIjsKLQkJCi0gIHByaXZhdGUgVGV4dCBmb2xkZXJUZXh0XzsKLSAgLypDT05URVhUX0lEIFBXSkIwMDAzIGZvciB0aGUgRm9sZGVyIGZpZWxkIG9mIHRoZSBXU0RMIHRvIEphdmEgQmluZGluZ3MgUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFdKQl9URVhUX0ZPTERFUiA9ICJQV0pCMDAwMyI7CS8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QV0pCX1RFWFRfRk9MREVSID0gIlRPT0xUSVBfUFdKQl9URVhUX0ZPTERFUiI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gZ2VuUHJveHlDaGVja2JveF87Ci0gIC8qQ09OVEVYVF9JRCBQV0pCMDAwOSBJbmRpY2F0ZXMgd2hldGhlciB0byBnZW5lcmF0ZSBhIHByb3h5IG9yIG5vdC4gKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QV0pCX0NIRUNLQk9YX0dFTlBST1hZID0gIlBXSkIwMDA5IjsJLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BXSkJfQ0hFQ0tCT1hfR0VOUFJPWFkgPSAiVE9PTFRJUF9QV0pCX0NIRUNLQk9YX0dFTlBST1hZIjsKLQkJCi0gIHByaXZhdGUgQnV0dG9uIHNob3dNYXBwaW5nc0NoZWNrYm94XzsKLSAgLypDT05URVhUX0lEIFBXSkIwMDE2IGZvciB0aGUgU2hvdyBNYXBwaW5ncyBjaGVja2JveCBvZiB0aGUgQmVhbiBNZXRob2RzIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX04yUF9TSE9XX01BUFBJTkdTID0gIlBXSkIwMDE2IjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBwbHVnaW5JZF8gKTsKLSAgICAKLQlwYXJlbnQuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIFRPT0xUSVBfUFdKQl9QQUdFICkgKTsKLQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBwYXJlbnQsIHBsdWdpbklkXyArICIuIiArICBJTkZPUE9QX1BXSkJfUEFHRSk7Ci0gICAgCi0gICAgZ2VuUHJveHlDaGVja2JveF8gPSB1aVV0aWxzLmNyZWF0ZUNoZWNrYm94KCBwYXJlbnQsICJDSEVDS0JPWF9HRU5QUk9YWSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BXSkJfQ0hFQ0tCT1hfR0VOUFJPWFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXSkJfQ0hFQ0tCT1hfR0VOUFJPWFkgKTsKLSAgICBnZW5Qcm94eUNoZWNrYm94Xy5hZGRMaXN0ZW5lciggU1dULlNlbGVjdGlvbiwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICAKLSAgICBnZW5Qcm94eUNoZWNrYm94Xy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlR2VuUHJveHkoKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIHRleHRHcm91cCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDIsIDUsIDAgKTsKLSAgICAKLSAgICBmb2xkZXJUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggdGV4dEdyb3VwLCAiTEFCRUxfRk9MREVSX05BTUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BXSkJfVEVYVF9GT0xERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdKQl9URVhUX0ZPTERFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgZm9sZGVyVGV4dF8uYWRkTGlzdGVuZXIoIFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgCi0gICAgc2hvd01hcHBpbmdzQ2hlY2tib3hfID0gdWlVdGlscy5jcmVhdGVDaGVja2JveCggcGFyZW50LCAiTEFCRUxfRVhQTE9SRV9NQVBQSU5HU19YTUwyQkVBTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfTjJQX1NIT1dfTUFQUElOR1MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfTjJQX1NIT1dfTUFQUElOR1MgKTsKLSAgICAvLyBTaW5jZSB0aGlzIHdpZGdldCBhZmZlY3RzIHdoZXRoZXIgdGhlIG5leHQgcGFnZSBpcyBzaG93biBvciBub3Qgd2UKLSAgICAvLyBuZWVkIHRvIGFkZCB0aGUgc3RhdHVzTGlzdGVuZXIuCi0gICAgc2hvd01hcHBpbmdzQ2hlY2tib3hfLmFkZExpc3RlbmVyKCBTV1QuU2VsZWN0aW9uLCBzdGF0dXNMaXN0ZW5lciApOwotICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlR2VuUHJveHkoKQotICB7Ci0gICAgYm9vbGVhbiBlbmFibGVkID0gZ2VuUHJveHlDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCi0gICAgZm9sZGVyVGV4dF8uc2V0RW5hYmxlZCggZW5hYmxlZCApOwotICAgIHNob3dNYXBwaW5nc0NoZWNrYm94Xy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5Rm9sZGVyKCBTdHJpbmcgcHJveHlGb2xkZXIgKQotICB7Ci0gICAgZm9sZGVyVGV4dF8uc2V0VGV4dCggcHJveHlGb2xkZXIgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByb3h5Rm9sZGVyKCkKLSAgewotICAgICByZXR1cm4gZm9sZGVyVGV4dF8uZ2V0VGV4dCgpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoIEJvb2xlYW4gZ2VuUHJveHkgKQotICB7Ci0gICAgZ2VuUHJveHlDaGVja2JveF8uc2V0U2VsZWN0aW9uKCBnZW5Qcm94eS5ib29sZWFuVmFsdWUoKSApOwotICB9ICAgIAotICAKLSAgcHVibGljIEJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oIGdlblByb3h5Q2hlY2tib3hfLmdldFNlbGVjdGlvbigpICk7Ci0gIH0gICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZUNsaWVudE1hcHBpbmdzKCBib29sZWFuIHNob3dNYXBwaW5ncyApCi0gIHsKLSAgICBzaG93TWFwcGluZ3NDaGVja2JveF8uc2V0U2VsZWN0aW9uKCBzaG93TWFwcGluZ3MgKTsKLSAgfSAgICAgICAgICAgIAotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0Q3VzdG9taXplQ2xpZW50TWFwcGluZ3MoKQotICB7Ci0gICAgcmV0dXJuIHNob3dNYXBwaW5nc0NoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKSAmJiBnZW5Qcm94eUNoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKTsKLSAgfSAgIAotICAKLSAgcHVibGljIHZvaWQgc2V0SXNDbGllbnRTY2VuYXJpbyggYm9vbGVhbiBpc0NsaWVudFNjZW5hcmlvICkKLSAgewotICAgIGdlblByb3h5Q2hlY2tib3hfLnNldEVuYWJsZWQoICFpc0NsaWVudFNjZW5hcmlvICk7IAotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvRGVmYXVsdHNGb3JDbGllbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvRGVmYXVsdHNGb3JDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExOTczNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0RlZmF1bHRzRm9yQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdHNGb3JDbGllbnQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBjdXN0b21pemVNYXBwaW5nc18gPSB0cnVlOwotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0Q3VzdG9taXplQ2xpZW50TWFwcGluZ3MoKQotICB7Ci0gICAgcmV0dXJuIGN1c3RvbWl6ZU1hcHBpbmdzXzsKLSAgfSAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZUNsaWVudE1hcHBpbmdzKCBib29sZWFuIHZhbHVlICkKLSAgewotICAgIGN1c3RvbWl6ZU1hcHBpbmdzXyA9IHZhbHVlOyAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcm94eUZvbGRlcigpCi0gIHsKLSAgICAgcmV0dXJuICIvcHJveHlwcm9qZWN0L215Zm9sZGVyIjsgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aXphcmQvY2xpZW50L1dlYlNlcnZpY2VDbGllbnRBeGlzVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2l6YXJkL2NsaWVudC9XZWJTZXJ2aWNlQ2xpZW50QXhpc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmYWVjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aXphcmQvY2xpZW50L1dlYlNlcnZpY2VDbGllbnRBeGlzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5EZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suU3R1YjJCZWFuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLlZhbGlkYXRlV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2lkZ2V0cy5BeGlzQ2xpZW50Q29tbWFuZHNGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzLkF4aXNDbGllbnRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzLkF4aXNNYXBwaW5nc1dpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzLkF4aXNQcm94eVdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLS8qKgotICAqIERldmVsb3BlcnMgd2hvIGFyZSBhZGRpbmcgd2ViIHNlcnZpY2UgY2xpZW50cyBpbnRvIHRoZSB3aXphcmQgc2hvdWxkIGNyZWF0ZQotICAqIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLiAgCi0qKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50QXhpc1R5cGUgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZyAKLXsKLQotCQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIAotICB7Ci0gIAkvLyBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQgIAkKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ3VzdG9taXplQ2xpZW50TWFwcGluZ3MiLCBBeGlzUHJveHlXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHJveHlQcm9qZWN0Rm9sZGVyIiwgQXhpc1Byb3h5V2lkZ2V0LmNsYXNzLCAiUHJveHlGb2xkZXIiLCBudWxsICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBBeGlzUHJveHlXaWRnZXQuY2xhc3MpOyAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSXNDbGllbnRTY2VuYXJpbyIsIEF4aXNQcm94eVdpZGdldC5jbGFzcyk7ICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIG51bGwpOwotICAgIAotICAgIC8vIEF4aXNQcm94eVdpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzUHJveHlXaWRnZXQuY2xhc3MsICJDdXN0b21pemVDbGllbnRNYXBwaW5ncyIsIEF4aXNDbGllbnRGcmFnbWVudC5NYXBwaW5nRnJhZ21lbnQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQXhpc1Byb3h5V2lkZ2V0LmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEF4aXNDbGllbnRDb21tYW5kc0ZyYWdtZW50LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIEF4aXNQcm94eVdpZGdldC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzICk7Ci0gICAgCi0gICAgLy9BeGlzTWFwcGluZ3NXaWRnZXQKLQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsgLy9PSwotCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsgLy9PSwotCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBWYWxpZGF0ZVdTRExDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOyAvL09LCi0JZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7IC8vT0sKLQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgU3R1YjJCZWFuQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsgLy9PSwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpIAotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkXyAgICAgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBTdHJpbmcgICAgICAgYXhpc1BsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgTWVzc2FnZVV0aWxzIGF4aXNNc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIGF4aXNQbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICAKLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJBeGlzQ2xpZW50U3RhcnQiLCAKLSAgICAgICAgYXhpc01zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfQVhJU19QUk9YWSIpLAotICAgICAgICBheGlzTXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTX0FYSVNfUFJPWFkiKSwKLSAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF4aXNQcm94eVdpZGdldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSApOwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkF4aXNDbGllbnRCZWFuTWFwcGluZyIsIAotICAgICAgICBheGlzTXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19YTUwyUFJPWFkiKSwKLSAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX04yUF9NQVBQSU5HUyIpLAotICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXhpc01hcHBpbmdzV2lkZ2V0KEF4aXNNYXBwaW5nc1dpZGdldC5NT0RFX1hNTDJQUk9YWSApOwotICAgICAgICAgIH0KLSAgICAgICAgfSApOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IEF4aXNDbGllbnRGcmFnbWVudCgpOyAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH07Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpIAotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpemFyZC90ZXN0L1Rlc3RXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aXphcmQvdGVzdC9UZXN0V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjY3MmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpemFyZC90ZXN0L1Rlc3RXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VzQ2xpZW50RGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kLkF4aXNDbGllbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0vKgotICogQWRkIHRoZSBzdHVmZiBiZWxvdyB0byB0aGUgcHJvcGVydGllcyBmaWxlIHRvIG1ha2UgdGhpcyB3b3JrLiAKLSMKLSNUZXN0IG9ubHkgLSBkbyBub3QgY29tbWl0Ci0jCi13c2RsVVJJPXdzZGxVUkkKLWNsaWVudFByb2plY3Q9Y2xpZW50UHJvamVjdAotc2VydmljZVFOYW1lPXNlcnZpY2VRTmFtZQotb3V0cHV0V1NETHBhdGg9b3V0cHV0V1NETHBhdGgKLUdPPUdPCi1wb3AxPXBvcDEKLXBvcDI9cG9wMgotKi8KLXB1YmxpYyBjbGFzcyBUZXN0V2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIAotICBwcml2YXRlIFRleHQgd3NkbFVSSVRleHRfOwotICBwcml2YXRlIFRleHQgY2xpZW50UHJvamVjdFRleHRfOwotICBwcml2YXRlIFRleHQgc2VydmljZVFOYW1lVGV4dF87Ci0gIHByaXZhdGUgVGV4dCBvdXRwdXRXU0RMUGF0aFRleHRfOwotICBwcml2YXRlIEJ1dHRvbiBnb0J1dHRvbl87Ci0gIHByaXZhdGUgQnV0dG9uIHBvcDFCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiBwb3AyQnV0dG9uXzsKLSAgCi0gIHB1YmxpYyBUZXN0V2l6YXJkUGFnZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICAgIHNldFRpdGxlKCJUZXN0IFBhZ2UiKTsKLSAgICBzZXREZXNjcmlwdGlvbigiVGVzdCBwYWdlIGRlc2NyaXB0aW9uIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBwYWdlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBwYWdlLnNldExheW91dChnbCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgcGFnZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBwYWdlLnNldFNpemUoNTAwLDUwMCk7Ci0KLSAgIAotCS8vQ29tcG9zaXRlIG91dGVyR3JvdXBfID0gbmV3IENvbXBvc2l0ZShwYWdlLFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JQ29tcG9zaXRlIG91dGVyR3JvdXBfID0gbmV3IENvbXBvc2l0ZShwYWdlLFNXVC5OT05FKTsKLQlHcmlkTGF5b3V0IGdsMiA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JZ2wyLm51bUNvbHVtbnMgPSAyOwotCWdsMi5tYXJnaW5IZWlnaHQgPSAwOwotCWdsMi5tYXJnaW5XaWR0aCA9IDA7Ci0Jb3V0ZXJHcm91cF8uc2V0TGF5b3V0KGdsMik7Ci0JLy9HcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQlHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlvdXRlckdyb3VwXy5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCi0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIFVJVXRpbHMgdWlVdGlscyA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzXywgcGx1Z2luSWRfKTsKLSAgICAKLSAgICB3c2RsVVJJVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQob3V0ZXJHcm91cF8sIndzZGxVUkkiLCJ3c2RsVVJJIiwid3NkbFVSSSIsU1dULlNJTkdMRXxTV1QuQk9SREVSKTsKLSAgICBjbGllbnRQcm9qZWN0VGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQob3V0ZXJHcm91cF8sImNsaWVudFByb2plY3QiLCJjbGllbnRQcm9qZWN0IiwiY2xpZW50UHJvamVjdCIsU1dULlNJTkdMRXxTV1QuQk9SREVSKTsKLSAgICBzZXJ2aWNlUU5hbWVUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dChvdXRlckdyb3VwXywic2VydmljZVFOYW1lIiwic2VydmljZVFOYW1lIiwiIixTV1QuU0lOR0xFfFNXVC5CT1JERVIpOwotICAgIG91dHB1dFdTRExQYXRoVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQob3V0ZXJHcm91cF8sIm91dHB1dFdTRExwYXRoIiwib3V0cHV0V1NETHBhdGgiLCIiLFNXVC5TSU5HTEV8U1dULkJPUkRFUik7Ci0gICAgZ29CdXR0b25fID0gdWlVdGlscy5jcmVhdGVCdXR0b24oU1dULlBVU0gsb3V0ZXJHcm91cF8sIkdPIiwiR08iLCIiKTsKLSAgICBnb0J1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlR09QdXNoZWQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlR09QdXNoZWQoKTsKLSAgICAgICAgfQotICAgICAgICB9KTsKLSAgICBwb3AxQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlQnV0dG9uKFNXVC5QVVNILG91dGVyR3JvdXBfLCJwb3AxIiwicG9wMSIsIiIpOwotICAgIHBvcDFCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZVBvcDFQdXNoZWQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlUG9wMVB1c2hlZCgpOwotICAgICAgICB9Ci0gICAgICAgIH0pOyAgICAKLSAgICBwb3AyQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlQnV0dG9uKFNXVC5QVVNILG91dGVyR3JvdXBfLCJwb3AyIiwicG9wMiIsIiIpOwotICAgIHBvcDJCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZVBvcDJQdXNoZWQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlUG9wMlB1c2hlZCgpOwotICAgICAgICB9Ci0gICAgICAgIH0pOyAgICAKLSAKLSAgICBzZXRDb250cm9sKHBhZ2UpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlUG9wMVB1c2hlZCgpCi0gIHsKLSAgICB3c2RsVVJJVGV4dF8uc2V0VGV4dCgiaHR0cDovL3d3dy54bWV0aG9kcy5uZXQvc2QvMjAwMS9UZW1wZXJhdHVyZVNlcnZpY2Uud3NkbCIpOwotICAgIGNsaWVudFByb2plY3RUZXh0Xy5zZXRUZXh0KCJjd3AiKTsKLSAgICBzZXJ2aWNlUU5hbWVUZXh0Xy5zZXRUZXh0KCJodHRwOi8vd3d3LnhtZXRob2RzLm5ldC9zZC9UZW1wZXJhdHVyZVNlcnZpY2Uud3NkbDpUZW1wZXJhdHVyZVNlcnZpY2UiKTsKLSAgICBvdXRwdXRXU0RMUGF0aFRleHRfLnNldFRleHQoIi9jd3AvV2ViIENvbnRlbnQvV0VCLUlORi93c2RsL1RlbXBlcmF0dXJlU2VydmljZS53c2RsIik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVQb3AyUHVzaGVkKCkKLSAgewotICAgIHdzZGxVUklUZXh0Xy5zZXRUZXh0KCJmaWxlOi9EOi9FY2xpcHNlL2VjbGlwc2UvcnVudGltZS13b3Jrc3BhY2VfdDEvd3AyL1dlYiBDb250ZW50L0NvbnZlcnRlcnMud3NkbCIpOwotICAgIGNsaWVudFByb2plY3RUZXh0Xy5zZXRUZXh0KCJjd3AyIik7Ci0gICAgc2VydmljZVFOYW1lVGV4dF8uc2V0VGV4dCgiaHR0cDovL3NhbXBsZS5jb252ZXJ0ZXJzOkNvbnZlcnREaXN0YW5jZVNlcnZpY2UiKTsKLSAgICBvdXRwdXRXU0RMUGF0aFRleHRfLnNldFRleHQoIi9jd3AyL1dlYiBDb250ZW50L1dFQi1JTkYvd3NkbC9Db252ZXJ0ZXJzLndzZGwiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVHT1B1c2hlZCgpCi0gIHsKLSAgICBBeGlzQ2xpZW50R2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBBeGlzQ2xpZW50R2VuZXJhdG9yKCk7Ci0gICAgVGVzdFdTQ0RhdGFIZWxwZXIgZGF0YU1vZGVsID0gbmV3IFRlc3RXU0NEYXRhSGVscGVyKCk7Ci0gICAgZGF0YU1vZGVsLnBvcHVsYXRlKHdzZGxVUklUZXh0Xy5nZXRUZXh0KCksIHNlcnZpY2VRTmFtZVRleHRfLmdldFRleHQoKSwgY2xpZW50UHJvamVjdFRleHRfLmdldFRleHQoKSwgb3V0cHV0V1NETFBhdGhUZXh0Xy5nZXRUZXh0KCksZmFsc2UpOwotICAgIAotICAgIGdlbmVyYXRvci5nZW5XZWJTZXJ2aWNlQ2xpZW50QXJ0aWZhY3RzKGRhdGFNb2RlbCk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJHZW5lcmF0ZWQgc2VydmljZSBpbnRlcmZhY2U9ICIrZGF0YU1vZGVsLmdldFNlcnZpY2VJbnRlcmZhY2VOYW1lKCkpOwotICAgIFN0cmluZ1tdIHNlaXMgPSBkYXRhTW9kZWwuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZXMoKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRlZCBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXM6Iik7Ci0gICAgZm9yIChpbnQgaT0wO2k8c2Vpcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAJU3lzdGVtLm91dC5wcmludGxuKHNlaXNbaV0pOwotICAgIH0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdWNoZWQgZGVzY3JpcHRvcnM/ICIrZGF0YU1vZGVsLnNob3VsZEdlbkRlc2NyaXB0b3JzKCkpOwotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIFRlc3RXU0NEYXRhSGVscGVyIGltcGxlbWVudHMgV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyCi0gIHsKLSAgCXByaXZhdGUgU3RyaW5nIHdzZGxVcmxfOwotICAJcHJpdmF0ZSBTdHJpbmcgc2VydmljZVFOYW1lXzsKLSAgCXByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lXzsKLSAgCXByaXZhdGUgU3RyaW5nIG91dHB1dFdTRExGaWxlTmFtZV87Ci0gIAlwcml2YXRlIFN0cmluZyBzZXJ2aWNlSW50ZXJmYWNlTmFtZV87Ci0gIAlwcml2YXRlIFN0cmluZ1tdIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWVzXzsKLSAgCXByaXZhdGUgYm9vbGVhbiBzaG91bGREZXBsb3lfOwotICAJcHJpdmF0ZSBib29sZWFuIHNob3VsZEdlbkRlc2NyaXB0b3JzXzsKLSAgCQotICAJcHVibGljIHZvaWQgcG9wdWxhdGUoU3RyaW5nIHdzZGxVUkwsIFN0cmluZyBzZXJ2aWNlUU5hbWUsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIG91dHB1dFdTRExGaWxlTmFtZSwgYm9vbGVhbiBzaG91bGREZXBsb3kpCi0gIAl7Ci0gIAkJd3NkbFVybF8gPSB3c2RsVVJMOwotICAJCXNlcnZpY2VRTmFtZV8gPSBzZXJ2aWNlUU5hbWU7Ci0gIAkJcHJvamVjdE5hbWVfID0gcHJvamVjdE5hbWU7Ci0gIAkJb3V0cHV0V1NETEZpbGVOYW1lXyA9IG91dHB1dFdTRExGaWxlTmFtZTsKLSAgCQlzaG91bGREZXBsb3lfID0gc2hvdWxkRGVwbG95OwotICAJfQotCS8qKgotCSAqIEByZXR1cm4gdGhlIFVSTCBmb3IgdGhlIGFzc29jaWF0ZWQgb3JpZ2luYWwgV1NETCBmaWxlIHJlZmVyZW5jZWQgYnkgdGhlIGNsaWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V1NETFVybCgpCi0JewotCQlyZXR1cm4gd3NkbFVybF87Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIFFOYW1lIGZvciB0aGUgYXNzb2NpYXRlZCB3ZWIgc2VydmljZSBmb3IgdGhlIGNsaWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVFOYW1lKCkKLQl7Ci0JCXJldHVybiBzZXJ2aWNlUU5hbWVfOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgcHJvamVjdCBmb3IgdGhlIHdlYiBzZXJ2aWNlIGNsaWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKQotCXsKLQkJcmV0dXJuIHByb2plY3ROYW1lXzsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgZmlsZU5hbWUgbG9jYXRpb24gZm9yIHRoZSBjb3BpZWQgV1NETCBmaWxlIGludG8gdGhlIGNsaWVudCBwcm9qZWN0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRwdXRXU0RMRmlsZU5hbWUoKQotCXsKLQkJcmV0dXJuIG91dHB1dFdTRExGaWxlTmFtZV87Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUludGVyZmFjZU5hbWUoKQotCXsKLQkJcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2VOYW1lXzsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWVzKCkKLQl7Ci0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lc187Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gc2hvdWxkIGdlbmVyYXRlIGNvZGUgZm9yIGRlcGxveW1lbnQ/Ci0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkRGVwbG95KCkKLQl7Ci0JCXJldHVybiBzaG91bGREZXBsb3lfOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGV4dGVuc2lvbiBnZW5lcmF0ZWQgdGhlIGRlc2NyaXB0b3JzIG9yIG5vdAotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkRlc2NyaXB0b3JzKCkKLQl7Ci0JCXJldHVybiBzaG91bGRHZW5EZXNjcmlwdG9yc187Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgU0kgY2xhc3NuYW1lIGZvciB0aGUgd2ViIHNlcnZpY2UgY2xpZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUludGVyZmFjZU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlzZXJ2aWNlSW50ZXJmYWNlTmFtZV8gPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgU0VJIGNsYXNzbmFtZXMgZm9yIHRoZSB3ZWIgc2VydmljZSBjbGllbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lcyhTdHJpbmdbXSBuYW1lcykKLQl7Ci0JCXNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWVzXyA9IG5hbWVzOwotCX0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIGRlc2NyaXB0b3JzIHdlcmUgZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlkR2VuRGVzY3JpcHRvcnMoYm9vbGVhbiBiKQotCXsKLQkJc2hvdWxkR2VuRGVzY3JpcHRvcnNfID0gYjsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBpbnZva2UgYW55IG9wZXJhdGlvbnMgcmVxdWlyZWQgdG8gc2V0IHVwIHdlYiBzZXJ2aWNlcyBjbGllbnQsIFNJLCBhbmQgU0VJCi0JICovCi0JcHVibGljIHZvaWQgZ2VuV2ViU2VydmljZUNsaWVudEFydGlmYWN0cyhXZWJTZXJ2aWNlc0NsaWVudERhdGFIZWxwZXIgZGF0YU1vZGVsKQotCXsKLQkJLy8gRG8gbm90aGluZy4gVGhpcyBzaG91bGRuJ3QgYmUgb24gdGhlIGludGVyZmFjZSEKLQl9Ci0JCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpemFyZC90ZXN0L1dlYlNlcnZpY2VUZXN0V2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aXphcmQvdGVzdC9XZWJTZXJ2aWNlVGVzdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTFjOGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpemFyZC90ZXN0L1dlYlNlcnZpY2VUZXN0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpemFyZC50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUZXN0V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZAotewotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlVGVzdFdpemFyZCgpCi0gIHsKLSAgICBzdXBlcigpOwotCi0gICAgVGVzdFdpemFyZFBhZ2UgcGFnZSA9IG5ldyBUZXN0V2l6YXJkUGFnZSgiVGVzdCBwYWdlIik7Ci0gIH0KLQotCi0KLSAgLyoqCi0gICogSW5pdGlhbGl6ZXMgdGhpcyAiTmV3IiB3aXphcmQuCi0gICogQHBhcmFtIHdvcmtiZW5jaCBUaGUgd29ya2JlbmNoIHRoYXQgbGF1bmNoZWQgdGhpcyB3aXphcmQuCi0gICogQHBhcmFtIHNlbGVjdGlvbiBUaGUgc2VsZWN0aW9uIGNvbnRleHQgb2YgdGhpcyB3aXphcmQuCi0gICogQHJldHVybiBUaGlzIHdpemFyZC4KLSAgKi8KLSAgcHVibGljIHZvaWQgaW5pdCAoIElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICB7Ci0gICAgLy9EbyBub3RoaW5nCi0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkKLSAgewotCi0gICAgVGVzdFdpemFyZFBhZ2UgcGFnZSA9IG5ldyBUZXN0V2l6YXJkUGFnZSgiVGVzdCBwYWdlIik7Ci0gICAgYWRkUGFnZShwYWdlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7Ci0gICAgLy9BbHdheXMgYWxsb3cgZmluaXNoCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91dGlsL0NsYXNzcGF0aFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91dGlsL0NsYXNzcGF0aFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNWUzYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdXRpbC9DbGFzc3BhdGhVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udXRpbDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FQVJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLklFQVJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5JV2ViTmF0dXJlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkoyRUVXZWJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIENsYXNzcGF0aFV0aWxzIHsKLQotCS8vCUNvcHlyaWdodAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAzLiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIENsYXNzcGF0aFV0aWxzIGluc3RhbmNlXzsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBESVJfQ0xBU1NFUyA9ICJjbGFzc2VzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBESVJfTElCID0gImxpYiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRE9UX0pBUiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDbGFzc3BhdGhVdGlscygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aFV0aWxzIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2VfID09IG51bGwpCi0JCQlpbnN0YW5jZV8gPSBuZXcgQ2xhc3NwYXRoVXRpbHMoKTsKLQkJcmV0dXJuIGluc3RhbmNlXzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aFN0cmluZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZ0J1ZmZlciBjbGFzc3BhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1tdIGNsYXNzcGF0aEVudHJpZXMgPSBnZXRDbGFzc3BhdGgocHJvamVjdCwgZmFsc2UpOwotCQlTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbiA9IG51bGw7Ci0JCQotCQkvLyBUT0RPOiB3b3JrYXJvdW5kIGZvciA5MDUxNSBhbmQgOTA1NjAKLQkJdHJ5IHsKLQkJCi0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0LCBKMkVFVXRpbHMuZ2V0Rmlyc3RXZWJNb2R1bGVOYW1lKHByb2plY3QpKTsKLQkJCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJCQotCQkJCUlGb2xkZXIgd2ViTW9kdWxlQ2xhc3NlcyA9IG51bGw7Ci0JCQkJU3RydWN0dXJlRWRpdCBtYyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJCQlXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkJCQlpZiAod2Jjcy5sZW5ndGghPTApIHsKLQkJCQkJCUlGb2xkZXIgIHdlYk1vZHVsZVNlcnZlclJvb3QgPSBTdHJ1Y3R1cmVFZGl0LmdldE91dHB1dENvbnRhaW5lclJvb3Qod2Jjc1swXSk7Ci0JCQkJCQl3ZWJNb2R1bGVDbGFzc2VzICA9IHdlYk1vZHVsZVNlcnZlclJvb3QuZ2V0Rm9sZGVyKCJXRUItSU5GIikuZ2V0Rm9sZGVyKCJjbGFzc2VzIik7Ci0JCQkJCQlyZXNvdXJjZUxvY2F0aW9uID0gd2ViTW9kdWxlQ2xhc3Nlcy5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCQkJCWNsYXNzcGF0aC5hcHBlbmQocmVzb3VyY2VMb2NhdGlvbik7Ci0JCQkJCQljbGFzc3BhdGguYXBwZW5kKCI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5ewotCQkJCQlpZiAobWMhPW51bGwpCi0JCQkJCQltYy5kaXNwb3NlKCk7CQkJCi0JCQkJfQotCQkJCQotCQkJCUlWaXJ0dWFsRm9sZGVyIHdlYkluZkxpYiA9IGNvbXBvbmVudC5nZXRGb2xkZXIobmV3IFBhdGgoCi0JCQkJCQkiL1dFQi1JTkYvbGliIikpOwotCQkJCWlmICh3ZWJJbmZMaWIgIT0gbnVsbCkgewotCQkJCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2VzID0gd2ViSW5mTGliLm1lbWJlcnMoKTsKLQkJCQkJSVJlc291cmNlIGFSZXNvdXJjZSA9IG51bGw7Ci0JCQkJCQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJYVJlc291cmNlID0gcmVzb3VyY2VzW2ldLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCQkJcmVzb3VyY2VMb2NhdGlvbiA9IGFSZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlTG9jYXRpb24pOwotCQkJCQkJY2xhc3NwYXRoLmFwcGVuZChyZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQkJCWNsYXNzcGF0aC5hcHBlbmQoIjsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCS8vIGVuZCBvZiB3b3JrYXJvdW5kCi0JCQotCQlWZWN0b3IgY2xhc3NwYXRoVmVjdG9yID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghY2xhc3NwYXRoVmVjdG9yLmNvbnRhaW5zKGNsYXNzcGF0aEVudHJpZXNbaV0pKSB7Ci0JCQkJY2xhc3NwYXRoVmVjdG9yLmFkZChjbGFzc3BhdGhFbnRyaWVzW2ldKTsKLQkJCQljbGFzc3BhdGguYXBwZW5kKGNsYXNzcGF0aEVudHJpZXNbaV0pOwotCQkJCWNsYXNzcGF0aC5hcHBlbmQoIjsiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBjbGFzc3BhdGgudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVVJMW10gZ2V0Q2xhc3NwYXRoVVJMKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU3RyaW5nW10gY2xhc3NwYXRoRW50cmllcyA9IGdldENsYXNzcGF0aChwcm9qZWN0LCBmYWxzZSk7Ci0JCVZlY3RvciBjbGFzc3BhdGhWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShjbGFzc3BhdGhFbnRyaWVzW2ldKTsKLQkJCQkvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgcHJvamVjdCBDUFsiK2krIl0gPSAiK2ZpbGUpOwotCQkJCVVSTCB1cmwgPSBmaWxlLnRvVVJMKCk7Ci0JCQkJaWYgKCFjbGFzc3BhdGhWZWN0b3IuY29udGFpbnModXJsKSkKLQkJCQkJY2xhc3NwYXRoVmVjdG9yLmFkZCh1cmwpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCX0KLQkJfQotCQlhZGRMaWJDbGFzc3NwYXRoKGNsYXNzcGF0aFZlY3Rvcik7Ci0JCS8vIGFkZCB0aGUgcGx1Z2luIGxpYiBkaXJlY3RvcnkgamFycyB0byBjbGFzc3BhdGgKLQkJVVJMW10gY2xhc3NwYXRoID0gbmV3IFVSTFtjbGFzc3BhdGhWZWN0b3Iuc2l6ZSgpXTsKLQkJY2xhc3NwYXRoVmVjdG9yLmNvcHlJbnRvKGNsYXNzcGF0aCk7Ci0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpYkNsYXNzc3BhdGgoVmVjdG9yIGNsYXNzcGF0aFZlY3RvcikgewotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gaXNEZXBlbmRlbnQpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIGNsYXNzcGF0aDsKLQkJCUVBUk5hdHVyZVJ1bnRpbWUgZWFyUHJvamVjdCA9IGNhc3RUb0VBUlByb2plY3QocHJvamVjdCk7Ci0JCQlpZiAoZWFyUHJvamVjdCAhPSBudWxsKQotCQkJCXJldHVybiBnZXRDbGFzc3BhdGhGb3JFQVJQcm9qZWN0KGVhclByb2plY3QpOwotCQkJZWxzZSBpZiAocHJvamVjdC5oYXNOYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCkpCi0JCQkJcmV0dXJuIGdldENsYXNzcGF0aEZvcldlYlByb2plY3QoCi0JCQkJCShKMkVFV2ViTmF0dXJlUnVudGltZSkgcHJvamVjdC5nZXROYXR1cmUoCi0JCQkJCQlJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKSwKLQkJCQkJaXNEZXBlbmRlbnQpOwotCQkJZWxzZSBpZiAocHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NwYXRoRm9ySmF2YVByb2plY3QoCi0JCQkJCShJSmF2YVByb2plY3QpIHByb2plY3QuZ2V0TmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpOwotCQkJZWxzZQotCQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJfQotCX0KLQotCXByaXZhdGUgRUFSTmF0dXJlUnVudGltZSBjYXN0VG9FQVJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIGVhck5hdHVyZXMgPSBJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRFM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVhck5hdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoZWFyTmF0dXJlc1tpXSkpCi0JCQkJCXJldHVybiAoRUFSTmF0dXJlUnVudGltZSkgcHJvamVjdC5nZXROYXR1cmUoZWFyTmF0dXJlc1tpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldENsYXNzcGF0aEZvckVBUlByb2plY3QoRUFSTmF0dXJlUnVudGltZSBlYXJQcm9qZWN0KSB7Ci0JCUlQYXRoIGVhclBhdGggPQotCQkJZWFyUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQlyZXR1cm4gZ2V0RGlyZWN0b3J5SmFyRmlsZXMoZWFyUGF0aCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXREaXJlY3RvcnlKYXJGaWxlcyhJUGF0aCBpUGF0aCkgewotCQlGaWxlIGRpciA9IGlQYXRoLnRvRmlsZSgpOwotCQlWZWN0b3IgamFyc1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKGRpci5leGlzdHMoKSAmJiBkaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJU3RyaW5nW10gZmlsZW5hbWVzID0gZGlyLmxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVuYW1lc1tpXS5lbmRzV2l0aChET1RfSkFSKSkKLQkJCQkJamFyc1ZlY3Rvci5hZGQocGF0aDJTdHJpbmcoaVBhdGgpICsgZmlsZW5hbWVzW2ldKTsKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSBqYXJzID0gbmV3IFN0cmluZ1tqYXJzVmVjdG9yLnNpemUoKV07Ci0JCWphcnNWZWN0b3IuY29weUludG8oamFycyk7Ci0JCXJldHVybiBqYXJzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoRm9yV2ViUHJvamVjdCgKLQkJSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViUHJvamVjdCwKLQkJYm9vbGVhbiBpc0RlcGVuZGVudCkgewotCQlTdHJpbmdbXSB3ZWJpbmZDbGFzc2VzID0gZ2V0V0VCSU5GQ2xhc3Nlcyh3ZWJQcm9qZWN0KTsKLQkJU3RyaW5nW10gd2ViaW5mTGliOwotCQlTdHJpbmdbXSBqYXZhQ2xhc3NwYXRoOwotCQlpZiAoaXNEZXBlbmRlbnQpIHsKLQkJCXdlYmluZkxpYiA9IG5ldyBTdHJpbmdbMF07Ci0JCQlqYXZhQ2xhc3NwYXRoID0gbmV3IFN0cmluZ1swXTsKLQkJfSBlbHNlIHsKLQkJCXdlYmluZkxpYiA9IGdldFdFQklORkxpYih3ZWJQcm9qZWN0KTsKLQkJCWphdmFDbGFzc3BhdGggPQotCQkJCWdldENsYXNzcGF0aEZvckphdmFQcm9qZWN0KHdlYlByb2plY3QuZ2V0SjJFRUphdmFQcm9qZWN0KCkpOwotCQl9Ci0JCVN0cmluZ1tdIHdlYkNsYXNzcGF0aCA9Ci0JCQluZXcgU3RyaW5nW3dlYmluZkNsYXNzZXMubGVuZ3RoCi0JCQkJKyB3ZWJpbmZMaWIubGVuZ3RoCi0JCQkJKyBqYXZhQ2xhc3NwYXRoLmxlbmd0aF07Ci0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd2ViaW5mQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJd2ViQ2xhc3NwYXRoW2luZGV4XSA9IHdlYmluZkNsYXNzZXNbaV07Ci0JCQlpbmRleCsrOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd2ViaW5mTGliLmxlbmd0aDsgaSsrKSB7Ci0JCQl3ZWJDbGFzc3BhdGhbaW5kZXhdID0gd2ViaW5mTGliW2ldOwotCQkJaW5kZXgrKzsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGphdmFDbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCXdlYkNsYXNzcGF0aFtpbmRleF0gPSBqYXZhQ2xhc3NwYXRoW2ldOwotCQkJaW5kZXgrKzsKLQkJfQotCQlyZXR1cm4gd2ViQ2xhc3NwYXRoOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0V0VCSU5GQ2xhc3NlcyhKMkVFV2ViTmF0dXJlUnVudGltZSB3ZWJQcm9qZWN0KSB7Ci0JCUlQYXRoIHdlYmluZiA9Ci0JCQl3ZWJQcm9qZWN0Ci0JCQkJLmdldFByb2plY3QoKQotCQkJCS5nZXRMb2NhdGlvbigpCi0JCQkJLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkKLQkJCQkuYXBwZW5kKAotCQkJCXdlYlByb2plY3QuZ2V0V0VCSU5GUGF0aCgpKTsKLQkJSVBhdGggY2xhc3NlcyA9Ci0JCQkoKElQYXRoKSB3ZWJpbmYuY2xvbmUoKSkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQoRElSX0NMQVNTRVMpOwotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgcGF0aDJTdHJpbmcoY2xhc3Nlcyl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0V0VCSU5GTGliKEoyRUVXZWJOYXR1cmVSdW50aW1lIHdlYlByb2plY3QpIHsKLQkJSVBhdGggd2ViaW5mID0KLQkJCXdlYlByb2plY3QKLQkJCQkuZ2V0UHJvamVjdCgpCi0JCQkJLmdldExvY2F0aW9uKCkKLQkJCQkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKQotCQkJCS5hcHBlbmQoCi0JCQkJd2ViUHJvamVjdC5nZXRXRUJJTkZQYXRoKCkpOwotCQlJUGF0aCBsaWIgPQotCQkJKChJUGF0aCkgd2ViaW5mLmNsb25lKCkpCi0JCQkJLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkKLQkJCQkuYXBwZW5kKERJUl9MSUIpCi0JCQkJLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCXJldHVybiBnZXREaXJlY3RvcnlKYXJGaWxlcyhsaWIpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoRm9ySmF2YVByb2plY3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCVN0cmluZ1tdIGphdmFCdWlsZFBhdGg7Ci0JCXRyeSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBidWlsZFBhdGggPQotCQkJCWphdmFQcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1aWxkUGF0aC5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZ1tdIGJ1aWxkUGF0aFN0cmluZyA9Ci0JCQkJCWNsYXNzcGF0aEVudHJ5MlN0cmluZygKLQkJCQkJCWJ1aWxkUGF0aFtpXSwKLQkJCQkJCWphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBidWlsZFBhdGhTdHJpbmcubGVuZ3RoOyBqKyspIHsKLQkJCQkJdi5hZGQoYnVpbGRQYXRoU3RyaW5nW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCQlqYXZhQnVpbGRQYXRoID0gbmV3IFN0cmluZ1t2LnNpemUoKV07Ci0JCQl2LmNvcHlJbnRvKGphdmFCdWlsZFBhdGgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQlqYXZhQnVpbGRQYXRoID0gbmV3IFN0cmluZ1swXTsKLQkJfQotCi0JCVN0cmluZ1tdIGVhckNsYXNzcGF0aDsKLQkJVmVjdG9yIHV0aWxpdHlKYXJzVmVjdG9yID0gbmV3IFZlY3RvcigpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQlJUHJvamVjdFtdIHJlZmVyZW5jaW5nUHJvamVjdHMgPSBwcm9qZWN0LmdldFJlZmVyZW5jaW5nUHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2luZ1Byb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFQVJOYXR1cmVSdW50aW1lIGVhclByb2plY3QgPQotCQkJCWNhc3RUb0VBUlByb2plY3QocmVmZXJlbmNpbmdQcm9qZWN0c1tpXSk7Ci0JCQlpZiAoZWFyUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gdXRpbGl0eUphcnMgPSBnZXRDbGFzc3BhdGhGb3JFQVJQcm9qZWN0KGVhclByb2plY3QpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdXRpbGl0eUphcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJdXRpbGl0eUphcnNWZWN0b3IuYWRkKHV0aWxpdHlKYXJzW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWFyQ2xhc3NwYXRoID0gbmV3IFN0cmluZ1t1dGlsaXR5SmFyc1ZlY3Rvci5zaXplKCldOwotCQl1dGlsaXR5SmFyc1ZlY3Rvci5jb3B5SW50byhlYXJDbGFzc3BhdGgpOwotCi0JCVN0cmluZ1tdIGphdmFDbGFzc3BhdGggPQotCQkJbmV3IFN0cmluZ1tqYXZhQnVpbGRQYXRoLmxlbmd0aCArIGVhckNsYXNzcGF0aC5sZW5ndGhdOwotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGphdmFCdWlsZFBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCWphdmFDbGFzc3BhdGhbaW5kZXhdID0gamF2YUJ1aWxkUGF0aFtpXTsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJDbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCWphdmFDbGFzc3BhdGhbaW5kZXhdID0gZWFyQ2xhc3NwYXRoW2ldOwotCQkJaW5kZXgrKzsKLQkJfQotCQlyZXR1cm4gamF2YUNsYXNzcGF0aDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNsYXNzcGF0aEVudHJ5MlN0cmluZygKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5LAotCQlJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgcGF0aDJTdHJpbmcoZW50cnkuZ2V0UGF0aCgpKX07Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6Ci0JCQkJcmV0dXJuIGdldENsYXNzcGF0aCgKLQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotCQkJCQkJZW50cnkuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCkpLAotCQkJCQl0cnVlKTsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgotCQkJCXsKLQkJCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJaWYgKHBhdGguc2VnbWVudCgwKS5lcXVhbHMocHJvamVjdC5nZXROYW1lKCkpKQotCQkJCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQlwYXRoMlN0cmluZygKLQkJCQkJCQlwcm9qZWN0Ci0JCQkJCQkJCS5nZXRMb2NhdGlvbigpCi0JCQkJCQkJCS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpCi0JCQkJCQkJCS5hcHBlbmQoCi0JCQkJCQkJCXBhdGgpKX07Ci0JCQkJfQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDoKLQkJCQlyZXR1cm4gY2xhc3NwYXRoRW50cnkyU3RyaW5nKAotCQkJCQlKYXZhQ29yZS5nZXRSZXNvbHZlZENsYXNzcGF0aEVudHJ5KGVudHJ5KSwKLQkJCQkJcHJvamVjdCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgcGF0aDJTdHJpbmcoZW50cnkuZ2V0UGF0aCgpKX07Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwYXRoMlN0cmluZyhJUGF0aCBwYXRoKSB7Ci0JCXJldHVybiBwYXRoLnRvT1NTdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91dGlsL0ZpbGVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91dGlsL0ZpbGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZDliMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdXRpbC9GaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLQotcHVibGljIGNsYXNzIEZpbGVVdGlsCi17Ci0gIHB1YmxpYyBGaWxlVXRpbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzcmMsIFN0cmluZyBkZXN0KQotICB7Ci0gICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjKTsKLSAgICAgIGJ5dGUgYnVmZltdID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKLSAgICAgIGludCBjID0gMDsKLSAgICAgIGJ5dGVbXSBhcnJheSA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgd2hpbGUgKChjID0gaXMucmVhZChhcnJheSkpID49IDApCi0gICAgICB7Ci0gICAgICAgIGZvcy53cml0ZShhcnJheSwgMCwgYyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZm9zLmNsb3NlKCk7Ci0gICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZUZpbGVBbmRQYXJlbnREaXJlY3RvcmllcyhTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLSAgICBGaWxlIHBhcmVudCA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAgIGlmICghcGFyZW50LmV4aXN0cygpKQotICAgIHsKLSAgICAgIHBhcmVudC5ta2RpcnMoKTsKLSAgICB9Ci0gICAgZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgcmV0dXJuIGZpbGU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3JpZXMoRmlsZSBkaXIpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIEZpbGVbXSBjaGlsZHJlbiA9IGRpci5saXN0RmlsZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChjaGlsZHJlbltpXS5saXN0KCkgIT0gbnVsbCAmJiBjaGlsZHJlbltpXS5saXN0KCkubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgZGVsZXRlRGlyZWN0b3JpZXMoY2hpbGRyZW5baV0pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjaGlsZHJlbltpXS5kZWxldGUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZGlyLmRlbGV0ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBmb2xkZXIgYW5kIGFsbCBwYXJlbnQgZm9sZGVycyBpZiBub3QgZXhpc3RpbmcgUHJvamVjdCBtdXN0IGV4aXN0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRm9sZGVyKElGb2xkZXIgZm9sZGVyLCBib29sZWFuIGZvcmNlLCBib29sZWFuIGxvY2FsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCFmb2xkZXIuZXhpc3RzKCkpCi0gICAgewotICAgICAgSUNvbnRhaW5lciBwYXJlbnQgPSBmb2xkZXIuZ2V0UGFyZW50KCk7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUZvbGRlcikKLSAgICAgIHsKLSAgICAgICAgY3JlYXRlRm9sZGVyKChJRm9sZGVyKXBhcmVudCwgZm9yY2UsIGxvY2FsKTsKLSAgICAgIH0KLSAgICAgIGZvbGRlci5jcmVhdGUoZm9yY2UsIGxvY2FsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlVGFyZ2V0RmlsZShTdHJpbmcgc291cmNlRmlsZU5hbWUsIFN0cmluZyB0YXJnZXRGaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgY3JlYXRlVGFyZ2V0RmlsZShzb3VyY2VGaWxlTmFtZSwgdGFyZ2V0RmlsZU5hbWUsIGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVUYXJnZXRGaWxlKFN0cmluZyBzb3VyY2VGaWxlTmFtZSwgU3RyaW5nIHRhcmdldEZpbGVOYW1lLCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZSBpZGVhbFJlc3VsdEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRGaWxlTmFtZSk7Ci0gICAgaWYgKG92ZXJ3cml0ZSB8fCAhaWRlYWxSZXN1bHRGaWxlLmV4aXN0cygpKQotICAgIHsKLSAgICAgIEZpbGVVdGlsLmNyZWF0ZUZpbGVBbmRQYXJlbnREaXJlY3Rvcmllcyh0YXJnZXRGaWxlTmFtZSk7Ci0gICAgICBGaWxlVXRpbC5jb3B5RmlsZShzb3VyY2VGaWxlTmFtZSwgdGFyZ2V0RmlsZU5hbWUpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdXRpbC9QbGF0Zm9ybVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91dGlsL1BsYXRmb3JtVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxMWUyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91dGlsL1BsYXRmb3JtVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybVV0aWxzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1JPT1QgPSAicGxhdGZvcm06L3Jlc291cmNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5fRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExOWF9GSUxFX1BST1RPQ09MID0gImZpbGU6Ly8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNID0gInBsYXRmb3JtIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRSA9ICIvcmVzb3VyY2UiOwotCi0JcHJpdmF0ZSBQbGF0Zm9ybVV0aWxzKCkgewotCX0KLQotCS8qKgotCSogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHBsYXRmb3JtIFVSTCBnaXZlbiBhbiBJUGF0aAotCSogQHBhcmFtIElQYXRoIHBhdGgKLQkqIEByZXR1cm4gU3RyaW5nIHBsYXRmb3JtVVJMCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbGF0Zm9ybVVSTChJUGF0aCBwYXRoKSB7Ci0JCVN0cmluZyBwbGF0Zm9ybVVSTDsKLQkJcGxhdGZvcm1VUkwgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShwYXRoLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7Ci0JCS8vIG9sZCBtZXRob2Q6IGZpbGUgc3lzdGVtIHJlcHJlc2VudGF0aW9uCi0JCS8vIAlwbGF0Zm9ybVVSTCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBwbGF0Zm9ybVVSTDsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIFVSTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgUGxhdGZvcm0gVVJMIGdpdmVuIGFuIElQYXRoCi0JKiBUaGUgUGxhdGZvcm1SZXNvdXJjZU1hbmFnZXIgdW5kZXJkc3RhbmRzIHRoaXMgZm9ybWF0IGFuZCB0aGVyZWZvcmUKLQkqIHRoaXMgaXMgc3VpdGVkIGZvciBjb21tYW5kIFVSTCdzCi0JKiBAcGFyYW0gSVBhdGggcGF0aAotCSogQHJldHVybiBVUkwgUGxhdGZvcm0gVVJMCi0JKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRDb21tYW5kUGxhdGZvcm1VUkwoSVBhdGggcGF0aCkgewotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwoUExBVEZPUk0sIG51bGwsIFJFU09VUkNFICsgcGF0aC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBwYXRoIGdpdmVuIHBsYXRmb3JtIFVSTCBzdHJpbmcKLQkqIEBwYXJhbSBTdHJpbmcgcGxhdGZvcm0gVVJMIHN0cmluZwotCSogQHJldHVybiBTdHJpbmcgcGF0aCBzdHJpbmcKLQkqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGhGcm9tUGxhdGZvcm0oU3RyaW5nIHBsYXRmb3JtU3RyKSB7Ci0JCVN0cmluZyBwYXRoU3RyID0gcGxhdGZvcm1TdHI7Ci0KLQkJU3RyaW5nIHJvb3RMb2NhdGlvbjsKLQkJcm9vdExvY2F0aW9uID0gUExBVEZPUk1fUk9PVDsKLQkJLy8gb2xkIG1ldGhvZDogZmlsZSBzeXN0ZW0gcmVwcmVzZW50YXRpb24KLQkJLy8Jcm9vdExvY2F0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCWlmIChwbGF0Zm9ybVN0ci5zdGFydHNXaXRoKHJvb3RMb2NhdGlvbikpCi0JCQlwYXRoU3RyID0gcGxhdGZvcm1TdHIuc3Vic3RyaW5nKHJvb3RMb2NhdGlvbi5sZW5ndGgoKSk7Ci0JCXJldHVybiBwYXRoU3RyOwotCX0KLQotCS8qKgotCSogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHBsYXRmb3JtIFVSTCBnaXZlbiB0aGUgcGF0aCBzdHJpbmcKLQkqIEBwYXJhbSBTdHJpbmcgcGF0aCBzdHJpbmcKLQkqIEByZXR1cm4gU3RyaW5nIHBsYXRmb3JtIFVSTCBzdHJpbmcKLQkqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsYXRmb3JtRnJvbVBhdGgoU3RyaW5nIHBhdGhTdHIpIHsKLQkJU3RyaW5nIHBsYXRmb3JtU3RyID0gcGF0aFN0cjsKLQotCQlTdHJpbmcgcm9vdExvY2F0aW9uOwotCQlyb290TG9jYXRpb24gPSBQTEFURk9STV9ST09UOwotCQkvLyBvbGQgbWV0aG9kOiBmaWxlIHN5c3RlbSByZXByZXNlbnRhdGlvbgotCQkvLwlyb290TG9jYXRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJcGxhdGZvcm1TdHIgPSByb290TG9jYXRpb24gKyBwYXRoU3RyOwotCQlyZXR1cm4gcGxhdGZvcm1TdHI7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxvY2FsIGZpbGUgc3lzdGVtIGZpbGUgZ2l2ZW4gcGxhdGZvcm0gVVJMIHN0cmluZwotCSogQHBhcmFtIFN0cmluZyBwbGF0Zm9ybSBVUkwgc3RyaW5nCi0JKiBAcmV0dXJuIFN0cmluZyBmaWxlIHN0cmluZwotCSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUZyb21QbGF0Zm9ybShTdHJpbmcgcGxhdGZvcm1TdHIpIHsKLQkJU3RyaW5nIGZpbGVTdHIgPSBwbGF0Zm9ybVN0cjsKLQkJU3RyaW5nIHBhdGhTdHIgPSBnZXRQYXRoRnJvbVBsYXRmb3JtKHBsYXRmb3JtU3RyKTsKLQotCQlmaWxlU3RyID0KLQkJCVJlc291cmNlc1BsdWdpbgotCQkJCS5nZXRXb3Jrc3BhY2UoKQotCQkJCS5nZXRSb290KCkKLQkJCQkuZ2V0RmlsZShuZXcgUGF0aChwYXRoU3RyKSkKLQkJCQkuZ2V0TG9jYXRpb24oKQotCQkJCS50b1N0cmluZygpOwotCi0JCS8vIG9sZCBtZXRob2Q6IGZpbGUgc3lzdGVtIHJlcHJlc2VudGF0aW9uCi0JCS8vCURvIG5vdGhpbmcKLQotCQlyZXR1cm4gZmlsZVN0cjsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIGZpbGUgcHJvdG9jb2wgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxvY2FsIGZpbGUgc3lzdGVtIGZpbGUgZ2l2ZW4gcGxhdGZvcm0gVVJMIHN0cmluZwotCSogQHBhcmFtIFN0cmluZyBwbGF0Zm9ybSBVUkwgc3RyaW5nCi0JKiBAcmV0dXJuIFN0cmluZyB0aGUgZmlsZSBwcm90b2NvbCB1cmkKLQkqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVVUkxGcm9tUGxhdGZvcm0oU3RyaW5nIHBsYXRmb3JtU3RyKSB7Ci0JCVN0cmluZyBmaWxlU3RyID0gcGxhdGZvcm1TdHI7Ci0JCVN0cmluZyBwYXRoU3RyID0gZ2V0UGF0aEZyb21QbGF0Zm9ybShwbGF0Zm9ybVN0cik7Ci0JCXRyeSB7Ci0JCQlmaWxlU3RyID0KLQkJCQlSZXNvdXJjZXNQbHVnaW4KLQkJCQkJLmdldFdvcmtzcGFjZSgpCi0JCQkJCS5nZXRSb290KCkKLQkJCQkJLmdldEZpbGUobmV3IFBhdGgocGF0aFN0cikpCi0JCQkJCS5nZXRMb2NhdGlvbigpCi0JCQkJCS50b0ZpbGUoKQotCQkJCQkudG9VUkwoKQotCQkJCQkudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0JCQlmaWxlU3RyID0gZ2V0RmlsZVVSTEZyb21QYXRoKG5ldyBQYXRoKHBhdGhTdHIpKTsKLQkJfQotCQlyZXR1cm4gZmlsZVN0cjsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIGZpbGUgcHJvdG9jb2wgcmVwcmVzZW50YXRpb24gb2YgYSBsb2NhbCBmaWxlCi0JKiBAcGFyYW0gSVBhdGggdGhlIFBhdGggb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZmlsZQotCSogQHJldHVybiBTdHJpbmcgdGhlIGZpbGUgcHJvdG9jb2wgdXJpCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlVVJMRnJvbVBhdGgoSVBhdGggcGF0aCkgewotCi0JCVN0cmluZyBmaWxlID0gbnVsbDsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJCWZpbGUgPQotCQkJCQlSZXNvdXJjZXNQbHVnaW4KLQkJCQkJCS5nZXRXb3Jrc3BhY2UoKQotCQkJCQkJLmdldFJvb3QoKQotCQkJCQkJLmdldEZpbGUocGF0aCkKLQkJCQkJCS5nZXRMb2NhdGlvbigpCi0JCQkJCQkudG9TdHJpbmcoKTsKLQkJCQlpZiAoZmlsZS5jaGFyQXQoMCkgPT0gSVBhdGguU0VQQVJBVE9SKSB7Ci0JCQkJCWZpbGUgPSBMTlhfRklMRV9QUk9UT0NPTCArIGZpbGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmlsZSA9IFdJTl9GSUxFX1BST1RPQ09MICsgZmlsZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZpbGUgPSBwYXRoLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuY2hhckF0KDApID09IElQYXRoLlNFUEFSQVRPUikgewotCQkJCWZpbGUgPSBMTlhfRklMRV9QUk9UT0NPTCArIGZpbGU7Ci0JCQl9IGVsc2UgewotCQkJCWZpbGUgPSBXSU5fRklMRV9QUk9UT0NPTCArIGZpbGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGUgPT0gbnVsbCA/IG51bGwgOiBmaWxlOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdXRpbC9XU0RMVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3V0aWwvV1NETFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzUxOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdXRpbC9XU0RMVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udXRpbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMud3NkbC50b0phdmEuVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGouV1NETEZhY3RvcnlJbXBsOwotCi1wdWJsaWMgY2xhc3MgV1NETFV0aWxzIHsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UID0gIi4iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBU0ggPSAiLyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9TVUZGSVggPSAiOi8vIjsKLQotICAvKioKLSAgICogVG9rZW5zIGluIGEgbmFtZXNwYWNlIHRoYXQgYXJlIHRyZWF0ZWQgYXMgcGFja2FnZSBuYW1lIHBhcnQgc2VwYXJhdG9ycy4KLSAgICogVXNlZCBieSBub3JtYWxpemVQYWNrYWdlTmFtZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBwa2dTZXBhcmF0b3JzID0geyAnOicsICdcXCcsICcvJyB9OwotCi0gIC8qKgotICAqIFRoZXNlIGFyZSBqYXZhIGtleXdvcmRzIGFzIHNwZWNpZmllZCBhdCB0aGUgZm9sbG93aW5nIFVSTCAoc29ydGVkIGFscGhhYmV0aWNhbGx5KS4KLSAgKiBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvbGV4aWNhbC5kb2MuaHRtbCMyMjkzMDgKLSAgKiBOb3RlIHRoYXQgZmFsc2UsIHRydWUsIGFuZCBudWxsIGFyZSBub3Qgc3RyaWN0bHkga2V5d29yZHM7IHRoZXkgYXJlIGxpdGVyYWwgdmFsdWVzLAotICAqIGJ1dCBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgYXJyYXksIHRoZXkgY2FuIGJlIHRyZWF0ZWQgYXMgbGl0ZXJhbHMuCi0gICovCi0gIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5d29yZHNbXSA9Ci0gIHsKLSAgICAgICJhYnN0cmFjdCIsICAiYm9vbGVhbiIsICAgICAgImJyZWFrIiwgICAgICAiYnl0ZSIsICAgICAgImNhc2UiLAotICAgICAgImNhdGNoIiwgICAgICJjaGFyIiwgICAgICAgICAiY2xhc3MiLCAgICAgICJjb25zdCIsICAgICAiY29udGludWUiLAotICAgICAgImRlZmF1bHQiLCAgICJkbyIsICAgICAgICAgICAiZG91YmxlIiwgICAgICJlbHNlIiwgICAgICAiZXh0ZW5kcyIsCi0gICAgICAiZmFsc2UiLCAgICAgImZpbmFsIiwgICAgICAgICJmaW5hbGx5IiwgICAgImZsb2F0IiwgICAgICJmb3IiLAotICAgICAgImdvdG8iLCAgICAgICJpZiIsICAgICAgICAgICAiaW1wbGVtZW50cyIsICJpbXBvcnQiLCAgICAiaW5zdGFuY2VvZiIsCi0gICAgICAiaW50IiwgICAgICAgImludGVyZmFjZSIsICAgICJsb25nIiwgICAgICAgIm5hdGl2ZSIsICAgICJuZXciLAotICAgICAgIm51bGwiLCAgICAgICJwYWNrYWdlIiwgICAgICAicHJpdmF0ZSIsICAgICJwcm90ZWN0ZWQiLCAicHVibGljIiwKLSAgICAgICJyZXR1cm4iLCAgICAic2hvcnQiLCAgICAgICAgInN0YXRpYyIsICAgICAic3RyaWN0ZnAiLCAgInN1cGVyIiwKLSAgICAgICJzd2l0Y2giLCAgICAic3luY2hyb25pemVkIiwgInRoaXMiLCAgICAgICAidGhyb3ciLCAgICAgInRocm93cyIsCi0gICAgICAidHJhbnNpZW50IiwgInRydWUiLCAgICAgICAgICJ0cnkiLCAgICAgICAgInZvaWQiLCAgICAgICJ2b2xhdGlsZSIsCi0gICAgICAid2hpbGUiCi0gIH07Ci0KLSAgLyoqIENvbGxhdG9yIGZvciBjb21wYXJpbmcgdGhlIHN0cmluZ3MgKi8KLSAgc3RhdGljIGZpbmFsIENvbGxhdG9yIGVuZ2xpc2hDb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5FTkdMSVNIKTsKLQotICAvKiogVXNlIHRoaXMgY2hhcmFjdGVyIGFzIHN1ZmZpeCAqLwotICBzdGF0aWMgZmluYWwgY2hhciBrZXl3b3JkUHJlZml4ID0gJ18nOwotCi0gIHByaXZhdGUgV1NETFV0aWxzKCkgewotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlyc3Qgc2VydmljZSBlbGVtZW50IGluIHRoZSBXU0RMIGRlZmluaXRpb24uCi0gICogQHJldHVybiBTdHJpbmcgc2VydmljZSBlbGVtZW50IG5hbWUKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmljZUVsZW1lbnROYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAJU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgCXJldHVybiBzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwb3J0IHR5cGUgZWxlbWVudCBwb2ludHMgdG8gYnkgdGhlIGZpcnN0IHNlcnZpY2UgYW5kIHBvcnQgZWxlbWVudCBpbiB0aGUgV1NETCBkZWZpbml0aW9uLgotICAqIEByZXR1cm4gU3RyaW5nIHBvcnQgdHlwZSBlbGVtZW50IG5hbWUKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UG9ydFR5cGVOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAJU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZpY2UuZ2V0UG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyAKLSAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLnNpemUoKTtpKyspIHsKLSAgICAgICAgaWYgKHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuZ2V0KGkpIGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHsKLSAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgIHJldHVybiBiaW5kaW5nLmdldFBvcnRUeXBlKCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIAotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBlbGVtZW50IGluIHRoZSBXU0RMIGRlZmluaXRpb24uCi0gICogQHJldHVybiBTdHJpbmcgcG9ydCBuYW1lCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBvcnROYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAJU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZpY2UuZ2V0UG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyAKLSAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLnNpemUoKTtpKyspIHsKLSAgICAgICAgaWYgKHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuZ2V0KGkpIGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIAotICAgICAgICAgIHJldHVybiBwb3J0LmdldE5hbWUoKTsKLSAgICAgIH0gIAotICAgIH0KLSAgICAgcmV0dXJuICIiOwotICB9Ci0KLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VOYW1lc3BhY2UgKFN0cmluZyBjbHNOYW1lKSB7Ci0JICByZXR1cm4gbWFrZU5hbWVzcGFjZShjbHNOYW1lLCAiaHR0cCIpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ha2UgbmFtZXNwYWNlIGZyb20gYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgKiBhbmQgdGhlIGdpdmVuIHByb3RvY29sCi0gICAqCi0gICAqIEBwYXJhbSBjbHNOYW1lIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAqIEBwYXJhbSBwcm90b2NvbCBwcm90b2NvbCBTdHJpbmcKLSAgICogQHJldHVybiBuYW1lc3BhY2UgbmFtZXNwYWNlIFN0cmluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZU5hbWVzcGFjZSAoU3RyaW5nIGNsc05hbWUsIFN0cmluZyBwcm90b2NvbCkgewotCSAgaWYgKGNsc05hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkKLQkJICByZXR1cm4gcHJvdG9jb2wgKyAiOi8vIiArICJEZWZhdWx0TmFtZXNwYWNlIjsKLQkgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNsc05hbWUuc3Vic3RyaW5nKDAsIGNsc05hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0JICByZXR1cm4gbWFrZU5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSwgcHJvdG9jb2wpOyAgICAgICAKLSAgfQotCi0gICAgCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlTmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHByb3RvY29sKSB7Ci0JICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5lcXVhbHMoIiIpKQotCQkgIHJldHVybiBwcm90b2NvbCArICI6Ly8iICsgIkRlZmF1bHROYW1lc3BhY2UiOwotCSAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplciggcGFja2FnZU5hbWUsICIuIiApOwotCSAgU3RyaW5nW10gd29yZHMgPSBuZXcgU3RyaW5nWyBzdC5jb3VudFRva2VucygpIF07Ci0JICBmb3IoaW50IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpCi0JCSAgd29yZHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLQotCSAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcig4MCk7Ci0JICBmb3IoaW50IGkgPSB3b3Jkcy5sZW5ndGgtMTsgaSA+PSAwOyAtLWkpIHsKLQkJICBTdHJpbmcgd29yZCA9IHdvcmRzW2ldOwotCQkgIC8vIHNlcGVyYXRlIHdpdGggZG90Ci0JCSAgaWYoIGkgIT0gd29yZHMubGVuZ3RoLTEgKQotCQkJICBzYi5hcHBlbmQoJy4nKTsKLQkJICBzYi5hcHBlbmQoIHdvcmQgKTsKLQkgIH0KLQkgIHJldHVybiBwcm90b2NvbCArICI6Ly8iICsgc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybiBhIERlZmluaXRpb24gZm9yIHRoZSB3c2RsIHVybCBnaXZlbiAKLSAgKgotICAqLwotICBwdWJsaWMgc3RhdGljIERlZmluaXRpb24gZ2V0V1NETERlZmluaXRpb24oU3RyaW5nIHdzZGxVUkwpCi0gIHsKLSAgICBpZih3c2RsVVJMID09IG51bGwpIHJldHVybiBudWxsOwotCi0gICAgV1NETEZhY3Rvcnkgd3NkbEZhY3Rvcnk7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgd3NkbEZhY3RvcnkgPSBuZXcgV1NETEZhY3RvcnlJbXBsKCk7Ci0gICAgICBXU0RMUmVhZGVyIHdzZGxSZWFkZXIgPSB3c2RsRmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICBkZWZpbml0aW9uID0gd3NkbFJlYWRlci5yZWFkV1NETCh3c2RsVVJMKTsKLSAgICB9IAotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeyAvLyBjYW4gYmUgV1NETEV4Y2VwdGlvbiBvciBJT0V4Y2VwdGlvbgotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VVUkkyUGFja2FnZU5hbWUobmFtZXNwYWNlKTsKLSAgICAgfQotICAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZUZvckJpbmRpbmdJbXBsKFBvcnQgcG9ydCwgTWFwIG5zMnBrZ01hcCkKLSAgewotICAgIGlmIChwb3J0ICE9IG51bGwgJiYgbnMycGtnTWFwICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0gICAgICBRTmFtZSBibmRRTmFtZSA9IGJpbmRpbmcuZ2V0UU5hbWUoKTsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBibmRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIE9iamVjdCBwa2cgPSBuczJwa2dNYXAuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgICBpZiAocGtnICE9IG51bGwpCi0gICAgICAgIHJldHVybiAoU3RyaW5nKXBrZzsKLSAgICB9Ci0gICAgcmV0dXJuIGdldFBhY2thZ2VOYW1lRm9yQmluZGluZ0ltcGwocG9ydCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZUZvckJpbmRpbmdJbXBsKERlZmluaXRpb24gZGVmaW5pdGlvbiwgTWFwIG5zMnBrZ01hcCkKLSAgewotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwgJiYgbnMycGtnTWFwICE9IG51bGwpCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBzZXJ2aWNlLmdldFBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICByZXR1cm4gZ2V0UGFja2FnZU5hbWVGb3JCaW5kaW5nSW1wbChwb3J0LCBuczJwa2dNYXApOwotICAgIH0KLSAgICByZXR1cm4gZ2V0UGFja2FnZU5hbWVGb3JCaW5kaW5nSW1wbChkZWZpbml0aW9uKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lRm9yQmluZGluZ0ltcGwoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgUG9ydCBwb3J0ID0gbnVsbDsKLSAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKWRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgIHBvcnQgPSAoUG9ydClzZXJ2aWNlLmdldFBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgfQotICAgIHJldHVybiBnZXRQYWNrYWdlTmFtZUZvckJpbmRpbmdJbXBsKHBvcnQpOwotICB9Ci0KLS8vIFRoaXMgaXMgeWV0IGFub3RoZXIgbmFtaW5nIGFsZ29yaXRobSBiYXNlZCBvbiB3ZWJzZXJ2aWNlcy5qYXIKLS8vIFRoZXkgYWx3YXlzIHVzZSB0aGUgYmluZGluZyBuYW1lc3BhY2UgYXMgdGhlIHBhY2thZ2UgbmFtZQotLy8gb2YgdGhlIEJpbmRpbmdJbXBsIGNsYXNzLgotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVGb3JCaW5kaW5nSW1wbChQb3J0IHBvcnQpCi17Ci0gICBpZiAocG9ydCAhPSBudWxsKQotICAgewotCSAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0vLwkgIFBvcnRUeXBlIHBvcnRUeXBlID0gYmluZGluZy5nZXRQb3J0VHlwZSgpOwotCSAgUU5hbWUgYm5kUU5hbWUgPSBiaW5kaW5nLmdldFFOYW1lKCk7Ci0JICBTdHJpbmcgbmFtZXNwYWNlID0gYm5kUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JICByZXR1cm4gbmFtZXNwYWNlVVJJMlBhY2thZ2VOYW1lKG5hbWVzcGFjZSk7Ci0gICB9Ci0gICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotKiBHZXQgdGhlIG5hbWVzcGFjZSBmb3IgdGhlIFBvcnQgVHlwZQotKiAKLSovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQb3J0VHlwZU5hbWVzcGFjZShEZWZpbml0aW9uIGRlZmluaXRpb24pCi17Ci0gIFN0cmluZyBuYW1lc3BhY2UgPSAiIjsKLSAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgewotCVNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2aWNlLmdldFBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgCi0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKLSAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8cG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5zaXplKCk7aSsrKSB7Ci0gICAgICAgIGlmIChwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLmdldChpKSBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKXsgCi0JICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBwb3J0LmdldEJpbmRpbmcoKS5nZXRQb3J0VHlwZSgpOwotCSAgICAgIFFOYW1lIGJuZFFOYW1lID0gcG9ydFR5cGUuZ2V0UU5hbWUoKTsKLQkgICAgICBuYW1lc3BhY2UgPSBibmRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIAl9ICAKLQkgIH0KLSAgCX0KLSAgfSAgCi0gIHJldHVybiBuYW1lc3BhY2U7Ci19Ci0KLS8vIFRoaXMgaXMgeWV0IGFub3RoZXIgbmFtaW5nIGFsZ29yaXRobSBiYXNlZCBvbiB3ZWJzZXJ2aWNlcy5qYXIKLS8vIFRoZXkgYWx3YXlzIHVzZSB0aGUgcG9ydHR5cGUgbmFtZXNwYWNlIGFzIHRoZSBwYWNrYWdlIG5hbWUKLS8vIG9mIHRoZSBKYXZhIGNsYXNzIChpbiBlamIpLgotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVGb3JQb3J0VHlwZShEZWZpbml0aW9uIGRlZmluaXRpb24pCi17Ci0gICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgewotCSAgU3RyaW5nIG5hbWVzcGFjZSA9IGdldFBvcnRUeXBlTmFtZXNwYWNlKGRlZmluaXRpb24pOwotCSAgcmV0dXJuIG5hbWVzcGFjZVVSSTJQYWNrYWdlTmFtZShuYW1lc3BhY2UpOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci19Ci0KLSAgLyoqCi0gICogY2hlY2tzIGlmIHRoZSBpbnB1dCBzdHJpbmcgaXMgYSB2YWxpZCBqYXZhIGtleXdvcmQuCi0gICogQHJldHVybiBib29sZWFuIHRydWUvZmFsc2UKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUtleXdvcmQoU3RyaW5nIGtleXdvcmQpIHsKLSAgICByZXR1cm4gKEFycmF5cy5iaW5hcnlTZWFyY2goa2V5d29yZHMsIGtleXdvcmQsIGVuZ2xpc2hDb2xsYXRvcikgPj0gMCk7Ci0gIH0KLQotICAvKioKLSAgKiBUdXJuIGEgamF2YSBrZXl3b3JkIHN0cmluZyBpbnRvIGEgbm9uLUphdmEga2V5d29yZCBzdHJpbmcuICAoUmlnaHQgbm93Ci0gICogdGhpcyBzaW1wbHkgbWVhbnMgYXBwZW5kaW5nIGFuIHVuZGVyc2NvcmUuKQotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlTm9uSmF2YUtleXdvcmQoU3RyaW5nIGtleXdvcmQpewotICAgIHJldHVybiAga2V5d29yZFByZWZpeCArIGtleXdvcmQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFBvcnRUeXBlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYmVhbk5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgYmVhbk5hbWUuYXBwZW5kKGdldFBhY2thZ2VOYW1lRm9yUG9ydFR5cGUoZGVmaW5pdGlvbikpOyAKLSAgICBiZWFuTmFtZS5hcHBlbmQoRE9UKTsKLSAgICBiZWFuTmFtZS5hcHBlbmQoZ2V0UG9ydFR5cGVOYW1lKGRlZmluaXRpb24pKTsKLSAgICByZXR1cm4gYmVhbk5hbWUudG9TdHJpbmcoKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIGdldE5hbWUKLSAgICogQHBhcmFtIHVyaSBTdHJpbmcKLSAgICogQHJldHVybiBnZXQgdGhlIGZpbGUgbmFtZSBhZnRlciB0aGUgbGFzdCBcIGFuZCAvCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKFN0cmluZyB1cmkpIHsKLQotCS8vIEdldCBldmVyeXRoaW5nIGFmdGVyIGxhc3Qgc2xhc2ggb3IgYmFja3NsYXNoCi0JaW50IGJzbGFzaCA9IHVyaS5sYXN0SW5kZXhPZigiXFwiKTsKLQlpbnQgc2xhc2ggPSB1cmkubGFzdEluZGV4T2YoIi8iKTsKLQlpbnQgaSA9ICBic2xhc2ggPiBzbGFzaCA/IGJzbGFzaCA6IHNsYXNoOwotCVN0cmluZyBmaWxlTmFtZSA9IHVyaS5zdWJzdHJpbmcoaSsxKS5yZXBsYWNlKCc/JywgJy4nKTsKLQotCXJldHVybiBmaWxlTmFtZTsKLSAgfQotCi0KLS8qKgotICogZ2V0V1NETE5hbWUKLSAqIEBwYXJhbSB1cmkgU3RyaW5nCi0gKiBAcmV0dXJuIGdldCB0aGUgZmlsZSBuYW1lIGFmdGVyIHRoZSBsYXN0IFwgYW5kIC8sIHRyaW1tZWQsIGRlZmF1bHRlZCB0bwotICogICAgICAgICAiZGVmYXVsdC53c2RsIiBpZiB0aGVyZSBpcyBubyBuYW1lLCBhbmQgZW5kaW5nIHdpdGggIi53c2RsIi4KLSAqLwotIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTRExOYW1lKFN0cmluZyB1cmkpIHsKLQotCS8vIEdldCBldmVyeXRoaW5nIGFmdGVyIGxhc3Qgc2xhc2ggb3IgYmFja3NsYXNoIGZyb20gaW5wdXQgVVJJCi0JLy8gd2l0aCBubyB3aGl0ZXNwYWNlLgotCVN0cmluZyBXU0RMTmFtZSA9IGdldE5hbWUodXJpKS50cmltKCk7Ci0KLQkvLyBpZiBlbXB0eSwgcmV0dXJuIHRoZSBkZWZhdWx0ICJkZWZhdWx0LndzZGwiCi0JaWYgKCBXU0RMTmFtZS5lcXVhbHMoICIiICkgKSB7Ci0JCVdTRExOYW1lID0gImRlZmF1bHQud3NkbCI7Ci0JfQotCi0JLy8gbWFrZSBzdXJlIG5hbWUgZW5kcyB3aXRoICIud3NkbCIsIGxvd2VyIGNhc2UuCi0JZWxzZSB7Ci0JCWlmICggISBXU0RMTmFtZS5lbmRzV2l0aCggIi53c2RsIiApICkgewotCQkJaWYgKCBXU0RMTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCAiLndzZGwiICkgKSB7Ci0JCQkJaW50IGxhc3REb3QgPSBXU0RMTmFtZS5sYXN0SW5kZXhPZigiLiIpOwotCQkJCVdTRExOYW1lID0gV1NETE5hbWUuc3Vic3RyaW5nKCAwLCBsYXN0RG90ICkgKyAiLndzZGwiOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJV1NETE5hbWUgPSBXU0RMTmFtZSArICIud3NkbCI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gV1NETE5hbWU7Ci0gfQotCi0gLyoqCi0gICogZ2V0UG9ydFR5cGVOYW1lRnJvbUJlYW5OYW1lCi0gICogQHBhcmFtIGJlYW5uYW1lIFN0cmluZwotICAqIEByZXR1cm4gZ2V0IHRoZSBwb3J0IHR5cGUgbmFtZSBiYXNlZCBvbiB0aGUgYmVhbiBuYW1lCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBvcnRUeXBlTmFtZUZyb21CZWFuTmFtZShTdHJpbmcgYmVhbk5hbWUpIHsKLSAgICByZXR1cm4gYmVhbk5hbWUuc3Vic3RyaW5nKGJlYW5OYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsJCi0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShTZXJ2aWNlIHNlcnZpY2UsIE1hcCBuczJwa2dNYXApCi0gIHsKLSAgICBpZiAoc2VydmljZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBpZiAobnMycGtnTWFwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBwa2cgPSBuczJwa2dNYXAuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChwa2cgIT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gKFN0cmluZylwa2c7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmFtZXNwYWNlVVJJMlBhY2thZ2VOYW1lKG5hbWVzcGFjZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKFBvcnQgcG9ydCwgTWFwIG5zMnBrZ01hcCkKLSAgewotICAgIGlmIChwb3J0ICE9IG51bGwpCi0gICAgICByZXR1cm4gZ2V0UGFja2FnZU5hbWUocG9ydC5nZXRCaW5kaW5nKCksIG5zMnBrZ01hcCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoQmluZGluZyBiaW5kaW5nLCBNYXAgbnMycGtnTWFwKQotICB7Ci0gICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gYmluZGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5zMnBrZ01hcCAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3QgcGtnID0gbnMycGtnTWFwLmdldChuYW1lc3BhY2UpOwotICAgICAgICBpZiAocGtnICE9IG51bGwpCi0gICAgICAgICAgcmV0dXJuIChTdHJpbmcpcGtnOwotICAgICAgfQotICAgICAgcmV0dXJuIG5hbWVzcGFjZVVSSTJQYWNrYWdlTmFtZShuYW1lc3BhY2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShQb3J0VHlwZSBwb3J0VHlwZSwgTWFwIG5zMnBrZ01hcCkKLSAgewotICAgIGlmIChwb3J0VHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBwb3J0VHlwZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5zMnBrZ01hcCAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3QgcGtnID0gbnMycGtnTWFwLmdldChuYW1lc3BhY2UpOwotICAgICAgICBpZiAocGtnICE9IG51bGwpCi0gICAgICAgICAgcmV0dXJuIChTdHJpbmcpcGtnOwotICAgICAgfQotICAgICAgcmV0dXJuIG5hbWVzcGFjZVVSSTJQYWNrYWdlTmFtZShuYW1lc3BhY2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gIiI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBuYW1lc3BhY2VVUkkyUGFja2FnZU5hbWUKLSAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQotICAgKiBAcmV0dXJuIHBhY2thZ2UgbmFtZSBiYXNlZCBvbiBuYW1lc3BhY2UKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVzcGFjZVVSSTJQYWNrYWdlTmFtZShTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gIAkvKioKLSAgCSAqIFRPRE86ICBUaGUgbWFrZVBhY2thZ2VOYW1lIG1ldGhvZCBmcm9tIAotICAJICogb3JnLmFwYWNoZS5heGlzLndzZGwudG9KYXZhLlV0aWxzIGluIGF4aXMtMV8xIGlzIGNhbGxlZCB0byBtYXAgbmFtZXNwYWNlIHRvIHBhY2thZ2UgbmFtZS4gIAotICAJICogVGhpcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYW4gZXh0ZW5zaW9uIHBvaW50IHRvIHBsdWcgaW4gcnVudGltZSBlbWl0dGVyIHNwZWNpZmljIG5hbWVzcGFjZSB0byAKLSAgCSAqIHBhY2thZ2UgbWFwcGluZyBhbGdvcml0aG0gCi0gIAkgKi8KLSAgCXJldHVybiBVdGlscy5tYWtlUGFja2FnZU5hbWUobmFtZXNwYWNlVVJJKTsKLSAgCQotLy8gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcig4MCk7Ci0vLyAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwgJiYgbmFtZXNwYWNlVVJJLmxlbmd0aCgpID4gMCkKLS8vICAgIHsKLS8vICAgICAgU3RyaW5nIGhvc3RuYW1lID0gbnVsbDsKLS8vICAgICAgdHJ5Ci0vLyAgICAgIHsKLS8vICAgICAgICBob3N0bmFtZSA9IG5ldyBVUkwobmFtZXNwYWNlVVJJKS5nZXRIb3N0KCk7Ci0vLyAgICAgIH0KLS8vICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotLy8gICAgICB7Ci0vLyAgICAgICAgaW50IGluZGV4ID0gbmFtZXNwYWNlVVJJLmluZGV4T2YoIjoiKTsKLS8vICAgICAgICBpZiAoaW5kZXggPiAtMSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBob3N0bmFtZSA9IG5hbWVzcGFjZVVSSS5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0vLyAgICAgICAgICBpbmRleCA9IGhvc3RuYW1lLmluZGV4T2YoIi8iKTsKLS8vICAgICAgICAgIGlmIChpbmRleCA+IC0xKQotLy8gICAgICAgICAgICBob3N0bmFtZSA9IGhvc3RuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGVsc2UKLS8vICAgICAgICAgIGhvc3RuYW1lID0gbmFtZXNwYWNlVVJJOwotLy8gICAgICB9Ci0vLyAgICAgIAotLy8JICAvLyBpZiB3ZSBkaWRuJ3QgZmlsZSBhIGhvc3RuYW1lLCBiYWlsCi0vLwkgIGlmIChob3N0bmFtZSA9PSBudWxsKSB7Ci0vLwkJICByZXR1cm4gbnVsbDsKLS8vCSAgfQotLy8KLS8vICAgICAgLy9jb252ZXJ0IGlsbGVnYWwgamF2YSBpZGVudGlmaWVyCi0vLyAgICAgIGhvc3RuYW1lID0gaG9zdG5hbWUucmVwbGFjZSgnLScsICdfJyk7Ci0vLyAgICAgIC8vIHRva2VuaXplIHRoZSBob3N0bmFtZSBhbmQgcmV2ZXJzZSBpdAotLy8gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGhvc3RuYW1lLCAiLiIpOwotLy8gICAgICBTdHJpbmdbXSB3b3JkcyA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07Ci0vLyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpCi0vLyAgICAgICAgd29yZHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLS8vICAgICAgZm9yKGludCBpID0gd29yZHMubGVuZ3RoLTE7IGkgPj0gMDsgLS1pKQotLy8gICAgICB7Ci0vLyAgICAgICAgU3RyaW5nIHdvcmQgPSB3b3Jkc1tpXTsKLS8vICAgICAgICBpZiAoaXNKYXZhS2V5d29yZCh3b3JkKSkKLS8vICAgICAgICAgIHdvcmQgPSBtYWtlTm9uSmF2YUtleXdvcmQod29yZCk7Ci0vLyAgICAgICAgLy8gc2VwZXJhdGUgd2l0aCBkb3QKLS8vICAgICAgICBpZiAoaSAhPSB3b3Jkcy5sZW5ndGgtMSkKLS8vICAgICAgICAgIHNiLmFwcGVuZCgnLicpOwotLy8gICAgICAgIC8vIGNvbnZlcnQgZGlnaXRzIHRvIHVuZGVyc2NvcmVzCi0vLyAgICAgICAgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KHdvcmQuY2hhckF0KDApKSkKLS8vICAgICAgICAgIHNiLmFwcGVuZCgnXycpOwotLy8gICAgICAgICAgc2IuYXBwZW5kKHdvcmQpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gbm9ybWFsaXplUGFja2FnZU5hbWUoc2IudG9TdHJpbmcoKSwgRE9ULmNoYXJBdCgwKSk7Ci0gIH0KLQotICAvKioKLSAgICogbm9ybWFsaXplUGFja2FnZU5hbWUKLSAgICogQHBhcmFtIHBrZwotICAgKiBAcGFyYW0gc2VwYXJhdG9yCi0gICAqIEByZXR1cm4gbm9ybWFsaXplIGEgU3RyaW5nIChwYWNrYWdlIG5hbWUpIGFuZCByZXBhbGNpbmcgCi0gICAqICAgICAgICAgJzonLCAnXFwnLCAnLycgYnkgc2VwYXJhdG9yIChET1QpLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZVBhY2thZ2VOYW1lKFN0cmluZyBwa2csIGNoYXIgc2VwYXJhdG9yKQotICB7Ci0JaWYgKHBrZyA9PSBudWxsKSB7Ci0JCXJldHVybiBwa2c7Ci0JfQotCWZvcihpbnQgaT0wOyBpPHBrZ1NlcGFyYXRvcnMubGVuZ3RoOyBpKyspCi0JICAgcGtnID0gcGtnLnJlcGxhY2UocGtnU2VwYXJhdG9yc1tpXSwgc2VwYXJhdG9yKTsKLQlyZXR1cm4gcGtnOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRG90SW5Qb3J0TmFtZShTdHJpbmcgbmFtZSkgewotCWlmKG5hbWUuaW5kZXhPZigiLiIpPDApCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGJvb2xlYW4gYWZ0ZXJEb3QgPSBmYWxzZTsKLSAgICBmb3IoaW50IGk9MDsgaTxuYW1lLmxlbmd0aCgpOyBpKyspCi0gICAgewotICAgIAlpZihuYW1lLmNoYXJBdChpKT09Jy4nKQotICAgIAl7Ci0gICAgCQlhZnRlckRvdCA9IHRydWU7Ci0gICAgCX0KLSAgICAJZWxzZSBpZihhZnRlckRvdCkKLSAgICAJewotICAgIAkJc2IuYXBwZW5kKG5hbWUuc3Vic3RyaW5nKGksaSsxKS50b1VwcGVyQ2FzZSgpKTsKLSAgICAJCWFmdGVyRG90PWZhbHNlOwotICAgIAl9Ci0gICAgCWVsc2UKLSAgICAJewotICAgIAkJc2IuYXBwZW5kKG5hbWUuY2hhckF0KGkpKTsKLSAgICAJfQotICAgIH0KLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vd3NydC9BeGlzQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vd3NydC9BeGlzQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTUwMWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3dzcnQvQXhpc0NsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2lkZ2V0cy5BeGlzUHJveHlXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5XZWJTZXJ2aWNlQ2xpZW50QXhpc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwudWkud2lkZ2V0cy5XaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlcjsKLQotcHVibGljIGNsYXNzIEF4aXNDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLQotCXByaXZhdGUgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgICAgICAgICAgICAgcHJveHlDb25maWdXaWRnZXRfOwotCXByaXZhdGUgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgICAgICAgICAgICAgbWFwcGluZ3NXaWRnZXRfOwotCXByaXZhdGUgQXhpc1Byb3h5V2lkZ2V0ICAgICAgICAgICAgICAgICAgICAgcHJveHlXaWRnZXRfOwotCXByaXZhdGUgV2lkZ2V0QmluZGluZ1RvV2lkZ2V0RmFjdG9yeUFkYXB0ZXIgYWRhcHRlcl87Ci0JCi0JcHVibGljIEF4aXNDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5KCkKLQl7Ci0JICBhZGFwdGVyXyA9IG5ldyBXaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlciggbmV3IFdlYlNlcnZpY2VDbGllbnRBeGlzVHlwZSgpICk7Ci0JICAKLQkgIHByb3h5Q29uZmlnV2lkZ2V0XyA9IGFkYXB0ZXJfLmdldFdpZGdldCggIkF4aXNDbGllbnRTdGFydCIgKTsKLQkgIHByb3h5V2lkZ2V0XyAgICAgICA9IChBeGlzUHJveHlXaWRnZXQpcHJveHlDb25maWdXaWRnZXRfLmdldFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpLmNyZWF0ZSgpOwotCSAgbWFwcGluZ3NXaWRnZXRfICAgPSBhZGFwdGVyXy5nZXRXaWRnZXQoICJBeGlzQ2xpZW50QmVhbk1hcHBpbmciICk7Ci0JfQotCQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCkgCi0JewotCSAgcmV0dXJuIHByb3h5Q29uZmlnV2lkZ2V0XzsKLQl9Ci0KLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KCBJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcikgCi0JewotCSAgcmV0dXJuIHdpZGdldENvbnRyaWJ1dG9yID09IHByb3h5Q29uZmlnV2lkZ2V0XyAmJiBwcm94eVdpZGdldF8uZ2V0Q3VzdG9taXplQ2xpZW50TWFwcGluZ3MoKSA/IG1hcHBpbmdzV2lkZ2V0XyA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSAKLQl7Ci0JICBhZGFwdGVyXy5yZWdpc3RlckRhdGFNYXBwaW5ncyggZGF0YVJlZ2lzdHJ5ICk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vd3NydC9BeGlzV2ViU2VydmljZUNsaWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vd3NydC9BeGlzV2ViU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWZiMzhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3dzcnQvQXhpc1dlYlNlcnZpY2VDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5BeGlzQ2xpZW50SW5wdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuQXhpc0NsaWVudE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5EZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQ29weUF4aXNKYXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLlJlZnJlc2hQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLlN0dWIyQmVhbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5WYWxpZGF0ZVdTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc0NsaWVudENvbW1hbmRzRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2lkZ2V0cy5BeGlzQ2xpZW50RnJhZ21lbnQuTWFwcGluZ0ZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW5mbzsKLQotcHVibGljIGNsYXNzIEF4aXNXZWJTZXJ2aWNlQ2xpZW50IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50Ci17CQkKLQotCXB1YmxpYyBBeGlzV2ViU2VydmljZUNsaWVudChXZWJTZXJ2aWNlQ2xpZW50SW5mbyBpbmZvKQotCXsKLQkJc3VwZXIoaW5mbyk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYXNzZW1ibGUoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsCi0JCQlJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcikKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRldmVsb3AoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcikKLQl7Ci0JCVZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzQ2xpZW50SW5wdXRDb21tYW5kKHRoaXMsIGN0eCwgbW9kdWxlKSk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kKCkpOwotLy8JCWNvbW1hbmRzLmFkZChuZXcgU2ltcGxlRnJhZ21lbnQoIkF4aXNDbGllbnRTdGFydCIpKTsKLS8vCQljb21tYW5kcy5hZGQobmV3IFNpbXBsZUZyYWdtZW50KCJBeGlzQ2xpZW50QmVhbk1hcHBpbmciKSk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZCgpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBDb3B5QXhpc0phckNvbW1hbmQoKSk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2soKSk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQoKSk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgVmFsaWRhdGVXU0RMQ29tbWFuZCgpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBXU0RMMkphdmFDb21tYW5kKCkpOwotCQljb21tYW5kcy5hZGQobmV3IFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBTdHViMkJlYW5Db21tYW5kKCkpOwotCQljb21tYW5kcy5hZGQobmV3IEJ1aWxkUHJvamVjdENvbW1hbmQoKSk7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCX0KLQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcikKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSkgCi0JewotCQkvLyBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50SW5wdXRDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLAotCQkJCW5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0vLwkJcmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFJ1bnRpbWUiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRSdW50aW1lSUQiLAotLy8JCQkJbnVsbCk7Ci0vLwkJcmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLS8vCQlyZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLS8vCQkJCSJDbGllbnRQcm9qZWN0RUFSIiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50SW5wdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkwiLCBudWxsKTsgLy8gVVJJCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0bwotCQkvLyBVUkwKLQkJLy8gdHJhbnNmb3JtZXIKLQkJLy8gcmVxJ2Q/PwotLy8JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0UHJveHlTZWxlY3RlZCIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLS8vCQkJCSJUZXN0UHJveHlTZWxlY3RlZCIsIG51bGwpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnRJbnB1dENvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXIiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotLy8JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc0NsaWVudFNjZW5hcmlvIiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50SW5wdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0JCS8vIERlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQoKQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmNsYXNzKTsgLy9PSwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkwiLCBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmNsYXNzLCAiV3NkbFNlcnZpY2VVUkwiLCBudWxsKTsgLy9PSwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5jbGFzcyk7IC8vT0sKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDdXN0b21pemVDbGllbnRNYXBwaW5ncyIsIE1hcHBpbmdGcmFnbWVudC5jbGFzcyApOyAgICAKLQkJLy9yZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLQkJLy8gIlNlcnZpY2VQcm9qZWN0IiwKLQkJLy8gQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQuY2xhc3MpOwotCQkvL3JlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLAotCQkvLyAiRUpCUHJvamVjdE5hbWUiLAotCQkvLyBDcmVhdGVXZWJQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0JCS8vIENvcHlBeGlzSmFyQ29tbWFuZCgpCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIENvcHlBeGlzSmFyQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBudWxsKTsKLQkJLy8gQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2soKQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzay5jbGFzcywgIlByb2plY3QiLCBudWxsKTsKLQkJLy8gRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQoKSAvLyBqYXZhUGFyYW1fLCBtb2RlbF8KLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZC5jbGFzcywgIlByb3h5UHJvamVjdCIsCi0JCQkJbnVsbCk7Ci0JCS8vCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkwiLAotCQkvLyBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZC5jbGFzcywiV1NETFNlcnZpY2VQYXRobmFtZSIsbnVsbCk7Ci0JCS8vIC8vCi0JCS8vIFVSTCB0byBVUkw/PwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkwiLCBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZC5jbGFzcywgIldTRExTZXJ2aWNlVVJMIiwgbnVsbCk7IC8vIFVSSQotCQkvLyB0bwotCQkvLyBVUkw/PwotCQkvLyBWYWxpZGF0ZVdTRExDb21tYW5kKCkKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgVmFsaWRhdGVXU0RMQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFNlcnZpY2VVUkwiLCBWYWxpZGF0ZVdTRExDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIFZhbGlkYXRlV1NETENvbW1hbmQuY2xhc3MpOwotCQkvLyBXU0RMMkphdmFDb21tYW5kKCkgLy8gamF2YVBhcmFtXwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJMIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBudWxsKTsgLy8gVVJMCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFVSST8/Ci0JCS8vIFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIFJlZnJlc2hQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBudWxsKTsKLQkJLy8gU3R1YjJCZWFuQ29tbWFuZCgpCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFN0dWIyQmVhbkNvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgU3R1YjJCZWFuQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIFN0dWIyQmVhbkNvbW1hbmQuY2xhc3MpOwotCQkvLyBCdWlsZFByb2plY3RDb21tYW5kKCkKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQnVpbGRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBudWxsKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJGb3JjZUJ1aWxkIiwgQnVpbGRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVmFsaWRhdGlvbk1hbmFnZXIiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLQkJCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoU3R1YjJCZWFuQ29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIEF4aXNDbGllbnRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIiwgbnVsbCk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEF4aXNDbGllbnRDb21tYW5kc0ZyYWdtZW50LmNsYXNzKTsKLS8vCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLS8vCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNldEVuZHBvaW50TWV0aG9kIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYjU5ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXdzcy1heGlzLXVpLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2QxZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5kaXNjb3ZlcnkuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3Qud3NkbDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlcjwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGZmYThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXNvdXJjZS53c3MtYXhpcy11aS5qYXIgPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSB3c3MtYXhpcy11aS5qYXIsXAotICAgICAgICAgICAgICAgZGVwbG95LnhzbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZGVwbG95LnhzbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvZGVwbG95LnhzbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvZGVwbG95LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkZjE2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL2RlcGxveS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIHZlcnNpb249IjEuMCIKLSAgICB4bWxuczp4YWxhbj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCi0gICAgeG1sbnM6bnMxPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvYXhpcy93c2RkLyIKLSAgICB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcvYXhpcy93c2RkL3Byb3ZpZGVycy9qYXZhIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgZW5jb2Rpbmc9IlVURi04Ii8+Ci0gIAotICAgPHhzbDpwYXJhbSBuYW1lPSJuZXdDbGFzc05hbWUiIHNlbGVjdD0ic3MiLz4KLSAgIAotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9uczE6ZGVwbG95bWVudC9uczE6c2VydmljZS9uczE6cGFyYW1ldGVyW0BuYW1lPSdjbGFzc05hbWUnXSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPmNsYXNzTmFtZTwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAJIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4gCQotICAJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5ld0NsYXNzTmFtZSIvPiAgCSAJCi0gICAgICAgCSA8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgCTx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgICAJPC94c2w6Y29weT4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJAKnxub2RlKCkiPgotICAgIAk8eHNsOmNvcHk+Ci0gICAgCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgIAk8L3hzbDpjb3B5PgotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDRkZDcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWJzZXJ2aWNlIEF4aXMgQ3JlYXRpb24gVUkKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi1MQUJFTF9SVU5USU1FX0FYSVNfMTE9QXBhY2hlIEF4aXMgMS4xCi1ERVNDX1JVTlRJTUVfQVhJU18xMT1BcGFjaGUgQXhpcyAxLjEKLQotIwotI1dTV1NETEF4aXNUeXBlCi0jCi1XU19OQU1FX1dTRExBWElTPVNrZWxldG9uIEphdmEgYmVhbiBBeGlzIFdlYiBzZXJ2aWNlCi0KLSMKLSNXU0JlYW5BeGlzVHlwZQotIwotV1NfTkFNRV9CRUFOQVhJUz1KYXZhIGJlYW4gQXhpcyBXZWIgc2VydmljZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2Y1ODhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIG5hbWU9IiVQTFVHSU5fTkFNRSIKLSAgIHByb3ZpZGVyLW5hbWU9IiVQTFVHSU5fUFJPVklERVIiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0id3NzLWF4aXMtdWkuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8IS0tIFdlYiBTZXJ2aWNlIFNlcnZlciBUeXBlcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUiPgotCi0gICAgICA8d2ViU2VydmljZVJ1bnRpbWUKLSAgICAgICAgICAgIGxhYmVsPSIlTEFCRUxfUlVOVElNRV9BWElTXzExIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVERVNDX1JVTlRJTUVfQVhJU18xMSIKLSAgICAgICAgICAgIGlzRGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBqMmVldmVyc2lvbj0iMTMgMTQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIj4KLSAgICAgIDwvd2ViU2VydmljZVJ1bnRpbWU+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjMyIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4zMi5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQzMl9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MC5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ0MF9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MS5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ0MV9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+IAotCi0gICAgICA8d2ViU2VydmljZVNlcnZlcgotICAgICAgICAgICAgZmFjdG9yeUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCIKLSAgICAgICAgICAgIGlzRGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAucnVudGltZSIKLSAgICAgICAgICAgIGlkPSJTRVJWRVJfSURfVE9NQ0FUNTBfTE9DQUwiPiAgCi0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+ICAgIAotCi0gICAgICA8d2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gICAgICAgICAgICByZXF1aXJlRUpCTW9kdWxlPSJmYWxzZSIKLSAgICAgICAgICAgIHJlcXVpcmVXZWJNb2R1bGU9InRydWUiCi0gICAgICAgICAgICBuYW1lPSIlV1NfTkFNRV9CRUFOQVhJUyIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLmphdmEiCi0gICAgICAgICAgICBydW50aW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiCi0gICAgICAgICAgICBhc3NlbWJseUJpbmRpbmc9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC5iZWFucy5XU0JlYW5BeGlzVHlwZSIKLSAgICAgICAgICAgIHNlcnZlcj0iU0VSVkVSX0lEX1RPTUNBVDUwX0xPQ0FMIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC5iZWFucy5XU0JlYW5BeGlzVHlwZS5UT01DQVQ1MExPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlPgotCi0gICAgICA8d2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gICAgICAgICAgICByZXF1aXJlRUpCTW9kdWxlPSJmYWxzZSIKLSAgICAgICAgICAgIHJlcXVpcmVXZWJNb2R1bGU9InRydWUiCi0gICAgICAgICAgICBuYW1lPSIlV1NfTkFNRV9XU0RMQVhJUyIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLndzZGwiCi0gICAgICAgICAgICBydW50aW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiCi0gICAgICAgICAgICBhc3NlbWJseUJpbmRpbmc9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC53c2RsLldTV1NETEF4aXNUeXBlIgotICAgICAgICAgICAgc2VydmVyPSJTRVJWRVJfSURfVE9NQ0FUNTBfTE9DQUwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLndzZGwuV1NXU0RMQXhpc1R5cGUuVE9NQ0FUNTBMT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZT4KLQotICAgICAgPHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotICAgICAgICAgICAgcmVxdWlyZUVKQk1vZHVsZT0iZmFsc2UiCi0gICAgICAgICAgICByZXF1aXJlV2ViTW9kdWxlPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVdTX05BTUVfQkVBTkFYSVMiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS5qYXZhIgotICAgICAgICAgICAgcnVudGltZT0ib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIgotICAgICAgICAgICAgYXNzZW1ibHlCaW5kaW5nPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQuYmVhbnMuV1NCZWFuQXhpc1R5cGUiCi0gICAgICAgICAgICBzZXJ2ZXI9IlNFUlZFUl9JRF9UT01DQVQ0MV9MT0NBTCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQuYmVhbnMuV1NCZWFuQXhpc1R5cGUuVE9NQ0FUNDFMT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZT4KLQotICAgICAgPHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotICAgICAgICAgICAgcmVxdWlyZUVKQk1vZHVsZT0iZmFsc2UiCi0gICAgICAgICAgICByZXF1aXJlV2ViTW9kdWxlPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVdTX05BTUVfV1NETEFYSVMiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS53c2RsIgotICAgICAgICAgICAgcnVudGltZT0ib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIgotICAgICAgICAgICAgYXNzZW1ibHlCaW5kaW5nPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQud3NkbC5XU1dTRExBeGlzVHlwZSIKLSAgICAgICAgICAgIHNlcnZlcj0iU0VSVkVSX0lEX1RPTUNBVDQxX0xPQ0FMIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC53c2RsLldTV1NETEF4aXNUeXBlLlRPTUNBVDQxTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLSAgICAgICAgICAgIHJlcXVpcmVFSkJNb2R1bGU9ImZhbHNlIgotICAgICAgICAgICAgcmVxdWlyZVdlYk1vZHVsZT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVXU19OQU1FX0JFQU5BWElTIgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLnR5cGUuamF2YSIKLSAgICAgICAgICAgIHJ1bnRpbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSIKLSAgICAgICAgICAgIGFzc2VtYmx5QmluZGluZz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLmJlYW5zLldTQmVhbkF4aXNUeXBlIgotICAgICAgICAgICAgc2VydmVyPSJTRVJWRVJfSURfVE9NQ0FUNDBfTE9DQUwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLmJlYW5zLldTQmVhbkF4aXNUeXBlLlRPTUNBVDQwTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLSAgICAgICAgICAgIHJlcXVpcmVFSkJNb2R1bGU9ImZhbHNlIgotICAgICAgICAgICAgcmVxdWlyZVdlYk1vZHVsZT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVXU19OQU1FX1dTRExBWElTIgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLnR5cGUud3NkbCIKLSAgICAgICAgICAgIHJ1bnRpbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSIKLSAgICAgICAgICAgIGFzc2VtYmx5QmluZGluZz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLndzZGwuV1NXU0RMQXhpc1R5cGUiCi0gICAgICAgICAgICBzZXJ2ZXI9IlNFUlZFUl9JRF9UT01DQVQ0MF9MT0NBTCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQud3NkbC5XU1dTRExBeGlzVHlwZS5UT01DQVQ0MExPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlPgotCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBTZXJ2ZXIgRGVmYXVsdGVycyAtLT4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnNlcnZlckRlZmF1bHRlciI+Ci0gICAgICA8c2VydmVyRGVmYXVsdGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5BeGlzU2VydmVyRGVmYXVsdGVyIj4KLSAgICAgIDwvc2VydmVyRGVmYXVsdGVyPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlUnVudGltZSI+Ci0gIAk8d2ViU2VydmljZVJ1bnRpbWUKLSAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24uYXhpc1dlYlNlcnZpY2VSVCIKLSAgICBsYWJlbD0iJUxBQkVMX1JVTlRJTUVfQVhJU18xMSIKLSAgICBzZXJ2aWNlVHlwZXM9Im9yZy5lY2xpcHNlLmpzdC53cy5zZXJ2aWNlVHlwZS5qYXZhIG9yZy5lY2xpcHNlLmpzdC53cy5zZXJ2aWNlVHlwZS53c2RsIgotICAgIGNsaWVudFR5cGVzPSJvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50VHlwZS5qYXZhLndlYk9ubHkiCi0gICAgc2VydmxldExldmVscz0iMjMgMjQiCi0gICAgajJlZUxldmVscz0iMTMgMTQiCi0gICAgc2VydmVycz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDAgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLndzcnQuQXhpc1dlYlNlcnZpY2VSdW50aW1lIj4KLSAgCTwvd2ViU2VydmljZVJ1bnRpbWU+Ci0JPC9leHRlbnNpb24+IAotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeSAgIAotICAgICAgICAgICAgIGlkPSJBeGlzQmVhbkNvbmZpZyIKLSAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suQlVDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnMiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLndzcnQuQXhpc0JlYW5Db25maWdXaWRnZXRGYWN0b3J5Ii8+Ci0gICAgPC9leHRlbnNpb24+IAotICAgIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkgICAKLSAgICAgICAgICAgICBpZD0iQXhpc1NrZWxldG9uQ29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5URENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9ycyIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24ud3NydC5BeGlzU2tlbGV0b25Db25maWdXaWRnZXRGYWN0b3J5Ii8+Ci0gICAgPC9leHRlbnNpb24+IAotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpcy9jcmVhdGlvbi91aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NyZWF0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzMxYzdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NyZWF0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLQotIwotIyBFcnJvciBtZXNzYWdlcyB1c2VkIGluIHRoaXMgcGx1Z2luCi0jCi1NU0dfRVJST1JfSU5URVJBTD1JV0FCMDUxMkUgSW50ZXJuYWwgZXJyb3IKLU1TR19FUlJPUl9QUk9KRUNUX1VSTD1JV0FCMDUxNEUgVW5hYmxlIHRvIGdldCBVUkwgZm9yIHByb2plY3QgezB9Ci1NU0dfRVJST1JfUkVBRF9XU0RMPUlXQUIwNTE2RSBFcnJvciBpbiByZWFkaW5nIFdTREwgZmlsZSB7MH0KLU1TR19FUlJPUl9XU0RMX05PX1BPUlQ9SVdBQjA1MThFIFdTREwgZmlsZSBhdCB7MH0gaGFzIG5vIHBvcnQgZWxlbWVudAotTVNHX0VSUk9SX0NBTk5PVF9OT19KQVZBX0JFQU49SVdBQjAwMTVFIEEgSmF2YSBiZWFuIHdhcyBub3Qgc2VsZWN0ZWQKLU1TR19FUlJPUl9OT19QUk9KRUNUPUlXQUIwMDE2RSBBIHByb2plY3Qgd2FzIG5vdCBzZWxlY3RlZAotTVNHX0VSUk9SX0NBTk5PVF9MT0FEX0pBVkFfQkVBTj1JV0FCMDAxN0UgVGhlIEphdmEgYmVhbiwgezB9LCBjYW5ub3QgYmUgbG9hZGVkIGZyb20gezF9Ci1NU0dfRVJST1JfSkFWQV9NT0ZfUkVGTEVDVF9GQUlMRUQ9SVdBQjA1MjFFIEZhaWxlZCB0byBhbmFseXplIHRoZSBKYXZhIGJlYW46IHswfS4KLU1TR19FUlJPUl9SRUFEX0JFQU49SVdBQjA1MjJFIEVycm9yIGluIHJlYWRpbmcgbWV0aG9kcyBmcm9tIEphdmEgYmVhbi4KLU1TR19FUlJPUl9NT1ZFX1JFU09VUkNFPUlXQUIwNTIzRSBFcnJvciBtb3ZpbmcgcmVzb3VyY2UKLU1TR19FUlJPUl9VUERBVEVfQVhJU19XU0REPUlXQUIwNTI0RSBFcnJvciB1cGRhdGluZyBBeGlzIGRlcGxveS53c2RkIGZpbGUKLU1TR19FUlJPUl9MSVRFUkFMX1NVUFBPUlRfTUVTU0FHRT1JV0FCMDUzNkUgQXhpcyAxLjAgc3VwcG9ydCBmb3IgRG9jdW1lbnQvTGl0ZXJhbCBhbmQgRG9jdW1lbnQvTGl0ZXJhbCAoV3JhcHBlZCkgaXMgbWluaW1hbCwgdGh1cyB0aGUgZ2VuZXJhdGVkIGNvZGUgbWF5IGNvbnRhaW4gZXJyb3JzLiBSUEMvRW5jb2RlZCBpcyB0aGUgcmVjb21tZW5kZWQgc3R5bGUgYW5kIGVuY29kaW5nIHNlbGVjdGlvbi4KLU1TR19FUlJPUl9JTklUSUFMX1NFTEVDVElPTj1JV0FCMDAxOEUgRXJyb3IgZ2V0dGluZyBpbml0aWFsIHNlbGVjdGlvbi4KLQotCi0jCi0jSmF2YVRvV1NETE1ldGhvZENvbW1hbmQKLSMKLVRBU0tfTEFCRUxfSkFWQV9UT19XU0RMPUNyZWF0ZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZG9jdW1lbnQgbW9kZWwgZnJvbSBKYXZhIGJlYW4uCi1UQVNLX0RFU0NfSkFWQV9UT19XU0RMPUNyZWF0aW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBkb2N1bWVudCBtb2RlbCBmcm9tIEphdmEgYmVhbi4KLU1TR19FUlJPUl9KQVZBX1RPX01FVEhPRD1JV0FCMDAxOUUgRXJyb3IgaW4gZ2V0dGluZyBtZXRob2QgZnJvbSBKYXZhIGJlYW4uCi0KLSMKLSNEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMVGFzawotIwotVEFTS19MQUJFTF9TRVJWRVJfSkFWQV9XU0RMX0RFRkFVTFRTPURlZmF1bHRzRm9ySmF2YVdTRExTZXJ2ZXIKLVRBU0tfREVTQ19TRVJWRVJfSkFWQV9XU0RMX0RFRkFVTFRTPUJ1aWxkcyB0aGUgSmF2YVdTRExQYXJhbWV0ZXIgZm9yIHNlcnZlciBzaWRlLgotCi0jCi0jVXBkYXRlV0VCWE1MQ29tbWFuZAotIwotVEFTS19MQUJFTF9VUERBVEVfV0VCX1hNTD1VcGRhdGVXRUJYTUxDb21tYW5kCi1UQVNLX0RFU0NfVVBEQVRFX1dFQl9YTUw9VXBkYXRlIHByb2plY3QncyB3ZWIueG1sIGZpbGUgd2l0aCBBeGlzIHNlcnZsZXRzCi1NU0dfRVJST1JfVVBEQVRFX1dFQl9YTUw9SVdBQjAwMjBFIEVycm9yIGluIGFkZGluZyBzZXJ2bGV0IGluIHdlYi54bWwuCi0KLSMKLSNEZWZhdWx0c0ZvcldTREwyU2tlbGV0b25UYXNrCi0jCi0KLSMKLSNNb3ZlRGVwbG95bWVudEZpbGVzVGFzawotIwotVEFTS19MQUJFTF9NT1ZFX0RFUExPWU1FTlRfRklMRVM9TW92ZURlcGxveW1lbnRGaWxlc1Rhc2sKLVRBU0tfREVTQ19NT1ZFX0RFUExPWU1FTlRfRklMRVM9TW92ZSBkZXBsb3kud3NkZCBhbmQgdW5kZXBsb3kud3NkZCBmcm9tIEphdmEgU291cmNlIHRvIFdlYiBDb250ZW50L1dFQi1JTkYKLQotIwotI01vdmVKYXZhRmlsZXNUYXNrCi0jCi1UQVNLX0xBQkVMX01PVkVfSkFWQV9GSUxFUz1Nb3ZlSmF2YUZpbGVzVGFzawotVEFTS19ERVNDX01PVkVfSkFWQV9GSUxFUz1Nb3ZlIHNlcnZlciBzaWRlIGphdmEgZmlsZXMKLQotIwotI1NrZWxldG9uMldTRExUYXNrCi0jCi1UQVNLX0xBQkVMX1NLRUxFVE9OX1dTREw9RGVmYXVsdHNGb3JTa2VsZXRvbjJXU0RMVGFzawotVEFTS19ERVNDX1NLRUxFVE9OX1dTREw9Q3JlYXRlcyBXU0RMIGZvciBhIEphdmEgYmVhbiBza2VsZXRvbi4KLQotIwotI1VwZGF0ZUF4aXNXU0RERmlsZVRhc2sKLSMKLVRBU0tfTEFCRUxfVVBEQVRFX0FYSVNfV1NERD1VcGRhdGVBeGlzV1NEREZpbGVUYXNrCi1UQVNLX0RFU0NfVVBEQVRFX0FYSVNfV1NERD1VcGRhdGUgQXhpcyBkZXBsb3kud3NkZCB3aXRoIGFjdHVhbCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUKLU1TR19QTFVHSU5fRklMRV9VUkw9UHJvYmxlbSBsb2NhdGluZyBwbHVnaW4gZmlsZQotCi0jCi0jV2ViU2VydmljZVdTRExBeGlzU2VsZWN0aW9uUGFnZQotIwotUEFHRV9NU0dfTk9fRklMRV9TUEVDSUZJRUQ9Tm8gZmlsZSBzcGVjaWZpZWQuCi1QQUdFX01TR19OT19NRVRIT0RfU0VMRUNURUQ9Tm8gbWV0aG9kcyBzZWxlY3RlZC4KLQotIwotI1dlYlNlcnZpY2VTa2VsZXRvbkF4aXNDb25maWdGcmFnbWVudAotIwotCi0jCi0jV2ViU2VydmljZVNrZWxldG9uQXhpc0NvbmZpZ1BhZ2UKLSMKLVRPT0xUSVBfUEJTQ19QQUdFPQotVE9PTFRJUF9QQkNGX1RFWFRfVVJJPVRoZSBTT0FQIGJvZHkgbmFtZXNwYWNlIGFuZCB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgV2ViIHNlcnZpY2UuCi1UT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZPTERFUj1UaGUgZm9sZGVyIG9mIHRoZSBXU0RMIGZpbGUuCi1UT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZJTEU9VGhlIG5hbWUgb2YgdGhlIFdTREwgZmlsZS4KLUxBQkVMX1VSST1XZWIgc2VydmljZSBVUkk6Ci1MQUJFTF9PVVRQVVRfRk9MREVSX05BTUU9V1NETCBGb2xkZXI6Ci1MQUJFTF9PVVRQVVRfRklMRV9OQU1FPVdTREwgRmlsZToKLQotCi0jCi0jV1NXU0RMQXhpc1R5cGUKLSMKLVdTX05BTUVfV1NETEFYSVM9U2tlbGV0b24gSmF2YSBiZWFuIEF4aXMgV2ViIHNlcnZpY2UKLVdTX0RFU0NfV1NETEFYSVM9U2tlbGV0b24gSmF2YSBiZWFuIEF4aXMgV2ViIHNlcnZpY2UKLQotIwotI1dTQmVhbkF4aXNUeXBlCi0jCi0KLSMKLSNXZWJTZXJ2aWNlQXhpc0JlYW5DbGFzc0ZyYWdtZW50Ci0jCi0KLSMKLSNXZWJTZXJ2aWNlQXhpc0JlYW5DbGFzc1BhZ2UKLSMKLVBBR0VfVElUTEVfV1NCRUFOX0NMQVNTPVdlYiBTZXJ2aWNlIEphdmEgQmVhbiBTZWxlY3Rpb24KLVBBR0VfREVTQ19XU0JFQU5fQ0xBU1M9U2VsZWN0IGEgSmF2YSBiZWFuCi1MQUJFTF9FWFBMT1JFX01BUFBJTkdTX0JFQU4yWE1MPURlZmluZSBjdXN0b20gbWFwcGluZyBmb3IgcGFja2FnZSB0byBuYW1lc3BhY2UuCi1UT09MVElQX1AyTl9TSE9XX01BUFBJTkdTPURlZmluZSBwYWNrYWdlIHRvIG5hbWVzcGFjZSBtYXBwaW5nIGZvciBjdXN0b21pemF0aW9uLgotCi0jCi0jV2ViU2VydmljZUF4aXNCZWFuQ29uZmlnRnJhZ21lbnQKLSMKLQotIwotI1dlYlNlcnZpY2VBeGlzQmVhbkNvbmZpZ1BhZ2UKLSMKLVRPT0xUSVBfUEJDRl9QQUdFPQotVE9PTFRJUF9QQkNGX1RFWFRfVVJJPVRoZSBTT0FQIGJvZHkgbmFtZXNwYWNlIGFuZCB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgV2ViIHNlcnZpY2UuCi1UT09MVElQX1BCTUVfVFJFRV9NRVRIT0RTPUphdmEgYmVhbiBtZXRob2RzIHRvIGluY2x1ZGUuCi1QQUdFX1RJVExFX1dTQkVBTl9DT05GSUc9V2ViIFNlcnZpY2UgSmF2YSBCZWFuIElkZW50aXR5Ci1QQUdFX0RFU0NfV1NCRUFOX0NPTkZJRz1Db25maWd1cmUgdGhlIEphdmEgYmVhbiBhcyBhIFdlYiBzZXJ2aWNlLgotTEFCRUxfU1RZTEVfVVNFPVN0eWxlIGFuZCBVc2UKLVNUWUxFX1JQQ19MSVRFUkFMPURvY3VtZW50LyBMaXRlcmFsCi1TVFlMRV9ET0NfTElURVJBTD1Eb2N1bWVudC8gTGl0ZXJhbCAoV3JhcHBlZCkKLVNUWUxFX1JQQ19FTkNPREVEPVJQQy8gRW5jb2RlZAotCi0jCi0jV1NETENvbnN1bXB0aW9uVGFza0ZhY3RvcnkKLSMKLQotIwotI0NvcHlBeGlzU2VydmVyQ29uZmlnVGFzawotIwotCi1UQVNLX0xBQkVMX0NPUFlfU0VSVkVSX0NPTkZJR19GSUxFUz1Db3B5IHNlcnZlci1jb25maWcud3NkZCBmcm9tIHRoZSBzZXJ2ZXIgbG9jYXRpb24gdG8gdGhlIFdlYiBQcm9qZWN0Ci1UQVNLX0RFU0NfQ09QWV9TRVJWRVJfQ09ORklHX0ZJTEVTPUNvcGluZyBzZXJ2ZXItY29uZmlnLndzZGQgZnJvbSB0aGUgc2VydmVyIGxvY2F0aW9uIHRvIHRoZSBXZWIgUHJvamVjdAotCi0KLSMKLSNMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrCi0jCi1UQVNLX0xBQkVMX0xJVEVSQUxfU1VQUE9SVF9NRVNTQUdFPUF4aXMgc3VwcG9ydCBmb3IgTGl0ZXJhbCBlbmNvZGluZyBtZXNzYWdlIHRhc2sKLVRBU0tfREVTQ19MSVRFUkFMX1NVUFBPUlRfTUVTU0FHRT1BeGlzIHN1cHBvcnQgZm9yIExpdGVyYWwgZW5jb2RpbmcgbWVzc2FnZSB0YXNrCi0KLSMKLSNCVUF4aXNJbnB1dENvbW1hbmQgYW5kIEJVQXhpc091dHB1dENvbW1hbmQKLSMKLQotVEFTS19MQUJFTF9CVV9BWElTX0lOUFVUPUJvdHRvbSB1cCBBeGlzIGlucHV0IGNvbW1tYW5kCi1UQVNLX0RFU0NfQlVfQVhJU19JTlBVVD1Cb3R0b20gdXAgQXhpcyBpbnB1dCBjb21tbWFuZAotVEFTS19MQUJFTF9CVV9BWElTX09VVFBVVD1Cb3R0b20gdXAgQXhpcyBvdXRwdXQgY29tbW1hbmQKLVRBU0tfREVTQ19CVV9BWElTX09VVFBVVD1Cb3R0b20gdXAgQXhpcyBvdXRwdXQgY29tbW1hbmQKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9BeGlzUnVuSW5wdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0F4aXNSdW5JbnB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3ODI5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0F4aXNSdW5JbnB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLndzcnQuQXhpc1dlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzUnVuSW5wdXRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZHsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9CVV9BWElTX0lOUFVUIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX0JVX0FYSVNfSU5QVVQiOwotCQotCXByaXZhdGUgQXhpc1dlYlNlcnZpY2Ugd3NfOwotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmVyUHJvamVjdF87IAotCSAgCi0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCQotCXB1YmxpYyBBeGlzUnVuSW5wdXRDb21tYW5kKCkgewotCQlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQl9Ci0JCi0JcHVibGljIEF4aXNSdW5JbnB1dENvbW1hbmQoQXhpc1dlYlNlcnZpY2Ugd3MsIFN0cmluZyBtb2R1bGUpIHsKLQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkgICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCXdzXyA9IHdzOwotCQlzZXJ2ZXJQcm9qZWN0XyA9IG1vZHVsZTsgCi0JfQotCQotCSBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCSAgewotCSAgICAKLQkgIAlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCSAgICAKLQkJamF2YVdTRExQYXJhbV8gPSB3c18uZ2V0QXhpc1dlYlNlcnZpY2VJbmZvKCkuZ2V0SmF2YVdTRExQYXJhbWV0ZXIoKTsKLQkJCi0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkgIH0KLQkKLQkgLyoqCi0JICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclByb2plY3QuCi0JICAgKi8KLQkgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyUHJvamVjdCgpCi0JICB7Ci0JCSAgcmV0dXJuIHNlcnZlclByb2plY3RfOwotCSAgfQotCSAgCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0JCXJldHVybiBqYXZhV1NETFBhcmFtXzsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0F4aXNTZXJ2ZXJEZWZhdWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQXhpc1NlcnZlckRlZmF1bHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzc4YjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQXhpc1NlcnZlckRlZmF1bHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLklTZXJ2ZXJEZWZhdWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5TZXJ2ZXJJbmZvOwotCi0KLQotcHVibGljIGNsYXNzIEF4aXNTZXJ2ZXJEZWZhdWx0ZXIgaW1wbGVtZW50cyBJU2VydmVyRGVmYXVsdGVyCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLklTZXJ2ZXJEZWZhdWx0ZXIjcmVjb21tZW5kRGVmYXVsdFNlcnZlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLSAgICovCi0gIHB1YmxpYyBTZXJ2ZXJJbmZvIHJlY29tbWVuZERlZmF1bHRTZXJ2ZXIoSVByb2plY3QgcHJvamVjdCkKLSAgeyAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9CVUF4aXNJbnB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQlVBeGlzSW5wdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzc1YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9CVUF4aXNJbnB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2U7Ci0KLQotcHVibGljIGNsYXNzIEJVQXhpc0lucHV0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfQlVfQVhJU19JTlBVVCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19CVV9BWElTX0lOUFVUIjsKLQkKLQlwcml2YXRlIElXZWJTZXJ2aWNlIHdzXzsKLQlwcml2YXRlIFN0cmluZyBzZXJ2ZXJQcm9qZWN0XzsgCi0KLQkgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSURfOwotCSAgCi0JICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JICAKLQkJLyoqCi0JCSogRGVmYXVsdCBDVE9SCi0JCSovCi0JCXB1YmxpYyBCVUF4aXNJbnB1dENvbW1hbmQoKSB7Ci0JCQlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkJICAgIHNldE5hbWUgKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7Ci0JCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkJfQotCQkKLQkJcHVibGljIEJVQXhpc0lucHV0Q29tbWFuZChJV2ViU2VydmljZSB3cywgU3RyaW5nIG1vZHVsZSkgewotCQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkJICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCQl3c18gPSB3czsKLQkJCXNlcnZlclByb2plY3RfID0gbW9kdWxlOyAKLQkJfQotCQkKLQkgIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JICB7Ci0JICAgIAotCSAgCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JICAgIAotCQlTdHJpbmcgc2VydmVySW5zdGFuY2VJZCA9IHdzXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFNlcnZlckluc3RhbmNlSWQoKTsKLQkJU3RyaW5nIHNlcnZlckZhY3RvcnlJZCA9IHdzXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFNlcnZlckZhY3RvcnlJZCgpOwotCQkKLQkJSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI9bnVsbDsKLQkJCi0JCWlmIChzZXJ2ZXJJbnN0YW5jZUlkICE9IG51bGwpIHsgLy8gc2VydmVyIGV4aXN0cwotCSAgICAJc2VydmljZUV4aXN0aW5nU2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlckluc3RhbmNlSWQpOwotCQkJaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlciAhPSBudWxsKQotCQkgICAgewotCQkgICAgICBzZXJ2aWNlU2VydmVyVHlwZUlEXyA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLQkJICAgIH0KLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkgICAgCXNlcnZpY2VTZXJ2ZXJUeXBlSURfID0gc2VydmVyRmFjdG9yeUlkOwotCSAgICB9Ci0JCQotCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JICB9Ci0JICAKLQkJLyoqCi0JCSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2ZXJQcm9qZWN0LgotCQkgICAqLwotCQkgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyUHJvamVjdCgpCi0JCSAgewotCQkJICByZXR1cm4gc2VydmVyUHJvamVjdF87Ci0JCSAgfQotCi0JCSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlU2VydmVyVHlwZUlEKCkKLQkJICB7Ci0JCSAgICByZXR1cm4gc2VydmljZVNlcnZlclR5cGVJRF87Ci0JCSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9CVUF4aXNPdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0JVQXhpc091dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmYmM1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0JVQXhpc091dHB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24ud3NydC5BeGlzV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi53c3J0LkF4aXNXZWJTZXJ2aWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgQlVBeGlzT3V0cHV0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfQlVfQVhJU19PVVRQVVQiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfQlVfQVhJU19PVVRQVVQiOwotCQotCXByaXZhdGUgQXhpc1dlYlNlcnZpY2Ugd3NfOwotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0KLQlwcml2YXRlIFN0cmluZyAgICAgICAgICAgIHdzZGxVUklfOwotCSAgCi0JICBwcml2YXRlIGJvb2xlYW4gaXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZF8gPSBmYWxzZTsKLQkgIAotCSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCSAgCi0JCS8qKgotCQkqIERlZmF1bHQgQ1RPUgotCQkqLwotCQlwdWJsaWMgQlVBeGlzT3V0cHV0Q29tbWFuZCgpIHsKLQkJCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCQkgICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJCXNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQl9Ci0JCQotCQlwdWJsaWMgQlVBeGlzT3V0cHV0Q29tbWFuZChBeGlzV2ViU2VydmljZSB3cykgewotCQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkJICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCQl3c18gPSB3czsKLQkJfQotCQkKLQkJcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudil7Ci0JCSAgCQotCQkgIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7ICAJCi0JCSAgCXdzXy5nZXRXZWJTZXJ2aWNlSW5mbygpLnNldFdzZGxVUkwod3NkbFVSSV8pOwotCQkJQXhpc1dlYlNlcnZpY2VJbmZvIGF4aXNXU0luZm8gPSBuZXcgQXhpc1dlYlNlcnZpY2VJbmZvKCk7Ci0JCQlheGlzV1NJbmZvLnNldEphdmFXU0RMUGFyYW1ldGVyKGphdmFXU0RMUGFyYW1fKTsKLQkJCXdzXy5zZXRBeGlzV2ViU2VydmljZUluZm8oYXhpc1dTSW5mbyk7CQkgICAgCi0JCSAgCQotCQkgIAlyZXR1cm4gc3RhdHVzOyAgICAgIAkKLQkJICB9Ci0KLQkJICAvKioKLQkJICAgKiBAcGFyYW0gd3NkbFVSSQotCQkgICAqICAgICAgICAgICAgVGhlIHdzZGxVUkkgdG8gc2V0LgotCQkgICAqLwotCQkgIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0JCSAgewotCQkgICAgd3NkbFVSSV8gPSB3c2RsVVJJOwotCQkgIH0KLQotCQlwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtIChKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtXykgewotCQkJdGhpcy5qYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW1fOwotCQl9Ci0JCSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0NvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9Db21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkYjIxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0NvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIENvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBMaXN0IGNsYXNzTmFtZXM7Ci0gIC8vcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLSAgLy9wcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1ldGVyOwotCi0gIHB1YmxpYyBDb21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCi0gIHsKLSAgICBjbGFzc05hbWVzID0gbmV3IFZlY3RvcigpOwotICAgIGlmIChqYXZhV1NETFBhcmFtZXRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBiZWFuTmFtZSA9IGphdmFXU0RMUGFyYW1ldGVyLmdldEJlYW5OYW1lKCk7Ci0gICAgICBpZiAoYmVhbk5hbWUgIT0gbnVsbCkKLSAgICAgICAgY2xhc3NOYW1lcy5hZGQoYmVhbk5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRDbGFzc05hbWVzKCkKLSAgewotICAgIHJldHVybiBjbGFzc05hbWVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlc1BhcnNlciBUaGUgd2ViU2VydmljZXNQYXJzZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpCi0gIHsKLSAgICAvL3RoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gd3NkbFVSSSBUaGUgd3NkbFVSSSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgLy90aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1ldGVyKQotICB7Ci0gICAgdGhpcy5qYXZhV1NETFBhcmFtZXRlciA9IGphdmFXU0RMUGFyYW1ldGVyOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0phdmFUb1dTRExNZXRob2RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0phdmFUb1dTRExNZXRob2RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOTUzYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9KYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFFTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YVRvV1NETE1ldGhvZENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0pBVkFfVE9fV1NETCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19KQVZBX1RPX1dTREwiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBKQVZBX0VYVEVOU0lPTiA9ICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRVhURU5TSU9OID0gIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSGFzaHRhYmxlIGZNZXRob2ROYW1lczsKLQlwcml2YXRlIFN0cmluZyBmQ2xhc3NOYW1lOwotCXByaXZhdGUgU3RyaW5nIGZCZWFuTmFtZTsKLQlwcml2YXRlIFN0cmluZyBmYmVhbkJhc2VOYW1lOwotCXByaXZhdGUgSVByb2plY3QgZlByb2plY3Q7Ci0JcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtXzsKLQlwcml2YXRlIElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0XzsKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLQkvKioKLQkqIERlZmF1bHQgQ1RPUgotCSovCi0JcHVibGljIEphdmFUb1dTRExNZXRob2RDb21tYW5kKCkgewotCQlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQl9Ci0JLyoqCi0JKiBEZWZhdWx0IENUT1IKLQkqLwotCXB1YmxpYyBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZCgKLQkJSmF2YVdTRExQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciwKLQkJSVByb2plY3Qgc2VydmljZVByb2plY3QpIHsKLQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkgICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCWphdmFXU0RMUGFyYW1fID0gamF2YVBhcmFtZXRlcjsKLQkJc2VydmljZVByb2plY3RfID0gc2VydmljZVByb2plY3Q7Ci0KLQl9Ci0KLQkvKioKLQkqIEphdmFUb1RvV1NETE1ldGhvZCBleGVjdXRlCi0JKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLQkJZmJlYW5CYXNlTmFtZSA9IGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCk7Ci0JCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTA3MCwgdGhpcywgImV4ZWN1dGUiLCAiYmVhbkJhc2VOYW1lID0gIitmYmVhbkJhc2VOYW1lKTsKLQkJU3RhdHVzIHN0YXR1czsKLQkJdHJ5IHsKLQkJCS8vR2V0IHRoZSBxdWFsaWZpZWQgYmVhbiBuYW1lOyBteS5wYWNrYWdlLk15Q2xhc3MKLQkJCWZNZXRob2ROYW1lcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJCUhhc2h0YWJsZSBvbGRNZXRob2RzTmFtZXMgPSBqYXZhV1NETFBhcmFtXy5nZXRNZXRob2RzKCk7Ci0JCQlTdHJpbmcgcU5hbWUgPSBmYmVhbkJhc2VOYW1lOwotCi0JCQlpZiAocU5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChKQVZBX0VYVEVOU0lPTikKLQkJCQl8fCBxTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKENMQVNTX0VYVEVOU0lPTikpIHsKLQkJCQlxTmFtZSA9IHFOYW1lLnN1YnN0cmluZygwLCBxTmFtZS5sYXN0SW5kZXhPZignLicpKTsKLQkJCX0KLQotCQkJSmF2YUVNRk5hdHVyZSBqTU9GID0KLQkJCQkoSmF2YUVNRk5hdHVyZSkgSmF2YUVNRk5hdHVyZS5jcmVhdGVSdW50aW1lKAotCQkJCQlzZXJ2aWNlUHJvamVjdF8pOwotCQkJSmF2YUNsYXNzIGphdmFDbGFzcyA9Ci0JCQkJKEphdmFDbGFzcykgSmF2YUNsYXNzSW1wbC5yZWZsZWN0KHFOYW1lLCBqTU9GLmdldFJlc291cmNlU2V0KCkpOwotCQkJaWYgKCFqYXZhQ2xhc3MuaXNFeGlzdGluZ1R5cGUoKSkgewotCQkJCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuRVJST1IsIDUwMjIsIHRoaXMsICJleGVjdXRlIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoCi0JCQkJCQkiTVNHX0VSUk9SX0pBVkFfTU9GX1JFRkxFQ1RfRkFJTEVEIiwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IHFOYW1lIH0pKTsKLQkJCQkKLQkJCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCJKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKAotCQkJCQkiTVNHX0VSUk9SX0pBVkFfTU9GX1JFRkxFQ1RfRkFJTEVEIiwKLQkJCQkJbmV3IFN0cmluZ1tdIHsgcU5hbWUgfSksCi0JCQkJCVN0YXR1cy5FUlJPUik7Ci0JCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQotCQkJLy8gR2V0IHRoZSBxdWFsaWZpZWQgbmFtZQotCQkJZkNsYXNzTmFtZSA9IGphdmFDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQlmQmVhbk5hbWUgPSBmQ2xhc3NOYW1lOwotCQkJU3RyaW5nIGJlYW5OYW1lOwotCQkJaWYgKGZDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJCWJlYW5OYW1lID0KLQkJCQkJZkNsYXNzTmFtZS5zdWJzdHJpbmcoCi0JCQkJCQlmQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxLAotCQkJCQkJZkNsYXNzTmFtZS5sZW5ndGgoKSk7Ci0JCQl9IGVsc2UKLQkJCQliZWFuTmFtZSA9IGZDbGFzc05hbWU7Ci0KLQkJCS8vIFdhbGsgdGhlIGphdmEgY2xhc3MgYW5kIGdldCB0aGUgbWV0aG9kIG5hbWVzCi0JCQlnYXRoZXJNZXRob2RzKGphdmFDbGFzcywgYmVhbk5hbWUsIG9sZE1ldGhvZHNOYW1lcyk7Ci0JCQkvKgotCQkJSXRlcmF0b3IgbSA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKG0uaGFzTmV4dCgpKSB7Ci0JCQkJTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIG0ubmV4dCgpOyAgCi0JCQkJaWYgKCAhIG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpeyAKLQkJCQlpZiAoIWJlYW5OYW1lLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKQotCQkJCQkmJiAhKGlzRHVwbGljYXRlTWV0aG9kTmFtZShtZXRob2QKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpKQotCQkJCQkmJiAhKG1ldGhvZAotCQkJCQkJLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKQotCQkJCQkJLmdldEphdmFOYW1lKCkKLQkJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZheC5lamIuRUpCT2JqZWN0IikpCS8vJE5PTi1OTFMtMSQKLQkJCQkJJiYgIShtZXRob2QKLQkJCQkJCS5nZXRDb250YWluaW5nSmF2YUNsYXNzKCkKLQkJCQkJCS5nZXRKYXZhTmFtZSgpCi0JCQkJCQkuZXF1YWxzSWdub3JlQ2FzZSgiamF2YXguZWpiLkVKQk9iamVjdFtdIikpCS8vJE5PTi1OTFMtMSQKLQkJCQkJJiYgIShtZXRob2QKLQkJCQkJCS5nZXRDb250YWluaW5nSmF2YUNsYXNzKCkKLQkJCQkJCS5nZXRKYXZhTmFtZSgpCi0JCQkJCQkuZXF1YWxzSWdub3JlQ2FzZSgiamF2YS5sYW5nLk9iamVjdCIpKQkvLyROT04tTkxTLTEkCi0JCQkJCSYmICEobWV0aG9kCi0JCQkJCQkuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpCi0JCQkJCQkuZ2V0SmF2YU5hbWUoKQotCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoImphdmEubGFuZy5PYmplY3RbXSIpKSkgewkvLyROT04tTkxTLTEkCi0JCQkJCS8vIGFkZCB0aGUgbWV0aG9kIG5hbWUgdG8gb3VyIGxpc3Qgb2YgbWV0aG9kIG5hbWVzCi0JCQkJCVN0cmluZyBtZXRob2ROYW1lID1tZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpOwotCQkgICAgICAgICAgQm9vbGVhbiBpc1NlbGVjdGVkID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gICAgICAgIAkJICBpZiAob2xkTWV0aG9kc05hbWVzICE9IG51bGwgJiYgb2xkTWV0aG9kc05hbWVzLmNvbnRhaW5zS2V5KG1ldGhvZE5hbWUpKQotICAgICAgICAgIAkJCWlzU2VsZWN0ZWQgPSAoQm9vbGVhbilvbGRNZXRob2RzTmFtZXMuZ2V0KG1ldGhvZE5hbWUpOwotCQkgICAgICAgICAgZk1ldGhvZE5hbWVzLnB1dChtZXRob2ROYW1lLCBpc1NlbGVjdGVkKTsKLQkJCQl9IAotCQkJCX0KLQkJCX0KLQkJCSovCi0JCQlqYXZhV1NETFBhcmFtXy5zZXRNZXRob2RzKGZNZXRob2ROYW1lcyk7Ci0JCQkKLQkJCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLkVSUk9SLCA1MDIzLCB0aGlzLCAiZXhlY3V0ZSIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUkVBRF9CRUFOIikpOwotCQkKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkphdmFUb1dTRExNZXRob2RDb21tYW5kIiwgLy8kTk9OLU5MUy0xJAotCQkJCQltc2dVdGlsc18uZ2V0TWVzc2FnZSgKLQkJCQkiTVNHX0VSUk9SX0pBVkFfVE9fTUVUSE9EIiksCi0JCQkJU3RhdHVzLkVSUk9SLCBlKTsKLQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCX0KLQotICBwcml2YXRlIHZvaWQgZ2F0aGVyTWV0aG9kcyhKYXZhQ2xhc3MgamF2YUNsYXNzLCBTdHJpbmcgYmVhbk5hbWUsIEhhc2h0YWJsZSBvbGRNZXRob2RzTmFtZXMpCi0gIHsKLSAgICBTdHJpbmcgamF2YU5hbWUgPSBqYXZhQ2xhc3MuZ2V0SmF2YU5hbWUoKTsKLSAgICBpZiAoIWphdmFDbGFzcy5pc0ludGVyZmFjZSgpCi0gICAgICAgICYmICFqYXZhTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZheC5lamIuRUpCT2JqZWN0W10iKQotICAgICAgICAmJiAhamF2YU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiamF2YXguZWpiLkVKQk9iamVjdCIpCi0gICAgICAgICYmICFqYXZhTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhLmxhbmcuT2JqZWN0W10iKQotICAgICAgICAmJiAhamF2YU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiamF2YS5sYW5nLk9iamVjdCIpKQotICAgIHsKLSAgICAgIExpc3QgcHVibGljTWV0aG9kcyA9IGphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcHVibGljTWV0aG9kcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZClpdC5uZXh0KCk7Ci0gICAgICAgIGlmICghbWV0aG9kLmlzQ29uc3RydWN0b3IoKQotICAgICAgICAgICAgJiYgIWJlYW5OYW1lLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKQotICAgICAgICAgICAgJiYgIShpc0R1cGxpY2F0ZU1ldGhvZE5hbWUobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gYWRkIHRoZSBtZXRob2QgbmFtZSB0byBvdXIgbGlzdCBvZiBtZXRob2QgbmFtZXMKLSAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCk7Ci0gICAgICAgICAgQm9vbGVhbiBpc1NlbGVjdGVkID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gICAgICAgICAgaWYgKG9sZE1ldGhvZHNOYW1lcyAhPSBudWxsICYmIG9sZE1ldGhvZHNOYW1lcy5jb250YWluc0tleShtZXRob2ROYW1lKSkKLSAgICAgICAgICAgIGlzU2VsZWN0ZWQgPSAoQm9vbGVhbilvbGRNZXRob2RzTmFtZXMuZ2V0KG1ldGhvZE5hbWUpOwotICAgICAgICAgIGZNZXRob2ROYW1lcy5wdXQobWV0aG9kTmFtZSwgaXNTZWxlY3RlZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGdhdGhlck1ldGhvZHMoamF2YUNsYXNzLmdldFN1cGVydHlwZSgpLCBiZWFuTmFtZSwgb2xkTWV0aG9kc05hbWVzKTsKLSAgICB9Ci0gIH0KLQkgIAotCS8vUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBtZXRob2QgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgCi0JLy9mTWV0aG9kTmFtZXMgdmVjdG9yLiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGRldGVjdCBvdmVybG9hZGVkIAotCS8vbWV0aG9kcyBpbiBCZWFucyBhbmQgRUpCcywgd2hpY2ggYXJlIGN1cnJlbnRseSB1bnN1cHBvcnRlZC4KLQlwcml2YXRlIGJvb2xlYW4gaXNEdXBsaWNhdGVNZXRob2ROYW1lKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiAoZk1ldGhvZE5hbWVzID09IG51bGwgPyBmYWxzZTogZk1ldGhvZE5hbWVzLmNvbnRhaW5zS2V5KG1ldGhvZE5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbS4KLQkgKiBAcmV0dXJuIEphdmFXU0RMUGFyYW1ldGVyCi0JICovCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0JCXJldHVybiBqYXZhV1NETFBhcmFtXzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBqYXZhV1NETFBhcmFtLgotCSAqIEBwYXJhbSBqYXZhV1NETFBhcmFtIFRoZSBqYXZhV1NETFBhcmFtIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkgewotCQl0aGlzLmphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpCi0JewotCSAgc2VydmljZVByb2plY3RfID0gc2VydmljZVByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9VcGRhdGVXRUJYTUxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL1VwZGF0ZVdFQlhNTENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5NGQ5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL1VwZGF0ZVdFQlhNTENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVdFQlhNTENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfVVBEQVRFX1dFQl9YTUwiOwotCXByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19VUERBVEVfV0VCX1hNTCI7Ci0KLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0OwotCi0gIHB1YmxpYyBVcGRhdGVXRUJYTUxDb21tYW5kKCkKLSAgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotICAgIHNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotICB9Ci0KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLQkJaWYgKHNlcnZlclByb2plY3QgIT0gbnVsbCkgewotCQkJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCQlzdGF0dXMgPSBhZGRTZXJ2bGV0KHNlcnZlclByb2plY3QsIGdldEF4aXNTZXJ2bGV0RGVzY3JpcHRvcigpKTsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHsKLQkJCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgewotCQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCQlhZGRTZXJ2bGV0KHNlcnZlclByb2plY3QsIGdldEFkbWludFNlcnZsZXREZXNjcmlwdG9yKCkpOwotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgewotCQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0JfQotCi0JcHJpdmF0ZSBTZXJ2bGV0RGVzY3JpcHRvciBnZXRBeGlzU2VydmxldERlc2NyaXB0b3IoKSB7Ci0KLQkJU2VydmxldERlc2NyaXB0b3Igc2QgPSBuZXcgU2VydmxldERlc2NyaXB0b3IoKTsKLQkJc2QuX25hbWUgPSAiQXhpc1NlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JCXNkLl9kaXNwbGF5TmFtZSA9ICJBcGFjaGUtQXhpcyBTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCQlzZC5fY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpcy50cmFuc3BvcnQuaHR0cC5BeGlzU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX21hcHBpbmdzID0gbmV3IFN0cmluZ1tdIHsgIi9zZXJ2bGV0L0F4aXNTZXJ2bGV0IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSIqLmp3cyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiL3NlcnZpY2VzLyoiIH07IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHNkOwotCX0KLQotCXByaXZhdGUgU2VydmxldERlc2NyaXB0b3IgZ2V0QWRtaW50U2VydmxldERlc2NyaXB0b3IoKSB7Ci0JCVNlcnZsZXREZXNjcmlwdG9yIHNkID0gbmV3IFNlcnZsZXREZXNjcmlwdG9yKCk7Ci0JCXNkLl9uYW1lID0gIkFkbWluU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX2Rpc3BsYXlOYW1lID0gIkF4aXMgQWRtaW4gU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX2NsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMudHJhbnNwb3J0Lmh0dHAuQWRtaW5TZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCQlzZC5fbWFwcGluZ3MgPSBuZXcgU3RyaW5nW10geyAiL3NlcnZsZXQvQWRtaW5TZXJ2bGV0IiB9OyAvLyROT04tTkxTLTEkCi0JCXNkLl9sb2FkT25TdGFydHVwID0gbmV3IEludGVnZXIoMTAwKTsKLQkJcmV0dXJuIHNkOwotCX0KLQotCXByaXZhdGUgU2VydmxldERlc2NyaXB0b3IgZ2V0U29hcE1vbml0b3JTZXJ2bGV0RGVzY3JpcHRvcigpIHsKLQkJU2VydmxldERlc2NyaXB0b3Igc2QgPSBuZXcgU2VydmxldERlc2NyaXB0b3IoKTsKLQkJc2QuX25hbWUgPSAiU09BUE1vbml0b3JTZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJAotCQlzZC5fZGlzcGxheU5hbWUgPSAiU09BUE1vbml0b3JTZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJAotCQlzZC5fY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpcy5tb25pdG9yLlNPQVBNb25pdG9yU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX21hcHBpbmdzID0gbmV3IFN0cmluZ1tdIHsgIi9TT0FQTW9uaXRvciIgfTsgLy8kTk9OLU5MUy0xJAotCQlzZC5fbG9hZE9uU3RhcnR1cCA9IG5ldyBJbnRlZ2VyKDEwMCk7Ci0JCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwYXJhbXMucHV0KCJTT0FQTW9uaXRvclBvcnQiLCAvLyROT04tTkxTLTEkCi0JCQkJCSAiNTAwMSIpOyAgIC8vJE5PTi1OTFMtMSQKLQkJc2QuX3BhcmFtcyA9IHBhcmFtczsKLQkJcmV0dXJuIHNkOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgYWRkU2VydmxldCgKLQkJSVByb2plY3Qgd2ViUHJvamVjdCwKLQkJU2VydmxldERlc2NyaXB0b3Igc2VydmxldERlc2NyaXB0b3IpIHsKLQotCQlPYmplY3QgYWNjZXNzb3JLZXkgPSBuZXcgT2JqZWN0KCk7Ci0JCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbnVsbDsJCQotCQlTdHJ1Y3R1cmVFZGl0IHN0cnVjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJLy8gCi0JCQlXZWJBcHAgd2ViYXBwID0gbnVsbDsKLQkJCXN0cnVjdEVkaXQgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHdlYlByb2plY3QpOzsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YmNzW10gPSBzdHJ1Y3RFZGl0LmdldFdvcmtiZW5jaE1vZHVsZXMoKTsKLQkJCQotCQkJd2ViRWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JXcml0ZSh3YmNzWzBdKTsKLQkJCWlmICh3ZWJFZGl0ICE9IG51bGwpCi0JCQkJd2ViYXBwID0gKFdlYkFwcCkgd2ViRWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQkJCS8vCi0JCQkKLQkJCWJvb2xlYW4gZm91bmRTZXJ2bGV0ID0gZmFsc2U7Ci0KLQkJCUxpc3QgdGhlU2VydmxldHMgPSB3ZWJhcHAuZ2V0U2VydmxldHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlU2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTZXJ2bGV0IGFTZXJ2bGV0ID0gKFNlcnZsZXQpIHRoZVNlcnZsZXRzLmdldChpKTsKLQkJCQlpZiAoYVNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKS5lcXVhbHMoc2VydmxldERlc2NyaXB0b3IuX25hbWUpKSB7Ci0JCQkJCWZvdW5kU2VydmxldCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZm91bmRTZXJ2bGV0KSB7Ci0JCQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0JCQl9Ci0KLQkJCVdlYmFwcGxpY2F0aW9uRmFjdG9yeSBmYWN0b3J5ID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRTsKLQotCQkJU2VydmxldCBzZXJ2bGV0ID0gZmFjdG9yeS5jcmVhdGVTZXJ2bGV0KCk7Ci0JCQlTZXJ2bGV0VHlwZSBzZXJ2bGV0VHlwZSA9IGZhY3RvcnkuY3JlYXRlU2VydmxldFR5cGUoKTsKLQkJCXNlcnZsZXQuc2V0V2ViVHlwZShzZXJ2bGV0VHlwZSk7Ci0JCQlzZXJ2bGV0LnNldFNlcnZsZXROYW1lKHNlcnZsZXREZXNjcmlwdG9yLl9uYW1lKTsKLQkJCXNlcnZsZXRUeXBlLnNldENsYXNzTmFtZShzZXJ2bGV0RGVzY3JpcHRvci5fY2xhc3NOYW1lKTsKLQkJCWlmKHNlcnZsZXREZXNjcmlwdG9yLl9kaXNwbGF5TmFtZSAhPSBudWxsKXsKLQkJCSAgIHNlcnZsZXQuc2V0RGlzcGxheU5hbWUoc2VydmxldERlc2NyaXB0b3IuX2Rpc3BsYXlOYW1lKTsKLQkJCX0KLQkJCWlmKHNlcnZsZXREZXNjcmlwdG9yLl9sb2FkT25TdGFydHVwICE9IG51bGwpewotCQkJCXNlcnZsZXQuc2V0TG9hZE9uU3RhcnR1cChzZXJ2bGV0RGVzY3JpcHRvci5fbG9hZE9uU3RhcnR1cCk7Ci0JCQl9Ci0JCQlpZihzZXJ2bGV0RGVzY3JpcHRvci5fcGFyYW1zICE9IG51bGwpewotCQkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IHNlcnZsZXQuZ2V0UGFyYW1zQXNQcm9wZXJ0aWVzKCk7Ci0JCQkJcHJvcGVydGllcy5wdXRBbGwoc2VydmxldERlc2NyaXB0b3IuX3BhcmFtcyk7Ci0JCQl9Ci0JCQl3ZWJhcHAuZ2V0U2VydmxldHMoKS5hZGQoc2VydmxldCk7Ci0JCQkKLQkJCWlmKHNlcnZsZXREZXNjcmlwdG9yLl9tYXBwaW5ncyAhPSBudWxsKXsKLQkJCQlmb3IoaW50IGk9MDsgaTxzZXJ2bGV0RGVzY3JpcHRvci5fbWFwcGluZ3MubGVuZ3RoOyBpKyspewotCQkJCQlTZXJ2bGV0TWFwcGluZyBzZXJ2bGV0TWFwcGluZyA9IGZhY3RvcnkuY3JlYXRlU2VydmxldE1hcHBpbmcoKTsKLQkJCQkJc2VydmxldE1hcHBpbmcuc2V0U2VydmxldChzZXJ2bGV0KTsKLQkJCQkJc2VydmxldE1hcHBpbmcuc2V0VXJsUGF0dGVybihzZXJ2bGV0RGVzY3JpcHRvci5fbWFwcGluZ3NbaV0pOwotCQkJCQl3ZWJhcHAuZ2V0U2VydmxldE1hcHBpbmdzKCkuYWRkKHNlcnZsZXRNYXBwaW5nKTsJCQkJCQotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKAotCQkJCQkiVXBkYXRlV0VCWE1MQ29tbWFuZC5hZGRTZXJ2bGV0IiwgLy8kTk9OLU5MUy0xJAotCQkJCQltc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VQREFURV9XRUJfWE1MIiksCi0JCQkJCVN0YXR1cy5FUlJPUiwgZSk7Ci0JCX0KLQkJZmluYWxseXsKLQkJCWlmICh3ZWJFZGl0ICE9IG51bGwpCi0JCQkJd2ViRWRpdC5kaXNwb3NlKCk7CQotCQkJaWYgKHN0cnVjdEVkaXQhPW51bGwpCi0JCQkJc3RydWN0RWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdChJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5zZXJ2ZXJQcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLSAgfQotCi0JcHVibGljIGNsYXNzIFNlcnZsZXREZXNjcmlwdG9yIHsKLQkJU3RyaW5nIF9uYW1lOwotCQlTdHJpbmcgX2NsYXNzTmFtZTsKLQkJU3RyaW5nIF9kaXNwbGF5TmFtZTsKLQkJTWFwIF9wYXJhbXM7Ci0JCVN0cmluZ1tdIF9tYXBwaW5nczsKLQkJSW50ZWdlciBfbG9hZE9uU3RhcnR1cDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlMmViMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5wbHVnaW47Ci0KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIHBsdWdpbi4KLSogPHA+Ci0qIFRoaXMgcGx1Z2luIGNvbnRhaW5zIHRoZSBncmFwaGljIHVzZXIgaW50ZXJmYWNlIHRvIHRoZQotKiBXZWIgU2VydmljZXMgcnVudGltZSBmb3VuZCBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLQkKLQkvLyBDb3B5cmlnaHQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMy4iOyAvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwkvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICogVGhlIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotICAqLwotICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4gaW5zdGFuY2VfOwotICBwcml2YXRlIExvZyBsb2dfOwotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBydW50aW1lIHBsdWdpbiBvYmplY3QgZm9yIHRoaXMgcGx1Z2luLgotICAqIFRoZSAicGx1Z2luIiBlbGVtZW50IGluIHBsdWdpbi54bWwgc2hvdWxkIGluY2x1ZGUgdGhlIGF0dHJpYnV0ZQotICAqIGNsYXNzID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbiIuCi0gICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4gKCBJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yICkKLSAgewotICAgIHN1cGVyKGRlc2NyaXB0b3IpOwotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSB0aGlzOwotICAgIH0KLSAgICBsb2dfID0gbmV3IEVjbGlwc2VMb2coKTsKLQotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAgKiAoV2ViU2VydmljZVdhc0NyZWF0aW9uVUlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5qc3Qud3Mud2FzLnY1LnRwLnVpIik7Ci0gICogQHJldHVybiBUaGUgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4gc2luZ2xldG9uLgotICAqLwotICBzdGF0aWMgcHVibGljIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbiBnZXRJbnN0YW5jZSAoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCBvbmNlIGJ5IHRoZSBwbGF0Zm9ybSB3aGVuIHRoaXMgcGx1Z2luIGlzIGZpcnN0IGxvYWRlZC4KLSAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhpcyBwbHVnaW4gZmFpbHMgdG8gc3RhcnQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0dXAgKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAJbG9nXy5sb2coTG9nLklORk8sIDUwNjgsIHRoaXMsICJzdGFydHVwIiwgIlN0YXJ0aW5nIHBsdWdpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSIpOwotICAgIHN1cGVyLnN0YXJ0dXAoKTsKLSAgICBzZXRQcmVmZXJlbmNlcygpOwotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIG9uY2UgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhpcyBwbHVnaW4gaXMgdW5sb2FkZWQuCi0gICogQHRocm93cyBDb3JlRXhjZXB0aW9uIElmIHRoaXMgcGx1Z2luIGZhaWxzIHRvIHNodXRkb3duLgotICAqLwotICBwdWJsaWMgdm9pZCBzaHV0ZG93biAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gIAlsb2dfLmxvZyhMb2cuSU5GTywgNTA2OSwgdGhpcywgInNodXRkb3duIiwgIlNodXR0aW5nIHBsdWdpbiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSIpOwotICAgIHN1cGVyLnNodXRkb3duKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBnZW5lcmFsIHByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2VzIHN0b3JlLgotICAqKi8KLSAgcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZXMoKQotICB7Ci0gICAvLyBzZXREaWFsb2dzUHJlZmVyZW5jZXMoKTsKLSAgfQotCi0gLyoqCi0gICAqIEBzZWUgQWJzdHJhY3RVSVBsdWdpbiNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKElQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlKSB7Ci0KLQkvLyBTZXQgdGhlIGRlZmF1bHRzIFByZWZlcmVuY2UKLS8vCUFjdGlvbkRpYWxvZ3NQcmVmZXJlbmNlSGVscGVyLmluaXRpYWxpemVEZWZhdWx0cyhwcmVmZXJlbmNlU3RvcmUpOwotICB9Ci0gCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gICogdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0gICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLSAgKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotICAqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLSAgKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIGtleSApCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfLmdldERlc2NyaXB0b3IoKS5nZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLSAgKiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotICAqIGFyZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoCi0gICogYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IGZvcgotICAqIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLSAgKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotICAqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLSAgKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotICAqIEBwYXJhbSBhcmdzIFRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZQotICAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBtZXNzYWdlIGluIHBsdWdpbi5wcm9wZXJ0aWVzIGFuZAotICAqIGJ5IHRoZSBydWxlcyBvZiBjbGFzcyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MgKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSxhcmdzKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIHJlc291cmNlCi0gICogYXMgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBpbnN0YWxsIGxvY2F0aW9uLgotICAqIEByZXR1cm4gQW4gaW1hZ2UgZGVzY3JpcHRvciwgcG9zc2libHkgbnVsbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMIGluc3RhbGxVUkwgPSBpbnN0YW5jZV8uZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKTsKLSAgICAgIFVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCxuYW1lKTsKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbigpIHsKLSAgICByZXR1cm4gUGxhdGZvcm0uZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbih0aGlzKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLnRvT1NTdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSW5zdGFsbExvY2F0aW9uKCkgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gUGxhdGZvcm0ucmVzb2x2ZShnZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpKS5nZXRGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0gIH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svQlVDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svQlVDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3ZTM2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0JVQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzazsKLQotcHVibGljIGNsYXNzIEJVQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzIGV4dGVuZHMgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzayAKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svQ29weUF4aXNTZXJ2ZXJDb25maWdUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0NvcHlBeGlzU2VydmVyQ29uZmlnVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGFkODBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svQ29weUF4aXNTZXJ2ZXJDb25maWdUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2sgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9DT1BZX1NFUlZFUl9DT05GSUdfRklMRVMiOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0iVEFTS19ERVNDX0NPUFlfU0VSVkVSX0NPTkZJR19GSUxFUyI7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVQTE9ZRURTRVJWSUNFUyA9ICJXRUItSU5GIiArIEZpbGUuc2VwYXJhdG9yICsgInNlcnZlci1jb25maWcud3NkZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gICAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgY29yZU1zZ1V0aWxzXzsKLSAgICBwcml2YXRlIE1lc3NhZ2VVdGlscyBiYXNlQ29uTXNnVXRpbHNfOwotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0JcHJpdmF0ZSBCb29sZWFuIHByb2plY3RSZXN0YXJ0UmVxdWlyZWRfOwotCXByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSURfOwotCXByaXZhdGUgSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotCS8vIHJtIHByaXZhdGUgTW9kZWwgbW9kZWxfOwotCi0JcHVibGljIENvcHlBeGlzU2VydmVyQ29uZmlnVGFzaygpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkJbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQkgICAgYmFzZUNvbk1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ucGx1Z2luIiwgdGhpcyApOwotCQlzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQlzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7CSAKLQotCX0KLQkKLQlwdWJsaWMgQ29weUF4aXNTZXJ2ZXJDb25maWdUYXNrKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkJbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQkgICAgYmFzZUNvbk1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ucGx1Z2luIiwgdGhpcyApOwotCQlzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQlzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7CSAgCi0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQotCX0KLQotCS8qKgotCSogRXhlY3V0ZSBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2sKLQkqLwotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQkgIAotCSAgLy8gcm0gCi0JICAvKgotCSAgICAvL0JlZ2luIHNldHRlcnMKLQkgIFdlYlNlcnZpY2VFbGVtZW50IHdlYlNlcnZpY2VFbGVtZW50ID0KLQkJV2ViU2VydmljZUVsZW1lbnQuZ2V0V2ViU2VydmljZUVsZW1lbnQobW9kZWxfKTsKLQkgIHNldFNlcnZpY2VQcm9qZWN0KHdlYlNlcnZpY2VFbGVtZW50LmdldFNlcnZpY2VQcm9qZWN0KCkpOwotCSAgc2V0U2VydmljZVNlcnZlclR5cGVJRCh3ZWJTZXJ2aWNlRWxlbWVudC5nZXRTZXJ2aWNlU2VydmVyVHlwZUlEKCkpOwotCSAgc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKHdlYlNlcnZpY2VFbGVtZW50LmdldFNlcnZpY2VFeGlzdGluZ1NlcnZlcigpKTsKLQkgIAotCSAgICAvL0VuZCBTZXR0ZXJzCi0JICAgICAqLwotCSAgCi0JICAKLQkgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0JICAgIAotCQlpZiAoamF2YVdTRExQYXJhbV8gPT0gbnVsbCkgewotCQkgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgY29yZU1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSkFWQV9XU0RMX1BBUkFNX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SKTsKLQkJICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICAgIHJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQkvLyBybSAKLQkJLyoKLQkJaWYgKG1vZGVsXyA9PSBudWxsKSB7Ci0JCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX01PREVMX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SKTsKLQkJICAgIHJldHVybiBzdGF0dXM7Ci0JCX0KLQkJKi8KLQkJCi0JCXRyeSB7Ci0KLQkJICAgIHByb2plY3RSZXN0YXJ0UmVxdWlyZWRfID0gQm9vbGVhbi5UUlVFOwotCQkJLy8gcm0gd2ViU2VydmljZUVsZW1lbnQuc2V0UHJvamVjdFJlc3RhcnRSZXF1aXJlZCh0cnVlKTsKLQotCQkJSVByb2plY3QgcHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0XzsKLQkJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBiYXNlQ29uTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QUk9KRUNUX05PVF9GT1VORCIpLCBTdGF0dXMuRVJST1IpOwotCQkJICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCSAgICByZXR1cm4gc3RhdHVzOwotCQkJfQotCi0JCQlJU2VydmVyIGluc3RhbmNlID0KLQkJCQlTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJGb3JNb2R1bGUoCi0JCQkJCVJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLAotCQkJCQlzZXJ2aWNlU2VydmVyVHlwZUlEXywKLQkJCQkJc2VydmljZUV4aXN0aW5nU2VydmVyXywKLQkJCQkJdHJ1ZSwKLQkJCQkJRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBiYXNlQ29uTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlNUQU5DRV9OT1RfRk9VTkQiKSwgU3RhdHVzLkVSUk9SKTsKLQkJCSAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQkgICAgcmV0dXJuIHN0YXR1czsKLQkJCX0KLQotLy8gTTUgUG9ydDogIHJlcGxhY2luZyBpbnN0YW5jZS5pc0xvY2FsKCkgd2l0aCBpbnN0YW5jZS5nZXRGYWN0b3J5SWQoKS5pbmRleE9mKCJ0ZXN0IikgPiAwCi0JCQlpZiAoIShpbnN0YW5jZS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKS5pbmRleE9mKCIudGUiKSA+IDApKSB7Ci0JCQkJSVBhdGggaW5zdGFsbFBhdGggPSBpbnN0YW5jZS5nZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKTsKLQkJCQlJUGF0aCBzb3VyY2VQYXRoID0gaW5zdGFsbFBhdGguYXBwZW5kKAotCQkJCQkJIndlYmFwcHMiKS5hcHBlbmQoICAvLyROT04tTkxTLTEkCi0JCQkJCQlwcm9qZWN0LmdldE5hbWUoKSk7Ci0KLS8vCQkJCUlQYXRoIHdlYk1vZHVsZVBhdGggPSBSZXNvdXJjZVV0aWxzLmdldFdlYk1vZHVsZVNlcnZlclJvb3QocHJvamVjdCkuZ2V0RnVsbFBhdGgoKTsKLQkJCQlJUGF0aCB3ZWJNb2R1bGVQYXRoID0gSjJFRVV0aWxzLmdldEZpcnN0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JCQkJUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgPSBuZXcgVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0KCk7Ci0JCQkJY29udGV4dC5zZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQodHJ1ZSk7Ci0JCQkJY29udGV4dC5zZXRDcmVhdGVGb2xkZXJzRW5hYmxlZCh0cnVlKTsKLQkJCQljb250ZXh0LnNldENoZWNrb3V0RmlsZXNFbmFibGVkKHRydWUpOwotCQkJCUlGaWxlIGZpbGUgPQotCQkJCQlGaWxlUmVzb3VyY2VVdGlscy5jcmVhdGVGaWxlKAotCQkJCQkJY29udGV4dCwKLQkJCQkJCXdlYk1vZHVsZVBhdGguYXBwZW5kKERFUExPWUVEU0VSVklDRVMpLAotCQkJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkJCQlzb3VyY2VQYXRoLmFwcGVuZChERVBMT1lFRFNFUlZJQ0VTKS50b09TU3RyaW5nKCkpLAotCQkJCQkJZW52LmdldFByb2dyZXNzTW9uaXRvcigpLAotCQkJCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCSAgcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkqIFNldHMgdGhlIGphdmFXU0RMUGFyYW0uCi0JKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQKLQkqLwotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkgewotCQlqYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW07Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KQotCXsKLQkgIHNlcnZpY2VQcm9qZWN0XyA9IHNlcnZpY2VQcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVyVHlwZUlEKFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEKQotCXsKLQkgIHNlcnZpY2VTZXJ2ZXJUeXBlSURfID0gc2VydmljZVNlcnZlclR5cGVJRDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKQotCXsKLQkgIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7Ci0JfQkKLQotCS8vIHJtIAotCS8qCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTW9kZWwgbW9kZWwpCi0JewotCSAgbW9kZWxfID0gbW9kZWw7Ci0JfQotCSovCi0JCi0JcHVibGljIEJvb2xlYW4gZ2V0UHJvamVjdFJlc3RhcnRSZXF1aXJlZCgpCi0JewotCSAgcmV0dXJuIHByb2plY3RSZXN0YXJ0UmVxdWlyZWRfOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0RlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0RlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDI0ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9EZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzazsKLQotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsLkNsYXNzcGF0aFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udXRpbC5QbGF0Zm9ybVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnV0aWwuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbC5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotcHVibGljIGNsYXNzIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgY29yZU1zZ1V0aWxzXzsKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBjb25Nc2dVdGlsc187Ci0JCi0JLy8gcm0gcHJpdmF0ZSBNb2RlbCBtb2RlbF87Ci0JcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtXyA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0JcHJpdmF0ZSBTdHJpbmcgamF2YUJlYW5OYW1lXzsgLy8gdGhpcyBuZWVkcyB0byBiZSBzZXQgYnkgdGhlIGV4dGVuc2lvbiB3aXRoIGluaXRpYWwgc2VsZWN0aW9uCi0JcHJpdmF0ZSBTdHJpbmcgV1NETFNlcnZpY2VVUkxfOwotCXByaXZhdGUgU3RyaW5nIFdTRExTZXJ2aWNlUGF0aG5hbWVfOwotCXByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgV1NQYXJzZXJfOwotCS8vIHJtIHByaXZhdGUgV2ViU2VydmljZUVsZW1lbnQgd3NlXzsgLy8gdGVtcG9yYXJ5Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9TRVJWRVJfSkFWQV9XU0RMX0RFRkFVTFRTIjsKLQlwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfU0VSVkVSX0pBVkFfV1NETF9ERUZBVUxUUyI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV1NETF9GT0xERVIgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfRVhUID0gIi9zZXJ2aWNlcy8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV1NETF9FWFQgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgYnl0ZSBNT0RFX0JFQU4gPSAoYnl0ZSkgMDsKLQlwdWJsaWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRV9FWFQgPSAiU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZCgpIHsKLQotCQlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCSAgICBjb3JlTXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29uc3VtcHRpb24iLCB0aGlzICk7Ci0JICAgIGNvbk1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS5wbHVnaW4iLCB0aGlzICk7Ci0KLQkJc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JfQotCQotCi0JcHVibGljIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kKAotCQlKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtLAotCQlNb2RlbCBtb2RlbCkgewotCi0JCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQotCQlzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkJLy9ybSBzZXRNb2RlbChtb2RlbCk7Ci0JCXNldEphdmFXU0RMUGFyYW0oamF2YVdTRExQYXJhbSk7Ci0JCi0JfQotCi0JLyoqCi0JKiBFeGVjdXRlIERlZmF1bHRzRm9ySmF2YVRvV1NETFRhc2sKLQkqLwotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZSggRW52aXJvbm1lbnQgZW52ICkgewotCi0JCVN0YXR1cyBzdGF0dXM7Ci0JCWlmIChqYXZhV1NETFBhcmFtXyA9PSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETFRhc2siLCBjb3JlTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IgKTsKLQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCWlmIChqYXZhQmVhbk5hbWVfID09IG51bGwpIHsgIC8vIGVpdGhlciBzZXQgYnkgZXh0ZW5zaW9uIHBvaW50IG9yIGJlYW4gY2xhc3MgcGFnZQotCQkJamF2YUJlYW5OYW1lXyA9IGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCk7Ci0JCQlpZiAoamF2YUJlYW5OYW1lXyA9PSBudWxsKSB7Ci0JCQkJLy9ybSBqYXZhQmVhbk5hbWVfID0gaXNkRWxlbWVudC5nZXRKYXZhQmVhbk5hbWUoKTsKLQkJCQlqYXZhV1NETFBhcmFtXy5zZXRCZWFuTmFtZShqYXZhQmVhbk5hbWVfKTsKLQkJCX0KLQkJfQotCQkvLyBybSBXU1BhcnNlcl8gPQkoV2ViU2VydmljZXNQYXJzZXIpIHdzZV8uZ2V0V1NQYXJzZXIoKTsKLQkJCi0JCWphdmFXU0RMUGFyYW1fLnNldFNlcnZlclNpZGUoSmF2YVdTRExQYXJhbWV0ZXIuU0VSVkVSX1NJREVfQkVBTik7Ci0JCWphdmFXU0RMUGFyYW1fLnNldFNrZWxldG9uRGVwbG95KGZhbHNlKTsKLQotCQlqYXZhV1NETFBhcmFtXy5zZXRCZWFuTmFtZShqYXZhQmVhbk5hbWVfKTsKLQkJU3RyaW5nIGNsYXNzcGF0aCA9IENsYXNzcGF0aFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0Q2xhc3NwYXRoU3RyaW5nKHNlcnZpY2VQcm9qZWN0Xyk7Ci0JCWphdmFXU0RMUGFyYW1fLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOwotCi0JCVN0cmluZyBzaW1wbGVCZWFuTmFtZSA9IGphdmFCZWFuTmFtZV87Ci0JCVN0cmluZyBiZWFuUGFja2FnZU5hbWUgPSBudWxsOwotCQlpZiAoamF2YUJlYW5OYW1lXyAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBqYXZhQmVhbk5hbWVfLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlzaW1wbGVCZWFuTmFtZSA9IGphdmFCZWFuTmFtZV8uc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJYmVhblBhY2thZ2VOYW1lID0gamF2YUJlYW5OYW1lXy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBuYW1lc3BhY2UgPSBXU0RMVXRpbHMubWFrZU5hbWVzcGFjZShqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0KLQkJamF2YVdTRExQYXJhbV8uc2V0UG9ydFR5cGVOYW1lKHNpbXBsZUJlYW5OYW1lKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0U2VydmljZU5hbWUoc2ltcGxlQmVhbk5hbWUgKyBTRVJWSUNFX05BTUVfRVhUKTsKLQotCQlJUGF0aCBtb2R1bGVTZXJ2ZXJSb290ID0gbnVsbDsKLQotCQlJUGF0aCBtb2R1bGVQYXRoID0gc2VydmljZVByb2plY3RfLmdldEZ1bGxQYXRoKCk7Ci0JCUlQYXRoIHdlYmluZlBhdGggPSBzZXJ2aWNlUHJvamVjdF8uZ2V0RnVsbFBhdGgoKTsKLQkJdHJ5IHsKLQkJCWlmICggUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3Qoc2VydmljZVByb2plY3RfKSkgewotCQkJCW1vZHVsZVNlcnZlclJvb3QgPSBSZXNvdXJjZVV0aWxzLmdldEphdmFTb3VyY2VMb2NhdGlvbihzZXJ2aWNlUHJvamVjdF8pOwotCQkJCS8vIHNob3VsZCB1c2UgTW9kdWxlQ29yZS5nZXRTb3VyY2VDb250YWluZXJzKCk7Ci0vLwkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IFJlc291cmNlVXRpbHMuZ2V0V2ViTW9kdWxlU2VydmVyUm9vdChzZXJ2aWNlUHJvamVjdF8pOwotLy8JCQkJaWYgKGNvbnRhaW5lciE9bnVsbCkgewotLy8JCQkJCW1vZHVsZVNlcnZlclJvb3QgPSBjb250YWluZXIuZ2V0RnVsbFBhdGgoKTsKLS8vCQkJCX0KLQkJCQkKLQkJCQltb2R1bGVQYXRoID0gbW9kdWxlUGF0aC5hcHBlbmQoSjJFRVV0aWxzLmdldEZpcnN0V2ViTW9kdWxlTmFtZShzZXJ2aWNlUHJvamVjdF8pKTsKLQkJCQl3ZWJpbmZQYXRoID0gSjJFRVV0aWxzLmdldEZpcnN0V2ViSW5mUGF0aChzZXJ2aWNlUHJvamVjdF8pOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSAgbmV3IFNpbXBsZVN0YXR1cyggIkRlZmF1bHRzRm9yU2VydmVySmF2YVdTRExUYXNrIiwgY29uTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ERUZBVUxUX0JFQU4iKSwgU3RhdHVzLkVSUk9SLCBlICk7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJSVBhdGggd3NkbFBhdGggPQotCQkJbW9kdWxlUGF0aC5hcHBlbmQoV1NETF9GT0xERVIpLmFwcGVuZChzaW1wbGVCZWFuTmFtZSkuYWRkRmlsZUV4dGVuc2lvbihXU0RMX0VYVCk7Ci0KLQkJdHJ5ewotCQkJSUZvbGRlciBmb2xkZXIgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRGb2xkZXIobW9kdWxlUGF0aC5hcHBlbmQoV1NETF9GT0xERVIpKTsKLQkJCUZpbGVVdGlsLmNyZWF0ZUZvbGRlcihmb2xkZXIsIHRydWUsIHRydWUpOwotCQkKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIkRlZmF1bHRzRm9yU2VydmVySmF2YVdTRExUYXNrIiwgY29uTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XUklURV9XU0RMIiksIFN0YXR1cy5FUlJPUiwgZSApOwotCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQkKLQkJU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldEZpbGUod3NkbFBhdGgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQotCQlqYXZhV1NETFBhcmFtXy5zZXRPdXRwdXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0SW5wdXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLQkJV1NETFNlcnZpY2VQYXRobmFtZV8gPSB3c2RsUGF0aC50b1N0cmluZygpOwotCi0JCWlmICh3c2RsUGF0aCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgd3NkbFVSTCA9IFBsYXRmb3JtVXRpbHMuZ2V0RmlsZVVSTEZyb21QYXRoKG5ldyBQYXRoKHdzZGxMb2NhdGlvbikpOwotCQkJV1NETFNlcnZpY2VVUkxfID0gd3NkbFVSTDsKLQkJCS8vIHNldCBwYXJzZXIgCi0JCQlpZiAod3NkbFVSTCA9PSBudWxsIHx8IHdzZGxVUkwubGVuZ3RoKCkgPD0gMCkgewotCQkJCUlSZXNvdXJjZSByZXMgPQotCQkJCQlSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShXU0RMU2VydmljZVBhdGhuYW1lXyk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCQl3c2RsVVJMID0gKG5ldyBVdGlscygpKS50b0ZpbGVTeXN0ZW1VUkkocmVzKTsKLQkJCX0KLQkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0JCQlpZiAod3NkbFVSTCAhPSBudWxsICYmIHdzZGxVUkwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaWYgKFdTUGFyc2VyXyA9PSBudWxsKSB7Ci0JCQkJCVdTUGFyc2VyXyA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotCQkJCX0KLQkJCQlkZWZpbml0aW9uID0gV1NQYXJzZXJfLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotCQkJfQotCQl9Ci0KLQkJamF2YVdTRExQYXJhbV8uc2V0U3R5bGUoSmF2YVdTRExQYXJhbWV0ZXIuU1RZTEVfUlBDKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0VXNlKEphdmFXU0RMUGFyYW1ldGVyLlVTRV9FTkNPREVEKTsKLQotCQlTdHJpbmcgcHJvamVjdFVSTCA9CVJlc291cmNlVXRpbHMuZ2V0RW5jb2RlZFdlYlByb2plY3RVUkwoc2VydmljZVByb2plY3RfKTsKLQkJU3RyaW5nIHNlcnZpY2VVUkwgPSBudWxsOwotCQlpZiAocHJvamVjdFVSTCA9PSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETFRhc2siLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BST0pFQ1RfVVJMIiksIFN0YXR1cy5FUlJPUik7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCXNlcnZpY2VVUkwgPSBwcm9qZWN0VVJMICsgU0VSVklDRV9FWFQgKyBzaW1wbGVCZWFuTmFtZTsKLQotCQlqYXZhV1NETFBhcmFtXy5zZXRVcmxMb2NhdGlvbihzZXJ2aWNlVVJMKTsKLQotCQlqYXZhV1NETFBhcmFtXy5zZXRNZXRhSW5mT25seSh0cnVlKTsKLQotCQkvLwkJU3RyaW5nIGphdmFPdXRwdXQgPSBQbGF0Zm9ybVV0aWxzLmdldFBsYXRmb3JtVVJMKG1vZHVsZVNlcnZlclJvb3QpOwotCQkvLwkJU3RyaW5nIG91dHB1dCA9IFBsYXRmb3JtVXRpbHMuZ2V0UGxhdGZvcm1VUkwobW9kdWxlUGF0aCk7Ci0KLQkJU3RyaW5nIGphdmFPdXRwdXQgPQlSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShtb2R1bGVTZXJ2ZXJSb290KS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCi0JCVN0cmluZyBzZXJ2aWNlTmFtZSA9IGphdmFXU0RMUGFyYW1fLmdldFNlcnZpY2VOYW1lKCk7Ci0JCUlQYXRoIG91dHB1dFBhdGggPQlSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSh3ZWJpbmZQYXRoKS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgb3V0cHV0ID0gc2VydmljZVByb2plY3RfLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJaWYgKG91dHB1dFBhdGghPW51bGwpCi0JCSBvdXRwdXQgPSBvdXRwdXRQYXRoLmFwcGVuZChzZXJ2aWNlTmFtZSkudG9TdHJpbmcoKTsKLQotCQlqYXZhV1NETFBhcmFtXy5zZXRKYXZhT3V0cHV0KGphdmFPdXRwdXQpOwotCQlqYXZhV1NETFBhcmFtXy5zZXRPdXRwdXQob3V0cHV0KTsKLQkJCi0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGphdmFXU0RMUGFyYW0uCi0JICogQHJldHVybiBKYXZhV1NETFBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkgewotCQlyZXR1cm4gamF2YVdTRExQYXJhbV87Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLQkgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkJdGhpcy5qYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW07Ci0JfQotCi0JLy8gcm0KLQkvKgotCXB1YmxpYyB2b2lkIHNldE1vZGVsKE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWxfID0gbW9kZWw7Ci0JfQotCSovCi0JCi0JcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpIHsKLQkJdGhpcy5zZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SmF2YUJlYW5OYW1lKFN0cmluZyBqYXZhQmVhbk5hbWUpIHsKLQkJdGhpcy5qYXZhQmVhbk5hbWVfID0gamF2YUJlYW5OYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFdTRExTZXJ2aWNlVVJMKCkgewotCQlyZXR1cm4gV1NETFNlcnZpY2VVUkxfOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFdTRExTZXJ2aWNlUGF0aG5hbWUoKSB7Ci0JCXJldHVybiBXU0RMU2VydmljZVBhdGhuYW1lXzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdzUGFyc2VyKSB7Ci0JCXRoaXMuV1NQYXJzZXJfID0gd3NQYXJzZXI7Ci0JfQotCQotCXB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCXJldHVybiBXU1BhcnNlcl87Ci0JfQotCi0gIHB1YmxpYyB2b2lkIHNldE9iamVjdFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAob2JqZWN0U2VsZWN0aW9uICE9IG51bGwgJiYgIW9iamVjdFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IG9iamVjdFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgIHNldEphdmFCZWFuTmFtZSgoU3RyaW5nKW9iamVjdCk7Ci0gICAgfQotICB9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9MaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0xpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzZjM0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0xpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzazsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIExpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2sgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfTElURVJBTF9TVVBQT1JUX01FU1NBR0UiOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0KLQkJIlRBU0tfREVTQ19MSVRFUkFMX1NVUFBPUlRfTUVTU0FHRSI7Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIGNvcmVNc2dVdGlsc187Ci0KLQlwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotCi0JcHVibGljIExpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2soKSB7Ci0JICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQrIi5wbHVnaW4iLCB0aGlzKTsKLQkgICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotCSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCSAgICBzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7CQotCX0KLQkKLQlwdWJsaWMgTGl0ZXJhbFN1cHBvcnRNZXNzYWdlVGFzayhKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0JICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQrIi5wbHVnaW4iLCB0aGlzKTsKLQkgICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotCSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCSAgICBzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7CQotCQlqYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW07Ci0KLQl9Ci0KLQotCS8qKgotCSogRXhlY3V0ZSBMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrCi0JKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkJaWYgKGphdmFXU0RMUGFyYW1fID09IG51bGwpIHsKLQkJICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsY29yZU1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSkFWQV9XU0RMX1BBUkFNX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SKTsKLQkJICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICAgIHJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQlTdHJpbmcgdXNlID0gamF2YVdTRExQYXJhbV8uZ2V0VXNlKCk7Ci0JCWlmKHVzZSAhPSBudWxsICYmIAotCQkJdXNlLmVxdWFscyhKYXZhV1NETFBhcmFtZXRlci5VU0VfTElURVJBTCkpewotCQkgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0xJVEVSQUxfU1VQUE9SVF9NRVNTQUdFIiksIFN0YXR1cy5XQVJOSU5HKTsKLQkJICAgIHRyeQotCQkJewotCQkgICAgCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0JCSAgICB9Ci0JCSAgICBjYXRjaChTdGF0dXNFeGNlcHRpb24gc2UpCi0JCQl7Ci0JCSAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwiVXNlciBhYm9ydGVkIixTdGF0dXMuRVJST1IpOwotCQkgICAgfQotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkKLQl7Ci0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL01vdmVEZXBsb3ltZW50RmlsZXNUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL01vdmVEZXBsb3ltZW50RmlsZXNUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOGJjMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9Nb3ZlRGVwbG95bWVudEZpbGVzVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzazsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSVdlYk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5KMkVFV2ViTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIE1vdmVEZXBsb3ltZW50RmlsZXNUYXNrIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX01PVkVfREVQTE9ZTUVOVF9GSUxFUyI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX01PVkVfREVQTE9ZTUVOVF9GSUxFUyI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIE1FVEFfSU5GID0gIk1FVEEtSU5GIjsJLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIGNvcmVNc2dVdGlsc187Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0OwotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotCQotCXB1YmxpYyBNb3ZlRGVwbG95bWVudEZpbGVzVGFzaygpCi0gIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLSAgfQotCi0gIC8qKgotCSogRXhlY3V0ZSBEZWZhdWx0c0ZvckphdmFUb1dTRExUYXNrCi0JKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkJaWYgKGphdmFXU0RMUGFyYW1fID09IG51bGwpIHsKLQkJICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLGNvcmVNc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pBVkFfV1NETF9QQVJBTV9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUik7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgIHJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLQkJU3RyaW5nIHByb2plY3RVUkwgPSBSZXNvdXJjZVV0aWxzLmdldEVuY29kZWRXZWJQcm9qZWN0VVJMKHByb2plY3QpOwotCQlpZiAocHJvamVjdFVSTCA9PSBudWxsKSB7Ci0JCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUFJPSkVDVF9VUkwiLG5ldyBTdHJpbmdbXSB7IHByb2plY3QudG9TdHJpbmcoKX0pLCBTdGF0dXMuRVJST1IpOwotCQkgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICAgcmV0dXJuIHN0YXR1czsJCSAgCi0JCX0gZWxzZSB7Ci0JCQlqYXZhV1NETFBhcmFtXy5zZXRQcm9qZWN0VVJMKHByb2plY3RVUkwpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWlmICghcHJvamVjdC5oYXNOYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCkpCi0JCQkJcmV0dXJuIHN0YXR1czsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCSAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVEVSQUwiKSwgU3RhdHVzLkVSUk9SLCBleCk7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgIHJldHVybiBzdGF0dXM7CQkgIAotCQl9Ci0JCVN0cmluZ1tdIGRlcGxveUZpbGVzID0gamF2YVdTRExQYXJhbV8uZ2V0RGVwbG95bWVudEZpbGVzKCk7Ci0JCVN0cmluZyBqYXZhT3V0cHV0ID0gamF2YVdTRExQYXJhbV8uZ2V0SmF2YU91dHB1dCgpOwotCi0JCWlmIChkZXBsb3lGaWxlcyA9PSBudWxsIHx8IGphdmFPdXRwdXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0KLQkJSVBhdGggd2ViaW5mUGF0aCA9IHByb2plY3QuZ2V0TG9jYXRpb24oKTsKLQkJdHJ5IHsKLQotCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpKSB7Ci0JCQkJSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViUHJvamVjdCA9Ci0JCQkJCShKMkVFV2ViTmF0dXJlUnVudGltZSkgcHJvamVjdC5nZXROYXR1cmUoCi0JCQkJCQlJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKTsKLQkJCQl3ZWJpbmZQYXRoID0gd2ViaW5mUGF0aC5hcHBlbmQod2ViUHJvamVjdC5nZXRXRUJJTkZQYXRoKCkpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBsb3lGaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkZXBsb3lGaWxlc1tpXSk7Ci0gICAgICAgIFN0cmluZyByZXNvdXJjZVRvTW92ZSA9IGYuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyB0YXJnZXRGaWxlTmFtZSA9IHdlYmluZlBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQocmVzb3VyY2VUb01vdmUpLnRvU3RyaW5nKCk7Ci0JCQkJRmlsZVV0aWwuY3JlYXRlVGFyZ2V0RmlsZShkZXBsb3lGaWxlc1tpXSwgdGFyZ2V0RmlsZU5hbWUsIHRydWUpOwotCQkJCUZpbGUgZGVwbG95bWVudEZpbGUgPSBuZXcgRmlsZShkZXBsb3lGaWxlc1tpXSk7Ci0JCQkJZGVwbG95bWVudEZpbGUuZGVsZXRlKCk7Ci0JCQkJZGVwbG95RmlsZXNbaV0gPSB0YXJnZXRGaWxlTmFtZTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NT1ZFX1JFU09VUkNFIixuZXcgU3RyaW5nW10geyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBTdGF0dXMuRVJST1IsIGUpOwotCQkgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICByZXR1cm4gc3RhdHVzOwkJICAKLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpCi0JewotCQlyZXR1cm4gamF2YVdTRExQYXJhbV87Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkKLQl7Ci0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdChJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0KQotCXsKLQkgIHRoaXMuc2VydmVyUHJvamVjdCA9IHNlcnZlclByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9Nb3ZlSmF2YUZpbGVzVGFzay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9Nb3ZlSmF2YUZpbGVzVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWQ4M2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svTW92ZUphdmFGaWxlc1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2s7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgTW92ZUphdmFGaWxlc1Rhc2sgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfTU9WRV9KQVZBX0ZJTEVTIjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfTU9WRV9KQVZBX0ZJTEVTIjsKLQotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIGNvcmVNc2dVdGlsc187Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0JLy8gcm0gcHJpdmF0ZSBNb2RlbCBtb2RlbF87Ci0KLQlwdWJsaWMgTW92ZUphdmFGaWxlc1Rhc2soKSB7Ci0JICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCSAgICBjb3JlTXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29uc3VtcHRpb24iLCB0aGlzICk7Ci0JICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsJICAKLQl9Ci0JCi0KLQlwdWJsaWMgTW92ZUphdmFGaWxlc1Rhc2soSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkgewotCSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQkgICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotCSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCSAgICBzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7CSAgCi0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQotCX0KLQotCS8qKgotCSogRXhlY3V0ZSBEZWZhdWx0c0ZvckphdmFUb1dTRExUYXNrCi0JKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0JICAKLQkgIC8vIHJtIAotCSAgLyoKLQkgIC8vQmVnaW4gU2V0dGVycwotCSAgV2ViU2VydmljZUVsZW1lbnQgd3NlID0KLQkJCVdlYlNlcnZpY2VFbGVtZW50LmdldFdlYlNlcnZpY2VFbGVtZW50KG1vZGVsXyk7Ci0JICBzZXRTZXJ2aWNlUHJvamVjdCh3c2UuZ2V0U2VydmljZVByb2plY3QoKSk7Ci0JICAvL0VuZCBTZXR0ZXJzCi0JICAqLwotCSAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCSAgCi0JCWlmIChqYXZhV1NETFBhcmFtXyA9PSBudWxsKSB7Ci0JCSAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixjb3JlTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICByZXR1cm4gc3RhdHVzOwkJICAKLQkJfQotCi0JCS8vIHJtIAotCQkvKgotCQlpZiAobW9kZWxfID09IG51bGwpIHsKLQkJICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTU9ERUxfTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkgIHJldHVybiBzdGF0dXM7CQkgIAotCQl9Ci0JCSovCi0KLQkJSVByb2plY3QgcHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0XzsKLQkJU3RyaW5nIHByb2plY3RVUkwgPSBSZXNvdXJjZVV0aWxzLmdldEVuY29kZWRXZWJQcm9qZWN0VVJMKHByb2plY3QpOwotCQlpZiAocHJvamVjdFVSTCA9PSBudWxsKSB7Ci0JCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUFJPSkVDVF9VUkwiLG5ldyBTdHJpbmdbXSB7cHJvamVjdC50b1N0cmluZygpfSksIFN0YXR1cy5FUlJPUik7Ci0JCSAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCSAgICByZXR1cm4gc3RhdHVzOwkJICAKLQotCQl9IGVsc2UgewotCQkJamF2YVdTRExQYXJhbV8uc2V0UHJvamVjdFVSTChwcm9qZWN0VVJMKTsKLQkJfQotCi0JCVN0cmluZ1tdIGphdmFGaWxlcyA9IGphdmFXU0RMUGFyYW1fLmdldEphdmFGaWxlcygpOwotCQlTdHJpbmcgamF2YW91dHB1dCA9IGphdmFXU0RMUGFyYW1fLmdldEphdmFPdXRwdXQoKTsgIC8vIDx3ZWJwcm9qZWN0Pi9KYXZhU291cmNlCi0JCVN0cmluZyBvdXRwdXQgPSBqYXZhV1NETFBhcmFtXy5nZXRPdXRwdXQoKTsgIAkJIC8vIDx3ZWJwcm9qZWN0Pi9XZWJDb250ZW50L01FVEFfSU5GCi0KLQkJaWYoamF2YUZpbGVzID09IG51bGwgfHwgamF2YW91dHB1dCA9PSBudWxsICYmIG91dHB1dCA9PSBudWxsICl7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGphdmFGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyByZXNvdXJjZVRvTW92ZSA9IGphdmFGaWxlc1tpXS5zdWJzdHJpbmcob3V0cHV0Lmxlbmd0aCgpKTsKLQkJCQlTdHJpbmcgdGFyZ2V0RmlsZU5hbWUgPSBqYXZhb3V0cHV0ICsgcmVzb3VyY2VUb01vdmU7Ci0JCQkJRmlsZSByZXN1bHRGaWxlID0gbmV3IEZpbGUodGFyZ2V0RmlsZU5hbWUpOwotCQkJCS8vIGNvcHkgamF2YSBmaWxlcyB0aGF0IHdpdGhvdXQgb3Zlcnd0cml0aW5nIGV4aXN0aW5nIG9uZXMKLS8vCQkJCWlmICghcmVzdWx0RmlsZS5leGlzdHMoKSkgewotLy8JCQkJCUZpbGVVdGlsLmNyZWF0ZVRhcmdldEZpbGUoCi0vLwkJCQkJCWphdmFGaWxlc1tpXSwKLS8vCQkJCQkJamF2YW91dHB1dCArIHJlc291cmNlVG9Nb3ZlKTsKLS8vCQkJCX0KLQkJCQkvLyBkZWxldGUgamF2YSBmaWxlcyBmcm9tIHRoZSBvdXRwdXQgZGlyZWN0b3J5Ci0JCQkJRmlsZSBzb3VyY2UgPSBuZXcgRmlsZShqYXZhRmlsZXNbaV0pOwotCQkJCXNvdXJjZS5kZWxldGUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTU9WRV9SRVNPVVJDRSIsbmV3IFN0cmluZ1tde2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIFN0YXR1cy5FUlJPUiwgZSk7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgIHJldHVybiBzdGF0dXM7CQkgIAotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkKLQl7Ci0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQl9Ci0JCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0JCXJldHVybiBqYXZhV1NETFBhcmFtXzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpCi0JewotCSAgc2VydmljZVByb2plY3RfID0gc2VydmljZVByb2plY3Q7Ci0JfQotCQotCS8vIHJtCi0JLyoKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChNb2RlbCBtb2RlbCkKLQl7Ci0JICBtb2RlbF8gPSBtb2RlbDsKLQl9Ci0JKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svU2tlbGV0b24yV1NETENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svU2tlbGV0b24yV1NETENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxYTU1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL1NrZWxldG9uMldTRExDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvamVjdC5FSkJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSUVKQk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklXZWJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSjJFRVdlYk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udXRpbC5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsLlBsYXRmb3JtVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udXRpbC5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNvcHlXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgU2tlbGV0b24yV1NETENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1NLRUxFVE9OX1dTREwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX1NLRUxFVE9OX1dTREwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTCA9ICJJbXBsIjsJLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9FWFQgPSAiL3NlcnZpY2VzLyI7CS8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRVhUID0gIndzZGwiOwkvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1QgPSAiLiI7CS8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNMQVNIID0gIi8iOwkvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9TVUZGSVggPSAiOi8vIjsJLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBXU0RMX0ZPTERFUiA9ICJ3c2RsIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW07Ci0gIHByaXZhdGUgSVByb2plY3Qgc2VydmVyUHJvamVjdDsKLSAgcHJpdmF0ZSBIYXNoTWFwIHZpc2l0ZWRMaW5rczsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0gIHB1YmxpYyBTa2VsZXRvbjJXU0RMQ29tbWFuZCgpIHsKLSAgICBzdXBlcihXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZShMQUJFTCksIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBzZXROYW1lKCBMQUJFTCApOwotICAgIHNldERlc2NyaXB0aW9uKCBERVNDUklQVElPTiApOwotICB9Ci0KLSAgLyoqCi0gICogRXhlY3V0ZSBTa2VsZXRvbjJXU0RMQ29tbWFuZAotICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgaWYgKCEoZW52IGluc3RhbmNlb2YgRWNsaXBzZUVudmlyb25tZW50KSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9UX0lOX0VDTElQU0VfRU5WSVJPTk1FTlQiLCBuZXcgU3RyaW5nW10geyJTa2VsZXRvbjJXU0RMQ29tbWFuZCJ9KSwgU3RhdHVzLkVSUk9SLCBudWxsKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGlmIChqYXZhV1NETFBhcmFtID09IG51bGwpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pBVkFfV1NETF9QQVJBTV9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAvLyBSZWFkIFdTREwKLSAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQlTdHJpbmcgd3NkbFVSTCA9IGphdmFXU0RMUGFyYW0uZ2V0SW5wdXRXc2RsTG9jYXRpb24oKTsKLQl0cnkKLQl7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKHdzZGxVUkwpOwotCQlkZWZpbml0aW9uID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24odXJsLnRvU3RyaW5nKCkpOwotCX0KLQljYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQl7Ci0JCXdzZGxVUkwgPSBQbGF0Zm9ybVV0aWxzLmdldEZpbGVVUkxGcm9tUGF0aChuZXcgUGF0aCh3c2RsVVJMKSk7Ci0JCWRlZmluaXRpb24gPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLQl9Ci0KLSAgICAvLyBDb21wdXRlIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBiZWFuIHNrZWxldG9uCi0gICAgU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICBQb3J0IHBvcnQgPSBudWxsOwotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBiZWFuTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGJlYW5OYW1lLmFwcGVuZChXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWUoZGVmaW5pdGlvbikpOwotICAgICAgYmVhbk5hbWUuYXBwZW5kKERPVCk7Ci0gICAgICB0cnl7Ci0gICAgICBzZXJ2aWNlID0gKFNlcnZpY2UpIGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgIHBvcnQgPSAoUG9ydCkgc2VydmljZS5nZXRQb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0gICAgICBiZWFuTmFtZS5hcHBlbmQoYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgIGJlYW5OYW1lLmFwcGVuZChJTVBMKTsKLSAgICAgIGphdmFXU0RMUGFyYW0uc2V0QmVhbk5hbWUoYmVhbk5hbWUudG9TdHJpbmcoKSk7Ci0KLSAgICAgIGphdmFXU0RMUGFyYW0uc2V0UG9ydFR5cGVOYW1lKFdTRExVdGlscy5nZXRQb3J0VHlwZU5hbWUoZGVmaW5pdGlvbikpOwotICAgICAgamF2YVdTRExQYXJhbS5zZXRTZXJ2aWNlTmFtZSgKLSAgICAgICAgV1NETFV0aWxzLmdldFNlcnZpY2VFbGVtZW50TmFtZShkZWZpbml0aW9uKSk7Ci0gICAgICBqYXZhV1NETFBhcmFtLnNldEJlYW5QYWNrYWdlKFdTRExVdGlscy5nZXRQYWNrYWdlTmFtZShkZWZpbml0aW9uKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChUaHJvd2FibGUgZSl7Ci0gICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICB9IAotICAgIGVsc2UgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dTRExfTk9fREVGSU5JVElPTiIsIG5ldyBTdHJpbmdbXSB7d3NkbFVSTH0pLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICAvLyBNb2RpZnkgV1NETCBlbmRwb2ludAotICAgIGlmIChwb3J0ID09IG51bGwpIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5JRCwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XU0RMX05PX1BPUlQiLCBuZXcgU3RyaW5nW10ge3dzZGxVUkx9KSwgU3RhdHVzLkVSUk9SLCBudWxsKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIE1hcCBzZXJ2aWNlcyA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIHNlcnZpY2VzSXQgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBzZXJ2aWNlc0l0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgU2VydmljZSBzID0gKFNlcnZpY2Upc2VydmljZXNJdC5uZXh0KCk7Ci0gICAgICBNYXAgcG9ydHMgPSBzLmdldFBvcnRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIHBvcnRzSXQgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBwb3J0c0l0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBvcnQgcCA9IChQb3J0KXBvcnRzSXQubmV4dCgpOwotICAgICAgICBtb2RpZnlFbmRwb2ludChwKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2aXNpdGVkTGlua3MgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLy8gU2V0IFdTREwgZmlsZSBuYW1lOiBqYXZhV1NETFBhcmFtLnNldE91dHB1dFdzZGxMb2NhdGlvbigpOwotICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLSAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gamF2YVdTRExQYXJhbS5nZXRPdXRwdXRXc2RsTG9jYXRpb24oKTsKLSAgICBJUGF0aCB3c2RsUGF0aCA9IG51bGw7Ci0gICAgSUZpbGUgb3V0cHV0RmlsZSA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgaWYod3NkbExvY2F0aW9uICE9IG51bGwpewotCQlvdXRwdXRGaWxlID0gd29ya3NwYWNlLmdldEZpbGVGb3JMb2NhdGlvbiggbmV3IFBhdGgod3NkbExvY2F0aW9uKSk7Ci0gICAgIH0KLSAgICAgZWxzZXsKLQkJd3NkbFBhdGggPSBzZXJ2ZXJQcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCWlmIChzZXJ2ZXJQcm9qZWN0Lmhhc05hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKSkgewotCQkJICAgSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViUHJvamVjdCA9Ci0JCQkJIChKMkVFV2ViTmF0dXJlUnVudGltZSkgc2VydmVyUHJvamVjdC5nZXROYXR1cmUoCi0JCQkJICAgSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCk7Ci0JCQkgICB3c2RsUGF0aCA9IHdlYlByb2plY3QuZ2V0V2ViTW9kdWxlUGF0aCgpOwotCQkJICAgLy93c2RsUGF0aCA9IHdzZGxQYXRoLmFwcGVuZCh3ZWJQcm9qZWN0LmdldFdFQklORlBhdGgoKSk7Ci0JCQkgfQotCQllbHNlIGlmIChzZXJ2ZXJQcm9qZWN0Lmhhc05hdHVyZShJRUpCTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkpCi0JCXsKLQkJCUVKQk5hdHVyZVJ1bnRpbWUgZWpiUHJvamVjdCA9IEVKQk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShzZXJ2ZXJQcm9qZWN0KTsKLQkJCXdzZGxQYXRoID0gd3NkbFBhdGguYXBwZW5kKGVqYlByb2plY3QuZ2V0TWV0YUZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpKTsKLQkJfQkJCi0KLQkJCSBJUGF0aCB3c2RsRmlsZVBhdGggPSB3c2RsUGF0aC5hcHBlbmQoV1NETF9GT0xERVIpLmFwcGVuZChwb3J0LmdldE5hbWUoKSkuYWRkRmlsZUV4dGVuc2lvbihXU0RMX0VYVCk7Ci0JCSAgICAgSUZvbGRlciBmb2xkZXIgPSBSZXNvdXJjZVV0aWxzCi0JCQkJCQkJCS5nZXRXb3Jrc3BhY2VSb290KCkKLQkJCQkJCQkJLmdldEZvbGRlcih3c2RsUGF0aC5hcHBlbmQoV1NETF9GT0xERVIpKTsKLQkJCSBGaWxlVXRpbC5jcmVhdGVGb2xkZXIoZm9sZGVyLCB0cnVlLCB0cnVlKTsJCi0JCSAgICAgb3V0cHV0RmlsZSA9IHdvcmtzcGFjZS5nZXRGaWxlKHdzZGxGaWxlUGF0aCk7Ci0JCQkgd3NkbExvY2F0aW9uID0gb3V0cHV0RmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkgamF2YVdTRExQYXJhbS5zZXRPdXRwdXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLQkJCSAKLSAgICAgfQotCi0gICAgIC8vIGNvcHkgV1NETAotICAgICBDb3B5V1NETENvbW1hbmQgY29weVdTRExDb21tYW5kID0gbmV3IENvcHlXU0RMQ29tbWFuZCgpOwotICAgICBjb3B5V1NETENvbW1hbmQuc2V0V2ViU2VydmljZXNQYXJzZXIod2ViU2VydmljZXNQYXJzZXIpOwotICAgICBjb3B5V1NETENvbW1hbmQuc2V0V3NkbFVSSSh3c2RsVVJMKTsKLSAgICAgY29weVdTRExDb21tYW5kLnNldERlc3RpbmF0aW9uVVJJKG91dHB1dEZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCkpOwotICAgICBjb3B5V1NETENvbW1hbmQuc2V0RGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgU3RhdHVzIHN0YXR1cyA9IGNvcHlXU0RMQ29tbWFuZC5leGVjdXRlKGVudik7Ci0gICAgIGlmKHN0YXR1cyE9bnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKSB7Ci0gICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgfQotICAgIH0gCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1JJVEVfV1NETCIsIG5ldyBTdHJpbmdbXSB7IHdzZGxMb2NhdGlvbiB9KSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHByaXZhdGUgU3RhdHVzIG1vZGlmeUVuZHBvaW50KFBvcnQgcG9ydCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIFNPQVBBZGRyZXNzIHNvYXBBZGRyZXNzID0gbnVsbDsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgU09BUEFkZHJlc3MpCi0gICAgICB7Ci0gICAgICAgIHNvYXBBZGRyZXNzID0gKFNPQVBBZGRyZXNzKW9iajsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChzb2FwQWRkcmVzcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwcm9qZWN0VVJMID0gUmVzb3VyY2VVdGlscy5nZXRFbmNvZGVkV2ViUHJvamVjdFVSTChzZXJ2ZXJQcm9qZWN0KTsKLSAgICAgIGlmIChwcm9qZWN0VVJMID09IG51bGwpCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5JRCwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QUk9KRUNUX1VSTCIsIG5ldyBTdHJpbmdbXSB7c2VydmVyUHJvamVjdC50b1N0cmluZygpfSksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBTdHJpbmdCdWZmZXIgc2VydmljZVVSTCA9IG5ldyBTdHJpbmdCdWZmZXIocHJvamVjdFVSTCk7Ci0gICAgICBzZXJ2aWNlVVJMLmFwcGVuZChTRVJWSUNFX0VYVCkuYXBwZW5kKHBvcnQuZ2V0TmFtZSgpKTsKLSAgICAgIGphdmFXU0RMUGFyYW0uc2V0VXJsTG9jYXRpb24oc2VydmljZVVSTC50b1N0cmluZygpKTsKLSAgICAgIHNvYXBBZGRyZXNzLnNldExvY2F0aW9uVVJJKHNlcnZpY2VVUkwudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbS4KLSAgKiBAcmV0dXJuIEphdmFXU0RMUGFyYW1ldGVyCi0gICovCi0gIHB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkgewotICAgIHJldHVybiBqYXZhV1NETFBhcmFtOwotICB9Ci0KLSAgLyoqCi0gICogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLSAgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0gICAgdGhpcy5qYXZhV1NETFBhcmFtID0gamF2YVdTRExQYXJhbTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2VydmVyUHJvamVjdCBUaGUgc2VydmVyUHJvamVjdCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KElQcm9qZWN0IHNlcnZlclByb2plY3QpIHsKLSAgICB0aGlzLnNlcnZlclByb2plY3QgPSBzZXJ2ZXJQcm9qZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZXNQYXJzZXIuCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKSB7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlc1BhcnNlciBUaGUgd2ViU2VydmljZXNQYXJzZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpIHsKLSAgICB0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEphdmFXU0RMUGFyYW0oKS5nZXRPdXRwdXRXc2RsTG9jYXRpb24oKSk7IAotICAgIFN0cmluZyB1cmwgPSAiIjsKLQkgIHRyeSB7Ci0gICAgCXVybCA9IGZpbGUudG9VUkwoKS50b1N0cmluZygpOwotICAgIH0KLQkgIGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpe30KLQlyZXR1cm4gdXJsOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svVERDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svVERDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1MmFiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL1REQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzazsKLQotcHVibGljIGNsYXNzIFREQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzIGV4dGVuZHMgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzayAKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svVXBkYXRlQXhpc1dTRERGaWxlVGFzay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9VcGRhdGVBeGlzV1NEREZpbGVUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMjA0NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9VcGRhdGVBeGlzV1NEREZpbGVUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklXZWJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udXRpbC5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIFVwZGF0ZUF4aXNXU0RERmlsZVRhc2sgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQkKLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1VQREFURV9BWElTX1dTREQiOwkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfVVBEQVRFX0FYSVNfV1NERCI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVQTE9ZX1hTTCA9ICJkZXBsb3kueHNsIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIERFUExPWV9CQUsgPSAiZGVwbG95LndzZGQuYmFrIjsJCS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBDTEFTU05BTUVfUEFSQU0gPSAibmV3Q2xhc3NOYW1lIjsJCS8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gICAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgY29yZU1zZ1V0aWxzXzsKLQlwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotCXByaXZhdGUgSVByb2plY3Qgc2VydmljZVByb2plY3RfOwotCS8vIHJtIHByaXZhdGUgTW9kZWwgbW9kZWxfOwotCi0JcHVibGljIFVwZGF0ZUF4aXNXU0RERmlsZVRhc2soKSB7Ci0JICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCSAgICBjb3JlTXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29uc3VtcHRpb24iLCB0aGlzICk7Ci0JICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsJICAgIAotCX0KLQkKLQlwdWJsaWMgVXBkYXRlQXhpc1dTRERGaWxlVGFzayhKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0JICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCSAgICBjb3JlTXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29uc3VtcHRpb24iLCB0aGlzICk7Ci0JICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsJICAgIAotCQlqYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW07Ci0JfQotCi0JLyoqCi0JKiBFeGVjdXRlIFVwZGF0ZUF4aXNXU0RERmlsZVRhc2sKLQkqLwotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQkgIAotCSAgLy8gcm0KLQkgIC8qCi0JICAvL0JlZ2luIFNldHRlcnMKLQkgIFdlYlNlcnZpY2VFbGVtZW50IHdzZSA9Ci0JCVdlYlNlcnZpY2VFbGVtZW50LmdldFdlYlNlcnZpY2VFbGVtZW50KG1vZGVsXyk7Ci0JICBzZXRTZXJ2aWNlUHJvamVjdCh3c2UuZ2V0U2VydmljZVByb2plY3QoKSk7Ci0JICAvL0VuZCBTZXR0ZXJzCi0JICAqLwotCSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7CQkKLQkJaWYgKGphdmFXU0RMUGFyYW1fID09IG51bGwpIHsKLQkJICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLGNvcmVNc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pBVkFfV1NETF9QQVJBTV9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUik7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgIHJldHVybiBzdGF0dXM7CQkgIAotCQl9Ci0KLQkJLy8gcm0gCi0JCS8qCi0JCWlmIChtb2RlbF8gPT0gbnVsbCkgewotCQkgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NT0RFTF9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUik7Ci0JCSAgcmV0dXJuIHN0YXR1czsJCSAgCi0JCX0KLQkJKi8KLQkKLQkJSVByb2plY3QgcHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0XzsKLQkJU3RyaW5nIHByb2plY3RVUkwgPSBSZXNvdXJjZVV0aWxzLmdldEVuY29kZWRXZWJQcm9qZWN0VVJMKHByb2plY3QpOwotCQlpZiAocHJvamVjdFVSTCA9PSBudWxsKSB7Ci0JCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUFJPSkVDVF9VUkwiLG5ldyBTdHJpbmdbXSB7cHJvamVjdC50b1N0cmluZygpfSksIFN0YXR1cy5FUlJPUik7Ci0JCSAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCSAgICByZXR1cm4gc3RhdHVzOwkJICAKLQkJfSBlbHNlIHsKLQkJCWphdmFXU0RMUGFyYW1fLnNldFByb2plY3RVUkwocHJvamVjdFVSTCk7Ci0JCX0KLQkJU3RyaW5nIG91dHB1dExvY2F0aW9uID0gamF2YVdTRExQYXJhbV8uZ2V0SmF2YU91dHB1dCgpOwotCQlpZiAob3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQl0cnkgewotCQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKSkKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlRFUkFMIiksIFN0YXR1cy5FUlJPUiwgZXgpOwotCQkgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICAgcmV0dXJuIHN0YXR1czsJCSAgCi0JCX0KLQkJU3RyaW5nW10gamF2YUZpbGVzID0gamF2YVdTRExQYXJhbV8uZ2V0SmF2YUZpbGVzKCk7Ci0JCVN0cmluZyBqYXZhb3V0cHV0ID0gamF2YVdTRExQYXJhbV8uZ2V0SmF2YU91dHB1dCgpOwotCQlTdHJpbmcgb3V0cHV0ID0gamF2YVdTRExQYXJhbV8uZ2V0T3V0cHV0KCk7Ci0KLS8vCQlTdHJpbmcgd2ViQ29udGVudFBhdGggPQlSZXNvdXJjZVV0aWxzLmdldFdlYk1vZHVsZVNlcnZlclJvb3QocHJvamVjdCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQlTdHJpbmcgd2ViQ29udGVudFBhdGggPQlKMkVFVXRpbHMuZ2V0Rmlyc3RXZWJDb250ZW50Q29udGFpbmVyKHByb2plY3QpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJdHJ5IHsKLQotCQkJaWYgKGphdmFXU0RMUGFyYW1fLmdldERlcGxveW1lbnRGaWxlcygpICE9IG51bGwKLQkJCQkmJiBqYXZhV1NETFBhcmFtXy5nZXREZXBsb3ltZW50RmlsZXMoKS5sZW5ndGggPiAwKSB7Ci0KLQkJCQlTdHJpbmcgd3NkZF9kZXBsb3kgPSBqYXZhV1NETFBhcmFtXy5nZXREZXBsb3ltZW50RmlsZXMoKVswXTsKLQkJCQlQYXRoIGRlcGxveVBhdGggPSBuZXcgUGF0aCh3c2RkX2RlcGxveSk7Ci0JCQkJU3RyaW5nIGRlcGxveUJhY2t1cCA9Ci0JCQkJCWRlcGxveVBhdGgKLQkJCQkJCS5yZW1vdmVMYXN0U2VnbWVudHMoMSkKLQkJCQkJCS5hcHBlbmQoREVQTE9ZX0JBSykKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCUZpbGVVdGlsLmNyZWF0ZVRhcmdldEZpbGUod3NkZF9kZXBsb3ksIGRlcGxveUJhY2t1cCwgdHJ1ZSk7Ci0JCQkJU3RyaW5nIGRlcGxveVhTTCA9IGdldFBsdWdpbkZpbGVQYXRoKERFUExPWV9YU0wpLnRvU3RyaW5nKCk7Ci0KLQkJCQlUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotCQkJCS8vIFVzZSB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IHRvIGluc3RhbnRpYXRlIGEgVHJhbnNmb3JtZXIgdGhhdCB3aWxsIHdvcmsgd2l0aCAgCi0JCQkJLy8gdGhlIHN0eWxlc2hlZXQgeW91IHNwZWNpZnkuIFRoaXMgbWV0aG9kIGNhbGwgYWxzbyBwcm9jZXNzZXMgdGhlIHN0eWxlc2hlZXQKLQkJCQkvLyBpbnRvIGEgY29tcGlsZWQgVGVtcGxhdGVzIG9iamVjdC4KLQkJCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9Ci0JCQkJCXRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKG5ldyBTdHJlYW1Tb3VyY2UoZGVwbG95WFNMKSk7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKENMQVNTTkFNRV9QQVJBTSwgamF2YVdTRExQYXJhbV8uZ2V0QmVhbk5hbWUoKSk7Ci0KLQkJCQkvLyBVc2UgdGhlIFRyYW5zZm9ybWVyIHRvIGFwcGx5IHRoZSBhc3NvY2lhdGVkIFRlbXBsYXRlcyBvYmplY3QgdG8gYW4gWE1MIGRvY3VtZW50Ci0JCQkJLy8gKGZvby54bWwpIGFuZCB3cml0ZSB0aGUgb3V0cHV0IHRvIGEgZmlsZSAoZm9vLm91dCkuCi0JCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKAotCQkJCQluZXcgU3RyZWFtU291cmNlKGRlcGxveUJhY2t1cCksCi0JCQkJCW5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGVPdXRwdXRTdHJlYW0od3NkZF9kZXBsb3kpKSk7Ci0KLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgICAgU3RyaW5nW10gZXJyb3JNc2dTdHJpbmdzID0gbmV3IFN0cmluZ1tde3Byb2plY3QudG9TdHJpbmcoKSwgb3V0cHV0TG9jYXRpb24udG9TdHJpbmcoKSwgd2ViQ29udGVudFBhdGgudG9TdHJpbmcoKX07IAotCQkgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VQREFURV9BWElTX1dTREQiLCBlcnJvck1zZ1N0cmluZ3MpLCBTdGF0dXMuRVJST1IsIGUpOwotCQkgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICAgcmV0dXJuIHN0YXR1czsJCSAgCQkgIAotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0UGx1Z2luRmlsZVBhdGgoU3RyaW5nIHBsdWdpbmZpbGVOYW1lKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUGx1Z2luUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotCQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9Ci0JCQkJcGx1Z2luUmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcihXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uSUQpOwotCi0JCQlVUkwgbG9jYWxVUkwgPQotCQkJCVBsYXRmb3JtLmFzTG9jYWxVUkwoCi0JCQkJCW5ldyBVUkwocGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCksIHBsdWdpbmZpbGVOYW1lKSk7Ci0JCQlyZXR1cm4gbmV3IFBhdGgobG9jYWxVUkwuZ2V0RmlsZSgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCW5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKAotCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCVdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5JRCwKLQkJCQkJMCwKLQkJCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoCi0JCQkJCQkiTVNHX1BMVUdJTl9GSUxFX1VSTCIpLAotCQkJCQllKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCW5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKAotCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCVdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5JRCwKLQkJCQkJMCwKLQkJCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoCi0JCQkJCQkiTVNHX1BMVUdJTl9GSUxFX1VSTCIpLAotCQkJCQllKSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLQkqIEBwYXJhbSBqYXZhV1NETFBhcmFtIFRoZSBqYXZhV1NETFBhcmFtIHRvIHNldAotCSovCi0JcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQl9Ci0JCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKQotCXsKLQkJcmV0dXJuIGphdmFXU0RMUGFyYW1fOwotCX0JCi0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkKLQl7Ci0JICBzZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLQl9Ci0JCi0JLy8gcm0gCi0JLyoKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChNb2RlbCBtb2RlbCkKLQl7Ci0JICBtb2RlbF8gPSBtb2RlbDsKLQl9Ci0JKi8JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQXhpc0JlYW5GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0F4aXNCZWFuRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmYzI1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQXhpc0JlYW5GcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkF4aXNEZXBsb3lDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5KYXZhMldTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5DaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQ29weUF4aXNKYXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suUmVmcmVzaFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuSmF2YVRvV1NETE1ldGhvZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5VcGRhdGVXRUJYTUxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5MaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suTW92ZUphdmFGaWxlc1Rhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5VcGRhdGVBeGlzV1NEREZpbGVUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLldTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uV2FpdEZvckF1dG9CdWlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2VsZWN0aW9uQ29tbWFuZDsKLQotICAKLXB1YmxpYyBjbGFzcyBBeGlzQmVhbkZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotIAotICBwdWJsaWMgQXhpc0JlYW5GcmFnbWVudCgpCi0gIHsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFZhbGlkYXRlT2JqZWN0U2VsZWN0aW9uQ29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IEJVQXhpc0NvbW1hbmRzRnJhZ21lbnQxKCkpOwotICAgIGFkZCggbmV3IEJVQXhpc0NvbW1hbmRzRnJhZ21lbnQyKCkpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQmVhbkNvbmZpZyIgICAgKSApOwotICAgIGFkZCggbmV3IE1hcHBpbmdGcmFnbWVudCgpICk7Ci0gICAgYWRkKCBuZXcgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDMoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgcmVnaXN0cnkpIAotICB7Ci0gICAgLy9WYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBWYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgVmFsaWRhdGVPYmplY3RTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCJTZXJ2aWNlUHJvamVjdE5hbWUiLCBudWxsICk7Ci0gICAgCi0gICAgLy9CVUF4aXNEZWZhdWx0aW5nQ29tbWFuZAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotICAgIAotICAgIC8vV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFdTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIAotICAgIC8vQlVBeGlzQ29tbWFuZHMyIC0gdGhlc2UgcnVuIGFmdGVyIEJlYW5DbGFzc1dpZGdldAotICAgIC8vRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhQmVhbk5hbWUiLCBEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlBhcnNlciIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ3VzdG9taXplU2VydmljZU1hcHBpbmdzIiwgQXhpc0JlYW5GcmFnbWVudC5NYXBwaW5nRnJhZ21lbnQuY2xhc3MpOwotICAgIAotICAgIC8vSmF2YVdTRExNZXRob2RDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQotICAgIC8vIEJVQXhpc0NvbW1hbmRzMyAtIHRoZXNlIHJ1biBhZnRlciBCZWFuQ29uZmlnV2lkZ2V0Ci0gICAgLy9MaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrLmNsYXNzKTsKLSAgICAKLSAgICAvL0NoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2sKLSAgICAvL3JlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YVRvV1NETE1ldGhvZENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9Db3B5QXhpc0phckNvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIENvcHlBeGlzSmFyQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIAotICAgIC8vQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2sKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrLmNsYXNzLCAiUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9KYXZhMldTRExDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBKYXZhMldTRExDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvL1JlZnJlc2hQcm9qZWN0Q29tbWFuZAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgUmVmcmVzaFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9XU0RMMkphdmFDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzKTsKLSAgICAKLQotICAgIC8vTW92ZUphdmFGaWxlc1Rhc2sKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgTW92ZUphdmFGaWxlc1Rhc2suY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgTW92ZUphdmFGaWxlc1Rhc2suY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9VcGRhdGVBeGlzV1NEREZpbGVUYXNrCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhNb3ZlSmF2YUZpbGVzVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBVcGRhdGVBeGlzV1NEREZpbGVUYXNrLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFVwZGF0ZUF4aXNXU0RERmlsZVRhc2suY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9VcGRhdGVXRUJYTUxDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBVcGRhdGVXRUJYTUxDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9CdWlsZFByb2plY3RDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkZvcmNlQnVpbGQiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVmFsaWRhdGlvbk1hbmFnZXIiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvL1N0YXJ0UHJvamVjdENvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7ICAgIAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VTZXJ2ZXJUeXBlSUQiLCBTdGFydFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2FtcGxlU2VydmVyVHlwZUlEIiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlciIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVFeGlzdGluZ1NlcnZlciIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkIixTdGFydFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAgICAgCi0gICAgLy9BeGlzRGVwbG95Q29tbWFuZAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoVXBkYXRlQXhpc1dTRERGaWxlVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBBeGlzRGVwbG95Q29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy9Db3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2sKLSAgICAvKgotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoVXBkYXRlQXhpc1dTRERGaWxlVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2suY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgQ29weUF4aXNTZXJ2ZXJDb25maWdUYXNrLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIiLCBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2suY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlU2VydmVyVHlwZUlEIiwgQ29weUF4aXNTZXJ2ZXJDb25maWdUYXNrLmNsYXNzKTsKLSAgICAqLwotICAgIAotICAgIC8vIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NETENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIEJVQXhpc0NvbW1hbmRzRnJhZ21lbnQxIGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotICB7ICAgIAotICAgIHB1YmxpYyBCVUF4aXNDb21tYW5kc0ZyYWdtZW50MSgpCi0gICAgewotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQoKSwgIiIpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDIgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci0gIHsKLSAgICBwdWJsaWMgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDIoKQotICAgIHsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZCgpLCAiIikpOwotICAgIH0gICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDMgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci0gIHsKLSAgICBwdWJsaWMgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDMoKQotICAgIHsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IExpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2soKSwgIiIpKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2soKSwgIiIpKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENvcHlBeGlzSmFyQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2soKSwgIiIpKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFdhaXRGb3JBdXRvQnVpbGRDb21tYW5kKCksICIiICkpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgSmF2YTJXU0RMQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBXU0RMMkphdmFDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBNb3ZlSmF2YUZpbGVzVGFzaygpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgVXBkYXRlQXhpc1dTRERGaWxlVGFzaygpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgVXBkYXRlV0VCWE1MQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBCdWlsZFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBTdGFydFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBBeGlzRGVwbG95Q29tbWFuZCgpLCAiIikpOwotICAgICAgLy9hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2soKSwgIiIpKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpLCAiIikpOwotICAgIH0gICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBjbGFzcyBNYXBwaW5nRnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQKLSAgewotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93TWFwcGluZ3NfOwotICAgIAotICAgIHB1YmxpYyBNYXBwaW5nRnJhZ21lbnQoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICAKLSAgICAgIHNldFRydWVGcmFnbWVudCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQXhpc1NlcnZpY2VCZWFuTWFwcGluZyIgKSk7Ci0gICAgICBzZXRDb25kaXRpb24oIG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaG93TWFwcGluZ3NfOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVTZXJ2aWNlTWFwcGluZ3MoIGJvb2xlYW4gc2hvd01hcHBpbmdzICkKLSAgICB7Ci0gICAgICBzaG93TWFwcGluZ3NfID0gc2hvd01hcHBpbmdzOwotICAgIH0gICAgICAKLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0JVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzNWFkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkphdmFSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLnZhbGlkYXRlLlZhbGlkYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICAvL05lZWQKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBzZXJ2aWNlSWRzXzsKLSAgCi0gIC8vUHJvdmlkZQotICBwcml2YXRlIElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRF87ICAvLyByc2sgcmV2aXNpdAotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotICBwcml2YXRlIFN0cmluZyBqYXZhQmVhbk5hbWVfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlcl87Ci0gIHByaXZhdGUgYm9vbGVhbiBmb3JjZUJ1aWxkXyA9IHRydWU7Ci0gIHByaXZhdGUgQm9vbGVhbiBJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkID0gQm9vbGVhbi5UUlVFOyAvLyByc2sgcmV2aXNpdAotICBwcml2YXRlIFZhbGlkYXRpb25NYW5hZ2VyIHZhbGlkYXRpb25NYW5hZ2VyXzsKLSAgcHJpdmF0ZSBib29sZWFuIGN1c3RvbWl6ZVNlcnZpY2VNYXBwaW5nc18gPSBmYWxzZTsKLSAgCi0gIC8vVGhpcyBpcyBwcm94eSBhbmQgY2xpZW50IHJlbGF0ZWQgaW5mb3JtYXRpb24KLSAgLy93aGljaCBjYW4gYmUgbnVsbGVkIGZvciBjb21tYW5kcyBkZWFsaW5nCi0gIC8vd2l0aCBzZXJ2aWNlIGNyZWF0aW9uLgotICAvL3JzayByZXZpc2l0Ci0gIHByaXZhdGUgQm9vbGVhbiBpc1Byb3h5UHJvamVjdF8gPSBCb29sZWFuLkZBTFNFOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRSdW50aW1lSURfID0gbnVsbDsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm94eVByb2plY3RfID0gbnVsbDsKLSAgcHJpdmF0ZSBJUHJvamVjdCBzYW1wbGVQcm9qZWN0XyA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRF8gPSBudWxsOwotICBwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfID0gbnVsbDsKLSAgCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICAKLSAgCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICAKLS8vICAgIGlmIChzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkgIT0gbnVsbCkgeyAvLyBzZXJ2ZXIgZXhpc3RzCi0vLyAgICAJc2VydmljZUV4aXN0aW5nU2VydmVyXyA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotLy8gICAgfQotLy8gICAgaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgc2VydmljZVNlcnZlclR5cGVJRF8gPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotLy8gICAgfQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgCXNlcnZpY2VTZXJ2ZXJUeXBlSURfID0gc2VydmljZUlkc18uZ2V0U2VydmVySWQoKTsKLS8vICAgICAgLy8gc2VydmVyIHdpbGwgYmUgY3JlYXRlZCBpbiBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQKLS8vICAgIH0KLSAgICAKLSAgICAvL2phdmFXU0RMUGFyYW0KLSAgICBqYXZhV1NETFBhcmFtXyA9IG5ldyBKYXZhV1NETFBhcmFtZXRlcigpOwotICAgICAKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbl8gPT0gbnVsbCkgewotICAgIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0JCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTklUSUFMX1NFTEVDVElPTiIpLCBTdGF0dXMuRVJST1IpOwotCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIAotICAgIHRyeSB7Ci0JCQotCQlqYXZhQmVhbk5hbWVfID0gZ2V0SmF2YUJlYW5Gcm9tSW5pdGlhbFNlbGVjdGlvbihlbnYpOwotCQkKLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkJVQXhpc0RlZmF1bHRpbmdDb21tYW5kIiwgLy8kTk9OLU5MUy0xJAotCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5JVElBTF9TRUxFQ1RJT04iKSArICIgIiAvLyROT04tTkxTLTEkCi0JCQkJK2UuZ2V0Q2F1c2UoKS50b1N0cmluZygpLCBTdGF0dXMuRVJST1IpOwotCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotICAgIAotICAgIC8vcGFyc2VyCi0gICAgcGFyc2VyXyA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAgIAotICAgIAotICAgIAotICAgIC8vdmFsaWRhdGlvbk1hbmFnZXIKLSAgICB2YWxpZGF0aW9uTWFuYWdlcl8gPSBuZXcgVmFsaWRhdGlvbk1hbmFnZXIoKTsKLSAgICAKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEphdmFCZWFuRnJvbUluaXRpYWxTZWxlY3Rpb24oRW52aXJvbm1lbnQgZW52KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGJlYW5DbGFzcyA9ICIiOwotICAgIEphdmFSZXNvdXJjZUZpbHRlciBmaWx0ZXIgPSBuZXcgSmF2YVJlc291cmNlRmlsdGVyKCk7IAotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGluaXRpYWxTZWxlY3Rpb25fOwotICAgIC8vCi0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIGdldCB0aGUgSVJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoZSBzZWxlY3Rpb24KLSAgICAgICAgSVJlc291cmNlIHJlcyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICByZXMgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotICAgICAgICAKLSAgICAgICAgaWYgKGZpbHRlci5hY2NlcHRzKHJlcykpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBnZXQgdGhlIHBhY2thZ2UtcXVhbGlmaWVkIGNsYXNzIG5hbWUgd2l0aG91dCBmaWxlIGV4dGVuc2lvbnMKLSAgICAgICAgICBTdHJpbmcgYmVhblBhY2thZ2UgPSBSZXNvdXJjZVV0aWxzLmdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKHJlcy5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICBpZiAoYmVhblBhY2thZ2U9PW51bGwpCi0gICAgICAgICAgICBiZWFuUGFja2FnZSA9ICIiOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJlYW5QYWNrYWdlID0gYmVhblBhY2thZ2UgKyAiLiI7Ci0KLSAgICAgICAgICBiZWFuQ2xhc3MgPSBiZWFuUGFja2FnZSArIHJlcy5nZXROYW1lKCk7Ci0KLSAgICAgICAgICBpZiAoYmVhbkNsYXNzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXZhIikgfHwgYmVhbkNsYXNzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0gICAgICAgICAgICBiZWFuQ2xhc3MgPSBiZWFuQ2xhc3Muc3Vic3RyaW5nKDAsYmVhbkNsYXNzLmxhc3RJbmRleE9mKCcuJykpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLwotICAgIHJldHVybiBiZWFuQ2xhc3M7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50UnVudGltZUlEXy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UnVudGltZUlEKCkKLSAgewotICAgIHJldHVybiBjbGllbnRSdW50aW1lSURfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcmNlQnVpbGRfLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yY2VCdWlsZCgpCi0gIHsKLSAgICByZXR1cm4gZm9yY2VCdWlsZF87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNQcm94eVByb2plY3RfLgotICAgKi8KLSAgcHVibGljIEJvb2xlYW4gZ2V0SXNQcm94eVByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIGlzUHJveHlQcm9qZWN0XzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBqYXZhQmVhbk5hbWVfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRKYXZhQmVhbk5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGphdmFCZWFuTmFtZV87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbV8uCi0gICAqLwotICBwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpCi0gIHsKLSAgICByZXR1cm4gamF2YVdTRExQYXJhbV87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyc2VyXy4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRQYXJzZXIoKQotICB7Ci0gICAgcmV0dXJuIHBhcnNlcl87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJveHlQcm9qZWN0Xy4KLSAgICovCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm94eVByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHByb3h5UHJvamVjdF87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfLgotICAgKi8KLSAgcHVibGljIElTZXJ2ZXIgZ2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHNhbXBsZUV4aXN0aW5nU2VydmVyXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1wbGVQcm9qZWN0Xy4KLSAgICovCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRTYW1wbGVQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBzYW1wbGVQcm9qZWN0XzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1wbGVTZXJ2ZXJUeXBlSURfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoKQotICB7Ci0gICAgcmV0dXJuIHNhbXBsZVNlcnZlclR5cGVJRF87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsaWRhdGlvbk1hbmFnZXJfLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NYW5hZ2VyIGdldFZhbGlkYXRpb25NYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0aW9uTWFuYWdlcl87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikKLSAgewotICAgIGluaXRpYWxTZWxlY3Rpb25fID0gaW5pdGlhbFNlbGVjdGlvbjsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfLgotICAgKi8KLSAgcHVibGljIElTZXJ2ZXIgZ2V0U2VydmljZUV4aXN0aW5nU2VydmVyKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotICB9Ci0gIAotLy8gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVNlcnZlclR5cGVJRCgpCi0vLyAgewotLy8gICAgcmV0dXJuIHNlcnZpY2VTZXJ2ZXJUeXBlSURfOwotLy8gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEN1c3RvbWl6ZVNlcnZpY2VNYXBwaW5ncygpCi0gIHsKLSAgICByZXR1cm4gY3VzdG9taXplU2VydmljZU1hcHBpbmdzXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkLgotICAgKi8KLSAgcHVibGljIEJvb2xlYW4gZ2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCgpCi0gIHsKLSAgICByZXR1cm4gSXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZDsKLSAgfQotICAKLS8vICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzKQotLy8gIHsKLS8vICAgIHNlcnZpY2VJZHNfID0gaWRzOwotLy8gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9CZWFuQ2xhc3NXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9CZWFuQ2xhc3NXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViOGIyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQmVhbkNsYXNzV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLmJlYW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5KYXZhUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5kaWFsb2cuRGlhbG9nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBCZWFuQ2xhc3NXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgcGx1Z2luSWRfICA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICB0aGlzUGx1Z2luID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLSAgcHJpdmF0ZSBJUHJvamVjdCAgICAgICAgICAgc2VydmVyUHJvamVjdF8gPSBudWxsOwotICBwcml2YXRlIENvbXBvc2l0ZSAgICAgICAgICBwYXJlbnRfID0gbnVsbDsKLSAgcHJpdmF0ZSBJV2l6YXJkQ29udGFpbmVyICAgY29udGV4dF8gPSBudWxsOwotICBwcml2YXRlIEphdmFSZXNvdXJjZUZpbHRlciBmaWx0ZXJfID0gbmV3IEphdmFSZXNvdXJjZUZpbHRlcigpOwotICBwcml2YXRlIElSZXNvdXJjZSAgICAgICAgICBpbml0aWFsUmVzb3VyY2VfID0gbnVsbDsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQQkNMMDAwMSBmb3IgdGhlIEJlYW4gU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BCQ0xfUEFHRSA9ICJQQkNMMDAwMSI7Ci0gIAotICBwcml2YXRlIFRleHQgYmVhbkNsYXNzVGV4dF87Ci0gIC8qQ09OVEVYVF9JRCBQQkNMMDAwMiBmb3IgdGhlIEJlYW4gU2VsZWN0aW9uIGZpZWxkIG9mIHRoZSBCZWFuIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QQkNMX1RFWFRfQkVBTl9DTEFTUyA9ICJQQkNMMDAwMiI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gYmVhbkNsYXNzQnJvd3NlQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBCQ0wwMDAzIGZvciB0aGUgQmVhbiBDbGFzcyBCcm93c2UgYnV0dG9uIG9mIHRoZSBCZWFuIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX0NMQVNTX0JST1dTRSA9ICJQQkNMMDAwMyI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gYmVhblJlc291cmNlQnJvd3NlQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBCQ0wwMDA0IGZvciB0aGUgQmVhbiBSZXNvdXJjZSBCcm93c2UgYnV0dG9uIG9mIHRoZSBCZWFuIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX1JFU09VUkNFX0JST1dTRSA9ICJQQkNMMDAwNCI7Ci0gICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCB0aGlzUGx1Z2luICk7IAotICAgIAotICAgIHBhcmVudF8gPSBwYXJlbnQ7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGdyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgNCApOwotICAgIAotICAgIGdyb3VwLnNldFRvb2xUaXBUZXh0KCBtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BCQ0xfUEFHRSIpICk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggZ3JvdXAsIHBsdWdpbklkXyArICIuIiArIElORk9QT1BfUEJDTF9QQUdFICk7Ci0gICAgCi0gICAgYmVhbkNsYXNzVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIGdyb3VwLCAiTEFCRUxfQkVBTl9DTEFTU19OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUEJDTF9URVhUX0JFQU5fQ0xBU1MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0xfVEVYVF9CRUFOX0NMQVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgCi0gICAgYmVhbkNsYXNzQnJvd3NlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggZ3JvdXAsICJCVVRUT05fQlJPV1NFX0NMQVNTRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFICk7Ci0gICAgYmVhbkNsYXNzQnJvd3NlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCcm93c2VDbGFzc2VzKCk7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgCi0gICAgYmVhblJlc291cmNlQnJvd3NlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggZ3JvdXAsICJCVVRUT05fQlJPV1NFX0ZJTEVTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QQkNMX0JVVFRPTl9CRUFOX1JFU09VUkNFX0JST1dTRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX1JFU09VUkNFX0JST1dTRSApOwotICAgIGJlYW5SZXNvdXJjZUJyb3dzZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQnJvd3NlRmlsZXMoKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb3dzZUNsYXNzZXMoKQotICB7Ci0gICAgU3RyaW5nIGNsYXNzTmFtZSA9IERpYWxvZ1V0aWxzLmJyb3dzZUNsYXNzZXMoIHBhcmVudF8uZ2V0U2hlbGwoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclByb2plY3RfLCBjb250ZXh0XyApOwotCi0gICAgaWYgKGNsYXNzTmFtZSE9bnVsbCkgYmVhbkNsYXNzVGV4dF8uc2V0VGV4dChjbGFzc05hbWUpOwotICAgIAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlQnJvd3NlRmlsZXMoKQotICB7Ci0gICAgSVJlc291cmNlIHRvcFJlc291cmNlID0gc2VydmVyUHJvamVjdF87Ci0gICAgCi0gICAgaWYgKHRvcFJlc291cmNlID09IG51bGwpCi0gICAgewotICAgICAgdG9wUmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKTsKLSAgICB9Ci0gICAgCi0gICAgSVJlc291cmNlIHJlc291cmNlIAotICAgICAgPSBEaWFsb2dVdGlscy5icm93c2VSZXNvdXJjZXMoIHBhcmVudF8uZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BSZXNvdXJjZSwKLQkJCQkgICAgICAgICAgICAgICAgICAgICBpbml0aWFsUmVzb3VyY2VfLAotCQkJCSAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl8gKTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgewotICAgICAgSVBhdGggIHBhdGggICAgID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLSAgICAgIFN0cmluZyBiYXNlbmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKTsKLSAgICAgIAotICAgICAgaWYoIGJhc2VuYW1lICE9IG51bGwgJiYgYmFzZW5hbWUubGVuZ3RoKCkgPiAwICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGJlYW5QYWNrYWdlID0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzLmdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKHBhdGgpOwotICAgICAgICBTdHJpbmcgYmVhbkNsYXNzID0gKGJlYW5QYWNrYWdlID09IG51bGwgPyBiYXNlbmFtZSA6IChiZWFuUGFja2FnZSArICIuIiArIGJhc2VuYW1lKSk7Ci0gICAgICAgIAotICAgICAgICBpZiggYmVhbkNsYXNzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXZhIikgfHwgYmVhbkNsYXNzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5jbGFzcyIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBiZWFuQ2xhc3MgPSBiZWFuQ2xhc3Muc3Vic3RyaW5nKCAwLCBiZWFuQ2xhc3MubGFzdEluZGV4T2YoJy4nKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBiZWFuQ2xhc3NUZXh0Xy5zZXRUZXh0KGJlYW5DbGFzcyk7Ci0gICAgICB9Ci0gICAgfSAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50UGFnZSggSVdpemFyZFBhZ2UgcGFnZSApCi0gIHsKLSAgICBjb250ZXh0XyA9IHBhZ2UuZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRCZWFuQ2xhc3NOYW1lKFN0cmluZyBiZWFuQ2xhc3NOYW1lKQotICB7Ci0gICAgYmVhbkNsYXNzVGV4dF8uc2V0VGV4dChiZWFuQ2xhc3NOYW1lKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRCZWFuQ2xhc3NOYW1lKCkKLSAgewotICAgIHJldHVybiBiZWFuQ2xhc3NUZXh0Xy5nZXRUZXh0KCkudHJpbSgpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlclByb2plY3ROYW1lKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICBzZXJ2ZXJQcm9qZWN0XyA9IChJUHJvamVjdClSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSggbmV3IFBhdGgoIG5hbWUgKS5tYWtlQWJzb2x1dGUoKSApOyAgCi0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFJlc291cmNlKCBJUmVzb3VyY2UgcmVzb3VyY2UgKQotICB7Ci0gICAgaW5pdGlhbFJlc291cmNlXyA9IHJlc291cmNlOyAgCi0gIH0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9CZWFuQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQmVhbkNvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGNiYmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9CZWFuQ29uZmlnV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51dGlsLlBsYXRmb3JtVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBCZWFuQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIAotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotICAKLSAgcHJpdmF0ZSBCdXR0b24gICBycGNFbmNvZGVkQnV0dG9uXzsKLSAgcHJpdmF0ZSBCdXR0b24gICBycGNMaXRlcmFsQnV0dG9uXzsKLSAgcHJpdmF0ZSBCdXR0b24gICBkb2NMaXRlcmFsQnV0dG9uXzsKLSAgCi0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXJfOwotICAKLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhUGFyYW1ldGVyXzsKLSAgCi0gIC8qIENPTlRFWFRfSUQgUEJDRjAwMDEgZm9yIHRoZSBCZWFuIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUEJDRl9QQUdFID0gIlBCQ0YwMDAxIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BCQ0ZfUEFHRSA9ICJUT09MVElQX1BCQ0ZfUEFHRSI7Ci0JCi0gIHByaXZhdGUgVGV4dCB1cmlUZXh0XzsKLSAgLyogQ09OVEVYVF9JRCBQQkNGMDAwMiBmb3IgdGhlIFVSSSBmaWVsZCBvZiB0aGUgQmVhbiBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCQ0ZfVEVYVF9VUkkgPSAiUEJDRjAwMDIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJDRl9URVhUX1VSSSA9ICJUT09MVElQX1BCQ0ZfVEVYVF9VUkkiOwotCQotICBwcml2YXRlIFRleHQgd3NkbEZvbGRlclRleHRfOwotICAvKiBDT05URVhUX0lEIFBCQ0YwMDA2IGZvciB0aGUgV1NETCBGb2xkZXIgZmllbGQgaW4gdGhlIEJlYW4gQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQkNGX1RFWFRfV1NETF9GT0xERVIgPSAiUEJDRjAwMDYiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJDRl9URVhUX1dTRExfRk9MREVSID0gIlRPT0xUSVBfUEJDRl9URVhUX1dTRExfRk9MREVSIjsKLQkKLSAgcHJpdmF0ZSBUZXh0IHdzZGxGaWxlVGV4dF87Ci0gIC8qIENPTlRFWFRfSUQgUEJDRjAwMDcgZm9yIHRoZSBXU0RMIEZpbGUgZmllbGQgb2YgdGhlIEJlYW4gQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQkNGX1RFWFRfV1NETF9GSUxFID0gIlBCQ0YwMDA3IjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZJTEUgPSAiVE9PTFRJUF9QQkNGX1RFWFRfV1NETF9GSUxFIjsKLQkKLSAgcHJpdmF0ZSBUcmVlIG1ldGhvZHNUcmVlXzsKLSAgLyogQ09OVEVYVF9JRCBQQk1FMDAwMiBmb3IgdGhlIE1ldGhvZHMgdHJlZSBvZiB0aGUgQmVhbiBNZXRob2RzIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQk1FX1RSRUVfTUVUSE9EUyA9ICJQQk1FMDAwMiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QQk1FX1RSRUVfTUVUSE9EUyA9ICJUT09MVElQX1BCTUVfVFJFRV9NRVRIT0RTIjsKLQkKLSAgcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl87Ci0gIC8qIENPTlRFWFRfSUQgUEJNRTAwMTAgZm9yIHRoZSBTZWxlY3QgQWxsIGJ1dHRvbiBvZiB0aGUgQmVhbiBNZXRob2RzIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQk1FX0JVVFRPTl9TRUxFQ1RfQUxMID0gIlBCTUUwMDEwIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BCTUVfQlVUVE9OX1NFTEVDVF9BTEwgPSAiVE9PTFRJUF9QQk1FX0JVVFRPTl9TRUxFQ1RfQUxMIjsKLQkKLSAgcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxNZXRob2RzQnV0dG9uXzsKLSAgLyogQ09OVEVYVF9JRCBQQk1FMDAxMSBmb3IgdGhlIERlc2VsZWN0IEFsbCBidXR0b24gb2YgdGhlIEJlYW4gTWV0aG9kcyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUEJNRV9CVVRUT05fREVTRUxFQ1RfQUxMID0gIlBCTUUwMDExIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BCTUVfQlVUVE9OX0RFU0VMRUNUX0FMTCA9ICJUT09MVElQX1BCTUVfQlVUVE9OX0RFU0VMRUNUX0FMTCI7Ci0JCi0gIHByaXZhdGUgQnV0dG9uIHNob3dNYXBwaW5nc0NoZWNrYm94XzsKLSAgLyogQ09OVEVYVF9JRCBQQkNGMDAxNiBmb3IgdGhlIFNob3cgTWFwcGluZ3MgY2hlY2tib3ggb2YgdGhlIEJlYW4gTWV0aG9kcyBQYWdlICovICAgCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUDJOX1NIT1dfTUFQUElOR1MgPSAiUEJDRjAwMTYiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIFN0cmluZyAgICAgICBiYXNlQ29uUGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgICAgID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgTWVzc2FnZVV0aWxzIGJhc2VDb25VdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIGJhc2VDb25QbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICAgICAgICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBwbHVnaW5JZF8gKTsKLSAgICBVSVV0aWxzICAgICAgYmFzZUNvblVpVXRpbHMgPSBuZXcgVUlVdGlscyggYmFzZUNvblV0aWxzLCBwbHVnaW5JZF8gKTsKLSAgICAKLSAgICBzdGF0dXNMaXN0ZW5lcl8gPSBzdGF0dXNMaXN0ZW5lcjsgICAgCi0JcGFyZW50LnNldFRvb2xUaXBUZXh0KCBtc2dVdGlscy5nZXRNZXNzYWdlKCBUT09MVElQX1BCQ0ZfUEFHRSApICk7Ci0JUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggcGFyZW50LCBwbHVnaW5JZF8gKyAiLiIgKyBJTkZPUE9QX1BCQ0ZfUEFHRSApOwotICAgIAotICAgIENvbXBvc2l0ZSBjb25maWdHcm91cCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDIgKTsKLSAgICAKLSAgICB1cmlUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggY29uZmlnR3JvdXAsICJMQUJFTF9VUkkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCQ0ZfVEVYVF9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDRl9URVhUX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgCi0gICAgd3NkbEZvbGRlclRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KCBjb25maWdHcm91cCwgIkxBQkVMX09VVFBVVF9GT0xERVJfTkFNRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZPTERFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDRl9URVhUX1dTRExfRk9MREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgCi0gICAgd3NkbEZpbGVUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggY29uZmlnR3JvdXAsICJMQUJFTF9PVVRQVVRfRklMRV9OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNGX1RFWFRfV1NETF9GSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSICApOwotICAgIHdzZGxGaWxlVGV4dF8uYWRkTGlzdGVuZXIoIFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gdWlVdGlscy5jcmVhdGVIb3Jpem9udGFsU2VwYXJhdG9yKCBwYXJlbnQsIDYgKTsKLSAgICAKLSAgICAvLyBUT0RPIHRoaXMgZ3JvdXAgaGFzIG5vIFRPT0xUSVAgb3IgSU5GT1BPUC4KLSAgICBHcm91cCAgICBtZXRob2RzR3JvdXAgPSBiYXNlQ29uVWlVdGlscy5jcmVhdGVHcm91cCggcGFyZW50LCAiTEFCRUxfTUVUSE9EUyIsIG51bGwsIG51bGwgKTsKLQltZXRob2RzR3JvdXAuc2V0TGF5b3V0RGF0YSggdWlVdGlscy5jcmVhdGVGaWxsQWxsKCkgKTsKLQkKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQltZXRob2RzR3JvdXAuc2V0TGF5b3V0KCBsYXlvdXQgKTsKLQkKLQltZXRob2RzVHJlZV8gPSB1aVV0aWxzLmNyZWF0ZVRyZWUoIG1ldGhvZHNHcm91cCwgVE9PTFRJUF9QQk1FX1RSRUVfTUVUSE9EUywgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCTUVfVFJFRV9NRVRIT0RTLAotCSAgICAgICAgICAgICAgICAgICAJCQkJICAgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTAl8IFNXVC5DSEVDSyApOwotCW1ldGhvZHNUcmVlXy5hZGRMaXN0ZW5lciggU1dULlNlbGVjdGlvbiwgc3RhdHVzTGlzdGVuZXIgKTsKLQotICAgIENvbXBvc2l0ZSBzZWxlY3RCdXR0b25zID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIG1ldGhvZHNHcm91cCwgMiApOwotICAgIAotICAgIHNlbGVjdEFsbE1ldGhvZHNCdXR0b25fIAotICAgICAgPSBiYXNlQ29uVWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKCBzZWxlY3RCdXR0b25zLCAiQlVUVE9OX1NFTEVDVF9BTEwiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCTUVfQlVUVE9OX1NFTEVDVF9BTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQk1FX0JVVFRPTl9TRUxFQ1RfQUxMICk7Ci0gICAgc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RBbGwoIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIAotICAgIGRlc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl8gCi0gICAgICA9IGJhc2VDb25VaVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIHNlbGVjdEJ1dHRvbnMsICJCVVRUT05fREVTRUxFQ1RfQUxMIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9PTFRJUF9QQk1FX0JVVFRPTl9ERVNFTEVDVF9BTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQk1FX0JVVFRPTl9ERVNFTEVDVF9BTEwgKTsKLSAgICBkZXNlbGVjdEFsbE1ldGhvZHNCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RBbGwoIGZhbHNlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgLy8gVE9ETyB0aGlzIGdyb3VwIGhhcyBubyBUT09MVElQIG9yIElORk9QT1AuCi0gICAgR3JvdXAgc3R5bGVHcm91cCA9IHVpVXRpbHMuY3JlYXRlR3JvdXAoIHBhcmVudCwgIkxBQkVMX1NUWUxFX1VTRSIsIG51bGwsIG51bGwgKTsKLSAgICAKLSAgICAvLyBUT0RPIHJhZGlvIGJ1dHRvbnMgaGF2ZSBubyBUT09MVElQIG9yIElORk9QT1AuCi0gICAgZG9jTGl0ZXJhbEJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVJhZGlvQnV0dG9uKCBzdHlsZUdyb3VwLCAiU1RZTEVfRE9DX0xJVEVSQUwiLCBudWxsLCBudWxsICk7Ci0gICAgcnBjTGl0ZXJhbEJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVJhZGlvQnV0dG9uKCBzdHlsZUdyb3VwLCAiU1RZTEVfUlBDX0xJVEVSQUwiLCBudWxsLCBudWxsICk7Ci0gICAgcnBjRW5jb2RlZEJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVJhZGlvQnV0dG9uKCBzdHlsZUdyb3VwLCAiU1RZTEVfUlBDX0VOQ09ERUQiLCBudWxsLCBudWxsICk7Ci0gICAgCi0gICAgc2hvd01hcHBpbmdzQ2hlY2tib3hfID0gdWlVdGlscy5jcmVhdGVDaGVja2JveCggcGFyZW50LCAiTEFCRUxfRVhQTE9SRV9NQVBQSU5HU19CRUFOMlhNTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUDJOX1NIT1dfTUFQUElOR1MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUDJOX1NIT1dfTUFQUElOR1MgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVNlbGVjdEFsbCggYm9vbGVhbiB2YWx1ZSApCi0gIHsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbWV0aG9kc1RyZWVfLmdldEl0ZW1zKCk7Ci0JCi0JZm9yKCBpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKyApIAotCXsKLQkgIGl0ZW1zW2ldLnNldENoZWNrZWQodmFsdWUpOwotCX0KLQkKLQlzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQoIG51bGwgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q3VzdG9taXplU2VydmljZU1hcHBpbmdzKCBib29sZWFuIHZhbHVlICkKLSAgewotICAgIHNob3dNYXBwaW5nc0NoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIHZhbHVlICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEN1c3RvbWl6ZVNlcnZpY2VNYXBwaW5ncygpCi0gIHsKLSAgICByZXR1cm4gc2hvd01hcHBpbmdzQ2hlY2tib3hfID09IG51bGwgPyBmYWxzZSA6IHNob3dNYXBwaW5nc0NoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SmF2YVBhcmFtZXRlciggSmF2YVdTRExQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciApCi0gIHsKLSAgICBqYXZhUGFyYW1ldGVyXyA9IGphdmFQYXJhbWV0ZXI7Ci0gICAgCi0JU3RyaW5nIHdzZGxMb2NhdGlvbiA9IGphdmFQYXJhbWV0ZXIuZ2V0T3V0cHV0V3NkbExvY2F0aW9uKCk7Ci0KLQkvLyBUT0RPIFZlcmlmeSB0aGF0IHdlIG5lZWQgdG8gZmluZCB0aGUgV1NETCBpbiB0aGUgZWNsaXBzZSBmaWxlIHN5c3RlbS4KLQkvL0lGaWxlIGZpbGUgCi0JLy8gID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKHdzZGxMb2NhdGlvbikpOwotCS8vSVBhdGggd3NkbFBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JSVBhdGggd3NkbFBhdGggPSBuZXcgUGF0aCggd3NkbExvY2F0aW9uICk7Ci0JCi0Jd3NkbEZvbGRlclRleHRfLnNldFRleHQod3NkbFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkpOwotCXdzZGxGaWxlVGV4dF8uc2V0VGV4dCh3c2RsUGF0aC5sYXN0U2VnbWVudCgpKTsKLQkKLQlTdHJpbmcgbG9jYXRpb24gPSBqYXZhUGFyYW1ldGVyLmdldFVybExvY2F0aW9uKCk7Ci0JdXJpVGV4dF8uc2V0VGV4dChsb2NhdGlvbiA9PSBudWxsID8gIiIgOiBsb2NhdGlvbik7ICAKLQkKLQltZXRob2RzVHJlZV8ucmVtb3ZlQWxsKCk7Ci0JSGFzaHRhYmxlIG1ldGhvZHMgPSBqYXZhUGFyYW1ldGVyLmdldE1ldGhvZHMoKTsKLQlFbnVtZXJhdGlvbiBlID0gbWV0aG9kcy5rZXlzKCk7Ci0JCi0Jd2hpbGUoIGUuaGFzTW9yZUVsZW1lbnRzKCkgKQotCXsKLQkgIFN0cmluZyAgIG5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKG1ldGhvZHNUcmVlXywgU1dULk5VTEwpOwotICAgICAgCi0gICAJICBpdGVtLnNldERhdGEobmFtZSk7Ci0gICAgICBpdGVtLnNldFRleHQobmFtZSk7Ci0gICAgICBpdGVtLnNldENoZWNrZWQoKCgoQm9vbGVhbikgbWV0aG9kcy5nZXQobmFtZSkpLmJvb2xlYW5WYWx1ZSgpKSk7Ci0JfQotCQotCVRyZWVJdGVtW10gaXRlbXMgPSBtZXRob2RzVHJlZV8uZ2V0SXRlbXMoKTsKLQkKLQlpZiggaXRlbXMubGVuZ3RoID4gMCApIAotCXsKLQkgIG1ldGhvZHNUcmVlXy5zZXRTZWxlY3Rpb24oIG5ldyBUcmVlSXRlbVtdeyBpdGVtc1swXSB9ICk7Ci0JfQotCQotCVN0cmluZyBzdHlsZSA9IGphdmFQYXJhbWV0ZXIuZ2V0U3R5bGUoKTsKLQkKLQlpZiggc3R5bGUuZXF1YWxzKCBKYXZhV1NETFBhcmFtZXRlci5TVFlMRV9SUEMgKSApCi0JewotCSAgcnBjRW5jb2RlZEJ1dHRvbl8uc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQllbHNlIGlmKCBzdHlsZS5lcXVhbHMoIEphdmFXU0RMUGFyYW1ldGVyLlNUWUxFX0RPQ1VNRU5UICkgKQotCXsKLQkgIHJwY0xpdGVyYWxCdXR0b25fLnNldFNlbGVjdGlvbih0cnVlKTsJICAKLQl9Ci0JZWxzZQotCXsKLQkgIGRvY0xpdGVyYWxCdXR0b25fLnNldFNlbGVjdGlvbih0cnVlKTsgIAotCX0KLSAgfQotICAKLSAgcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFQYXJhbWV0ZXIoKQotICB7Ci0gICAgSVBhdGggd3NkbFBhdGggCi0gICAgICA9IG5ldyBQYXRoKCB3c2RsRm9sZGVyVGV4dF8uZ2V0VGV4dCgpLnRyaW0oKSApLmFwcGVuZCggd3NkbEZpbGVUZXh0Xy5nZXRUZXh0KCkudHJpbSgpICk7Ci0JSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCk7Ci0gICAgCi0JLy8gVE9ETyBEbyB3ZSBuZWVkIHRvIGdvIHRvIHRoZSBlY2xpcHNlIGZpbGUgc3lzdGVtPz8KLQkvL1N0cmluZyB3c2RsTG9jYXRpb24gPSB3b3Jrc3BhY2UuZ2V0RmlsZSh3c2RsUGF0aCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCVN0cmluZyB3c2RsTG9jYXRpb24gPSB3c2RsUGF0aC50b1N0cmluZygpOwotCQotCWphdmFQYXJhbWV0ZXJfLnNldE91dHB1dFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotCWphdmFQYXJhbWV0ZXJfLnNldElucHV0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7Ci0JCi0JU3RyaW5nIGZpbGVVUkwgPSBQbGF0Zm9ybVV0aWxzLmdldEZpbGVVUkxGcm9tUGF0aChuZXcgUGF0aCh3c2RsTG9jYXRpb24pKTsKLQotCUhhc2h0YWJsZSBtZXRob2RzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JVHJlZUl0ZW1bXSBpdGVtcyA9IG1ldGhvZHNUcmVlXy5nZXRJdGVtcygpOwotCQotCWZvciggaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKysgKSAKLQl7Ci0JICBUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JICBtZXRob2RzLnB1dCgoU3RyaW5nKWl0ZW0uZ2V0RGF0YSgpLCBuZXcgQm9vbGVhbihpdGVtLmdldENoZWNrZWQoKSkpOwotCX0KLQkKLQlqYXZhUGFyYW1ldGVyXy5zZXRNZXRob2RzKG1ldGhvZHMpOwotCQotCWlmKCBycGNFbmNvZGVkQnV0dG9uXy5nZXRTZWxlY3Rpb24oKSkgCi0JewotCSAgamF2YVBhcmFtZXRlcl8uc2V0U3R5bGUoSmF2YVdTRExQYXJhbWV0ZXIuU1RZTEVfUlBDKTsKLQkgIGphdmFQYXJhbWV0ZXJfLnNldFVzZShKYXZhV1NETFBhcmFtZXRlci5VU0VfRU5DT0RFRCk7Ci0JfSAKLQllbHNlIGlmKCBycGNMaXRlcmFsQnV0dG9uXy5nZXRTZWxlY3Rpb24oKSkgCi0JewotCSAgamF2YVBhcmFtZXRlcl8uc2V0U3R5bGUoSmF2YVdTRExQYXJhbWV0ZXIuU1RZTEVfRE9DVU1FTlQpOwotCSAgamF2YVBhcmFtZXRlcl8uc2V0VXNlKEphdmFXU0RMUGFyYW1ldGVyLlVTRV9MSVRFUkFMKTsKLQl9IAotCWVsc2UgCi0JewotCSAgamF2YVBhcmFtZXRlcl8uc2V0U3R5bGUoSmF2YVdTRExQYXJhbWV0ZXIuU1RZTEVfV1JBUFBFRCk7Ci0JICBqYXZhUGFyYW1ldGVyXy5zZXRVc2UoSmF2YVdTRExQYXJhbWV0ZXIuVVNFX0xJVEVSQUwpOwotCX0KLSAgICAKLQlyZXR1cm4gamF2YVBhcmFtZXRlcl87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNnZXRTdGF0dXMoKQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSAKLSAgewotICAgIFN0YXR1cyAgICAgICByZXN1bHQgICA9IG51bGw7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgCi0gICAgaWYoIHdzZGxGaWxlVGV4dF8uZ2V0VGV4dCgpLmVxdWFscyggIiIgKSApCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoICJQQUdFX01TR19OT19GSUxFX1NQRUNJRklFRCIgKSwgU3RhdHVzLkVSUk9SICk7IAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgVHJlZUl0ZW1bXSBpdGVtcyAgICAgICAgPSBtZXRob2RzVHJlZV8uZ2V0SXRlbXMoKTsKLSAgICAgIGJvb2xlYW4gICAgaXRlbVNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBpZiggaXRlbXNbaW5kZXhdLmdldENoZWNrZWQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICBpdGVtU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmKCAhaXRlbVNlbGVjdGVkICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoICJQQUdFX01TR19OT19NRVRIT0RfU0VMRUNURUQiICksIFN0YXR1cy5FUlJPUiApOyAKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0RlZmF1bHRzRm9yQ29uZmlnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vRGVmYXVsdHNGb3JDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2NzZhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vRGVmYXVsdHNGb3JDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIERlZmF1bHRzRm9yQ29uZmlnIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVBhcmFtZXRlcigpCi0gIHsKLSAgICBKYXZhV1NETFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgSmF2YVdTRExQYXJhbWV0ZXIoKTsKLSAgICBIYXNodGFibGUgICAgICAgICBtZXRob2RzICAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgCi0gICAgbWV0aG9kcy5wdXQoICJtZXRob2QxIiwgbmV3IEJvb2xlYW4oIHRydWUgKSApOwotICAgIG1ldGhvZHMucHV0KCAibWV0aG9kMiIsIG5ldyBCb29sZWFuKCBmYWxzZSApICk7Ci0gICAgbWV0aG9kcy5wdXQoICJtZXRob2QzIiwgbmV3IEJvb2xlYW4oIHRydWUgKSApOwotICAgIAotICAgIHBhcmFtZXRlci5zZXRNZXRob2RzKCBtZXRob2RzICk7Ci0gICAgcGFyYW1ldGVyLnNldE91dHB1dFdzZGxMb2NhdGlvbiggIi9Tb21lUHJvai9Tb21lRm9sZGVyL1NvbWVGaWxlIiApOwotICAgIHBhcmFtZXRlci5zZXRVcmxMb2NhdGlvbiggIlNvbWVVUkxMb2NhdGlvbiIgKTsKLSAgICBwYXJhbWV0ZXIuc2V0U3R5bGUoIEphdmFXU0RMUGFyYW1ldGVyLlNUWUxFX0RPQ1VNRU5UICk7Ci0gICAgICAKLSAgICByZXR1cm4gcGFyYW1ldGVyOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDdXN0b21pemVTZXJ2aWNlTWFwcGluZ3MoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9WYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9WYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4OGVlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vVmFsaWRhdGVPYmplY3RTZWxlY3Rpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLmJlYW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5KYXZhUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIFZhbGlkYXRlT2JqZWN0U2VsZWN0aW9uQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgSkFWQV9FWFRFTlNJT04gPSAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgU3RyaW5nIENMQVNTX0VYVEVOU0lPTiA9ICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb247Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VQcm9qZWN0TmFtZTsKLQotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBzZWxlY3RlZCBKYXZhIGJlYW4gY2FuIGJlIGxvYWRlZCBmcm9tIHRoZSBzZXJ2aWNlIHByb2plY3QuIElmIGl0IGNhbid0LCBhbiBlcnJvciBpcyBkaXNwbGF5ZWQuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGVPYmplY3RTZWxlY3Rpb25Db21tYW5kKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgfQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgLy9NYWtlIHN1cmUgYSBiZWFuIGlzIHNlbGVjdGVkCi0gICAgU3RyaW5nIGphdmFCZWFuTmFtZSA9IG51bGw7Ci0gICAgaWYgKG9iamVjdFNlbGVjdGlvbiAhPSBudWxsICYmICFvYmplY3RTZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBvYmplY3RTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgewotICAgICAgICBqYXZhQmVhbk5hbWUgPSAoKFN0cmluZylvYmplY3QpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCS8vVGhlIE9iamVjdFNlbGVjdGlvbldpZGdldCBuZXZlciBhcHBlYXJlZCBhbmQgc28gdGhlIElTdHVjdHVyZWRTZWxlY3Rpb24gZnJvbSAKLSAgICAgIAkvL09iamVjdFNlbGVjdGlvbldpZGdldE91dHB1dENvbW1hbmQgaXMgdGhlIGluaXRpYWwgc2VsZWN0aW9uLiAKLSAgICAgIAkvL0dldCB0aGUgSmF2YSBiZWFuIG5hbWUgZnJvbSB0aGUgc2VsZWN0aW9uLgotICAgICAgCXRyeQotCQl7Ci0gICAgICAJICBTeXN0ZW0ub3V0LnByaW50bG4ob2JqZWN0LmdldENsYXNzKCkudG9TdHJpbmcoKSk7Ci0gICAgICAJICBqYXZhQmVhbk5hbWUgPSBnZXRKYXZhQmVhbkZyb21PYmplY3RTZWxlY3Rpb24ob2JqZWN0U2VsZWN0aW9uKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLQkJewotCQkgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DQU5OT1RfTk9fSkFWQV9CRUFOIiksU3RhdHVzLkVSUk9SKTsKLQkJICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsKLQkJICByZXR1cm4gZXJyb3JTdGF0dXM7CQkJCi0JCX0KLSAgICAgIH0KLSAgICB9ICAgIAotICAgIAotICAgIGlmIChqYXZhQmVhbk5hbWU9PW51bGwgfHwgamF2YUJlYW5OYW1lLmxlbmd0aCgpPT0wKQotICAgIHsKLSAgICAgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DQU5OT1RfTk9fSkFWQV9CRUFOIiksU3RhdHVzLkVSUk9SKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoZXJyb3JTdGF0dXMpOwotICAgICAgcmV0dXJuIGVycm9yU3RhdHVzOwotICAgIH0KLSAgICAKLSAgICAvL01ha2Ugc3VyZSBhIHByb2plY3QgaXMgc2VsZWN0ZWQKLSAgICBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKHNlcnZpY2VQcm9qZWN0TmFtZSkpOwotICAgIGlmIChzZXJ2aWNlUHJvamVjdD09bnVsbCkKLSAgICB7Ci0gICAgICBTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fUFJPSkVDVCIpLFN0YXR1cy5FUlJPUik7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsKLSAgICAgIHJldHVybiBlcnJvclN0YXR1czsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9NYWtlIHN1cmUgdGhlIHNlbGVjdGVkIGJlYW4gY2FuIGJlIGxvYWRlZCBmcm9tIHRoZSBzZWxlY3RlZCBwcm9qZWN0Ci0JaWYgKGphdmFCZWFuTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKEpBVkFfRVhURU5TSU9OKQotCQl8fCBqYXZhQmVhbk5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChDTEFTU19FWFRFTlNJT04pKSB7Ci0JCWphdmFCZWFuTmFtZSA9IGphdmFCZWFuTmFtZS5zdWJzdHJpbmcoMCwgamF2YUJlYW5OYW1lLmxhc3RJbmRleE9mKCcuJykpOwotCX0KLQkKLSAgICB0cnkKLSAgICB7Ci0JICBKYXZhRU1GTmF0dXJlIGpNT0YgPSAoSmF2YUVNRk5hdHVyZSkgSmF2YUVNRk5hdHVyZS5jcmVhdGVSdW50aW1lKHNlcnZpY2VQcm9qZWN0KTsKLQkgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPShKYXZhQ2xhc3MpIEphdmFDbGFzc0ltcGwucmVmbGVjdChqYXZhQmVhbk5hbWUsIGpNT0YuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JICBpZiAoIWphdmFDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSAKLQkgIHsJCQotCQlTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCJKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZCIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ0FOTk9UX0xPQURfSkFWQV9CRUFOIiwgbmV3IFN0cmluZ1tdIHsgamF2YUJlYW5OYW1lLCBzZXJ2aWNlUHJvamVjdE5hbWUgfSksU3RhdHVzLkVSUk9SKTsKLQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0JCXJldHVybiBlcnJvclN0YXR1czsKLQkgIH0KLSAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgIHsKLQkgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkphdmFUb1dTRExNZXRob2RDb21tYW5kIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DQU5OT1RfTE9BRF9KQVZBX0JFQU4iLCBuZXcgU3RyaW5nW10geyBqYXZhQmVhbk5hbWUsIHNlcnZpY2VQcm9qZWN0TmFtZSB9KSxTdGF0dXMuRVJST1IpOwotCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0gICAgICByZXR1cm4gZXJyb3JTdGF0dXM7ICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2aWNlUHJvamVjdE5hbWUgVGhlIHNlcnZpY2VQcm9qZWN0TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdE5hbWUoU3RyaW5nIHNlcnZpY2VQcm9qZWN0TmFtZSkKLSAgewotICAgIHRoaXMuc2VydmljZVByb2plY3ROYW1lID0gc2VydmljZVByb2plY3ROYW1lOwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIG9iamVjdFNlbGVjdGlvbiBUaGUgb2JqZWN0U2VsZWN0aW9uIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE9iamVjdFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pCi0gIHsKLSAgICB0aGlzLm9iamVjdFNlbGVjdGlvbiA9IG9iamVjdFNlbGVjdGlvbjsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldEphdmFCZWFuRnJvbU9iamVjdFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgYmVhbkNsYXNzID0gIiI7Ci0gICAgSmF2YVJlc291cmNlRmlsdGVyIGZpbHRlciA9IG5ldyBKYXZhUmVzb3VyY2VGaWx0ZXIoKTsgCi0gICAgLy9JU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBpbml0aWFsU2VsZWN0aW9uXzsKLSAgICAvLwotICAgIGlmIChvYmplY3RTZWxlY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gb2JqZWN0U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBnZXQgdGhlIElSZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGUgc2VsZWN0aW9uCi0gICAgICAgIElSZXNvdXJjZSByZXMgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcmVzID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24ob2JqKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChmaWx0ZXIuYWNjZXB0cyhyZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gZ2V0IHRoZSBwYWNrYWdlLXF1YWxpZmllZCBjbGFzcyBuYW1lIHdpdGhvdXQgZmlsZSBleHRlbnNpb25zCi0gICAgICAgICAgU3RyaW5nIGJlYW5QYWNrYWdlID0gUmVzb3VyY2VVdGlscy5nZXRKYXZhUmVzb3VyY2VQYWNrYWdlTmFtZShyZXMuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgICAgaWYgKGJlYW5QYWNrYWdlPT1udWxsKQotICAgICAgICAgICAgYmVhblBhY2thZ2UgPSAiIjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBiZWFuUGFja2FnZSA9IGJlYW5QYWNrYWdlICsgIi4iOwotCi0gICAgICAgICAgYmVhbkNsYXNzID0gYmVhblBhY2thZ2UgKyByZXMuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgaWYgKGJlYW5DbGFzcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamF2YSIpIHx8IGJlYW5DbGFzcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotICAgICAgICAgICAgYmVhbkNsYXNzID0gYmVhbkNsYXNzLnN1YnN0cmluZygwLGJlYW5DbGFzcy5sYXN0SW5kZXhPZignLicpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICByZXR1cm4gYmVhbkNsYXNzOwotICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9BeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9BeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmJlOTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuc2tlbGV0b247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotCi1wdWJsaWMgY2xhc3MgQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb247Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gaW5pdGlhbFNlbGVjdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE9iamVjdFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pCi0gIHsKLSAgICB0aGlzLm9iamVjdFNlbGVjdGlvbiA9IG9iamVjdFNlbGVjdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpCi0gIHsKLSAgICB0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgICBpZiAod2ViU2VydmljZXNQYXJzZXIgPT0gbnVsbCkKLSAgICAgIHdlYlNlcnZpY2VzUGFyc2VyID0gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVVJJKCkKLSAgewotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwgJiYgIWluaXRpYWxTZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBmaXJzdEVsZW1lbnQgPSBpbml0aWFsU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgICBJRmlsZSBpZmlsZSA9IChJRmlsZSlmaXJzdEVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyBmaWxlRXh0ZW5zaW9uID0gaWZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgICAgICBpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHMoIndzZGwiKSB8fAotICAgICAgICAgICAgZmlsZUV4dGVuc2lvbi5lcXVhbHMoIndzaWwiKSB8fAotICAgICAgICAgICAgZmlsZUV4dGVuc2lvbi5lcXVhbHMoImh0bWwiKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBpZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7ICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgICBpZiAob2JqZWN0U2VsZWN0aW9uICE9IG51bGwgJiYgIW9iamVjdFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IG9iamVjdFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICAgIHJldHVybiAoKElSZXNvdXJjZSlvYmplY3QpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbldTSUwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdzaWxVUkkoKQotICB7Ci0gICAgU3RyaW5nIHdzVVJJID0gZ2V0V3NkbFVSSSgpOwotICAgIGludCBpbmRleCA9IHdzVVJJLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIod3NVUkkuc3Vic3RyaW5nKDAsIGluZGV4KSk7Ci0gICAgICBzYi5hcHBlbmQoIi53c2lsIik7Ci0gICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICBwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpCi0gIHsKLSAgICBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtID0gbmV3IEphdmFXU0RMUGFyYW1ldGVyKCk7Ci0gICAgamF2YVdTRExQYXJhbS5zZXRTZXJ2ZXJTaWRlKEphdmFXU0RMUGFyYW1ldGVyLlNFUlZFUl9TSURFX0JFQU4pOwotICAgIGphdmFXU0RMUGFyYW0uc2V0U2tlbGV0b25EZXBsb3kodHJ1ZSk7Ci0gICAgamF2YVdTRExQYXJhbS5zZXRNZXRhSW5mT25seShmYWxzZSk7Ci0gICAgcmV0dXJuIGphdmFXU0RMUGFyYW07Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEh0dHBCYXNpY0F1dGhQYXNzd29yZCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0V2ViU2VydmljZXNQYXJzZXIoKS5nZXRIVFRQQmFzaWNBdXRoUGFzc3dvcmQoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SHR0cEJhc2ljQXV0aFVzZXJuYW1lKCkKLSAgewotICAgIHJldHVybiBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpLmdldEhUVFBCYXNpY0F1dGhVc2VybmFtZSgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9BeGlzU2tlbGV0b25GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9BeGlzU2tlbGV0b25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWE0YjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vQXhpc1NrZWxldG9uRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuc2tlbGV0b247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuQXhpc0RlcGxveUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkNoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5Db3B5QXhpc0phckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5SZWZyZXNoUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5WYWxpZGF0ZVdTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc01hcHBpbmdzRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5Db21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5VcGRhdGVXRUJYTUxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suTW92ZURlcGxveW1lbnRGaWxlc1Rhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5Ta2VsZXRvbjJXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQnVpbGRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uU3RhcnRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5PcGVuSmF2YUVkaXRvckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YS5Qcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGEuU2VydmVyTmFtZTJJU2VydmVyVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0Lk9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2VsZWN0aW9uQ29tbWFuZDsKLQotcHVibGljIGNsYXNzIEF4aXNTa2VsZXRvbkZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotICBwdWJsaWMgQXhpc1NrZWxldG9uRnJhZ21lbnQoKQotICB7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBWYWxpZGF0ZVdTRExDb21tYW5kKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoICJTa2VsZXRvbkNvbmZpZyIpICk7Ci0gICAgYWRkKCBuZXcgQXhpc01hcHBpbmdzRnJhZ21lbnQoKSApOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzaygpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2soKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENvcHlBeGlzSmFyQ29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgV1NETDJKYXZhQ29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgTW92ZURlcGxveW1lbnRGaWxlc1Rhc2soKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFNrZWxldG9uMldTRExDb21tYW5kKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBVcGRhdGVXRUJYTUxDb21tYW5kKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBSZWZyZXNoUHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEJ1aWxkUHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFN0YXJ0UHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICAvLyB0aGUgc2Vjb25kIGJ1aWxkIHByb2plY3QgY29tbWFuZCBpcyBuZWVkZWQgdG8gc3luY2hyb25pemUgd2l0aCB3b3Jrc3BhY2UgYXV0byBidWlsZAotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQnVpbGRQcm9qZWN0Q29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQXhpc0RlcGxveUNvbW1hbmQoKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpLCAiIikpOwotICAgIGFkZCAobmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBPcGVuSmF2YUVkaXRvckNvbW1hbmQoKSwgIiIpKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICAgIC8vIFRyYW5zZm9ybWVycwotICAgIFByb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXIgcHJvamVjdFRyYW5zZm9ybWVyID0gbmV3IFByb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXIoKTsKLQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyBWYWxpZGF0ZVdTRExDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIFZhbGlkYXRlV1NETENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFZhbGlkYXRlV1NETENvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vIFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyBDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5jbGFzcywgIlNlcnZlclByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotCi0gICAgLy8gQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2sKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzay5jbGFzcywgIlByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MpOwotICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvblRyZWVXaWRnZXQuY2xhc3MsICJXc2RsVVJJIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJIdHRwQmFzaWNBdXRoVXNlcm5hbWUiLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkh0dHBCYXNpY0F1dGhQYXNzd29yZCIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MpOwotCi0gICAgLy8gTW92ZURlcGxveW1lbnRGaWxlc1Rhc2sKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBNb3ZlRGVwbG95bWVudEZpbGVzVGFzay5jbGFzcywgIlNlcnZlclByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgTW92ZURlcGxveW1lbnRGaWxlc1Rhc2suY2xhc3MpOwotCi0gICAgLy8gQ29weUF4aXNKYXJDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgQ29weUF4aXNKYXJDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0KLSAgICAvLyBTa2VsZXRvbjJXU0RMQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBTa2VsZXRvbjJXU0RMQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgU2tlbGV0b24yV1NETENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFNrZWxldG9uMldTRExDb21tYW5kLmNsYXNzKTsKLQotICAgIC8vIFVwZGF0ZVdFQlhNTENvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBVcGRhdGVXRUJYTUxDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0KLSAgICAvLyBSZWZyZXNoUHJvamVjdENvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBSZWZyZXNoUHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLSAgICAKLSAgICAvLyBCdWlsZFByb2plY3RDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgQnVpbGRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotCi0gICAgLy8gU3RhcnRQcm9qZWN0Q29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJTZXJ2ZXIiLCBTdGFydFByb2plY3RDb21tYW5kLmNsYXNzLCAiU2VydmljZUV4aXN0aW5nU2VydmVyIiwgbmV3IFNlcnZlck5hbWUySVNlcnZlclRyYW5zZm9ybWVyKCkpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvcHlBeGlzSmFyQ29tbWFuZC5jbGFzcywgIlByb2plY3RSZXN0YXJ0UmVxdWlyZWQiLCBTdGFydFByb2plY3RDb21tYW5kLmNsYXNzLCAiSXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCIsIG51bGwpOwotCi0gICAgLy8gQXhpc0RlcGxveUNvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIEF4aXNEZXBsb3lDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b24yV1NETENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vIENvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kLmNsYXNzKTsKLSAgICAvL2RhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uMldTRExDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIENvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZC5jbGFzcyk7Ci0gICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyBPcGVuSmF2YUVkaXRvckNvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQuY2xhc3MsICJDbGFzc05hbWVzIiwgT3BlbkphdmFFZGl0b3JDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9Ta2VsZXRvbkNvbmZpZ1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9Ta2VsZXRvbkNvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2UwZjdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vU2tlbGV0b25Db25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuc2tlbGV0b247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotCi1wdWJsaWMgY2xhc3MgU2tlbGV0b25Db25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtOwotCi0gIC8qIENPTlRFWFRfSUQgUEJTQzAwMDEgZm9yIHRoZSBTa2VsZXRvbiBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQlNDX1BBR0UgPSAiUEJTQzAwMDEiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MVElQX1BCU0NfUEFHRSA9ICJUT09MVElQX1BCU0NfUEFHRSI7Ci0gIAotICAvLyBwcml2YXRlIFRleHQgdXJpVGV4dF87Ci0gIC8qIENPTlRFWFRfSUQgUEJDRjAwMDIgZm9yIHRoZSBVUkkgZmllbGQgb2YgdGhlIEJlYW4gQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQkNGX1RFWFRfVVJJID0gIlBCQ0YwMDAyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BCQ0ZfVEVYVF9VUkkgPSAiVE9PTFRJUF9QQkNGX1RFWFRfVVJJIjsKLSAgCi0gIHByaXZhdGUgVGV4dCB3c2RsRm9sZGVyVGV4dF87Ci0gIC8qIENPTlRFWFRfSUQgUEJDRjAwMDYgZm9yIHRoZSBXU0RMIEZvbGRlciBmaWVsZCBpbiB0aGUgQmVhbiBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCQ0ZfVEVYVF9XU0RMX0ZPTERFUiA9ICJQQkNGMDAwNiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QQkNGX1RFWFRfV1NETF9GT0xERVIgPSAiVE9PTFRJUF9QQkNGX1RFWFRfV1NETF9GT0xERVIiOwotICAKLSAgcHJpdmF0ZSBUZXh0IHdzZGxGaWxlVGV4dF87Ci0gIC8qIENPTlRFWFRfSUQgUEJDRjAwMDcgZm9yIHRoZSBXU0RMIEZpbGUgZmllbGQgb2YgdGhlIEJlYW4gQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQkNGX1RFWFRfV1NETF9GSUxFID0gIlBCQ0YwMDA3IjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZJTEUgPSAiVE9PTFRJUF9QQkNGX1RFWFRfV1NETF9GSUxFIjsKLSAgCi0gIHByaXZhdGUgQ29tYm8gc2tlbGV0b25Gb2xkZXJUZXh0XzsKLSAgLyogQ09OVEVYVF9JRCBQQlNDMDAwNCBmb3IgdGhlIFNrZWxldG9uIEZvbGRlciBmaWVsZCBvZiB0aGUgU2tlbGV0b24gQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9QT1BfUEJTQ19URVhUX1NLRUxFVE9OX0ZPTERFUiA9ICJQQlNDMDAwNCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJTQ19URVhUX1NLRUxFVE9OX0ZPTERFUiA9ICJUT09MVElQX1BCU0NfVEVYVF9TS0VMRVRPTl9GT0xERVIiOwotICAvLwotCi0gIC8qIENPTlRFWFRfSUQgUEJTQzAwMDUgZm9yIHRoZSBTa2VsZXRvbiBGb2xkZXIgQnJvd3NlIGJ1dHRvbiBvZiB0aGUgU2tlbGV0b24gQ29uZmlnIFBhZ2UgKi8KLSAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9QT1BfUEJTQ19CVVRUT05fU0tFTEVUT05fRk9MREVSX0JST1dTRSA9ICJQQlNDMDAwNSI7IC8vJE5PTi1OTFMtMSQKLSAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJTQ19CVVRUT05fU0tFTEVUT05fRk9MREVSX0JST1dTRSA9ICJUT09MVElQX1BCU0NfQlVUVE9OX1NLRUxFVE9OX0ZPTERFUl9CUk9XU0UiOwotICAKLSAgcHJpdmF0ZSBCdXR0b24gc2hvd01hcHBpbmdzQ2hlY2tib3hfOwotICAvKiBDT05URVhUX0lEIFBCU0MwMDE2IGZvciB0aGUgU2hvdyBNYXBwaW5ncyBjaGVja2JveCBvZiB0aGUgQmVhbiBNZXRob2RzIFBhZ2UgICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfTjJQX1NIT1dfTUFQUElOR1MgPSAiUEJTQzAwMTYiOyAvLyROT04tTkxTLTEkCi0JCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZCAgICAgICAgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotICAgIFN0cmluZyAgICAgICBjb25QbHVnaW5JZCAgICAgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICAgIFN0cmluZyAgICAgICBiYXNlQ29uUGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICAKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgICAgICAgID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBNZXNzYWdlVXRpbHMgY29uTXNnVXRpbHMgICAgID0gbmV3IE1lc3NhZ2VVdGlscyggY29uUGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBNZXNzYWdlVXRpbHMgYmFzZUNvbk1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggYmFzZUNvblBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgVUlVdGlscyAgICAgIHVpVXRpbHMgICAgICAgICA9IG5ldyBVSVV0aWxzKCBtc2dVdGlscywgcGx1Z2luSWQgKTsKLSAgICBVSVV0aWxzICAgICAgY29uVWlVdGlscyAgICAgID0gbmV3IFVJVXRpbHMoIGNvbk1zZ1V0aWxzLCBwbHVnaW5JZCApOwotICAgIFVJVXRpbHMgICAgICBiYXNlQ29uVWlVdGlscyAgPSBuZXcgVUlVdGlscyggYmFzZUNvbk1zZ1V0aWxzLCBwbHVnaW5JZCApOwotCi0gIAlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBwYXJlbnQsIHBsdWdpbklkICsgIi4iICsgIElORk9QT1BfUEJTQ19QQUdFICk7Ci0gIAlwYXJlbnQuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIFRPT0xUSVBfUEJTQ19QQUdFICkgKTsKLSAgICAKLSAgICBDb21wb3NpdGUgdGV4dEdyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMiwgMCwgMCApOwotCi0gICAgLyoKLSAgICB1cmlUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggdGV4dEdyb3VwLCAiTEFCRUxfVVJJIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9PTFRJUF9QQkNGX1RFWFRfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0ZfVEVYVF9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotICAgICovCi0KLSAgICB3c2RsRm9sZGVyVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIHRleHRHcm91cCwgIkxBQkVMX09VVFBVVF9GT0xERVJfTkFNRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZPTERFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDRl9URVhUX1dTRExfRk9MREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0KLSAgICB3c2RsRmlsZVRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KCB0ZXh0R3JvdXAsICJMQUJFTF9PVVRQVVRfRklMRV9OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNGX1RFWFRfV1NETF9GSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotCi0gICAgc2tlbGV0b25Gb2xkZXJUZXh0XyA9IGJhc2VDb25VaVV0aWxzLmNyZWF0ZUNvbWJvKCB0ZXh0R3JvdXAsICJMQUJFTF9TS0VMRVRPTl9ST09UX05BTUUiLAotICAgICAgICBUT09MVElQX1BCU0NfVEVYVF9TS0VMRVRPTl9GT0xERVIsCi0gICAgICAgIElORk9QT1BfUEJTQ19URVhUX1NLRUxFVE9OX0ZPTERFUiwKLSAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0KLSAgICBMYWJlbCBzZXBhcmF0b3IgPSB1aVV0aWxzLmNyZWF0ZUhvcml6b250YWxTZXBhcmF0b3IoIHBhcmVudCwgNSApOwotCi0gICAgc2hvd01hcHBpbmdzQ2hlY2tib3hfID0gY29uVWlVdGlscy5jcmVhdGVDaGVja2JveCggcGFyZW50LCAiTEFCRUxfRVhQTE9SRV9NQVBQSU5HU19YTUwyQkVBTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfTjJQX1NIT1dfTUFQUElOR1MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfTjJQX1NIT1dfTUFQUElOR1MgKTsKLSAgICAgICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50VVJJKFN0cmluZyBlbmRwb2ludFVSSSkKLSAgewotICAJLyoKLSAgICBpZiAoZW5kcG9pbnRVUkkgIT0gbnVsbCkKLSAgICAgIHVyaVRleHRfLnNldFRleHQoZW5kcG9pbnRVUkkpOwotICAgICovCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dFdTRExGb2xkZXIoU3RyaW5nIG91dHB1dFdTRExGb2xkZXIpCi0gIHsKLSAgICBpZiAob3V0cHV0V1NETEZvbGRlciAhPSBudWxsKQotICAgICAgd3NkbEZvbGRlclRleHRfLnNldFRleHQob3V0cHV0V1NETEZvbGRlcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dFdTRExGaWxlKFN0cmluZyBvdXRwdXRXU0RMRmlsZSkKLSAgewotICAgIGlmIChvdXRwdXRXU0RMRmlsZSAhPSBudWxsKQotICAgICAgd3NkbEZpbGVUZXh0Xy5zZXRUZXh0KG91dHB1dFdTRExGaWxlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0T3V0cHV0SmF2YUZvbGRlcihTdHJpbmcgb3V0cHV0SmF2YUZvbGRlcikKLSAgewotICAgIGlmIChvdXRwdXRKYXZhRm9sZGVyICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gc2tlbGV0b25Gb2xkZXJUZXh0Xy5pbmRleE9mKG91dHB1dEphdmFGb2xkZXIpOwotICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICBza2VsZXRvbkZvbGRlclRleHRfLnNlbGVjdChpbmRleCk7Ci0gICAgICBlbHNlIGlmIChza2VsZXRvbkZvbGRlclRleHRfLmdldEl0ZW1Db3VudCgpIDw9IDApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByb290ID0gZ2V0V29ya3NwYWNlUm9vdExvY2F0aW9uKCk7Ci0gICAgICAgIGlmIChvdXRwdXRKYXZhRm9sZGVyLnN0YXJ0c1dpdGgocm9vdCkpCi0gICAgICAgICAgc2tlbGV0b25Gb2xkZXJUZXh0Xy5zZXRUZXh0KG91dHB1dEphdmFGb2xkZXIuc3Vic3RyaW5nKHJvb3QubGVuZ3RoKCkpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHNrZWxldG9uRm9sZGVyVGV4dF8uc2V0VGV4dChvdXRwdXRKYXZhRm9sZGVyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNob3dNYXBwaW5nKGJvb2xlYW4gc2hvd01hcHBpbmcpCi0gIHsKLSAgICBzaG93TWFwcGluZ3NDaGVja2JveF8uc2V0U2VsZWN0aW9uKHNob3dNYXBwaW5nKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd01hcHBpbmcoKQotICB7Ci0gICAgcmV0dXJuIHNob3dNYXBwaW5nc0NoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGphdmFXU0RMUGFyYW0uCi0gICAqLwotICBwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpIHsKLSAgICBTdHJpbmcgcm9vdCA9IGdldFdvcmtzcGFjZVJvb3RMb2NhdGlvbigpOwotICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHJvb3QpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHJvb3QgPSBmaWxlLnRvVVJMKCkudG9TdHJpbmcoKTsKLSAgICAgIGNoYXIgbGFzdENoYXIgPSByb290LmNoYXJBdChyb290Lmxlbmd0aCgpLTEpOwotICAgICAgaWYgKGxhc3RDaGFyID09ICcvJyB8fCBsYXN0Q2hhciA9PSAnXFwnKQotICAgICAgICByb290ID0gcm9vdC5zdWJzdHJpbmcoMCwgcm9vdC5sZW5ndGgoKS0xKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICB7Ci0gICAgfQotICAgIGphdmFXU0RMUGFyYW0uc2V0T3V0cHV0KHJvb3QgKyB3c2RsRm9sZGVyVGV4dF8uZ2V0VGV4dCgpKTsKLSAgICBqYXZhV1NETFBhcmFtLnNldEphdmFPdXRwdXQocm9vdCArIHNrZWxldG9uRm9sZGVyVGV4dF8uZ2V0VGV4dCgpKTsKLQkgIHJldHVybiBqYXZhV1NETFBhcmFtOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBqYXZhV1NETFBhcmFtIFRoZSBqYXZhV1NETFBhcmFtIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkgewotCSAgdGhpcy5qYXZhV1NETFBhcmFtID0gamF2YVdTRExQYXJhbTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkKLSAgewotICAgIFN0cmluZyBvcmlnaW5hbFNrZWxldG9uRm9sZGVyID0gc2tlbGV0b25Gb2xkZXJUZXh0Xy5nZXRUZXh0KCk7Ci0gICAgc2tlbGV0b25Gb2xkZXJUZXh0Xy5yZW1vdmVBbGwoKTsKLSAgICBJUGF0aFtdIHBhdGhzID0gUmVzb3VyY2VVdGlscy5nZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKHNlcnZpY2VQcm9qZWN0KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aCA7IGkrKykKLSAgICAgIHNrZWxldG9uRm9sZGVyVGV4dF8uYWRkKHBhdGhzW2ldLnRvU3RyaW5nKCkpOwotICAgIGludCBpbmRleCA9IHNrZWxldG9uRm9sZGVyVGV4dF8uaW5kZXhPZihvcmlnaW5hbFNrZWxldG9uRm9sZGVyKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICBza2VsZXRvbkZvbGRlclRleHRfLnNlbGVjdChpbmRleCk7Ci0gICAgZWxzZQotICAgICAgc2tlbGV0b25Gb2xkZXJUZXh0Xy5zZWxlY3QoMCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFdvcmtzcGFjZVJvb3RMb2NhdGlvbigpCi0gIHsKLSAgCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKS50b1N0cmluZygpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9Ta2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL3NrZWxldG9uL1NrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3ZGIzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL3NrZWxldG9uL1NrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuc2tlbGV0b247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklXZWJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSjJFRVdlYk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLQotcHVibGljIGNsYXNzIFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0gIHByaXZhdGUgSVByb2plY3Qgc2VydmVyUHJvamVjdDsKLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtOwotCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KFN0cmluZyBzZXJ2ZXJQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5zZXJ2ZXJQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHNlcnZlclByb2plY3QpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludFVSSSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRXU0RMRm9sZGVyKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIEoyRUVXZWJOYXR1cmVSdW50aW1lIG5hdHVyZSA9IChKMkVFV2ViTmF0dXJlUnVudGltZSlzZXJ2ZXJQcm9qZWN0LmdldE5hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKTsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobmF0dXJlLmdldE1vZHVsZVNlcnZlclJvb3QoKS5nZXRGdWxsUGF0aCgpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkudG9TdHJpbmcoKSk7Ci0gICAgICBzYi5hcHBlbmQoIndzZGwiKTsKLSAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dFdTRExGaWxlKCkKLSAgewotICAgIGludCBpbmRleCA9IHdzZGxVUkkubGFzdEluZGV4T2YoJy8nKTsKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICBpbmRleCA9IHdzZGxVUkkubGFzdEluZGV4T2YoJ1xcJyk7Ci0gICAgcmV0dXJuIHdzZGxVUkkuc3Vic3RyaW5nKGluZGV4KzEsIHdzZGxVUkkubGVuZ3RoKCkpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dEphdmFGb2xkZXIoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSUNsYXNzcGF0aEVudHJ5W10gY3AgPSBKYXZhQ29yZS5jcmVhdGUoc2VydmVyUHJvamVjdCkuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKQotICAgICAgICBpZiAoY3BbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpCi0gICAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZChjcFtpXS5nZXRQYXRoKCkpLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93TWFwcGluZygpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2hvd01hcHBpbmcoKQotICB7Ci0gICAgcmV0dXJuIGdldFNob3dNYXBwaW5nKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkKLSAgewotICAJdGhpcy5qYXZhV1NETFBhcmFtID0gamF2YVdTRExQYXJhbTsKLSAgfQotICAKLSAgcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKQotICB7Ci0gICAgamF2YVdTRExQYXJhbS5zZXRPdXRwdXQoZ2V0T3V0cHV0V1NETEZvbGRlcigpKTsKLSAgICBqYXZhV1NETFBhcmFtLnNldEphdmFPdXRwdXQoZ2V0T3V0cHV0SmF2YUZvbGRlcigpKTsKLSAgICByZXR1cm4gamF2YVdTRExQYXJhbTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpemFyZC9iZWFucy9XU0JlYW5BeGlzVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2l6YXJkL2JlYW5zL1dTQmVhbkF4aXNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YTk5YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2l6YXJkL2JlYW5zL1dTQmVhbkF4aXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQuYmVhbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5KYXZhMldTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5DaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc01hcHBpbmdzV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuSmF2YVRvV1NETE1ldGhvZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrLkRlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suTGl0ZXJhbFN1cHBvcnRNZXNzYWdlVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLmJlYW4uQXhpc0JlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLmJlYW4uQmVhbkNvbmZpZ1dpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkphdmFSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuT2JqZWN0U2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgY2xhc3MgZm9yIHRoZQotKiBKYXZhIEJlYW4KLSoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy53YXMuY3JlYXRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGV9LgotKi8KLXB1YmxpYyBjbGFzcyBXU0JlYW5BeGlzVHlwZSBpbXBsZW1lbnRzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSwgQ29tbWFuZFdpZGdldEJpbmRpbmcKLXsJCi0gIHByaXZhdGUgSmF2YVJlc291cmNlRmlsdGVyIGZpbHRlcl8gPSBuZXcgSmF2YVJlc291cmNlRmlsdGVyKCk7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlck5hbWVfOwotICBwcml2YXRlIFN0cmluZyBydW50aW1lTmFtZV87Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1dlYk1vZHVsZVJlcXVpcmVkXzsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIEEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoIiVXU19OQU1FX0JFQU5XQVhJUyIpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJVdTX0RFU0NfQkVBTldBWElTIik7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGxhYmVsIGZvciB0aGUgU2VydmVyIHN1cHBvcnRlZCBieSB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUKLSAgKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIHNlcnZlciBsYWJlbCBmcm9tIHNlcnZlciBwbHVnaW5zCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZlck5hbWVfOwotICB9Ci0KLSAgLyoqCi0gICogU2V0cyB0aGUgc2VydmVyIGxhYmVsIHRvIHRoZSBhcHByb3ByaWF0ZSBuYW1lIGZvdW5kIGluIHRoZSBzZXJ2ZXIgcGx1Z2lucy4KLSAgKiBAcGFyYW0gc2VydmVyIG5hbWUKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmVyTGFiZWwoU3RyaW5nIHNlcnZlckxhYmVsKQotICB7Ci0gICAgc2VydmVyTmFtZV8gPSBzZXJ2ZXJMYWJlbDsKLSAgfQotICAKLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBsYWJlbCBmb3IgdGhlIGRlcGxveW1lbnQgcnVudGltZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUKLSAgKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGxhYmVsIGZvciB0aGUgZGVwbG95bWVudCBydW50aW1lCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUxhYmVsKCkKLSAgewotICAgIHJldHVybiBydW50aW1lTmFtZV87Ci0gIH0KLQotICAvKioKLSAgKiBTZXRzIHRoZSBydW50aW1lIGxhYmVsIGZvciB0aGUgYXBwcm9wcmlhdGUgcnVudGltZQotICAqIEBwYXJhbSBzZXJ2ZXIgbmFtZQotICAqLwotICBwdWJsaWMgdm9pZCBzZXRSdW50aW1lTGFiZWwoU3RyaW5nIHJ1bnRpbWVMYWJlbCkKLSAgewotICAgIHJ1bnRpbWVOYW1lXyA9IHJ1bnRpbWVMYWJlbDsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBsYWJlbCBmb3IgdGhlIFdlYiBTZXJ2aWNlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gICogQHJldHVybiBBIGxhYmVsIGZvciB0aGUgV2ViIFNlcnZpY2UgdHlwZQotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VUeXBlTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKCIlV0VCU0VSVklDRVRZUEVfTkFNRV9KQVZBX0FYSVMiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYSBXZWIgTW9kdWxlIGlzIHJlcXVpcmVkIGZvciB0aGlzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotICAqIEByZXR1cm4gdHJ1ZSBpZiByZXF1aXJlV2ViTW9kdWxlCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzV2ViTW9kdWxlUmVxdWlyZWQoKQotICB7Ci0gICAgcmV0dXJuIGlzV2ViTW9kdWxlUmVxdWlyZWRfOwotICB9Ci0KLSAgLyoqCi0gICogU2V0cyB0aGUgYm9vbGVhbiB2YWx1ZSBhdCBydW50aW1lIGFjY29yZGluZyB0byByZXF1aXJlV2ViTW9kdWxlIGF0dHJpYnV0ZSBmcm9tIHRoZSBtYW5pZmVzdCBmaWxlCi0gICogQHBhcmFtIHJlcXVpcmVXZWJNb2R1bGUgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYk1vZHVsZVJlcXVpcmVkKGJvb2xlYW4gcmVxdWlyZVdlYk1vZHVsZSkKLSAgewotICAgIGlzV2ViTW9kdWxlUmVxdWlyZWRfID0gcmVxdWlyZVdlYk1vZHVsZTsKLSAgfQotCi0gIAotICAvKioKLSAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCkKLSAgewotICAgIHJldHVybiBnZXROYW1lKCk7Ci0gIH0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSNpc0VKQk1vZHVsZVJlcXVpcmVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQk1vZHVsZVJlcXVpcmVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUjc2V0RUpCTW9kdWxlUmVxdWlyZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFSkJNb2R1bGVSZXF1aXJlZChib29sZWFuIGFyZzApIHsKLQkJcmV0dXJuOwotCi0JfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KSAKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIAotICB7Ci0gICAgLyoKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ3VycmVudFBhZ2VDb21tYW5kLmNsYXNzLCAiQ3VycmVudFBhZ2UiLCBCZWFuQ2xhc3NXaWRnZXQuY2xhc3MgKTsKLSAgICAvL0JlYW5DbGFzc1dpZGdldCAtIGFzIHRhcmdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YUJlYW5OYW1lIiwgQmVhbkNsYXNzV2lkZ2V0LmNsYXNzLCAiQmVhbkNsYXNzTmFtZSIsIG51bGwpOwotICAgIC8vQmVhbkNsYXNzV2lkZ2V0IC0gYXMgc291cmNlCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQmVhbkNsYXNzV2lkZ2V0LmNsYXNzLCAiQmVhbkNsYXNzTmFtZSIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzLCAiSmF2YUJlYW5OYW1lIiwgbnVsbCk7ICAgIC8vQmVhbkNvbmZpZ1dpZGdldAotICAgICovCi0gICAgLy8gT2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiT2JqZWN0U2VsZWN0aW9uIiwgRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vQmVhbkNvbmZpZ1dpZGdldCAtIGFzIHRhcmdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEphdmFUb1dTRExNZXRob2RDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIEJlYW5Db25maWdXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgbnVsbCApOwotICAgIC8vQmVhbkNvbmZpZ1dpZGdldCAtIGFzIHNvdXJjZQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEJlYW5Db25maWdXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgTGl0ZXJhbFN1cHBvcnRNZXNzYWdlVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhCZWFuQ29uZmlnV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2suY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQmVhbkNvbmZpZ1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhCZWFuQ29uZmlnV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIEphdmEyV1NETENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7ICAgICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEJlYW5Db25maWdXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsKLSAgICAgICAgCi0gICAgLy9NYXBwaW5nRnJhZ21lbnQgKG9wdGlvbmFsbHkgZGlzcGxheXMgdGhlIEF4aXNNYXBwaW5nc1dpZGdldCkgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQmVhbkNvbmZpZ1dpZGdldC5jbGFzcywgIkN1c3RvbWl6ZVNlcnZpY2VNYXBwaW5ncyIsIEF4aXNCZWFuRnJhZ21lbnQuTWFwcGluZ0ZyYWdtZW50LmNsYXNzKTsKLQotICAgIC8vQXhpc01hcHBpbmdzV2lkZ2V0IC0gYXMgdGFyZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQmVhbkNvbmZpZ1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MpOwotICAgIAotICAgIC8vQXhpc01hcHBpbmdzV2lkZ2V0IC0gYXMgc291cmNlCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIExpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2suY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2suY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBKYXZhMldTRExDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOyAgICAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsgICAgCi0gICAgCi0gICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggRGVmYXVsdHNGb3JDb25maWcuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgQmVhbkNvbmZpZ1dpZGdldC5jbGFzcyApOwotICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIERlZmF1bHRzRm9yQ29uZmlnLmNsYXNzLCAiQ3VzdG9taXplU2VydmljZU1hcHBpbmdzIiwgQmVhbkNvbmZpZ1dpZGdldC5jbGFzcyApOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkgCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICAKLSAgICAvKgotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkJlYW5TZWxlY3Rpb24iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NCRUFOX0NMQVNTIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NCRUFOX0NMQVNTIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJlYW5DbGFzc1dpZGdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgKi8KLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkJlYW5Db25maWciLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NCRUFOX0NPTkZJRyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTQkVBTl9DT05GSUciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmVhbkNvbmZpZ1dpZGdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0KLSAgICBTdHJpbmcgICAgICAgY29uc1BsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIGNvbnNNc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIGNvbnNQbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkF4aXNTZXJ2aWNlQmVhbk1hcHBpbmciLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNNc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX0JFQU4yWE1MIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zTXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1AyTl9NQVBQSU5HUyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBeGlzTWFwcGluZ3NXaWRnZXQoQXhpc01hcHBpbmdzV2lkZ2V0Lk1PREVfQkVBTjJYTUwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICB7Ci0gICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQXhpc0JlYW5GcmFnbWVudCgpOyAKLSAgICAgIH0KLSAgICB9OwotICB9Ci0gICAgCi19Ci0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aXphcmQvd3NkbC9XU1dTRExBeGlzVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2l6YXJkL3dzZGwvV1NXU0RMQXhpc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdmMjRjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aXphcmQvd3NkbC9XU1dTRExBeGlzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLndzZGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc01hcHBpbmdzRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2lkZ2V0cy5BeGlzTWFwcGluZ3NXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uLkF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuc2tlbGV0b24uQXhpc1NrZWxldG9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5za2VsZXRvbi5Ta2VsZXRvbkNvbmZpZ1dpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uLlNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5XU0RMUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YS5Qcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0vKioKLSogVGhpcyBpcyB0aGUgY2xhc3MgZm9yIHRoZSBBeGlzIFdlYiBzZXJ2aWNlIHR5cGUuCi0qLwotcHVibGljIGNsYXNzIFdTV1NETEF4aXNUeXBlIGltcGxlbWVudHMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlLCBDb21tYW5kV2lkZ2V0QmluZGluZyAKLXsKLQlwcml2YXRlIFdTRExSZXNvdXJjZUZpbHRlciBmaWx0ZXJfID0gbmV3IFdTRExSZXNvdXJjZUZpbHRlcigpOwotCi0JcHJpdmF0ZSBTdHJpbmcgc2VydmVyTmFtZV87Ci0JcHJpdmF0ZSBTdHJpbmcgcnVudGltZU5hbWVfOwotCXByaXZhdGUgYm9vbGVhbiBpc1dlYk1vZHVsZVJlcXVpcmVkXzsKLQkvKioKLQkqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotCSogQHJldHVybiBBIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0JKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJVdTX05BTUVfV1NETEFYSVMiKTsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgYSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotCSogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0JKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoIiVXU19ERVNDX1dTRExBWElTIik7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGxhYmVsIGZvciB0aGUgU2VydmVyIHN1cHBvcnRlZCBieSB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUKLQkqIEByZXR1cm4gQSBsb2NhbGUgc3BlY2lmaWMgc2VydmVyIGxhYmVsIGZyb20gc2VydmVyIHBsdWdpbnMKLQkqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTGFiZWwoKSB7Ci0JCXJldHVybiBzZXJ2ZXJOYW1lXzsKLQl9Ci0KLQkvKioKLQkqIFNldHMgdGhlIHNlcnZlciBsYWJlbCB0byB0aGUgYXBwcm9wcmlhdGUgbmFtZSBmb3VuZCBpbiB0aGUgc2VydmVyIHBsdWdpbnMuCi0JKiBAcGFyYW0gc2VydmVyIG5hbWUKLQkqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlckxhYmVsKFN0cmluZyBzZXJ2ZXJMYWJlbCkgewotCQlzZXJ2ZXJOYW1lXyA9IHNlcnZlckxhYmVsOwotCX0KLQotCS8qKgotCSogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBsYWJlbCBmb3IgdGhlIGRlcGxveW1lbnQgcnVudGltZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUKLQkqIEByZXR1cm4gQSBsb2NhbGUgc3BlY2lmaWMgbGFiZWwgZm9yIHRoZSBkZXBsb3ltZW50IHJ1bnRpbWUKLQkqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUxhYmVsKCkgewotCQlyZXR1cm4gcnVudGltZU5hbWVfOwotCX0KLQotCS8qKgotCSogU2V0cyB0aGUgcnVudGltZSBsYWJlbCBmb3IgdGhlIGFwcHJvcHJpYXRlIHJ1bnRpbWUKLQkqIEBwYXJhbSBzZXJ2ZXIgbmFtZQotCSovCi0JcHVibGljIHZvaWQgc2V0UnVudGltZUxhYmVsKFN0cmluZyBydW50aW1lTGFiZWwpIHsKLQkJcnVudGltZU5hbWVfID0gcnVudGltZUxhYmVsOwotCX0KLQotCS8qKgotCSogUmV0dXJucyBhIGxhYmVsIGZvciB0aGUgV2ViIFNlcnZpY2UgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLQkqIEByZXR1cm4gQSBsYWJlbCBmb3IgdGhlIFdlYiBTZXJ2aWNlIHR5cGUKLQkqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKAotCQkJIiVXRUJTRVJWSUNFVFlQRV9OQU1FX1dTRExfQVhJUyIpOwotCX0KLQotCS8qKgotCSogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIFdlYiBNb2R1bGUgaXMgcmVxdWlyZWQgZm9yIHRoaXMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0JKiBAcmV0dXJuIHRydWUgaWYgcmVxdWlyZVdlYk1vZHVsZQotCSovCi0JcHVibGljIGJvb2xlYW4gaXNXZWJNb2R1bGVSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIGlzV2ViTW9kdWxlUmVxdWlyZWRfOwotCX0KLQotCS8qKgotCSogU2V0cyB0aGUgYm9vbGVhbiB2YWx1ZSBhdCBydW50aW1lIGFjY29yZGluZyB0byByZXF1aXJlV2ViTW9kdWxlIGF0dHJpYnV0ZSBmcm9tIHRoZSBtYW5pZmVzdCBmaWxlCi0JKiBAcGFyYW0gcmVxdWlyZVdlYk1vZHVsZSAKLQkqLwotCXB1YmxpYyB2b2lkIHNldFdlYk1vZHVsZVJlcXVpcmVkKGJvb2xlYW4gcmVxdWlyZVdlYk1vZHVsZSkgewotCQlpc1dlYk1vZHVsZVJlcXVpcmVkXyA9IHJlcXVpcmVXZWJNb2R1bGU7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUjaXNFSkJNb2R1bGVSZXF1aXJlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFSkJNb2R1bGVSZXF1aXJlZCgpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSNzZXRFSkJNb2R1bGVSZXF1aXJlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVKQk1vZHVsZVJlcXVpcmVkKGJvb2xlYW4gYXJnMCkgewotCQlyZXR1cm47Ci0KLQl9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpIAotICB7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSAKLSAgewotICAgIC8vIFNrZWxldG9uQ29uZmlnV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgU2tlbGV0b25Db25maWdXaWRnZXQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgbmV3IFByb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgU2tlbGV0b25Db25maWdXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJFbmRwb2ludFVSSSIsIFNrZWxldG9uQ29uZmlnV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiT3V0cHV0V1NETEZvbGRlciIsIFNrZWxldG9uQ29uZmlnV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiT3V0cHV0V1NETEZpbGUiLCBTa2VsZXRvbkNvbmZpZ1dpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIk91dHB1dEphdmFGb2xkZXIiLCBTa2VsZXRvbkNvbmZpZ1dpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNob3dNYXBwaW5nIiwgU2tlbGV0b25Db25maWdXaWRnZXQuY2xhc3MpOwotCi0gICAgLy8gQXhpc01hcHBpbmdzRnJhZ21lbnQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2hvd01hcHBpbmciLCBBeGlzTWFwcGluZ3NGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b25Db25maWdXaWRnZXQuY2xhc3MsICJTaG93TWFwcGluZyIsIEF4aXNNYXBwaW5nc0ZyYWdtZW50LmNsYXNzKTsKLQotICAgIC8vIEF4aXNNYXBwaW5nc1dpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uQ29uZmlnV2lkZ2V0LmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBudWxsKTsKLQotICAgIC8vIFdTREwySmF2YUNvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uQ29uZmlnV2lkZ2V0LmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpIAotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotICAgIC8qCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiV1NETFNlbGVjdGlvbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19TRUxFQ1RJT04iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU19TRUxFQ1RJT04iKSwKLQkJICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCQkgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkJICAgICAgICAgICAgICAgICAgewotCQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1NETFNlbGVjdGlvbldpZGdldCgpOwotCQkgICAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgICAgICB9ICk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJXU0RMU2VsZWN0aW9uVHJlZVdpZGdldCIsIAotICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTRExfU0VMRUNUSU9OIiksCi0gICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU0RMX1NFTEVDVElPTiIpLAotICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgKi8KLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIlNrZWxldG9uQ29uZmlnIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTU0tFTF9DT05GSUciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU1NLRUxfQ09ORklHIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNrZWxldG9uQ29uZmlnV2lkZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkF4aXNNYXBwaW5nc1dpZGdldCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19YTUwyQkVBTiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX04yUF9NQVBQSU5HUyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBeGlzTWFwcGluZ3NXaWRnZXQoQXhpc01hcHBpbmdzV2lkZ2V0Lk1PREVfWE1MMkJFQU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgIHsKLSAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBeGlzU2tlbGV0b25GcmFnbWVudCgpOyAKLSAgICAgIH0KLSAgICB9OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi93c3J0L0F4aXNCZWFuQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vd3NydC9BeGlzQmVhbkNvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwMGNlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi93c3J0L0F4aXNCZWFuQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLmJlYW4uQmVhbkNvbmZpZ1dpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQuYmVhbnMuV1NCZWFuQXhpc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwudWkud2lkZ2V0cy5XaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlcjsKLQotcHVibGljIGNsYXNzIEF4aXNCZWFuQ29uZmlnV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0KLQlwcml2YXRlIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yICAgICAgICAgICAgIGJlYW5Db25maWdXaWRnZXRfOwotCXByaXZhdGUgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgICAgICAgICAgICAgbWFwcGluZ3NXaWRnZXRfOwotCXByaXZhdGUgQmVhbkNvbmZpZ1dpZGdldCAgICAgICAgICAgICAgICAgICAgYmVhbldpZGdldF87Ci0JcHJpdmF0ZSBXaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlciBhZGFwdGVyXzsKLQkKLQlwdWJsaWMgQXhpc0JlYW5Db25maWdXaWRnZXRGYWN0b3J5KCkKLQl7Ci0JICBhZGFwdGVyXyA9IG5ldyBXaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlciggbmV3IFdTQmVhbkF4aXNUeXBlKCkgKTsKLQkgIAotCSAgYmVhbkNvbmZpZ1dpZGdldF8gPSBhZGFwdGVyXy5nZXRXaWRnZXQoICJCZWFuQ29uZmlnIiApOwotCSAgYmVhbldpZGdldF8gICAgICAgPSAoQmVhbkNvbmZpZ1dpZGdldCliZWFuQ29uZmlnV2lkZ2V0Xy5nZXRXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKS5jcmVhdGUoKTsKLQkgIG1hcHBpbmdzV2lkZ2V0XyAgID0gYWRhcHRlcl8uZ2V0V2lkZ2V0KCAiQXhpc1NlcnZpY2VCZWFuTWFwcGluZyIgKTsKLQl9Ci0JCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSAKLQl7Ci0JICByZXR1cm4gYmVhbkNvbmZpZ1dpZGdldF87Ci0JfQotCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldCggSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIAotCXsKLQkgIHJldHVybiB3aWRnZXRDb250cmlidXRvciA9PSBiZWFuQ29uZmlnV2lkZ2V0XyAmJiBiZWFuV2lkZ2V0Xy5nZXRDdXN0b21pemVTZXJ2aWNlTWFwcGluZ3MoKSA/IG1hcHBpbmdzV2lkZ2V0XyA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSAKLQl7Ci0JICBhZGFwdGVyXy5yZWdpc3RlckRhdGFNYXBwaW5ncyggZGF0YVJlZ2lzdHJ5ICk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vd3NydC9BeGlzU2tlbGV0b25Db25maWdXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi93c3J0L0F4aXNTa2VsZXRvbkNvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg4OTRlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi93c3J0L0F4aXNTa2VsZXRvbkNvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5za2VsZXRvbi5Ta2VsZXRvbkNvbmZpZ1dpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQuYmVhbnMuV1NCZWFuQXhpc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwudWkud2lkZ2V0cy5XaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlcjsKLQotcHVibGljIGNsYXNzIEF4aXNTa2VsZXRvbkNvbmZpZ1dpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgewotCi0JcHJpdmF0ZSBJTmFtZWRXaWRnZXRDb250cmlidXRvciAgICAgICAgICAgICBza2VsQ29uZmlnV2lkZ2V0XzsKLQlwcml2YXRlIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yICAgICAgICAgICAgIG1hcHBpbmdzV2lkZ2V0XzsKLQlwcml2YXRlIFNrZWxldG9uQ29uZmlnV2lkZ2V0ICAgICAgICAgICAgICAgIHNrZWxXaWRnZXRfOwotCXByaXZhdGUgV2lkZ2V0QmluZGluZ1RvV2lkZ2V0RmFjdG9yeUFkYXB0ZXIgYWRhcHRlcl87Ci0JCi0JcHVibGljIEF4aXNTa2VsZXRvbkNvbmZpZ1dpZGdldEZhY3RvcnkoKQotCXsKLQkgIGFkYXB0ZXJfID0gbmV3IFdpZGdldEJpbmRpbmdUb1dpZGdldEZhY3RvcnlBZGFwdGVyKCBuZXcgV1NCZWFuQXhpc1R5cGUoKSApOwotCSAgCi0JICBza2VsQ29uZmlnV2lkZ2V0XyA9IGFkYXB0ZXJfLmdldFdpZGdldCggIlNrZWxldG9uQ29uZmlnIiApOwotCSAgc2tlbFdpZGdldF8gICAgICAgPSAoU2tlbGV0b25Db25maWdXaWRnZXQpc2tlbENvbmZpZ1dpZGdldF8uZ2V0V2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkuY3JlYXRlKCk7Ci0JICBtYXBwaW5nc1dpZGdldF8gICA9IGFkYXB0ZXJfLmdldFdpZGdldCggIkF4aXNNYXBwaW5nc1dpZGdldCIgKTsKLQl9Ci0JCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSAKLQl7Ci0JICByZXR1cm4gc2tlbENvbmZpZ1dpZGdldF87Ci0JfQotCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldCggSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIAotCXsKLQkgIHJldHVybiB3aWRnZXRDb250cmlidXRvciA9PSBza2VsQ29uZmlnV2lkZ2V0XyAmJiBza2VsV2lkZ2V0Xy5nZXRTaG93TWFwcGluZygpID8gbWFwcGluZ3NXaWRnZXRfIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIAotCXsKLQkgIGFkYXB0ZXJfLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBkYXRhUmVnaXN0cnkgKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi93c3J0L0F4aXNXZWJTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi93c3J0L0F4aXNXZWJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNzBmODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vd3NydC9BeGlzV2ViU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24ud3NydDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuQXhpc0RlcGxveUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkphdmEyV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkNoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5Db3B5QXhpc0phckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5SZWZyZXNoUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5BeGlzUnVuSW5wdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuQlVBeGlzSW5wdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuQlVBeGlzT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5jb21tYW5kLkphdmFUb1dTRExNZXRob2RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuVXBkYXRlV0VCWE1MQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrLkJVQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5MaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suTW92ZUphdmFGaWxlc1Rhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5URENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrLlVwZGF0ZUF4aXNXU0RERmlsZVRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuLkF4aXNCZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuLkJVQXhpc0RlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbi5WYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkJ1aWxkUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0UHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0Lk9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbi5XYWl0Rm9yQXV0b0J1aWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LkFic3RyYWN0V2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VJbmZvOwotCi1wdWJsaWMgY2xhc3MgQXhpc1dlYlNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2UKLXsKLQlwcml2YXRlIEF4aXNXZWJTZXJ2aWNlSW5mbyBheGlzV2ViU2VydmljZUluZm9fOwotCi0JcHVibGljIEF4aXNXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pCi0JewotCQlzdXBlcihpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LAotCQkJSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRlcGxveShFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpCi0JewotCQlyZWdpc3RlckRhdGFNYXBwaW5ncyggZW52LmdldENvbW1hbmRNYW5hZ2VyKCkuZ2V0TWFwcGluZ1JlZ2lzdHJ5KCkpOwotCQkKLQkJVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCQkKLS8vCQlpZiAoY3R4LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVApIHsKLQkJCQotCQkJY29tbWFuZHMuYWRkKG5ldyBCVUF4aXNJbnB1dENvbW1hbmQodGhpcywgbW9kdWxlKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IFZhbGlkYXRlT2JqZWN0U2VsZWN0aW9uQ29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQoKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IFdTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kKCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgSmF2YVRvV1NETE1ldGhvZENvbW1hbmQoKSk7Ci0JCQkvLyBjb21tYW5kcy5hZGQobmV3IFNpbXBsZUZyYWdtZW50KCAiQmVhbkNvbmZpZyIgKSk7Ci0JCQkvLyBjb21tYW5kcy5hZGQobmV3IFNpbXBsZUZyYWdtZW50KCAiQXhpc1NlcnZpY2VCZWFuTWFwcGluZyIgKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEJVQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzKCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrKCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBDb3B5QXhpc0phckNvbW1hbmQoKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrKCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBXYWl0Rm9yQXV0b0J1aWxkQ29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgSmF2YTJXU0RMQ29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBXU0RMMkphdmFDb21tYW5kKCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBNb3ZlSmF2YUZpbGVzVGFzaygpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgVXBkYXRlQXhpc1dTRERGaWxlVGFzaygpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgVXBkYXRlV0VCWE1MQ29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBCdWlsZFByb2plY3RDb21tYW5kKCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBTdGFydFByb2plY3RDb21tYW5kKCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBCVUF4aXNPdXRwdXRDb21tYW5kKHRoaXMpKTsKLQkJCQotLy8JCX0gZWxzZSBpZiAoY3R4LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTikgewotLy8JCQkKLS8vCQkJY29tbWFuZHMuYWRkKG5ldyBUZXN0Q29tbWFuZDEodGhpcykpOwotLy8JCQljb21tYW5kcy5hZGQobmV3IEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kKCkpOwotLy8JCSAgICBjb21tYW5kcy5hZGQobmV3IFZhbGlkYXRlV1NETENvbW1hbmQoKSk7Ci0vLwkJICAgIGNvbW1hbmRzLmFkZChuZXcgU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpKTsKLS8vLy8JCQljb21tYW5kcy5hZGQobmV3IFNpbXBsZUZyYWdtZW50KCAiU2tlbGV0b25Db25maWciICkpOwotLy8vLwkJCWNvbW1hbmRzLmFkZChuZXcgU2ltcGxlRnJhZ21lbnQoICJBeGlzTWFwcGluZ3NXaWRnZXQiICkpOwotLy8JCSAgICBjb21tYW5kcy5hZGQobmV3IFREQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzKCkpOwotLy8JCSAgICBjb21tYW5kcy5hZGQobmV3IEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrKCkpOwotLy8JCSAgICBjb21tYW5kcy5hZGQobmV3IENvcHlBeGlzSmFyQ29tbWFuZCgpKTsKLS8vCQkgICAgY29tbWFuZHMuYWRkKG5ldyBXU0RMMkphdmFDb21tYW5kKCkpOwotLy8JCSAgICBjb21tYW5kcy5hZGQobmV3IE1vdmVEZXBsb3ltZW50RmlsZXNUYXNrKCkpOwotLy8JCSAgICBjb21tYW5kcy5hZGQobmV3IFNrZWxldG9uMldTRExDb21tYW5kKCkpOwotLy8JCSAgICBjb21tYW5kcy5hZGQobmV3IFVwZGF0ZVdFQlhNTENvbW1hbmQoKSk7Ci0vLwkJICAgIGNvbW1hbmRzLmFkZChuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCkpOwotLy8JCSAgICBjb21tYW5kcy5hZGQobmV3IEJ1aWxkUHJvamVjdENvbW1hbmQoKSk7Ci0vLwkJICAgIGNvbW1hbmRzLmFkZChuZXcgU3RhcnRQcm9qZWN0Q29tbWFuZCgpKTsKLS8vCQkgICAgY29tbWFuZHMuYWRkKG5ldyBCdWlsZFByb2plY3RDb21tYW5kKCkpOwotLy8JCSAgICBjb21tYW5kcy5hZGQobmV3IEF4aXNEZXBsb3lDb21tYW5kKCkpOwotLy8JCSAgICBjb21tYW5kcy5hZGQobmV3IFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpKTsKLS8vCQkJY29tbWFuZHMuYWRkKG5ldyBDb21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQoKSk7Ci0vLwkJICAgIGNvbW1hbmRzLmFkZChuZXcgT3BlbkphdmFFZGl0b3JDb21tYW5kKCkpOwotLy8JCQkKLS8vCQl9IGVsc2UgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIC0gV2ViU2VydmljZVNjZW5hcmlvIHNob3VsZCBub3QgYmUgQ2xpZW50IGZvciBBeGlzV2ViU2VydmljZSIpOwotLy8JCX0KLQkJCi0JCQotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcikKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgcnVuKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpCi0JewotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgQXhpc1J1bklucHV0Q29tbWFuZCh0aGlzLCBtb2R1bGUpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzRGVwbG95Q29tbWFuZCgpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBSZWZyZXNoUHJvamVjdENvbW1hbmQoKSk7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5KSAKLQkgIHsKLQkJLy9CVUF4aXNJbnB1dENvbW1hbmQKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlU2VydmVyVHlwZUlEIiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0KLQkJCi0JICAgIC8vVmFsaWRhdGVPYmplY3RTZWxlY3Rpb25Db21tYW5kCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIk9iamVjdFNlbGVjdGlvbiIsIFZhbGlkYXRlT2JqZWN0U2VsZWN0aW9uQ29tbWFuZC5jbGFzcyk7Ci0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFZhbGlkYXRlT2JqZWN0U2VsZWN0aW9uQ29tbWFuZC5jbGFzcywiU2VydmljZVByb2plY3ROYW1lIiwgbnVsbCApOwotCSAgICAKLQkgICAgLy9CVUF4aXNEZWZhdWx0aW5nQ29tbWFuZAotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLS8vS1NDICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotCSAgICAKLQkgICAgLy9XU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZAotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkgICAgCi0JICAgIC8vQlVBeGlzQ29tbWFuZHMyIC0gdGhlc2UgcnVuIGFmdGVyIEJlYW5DbGFzc1dpZGdldAotCSAgICAvL0RlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQuY2xhc3MpOwotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFCZWFuTmFtZSIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlBhcnNlciIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkN1c3RvbWl6ZVNlcnZpY2VNYXBwaW5ncyIsIEF4aXNCZWFuRnJhZ21lbnQuTWFwcGluZ0ZyYWdtZW50LmNsYXNzKTsKLQkgICAgCi0JICAgIC8vSmF2YVdTRExNZXRob2RDb21tYW5kCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgSmF2YVRvV1NETE1ldGhvZENvbW1hbmQuY2xhc3MpOwotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQotCSAgICAvLyBCVUF4aXNDb21tYW5kczMgLSB0aGVzZSBydW4gYWZ0ZXIgQmVhbkNvbmZpZ1dpZGdldAotCSAgICAvL0xpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2sKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrLmNsYXNzKTsKLQkgICAgCi0JICAgIC8vQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzawotCSAgICAvL3JlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YVRvV1NETE1ldGhvZENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5jbGFzcyk7Ci0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2suY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkgICAgCi0JICAgIC8vQ29weUF4aXNKYXJDb21tYW5kCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIENvcHlBeGlzSmFyQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotCSAgICAKLQkgICAgLy9BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzawotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzay5jbGFzcywgIlByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotCSAgICAKLQkgICAgLy9KYXZhMldTRExDb21tYW5kCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YVRvV1NETE1ldGhvZENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgSmF2YTJXU0RMQ29tbWFuZC5jbGFzcyk7Ci0JICAgIAotCSAgICAvL1JlZnJlc2hQcm9qZWN0Q29tbWFuZAotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBSZWZyZXNoUHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkgICAgCi0JICAgIC8vV1NETDJKYXZhQ29tbWFuZAotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEphdmFUb1dTRExNZXRob2RDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MpOwotCSAgICAKLQotCSAgICAvL01vdmVKYXZhRmlsZXNUYXNrCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBNb3ZlSmF2YUZpbGVzVGFzay5jbGFzcyk7Ci0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIE1vdmVKYXZhRmlsZXNUYXNrLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotCSAgICAKLQkgICAgLy9VcGRhdGVBeGlzV1NEREZpbGVUYXNrCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoTW92ZUphdmFGaWxlc1Rhc2suY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgVXBkYXRlQXhpc1dTRERGaWxlVGFzay5jbGFzcyk7Ci0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFVwZGF0ZUF4aXNXU0RERmlsZVRhc2suY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0JICAgIAotCSAgICAvL1VwZGF0ZVdFQlhNTENvbW1hbmQKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgVXBkYXRlV0VCWE1MQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotCSAgICAKLQkgICAgLy9CdWlsZFByb2plY3RDb21tYW5kCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIEJ1aWxkUHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkZvcmNlQnVpbGQiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlZhbGlkYXRpb25NYW5hZ2VyIiwgQnVpbGRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0JICAgIAotCSAgICAvL1N0YXJ0UHJvamVjdENvbW1hbmQKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsgICAgCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0vL0tTQyAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlU2VydmVyVHlwZUlEIiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVTZXJ2ZXJUeXBlSUQiLCBTdGFydFByb2plY3RDb21tYW5kLmNsYXNzKTsKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlciIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MpOwotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2FtcGxlRXhpc3RpbmdTZXJ2ZXIiLCBTdGFydFByb2plY3RDb21tYW5kLmNsYXNzKTsKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIklzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQiLFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MpOwotCSAgICAgICAgCi0JCS8vIEJVQXhpc091dHB1dENvbW1hbmQKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhMldTRExDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIEJVQXhpc091dHB1dENvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKFVwZGF0ZUF4aXNXU0RERmlsZVRhc2suY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQlVBeGlzT3V0cHV0Q29tbWFuZC5jbGFzcyk7ICAgIAotCQkKLQkJLy8gUnVuIGV4dGVuc2lvbgotCQkKLQkgICAgLy9BeGlzRGVwbG95Q29tbWFuZAotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNSdW5JbnB1dENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQXhpc0RlcGxveUNvbW1hbmQuY2xhc3MpOwotCQkvL1JlZnJlc2hQcm9qZWN0Q29tbWFuZAotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNSdW5JbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgUmVmcmVzaFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0KLQkgICAgCi0JICAgIAotCSAgfQotCi0JcHVibGljIEF4aXNXZWJTZXJ2aWNlSW5mbyBnZXRBeGlzV2ViU2VydmljZUluZm8oKSB7Ci0JCXJldHVybiBheGlzV2ViU2VydmljZUluZm9fOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF4aXNXZWJTZXJ2aWNlSW5mbyhBeGlzV2ViU2VydmljZUluZm8gYXhpc1dlYlNlcnZpY2VJbmZvKSB7Ci0JCWF4aXNXZWJTZXJ2aWNlSW5mb18gPSBheGlzV2ViU2VydmljZUluZm87Ci0JfQotfQkKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vd3NydC9BeGlzV2ViU2VydmljZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3dzcnQvQXhpc1dlYlNlcnZpY2VJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMGFkNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vd3NydC9BeGlzV2ViU2VydmljZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzV2ViU2VydmljZUluZm8gewotCQotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbWV0ZXI7Ci0KLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbWV0ZXIoKSB7Ci0JCXJldHVybiBqYXZhV1NETFBhcmFtZXRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtZXRlcihKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtZXRlcikgewotCQl0aGlzLmphdmFXU0RMUGFyYW1ldGVyID0gamF2YVdTRExQYXJhbWV0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi93c3J0L0F4aXNXZWJTZXJ2aWNlUnVudGltZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vd3NydC9BeGlzV2ViU2VydmljZVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5NjdlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi93c3J0L0F4aXNXZWJTZXJ2aWNlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24ud3NydC5BeGlzV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VDbGllbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VJbmZvOwotCi1wdWJsaWMgY2xhc3MgQXhpc1dlYlNlcnZpY2VSdW50aW1lIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZQotewotCi0JcHVibGljIElXZWJTZXJ2aWNlIGdldFdlYlNlcnZpY2UoV2ViU2VydmljZUluZm8gaW5mbykKLQl7Ci0gICAgcmV0dXJuIG5ldyBBeGlzV2ViU2VydmljZShpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgSVdlYlNlcnZpY2VDbGllbnQgZ2V0V2ViU2VydmljZUNsaWVudChXZWJTZXJ2aWNlQ2xpZW50SW5mbyBpbmZvKQotCXsKLQkJcmV0dXJuIG5ldyBBeGlzV2ViU2VydmljZUNsaWVudChpbmZvKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MWMxOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13c2MtdWkuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2QyZThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MuZGlzY292ZXJ5LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LndzZGw8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXI8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUud3NpbDwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGIzYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXNvdXJjZS53c2MtdWkuamFyID0gc3JjLwotYmluLmluY2x1ZGVzID0gd3NjLXVpLmphcixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBkb2MvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICAgICAgc2NoZW1hLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY29uZmlnX2hhbmRsZXJfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2NvbmZpZ19oYW5kbGVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYTNhMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvY29uZmlnX2hhbmRsZXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9jb25maWd1cmVfaGFuZGxlcnMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L2NvbmZpZ3VyZV9oYW5kbGVycy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTNjODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L2NvbmZpZ3VyZV9oYW5kbGVycy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvZ2VuZXJhdGVkX3NhbXBsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvZ2VuZXJhdGVkX3NhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYmE1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L2dlbmVyYXRlZF9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2NsaWVudF93ZWJzZXJ2X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVlMDVmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvZHRvb2wvY29uZmlndXJlX2hhbmRsZXJzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvZHRvb2wvY29uZmlndXJlX2hhbmRsZXJzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2MGRkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2R0b29sL2NvbmZpZ3VyZV9oYW5kbGVycy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2R0b29sL2dlbmVyYXRlZF9zYW1wbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9kdG9vbC9nZW5lcmF0ZWRfc2FtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwZDM5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2R0b29sL2dlbmVyYXRlZF9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNjbGllbnRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YjdhMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNjbGllbnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2dlbl9zYW1wbGVfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2dlbl9zYW1wbGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3YWQ1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9nZW5fc2FtcGxlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9pbXBvcnRfd3MuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvaW1wb3J0X3dzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxZmU4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9pbXBvcnRfd3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvaW1wb3J0X3dzX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9pbXBvcnRfd3Nfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwNjFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9pbXBvcnRfd3Nfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3JlZ2lzdHJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3JlZ2lzdHJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0M2NhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9yZWdpc3RyeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zZXJ2ZXJzL2V4aXN0aW5nX3NlcnZlcl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2VydmVycy9leGlzdGluZ19zZXJ2ZXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiNmNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zZXJ2ZXJzL2V4aXN0aW5nX3NlcnZlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2VydmVycy9zZXJ2ZXJzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zZXJ2ZXJzL3NlcnZlcnNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiNmNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9zZXJ2ZXJzL3NlcnZlcnNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvaHRtbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL2h0bWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2U3ZGJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvaHRtbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL2ltcG9ydF93aXpfYmFubmVyX3dzaWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9pbXBvcnRfd2l6X2Jhbm5lcl93c2lsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiMzRiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL2ltcG9ydF93aXpfYmFubmVyX3dzaWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9pbXBvcnRfd3NpbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL2ltcG9ydF93c2lsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4YTk0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL2ltcG9ydF93c2lsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvd3NkbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL3dzZGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL3dzaWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC93c2lsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1OTE2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL3dzaWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NkMzczOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMgQ29uc3VtcHRpb24gR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotRkVBVFVSRV9ERVNDUklQVElPTj1XZWIgc2VydmljZXMKLQotWFBfUFVCTElDX1VERElfUkVHSVNUUllfVFlQRVM9UHVibGljIFVEREkgUmVnaXN0cnkgVHlwZXMKLVhQX1BSSVZBVEVfVURESV9SRUdJU1RSWV9UWVBFUz1Qcml2YXRlIFVEREkgUmVnaXN0cnkgVHlwZXMKLVhQX1dFQl9TRVJWSUNFX0NMSUVOVF9UWVBFUz1XZWIgU2VydmljZSBDbGllbnQgVHlwZXMKLVhQX1dFQl9TRVJWSUNFX1RFU1Q9V2ViIFNlcnZpY2UgVGVzdAotWFBfV0VCX1NFUlZJQ0VfU0VSVkVSX1JVTlRJTUVfVFlQRVM9V2ViIFNlcnZpY2UgU2VydmVyIFJ1bnRpbWUgVHlwZXMKLVhQX1dFQl9TRVJWSUNFX0NMSUVOVF9QUk9KRUNUX1RZUEU9Y2xpZW50UHJvamVjdFR5cGUKLVhQX09CSkVDVF9TRUxFQ1RJT05fV0lER0VUPW9iamVjdFNlbGVjdGlvbldpZGdldAotCi0jCi0jIFdpemFyZHMuCi0jCi1XSVpBUkRfVElUTEVfV1NDPVdlYiBTZXJ2aWNlIENsaWVudAotCi1QTFVHSU5fTkVXX1dJWkFSRF9OQU1FX1dTX0NMSUVOVD1XZWIgU2VydmljZSBDbGllbnQKLVBMVUdJTl9JTVBPUlRfV0laQVJEX05BTUVfV1M9V2ViIFNlcnZpY2UKLVBMVUdJTl9ORVdfV0laQVJEX0RFU0NfV1NfQ0xJRU5UPUFjY2VzcyBhbiBleGlzdGluZyBYTUwgd2ViIHNlcnZpY2UKLVBMVUdJTl9JTVBPUlRfV0laQVJEX0RFU0NfV1M9QSB3aXphcmQgZm9yIGltcG9ydGluZyBhIHdlYiBzZXJ2aWNlCi1JTVBPUlRfV0laQVJEX0RFU0NfV1NJTD1JbXBvcnQgV1NETCByZWZlcmVuY2VzIHRvIGEgV1NJTCBkb2N1bWVudAotCi0jCi0jIFdlYiBTYW1wbGVzIElEcwotIwotU0FNUExFX1RZUEVfV0VCU0VSVklDRVNfSUQ9V2ViIHNlcnZpY2Ugc2FtcGxlIEpTUHMKLQotIwotIyBQb3AtdXAgYWN0aW9ucwotIwotQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFk9R2VuZXJhdGUgQ2xpZW50Ci1BQ1RJT05fR0VOX1NBTVBMRT1HZW5lcmF0ZSBTYW1wbGUgSlNQcwotCi0jCi0jIERpYWxvZ3MKLSMKLUNIRUNLQk9YX1NIT1dfR0VORVJBVEVfSkFWQV9QUk9YWV9ESUFMT0c9SGlkZSBHZW5lcmF0ZSBKYXZhIGJlYW4gUHJveHkgRGlhbG9nCi1DSEVDS0JPWF9TSE9XX1BST1hZMlNBTVBMRV9ESUFMT0c9SGlkZSBQcm94eSBUbyBTYW1wbGUgR2VuZXJhdGlvbiBEaWFsb2cKLVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9XU0RMMlBST1hZPUhpZGUgdGhlIGRpYWxvZyBmb3IgZ2VuZXJhdGluZyB0aGUgSmF2YSBiZWFuIHByb3h5IGFjdGlvbi4KLVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9QUk9YWTJTQU1QTEU9SGlkZSB0aGUgZGlhbG9nIGZvciBnZW5lcmF0aW5nIHRoZSBzYW1wbGUgYXBwbGljYXRpb24gYWN0aW9uLgotCi0jCi0jICAgICAgIFdlYiBTZXJ2aWNlcyBQcmVmZXJhbmNlIFBhZ2VzCi0jCi0jIENhdGVnb3JpZXMKLQotUFJFRkVSRU5DRV9DQVRFR09SWV9TRVJWRVJfUlVOVElNRT1TZXJ2ZXIgYW5kIFJ1bnRpbWUKLVBSRUZFUkVOQ0VfQ0FURUdPUllfUFJPSkVDVF9UT1BPTE9HWT1Qcm9qZWN0IFRvcG9sb2d5Ci1QUkVGRVJFTkNFX0NBVEVHT1JZX1RFU1RfRkFDSUxJVFk9VGVzdCBGYWNpbGl0eSBEZWZhdWx0cwotUFJFRkVSRU5DRV9DQVRFR09SWV9ESUFMT0dTPVBvcHVwIERpYWxvZyBTZWxlY3Rpb24KLQotCi0jCi0jIFBvcC11cCBhY3Rpb25zCi0jCi1NRU5VX1JVTj0mUnVuCi0KLSMKLSMgV2ViU2VydmljZVRlc3RQYWdlCi0jCi1XU0VYUExPUkVSX0lEPVdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotCi0jCi0jIFdlYlNlcnZpY2VQdWJsaXNoUGFnZQotIwotVE9PTFRJUF9MQVVOQ0hfV1NfRVhQTE9SRVI9TGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIKLUNPTU1BTkRfTEFVTkNIX1dTX0VYUExPUkVSPUxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyCi0KLSMKLSMgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotIwotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX0lCTT1JQk0gVURESSBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX0lCTV9URVNUPUlCTSBVRERJIFRlc3QgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9NSUNST1NPRlQ9TWljcm9zb2Z0IFVEREkgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9NSUNST1NPRlRfVEVTVD1NaWNyb3NvZnQgVURESSBUZXN0IFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQPVNBUCBVRERJIFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQX1RFU1Q9U0FQIFVEREkgVGVzdCBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1hNRVRIT0RTPVhNZXRob2RzIFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTlRUQ09NTT1OVFQgQ29tbXVuaWNhdGlvbnMgUmVnaXN0cnkKLQotIwotIyBXU0lMIHByb3h5Ci0jCi1JTVBPUlRfV0laQVJEX05BTUVfV1NJTD1XU0lMCi1QT1BVUF9HRU5FUkFURV9XU0lMPUdlbmVyYXRlIFdTSUwKLQotIwotIyBXZWIgU2VydmljZSBTZXJ2ZXIgUnVudGltZSBUeXBlCi0jCi1XRUJTRVJWSUNFVFlQRV9OQU1FX1dTREw9U2tlbGV0b24gSmF2YSBiZWFuIFdlYiBTZXJ2aWNlCi1XRUJTRVJWSUNFVFlQRV9OQU1FX0pBVkE9SmF2YSBiZWFuIFdlYiBTZXJ2aWNlCi0KLSMKLSMgQ2xpZW50IHByb2plY3QgdHlwZQotIwotTEFCRUxfQ0xJRU5UX1RZUEVfV0VCPVdlYgotTEFCRUxfQ0xJRU5UX1RZUEVfRUpCPUVKQgotTEFCRUxfQ0xJRU5UX1RZUEVfQVBQX0NMSUVOVD1BcHBsaWNhdGlvbiBDbGllbnQKLUxBQkVMX0NMSUVOVF9UWVBFX0NPTlRBSU5FUkxFU1M9SmF2YQotCi0jCi0jIEhhbmRsZXJzIENvbmZpZ3VyYXRpb24gd2l6YXJkIHBhZ2UKLSMKLVBPUFVQX0FERF9IQU5ETEVSUz1Db25maWd1cmUgaGFuZGxlcnMKLUxBQkVMX0hBTkRMRVJTX0NPTkZJRz1Db25maWd1cmUgSGFuZGxlcnMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTA2MTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgbmFtZT0iJVBMVUdJTl9OQU1FIgotICAgcHJvdmlkZXItbmFtZT0iJVBMVUdJTl9QUk9WSURFUiIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ3c2MtdWkuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlIi8+Ci0gICAgICA8IS0tCi0gICAgICBTaG91bGQgbm90IG5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQsIGJ1dCBhYnNlbmNlIGNhdXNlcwotICAgICAgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kIHRvIGZhaWwgdG8gY29tcGlsZSBkdWUgdG8KLSAgICAgIG1pc3NpbmcgaW5kaXJlY3QgZGVwZW5kZW5jeSBvbgotICAgICAgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uV29ya2luZ0NvcHlQcm92aWRlcgotICAgICAgLS0+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmV4cGxvcmVyIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtIi8+Ci0JICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS53c2lsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQud2ViYnJvd3NlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlcy51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZGVwZW5kZW5jeWNoZWNrZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDwhLS0gVGhpcmQgcGFydHkgZmlsZSBkZXBlbmRlbmNpZXMgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmRlcGVuZGVuY3ljaGVja2VyLmRlcGVuZGVuY2llcyI+Ci0gICAgICA8ZGVwZW5kZW5jeSBkZXNjcmlwdGlvbj0iJUZFQVRVUkVfREVTQ1JJUFRJT04iPgotICAgICAgICAgPHJlcXVpcmVkUGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLmF4aXMiLz4KLSAgICAgICAgIDxyZXF1aXJlZFBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS53c2lsIi8+Ci0gICAgICAgICA8cmVxdWlyZWRQbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53cy51ZGRpNGoiLz4KLSAgICAgICAgIDxyZXF1aXJlZFBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgICAgIDwvZGVwZW5kZW5jeT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICBpZD0icHVibGljVURESVJlZ2lzdHJ5VHlwZSIKLSAgICAgIG5hbWU9IiVYUF9QVUJMSUNfVURESV9SRUdJU1RSWV9UWVBFUyIvPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICBpZD0icHJpdmF0ZVVERElSZWdpc3RyeVR5cGUiCi0gICAgICBuYW1lPSIlWFBfUFJJVkFURV9VRERJX1JFR0lTVFJZX1RZUEVTIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJ3ZWJTZXJ2aWNlQ2xpZW50VHlwZSIKLSAgICAgIG5hbWU9IiVYUF9XRUJfU0VSVklDRV9DTElFTlRfVFlQRVMiCi0gICAgICBzY2hlbWE9InNjaGVtYS93ZWJTZXJ2aWNlQ2xpZW50VHlwZS5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJ3ZWJTZXJ2aWNlVGVzdCIKLSAgICAgIG5hbWU9IiVYUF9XRUJfU0VSVklDRV9URVNUIgotICAgICAgc2NoZW1hPSJzY2hlbWEvd2ViU2VydmljZVRlc3QuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICBpZD0id2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIgotICAgICAgbmFtZT0iJVhQX1dFQl9TRVJWSUNFX1NFUlZFUl9SVU5USU1FX1RZUEVTIgotICAgICAgc2NoZW1hPSJzY2hlbWEvd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9ImNsaWVudFByb2plY3RUeXBlIgotICAgICAgbmFtZT0iJVhQX1dFQl9TRVJWSUNFX0NMSUVOVF9QUk9KRUNUX1RZUEUiCi0gICAgICBzY2hlbWE9InNjaGVtYS9jbGllbnRQcm9qZWN0VHlwZS5leHNkIi8+ICAgCi0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJvYmplY3RTZWxlY3Rpb25XaWRnZXQiCi0gICAgICBuYW1lPSIlWFBfT0JKRUNUX1NFTEVDVElPTl9XSURHRVQiCi0gICAgICBzY2hlbWE9InNjaGVtYS9vYmplY3RTZWxlY3Rpb25XaWRnZXQuZXhzZCIvPgotCi0KLSAgIDwhLS0gVGhpcmQgcGFydHkgZmlsZSBkZXBlbmRlbmNpZXMgLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmRlcGVuZGVuY3ljaGVja2VyLmRlcGVuZGVuY2llcyI+Ci0gICAgIDxkZXBlbmRlbmN5IGRlc2NyaXB0aW9uPSIlRkVBVFVSRV9ERVNDUklQVElPTiI+Ci0gICAgICAgPHJlcXVpcmVkUGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLmF4aXMiLz4KLSAgICAgICA8cmVxdWlyZWRQbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUud3NpbCIvPgotICAgICAgIDxyZXF1aXJlZFBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLnVkZGk0aiIvPgotICAgICAgIDxyZXF1aXJlZFBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgICAgPC9kZXBlbmRlbmN5PgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0gVURESSBSZWdpc3RyeSBUeXBlcyAtLT4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5wdWJsaWNVRERJUmVnaXN0cnlUeXBlIj4KLSAgICAgIDxwdWJsaWNVRERJUmVnaXN0cnlUeXBlCi0gICAgICAgICAgICBuYW1lPSIlUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX0lCTV9URVNUIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlJQk1UZXN0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlJQk1UZXN0Ij4KLSAgICAgIDwvcHVibGljVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnB1YmxpY1VERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfSUJNIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlJQk0iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeUlCTSI+Ci0gICAgICA8L3B1YmxpY1VERElSZWdpc3RyeVR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5wdWJsaWNVRERJUmVnaXN0cnlUeXBlIj4KLSAgICAgIDxwdWJsaWNVRERJUmVnaXN0cnlUeXBlCi0gICAgICAgICAgICBuYW1lPSIlUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX01JQ1JPU09GVF9URVNUIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnRUZXN0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnRUZXN0Ij4KLSAgICAgIDwvcHVibGljVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnB1YmxpY1VERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTUlDUk9TT0ZUIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdCI+Ci0gICAgICA8L3B1YmxpY1VERElSZWdpc3RyeVR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5wdWJsaWNVRERJUmVnaXN0cnlUeXBlIj4KLSAgICAgIDxwdWJsaWNVRERJUmVnaXN0cnlUeXBlCi0gICAgICAgICAgICBuYW1lPSIlUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUF9URVNUIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlTQVBUZXN0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlTQVBUZXN0Ij4KLSAgICAgIDwvcHVibGljVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnB1YmxpY1VERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlTQVAiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeVNBUCI+Ci0gICAgICA8L3B1YmxpY1VERElSZWdpc3RyeVR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5wdWJsaWNVRERJUmVnaXN0cnlUeXBlIj4KLSAgICAgIDxwdWJsaWNVRERJUmVnaXN0cnlUeXBlCi0gICAgICAgICAgICBuYW1lPSIlUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1hNRVRIT0RTIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlYTWV0aG9kcyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5WE1ldGhvZHMiPgotICAgICAgPC9wdWJsaWNVRERJUmVnaXN0cnlUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucHVibGljVURESVJlZ2lzdHJ5VHlwZSI+Ci0gICAgICA8cHVibGljVURESVJlZ2lzdHJ5VHlwZQotICAgICAgICAgICAgbmFtZT0iJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9OVFRDT01NIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlOVFRDb21tIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlOVFRDb21tIj4KLSAgICAgIDwvcHVibGljVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIFRlc3QgRmFjaWxpdGllcyAtLT4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlVGVzdCI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlVGVzdAotICAgICAgICAgICAgbWV0aG9kc25lZWRlZD0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVTQU1QTEVfVFlQRV9XRUJTRVJWSUNFU19JRCIKLSAgICAgICAgICAgIGphdmE9InRydWUiCi0gICAgICAgICAgICBjb2RlZ2VuPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Qud3NzYW1wbGUuV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LldlYlNlcnZpY2VTYW1wbGVUZXN0Ij4KLSAgICAgIDwvd2ViU2VydmljZVRlc3Q+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlVGVzdAotICAgICAgICAgICAgbWV0aG9kc25lZWRlZD0iZmFsc2UiCi0gICAgICAgICAgICBuYW1lPSIlV1NFWFBMT1JFUl9JRCIKLSAgICAgICAgICAgIGphdmE9ImZhbHNlIgotICAgICAgICAgICAgY29kZWdlbj0iZmFsc2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5leHBsb3Jlci5XZWJTZXJ2aWNlRXhwbG9yZXJFeGVjdXRhYmxlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuZXhwbG9yZXIuV2ViU2VydmljZUV4cGxvcmVyRXhlY3V0YWJsZSI+Ci0gICAgICA8L3dlYlNlcnZpY2VUZXN0PgotCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBKYXZhIEJlYW5zIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlVHlwZQotICAgICAgICAgICAgbGFiZWw9IiVXRUJTRVJWSUNFVFlQRV9OQU1FX0pBVkEiCi0gICAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhZGF0YT0iRmlsZSBJUmVzb3VyY2UgQ29tcGlsYXRpb25Vbml0IgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii5qYXZhIC5jbGFzcyIKLSAgICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkphdmFCZWFuU2VsZWN0aW9uV2lkZ2V0IgotICAgICAgICAgICAgaW5jbHVkZU5hdHVyZXM9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiCi0gICAgICAgICAgICBleGNsdWRlTmF0dXJlcz0iIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLmphdmEiPgotICAgICAgPC93ZWJTZXJ2aWNlVHlwZT4KLQotICAgICAgPHdlYlNlcnZpY2VUeXBlCi0gICAgICAgICAgICBsYWJlbD0iJVdFQlNFUlZJQ0VUWVBFX05BTUVfV1NETCIKLSAgICAgICAgICAgIHJlc291cmNlVHlwZU1ldGFkYXRhPSJGaWxlIElSZXNvdXJjZSBTdHJpbmcgU2VydmljZUltcGwgU2VydmljZVJlZkltcGwgV1NETFJlc291cmNlSW1wbCIKLSAgICAgICAgICAgIGV4dGVuc2lvbk1ldGFkYXRhPSIud3NkbCAud3NpbCAuaHRtbCAuU2VydmljZUltcGwgLlNlcnZpY2VSZWZJbXBsIC5XU0RMUmVzb3VyY2VJbXBsIgotICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0PSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIGluY2x1ZGVOYXR1cmVzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIgotICAgICAgICAgICAgZXhjbHVkZU5hdHVyZXM9IiIgICAgICAgICAgICAKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS53c2RsIj4KLSAgICAgIDwvd2ViU2VydmljZVR5cGU+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIER5bmFtaWMgV2l6YXJkcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfV0laQVJEX05BTUVfV1NfQ0xJRU5UIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld2NsaWVudF93ZWJzZXJ2X3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlUExVR0lOX05FV19XSVpBUkRfREVTQ19XU19DTElFTlQKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc2NsaWVudF93aXouZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuQ2xpZW50V2lkZ2V0QmluZGluZyIKLSAgICAgICAgICAgIHRpdGxlPSIlV0laQVJEX1RJVExFX1dTQyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgPC9keW5hbWljV2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCI+Ci0gICAgICA8ZHluYW1pY1dpemFyZAotICAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvZ2VuX3NhbXBsZV93aXouZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuR2VuU2FtcGxlV2lkZ2V0QmluZGluZyIKLSAgICAgICAgICAgIHRpdGxlPSIlV0laQVJEX1RJVExFX1dTQyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW5zYW1wbGV3aXphcmQiPgotICAgICAgPC9keW5hbWljV2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCI+Ci0gICAgICA8ZHluYW1pY1dpemFyZAotICAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvY29uZmlnX2hhbmRsZXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nLkNvbmZpZ1NlcnZpY2VIYW5kbGVyc1dpZGdldEJpbmRpbmciCi0gICAgICAgICAgICB0aXRsZT0iJUxBQkVMX0hBTkRMRVJTX0NPTkZJRyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLnNlcnZpY2UiPgotICAgICAgPC9keW5hbWljV2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCI+Ci0gICAgICA8ZHluYW1pY1dpemFyZAotICAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvY29uZmlnX2hhbmRsZXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nLkNvbmZpZ0NsaWVudEhhbmRsZXJzV2lkZ2V0QmluZGluZyIKLSAgICAgICAgICAgIHRpdGxlPSIlTEFCRUxfSEFORExFUlNfQ09ORklHIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuY2xpZW50Ij4KLSAgICAgIDwvZHluYW1pY1dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiPgotICAgICAgPGR5bmFtaWNXaXphcmQKLSAgICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2NvbmZpZ19oYW5kbGVyX3dpei5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZy5Db25maWd1cmVIYW5kbGVyc1dpZGdldEJpbmRpbmciCi0gICAgICAgICAgICB0aXRsZT0iJUxBQkVMX0hBTkRMRVJTX0NPTkZJRyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzIj4KLSAgICAgIDwvZHluYW1pY1dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPiAgIAotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX0lNUE9SVF9XSVpBUkRfTkFNRV9XUyIKLSAgICAgICAgICAgIGljb249Imljb25zL2ltcG9ydF93cy5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZCIKLSAgICAgICAgICAgIGlkPSJ3c2ltcG9ydCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlUExVR0lOX0lNUE9SVF9XSVpBUkRfREVTQ19XUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCI+Ci0gICAgICA8ZHluYW1pY1dpemFyZAotICAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvaW1wb3J0X3dzX3dpei5naWYiCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX0lNUE9SVF9XSVpBUkRfTkFNRV9XUyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nLkltcG9ydFdTV2lkZ2V0QmluZGluZyIKLSAgICAgICAgICAgIGlkPSJ3c2ltcG9ydCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJUlNUE9SVF9XSVpBUkRfTkFNRV9XU0lMIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvd3NpbC9pbXBvcnRfd3NpbC5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZCIKLSAgICAgICAgICAgIGlkPSJ3c2lsaW1wb3J0Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVJTVBPUlRfV0laQVJEX0RFU0NfV1NJTAotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCI+Ci0gICAgICA8ZHluYW1pY1dpemFyZAotICAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvd3NpbC9pbXBvcnRfd2l6X2Jhbm5lcl93c2lsLmdpZiIKLSAgICAgICAgICAgIG5hbWU9IiVJTVBPUlRfV0laQVJEX05BTUVfV1NJTCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nLkltcG9ydFdTSUxXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgaWQ9IndzaWxpbXBvcnQiPgotICAgICAgPC9keW5hbWljV2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gUHJlZmVyZW5jZSBQYWdlcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9TRVJWRVJfUlVOVElNRSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXMuU2VydmVyUnVudGltZVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5TZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UiPiAgICAgICAgICAgIAotICAgICAgPC9wYWdlPgotICAgICAgCi0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfRElBTE9HUyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkucHJlZmVyZW5jZXMuQWN0aW9uRGlhbG9nc1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiPgotICAgICAgPC9wYWdlPgotCi0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfVEVTVF9GQUNJTElUWSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuU2NlbmFyaW9EZWZhdWx0c1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UiPgotICAgICAgPC9wYWdlPgotCi0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfUFJPSkVDVF9UT1BPTE9HWSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuUHJvamVjdFRvcG9sb2d5UHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLlByb2plY3RUb3BvbG9neVByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIAotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gTWFpbiBNZW51IEFjdGlvbnMgLS0+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotCi0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBsYWJlbD0iJUNPTU1BTkRfTEFVTkNIX1dTX0VYUExPUkVSIgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGxhYmVsPSIlTUVOVV9SVU4iCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucnVuIj4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZXhwbG9yZXIiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUNPTU1BTkRfTEFVTkNIX1dTX0VYUExPUkVSIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvcmVnaXN0cnkuZ2lmIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJVRPT0xUSVBfTEFVTkNIX1dTX0VYUExPUkVSIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5hY3Rpb24uTGF1bmNoV1NFQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLnJ1bi9leHBsb3JlciIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbi5MYXVuY2hXU0VBY3Rpb24iPgotICAgICAgICA8L2FjdGlvbj4KLSAgICAgPC9hY3Rpb25TZXQ+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tICJEb24ndCBTaG93IE1lIiBFeHRlbnNpb25zIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIj4KLQotICAgICAgPGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBzaG93Y2hlY2tib3g9InRydWUiCi0gICAgICAgICAgICBuYW1lPSIlQ0hFQ0tCT1hfU0hPV19HRU5FUkFURV9KQVZBX1BST1hZX0RJQUxPRyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3NzLnBvcHVwLmNhdGVnb3J5IgotICAgICAgICAgICAgdG9vbHRpcD0iJVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9XU0RMMlBST1hZIgotICAgICAgICAgICAgaW5mb3BvcD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLlBQQUQwMDA0IgotICAgICAgICAgICAgYWx3YXlzaGlkZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgIDwvYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGU+Ci0KLSAgICAgIDxhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZQotICAgICAgICAgICAgbmFtZT0iJUNIRUNLQk9YX1NIT1dfUFJPWFkyU0FNUExFX0RJQUxPRyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3NzLnBvcHVwLmNhdGVnb3J5IgotICAgICAgICAgICAgdG9vbHRpcD0iJVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9QUk9YWTJTQU1QTEUiCi0gICAgICAgICAgICBpbmZvcG9wPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuUFBBRDAwMDUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vuc2FtcGxld2l6YXJkIj4KLSAgICAgIDwvYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGU+Ci0KLSAgICAgIDxhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZQotICAgICAgICAgICAgc2hvd2NoZWNrYm94PSJmYWxzZSIKLSAgICAgICAgICAgIGFsd2F5c2hpZGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbndzaWwiPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgICAgPGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBzaG93Y2hlY2tib3g9ImZhbHNlIgotICAgICAgICAgICAgYWx3YXlzaGlkZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gUG9wdXBzIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW53c2lsIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfR0VORVJBVEVfV1NJTCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0id3NpbGltcG9ydCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzZGwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFkiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzaWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFkiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLmphdmEiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vuc2FtcGxld2l6YXJkIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTl9TQU1QTEUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbnNhbXBsZXdpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0IgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5qYXZhIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbnNhbXBsZXdpemFyZCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5fU0FNUExFIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW5zYW1wbGV3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1BST1hZIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW53c2lsIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfR0VORVJBVEVfV1NJTCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9IndzaWxpbXBvcnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0id2Vic2VydmljZXMueG1sIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuZWRpdG9yIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfQUREX0hBTkRMRVJTIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLnNlcnZpY2UiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuZWRpdG9yIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfQUREX0hBTkRMRVJTIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5zZXJ2aWNlIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgCi0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLldlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPHZpc2liaWxpdHk+Ci0JCQk8b2JqZWN0U3RhdGUKLSAgICAgICAgICAgICAgICAgIG5hbWU9InR5cGUiCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0iSGFuZGxlcnMiPgotICAgICAgICAgICAgPC9vYmplY3RTdGF0ZT4KLSAgICAgICAgIDwvdmlzaWJpbGl0eT4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgICAgCi0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGwiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuZWRpdG9yIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfQUREX0hBTkRMRVJTIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5zZXJ2aWNlIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAgICAgICAgCi0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IndlYnNlcnZpY2VzY2xpZW50LnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0FERF9IQU5ETEVSUyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5jbGllbnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iZWpiLWphci54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuY2xpZW50Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgIAotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSJ3ZWIueG1sIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuZWRpdG9yIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfQUREX0hBTkRMRVJTIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmNsaWVudCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgCi0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9ImFwcGxpY2F0aW9uLWNsaWVudC54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuY2xpZW50Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+IAotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0FERF9IQU5ETEVSUyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuY2xpZW50Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAgCi0gICAgICAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGwiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1BST1hZIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1BST1hZIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGwiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbndzaWwiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9HRU5FUkFURV9XU0lMIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0id3NpbGltcG9ydCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIgotICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW53c2lsIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfR0VORVJBVEVfV1NJTCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgaWQ9IndzaWxpbXBvcnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gQ2xpZW50IFByb2plY3QgVHlwZXMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUiPgotICAgICAgPGNsaWVudFByb2plY3RUeXBlCi0gICAgICAgICAgICBpbmNsdWRlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIgotICAgICAgICAgICAgZXhjbHVkZT0iIgotICAgICAgICAgICAgbGFiZWw9IiVMQUJFTF9DTElFTlRfVFlQRV9XRUIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLldlYiI+Ci0gICAgICA8L2NsaWVudFByb2plY3RUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUiPgotICAgICAgPGNsaWVudFByb2plY3RUeXBlCi0gICAgICAgICAgICBpbmNsdWRlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIgotICAgICAgICAgICAgZXhjbHVkZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTmF0dXJlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLkFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlIgotICAgICAgICAgICAgbGFiZWw9IiVMQUJFTF9DTElFTlRfVFlQRV9DT05UQUlORVJMRVNTIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5Db250YWluZXJsZXNzIj4KLSAgICAgIDwvY2xpZW50UHJvamVjdFR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZSI+Ci0gICAgICA8Y2xpZW50UHJvamVjdFR5cGUKLSAgICAgICAgICAgIGluY2x1ZGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUiCi0gICAgICAgICAgICBleGNsdWRlPSIiCi0gICAgICAgICAgICBsYWJlbD0iJUxBQkVMX0NMSUVOVF9UWVBFX0VKQiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuRUpCIj4KLSAgICAgIDwvY2xpZW50UHJvamVjdFR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZSI+Ci0gICAgICA8Y2xpZW50UHJvamVjdFR5cGUKLSAgICAgICAgICAgIGluY2x1ZGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlIgotICAgICAgICAgICAgZXhjbHVkZT0iIgotICAgICAgICAgICAgbGFiZWw9IiVMQUJFTF9DTElFTlRfVFlQRV9BUFBfQ0xJRU5UIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5BcHBDbGllbnQiPgotICAgICAgPC9jbGllbnRQcm9qZWN0VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIE9iamVjdCBTZWxlY3Rpb24gV2lkZ2V0cyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5vYmplY3RTZWxlY3Rpb25XaWRnZXQiPgotICAgICAgPG9iamVjdFNlbGVjdGlvbldpZGdldAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5KYXZhQmVhblNlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSmF2YUJlYW5TZWxlY3Rpb25UcmFuc2Zvcm1lciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSmF2YUJlYW5TZWxlY3Rpb25XaWRnZXQiPgotICAgICAgPC9vYmplY3RTZWxlY3Rpb25XaWRnZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5vYmplY3RTZWxlY3Rpb25XaWRnZXQiPgotICAgICAgPG9iamVjdFNlbGVjdGlvbldpZGdldAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5FSkJTZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkVKQlNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8L29iamVjdFNlbGVjdGlvbldpZGdldD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLm9iamVjdFNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8b2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LldTRExTZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICB0cmFuc2Zvcm1lcj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LldTRExTZWxlY3Rpb25UcmFuc2Zvcm1lciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8L29iamVjdFNlbGVjdGlvbldpZGdldD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tIE5ldyBleHRlbnNpb24gcG9pbnRzIGZvciBXVFAgTTQgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkaXNjb3ZlcnkiIG5hbWU9IlVJIEJyb3dzZXJzIGZvciBpbXBsZW1lbnRhdGlvbiBhcnRpZmFjdHMiLz4gICAgICAKLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndzSW1wbCIgbmFtZT0iV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ3c0NsaWVudEltcGwiIG5hbWU9IldlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbnMiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlcnZpY2VUeXBlIiBuYW1lPSJFeHRlbnNpb25zIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29tYmluYXRpb25zIG9mIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zLCBzY2VuYXJpb3MsIGFuZCBtb2R1bGUgdHlwZXMgIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjbGllbnRUeXBlIiBuYW1lPSJFeHRlbnNpb25zIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29tYmluYXRpb25zIG9mIGNsaWVudCBpbXBsZW1lbnRhdGlvbnMgYW5kIG1vZHVsZSB0eXBlcyIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id2ViU2VydmljZVJ1bnRpbWUiIG5hbWU9IldlYiBzZXJ2aWNlIHJ1bnRpbWVzIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ0ZXN0ZXIiIG5hbWU9IldlYiBzZXJ2aWNlIHRlc3QgZmFjaWxpdGllcyIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icHVibGlzaGVyIiBuYW1lPSJXZWIgc2VydmljZSBwdWJsaWNhdGlvbiBmYWNpbGl0aWVzIi8+ICAgICAgCi0KLTwhLS0gTTQgRXh0ZW5zaW9ucyB0byB0aGUgbmV3IGV4dGVuc2lvbiBwb2ludHMgLS0+Ci08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud3NJbXBsIj4KLSAgPHdlYlNlcnZpY2VJbXBsCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLndzSW1wbC5qYXZhIgotICAgICAgICAgICAgbGFiZWw9IiVXRUJTRVJWSUNFVFlQRV9OQU1FX0pBVkEiCi0gICAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhZGF0YT0iRmlsZSBJUmVzb3VyY2UgQ29tcGlsYXRpb25Vbml0IgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii5qYXZhIC5jbGFzcyI+Ci0gIDwvd2ViU2VydmljZUltcGw+Ci08L2V4dGVuc2lvbj4gICAKLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53c0NsaWVudEltcGwiPgotICA8d2ViU2VydmljZUNsaWVudEltcGwKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3Mud3NDbGllbnRJbXBsLmphdmEiCi0gICAgICAgICAgICBsYWJlbD0iSmF2YSBQcm94eSI+Ci0gIDwvd2ViU2VydmljZUNsaWVudEltcGw+Ci08L2V4dGVuc2lvbj4gICAKLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5zZXJ2aWNlVHlwZSI+Ci0gIDxzZXJ2aWNlVHlwZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5zZXJ2aWNlVHlwZS5qYXZhIgotICAgICAgICAgICAgaW1wbElkPSJvcmcuZWNsaXBzZS5qc3Qud3Mud3NJbXBsLmphdmEiCi0gICAgICAgICAgICBidU1vZHVsZVR5cGVzSW5jbHVkZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSIKLSAgICAgICAgICAgIGJ1TW9kdWxlVHlwZXNFeGNsdWRlPSIiCi0gICAgICAgICAgICB0ZE1vZHVsZVR5cGVzSW5jbHVkZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSIKLSAgICAgICAgICAgIHRkTW9kdWxlVHlwZXNFeGNsdWRlPSIiCi0gICAgICAgICAgICB3ZWJTZXJ2aWNlVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS5qYXZhIj4KLSAgPC9zZXJ2aWNlVHlwZT4KLTwvZXh0ZW5zaW9uPiAgIAotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnNlcnZpY2VUeXBlIj4KLSAgPHNlcnZpY2VUeXBlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnNlcnZpY2VUeXBlLndzZGwiCi0gICAgICAgICAgICBpbXBsSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy53c0ltcGwuamF2YSIKLSAgICAgICAgICAgIGJ1TW9kdWxlVHlwZXNJbmNsdWRlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIgotICAgICAgICAgICAgYnVNb2R1bGVUeXBlc0V4Y2x1ZGU9IiIKLSAgICAgICAgICAgIHRkTW9kdWxlVHlwZXNJbmNsdWRlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIgotICAgICAgICAgICAgdGRNb2R1bGVUeXBlc0V4Y2x1ZGU9IiIKLSAgICAgICAgICAgIHdlYlNlcnZpY2VUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLndzZGwiPgotICA8L3NlcnZpY2VUeXBlPgotPC9leHRlbnNpb24+Ci08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50VHlwZSI+Ci0gIDxjbGllbnRUeXBlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNsaWVudFR5cGUuamF2YS53ZWJPbmx5IgotICAgICAgICAgICAgaW1wbElkPSJvcmcuZWNsaXBzZS5qc3Qud3Mud3NDbGllbnRJbXBsLmphdmEiCi0gICAgICAgICAgICBtb2R1bGVUeXBlc0luY2x1ZGU9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5XZWIiCi0JCQltb2R1bGVUeXBlc0V4Y2x1ZGU9IiIKLSAgICAgICAgICAgIHdlYlNlcnZpY2VDbGllbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIj4KLSAgPC9jbGllbnRUeXBlPgotPC9leHRlbnNpb24+Ci08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2ViU2VydmljZVJ1bnRpbWUiPgotICA8d2ViU2VydmljZVJ1bnRpbWUKLSAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmR1bW15UlQiCi0gICAgbGFiZWw9IkR1bW15IgotICAgIHNlcnZpY2VUeXBlcz0ib3JnLmVjbGlwc2UuanN0LndzLnNlcnZpY2VUeXBlLmphdmEgb3JnLmVjbGlwc2UuanN0LndzLnNlcnZpY2VUeXBlLndzZGwiCi0gICAgY2xpZW50VHlwZXM9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnRUeXBlLmphdmEud2ViT25seSIKLSAgICBzZXJ2bGV0TGV2ZWxzPSIyMyAyNCIKLSAgICBqMmVlTGV2ZWxzPSIxMyAxNCIKLSAgICBzZXJ2ZXJzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmR1bW15LkR1bW15V2ViU2VydmljZVJ1bnRpbWUiPgotICA8L3dlYlNlcnZpY2VSdW50aW1lPgotPC9leHRlbnNpb24+ICAgCi0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlUnVudGltZSI+Ci0gIDx3ZWJTZXJ2aWNlUnVudGltZQotICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYmFybmV5UlQiCi0gICAgbGFiZWw9IkJhcm5leSBSdWJibGUiCi0gICAgc2VydmljZVR5cGVzPSJvcmcuZWNsaXBzZS5qc3Qud3Muc2VydmljZVR5cGUuamF2YSIKLSAgICBjbGllbnRUeXBlcz0ib3JnLmVjbGlwc2UuanN0LndzLmNsaWVudFR5cGUuamF2YS53ZWJPbmx5IgotICAgIHNlcnZsZXRMZXZlbHM9IjI0IgotICAgIGoyZWVMZXZlbHM9IjE0IgotICAgIHNlcnZlcnM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYmFybmV5LkJhcm5leVdlYlNlcnZpY2VSdW50aW1lIj4KLSAgPC93ZWJTZXJ2aWNlUnVudGltZT4KLTwvZXh0ZW5zaW9uPiAgIAotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeSAgIAotICAgICAgICAgICAgIGlkPSJEdW1teUlkMSIKLSAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kdW1teS5EdW1teVdlYlNlcnZpY2UkVGVzdENvbW1hbmQzIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZHVtbXkuRHVtbXlXaWRnZXRGYWN0b3J5MiIvPgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkgICAKLSAgICAgICAgICAgICBpZD0iRHVtbXlJZDIiCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZHVtbXkuRHVtbXlXZWJTZXJ2aWNlJFRlc3RDb21tYW5kMiIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmR1bW15LkR1bW15V2lkZ2V0RmFjdG9yeSIvPgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkgICAKLSAgICAgICAgICAgICBpZD0iRHVtbXlJZDMiCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZHVtbXkuRHVtbXlXZWJTZXJ2aWNlQ2xpZW50JFRlc3RDb21tYW5kNCIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmR1bW15LkR1bW15V2lkZ2V0RmFjdG9yeTIiLz4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgIDx3aWRnZXRGYWN0b3J5ICAgCi0gICAgICAgICAgICAgaWQ9IkR1bW15SWQ0IgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmR1bW15LkR1bW15V2ViU2VydmljZUNsaWVudCRUZXN0Q29tbWFuZDUiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kdW1teS5EdW1teVdpZGdldEZhY3RvcnkiLz4KLSAgICA8L2V4dGVuc2lvbj4gICAgICAgIAotICAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkgICAKLSAgICAgICAgICAgICBpZD0iQmFybmV5SWQxIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmJhcm5leS5CYXJuZXlXZWJTZXJ2aWNlJFRlc3RDb21tYW5kMSIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmJhcm5leS5CYXJuZXlXaWRnZXRGYWN0b3J5Ii8+Ci0gICAgPC9leHRlbnNpb24+IAotICAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkgICAKLSAgICAgICAgICAgICBpZD0iQmFybmV5SWQyIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmJhcm5leS5CYXJuZXlXZWJTZXJ2aWNlJFRlc3RDb21tYW5kNiIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmJhcm5leS5CYXJuZXlXaWRnZXRGYWN0b3J5MiIvPgotICAgIDwvZXh0ZW5zaW9uPiAgICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS9jbGllbnRQcm9qZWN0VHlwZS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL2NsaWVudFByb2plY3RUeXBlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OTUyMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL2NsaWVudFByb2plY3RUeXBlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiIGlkPSJjbGllbnRQcm9qZWN0VHlwZSIgbmFtZT0iY2xpZW50UHJvamVjdFR5cGUiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVzIGNsaWVudCBjb250YWluZXIgdHlwZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNsaWVudFByb2plY3RUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcG9pbnQgYXR0cmlidXRlIHN0cmluZyBtdXN0IGJlIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2xpZW50UHJvamVjdFR5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIGEgYmxhbmsgZGVsaW1pdGVkIGxpc3Qgb2YgUHJvamVjdCBOYXR1cmUgSWRzLiAgVGhlIGxpc3RlZCBJRHMgaW5kaWNhdGUgdGhhdCB0aGlzIHR5cGUgb25seSB3b3JrcyB3aXRoIHRoZXNlIHBhcnRpY3VsYXIgcHJvamVjdCB0eXBlcy4gIEZvciBleGFtcGxlLCBpZiB0aGlzIHR5cGUgb25seSB3b3JrcyB3aXRoIHdlYiBwcm9qZWN0cyBhbiBJRCBvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIHdvdWxkIGJlIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIGEgYmxhbmsgZGVsaW1pdGVkIGxpc3Qgb2YgUHJvamVjdCBOYXR1cmUgSWRzLiAgVGhlIGxpc3RlZCBJRHMgaW5kaWNhdGUgdGhhdCB0aGlzIHR5cGUgRE9FUyBOT1Qgd29yayB3aXRoIHRoZXNlIHBhcnRpY3VsYXIgcHJvamVjdCB0eXBlcy4gIEZvciBleGFtcGxlLCBpZiB0aGlzIHR5cGUgZG9lcyBub3Qgd29yayB3aXRoIHdlYiBwcm9qZWN0cyBhbiBJRCBvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIHdvdWxkIGJlIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGxhYmVsIHJlcHJlc2VudHMgdGhpcyBjbGllbnQgcHJvamVjdCB0eXBlLiAgSXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIHNvIGl0IG11c3QgYmUgdHJhbnNsYXRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGNsaWVudCBwcm9qZWN0IHR5cGUuICBUaGlzIGlkZW50aWZpZXIgaXMgcmVmZXJlbmNlZCBpbiB0aGUgY2xpZW50UHJvamVjdFR5cGUgYXR0cmlidXRlIG9mIHRoZSB3ZWJTZXJ2aWNlQ2xpZW50VHlwZSBlbGVtZW50IG9mIGFuIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlQ2xpZW50VHlwZSBleHRlbnNpb24uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvb2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvb2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NTZmZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL29iamVjdFNlbGVjdGlvbldpZGdldC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiBpZD0ib2JqZWN0U2VsZWN0aW9uV2lkZ2V0IiBuYW1lPSJvYmplY3RTZWxlY3Rpb25XaWRnZXQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0U2VsZWN0aW9uV2lkZ2V0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcG9pbnQgYXR0cmlidXRlIHN0cmluZyBtdXN0IGJlIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5vYmplY3RTZWxlY3Rpb25XaWRnZXQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im9iamVjdFNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZW50cnkgYWxsb3dzIGFuIGV4dGVuZGVyIHRvIGFkZCBuZXcgd2F5cyBvZiBicm93c2luZy9maW5kaW5nIGFydGlmYWN0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBXZWIgc2VydmljZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgY2xhc3MgZGVmaW5lcyBTZWxlY3Rpb24gV2lkZ2V0IHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgT2JqZWN0IFNlbGVjdGlvbiBwYWdlIG9mIHRoZSBXZWIgc2VydmljZXMgd2l6YXJkcy4gIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5JT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGludGVyZmFjZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlkIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBvYmplY3RTZWxlY3Rpb25XaWRnZXQgZWxlbWVudC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lciIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyIGludGVyZmFjZS4gIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGEgdHJhbnNmb3JtIG1ldGhvZC4gIEV2ZW4gdGhvdWdoIHRoZSB0eXBlIG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYW5kIHRoZSByZXR1cm4gdmFsdWUgYXJlIG9mIHR5cGUgT2JqZWN0IGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhleSB3aWxsIGJlIHVzZWQgd2l0aCB0aGUgdHlwZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uLiAgVGhpcyB0cmFuc2Zvcm1hdGlvbiBtZXRob2QgYWxsb3dzIHRoZSBleHRlbmRlciB0byBtb2RpZnkgdGhlIGluaXRpYWwgc2VsZWN0aW9uIHRvIGFuIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdCB0aGF0IGlzIG1vcmUgcmVhZGlseSB1c2FibGUgYnkgdGhlIHJ1bnRpbWUgc2VydmVyIHR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvd2ViU2VydmljZUNsaWVudFR5cGUuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlQ2xpZW50VHlwZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmJlMmYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlQ2xpZW50VHlwZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0iIiBpZD0id2ViU2VydmljZUNsaWVudFR5cGUiIG5hbWU9IldlYiBTZXJ2aWNlIENsaWVudCBUeXBlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVzIFdlYiBTZXJ2aWNlIENsaWVudCB0eXBlcy4gIFRoaXMgaXMgZG9uZSBieSBkZWZpbmluZyB3ZWJTZXJ2aWNlQ2xpZW50VHlwZSBlbGVtZW50cy4gIFRoZXNlIGVsZW1lbnRzIHJlZmVyIHRvIGEgc2VydmVyIGFuZCBhIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuICBUaGVzZSBhcmUgcmVzcGVjdGl2ZWx5IGRlZmluZWQgaW4gdGhlIHdlYlNlcnZpY2VTZXJ2ZXIgZWxlbWVudCBhbmQgdGhlIHdlYlNlcnZpY2VSdW50aW1lIGVsZW1lbnQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndlYlNlcnZpY2VTZXJ2ZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2ViU2VydmljZVJ1bnRpbWUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2ViU2VydmljZUNsaWVudFR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwb2ludCBhdHRyaWJ1dGUgc3RyaW5nIG11c3QgYmUgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndlYlNlcnZpY2VDbGllbnRUeXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3ZWJTZXJ2aWNlU2VydmVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBzZXJ2ZXIgdHlwZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGZhY3RvcnkgaWQgZm9yIGEgc2VydmVyLiAgVGhpcyBpZCBpcyBkZWZpbmVkIGJ5Ci10aGUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpc0RlZmF1bHQiIHR5cGU9ImJvb2xlYW4iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyBpZiB0aGlzIHNlcnZlciBzaG91bGQgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBzZXJ2ZXIuICBOb3RlOiAgdGhpcyBkZWZhdWx0IHBhcmFtZXRlciBpcyBvbmx5IHVzZWQgaW4gdGhlIGFic2VuY2Ugb2Ygb3RoZXIgaW5mb3JtYXRpb24uICBJZiB0aGUgdXNlciBoYXMgZGVmaW5lZCBhIHBhcnRpY3VsYXIgc2VydmVyIGFzIHRoZWlyIGRlZmF1bHQgdGhlbiB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLiAgU2hvdWxkIGNvbnRhaW4gYSB2YWx1ZSBvZiBlaXRoZXIgJnF1b3Q7dHJ1ZSZxdW90OyBvciAmcXVvdDtmYWxzZSZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgbG9jYWwgSUQgZm9yIHRoaXMgc2VydmVyLiAgVGhlIHNlcnZlciBhdHRyaWJ1dGUgb2YgdGhlIHdlYnNlcnZpY2VDbGllbnRUeXBlIGVsZW1lbnQgcmVmZXJzIHRvIHRoaXMgSUQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZVR5cGVJZHMiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgY3VycmVudGx5IGEgcGxhY2UgaG9sZGVyIGZvciBmdXR1cmUgZGV2ZWxvcG1lbnQuICBQbGVhc2UsIGRvIG5vdCB1c2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndlYlNlcnZpY2VSdW50aW1lIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBXZWIgU2VydmljZXMgcnVudGltZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBsYWJlbCBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgZm9yIHRoaXMgcnVudGltZS4gIFRoZXJlZm9yZSwgaXMgbXVzdCBiZSB0cmFuc2xhdGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZXMgcnVudGltZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpc0RlZmF1bHQiIHR5cGU9ImJvb2xlYW4iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyBpZiB0aGlzIHJ1bnRpbWUgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcnVudGltZS4gIE5vdGU6ICB0aGlzIGRlZmF1bHQgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBpbiB0aGUgYWJzZW5jZSBvZiBvdGhlciBpbmZvcm1hdGlvbi4gIElmIHRoZSB1c2VyIGhhcyBkZWZpbmVkIGEgcGFydGljdWxhciBydW50aW1lIGFzIHRoZWlyIGRlZmF1bHQgdGhlbiB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLiAgU2hvdWxkIGNvbnRhaW4gYSB2YWx1ZSBvZiBlaXRoZXIgJnF1b3Q7dHJ1ZSZxdW90OyBvciAmcXVvdDtmYWxzZSZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqMmVldmVyc2lvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIEoyRUUgdmVyc2lvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgcnVudGltZS4gIFRoZSBhbGxvd2FibGUgdmFsdWVzIGFyZSAxMiwgMTMsIGFuZCAxNC4gIElmIG1vcmUgdGhhbiBvbmUgSjJFRSB2ZXJzaW9uIGlzIHN1cHBvcnRlZCBlYWNoIEoyRUUgbGV2ZWwgc2hvdWxkIGJlIHNwZWNpZmllZCB3aXRoIGEgYmxhbmsgZGVsaW1pdGVyLihlZy4gaWYgSjJFRSB2ZXJzaW9uIDEuMiBhbmQgMS4zIGFyZSBzdXBwb3J0ZWQgdGhlbiB0aGlzIGF0dHJpYnV0ZSBzdHJpbmcgd291bGQgYmUgJnF1b3Q7MTIgMTMmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndlYlNlcnZpY2VDbGllbnRUeXBlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBXZWIgU2VydmljZXMgY2xpZW50IHR5cGUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIElEIGZvciB0aGlzIFdlYiBTZXJ2aWNlIENsaWVudCB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbmFtZSBmb3IgdGhpcyBXZWIgU2VydmljZSBDbGllbnQgdHlwZS4gIEl0IGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBzbyBpdCBtdXN0IGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xpZW50VHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBraW5kIG9mIFdlYiBTZXJ2aWNlIENsaWVudCB0eXBlIGJlaW5nIGRlZmluZWQuIChpZS4gdGhlIHZhbHVlIG9mIHRoZSBKYXZhIGNsaWVudCBpcyBvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50LnR5cGUuamF2YS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHJ1bnRpbWUgSUQgZm9yIHRoaXMgV2ViIFNlcnZpY2UgY2xpZW50IHR5cGUuICBUaGVyZSBzaG91bGQgYmUgYSBjb3JyZXNwb25kaW5nIHdlYlNlcnZpY2VSdW50aW1lIGVsZW1lbnQgd2l0aCBhbiBhdHRyaWJ1dGUgY2FsbGVkIGlkIHRoYXQgaGFzIHRoaXMgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVyIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgc2VydmVyIGZvciB0aGlzIFdlYiBTZXJ2aWNlIGNsaWVudCB0eXBlLiAgVGhlcmUgc2hvdWxkIGJlIGEgY29ycmVzcG9uZGluZyB3ZWJTZXJ2aWNlU2VydmVyIGVsZW1lbnQgd2l0aCBhbiBhdHRyaWJ1dGUgY2FsbGVkIGlkIHRoYXQgaGFzIHRoaXMgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xpZW50UHJvamVjdFR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLldlYiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY29udGFpbnMgYSBzcGFjZSBkZWxpbWl0ZWQgbGlzdCBvZiBjbGllbnQgcHJvamVjdCB0eXBlIGlkcyBzdXBwb3J0ZWQgYnkgdGhpcyBieSB0aGlzIHdlYlNlcnZpY2VDbGllbnRUeXBlIGVsZW1lbnQuICBUaGUgY2xpZW50IHByb2plY3QgdHlwZSBpZHMgYXJlIGRlZmluZWQgYnkgdGhlIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZSBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGV2ZWxvcEJpbmRpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3MuICBUaGlzIGNsYXNzIHNwZWNpZmllcyB0aGUgQ29tbWFuZHMgYW5kIFVJIGVsZW1lbnRzIGFzc29jaWF0ZSB3aXRoIEoyRUUgZGV2ZWxvcG1lbnQgcGhhc2UuICBUaGUgQ29tbWFuZCBhbmQgVUkgZWxlbWVudHMgaW4gdGhpcyBiaW5kaW5nIGFsd2F5cyBjb21lIGZpcnN0IGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXNzZW1ibHlCaW5kaW5nIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyBhIENvbW1hbmRXaWRnZXRCaW5kaW5nIGNsYXNzLiAgVGhpcyBjbGFzcyBzcGVjaWZpZXMgdGhlIENvbW1hbmRzIGFuZCBVSSBlbGVtZW50cyBhc3NvY2lhdGUgd2l0aCBKMkVFIGFzc2VtYmx5IHBoYXNlLiAgVGhlIENvbW1hbmQgYW5kIFVJIGVsZW1lbnRzIGluIHRoaXMgYmluZGluZyBhbHdheXMgY29tZSBhZnRlciB0aGUgZGV2ZWxvcG1lbnQgcGhhc2UgYmluZGluZyBpbiB0aGUgd2l6YXJkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlcGxveUJpbmRpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3MuICBUaGlzIGNsYXNzIHNwZWNpZmllcyB0aGUgQ29tbWFuZHMgYW5kIFVJIGVsZW1lbnRzIGFzc29jaWF0ZSB3aXRoIEoyRUUgZGVwbG95IHBoYXNlLiAgVGhlIENvbW1hbmQgYW5kIFVJIGVsZW1lbnRzIGluIHRoaXMgYmluZGluZyBhbHdheXMgY29tZSBhZnRlciB0aGUgYXNzZW1ibHkgcGhhc2UgYmluZGluZyBpbiB0aGUgd2l6YXJkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc3RhbGxCaW5kaW5nIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyBhIENvbW1hbmRXaWRnZXRCaW5kaW5nIGNsYXNzLiAgVGhpcyBjbGFzcyBzcGVjaWZpZXMgdGhlIENvbW1hbmRzIGFuZCBVSSBlbGVtZW50cyBhc3NvY2lhdGUgd2l0aCBKMkVFIGluc3RhbGwgcGhhc2UuICBUaGUgQ29tbWFuZCBhbmQgVUkgZWxlbWVudHMgaW4gdGhpcyBiaW5kaW5nIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBkZXBsb3kgcGhhc2UgYmluZGluZyBpbiB0aGUgd2l6YXJkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0NGJjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiIGlkPSJ3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUiIG5hbWU9IldlYiBTZXJ2aWNlIFNlcnZlciBSdW50aW1lIFR5cGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGRlZmluZXMgV2ViIFNlcnZpY2UgU2VydmVyIHR5cGVzLiAgVGhpcyBpcyBkb25lIGJ5IGRlZmluaW5nIHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBlbGVtZW50cy4gIFRoZXNlIGVsZW1lbnRzIHJlZmVyIHRvIGEgc2VydmVyIGFuZCBhIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuICBUaGVzZSBhcmUgcmVzcGVjdGl2ZWx5IGRlZmluZWQgaW4gdGhlIHdlYlNlcnZpY2VTZXJ2ZXIgZWxlbWVudCBhbmQgdGhlIHdlYlNlcnZpY2VSdW50aW1lIGVsZW1lbnQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndlYlNlcnZpY2VTZXJ2ZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2ViU2VydmljZVJ1bnRpbWUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndlYlNlcnZpY2VUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcG9pbnQgYXR0cmlidXRlIHN0cmluZyBtdXN0IGJlIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndlYlNlcnZpY2VTZXJ2ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIHNlcnZlciB0eXBlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5SWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZmFjdG9yeSBpZCBmb3IgYSBzZXJ2ZXIuICBUaGlzIGlkIGlzIGRlZmluZWQgYnkKLXRoZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyVHlwZXMgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzRGVmYXVsdCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIHRoaXMgc2VydmVyIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHNlcnZlci4gIE5vdGU6ICB0aGlzIGRlZmF1bHQgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBpbiB0aGUgYWJzZW5jZSBvZiBvdGhlciBpbmZvcm1hdGlvbi4gIElmIHRoZSB1c2VyIGhhcyBkZWZpbmVkIGEgcGFydGljdWxhciBzZXJ2ZXIgYXMgdGhlaXIgZGVmYXVsdCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuICBTaG91bGQgY29udGFpbiBhIHZhbHVlIG9mIGVpdGhlciAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O2ZhbHNlJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBsb2NhbCBJRCBmb3IgdGhpcyBzZXJ2ZXIuICBUaGUgc2VydmVyIGF0dHJpYnV0ZSBvZiB0aGUgd2Vic2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIGVsZW1lbnQgcmVmZXJzIHRvIHRoaXMgSUQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZVR5cGVJZHMiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgY3VycmVudGx5IGEgcGxhY2UgaG9sZGVyIGZvciBmdXR1cmUgZGV2ZWxvcG1lbnQuICBQbGVhc2UsIGRvIG5vdCB1c2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndlYlNlcnZpY2VSdW50aW1lIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBXZWIgU2VydmljZXMgcnVudGltZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBsYWJlbCBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgZm9yIHRoaXMgcnVudGltZS4gIFRoZXJlZm9yZSwgaXMgbXVzdCBiZSB0cmFuc2xhdGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZXMgcnVudGltZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpc0RlZmF1bHQiIHR5cGU9ImJvb2xlYW4iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyBpZiB0aGlzIHJ1bnRpbWUgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcnVudGltZS4gIE5vdGU6ICB0aGlzIGRlZmF1bHQgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBpbiB0aGUgYWJzZW5jZSBvZiBvdGhlciBpbmZvcm1hdGlvbi4gIElmIHRoZSB1c2VyIGhhcyBkZWZpbmVkIGEgcGFydGljdWxhciBydW50aW1lIGFzIHRoZWlyIGRlZmF1bHQgdGhlbiB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLiAgU2hvdWxkIGNvbnRhaW4gYSB2YWx1ZSBvZiBlaXRoZXIgJnF1b3Q7dHJ1ZSZxdW90OyBvciAmcXVvdDtmYWxzZSZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqMmVldmVyc2lvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIEoyRUUgdmVyc2lvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgcnVudGltZS4gIFRoZSBhbGxvd2FibGUgdmFsdWVzIGFyZSAxMiwgMTMsIGFuZCAxNC4gIElmIG1vcmUgdGhhbiBvbmUgSjJFRSB2ZXJzaW9uIGlzIHN1cHBvcnRlZCBlYWNoIEoyRUUgbGV2ZWwgc2hvdWxkIGJlIHNwZWNpZmllZCB3aXRoIGEgYmxhbmsgZGVsaW1pdGVyLihlZy4gaWYgSjJFRSB2ZXJzaW9uIDEuMiBhbmQgMS4zIGFyZSBzdXBwb3J0ZWQgdGhlbiB0aGlzIGF0dHJpYnV0ZSBzdHJpbmcgd291bGQgYmUgJnF1b3Q7MTIgMTMmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgV2ViIFNlcnZpY2VzIHNlcnZlciBydW50aW1lIHR5cGUuICBBbiBlbnRyeSBmb3IgdGhpcyBlbGVtZW50IGRlZmluZXMgYSB2YWxpZCBjb21iaW5hdGlvbiBvZiBzZXJ2ZXIsIHJ1bnRpbWUsIGFuZCB3ZWJzZXJ2aWNlIHR5cGUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIElEIGZvciB0aGlzIFdlYiBTZXJ2aWNlIFNlcnZlciBSdW50aW1lIHR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBuYW1lIGZvciB0aGlzIFdlYiBTZXJ2aWNlIFNlcnZlciBSdW50aW1lIHR5cGUuICBJdCBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgc28gaXQgbXVzdCBiZSB0cmFuc2xhdGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcnVudGltZSBJRCBmb3IgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXIgUnVudGltZSB0eXBlLiAgVGhlcmUgc2hvdWxkIGJlIGEgY29ycmVzcG9uZGluZyB3ZWJTZXJ2aWNlUnVudGltZSBlbGVtZW50IHdpdGggYW4gYXR0cmlidXRlIGNhbGxlZCBpZCB0aGF0IGhhcyB0aGlzIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZlciIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHNlcnZlciBmb3IgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXIgUnVudGltZSB0eXBlLiAgVGhlcmUgc2hvdWxkIGJlIGEgY29ycmVzcG9uZGluZyB3ZWJTZXJ2aWNlU2VydmVyIGVsZW1lbnQgd2l0aCBhbiBhdHRyaWJ1dGUgY2FsbGVkIGlkIHRoYXQgaGFzIHRoaXMgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBraW5kIG9mIFdlYiBTZXJ2aWNlIFJ1bnRpbWUgdHlwZSBiZWluZyBkZWZpbmVkLiAoZWcuIHRoZSB2YWx1ZSBvZiBhIEphdmEgQmVhbiBXZWJzZXJ2aWNlIGlzIG9yZy5lY2xpcHNlLmpzdC53cy50eXBlLmphdmEpCi1UaGVyZSBzaG91bGQgYmUgYSBjb3JyZXNwb25kaW5nIHdlYlNlcnZpY2VUeXBlIGVsZW1lbnQgd2l0aCBhbiBhdHRyaWJ1dGUgY2FsbGVkIGlkIHRoYXQgaGFzIHRoaXMgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGV2ZWxvcEJpbmRpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3MuICBUaGlzIGNsYXNzIHNwZWNpZmllcyB0aGUgQ29tbWFuZHMgYW5kIFVJIGVsZW1lbnRzIGFzc29jaWF0ZSB3aXRoIEoyRUUgZGV2ZWxvcG1lbnQgcGhhc2UuICBUaGUgQ29tbWFuZCBhbmQgVUkgZWxlbWVudHMgaW4gdGhpcyBiaW5kaW5nIGFsd2F5cyBjb21lIGZpcnN0IGluIHRoZSB3aXphcmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXNzZW1ibHlCaW5kaW5nIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyBhIENvbW1hbmRXaWRnZXRCaW5kaW5nIGNsYXNzLiAgVGhpcyBjbGFzcyBzcGVjaWZpZXMgdGhlIENvbW1hbmRzIGFuZCBVSSBlbGVtZW50cyBhc3NvY2lhdGUgd2l0aCBKMkVFIGFzc2VtYmx5IHBoYXNlLiAgVGhlIENvbW1hbmQgYW5kIFVJIGVsZW1lbnRzIGluIHRoaXMgYmluZGluZyBhbHdheXMgY29tZSBhZnRlciB0aGUgZGV2ZWxvcG1lbnQgcGhhc2UgYmluZGluZyBpbiB0aGUgd2l6YXJkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlcGxveUJpbmRpbmciIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgQ29tbWFuZFdpZGdldEJpbmRpbmcgY2xhc3MuICBUaGlzIGNsYXNzIHNwZWNpZmllcyB0aGUgQ29tbWFuZHMgYW5kIFVJIGVsZW1lbnRzIGFzc29jaWF0ZSB3aXRoIEoyRUUgZGVwbG95IHBoYXNlLiAgVGhlIENvbW1hbmQgYW5kIFVJIGVsZW1lbnRzIGluIHRoaXMgYmluZGluZyBhbHdheXMgY29tZSBhZnRlciB0aGUgYXNzZW1ibHkgcGhhc2UgYmluZGluZyBpbiB0aGUgd2l6YXJkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc3RhbGxCaW5kaW5nIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyBhIENvbW1hbmRXaWRnZXRCaW5kaW5nIGNsYXNzLiAgVGhpcyBjbGFzcyBzcGVjaWZpZXMgdGhlIENvbW1hbmRzIGFuZCBVSSBlbGVtZW50cyBhc3NvY2lhdGUgd2l0aCBKMkVFIGluc3RhbGwgcGhhc2UuICBUaGUgQ29tbWFuZCBhbmQgVUkgZWxlbWVudHMgaW4gdGhpcyBiaW5kaW5nIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBkZXBsb3kgcGhhc2UgYmluZGluZyBpbiB0aGUgd2l6YXJkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlcXVpcmVFSkJNb2R1bGUiIHR5cGU9ImJvb2xlYW4iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElmIHRoZSBXZWJzZXJ2aWNlIGZvciB0aGlzIFNlcnZlciBSdW50aW1lIFR5cGUgaXMgcmVxdWlyZWQgdG8gYmUgaW4gYW4gRUpCIG1vZHVsZSB0aGVuIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBzaG91bGQgYmUgdHJ1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlV2ViTW9kdWxlIiB0eXBlPSJib29sZWFuIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZiB0aGUgV2Vic2VydmljZSBmb3IgdGhpcyBTZXJ2ZXIgUnVudGltZSBUeXBlIGlzIHJlcXVpcmVkIHRvIGJlIGluIGFuIFdlYiBtb2R1bGUgdGhlbiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgc2hvdWxkIGJlIHRydWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndlYlNlcnZpY2VUeXBlIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyBhIHBhcnRpY3VsYXIgV2ViIHNlcnZpY2Uga2luZC4gIFN1Y2ggYXMgYSBKYXZhIEJlYW4gd2ViIHNlcnZpY2UsIGEgU2tlbGV0b24gV2ViIHNlcnZpY2UsIGFuIEVKQiAgV2ViIHNlcnZpY2UsIGV0Yy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBXZWIgc2VydmljZSB0eXBlLiAgSXQgaXMgcmVmZXJlbmNlZCBpbiB0aGUgd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIGVsZW1lbnQgd2l0aCB0aGUgdHlwZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIHRyYW5zbGF0YWJsZSBsYWJlbCBmb3IgdGhpcyB3ZWIgc2VydmljZSB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlc291cmNlVHlwZU1ldGFkYXRhIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIGEgYmxhbmsgZGVsaW1pdGVkIGxpc3QgY2xhc3MgTmFtZXMuIChpZS5ObyBwYWNrYWdlIHByZWZpeCkgIFRoZSBjbGFzc2VzIGxpc3RlZCBkZWZpbmUgdGhlIGFsbG93YWJsZSBFY2xpcHNlIHJlc291cmNlcyB0aGF0IHRoaXMgd2ViIHNlcnZpY2UgdHlwZSB1bmRlcnN0YW5kcyBhbmQgdHVybiBpbnRvIGEgV2ViIHNlcnZpY2UuICBGb3IgZXhhbXBsZSwgaWYgYSB1c2VyIHNlbGVjdHMgYSBKYXZhIHNvdXJjZSBmaWxlIGluIHRoZSBwYWNrYWdlIGV4cGxvcmVyIHZpZXcgYW5kIHRoZW4gc3RhcnRzIHRoZSBXZWIgc2VydmljZXMgd2l6YXJkIGEgQ29tcGlsYXRpb25Vbml0IG9iamVjdCB3aWxsIGJlIHBhc3NlZCBpbiBhcyBwYXJ0IG9mIGFuIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLiAgQnkgcHV0dGluZyAmcXVvdDtDb21waWxhdGlvblVuaXQmcXVvdDsgYXMgb25lIG9mIHRoZSBjbGFzc2VzIGluIHRoaXMgYXR0cmlidXRlIGl0IGluZGljYXRlcyB0aGF0IHRoaXMgdHlwZSBjYW4gY3JlYXRlIGEgV2ViIHNlcnZpY2UgZnJvbSB0aGUgQ29tcGlsYXRpb25Vbml0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbk1ldGFkYXRhIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGFsbG93cyB0aGlzIFdlYiBzZXJ2aWNlIHR5cGUgdG8gcmVzdHJpY3QgbmFtZXMgb2YgdGhlIGlucHV0IGZpbGVzIHRoYXQgaXQgdW5kZXJzdGFuZHMuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHZhbHVlIGlzIHNldCB0byAmcXVvdDsuamF2YSAuY2xhc3MmcXVvdDsgaXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBXZWIgc2VydmljZSB0eXBlIG9ubHkgdW5kZXJzdGFuZHMgcmVzb3VyY2UgbmFtZXMgdGhhdCBlbmQgd2l0aCAuamF2YSBvciBlbmQgd2l0aCAuY2xhc3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib2JqZWN0U2VsZWN0aW9uV2lkZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIE9uIHBhZ2UgMiBvZiB0aGUgV2ViIHNlcnZpY2Ugd2l6YXJkIHRoZXJlIGlzIGFuIE9iamVjdCBzZWxlY3Rpb24gcGFnZS4gIFRoaXMgc2VsZWN0aW9uIHBhZ2UgY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgdGhpcyBhdHRyaWJ1dGUsIHNpbmNlIGRpZmZlcmVudCBXZWIgc2VydmljZSB0eXBlcyBtYXkgbmVlZCBkaWZmZXJlbnQgbWV0aG9kcyBvZiBzZWxlY3RpbmcgdGhlbS4gIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBzaG91bGQgYmUgdGhlIGlkIG9mIGEgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLm9iamVjdFNlbGVjdGlvbldpZGdldCBleHRlbnNpb24uICBUaGUgcHJlZGVmaW5lZCBpZCBmb3IgYSBKYXZhIHNlbGVjdGlvbiB3aWRnZXQgaXMgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkphdmFCZWFuU2VsZWN0aW9uV2lkZ2V0LiAgVGhlIHByZWRlZmluZWQgaWQgZm9yIGEgV1NETCBzZWxlY3Rpb24gd2lkZ2V0IGlzIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5XU0RMU2VsZWN0aW9uV2lkZ2V0LiAgVGhlIHByZWRlZmluZWQgaWQgZm9yIGFuIEVKQiBzZWxlY3Rpb24gd2lkZ2V0IGlzIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5FSkJTZWxlY3Rpb25XaWRnZXQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZU5hdHVyZXMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY29udGFpbnMgYSBibGFuayBkZWxpbWl0ZWQgbGlzdCBvZiBQcm9qZWN0IE5hdHVyZSBJZHMuICBUaGUgbGlzdGVkIElEcyBpbmRpY2F0ZSB0aGF0IHRoaXMgdHlwZSBvbmx5IHdvcmtzIHdpdGggdGhlc2UgcGFydGljdWxhciBwcm9qZWN0IHR5cGVzLiAgRm9yIGV4YW1wbGUsIGlmIHRoaXMgdHlwZSBvbmx5IHdvcmtzIHdpdGggd2ViIHByb2plY3RzIGFuIElEIG9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUgd291bGQgYmUgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGVOYXR1cmVzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIGEgYmxhbmsgZGVsaW1pdGVkIGxpc3Qgb2YgUHJvamVjdCBOYXR1cmUgSWRzLiAgVGhlIGxpc3RlZCBJRHMgaW5kaWNhdGUgdGhhdCB0aGlzIHR5cGUgRE9FUyBOT1Qgd29yayB3aXRoIHRoZXNlIHBhcnRpY3VsYXIgcHJvamVjdCB0eXBlcy4gIEZvciBleGFtcGxlLCBpZiB0aGlzIHR5cGUgZG9lcyBub3Qgd29yayB3aXRoIHdlYiBwcm9qZWN0cyBhbiBJRCBvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIHdvdWxkIGJlIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvd2ViU2VydmljZVRlc3QuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlVGVzdC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDYyYjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS93ZWJTZXJ2aWNlVGVzdC5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiBpZD0id2ViU2VydmljZVRlc3QiIG5hbWU9IldlYiBTZXJ2aWNlIFRlc3QiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVzIFdlYiBzZXJ2aWNlIHRlc3QgZmFjaWxpdGllcyB0aGF0IGNhbiBiZSBwbHVnZ2VkIGludG8gdGhlIFdlYiBzZXJ2aWNlcyB3aXphcmRzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3ZWJTZXJ2aWNlVGVzdCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHBvaW50IGF0dHJpYnV0ZSBzdHJpbmcgbXVzdCBiZSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2ViU2VydmljZVRlc3QuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndlYlNlcnZpY2VUZXN0Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWV0aG9kc25lZWRlZCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaW5kaWNhdGVzIGlmIHRoaXMgdGVzdCBmYWNpbGl0eSBuZWVkIHRvIG1ldGhvZHMgZnJvbSBhIHByb3h5IGJlYW4uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGZvciB0aGlzIHRlc3QgZmFjaWxpdHkuICBJdCBtdXN0IGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iamF2YSIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0ZXN0IGZhY2lsaXR5IGlzIGludGVuZGVkIGZvciBjbGllbnRzIHRoYXQgZ2VuZXJhdGUgYSBKYXZhIGJlYW4gYXMgb3V0cHV0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvZGVnZW4iIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGluZGljYXRlcyBpZiB0aGlzIHRlc3QgZmFjaWxpdHkgZ2VuZXJhdGVzIGNvZGUgb3Igbm90LCBzdWNoIGFzIEpTUCBmaWxlcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjb250YWlucyBhIGNsYXNzIG5hbWUuICBUaGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuanN0LndzLmV4dC5XZWJTZXJ2aWNlRXhlY3V0YWJsZS4gIFRoaXMgY2xhc3MgYWxsb3dzIHRoZSBleHRlbmRlciB0byBwcm92aWRlIHRoZSBDb21tYW5kcyB0aGF0IHdpbGwgZXhlY3V0ZSBmb3IgdGhpcyB0ZXN0IGZhY2lsaXR5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyB0ZXN0IGZhY2lsaXR5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jb25zdW1wdGlvbi91aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY29uc3VtcHRpb24vdWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YmExOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jb25zdW1wdGlvbi91aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi0KLVBMVUdJTl9ORVdfV0laQVJEX05BTUVfV1NfQ0xJRU5UPVdlYiBTZXJ2aWNlIENsaWVudAotIwotIyBXZWIgc2VydmljZXMgIkludGVybmV0IiBwcmVmZXJlbmNlcyBleHRlbnNpb24uCi0jCi0KLSMKLSMgV2ViIFNhbXBsZXMgSURzCi0jCi0KLSMKLSMgUG9wLXVwIGFjdGlvbnMKLSMKLUFDVElPTl9HRU5FUkFURV9KQVZBX1BST1hZPUdlbmVyYXRlIENsaWVudAotCi0jCi0jIERpYWxvZ3MKLSMKLUNIRUNLQk9YX1NIT1dfR0VORVJBVEVfSkFWQV9QUk9YWV9ESUFMT0c9U2hvdyBHZW5lcmF0ZSBKYXZhIGJlYW4gUHJveHkgRGlhbG9nCi1UT09MVElQX1BQQURfQ0hFQ0tCT1hfV1NETDJQUk9YWT1TaG93IHRoZSBkaWFsb2cgZm9yIGdlbmVyYXRpbmcgdGhlIEphdmEgYmVhbiBwcm94eSBhY3Rpb24uCi0KLSMKLSMgICAgICAgV2ViIFNlcnZpY2VzIFByZWZlcmFuY2UgUGFnZXMKLSMKLSMgQ2F0ZWdvcmllcwotIwotCi0jCi0jIFByZWZlcmVuY2VzIFRvb2x0aXBzCi0jCi0KLSMKLSNTZXJ2ZXIgUnVudGltZSBQcmVmZXJlbmNlcwotIwotVE9PTFRJUF9TUlBGX0NPTUJPX1NFUlZFUj1UaGUgcHJlZmVycmVkIHNlcnZlciB0eXBlCi1UT09MVElQX1NSUEZfQ09NQk9fUlVOVElNRT1UaGUgcHJlZmVycmVkIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLVRPT0xUSVBfU1JQRl9DT01CT19KMkVFPVRoZSBwcmVmZXJyZWQgSjJFRSB2ZXJzaW9uCi0KLSMKLSMgUG9wLXVwIGFjdGlvbnMKLSMKLQotIwotIyBHZW5lcmFsIG1lc3NhZ2VzLgotIwotTVNHX0VSUk9SX1RBU0tfRVhDRVBURUQ9SVdBQjAyMzRFIEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBEZXRhaWxzOiB7MH0KLQotCi0KLQotIwotI1J1bnRpbWUgbGFiZWxzCi0jCi0KLQotIwotIyBXaXphcmQgcGFnZSB0YXNrIGxhYmVscyBhbmQgZGVzY3JpcHRpb25zCi0jICh1c2VkIG9ubHkgZm9yIHByb2dyZXNzIGluZGljYXRpb24pLgotIwotCi0jCi0jIENvbW1vbiB3aXphcmQgc3RyaW5ncy4KLSMKLUxBQkVMX0ZPTERFUl9OQU1FPUZvbGRlcjoKLUxBQkVMX0pTUF9GT0xERVJfTkFNRT1KU1AgZm9sZGVyOgotTEFCRUxfV0VCX1BST0pFQ1RfTkFNRT1XZWIgcHJvamVjdDoKLUxBQkVMX1dFQlNFUlZJQ0VUWVBFPVdlYiBzZXJ2aWNlIHR5cGU6Ci1MQUJFTF9KMkVFX1ZFUlNJT049SjJFRSB2ZXJzaW9uOgotTEFCRUxfTkE9Ti9BCi0KLUJVVFRPTl9CUk9XU0U9QnJvd3NlLi4uCi1CVVRUT05fQlJPV1NFX0ZJTEVTPUJyb3dzZSBmaWxlcy4uLgotQlVUVE9OX1VTRV9BQlNPTFVURV9MT0NBVElPTj1Vc2UgYWJzb2x1dGUgbG9jYXRpb24gVVJJIGZvciBXU0RMIGlucHV0IHN0YXRlbWVudHMKLUJVVFRPTl9VU0VfSU5MSU5FX1NDSEVNQT1Vc2UgaW5saW5lIHNjaGVtYQotCi0KLQotCi0jCi0jIFdpemFyZHMuCi0jCi1XSVpBUkRfVElUTEVfV1NDPVdlYiBTZXJ2aWNlIENsaWVudAotCi0jCi0jIFdlYlNlcnZpY2VDbGllbnRTZWxlY3Rpb25QYWdlCi0jCi0KLSMKLSMgV2ViU2VydmljZVNlcnZlclNlbGVjdGlvblBhZ2UKLSMKLQotIwotIyBXZWJTZXJ2aWNlUHJvamVjdFBhZ2UKLSMKLVBBR0VfVElUTEVfV1NfUFJPSkVDVD1XZWIgU2VydmljZXMKLVBBR0VfREVTQ19XU19QUk9KRUNUPVJldmlldyB5b3VyIFdlYiBzZXJ2aWNlIG9wdGlvbnMgYW5kIG1ha2UgYW55IG5lY2Vzc2FyeSBjaGFuZ2VzIGJlZm9yZSBwcm9jZWVkaW5nIHRvIHRoZSBuZXh0IHBhZ2UuCi1CVVRUT05fU1RBUlRfV0VCX1BST0pFQ1Q9U3RhcnQgV2ViIHNlcnZpY2UgaW4gV2ViIHByb2plY3QKLUdST1VQX1NDRU5BUklPX1NFUlZJQ0U9U2VydmljZQotR1JPVVBfU0NFTkFSSU9fQ0xJRU5UPUNsaWVudCBwcm94eQotTEFCRUxfV0VCU0VSVklDRUNMSUVOVFRZUEU9Q2xpZW50IHByb3h5IHR5cGU6Ci0KLQotCi0jIEl0ZW1zIGNvbW1vbiB0byBXZWJTZXJ2aWNlUnVudGltZVNlbGVjdGlvblBhZ2UgYW5kIFdlYlNlcnZpY2VDbGllbnRSdW50aW1lU2VsZWN0aW9uUGFnZQotIyBXZWJTZXJ2aWNlUnVudGltZVNlbGVjdGlvblBhZ2UKLVBBR0VfVElUTEVfV1NfUlVOVElNRV9TRUxFQ1RJT049U2VydmljZSBEZXBsb3ltZW50IENvbmZpZ3VyYXRpb24KLVBBR0VfREVTQ19XU19SVU5USU1FX1NFTEVDVElPTj1DaG9vc2UgZnJvbSB0aGUgbGlzdCBvZiBydW50aW1lIHByb3RvY29scyBhbmQgZGVwbG95bWVudCBzZXJ2ZXJzLCBvciB1c2UgdGhlIGRlZmF1bHQgc2V0dGluZ3MuCi1MQUJFTF9SVU5USU1FU19MSVNUPVdlYiBzZXJ2aWNlIHJ1bnRpbWU6Ci1MQUJFTF9TRVJWRVJTX0xJU1Q9U2VydmVyOgotTEFCRUxfU0VSVklDRV9XRUJfTU9EVUxFPVNlcnZpY2UgcHJvamVjdDoKLUxBQkVMX0VESVRfQlVUVE9OPUVkaXQuLi4KLUxBQkVMX1NFUlZJQ0VfRUFSX1BST0pFQ1Q9RUFSIHByb2plY3Q6Ci1MQUJFTF9FQVJfUFJPSkVDVD1FQVIgcHJvamVjdDoKLUxBQkVMX0NMSUVOVF9QUk9KRUNUPUNsaWVudCBwcm9qZWN0OgotCi1UT09MVElQX1BXUlNfVEVYVF9SVU5USU1FPVRoZSBydW50aW1lIHRvIGJlIHVzZWQuCi1UT09MVElQX1BXUlNfVEVYVF9TRVJWRVI9VGhlIHNlcnZlciB0byBiZSB1c2VkLgotVE9PTFRJUF9QV1JTX0oyRUVfVkVSU0lPTj1KMkVFIHZlcnNpb24gdG8gYmUgdXNlZC4KLQotTEFCRUxfU0VMRUNUSU9OX1ZJRVdfVElUTEU9U2VydmVyLVNpZGUgRGVwbG95bWVudCBTZWxlY3Rpb246Ci1MQUJFTF9TRUxFQ1RJT05fVklFV19SVU5USU1FPUNob29zZSBXZWIgc2VydmljZSBydW50aW1lIHByb3RvY29sIGZpcnN0Ci1MQUJFTF9TRUxFQ1RJT05fVklFV19TRVJWRVI9Q2hvb3NlIHNlcnZlciBmaXJzdAotTEFCRUxfU0VMRUNUSU9OX1ZJRVdfRVhQTE9SRT1FeHBsb3JlIG9wdGlvbnMKLQotTEFCRUxfVFJFRV9FWElTVElOR19TRVJWRVJTPUV4aXN0aW5nIFNlcnZlcnMKLUxBQkVMX1RSRUVfU0VSVkVSX1RZUEVTPVNlcnZlciBUeXBlcwotCi1NU0dfSU5WQUxJRF9TUlRfU0VMRUNUSU9OUz1UaGlzIHNlcnZlciBhbmQgcnVudGltZSBjb21iaW5hdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAgQ2hvb3NlIGEgZGlmZmVyZW50IHNlcnZlciBvciBydW50aW1lIHRvIHByb2NlZWQgdGhyb3VnaCB0aGUgV2ViIHNlcnZpY2VzIHdpemFyZC4KLU1TR19OT19SVU5USU1FPU5vIHJ1bnRpbWUgc3BlY2lmaWVkIGZvciB0aGUgezB9IHNjZW5hcmlvLgotTVNHX05PX1NFUlZFUj1ObyBzZXJ2ZXIgc3BlY2lmaWVkIGZvciB0aGUgezB9IHNjZW5hcmlvLgotCi1NU0dfU0VSVkVSX1RBUkdFVF9NSVNNQVRDSD1UaGUgcHJvamVjdCwgezB9LCBoYXMgYSBzZXJ2ZXIgdGFyZ2V0IHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHNlbGVjdGVkIHNlcnZlciB0eXBlCi1NU0dfSjJFRV9NSVNNQVRDSD1UaGUgcHJvamVjdCwgezB9LCBoYXMgYSBkaWZmZXJlbnQgSjJFRSBsZXZlbCBmcm9tIHRoZSBzZWxlY3RlZCBKMkVFIGxldmVsCi1NU0dfU0VSVklDRV9QUk9KRUNUX0VNUFRZPVRoZSBzZXJ2aWNlIHByb2plY3QgY2Fubm90IGJlIGVtcHR5LiBTZWxlY3QgYSBzZXJ2aWNlIHByb2plY3QKLU1TR19TRVJWSUNFX0VBUl9FTVBUWT1UaGUgc2VydmljZSBFQVIgY2Fubm90IGJlIGVtcHR5LiBTZWxlY3QgYSBzZXJ2aWNlIEVBUi4KLU1TR19DTElFTlRfUFJPSkVDVF9FTVBUWT1UaGUgY2xpZW50IHByb2plY3QgY2Fubm90IGJlIGVtcHR5LiBTZWxlY3QgYSBjbGllbnQgcHJvamVjdAotTVNHX0NMSUVOVF9FQVJfRU1QVFk9VGhlIGNsaWVudCBFQVIgY2Fubm90IGJlIGVtcHR5LiBTZWxlY3QgYSBjbGllbnQgRUFSLgotTVNHX0lOVkFMSURfRUpCX1BST0pFQ1Q9ezB9IGlzIG5vdCBhbiBFSkIgcHJvamVjdC4gQ2hvb3NlIGFuIEVKQiBwcm9qZWN0LCBvciBlbnRlciBhIG5ldyBFSkIgcHJvamVjdCBuYW1lLgotTVNHX0lOVkFMSURfV0VCX1BST0pFQ1Q9ezB9IGlzIG5vdCBhIFdlYiBwcm9qZWN0LiBDaG9vc2UgYSBXZWIgcHJvamVjdCwgb3IgZW50ZXIgYSBuZXcgV2ViIHByb2plY3QgbmFtZS4KLQotTVNHX1NBTUVfQ0xJRU5UX0FORF9TRVJWSUNFX0VBUlM9WW91ciBzZWxlY3RlZCBzZXJ2aWNlIGFuZCBjbGllbnQgezB9IHByb2plY3RzIGFyZSB0aGUgc2FtZS4gIFByb2NlZWRpbmcgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24gbWF5IHJlc3VsdCBpbiBydW50aW1lIGVycm9ycyB3aGVuIGludm9raW5nIHRoZSBXZWIgc2VydmljZS4KLU1TR19XUk9OR19DTElFTlRfUFJPSkVDVF9UWVBFPVRoZSBzZWxlY3RlZCBjbGllbnQgcHJvamVjdCwgezB9LCBpcyBub3QgYSB7MX0gcHJvamVjdC4gUGxlYXNlIHNlbGVjdCBhIHsxfSBwcm9qZWN0IG9yIGVudGVyIGEgbmV3IHByb2plY3QgbmFtZS4KLU1TR19DTElFTlRfU1VCPWNsaWVudAotTVNHX1NFUlZJQ0VfU1VCPXNlcnZpY2UKLU1TR19HRU5FUkFMX1BST0pFQ1RfQU5EX0VBUj1TZWxlY3QgdGhlIHswfSBwcm9qZWN0IGFuZCB0aGUgRUFSIHByb2plY3Qgd2l0aCB3aGljaCB5b3Ugd2FudCBpdCB0byBiZSBhc3NvY2lhdGVkLgotTVNHX0VBUl9QUk9KRUNUX1dJTExfQkVfQ1JFQVRFRD1JZiBhbiBFQVIgb3IgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpcyBjdXJyZW50bHkgdW5hc3NvY2lhdGVkLCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIFxuYXNzb2NpYXRlZCBhcyByZXF1aXJlZCB3aGVuIHlvdSBjbGljayBOZXh0LgotCi1NU0dfRUFSX1dJTExfQkVfQVNTT0NJQVRFRD1UaGUgc2VsZWN0ZWQgezB9IHByb2plY3Qgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIEVBUiBwcm9qZWN0LgotTVNHX1BST0pFQ1RfV0lMTF9CRV9DUkVBVEVEPVRoZSB7MH0gcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgRUFSIHByb2plY3QuCi1NU0dfRUFSX1dJTExfQkVfQ1JFQVRFRD1UaGUgezB9IEVBUiBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBhbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LgotTVNHX1BST0pFQ1RfQU5EX0VBUl9DUkVBVEVEPVRoZSB7MH0gcHJvamVjdCBhbmQgRUFSIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggb25lIGFub3RoZXIuCi0KLSMgV2ViU2VydmljZUNsaWVudFJ1bnRpbWVTZWxlY3Rpb25QYWdlCi1QQUdFX1RJVExFX1dTX0NMSUVOVF9SVU5USU1FX1NFTEVDVElPTj1DbGllbnQgRW52aXJvbm1lbnQgQ29uZmlndXJhdGlvbgotUEFHRV9ERVNDX1dTX0NMSUVOVF9SVU5USU1FX1NFTEVDVElPTj1DaG9vc2UgZnJvbSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgcnVudGltZSBwcm90b2NvbHMgYW5kIHNlcnZlcnMgZm9yIHRoZSBjbGllbnQgZW52aXJvbm1lbnQsIG9yIHVzZSB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KLQotTEFCRUxfQ0xJRU5UX1NFTEVDVElPTl9WSUVXX1RJVExFPUNsaWVudC1TaWRlIEVudmlyb25tZW50IFNlbGVjdGlvbjoKLUxBQkVMX0NMSUVOVF9UWVBFPUNsaWVudCB0eXBlOgotTEFCRUxfV0VCPVdlYgotTEFCRUxfRUpCPUVKQgotTEFCRUxfTk9fTEFCRUw9Ci0KLQotIwotIyBJdGVtcyBjb21tb24gdG8gV2ViU2VydmljZU1hcHBpbmdzUGFnZSwgV2ViU2VydmljZU1hcHBpbmdzUGFnZSAoY2xpZW50KSwgYW5kIFdlYlNlcnZpY2VTT0FQQmluZGluZ1BhZ2UKLSMKLVBBR0VfTVNHX1ZBTElEQVRJT05fSU5URVJOQUxfRVJST1I9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBhZ2UgdmFsaWRhdGlvbi4gU2VlIGxvZ3MgZm9yIGRldGFpbHMuCi0KLSMKLSMgV2ViU2VydmljZU1hcHBpbmdzUGFnZQotIwotUEFHRV9USVRMRV9XU19YTUwyQkVBTj1XZWIgU2VydmljZSBTa2VsZXRvbiBYTUwgdG8gSmF2YSBNYXBwaW5ncwotUEFHRV9ERVNDX04yUF9NQVBQSU5HUz1EZWZpbmUgY3VzdG9tIG1hcHBpbmcgZm9yIG5hbWVzcGFjZSB0byBwYWNrYWdlLgotTVNHX01BUFBJTkdfRFVQTElDQVRFX0VOVFJJRVM9RHVwbGljYXRlIHswfSBtYXBwZWQgdG8gdGhlIHNhbWUgezF9LgotCi0KLSMKLSMgVGhlIHR3byBJVEVNXyogc3RyaW5ncyBhcmUgZW50cmllcyBpbiBhIGxpc3QgYm94IG9mIG1hcHBpbmdzLgotIyBUaGVyZSBhcmUgdHdvIGZvcm1zLCBvbmUgd2hlbiB0aGUgcGFnZSBpcyBpbiBKYXZhLXRvLVhNTCBtb2RlOgotIyAgIDxqYXZhLWJlYW4tbmFtZT4sIDxlbmNvZGluZy1zdHlsZT4KLSMgYW5kIG9uZSB3aGVuIHRoZSBwYWdlIGlzIGluIFhNTC10by1KYXZhIG1vZGU6Ci0jICAgPHhtbC1uYW1lc3BhY2UtdXJpPjo8eG1sLXNob3J0LW5hbWU+LCA8ZW5jb2Rpbmctc3R5bGU+Ci0jIHdoZXJlOgotIyAgIDxqYXZhLWJlYW4tbmFtZT4gaXMgYSBmdWxseS1xdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0jICAgPHhtbC1uYW1lc3BhY2UtdXJpPiBpcyB0aGUgbmFtZXNwYWNlIG9mIGFuIFhNTCB0eXBlCi0jICAgPHhtbC1zaG9ydC1uYW1lPiBpcyB0aGUgWE1MIHR5cGUgbmFtZSB3aXRoaW4gdGhlIG5hbWVzcGFjZQotIyAgIDxlbmNvZGluZy1zdHlsZT4gaXMgdGhlIGVuY29kaW5nIHN0eWxlIChTT0FQIG9yIExpdGVyYWwgWE1MKQotIwotCi0jCi0jIFdlYlNlcnZpY2VQcm94eVBhZ2UKLSMKLUJVVFRPTl9HRU5FUkFURV9QUk9YWT1HZW5lcmF0ZSBhIHByb3h5Ci0KLSMKLSMgV2ViU2VydmljZVNrZWxldG9uQ29uZmlnUGFnZQotIwotUEFHRV9ERVNDX1dTU0tFTF9DT05GSUc9RGVmaW5lIGEgc2tlbGV0b24gSmF2YSBiZWFuIGFzIGEgV2ViIHNlcnZpY2UuCi1QQUdFX1RJVExFX1dTU0tFTF9DT05GSUc9V2ViIFNlcnZpY2UgU2tlbGV0b24gSmF2YSBCZWFuIENvbmZpZ3VyYXRpb24KLVRPT0xUSVBfUEJTQ19URVhUX1NLRUxFVE9OX0ZPTERFUj1Gb2xkZXIgZm9yIGdlbmVyYXRlZCBKYXZhIHNrZWxldG9uLgotVE9PTFRJUF9QQlNDX0JVVFRPTl9TS0VMRVRPTl9GT0xERVJfQlJPV1NFPUJyb3dzZSBmb2xkZXJzLgotTEFCRUxfU0tFTEVUT05fUk9PVF9OQU1FPVNrZWxldG9uIGZvbGRlcjoKLQotIwotIyBXZWJTZXJ2aWNlQmVhbkNsYXNzUGFnZQotIwotTEFCRUxfQkVBTl9DTEFTU19OQU1FPUJlYW46Ci1QQUdFX01TR19CRUFOX0NBTk5PVF9CRV9FTVBUWT1QbGVhc2Ugc2VsZWN0IGEgSmF2YSBiZWFuIGNsYXNzLgotQlVUVE9OX0JST1dTRV9DTEFTU0VTPUJyb3dzZSBjbGFzc2VzLi4uCi0KLQotIwotIyBXZWJTZXJ2aWNlVGVzdFBhZ2UKLSMKLVBBR0VfVElUTEVfV1NURVNUPVdlYiBTZXJ2aWNlIFRlc3QgUGFnZQotUEFHRV9ERVNDX1dTVEVTVD1TZWxlY3QgYSB0ZXN0IGZhY2lsaXR5Ci1MQUJFTF9URVNUX1RZUEVTPVRlc3QgRmFjaWxpdHkKLUNIRUNLQk9YX1RFU1RfV0VCU0VSVklDRT1UZXN0IHRoZSBXZWIgc2VydmljZQotQ0hFQ0tCT1hfTU9OSVRPUl9XRUJTRVJWSUNFPU1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlCi1NU0dfRVJST1JfVU5BQkxFX1RPX0xBVU5DSF9XU0RMX1RFU1Q9QW4gZXJyb3Igb2NjdXJyZWQuIFVuYWJsZSB0byBsYXVuY2ggV1NETCB0ZXN0IGZhY2lsaXR5LgotCi0jCi0jIFdlYlNlcnZpY2VFeHBsb3JlclBhZ2UKLSMKLUJVVFRPTl9MQVVOQ0hfU0VSVklDRV9URVNUPUxhdW5jaAotCi0jCi0jIFdlYlNlcnZpY2VDbGllbnRUZXN0UGFnZQotIwotUEFHRV9USVRMRV9XU19TQU1QTEU9V2ViIFNlcnZpY2UgQ2xpZW50IFRlc3QKLVBBR0VfREVTQ19XU19TQU1QTEU9RG8geW91IHdhbnQgdG8gdGVzdCB0aGUgZ2VuZXJhdGVkIHByb3h5PwotQlVUVE9OX1RFU1Q9VGVzdCB0aGUgZ2VuZXJhdGVkIHByb3h5Ci1MQUJFTF9URVNUX1RZUEVTPVRlc3QgZmFjaWxpdHkKLUJVVFRPTl9SVU5fVEVTVD1SdW4gdGVzdCBvbiBzZXJ2ZXIKLUxBQkVMX01FVEhPRFM9TWV0aG9kcwotTVNHX0VSUk9SX0pUU19KU1BfR0VOPUlXQUIwMzEzRSBFcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBzYW1wbGUuCi1MQUJFTF9KU1BfUFJPSkVDVF9OQU1FPUpTUCBwcm9qZWN0OgotTVNHX0VSUk9SX0pUU19QUk9YWV9OT1RfQ09NUElMRUQ9SVdBQjAzNTdFIFRoZSBHZW5lcmF0ZWQgcHJveHkgd2FzIG5vdCBmb3VuZC4gV2ViU2VydmljZSBzYW1wbGUganNwcyBjYW5ub3QgYmUgZ2VuZXJhdGVkLgotTVNHX0VSUk9SX01BTEZPUk1FRF9VUkw9SVdBQjAzNThFIFRlc3QgY2xpZW50IFVSTCBpcyBtYWxmb3JtZWQuCi0KLSMKLSMgV2ViU2VydmljZUlTRFBhZ2UKLSMKLQotIwotIyBXZWJTZXJ2aWNlQmVhbkNvbmZpZ1BhZ2UKLSMKLQotIwotIyBXZWJTZXJ2aWNlQmVhbk1ldGhvZHNQYWdlCi0jCi1CVVRUT05fU0VMRUNUX0FMTD1TZWxlY3QgQWxsCi1CVVRUT05fREVTRUxFQ1RfQUxMPURlc2VsZWN0IEFsbAotVE9PTFRJUF9QQk1FX0JVVFRPTl9TRUxFQ1RfQUxMPVNlbGVjdCBhbGwgbWV0aG9kcwotVE9PTFRJUF9QQk1FX0JVVFRPTl9ERVNFTEVDVF9BTEw9RGVzZWxlY3QgYWxsIG1ldGhvZHMKLQotIwotIyBXZWJTZXJ2aWNlRUpCQ29uZmlnUGFnZQotIwotCi0jCi0jIFdlYlNlcnZpY2VXU0RMU2VsZWN0aW9uUGFnZQotIwotUEFHRV9USVRMRV9XU0RMX1NFTEVDVElPTj1XZWIgU2VydmljZSBXU0RMIEZpbGUgU2VsZWN0aW9uCi1QQUdFX0RFU0NfV1NETF9TRUxFQ1RJT049U2VsZWN0IGEgV1NETCBmaWxlLgotCi0KLSMKLSMgV2ViU2VydmljZVB1Ymxpc2hQYWdlCi0jCi1QQUdFX1RJVExFX1dTX1BVQkxJU0g9V2ViIFNlcnZpY2UgUHVibGljYXRpb24KLVBBR0VfREVTQ19XU19QVUJMSVNIPURvIHlvdSB3YW50IHRvIHB1Ymxpc2ggeW91ciBXZWIgc2VydmljZT8KLVBBR0VfVElUTEVfV1NfRklORD1GaW5kIGEgV2ViIHNlcnZpY2UKLVBBR0VfREVTQ19XU19GSU5EPURvIHlvdSB3YW50IHRvIGZpbmQgYSBXZWIgc2VydmljZT8KLUJVVFRPTl9XU19QVUJMSVNIPUxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyIHRvIHB1Ymxpc2ggdGhpcyBXZWIgc2VydmljZSB0byBhIFVEREkgUmVnaXN0cnkKLUJVVFRPTl9XU19QVUJMSVNIX1BSSVZBVEVfVUREST1MYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciB0byBwdWJsaXNoIHRoaXMgV2ViIHNlcnZpY2UgdG8gdGhlIFVuaXQgVGVzdCBVRERJIFJlZ2lzdHJ5Ci1CVVRUT05fV1NfRklORD1MYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciB0byBmaW5kIGEgV2ViIHNlcnZpY2UgZnJvbSBhIFVEREkgUmVnaXN0cnkKLUJVVFRPTl9XU19GSU5EX1BSSVZBVEVfVUREST1MYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciB0byBmaW5kIGEgV2ViIHNlcnZpY2UgZnJvbSB0aGUgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkKLUxBQkVMX1BVQkxJQ19VRERJX1JFR0lTVFJJRVM9UHVibGljIFVEREkgUmVnaXN0cnkKLQotIwotIyBFSkIgVUkgc3RyaW5ncwotIwotTEFCRUxfRUpCX0JFQU5fTkFNRT1FSkIgYmVhbgotVEFCTEVfVElUTEVfRUpCX0JFQU5fTkFNRVM9U3RhdGVsZXNzIEVKQiBiZWFucwotVEFCTEVfVElUTEVfRUpCX1BST0pFQ1RfTkFNRT1FSkIgcHJvamVjdAotTEFCRUxfRUFSX1BST0pFQ1RTPUVBUiBwcm9qZWN0cwotVE9PTFRJUF9FQVJfUFJPSkVDVFM9RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cy4KLVRPT0xUSVBfVEFCTEVfQkVBTl9OQU1FUz1TZWxlY3QgYW4gRUpCLgotCi0jCi0jIFRvb2x0aXBzIGZvciBXZWJTZXJ2aWNlV1NETFNlbGVjdGlvblBhZ2UKLSMKLVRPT0xUSVBfUFdXU19QQUdFPQotCi0jCi0jIFRvb2x0aXBzIGZvciBiZWFucy5XZWJTZXJ2aWNlQmVhbkNsYXNzUGFnZQotIwotVE9PTFRJUF9QQkNMX1BBR0U9Ci1UT09MVElQX1BCQ0xfVEVYVF9CRUFOX0NMQVNTPVNlbGVjdGVkIEphdmEgYmVhbi4KLVRPT0xUSVBfUEJDTF9CVVRUT05fQkVBTl9DTEFTU19CUk9XU0U9QnJvd3NlIGNsYXNzZXMuCi1UT09MVElQX1BCQ0xfQlVUVE9OX0JFQU5fUkVTT1VSQ0VfQlJPV1NFPUJyb3dzZSBKYXZhIGZpbGVzLgotCi0KLSMKLSMgVG9vbHRpcHMgZm9yIGJlYW5zLldlYlNlcnZpY2VUZXN0UGFnZQotIwotVE9PTFRJUF9QU1RQX0NPTUJPQk9YX1RFU1Q9VGVzdCBmYWNpbGl0aWVzIGF2YWlsYWJsZSB0byB0ZXN0IHRoZSBzZXJ2aWNlLgotVE9PTFRJUF9QU1RQX0xBVU5DSF9CVVRUT049TGF1bmNoIHRoZSBzZWxlY3RlZCB0ZXN0IGZhY2lsaXR5LgotCi0KLQotCi0jCi0jIFRvb2x0aXBzIGZvciBXZWJTZXJ2aWNlUnVudGltZVNlbGVjdGlvblBhZ2UKLSMKLVRPT0xUSVBfUFdSU19QQUdFPQotVE9PTFRJUF9QV1JTX0xJU1RfUlVOVElNRVM9U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBkZXBsb3ltZW50IHJ1bnRpbWUocykuCi1UT09MVElQX1BXUlNfTElTVF9TRVJWRVJTPVNlbGVjdCBmcm9tIGFwcGxpY2F0aW9uIHNlcnZlcihzKS4KLVRPT0xUSVBfUFdSU19SQURJT19TRVJWRVI9U2VydmVyIG9yaWVudGVkIHNlbGVjdGlvbi4KLVRPT0xUSVBfUFdSU19SQURJT19SVU5USU1FPVJ1bnRpbWUgcHJvdG9jb2wgb3JpZW50ZWQgc2VsZWN0aW9uLgotVE9PTFRJUF9QV1JTX1JBRElPX0VYUExPUkU9RXhwbG9yZSBjb21iaW5hdGlvbnMuCi1UT09MVElQX1BXUlNfQ09NQk9fUFJPSkVDVD1XZWIgcHJvamVjdC4KLQotIwotIyBUb29sdGlwcyBmb3IgV2ViU2VydmljZUNsaWVudFJ1bnRpbWVTZWxlY3Rpb25QYWdlCi0jCi1UT09MVElQX1BXQ1JfQ09NQk9fQ0xJRU5UX1RZUEU9Q2xpZW50IHR5cGUuCi0KLQotIwotIyBUb29sdGlwcyBmb3IgV2ViU2VydmljZVByb2plY3RQYWdlCi0jCi1UT09MVElQX1BXUFJfQ09NQk9fVFlQRT1XZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0eXBlLgotVE9PTFRJUF9QV1BSX0dST1VQX1NDRU5BUklPX1NFUlZJQ0U9U2VydmljZSBkZWZhdWx0cyBmb3IgdGhpcyB3aXphcmQgc2NlbmFyaW8uCi1UT09MVElQX1BXUFJfQ0hFQ0tCT1hfR0VORVJBVEVfUFJPWFk9RW5hYmxlL2Rpc2FibGUgcHJveHkgZ2VuZXJhdGlvbiBmb3IgdGhpcyBzY2VuYXJpby4KLVRPT0xUSVBfUFdQUl9DSEVDS0JPWF9TVEFSVF9XRUJfUFJPSkVDVD1TdGFydCBXZWIgc2VydmljZSBpbiBXZWIgcHJvamVjdCBmb3IgdGhpcyBzY2VuYXJpby4KLVRPT0xUSVBfUFdQUl9DSEVDS0JPWF9MQVVOQ0hfV1M9TGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIgdG8gcHVibGlzaCB0aGUgV2ViIHNlcnZpY2UgaW4gdGhpcyBzY2VuYXJpbyB0byBhIFVEREkgUmVnaXN0cnkuCi1UT09MVElQX1BXUFJfQ0hFQ0tCT1hfVEVTVF9TRVJWSUNFPVNlbGVjdCB0aGlzIHRvIGV4cGxvcmUgdGhlIFdlYiBzZXJ2aWNlIGNyZWF0ZWQuCi1UT09MVElQX1BXUFJfQ0hFQ0tCT1hfTU9OSVRPUl9TRVJWSUNFPVNlbGVjdCB0aGlzIHRvIG1vbml0b3IgdGhlIFNPQVAgdHJhZmZpY3Mgb2YgdGhpcyBXZWIgc2VydmljZS4KLVRPT0xUSVBfUFdQUl9HUk9VUF9TQ0VOQVJJT19DTElFTlQ9Q2xpZW50IHByb3h5IGRlZmF1bHRzIGZvciB0aGlzIHdpemFyZCBzY2VuYXJpby4KLVRPT0xUSVBfUFdQUl9DT01CT19DTElFTlRUWVBFPUNsaWVudCBwcm94eSBzZWxlY3Rpb24gdHlwZS4KLQotIwotIyBUb29sdGlwcyBmb3IgV2ViU2VydmljZVB1Ymxpc2hQYWdlCi0jCi1UT09MVElQX1BXUEJfUEFHRT0KLVRPT0xUSVBfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0g9UHVibGlzaCB0aGUgV2ViIHNlcnZpY2UuCi0KLQotIwotIyBXU0lMIHByb3h5Ci0jCi0KLVBBR0VfV1NJTF9JTVBPUlQ9V1NJTCBJbXBvcnQgUGFnZQotVElUTEVfV1NJTF9JTVBPUlQ9V1NJTCBJbXBvcnQKLURFU0NfV1NJTF9JTVBPUlQ9SW1wb3J0IFdTREwgcmVmZXJlbmNlcyB0byBhIFdTSUwgZG9jdW1lbnQKLVBBR0VfVElUTEVfV1NfU0VMRUNUSU9OPVdlYiBTZXJ2aWNlIFNlbGVjdGlvbiBQYWdlCi1QQUdFX0RFU0NfV1NfU0VMRUNUSU9OPUVudGVyIGEgd2ViIHNlcnZpY2UgVVJJLgotCi1QQUdFX01TR19MT0FESU5HX1dFQl9TRVJWSUNFX1VSST1Mb2FkaW5nIFdlYiBzZXJ2aWNlIFVSSS4uLgotUEFHRV9NU0dfSU5WQUxJRF9XRUJfU0VSVklDRV9VUkk9SW52YWxpZCBXZWIgc2VydmljZSBVUkkuICBFbnRlciBhbiBVUkkgdG8gYSBXU0RMLCBXU0lMIG9yIEhUTUwgZG9jdW1lbnQuCi1QQUdFX01TR19OT19TVUNIX0ZJTEU9RmlsZSAiezB9IiBkb2VzIG5vdCBleGlzdHMuCi1QQUdFX01TR19TRUxFQ1RJT05fTVVTVF9CRV9XU0RMPVNlbGVjdGlvbiBtdXN0IGJlIFdTREwuCi1QQUdFX01TR19JTlZBTElEX1dTSUxfRklMRV9OQU1FPUludmFsaWQgV1NJTCBmaWxlIG5hbWUuICBXU0lMIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIC53c2lsCi0KLQotCi1NU0dfRVJST1JfVVJJX05PVF9SRVNPTFZBQkxFPUlXQUIwNDY5RSAiezB9IiBpcyBub3QgcmVzb2x2YWJsZS4KLU1TR19FUlJPUl9XU0RMX0hBU19OT19TRVJWSUNFX0VMRU1FTlQ9SVdBQjA1NTFFIFdTREwgZmlsZSBhdCB7MH0gaGFzIG5vIHNlcnZpY2UgZWxlbWVudC4KLQotTEFCRUxfV1NJTF9VUkk9V1NJTCBVUkk6Ci1MQUJFTF9CUk9XU0U9QnJvd3NlCi1MQUJFTF9XU0RMPVdTREw6Ci1MQUJFTF9XU0RMX1VSST1XU0RMIFVSSQotTEFCRUxfSU1QT1JUPUltcG9ydC4uLgotTEFCRUxfQUREPUFkZAotTEFCRUxfUkVNT1ZFPVJlbW92ZQotTEFCRUxfV1NfU0VMRUNUSU9OPUVudGVyIGFuIFVSSSB0byBhIFdTREwsIFdTSUwgb3IgSFRNTCBkb2N1bWVudDoKLUxBQkVMX1NFTEVDVF9XU0RMPVNlbGVjdCBhIFdTREwKLQotCi1UT09MVElQX1dTSUxfSU1QT1JUX1BBR0U9VGhpcyBwYWdlIGFsbG93cyB5b3UgdG8gYWRkIFdTREwgcmVmZXJlbmNlcyB0byBhIFdTSUwgZG9jdW1lbnQuCi1UT09MVElQX1dTSUxfVEVYVF9XU0lMPUVudGVyIHRoZSBsb2NhdGlvbiBvZiBhIG5ldyBvciBleGlzdGluZyBXU0lMIGRvY3VtZW50LgotVE9PTFRJUF9XU0lMX0JVVFRPTl9CUk9XU0VfV1NJTD1Ccm93c2UgZm9yIGEgV1NJTCBkb2N1bWVudC4KLVRPT0xUSVBfV1NJTF9UQUJMRV9XU0RMPUVudGVyIHRoZSBVUklzIG9mIHRoZSBXU0RMcyB0aGF0IGFyZSBnb2luZyB0byBiZSBhZGRlZCBhcyBzZXJ2aWNlIHJlZmVyZW5jZXMuCi1UT09MVElQX1BDT05fUEFHRT1TZWxlY3QgYSB3ZWIgc2VydmljZSBmb3IgY29uc3VtcHRpb24uCi1UT09MVElQX1BDT05fVEVYVF9XUz1FbnRlciBhbiBVUkkgdG8gYSBXU0RMLCBXU0lMIG9yIEhUTUwgZG9jdW1lbnQuCi1UT09MVElQX1BDT05fQlVUVE9OX0JST1dTRV9XUz1Ccm93c2UgZm9yIGEgd2ViIHNlcnZpY2UgcmVzb3VyY2UuCi0KLSMKLSMgVG9vbHRpcHMgZm9yIGNsaWVudC5XZWJTZXJ2aWNlQ2xpZW5UZXN0UGFnZQotIwotVE9PTFRJUF9QV1NNX1BBR0U9Ci1UT09MVElQX1BXU01fQ0hFQ0tCT1hfVEVTVD1FbmFibGUvZGlzYWJsZSBUZXN0LgotVE9PTFRJUF9QV1NNX0NPTUJPQk9YX1RFU1Q9U2VsZWN0IHRoZSB0ZXN0IHR5cGUuCi1UT09MVElQX1BXU01fQ0hFQ0tCT1hfTEFVTkNIPVJ1biB0ZXN0IG9uIGEgc2VydmVyLgotVE9PTFRJUF9QV1NNX1RFWFRfSlNQX0ZPTERFUj1EZXN0aW5hdGlvbiBmb2xkZXIgb2YgZ2VuZXJhdGVkIHNhbXBsZSBmaWxlcy4KLVRPT0xUSVBfUFdTTV9CVVRUT05fSlNQX0ZPTERFUl9CUk9XU0U9QnJvd3NlIGZvbGRlcnMuCi1UT09MVElQX1BXU01fQlVUVE9OX1NFTEVDVF9BTEw9U2VsZWN0IGFsbCBtZXRob2RzLgotVE9PTFRJUF9QV1NNX0JVVFRPTl9ERVNFTEVDVF9BTEw9RGVzZWxlY3QgYWxsIG1ldGhvZHMuCi1UT09MVElQX1BXU01fQ09NQk9fUFJPSkVDVD1XZWIgcHJvamVjdCBmb3IgZ2VuZXJhdGVkIHNhbXBsZS4KLVRPT0xUSVBfUFdTTV9URVhUX1NBTVBMRV9GT0xERVI9RGVzdGluYXRpb24gZm9sZGVyIG9mIGdlbmVyYXRlZCBzYW1wbGUgZmlsZXMuCi1UT09MVElQX1BXU01fVFJFRV9NRVRIT0RTPU1ldGhvZHMgdG8gZ2VuZXJhdGUgaW50byB0aGUgc2FtcGxlLgotVE9PTFRJUF9QV1NNX0VBUl9QUk9KRUNUPUVBUiBwcm9qZWN0IGZvciB0aGUgZ2VuZXJhdGVkIHNhbXBsZS4KLQotIwotIyBIVFRQIEJhc2ljIEF1dGgKLSMKLURJQUxPR19USVRMRV9IVFRQX0JBU0lDX0FVVEg9SFRUUCBCYXNpYyBBdXRoZW50aWNhdGlvbgotTEFCRUxfVVJMPVVSTDoKLUxBQkVMX0hUVFBfQkFTSUNfQVVUSF9VU0VSTkFNRT1Vc2VyIG5hbWU6Ci1MQUJFTF9IVFRQX0JBU0lDX0FVVEhfUEFTU1dPUkQ9UGFzc3dvcmQ6Ci0KLVRPT0xUSVBfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FPUVudGVyIHlvdXIgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiB1c2VyIG5hbWUuCi1UT09MVElQX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRD1FbnRlciB5b3VyIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24gcGFzc3dvcmQuCi0KLSMKLSMgV2ViIFNlcnZpY2UgU2VydmVyIFJ1bnRpbWUgVHlwZQotIwotCi0KLSMKLSMgQ2xpZW50IHByb2plY3QgdHlwZQotIwotCi0jCi0jIEdlbmVyYXRlIEhhbmRsZXIgU2tlbGV0b24KLSMKLVRBU0tfTEFCRUxfR0VOX0hBTkRMRVJfU0tFTEVUT049R2VuZXJhdGUgaGFuZGxlciBza2VsZXRvbiBjb21tYW5kCi1UQVNLX0RFU0NfR0VOX0hBTkRMRVJfU0tFTEVUT049R2VuZXJhdGUgaGFuZGxlciBza2VsZXRvbiBjb21tYW5kCi1NU0dfRVJST1JfR0VORVJBVEVfSEFORExFUl9TS0VMRVRPTj1JV0FCMDM1OUUgRXJyb3IgaW4gZ2VuZXJhdGluZyBoYW5kbGVyIHNrZWxldG9uLgotTVNHX0VSUk9SX1dSSVRFX0ZJTEU9SVdBQjAzNjBFIEVycm9yIGluIHdyaXRpbmcgZmlsZSB7MH0uCi0KLSMKLSMgSGFuZGxlcnMgQ29uZmlndXJhdGlvbiB3aXphcmQgcGFnZQotIwotTEFCRUxfSEFORExFUlNfQ09ORklHPUhhbmRsZXIgQ29uZmlndXJhdGlvbgotTEFCRUxfQlVUVE9OX0FERD1BZGQKLUxBQkVMX0JVVFRPTl9SRU1PVkU9UmVtb3ZlCi1MQUJFTF9CVVRUT05fTU9WRV9VUD1Nb3ZlIFVwCi1MQUJFTF9CVVRUT05fTU9WRV9ET1dOPU1vdmUgRG93bgotTEFCRUxfQlVUVE9OX0dFTl9TS0VMRVRPTj1HZW5lcmF0ZSBza2VsZXRvbiBjbGFzc2VzIGZvciBuZXcgaGFuZGxlcnMKLUxBQkVMX0NPTUJPX1NPVVJDRV9MT0M9T3V0cHV0IGZvbGRlcjoKLUxBQkVMX0NPTUJPX1dTX0NMSUVOVF9SRUY9Q2xpZW50IFNlcnZpY2UgUmVmZXJlbmNlOgotTEFCRUxfQ09NQk9fV1NfU0VSVklDRV9ERVNDPVNlcnZpY2UgRGVzY3JpcHRpb246Ci0KLUxBQkVMX0hBTkRMRVJfTkFNRT1OYW1lCi1MQUJMRV9IQU5ETEVSX0NMQVNTPUNsYXNzIE5hbWUKLUxBQkVMX0hBTkRMRVJfUE9SVD1Qb3J0IE5hbWUKLQotRElBTE9HX1RJVExFX1dTX0FERF9IQU5ETEVSPUFkZCBOZXcgSGFuZGxlcgotTEFCRUxfVEVYVF9IQU5ETEVSX05BTUU9TmFtZToKLUxBQkVMX1RFWFRfSEFORExFUl9DTEFTUz1DbGFzcyBuYW1lOgotTEFCRUxfVEVYVF9IQU5ETEVSX1BPUlQ9UG9ydCBuYW1lOgotCi1QQUdFX1RJVExFX1NFUlZJQ0VfSERMUl9DT05GSUc9U2VydmljZSBIYW5kbGVycyBDb25maWd1cmF0aW9uCi1QQUdFX0RFU0NfU0VSVklDRV9IRExSX0NPTkZJRz1Db25maWd1cmUgc2VydmljZS1zaWRlIGhhbmRsZXJzCi1QQUdFX1RJVExFX0NMSUVOVF9IRExSX0NPTkZJRz1DbGllbnQgSGFuZGxlcnMgQ29uZmlndXJhdGlvbgotUEFHRV9ERVNDX0NMSUVOVF9IRExSX0NPTkZJRz1Db25maWd1cmUgY2xpZW50LXNpZGUgaGFuZGxlcnMKLQotVE9PTFRJUF9FRElUX1dTX0hBTkRMRVJTPUNvbmZpZ3VyZSBXZWIgU2VydmljZSBIYW5kbGVycwotVE9PTFRJUF9CVVRUT05fR0VOX1NLRUxFVE9OPVNlbGVjdCB0byBnZW5lcmF0ZSBza2VsZXRvbiBjbGFzc2VzIGZvciBuZXcgaGFuZGxlcnMuCi1UT09MVElQX0NPTUJPX1NPVVJDRV9MT0M9U2VsZWN0IHRoZSBvdXRwdXQgbG9jYXRpb24gZm9yIGZpbGUgZ2VuZXJhdGlvbi4KLVRPT0xUSVBfVEVYVF9IQU5ETEVSX05BTUU9SGFuZGxlciBuYW1lCi1UT09MVElQX1RFWFRfSEFORExFUl9DTEFTUz1IYW5kbGVyIGNsYXNzIG5hbWUKLVRPT0xUSVBfVEVYVF9IQU5ETEVSX1BPUlQ9SGFuZGxlciBwb3J0IGNvbXBvbmVudCBuYW1lCi1UT09MVElQX1dTX0NMSUVOVF9SRUY9U2VsZWN0IGEgY2xpZW50IHNlcnZpY2UtcmVmZXJlbmNlIHRvIHNob3cgaXRzIGhhbmRsZXJzLgotVE9PTFRJUF9XU19TRVJWSUNFX0RFU0M9U2VsZWN0IGEgc2VydmljZSBkZXNjcmlwdGlvbiB0byBzaG93IGl0cyBoYW5kbGVycy4KLQotIwotIyBPcGVuSmF2YUVkaXRvckNvbW1hbmQKLSMKLU1TR19FUlJPUl9VTkFCTEVfVE9fT1BFTl9KQVZBX0VESVRPUj1JV0FCMDAyOUUgVW5hYmxlIHRvIG9wZW4gY2xhc3MgezB9IGZyb20gcHJvamVjdCB7MX0gaW4gdGhlIEphdmEgZWRpdG9yLgotCi0jCi0jIENoZWNrSWZTZXJ2aWNlUHJvamVjdAotIyAKLU1TR19XQVJOX0lTX1NFUlZJQ0VfUFJPSkVDVD1UaGUgc2VsZWN0ZWQgY2xpZW50IHByb2plY3QsIHswfSwgY29udGFpbnMgdGhlIFdlYiBzZXJ2aWNlLiBQcm9jZWVkaW5nIHdpdGggdGhpcyBjb25maWd1cmF0aW9uIG1heSByZXN1bHQgaW4gcnVudGltZSBlcnJvcnMgd2hlbiBpbnZva2luZyB0aGUgV2ViIHNlcnZpY2UuIFdvdWxkIHlvdSBsaWtlIHRvIHByb2NlZWQ/Ci1NU0dfVVNFUl9BQk9SVEVEPVVzZXIgcHJlc3NlZCBjYW5jZWwgaW4gd2FybmluZyBkaWFsb2cgd2hpY2ggd2FybmVkIGFib3V0IHRoZSBzZWxlY3RlZCBjbGllbnQgcHJvamVjdCBiZWluZyB0aGUgc2VydmljZSBwcm9qZWN0LgotCi0KLSMKLSMgTWlzc2luZyB0aGlyZCBwYXJ0eSBmaWxlIGVycm9yIG1lc3NhZ2UKLSMKLU1TR19NSVNTSU5HX1RISVJEX1BBUlRZX0ZJTEVTPU1pc3NpbmcgdGhpcmQgcGFydHkgZmlsZXMuICBSZWZlciB0byBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL3dzL2Rvd25sb2FkX2luc3RydWN0aW9uc19mb3JfamFycy5odG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9iYXJuZXkvQmFybmV5V2ViU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9iYXJuZXkvQmFybmV5V2ViU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWM3YTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYmFybmV5L0Jhcm5leVdlYlNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5iYXJuZXk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuQWJzdHJhY3RXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZUluZm87Ci0KLXB1YmxpYyBjbGFzcyBCYXJuZXlXZWJTZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlCi17Ci0JCi0KLQlwdWJsaWMgQmFybmV5V2ViU2VydmljZShXZWJTZXJ2aWNlSW5mbyBpbmZvKQotCXsKLQkJc3VwZXIoaW5mbyk7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwKLQkJCUlTZWxlY3Rpb24gc2VsLCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKQotCXsKLQkJVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCQljb21tYW5kcy5hZGQobmV3IFRlc3RDb21tYW5kMyh0aGlzKSk7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCX0KLQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpCi0JewotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgVGVzdENvbW1hbmQ0KHRoaXMpKTsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeShjb21tYW5kcyk7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpCi0JewotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgVGVzdENvbW1hbmQxKHRoaXMpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBUZXN0Q29tbWFuZDIodGhpcykpOwotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcikKLQl7Ci0JCVZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBUZXN0Q29tbWFuZDUodGhpcykpOwotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IHJ1bihFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKQotCXsKLQkJVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCQljb21tYW5kcy5hZGQobmV3IFRlc3RDb21tYW5kNih0aGlzKSk7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCX0KLQkKLSBwcml2YXRlIGNsYXNzIFRlc3RDb21tYW5kMSBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLQl7Ci0JIElXZWJTZXJ2aWNlIHdzOwotCSBwdWJsaWMgVGVzdENvbW1hbmQxKElXZWJTZXJ2aWNlIHdzKQotCSB7Ci0JCSB0aGlzLndzPXdzOwotCSB9Ci0JIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBiYXJuZXkgZGV2ZWxvcCBjb21tYW5kIDEiKTsKLQkJd3MuZ2V0V2ViU2VydmljZUluZm8oKS5zZXRXc2RsVVJMKCJodHRwOi8vc29tZVdTRExVUkwiKTsKLQkJcmV0dXJuIHN1cGVyLmV4ZWN1dGUoZW52KTsKLQkgfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGVzdENvbW1hbmQyIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotCXsKLQkJIElXZWJTZXJ2aWNlIHdzOwotCQkgcHVibGljIFRlc3RDb21tYW5kMihJV2ViU2VydmljZSB3cykKLQkJIHsKLQkJCSB0aGlzLndzPXdzOwotCQkgfQotCQkgCi0JCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JCXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW4gYmFybmV5IGRldmVsb3AgY29tbWFuZCAyIik7Ci0JCQl3cy5nZXRXZWJTZXJ2aWNlSW5mbygpLnNldEltcGxVUkwoImZpbGU6Ly9zb21lSW1wbFVSTCIpOwotCQkJcmV0dXJuIHN1cGVyLmV4ZWN1dGUoZW52KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFRlc3RDb21tYW5kMyBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLQl7Ci0JCSBJV2ViU2VydmljZSB3czsKLQkJIHB1YmxpYyBUZXN0Q29tbWFuZDMoSVdlYlNlcnZpY2Ugd3MpCi0JCSB7Ci0JCQkgdGhpcy53cz13czsKLQkJIH0KLQkJIAotCQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCQl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkluIGJhcm5leSBhc3NlbWJsZSBjb21tYW5kIik7Ci0JCQlyZXR1cm4gc3VwZXIuZXhlY3V0ZShlbnYpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgVGVzdENvbW1hbmQ0IGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotCXsKLQkJIElXZWJTZXJ2aWNlIHdzOwotCQkgcHVibGljIFRlc3RDb21tYW5kNChJV2ViU2VydmljZSB3cykKLQkJIHsKLQkJCSB0aGlzLndzPXdzOwotCQkgfQotCQkgCi0JCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JCXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW4gYmFybmV5IGRlcGxveSBjb21tYW5kIik7Ci0JCQl3cy5nZXRXZWJTZXJ2aWNlSW5mbygpLnNldEVuZFBvaW50VVJMKCJodHRwOi8vc29tZUVuZHBvaW50VVJMIik7Ci0JCQlyZXR1cm4gc3VwZXIuZXhlY3V0ZShlbnYpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgVGVzdENvbW1hbmQ1IGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotCXsKLQkJIElXZWJTZXJ2aWNlIHdzOwotCQkgcHVibGljIFRlc3RDb21tYW5kNShJV2ViU2VydmljZSB3cykKLQkJIHsKLQkJCSB0aGlzLndzPXdzOwotCQkgfQotCQkgCi0JCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JCXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW4gYmFybmV5IGluc3RhbGwgY29tbWFuZCIpOwotCQkJcmV0dXJuIHN1cGVyLmV4ZWN1dGUoZW52KTsKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q29tbWFuZDYgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi0JewotCQkgSVdlYlNlcnZpY2Ugd3M7Ci0JCSBwdWJsaWMgVGVzdENvbW1hbmQ2KElXZWJTZXJ2aWNlIHdzKQotCQkgewotCQkJIHRoaXMud3M9d3M7Ci0JCSB9Ci0JCSAKLQkJcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQkJewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBiYXJuZXkgcnVuIGNvbW1hbmQiKTsKLQkJCXJldHVybiBzdXBlci5leGVjdXRlKGVudik7Ci0JCX0KLQl9CQotfQkKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9iYXJuZXkvQmFybmV5V2ViU2VydmljZUNsaWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9iYXJuZXkvQmFybmV5V2ViU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjUxZDM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYmFybmV5L0Jhcm5leVdlYlNlcnZpY2VDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5iYXJuZXk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZUNsaWVudEluZm87Ci0KLXB1YmxpYyBjbGFzcyBCYXJuZXlXZWJTZXJ2aWNlQ2xpZW50IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50Ci17CQkKLQotCXB1YmxpYyBCYXJuZXlXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm8pCi0JewotCQlzdXBlcihpbmZvKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwKLQkJCUlTZWxlY3Rpb24gc2VsLCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKQotCXsKLQkJVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCQljb21tYW5kcy5hZGQobmV3IFRlc3RDb21tYW5kMyh0aGlzKSk7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCX0KLQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpCi0JewotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgVGVzdENvbW1hbmQ0KHRoaXMpKTsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeShjb21tYW5kcyk7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpCi0JewotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgVGVzdENvbW1hbmQxKHRoaXMpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBUZXN0Q29tbWFuZDIodGhpcykpOwotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcikKLQl7Ci0JCVZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBUZXN0Q29tbWFuZDUodGhpcykpOwotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IHJ1bihFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKQotCXsKLQkJVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCQljb21tYW5kcy5hZGQobmV3IFRlc3RDb21tYW5kNih0aGlzKSk7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCX0KLQotCSBwcml2YXRlIGNsYXNzIFRlc3RDb21tYW5kMSBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLQkJewotCQkgSVdlYlNlcnZpY2VDbGllbnQgd3M7Ci0JCSBwdWJsaWMgVGVzdENvbW1hbmQxKElXZWJTZXJ2aWNlQ2xpZW50IHdzKQotCQkgewotCQkJIHRoaXMud3M9d3M7Ci0JCSB9Ci0JCSBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCQkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBiYXJuZXkgY2xpZW50IGRldmVsb3AgY29tbWFuZCAxIik7Ci0JCQlyZXR1cm4gc3VwZXIuZXhlY3V0ZShlbnYpOwotCQkgfQotCQl9Ci0KLQkJcHJpdmF0ZSBjbGFzcyBUZXN0Q29tbWFuZDIgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi0JCXsKLQkJCSBJV2ViU2VydmljZUNsaWVudCB3czsKLQkJCSBwdWJsaWMgVGVzdENvbW1hbmQyKElXZWJTZXJ2aWNlQ2xpZW50IHdzKQotCQkJIHsKLQkJCQkgdGhpcy53cz13czsKLQkJCSB9Ci0JCQkgCi0JCQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCQkJewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW4gYmFybmV5IGNsaWVudCBkZXZlbG9wIGNvbW1hbmQgMiIpOwotCQkJCXJldHVybiBzdXBlci5leGVjdXRlKGVudik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgY2xhc3MgVGVzdENvbW1hbmQzIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotCQl7Ci0JCQkgSVdlYlNlcnZpY2VDbGllbnQgd3M7Ci0JCQkgcHVibGljIFRlc3RDb21tYW5kMyhJV2ViU2VydmljZUNsaWVudCB3cykKLQkJCSB7Ci0JCQkJIHRoaXMud3M9d3M7Ci0JCQkgfQotCQkJIAotCQkJcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQkJCXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkluIGJhcm5leSBjbGllbnQgYXNzZW1ibGUgY29tbWFuZCIpOwotCQkJCXJldHVybiBzdXBlci5leGVjdXRlKGVudik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgY2xhc3MgVGVzdENvbW1hbmQ0IGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotCQl7Ci0JCQkgSVdlYlNlcnZpY2VDbGllbnQgd3M7Ci0JCQkgcHVibGljIFRlc3RDb21tYW5kNChJV2ViU2VydmljZUNsaWVudCB3cykKLQkJCSB7Ci0JCQkJIHRoaXMud3M9d3M7Ci0JCQkgfQotCQkJIAotCQkJcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQkJCXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkluIGJhcm5leSBjbGllbnQgZGVwbG95IGNvbW1hbmQiKTsKLQkJCQlyZXR1cm4gc3VwZXIuZXhlY3V0ZShlbnYpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIGNsYXNzIFRlc3RDb21tYW5kNSBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLQkJewotCQkJIElXZWJTZXJ2aWNlQ2xpZW50IHdzOwotCQkJIHB1YmxpYyBUZXN0Q29tbWFuZDUoSVdlYlNlcnZpY2VDbGllbnQgd3MpCi0JCQkgewotCQkJCSB0aGlzLndzPXdzOwotCQkJIH0KLQkJCSAKLQkJCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JCQl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBiYXJuZXkgY2xpZW50IGluc3RhbGwgY29tbWFuZCIpOwotCQkJCXJldHVybiBzdXBlci5leGVjdXRlKGVudik7Ci0JCQl9Ci0JCX0JCi0JCQotCQlwcml2YXRlIGNsYXNzIFRlc3RDb21tYW5kNiBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLQkJewotCQkJIElXZWJTZXJ2aWNlQ2xpZW50IHdzOwotCQkJIHB1YmxpYyBUZXN0Q29tbWFuZDYoSVdlYlNlcnZpY2VDbGllbnQgd3MpCi0JCQkgewotCQkJCSB0aGlzLndzPXdzOwotCQkJIH0KLQkJCSAKLQkJCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JCQl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBiYXJuZXkgY2xpZW50IHJ1biBjb21tYW5kIik7Ci0JCQkJcmV0dXJuIHN1cGVyLmV4ZWN1dGUoZW52KTsKLQkJCX0KLQkJfQkJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2Jhcm5leS9CYXJuZXlXZWJTZXJ2aWNlUnVudGltZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9iYXJuZXkvQmFybmV5V2ViU2VydmljZVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhN2JlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2Jhcm5leS9CYXJuZXlXZWJTZXJ2aWNlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYmFybmV5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLQotcHVibGljIGNsYXNzIEJhcm5leVdlYlNlcnZpY2VSdW50aW1lIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZQotewotCi0JcHVibGljIElXZWJTZXJ2aWNlIGdldFdlYlNlcnZpY2UoV2ViU2VydmljZUluZm8gaW5mbykKLQl7Ci0gICAgcmV0dXJuIG5ldyBCYXJuZXlXZWJTZXJ2aWNlKGluZm8pOwotCX0KLQotCXB1YmxpYyBJV2ViU2VydmljZUNsaWVudCBnZXRXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm8pCi0JewotCQlyZXR1cm4gbmV3IEJhcm5leVdlYlNlcnZpY2VDbGllbnQoaW5mbyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2Jhcm5leS9CYXJuZXlXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2Jhcm5leS9CYXJuZXlXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNGM0ZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9iYXJuZXkvQmFybmV5V2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmJhcm5leTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCYXJuZXlXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgQnV0dG9uIGNoZWNrQm94XzsKLQlwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdpZGdldDFfOwotCXByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Ml87Ci0JCi0JcHVibGljIEJhcm5leVdpZGdldEZhY3RvcnkoKQotCXsKLQkJd2lkZ2V0MV8gPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsJCQotCQl3aWRnZXQxXy5zZXREZXNjcmlwdGlvbiggIkJhcm5leSBFeHRlbnRpb25zIGRlc2MgMSIgKTsKLQkJd2lkZ2V0MV8uc2V0VGl0bGUoICJCYXJuZXlFeHRlbnRpb24gdGl0bGUgMSIgKTsKLQkJd2lkZ2V0MV8uc2V0TmFtZSggIkJhcm5leSBFeHRlbnNpb24gbmFtZSAxIiApOwotCQl3aWRnZXQxXy5zZXRGYWN0b3J5KCBnZXRDb250cmlidXRvcjEoKSApOwotCQkKLQkgICAgd2lkZ2V0Ml8gPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLQkJd2lkZ2V0Ml8uc2V0RGVzY3JpcHRpb24oICJCYXJuZXkgRXh0ZW50aW9ucyBkZXNjIDIiICk7Ci0JCXdpZGdldDJfLnNldFRpdGxlKCAiQmFybmV5IEV4dGVudGlvbiB0aXRsZSAyIiApOwotCQl3aWRnZXQyXy5zZXROYW1lKCAiQmFybmV5IEV4dGVuc2lvbiBuYW1lIDIiICk7Ci0JCXdpZGdldDJfLnNldEZhY3RvcnkoIGdldENvbnRyaWJ1dG9yMigpICk7Ci0JfQotCQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCkgCi0JewotCSAgcmV0dXJuIHdpZGdldDFfOwotCX0KLQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSAKLQl7Ci0JICByZXR1cm4gd2lkZ2V0Q29udHJpYnV0b3IgPT0gd2lkZ2V0MV8gJiYgY2hlY2tCb3hfLmdldFNlbGVjdGlvbigpID8gd2lkZ2V0Ml8gOiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBnZXRDb250cmlidXRvcjEoKQotCXsKLQkgIHJldHVybiBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLQkgIHsKLQotCQlwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkJewotCQkgIHJldHVybiBuZXcgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yKCkKLQkJICB7Ci0JCSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgCi0JCSAgICB7Ci0JCQkgIGNoZWNrQm94XyA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULkNIRUNLICk7Ci0JCQkgIGNoZWNrQm94Xy5zZXRUZXh0KCAiQmFybmV5IERpc3BsYXkgbmV4dCBwYWdlPyIgKTsKLQkJCSAgY2hlY2tCb3hfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgewotCQkJCQkJCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgCi0JCQkJCQkJCQkJCQl7Ci0JCQkJCQkJCQkJCQkgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KCBudWxsICk7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0JCQkgIAotCQkJICByZXR1cm4gdGhpczsKLQkJICAgIH0KLQotCQkgICAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSAKLQkJICAgIHsKLQkJCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCQkgICAgfQotCQkgIH07Ci0JCX0gIAotCSAgfTsKLQl9Ci0JCi0JcHJpdmF0ZSBXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZ2V0Q29udHJpYnV0b3IyKCkKLQl7Ci0JICByZXR1cm4gbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0JICB7Ci0KLQkJcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0JCXsKLQkJICByZXR1cm4gbmV3IFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcigpCi0JCSAgewotCQkgICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIAotCQkgICAgewotICAgICAgICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCggcGFyZW50LCBTV1QuTk9ORSApOwotCQkJICBsYWJlbC5zZXRUZXh0KCAiQmFybmV5IE9wdGlvbmFsIHNlY29uZCBwYWdlIiApOwotCQkJICAKLQkJCSAgcmV0dXJuIHRoaXM7Ci0JCSAgICB9Ci0KLQkJICAgIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkgCi0JCSAgICB7Ci0JCQkgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkJICAgIH0KLQkJICB9OwotCQl9ICAKLQkgIH07Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYmFybmV5L0Jhcm5leVdpZGdldEZhY3RvcnkyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2Jhcm5leS9CYXJuZXlXaWRnZXRGYWN0b3J5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2ZlMTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYmFybmV5L0Jhcm5leVdpZGdldEZhY3RvcnkyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYmFybmV5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXRDb250cmlidXRvcjsKLQotcHVibGljIGNsYXNzIEJhcm5leVdpZGdldEZhY3RvcnkyIGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgQnV0dG9uIGNoZWNrQm94XzsKLQlwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdpZGdldDFfOwotCXByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Ml87Ci0JCi0JcHVibGljIEJhcm5leVdpZGdldEZhY3RvcnkyKCkKLQl7Ci0JCXdpZGdldDFfID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7CQkKLQkJd2lkZ2V0MV8uc2V0RGVzY3JpcHRpb24oICJCYXJuZXkyIEV4dGVudGlvbnMgU2Vjb25kIHJvdW5kIGRlc2MgMSIgKTsKLQkJd2lkZ2V0MV8uc2V0VGl0bGUoICJCYXJuZXkyIEV4dGVudGlvbiBTZWNvbmQgcm91bmQgdGl0bGUgMSIgKTsKLQkJd2lkZ2V0MV8uc2V0TmFtZSggIkJhcm5leTIgRXh0ZW5zaW9uIG5hbWUgMSIgKTsKLQkJd2lkZ2V0MV8uc2V0RmFjdG9yeSggZ2V0Q29udHJpYnV0b3IxKCkgKTsKLQkJCi0JICAgIHdpZGdldDJfID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0JCXdpZGdldDJfLnNldERlc2NyaXB0aW9uKCAiQmFybmV5MiBFeHRlbnRpb25zIFNlY29uZCByb3VuZCBkZXNjIDIiICk7Ci0JCXdpZGdldDJfLnNldFRpdGxlKCAiQmFybmV5MiBFeHRlbnRpb24gU2Vjb25kIHJvdW5kICB0aXRsZSAyIiApOwotCQl3aWRnZXQyXy5zZXROYW1lKCAiQmFybmV5MiBFeHRlbnNpb24gbmFtZSAyIiApOwotCQl3aWRnZXQyXy5zZXRGYWN0b3J5KCBnZXRDb250cmlidXRvcjIoKSApOwotCX0KLQkKLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIAotCXsKLQkgIHJldHVybiB3aWRnZXQxXzsKLQl9Ci0KLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KCBJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcikgCi0JewotCSAgcmV0dXJuIHdpZGdldENvbnRyaWJ1dG9yID09IHdpZGdldDFfICYmIGNoZWNrQm94Xy5nZXRTZWxlY3Rpb24oKSA/IHdpZGdldDJfIDogbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZ2V0Q29udHJpYnV0b3IxKCkKLQl7Ci0JICByZXR1cm4gbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0JICB7Ci0KLQkJcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0JCXsKLQkJICByZXR1cm4gbmV3IFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcigpCi0JCSAgewotCQkgICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIAotCQkgICAgewotCQkJICBjaGVja0JveF8gPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5DSEVDSyApOwotCQkJICBjaGVja0JveF8uc2V0VGV4dCggIkJhcm5leTIgRGlzcGxheSBuZXh0IHBhZ2UgYWdhaW4/IiApOwotCQkJICBjaGVja0JveF8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0JCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSAKLQkJCQkJCQkJCQkJCXsKLQkJCQkJCQkJCQkJCSAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQoIG51bGwgKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQkJCSAgCi0JCQkgIHJldHVybiB0aGlzOwotCQkgICAgfQotCi0JCSAgICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpIAotCQkgICAgewotCQkJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JCSAgICB9Ci0JCSAgfTsKLQkJfSAgCi0JICB9OwotCX0KLQkKLQlwcml2YXRlIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBnZXRDb250cmlidXRvcjIoKQotCXsKLQkgIHJldHVybiBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLQkgIHsKLQotCQlwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkJewotCQkgIHJldHVybiBuZXcgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yKCkKLQkJICB7Ci0JCSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgCi0JCSAgICB7Ci0gICAgICAgICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0JCQkgIGxhYmVsLnNldFRleHQoICJCYXJuZXkyIE9wdGlvbmFsIHNlY29uZCByb3VuZCAyIHBhZ2UiICk7Ci0JCQkgIAotCQkJICByZXR1cm4gdGhpczsKLQkJICAgIH0KLQotCQkgICAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSAKLQkJICAgIHsKLQkJCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCQkgICAgfQotCQkgIH07Ci0JCX0gIAotCSAgfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9hY3Rpb24vTGF1bmNoV1NFQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2FjdGlvbi9MYXVuY2hXU0VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxZWM2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2FjdGlvbi9MYXVuY2hXU0VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5MYXVuY2hPcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4cGxvcmVyLnBsdWdpbi5FeHBsb3JlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlRyYW5zaWVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlU3RhdHVzSGFuZGxlcjsKLQotCi1wdWJsaWMgY2xhc3MgTGF1bmNoV1NFQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlCi17Ci0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAgIEVjbGlwc2VTdGF0dXNIYW5kbGVyICAgICAgICAgICAgIGhhbmRsZXIgICAgID0gbmV3IEVjbGlwc2VTdGF0dXNIYW5kbGVyKCk7Ci0gICAgRWNsaXBzZVByb2dyZXNzTW9uaXRvciAgICAgICAgICAgbW9uaXRvciAgICAgPSBuZXcgRWNsaXBzZVByb2dyZXNzTW9uaXRvcigpOwotICAgIFRyYW5zaWVudFJlc291cmNlQ29udGV4dCAgICAgICAgIGNvbnRleHQgICAgID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotICAgIEVjbGlwc2VFbnZpcm9ubWVudCAgICAgICAgICAgICAgIGVudmlyb25tZW50ID0gbmV3IEVjbGlwc2VFbnZpcm9ubWVudCggbnVsbCwgY29udGV4dCwgbW9uaXRvciwgaGFuZGxlciApOyAKLSAgICBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kICAgICAgICBjbWQgICAgICAgICA9IG5ldyBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kKCk7Ci0gICAgCi0gICAgU3RyaW5nIHN0YXRlTG9jYXRpb24gPSBFeHBsb3JlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblN0YXRlTG9jYXRpb24oKTsKLQlMYXVuY2hPcHRpb25bXSBsYXVuY2hPcHRpb25zID0gbmV3IExhdW5jaE9wdGlvbltdIHsKLQkJbmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLlNUQVRFX0xPQ0FUSU9OLHN0YXRlTG9jYXRpb24pCi0JfTsKLSAgICBjbWQuc2V0TGF1bmNoT3B0aW9ucyhsYXVuY2hPcHRpb25zKTsKLQljbWQuZXhlY3V0ZSggZW52aXJvbm1lbnQgKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7ICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsgIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9DaGVja0Zvck1pc3NpbmdGaWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0NoZWNrRm9yTWlzc2luZ0ZpbGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTk1YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0NoZWNrRm9yTWlzc2luZ0ZpbGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5kZXBlbmRlbmN5Y2hlY2tlci5DaGVja01pc3NpbmdGaWxlczsKLQotcHVibGljIGNsYXNzIENoZWNrRm9yTWlzc2luZ0ZpbGVzIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kI2V4ZWN1dGUob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50KQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSAKLSAgewotICAgIFN0YXR1cyAgc3RhdHVzICAgICAgID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICBTdHJpbmcgIHBsdWdpbklkICAgICA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIGJvb2xlYW4gbWlzc2luZ0ZpbGVzID0gQ2hlY2tNaXNzaW5nRmlsZXMuaGFzTWlzc2luZ0ZpbGVzKCBwbHVnaW5JZCApOwotICAgIAotICAgIGlmKCBtaXNzaW5nRmlsZXMgKQotICAgIHsKLSAgICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAgCi0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSggIk1TR19NSVNTSU5HX1RISVJEX1BBUlRZX0ZJTEVTIiApLCBTdGF0dXMuRVJST1IgKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvciggc3RhdHVzICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9DaGVja0ZvclNlcnZpY2VQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0NoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOGM4OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0NoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uVmFsaWRhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3RDaG9pY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBjaGVja3MgdG8gc2VlIGlmIHRoZSBzZWxlY3RlZCBjbGllbnQgcHJvamVjdCBpcyB0aGUKLSAqIHNlcnZpY2UgcHJvamVjdC4gSWYgc28sIHRoZSB1c2VyIGlzIHdhcm5lZC4KLSAqLwotcHVibGljIGNsYXNzIENoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0gIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHJ1bnRpbWUyQ2xpZW50VHlwZXM7Ci0gIFN0cmluZyB3c2RsVVJJOwotICBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgICAKLSAgcHVibGljIENoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kKCkKLSAgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UnVudGltZTJDbGllbnRUeXBlcyggU2VsZWN0aW9uTGlzdENob2ljZXMgcnVudGltZTJDbGllbnRUeXBlcyApCi0gIHsKLSAgICB0aGlzLnJ1bnRpbWUyQ2xpZW50VHlwZXMgPSBydW50aW1lMkNsaWVudFR5cGVzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIAotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmQjZXhlY3V0ZShvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgaWYgKHJ1bnRpbWUyQ2xpZW50VHlwZXM9PW51bGwgfHwgd3NkbFVSST09bnVsbCB8fCB3c2RsVVJJLmxlbmd0aCgpPT0wIHx8IHdlYlNlcnZpY2VzUGFyc2VyPT1udWxsKQotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAKLSAgICBTdHJpbmcgY2xpZW50UHJvamVjdE5hbWUgPSBydW50aW1lMkNsaWVudFR5cGVzLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoY2xpZW50UHJvamVjdE5hbWU9PW51bGwgfHwgY2xpZW50UHJvamVjdE5hbWUubGVuZ3RoKCk9PTApCi0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIAotICAgIElQcm9qZWN0IGNsaWVudFByb2plY3QgPSAoSVByb2plY3QpKChuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpLnRyYW5zZm9ybShjbGllbnRQcm9qZWN0TmFtZSkpOwotICAgIFZhbGlkYXRpb25VdGlscyB2dSA9IG5ldyBWYWxpZGF0aW9uVXRpbHMoKTsKLSAgICBDYWxlbmRhciBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICBib29sZWFuIGlzU2VydmljZVByb2plY3QgPSB2dS5pc1Byb2plY3RTZXJ2aWNlUHJvamVjdChjbGllbnRQcm9qZWN0LCB3c2RsVVJJLCB3ZWJTZXJ2aWNlc1BhcnNlcik7Ci0gICAgaWYgKGlzU2VydmljZVByb2plY3QpCi0gICAgewotICAgICAgU3RhdHVzIHdTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfV0FSTl9JU19TRVJWSUNFX1BST0pFQ1QiLCBuZXcgU3RyaW5nW117Y2xpZW50UHJvamVjdE5hbWV9KSwgU3RhdHVzLldBUk5JTkcpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQod1N0YXR1cyk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIHNlKQotICAgICAgewotICAgICAgICAvL1VzZXIgZGVjaWRlZCB0byBhYm9ydC4gUmV0dXJuIGFuIGVycm9yIHN0YXR1cwotICAgICAgICBTdGF0dXMgZVN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19VU0VSX0FCT1JURUQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgICAgcmV0dXJuIGVTdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9HZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9HZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyNmEzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotCi0gIHByaXZhdGUgSVByb2plY3Qgc2VydmljZVByb2plY3RfOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gCi0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfR0VOX0hBTkRMRVJfU0tFTEVUT04iOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfR0VOX0hBTkRMRVJfU0tFTEVUT04iOwotICAKLSAgcHJpdmF0ZSBJUGF0aCBvdXRwdXRMb2NhdGlvbl87Ci0gIHByaXZhdGUgU3RyaW5nW10gaGFuZGxlck5hbWVzXzsKLSAgcHJpdmF0ZSBib29sZWFuIGdlblNrZWxldG9uXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlck5hbWVGb3JFZGl0XyA9IG51bGw7Ci0gIAotICBwdWJsaWMgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kKCkKLSAgewotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAJbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgCXNldE5hbWUgKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7Ci0gIAlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsgICAgCi0gIH0KLSAgCi0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlIChFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCQotICAJaWYgKCFnZW5Ta2VsZXRvbl8pCi0gIAkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOyAKLSAgCQotICAJaW50IGk7Ci0gIAlib29sZWFuIGVycm9yID0gZmFsc2U7Ci0gIAlib29sZWFuIHdhcm5pbmcgPSBmYWxzZTsKLSAgCQotICAJU2ltcGxlU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gIAlTdGF0dXMgd3JpdGVTdGF0dXM7CQotICAJCi0gIAkKLSAgICBmb3IgKGk9MDsgaTxoYW5kbGVyTmFtZXNfLmxlbmd0aDsgaSsrKSB7Ci0gICAgCXdyaXRlU3RhdHVzID0gd3JpdGVGaWxlKGVudiwgaGFuZGxlck5hbWVzX1tpXSwgb3V0cHV0TG9jYXRpb25fKTsKLSAgICAJLy8gaGFuZGxlIHN0YXR1cyByZXR1cm4KLSAgICAJaWYgKHdyaXRlU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKSB7ICAvLyB3cml0ZSBzdGF0dXMgaXMgT0sgb3IgRVJST1IKLSAgICAJCWVycm9yID0gdHJ1ZTsKLSAgICAJCWlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgIAkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICJleGVjdXRlIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9HRU5FUkFURV9IQU5ETEVSX1NLRUxFVE9OIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgCQl9Ci0gICAgCQlzdGF0dXMuYWRkQ2hpbGQod3JpdGVTdGF0dXMpOwotICAgIAl9IAotICAgIH0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICB9Ci0gIAlyZXR1cm4gc3RhdHVzOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIHdyaXRlRmlsZSAoRW52aXJvbm1lbnQgZW52LCBTdHJpbmcgY2xhc3NOYW1lLCBJUGF0aCBvdXRwdXRMb2NhdGlvbikgCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgCWludCBpbmRleDsKLSAgCQotICAJU3RyaW5nIHNpbXBsZUNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgCVN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7Ci0gIAlJUGF0aCBmaWxlUGF0aCA9IG91dHB1dExvY2F0aW9uOwotICAJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gIAkJaW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgCQlpZiAoaW5kZXggIT0gLTEpIHsKLSAgCQkJc2ltcGxlQ2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAJCQlwYWNrYWdlTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAJCQkKLSAgCQkgIAlTdHJpbmcgcGFja2FnZVNlZ21lbnQgPSBwYWNrYWdlTmFtZTsKLSAgCQkgIAlpbnQgaiA9IDA7Ci0gIAkJICAJaiA9IHBhY2thZ2VTZWdtZW50LmluZGV4T2YoJy4nKTsKLSAgCQkgIAl3aGlsZSAoaiAhPSAtMSkgewotICAJCSAgCQlmaWxlUGF0aCA9IGZpbGVQYXRoLmFwcGVuZChwYWNrYWdlU2VnbWVudC5zdWJzdHJpbmcoMCwgaikpOwotICAJCSAgCQlwYWNrYWdlU2VnbWVudCA9IHBhY2thZ2VTZWdtZW50LnN1YnN0cmluZyhqICsgMSk7Ci0gIAkJICAJCWogPSBwYWNrYWdlU2VnbWVudC5pbmRleE9mKCcuJyk7Ci0gIAkJICAJfQotICAJCSAgICBmaWxlUGF0aCA9IGZpbGVQYXRoLmFwcGVuZChwYWNrYWdlU2VnbWVudCk7Ci0gIAkJfQotICAJCWVsc2UgewotICAJCSAgcGFja2FnZU5hbWUgPSAiIjsKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCWZpbGVQYXRoID0gZmlsZVBhdGguYXBwZW5kKHNpbXBsZUNsYXNzTmFtZSk7Ci0gIAkKLSAgCWZpbGVQYXRoID0gZmlsZVBhdGguYWRkRmlsZUV4dGVuc2lvbigiamF2YSIpOwotCi0gIAkvLyBjaGVjayBpZiBIYW5kbGVyIGFscmVhZHkgZXhpc3RzOyBkbyBub3Qgb3ZlcndyaXRlIGV4aXN0aW5nIEhhbmRsZXJzCi0gIAlJUmVzb3VyY2Ugd29ya3NwYWNlUmVzID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoZmlsZVBhdGgpOwotICAJaWYgKHdvcmtzcGFjZVJlcyE9bnVsbCAmJiB3b3Jrc3BhY2VSZXMuZXhpc3RzKCkpIHsKLSAgCQlyZXR1cm4gc3RhdHVzOwotICAJfQotICAJCi0gIAlpZiAoaGFuZGxlck5hbWVGb3JFZGl0XyA9PSBudWxsKXsKLSAgCQloYW5kbGVyTmFtZUZvckVkaXRfID0gY2xhc3NOYW1lOwotICAJfQotICAJCi0gIAlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gRmlsZVJlc291cmNlVXRpbHMubmV3RmlsZU91dHB1dFN0cmVhbSggRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KSwgZmlsZVBhdGgsIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKSwgZW52LmdldFN0YXR1c0hhbmRsZXIoKSk7Ci0gIAkvLyBjcmVhdGUgYnVmZmVyZWQgd3JpdGVyIGZvciB3cml0aW5nIGZpbGUKLSAgCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKSk7Ci0gIAl0cnkgewotICAJCWlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0gIAkJCWJ3LndyaXRlKCJwYWNrYWdlICIgK3BhY2thZ2VOYW1lKyI7Iik7Ci0gIAkJCWJ3Lm5ld0xpbmUoKTsKLSAgCQkJYncubmV3TGluZSgpOwotICAJCX0KLSAgCQlidy53cml0ZSgiaW1wb3J0IGphdmF4LnhtbC5ycGMuaGFuZGxlci5HZW5lcmljSGFuZGxlcjsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoImltcG9ydCBqYXZheC54bWwucnBjLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCJpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCQotICAJCWJ3LndyaXRlKCJwdWJsaWMgY2xhc3MgIitzaW1wbGVDbGFzc05hbWUrIiBleHRlbmRzIEdlbmVyaWNIYW5kbGVyIik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCJ7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQkKLSAgCQlidy53cml0ZSgiICAgcHVibGljIFFOYW1lW10gZ2V0SGVhZGVycyAoKSIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgeyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgICAgLy8gRmlsbCBpbiBtZXRob2QgYm9keSIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgICAgcmV0dXJuIG51bGw7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICB9Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgcHVibGljIGJvb2xlYW4gaGFuZGxlUmVxdWVzdCggTWVzc2FnZUNvbnRleHQgY29udGV4dCApIik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICB7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICAvLyBGaWxsIGluIG1ldGhvZCBib2R5IG9yIGRlbGV0ZSBtZXRob2QgdG8gdXNlIEdlbmVyaWNIYW5kbGVyIik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICByZXR1cm4gdHJ1ZTsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIH0iKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNwb25zZSggTWVzc2FnZUNvbnRleHQgY29udGV4dCApIik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICB7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICAvLyBGaWxsIGluIG1ldGhvZCBib2R5IG9yIGRlbGV0ZSBtZXRob2QgdG8gdXNlIEdlbmVyaWNIYW5kbGVyICIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgICAgcmV0dXJuIHRydWU7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICB9Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoIE1lc3NhZ2VDb250ZXh0IGNvbnRleHQgKSIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgeyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgICAgLy8gRmlsbCBpbiBtZXRob2QgYm9keSBvciBkZWxldGUgbWV0aG9kIHRvIHVzZSBHZW5lcmljSGFuZGxlciIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgICAgcmV0dXJuIHRydWU7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICB9Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCQotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgifSIpOwotICAJCWJ3LmNsb3NlKCk7Ci0gIAkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsJCi0gIAl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gIAkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIndyaXRlRmlsZSIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1JJVEVfRklMRSIsIG5ldyBTdHJpbmdbXXsgY2xhc3NOYW1lIH0pLCBTdGF0dXMuRVJST1IsIGUgKTsKLSAgCQlpZiAoYncgIT0gbnVsbCkgewotICAJCQl0cnkgewotICAJCQkJYncuY2xvc2UoKTsKLSAgCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLSAgCQkJfQotICAJCX0KLSAgCX0KLSAgCXJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHVuZG8oRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgcmVkbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRMb2NhdGlvbihJUGF0aCBvdXRwdXRMb2NhdGlvbikgCi0gIHsKLQl0aGlzLm91dHB1dExvY2F0aW9uXyA9IG91dHB1dExvY2F0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyTmFtZXMgKFN0cmluZ1tdIGhhbmRsZXJOYW1lcykKLSAgewotICAJdGhpcy5oYW5kbGVyTmFtZXNfID0gaGFuZGxlck5hbWVzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHZW5Ta2VsZXRvbkVuYWJsZWQoYm9vbGVhbiBnZW5Ta2VsZXRvbikKLSAgewotICAJdGhpcy5nZW5Ta2VsZXRvbl8gPSBnZW5Ta2VsZXRvbjsKLSAgfQotICAKLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKXsKLSAgCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotICAJaWYgKG91dHB1dExvY2F0aW9uXyE9bnVsbCl7Ci0gIAkJcHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKG91dHB1dExvY2F0aW9uXyk7Ci0gIAl9Ci0gIAlyZXR1cm4gcHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0Q2xhc3NOYW1lcygpewotICAJTGlzdCBjbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAJaWYgKGhhbmRsZXJOYW1lRm9yRWRpdF8hPW51bGwpewotICAJCWNsYXNzZXMuYWRkKGhhbmRsZXJOYW1lRm9yRWRpdF8pOwotICAJfQotICAJcmV0dXJuIGNsYXNzZXM7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvT3BlbkphdmFFZGl0b3JDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvT3BlbkphdmFFZGl0b3JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOTg3NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL09wZW5KYXZhRWRpdG9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgT3BlbkphdmFFZGl0b3JDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIExpc3QgY2xhc3NOYW1lczsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0gIHB1YmxpYyBPcGVuSmF2YUVkaXRvckNvbW1hbmQoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCi0gIHsKLSAgICBPcGVuSmF2YUVkaXRvckpvYiBqb2IgPSBuZXcgT3BlbkphdmFFZGl0b3JKb2IoY2xhc3NOYW1lcywgcHJvamVjdCk7Ci0gICAgam9iLnNldFByaW9yaXR5KEpvYi5MT05HKTsKLSAgICBqb2Iuc2NoZWR1bGUoKTsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWVzKExpc3QgY2xhc3NOYW1lcykKLSAgewotICAgIHRoaXMuY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIE9wZW5KYXZhRWRpdG9ySm9iIGV4dGVuZHMgVUlKb2IKLSAgewotICAgIHByaXZhdGUgTGlzdCBjbGFzc05hbWVzOwotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotICAgIHB1YmxpYyBPcGVuSmF2YUVkaXRvckpvYihMaXN0IGNsYXNzTmFtZXMsIElQcm9qZWN0IHByb2plY3QpCi0gICAgewotICAgICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLk9wZW5KYXZhRWRpdG9ySm9iIik7Ci0gICAgICB0aGlzLmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzOwotICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgewotICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBjbGFzc05hbWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNsYXNzTmFtZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWl0Lm5leHQoKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIEphdmFVSS5vcGVuSW5FZGl0b3IodHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cy5FUlJPUiwgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsIDAsIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkFCTEVfVE9fT1BFTl9KQVZBX0VESVRPUiIsIG5ldyBTdHJpbmdbXXtjbGFzc05hbWUsIHByb2plY3QuZ2V0TmFtZSgpfSksIHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cy5PSywgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsIDAsICIiLCBudWxsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMuRVJST1IsIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklELCAwLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX09QRU5fSkFWQV9FRElUT1IiLCBuZXcgU3RyaW5nW117Y2xhc3NOYW1lcyAhPSBudWxsID8gY2xhc3NOYW1lcy50b1N0cmluZygpIDogIiIsIHByb2plY3QgIT0gbnVsbCA/IHByb2plY3QuZ2V0TmFtZSgpIDogIiJ9KSwgbnVsbCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9XU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjY0OTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9XU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lBUENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJU1NCUENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5XU0lDb21wbGlhbmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0KLSAgcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAKLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9XU0lfTk9OQ09NUExJQU5UIjsKLSAgcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX1dTSV9OT05DT01QTElBTlQiOwotCQotICBwdWJsaWMgV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQoKQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLndzdC53cy51aSI7Ci0gIAltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAJc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLSAgCXNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOyAgICAKLSAgfQotICAKLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUgKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgCi0gIAlQZXJzaXN0ZW50V1NJU1NCUENvbnRleHQgd3NpU1NCUENvbnRleHQgPSBXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJU1NCUENvbnRleHQoKTsgCi0gIAlQZXJzaXN0ZW50V1NJQVBDb250ZXh0IHdzaUFQQ29udGV4dCA9IFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lBUENvbnRleHQoKTsgCi0gICAgVmVjdG9yIHN0YXR1c1NTQlAgPSBuZXcgVmVjdG9yKCk7Ci0gICAgc3RhdHVzU1NCUC5hZGQobmV3IFNpbXBsZVN0YXR1cygiV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQiLCAKLSAgICAJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJXU0lfU1NCUF9JTkNPTVBMSUFOVF9SVU5USU1FIiksIFdTSUNvbXBsaWFuY2VVdGlscy5nZXRXU0lTZXZlcml0eShzZXJ2aWNlUHJvamVjdF8sIHdzaVNTQlBDb250ZXh0KSkpOwotICAgIFN0YXR1c1tdIHN0YXR1c2VzU1NCUCA9IChTdGF0dXNbXSkgc3RhdHVzU1NCUC50b0FycmF5KG5ldyBTdGF0dXNbc3RhdHVzU1NCUC5zaXplKCldKTsKLSAgICAKLSAgICBWZWN0b3Igc3RhdHVzQVAgPSBuZXcgVmVjdG9yKCk7Ci0gICAgc3RhdHVzQVAuYWRkKG5ldyBTaW1wbGVTdGF0dXMoIldTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kIiwgCi0gICAgCQltc2dVdGlsc18uZ2V0TWVzc2FnZSgiV1NJX0FQX0lOQ09NUExJQU5UX1JVTlRJTUUiKSwgV1NJQ29tcGxpYW5jZVV0aWxzLmdldFdTSVNldmVyaXR5KHNlcnZpY2VQcm9qZWN0Xywgd3NpQVBDb250ZXh0KSkpOwotICAgIFN0YXR1c1tdIHN0YXR1c2VzQVAgPSAoU3RhdHVzW10pIHN0YXR1c0FQLnRvQXJyYXkobmV3IFN0YXR1c1tzdGF0dXNBUC5zaXplKCldKTsKLQotICAgIGlmIChXU0lDb21wbGlhbmNlVXRpbHMuY2hlY2tXU0lDb21wbGlhbmNlIChlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCksIHN0YXR1c2VzU1NCUCwgc2VydmljZVByb2plY3RfLCB3c2lTU0JQQ29udGV4dCkpIHsKLSAgICAJaWYgKFdTSUNvbXBsaWFuY2VVdGlscy5jaGVja1dTSUNvbXBsaWFuY2UgKGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKSwgc3RhdHVzZXNBUCwgc2VydmljZVByb2plY3RfLCB3c2lBUENvbnRleHQpKSB7Ci0gICAgCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICAJfSBlbHNlIHsKLSAgICAJCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKAotICAgIAkJCQkiV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQiLAotICAgIAkJCQltc2dVdGlsc18uZ2V0TWVzc2FnZSgiTk9UX09LIiksCi0gICAgCQkJCVN0YXR1cy5FUlJPUik7Ci0gICAgCX0KLSAgICB9IGVsc2UgewotCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygKLQkJCQkiV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQiLAotCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJOT1RfT0siKSwKLQkJCQlTdGF0dXMuRVJST1IpOwotCQl9Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHVuZG8oRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgcmVkbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkgewotCXRoaXMuc2VydmljZVByb2plY3RfID0gc2VydmljZVByb2plY3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL0VjbGlwc2VJUGF0aDJVUkxTdHJpbmdUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL2RhdGEvRWNsaXBzZUlQYXRoMlVSTFN0cmluZ1RyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNTI2MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL2RhdGEvRWNsaXBzZUlQYXRoMlVSTFN0cmluZ1RyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGE7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VJUGF0aDJVUkxTdHJpbmdUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi17Ci0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkKLSAgewotICAgIFN0cmluZyBzID0gdmFsdWUudG9TdHJpbmcoKTsKLSAgICBpZiAocy5pbmRleE9mKCI6IikgPCAwKQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICBpZiAocmVzLmV4aXN0cygpKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHMgPSByZXMuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9Qcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9Qcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjU4ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL2RhdGEvUHJvamVjdE5hbWUySVByb2plY3RUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5kYXRhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIKLXsKLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh2YWx1ZS50b1N0cmluZygpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL2RhdGEvU2VydmVySW5zdFRvSVNlcnZlclRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9TZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyMmI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9TZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyMCwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi0vKgotICogVHJhbnNmb3JtcyBhIHNlcnZlciBpbnN0YW5jZSBpZCB0byBhbiBJU2VydmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciB7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXIjdHJhbnNmb3JtKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLSAgICAKLSAgICBTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJbnN0SWQgPSAoU3RyaW5nKXZhbHVlOwotICAgIElTZXJ2ZXIgc2VydmVySW5zdCA9IG51bGw7Ci0gICAgaWYgKGV4aXN0aW5nU2VydmVySW5zdElkICE9IG51bGwpIHsKLSAgICAJc2VydmVySW5zdCA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihleGlzdGluZ1NlcnZlckluc3RJZCk7Ci0gICAgfQotICAgIHJldHVybiBzZXJ2ZXJJbnN0OwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1NlcnZlck5hbWUySVNlcnZlclRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9TZXJ2ZXJOYW1lMklTZXJ2ZXJUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmE0NmMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1NlcnZlck5hbWUySVNlcnZlclRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotcHVibGljIGNsYXNzIFNlcnZlck5hbWUySVNlcnZlclRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIKLXsKLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgVmVjdG9yIHNlcnZlcklkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VydmVyTmFtZSA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotICAgICAgaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCE9MCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcilzZXJ2ZXJzW2ldOwotICAgICAgICAgIGlmICgoc2VydmVyLmdldE5hbWUoKSkuZXF1YWxzKHNlcnZlck5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIHNlcnZlcjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0NsaWVudFNlcnZlclNlbGVjdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNmJlMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LklTZXJ2ZXJUYXJnZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LlNlcnZlclRhcmdldEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLklTZXJ2ZXJEZWZhdWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5TZXJ2ZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHMKLXsKLSAgLyoKLSAgICogUmV0dXJucyByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBzZXJ2ZXIgZmFjdG9yeSBpZCBhbmQgaW5zdGFuY2UgaWQgYmFzZWQgb24gCi0gICAqIGFuIGV4aXN0aW5nIHByb2plY3QKLSAgICogaW5kZXggWzBdIGNvbnRhaW5zIGZhY3RvcnlJZCwgaW5kZXhbMV0gY29udGFpbnMgaW5zdGFuY2UgSWQuCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNlcnZlckluZm9Gcm9tRXhpc3RpbmdQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSWQsIGJvb2xlYW4gYXNrRXh0ZW5kZXJzKQotICB7Ci0gICAgU3RyaW5nW10gc2VydmVySW5mbyA9IG5ldyBTdHJpbmdbMl07IC8vc2VydmVySW5mcFswXSBjb250YWlucyBmYWN0b3J5SWQsIHNlcnZlckluZm9bMV0gY29udGFpbnMgaW5zdGFuY2UgSWQKLSAgICAKLSAgICAvLyBJZiB0aGUgcHJvamVjdCBoYXMgYmVlbiBhZGRlZCB0byBhbiBleGlzdGluZyBzZXJ2ZXIsIHBpY2sgdGhhdCBzZXJ2ZXIKLSAgICBJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0gICAgSVNlcnZlciBmaXJzdFN1cHBvcnRlZFNlcnZlciA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGNvbmZpZ3VyZWRTZXJ2ZXJzLCB0eXBlSWQgKTsKLSAgICBpZiAoZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXJ2ZXJJbmZvWzBdID0gZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICBzZXJ2ZXJJbmZvWzFdID0gZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOyAgICAgIAkKLSAgICB9Ci0gICAgCi0gICAgLy9Eb2VzIHRoZSBwcm9qZWN0IGhhdmUgYSBydW50aW1lLXRhcmdldD8KLSAgICBJUnVudGltZSBydW50aW1lVGFyZ2V0ID0gZ2V0UnVudGltZVRhcmdldChwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgaWYgKHJ1bnRpbWVUYXJnZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL0xvb2sgZm9yIGFuIGV4aXN0aW5nIHNlcnZlciB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJ1bnRpbWUtdGFyZ2V0Ci0gICAgICBJU2VydmVyW10gY29tcGF0aWJsZVNlcnZlcnMgPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXJzKHJ1bnRpbWVUYXJnZXQpOwotICAgICAgaWYgKGNvbXBhdGlibGVTZXJ2ZXJzIT1udWxsICYmIGNvbXBhdGlibGVTZXJ2ZXJzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIElTZXJ2ZXIgZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihjb21wYXRpYmxlU2VydmVycywgdHlwZUlkKTsKLSAgICAgICAgaWYgKGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgICAgc2VydmVySW5mb1sxXSA9IGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyLmdldElkKCk7Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgCi0gICAgICAvL05vIGV4aXN0aW5nIGNvbXBhdGlibGUgc2VydmVyIHdhcyBmb3VuZC4gQ2hvb3NlIGEgY29tcGF0aWJsZSBzZXJ2ZXIgdHlwZS4KLSAgICAgIAotICAgICAgLy9JZiB0aGUgcHJlZmVycmVkIHNlcnZlciBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHByb2plY3QncyBydW50aW1lIHRhcmdldCwgdXNlIGl0LgotICAgICAgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGN0eCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLSAgICAgIFN0cmluZyBwRmFjdG9yeUlkID0gY3R4LmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUocEZhY3RvcnlJZCk7Ci0gICAgICBpZiAoc2VydmVyVHlwZSE9bnVsbCl7Ci0gICAgICAJU3RyaW5nIHNlcnZlclJ1bnRpbWVJZCA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgCWlmIChzZXJ2ZXJSdW50aW1lSWQuZXF1YWxzKHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKSkKLSAgICAgIAl7Ci0gICAgICAJICBzZXJ2ZXJJbmZvWzBdID0gcEZhY3RvcnlJZDsKLSAgICAgIAkgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgCX0KLSAgICAgIH0gICAgIAotICAgICAgCi0gICAgICAvL1RoZSBwcmVmZXJyZWQgc2VydmVyIHdhcyBub3QgY29tcGF0aWJsZS4gUGljayB0aGUgZmlyc3QgdmFsaWQgY29tcGF0aWJsZSBzZXJ2ZXIgdHlwZS4gICAgICAKLSAgICAgIFN0cmluZyBmYWN0b3J5SWQgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUocnVudGltZVRhcmdldCwgdHlwZUlkKTsKLSAgICAgIGlmIChmYWN0b3J5SWQgIT0gbnVsbCkgc2VydmVySW5mb1swXSA9IGZhY3RvcnlJZDsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgCi0gICAgfQotICAgIAotICAgIAotICAgIGlmIChhc2tFeHRlbmRlcnMpCi0gICAgewotICAgICAgU2VydmVySW5mbyByZWNvbW1lbmRlZFNlcnZlckluZm8gPSBnZXRFeHRlbmRlclJlY29tbWVuZGF0aW9uKHByb2plY3QpOwotICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mbyE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKSE9bnVsbCAmJiByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCkubGVuZ3RoKCk+MCkKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkhPW51bGwgJiYgcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKS5sZW5ndGgoKT4wKQotICAgICAgICAgIHNlcnZlckluZm9bMV0gPSByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpOyAKLQotICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy9Vc2UgU2VydmVyVGFyZ2V0SGVscGVyIHRvIGdldCBhIGxpc3Qgb2YgdmFsaWQgcnVudGltZS10YXJnZXRzIGFuZCB1c2UgdGhlc2UgdG8gZGV0ZXJtaW5lIGEgZGVmYXVsdCBzZXJ2ZXIgdHlwZS4KLSAgICBTdHJpbmdbXSBwcm9qZWN0QXR0cnMgPSBTZXJ2ZXJUYXJnZXRIZWxwZXIuZ2V0UHJvamVjdFR5cGVBbmRKMkVFTGV2ZWwocHJvamVjdCk7Ci0gICAgTGlzdCBydW50aW1lcyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRTZXJ2ZXJUYXJnZXRzKHByb2plY3RBdHRyc1swXSwgcHJvamVjdEF0dHJzWzFdKTsKLSAgICBTdHJpbmdbXSBjb21wYXRTZXJ2ZXJJbmZvID0gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVyKHJ1bnRpbWVzLHR5cGVJZCk7IAotICAgIGlmICggY29tcGF0U2VydmVySW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBjb21wYXRTZXJ2ZXJJbmZvOwotICAgIH0KLSAgICAKLSAgICAvL05vIGV4aXN0aW5nIGNvbXBhdGlibGUgc2VydmVyLCBwaWNrIGEgdHlwZS4KLSAgICBTdHJpbmcgZmFjdG9yeUlkID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKHJ1bnRpbWVzLCB0eXBlSWQpOwotICAgIGlmIChmYWN0b3J5SWQgIT0gbnVsbCkgc2VydmVySW5mb1swXSA9IGZhY3RvcnlJZDsgCi0gICAgcmV0dXJuIHNlcnZlckluZm87ICAgCi0KLSAgfQotCi0gIC8qCi0gICAqIFJldHVybnMgcmVhc29uYWJsZSBkZWZhdWx0cyBmb3Igc2VydmVyIGZhY3RvcnkgaWQgYW5kIGluc3RhbmNlIGlkIGJhc2VkIG9uIAotICAgKiBhbiBleGlzdGluZyBwcm9qZWN0Ci0gICAqIGluZGV4IFswXSBjb250YWlucyBmYWN0b3J5SWQsIGluZGV4WzFdIGNvbnRhaW5zIGluc3RhbmNlIElkLgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJJbmZvRnJvbUV4aXN0aW5nUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcnVudGltZUlkLCBib29sZWFuIGFza0V4dGVuZGVycykKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBuZXcgU3RyaW5nWzJdOyAvL3NlcnZlckluZnBbMF0gY29udGFpbnMgZmFjdG9yeUlkLCBzZXJ2ZXJJbmZvWzFdIGNvbnRhaW5zIGluc3RhbmNlIElkCi0gICAgCi0gICAgLy8gSWYgdGhlIHByb2plY3QgaGFzIGJlZW4gYWRkZWQgdG8gYW4gZXhpc3Rpbmcgc2VydmVyLCBwaWNrIHRoYXQgc2VydmVyCi0gICAgSVNlcnZlcltdIGNvbmZpZ3VyZWRTZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotICAgIElTZXJ2ZXIgZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihjb25maWd1cmVkU2VydmVycywgdHlwZUlkICk7Ci0gICAgaWYgKGZpcnN0U3VwcG9ydGVkU2VydmVyICE9IG51bGwpCi0gICAgewotICAgICAgc2VydmVySW5mb1swXSA9IGZpcnN0U3VwcG9ydGVkU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgc2VydmVySW5mb1sxXSA9IGZpcnN0U3VwcG9ydGVkU2VydmVyLmdldElkKCk7Ci0gICAgICByZXR1cm4gc2VydmVySW5mbzsgICAgICAJCi0gICAgfQotICAgIAotICAgIC8vRG9lcyB0aGUgcHJvamVjdCBoYXZlIGEgcnVudGltZS10YXJnZXQ/Ci0gICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IGdldFJ1bnRpbWVUYXJnZXQocHJvamVjdC5nZXROYW1lKCkpOwotICAgIGlmIChydW50aW1lVGFyZ2V0ICE9IG51bGwpCi0gICAgewotICAgICAgLy9Mb29rIGZvciBhbiBleGlzdGluZyBzZXJ2ZXIgd2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBydW50aW1lLXRhcmdldAotICAgICAgSVNlcnZlcltdIGNvbXBhdGlibGVTZXJ2ZXJzID0gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVycyhydW50aW1lVGFyZ2V0KTsKLSAgICAgIGlmIChjb21wYXRpYmxlU2VydmVycyE9bnVsbCAmJiBjb21wYXRpYmxlU2VydmVycy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICBJU2VydmVyIGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXIoY29tcGF0aWJsZVNlcnZlcnMsIHR5cGVJZCk7Ci0gICAgICAgIGlmIChmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmVySW5mb1swXSA9IGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICAgIHNlcnZlckluZm9bMV0gPSBmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlci5nZXRJZCgpOwotICAgICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgICAgIAotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy9ObyBleGlzdGluZyBjb21wYXRpYmxlIHNlcnZlciB3YXMgZm91bmQuIENob29zZSBhIGNvbXBhdGlibGUgc2VydmVyIHR5cGUuCi0gICAgICAKLSAgICAgIC8vSWYgdGhlIHByZWZlcnJlZCBzZXJ2ZXIgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm9qZWN0J3MgcnVudGltZSB0YXJnZXQsIHVzZSBpdC4KLSAgICAgIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjdHggPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICBTdHJpbmcgcEZhY3RvcnlJZCA9IGN0eC5nZXRTZXJ2ZXJGYWN0b3J5SWQoKTsKLSAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHBGYWN0b3J5SWQpOwotICAgICAgaWYgKHNlcnZlclR5cGUhPW51bGwpewotICAgICAgCVN0cmluZyBzZXJ2ZXJSdW50aW1lSWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIAlpZiAoc2VydmVyUnVudGltZUlkLmVxdWFscyhydW50aW1lVGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSkpCi0gICAgICAJewotICAgICAgCSAgc2VydmVySW5mb1swXSA9IHBGYWN0b3J5SWQ7Ci0gICAgICAJICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIAl9Ci0gICAgICB9ICAgICAKLSAgICAgIAotICAgICAgLy9UaGUgcHJlZmVycmVkIHNlcnZlciB3YXMgbm90IGNvbXBhdGlibGUuIFBpY2sgdGhlIGZpcnN0IHZhbGlkIGNvbXBhdGlibGUgc2VydmVyIHR5cGUuICAgICAgCi0gICAgICBTdHJpbmcgZmFjdG9yeUlkID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKHJ1bnRpbWVUYXJnZXQsIHR5cGVJZCk7Ci0gICAgICBpZiAoZmFjdG9yeUlkICE9IG51bGwpIHNlcnZlckluZm9bMF0gPSBmYWN0b3J5SWQ7Ci0gICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIAotICAgIH0KLSAgICAKLSAgICAKLSAgICBpZiAoYXNrRXh0ZW5kZXJzKQotICAgIHsKLSAgICAgIFNlcnZlckluZm8gcmVjb21tZW5kZWRTZXJ2ZXJJbmZvID0gZ2V0RXh0ZW5kZXJSZWNvbW1lbmRhdGlvbihwcm9qZWN0KTsKLSAgICAgIGlmIChyZWNvbW1lbmRlZFNlcnZlckluZm8hPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChyZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCkhPW51bGwgJiYgcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpLmxlbmd0aCgpPjApCi0gICAgICAgICAgc2VydmVySW5mb1swXSA9IHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChyZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpIT1udWxsICYmIHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkubGVuZ3RoKCk+MCkKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKTsgCi0KLSAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vVXNlIFNlcnZlclRhcmdldEhlbHBlciB0byBnZXQgYSBsaXN0IG9mIHZhbGlkIHJ1bnRpbWUtdGFyZ2V0cyBhbmQgdXNlIHRoZXNlIHRvIGRldGVybWluZSBhIGRlZmF1bHQgc2VydmVyIHR5cGUuCi0gICAgU3RyaW5nW10gcHJvamVjdEF0dHJzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFByb2plY3RUeXBlQW5kSjJFRUxldmVsKHByb2plY3QpOwotICAgIExpc3QgcnVudGltZXMgPSBTZXJ2ZXJUYXJnZXRIZWxwZXIuZ2V0U2VydmVyVGFyZ2V0cyhwcm9qZWN0QXR0cnNbMF0sIHByb2plY3RBdHRyc1sxXSk7Ci0gICAgTGlzdCBzdXBwUnVudGltZXMgPSBnZXRSdW50aW1lVGFyZ2V0c1N1cHBvcnRlZEJ5V1NSdW50aW1lKHJ1bnRpbWVzLCBydW50aW1lSWQpOwotICAgIFN0cmluZ1tdIGNvbXBhdFNlcnZlckluZm8gPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXIoc3VwcFJ1bnRpbWVzLHR5cGVJZCk7IAotICAgIGlmICggY29tcGF0U2VydmVySW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBjb21wYXRTZXJ2ZXJJbmZvOwotICAgIH0KLSAgICAKLSAgICAvL05vIGV4aXN0aW5nIGNvbXBhdGlibGUgc2VydmVyLCBwaWNrIGEgdHlwZS4KLSAgICBTdHJpbmcgZmFjdG9yeUlkID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKHN1cHBSdW50aW1lcywgdHlwZUlkKTsKLSAgICBpZiAoZmFjdG9yeUlkICE9IG51bGwpIHNlcnZlckluZm9bMF0gPSBmYWN0b3J5SWQ7IAotICAgIHJldHVybiBzZXJ2ZXJJbmZvOyAgIAotCi0gIH0KLSAgCi0gIC8qCi0gICAqIEdpdmVuIGEgbGlzdCBvZiBleGlzdGluZyBzZXJ2ZXJzLCB0aGlzIHJldHVybnMgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIHN1cHBvcnRlZAotICAgKiBieSB0aGUgZ2l2ZW4gV2ViIHNlcnZpY2UgdHlwZSBpZC4gCi0gICAqIFJldHVybnMgbnVsbCBvZiB0aGVyZSBhcmUgbm8gc3VwcG9ydGVkIHNlcnZlcnMgaW4gdGhlIGFycmF5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJU2VydmVyIGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKElTZXJ2ZXJbXSBzZXJ2ZXJzLCBTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSB3c2N0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCA+IDApIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCA9IHNlcnZlcnNbaV0uZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIGlmICh3c2N0UmVnaXN0cnkuaXNTZXJ2ZXJTdXBwb3J0ZWRGb3JDaG9zZW5UeXBlKHR5cGVJZCwgc2VydmVyRmFjdG9yeUlkKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBzZXJ2ZXJzW2ldOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9ICAKLSAgCi0gIC8qCi0gICAqIFJldHVybnMgdGhlIGZhY3RvcnkgaWQgb2YgYSBzZXJ2ZXIgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIFdlYiBzZXJ2aWNlIHR5cGUgYW5kIHRoZSBydW50aW1lIHRhcmdldC4KLSAgICogUmV0dXJucyBudWxsIGlmIHRoZXJlIGFyZSBub25lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKElSdW50aW1lIHJ1bnRpbWVUYXJnZXQsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBTdHJpbmcgcnVudGltZUlkID0gcnVudGltZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSB3c2N0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nW10gc2VydmVyRmFjdG9yeUlkcyA9IHdzY3RSZWdpc3RyeS5nZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKHR5cGVJZCk7Ci0gIAotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJGYWN0b3J5SWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlckZhY3RvcnlJZHNbaV0pOwotICAgICAgaWYgKHNlcnZlclR5cGUhPW51bGwgKXsKLSAgICAgIAlTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAJaWYgKHNlcnZlclJ1bnRpbWVJZC5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgIAl7Ci0gICAgICAJCXJldHVybiBzZXJ2ZXJGYWN0b3J5SWRzW2ldOwotICAgICAgCX0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFJldHVybiB0aGUgZmFjdG9yeSBpZCBvZiB0aGUgZmlyc3Qgc2VydmVyIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBydW50aW1lVGFyZ2V0cyBhbmQgdHlwZUlkLgotICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vbmUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUoTGlzdCBydW50aW1lVGFyZ2V0cywgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIGZvciAoaW50IGk9MDsgaTxydW50aW1lVGFyZ2V0cy5zaXplKCk7IGkrKyApCi0gICAgewotICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IChJUnVudGltZSlydW50aW1lVGFyZ2V0cy5nZXQoaSk7Ci0gICAgICBTdHJpbmcgZmFjdG9yeUlkID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKHJ1bnRpbWVUYXJnZXQsIHR5cGVJZCk7Ci0gICAgICBpZiAoZmFjdG9yeUlkICE9IG51bGwgJiYgZmFjdG9yeUlkLmxlbmd0aCgpPjApCi0gICAgICAgIHJldHVybiBmYWN0b3J5SWQ7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBJUnVudGltZSBnZXRSdW50aW1lVGFyZ2V0KFN0cmluZyBwcm9qZWN0TmFtZSkKLSAgewotICAJaWYoIHByb2plY3ROYW1lICE9IG51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwICl7IC8vJE5PTi1OTFMtMSQKLSAgCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgCQlpZiggcHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgKXsKLSAgCQkJcmV0dXJuIFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuZ2V0UnVudGltZVRhcmdldCgpOyAKLSAgCQl9Ci0gIAl9Ci0gIAlyZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBJU2VydmVyW10gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVycyhJUnVudGltZSBydW50aW1lKQotICB7Ci0gICAgaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgaWYgKHNlcnZlcnM9PW51bGwgfHwgc2VydmVycy5sZW5ndGghPTApCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBBcnJheUxpc3QgY29tcGF0aWJsZVNlcnZlcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyBydW50aW1lSWQgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICBTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICBpZiAoc2VydmVyUnVudGltZUlkLmVxdWFscyhydW50aW1lSWQpKQotICAgICAgICBjb21wYXRpYmxlU2VydmVyc0xpc3QuYWRkKHNlcnZlcik7Ci0gICAgICAKLSAgICB9Ci0gICAgaWYgKGNvbXBhdGlibGVTZXJ2ZXJzTGlzdC5zaXplKCk8MSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIAotICAgIE9iamVjdFtdIGNvbXBhdGlibGVTZXJ2ZXJzQXJyYXkgPSBjb21wYXRpYmxlU2VydmVyc0xpc3QudG9BcnJheSgpOwotICAgIElTZXJ2ZXJbXSBjb21wYXRpYmxlU2VydmVycyA9IG5ldyBJU2VydmVyW2NvbXBhdGlibGVTZXJ2ZXJzQXJyYXkubGVuZ3RoXTsKLSAgICBmb3IgKGludCBqPTA7IGo8Y29tcGF0aWJsZVNlcnZlcnNBcnJheS5sZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBjb21wYXRpYmxlU2VydmVyc1tqXSA9IChJU2VydmVyKWNvbXBhdGlibGVTZXJ2ZXJzQXJyYXlbal07Ci0gICAgfQotICAgIAotICAgIHJldHVybiBjb21wYXRpYmxlU2VydmVyczsKLSAgfSAgCi0gIC8qCi0gICAqIFJldHVybnMgdGhlIGZhY3RvcnkgSWQgYW5kIGluc3RhbmNlIGlkIG9mIHRoZSBmaXJzdCBleGl0aW5nIHNlcnZlciBjb21wYXRpYmxlCi0gICAqIHdpdGggdGhlIHJ1bnRpbWUgdGFyZ2V0cyBhbmQgdHlwZUlkCi0gICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm9uZS4KLSAgICogVGhlIGl0ZW0gYXQgWzBdIGlzIHRoZSBmYWN0b3J5IGlkLgotICAgKiBUaGUgaXRlbSBhdCBbMV0gaXMgdGhlIGluc3RhbmNlIGlkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXIoTGlzdCBydW50aW1lVGFyZ2V0cywgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBuZXcgU3RyaW5nWzJdOwotICAgIGZvciAoaW50IGk9MDsgaTxydW50aW1lVGFyZ2V0cy5zaXplKCk7IGkrKyApCi0gICAgewotICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IChJUnVudGltZSlydW50aW1lVGFyZ2V0cy5nZXQoaSk7Ci0gICAgICBJU2VydmVyW10gZXhpc3RpbmdDb21wYXRTZXJ2ZXJzID0gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVycyhydW50aW1lVGFyZ2V0KTsKLSAgICAgIElTZXJ2ZXIgY29tcGF0U2VydmVyID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXIoZXhpc3RpbmdDb21wYXRTZXJ2ZXJzLCB0eXBlSWQpOwotICAgICAgaWYgKGNvbXBhdFNlcnZlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gY29tcGF0U2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gY29tcGF0U2VydmVyLmdldElkKCk7Ci0gICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTZXJ2ZXJJbmZvIGdldEV4dGVuZGVyUmVjb21tZW5kYXRpb24oSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiIsICJzZXJ2ZXJEZWZhdWx0ZXIiKTsKLSAgICBmb3IgKGludCBpPTA7IGk8ZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgT2JqZWN0IHNlcnZlckRlZmF1bHRlck9iamVjdCA9IGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICBpZiAoc2VydmVyRGVmYXVsdGVyT2JqZWN0IGluc3RhbmNlb2YgSVNlcnZlckRlZmF1bHRlcikKLSAgICAgIHsKLSAgICAgICAgSVNlcnZlckRlZmF1bHRlciBzZXJ2ZXJEZWZhdWx0ZXIgPSAoSVNlcnZlckRlZmF1bHRlcilzZXJ2ZXJEZWZhdWx0ZXJPYmplY3Q7Ci0gICAgICAgIFNlcnZlckluZm8gc2VydmVySW5mbyA9IHNlcnZlckRlZmF1bHRlci5yZWNvbW1lbmREZWZhdWx0U2VydmVyKHByb2plY3QpOwotICAgICAgICBpZiAoc2VydmVySW5mbyAhPSBudWxsKQotICAgICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBMaXN0IGdldFJ1bnRpbWVUYXJnZXRzU3VwcG9ydGVkQnlXU1J1bnRpbWUoTGlzdCBydW50aW1lVGFyZ2V0cywgU3RyaW5nIHdlYlNlcnZpY2VSdW50aW1lSWQpCi0gIHsKLSAgICBBcnJheUxpc3Qgc3VwcFJ1bnRpbWVUYXJnZXRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgd3NjdFJlZyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8cnVudGltZVRhcmdldHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IChJUnVudGltZSlydW50aW1lVGFyZ2V0cy5nZXQoaSk7Ci0gICAgICBTdHJpbmcgcnRJZCA9IHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgaWYgKHdzY3RSZWcuZG9lc1J1bnRpbWVTdXBwb3J0U2VydmVyVGFyZ2V0KHJ0SWQsIHdlYlNlcnZpY2VSdW50aW1lSWQpKQotICAgICAgewotICAgICAgICBzdXBwUnVudGltZVRhcmdldHMuYWRkKHJ1bnRpbWVUYXJnZXQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3VwcFJ1bnRpbWVUYXJnZXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBnZXQgYSBzZXJ2ZXIgZmFjdG9yeSBpZCBhbmQgaW5zdGFuY2UgaWQgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGdpdmVuIFdlYgotICAgKiBzZXJ2aWNlIHJ1bnRpbWUuCi0gICAqIEBwYXJhbSBjbGllbnRSdW50aW1lSWQKLSAgICogQHBhcmFtIGoyZWVWZXJzaW9uIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW50IHZhbHVlcyBpbiBKMkVFVmVyc2lvbkNvbnN0YW50cyBpLmUuICIxMiIsICIxMyIsICIxNCIKLSAgICogQHJldHVybiBTdHJpbmdbXSBpbmRleCBbMF0gY29udGFpbnMgZmFjdG9yeUlkLCBpbmRleFsxXSBjb250YWlucyBpbnN0YW5jZSBJZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyRnJvbUNsaWVudFJ1bnRpbWVBbmRKMkVFKFN0cmluZyBjbGllbnRSdW50aW1lSWQsIFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBuZXcgU3RyaW5nWzJdOwotICAgIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgd3NjdFJlZyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICAvL0dldCBhbGwgcG9zc2libGUgdmFsaWQgc2VydmVycy4gSWYgdGhlcmUgYXJlIG5vbmUsIHdlIGNhbid0IGRlZmF1bHQgaW50ZWxsaWdlbnRseSwgcmV0dXJuIG51bGwuCi0gICAgU3RyaW5nW10gdmFsaWRTZXJ2ZXJGYWN0b3J5SWRzID0gd3NjdFJlZy5nZXRTZXJ2ZXJGYWN0b3J5SWRzQnlSdW50aW1lSWQoY2xpZW50UnVudGltZUlkKTsKLSAgICBpZiAodmFsaWRTZXJ2ZXJGYWN0b3J5SWRzPT1udWxsIHx8IHZhbGlkU2VydmVyRmFjdG9yeUlkcy5sZW5ndGg8MSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIC8vR2V0IGFsbCBleGlzdGluZyBzZXJ2ZXJzCi0gICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsgLy9HZXQgYWxsIGV4aXN0aW5nIHNlcnZlcnMKLSAgICAKLSAgICAvL0dldCB0aGUgcHJlZmVycmVkIHNlcnZlci4KLSAgCVBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAJU3RyaW5nIHByZWZTZXJ2ZXJGYWN0b3J5SWQgPSBjb250ZXh0LmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAJCi0gICAgYm9vbGVhbiBwcmVmZXJyZWRJc1ZhbGlkID0gIGNvbnRhaW5zU3RyaW5nKHZhbGlkU2VydmVyRmFjdG9yeUlkcywgcHJlZlNlcnZlckZhY3RvcnlJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTZXJ2ZXJWYWxpZChwcmVmU2VydmVyRmFjdG9yeUlkLCBqMmVlVmVyc2lvbik7Ci0gICAgaWYgKHByZWZlcnJlZElzVmFsaWQpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgICAgICAgU3RyaW5nIHRoaXNGYWN0b3J5SWQgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAodGhpc0ZhY3RvcnlJZC5lcXVhbHMocHJlZlNlcnZlckZhY3RvcnlJZCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gcHJlZlNlcnZlckZhY3RvcnlJZDsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gc2VydmVyLmdldElkKCk7Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIC8vRWl0aGVyIHRoZSBwcmVmZXJyZWQgc2VydmVyIHdhcyBub3QgdmFsaWQgb3IgaXQgd2FzIHZhbGlkIGJ1dCBkb2VzIG5vdCBleGlzdC4KLSAgICAvL0NoZWNrIHRoZSBleGlzdGluZyBzZXJ2ZXJzIGZvciB2YWxpZGl0eQotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgICAgIFN0cmluZyB0aGlzRmFjdG9yeUlkID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgCi0gICAgICBib29sZWFuIHRoaXNTZXJ2ZXJWYWxpZCA9IGNvbnRhaW5zU3RyaW5nKHZhbGlkU2VydmVyRmFjdG9yeUlkcywgdGhpc0ZhY3RvcnlJZCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzU2VydmVyVmFsaWQodGhpc0ZhY3RvcnlJZCwgajJlZVZlcnNpb24pOwotICAgICAgaWYgKHRoaXNTZXJ2ZXJWYWxpZCkKLSAgICAgIHsKLSAgICAgICAgc2VydmVySW5mb1swXSA9IHRoaXNGYWN0b3J5SWQ7Ci0gICAgICAgIHNlcnZlckluZm9bMV0gPSBzZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgICAgcmV0dXJuIHNlcnZlckluZm87ICAgICAgICAKLSAgICAgIH0KLSAgICB9ICAgICAgICAgIAotCi0gICAgLy9Ob25lIG9mIHRoZSBleGlzdGluZyBzZXJ2ZXJzIGlzIHZhbGlkLiBQaWNrIHRoZSBwcmVmZXJyZWQgb25lIGlmIHZhbGlkLiBPdGhlcndpc2UsIHBpY2sgdGhlCi0gICAgLy9maXJzdCB2YWxpZCBzZXJ2ZXIgdHlwZS4KLSAgICBpZiAocHJlZmVycmVkSXNWYWxpZCkKLSAgICB7Ci0gICAgICBzZXJ2ZXJJbmZvWzBdID0gcHJlZlNlcnZlckZhY3RvcnlJZDsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpPHZhbGlkU2VydmVyRmFjdG9yeUlkcy5sZW5ndGg7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IGlzU2VydmVyVmFsaWQodmFsaWRTZXJ2ZXJGYWN0b3J5SWRzW2ldLCBqMmVlVmVyc2lvbik7Ci0gICAgICAgIGlmIChpc1ZhbGlkKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmVySW5mb1swXSA9IHZhbGlkU2VydmVyRmFjdG9yeUlkc1swXTsKLSAgICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgICAgfQotICAgICAgfSAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL1dlIGNhbid0IGRldGVybWluZSBhIHZhbGlkIHNlcnZlciBzZWxlY3Rpb24uIFJldHVybiBudWxsLgotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2VydmVyVmFsaWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICBpZiAoc2VydmVyRmFjdG9yeUlkPT1udWxsIHx8IHNlcnZlckZhY3RvcnlJZC5sZW5ndGgoKT09MCB8fCBqMmVlVmVyc2lvbj09bnVsbCB8fCBqMmVlVmVyc2lvbi5sZW5ndGgoKT09MCkKLSAgICAgcmV0dXJuIHRydWU7Ci0gICAKLSAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZCk7Ci0gICBpZiAocnVudGltZVRhcmdldElkID09IG51bGwgfHwgcnVudGltZVRhcmdldElkLmxlbmd0aCgpPT0wKQotICAgICByZXR1cm4gZmFsc2U7Ci0gICBTdHJpbmcgd2ViTW9kdWxlVHlwZSA9IElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuV0VCX1RZUEU7Ci0gICBib29sZWFuIGlzVmFsaWQgPSBTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yUHJvamVjdFR5cGUocnVudGltZVRhcmdldElkLCBqMmVlVmVyc2lvbiwgd2ViTW9kdWxlVHlwZSk7Ci0gICByZXR1cm4gaXNWYWxpZDsKLSAgfQotICAvKgotICAgKiBSZXR1cm5zIHRydWUgaWYgYSBjb250YWlucyBiLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zU3RyaW5nKFN0cmluZ1tdIGEsIFN0cmluZyBiKQotICB7Ci0gICAgaWYgKGE9PW51bGwgfHwgYS5sZW5ndGg8MCB8fCBiID09IG51bGwgfHwgYi5sZW5ndGgoKT09MCApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZm9yIChpbnQgaT0wOyBpPGEubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIHMgPSBhW2ldOwotICAgICAgaWYgKHMuZXF1YWxzKGIpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0ZpbmlzaEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9GaW5pc2hGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzJkYmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0ZpbmlzaEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuRmluaXNoVGVzdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRmluaXNoRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci0gIHB1YmxpYyBGaW5pc2hGcmFnbWVudCgpCi0gIHsJCi0JYWRkKG5ldyBGaW5pc2hUZXN0RnJhZ21lbnQoKSApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9TZXJ2ZXJTZWxlY3Rpb25VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vU2VydmVyU2VsZWN0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhMGFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9TZXJ2ZXJTZWxlY3Rpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnNlcnZlcnRhcmdldC5JU2VydmVyVGFyZ2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnNlcnZlcnRhcmdldC5TZXJ2ZXJUYXJnZXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5JU2VydmVyRGVmYXVsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uU2VydmVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJTZWxlY3Rpb25VdGlscwotewotICAvKgotICAgKiBSZXR1cm5zIHJlYXNvbmFibGUgZGVmYXVsdHMgZm9yIHNlcnZlciBmYWN0b3J5IGlkIGFuZCBpbnN0YW5jZSBpZCBiYXNlZCBvbiAKLSAgICogYW4gZXhpc3RpbmcgcHJvamVjdAotICAgKiBpbmRleCBbMF0gY29udGFpbnMgZmFjdG9yeUlkLCBpbmRleFsxXSBjb250YWlucyBpbnN0YW5jZSBJZC4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVySW5mb0Zyb21FeGlzdGluZ1Byb2plY3QoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHR5cGVJZCwgYm9vbGVhbiBhc2tFeHRlbmRlcnMpCi0gIHsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJJbmZvID0gbmV3IFN0cmluZ1syXTsgLy9zZXJ2ZXJJbmZwWzBdIGNvbnRhaW5zIGZhY3RvcnlJZCwgc2VydmVySW5mb1sxXSBjb250YWlucyBpbnN0YW5jZSBJZAotCi0gICAgLy8gSWYgdGhlIHByb2plY3QgaGFzIGJlZW4gYWRkZWQgdG8gYW4gZXhpc3Rpbmcgc2VydmVyLCBwaWNrIHRoYXQgc2VydmVyCi0gICAgSVNlcnZlcltdIGNvbmZpZ3VyZWRTZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotICAgIElTZXJ2ZXIgZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihjb25maWd1cmVkU2VydmVycywgdHlwZUlkICk7Ci0gICAgaWYgKGZpcnN0U3VwcG9ydGVkU2VydmVyICE9IG51bGwpCi0gICAgewotICAgICAgc2VydmVySW5mb1swXSA9IGZpcnN0U3VwcG9ydGVkU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgc2VydmVySW5mb1sxXSA9IGZpcnN0U3VwcG9ydGVkU2VydmVyLmdldElkKCk7Ci0gICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIAkKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLy9Eb2VzIHRoZSBwcm9qZWN0IGhhdmUgYSBydW50aW1lLXRhcmdldD8KLSAgICBJUnVudGltZSBydW50aW1lVGFyZ2V0ID0gZ2V0UnVudGltZVRhcmdldChwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgaWYgKHJ1bnRpbWVUYXJnZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL0xvb2sgZm9yIGFuIGV4aXN0aW5nIHNlcnZlciB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJ1bnRpbWUtdGFyZ2V0Ci0gICAgICBJU2VydmVyW10gY29tcGF0aWJsZVNlcnZlcnMgPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXJzKHJ1bnRpbWVUYXJnZXQpOwotICAgICAgaWYgKGNvbXBhdGlibGVTZXJ2ZXJzIT1udWxsICYmIGNvbXBhdGlibGVTZXJ2ZXJzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIElTZXJ2ZXIgZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihjb21wYXRpYmxlU2VydmVycywgdHlwZUlkKTsKLSAgICAgICAgaWYgKGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgICAgc2VydmVySW5mb1sxXSA9IGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyLmdldElkKCk7Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgCi0gICAgICAvL05vIGV4aXN0aW5nIGNvbXBhdGlibGUgc2VydmVyIHdhcyBmb3VuZC4gQ2hvb3NlIGEgY29tcGF0aWJsZSBzZXJ2ZXIgdHlwZS4KLSAgICAgIAotICAgICAgLy9JZiB0aGUgcHJlZmVycmVkIHNlcnZlciBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHByb2plY3QncyBydW50aW1lIHRhcmdldCwgdXNlIGl0LgotICAgICAgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGN0eCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLSAgICAgIFN0cmluZyBwRmFjdG9yeUlkID0gY3R4LmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUocEZhY3RvcnlJZCk7Ci0gICAgICBpZiAoc2VydmVyVHlwZSE9bnVsbCl7Ci0gICAgICAJU3RyaW5nIHNlcnZlclJ1bnRpbWVJZCA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgCWlmIChzZXJ2ZXJSdW50aW1lSWQuZXF1YWxzKHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKSkKLSAgICAgIAl7Ci0gICAgICAJICBzZXJ2ZXJJbmZvWzBdID0gcEZhY3RvcnlJZDsKLSAgICAgIAkgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgCX0KLSAgICAgIH0gICAgIAotICAgICAgCi0gICAgICAvL1RoZSBwcmVmZXJyZWQgc2VydmVyIHdhcyBub3QgY29tcGF0aWJsZS4gUGljayB0aGUgZmlyc3QgdmFsaWQgY29tcGF0aWJsZSBzZXJ2ZXIgdHlwZS4KLSAgICAgIFN0cmluZyBmYWN0b3J5SWQgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUocnVudGltZVRhcmdldCwgdHlwZUlkKTsKLSAgICAgIGlmIChmYWN0b3J5SWQgIT0gbnVsbCkgc2VydmVySW5mb1swXSA9IGZhY3RvcnlJZDsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotCi0gICAgfQotICAgIAotICAgIGlmIChhc2tFeHRlbmRlcnMpCi0gICAgewotICAgICAgU2VydmVySW5mbyByZWNvbW1lbmRlZFNlcnZlckluZm8gPSBnZXRFeHRlbmRlclJlY29tbWVuZGF0aW9uKHByb2plY3QpOwotICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mbyE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKSE9bnVsbCAmJiByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCkubGVuZ3RoKCk+MCkKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkhPW51bGwgJiYgcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKS5sZW5ndGgoKT4wKQotICAgICAgICAgIHNlcnZlckluZm9bMV0gPSByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpOyAKLQotICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICAvL1VzZSBTZXJ2ZXJUYXJnZXRIZWxwZXIgdG8gZ2V0IGEgbGlzdCBvZiB2YWxpZCBydW50aW1lLXRhcmdldHMgYW5kIHVzZSB0aGVzZSB0byBkZXRlcm1pbmUgYSBkZWZhdWx0IHNlcnZlciB0eXBlLgotICAgIFN0cmluZ1tdIHByb2plY3RBdHRycyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRQcm9qZWN0VHlwZUFuZEoyRUVMZXZlbChwcm9qZWN0KTsKLSAgICBMaXN0IHJ1bnRpbWVzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFNlcnZlclRhcmdldHMocHJvamVjdEF0dHJzWzBdLCBwcm9qZWN0QXR0cnNbMV0pOwotICAgIFN0cmluZ1tdIGNvbXBhdFNlcnZlckluZm8gPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXIocnVudGltZXMsdHlwZUlkKTsgCi0gICAgaWYgKCBjb21wYXRTZXJ2ZXJJbmZvICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGNvbXBhdFNlcnZlckluZm87Ci0gICAgfQotICAgIAotICAgIC8vTm8gZXhpc3RpbmcgY29tcGF0aWJsZSBzZXJ2ZXIsIHBpY2sgYSB0eXBlLgotICAgIFN0cmluZyBmYWN0b3J5SWQgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUocnVudGltZXMsIHR5cGVJZCk7Ci0gICAgaWYgKGZhY3RvcnlJZCAhPSBudWxsKSBzZXJ2ZXJJbmZvWzBdID0gZmFjdG9yeUlkOyAKLSAgICByZXR1cm4gc2VydmVySW5mbzsgICAKLSAgICAKLSAgfQotCi0gIC8qCi0gICAqIFJldHVybnMgcmVhc29uYWJsZSBkZWZhdWx0cyBmb3Igc2VydmVyIGZhY3RvcnkgaWQgYW5kIGluc3RhbmNlIGlkIGJhc2VkIG9uIAotICAgKiBhbiBleGlzdGluZyBwcm9qZWN0Ci0gICAqIGluZGV4IFswXSBjb250YWlucyBmYWN0b3J5SWQsIGluZGV4WzFdIGNvbnRhaW5zIGluc3RhbmNlIElkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJJbmZvRnJvbUV4aXN0aW5nUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcnVudGltZUlkLCBib29sZWFuIGFza0V4dGVuZGVycykKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBuZXcgU3RyaW5nWzJdOyAvL3NlcnZlckluZnBbMF0gY29udGFpbnMgZmFjdG9yeUlkLCBzZXJ2ZXJJbmZvWzFdIGNvbnRhaW5zIGluc3RhbmNlIElkCi0KLSAgICAvLyBJZiB0aGUgcHJvamVjdCBoYXMgYmVlbiBhZGRlZCB0byBhbiBleGlzdGluZyBzZXJ2ZXIsIHBpY2sgdGhhdCBzZXJ2ZXIKLSAgICBJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0gICAgSVNlcnZlciBmaXJzdFN1cHBvcnRlZFNlcnZlciA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGNvbmZpZ3VyZWRTZXJ2ZXJzLCB0eXBlSWQgKTsKLSAgICBpZiAoZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXJ2ZXJJbmZvWzBdID0gZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICBzZXJ2ZXJJbmZvWzFdID0gZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgCQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvL0RvZXMgdGhlIHByb2plY3QgaGF2ZSBhIHJ1bnRpbWUtdGFyZ2V0PwotICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSBnZXRSdW50aW1lVGFyZ2V0KHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICBpZiAocnVudGltZVRhcmdldCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vTG9vayBmb3IgYW4gZXhpc3Rpbmcgc2VydmVyIHdoaWNoIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcnVudGltZS10YXJnZXQKLSAgICAgIElTZXJ2ZXJbXSBjb21wYXRpYmxlU2VydmVycyA9IGdldENvbXBhdGlibGVFeGlzdGluZ1NlcnZlcnMocnVudGltZVRhcmdldCk7Ci0gICAgICBpZiAoY29tcGF0aWJsZVNlcnZlcnMhPW51bGwgJiYgY29tcGF0aWJsZVNlcnZlcnMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgSVNlcnZlciBmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlciA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGNvbXBhdGlibGVTZXJ2ZXJzLCB0eXBlSWQpOwotICAgICAgICBpZiAoZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlckluZm9bMF0gPSBmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgICAgICAKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vTm8gZXhpc3RpbmcgY29tcGF0aWJsZSBzZXJ2ZXIgd2FzIGZvdW5kLiBDaG9vc2UgYSBjb21wYXRpYmxlIHNlcnZlciB0eXBlLgotICAgICAgCi0gICAgICAvL0lmIHRoZSBwcmVmZXJyZWQgc2VydmVyIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvamVjdCdzIHJ1bnRpbWUgdGFyZ2V0LCB1c2UgaXQuCi0gICAgICBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY3R4ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAgICAgU3RyaW5nIHBGYWN0b3J5SWQgPSBjdHguZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShwRmFjdG9yeUlkKTsKLSAgICAgIGlmIChzZXJ2ZXJUeXBlIT1udWxsKXsKLSAgICAgIAlTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAJaWYgKHNlcnZlclJ1bnRpbWVJZC5lcXVhbHMocnVudGltZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpKQotICAgICAgCXsKLSAgICAgIAkgIHNlcnZlckluZm9bMF0gPSBwRmFjdG9yeUlkOwotICAgICAgCSAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAJfQotICAgICAgfSAgICAgCi0gICAgICAKLSAgICAgIC8vVGhlIHByZWZlcnJlZCBzZXJ2ZXIgd2FzIG5vdCBjb21wYXRpYmxlLiBQaWNrIHRoZSBmaXJzdCB2YWxpZCBjb21wYXRpYmxlIHNlcnZlciB0eXBlLgotICAgICAgU3RyaW5nIGZhY3RvcnlJZCA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyVHlwZShydW50aW1lVGFyZ2V0LCB0eXBlSWQpOwotICAgICAgaWYgKGZhY3RvcnlJZCAhPSBudWxsKSBzZXJ2ZXJJbmZvWzBdID0gZmFjdG9yeUlkOwotICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGFza0V4dGVuZGVycykKLSAgICB7Ci0gICAgICBTZXJ2ZXJJbmZvIHJlY29tbWVuZGVkU2VydmVySW5mbyA9IGdldEV4dGVuZGVyUmVjb21tZW5kYXRpb24ocHJvamVjdCk7Ci0gICAgICBpZiAocmVjb21tZW5kZWRTZXJ2ZXJJbmZvIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAocmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpIT1udWxsICYmIHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKS5sZW5ndGgoKT4wKQotICAgICAgICAgIHNlcnZlckluZm9bMF0gPSByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAocmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKSE9bnVsbCAmJiByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpLmxlbmd0aCgpPjApCi0gICAgICAgICAgc2VydmVySW5mb1sxXSA9IHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7IAotCi0gICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgfQotCi0gICAgfQotICAgIAotICAgIC8vVXNlIFNlcnZlclRhcmdldEhlbHBlciB0byBnZXQgYSBsaXN0IG9mIHZhbGlkIHJ1bnRpbWUtdGFyZ2V0cyBhbmQgdXNlIHRoZXNlIHRvIGRldGVybWluZSBhIGRlZmF1bHQgc2VydmVyIHR5cGUuCi0gICAgU3RyaW5nW10gcHJvamVjdEF0dHJzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFByb2plY3RUeXBlQW5kSjJFRUxldmVsKHByb2plY3QpOwotICAgIExpc3QgcnVudGltZXMgPSBTZXJ2ZXJUYXJnZXRIZWxwZXIuZ2V0U2VydmVyVGFyZ2V0cyhwcm9qZWN0QXR0cnNbMF0sIHByb2plY3RBdHRyc1sxXSk7Ci0gICAgTGlzdCBzdXBwUnVudGltZXMgPSBnZXRSdW50aW1lVGFyZ2V0c1N1cHBvcnRlZEJ5V1NSdW50aW1lKHJ1bnRpbWVzLCBydW50aW1lSWQpOwotICAgIFN0cmluZ1tdIGNvbXBhdFNlcnZlckluZm8gPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXIoc3VwcFJ1bnRpbWVzLHR5cGVJZCk7IAotICAgIGlmICggY29tcGF0U2VydmVySW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBjb21wYXRTZXJ2ZXJJbmZvOwotICAgIH0KLSAgICAKLSAgICAvL05vIGV4aXN0aW5nIGNvbXBhdGlibGUgc2VydmVyLCBwaWNrIGEgdHlwZS4KLSAgICBTdHJpbmcgZmFjdG9yeUlkID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKHN1cHBSdW50aW1lcywgdHlwZUlkKTsKLSAgICBpZiAoZmFjdG9yeUlkICE9IG51bGwpIHNlcnZlckluZm9bMF0gPSBmYWN0b3J5SWQ7IAotICAgIHJldHVybiBzZXJ2ZXJJbmZvOyAgIAotICAgIAotICB9Ci0gIAotICAvKgotICAgKiBHaXZlbiBhIGxpc3Qgb2YgZXhpc3Rpbmcgc2VydmVycywgdGhpcyByZXR1cm5zIHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBzdXBwb3J0ZWQKLSAgICogYnkgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHR5cGUgaWQuIAotICAgKiBSZXR1cm5zIG51bGwgb2YgdGhlcmUgYXJlIG5vIHN1cHBvcnRlZCBzZXJ2ZXJzIGluIHRoZSBhcnJheS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVNlcnZlciBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihJU2VydmVyW10gc2VydmVycywgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHdzc3J0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIGlmIChzZXJ2ZXJzICE9IG51bGwgJiYgc2VydmVycy5sZW5ndGggPiAwKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQgPSBzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICBpZiAod3NzcnRSZWdpc3RyeS5pc1NlcnZlclN1cHBvcnRlZEZvckNob3NlblR5cGUodHlwZUlkLCBzZXJ2ZXJGYWN0b3J5SWQpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlcnNbaV07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gIAotICAKLSAgLyoKLSAgICogUmV0dXJucyB0aGUgZmFjdG9yeSBpZCBvZiBhIHNlcnZlciB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgV2ViIHNlcnZpY2UgdHlwZSBhbmQgdGhlIHJ1bnRpbWUgdGFyZ2V0LgotICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vbmUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUoSVJ1bnRpbWUgcnVudGltZVRhcmdldCwgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFN0cmluZyBydW50aW1lSWQgPSBydW50aW1lVGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZ2lzdHJ5ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJGYWN0b3J5SWRzID0gd3NzcnRSZWdpc3RyeS5nZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKHR5cGVJZCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlckZhY3RvcnlJZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkc1tpXSk7Ci0gICAgICBpZiAoc2VydmVyVHlwZSE9bnVsbCl7Ci0gICAgICAJU3RyaW5nIHNlcnZlclJ1bnRpbWVJZCA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgCWlmIChzZXJ2ZXJSdW50aW1lSWQuZXF1YWxzKHJ1bnRpbWVJZCkpCi0gICAgICAJewotICAgICAgCQlyZXR1cm4gc2VydmVyRmFjdG9yeUlkc1tpXTsKLSAgICAgIAl9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKgotICAgKiBSZXR1cm4gdGhlIGZhY3RvcnkgaWQgb2YgdGhlIGZpcnN0IHNlcnZlciB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgcnVudGltZVRhcmdldHMgYW5kIHR5cGVJZC4KLSAgICogUmV0dXJucyBudWxsIGlmIHRoZXJlIGFyZSBub25lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKExpc3QgcnVudGltZVRhcmdldHMsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBmb3IgKGludCBpPTA7IGk8cnVudGltZVRhcmdldHMuc2l6ZSgpOyBpKysgKQotICAgIHsKLSAgICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSAoSVJ1bnRpbWUpcnVudGltZVRhcmdldHMuZ2V0KGkpOwotICAgICAgU3RyaW5nIGZhY3RvcnlJZCA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyVHlwZShydW50aW1lVGFyZ2V0LCB0eXBlSWQpOwotICAgICAgaWYgKGZhY3RvcnlJZCAhPSBudWxsICYmIGZhY3RvcnlJZC5sZW5ndGgoKT4wKQotICAgICAgICByZXR1cm4gZmFjdG9yeUlkOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgZ2V0UnVudGltZVRhcmdldChTdHJpbmcgcHJvamVjdE5hbWUpCi0gIHsKLSAgCWlmKCBwcm9qZWN0TmFtZSAhPSBudWxsICYmIHByb2plY3ROYW1lLmxlbmd0aCgpID4gMCApeyAvLyROT04tTkxTLTEkCi0gIAkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gIAkJaWYoIHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICl7Ci0gIAkJCXJldHVybiBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsgCi0gIAkJfQotICAJfQotICAJcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgSVNlcnZlciBnZXRGaXJzdEV4aXN0aW5nU2VydmVyRnJvbUZhY3RvcnlJZChTdHJpbmcgZmFjdG9yeUlkKQotICB7Ci0gIAlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotICAJaWYgKHNlcnZlcnM9PW51bGwgfHwgc2VydmVycy5sZW5ndGghPTApCi0gICAgICAgIHJldHVybiBudWxsOwotICAJZWxzZQotICAJewotICAJICBmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgCSAgewotICAJICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgCSAgICBpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpLmVxdWFscyhmYWN0b3J5SWQpKQotICAJICAgIHsKLSAgCSAgICAgIHJldHVybiBzZXJ2ZXI7Ci0gIAkgICAgfQotICAJICB9Ci0gIAl9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgSVNlcnZlcltdIGdldENvbXBhdGlibGVFeGlzdGluZ1NlcnZlcnMoSVJ1bnRpbWUgcnVudGltZSkKLSAgewotICAgIGlmIChydW50aW1lID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotICAgIGlmIChzZXJ2ZXJzPT1udWxsIHx8IHNlcnZlcnMubGVuZ3RoIT0wKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgQXJyYXlMaXN0IGNvbXBhdGlibGVTZXJ2ZXJzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBTdHJpbmcgcnVudGltZUlkID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcilzZXJ2ZXJzW2ldOwotICAgICAgU3RyaW5nIHNlcnZlclJ1bnRpbWVJZCA9IHNlcnZlci5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgaWYgKHNlcnZlclJ1bnRpbWVJZC5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgICAgY29tcGF0aWJsZVNlcnZlcnNMaXN0LmFkZChzZXJ2ZXIpOwotICAgICAgCi0gICAgfQotICAgIGlmIChjb21wYXRpYmxlU2VydmVyc0xpc3Quc2l6ZSgpPDEpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICAKLSAgICBPYmplY3RbXSBjb21wYXRpYmxlU2VydmVyc0FycmF5ID0gY29tcGF0aWJsZVNlcnZlcnNMaXN0LnRvQXJyYXkoKTsKLSAgICBJU2VydmVyW10gY29tcGF0aWJsZVNlcnZlcnMgPSBuZXcgSVNlcnZlcltjb21wYXRpYmxlU2VydmVyc0FycmF5Lmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaj0wOyBqPGNvbXBhdGlibGVTZXJ2ZXJzQXJyYXkubGVuZ3RoOyBqKyspCi0gICAgewotICAgICAgY29tcGF0aWJsZVNlcnZlcnNbal0gPSAoSVNlcnZlciljb21wYXRpYmxlU2VydmVyc0FycmF5W2pdOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY29tcGF0aWJsZVNlcnZlcnM7Ci0gIH0gIAotICAvKgotICAgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IElkIGFuZCBpbnN0YW5jZSBpZCBvZiB0aGUgZmlyc3QgZXhpdGluZyBzZXJ2ZXIgY29tcGF0aWJsZQotICAgKiB3aXRoIHRoZSBydW50aW1lIHRhcmdldHMgYW5kIHR5cGVJZAotICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vbmUuCi0gICAqIFRoZSBpdGVtIGF0IFswXSBpcyB0aGUgZmFjdG9yeSBpZC4KLSAgICogVGhlIGl0ZW0gYXQgWzFdIGlzIHRoZSBpbnN0YW5jZSBpZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVyKExpc3QgcnVudGltZVRhcmdldHMsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJJbmZvID0gbmV3IFN0cmluZ1syXTsKLSAgICBmb3IgKGludCBpPTA7IGk8cnVudGltZVRhcmdldHMuc2l6ZSgpOyBpKysgKQotICAgIHsKLSAgICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSAoSVJ1bnRpbWUpcnVudGltZVRhcmdldHMuZ2V0KGkpOwotICAgICAgSVNlcnZlcltdIGV4aXN0aW5nQ29tcGF0U2VydmVycyA9IGdldENvbXBhdGlibGVFeGlzdGluZ1NlcnZlcnMocnVudGltZVRhcmdldCk7Ci0gICAgICBJU2VydmVyIGNvbXBhdFNlcnZlciA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGV4aXN0aW5nQ29tcGF0U2VydmVycywgdHlwZUlkKTsKLSAgICAgIGlmIChjb21wYXRTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2VydmVySW5mb1swXSA9IGNvbXBhdFNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgc2VydmVySW5mb1sxXSA9IGNvbXBhdFNlcnZlci5nZXRJZCgpOwotICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU2VydmVySW5mbyBnZXRFeHRlbmRlclJlY29tbWVuZGF0aW9uKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iLCAic2VydmVyRGVmYXVsdGVyIik7Ci0gICAgZm9yIChpbnQgaT0wOyBpPGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE9iamVjdCBzZXJ2ZXJEZWZhdWx0ZXJPYmplY3QgPSBlbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgaWYgKHNlcnZlckRlZmF1bHRlck9iamVjdCBpbnN0YW5jZW9mIElTZXJ2ZXJEZWZhdWx0ZXIpCi0gICAgICB7Ci0gICAgICAgIElTZXJ2ZXJEZWZhdWx0ZXIgc2VydmVyRGVmYXVsdGVyID0gKElTZXJ2ZXJEZWZhdWx0ZXIpc2VydmVyRGVmYXVsdGVyT2JqZWN0OwotICAgICAgICBTZXJ2ZXJJbmZvIHNlcnZlckluZm8gPSBzZXJ2ZXJEZWZhdWx0ZXIucmVjb21tZW5kRGVmYXVsdFNlcnZlcihwcm9qZWN0KTsKLSAgICAgICAgaWYgKHNlcnZlckluZm8gIT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRSdW50aW1lVGFyZ2V0c1N1cHBvcnRlZEJ5V1NSdW50aW1lKExpc3QgcnVudGltZVRhcmdldHMsIFN0cmluZyB3ZWJTZXJ2aWNlUnVudGltZUlkKQotICB7Ci0gICAgQXJyYXlMaXN0IHN1cHBSdW50aW1lVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZyA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHJ1bnRpbWVUYXJnZXRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSAoSVJ1bnRpbWUpcnVudGltZVRhcmdldHMuZ2V0KGkpOwotICAgICAgU3RyaW5nIHJ0SWQgPSBydW50aW1lVGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIGlmICh3c3NydFJlZy5kb2VzUnVudGltZVN1cHBvcnRTZXJ2ZXJUYXJnZXQocnRJZCwgd2ViU2VydmljZVJ1bnRpbWVJZCkpOwotICAgICAgewotICAgICAgICBzdXBwUnVudGltZVRhcmdldHMuYWRkKHJ1bnRpbWVUYXJnZXQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3VwcFJ1bnRpbWVUYXJnZXRzOwotICB9ICAKLSAgCi0gIC8qKgotICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gZ2V0IGEgc2VydmVyIGZhY3RvcnkgaWQgYW5kIGluc3RhbmNlIGlkIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBnaXZlbiBXZWIKLSAgICogc2VydmljZSBydW50aW1lLgotICAgKiBAcGFyYW0gd2ViU2VydmljZVJ1bnRpbWVJZAotICAgKiBAcGFyYW0gajJlZVZlcnNpb24gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnQgdmFsdWVzIGluIEoyRUVWZXJzaW9uQ29uc3RhbnRzIGkuZS4gIjEyIiwgIjEzIiwgIjE0IgotICAgKiBAcmV0dXJuIFN0cmluZ1tdIGluZGV4IFswXSBjb250YWlucyBmYWN0b3J5SWQsIGluZGV4WzFdIGNvbnRhaW5zIGluc3RhbmNlIElkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJGcm9tV2ViU2VydmNlUnVudGltZUFuZEoyRUUoU3RyaW5nIHdlYlNlcnZpY2VSdW50aW1lSWQsIFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBuZXcgU3RyaW5nWzJdOwotICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHdzc3J0UmVnID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICAvL0dldCBhbGwgcG9zc2libGUgdmFsaWQgc2VydmVycy4gSWYgdGhlcmUgYXJlIG5vbmUsIHdlIGNhbid0IGRlZmF1bHQgaW50ZWxsaWdlbnRseSwgcmV0dXJuIG51bGwuCi0gICAgU3RyaW5nW10gdmFsaWRTZXJ2ZXJGYWN0b3J5SWRzID0gd3NzcnRSZWcuZ2V0U2VydmVyRmFjdG9yeUlEQnlSdW50aW1lSUQod2ViU2VydmljZVJ1bnRpbWVJZCk7Ci0gICAgaWYgKHZhbGlkU2VydmVyRmFjdG9yeUlkcz09bnVsbCB8fCB2YWxpZFNlcnZlckZhY3RvcnlJZHMubGVuZ3RoPDEpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICAvL0dldCBhbGwgZXhpc3Rpbmcgc2VydmVycwotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7IC8vR2V0IGFsbCBleGlzdGluZyBzZXJ2ZXJzCi0gICAgCi0gICAgLy9HZXQgdGhlIHByZWZlcnJlZCBzZXJ2ZXIuCi0gIAlQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLSAgCVN0cmluZyBwcmVmU2VydmVyRmFjdG9yeUlkID0gY29udGV4dC5nZXRTZXJ2ZXJGYWN0b3J5SWQoKTsKLSAgCQotICAgIGJvb2xlYW4gcHJlZmVycmVkSXNWYWxpZCA9ICBjb250YWluc1N0cmluZyh2YWxpZFNlcnZlckZhY3RvcnlJZHMsIHByZWZTZXJ2ZXJGYWN0b3J5SWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzU2VydmVyVmFsaWQocHJlZlNlcnZlckZhY3RvcnlJZCwgajJlZVZlcnNpb24pOwotICAgIGlmIChwcmVmZXJyZWRJc1ZhbGlkKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICAgIFN0cmluZyB0aGlzRmFjdG9yeUlkID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHRoaXNGYWN0b3J5SWQuZXF1YWxzKHByZWZTZXJ2ZXJGYWN0b3J5SWQpKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmVySW5mb1swXSA9IHByZWZTZXJ2ZXJGYWN0b3J5SWQ7Ci0gICAgICAgICAgc2VydmVySW5mb1sxXSA9IHNlcnZlci5nZXRJZCgpOwotICAgICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgfSAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL0VpdGhlciB0aGUgcHJlZmVycmVkIHNlcnZlciB3YXMgbm90IHZhbGlkIG9yIGl0IHdhcyB2YWxpZCBidXQgZG9lcyBub3QgZXhpc3QuCi0gICAgLy9DaGVjayB0aGUgZXhpc3Rpbmcgc2VydmVycyBmb3IgdmFsaWRpdHkKLSAgICBmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICBTdHJpbmcgdGhpc0ZhY3RvcnlJZCA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIAotICAgICAgYm9vbGVhbiB0aGlzU2VydmVyVmFsaWQgPSBjb250YWluc1N0cmluZyh2YWxpZFNlcnZlckZhY3RvcnlJZHMsIHRoaXNGYWN0b3J5SWQpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1NlcnZlclZhbGlkKHRoaXNGYWN0b3J5SWQsIGoyZWVWZXJzaW9uKTsKLSAgICAgIGlmICh0aGlzU2VydmVyVmFsaWQpCi0gICAgICB7Ci0gICAgICAgIHNlcnZlckluZm9bMF0gPSB0aGlzRmFjdG9yeUlkOwotICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gc2VydmVyLmdldElkKCk7Ci0gICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOyAgICAgICAgCi0gICAgICB9Ci0gICAgfSAgICAgICAgICAKLQotICAgIC8vTm9uZSBvZiB0aGUgZXhpc3Rpbmcgc2VydmVycyBpcyB2YWxpZC4gUGljayB0aGUgcHJlZmVycmVkIG9uZSBpZiB2YWxpZC4gT3RoZXJ3aXNlLCBwaWNrIHRoZQotICAgIC8vZmlyc3QgdmFsaWQgc2VydmVyIHR5cGUuCi0gICAgaWYgKHByZWZlcnJlZElzVmFsaWQpCi0gICAgewotICAgICAgc2VydmVySW5mb1swXSA9IHByZWZTZXJ2ZXJGYWN0b3J5SWQ7Ci0gICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaTx2YWxpZFNlcnZlckZhY3RvcnlJZHMubGVuZ3RoOyBpKysgKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBpc1NlcnZlclZhbGlkKHZhbGlkU2VydmVyRmFjdG9yeUlkc1tpXSwgajJlZVZlcnNpb24pOwotICAgICAgICBpZiAoaXNWYWxpZCkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlckluZm9bMF0gPSB2YWxpZFNlcnZlckZhY3RvcnlJZHNbMF07Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9XZSBjYW4ndCBkZXRlcm1pbmUgYSB2YWxpZCBzZXJ2ZXIgc2VsZWN0aW9uLiBSZXR1cm4gbnVsbC4KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NlcnZlclZhbGlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAgaWYgKHNlcnZlckZhY3RvcnlJZD09bnVsbCB8fCBzZXJ2ZXJGYWN0b3J5SWQubGVuZ3RoKCk9PTAgfHwgajJlZVZlcnNpb249PW51bGwgfHwgajJlZVZlcnNpb24ubGVuZ3RoKCk9PTApCi0gICAgIHJldHVybiB0cnVlOwotICAgCi0gICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0UnVudGltZVRhcmdldElkRnJvbUZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWQpOwotICAgaWYgKHJ1bnRpbWVUYXJnZXRJZCA9PSBudWxsIHx8IHJ1bnRpbWVUYXJnZXRJZC5sZW5ndGgoKT09MCkKLSAgICAgcmV0dXJuIGZhbHNlOwotICAgU3RyaW5nIHdlYk1vZHVsZVR5cGUgPSBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLldFQl9UWVBFOwotICAgYm9vbGVhbiBpc1ZhbGlkID0gU2VydmVyVXRpbHMuaXNUYXJnZXRWYWxpZEZvclByb2plY3RUeXBlKHJ1bnRpbWVUYXJnZXRJZCwgajJlZVZlcnNpb24sIHdlYk1vZHVsZVR5cGUpOwotICAgcmV0dXJuIGlzVmFsaWQ7Ci0gIH0KLSAgLyoKLSAgICogUmV0dXJucyB0cnVlIGlzIGEgY29udGFpbnMgYiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc1N0cmluZyhTdHJpbmdbXSBhLCBTdHJpbmcgYikKLSAgewotICAgIGlmIChhPT1udWxsIHx8IGEubGVuZ3RoPDAgfHwgYiA9PSBudWxsIHx8IGIubGVuZ3RoKCk9PTAgKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGZvciAoaW50IGk9MDsgaTxhLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBzID0gYVtpXTsKLSAgICAgIGlmIChzLmVxdWFscyhiKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vVmFsaWRhdGlvblV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9WYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwYjQzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9WYWxpZGF0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLldlYlNlcnZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5DbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3RDaG9pY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblV0aWxzCi17Ci0gIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvblV0aWxzKCkKLSAgewotICAgIFN0cmluZyBwbHVnaW5JZCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEOyAvLyJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyB2YWxpZGF0ZVByb2plY3RUYXJnZXRBbmRKMkVFKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGVhck5hbWUsIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIFN0cmluZyBqMmVlTGV2ZWwpCi0gIHsKLSAgICBJUHJvamVjdCBwID0gRmlsZVJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCUlQcm9qZWN0IGVhclAgPSBudWxsOwotCWlmIChlYXJOYW1lIT1udWxsICYmICFlYXJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIiIpKSB7Ci0gICAgCWVhclAgPSBGaWxlUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChlYXJOYW1lKTsKLQl9Ci0gICAgU3RhdHVzIHRhcmdldFN0YXR1cyA9IGRvZXNQcm9qZWN0VGFyZ2V0TWF0Y2hTZXJ2ZXJUeXBlKHAsIHNlcnZlckZhY3RvcnlJZCk7Ci0gICAgaWYgKGVhclAhPW51bGwgJiYgdGFyZ2V0U3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICAvL2NoZWNrIHRoZSBFQVIgICAgICAKLSAgICAgIFN0YXR1cyBlYXJUYXJnZXRTdGF0dXMgPSBkb2VzUHJvamVjdFRhcmdldE1hdGNoU2VydmVyVHlwZShlYXJQLCBzZXJ2ZXJGYWN0b3J5SWQpOwotICAgICAgaWYoZWFyVGFyZ2V0U3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGVhclRhcmdldFN0YXR1czsKLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiB0YXJnZXRTdGF0dXM7Ci0gICAgfQotICAgIAotCi0gICAgLy9WYWxpZGF0ZSBzZXJ2aWNlIHNpZGUgSjJFRSBsZXZlbCAgICAKLSAgICBTdGF0dXMgajJlZVN0YXR1cyA9IGRvZXNQcm9qZWN0TWF0Y2hKMkVFTGV2ZWwocCwgajJlZUxldmVsKTsKLSAgICBpZihlYXJQIT1udWxsICYmIGoyZWVTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLk9LKQotICAgIHsKLSAgICAgIFN0YXR1cyBlYXJKMkVFU3RhdHVzID0gZG9lc1Byb2plY3RNYXRjaEoyRUVMZXZlbChlYXJQLCBqMmVlTGV2ZWwpOwotICAgICAgaWYoZWFySjJFRVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBlYXJKMkVFU3RhdHVzOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGoyZWVTdGF0dXM7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdGF0dXMgZG9lc1Byb2plY3RUYXJnZXRNYXRjaFNlcnZlclR5cGUoSVByb2plY3QgcCwgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAgIGlmIChwIT1udWxsICYmIHAuZXhpc3RzKCkpCi0gICAgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlAuZ2V0TmFtZSA9ICIrcC5nZXROYW1lKCkpOwotICAgICAgSVJ1bnRpbWUgcHJvamVjdFRhcmdldCA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFJ1bnRpbWVUYXJnZXQocC5nZXROYW1lKCkpOwotICAgICAgaWYgKHByb2plY3RUYXJnZXQhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0VGFyZ2V0SWQgPSBwcm9qZWN0VGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgU3RyaW5nIHNlcnZlclRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0UnVudGltZVRhcmdldElkRnJvbUZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWQpOwotICAgICAgICBpZiAoc2VydmVyVGFyZ2V0SWQhPW51bGwgJiYgc2VydmVyVGFyZ2V0SWQubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIGlmKCFwcm9qZWN0VGFyZ2V0SWQuZXF1YWxzKHNlcnZlclRhcmdldElkKSkKLSAgICAgICAgICB7IAotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1NFUlZFUl9UQVJHRVRfTUlTTUFUQ0giLG5ldyBTdHJpbmdbXXtwLmdldE5hbWUoKX0pLFN0YXR1cy5FUlJPUik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsgICAgICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBTdGF0dXMgZG9lc1Byb2plY3RNYXRjaEoyRUVMZXZlbChJUHJvamVjdCBwLCBTdHJpbmcgajJlZUxldmVsKQotICB7Ci0JU3RydWN0dXJlRWRpdCBtYyA9IG51bGw7Ci0gICAgdHJ5IHsKLQkJaWYgKHAhPW51bGwgJiYgcC5leGlzdHMoKSkKLQkJewotCQkgIG1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwKTsKLQkJICBXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkgIAotCQkJCi0JCSAgaW50IHByb2plY3RKMkVFTGV2ZWwgPSBKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb24ocCk7Ci0JCSAgaWYgKHByb2plY3RKMkVFTGV2ZWwhPS0xKQotCQkgIHsKLQkJICAgIFN0cmluZyBwcm9qZWN0SjJFRUxldmVsU3RyaW5nID0gU3RyaW5nLnZhbHVlT2YocHJvamVjdEoyRUVMZXZlbCk7Ci0JCSAgICBpZiAoajJlZUxldmVsIT1udWxsICYmIGoyZWVMZXZlbC5sZW5ndGgoKT4wKQotCQkgICAgewotCQkgICAgICBpZiAoIXByb2plY3RKMkVFTGV2ZWxTdHJpbmcuZXF1YWxzKGoyZWVMZXZlbCkpCi0JCSAgICAgIHsKLQkJICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfSjJFRV9NSVNNQVRDSCIsbmV3IFN0cmluZ1tde3AuZ2V0TmFtZSgpfSksIFN0YXR1cy5FUlJPUik7Ci0JCSAgICAgIH0KLQkJICAgIH0KLQkJICB9Ci0JCX0KLQl9IGZpbmFsbHkgewotCQlpZiAobWMgIT0gbnVsbCkKLQkJCW1jLmRpc3Bvc2UoKTsKLQl9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOyAgICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgdmFsaWRhdGVQcm9qZWN0VHlwZShTdHJpbmcgcHJvamVjdE5hbWUsIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHJ1bnRpbWUyQ2xpZW50VHlwZXMpCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgSVByb2plY3QgcCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKHByb2plY3ROYW1lKSk7Ci0gICAgaWYgKHA9PW51bGwgfHwgIXAuZXhpc3RzKCkpCi0gICAgewotICAgICAgLy9Qcm9qZWN0IGRvZXMgbm90IGV4aXN0IHdoaWNoIG1lYW5zIGEgbmV3IHByb2plY3Qgb2YgdGhlIGNvcnJlY3QgdHlwZSB3aWxsIGJlIGNyZWF0ZXMKLSAgICAgIC8vV2UncmUgZG9uZS4gQWxsIGlzIGdvb2QuCi0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAgIAotICAgIC8vSWYgdGhlIHByb2plY3QgZXhpc3RzLCB3ZSBzaG91bGQgc2VlIGl0IGluIHRoZSBwcm9qZWN0IGxpc3QgZm9yIHRoZSBzZWxlY3RlZCBjbGllbnQKLSAgICAvL3Byb2plY3QgdHlwZS4KLSAgICBTdHJpbmdbXSBwcm9qZWN0TmFtZXMgPSBydW50aW1lMkNsaWVudFR5cGVzLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocHJvamVjdE5hbWUuZXF1YWxzKHByb2plY3ROYW1lc1tpXSkpCi0gICAgICB7Ci0gICAgICAgIC8vRm91bmQgdGhlIHByb2plY3QuIEFsbCBpcyBnb29kLgotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvL0RpZG4ndCBmaW5kIHRoZSBwcm9qZWN0LiBSZXR1cm4gYW4gZXJyb3IuCi0gICAgLy9HZXQgdGhlIGxhYmVsIGZvciB0aGUgY2xpZW50IHR5cGUgaWQKLSAgICBTdHJpbmcgY2xpZW50VHlwZUxhYmVsID0gZ2V0Q2xpZW50VHlwZUxhYmVsKHJ1bnRpbWUyQ2xpZW50VHlwZXMuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpKTsKLSAgICBTdHJpbmcgbWVzc2FnZSA9IG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19XUk9OR19DTElFTlRfUFJPSkVDVF9UWVBFIixuZXcgU3RyaW5nW117cHJvamVjdE5hbWUsIGNsaWVudFR5cGVMYWJlbH0pOwotICAgIFN0YXR1cyBlU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtZXNzYWdlLFN0YXR1cy5FUlJPUik7Ci0gICAgcmV0dXJuIGVTdGF0dXM7Ci0gICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldENsaWVudFR5cGVMYWJlbCggU3RyaW5nIHR5cGUgKQotICB7Ci0gICAgQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeSByZWdpc3RyeSAgICAgICAgID0gQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZyAgICAgICAgICAgICAgICAgICAgY2xpZW50VHlwZUxhYmVsICA9IG51bGw7Ci0gICAgCi0gICAgY2xpZW50VHlwZUxhYmVsID0gcmVnaXN0cnkuZ2V0RWxlbWVudEJ5SWQodHlwZSkuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOwotICAgIAotICAgIHJldHVybiBjbGllbnRUeXBlTGFiZWw7Ci0gIH0gIAotICAKLSAgcHVibGljIGJvb2xlYW4gaXNQcm9qZWN0U2VydmljZVByb2plY3QoSVByb2plY3QgcCwgU3RyaW5nIHdzZGxVUkwsIFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlcikKLSAgewotICAgIGlmIChwPT1udWxsIHx8IHdzZGxVUkw9PW51bGwgfHwgd3NkbFVSTC5sZW5ndGgoKT09MCB8fCBwYXJzZXI9PW51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgSVJlc291cmNlIHdzWE1MID0gZ2V0V2ViU2VydmNlc1hNTChwKTsKLSAgICBpZiAod3NYTUw9PW51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgCi0gICAgICAvL01ha2UgYSBsaXN0IG9mIGFsbCB0aGUgd3NkbC1wb3J0J3MgaW4gd2Vic2VydmljZXMueG1sCi0gICAgV2ViU2VydmljZXNNYW5hZ2VyIHdzbSA9IG5ldyBXZWJTZXJ2aWNlc01hbmFnZXIoKTsKLSAgICBXZWJTZXJ2aWNlRWRpdE1vZGVsIHdzRWRpdE1vZGVsID0gd3NtLmdldFdTRWRpdE1vZGVsKHApOwotICAgIFdlYlNlcnZpY2VzIHdzID0gd3NFZGl0TW9kZWwuZ2V0V2ViU2VydmljZXMoKTsKLSAgICBJdGVyYXRvciB3c0Rlc2NzID0gd3MuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgQXJyYXlMaXN0IHdzZGxQb3J0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB3aGlsZSh3c0Rlc2NzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbil3c0Rlc2NzLm5leHQoKTsKLSAgICAgIEl0ZXJhdG9yIHBjcyA9IHdzRGVzYy5nZXRQb3J0Q29tcG9uZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShwY3MuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQb3J0Q29tcG9uZW50IHBjID0gKFBvcnRDb21wb25lbnQpcGNzLm5leHQoKTsKLSAgICAgICAgV1NETFBvcnQgd3NkbFBvcnQgPSBwYy5nZXRXc2RsUG9ydCgpOwotICAgICAgICB3c2RsUG9ydExpc3QuYWRkKG5ldyBRdWFsaWZpZWROYW1lKHdzZGxQb3J0LmdldE5hbWVzcGFjZVVSSSgpLCB3c2RsUG9ydC5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBBcnJheUxpc3QgcG9ydExpc3QgPSBnZXRQb3J0TmFtZXNGcm9tV3NkbCh3c2RsVVJMLCBwYXJzZXIpOwotCi0gICAgLy9JZiBhbnkgb2YgdGhlIFF1YWxpZmllZE5hbWVzIGluIHBvcnRMaXN0IGVxdWFscyBhbnkgb2YgdGhlIFF1YWxpZmllZE5hbWVzCi0gICAgLy9pbiB3c2RsUG9ydExpc3QsIHRoaXMgaXMgdGhlIHNlcnZpY2UgcHJvamVjdC4gUmV0dXJuIHRydWUuCi0gICAgT2JqZWN0W10gcG9ydHMgPSBwb3J0TGlzdC50b0FycmF5KCk7Ci0gICAgT2JqZWN0W10gd3NkbFBvcnRzID0gd3NkbFBvcnRMaXN0LnRvQXJyYXkoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvcnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFF1YWxpZmllZE5hbWUgcG9ydE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgcG9ydHNbaV07Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdzZGxQb3J0cy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgUXVhbGlmaWVkTmFtZSB3c2RsUG9ydE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgd3NkbFBvcnRzW2pdOwotICAgICAgICBpZiAocG9ydE5hbWUuZXF1YWxzKHdzZGxQb3J0TmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoKLSAgICogQGRlcHJlY2F0ZWQKLSAgICogCi0gICAqLwotICBwcml2YXRlIElSZXNvdXJjZSBnZXRXZWJTZXJ2Y2VzWE1MKElQcm9qZWN0IHApCi0gIHsKLQkgIC8vIAotLy8gICAgSjJFRU5hdHVyZSBuYXR1cmUgPSAoSjJFRU5hdHVyZSkgSjJFRU5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZShwKTsKLS8vICAgIGlmIChuYXR1cmUgPT0gbnVsbCkKLS8vICAgICAgcmV0dXJuIG51bGw7Ci0KLS8vICAgIElSZXNvdXJjZSBtb2R1bGVSb290ID0gbmF0dXJlLmdldE1vZHVsZVNlcnZlclJvb3QoKTsKLS8vCUlSZXNvdXJjZSBtb2R1bGVSb290ID0gUmVzb3VyY2VVdGlscy5nZXRXZWJNb2R1bGVTZXJ2ZXJSb290KHApOwotCUlSZXNvdXJjZSBtb2R1bGVSb290ID0gSjJFRVV0aWxzLmdldEZpcnN0V2ViQ29udGVudENvbnRhaW5lcihwKTsgIAotICAgIGlmICghKG1vZHVsZVJvb3QgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgSVJlc291cmNlIHdlYlNlcnZpY2VzWE1MPW51bGw7Ci0vLyAgICBpZiAobmF0dXJlIGluc3RhbmNlb2YgSjJFRVdlYk5hdHVyZVJ1bnRpbWUpCi0JaWYgKFJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHApKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciB3c1BhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICB3c1BhdGguYXBwZW5kKCJXRUItSU5GLyIpOwotICAgICAgd3NQYXRoLmFwcGVuZChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfRERfU0hPUlRfTkFNRSk7Ci0gICAgICB3ZWJTZXJ2aWNlc1hNTCA9ICgoSUNvbnRhaW5lciltb2R1bGVSb290KS5maW5kTWVtYmVyKHdzUGF0aC50b1N0cmluZygpKTsgCi0gICAgfQotICAgIGVsc2UgLy9NdXN0IGJlIGFuIEFwcGxpY2F0aW9uIENsaWVudCBNb2R1bGUgb3IgYW4gRUpCIE1vZHVsZQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciB3c1BhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICB3c1BhdGguYXBwZW5kKCJNRVRBLUlORi8iKTsKLSAgICAgIHdzUGF0aC5hcHBlbmQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX0REX1NIT1JUX05BTUUpOwotICAgICAgd2ViU2VydmljZXNYTUwgPSAoKElDb250YWluZXIpbW9kdWxlUm9vdCkuZmluZE1lbWJlcih3c1BhdGgudG9TdHJpbmcoKSk7ICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHdlYlNlcnZpY2VzWE1MOwotICB9Ci0gIAotICBwcml2YXRlIEFycmF5TGlzdCBnZXRQb3J0TmFtZXNGcm9tV3NkbChTdHJpbmcgd3NkbFVSTCwgV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyKQotICB7Ci0gIAlBcnJheUxpc3QgcG9ydE5hbWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAJRGVmaW5pdGlvbiBkZWYgPSBwYXJzZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSTCk7Ci0gICAgTWFwIHNlcnZpY2VzID0gZGVmLmdldFNlcnZpY2VzKCk7Ci0gICAgU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBzZXJ2aWNlID0gKFNlcnZpY2UpaXQubmV4dCgpOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIE1hcCBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQyID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAJUG9ydCBwb3J0ID0gKFBvcnQpaXQyLm5leHQoKTsKLSAgICAgIAlwb3J0TmFtZUxpc3QuYWRkKG5ldyBRdWFsaWZpZWROYW1lKG5hbWVzcGFjZSwgcG9ydC5nZXROYW1lKCkpKTsKLSAgICAgIH0KLSAgICB9ICAgICAgICAKLSAgCQotICAJcmV0dXJuIHBvcnROYW1lTGlzdDsKLSAgCQotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIFF1YWxpZmllZE5hbWUKLSAgewotICAgIFN0cmluZyBuYW1lc3BhY2VVUkk7Ci0KLSAgICBTdHJpbmcgbG9jYWxQYXJ0OwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQKLSAgICAgKi8KLSAgICBwdWJsaWMgUXVhbGlmaWVkTmFtZShTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxQYXJ0KQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICAgIHRoaXMubG9jYWxQYXJ0ID0gbG9jYWxQYXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9jYWxQYXJ0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxQYXJ0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gbG9jYWxQYXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQKLSAgICAgKiAgICAgICAgICBUaGUgbG9jYWxQYXJ0IHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbFBhcnQoU3RyaW5nIGxvY2FsUGFydCkKLSAgICB7Ci0gICAgICB0aGlzLmxvY2FsUGFydCA9IGxvY2FsUGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWVzcGFjZVVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0gICAgewotICAgICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0gICAgICogICAgICAgICAgVGhlIG5hbWVzcGFjZVVSSSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gICAgewotICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFF1YWxpZmllZE5hbWUgcW4pCi0gICAgewotICAgICAgcmV0dXJuIChxbi5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJiBxbi5nZXRMb2NhbFBhcnQoKQotICAgICAgICAgIC5lcXVhbHMobG9jYWxQYXJ0KSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9DbGllbnRSb290RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL0NsaWVudFJvb3RGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTA0OGNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL0NsaWVudFJvb3RGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5Bc3NlbWJsZUNsaWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkRlcGxveUNsaWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkRldmVsb3BDbGllbnRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5JbnN0YWxsQ2xpZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuUnVuQ2xpZW50RnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRSb290RnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50IAotewotICBwdWJsaWMgQ2xpZW50Um9vdEZyYWdtZW50KCkKLSAgewotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IERldmVsb3BDbGllbnRGcmFnbWVudCgpICk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBQcmVDbGllbnRBc3NlbWJsZUNvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQoKSApOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgUHJlQ2xpZW50RGVwbG95Q29tbWFuZCgpLCAiIiApICk7Ci0gICAgYWRkKCBuZXcgRGVwbG95Q2xpZW50RnJhZ21lbnQoKSApOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgUHJlQ2xpZW50SW5zdGFsbENvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IEluc3RhbGxDbGllbnRGcmFnbWVudCgpICk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBQcmVDbGllbnRSdW5Db21tYW5kKCksICIiICkgKTsKLSAgICBhZGQoIG5ldyBSdW5DbGllbnRGcmFnbWVudCgpICk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5KSAKLSAgewotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0JCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJTZWxlY3Rpb24iLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgQXNzZW1ibGVDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhciIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLQkKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBEZXBsb3lDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBEZXBsb3lDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBEZXBsb3lDbGllbnRGcmFnbWVudC5jbGFzcyApOwotCQotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgSW5zdGFsbENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgSW5zdGFsbENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgSW5zdGFsbENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgSW5zdGFsbENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgSW5zdGFsbENsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0JCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBSdW5DbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJTZWxlY3Rpb24iLCBSdW5DbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIFJ1bkNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLQkKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50QXNzZW1ibGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnRBc3NlbWJsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjMDAyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnRBc3NlbWJsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIFByZUNsaWVudEFzc2VtYmxlQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSAKLSAgewotCVN5c3RlbS5vdXQucHJpbnRsbiggIkluIFByZSBjbGllbnQgYXNzZW1ibGUgY29tbWFuZC4iICk7Ci0KLQlyZXR1cm4gc3VwZXIuZXhlY3V0ZShlbnZpcm9ubWVudCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL1ByZUNsaWVudERlcGxveUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL1ByZUNsaWVudERlcGxveUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkODZjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnREZXBsb3lDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBQcmVDbGllbnREZXBsb3lDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCAKLXsKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSAKLSAgewotCVN5c3RlbS5vdXQucHJpbnRsbiggIkluIFByZSBjbGllbnQgZGVwbG95IGNvbW1hbmQuIiApOwotCi0JcmV0dXJuIHN1cGVyLmV4ZWN1dGUoZW52aXJvbm1lbnQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnREZXZlbG9wQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2NzFjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnREZXZlbG9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZUNsaWVudEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5TaW1wbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyXzsKLSAgcHJpdmF0ZSBFbnZpcm9ubWVudCAgICAgICBlbnZpcm9ubWVudF87Ci0gIHByaXZhdGUgSUNvbnRleHQgICAgICAgICAgY29udGV4dF87Ci0gIHByaXZhdGUgSVNlbGVjdGlvbiAgICAgICAgc2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBtb2R1bGVfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIGVhcl87Ci0gIHByaXZhdGUgSVdlYlNlcnZpY2VDbGllbnQgd2ViU2VydmljZUNsaWVudF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgajJlZUxldmVsXzsKLSAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgICByZXNvdXJjZUNvbnRleHRfOwotCXByaXZhdGUgYm9vbGVhbgkJCQkJCXRlc3RfOwotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgCi0gIHsKLQlJV2ViU2VydmljZVJ1bnRpbWUgICB3c3J0ICAgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VSdW50aW1lKCB0eXBlUnVudGltZVNlcnZlcl8uZ2V0UnVudGltZUlkKCkgKTsKLQlXZWJTZXJ2aWNlQ2xpZW50SW5mbyB3c0luZm8gPSBuZXcgV2ViU2VydmljZUNsaWVudEluZm8oKTsKLSAKLQlTeXN0ZW0ub3V0LnByaW50bG4oICJJbiBQcmUgY2xpZW50IGRldmVsb3AgY29tbWFuZC4iICk7Ci0JCi0Jd3NJbmZvLnNldEoyZWVMZXZlbCggajJlZUxldmVsXyApOwotCXdzSW5mby5zZXRTZXJ2ZXJGYWN0b3J5SWQoIHR5cGVSdW50aW1lU2VydmVyXy5nZXRTZXJ2ZXJJZCgpICk7Ci0Jd3NJbmZvLnNldFN0YXRlKCBXZWJTZXJ2aWNlU3RhdGUuVU5LTk9XTl9MSVRFUkFMICk7Ci0Jd3NJbmZvLnNldFdlYlNlcnZpY2VSdW50aW1lSWQoIHR5cGVSdW50aW1lU2VydmVyXy5nZXRSdW50aW1lSWQoKSApOwotCi0JZW52aXJvbm1lbnRfICAgICAgID0gZW52aXJvbm1lbnQ7Ci0Jd2ViU2VydmljZUNsaWVudF8gID0gd3NydC5nZXRXZWJTZXJ2aWNlQ2xpZW50KCB3c0luZm8gKTsKLQlXZWJTZXJ2aWNlU2NlbmFyaW8gc2NlbmFyaW8gPSBXZWJTZXJ2aWNlU2NlbmFyaW8uQ0xJRU5UX0xJVEVSQUw7Ci0JY29udGV4dF8gICAgICAgICAgID0gbmV3IFNpbXBsZUNvbnRleHQodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdGVzdF8sIGZhbHNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCXNjZW5hcmlvLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCXJlc291cmNlQ29udGV4dF8uaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQlyZXNvdXJjZUNvbnRleHRfLmlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKSwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQlyZXNvdXJjZUNvbnRleHRfLmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSk7Ci0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlciApCi0gIHsKLQl0eXBlUnVudGltZVNlcnZlcl8gPSB0eXBlUnVudGltZVNlcnZlcjsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRKMkVFVmVyc2lvbiggU3RyaW5nIGoyZWVMZXZlbCApCi0gIHsKLQlqMmVlTGV2ZWxfID0gajJlZUxldmVsOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJV2ViU2VydmljZUNsaWVudCBnZXRXZWJTZXJ2aWNlKCkKLSAgewotCXJldHVybiB3ZWJTZXJ2aWNlQ2xpZW50XzsgIAotICB9Ci0gIAotICBwdWJsaWMgRW52aXJvbm1lbnQgZ2V0RW52aXJvbm1lbnQoKQotICB7Ci0JcmV0dXJuIGVudmlyb25tZW50XzsKLSAgfQotICAKLSAgcHVibGljIElDb250ZXh0IGdldENvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRleHRfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQgKQotICB7Ci0gICAgcmVzb3VyY2VDb250ZXh0XyA9IHJlc291cmNlQ29udGV4dDsJICAKLSAgfQotICAKLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25fOwkgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oIElTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgewotCXNlbGVjdGlvbl8gPSBzZWxlY3Rpb247ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRNb2R1bGUoKQotICB7Ci0gICAgcmV0dXJuIG1vZHVsZV87CSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vZHVsZSggU3RyaW5nIG1vZHVsZSApCi0gIHsKLQltb2R1bGVfID0gbW9kdWxlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEVhcigpCi0gIHsKLQlyZXR1cm4gZWFyXzsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXIoIFN0cmluZyBlYXIgKQotICB7Ci0JZWFyXyA9IGVhcjsgIAotICB9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoYm9vbGVhbiB0ZXN0U2VydmljZSkKLQl7Ci0JCXRlc3RfID0gdGVzdFNlcnZpY2U7Ci0JfQkJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnRJbnN0YWxsQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50SW5zdGFsbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2ODgzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnRJbnN0YWxsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgUHJlQ2xpZW50SW5zdGFsbENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotCSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSAKLQkgIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCAiSW4gUHJlIGNsaWVudCBpbnN0YWxsIGNvbW1hbmQuIiApOwotCi0JCXJldHVybiBzdXBlci5leGVjdXRlKGVudmlyb25tZW50KTsKLQkgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50UnVuQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50UnVuQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWUwYzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL1ByZUNsaWVudFJ1bkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIFByZUNsaWVudFJ1bkNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotCSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSAKLQkgIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCAiSW4gUHJlIGNsaWVudCBydW4gY29tbWFuZC4iICk7Ci0KLQkJcmV0dXJuIHN1cGVyLmV4ZWN1dGUoZW52aXJvbm1lbnQpOwotCSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1NzQ0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotLyoqCi0qIFRoaXMgaXMgdGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBwbHVnaW4uCi0qIDxwPgotKiBUaGlzIHBsdWdpbiBjb250YWlucyB0aGUgZ3JhcGhpYyB1c2VyIGludGVyZmFjZSB0byB0aGUKLSogV2ViIFNlcnZpY2VzIHJ1bnRpbWUgZm91bmQgaW4gb3JnLmVjbGlwc2UuanN0LndzLgotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luIGluc3RhbmNlXzsKLQotICBwcml2YXRlIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBzZXJ2ZXJSdW50aW1lQ29udGV4dF87Ci0gIHByaXZhdGUgTG9nIGxvZ187Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luICgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGluc3RhbmNlXyA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAqIChXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbilQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmpzdC53cy51aSIpOwotICAqIEByZXR1cm4gVGhlIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luIHNpbmdsZXRvbi4KLSAgKi8KLSAgc3RhdGljIHB1YmxpYyBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbiBnZXRJbnN0YW5jZSAoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLSAgKiBAcGFyYW0ga2V5IFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLgotICAqIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiCi0gICogd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotICAqIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5ICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucGx1Z2luIiwgaW5zdGFuY2VfICk7Ci0gICAgCi0gICAgaWYoIGtleS5zdGFydHNXaXRoKCIlIikpCi0gICAgewotICAgICAga2V5ID0ga2V5LnN1YnN0cmluZyggMSwga2V5Lmxlbmd0aCgpICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBtc2dVdGlscy5nZXRNZXNzYWdlKGtleSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvciB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlLgotICAqIFN1YnN0aXR1dGlvbiBzZXF1ZW5jZXMgaW4gdGhlIG1lc3NhZ2Ugc3RyaW5nCi0gICogYXJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBhcnJheSBvZiBzdWJzdGl0dXRpb24gb2JqZWN0cyAod2hpY2gKLSAgKiBhcmUgbW9zdCBmcmVxdWVudGx5IHN0cmluZ3MpLiBTZWUgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgZm9yCi0gICogZnVydGhlciBkZXRhaWxzIG9uIHN1YnN0aXR1dGlvbi4KLSAgKiBAcGFyYW0ga2V5IFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLgotICAqIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiCi0gICogd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotICAqIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0gICogQHBhcmFtIGFyZ3MgVGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlCi0gICogYXMgcmVxdWlyZWQgYnkgdGhlIG1lc3NhZ2UgaW4gcGx1Z2luLnByb3BlcnRpZXMgYW5kCi0gICogYnkgdGhlIHJ1bGVzIG9mIGNsYXNzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncyApCi0gIHsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0TWVzc2FnZShrZXkpLGFyZ3MpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgcmVzb3VyY2UKLSAgKiBhcyByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24uCi0gICogQHJldHVybiBBbiBpbWFnZSBkZXNjcmlwdG9yLCBwb3NzaWJseSBudWxsLgotICAqLwotICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkwgaW5zdGFsbFVSTCA9IGluc3RhbmNlXy5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOzsKLSAgICAgIFVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCxuYW1lKTsKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpblN0YXRlTG9jYXRpb24oKSB7Ci0gICAgcmV0dXJuIFBsYXRmb3JtLmdldFBsdWdpblN0YXRlTG9jYXRpb24odGhpcykudG9PU1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIikpLmdldEZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAKLSAgcHVibGljIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBnZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpIAotCXsKLQkgIGlmIChzZXJ2ZXJSdW50aW1lQ29udGV4dF8gPT0gbnVsbCkKLQkgIAl7Ci0JICAJCXNlcnZlclJ1bnRpbWVDb250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQoKTsKLQkgIAkJc2VydmVyUnVudGltZUNvbnRleHRfLmxvYWQoKTsKLQkgIAl9Ci0JICByZXR1cm4gc2VydmVyUnVudGltZUNvbnRleHRfOwotCX0gIAotICB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0MDBiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dCB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgUFJFRkVSRU5DRV9TRVJWRVIgPSAiUFJFRkVSRU5DRV9TRVJWRVIiOwotCXByaXZhdGUgU3RyaW5nIFBSRUZFUkVOQ0VfUlVOVElNRSA9ICJQUkVGRVJFTkNFX1JVTlRJTUUiOwotCXByaXZhdGUgU3RyaW5nIFBSRUZFUkVOQ0VfSjJFRV9WRVJTSU9OID0gIlBSRUZFUkVOQ0VfSjJFRV9WRVJTSU9OIjsKLQkKLQlwcml2YXRlIFN0cmluZyBTRVJWRVJfRkFDVE9SWV9JRF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIjsKLQlwcml2YXRlIFN0cmluZyBSVU5USU1FX0lEX0RFRkFVTFQgPSAib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIjsKLQlwcml2YXRlIFN0cmluZyBKMkVFX1ZFUlNJT05fREVGQVVMVCA9ICIxMyI7Ci0JCi0JcHVibGljIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpCi0JewotCQlzdXBlcihXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuQ29udGV4dCNsb2FkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKCkgewotCQkvL0RlZmF1bHRzIHdpbGwgYmUgc2V0IHZpYSB0aGUgLmluaSBjdXN0b21pemF0aW9uLiBUaGV5IGFyZSBoYXJkIGNvZGVkIHRvIGRlZmF1bHQgdmFsdWVzIGluIHRoZQotCQkvL2Fic2VuY2Ugb2YgYSAuaW5pIGZpbGUuCi0JCVN0cmluZyBzZXJ2ZXJEZWZhdWx0ID0gZ2V0RGVmYXVsdFN0cmluZyhQUkVGRVJFTkNFX1NFUlZFUik7Ci0JCWlmIChzZXJ2ZXJEZWZhdWx0PT1udWxsIHx8IHNlcnZlckRlZmF1bHQubGVuZ3RoKCk9PTApCi0JCXsKLQkJICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfU0VSVkVSLCBTRVJWRVJfRkFDVE9SWV9JRF9ERUZBVUxUKTsKLQkJfQotCi0JCVN0cmluZyBydW50aW1lRGVmYXVsdCA9IGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9SVU5USU1FKTsKLQkJaWYgKHJ1bnRpbWVEZWZhdWx0PT1udWxsIHx8IHJ1bnRpbWVEZWZhdWx0Lmxlbmd0aCgpPT0wKQotCQl7Ci0JCSAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1JVTlRJTUUsIFJVTlRJTUVfSURfREVGQVVMVCk7Ci0JCX0KLQotCQlTdHJpbmcgajJlZURlZmF1bHQgPSBnZXREZWZhdWx0U3RyaW5nKFBSRUZFUkVOQ0VfSjJFRV9WRVJTSU9OKTsKLQkJaWYgKGoyZWVEZWZhdWx0PT1udWxsIHx8IGoyZWVEZWZhdWx0Lmxlbmd0aCgpPT0wKQotCQl7Ci0JCSAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyRUVfVkVSU0lPTiwgSjJFRV9WRVJTSU9OX0RFRkFVTFQpOwotCQl9Ci0KLQkJCQkKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2VydmVyRmFjdG9yeUlkKCkKLQl7Ci0JCXJldHVybiBnZXREZWZhdWx0U3RyaW5nKFBSRUZFUkVOQ0VfU0VSVkVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lSWQoKQotCXsKLQkJcmV0dXJuIGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9SVU5USU1FKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRKMkVFVmVyc2lvbigpCi0JewotCQlyZXR1cm4gZ2V0RGVmYXVsdFN0cmluZyhQUkVGRVJFTkNFX0oyRUVfVkVSU0lPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJGYWN0b3J5SWQoKQotCXsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX1NFUlZFUik7IAotCQkvKgotCQlpZiAodmFsdWU9PW51bGwgfHwgdmFsdWUubGVuZ3RoKCk9PTApCi0JCXsKLQkJCXZhbHVlID0gU0VSVkVSX0ZBQ1RPUllfSURfREVGQVVMVDsgCi0JCQlzZXRTZXJ2ZXJGYWN0b3J5SWQodmFsdWUpOwotCQl9Ci0JCSovCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lSWQoKQotCXsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX1JVTlRJTUUpOwotCQkvKgotCQlpZiAodmFsdWU9PW51bGwgfHwgdmFsdWUubGVuZ3RoKCk9PTApCi0JCXsKLQkJCXZhbHVlID0gUlVOVElNRV9JRF9ERUZBVUxUOyAKLQkJCXNldFJ1bnRpbWVJZCh2YWx1ZSk7Ci0JCX0KLQkJKi8KLQkJcmV0dXJuIHZhbHVlOwkJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRVZlcnNpb24oKQotCXsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0oyRUVfVkVSU0lPTik7Ci0JCS8qCi0JCWlmICh2YWx1ZT09bnVsbCB8fCB2YWx1ZS5sZW5ndGgoKT09MCkKLQkJewotCQkJdmFsdWUgPSBKMkVFX1ZFUlNJT05fREVGQVVMVDsgCi0JCQlzZXRKMkVFVmVyc2lvbih2YWx1ZSk7Ci0JCX0KLQkJKi8KLQkJcmV0dXJuIHZhbHVlOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgaWQpCi0JewotCQlzZXRWYWx1ZShQUkVGRVJFTkNFX1NFUlZFUixpZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVJZChTdHJpbmcgaWQpCi0JewotCQlzZXRWYWx1ZShQUkVGRVJFTkNFX1JVTlRJTUUsIGlkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIHZlcnNpb24pCi0JewotCQlzZXRWYWx1ZShQUkVGRVJFTkNFX0oyRUVfVkVSU0lPTiwgdmVyc2lvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9TZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvU2VydmVyUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYzI3ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9TZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3RDaG9pY2VzOwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclJ1bnRpbWVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBMaXN0ZW5lciAKLXsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZF89ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkKLQkvKiBDT05URVhUX0lEIFNSUEYwMDAxIGZvciBzZXJ2ZXIgcHJlZmVyZW5jZSBvbiB0aGUgc2VydmVyIHJ1bnRpbWUgcHJlZmVyZW5jZSBwYWdlICovCi0JcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9TUlBGX1NFUlZFUl9QUkVGID0gcGx1Z2luSWRfICsgIi5TUlBGMDAwMSI7Ci0JcHJpdmF0ZSBDb21ibyBzZXJ2ZXJfOwotCi0JLyogQ09OVEVYVF9JRCBTUlBGMDAwMiBmb3IgcnVudGltZSBwcmVmZXJlbmNlIG9uIHRoZSBzZXJ2ZXIgcnVudGltZSBwcmVmZXJlbmNlIHBhZ2UgKi8KLQlwcml2YXRlIFN0cmluZyBJTkZPUE9QX1NSUEZfUlVOVElNRV9QUkVGID0gcGx1Z2luSWRfICsgIi5TUlBGMDAwMiI7Ci0JcHJpdmF0ZSBDb21ibyBydW50aW1lXzsJCi0KLQkvKiBDT05URVhUX0lEIFNSUEYwMDAzIGZvciBKMkVFIHZlcnNpb24gcHJlZmVyZW5jZSBvbiB0aGUgc2VydmVyIHJ1bnRpbWUgcHJlZmVyZW5jZSBwYWdlICovCi0JcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9TUlBGX0oyRUVfUFJFRiA9IHBsdWdpbklkXyArICIuU1JQRjAwMDMiOwotCXByaXZhdGUgQ29tYm8gajJlZVZlcnNpb25fOwotCQotCVNlbGVjdGlvbkxpc3RDaG9pY2VzIHNlcnZlclRvUnVudGltZVRvSjJFRV87Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgICB7IH0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgCi0JewotCSAgCi0JICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyk7Ci0JICBVSVV0aWxzIHVpVXRpbHMgPSBuZXcgVUlVdGlscyhtc2dVdGlsc18sIHBsdWdpbklkXyk7Ci0JICAKLQkgIENvbXBvc2l0ZSBwYWdlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotCSAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0JICBwYWdlLnNldExheW91dChnbCk7Ci0JICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkgIHBhZ2Uuc2V0TGF5b3V0RGF0YShnZCk7Ci0JICAKLQkgIHNlcnZlcl8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHBhZ2UsIkxBQkVMX1NFUlZFUlNfTElTVCIsCi0JICAJCSAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1NSUEZfQ09NQk9fU0VSVkVSIiwKLQkJCQkJCQkJCUlORk9QT1BfU1JQRl9TRVJWRVJfUFJFRiwKLQkJCQkJCQkJCVNXVC5TSU5HTEV8U1dULkJPUkRFUnxTV1QuUkVBRF9PTkxZKTsKLQkgIAotCSAgcnVudGltZV8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHBhZ2UsIkxBQkVMX1JVTlRJTUVTX0xJU1QiLAotCSAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfU1JQRl9DT01CT19SVU5USU1FIiwKLQkJCQkJCQkJCSBJTkZPUE9QX1NSUEZfUlVOVElNRV9QUkVGLAotCQkJCQkJCQkJIFNXVC5TSU5HTEV8U1dULkJPUkRFUnxTV1QuUkVBRF9PTkxZKTsKLQkgIAotCSAgajJlZVZlcnNpb25fID0gdWlVdGlscy5jcmVhdGVDb21ibyhwYWdlLCJMQUJFTF9KMkVFX1ZFUlNJT04iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9TUlBGX0NPTUJPX0oyRUUiLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1NSUEZfSjJFRV9QUkVGLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFfFNXVC5CT1JERVJ8U1dULlJFQURfT05MWSk7CSAgCi0KLQkgIGluaXRpYWxpemVWYWx1ZXMoKTsKLQkgIHN0YXJ0TGlzdGVuaW5nKCk7Ci0JICByZXR1cm4gcGFnZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0JewotCQlQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXyA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0U2VydmVyVG9SdW50aW1lVG9KMkVFKCk7Ci0KLQotCQlzZXRTZXJ2ZXJJdGVtcyhzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldExpc3QoKS5nZXRMaXN0KCkpOwotCQlTdHJpbmcgZGVmYXVsdFNlcnZlclRleHQgPSBjb250ZXh0LmdldFNlcnZlckZhY3RvcnlJZCgpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShkZWZhdWx0U2VydmVyVGV4dCk7Ci0JCXNldFNlcnZlclNlbGVjdGlvbihkZWZhdWx0U2VydmVyVGV4dCk7Ci0JCQotCQlzZXRSdW50aW1lSXRlbXMoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpKTsKLQkJU3RyaW5nIGRlZmF1bHRSdW50aW1lVGV4dCA9IGNvbnRleHQuZ2V0UnVudGltZUlkKCk7Ci0JCXNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGRlZmF1bHRSdW50aW1lVGV4dCk7Ci0JCXNldFJ1bnRpbWVTZWxlY3Rpb24oZGVmYXVsdFJ1bnRpbWVUZXh0KTsKLQkJCi0JCXNldEoyRUVJdGVtcyhzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCkpOwotCQlTdHJpbmcgZGVmYXVsdEoyRUVWZXJzaW9uID0gY29udGV4dC5nZXRKMkVFVmVyc2lvbigpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShkZWZhdWx0SjJFRVZlcnNpb24pOwotCQlzZXRKMkVFU2VsZWN0aW9uKGRlZmF1bHRKMkVFVmVyc2lvbik7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLQl7Ci0JCWlmIChzZXJ2ZXJfID09IGV2ZW50LndpZGdldCkKLQkJewotCQkJaGFuZGxlU2VydmVyU2VsZWN0ZWQoKTsKLQkJfQotCQllbHNlIGlmIChydW50aW1lXyA9PSBldmVudC53aWRnZXQpCi0JCXsKLQkJCWhhbmRsZVJ1bnRpbWVTZWxlY3RlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKGoyZWVWZXJzaW9uXyA9PSBldmVudC53aWRnZXQpCi0JCXsJCQkKLQkJCWhhbmRsZUoyRUVTZWxlY3RlZCgpOwotCQl9CQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlcnZlclNlbGVjdGVkKCkKLQl7Ci0JCXN0b3BMaXN0ZW5pbmcoKTsKLQkJCi0JCVN0cmluZyBzZWxlY3RlZFRleHQgPSBnZXRTZXJ2ZXJTZWxlY3Rpb24oKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoc2VsZWN0ZWRUZXh0KTsKLQkJCi0JCS8vVXBkYXRlIHRoZSBydW50aW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJc2V0UnVudGltZUl0ZW1zKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKSk7Ci0JCWlmIChzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCkubGVuZ3RoID4gMCkKLQkJICBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRJbmRleCgwKTsKLQkJCi0JCVN0cmluZyBuZXdSdW50aW1lVGV4dCA9IHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotCQlpZiAobmV3UnVudGltZVRleHQhPW51bGwgJiYgbmV3UnVudGltZVRleHQubGVuZ3RoKCk+MCkKLQkJCXNldFJ1bnRpbWVTZWxlY3Rpb24obmV3UnVudGltZVRleHQpOwotCQkKLQkJLy9VcGRhdGUgdGhlIGoyZWUgdmVyc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCWlmIChuZXdSdW50aW1lVGV4dCE9bnVsbCAmJiBuZXdSdW50aW1lVGV4dC5sZW5ndGgoKT4wKQotCQl7Ci0JCSAgc2V0SjJFRUl0ZW1zKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKSk7Ci0JCSAgaWYgKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKS5sZW5ndGggPiAwKQotCQkJICBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRJbmRleCgwKTsKLQkJCQotCQkJU3RyaW5nIG5ld0oyRUVUZXh0ID0gc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAobmV3SjJFRVRleHQhPW51bGwgJiYgbmV3SjJFRVRleHQubGVuZ3RoKCk+MCkKLQkJCQlzZXRKMkVFU2VsZWN0aW9uKG5ld0oyRUVUZXh0KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJICBzZXRKMkVFSXRlbXMobmV3IFN0cmluZ1swXSk7Ci0JCX0KLQkJCi0JCXN0YXJ0TGlzdGVuaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVSdW50aW1lU2VsZWN0ZWQoKQotCXsKLQkJc3RvcExpc3RlbmluZygpOwotCQkKLQkJU3RyaW5nIHNlbGVjdGVkVGV4dCA9IGdldFJ1bnRpbWVTZWxlY3Rpb24oKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoc2VsZWN0ZWRUZXh0KTsKLQkJCi0JCS8vVXBkYXRlIHRoZSBqMmVlIHZlcnNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlzZXRKMkVFSXRlbXMoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpKTsKLQkJaWYgKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKS5sZW5ndGggPiAwKQotCQkgIHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldEluZGV4KDApOwotCQkKLQkJU3RyaW5nIG5ld0oyRUVUZXh0ID0gc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChuZXdKMkVFVGV4dCE9bnVsbCAmJiBuZXdKMkVFVGV4dC5sZW5ndGgoKT4wKQotCQkJc2V0SjJFRVNlbGVjdGlvbihuZXdKMkVFVGV4dCk7Ci0JCQkJCi0JCXN0YXJ0TGlzdGVuaW5nKCk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUoyRUVTZWxlY3RlZCgpCi0JewotCQlzdG9wTGlzdGVuaW5nKCk7Ci0JCQotCQlTdHJpbmcgc2VsZWN0ZWRUZXh0ID0gZ2V0SjJFRVNlbGVjdGlvbigpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShzZWxlY3RlZFRleHQpOwotCQkKLQkJc3RhcnRMaXN0ZW5pbmcoKTsKLQl9Ci0gICAgLyoqCi0JICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0JewotCSAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JICBzZXRUb0RlZmF1bHRzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRUb0RlZmF1bHRzKCkKLQl7Ci0JCVBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotCi0JCVN0cmluZyBkZWZhdWx0U2VydmVyVGV4dCA9IGNvbnRleHQuZ2V0RGVmYXVsdFNlcnZlckZhY3RvcnlJZCgpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShkZWZhdWx0U2VydmVyVGV4dCk7Ci0JCXNldFNlcnZlclNlbGVjdGlvbihkZWZhdWx0U2VydmVyVGV4dCk7Ci0JCQotCQlzZXRSdW50aW1lSXRlbXMoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpKTsKLQkJU3RyaW5nIGRlZmF1bHRSdW50aW1lVGV4dCA9IGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVJZCgpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShkZWZhdWx0UnVudGltZVRleHQpOwotCQlzZXRSdW50aW1lU2VsZWN0aW9uKGRlZmF1bHRSdW50aW1lVGV4dCk7Ci0JCQotCQlzZXRKMkVFSXRlbXMoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpKTsKLQkJU3RyaW5nIGRlZmF1bHRKMkVFVmVyc2lvbiA9IGNvbnRleHQuZ2V0RGVmYXVsdEoyRUVWZXJzaW9uKCk7Ci0JCXNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGRlZmF1bHRKMkVFVmVyc2lvbik7Ci0JCXNldEoyRUVTZWxlY3Rpb24oZGVmYXVsdEoyRUVWZXJzaW9uKTsJCQotCX0KLQotCS8qKgotCSAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKiAgQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0JewotCSAgc3RvcmVWYWx1ZXMoKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpCi0JewotICAgICAgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICBjb250ZXh0LnNldFNlcnZlckZhY3RvcnlJZChnZXRTZXJ2ZXJTZWxlY3Rpb24oKSk7Ci0gICAgICBjb250ZXh0LnNldFJ1bnRpbWVJZChnZXRSdW50aW1lU2VsZWN0aW9uKCkpOwotICAgICAgY29udGV4dC5zZXRKMkVFVmVyc2lvbihnZXRKMkVFU2VsZWN0aW9uKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotCXsKLQkgIHBlcmZvcm1PaygpOwotCX0KLQkKLSAgCQotCXByaXZhdGUgdm9pZCBzdGFydExpc3RlbmluZygpCi0JewotCSAgc2VydmVyXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLHRoaXMpOwotCSAgcnVudGltZV8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbix0aGlzKTsKLQkgIGoyZWVWZXJzaW9uXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLHRoaXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wTGlzdGVuaW5nKCkKLQl7Ci0JICBzZXJ2ZXJfLnJlbW92ZUxpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCSAgcnVudGltZV8ucmVtb3ZlTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JICBqMmVlVmVyc2lvbl8ucmVtb3ZlTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNlcnZlckl0ZW1zKFN0cmluZ1tdIGZhY3RvcnlJZHMpCi0JewotCSAgCi0JICBpZiAoZmFjdG9yeUlkcyAhPSBudWxsKQotCSAgewotCQkvL1N0cmluZ1tdIHNlcnZlckxhYmVscyA9IG5ldyBTdHJpbmdbZmFjdG9yeUlkcy5sZW5ndGhdOwotCSAgICBBcnJheUxpc3Qgc2VydmVyTGFiZWxzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wO2k8ZmFjdG9yeUlkcy5sZW5ndGg7aSsrKQotCQl7Ci0JCQlTdHJpbmcgdGhpc0ZhY3RvcnlJZCA9IGZhY3RvcnlJZHNbaV07Ci0JCQlTdHJpbmcgdGhpc1NlcnZlckxhYmVsID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJMYWJlbChmYWN0b3J5SWRzW2ldKTsKLQkJCWlmICh0aGlzU2VydmVyTGFiZWwhPW51bGwgJiYgdGhpc1NlcnZlckxhYmVsLmxlbmd0aCgpPjApCi0JCQl7Ci0JCQkgIHNlcnZlckxhYmVsc0xpc3QuYWRkKHRoaXNTZXJ2ZXJMYWJlbCk7Ci0JCQl9Ci0JCQkKLQkJfQotCQlTdHJpbmdbXSBzZXJ2ZXJMYWJlbHMgPSBjb252ZXJ0VG9TdHJpbmdBcnJheShzZXJ2ZXJMYWJlbHNMaXN0LnRvQXJyYXkoKSk7IAotCQlzZXJ2ZXJfLnNldEl0ZW1zKHNlcnZlckxhYmVscyk7Ci0JICB9Ci0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0UnVudGltZUl0ZW1zKFN0cmluZ1tdIGlkcykKLQl7Ci0JICBpZiAoaWRzICE9IG51bGwpCi0JICB7Ci0JCVN0cmluZ1tdIHJ1bnRpbWVMYWJlbHMgPSBuZXcgU3RyaW5nW2lkcy5sZW5ndGhdOwotCQlmb3IgKGludCBpPTA7aTxpZHMubGVuZ3RoO2krKykKLQkJewotCQkgIHJ1bnRpbWVMYWJlbHNbaV0gPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFJ1bnRpbWVMYWJlbChpZHNbaV0pOwotCQl9Ci0JCXJ1bnRpbWVfLnNldEl0ZW1zKHJ1bnRpbWVMYWJlbHMpOwotCSAgfQotCQkKLQl9Ci0JCi0gICAgcHJpdmF0ZSB2b2lkIHNldEoyRUVJdGVtcyhTdHJpbmdbXSB2ZXJzaW9ucykKLSAgICB7Ci0gICAgICBpZiAodmVyc2lvbnMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nW10gajJlZUxhYmVscyA9IG5ldyBTdHJpbmdbdmVyc2lvbnMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBsYWJlbCA9IEoyRUVVdGlscy5nZXRMYWJlbEZyb21KMkVFVmVyc2lvbih2ZXJzaW9uc1tpXSk7Ci0gICAgICAgICAgaWYgKGxhYmVsICE9IG51bGwgJiYgbGFiZWwubGVuZ3RoKCk+MCkKLSAgICAgICAgICAgIGoyZWVMYWJlbHNbaV0gPSBsYWJlbDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBqMmVlTGFiZWxzW2ldID0gbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX05BIik7Ci0gICAgICAgIH0KLSAgICAgICAgajJlZVZlcnNpb25fLnNldEl0ZW1zKGoyZWVMYWJlbHMpOwotICAgICAgICAKLSAgICAgICAgLy9EaXNhYmxlIHRoZSBjb21ibyBpZiBpdCBoYXMgbm8gaXRlbXMuCi0gICAgICAgIGlmIChqMmVlTGFiZWxzLmxlbmd0aCA+IDApCi0gICAgICAgICAgajJlZVZlcnNpb25fLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBqMmVlVmVyc2lvbl8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICAgIAotICAgIH0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTZXJ2ZXJTZWxlY3Rpb24oKQotCXsKLQkgIFN0cmluZyBzZXJ2ZXJMYWJlbCA9IHNlcnZlcl8uZ2V0VGV4dCgpOwotCSAgcmV0dXJuIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckxhYmVsKTsJCQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRSdW50aW1lU2VsZWN0aW9uKCkKLQl7Ci0gICAgICBTdHJpbmcgcnVudGltZUxhYmVsID0gcnVudGltZV8uZ2V0VGV4dCgpOwotCSAgcmV0dXJuIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0UnVudGltZUlkKHJ1bnRpbWVMYWJlbCk7CQkJCQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRKMkVFU2VsZWN0aW9uKCkKLQl7Ci0JICBTdHJpbmcgajJlZUxhYmVsID0gajJlZVZlcnNpb25fLmdldFRleHQoKTsKLQkgIHJldHVybiBKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb25Gcm9tTGFiZWwoajJlZUxhYmVsKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0U2VydmVyU2VsZWN0aW9uKFN0cmluZyBmYWN0b3J5SWQpCi0JewotCQlTdHJpbmcgbGFiZWwgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFNlcnZlckxhYmVsKGZhY3RvcnlJZCk7Ci0JCXNldFNlbGVjdGlvbihzZXJ2ZXJfLGxhYmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFJ1bnRpbWVTZWxlY3Rpb24oU3RyaW5nIGlkKQotCXsKLQkJU3RyaW5nIGxhYmVsID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRSdW50aW1lTGFiZWwoaWQpOwotCQlzZXRTZWxlY3Rpb24ocnVudGltZV8sbGFiZWwpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRKMkVFU2VsZWN0aW9uKFN0cmluZyB2ZXJzaW9uKQotCXsKLQkgIFN0cmluZyBsYWJlbCA9IEoyRUVVdGlscy5nZXRMYWJlbEZyb21KMkVFVmVyc2lvbih2ZXJzaW9uKTsKLSAgICAgIHNldFNlbGVjdGlvbihqMmVlVmVyc2lvbl8sIGxhYmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGlvbihDb21ibyBjb21ibywgU3RyaW5nIHMpCi0JewotCQlTdHJpbmdbXSBpdGVtcyA9IGNvbWJvLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykKLQkJewotCQkJaWYgKGl0ZW1zW2ldLmVxdWFscyhzKSkKLQkJCXsKLQkJCQljb21iby5zZWxlY3QoaSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gY29udmVydFRvU3RyaW5nQXJyYXkoT2JqZWN0W10gYSkKLQl7Ci0JICBpZiAoYT09bnVsbCkgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JICAJCi0JICBpbnQgbGVuZ3RoID0gYS5sZW5ndGg7Ci0JICBTdHJpbmdbXSBzYSA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKLQkgIGZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykKLQkgIHsKLQkgIAlPYmplY3Qgb2JqID0gYVtpXTsKLQkgIAlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKQotCSAgCXsKLQkgICAgICBzYVtpXSA9IChTdHJpbmcpb2JqOwotCSAgCX0KLQkgIH0KLQkgIHJldHVybiBzYTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9zZWxlY3Rpb24vU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvc2VsZWN0aW9uL1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOWJmOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9zZWxlY3Rpb24vU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwud3NydC5TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIFNlbGVjdGlvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIgCi17Ci0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgCi0gIHsKLQlJU3RydWN0dXJlZFNlbGVjdGlvbiBpblNlbGVjdGlvbiAgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdmFsdWU7Ci0JU2VsZWN0aW9uICAgICAgICAgICAgb3V0U2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbigpOwotCQotCW91dFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oIGluU2VsZWN0aW9uLnRvQXJyYXkoKSApOwotCQotCXJldHVybiBvdXRTZWxlY3Rpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BYnN0cmFjdEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NtZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0Fic3RyYWN0SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ21kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzlkNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0Fic3RyYWN0SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ21kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV2ViU2VydmljZUVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotICogQWJzdHJhY3RIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDbWQKLSAqCi0gKiBJbml0aWFsaXplIGFuZCBsb2FkIHRoZSBoYW5kbGVycyBkYXRhCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NtZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotICAKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uXzsgCi0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdF87Ci0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KXsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsgICAgCi0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIAotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGluaXRpYWxTZWxlY3Rpb25fOwotICAgIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9UQVNLX0VYQ0VQVEVEIiksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICAgIAotICB9Ci0gIAotCi0gIHB1YmxpYyBMaXN0IGdldENsaWVudEhhbmRsZXJzKCl7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRTZWxlY3Rpb24pewotICAgIHRoaXMuaW5pdGlhbFNlbGVjdGlvbl8gPSBpbml0U2VsZWN0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0SW5pdGlhbFNlbGVjdGlvbigpewotICAgIHJldHVybiB0aGlzLmluaXRpYWxTZWxlY3Rpb25fOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSVJlc291cmNlIGdldFJlc291cmNlRnJvbUluaXRpYWxTZWxlY3Rpb24oKQotICB7Ci0gICAgaWYgKGluaXRpYWxTZWxlY3Rpb25fICE9IG51bGwgJiYgaW5pdGlhbFNlbGVjdGlvbl8uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGluaXRpYWxTZWxlY3Rpb25fLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iaiAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsgCi0gICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24ob2JqKTsKLSAgICAgICAgICByZXR1cm4gcmVzb3VyY2U7Ci0gICAgICAgIH0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgIAotIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpewotICAgIAotICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlRnJvbUluaXRpYWxTZWxlY3Rpb24oKTsKLQlpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQl7Ci0JICByZXR1cm4gUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YoIHJlc291cmNlLmdldEZ1bGxQYXRoKCkgKTsKLQl9Ci0JIAotCXJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZUVkaXRNb2RlbCBnZXRXZWJTZXJ2aWNlRWRpdE1vZGVsKCkgewotICAgIFdlYlNlcnZpY2VzTWFuYWdlciB3c20gPSBuZXcgV2ViU2VydmljZXNNYW5hZ2VyKCk7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLSAgICByZXR1cm4gd3NtLmdldFdTRWRpdE1vZGVsKHByb2plY3QpOyAgICAKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BZGRIYW5kbGVyRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQWRkSGFuZGxlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTBkOWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BZGRIYW5kbGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDEyLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5kaWFsb2cuRGlhbG9nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0KLQotcHVibGljIGNsYXNzIEFkZEhhbmRsZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlT25fOwotICBwcml2YXRlIGJvb2xlYW4gaXNDbGllbnRfOwotICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nW10gcG9ydE5hbWVzOwotICBwcml2YXRlIFN0cmluZyBzZWxlY3RlZFBvcnROYW1lOwotICAKLSAgcHJpdmF0ZSBUZXh0IGNsYXNzTmFtZVRleHQ7Ci0gIHByaXZhdGUgVGV4dCBuYW1lVGV4dDsKLSAgcHJpdmF0ZSBDb21ibyBwb3J0TmFtZUNvbWJvOwotICAKLSAgLy8gLS0tLVRPT0xUSVBTIFNlY3Rpb24tLS0tCi0gIC8qIENPTlRFWFRfSUQgQUhETDAwMDEgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfVEVYVF9IQU5ETEVSX05BTUUgID0gIkFIREwwMDAxIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1RFWFRfSEFORExFUl9OQU1FID0gIlRPT0xUSVBfVEVYVF9IQU5ETEVSX05BTUUiOwotICAKLSAgLyogQ09OVEVYVF9JRCBBSERMMDAwMiBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9URVhUX0hBTkRMRVJfQ0xBU1MgID0gIkFIREwwMDAyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1RFWFRfSEFORExFUl9DTEFTUyA9ICJUT09MVElQX1RFWFRfSEFORExFUl9DTEFTUyI7Ci0gIAotICAvKiBDT05URVhUX0lEIEFIREwwMDAxIGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1RFWFRfSEFORExFUl9QT1JUICA9ICJBSERMMDAwMyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9URVhUX0hBTkRMRVJfUE9SVCA9ICJUT09MVElQX1RFWFRfSEFORExFUl9QT1JUIjsKLSAgICAKLSAgcHJpdmF0ZSBCdXR0b24gYmVhbkNsYXNzQnJvd3NlQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBCQ0wwMDAzIGZvciB0aGUgQmVhbiBDbGFzcyBCcm93c2UgYnV0dG9uIG9mIHRoZSBCZWFuIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX0NMQVNTX0JST1dTRSA9ICJQQkNMMDAwMyI7Ci0gIAotICBwdWJsaWMgQWRkSGFuZGxlckRpYWxvZyggU2hlbGwgc2hlbGwsIGJvb2xlYW4gaXNDbGllbnRIYW5kbGVyKQotICB7Ci0gICAgc3VwZXIoc2hlbGwpOwotICAgIGlzQ2xpZW50XyA9IGlzQ2xpZW50SGFuZGxlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICBDb21wb3NpdGUgY29tcCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgcGFyZW50LmdldFNoZWxsKCkucGFjaygpOwotICAgIHJldHVybiBjb21wOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgdmFsaWRhdGVPbl8gPSBmYWxzZTsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBVSVV0aWxzIHVpVXRpbHMgPSBuZXcgVUlVdGlscyhtc2dVdGlsc18sIHBsdWdpbklkXyk7Ci0gICAgCi0gICAgU2hlbGwgdGhpc1NoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0gICAgaWYgKHRoaXNTaGVsbCA9PSBudWxsKSB7Ci0gICAgICB0aGlzU2hlbGwgPSBjcmVhdGVTaGVsbCgpOwotICAgIH0KLSAgICB0aGlzU2hlbGwuc2V0VGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiRElBTE9HX1RJVExFX1dTX0FERF9IQU5ETEVSIikpOwotICAgIAotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7ICAgIAotICAgIAotICAgIENvbXBvc2l0ZSBzb3VyY2VMb2NhdGlvbkNvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUsIDMpOwotICAgIAotICAgIGNsYXNzTmFtZVRleHQgPSB1aVV0aWxzLmNyZWF0ZVRleHQoc291cmNlTG9jYXRpb25Db21wLCAiTEFCRUxfVEVYVF9IQU5ETEVSX0NMQVNTIiwgVE9PTFRJUF9URVhUX0hBTkRMRVJfQ0xBU1MsIElORk9QT1BfVEVYVF9IQU5ETEVSX0NMQVNTLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgY2xhc3NOYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LHRoaXMpOwotICAgIAotICAgIGJlYW5DbGFzc0Jyb3dzZUJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIHNvdXJjZUxvY2F0aW9uQ29tcCwgIkJVVFRPTl9CUk9XU0VfQ0xBU1NFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUEJDTF9CVVRUT05fQkVBTl9DTEFTU19CUk9XU0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDTF9CVVRUT05fQkVBTl9DTEFTU19CUk9XU0UgKTsKLSAgICBiZWFuQ2xhc3NCcm93c2VCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVCcm93c2VDbGFzc2VzKCk7ICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0gKTsKLSAgICAKLSAgICBuYW1lVGV4dCA9IHVpVXRpbHMuY3JlYXRlVGV4dChzb3VyY2VMb2NhdGlvbkNvbXAsICJMQUJFTF9URVhUX0hBTkRMRVJfTkFNRSIsIFRPT0xUSVBfVEVYVF9IQU5ETEVSX05BTUUsIElORk9QT1BfVEVYVF9IQU5ETEVSX05BTUUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSICk7Ci0gICAgbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gICAgCi0gICAgLy8gZHVtbXkgbGFiZWwgZm9yIGNvbHVtbiAzLgotICAgIG5ldyBMYWJlbCggc291cmNlTG9jYXRpb25Db21wLCBTV1QuTk9ORSApOwotICAgIAotICAgIGlmICghaXNDbGllbnRfKXsKLSAgICAgIHBvcnROYW1lQ29tYm8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHNvdXJjZUxvY2F0aW9uQ29tcCwgIkxBQkVMX1RFWFRfSEFORExFUl9QT1JUIiwgVE9PTFRJUF9URVhUX0hBTkRMRVJfUE9SVCwgSU5GT1BPUF9URVhUX0hBTkRMRVJfUE9SVCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgKTsKLSAgICAgIHBvcnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gICAgICAKLSAgICAgIC8vIGR1bW15IGxhYmVsIGZvciBjb2x1bW4gMy4KLSAgICAgIG5ldyBMYWJlbCggc291cmNlTG9jYXRpb25Db21wLCBTV1QuTk9ORSApOwotICAgIH0KLSAgICB2YWxpZGF0ZU9uXyA9IHRydWU7Ci0gICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlQnJvd3NlQ2xhc3NlcygpCi0gIHsKLSAgICBTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0gICAgSVR5cGUgaXR5cGUgPSBEaWFsb2dVdGlscy5icm93c2VDbGFzc2VzQXNJVHlwZShzaGVsbCwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpLCBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKSk7Ci0gICAgCi0gICAgaWYoIGl0eXBlICE9IG51bGwgKQotICAgIHsKLSAgICAgIGNsYXNzTmFtZVRleHQuc2V0VGV4dChpdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgIGlmICghdmFsaWRhdGVPbl8pCi0gICAgICByZXR1cm47Ci0gICAgaWYgKGNsYXNzTmFtZVRleHQgPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICBoYW5kbGVDbGFzc05hbWVUZXh0RXZlbnQoKTsKLSAgICAgIHZhbGlkYXRlVGV4dEZpZWxkRW50cmllcygpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobmFtZVRleHQgPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICBoYW5kbGVOYW1lVGV4dEV2ZW50KCk7Ci0gICAgICB2YWxpZGF0ZVRleHRGaWVsZEVudHJpZXMoKTsgICAgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBvcnROYW1lQ29tYm8gPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICBoYW5kbGVQb3J0TmFtZVRleHRFdmVudCgpOwotICAgICAgdmFsaWRhdGVUZXh0RmllbGRFbnRyaWVzKCk7ICAgICAgCi0gICAgICByZXR1cm47Ci0gICAgfSAgICAKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVDbGFzc05hbWVUZXh0RXZlbnQoKXsKLSAgICBjbGFzc05hbWUgPSBjbGFzc05hbWVUZXh0LmdldFRleHQoKTsKLSAgICBpZiAoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpICE9IC0xKXsKLSAgICAgIG5hbWVUZXh0LnNldFRleHQoY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUubGFzdEluZGV4T2YoIi5qYXZhIikpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBuYW1lVGV4dC5zZXRUZXh0KGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIAotICAgIGlmIChjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSAhPSAtMSl7Ci0gICAgICBuYW1lVGV4dC5zZXRUZXh0KGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikrMSwgY2xhc3NOYW1lLmxlbmd0aCgpKSk7Ci0gICAgfQotICAgIG5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVOYW1lVGV4dEV2ZW50KCkgewotICAgbmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKTsgCi0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBvcnROYW1lVGV4dEV2ZW50KCl7Ci0gICAgc2VsZWN0ZWRQb3J0TmFtZSA9IHBvcnROYW1lQ29tYm8uZ2V0VGV4dCgpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgZGlzYWJsZU9LQnV0dG9uKCkgewotICAgIGlmIChnZXRCdXR0b24oMCkgIT0gbnVsbCkKLSAgICAgIGdldEJ1dHRvbigwKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBlbmFibGVPS0J1dHRvbigpIHsKLSAgICBpZiAoZ2V0QnV0dG9uKDApICE9IG51bGwpCi0gICAgICBnZXRCdXR0b24oMCkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVGV4dEZpZWxkRW50cmllcygpewotICAJaWYgKGNsYXNzTmFtZVRleHQuZ2V0VGV4dCgpLmVxdWFscygiIikpewotICAJCWRpc2FibGVPS0J1dHRvbigpOwotICAJCXJldHVybjsKLSAgCX0KLSAgCWlmIChuYW1lVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKSl7Ci0gIAkJZGlzYWJsZU9LQnV0dG9uKCk7Ci0gIAkJcmV0dXJuOwotICAJfQotICAJaWYgKCFpc0NsaWVudF8pewotICAJCWlmIChwb3J0TmFtZUNvbWJvLmdldFRleHQoKSE9bnVsbCAmJiBwb3J0TmFtZUNvbWJvLmdldFRleHQoKS5lcXVhbHMoIiIpKXsKLSAgCQkJZGlzYWJsZU9LQnV0dG9uKCk7Ci0gIAkJCXJldHVybjsKLSAgCQl9Ci0gIAkJZWxzZSBpZiAocG9ydE5hbWVDb21iby5nZXRUZXh0KCk9PW51bGwpIHsKLSAgCQkJZGlzYWJsZU9LQnV0dG9uKCk7Ci0gIAkJCXJldHVybjsKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCWVuYWJsZU9LQnV0dG9uKCk7Ci0gIAkKLQkKLSAgfQotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xhc3NOYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgaWYgKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLmphdmEiKSAhPSAtMSl7Ci0gICAgICByZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUubGFzdEluZGV4T2YoIi5qYXZhIikpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBjbGFzc05hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwb3J0TmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoKSB7Ci0gICAgcmV0dXJuIHNlbGVjdGVkUG9ydE5hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBwb3J0TmFtZSBUaGUgcG9ydE5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWVzKFN0cmluZ1tdIHBvcnROYW1lcykgewotICAgIHRoaXMucG9ydE5hbWVzID0gcG9ydE5hbWVzOwotICAgIHBvcnROYW1lQ29tYm8uc2V0SXRlbXMocG9ydE5hbWVzKTsKLSAgICBwb3J0TmFtZUNvbWJvLnNlbGVjdCgwKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDQ1M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbi5BcHBsaWNhdGlvbkNsaWVudE5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb2plY3QuRUpCTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5KMkVFV2ViTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLldlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV2ViU2VydmljZUVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSGFuZGxlclRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLS8qKgotICogQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZAotICoKLSAqIEluaXRpYWxpemUgYW5kIGxvYWQgdGhlIGhhbmRsZXJzIGRhdGEKLSAqLwotcHVibGljIGNsYXNzIENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NtZCB7Ci0KLSAgcHJpdmF0ZSBIYW5kbGVyVGFibGVJdGVtW10gaGFuZGxlcnNfOwotCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotICBwcml2YXRlIGJvb2xlYW4gaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotCi0gIHByaXZhdGUgSVBhdGggc291cmNlT3V0cHV0TG9jYXRpb25fOwotCi0gIHByaXZhdGUgSGFzaHRhYmxlIHdzUmVmc1RvSGFuZGxlcnNUYWJsZV87Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgcmVmTmFtZVRvU2VydmljZVJlZk9ial87Ci0KLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlRWRpdE1vZGVsIHdzRWRpdE1vZGVsXzsKLQotICBwcml2YXRlIFdlYlNlcnZpY2VzTWFuYWdlciB3ZWJTZXJ2aWNlc01hbmFnZXJfOwotCi0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdF87Ci0KLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1Jlc291cmNlIHdzQ2xpZW50UmVzXzsKLQotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUmVmTmFtZV8gPSBudWxsOwotICAKLSAgcHJpdmF0ZSBDb2xsZWN0aW9uIHdzU2VydmljZVJlZnNfOwotICAKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICB3ZWJTZXJ2aWNlc01hbmFnZXJfID0gbmV3IFdlYlNlcnZpY2VzTWFuYWdlcigpOwotCi0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0SW5pdGlhbFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9UQVNLX0VYQ0VQVEVEIiksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHN0YXR1cyA9IHByb2Nlc3NIYW5kbGVycygpOwotICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgcHJvY2Vzc0hhbmRsZXJzKCkgewotICAgIHRyeSB7Ci0gICAgICBWZWN0b3IgaGFuZGxlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICB3c1JlZnNUb0hhbmRsZXJzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgcmVmTmFtZVRvU2VydmljZVJlZk9ial8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICAgIHdzRWRpdE1vZGVsXyA9IGdldFdlYlNlcnZpY2VFZGl0TW9kZWwoKTsKLQotICAgICAgd3NTZXJ2aWNlUmVmc18gPSBnZXRXU1NlcnZpY2VSZWZzRnJvbVNlbGVjdGlvbigpOwotCi0gICAgICBpZiAod3NTZXJ2aWNlUmVmc18gIT0gbnVsbCkgewotICAgICAgICBJdGVyYXRvciB3c1JlZnNJdGVyID0gd3NTZXJ2aWNlUmVmc18uaXRlcmF0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c1NlcnZpY2VSZWZzXy5zaXplKCk7IGkrKykgewotCi0gICAgICAgICAgU2VydmljZVJlZiB3c1NlcnZpY2VSZWYgPSAoU2VydmljZVJlZikgd3NSZWZzSXRlci5uZXh0KCk7Ci0KLSAgICAgICAgICBMaXN0IHdzSGFuZGxlcnMgPSB3c1NlcnZpY2VSZWYuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtW10gaGFuZGxlckl0ZW1zID0gbmV3IEhhbmRsZXJUYWJsZUl0ZW1bd3NIYW5kbGVycy5zaXplKCldOwotICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd3NIYW5kbGVycy5zaXplKCk7IGsrKykgewotCi0gICAgICAgICAgICBIYW5kbGVyIHdzSGFuZGxlciA9IChIYW5kbGVyKSB3c0hhbmRsZXJzLmdldChrKTsKLQotICAgICAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBoYW5kbGVySXRlbSA9IG5ldyBIYW5kbGVyVGFibGVJdGVtKCk7Ci0gICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRIYW5kbGVyKHdzSGFuZGxlcik7Ci0gICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRIYW5kbGVyTmFtZSh3c0hhbmRsZXIuZ2V0SGFuZGxlck5hbWUoKSk7Ci0gICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRIYW5kbGVyQ2xhc3NOYW1lKHdzSGFuZGxlci5nZXRIYW5kbGVyQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0V3NEZXNjUmVmKHdzU2VydmljZVJlZik7Ci0gICAgICAgICAgICBoYW5kbGVySXRlbXNba10gPSBoYW5kbGVySXRlbTsKLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVySXRlbSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIFN0cmluZyB3c1NlcnZpY2VSZWZOYW1lID0gd3NTZXJ2aWNlUmVmLmdldFNlcnZpY2VSZWZOYW1lKCk7Ci0gICAgICAgICAgd3NSZWZzVG9IYW5kbGVyc1RhYmxlXy5wdXQod3NTZXJ2aWNlUmVmTmFtZSwgaGFuZGxlckl0ZW1zKTsKLSAgICAgICAgICByZWZOYW1lVG9TZXJ2aWNlUmVmT2JqXy5wdXQod3NTZXJ2aWNlUmVmTmFtZSwgd3NTZXJ2aWNlUmVmKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlcnNfID0gKEhhbmRsZXJUYWJsZUl0ZW1bXSkgaGFuZGxlcnMudG9BcnJheShuZXcgSGFuZGxlclRhYmxlSXRlbVswXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwdWJsaWMgSGFuZGxlclRhYmxlSXRlbVtdIGdldEFsbEhhbmRsZXJzKCkgewotICAgIHJldHVybiB0aGlzLmhhbmRsZXJzXzsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgZ2V0SGFuZGxlcnMoKSB7Ci0gICAgcmV0dXJuIHdzUmVmc1RvSGFuZGxlcnNUYWJsZV87Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpc0dlblNrZWxldG9uRW5hYmxlZF8uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5Ta2VsZXRvbkVuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzb3VyY2VPdXRwdXRMb2NhdGlvbl8uCi0gICAqLwotICBwdWJsaWMgSVBhdGhbXSBnZXRTb3VyY2VPdXRwdXRMb2NhdGlvbigpIHsKLSAgICBJUGF0aFtdIGxvY2F0aW9ucyA9IG51bGw7Ci0gICAgaWYgKHByb2plY3RfPT1udWxsKQotICAgICBwcm9qZWN0XyA9IGdldFByb2plY3QoKTsKLSAgICBpZiAocHJvamVjdF8gIT0gbnVsbCkgewotICAgICAgbG9jYXRpb25zID0gUmVzb3VyY2VVdGlscy5nZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKHByb2plY3RfKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbG9jYXRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NFZGl0TW9kZWwuCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZUVkaXRNb2RlbCBnZXRXc0VkaXRNb2RlbCgpIHsKLSAgICByZXR1cm4gd3NFZGl0TW9kZWxfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlUmVmTmFtZSgpIHsKLSAgICByZXR1cm4gdGhpcy5zZXJ2aWNlUmVmTmFtZV87Ci0gIH0KLQotICBwdWJsaWMgV2ViU2VydmljZXNSZXNvdXJjZSBnZXRXc0NsaWVudFJlc291cmNlKCkgewotICAgIHJldHVybiB3c0NsaWVudFJlc187Ci0gIH0KLQotICBwdWJsaWMgSVByb2plY3QgZ2V0Q2xpZW50UHJvamVjdCgpIHsKLSAgICByZXR1cm4gcHJvamVjdF87Ci0gIH0KLQotICBwcml2YXRlIENvbGxlY3Rpb24gZ2V0V1NTZXJ2aWNlUmVmc0Zyb21TZWxlY3Rpb24oKSB7Ci0KLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0U2VsID0gZ2V0SW5pdGlhbFNlbGVjdGlvbigpOwotICAgIGlmIChpbml0U2VsICE9IG51bGwgJiYgaW5pdFNlbC5zaXplKCkgPT0gMSkgewotICAgICAgT2JqZWN0IG9iaiA9IGluaXRTZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBTZXJ2aWNlUmVmIHNlcnZpY2VSZWYgPSBudWxsOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpIHsKLSAgICAgICAgLy8gQ2xpZW50IFNlcnZpY2VSZWYKLSAgICAgICAgc2VydmljZVJlZiA9IChTZXJ2aWNlUmVmKSBvYmo7Ci0gICAgICAgIHNlcnZpY2VSZWZOYW1lXyA9IHNlcnZpY2VSZWYuZ2V0U2VydmljZVJlZk5hbWUoKTsKLSAgICAgICAgcHJvamVjdF8gPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc2VydmljZVJlZik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKSB7Ci0gICAgICAgIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgd3NuZ3QgPSAoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgb2JqOwotICAgICAgICBzZXJ2aWNlUmVmID0gd3NuZ3QuZ2V0U2VydmljZVJlZigpOwotICAgICAgICBzZXJ2aWNlUmVmTmFtZV8gPSBzZXJ2aWNlUmVmLmdldFNlcnZpY2VSZWZOYW1lKCk7Ci0gICAgICAgIHByb2plY3RfID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNlcnZpY2VSZWYpOwotICAgICAgfQotCi0gICAgICBpZiAocHJvamVjdF89PW51bGwpewotICAgICAgICBwcm9qZWN0XyA9IGdldFByb2plY3QoKTsKLSAgICAgIH0KLSAgICAgIGlmIChwcm9qZWN0Xz09bnVsbCl7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotCi0gICAgICB3c0NsaWVudFJlc18gPSB3ZWJTZXJ2aWNlc01hbmFnZXJfLmdldFdlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2UocHJvamVjdF8pOwotICAKLSAgICAgIGlmIChSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChwcm9qZWN0XykpIHsKLSAgICAgICAgSjJFRVdlYk5hdHVyZVJ1bnRpbWUgcnQgPSBKMkVFV2ViTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3RfKTsKLSAgICAgICAgaWYgKHJ0ICE9IG51bGwpIHsKLSAgICAgICAgICBXZWJBcHAgd2ViQXBwID0gcnQuZ2V0V2ViQXBwKCk7Ci0gICAgICAgICAgaWYgKHdlYkFwcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRTZXJ2aWNlUmVmcyh3ZWJBcHApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoUmVzb3VyY2VVdGlscy5pc0FwcENsaWVudFByb2plY3QocHJvamVjdF8pKXsKLSAgICAgICAgQXBwbGljYXRpb25DbGllbnROYXR1cmVSdW50aW1lIHJ0ID0gQXBwbGljYXRpb25DbGllbnROYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUocHJvamVjdF8pOwotICAgICAgICBpZiAocnQhPW51bGwpIHsKLSAgICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnQgPSBydC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotICAgICAgICAgIGlmIChhcHBDbGllbnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRTZXJ2aWNlUmVmcyhhcHBDbGllbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3QocHJvamVjdF8pKXsKLSAgICAgICAgRUpCTmF0dXJlUnVudGltZSBydCA9IEVKQk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0Xyk7Ci0gICAgICAgIGlmKHJ0IT1udWxsKXsKLSAgICAgICAgICBFSkJKYXIgZWpiSmFyID0gcnQuZ2V0RUpCSmFyKCk7Ci0gICAgICAgICAgaWYgKGVqYkphciAhPW51bGwpewotICAgICAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VzTWFuYWdlcl8uZ2V0U2VydmljZVJlZnMoZWpiSmFyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgZ2V0UmVmTmFtZVRvU2VydmljZVJlZigpIHsKLSAgICByZXR1cm4gdGhpcy5yZWZOYW1lVG9TZXJ2aWNlUmVmT2JqXzsKLSAgfQotICAKLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0V3NTZXJ2aWNlUmVmcygpewotICAgIHJldHVybiB0aGlzLndzU2VydmljZVJlZnNfOwotICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDJlYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YUVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmNyZWF0aW9uLkFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm9qZWN0LkVKQk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSjJFRVdlYk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV2ViU2VydmljZUVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzY2xpZW50LmltcGwuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkhhbmRsZXJUYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlVdGlsaXR5OwotCi0vKgotICogUHJvdmlkZSBhIHdheSB0byBleHRlcm5hbGl6ZSB0aGUgZWRpdGVkIGZpZWxkcyBhbmQgY3JlYXRlIG5ldyBoYW5kbGVycwotICogIAotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLSAgLy9wcml2YXRlIExpc3QgaGFuZGxlclRhYmxlSXRlbXNfOwotICBwcml2YXRlIEhhc2h0YWJsZSBvbGRXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXzsKLQotICBwcml2YXRlIEhhc2h0YWJsZSBuZXdXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXzsKLQotICBwcml2YXRlIFdlYlNlcnZpY2VFZGl0TW9kZWwgd3NFZGl0TW9kZWxfOwotCi0gIHByaXZhdGUgSGFzaHRhYmxlIGhhbmRsZXJzVGFibGVfOwotCi0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdF87Ci0KLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1Jlc291cmNlIHdzQ2xpZW50UmVzXzsKLQotICBwcml2YXRlIENvbGxlY3Rpb24gd3NTZXJ2aWNlUmVmc187Ci0KLSAgcHJpdmF0ZSBKMkVFRWRpdE1vZGVsIGVkaXRNb2RlbF87Ci0KLSAgcHJpdmF0ZSBPYmplY3QgYWNjZXNzb3JLZXlfOwotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgdHJ5IHsKLQotICAgICAgSmF2YUVNRk5hdHVyZSBqTU9GID0gKEphdmFFTUZOYXR1cmUpIEphdmFFTUZOYXR1cmUuY3JlYXRlUnVudGltZShwcm9qZWN0Xyk7Ci0KLSAgICAgIG9sZFdTU2VydmljZVJlZnNUb0hhbmRsZXJzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgbmV3V1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICAgIGlmICh3c1NlcnZpY2VSZWZzXyAhPSBudWxsKSB7Ci0gICAgICAgIEl0ZXJhdG9yIHdzUmVmc0l0ZXIgPSB3c1NlcnZpY2VSZWZzXy5pdGVyYXRvcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzU2VydmljZVJlZnNfLnNpemUoKTsgaSsrKSB7Ci0KLSAgICAgICAgICBTZXJ2aWNlUmVmIHdzU2VydmljZVJlZiA9IChTZXJ2aWNlUmVmKSB3c1JlZnNJdGVyLm5leHQoKTsKLQotICAgICAgICAgIExpc3Qgd3NIYW5kbGVycyA9IHdzU2VydmljZVJlZi5nZXRIYW5kbGVycygpOwotICAgICAgICAgIG9sZFdTU2VydmljZVJlZnNUb0hhbmRsZXJzVGFibGVfLnB1dCh3c1NlcnZpY2VSZWYsIHdzSGFuZGxlcnMpOwotICAgICAgICAgIG5ld1dTU2VydmljZVJlZnNUb0hhbmRsZXJzVGFibGVfLnB1dCh3c1NlcnZpY2VSZWYsIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBFbnVtZXJhdGlvbiBlID0gaGFuZGxlcnNUYWJsZV8ua2V5cygpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCi0gICAgICAgICAgU3RyaW5nIHNlcnZpY2VSZWZOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIExpc3QgaGFuZGxlclRhYmxlSXRlbXNfID0gKExpc3QpIGhhbmRsZXJzVGFibGVfLmdldChzZXJ2aWNlUmVmTmFtZSk7Ci0gICAgICAgICAgaWYgKGhhbmRsZXJUYWJsZUl0ZW1zXyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBmb3JtIEhhbmRsZXIgdGFibGVzCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXJUYWJsZUl0ZW1zXy5zaXplKCk7IGkrKykgewotCi0gICAgICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaHRpID0gKEhhbmRsZXJUYWJsZUl0ZW0pIGhhbmRsZXJUYWJsZUl0ZW1zXy5nZXQoaSk7Ci0gICAgICAgICAgICAgIE9iamVjdCB3c01vZGVsUmVmID0gaHRpLmdldFdzRGVzY1JlZigpOwotICAgICAgICAgICAgICBpZiAod3NNb2RlbFJlZiAhPSBudWxsICYmIHdzTW9kZWxSZWYgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZVJlZiB3c1JlZiA9IChTZXJ2aWNlUmVmKSB3c01vZGVsUmVmOwotCi0gICAgICAgICAgICAgICAgT2JqZWN0IGhhbmRsZXIgPSBodGkuZ2V0SGFuZGxlcigpOwotICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwgJiYgaGFuZGxlciBpbnN0YW5jZW9mIEhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAgIC8vIGNsb25lIGl0Ci0gICAgICAgICAgICAgICAgICBIYW5kbGVyIGNsb25lZEhhbmRsZXIgPSAoSGFuZGxlcikgRXRvb2xzQ29weVV0aWxpdHkuY3JlYXRlQ29weSgoSGFuZGxlcikgaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAoKExpc3QpIG5ld1dTU2VydmljZVJlZnNUb0hhbmRsZXJzVGFibGVfLmdldCh3c1JlZikpLmFkZChjbG9uZWRIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgaXQKLSAgICAgICAgICAgICAgICAgIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSB3c0NsaWVudEZhY3RvcnkgPSBuZXcgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbCgpOwotICAgICAgICAgICAgICAgICAgSGFuZGxlciBuZXdIYW5kbGVyID0gd3NDbGllbnRGYWN0b3J5LmNyZWF0ZUhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICAgIG5ld0hhbmRsZXIuc2V0SGFuZGxlck5hbWUoaHRpLmdldEhhbmRsZXJOYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcykgSmF2YUNsYXNzSW1wbC5yZWZsZWN0KGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCksIGpNT0YuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0gICAgICAgICAgICAgICAgICBpZiAoamF2YUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3SGFuZGxlci5zZXRIYW5kbGVyQ2xhc3MoamF2YUNsYXNzKTsKLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgKChMaXN0KSBuZXdXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXy5nZXQod3NSZWYpKS5hZGQobmV3SGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBoYW5kbGVycyB0byBwb3J0cwotICAgICAgICBhZGRIYW5kbGVyc1RvU2VydmljZVJlZnMoKTsKLSAgICAgICAgZ2V0SjJFRUVkaXRNb2RlbCgpOwotICAgICAgICAKLSAgICAgICAgLy8gc2F2ZSB0aGUgcmVzb3VyY2UKLSAgICAgICAgaWYgKEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbihwcm9qZWN0XykgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpIHsKLSAgICAgICAgICBlZGl0TW9kZWxfLnNhdmUoYWNjZXNzb3JLZXlfKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAod3NDbGllbnRSZXNfIT1udWxsKQotICAgICAgICAgICAgd3NDbGllbnRSZXNfLnNhdmUobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9UQVNLX0VYQ0VQVEVEIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgfQotICAgIGZpbmFsbHkgewotICAgICAgaWYgKGVkaXRNb2RlbF8gIT0gbnVsbCkgCi0gICAgICAgIGVkaXRNb2RlbF8ucmVsZWFzZUFjY2VzcyhhY2Nlc3NvcktleV8pOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFkZEhhbmRsZXJzVG9TZXJ2aWNlUmVmcygpIHsKLSAgICB0cnkgewotICAgICAgaW50IGtleSA9IDA7Ci0gICAgICBFbnVtZXJhdGlvbiByZWZzVG9IYW5kbGVycyA9IG5ld1dTU2VydmljZVJlZnNUb0hhbmRsZXJzVGFibGVfLmtleXMoKTsKLSAgICAgIHdoaWxlIChyZWZzVG9IYW5kbGVycy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICBTZXJ2aWNlUmVmIHNlcnZpY2VSZWYgPSAoU2VydmljZVJlZikgcmVmc1RvSGFuZGxlcnMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHNlcnZpY2VSZWYgIT0gbnVsbCkgewotCi0gICAgICAgICAgTGlzdCBoYW5kbGVycyA9IChMaXN0KSBuZXdXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXy5nZXQoc2VydmljZVJlZik7Ci0gICAgICAgICAgTGlzdCBtb2RlbEhhbmRsZXJzID0gKExpc3QpIG9sZFdTU2VydmljZVJlZnNUb0hhbmRsZXJzVGFibGVfLmdldChzZXJ2aWNlUmVmKTsKLSAgICAgICAgICBtb2RlbEhhbmRsZXJzLmNsZWFyKCk7Ci0gICAgICAgICAgbW9kZWxIYW5kbGVycy5hZGRBbGwoaGFuZGxlcnMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGhhbmRsZXJUYWJsZUl0ZW1zCi0gICAqICAgICAgICAgIFRoZSBoYW5kbGVyVGFibGVJdGVtcyB0byBzZXQuCi0gICAqLwotICAvLyAgcHVibGljIHZvaWQgc2V0QWxsSGFuZGxlcnNMaXN0KExpc3QgaGFuZGxlclRhYmxlSXRlbXMpIHsKLSAgLy8gICAgdGhpcy5oYW5kbGVyVGFibGVJdGVtc18gPSBoYW5kbGVyVGFibGVJdGVtczsKLSAgLy8gIH0KLSAgcHVibGljIHZvaWQgc2V0SGFuZGxlcnNUYWJsZShIYXNodGFibGUgaGFuZGxlcnNUYWJsZSkgewotICAgIHRoaXMuaGFuZGxlcnNUYWJsZV8gPSBoYW5kbGVyc1RhYmxlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c0VkaXRNb2RlbAotICAgKiAgICAgICAgICBUaGUgd3NFZGl0TW9kZWwgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NFZGl0TW9kZWwoV2ViU2VydmljZUVkaXRNb2RlbCB3c0VkaXRNb2RlbCkgewotICAgIHRoaXMud3NFZGl0TW9kZWxfID0gd3NFZGl0TW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICB0aGlzLnByb2plY3RfID0gcHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdzQ2xpZW50UmVzb3VyY2UoV2ViU2VydmljZXNSZXNvdXJjZSB3c1JlcykgewotICAgIHRoaXMud3NDbGllbnRSZXNfID0gd3NSZXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXc1NlcnZpY2VSZWZzKENvbGxlY3Rpb24gd3NSZWZzKSB7Ci0gICAgdGhpcy53c1NlcnZpY2VSZWZzXyA9IHdzUmVmczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEoyRUVFZGl0TW9kZWwoKSB7Ci0gIAlhY2Nlc3NvcktleV8gPSBuZXcgT2JqZWN0KCk7Ci0gICAgaWYgKFJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHByb2plY3RfKSkgewotICAgICAgSjJFRVdlYk5hdHVyZVJ1bnRpbWUgcnQgPSBKMkVFV2ViTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3RfKTsKLSAgICAgIGlmIChydCAhPSBudWxsKSB7Ci0gICAgICAgIGVkaXRNb2RlbF8gPSBydC5nZXRXZWJBcHBFZGl0TW9kZWxGb3JXcml0ZShhY2Nlc3NvcktleV8pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChSZXNvdXJjZVV0aWxzLmlzQXBwQ2xpZW50UHJvamVjdChwcm9qZWN0XykpewotICAgICAgQXBwbGljYXRpb25DbGllbnROYXR1cmVSdW50aW1lIHJ0ID0gQXBwbGljYXRpb25DbGllbnROYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUocHJvamVjdF8pOwotICAgICAgaWYgKHJ0IT1udWxsKSB7Ci0gICAgICAgIGVkaXRNb2RlbF8gPSBydC5nZXRBcHBDbGllbnRFZGl0TW9kZWxGb3JXcml0ZShhY2Nlc3NvcktleV8pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChwcm9qZWN0XykpewotICAgICAgRUpCTmF0dXJlUnVudGltZSBydCA9IEVKQk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0Xyk7Ci0gICAgICBpZihydCE9bnVsbCl7Ci0gICAgICAgIGVkaXRNb2RlbF8gPSBydC5nZXRFSkJFZGl0TW9kZWxGb3JXcml0ZShhY2Nlc3NvcktleV8pOwotICAgICAgfQotICAgIH0KLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudFdpemFyZFdpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudFdpemFyZFdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTVmYTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRXaXphcmRXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsgIAotICBwcml2YXRlIFdlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0IGNsaWVudFdpZGdldF87Ci0gIHByaXZhdGUgUHJlZmVyZW5jZXNTZWxlY3Rpb25XaWRnZXQgcHJlZmVyZW5jZXNXaWRnZXRfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDEzIGZvciB0aGUgdGVzdCBzZXJ2aWNlIGNoZWNrYm94IG9mIHRoZSBwcm9qZWN0IHBhZ2UqLyAgCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DSEVDS0JPWF9URVNUX1NFUlZJQ0UgPSAiUFdQUjAwMTMiOwotICBwcml2YXRlIEJ1dHRvbiB0ZXN0U2VydmljZV87Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdQUjAwMTQgZm9yIHRoZSBtb25pdG9yIHNlcnZpY2UgY2hlY2tib3ggb2YgdGhlIHByb2plY3QgcGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DSEVDS0JPWF9NT05JVE9SX1NFUlZJQ0UgPSAiUFdSUFIwMDE0IjsKLSAgcHJpdmF0ZSBCdXR0b24gbW9uaXRvclNlcnZpY2U7Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdQUjAwMDEgZm9yIHRoZSBQcm9qZWN0IFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfUEFHRSA9ICJQV1BSMDAwMSI7Ci0gICAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgVUlVdGlscyAgICAgIHV0aWxzICAgID0gbmV3IFVJVXRpbHMoIG1zZ1V0aWxzLCBwbHVnaW5JZCApOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIHBhcmVudCwgcGx1Z2luSWQgKyAiLiIgKyAgSU5GT1BPUF9QV1BSX1BBR0UgKTsKLSAgCQotICAJQ29tcG9zaXRlIGNsaWVudENvbXBvc2l0ZSA9IHV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAxICk7Ci0gIAkKLSAgICBjbGllbnRXaWRnZXRfID0gbmV3IFdlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0KCk7Ci0gICAgY2xpZW50V2lkZ2V0Xy5hZGRDb250cm9scyhjbGllbnRDb21wb3NpdGUsIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgCi0gICAgCi0gICAgLy8gIENyZWF0ZSB0ZXN0IHNlcnZpY2UgY2hlY2sgYm94LgotICAgIENvbXBvc2l0ZSB0ZXN0R3JvdXAgPSB1dGlscy5jcmVhdGVDb21wb3NpdGUoY2xpZW50Q29tcG9zaXRlLDEpOwotICAgIAotICAgIHRlc3RTZXJ2aWNlXyA9IHV0aWxzLmNyZWF0ZUNoZWNrYm94KCB0ZXN0R3JvdXAsICJDSEVDS0JPWF9URVNUX1dFQlNFUlZJQ0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1BSX0NIRUNLQk9YX1RFU1RfU0VSVklDRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DSEVDS0JPWF9URVNUX1NFUlZJQ0UgKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgbW9uaXRvciBzZXJ2aWNlIGNoZWNrIGJveC4KLSAgICBtb25pdG9yU2VydmljZSA9IHV0aWxzLmNyZWF0ZUNoZWNrYm94KHRlc3RHcm91cCwgIkNIRUNLQk9YX01PTklUT1JfV0VCU0VSVklDRSIsICJUT09MVElQX1BXUFJfQ0hFQ0tCT1hfTU9OSVRPUl9TRVJWSUNFIiwgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX01PTklUT1JfU0VSVklDRSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIHByZWZlcmVuY2VzIGNvbnRyb2xzLgotICAgIHByZWZlcmVuY2VzV2lkZ2V0XyA9IG5ldyBQcmVmZXJlbmNlc1NlbGVjdGlvbldpZGdldCgpOwotICAgIHByZWZlcmVuY2VzV2lkZ2V0Xy5hZGRDb250cm9scyggY2xpZW50Q29tcG9zaXRlLCBzdGF0dXNMaXN0ZW5lciApOwotICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoIFJlc291cmNlQ29udGV4dCBjb250ZXh0ICkKLSAgewotICAgIHByZWZlcmVuY2VzV2lkZ2V0Xy5zZXRSZXNvdXJjZUNvbnRleHQoIGNvbnRleHQgKTsKLSAgfQotICAgCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCkKLSAgewotICAgIHJldHVybiBwcmVmZXJlbmNlc1dpZGdldF8uZ2V0UmVzb3VyY2VDb250ZXh0KCk7IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzICkKLSAgewotICAgIGNsaWVudFdpZGdldF8uc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoIGlkcyApOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKTsgIAotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oIHRlc3RTZXJ2aWNlXy5nZXRTZWxlY3Rpb24oKSApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZSggQm9vbGVhbiB2YWx1ZSApCi0gIHsKLSAgICB0ZXN0U2VydmljZV8uc2V0U2VsZWN0aW9uKCB2YWx1ZS5ib29sZWFuVmFsdWUoKSApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuIGdldE1vbml0b3JTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbihtb25pdG9yU2VydmljZS5nZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3JTZXJ2aWNlKEJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBtb25pdG9yU2VydmljZS5zZXRTZWxlY3Rpb24odmFsdWUuYm9vbGVhblZhbHVlKCkpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwNTIyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17ICAgIAotICBwdWJsaWMgQm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oIGdldFNjZW5hcmlvQ29udGV4dCgpLmdldFRlc3RXZWJTZXJ2aWNlKCkgKTsKLSAgfQotICAKLSAgcHVibGljIEJvb2xlYW4gZ2V0TW9uaXRvclNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRNb25pdG9yV2ViU2VydmljZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCkKLSAgeyAKLSAgICByZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlQ29udGV4dCgpOwotICB9Ci0gIAotICAvLyBDdXJyZW50IFNjZW5hcmlvQ29udGV4dCBpcyB1c2VkIHRvIGRlZmF1bHQgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHdpemFyZC4gIFRoZSAKLSAgLy8gcHJvcGVydGllcyBpbiBTY2VuYXJpb0NvbnRleHQgYXJlIG1hcHBlZCBpbmRpdmlkdWFsLiAgVGhlcmVmb3JlLCBTY2VuYXJpb0NvbnRleHQKLSAgLy8gc2hvdWxkIG5vdCBhbHNvIGJlIG1hcHBlZC4KLSAgcHJvdGVjdGVkIFNjZW5hcmlvQ29udGV4dCBnZXRTY2VuYXJpb0NvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTY2VuYXJpb0NvbnRleHQoKTsKLSAgfQotICAKLSAgLy8gVE9ETyBTZXQgY2xpZW50IG5hbWUgZGVmYXVsdHMgaGVyZS4gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgLy8gcnNrcmVnCi0JCS8vV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgICAgID0gZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKTsKLSAgICAvL1N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZSAgPSByZWdpc3RyeS5nZXRBbGxDbGllbnRSdW50aW1lcygpWzBdOwotCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUgID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRBbGxDbGllbnRSdW50aW1lcygpWzBdOwotICAgIC8vU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgICA9IHJlZ2lzdHJ5LmdldEFsbENsaWVudFNlcnZlckZhY3RvcnlJZHMoKVswXTsKLQkJU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgICA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpWzBdOwotICAgIFR5cGVSdW50aW1lU2VydmVyICAgICAgICAgICAgcmVzdWx0ICAgPSBuZXcgVHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLQkJLy8gcnNrcmVnCi0gICAgCi0gICAgcmVzdWx0LnNldFR5cGVJZCggdHlwZSApOwotICAgIHJlc3VsdC5zZXRSdW50aW1lSWQoIHJ1bnRpbWUgKTsKLSAgICByZXN1bHQuc2V0U2VydmVySWQoIHNlcnZlciApOyAKLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OyAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3MGYzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17ICAgIAotICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgIHRlc3RTZXJ2aWNlXzsKLSAgcHJpdmF0ZSBib29sZWFuIG1vbml0b3JTZXJ2aWNlOwotICBwcml2YXRlIFJlc291cmNlQ29udGV4dCAgIHJlc291cmNlQ29udGV4dF87Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzXzsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFRlc3RTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiB0ZXN0U2VydmljZV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZSggYm9vbGVhbiB0ZXN0U2VydmljZSApCi0gIHsKLSAgICB0ZXN0U2VydmljZV8gPSB0ZXN0U2VydmljZTsgIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRNb25pdG9yU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbW9uaXRvclNlcnZpY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3JTZXJ2aWNlKGJvb2xlYW4gbW9uaXRvclNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLm1vbml0b3JTZXJ2aWNlID0gbW9uaXRvclNlcnZpY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCkKLSAgewotICAgIAotICAgIHJldHVybiByZXNvdXJjZUNvbnRleHRfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoIFJlc291cmNlQ29udGV4dCBjb250ZXh0ICkKLSAgewotICAgIHJlc291cmNlQ29udGV4dF8gPSBjb250ZXh0OyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpCi0gIHsgICAgCi0gICAgcmV0dXJuIGNsaWVudElkc187ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGNsaWVudElkcyApCi0gIHsKLSAgICBjbGllbnRJZHNfID0gY2xpZW50SWRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9Db25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNWRhMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5IYW5kbGVyVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0vKioKLSAqIENvbmZpZ0NsaWVudEhhbmRsZXJzVHJlZVdpZGdldAotICogIAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXyA9IG51bGw7Ci0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXJfOwotICBwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRfOwotICBwcml2YXRlIGJvb2xlYW4gaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotICBwcml2YXRlIFN0cmluZyBvdXRwdXRMb2NhdGlvbl87Ci0gIHByaXZhdGUgQ29tYm8gd2ViU2VydmljZVJlZkNvbWJvXzsKLSAgcHJpdmF0ZSBUYWJsZSBoYW5kbGVyc1RhYmxlXzsKLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcl87Ci0gIHByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbl87Ci0gIHByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbl87Ci0gIHByaXZhdGUgQnV0dG9uIGdlblNrZWxldG9uUmFkaW9CdXR0b25fOwotICBwcml2YXRlIENvbWJvIHNvdXJjZUxvY2F0aW9uQ29tYm9fOwotCi0gIHByaXZhdGUgSGFzaHRhYmxlIHBhdGhzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICBwcml2YXRlIEhhc2h0YWJsZSB3c1JlZnNUb0hhbmRsZXJzXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgcmVmTmFtZVRvU2VydmljZVJlZl87Ci0gIHByaXZhdGUgVmVjdG9yIG9yZGVyZWRIYW5kbGVyc187Ci0gIC8vcHJpdmF0ZSBTZXJ2aWNlUmVmIHNlcnZpY2VSZWZfOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUmVmTmFtZV87Ci0gIHByaXZhdGUgaW50IERFRkFVTFRfQ09MVU1OX1dJRFRIID0gMTUwOwotCi0gIC8vIC0tLS1UT09MVElQUyBTZWN0aW9uLS0tLQotICAvKiBDT05URVhUX0lEIEhETFIwMDAxIGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX0hETFJfV1NfSEFORExFUlMgPSAiSERMUjAwMDEiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfRURJVF9XU19IQU5ETEVSUyA9ICJUT09MVElQX0VESVRfV1NfSEFORExFUlMiOwotCi0gIC8qIENPTlRFWFRfSUQgSERMUjAwMDIgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfSERMUl9HRU5fU0tFTEVUT04gPSAiSERMUjAwMDIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfQlVUVE9OX0dFTl9TS0VMRVRPTiA9ICJUT09MVElQX0JVVFRPTl9HRU5fU0tFTEVUT04iOwotCi0gIC8qIENPTlRFWFRfSUQgSERMUjAwMDMgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfQ09NQk9fU09VUkNFX0xPQyA9ICJIRExSMDAwMyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9DT01CT19TT1VSQ0VfTE9DID0gIlRPT0xUSVBfQ09NQk9fU09VUkNFX0xPQyI7Ci0KLSAgLyogQ09OVEVYVF9JRCBIRExSMDAwNCBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9XU19DTElFTlRfUkVGID0gIkhETFIwMDA0IjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1dTX0NMSUVOVF9SRUYgPSAiVE9PTFRJUF9XU19DTElFTlRfUkVGIjsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBwdWJsaWMgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldCgpIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBVSVV0aWxzIHVpVXRpbHMgPSBuZXcgVUlVdGlscyhtc2dVdGlsc18sIHBsdWdpbklkXyk7Ci0KLSAgICBwYXJlbnRfID0gcGFyZW50OwotICAgIHN0YXR1c0xpc3RlbmVyXyA9IHN0YXR1c0xpc3RlbmVyOwotCi0gICAgLy8gV2ViIHNlcnZpY2UgcmVmZXJlbmNlIGNvbWJvCi0gICAgQ29tcG9zaXRlIHdlYlNlcnZpY2VSZWZDb21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUocGFyZW50XywgMik7Ci0gICAgd2ViU2VydmljZVJlZkNvbWJvXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8od2ViU2VydmljZVJlZkNvbXAsICJMQUJFTF9DT01CT19XU19DTElFTlRfUkVGIiwgVE9PTFRJUF9XU19DTElFTlRfUkVGLCBJTkZPUE9QX1dTX0NMSUVOVF9SRUYsCi0gICAgICAgIFNXVC5SRUFEX09OTFkpOwotICAgIHdlYlNlcnZpY2VSZWZDb21ib18uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2dCkgewotICAgICAgICBoYW5kbGVXZWJTZXJ2aWNlUmVmQ29tYm8oZXZ0KTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIENvbXBvc2l0ZSBkaXNwbGF5Q29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50XywgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ3JpZGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICBkaXNwbGF5Q29tcC5zZXRMYXlvdXQoZ3JpZGxheW91dCk7Ci0gICAgZGlzcGxheUNvbXAuc2V0TGF5b3V0RGF0YSh1aVV0aWxzLmNyZWF0ZUZpbGxBbGwoKSk7Ci0KLSAgICBDb21wb3NpdGUgaGFuZGxlcnNDb21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoZGlzcGxheUNvbXAsIDEpOwotICAgIEdyaWREYXRhIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORwotICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotICAgIGhhbmRsZXJzQ29tcC5zZXRMYXlvdXREYXRhKGdyaWRkYXRhKTsKLSAgICBoYW5kbGVyc0NvbXAuc2V0U2l6ZSgxMzAsIDYwMCk7Ci0KLSAgICBDb21wb3NpdGUgYnV0dG9uc0NvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShkaXNwbGF5Q29tcCwgMSk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBidXR0b25zQ29tcC5zZXRMYXlvdXREYXRhKGdyaWRkYXRhKTsKLQotICAgIFRleHQgaGFuZGxlcnNUZXh0ID0gbmV3IFRleHQoaGFuZGxlcnNDb21wLCBTV1QuUkVBRF9PTkxZKTsKLSAgICBoYW5kbGVyc1RleHQuc2V0VGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfSEFORExFUlNfQ09ORklHIikpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIGhhbmRsZXJzVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIGhhbmRsZXJzVGFibGVfID0gdWlVdGlscy5jcmVhdGVUYWJsZShoYW5kbGVyc0NvbXAsIFRPT0xUSVBfRURJVF9XU19IQU5ETEVSUywgSU5GT1BPUF9IRExSX1dTX0hBTkRMRVJTLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgIGhhbmRsZXJzVGFibGVfLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgaGFuZGxlcnNUYWJsZV8uc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgLy8gZW1wdHkgc3BhY2UKLSAgICBMYWJlbCB3c0xhYmVsID0gbmV3IExhYmVsKGJ1dHRvbnNDb21wLCBTV1QuTk9ORSk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgd3NMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIEJ1dHRvbiBtb3ZlVXBCdXR0b24gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uc0NvbXAsICJMQUJFTF9CVVRUT05fTU9WRV9VUCIsIG51bGwsIG51bGwpOwotICAgIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgbW92ZVVwQnV0dG9uLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIG1vdmVVcEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGhhbmRsZU1vdmVVcEJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBCdXR0b24gbW92ZURvd25CdXR0b24gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uc0NvbXAsICJMQUJFTF9CVVRUT05fTU9WRV9ET1dOIiwgbnVsbCwgbnVsbCk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBtb3ZlRG93bkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWRkYXRhKTsKLSAgICBtb3ZlRG93bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGhhbmRsZU1vdmVEb3duQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIC8vIGVtcHR5IHNwYWNlCi0gICAgd3NMYWJlbCA9IG5ldyBMYWJlbChidXR0b25zQ29tcCwgU1dULk5PTkUpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIHdzTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBhZGRCdXR0b25fID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbnNDb21wLCAiTEFCRUxfQlVUVE9OX0FERCIsIG51bGwsIG51bGwpOwotICAgIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgYWRkQnV0dG9uXy5zZXRMYXlvdXREYXRhKGdyaWRkYXRhKTsKLSAgICBhZGRCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJlbW92ZUJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uc0NvbXAsICJMQUJFTF9CVVRUT05fUkVNT1ZFIiwgbnVsbCwgbnVsbCk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICByZW1vdmVCdXR0b25fLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIHJlbW92ZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotICAgIGVuYWJsZVJlbW92ZShmYWxzZSk7Ci0KLSAgICAvLyB0YWJsZSBzdHVmZgotICAgIFN0cmluZ1tdIGNvbHVtbnNfID0gbmV3IFN0cmluZ1tdIHsgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX0hBTkRMRVJfTkFNRSIpLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCTEVfSEFORExFUl9DTEFTUyIpfTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc18ubGVuZ3RoOyBpKyspIHsKLSAgICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGhhbmRsZXJzVGFibGVfLCBpKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFRleHQoY29sdW1uc19baV0pOwotICAgICAgdGFibGVDb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFdpZHRoKERFRkFVTFRfQ09MVU1OX1dJRFRIKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICB0YWJsZVZpZXdlcl8gPSBuZXcgVGFibGVWaWV3ZXIoaGFuZGxlcnNUYWJsZV8pOwotICAgIENvbnRyb2wgY29udHJvbCA9IHRhYmxlVmlld2VyXy5nZXRDb250cm9sKCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHRhYmxlVmlld2VyXy5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtbnNfKTsKLSAgICB0YWJsZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBMaXN0Q29udGVudFByb3ZpZGVyKCkpOwotICAgIHRhYmxlVmlld2VyXy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMaXN0TGFiZWxQcm92aWRlcigpKTsKLSAgICB0YWJsZVZpZXdlcl8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBlbmFibGVSZW1vdmUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICAvLyBnZW4gc2tlbGV0b24gY2hlY2sgYm94Ci0gICAgZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZUNoZWNrYm94KHBhcmVudF8sICJMQUJFTF9CVVRUT05fR0VOX1NLRUxFVE9OIiwgVE9PTFRJUF9CVVRUT05fR0VOX1NLRUxFVE9OLCBJTkZPUE9QX0hETFJfR0VOX1NLRUxFVE9OKTsKLSAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KSB7Ci0gICAgICAgIGhhbmRsZUdlblNrZWxldG9uUmFkaW9CdXR0b24oKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIC8vIHNvdXJjZSBsb2NhdGlvbiBjb21ibwotICAgIENvbXBvc2l0ZSBzb3VyY2VMb2NhdGlvbkNvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnRfLCAyKTsKLSAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8oc291cmNlTG9jYXRpb25Db21wLCAiTEFCRUxfQ09NQk9fU09VUkNFX0xPQyIsIFRPT0xUSVBfQ09NQk9fU09VUkNFX0xPQywgSU5GT1BPUF9DT01CT19TT1VSQ0VfTE9DLAotICAgICAgICBTV1QuUkVBRF9PTkxZKTsKLSAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KSB7Ci0gICAgICAgIGhhbmRsZVNvdXJjZUxvY2F0aW9uQ29tYm8oZXZ0KTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLy8gQ2FsbGVkIGF0IHN0YXJ0Ci0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUhhbmRsZXJzVGFibGUoKSB7Ci0gICAgdHJ5IHsKLQotICAgICAgaW50IHNpemVPZkhhbmRsZXJzID0gd3NSZWZzVG9IYW5kbGVyc18uc2l6ZSgpOwotICAgICAgU3RyaW5nW10gd3NSZWZzID0gbmV3IFN0cmluZ1tzaXplT2ZIYW5kbGVyc107Ci0KLSAgICAgIFN0cmluZ1tdIHdzUmVmTmFtZXMgPSAoU3RyaW5nW10pIHdzUmVmc1RvSGFuZGxlcnNfLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICB3ZWJTZXJ2aWNlUmVmQ29tYm9fLnNldEl0ZW1zKHdzUmVmTmFtZXMpOwotICAgICAgd2ViU2VydmljZVJlZkNvbWJvXy5zZWxlY3QoMCk7Ci0KLSAgICAgIGlmIChzaXplT2ZIYW5kbGVycyA8IDEpIHsKLSAgICAgICAgd2ViU2VydmljZVJlZkNvbWJvXy5zZWxlY3QoMCk7Ci0gICAgICAgIHdlYlNlcnZpY2VSZWZDb21ib18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKHNlcnZpY2VSZWZOYW1lXyAhPSBudWxsKSB7Ci0gICAgICAgICAgaW50IGluZGV4ID0gd2ViU2VydmljZVJlZkNvbWJvXy5pbmRleE9mKHNlcnZpY2VSZWZOYW1lXyk7Ci0gICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB3ZWJTZXJ2aWNlUmVmQ29tYm9fLnNlbGVjdChpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHdlYlNlcnZpY2VSZWZDb21ib18uc2VsZWN0KDApOwotICAgICAgfQotCi0gICAgICAvLyBnZXQgd2ViU2VydmljZVJlZiBoaW50Ci0gICAgICBTdHJpbmcgd3NSZWYgPSB3ZWJTZXJ2aWNlUmVmQ29tYm9fLmdldFRleHQoKTsKLQotICAgICAgaWYgKHdzUmVmc1RvSGFuZGxlcnNfLmdldCh3c1JlZikgIT0gbnVsbCkgewotICAgICAgICBvcmRlcmVkSGFuZGxlcnNfID0gKFZlY3Rvcikgd3NSZWZzVG9IYW5kbGVyc18uZ2V0KHdzUmVmKTsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnNldElucHV0KG9yZGVyZWRIYW5kbGVyc18pOwotICAgICAgICB0YWJsZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBoYW5kbGVycy4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEFsbEhhbmRsZXJzTGlzdCgpIHsKLSAgICAvLyBjb252ZXJ0IHRvIGEgQXJyYXlMaXN0IGFuZCByZXR1cm4gYXMgTGlzdAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAob3JkZXJlZEhhbmRsZXJzXyAhPSBudWxsICYmICFvcmRlcmVkSGFuZGxlcnNfLmlzRW1wdHkoKSkgbGlzdC5hZGRBbGwob3JkZXJlZEhhbmRsZXJzXyk7Ci0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3IjZ2V0U3RhdHVzKCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgIFN0YXR1cyBmaW5hbFN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgcmV0dXJuIGZpbmFsU3RhdHVzOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFkZEJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0KLSAgICBBZGRIYW5kbGVyRGlhbG9nIGRpYWxvZyA9IGRpYWxvZyA9IG5ldyBBZGRIYW5kbGVyRGlhbG9nKHBhcmVudF8uZ2V0U2hlbGwoKSwgdHJ1ZSk7Ci0gICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoIDUwMCwgMjAwICk7Ci0gICAgCi0gICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0KLSAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykgewotICAgICAgU3RyaW5nIG5hbWUgPSBkaWFsb2cuZ2V0TmFtZSgpOwotICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGRpYWxvZy5nZXRDbGFzc05hbWUoKTsKLQotICAgICAgSGFuZGxlclRhYmxlSXRlbSBoaSA9IG5ldyBIYW5kbGVyVGFibGVJdGVtKCk7Ci0gICAgICBoaS5zZXRIYW5kbGVyTmFtZShuYW1lKTsKLSAgICAgIGhpLnNldEhhbmRsZXJDbGFzc05hbWUoY2xhc3NOYW1lKTsKLSAgICAgIFN0cmluZyB3c1JlZk5hbWUgPSB3ZWJTZXJ2aWNlUmVmQ29tYm9fLmdldFRleHQoKTsKLSAgICAgIFNlcnZpY2VSZWYgc2VydmljZVJlZiA9IChTZXJ2aWNlUmVmKSByZWZOYW1lVG9TZXJ2aWNlUmVmXy5nZXQod3NSZWZOYW1lKTsKLSAgICAgIGhpLnNldFdzRGVzY1JlZihzZXJ2aWNlUmVmKTsKLQotICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzUmVmc1RvSGFuZGxlcnNfLmdldCh3c1JlZk5hbWUpOwotICAgICAgb3JkZXJlZEhhbmRsZXJzXy5hZGQoaGkpOwotCi0gICAgfQotCi0gICAgcmVmcmVzaCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgaGFuZGxlRGVsZXRlS2V5UHJlc3NlZCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1vdmVVcEJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0KLSAgICBpbnQgaW5kZXggPSB0YWJsZVZpZXdlcl8uZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIElTZWxlY3Rpb24gc2VsZWN0ZWQgPSB0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSAoVmVjdG9yKSB3c1JlZnNUb0hhbmRsZXJzXy5nZXQod2ViU2VydmljZVJlZkNvbWJvXy5nZXRUZXh0KCkpOwotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gb3JkZXJlZEhhbmRsZXJzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICBvcmRlcmVkSGFuZGxlcnNfLmluc2VydEVsZW1lbnRBdChvYmplY3QsIGluZGV4IC0gMSk7Ci0gICAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlTW92ZURvd25CdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCi0gICAgaW50IGluZGV4ID0gdGFibGVWaWV3ZXJfLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGVkID0gdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgaWYgKGluZGV4IDwgb3JkZXJlZEhhbmRsZXJzXy5zaXplKCkgLSAxKSB7Ci0gICAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSAoVmVjdG9yKSB3c1JlZnNUb0hhbmRsZXJzXy5nZXQod2ViU2VydmljZVJlZkNvbWJvXy5nZXRUZXh0KCkpOyAgICAgICAgCi0gICAgICAgIE9iamVjdCBvYmplY3QgPSBvcmRlcmVkSGFuZGxlcnNfLnJlbW92ZShpbmRleCk7Ci0gICAgICAgIG9yZGVyZWRIYW5kbGVyc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXggKyAxKTsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVNvdXJjZUxvY2F0aW9uQ29tYm8oU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICBvdXRwdXRMb2NhdGlvbl8gPSBzb3VyY2VMb2NhdGlvbkNvbWJvXy5nZXRUZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVHZW5Ta2VsZXRvblJhZGlvQnV0dG9uKCkgewotICAgIGlmIChnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXy5pc0VuYWJsZWQoKSkgewotICAgICAgaWYgKGdlblNrZWxldG9uUmFkaW9CdXR0b25fLmdldFNlbGVjdGlvbigpKQotICAgICAgICB0aGlzLmlzR2VuU2tlbGV0b25FbmFibGVkXyA9IHRydWU7Ci0gICAgICBlbHNlCi0gICAgICAgIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlV2ViU2VydmljZVJlZkNvbWJvKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0KLSAgICBpZiAod2ViU2VydmljZVJlZkNvbWJvXy5pc0VuYWJsZWQoKSkgewotICAgICAgU3RyaW5nIHdlYlNlcnZpY2VSZWZOYW1lID0gd2ViU2VydmljZVJlZkNvbWJvXy5nZXRUZXh0KCk7Ci0gICAgICBWZWN0b3IgaG5kbGVycyA9IChWZWN0b3IpIHdzUmVmc1RvSGFuZGxlcnNfLmdldCh3ZWJTZXJ2aWNlUmVmTmFtZSk7Ci0gICAgICAvL0hhbmRsZXJUYWJsZUl0ZW0gaXRlbSA9IChIYW5kbGVyVGFibGVJdGVtKWhuZGxlcnMuZ2V0KDApOwotICAgICAgLy9zZXJ2aWNlUmVmXyA9IChTZXJ2aWNlUmVmKWl0ZW0uZ2V0V3NEZXNjUmVmKCk7Ci0gICAgICBpZiAoaG5kbGVycyAhPSBudWxsKSB7Ci0gICAgICAgIHRhYmxlVmlld2VyXy5zZXRJbnB1dChobmRsZXJzKTsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpc0dlblNrZWxldG9uRW5hYmxlZF8uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0dlblNrZWxldG9uRW5hYmxlZF8oKSB7Ci0gICAgcmV0dXJuIGlzR2VuU2tlbGV0b25FbmFibGVkXzsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0KLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBIYW5kbGVyVGFibGVJdGVtKSB7Ci0gICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaHRpID0gKEhhbmRsZXJUYWJsZUl0ZW0pIG9iamVjdDsKLSAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQotICAgICAgICAgIHJldHVybiBodGkuZ2V0SGFuZGxlck5hbWUoKSAhPSBudWxsID8gaHRpLmdldEhhbmRsZXJOYW1lKCkgOiAiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7IHJldHVybiBodGkuZ2V0SGFuZGxlckNsYXNzTmFtZSgpICE9IG51bGwgPyBodGkuZ2V0SGFuZGxlckNsYXNzTmFtZSgpIDogIiI7IH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVuYWJsZVJlbW92ZShib29sZWFuIGVuYWJsZWQpIHsKLSAgICByZW1vdmVCdXR0b25fLnNldEVuYWJsZWQoZW5hYmxlZCAmJiAhdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTGlzdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWZWN0b3IpIHsgcmV0dXJuICgoVmVjdG9yKSBlbGVtZW50KS50b0FycmF5KCk7IH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGQsIE9iamVjdCBuZXdvYmopIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG9iamVjdCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVEZWxldGVLZXlQcmVzc2VkKCkgewotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7Ci0gICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSBoYW5kbGVyc1RhYmxlXy5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgaW50IHNlbGVjdGlvbkNvdW50ID0gaGFuZGxlcnNUYWJsZV8uZ2V0SXRlbUNvdW50KCk7Ci0KLSAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSAoVmVjdG9yKSB3c1JlZnNUb0hhbmRsZXJzXy5nZXQod2ViU2VydmljZVJlZkNvbWJvXy5nZXRUZXh0KCkpOwotICAgICAgb3JkZXJlZEhhbmRsZXJzXy5yZW1vdmUoc2VsZWN0aW9uSW5kZXgpOwotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHRhYmxlVmlld2VyXy5zZXRJbnB1dChudWxsKTsKLSAgICAgIGlmIChvcmRlcmVkSGFuZGxlcnNfICE9IG51bGwpIHRhYmxlVmlld2VyXy5zZXRJbnB1dChvcmRlcmVkSGFuZGxlcnNfKTsKLSAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRHZW5Ta2VsZXRvbkVuYWJsZWQoYm9vbGVhbiBpc0dlblNrZWxldG9uRW5hYmxlZCkgewotICAgIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfID0gaXNHZW5Ta2VsZXRvbkVuYWJsZWQ7Ci0gICAgZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8uc2V0U2VsZWN0aW9uKGlzR2VuU2tlbGV0b25FbmFibGVkKTsKLQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuU2tlbGV0b25FbmFibGVkKCkgewotICAgIHJldHVybiB0aGlzLmlzR2VuU2tlbGV0b25FbmFibGVkXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNvdXJjZU91dHB1dExvY2F0aW9uKElQYXRoW10gbG9jYXRpb25zKSB7Ci0gICAgaWYgKGxvY2F0aW9uc1swXSE9bnVsbCkKLSAgICAgIHRoaXMub3V0cHV0TG9jYXRpb25fID0gbG9jYXRpb25zWzBdLnRvU3RyaW5nKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuOwotICAgIAotICAgIFN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1tsb2NhdGlvbnMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgcGF0aHNbaV0gPSBsb2NhdGlvbnNbaV0udG9TdHJpbmcoKTsKLSAgICAgIHBhdGhzVGFibGVfLnB1dChwYXRoc1tpXSwgbG9jYXRpb25zW2ldKTsKLSAgICB9Ci0gICAgc291cmNlTG9jYXRpb25Db21ib18uc2V0SXRlbXMocGF0aHMpOwotICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fLnNlbGVjdCgwKTsKLQotICB9Ci0KLSAgcHVibGljIElQYXRoIGdldFNvdXJjZU91dHB1dExvY2F0aW9uKCkgewotICAgIElQYXRoIG91dHB1dFBhdGggPSAoSVBhdGgpIHBhdGhzVGFibGVfLmdldChvdXRwdXRMb2NhdGlvbl8pOwotICAgIHJldHVybiBvdXRwdXRQYXRoOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlckNsYXNzTmFtZXMuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0SGFuZGxlckNsYXNzTmFtZXMoKSB7Ci0gICAgVmVjdG9yIGhhbmRsZXJDbGFzc2VzID0gbmV3IFZlY3RvcigpOwotCi0gICAgRW51bWVyYXRpb24gZSA9IHdzUmVmc1RvSGFuZGxlcnNfLmtleXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCi0gICAgICBTdHJpbmcgd3NSZWZOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzUmVmc1RvSGFuZGxlcnNfLmdldCh3c1JlZk5hbWUpOwotCi0gICAgICBpZiAob3JkZXJlZEhhbmRsZXJzXyAhPSBudWxsKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXJlZEhhbmRsZXJzXy5zaXplKCk7IGkrKykgewotICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaHRpID0gKEhhbmRsZXJUYWJsZUl0ZW0pIG9yZGVyZWRIYW5kbGVyc18uZ2V0KGkpOwotICAgICAgICAgIGhhbmRsZXJDbGFzc2VzLmFkZChodGkuZ2V0SGFuZGxlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKFN0cmluZ1tdKWhhbmRsZXJDbGFzc2VzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c1JlZnNUb0hhbmRsZXJzXy4KLSAgICovCi0gIHB1YmxpYyBIYXNodGFibGUgZ2V0V3NSZWZzVG9IYW5kbGVycygpIHsKLSAgICByZXR1cm4gd3NSZWZzVG9IYW5kbGVyc187Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdzUmVmc1RvSGFuZGxlcnNfCi0gICAqICAgICAgICAgIFRoZSB3c1JlZnNUb0hhbmRsZXJzXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc1JlZnNUb0hhbmRsZXJzKEhhc2h0YWJsZSB3c1JlZnNUb0hhbmRsZXJzQXJyYXkpIHsKLQotICAgIHdzUmVmc1RvSGFuZGxlcnNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHRyeSB7Ci0KLSAgICAgIGlmICh3c1JlZnNUb0hhbmRsZXJzQXJyYXkgIT0gbnVsbCkgewotICAgICAgICBpbnQgc2l6ZU9mSGFuZGxlcnMgPSB3c1JlZnNUb0hhbmRsZXJzQXJyYXkuc2l6ZSgpOwotICAgICAgICBTdHJpbmdbXSB3c1JlZnMgPSBuZXcgU3RyaW5nW3NpemVPZkhhbmRsZXJzXTsKLSAgICAgICAgLy8gc3RvcmUgdGhlIHdzUmVmcwotICAgICAgICBFbnVtZXJhdGlvbiB3c1JlZiA9IHdzUmVmc1RvSGFuZGxlcnNBcnJheS5rZXlzKCk7Ci0gICAgICAgIHdoaWxlICh3c1JlZi5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgIFN0cmluZyB3c1JlZk5hbWUgPSAoU3RyaW5nKSB3c1JlZi5uZXh0RWxlbWVudCgpOwotCi0gICAgICAgICAgSGFuZGxlclRhYmxlSXRlbVtdIGhhbmRsZXJzID0gKEhhbmRsZXJUYWJsZUl0ZW1bXSkgd3NSZWZzVG9IYW5kbGVyc0FycmF5LmdldCh3c1JlZk5hbWUpOwotICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIGhhbmRsZXJzVGFibGUKLSAgICAgICAgICBvcmRlcmVkSGFuZGxlcnNfID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG9yZGVyZWRIYW5kbGVyc18uYWRkKGhhbmRsZXJzW2ldKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd3NSZWZzVG9IYW5kbGVyc18ucHV0KHdzUmVmTmFtZSwgb3JkZXJlZEhhbmRsZXJzXyk7Ci0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcG9wdWxhdGVIYW5kbGVyc1RhYmxlKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VSZWZOYW1lKFN0cmluZyB3c1JlZk5hbWUpIHsKLSAgICBzZXJ2aWNlUmVmTmFtZV8gPSB3c1JlZk5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZWZOYW1lVG9TZXJ2aWNlUmVmKEhhc2h0YWJsZSByZWZOYW1lMlNGKSB7Ci0gICAgdGhpcy5yZWZOYW1lVG9TZXJ2aWNlUmVmXyA9IHJlZk5hbWUyU0Y7Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9Db25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYTliYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkhhbmRsZXJUYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLS8qKgotICogQ29uZmlnU2VydmljZUhhbmRsZXJzVHJlZVdpZGdldAotICogIAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotCi0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc18gPSBudWxsOwotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyXzsKLSAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50XzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzR2VuU2tlbGV0b25FbmFibGVkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0TG9jYXRpb25fOwotCi0gIHByaXZhdGUgVGFibGUgaGFuZGxlcnNUYWJsZV87Ci0gIHByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXJfOwotICBwcml2YXRlIENvbWJvIHdlYlNlcnZpY2VEZXNjQ29tYm9fOwotICBwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXzsKLSAgcHJpdmF0ZSBDb21ibyBzb3VyY2VMb2NhdGlvbkNvbWJvXzsKLSAgcHJpdmF0ZSBUZXh0IHRleHRfOyAvLyBzZWxlY3RlZCBUZXh0Ci0KLSAgcHJpdmF0ZSBIYW5kbGVyVGFibGVJdGVtW10gaGFuZGxlcnM7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHBhdGhzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICBwcml2YXRlIEhhc2h0YWJsZSB3c0Rlc2NUb0hhbmRsZXJzXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgd3NEZXNjVG9Qb3J0c187Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHNlcnZpY2VEZXNjTmFtZVRvRGVzY09ial87Ci0gIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uTmFtZV8gPSBudWxsOwotCi0gIHByaXZhdGUgVmVjdG9yIG9yZGVyZWRIYW5kbGVyc187Ci0KLSAgcHJpdmF0ZSBpbnQgREVGQVVMVF9DT0xVTU5fV0lEVEggPSA5MDsKLQotICAvLyAtLS0tVE9PTFRJUFMgU2VjdGlvbi0tLS0KLSAgLyogQ09OVEVYVF9JRCBTSExEMDAwMSBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9IRExSX1dTX0hBTkRMRVJTID0gIlNIREwwMDAxIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX0VESVRfV1NfSEFORExFUlMgPSAiVE9PTFRJUF9FRElUX1dTX0hBTkRMRVJTIjsKLQotICAvKiBDT05URVhUX0lEIFNIREwwMDAyIGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX0hETFJfR0VOX1NLRUxFVE9OID0gIlNIREwwMDAyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX0JVVFRPTl9HRU5fU0tFTEVUT04gPSAiVE9PTFRJUF9CVVRUT05fR0VOX1NLRUxFVE9OIjsKLQotICAvKiBDT05URVhUX0lEIFNIREwwMDAzIGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX0NPTUJPX1NPVVJDRV9MT0MgPSAiU0hETDAwMDMiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfQ09NQk9fU09VUkNFX0xPQyA9ICJUT09MVElQX0NPTUJPX1NPVVJDRV9MT0MiOwotCi0gIC8qIENPTlRFWFRfSUQgU0hETDAwMDQgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfV1NfU0VSVklDRV9ERVNDID0gIlNIREwwMDA0IjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1dTX1NFUlZJQ0VfREVTQyA9ICJUT09MVElQX1dTX1NFUlZJQ0VfREVTQyI7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHVibGljIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0KCkgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIFVJVXRpbHMgdWlVdGlscyA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzXywgcGx1Z2luSWRfKTsKLQotICAgIHBhcmVudF8gPSBwYXJlbnQ7Ci0gICAgc3RhdHVzTGlzdGVuZXJfID0gc3RhdHVzTGlzdGVuZXI7Ci0KLSAgICAvLyBXZWIgc2VydmljZSByZWZlcmVuY2UgY29tYm8KLSAgICBDb21wb3NpdGUgd2ViU2VydmljZVJlZkNvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnRfLCAyKTsKLSAgICB3ZWJTZXJ2aWNlRGVzY0NvbWJvXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8od2ViU2VydmljZVJlZkNvbXAsICJMQUJFTF9DT01CT19XU19TRVJWSUNFX0RFU0MiLCBUT09MVElQX1dTX1NFUlZJQ0VfREVTQywgVE9PTFRJUF9XU19TRVJWSUNFX0RFU0MsCi0gICAgICAgIFNXVC5SRUFEX09OTFkpOwotICAgIHdlYlNlcnZpY2VEZXNjQ29tYm9fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgaGFuZGxlV2ViU2VydmljZURlc2NDb21ibyhldnQpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgQ29tcG9zaXRlIGRpc3BsYXlDb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICBkaXNwbGF5Q29tcC5zZXRMYXlvdXQoZ3JpZGxheW91dCk7Ci0gICAgZGlzcGxheUNvbXAuc2V0TGF5b3V0RGF0YSh1aVV0aWxzLmNyZWF0ZUZpbGxBbGwoKSk7Ci0KLSAgICBDb21wb3NpdGUgaGFuZGxlcnNDb21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoZGlzcGxheUNvbXAsIDEpOwotICAgIEdyaWREYXRhIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORwotICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotICAgIGhhbmRsZXJzQ29tcC5zZXRMYXlvdXREYXRhKGdyaWRkYXRhKTsKLSAgICBoYW5kbGVyc0NvbXAuc2V0U2l6ZSgxMzAsIDYwMCk7Ci0KLSAgICBDb21wb3NpdGUgYnV0dG9uc0NvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShkaXNwbGF5Q29tcCwgMSk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBidXR0b25zQ29tcC5zZXRMYXlvdXREYXRhKGdyaWRkYXRhKTsKLQotICAgIFRleHQgaGFuZGxlcnNUZXh0ID0gbmV3IFRleHQoaGFuZGxlcnNDb21wLCBTV1QuUkVBRF9PTkxZKTsKLSAgICBoYW5kbGVyc1RleHQuc2V0VGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfSEFORExFUlNfQ09ORklHIikpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIGhhbmRsZXJzVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIGhhbmRsZXJzVGFibGVfID0gdWlVdGlscy5jcmVhdGVUYWJsZShoYW5kbGVyc0NvbXAsIFRPT0xUSVBfRURJVF9XU19IQU5ETEVSUywgSU5GT1BPUF9IRExSX1dTX0hBTkRMRVJTLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgIGhhbmRsZXJzVGFibGVfLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgaGFuZGxlcnNUYWJsZV8uc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgLy8gZW1wdHkgc3BhY2UKLSAgICBMYWJlbCB3c0xhYmVsID0gbmV3IExhYmVsKGJ1dHRvbnNDb21wLCBTV1QuTk9ORSk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgd3NMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIEJ1dHRvbiBtb3ZlVXBCdXR0b24gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uc0NvbXAsICJMQUJFTF9CVVRUT05fTU9WRV9VUCIsIG51bGwsIG51bGwpOwotICAgIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgbW92ZVVwQnV0dG9uLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIG1vdmVVcEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGhhbmRsZU1vdmVVcEJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBCdXR0b24gbW92ZURvd25CdXR0b24gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uc0NvbXAsICJMQUJFTF9CVVRUT05fTU9WRV9ET1dOIiwgbnVsbCwgbnVsbCk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBtb3ZlRG93bkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWRkYXRhKTsKLSAgICBtb3ZlRG93bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGhhbmRsZU1vdmVEb3duQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIC8vIGVtcHR5IHNwYWNlCi0gICAgd3NMYWJlbCA9IG5ldyBMYWJlbChidXR0b25zQ29tcCwgU1dULk5PTkUpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIHdzTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBhZGRCdXR0b25fID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbnNDb21wLCAiTEFCRUxfQlVUVE9OX0FERCIsIG51bGwsIG51bGwpOwotICAgIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgYWRkQnV0dG9uXy5zZXRMYXlvdXREYXRhKGdyaWRkYXRhKTsKLSAgICBhZGRCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJlbW92ZUJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uc0NvbXAsICJMQUJFTF9CVVRUT05fUkVNT1ZFIiwgbnVsbCwgbnVsbCk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICByZW1vdmVCdXR0b25fLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIHJlbW92ZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotICAgIGVuYWJsZVJlbW92ZShmYWxzZSk7Ci0KLSAgICAvLyB0YWJsZSBzdHVmZiBoZXJlCi0gICAgU3RyaW5nW10gY29sdW1uc18gPSBuZXcgU3RyaW5nW10geyBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfSEFORExFUl9OQU1FIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJMRV9IQU5ETEVSX0NMQVNTIiksCi0gICAgICAgIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9IQU5ETEVSX1BPUlQiKX07Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNfLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihoYW5kbGVyc1RhYmxlXywgaSk7Ci0gICAgICB0YWJsZUNvbHVtbi5zZXRUZXh0KGNvbHVtbnNfW2ldKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0gICAgICB0YWJsZUNvbHVtbi5zZXRXaWR0aChERUZBVUxUX0NPTFVNTl9XSURUSCk7Ci0gICAgICB0YWJsZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgdGFibGVWaWV3ZXJfID0gbmV3IFRhYmxlVmlld2VyKGhhbmRsZXJzVGFibGVfKTsKLSAgICBDb250cm9sIGNvbnRyb2wgPSB0YWJsZVZpZXdlcl8uZ2V0Q29udHJvbCgpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICB0YWJsZVZpZXdlcl8uc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5zXyk7Ci0gICAgdGFibGVWaWV3ZXJfLnNldENvbnRlbnRQcm92aWRlcihuZXcgTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLSAgICB0YWJsZVZpZXdlcl8uc2V0TGFiZWxQcm92aWRlcihuZXcgTGlzdExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgdGFibGVWaWV3ZXJfLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgZW5hYmxlUmVtb3ZlKHRydWUpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZUNoZWNrYm94KHBhcmVudF8sICJMQUJFTF9CVVRUT05fR0VOX1NLRUxFVE9OIiwgVE9PTFRJUF9CVVRUT05fR0VOX1NLRUxFVE9OLCBJTkZPUE9QX0hETFJfR0VOX1NLRUxFVE9OKTsKLSAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KSB7Ci0gICAgICAgIGhhbmRsZUdlblNrZWxldG9uUmFkaW9CdXR0b24oKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIENvbXBvc2l0ZSBzb3VyY2VMb2NhdGlvbkNvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnRfLCAyKTsKLSAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8oc291cmNlTG9jYXRpb25Db21wLCAiTEFCRUxfQ09NQk9fU09VUkNFX0xPQyIsIFRPT0xUSVBfQ09NQk9fU09VUkNFX0xPQywgSU5GT1BPUF9DT01CT19TT1VSQ0VfTE9DLAotICAgICAgICBTV1QuUkVBRF9PTkxZKTsKLSAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KSB7Ci0gICAgICAgIGhhbmRsZVNvdXJjZUxvY2F0aW9uQ29tYm8oZXZ0KTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLy8gQ2FsbGVkIGF0IHN0YXJ0Ci0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUhhbmRsZXJzVGFibGUoKSB7Ci0gICAgdHJ5IHsKLQotICAgICAgaW50IHNpemVPZkhhbmRsZXJzID0gd3NEZXNjVG9IYW5kbGVyc18uc2l6ZSgpOwotICAgICAgU3RyaW5nW10gd3NSZWZzID0gbmV3IFN0cmluZ1tzaXplT2ZIYW5kbGVyc107Ci0KLSAgICAgIFN0cmluZ1tdIHdzUmVmTmFtZXMgPSAoU3RyaW5nW10pIHdzRGVzY1RvSGFuZGxlcnNfLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5zZXRJdGVtcyh3c1JlZk5hbWVzKTsKLQotICAgICAgaWYgKHNpemVPZkhhbmRsZXJzIDwgMSkgewotICAgICAgICB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5zZWxlY3QoMCk7Ci0gICAgICAgIHdlYlNlcnZpY2VEZXNjQ29tYm9fLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbk5hbWVfICE9IG51bGwpIHsKLSAgICAgICAgICBpbnQgaW5kZXggPSB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5pbmRleE9mKGRlc2NyaXB0aW9uTmFtZV8pOwotICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgd2ViU2VydmljZURlc2NDb21ib18uc2VsZWN0KGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgd2ViU2VydmljZURlc2NDb21ib18uc2VsZWN0KDApOwotICAgICAgfQotICAgICAgLy8gZ2V0IHdlYlNlcnZpY2VSZWYgaGludAotICAgICAgU3RyaW5nIHdzUmVmID0gd2ViU2VydmljZURlc2NDb21ib18uZ2V0VGV4dCgpOwotCi0gICAgICBpZiAod3NEZXNjVG9IYW5kbGVyc18uZ2V0KHdzUmVmKSAhPSBudWxsKSB7Ci0gICAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSAoVmVjdG9yKSB3c0Rlc2NUb0hhbmRsZXJzXy5nZXQod3NSZWYpOwotICAgICAgICB0YWJsZVZpZXdlcl8uc2V0SW5wdXQob3JkZXJlZEhhbmRsZXJzXyk7Ci0gICAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXJzLgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SGFuZGxlcnNMaXN0KCkgewotICAgIC8vIGNvbnZlcnQgdG8gYSBBcnJheUxpc3QgYW5kIHJldHVybiBhcyBMaXN0Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChvcmRlcmVkSGFuZGxlcnNfICE9IG51bGwgJiYgIW9yZGVyZWRIYW5kbGVyc18uaXNFbXB0eSgpKSBsaXN0LmFkZEFsbChvcmRlcmVkSGFuZGxlcnNfKTsKLQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIEhhc2h0YWJsZSBnZXRXc0Rlc2NUb0hhbmRsZXJzKCkgewotICAgIHJldHVybiB0aGlzLndzRGVzY1RvSGFuZGxlcnNfOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBoYW5kbGVycwotICAgKiAgICAgICAgICBUaGUgaGFuZGxlcnMgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SGFuZGxlcnMoSGFuZGxlclRhYmxlSXRlbVtdIGhhbmRsZXJzKSB7Ci0gICAgdGhpcy5oYW5kbGVycyA9IGhhbmRsZXJzOwotICAgIHBvcHVsYXRlSGFuZGxlcnNUYWJsZSgpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNnZXRTdGF0dXMoKQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgU3RhdHVzIGZpbmFsU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICByZXR1cm4gZmluYWxTdGF0dXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgCQotICAJU3RyaW5nIGRlc2NOYW1lID0gd2ViU2VydmljZURlc2NDb21ib18uZ2V0VGV4dCgpOwotICAJV2ViU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXy5nZXQoZGVzY05hbWUpOwotICAJCi0gICAgQWRkSGFuZGxlckRpYWxvZyBkaWFsb2cgPSBkaWFsb2cgPSBuZXcgQWRkSGFuZGxlckRpYWxvZyhwYXJlbnRfLmdldFNoZWxsKCksIGZhbHNlKTsKLSAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgCi0gICAgU3RyaW5nW10gcG9ydE5hbWVzID0gZ2V0UG9ydENvbXBvbmVudE5hbWVzKHNlcnZpY2VEZXNjKTsKLSAgICBkaWFsb2cuc2V0UG9ydE5hbWVzKHBvcnROYW1lcyk7Ci0gICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSggNTAwLCAyMDAgKTsKLSAgICAKLSAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQotICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IGRpYWxvZy5nZXROYW1lKCk7Ci0gICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZGlhbG9nLmdldENsYXNzTmFtZSgpOwotICAgICAgU3RyaW5nIHBvcnQgPSBkaWFsb2cuZ2V0UG9ydE5hbWUoKTsKLQotICAgICAgSGFuZGxlclRhYmxlSXRlbSBoaSA9IG5ldyBIYW5kbGVyVGFibGVJdGVtKCk7Ci0gICAgICBoaS5zZXRIYW5kbGVyTmFtZShuYW1lKTsKLSAgICAgIGhpLnNldEhhbmRsZXJDbGFzc05hbWUoY2xhc3NOYW1lKTsKLSAgICAgIGhpLnNldFBvcnROYW1lKHBvcnQpOwotICAgICAgCi0gICAgICAKLSAgICAgIGhpLnNldFdzRGVzY1JlZihzZXJ2aWNlRGVzYyk7Ci0KLSAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSAoVmVjdG9yKSB3c0Rlc2NUb0hhbmRsZXJzXy5nZXQoZGVzY05hbWUpOwotICAgICAgb3JkZXJlZEhhbmRsZXJzXy5hZGQoaGkpOwotCi0gICAgfQotCi0gICAgcmVmcmVzaCgpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRQb3J0Q29tcG9uZW50TmFtZXMoV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2VEZXNjKSB7Ci0gIAkKLSAgCUxpc3QgcG9ydHMgPSB3ZWJTZXJ2aWNlRGVzYy5nZXRQb3J0Q29tcG9uZW50cygpOwotICAJaWYgKHBvcnRzIT1udWxsKXsKLSAgCQlTdHJpbmdbXSBwb3J0TmFtZXMgPSBuZXcgU3RyaW5nW3BvcnRzLnNpemUoKV07Ci0gIAkJZm9yKGludCBpPTA7aTxwb3J0cy5zaXplKCk7aSsrKXsKLSAgCQkJUG9ydENvbXBvbmVudCBwYyA9IChQb3J0Q29tcG9uZW50KXBvcnRzLmdldChpKTsKLSAgCQkJU3RyaW5nIHBjTmFtZSA9IHBjLmdldFBvcnRDb21wb25lbnROYW1lKCk7Ci0gIAkJCXBvcnROYW1lc1tpXSA9IHBjTmFtZTsKLSAgCQl9Ci0gIAkJcmV0dXJuIHBvcnROYW1lczsKLSAgCX0KLSAgCXJldHVybiBuZXcgU3RyaW5nWzBdOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICBoYW5kbGVEZWxldGVLZXlQcmVzc2VkKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlTW92ZVVwQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIGludCBpbmRleCA9IHRhYmxlVmlld2VyXy5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3RlZCA9IHRhYmxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgIGlmIChpbmRleCA+IDApIHsKLSAgICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzRGVzY1RvSGFuZGxlcnNfLmdldCh3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5nZXRUZXh0KCkpOwotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gb3JkZXJlZEhhbmRsZXJzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICBvcmRlcmVkSGFuZGxlcnNfLmluc2VydEVsZW1lbnRBdChvYmplY3QsIGluZGV4IC0gMSk7Ci0gICAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlTW92ZURvd25CdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCi0gICAgaW50IGluZGV4ID0gdGFibGVWaWV3ZXJfLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGVkID0gdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgaWYgKGluZGV4IDwgb3JkZXJlZEhhbmRsZXJzXy5zaXplKCkgLSAxKSB7Ci0gICAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSAoVmVjdG9yKSB3c0Rlc2NUb0hhbmRsZXJzXy5nZXQod2ViU2VydmljZURlc2NDb21ib18uZ2V0VGV4dCgpKTsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IG9yZGVyZWRIYW5kbGVyc18ucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgb3JkZXJlZEhhbmRsZXJzXy5pbnNlcnRFbGVtZW50QXQob2JqZWN0LCBpbmRleCArIDEpOwotICAgICAgICB0YWJsZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlU291cmNlTG9jYXRpb25Db21ibyhTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgIG91dHB1dExvY2F0aW9uXyA9IHNvdXJjZUxvY2F0aW9uQ29tYm9fLmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUdlblNrZWxldG9uUmFkaW9CdXR0b24oKSB7Ci0gICAgaWYgKGdlblNrZWxldG9uUmFkaW9CdXR0b25fLmlzRW5hYmxlZCgpKSB7Ci0gICAgICBpZiAoZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfID0gdHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhpcy5pc0dlblNrZWxldG9uRW5hYmxlZF8gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVXZWJTZXJ2aWNlRGVzY0NvbWJvKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0KLSAgICBpZiAod2ViU2VydmljZURlc2NDb21ib18uaXNFbmFibGVkKCkpIHsKLSAgICAgIFN0cmluZyB3ZWJTZXJ2aWNlUmVmTmFtZSA9IHdlYlNlcnZpY2VEZXNjQ29tYm9fLmdldFRleHQoKTsKLSAgICAgIFZlY3RvciBobmRsZXJzID0gKFZlY3Rvcikgd3NEZXNjVG9IYW5kbGVyc18uZ2V0KHdlYlNlcnZpY2VSZWZOYW1lKTsKLSAgICAgIGlmIChobmRsZXJzICE9IG51bGwpIHsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnNldElucHV0KGhuZGxlcnMpOwotICAgICAgICB0YWJsZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzR2VuU2tlbGV0b25FbmFibGVkXy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzR2VuU2tlbGV0b25FbmFibGVkXygpIHsKLSAgICByZXR1cm4gaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIExpc3RMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEhhbmRsZXJUYWJsZUl0ZW0pIHsKLSAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBodGkgPSAoSGFuZGxlclRhYmxlSXRlbSkgb2JqZWN0OwotICAgICAgICBpZiAoY29sdW1uSW5kZXggPT0gMCkgewotICAgICAgICAgIHJldHVybiBodGkuZ2V0SGFuZGxlck5hbWUoKSAhPSBudWxsID8gaHRpLmdldEhhbmRsZXJOYW1lKCkgOiAiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0gICAgICAgICAgcmV0dXJuIGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkgIT0gbnVsbCA/IGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkgOiAiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gaHRpLmdldFBvcnROYW1lKCkgIT0gbnVsbCA/IGh0aS5nZXRQb3J0TmFtZSgpIDogIiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVuYWJsZVJlbW92ZShib29sZWFuIGVuYWJsZWQpIHsKLSAgICByZW1vdmVCdXR0b25fLnNldEVuYWJsZWQoZW5hYmxlZCAmJiAhdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTGlzdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWZWN0b3IpIHsgcmV0dXJuICgoVmVjdG9yKSBlbGVtZW50KS50b0FycmF5KCk7IH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGQsIE9iamVjdCBuZXdvYmopIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG9iamVjdCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVEZWxldGVLZXlQcmVzc2VkKCkgewotICAgIC8vaW50ZXJuYWxEaXNwb3NlKCk7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLSAgICAgIGludCBzZWxlY3Rpb25JbmRleCA9IGhhbmRsZXJzVGFibGVfLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpbnQgc2VsZWN0aW9uQ291bnQgPSBoYW5kbGVyc1RhYmxlXy5nZXRJdGVtQ291bnQoKTsKLQotICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzRGVzY1RvSGFuZGxlcnNfLmdldCh3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5nZXRUZXh0KCkpOwotICAgICAgb3JkZXJlZEhhbmRsZXJzXy5yZW1vdmUoc2VsZWN0aW9uSW5kZXgpOwotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHRhYmxlVmlld2VyXy5zZXRJbnB1dChudWxsKTsKLSAgICAgIGlmIChvcmRlcmVkSGFuZGxlcnNfICE9IG51bGwpIHRhYmxlVmlld2VyXy5zZXRJbnB1dChvcmRlcmVkSGFuZGxlcnNfKTsKLSAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRHZW5Ta2VsZXRvbkVuYWJsZWQoYm9vbGVhbiBpc0dlblNrZWxldG9uRW5hYmxlZCkgewotICAgIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfID0gaXNHZW5Ta2VsZXRvbkVuYWJsZWQ7Ci0gICAgZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8uc2V0U2VsZWN0aW9uKGlzR2VuU2tlbGV0b25FbmFibGVkKTsKLQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuU2tlbGV0b25FbmFibGVkKCkgewotICAgIHJldHVybiB0aGlzLmlzR2VuU2tlbGV0b25FbmFibGVkXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNvdXJjZU91dHB1dExvY2F0aW9uKElQYXRoW10gbG9jYXRpb25zKSB7Ci0gICAgdGhpcy5vdXRwdXRMb2NhdGlvbl8gPSBsb2NhdGlvbnNbMF0udG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1tsb2NhdGlvbnMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgcGF0aHNbaV0gPSBsb2NhdGlvbnNbaV0udG9TdHJpbmcoKTsKLSAgICAgIHBhdGhzVGFibGVfLnB1dChwYXRoc1tpXSwgbG9jYXRpb25zW2ldKTsKLSAgICB9Ci0gICAgc291cmNlTG9jYXRpb25Db21ib18uc2V0SXRlbXMocGF0aHMpOwotICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fLnNlbGVjdCgwKTsKLQotICB9Ci0KLSAgcHVibGljIElQYXRoIGdldFNvdXJjZU91dHB1dExvY2F0aW9uKCkgewotICAgIElQYXRoIG91dHB1dFBhdGggPSAoSVBhdGgpIHBhdGhzVGFibGVfLmdldChvdXRwdXRMb2NhdGlvbl8pOwotICAgIHJldHVybiBvdXRwdXRQYXRoOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlckNsYXNzTmFtZXMuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0SGFuZGxlckNsYXNzTmFtZXMoKSB7Ci0gICAgCi0gICAgVmVjdG9yIGhhbmRsZXJDbGFzc2VzID0gbmV3IFZlY3RvcigpOwotICAgIEVudW1lcmF0aW9uIGUgPSB3c0Rlc2NUb0hhbmRsZXJzXy5rZXlzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgIAotICAgICAgU3RyaW5nIHdzRGVzY05hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSAoVmVjdG9yKSB3c0Rlc2NUb0hhbmRsZXJzXy5nZXQod3NEZXNjTmFtZSk7Ci0gICAgICAKLSAgICAgIGlmIChvcmRlcmVkSGFuZGxlcnNfICE9IG51bGwpIHsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3JkZXJlZEhhbmRsZXJzXy5zaXplKCk7IGkrKykgewotICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaHRpID0gKEhhbmRsZXJUYWJsZUl0ZW0pIG9yZGVyZWRIYW5kbGVyc18uZ2V0KGkpOwotICAgICAgICAgIGhhbmRsZXJDbGFzc2VzLmFkZChodGkuZ2V0SGFuZGxlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKFN0cmluZ1tdKWhhbmRsZXJDbGFzc2VzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdzRGVzY1RvSGFuZGxlcnNBcnJheV8KLSAgICogICAgICAgICAgVGhlIHdzRGVzY1RvSGFuZGxlcnNBcnJheV8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NSZWZzVG9IYW5kbGVycyhIYXNodGFibGUgd3NEZXNjVG9IYW5kbGVyc0FycmF5KSB7Ci0KLSAgICB3c0Rlc2NUb0hhbmRsZXJzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB3c0Rlc2NUb1BvcnRzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0cnkgewotCi0gICAgICBpZiAod3NEZXNjVG9IYW5kbGVyc0FycmF5ICE9IG51bGwpIHsKLSAgICAgICAgaW50IHNpemVPZkhhbmRsZXJzID0gd3NEZXNjVG9IYW5kbGVyc0FycmF5LnNpemUoKTsKLSAgICAgICAgU3RyaW5nW10gd3NSZWZzID0gbmV3IFN0cmluZ1tzaXplT2ZIYW5kbGVyc107Ci0gICAgICAgIC8vIHN0b3JlIHRoZSB3c1JlZnMKLSAgICAgICAgRW51bWVyYXRpb24gd3NEZXNjID0gd3NEZXNjVG9IYW5kbGVyc0FycmF5LmtleXMoKTsKLSAgICAgICAgd2hpbGUgKHdzRGVzYy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgIFN0cmluZyB3c0Rlc2NOYW1lID0gKFN0cmluZykgd3NEZXNjLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtW10gaGFuZGxlcnMgPSAoSGFuZGxlclRhYmxlSXRlbVtdKSB3c0Rlc2NUb0hhbmRsZXJzQXJyYXkuZ2V0KHdzRGVzY05hbWUpOwotICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIGhhbmRsZXJzVGFibGUKLSAgICAgICAgICBvcmRlcmVkSGFuZGxlcnNfID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgIEhhc2hTZXQgcG9ydE5hbWVWZWN0b3IgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgb3JkZXJlZEhhbmRsZXJzXy5hZGQoaGFuZGxlcnNbaV0pOwotICAgICAgICAgICAgU3RyaW5nIHBvcnROYW1lID0gaGFuZGxlcnNbaV0uZ2V0UG9ydE5hbWUoKTsKLSAgICAgICAgICAgIHBvcnROYW1lVmVjdG9yLmFkZChuZXcgU3RyaW5nKHBvcnROYW1lKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdzRGVzY1RvSGFuZGxlcnNfLnB1dCh3c0Rlc2NOYW1lLCBvcmRlcmVkSGFuZGxlcnNfKTsKLSAgICAgICAgICB3c0Rlc2NUb1BvcnRzXy5wdXQod3NEZXNjTmFtZSwgKFN0cmluZ1tdKSBwb3J0TmFtZVZlY3Rvci50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcG9wdWxhdGVIYW5kbGVyc1RhYmxlKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uTmFtZShTdHJpbmcgd3NEZXNjTmFtZSkgewotICAgIGRlc2NyaXB0aW9uTmFtZV8gPSB3c0Rlc2NOYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZURlc2NOYW1lVG9EZXNjT2JqKEhhc2h0YWJsZSBzZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmopIHsKLSAgICB0aGlzLnNlcnZpY2VEZXNjTmFtZVRvRGVzY09ial8gPSBzZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmo7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0hhbmRsZXJzRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxOTI4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotCi0KLS8qKgotICogSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZAotICogCi0gKiBEZXRlcm1pbmUgaWYgSGFuZGxlcnMgYmVsb25ncyB0byBzZXJ2aWNlIG9yIGNsaWVudCBzaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBIYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDbWQgewotCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotICBwcml2YXRlIGJvb2xlYW4gaXNDbGllbnRIYW5kbGVyXyA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gaXNTZXJ2aWNlSGFuZGxlcl8gPSBmYWxzZTsKLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldEluaXRpYWxTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIHsKLSAgICAgICAgICBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlIHdzbmd0ID0gKFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUpIG9iajsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSl3c25ndC5nZXRXc2RsU2VydmljZSgpOwotICAgICAgICAgIGlmICh3c25ndC5nZXRXc2RsU2VydmljZSgpIT1udWxsKXsKLSAgICAgICAgICAJaXNTZXJ2aWNlSGFuZGxlcl8gPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBpZiAod3NuZ3QuZ2V0U2VydmljZVJlZigpIT1udWxsKXsKLSAgICAgICAgICAJaXNDbGllbnRIYW5kbGVyXyA9IHRydWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIpLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIH0KLQotICAKLS8qKgotICogQHJldHVybiBSZXR1cm5zIHRoZSBpc0NsaWVudEhhbmRsZXJfLgotICovCi1wdWJsaWMgYm9vbGVhbiBnZXRJc0NsaWVudEhhbmRsZXIoKSB7Ci0JcmV0dXJuIGlzQ2xpZW50SGFuZGxlcl87Ci19Ci0vKioKLSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNTZXJ2aWNlSGFuZGxlcl8uCi0gKi8KLXB1YmxpYyBib29sZWFuIGdldElzU2VydmljZUhhbmRsZXIoKSB7Ci0JcmV0dXJuIGlzU2VydmljZUhhbmRsZXJfOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9JbXBvcnRXU0lMV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvSW1wb3J0V1NJTFdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTY3NzljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9JbXBvcnRXU0lMV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsLkFyZ3VtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbC5UYWJsZVZpZXdlckVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NpbC5BZGRXU0RMVG9XU0lMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLkRpYWxvZ1Jlc291cmNlQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLkZpbGVFeHRlbnNpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotLyoqCi0qIFBhZ2UgZm9yIGltcG9ydGluZyBXU0RMIHJlZmVyZW5jZXMgaW50byBhIFdTSUwgaW4gdGhlIHdvcmtiZW5jaC4KLSovCi1wdWJsaWMgY2xhc3MgSW1wb3J0V1NJTFdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICAvKkNPTlRFWFRfSUQgV1NJTDAwMDEgZm9yIHRoZSBXU0lMIEltcG9ydCBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9XU0lMX0lNUE9SVF9QQUdFID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLldTSUwwMDAxIjsKLQotICAvKkNPTlRFWFRfSUQgV1NJTDAwMDIgZm9yIHRoZSBXU0lMIHRleHQgZmllbGQqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1dTSUxfVEVYVF9XU0lMID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLldTSUwwMDAyIjsKLQotICAvKkNPTlRFWFRfSUQgV1NJTDAwMDMgZm9yIHRoZSBXU0lMIGJyb3dzZSBidXR0b24qLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1dTSUxfQlVUVE9OX0JST1dTRV9XU0lMID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLldTSUwwMDAzIjsKLQotICAvKkNPTlRFWFRfSUQgV1NJTDAwMDQgZm9yIHRoZSBXU0RMIHRhYmxlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9XU0lMX1RBQkxFX1dTREwgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuV1NJTDAwMDQiOwotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElOU1BFQ1RJT05fV1NJTCA9ICJpbnNwZWN0aW9uLndzaWwiOwotCi0gIHByaXZhdGUgVGV4dCB3c2lsXzsKLSAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlXzsKLSAgcHJpdmF0ZSBUYWJsZVZpZXdlckVkaXRvciB3c2Rsc187Ci0gIAotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyBwYWdlLgotICAqLwotICBwdWJsaWMgSW1wb3J0V1NJTFdpZGdldCgpCi0gIHsKLSAgICBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIC8vc3VwZXIobXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9XU0lMX0lNUE9SVCIpLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJUSVRMRV9XU0lMX0lNUE9SVCIpLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJERVNDX1dTSUxfSU1QT1JUIikpOwotICB9Ci0KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsKLSAgCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLSAgCQotICAgIHBhcmVudC5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1dTSUxfSU1QT1JUX1BBR0UiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHBhcmVudCwgSU5GT1BPUF9XU0lMX0lNUE9SVF9QQUdFKTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkxBQkVMX1dTSUxfVVJJIikpOwotICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0gICAgd3NpbF8gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gMjU2OwotICAgIHdzaWxfLnNldExheW91dERhdGEoZ2QpOwotICAgIHdzaWxfLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyKTsKLSAgICB3c2lsXy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1dTSUxfVEVYVF9XU0lMIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh3c2lsXywgSU5GT1BPUF9XU0lMX1RFWFRfV1NJTCk7Ci0KLSAgICBicm93c2VfID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICBicm93c2VfLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiTEFCRUxfQlJPV1NFIikpOwotICAgIGJyb3dzZV8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgYnJvd3NlXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLAotICAgICAgbmV3IExpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVCcm93c2VFdmVudChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIGJyb3dzZV8uc2V0VG9vbFRpcFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiVE9PTFRJUF9XU0lMX0JVVFRPTl9CUk9XU0VfV1NJTCIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAoYnJvd3NlXywgSU5GT1BPUF9XU0lMX0JVVFRPTl9CUk9XU0VfV1NJTCk7Ci0KLSAgICBDb21wb3NpdGUgd3NkbENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgd3NkbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgd3NkbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBsYWJlbCA9IG5ldyBMYWJlbCh3c2RsQ29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgbGFiZWwuc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9XU0RMIikpOwotICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgIFN0cmluZ1tdIGNvbHVtbnMgPSB7bXNnVXRpbHMuZ2V0TWVzc2FnZSgiTEFCRUxfV1NETF9VUkkiKX07Ci0gICAgd3NkbHNfID0gbmV3IFRhYmxlVmlld2VyRWRpdG9yKHdzZGxDb21wb3NpdGUsIGNvbHVtbnMsIG5ldyBBcnJheUxpc3QoKSwgImh0dHA6Ly8iKTsKLSAgICB3c2Rsc18uc2V0VG9vbFRpcFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiVE9PTFRJUF9XU0lMX1RBQkxFX1dTREwiKSk7Ci0gICAgd3NkbHNfLnNldEluZm9wb3AoSU5GT1BPUF9XU0lMX1RBQkxFX1dTREwpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHJpdmF0ZSBJUmVzb3VyY2VbXSBnZXRXU0RMUmVzb3VyY2VzKCkKLSAgewotICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmICgob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpICYmICgoSUZpbGUpb2JqZWN0KS5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCAmJiAoKElGaWxlKW9iamVjdCkuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygid3NkbCIpKQotICAgICAgICAgIGxpc3QuYWRkKG9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIElSZXNvdXJjZVtdIHJlcyA9IG5ldyBJUmVzb3VyY2VbbGlzdC5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKQotICAgICAgcmVzW2ldID0gKElSZXNvdXJjZSlsaXN0LmdldChpKTsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlQnJvd3NlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBEaWFsb2dSZXNvdXJjZUJyb3dzZXIgZGlhbG9nID0gbmV3IERpYWxvZ1Jlc291cmNlQnJvd3Nlcihicm93c2VfLmdldFNoZWxsKCksIG51bGwsIG5ldyBGaWxlRXh0ZW5zaW9uRmlsdGVyKG5ldyBTdHJpbmdbXSB7IndzaWwifSkpOwotICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgSVJlc291cmNlIHJlcyA9IGRpYWxvZy5nZXRGaXJzdFNlbGVjdGlvbigpOwotICAgIGlmIChyZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICAgIHdzaWxfLnNldFRleHQocmVzLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHdzaWxfLnNldFRleHQocmVzLmdldEZ1bGxQYXRoKCkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQoSU5TUEVDVElPTl9XU0lMKS50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICBpZiAoIXdzaWxfLmdldFRleHQoKS5lbmRzV2l0aCgiLndzaWwiKSkKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX01TR19JTlZBTElEX1dTSUxfRklMRV9OQU1FIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmICgob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpICYmICgoSUZpbGUpb2JqZWN0KS5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCAmJiAoKElGaWxlKW9iamVjdCkuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygid3NkbCIpKQotICAgICAgICAgIGxpc3QuYWRkKCgoSUZpbGUpb2JqZWN0KS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2VydmljZUltcGwpCi0gICAgICAgICAgbGlzdC5hZGQoSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTSUxQYXRoKCgoU2VydmljZUltcGwpKG9iamVjdCkpKSk7CQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2VydmljZVJlZikKLSAgICAgICAgICBsaXN0LmFkZChKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NJTFBhdGgoKChTZXJ2aWNlUmVmKShvYmplY3QpKSkpOwkJCi0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKQotICAgICAgICAgIGxpc3QuYWRkKEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5nZXRXU0lMUGF0aCgoKFdTRExSZXNvdXJjZUltcGwpKG9iamVjdCkpKSk7CQotICAgICAgfQotICAgIH0KLSAgICB3c2Rsc18uc2V0SW5wdXQobGlzdCk7Ci0gICAgd3NkbHNfLnJlZnJlc2goKTsKLSAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihsaXN0LmdldCgwKS50b1N0cmluZygpKTsKLSAgICAgIC8vIGNoYW5nZSBleHRlbnNpb24gZnJvbSAud3NkbCB0byAud3NpbAotICAgICAgaW50IGxlbmd0aCA9IHBhdGgubGVuZ3RoKCk7Ci0gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKGxlbmd0aC00LCBsZW5ndGgsICJ3c2lsIik7Ci0gICAgICB3c2lsXy5zZXRUZXh0KHBhdGgudG9TdHJpbmcoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgQXJndW1lbnRzIGdldEdlbldTSUxBcmd1bWVudHMoKQotICB7Ci0gICAgQXJndW1lbnRzIGFyZ3MgPSBuZXcgQXJndW1lbnRzKCk7Ci0gICAgU3RyaW5nIHdzaWxQYXRoID0gd3NpbF8uZ2V0VGV4dCgpOwotICAgIGlmICh3c2lsUGF0aC5pbmRleE9mKCc6JykgPCAwKQotICAgICAgYXJncy5hZGQoQWRkV1NETFRvV1NJTENvbW1hbmQuQVJHX1dTSUwsIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHdzaWxfLmdldFRleHQoKSkudG9TdHJpbmcoKSk7Ci0gICAgZWxzZQotICAgICAgYXJncy5hZGQoQWRkV1NETFRvV1NJTENvbW1hbmQuQVJHX1dTSUwsIHdzaWxQYXRoKTsKLSAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IHdzZGxzXy5nZXRJdGVtcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIHVyaSA9IGl0ZW1zW2ldLmdldFRleHQoMCk7Ci0gICAgICBpZiAodXJpLmluZGV4T2YoJzonKSA8IDApCi0gICAgICB7Ci0gICAgICAgIElSZXNvdXJjZSByZXMgPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSh1cmkpOwotICAgICAgICBpZiAocmVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cmkgPSByZXMuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICAgICAgewotICAgICAgICAgIAltdXJsZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBhcmdzLmFkZChBZGRXU0RMVG9XU0lMQ29tbWFuZC5BUkdfV1NETCwgdXJpKTsKLSAgICB9Ci0gICAgYXJncy5hZGQoQWRkV1NETFRvV1NJTENvbW1hbmQuQVJHX1JFU09MVkVfV1NETCwgbnVsbCk7Ci0gICAgcmV0dXJuIGFyZ3M7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvUHJlZmVyZW5jZXNTZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QcmVmZXJlbmNlc1NlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTA4NDMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QcmVmZXJlbmNlc1NlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIFByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17ICAgIAotICBwcml2YXRlIFJlc291cmNlQ29udGV4dCBjb250ZXh0XzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwMyBmb3IgdGhlIE92ZXJ3cml0ZSBGaWxlcyBjaGVjayBib3ggb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DSEVDS0JPWF9PVkVSV1JJVEVfRklMRVMgPSAiUFdQUjAwMDMiOwotICBwcml2YXRlIEJ1dHRvbiBvdmVyd3JpdGVGaWxlc0NoZWNrYm94XzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwNCBmb3IgdGhlIENyZWF0ZSBGb2xkZXJzIGNoZWNrIGJveCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX0NSRUFURV9GT0xERVJTID0gIlBXUFIwMDA0IjsKLSAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlRm9sZGVyc0NoZWNrYm94XzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAxNSBmb3IgdGhlIENoZWNrIE91dCBGaWxlcyBjaGVjayBib3ggb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DSEVDS0JPWF9DSEVDS09VVF9GSUxFUyA9ICJQV1BSMDAxNSI7ICAKLSAgcHJpdmF0ZSBCdXR0b24gY2hlY2tvdXRGaWxlc0NoZWNrYm94XzsKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNhZGRDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyKQotICAgKi8KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkICAgID0gIm9yZy5lY2xpcHNlLmpzdC53cy51aSI7Ci0gICAgU3RyaW5nICAgICAgIGNvblBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzICAgID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgCVVJVXRpbHMgICAgICB1dGlscyAgICAgICA9IG5ldyBVSVV0aWxzKCBtc2dVdGlscywgY29uUGx1Z2luSWQgKTsKLSAgCQotICAgIENvbXBvc2l0ZSByZXNvdXJjZXNHcm91cCA9IHV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAxICk7Ci0gICAgCi0gICAgb3ZlcndyaXRlRmlsZXNDaGVja2JveF8gPSB1dGlscy5jcmVhdGVDaGVja2JveCggcmVzb3VyY2VzR3JvdXAsICJCVVRUT05fT1ZFUldSSVRFX0ZJTEVTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DSEVDS0JPWF9PVkVSV1JJVEVfRklMRVMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBjcmVhdGVGb2xkZXJzQ2hlY2tib3hfID0gdXRpbHMuY3JlYXRlQ2hlY2tib3goIHJlc291cmNlc0dyb3VwLCAiQlVUVE9OX0NSRUFURV9GT0xERVJTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BQUk1fQ0hFQ0tCT1hfQ1JFQVRFX0ZPTERFUlMiICwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfQ1JFQVRFX0ZPTERFUlMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGNoZWNrb3V0RmlsZXNDaGVja2JveF8gPSB1dGlscy5jcmVhdGVDaGVja2JveCggcmVzb3VyY2VzR3JvdXAsICJCVVRUT05fQ0hFQ0tPVVRfRklMRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFBSTV9DSEVDS0JPWF9DSEVDS19PVVQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DSEVDS0JPWF9DSEVDS09VVF9GSUxFUyApOwotICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VDb250ZXh0KCBSZXNvdXJjZUNvbnRleHQgY29udGV4dCApCi0gIHsgCi0gICAgb3ZlcndyaXRlRmlsZXNDaGVja2JveF8uc2V0U2VsZWN0aW9uKCBjb250ZXh0LmlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkgKTsKLSAgICBjcmVhdGVGb2xkZXJzQ2hlY2tib3hfLnNldFNlbGVjdGlvbiggY29udGV4dC5pc0NyZWF0ZUZvbGRlcnNFbmFibGVkKCkgKTsKLSAgICBjaGVja291dEZpbGVzQ2hlY2tib3hfLnNldFNlbGVjdGlvbiggY29udGV4dC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkgKTsgCi0gICAgCi0gICAgY29udGV4dF8gPSBjb250ZXh0OwotICB9Ci0gIAotICBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGdldFJlc291cmNlQ29udGV4dCgpIAotICB7ICAgIAotICAgIGNvbnRleHRfLnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZCggb3ZlcndyaXRlRmlsZXNDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgICBjb250ZXh0Xy5zZXRDcmVhdGVGb2xkZXJzRW5hYmxlZCggY3JlYXRlRm9sZGVyc0NoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKSApOwotICAgIGNvbnRleHRfLnNldENoZWNrb3V0RmlsZXNFbmFibGVkKCBjaGVja291dEZpbGVzQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpICk7Ci0gICAgCi0gICAgcmV0dXJuIGNvbnRleHRfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yzc2MWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkFic3RyYWN0Q29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmRGcmFnbWVudAotewotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeTsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeTsKLSAgcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hUb1ByaXZhdGVVRERJOwotICBwcml2YXRlIENvbW1hbmRXaWRnZXRCaW5kaW5nIHByaXZhdGVVRERJQmluZGluZzsKLSAgCi0gIHB1YmxpYyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCgpCi0gIHsKLSAgICBzdXBlcigoQ29tbWFuZEZhY3RvcnkpbnVsbCwgIiIpOwotICAgIHByaXZhdGVVRERJQmluZGluZyA9IFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSgpLmdldEJpbmRpbmcoKTsKLSAgfQotCi0gIC8qKiAKLSAgICogR2V0cyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAqIG51bGwgd2hlbiB0aGVyZSBpcyBubyBmaXJzdCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0Rmlyc3RTdWJGcmFnbWVudCgpCi0gIHsKLSAgICBpZiAocHJpdmF0ZVVERElCaW5kaW5nICE9IG51bGwgJiYgcHVibGlzaFRvUHJpdmF0ZVVEREkgJiYgIVByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSgpLmlzUHJpdmF0ZVVERElSZWdpc3RyeUluc3RhbGxlZCgpKQotICAgIHsKLSAgICAgIHByaXZhdGVVRERJQmluZGluZy5yZWdpc3RlckNhbkZpbmlzaChjYW5GaW5pc2hSZWdpc3RyeSk7Ci0gICAgICBwcml2YXRlVURESUJpbmRpbmcucmVnaXN0ZXJEYXRhTWFwcGluZ3MoZGF0YU1hcHBpbmdSZWdpc3RyeSk7Ci0gICAgICBwcml2YXRlVURESUJpbmRpbmcucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyh3aWRnZXRSZWdpc3RyeSk7Ci0gICAgICByZXR1cm4gcHJpdmF0ZVVERElCaW5kaW5nLmNyZWF0ZSgpLmNyZWF0ZSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgICogR2V0cyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zIG51bGwKLSAgICAqIHdoZW4gdGhlcmUgaXMgbm8gbmV4dCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0TmV4dFN1YkZyYWdtZW50KENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCkKLSAgewotICAJcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgZGF0YSBtYXBwaW5ncyBmb3IgdGhpcyBjb21tYW5kIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSkKLSAgewotICAJZGF0YU1hcHBpbmdSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5ID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy53aWRnZXRSZWdpc3RyeSA9IHdpZGdldFJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAgKiBBbGwgd2l6YXJkIGZyYWdtZW50cyBuZWVkIHRvIGJlIGNsb25lYWJsZS4KLSAgKiovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0gICAgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgPSBuZXcgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQoKTsKLSAgCWZyYWdtZW50LnJlZ2lzdGVyRGF0YU1hcHBpbmdzKGRhdGFNYXBwaW5nUmVnaXN0cnkpOwotICAJZnJhZ21lbnQucmVnaXN0ZXJDYW5GaW5pc2goY2FuRmluaXNoUmVnaXN0cnkpOwotICAJZnJhZ21lbnQucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyh3aWRnZXRSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5zZXRQdWJsaXNoVG9Qcml2YXRlVURESShwdWJsaXNoVG9Qcml2YXRlVURESSk7Ci0gIAlyZXR1cm4gZnJhZ21lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQdWJsaXNoVG9Qcml2YXRlVURESShib29sZWFuIHB1Ymxpc2gpCi0gIHsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESSA9IHB1Ymxpc2g7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvUHVibGlzaFdTV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvUHVibGlzaFdTV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjViODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1B1Ymxpc2hXU1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5QdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnVkZGkuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIFB1Ymxpc2hXU1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICAvKiBDT05URVhUX0lEIFBXUEIwMDAxIGZvciB0aGUgVURESSBQdWJsaXNoIFBhZ2UgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BCX1BBR0UgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdQQjAwMDEiOwotICAvKiBDT05URVhUX0lEIFBXUEIwMDAyIGZvciB0aGUgVURESSBMYXVuY2ggY2hlY2sgYm94IG9mIHRoZSBVRERJIFB1Ymxpc2ggUGFnZSAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUEJfQ0hFQ0tCT1hfV1NfTEFVTkNIID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLlBXUEIwMDAyIjsKLSAgcHJpdmF0ZSBCdXR0b24gbGF1bmNoVURESUNoZWNrYm94XzsKLSAgcHJpdmF0ZSBCdXR0b24gbGF1bmNoUHJpdmF0ZVVERElDaGVja2JveF87Ci0gIHByaXZhdGUgTGFiZWwgcHViaWxjVURESVJlZ0NvbWJvTGFiZWxfOwotICBwcml2YXRlIENvbWJvIHB1YmxpY1VERElSZWdDb21ib187Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotICBwcml2YXRlIEJvb2xlYW4gcHVibGlzaDsKLQotICBwdWJsaWMgUHVibGlzaFdTV2lkZ2V0KGJvb2xlYW4gcHVibGlzaCkKLSAgewotICAgIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgdGhpcy5wdWJsaXNoID0gbmV3IEJvb2xlYW4ocHVibGlzaCk7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAgIHRoaXMuc3RhdHVzTGlzdGVuZXIgPSBzdGF0dXNMaXN0ZW5lcjsKLSAgICBMaXN0ZW5lciBzZWxMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIGhhbmRsZVNlbGVjdGlvbkV2ZW50KGV2ZW50KTsKLSAgICAgIH0KLSAgICB9OwotICAgIHBhcmVudC5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BXUEJfUEFHRSIpKTsKLSAgICBJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHBhcmVudCwgSU5GT1BPUF9QV1BCX1BBR0UpOwotICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgaWYgKHB1Ymxpc2guYm9vbGVhblZhbHVlKCkpCi0gICAgICBsYXVuY2hQcml2YXRlVURESUNoZWNrYm94Xy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkJVVFRPTl9XU19QVUJMSVNIX1BSSVZBVEVfVURESSIpKTsKLSAgICBlbHNlCi0gICAgICBsYXVuY2hQcml2YXRlVURESUNoZWNrYm94Xy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkJVVFRPTl9XU19GSU5EX1BSSVZBVEVfVURESSIpKTsKLSAgICBsYXVuY2hQcml2YXRlVURESUNoZWNrYm94Xy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BXUEJfQ0hFQ0tCT1hfV1NfTEFVTkNIIikpOwotICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNlbExpc3RlbmVyKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAobGF1bmNoUHJpdmF0ZVVERElDaGVja2JveF8sIElORk9QT1BfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0gpOwotICAgIGxhdW5jaFVERElDaGVja2JveF8gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICBpZiAocHVibGlzaC5ib29sZWFuVmFsdWUoKSkKLSAgICAgIGxhdW5jaFVERElDaGVja2JveF8uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJCVVRUT05fV1NfUFVCTElTSCIpKTsKLSAgICBlbHNlCi0gICAgICBsYXVuY2hVRERJQ2hlY2tib3hfLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiQlVUVE9OX1dTX0ZJTkQiKSk7Ci0gICAgbGF1bmNoVURESUNoZWNrYm94Xy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BXUEJfQ0hFQ0tCT1hfV1NfTEFVTkNIIikpOwotICAgIGxhdW5jaFVERElDaGVja2JveF8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc2VsTGlzdGVuZXIpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChsYXVuY2hVRERJQ2hlY2tib3hfLCBJTkZPUE9QX1BXUEJfQ0hFQ0tCT1hfV1NfTEFVTkNIKTsKLSAgICBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDM7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgYy5zZXRMYXlvdXQoZ2wpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgYy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBuZXcgTGFiZWwoYywgU1dULldSQVApOwotICAgIHB1YmlsY1VERElSZWdDb21ib0xhYmVsXyA9IG5ldyBMYWJlbChjLCBTV1QuV1JBUCk7Ci0gICAgcHViaWxjVURESVJlZ0NvbWJvTGFiZWxfLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiTEFCRUxfUFVCTElDX1VERElfUkVHSVNUUklFUyIpKTsKLSAgICBwdWJsaWNVRERJUmVnQ29tYm9fID0gbmV3IENvbWJvKGMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICBwdWJsaWNVRERJUmVnQ29tYm9fLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIGluaXRQdWJsaWNVRERJKCk7Ci0gICAgaW5pdFByaXZhdGVVRERJKCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdFB1YmxpY1VEREkoKQotICB7Ci0gICAgUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IHJlZyA9IFB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIFB1YmxpY1VERElSZWdpc3RyeVR5cGVbXSB0eXBlcyA9IHJlZy5nZXRBbGxQdWJsaWNVRERJUmVnaXN0cnlUeXBlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHB1Ymxpc2guYm9vbGVhblZhbHVlKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIElnbm9yZSByZWFkLW9ubHkgcmVnaXN0cmllcy4KLSAgICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSB0eXBlc1tpXS5nZXRQdWJsaXNoVVJMKCk7Ci0gICAgICAgIGlmIChwdWJsaXNoVVJMID09IG51bGwgfHwgcHVibGlzaFVSTC5pbmRleE9mKCI6Ly8iKSA9PSAtMSkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHB1YmxpY1VERElSZWdDb21ib18uYWRkKHR5cGVzW2ldLmdldE5hbWUoKSk7Ci0gICAgfQotICAgIGlmICh0eXBlcy5sZW5ndGggPiAwKQotICAgICAgcHVibGljVURESVJlZ0NvbWJvXy5zZXRUZXh0KHB1YmxpY1VERElSZWdDb21ib18uZ2V0SXRlbSgwKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdFByaXZhdGVVRERJKCkKLSAgewotICAgIGlmICghcHVibGlzaC5ib29sZWFuVmFsdWUoKSAmJiAhUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCkuaXNQcml2YXRlVURESVJlZ2lzdHJ5SW5zdGFsbGVkKCkpCi0gICAgICBsYXVuY2hQcml2YXRlVURESUNoZWNrYm94Xy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3Rpb25FdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGlmIChsYXVuY2hVRERJQ2hlY2tib3hfID09IGV2ZW50LndpZGdldCkKLSAgICAgIHB1YmxpY1VERElSZWdDb21ib18uc2V0RW5hYmxlZChsYXVuY2hVRERJQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpKTsKLSAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChldmVudCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQdWJsaXNoVG9QdWJsaWNVRERJKGJvb2xlYW4gcHVibGlzaCkKLSAgewotICAgIGxhdW5jaFVERElDaGVja2JveF8uc2V0U2VsZWN0aW9uKHB1Ymxpc2gpOwotICAgIHB1YmxpY1VERElSZWdDb21ib18uc2V0RW5hYmxlZChwdWJsaXNoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1B1YmxpY1VEREkoQm9vbGVhbiBwdWJsaXNoKQotICB7Ci0gICAgc2V0UHVibGlzaFRvUHVibGljVURESShwdWJsaXNoLmJvb2xlYW5WYWx1ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1ByaXZhdGVVRERJKGJvb2xlYW4gcHVibGlzaCkKLSAgewotICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLnNldFNlbGVjdGlvbihwdWJsaXNoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1ByaXZhdGVVRERJKEJvb2xlYW4gcHVibGlzaCkKLSAgewotICAgIHNldFB1Ymxpc2hUb1ByaXZhdGVVRERJKHB1Ymxpc2guYm9vbGVhblZhbHVlKCkpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaFRvUHVibGljVURESSgpCi0gIHsKLSAgICByZXR1cm4gbGF1bmNoVURESUNoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2hUb1ByaXZhdGVVRERJKCkKLSAgewotICAgIHJldHVybiBsYXVuY2hQcml2YXRlVURESUNoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEZvcmNlTGF1bmNoT3V0c2lkZUlERSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgTGF1bmNoT3B0aW9uW10gZ2V0TGF1bmNoT3B0aW9ucygpCi0gIHsKLSAgICBWZWN0b3IgbGF1bmNoT3B0aW9uVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIGlmIChsYXVuY2hVRERJQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAgIFB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeSByZWcgPSBQdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgIGludCBVRERJUmVnU2VsZWN0aW9uSW5kZXggPSBwdWJsaWNVRERJUmVnQ29tYm9fLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpZiAoVURESVJlZ1NlbGVjdGlvbkluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHB1YmxpY1VERElSZWdDb21ib18uZ2V0SXRlbShVRERJUmVnU2VsZWN0aW9uSW5kZXgpOwotICAgICAgICBTdHJpbmcgaWQgPSByZWcuZ2V0UHVibGljVURESVJlZ2lzdHJ5VHlwZUlEQnlOYW1lKG5hbWUpOwotICAgICAgICBQdWJsaWNVRERJUmVnaXN0cnlUeXBlIHR5cGUgPSByZWcuZ2V0UHVibGljVURESVJlZ2lzdHJ5VHlwZUJ5SUQoaWQpOwotICAgICAgICBsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5JTlFVSVJZX1VSTCwgdHlwZS5nZXRJbnF1aXJ5VVJMKCkpKTsKLSAgICAgICAgbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuUFVCTElTSF9VUkwsIHR5cGUuZ2V0UHVibGlzaFVSTCgpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChsYXVuY2hQcml2YXRlVURESUNoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKSkKLSAgICB7Ci0gICAgICBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IHByaXZhdGVSZWcgPSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgICBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSBwcml2YXRlVHlwZSA9IHByaXZhdGVSZWcuZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKTsKLSAgICAgIFN0cmluZ1tdIHByaXZhdGVJbnF1aXJ5VVJMID0gcHJpdmF0ZVR5cGUuZ2V0UHJpdmF0ZVVERElSZWdpc3RyeUlucXVpcnlBUEkoKTsKLSAgICAgIFN0cmluZ1tdIHByaXZhdGVQdWJsaXNoVVJMID0gcHJpdmF0ZVR5cGUuZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVB1Ymxpc2hBUEkoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJpdmF0ZUlucXVpcnlVUkwubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGxhdW5jaE9wdGlvblZlY3Rvci5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLklOUVVJUllfVVJMLCBwcml2YXRlSW5xdWlyeVVSTFtpXSkpOwotICAgICAgICBsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5QVUJMSVNIX1VSTCwgcHJpdmF0ZVB1Ymxpc2hVUkxbaV0pKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChMYXVuY2hPcHRpb25bXSkgbGF1bmNoT3B0aW9uVmVjdG9yLnRvQXJyYXkobmV3IExhdW5jaE9wdGlvblswXSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9TZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWNhMThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9TZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLldlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV2ViU2VydmljZUVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkhhbmRsZXJUYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci0KLS8qKgotICogU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQKLSAqIAotICogSW5pdGlhbGl6ZSBhbmQgbG9hZCB0aGUgaGFuZGxlcnMgZGF0YQotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NtZCB7Ci0KLSAgcHJpdmF0ZSBIYW5kbGVyVGFibGVJdGVtW10gaGFuZGxlcnNfOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0dlblNrZWxldG9uRW5hYmxlZF87Ci0gIHByaXZhdGUgSVBhdGggc291cmNlT3V0cHV0TG9jYXRpb25fOwotICBwcml2YXRlIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3c0Rlc2NyaXB0aW9uXzsKLSAgcHJpdmF0ZSBXc2RkUmVzb3VyY2Ugd3NkZFJlc291cmNlXzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc01hbmFnZXIgd2ViU2VydmljZXNNYW5hZ2VyXzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0XzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgd3NEZXNjVG9IYW5kbGVyc187Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHNlcnZpY2VEZXNjTmFtZVRvRGVzY09ial87Ci0gIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uTmFtZV8gPSBudWxsOwotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICB3ZWJTZXJ2aWNlc01hbmFnZXJfID0gbmV3IFdlYlNlcnZpY2VzTWFuYWdlcigpOwotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldEluaXRpYWxTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIpLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBwcm9jZXNzSGFuZGxlcnMoZW52KTsKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHByb2Nlc3NIYW5kbGVycyhFbnZpcm9ubWVudCBlbnYpIHsKLSAgICB0cnkgewotICAgICAgVmVjdG9yIGhhbmRsZXJzID0gbmV3IFZlY3RvcigpOwotICAgICAgd3NEZXNjVG9IYW5kbGVyc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICBzZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmpfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgCi0gICAgICBXZWJTZXJ2aWNlRWRpdE1vZGVsIHdzZWQgPSBnZXRXZWJTZXJ2aWNlRWRpdE1vZGVsKCk7Ci0gICAgICBpZiAod3NlZCA9PSBudWxsKQotICAgICAgICB3c2RkUmVzb3VyY2VfID0gZ2V0V3NkZFJlc291cmNlRnJvbVNlbGVjdGlvbigpOwotICAgICAgZWxzZQotICAgICAgICB3c2RkUmVzb3VyY2VfID0gd3NlZC5nZXRXZWJTZXJ2aWNlc1htbFJlc291cmNlKCk7Ci0KLSAgICAgIGlmICh3c2RkUmVzb3VyY2VfID09IG51bGwpIHsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIpLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0KLSAgICAgIFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzID0gd3NkZFJlc291cmNlXy5nZXRXZWJTZXJ2aWNlcygpOwotICAgICAgaWYgKHdlYlNlcnZpY2VzICE9IG51bGwpIHsKLSAgICAgICAgTGlzdCB3c0Rlc2NyaXB0aW9ucyA9IHdzZGRSZXNvdXJjZV8uZ2V0V2ViU2VydmljZXMoKS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NEZXNjcmlwdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQotICAgICAgICAgIHdzRGVzY3JpcHRpb25fID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgd3NEZXNjcmlwdGlvbnMuZ2V0KGkpOwotICAgICAgICAgIAotICAgICAgICAgIExpc3Qgd3NQb3J0Q29tcG9uZW50cyA9IHdzRGVzY3JpcHRpb25fLmdldFBvcnRDb21wb25lbnRzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB3c1BvcnRDb21wb25lbnRzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBQb3J0Q29tcG9uZW50IHdzUG9ydCA9IChQb3J0Q29tcG9uZW50KSB3c1BvcnRDb21wb25lbnRzLmdldChqKTsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZSA9IHdzUG9ydC5nZXRQb3J0Q29tcG9uZW50TmFtZSgpOwotICAgICAgICAgICAgTGlzdCB3c0hhbmRsZXJzID0gd3NQb3J0LmdldEhhbmRsZXJzKCk7Ci0gICAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtW10gaGFuZGxlckl0ZW1zID0gbmV3IEhhbmRsZXJUYWJsZUl0ZW1bd3NIYW5kbGVycy5zaXplKCldOyAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3c0hhbmRsZXJzLnNpemUoKTsgaysrKSB7Ci0KLSAgICAgICAgICAgICAgSGFuZGxlciB3c0hhbmRsZXIgPSAoSGFuZGxlcikgd3NIYW5kbGVycy5nZXQoayk7Ci0KLSAgICAgICAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBoYW5kbGVySXRlbSA9IG5ldyBIYW5kbGVyVGFibGVJdGVtKCk7Ci0gICAgICAgICAgICAgIGhhbmRsZXJJdGVtLnNldEhhbmRsZXIod3NIYW5kbGVyKTsKLSAgICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0SGFuZGxlck5hbWUod3NIYW5kbGVyLmdldEhhbmRsZXJOYW1lKCkpOwotICAgICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRIYW5kbGVyQ2xhc3NOYW1lKHdzSGFuZGxlci5nZXRIYW5kbGVyQ2xhc3MoKSk7Ci0gICAgICAgICAgICAgIGhhbmRsZXJJdGVtLnNldFBvcnQod3NQb3J0KTsKLSAgICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0UG9ydE5hbWUocG9ydE5hbWUpOwotICAgICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRXc0Rlc2NSZWYod3NEZXNjcmlwdGlvbl8pOwotICAgICAgICAgICAgICBoYW5kbGVySXRlbXNba10gPSBoYW5kbGVySXRlbTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVySXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgd3NEZXNjTmFtZSA9IHdzRGVzY3JpcHRpb25fLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKTsKLSAgICAgICAgICAgIHdzRGVzY1RvSGFuZGxlcnNfLnB1dCh3c0Rlc2NOYW1lLCBoYW5kbGVySXRlbXMpOwotICAgICAgICAgICAgc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXy5wdXQod3NEZXNjTmFtZSwgd3NEZXNjcmlwdGlvbl8pOwotICAgICAgICAgICAgCi0gICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGVyc18gPSAoSGFuZGxlclRhYmxlSXRlbVtdKSBoYW5kbGVycy50b0FycmF5KG5ldyBIYW5kbGVyVGFibGVJdGVtWzBdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwdWJsaWMgSGFuZGxlclRhYmxlSXRlbVtdIGdldEhhbmRsZXJzKCkgewotICAgIHJldHVybiB0aGlzLmhhbmRsZXJzXzsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzR2VuU2tlbGV0b25FbmFibGVkXy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEdlblNrZWxldG9uRW5hYmxlZCgpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNvdXJjZU91dHB1dExvY2F0aW9uXy4KLSAgICovCi0gIHB1YmxpYyBJUGF0aFtdIGdldFNvdXJjZU91dHB1dExvY2F0aW9uKCkgewotICAgIElQYXRoW10gbG9jYXRpb25zID0gbnVsbDsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCi0gICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgbG9jYXRpb25zID0gUmVzb3VyY2VVdGlscy5nZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKHByb2plY3QpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHByb2plY3QgPSBwcm9qZWN0XzsKLSAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgbG9jYXRpb25zID0gUmVzb3VyY2VVdGlscy5nZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKHByb2plY3QpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbG9jYXRpb25zOwotICB9Ci0KLSAgcHVibGljIFdzZGRSZXNvdXJjZSBnZXRXc2RkUmVzb3VyY2UoKSB7Ci0gICAgcmV0dXJuIHdzZGRSZXNvdXJjZV87Ci0gIH0KLQotICBwcml2YXRlIFdzZGRSZXNvdXJjZSBnZXRXc2RkUmVzb3VyY2VGcm9tU2VsZWN0aW9uKCkgewotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRTZWwgPSBnZXRJbml0aWFsU2VsZWN0aW9uKCk7Ci0gICAgaWYgKGluaXRTZWwgIT0gbnVsbCAmJiBpbml0U2VsLnNpemUoKSA9PSAxKSB7Ci0gICAgICBPYmplY3Qgb2JqID0gaW5pdFNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbCkgewotICAgICAgICAvLyBTZXJ2aWNlIG9iamVjdAotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgb2JqOwotICAgICAgICBkZXNjcmlwdGlvbk5hbWVfID0gc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICBwcm9qZWN0XyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChzZXJ2aWNlKTsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VzTWFuYWdlcl8uZ2V0V3NkZFJlc291cmNlKHNlcnZpY2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCkgewotICAgICAgICAvLyBXU0RMIHJlc291cmNlCi0gICAgICAgIFdTRExSZXNvdXJjZUltcGwgcmVzID0gKFdTRExSZXNvdXJjZUltcGwpIG9iajsKLSAgICAgICAgcHJvamVjdF8gPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVzKTsKLSAgICAgICAgTGlzdCB3c2RsUmVzb3VyY2VzID0gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRXU0RMU2VydmljZXMocmVzKTsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VzTWFuYWdlcl8uZ2V0V3NkZFJlc291cmNlKChTZXJ2aWNlKSB3c2RsUmVzb3VyY2VzLmdldCgwKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKSB7Ci0gICAgICAgIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgd3NuZ3QgPSAoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgb2JqOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSl3c25ndC5nZXRXc2RsU2VydmljZSgpOwotICAgICAgICBkZXNjcmlwdGlvbk5hbWVfID0gc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOyAgICAgICAgCi0gICAgICAgIHByb2plY3RfID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNlcnZpY2UpOwotICAgICAgICByZXR1cm4gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRXc2RkUmVzb3VyY2Uoc2VydmljZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotCi0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gZ2V0V3NEZXNjcmlwdGlvbigpIHsKLSAgICByZXR1cm4gd3NEZXNjcmlwdGlvbl87Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25OYW1lKCl7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uTmFtZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBIYXNodGFibGUgZ2V0V3NSZWZzVG9IYW5kbGVycygpewotICAgIHJldHVybiB3c0Rlc2NUb0hhbmRsZXJzXzsKLSAgfQotICAKLSAgcHVibGljIEhhc2h0YWJsZSBnZXRTZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmooKXsKLSAgICByZXR1cm4gdGhpcy5zZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmpfOwotICB9Ci0gIAotICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1NlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1YzVjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLmltcGwuV3NkZEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkhhbmRsZXJUYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5VXRpbGl0eTsKLQotLyoKLSAqIFByb3ZpZGUgYSB3YXkgdG8gZXh0ZXJuYWxpemUgdGhlIGVkaXRlZCBmaWVsZHMgYW5kIGNyZWF0ZSBuZXcgaGFuZGxlcnMKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotICBwcml2YXRlIExpc3QgaGFuZGxlclRhYmxlSXRlbXM7Ci0gIHByaXZhdGUgV2ViU2VydmljZURlc2NyaXB0aW9uIHdzRGVzY3JpcHRpb25fOwotICBwcml2YXRlIFdzZGRSZXNvdXJjZSB3c2RkUmVzb3VyY2VfOwotICBwcml2YXRlIEhhc2h0YWJsZSB3c0Rlc2NUb0hhbmRsZXJzXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXzsKLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0KLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgdHJ5IHsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSB3c0Rlc2NUb0hhbmRsZXJzXy5rZXlzKCk7Ci0gICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCi0gICAgICAgIEhhc2h0YWJsZSB3c1BvcnRzVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIEhhc2h0YWJsZSB3c1BvcnRUb0hhbmRsZXJUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgICAgICBTdHJpbmcgc2VydmljZURlc2NOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAvLyBsb2FkIFBvcnROYW1lIC0+IFBvcnRDb21wb25lbnQgdGFibGUKLSAgICAgICAgV2ViU2VydmljZURlc2NyaXB0aW9uIHdzRGVzY3JpcHRpb25fID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXy5nZXQoc2VydmljZURlc2NOYW1lKTsKLSAgICAgICAgaWYgKHdzRGVzY3JpcHRpb25fICE9IG51bGwpIHsKLQotICAgICAgICAgIExpc3Qgd3NQb3J0cyA9IHdzRGVzY3JpcHRpb25fLmdldFBvcnRDb21wb25lbnRzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3c1BvcnRzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICBQb3J0Q29tcG9uZW50IHBvcnQgPSAoUG9ydENvbXBvbmVudCkgd3NQb3J0cy5nZXQoayk7Ci0gICAgICAgICAgICB3c1BvcnRzVGFibGUucHV0KHBvcnQuZ2V0UG9ydENvbXBvbmVudE5hbWUoKSwgcG9ydCk7Ci0gICAgICAgICAgICB3c1BvcnRUb0hhbmRsZXJUYWJsZS5wdXQocG9ydC5nZXRQb3J0Q29tcG9uZW50TmFtZSgpLCBuZXcgQXJyYXlMaXN0KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgaGFuZGxlclRhYmxlSXRlbXMgPSAoTGlzdCkgd3NEZXNjVG9IYW5kbGVyc18uZ2V0KHNlcnZpY2VEZXNjTmFtZSk7Ci0gICAgICAgIGlmIChoYW5kbGVyVGFibGVJdGVtcyAhPSBudWxsKSB7Ci0KLSAgICAgICAgICBXc2RkRmFjdG9yeSB3c2RkRmFjdG9yeSA9IG5ldyBXc2RkRmFjdG9yeUltcGwoKTsKLQotICAgICAgICAgIC8vZm9ybSBwb3J0IGNvbXBvbmVudHMgdGFibGVzIGZpcnN0Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVyVGFibGVJdGVtcy5zaXplKCk7IGkrKykgewotCi0gICAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGh0aSA9IChIYW5kbGVyVGFibGVJdGVtKSBoYW5kbGVyVGFibGVJdGVtcy5nZXQoaSk7Ci0gICAgICAgICAgICBQb3J0Q29tcG9uZW50IHdzUG9ydCA9IChQb3J0Q29tcG9uZW50KSBodGkuZ2V0UG9ydCgpOwotICAgICAgICAgICAgaWYgKHdzUG9ydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIC8vZmluZCBpdAotICAgICAgICAgICAgICBpZiAod3NQb3J0c1RhYmxlLmdldChodGkuZ2V0UG9ydE5hbWUoKSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB3c1BvcnQgPSAoUG9ydENvbXBvbmVudCkgd3NQb3J0c1RhYmxlLmdldChodGkuZ2V0UG9ydE5hbWUoKSk7Ci0gICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBpdDsgc2hvdWxkIG5vdCBnZXQgaW50byBoZXJlCi0gICAgICAgICAgICAgICAgd3NQb3J0ID0gd3NkZEZhY3RvcnkuY3JlYXRlUG9ydENvbXBvbmVudCgpOwotICAgICAgICAgICAgICAgIHdzUG9ydC5zZXRQb3J0Q29tcG9uZW50TmFtZShodGkuZ2V0UG9ydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgd3NQb3J0c1RhYmxlLnB1dCh3c1BvcnQuZ2V0UG9ydENvbXBvbmVudE5hbWUoKSwgd3NQb3J0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3NQb3J0VG9IYW5kbGVyVGFibGUucHV0KHdzUG9ydC5nZXRQb3J0Q29tcG9uZW50TmFtZSgpLCBuZXcgQXJyYXlMaXN0KCkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIGZvcm0gSGFuZGxlciBhbmQgcG9ydHMgdGFibGUKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXJUYWJsZUl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0KLSAgICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaHRpID0gKEhhbmRsZXJUYWJsZUl0ZW0pIGhhbmRsZXJUYWJsZUl0ZW1zLmdldChpKTsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZSA9IGh0aS5nZXRQb3J0TmFtZSgpOwotCi0gICAgICAgICAgICBQb3J0Q29tcG9uZW50IHBvcnQgPSAoUG9ydENvbXBvbmVudCkgd3NQb3J0c1RhYmxlLmdldChwb3J0TmFtZSk7Ci0gICAgICAgICAgICBpZiAocG9ydCA9PSBudWxsKSByZXR1cm4gc3RhdHVzOwotCi0gICAgICAgICAgICBMaXN0IGV4aXN0aW5nSGFuZGxlcnMgPSBwb3J0LmdldEhhbmRsZXJzKCk7Ci0KLSAgICAgICAgICAgIE9iamVjdCBoYW5kbGVyID0gaHRpLmdldEhhbmRsZXIoKTsKLSAgICAgICAgICAgIGlmICghZXhpc3RpbmdIYW5kbGVycy5jb250YWlucyhoYW5kbGVyKSkgewotICAgICAgICAgICAgICAvLyBjcmVhdGUgaXQKLSAgICAgICAgICAgICAgSGFuZGxlciBuZXdIYW5kbGVyID0gd3NkZEZhY3RvcnkuY3JlYXRlSGFuZGxlcigpOwotICAgICAgICAgICAgICBuZXdIYW5kbGVyLnNldEhhbmRsZXJOYW1lKGh0aS5nZXRIYW5kbGVyTmFtZSgpKTsKLSAgICAgICAgICAgICAgbmV3SGFuZGxlci5zZXRIYW5kbGVyQ2xhc3MoaHRpLmdldEhhbmRsZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICgoTGlzdCkgd3NQb3J0VG9IYW5kbGVyVGFibGUuZ2V0KHBvcnROYW1lKSkuYWRkKG5ld0hhbmRsZXIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChoYW5kbGVyIGluc3RhbmNlb2YgSGFuZGxlcikgewotICAgICAgICAgICAgICAvLyBjbG9uZSBpdAotICAgICAgICAgICAgICBFdG9vbHNDb3B5VXRpbGl0eSBjb3B5VXRpbCA9IG5ldyBFdG9vbHNDb3B5VXRpbGl0eSgpOwotICAgICAgICAgICAgICBjb3B5VXRpbC5zZXRDb3B5QWRhcHRlcnModHJ1ZSk7Ci0gICAgICAgICAgICAgIEhhbmRsZXIgY2xvbmVkSGFuZGxlciA9IChIYW5kbGVyKSBjb3B5VXRpbC5jb3B5KChIYW5kbGVyKSBoYW5kbGVyKTsKLSAgICAgICAgICAgICAgKChMaXN0KSB3c1BvcnRUb0hhbmRsZXJUYWJsZS5nZXQocG9ydE5hbWUpKS5hZGQoY2xvbmVkSGFuZGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgZXhpc3RpbmcgaGFuZGxlcnMgZnJvbSBwb3J0cwotICAgICAgICByZW1vdmVFeGlzdGluZ0hhbmRsZXJzKHdzUG9ydHNUYWJsZSwgd3NQb3J0VG9IYW5kbGVyVGFibGUpOwotCi0gICAgICAgIC8vIGFkZCBwb3J0cyB0byB3c0Rlc2NyaXB0aW9uCi0gICAgICAgIGFkZFBvcnRzVG9EZXNjcmlwdGlvbnMod3NQb3J0c1RhYmxlLCB3c0Rlc2NyaXB0aW9uXyk7Ci0KLSAgICAgICAgLy8gYWRkIGhhbmRsZXJzIHRvIHBvcnRzCi0gICAgICAgIGFkZEhhbmRsZXJzVG9Qb3J0cyh3c1BvcnRzVGFibGUsIHdzUG9ydFRvSGFuZGxlclRhYmxlKTsKLSAgICAgIH0KLSAgICAgIGlmICh3c2RkUmVzb3VyY2VfICE9IG51bGwpIHsKLSAgICAgICAgd3NkZFJlc291cmNlXy5zYXZlKG5ldyBIYXNoTWFwKCkpOwotICAgICAgfQotCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgLy9zdGF0dXMgPSBuZXcKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVtb3ZlRXhpc3RpbmdIYW5kbGVycyhIYXNodGFibGUgcG9ydHNUYWJsZSwgSGFzaHRhYmxlIHBvcnRzVG9IYW5kbGVyc1RhYmxlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGludCBrZXkgPSAwOwotICAgICAgRW51bWVyYXRpb24gcG9ydHMgPSBwb3J0c1RvSGFuZGxlcnNUYWJsZS5rZXlzKCk7Ci0gICAgICB3aGlsZSAocG9ydHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgU3RyaW5nIHBvcnROYW1lID0gKFN0cmluZykgcG9ydHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IHBvcnQgPSBwb3J0c1RhYmxlLmdldChwb3J0TmFtZSk7Ci0gICAgICAgIGlmIChwb3J0ICE9IG51bGwgJiYgcG9ydCBpbnN0YW5jZW9mIFBvcnRDb21wb25lbnQpIHsKLSAgICAgICAgICBMaXN0IGhhbmRsZXJzID0gKChQb3J0Q29tcG9uZW50KSBwb3J0KS5nZXRIYW5kbGVycygpOwotICAgICAgICAgIGhhbmRsZXJzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRQb3J0c1RvRGVzY3JpcHRpb25zKEhhc2h0YWJsZSBwb3J0c1RhYmxlLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjcmlwdGlvbl8pIHsKLSAgICB0cnkgewotICAgICAgRW51bWVyYXRpb24gcG9ydHMgPSBwb3J0c1RhYmxlLmtleXMoKTsKLSAgICAgIHdoaWxlIChwb3J0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSAoU3RyaW5nKSBwb3J0cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAvLyBuZXdseSBlZGl0ZWQgcG9ydAotICAgICAgICBPYmplY3QgcG9ydCA9IHBvcnRzVGFibGUuZ2V0KHBvcnROYW1lKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGV4aXN0aW5nIHBvcnQKLSAgICAgICAgTGlzdCBlbWZQb3J0cyA9IHdzRGVzY3JpcHRpb25fLmdldFBvcnRDb21wb25lbnRzKCk7Ci0gICAgICAgIGlmICghZW1mUG9ydHMuY29udGFpbnMocG9ydCkgJiYgcG9ydCAhPSBudWxsICYmIHBvcnQgaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50KSB7Ci0gICAgICAgICAgZW1mUG9ydHMuYWRkKChQb3J0Q29tcG9uZW50KSBwb3J0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkSGFuZGxlcnNUb1BvcnRzKEhhc2h0YWJsZSBwb3J0c1RhYmxlLCBIYXNodGFibGUgcG9ydHNUb0hhbmRsZXJzVGFibGUpIHsKLSAgICB0cnkgewotICAgICAgaW50IGtleSA9IDA7Ci0gICAgICBFbnVtZXJhdGlvbiBwb3J0cyA9IHBvcnRzVG9IYW5kbGVyc1RhYmxlLmtleXMoKTsKLSAgICAgIHdoaWxlIChwb3J0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSAoU3RyaW5nKSBwb3J0cy5uZXh0RWxlbWVudCgpOwotICAgICAgICBPYmplY3QgcG9ydCA9IHBvcnRzVGFibGUuZ2V0KHBvcnROYW1lKTsKLSAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCAmJiBwb3J0IGluc3RhbmNlb2YgUG9ydENvbXBvbmVudCkgewotICAgICAgICAgIExpc3QgaGFuZGxlcnMgPSAoTGlzdCkgcG9ydHNUb0hhbmRsZXJzVGFibGUuZ2V0KHBvcnROYW1lKTsKLQotICAgICAgICAgIExpc3QgbW9kZWxIYW5kbGVycyA9ICgoUG9ydENvbXBvbmVudCkgcG9ydCkuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICBtb2RlbEhhbmRsZXJzLmFkZEFsbChoYW5kbGVycyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gaGFuZGxlclRhYmxlSXRlbXMKLSAgICogICAgICAgICAgVGhlIGhhbmRsZXJUYWJsZUl0ZW1zIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJzTGlzdChMaXN0IGhhbmRsZXJUYWJsZUl0ZW1zKSB7Ci0gICAgdGhpcy5oYW5kbGVyVGFibGVJdGVtcyA9IGhhbmRsZXJUYWJsZUl0ZW1zOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V3NEZXNjVG9IYW5kbGVycyhIYXNodGFibGUgd3NEZXNjVG9IYW5kbGVycykgewotICAgIHRoaXMud3NEZXNjVG9IYW5kbGVyc18gPSB3c0Rlc2NUb0hhbmRsZXJzOwotICB9Ci0KLS8vICBwdWJsaWMgdm9pZCBzZXRXc0Rlc2NyaXB0aW9uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3c0Rlc2MpIHsKLS8vICAgIHRoaXMud3NEZXNjcmlwdGlvbl8gPSB3c0Rlc2M7Ci0vLyAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdzZGRSZXNvdXJjZShXc2RkUmVzb3VyY2Ugd3NkZFJlcykgewotICAgIHRoaXMud3NkZFJlc291cmNlXyA9IHdzZGRSZXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmooSGFzaHRhYmxlIHNlcnZpY2VEZXNjTmFtZVRvRGVzY09iaikgewotICAgIHRoaXMuc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXyA9IHNlcnZpY2VEZXNjTmFtZVRvRGVzY09iajsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9UYWJsZVZpZXdlcldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1RhYmxlVmlld2VyV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZDgxNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1RhYmxlVmlld2VyV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLlByb3BlcnRpZXNSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nLkRpYWxvZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBUYWJsZVZpZXdlcldpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIGludCBERUZBVUxUX1RBQkxFX0hFSUdIVF9ISU5UID0gMTAwOwotICBwcml2YXRlIGludCBERUZBVUxUX0NPTFVNTl9XSURUSCA9IDgwOwotCi0gIHB1YmxpYyBzdGF0aWMgYnl0ZSBNQVBfT05FX1RPX09ORSA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgYnl0ZSBNQVBfTUFOWV9UT19PTkUgPSAxOwotICBwdWJsaWMgc3RhdGljIGJ5dGUgTUFQX01BTllfVE9fTUFOWSA9IDA7Ci0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5zXzsKLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcl87Ci0gIHByaXZhdGUgVGFibGUgdGFibGVfOwotICBwcml2YXRlIFRhYmxlRWRpdG9yIGVkaXRvcl87Ci0gIHByaXZhdGUgVGFibGVFZGl0b3JMaXN0ZW5lciB0YWJsZUVkaXRvckxpc3RlbmVyXzsKLSAgcHJpdmF0ZSBUZXh0IHRleHRfOwotICBwcml2YXRlIEJ1dHRvbiBpbXBvcnRfOwotICBwcml2YXRlIEJ1dHRvbiBhZGRfOwotICBwcml2YXRlIEJ1dHRvbiByZW1vdmVfOwotICAKLSAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50XzsKLSAgcHJpdmF0ZSBMaXN0ZW5lciAgc3RhdHVzTGlzdGVuZXJfOwotCi0gIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotICBwcml2YXRlIGJ5dGUgcmVzY3JpY3Rpb24gPSBNQVBfTUFOWV9UT19NQU5ZOwotCi0gIHByaXZhdGUgTGlzdCB2YWx1ZXNfOwotICBwcml2YXRlIE9iamVjdCBkZWZhdWx0VmFsdWVfOwotCi0gIHByaXZhdGUgUHJvcGVydGllc1Jlc291cmNlRmlsdGVyIGZpbHRlcl8gPSBuZXcgUHJvcGVydGllc1Jlc291cmNlRmlsdGVyKCk7Ci0KLSAgcHVibGljIFRhYmxlVmlld2VyV2lkZ2V0KFN0cmluZ1tdIGNvbHVtbnMsIExpc3QgaW5pdFZhbHVlcywgT2JqZWN0IGRlZmF1bHRWYWx1ZSwgYnl0ZSByZXNjcmljdGlvbikKLSAgewotCWNvbHVtbnNfID0gY29sdW1uczsKLQl2YWx1ZXNfID0gbmV3IEFycmF5TGlzdCgpOwotCWlmIChpbml0VmFsdWVzICE9IG51bGwgJiYgaW5pdFZhbHVlcy5zaXplKCkgPiAwKQotCSAgdmFsdWVzXy5hZGRBbGwoaW5pdFZhbHVlcyk7Ci0JZGVmYXVsdFZhbHVlXyA9IChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiBuZXcgU3RyaW5nKCIiKTsKLQl0aGlzLnJlc2NyaWN0aW9uID0gcmVzY3JpY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7IAotICAgIHBhcmVudF8gICAgICAgICA9IHBhcmVudDsKLSAgICBzdGF0dXNMaXN0ZW5lcl8gPSBzdGF0dXNMaXN0ZW5lcjsKLSAgICAKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotCUNvbXBvc2l0ZSAgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQlHcmlkTGF5b3V0IGdsICAgICAgICA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCi0JZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLQlnbC5tYXJnaW5XaWR0aCA9IDA7Ci0JY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0JY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JdGFibGVfID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JZ2QuaGVpZ2h0SGludCA9IERFRkFVTFRfVEFCTEVfSEVJR0hUX0hJTlQ7Ci0JdGFibGVfLnNldExheW91dERhdGEoZ2QpOwotCXRhYmxlXy5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlXy5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQlpbnQgbWF4V2lkdGggPSBERUZBVUxUX0NPTFVNTl9XSURUSDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNfLmxlbmd0aDsgaSsrKQotCXsKLQkgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlXywgU1dULk5PTkUpOwotCSAgdGFibGVDb2x1bW4uc2V0VGV4dChjb2x1bW5zX1tpXSk7Ci0JICB0YWJsZUNvbHVtbi5wYWNrKCk7Ci0JICBpbnQgdGFibGVDb2x1bW5XaWR0aCA9IE1hdGgubWF4KERFRkFVTFRfQ09MVU1OX1dJRFRILCB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpKTsKLQkgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIHRhYmxlQ29sdW1uV2lkdGgpOwotCSAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5EYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEodGFibGVDb2x1bW5XaWR0aCwgdGFibGVDb2x1bW5XaWR0aCwgdHJ1ZSk7Ci0JICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbkRhdGEpOwotCX0KLQl0YWJsZV8uc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkvLyBpbml0aWFsaXplIHRoZSB0YWJsZSBlZGl0b3IKLQllZGl0b3JfID0gbmV3IFRhYmxlRWRpdG9yKHRhYmxlXyk7Ci0JLy8gVGhlIGVkaXRvciBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgY2VsbCBhbmQgbXVzdAotCS8vIG5vdCBiZSBhbnkgc21hbGxlciB0aGFuIDUwIHBpeGVscy4KLQllZGl0b3JfLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQllZGl0b3JfLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQllZGl0b3JfLm1pbmltdW1XaWR0aCA9IG1heFdpZHRoOwotCXRhYmxlRWRpdG9yTGlzdGVuZXJfID0gbmV3IFRhYmxlRWRpdG9yTGlzdGVuZXIoKTsKLQl0YWJsZV8uYWRkTW91c2VMaXN0ZW5lcih0YWJsZUVkaXRvckxpc3RlbmVyXyk7Ci0JdGFibGVWaWV3ZXJfID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlXyk7Ci0JdGFibGVWaWV3ZXJfLmdldENvbnRyb2woKS5hZGRLZXlMaXN0ZW5lcigKLQkgIG5ldyBLZXlMaXN0ZW5lcigpCi0JICB7Ci0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkKLQkJewotCQkgIGludCBhc2NpaURlbCA9IChpbnQpZS5jaGFyYWN0ZXI7Ci0JCSAgLy8gRGVsCi0JCSAgaWYgKGFzY2lpRGVsID09IDEyNykgCi0JCQloYW5kbGVEZWxldGVLZXlQcmVzc2VkKCk7Ci0gICAgICAgICAgICAgICAgLy8gRW50ZXIgb3Igc3BhY2UKLSAgICAgICAgICAgICAgICBpZiAoKChpbnQpZS5jaGFyYWN0ZXIpID09IDEzIHx8ICgoaW50KWUuY2hhcmFjdGVyKSA9PSAzMikKLSAgICAgICAgICAgICAgICAgIHRhYmxlRWRpdG9yTGlzdGVuZXJfLmVkaXRTZWxlY3Rpb24oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKQotCQl7Ci0JCX0KLQkgIH0KLQkpOwotCXRhYmxlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IExpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0JdGFibGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IExpc3RMYWJlbFByb3ZpZGVyKCkpOwotCXRhYmxlVmlld2VyXy5zZXRJbnB1dCh2YWx1ZXNfKTsKLQl0YWJsZVZpZXdlcl8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCSAgbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotCSAgewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJewotCQkgIGVuYWJsZVJlbW92ZSh0cnVlKTsKLQkJfQotCSAgfQotCSk7Ci0KLQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JZ2wubnVtQ29sdW1ucyA9IDM7Ci0JZ2wubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCWltcG9ydF8gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWltcG9ydF8uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9JTVBPUlQiKSk7Ci0JaW1wb3J0Xy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQlpbXBvcnRfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCSAgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLQkgIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0JCXsKLQkJICBoYW5kbGVJbXBvcnRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotCQl7Ci0JCX0KLQkgIH0KLQkpOwotCQotCWFkZF8gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWFkZF8uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9BREQiKSk7Ci0JYWRkXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQlhZGRfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCSAgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLQkgIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0JCXsKLQkJICBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotCQl7Ci0JCX0KLQkgIH0KLQkpOwotCi0JCi0JcmVtb3ZlXyA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JcmVtb3ZlXy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkxBQkVMX1JFTU9WRSIpKTsKLQlyZW1vdmVfLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCXJlbW92ZV8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JICBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotCSAgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLQkJewotCQkgIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0JCXsKLQkJfQotCSAgfQotCSk7Ci0JZW5hYmxlUmVtb3ZlKGZhbHNlKTsKLQkKLQlyZXR1cm4gdGhpczsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBlbmFibGVSZW1vdmUoYm9vbGVhbiBlbmFibGVkKQotICB7Ci0JcmVtb3ZlXy5zZXRFbmFibGVkKGVuYWJsZWQgJiYgIXRhYmxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUltcG9ydEJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0JSVJlc291cmNlIHJlc291cmNlID0gRGlhbG9nVXRpbHMuYnJvd3NlUmVzb3VyY2VzKAotCSAgcGFyZW50Xy5nZXRTaGVsbCgpLAotCSAgUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCksCi0JICBudWxsLAotCSAgZmlsdGVyXwotCSk7Ci0JaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLQl7Ci0JICB0cnkKLQkgIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXByb3BzLmxvYWQoKChJRmlsZSlyZXNvdXJjZSkuZ2V0Q29udGVudHMoKSk7Ci0JCVNldCBzZXQgPSBwcm9wcy5lbnRyeVNldCgpOwotCQlqYXZhLnV0aWwuTGlzdCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJSXRlcmF0b3IgaSA9IHNldC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpCi0JCXsKLQkJICBNYXAuRW50cnkgbWUgPSAoTWFwLkVudHJ5KWkubmV4dCgpOwotCQkgIFN0cmluZyBrZXkgPSAoU3RyaW5nKW1lLmdldEtleSgpOwotCQkgIFN0cmluZyB2YWwgPSAoU3RyaW5nKW1lLmdldFZhbHVlKCk7Ci0JCSAgbGlzdC5hZGQobmV3IFN0cmluZ1tdIHtrZXksdmFsfSk7Ci0JCX0KLQkJdmFsdWVzXy5hZGRBbGwobGlzdCk7Ci0JICB9Ci0JICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICB7Ci0JICAgIC8vIFRPRE8gUmVwb3J0IHNvbWUgZXJyb3IgaGVyZS4KLQkgIH0KLQl9Ci0JcmVmcmVzaCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFkZEJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0JdmFsdWVzXy5hZGQoZGVmYXVsdFZhbHVlXyk7Ci0JcmVmcmVzaCgpOwotCXNldFNlbGVjdGlvbkFzT2JqZWN0KHZhbHVlc18uZ2V0KHRhYmxlXy5nZXRJdGVtQ291bnQoKS0xKSk7Ci0JdGFibGVFZGl0b3JMaXN0ZW5lcl8uZWRpdFNlbGVjdGlvbigpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0JaGFuZGxlRGVsZXRlS2V5UHJlc3NlZCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKQotICB7Ci0JaW50ZXJuYWxEaXNwb3NlKCk7Ci0JSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0JaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JewotCSAgaW50IHNlbGVjdGlvbkluZGV4ID0gdGFibGVfLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JICBpbnQgc2VsZWN0aW9uQ291bnQgPSB0YWJsZV8uZ2V0SXRlbUNvdW50KCk7Ci0JICB2YWx1ZXNfLnJlbW92ZShzZWxlY3Rpb25JbmRleCk7Ci0JICBpZiAoc2VsZWN0aW9uSW5kZXggPCBzZWxlY3Rpb25Db3VudC0xKQotCQlzZXRTZWxlY3Rpb25Bc09iamVjdCh2YWx1ZXNfLmdldChzZWxlY3Rpb25JbmRleCkpOwotCSAgZWxzZSBpZiAoc2VsZWN0aW9uQ291bnQgLTIgPj0gMCkKLQkJc2V0U2VsZWN0aW9uQXNPYmplY3QodmFsdWVzXy5nZXQoc2VsZWN0aW9uQ291bnQtMikpOwotCSAgcmVmcmVzaCgpOwotCX0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbnRlcm5hbFJlZnJlc2goKQotICB7Ci0JLy8gc3luY2hyb25pemUgdGV4dCBmaWVsZCwgcHJldmlvdXNseSBzZWxlY3RlZCB0YWJsZSBjZWxsIGFuZCBtb2RlbCAoaW5wdXRPYmplY3QpCi0JaWYgKHRleHRfICE9IG51bGwpCi0JewotCSAgVGFibGVJdGVtIG9sZFRhYmxlSXRlbSA9IGVkaXRvcl8uZ2V0SXRlbSgpOwotCSAgaW50IG9sZENvbHVtbkluZGV4ID0gZWRpdG9yXy5nZXRDb2x1bW4oKTsKLQkgIGlmIChvbGRUYWJsZUl0ZW0gIT0gbnVsbCAmJiBvbGRDb2x1bW5JbmRleCA+PSAwICYmIG9sZENvbHVtbkluZGV4IDwgY29sdW1uc18ubGVuZ3RoKQotCSAgewotCQlTdHJpbmcgb2xkVGV4dCA9IHRleHRfLmdldFRleHQoKTsKLQkJb2xkVGFibGVJdGVtLnNldFRleHQob2xkQ29sdW1uSW5kZXgsIG9sZFRleHQpOwotCQlpbnQgb2xkUm93SW5kZXggPSB0YWJsZV8uaW5kZXhPZihvbGRUYWJsZUl0ZW0pOwotCQl2YWx1ZXNfLnNldChvbGRSb3dJbmRleCwgbmV3IFN0cmluZ1tdIHtvbGRUYWJsZUl0ZW0uZ2V0VGV4dCgwKSwgb2xkVGFibGVJdGVtLmdldFRleHQoMSl9KTsKLQkgIH0KLQl9Ci0JY2hlY2tNYXBwaW5nQ29uc3RyYWludHMoKTsKLQlzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQoIG51bGwgKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjaGVja01hcHBpbmdDb25zdHJhaW50cygpIHsKLQotCUhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotCWZvcihpbnQgY250PTA7IGNudDx2YWx1ZXNfLnNpemUoKTsgY250KyspewotCQlTdHJpbmdbXSB2YWx1ZSA9IChTdHJpbmdbXSl2YWx1ZXNfLmdldChjbnQpOwotCQlpZihtYXAuY29udGFpbnNLZXkodmFsdWVbMF0pICYmICgocmVzY3JpY3Rpb24gJiAxKSE9MCkpewotCQkJbWVzc2FnZSA9IG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19NQVBQSU5HX0RVUExJQ0FURV9FTlRSSUVTIiwgbmV3IFN0cmluZ1tde2NvbHVtbnNfWzBdLGNvbHVtbnNfWzFdfSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYobWFwLmNvbnRhaW5zVmFsdWUodmFsdWVbMV0pICYmICgocmVzY3JpY3Rpb24gJiAyKSE9MCkpewotCQkJbWVzc2FnZSA9IG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19NQVBQSU5HX0RVUExJQ0FURV9FTlRSSUVTIiwgbmV3IFN0cmluZ1tde2NvbHVtbnNfWzFdLGNvbHVtbnNfWzBdfSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbWFwLnB1dCh2YWx1ZVswXSx2YWx1ZVsxXSk7Ci0KLQl9Ci0JbWVzc2FnZSA9IG51bGw7Ci0KLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlID09IG51bGwgPyBuZXcgU2ltcGxlU3RhdHVzKCIiKSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgbWVzc2FnZSwgU3RhdHVzLkVSUk9SICk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uQXNPYmplY3QoT2JqZWN0IG9iamVjdCkKLSAgewotCXRhYmxlVmlld2VyXy5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotCWludGVybmFsUmVmcmVzaCgpOwotCXRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgVGFibGVJdGVtW10gZ2V0SXRlbXMoKQotICB7Ci0JLy9pbnRlcm5hbFJlZnJlc2goKTsKLQlyZXR1cm4gdGFibGVfLmdldEl0ZW1zKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKLSAgewotCWFkZF8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQllbmFibGVSZW1vdmUoZW5hYmxlZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotCWludGVybmFsRGlzcG9zZSgpOwotCWlmIChlZGl0b3JfICE9IG51bGwpCi0JICBlZGl0b3JfLmRpc3Bvc2UoKTsKLQlpZiAodGFibGVfICE9IG51bGwpCi0JICB0YWJsZV8uZGlzcG9zZSgpOwotCWlmIChhZGRfICE9IG51bGwpCi0JICBhZGRfLmRpc3Bvc2UoKTsKLQlpZiAocmVtb3ZlXyAhPSBudWxsKQotCSAgcmVtb3ZlXy5kaXNwb3NlKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW50ZXJuYWxEaXNwb3NlKCkKLSAgewotCWlmICh0ZXh0XyAhPSBudWxsKQotCSAgdGV4dF8uZGlzcG9zZSgpOwotCXRleHRfID0gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBUYWJsZUVkaXRvckxpc3RlbmVyIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lcgotICB7Ci0JcHJpdmF0ZSBpbnQgY3VyclNlbGVjdGlvbkluZGV4XzsKLSAgICBwcml2YXRlIGludCBlZGl0Um93XzsKLSAgICBwcml2YXRlIGludCBlZGl0Q29sdW1uXzsKLQotCXB1YmxpYyBUYWJsZUVkaXRvckxpc3RlbmVyKCkKLQl7Ci0JICBzdXBlcigpOwotCSAgY3VyclNlbGVjdGlvbkluZGV4XyA9IC0xOwotICAgICAgICAgZWRpdFJvd18gPSAtMTsKLSAgICAgICAgIGVkaXRDb2x1bW5fID0gLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpCi0JewotCSAgbW91c2VEb3duKGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpCi0JewotCSAgLy8gcmVmcmVzaCB0YWJsZQotCSAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0JICAvLyBDbGVhbiB1cCBwcmV2aW91cyB0ZXh0IGVkaXRvciBjb250cm9sCi0JICBpbnRlcm5hbERpc3Bvc2UoKTsKLQkgIC8vIHVwZGF0ZSB0YWJsZQotCSAgaWYgKHRhYmxlXy5pc0ZvY3VzQ29udHJvbCgpKQotCSAgewotCQlpbnQgc2VsZWN0ZWRSb3dJbmRleCA9IGdldFNlbGVjdGVkUm93KHRhYmxlXywgZS55KTsKLQkJaWYgKGN1cnJTZWxlY3Rpb25JbmRleF8gIT0gLTEgJiYgc2VsZWN0ZWRSb3dJbmRleCAhPSAtMSAmJiBjdXJyU2VsZWN0aW9uSW5kZXhfID09IHNlbGVjdGVkUm93SW5kZXgpCi0JCXsKLQkJICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGVfLmdldEl0ZW0oc2VsZWN0ZWRSb3dJbmRleCk7Ci0JCSAgaW50IHNlbGVjdGVkQ29sdW1uSW5kZXggPSBnZXRTZWxlY3RlZENvbHVtbih0YWJsZUl0ZW0sIGUueCwgZS55KTsKLQkJICBpZiAoc2VsZWN0ZWRDb2x1bW5JbmRleCAhPSAtMSAmJiAodGV4dF8gPT0gbnVsbCB8fCB0ZXh0Xy5pc0Rpc3Bvc2VkKCkgfHwgc2VsZWN0ZWRDb2x1bW5JbmRleCAhPSBlZGl0b3JfLmdldENvbHVtbigpKSkKLQkJCWVkaXRTZWxlY3Rpb24oc2VsZWN0ZWRSb3dJbmRleCwgc2VsZWN0ZWRDb2x1bW5JbmRleCk7Ci0JCX0KLQkJY3VyclNlbGVjdGlvbkluZGV4XyA9IHNlbGVjdGVkUm93SW5kZXg7Ci0JICB9Ci0JfQotCi0JcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpCi0JewotCX0KLQotCXByaXZhdGUgaW50IGdldFNlbGVjdGVkUm93KFRhYmxlIHRhYmxlLCBpbnQgeSkKLQl7Ci0JICBUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVJdGVtcy5sZW5ndGg7IGkrKykKLQkgIHsKLQkJUmVjdGFuZ2xlIHJlY3RhbmdsZSA9IHRhYmxlSXRlbXNbaV0uZ2V0Qm91bmRzKDApOwotCQlpZiAocmVjdGFuZ2xlICE9IG51bGwgJiYgeSA+PSByZWN0YW5nbGUueSAmJiB5IDwgKHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodCkpCi0JCSAgcmV0dXJuIGk7Ci0JICB9Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0U2VsZWN0ZWRDb2x1bW4oVGFibGVJdGVtIHRhYmxlSXRlbSwgaW50IHgsIGludCB5KQotCXsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc18ubGVuZ3RoOyBpKyspCi0JICB7Ci0JCWlmICh0YWJsZUl0ZW0uZ2V0Qm91bmRzKGkpLmNvbnRhaW5zKHgsIHkpKQotCQkgIHJldHVybiBpOwotCSAgfQotCSAgcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0U2VsZWN0aW9uKGludCByb3csIGludCBjb2x1bW4pCi0JewotICAgICAgICAgZWRpdFJvd18gPSByb3c7Ci0gICAgICAgICBlZGl0Q29sdW1uXyA9IGNvbHVtbjsKLQkgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZV8uZ2V0SXRlbShyb3cpOwotCSAgLy8gU2V0dXAgYWRhcHRlciBmb3IgdGhlIG5ldyBzZWxlY3Rpb24KLQkgIHRleHRfID0gbmV3IFRleHQodGFibGVfLCBTV1QuTk9ORSk7Ci0JICBTdHJpbmcgdGV4dCA9IHRhYmxlSXRlbS5nZXRUZXh0KGNvbHVtbik7Ci0JICB0ZXh0Xy5zZXRUZXh0KCh0ZXh0ICE9IG51bGwpID8gdGV4dCA6ICIiKTsKLSAgICAgICAgIHRleHRfLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLy8gRXNjCi0gICAgICAgICAgICAgICBpZiAoKChpbnQpZS5jaGFyYWN0ZXIpID09IDI3KQotICAgICAgICAgICAgICAgICBjYW5jZWxTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICApOwotICAgICAgICAgdGV4dF8uYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQpCi0gICAgICAgICAgICAgICAgIHRyYXZlcnNlVGFiTmV4dCgpOwotICAgICAgICAgICAgICAgZWxzZSBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykKLSAgICAgICAgICAgICAgICAgdHJhdmVyc2VUYWJQcmV2aW91cygpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICAgKTsKLQkgIGVkaXRvcl8uc2V0RWRpdG9yKHRleHRfLCB0YWJsZUl0ZW0sIGNvbHVtbik7Ci0JICB0ZXh0Xy5zZXRGb2N1cygpOwotCSAgdGV4dF8uc2VsZWN0QWxsKCk7Ci0JfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdHJhdmVyc2VUYWJOZXh0KCkKLSAgICB7Ci0gICAgICBpbnRlcm5hbFJlZnJlc2goKTsKLSAgICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgICAgaWYgKCEoZWRpdFJvd18gPT0gdGFibGVfLmdldEl0ZW1zKCkubGVuZ3RoLTEgJiYgZWRpdENvbHVtbl8gPT0gY29sdW1uc18ubGVuZ3RoLTEpKQotICAgICAgewotICAgICAgICBpZiAoZWRpdENvbHVtbl8gPCBjb2x1bW5zXy5sZW5ndGgtMSkKLSAgICAgICAgICBlZGl0Q29sdW1uXysrOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0Q29sdW1uXyA9IDA7Ci0gICAgICAgICAgZWRpdFJvd18rKzsKLSAgICAgICAgICB0YWJsZV8uc2VsZWN0KGVkaXRSb3dfKTsKLSAgICAgICAgfQotICAgICAgICBlZGl0U2VsZWN0aW9uKGVkaXRSb3dfLCBlZGl0Q29sdW1uXyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdHJhdmVyc2VUYWJQcmV2aW91cygpCi0gICAgewotICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICAgIGlmICghKGVkaXRSb3dfID09IDAgJiYgZWRpdENvbHVtbl8gPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChlZGl0Q29sdW1uXyA+IDApCi0gICAgICAgICAgZWRpdENvbHVtbl8tLTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdENvbHVtbl8gPSBjb2x1bW5zXy5sZW5ndGgtMTsKLSAgICAgICAgICBlZGl0Um93Xy0tOwotICAgICAgICAgIHRhYmxlXy5zZWxlY3QoZWRpdFJvd18pOwotICAgICAgICB9Ci0gICAgICAgIGVkaXRTZWxlY3Rpb24oZWRpdFJvd18sIGVkaXRDb2x1bW5fKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxTZWxlY3Rpb24oKQotICAgIHsKLSAgICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgZWRpdFNlbGVjdGlvbigpCi0JewotCSAgaW50IHNlbGVjdGVkUm93SW5kZXggPSB0YWJsZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkgIGlmIChzZWxlY3RlZFJvd0luZGV4ICE9IC0xICYmIGNvbHVtbnNfLmxlbmd0aCA+IDApCi0JICB7Ci0JCS8vIHJlZnJlc2ggdGFibGUKLQkJaW50ZXJuYWxSZWZyZXNoKCk7Ci0JCS8vIENsZWFuIHVwIGFueSBwcmV2aW91cyBlZGl0b3IgY29udHJvbAotCQlpbnRlcm5hbERpc3Bvc2UoKTsKLQkJZWRpdFNlbGVjdGlvbihzZWxlY3RlZFJvd0luZGV4LCAwKTsKLQkgIH0KLQkgIGN1cnJTZWxlY3Rpb25JbmRleF8gPSBzZWxlY3RlZFJvd0luZGV4OwotCX0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JewotCSAgdGFibGVWaWV3ZXJfLmFkZChnZXRFbGVtZW50cyhuZXdJbnB1dCkpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotCXsKLQkgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KQotCSAgewotCQlMaXN0IGxpc3QgPSAoTGlzdClpbnB1dEVsZW1lbnQ7Ci0JCU9iamVjdFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0W2xpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKQotCQkgIG9iamVjdHNbaV0gPSBsaXN0LmdldChpKTsKLQkJcmV0dXJuIG9iamVjdHM7Ci0JICB9Ci0JICBlbHNlCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLSAgewotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCXsKLQkgIHJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCXsKLQkJcmV0dXJuICgoU3RyaW5nW10pZWxlbWVudClbY29sdW1uSW5kZXhdOwkgIAkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQl7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JfQotICB9Ci0gfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4NWNlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWwuRGlhbG9nV1dXQXV0aGVudGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCBpbXBsZW1lbnRzIENvbmRpdGlvbgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF87Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZVVSSTsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotICBwcml2YXRlIFN0cmluZyBodHRwQmFzaWNBdXRoUGFzc3dvcmQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBuZWVkV1NETFNlbGVjdGlvblRyZWVXaWRnZXQ7Ci0gIAotICBwdWJsaWMgV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQoKQotICB7Ci0gICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgCWlmICh3ZWJTZXJ2aWNlc1BhcnNlciA9PSBudWxsKQotICAJICB3ZWJTZXJ2aWNlc1BhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAJcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAluZWVkV1NETFNlbGVjdGlvblRyZWVXaWRnZXQgPSBmYWxzZTsKLSAgCVdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlciA9IGdldFdlYlNlcnZpY2VzUGFyc2VyKCk7Ci0gIAlwYXJzZXIuc2V0VVJJKHdlYlNlcnZpY2VVUkkpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHBhcnNlci5wYXJzZShXZWJTZXJ2aWNlc1BhcnNlci5QQVJTRV9XU0lMIHwgV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfRElTQ08gfCBXZWJTZXJ2aWNlc1BhcnNlci5QQVJTRV9MSU5LUyk7Ci0gICAgfQotICAgIGNhdGNoIChXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB3d3dhZSkKLSAgICB7Ci0gICAgICBEaWFsb2dXV1dBdXRoZW50aWNhdGlvbiBkaWFsb2cgPSBuZXcgRGlhbG9nV1dXQXV0aGVudGljYXRpb24oUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLSAgICAgIGRpYWxvZy5oYW5kbGVXV1dBdXRoZW50aWNhdGlvbih3d3dhZSk7Ci0gICAgICBTdHJpbmcgdXNlcm5hbWUgPSBkaWFsb2cuZ2V0VXNlcm5hbWUoKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IGRpYWxvZy5nZXRQYXNzd29yZCgpOwotICAgICAgaHR0cEJhc2ljQXV0aFVzZXJuYW1lID0gdXNlcm5hbWU7Ci0gICAgICBodHRwQmFzaWNBdXRoUGFzc3dvcmQgPSBwYXNzd29yZDsKLSAgICAgIGlmICh1c2VybmFtZSAhPSBudWxsICYmIHBhc3N3b3JkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHBhcnNlci5zZXRIVFRQQmFzaWNBdXRoVXNlcm5hbWUodXNlcm5hbWUpOwotICAgICAgICBwYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKHBhc3N3b3JkKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBwYXJzZXIucGFyc2UoV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfV1NJTCB8IFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX0RJU0NPIHwgV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfTElOS1MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VSSV9OT1RfUkVTT0xWQUJMRSIsIG5ldyBPYmplY3RbXSB7d2ViU2VydmljZVVSSX0pLCBTdGF0dXMuRVJST1IsIHQpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIHBhcnNlci5zZXRIVFRQQmFzaWNBdXRoVXNlcm5hbWUobnVsbCk7Ci0gICAgICAgICAgcGFyc2VyLnNldEhUVFBCYXNpY0F1dGhQYXNzd29yZChudWxsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVVJJX05PVF9SRVNPTFZBQkxFIiwgbmV3IE9iamVjdFtdIHt3ZWJTZXJ2aWNlVVJJfSksIFN0YXR1cy5FUlJPUiwgdCk7Ci0gICAgfQotICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NFbnRpdHkgPSBwYXJzZXIuZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdlYlNlcnZpY2VVUkkpOwotICAgIGlmICh3c0VudGl0eSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCB0eXBlID0gd3NFbnRpdHkuZ2V0VHlwZSgpOwotICAgICAgaWYgKHR5cGUgIT0gV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpCi0gICAgICAJbmVlZFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmVlZFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVVJJKCkKLSAgewotICAgIHJldHVybiB3ZWJTZXJ2aWNlVVJJOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVVSSShTdHJpbmcgd2ViU2VydmljZVVSSSkKLSAgewotICAgIHRoaXMud2ViU2VydmljZVVSSSA9IHdlYlNlcnZpY2VVUkk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0V2ViU2VydmljZVVSSSgpOwotICB9Ci0vKioKLSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaHR0cEJhc2ljQXV0aFBhc3N3b3JkLgotICovCi1wdWJsaWMgU3RyaW5nIGdldEh0dHBCYXNpY0F1dGhQYXNzd29yZCgpIHsKLQlyZXR1cm4gaHR0cEJhc2ljQXV0aFBhc3N3b3JkOwotfQotLyoqCi0gKiBAcmV0dXJuIFJldHVybnMgdGhlIGh0dHBCYXNpY0F1dGhVc2VybmFtZS4KLSAqLwotcHVibGljIFN0cmluZyBnZXRIdHRwQmFzaWNBdXRoVXNlcm5hbWUoKSB7Ci0JcmV0dXJuIGh0dHBCYXNpY0F1dGhVc2VybmFtZTsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMjBmYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJvamVjdC4KLSAgICovCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBwcm9qZWN0Ci0gICAqICAgICAgICAgIFRoZSBwcm9qZWN0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgICByZXR1cm4gd3NkbFVSSTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZXNQYXJzZXIuCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VzUGFyc2VyICE9IG51bGwpCi0gICAgICByZXR1cm4gd2ViU2VydmljZXNQYXJzZXI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlc1BhcnNlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBpZiAod3NkbFVSSSAhPSBudWxsICYmIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkuZ2V0V1NETERlZmluaXRpb24od3NkbFVSSSkgIT0gbnVsbCkKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscygib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnBsdWdpbiIsIHRoaXMpOwotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfTVNHX1NFTEVDVElPTl9NVVNUX0JFX1dTREwiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25UcmVlV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvblRyZWVXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1YjdiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvblRyZWVXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotLyoqCi0qIFRoaXMgd2l6YXJkIHBhZ2UgYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgV1NETCBVUkkgZm9yIGNvbnN1bXB0aW9uCi0qLwotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0gIC8qQ09OVEVYVF9JRCBQV1dTMDAwMSBmb3IgdGhlIFdTREwgU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BXV1NfUEFHRSA9ICIuUFdXUzAwMDEiOwotCi0gIC8qQ09OVEVYVF9JRCBQV1dTMDAwMiBmb3IgdGhlIFdTREwgRG9jdW1lbnQgdGV4dCBmaWVsZCBvZiB0aGUgV1NETCBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFdXU19URVhUX1dTREwgPSAiLlBXV1MwMDAyIjsKLQotICAvKkNPTlRFWFRfSUQgUFdXUzAwMDMgZm9yIHRoZSBXU0RMIFJlc291cmNlIEJyb3dzZSBidXR0b24gb2YgdGhlIFdTREwgU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BXV1NfQlVUVE9OX0JST1dTRV9XU0RMID0gIi5QV1dTMDAwMyI7Ci0KLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZVVSSTsKLSAgCi0gIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLSAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcjsKLSAgcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXJfOwotICBwcml2YXRlIFRyZWVDb250ZW50UHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlcjsKLSAgcHJpdmF0ZSBUcmVlIHRyZWVfOwotICBwcml2YXRlIGludCBwYWdlV2lkdGhfOwotCi0gIC8qKgotICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICovCi0gIHB1YmxpYyBXU0RMU2VsZWN0aW9uVHJlZVdpZGdldCgpCi0gIHsKLSAgICBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgCXRoaXMuc3RhdHVzTGlzdGVuZXIgPSBzdGF0dXNMaXN0ZW5lcjsKLSAgICBwYXJlbnQuc2V0VG9vbFRpcFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdXU19QQUdFIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBwbHVnaW5JZF8gKyBJTkZPUE9QX1BXV1NfUEFHRSk7Ci0KLSAgICBMYWJlbCB3c2RsTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0gICAgd3NkbExhYmVsLnNldFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX1NFTEVDVF9XU0RMIikpOwotICAgIHdzZGxMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotICAgIHRyZWVfID0gbmV3IFRyZWUocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBnZC5oZWlnaHRIaW50ID0gMjAwOwotICAgIHRyZWVfLnNldExheW91dERhdGEoZ2QpOwotICAgIHBhZ2VXaWR0aF8gPSB0cmVlXy5nZXRTaGVsbCgpLmdldFNpemUoKS54OwotICAgIHRyZWVWaWV3ZXJfID0gbmV3IFRyZWVWaWV3ZXIodHJlZV8pOwotICAgIHRyZWVDb250ZW50UHJvdmlkZXIgPSBuZXcgVHJlZUNvbnRlbnRQcm92aWRlcigpOwotICAgIHRyZWVWaWV3ZXJfLnNldENvbnRlbnRQcm92aWRlcih0cmVlQ29udGVudFByb3ZpZGVyKTsKLSAgICB0cmVlVmlld2VyXy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUcmVlTGFiZWxQcm92aWRlcigpKTsKLSAgICB0cmVlVmlld2VyXy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0gICAgICBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgIAloYW5kbGVUcmVlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KGV2ZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVUcmVlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAJc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobmV3IEV2ZW50KCkpOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlc1BhcnNlci4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgCXJldHVybiB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHdlYlNlcnZpY2VzUGFyc2VyIFRoZSB3ZWJTZXJ2aWNlc1BhcnNlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAJdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICAJdHJlZVZpZXdlcl8uc2V0SW5wdXQodGhpcy53ZWJTZXJ2aWNlc1BhcnNlcik7Ci0gIAlyZWZyZXNoVHJlZVZpZXdlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVVSSShTdHJpbmcgd3NVUkkpCi0gIHsKLSAgCXdlYlNlcnZpY2VVUkkgPSB3c1VSSTsKLSAgCXRyZWVDb250ZW50UHJvdmlkZXIuc2V0V2ViU2VydmljZVVSSSh3ZWJTZXJ2aWNlVVJJKTsKLSAgICByZWZyZXNoVHJlZVZpZXdlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaFRyZWVWaWV3ZXIoKQotICB7Ci0gIAlpZiAod2ViU2VydmljZXNQYXJzZXIgIT0gbnVsbCAmJiB3ZWJTZXJ2aWNlVVJJICE9IG51bGwpCi0gIAl7Ci0gIAkgIHRyZWVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgCSAgQ29udHJvbCBzaGVsbCA9IHRyZWVfLmdldFNoZWxsKCk7Ci0gIAkgIGlmICh0cmVlXy5nZXRTaXplKCkueCA+IHBhZ2VXaWR0aF8gfHwgc2hlbGwuZ2V0U2l6ZSgpLnggPiBwYWdlV2lkdGhfKQotICAJICB7Ci0gIAkgICAgdHJlZV8uc2V0U2l6ZShwYWdlV2lkdGhfLCB0cmVlXy5nZXRTaXplKCkueSk7Ci0gIAkgICAgc2hlbGwuc2V0U2l6ZShwYWdlV2lkdGhfLCBzaGVsbC5nZXRTaXplKCkueSk7Ci0gIAkgICAgc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgCSAgICBzaGVsbC5yZWRyYXcoKTsKLSAgCSAgfQotICAJfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKLSAgewotICAgIHRyZWVfLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJlZV8uaXNFbmFibGVkKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgCVdlYlNlcnZpY2VFbnRpdHkgZW50aXR5ID0gZ2V0U2VsZWN0aW9uQXNXZWJTZXJ2aWNlRW50aXR5KCk7Ci0gIAlpZiAoZW50aXR5ICE9IG51bGwpCi0gIAkgIHJldHVybiBlbnRpdHkuZ2V0VVJJKCk7Ci0gIAllbHNlCi0gIAkgIHJldHVybiB3ZWJTZXJ2aWNlVVJJOwotICB9Ci0gIAotICBwcml2YXRlIFdlYlNlcnZpY2VFbnRpdHkgZ2V0U2VsZWN0aW9uQXNXZWJTZXJ2aWNlRW50aXR5KCkKLSAgewotICAJaWYgKHRyZWVWaWV3ZXJfICE9IG51bGwpCi0gIAl7Ci0gICAgICBJU2VsZWN0aW9uIHNlbCA9IHRyZWVWaWV3ZXJfLmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKCFzZWwuaXNFbXB0eSgpICYmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0gICAgICB7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsOwotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFbnRpdHkpCi0gICAgICAgICAgcmV0dXJuIChXZWJTZXJ2aWNlRW50aXR5KW9iamVjdDsKLSAgICAgIH0KLSAgCX0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NFbnRpdHkgPSBnZXRTZWxlY3Rpb25Bc1dlYlNlcnZpY2VFbnRpdHkoKTsKLSAgICBpZiAod3NFbnRpdHkgPT0gbnVsbCB8fCB3c0VudGl0eS5nZXRUeXBlKCkgIT0gV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIlBBR0VfTVNHX1NFTEVDVElPTl9NVVNUX0JFX1dTREwiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIFRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlcgotICB7Ci0gIAlwcml2YXRlIFN0cmluZyB3ZWJTZXJ2aWNlVVJJOwotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VzUGFyc2VyKQotICAgICAgewotICAgICAgCVdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlciA9IChXZWJTZXJ2aWNlc1BhcnNlcilpbnB1dEVsZW1lbnQ7Ci0gICAgICAgIE9iamVjdCB3c0VudGl0eSA9IHBhcnNlci5nZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkod2ViU2VydmljZVVSSSk7Ci0gICAgICAgIGlmICh3c0VudGl0eSAhPSBudWxsKQotICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge3dzRW50aXR5fTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFbnRpdHkpCi0gICAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9ICgoV2ViU2VydmljZUVudGl0eSlwYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFtsaXN0LnNpemUoKV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICBvYmplY3RzW2ldID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgIHJldHVybiBvYmplY3RzOwotICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRW50aXR5KQotICAgICAgICByZXR1cm4gKChXZWJTZXJ2aWNlRW50aXR5KWVsZW1lbnQpLmdldFBhcmVudCgpOwotICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuIChnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVVSSShTdHJpbmcgd3NVUkkpCi0gICAgewotICAgICAgd2ViU2VydmljZVVSSSA9IHdzVVJJOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgVHJlZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotICB7Ci0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHN3aXRjaCAoKChXZWJTZXJ2aWNlRW50aXR5KWVsZW1lbnQpLmdldFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXZWJTZXJ2aWNlRW50aXR5LlRZUEVfSFRNTDoKLSAgICAgICAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy93c2lsL2h0bWwuZ2lmIikuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgY2FzZSBXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NJTDoKLSAgICAgICAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy93c2lsL3dzaWwuZ2lmIikuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgY2FzZSBXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NETDoKLSAgICAgICAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy93c2lsL3dzZGwuZ2lmIikuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuICgoV2ViU2VydmljZUVudGl0eSllbGVtZW50KS5nZXRVUkkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OWE3MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFQWN0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uXzsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVVSSSgpCi0gIHsKLSAgCWlmIChzZWxlY3Rpb25fICE9IG51bGwgJiYgIXNlbGVjdGlvbl8uaXNFbXB0eSgpKQotICAJewotICAJICBPYmplY3QgZmlyc3RTZWwgPSBzZWxlY3Rpb25fLmdldEZpcnN0RWxlbWVudCgpOwotICAJICBpZiAoZmlyc3RTZWwgaW5zdGFuY2VvZiBJRmlsZSkKLSAgCSAgewotICAJICAgIElGaWxlIGlmaWxlID0gKElGaWxlKWZpcnN0U2VsOwotICAJICAgIFN0cmluZyBleHQgPSBpZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0gIAkgICAgaWYgKGV4dCAhPSBudWxsICYmIChleHQuZXF1YWxzKCJ3c2RsIikgfHwgZXh0LmVxdWFscygid3NpbCIpIHx8IGV4dC5lcXVhbHMoImh0bWwiKSkpCi0gIAkgICAgewotICAJICAgICAgcmV0dXJuIGlmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgCSAgICB9Ci0gIAkgIH0KLSAgCSAgaWYgKGZpcnN0U2VsIGluc3RhbmNlb2YgU2VydmljZUltcGwpCi0gICAgICB7Ci0gICAgICAgIFNlcnZpY2VJbXBsIHNlcnZpY2VJbXBsID0gKFNlcnZpY2VJbXBsKWZpcnN0U2VsOwotICAgICAgICByZXR1cm4gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoc2VydmljZUltcGwpOwotICAgICAgfQotICAJICBpZiAoZmlyc3RTZWwgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKQotICAgICAgewotICAJICAgIFNlcnZpY2VSZWYgc2VydmljZVJlZiA9IChTZXJ2aWNlUmVmKWZpcnN0U2VsOwotICAgICAgICByZXR1cm4gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoc2VydmljZVJlZik7Ci0gICAgICB9Ci0gIAkgIGlmIChmaXJzdFNlbCBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpCi0gIAkgIHsKLSAgCSAgICBXU0RMUmVzb3VyY2VJbXBsIHdzZGxSSSA9IChXU0RMUmVzb3VyY2VJbXBsKWZpcnN0U2VsOwotICAJICAgIHJldHVybiBKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSh3c2RsUkkpOwotICAJICB9Ci0gIAkgIGlmIChmaXJzdFNlbCBpbnN0YW5jZW9mIFN0cmluZykKLSAgCSAgICByZXR1cm4gKFN0cmluZylmaXJzdFNlbDsKLSAgCX0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbiggSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgewotICAgIHNlbGVjdGlvbl8gPSBzZWxlY3Rpb247ICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbldTSUwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdzaWxVUkkoKQotICB7Ci0gIAlTdHJpbmcgd3NVUkkgPSBnZXRXZWJTZXJ2aWNlVVJJKCk7Ci0gIAlpZiAod3NVUkkgIT0gbnVsbCAmJiB3c1VSSS5sZW5ndGgoKSA+IDAgJiYgd3NVUkkuZW5kc1dpdGgoIndzZGwiKSkKLSAgCXsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIod3NVUkkuc3Vic3RyaW5nKDAsIHdzVVJJLmxlbmd0aCgpLTQpKTsKLSAgICAgIHNiLmFwcGVuZCgid3NpbCIpOwotICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIAl9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgCUlQcm9qZWN0IHAgPSBnZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oc2VsZWN0aW9uXyk7Ci0gIAlyZXR1cm4gcDsKLSAgfQotICAKLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iaiAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsgCi0gICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24ob2JqKTsKLSAgICAgICAgICBpZiAocmVzb3VyY2U9PW51bGwpIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgSVByb2plY3QgcCA9IFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDhkYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5XU0RMU2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5XU0RMU2VsZWN0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyIGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLQotICBwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXI7Ci0gIAotICBwcml2YXRlIFdTRExTZWxlY3Rpb25XaWRnZXQgd3NkbFNlbGVjdGlvbldpZGdldDsKLSAgcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZVVSSTsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAKLSAgcHVibGljIFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyKCkKLSAgewotICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgfQotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB0aGlzLnN0YXR1c0xpc3RlbmVyID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgd3NkbFNlbGVjdGlvbldpZGdldCA9IG5ldyBXU0RMU2VsZWN0aW9uV2lkZ2V0KCk7Ci0gICAgd3NkbFNlbGVjdGlvbldpZGdldC5hZGRDb250cm9scyhwYXJlbnQsIHN0YXR1c0xpc3RlbmVyKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxTZWxlY3Rpb25XaWRnZXQuZ2V0U3RhdHVzKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VVUkkoU3RyaW5nIHdzVXJpKQotICB7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsOwotICAgIGlmICh3c1VyaSAhPSBudWxsKQotICAgICAgc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24od3NVcmkpOwotICAgIGVsc2UKLSAgICAgIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0gICAgd3NkbFNlbGVjdGlvbldpZGdldC5zZXRJbml0aWFsU2VsZWN0aW9uKHNlbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVVSSSgpCi0gIHsKLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgICAgPSB3c2RsU2VsZWN0aW9uV2lkZ2V0LmdldE9iamVjdFNlbGVjdGlvbigpOwotICAgIE9iamVjdCAgICAgICAgICAgICAgIG9iamVjdCA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsOwotICAgIAotICAgIGlmIChvYmplY3QgIT0gbnVsbCApCi0gICAgewotICAgICAgaWYoIG9iamVjdCBpbnN0YW5jZW9mIFdTRExTZWxlY3Rpb25XcmFwcGVyICkKLSAgICAgIHsgICAgCi0gICAgICAgIC8vIEdldCBhdCB0aGUgaW5uZXIgc3RydWN0dXJlZCBzZWxlY3Rpb24gb2JqZWN0LgotICAgICAgICBXU0RMU2VsZWN0aW9uV3JhcHBlciB3cmFwcGVyICAgICAgICA9IChXU0RMU2VsZWN0aW9uV3JhcHBlcilvYmplY3Q7Ci0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGlubmVyU2VsZWN0aW9uID0gd3JhcHBlci53c2RsU2VsZWN0aW9uOwotICAgICAgICBPYmplY3QgICAgICAgICAgICAgICBpbm5lck9iamVjdCAgICA9IGlubmVyU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gaW5uZXJPYmplY3QgPT0gbnVsbCA/IG51bGwgOiBpbm5lck9iamVjdC50b1N0cmluZygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBvYmplY3QudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkKLSAgewotICAJcmV0dXJuIGdldFdlYlNlcnZpY2VVUkkoKTsKLSAgfQotICAKLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAgIHJldHVybiB3c2RsU2VsZWN0aW9uV2lkZ2V0LmdldFdlYlNlcnZpY2VzUGFyc2VyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQotICB7Ci0gIAlJUHJvamVjdCBwID0gd3NkbFNlbGVjdGlvbldpZGdldC5nZXRQcm9qZWN0KCk7Ci0gIAlpZiAocD09bnVsbCkKLSAgCXsKLSAgCSAgcmV0dXJuIHByb2plY3Q7Ci0gIAl9Ci0gIAllbHNlCi0gIAkgIHJldHVybiBwOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV2ViU2VydmljZUNsaWVudFR5cGVXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDA0M2ViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5MYWJlbHNBbmRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17ICAgICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDEzIGZvciB0aGUgV2l6YXJkIFNjZW5hcmlvIENsaWVudCBncm91cCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0dST1VQX1NDRU5BUklPX0NMSUVOVCA9ICJQV1BSMDAxMyI7Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdQUjAwMTQgZm9yIHRoZSBXZWIgU2VydmljZSBDbGllbnQgVHlwZSBjb21ibyBib3ggb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DT01CT19DTElFTlRUWVBFID0gIlBXUFIwMDE0IjsKLSAgcHJpdmF0ZSBDb21ibyAgY2xpZW50VHlwZUNvbWJvXzsKLSAgICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDA2IGZvciB0aGUgVGVzdCBQcm94eSBjaGVjayBib3ggb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DSEVDS0JPWF9URVNUX1BST1hZID0gIlBXUFIwMDA2IjsKLSAgcHJpdmF0ZSBCdXR0b24gdGVzdFByb3h5Q2hlY2tib3hfOwotICAKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBpZHNfOwotICBwcml2YXRlIExhYmVsc0FuZElkcyAgICAgIGxhYmVsSWRzXzsKLSAgICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2FkZENvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIpCi0gICAqLwotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1dGlscyAgICA9IG5ldyBVSVV0aWxzKCBtc2dVdGlscywgcGx1Z2luSWQgKTsKLSAgCQotICAgIEdyb3VwIGNsaWVudEdyb3VwID0gdXRpbHMuY3JlYXRlR3JvdXAoIHBhcmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdST1VQX1NDRU5BUklPX0NMSUVOVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdQUl9HUk9VUF9TQ0VOQVJJT19DTElFTlQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUFJfR1JPVVBfU0NFTkFSSU9fQ0xJRU5ULAotCQkJCQkJCQkJCSAgIDIsIDEwLCAxMCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgCi0gICAgaW50IGNvbWJvU3R5bGUgPSBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFk7Ci0gICAgY2xpZW50VHlwZUNvbWJvXyA9IHV0aWxzLmNyZWF0ZUNvbWJvKCBjbGllbnRHcm91cCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFCRUxfV0VCU0VSVklDRUNMSUVOVFRZUEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdQUl9DT01CT19DTElFTlRUWVBFIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUFJfQ09NQk9fQ0xJRU5UVFlQRSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21ib1N0eWxlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIAotICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXQoIGJvb2xlYW4gZW5hYmxlICkKLSAgewotICAgIGNsaWVudFR5cGVDb21ib18uc2V0RW5hYmxlZCggZW5hYmxlICk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzICkKLSAgewotCQkvLyByc2tyZWcKLSAgICAvL1dlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgICA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAvL0xhYmVsc0FuZElkcyAgICAgICAgICAgICAgICAgbGFiZWxJZHMgICA9IHJlZ2lzdHJ5LmdldENsaWVudFR5cGVMYWJlbHMoKTsKLQkJTGFiZWxzQW5kSWRzICAgICAgICAgICAgICAgICBsYWJlbElkcyAgID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRDbGllbnRUeXBlTGFiZWxzKCk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24gID0gMDsKLSAgICBTdHJpbmdbXSAgICAgICAgICAgICAgICAgICAgIGNsaWVudElkcyAgPSBsYWJlbElkcy5nZXRJZHNfKCk7Ci0gICAgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZElkID0gaWRzLmdldFR5cGVJZCgpOwotICAgIAotCQkvLyByc2tyZWcKLSAgICBjbGllbnRUeXBlQ29tYm9fLnNldEl0ZW1zKCBsYWJlbElkcy5nZXRMYWJlbHNfKCkgKTsKLSAgICAKLSAgICAvLyBOb3cgZmluZCB0aGUgc2VsZWN0ZWQgb25lLgotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjbGllbnRJZHMubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBpZiggc2VsZWN0ZWRJZC5lcXVhbHMoIGNsaWVudElkc1tpbmRleCBdKSApCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9IGluZGV4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgY2xpZW50VHlwZUNvbWJvXy5zZWxlY3QoIHNlbGVjdGlvbiApOwotICAgIGlkc18gICAgICA9IGlkczsgIAotICAgIGxhYmVsSWRzXyA9IGxhYmVsSWRzOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgaW50IHNlbGVjdGlvbkluZGV4ID0gY2xpZW50VHlwZUNvbWJvXy5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIAotICAgIGlkc18uc2V0VHlwZUlkKCBsYWJlbElkc18uZ2V0SWRzXygpW3NlbGVjdGlvbkluZGV4XSApOwotICAgIAotICAgIHJldHVybiBpZHNfOyAgCi0gIH0KLSAgICAgIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NsaWVudFdpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NsaWVudFdpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyMWM1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9DbGllbnRXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uR2V0TW9uaXRvckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YS5FY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YS5TZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5GaW5pc2hGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuZXh0ZW5zaW9uLkNsaWVudFJvb3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuZXh0ZW5zaW9uLlByZUNsaWVudERldmVsb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5zZWxlY3Rpb24uU2VsZWN0aW9uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLldTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0Lk9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUuQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5DbGllbnRUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5DbGllbnRUZXN0V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuRmluaXNoRGVmYXVsdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hKYXZhVGVzdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuRmluaXNoVGVzdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuVGVzdERlZmF1bHRpbmdGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LldlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkRldmVsb3BDbGllbnRGcmFnbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50V2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIHByaXZhdGUgQ2FuRmluaXNoUmVnaXN0cnkgICBjYW5GaW5pc2hSZWdpc3RyeV87Ci0gIHByaXZhdGUgV2lkZ2V0UmVnaXN0cnkgICAgICB3aWRnZXRSZWdpc3RyeV87Ci0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5XzsKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRSb290Q29tbWFuZEZyYWdtZW50KCk7ICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICAgIGNhbkZpbmlzaFJlZ2lzdHJ5XyA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeV8gPSBkYXRhUmVnaXN0cnk7Ci0gICAgCi0gICAgLy8gQmVmb3JlIENsaWVudFdpemFyZFdpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIk1vbml0b3JTZXJ2aWNlIiwgQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyApOwotICAgIAotICAgIC8vIEFmdGVyIENsaWVudFdpemFyZFdpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgICAgICAgCi0gICAgLy8gQmVmb3JlIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkoyRUVWZXJzaW9uIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudE5lZWRFQVIiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCJOZWVkRUFSIixudWxsKTsKLSAgICAKLSAgICAvLyBBZnRlciBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJKMkVFVmVyc2lvbiIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiQ2xpZW50TmVlZEVBUiIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyBUaGUgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldCBjYW4gY29udHJvbCB3aGF0IGNsaWVudCBleHRlbnNpb24gY29tZXMgdXAuCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQuY2xhc3MpOwotICAgIAotICAgIC8vIEJlZm9yZSBXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlcgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VVUkkiLCBXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlci5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlci5jbGFzcyApOwotICAgIAotICAgIC8vIEFmdGVyIFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuY2xhc3MsICJXc2RsVVJJIiwgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuY2xhc3MsICJQcm9qZWN0IiwgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgICAKLSAgICAvLyBCZWZvcmUgQ2xpZW50IFRlc3Qgd2lkZ2V0LgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiRm9sZGVyIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUnVuQ2xpZW50VGVzdCIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIk1ldGhvZHMiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotCi0gICAgLy8gQWZ0ZXIgdGhlIGNsaWVudCB0ZXN0IHdpZGdldCAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIixGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlNhbXBsZVByb2plY3QiLEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiUnVuQ2xpZW50VGVzdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlNhbXBsZU1ldGhvZHMiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJUZXN0U2VydmljZSIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiVGVzdElEIixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJJc1Rlc3RXaWRnZXQiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnlfID0gd2lkZ2V0UmVnaXN0cnk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQ2xpZW50V2l6YXJkV2lkZ2V0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX1BST0pFQ1QiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU19QUk9KRUNUIiksCi0JCQkJICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLQkJCQkgICAgICAgIHsKLQkJCQkgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0JCQkJICAgICAgICAgIHsKLQkJCQkgICAgICAgICAgICByZXR1cm4gbmV3IENsaWVudFdpemFyZFdpZGdldCgpOwotCQkJCSAgICAgICAgICB9Ci0JCQkJICAgICAgICB9ICk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19DTElFTlRfUlVOVElNRV9TRUxFQ1RJT04iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU19DTElFTlRfUlVOVElNRV9TRUxFQ1RJT04iKSwKLQkJCQkJCW5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCQkJCQkJICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkJCQkJCSAgewotCQkJCQkJICAgIHJldHVybiBuZXcgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldCgpOwotCQkJCQkJICB9Ci0JCQkJCQl9ICk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfU0VMRUNUSU9OIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfU0VMRUNUSU9OIiksCi0JCSAgICAgICAgICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkJICAgICAgICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0JCSAgICAgICAgICAgICAgICAgIHsKLQkJICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyKCk7Ci0JCSAgICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgIH0gKTsKLSAgICAKLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJDbGllbnRUZXN0V2lkZ2V0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX1NBTVBMRSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTX1NBTVBMRSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRUZXN0V2lkZ2V0KCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgSW5pdENsaWVudFJlZ2lzdHJ5IGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotICB7ICAKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgY2xpZW50UmVnaXN0cnlfID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmQjZXhlY3V0ZShvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQpCi0gICAgICovCi0gICAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSAKLSAgICB7Ci0gICAgICBjbGllbnRSZWdpc3RyeV8uc2V0RGF0YU1hcHBpbmdSZWdpc3RyeSggZGF0YU1hcHBpbmdSZWdpc3RyeV8gKTsKLSAgICAgIGNsaWVudFJlZ2lzdHJ5Xy5zZXRXaWRnZXRSZWdpc3RyeSggd2lkZ2V0UmVnaXN0cnlfICk7Ci0gICAgICBjbGllbnRSZWdpc3RyeV8uc2V0Q2FuRmluaXNoUmVnaXN0cnkoIGNhbkZpbmlzaFJlZ2lzdHJ5XyApOwotICAgICAgCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgQ2xpZW50Um9vdENvbW1hbmRGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLSAgewotICAgIHB1YmxpYyBDbGllbnRSb290Q29tbWFuZEZyYWdtZW50KCkKLSAgICB7Ci0gICAgICAvL2FkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2hlY2tGb3JNaXNzaW5nRmlsZXMoKSwgIiIgKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEluaXRDbGllbnRSZWdpc3RyeSgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQ2xpZW50V2l6YXJkV2lkZ2V0IiApICk7Ci0JICAvL2FkZCggbmV3IFRlc3RDb21tYW5kRmFjdG9yeUZyYWdtZW50KCkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggIldTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotCSAgLy9hZGQoIG5ldyBUZXN0Q29tbWFuZEZhY3RvcnlGcmFnbWVudDIoKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoICJDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0IiApICk7Ci0gICAgICAvL2FkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQoIHRydWUgKSwgIiIpKTsKLSAgICAgIC8vYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQoZmFsc2UpLCAiIikpOyAvL05vdGU6IGFkZGVkIGhlcmUgZm9yIGNsaWVudCAgICAgIAotICAgICAgLy9hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kKCksICIiKSk7ICAKLSAgICAgIC8vYWRkKCBuZXcgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQoKSApOwotCSAgYWRkKCBuZXcgQ2xpZW50Um9vdEZyYWdtZW50KCkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCgpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudChuZXcgR2V0TW9uaXRvckNvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KG5ldyBUZXN0RGVmYXVsdGluZ0ZyYWdtZW50KCksIiIpKTsKLSAgICAgIGFkZCggbmV3IENsaWVudFRlc3RGcmFnbWVudCggIkNsaWVudFRlc3RXaWRnZXQiKSApOyAKLSAgICAgIGFkZChuZXcgRmluaXNoRnJhZ21lbnQoKSk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gICAgewotICAgICAgLy9NYXAgU2VsZWN0aW9uQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJbml0aWFsSW5pdGlhbFNlbGVjdGlvbiIsIG51bGwpOwotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIEdldE1vbml0b3JDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW50aW1lMkNsaWVudFR5cGVzIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIENoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbldTSUwiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2lsVVJJIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZVVSSSIsIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIG5ldyBFY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIEdldE1vbml0b3JDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBHZXRNb25pdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRJbml0aWFsUHJvamVjdCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIENoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzKTsgICAgICAKLSAgICAgIAotICAgICAgLy9TZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQgZm9yIGNsaWVudCAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXJJbnN0YW5jZSIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCJTYW1wbGVFeGlzdGluZ1NlcnZlciIsIG5ldyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCJTYW1wbGVTZXJ2ZXJUeXBlSUQiLCBudWxsKTsKLQkgIAotCSAgLy8gU2V0dXAgdGhlIFByZUNsaWVudERldmVsb3BDb21tYW5kLgotCQkJLy8KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7ICAgICAgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MpOwkJCQkJCQotCQkJLy8KLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzKTsKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIG5ldyBTZWxlY3Rpb25UcmFuc2Zvcm1lcigpICk7Ci0gICAgICAKLQkJCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZUNsaWVudCIsIG51bGwgKTsKLQkJCQotICAgICAgLy8gTWFwIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb3h5UHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RFQVIiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb3h5UHJvamVjdEVBUiIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RUeXBlIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0VHlwZUlkIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiU2VydmVyRmFjdG9yeUlkIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJKMkVFVmVyc2lvbiIsIG51bGwpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJOZWVkRUFSIiwgbnVsbCk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiQ2xpZW50SWRzIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkoyZWVWZXJzaW9uIiwgbnVsbCk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzICk7ICAgICAKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJQcm94eUJlYW4iLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEZpbmlzaEphdmFUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlNldEVuZHBvaW50TWV0aG9kIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIEdldE1vbml0b3JDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhHZXRNb25pdG9yQ29tbWFuZC5jbGFzcywgIkVuZHBvaW50cyIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotCi0gICAgICAvLyBNQVAgcG9zdCBzZXJ2ZXIgY29uZmlnIGNhbGwgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJFYXJQcm9qZWN0TmFtZSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXJJbnN0YW5jZSIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJFeGlzdGluZ1NlcnZlcklkIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5jbGFzcywgIlNhbXBsZUV4aXN0aW5nU2VydmVySW5zdElkIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkV4aXN0aW5nU2VydmVySWQiLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCAiU2FtcGxlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIkV4aXN0aW5nU2VydmVySWQiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCAiQWRkZWRQcm9qZWN0VG9TZXJ2ZXIiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5jbGFzcywgIlNhbXBsZUV4aXN0aW5nU2VydmVySW5zdElkIiwgRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MsICJFeGlzdGluZ1NlcnZlcklkIiwgbnVsbCk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJQcm94eUJlYW4iLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJKc3BGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlJ1bkNsaWVudFRlc3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIk1ldGhvZHMiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9Db25maWdDbGllbnRIYW5kbGVyc1dpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NvbmZpZ0NsaWVudEhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWNhODY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NvbmZpZ0NsaWVudEhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLkdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5PcGVuSmF2YUVkaXRvckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLS8qKgotICogCi0gKiBIYW5kbGVyIENvbmZpZ3VyYXRpb24gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZQotICogYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdDbGllbnRIYW5kbGVyc1dpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZyB7Ci0gIAotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnlfOwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnlfOwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeV87Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpIHsKLQotICAgIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgd2lkZ2V0UmVnaXN0cnlfID0gd2lkZ2V0UmVnaXN0cnk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCJDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0IiwgCi0gICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfQ0xJRU5UX0hETFJfQ09ORklHIiksIAotICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfQ0xJRU5UX0hETFJfQ09ORklHIiksIAotICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotCi0gICAgICAJcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgIAkgIHJldHVybiBuZXcgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldCgpOwotICAgICAgCX0KLSAgICB9KTsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnlfID0gZGF0YVJlZ2lzdHJ5OwotICAgIAotICAgIAotLy8gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiQWxsSGFuZGxlcnMiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJIYW5kbGVycyIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIldzUmVmc1RvSGFuZGxlcnMiLCBudWxsKTsKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJTb3VyY2VPdXRwdXRMb2NhdGlvbiIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIlNlcnZpY2VSZWZOYW1lIiwgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiUmVmTmFtZVRvU2VydmljZVJlZiIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIAotICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiQWxsSGFuZGxlcnNMaXN0IiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJXc1JlZnNUb0hhbmRsZXJzIiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCJIYW5kbGVyc1RhYmxlIixudWxsKTsKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJTb3VyY2VPdXRwdXRMb2NhdGlvbiIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywiT3V0cHV0TG9jYXRpb24iLG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIkhhbmRsZXJDbGFzc05hbWVzIiwgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzLCJIYW5kbGVyTmFtZXMiLG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIkdlblNrZWxldG9uRW5hYmxlZCIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIlByb2plY3QiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywiQ2xhc3NOYW1lcyIsIE9wZW5KYXZhRWRpdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpIHsKLSAgICBjYW5GaW5pc2hSZWdpc3RyeV8gPSBjYW5GaW5pc2hSZWdpc3RyeTsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpIHsKLQotICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKSB7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRIYW5kbGVyc0NvbmZpZ0NvbW1hbmRGcmFnbWVudCgpOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIENsaWVudEhhbmRsZXJzQ29uZmlnQ29tbWFuZEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudHsKLSAgIAotICAgIHB1YmxpYyBDbGllbnRIYW5kbGVyc0NvbmZpZ0NvbW1hbmRGcmFnbWVudCgpCi0gICAgewotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiICkpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoICJDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0IiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IE9wZW5KYXZhRWRpdG9yQ29tbWFuZCgpLCAiIikpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICAgIHsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIldzQ2xpZW50UmVzb3VyY2UiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiV3NTZXJ2aWNlUmVmcyIsIENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJDbGllbnRQcm9qZWN0IiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICB9Ci0gCi0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9Db25maWdTZXJ2aWNlSGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9Db25maWdTZXJ2aWNlSGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjdiYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ29uZmlnU2VydmljZUhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLkdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5PcGVuSmF2YUVkaXRvckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLS8qKgotICogCi0gKiBIYW5kbGVyIENvbmZpZ3VyYXRpb24gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZQotICogYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdTZXJ2aWNlSGFuZGxlcnNXaWRnZXRCaW5kaW5nIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcgewotICAKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSAgIGNhbkZpbmlzaFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnlfOwotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KSB7Ci0KLSAgICBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIHdpZGdldFJlZ2lzdHJ5XyA9IHdpZGdldFJlZ2lzdHJ5OwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCgiQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQiLCAKLSAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9TRVJWSUNFX0hETFJfQ09ORklHIiksIAotICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfU0VSVklDRV9IRExSX0NPTkZJRyIpLCAKLSAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLQotICAgICAgCXB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAJICByZXR1cm4gbmV3IENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0KCk7Ci0gICAgICAJfQotICAgIH0pOwotCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeV8gPSBkYXRhUmVnaXN0cnk7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIldzUmVmc1RvSGFuZGxlcnMiLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIkdlblNrZWxldG9uRW5hYmxlZCIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiU291cmNlT3V0cHV0TG9jYXRpb24iLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIlNlcnZpY2VEZXNjTmFtZVRvRGVzY09iaiIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiRGVzY3JpcHRpb25OYW1lIiwgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIAotICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJIYW5kbGVyc0xpc3QiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiV3NEZXNjVG9IYW5kbGVycyIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJTZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmoiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiU291cmNlT3V0cHV0TG9jYXRpb24iLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIk91dHB1dExvY2F0aW9uIixudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiSGFuZGxlckNsYXNzTmFtZXMiLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIkhhbmRsZXJOYW1lcyIsbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIkdlblNrZWxldG9uRW5hYmxlZCIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcyk7Ci0gCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzLCJQcm9qZWN0IiwgT3BlbkphdmFFZGl0b3JDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIkNsYXNzTmFtZXMiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MpOwotICAgCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpIHsKLSAgICBjYW5GaW5pc2hSZWdpc3RyeV8gPSBjYW5GaW5pc2hSZWdpc3RyeTsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpIHsKLQotICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKSB7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlSGFuZGxlcnNDb25maWdDb21tYW5kRnJhZ21lbnQoKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBTZXJ2aWNlSGFuZGxlcnNDb25maWdDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50ewotICAgCi0gICAgcHVibGljIFNlcnZpY2VIYW5kbGVyc0NvbmZpZ0NvbW1hbmRGcmFnbWVudCgpCi0gICAgewotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IE9wZW5KYXZhRWRpdG9yQ29tbWFuZCgpLCAiIikpOwotCi0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gICAgewotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkZFJlc291cmNlIiwgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIAotICAgIH0KLSAKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NvbmZpZ3VyZUhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ29uZmlndXJlSGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjkyNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ29uZmlndXJlSGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5TZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5TZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2VsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIENvbmZpZ3VyZUhhbmRsZXJzV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nIHsKLQotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5XzsKLQotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5XzsKLQotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeV87Ci0KLSAgcHVibGljIENvbmZpZ3VyZUhhbmRsZXJzV2lkZ2V0QmluZGluZygpIHsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpIHsKLQotICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFuZGxlcnNDb21tYW5kRnJhZ21lbnQoKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KSB7Ci0gICAgY2FuRmluaXNoUmVnaXN0cnlfID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpLAotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnlfID0gZGF0YVJlZ2lzdHJ5OwotCi0gICAgLy8gTWFwIGNsaWVudC1zaWRlIHdpZGdldHMgdG8gY29tbWFuZHMKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSGFuZGxlcnMiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCAiV3NSZWZzVG9IYW5kbGVycyIsIG51bGwpOwotCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlblNrZWxldG9uRW5hYmxlZCIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTb3VyY2VPdXRwdXRMb2NhdGlvbiIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlUmVmTmFtZSIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSZWZOYW1lVG9TZXJ2aWNlUmVmIiwgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0KLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCAiV3NSZWZzVG9IYW5kbGVycyIsIENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkhhbmRsZXJzVGFibGUiLCBudWxsKTsKLQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsICJTb3VyY2VPdXRwdXRMb2NhdGlvbiIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywgIk91dHB1dExvY2F0aW9uIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywgIkhhbmRsZXJDbGFzc05hbWVzIiwgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzLCAiSGFuZGxlck5hbWVzIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywgIkdlblNrZWxldG9uRW5hYmxlZCIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAvLyBNYXAgc2VydmljZS1zaWRlIHdpZGdldHMgdG8gY29tbWFuZHMKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzUmVmc1RvSGFuZGxlcnMiLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTb3VyY2VPdXRwdXRMb2NhdGlvbiIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VEZXNjTmFtZVRvRGVzY09iaiIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRGVzY3JpcHRpb25OYW1lIiwgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsICJIYW5kbGVyc0xpc3QiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywgIldzRGVzY1RvSGFuZGxlcnMiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VEZXNjTmFtZVRvRGVzY09iaiIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsICJTb3VyY2VPdXRwdXRMb2NhdGlvbiIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywgIk91dHB1dExvY2F0aW9uIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsICJIYW5kbGVyQ2xhc3NOYW1lcyIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywgIkhhbmRsZXJOYW1lcyIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCAiR2VuU2tlbGV0b25FbmFibGVkIiwgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzKTsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkgewotICAgIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoIkNvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0IiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9TRVJWSUNFX0hETFJfQ09ORklHIiksIG1zZ1V0aWxzCi0gICAgICAgIC5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfU0VSVklDRV9IRExSX0NPTkZJRyIpLCBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotCi0gICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoIkNvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX0NMSUVOVF9IRExSX0NPTkZJRyIpLCBtc2dVdGlscwotICAgICAgICAuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX0NMSUVOVF9IRExSX0NPTkZJRyIpLCBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotCi0gICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQoKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBIYW5kbGVyc0NvbW1hbmRGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQgewotCi0gICAgcHVibGljIEhhbmRsZXJzQ29tbWFuZEZyYWdtZW50KCkgewotCi0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBIYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0KLSAgICAgIGFkZChuZXcgU2VydmljZUhhbmRsZXJzRnJhZ21lbnQoKSk7Ci0gICAgICBhZGQobmV3IENsaWVudEhhbmRsZXJzRnJhZ21lbnQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBIYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIklzQ2xpZW50SGFuZGxlciIsIENsaWVudEhhbmRsZXJzRnJhZ21lbnQuY2xhc3MsICJDbGllbnRIYW5kbGVyc0VuYWJsZWQiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEhhbmRsZXJzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc1NlcnZpY2VIYW5kbGVyIiwgU2VydmljZUhhbmRsZXJzRnJhZ21lbnQuY2xhc3MsICJTZXJ2aWNlSGFuZGxlcnNFbmFibGVkIiwgbnVsbCk7Ci0KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIldzQ2xpZW50UmVzb3VyY2UiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiV3NTZXJ2aWNlUmVmcyIsIENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJDbGllbnRQcm9qZWN0IiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGRSZXNvdXJjZSIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpIHsKLSAgICAgIGNhbkZpbmlzaFJlZ2lzdHJ5XyA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgQ2xpZW50SGFuZGxlcnNGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudCB7Ci0KLSAgICBib29sZWFuIGlzQ2xpZW50XyA9IGZhbHNlOwotCi0gICAgcHVibGljIENsaWVudEhhbmRsZXJzRnJhZ21lbnQoKSB7Ci0gICAgICBzZXRDb25kaXRpb24obmV3IENvbmRpdGlvbigpIHsKLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpIHsKLSAgICAgICAgICByZXR1cm4gaXNDbGllbnRfOwotICAgICAgICB9Ci0gICAgICB9KTsKLQotICAgICAgU2VxdWVuY2VGcmFnbWVudCBjbGllbnRIYW5kbGVyc1Jvb3RGcmFnbWVudCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0KLSAgICAgIGNsaWVudEhhbmRsZXJzUm9vdEZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLQotICAgICAgY2xpZW50SGFuZGxlcnNSb290RnJhZ21lbnQuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldCIpKTsKLSAgICAgIGNsaWVudEhhbmRsZXJzUm9vdEZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIikpOwotICAgICAgY2xpZW50SGFuZGxlcnNSb290RnJhZ21lbnQuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kKCksICIiKSk7Ci0KLSAgICAgIHNldFRydWVGcmFnbWVudChjbGllbnRIYW5kbGVyc1Jvb3RGcmFnbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SGFuZGxlcnNFbmFibGVkKGJvb2xlYW4gaXNDbGllbnQpIHsKLSAgICAgIGlzQ2xpZW50XyA9IGlzQ2xpZW50OwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50I3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzQ2xpZW50UmVzb3VyY2UiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotCi0gICAgfQotCi0gIH0KLQotICBwcml2YXRlIGNsYXNzIFNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50IHsKLQotICAgIGJvb2xlYW4gaXNTZXJ2aWNlXyA9IGZhbHNlOwotCi0gICAgcHVibGljIFNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50KCkgewotICAgICAgc2V0Q29uZGl0aW9uKG5ldyBDb25kaXRpb24oKSB7Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKSB7Ci0gICAgICAgICAgcmV0dXJuIGlzU2VydmljZV87Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICBTZXF1ZW5jZUZyYWdtZW50IHNlcnZpY2VIYW5kbGVyc1Jvb3RGcmFnbWVudCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgICBzZXJ2aWNlSGFuZGxlcnNSb290RnJhZ21lbnQuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLQotICAgICAgU2VxdWVuY2VGcmFnbWVudCBzZXJ2aWNlSGFuZGxlcnNGcmFnbWVudCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgICBzZXJ2aWNlSGFuZGxlcnNGcmFnbWVudC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KCJDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldCIpKTsKLSAgICAgIHNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQoKSwgIiIpKTsKLSAgICAgIHNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZCgpLCAiIikpOwotCi0gICAgICBzZXJ2aWNlSGFuZGxlcnNSb290RnJhZ21lbnQuYWRkKHNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50KTsKLQotICAgICAgc2V0VHJ1ZUZyYWdtZW50KHNlcnZpY2VIYW5kbGVyc1Jvb3RGcmFnbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUhhbmRsZXJzRW5hYmxlZChib29sZWFuIGlzU2VydmljZSkgewotICAgICAgaXNTZXJ2aWNlXyA9IGlzU2VydmljZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGRSZXNvdXJjZSIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotCi0gICAgfQotCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9HZW5TYW1wbGVXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9HZW5TYW1wbGVXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMDU0NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvR2VuU2FtcGxlV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5kYXRhLkVjbGlwc2VJUGF0aDJVUkxTdHJpbmdUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLkZpbmlzaEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5BZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3RXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hEZWZhdWx0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkZpbmlzaEphdmFUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5UZXN0RGVmYXVsdGluZ0ZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuU2FtcGxlV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIHByaXZhdGUgQ2FuRmluaXNoUmVnaXN0cnkgICBjYW5GaW5pc2hSZWdpc3RyeV87Ci0gIHByaXZhdGUgV2lkZ2V0UmVnaXN0cnkgICAgICB3aWRnZXRSZWdpc3RyeV87Ci0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5XzsKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5TYW1wbGVSb290Q29tbWFuZEZyYWdtZW50KCk7ICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICAgIGNhbkZpbmlzaFJlZ2lzdHJ5XyA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeV8gPSBkYXRhUmVnaXN0cnk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgIC8vIEJlZm9yZSBDbGllbnQgVGVzdCB3aWRnZXQuCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFRlc3REZWZhdWx0aW5nRnJhZ21lbnQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJGb2xkZXIiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJKc3BGb2xkZXIiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJSdW5DbGllbnRUZXN0IixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiTWV0aG9kcyIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0KLSAgICAvLyBBZnRlciB0aGUgY2xpZW50IHRlc3Qgd2lkZ2V0ICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiUnVuQ2xpZW50VGVzdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlNhbXBsZU1ldGhvZHMiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJUZXN0U2VydmljZSIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiVGVzdElEIixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJJc1Rlc3RXaWRnZXQiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnlfID0gd2lkZ2V0UmVnaXN0cnk7Ci0gICAgICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkNsaWVudFRlc3RXaWRnZXQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfU0FNUExFIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfU0FNUExFIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaWVudFRlc3RXaWRnZXQoKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBJbml0Q2xpZW50UmVnaXN0cnkgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi0gIHsgIAotICAgIHByaXZhdGUgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSBjbGllbnRSZWdpc3RyeV8gPSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZCNleGVjdXRlKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIAotICAgIHsKLSAgICAgIGNsaWVudFJlZ2lzdHJ5Xy5zZXREYXRhTWFwcGluZ1JlZ2lzdHJ5KCBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyApOwotICAgICAgY2xpZW50UmVnaXN0cnlfLnNldFdpZGdldFJlZ2lzdHJ5KCB3aWRnZXRSZWdpc3RyeV8gKTsKLSAgICAgIGNsaWVudFJlZ2lzdHJ5Xy5zZXRDYW5GaW5pc2hSZWdpc3RyeSggY2FuRmluaXNoUmVnaXN0cnlfICk7Ci0gICAgICAKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBJbml0aWFsaXplUHJveHlDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotICB7Ci0gICAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25fOwotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJveHlCZWFuKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJveHlCZWFuID0gIiI7Ci0gICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgICAgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbiggc2VsZWN0aW9uXy5nZXRGaXJzdEVsZW1lbnQoKSApOwotICAgICAgICBTdHJpbmcgICAgYmVhblBhY2thZ2UgPSBSZXNvdXJjZVV0aWxzLmdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKCByZXNvdXJjZS5nZXRGdWxsUGF0aCgpICk7Ci0gICAgICAgIAotICAgICAgICBpZiggYmVhblBhY2thZ2U9PW51bGwgKQotICAgICAgICAgIGJlYW5QYWNrYWdlID0gIiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBiZWFuUGFja2FnZSA9IGJlYW5QYWNrYWdlICsgIi4iOwotCi0gICAgICAgIHByb3h5QmVhbiA9IGJlYW5QYWNrYWdlICsgcmVzb3VyY2UuZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmKCBwcm94eUJlYW4udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKSB8fCBwcm94eUJlYW4udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIikpIAotICAgICAgICB7Ci0gICAgICAgICAgcHJveHlCZWFuID0gcHJveHlCZWFuLnN1YnN0cmluZygwLHByb3h5QmVhbi5sYXN0SW5kZXhPZignLicpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgIHsgICAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gcHJveHlCZWFuOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbiggSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25fID0gc2VsZWN0aW9uOyAgCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIEdlblNhbXBsZVJvb3RDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci0gIHsKLSAgICBwdWJsaWMgR2VuU2FtcGxlUm9vdENvbW1hbmRGcmFnbWVudCgpCi0gICAgewotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEluaXRDbGllbnRSZWdpc3RyeSgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCggdHJ1ZSApLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBJbml0aWFsaXplUHJveHlDb21tYW5kKCksICIiICkpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kKCksICIiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgVGVzdERlZmF1bHRpbmdGcmFnbWVudCgpLCIiKSk7Ci0gICAgICBhZGQoIG5ldyBDbGllbnRUZXN0RnJhZ21lbnQoICJDbGllbnRUZXN0V2lkZ2V0IikgKTsgCi0gICAgICBhZGQoIG5ldyBGaW5pc2hGcmFnbWVudCgpICk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gICAgewotICAgICAgLy9NYXAgU2VsZWN0aW9uQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRJbml0aWFsU2VsZWN0aW9uIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIEluaXRpYWxpemVQcm94eUNvbW1hbmQuY2xhc3MgKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgbmV3IEZvcmNlVHJ1ZSgpICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgY29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7IAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBNYXAgV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuV1NJTCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzaWxVUkkiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlVVJJIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgbmV3IEVjbGlwc2VJUGF0aDJVUkxTdHJpbmdUcmFuc2Zvcm1lcigpKTsKLSAgICAgICAgICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICAgICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW50aW1lMkNsaWVudFR5cGVzIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkNsaWVudElkcyIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJKMmVlVmVyc2lvbiIsIG51bGwpOyAgICAgIAotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcyApOyAgICAgCi0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBJbml0aWFsaXplUHJveHlDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhJbml0aWFsaXplUHJveHlDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhJbml0aWFsaXplUHJveHlDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgRmluaXNoSmF2YVRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1BUCBwb3N0IHNlcnZlciBjb25maWcgY2FsbCAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkVBUlByb2plY3ROYW1lIiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVySW5zdGFuY2UiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotICAgICAgICAgICAgCi0gICAgICAKLSAgICAgIC8vIE1hcCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJQcm94eUJlYW4iLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJKc3BGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlJ1bkNsaWVudFRlc3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIk1ldGhvZHMiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIEZvcmNlVHJ1ZSBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi0gIHsKLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIAotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0ltcG9ydFdTSUxXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9JbXBvcnRXU0lMV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODU0YWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0ltcG9ydFdTSUxXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5JbXBvcnRXU0lMV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsLkFkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBJbXBvcnRXU0lMV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIHByaXZhdGUgQ2FuRmluaXNoUmVnaXN0cnkgICBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5OwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeTsKLQotICBwdWJsaWMgSW1wb3J0V1NJTFdpZGdldEJpbmRpbmcoKQotICB7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBTZXF1ZW5jZUZyYWdtZW50IHJvb3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgICAgICAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KCJJbXBvcnRXU0lMV2lkZ2V0IikpOwotICAgICAgICAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBBZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQoKSwgIiIpKTsKLSAgICAgICAgICAgICAgIHJldHVybiByb290OyAgCi0gICAgICAgICAgICAgfQotICAgICAgICAgICB9OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5ID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmRhdGFNYXBwaW5nUmVnaXN0cnkgPSBkYXRhUmVnaXN0cnk7Ci0gICAgCi0gICAgLy8gSW1wb3J0V1NJTFdpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgSW1wb3J0V1NJTFdpZGdldC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSW1wb3J0V1NJTFdpZGdldC5jbGFzcywgIkdlbldTSUxBcmd1bWVudHMiLCBBZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQuY2xhc3MsICJBcmdzIiwgbnVsbCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgdGhpcy53aWRnZXRSZWdpc3RyeSA9IHdpZGdldFJlZ2lzdHJ5OwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCJJbXBvcnRXU0lMV2lkZ2V0IiwgCi0gICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJUSVRMRV9XU0lMX0lNUE9SVCIpLAotICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiREVTQ19XU0lMX0lNUE9SVCIpLAotICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBJbXBvcnRXU0lMV2lkZ2V0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvSW1wb3J0V1NXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9JbXBvcnRXU1dpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5OTIxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9JbXBvcnRXU1dpZGdldEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5QdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5QdWJsaXNoV1NXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIEltcG9ydFdTV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIHByaXZhdGUgQ2FuRmluaXNoUmVnaXN0cnkgICBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5OwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeTsKLSAgcHJpdmF0ZSBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWc7Ci0KLSAgcHVibGljIEltcG9ydFdTV2lkZ2V0QmluZGluZygpCi0gIHsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcgPSBuZXcgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQoKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFNlcXVlbmNlRnJhZ21lbnQgcm9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgICAgICAgICAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQoIldTSW1wb3J0IikpOwotICAgICAgICAgICAgICAgcm9vdC5hZGQocHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnKTsKLSAgICAgICAgICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCgpLCAiIikpOwotICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Q7ICAKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICAgIHRoaXMuY2FuRmluaXNoUmVnaXN0cnkgPSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcucmVnaXN0ZXJDYW5GaW5pc2godGhpcy5jYW5GaW5pc2hSZWdpc3RyeSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmRhdGFNYXBwaW5nUmVnaXN0cnkgPSBkYXRhUmVnaXN0cnk7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKHRoaXMuZGF0YU1hcHBpbmdSZWdpc3RyeSk7Ci0gICAgCi0gICAgLy8gUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5LmFkZE1hcHBpbmcoUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiUHVibGlzaFRvUHJpdmF0ZVVEREkiLCBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gTGF1bmNoV2ViU2VydmljZXNFeHBsb3JlckNvbW1hbmQKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5LmFkZE1hcHBpbmcoUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiRm9yY2VMYXVuY2hPdXRzaWRlSURFIiwgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIkxhdW5jaE9wdGlvbnMiLCBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kLmNsYXNzKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkKLSAgewotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICB0aGlzLndpZGdldFJlZ2lzdHJ5ID0gd2lkZ2V0UmVnaXN0cnk7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnLnJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3ModGhpcy53aWRnZXRSZWdpc3RyeSk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoIldTSW1wb3J0IiwgCi0gICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX0ZJTkQiKSwKLSAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU19GSU5EIiksCi0gICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFB1Ymxpc2hXU1dpZGdldChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjODc1ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICAvLyBDbGllbnRXaXphcmRXaWRnZXQKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciAgICBjbGllbnRJZHNfOwotICBwcml2YXRlIEJvb2xlYW4gICAgICAgICAgICAgIHRlc3RTZXJ2aWNlOwotICBwcml2YXRlIFJlc291cmNlQ29udGV4dCAgICAgIHJlc291cmNlQ29udGV4dDsKLSAgCi0gIC8vIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjbGllbnRDaG9pY2VzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb247Ci0gIHByaXZhdGUgYm9vbGVhbiBjbGllbnROZWVkRUFSXzsKLSAgCi0gIC8vIFdTRExTZWxlY3Rpb25XaWRnZXQKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBnZW5XU0lMOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIHdzaWxVUkk7Ci0gIAotICAvLyBXU0RMU2VsZWN0aW9uQ29uZGl0aW9uQ29tbWFuZAotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICAKLSAgLy8gV1NETFNlbGVjdGlvblRyZWVXaWRnZXQKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICB3c2RsVVJJOwotICAKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBpc0NsaWVudFNjZW5hcmlvXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBnZW5Qcm94eV8gPSB0cnVlOwotICBwcml2YXRlIFN0cmluZyBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgCi0gIC8vU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kCi0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckluc3RJZF87Ci0gIAotICBwdWJsaWMgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQoIGJvb2xlYW4gaXNDbGllbnRTY2VuYXJpbyApCi0gIHsKLSAgICBpc0NsaWVudFNjZW5hcmlvXyA9IGlzQ2xpZW50U2NlbmFyaW87Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoaXMgY29tbWFuZCBpcyBydW5uaW5nIGluIHRoZSBjbGllbnQgd2l6YXJkIGFuZAotICAgKiBmYWxzZSBpZiB0aGlzIGNvbW1hbmQgaXMgcnVubmluZyBpbiB0aGUgY3JlYXRlIHdlYiBzZXJ2aWNlIHdpemFyZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldElzQ2xpZW50U2NlbmFyaW8oKQotICB7Ci0gICAgcmV0dXJuIGlzQ2xpZW50U2NlbmFyaW9fOyAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UnVudGltZTJDbGllbnRUeXBlcyggU2VsZWN0aW9uTGlzdENob2ljZXMgY2hvaWNlcyApCi0gIHsKLSAgICBjbGllbnRDaG9pY2VzXyA9IGNob2ljZXM7ICAKLSAgfQotICAKLSAgcHVibGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudENob2ljZXNfOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIGlkcykKLSAgewotICAgIGNsaWVudElkc18gPSBpZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50SWRzXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkKFN0cmluZyBzZXJ2ZXJJbnN0SWQpIHsKLSAgCXRoaXMuc2VydmVySW5zdElkXyA9IHNlcnZlckluc3RJZDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQoKXsKLSAgCXJldHVybiB0aGlzLnNlcnZlckluc3RJZF87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsaWVudElzRXhpc3RpbmdTZXJ2ZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NsaWVudElzRXhpc3RpbmdTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudElkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRQcm9qZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBjbGllbnRDaG9pY2VzXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRQcm9qZWN0RUFSLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0RUFSKCkKLSAgewotICAgIHJldHVybiBjbGllbnRDaG9pY2VzXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRQcm9qZWN0VHlwZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudENob2ljZXNfLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsaWVudFJ1bnRpbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFJ1bnRpbWUoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudElkc18uZ2V0UnVudGltZUlkKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRTZXJ2ZXIuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50SWRzXy5nZXRTZXJ2ZXJJZCgpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFNlcnZlckluc3RhbmNlKCkKLSAgewotICAgIHJldHVybiBjbGllbnRJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKTsgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRFeGlzdGluZ1NlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZlckluc3RJZCl7Ci0gICAgCi0gICAgaWYgKGNsaWVudElkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpPT1udWxsKQotICAgICAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHNlcnZlckluc3RJZCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGdlbldTSUwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0dlbldTSUwoKQotICB7Ci0gICAgcmV0dXJuIGdlbldTSUw7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGdlbldTSUwKLSAgICogICAgICAgICAgICBUaGUgZ2VuV1NJTCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRHZW5XU0lMKGJvb2xlYW4gZ2VuV1NJTCkKLSAgewotICAgIHRoaXMuZ2VuV1NJTCA9IGdlbldTSUw7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZXNvdXJjZUNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGdldFJlc291cmNlQ29udGV4dCgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VDb250ZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSByZXNvdXJjZUNvbnRleHQKLSAgICogICAgICAgICAgICBUaGUgcmVzb3VyY2VDb250ZXh0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQ29udGV4dChSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0KQotICB7Ci0gICAgdGhpcy5yZXNvdXJjZUNvbnRleHQgPSByZXNvdXJjZUNvbnRleHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0ZXN0UHJveHlTZWxlY3RlZC4KLSAgICovCi0gIHB1YmxpYyBCb29sZWFuIGdldFRlc3RTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiB0ZXN0U2VydmljZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdGVzdFByb3h5U2VsZWN0ZWQKLSAgICogICAgICAgICAgICBUaGUgdGVzdFByb3h5U2VsZWN0ZWQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoQm9vbGVhbiB0ZXN0U2VydmljZSkKLSAgewotICAgIHRoaXMudGVzdFNlcnZpY2UgPSB0ZXN0U2VydmljZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzZGxVUkkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxVUkkoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdzZGxVUkkKLSAgICogICAgICAgICAgICBUaGUgd3NkbFVSSSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzaWxVUkkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdzaWxVUkkoKQotICB7Ci0gICAgcmV0dXJuIHdzaWxVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdzaWxVUkkKLSAgICogICAgICAgICAgICBUaGUgd3NpbFVSSSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2lsVVJJKFN0cmluZyB3c2lsVVJJKQotICB7Ci0gICAgdGhpcy53c2lsVVJJID0gd3NpbFVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYlNlcnZpY2VzUGFyc2VyLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAgIGlmICh3ZWJTZXJ2aWNlc1BhcnNlciAhPSBudWxsKQotICAgICAgcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgV2ViU2VydmljZXNQYXJzZXJFeHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gd2ViU2VydmljZXNQYXJzZXIKLSAgICogICAgICAgICAgICBUaGUgd2ViU2VydmljZXNQYXJzZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpCi0gIHsKLSAgICB0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBqMmVlVmVyc2lvbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SjJFRVZlcnNpb24oKQotICB7Ci0JICByZXR1cm4gajJlZVZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHZlcnNpb24gVGhlIGoyZWVWZXJzaW9uIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEoyRUVWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKQotICB7Ci0JICBqMmVlVmVyc2lvbiA9IHZlcnNpb247Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgYSBwcm94eSBzaG91bGQgYmUgZ2VuZXJhdGVkIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAgIHJldHVybiBnZW5Qcm94eV87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoIGJvb2xlYW4gZ2VuUHJveHkgKQotICB7Ci0gICAgZ2VuUHJveHlfID0gZ2VuUHJveHk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZShTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUpCi0gIHsKLSAgCXRoaXMubGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgPSBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGZhY2lsaXR5IHRvIGxhdW5jaC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUoKQotICB7Ci0gIAlyZXR1cm4gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhlIGNsaWVudCBwcm9qZWN0IG5lZWRzIGFuIEVBUiBwcm9qZWN0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0Q2xpZW50TmVlZEVBUigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50TmVlZEVBUl87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudE5lZWRFQVIoYm9vbGVhbiBjbGllbnROZWVkRUFSKQotICB7Ci0gICAgY2xpZW50TmVlZEVBUl8gPSBjbGllbnROZWVkRUFSOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbkZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NzYwMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5FeHRlbnNpb25GcmFnbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQgZXh0ZW5kcyBFeHRlbnNpb25GcmFnbWVudAoteyAgCi0gIHB1YmxpYyBDbGllbnRFeHRlbnNpb25GcmFnbWVudCgpCi0gIHsKLSAgICBzZXRFeHRlbnNpb25SZWdpc3RyeSggV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpICk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBDbGllbnRFeHRlbnNpb25GcmFnbWVudCggQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgc3VwZXIoIGZyYWdtZW50ICk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLSAgICBzZXRFeHRlbnNpb25JZHMoIG5ldyBTdHJpbmdbXXsgaWRzLmdldFR5cGVJZCgpLCBpZHMuZ2V0UnVudGltZUlkKCksIGlkcy5nZXRTZXJ2ZXJJZCgpIH0gKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjY2xvbmUoKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBDbGllbnRFeHRlbnNpb25GcmFnbWVudCggdGhpcyApOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiNjk5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFic3RyYWN0U3RhcnRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5XZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLQotcHVibGljIGNsYXNzIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nICBwcm94eUJlYW5fOwotICBwcml2YXRlIGJvb2xlYW4gZ2VuUHJveHlfOwotICBwcml2YXRlIFN0cmluZyBzZXRFbmRwb2ludE1ldGhvZDsKLQlwcml2YXRlIElXZWJTZXJ2aWNlQ2xpZW50IHdlYlNlcnZpY2VDbGllbnRfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGVhclByb2plY3ROYW1lXzsgIAotICBwcml2YXRlIElTZXJ2ZXIgZkV4aXN0aW5nU2VydmVyID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUoKXsKLSAgCXJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudil7Ci0gIAlTdGF0dXMgc3RhdCA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgdHJ5CXsKLSAgICAJCi0gICAgICAvLyBjaGVjayBleGlzdGluZ1NlcnZlcgotICAgICAgaWYgKGZFeGlzdGluZ1NlcnZlciE9bnVsbCkgewotICAgIAkKLSAgICAgICAgLy8gZ2V0IEVBUiBwcm9qZWN0Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGVhclByb2plY3ROYW1lXyE9bnVsbCAmJiBlYXJQcm9qZWN0TmFtZV8ubGVuZ3RoKCk+MCkgewotICAgICAgICAgIGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWVfKTsKLSAgICAJfSAgICAJCi0gICAgCQotICAgIAlBYnN0cmFjdFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyQ29tbWFuZCA9IG51bGw7Ci0gICAgCVdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgCXN0YXJ0U2VydmVyQ29tbWFuZCA9IChBYnN0cmFjdFN0YXJ0U2VydmVyKXJlZy5nZXRTZXJ2ZXJTdGFydEJ5VHlwZUlkKGZFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgCWlmIChlYXJQcm9qZWN0IT1udWxsKSB7Ci0gICAgCQlzdGFydFNlcnZlckNvbW1hbmQucnVuUHJlU2VydmVyQ29uZmlnKGZFeGlzdGluZ1NlcnZlciwgZWFyUHJvamVjdCk7Ci0gICAgCX0KLSAgICAgIH0KLSAgIAl9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UgKSB7Ci0gICAgICBJU3RhdHVzIGVtYmVkZGVkU3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICBzdGF0ID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdCk7Ci0gIAkJcmV0dXJuIHN0YXQ7Ci0gIAl9ICAJCi0gIAkKLSAgCXJldHVybiBzdGF0OwotICB9ICAKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpewotICAJCi0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7ICAJCi0gIAkKLSAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotICAgIElTZXJ2ZXIgZXhpc3RpbmdTZXJ2ZXIgPSBudWxsOwotICAgIGZFeGlzdGluZ1NlcnZlciA9IG51bGw7IAotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXIgdGhpc1NlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICBJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotICAgICAgU3RyaW5nIHRoaXNTZXJ2ZXJJZCA9IG51bGw7Ci0gICAgICBpZiAodGhpc1NlcnZlciE9bnVsbCkgewotICAgICAgCXdjID0gdGhpc1NlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotICAgICAgICB0aGlzU2VydmVySWQgPSAod2MhPW51bGwgPyB3Yy5nZXRJZCgpIDogbnVsbCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmICh0aGlzU2VydmVySWQuZXF1YWxzKGV4aXN0aW5nU2VydmVySWRfKSkKLSAgICAgICAgZXhpc3RpbmdTZXJ2ZXIgPSB0aGlzU2VydmVyOwotICAgIH0gICAgCQotICAgIHRyeQl7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGVhclByb2plY3ROYW1lXyE9bnVsbCAmJiBlYXJQcm9qZWN0TmFtZV8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgICAgfSAgICAJCi0gICAgCQotICAgICAgICBpZiAoZXhpc3RpbmdTZXJ2ZXIhPW51bGwpewotICAgCQkgIEFic3RyYWN0U3RhcnRTZXJ2ZXIgc3RhcnRTZXJ2ZXJDb21tYW5kID0gbnVsbDsKLSAgIAkJICBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSByZWcgPSBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAJICBzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChleGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgIAkgIGlmIChlYXJQcm9qZWN0IT1udWxsKXsKLSAgICAgCSAgCXN0YXJ0U2VydmVyQ29tbWFuZC5ydW5Qb3N0U2VydmVyQ29uZmlnKGV4aXN0aW5nU2VydmVyLCBlYXJQcm9qZWN0KTsKLSAgICAgCSAgCWZFeGlzdGluZ1NlcnZlciA9IGV4aXN0aW5nU2VydmVyOwotICAgICAJICB9Ci0gICAgICAgIH0KLSAgIAl9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UgKSB7Ci0gICAgCUlTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAJc3RhdHVzID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAJCXJldHVybiBzdGF0dXM7Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBzdGF0dXM7ICAgICAgCQotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm94eUJlYW4uCi0gICAqLwotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcm94eUJlYW4oKQotICB7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VDbGllbnRfLmdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuZ2V0SW1wbFVSTCgpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcHJveHlCZWFuIFRoZSBwcm94eUJlYW4gdG8gc2V0LgotICAgKi8KLQkvKgotICBwdWJsaWMgdm9pZCBzZXRQcm94eUJlYW4oU3RyaW5nIHByb3h5QmVhbikKLSAgewotICAgIHRoaXMucHJveHlCZWFuXyA9IHByb3h5QmVhbjsKLSAgfQotICAqLwotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgICAvL3JldHVybiBnZW5Qcm94eV87Ci0JCXJldHVybiB0cnVlOwotICB9Ci0gIAotCS8qCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoIGJvb2xlYW4gZ2VuUHJveHkgKQotICB7Ci0gICAgZ2VuUHJveHlfID0gZ2VuUHJveHk7Ci0gIH0KLSAgKi8KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNldEVuZHBvaW50TWV0aG9kLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXRFbmRwb2ludE1ldGhvZCgpCi0gIHsKLSAgICAvL3JldHVybiBzZXRFbmRwb2ludE1ldGhvZDsKLQkJcmV0dXJuICJzZXRFbmRwb2ludCI7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXRFbmRwb2ludE1ldGhvZCBUaGUgc2V0RW5kcG9pbnRNZXRob2QgdG8gc2V0LgotICAgKi8KLQkvKgotICBwdWJsaWMgdm9pZCBzZXRTZXRFbmRwb2ludE1ldGhvZChTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2QpCi0gIHsKLSAgICB0aGlzLnNldEVuZHBvaW50TWV0aG9kID0gc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIH0KLSAgKi8KLSAgLyoqCi0gICAqIEBwYXJhbSBlYXJQcm9qZWN0TmFtZSBUaGUgZWFyUHJvamVjdE5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdE5hbWUoU3RyaW5nIGVhclByb2plY3ROYW1lKSB7Ci0gIAl0aGlzLmVhclByb2plY3ROYW1lXyA9IGVhclByb2plY3ROYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gZXhpc3RpbmdTZXJ2ZXJJZCBUaGUgZXhpc3RpbmdTZXJ2ZXJJZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcklkKFN0cmluZyBleGlzdGluZ1NlcnZlcklkKSB7Ci0gIAl0aGlzLmV4aXN0aW5nU2VydmVySWRfID0gZXhpc3RpbmdTZXJ2ZXJJZDsKLSAgfSAgCi0JCi0JcHVibGljIHZvaWQgc2V0V2ViU2VydmljZUNsaWVudChJV2ViU2VydmljZUNsaWVudCB3c2MpCi0JewotCQl3ZWJTZXJ2aWNlQ2xpZW50XyA9IHdzYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4M2ZiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBCb29sZWFuICAgICAgICAgICAgICBzdGFydFNlcnZpY2U7Ci0gIHByaXZhdGUgQm9vbGVhbiAgICAgICAgICAgICAgdGVzdFNlcnZpY2U7Ci0gIHByaXZhdGUgQm9vbGVhbiAgICAgICAgICAgICAgcHVibGlzaFNlcnZpY2U7Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgICAgc2VydmljZUlkc187Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgc2VydmljZUNob2ljZXNfOwotICBwcml2YXRlIFN0cmluZyBqMmVlVmVyc2lvbjsKLSAgcHJpdmF0ZSBib29sZWFuIHNlcnZpY2VOZWVkRUFSXzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3c2RsUGFyc2VyXzsKLQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIGlkcykKLSAgewotICAgIHNlcnZpY2VJZHNfID0gaWRzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUV4aXN0aW5nU2VydmVySW5zdGFuY2VJZChTdHJpbmcgc2VydmVySW5zdElkKXsKLSAgICAKLSAgICBpZiAoc2VydmljZUlkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpPT1udWxsKQotICAgICAgc2VydmljZUlkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJJbnN0SWQpOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgVHlwZVJ1bnRpbWVTZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBvbgotICAgKiBwYWdlIDMgb2YgdGhlIHdpemFyZC4KLSAgICovCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdChTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjaG9pY2VzKQotICB7Ci0gICAgc2VydmljZUNob2ljZXNfID0gY2hvaWNlczsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHVibGlzaFNlcnZpY2UuCi0gICAqLwotICBwdWJsaWMgQm9vbGVhbiBnZXRQdWJsaXNoU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gcHVibGlzaFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHB1Ymxpc2hTZXJ2aWNlCi0gICAqICAgICAgICAgICAgVGhlIHB1Ymxpc2hTZXJ2aWNlIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hTZXJ2aWNlKEJvb2xlYW4gcHVibGlzaFNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLnB1Ymxpc2hTZXJ2aWNlID0gcHVibGlzaFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2ZXJJc0V4aXN0aW5nU2VydmVyLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2VydmVySXNFeGlzdGluZ1NlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZUlkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpICE9IG51bGw7Ci0gIH0KLQotICAvKioKLQotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlckluc3RhbmNlSWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVNlcnZlckluc3RhbmNlSWQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVyUHJvamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyUHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZUNob2ljZXNfLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclByb2plY3RFQVIuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlclByb2plY3RFQVIoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VDaG9pY2VzXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2ZXJSdW50aW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJSdW50aW1lKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclNlcnZlci4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyU2VydmVyKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmljZVNjZW5hcmlvSWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VTY2VuYXJpb0lkKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0YXJ0U2VydmljZS4KLSAgICovCi0gIHB1YmxpYyBCb29sZWFuIGdldFN0YXJ0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gc3RhcnRTZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBzdGFydFNlcnZpY2UKLSAgICogICAgICAgICAgICBUaGUgc3RhcnRTZXJ2aWNlIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0YXJ0U2VydmljZShCb29sZWFuIHN0YXJ0U2VydmljZSkKLSAgewotICAgIHRoaXMuc3RhcnRTZXJ2aWNlID0gc3RhcnRTZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGVzdFNlcnZpY2UuCi0gICAqLwotICBwdWJsaWMgQm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gdGVzdFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRlc3RTZXJ2aWNlCi0gICAqICAgICAgICAgICAgVGhlIHRlc3RTZXJ2aWNlIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKEJvb2xlYW4gdGVzdFNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLnRlc3RTZXJ2aWNlID0gdGVzdFNlcnZpY2U7Ci0gIH0KLQotICBwdWJsaWMgQm9vbGVhbiBnZXRQdWJsaXNoKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGoyZWVWZXJzaW9uLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSjJFRVZlcnNpb24oKQotICB7Ci0gIAlyZXR1cm4gajJlZVZlcnNpb247Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgajJlZVZlcnNpb24gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUoyRUVWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKQotICB7Ci0gIAlqMmVlVmVyc2lvbiA9IHZlcnNpb247Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhlIHdlYiBzZXJ2aWNlIHByb2plY3QgbmVlZHMgdG8gYmUgaW4gYW4gRUFSIHByb2plY3QuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTZXJ2aWNlTmVlZEVBUigpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZU5lZWRFQVJfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmVlZEVBUihib29sZWFuIHNlcnZpY2VOZWVkRUFSKQotICB7Ci0gICAgc2VydmljZU5lZWRFQVJfID0gc2VydmljZU5lZWRFQVI7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiB0aGUgd2ViIHNlcnZpY2UgcHJvamVjdCBpcyBhbiBFSkIgcHJvamVjdC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldElzU2VydmljZVByb2plY3RFSkIoKQotICB7Ci0gICAgLy9JZiB0aGUgdHlwZS9zZXJ2ZXIvcnVudGltZSBzdWdnZXN0cyB0aGF0IGFuIEVKQiBwcm9qZWN0Ci0gICAgLy9pcyByZXF1aXJlZCwgcmV0dXJuIHRydWUuCi0gICAgYm9vbGVhbiBlamJSZXF1aXJlZCA9IGZhbHNlOwotICAgIGJvb2xlYW4gZWpiUmVxdWlyZWQyID0gZmFsc2U7Ci0JLy8gcnNrcmVnCi0gICAgLy9XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZ2lzdHJ5ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBpZiAoc2VydmljZUlkc18gIT0gbnVsbCkKLSAgICB7ICAgICAgCi0gICAgICAvL1N0cmluZyBzZXJ2ZXJUeXBlSWQgPSB3c3NydFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VTZXJ2ZXJCeUZhY3RvcnlJZChzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJZCgpKS5nZXRJZCgpOwotCSAgLy9TdHJpbmcgc2VydmVyVHlwZUlkID0gd3NzcnRSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoc2VydmljZUlkc18uZ2V0U2VydmVySWQoKSkuZ2V0SWQoKTsKLSAgICAgIC8vZWpiUmVxdWlyZWQgPSB3c3NydFJlZ2lzdHJ5LnJlcXVpcmVzRUpCTW9kdWxlRm9yKHNlcnZlclR5cGVJZCwgc2VydmljZUlkc18uZ2V0UnVudGltZUlkKCksIHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpKTsKLQkgIGVqYlJlcXVpcmVkID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5yZXF1aXJlc0VKQk1vZHVsZUZvcihzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJZCgpLCBzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSwgc2VydmljZUlkc18uZ2V0VHlwZUlkKCkpOwotICAgICAgLy9lamJSZXF1aXJlZDIgPSB3c3NydFJlZ2lzdHJ5LnJlcXVpcmVzRUpCUHJvamVjdChzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSk7IAotCSAgZWpiUmVxdWlyZWQyID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5yZXF1aXJlc0VKQlByb2plY3Qoc2VydmljZUlkc18uZ2V0VHlwZUlkKCkpOwotICAgIH0KLQotCS8vIHJza3JlZwotICAgIHJldHVybiAoZWpiUmVxdWlyZWQgfHwgZWpiUmVxdWlyZWQyKTsgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzZGxQYXJzZXJfLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAgIGlmKCB3c2RsUGFyc2VyXyA9PSBudWxsICkKLSAgICB7Ci0gICAgICB3c2RsUGFyc2VyXyA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOyAgCi0gICAgfQotICAgIAotICAgIHJldHVybiB3c2RsUGFyc2VyXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHdzZGxQYXJzZXJfIFRoZSB3c2RsUGFyc2VyXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3c2RsUGFyc2VyICkKLSAgewotICAgIHdzZGxQYXJzZXJfID0gd3NkbFBhcnNlcjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbkZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9TZXJ2ZXJFeHRlbnNpb25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODljYWNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkV4dGVuc2lvbkZyYWdtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFeHRlbnNpb25GcmFnbWVudCBleHRlbmRzIEV4dGVuc2lvbkZyYWdtZW50Ci17ICAKLSAgcHVibGljIFNlcnZlckV4dGVuc2lvbkZyYWdtZW50KCkKLSAgewotICAgIHNldEV4dGVuc2lvblJlZ2lzdHJ5KCBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpICApOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU2VydmVyRXh0ZW5zaW9uRnJhZ21lbnQoIFNlcnZlckV4dGVuc2lvbkZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIHN1cGVyKCBmcmFnbWVudCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzICkKLSAgewotICAgIHNldEV4dGVuc2lvbklkcyggbmV3IFN0cmluZ1tdeyBpZHMuZ2V0VHlwZUlkKCksIGlkcy5nZXRSdW50aW1lSWQoKSwgaWRzLmdldFNlcnZlcklkKCkgfSApOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNjbG9uZSgpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IFNlcnZlckV4dGVuc2lvbkZyYWdtZW50KCB0aGlzICk7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTgzYzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQWJzdHJhY3RTdGFydFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLldlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotcHVibGljIGNsYXNzIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIC8vcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICB3c2RsVVJJXzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3c2RsUGFyc2VyXzsKLQlwcml2YXRlIElXZWJTZXJ2aWNlIAkJCXdlYlNlcnZpY2VfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGVhclByb2plY3ROYW1lXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfID0gZmFsc2U7Ci0gIAotICBwcml2YXRlIElTZXJ2ZXIgZkV4aXN0aW5nU2VydmVyID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUoKXsKLSAgCXJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudil7Ci0JCQotCi0gIAlTdGF0dXMgc3RhdCA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCQkKLQkJLy9Db21tZW50aW5nIG91dCBhbGwgZXh0cmFuc2VvdXMgc2V2ZXIgc3RhcnR1cHMKLQkJLyoKLSAgICB0cnkJewotICAgIAkKLSAgICAgIC8vIGNoZWNrIGV4aXN0aW5nU2VydmVyCi0gICAgICBpZiAoZkV4aXN0aW5nU2VydmVyIT1udWxsKSB7Ci0gICAgCQotICAgICAgICAvLyBnZXQgRUFSIHByb2plY3QKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSBudWxsOwotICAgICAgICBpZiAoZWFyUHJvamVjdE5hbWVfIT1udWxsICYmIGVhclByb2plY3ROYW1lXy5sZW5ndGgoKT4wKSB7Ci0gICAgICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgIAl9ICAgIAkKLSAgICAJCi0gICAgCUFic3RyYWN0U3RhcnRTZXJ2ZXIgc3RhcnRTZXJ2ZXJDb21tYW5kID0gbnVsbDsKLSAgICAJV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAJc3RhcnRTZXJ2ZXJDb21tYW5kID0gKEFic3RyYWN0U3RhcnRTZXJ2ZXIpcmVnLmdldFNlcnZlclN0YXJ0QnlUeXBlSWQoZkV4aXN0aW5nU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAJaWYgKGVhclByb2plY3QhPW51bGwpIHsKLSAgICAJCXN0YXJ0U2VydmVyQ29tbWFuZC5ydW5QcmVTZXJ2ZXJDb25maWcoZkV4aXN0aW5nU2VydmVyLCBlYXJQcm9qZWN0KTsKLSAgICAJfQotICAgICAgfQotICAgCX0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSApIHsKLSAgICAgIElTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgIHN0YXQgPSBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoZW1iZWRkZWRTdGF0dXMpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0KTsKLSAgCQlyZXR1cm4gc3RhdDsKLSAgCX0gIAkKLSAgCSovCi0gIAlyZXR1cm4gc3RhdDsKLSAgfSAgCi0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudil7Ci0gIAkKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsgIAkKLSAgCS8vIENvbW1lbnRpbmcgb3V0IGFsbCBleHRyYW5lb3VzIHNlcnZlciBzdGFydHVwcwotCQkvKgotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgSVNlcnZlciBleGlzdGluZ1NlcnZlciA9bnVsbDsKLSAgICBmRXhpc3RpbmdTZXJ2ZXIgPSBudWxsOyAKLSAgICBmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJU2VydmVyIHRoaXNTZXJ2ZXIgPSAoSVNlcnZlcilzZXJ2ZXJzW2ldOwotICAgICAgSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gbnVsbDsKLSAgICAgIFN0cmluZyB0aGlzU2VydmVySWQgPSBudWxsOwotICAgICAgaWYgKHRoaXNTZXJ2ZXIhPW51bGwpIHsKLSAgICAgIAl3YyA9IHRoaXNTZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLSAgICAgICAgdGhpc1NlcnZlcklkID0gKHdjIT1udWxsID8gd2MuZ2V0SWQoKSA6IG51bGwpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAodGhpc1NlcnZlcklkLmVxdWFscyhleGlzdGluZ1NlcnZlcklkXykpCi0gICAgICAgIGV4aXN0aW5nU2VydmVyID0gdGhpc1NlcnZlcjsKLSAgICB9ICAgIAkKLSAgICB0cnkJewotICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IG51bGw7Ci0gICAgICAgIGlmIChlYXJQcm9qZWN0TmFtZV8hPW51bGwgJiYgZWFyUHJvamVjdE5hbWVfLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lXyk7Ci0gICAgICAgIH0gICAgCQotICAgIAkKLSAgIAkJQWJzdHJhY3RTdGFydFNlcnZlciBzdGFydFNlcnZlckNvbW1hbmQgPSBudWxsOwotICAgCQlXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSByZWcgPSBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAJc3RhcnRTZXJ2ZXJDb21tYW5kID0gKEFic3RyYWN0U3RhcnRTZXJ2ZXIpcmVnLmdldFNlcnZlclN0YXJ0QnlUeXBlSWQoZXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgICAJaWYgKGVhclByb2plY3QhPW51bGwpIHsKLSAgICAgCQlzdGFydFNlcnZlckNvbW1hbmQucnVuUG9zdFNlcnZlckNvbmZpZyhleGlzdGluZ1NlcnZlciwgZWFyUHJvamVjdCk7Ci0gICAgIAkJZkV4aXN0aW5nU2VydmVyID0gZXhpc3RpbmdTZXJ2ZXI7Ci0gICAgIAl9Ci0gICAJfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlICkgewotICAgIAlJU3RhdHVzIGVtYmVkZGVkU3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgCXN0YXR1cyA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0gICAgCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgCQlyZXR1cm4gc3RhdHVzOwotICAJfQotICAJKi8KLSAgCXJldHVybiBzdGF0dXM7ICAgICAgCQotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbFVSSS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgICByZXR1cm4gd2ViU2VydmljZV8uZ2V0V2ViU2VydmljZUluZm8oKS5nZXRXc2RsVVJMKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdzZGxVUkkKLSAgICogICAgICAgICAgICBUaGUgd3NkbFVSSSB0byBzZXQuCi0gICAqLwotCS8qCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB3c2RsVVJJXyA9IHdzZGxVUkk7Ci0gIH0KLSAgKi8KLQkKLQlwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlKElXZWJTZXJ2aWNlIHdzKQotCXsKLQkJd2ViU2VydmljZV8gPSB3czsKLQl9Ci0JCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzZGxQYXJzZXJfLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAgIGlmKCB3c2RsUGFyc2VyXyA9PSBudWxsICkKLSAgICB7Ci0gICAgICB3c2RsUGFyc2VyXyA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOyAgCi0gICAgfQotICAgIAotICAgIHJldHVybiB3c2RsUGFyc2VyXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHdzZGxQYXJzZXJfIFRoZSB3c2RsUGFyc2VyXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3c2RsUGFyc2VyXykKLSAgewotICAgIHRoaXMud3NkbFBhcnNlcl8gPSB3c2RsUGFyc2VyXzsKLSAgfQotLyoqCi0gKiBAcGFyYW0gZWFyUHJvamVjdE5hbWUgVGhlIGVhclByb2plY3ROYW1lIHRvIHNldC4KLSAqLwotcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdE5hbWUoU3RyaW5nIGVhclByb2plY3ROYW1lKSB7Ci0JdGhpcy5lYXJQcm9qZWN0TmFtZV8gPSBlYXJQcm9qZWN0TmFtZTsKLX0KLS8qKgotICogQHBhcmFtIGV4aXN0aW5nU2VydmVySWQgVGhlIGV4aXN0aW5nU2VydmVySWQgdG8gc2V0LgotICovCi1wdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcklkKFN0cmluZyBleGlzdGluZ1NlcnZlcklkKSB7Ci0JdGhpcy5leGlzdGluZ1NlcnZlcklkXyA9IGV4aXN0aW5nU2VydmVySWQ7Ci19Ci0KLS8qKgotICogQHJldHVybiBSZXR1cm5zIHRoZSBpc1Jlc3RhcnRQcm9qZWN0TmVlZGVkLgotICovCi1wdWJsaWMgYm9vbGVhbiBnZXRJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkKCkgewotCXJldHVybiBpc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXzsKLX0KLS8qKgotICogQHBhcmFtIGlzUmVzdGFydFByb2plY3ROZWVkZWQgVGhlIGlzUmVzdGFydFByb2plY3ROZWVkZWQgdG8gc2V0LgotICovCi1wdWJsaWMgdm9pZCBzZXRJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkKGJvb2xlYW4gaXNSZXN0YXJ0UHJvamVjdE5lZWRlZCkgewotCXRoaXMuaXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZF8gPSBpc1Jlc3RhcnRQcm9qZWN0TmVlZGVkOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9BYnN0cmFjdE9iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9BYnN0cmFjdE9iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWIzMTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci17Ci0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikKLSAgewotICAgIC8vIHN1YmNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZAotICB9Ci0KLSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldE9iamVjdFNlbGVjdGlvbigpCi0gIHsKLSAgICAvLyBzdWJjbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLSAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgdmFsaWRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKQotICB7Ci0gICAgLy8gIHN1YmNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZAotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIC8vICBzdWJjbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvRUpCU2VsZWN0aW9uV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDRhOTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvRUpCU2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FQVJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLklFQVJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb2plY3QuRUpCTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvamVjdC5FSkJQcm9qZWN0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotcHVibGljIGNsYXNzIEVKQlNlbGVjdGlvbldpZGdldCBleHRlbmRzIEFic3RyYWN0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGltcGxlbWVudHMgSU9iamVjdFNlbGVjdGlvbldpZGdldAotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgcHJpdmF0ZSBDb21ibyBlYXJMaXN0OwotICBwcml2YXRlIEVKQlRhYmxlVmlld2VyIGJlYW5MaXN0OwotICBwcml2YXRlIEVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJQcm9qZWN0czsKLSAgcHJpdmF0ZSBJbnRlZ2VyIHNlbGVjdGVkQmVhbkluZGV4ID0gbnVsbDsKLSAgcHJpdmF0ZSBWZWN0b3IgZWpiQmVhbk5hbWVzOwotICBwcml2YXRlIFZlY3RvciBlamJQcm9qZWN0TmFtZXM7Ci0gIHByaXZhdGUgTGlzdGVuZXIgIHN0YXR1c0xpc3RlbmVyXzsKLSAgLyogQ09OVEVYVF9JRCBQRUJEMDAwMSBmb3IgdGhlIEVBUiBQcm9qZWN0cyBkcm9wLWRvd24gYm94ICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUEVCRF9FQVJfUFJPSkVDVFMgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLlBFQkQwMDAxIjsKLSAgLyogQ09OVEVYVF9JRCBQRUJEMDAwMiBmb3IgdGhlIHRhYmxlIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBiZWFuIG5hbWVzICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUEVCRF9UQUJMRV9CRUFOX05BTUVTID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5QRUJEMDAwMiI7Ci0KLSAgcHVibGljIEVKQlNlbGVjdGlvbldpZGdldCgpCi0gIHsKLSAgICBJUHJvamVjdFtdIHByb2plY3RzID0gSjJFRVV0aWxzLmdldEVBUlByb2plY3RzKCk7Ci0gICAgVmVjdG9yIGVhclZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBlYXJWZWN0b3IuYWRkKHByb2plY3RzW2ldLmdldE5hdHVyZShJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIGVhclByb2plY3RzID0gKEVBUk5hdHVyZVJ1bnRpbWVbXSkgZWFyVmVjdG9yLnRvQXJyYXkobmV3IEVBUk5hdHVyZVJ1bnRpbWVbMF0pOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZEJlYW4oKQotICB7Ci0gICAgaWYgKHNlbGVjdGVkQmVhbkluZGV4ICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIChTdHJpbmcpIChlamJCZWFuTmFtZXMuZWxlbWVudEF0KHNlbGVjdGVkQmVhbkluZGV4LmludFZhbHVlKCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkUHJvamVjdCgpCi0gIHsKLSAgICBpZiAoc2VsZWN0ZWRCZWFuSW5kZXggIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gKFN0cmluZykgKGVqYlByb2plY3ROYW1lcy5lbGVtZW50QXQoc2VsZWN0ZWRCZWFuSW5kZXguaW50VmFsdWUoKSkpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIHN0YXR1c0xpc3RlbmVyXyAgPSBzdGF0dXNMaXN0ZW5lcjsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgQ29tcG9zaXRlIHByb2plY3RDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIHByb2plY3RDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgcHJvamVjdENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0gICAgbmV3IExhYmVsKHByb2plY3RDb21wb3NpdGUsIFNXVC5OVUxMKS5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkxBQkVMX0VBUl9QUk9KRUNUUyIpKTsKLSAgICBlYXJMaXN0ID0gbmV3IENvbWJvKHByb2plY3RDb21wb3NpdGUsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICBlYXJMaXN0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIGVhckxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2dCkKLSAgICAgIHsKLSAgICAgICAgQ29tYm8gd2lkZ2V0ID0gKENvbWJvKSAoZXZ0LndpZGdldCk7Ci0gICAgICAgIHNldEJlYW5MaXN0KGVhclByb2plY3RzW3dpZGdldC5nZXRTZWxlY3Rpb25JbmRleCgpXSk7Ci0gICAgICAgIHNlbGVjdGVkQmVhbkluZGV4ID0gbnVsbDsKLSAgICAgICAgc3RhdHVzTGlzdGVuZXJfLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgfQotICAgIH0pOwotICAgIGFkZEVBUk5hbWVzVG9MaXN0KCk7Ci0gICAgZWFyTGlzdC5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX0VBUl9QUk9KRUNUUyIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGVhckxpc3QsIElORk9QT1BfUEVCRF9FQVJfUFJPSkVDVFMpOwotICAgIEdyb3VwIGJlYW5Db21wb3NpdGUgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBiZWFuQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgIGJlYW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotICAgIGJlYW5Db21wb3NpdGUuc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9FSkJfQkVBTl9OQU1FIikpOwotICAgIGJlYW5MaXN0ID0gbmV3IEVKQlRhYmxlVmlld2VyKGJlYW5Db21wb3NpdGUpOwotICAgIFRhYmxlIGJlYW5UYWJsZSA9IGJlYW5MaXN0LmdldFRhYmxlKCk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0gICAgZ2QuaGVpZ2h0SGludCA9IDEwMDsKLSAgICBiZWFuVGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgYmVhblRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpCi0gICAgICB7Ci0gICAgICAgIFRhYmxlIHRhYmxlID0gKFRhYmxlKSAoZXZ0LndpZGdldCk7Ci0gICAgICAgIHNlbGVjdGVkQmVhbkluZGV4ID0gbmV3IEludGVnZXIodGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0gICAgICAgIHN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBiZWFuVGFibGUuc2V0VG9vbFRpcFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiVE9PTFRJUF9UQUJMRV9CRUFOX05BTUVTIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYmVhblRhYmxlLCBJTkZPUE9QX1BFQkRfVEFCTEVfQkVBTl9OQU1FUyk7Ci0gICAgaWYgKGVhclByb2plY3RzICE9IG51bGwgJiYgZWFyUHJvamVjdHMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBzZXRCZWFuTGlzdChlYXJQcm9qZWN0c1swXSk7Ci0gICAgfQotICAgIGJlYW5UYWJsZS5nZXRDb2x1bW4oMCkucGFjaygpOwotICAgIGJlYW5UYWJsZS5nZXRDb2x1bW4oMSkucGFjaygpOwotICAgIC8vIFRoaXMgaXMgYSBkdW1teSBsYWJlbCB0aGF0IGZvcmNlcyB0aGUgc3RhdHVzIGxhYmVsIGludG8gdGhlIHNlY29uZAotICAgIC8vIGNvbHVtbi4KLSAgICBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTlVMTCkuc2V0VGV4dCgiIik7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkRUFSTmFtZXNUb0xpc3QoKQotICB7Ci0gICAgaWYgKGVhclByb2plY3RzICE9IG51bGwgJiYgZWFyUHJvamVjdHMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZWFyUHJvamVjdHMubGVuZ3RoOyBpbmRleCsrKQotICAgICAgewotICAgICAgICBlYXJMaXN0LmFkZChlYXJQcm9qZWN0c1tpbmRleF0uZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICBlYXJMaXN0LnNldFRleHQoZWFyTGlzdC5nZXRJdGVtKDApKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0QmVhbkxpc3QoRUFSTmF0dXJlUnVudGltZSBlYXJQcm9qZWN0KQotICB7Ci0gICAgVmVjdG9yIGVqYlByb2plY3RzID0gSjJFRVV0aWxzLmdldEVKQlByb2plY3RzKGVhclByb2plY3QpOwotICAgIFRhYmxlIGJlYW5UYWJsZSA9IGJlYW5MaXN0LmdldFRhYmxlKCk7Ci0gICAgYmVhblRhYmxlLnJlbW92ZUFsbCgpOwotICAgIGVqYkJlYW5OYW1lcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBlamJQcm9qZWN0TmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVqYlByb2plY3RzLnNpemUoKTsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBFSkJOYXR1cmVSdW50aW1lIGVqYk5hdHVyZSA9IChFSkJOYXR1cmVSdW50aW1lKSAoZWpiUHJvamVjdHMuZWxlbWVudEF0KGluZGV4KSk7Ci0gICAgICBFSkJQcm9qZWN0UmVzb3VyY2VzIGVqYlJlc291cmNlID0gbmV3IEVKQlByb2plY3RSZXNvdXJjZXMoZWpiTmF0dXJlLmdldFByb2plY3QoKSk7Ci0gICAgICBFSkJKYXIgamFyID0gZWpiUmVzb3VyY2UuZ2V0RUpCSmFyKCk7Ci0gICAgICBWZWN0b3IgYmVhbnMgPSBKMkVFVXRpbHMuZ2V0QmVhbk5hbWVzKGphcik7Ci0gICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBlamJOYXR1cmUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLSAgICAgIGVqYkJlYW5OYW1lcy5hZGRBbGwoYmVhbnMpOwotICAgICAgZWpiUHJvamVjdE5hbWVzLmFkZEFsbChDb2xsZWN0aW9ucy5uQ29waWVzKGJlYW5zLnNpemUoKSwgcHJvamVjdE5hbWUpKTsKLSAgICAgIGVqYlJlc291cmNlLmNsZWFudXAoKTsKLSAgICB9Ci0gICAgYmVhbkxpc3Quc2V0RGF0YShlamJCZWFuTmFtZXMsIGVqYlByb2plY3ROYW1lcyk7Ci0gICAgYmVhbkxpc3Quc2V0SW5wdXQoZWpiQmVhbk5hbWVzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikKLSAgewotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwgJiYgIWluaXRpYWxTZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBpbml0aWFsU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlc3Npb24pCi0gICAgICB7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IChTZXNzaW9uKSBvYmplY3Q7Ci0gICAgICAgIEVKQkphciBqYXIgPSBzZXNzaW9uLmdldEVqYkphcigpOwotICAgICAgICBpZiAoamFyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVhclByb2plY3RzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFZlY3RvciBlamJQcm9qZWN0cyA9IEoyRUVVdGlscy5nZXRFSkJQcm9qZWN0cyhlYXJQcm9qZWN0c1tpXSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZWpiUHJvamVjdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRUpCUHJvamVjdFJlc291cmNlcyBlamJSZXNvdXJjZSA9IG5ldyBFSkJQcm9qZWN0UmVzb3VyY2VzKCgoRUpCTmF0dXJlUnVudGltZSkgaXQubmV4dCgpKS5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICBpZiAoZWpiUmVzb3VyY2UuZ2V0RUpCSmFyKCkgPT0gamFyKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWFyTGlzdC5zZXRUZXh0KGVhclByb2plY3RzW2ldLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHNldEJlYW5MaXN0KGVhclByb2plY3RzW2ldKTsKLSAgICAgICAgICAgICAgICBiZWFuTGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IEludGVnZXJbXXtuZXcgSW50ZWdlcihlamJCZWFuTmFtZXMuaW5kZXhPZihzZXNzaW9uLmdldE5hbWUoKSkpfSkpOwotICAgICAgICAgICAgICAgIHNlbGVjdGVkQmVhbkluZGV4ID0gbmV3IEludGVnZXIoZWpiQmVhbk5hbWVzLmluZGV4T2Yoc2Vzc2lvbi5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICBlamJSZXNvdXJjZS5jbGVhbnVwKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVqYlJlc291cmNlLmNsZWFudXAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0T2JqZWN0U2VsZWN0aW9uKCkKLSAgewotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYmVhbkxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbCAhPSBudWxsICYmICFzZWwuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHNlbEVKQk5hbWUgPSAoU3RyaW5nKSBlamJCZWFuTmFtZXMuZ2V0KCgoSW50ZWdlcikgb2JqZWN0KS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgaWYgKHNlbEVKQk5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFZlY3RvciBlamJQcm9qZWN0cyA9IEoyRUVVdGlscy5nZXRFSkJQcm9qZWN0cyhlYXJQcm9qZWN0c1tlYXJMaXN0LmdldFNlbGVjdGlvbkluZGV4KCldKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZWpiUHJvamVjdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFSkJQcm9qZWN0UmVzb3VyY2VzIGVqYlJlc291cmNlID0gbmV3IEVKQlByb2plY3RSZXNvdXJjZXMoKChFSkJOYXR1cmVSdW50aW1lKSBpdC5uZXh0KCkpLmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBFSkJKYXIgamFyID0gZWpiUmVzb3VyY2UuZ2V0RUpCSmFyKCk7Ci0gICAgICAgICAgICBqYXZhLnV0aWwuTGlzdCBzZXNzaW9ucyA9IGphci5nZXRTZXNzaW9uQmVhbnMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQyID0gc2Vzc2lvbnMuaXRlcmF0b3IoKTsgaXQyLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IChTZXNzaW9uKSBpdDIubmV4dCgpOwotICAgICAgICAgICAgICBpZiAoc2VsRUpCTmFtZS5lcXVhbHMoc2Vzc2lvbi5nZXROYW1lKCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWpiUmVzb3VyY2UuY2xlYW51cCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgU2Vzc2lvbltde3Nlc3Npb259KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWpiUmVzb3VyY2UuY2xlYW51cCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFswXSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFNlbGVjdGVkUHJvamVjdCgpOwotICAgIGlmIChwcm9qZWN0TmFtZSAhPSBudWxsICYmIHByb2plY3ROYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKQotICB7ICAJCi0gICAgaWYgKHNlbGVjdGVkQmVhbkluZGV4ID09IG51bGwpCi0gICAgewotICAgIAlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwiIixTdGF0dXMuRVJST1IpOwotICAgIH0KLSAgICAKLSAgCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlRhYmxlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxODlmMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9FSkJUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi1wdWJsaWMgY2xhc3MgRUpCVGFibGVWaWV3ZXIgZXh0ZW5kcyBUYWJsZVZpZXdlcgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgcHJpdmF0ZSBWZWN0b3IgYmVhbk5hbWVzOwotICBwcml2YXRlIFZlY3RvciBwcm9qZWN0TmFtZXM7Ci0KLSAgcHVibGljIEVKQlRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBTdHJpbmcgY29sdW1uUHJvcGVydGllc1tdID0ge21zZ1V0aWxzLmdldE1lc3NhZ2UoIlRBQkxFX1RJVExFX0VKQl9CRUFOX05BTUVTIiksIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRBQkxFX1RJVExFX0VKQl9QUk9KRUNUX05BTUUiKX07Ci0gICAgVGFibGUgdGFibGUgPSBnZXRUYWJsZSgpOwotICAgIHRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgIFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvcGVydGllcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIGkpOwotICAgICAgY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc1tpXSk7Ci0gICAgICBjb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCA4MCwgdHJ1ZSkpOwotICAgIH0KLSAgICB0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotICAgIHNldENvbnRlbnRQcm92aWRlcihuZXcgRUpCQ29udGVudFByb3ZpZGVyKCkpOwotICAgIHNldExhYmVsUHJvdmlkZXIobmV3IEVKQkxhYmVsUHJvdmlkZXIoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREYXRhKFZlY3RvciBiZWFuTmFtZXMsIFZlY3RvciBwcm9qZWN0TmFtZXMpCi0gIHsKLSAgICB0aGlzLmJlYW5OYW1lcyA9IGJlYW5OYW1lczsKLSAgICB0aGlzLnByb2plY3ROYW1lcyA9IHByb2plY3ROYW1lczsKLSAgfQotICBwcml2YXRlIGNsYXNzIEVKQkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlcgotICB7Ci0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyKQotICAgICAgewotICAgICAgICBpbnQgaW5kZXggPSAoKEludGVnZXIpIG9iamVjdCkuaW50VmFsdWUoKTsKLSAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKFN0cmluZykgKGJlYW5OYW1lcy5lbGVtZW50QXQoaW5kZXgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIChTdHJpbmcpIChwcm9qZWN0TmFtZXMuZWxlbWVudEF0KGluZGV4KSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLSAgcHVibGljIGNsYXNzIEVKQkNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKGJlYW5OYW1lcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgc2l6ZSA9IGJlYW5OYW1lcy5zaXplKCk7Ci0gICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyBpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0W2luZGV4XSA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkLCBPYmplY3QgbmV3b2JqKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9IYW5kbGVyVGFibGVJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0hhbmRsZXJUYWJsZUl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiZTZmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0hhbmRsZXJUYWJsZUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgSGFuZGxlclRhYmxlSXRlbSB7Ci0gIAotICBwcml2YXRlIFN0cmluZyBoYW5kbGVyQ2xhc3NOYW1lOwotICBwcml2YXRlIFN0cmluZyBoYW5kbGVyTmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgcG9ydE5hbWU7Ci0gIHByaXZhdGUgaW50IGluZGV4OwotICAKLSAgcHJpdmF0ZSBQb3J0Q29tcG9uZW50IHBvcnQ7Ci0gIHByaXZhdGUgT2JqZWN0IGhhbmRsZXI7Ci0gIHByaXZhdGUgT2JqZWN0IHdzRGVzY1JlZjsKLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBoYW5kbGVyQ2xhc3NOYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRIYW5kbGVyQ2xhc3NOYW1lKCkgewotICAgIHJldHVybiBoYW5kbGVyQ2xhc3NOYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gaGFuZGxlckNsYXNzTmFtZSBUaGUgaGFuZGxlckNsYXNzTmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2xhc3NOYW1lKFN0cmluZyBoYW5kbGVyQ2xhc3NOYW1lKSB7Ci0gICAgdGhpcy5oYW5kbGVyQ2xhc3NOYW1lID0gaGFuZGxlckNsYXNzTmFtZTsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBoYW5kbGVyTmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlck5hbWUoKSB7Ci0gICAgcmV0dXJuIGhhbmRsZXJOYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gaGFuZGxlck5hbWUgVGhlIGhhbmRsZXJOYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJOYW1lKFN0cmluZyBoYW5kbGVyTmFtZSkgewotICAgIHRoaXMuaGFuZGxlck5hbWUgPSBoYW5kbGVyTmFtZTsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwb3J0LgotICAgKi8KLSAgcHVibGljIFBvcnRDb21wb25lbnQgZ2V0UG9ydCgpIHsKLSAgICByZXR1cm4gcG9ydDsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UG9ydChQb3J0Q29tcG9uZW50IHBvcnQpIHsKLSAgICB0aGlzLnBvcnQgPSBwb3J0OwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldEhhbmRsZXIoKSB7Ci0gICAgcmV0dXJuIGhhbmRsZXI7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXIoT2JqZWN0IGhhbmRsZXIpIHsKLSAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBvcnROYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpIHsKLSAgICByZXR1cm4gcG9ydE5hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBwb3J0TmFtZSBUaGUgcG9ydE5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHBvcnROYW1lKSB7Ci0gICAgdGhpcy5wb3J0TmFtZSA9IHBvcnROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaW5kZXguCi0gICAqLwotICBwdWJsaWMgaW50IGdldEluZGV4KCkgewotICAgIHJldHVybiBpbmRleDsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKLSAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NEZXNjUmVmLgotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRXc0Rlc2NSZWYoKSB7Ci0gICAgcmV0dXJuIHdzRGVzY1JlZjsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHdzRGVzY1JlZiBUaGUgd3NEZXNjUmVmIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdzRGVzY1JlZihPYmplY3Qgd3NEZXNjUmVmKSB7Ci0gICAgdGhpcy53c0Rlc2NSZWYgPSB3c0Rlc2NSZWY7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSU9iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9JT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNzg2MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9JT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhQ29udHJpYnV0b3I7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBleHRyYSBtZXRob2RzIHRoYXQgT2JqZWN0IFNlbGVjdGlvbiBXaWRnZXRzCi0gKiBuZWVkIHRvIGltcGxlbWVudC4gIE9iamVjdCBTZWxlY3Rpb24gV2lkZ2V0cyBhcmUgZGlzcGxheWVkIG9uIHBhZ2UgMgotICogb2YgdGhlIFdlYiBzZXJ2aWNlcyB3aXphcmQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9iamVjdFNlbGVjdGlvbldpZGdldCBleHRlbmRzIFdpZGdldERhdGFDb250cmlidXRvcgotewotICAvKioKLSAgICogVGhlIGZyYW1ld29yayB3aWxsIGNhbGwgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSBpbml0aWFsIHNlbGVjdGlvbgotICAgKiB2YWx1ZSB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQuCi0gICAqIAotICAgKiBAcGFyYW0gaW5pdGlhbFNlbGVjdGlvbiB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gdGhlIHVzZXIgc3BlY2lmaWVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKTsKLSAgCi0gIC8qKgotICAgKiBUaGUgaW50ZW50IG9mIHRoZSBPYmplY3QgU2VsZWN0aW9uIFdpZGdldCBpcyB0aGF0IHRoZSB1c2VyIGhhcwotICAgKiB0aGUgb3Bwb3J0dW5pdHkgY2hhbmdlL2ZpbmQgdGhlIG9iamVjdCB0aGF0IHRoZXkgd2FudCB0byB0dXJuIGludG8KLSAgICogYSBXZWIgc2VydmljZS4KLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgYW4gSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0IHRoYXQgdGhlIHVzZXIKLSAgICogd2FudCB0byB0dXJuIGludG8gYSBXZWIgc2VydmljZS4gIFRoaXMgb2JqZWN0IG1heSBiZSBkaWZmZXJlbnQgdGhhbgotICAgKiB0aGUgaW5pdGlhbFNlbGVjdGlvbiBwYXNzZWQgaW4gYnkgdGhlIHNldEluaXRpYWxTZWxlY3Rpb24gbWV0aG9kLgotICAgKi8KLSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldE9iamVjdFNlbGVjdGlvbigpOwotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBvYmplY3RTZWxlY3Rpb24gcGFyYW1ldGVyIGlzIHZhbGlkIGZvcgotICAgKiB0aGlzIE9iamVjdCBzZWxlY3Rpb24gd2lkZ2V0LiAgQW4gZXJyb3Igc3RhdHVzIHNob3VsZCBiZSByZXR1cm5lZAotICAgKiBpZiB0aGlzIG9iamVjdCBpcyBub3QgdmFsdWUuICBPdGhlcndpc2UsIGFuZCBvayBzdGF0dXMgc2hvdWxkIGJlCi0gICAqIHJldHVybmVkCi0gICAqIAotICAgKiBAcGFyYW0gb2JqZWN0U2VsZWN0aW9uIHRoZSBvYmplY3QgdG8gYmUgdmFsaWRhdGVkLgotICAgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbik7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgSVByb2plY3QgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0aW9uCi0gICAqIG9iamVjdCB0aGF0IHRoZSB1c2VyIGhhcyBjaG9zZW4gd2l0aCB0aGlzIHdpZGdldC4gIFRoZSB2YWx1ZSBjYW4gYmUgCi0gICAqIG51bGwgaWYgdGhlcmUgaXMgbm8gSVByb2plY3QgZm9yIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0phdmFCZWFuU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSmF2YUJlYW5TZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTgxNDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSmF2YUJlYW5TZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIEphdmFCZWFuU2VsZWN0aW9uVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotewotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbil2YWx1ZSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAoc2VsIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb21wdXRlRnVsbHlRdWFsaWZpZWRKYXZhTmFtZSgoSUZpbGUpc2VsKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWwgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KQotICAgICAgewotICAgICAgICBJUmVzb3VyY2UgcmVzID0gKChJQ29tcGlsYXRpb25Vbml0KXNlbCkuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb21wdXRlRnVsbHlRdWFsaWZpZWRKYXZhTmFtZSgoSUZpbGUpcmVzKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGNvbXB1dGVGdWxseVF1YWxpZmllZEphdmFOYW1lKElGaWxlIHJlc291cmNlKQotICB7Ci0gICAgSVBhdGggcGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0gICAgU3RyaW5nIGJhc2VuYW1lID0gcGF0aC5sYXN0U2VnbWVudCgpOwotICAgIFN0cmluZyBiZWFuQ2xhc3MgPSAiIjsKLSAgICBpZiAoYmFzZW5hbWUgIT0gbnVsbCAmJiBiYXNlbmFtZS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgU3RyaW5nIGJlYW5QYWNrYWdlID0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzLmdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKHBhdGgpOwotICAgICAgYmVhbkNsYXNzID0gKGJlYW5QYWNrYWdlID09IG51bGwgPyBiYXNlbmFtZSA6IChiZWFuUGFja2FnZSArICIuIiArIGJhc2VuYW1lKSk7Ci0gICAgICBpZiAoYmVhbkNsYXNzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXZhIikgfHwgYmVhbkNsYXNzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5jbGFzcyIpKQotICAgICAgICBiZWFuQ2xhc3MgPSBiZWFuQ2xhc3Muc3Vic3RyaW5nKDAsIGJlYW5DbGFzcy5sYXN0SW5kZXhPZignLicpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJlYW5DbGFzczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSmF2YUJlYW5TZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSmF2YUJlYW5TZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmZTUyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0phdmFCZWFuU2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLmltcGwuUG9ydENvbXBvbmVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLmltcGwuU2VydmljZUltcGxCZWFuSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5KYXZhUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5kaWFsb2cuRGlhbG9nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotcHVibGljIGNsYXNzIEphdmFCZWFuU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQgaW1wbGVtZW50cyBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci17Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIElQcm9qZWN0ICAgICAgICAgICBzZXJ2ZXJQcm9qZWN0XyA9IG51bGw7Ci0gIHByaXZhdGUgQ29tcG9zaXRlICAgICAgICAgIHBhcmVudF8gPSBudWxsOwotICBwcml2YXRlIElXaXphcmRDb250YWluZXIgICBjb250ZXh0XyA9IG51bGw7Ci0gIHByaXZhdGUgSmF2YVJlc291cmNlRmlsdGVyIGZpbHRlcl8gPSBuZXcgSmF2YVJlc291cmNlRmlsdGVyKCk7Ci0gIHByaXZhdGUgSVJlc291cmNlICAgICAgICAgIGluaXRpYWxSZXNvdXJjZV8gPSBudWxsOwotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotICAKLSAgLypDT05URVhUX0lEIFBCQ0wwMDAxIGZvciB0aGUgQmVhbiBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUEJDTF9QQUdFID0gIlBCQ0wwMDAxIjsKLSAgCi0gIHByaXZhdGUgVGV4dCBiZWFuQ2xhc3NUZXh0XzsKLSAgLypDT05URVhUX0lEIFBCQ0wwMDAyIGZvciB0aGUgQmVhbiBTZWxlY3Rpb24gZmllbGQgb2YgdGhlIEJlYW4gU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BCQ0xfVEVYVF9CRUFOX0NMQVNTID0gIlBCQ0wwMDAyIjsKLQotICBwcml2YXRlIEJ1dHRvbiBiZWFuQ2xhc3NCcm93c2VCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUEJDTDAwMDMgZm9yIHRoZSBCZWFuIENsYXNzIEJyb3dzZSBidXR0b24gb2YgdGhlIEJlYW4gU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFID0gIlBCQ0wwMDAzIjsKLQotICBwcml2YXRlIEJ1dHRvbiBiZWFuUmVzb3VyY2VCcm93c2VCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUEJDTDAwMDQgZm9yIHRoZSBCZWFuIFJlc291cmNlIEJyb3dzZSBidXR0b24gb2YgdGhlIEJlYW4gU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fUkVTT1VSQ0VfQlJPV1NFID0gIlBCQ0wwMDA0IjsKLSAgIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXR1c0xpc3RlbmVyOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBwbHVnaW5JZF8gKTsgCi0gICAgCi0gICAgcGFyZW50XyA9IHBhcmVudDsKLSAgICAKLSAgICBDb21wb3NpdGUgZ3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCA0ICk7Ci0gICAgCi0gICAgZ3JvdXAuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUEJDTF9QQUdFIikgKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBncm91cCwgcGx1Z2luSWRfICsgIi4iICsgSU5GT1BPUF9QQkNMX1BBR0UgKTsKLSAgICAKLSAgICBiZWFuQ2xhc3NUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggZ3JvdXAsICJMQUJFTF9CRUFOX0NMQVNTX05BTUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QQkNMX1RFWFRfQkVBTl9DTEFTUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDTF9URVhUX0JFQU5fQ0xBU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICBiZWFuQ2xhc3NUZXh0Xy5hZGRNb2RpZnlMaXN0ZW5lcigKLSAgICAgIG5ldyBNb2RpZnlMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZU1vZGlmeUJlYW5DbGFzc1RleHQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gICAgCi0gICAgYmVhbkNsYXNzQnJvd3NlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggZ3JvdXAsICJCVVRUT05fQlJPV1NFX0NMQVNTRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFICk7Ci0gICAgYmVhbkNsYXNzQnJvd3NlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCcm93c2VDbGFzc2VzKCk7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgCi0gICAgYmVhblJlc291cmNlQnJvd3NlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggZ3JvdXAsICJCVVRUT05fQlJPV1NFX0ZJTEVTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QQkNMX0JVVFRPTl9CRUFOX1JFU09VUkNFX0JST1dTRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX1JFU09VUkNFX0JST1dTRSApOwotICAgIGJlYW5SZXNvdXJjZUJyb3dzZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQnJvd3NlRmlsZXMoKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1vZGlmeUJlYW5DbGFzc1RleHQoKQotICB7Ci0gICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgc2VydmVyUHJvamVjdF8gPSBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb3dzZUNsYXNzZXMoKQotICB7Ci0gICAgU2hlbGwgc2hlbGwgPSBwYXJlbnRfLmdldFNoZWxsKCk7Ci0gICAgSVR5cGUgaXR5cGUgPSBEaWFsb2dVdGlscy5icm93c2VDbGFzc2VzQXNJVHlwZShzaGVsbCwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpLCBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKSk7Ci0gICAgaWYgKGl0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgYmVhbkNsYXNzVGV4dF8uc2V0VGV4dChpdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlIHJlcyA9IGl0eXBlLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotICAgICAgICBpZiAocmVzICE9IG51bGwpCi0gICAgICAgICAgc2VydmVyUHJvamVjdF8gPSByZXMuZ2V0UHJvamVjdCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgc2VydmVyUHJvamVjdF8gPSBudWxsOwotICAgICAgfQotICAgICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpCi0gICAgICB7Ci0gICAgICAgIHNlcnZlclByb2plY3RfID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2VGaWxlcygpCi0gIHsKLSAgICBJUmVzb3VyY2UgdG9wUmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKTsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBEaWFsb2dVdGlscy5icm93c2VSZXNvdXJjZXMoIHBhcmVudF8uZ2V0U2hlbGwoKSwgdG9wUmVzb3VyY2UsIGluaXRpYWxSZXNvdXJjZV8sIGZpbHRlcl8gKTsKLSAgICBzZXRCZWFuQ2xhc3MocmVzb3VyY2UpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0QmVhbkNsYXNzKElSZXNvdXJjZSByZXNvdXJjZSkKLSAgewotICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUgKQotICAgIHsKLSAgICAgIElQYXRoICBwYXRoICAgICA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICBTdHJpbmcgYmFzZW5hbWUgPSBwYXRoLmxhc3RTZWdtZW50KCk7Ci0gICAgICAKLSAgICAgIGlmKCBiYXNlbmFtZSAhPSBudWxsICYmIGJhc2VuYW1lLmxlbmd0aCgpID4gMCApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBiZWFuUGFja2FnZSA9IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlscy5nZXRKYXZhUmVzb3VyY2VQYWNrYWdlTmFtZShwYXRoKTsKLSAgICAgICAgU3RyaW5nIGJlYW5DbGFzcyA9IChiZWFuUGFja2FnZSA9PSBudWxsID8gYmFzZW5hbWUgOiAoYmVhblBhY2thZ2UgKyAiLiIgKyBiYXNlbmFtZSkpOwotICAgICAgICAKLSAgICAgICAgaWYoIGJlYW5DbGFzcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamF2YSIpIHx8IGJlYW5DbGFzcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuY2xhc3MiICkgKQotICAgICAgICB7Ci0gICAgICAgICAgYmVhbkNsYXNzID0gYmVhbkNsYXNzLnN1YnN0cmluZyggMCwgYmVhbkNsYXNzLmxhc3RJbmRleE9mKCcuJykgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYmVhbkNsYXNzVGV4dF8uc2V0VGV4dChiZWFuQ2xhc3MpOwotICAgICAgICBzZXJ2ZXJQcm9qZWN0XyA9ICBSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihwYXRoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0QmVhbkNsYXNzKFNlcnZpY2VJbXBsQmVhbkltcGwgc2VydmljZUltcGwpCi0gIHsKLSAgICBpZiggc2VydmljZUltcGwgIT0gbnVsbCApCi0gICAgewotICAgICAgRU9iamVjdCBlT2JqZWN0ID0gc2VydmljZUltcGwuZUNvbnRhaW5lcigpOwotICAgICAgaWYoZU9iamVjdCBpbnN0YW5jZW9mIFBvcnRDb21wb25lbnRJbXBsKXsKLSAgICAgIAlQb3J0Q29tcG9uZW50SW1wbCBwY2kgPSAoUG9ydENvbXBvbmVudEltcGwpZU9iamVjdDsKLSAgICAgIAlTdHJpbmcgYmVhbkNsYXNzID0gcGNpLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotICAgICAgCWJlYW5DbGFzc1RleHRfLnNldFRleHQoYmVhbkNsYXNzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXRCZWFuQ2xhc3MoQmVhbkxpbmsgc2VydmljZUltcGwpCi0gIHsKLSAgICBpZiggc2VydmljZUltcGwgIT0gbnVsbCApCi0gICAgewotICAgICAgRU9iamVjdCBlT2JqZWN0ID0gc2VydmljZUltcGwuZUNvbnRhaW5lcigpOwotICAgICAgaWYoZU9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsQmVhbkltcGwpewotICAgICAgCXNldEJlYW5DbGFzcygoU2VydmljZUltcGxCZWFuSW1wbCllT2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikKLSAgewotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwgJiYgIWluaXRpYWxTZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBpbml0aWFsU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgCUlGaWxlIGlGaWxlID0gKElGaWxlKW9iamVjdDsKLSAgICAgIAlTdHJpbmcgZmlsZUV4dCA9IGlGaWxlLmdldEZpbGVFeHRlbnNpb24oKS50b0xvd2VyQ2FzZSgpOwotICAgICAgCWlmIChmaWxlRXh0LmVxdWFscygiamF2YSIpIHx8IGZpbGVFeHQuZXF1YWxzKCJjbGFzcyIpKQotICAgICAgICAgIHNldEJlYW5DbGFzcyhpRmlsZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KQotICAgICAgCXNldEJlYW5DbGFzcygoKElDb21waWxhdGlvblVuaXQpb2JqZWN0KS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsQmVhbkltcGwpCi0gICAgICAJc2V0QmVhbkNsYXNzKChTZXJ2aWNlSW1wbEJlYW5JbXBsKW9iamVjdCk7Ci0gICAgICBlbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEJlYW5MaW5rKQotICAgICAgCXNldEJlYW5DbGFzcygoQmVhbkxpbmspb2JqZWN0KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGJlYW5DbGFzc1RleHRfLmdldFRleHQoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBzZXJ2ZXJQcm9qZWN0XzsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKQotICB7Ci0gICAgU3RyaW5nIGJlYW5DbGFzc05hbWUgPSBiZWFuQ2xhc3NUZXh0Xy5nZXRUZXh0KCkudHJpbSgpOwotICAgIGlmIChiZWFuQ2xhc3NOYW1lID09IG51bGwgfHwgYmVhbkNsYXNzTmFtZS5sZW5ndGgoKSA8PSAwKQotICAgIHsKLSAgICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX01TR19CRUFOX0NBTk5PVF9CRV9FTVBUWSIpLCBTdGF0dXMuRVJST1IpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgdmFsaWRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGNhNjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5JV2ViU2VydmljZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBPYmplY3RTZWxlY3Rpb25GcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQgaW1wbGVtZW50cyBDb25kaXRpb24KLXsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlcjsKLSAgcHJpdmF0ZSBib29sZWFuIGhhc09iamVjdFNlbGVjdGlvbldpZGdldDsKLQotICBwdWJsaWMgT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBCb29sZWFuRnJhZ21lbnQgYm9vbEZyYWdtZW50ID0gbmV3IEJvb2xlYW5GcmFnbWVudChuZXcgU2ltcGxlRnJhZ21lbnQoIk9iamVjdFNlbGVjdGlvbldpZGdldCIpLCBuZXcgU2ltcGxlRnJhZ21lbnQoIiIpLCB0aGlzKTsKLSAgICBhZGQoYm9vbEZyYWdtZW50KTsKLSAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kKCksICIiKSk7Ci0gICAgaGFzT2JqZWN0U2VsZWN0aW9uV2lkZ2V0ID0gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCByZXRyaWV2ZSB0aGUgZGF0YSBtYXBwaW5ncyBmb3IgdGhpcyBjb21tYW5kIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIE9iamVjdFNlbGVjdGlvbldpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIk9iamVjdFNlbGVjdGlvbiIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbkZyYWdtZW50LmNsYXNzLCAiVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBPYmplY3RTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbkZyYWdtZW50LmNsYXNzLCAiVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJQcm9qZWN0IiwgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gaGFzT2JqZWN0U2VsZWN0aW9uV2lkZ2V0OwotICB9Ci0KLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiB0eXBlUnVudGltZVNlcnZlcjsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdHlwZVJ1bnRpbWVTZXJ2ZXIgVGhlIHR5cGVSdW50aW1lU2VydmVyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyKQotICB7Ci0gICAgdGhpcy50eXBlUnVudGltZVNlcnZlciA9IHR5cGVSdW50aW1lU2VydmVyOwotICAgIGlmICh0eXBlUnVudGltZVNlcnZlciAhPSBudWxsKQotICAgIHsKLQkgIC8vIHJza3JlZwotICAgICAgLy9JV2ViU2VydmljZVR5cGUgd3N0ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRXZWJTZXJ2aWNlVHlwZUJ5SWQodHlwZVJ1bnRpbWVTZXJ2ZXIuZ2V0VHlwZUlkKCkpOwotCSAgSVdlYlNlcnZpY2VUeXBlIHdzdCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVR5cGVCeUlkKHR5cGVSdW50aW1lU2VydmVyLmdldFR5cGVJZCgpKTsKLQkgIC8vIHJza3JlZwotICAgICAgaWYgKHdzdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgPSB3c3QuZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCk7Ci0gICAgICAgIGhhc09iamVjdFNlbGVjdGlvbldpZGdldCA9IG9iamVjdFNlbGVjdGlvbldpZGdldElkICE9IG51bGwgJiYgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQubGVuZ3RoKCkgPiAwOwotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MGNjMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLklXZWJTZXJ2aWNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfOwotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICAgb2JqZWN0U2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IG9iamVjdFNlbGVjdGlvbldpZGdldF87Ci0gIHByaXZhdGUgSVByb2plY3QgICAgICAgICAgICAgICBwcm9qZWN0XzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciAgICAgIHBhcnNlcl87Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIC8vIFRyYW5zZm9ybWF0aW9uCi0gICAgaWYgKG9iamVjdFNlbGVjdGlvbldpZGdldElkXyAhPSBudWxsICYmIG9iamVjdFNlbGVjdGlvbldpZGdldElkXy5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKG9iamVjdFNlbGVjdGlvbldpZGdldElkXy5lcXVhbHMoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB0cmFuc2Zvcm1lcklkID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm1lciIpOwotICAgICAgICAgIGlmICh0cmFuc2Zvcm1lcklkICE9IG51bGwgJiYgdHJhbnNmb3JtZXJJZC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE9iamVjdCB0cmFuc2Zvcm1lciA9IGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oInRyYW5zZm9ybWVyIik7Ci0gICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lciBpbnN0YW5jZW9mIFRyYW5zZm9ybWVyKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHRyYW5zZm9ybWVkU2VsZWN0aW9uID0gKChUcmFuc2Zvcm1lcil0cmFuc2Zvcm1lcikudHJhbnNmb3JtKG9iamVjdFNlbGVjdGlvbl8pOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lZFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uXyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbil0cmFuc2Zvcm1lZFNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCQotICAgIC8vIFZhbGlkYXRpb24KLSAgICBTdGF0dXMgc3RhdHVzID0gKG9iamVjdFNlbGVjdGlvbldpZGdldF8gIT0gbnVsbCkgPyBvYmplY3RTZWxlY3Rpb25XaWRnZXRfLnZhbGlkYXRlU2VsZWN0aW9uKGdldE9iamVjdFNlbGVjdGlvbigpKSA6IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBTdGF0dXMuT0spCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIHNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLQkKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0eXBlUnVudGltZVNlcnZlciBUaGUgdHlwZVJ1bnRpbWVTZXJ2ZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXIpCi0gIHsKLSAgICBpZiAodHlwZVJ1bnRpbWVTZXJ2ZXIgIT0gbnVsbCkKLSAgICB7Ci0JICAvLyByc2tyZWcKLSAgICAgIC8vSVdlYlNlcnZpY2VUeXBlIHdzdCA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0V2ViU2VydmljZVR5cGVCeUlkKHR5cGVSdW50aW1lU2VydmVyLmdldFR5cGVJZCgpKTsKLQkgIElXZWJTZXJ2aWNlVHlwZSB3c3QgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VUeXBlQnlJZCh0eXBlUnVudGltZVNlcnZlci5nZXRUeXBlSWQoKSk7Ci0JICAvLyByc2tyZWcKLSAgICAgIGlmICh3c3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfID0gd3N0LmdldE9iamVjdFNlbGVjdGlvbldpZGdldCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKG9iamVjdFNlbGVjdGlvbldpZGdldElkXyAhPSBudWxsICYmIG9iamVjdFNlbGVjdGlvbldpZGdldElkXy5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IE9iamVjdFNlbGVjdGlvblJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfLmVxdWFscyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoImlkIikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBlbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldF8gPSAoSU9iamVjdFNlbGVjdGlvbldpZGdldClvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24uCi0gICAqLwotICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0T2JqZWN0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBvYmplY3RTZWxlY3Rpb25fOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gc2VsZWN0aW9uIFRoZSBzZWxlY3Rpb24gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T2JqZWN0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikKLSAgewotICAgIG9iamVjdFNlbGVjdGlvbl8gPSBvYmplY3RTZWxlY3Rpb247Ci0gICAgCi0gICAgLy9TZXQgdGhlIHByb2plY3QgaWYgeW91IGNhbgotICAgIGlmIChwcm9qZWN0Xz09bnVsbCkKLSAgICB7Ci0gICAgICBwcm9qZWN0XyA9IGdldFByb2plY3RGcm9tT2JqZWN0U2VsZWN0aW9uKG9iamVjdFNlbGVjdGlvbik7Ci0gICAgfQotICAgIAotICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBXU0RMIHNlbGVjdGlvbiBvYmplY3QuICBJZiBpdCBpcyB3ZSBuZWVkCi0gICAgLy8gdG8gdW53cmFwIGl0LgotICAgIGlmKCBvYmplY3RTZWxlY3Rpb24gIT0gbnVsbCAmJiAhb2JqZWN0U2VsZWN0aW9uLmlzRW1wdHkoKSApCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IG9iamVjdFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIAotICAgICAgaWYoIG9iamVjdCBpbnN0YW5jZW9mIFdTRExTZWxlY3Rpb25XcmFwcGVyICkKLSAgICAgIHsKLSAgICAgICAgV1NETFNlbGVjdGlvbldyYXBwZXIgd3NkbFdyYXBwZXIgPSAoV1NETFNlbGVjdGlvbldyYXBwZXIpb2JqZWN0OwotICAgICAgICAKLSAgICAgICAgb2JqZWN0U2VsZWN0aW9uXyA9IHdzZGxXcmFwcGVyLndzZGxTZWxlY3Rpb247Ci0gICAgICAgIHBhcnNlcl8gICAgICAgICAgPSB3c2RsV3JhcHBlci5wYXJzZXI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gcHJvamVjdF87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRoaXMucHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyc2VyXy4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgICByZXR1cm4gcGFyc2VyXzsKLSAgfQotICAKLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbU9iamVjdFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0UHJvamVjdEZyb21PYmplY3RTZWxlY3Rpb24gLSByZXNvdXJjZSA9ICIrcmVzb3VyY2UpOwotICAgICAgICAgIGlmIChyZXNvdXJjZT09bnVsbCkgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICBJUHJvamVjdCBwID0gUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0JCSAgU3lzdGVtLm91dC5wcmludGxuKCJPYmplY3RTZWxlY3Rpb24gcHJvamVjdCA9ICIrcCk7Ci0gICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgIH0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNkYmQ2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L09iamVjdFNlbGVjdGlvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1wdWJsaWMgY2xhc3MgT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkgaW5zdGFuY2U7Ci0gIHByaXZhdGUgc3RhdGljIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzOwotICAKLSAgcHJpdmF0ZSBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeSgpCi0gIHsKLSAgICBlbGVtZW50cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAib2JqZWN0U2VsZWN0aW9uV2lkZ2V0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgICBpbnN0YW5jZSA9IG5ldyBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeSgpOwotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YTE2NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuSVdlYlNlcnZpY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotCi1wdWJsaWMgY2xhc3MgT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQgaW1wbGVtZW50cyBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci17Ci0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHM7Ci0gIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLSAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcjsKLSAgcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlOwotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyOwotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb247Ci0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgcHJpdmF0ZSBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGNoaWxkOwotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsKLQkgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IC0gLSAxIik7CSAgCi0gICAgZWxlbWVudHMgPSBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIHRoaXMuc3RhdHVzTGlzdGVuZXIgPSBzdGF0dXNMaXN0ZW5lcjsKLSAgICBjb21wb3NpdGUgPSBudWxsOwotCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IC0gLSAyIik7CQkKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSB0eXBlUnVudGltZVNlcnZlciBUaGUgdHlwZVJ1bnRpbWVTZXJ2ZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXIpCi0gIHsKLSAgICB0aGlzLnR5cGVSdW50aW1lU2VydmVyID0gdHlwZVJ1bnRpbWVTZXJ2ZXI7Ci0gICAgaWYgKGNvbXBvc2l0ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0gICAgICBjaGlsZCA9IG51bGw7Ci0gICAgfQotICAgIGlmICh0eXBlUnVudGltZVNlcnZlciAhPSBudWxsKQotICAgIHsKLQkJLy8gcnNrcmVnCi0gICAgICAvL0lXZWJTZXJ2aWNlVHlwZSB3c3QgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFdlYlNlcnZpY2VUeXBlQnlJZCh0eXBlUnVudGltZVNlcnZlci5nZXRUeXBlSWQoKSk7Ci0JICBJV2ViU2VydmljZVR5cGUgd3N0ID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRXZWJTZXJ2aWNlVHlwZUJ5SWQodHlwZVJ1bnRpbWVTZXJ2ZXIuZ2V0VHlwZUlkKCkpOwotCSAgLy8gcnNrcmVnCi0gICAgICBpZiAod3N0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZCA9IHdzdC5nZXRPYmplY3RTZWxlY3Rpb25XaWRnZXQoKTsKLSAgICAgICAgaWYgKG9iamVjdFNlbGVjdGlvbldpZGdldElkICE9IG51bGwgJiYgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQuZXF1YWxzKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElPYmplY3RTZWxlY3Rpb25XaWRnZXQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgQ29udHJvbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgICAgICAgICAgICAgICAgaW50IHggPSBzaGVsbC5nZXRTaXplKCkueDsKLSAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgICAgICAgICAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgICAgICAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgICAgICAgICAgICBjaGlsZCA9IChJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0KW9iamVjdDsKLSAgICAgICAgICAgICAgICAgIGNoaWxkLmFkZENvbnRyb2xzKGNvbXBvc2l0ZSwgc3RhdHVzTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgY2hpbGQuc2V0SW5pdGlhbFNlbGVjdGlvbihpbml0aWFsU2VsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRTaXplKHgtMjAsIGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnkpOwotICAgICAgICAgICAgICAgICAgcGFyZW50LnNldFNpemUoeC0xMCwgcGFyZW50LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueSk7Ci0gICAgICAgICAgICAgICAgICBzaGVsbC5zZXRTaXplKHgsIHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueSk7Ci0gICAgICAgICAgICAgICAgICBzaGVsbC5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICBzaGVsbC5yZWRyYXcoKTsKLSAgICAgICAgICAgICAgICAgIHNoZWxsLnVwZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gKGNoaWxkICE9IG51bGwpID8gY2hpbGQuZ2V0U3RhdHVzKCkgOiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikKLSAgewotICAgIHRoaXMuaW5pdGlhbFNlbGVjdGlvbiA9IGluaXRpYWxTZWxlY3Rpb247Ci0gICAgcHJvamVjdCA9IGdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbihpbml0aWFsU2VsZWN0aW9uKTsKLSAgICBpZiAoY2hpbGQgIT0gbnVsbCkKLSAgICAgIGNoaWxkLnNldEluaXRpYWxTZWxlY3Rpb24oaW5pdGlhbFNlbGVjdGlvbik7Ci0gIH0KLSAgICAKLSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldE9iamVjdFNlbGVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKGNoaWxkICE9IG51bGwpID8gY2hpbGQuZ2V0T2JqZWN0U2VsZWN0aW9uKCkgOiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikKLSAgewotICAgIHJldHVybiAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC52YWxpZGF0ZVNlbGVjdGlvbihvYmplY3RTZWxlY3Rpb24pIDogbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIGlmIChjaGlsZCAhPSBudWxsKQotICAgIHsKLSAgICAgIElQcm9qZWN0IHAgPSBjaGlsZC5nZXRQcm9qZWN0KCk7Ci0gICAgICBpZiAocCAhPSBudWxsKQotICAgICAgICByZXR1cm4gcDsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7IAotICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgaWYgKHJlc291cmNlPT1udWxsKSAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIElQcm9qZWN0IHAgPSBSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1RpbWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1RpbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NjEyMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9UaW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgVGltZXIgZXh0ZW5kcyBUaHJlYWQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgVGltZXIgaW5zdGFuY2UgPSBudWxsOwotICBwcml2YXRlIGZpbmFsIGxvbmcgT05FX1NFQ09ORCA9IDEwMDA7Ci0gIHByaXZhdGUgbG9uZyByZWZyZXNoVGltZTsKLSAgcHJpdmF0ZSBEaXNwbGF5IGRpc3BsYXk7Ci0gIHByaXZhdGUgUnVubmFibGUgcnVubmFibGU7Ci0KLSAgcHJpdmF0ZSBUaW1lcihEaXNwbGF5IGRpc3BsYXksIFJ1bm5hYmxlIHJ1bm5hYmxlKQotICB7Ci0gICAgdGhpcy5kaXNwbGF5ID0gZGlzcGxheTsKLSAgICB0aGlzLnJ1bm5hYmxlID0gcnVubmFibGU7Ci0gIH0KLQotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBUaW1lciBuZXdJbnN0YW5jZShEaXNwbGF5IGRpc3BsYXksIFJ1bm5hYmxlIHJ1bm5hYmxlKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgICBpbnN0YW5jZSA9IG5ldyBUaW1lcihkaXNwbGF5LCBydW5uYWJsZSk7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIAotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBib29sZWFuIGlzUnVubmluZygpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2UgIT0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydFRpbWVyKCkKLSAgewotICAgIHJlZnJlc2hUaW1lID0gZ2V0Q3VycmVudFRpbWUoKSArIE9ORV9TRUNPTkQ7Ci0gICAgaWYgKCFpc0FsaXZlKCkpCi0gICAgICB0aGlzLnN0YXJ0KCk7Ci0gIH0KLQotICBwcml2YXRlIGxvbmcgZ2V0Q3VycmVudFRpbWUoKQotICB7Ci0gICAgcmV0dXJuIENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpLmdldFRpbWUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBsb25nIGN1cnJUaW1lID0gZ2V0Q3VycmVudFRpbWUoKTsKLSAgICB3aGlsZSAoY3VyclRpbWUgPCByZWZyZXNoVGltZSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgc2xlZXAocmVmcmVzaFRpbWUgLSBjdXJyVGltZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBjdXJyVGltZSA9IGdldEN1cnJlbnRUaW1lKCk7Ci0gICAgfQotICAgIGluc3RhbmNlID0gbnVsbDsKLSAgICBkaXNwbGF5LnN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvV1NETFNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTQyY2NiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvV1NETFNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzY2xpZW50LmltcGwuU2VydmljZVJlZkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFQWN0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsgCi0KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotewotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbil2YWx1ZSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAoc2VsIGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigoKElSZXNvdXJjZSlzZWwpLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkwoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoKFNlcnZpY2VJbXBsKXNlbCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgU2VydmljZVJlZkltcGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSgoU2VydmljZVJlZkltcGwpc2VsKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWwgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoKFdTRExSZXNvdXJjZUltcGwpc2VsKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvV1NETFNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmY2QwZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFQWN0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLldTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLldTRExTZWxlY3Rpb25UcmVlV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uRGlhbG9nUmVzb3VyY2VCcm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uRmlsZUV4dGVuc2lvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBBYnN0cmFjdE9iamVjdFNlbGVjdGlvbldpZGdldCBpbXBsZW1lbnRzIElPYmplY3RTZWxlY3Rpb25XaWRnZXQsIFJ1bm5hYmxlCi17Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICBwbHVnaW5JZF87Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzICAgICAgICBtc2dVdGlsc187Ci0gIHByaXZhdGUgRmlsZUV4dGVuc2lvbkZpbHRlciB3c0ZpbHRlcl87Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0KLSAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50XzsKLSAgcHJpdmF0ZSBMaXN0ZW5lciAgc3RhdHVzTGlzdGVuZXJfOwotICBwcml2YXRlIFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0IHRyZWU7Ci0gIAotICAvKkNPTlRFWFRfSUQgUENPTjAwMDEgZm9yIHRoZSBXU0RMIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQ09OX1BBR0UgPSAiUENPTjAwMDEiOwotCi0gIC8qQ09OVEVYVF9JRCBQQ09OMDAwMiBmb3IgdGhlIFdTREwgRG9jdW1lbnQgdGV4dCBmaWVsZCBvZiB0aGUgV1NETCBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUENPTl9URVhUX1dTREwgPSAiUENPTjAwMDIiOwotICBwcml2YXRlIFRleHQgd2ViU2VydmljZVVSSTsKLQotICAvKkNPTlRFWFRfSUQgUENPTjAwMDMgZm9yIHRoZSBXU0RMIFJlc291cmNlIEJyb3dzZSBidXR0b24gb2YgdGhlIFdTREwgU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BDT05fQlVUVE9OX0JST1dTRV9XU0RMID0gIlBDT04wMDAzIjsKLSAgcHJpdmF0ZSBCdXR0b24gd3NCcm93c2VCdXR0b25fOwotICAKLSAgcHVibGljIFdTRExTZWxlY3Rpb25XaWRnZXQoKQotICB7Ci0gICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgd3NGaWx0ZXJfID0gbmV3IEZpbGVFeHRlbnNpb25GaWx0ZXIobmV3IFN0cmluZ1tdIHsid3NkbCIsICJ3c2lsIiwgImh0bWwifSk7Ci0gICAgd2ViU2VydmljZXNQYXJzZXIgPSBuZXcgV2ViU2VydmljZXNQYXJzZXJFeHQoKTsKLSAgfQotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIFVJVXRpbHMgdWlVdGlscyAgPSBuZXcgVUlVdGlscyggbXNnVXRpbHNfLCBwbHVnaW5JZF8gKTsKLSAgICBwYXJlbnRfICAgICAgICAgID0gcGFyZW50OwotICAgIHN0YXR1c0xpc3RlbmVyXyAgPSBzdGF0dXNMaXN0ZW5lcjsKLQotCSAgcGFyZW50LnNldFRvb2xUaXBUZXh0KCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggIlRPT0xUSVBfUENPTl9QQUdFIiApICk7Ci0JICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBwYXJlbnQsIHBsdWdpbklkXyArICIuIiArIElORk9QT1BfUENPTl9QQUdFICk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIHdzZGxHcm91cCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDIsIDUsIDAgKTsKLSAgICAKLSAgICBMYWJlbCB3c0xhYmVsID0gbmV3IExhYmVsKCB3c2RsR3JvdXAsIFNXVC5XUkFQKTsKLSAgICB3c0xhYmVsLnNldFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9XU19TRUxFQ1RJT04iKSk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgd3NMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICB3c0xhYmVsLnNldFRvb2xUaXBUZXh0KCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVE9PTFRJUF9QQ09OX1RFWFRfV1MiKSApOwotICAgIAotICAgIHdlYlNlcnZpY2VVUkkgPSB1aVV0aWxzLmNyZWF0ZVRleHQoIHdzZGxHcm91cCwgbnVsbCwgIlRPT0xUSVBfUENPTl9URVhUX1dTIiwgSU5GT1BPUF9QQ09OX1RFWFRfV1NETCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgKTsKLSAgICB3ZWJTZXJ2aWNlVVJJLmFkZE1vZGlmeUxpc3RlbmVyKAotICAgICAgbmV3IE1vZGlmeUxpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZVdlYlNlcnZpY2VVUklNb2RpZnlFdmVudCgpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB3ZWJTZXJ2aWNlVVJJLmFkZExpc3RlbmVyKCBTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lciApOwotCi0gICAgd3NCcm93c2VCdXR0b25fID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKCB3c2RsR3JvdXAsICJCVVRUT05fQlJPV1NFIiwgIlRPT0xUSVBfUENPTl9CVVRUT05fQlJPV1NFX1dTIiwgSU5GT1BPUF9QQ09OX0JVVFRPTl9CUk9XU0VfV1NETCApOwotICAgIHdzQnJvd3NlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLSAgICAgIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZVdTRExCdXR0b24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVXU0RMQnV0dG9uKCk7Ci0gICAgICAgIH0gCi0gICAgICB9KTsKLQotICAgIHRyZWUgPSBuZXcgV1NETFNlbGVjdGlvblRyZWVXaWRnZXQoKTsKLSAgICB0cmVlLmFkZENvbnRyb2xzKHBhcmVudCwgc3RhdHVzTGlzdGVuZXIpOwotICAgIHRyZWUuc2V0V2ViU2VydmljZXNQYXJzZXIod2ViU2VydmljZXNQYXJzZXIpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlV2ViU2VydmljZVVSSU1vZGlmeUV2ZW50KCkKLSAgewotICAgIGlmICh3ZWJTZXJ2aWNlVVJJLmdldFRleHQoKS5pbmRleE9mKCc6JykgPiAwKQotICAgICAgVGltZXIubmV3SW5zdGFuY2UoRGlzcGxheS5nZXRDdXJyZW50KCksIHRoaXMpLnN0YXJ0VGltZXIoKTsKLSAgICBlbHNlCi0gICAgICBoYW5kbGVXZWJTZXJ2aWNlVVJJKCk7Ci0gICAgc3RhdHVzTGlzdGVuZXJfLmhhbmRsZUV2ZW50KG51bGwpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlV2ViU2VydmljZVVSSSgpCi0gIHsKLSAgICBTdHJpbmcgd3NVUkkgPSB3ZWJTZXJ2aWNlVVJJLmdldFRleHQoKTsKLSAgICBpZiAod3NVUkkuaW5kZXhPZignOicpIDwgMCkKLSAgICB7Ci0gICAgICBJRmlsZSBmaWxlID0gdXJpMklGaWxlKHdzVVJJKTsKLSAgICAgIGlmIChmaWxlICE9IG51bGwpCi0gICAgICAgIHdzVVJJID0gaUZpbGUyVVJJKGZpbGUpOwotICAgIH0KLSAgICBpZiAod3NVUkkgIT0gbnVsbCAmJiB3c1VSSS5pbmRleE9mKCc6JykgPj0gMCAmJiB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkod3NVUkkpID09IG51bGwpCi0gICAgewotICAgICAgV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQgY21kID0gbmV3IFdTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kKCk7Ci0gICAgICBjbWQuc2V0V2ViU2VydmljZXNQYXJzZXIod2ViU2VydmljZXNQYXJzZXIpOwotICAgICAgY21kLnNldFdlYlNlcnZpY2VVUkkod3NVUkkpOwotICAgICAgY21kLmV4ZWN1dGUobnVsbCk7Ci0gICAgfQotICAgIFdlYlNlcnZpY2VFbnRpdHkgZW50aXR5ID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdzVVJJKTsKLSAgICBpZiAoZW50aXR5ICE9IG51bGwgJiYgZW50aXR5LmdldFR5cGUoKSA9PSBXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NETCkKLSAgICAgIHRyZWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgZWxzZQotICAgICAgdHJlZS5zZXRFbmFibGVkKHRydWUpOwotICAgIHRyZWUuc2V0V2ViU2VydmljZVVSSSh3c1VSSSk7Ci0gICAgdHJlZS5yZWZyZXNoVHJlZVZpZXdlcigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaGFuZGxlV2ViU2VydmljZVVSSSgpOwotICAgIHN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudChudWxsKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVXU0RMQnV0dG9uKCkKLSAgewotICAgIERpYWxvZ1Jlc291cmNlQnJvd3NlciBkaWFsb2cgPSBuZXcgRGlhbG9nUmVzb3VyY2VCcm93c2VyKCBwYXJlbnRfLmdldFNoZWxsKCksIG51bGwsIHdzRmlsdGVyXyk7Ci0gICAgZGlhbG9nLm9wZW4oKTsKLSAgICBJUmVzb3VyY2UgcmVzID0gZGlhbG9nLmdldEZpcnN0U2VsZWN0aW9uKCk7Ci0gICAgaWYoIHJlcyAhPSBudWxsICkgd2ViU2VydmljZVVSSS5zZXRUZXh0KCByZXMuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpICk7Ci0gICAgc3RhdHVzTGlzdGVuZXJfLmhhbmRsZUV2ZW50KG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICAvLyBUaW1lciB2YWxpZGF0aW9uCi0gICAgLyoKLSAgICAgKiBDb21tZW50aW5nIG91dCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gYmxvY2sgZmFzdCB0eXBlcnMgZnJvbSBoaXR0aW5nIE5leHQvRmluaXNoIAotICAgIGlmIChUaW1lci5pc1J1bm5pbmcoKSkKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiUEFHRV9NU0dfTE9BRElOR19XRUJfU0VSVklDRV9VUkkiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAqLwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgV2ViIHNlcnZpY2UgVVJJCi0gICAgLy8gRm9yIGV4YW1wbGUsIGlzIGl0IHBvaW50aW5nIHRvIGFuIGV4aXN0aW5nIHJlc291cmNlIGluIHRoZSB3b3Jrc3BhY2U/Ci0gICAgU3RyaW5nIHdzUGF0aCAgPSB3ZWJTZXJ2aWNlVVJJLmdldFRleHQoKTsKLSAgICBpZiggd3NQYXRoID09IG51bGwgfHwgd3NQYXRoLmxlbmd0aCgpIDw9IDAgKQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQQUdFX01TR19JTlZBTElEX1dFQl9TRVJWSUNFX1VSSSIpLCBTdGF0dXMuRVJST1IpOwotICAgIGVsc2UgaWYoIHdzUGF0aC5pbmRleE9mKCc6JykgPCAwICkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uod3NQYXRoKTsKLSAgICAgIGlmKCByZXMgPT0gbnVsbCApCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiUEFHRV9NU0dfTk9fU1VDSF9GSUxFIiwgbmV3IE9iamVjdFtdIHt3c1BhdGh9KSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIGVsc2UgaWYoIHJlcy5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUgKQotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIlBBR0VfTVNHX0lOVkFMSURfV0VCX1NFUlZJQ0VfVVJJIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgfQotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGNvbnRlbnQgb2YgdGhlIFdlYiBzZXJ2aWNlIFVSSQotICAgIC8vIEZvciBleGFtcGxlLCBpcyBzZWxlY3Rpb24gYSBXU0RMIFVSST8KLSAgICBpZiAoIVRpbWVyLmlzUnVubmluZygpICYmIHRyZWUuaXNFbmFibGVkKCkpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IHRyZWUuZ2V0U3RhdHVzKCk7Ci0gICAgICBpZiAoc3RhdHVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotICAgICAgICBpZiAoc2V2ZXJpdHkgPT0gU3RhdHVzLkVSUk9SIHx8IHNldmVyaXR5ID09IFN0YXR1cy5XQVJOSU5HKQotICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiggd3NQYXRoLmluZGV4T2YoJzonKSA8IDAgKQotICAgICAgewotICAgICAgICBTdHJpbmcgd3NkbFVSSSA9IGlGaWxlMlVSSSgoSUZpbGUpUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uod3NQYXRoKSk7Ci0gICAgICAgIGlmICh3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJJKSA9PSBudWxsKQotICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiUEFHRV9NU0dfU0VMRUNUSU9OX01VU1RfQkVfV1NETCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE9LIHN0YXR1cwotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICB9Ci0gIAotICBwcml2YXRlIElGaWxlIHVyaTJJRmlsZShTdHJpbmcgdXJpKQotICB7Ci0gICAgSVJlc291cmNlIHJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcih1cmkpOwotICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHJldHVybiAoSUZpbGUpcmVzOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBpRmlsZTJVUkkoSUZpbGUgZmlsZSkKLSAgewotICAJRmlsZSBmID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBmLnRvVVJMKCkudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBmLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmICFpbml0aWFsU2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIFN0cmluZyB3c2RsVVJJID0gdG9Xc2RsVVJJKG9iamVjdCk7Ci0gICAgICBpZiAod3NkbFVSSSAhPSBudWxsKQotICAgICAgewotICAgICAgICB3ZWJTZXJ2aWNlVVJJLnNldFRleHQod3NkbFVSSSk7Ci0gICAgICAgIGhhbmRsZVdlYlNlcnZpY2VVUkkoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIHRvV3NkbFVSSShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsKQotICAgICAgcmV0dXJuIEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5nZXRXU0RMVVJJKChTZXJ2aWNlSW1wbClvYmplY3QpOwotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpCi0gICAgICByZXR1cm4gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoKFdTRExSZXNvdXJjZUltcGwpb2JqZWN0KTsKLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKQotICAgICAgcmV0dXJuIEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5nZXRXU0RMVVJJKChTZXJ2aWNlUmVmKW9iamVjdCk7Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICByZXR1cm4gKChJRmlsZSlvYmplY3QpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICByZXR1cm4gKFN0cmluZylvYmplY3Q7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIHRvQWJzb2x1dGVXc2RsVVJJKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKElGaWxlKW9iamVjdCkuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdG9Xc2RsVVJJKG9iamVjdCk7Ci0gIH0KLQotICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0T2JqZWN0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbiggCi0gICAgICAgICAgICAgICBuZXcgV1NETFNlbGVjdGlvbldyYXBwZXIoIHdlYlNlcnZpY2VzUGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0cmVlLmdldFdzZGxVUkkoKSkgKSApOwotICB9Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQotICB7Ci0gICAgU3RyaW5nIHdzZGxVUkkgPSB0cmVlLmdldFdzZGxVUkkoKTsKLSAgICBpZiAod3NkbFVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIElQcm9qZWN0IHAgPSBnZXRQcm9qZWN0RnJvbVVSSSh3c2RsVVJJKTsKLSAgICAgIGlmIChwIT1udWxsICYmIHAuZXhpc3RzKCkpCi0gICAgICAgIHJldHVybiBwOwotICAgICAgCi0gICAgICBTdHJpbmcgd3NSZWxQYXRoID0gd2ViU2VydmljZVVSSS5nZXRUZXh0KCk7Ci0gICAgICBJUmVzb3VyY2Ugd3NSZXMgPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSh3c1JlbFBhdGgpOwotICAgICAgaWYgKHdzUmVzIT1udWxsICYmIHdzUmVzIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICB7Ci0gICAgICAgIElQcm9qZWN0IHAyID0gKChJRmlsZSl3c1JlcykuZ2V0UHJvamVjdCgpOwotICAgICAgICByZXR1cm4gcDI7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21VUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIFN0cmluZyB3a3NwY1Jvb3RMb2MgPSByb290LmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLSAgICBpbnQgaWR4ID0gdXJpLmluZGV4T2Yod2tzcGNSb290TG9jKTsKLSAgICBpZiAoaWR4ICE9IC0xKSAKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVsUGF0aCA9IHVyaS5zdWJzdHJpbmcod2tzcGNSb290TG9jLmxlbmd0aCgpK2lkeCk7Ci0gICAgICBJUmVzb3VyY2UgcmVzID0gcm9vdC5maW5kTWVtYmVyKG5ldyBQYXRoKHJlbFBhdGgpKTsKLSAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHsKLSAgICAgICAgSVByb2plY3QgcCA9ICgoSUZpbGUpcmVzKS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIHJldHVybiBwOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvV1NETFNlbGVjdGlvbldyYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvV1NETFNlbGVjdGlvbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxZGRmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25XcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSB2ZXJ5IHNpbXBsZSB3cmFwcGVyIHRoYXQgYmluZHMgYSBXU0RMIHBhcnNlciB3aXRoCi0gKiBhIHdzZGxTZWxlY3Rpb24gb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgV1NETFNlbGVjdGlvbldyYXBwZXIgCi17Ci0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciAgICBwYXJzZXI7Ci0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiB3c2RsU2VsZWN0aW9uOwotICAKLSAgcHVibGljIFdTRExTZWxlY3Rpb25XcmFwcGVyKCBXZWJTZXJ2aWNlc1BhcnNlciAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgewotICAgIHRoaXMucGFyc2VyICAgICAgICA9IHBhcnNlcjsKLSAgICB0aGlzLndzZGxTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL0NsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL0NsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3OThlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvcnVudGltZS9DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5WYWxpZGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5DbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3RDaG9pY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgU3RyaW5nICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAKLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAwMyBmb3IgdGhlIFdpemFyZCBTY2VuYXJpbyBDbGllbnQgY29uZmlndXJhdGlvbiBvZiB0aGUgUnVudGltZSBTZWxlY3Rpb24gUGFnZSAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfR1JPVVBfQ0xJRU5UID0gcGx1Z2luSWRfICsgIi5QV1JTMDAwMyI7Ci0gIAotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U2NlbmFyaW9JZDsKLSAgcHJpdmF0ZSBHcm91cCAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEdyb3VwXzsKLSAgcHJpdmF0ZSBSdW50aW1lU2VydmVyU2VsZWN0aW9uV2lkZ2V0IHJ1bnRpbWVXaWRnZXRfOwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzICAgICAgICAgcnVudGltZTJDbGllbnRUeXBlc187Ci0gIHByaXZhdGUgQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRUeXBlXzsKLSAgcHJpdmF0ZSBTZWxlY3Rpb25BZGFwdGVyICAgICAgICAgICAgIGNsaWVudFR5cGVTZWxMaXN0ZW5lcjsKLSAgcHJpdmF0ZSBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0ICAgICAgIHByb2plY3RXaWRnZXRfOwotICBwcml2YXRlIGJvb2xlYW4gCQkJCQkgICBpc1Zpc2libGVfOwotICAKLSAgLy8gcnNrIHJldmlzaXQgLSBQdXR0aW5nIHRoaXMgaW4gdGVtcG9yYXJpbHkuIFRoZSBSdW50aW1lU2VsZWN0aW9uRGlhbG9nIG5lZWRzIHRoZSBzZXJ2ZXIKLSAgLy8gaW5mb3JtYXRpb24gZXZlbiB3aGVuIGl0IGlzIGxhdW5jaGVkIGZvciB0aGUgY2xpZW50IGhhbGYgb2YgdGhlIGNvbmZpZ3VyYXRpb24uCi0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlU2NlbmFyaW9JZDsKLSAgLy8KLSAgCi0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgVUlVdGlscyAgICAgIHVpVXRpbHMgID0gbmV3IFVJVXRpbHMobXNnVXRpbHMsIHBsdWdpbklkXyApOyAKLSAgICAKLSAgICBjbGllbnRHcm91cF8gPSB1aVV0aWxzLmNyZWF0ZUdyb3VwKCBwYXJlbnQsICJMQUJFTF9DTElFTlRfU0VMRUNUSU9OX1ZJRVdfVElUTEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIElORk9QT1BfUFdSU19HUk9VUF9DTElFTlQsIDIsIDUsIDUgKTsKLSAgICAKLSAgICBydW50aW1lV2lkZ2V0XyA9IG5ldyBSdW50aW1lU2VydmVyU2VsZWN0aW9uV2lkZ2V0KCB0cnVlICk7Ci0gICAgcnVudGltZVdpZGdldF8uYWRkQ29udHJvbHMoIGNsaWVudEdyb3VwXywgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICBydW50aW1lV2lkZ2V0Xy5hZGRNb2RpZnlMaXN0ZW5lciggbmV3IE1vZGlmeUxpc3RlbmVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVSdW50aW1lMkNsaWVudFR5cGVzRXZlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVwZGF0ZVByb2plY3RXaWRnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIAotICAgIGNsaWVudFR5cGVfID0gdWlVdGlscy5jcmVhdGVDb21ibyggY2xpZW50R3JvdXBfLCAiTEFCRUxfQ0xJRU5UX1RZUEUiLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV0NSX0NPTUJPX0NMSUVOVF9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdSU19HUk9VUF9DTElFTlQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgCi0gICAgY2xpZW50VHlwZVNlbExpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2V0UHJvamVjdHMoIGNsaWVudFR5cGVfLmdldFNlbGVjdGlvbkluZGV4KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgY2xpZW50VHlwZV8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoY2xpZW50VHlwZVNlbExpc3RlbmVyKTsKLSAgICAKLSAgICBwcm9qZWN0V2lkZ2V0XyA9IG5ldyBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0KHRydWUpOwotICAgIHByb2plY3RXaWRnZXRfLmFkZENvbnRyb2xzKCBjbGllbnRHcm91cF8sIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgCi0gICAgLy9wcm9qZWN0V2lkZ2V0Xy5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLSAgICAvLyAgCQkJCQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotICAgIC8vICAJCQkJCQkJCSAgZ2V0UHJvamVjdFNlbGVjdGlvbnMoKTsKLSAgICAvLyAgCQkJCQkJCQl9Ci0gICAgLy8JCQkJCQkJCX0pOwotICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGNyZWF0b3Igb2YgdGhpcyB3aWRnZXQgdG8gY29udHJvbAotICAvLyB3aGV0aGVyIGl0IGlzIHZpc2libGUgb3Igbm90LgotICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKCBib29sZWFuIHZhbHVlICkKLSAgewotICAgIGNsaWVudEdyb3VwXy5zZXRWaXNpYmxlKCB2YWx1ZSApOyAKLSAgICBpc1Zpc2libGVfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpewotICAJcmV0dXJuIHRoaXMuaXNWaXNpYmxlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7ICAgICAKLSAgICBydW50aW1lV2lkZ2V0Xy5zZXRUeXBlUnVudGltZVNlcnZlciggaWRzICk7Ci0gICAgcHJvamVjdFdpZGdldF8uc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoaWRzKTsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBydW50aW1lV2lkZ2V0Xy5nZXRUeXBlUnVudGltZVNlcnZlcigpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SjJFRVZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIHJ1bnRpbWVXaWRnZXRfLmdldEoyRUVWZXJzaW9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uKFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAgIHJ1bnRpbWVXaWRnZXRfLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgICBwcm9qZWN0V2lkZ2V0Xy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbik7Ci0gIH0KLSAgICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0Q2xpZW50TmVlZEVBUigpCi0gIHsKLSAgICByZXR1cm4gcHJvamVjdFdpZGdldF8uZ2V0TmVlZEVBUigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnROZWVkRUFSKGJvb2xlYW4gYikKLSAgewotICAgIHByb2plY3RXaWRnZXRfLnNldE5lZWRFQVIoYik7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBydW50aW1lMkNsaWVudFR5cGVzIFRoZSBydW50aW1lMkNsaWVudFR5cGVzIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWUyQ2xpZW50VHlwZXMoU2VsZWN0aW9uTGlzdENob2ljZXMgcnVudGltZTJDbGllbnRUeXBlcykKLSAgewotICAgIHJ1bnRpbWUyQ2xpZW50VHlwZXNfID0gcnVudGltZTJDbGllbnRUeXBlczsKLSAgICBoYW5kbGVSdW50aW1lMkNsaWVudFR5cGVzRXZlbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkKLSAgewotICAgIENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgCi0gICAgU3RyaW5nIHJ1bnRpbWUgICAgICAgPSBydW50aW1lV2lkZ2V0Xy5nZXRUeXBlUnVudGltZVNlcnZlcigpLmdldFJ1bnRpbWVJZCgpOwotICAgIFN0cmluZyBjbGllbnRQcm9qZWN0ID0gcHJvamVjdFdpZGdldF8uZ2V0UHJvamVjdENob2ljZXMoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgU3RyaW5nIGVhclByb2plY3QgICAgPSBwcm9qZWN0V2lkZ2V0Xy5nZXRQcm9qZWN0Q2hvaWNlcygpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAKLSAgICBTZWxlY3Rpb25MaXN0IHJ1bnRpbWVMaXN0ICA9IHJ1bnRpbWUyQ2xpZW50VHlwZXNfLmdldExpc3QoKTsKLSAgICBydW50aW1lTGlzdC5zZXRTZWxlY3Rpb25WYWx1ZSggcnVudGltZSApOwotICAgIAotICAgIFNlbGVjdGlvbkxpc3QgcHJvalR5cGVMaXN0ID0gcnVudGltZTJDbGllbnRUeXBlc18uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpOwotICAgIHByb2pUeXBlTGlzdC5zZXRJbmRleCggY2xpZW50VHlwZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAgIAotICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNsaWVudFByb2pDaG9pY2UgPSBydW50aW1lMkNsaWVudFR5cGVzXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKTsKLSAgICBTZWxlY3Rpb25MaXN0ICAgICAgICBjbGllbnRQcm9qTGlzdCAgID0gY2xpZW50UHJvakNob2ljZS5nZXRMaXN0KCk7Ci0gICAgY2xpZW50UHJvakxpc3Quc2V0U2VsZWN0aW9uVmFsdWUoIGNsaWVudFByb2plY3QgKTsgICAgCi0gICAgCi0gICAgU2VsZWN0aW9uTGlzdCAgICAgICAgZWFyUHJvakxpc3QgICAgICA9IGNsaWVudFByb2pDaG9pY2UuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpOyAgIAotICAgIGVhclByb2pMaXN0LnNldFNlbGVjdGlvblZhbHVlKCBlYXJQcm9qZWN0ICk7Ci0gICAgCi0gICAgcmV0dXJuIHJ1bnRpbWUyQ2xpZW50VHlwZXNfOyAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJ1bnRpbWUyQ2xpZW50VHlwZXNFdmVudCgpCi0gIHsKLSAgICBpZiAocnVudGltZTJDbGllbnRUeXBlc18gIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIC8vSWYgdGhlIHJ1bnRpbWVJZCBmcm9tIHJ1bnRpbWVXaWRnZXRfIGlzIGFscmVhZHkgc2VsZWN0ZWQgaW4KLSAgICAgIC8vaW4gcnVudGltZTJDbGllbnRUeXBlc18sIGRvIG5vdGhpbmcuIAotICAgICAgU3RyaW5nIGN1cnJlbnRSdW50aW1lSWQgPSBydW50aW1lMkNsaWVudFR5cGVzXy5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBTdHJpbmcgbmV3UnVudGltZUlkID0gcnVudGltZVdpZGdldF8uZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRSdW50aW1lSWQoKTsKLSAgICAgIGlmIChjdXJyZW50UnVudGltZUlkICE9IG5ld1J1bnRpbWVJZCkKLSAgICAgIHsKLSAgICAgICAgU2VsZWN0aW9uTGlzdCBydW50aW1lcyA9IHJ1bnRpbWUyQ2xpZW50VHlwZXNfLmdldExpc3QoKTsKLSAgICAgICAgcnVudGltZXMuc2V0U2VsZWN0aW9uVmFsdWUoIHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCkuZ2V0UnVudGltZUlkKCkgKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RyaW5nW10gY2xpZW50VHlwZUlkcyA9IHJ1bnRpbWUyQ2xpZW50VHlwZXNfLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCk7Ci0gICAgICBpbnQgc2VsZWN0ZWRDbGllbnRUeXBlSWR4ID0gcnVudGltZTJDbGllbnRUeXBlc18uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldEluZGV4KCk7Ci0gICAgICAKLSAgICAgIGNsaWVudFR5cGVfLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGNsaWVudFR5cGVTZWxMaXN0ZW5lcik7Ci0gICAgICBjbGllbnRUeXBlXy5zZXRJdGVtcyggZ2V0Q2xpZW50VHlwZUxhYmVscyggY2xpZW50VHlwZUlkcyApKTsKLSAgICAgIGNsaWVudFR5cGVfLnNlbGVjdChzZWxlY3RlZENsaWVudFR5cGVJZHgpOwotICAgICAgY2xpZW50VHlwZV8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoY2xpZW50VHlwZVNlbExpc3RlbmVyKTsKLSAgICAgIGhhbmRsZVNldFByb2plY3RzKHNlbGVjdGVkQ2xpZW50VHlwZUlkeCk7Ci0gICAgICAKLSAgICB9Ci0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVVcGRhdGVQcm9qZWN0V2lkZ2V0KCkKLSAgewotICAgIHByb2plY3RXaWRnZXRfLnNldFR5cGVSdW50aW1lU2VydmVyKHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCkpOwotICAgIHByb2plY3RXaWRnZXRfLnNldEoyRUVWZXJzaW9uKHJ1bnRpbWVXaWRnZXRfLmdldEoyRUVWZXJzaW9uKCkpOwotICB9Ci0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVTZXRQcm9qZWN0cyggaW50IGNsaWVudFR5cGVJbmRleCApCi0gIHsgICAgCi0gICAgU2VsZWN0aW9uTGlzdENob2ljZXMgY2xpZW50VHlwZTJQcm9qZWN0cyA9IHJ1bnRpbWUyQ2xpZW50VHlwZXNfLmdldENob2ljZSgpOwotICAgIGNsaWVudFR5cGUyUHJvamVjdHMuZ2V0TGlzdCgpLnNldEluZGV4KCBjbGllbnRUeXBlSW5kZXggKTsKLSAgICAKLSAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcHJvamVjdCBuYW1lIGFuZCBFQVIgbmFtZSBhcmUga2VwdCB0aGUgc2FtZQotICAgIC8vIGV2ZW4gaWYgdGhlIGNsaWVudCB0eXBlIGlzIGNoYW5nZWQuICBOb3RlOiB0aGUgcHJvamVjdCBhbmQgRUFSIGxpc3RzCi0gICAgLy8gd2lsbCBiZSB1cGRhdGVkIGFjY29yZGluZyB0byB3aGF0IGlzIHNldCBieSB0aGUgY2xpZW50IHR5cGUuCi0gICAgU2VsZWN0aW9uTGlzdENob2ljZXMgY3VycmVudFByb2plY3RzID0gcHJvamVjdFdpZGdldF8uZ2V0UHJvamVjdENob2ljZXMoKTsKLSAgICAKLSAgICBpZiggY3VycmVudFByb2plY3RzICE9IG51bGwgKQotICAgIHsKLSAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGN1cnJlbnRQcm9qZWN0cy5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBTdHJpbmcgZWFyTmFtZSAgICAgPSBjdXJyZW50UHJvamVjdHMuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAgICAgCi0gICAgICAvLyBTZXQgdGhlIHByb2plY3QgdG8gaXQncyBvcmlnaW5hbCBzdGF0ZS4KLSAgICAgIGNsaWVudFR5cGUyUHJvamVjdHMuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKCBwcm9qZWN0TmFtZSApOwotCQotCSAgLy8gU2V0IHRoZSBFQVIgbmFtZSB0byBpdCdzIG9yaWdpbmFsIHN0YXRlLgotICAgICAgY2xpZW50VHlwZTJQcm9qZWN0cy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoIGVhck5hbWUgKTsKLSAgICB9Ci0JCi0gICAgcHJvamVjdFdpZGdldF8uc2V0UHJvamVjdFR5cGVJZChjbGllbnRUeXBlMlByb2plY3RzLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgcHJvamVjdFdpZGdldF8uc2V0UHJvamVjdENob2ljZXMoIGNsaWVudFR5cGUyUHJvamVjdHMuZ2V0Q2hvaWNlKCkgKTsgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nW10gZ2V0Q2xpZW50VHlwZUxhYmVscyggU3RyaW5nW10gdHlwZXMgKQotICB7Ci0gICAgQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeSByZWdpc3RyeSAgICAgICAgID0gQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZ1tdICAgICAgICAgICAgICAgICAgY2xpZW50VHlwZUxhYmVscyA9IG5ldyBTdHJpbmdbdHlwZXMubGVuZ3RoXTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZXMubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBjbGllbnRUeXBlTGFiZWxzW2luZGV4XSA9IHJlZ2lzdHJ5LmdldEVsZW1lbnRCeUlkKHR5cGVzW2luZGV4XSkuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY2xpZW50VHlwZUxhYmVsczsKLSAgfQotICAKLSAgcHVibGljIFByb2plY3RTZWxlY3Rpb25XaWRnZXQgZ2V0UHJvamVjdFNlbGVjdGlvbldpZGdldCgpIHsKLSAgICByZXR1cm4gdGhpcy5wcm9qZWN0V2lkZ2V0XzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2dldFN0YXR1cygpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpIAotICB7Ci0gICAgU3RhdHVzIGZpbmFsU3RhdHVzICAgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIFN0YXR1cyBwcm9qZWN0U3RhdHVzID0gcHJvamVjdFdpZGdldF8uZ2V0U3RhdHVzKCk7Ci0gICAgU3RhdHVzIHJ1bnRpbWVTdGF0dXMgPSBydW50aW1lV2lkZ2V0Xy5nZXRTdGF0dXMoKTsKLSAgICAKLSAgICBpZiggcnVudGltZVN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgewotICAgICAgZmluYWxTdGF0dXMgPSBydW50aW1lU3RhdHVzOwotICAgIH0KLSAgICBlbHNlIGlmKCBwcm9qZWN0U3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgICB7Ci0gICAgICBmaW5hbFN0YXR1cyA9IHByb2plY3RTdGF0dXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjbGllbnRQcm9qZWN0cyA9IGdldFByb2plY3RTZWxlY3Rpb25XaWRnZXQoKS5nZXRQcm9qZWN0Q2hvaWNlcygpOwotICAgICAgVmFsaWRhdGlvblV0aWxzIHZhbFV0aWxzID0gbmV3IFZhbGlkYXRpb25VdGlscygpOwotICAgICAgaWYgKGNsaWVudFByb2plY3RzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjbGllbnRFQVJOYW1lID0gY2xpZW50UHJvamVjdHMuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAgICAgICBTdHJpbmcgY2xpZW50UHJvak5hbWUgPSBjbGllbnRQcm9qZWN0cy5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgLy9WYWxpZGF0ZSB0aGF0IHRoZSBzZWxlY3RlZCBjbGllbnQgcHJvamVjdCBpcyBvZiB0aGUgdHlwZSBpbmRpY2F0ZWQgYnkgY2xpZW50IHByb2plY3QgdHlwZS4KLSAgICAgICAgU3RhdHVzIGNsaWVudFByb2plY3RUeXBlU3RhdHVzID0gdmFsVXRpbHMudmFsaWRhdGVQcm9qZWN0VHlwZShjbGllbnRQcm9qTmFtZSwgcnVudGltZTJDbGllbnRUeXBlc18pOwotICAgICAgICBpZiAoY2xpZW50UHJvamVjdFR5cGVTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICBmaW5hbFN0YXR1cyA9IGNsaWVudFByb2plY3RUeXBlU3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL1ZhbGlkYXRlIGNsaWVudCBzaWRlIHNlcnZlciB0YXJnZXRzIGFuZCBKMkVFIGxldmVscwotICAgICAgICBTdHJpbmcgY2xpZW50U2VydmVyRmFjdG9yeUlkID0gZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRTZXJ2ZXJJZCgpOwotICAgICAgICBTdHJpbmcgY2xpZW50SjJFRWxldmVsID0gZ2V0SjJFRVZlcnNpb24oKTsKLSAgICAgICAgU3RhdHVzIGNsaWVudFByb2plY3RTdGF0dXMgPSB2YWxVdGlscy52YWxpZGF0ZVByb2plY3RUYXJnZXRBbmRKMkVFKGNsaWVudFByb2pOYW1lLCBjbGllbnRFQVJOYW1lLCBjbGllbnRTZXJ2ZXJGYWN0b3J5SWQsCi0gICAgICAgICAgICBjbGllbnRKMkVFbGV2ZWwpOwotICAgICAgICBpZiAoY2xpZW50UHJvamVjdFN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgICAgewotICAgICAgICAgIGZpbmFsU3RhdHVzID0gY2xpZW50UHJvamVjdFN0YXR1czsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmluYWxTdGF0dXM7ICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvcnVudGltZS9DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL0NsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmQ4MGEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL0NsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZTsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLkNsaWVudFNlcnZlclNlbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uU2VydmVyU2VsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5WYWxpZGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXMuUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLklXZWJTZXJ2aWNlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAoteyAgIAotICBwcm90ZWN0ZWQgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgLy8gY2xpZW50UnVudGltZUoyRUVUeXBlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGNsaWVudCBydW50aW1lIGFuZCBKMkVFIGxldmVsIGJhc2VkIG9uIHRoZSBpbml0aWFsIHNlbGVjdGlvbi4KLSAgLy8gSWYgdGhlIGluaXRpYWxTZWxlY2l0b24gZG9lcyBub3QgcmVzdWx0IGluIGEgdmFsaWQgY2xpZW50IHJ1bnRpbWUgYW5kIEoyRUUgbGV2ZWwsIGNsaWVudFJ1bnRpbWVKMkVFVHlwZQotICAvLyBzaG91bGQgcmVtYWluIG51bGwgZm9yIHRoZSBsaWZlIG9mIHRoaXMgaW5zdGFuY2UuICAKLSAgcHJpdmF0ZSBXU1J1bnRpbWVKMkVFVHlwZSAgICBjbGllbnRSdW50aW1lSjJFRVR5cGVfOwotICAKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciAgICBjbGllbnRJZHNfOwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHJ1bnRpbWVDbGllbnRUeXBlc187Ci0gIAotICAvL0Egbm90ZSBvbiBpbml0aWFsU2VsZWN0aW9ucyAuLi4KLSAgLy9UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGNsaWVudEluaXRpYWxTZWxlY3Rpb25fIGFuZCBpbml0aWFsSW5pdGlhbFNlbGVjdGlvbiBpcyB0aGF0Ci0gIC8vY2xpZW50SW5pdGlhbFNlbGVjdGlvbl8gY29tZXMgZnJvbSB0aGUgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZCB3aGlsZSBpbml0aWFsSW5pdGlhbFNlbGVjdGlvbgotICAvL2lzIHRoZSBhY3R1YWwgdGhpbmcgdGhhdCB3YXMgc2VsZWN0ZWQgYmVmb3JlIHRoZSB3aXphcmQgd2FzIGxhdW5jaGVkLiBJbiB0aGUgcnVudGltZS9qMmVlL3Byb2plY3QgCi0gIC8vZGVmYXVsdGluZyBhbGdvcml0aG0sIGNsaWVudEluaXRpYWxTZWxlY3Rpb24gd2lsbCBiZSBnaXZlbiBmaXJzdCBwcmlvcml0eS4gSWYsIGhvd2V2ZXIsIGl0IGlzIAotICAvL2RlZW1lZCB0aGF0IGNsaWVudEluaXRpYWxQcm9qZWN0IGlzIG5vdCBhIHZhbGlkIGluaXRpYWwgc2VsZWN0aW9uLCBpbml0aWFsSW5pdGlhbFNlbGVjdGlvbgotICAvL3dpbGwgYmUgZ2l2ZW4gc2Vjb25kIHByaW9yaXR5LiBUaGluZ3MgdGhhdCBjb3VsZCBtYWtlIGFuIGluaXRpYWxTZWxlY3Rpb24gaW52YWxpZCBpbmNsdWRlCi0gIC8vMS4gVGhlIGNvbnRhaW5pbmcgcHJvamVjdCBjb250YWlucyB0aGUgV2ViIHNlcnZpY2UgZm9yIHdoaWNoIHdlIGFyZSB0cnlpbmcgdG8gY3JlYXRlIGEgY2xpZW50Ci0gIC8vMi4gVGhlIGNvbnRhaW5pbmcgcHJvamVjdCBoYXMgYSBKMkVFIGxldmVsLCBzZXJ2ZXIgdGFyZ2V0LCBhbmQgcHJvamVjdCB0eXBlIGNvbWJpbmF0aW9uIHdoaWNoCi0gIC8vICAgaXMgbm90IHN1cHBvcnRlZCBieSBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgV2ViIHNlcnZpY2UgcnVudGltZXMuCi0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY2xpZW50SW5pdGlhbFNlbGVjdGlvbl87Ci0gIHByaXZhdGUgSVByb2plY3QgY2xpZW50SW5pdGlhbFByb2plY3RfOwotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxJbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBpbml0aWFsSW5pdGlhbFByb2plY3RfOwotCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudEoyRUVWZXJzaW9uXzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2xpZW50TmVlZEVBUl8gPSB0cnVlOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSV87Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyXzsKLQotCi0gIHB1YmxpYyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBTdHJpbmcgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLSAgICBjbGllbnRJZHNfID0gaWRzOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudElkc187IAotICB9Ci0gIAotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gcnVudGltZUNsaWVudFR5cGVzXzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRKMkVFVmVyc2lvbigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50SjJFRVZlcnNpb25fOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZCNleGVjdXRlKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHRyeQotICAgIHsKLQkgIC8vIHJza3JlZwkJCi0gICAgICAvL1dlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAvL1N0cmluZ1tdIHJ1bnRpbWVJZHMgPSBnYXRoZXJBdHRyaWJ1dGVWYWx1ZXMocmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50KGNsaWVudElkc18uZ2V0VHlwZUlkKCkpLCAicnVudGltZSIpOwotCSAgU3RyaW5nW10gcnVudGltZUlkcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0UnVudGltZXNCeUNsaWVudFR5cGUoY2xpZW50SWRzXy5nZXRUeXBlSWQoKSk7IAotCSAgLy8gcnNrcmVnCi0gICAgICBTZWxlY3Rpb25MaXN0IGxpc3QgPSBuZXcgU2VsZWN0aW9uTGlzdChydW50aW1lSWRzLCAwKTsKLSAgICAgIFZlY3RvciBjaG9pY2VzID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lSWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGNob2ljZXMuYWRkKGdldENsaWVudFR5cGVzQ2hvaWNlKHJ1bnRpbWVJZHNbaV0pKTsKLSAgICAgIH0KLSAgICAgIHJ1bnRpbWVDbGllbnRUeXBlc18gPSBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMobGlzdCwgY2hvaWNlcyk7Ci0gICAgICAvL3NldENsaWVudERlZmF1bHRSdW50aW1lRnJvbVByZWZlcmVuY2UoKTsKLSAgICAgIC8vc2V0Q2xpZW50RGVmYXVsdEoyRUVWZXJzaW9uRnJvbVByZWZlcmVuY2UoKTsKLSAgICAgIC8vY2xpZW50UnVudGltZUoyRUVUeXBlXyA9IGdldENsaWVudFJ1bnRpbWVBbmRKMkVFRnJvbVByb2plY3QoY2xpZW50SW5pdGlhbFByb2plY3RfKTsKLSAgICAgIC8vaWYgKGNsaWVudFJ1bnRpbWVKMkVFVHlwZV8gIT0gbnVsbCkKLSAgICAgIC8vewotICAgICAgICAvL2NsaWVudEoyRUVWZXJzaW9uXyA9IGNsaWVudFJ1bnRpbWVKMkVFVHlwZV8uZ2V0SjJlZVZlcnNpb25JZCgpOwotICAgICAgICAvL3NldENsaWVudFJ1bnRpbWVJZChjbGllbnRSdW50aW1lSjJFRVR5cGVfLmdldFdzcklkKCkpOwotICAgICAgICAvL3NldENsaWVudFByb2plY3RUeXBlKGNsaWVudFJ1bnRpbWVKMkVFVHlwZV8uZ2V0Q2xpZW50UHJvamVjdFR5cGVJZCgpKTsKLSAgICAgIC8vfQotCSAgc2V0Q2xpZW50UnVudGltZUlkKChXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFJ1bnRpbWVzQnlDbGllbnRUeXBlKGNsaWVudElkc18uZ2V0VHlwZUlkKCkpKVswXSk7Ci0JICBjbGllbnRKMkVFVmVyc2lvbl8gPSAoV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQoY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSkuZ2V0SjJlZUxldmVscygpKVswXTsKLQkgIAotICAgICAgLy9JZiBjbGllbnRJbml0aWFsUHJvamVjdCBpcyB0aGUgc2VydmljZSBwcm9qZWN0LCBjaGVjayB0aGUgaW5pdGlhbEluaXRpYWxQcm9qZWN0Ci0gICAgICAvL3RvIHNlZSBpZiBpdCBpcyB2YWxpZC4KLQkgIC8qCi0gICAgICBWYWxpZGF0aW9uVXRpbHMgdnUgPSBuZXcgVmFsaWRhdGlvblV0aWxzKCk7Ci0gICAgICBpZiAodnUuaXNQcm9qZWN0U2VydmljZVByb2plY3QoY2xpZW50SW5pdGlhbFByb2plY3RfLCB3c2RsVVJJXywgcGFyc2VyXykpCi0gICAgICB7ICAgICAgICAgICAgCi0gICAgICAgIGNsaWVudFJ1bnRpbWVKMkVFVHlwZV8gPSBnZXRDbGllbnRSdW50aW1lQW5kSjJFRUZyb21Qcm9qZWN0KGluaXRpYWxJbml0aWFsUHJvamVjdF8pOwotICAgICAgICBpZiAoY2xpZW50UnVudGltZUoyRUVUeXBlXyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgY2xpZW50SjJFRVZlcnNpb25fID0gY2xpZW50UnVudGltZUoyRUVUeXBlXy5nZXRKMmVlVmVyc2lvbklkKCk7Ci0gICAgICAgICAgc2V0Q2xpZW50UnVudGltZUlkKGNsaWVudFJ1bnRpbWVKMkVFVHlwZV8uZ2V0V3NySWQoKSk7Ci0gICAgICAgICAgc2V0Q2xpZW50UHJvamVjdFR5cGUoY2xpZW50UnVudGltZUoyRUVUeXBlXy5nZXRDbGllbnRQcm9qZWN0VHlwZUlkKCkpOwotICAgICAgICAgIC8vU2luY2UgdGhlIG9yaWdpbmFsIGNsaWVudEludGlhbFByb2plY3Qgd2FzIGludmFsaWQgYnV0IGluaXRpYWxJbml0aWFsUHJvamVjdCBpcyB2YWxpZCwKLSAgICAgICAgICAvL3Jlc2V0IGNsaWVudEluaXRhbFByb2plY3RfIHRvIGJlIGluaXRpYWxJbml0aWFsUHJvamVjdCBmb3IgdGhlIGJlbmVmaXQgb2YKLSAgICAgICAgICAvL2Rvd25zdHJlYW0gcHJvamVjdCBkZWZhdWx0aW5nLgotICAgICAgICAgIGNsaWVudEluaXRpYWxQcm9qZWN0XyA9IGluaXRpYWxJbml0aWFsUHJvamVjdF87Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICovCi0gICAgICAvL3NldENsaWVudERlZmF1bHRQcm9qZWN0KCk7Ci0gICAgICAvL3NldENsaWVudERlZmF1bHRFQVIoKTsKLSAgICAgIC8vc2V0Q2xpZW50RGVmYXVsdFNlcnZlcigpOwotCSAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJZCgoV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQoY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSkuZ2V0U2VydmVyRmFjdG9yeUlkcygpKVswXSk7Ci0gICAgICB1cGRhdGVDbGllbnRFQVJzKCk7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9DYXRjaCBhbGwgRXhjZXB0aW9ucyBpbiBvcmRlciB0byBnaXZlIHNvbWUgZmVlZGJhY2sgdG8gdGhlIHVzZXIKLSAgICAgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIsbmV3IFN0cmluZ1tde2UuZ2V0TWVzc2FnZSgpfSksU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0gICAgICByZXR1cm4gZXJyb3JTdGF0dXM7Ci0gICAgfQotICAgIAotICB9Ci0gIAotCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIHJ1bnRpbWVJZAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldENsaWVudFR5cGVzQ2hvaWNlKFN0cmluZyBydW50aW1lSWQpCi0gIHsKLSAgICAvL1dlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkgY3B0ciA9IENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmdbXSBjbGllbnRUeXBlczsKLQkvLyByc2tyZWcKLSAgICAvL1N0cmluZ1tdIGNsaWVudFByb2plY3RUeXBlcyA9IGdhdGhlckF0dHJpYnV0ZVZhbHVlcyhyZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoY2xpZW50SWRzXy5nZXRUeXBlSWQoKSwgcnVudGltZUlkKSwgImNsaWVudFByb2plY3RUeXBlIik7Ci0JY2xpZW50VHlwZXMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldENsaWVudFByb2plY3RUeXBlcyhjbGllbnRJZHNfLmdldFR5cGVJZCgpLCBydW50aW1lSWQpOwotCS8qCi0gICAgaWYgKGNsaWVudFByb2plY3RUeXBlcyE9bnVsbCAmJiBjbGllbnRQcm9qZWN0VHlwZXMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsaWVudFByb2plY3RUeXBlc1swXSk7Ci0gICAgICBjbGllbnRUeXBlcyA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaWVudFR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICBjbGllbnRUeXBlc1tpXSA9IHN0Lm5leHRUb2tlbigpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBjbGllbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7Y3B0ci5nZXREZWZhdWx0RWxlbWVudCgpLmdldEF0dHJpYnV0ZSgiaWQiKX07Ci0gICAgKi8KLSAgICAvLyByc2tyZWcKLQkvLyBTZW5nJ3MgTm90ZTogQ2hlY2sgZmxleGlibGUgcHJvamVjdCBzdHJ1Y3R1cmUgbm9uLXN1cHBvcnQgaGVyZSEhIQotICAgIFNlbGVjdGlvbkxpc3QgbGlzdCA9IG5ldyBTZWxlY3Rpb25MaXN0KGNsaWVudFR5cGVzLCAwKTsKLSAgICBWZWN0b3IgY2hvaWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaWVudFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBjaG9pY2VzLmFkZChnZXRQcm9qZWN0Q2hvaWNlKGNsaWVudFR5cGVzW2ldKSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMobGlzdCwgY2hvaWNlcyk7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gY2xpZW50VHlwZQotICAgKiBAcmV0dXJuCi0gICAqIAotICAgKi8KLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRQcm9qZWN0Q2hvaWNlKFN0cmluZyBjbGllbnRUeXBlKQotICB7Ci0gICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0cyhjbGllbnRUeXBlKTsKLSAgICBTdHJpbmdbXSBwcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW3Byb2plY3RzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICAgIHByb2plY3ROYW1lc1tpXSA9IHByb2plY3RzW2ldLmdldE5hbWUoKTsKLSAgICBTZWxlY3Rpb25MaXN0IGxpc3QgPSBuZXcgU2VsZWN0aW9uTGlzdChwcm9qZWN0TmFtZXMsIDApOwotICAgIFZlY3RvciBjaG9pY2VzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspCi0gICAgICBjaG9pY2VzLmFkZChnZXRQcm9qZWN0RUFSQ2hvaWNlKHByb2plY3RzW2ldKSk7Ci0gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyhsaXN0LCBjaG9pY2VzLCBnZXRFQVJQcm9qZWN0cygpKTsKLSAgfQotICAKLS8qKgotICogCi0gKiBAcGFyYW0gcHJvamVjdAotICogQHJldHVybgotICovCi0gIHByb3RlY3RlZCBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRQcm9qZWN0RUFSQ2hvaWNlKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQkvLyBUT0RPIHVzZWQgdG8gYmUgSjJFRVV0aWxzLmdldEVBUlByb2plY3RzKHByb2plY3QpIC0tIHJlZmVyZW5jZWQgRUFScwotICAgIElQcm9qZWN0W10gZWFyTmF0dXJlcyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cygpOwotICAgIGlmIChlYXJOYXR1cmVzICE9IG51bGwpewotICAgICAgZm9yKGludCBpID0gMDsgaSA8IGVhck5hdHVyZXMubGVuZ3RoOyBpKyspewotICAgICAgICB2LmFkZChlYXJOYXR1cmVzW2ldLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIElQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBKMkVFVXRpbHMuZ2V0RUFSUHJvamVjdHMoKTsKLSAgICBpZiAoZWFyUHJvamVjdHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyUHJvamVjdHMubGVuZ3RoOyBpKyspCi0gICAgCXsKLSAgICAJICBTdHJpbmcgZWFyUHJvamVjdE5hbWUgPSBlYXJQcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0gICAgCSAgaWYgKCF2LmNvbnRhaW5zKGVhclByb2plY3ROYW1lKSkKLSAgICAJICAJdi5hZGQoZWFyUHJvamVjdE5hbWUpOwotICAgIAl9Ci0gICAgfQotICAgIFNlbGVjdGlvbkxpc3QgbGlzdCA9IG5ldyBTZWxlY3Rpb25MaXN0KChTdHJpbmdbXSl2LnRvQXJyYXkobmV3IFN0cmluZ1swXSksIDApOwotICAgIHJldHVybiBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMobGlzdCwgbnVsbCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTZWxlY3Rpb25MaXN0IGdldEVBUlByb2plY3RzKCkKLSAgewotICAgIElQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBKMkVFVXRpbHMuZ2V0RUFSUHJvamVjdHMoKTsKLSAgICBTdHJpbmdbXSBlYXJQcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW2VhclByb2plY3RzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaT0wOyBpPGVhclByb2plY3RzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGVhclByb2plY3ROYW1lc1tpXSA9IGVhclByb2plY3RzW2ldLmdldE5hbWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0KGVhclByb2plY3ROYW1lcywgMCk7Ci0gIH0KLQotICAvLyByc2tyZWcKLSAgLyoKLSAgcHJpdmF0ZSBTdHJpbmdbXSBnYXRoZXJBdHRyaWJ1dGVWYWx1ZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMsIFN0cmluZyBrZXkpCi0gIHsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShrZXkpOwotICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBpZiAoIXYuY29udGFpbnModmFsdWUpKQotICAgICAgICAgIHYuYWRkKHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChTdHJpbmcgW10pdi50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0gICovCi0gIC8vIHJza3JlZwotICAKLSAgLy8gcnNrcmVnCi0gIC8qCi0gIHByaXZhdGUgdm9pZCBzZXRDbGllbnREZWZhdWx0UnVudGltZUZyb21QcmVmZXJlbmNlKCkKLSAgewotICAgIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAgIFN0cmluZyBwUnVudGltZUlkID0gY29udGV4dC5nZXRSdW50aW1lSWQoKTsKLQotICAgIC8vc2V0IHRoZSBjbGllbnQgcnVudGltZSB0byBiZSB0aGUgcHJlZmVycmVkIHJ1bnRpbWUgaWYgdGhlIGNsaWVudCB0eXBlIGFsbG93cy4KLSAgICBzZXRDbGllbnRSdW50aW1lSWQocFJ1bnRpbWVJZCk7Ci0gIH0KLSAgKi8KLSAgLy8gcnNrcmVnCi0gIAotICBwcml2YXRlIHZvaWQgc2V0Q2xpZW50UnVudGltZUlkKFN0cmluZyBpZCkKLSAgewotICAgIFN0cmluZ1tdIGNsaWVudFJ1bnRpbWVJZHMgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8Y2xpZW50UnVudGltZUlkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAJaWYoY2xpZW50UnVudGltZUlkc1tpXS5lcXVhbHMoaWQpKQotICAgIAl7Ci0gICAgCSAgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5zZXRSdW50aW1lSWQoaWQpOwotCQkgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRMaXN0KCkuc2V0SW5kZXgoaSk7Ci0JCSAgYnJlYWs7Ci0gICAJICAgIH0KLSAgICB9ICAgIAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0Q2xpZW50UHJvamVjdFR5cGUoU3RyaW5nIGlkKQotICB7Ci0gICAgU3RyaW5nW10gY2xpZW50UHJvamVjdFR5cGVJZHMgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8Y2xpZW50UHJvamVjdFR5cGVJZHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgCWlmKGNsaWVudFByb2plY3RUeXBlSWRzW2ldLmVxdWFscyhpZCkpCi0gICAgCXsKLSAgICAJICBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldEluZGV4KGkpOwotCQkgIGJyZWFrOwotICAgCSAgICB9Ci0gICAgfSAgICAgICAgCi0gIH0KLSAgCi0gIC8vIHJza3JlZwotICAvKgotICBwcm90ZWN0ZWQgdm9pZCBzZXRDbGllbnREZWZhdWx0SjJFRVZlcnNpb25Gcm9tUHJlZmVyZW5jZSgpCi0gIHsKLSAgICBpZiAoY2xpZW50SWRzXyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBydW50aW1lSWQgPSBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpOwotICAgICAgaWYgKHJ1bnRpbWVJZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBJV2ViU2VydmljZVJ1bnRpbWUgd3NyID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQocnVudGltZUlkKTsKLSAgICAgICAgaWYgKHdzciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nW10gdmVyc2lvbnMgPSB3c3IuZ2V0SjJFRVZlcnNpb25zKCk7Ci0gICAgICAgICAgaWYgKHZlcnNpb25zICE9IG51bGwgJiYgdmVyc2lvbnMubGVuZ3RoID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgCVBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAgICAgICAgIAlTdHJpbmcgcEoyRUUgPSBjb250ZXh0LmdldEoyRUVWZXJzaW9uKCk7Ci0gICAgICAgICAgCWlmIChwSjJFRSE9bnVsbCAmJiBwSjJFRS5sZW5ndGgoKT4wKQotICAgICAgICAgIAl7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPHZlcnNpb25zLmxlbmd0aDtpKyspCi0gICAgICAgICAgCSAgewotICAgICAgICAgIAkJaWYgKHZlcnNpb25zW2ldLmVxdWFscyhwSjJFRSkpCi0gICAgICAgICAgCQl7Ci0gICAgICAgICAgCSAgICAgIGNsaWVudEoyRUVWZXJzaW9uXyA9IHZlcnNpb25zW2ldOwotICAgICAgICAgIAkJICByZXR1cm47Ci0gICAgICAgICAgCQl9Ci0gICAgICAgICAgCSAgfQotICAgICAgICAgIAl9Ci0gICAgICAgICAgCWNsaWVudEoyRUVWZXJzaW9uXyA9IHZlcnNpb25zWzBdOwotICAgICAgICAgIAlyZXR1cm47ICAgICAgICAgIAkKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAJCi0gIH0KLSAgKi8KLSAgLy8gcnNrcmVnCi0gIC8vIHJza3JlZwotICAvKgotICBwcml2YXRlIFdTUnVudGltZUoyRUVUeXBlIGdldENsaWVudFJ1bnRpbWVBbmRKMkVFRnJvbVByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIFdTUnVudGltZUoyRUVUeXBlIGNSSjJFRSA9IG51bGw7Ci0gICAgLy9JZiB0aGVyZSBpcyBhIHZhbGlkIGluaXRpYWwgc2VsZWN0aW9uLCB1c2UgaXQgdG8gZGV0ZXJtaW5lCi0gICAgLy9yZWFzb25hYmxlIEoyRUUgdmVyc2lvbiBhbmQgV2ViIHNlcnZpY2UgcnVudGltZSB2YWx1ZXMKLQotICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdCkgfHwgUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3QocHJvamVjdCkgfHwgUmVzb3VyY2VVdGlscy5pc0FwcENsaWVudFByb2plY3QocHJvamVjdCkgfHwgUmVzb3VyY2VVdGlscy5pc1RydWVKYXZhUHJvamVjdChwcm9qZWN0KSkKLSAgICAgIHsKLSAgICAgICAgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSB3c2N0UmVnID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgLy9HZXQgdGhlIEoyRUUgbGV2ZWwKLSAgICAgICAgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBudWxsOwotICAgICAgICBpZiAoIVJlc291cmNlVXRpbHMuaXNUcnVlSmF2YVByb2plY3QocHJvamVjdCkpCi0gICAgICAgIHsKLQkgICAgICBpbnQgdmVyc2lvbklkID0gSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKHByb2plY3QpOyAgICAgICAgCi0JICAgICAgdmVyc2lvblN0cmluZyA9IFN0cmluZy52YWx1ZU9mKHZlcnNpb25JZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0dldCB0aGUgcnVudGltZSB0YXJnZXQgb2YgdGhlIHByb2plY3QKLSAgICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFJ1bnRpbWVUYXJnZXQocHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gbnVsbDsKLSAgICAgICAgaWYgKHJ1bnRpbWVUYXJnZXQgIT0gbnVsbCkgCi0gICAgICAgICAgcnVudGltZVRhcmdldElkID0gcnVudGltZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIAotICAgICAgICAvL0dldCB0aGUgY2xpZW50IHByb2plY3QgdHlwZQotICAgICAgICBTdHJpbmcgY2xpZW50UHJvamVjdFR5cGVJZCA9IGdldENsaWVudFByb2plY3RUeXBlRnJvbVJ1bnRpbWVJZChwcm9qZWN0LCBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vSWYgdGhlIHByZWZlcnJlZCBydW50aW1lIHN1cHBvcnRzIHRoaXMgSjJFRSBsZXZlbCBhbmQgc2VydmVyIHRhcmdldCwga2VlcCBpdAotICAgICAgICBpZiAoKHZlcnNpb25TdHJpbmcgPT0gbnVsbCB8fCB3c2N0UmVnLmRvZXNSdW50aW1lU3VwcG9ydEoyRUVMZXZlbCh2ZXJzaW9uU3RyaW5nLCBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKSkgJiYKLSAgICAgICAgICAgICgocnVudGltZVRhcmdldCA9PSBudWxsKSB8fAotICAgICAgICAgICAgICgocnVudGltZVRhcmdldCAhPSBudWxsKSAmJiB3c2N0UmVnLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChydW50aW1lVGFyZ2V0SWQsIGNsaWVudElkc18uZ2V0UnVudGltZUlkKCkpKSkgJiYKLSAgICAgICAgICAgICAoY2xpZW50UHJvamVjdFR5cGVJZCAhPSBudWxsKQotICAgICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICAvL1NldCB0aGUgSjJFRSBsZXZlbCBhbmQgd2ViIHNlcnZpY2UgcnVudGltZSB0byBtYXRjaCB0aGUgcHJvamVjdAotICAgICAgICAgIGNSSjJFRSA9IG5ldyBXU1J1bnRpbWVKMkVFVHlwZSgpOwotICAgICAgICAgIGNSSjJFRS5zZXRKMmVlVmVyc2lvbklkKHZlcnNpb25TdHJpbmcpOwotICAgICAgICAgIGNSSjJFRS5zZXRXc3JJZChjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKTsKLSAgICAgICAgICBjUkoyRUUuc2V0Q2xpZW50UHJvamVjdFR5cGVJZChjbGllbnRQcm9qZWN0VHlwZUlkKTsKLSAgICAgICAgICByZXR1cm4gY1JKMkVFOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vTG9vayBmb3IgYSBydW50aW1lIHRoYXQgbWF0Y2hlcwotICAgICAgICAgIFN0cmluZ1tdIHZhbGlkUnVudGltZXMgPSB3c2N0UmVnLmdldFJ1bnRpbWVzQnlUeXBlKGNsaWVudElkc18uZ2V0VHlwZUlkKCkpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRSdW50aW1lcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdGhpc0NsaWVudFByb2plY3RUeXBlSWQgPSBnZXRDbGllbnRQcm9qZWN0VHlwZUZyb21SdW50aW1lSWQocHJvamVjdCwgdmFsaWRSdW50aW1lc1tpXSk7IAotICAgICAgICAgICAgaWYgKCh2ZXJzaW9uU3RyaW5nID09IG51bGwgfHwgd3NjdFJlZy5kb2VzUnVudGltZVN1cHBvcnRKMkVFTGV2ZWwodmVyc2lvblN0cmluZywgdmFsaWRSdW50aW1lc1tpXSkpICYmCi0gICAgICAgICAgICAgICAgKChydW50aW1lVGFyZ2V0ID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgICgocnVudGltZVRhcmdldCAhPSBudWxsKSAmJiB3c2N0UmVnLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChydW50aW1lVGFyZ2V0SWQsIHZhbGlkUnVudGltZXNbaV0pKSkgJiYKLSAgICAgICAgICAgICAgICAgKHRoaXNDbGllbnRQcm9qZWN0VHlwZUlkICE9IG51bGwpCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjUkoyRUUgPSBuZXcgV1NSdW50aW1lSjJFRVR5cGUoKTsKLSAgICAgICAgICAgICAgY1JKMkVFLnNldEoyZWVWZXJzaW9uSWQodmVyc2lvblN0cmluZyk7Ci0gICAgICAgICAgICAgIGNSSjJFRS5zZXRXc3JJZCh2YWxpZFJ1bnRpbWVzW2ldKTsKLSAgICAgICAgICAgICAgY1JKMkVFLnNldENsaWVudFByb2plY3RUeXBlSWQodGhpc0NsaWVudFByb2plY3RUeXBlSWQpOwotICAgICAgICAgICAgICByZXR1cm4gY1JKMkVFOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgCi0gICAgcmV0dXJuIGNSSjJFRTsKLSAgfQotICAqLwotICAvLyByc2tyZWcKLSAgLy8gcnNrcmVnCi0gIC8qCi0gIHByaXZhdGUgdm9pZCBzZXRDbGllbnREZWZhdWx0UHJvamVjdCgpCi0gIHsgICAgCi0JLy9IYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbm8gdmFsaWQgaW5pdGlhbCBzZWxlY3Rpb24gZXhpc3RzCi0gICAgaWYgKGNsaWVudEluaXRpYWxQcm9qZWN0XyA9PSBudWxsIHx8IChjbGllbnRJbml0aWFsUHJvamVjdF8hPW51bGwgJiYgY2xpZW50UnVudGltZUoyRUVUeXBlXz09bnVsbCkpCi0gICAgewotICAgICAgLy9TZWxlY3QgdGhlIGZpcnN0IGV4aXN0aW5nIHByb2plY3QgdGhhdCBpcyB2YWxpZC4KLSAgICAgIHNldENsaWVudFByb2plY3RUb0ZpcnN0VmFsaWQoKTsKLSAgICAgIHJldHVybjsKLSAgICB9ICAgIAotCi0gICAgVmFsaWRhdGlvblV0aWxzIHZ1ID0gbmV3IFZhbGlkYXRpb25VdGlscygpOwotICAgIGlmICghdnUuaXNQcm9qZWN0U2VydmljZVByb2plY3QoY2xpZW50SW5pdGlhbFByb2plY3RfLCB3c2RsVVJJXywgcGFyc2VyXykpCi0gICAgewotICAgICAgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShjbGllbnRJbml0aWFsUHJvamVjdF8uZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldENsaWVudFByb2plY3RUb0ZpcnN0VmFsaWQoKTsKLSAgICB9Ci0KLSAgfQotICAqLwotICAvKgotICBwcml2YXRlIHZvaWQgc2V0Q2xpZW50UHJvamVjdFRvRmlyc3RWYWxpZCgpCi0gIHsKLSAgICBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHdzY3RSZWcgPSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgVmFsaWRhdGlvblV0aWxzIHZ1ID0gbmV3IFZhbGlkYXRpb25VdGlscygpOwotICAgIFN0cmluZ1tdIHByb2plY3ROYW1lcyA9IGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpOwotICAgIGZvciAoaW50IGk9MDtpPHByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSgobmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShwcm9qZWN0TmFtZXNbaV0pKSk7Ci0gICAgICBpZiAocHJvamVjdC5pc09wZW4oKSAmJiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdCkgfHwgUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3QocHJvamVjdCkgfHwgUmVzb3VyY2VVdGlscy5pc0FwcENsaWVudFByb2plY3QocHJvamVjdCkpKQotICAgICAgewotICAgICAgICAvL0dldCB0aGUgSjJFRSBsZXZlbAotICAgICAgICBpbnQgdmVyc2lvbklkID0gSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKHByb2plY3QpOwotICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IFN0cmluZy52YWx1ZU9mKHZlcnNpb25JZCk7Ci0gICAgICAgIAotICAgICAgICAvL0dldCB0aGUgcnVudGltZSB0YXJnZXQgb2YgdGhlIHByb2plY3QKLSAgICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFJ1bnRpbWVUYXJnZXQocHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gbnVsbDsKLSAgICAgICAgaWYgKHJ1bnRpbWVUYXJnZXQgIT0gbnVsbCkgCi0gICAgICAgICAgcnVudGltZVRhcmdldElkID0gcnVudGltZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2xpZW50SjJFRVZlcnNpb25fICE9IG51bGwgJiYgY2xpZW50SjJFRVZlcnNpb25fLmxlbmd0aCgpPjAgJiYgY2xpZW50SjJFRVZlcnNpb25fLmVxdWFscyh2ZXJzaW9uU3RyaW5nKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICh3c2N0UmVnLmRvZXNSdW50aW1lU3VwcG9ydEoyRUVMZXZlbCh2ZXJzaW9uU3RyaW5nLCBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKSAmJgotICAgICAgICAgICAgICgocnVudGltZVRhcmdldCA9PSBudWxsKSB8fCAKLSAgICAgICAgICAgICAoKHJ1bnRpbWVUYXJnZXQhPW51bGwpICYmIHdzY3RSZWcuZG9lc1J1bnRpbWVTdXBwb3J0U2VydmVyVGFyZ2V0KHJ1bnRpbWVUYXJnZXRJZCwgY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSkpKSAKLSAgICAgICAgICAgICApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCF2dS5pc1Byb2plY3RTZXJ2aWNlUHJvamVjdChwcm9qZWN0LCB3c2RsVVJJXywgcGFyc2VyXykpCi0gICAgICAgICAgICB7ICAgICAgICAJCi0gICAgICAgICAgICAgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUocHJvamVjdE5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvL05vIHZhbGlkIHByb2plY3Qgd2FzIGZvdW5kLiBFbnRlciBhIG5ldyBwcm9qZWN0IG5hbWUuCi0gICAgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShSZXNvdXJjZVV0aWxzLmdldERlZmF1bHRXZWJQcm9qZWN0TmFtZSgpKTsKLSAgfQotICAqLwotICAvLyByc2tyZWcKLSAgCi0gIHByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGcm9tSW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotICAgICAgICAgIHJldHVybiByZXNvdXJjZTsKLSAgICAgICAgfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0Q2xpZW50RGVmYXVsdEVBUigpCi0gIHsKLSAgCS8vQ2xpZW50LXNpZGUKLSAgICBTdHJpbmcgaW5pdGlhbENsaWVudFByb2plY3ROYW1lID0gZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsgCi0gICAgSVByb2plY3QgaW5pdGlhbENsaWVudFByb2plY3QgPSAoSVByb2plY3QpKChuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpLnRyYW5zZm9ybShpbml0aWFsQ2xpZW50UHJvamVjdE5hbWUpKTsgIAkKLSAgCUlQcm9qZWN0IGRlZmF1bHRDbGllbnRFQVIgPSBnZXREZWZhdWx0RUFSRnJvbUNsaWVudFByb2plY3QoaW5pdGlhbENsaWVudFByb2plY3QpOwotICAJZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShkZWZhdWx0Q2xpZW50RUFSLmdldE5hbWUoKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIHByb2plY3QKLSAgICogQHJldHVybgotICAgKiAKLSAgICogQGRlcHJlY2F0ZWQgTmVlZHMgdG8gYmUgcmUtd3JpdHRlbiB0byBkZWFsIHdpdGggZmxleGlibGUgcHJvamVjdCBzdHJ1Y3R1cmUgQVBJcyAKLSAgICovCi0gIHByb3RlY3RlZCBJUHJvamVjdCBnZXREZWZhdWx0RUFSRnJvbUNsaWVudFByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIGlmIChwcm9qZWN0IT1udWxsICYmIHByb2plY3QuZXhpc3RzKCkpIAotICAgIHsKLSAgICAgIElTZXJ2ZXJbXSBjb25maWd1cmVkU2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKTsKLSAgICAgIElTZXJ2ZXIgZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgPSBDbGllbnRTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihjb25maWd1cmVkU2VydmVycywgY2xpZW50SWRzXy5nZXRUeXBlSWQoKSApOwotICAgICAgCi0gICAgICBFQVJOYXR1cmVSdW50aW1lW10gZWFyUHJvamVjdHMgPSBKMkVFVXRpbHMuZ2V0RUFSUHJvamVjdHMocHJvamVjdCwgZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIpOwotICAgICAgaWYgKGVhclByb2plY3RzIT1udWxsICYmIGVhclByb2plY3RzWzBdIGluc3RhbmNlb2YgRUFSTmF0dXJlUnVudGltZSkgCi0gICAgICAgIHJldHVybiBlYXJQcm9qZWN0c1swXS5nZXRQcm9qZWN0KCk7Ci0gICAgfQotICAgIAotICAgIGludCB2ZXJzaW9uSWQgPSAtMTsKLSAgICBpZiAoY2xpZW50SjJFRVZlcnNpb25fICE9IG51bGwgJiYgY2xpZW50SjJFRVZlcnNpb25fLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgdmVyc2lvbklkID0gSW50ZWdlci5wYXJzZUludChjbGllbnRKMkVFVmVyc2lvbl8pOwotICAgIH0KLSAgICBFQVJOYXR1cmVSdW50aW1lIG5ld0VBUiA9IEoyRUVVdGlscy5nZXRFQVIodmVyc2lvbklkKTsKLQotICAgIElQcm9qZWN0IGVhclByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KFJlc291cmNlVXRpbHMuZ2V0RGVmYXVsdENsaWVudEVBUlByb2plY3ROYW1lKCkpOwotICAgICAgCi0gICAgaWYgKG5ld0VBUiE9bnVsbCkKLSAgICAgIGVhclByb2plY3QgPSBuZXdFQVIuZ2V0UHJvamVjdCgpOwotCi0gICAgcmV0dXJuIGVhclByb2plY3Q7ICAJCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXRDbGllbnREZWZhdWx0U2VydmVyKCkKLSAgewotICAgIC8vQ2FsY3VsYXRlIHJlYXNvbmFibGUgZGVmYXVsdCBzZXJ2ZXIgYmFzZWQgb24gaW5pdGlhbCBwcm9qZWN0IHNlbGVjdGlvbi4gCi0gICAgU3RyaW5nIGluaXRpYWxDbGllbnRQcm9qZWN0TmFtZSA9IHJ1bnRpbWVDbGllbnRUeXBlc18uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOyAKLSAgICBJUHJvamVjdCBpbml0aWFsQ2xpZW50UHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKGluaXRpYWxDbGllbnRQcm9qZWN0TmFtZSkpOwotICAgIGlmIChpbml0aWFsQ2xpZW50UHJvamVjdC5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBzZXJ2ZXJJbmZvID0gQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0U2VydmVySW5mb0Zyb21FeGlzdGluZ1Byb2plY3QoaW5pdGlhbENsaWVudFByb2plY3QsIGNsaWVudElkc18uZ2V0VHlwZUlkKCksIGNsaWVudElkc18uZ2V0UnVudGltZUlkKCksIHRydWUpOwotICAgICAgaWYgKHNlcnZlckluZm8hPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChzZXJ2ZXJJbmZvWzBdIT1udWxsICYmIHNlcnZlckluZm9bMF0ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIGNsaWVudElkc18uc2V0U2VydmVySWQoc2VydmVySW5mb1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlcnZlckluZm9bMV0hPW51bGwgJiYgc2VydmVySW5mb1sxXS5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHNlcnZlckluZm9bMV0pOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL3RoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0LgotICAgIHsKLSAgICAgIC8vRG9lcyB0aGUgRUFSIGV4aXN0PwotICAgICAgU3RyaW5nIGluaXRpYWxDbGllbnRFQVJQcm9qZWN0TmFtZSA9IHJ1bnRpbWVDbGllbnRUeXBlc18uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAgICAgSVByb2plY3QgaW5pdGlhbENsaWVudEVBUlByb2plY3QgPSAoSVByb2plY3QpKChuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpLnRyYW5zZm9ybShpbml0aWFsQ2xpZW50RUFSUHJvamVjdE5hbWUpKTsKLSAgICAgIGlmIChpbml0aWFsQ2xpZW50RUFSUHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nW10gc2VydmVySW5mbyA9IENsaWVudFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFNlcnZlckluZm9Gcm9tRXhpc3RpbmdQcm9qZWN0KGluaXRpYWxDbGllbnRFQVJQcm9qZWN0LCBjbGllbnRJZHNfLmdldFR5cGVJZCgpLCBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpLCBmYWxzZSk7Ci0gICAgICAgIGlmIChzZXJ2ZXJJbmZvIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHNlcnZlckluZm9bMF0hPW51bGwgJiYgc2VydmVySW5mb1swXS5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNsaWVudElkc18uc2V0U2VydmVySWQoc2VydmVySW5mb1swXSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzZXJ2ZXJJbmZvWzFdIT1udWxsICYmIHNlcnZlckluZm9bMV0ubGVuZ3RoKCk+MCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjbGllbnRJZHNfLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVySW5mb1sxXSk7Ci0gICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmdbXSBzZXJ2ZXJJbmZvID0gQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0U2VydmVyRnJvbUNsaWVudFJ1bnRpbWVBbmRKMkVFKGNsaWVudElkc18uZ2V0UnVudGltZUlkKCksIGNsaWVudEoyRUVWZXJzaW9uXyk7Ci0gICAgICAgIGlmIChzZXJ2ZXJJbmZvIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHNlcnZlckluZm9bMF0hPW51bGwgJiYgc2VydmVySW5mb1swXS5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNsaWVudElkc18uc2V0U2VydmVySWQoc2VydmVySW5mb1swXSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzZXJ2ZXJJbmZvWzFdIT1udWxsICYmIHNlcnZlckluZm9bMV0ubGVuZ3RoKCk+MCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjbGllbnRJZHNfLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVySW5mb1sxXSk7Ci0gICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgfSAgICAgICAgCi0gIH0gIAotCi0gIAotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDbGllbnRFQVJzKCkKLSAgewotICAJLy9TZXQgRUFSIHNlbGVjdGlvbiB0byBudWxsIGlmIHRoZSBwcm9qZWN0L3NlcnZlciBkZWZhdWx0cyBpbXBseSBhbiBFQVIgc2hvdWxkIG5vdCBiZSBjcmVhdGVkCi0gICAgU3RyaW5nIGNsaWVudFByb2plY3ROYW1lID0gZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgCUlQcm9qZWN0IGNsaWVudFByb2plY3QgPSAoSVByb2plY3QpKChuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpLnRyYW5zZm9ybShjbGllbnRQcm9qZWN0TmFtZSkpOwotICAJaWYgKGNsaWVudFByb2plY3QgIT0gbnVsbCAmJiBjbGllbnRQcm9qZWN0LmV4aXN0cygpKQotICAJewotICAJICAvL0dldCB0aGUgcnVudGltZSB0YXJnZXQgb24gdGhlIHNlcnZpY2VQcm9qZWN0Ci0gIAkgIElSdW50aW1lIGNsaWVudFRhcmdldCA9IENsaWVudFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFJ1bnRpbWVUYXJnZXQoY2xpZW50UHJvamVjdE5hbWUpOwotICAJICBTdHJpbmcgajJlZVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb24oY2xpZW50UHJvamVjdCkpOwotICAJICBpZiAoY2xpZW50VGFyZ2V0ICE9IG51bGwpCi0gIAkgIHsKLSAgCSAgCWlmICghU2VydmVyVXRpbHMuaXNUYXJnZXRWYWxpZEZvckVBUihjbGllbnRUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpLGoyZWVWZXJzaW9uKSkKLSAgCSAgCXsKLSAgCSAgICAgIC8vRGVmYXVsdCB0aGUgRUFSIHNlbGVjdGlvbiB0byBiZSBlbXB0eQotICAJICAJICBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldEluZGV4KC0xKTsKLSAgCSAgCSAgY2xpZW50TmVlZEVBUl8gPSBmYWxzZTsKLSAgCSAgCX0gIAkgIAkJCi0gIAkgIH0KLSAgCSAgCi0gIAl9Ci0gIAllbHNlCi0gIAl7Ci0gIAkJLy9Vc2UgdGhlIHNlcnZlciB0eXBlCi0gIAkJU3RyaW5nIGNsaWVudFNlcnZlclRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0UnVudGltZVRhcmdldElkRnJvbUZhY3RvcnlJZChjbGllbnRJZHNfLmdldFNlcnZlcklkKCkpOwotICAJCWlmIChjbGllbnRTZXJ2ZXJUYXJnZXRJZCE9bnVsbCAmJiBjbGllbnRTZXJ2ZXJUYXJnZXRJZC5sZW5ndGgoKT4wKQotICAJCXsKLSAgCQkgIGlmICghU2VydmVyVXRpbHMuaXNUYXJnZXRWYWxpZEZvckVBUihjbGllbnRTZXJ2ZXJUYXJnZXRJZCxjbGllbnRKMkVFVmVyc2lvbl8pKQotICAJICAJICB7Ci0gIAkgICAgICAgIC8vRGVmYXVsdCB0aGUgRUFSIHNlbGVjdGlvbiB0byBiZSBlbXB0eQotICAJICAJICAgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0SW5kZXgoLTEpOwotICAJICAJICAgIGNsaWVudE5lZWRFQVJfID0gZmFsc2U7Ci0gIAkgIAkgIH0KLSAgCQl9Ci0gIAl9ICAJCi0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBjbGllbnRJbml0aWFsU2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsKLSAgICBpZiAoY2xpZW50SW5pdGlhbFByb2plY3RfID09IG51bGwpCi0gICAgewotICAgICAgY2xpZW50SW5pdGlhbFByb2plY3RfID0gZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50SW5pdGlhbFByb2plY3QoSVByb2plY3QgY2xpZW50SW5pdGlhbFByb2plY3QpCi0gIHsKLSAgICBjbGllbnRJbml0aWFsUHJvamVjdF8gPSBjbGllbnRJbml0aWFsUHJvamVjdDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBpbml0aWFsSW5pdGlhbFNlbGVjdGlvbl8gVGhlIGluaXRpYWxJbml0aWFsU2VsZWN0aW9uXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsSW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsSW5pdGlhbFNlbGVjdGlvbikKLSAgewotICAgIGluaXRpYWxJbml0aWFsU2VsZWN0aW9uXyA9IGluaXRpYWxJbml0aWFsU2VsZWN0aW9uOwotICAgIGluaXRpYWxJbml0aWFsUHJvamVjdF8gPSBnZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oaW5pdGlhbEluaXRpYWxTZWxlY3Rpb24pOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDbGllbnROZWVkRUFSKCkKLSAgewotICAgIHJldHVybiBjbGllbnROZWVkRUFSXzsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcGFyc2VyXyBUaGUgcGFyc2VyXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciBwYXJzZXIpIHsKLSAgCXBhcnNlcl8gPSBwYXJzZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB3c2RsVVJJXyA9IHdzZGxVUkk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7IAotICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgaWYgKHJlc291cmNlPT1udWxsKSAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIElQcm9qZWN0IHAgPSBSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0VHlwZUZyb21SdW50aW1lSWQoSVByb2plY3QgcCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIC8vTmF2aWdhdGUgdGhlIHJ1bnRpbWVDbGllbnRUeXBlcyB0byBzZWUgaWYgd2UgY2FuIG5hdmlnYXRlIGZyb20gdGhlIHByb3ZpZGVkCi0gICAgLy9ydW50aW1lIHRvIHRoZSBwcm92aWRlZCBwcm9qZWN0J3MgbmFtZS4KLSAgICBTdHJpbmcgcE5hbWUgPSBwLmdldE5hbWUoKTsKLSAgICBTdHJpbmdbXSBydW50aW1lSWRzID0gZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldExpc3QoKS5nZXRMaXN0KCk7Ci0gICAgaW50IG51bWJlck9mUnVudGltZXMgPSBydW50aW1lSWRzLmxlbmd0aDsKLSAgICAvL0dldCB0aGUgaW5kZXggb2YgdGhlIHJ1bnRpbWVJZCB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotICAgIGZvciAoaW50IGk9MDsgaTxudW1iZXJPZlJ1bnRpbWVzOyBpKyspCi0gICAgewotICAgICAgaWYgKHJ1bnRpbWVJZHNbaV0uZXF1YWxzKHJ1bnRpbWVJZCkpCi0gICAgICB7Ci0gICAgICAgIC8vR2V0IHRoZSBsaXN0IG9mIGNsaWVudCBwcm9qZWN0IHR5cGVzIGZvciB0aGlzIHJ1bnRpbWVJZAotICAgICAgICBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjbGllbnRQcm9qZWN0VHlwZXNUb1Byb2plY3RzPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKGkpOwotICAgICAgICBTdHJpbmdbXSBjbGllbnRQcm9qZWN0VHlwZXMgPSBjbGllbnRQcm9qZWN0VHlwZXNUb1Byb2plY3RzLmdldExpc3QoKS5nZXRMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGo9MDsgajxjbGllbnRQcm9qZWN0VHlwZXMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAvL0dldCB0aGUgbGlzdCBvZiBwcm9qZWN0cyBmb3IgdGhpcyBjbGllbnRQcm9qZWN0VHlwZS4gSWYgcE5hbWUKLSAgICAgICAgICAvL2lzIGluIHRoaXMgbGlzdCwgd2Uga25vdyB0aGUgcnVudGltZUlkIHN1cHBvcnRzIHRoaXMgcHJvamVjdAotICAgICAgICAgIC8vYW5kIHdlIGtub3cgdGhlIGNsaWVudCBwcm9qZWN0IHR5cGUuCi0gICAgICAgICAgU3RyaW5nW10gY2xpZW50UHJvamVjdHMgPSBjbGllbnRQcm9qZWN0VHlwZXNUb1Byb2plY3RzLmdldENob2ljZShqKS5nZXRMaXN0KCkuZ2V0TGlzdCgpOwotICAgICAgICAgIGZvciAoaW50IGs9MDsgazxjbGllbnRQcm9qZWN0cy5sZW5ndGg7IGsrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50UHJvamVjdHNba10uZXF1YWxzKHBOYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy9Gb3VuZCB0aGUgcHJvamVjdCEhCi0gICAgICAgICAgICAgIHJldHVybiBjbGllbnRQcm9qZWN0VHlwZXNbal07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotICAgIH0KLQotICAgIC8vV2UgZGlkbid0IGZpbmQgdGhlIHByb2plY3QgdW5kZXIgYW55IG9mIHRoaXMgcnVudGltZXMgY2xpZW50IHByb2plY3QgdHlwZXMuCi0gICAgLy9UaGlzIG1lYW5zIHRoYXQgdGhpcyBydW50aW1lIGRvZXMgbm90IHN1cHBvcnQgdGhhdCBjbGllbnQgdHlwZS4gUmV0dXJuIG51bGwKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKioKLSAgICogVGhpcyBpbm5lciBjbGFzcyBpcyBiZWluZyB1c2VkIHRvIHBhc3MgYXJvdW5kIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKLSAgICogYW5kIEoyRUUgbGV2ZWwgaW5mb3JtYXRpb24uCi0gICAqIAotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIFdTUnVudGltZUoyRUVUeXBlCi0gIHsKLSAgICBwcml2YXRlIFN0cmluZyB3c3JJZF87Ci0gICAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb25JZF87Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdFR5cGVJZDsgLy9vbmx5IHVzZWQgZm9yIGNsaWVudC1zaWRlIGRlZmF1bHRpbmcKLSAgICAKLSAgICBwdWJsaWMgV1NSdW50aW1lSjJFRVR5cGUoKQotICAgIHsKLSAgICAgLy9tYWtpbmcgdGhpcyBjdG9yIHB1YmxpYyBzbyB0aGF0IHN1YmNsYXNzZXMgY2FuIGluc3RhbnRpYXRlLiAKLSAgICB9ICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgajJlZVZlcnNpb25JZF8uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKMmVlVmVyc2lvbklkKCkKLSAgICB7Ci0gICAgICByZXR1cm4gajJlZVZlcnNpb25JZF87Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2ZXJzaW9uSWRfIFRoZSBqMmVlVmVyc2lvbklkXyB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SjJlZVZlcnNpb25JZChTdHJpbmcgdmVyc2lvbklkXykKLSAgICB7Ci0gICAgICBqMmVlVmVyc2lvbklkXyA9IHZlcnNpb25JZF87Ci0gICAgfQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NySWRfLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3NySWQoKQotICAgIHsKLSAgICAgIHJldHVybiB3c3JJZF87Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3c3JJZF8gVGhlIHdzcklkXyB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V3NySWQoU3RyaW5nIHdzcklkXykKLSAgICB7Ci0gICAgICB0aGlzLndzcklkXyA9IHdzcklkXzsKLSAgICB9ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50UHJvamVjdFR5cGVJZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFByb2plY3RUeXBlSWQoKQotICAgIHsKLSAgICAgIHJldHVybiBjbGllbnRQcm9qZWN0VHlwZUlkOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2xpZW50UHJvamVjdFR5cGVJZCBUaGUgY2xpZW50UHJvamVjdFR5cGVJZCB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdFR5cGVJZChTdHJpbmcgY2xpZW50UHJvamVjdFR5cGVJZCkKLSAgICB7Ci0gICAgICB0aGlzLmNsaWVudFByb2plY3RUeXBlSWQgPSBjbGllbnRQcm9qZWN0VHlwZUlkOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1Byb2plY3RTZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1Byb2plY3RTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwMzYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvcnVudGltZS9Qcm9qZWN0U2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5TZXJ2ZXJTZWxlY3Rpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdFNlbGVjdGlvbldpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRUFSX1BFUk1JVFRFRF9QUk9KRUNUX1RZUEUgPSAiRUFSX1BFUk1JVFRFRF9QUk9KRUNUX1RZUEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBKQVZBX1BST0pFQ1RfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuQ29udGFpbmVybGVzcyI7Ci0gIAotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHByb2plY3RzXzsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBuZWVkRUFSXzsKLSAgCi0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgdHJzSWRzXzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uXzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHByb2plY3RUeXBlSWRfID0gRUFSX1BFUk1JVFRFRF9QUk9KRUNUX1RZUEU7Ci0KLSAgcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBwcm9qZWN0TGlzdGVuZXJfOwotCi0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXJfOwotCi0gIHByaXZhdGUgVGV4dCBtZXNzYWdlVGV4dF87Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50XyA9IGZhbHNlOwotCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotCi0gIHByaXZhdGUgYnl0ZSBDUkVBVEVfUFJPSkVDVCA9IChieXRlKSAxOwotCi0gIHByaXZhdGUgYnl0ZSBDUkVBVEVfRUFSID0gKGJ5dGUpIDI7Ci0KLSAgcHJpdmF0ZSBieXRlIEFERF9FQVJfQVNTT0NJQVRJT04gPSAoYnl0ZSkgNDsKLQotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDA2IGZvciB0aGUgc2VydmljZS1zaWRlIFdlYiBwcm9qZWN0IGNvbWJvIGJveCBvZiB0aGUKLSAgICogcnVudGltZSBzZWxlY3Rpb24gUGFnZQotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0NPTUJPX1BST0pFQ1QgPSBwbHVnaW5JZF8gKyAiLlBXUlMwMDA2IjsKLQotICBwcml2YXRlIENvbWJvIHByb2plY3RfOwotCi0gIC8qIENPTlRFWFRfSUQgUFdSUzAwMTIgZm9yIHRoZSBFQVIgY29tYm8gYm94IG9mIHRoZSBydW50aW1lIHNlbGVjdGlvbiBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19DT01CT19FQVIgPSBwbHVnaW5JZF8gKyAiLlBXUlMwMDEyIjsKLQotICBwcml2YXRlIENvbWJvIGVhcl87Ci0KLSAgLyoKLSAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFByb2plY3RTZWxlY3Rpb25XaWRnZXQoKSB7Ci0gIH0KLQotICAvKgotICAgKiBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0IEBwYXJhbSBpc0NsaWVudAotICAgKi8KLSAgcHVibGljIFByb2plY3RTZWxlY3Rpb25XaWRnZXQoYm9vbGVhbiBpc0NsaWVudCkgewotICAgIHRoaXMuaXNDbGllbnRfID0gaXNDbGllbnQ7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIFVJVXRpbHMgdWlVdGlscyA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBwbHVnaW5JZF8pOwotCi0gICAgc3RhdHVzTGlzdGVuZXJfID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgLy8gcHJvamVjdAotICAgIHByb2plY3RMaXN0ZW5lcl8gPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZ0KSB7Ci0gICAgICAgIGhhbmRsZVNldEVhclByb2plY3RzKCk7Ci0gICAgICAgIC8vICAgICAgICBoYW5kbGVTZXRNZXNzYWdlVGV4dCgpOwotICAgICAgfQotICAgIH07Ci0gICAgCi0gICAgaWYgKGlzQ2xpZW50Xyl7Ci0gICAgICBwcm9qZWN0XyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8ocGFyZW50LCAiTEFCRUxfQ0xJRU5UX1BST0pFQ1QiLCAiVE9PTFRJUF9QV1JTX0NPTUJPX1BST0pFQ1QiLCBJTkZPUE9QX1BXUlNfQ09NQk9fUFJPSkVDVCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHByb2plY3RfID0gdWlVdGlscy5jcmVhdGVDb21ibyhwYXJlbnQsICJMQUJFTF9TRVJWSUNFX1dFQl9NT0RVTEUiLCAiVE9PTFRJUF9QV1JTX0NPTUJPX1BST0pFQ1QiLCBJTkZPUE9QX1BXUlNfQ09NQk9fUFJPSkVDVCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIH0KLSAgICBwcm9qZWN0Xy5hZGRNb2RpZnlMaXN0ZW5lcihwcm9qZWN0TGlzdGVuZXJfKTsKLQotICAgIGVhcl8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHBhcmVudCwgIkxBQkVMX1NFUlZJQ0VfRUFSX1BST0pFQ1QiLCAiVE9PTFRJUF9QV1JTX0NPTUJPX1BST0pFQ1QiLCBJTkZPUE9QX1BXUlNfQ09NQk9fRUFSLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgLy9lYXJfLmFkZE1vZGlmeUxpc3RlbmVyKGVhckxpc3RlbmVyXyk7Ci0gICAgZWFyXy5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lcik7Ci0gICAgLy8gbWVzc2FnZSBhcmVhCi0gICAgbWVzc2FnZVRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KHBhcmVudCwgIkxBQkVMX05PX0xBQkVMIiwgIkxBQkVMX05PX0xBQkVMIiwgbnVsbCwgU1dULldSQVAgfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3RDaG9pY2VzKFNlbGVjdGlvbkxpc3RDaG9pY2VzIHByb2plY3RzKSB7Ci0gICAgcHJvamVjdHNfID0gcHJvamVjdHM7Ci0gICAgU2VsZWN0aW9uTGlzdCBwcm9qZWN0TGlzdCA9IHByb2plY3RzXy5nZXRMaXN0KCk7Ci0gICAgLy8gV2UgcmVtb3ZlIGxpc3RlbmVyIGhlcmUgc28gdGhhdCBtb2RpZmljYXRpb25zIHRvIHRoZSBDb21ibyB3aWxsCi0gICAgLy8gTk9UIHRyaWdnZXIgYQotICAgIC8vIG1vZGlmY2F0aW9uIGV2ZW50LgotICAgIHByb2plY3RfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHByb2plY3RMaXN0ZW5lcl8pOwotICAgIHByb2plY3RfLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyXyk7Ci0gICAgcHJvamVjdF8uc2V0SXRlbXMocHJvamVjdExpc3QuZ2V0TGlzdCgpKTsKLSAgICBwcm9qZWN0Xy5zZXRUZXh0KHByb2plY3RMaXN0LmdldFNlbGVjdGlvbigpKTsKLSAgICBwcm9qZWN0Xy5hZGRNb2RpZnlMaXN0ZW5lcihwcm9qZWN0TGlzdGVuZXJfKTsKLSAgICBwcm9qZWN0Xy5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lcl8pOwotCi0gICAgaGFuZGxlU2V0RWFyUHJvamVjdHMoKTsKLQotICB9Ci0KLSAgcHVibGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldFByb2plY3RDaG9pY2VzKCkgewotICAgIGlmIChwcm9qZWN0c18gIT0gbnVsbCkgewotICAgICAgU2VsZWN0aW9uTGlzdCBwcm9qZWN0TGlzdCA9IHByb2plY3RzXy5nZXRMaXN0KCk7Ci0gICAgICBwcm9qZWN0TGlzdC5zZXRTZWxlY3Rpb25WYWx1ZShwcm9qZWN0Xy5nZXRUZXh0KCkpOwotICAgICAgU2VsZWN0aW9uTGlzdENob2ljZXMgZWFycyA9IHByb2plY3RzXy5nZXRDaG9pY2UoKTsKLSAgICAgIGlmIChlYXJzICE9IG51bGwpIGVhcnMuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGVhcl8uZ2V0VGV4dCgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2plY3RzXzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0TmVlZEVBUigpCi0gIHsKLSAgICByZXR1cm4gbmVlZEVBUl87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5lZWRFQVIoYm9vbGVhbiBiKQotICB7Ci0gICAgbmVlZEVBUl8gPSBiOwotICB9ICAgIAotCi0gIAotICBwdWJsaWMgdm9pZCBzZXRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciB0cnMpCi0gIHsKLSAgICB0cnNJZHNfID0gdHJzOwotICAgIHVwZGF0ZUVBUkVuYWJsZWRTdGF0ZSgpOwotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgICBqMmVlVmVyc2lvbl8gPSBqMmVlVmVyc2lvbjsKLSAgICB1cGRhdGVFQVJFbmFibGVkU3RhdGUoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdFR5cGVJZChTdHJpbmcgaWQpCi0gIHsKLSAgICBwcm9qZWN0VHlwZUlkXyA9IGlkOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlU2V0RWFyUHJvamVjdHMoKSB7Ci0gICAgU2VsZWN0aW9uTGlzdCBwcm9qZWN0TGlzdCA9IHByb2plY3RzXy5nZXRMaXN0KCk7Ci0gICAgcHJvamVjdExpc3Quc2V0U2VsZWN0aW9uVmFsdWUocHJvamVjdF8uZ2V0VGV4dCgpKTsKLSAgICBTZWxlY3Rpb25MaXN0IGVhckxpc3QgPSBwcm9qZWN0c18uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpOwotICAgIGVhcl8ucmVtb3ZlTGlzdGVuZXIoU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXJfKTsKLSAgICBlYXJfLnNldEl0ZW1zKGVhckxpc3QuZ2V0TGlzdCgpKTsKLSAgICBlYXJfLnNldFRleHQoZWFyTGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgZWFyXy5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lcl8pOwotICAgIHVwZGF0ZUVBUkVuYWJsZWRTdGF0ZSgpOwotICAgIGhhbmRsZVNldE1lc3NhZ2VUZXh0KCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlRUFSRW5hYmxlZFN0YXRlKCkKLSAgewotICAgIGVhcl8ucmVtb3ZlTGlzdGVuZXIoU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXJfKTsKLSAgICBpZiAocHJvamVjdHNfICE9IG51bGwpCi0gICAgewotICAgICAgU2VsZWN0aW9uTGlzdCBlYXJMaXN0ID0gcHJvamVjdHNfLmdldENob2ljZSgpLmdldExpc3QoKTsKLSAgICAgIGlmKCFwcm9qZWN0TmVlZHNFQVIocHJvamVjdF8uZ2V0VGV4dCgpKSkKLSAgICAgIHsKLSAgICAgICAgZWFyTGlzdC5zZXRJbmRleCgtMSk7ICAgICAgICAKLSAgICAgICAgZWFyXy5zZXRUZXh0KCIiKTsKLSAgICAgICAgbmVlZEVBUl8gPSBmYWxzZTsKLSAgICAgICAgZWFyXy5zZXRFbmFibGVkKGZhbHNlKTsgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBuZWVkRUFSXyA9IHRydWU7Ci0gICAgICAgIGVhcl8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWFyXy5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lcl8pOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHByb2plY3ROZWVkc0VBUihTdHJpbmcgcHJvamVjdE5hbWUpCi0gIHsKLSAgICBpZiAocHJvamVjdFR5cGVJZF8uZXF1YWxzKEpBVkFfUFJPSkVDVF9UWVBFX0lEKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAocHJvamVjdE5hbWUgPT0gbnVsbCB8fCBwcm9qZWN0TmFtZS5sZW5ndGgoKT09MCkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAgIC8vSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKHByb2plY3ROYW1lKSk7Ci0JSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpKQotICAJewotICAJICAvL0dldCB0aGUgcnVudGltZSB0YXJnZXQgb24gdGhlIHByb2plY3QKLSAgCSAgSVJ1bnRpbWUgdGFyZ2V0ID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0UnVudGltZVRhcmdldChwcm9qZWN0TmFtZSk7Ci0gIAkgIFN0cmluZyBqMmVlVmVyc2lvbiA9IFN0cmluZy52YWx1ZU9mKEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbihwcm9qZWN0KSk7Ci0gIAkgIGlmICh0YXJnZXQgIT0gbnVsbCkKLSAgCSAgewotICAJICAJaWYgKCFTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKHRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCksajJlZVZlcnNpb24pKQotICAJICAJewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgCSAgCX0KLSAgCSAgCQkKLSAgCSAgfQotICAJfQotICAJZWxzZQotICAJewotICAJCS8vVXNlIHRoZSBzZXJ2ZXIgdHlwZQotICAJICAgIGlmICh0cnNJZHNfICE9IG51bGwpCi0gIAkgICAgewotICAJCSAgU3RyaW5nIHRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0UnVudGltZVRhcmdldElkRnJvbUZhY3RvcnlJZCh0cnNJZHNfLmdldFNlcnZlcklkKCkpOwotICAJCSAgaWYgKHRhcmdldElkIT1udWxsICYmIHRhcmdldElkLmxlbmd0aCgpPjApCi0gIAkJICB7Ci0gIAkJICAgIGlmICghU2VydmVyVXRpbHMuaXNUYXJnZXRWYWxpZEZvckVBUih0YXJnZXRJZCxqMmVlVmVyc2lvbl8pKQotICAJCSAgICB7Ci0gIAkJICAgICAgcmV0dXJuIGZhbHNlOwotICAJICAJICAgIH0KLSAgCQkgIH0KLSAgCSAgICB9Ci0gIAl9ICAgICAgCQotICAJCi0gIAlyZXR1cm4gdHJ1ZTsgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgU3RhdHVzIGhhbmRsZVNldE1lc3NhZ2VUZXh0KCkgewotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB0cnkgewotICAgICAgYnl0ZSByZXN1bHQgPSAoYnl0ZSkgMDsKLSAgICAgIGlmIChwcm9qZWN0Xy5nZXRUZXh0KCkubGVuZ3RoKCkgIT0gMCAmJiBlYXJfLmdldFRleHQoKS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0VGV4dCA9IHByb2plY3RfLmdldFRleHQoKTsKLSAgICAgICAgU3RyaW5nIGVhclRleHQgPSBlYXJfLmdldFRleHQoKTsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdFRleHQpOwotICAgICAgICBJUHJvamVjdCBlYXIgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGVhclRleHQpOwotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoYnl0ZSkgKHJlc3VsdCB8IENSRUFURV9QUk9KRUNUKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFlYXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChieXRlKSAocmVzdWx0IHwgQ1JFQVRFX0VBUik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChwcm9qZWN0LmV4aXN0cygpICYmIGVhci5leGlzdHMoKSkgewotICAgICAgICAgICAgaWYgKCFKMkVFVXRpbHMuaXNFQVJBc3NvY2lhdGVkKHByb2plY3QsIGVhcikpIHJlc3VsdCA9IChieXRlKSAocmVzdWx0IHwgQUREX0VBUl9BU1NPQ0lBVElPTik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoaXNDbGllbnRfKSB7Ci0gICAgICAgIG1lc3NhZ2VUZXh0Xy5zZXRUZXh0KGdldFZhbGlkYXRpb25NZXNzYWdlKHJlc3VsdCwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0NMSUVOVF9TVUIiKSkpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIG1lc3NhZ2VUZXh0Xy5zZXRUZXh0KGdldFZhbGlkYXRpb25NZXNzYWdlKHJlc3VsdCwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1NFUlZJQ0VfU1VCIikpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9NU0dfVkFMSURBVElPTl9JTlRFUk5BTF9FUlJPUiIpLCBTdGF0dXMuRVJST1IpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRWYWxpZGF0aW9uTWVzc2FnZShieXRlIHJlc3VsdCwgU3RyaW5nIHNlcnZpY2VPckNsaWVudCkgewotICAgIFN0cmluZyBtc2cgPSBudWxsOwotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuICIiOwotICAgIGNhc2UgMToKLSAgICBjYXNlIDU6Ci0gICAgICBtc2cgPSAiTVNHX1BST0pFQ1RfV0lMTF9CRV9DUkVBVEVEIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICBjYXNlIDY6Ci0gICAgICBtc2cgPSAiTVNHX0VBUl9XSUxMX0JFX0NSRUFURUQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgIGNhc2UgNzoKLSAgICAgIG1zZyA9ICJNU0dfUFJPSkVDVF9BTkRfRUFSX0NSRUFURUQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgbXNnID0gIk1TR19FQVJfV0lMTF9CRV9BU1NPQ0lBVEVEIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gbXNnICE9IG51bGwgPyBtc2dVdGlscy5nZXRNZXNzYWdlKG1zZywgbmV3IE9iamVjdFtdIHsgc2VydmljZU9yQ2xpZW50fSkgOiAiIjsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgIFN0YXR1cyBmaW5hbFN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIGhhbmRsZVNldE1lc3NhZ2VUZXh0KCk7Ci0gICAgU3RyaW5nIHByb2plY3RUZXh0ID0gcHJvamVjdF8uZ2V0VGV4dCgpOwotICAgIFN0cmluZyBlYXJUZXh0ID0gZWFyXy5nZXRUZXh0KCk7Ci0gICAgaWYgKHByb2plY3RUZXh0PT1udWxsIHx8IHByb2plY3RUZXh0Lmxlbmd0aCgpPT0wKQotICAgIHsKLSAgICAgIGlmIChpc0NsaWVudF8pCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19DTElFTlRfUFJPSkVDVF9FTVBUWSIpLFN0YXR1cy5FUlJPUik7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19TRVJWSUNFX1BST0pFQ1RfRU1QVFkiKSxTdGF0dXMuRVJST1IpOwotICAgIH0KLSAgICAKLSAgICBpZiAobmVlZEVBUl8gJiYgKGVhclRleHQ9PW51bGwgfHwgZWFyVGV4dC5sZW5ndGgoKT09MCkpCi0gICAgewotICAgICAgaWYgKGlzQ2xpZW50XykKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0NMSUVOVF9FQVJfRU1QVFkiKSxTdGF0dXMuRVJST1IpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfU0VSVklDRV9FQVJfRU1QVFkiKSxTdGF0dXMuRVJST1IpOyAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmluYWxTdGF0dXM7Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1J1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1J1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0OWEwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvcnVudGltZS9SdW50aW1lU2VydmVyU2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLlJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotCi0KLXB1YmxpYyBjbGFzcyBSdW50aW1lU2VydmVyU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgVGV4dCAgICAgICAgICAgICAgcnVudGltZV87Ci0gIHByaXZhdGUgVGV4dCAgICAgICAgICAgICAgc2VydmVyXzsKLSAgcHJpdmF0ZSBUZXh0ICAgICAgICAgICAgICBqMmVlVmVyc2lvblRleHQ7Ci0gIHByaXZhdGUgQ29tcG9zaXRlICAgICAgICAgcGFyZW50XzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBpc0NsaWVudENvbnRleHRfOwotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIGlkc187Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIGoyZWVWZXJzaW9uXzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgICAgICAgbXNnVXRpbHNfOwotICBwcml2YXRlIExpc3RlbmVyICAgICAgICAgICBzdGF0dXNMaXN0ZW5lcl87Ci0gIAotICAvKiBDT05URVhUX0lEIFBXUlMwMDA0IGZvciB0aGUgc2VydmljZS1zaWRlIHJ1bnRpbWUgc2VsZWN0aW9uIG9mIHRoZSBydW50aW1lIHNlbGVjdGlvbiBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19HUk9VUF9TRVJWSUNFX1JVTlRJTUUgPSBwbHVnaW5JZF8gKyAiLlBXUlMwMDA0IjsKLQotICAvKiBDT05URVhUX0lEIFBXUlMwMDA1IGZvciB0aGUgc2VydmljZS1zZGllIHNlcnZlciBzZWxlY3Rpb24gb2YgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIFBhZ2UgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0dST1VQX1NFUlZJQ0VfU0VSVkVSID0gcGx1Z2luSWRfICsgIi5QV1JTMDAwNSI7Ci0KLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAwOSBmb3IgdGhlIEoyRUUgdmVyc2lvbiBzZWxlY3Rpb24gb2YgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIFBhZ2UgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0oyRUVfVkVSU0lPTiA9IHBsdWdpbklkXyArICIuUFdSUzAwMDkiOwotCi0gIHB1YmxpYyBSdW50aW1lU2VydmVyU2VsZWN0aW9uV2lkZ2V0KCBib29sZWFuIGlzQ2xpZW50U2NlbmFyaW8gKQotICB7Ci0gICAgaXNDbGllbnRDb250ZXh0XyA9IGlzQ2xpZW50U2NlbmFyaW87IAotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3IjYWRkQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBVSVV0aWxzICAgICAgdWlVdGlscyAgPSBuZXcgVUlVdGlscyhtc2dVdGlsc18sIHBsdWdpbklkXyApOyAKLSAgICAKLSAgICBwYXJlbnRfICAgICAgICAgPSBwYXJlbnQ7Ci0gICAgc3RhdHVzTGlzdGVuZXJfID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgICAgIAotICAgIC8vIFJ1bnRpbWUgbGFiZWwgYW5kIHRleHQKLSAgICBydW50aW1lXyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggcGFyZW50LCAiTEFCRUxfUlVOVElNRVNfTElTVCIsICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdSU19URVhUX1JVTlRJTUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUlNfR1JPVVBfU0VSVklDRV9SVU5USU1FLCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgCi0gICAgLy8gU2VydmVyIGxhYmVsIGFuZCB0ZXh0Ci0gICAgc2VydmVyXyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggcGFyZW50LCAiTEFCRUxfU0VSVkVSU19MSVNUIiwgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUlNfVEVYVF9TRVJWRVIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdSU19HUk9VUF9TRVJWSUNFX1NFUlZFUiwgU1dULlJFQURfT05MWSApOwotICAgIAotICAgIGoyZWVWZXJzaW9uVGV4dCA9IHVpVXRpbHMuY3JlYXRlVGV4dChwYXJlbnQsICJMQUJFTF9KMkVFX1ZFUlNJT04iLCAiVE9PTFRJUF9QV1JTX0oyRUVfVkVSU0lPTiIsIElORk9QT1BfUFdSU19KMkVFX1ZFUlNJT04sIFNXVC5SRUFEX09OTFkpOwotICAgIAotICAgIEJ1dHRvbiBlZGl0QnV0dG9uID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuTk9ORSApOwotICAgIGVkaXRCdXR0b24uc2V0VGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX0VESVRfQlVUVE9OIikpOyAKLSAgICBlZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50ICBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFZGl0QnV0dG9uKCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICAKLSAgICAvLyBEdW1teSBsYWJlbCB0aGF0IGdvZXMgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGVkaXQgYnV0dG9uLgotICAgIG5ldyBMYWJlbCggcGFyZW50LCBTV1QuTk9ORSApOwotICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBpZHNfOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgaWRzXyA9IGlkczsKLSAgICBzZXRMYWJlbHMoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRKMkVFVmVyc2lvbigpCi0gIHsKLSAgICByZXR1cm4gajJlZVZlcnNpb25fOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgICB0aGlzLmoyZWVWZXJzaW9uXyA9IGoyZWVWZXJzaW9uOwotICAgIGoyZWVWZXJzaW9uVGV4dC5zZXRUZXh0KChqMmVlVmVyc2lvbl8gIT0gbnVsbCkgPyBKMkVFVXRpbHMuZ2V0TGFiZWxGcm9tSjJFRVZlcnNpb24oajJlZVZlcnNpb25fKSA6IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9OQSIpKTsKLSAgICAvL3NldExhYmVscygpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0TGFiZWxzKCkKLSAgewotCSAgLy8gcnNrcmVnCi0gICAgLy9XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ICAgICA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAvL1N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxhYmVsID0gcmVnaXN0cnkuZ2V0UnVudGltZUxhYmVsQnlJZCggaWRzXy5nZXRSdW50aW1lSWQoKSApOwotCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxhYmVsID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRSdW50aW1lTGFiZWxCeUlkKCBpZHNfLmdldFJ1bnRpbWVJZCgpICk7Ci0gICAgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJMYWJlbCAgPSBudWxsOwotICAgIAotICAgIGlmKCBpZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIGxhYmVsIGZvciB0aGUgZ2VuZXJhbCBzZXJ2ZXIgdHlwZS4KLSAgICAgIC8vV2ViU2VydmljZVNlcnZlciBzZXJ2ZXIgPSByZWdpc3RyeS5nZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoIGlkc18uZ2V0U2VydmVySWQoKSApOwotICAgICAgLy9zZXJ2ZXJMYWJlbCA9IHNlcnZlciA9PSBudWxsID8gIiIgOiBzZXJ2ZXIuZ2V0TGFiZWwoKTsKLQkJc2VydmVyTGFiZWwgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFNlcnZlckxhYmVsQnlJZChpZHNfLmdldFNlcnZlcklkKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBsYWJlbCBmb3IgdGhlIHNlcnZlciBpbnN0YW5jZS4KLSAgICAgIC8vc2VydmVyTGFiZWwgPSByZWdpc3RyeS5nZXRTZXJ2ZXJJbnN0YW5jZUxhYmVsRnJvbUluc3RhbmNlSWQoIGlkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpICk7Ci0JCXNlcnZlckxhYmVsID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRTZXJ2ZXJJbnN0YW5jZUxhYmVsRnJvbUluc3RhbmNlSWQoaWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotICAgIH0KLSAgICAvLyByc2tyZWcKLSAgICBydW50aW1lTGFiZWwgPSBydW50aW1lTGFiZWwgPT0gbnVsbCA/ICIiIDogcnVudGltZUxhYmVsOwotICAgIAotICAgIHJ1bnRpbWVfLnNldFRleHQoIHJ1bnRpbWVMYWJlbCApOwotICAgIHNlcnZlcl8uc2V0VGV4dCggc2VydmVyTGFiZWwgKTsKLSAgICBqMmVlVmVyc2lvblRleHQuc2V0VGV4dCgoajJlZVZlcnNpb25fICE9IG51bGwpID8gSjJFRVV0aWxzLmdldExhYmVsRnJvbUoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXykgOiBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfTkEiKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUVkaXRCdXR0b24oKQotICB7Ci0gICAgYnl0ZSBtb2RlID0gaXNDbGllbnRDb250ZXh0XyA/IChieXRlKTEgOiAoYnl0ZSkwOwotICAgIAotICAgIFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2cgZGlhbG9nICAgICAKLSAgICAgID0gZGlhbG9nID0gbmV3IFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2coIHBhcmVudF8uZ2V0U2hlbGwoKSwgbW9kZSwgaWRzXywgajJlZVZlcnNpb25fICk7Ci0gICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgIGRpYWxvZy5oYW5kbGVTZXJ2ZXJWaWV3U2VsZWN0aW9uRXZlbnQoKTsKLSAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQotICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgIHsKLSAgICAgIGlkc18gPSBkaWFsb2cuZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLSAgICAgIGoyZWVWZXJzaW9uXyA9IGRpYWxvZy5nZXRKMkVFVmVyc2lvbigpOwotICAgICAgc2V0TGFiZWxzKCk7Ci0gICAgICBzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgfSAgCi0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBpZiAocnVudGltZV8gIT0gbnVsbCkKLSAgICAgIHJ1bnRpbWVfLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBpZiAocnVudGltZV8gIT0gbnVsbCkKLSAgICAgIHJ1bnRpbWVfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2dldFN0YXR1cygpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpIAotICB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gICAgU3RyaW5nIHNjZW5hcmlvID0gaXNDbGllbnRDb250ZXh0XyA/IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiTVNHX0NMSUVOVF9TVUIiICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiTVNHX1NFUlZJQ0VfU1VCIiApOwotICAgIAotICAgIC8vIEtsdWRnZSEhISAgV2Ugc2hvdWxkbid0IGhhdmUgdG8gY2hlY2sgZm9yIGJsYW5rIGxhYmVscy4gIFRoZSBkZWZhdWx0aW5nIGNvbW1hbmRzIHNob3VsZCBiZSBzZXR0aW5nIHRoZQotICAgIC8vICAgICAgICAgICAgaWRzIHRvIG51bGwgaWYgdGhlcmUgaXNuJ3QgYSB2YWxpZCBvbmUuICBUaGlzIGNvZGUgc2hvdWxkIGJlIHJlbW92ZWQgaW4gQzQuCi0JCi0JLy8gcnNrcmVnCi0gICAgLy9XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHdzY3RSZWdpc3RyeSA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAvL1N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxhYmVsID0gd3NjdFJlZ2lzdHJ5LmdldFJ1bnRpbWVMYWJlbEJ5SWQoIGlkc18uZ2V0UnVudGltZUlkKCkgKTsKLQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMYWJlbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0UnVudGltZUxhYmVsQnlJZCggaWRzXy5nZXRSdW50aW1lSWQoKSApOwotICAgIC8vV2ViU2VydmljZVNlcnZlciAgICAgICAgICAgICBzZXJ2ZXIgICAgICAgPSB3c2N0UmVnaXN0cnkuZ2V0V2ViU2VydmljZVNlcnZlckJ5RmFjdG9yeUlkKCBpZHNfLmdldFNlcnZlcklkKCkgKTsKLSAgICAvL1N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTGFiZWwgID0gc2VydmVyID09IG51bGwgPyAiIiA6IHNlcnZlci5nZXRMYWJlbCgpOwotCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTGFiZWwgID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRTZXJ2ZXJMYWJlbEJ5SWQoaWRzXy5nZXRTZXJ2ZXJJZCgpKTsKLSAgICAvLyByc2tyZWcKLQkKLSAgICBpZiggaWRzXy5nZXRSdW50aW1lSWQoKSA9PSBudWxsIHx8IHJ1bnRpbWVMYWJlbCA9PSBudWxsIHx8IHJ1bnRpbWVMYWJlbC5lcXVhbHMoIiIgKSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJNU0dfTk9fUlVOVElNRSIsIG5ldyBTdHJpbmdbXXsgc2NlbmFyaW8gfSApLCBTdGF0dXMuRVJST1IgKTsKLSAgICB9Ci0gICAgZWxzZSBpZiggaWRzXy5nZXRTZXJ2ZXJJZCgpID09IG51bGwgfHwgc2VydmVyTGFiZWwuZXF1YWxzKCAiIiApKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggIk1TR19OT19TRVJWRVIiLCBuZXcgU3RyaW5nW117IHNjZW5hcmlvIH0gKSwgU3RhdHVzLkVSUk9SICk7ICAgICAgCi0gICAgfQotCi0JLy8tLS0tLS0tLS0gY2hlY2sgaWYgV1NDVCBleGlzdHMgZm9yIHRoZXNlIHNlbGVjdGlvbnMKLQlpZiAoIShpZHNfLmdldFNlcnZlcklkKCkgPT0gbnVsbCkgJiYgIShpZHNfLmdldFJ1bnRpbWVJZCgpID09IG51bGwpICYmIGlzQ2xpZW50Q29udGV4dF8pCi0JewotCQkvLyByc2tyZWcKLQkJaWYgKCFXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLndlYlNlcnZpY2VDbGllbnRSdW50aW1lVHlwZUV4aXN0cyggaWRzXy5nZXRTZXJ2ZXJJZCgpLCBpZHNfLmdldFJ1bnRpbWVJZCgpLCBpZHNfLmdldFR5cGVJZCgpKSkgCi0JCXsKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggIk1TR19JTlZBTElEX1NSVF9TRUxFQ1RJT05TIiwgbmV3IFN0cmluZ1tdeyBzY2VuYXJpbyB9ICksIFN0YXR1cy5FUlJPUiApOwkJICAKLQkJfQotCQkvKgotCQlXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IHdzY3RSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoaWRzXy5nZXRTZXJ2ZXJJZCgpKTsKLQkJaWYgKHdzcyAhPSBudWxsKQotCQl7Ci0JCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gd3NzLmdldElkKCk7Ci0JCQlTdHJpbmcgcnVudGltZUlkID0gaWRzXy5nZXRUeXBlSWQoKTsKLQkJCWlmICghd3NjdFJlZ2lzdHJ5LndlYlNlcnZpY2VDbGllbnRSdW50aW1lVHlwZUV4aXN0cyggc2VydmVyVHlwZUlkLCBpZHNfLmdldFJ1bnRpbWVJZCgpLCBydW50aW1lSWQpKSB7Ci0JCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiTVNHX0lOVkFMSURfU1JUX1NFTEVDVElPTlMiLCBuZXcgU3RyaW5nW117IHNjZW5hcmlvIH0gKSwgU3RhdHVzLkVSUk9SICk7CQkgIAotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggIk1TR19JTlZBTElEX1NSVF9TRUxFQ1RJT05TIiwgbmV3IFN0cmluZ1tdeyBzY2VuYXJpbyB9ICksIFN0YXR1cy5FUlJPUiApOwotCQkqLwotCQkvLyByc2tyZWcKLQl9ICAgIAotICAgIAotICAgIC8vLS0tLS0tLS0tIGNoZWNrIGlmIFdTU1JUIGV4aXN0cyBmb3IgdGhlc2Ugc2VsZWN0aW9ucwotICAgIGlmICghKGlkc18uZ2V0U2VydmVySWQoKSA9PSBudWxsKSAmJiAhKGlkc18uZ2V0UnVudGltZUlkKCkgPT0gbnVsbCkgJiYgIWlzQ2xpZW50Q29udGV4dF8pCi0gICAgewotCQkvLyByc2tyZWcKLSAgICAgIC8vV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgd3NzcnRSZWdpc3RyeSA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgICAvL1N0cmluZyBzZXJ2ZXJUeXBlSWQgPSB3c2N0UmVnaXN0cnkuZ2V0V2ViU2VydmljZVNlcnZlckJ5RmFjdG9yeUlkKGlkc18uZ2V0U2VydmVySWQoKSkuZ2V0SWQoKTsKLSAgICAgIC8vaWYgKCF3c3NydFJlZ2lzdHJ5LmlzU2VydmVyUnVudGltZVR5cGVTdXBwb3J0ZWQoc2VydmVyVHlwZUlkLCBpZHNfLmdldFJ1bnRpbWVJZCgpLCBpZHNfLmdldFR5cGVJZCgpKSkgewotCSAgaWYgKCFXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmlzU2VydmVyUnVudGltZVR5cGVTdXBwb3J0ZWQoaWRzXy5nZXRTZXJ2ZXJJZCgpLCBpZHNfLmdldFJ1bnRpbWVJZCgpLCBpZHNfLmdldFR5cGVJZCgpKSkgewkgIAotICAgICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJNU0dfSU5WQUxJRF9TUlRfU0VMRUNUSU9OUyIsIG5ldyBTdHJpbmdbXXsgc2NlbmFyaW8gfSApLCBTdGF0dXMuRVJST1IgKTsgICAgICAKLSAgICAgIH0KLQkgIC8vIHJza3JlZwotICAgIH0KLQkKLSAgICAKLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9BZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9BZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDQ0OTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uSUFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkFkZFV0aWxpdHlKQVJNYXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5JRUpCTmF0dXJlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSVdlYk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotCi1wdWJsaWMgY2xhc3MgQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlRUFSOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRQcm9qZWN0OwotICBwcml2YXRlIFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSUQ7Ci0gIHByaXZhdGUgSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50SjJFRVZlcnNpb247Ci0KLSAgcHVibGljIEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5BZGRNb2R1bGVEZXBlbmRlbmNpZXNUYXNrIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5BZGRNb2R1bGVEZXBlbmRlbmNpZXNUYXNrIik7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSBXZWJTZXJ2ZXJEZWZhdWx0aW5nVGFzayBTZXQgdGhlIGRlZmF1bHQgc2VydmVyIG5hbWUgYW5kIGlkIGdpdmVuIGEKLSAgICogZGVwbG95YWJsZS4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzID0gKElQcm9qZWN0KVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHNhbXBsZVByb2plY3QpOwotICAgICAgSVByb2plY3Qgc2FtcGxlSVByb2plY3QgPSBudWxsOwotICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIElQcm9qZWN0KQotICAgICAgICBzYW1wbGVJUHJvamVjdCA9IChJUHJvamVjdClyZXM7Ci0gICAgICBpZiAoc2FtcGxlSVByb2plY3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQgY3JlYXRlU2FtcGxlID0gbmV3IENyZWF0ZVNhbXBsZVByb2plY3RDb21tYW5kKCk7Ci0gICAgICAgIGNyZWF0ZVNhbXBsZS5zZXRTYW1wbGVQcm9qZWN0KHNhbXBsZVByb2plY3QpOwotICAgICAgICBjcmVhdGVTYW1wbGUuc2V0U2FtcGxlUHJvamVjdEVBUihzYW1wbGVFQVIpOwotICAgICAgICBpZiAoc2FtcGxlRUFSIT1udWxsICYmIHNhbXBsZUVBUi5sZW5ndGgoKT4wKQotICAgICAgICAgIGNyZWF0ZVNhbXBsZS5zZXROZWVkRUFSKHRydWUpOyAgICAKLSAgICAgICAgY3JlYXRlU2FtcGxlLnNldEV4aXN0aW5nU2VydmVyKHNhbXBsZUV4aXN0aW5nU2VydmVyKTsKLSAgICAgICAgY3JlYXRlU2FtcGxlLnNldFNlcnZlckZhY3RvcnlJZChzYW1wbGVTZXJ2ZXJUeXBlSUQpOwotICAgICAgICBjcmVhdGVTYW1wbGUuc2V0SjJlZVZlcnNpb24oY2xpZW50SjJFRVZlcnNpb24pOwotICAgICAgICBTdGF0dXMgc3RhdHVzID0gY3JlYXRlU2FtcGxlLmV4ZWN1dGUoZW52KTsKLSAgICAgIH0KLSAgICAgIHJlcyA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHNhbXBsZVByb2plY3QpOwotICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIElQcm9qZWN0KQotICAgICAgICBzYW1wbGVJUHJvamVjdCA9IChJUHJvamVjdClyZXM7Ci0gICAgICByZXMgPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShzYW1wbGVFQVIpOwotICAgICAgSVByb2plY3Qgc2FtcGxlSUVBUiA9IG51bGw7Ci0gICAgICBpZiAocmVzIGluc3RhbmNlb2YgSVByb2plY3QpCi0gICAgICAgIHNhbXBsZUlFQVIgPSAoSVByb2plY3QpcmVzOwotICAgICAgaWYgKHNhbXBsZUlQcm9qZWN0ID09IG51bGwpCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCAiIiwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIHJlcyA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKGNsaWVudFByb2plY3QpOwotICAgICAgSVByb2plY3QgY2xpZW50SVByb2plY3QgPSBudWxsOwotICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIElQcm9qZWN0KQotICAgICAgICBjbGllbnRJUHJvamVjdCA9IChJUHJvamVjdClyZXM7Ci0gICAgICBpZiAoY2xpZW50SVByb2plY3QgIT0gbnVsbCAmJiAhUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QoY2xpZW50SVByb2plY3QpKQotICAgICAgewotICAgICAgICBTdHJpbmcgdXJpID0gY2xpZW50SVByb2plY3QuZ2V0TmFtZSgpICsgIi5qYXIiOwotICAgICAgICBpZiAoUmVzb3VyY2VVdGlscy5pc1RydWVKYXZhUHJvamVjdChjbGllbnRJUHJvamVjdCkpCi0gICAgICAgICAgYWRkSmF2YVByb2plY3RBc1V0aWxpdHlKYXIoY2xpZW50SVByb2plY3QsIHNhbXBsZUlFQVIsIHVyaSk7Ci0gICAgICAgIGFkZEpBUk9yTW9kdWxlRGVwZW5kZW5jeShzYW1wbGVJUHJvamVjdCwgdXJpKTsKLSAgICAgICAgYWRkQnVpbGRQYXRoKHNhbXBsZUlQcm9qZWN0LCBjbGllbnRJUHJvamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRKYXZhUHJvamVjdEFzVXRpbGl0eUphcihJUHJvamVjdCBqYXZhUHJvamVjdCwgSVByb2plY3QgZWFyUHJvamVjdCwgU3RyaW5nIHVyaSkKLSAgewotICAgIEFkZFV0aWxpdHlKQVJNYXBDb21tYW5kIGNtZCA9IG5ldyBBZGRVdGlsaXR5SkFSTWFwQ29tbWFuZChlYXJQcm9qZWN0LCB1cmksIGphdmFQcm9qZWN0KTsKLSAgICBjbWQuZXhlY3V0ZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFkZEpBUk9yTW9kdWxlRGVwZW5kZW5jeShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24KLSAgewotICAgIEoyRUVOYXR1cmUgbmF0dXJlID0gbnVsbDsKLSAgICBpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdCkpCi0gICAgICBuYXR1cmUgPSBnZXRXZWJOYXR1cmUocHJvamVjdCk7Ci0gICAgZWxzZSBpZiAoUmVzb3VyY2VVdGlscy5pc0FwcENsaWVudFByb2plY3QocHJvamVjdCkpCi0gICAgICBuYXR1cmUgPSBnZXRBcHBDbGllbnROYXR1cmUocHJvamVjdCk7Ci0gICAgZWxzZSBpZiAoUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3QocHJvamVjdCkpCi0gICAgICBuYXR1cmUgPSBnZXRFSkJOYXR1cmUocHJvamVjdCk7Ci0gICAgaWYgKG5hdHVyZSAhPSBudWxsKQotICAgIHsKLSAgICAgIEFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLnJlYWRNYW5pZmVzdChwcm9qZWN0KTsKLSAgICAgIG1hbmlmZXN0Lm1lcmdlQ2xhc3NQYXRoKG5ldyBTdHJpbmdbXXt1cml9KTsKLSAgICAgIEoyRUVQcm9qZWN0VXRpbGl0aWVzLndyaXRlTWFuaWZlc3QocHJvamVjdCwgbWFuaWZlc3QpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRCdWlsZFBhdGgoSVByb2plY3QgcmVmZXJlbmNpbmdQcm9qZWN0LCBJUHJvamVjdCByZWZlcmVuY2VkUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotICB7Ci0gICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHJlZmVyZW5jaW5nUHJvamVjdCk7Ci0gICAgaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgSUNsYXNzcGF0aEVudHJ5W10gb2xkQ3AgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICAgIElDbGFzc3BhdGhFbnRyeVtdIG5ld0NwID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRDcC5sZW5ndGhdOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRDcC5sZW5ndGg7IGkrKykKLSAgICAgICAgbmV3Q3BbaV0gPSBvbGRDcFtpXTsKLSAgICAgIG5ld0NwW25ld0NwLmxlbmd0aCAtIDFdID0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHJlZmVyZW5jZWRQcm9qZWN0LmdldEZ1bGxQYXRoKCkpOwotICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NwLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIEoyRUVOYXR1cmUgZ2V0V2ViTmF0dXJlKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gKEoyRUVOYXR1cmUpcHJvamVjdC5nZXROYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCk7Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIEoyRUVOYXR1cmUgZ2V0QXBwQ2xpZW50TmF0dXJlKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IElBcHBsaWNhdGlvbkNsaWVudE5hdHVyZUNvbnN0YW50cy5BUFBDTElFTlRfTkFUVVJFX0lEUy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChKMkVFTmF0dXJlKXByb2plY3QuZ2V0TmF0dXJlKElBcHBsaWNhdGlvbkNsaWVudE5hdHVyZUNvbnN0YW50cy5BUFBDTElFTlRfTkFUVVJFX0lEU1tpXSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIEoyRUVOYXR1cmUgZ2V0RUpCTmF0dXJlKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBrc2MgcmV0dXJuCi0gICAgICAvLyAoSjJFRU5hdHVyZSlwcm9qZWN0LmdldE5hdHVyZShJRUpCTmF0dXJlQ29uc3RhbnRzLkVKQl8yMF9OQVRVUkVfSUQpOwotICAgICAgcmV0dXJuIChKMkVFTmF0dXJlKXByb2plY3QuZ2V0TmF0dXJlKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgIH0KLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gKEoyRUVOYXR1cmUpcHJvamVjdC5nZXROYXR1cmUoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXRFQVJQcm9qZWN0KElQcm9qZWN0IHNhbXBsZVByb2plY3QpCi0gIHsKLSAgICBFQVJOYXR1cmVSdW50aW1lW10gbmF0dXJlcyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cyhzYW1wbGVQcm9qZWN0KTsKLSAgICBpZiAobmF0dXJlcyAhPSBudWxsICYmIG5hdHVyZXMubGVuZ3RoID4gMCkKLSAgICAgIHJldHVybiBuYXR1cmVzWzBdLmdldFByb2plY3QoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcHJveHlQcm9qZWN0Ci0gICAqICAgICAgICAgIFRoZSBwcm94eVByb2plY3QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdChTdHJpbmcgc2FtcGxlUHJvamVjdCkKLSAgewotICAgIHRoaXMuc2FtcGxlUHJvamVjdCA9IHNhbXBsZVByb2plY3Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHNhbXBsZVByb2plY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0RUFSKFN0cmluZyBzYW1wbGVFQVIpCi0gIHsKLSAgICB0aGlzLnNhbXBsZUVBUiA9IHNhbXBsZUVBUjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlU2VydmVyVHlwZUlEKFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSUQpCi0gIHsKLSAgICB0aGlzLnNhbXBsZVNlcnZlclR5cGVJRCA9IHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIpCi0gIHsKLSAgICB0aGlzLnNhbXBsZUV4aXN0aW5nU2VydmVyID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEoyRUVWZXJzaW9uKFN0cmluZyBjbGllbnRKMkVFVmVyc2lvbikKLSAgewotICAgIHRoaXMuY2xpZW50SjJFRVZlcnNpb24gPSBjbGllbnRKMkVFVmVyc2lvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjhiYzU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXhlY3V0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuSmF2YVByb3h5VGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldTRExUZXN0RmluaXNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0RmluaXNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi0KLS8qCi0qIFRoZSBKU1BHZW5lcmF0aW9uIHRhc2sgcnVucyB0aGUganNwIGdlbmVyYXRpb24gZW5naW5lIGZvdW5kIGluIHRoZSAKLSogSkJXaXphcmQgUGx1Z2luCi0qCi0qCi0qLwotcHVibGljIGNsYXNzIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIkpTUEdlbmVyYXRpb25UYXNrIjsKLSAgcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiUnVuIHRoZSBKU1AgR2VuZXJhdGlvbiI7Ci0gIAotICBwcml2YXRlIFNjZW5hcmlvQ29udGV4dCBzY2VuYXJpb0NvbnRleHQ7Ci0gIHByaXZhdGUgV2ViU2VydmljZVRlc3RSZWdpc3RyeSB0ZXN0UmVnaXN0cnk7Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdCB0ZXN0RmFjaWxpdGllczsKLSAgcHJpdmF0ZSBTdHJpbmcgZm9sZGVyOwotICBwcml2YXRlIFN0cmluZyBqc3BGb2xkZXI7Ci0gIHByaXZhdGUgQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHM7Ci0gIHByaXZhdGUgYm9vbGVhbiBydW5DbGllbnRUZXN0PXRydWU7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgcHJpdmF0ZSBJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFN0cmluZyBwcm94eUJlYW47Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFNlcnZlcjsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHM7Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmVySWRzOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFNlcnZpY2VVUkw7Ci0gIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVByb3h5OwotICBwcml2YXRlIGJvb2xlYW4gaXNUZXN0V2lkZ2V0ID0gZmFsc2U7Ci0gIHByaXZhdGUgU3RyaW5nIHNldEVuZHBvaW50TWV0aG9kOwotICBwcml2YXRlIExpc3QgZW5kcG9pbnRzOwotCi0gIHB1YmxpYyBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kICgpCi0gIHsKLSAgICBzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gICAgc2V0TmFtZShMQUJFTCk7ICAKLSAgICBzY2VuYXJpb0NvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCkuY29weSgpOwotICAgIHRlc3RSZWdpc3RyeSA9IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAJU3RyaW5nIGNsaWVudFRlc3RJRCA9IHRlc3RGYWNpbGl0aWVzLmdldFNlbGVjdGlvbigpOwotICAJV2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kRmFjdG9yeSB3dGZjZiA9IG5ldyBXZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmRGYWN0b3J5KCk7Ci0gIAlXZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQgY29tbWFuZCA9IHd0ZmNmLmdldFdlYlNlcnZpY2VUZXN0RmluaXNoQ29tbWFuZChjbGllbnRUZXN0SUQsZW52KTsKLSAgICAgCi0gICAgY29tbWFuZC5zZXRFeGlzdGluZ1NlcnZlcihzYW1wbGVFeGlzdGluZ1NlcnZlcik7Ci0gICAgY29tbWFuZC5zZXRTZXJ2ZXJUeXBlSUQoc2FtcGxlU2VydmVyVHlwZUlEKTsKLSAgICBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoZW52KTsKLSAgICBpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpewotICAgICAgU3RhdHVzSGFuZGxlciBzSGFuZGxlciA9IGVudi5nZXRTdGF0dXNIYW5kbGVyKCk7Ci0gICAgICBzSGFuZGxlci5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBXZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmRGYWN0b3J5Ci0gIHsKLSAgCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQgZ2V0V2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kKFN0cmluZyBjbGllbnRUZXN0SUQsRW52aXJvbm1lbnQgZW52KQotICAgIHsKLSAgCSAgV2ViU2VydmljZVRlc3RFeHRlbnNpb24gd3NjdGUgPSAoV2ViU2VydmljZVRlc3RFeHRlbnNpb24pdGVzdFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKGNsaWVudFRlc3RJRCk7Ci0gIAkgIGJvb2xlYW4gaXNKYXZhID0gdHJ1ZTsKLSAgCSAgaWYod3NjdGUuaXNKYXZhKCkgJiYgIWdlbmVyYXRlUHJveHkpewotICAJICAJaXNKYXZhID0gZmFsc2U7Ci0gICAgICAgIHdzY3RlID0gKFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uKXRlc3RSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uc0J5TmFtZShzY2VuYXJpb0NvbnRleHQuZ2V0Tm9uSmF2YVRlc3RTZXJ2aWNlKCkpOyAgIAkgIAotICAJICB9Ci0gIAkgIGlmKCF3c2N0ZS5pc0phdmEoKSkKLSAgCSAgICBpc0phdmEgPSBmYWxzZTsJCi0gIAkgIFdlYlNlcnZpY2VFeGVjdXRhYmxlIHdzZSA9IHdzY3RlLmdldFdlYlNlcnZpY2VFeGVjdXRhYmxlRXh0ZW5zaW9uKCk7Ci0gICAgICAKLSAgICAgIGlmKGlzSmF2YSl7Ci0gICAgICAgIEphdmFQcm94eVRlc3RDb21tYW5kIGNvbW1hbmQgPSAoSmF2YVByb3h5VGVzdENvbW1hbmQpd3NlLmdldEZpbmlzaENvbW1hbmQoKTsKLSAgICAgICAgY29tbWFuZC5zZXRQcm94eUJlYW4ocHJveHlCZWFuKTsKLSAgICAgICAgY29tbWFuZC5zZXRTYW1wbGVQcm9qZWN0KHNhbXBsZVByb2plY3QpOwotICAgICAgICBjb21tYW5kLnNldENsaWVudFByb2plY3QoY2xpZW50UHJvamVjdCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0UnVuQ2xpZW50VGVzdChydW5DbGllbnRUZXN0KTsKLSAgICAgICAgY29tbWFuZC5zZXRKc3BGb2xkZXIoanNwRm9sZGVyKTsgCi0gICAgICAgIGNvbW1hbmQuc2V0U2V0RW5kcG9pbnRNZXRob2Qoc2V0RW5kcG9pbnRNZXRob2QpOwotICAgICAgICBjb21tYW5kLnNldE1ldGhvZHMobWV0aG9kcyk7Ci0gICAgICAgIGNvbW1hbmQuc2V0RW5kcG9pbnQoZW5kcG9pbnRzKTsKLSAgICAgICAgaWYgKGNsaWVudElkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkgIT0gbnVsbCkgCi0gICAgICAJICBzYW1wbGVFeGlzdGluZ1NlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihjbGllbnRJZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLSAgICAgIAlpZiAoc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgIAkgIHNhbXBsZVNlcnZlclR5cGVJRCA9IHNhbXBsZUV4aXN0aW5nU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgCWVsc2UKLSAgICAgIAkgIHNhbXBsZVNlcnZlclR5cGVJRCA9IGNsaWVudElkcy5nZXRTZXJ2ZXJJZCgpOwotICAgICAgCS8vIHNlcnZlciB3aWxsIGJlIGNyZWF0ZWQgaW4gU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kCi0gICAgICAJCi0gICAgICAgIHJldHVybiBjb21tYW5kOwotICAgICAgfQotICAgICAgZWxzZXsKLSAgICAgIAlXU0RMVGVzdEZpbmlzaENvbW1hbmQgd3RmYyA9IChXU0RMVGVzdEZpbmlzaENvbW1hbmQpd3NlLmdldEZpbmlzaENvbW1hbmQoKTsKLSAgICAgIAl3dGZjLnNldFNlcnZpY2VQcm9qZWN0KGdldFdTRExQcm9qZWN0KCkpOwotICAgIAl3dGZjLnNldFdzZGxTZXJ2aWNlVVJMKHdzZGxTZXJ2aWNlVVJMKTsKLSAgICAJd3RmYy5zZXRFeHRlcm5hbEJyb3dzZXIoZmFsc2UpOwotICAgIAl3dGZjLnNldEVuZHBvaW50KGVuZHBvaW50cyk7Ci0gICAgCWlmKHNlcnZlcklkcyAhPSBudWxsKXsKLSAgICAJICBpZiAoc2VydmVySWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSAhPSBudWxsKSAKLSAgICAJICAgIHNhbXBsZUV4aXN0aW5nU2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotICAgIAkgIGlmIChzYW1wbGVFeGlzdGluZ1NlcnZlciAhPSBudWxsKQotICAgIAkgICAgc2FtcGxlU2VydmVyVHlwZUlEID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgCSAgZWxzZQotICAgIAkgICAgc2FtcGxlU2VydmVyVHlwZUlEID0gc2VydmVySWRzLmdldFNlcnZlcklkKCk7Ci0gICAgCSAgLy8gc2VydmVyIHdpbGwgYmUgY3JlYXRlZCBpbiBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQKLSAgICAJfQotICAgIAllbHNlIGlmKGNsaWVudElkcyAhPSBudWxsKQotICAgIAl7Ci0gICAgICAgICAgaWYgKGNsaWVudElkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkgIT0gbnVsbCkgCi0gICAgICAgICAgICBzYW1wbGVFeGlzdGluZ1NlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihjbGllbnRJZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLSAgICAgICAgICBpZiAoc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHNhbXBsZVNlcnZlclR5cGVJRCA9IHNhbXBsZUV4aXN0aW5nU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNhbXBsZVNlcnZlclR5cGVJRCA9IGNsaWVudElkcy5nZXRTZXJ2ZXJJZCgpOwotICAgICAgICAgIC8vIHNlcnZlciB3aWxsIGJlIGNyZWF0ZWQgaW4gU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kCi0gICAgICAgICAgICAJCQotICAgIAl9Ci0gICAgCXJldHVybiB3dGZjOyAKLSAgICAgIH0gCQotICAgIH0KLSAgCi0gICAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsJCi0gICAgfQotICAKLSAgfQotCi0gIC8vVGhlIHRlc3QgZmFjaWxpdGllcyByZXRyaWV2ZWQgZnJvbSB0aGUgZXh0ZW5zaW9uCi0gIC8vcGx1cyB0aGUgZGVmYXVsdAotICBwdWJsaWMgdm9pZCBzZXRUZXN0RmFjaWxpdHkoU2VsZWN0aW9uTGlzdCBzZWxlY3Rpb24pCi0gIHsKLSAgICB0ZXN0RmFjaWxpdGllcyA9IHNlbGVjdGlvbjsKLSAgfSAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEZvbGRlcihTdHJpbmcgZm9sZGVyKQotICB7Ci0gIAl0aGlzLmZvbGRlciA9IGZvbGRlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SnNwRm9sZGVyKFN0cmluZyBqc3BGb2xkZXIpCi0gIHsKLSAgCXRoaXMuanNwRm9sZGVyID0ganNwRm9sZGVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNZXRob2RzKEJvb2xlYW5TZWxlY3Rpb25bXSBtZXRob2RzKQotICB7Ci0gICAgdGhpcy5tZXRob2RzID0gbWV0aG9kczsgIAotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIHNldFJ1bkNsaWVudFRlc3QoYm9vbGVhbiBydW5DbGllbnRUZXN0KQotICB7Ci0gIAl0aGlzLnJ1bkNsaWVudFRlc3QgPSBydW5DbGllbnRUZXN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcm94eUJlYW4oU3RyaW5nIHByb3h5QmVhbikKLSAgewotICAJdGhpcy5wcm94eUJlYW4gPSBwcm94eUJlYW47Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoU3RyaW5nIHNhbXBsZVByb2plY3QpCi0gIHsKLSAgCXRoaXMuc2FtcGxlUHJvamVjdCA9IHNhbXBsZVByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgCXRoaXMuY2xpZW50UHJvamVjdCA9IGNsaWVudFByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNjZW5hcmlvQ29udGV4dChTY2VuYXJpb0NvbnRleHQgc2NlbmFyaW9Db250ZXh0KQotICB7Ci0gIAl0aGlzLnNjZW5hcmlvQ29udGV4dCA9IHNjZW5hcmlvQ29udGV4dDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VGVzdFJlZ2lzdHJ5KFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgdGVzdFJlZ2lzdHJ5KQotICB7Ci0gIAl0aGlzLnRlc3RSZWdpc3RyeSA9IHRlc3RSZWdpc3RyeTsKLSAgfQotICAgCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVNlcnZlclR5cGVJRChTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEKQotICB7Ci0gIAl0aGlzLnNhbXBsZVNlcnZlclR5cGVJRCA9IHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcikKLSAgewotICAJdGhpcy5zYW1wbGVFeGlzdGluZ1NlcnZlciA9IHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzKQotICB7Ci0gICAgY2xpZW50SWRzID0gaWRzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzKQotICB7Ci0gICAgc2VydmVySWRzID0gaWRzOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVNlcnZlclR5cGVJRCgpCi0gIHsKLSAgCXJldHVybiBzYW1wbGVTZXJ2ZXJUeXBlSUQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU2VydmVyIGdldFNhbXBsZUV4aXN0aW5nU2VydmVyKCkKLSAgewotICAJcmV0dXJuIHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50U2VydmVyKFN0cmluZyBjbGllbnRTZXJ2ZXIpCi0gIHsKLSAgCXRoaXMuY2xpZW50U2VydmVyID0gY2xpZW50U2VydmVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KFN0cmluZyBzZXJ2aWNlUHJvamVjdCkKLSAgewotICAJdGhpcy5zZXJ2aWNlUHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdTRExQcm9qZWN0KCkKLSAgewotICAJaWYoc2VydmljZVByb2plY3QgIT0gbnVsbCkKLSAgICAgcmV0dXJuIHNlcnZpY2VQcm9qZWN0OwotICAJCi0gIAlyZXR1cm4gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFNlcnZpY2VVUkwpCi0gIHsKLSAgICB0aGlzLndzZGxTZXJ2aWNlVVJMID0gd3NkbFNlcnZpY2VVUkw7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHkpCi0gIHsKLSAgCXRoaXMuZ2VuZXJhdGVQcm94eSA9IGdlbmVyYXRlUHJveHk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldElzVGVzdFdpZGdldCgpCi0gIHsKLSAgCXJldHVybiBpc1Rlc3RXaWRnZXQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHNldEVuZHBvaW50TWV0aG9kIFRoZSBzZXRFbmRwb2ludE1ldGhvZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXRFbmRwb2ludE1ldGhvZChTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2QpCi0gIHsKLSAgICB0aGlzLnNldEVuZHBvaW50TWV0aG9kID0gc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBlbmRwb2ludCBUaGUgZW5kcG9pbnQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50KQotICB7Ci0gICAgaWYgKGVuZHBvaW50ICE9IG51bGwgJiYgZW5kcG9pbnQubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgdi5hZGQoZW5kcG9pbnQpOwotICAgICAgc2V0RW5kcG9pbnRzKHYpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnRzKExpc3QgZW5kcG9pbnRzKQotICB7Ci0gICAgdGhpcy5lbmRwb2ludHMgPSBlbmRwb2ludHM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NsaWVudFRlc3RGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTMxMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50VGVzdEZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50Ci17Ci0gIHByaXZhdGUgYm9vbGVhbiB0ZXN0U2VydmljZTsKLSAgcHJpdmF0ZSBib29sZWFuIGdlblByb3h5OwotICBwcml2YXRlIGJvb2xlYW4gbGF1bmNoZWRUZXN0ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgQ2xpZW50VGVzdEZyYWdtZW50KCBTdHJpbmcgaWQgKQotICB7Ci0gICAgU2VxdWVuY2VGcmFnbWVudCBjbGllbnRUZXN0Um9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgQ29uZGl0aW9uICAgICAgICBjb25kaXRpb24gICAgICA9IG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0U2VydmljZSAmJiBnZW5Qcm94eTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgc2V0Q29uZGl0aW9uKCBjb25kaXRpb24gKTsKLSAgICAKLSAgICBjbGllbnRUZXN0Um9vdC5hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQoKSwgIiIgKSApOwotICAgIGNsaWVudFRlc3RSb290LmFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBpZCApICk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KCBjbGllbnRUZXN0Um9vdCApOwotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KCBib29sZWFuIGdlblByb3h5ICkKLSAgewotICAgIHRoaXMuZ2VuUHJveHkgPSBnZW5Qcm94eTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZSggQm9vbGVhbiB0ZXN0U2VydmljZSApCi0gIHsKLSAgICB0aGlzLnRlc3RTZXJ2aWNlID0gdGVzdFNlcnZpY2UuYm9vbGVhblZhbHVlKCk7ICAKLSAgfSAKLQotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hlZFRlc3QoKQotICB7Ci0gIAlyZXR1cm4gbGF1bmNoZWRUZXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0V2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTEzMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdFdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5Gb2xkZXJSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmRpYWxvZy5EaWFsb2dVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRUZXN0V2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotCi0gIC8qQ09OVEVYVF9JRCBQV1NNMDAwMSBmb3IgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX1BBR0UgPSAgIlBXU00wMDAxIjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gdGVzdENoZWNrYm94XzsKLSAgLypDT05URVhUX0lEIFBXU00wMDAyIGZvciB0aGUgVGVzdCBjaGVjayBib3ggb2YgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX0NIRUNLQk9YX1RFU1QgPSAiUFdTTTAwMDIiOwotCi0gIHByaXZhdGUgQ29tYm8gdGVzdFR5cGVDb21ib187Ci0gICAvKkNPTlRFWFRfSUQgUFdTTTAwMDMgZm9yIHRoZSBUZXN0IFR5cGUgQ29tYm8gYm94IG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9DT01CT0JPWF9URVNUID0gIlBXU00wMDAzIjsKLQotICBwcml2YXRlIFRleHQgIGpzcEZvbGRlclRleHRfOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMDggZm9yIHRoZSBKU1AgRm9sZGVyIGZpZWxkIG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9URVhUX0pTUF9GT0xERVIgPSAiUFdTTTAwMDgiOwotCi0gIHByaXZhdGUgQnV0dG9uIHNhbXBsZUZvbGRlckJyb3dzZUJ1dHRvbl87Ci0gIC8qQ09OVEVYVF9JRCBQV1NNMDAwOSBmb3IgdGhlIEpTUCBGb2xkZXIgQnJvd3NlIGJ1dHRvbiBvZiB0aGUgU2FtcGxlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fQlVUVE9OX0pTUF9GT0xERVJfQlJPV1NFID0gIlBXU00wMDA5IjsKLQotICBwcml2YXRlIENvbWJvIHByb2plY3RDb21ib187Ci0gIC8qQ09OVEVYVF9JRCBQV1NNMDAxMCBmb3IgdGhlIFByb2plY3QgY29tYm8gYm94IG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9DT01CT19QUk9KRUNUID0gIlBXU00wMDEwIjsKLQotICBwcml2YXRlIFRyZWUgbWV0aG9kc1RyZWVfOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMDUgZm9yIHRoZSBNZXRob2RzIHRyZWUgb2YgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX1RSRUVfTUVUSE9EUyA9ICJQV1NNMDAwNSI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl87Ci0gIC8qQ09OVEVYVF9JRCBQV1NNMDAwNiBmb3IgdGhlIFNlbGVjdCBBbGwgYnV0dG9uIG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9CVVRUT05fU0VMRUNUX0FMTCA9ICJQV1NNMDAwNiI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxNZXRob2RzQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBXU00wMDA3IGZvciB0aGUgRGVzZWxlY3QgQWxsIGJ1dHRvbiBvZiB0aGUgU2FtcGxlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fQlVUVE9OX0RFU0VMRUNUX0FMTCA9ICJQV1NNMDAwNyI7Ci0KLSAgcHJpdmF0ZSBUZXh0IHNhbXBsZUZvbGRlclRleHRfOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMTQgZm9yIHRoZSBGb2xkZXIgZmllbGQgb2YgdGhlIFNhbXBsZSBQYWdlKi8gICAKLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX1RFWFRfU0FNUExFX0ZPTERFUiA9ICJQV1NNMDAxNCI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIHJ1blRlc3RDaGVja2JveF87ICAKLSAgLypDT05URVhUX0lEIFBXU00wMDE1IGZvciB0aGUgcnVuIHRlc3QgY2hlY2sgYm94IG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9DSEVDS0JPWF9MQVVOQ0ggPSAiUFdTTTAwMTUiOwotICAvLwotICBwcml2YXRlIENvbWJvIGVhckNvbWJvXzsKLSAgLypDT05URVhUX0lEIFBXU00wMDE2IGZvciB0aGUgRUFSIGNvbWJvIGJveCBvZiB0aGUgU2FtcGxlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fRUFSX0NPTUJPID0gIlBXU00wMDE2IjsKLSAgCi0gIHByaXZhdGUgTGFiZWwgICAgICAgICAgICAgICAgcHJvamVjdEV4aXN0c0xhYmVsXzsKLSAgcHJpdmF0ZSBMYWJlbCAgICAgICAgICAgICAgICBlYXJFeGlzdHNMYWJlbF87Ci0gIHByaXZhdGUgQ29tcG9zaXRlICAgICAgICAgICAgY29tYm9Hcm91cF87IAotICBwcml2YXRlIFNlbGVjdGlvbkxpc3QgICAgICAgIHRlc3RGYWNpbGl0aWVzXzsKLSAgcHJpdmF0ZSBGb2xkZXJSZXNvdXJjZUZpbHRlciBmb2xkZXJGaWx0ZXJfID0gbmV3IEZvbGRlclJlc291cmNlRmlsdGVyKCk7Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbl87Ci0gIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICBwcml2YXRlIGJvb2xlYW4gaXNUZXN0V2lkZ2V0ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgaXNUZXN0V2lkZ2V0ID0gdHJ1ZTsKLSAgCU1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBwbHVnaW5JZF8gKTsKLSAgICAgICAgCi0JcGFyZW50LnNldFRvb2xUaXBUZXh0KCBtc2dVdGlscy5nZXRNZXNzYWdlKCAiVE9PTFRJUF9QV1NNX1BBR0UiICkgKTsKLQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBwYXJlbnQsIHBsdWdpbklkXyArICIuIiArIElORk9QT1BfUFdTTV9QQUdFICk7Ci0gICAgCi0gICAgdGVzdENoZWNrYm94XyA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3goIHBhcmVudCwgIkJVVFRPTl9URVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdTTV9DSEVDS0JPWF9URVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1NNX0NIRUNLQk9YX1RFU1QgKTsKLSAgICB0ZXN0Q2hlY2tib3hfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRlc3RCdXR0b24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICBjb21ib0dyb3VwXyA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDMsIDUsIDAgKTsKLSAgICAKLSAgICB0ZXN0VHlwZUNvbWJvXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8oIGNvbWJvR3JvdXBfLCAiTEFCRUxfVEVTVF9UWVBFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1NNX0NPTUJPQk9YX1RFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1NNX0NPTUJPQk9YX1RFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICBMYWJlbCBkdW1teUxhYmVsID0gbmV3IExhYmVsKCBjb21ib0dyb3VwXywgU1dULk5PTkUgKTsKLSAgICAKLSAgICBwcm9qZWN0Q29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyggY29tYm9Hcm91cF8sICJMQUJFTF9KU1BfUFJPSkVDVF9OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXU01fQ09NQk9fUFJPSkVDVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXU01fQ09NQk9fUFJPSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotICAgIHByb2plY3RDb21ib18uc2V0RW5hYmxlZCggZmFsc2UgKTsKLSAgICBwcm9qZWN0RXhpc3RzTGFiZWxfID0gbmV3IExhYmVsKCBjb21ib0dyb3VwXywgU1dULk5PTkUgKTsKLSAgICAKLSAgICAKLSAgICBlYXJDb21ib18gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKCBjb21ib0dyb3VwXywgIkxBQkVMX0VBUl9QUk9KRUNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1NNX0VBUl9QUk9KRUNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXU01fRUFSX0NPTUJPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotICAgIGVhckNvbWJvXy5zZXRFbmFibGVkKCBmYWxzZSApOwotICAgIGVhckV4aXN0c0xhYmVsXyA9IG5ldyBMYWJlbCggY29tYm9Hcm91cF8sIFNXVC5OT05FICk7Ci0gICAgCi0gICAgCi0gICAgCi0gICAgc2FtcGxlRm9sZGVyVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIGNvbWJvR3JvdXBfLCAiTEFCRUxfRk9MREVSX05BTUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1NNX1RFWFRfU0FNUExFX0ZPTERFUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdTTV9URVhUX1NBTVBMRV9GT0xERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSICk7Ci0gICAgCi0gICAgc2FtcGxlRm9sZGVyVGV4dF8uYWRkTW9kaWZ5TGlzdGVuZXIoIG5ldyBNb2RpZnlMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dCggTW9kaWZ5RXZlbnQgZXZ0ICkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZUZvbGRlclRleHQoKTsgCi0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIAotICAgICAgIAotICAgIHNhbXBsZUZvbGRlckJyb3dzZUJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIGNvbWJvR3JvdXBfLCAiQlVUVE9OX0JST1dTRSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXU01fQlVUVE9OX0pTUF9GT0xERVJfQlJPV1NFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXU01fQlVUVE9OX0pTUF9GT0xERVJfQlJPV1NFICk7Ci0gICAgc2FtcGxlRm9sZGVyQnJvd3NlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTYW1wbGVCcm93c2UoKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAganNwRm9sZGVyVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIGNvbWJvR3JvdXBfLCAiTEFCRUxfSlNQX0ZPTERFUl9OQU1FIiwKLSAgICAgICAgICAgICJUT09MVElQX1BXU01fVEVYVF9KU1BfRk9MREVSIiwKLSAgICAgICAgICAgIElORk9QT1BfUFdTTV9URVhUX0pTUF9GT0xERVIsCi0gICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICBqc3BGb2xkZXJUZXh0Xy5zZXRFbmFibGVkKCBmYWxzZSApOwotICAgIAotICAgIEdyb3VwIG1ldGhvZHNHcm91cCA9IHVpVXRpbHMuY3JlYXRlR3JvdXAoIHBhcmVudCwgIkxBQkVMX01FVEhPRFMiLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1NNX1RSRUVfTUVUSE9EUyIsIG51bGwgKTsKLSAgICAKLQltZXRob2RzR3JvdXAuc2V0TGF5b3V0RGF0YSggdWlVdGlscy5jcmVhdGVGaWxsQWxsKCkgKTsKLQkKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQltZXRob2RzR3JvdXAuc2V0TGF5b3V0KCBsYXlvdXQgKTsKLQkKLQkvLyBUT0RPIE5vIGluZm9wb3AgZm9yIHRoaXMgdHJlZS4KLQltZXRob2RzVHJlZV8gPSB1aVV0aWxzLmNyZWF0ZVRyZWUoIG1ldGhvZHNHcm91cCwgIlRPT0xUSVBfUFdTTV9UUkVFX01FVEhPRFMiLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0JICAgICAgICAgICAgICAgICAgIAkJCQkgICBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMCXwgU1dULkNIRUNLICk7Ci0KLSAgICBDb21wb3NpdGUgc2VsZWN0QnV0dG9ucyA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBtZXRob2RzR3JvdXAsIDIgKTsKLSAgICAKLSAgICBzZWxlY3RBbGxNZXRob2RzQnV0dG9uXyAKLSAgICAgID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKCBzZWxlY3RCdXR0b25zLCAiQlVUVE9OX1NFTEVDVF9BTEwiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1NNX0JVVFRPTl9TRUxFQ1RfQUxMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXU01fQlVUVE9OX1NFTEVDVF9BTEwgKTsKLSAgICBzZWxlY3RBbGxNZXRob2RzQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdEFsbCggdHJ1ZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgZGVzZWxlY3RBbGxNZXRob2RzQnV0dG9uXyAKLSAgICAgID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKCBzZWxlY3RCdXR0b25zLCAiQlVUVE9OX0RFU0VMRUNUX0FMTCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXU01fQlVUVE9OX0RFU0VMRUNUX0FMTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1NNX0JVVFRPTl9ERVNFTEVDVF9BTEwgKTsKLSAgICBkZXNlbGVjdEFsbE1ldGhvZHNCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RBbGwoIGZhbHNlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgcnVuVGVzdENoZWNrYm94XyA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3goIHBhcmVudCwgIkJVVFRPTl9SVU5fVEVTVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXU01fQ0hFQ0tCT1hfTEFVTkNIIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1NNX0NIRUNLQk9YX0xBVU5DSCApOwotICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlRm9sZGVyVGV4dCgpCi0gIHsKLSAgCVN0cmluZyBmb2xkZXIgPSBzYW1wbGVGb2xkZXJUZXh0Xy5nZXRUZXh0KCk7CQotICAgIFN0cmluZyBqc3BGb2xkZXIgPSBqc3BGb2xkZXJUZXh0Xy5nZXRUZXh0KCk7Ci0gICAgaW50IGluZGV4ID0ganNwRm9sZGVyLmxhc3RJbmRleE9mKFBhdGguU0VQQVJBVE9SKTsKLSAgICBpZihpbmRleCA9PSAtMSkgcmV0dXJuOwotICAgIGpzcEZvbGRlciA9IGpzcEZvbGRlci5zdWJzdHJpbmcoMCxpbmRleCArIDEpOwotICAgIGpzcEZvbGRlciA9IGpzcEZvbGRlciArIGZvbGRlcjsKLSAgICBqc3BGb2xkZXJUZXh0Xy5zZXRUZXh0KGpzcEZvbGRlcik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVTYW1wbGVCcm93c2UoKQotICB7Ci0gICAgSVBhdGggICAgICBzZWxlY3RlZFBhdGggICAgICAgPSBudWxsOwotICAgIElSZXNvdXJjZSAgaW5pdGlhbFJlc291cmNlICAgID0gbnVsbDsKLSAgICBJUGF0aCAgICAgIHByb2plY3RQYXRoICAgICAgICA9IG5ldyBQYXRoKCBwcm9qZWN0Q29tYm9fLmdldFRleHQoKSApLm1ha2VBYnNvbHV0ZSgpOwotICAgIElSZXNvdXJjZSAgcHJvamVjdCAgICAgICAgICAgID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoIHByb2plY3RQYXRoICk7Ci0vLyAgICBJQ29udGFpbmVyIHdlYk1vZHVsZUNvbnRhaW5lciA9IFJlc291cmNlVXRpbHMuZ2V0V2ViTW9kdWxlU2VydmVyUm9vdCggKElQcm9qZWN0KXByb2plY3QpOwotICAgIElDb250YWluZXIgd2ViTW9kdWxlQ29udGFpbmVyID0gSjJFRVV0aWxzLmdldEZpcnN0V2ViQ29udGVudENvbnRhaW5lcigoSVByb2plY3QpcHJvamVjdCk7ICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpbml0aWFsUmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbiggaW5pdGlhbFNlbGVjdGlvbl8gKTsKLSAgICB9Ci0gICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICB7ICAKLSAgICB9Ci0gICAgCi0gICAgaWYoIGluaXRpYWxSZXNvdXJjZSA9PSBudWxsIClpbml0aWFsUmVzb3VyY2UgPSBwcm9qZWN0OwotICAgIAotICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IERpYWxvZ1V0aWxzLmJyb3dzZVJlc291cmNlcyggY29tYm9Hcm91cF8uZ2V0U2hlbGwoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFJlc291cmNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlckZpbHRlcl8gKTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgewotICAgICAgc2VsZWN0ZWRQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsgICAKLSAgICAKLSAgICAgIGludCB3ZWJNb2R1bGVTZWdtZW50cyA9IHNlbGVjdGVkUGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMod2ViTW9kdWxlQ29udGFpbmVyLmdldEZ1bGxQYXRoKCkpOwotICAgICAgCi0gICAgICBpZiAoIHdlYk1vZHVsZVNlZ21lbnRzIDwgMiApCi0gICAgICB7Ci0gICAgICAgIHNhbXBsZUZvbGRlclRleHRfLnNldFRleHQoIiIpOwotICAgICAgICBoYW5kbGVGb2xkZXJUZXh0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNhbXBsZUZvbGRlclRleHRfLnNldFRleHQoc2VsZWN0ZWRQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMod2ViTW9kdWxlU2VnbWVudHMpLnRvU3RyaW5nKCkpOwotICAgICAgICBoYW5kbGVGb2xkZXJUZXh0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlVGVzdEJ1dHRvbigpCi0gIHsKLSAgICBib29sZWFuIGVuYWJsZWQgPSB0ZXN0Q2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICAgIAotICAgIHRlc3RUeXBlQ29tYm9fLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICBzYW1wbGVGb2xkZXJUZXh0Xy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgbWV0aG9kc1RyZWVfLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICBydW5UZXN0Q2hlY2tib3hfLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICBzZWxlY3RBbGxNZXRob2RzQnV0dG9uXy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgZGVzZWxlY3RBbGxNZXRob2RzQnV0dG9uXy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgc2FtcGxlRm9sZGVyQnJvd3NlQnV0dG9uXy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RBbGwoIGJvb2xlYW4gdmFsdWUgKQotICB7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG1ldGhvZHNUcmVlXy5nZXRJdGVtcygpOwotCQotCWZvciggaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKysgKSAKLQl7Ci0JICBpdGVtc1tpXS5zZXRDaGVja2VkKHZhbHVlKTsKLQl9Ci0gIH0gCi0gIAotICAvLyBIZXJlIGFyZSB0aGUgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgdGhpcyB3aWRnZXQuCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKCBCb29sZWFuIHRlc3RTZXJ2aWNlICkKLSAgewotICAgIHRlc3RDaGVja2JveF8uc2V0U2VsZWN0aW9uKCB0ZXN0U2VydmljZS5ib29sZWFuVmFsdWUoKSApOwotICAgIGhhbmRsZVRlc3RCdXR0b24oKTsKLSAgfQotICAKLSAgcHVibGljIEJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCB0ZXN0Q2hlY2tib3hfLmdldFNlbGVjdGlvbigpICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RGYWNpbGl0eSggU2VsZWN0aW9uTGlzdCB0ZXN0RmFjaWxpdGllcyApCi0gIHsKLSAgICB0ZXN0RmFjaWxpdGllc18gPSB0ZXN0RmFjaWxpdGllczsKLSAgICB0ZXN0VHlwZUNvbWJvXy5zZXRJdGVtcyggdGVzdEZhY2lsaXRpZXMuZ2V0TGlzdCgpICk7Ci0gICAgdGVzdFR5cGVDb21ib18uc2VsZWN0KCB0ZXN0RmFjaWxpdGllcy5nZXRJbmRleCgpICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0IGdldFRlc3RGYWNpbGl0eSgpCi0gIHsKLSAgICB0ZXN0RmFjaWxpdGllc18uc2V0SW5kZXgoIHRlc3RUeXBlQ29tYm9fLmdldFNlbGVjdGlvbkluZGV4KCkgKTsKLSAgICByZXR1cm4gdGVzdEZhY2lsaXRpZXNfOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFRlc3RJRCgpCi0gIHsKLSAgICByZXR1cm4gdGVzdFR5cGVDb21ib18uZ2V0VGV4dCgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0KFN0cmluZyBjbGllbnRQcm9qZWN0KSAKLSAgewotCXByb2plY3RDb21ib18uc2V0SXRlbXMoIG5ldyBTdHJpbmdbXXsgY2xpZW50UHJvamVjdCB9ICk7Ci0JcHJvamVjdENvbWJvXy5zZWxlY3QoMCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3RFQVIoU3RyaW5nIGNsaWVudFByb2plY3RFQVIpIAotICB7Ci0gICAgZWFyQ29tYm9fLnNldEl0ZW1zKCBuZXcgU3RyaW5nW117IGNsaWVudFByb2plY3RFQVIgfSApOwotICAgIGVhckNvbWJvXy5zZWxlY3QoMCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyKCkKLSAgewotICAgIHJldHVybiBzYW1wbGVGb2xkZXJUZXh0Xy5nZXRUZXh0KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEZvbGRlciggU3RyaW5nIGZvbGRlciApCi0gIHsKLSAgICBzYW1wbGVGb2xkZXJUZXh0Xy5zZXRUZXh0KCBmb2xkZXIgKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0SXNUZXN0V2lkZ2V0KCkKLSAgewotICAJcmV0dXJuIGlzVGVzdFdpZGdldDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SnNwRm9sZGVyKCBTdHJpbmcgZm9sZGVyICkKLSAgewotICAgIGpzcEZvbGRlclRleHRfLnNldFRleHQoIGZvbGRlciApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSAoU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lKQotICB7Ci0gIAl0aGlzLmxhdW5jaGVkU2VydmljZVRlc3ROYW1lID0gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFJ1bkNsaWVudFRlc3QoKQotICB7Ci0gICAgcmV0dXJuIHJ1blRlc3RDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJ1bkNsaWVudFRlc3QoIGJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgcnVuVGVzdENoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIHZhbHVlICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuU2VsZWN0aW9uW10gZ2V0TWV0aG9kcygpCi0gIHsKLSAgICBUcmVlSXRlbVtdICAgICAgICAgaXRlbXMgICA9IG1ldGhvZHNUcmVlXy5nZXRJdGVtcygpOwotICAgIEJvb2xlYW5TZWxlY3Rpb25bXSBtZXRob2RzID0gbmV3IEJvb2xlYW5TZWxlY3Rpb25baXRlbXMubGVuZ3RoXTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgaXRlbXMubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBtZXRob2RzW2luZGV4XSA9IG5ldyBCb29sZWFuU2VsZWN0aW9uKCBpdGVtc1tpbmRleF0uZ2V0VGV4dCgpLCBpdGVtc1tpbmRleF0uZ2V0Q2hlY2tlZCgpICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBtZXRob2RzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNZXRob2RzKCBCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcyApCi0gIHsKLSAgICBtZXRob2RzVHJlZV8ucmVtb3ZlQWxsKCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1ldGhvZHMubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBpZihtZXRob2RzW2luZGV4XSA9PSBudWxsKWNvbnRpbnVlOwotICAgICAgVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSggbWV0aG9kc1RyZWVfLCBTV1QuTlVMTCApOwotICAgICAgaXRlbS5zZXRUZXh0KCBtZXRob2RzW2luZGV4XS5nZXRWYWx1ZSgpICk7Ci0gICAgICBpdGVtLnNldENoZWNrZWQoIG1ldGhvZHNbaW5kZXhdLmlzU2VsZWN0ZWQoKSApOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbiggSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgewotICAgIGluaXRpYWxTZWxlY3Rpb25fID0gc2VsZWN0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9Db3B5V2ViU2VydmljZVV0aWxzSmFyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5ZmRmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9Db3B5V2ViU2VydmljZVV0aWxzSmFyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBDb3B5V2ViU2VydmljZVV0aWxzSmFyQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVElPTiA9ICJDb3B5IFdlYnNlcnZpY2VVdGlscy5qYXIiOwotCXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTEFCRUwgICAgICAgICAgID0gIkNvcHlXZWJzZXJ2aWNlSmFyQ29tbWFuZCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlUHJvamVjdDsKLSAgICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLQkKLS8qKgotICogRGVmYXVsdCBDVE9SOwotICovCi0KLQotcHVibGljIENvcHlXZWJTZXJ2aWNlVXRpbHNKYXJDb21tYW5kKCkKLXsKLSAgc3VwZXIoTEFCRUwsREVTQ1JJUFRJT04pOwotICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsgIAotfQotCi0vKioKLSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAqLwotcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLXsKLSAgdHJ5Ci0gIHsKLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KCBtc2dVdGlscy5nZXRNZXNzYWdlKCAiUFJPR1JFU1NfSU5GT19DT1BZX1dFQlNFUlZJQ0VfVVRJTFMiICkgKTsKLSAgICBJUHJvamVjdCBzYW1wbGVJUHJvamVjdCA9IChJUHJvamVjdClSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShzYW1wbGVQcm9qZWN0KTsgICAgCi0vLyAgICBJUGF0aCB3ZWJNb2R1bGVQYXRoID0gUmVzb3VyY2VVdGlscy5nZXRXZWJNb2R1bGVTZXJ2ZXJSb290KHNhbXBsZUlQcm9qZWN0KS5nZXRGdWxsUGF0aCgpOwotICAgIElQYXRoIHdlYk1vZHVsZVBhdGggPSBKMkVFVXRpbHMuZ2V0Rmlyc3RXZWJDb250ZW50UGF0aChzYW1wbGVJUHJvamVjdCk7CQotICAgIGlmICh3ZWJNb2R1bGVQYXRoID09IG51bGwpCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCxtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUFJPSkVDVF9OT1RfRk9VTkQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIAotICAgIFN0YXR1cyBzdGF0dXMgPSBjb3B5SUZpbGUoIndlYnNlcnZpY2V1dGlscy5qYXIiLHdlYk1vZHVsZVBhdGgsIldFQi1JTkYvbGliL3dlYnNlcnZpY2V1dGlscy5qYXIiLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0SW5zdGFuY2UoKSxlbnYpOwotICAgIGlmKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUil7Ci0gICAgICBTdGF0dXNIYW5kbGVyIHNIYW5kbGVyID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKTsKLSAgICAgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9GSUxFQ09QWV9XRUJTRVJWSUNFX1VUSUxTIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICBzSGFuZGxlci5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7CQotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgfQotICAgICAgCi0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBTdGF0dXNIYW5kbGVyIHNIYW5kbGVyID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKTsKLSAgICAgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9GSUxFQ09QWV9XRUJTRVJWSUNFX1VUSUxTIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICBzSGFuZGxlci5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7CQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0ZJTEVDT1BZX1dFQlNFUlZJQ0VfVVRJTFMiKSxTdGF0dXMuRVJST1IsZSk7Ci0gICAgfQotICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci19Ci0KLS8qKgotICoKLSAqLwotcHJpdmF0ZSBTdGF0dXMgY29weUlGaWxlKFN0cmluZyBzb3VyY2UsIElQYXRoIHRhcmdldFBhdGgsIFN0cmluZyB0YXJnZXRGaWxlLEVudmlyb25tZW50IGVudikKLXsKLSAgcmV0dXJuIGNvcHlJRmlsZShzb3VyY2UsIHRhcmdldFBhdGgsIHRhcmdldEZpbGUsIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKSxlbnYpOwotfQotCi0vKioKLSAqCi0gKi8KLXByaXZhdGUgU3RhdHVzIGNvcHlJRmlsZShTdHJpbmcgc291cmNlLCBJUGF0aCB0YXJnZXRQYXRoLCBTdHJpbmcgdGFyZ2V0RmlsZSwgUGx1Z2luIHBsdWdpbixFbnZpcm9ubWVudCBlbnYpCi17Ci0gICAgCi0gIGlmIChwbHVnaW4gIT0gbnVsbCkKLSAgewotICAgIElQYXRoIHRhcmdldCA9IHRhcmdldFBhdGguYXBwZW5kKG5ldyBQYXRoKHRhcmdldEZpbGUpKTsKLSAgICAKLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KCBtc2dVdGlscy5nZXRNZXNzYWdlKCAiUFJPR1JFU1NfSU5GT19DT1BZSU5HX0ZJTEUiICkgKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAgUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgPSBuZXcgVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgICAgY29udGV4dC5zZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICAgY29udGV4dC5zZXRDcmVhdGVGb2xkZXJzRW5hYmxlZCh0cnVlKTsKLSAgICAgICBjb250ZXh0LnNldENoZWNrb3V0RmlsZXNFbmFibGVkKHRydWUpOwotICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IEZpbGVSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSh0YXJnZXQpOwotICAgICAgIGlmKHJlc291cmNlICE9IG51bGwpIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICAgICBJRmlsZSBmaWxlID0gRmlsZVJlc291cmNlVXRpbHMuY3JlYXRlRmlsZShjb250ZXh0LCAKLSAgICAgICAJCQkJCQkJCXRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLm9wZW5TdHJlYW0obmV3IFBhdGgoc291cmNlKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0ZJTEVDT1BZX1dFQlNFUlZJQ0VfVVRJTFMiKSxTdGF0dXMuRVJST1IsZSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLX0KLQotcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdChTdHJpbmcgc2FtcGxlUHJvamVjdCkKLXsKLSAgdGhpcy5zYW1wbGVQcm9qZWN0ID0gc2FtcGxlUHJvamVjdDsgIAotfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NyZWF0ZVNhbXBsZVByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZjIyMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3RFYXI7Ci0gIHByaXZhdGUgSVNlcnZlciBleGlzdGluZ1NlcnZlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmFjdG9yeUlkOwotICBwcml2YXRlIGJvb2xlYW4gbmVlZEVBUjsKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb247Ci0gIAotICAKLSAgcHVibGljIENyZWF0ZVNhbXBsZVByb2plY3RDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jb21tb24uQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQiLCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jb21tb24uQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQiKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICBpZiAoIXJvb3QuZ2V0UHJvamVjdChzYW1wbGVQcm9qZWN0KS5leGlzdHMoKSB8fCAhcm9vdC5nZXRQcm9qZWN0KHNhbXBsZVByb2plY3RFYXIpLmV4aXN0cygpKQotICAgIHsKLSAgICAgIENyZWF0ZVdlYlByb2plY3RDb21tYW5kIGMgPSBuZXcgQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQoKTsKLSAgICAgIGMuc2V0UHJvamVjdE5hbWUoc2FtcGxlUHJvamVjdCk7Ci0gICAgICBjLnNldEVhclByb2plY3ROYW1lKHNhbXBsZVByb2plY3RFYXIpOwotICAgICAgYy5zZXRFeGlzdGluZ1NlcnZlcihleGlzdGluZ1NlcnZlcik7Ci0gICAgICBjLnNldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWQpOwotICAgICAgYy5zZXROZWVkRUFSKG5lZWRFQVIpOwotICAgICAgYy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbik7Ci0gICAgICByZXR1cm4gYy5leGVjdXRlKGVudik7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoU3RyaW5nIHNhbXBsZVByb2plY3QpCi0gIHsKLSAgICB0aGlzLnNhbXBsZVByb2plY3QgPSBzYW1wbGVQcm9qZWN0OyAJCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0RUFSKFN0cmluZyBzYW1wbGVQcm9qZWN0RWFyKQotICB7Ci0gIAl0aGlzLnNhbXBsZVByb2plY3RFYXIgPSBzYW1wbGVQcm9qZWN0RWFyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBleGlzdGluZ1NlcnZlcikgewotCi0gICAgdGhpcy5leGlzdGluZ1NlcnZlciA9IGV4aXN0aW5nU2VydmVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJdGhpcy5zZXJ2ZXJGYWN0b3J5SWQgPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIG5lZWRFQVIgVGhlIG5lZWRFQVIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmVlZEVBUihib29sZWFuIG5lZWRFQVIpCi0gIHsKLSAgICB0aGlzLm5lZWRFQVIgPSBuZWVkRUFSOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgajJlZVZlcnNpb24gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SjJlZVZlcnNpb24oU3RyaW5nIHZlcnNpb24pCi0gIHsKLSAgICBqMmVlVmVyc2lvbiA9IHZlcnNpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaERlZmF1bHRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9GaW5pc2hEZWZhdWx0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWFlZDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaERlZmF1bHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotCi0vKgotKiBUaGUgSlNQR2VuZXJhdGlvbiB0YXNrIHJ1bnMgdGhlIGpzcCBnZW5lcmF0aW9uIGVuZ2luZSBmb3VuZCBpbiB0aGUgCi0qIEpCV2l6YXJkIFBsdWdpbgotKgotKgotKi8KLXB1YmxpYyBjbGFzcyBGaW5pc2hEZWZhdWx0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiSlNQR2VuZXJhdGlvblRhc2siOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJSdW4gdGhlIEpTUCBHZW5lcmF0aW9uIjsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgcHJpdmF0ZSBJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFN0cmluZyBleGlzdGluZ1NlcnZlcklkXzsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHM7Ci0KLSAgCi0gIHB1YmxpYyBGaW5pc2hEZWZhdWx0Q29tbWFuZCAoKQotICB7Ci0gICAgc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotICAgIHNldE5hbWUoTEFCRUwpOyAgCi0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgCWlmKGNsaWVudElkcyAhPSBudWxsKXsKLSAgCSAgaWYgKGNsaWVudElkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkgIT0gbnVsbCkgCi0gICAgICAgIHNhbXBsZUV4aXN0aW5nU2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKGNsaWVudElkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotICAJICBpZiAoc2FtcGxlRXhpc3RpbmdTZXJ2ZXI9PW51bGwgJiYgZXhpc3RpbmdTZXJ2ZXJJZF8hPW51bGwgJiYgZXhpc3RpbmdTZXJ2ZXJJZF8ubGVuZ3RoKCk+MCkKLSAgCSAgewotICAJICAgIC8vVXNlIHRoZSBleGlzdGluZ1NlcnZlcklkCi0gIAkgICAgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoZXhpc3RpbmdTZXJ2ZXJJZF8pOwotICAJICB9Ci0gICAgICBpZiAoc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgICAgc2FtcGxlU2VydmVyVHlwZUlEID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNhbXBsZVNlcnZlclR5cGVJRCA9IGNsaWVudElkcy5nZXRTZXJ2ZXJJZCgpOwotICAJfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBpZHMpCi0gIHsKLSAgICBjbGllbnRJZHMgPSBpZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlU2VydmVyVHlwZUlEKCkKLSAgewotICAJcmV0dXJuIHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgfQotICAKLSAgcHVibGljIElTZXJ2ZXIgZ2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoKQotICB7Ci0gIAlyZXR1cm4gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcklkKFN0cmluZyBleGlzdGluZ1NlcnZlcklkKQotICB7Ci0gICAgZXhpc3RpbmdTZXJ2ZXJJZF8gPSBleGlzdGluZ1NlcnZlcklkOwotICB9ICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvRmluaXNoSmF2YVRlc3RGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvRmluaXNoSmF2YVRlc3RGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YThkM2Y3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaEphdmFUZXN0RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA0LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkJ1aWxkUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBGaW5pc2hKYXZhVGVzdEZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50IAotewotICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVQcm94eTsKLQkKLSAgcHVibGljIEZpbmlzaEphdmFUZXN0RnJhZ21lbnQoKQotICB7Ci0gIAlTZXF1ZW5jZUZyYWdtZW50IGphdmFUZXN0Um9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gIAlDb25kaXRpb24gY29uZGl0aW9uID0gbmV3IENvbmRpdGlvbigpCi0JewotCSAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotCSAgewotCSAgICByZXR1cm4gZ2VuZXJhdGVQcm94eTsgCi0JICB9Ci0JfTsKLSAgICBzZXRDb25kaXRpb24oY29uZGl0aW9uKTsKLSAgICBqYXZhVGVzdFJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgVGVzdENsaWVudERlcGFydHVyZUluaXRDb21tYW5kKCksICIiKSk7Ci0gICAgamF2YVRlc3RSb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQoKSwgIiIpKTsKLSAgICBqYXZhVGVzdFJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQnVpbGRQcm9qZWN0Q29tbWFuZCgpLCAiIikpOwotICAgIHNldFRydWVGcmFnbWVudChqYXZhVGVzdFJvb3QpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHkpCi0gIHsKLSAgCXRoaXMuZ2VuZXJhdGVQcm94eSA9IGdlbmVyYXRlUHJveHk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElzSlNQR2VuKGJvb2xlYW4ganNwR2VuKQotICB7Ci0gIAkKLSAgfQotICAKLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvRmluaXNoVGVzdEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9GaW5pc2hUZXN0RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmZDBhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9GaW5pc2hUZXN0RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEZpbmlzaFRlc3RGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudHsKLQotICBwcml2YXRlIGJvb2xlYW4gaXNUZXN0V2lkZ2V0OwkKLSAgcHJpdmF0ZSBib29sZWFuIGxhdW5jaGVkVGVzdDsKLSAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlUHJveHk7Ci0gIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICBwcml2YXRlIGJvb2xlYW4gdGVzdFNlcnZpY2U7Ci0gIHByaXZhdGUgU3RyaW5nIHRlc3RJRDsKLSAgcHVibGljIEZpbmlzaFRlc3RGcmFnbWVudCgpCi0gIHsKLSAgICBDb25kaXRpb24gY29uZGl0aW9uID0gbmV3IENvbmRpdGlvbigpCi0JewotCSAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotCSAgewotCSAgICBpZighdGVzdFNlcnZpY2UpIHJldHVybiBmYWxzZTsKLQkgIAlpZihsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLQkgICAgaWYobGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgIT0gbnVsbCkKLQkgICAgICBpZigoIWxhdW5jaGVkU2VydmljZVRlc3ROYW1lLmVxdWFscygiIikgJiYgICghaXNQcmVmZXJlZEFXU0RMVGVzdCgpIHx8IChpc1Rlc3RXaWRnZXQgJiYgaXNDbGllbnRUZXN0SmF2YSgpKSkgJiYgZ2VuZXJhdGVQcm94eSkgfHwgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUuZXF1YWxzKCIiKSkgcmV0dXJuIHRydWU7CQotCSAgICAKLQkgIAlyZXR1cm4gZmFsc2U7IAotCSAgfQotCX07Ci0JICAgCi0Jc2V0VHJ1ZUZyYWdtZW50KG5ldyBXZWJTZXJ2aWNlVGVzdENsaWVudERlcGFydHVyZUZyYWdtZW50KCkpOwotICAgIHNldENvbmRpdGlvbihjb25kaXRpb24pOwotICB9Ci0JICAgIAotICBwdWJsaWMgdm9pZCBzZXRMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZShTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUpCi0gIHsKLQl0aGlzLmxhdW5jaGVkU2VydmljZVRlc3ROYW1lID0gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIH0KLQkgIAotICBwdWJsaWMgYm9vbGVhbiBpc1ByZWZlcmVkQVdTRExUZXN0KCkKLSAgewotICAgIFNjZW5hcmlvQ29udGV4dCBzY2VuYXJpb0NvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCkuY29weSgpOwotCVN0cmluZ1tdIHRlc3RUeXBlcyA9IHNjZW5hcmlvQ29udGV4dC5nZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCk7Ci0JV2ViU2VydmljZVRlc3RSZWdpc3RyeSB3c3R0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JV2ViU2VydmljZVRlc3RFeHRlbnNpb24gd3NjdGUgPSAoV2ViU2VydmljZVRlc3RFeHRlbnNpb24pd3N0dFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKHRlc3RUeXBlc1swXSk7ICAJCi0JaWYoIXdzY3RlLmlzSmF2YSgpKQkKLQkgIHJldHVybiB0cnVlOwotCXJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQ2xpZW50VGVzdEphdmEoKQotICB7Ci0gIAlpZih0ZXN0SUQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAJV2ViU2VydmljZVRlc3RSZWdpc3RyeSB3c3R0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JV2ViU2VydmljZVRlc3RFeHRlbnNpb24gd3NjdGUgPSAoV2ViU2VydmljZVRlc3RFeHRlbnNpb24pd3N0dFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKHRlc3RJRCk7ICAJCi0JaWYod3NjdGUuaXNKYXZhKCkpCQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOyAgIAkKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKGJvb2xlYW4gdGVzdFNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLnRlc3RTZXJ2aWNlID0gdGVzdFNlcnZpY2U7CSAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoYm9vbGVhbiBnZW5lcmF0ZVByb3h5KQotICB7Ci0gICAgdGhpcy5nZW5lcmF0ZVByb3h5ID0gZ2VuZXJhdGVQcm94eTsJIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VGVzdElEKFN0cmluZyB0ZXN0SUQpCi0gIHsKLSAgICB0aGlzLnRlc3RJRCA9IHRlc3RJRDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElzVGVzdFdpZGdldChib29sZWFuIGlzVGVzdFdpZGdldCkKLSAgewotICAJdGhpcy5pc1Rlc3RXaWRnZXQgPSBpc1Rlc3RXaWRnZXQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1Rlc3RDbGllbnREZXBhcnR1cmVJbml0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvVGVzdENsaWVudERlcGFydHVyZUluaXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NWVlMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvVGVzdENsaWVudERlcGFydHVyZUluaXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50RGVwYXJ0dXJlSW5pdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotICAKLSAgcHJpdmF0ZSBib29sZWFuIGZvcmNlQnVpbGQ7CQotCQotICBwdWJsaWMgVGVzdENsaWVudERlcGFydHVyZUluaXRDb21tYW5kKCkKLSAgewotICAJZm9yY2VCdWlsZCA9IHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRGb3JjZUJ1aWxkKCkKLSAgewotICAJcmV0dXJuIGZvcmNlQnVpbGQ7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9UZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9UZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzA5NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvVGVzdERlZmF1bHRpbmdGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDQsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdDsKLQotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0RGVmYXVsdGluZ0ZyYWdtZW50IGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICAKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHRlc3RSZWdpc3RyeTsKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0IHRlc3RGYWNpbGl0aWVzOwotICBwcml2YXRlIFN0cmluZyBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgcHJpdmF0ZSBTY2VuYXJpb0NvbnRleHQgc2NlbmFyaW9Db250ZXh0OwkKLSAgCi0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAlTaW1wbGVTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAkKLSAgCXNjZW5hcmlvQ29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTY2VuYXJpb0NvbnRleHQoKS5jb3B5KCk7Ci0gIAkvLyAgdGVzdCBmYWNpbGl0aWVzCi0gICAgc2VsZWN0VGVzdEZhY2lsaXR5KCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCQotICAvLyBUaGUgdGVzdCBmYWNpbGl0aWVzIHJldHJpZXZlZCBmcm9tIHRoZSBleHRlbnNpb24KLSAgLy8gcGx1cyB0aGUgZGVmYXVsdAotICBwdWJsaWMgU2VsZWN0aW9uTGlzdCBnZXRUZXN0RmFjaWxpdHkoKQotICB7Ci0gICAgcmV0dXJuIHRlc3RGYWNpbGl0aWVzOwotICB9IAotCSAgCi0gIAotICAKLSAgLy8JKioqKioqKioqKioqKioqKioqKioqKiogCi0gIC8vIFRoaXMgbWV0aG9kIHVzZXMgdGhlIHByZWZlcmVuY2UgdG8gCi0gIC8vIHNlbGVjdCB0aGUgY29ycmVjdCB0ZXN0IGZhY2lsaXR5IAotICAvLyAKLSAgLy8qKioqKioqKioqKioqKioqKioqKioqKgotICBwcml2YXRlIHZvaWQgc2VsZWN0VGVzdEZhY2lsaXR5KCkKLSAgewotICAgIC8vaWYgd2UgZmluZCBzb21ldGhpbmcgd2UgbGF1bmNoZWQgZWFybGllciAKLSAgICAvL3B1dCBpdCBvbiB0aGUgYm90dG9tCi0gICAgU3RyaW5nW10gdGVzdFR5cGVzID0gc2NlbmFyaW9Db250ZXh0LmdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsJICAKLSAgICBTdHJpbmdbXSBuZXdUZXN0VHlwZXMgPSBuZXcgU3RyaW5nW3Rlc3RUeXBlcy5sZW5ndGhdOwotICAgIGJvb2xlYW4gbGF1bmNoZWQgPSBmYWxzZTsKLSAgICBpbnQgaiA9IDA7Ci0gICAgZm9yKGludCBpID0gMDtpPHRlc3RUeXBlcy5sZW5ndGg7aSsrKXsKLQkgIGlmKHRlc3RUeXBlc1tpXS5lcXVhbHMobGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUpKQotCSAgICBsYXVuY2hlZCA9IHRydWU7Ci0JICBlbHNlewotCSAgICAgbmV3VGVzdFR5cGVzW2pdID0gdGVzdFR5cGVzW2ldOwotCSAgICAgaisrOwotCSAgfQotCX0KLQkgICAJCi0gICAgaWYobGF1bmNoZWQpCi0JICBuZXdUZXN0VHlwZXNbdGVzdFR5cGVzLmxlbmd0aCAtIDFdID0gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0JICAJCi0gICAgdGVzdEZhY2lsaXRpZXMgPSBuZXcgU2VsZWN0aW9uTGlzdChuZXdUZXN0VHlwZXMsMCk7CQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUoU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lKQotICB7Ci0gIAl0aGlzLmxhdW5jaGVkU2VydmljZVRlc3ROYW1lID0gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XU0RMRmluaXNoRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dTRExGaW5pc2hGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzBkZDE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dTRExGaW5pc2hGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDQsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFdTRExGaW5pc2hGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudHsKLSAgCi0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XU0RMVGVzdExhdW5jaENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dTRExUZXN0TGF1bmNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmNiMTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dTRExUZXN0TGF1bmNoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA0LCAyMDA0Ci0gKgotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXhlY3V0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV1NETFRlc3RGaW5pc2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMVGVzdExhdW5jaENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIHRlc3RJRDsgCi0gIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHNlcnZpY2VpZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlclByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotICBwcml2YXRlIGJvb2xlYW4gZXh0ZXJuYWxCcm93c2VyOwotICBwcml2YXRlIExpc3QgZW5kcG9pbnRzOwotCQotICBwdWJsaWMgV1NETFRlc3RMYXVuY2hDb21tYW5kKCkKLSAgewotICAJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0JbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsgIAkKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAJSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgPSBudWxsOwotICAJU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQgPSBudWxsOwotICAJV2ViU2VydmljZVRlc3RSZWdpc3RyeSB0ZXN0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gIAlXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbiB3c2N0ZSA9IChXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbil0ZXN0UmVnaXN0cnkuZ2V0V2ViU2VydmljZUV4dGVuc2lvbnNCeU5hbWUodGVzdElEKTsKLSAgICBXZWJTZXJ2aWNlRXhlY3V0YWJsZSB3c2UgPSB3c2N0ZS5nZXRXZWJTZXJ2aWNlRXhlY3V0YWJsZUV4dGVuc2lvbigpOwotICAJV1NETFRlc3RGaW5pc2hDb21tYW5kIGNvbW1hbmQgPSAoV1NETFRlc3RGaW5pc2hDb21tYW5kKXdzZS5nZXRGaW5pc2hDb21tYW5kKCk7Ci0gIAlsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSA9IHdzY3RlLmdldE5hbWUoKTsKLSAgCQotICAgIC8vZ2V0IHRoZSBzZXJ2ZXIgc3R1ZmYKLSAgCWlmIChzZXJ2aWNlaWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSAhPSBudWxsKSAKLSAgICAgIHNlcnZpY2VFeGlzdGluZ1NlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2aWNlaWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0gICAgaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlciAhPSBudWxsKQotICAgICAgc2VydmljZVNlcnZlclR5cGVJRCA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICBlbHNlCi0gICAgICBzZXJ2aWNlU2VydmVyVHlwZUlEID0gc2VydmljZWlkcy5nZXRTZXJ2ZXJJZCgpOwotICAgICAgLy8gc2VydmVyIHdpbGwgYmUgY3JlYXRlZCBpbiBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQKLSAgCQotICAJY29tbWFuZC5zZXRTZXJ2ZXJUeXBlSUQoc2VydmljZVNlcnZlclR5cGVJRCk7Ci0gICAgY29tbWFuZC5zZXRTZXJ2aWNlUHJvamVjdChzZXJ2ZXJQcm9qZWN0KTsKLSAgICBjb21tYW5kLnNldFdzZGxTZXJ2aWNlVVJMKHdzZGxVUkkpOwotICAgIGNvbW1hbmQuc2V0RXh0ZXJuYWxCcm93c2VyKGV4dGVybmFsQnJvd3Nlcik7ICAKLSAgICBjb21tYW5kLnNldEVuZHBvaW50KGVuZHBvaW50cyk7Ci0gICAgc3RhdHVzID0gY29tbWFuZC5leGVjdXRlKGVudik7Ci0gICAgCi0gICAgLy9Eb250IG5lZWQgdG8gc2h1dCBldmVyeXRoaW5nIGRvd24gYmVjYXVzZSB0aGUgd3NkbCB0ZXN0IGRvZXNudCB3b3JrCi0gICAgaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gU3RhdHVzLk9LKXsKLSAgICAgIFN0YXR1c0hhbmRsZXIgc0hhbmRsZXIgPSBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpOwotICAgICAgU3RhdHVzIGluZm9TdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX0xBVU5DSF9XU0RMX1RFU1QiKSwgU3RhdHVzLklORk8pOwotICAgICAgc0hhbmRsZXIucmVwb3J0SW5mbyhpbmZvU3RhdHVzKTsKLSAgICAgIHJldHVybiBpbmZvU3RhdHVzOwkKLSAgICB9Ci0gICByZXR1cm4gc3RhdHVzOwotICAJCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUZXN0SUQoU3RyaW5nIHRlc3RJRCkKLSAgewotICAJdGhpcy50ZXN0SUQgPSB0ZXN0SUQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVkU2VydmljZVRlc3ROYW1lKCkKLSAgewotICAgIHJldHVybiBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsJCi0gIH0KLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAJdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KFN0cmluZyBzZXJ2ZXJQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5zZXJ2ZXJQcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBzZXJ2aWNlaWRzKQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlaWRzID0gc2VydmljZWlkczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVybmFsQnJvd3Nlcihib29sZWFuIGV4dGVybmFsQnJvd3NlcikKLSAgewotICAJdGhpcy5leHRlcm5hbEJyb3dzZXIgPSBleHRlcm5hbEJyb3dzZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50KExpc3QgZW5kcG9pbnRzKQotICB7Ci0gICAgdGhpcy5lbmRwb2ludHMgPSBlbmRwb2ludHM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3NDA3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uQm9vbGVhblNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLQotLyoqCi0qIFRoaXMgdGFzayBzZXRzIHVwIGFsbCB0aGUgZGVmYXVsdHMgZm9yIHRoZSB3ZWJzZXJ2aWNlIHRlc3QKLSogY2xpZW50IHBhZ2UKLSoKLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XRUJfTU9EVUxFX1JPT1QgPSAiV2ViQ29udGVudCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0FNUExFX1dFQl9QUk9KRUNUX0VYVCA9ICJTYW1wbGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NBTVBMRV9FQVJfUFJPSkVDVF9FWFQgPSAiRUFSIjsKLQotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxUYXNrIjsKLSAgcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVmYXVsdCBhY3Rpb25zIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNBTVBMRV9ESVIgPSAic2FtcGxlIjsKLSAgcHVibGljIFN0cmluZyBTRVRfRU5EUE9JTlQgPSAic2V0RW5kUG9pbnQoamF2YS5uZXQuVVJMKSI7Ci0gIHB1YmxpYyBTdHJpbmcgR0VUX0VORFBPSU5UID0gImdldEVuZFBvaW50KCkiOwotCi0gIHByaXZhdGUgU3RyaW5nIFBST1hZID0gIlByb3h5IjsKLQotICBwcml2YXRlIFNjZW5hcmlvQ29udGV4dCBzY2VuYXJpb0NvbnRleHQ7Ci0gCi0gIAotICBwcml2YXRlIFN0cmluZyBjbGllbnRQcm9qZWN0OwotICBwcml2YXRlIElQcm9qZWN0IGNsaWVudElQcm9qZWN0OwotICBwcml2YXRlIFN0cmluZyBjbGllbnRQcm9qZWN0RUFSOwotICBwcml2YXRlIFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSUQ7Ci0gIHByaXZhdGUgSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcjsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHRlc3RSZWdpc3RyeTsKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0IHRlc3RGYWNpbGl0aWVzOwotICBwcml2YXRlIFN0cmluZyBmb2xkZXI7Ci0gIHByaXZhdGUgU3RyaW5nIGpzcEZvbGRlcjsKLSAgcHJpdmF0ZSBCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kczsKLSAgcHJpdmF0ZSBTdHJpbmcgcHJveHlCZWFuOwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHJ1bnRpbWUyQ2xpZW50VHlwZXM7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZUVBUjsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHM7Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uOwotCi0gIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICBwcml2YXRlIGJvb2xlYW4gcnVuQ2xpZW50VGVzdD10cnVlOwotICAKLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxUYXNrIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBsYWJlbCBhbmQgZGVzY3JpcHRpb24uCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kICgpCi0gIHsKLSAgCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLSAgCXNldE5hbWUoTEFCRUwpOwotICAJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0JbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsgIAkKLSAgICAKLSAgICBzY2VuYXJpb0NvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCkuY29weSgpOwotICAJdGVzdFJlZ2lzdHJ5ID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gIAlzYW1wbGVQcm9qZWN0QW5kRWFyU2V0dXAoKTsKLSAgCQotICAgIC8vR2V0IHRoZSBzYW1wbGUgRm9sZGVyIHJlYWR5Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHNiLmFwcGVuZCgiLyIpLmFwcGVuZChzYW1wbGVQcm9qZWN0KS5hcHBlbmQoIi8iKS5hcHBlbmQoREVGQVVMVF9XRUJfTU9EVUxFX1JPT1QpLmFwcGVuZCgiLyIpOwotICAgIGZvbGRlciA9IFNBTVBMRV9ESVIgKyBnZXRCZWFuKCk7IAotICAgICAgICAKLSAgICBzYi5hcHBlbmQoZm9sZGVyKTsKLSAgICBqc3BGb2xkZXIgPSBzYi50b1N0cmluZygpOwotICAgIAotICAgIC8vZ2V0IHRoZSBtZXRob2QgbmFtZXMgcmVhZHkKLSAgICAvL2ZpbmQgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlsZSBpbiB0aGUgcHJvamVjdAotICAgIC8qCi0gICAgKiBHZXR0aW5nIHRoZSBtZXRob2QgbmFtZXMgdXNpbmcgamF2YW1vZiBpbnRyb3NwZWN0aW9uCi0gICAgKi8KLSAgICBpZihwcm94eUJlYW4gPT0gbnVsbCl7Ci0gICAgICBTdGF0dXNIYW5kbGVyIHNIYW5kbGVyID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKTsKLSAgICAgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KVFNfUFJPWFlfTk9UX0NPTVBJTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICBzSGFuZGxlci5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0gICAgICByZXR1cm4gZXJyb3JTdGF0dXM7Ci0gICAgICAKLSAgICB9IAkKLSAgICAKLSAgICAKLSAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YW1vZmNvbW1hbmQgPSBuZXcgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kKCk7IAotICAgIGphdmFtb2Zjb21tYW5kLnNldFByb3h5QmVhbihwcm94eUJlYW4pOwotICAgIGphdmFtb2Zjb21tYW5kLnNldENsaWVudFByb2plY3QoY2xpZW50UHJvamVjdCk7Ci0gICAgCi0gICAgCi0gICAgCi0gICAgdHJ5eyAKLSAgICAgIFN0YXR1cyBtb2ZTdGF0dXMgPSBqYXZhbW9mY29tbWFuZC5leGVjdXRlKGVudik7Ci0gICAgICBpZihtb2ZTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAJcmV0dXJuIG1vZlN0YXR1czsKLSAgICB9Y2F0Y2goRXhjZXB0aW9uIGV4Yyl7Ci0gICAgCVN0YXR1c0hhbmRsZXIgc0hhbmRsZXIgPSBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpOwotICAgICAgICBTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSlRTX1BST1hZX05PVF9DT01QSUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgICBzSGFuZGxlci5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBlcnJvclN0YXR1czsKLSAgICB9ICAKLSAgICBKYXZhSGVscGVycyBqYXZhSGVscGVycyA9IGphdmFtb2Zjb21tYW5kLmdldEphdmFDbGFzcygpOwotICAgIGlmIChqYXZhSGVscGVycyA9PSBudWxsKSByZXR1cm4gc3RhdHVzOwotICAgICAgCi0gICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IG51bGw7IAotICAgIGlmKGphdmFIZWxwZXJzIGluc3RhbmNlb2YgSmF2YUNsYXNzKSAKLSAgICAgamF2YUNsYXNzID0gKEphdmFDbGFzcylqYXZhSGVscGVyczsgCi0gICAgZWxzZSByZXR1cm4gc3RhdHVzOyAKLSAgICBMaXN0IG1ldGhvZExpc3QgPSBqYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kcygpOwotIAlCb29sZWFuU2VsZWN0aW9uW10gdGVtcE1ldGhvZHMgPSBuZXcgQm9vbGVhblNlbGVjdGlvblttZXRob2RMaXN0LnNpemUoKV07Ci0gICAgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvciA9IG1ldGhvZExpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgCi0gICAgaW50IGogPSAwOwotIAl3aGlsZSAobGlzdEl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZClsaXN0SXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgY29udGludWU7Ci0gICAgICBTdHJpbmcgc2lnbmF0dXJlID0gbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKTsKLSAgICAgIAotICAgICAgdGVtcE1ldGhvZHNbal0gPSBuZXcgQm9vbGVhblNlbGVjdGlvbiggbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSwgdHJ1ZSk7ICAgICAgCi0gICAgICBqKys7Ci0gICAgfSAKLSAgICBtZXRob2RzID0gdGVtcE1ldGhvZHM7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotIAotICAvKioKLSAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIHNldHMgdXAgcHJvamVjdCBzdHVmZgotICAqCi0gICovCi0gIHByaXZhdGUgU3RyaW5nIGdldENsaWVudFByb2plY3RGb2xkZXIoKQotICB7Ci0gICAgIAkKLSAgCS8vRmlyc3QgdGhlIGluaXRhbCBwYXJ0IG9mIHRoZSBwYXRoIGlzIHByb2plY3QgcmVsYXRlZAotICAgIFN0cmluZyBqYXZhU291cmNlTG9jYXRpb24gPSAiIjsKLSAgICBpZiAoY2xpZW50UHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICBJUGF0aCBqYXZhU291cmNlUGF0aCA9IFJlc291cmNlVXRpbHMuZ2V0SmF2YVNvdXJjZUxvY2F0aW9uKChJUHJvamVjdCljbGllbnRJUHJvamVjdCk7Ci0gICAgICBpZiAoamF2YVNvdXJjZVBhdGggIT0gbnVsbCkKLSAgICAgIAlqYXZhU291cmNlTG9jYXRpb24gPSBqYXZhU291cmNlUGF0aC50b1N0cmluZygpOwotICAgICAgZWxzZSB7Ci0gICAgICAgIGphdmFTb3VyY2VMb2NhdGlvbiA9ICIvIitjbGllbnRJUHJvamVjdC5nZXROYW1lKCkgKyAiL0phdmEgU291cmNlIjsgIC8vIHRvIGJlIHVwZGF0ZWQgYnkgV2ViIFRvb2xpbmcgQVBJCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBqYXZhU291cmNlTG9jYXRpb247Ci0KLSAgfQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJJRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuV2ViIjsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVKQklEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5FSkIiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBBUFBDTElFTlQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLkFwcENsaWVudCI7Ci0gIAotICAKLSAgcHJpdmF0ZSB2b2lkIHNhbXBsZVByb2plY3RBbmRFYXJTZXR1cCgpCi0gIHsKLSAgCWNsaWVudElQcm9qZWN0ID0gKElQcm9qZWN0KVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKGNsaWVudFByb2plY3QpOwotICAJLy9tb3ZlIHRvIHRoZSB3ZWIgbGV2ZWwKLSAgCVNlbGVjdGlvbkxpc3RDaG9pY2VzIHNsYyA9IHJ1bnRpbWUyQ2xpZW50VHlwZXMuZ2V0Q2hvaWNlKCk7Ci0gIAlTdHJpbmcgcHJvamVjdFR5cGUgPSBzbGMuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAJaWYocHJvamVjdFR5cGUuZXF1YWxzKFdFQklEKSl7Ci0gICAgICBzYW1wbGVQcm9qZWN0ID0gc2xjLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgCX0gIAkKLSAgCWVsc2V7IAotICAJICBzYW1wbGVQcm9qZWN0ID0gKG5ldyBTdHJpbmdCdWZmZXIoY2xpZW50SVByb2plY3QuZ2V0TmFtZSgpKSkuYXBwZW5kKERFRkFVTFRfU0FNUExFX1dFQl9QUk9KRUNUX0VYVCkudG9TdHJpbmcoKTsJCi0gIAl9Ci0gIAlzYW1wbGVFQVIgPSBzbGMuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAJaWYgKHNhbXBsZUVBUiA9PSBudWxsIHx8IHNhbXBsZUVBUi5sZW5ndGgoKT09MCkKLSAgCXsKLSAgCSAgLy9DcmVhdGUgYSBkZWZhdWx0IG5hbWUgaWYgYW4gRUFSIGlzIG5lZWRlZC4KLQkJLy9Vc2UgdGhlIHNlcnZlciB0eXBlCi0JCVN0cmluZyB0YXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFJ1bnRpbWVUYXJnZXRJZEZyb21GYWN0b3J5SWQoY2xpZW50SWRzLmdldFNlcnZlcklkKCkpOwotCQlpZiAodGFyZ2V0SWQhPW51bGwgJiYgdGFyZ2V0SWQubGVuZ3RoKCk+MCkKLQkJewotCQkgIGlmIChTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKHRhcmdldElkLGoyZWVWZXJzaW9uKSkKLQkgIAkgIHsKLQkJICAgIHNhbXBsZUVBUiA9IChuZXcgU3RyaW5nQnVmZmVyKHNhbXBsZVByb2plY3QpKS5hcHBlbmQoREVGQVVMVF9TQU1QTEVfRUFSX1BST0pFQ1RfRVhUKS50b1N0cmluZygpOwotCSAgCSAgfQotCQl9ICAJICAKLSAgCX0KLSAgfQotICAgIAotICAvL2dldHRlcnMgYW5kIHNldHRlcnMKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEJlYW4oKQotICB7Ci0gIAlpbnQgaW5kZXggPSBwcm94eUJlYW4ubGFzdEluZGV4T2YoIi4iKTsKLSAgCVN0cmluZyBlbmQgPSAiIjsKLSAgCWlmKGluZGV4ICE9IC0xKXsKLSAgCSAgZW5kID0gcHJveHlCZWFuLnN1YnN0cmluZyhpbmRleCArIDEpOyAgCQotICAJfQotICAJU3RyaW5nIGJlYW4gPSBlbmQuc3Vic3RyaW5nKDAsZW5kLmxlbmd0aCgpKTsKLSAgICAKLSAgCXJldHVybiBiZWFuOwotICB9Ci0gIAotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0UnVuQ2xpZW50VGVzdCgpCi0gIHsKLSAgCXJldHVybiBydW5DbGllbnRUZXN0OwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEZvbGRlcigpCi0gIHsKLSAgCXJldHVybiBmb2xkZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SnNwRm9sZGVyKCkKLSAgewotICAJcmV0dXJuIGpzcEZvbGRlcjsKLSAgfQotICAKLSAgcHVibGljIEJvb2xlYW5TZWxlY3Rpb25bXSBnZXRNZXRob2RzKCkKLSAgewotICAgIHJldHVybiBtZXRob2RzOyAgCi0gIH0KLSAgICAKLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVQcm9qZWN0RUFSKCkKLSAgewotICAJcmV0dXJuIHNhbXBsZUVBUjsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVQcm9qZWN0KCkKLSAgewotICAJcmV0dXJuIHNhbXBsZVByb2plY3Q7Ci0gIH0KLSAgICAgICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAgIHRoaXMuY2xpZW50UHJvamVjdCA9IGNsaWVudFByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcm94eUJlYW4oKQotICB7Ci0gICAgcmV0dXJuIHByb3h5QmVhbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3RFQVIoU3RyaW5nIGNsaWVudFByb2plY3RFQVIpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3RFQVIgPSBjbGllbnRQcm9qZWN0RUFSOwotICB9CQotICAKLSAgcHVibGljIHZvaWQgc2V0UnVudGltZTJDbGllbnRUeXBlcyggU2VsZWN0aW9uTGlzdENob2ljZXMgc2VsZWN0aW9uTGlzdCApCi0gIHsKLSAgICBydW50aW1lMkNsaWVudFR5cGVzID0gc2VsZWN0aW9uTGlzdDsgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUoU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lKQotICB7Ci0gIAl0aGlzLmxhdW5jaGVkU2VydmljZVRlc3ROYW1lID0gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBjbGllbnRJZHMgVGhlIGNsaWVudElkcyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZHMoVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzKQotICB7Ci0gICAgdGhpcy5jbGllbnRJZHMgPSBjbGllbnRJZHM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgajJlZVZlcnNpb24gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SjJlZVZlcnNpb24oU3RyaW5nIHZlcnNpb24pCi0gIHsKLSAgICBqMmVlVmVyc2lvbiA9IHZlcnNpb247Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV2ViU2VydmljZVRlc3RDbGllbnREZXBhcnR1cmVGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV2ViU2VydmljZVRlc3RDbGllbnREZXBhcnR1cmVGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTVlN2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dlYlNlcnZpY2VUZXN0Q2xpZW50RGVwYXJ0dXJlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUZXN0Q2xpZW50RGVwYXJ0dXJlRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50IAotewotICBwdWJsaWMgV2ViU2VydmljZVRlc3RDbGllbnREZXBhcnR1cmVGcmFnbWVudCgpCi0gIHsKLSAgCWFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEZpbmlzaERlZmF1bHRDb21tYW5kKCksIiIpKTsKLSAgCWFkZChuZXcgRmluaXNoSmF2YVRlc3RGcmFnbWVudCgpKTsKLSAgCWFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQoKSwiIikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFRlc3RDbGllbnREZXBhcnR1cmVJbml0Q29tbWFuZC5jbGFzcywgIkZvcmNlQnVpbGQiLEJ1aWxkUHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MsICJTYW1wbGVTZXJ2ZXJUeXBlSUQiLEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOwotICAJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MsICJTYW1wbGVFeGlzdGluZ1NlcnZlciIsQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyk7Ci0gIAlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcywgIlNhbXBsZVNlcnZlclR5cGVJRCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gIAlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcywgIlNhbXBsZUV4aXN0aW5nU2VydmVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MsICJzYW1wbGVQcm9qZWN0IixCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9FeHBsb3JlclNlcnZpY2VUZXN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvRXhwbG9yZXJTZXJ2aWNlVGVzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjY2QzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9FeHBsb3JlclNlcnZpY2VUZXN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0UHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldTRExUZXN0RmluaXNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5MYXVuY2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5XU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbHVnaW4uRXhwbG9yZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotCi1wdWJsaWMgY2xhc3MgRXhwbG9yZXJTZXJ2aWNlVGVzdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIGltcGxlbWVudHMgV1NETFRlc3RGaW5pc2hDb21tYW5kCi17Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiRXhwbG9yZXJTZXJ2aWNlVGVzdENvbW1hbmQiOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJMYXVuY2ggdGhlIEV4cGxvcmVyIjsKLSAgcHJpdmF0ZSBib29sZWFuIGV4dGVybmFsQnJvd3NlciA9IHRydWU7Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxTZXJ2aWNlVVJMOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEOwotICBwcml2YXRlIElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUHJvamVjdDsKLSAgcHJpdmF0ZSBMaXN0IGVuZHBvaW50czsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgV2ViU2VydmljZUV4cGxvcmVyTGF1bmNoIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBsYWJlbCBhbmQgZGVzY3JpcHRpb24uCi0gICovCi0gIHB1YmxpYyBFeHBsb3JlclNlcnZpY2VUZXN0Q29tbWFuZCAoKQotICB7Ci0gIAlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gIAlzZXROYW1lKExBQkVMKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIAotICAgIFN0YXJ0UHJvamVjdENvbW1hbmQgc3BjID0gbmV3IFN0YXJ0UHJvamVjdENvbW1hbmQoIHRydWUgKTsKLSAgICBzcGMuc2V0U2VydmljZVNlcnZlclR5cGVJRChzZXJ2aWNlU2VydmVyVHlwZUlEKTsKLSAgICBzcGMuc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKHNlcnZpY2VFeGlzdGluZ1NlcnZlcik7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uoc2VydmljZVByb2plY3QpOwotICAgIHNwYy5zZXRTZXJ2aWNlUHJvamVjdChwcm9qZWN0KTsKLSAgICBzcGMuc2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCh0cnVlKTsKLSAgICAKLSAgICBzdGF0dXMgPSBzcGMuZXhlY3V0ZShlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgCXJldHVybiBzdGF0dXM7Ci0KLSAgICBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kIGxhdW5jaENvbW1hbmQgPSBuZXcgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCgpOwotICAgIGxhdW5jaENvbW1hbmQuc2V0Rm9yY2VMYXVuY2hPdXRzaWRlSURFKGV4dGVybmFsQnJvd3Nlcik7Ci0gICAgVmVjdG9yIGxhdW5jaE9wdGlvblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQlTdHJpbmcgc3RhdGVMb2NhdGlvbiA9IEV4cGxvcmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbigpOwotCWxhdW5jaE9wdGlvblZlY3Rvci5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLlNUQVRFX0xPQ0FUSU9OLHN0YXRlTG9jYXRpb24pKTsKLSAgICBsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5XU0RMX1VSTCx3c2RsU2VydmljZVVSTCkpOwotICAgIGlmIChlbmRwb2ludHMgIT0gbnVsbCkKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBlbmRwb2ludHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuV0VCX1NFUlZJQ0VfRU5EUE9JTlQsIGl0Lm5leHQoKS50b1N0cmluZygpKSk7Ci0gICAgbGF1bmNoQ29tbWFuZC5zZXRMYXVuY2hPcHRpb25zKChMYXVuY2hPcHRpb25bXSlsYXVuY2hPcHRpb25WZWN0b3IudG9BcnJheShuZXcgTGF1bmNoT3B0aW9uWzBdKSk7Ci0gICAgc3RhdHVzID0gbGF1bmNoQ29tbWFuZC5leGVjdXRlKGVudik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVybmFsQnJvd3Nlcihib29sZWFuIGV4dGVybmFsQnJvd3NlcikKLSAgewotICAJdGhpcy5leHRlcm5hbEJyb3dzZXIgPSBleHRlcm5hbEJyb3dzZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxTZXJ2aWNlVVJMKFN0cmluZyB3c2RsU2VydmljZVVSTCkKLSAgewotICAJdGhpcy53c2RsU2VydmljZVVSTCA9IHdzZGxTZXJ2aWNlVVJMOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQpCi0gIHsKLSAgCXRoaXMuc2VydmljZVNlcnZlclR5cGVJRCA9IHNlcnZpY2VTZXJ2ZXJUeXBlSUQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKQotICB7Ci0gIAl0aGlzLnNlcnZpY2VFeGlzdGluZ1NlcnZlciA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoU3RyaW5nIHNlcnZpY2VQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlUHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChMaXN0IGVuZHBvaW50cykKLSAgewotICAgIHRoaXMuZW5kcG9pbnRzID0gZW5kcG9pbnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvV2ViU2VydmljZUV4cGxvcmVyRXhlY3V0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvV2ViU2VydmljZUV4cGxvcmVyRXhlY3V0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmIzNWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L2V4cGxvcmVyL1dlYlNlcnZpY2VFeHBsb3JlckV4ZWN1dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXhlY3V0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VGaW5pc2hDb21tYW5kOwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZS1TZXJ2ZXItUnVudGltZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUsIHNlcnZlciwgYW5kIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUV4cGxvcmVyRXhlY3V0YWJsZSBpbXBsZW1lbnRzIFdlYlNlcnZpY2VFeGVjdXRhYmxlCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICAgCi0gIAotICBwdWJsaWMgV2ViU2VydmljZUZpbmlzaENvbW1hbmQgZ2V0RmluaXNoQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEV4cGxvcmVyU2VydmljZVRlc3RDb21tYW5kKCk7Ci0gIH0KLSAgCi19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvV1NTYW1wbGVGaW5pc2hDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9XU1NhbXBsZUZpbmlzaENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiODVlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9XU1NhbXBsZUZpbmlzaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC53c3NhbXBsZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uUHVibGlzaFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5JbnB1dEZpbGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLk1ldGhvZEZpbGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLlJlc3VsdEZpbGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLlRlc3RDbGllbnRGaWxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbWFuZC5HZW5lcmF0ZVBhZ2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbWFuZC5KYXZhVG9Nb2RlbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5Db3B5V2ViU2VydmljZVV0aWxzSmFyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuSmF2YVByb3h5VGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LndlYmJyb3dzZXIuV2ViQnJvd3NlcjsKLQotcHVibGljIGNsYXNzIFdTU2FtcGxlRmluaXNoQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgaW1wbGVtZW50cyBKYXZhUHJveHlUZXN0Q29tbWFuZAotewotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOUFVUICAgICAgID0gIklucHV0LmpzcCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRFU1RfQ0xJRU5UID0gIlRlc3RDbGllbnQuanNwIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVTVUxUICAgICAgPSAiUmVzdWx0LmpzcCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FVEhPRCAgICAgID0gIk1ldGhvZC5qc3AiOwotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBMQUJFTCA9ICJKYXZhQmVhblRvU2FtcGxlQWN0aXZlVGFzayI7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICJkZWZhdWx0IGFjdGlvbnMiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLSAgCi0gIHByaXZhdGUgTW9kZWwgcHJveHlNb2RlbDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEOwotICBwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIAotICAKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgcW5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIGpzcEZvbGRlcjsKLSAgcHJpdmF0ZSBib29sZWFuIHJ1bkNsaWVudFRlc3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3Q7Ci0gIHByaXZhdGUgQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHByb3h5QmVhbjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIHByaXZhdGUgTGlzdCBlbmRwb2ludHM7Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IEphdmFCZWFuVG9TYW1wbGVBY3RpdmVUYXNrIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBsYWJlbCBhbmQgZGVzY3JpcHRpb24uCi0gICovCi0gIHB1YmxpYyBXU1NhbXBsZUZpbmlzaENvbW1hbmQgKCkKLSAgewotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotCW1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0Jc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotCXNldE5hbWUoTEFCRUwpOyAgCQotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gICAgLy9zZXR0ZXJzIGFuZCBnZXR0ZXJzIHRvIGJlIHJlbW92ZWQKLSAgCUNvcHlXZWJTZXJ2aWNlVXRpbHNKYXJDb21tYW5kIGNvcHkgPSBuZXcgQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQoKTsgICAgCi0gIAljb3B5LnNldFNhbXBsZVByb2plY3Qoc2FtcGxlUHJvamVjdCk7Ci0gIAlzdGF0dXMgPSBjb3B5LmV4ZWN1dGUoZW52KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHN0YXR1cyA9IGNyZWF0ZU1vZGVsKGVudik7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBzdGF0dXMgPSBnZW5lcmF0ZVBhZ2VzKGVudik7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICAvL2lmICghaXNTdWNjZXNzZnVsKCkpIHJldHVybjsKLSAgICBzdGF0dXMgPSBsYXVuY2hTYW1wbGUoZW52KTsKLSAgICByZXR1cm4gc3RhdHVzOyAgIAotICB9Ci0KLSAgIAotICAvKioKLSAgKiBHZW5lcmF0ZSB0aGUgZm91ciBqc3BzIHRoYXQgbWFrZSB1cCB0aGlzCi0gICogc2FtcGxlIGFwcC4KLSAgKi8KLSAgcHJvdGVjdGVkIFN0YXR1cyBnZW5lcmF0ZVBhZ2VzKEVudmlyb25tZW50IGVudikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gICAgSVBhdGggZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCA9IG5ldyBQYXRoKGpzcEZvbGRlcik7Ci0gICAgZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGgubWFrZUFic29sdXRlKCk7ICAgIAotICAgIElXb3Jrc3BhY2VSb290IGZXb3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0gICAgSVBhdGggcGF0aFRlc3QgPSBmRGVzdGluYXRpb25Gb2xkZXJQYXRoLmFwcGVuZChURVNUX0NMSUVOVCk7Ci0gICAgSUZpbGUgZmlsZVRlc3QgPSBmV29ya3NwYWNlLmdldEZpbGUocGF0aFRlc3QpOwotICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjVGVzdCA9IG5ldyBHZW5lcmF0ZVBhZ2VDb21tYW5kKEVudmlyb25tZW50VXRpbHMuZ2V0UmVzb3VyY2VDb250ZXh0KGVudiksIHByb3h5TW9kZWwsCi0gICAgICBuZXcgVGVzdENsaWVudEZpbGVHZW5lcmF0b3IoSU5QVVQsTUVUSE9ELFJFU1VMVCksZmlsZVRlc3QpOwotICAgIC8vZ3BjVGVzdC5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgc3RhdHVzID0gZ3BjVGVzdC5leGVjdXRlKGVudik7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgCi0KLSAgICAvL2lucHV0IGNvZGVnZW4KLSAgICBJUGF0aCBwYXRoSW5wdXQgPSBmRGVzdGluYXRpb25Gb2xkZXJQYXRoLmFwcGVuZChJTlBVVCk7Ci0gICAgSUZpbGUgZmlsZUlucHV0ID0gZldvcmtzcGFjZS5nZXRGaWxlKHBhdGhJbnB1dCk7Ci0gICAgSW5wdXRGaWxlR2VuZXJhdG9yIGlucHV0R2VuZXJhdG9yID0gbmV3IElucHV0RmlsZUdlbmVyYXRvcihSRVNVTFQpOwotICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjSW5wdXQgPSBuZXcgR2VuZXJhdGVQYWdlQ29tbWFuZChFbnZpcm9ubWVudFV0aWxzLmdldFJlc291cmNlQ29udGV4dChlbnYpLCBwcm94eU1vZGVsLAotICAgICAgaW5wdXRHZW5lcmF0b3IsZmlsZUlucHV0KTsKLSAgICAvL2dwY0lucHV0LnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICBzdGF0dXMgPSBncGNJbnB1dC5leGVjdXRlKGVudik7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgCXJldHVybiBzdGF0dXM7Ci0KLSAgICAvL21ldGhvZCBjb2RlZ2VuCi0gICAgSVBhdGggcGF0aE1ldGhvZCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGguYXBwZW5kKE1FVEhPRCk7Ci0gICAgSUZpbGUgZmlsZU1ldGhvZCA9IGZXb3Jrc3BhY2UuZ2V0RmlsZShwYXRoTWV0aG9kKTsKLSAgICBNZXRob2RGaWxlR2VuZXJhdG9yIG1ldGhvZEdlbmVyYXRvciA9IG5ldyBNZXRob2RGaWxlR2VuZXJhdG9yKElOUFVUKTsKLSAgICBtZXRob2RHZW5lcmF0b3Iuc2V0Q2xpZW50Rm9sZGVyUGF0aChqc3BGb2xkZXIpOwotICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjTWV0aG9kID0gbmV3IEdlbmVyYXRlUGFnZUNvbW1hbmQoRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KSwgcHJveHlNb2RlbCwKLSAgICAgIG1ldGhvZEdlbmVyYXRvcixmaWxlTWV0aG9kKTsKLSAgICAvL2dwY01ldGhvZC5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgc3RhdHVzID0gZ3BjTWV0aG9kLmV4ZWN1dGUoZW52KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgICAJcmV0dXJuIHN0YXR1czsgICAgCi0KLQotICAgIC8vcmVzdWx0IGNvZGVnZW4KLSAgICBJUGF0aCBwYXRoUmVzdWx0ID0gZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5hcHBlbmQoUkVTVUxUKTsKLSAgICBJRmlsZSBmaWxlUmVzdWx0ID0gZldvcmtzcGFjZS5nZXRGaWxlKHBhdGhSZXN1bHQpOwotICAgIFJlc3VsdEZpbGVHZW5lcmF0b3IgcmZnID0gbmV3IFJlc3VsdEZpbGVHZW5lcmF0b3IoKTsKLSAgICByZmcuc2V0Q2xpZW50Rm9sZGVyUGF0aChqc3BGb2xkZXIpOwotICAgIHJmZy5zZXRTZXRFbmRwb2ludE1ldGhvZChzZXRFbmRwb2ludE1ldGhvZCk7Ci0gICAgR2VuZXJhdGVQYWdlQ29tbWFuZCBncGNSZXN1bHQgPSBuZXcgR2VuZXJhdGVQYWdlQ29tbWFuZChFbnZpcm9ubWVudFV0aWxzLmdldFJlc291cmNlQ29udGV4dChlbnYpLCBwcm94eU1vZGVsLAotICAgICAgcmZnLGZpbGVSZXN1bHQpOwotICAgIC8vZ3BjUmVzdWx0LnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICBzdGF0dXMgPSBncGNSZXN1bHQuZXhlY3V0ZShlbnYpOwotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBTdGF0dXMgbGF1bmNoU2FtcGxlIChFbnZpcm9ubWVudCBlbnYpIHsKLQotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gICAgaWYgKCFydW5DbGllbnRUZXN0KSByZXR1cm4gc3RhdHVzOwotICAgIAotCi0gICAgSVBhdGggZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCA9IG5ldyBQYXRoKGpzcEZvbGRlcik7Ci0gICAgZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGgubWFrZUFic29sdXRlKCk7ICAgIAotCi0gICAgUHVibGlzaFByb2plY3RDb21tYW5kIHBwYyA9IG5ldyBQdWJsaXNoUHJvamVjdENvbW1hbmQoKTsKLSAgICBwcGMuc2V0U2VydmVyVHlwZUlEKHNhbXBsZVNlcnZlclR5cGVJRCk7Ci0gICAgcHBjLnNldEV4aXN0aW5nU2VydmVyKHNhbXBsZUV4aXN0aW5nU2VydmVyKTsKLSAgICBwcGMuc2V0UHJvamVjdChzYW1wbGVQcm9qZWN0KTsKLSAgICBzdGF0dXMgPSBwcGMuZXhlY3V0ZShlbnYpOwotCi0gICAgU3RhcnRQcm9qZWN0Q29tbWFuZCBzcGMgPSBuZXcgU3RhcnRQcm9qZWN0Q29tbWFuZChmYWxzZSApOwotICAgIHNwYy5zZXRTZXJ2aWNlU2VydmVyVHlwZUlEKHNhbXBsZVNlcnZlclR5cGVJRCk7Ci0gICAgc3BjLnNldFNhbXBsZUV4aXN0aW5nU2VydmVyKHNhbXBsZUV4aXN0aW5nU2VydmVyKTsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShzYW1wbGVQcm9qZWN0KTsKLSAgICBzcGMuc2V0U2FtcGxlUHJvamVjdChwcm9qZWN0KTsKLSAgICBzcGMuc2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCh0cnVlKTsKLSAgICAKLSAgICBzdGF0dXMgPSBzcGMuZXhlY3V0ZShlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgCi0gICAgSVBhdGggbmV3UGF0aCA9IG5ldyBQYXRoKFJlc291cmNlVXRpbHMuZ2V0V2ViUHJvamVjdFVSTChSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihmRGVzdGluYXRpb25Gb2xkZXJQYXRoKSxzYW1wbGVTZXJ2ZXJUeXBlSUQsc2FtcGxlRXhpc3RpbmdTZXJ2ZXIpKTsKLSAgICBuZXdQYXRoID0gbmV3UGF0aC5hcHBlbmQoZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDIpLm1ha2VBYnNvbHV0ZSgpKTsKLSAgICBTdHJpbmdCdWZmZXIgdXJsU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcihuZXdQYXRoLmFwcGVuZChURVNUX0NMSUVOVCkudG9TdHJpbmcoKSk7Ci0gICAgaWYgKGVuZHBvaW50cyAhPSBudWxsICYmICFlbmRwb2ludHMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHVybFN0cmluZy5hcHBlbmQoIj9lbmRwb2ludD0iKTsKLSAgICAgIHVybFN0cmluZy5hcHBlbmQoZW5kcG9pbnRzLmdldCgwKS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgdHJ5ewotICAgICAgVVJMIHVybDsKLSAgICAgIHVybCA9IG5ldyBVUkwodXJsU3RyaW5nLnRvU3RyaW5nKCkpOwotICAgICAgaW50IHN0eWxlID0gV2ViQnJvd3Nlci5MT0NBVElPTl9CQVIgfCBXZWJCcm93c2VyLkJVVFRPTl9CQVI7ICAKLQotICAgICAgZm9yKCBpbnQgcmV0cmllcyA9IDA7IHJldHJpZXMgPCAxMDsgcmV0cmllcysrICkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBUZXN0IHRoZSBVUkxzCi0gICAgICAgICAgKG5ldyBVUkwobmV3UGF0aC5hcHBlbmQoUkVTVUxUKS50b1N0cmluZygpKSkub3BlblN0cmVhbSgpOwotICAgICAgICAgIChuZXcgVVJMKG5ld1BhdGguYXBwZW5kKE1FVEhPRCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAobmV3IFVSTChuZXdQYXRoLmFwcGVuZChJTlBVVCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAobmV3IFVSTChuZXdQYXRoLmFwcGVuZChURVNUX0NMSUVOVCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAvLyBMb29rcyBnb29kLCBleGl0IGxvb3AKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gaW9lICkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7fSAJICAJICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIFdlYkJyb3dzZXIub3BlblVSTCh1cmwsc3R5bGUsbnVsbCk7Ci0gICAgICByZXR1cm4gc3RhdHVzOyAgCi0gICAgfWNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMpewotICAgIAllbnYuZ2V0TG9nKCkubG9nKExvZy5XQVJOSU5HLCA1MDQ4LCB0aGlzLCAibGF1bmNoU2FtcGxlIiwgZXhjKTsKLQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggImxhdW5jaFNhbXBsZSIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NQUxGT1JNRURfVVJMIiksIFN0YXR1cy5XQVJOSU5HICk7Ci0JCXRyeSB7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwotCQl9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggImxhdW5jaFNhbXBsZSIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NQUxGT1JNRURfVVJMIiksIFN0YXR1cy5FUlJPUiApOwotCQl9Ci0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci0KLSAgCi0KLSAgcHJvdGVjdGVkIFN0YXR1cyBjcmVhdGVNb2RlbChFbnZpcm9ubWVudCBlbnYpIHsKLQotICAJLy9jcmVhdGUgdGhlIG1vZGVsIGZyb20gdGhlIHJlc291cmNlCi0gICAgSmF2YVRvTW9kZWxDb21tYW5kIGp0bWMgPSBuZXcgSmF2YVRvTW9kZWxDb21tYW5kKCk7Ci0gICAganRtYy5zZXRNZXRob2RzKG1ldGhvZHMpOwotICAgIGp0bWMuc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0KTsKLSAgICBqdG1jLnNldFByb3h5QmVhbihwcm94eUJlYW4pOwotICAgIC8vanRtYy5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IGp0bWMuZXhlY3V0ZShlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0KLSAgICBwcm94eU1vZGVsID0ganRtYy5nZXREYXRhTW9kZWwoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmVyVHlwZUlEKFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSUQpCi0gIHsKLSAgCXRoaXMuc2FtcGxlU2VydmVyVHlwZUlEID0gc2FtcGxlU2VydmVyVHlwZUlEOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyKQotICB7Ci0gIAl0aGlzLnNhbXBsZUV4aXN0aW5nU2VydmVyID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEpzcEZvbGRlcihTdHJpbmcganNwRm9sZGVyKQotICB7Ci0gICAgdGhpcy5qc3BGb2xkZXIgPSBqc3BGb2xkZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJ1bkNsaWVudFRlc3QoYm9vbGVhbiBydW5DbGllbnRUZXN0KQotICB7Ci0gIAl0aGlzLnJ1bkNsaWVudFRlc3QgPSBydW5DbGllbnRUZXN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0KFN0cmluZyBzYW1wbGVQcm9qZWN0KQotICB7Ci0gIAl0aGlzLnNhbXBsZVByb2plY3QgPSBzYW1wbGVQcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAJdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcykKLSAgewotICAJdGhpcy5tZXRob2RzID0gbWV0aG9kczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2V0RW5kcG9pbnRNZXRob2QgVGhlIHNldEVuZHBvaW50TWV0aG9kIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldEVuZHBvaW50TWV0aG9kKFN0cmluZyBzZXRFbmRwb2ludE1ldGhvZCkKLSAgewotICAgIHRoaXMuc2V0RW5kcG9pbnRNZXRob2QgPSBzZXRFbmRwb2ludE1ldGhvZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoTGlzdCBlbmRwb2ludHMpCi0gIHsKLSAgICB0aGlzLmVuZHBvaW50cyA9IGVuZHBvaW50czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWMzNDAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L3dzc2FtcGxlL1dlYlNlcnZpY2VXU1NhbXBsZUV4ZWN1dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0Lndzc2FtcGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXhlY3V0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VGaW5pc2hDb21tYW5kOwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZS1TZXJ2ZXItUnVudGltZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUsIHNlcnZlciwgYW5kIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZSBpbXBsZW1lbnRzIFdlYlNlcnZpY2VFeGVjdXRhYmxlCi17Ci0gICAKLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRmluaXNoQ29tbWFuZCBnZXRGaW5pc2hDb21tYW5kKCkKLSAgewotICAJcmV0dXJuIG5ldyBXU1NhbXBsZUZpbmlzaENvbW1hbmQoKTsKLSAgfQotICAgIAotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL0NsaWVudFByb2plY3RUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL0NsaWVudFByb2plY3RUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyOThmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9DbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5Ci17Ci0gIHByaXZhdGUgc3RhdGljIENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzXzsKLQotICBwcml2YXRlIENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkoKQotICB7Ci0gICAgaW5pdCgpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpCi0gICAgICBpbnN0YW5jZV8gPSBuZXcgQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeSgpOwotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KCkKLSAgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIGNvbmZpZ0VsZW1lbnRzXyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsICJjbGllbnRQcm9qZWN0VHlwZSIpOwotICB9Ci0KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXREZWZhdWx0RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudEJ5SWQoIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5XZWIiKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudEJ5SWQoU3RyaW5nIGlkKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRCeUF0dHJpYnV0ZSgiaWQiLCBpZCk7Ci0gIH0KLQotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEVsZW1lbnRCeUxhYmVsKFN0cmluZyBsYWJlbCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50QnlBdHRyaWJ1dGUoImxhYmVsIiwgbGFiZWwpOwotICB9Ci0KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50QnlQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzXy5sZW5ndGg7IGkrKykKLSAgICAgIGlmIChpbmNsdWRlKHByb2plY3QsIGNvbmZpZ0VsZW1lbnRzX1tpXS5nZXRBdHRyaWJ1dGUoImluY2x1ZGUiKSkgJiYgZXhjbHVkZShwcm9qZWN0LCBjb25maWdFbGVtZW50c19baV0uZ2V0QXR0cmlidXRlKCJleGNsdWRlIikpKQotICAgICAgICByZXR1cm4gY29uZmlnRWxlbWVudHNfW2ldOwotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudEJ5QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzXy5sZW5ndGg7IGkrKykKLSAgICAgIGlmIChjb25maWdFbGVtZW50c19baV0uZ2V0QXR0cmlidXRlKG5hbWUpLmVxdWFscyh2YWx1ZSkpCi0gICAgICAgIHJldHVybiBjb25maWdFbGVtZW50c19baV07Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSVByb2plY3RbXSBnZXRQcm9qZWN0cyhTdHJpbmcgaWQpCi0gIHsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnRCeUlkKGlkKTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIElQcm9qZWN0W10gd29ya3NwYWNlUHJvanMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmtzcGFjZVByb2pzLmxlbmd0aDsgaSsrKSB7Ci0JCS8vIFRPRE86IE5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgdG8gd29yayB3aXRoIHByb2plY3QvbW9kdWxlIHRvcG9sb2d5IGRlc2NyaWJlZCBpbiBYUAotICAgICAgICAvL2lmIChpbmNsdWRlKHdvcmtzcGFjZVByb2pzW2ldLCBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaW5jbHVkZSIpKSAmJiBleGNsdWRlKHdvcmtzcGFjZVByb2pzW2ldLCBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZXhjbHVkZSIpKSkKLQkJaWYgKFJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHdvcmtzcGFjZVByb2pzW2ldKSB8fCBSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdCh3b3Jrc3BhY2VQcm9qc1tpXSkpCi0JCXsKLSAgICAgICAgICB2LmFkZCh3b3Jrc3BhY2VQcm9qc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFt2LnNpemUoKV07Ci0gICAgdi5jb3B5SW50byhwcm9qZWN0cyk7Ci0gICAgcmV0dXJuIHByb2plY3RzOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGluY2x1ZGUpCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluY2x1ZGUpOwotICAgIHdoaWxlKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByb2plY3QuaGFzTmF0dXJlKHN0Lm5leHRUb2tlbigpKSkKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZXhjbHVkZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZXhjbHVkZSkKLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZXhjbHVkZSk7Ci0gICAgd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAocHJvamVjdC5oYXNOYXR1cmUoc3QubmV4dFRva2VuKCkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvSVdlYlNlcnZpY2VSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9JV2ViU2VydmljZVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjN2Q5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9JV2ViU2VydmljZVJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBhIGtpbmQgb2YKLSogV2ViIFNlcnZpY2UgYXJ0aWZhY3QuIAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2VSdW50aW1lCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKiBAcmV0dXJuIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBMYWJlbCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuCi0gICogQHJldHVybiBBIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgTGFiZWwgb2YgdGhpcyBXZWIgU2VydmljZSBydW50aW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExhYmVsICgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBTdHJpbmcsIEoyRUUgdmVyc2lvbgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0SjJFRVZlcnNpb25zKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGgKLSAgICogdGhpcyBydW50aW1lLgotICAgKiAKLSAgICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ci0gICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvSVdlYlNlcnZpY2VTZXJ2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL0lXZWJTZXJ2aWNlU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MGQ5NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvSVdlYlNlcnZpY2VTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBhIGtpbmQgb2YKLSogV2ViIFNlcnZpY2UgYXJ0aWZhY3QuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgYSBXZWJTZXJ2aWNlVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUuCi0qLwotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZVNlcnZlcgotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBpZCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQgKCk7Ci0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlJZCAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIEEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCAoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgc2V0IHRydWUgaW4gcGx1Z2luLnhtbAotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldElzRGVmYXVsdCgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgcnVudGltZSB0YXJnZXQgSWQKLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZVR5cGVJZCgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGgKLSAgICogdGhpcyBydW50aW1lLgotICAgKiAKLSAgICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ci0gICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL0lXZWJTZXJ2aWNlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvSVdlYlNlcnZpY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNDk2OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvSVdlYlNlcnZpY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgYSBraW5kIG9mCi0qIFdlYiBTZXJ2aWNlIGFydGlmYWN0LiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIGEgV2ViU2VydmljZVR5cGUKLSogb2JqZWN0IGlzIHRvIG1hbnVmYWN0dXJlIHRoZSB3aXphcmQgcGFnZXMgdGhhdCBzdXBwb3J0IHRoZSB0eXBlLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2VUeXBlCi17Ci0gIC8qKgotICAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCAoKTsKLSAgLyoqCi0gICogUmV0dXJucyBhIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBBIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyBleHRlbnNpb24gbWV0YWRhdGEuCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyBleHRlbnNpb24gbWV0YWRhdGEuCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRFeHRlbnNpb25NZXRhZGF0YSAoKTsKLSAgCi0gIC8qKgotICAqIFJldHVybnMgYSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlJ3MgcmVzb3VyY2UgbWV0YWRhdGEuCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyByZXNvdXJjZSBtZXRhZGF0YS4KLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlVHlwZU1ldGFkYXRhICgpOyAgCi0gIAotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBsdWdpbi54bWwgY29udGFpbnMgYW4gYXR0cmlidXRlIG9mICJjYW5GaW5pc2giIHdpdGggYSB2YWx1ZSBvZiB0cnVlLiAgT3RoZXJ3aXNlLCAKLSAgKiBmYWxzZSBpcyByZXR1cm5lZC4gIE5vdGU6IGlmIHRoZSAiY2FuRmluaXNoIiBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCB0cnVlIGlzIHJldHVybmVkIGJ5IGRlZmF1bHQuCi0gICogQHJldHVybiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIGNhbiBmaW5pc2ggb24gdGhlIHBhZ2VzIGJlZm9yZSB0aGUgd2ViIHNlcnZpY2UgdHlwZSBwYWdlcy4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuRmluaXNoKCk7ICAKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aAotICAgKiB0aGlzIHJ1bnRpbWUuCi0gICAqIAotICAgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLQotICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdFNlbGVjdGlvbldpZGdldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTliNzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkudWRkaS5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeQotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHJpdmF0ZSBzdGF0aWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSBpbnN0YW5jZV87Ci0KLSAgcHJpdmF0ZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5KCkgewotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICBwdWJsaWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKSB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpdmF0ZVVERElSZWdpc3RyeVR5cGUiKTsKLQotICAgIHRyeSB7Ci0gICAgICBPYmplY3QgY29uZmlnRWxlbWVudCA9ICgoY29uZmlnLmxlbmd0aCA+IDApID8gY29uZmlnWzBdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIikgOiBudWxsKTsKLSAgICAgIGlmKGNvbmZpZ0VsZW1lbnQgIT0gbnVsbCAmJiBjb25maWdFbGVtZW50IGluc3RhbmNlb2YgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUpIAotICAgICAgICByZXR1cm4gKFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKWNvbmZpZ0VsZW1lbnQ7IAotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9QdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1B1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDI4NzMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1B1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5VHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IGluc3RhbmNlXzsKLSAgcHJpdmF0ZSBWZWN0b3IgdHlwZXNfOwotICBwcml2YXRlIFZlY3RvciBjb25maWdFbGVtZW50c187Ci0KLSAgcHJpdmF0ZSBQdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkoKSB7Ci0gICAgdHlwZXNfID0gbmV3IFZlY3RvcigpOwotICAgIGNvbmZpZ0VsZW1lbnRzXyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIGluaXQoKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgKiBAcmV0dXJuIEEgc2luZ2xldG9uIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIFB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoKSB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVibGljVURESVJlZ2lzdHJ5VHlwZSIpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcubGVuZ3RoOyBpKyspIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIE9iamVjdCBjb25maWdFbGVtZW50ID0gY29uZmlnW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0KLSAgICAgICAgaWYoIGNvbmZpZ0VsZW1lbnQgaW5zdGFuY2VvZiBQdWJsaWNVRERJUmVnaXN0cnlUeXBlKSAgewotICAgICAgICAgIHR5cGVzXy5hZGQoY29uZmlnRWxlbWVudCk7Ci0gICAgICAgICAgY29uZmlnRWxlbWVudHNfLmFkZChjb25maWdbaV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7fQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlW10gZ2V0QWxsUHVibGljVURESVJlZ2lzdHJ5VHlwZXMoKSB7Ci0gICAgUHVibGljVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzID0gbmV3IFB1YmxpY1VERElSZWdpc3RyeVR5cGVbdHlwZXNfLnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIHR5cGVzW2ldID0gKFB1YmxpY1VERElSZWdpc3RyeVR5cGUpdHlwZXNfLmVsZW1lbnRBdChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0KLSAgcHVibGljIFB1YmxpY1VERElSZWdpc3RyeVR5cGUgZ2V0UHVibGljVURESVJlZ2lzdHJ5VHlwZUJ5SUQoU3RyaW5nIGlkKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdFbGVtZW50c18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjID0gKElDb25maWd1cmF0aW9uRWxlbWVudCljb25maWdFbGVtZW50c18uZWxlbWVudEF0KGkpOwotICAgICAgaWYgKGMuZ2V0QXR0cmlidXRlKCJpZCIpLmVxdWFscyhpZCkpCi0gICAgICAgIHJldHVybiAoUHVibGljVURESVJlZ2lzdHJ5VHlwZSl0eXBlc18uZWxlbWVudEF0KGkpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljVURESVJlZ2lzdHJ5VHlwZUlEQnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIFB1YmxpY1VERElSZWdpc3RyeVR5cGUgdHlwZSA9IChQdWJsaWNVRERJUmVnaXN0cnlUeXBlKXR5cGVzXy5lbGVtZW50QXQoaSk7Ci0gICAgICBpZiAodHlwZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotICAgICAgICByZXR1cm4gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpY29uZmlnRWxlbWVudHNfLmVsZW1lbnRBdChpKSkuZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9SdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9SdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMjM1ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5zZXJ2ZXJ0YXJnZXQuSVNlcnZlclRhcmdldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlUnVudGltZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLQotcHVibGljIGNsYXNzIFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLSAgcHJpdmF0ZSBTaGVsbCB0aGlzU2hlbGw7Ci0gIHByaXZhdGUgR3JvdXAgdmlld1NlbGVjdGlvbkdyb3VwXzsKLSAgcHJpdmF0ZSBUZXh0IG1lc3NhZ2VCYW5uZXJfOwotICBwcml2YXRlIENvbXBvc2l0ZSBwcmltYXJ5R3JvdXBfOwotICBwcml2YXRlIEdyb3VwIHJ1bnRpbWVzR3JvdXBfOwotICBwcml2YXRlIEdyb3VwIHNlcnZlcnNHcm91cF87Ci0gIHByaXZhdGUgVHJlZSBydW50aW1lc0xpc3RfOwotICBwcml2YXRlIFRyZWUgc2VydmVyTGlzdF87Ci0gIHByaXZhdGUgQnV0dG9uIHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiB2aWV3U2VsZWN0aW9uQnlTZXJ2ZXJCdXR0b25fOwotICBwcml2YXRlIEJ1dHRvbiB2aWV3U2VsZWN0aW9uQnlFeHBsb3JlQnV0dG9uXzsKLSAgcHJpdmF0ZSBDb21ibyBqMmVlVmVyc2lvbkNvbWJvOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDAxIGZvciB0aGUgc2VsZWN0aW9uIG9mIHJ1bnRpbWUsIHNlcnZlciBhbmQgcHJvamVjdCBjb21iaW5hdGlvbgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0RJQUxPRyA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1JTMDAwMSI7Ci0gIC8qIENPTlRFWFRfSUQgUFdSUzAwMDIgZm9yIHRoZSBydW50aW1lIHNlbGVjdGlvbiBvbiBpbiB0aGUgZGFpbG9nICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19MSVNUX1JVTlRJTUVTID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLlBXUlMwMDAyIjsKLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAwMyBmb3IgdGhlIHNlcnZlciBzZWxlY3Rpb24gaW4gdGhlIGRpYWxvZyAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfTElTVF9TRVJWRVJTID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLlBXUlMwMDAzIjsKLSAgLyoKLSAgICogQ09OVEVYVF9JRCBQV1JTMDAwNCBmb3IgdGhlIEVKQiBQcm9qZWN0IGNvbWJvIGJveCBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gZGlhbG9nCi0gICAqLwotICAvLyAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0VKQl9QUk9KRUNUID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQKLSAgLy8gKyAiLlBXUlMwMDA0IjsKLSAgLyoKLSAgICogQ09OVEVYVF9JRCBQV1JTMDAwNSBmb3IgdGhlIHJ1bnRpbWUgdmlldyByYWRpbyBidXR0b24gb2YgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIGRpYWxvZwotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX1JBRElPX1JVTlRJTUUgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdSUzAwMDUiOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDA2IGZvciB0aGUgc2VydmVyIHZpZXcgcmFkaW8gYnV0dG9uIG9mIHRoZSBydW50aW1lIHNlbGVjdGlvbiBkaWFsb2cKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19SQURJT19TRVJWRVIgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdSUzAwMDYiOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDA3IGZvciB0aGUgZXhwbG9yZSB2aWV3IHJhZGlvIGJ1dHRvbiBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gZGlhbG9nCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfUkFESU9fRVhQTE9SRSA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1JTMDAwNyI7Ci0gIC8qCi0gICAqIENPTlRFWFRfSUQgUFdSUzAwMDggZm9yIHRoZSBXZWIgUHJvamVjdCBjb21ibyBib3ggb2YgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIGRpYWxvZwotICAgKi8KLSAgLy8gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19DT01CT19QUk9KRUNUID0KLSAgLy8gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLlBXUlMwMDA4IjsKLSAgLyoKLSAgICogQ09OVEVYVF9JRCBQV1JTMDAwOSBmb3IgdGhlIEoyRUUgdmVyc2lvbiBjb21ibyBib3ggb2YgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIGRpYWxvZwotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0oyRUVfVkVSU0lPTiA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1JTMDAwOSI7Ci0KLSAgLy8gcnNrcmVnCi0gIC8vcHJpdmF0ZSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZ2lzdHJ5OwotICAvL3ByaXZhdGUgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSB3c2N0UmVnaXN0cnk7Ci0gIC8vIHJza3JlZwotICBwcml2YXRlIEhhc2h0YWJsZSBzZXJ2ZXJMYWJlbHNfOwotICBwcml2YXRlIEhhc2h0YWJsZSBleGlzdGluZ1NlcnZlcnNUYWJsZV87Ci0gIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJfOwotICBwcml2YXRlIFN0cmluZyBkZWZhdWx0UnVudGltZV87Ci0gIHByaXZhdGUgU3RyaW5nIHR5cGVJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFR5cGVJZF87Ci0gIC8vIHJza3JlZwotICAvL3ByaXZhdGUgSVdlYlNlcnZpY2VSdW50aW1lIHNlbGVjdGVkUnVudGltZV87Ci0gIHByaXZhdGUgV2ViU2VydmljZVJ1bnRpbWVJbmZvIHNlbGVjdGVkUnVudGltZV87Ci0gIC8vIHJza3JlZwotICBwcml2YXRlIElTZXJ2ZXIgc2VsZWN0ZWRTZXJ2ZXJfOwotICBwcml2YXRlIFN0cmluZyBzZWxlY3RlZFNlcnZlckxhYmVsXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfOwotICBwcml2YXRlIGJvb2xlYW4gaXNFeGlzdGluZ1NlcnZlcl87Ci0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZU9uXyA9IGZhbHNlOwotICBwcml2YXRlIGJ5dGUgc2VsZWN0aW9uTW9kZV87Ci0gIHByaXZhdGUgZmluYWwgYnl0ZSBNT0RFX1NFUlZJQ0UgPSAoYnl0ZSkgMDsKLSAgcHJpdmF0ZSBmaW5hbCBieXRlIE1PREVfQ0xJRU5UID0gKGJ5dGUpIDE7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFNFUlZFUl9UWVBFU19JQ09OID0gImljb25zL3NlcnZlcnMvc2VydmVyc19vYmouZ2lmIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRVhJU1RJTkdfU0VSVkVSU19JQ09OID0gImljb25zL3NlcnZlcnMvZXhpc3Rpbmdfc2VydmVyX29iai5naWYiOwotICBwcml2YXRlIFN0cmluZyBqMmVlVmVyc2lvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVySW5zdGFuY2VJRF87Ci0KLSAgcHVibGljIFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2coU2hlbGwgc2hlbGwsIGJ5dGUgbW9kZSwgVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzLCBTdHJpbmcgajJlZVZlcnNpb24pIHsKLSAgICBzdXBlcihzaGVsbCk7Ci0gICAgc2VsZWN0aW9uTW9kZV8gPSBtb2RlOwotICAgIHR5cGVJZF8gPSBpZHMuZ2V0VHlwZUlkKCk7Ci0gICAgZGVmYXVsdFJ1bnRpbWVfID0gaWRzLmdldFJ1bnRpbWVJZCgpOwotICAgIGRlZmF1bHRTZXJ2ZXJfID0gaWRzLmdldFNlcnZlcklkKCk7Ci0gICAgc2VydmVySW5zdGFuY2VJRF8gPSBpZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpOwotICAgIHNldElzRXhpc3RpbmdTZXJ2ZXIoaWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSAhPSBudWxsKTsKLSAgICBzZXJ2ZXJMYWJlbHNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGV4aXN0aW5nU2VydmVyc1RhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLQkvLyByc2tyZWcKLSAgICAvL3dzY3RSZWdpc3RyeSA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAvL3dzc3J0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCS8vIHJza3JlZwotICAgIHRoaXMuajJlZVZlcnNpb24gPSBqMmVlVmVyc2lvbjsKLSAgfQotCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRUeXBlUnVudGltZVNlcnZlcigpIHsKLSAgICBUeXBlUnVudGltZVNlcnZlciBpZHMgPSBuZXcgVHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLQotICAgIGlkcy5zZXRUeXBlSWQodHlwZUlkXyk7Ci0gICAgaWYgKHNlbGVjdGVkUnVudGltZV8gIT0gbnVsbCkKLSAgICAgIGlkcy5zZXRSdW50aW1lSWQoc2VsZWN0ZWRSdW50aW1lXy5nZXRJZCgpKTsKLSAgICAKLSAgICBpZiggc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfID09IG51bGwgKQotICAgIHsKLSAgICAgIGlkcy5zZXRTZXJ2ZXJJZCggZGVmYXVsdFNlcnZlcl8gKTsKLSAgICAgIGlkcy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKCBzZXJ2ZXJJbnN0YW5jZUlEXyApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWRzLnNldFNlcnZlcklkKHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXyk7Ci0KLSAgICAgIGlmIChpc0V4aXN0aW5nU2VydmVyXyAmJiBzZWxlY3RlZFNlcnZlcl8gIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIGlkcy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHNlbGVjdGVkU2VydmVyXy5nZXRJZCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGlkczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SjJFRVZlcnNpb24oKSB7Ci0gICAgcmV0dXJuIGoyZWVWZXJzaW9uOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGdldElzRXhpc3RpbmdTZXJ2ZXIoKSB7Ci0gICAgcmV0dXJuIGlzRXhpc3RpbmdTZXJ2ZXJfOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldElzRXhpc3RpbmdTZXJ2ZXIoYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci0gICAgaXNFeGlzdGluZ1NlcnZlcl8gPSBpc0V4aXN0aW5nOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIENvbXBvc2l0ZSBjb21wID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLSAgICBwYXJlbnQuZ2V0U2hlbGwoKS5wYWNrKCk7Ci0gICAgcmV0dXJuIGNvbXA7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICB2YWxpZGF0ZU9uXyA9IGZhbHNlOwotICAgIHRoaXNTaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgIGlmICh0aGlzU2hlbGwgPT0gbnVsbCkgewotICAgICAgdGhpc1NoZWxsID0gY3JlYXRlU2hlbGwoKTsKLSAgICB9Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBHcmlkTGF5b3V0IGdsOwotICAgIEdyaWREYXRhIGdkOwotICAgIC8vIFdpbmRvdyB0aXRsZQotICAgIGlmIChzZWxlY3Rpb25Nb2RlXyA9PSBNT0RFX1NFUlZJQ0UpCi0gICAgICB0aGlzU2hlbGwuc2V0VGV4dChnZXRNZXNzYWdlKCIlUEFHRV9USVRMRV9XU19SVU5USU1FX1NFTEVDVElPTiIpKTsKLSAgICBlbHNlCi0gICAgICB0aGlzU2hlbGwuc2V0VGV4dChnZXRNZXNzYWdlKCIlUEFHRV9USVRMRV9XU19DTElFTlRfUlVOVElNRV9TRUxFQ1RJT04iKSk7Ci0gICAgCi0gICAgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotICAgIAotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh0aGlzU2hlbGwsIElORk9QT1BfUFdSU19ESUFMT0cpOwotICAgIC8vIERpYWxvZyBkZXNjcmlwdGlvbiBiYW5uZXIKLSAgICBtZXNzYWdlQmFubmVyXyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSB8IFNXVC5XUkFQKTsKLSAgICBtZXNzYWdlQmFubmVyXy5zZXRUZXh0KGdldE1lc3NhZ2UoIiVQQUdFX0RFU0NfV1NfUlVOVElNRV9TRUxFQ1RJT04iKSArICJcbiIgKyAiICAgICAgIik7IC8vIHJlc2VydmVzIGEgc2Vjb25kIGxpbmUgZm9yIG1lc3NhZ2UgZGlzcGxheQotICAgIG1lc3NhZ2VCYW5uZXJfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVQQUdFX0RFU0NfV1NfUlVOVElNRV9TRUxFQ1RJT04iKSk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICBtZXNzYWdlQmFubmVyXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotICAgIG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5IT1JJWk9OVEFMKTsKLSAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotICAgIC8vIFNlbGVjdGlvbgotICAgIHRoaXNTaGVsbC5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QV1JTX1BBR0UiKSk7Ci0gICAgdmlld1NlbGVjdGlvbkdyb3VwXyA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgdmlld1NlbGVjdGlvbkdyb3VwXy5zZXRMYXlvdXQoZ2wpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgdmlld1NlbGVjdGlvbkdyb3VwXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBpZiAoc2VsZWN0aW9uTW9kZV8gPT0gTU9ERV9TRVJWSUNFKQotICAgICAgdmlld1NlbGVjdGlvbkdyb3VwXy5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9TRUxFQ1RJT05fVklFV19USVRMRSIpKTsKLSAgICBlbHNlCi0gICAgICB2aWV3U2VsZWN0aW9uR3JvdXBfLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX0NMSUVOVF9TRUxFQ1RJT05fVklFV19USVRMRSIpKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlTZXJ2ZXJCdXR0b25fID0gbmV3IEJ1dHRvbih2aWV3U2VsZWN0aW9uR3JvdXBfLCBTV1QuUkFESU8pOwotICAgIHZpZXdTZWxlY3Rpb25CeVNlcnZlckJ1dHRvbl8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfU0VMRUNUSU9OX1ZJRVdfU0VSVkVSIikpOwotICAgIHZpZXdTZWxlY3Rpb25CeVNlcnZlckJ1dHRvbl8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5U2VydmVyQnV0dG9uXy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QV1JTX1JBRElPX1NFUlZFUiIpKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlTZXJ2ZXJCdXR0b25fLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAodmlld1NlbGVjdGlvbkJ5U2VydmVyQnV0dG9uXywgSU5GT1BPUF9QV1JTX1JBRElPX1NFUlZFUik7Ci0gICAgdmlld1NlbGVjdGlvbkJ5UnVudGltZUJ1dHRvbl8gPSBuZXcgQnV0dG9uKHZpZXdTZWxlY3Rpb25Hcm91cF8sIFNXVC5SQURJTyk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5UnVudGltZUJ1dHRvbl8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfU0VMRUNUSU9OX1ZJRVdfUlVOVElNRSIpKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlSdW50aW1lQnV0dG9uXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlSdW50aW1lQnV0dG9uXy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QV1JTX1JBRElPX1JVTlRJTUUiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fLCBJTkZPUE9QX1BXUlNfUkFESU9fUlVOVElNRSk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5RXhwbG9yZUJ1dHRvbl8gPSBuZXcgQnV0dG9uKHZpZXdTZWxlY3Rpb25Hcm91cF8sIFNXVC5SQURJTyk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5RXhwbG9yZUJ1dHRvbl8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfU0VMRUNUSU9OX1ZJRVdfRVhQTE9SRSIpKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlFeHBsb3JlQnV0dG9uXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlFeHBsb3JlQnV0dG9uXy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QV1JTX1JBRElPX0VYUExPUkUiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHZpZXdTZWxlY3Rpb25CeUV4cGxvcmVCdXR0b25fLCBJTkZPUE9QX1BXUlNfUkFESU9fRVhQTE9SRSk7Ci0gICAgcHJpbWFyeUdyb3VwXyA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAxOwotICAgIGdsLm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBwcmltYXJ5R3JvdXBfLnNldExheW91dChnbCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBydW50aW1lc0dyb3VwXyA9IG5ldyBHcm91cChwcmltYXJ5R3JvdXBfLCBTV1QuTk9ORSk7Ci0gICAgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIHJ1bnRpbWVzR3JvdXBfLnNldExheW91dChnbCk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBydW50aW1lc0dyb3VwXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBydW50aW1lc0dyb3VwXy5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9SVU5USU1FU19MSVNUIikpOwotICAgIHJ1bnRpbWVzTGlzdF8gPSBuZXcgVHJlZShydW50aW1lc0dyb3VwXywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgcnVudGltZXNMaXN0Xy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBydW50aW1lc0xpc3RfLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIHJ1bnRpbWVzTGlzdF8uc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFdSU19MSVNUX1JVTlRJTUVTIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChydW50aW1lc0xpc3RfLCBJTkZPUE9QX1BXUlNfTElTVF9SVU5USU1FUyk7Ci0gICAgLy8gIFNlcnZlciBsYWJlbHMgY29udHJvbAotICAgIHNlcnZlcnNHcm91cF8gPSBuZXcgR3JvdXAocHJpbWFyeUdyb3VwXywgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBzZXJ2ZXJzR3JvdXBfLnNldExheW91dChnbCk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBzZXJ2ZXJzR3JvdXBfLnNldExheW91dERhdGEoZ2QpOwotICAgIHNlcnZlcnNHcm91cF8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfU0VSVkVSU19MSVNUIikpOwotICAgIHNlcnZlckxpc3RfID0gbmV3IFRyZWUoc2VydmVyc0dyb3VwXywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotICAgIHNlcnZlckxpc3RfLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLSAgICBzZXJ2ZXJMaXN0Xy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICBzZXJ2ZXJMaXN0Xy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QV1JTX0xJU1RfU0VSVkVSUyIpKTsKLSAgICBTZXJ2ZXJzTGlzdCBzZXJ2ZXJMaXN0ID0gbmV3IFNlcnZlcnNMaXN0KCk7Ci0gICAgc2VydmVyTGlzdC5zZXRTZXJ2ZXJUcmVlSXRlbXMoc2VydmVyTGlzdF8pOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChzZXJ2ZXJMaXN0XywgSU5GT1BPUF9QV1JTX0xJU1RfU0VSVkVSUyk7Ci0gICAgc2V0UnVudGltZXNHcm91cCgpOwotICAgIC8vIEoyRUUgdmVyc2lvbgotICAgIENvbXBvc2l0ZSBqMmVlVmVyc2lvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgajJlZVZlcnNpb25Db21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICBqMmVlVmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBMYWJlbCBqMmVlVmVyc2lvbkxhYmVsID0gbmV3IExhYmVsKGoyZWVWZXJzaW9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgajJlZVZlcnNpb25MYWJlbC5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9KMkVFX1ZFUlNJT04iKSk7Ci0gICAgajJlZVZlcnNpb25Db21ibyA9IG5ldyBDb21ibyhqMmVlVmVyc2lvbkNvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIGoyZWVWZXJzaW9uQ29tYm8uc2V0TGF5b3V0KGdsKTsKLSAgICBqMmVlVmVyc2lvbkNvbWJvLnNldExheW91dERhdGEoZ2QpOwotICAgIGoyZWVWZXJzaW9uQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgajJlZVZlcnNpb25Db21iby5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QV1JTX0oyRUVfVkVSU0lPTiIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAoajJlZVZlcnNpb25Db21ibywgSU5GT1BPUF9QV1JTX0oyRUVfVkVSU0lPTik7Ci0gICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLSAgICBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgdmFsaWRhdGVPbl8gPSB0cnVlOwotICAgIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotICAgIHNldEoyRUVWZXJzaW9ucygpOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0SjJFRVZlcnNpb25zKCkgewotICAgIGoyZWVWZXJzaW9uQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICBqMmVlVmVyc2lvbkNvbWJvLnJlbW92ZUFsbCgpOwotICAgIFN0cmluZ1tdIHZlcnNpb25zID0gbnVsbDsKLQkvLyByc2tyZWcKLSAgICAvL2lmIChzZWxlY3RlZFJ1bnRpbWVfICE9IG51bGwpCi0gICAgICAvL3ZlcnNpb25zID0gc2VsZWN0ZWRSdW50aW1lXy5nZXRKMkVFVmVyc2lvbnMoKTsKLSAgICBpZiAoc2VsZWN0ZWRSdW50aW1lXyAhPSBudWxsKQotCSAgICAgIHZlcnNpb25zID0gc2VsZWN0ZWRSdW50aW1lXy5nZXRKMmVlTGV2ZWxzKCk7Ci0JLy8gcnNrcmVnCQotICAgIGlmICh2ZXJzaW9ucyAhPSBudWxsKSB7Ci0gICAgICAvL2oyZWVWZXJzaW9uQ29tYm8uc2V0SXRlbXModmVyc2lvbnMpOwotICAgICAgc2V0SjJFRUNvbWJvSXRlbXModmVyc2lvbnMpOwotICAgICAgajJlZVZlcnNpb25Db21iby5zZWxlY3QoMCk7Ci0gICAgICBpZiAoajJlZVZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICBpbnQgaSA9IGoyZWVWZXJzaW9uQ29tYm8uaW5kZXhPZihKMkVFVXRpbHMuZ2V0TGFiZWxGcm9tSjJFRVZlcnNpb24oajJlZVZlcnNpb24pKTsKLSAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgIGoyZWVWZXJzaW9uQ29tYm8uc2VsZWN0KGkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICBqMmVlVmVyc2lvbkNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldEoyRUVDb21ib0l0ZW1zKFN0cmluZ1tdIHZlcnNpb25zKQotICB7Ci0gICAgU3RyaW5nW10gajJlZUxhYmVscyA9IG5ldyBTdHJpbmdbdmVyc2lvbnMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBsYWJlbCA9IEoyRUVVdGlscy5nZXRMYWJlbEZyb21KMkVFVmVyc2lvbih2ZXJzaW9uc1tpXSk7Ci0gICAgICBpZiAobGFiZWwgIT0gbnVsbCAmJiBsYWJlbC5sZW5ndGgoKSA+MCkKLSAgICAgICAgajJlZUxhYmVsc1tpXSA9IEoyRUVVdGlscy5nZXRMYWJlbEZyb21KMkVFVmVyc2lvbih2ZXJzaW9uc1tpXSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGoyZWVMYWJlbHNbaV0gPSBnZXRNZXNzYWdlKCIlTEFCRUxfTkEiKTsgCi0gICAgfQotICAgIGoyZWVWZXJzaW9uQ29tYm8uc2V0SXRlbXMoajJlZUxhYmVscyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0SjJFRVZlcnNpb25CYXNlZE9uU2VydmVyKCkKLSAgewotICAgIC8vR2V0IHRoZSBsaXN0IG9mIEoyRUUgdmVyc2lvbnMKLSAgICBTdHJpbmdbXSB2ZXJzaW9ucyA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGVkUnVudGltZV8gPT0gbnVsbCB8fCBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF89PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgCi0JLy8gcnNrcmVnCi0gICAgLy92ZXJzaW9ucyA9IHNlbGVjdGVkUnVudGltZV8uZ2V0SjJFRVZlcnNpb25zKCk7Ci0JdmVyc2lvbnMgPSBzZWxlY3RlZFJ1bnRpbWVfLmdldEoyZWVMZXZlbHMoKTsKLQkvLyByc2tyZWcKLSAgICBpZiAodmVyc2lvbnM9PW51bGwpCi0gICAgICByZXR1cm47Ci0gICAgCi0gICAgLy9QaWNrIHRoZSBmaXJzdCB2ZXJzaW9uIHRoYXQgdGhlIHNlbGVjdGVkIHNlcnZlciBzdXBwb3J0cwotICAgIGZvciAoaW50IGk9MDsgaTx2ZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaXNTZXJ2ZXJWYWxpZChzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8sIHZlcnNpb25zW2ldKSkKLSAgICAgIHsKLSAgICAgICAgLy9TZXQgdGhlIGoyZWUgbGV2ZWwgdG8gdGhpcyB2ZXJzaW9uCi0gICAgICAgIFN0cmluZyBsYWJlbCA9IEoyRUVVdGlscy5nZXRMYWJlbEZyb21KMkVFVmVyc2lvbih2ZXJzaW9uc1tpXSk7Ci0gICAgICAgIGoyZWVWZXJzaW9uQ29tYm8uc2V0VGV4dChsYWJlbCk7Ci0gICAgICAgIHNldEoyRUVWZXJzaW9uRnJvbUoyRUVWZXJzaW9uQ29tYm8oKTsKLSAgICAgIH0KLSAgICB9ICAgICAgCi0gIH0KLQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGlzU2VydmVyVmFsaWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgU3RyaW5nIHN0SjJFRVZlcnNpb24gPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJUYXJnZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbik7Ci0gICAgaWYgKHN0SjJFRVZlcnNpb24gPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJGYWN0b3J5SWQpOwotICAgIGlmIChzZXJ2ZXJUeXBlIT1udWxsKQotICAgIHsKLSAgICAgIElSdW50aW1lVHlwZSBzZXJ2ZXJSdW50aW1lID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOwotICAgICAgSU1vZHVsZVR5cGVbXSBtVHlwZXMgPSBzZXJ2ZXJSdW50aW1lLmdldE1vZHVsZVR5cGVzKCk7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8bVR5cGVzLmxlbmd0aDsgaSsrKSAgICAgIAotICAgICAgewotICAgICAgICBJTW9kdWxlVHlwZSBtVHlwZSA9IG1UeXBlc1tpXTsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBtVHlwZS5nZXRJZCgpOwotICAgICAgICBTdHJpbmcgbW9kdWxlVmVyc2lvbiA9IG1UeXBlLmdldFZlcnNpb24oKTsKLSAgICAgICAgaWYgKHR5cGUuZXF1YWxzKElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuV0VCX1RZUEUpICYmIG1vZHVsZVZlcnNpb24uZXF1YWxzKHN0SjJFRVZlcnNpb24pKQotICAgICAgICB7Ci0gICAgICAgICAgLy9Gb3VuZCBhIG1hdGNoLCByZXR1cm4gdHJ1ZSEKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvL25vIG1hdGNoIGZvdW5kIG9yIHRoZSBzZXJ2ZXIgdHlwZSB3YXMgbnVsbC4gUmV0dXJuIGZhbHNlLgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU2VydmVyUnVudGltZVNlbGVjdGlvbigpIHsKLSAgICAvLyBDaGVjayBpZiB0aGUgZXh0ZW5zaW9uIGV4aXN0cwotICAgIGlmIChzZWxlY3Rpb25Nb2RlXyA9PSBNT0RFX1NFUlZJQ0UpIHsKLSAgICAgIGlmIChzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8hPW51bGwgJiYgc2VsZWN0ZWRSdW50aW1lXyE9bnVsbCkgewotCQkgIC8vIHJza3JlZwotICAgICAgLy9XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgd3NzcnQgPSB3c3NydFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZShzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8sIHNlbGVjdGVkUnVudGltZV8uZ2V0SWQoKSwgdHlwZUlkXyk7Ci0JCSAgLy8gcnNrcmVnCi0gICAgICAvLyBybSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgd3NzcnQgPQotICAgICAgLy8gd3NzcnRSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUoc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfLAotICAgICAgLy8gc2VsZWN0ZWRSdW50aW1lXy5nZXRJZCgpLCB3c2UuZ2V0V2ViU2VydmljZVR5cGUoKSk7Ci0gICAgICAvLyBybSBpZiAod3NzcnQhPW51bGwgJiYKLSAgICAgIC8vIHdzc3J0UmVnaXN0cnkuaXNTZXJ2ZXJTdXBwb3J0ZWRGb3JDaG9zZW5UeXBlKHdzZS5nZXRXZWJTZXJ2aWNlVHlwZSgpLHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXykpCi0gICAgICAvLyB7Ci0JCSAgCi0JCSAgLy9yc2tyZWcKLSAgICAgIGJvb2xlYW4gd3NzcnRTdXBwb3J0ZWQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmlzU2VydmVyUnVudGltZVR5cGVTdXBwb3J0ZWQoc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfLHNlbGVjdGVkUnVudGltZV8uZ2V0SWQoKSx0eXBlSWRfKTsJCSAgCi0gICAgICAvL2lmICh3c3NydCAhPSBudWxsICYmIHdzc3J0UmVnaXN0cnkuaXNTZXJ2ZXJTdXBwb3J0ZWRGb3JDaG9zZW5UeXBlKHR5cGVJZF8sIHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXykpIHsKLSAgICAgICAgLy9zZXRPS1N0YXR1c01lc3NhZ2UoKTsKLSAgICAgIC8vfQotCSAgCi0gICAgICBpZiAod3NzcnRTdXBwb3J0ZWQgJiYgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5pc1NlcnZlclN1cHBvcnRlZEZvckNob3NlblR5cGUodHlwZUlkXywgc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfKSkgewotCSAgICAgICAgc2V0T0tTdGF0dXNNZXNzYWdlKCk7Ci0JICAgICAgfQotCSAgLy8gcnNrcmVnCi0gICAgICBlbHNlIHsKLSAgICAgICAgc2V0RVJST1JTdGF0dXNNZXNzYWdlKCIlTVNHX0lOVkFMSURfU1JUX1NFTEVDVElPTlMiKTsKLSAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvLyBybSBTdHJpbmcgY2xpZW50SWQgPQotICAgICAgLy8gd3NjdFJlZ2lzdHJ5LmdldENsaWVudFR5cGVJZEJ5TmFtZShjbGllbnRTY2VuYXJpb0lkXyk7Ci0gICAgICBTdHJpbmcgY2xpZW50SWQgPSB0eXBlSWRfOwotICAgICAgLy8gcm0gU3RyaW5nIGNsaWVudElkID0KLSAgICAgIC8vIHdzY3RSZWdpc3RyeS5nZXRDbGllbnRUeXBlSWRCeU5hbWUod3NlLmdldFByb3h5U2VsZWN0ZWQoKSk7Ci0JICAvLyByc2tyZWcKLQkgIAotICAgICAgLy9XZWJTZXJ2aWNlU2VydmVyIHdzcyA9IHdzY3RSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfKTsKLQotICAgICAgLy9pZiAod3NzID09IG51bGwgfHwgc2VsZWN0ZWRSdW50aW1lXyA9PSBudWxsIHx8ICF3c2N0UmVnaXN0cnkud2ViU2VydmljZUNsaWVudFJ1bnRpbWVUeXBlRXhpc3RzKHdzcy5nZXRJZCgpLCBzZWxlY3RlZFJ1bnRpbWVfLmdldElkKCksIGNsaWVudElkKSkgewotICAgICAgICAvL3NldEVSUk9SU3RhdHVzTWVzc2FnZSgiJU1TR19JTlZBTElEX1NSVF9TRUxFQ1RJT05TIik7Ci0gICAgICAvL30KLSAgICAgIGlmIChzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF89PW51bGwgfHwgc2VsZWN0ZWRSdW50aW1lXyA9PSBudWxsIHx8ICFXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLndlYlNlcnZpY2VDbGllbnRSdW50aW1lVHlwZUV4aXN0cyhzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8sIHNlbGVjdGVkUnVudGltZV8uZ2V0SWQoKSwgY2xpZW50SWQpKSB7Ci0JICAgICAgICBzZXRFUlJPUlN0YXR1c01lc3NhZ2UoIiVNU0dfSU5WQUxJRF9TUlRfU0VMRUNUSU9OUyIpOwotCSAgfQkgIAotCSAgLy8gcnNrcmVnCi0gICAgICBlbHNlIHsKLSAgICAgICAgc2V0T0tTdGF0dXNNZXNzYWdlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIERpc2FibGUgT0sgYnV0dG9uIGlmIHRoZSBydW50aW1lIHNlbGVjdGlvbiBpcyBpbnZhbGlkCi0gICAgVHJlZUl0ZW1bXSBydW50aW1lU2VsID0gcnVudGltZXNMaXN0Xy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAocnVudGltZVNlbCA9PSBudWxsIHx8IHJ1bnRpbWVTZWwubGVuZ3RoIDw9IDAgfHwgcnVudGltZVNlbFswXS5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgZGlzYWJsZU9LQnV0dG9uKCk7Ci0gICAgfQotICAgIC8vIERpc2FibGUgT0sgYnV0dG9uIGlmIHNlcnZlciBzZWxlY3Rpb24gaXMgaW52YWxpZAotICAgIFRyZWVJdGVtW10gc2VydmVyU2VsID0gc2VydmVyTGlzdF8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgU3RyaW5nIGN1cnJlbnRTZWxlY3Rpb24gPSAoc2VydmVyU2VsICE9IG51bGwgJiYgc2VydmVyU2VsLmxlbmd0aCA+IDApID8gc2VydmVyU2VsWzBdLmdldFRleHQoKSA6ICIiOwotICAgIGlmIChzZXJ2ZXJTZWwgPT0gbnVsbCB8fCBjdXJyZW50U2VsZWN0aW9uLmxlbmd0aCgpID09IDApIHsKLSAgICAgIGRpc2FibGVPS0J1dHRvbigpOwotICAgIH0KLSAgICBpZiAoIXNlcnZlckxhYmVsc18uY29udGFpbnNLZXkoY3VycmVudFNlbGVjdGlvbikgfHwgIWV4aXN0aW5nU2VydmVyc1RhYmxlXy5jb250YWluc0tleShjdXJyZW50U2VsZWN0aW9uKSkgewotICAgICAgZGlzYWJsZU9LQnV0dG9uKCk7Ci0gICAgICBzZXRPS1N0YXR1c01lc3NhZ2UoKTsKLSAgICB9Ci0gICAgLy8gRGlzYWJsZSBPSyBidXR0b24gaWYgY2F0ZWdvcnkgaXMgc2VsZWN0ZWQgcmF0aGVyIHRoYW4gYSBzZXJ2ZXIKLSAgICBpZiAoc2VydmVyU2VsLmxlbmd0aCA+IDAgJiYgc2VydmVyU2VsWzBdLmdldEl0ZW1Db3VudCgpIT0wKSB7Ci0gICAgCWRpc2FibGVPS0J1dHRvbigpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJZW5hYmxlT0tCdXR0b24oKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0T0tTdGF0dXNNZXNzYWdlKCkgewotICAgIG1lc3NhZ2VCYW5uZXJfLnNldFRleHQoZ2V0TWVzc2FnZSgiJVBBR0VfREVTQ19XU19SVU5USU1FX1NFTEVDVElPTiIpKTsKLSAgICBDb2xvciBibGFjayA9IG5ldyBDb2xvcih0aGlzU2hlbGwuZ2V0RGlzcGxheSgpLCAweDAwLCAwLCAwKTsKLSAgICBtZXNzYWdlQmFubmVyXy5zZXRGb3JlZ3JvdW5kKGJsYWNrKTsKLSAgICBlbmFibGVPS0J1dHRvbigpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldEVSUk9SU3RhdHVzTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotICAgIG1lc3NhZ2VCYW5uZXJfLnNldFRleHQoZ2V0TWVzc2FnZShtZXNzYWdlKSk7Ci0gICAgQ29sb3IgcmVkID0gbmV3IENvbG9yKHRoaXNTaGVsbC5nZXREaXNwbGF5KCksIDB4RkYsIDAsIDApOwotICAgIG1lc3NhZ2VCYW5uZXJfLnNldEZvcmVncm91bmQocmVkKTsKLSAgICBkaXNhYmxlT0tCdXR0b24oKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBkaXNhYmxlT0tCdXR0b24oKSB7Ci0gICAgaWYgKGdldEJ1dHRvbigwKSAhPSBudWxsKQotICAgICAgZ2V0QnV0dG9uKDApLnNldEVuYWJsZWQoZmFsc2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVuYWJsZU9LQnV0dG9uKCkgewotICAgIGlmIChnZXRCdXR0b24oMCkgIT0gbnVsbCkKLSAgICAgIGdldEJ1dHRvbigwKS5zZXRFbmFibGVkKHRydWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotICAgIHNldEoyRUVWZXJzaW9uRnJvbUoyRUVWZXJzaW9uQ29tYm8oKTsKLSAgICAvL2oyZWVWZXJzaW9uID0gKGoyZWVWZXJzaW9uQ29tYm8uZ2V0RW5hYmxlZCgpKSA/IGoyZWVWZXJzaW9uQ29tYm8uZ2V0VGV4dCgpIDogbnVsbDsKLSAgICBzZXRSZXR1cm5Db2RlKE9LKTsKLSAgICBjbG9zZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldEoyRUVWZXJzaW9uRnJvbUoyRUVWZXJzaW9uQ29tYm8oKQotICB7Ci0gICAgaWYgKGoyZWVWZXJzaW9uQ29tYm8uZ2V0RW5hYmxlZCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBqMmVlTGFiZWwgPSBqMmVlVmVyc2lvbkNvbWJvLmdldFRleHQoKTsKLSAgICAgIFN0cmluZyBqMmVlVmVyc2lvblN0cmluZyA9IEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbkZyb21MYWJlbChqMmVlTGFiZWwpOwotICAgICAgaWYgKGoyZWVWZXJzaW9uU3RyaW5nICE9IG51bGwgJiYgajJlZVZlcnNpb25TdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgICAgICBqMmVlVmVyc2lvbiA9IGoyZWVWZXJzaW9uU3RyaW5nOwotICAgICAgZWxzZQotICAgICAgICBqMmVlVmVyc2lvbiA9IG51bGw7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGoyZWVWZXJzaW9uID0gbnVsbDsgICAgCi0gIH0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIGFuIGV2ZW50IG9jY3VycyBvbiB0aGUgcGFnZS4gSGFuZGxlcyB0aGUgZXZlbnQgYW5kIHJldmFsaWRhdGVzIHRoZSBwYWdlLgotICAgKiAKLSAgICogQHBhcmFtIGV2ZW50Ci0gICAqICAgICAgICAgIFRoZSBldmVudCB0aGF0IG9jY3VyZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgIGlmICghdmFsaWRhdGVPbl8pCi0gICAgICByZXR1cm47Ci0gICAgZW5hYmxlT0tCdXR0b24oKTsKLSAgICBpZiAodmlld1NlbGVjdGlvbkJ5UnVudGltZUJ1dHRvbl8gPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICBoYW5kbGVSdW50aW1lVmlld1NlbGVjdGlvbkV2ZW50KCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKHZpZXdTZWxlY3Rpb25CeVNlcnZlckJ1dHRvbl8gPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICBoYW5kbGVTZXJ2ZXJWaWV3U2VsZWN0aW9uRXZlbnQoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAodmlld1NlbGVjdGlvbkJ5RXhwbG9yZUJ1dHRvbl8gPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICBoYW5kbGVFeHBsb3JlVmlld1NlbGVjdGlvbkV2ZW50KCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKGoyZWVWZXJzaW9uQ29tYm8gPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICBzZXRKMkVFVmVyc2lvbkZyb21KMkVFVmVyc2lvbkNvbWJvKCk7Ci0gICAgICAvL2oyZWVWZXJzaW9uID0gKGoyZWVWZXJzaW9uQ29tYm8uZ2V0RW5hYmxlZCgpKSA/IGoyZWVWZXJzaW9uQ29tYm8uZ2V0VGV4dCgpIDogbnVsbDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAocnVudGltZXNMaXN0XyA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgIFRyZWVJdGVtW10gcnVudGltZVNlbCA9IHJ1bnRpbWVzTGlzdF8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBwcm9jZXNzUnVudGltZUxpc3RTZWxlY3Rpb24ocnVudGltZVNlbFswXS5nZXRUZXh0KCkpOwotICAgICAgdmFsaWRhdGVTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uKCk7Ci0gICAgICBzZXRKMkVFVmVyc2lvbnMoKTsKLSAgICAgIHNldEoyRUVWZXJzaW9uQmFzZWRPblNlcnZlcigpOwotICAgIH0KLSAgICBlbHNlIGlmIChzZXJ2ZXJMaXN0XyA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgIHByb2Nlc3NTZXJ2ZXJMaXN0U2VsZWN0aW9uKCk7Ci0gICAgICB2YWxpZGF0ZVNlcnZlclJ1bnRpbWVTZWxlY3Rpb24oKTsKLSAgICAgIHNldEoyRUVWZXJzaW9uQmFzZWRPblNlcnZlcigpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVSdW50aW1lVmlld1NlbGVjdGlvbkV2ZW50KCkgewotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAxOwotICAgIGdsLm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBwcmltYXJ5R3JvdXBfLnNldExheW91dChnbCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBwcmltYXJ5R3JvdXBfLmxheW91dCgpOwotCi0gICAgLy8gVE9ETzogU2hvdyBhbGwgcnVudGltZXMsIGFuZCBvbmx5IHNlcnZlcnMgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgdHlwZSBpZAotICB9Ci0KLSAgLy8gCi0gIC8vIENhbGxlZCBieSBoYW5kbGVFdmVudCgpIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGUgbGF5b3V0IHRvIHZpZXcKLSAgLy8KLSAgcHVibGljIHZvaWQgaGFuZGxlU2VydmVyVmlld1NlbGVjdGlvbkV2ZW50KCkgewotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAxOwotICAgIGdsLm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBwcmltYXJ5R3JvdXBfLnNldExheW91dChnbCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBwcmltYXJ5R3JvdXBfLmxheW91dCgpOwotICAgIHNlcnZlcnNHcm91cF8uc2V0TG9jYXRpb24oNSwgNSk7Ci0gICAgcnVudGltZXNHcm91cF8uc2V0TG9jYXRpb24oNCwgMTAwKTsKLSAgICBzZXJ2ZXJzR3JvdXBfLmxheW91dCgpOwotICAgIHJ1bnRpbWVzR3JvdXBfLmxheW91dCgpOwotCi0gICAgLy8gVE9ETzogU2hvdyBhbGwgc2VydmVycywgYW5kIG9ubHkgcnVudGltZXMgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHR5cGUgaWQKLSAgfQotCi0gIC8vIAotICAvLyBDYWxsZWQgYnkgaGFuZGxlRXZlbnQoKSB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhlIGxheW91dCB0byB2aWV3Ci0gIC8vCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVFeHBsb3JlVmlld1NlbGVjdGlvbkV2ZW50KCkgewotICAgIEdyaWRMYXlvdXQgZ2w7Ci0gICAgZ2wgPSAoR3JpZExheW91dCkgcHJpbWFyeUdyb3VwXy5nZXRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5zZXRMYXlvdXQoZ2wpOwotICAgIHByaW1hcnlHcm91cF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5sYXlvdXQoKTsKLQotICAgIC8vIFRPRE86IFNob3cgYWxsIHNlcnZlcnMgYW5kIHJ1bnRpbWVzIGZyb20gdGhlIHR5cGUgaWQKLQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NSdW50aW1lTGlzdFNlbGVjdGlvbihTdHJpbmcgcnVudGltZU5hbWUpIHsKLQkgIC8vIHJza3JlZwotICAgIGlmIChzZWxlY3Rpb25Nb2RlXyA9PSBNT0RFX1NFUlZJQ0UpIHsKLSAgICAgIC8vc2VsZWN0ZWRSdW50aW1lXyA9IHdzc3J0UmVnaXN0cnkuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUxhYmVsKHJ1bnRpbWVOYW1lKTsKLQkJc2VsZWN0ZWRSdW50aW1lXyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUxhYmVsKHJ1bnRpbWVOYW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvL3NlbGVjdGVkUnVudGltZV8gPSB3c2N0UmVnaXN0cnkuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeU5hbWUocnVudGltZU5hbWUpOwotCQlzZWxlY3RlZFJ1bnRpbWVfID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRXZWJTZXJ2aWNlUnVudGltZUJ5TGFiZWwocnVudGltZU5hbWUpOwotICAgIH0KLQkgLy8gcnNrcmVnCi0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NlcnZlckxpc3RTZWxlY3Rpb24oKSB7Ci0gICAgU3RyaW5nIGN1cnJlbnRTZWxlY3Rpb247Ci0gICAgVHJlZUl0ZW1bXSBzZXJ2ZXJTZWwgPSBzZXJ2ZXJMaXN0Xy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VydmVyU2VsICE9IG51bGwgJiYgc2VydmVyU2VsLmxlbmd0aCA+IDApIHsKLSAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPSBzZXJ2ZXJTZWxbMF0uZ2V0VGV4dCgpOwotICAgICAgaWYgKHNlcnZlckxhYmVsc18uY29udGFpbnNLZXkoY3VycmVudFNlbGVjdGlvbikgfHwgZXhpc3RpbmdTZXJ2ZXJzVGFibGVfLmNvbnRhaW5zS2V5KGN1cnJlbnRTZWxlY3Rpb24pKSB7Ci0gICAgICAgIGlmIChleGlzdGluZ1NlcnZlcnNUYWJsZV8uY29udGFpbnNLZXkoY3VycmVudFNlbGVjdGlvbikpIHsKLSAgICAgICAgICBzZWxlY3RlZFNlcnZlcl8gPSAoSVNlcnZlcikgZXhpc3RpbmdTZXJ2ZXJzVGFibGVfLmdldChjdXJyZW50U2VsZWN0aW9uKTsKLSAgICAgICAgICBzZWxlY3RlZFNlcnZlckxhYmVsXyA9IGN1cnJlbnRTZWxlY3Rpb247Ci0gICAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfID0gc2VsZWN0ZWRTZXJ2ZXJfLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNlcnZlckxhYmVsc18uY29udGFpbnNLZXkoY3VycmVudFNlbGVjdGlvbikpIHsKLSAgICAgICAgICBUcmVlSXRlbSBwYXJlbnRJdGVtID0gc2VydmVyU2VsWzBdLmdldFBhcmVudEl0ZW0oKTsKLSAgICAgICAgICBpZiAocGFyZW50SXRlbSAhPSBudWxsICYmICFwYXJlbnRJdGVtLmdldFRleHQoKS5lcXVhbHNJZ25vcmVDYXNlKGdldE1lc3NhZ2UoIiVMQUJFTF9UUkVFX0VYSVNUSU5HX1NFUlZFUlMiKSkpIHsKLSAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyTGFiZWxfID0gY3VycmVudFNlbGVjdGlvbjsKLSAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyXyA9IG51bGw7Ci0gICAgICAgICAgICBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8gPSAoU3RyaW5nKSBzZXJ2ZXJMYWJlbHNfLmdldChjdXJyZW50U2VsZWN0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiBpc0V4aXN0aW5nU2VydmVyIG9yIG5ldyBTZXJ2ZXJUeXBlCi0gICAgICAgIFRyZWVJdGVtIHBhcmVudEl0ZW0gPSBzZXJ2ZXJTZWxbMF0uZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICBpZiAocGFyZW50SXRlbSAhPSBudWxsICYmIHBhcmVudEl0ZW0uZ2V0VGV4dCgpLmVxdWFsc0lnbm9yZUNhc2UoZ2V0TWVzc2FnZSgiJUxBQkVMX1RSRUVfRVhJU1RJTkdfU0VSVkVSUyIpKSkgewotICAgICAgICAgIHNldElzRXhpc3RpbmdTZXJ2ZXIodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgc2V0SXNFeGlzdGluZ1NlcnZlcihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBzZWxlY3RlZFNlcnZlcl8gPSBudWxsOwotICAgICAgICBzZWxlY3RlZFNlcnZlckxhYmVsXyA9IG51bGw7Ci0gICAgICAgIHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXyA9IG51bGw7Ci0gICAgICAgIHNldElzRXhpc3RpbmdTZXJ2ZXIoZmFsc2UpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9ICAgICAgCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKGtleSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldE1lc3NhZ2Uoa2V5LCBhcmdzKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRSdW50aW1lc0dyb3VwKCkgewotICAgIHJ1bnRpbWVzTGlzdF8ucmVtb3ZlQWxsKCk7Ci0gICAgU3RyaW5nW10gcnVudGltZXMgPSBudWxsOwotCi0gICAgaWYgKHNlbGVjdGlvbk1vZGVfID09IE1PREVfU0VSVklDRSkgewotCQkvLyByc2tyZWcKLSAgICAgIC8vcnVudGltZXMgPSB3c3NydFJlZ2lzdHJ5LmdldFJ1bnRpbWVzQnlUeXBlKHR5cGVJZF8pOwotCQlydW50aW1lcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0UnVudGltZXNCeVR5cGUodHlwZUlkXyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLy9ydW50aW1lcyA9IHdzY3RSZWdpc3RyeS5nZXRBbGxDbGllbnRSdW50aW1lcygpOwotCSAgcnVudGltZXMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldEFsbENsaWVudFJ1bnRpbWVzKCk7Ci0JICAvLyByc2tyZWcKLSAgICB9Ci0KLSAgICBUcmVlSXRlbVtdIHJ1bnRpbWVOYW1lID0gbmV3IFRyZWVJdGVtW3J1bnRpbWVzLmxlbmd0aF07Ci0KLSAgICBpZiAocnVudGltZXMgIT0gbnVsbCkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICBTdHJpbmcgcnVudGltZUxhYmVsID0gZ2V0UnVudGltZUxhYmVsKHJ1bnRpbWVzW2ldKTsKLSAgICAgICAgcnVudGltZU5hbWVbaV0gPSBuZXcgVHJlZUl0ZW0ocnVudGltZXNMaXN0XywgU1dULk5PTkUpOwotICAgICAgICBydW50aW1lTmFtZVtpXS5zZXRUZXh0KHJ1bnRpbWVMYWJlbCk7Ci0KLSAgICAgICAgaWYgKHJ1bnRpbWVzW2ldLmVxdWFsc0lnbm9yZUNhc2UoZGVmYXVsdFJ1bnRpbWVfKSkgewotICAgICAgICAgIHJ1bnRpbWVzTGlzdF8uc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHsgcnVudGltZU5hbWVbaV19KTsKLSAgICAgICAgICBzZWxlY3RlZFJ1bnRpbWVfID0gZ2V0UnVudGltZShydW50aW1lc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRSdW50aW1lTGFiZWwoU3RyaW5nIHR5cGUpIHsKLSAgICByZXR1cm4gZ2V0UnVudGltZSh0eXBlKS5nZXRMYWJlbCgpOwotICB9Ci0KLSAgLy8gcnNrcmVnCi0gIHByaXZhdGUgV2ViU2VydmljZVJ1bnRpbWVJbmZvIGdldFJ1bnRpbWUoU3RyaW5nIHR5cGUpIHsKLSAgICBpZiAoc2VsZWN0aW9uTW9kZV8gPT0gTU9ERV9TRVJWSUNFKSB7Ci0gICAgICAvL3JldHVybiB3c3NydFJlZ2lzdHJ5LmdldFJ1bnRpbWVCeUlkKHR5cGUpOwotCSAgcmV0dXJuIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHR5cGUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8vcmV0dXJuIHdzY3RSZWdpc3RyeS5nZXRSdW50aW1lQnlJZCh0eXBlKTsKLQkgIHJldHVybiBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VSdW50aW1lQnlJZCh0eXBlKTsKLSAgICB9Ci0gIH0KLSAgLy8gcnNrcmVnCi0KLSAgLy8gUmV0dXJucyB0aGUgc2VydmVyIEZhY3RvcnkgSWQgZ2l2ZW4gYSBzZXJ2ZXIgbmFtZQotICBwcml2YXRlIFN0cmluZyBnZXRTZXJ2ZXJTZWxlY3Rpb25GYWN0b3J5SWQoU3RyaW5nIHNlbGVjdGVkU2VydmVyTmFtZSkgewotICAgIGlmIChzZXJ2ZXJMYWJlbHNfLmNvbnRhaW5zS2V5KHNlbGVjdGVkU2VydmVyTmFtZSkgJiYgIWlzRXhpc3RpbmdTZXJ2ZXJfKQotICAgICAgcmV0dXJuIChTdHJpbmcpIHNlcnZlckxhYmVsc18uZ2V0KHNlbGVjdGVkU2VydmVyTmFtZSk7Ci0gICAgZWxzZSB7Ci0gICAgICByZXR1cm4gKChJU2VydmVyKSBleGlzdGluZ1NlcnZlcnNUYWJsZV8uZ2V0KHNlbGVjdGVkU2VydmVyTmFtZSkpLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiAKLSAgICogU2VydmVyc0xpc3QgY2xhc3MKLSAgICogCi0gICAqIENsYXNzIHdoaWNoIGVhc2lseSBjcmVhdGVzIHRoZSBUcmVlIHN0cnVjdHVyZSBhbmQgZW50cmllcyBmb3IgZXhpc3Rpbmcgc2VydmVycyBhbmQgc2VydmVyIHR5cGVzCi0gICAqLwotICBwdWJsaWMgY2xhc3MgU2VydmVyc0xpc3QgewotCi0gICAgcHJpdmF0ZSBUcmVlSXRlbVtdIGV4aXN0aW5nU2VydmVyc1RyZWU7Ci0gICAgcHJpdmF0ZSBUcmVlSXRlbVtdIHNlcnZlclR5cGVzVHJlZTsKLSAgICBib29sZWFuIGV4aXN0aW5nU2VydmVyID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUcmVlSXRlbXMoVHJlZSBzZXJ2ZXJzTGlzdCkgewotICAgICAgdGhpcy5zZXRFeGlzdGluZ1NlcnZlcnNUcmVlKHNlcnZlcnNMaXN0KTsKLSAgICAgIHRoaXMuc2V0U2VydmVyVHlwZXNUcmVlKHNlcnZlcnNMaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcnNUcmVlKFRyZWUgc2VydmVyTGlzdCkgewotICAgICAgU3RyaW5nW10gc2VydmVySWRzID0gdGhpcy5nZXRBbGxFeGlzdGluZ1NlcnZlcnMoKTsKLSAgICAgIGV4aXN0aW5nU2VydmVyc1RyZWUgPSBuZXcgVHJlZUl0ZW1bMV07Ci0gICAgICBUcmVlSXRlbVtdIGV4aXN0aW5nU2VydmVySXRlbXMgPSBuZXcgVHJlZUl0ZW1bc2VydmVySWRzLmxlbmd0aF07Ci0gICAgICBleGlzdGluZ1NlcnZlcnNUcmVlWzBdID0gbmV3IFRyZWVJdGVtKHNlcnZlckxpc3QsIFNXVC5OT05FKTsKLSAgICAgIGV4aXN0aW5nU2VydmVyc1RyZWVbMF0uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfVFJFRV9FWElTVElOR19TRVJWRVJTIikpOwotICAgICAgSW1hZ2VEZXNjcmlwdG9yIGlkID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEVYSVNUSU5HX1NFUlZFUlNfSUNPTik7Ci0gICAgICBpZiAoaWQgIT0gbnVsbCkKLSAgICAgICAgZXhpc3RpbmdTZXJ2ZXJzVHJlZVswXS5zZXRJbWFnZShpZC5jcmVhdGVJbWFnZSgpKTsKLSAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc2VydmVySWRzLmxlbmd0aDsgaysrKSB7Ci0gICAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKCgoSVNlcnZlcikgZXhpc3RpbmdTZXJ2ZXJzVGFibGVfLmdldChzZXJ2ZXJJZHNba10pKS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChzZXJ2ZXJUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICBleGlzdGluZ1NlcnZlckl0ZW1zW2tdID0gbmV3IFRyZWVJdGVtKGV4aXN0aW5nU2VydmVyc1RyZWVbMF0sIFNXVC5OT05FKTsKLSAgICAgICAgICBleGlzdGluZ1NlcnZlckl0ZW1zW2tdLnNldFRleHQoc2VydmVySWRzW2tdKTsKLSAgICAgICAgICBpZiAoc2VydmVySWRzW2tdLmVxdWFsc0lnbm9yZUNhc2UoZGVmYXVsdFNlcnZlcl8pICYmIGdldElzRXhpc3RpbmdTZXJ2ZXIoKSkgewotICAgICAgICAgICAgZXhpc3RpbmdTZXJ2ZXJzVHJlZVswXS5zZXRFeHBhbmRlZCh0cnVlKTsKLSAgICAgICAgICAgIHNlcnZlckxpc3Quc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHsgZXhpc3RpbmdTZXJ2ZXJJdGVtc1trXX0pOwotICAgICAgICAgICAgZXhpc3RpbmdTZXJ2ZXIgPSB0cnVlOwotICAgICAgICAgICAgUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZy50aGlzLnNldElzRXhpc3RpbmdTZXJ2ZXIodHJ1ZSk7Ci0gICAgICAgICAgICBzZWxlY3RlZFNlcnZlcl8gPSAoSVNlcnZlcikgZXhpc3RpbmdTZXJ2ZXJzVGFibGVfLmdldChkZWZhdWx0U2VydmVyXyk7Ci0gICAgICAgICAgICBzZWxlY3RlZFNlcnZlckxhYmVsXyA9IHNlcnZlcklkc1trXTsKLSAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXyA9IHNlbGVjdGVkU2VydmVyXy5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZXhpc3RpbmdTZXJ2ZXJJdGVtc1trXS5zZXRJbWFnZShTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldEltYWdlKHNlcnZlclR5cGUpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclR5cGVzVHJlZShUcmVlIHNlcnZlckxpc3QpIHsKLQotICAgICAgVHJlZUl0ZW1bXSBzZXJ2ZXJUeXBlc1RyZWUgPSBuZXcgVHJlZUl0ZW1bMV07Ci0gICAgICBzZXJ2ZXJUeXBlc1RyZWVbMF0gPSBuZXcgVHJlZUl0ZW0oc2VydmVyTGlzdCwgU1dULk5PTkUpOwotICAgICAgc2VydmVyVHlwZXNUcmVlWzBdLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX1RSRUVfU0VSVkVSX1RZUEVTIikpOwotICAgICAgSW1hZ2VEZXNjcmlwdG9yIGlkID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKFNFUlZFUl9UWVBFU19JQ09OKTsKLSAgICAgIGlmIChpZCAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJUeXBlc1RyZWVbMF0uc2V0SW1hZ2UoaWQuY3JlYXRlSW1hZ2UoKSk7Ci0gICAgICBIYXNodGFibGUgY2F0ZWdvcmllc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICBIYXNodGFibGUgY2F0ZWdvcnlUcmVlSXRlbSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIFN0cmluZ1tdIHNlcnZlcklkcyA9IG51bGw7Ci0gICAgICAvLyBybSBTdHJpbmcgd3N0ID0gd3NlLmdldFdlYlNlcnZpY2VUeXBlKCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uTW9kZV8gPT0gTU9ERV9TRVJWSUNFKSB7Ci0JCSAgLy8gcnNrcmVnCi0gICAgICAgIC8vc2VydmVySWRzID0gd3NzcnRSZWdpc3RyeS5nZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKHR5cGVJZF8pOwotCQlzZXJ2ZXJJZHMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFNlcnZlckZhY3RvcnlJZHNCeVR5cGUodHlwZUlkXyk7Ci0JCSAgLy8gcnNrcmVnCi0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgLy9zZXJ2ZXJJZHMgPSB3c2N0UmVnaXN0cnkuZ2V0U2VydmVyRmFjdG9yeUlkc0J5Q2xpZW50VHlwZSh0eXBlSWRfKTsKLQkJICAvLyByc2tyZWcKLSAgICAgICAgLy9zZXJ2ZXJJZHMgPSB3c2N0UmVnaXN0cnkuZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpOwotCQlzZXJ2ZXJJZHMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldEFsbENsaWVudFNlcnZlckZhY3RvcnlJZHMoKTsKLQkJLy8gcnNrcmVnCi0KLSAgICAgIH0KLSAgICAgIC8vIHJtIHNlcnZlcklkID0KLSAgICAgIC8vIHdzc3J0UmVnaXN0cnkuZ2V0U2VydmVyRmFjdG9yeUlkc0J5VHlwZSh3c2UuZ2V0V2ViU2VydmljZVR5cGUoKSk7Ci0gICAgICBpZiAoc2VydmVySWRzID09IG51bGwpIHsKLSAgICAgICAgc2VydmVySWRzID0gZ2V0QWxsU2VydmVyVHlwZXMoKTsKLSAgICAgIH0KLSAgICAgIFRyZWVJdGVtW10gcGFyZW50ID0gbmV3IFRyZWVJdGVtW3NlcnZlcklkcy5sZW5ndGhdOwotICAgICAgVHJlZUl0ZW1bXSBpdGVtID0gbmV3IFRyZWVJdGVtW3NlcnZlcklkcy5sZW5ndGhdOwotICAgICAgaWYgKHNlcnZlcklkcyAhPSBudWxsKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVySWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgU3RyaW5nIHNlcnZlciA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyTGFiZWxGb3JJZChzZXJ2ZXJJZHNbaV0pOwotICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZy50aGlzLnNlcnZlckxhYmVsc18ucHV0KHNlcnZlciwgc2VydmVySWRzW2ldKTsKLSAgICAgICAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlcklkc1tpXSk7Ci0gICAgICAgICAgICBJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoIWNhdGVnb3JpZXNfLmNvbnRhaW5zS2V5KHNlcnZlclR5cGUpICYmIHJ1bnRpbWVUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgY2F0ZWdvcmllc18ucHV0KHNlcnZlclR5cGUsIHJ1bnRpbWVUeXBlKTsKLSAgICAgICAgICAgICAgaWYgKGNhdGVnb3J5VHJlZUl0ZW0uZ2V0KHJ1bnRpbWVUeXBlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNhdGVnb3J5VGV4dCA9IHJ1bnRpbWVUeXBlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBJbWFnZSBjYXRlZ29yeUltYWdlID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKS5nZXRJbWFnZShydW50aW1lVHlwZSk7Ci0gICAgICAgICAgICAgICAgcGFyZW50W2ldID0gbmV3IFRyZWVJdGVtKHNlcnZlclR5cGVzVHJlZVswXSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgIHBhcmVudFtpXS5zZXRUZXh0KGNhdGVnb3J5VGV4dCk7Ci0gICAgICAgICAgICAgICAgcGFyZW50W2ldLnNldEltYWdlKGNhdGVnb3J5SW1hZ2UpOwotICAgICAgICAgICAgICAgIGNhdGVnb3J5VHJlZUl0ZW0ucHV0KHJ1bnRpbWVUeXBlLCBwYXJlbnRbaV0pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHBhcmVudFtpXSA9IChUcmVlSXRlbSkgY2F0ZWdvcnlUcmVlSXRlbS5nZXQocnVudGltZVR5cGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5VGV4dCA9IHNlcnZlclR5cGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBJbWFnZSBmYWN0b3J5SW1hZ2UgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldEltYWdlKHNlcnZlclR5cGUpOwotICAgICAgICAgICAgICBpdGVtW2ldID0gbmV3IFRyZWVJdGVtKHBhcmVudFtpXSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICBpdGVtW2ldLnNldFRleHQoZmFjdG9yeVRleHQpOwotICAgICAgICAgICAgICBpdGVtW2ldLnNldEltYWdlKGZhY3RvcnlJbWFnZSk7Ci0gICAgICAgICAgICAgIGl0ZW1baV0uc2V0RGF0YShzZXJ2ZXJUeXBlKTsKLSAgICAgICAgICAgICAgaWYgKGZhY3RvcnlUZXh0LmVxdWFsc0lnbm9yZUNhc2UoZGVmYXVsdFNlcnZlcl8pICYmICFleGlzdGluZ1NlcnZlcikgewotICAgICAgICAgICAgICAgIHNlcnZlckxpc3Quc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHsgaXRlbVtpXX0pOwotICAgICAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyXyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJMYWJlbF8gPSBmYWN0b3J5VGV4dDsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8gPSAoU3RyaW5nKSBzZXJ2ZXJMYWJlbHNfLmdldChzZWxlY3RlZFNlcnZlckxhYmVsXyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbGwgc2VydmVycyBpbiB0aGUgd29ya3NwYWNlCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmdbXSBvZiBleGlzdGluZyBzZXJ2ZXIgbmFtZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGdldEFsbEV4aXN0aW5nU2VydmVycygpIHsKLSAgICAgIFZlY3RvciBzZXJ2ZXJJZHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICB7Ci0gICAgICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgICAgIGlmIChzZXJ2ZXJzICE9IG51bGwgJiYgc2VydmVycy5sZW5ndGghPTApIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIHNlcnZlcnNbaV07Ci0gICAgICAgICAgICBzZXJ2ZXJJZHMuYWRkKHNlcnZlci5nZXROYW1lKCkpOwotICAgICAgICAgICAgZXhpc3RpbmdTZXJ2ZXJzVGFibGVfLnB1dChzZXJ2ZXIuZ2V0TmFtZSgpLCBzZXJ2ZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIChTdHJpbmdbXSkgc2VydmVySWRzLnRvQXJyYXkobmV3IFN0cmluZ1tzZXJ2ZXJJZHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCBzZXJ2ZXIgdHlwZXMgYXZhaWxhYmxlIGZvciBjcmVhdGlvbgotICAgICAqIAotICAgICAqIEByZXR1cm4gU3RyaW5nW10gb2Ygc2VydmVyIG5hbWVzCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRBbGxTZXJ2ZXJUeXBlcygpIHsKLSAgICAgIFZlY3RvciBzZXJ2ZXJUeXBlc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBJU2VydmVyVHlwZVtdIGRlZmF1bHRTZXJ2ZXJzTGlzdCA9IFNlcnZlckNvcmUuZ2V0U2VydmVyVHlwZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmYXVsdFNlcnZlcnNMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSAoSVNlcnZlclR5cGUpIGRlZmF1bHRTZXJ2ZXJzTGlzdFtpXTsKLSAgICAgICAgc2VydmVyVHlwZXNfLmFkZChzZXJ2ZXJUeXBlLmdldElkKCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIChTdHJpbmdbXSkgc2VydmVyVHlwZXNfLnRvQXJyYXkobmV3IFN0cmluZ1tzZXJ2ZXJUeXBlc18uc2l6ZSgpXSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9UeXBlU2VsZWN0aW9uRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9UeXBlU2VsZWN0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MzNhNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvVHlwZVNlbGVjdGlvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFR5cGVTZWxlY3Rpb25GaWx0ZXIKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0U2VsZWN0aW9uXzsKLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZVR5cGVCeUluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbiwgSGFzaE1hcCB3ZWJTZXJ2aWNlVHlwZXMpCi0gIHsKLSAgICAgICAgCi0gICAgSGFzaFNldCBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgaWYgKGluaXRpYWxTZWxlY3Rpb24gIT0gbnVsbCAmJiBpbml0aWFsU2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIAotICAgICAgLy8gQ2hlY2sgZm9yIG51bGwgaW5pdGlhbCBzZWxlY3Rpb24KLSAgICAgIE9iamVjdCBpbml0aWFsT2JqZWN0ID0gaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChpbml0aWFsT2JqZWN0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgLy8gTWF0Y2ggdXAgcmVzb3VyY2UgdHlwZSBtZXRhZGF0YSB3aXRoIGluaXRpYWwgc2VsZWN0aW9uCi0gICAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIElXZWJTZXJ2aWNlVHlwZSB3c3QgPSAoSVdlYlNlcnZpY2VUeXBlKWl0ZXIubmV4dCgpOwotICAgICAgICBTdHJpbmcgdHlwZUlkID0gKFN0cmluZyl3c3QuZ2V0SWQoKTsKLSAgICAgICAgaWYgKCFzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlSWQpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nW10gcmVzb3VyY2VUeXBlcyA9IHdzdC5nZXRSZXNvdXJjZVR5cGVNZXRhZGF0YSgpOwotICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxyZXNvdXJjZVR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZVR5cGVzW2ldIT1udWxsKQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGlmICgoaW5pdGlhbE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSkuZW5kc1dpdGgocmVzb3VyY2VUeXBlc1tpXSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIHJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24oaW5pdGlhbE9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbmFtZSA9IGluaXRpYWxPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHJlc291cmNlICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG5hbWUgPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBuYW1lID0gaW5pdGlhbE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHdzdC5nZXRFeHRlbnNpb25NZXRhZGF0YSgpOwotICAgICAgICAgICAgICAgIGlmIChhY2NlcHRzTmFtZShuYW1lLCBleHRlbnNpb25zKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcy5hZGQodHlwZUlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICB9ICAgIAotICAKLSAgICBpZiAoc3VwcG9ydGVkVHlwZXMuaXNFbXB0eSgpKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAoU3RyaW5nW10pc3VwcG9ydGVkVHlwZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8vCi0gIC8vIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhY2NlcHRhYmxlIGJhc2VkIHVwb24gaXRzIGV4dGVuc2lvbgotICAvLwotICBwcml2YXRlIGJvb2xlYW4gYWNjZXB0c05hbWUgKCBTdHJpbmcgbmFtZSwgU3RyaW5nW10gZXh0ZW5zaW9ucykKLSAgewotICAgIC8vUmV0dXJuIHRydWUgaWYgImFsbCIgZXh0ZW5zaW9ucyBhcmUgc3VwcG9ydGVkLgotCi0gICAgaWYgKGV4dGVuc2lvbnNbMF0hPW51bGwpCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbMF0uZXF1YWxzKCJhbGwiKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaT0wOyBpPGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbaV0hPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKGV4dGVuc2lvbnNbaV0pKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9UeXBlU2VsZWN0aW9uTWV0YWRhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1R5cGVTZWxlY3Rpb25NZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOThjMTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1R5cGVTZWxlY3Rpb25NZXRhZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0gIC8vCi0gIC8vIFRoaXMgY2xhc3MgaG9sZHMgdGhlIHNldCBvZiBkaXN0aW5ndWlzaGluZyBmYWN0b3JzIGluIGRldGVybWluaW5nIAotICAvLyB0aGUgZGVmYXVsdCBXZWIgc2VydmljZSB0eXBlLiAgVGhlIGRlZmF1bHQgV2ViIFNlcnZpY2UgdHlwZSB3aWxsIGJlIGRldGVybWluZWQKLSAgLy8gYnkgcGF0dGVybiBtYXRjaGluZyB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gd2l0aCB0aGUgc3VwcG9ydGVkIGV4dGVuc2lvbiAKLSAgLy8gYW5kIHRoZSByZXNvdXJjZSB0eXBlIG1ldGFkYXRhIHNwZWNpZmllZCBpbiB0aGUgbWFuaWZlc3QgZmlsZS4KLSAgLy8KLSAgcHVibGljIGNsYXNzIFR5cGVTZWxlY3Rpb25NZXRhZGF0YQotICB7Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAgcHVibGljIFN0cmluZ1tdIGV4dGVuc2lvbk1ldGE7Ci0gICAgcHVibGljIFN0cmluZ1tdIHJlc291cmNlVHlwZU1ldGE7Ci0KLSAgICBwdWJsaWMgVHlwZVNlbGVjdGlvbk1ldGFkYXRhKFN0cmluZyBleHRlbnNpb25NRCwgU3RyaW5nIHJlc291cmNlVHlwZU1EKQotICAgIHsKLSAgICAgIHNldEV4dGVuc2lvbk1ldGFkYXRhKGV4dGVuc2lvbk1EKTsKLSAgICAgIHNldFJlc291cmNlVHlwZU1ldGFkYXRhKHJlc291cmNlVHlwZU1EKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uTWV0YWRhdGEoU3RyaW5nIGV4dGVuc2lvbk1ldGFkYXRhKQotICAgIHsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZXh0ZW5zaW9uTWV0YWRhdGEpOwotICAgICAgZXh0ZW5zaW9uTWV0YSA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07Ci0gICAgICBpbnQgaT0wOwotICAgICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBTdHJpbmcgZXh0ZW4gPSAoU3RyaW5nKXN0Lm5leHRUb2tlbigpOwotICAgICAgICBpZiAoZXh0ZW4hPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBleHRlbnNpb25NZXRhW2ldPWV4dGVuOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeHRlbnNpb25NZXRhZGF0YSgpCi0gICAgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbk1ldGE7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZU1ldGFkYXRhKFN0cmluZyByZXNvdXJjZVR5cGVNZXRhZGF0YSkKLSAgICB7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlc291cmNlVHlwZU1ldGFkYXRhKTsKLSAgICAgIHJlc291cmNlVHlwZU1ldGEgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgICAgaW50IGk9MDsKLSAgICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc291cmNlVHlwZSA9IChTdHJpbmcpc3QubmV4dFRva2VuKCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZVR5cGUhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhW2ldPXJlc291cmNlVHlwZTsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlVHlwZU1ldGFkYXRhKCkKLSAgICB7Ci0gICAgICByZXR1cm4gcmVzb3VyY2VUeXBlTWV0YTsKLSAgICB9Ci0KLSAgfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZTQzNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHMuQ2xpZW50UHJlQXNzZW1ibHlGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzLkNsaWVudFByZURlcGxveUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHMuQ2xpZW50UHJlRGV2ZWxvcEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHMuQ2xpZW50UHJlSW5zdGFsbEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLkxhYmVsc0FuZElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUucmVnaXN0cnkuQ29tbWFuZFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IGltcGxlbWVudHMgQ29tbWFuZFJlZ2lzdHJ5Ci17Ci0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgVmVjdG9yICBjb25maWdFbGVtc187Ci0gIHByaXZhdGUgSGFzaFNldCB0eXBlTmFtZXNfOyAgLy8gbm8gZHVwbGljYXRlIGNsaWVudCB0eXBlIG5hbWVzCi0gIHByaXZhdGUgSGFzaE1hcCB0eXBlc187Ci0gIHByaXZhdGUgSGFzaE1hcCBjbGllbnRUeXBlQW5kSWRzXzsKLSAgcHJpdmF0ZSBIYXNoTWFwIGNsaWVudElkVG9MYWJlbF87Ci0KLSAgcHJpdmF0ZSBIYXNoTWFwIHdlYlNlcnZpY2VTZXJ2ZXJzOwotICBwcml2YXRlIEhhc2hNYXAgd2ViU2VydmljZVJ1bnRpbWVzOwotICBwcml2YXRlIEhhc2hNYXAgd2ViU2VydmljZUNsaWVudFR5cGVzOwotICAKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnlfOwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnlfOwotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnlfOwotICBwcml2YXRlIEhhc2hNYXAgICAgICAgICAgICAgZmFjdG9yeUNhY2hlXzsKLSAgICAKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5KCkKLSAgewotICB9Ci0gIAotICAvLwotICAvLyBMb2FkcyBXZWJTZXJ2aWNlQ2xpZW50VHlwZSBvYmplY3RzIGludG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gVGhpcyBpcyBkb25lIGJ5IHF1ZXJ5aW5nIHRoZSBwbHVnaW4gcmVnaXN0cnkgZm9yIGFsbCBleHRlbnNpb25zCi0gIC8vIGhhbmdpbmcgb24gdGhlIHdlYlNlcnZpY2VDbGllbnRUeXBlIGV4dGVuc2lvbiBwb2ludC4gRXh0ZW5zaW9ucwotICAvLyBtdXN0IGltcGxlbWVudCB0aGUgb3JnLmVjbGlwc2UuanN0LndzLnVpLndpemFyZC5XZWJTZXJ2aWNlQ2xpZW50VHlwZQotICAvLyBpbnRlcmZhY2UuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkVHlwZXMgKCkKLSAgeyAgICAKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJTZXJ2aWNlQ2xpZW50VHlwZSIpOwotCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PGNvbmZpZy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IGNvbmZpZ1tpZHhdOwotCi0gICAgICBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJTZXJ2aWNlU2VydmVyIikpIHsgCi0gICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gbmV3IFdlYlNlcnZpY2VTZXJ2ZXIoZWxlbSk7Ci0gICAgICAgIHdlYlNlcnZpY2VTZXJ2ZXJzLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgd3NzKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygid2ViU2VydmljZVJ1bnRpbWUiKSkgewotICAgICAgICBXZWJTZXJ2aWNlUnVudGltZSBydCA9IG5ldyBXZWJTZXJ2aWNlUnVudGltZShlbGVtKTsKLSAgICAgICAgd2ViU2VydmljZVJ1bnRpbWVzLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgcnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJTZXJ2aWNlQ2xpZW50VHlwZSIpKQotICAgICAgewotCi0gICAgICAgIFN0cmluZyBuYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoICJuYW1lIiApOyAgICAgICAgICAgICAgICAKLSAgICAgICAgdHlwZU5hbWVzXy5hZGQoIG5hbWUgKTsgIAotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHR5cGVJZCA9IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGllbnRUeXBlIik7Ci0gICAgICAgIGlmICh0eXBlSWQ9PW51bGwpIHsKLSAgICAgICAgICB0eXBlSWQgPSBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIik7ICAgICAgIAotICAgICAgICBjbGllbnRUeXBlQW5kSWRzXy5wdXQobmFtZSwgdHlwZUlkKTsKLSAgICAgICAgU3RyaW5nIHNlcnZlcklkID0gZWxlbS5nZXRBdHRyaWJ1dGUoInNlcnZlciIpOwotICAgICAgICBTdHJpbmcgcnVudGltZUlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoInJ1bnRpbWUiKTsKLSAgICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlIHdzdCA9IG5ldyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUoc2VydmVySWQsIHJ1bnRpbWVJZCwgdHlwZUlkLCBuYW1lLCBlbGVtKTsKLSAgICAgICAgd2ViU2VydmljZUNsaWVudFR5cGVzLnB1dChpZCwgd3N0KTsKLSAgICAgICAgdHlwZXNfLnB1dChpZCwgbnVsbCApOyAgCi0gICAgICAgIGNsaWVudElkVG9MYWJlbF8ucHV0KCB0eXBlSWQsIG5hbWUgKTsKLSAgICAgIH0KLSAgICAgIGNvbmZpZ0VsZW1zXy5hZGQoIGVsZW0gKTsKLSAgICAgIAotICAgIH0KLSAgfQotCi0gCi0gIC8qKgotICAqIExvYWRzIFdlYlNlcnZpY2VDbGllbnRUeXBlIG9iamVjdHMgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAqIFNlZSBtZXRob2QgZ2V0SW5zdGFuY2UoKS4KLSAgKi8KLSAgcHJpdmF0ZSB2b2lkIGxvYWQgKCkKLSAgewotICAgIHR5cGVOYW1lc18gPSBuZXcgSGFzaFNldCgpOwotICAgIGNvbmZpZ0VsZW1zXyA9IG5ldyBWZWN0b3IoKTsKLSAgICB0eXBlc18gICAgICAgPSBuZXcgSGFzaE1hcCgpOwotICAgIGNsaWVudFR5cGVBbmRJZHNfID0gbmV3IEhhc2hNYXAoKTsKLSAgICB3ZWJTZXJ2aWNlQ2xpZW50VHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHdlYlNlcnZpY2VSdW50aW1lcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgd2ViU2VydmljZVNlcnZlcnMgPSBuZXcgSGFzaE1hcCgpOwotICAgIGNsaWVudElkVG9MYWJlbF8gID0gbmV3IEhhc2hNYXAoKTsKLSAgICBsb2FkVHlwZXMoKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgKiBAcmV0dXJuIEEgc2luZ2xldG9uIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5KCk7Ci0gICAgICBpbnN0YW5jZV8ubG9hZCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZVJ1bnRpbWUgZ2V0UnVudGltZUJ5SWQoIFN0cmluZyBpZCApCi0gIHsKLSAgICByZXR1cm4gKFdlYlNlcnZpY2VSdW50aW1lKXdlYlNlcnZpY2VSdW50aW1lcy5nZXQoIGlkICk7IAotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVzQnlUeXBlKFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtcyA9IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KHR5cGVJZCk7Ci0gICAgVmVjdG9yIHJ1bnRpbWVzVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIFN0cmluZ1tdIHJ1bnRpbWVJZHMgPSBuZXcgU3RyaW5nW2VsZW1zLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaT0wOyBpPGVsZW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gKElDb25maWd1cmF0aW9uRWxlbWVudCllbGVtc1tpXTsKLSAgICAgIHJ1bnRpbWVJZHNbaV0gPSBlbGVtLmdldEF0dHJpYnV0ZSgicnVudGltZSIpOwotICAgIH0KLSAgICByZXR1cm4gcnVudGltZUlkczsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGRvZXNSdW50aW1lU3VwcG9ydEoyRUVMZXZlbChTdHJpbmcgajJlZVZlcnNpb25JZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIElXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSAoSVdlYlNlcnZpY2VSdW50aW1lKXdlYlNlcnZpY2VSdW50aW1lcy5nZXQocnVudGltZUlkKTsKLSAgICBTdHJpbmdbXSBqMmVlVmVyc2lvbnMgPSB3c3IuZ2V0SjJFRVZlcnNpb25zKCk7Ci0gICAgaWYgKGoyZWVWZXJzaW9ucz09bnVsbCB8fCBqMmVlVmVyc2lvbnMubGVuZ3RoPT0wKSAKLSAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAgIGZvcihpbnQgaT0wOyBpPGoyZWVWZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoajJlZVZlcnNpb25zW2ldLmVxdWFscyhqMmVlVmVyc2lvbklkKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAKLSAgCi0gIHB1YmxpYyBib29sZWFuIGRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChTdHJpbmcgc2VydmVyVGFyZ2V0SWQsIFN0cmluZyBydW50aW1lSWQpCi0gIHsKLSAgICAvL1ZlY3RvciBzZXJ2ZXJGYWN0b3J5SWRzID0gbmV3IFZlY3RvcigpOwotICAgIEl0ZXJhdG9yIGl0ID0gd2ViU2VydmljZUNsaWVudFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlIHdzc3J0ID0gKFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSlpdC5uZXh0KCk7Ci0gICAgICBpZiAod3NzcnQucnVudGltZUlkXyE9bnVsbCkgewotICAgICAgICBpZiAoKHdzc3J0LnJ1bnRpbWVJZF8pLmVxdWFsc0lnbm9yZUNhc2UocnVudGltZUlkKSkgewotICAgICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHdzc3J0LnNlcnZlcklkXyk7Ci0gICAgICAgICAgU3RyaW5nIHRoaXNGYWN0b3J5SWQgPSB3c3MuZ2V0RmFjdG9yeUlkKCk7Ci0gICAgICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUodGhpc0ZhY3RvcnlJZCk7Ci0gICAgICAgICAgaWYgKHNlcnZlclR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyB0aGlzU2VydmVyVGFyZ2V0SWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsgICAgICAgICAgCi0gICAgICAgICAgaWYgKHRoaXNTZXJ2ZXJUYXJnZXRJZC5lcXVhbHMoc2VydmVyVGFyZ2V0SWQpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCA8Y29kZT5XZWJTZXJ2aWNlQ2xpZW50VHlwZTwvY29kZT4KLSAgKiBvYmplY3RzLgotICAqIEByZXR1cm4gVGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VDbGllbnRUeXBlPC9jb2RlPgotICAqIG9iamVjdHMuCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlQ2xpZW50VHlwZU5hbWVzICgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZ1tdKXR5cGVOYW1lc18udG9BcnJheSggbmV3IFN0cmluZ1swXSApOwotICB9Ci0KLSAgcHVibGljIExhYmVsc0FuZElkcyBnZXRDbGllbnRUeXBlTGFiZWxzKCkKLSAgewotICAgIExhYmVsc0FuZElkcyBsYWJlbElkcyA9IG5ldyBMYWJlbHNBbmRJZHMoKTsKLSAgICBJdGVyYXRvciAgICAgaXRlcmF0b3IgPSBjbGllbnRJZFRvTGFiZWxfLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICBpbnQgICAgICAgICAgc2l6ZSAgICAgPSBjbGllbnRJZFRvTGFiZWxfLnNpemUoKTsKLSAgICBTdHJpbmdbXSAgICAgbGFiZWxzICAgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgIFN0cmluZ1tdICAgICBpZHMgICAgICA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgaW50ICAgICAgICAgIGluZGV4ICAgID0gMDsKLSAgICAKLSAgICBsYWJlbElkcy5zZXRMYWJlbHNfKCBsYWJlbHMgKTsKLSAgICBsYWJlbElkcy5zZXRJZHNfKCBpZHMgKTsKLSAgICAKLSAgICB3aGlsZSggaXRlcmF0b3IuaGFzTmV4dCgpICkgCi0gICAgewotICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAKLSAgICAgIGlkc1tpbmRleF0gICAgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOwotICAgICAgbGFiZWxzW2luZGV4XSA9IChTdHJpbmcpZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgIGluZGV4Kys7Ci0gICAgfSAgICAKLSAgICAKLSAgICByZXR1cm4gbGFiZWxJZHM7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBnaXZlbiB0aGUgc2VydmVyLCBydW50aW1lLCBhbmQgdHlwZSBhdHRyaWJ1dGVzCi0gICogVGhlIGJlbmVmaXQgb2YgZ2V0dGluZyB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGlzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MKLSAgKiBmaWxlIGFuZCBwbHVnaW4gYXJlIG5vdCBsb2FkZWQgaW1tZWRpYXRlbHkuCi0gICogQHBhcmFtIHNlcnZlciBsYWJlbAotICAqIEBwYXJhbSBydW50aW1lIGxhYmVsCi0gICogQHBhcmFtIHR5cGUgbGFiZWwKLSAgKiBAcmV0dXJuIElDb25maWd1cmF0aW9uIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihTdHJpbmcgc2VydmVySWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZUNsaWVudFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSB3c3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUpaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmICh3c3NydC5oYXNDb25maWd1cmF0aW9uRWxlbWVudEZvcihzZXJ2ZXJJZCwgcnVudGltZUlkLCB0eXBlSWQpKSB7Ci0gICAgICAgICAgcmV0dXJuIHdzc3J0LmVsZW1lbnRfOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlnRWxlbWVudEZvcihTdHJpbmcgZmFjdG9yeUlkLCBTdHJpbmcgcnVudGltZUlkLCBTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VDbGllbnRUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUgd3NzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlKWl0ZXIubmV4dCgpOwotICAgICAgICBpZiAod3NzcnQuaGFzQ29uZmlnRWxlbWVudEZvcihmYWN0b3J5SWQsIHJ1bnRpbWVJZCwgdHlwZUlkKSkgewotICAgICAgICAgIHJldHVybiB3c3NydC5lbGVtZW50XzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRFeHRlbnNpb25JZEZvcihTdHJpbmcgc2VydmVySWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0eXBlSWQpIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGdldENvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKHNlcnZlcklkLCBydW50aW1lSWQsIHR5cGVJZCk7Ci0gICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotICB9Ci0KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudEJ5SWQoU3RyaW5nIGlkKSB7Ci0gICAgCi0gICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlIHdzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlKXdlYlNlcnZpY2VDbGllbnRUeXBlcy5nZXQoaWQpOwotICAgIHJldHVybiAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KXdzcnQuZWxlbWVudF87ICAgIAotCi0gIH0KLSAgCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWd1cmF0aW9uRWxlbWVudChTdHJpbmcgY2xpZW50VHlwZUlkKQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ0VsZW1zXy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudClpdC5uZXh0KCk7Ci0gICAgICBTdHJpbmcgY2xpZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGllbnRUeXBlIik7Ci0gICAgICBpZiAoY2xpZW50VHlwZSAhPSBudWxsICYmIGNsaWVudFR5cGUuZXF1YWxzKGNsaWVudFR5cGVJZCkpCi0gICAgICAgIHYuYWRkKGVsZW1lbnQpOwotICAgIH0KLSAgICByZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKXYudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWd1cmF0aW9uRWxlbWVudChTdHJpbmcgY2xpZW50VHlwZUlkLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ0VsZW1zXy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudClpdC5uZXh0KCk7Ci0gICAgICBTdHJpbmcgY2xpZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGllbnRUeXBlIik7Ci0gICAgICBTdHJpbmcgcnVudGltZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lIik7Ci0gICAgICBpZiAoY2xpZW50VHlwZSAhPSBudWxsICYmIHJ1bnRpbWUgIT0gbnVsbCAmJiBjbGllbnRUeXBlLmVxdWFscyhjbGllbnRUeXBlSWQpICYmIHJ1bnRpbWUuZXF1YWxzKHJ1bnRpbWVJZCkpCi0gICAgICAgIHYuYWRkKGVsZW1lbnQpOwotICAgIH0KLSAgICByZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKXYudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdKTsKLSAgfQotICAKLQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySWRGb3JGYWN0b3J5SWQoU3RyaW5nIGZhY3RvcnlJZCkgewotCi0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzcy5nZXRGYWN0b3J5SWQoKS5lcXVhbHMoZmFjdG9yeUlkKSkgewotICAgICAgICByZXR1cm4gd3NzLmdldElkKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckZhY3RvcnlJZEJ5U2VydmVyTGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzcy5nZXRMYWJlbCgpLmVxdWFscyhsYWJlbCkpIHsKLSAgICAgICAgcmV0dXJuIHdzcy5nZXRGYWN0b3J5SWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgV2ViU2VydmljZVJ1bnRpbWUgZ2V0V2ViU2VydmljZVJ1bnRpbWVCeU5hbWUoU3RyaW5nIHJ1bnRpbWVOYW1lKSB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VSdW50aW1lcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVJ1bnRpbWUgd3NyID0gKFdlYlNlcnZpY2VSdW50aW1lKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzci5nZXRMYWJlbCgpLmVxdWFscyhydW50aW1lTmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIHdzcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgV2ViU2VydmljZVNlcnZlciBnZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoU3RyaW5nIGZhY3RvcnlJZCkgewotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlU2VydmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVNlcnZlciB3c3MgPSAoV2ViU2VydmljZVNlcnZlcilpdGVyLm5leHQoKTsKLSAgICAgIGlmICh3c3MuZ2V0RmFjdG9yeUlkKCkuZXF1YWxzKGZhY3RvcnlJZCkpIHsKLSAgICAgICAgcmV0dXJuIHdzczsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySW5zdGFuY2VMYWJlbEZyb21JbnN0YW5jZUlkKCBTdHJpbmcgaW5zdGFuY2VJZCApCi0gIHsKLSAgICBJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlciggaW5zdGFuY2VJZCApOwotICAgIAotICAgIHJldHVybiBzZXJ2ZXIuZ2V0TmFtZSgpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpIHsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJGYWN0b3J5SWRzID0gbmV3IFN0cmluZ1t3ZWJTZXJ2aWNlU2VydmVycy5zaXplKCldOwotICAgIGludCBpPTA7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzcy5nZXRGYWN0b3J5SWQoKSE9bnVsbCkgewotICAgICAgICBzZXJ2ZXJGYWN0b3J5SWRzW2ldPXdzcy5nZXRGYWN0b3J5SWQoKTsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc2VydmVyRmFjdG9yeUlkczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBbGxDbGllbnRSdW50aW1lcygpIHsKLSAgICBTdHJpbmdbXSBydW50aW1lcyA9IG5ldyBTdHJpbmdbd2ViU2VydmljZVJ1bnRpbWVzLnNpemUoKV07Ci0gICAgaW50IGk9MDsKLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVJ1bnRpbWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSAoV2ViU2VydmljZVJ1bnRpbWUpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NyLmdldElkKCkgIT0gbnVsbCkgewotICAgICAgICBydW50aW1lc1tpXT13c3IuZ2V0SWQoKTsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcnVudGltZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVMYWJlbEJ5SWQoU3RyaW5nIHJ1bnRpbWVJZCkgewotICAgIFdlYlNlcnZpY2VSdW50aW1lIHdzUnVudGltZSA9IChXZWJTZXJ2aWNlUnVudGltZSl3ZWJTZXJ2aWNlUnVudGltZXMuZ2V0KHJ1bnRpbWVJZCk7Ci0gICAgaWYgKHdzUnVudGltZSE9bnVsbCkgewotICAgICAgcmV0dXJuIHdzUnVudGltZS5nZXRMYWJlbCgpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50VHlwZUlkQnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgcmV0dXJuIChTdHJpbmcpY2xpZW50VHlwZUFuZElkc18uZ2V0KG5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgSVdlYlNlcnZpY2VSdW50aW1lIGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgcmV0dXJuIChJV2ViU2VydmljZVJ1bnRpbWUpd2ViU2VydmljZVJ1bnRpbWVzLmdldChydW50aW1lSWQpOyAKLSAgfQotCi0KLSAgLyoqCi0gICogR2V0cyB0aGUgcnVudGltZSBJRHMgb2YgYWxsIHdlYiBzZXJ2aWNlIHNlcnZlciBydW50aW1lIHR5cGUKLSAgKiB3aXRoIGFuIHNlcnZlciBmYWN0b3J5IElEIGVxdWFscyB0byB0aGUgaW5wdXQKLSAgKiBAcGFyYW0gc2VydmVyIGZhY3RvcnkgSUQKLSAgKiBAcmV0dXJuIGFycmF5IG9mIHJ1bnRpbWUgSURzCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lSWRzQnlTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJRCkgewotICAgIFZlY3RvciBydW50aW1lSWRzID0gbmV3IFZlY3RvcigpOwotICAgIEl0ZXJhdG9yIGl0ID0gd2ViU2VydmljZUNsaWVudFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlIHdzc3J0ID0gKFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSlpdC5uZXh0KCk7Ci0gICAgICBpZiAod3NzcnQuc2VydmVySWRfIT1udWxsKSB7Ci0gICAgICAJU3RyaW5nIHNlcnZlcklkID0gd3NzcnQuc2VydmVySWRfOwotICAgICAgCVdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHNlcnZlcklkKTsKLSAgICAgIAlTdHJpbmcgd3NzZklkID0gd3NzLmdldEZhY3RvcnlJZCgpOwotICAgICAgCWlmICh3c3NmSWQuZXF1YWxzKHNlcnZlckZhY3RvcnlJRCkpCi0gICAgICAJCXJ1bnRpbWVJZHMuYWRkKHdzc3J0LnJ1bnRpbWVJZF8pOwotICAgICAgCS8qCi0gICAgICAgIFN0cmluZyB3c3NGYWN0b3J5SWQgPSAoKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHdzc3J0LnNlcnZlcklkXykpLmdldEZhY3RvcnlJZCgpOwotICAgICAgICBpZiAod3NzRmFjdG9yeUlkLmVxdWFsc0lnbm9yZUNhc2Uoc2VydmVyRmFjdG9yeUlEKSkgewotICAgICAgICAgIHJ1bnRpbWVJZHMuYWRkKHdzc3J0LnJ1bnRpbWVJZF8pOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10pcnVudGltZUlkcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckZhY3RvcnlJZHNCeUNsaWVudFR5cGUoU3RyaW5nIGNsaWVudFR5cGVOYW1lKSB7Ci0gICAgCi0gICAgVmVjdG9yIGZhY3RvcnlJZHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgU3RyaW5nIGNsaWVudFR5cGVJZCA9IGdldENsaWVudFR5cGVJZEJ5TmFtZShjbGllbnRUeXBlTmFtZSk7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VDbGllbnRUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUgd3NzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKCh3c3NydC50eXBlSWRfKS5lcXVhbHNJZ25vcmVDYXNlKGNsaWVudFR5cGVJZCkpIHsKLSAgICAgICAgV2ViU2VydmljZVNlcnZlciB3c3MgPSAoV2ViU2VydmljZVNlcnZlcil3ZWJTZXJ2aWNlU2VydmVycy5nZXQod3NzcnQuc2VydmVySWRfKTsKLSAgICAgICAgZmFjdG9yeUlkcy5hZGQod3NzLmdldEZhY3RvcnlJZCgpKTsKLSAgICAgIH0KLSAgCi0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10pZmFjdG9yeUlkcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOyAgIAotCi0gIH0KLQotICAvKioKLSAgKiBHZXRzIHRoZSBzZXJ2ZXIgZmFjdG9yeUlkcyBvZiBhbGwgd2ViIHNlcnZpY2Ugc2VydmVyIHJ1bnRpbWUgdHlwZQotICAqIHdpdGggYW4gcnVudGltZSBJZCBlcXVhbHMgdG8gdGhlIGlucHV0Ci0gICogQHBhcmFtIHJ1bnRpbWUgSWQKLSAgKiBAcmV0dXJuIGFycmF5IG9mIGZhY3RvcnkgSWRzCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJGYWN0b3J5SWRzQnlSdW50aW1lSWQoU3RyaW5nIHJ1bnRpbWVJRCkgewotICAgIFZlY3RvciBzZXJ2ZXJGYWN0b3J5SWRzID0gbmV3IFZlY3RvcigpOwotICAgIEl0ZXJhdG9yIGl0ID0gd2ViU2VydmljZUNsaWVudFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlIHdzc3J0ID0gKFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSlpdC5uZXh0KCk7Ci0gICAgICBpZiAod3NzcnQucnVudGltZUlkXyE9bnVsbCkgewotICAgICAgICBpZiAoKHdzc3J0LnJ1bnRpbWVJZF8pLmVxdWFsc0lnbm9yZUNhc2UocnVudGltZUlEKSkgewotICAgICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHdzc3J0LnNlcnZlcklkXyk7Ci0gICAgICAgICAgc2VydmVyRmFjdG9yeUlkcy5hZGQod3NzLmdldEZhY3RvcnlJZCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKFN0cmluZ1tdKXNlcnZlckZhY3RvcnlJZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHdlYlNlcnZpY2VDbGllbnRSdW50aW1lVHlwZUV4aXN0cyhTdHJpbmcgc2VydmVySWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0eXBlSWQpIHsKLSAgICBpZiAoZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVySWQsIHJ1bnRpbWVJZCwgdHlwZUlkKT09bnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLQotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckZhY3RvcnlJZHNCeVR5cGUoU3RyaW5nIGNsaWVudFR5cGVJZCkKLSAgewotICAgIFN0cmluZyBjbGllbnRUeXBlTmFtZSA9IChTdHJpbmcpY2xpZW50SWRUb0xhYmVsXy5nZXQoY2xpZW50VHlwZUlkKTsKLSAgICByZXR1cm4gZ2V0U2VydmVyRmFjdG9yeUlkc0J5Q2xpZW50VHlwZShjbGllbnRUeXBlTmFtZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2VydmVyU3VwcG9ydGVkRm9yQ2hvc2VuVHlwZShTdHJpbmcgY2xpZW50VHlwZUlkLCBTdHJpbmcgc2VydmVyRmFjdG9yeUlEKQotICB7Ci0gICAgU3RyaW5nW10gc3VwcG9ydGVkU2VydmVyRmFjdG9yeUlkcyA9IGdldFNlcnZlckZhY3RvcnlJZHNCeVR5cGUoY2xpZW50VHlwZUlkKTsKLSAgICBpZiAoc3VwcG9ydGVkU2VydmVyRmFjdG9yeUlkcyE9bnVsbCAmJiBzdXBwb3J0ZWRTZXJ2ZXJGYWN0b3J5SWRzLmxlbmd0aD4wKQotICAgIHsKLQkgICAgZm9yIChpbnQgaT0wOyBpPHN1cHBvcnRlZFNlcnZlckZhY3RvcnlJZHMubGVuZ3RoOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3VwcG9ydGVkU2VydmVyRmFjdG9yeUlkc1tpXS5lcXVhbHMoc2VydmVyRmFjdG9yeUlEKSkKLQkgICAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfSAgCi0KLSAgLyoqCi0gICogIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSBpcyB0aGUgY2FjaGVkIG1ldGFkYXRhIGluY2x1ZGluZyB0aGUgSUNvbmZpZ3VyYXRpb24KLSAgKi8KLSAgcHVibGljIGZpbmFsIGNsYXNzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZQotICB7Ci0gICAgCi0gICBwcml2YXRlIFN0cmluZyB0eXBlSWRfID0gbnVsbDsKLSAgIHByaXZhdGUgU3RyaW5nIHNlcnZlcklkXyA9IG51bGw7Ci0gICBwcml2YXRlIFN0cmluZyBydW50aW1lSWRfID0gbnVsbDsKLSAgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnRfOwotICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVzU2VydmVyUnVudGltZV8gPSBmYWxzZTsKLSAgIHByaXZhdGUgU3RyaW5nIGxhYmVsXzsKLSAgIAotICAgcHJvdGVjdGVkIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZShTdHJpbmcgc2VydmVySWQsIFN0cmluZyBydW50aW1lSWQsU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGxhYmVsLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSkKLSAgIHsKLSAgICB0eXBlSWRfID0gbmV3IFN0cmluZyh0eXBlSWQudHJpbSgpKTsKLSAgICBpZiAoc2VydmVySWQhPW51bGwpCi0gICAgICBzZXJ2ZXJJZF8gPSBuZXcgU3RyaW5nKHNlcnZlcklkLnRyaW0oKSk7Ci0gICAgaWYgKHJ1bnRpbWVJZCE9bnVsbCkKLSAgICAgIHJ1bnRpbWVJZF8gPSBuZXcgU3RyaW5nKHJ1bnRpbWVJZC50cmltKCkpOwotICAgIGVsZW1lbnRfID0gZWxlbTsKLSAgICBpZiAoc2VydmVySWRfIT1udWxsICYmIHJ1bnRpbWVJZF8hPW51bGwpIHsKLSAgICAgIHJlcXVpcmVzU2VydmVyUnVudGltZV8gPSB0cnVlOwotICAgIH0KLQotICAgIGxhYmVsXyA9IGxhYmVsOwotICAgfQotCi0gICBwdWJsaWMgYm9vbGVhbiBoYXNDb25maWd1cmF0aW9uRWxlbWVudEZvcihTdHJpbmcgc2VydmVySUQsIFN0cmluZyBydW50aW1lSUQsIFN0cmluZyB0eXBlSUQpIHsKLSAgICBpZiAodHlwZUlkXy5lcXVhbHNJZ25vcmVDYXNlKHR5cGVJRCkgJiYgIXJlcXVpcmVzU2VydmVyUnVudGltZV8pCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChyZXF1aXJlc1NlcnZlclJ1bnRpbWVfKSB7Ci0gICAgICBpZiAodHlwZUlkXy5lcXVhbHNJZ25vcmVDYXNlKHR5cGVJRCkgJiYKLSAgICAgICAgIHNlcnZlcklkXy5lcXVhbHNJZ25vcmVDYXNlKHNlcnZlcklEKSAmJgotICAgICAgICAgcnVudGltZUlkXy5lcXVhbHNJZ25vcmVDYXNlKHJ1bnRpbWVJRCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gICB9Ci0gICAKLSAgIHB1YmxpYyBib29sZWFuIGhhc0NvbmZpZ0VsZW1lbnRGb3IoU3RyaW5nIGZhY3RvcnlJRCwgU3RyaW5nIHJ1bnRpbWVJRCwgU3RyaW5nIHR5cGVJRCkgewotICAgICBpZiAodHlwZUlkXy5lcXVhbHNJZ25vcmVDYXNlKHR5cGVJRCkgJiYgIXJlcXVpcmVzU2VydmVyUnVudGltZV8pCi0gICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgaWYgKHJlcXVpcmVzU2VydmVyUnVudGltZV8pIAotICAgICB7Ci0gICAgICAgU3RyaW5nIHNlcnZlcklEID0gZ2V0U2VydmVySWRGb3JGYWN0b3J5SWQoIGZhY3RvcnlJRCApOyAKLSAgICAgICAKLSAgICAgICBpZiAodHlwZUlkXy5lcXVhbHNJZ25vcmVDYXNlKHR5cGVJRCkgJiYKLSAgICAgICAgICBzZXJ2ZXJJZF8uZXF1YWxzSWdub3JlQ2FzZShzZXJ2ZXJJRCkgJiYKLSAgICAgICAgICBydW50aW1lSWRfLmVxdWFsc0lnbm9yZUNhc2UocnVudGltZUlEKSkKLSAgICAgICAgIHJldHVybiB0cnVlOwotICAgICB9Ci0gICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAKLSAgIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q2xpZW50VHlwZUNvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKFN0cmluZyBzZXJ2ZXJJRCwgU3RyaW5nIHJ1bnRpbWVJRCwgU3RyaW5nIHR5cGVJRCkKLSAgIHsKLSAgICBpZiAodGhpcy50eXBlSWRfLmVxdWFsc0lnbm9yZUNhc2UodHlwZUlEKSAmJiBzZXJ2ZXJJRD09bnVsbCAmJiBydW50aW1lSUQ9PW51bGwpCi0gICAgICByZXR1cm4gdGhpcy5lbGVtZW50XzsKLSAgICAKLSAgICBpZiAodGhpcy50eXBlSWRfLmVxdWFsc0lnbm9yZUNhc2UodHlwZUlEKSAmJiAKLSAgICAgICB0aGlzLnNlcnZlcklkXy5lcXVhbHNJZ25vcmVDYXNlKHNlcnZlcklEKSAmJiAKLSAgICAgICB0aGlzLnJ1bnRpbWVJZF8uZXF1YWxzSWdub3JlQ2FzZShydW50aW1lSUQpKQotICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudF87Ci0gICAgcmV0dXJuIG51bGw7Ci0gICB9IAotICB9Ci0gIAotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkgZ2V0RmFjdG9yeUZhY3RvcnkoIFN0cmluZ1tdIGlkcyApCi0gIHsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgaGFzaEtleSA9IGlkc1syXSArICIjIiArIGlkc1sxXSArICIjIiArIGlkc1swXTsKLSAgICBDb21tYW5kV2lkZ2V0QmluZGluZyAgYmluZGluZyA9IChDb21tYW5kV2lkZ2V0QmluZGluZylmYWN0b3J5Q2FjaGVfLmdldCggaGFzaEtleSApOwotICAgIAotICAgIGlmKCBiaW5kaW5nID09IG51bGwgKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZ2V0Q29uZmlnRWxlbWVudEZvciggaWRzWzJdLCBpZHNbMV0sIGlkc1swXSApOyAKLSAgICAKLSAgICAgIGlmKCBlbGVtZW50ID09IG51bGwgKSByZXR1cm4gbnVsbDsKLSAgICAKLSAgICAgIGJpbmRpbmcgPSBjcmVhdGVCaW5kaW5nKCBlbGVtZW50ICk7Ci0gICAgICAKLSAgICAgIGZhY3RvcnlDYWNoZV8ucHV0KCBoYXNoS2V5LCBiaW5kaW5nICk7Ci0gICAgICAKLSAgICAgIGJpbmRpbmcucmVnaXN0ZXJEYXRhTWFwcGluZ3MoIGRhdGFNYXBwaW5nUmVnaXN0cnlfICk7Ci0gICAgICAKLSAgICAgIGlmKCB3aWRnZXRSZWdpc3RyeV8gIT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyggd2lkZ2V0UmVnaXN0cnlfICk7Ci0gICAgICAgIGJpbmRpbmcucmVnaXN0ZXJDYW5GaW5pc2goIGNhbkZpbmlzaFJlZ2lzdHJ5XyApOwotICAgICAgfQotICAgIH0gIAotICAgICAgCi0gICAgcmV0dXJuIGJpbmRpbmc7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIENvbW1hbmRXaWRnZXRCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgKSAKLSAgewotICAgIFZlY3RvciBiaW5kaW5ncyA9IG5ldyBWZWN0b3IoNCk7Ci0gICAgVmVjdG9yIGZyYWdtZW50cyA9IG5ldyBWZWN0b3IoNCk7Ci0gICAgCi0gICAgYWRkQmluZGluZyggZWxlbWVudCwgImRldmVsb3BCaW5kaW5nIiwgYmluZGluZ3MgKTsKLSAgICBhZGRCaW5kaW5nKCBlbGVtZW50LCAiYXNzZW1ibHlCaW5kaW5nIiwgYmluZGluZ3MgKTsKLSAgICBhZGRCaW5kaW5nKCBlbGVtZW50LCAiZGVwbG95QmluZGluZyIsIGJpbmRpbmdzICk7Ci0gICAgYWRkQmluZGluZyggZWxlbWVudCwgImluc3RhbGxCaW5kaW5nIiwgYmluZGluZ3MgKTsKLSAgICAKLSAgICBmcmFnbWVudHMuYWRkKCBuZXcgQ2xpZW50UHJlRGV2ZWxvcEZyYWdtZW50KCkgKTsKLSAgICBmcmFnbWVudHMuYWRkKCBuZXcgQ2xpZW50UHJlQXNzZW1ibHlGcmFnbWVudCgpICk7Ci0gICAgZnJhZ21lbnRzLmFkZCggbmV3IENsaWVudFByZURlcGxveUZyYWdtZW50KCkgKTsKLSAgICBmcmFnbWVudHMuYWRkKCBuZXcgQ2xpZW50UHJlSW5zdGFsbEZyYWdtZW50KCkgKTsKLSAgICAgCi0gICAgcmV0dXJuIG5ldyBDb21tYW5kV2lkZ2V0QmluZGluZ0xpc3QoIGJpbmRpbmdzLCBmcmFnbWVudHMgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGFkZEJpbmRpbmcoIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYmluZGluZ05hbWUsIFZlY3RvciBsaXN0ICkKLSAgewotICAgIE9iamVjdCBiaW5kaW5nID0gbnVsbDsKLSAgICAKLSAgICBpZiggZWxlbWVudC5nZXRBdHRyaWJ1dGUoIGJpbmRpbmdOYW1lICkgIT0gbnVsbCApCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcgPSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oIGJpbmRpbmdOYW1lICk7IAotICAgICAgfQotICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgbGlzdC5hZGQoIGJpbmRpbmcgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RGF0YU1hcHBpbmdSZWdpc3RyeSggRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSApCi0gIHsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyA9IHJlZ2lzdHJ5OwotICAgIAotICAgIC8vIFdlIG5lZWQgdG8gcmVidWlsZCB0aGUgZmFjdG9yeSBjYWNoZSBlYWNoIHRpbWUgd2Ugc3RhcnQgdGhlIGNsaWVudAotICAgIC8vIHdpemFyZC4KLSAgICBmYWN0b3J5Q2FjaGVfICAgICAgICA9IG5ldyBIYXNoTWFwKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdpZGdldFJlZ2lzdHJ5KCBXaWRnZXRSZWdpc3RyeSByZWdpc3RyeSApCi0gIHsKLSAgICB3aWRnZXRSZWdpc3RyeV8gPSByZWdpc3RyeTs7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2FuRmluaXNoUmVnaXN0cnkoIENhbkZpbmlzaFJlZ2lzdHJ5IHJlZ2lzdHJ5ICkKLSAgewotICAgIGNhbkZpbmlzaFJlZ2lzdHJ5XyA9IHJlZ2lzdHJ5OwotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGJjNTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotCi0vKioKLSogVGhpcyB0eXBlIGlzIHVzZWQgdG8gaG9sZCB1c2VyIG9yIGNhbGN1bGF0ZWQgCi0qIGRhdGEgdG8gYmUgdXNlIGJ5IGZpbnNpaCB0YXNrcwotKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZUluZm8KLXsKLQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlUnVudGltZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5ZWVmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZSBhcnRpZmFjdC4gCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VSdW50aW1lIGltcGxlbWVudHMgSVdlYlNlcnZpY2VSdW50aW1lCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnRfOwotICBwdWJsaWMgU3RyaW5nIHJ1bnRpbWVJZF87Ci0gIHB1YmxpYyBTdHJpbmcgcnVudGltZUxhYmVsXzsKLSAgcHVibGljIFN0cmluZyBydW50aW1lRGVzY3JpcHRpb25fOwotICBwdWJsaWMgU3RyaW5nW10gajJlZVZlcnNpb25zOwotICAKLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlUnVudGltZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lbGVtZW50XyA9IGVsZW07IAotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuCi0gICogQHJldHVybiBpZCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQgKCkKLSAgewotICAgIGlmIChydW50aW1lSWRfID09IG51bGwpCi0gICAgICBydW50aW1lSWRfID0gZWxlbWVudF8uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIHJldHVybiBydW50aW1lSWRfOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIGlmIChydW50aW1lRGVzY3JpcHRpb25fID09IG51bGwpCi0gICAgICBydW50aW1lRGVzY3JpcHRpb25fID0gZWxlbWVudF8uZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpOwotICAgIHJldHVybiBydW50aW1lRGVzY3JpcHRpb25fOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgTGFiZWwgb2YgdGhpcyBXZWIgU2VydmljZSBydW50aW1lLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIExhYmVsIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCAoKQotICB7Ci0gICAgaWYgKHJ1bnRpbWVMYWJlbF89PW51bGwpCi0gICAgICBydW50aW1lTGFiZWxfID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZSgoU3RyaW5nKWVsZW1lbnRfLmdldEF0dHJpYnV0ZSgibGFiZWwiKSk7ICAgIAotICAgIHJldHVybiBydW50aW1lTGFiZWxfOwotICB9Ci0KLSAgLyoqCi0gICAqICBSZXR1cm5zIGEgVHJ1ZSBpZiB0aGlzIHJ1bnRpbWUgaGFzIGJlZW4gc2V0IGFzIGRlZmF1bHQKLSAgICogIEByZXR1cm4gYSBib29sZWFuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRJc0RlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImlzRGVmYXVsdCIpKS5ib29sZWFuVmFsdWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgU3RyaW5nLCBKMkVFIHZlcnNpb24KLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldEoyRUVWZXJzaW9ucygpCi0gIHsKLSAgICBpZiAoajJlZVZlcnNpb25zID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImoyZWV2ZXJzaW9uIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgajJlZVZlcnNpb25zID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqMmVlVmVyc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgajJlZVZlcnNpb25zW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBqMmVlVmVyc2lvbnM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aAotICAgKiB0aGlzIHJ1bnRpbWUuCi0gICAqIAotICAgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnRfOwotICB9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlU2VydmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MmU0N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgYSBraW5kIG9mCi0qIFdlYiBTZXJ2aWNlIGFydGlmYWN0LiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIGEgV2ViU2VydmljZVR5cGUKLSogb2JqZWN0IGlzIHRvIG1hbnVmYWN0dXJlIHRoZSB3aXphcmQgcGFnZXMgdGhhdCBzdXBwb3J0IHRoZSB0eXBlLgotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU2VydmVyIGltcGxlbWVudHMgSVdlYlNlcnZpY2VTZXJ2ZXIKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnRfOwotICBwdWJsaWMgU3RyaW5nIHNlcnZlcklkXzsKLSAgcHVibGljIFN0cmluZyBmYWN0b3J5SWRfOwotICBwdWJsaWMgU3RyaW5nIHNlcnZlckxhYmVsXzsKLQotICBwdWJsaWMgV2ViU2VydmljZVNlcnZlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lbGVtZW50XyA9IGVsZW07IAotICB9Ci0gIC8qKgotICAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCAoKQotICB7Ci0gICAgaWYgKHNlcnZlcklkXz09bnVsbCkKLSAgICAgIHNlcnZlcklkXyA9IGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgiaWQiKTsKLSAgICByZXR1cm4gc2VydmVySWRfOwotICB9Ci0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlJZCAoKQotICB7Ci0gICAgaWYgKGZhY3RvcnlJZF89PW51bGwpCi0gICAgICBmYWN0b3J5SWRfID0gZWxlbWVudF8uZ2V0QXR0cmlidXRlKCJmYWN0b3J5SWQiKTsKLSAgICByZXR1cm4gZmFjdG9yeUlkXzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExhYmVsICgpCi0gIHsKLSAgICBpZiAoc2VydmVyTGFiZWxfID09IG51bGwpCi0gICAgewotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoZ2V0RmFjdG9yeUlkKCkpOyAgICAKLSAgICAgIHNlcnZlckxhYmVsXyA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0VGV4dChzZXJ2ZXJUeXBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlcnZlckxhYmVsXzsgICAgCi0gIH0gIAotCi0gIC8qKgotICAgKiAgUmV0dXJucyBhIFRydWUgaWYgdGhpcyBzZXJ2ZXIgaGFzIGJlZW4gc2V0IGFzIGRlZmF1bHQKLSAgICogIEByZXR1cm4gYSBib29sZWFuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRJc0RlZmF1bHQoKQotICB7Ci0KLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgiaXNEZWZhdWx0IikpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBydW50aW1lIHRhcmdldCBJZAotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSdW50aW1lVHlwZUlkKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoInJ1bnRpbWVUeXBlSWRzIik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoCi0gICAqIHRoaXMgdHlwZS4KLSAgICogCi0gICAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudAotICAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5lbGVtZW50XzsgCi0gIH0gCi0KLSAgfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2ZTFkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZS1TZXJ2ZXItUnVudGltZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUsIHNlcnZlciwgYW5kIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotewotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyLVJ1bnRpbWUgdHlwZS4KLSAgKiBAcmV0dXJuIEEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyLVJ1bnRpbWUgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXItUnVudGltZSB0eXBlLgotICAqIEByZXR1cm4gQSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXItUnVudGltZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBsYWJlbCBmb3IgdGhlIFNlcnZlciBzdXBwb3J0ZWQgYnkgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXItUnVudGltZSB0eXBlCi0gICogQHJldHVybiBBIHNlcnZlciBsYWJlbCBmcm9tIHNlcnZlciBwbHVnaW5zCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTGFiZWwoKTsKLQotICAvKioKLSAgKiBTZXRzIGEgbGFiZWwgZm9yIHRoZSBTZXJ2ZXIgc3VwcG9ydGVkIGJ5IHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyLVJ1bnRpbWUgdHlwZQotICAqIEBwYXJhbSBBIHNlcnZlciBsYWJlbCBmcm9tIHNlcnZlciBwbHVnaW5zCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckxhYmVsKFN0cmluZyBzZXJ2ZXJMYWJlbCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxhYmVsIGZvciB0aGUgZGVwbG95bWVudCBydW50aW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyLVJ1bnRpbWUgdHlwZQotICAqIEByZXR1cm4gQSBsYWJlbCBmb3IgdGhlIGRlcGxveW1lbnQgcnVudGltZQotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVMYWJlbCgpOwotCi0gIC8qKgotICAqIFNldHMgYSBsYWJlbCBmb3IgdGhlIGRlcGxveW1lbnQgcnVudGltZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIFNlcnZlci1SdW50aW1lIHR5cGUKLSAgKiBAcGFyYW0gQSBsYWJlbCBmb3IgdGhlIGRlcGxveW1lbnQgcnVudGltZQotICAqLwotICBwdWJsaWMgdm9pZCBzZXRSdW50aW1lTGFiZWwoU3RyaW5nIHJ1bnRpbWVMYWJlbCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxhYmVsIGZvciB0aGUgV2ViIFNlcnZpY2UgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLSAgKiBAcmV0dXJuIEEgbGFiZWwgZm9yIHRoZSBXZWIgU2VydmljZSB0eXBlCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVR5cGVMYWJlbCgpOwotCi0gIC8qKgotICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYSBXZWIgTW9kdWxlIGlzIHJlcXVpcmVkIGZvciB0aGlzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotICAqIEByZXR1cm4gdHJ1ZSBpZiByZXF1aXJlV2ViTW9kdWxlCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzV2ViTW9kdWxlUmVxdWlyZWQoKTsKLQotICAvKioKLSAgKiBTZXRzIHRoZSBib29sZWFuIHZhbHVlIGF0IHJ1bnRpbWUgYWNjb3JkaW5nIHRvIHJlcXVpcmVXZWJNb2R1bGUgYXR0cmlidXRlIGZyb20gdGhlIG1hbmlmZXN0IGZpbGUKLSAgKiBAcGFyYW0gcmVxdWlyZVdlYk1vZHVsZSAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViTW9kdWxlUmVxdWlyZWQoYm9vbGVhbiByZXF1aXJlV2ViTW9kdWxlKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFuIEVKQiBNb2R1bGUgaXMgcmVxdWlyZWQgZm9yIHRoaXMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gICogQHJldHVybiB0cnVlIGlzIHJlcXVpcmVFSkJNb2R1bGUgaXMgdHJ1ZQotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VKQk1vZHVsZVJlcXVpcmVkKCk7Ci0KLSAgLyoqCi0gICogU2V0cyB0aGUgYm9vbGVhbiB2YWx1ZSBhdCBydW50aW1lIGFjY29yZGluZyB0byByZXF1aXJlRUpCTW9kdWxlIGF0dHJpYnV0ZSBmcm9tIHRoZSBtYW5pZmVzdCBmaWxlCi0gICogQHBhcmFtIHJlcXVpcmVFSkJNb2R1bGUgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldEVKQk1vZHVsZVJlcXVpcmVkKGJvb2xlYW4gcmVxdWlyZUVKQk1vZHVsZSk7IAotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY2MmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklFSkJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHMuU2VydmljZVByZUFzc2VtYmx5RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50cy5TZXJ2aWNlUHJlRGVwbG95RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50cy5TZXJ2aWNlUHJlRGV2ZWxvcEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHMuU2VydmljZVByZUluc3RhbGxGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5MYWJlbHNBbmRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUucmVnaXN0cnkuQ29tbWFuZFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSBpbXBsZW1lbnRzIENvbW1hbmRSZWdpc3RyeQotewotCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IGluc3RhbmNlXzsKLQotICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGluZGV4ZWRDb25maWdFbGVtc187Ci0KLSAgcHJpdmF0ZSBIYXNoTWFwIHdlYlNlcnZpY2VTZXJ2ZXJzOwotICBwcml2YXRlIEhhc2hNYXAgd2ViU2VydmljZVJ1bnRpbWVzOwotICBwcml2YXRlIEhhc2hNYXAgd2ViU2VydmljZVR5cGVzOwotICBwcml2YXRlIEhhc2hNYXAgd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlczsKLSAKLSAgcHJpdmF0ZSBIYXNodGFibGUgcnVudGltZXNCeVR5cGVfOwotICBwcml2YXRlIEhhc2h0YWJsZSBydW50aW1lTGFiZWxCeUlkXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgcnVudGltZUlkQnlMYWJlbF87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHNlcnZlcnNCeVR5cGVfOwotICBwcml2YXRlIEhhc2h0YWJsZSBzZXJ2ZXJMYWJlbEJ5RmFjdG9yeUlkXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgc2VydmVyRmFjdG9yeUlkQnlMYWJlbF87Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgY29uZmlnRWxlbXNCeUlkXzsKLSAgCi0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSAgIGNhbkZpbmlzaFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBIYXNoTWFwICAgICAgICAgICAgIGZhY3RvcnlDYWNoZV87Ci0gIAotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHNlcnZlclRvUnVudGltZVRvSjJFRV87Ci0gIHByaXZhdGUgTG9nCQkJCQlsb2dfOwotICAKLSAgcHVibGljIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5KCkgewotICAgIGxvZ18gPSBuZXcgRWNsaXBzZUxvZygpOwotICB9Ci0gIC8vCi0gIC8vIExvYWRzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBvYmplY3RzIGludG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gVGhpcyBpcyBkb25lIGJ5IHF1ZXJ5aW5nIHRoZSBwbHVnaW4gcmVnaXN0cnkgZm9yIGFsbCBleHRlbnNpb25zCi0gIC8vIGhhbmdpbmcgb24gdGhlIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBleHRlbnNpb24gcG9pbnQuIEV4dGVuc2lvbnMKLSAgLy8gbXVzdCBpbXBsZW1lbnQgdGhlIG9yZy5lY2xpcHNlLmpzdC53cy51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gIC8vIGludGVyZmFjZS4KLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGxvYWRUeXBlcyAoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIik7Ci0KLSAgICBmb3IoaW50IGlkeD0wOyBpZHg8Y29uZmlnLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gY29uZmlnW2lkeF07Ci0gICAgICB0cnkgCi0gICAgICB7Ci0gICAgICAgIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VTZXJ2ZXIiKSkKLSAgICAgICAgeyAKLSAgICAgICAgICBXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IG5ldyBXZWJTZXJ2aWNlU2VydmVyKGVsZW0pOwotICAgICAgICAgIHdlYlNlcnZpY2VTZXJ2ZXJzLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgd3NzKTsKLSAgICAgICAgICBTdHJpbmcgc2VydmVyTGFiZWwgPSB3c3MuZ2V0TGFiZWwoKTsKLSAgICAgICAgICBpZiAoc2VydmVyTGFiZWwgIT0gbnVsbCAmJiBzZXJ2ZXJMYWJlbC5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc2VydmVyTGFiZWxCeUZhY3RvcnlJZF8uY29udGFpbnNLZXkod3NzLmdldEZhY3RvcnlJZCgpKSk7Ci0gICAgICAgICAgICAgIHNlcnZlckxhYmVsQnlGYWN0b3J5SWRfLnB1dCh3c3MuZ2V0RmFjdG9yeUlkKCksIHNlcnZlckxhYmVsKTsKLSAgICAgICAgICAgIGlmICghc2VydmVyRmFjdG9yeUlkQnlMYWJlbF8uY29udGFpbnNLZXkoc2VydmVyTGFiZWwpKTsKLSAgICAgICAgICAgICAgc2VydmVyRmFjdG9yeUlkQnlMYWJlbF8ucHV0KHNlcnZlckxhYmVsLCB3c3MuZ2V0RmFjdG9yeUlkKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VSdW50aW1lIikpCi0gICAgICAgIHsKLSAgICAgICAgICBXZWJTZXJ2aWNlUnVudGltZSBydCA9IG5ldyBXZWJTZXJ2aWNlUnVudGltZShlbGVtKTsKLSAgICAgICAgICB3ZWJTZXJ2aWNlUnVudGltZXMucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCBydCk7Ci0gICAgICAgICAgaWYoIXJ1bnRpbWVMYWJlbEJ5SWRfLmNvbnRhaW5zS2V5KHJ0LmdldElkKCkpKQotICAgICAgICAgIAlydW50aW1lTGFiZWxCeUlkXy5wdXQocnQuZ2V0SWQoKSwgcnQuZ2V0TGFiZWwoKSk7Ci0gICAgICAgICAgaWYoIXJ1bnRpbWVJZEJ5TGFiZWxfLmNvbnRhaW5zS2V5KHJ0LmdldExhYmVsKCkpKQotICAgICAgICAgIAlydW50aW1lSWRCeUxhYmVsXy5wdXQocnQuZ2V0TGFiZWwoKSwgcnQuZ2V0SWQoKSk7Ci0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJTZXJ2aWNlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgV2ViU2VydmljZVR5cGVJbXBsIHdzdCA9IG5ldyBXZWJTZXJ2aWNlVHlwZUltcGwoZWxlbSk7Ci0gICAgICAgICAgd2ViU2VydmljZVR5cGVzLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgd3N0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgY29uZmlnRWxlbXNCeUlkXy5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoImlkIiksIGVsZW0pOwotCi0gICAgICAgICAgU3RyaW5nIHR5cGVJZCA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0gICAgICAgICAgU3RyaW5nIHNlcnZlcklkID0gZWxlbS5nZXRBdHRyaWJ1dGUoInNlcnZlciIpOwotICAgICAgICAgIFN0cmluZyBydW50aW1lSWQgPSBlbGVtLmdldEF0dHJpYnV0ZSgicnVudGltZSIpOwotICAgICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZV8gd3NzcnQgPSBuZXcgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXyhzZXJ2ZXJJZCwgcnVudGltZUlkLCB0eXBlSWQsIGVsZW0pOwotICAgICAgICAgIHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZXMucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCB3c3NydCk7Ci0KLSAgICAgICAgICBzZXRSdW50aW1lc0J5VHlwZSh0eXBlSWQscnVudGltZUlkKTsKLSAgICAgICAgICBzZXRTZXJ2ZXJzQnlUeXBlKHR5cGVJZCwgc2VydmVySWQpOwotICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICB9IAotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBsb2dfLmxvZyhMb2cuRVJST1IsIDUwNTgsIHRoaXMsICJsb2FkVHlwZXMiLCBlKTsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICogU2V0cyB0aGUgV2ViIHNlcnZpY2UgcnVudGltZXMgYW5kIHR5cGUgZnJvbSBlYWNoIGV4dGVuc2lvbiAKLSAgKiBpbiBhIEhhc2h0YWJsZS4gIFRoZSB0eXBlIGlzIHRoZSBrZXksIGFuZCB2YWx1ZSBpcyBhIFZlY3RvciBjb250YWluaW5nIAotICAqIGVhY2ggcnVudGltZSBzdXBwb3J0ZWQgaW4gdGhhdCBXZWIgc2VydmljZSB0eXBlLgotICAqIEBwYXJhbSBydW50aW1lIG5hbWUKLSAgKiBAcGFyYW0gdHlwZSBuYW1lCi0gICovCi0gIHByaXZhdGUgdm9pZCBzZXRSdW50aW1lc0J5VHlwZShTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcnVudGltZSkKLSAgewotICAgIGlmKHJ1bnRpbWVzQnlUeXBlXy5nZXQodHlwZUlkKSE9bnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgdiA9IChWZWN0b3IpcnVudGltZXNCeVR5cGVfLmdldCh0eXBlSWQpOwotICAgICAgaWYgKCF2LmNvbnRhaW5zKHJ1bnRpbWUudHJpbSgpKSkgewotICAgICAgICB2LmFkZChydW50aW1lLnRyaW0oKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBWZWN0b3IgdmVjdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHZlY3QuYWRkKHJ1bnRpbWUudHJpbSgpKTsKLSAgICAgIHJ1bnRpbWVzQnlUeXBlXy5wdXQodHlwZUlkLHZlY3QpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlUnVudGltZSBnZXRSdW50aW1lQnlJZCggU3RyaW5nIGlkICkKLSAgewotICAgIHJldHVybiAoV2ViU2VydmljZVJ1bnRpbWUpd2ViU2VydmljZVJ1bnRpbWVzLmdldCggaWQgKTsgCi0gIH0KLSAgCi0gIC8qKgotICAqIEdldHMgdGhlIFdlYiBzZXZpY2UgcnVudGltZXMgdmVjdG9yIGdpdmVuIGEgdHlwZQotICAqIEBwYXJhbSBXZWIgc2VydmljZSB0eXBlCi0gICogQHJldHVybiBhcnJheSBvZiBydW50aW1lIGxhYmVscwotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZXNCeVR5cGUoU3RyaW5nIHdlYlNlcnZpY2VUeXBlKSAKLSAgewotICAgIFN0cmluZ1tdIHJ1bnRpbWVzOwotICAgIGlmIChydW50aW1lc0J5VHlwZV8uY29udGFpbnNLZXkod2ViU2VydmljZVR5cGUpKQotICAgIHsKLSAgICAgIFZlY3RvciB2ZWN0ID0oVmVjdG9yKXJ1bnRpbWVzQnlUeXBlXy5nZXQod2ViU2VydmljZVR5cGUpOwotICAgICAgcnVudGltZXMgPSBuZXcgU3RyaW5nW3ZlY3Quc2l6ZSgpXTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTx2ZWN0LnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgcnVudGltZUlkID0gKFN0cmluZyl2ZWN0LmVsZW1lbnRBdChpKTsKLSAgICAgICAgV2ViU2VydmljZVJ1bnRpbWUgd3NyID0gKFdlYlNlcnZpY2VSdW50aW1lKXdlYlNlcnZpY2VSdW50aW1lcy5nZXQocnVudGltZUlkKTsKLSAgICAgICAgaWYgKHdzciE9bnVsbCkgewotICAgICAgICAgIHJ1bnRpbWVzW2ldID0gKFN0cmluZyl3c3IuZ2V0SWQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJ1bnRpbWVzOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsb2dfLmxvZyhMb2cuRVJST1IsIDUwNTksIHRoaXMsICJnZXRSdW50aW1lc0J5VHlwZSIsICJydW50aW1lcyBub3QgZm91bmQgZm9yIFdlYiBzZXJ2aWNlIHR5cGUgIit3ZWJTZXJ2aWNlVHlwZSk7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNSdW50aW1lU3VwcG9ydGVkRm9yVHlwZShTdHJpbmcgd2ViU2VydmljZVR5cGVJZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAJU3RyaW5nW10gcnVudGltZXMgPSBnZXRSdW50aW1lc0J5VHlwZSh3ZWJTZXJ2aWNlVHlwZUlkKTsKLQlmb3IoaW50IGk9MDtpPHJ1bnRpbWVzLmxlbmd0aDtpKyspCi0JewotICAJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZUlkKSkKLSAgCQkgIHJldHVybiB0cnVlOwotCX0KLSAgCXJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGRvZXNSdW50aW1lU3VwcG9ydEoyRUVMZXZlbChTdHJpbmcgajJlZVZlcnNpb25JZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIElXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSAoSVdlYlNlcnZpY2VSdW50aW1lKXdlYlNlcnZpY2VSdW50aW1lcy5nZXQocnVudGltZUlkKTsKLSAgICBTdHJpbmdbXSBqMmVlVmVyc2lvbnMgPSB3c3IuZ2V0SjJFRVZlcnNpb25zKCk7Ci0gICAgaWYgKGoyZWVWZXJzaW9ucz09bnVsbCB8fCBqMmVlVmVyc2lvbnMubGVuZ3RoPT0wKSAKLSAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAgIGZvcihpbnQgaT0wOyBpPGoyZWVWZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoajJlZVZlcnNpb25zW2ldLmVxdWFscyhqMmVlVmVyc2lvbklkKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBkb2VzUnVudGltZVN1cHBvcnRTZXJ2ZXJUYXJnZXQoU3RyaW5nIHNlcnZlclRhcmdldElkLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgSXRlcmF0b3IgaXQgPSB3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgCi0gICAgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXyB3c3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfKWl0Lm5leHQoKTsKLSAgICAgIGlmICh3c3NydCE9bnVsbCkgewotICAgICAgICBpZiAod3NzcnQucnVudGltZUlkXy5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgICAgewotICAgICAgICAgIElXZWJTZXJ2aWNlU2VydmVyIHdzc2VydmVyID0gZ2V0V2ViU2VydmljZVNlcnZlckJ5SWQod3NzcnQuc2VydmVySWRfKTsKLSAgICAgICAgICBTdHJpbmcgdGhpc0ZhY3RvcnlJZCA9IHdzc2VydmVyLmdldEZhY3RvcnlJZCgpOwotICAgICAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHRoaXNGYWN0b3J5SWQpOwotICAgICAgICAgIGlmIChzZXJ2ZXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgdGhpc1NlcnZlclRhcmdldElkID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7IAotICAgICAgICAgIGlmICh0aGlzU2VydmVyVGFyZ2V0SWQuZXF1YWxzKHNlcnZlclRhcmdldElkKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAKLSAgICByZXR1cm4gZmFsc2U7ICAKLSAgfQotICAKLSAgLyoqCi0gICogR2V0cyB0aGUgc2VydmVyIGZhY3RvcnlJRHMgb2YgYWxsIHdlYiBzZXJ2aWNlIHNlcnZlciBydW50aW1lIHR5cGUKLSAgKiB3aXRoIGFuIHJ1bnRpbWUgSUQgZXF1YWxzIHRvIHRoZSBpbnB1dAotICAqIEBwYXJhbSBydW50aW1lIElECi0gICogQHJldHVybiBhcnJheSBvZiBmYWN0b3J5IElEcwotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmVyRmFjdG9yeUlEQnlSdW50aW1lSUQoU3RyaW5nIHJ1bnRpbWVJRCkgewotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgIEl0ZXJhdG9yIGl0ID0gd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZV8gd3NzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXylpdC5uZXh0KCk7Ci0gICAgICBpZiAod3NzcnQhPW51bGwpIHsKLSAgICAgICAgaWYgKHdzc3J0LnJ1bnRpbWVJZF8uZXF1YWxzKHJ1bnRpbWVJRCkpCi0gICAgICAgICAgdi5hZGQoZ2V0V2ViU2VydmljZVNlcnZlckJ5SWQod3NzcnQuc2VydmVySWRfKS5nZXRGYWN0b3J5SWQoKSk7Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgU3RyaW5nW10gc2VydmVyRmFjdG9yeUlEcyA9IG5ldyBTdHJpbmdbdi5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7IGkrKykgewotICAgICAgc2VydmVyRmFjdG9yeUlEc1tpXSA9IChTdHJpbmcpdi5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBzZXJ2ZXJGYWN0b3J5SURzOwotICB9Ci0KLSAgLyoqCi0gICogR2V0cyB0aGUgcnVudGltZSBJRHMgb2YgYWxsIHdlYiBzZXJ2aWNlIHNlcnZlciBydW50aW1lIHR5cGUKLSAgKiB3aXRoIGFuIHNlcnZlciBmYWN0b3J5IElEIGVxdWFscyB0byB0aGUgaW5wdXQKLSAgKiBAcGFyYW0gc2VydmVyIGZhY3RvcnkgSUQKLSAgKiBAcmV0dXJuIGFycmF5IG9mIHJ1bnRpbWUgSURzCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lSURzQnlTZXJ2ZXJGYWN0b3J5SUQoU3RyaW5nIHNlcnZlckZhY3RvcnlJRCkgewotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgIEl0ZXJhdG9yIGl0ID0gd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZV8gd3NzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXylpdC5uZXh0KCk7Ci0gICAgICBpZiAod3NzcnQhPW51bGwpIHsKLSAgICAgIAlJV2ViU2VydmljZVNlcnZlciB3c3MgPSBnZXRXZWJTZXJ2aWNlU2VydmVyQnlJZCh3c3NydC5zZXJ2ZXJJZF8pOwotICAgICAgCVN0cmluZyB3c3NmSWQgPSB3c3MuZ2V0RmFjdG9yeUlkKCk7Ci0gICAgICAJaWYgKHdzc2ZJZC5lcXVhbHMoc2VydmVyRmFjdG9yeUlEKSkKLSAgICAgIAl7Ci0gICAgICAJCWlmICghdi5jb250YWlucyh3c3NydC5ydW50aW1lSWRfKSkKLSAgICAgIAkJewotICAgICAgCQkJdi5hZGQod3NzcnQucnVudGltZUlkXyk7CQotICAgICAgCQl9ICAgICAgCQkKLSAgICAgIAl9Ci0gICAgICAgIC8qaWYgKGdldFdlYlNlcnZpY2VTZXJ2ZXJCeUlkKHdzc3J0LnNlcnZlcklkXykuZ2V0RmFjdG9yeUlkKCkuZXF1YWxzKHNlcnZlckZhY3RvcnlJRCkpCi0gICAgICAgICAgdi5hZGQoZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHdzc3J0LnJ1bnRpbWVJZF8pLmdldElkKCkpOyovCi0gICAgICB9Ci0gICAgfQotICAgIFN0cmluZ1tdIHJ1bnRpbWVJRHMgPSBuZXcgU3RyaW5nW3Yuc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKLSAgICAgIHJ1bnRpbWVJRHNbaV0gPSAoU3RyaW5nKXYuZ2V0KGkpOwotICAgIH0KLSAgICByZXR1cm4gcnVudGltZUlEczsKLSAgfQotICAKLSAgLyoqCi0gICogU2V0cyB0aGUgV2ViIHNlcnZpY2Ugc2VydmVycyBhbmQgdHlwZSBmcm9tIGVhY2ggZXh0ZW5zaW9uIAotICAqIGluIGEgSGFzaHRhYmxlLiAgVGhlIHR5cGUgaXMgdGhlIGtleSwgYW5kIHZhbHVlIGlzIGEgVmVjdG9yIGNvbnRhaW5pbmcgCi0gICogZWFjaCBydW50aW1lIHN1cHBvcnRlZCBpbiB0aGF0IFdlYiBzZXJ2aWNlIHR5cGUuCi0gICogQHBhcmFtIHNlcnZlciBuYW1lCi0gICogQHBhcmFtIHR5cGUgbmFtZQotICAqLwotICBwcml2YXRlIHZvaWQgc2V0U2VydmVyc0J5VHlwZShTdHJpbmcgdHlwZUlkLCBTdHJpbmcgc2VydmVyKQotICB7Ci0gICAgaWYoc2VydmVyc0J5VHlwZV8uZ2V0KHR5cGVJZCkhPW51bGwpCi0gICAgewotICAgICAgVmVjdG9yIHYgPSAoVmVjdG9yKXNlcnZlcnNCeVR5cGVfLmdldCh0eXBlSWQpOwotICAgICAgaWYgKCF2LmNvbnRhaW5zKHNlcnZlci50cmltKCkpKSAKLSAgICAgIHsKLSAgICAgICAgdi5hZGQoc2VydmVyLnRyaW0oKSk7ICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBWZWN0b3IgdmVjdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHZlY3QuYWRkKHNlcnZlci50cmltKCkpOwotICAgICAgc2VydmVyc0J5VHlwZV8ucHV0KHR5cGVJZCwgdmVjdCk7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgKiBHZXRzIHRoZSBXZWIgc2VydmljZSBzZXJ2ZXJzIHZlY3RvciBnaXZlbiBhIHR5cGUKLSAgKiBAcGFyYW0gV2ViIHNlcnZpY2UgdHlwZQotICAqIEByZXR1cm4gYXJyYXkgb2Ygc2VydmVyIGZhY3RvcnkgSWRzCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKFN0cmluZyB3ZWJTZXJ2aWNlVHlwZSkgCi0gIHsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJzOyAKLSAgICBpZiAoc2VydmVyc0J5VHlwZV8uY29udGFpbnNLZXkod2ViU2VydmljZVR5cGUpKQotICAgIHsKLSAgICAgIFZlY3RvciB2ZWN0ID0gKFZlY3RvcilzZXJ2ZXJzQnlUeXBlXy5nZXQod2ViU2VydmljZVR5cGUpOwotICAgICAgc2VydmVycyA9IG5ldyBTdHJpbmdbdmVjdC5zaXplKCldOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHZlY3Quc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBzZXJ2ZXJJZCA9IChTdHJpbmcpdmVjdC5lbGVtZW50QXQoaSk7Ci0gICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHNlcnZlcklkKTsKLSAgICAgICAgaWYgKHdzcyE9bnVsbCkgewotICAgICAgICAgIHNlcnZlcnNbaV0gPSAoU3RyaW5nKXdzcy5nZXRGYWN0b3J5SWQoKTsgLy9Ob3RlOiByZXR1cm5pbmcgc2VydmVyIGZhY3RvcnkgSWRzCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBzZXJ2ZXJzOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgCi0gICAgICBsb2dfLmxvZyhMb2cuRVJST1IsIDUwNjAsIHRoaXMsICJnZXRTZXJ2ZXJCeVR5cGUiLCAiV2ViIHNlcnZpY2Ugc2VydmVyIG5vdCBmb3VuZCBmb3IgV2ViIHNlcnZpY2UgdHlwZSAiK3dlYlNlcnZpY2VUeXBlKTsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIElXZWJTZXJ2aWNlUnVudGltZSBnZXRXZWJTZXJ2aWNlUnVudGltZUJ5TGFiZWwoU3RyaW5nIHJ1bnRpbWVMYWJlbCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlUnVudGltZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVJ1bnRpbWUgd3NyID0gKFdlYlNlcnZpY2VSdW50aW1lKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzciE9bnVsbCkgewotICAgICAgICBpZiAocnVudGltZUxhYmVsLmVxdWFscyh3c3IuZ2V0TGFiZWwoKSkpCi0gICAgICAgICAgcmV0dXJuIHdzcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJV2ViU2VydmljZVJ1bnRpbWUgZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKFN0cmluZyBydW50aW1lSWQpCi0gIHsKLSAgICByZXR1cm4gKElXZWJTZXJ2aWNlUnVudGltZSl3ZWJTZXJ2aWNlUnVudGltZXMuZ2V0KHJ1bnRpbWVJZCk7IAotICB9Ci0KLSAgcHVibGljIElXZWJTZXJ2aWNlU2VydmVyIGdldFdlYlNlcnZpY2VTZXJ2ZXJCeUZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gICAgaWYgKHNlcnZlckZhY3RvcnlJZD09bnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NzIT1udWxsICYmIHdzcy5nZXRGYWN0b3J5SWQoKSE9bnVsbCkgewotICAgICAgICBpZiAoc2VydmVyRmFjdG9yeUlkLmVxdWFscyh3c3MuZ2V0RmFjdG9yeUlkKCkpKSB7Ci0gICAgICAgICAgcmV0dXJuIHdzczsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gICAgCi0gIH0KLQotICBwdWJsaWMgSVdlYlNlcnZpY2VTZXJ2ZXIgZ2V0V2ViU2VydmljZVNlcnZlckJ5TGFiZWwoU3RyaW5nIHNlcnZlckxhYmVsKQotICB7Ci0gICAgaWYgKHNlcnZlckxhYmVsPT1udWxsKSAKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlU2VydmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzcyE9bnVsbCkgewotICAgICAgICBpZiAoc2VydmVyTGFiZWwuZXF1YWxzKHdzcy5nZXRMYWJlbCgpKSkKLSAgICAgICAgICByZXR1cm4gd3NzOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJV2ViU2VydmljZVNlcnZlciBnZXRXZWJTZXJ2aWNlU2VydmVyQnlJZChTdHJpbmcgc2VydmVySWQpCi0gIHsKLSAgICByZXR1cm4gKElXZWJTZXJ2aWNlU2VydmVyKXdlYlNlcnZpY2VTZXJ2ZXJzLmdldChzZXJ2ZXJJZCk7Ci0gIH0KLQotICBwdWJsaWMgSVdlYlNlcnZpY2VUeXBlIGdldFdlYlNlcnZpY2VUeXBlQnlMYWJlbChTdHJpbmcgdHlwZUxhYmVsKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlVHlwZUltcGwgd3N0ID0gKFdlYlNlcnZpY2VUeXBlSW1wbClpdGVyLm5leHQoKTsKLSAgICAgIGlmICh3c3QhPW51bGwpIHsKLSAgICAgICAgaWYgKHR5cGVMYWJlbC5lcXVhbHMod3N0LmdldExhYmVsKCkpKQotICAgICAgICAgIHJldHVybiB3c3Q7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIElXZWJTZXJ2aWNlVHlwZSBnZXRXZWJTZXJ2aWNlVHlwZUJ5SWQoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIGlmICh3ZWJTZXJ2aWNlVHlwZXMuZ2V0KHR5cGVJZCkhPSBudWxsKQotICAgICAgcmV0dXJuIChXZWJTZXJ2aWNlVHlwZUltcGwpd2ViU2VydmljZVR5cGVzLmdldCh0eXBlSWQpOwotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBhbiBFSkIgcHJvamVjdCBpcyBuZWVkZWQgdG8gaG9zdCBhIFdlYiBzZXJ2aWNlCi0gICAqIG9mIHRoZSB0eXBlIGlkZW50aWZpZWQgYnkgdHlwZUlkLiBJZiBtdWx0aXBsZSBuYXR1cmVJZHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgCi0gICAqICJpbmNsdWRlTmF0dXJlcyIgYXR0cmlidXRlLCBvbmx5IHRoZSBmaXJzdCBvbmUgaXMgY2hlY2tlZC4gSWYgbm8gbmF0dXJlSWRzIGFyZSBzcGVjaWZpZWQsIAotICAgKiBmYWxzZSBpcyByZXR1cm5lZC4KLSAgICogCi0gICAqIEBkZXByZWNhdGVkICAKLSAgICogCVNob3VsZCBiZSByZWZhY3RvcmVkIGluIGZ1dHVyZSAKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzRUpCUHJvamVjdChTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgSVdlYlNlcnZpY2VUeXBlIHdzdCA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0V2ViU2VydmljZVR5cGVCeUlkKHR5cGVJZCk7Ci0gICAgaWYgKHdzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gd3N0LmdldENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0gICAgICBTdHJpbmcgaW5jbHVkZWROYXR1cmVzID0gZWxlbS5nZXRBdHRyaWJ1dGUoImluY2x1ZGVOYXR1cmVzIik7Ci0gICAgICBpZiAoaW5jbHVkZWROYXR1cmVzPT1udWxsIHx8IGluY2x1ZGVkTmF0dXJlcy5sZW5ndGgoKT09MCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluY2x1ZGVkTmF0dXJlcyk7Ci0gICAgICAgIGlmKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBmaXJzdEluY2x1ZGVkTmF0dXJlID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgaWYgKGZpcnN0SW5jbHVkZWROYXR1cmUuZXF1YWxzKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBsaXN0IG9mIHZhbGlkIHByb2plY3RzIGZvciB0aGUgV2ViIHNlcnZpY2UgdHlwZSB3aXRoIGFuIGlkIG9mIHR5cGVJZC4KLSAgICogSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIFdlYiBzZXJ2aWNlIHR5cGUgZXh0ZW5zaW9uIGRvZXMgbm90IHNwZWNpZnkgd2hpY2ggcHJvamVjdAotICAgKiBuYXR1cmVzIGFyZSBpbmNsdWRlZCwgYSBhcnJheSBvZiBhbGwgV2ViIGFuZCBFSkIgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSB3aWxsCi0gICAqIGJlIHJldHVybmVkLgotICAgKiBAcGFyYW0gdHlwZUlkCi0gICAqIEByZXR1cm4gSVByb2plY3RbXSBhbiBhcnJheSBvZiB2YWxpZCBwcm9qZWN0cwotICAgKi8KLSAgcHVibGljIElQcm9qZWN0W10gZ2V0UHJvamVjdHNCeVdlYlNlcnZpY2VUeXBlKFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgIEFycmF5TGlzdCB2YWxpZFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotLy8gICAgSVdlYlNlcnZpY2VUeXBlIHdzdCA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0V2ViU2VydmljZVR5cGVCeUlkKHR5cGVJZCk7Ci0vLyAgICBpZiAod3N0ICE9IG51bGwpCi0vLyAgICB7Ci0KLQkJLy9UT0RPOiBUaGlzIHNlY3Rpb24gbmVlZHMgdG8gYmUgcmVmYWN0b3JlZCB0byBmaWx0ZXIgQXJ0aWZhY3RFZGl0cwotCQkvLyBhbmQgdXBob2xkIHByb2plY3QgdG9wb2xvZ3kgZGVzY3JpYmVkIGluIHRoZSBleHRlbnNpb24KLQkJCi0vLyAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gd3N0LmdldENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0vLyAgICAgIFN0cmluZyBpbmNsdWRlZE5hdHVyZXMgPSBlbGVtLmdldEF0dHJpYnV0ZSgiaW5jbHVkZU5hdHVyZXMiKTsKLS8vICAgICAgU3RyaW5nIGV4Y2x1ZGVkTmF0dXJlcyA9IGVsZW0uZ2V0QXR0cmlidXRlKCJleGNsdWRlTmF0dXJlcyIpOwotLy8gICAgICBpZiAoaW5jbHVkZWROYXR1cmVzIT1udWxsICYmIGluY2x1ZGVkTmF0dXJlcy5sZW5ndGgoKT4wKQotLy8gICAgICB7Ci0vLyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBpZiAoaW5jbHVkZShwcm9qZWN0c1tpXSwgaW5jbHVkZWROYXR1cmVzKSAmJiBleGNsdWRlKHByb2plY3RzW2ldLCBleGNsdWRlZE5hdHVyZXMpKQotLy8gICAgICAgICAgICB2YWxpZFByb2plY3RzLmFkZChwcm9qZWN0c1tpXSk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIHJldHVybiAoSVByb2plY3RbXSl2YWxpZFByb2plY3RzLnRvQXJyYXkobmV3IElQcm9qZWN0WzBdKTsKLS8vICAgICAgfQotLy8gICAgfQotICAgIAotICAgIC8vSWYgd3N0IHdhcyBudWxsIG9yIHRoZSBleHRlbnNpb24gZGlkbid0IHNwZWNpZnkgd2hpY2ggcHJvamVjdCBuYXR1cmVzIGFyZQotICAgIC8vIHRvIGJlIGluY2x1ZGVkLCByZXZlcnQgdG8gdGhlIG9sZCBiZWhhdmlvdXIKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IHByb2plY3RzLmxlbmd0aDsgaisrKQotICAgIHsKLSAgICAgIGlmIChSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChwcm9qZWN0c1tqXSkgfHwgUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3QocHJvamVjdHNbal0pKQotICAgICAgICB2YWxpZFByb2plY3RzLmFkZChwcm9qZWN0c1tqXSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gKElQcm9qZWN0W10pdmFsaWRQcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFswXSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBpbmNsdWRlKQotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbmNsdWRlKTsKLSAgICB3aGlsZShzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChwcm9qZWN0Lmhhc05hdHVyZShzdC5uZXh0VG9rZW4oKSkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGV4Y2x1ZGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGV4Y2x1ZGUpCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGV4Y2x1ZGUpOwotICAgIHdoaWxlKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByb2plY3QuaGFzTmF0dXJlKHN0Lm5leHRUb2tlbigpKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIExvYWRzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBvYmplY3RzIGludG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gU2VlIG1ldGhvZCBnZXRJbnN0YW5jZSgpLgotICAvLwotICBwcml2YXRlIHZvaWQgbG9hZCAoKQotICB7Ci0gICAgcnVudGltZXNCeVR5cGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHNlcnZlcnNCeVR5cGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGNvbmZpZ0VsZW1zQnlJZF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcnVudGltZUlkQnlMYWJlbF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcnVudGltZUxhYmVsQnlJZF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgc2VydmVyRmFjdG9yeUlkQnlMYWJlbF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgc2VydmVyTGFiZWxCeUZhY3RvcnlJZF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICB3ZWJTZXJ2aWNlU2VydmVycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgd2ViU2VydmljZVJ1bnRpbWVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICB3ZWJTZXJ2aWNlVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIGxvYWRUeXBlcygpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlICgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2VfID0gbmV3IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5KCk7Ci0gICAgICBpbnN0YW5jZV8ubG9hZCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgV2ViIFNlcnZpY2UgdHlwZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCA8Y29kZT5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU8L2NvZGU+Ci0gICogb2JqZWN0cy4KLSAgKiBAcmV0dXJuIFRoZSBXZWIgU2VydmljZSB0eXBlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZTwvY29kZT4KLSAgKiBvYmplY3RzLgotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZVR5cGVOYW1lcygpCi0gIHsKLSAgICAKLSAgICBTdHJpbmdbXSB0eXBlcyA9IG5ldyBTdHJpbmdbd2ViU2VydmljZVR5cGVzLnNpemUoKV07Ci0KLSAgICBpbnQgaT0wOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVR5cGVJbXBsIHdzdCA9IChXZWJTZXJ2aWNlVHlwZUltcGwpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3N0IT1udWxsKSB7Ci0gICAgICAgIHR5cGVzW2ldID0gd3N0LmdldExhYmVsKCk7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0gIAotICBwdWJsaWMgTGFiZWxzQW5kSWRzIGdldFNlcnZpY2VUeXBlTGFiZWxzKCkKLSAgewotICAgIExhYmVsc0FuZElkcyBsYWJlbElkcyA9IG5ldyBMYWJlbHNBbmRJZHMoKTsKLSAgICBJdGVyYXRvciAgICAgaXRlcmF0b3IgPSB3ZWJTZXJ2aWNlVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICBpbnQgICAgICAgICAgc2l6ZSAgICAgPSB3ZWJTZXJ2aWNlVHlwZXMuc2l6ZSgpOwotICAgIFN0cmluZ1tdICAgICBsYWJlbHMgICA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgU3RyaW5nW10gICAgIGlkcyAgICAgID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICBpbnQgICAgICAgICAgaW5kZXggICAgPSAwOwotICAgIAotICAgIGxhYmVsSWRzLnNldExhYmVsc18oIGxhYmVscyApOwotICAgIGxhYmVsSWRzLnNldElkc18oIGlkcyApOwotICAgIAotICAgIHdoaWxlKCBpdGVyYXRvci5oYXNOZXh0KCkgKSAKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlVHlwZUltcGwgdHlwZSA9IChXZWJTZXJ2aWNlVHlwZUltcGwpaXRlcmF0b3IubmV4dCgpOwotICAgICAgCi0gICAgICBpZHNbaW5kZXhdICAgID0gdHlwZS5nZXRJZCgpOwotICAgICAgbGFiZWxzW2luZGV4XSA9IHR5cGUuZ2V0TGFiZWwoKTsKLSAgICAgIGluZGV4Kys7Ci0gICAgfSAgICAKLSAgICAKLSAgICByZXR1cm4gbGFiZWxJZHM7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBnaXZlbiB0aGUgc2VydmVyLCBydW50aW1lLCBhbmQgdHlwZSBhdHRyaWJ1dGVzCi0gICogVGhlIGJlbmVmaXQgb2YgZ2V0dGluZyB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGlzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MKLSAgKiBmaWxlIGFuZCBwbHVnaW4gYXJlIG5vdCBsb2FkZWQgaW1tZWRpYXRlbHkuCi0gICogQHBhcmFtIHNlcnZlciBsYWJlbAotICAqIEBwYXJhbSBydW50aW1lIGxhYmVsCi0gICogQHBhcmFtIHR5cGUgbGFiZWwKLSAgKiBAcmV0dXJuIElDb25maWd1cmF0aW9uIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihTdHJpbmcgc2VydmVySWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBpZiAoc2VydmVySWQ9PW51bGwgfHwgcnVudGltZUlkPT1udWxsIHx8IHR5cGVJZD09bnVsbCkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXyB3c3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzc3J0IT1udWxsICkgewotICAgICAgICBpZiAod3NzcnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVySWQsIHJ1bnRpbWVJZCwgdHlwZUlkKSE9bnVsbCkKLSAgICAgICAgICByZXR1cm4gd3NzcnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVySWQsIHJ1bnRpbWVJZCx0eXBlSWQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlnRWxlbWVudEZvcihTdHJpbmcgZmFjdG9yeUlkLCBTdHJpbmcgcnVudGltZUlkLCBTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXyB3c3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfKWl0ZXIubmV4dCgpOwotICAgICAgICBpZiAod3NzcnQuaGFzQ29uZmlnRWxlbWVudEZvcihmYWN0b3J5SWQsIHJ1bnRpbWVJZCwgdHlwZUlkKSkgewotICAgICAgICAgIHJldHVybiB3c3NydC5lbGVtZW50XzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNXZWJNb2R1bGVGb3IoU3RyaW5nIHNlcnZlciwgU3RyaW5nIHJ1bnRpbWUsIFN0cmluZyB0eXBlKQotICB7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihzZXJ2ZXIsIHJ1bnRpbWUsIHR5cGUpOwotICAgIGlmIChlbGVtPT1udWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsgIC8vIHJlcG9ydCBlcnJvciBoZXJlIGluc3RlYWQKLSAgICB9Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihlbGVtLmdldEF0dHJpYnV0ZSgicmVxdWlyZVdlYk1vZHVsZSIpKS5ib29sZWFuVmFsdWUoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzRUpCTW9kdWxlRm9yKFN0cmluZyBzZXJ2ZXIsIFN0cmluZyBydW50aW1lLCBTdHJpbmcgdHlwZSkKLSAgewotICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVyLCBydW50aW1lLCB0eXBlKTsgICAgCi0gICAgaWYgKGVsZW09PW51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGVsZW0uZ2V0QXR0cmlidXRlKCJyZXF1aXJlRUpCTW9kdWxlIikpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIDxjb2RlPldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZTwvY29kZT4gY29ycmVzcG9uZGluZyB0byB0aGUgU2VydmVyLAotICAqIFJ1bnRpbWUsIGFuZCBXZWIgU2VydmljZSBUeXBlLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiB3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVFeGlzdHMoU3RyaW5nIHNlcnZlcklELCBTdHJpbmcgcnVudGltZUlELCBTdHJpbmcgdHlwZUlEKSAKLSAgewotICAgIHJldHVybiAoZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVySUQsIHJ1bnRpbWVJRCwgdHlwZUlEKSAhPSBudWxsKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSA8Y29kZT5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNlcnZlciwKLSAgKiBSdW50aW1lLCBhbmQgV2ViIFNlcnZpY2UgVHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVOYW1lKFN0cmluZyBzZXJ2ZXIsIFN0cmluZyBydW50aW1lLCBTdHJpbmcgdHlwZSkgCi0gIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVyLCBydW50aW1lLCB0eXBlKTsKLSAgICByZXR1cm4gKGVsZW09PW51bGwgPyBudWxsIDogZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgPGNvZGU+V2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlPC9jb2RlPiBjb3JyZXNwb25kaW5nIHRvIHRoZSBTZXJ2ZXIsIAotICAqIFJ1bnRpbWUsIGFuZCBXZWIgU2VydmljZSB0eXBlLiBUaGlzIHdpbGwgcmV0dXJuIHRoZSA8Y29kZT5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU8L2NvZGU+Ci0gICogb2JqZWN0IGFuZCBzZXQgdGhlIHByb3BlcnRpZXMgZm91bmQgaW4gdGhlIG1hbmlmZXN0IGZpbGUuIGkuZS4gaXNXZWJNb2R1bGVSZXF1aXJlZCwgaXNFSkJNb2R1bGVSZXF1aXJlZAotICAqIEBwYXJhbSBzZXJ2ZXIgbGFiZWwKLSAgKiBAcGFyYW0gcnVudGltZSBsYWJlbAotICAqIEBwYXJhbSBXZWIgc2VydmljZSB0eXBlCi0gICogQHJldHVybiBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgb2JqZWN0Ci0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgZ2V0V2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlKFN0cmluZyBzZXJ2ZXIsIFN0cmluZyBydW50aW1lLCBTdHJpbmcgdHlwZSkKLSAgewotCi0gICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIHdzc3J0ID0gbnVsbDsKLSAgICBTdHJpbmcgc2VydmVySWQgPSBnZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoc2VydmVyKS5nZXRJZCgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVyLCBydW50aW1lLCB0eXBlKTsKLSAgIAotICAgIGlmKCBlbGVtID09IG51bGwgKQotICAgIHsKLSAgICAgIC8vIFdlIGNvdWxkbid0IGZpbmQgdGhlIHNlcnZlciBhbmQgcnVudGltZSBzcGVjaWZpZWQgc28gd2Ugd2lsbAotICAgICAgLy8gZmluZCB0aGUgZGVmYXVsdCBzZXJ2ZXIgYW5kIHJ1bnRpbWUuCi0gICAgICAKLSAgICAgIHNlcnZlciAgPSBnZXREZWZhdWx0U2VydmVyVmFsdWVGb3IodHlwZSk7Ci0gICAgICBydW50aW1lID0gZ2V0RGVmYXVsdFJ1bnRpbWVWYWx1ZUZvcih0eXBlKTsKLQotICAgICAgZWxlbSA9IGdldENvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKHNlcnZlciwgcnVudGltZSwgdHlwZSk7Ci0gICAgICAKLSAgICB9Ci0gICAKLSAgICByZXR1cm4gd3NzcnQ7Ci0KLSAgfQotCi0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgPGNvZGU+V2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlPC9jb2RlPiBnaXZlbiB0aGUgdHlwZSBuYW1lLgotICAqIEBwYXJhbSB0eXBlIG5hbWUKLSAgKiBAcmV0cnVuIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBvYmplY3QKLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBnZXRXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVCeUlkKFN0cmluZyBpZCkKLSAgewotICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSB3c3NydCA9IG51bGw7Ci0gICAgaWYgKGNvbmZpZ0VsZW1zQnlJZF8uY29udGFpbnNLZXkoaWQpKQotICAgIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gKElDb25maWd1cmF0aW9uRWxlbWVudCljb25maWdFbGVtc0J5SWRfLmdldChpZCk7Ci0gICAgICAgIE9iamVjdCB3ZWJTZXJ2aWNlVHlwZSA9IGVsZW0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VUeXBlIGluc3RhbmNlb2YgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlKSAKLSAgICAgICAgewotICAgICAgICAgIHdzc3J0ID0gKFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSl3ZWJTZXJ2aWNlVHlwZTsKLSAgICAgICAgICB3c3NydC5zZXRTZXJ2ZXJMYWJlbChlbGVtLmdldEF0dHJpYnV0ZSgic2VydmVyIikpOwotICAgICAgICAgIHdzc3J0LnNldFJ1bnRpbWVMYWJlbChlbGVtLmdldEF0dHJpYnV0ZSgicnVudGltZSIpKTsKLSAgICAgICAgICB3c3NydC5zZXRXZWJNb2R1bGVSZXF1aXJlZCggQm9vbGVhbi52YWx1ZU9mKGVsZW0uZ2V0QXR0cmlidXRlKCJyZXF1aXJlV2ViTW9kdWxlIikpLmJvb2xlYW5WYWx1ZSgpICk7Ci0gICAgICAgICAgd3NzcnQuc2V0RUpCTW9kdWxlUmVxdWlyZWQoIEJvb2xlYW4udmFsdWVPZihlbGVtLmdldEF0dHJpYnV0ZSgicmVxdWlyZUVKQk1vZHVsZSIpKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBpbXBsZW1lbnRlZEludGVyZmFjZSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MudWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSAiOwotICAgICAgICAgIFN0cmluZyBlcnJNc2cgPSAiRXh0ZW5zaW9ucyBvZiB0aGUgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlcyBleHRlbnNpb24gcG9pbnQgbXVzdCBpbXBsZW1lbnQgdGhlICI7Ci0gICAgICAgICAgZXJyTXNnID0gZXJyTXNnICsgaW1wbGVtZW50ZWRJbnRlcmZhY2UgKyAiaW50ZXJmYWNlLiI7Ci0gICAgICAgICAgbG9nXy5sb2coTG9nLkVSUk9SLCA1MDYxLCB0aGlzLCAiZ2V0V2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlQnlJZCIsIGVyck1zZyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgICBsb2dfLmxvZyhMb2cuRVJST1IsIDUwNjIsIHRoaXMsICJnZXRXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVCeUlkIiwgY2UpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB3c3NydDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlVHlwZUJ5U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotCi0gICAgVHlwZVNlbGVjdGlvbkZpbHRlciB0c2YgPSBuZXcgVHlwZVNlbGVjdGlvbkZpbHRlcigpOwotICAgIFN0cmluZ1tdIHdzdCA9IHRzZi5nZXRXZWJTZXJ2aWNlVHlwZUJ5SW5pdGlhbFNlbGVjdGlvbihzZWxlY3Rpb24sIHdlYlNlcnZpY2VUeXBlcyk7Ci0gICAgcmV0dXJuIHdzdCA9PSBudWxsID8gbnVsbCA6IHdzdDsKLQotICB9Ci0KLSAgcHVibGljIElXZWJTZXJ2aWNlVHlwZSBnZXRXZWJTZXJ2aWNlVHlwZUJ5VHlwZUxhYmVsKFN0cmluZyB3ZWJTZXJ2aWNlVHlwZUxhYmVsKQotICB7Ci0KLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VUeXBlSW1wbCB3c3QgPSAoV2ViU2VydmljZVR5cGVJbXBsKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzdCE9bnVsbCkgewotICAgICAgICBpZiAod3N0LmdldExhYmVsKCkuZXF1YWxzKHdlYlNlcnZpY2VUeXBlTGFiZWwpKSB7Ci0gICAgICAgICAgcmV0dXJuIHdzdDsgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxTZWxlY3Rpb25WYWxpZEZvckNob3NlblR5cGUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdbXSBzdXBwb3J0ZWRUeXBlcyA9IGdldFdlYlNlcnZpY2VUeXBlQnlTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICBpZiAoc3VwcG9ydGVkVHlwZXMhPW51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpPHN1cHBvcnRlZFR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAoc3VwcG9ydGVkVHlwZXNbaV0uZXF1YWxzKHR5cGVOYW1lKSkKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclN1cHBvcnRlZEZvckNob3NlblR5cGUoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHNlcnZlcklEKQotICB7Ci0gICAgaWYgKHNlcnZlcnNCeVR5cGVfLmNvbnRhaW5zS2V5KHR5cGVJZCkpCi0gICAgewotICAgICAgVmVjdG9yIHZlY3QgPSAoVmVjdG9yKXNlcnZlcnNCeVR5cGVfLmdldCh0eXBlSWQpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHZlY3Quc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KChTdHJpbmcpdmVjdC5lbGVtZW50QXQoaSkpOwotICAgICAgICBpZiAoc2VydmVySUQhPW51bGwpIHsKLSAgICAgICAgICBpZiAoc2VydmVySUQuZXF1YWxzSWdub3JlQ2FzZSh3c3MuZ2V0RmFjdG9yeUlkKCkpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclJ1bnRpbWVUeXBlU3VwcG9ydGVkKFN0cmluZyBzZXJ2ZXIsIFN0cmluZyBydW50aW1lLCBTdHJpbmcgdHlwZSkgIHsKLQotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIHdzc3J0ID0gbnVsbDsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVyLCBydW50aW1lLCB0eXBlKTsKLSAgICAgIHJldHVybiBlbGVtID09IG51bGwgPyBmYWxzZSA6IHRydWU7IAotICAgICAgICAgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTZXJ2ZXJWYWx1ZUZvcihTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgU3RyaW5nW10gc2VydmVyczsgCi0gICAgaWYgKHNlcnZlcnNCeVR5cGVfLmNvbnRhaW5zS2V5KHR5cGVJZCkpCi0gICAgewotICAgICAgVmVjdG9yIHZlY3QgPSAoVmVjdG9yKXNlcnZlcnNCeVR5cGVfLmdldCh0eXBlSWQpOwotICAgICAgc2VydmVycyA9IG5ldyBTdHJpbmdbdmVjdC5zaXplKCldOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHZlY3Quc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBzZXJ2ZXJJZCA9IChTdHJpbmcpdmVjdC5lbGVtZW50QXQoaSk7Ci0gICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHNlcnZlcklkKTsKLSAgICAgICAgc2VydmVyc1tpXSA9IChTdHJpbmcpd3NzLmdldElkKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2VydmVyc1swXTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxvZ18ubG9nKExvZy5FUlJPUiwgNTA2MywgdGhpcywgImdldFNlcnZlckJ5VHlwZSIsICJVbmFibGUgdG8gZmluZCBkZWZhdWx0IHNlcnZlciBmb3IgIit0eXBlSWQpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lVmFsdWVGb3IoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFN0cmluZ1tdIHJ1bnRpbWVOYW1lID0gZ2V0UnVudGltZXNCeVR5cGUodHlwZUlkKTsKLSAgICBmb3IgKGludCBpPTA7IGk8cnVudGltZU5hbWUubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgICBXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSAoV2ViU2VydmljZVJ1bnRpbWUpd2ViU2VydmljZVJ1bnRpbWVzLmdldChydW50aW1lTmFtZVtpXSk7Ci0gICAgICAgIGlmICh3c3IuZ2V0SXNEZWZhdWx0KCkpCi0gICAgICAgIAlyZXR1cm4gcnVudGltZU5hbWVbaV07Ci0gICAgfSAgIAotICAgIHJldHVybiBydW50aW1lTmFtZVswXTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJZEZvckZhY3RvcnlJZChTdHJpbmcgZmFjdG9yeUlkKSB7Ci0KLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVNlcnZlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NzLmdldEZhY3RvcnlJZCgpLmVxdWFscyhmYWN0b3J5SWQpKSB7Ci0gICAgICAgIHJldHVybiB3c3MuZ2V0SWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0KLSAgfQotIAotICBwdWJsaWMgZmluYWwgY2xhc3MgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXwotICB7Ci0gICAgCi0gICBwdWJsaWMgU3RyaW5nIHR5cGVJZF87Ci0gICBwdWJsaWMgU3RyaW5nIHNlcnZlcklkXzsKLSAgIHB1YmxpYyBTdHJpbmcgcnVudGltZUlkXzsKLSAgIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudF87Ci0gICAKLSAgIHB1YmxpYyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfKFN0cmluZyBzZXJ2ZXJJZCwgU3RyaW5nIHJ1bnRpbWVJZCxTdHJpbmcgdHlwZUlkLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSkKLSAgIHsKLSAgICB0aGlzLnR5cGVJZF8gPSB0eXBlSWQ7Ci0gICAgdGhpcy5zZXJ2ZXJJZF8gPSBzZXJ2ZXJJZDsKLSAgICB0aGlzLnJ1bnRpbWVJZF8gPSBydW50aW1lSWQ7Ci0gICAgdGhpcy5lbGVtZW50XyA9IGVsZW07Ci0gICB9Ci0gICAgCi0gICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKFN0cmluZyBzZXJ2ZXJJRCwgU3RyaW5nIHJ1bnRpbWVJRCwgU3RyaW5nIHR5cGVJRCkKLSAgIHsKLSAgICBpZiAodGhpcy50eXBlSWRfLmVxdWFscyh0eXBlSUQpICYmIHRoaXMuc2VydmVySWRfLmVxdWFscyhzZXJ2ZXJJRCkgJiYgdGhpcy5ydW50aW1lSWRfLmVxdWFscyhydW50aW1lSUQpKQotICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudF87Ci0gICAgcmV0dXJuIG51bGw7Ci0gICB9Ci0gICAKLSAgIHB1YmxpYyBib29sZWFuIGhhc0NvbmZpZ0VsZW1lbnRGb3IoU3RyaW5nIGZhY3RvcnlJRCwgU3RyaW5nIHJ1bnRpbWVJRCwgU3RyaW5nIHR5cGVJRCkgCi0gICB7Ci0gICAgIFN0cmluZyBzZXJ2ZXJJRCA9IGdldFNlcnZlcklkRm9yRmFjdG9yeUlkKCBmYWN0b3J5SUQgKTsgCi0gICAgICAgCi0gICAgIGlmICh0eXBlSWRfLmVxdWFsc0lnbm9yZUNhc2UodHlwZUlEKSAmJgotICAgICAgICAgc2VydmVySWRfLmVxdWFsc0lnbm9yZUNhc2Uoc2VydmVySUQpICYmCi0gICAgICAgICBydW50aW1lSWRfLmVxdWFsc0lnbm9yZUNhc2UocnVudGltZUlEKSkKLSAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgfQotICAgICAKLSAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSBnZXRGYWN0b3J5RmFjdG9yeSggU3RyaW5nW10gaWRzICkKLSAgewotICAgIFN0cmluZyAgICAgICAgICAgICAgICBoYXNoS2V5ID0gaWRzWzJdICsgIiMiICsgaWRzWzFdICsgIiMiICsgaWRzWzBdOwotICAgIENvbW1hbmRXaWRnZXRCaW5kaW5nICBiaW5kaW5nID0gKENvbW1hbmRXaWRnZXRCaW5kaW5nKWZhY3RvcnlDYWNoZV8uZ2V0KCBoYXNoS2V5ICk7Ci0gICAgCi0gICAgaWYoIGJpbmRpbmcgPT0gbnVsbCApIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZ2V0Q29uZmlnRWxlbWVudEZvciggaWRzWzJdLCBpZHNbMV0sIGlkc1swXSApOyAKLSAgICAKLSAgICAgIGlmKCBlbGVtZW50ID09IG51bGwgKSByZXR1cm4gbnVsbDsKLSAgICAKLSAgICAgIGJpbmRpbmcgPSBjcmVhdGVCaW5kaW5nKCBlbGVtZW50ICk7Ci0gICAgICAKLSAgICAgIGZhY3RvcnlDYWNoZV8ucHV0KCBoYXNoS2V5LCBiaW5kaW5nICk7Ci0gICAgICAKLSAgICAgIGJpbmRpbmcucmVnaXN0ZXJEYXRhTWFwcGluZ3MoIGRhdGFNYXBwaW5nUmVnaXN0cnlfICk7Ci0gICAgICAKLSAgICAgIGlmKCB3aWRnZXRSZWdpc3RyeV8gIT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyggd2lkZ2V0UmVnaXN0cnlfICk7Ci0gICAgICAgIGJpbmRpbmcucmVnaXN0ZXJDYW5GaW5pc2goIGNhbkZpbmlzaFJlZ2lzdHJ5XyApOwotICAgICAgfQotICAgIH0KLSAgICAgICAgIAotICAgIHJldHVybiBiaW5kaW5nOyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBDb21tYW5kV2lkZ2V0QmluZGluZyBjcmVhdGVCaW5kaW5nKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ICkgCi0gIHsKLSAgICBWZWN0b3IgYmluZGluZ3MgPSBuZXcgVmVjdG9yKDQpOwotICAgIFZlY3RvciBmcmFnbWVudHMgPSBuZXcgVmVjdG9yKDQpOwotICAgIAotICAgIGFkZEJpbmRpbmcoIGVsZW1lbnQsICJkZXZlbG9wQmluZGluZyIsIGJpbmRpbmdzICk7Ci0gICAgYWRkQmluZGluZyggZWxlbWVudCwgImFzc2VtYmx5QmluZGluZyIsIGJpbmRpbmdzICk7Ci0gICAgYWRkQmluZGluZyggZWxlbWVudCwgImRlcGxveUJpbmRpbmciLCBiaW5kaW5ncyApOwotICAgIGFkZEJpbmRpbmcoIGVsZW1lbnQsICJpbnN0YWxsQmluZGluZyIsIGJpbmRpbmdzICk7Ci0gICAgCi0gICAgZnJhZ21lbnRzLmFkZCggbmV3IFNlcnZpY2VQcmVEZXZlbG9wRnJhZ21lbnQoKSApOwotICAgIGZyYWdtZW50cy5hZGQoIG5ldyBTZXJ2aWNlUHJlQXNzZW1ibHlGcmFnbWVudCgpICk7Ci0gICAgZnJhZ21lbnRzLmFkZCggbmV3IFNlcnZpY2VQcmVEZXBsb3lGcmFnbWVudCgpICk7Ci0gICAgZnJhZ21lbnRzLmFkZCggbmV3IFNlcnZpY2VQcmVJbnN0YWxsRnJhZ21lbnQoKSApOwotICAgICAKLSAgICByZXR1cm4gbmV3IENvbW1hbmRXaWRnZXRCaW5kaW5nTGlzdCggYmluZGluZ3MsIGZyYWdtZW50cyApOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgYWRkQmluZGluZyggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBiaW5kaW5nTmFtZSwgVmVjdG9yIGxpc3QgKQotICB7Ci0gICAgT2JqZWN0IGJpbmRpbmcgPSBudWxsOwotICAgIAotICAgIGlmKCBlbGVtZW50LmdldEF0dHJpYnV0ZSggYmluZGluZ05hbWUgKSAhPSBudWxsICkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZyA9IGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbiggYmluZGluZ05hbWUgKTsgCi0gICAgICB9Ci0gICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBsaXN0LmFkZCggYmluZGluZyApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXREYXRhTWFwcGluZ1JlZ2lzdHJ5KCBEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5ICkKLSAgewotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnlfID0gcmVnaXN0cnk7Ci0gICAgCi0gICAgLy8gV2UgbmVlZCB0byByZWJ1aWxkIHRoZSBmYWN0b3J5IGNhY2hlIGVhY2ggdGltZSB3ZSBzdGFydCB0aGUgc2VydmVyCi0gICAgLy8gd2l6YXJkLgotICAgIGZhY3RvcnlDYWNoZV8gICAgICAgID0gbmV3IEhhc2hNYXAoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V2lkZ2V0UmVnaXN0cnkoIFdpZGdldFJlZ2lzdHJ5IHJlZ2lzdHJ5ICkKLSAgewotICAgIHdpZGdldFJlZ2lzdHJ5XyA9IHJlZ2lzdHJ5OzsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDYW5GaW5pc2hSZWdpc3RyeSggQ2FuRmluaXNoUmVnaXN0cnkgcmVnaXN0cnkgKQotICB7Ci0gICAgY2FuRmluaXNoUmVnaXN0cnlfID0gcmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWxsU2VydmVyRmFjdG9yeUlkcygpCi0gIHsKLSAgCU9iamVjdFtdIHNlcnZlcnMgPSB3ZWJTZXJ2aWNlU2VydmVycy52YWx1ZXMoKS50b0FycmF5KCk7Ci0gIAlTdHJpbmdbXSBmYWN0b3J5SWRzID0gbmV3IFN0cmluZ1tzZXJ2ZXJzLmxlbmd0aF07Ci0gIAlmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgCXsKLSAgCQlXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKXNlcnZlcnNbaV07Ci0gIAkJZmFjdG9yeUlkc1tpXSA9IHdzcy5nZXRGYWN0b3J5SWQoKTsKLSAgCX0KLSAgCXJldHVybiBmYWN0b3J5SWRzOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckZhY3RvcnlJZEZyb21TZXJ2ZXJJZChTdHJpbmcgc2VydmVySWQpCi0gIHsKLSAgCU9iamVjdFtdIHNlcnZlcnMgPSB3ZWJTZXJ2aWNlU2VydmVycy52YWx1ZXMoKS50b0FycmF5KCk7Ci0gIAlmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgCXsKLSAgCQlXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKXNlcnZlcnNbaV07Ci0gIAkJaWYgKHNlcnZlcklkID09IHdzcy5nZXRJZCgpKQotICAJCXsKLSAgCQkJcmV0dXJuIHdzcy5nZXRGYWN0b3J5SWQoKTsKLSAgCQl9Ci0gIAkJCQotICAJfQotICAJcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFJldHVybnMgYSBjYXNjYWRpbmcgbGlzdCBvZiB2YWxpZCBjaG9pY2VzIGZvciBzZXJ2ZXIsIHJ1bnRpbWUsIGFuZCBKMkVFIGxldmVscy4gCi0gICAqIFRoaXMgaXMgYW4gaW50ZXJzZWN0aW9uIG9mIHdoYXQgaXMgYXZhaWxhYmxlIGZvciBzZXJ2aWNlIGFuZCBjbGllbnQuIAotICAgKi8KLSAgcHVibGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldFNlcnZlclRvUnVudGltZVRvSjJFRSgpCi0gIHsKLSAgCWlmIChzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfIT1udWxsKQotICAJewotICAJCXJldHVybiBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfOwotICAJfQotICAJCi0gIAlTdHJpbmdbXSBzZXJ2ZXJzID0gZ2V0U3RyaW5nQXJyYXlJbnRlcnNlY3Rpb24oZ2V0QWxsU2VydmVyRmFjdG9yeUlkcygpLCBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpKTsKLSAgICBTZWxlY3Rpb25MaXN0IHNlcnZlcnNMaXN0ID0gbmV3IFNlbGVjdGlvbkxpc3Qoc2VydmVycywgMCk7Ci0gICAgVmVjdG9yIGNob2ljZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgIAljaG9pY2VzLmFkZChnZXRSdW50aW1lQ2hvaWNlcyhzZXJ2ZXJzW2ldKSk7Ci0gICAgfQotICAgIHNlcnZlclRvUnVudGltZVRvSjJFRV8gPSBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMoc2VydmVyc0xpc3QsIGNob2ljZXMpOwotICAgIHJldHVybiBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfOwotICAJCi0gIH0KLSAgCi0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0UnVudGltZUNob2ljZXMoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJU3RyaW5nW10gc2VydmljZVJ1bnRpbWVzID0gZ2V0UnVudGltZUlEc0J5U2VydmVyRmFjdG9yeUlEKHNlcnZlckZhY3RvcnlJZCk7Ci0gIAlTdHJpbmdbXSBjbGllbnRSdW50aW1lcyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRSdW50aW1lSWRzQnlTZXJ2ZXJGYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkKTsKLSAgCVN0cmluZ1tdIHJ1bnRpbWVzID0gZ2V0U3RyaW5nQXJyYXlJbnRlcnNlY3Rpb24oc2VydmljZVJ1bnRpbWVzLCBjbGllbnRSdW50aW1lcyk7Ci0gIAlTZWxlY3Rpb25MaXN0IHJ1bnRpbWVzTGlzdCA9IG5ldyBTZWxlY3Rpb25MaXN0KHJ1bnRpbWVzLCAwKTsKLSAgCVZlY3RvciBjaG9pY2VzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGk9MDsgaTxydW50aW1lcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgCWNob2ljZXMuYWRkKGdldEoyRUVDaG9pY2VzKHJ1bnRpbWVzW2ldKSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMocnVudGltZXNMaXN0LCBjaG9pY2VzKTsgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0SjJFRUNob2ljZXMoU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAJU3RyaW5nW10gc2VydmljZUoyRUVWZXJzaW9ucyA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChydW50aW1lSWQpLmdldEoyRUVWZXJzaW9ucygpOwotICAJU3RyaW5nW10gY2xpZW50SjJFRVZlcnNpb25zID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChydW50aW1lSWQpLmdldEoyRUVWZXJzaW9ucygpOwotICAJU3RyaW5nW10gajJlZVZlcnNpb25zID0gZ2V0U3RyaW5nQXJyYXlJbnRlcnNlY3Rpb24oc2VydmljZUoyRUVWZXJzaW9ucywgY2xpZW50SjJFRVZlcnNpb25zKTsKLSAgCVNlbGVjdGlvbkxpc3QgajJlZVZlcnNpb25zTGlzdCA9IG5ldyBTZWxlY3Rpb25MaXN0KGoyZWVWZXJzaW9ucywgMCk7Ci0gIAlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKGoyZWVWZXJzaW9uc0xpc3QsIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckxhYmVsKFN0cmluZyBmYWN0b3J5SWQpCi0gIHsKLSAgCWlmIChmYWN0b3J5SWQ9PW51bGwgfHwgZmFjdG9yeUlkLmxlbmd0aCgpPT0wKQotICAJCXJldHVybiBudWxsOwotICAJCi0gIAlpZiAoc2VydmVyTGFiZWxCeUZhY3RvcnlJZF8uY29udGFpbnNLZXkoZmFjdG9yeUlkKSkKLSAgCXsKLSAgCSAgcmV0dXJuIChTdHJpbmcpc2VydmVyTGFiZWxCeUZhY3RvcnlJZF8uZ2V0KGZhY3RvcnlJZCk7Ci0gIAl9Ci0gIAllbHNlCi0gIAl7Ci0gIAkgIHJldHVybiBudWxsOwotICAJfQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgCWlmIChsYWJlbD09bnVsbCB8fCBsYWJlbC5sZW5ndGgoKT09MCkKLSAgCQlyZXR1cm4gbnVsbDsKLSAgCQotICAJaWYgKHNlcnZlckZhY3RvcnlJZEJ5TGFiZWxfLmNvbnRhaW5zS2V5KGxhYmVsKSkKLSAgCXsKLSAgCSAgcmV0dXJuIChTdHJpbmcpc2VydmVyRmFjdG9yeUlkQnlMYWJlbF8uZ2V0KGxhYmVsKTsgIAotICAJfQotICAJZWxzZQotICAJewotICAJICByZXR1cm4gbnVsbDsKLSAgCX0gIAkgIAkKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRSdW50aW1lTGFiZWwoU3RyaW5nIGlkKQotICB7Ci0gIAlpZiAoaWQ9PW51bGwgfHwgaWQubGVuZ3RoKCk9PTApCi0gIAkJcmV0dXJuIG51bGw7Ci0gIAkKLSAgCXJldHVybiAoU3RyaW5nKSBydW50aW1lTGFiZWxCeUlkXy5nZXQoaWQpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVJZChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgCWlmIChsYWJlbD09bnVsbCB8fCBsYWJlbC5sZW5ndGgoKT09MCkKLSAgCQlyZXR1cm4gbnVsbDsKLSAgCQotICAJcmV0dXJuIChTdHJpbmcpcnVudGltZUlkQnlMYWJlbF8uZ2V0KGxhYmVsKTsgIAkKLSAgfSAgCi0gIAotICBwcml2YXRlIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5SW50ZXJzZWN0aW9uKFN0cmluZ1tdIGExLCBTdHJpbmdbXSBhMikKLSAgewotICAJVmVjdG9yIHZmID0gbmV3IFZlY3RvcigpOwotICAJaWYgKGExPT1udWxsIHx8IGEyPT1udWxsKQotICAJewotICAJCXJldHVybiBjb252ZXJ0VG9TdHJpbmdBcnJheSh2Zi50b0FycmF5KCkpOwotICAJfSAgCQotICAJCi0gIAlmb3IgKGludCBpPTA7IGk8YTEubGVuZ3RoOyBpKyspCi0gIAl7Ci0gIAkJZm9yIChpbnQgaj0wOyBqPGEyLmxlbmd0aDsgaisrKQotICAJCXsKLSAgCQkJaWYgKGExW2ldLmVxdWFscyhhMltqXSkpCi0gIAkJCXsKLSAgCQkJCXZmLmFkZChhMVtpXSk7Ci0gIAkJCQlicmVhazsKLSAgCQkJfQotICAJCX0KLSAgCX0KLSAgCQotICAJcmV0dXJuIGNvbnZlcnRUb1N0cmluZ0FycmF5KHZmLnRvQXJyYXkoKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nW10gY29udmVydFRvU3RyaW5nQXJyYXkoT2JqZWN0W10gYSkKLSAgewotICAJaWYgKGE9PW51bGwpIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAJCi0gIAlpbnQgbGVuZ3RoID0gYS5sZW5ndGg7Ci0gIAlTdHJpbmdbXSBzYSA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKLSAgCWZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykKLSAgCXsKLSAgCQlPYmplY3Qgb2JqID0gYVtpXTsKLSAgCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKQotICAJCXsKLSAgCQkJc2FbaV0gPSAoU3RyaW5nKW9iajsKLSAgCQl9Ci0gIAl9Ci0gIAlyZXR1cm4gc2E7Ci0gIH0KLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOGY0ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VUeXBlCi0qIG9iamVjdCBpcyB0byBtYW51ZmFjdHVyZSB0aGUgd2l6YXJkIHBhZ2VzIHRoYXQgc3VwcG9ydCB0aGUgdHlwZS4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VUeXBlCi17Ci0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjlkZTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLQotLyoqCi0qIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBhIGtpbmQgb2YKLSogV2ViIFNlcnZpY2UgYXJ0aWZhY3QuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgYSBXZWJTZXJ2aWNlVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUuCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUeXBlSW1wbCBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudF87Ci0gIHB1YmxpYyBTdHJpbmcgdHlwZUlkXzsKLSAgcHVibGljIFN0cmluZyB0eXBlTGFiZWxfOwotICBwdWJsaWMgU3RyaW5nW10gZXh0ZW5zaW9uTWV0YWRhdGFfOwotICBwdWJsaWMgU3RyaW5nW10gcmVzb3VyY2VUeXBlTWV0YWRhdGFfOwotICBwdWJsaWMgQm9vbGVhbiBjYW5GaW5pc2hfOwotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlVHlwZUltcGwoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0pCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuZWxlbWVudF8gPSBlbGVtOyAKLSAgfQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBpZCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQgKCkKLSAgewotICAgIGlmICh0eXBlSWRfPT1udWxsKQotICAgICAgdHlwZUlkXyA9IGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgiaWQiKTsKLSAgICByZXR1cm4gdHlwZUlkXzsKLSAgfQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIEEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCAoKQotICB7Ci0gICAgaWYgKHR5cGVMYWJlbF8gPT0gbnVsbCkKLSAgICAgIHR5cGVMYWJlbF8gPSBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImxhYmVsIik7Ci0gICAgcmV0dXJuIHR5cGVMYWJlbF87ICAgIAotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyBleHRlbnNpb24gbWV0YWRhdGEuCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyBleHRlbnNpb24gbWV0YWRhdGEuCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRFeHRlbnNpb25NZXRhZGF0YSAoKQotICB7Ci0gICAgaWYgKGV4dGVuc2lvbk1ldGFkYXRhXyA9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImV4dGVuc2lvbk1ldGFkYXRhIikpOwotICAgICAgZXh0ZW5zaW9uTWV0YWRhdGFfID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLSAgICAgIGludCBpPTA7Ci0gICAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBleHRlbiA9IChTdHJpbmcpc3QubmV4dFRva2VuKCk7Ci0gICAgICAgIGlmIChleHRlbiE9bnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGV4dGVuc2lvbk1ldGFkYXRhX1tpXT1leHRlbjsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgICB9ICAgIAotICAgIH0KLSAgICByZXR1cm4gdGhpcy5leHRlbnNpb25NZXRhZGF0YV87Ci0gIH0gICAgCi0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyByZXNvdXJjZSBtZXRhZGF0YS4KLSAgKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZSdzIHJlc291cmNlIG1ldGFkYXRhLgotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VUeXBlTWV0YWRhdGEgKCkKLSAgewotICAgIGlmIChyZXNvdXJjZVR5cGVNZXRhZGF0YV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgicmVzb3VyY2VUeXBlTWV0YWRhdGEiKSk7ICAgIAotICAgICAgcmVzb3VyY2VUeXBlTWV0YWRhdGFfID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLSAgICAgIGludCBpPTA7Ci0gICAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZXNvdXJjZVR5cGUgPSAoU3RyaW5nKXN0Lm5leHRUb2tlbigpOwotICAgICAgICBpZiAocmVzb3VyY2VUeXBlIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb3VyY2VUeXBlTWV0YWRhdGFfW2ldPXJlc291cmNlVHlwZTsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXNvdXJjZVR5cGVNZXRhZGF0YV87Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBsdWdpbi54bWwgY29udGFpbnMgYW4gYXR0cmlidXRlIG9mICJjYW5GaW5pc2giIHdpdGggYSB2YWx1ZSBvZiB0cnVlLiAgT3RoZXJ3aXNlLCAKLSAgKiBmYWxzZSBpcyByZXR1cm5lZC4gIE5vdGU6IGlmIHRoZSAiY2FuRmluaXNoIiBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCB0cnVlIGlzIHJldHVybmVkIGJ5IGRlZmF1bHQuCi0gICogQHJldHVybiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIGNhbiBmaW5pc2ggb24gdGhlIHBhZ2VzIGJlZm9yZSB0aGUgd2ViIHNlcnZpY2UgdHlwZSBwYWdlcy4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuRmluaXNoKCkKLSAgewotICAgIGlmKCBjYW5GaW5pc2hfID09IG51bGwgKQotICAgIHsgICAgICAKLSAgICAgIFN0cmluZyBjYW5GaW5pc2hTdHJpbmcgPSBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImNhbkZpbmlzaCIpOwotCi0gICAgICBjYW5GaW5pc2hfID0gY2FuRmluaXNoU3RyaW5nID09IG51bGwgPyBuZXcgQm9vbGVhbiggdHJ1ZSApIDogQm9vbGVhbi52YWx1ZU9mKCBjYW5GaW5pc2hTdHJpbmcgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY2FuRmluaXNoXy5ib29sZWFuVmFsdWUoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGgKLSAgICogdGhpcyB0eXBlLgotICAgKiAKLSAgICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ci0gICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkKLSAgewotICAgIHJldHVybiB0aGlzLmVsZW1lbnRfOyAKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCkKLSAgewotICAgIHJldHVybiBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoIm9iamVjdFNlbGVjdGlvbldpZGdldCIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlVHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlVHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzNmZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmVjbGlwc2UuRWNsaXBzZUxvZzsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUeXBlUmVnaXN0cnkKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgSGFzaHRhYmxlIHR5cGVzQnlOYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSB0eXBlTmFtZXNfOwotCi0gIC8vCi0gIC8vIExvYWRzIFdlYlNlcnZpY2VUeXBlIG9iamVjdHMgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBUaGlzIGlzIGRvbmUgYnkgcXVlcnlpbmcgdGhlIHBsdWdpbiByZWdpc3RyeSBmb3IgYWxsIGV4dGVuc2lvbnMKLSAgLy8gaGFuZ2luZyBvbiB0aGUgd2ViU2VydmljZVR5cGUgZXh0ZW5zaW9uIHBvaW50LiBFeHRlbnNpb25zCi0gIC8vIG11c3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS5qc3Qud3MudWkud2l6YXJkLldlYlNlcnZpY2VUeXBlCi0gIC8vIGludGVyZmFjZS4KLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGxvYWRUeXBlcyAoKQotICB7Ci0gIAlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJTZXJ2aWNlVHlwZSIpOwotCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PGNvbmZpZy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IGNvbmZpZ1tpZHhdOwotICAgICAgdHJ5IAotICAgICAgewotICAgICAgICBPYmplY3Qgd2ViU2VydmljZVR5cGUgPSBlbGVtLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICAgIGlmICh3ZWJTZXJ2aWNlVHlwZSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VUeXBlKSAKLSAgICAgICAgewotICAgICAgICAgIGFkZCgoV2ViU2VydmljZVR5cGUpd2ViU2VydmljZVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBpbXBsZW1lbnRlZEludGVyZmFjZSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MudWkud2l6YXJkLldlYlNlcnZpY2VUeXBlICI7Ci0gICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJFeHRlbnNpb25zIG9mIHRoZSB3ZWJTZXJ2aWNlVHlwZXMgZXh0ZW5zaW9uIHBvaW50IG11c3QgaW1wbGVtZW50IHRoZSAiOwotICAgICAgICAgIGVyck1zZyA9IGVyck1zZyArIGltcGxlbWVudGVkSW50ZXJmYWNlICsgImludGVyZmFjZS4iOwotICAgICAgCSAgbG9nLmxvZyhMb2cuRVJST1IsIDUwNTYsIHRoaXMsICJsb2FkVHlwZXMiLCBlcnJNc2cpOwotICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAJbG9nLmxvZyhMb2cuRVJST1IsIDUwNTcsIHRoaXMsICJsb2FkVHlwZXMiLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLwotICAvLyBMb2FkcyBXZWJTZXJ2aWNlVHlwZSBvYmplY3RzIGludG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gU2VlIG1ldGhvZCBnZXRJbnN0YW5jZSgpLgotICAvLwotICBwcml2YXRlIHZvaWQgbG9hZCAoKQotICB7Ci0gICAgdHlwZXNCeU5hbWVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGxvYWRUeXBlcygpOwotICAgIGluZGV4VHlwZXNCeU5hbWUoKTsKLSAgfQotCi0gIC8vCi0gIC8vIEFkZCB0aGUgZ2l2ZW4gV2ViU2VydmljZVR5cGUgdG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gU2VlIG1ldGhvZCBsb2FkKCkuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBhZGQgKCBXZWJTZXJ2aWNlVHlwZSB3c3QgKQotICB7Ci0gICAgdHlwZXNCeU5hbWVfLnB1dCh3c3QuZ2V0TmFtZSgpLHdzdCk7Ci0gIH0KLQotICAvLwotICAvLyBCdWlsZHMgYW4gaW5kZXggb2YgV2ViU2VydmljZVR5cGUgb2JqZWN0cyBieSB0aGVpciBuYW1lcy4KLSAgLy8gU2VlIG1ldGhvZCBsb2FkKCkuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBpbmRleFR5cGVzQnlOYW1lICgpCi0gIHsKLSAgICBpZiAodHlwZU5hbWVzXyA9PSBudWxsKQotICAgIHsKLSAgICAgIHR5cGVOYW1lc18gPSBuZXcgU3RyaW5nW3R5cGVzQnlOYW1lXy5zaXplKCldOwotICAgICAgRW51bWVyYXRpb24gZSA9IHR5cGVzQnlOYW1lXy5rZXlzKCk7Ci0gICAgICBmb3IgKGludCBpPTA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgdHlwZU5hbWVzX1tpXSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgKiBAcmV0dXJuIEEgc2luZ2xldG9uIFdlYlNlcnZpY2VUeXBlUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VUeXBlUmVnaXN0cnkgZ2V0SW5zdGFuY2UgKCkKLSAgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSBuZXcgV2ViU2VydmljZVR5cGVSZWdpc3RyeSgpOwotICAgICAgaW5zdGFuY2VfLmxvYWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYWxsIHJlZ2lzdGVyZWQgPGNvZGU+V2ViU2VydmljZVR5cGU8L2NvZGU+IG9iamVjdHMuCi0gICogQHJldHVybiBBbGwgcmVnaXN0ZXJlZCA8Y29kZT5XZWJTZXJ2aWNlVHlwZTwvY29kZT4gb2JqZWN0cy4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VUeXBlW10gZ2V0V2ViU2VydmljZVR5cGVzICgpCi0gIHsKLSAgICBXZWJTZXJ2aWNlVHlwZVtdIHdzdHMgPSBuZXcgV2ViU2VydmljZVR5cGVbdHlwZXNCeU5hbWVfLnNpemUoKV07Ci0gICAgRW51bWVyYXRpb24gZSA9IHR5cGVzQnlOYW1lXy5lbGVtZW50cygpOwotICAgIGZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIHsKLSAgICAgIHdzdHNbaV0gPSAoV2ViU2VydmljZVR5cGUpZS5uZXh0RWxlbWVudCgpOwotICAgIH0KLSAgICByZXR1cm4gd3N0czsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VUeXBlPC9jb2RlPgotICAqIG9iamVjdHMuCi0gICogQHJldHVybiBUaGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgPGNvZGU+V2ViU2VydmljZVR5cGU8L2NvZGU+Ci0gICogb2JqZWN0cy4KLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VUeXBlTmFtZXMgKCkKLSAgewotICAgIHJldHVybiB0eXBlTmFtZXNfOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgPGNvZGU+V2ViU2VydmljZVR5cGU8L2NvZGU+IG9iamVjdCBvZiB0aGUgZ2l2ZW4KLSAgKiA8Y29kZT5uYW1lPC9jb2RlPiBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggb2JqZWN0LgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSA8Y29kZT5XZWJTZXJ2aWNlVHlwZTwvY29kZT4gdG8gZmluZC4KLSAgKiBAcmV0dXJuIFRoZSA8Y29kZT5XZWJTZXJ2aWNlVHlwZTwvY29kZT4gb3IgbnVsbCBpZiBubyBzdWNoIG9iamVjdAotICAqIHdhcyBmb3VuZC4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VUeXBlIGdldFdlYlNlcnZpY2VUeXBlQnlOYW1lICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgcmV0dXJuIChuYW1lID09IG51bGwgPyBudWxsIDogKFdlYlNlcnZpY2VUeXBlKXR5cGVzQnlOYW1lXy5nZXQobmFtZSkpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5SUJNLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeUlCTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmVhMTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5SUJNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLldTUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5SUJNIGltcGxlbWVudHMgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotewotCi0gICAgLy8gQ29weXJpZ2h0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAgIHB1YmxpYyBQdWJsaWNVRERJUmVnaXN0cnlJQk0oKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gV1NQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfSUJNIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly91ZGRpLmlibS5jb20vdWJyL2lucXVpcnlhcGkiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwczovL3VkZGkuaWJtLmNvbS91YnIvcHVibGlzaGFwaSI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWdpc3RyYXRpb25VUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3VkZGkuaWJtLmNvbS91YnIvcmVnaXN0cnkuaHRtbCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeUlCTVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5SUJNVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGU5ZmI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5SUJNVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5XU1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFB1YmxpY1VERElSZWdpc3RyeUlCTVRlc3QgaW1wbGVtZW50cyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlCi17Ci0KLSAgICAvLyBDb3B5cmlnaHQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMi4iOwotCi0gICAgcHVibGljIFB1YmxpY1VERElSZWdpc3RyeUlCTVRlc3QoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gV1NQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfSUJNX1RFU1QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3VkZGkuaWJtLmNvbS90ZXN0cmVnaXN0cnkvaW5xdWlyeWFwaSI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vdWRkaS5pYm0uY29tL3Rlc3RyZWdpc3RyeS9wdWJsaXNoYXBpIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaS5pYm0uY29tL3Rlc3RyZWdpc3RyeS9yZWdpc3RyeS5odG1sIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5TWljcm9zb2Z0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVkY2M2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5TWljcm9zb2Z0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLldTUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5TWljcm9zb2Z0IGltcGxlbWVudHMgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotewotCi0gICAgLy8gQ29weXJpZ2h0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAgIHB1YmxpYyBQdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gV1NQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTUlDUk9TT0ZUIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly91ZGRpLm1pY3Jvc29mdC5jb20vaW5xdWlyZSI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vdWRkaS5taWNyb3NvZnQuY29tL3B1Ymxpc2giOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vdWRkaS5taWNyb3NvZnQuY29tL3JlZ2lzdGVyLmFzcHgiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnRUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhOTM1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuV1NQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnRUZXN0IGltcGxlbWVudHMgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotewotCi0gICAgLy8gQ29weXJpZ2h0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAgIHB1YmxpYyBQdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnRUZXN0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFdTUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX01JQ1JPU09GVF9URVNUIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly90ZXN0LnVkZGkubWljcm9zb2Z0LmNvbS9pbnF1aXJlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cHM6Ly90ZXN0LnVkZGkubWljcm9zb2Z0LmNvbS9wdWJsaXNoIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdGVzdC51ZGRpLm1pY3Jvc29mdC5jb20vcmVnaXN0ZXIuYXNweCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeU5UVENvbW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5TlRUQ29tbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGNjYTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5TlRUQ29tbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5XU1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFB1YmxpY1VERElSZWdpc3RyeU5UVENvbW0gaW1wbGVtZW50cyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlCi17Ci0KLSAgICAvLyBDb3B5cmlnaHQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMi4iOwotCi0gICAgcHVibGljIFB1YmxpY1VERElSZWdpc3RyeU5UVENvbW0oKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gV1NQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTlRUQ09NTSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vd3d3LnVkZGkubmUuanAvdWJyL2lucXVpcnlhcGkiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwczovL3d3dy51ZGRpLm5lLmpwL3Vici9wdWJsaXNoYXBpIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vd3d3Lm50dC5jb20vdWRkaS8iOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlTQVAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5U0FQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZWI4ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlTQVAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuV1NQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaWNVRERJUmVnaXN0cnlTQVAgaW1wbGVtZW50cyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlCi17Ci0KLSAgICAvLyBDb3B5cmlnaHQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMi4iOwotCi0gICAgcHVibGljIFB1YmxpY1VERElSZWdpc3RyeVNBUCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9TQVAiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3VkZGkuc2FwLmNvbS9VRERJL2FwaS9pbnF1aXJ5LyI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vdWRkaS5zYXAuY29tL1VEREkvYXBpL3B1Ymxpc2gvIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaS5zYXAuY29tLyI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVNBUFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5U0FQVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjhiZGM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5U0FQVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5XU1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFB1YmxpY1VERElSZWdpc3RyeVNBUFRlc3QgaW1wbGVtZW50cyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlCi17Ci0KLSAgICAvLyBDb3B5cmlnaHQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMi4iOwotCi0gICAgcHVibGljIFB1YmxpY1VERElSZWdpc3RyeVNBUFRlc3QoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gV1NQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQX1RFU1QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3VkZGl0ZXN0LnNhcC5jb20vVURESS9hcGkvaW5xdWlyeS8iOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwczovL3VkZGl0ZXN0LnNhcC5jb20vVURESS9hcGkvcHVibGlzaC8iOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly91ZGRpdGVzdC5zYXAuY29tLyI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGQ5ZTY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaTsKLQotcHVibGljIGludGVyZmFjZSBQdWJsaWNVRERJUmVnaXN0cnlUeXBlCi17Ci0KLSAgICAvLyBDb3B5cmlnaHQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMi4iOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0gICAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCk7Ci0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCk7Ci0gICAgcHVibGljIFN0cmluZyBnZXRSZWdpc3RyYXRpb25VUkwoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlYTWV0aG9kcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlYTWV0aG9kcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzcwZDM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5WE1ldGhvZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuV1NQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaWNVRERJUmVnaXN0cnlYTWV0aG9kcyBpbXBsZW1lbnRzIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5WE1ldGhvZHMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gV1NQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfWE1FVEhPRFMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKSB7Ci0gICAgICAgIC8vcmV0dXJuICJodHRwOi8vdWRkaS54bWV0aG9kcy5uZXQvaW5xdWlyZSI7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3VkZGkueG1ldGhvZHMubmV0L2lucXVpcmUyIjsKLSAgICB9Ci0KLSAgICAvLyBSZWFkLW9ubHkgcmVnaXN0cnkuIFRoZSBwdWJsaXNoIGFuZCByZWdpc3RyYXRpb24gVVJMcyBkb24ndCBleGlzdC4KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cHM6Ly91ZGRpLnhtZXRob2RzLm5ldC9wdWJsaXNoMiI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWdpc3RyYXRpb25VUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3d3dy54bWV0aG9kcy5uZXQvdmUyL1JlZ2lzdGVyLnBvP2V2ZW50PXJlZ2lzdGVyT3JnIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9BZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9BZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyNjQ5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NpbC5BZGRXU0RMVG9XU0lMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0KLXB1YmxpYyBjbGFzcyBBZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgQWRkV1NETFRvV1NJTENvbW1hbmQgY29tbWFuZDsKLSAgcHJpdmF0ZSBBcmd1bWVudHMgYXJnczsKLQotICBwdWJsaWMgQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbC5BZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQiLCAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWwuQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kIik7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkV1NETFRvV1NJTENvbW1hbmQoKTsKLSAgICBpZiAoIWFyZ3MuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGNvbW1hbmQuc2V0QXJndW1lbnRzKGFyZ3MuZ2V0U3RyaW5nQXJndW1lbnRzKCkpOwotICAgICAgY29tbWFuZC5zZXRXV1dBdXRoZW50aWNhdGlvbkhhbmRsZXIobmV3IERpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSkpOwotICAgICAgcmV0dXJuIGNvbW1hbmQuZXhlY3V0ZShlbnYpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBhcmdzIFRoZSBhcmdzIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFyZ3MoQXJndW1lbnRzIGFyZ3MpCi0gIHsKLSAgICB0aGlzLmFyZ3MgPSBhcmdzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb21tYW5kIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbW1hbmQoQWRkV1NETFRvV1NJTENvbW1hbmQgY29tbWFuZCkKLSAgewotICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0FyZ3VtZW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0FyZ3VtZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE3N2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9Bcmd1bWVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBcmd1bWVudHMKLXsKLSAgcHJpdmF0ZSBWZWN0b3IgYXJnc187Ci0KLSAgcHVibGljIEFyZ3VtZW50cygpCi0gIHsKLSAgICBhcmdzXyA9IG5ldyBWZWN0b3IoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBhcmdzXy5hZGQoa2V5KTsKLSAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgIGFyZ3NfLmFkZCh2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGtleSkKLSAgewotICAgIGludCBpbmRleCA9IGFyZ3NfLmluZGV4T2Yoa2V5KTsKLSAgICBpZiAoaW5kZXggPj0gMCkKLSAgICB7Ci0gICAgICBhcmdzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgYXJnc18ucmVtb3ZlKGluZGV4KzEpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0KFN0cmluZyBrZXkpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBhcmdzXy5pbmRleE9mKGtleSk7Ci0gICAgaWYgKGluZGV4ID49IDApCi0gICAgICByZXR1cm4gYXJnc18uZ2V0KGluZGV4KzEpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xlYXIoKQotICB7Ci0gICAgYXJnc18uY2xlYXIoKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRBcmd1bWVudHMoKQotICB7Ci0gICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbYXJnc18uc2l6ZSgpXTsKLSAgICBhcmdzXy5jb3B5SW50byhhcmdzKTsKLSAgICByZXR1cm4gYXJnczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJpbmdBcmd1bWVudHMoKQotICB7Ci0gICAgU3RyaW5nW10gYXJncyA9IG5ldyBTdHJpbmdbYXJnc18uc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgICBhcmdzW2ldID0gYXJnc18uZ2V0KGkpLnRvU3RyaW5nKCk7Ci0gICAgcmV0dXJuIGFyZ3M7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLSAgewotICAgIHJldHVybiBhcmdzXy5pc0VtcHR5KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9EaWFsb2dXV1dBdXRoZW50aWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0RpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjFlMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0RpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uSGFuZGxlcjsKLQotCi1wdWJsaWMgY2xhc3MgRGlhbG9nV1dXQXV0aGVudGljYXRpb24gZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBXV1dBdXRoZW50aWNhdGlvbkhhbmRsZXIKLXsKLQotICAvKkNPTlRFWFRfSUQgREJBUzAwMDEgZm9yIHRoZSBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHVzZXIgbmFtZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfREJBU19VU0VSTkFNRSA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5EQkFTMDAwMSI7Ci0KLSAgLypDT05URVhUX0lEIERCQVMwMDAyIGZvciB0aGUgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiBwYXNzd29yZCovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfREJBU19QQVNTV09SRCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5EQkFTMDAwMiI7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWVTdHJpbmdfOwotICBwcml2YXRlIFN0cmluZyBwYXNzd29yZFN0cmluZ187Ci0KLSAgcHJpdmF0ZSBUZXh0IHVzZXJuYW1lXzsKLSAgcHJpdmF0ZSBUZXh0IHBhc3N3b3JkXzsKLQotICBwcml2YXRlIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHd3d2FlXzsKLQotICBwdWJsaWMgRGlhbG9nV1dXQXV0aGVudGljYXRpb24oU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBzdXBlcihzaGVsbCk7Ci0gICAgdXNlcm5hbWVTdHJpbmdfID0gbnVsbDsKLSAgICBwYXNzd29yZFN0cmluZ18gPSBudWxsOwotICAgIHd3d2FlXyA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiB0aGUgQ2FuY2VsIGJ1dHRvbiBpcyBwcmVzc2VkLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkKLSAgewotICAgIHVzZXJuYW1lU3RyaW5nXyA9IG51bGw7Ci0gICAgcGFzc3dvcmRTdHJpbmdfID0gbnVsbDsKLSAgICBzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0gIH0KLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHByZXNzZWQuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpCi0gIHsKLSAgICBTdHJpbmcgdXNlcm5hbWVTdHJpbmcgPSB1c2VybmFtZV8uZ2V0VGV4dCgpOwotICAgIHVzZXJuYW1lU3RyaW5nXyA9ICh1c2VybmFtZVN0cmluZy5sZW5ndGgoKSA+IDApID8gdXNlcm5hbWVTdHJpbmcgOiBudWxsOwotICAgIFN0cmluZyBwYXNzd29yZFN0cmluZyA9IHBhc3N3b3JkXy5nZXRUZXh0KCk7Ci0gICAgcGFzc3dvcmRTdHJpbmdfID0gKHBhc3N3b3JkU3RyaW5nLmxlbmd0aCgpID4gMCkgPyBwYXNzd29yZFN0cmluZyA6IG51bGw7Ci0gICAgc2V0UmV0dXJuQ29kZShEaWFsb2cuT0spOwotICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICB9Ci0KLSAgLyoqCi0gICogU2VlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsfS4KLSAgKiBAcGFyYW0gc2hlbGwgVGhlIHNoZWxsLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICBzaGVsbC5zZXRUZXh0KGdldE1lc3NhZ2UoIiVESUFMT0dfVElUTEVfSFRUUF9CQVNJQ19BVVRIIikpOwotICB9Ci0KLSAgLyoqIAotICAqIENyZWF0ZXMgdGhlIGRpYWxvZyBhcmVhLgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0gICogQHJldHVybiBUaGUgY29udHJvbCBhcmVhLgotICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGdkLndpZHRoSGludCA9IDQwMDsKLSAgICBnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGdsLnZlcnRpY2FsU3BhY2luZyA9IDE1OwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCi0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgbGFiZWwuc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfVVJMIikpOwotICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgbGFiZWwuc2V0VGV4dCh3d3dhZV8uZ2V0VVJMKCkpOwotICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgbGFiZWwuc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FIikpOwotICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0gICAgdXNlcm5hbWVfID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICB1c2VybmFtZV8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgdXNlcm5hbWVfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX0hUVFBfQkFTSUNfQVVUSF9VU0VSTkFNRSIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVzZXJuYW1lXywgSU5GT1BPUF9EQkFTX1VTRVJOQU1FKTsKLQotICAgIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotICAgIGxhYmVsLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRCIpKTsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotICAgIHBhc3N3b3JkXyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgcGFzc3dvcmRfLnNldEVjaG9DaGFyKCcqJyk7Ci0gICAgcGFzc3dvcmRfLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIHBhc3N3b3JkXy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9IVFRQX0JBU0lDX0FVVEhfUEFTU1dPUkQiKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1c2VybmFtZV8sIElORk9QT1BfREJBU19QQVNTV09SRCk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbXNnSWQpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZShtc2dJZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVXV1dBdXRoZW50aWNhdGlvbihXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB3d3dhZSkKLSAgewotICAgIHVzZXJuYW1lU3RyaW5nXyA9IG51bGw7Ci0gICAgcGFzc3dvcmRTdHJpbmdfID0gbnVsbDsKLSAgICB3d3dhZV8gPSB3d3dhZTsKLSAgICBvcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkKLSAgewotICAgIHJldHVybiB1c2VybmFtZVN0cmluZ187Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkKLSAgewotICAgIHJldHVybiBwYXNzd29yZFN0cmluZ187Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9UYWJsZVZpZXdlckVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL1RhYmxlVmlld2VyRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOThjMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL1RhYmxlVmlld2VyRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBUYWJsZVZpZXdlckVkaXRvciBleHRlbmRzIENvbXBvc2l0ZQotewotICBwcml2YXRlIGludCBERUZBVUxUX1RBQkxFX0hFSUdIVF9ISU5UID0gMTAwOwotICBwcml2YXRlIGludCBERUZBVUxUX0NPTFVNTl9XSURUSCA9IDgwOwotCi0gIHByaXZhdGUgU3RyaW5nW10gY29sdW1uc187Ci0gIHByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXJfOwotICBwcml2YXRlIFRhYmxlIHRhYmxlXzsKLSAgcHJpdmF0ZSBUYWJsZUVkaXRvciBlZGl0b3JfOwotICBwcml2YXRlIFRhYmxlRWRpdG9yTGlzdGVuZXIgdGFibGVFZGl0b3JMaXN0ZW5lcl87Ci0gIHByaXZhdGUgVGV4dCB0ZXh0XzsKLSAgcHJpdmF0ZSBCdXR0b24gYWRkXzsKLSAgcHJpdmF0ZSBCdXR0b24gcmVtb3ZlXzsKLQotICBwcml2YXRlIExpc3QgdmFsdWVzXzsKLSAgcHJpdmF0ZSBPYmplY3QgZGVmYXVsdFZhbHVlXzsKLQotICBwdWJsaWMgVGFibGVWaWV3ZXJFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gY29sdW1ucywgTGlzdCBpbml0VmFsdWVzLCBPYmplY3QgZGVmYXVsdFZhbHVlKQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgY29sdW1uc18gPSBjb2x1bW5zOwotICAgIHZhbHVlc18gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKGluaXRWYWx1ZXMgIT0gbnVsbCAmJiBpbml0VmFsdWVzLnNpemUoKSA+IDApCi0gICAgICB2YWx1ZXNfLmFkZEFsbChpbml0VmFsdWVzKTsKLSAgICBkZWZhdWx0VmFsdWVfID0gKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSA/IGRlZmF1bHRWYWx1ZSA6IG5ldyBTdHJpbmcoIiIpOwotICAgIGNyZWF0ZVBhcnRDb250cm9sKHRoaXMpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICBzZXRMYXlvdXQoZ2wpOwotICAgIHNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgIHRhYmxlXyA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdkLmhlaWdodEhpbnQgPSBERUZBVUxUX1RBQkxFX0hFSUdIVF9ISU5UOwotICAgIHRhYmxlXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICB0YWJsZV8uc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICB0YWJsZV8uc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgIFRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgaW50IG1heFdpZHRoID0gREVGQVVMVF9DT0xVTU5fV0lEVEg7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zXy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZV8sIFNXVC5OT05FKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFRleHQoY29sdW1uc19baV0pOwotICAgICAgdGFibGVDb2x1bW4ucGFjaygpOwotICAgICAgaW50IHRhYmxlQ29sdW1uV2lkdGggPSBNYXRoLm1heChERUZBVUxUX0NPTFVNTl9XSURUSCwgdGFibGVDb2x1bW4uZ2V0V2lkdGgoKSk7Ci0gICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCB0YWJsZUNvbHVtbldpZHRoKTsKLSAgICAgIENvbHVtbldlaWdodERhdGEgY29sdW1uRGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKHRhYmxlQ29sdW1uV2lkdGgsIHRhYmxlQ29sdW1uV2lkdGgsIHRydWUpOwotICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5EYXRhKTsKLSAgICB9Ci0gICAgdGFibGVfLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0gICAgLy8gaW5pdGlhbGl6ZSB0aGUgdGFibGUgZWRpdG9yCi0gICAgZWRpdG9yXyA9IG5ldyBUYWJsZUVkaXRvcih0YWJsZV8pOwotICAgIC8vIFRoZSBlZGl0b3IgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhlIGNlbGwgYW5kIG11c3QKLSAgICAvLyBub3QgYmUgYW55IHNtYWxsZXIgdGhhbiA1MCBwaXhlbHMuCi0gICAgZWRpdG9yXy5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0gICAgZWRpdG9yXy5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0gICAgZWRpdG9yXy5taW5pbXVtV2lkdGggPSBtYXhXaWR0aDsKLSAgICB0YWJsZUVkaXRvckxpc3RlbmVyXyA9IG5ldyBUYWJsZUVkaXRvckxpc3RlbmVyKCk7Ci0gICAgdGFibGVfLmFkZE1vdXNlTGlzdGVuZXIodGFibGVFZGl0b3JMaXN0ZW5lcl8pOwotICAgIHRhYmxlVmlld2VyXyA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZV8pOwotICAgIHRhYmxlVmlld2VyXy5nZXRDb250cm9sKCkuYWRkS2V5TGlzdGVuZXIoCi0gICAgICBuZXcgS2V5TGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBEZWwKLSAgICAgICAgICBpZiAoKChpbnQpZS5jaGFyYWN0ZXIpID09IDEyNykgCi0gICAgICAgICAgICBoYW5kbGVEZWxldGVLZXlQcmVzc2VkKCk7Ci0gICAgICAgICAgLy8gRW50ZXIgb3Igc3BhY2UKLSAgICAgICAgICBpZiAoKChpbnQpZS5jaGFyYWN0ZXIpID09IDEzIHx8ICgoaW50KWUuY2hhcmFjdGVyKSA9PSAzMikKLSAgICAgICAgICAgIHRhYmxlRWRpdG9yTGlzdGVuZXJfLmVkaXRTZWxlY3Rpb24oKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIHRhYmxlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IExpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgdGFibGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IExpc3RMYWJlbFByb3ZpZGVyKCkpOwotICAgIHRhYmxlVmlld2VyXy5zZXRJbnB1dCh2YWx1ZXNfKTsKLSAgICB0YWJsZVZpZXdlcl8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotICAgICAgbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAgIGVuYWJsZVJlbW92ZSh0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0KLSAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2wubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotICAgIGFkZF8gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIGFkZF8uc2V0VGV4dChXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfQUREIikpOwotICAgIGFkZF8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgYWRkXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLSAgICAgIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLQotICAgIHJlbW92ZV8gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIHJlbW92ZV8uc2V0VGV4dChXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfUkVNT1ZFIikpOwotICAgIHJlbW92ZV8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgcmVtb3ZlXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLSAgICAgIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgICBlbmFibGVSZW1vdmUoZmFsc2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVuYWJsZVJlbW92ZShib29sZWFuIGVuYWJsZWQpCi0gIHsKLSAgICByZW1vdmVfLnNldEVuYWJsZWQoZW5hYmxlZCAmJiAhdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgICB2YWx1ZXNfLmFkZChkZWZhdWx0VmFsdWVfKTsKLSAgICByZWZyZXNoKCk7Ci0gICAgc2V0U2VsZWN0aW9uQXNPYmplY3QodmFsdWVzXy5nZXQodGFibGVfLmdldEl0ZW1Db3VudCgpLTEpKTsKLSAgICB0YWJsZUVkaXRvckxpc3RlbmVyXy5lZGl0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBoYW5kbGVEZWxldGVLZXlQcmVzc2VkKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlRGVsZXRlS2V5UHJlc3NlZCgpCi0gIHsKLSAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSB0YWJsZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGludCBzZWxlY3Rpb25Db3VudCA9IHRhYmxlXy5nZXRJdGVtQ291bnQoKTsKLSAgICAgIHZhbHVlc18ucmVtb3ZlKHNlbGVjdGlvbkluZGV4KTsKLSAgICAgIGlmIChzZWxlY3Rpb25JbmRleCA8IHNlbGVjdGlvbkNvdW50LTEpCi0gICAgICAgIHNldFNlbGVjdGlvbkFzT2JqZWN0KHZhbHVlc18uZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0gICAgICBlbHNlIGlmIChzZWxlY3Rpb25Db3VudCAtMiA+PSAwKQotICAgICAgICBzZXRTZWxlY3Rpb25Bc09iamVjdCh2YWx1ZXNfLmdldChzZWxlY3Rpb25Db3VudC0yKSk7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGludGVybmFsUmVmcmVzaCgpCi0gIHsKLSAgICAvLyBzeW5jaHJvbml6ZSB0ZXh0IGZpZWxkLCBwcmV2aW91c2x5IHNlbGVjdGVkIHRhYmxlIGNlbGwgYW5kIG1vZGVsIChpbnB1dE9iamVjdCkKLSAgICBpZiAodGV4dF8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBUYWJsZUl0ZW0gb2xkVGFibGVJdGVtID0gZWRpdG9yXy5nZXRJdGVtKCk7Ci0gICAgICBpbnQgb2xkQ29sdW1uSW5kZXggPSBlZGl0b3JfLmdldENvbHVtbigpOwotICAgICAgaWYgKG9sZFRhYmxlSXRlbSAhPSBudWxsICYmIG9sZENvbHVtbkluZGV4ID49IDAgJiYgb2xkQ29sdW1uSW5kZXggPCBjb2x1bW5zXy5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBvbGRUZXh0ID0gdGV4dF8uZ2V0VGV4dCgpOwotICAgICAgICBvbGRUYWJsZUl0ZW0uc2V0VGV4dChvbGRDb2x1bW5JbmRleCwgb2xkVGV4dCk7Ci0gICAgICAgIGludCBvbGRSb3dJbmRleCA9IHRhYmxlXy5pbmRleE9mKG9sZFRhYmxlSXRlbSk7Ci0gICAgICAgIHZhbHVlc18uc2V0KG9sZFJvd0luZGV4LCBvbGRUZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uQXNPYmplY3QoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHRhYmxlVmlld2VyXy5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dChTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgdGFibGVfLnNldFRvb2xUaXBUZXh0KHN0cmluZyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbmZvcG9wKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGFibGVfLCBzdHJpbmcpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChMaXN0IGxpc3QpCi0gIHsKLSAgICB2YWx1ZXNfLmNsZWFyKCk7Ci0gICAgdmFsdWVzXy5hZGRBbGwobGlzdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIGludGVybmFsUmVmcmVzaCgpOwotICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgVGFibGVJdGVtW10gZ2V0SXRlbXMoKQotICB7Ci0gICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgcmV0dXJuIHRhYmxlXy5nZXRJdGVtcygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0gIHsKLSAgICBzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgIGFkZF8uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICBlbmFibGVSZW1vdmUoZW5hYmxlZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICBpZiAoZWRpdG9yXyAhPSBudWxsKQotICAgICAgZWRpdG9yXy5kaXNwb3NlKCk7Ci0gICAgaWYgKHRhYmxlXyAhPSBudWxsKQotICAgICAgdGFibGVfLmRpc3Bvc2UoKTsKLSAgICBpZiAoYWRkXyAhPSBudWxsKQotICAgICAgYWRkXy5kaXNwb3NlKCk7Ci0gICAgaWYgKHJlbW92ZV8gIT0gbnVsbCkKLSAgICAgIHJlbW92ZV8uZGlzcG9zZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGludGVybmFsRGlzcG9zZSgpCi0gIHsKLSAgICBpZiAodGV4dF8gIT0gbnVsbCkKLSAgICAgIHRleHRfLmRpc3Bvc2UoKTsKLSAgICB0ZXh0XyA9IG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgVGFibGVFZGl0b3JMaXN0ZW5lciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIKLSAgewotICAgIHByaXZhdGUgaW50IGN1cnJTZWxlY3Rpb25JbmRleF87Ci0gICAgcHJpdmF0ZSBpbnQgZWRpdFJvd187Ci0gICAgcHJpdmF0ZSBpbnQgZWRpdENvbHVtbl87Ci0KLSAgICBwdWJsaWMgVGFibGVFZGl0b3JMaXN0ZW5lcigpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIGN1cnJTZWxlY3Rpb25JbmRleF8gPSAtMTsKLSAgICAgIGVkaXRSb3dfID0gLTE7Ci0gICAgICBlZGl0Q29sdW1uXyA9IC0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKQotICAgIHsKLSAgICAgIG1vdXNlRG93bihlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKQotICAgIHsKLSAgICAgIC8vIHJlZnJlc2ggdGFibGUKLSAgICAgIGludGVybmFsUmVmcmVzaCgpOwotICAgICAgLy8gQ2xlYW4gdXAgcHJldmlvdXMgdGV4dCBlZGl0b3IgY29udHJvbAotICAgICAgaW50ZXJuYWxEaXNwb3NlKCk7Ci0gICAgICAvLyB1cGRhdGUgdGFibGUKLSAgICAgIGlmICh0YWJsZV8uaXNGb2N1c0NvbnRyb2woKSkKLSAgICAgIHsKLSAgICAgICAgaW50IHNlbGVjdGVkUm93SW5kZXggPSBnZXRTZWxlY3RlZFJvdyh0YWJsZV8sIGUueSk7Ci0gICAgICAgIGlmIChjdXJyU2VsZWN0aW9uSW5kZXhfICE9IC0xICYmIHNlbGVjdGVkUm93SW5kZXggIT0gLTEgJiYgY3VyclNlbGVjdGlvbkluZGV4XyA9PSBzZWxlY3RlZFJvd0luZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlXy5nZXRJdGVtKHNlbGVjdGVkUm93SW5kZXgpOwotICAgICAgICAgIGludCBzZWxlY3RlZENvbHVtbkluZGV4ID0gZ2V0U2VsZWN0ZWRDb2x1bW4odGFibGVJdGVtLCBlLngsIGUueSk7Ci0gICAgICAgICAgaWYgKHNlbGVjdGVkQ29sdW1uSW5kZXggIT0gLTEgJiYgKHRleHRfID09IG51bGwgfHwgdGV4dF8uaXNEaXNwb3NlZCgpIHx8IHNlbGVjdGVkQ29sdW1uSW5kZXggIT0gZWRpdG9yXy5nZXRDb2x1bW4oKSkpCi0gICAgICAgICAgICBlZGl0U2VsZWN0aW9uKHNlbGVjdGVkUm93SW5kZXgsIHNlbGVjdGVkQ29sdW1uSW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGN1cnJTZWxlY3Rpb25JbmRleF8gPSBzZWxlY3RlZFJvd0luZGV4OwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRTZWxlY3RlZFJvdyhUYWJsZSB0YWJsZSwgaW50IHkpCi0gICAgewotICAgICAgVGFibGVJdGVtW10gdGFibGVJdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0YW5nbGUgPSB0YWJsZUl0ZW1zW2ldLmdldEJvdW5kcygwKTsKLSAgICAgICAgaWYgKHJlY3RhbmdsZSAhPSBudWxsICYmIHkgPj0gcmVjdGFuZ2xlLnkgJiYgeSA8IChyZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQpKQotICAgICAgICAgIHJldHVybiBpOwotICAgICAgfQotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFNlbGVjdGVkQ29sdW1uKFRhYmxlSXRlbSB0YWJsZUl0ZW0sIGludCB4LCBpbnQgeSkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNfLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAodGFibGVJdGVtLmdldEJvdW5kcyhpKS5jb250YWlucyh4LCB5KSkKLSAgICAgICAgICByZXR1cm4gaTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZWRpdFNlbGVjdGlvbihpbnQgcm93LCBpbnQgY29sdW1uKQotICAgIHsKLSAgICAgIGVkaXRSb3dfID0gcm93OwotICAgICAgZWRpdENvbHVtbl8gPSBjb2x1bW47Ci0gICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGVfLmdldEl0ZW0ocm93KTsKLSAgICAgIC8vIFNldHVwIGFkYXB0ZXIgZm9yIHRoZSBuZXcgc2VsZWN0aW9uCi0gICAgICB0ZXh0XyA9IG5ldyBUZXh0KHRhYmxlXywgU1dULk5PTkUpOwotICAgICAgU3RyaW5nIHRleHQgPSB0YWJsZUl0ZW0uZ2V0VGV4dChjb2x1bW4pOwotICAgICAgdGV4dF8uc2V0VGV4dCgodGV4dCAhPSBudWxsKSA/IHRleHQgOiAiIik7Ci0gICAgICB0ZXh0Xy5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEVzYwotICAgICAgICAgICAgaWYgKCgoaW50KWUuY2hhcmFjdGVyKSA9PSAyNykKLSAgICAgICAgICAgICAgY2FuY2VsU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgKTsKLSAgICAgIHRleHRfLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKQotICAgICAgICAgICAgICB0cmF2ZXJzZVRhYk5leHQoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpCi0gICAgICAgICAgICAgIHRyYXZlcnNlVGFiUHJldmlvdXMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICk7Ci0gICAgICBlZGl0b3JfLnNldEVkaXRvcih0ZXh0XywgdGFibGVJdGVtLCBjb2x1bW4pOwotICAgICAgdGV4dF8uc2V0Rm9jdXMoKTsKLSAgICAgIHRleHRfLnNlbGVjdEFsbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRyYXZlcnNlVGFiTmV4dCgpCi0gICAgewotICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICAgIGlmICghKGVkaXRSb3dfID09IHRhYmxlXy5nZXRJdGVtcygpLmxlbmd0aC0xICYmIGVkaXRDb2x1bW5fID09IGNvbHVtbnNfLmxlbmd0aC0xKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVkaXRDb2x1bW5fIDwgY29sdW1uc18ubGVuZ3RoLTEpCi0gICAgICAgICAgZWRpdENvbHVtbl8rKzsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdENvbHVtbl8gPSAwOwotICAgICAgICAgIGVkaXRSb3dfKys7Ci0gICAgICAgICAgdGFibGVfLnNlbGVjdChlZGl0Um93Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWRpdFNlbGVjdGlvbihlZGl0Um93XywgZWRpdENvbHVtbl8pOwotICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRyYXZlcnNlVGFiUHJldmlvdXMoKQotICAgIHsKLSAgICAgIGludGVybmFsUmVmcmVzaCgpOwotICAgICAgaW50ZXJuYWxEaXNwb3NlKCk7Ci0gICAgICBpZiAoIShlZGl0Um93XyA9PSAwICYmIGVkaXRDb2x1bW5fID09IDApKQotICAgICAgewotICAgICAgICBpZiAoZWRpdENvbHVtbl8gPiAwKQotICAgICAgICAgIGVkaXRDb2x1bW5fLS07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVkaXRDb2x1bW5fID0gY29sdW1uc18ubGVuZ3RoLTE7Ci0gICAgICAgICAgZWRpdFJvd18tLTsKLSAgICAgICAgICB0YWJsZV8uc2VsZWN0KGVkaXRSb3dfKTsKLSAgICAgICAgfQotICAgICAgICBlZGl0U2VsZWN0aW9uKGVkaXRSb3dfLCBlZGl0Q29sdW1uXyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2FuY2VsU2VsZWN0aW9uKCkKLSAgICB7Ci0gICAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICAgIGludGVybmFsUmVmcmVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVkaXRTZWxlY3Rpb24oKQotICAgIHsKLSAgICAgIGludCBzZWxlY3RlZFJvd0luZGV4ID0gdGFibGVfLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpZiAoc2VsZWN0ZWRSb3dJbmRleCAhPSAtMSAmJiBjb2x1bW5zXy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICAvLyByZWZyZXNoIHRhYmxlCi0gICAgICAgIGludGVybmFsUmVmcmVzaCgpOwotICAgICAgICAvLyBDbGVhbiB1cCBhbnkgcHJldmlvdXMgZWRpdG9yIGNvbnRyb2wKLSAgICAgICAgaW50ZXJuYWxEaXNwb3NlKCk7Ci0gICAgICAgIGVkaXRTZWxlY3Rpb24oc2VsZWN0ZWRSb3dJbmRleCwgMCk7Ci0gICAgICB9Ci0gICAgICBjdXJyU2VsZWN0aW9uSW5kZXhfID0gc2VsZWN0ZWRSb3dJbmRleDsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTGlzdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICAgIHRhYmxlVmlld2VyXy5hZGQoZ2V0RWxlbWVudHMobmV3SW5wdXQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgTGlzdCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gKExpc3QpaW5wdXRFbGVtZW50OwotICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFtsaXN0LnNpemUoKV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICBvYmplY3RzW2ldID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgIHJldHVybiBvYmplY3RzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTGlzdExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICByZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZTE3YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLQotCi1wdWJsaWMgY2xhc3MgVXRpbHMKLXsKLSAgcHVibGljIFV0aWxzKCkKLSAgewotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b0ZpbGVTeXN0ZW1VUkkoU3RyaW5nIHJlbGF0aXZlUGxhdGZvcm1VUkkpCi0gIHsKLSAgICBpZiAocmVsYXRpdmVQbGF0Zm9ybVVSSSAhPSBudWxsKQotICAgICAgcmV0dXJuIHRvRmlsZVN5c3RlbVVSSShSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShyZWxhdGl2ZVBsYXRmb3JtVVJJKSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvRmlsZVN5c3RlbVVSSShJUmVzb3VyY2UgcmVzKQotICB7Ci0gICAgaWYgKHJlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIElQYXRoIHBhdGggPSByZXMuZ2V0TG9jYXRpb24oKTsKLSAgICAgIGlmIChwYXRoICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHBhdGgudG9GaWxlKCkudG9VUkwoKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kdW1teS9EdW1teVdlYlNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZHVtbXkvRHVtbXlXZWJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NDk4M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kdW1teS9EdW1teVdlYlNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kdW1teTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLQotcHVibGljIGNsYXNzIER1bW15V2ViU2VydmljZSBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZQotewotCQotCi0JcHVibGljIER1bW15V2ViU2VydmljZShXZWJTZXJ2aWNlSW5mbyBpbmZvKQotCXsKLQkJc3VwZXIoaW5mbyk7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwKLQkJCUlTZWxlY3Rpb24gc2VsLCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKQotCXsKLQkJVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCQljb21tYW5kcy5hZGQobmV3IFRlc3RDb21tYW5kMyh0aGlzKSk7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCX0KLQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpCi0JewotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgVGVzdENvbW1hbmQ0KHRoaXMpKTsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeShjb21tYW5kcyk7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpCi0JewotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgVGVzdENvbW1hbmQxKHRoaXMpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBUZXN0Q29tbWFuZDIodGhpcykpOwotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcikKLQl7Ci0JCVZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBUZXN0Q29tbWFuZDUodGhpcykpOwotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IHJ1bihFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKQotCXsKLQkJVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCQljb21tYW5kcy5hZGQobmV3IFRlc3RDb21tYW5kNih0aGlzKSk7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCX0KLQkKLSBwcml2YXRlIGNsYXNzIFRlc3RDb21tYW5kMSBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLQl7Ci0JIElXZWJTZXJ2aWNlIHdzOwotCSBwdWJsaWMgVGVzdENvbW1hbmQxKElXZWJTZXJ2aWNlIHdzKQotCSB7Ci0JCSB0aGlzLndzPXdzOwotCSB9Ci0JIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBkZXZlbG9wIGNvbW1hbmQgMSIpOwotCQl3cy5nZXRXZWJTZXJ2aWNlSW5mbygpLnNldFdzZGxVUkwoImh0dHA6Ly9zb21lV1NETFVSTCIpOwotCQlyZXR1cm4gc3VwZXIuZXhlY3V0ZShlbnYpOwotCSB9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q29tbWFuZDIgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi0JewotCQkgSVdlYlNlcnZpY2Ugd3M7Ci0JCSBwdWJsaWMgVGVzdENvbW1hbmQyKElXZWJTZXJ2aWNlIHdzKQotCQkgewotCQkJIHRoaXMud3M9d3M7Ci0JCSB9Ci0JCSAKLQkJcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQkJewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBkZXZlbG9wIGNvbW1hbmQgMiIpOwotCQkJd3MuZ2V0V2ViU2VydmljZUluZm8oKS5zZXRJbXBsVVJMKCJmaWxlOi8vc29tZUltcGxVUkwiKTsKLQkJCXJldHVybiBzdXBlci5leGVjdXRlKGVudik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q29tbWFuZDMgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi0JewotCQkgSVdlYlNlcnZpY2Ugd3M7Ci0JCSBwdWJsaWMgVGVzdENvbW1hbmQzKElXZWJTZXJ2aWNlIHdzKQotCQkgewotCQkJIHRoaXMud3M9d3M7Ci0JCSB9Ci0JCSAKLQkJcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQkJewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBhc3NlbWJsZSBjb21tYW5kIik7Ci0JCQlyZXR1cm4gc3VwZXIuZXhlY3V0ZShlbnYpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgVGVzdENvbW1hbmQ0IGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotCXsKLQkJIElXZWJTZXJ2aWNlIHdzOwotCQkgcHVibGljIFRlc3RDb21tYW5kNChJV2ViU2VydmljZSB3cykKLQkJIHsKLQkJCSB0aGlzLndzPXdzOwotCQkgfQotCQkgCi0JCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JCXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW4gZGVwbG95IGNvbW1hbmQiKTsKLQkJCXdzLmdldFdlYlNlcnZpY2VJbmZvKCkuc2V0RW5kUG9pbnRVUkwoImh0dHA6Ly9zb21lRW5kcG9pbnRVUkwiKTsKLQkJCXJldHVybiBzdXBlci5leGVjdXRlKGVudik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q29tbWFuZDUgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi0JewotCQkgSVdlYlNlcnZpY2Ugd3M7Ci0JCSBwdWJsaWMgVGVzdENvbW1hbmQ1KElXZWJTZXJ2aWNlIHdzKQotCQkgewotCQkJIHRoaXMud3M9d3M7Ci0JCSB9Ci0JCSAKLQkJcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQkJewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBpbnN0YWxsIGNvbW1hbmQiKTsKLQkJCXJldHVybiBzdXBlci5leGVjdXRlKGVudik7Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgY2xhc3MgVGVzdENvbW1hbmQ2IGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotCXsKLQkJIElXZWJTZXJ2aWNlIHdzOwotCQkgcHVibGljIFRlc3RDb21tYW5kNihJV2ViU2VydmljZSB3cykKLQkJIHsKLQkJCSB0aGlzLndzPXdzOwotCQkgfQotCQkgCi0JCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JCXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW4gcnVuIGNvbW1hbmQiKTsKLQkJCXJldHVybiBzdXBlci5leGVjdXRlKGVudik7Ci0JCX0KLQl9CQotfQkKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kdW1teS9EdW1teVdlYlNlcnZpY2VDbGllbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZHVtbXkvRHVtbXlXZWJTZXJ2aWNlQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZmNkODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kdW1teS9EdW1teVdlYlNlcnZpY2VDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kdW1teTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW5mbzsKLQotcHVibGljIGNsYXNzIER1bW15V2ViU2VydmljZUNsaWVudCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZUNsaWVudAotewkJCi0KLQlwdWJsaWMgRHVtbXlXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm8pCi0JewotCQlzdXBlcihpbmZvKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwKLQkJCUlTZWxlY3Rpb24gc2VsLCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKQotCXsKLQkJVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCQljb21tYW5kcy5hZGQobmV3IFRlc3RDb21tYW5kMyh0aGlzKSk7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCX0KLQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpCi0JewotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgVGVzdENvbW1hbmQ0KHRoaXMpKTsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeShjb21tYW5kcyk7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpCi0JewotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgVGVzdENvbW1hbmQxKHRoaXMpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBUZXN0Q29tbWFuZDIodGhpcykpOwotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcikKLQl7Ci0JCVZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBUZXN0Q29tbWFuZDUodGhpcykpOwotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IHJ1bihFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKQotCXsKLQkJVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCQljb21tYW5kcy5hZGQobmV3IFRlc3RDb21tYW5kNih0aGlzKSk7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCX0KLQotCSBwcml2YXRlIGNsYXNzIFRlc3RDb21tYW5kMSBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLQkJewotCQkgSVdlYlNlcnZpY2VDbGllbnQgd3M7Ci0JCSBwdWJsaWMgVGVzdENvbW1hbmQxKElXZWJTZXJ2aWNlQ2xpZW50IHdzKQotCQkgewotCQkJIHRoaXMud3M9d3M7Ci0JCSB9Ci0JCSBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCQkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBjbGllbnQgZGV2ZWxvcCBjb21tYW5kIDEiKTsKLQkJCXJldHVybiBzdXBlci5leGVjdXRlKGVudik7Ci0JCSB9Ci0JCX0KLQotCQlwcml2YXRlIGNsYXNzIFRlc3RDb21tYW5kMiBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLQkJewotCQkJIElXZWJTZXJ2aWNlQ2xpZW50IHdzOwotCQkJIHB1YmxpYyBUZXN0Q29tbWFuZDIoSVdlYlNlcnZpY2VDbGllbnQgd3MpCi0JCQkgewotCQkJCSB0aGlzLndzPXdzOwotCQkJIH0KLQkJCSAKLQkJCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JCQl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBjbGllbnQgZGV2ZWxvcCBjb21tYW5kIDIiKTsKLQkJCQlyZXR1cm4gc3VwZXIuZXhlY3V0ZShlbnYpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIGNsYXNzIFRlc3RDb21tYW5kMyBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLQkJewotCQkJIElXZWJTZXJ2aWNlQ2xpZW50IHdzOwotCQkJIHB1YmxpYyBUZXN0Q29tbWFuZDMoSVdlYlNlcnZpY2VDbGllbnQgd3MpCi0JCQkgewotCQkJCSB0aGlzLndzPXdzOwotCQkJIH0KLQkJCSAKLQkJCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JCQl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBjbGllbnQgYXNzZW1ibGUgY29tbWFuZCIpOwotCQkJCXJldHVybiBzdXBlci5leGVjdXRlKGVudik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgY2xhc3MgVGVzdENvbW1hbmQ0IGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotCQl7Ci0JCQkgSVdlYlNlcnZpY2VDbGllbnQgd3M7Ci0JCQkgcHVibGljIFRlc3RDb21tYW5kNChJV2ViU2VydmljZUNsaWVudCB3cykKLQkJCSB7Ci0JCQkJIHRoaXMud3M9d3M7Ci0JCQkgfQotCQkJIAotCQkJcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQkJCXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkluIGNsaWVudCBkZXBsb3kgY29tbWFuZCIpOwotCQkJCXJldHVybiBzdXBlci5leGVjdXRlKGVudik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgY2xhc3MgVGVzdENvbW1hbmQ1IGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotCQl7Ci0JCQkgSVdlYlNlcnZpY2VDbGllbnQgd3M7Ci0JCQkgcHVibGljIFRlc3RDb21tYW5kNShJV2ViU2VydmljZUNsaWVudCB3cykKLQkJCSB7Ci0JCQkJIHRoaXMud3M9d3M7Ci0JCQkgfQotCQkJIAotCQkJcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQkJCXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkluIGNsaWVudCBpbnN0YWxsIGNvbW1hbmQiKTsKLQkJCQlyZXR1cm4gc3VwZXIuZXhlY3V0ZShlbnYpOwotCQkJfQotCQl9CQotCQkKLQkJcHJpdmF0ZSBjbGFzcyBUZXN0Q29tbWFuZDYgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi0JCXsKLQkJCSBJV2ViU2VydmljZUNsaWVudCB3czsKLQkJCSBwdWJsaWMgVGVzdENvbW1hbmQ2KElXZWJTZXJ2aWNlQ2xpZW50IHdzKQotCQkJIHsKLQkJCQkgdGhpcy53cz13czsKLQkJCSB9Ci0JCQkgCi0JCQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCQkJewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW4gY2xpZW50IHJ1biBjb21tYW5kIik7Ci0JCQkJcmV0dXJuIHN1cGVyLmV4ZWN1dGUoZW52KTsKLQkJCX0KLQkJfQkJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2R1bW15L0R1bW15V2ViU2VydmljZVJ1bnRpbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZHVtbXkvRHVtbXlXZWJTZXJ2aWNlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDczMmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZHVtbXkvRHVtbXlXZWJTZXJ2aWNlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZHVtbXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VDbGllbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VJbmZvOwotCi1wdWJsaWMgY2xhc3MgRHVtbXlXZWJTZXJ2aWNlUnVudGltZSBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVJ1bnRpbWUKLXsKLQotCXB1YmxpYyBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pCi0JewotICAgIHJldHVybiBuZXcgRHVtbXlXZWJTZXJ2aWNlKGluZm8pOwotCX0KLQotCXB1YmxpYyBJV2ViU2VydmljZUNsaWVudCBnZXRXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm8pCi0JewotCQlyZXR1cm4gbmV3IER1bW15V2ViU2VydmljZUNsaWVudChpbmZvKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZHVtbXkvRHVtbXlXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2R1bW15L0R1bW15V2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDUwNmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZHVtbXkvRHVtbXlXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZHVtbXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC51aS53aWRnZXRzLlNpbXBsZVdpZGdldENvbnRyaWJ1dG9yOwotCi1wdWJsaWMgY2xhc3MgRHVtbXlXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgQnV0dG9uIGNoZWNrQm94XzsKLQlwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdpZGdldDFfOwotCXByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Ml87Ci0JCi0JcHVibGljIER1bW15V2lkZ2V0RmFjdG9yeSgpCi0JewotCQl3aWRnZXQxXyA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwkJCi0JCXdpZGdldDFfLnNldERlc2NyaXB0aW9uKCAiRXh0ZW50aW9ucyBkZXNjIDEiICk7Ci0JCXdpZGdldDFfLnNldFRpdGxlKCAiRXh0ZW50aW9uIHRpdGxlIDEiICk7Ci0JCXdpZGdldDFfLnNldE5hbWUoICJFeHRlbnNpb24gbmFtZSAxIiApOwotCQl3aWRnZXQxXy5zZXRGYWN0b3J5KCBnZXRDb250cmlidXRvcjEoKSApOwotCQkKLQkgICAgd2lkZ2V0Ml8gPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLQkJd2lkZ2V0Ml8uc2V0RGVzY3JpcHRpb24oICJFeHRlbnRpb25zIGRlc2MgMiIgKTsKLQkJd2lkZ2V0Ml8uc2V0VGl0bGUoICJFeHRlbnRpb24gdGl0bGUgMiIgKTsKLQkJd2lkZ2V0Ml8uc2V0TmFtZSggIkV4dGVuc2lvbiBuYW1lIDIiICk7Ci0JCXdpZGdldDJfLnNldEZhY3RvcnkoIGdldENvbnRyaWJ1dG9yMigpICk7Ci0JfQotCQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCkgCi0JewotCSAgcmV0dXJuIHdpZGdldDFfOwotCX0KLQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSAKLQl7Ci0JICByZXR1cm4gd2lkZ2V0Q29udHJpYnV0b3IgPT0gd2lkZ2V0MV8gJiYgY2hlY2tCb3hfLmdldFNlbGVjdGlvbigpID8gd2lkZ2V0Ml8gOiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBnZXRDb250cmlidXRvcjEoKQotCXsKLQkgIHJldHVybiBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLQkgIHsKLQotCQlwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkJewotCQkgIHJldHVybiBuZXcgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yKCkKLQkJICB7Ci0JCSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgCi0JCSAgICB7Ci0JCQkgIGNoZWNrQm94XyA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULkNIRUNLICk7Ci0JCQkgIGNoZWNrQm94Xy5zZXRUZXh0KCAiRGlzcGxheSBuZXh0IHBhZ2U/IiApOwotCQkJICBjaGVja0JveF8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0JCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSAKLQkJCQkJCQkJCQkJCXsKLQkJCQkJCQkJCQkJCSAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQoIG51bGwgKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLQkJCSAgCi0JCQkgIHJldHVybiB0aGlzOwotCQkgICAgfQotCi0JCSAgICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpIAotCQkgICAgewotCQkJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JCSAgICB9Ci0JCSAgfTsKLQkJfSAgCi0JICB9OwotCX0KLQkKLQlwcml2YXRlIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBnZXRDb250cmlidXRvcjIoKQotCXsKLQkgIHJldHVybiBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLQkgIHsKLQotCQlwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkJewotCQkgIHJldHVybiBuZXcgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yKCkKLQkJICB7Ci0JCSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgCi0JCSAgICB7Ci0gICAgICAgICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0JCQkgIGxhYmVsLnNldFRleHQoICJPcHRpb25hbCBzZWNvbmQgcGFnZSIgKTsKLQkJCSAgCi0JCQkgIHJldHVybiB0aGlzOwotCQkgICAgfQotCi0JCSAgICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpIAotCQkgICAgewotCQkJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JCSAgICB9Ci0JCSAgfTsKLQkJfSAgCi0JICB9OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2R1bW15L0R1bW15V2lkZ2V0RmFjdG9yeTIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZHVtbXkvRHVtbXlXaWRnZXRGYWN0b3J5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2VkMjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZHVtbXkvRHVtbXlXaWRnZXRGYWN0b3J5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmR1bW15OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXRDb250cmlidXRvcjsKLQotcHVibGljIGNsYXNzIER1bW15V2lkZ2V0RmFjdG9yeTIgaW1wbGVtZW50cyBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBCdXR0b24gY2hlY2tCb3hfOwotCXByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0MV87Ci0JcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciB3aWRnZXQyXzsKLQkKLQlwdWJsaWMgRHVtbXlXaWRnZXRGYWN0b3J5MigpCi0JewotCQl3aWRnZXQxXyA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwkJCi0JCXdpZGdldDFfLnNldERlc2NyaXB0aW9uKCAiRXh0ZW50aW9ucyBTZWNvbmQgcm91bmQgZGVzYyAxIiApOwotCQl3aWRnZXQxXy5zZXRUaXRsZSggIkV4dGVudGlvbiBTZWNvbmQgcm91bmQgdGl0bGUgMSIgKTsKLQkJd2lkZ2V0MV8uc2V0TmFtZSggIkV4dGVuc2lvbiBuYW1lIDEiICk7Ci0JCXdpZGdldDFfLnNldEZhY3RvcnkoIGdldENvbnRyaWJ1dG9yMSgpICk7Ci0JCQotCSAgICB3aWRnZXQyXyA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotCQl3aWRnZXQyXy5zZXREZXNjcmlwdGlvbiggIkV4dGVudGlvbnMgU2Vjb25kIHJvdW5kIGRlc2MgMiIgKTsKLQkJd2lkZ2V0Ml8uc2V0VGl0bGUoICJFeHRlbnRpb24gU2Vjb25kIHJvdW5kICB0aXRsZSAyIiApOwotCQl3aWRnZXQyXy5zZXROYW1lKCAiRXh0ZW5zaW9uIG5hbWUgMiIgKTsKLQkJd2lkZ2V0Ml8uc2V0RmFjdG9yeSggZ2V0Q29udHJpYnV0b3IyKCkgKTsKLQl9Ci0JCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSAKLQl7Ci0JICByZXR1cm4gd2lkZ2V0MV87Ci0JfQotCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldCggSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIAotCXsKLQkgIHJldHVybiB3aWRnZXRDb250cmlidXRvciA9PSB3aWRnZXQxXyAmJiBjaGVja0JveF8uZ2V0U2VsZWN0aW9uKCkgPyB3aWRnZXQyXyA6IG51bGw7Ci0JfQotCQotCXByaXZhdGUgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGdldENvbnRyaWJ1dG9yMSgpCi0JewotCSAgcmV0dXJuIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotCSAgewotCi0JCXB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQl7Ci0JCSAgcmV0dXJuIG5ldyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IoKQotCQkgIHsKLQkJICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSAKLQkJICAgIHsKLQkJCSAgY2hlY2tCb3hfID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuQ0hFQ0sgKTsKLQkJCSAgY2hlY2tCb3hfLnNldFRleHQoICJEaXNwbGF5IG5leHQgcGFnZSBhZ2Fpbj8iICk7Ci0JCQkgIGNoZWNrQm94Xy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIAotCQkJCQkJCQkJCQkJewotCQkJCQkJCQkJCQkJICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudCggbnVsbCApOwotCQkJCQkJCQkJCQkJfQotCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCQkJICAKLQkJCSAgcmV0dXJuIHRoaXM7Ci0JCSAgICB9Ci0KLQkJICAgIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkgCi0JCSAgICB7Ci0JCQkgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkJICAgIH0KLQkJICB9OwotCQl9ICAKLQkgIH07Ci0JfQotCQotCXByaXZhdGUgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGdldENvbnRyaWJ1dG9yMigpCi0JewotCSAgcmV0dXJuIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotCSAgewotCi0JCXB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQl7Ci0JCSAgcmV0dXJuIG5ldyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IoKQotCQkgIHsKLQkJICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSAKLQkJICAgIHsKLSAgICAgICAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUgKTsKLQkJCSAgbGFiZWwuc2V0VGV4dCggIk9wdGlvbmFsIHNlY29uZCByb3VuZCAyIHBhZ2UiICk7Ci0JCQkgIAotCQkJICByZXR1cm4gdGhpczsKLQkJICAgIH0KLQotCQkgICAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSAKLQkJICAgIHsKLQkJCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCQkgICAgfQotCQkgIH07Ci0JCX0gIAotCSAgfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L0NsaWVudFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvd3NydC9DbGllbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYzczNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L0NsaWVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIENsaWVudFR5cGUgewotCi0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fOwotICBwcml2YXRlIEhhc2h0YWJsZSB3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfOwotICAgIAotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgV2ViU2VydmljZUNsaWVudEltcGwgd2ViU2VydmljZUNsaWVudEltcGw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBtb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIHByaXZhdGUgU3RyaW5nW10gbW9kdWxlVHlwZXNFeGNsdWRlOwotICBwcml2YXRlIFN0cmluZyB3ZWJTZXJ2aWNlQ2xpZW50VHlwZUlkOwotCQotICAKLSAgCi0JcHVibGljIENsaWVudFR5cGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fLCBIYXNodGFibGUgd2ViU2VydmljZUNsaWVudEltcGxzXykKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lbGVtXyA9IGVsZW1fOwotICAgIHRoaXMud2ViU2VydmljZUNsaWVudEltcGxzXyA9IHdlYlNlcnZpY2VDbGllbnRJbXBsc187Ci0gIH0KLQotCi0KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICBpZiAoaWQ9PW51bGwpCi0gICAgewotICAgICAgaWQgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgfQotICAgIHJldHVybiBpZDsKLSAgfQotICAKLQotCi0KLSAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZVR5cGVzRXhjbHVkZSgpCi0gIHsKLSAgICBpZiAobW9kdWxlVHlwZXNFeGNsdWRlPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJtb2R1bGVUeXBlc0V4Y2x1ZGUiKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgbW9kdWxlVHlwZXNFeGNsdWRlID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVUeXBlc0V4Y2x1ZGUubGVuZ3RoOyBpKyspCi0gICAgICAgICAgbW9kdWxlVHlwZXNFeGNsdWRlW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtb2R1bGVUeXBlc0V4Y2x1ZGU7Ci0gIH0KLSAgCi0KLQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRNb2R1bGVUeXBlc0luY2x1ZGUoKQotICB7Ci0gICAgaWYgKG1vZHVsZVR5cGVzSW5jbHVkZT09bnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ciA9IGVsZW1fLmdldEF0dHJpYnV0ZSgibW9kdWxlVHlwZXNJbmNsdWRlIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyLCAiICIpOwotICAgICAgICBpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIG1vZHVsZVR5cGVzSW5jbHVkZSA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlVHlwZXNJbmNsdWRlLmxlbmd0aDsgaSsrKQotICAgICAgICAgIG1vZHVsZVR5cGVzSW5jbHVkZVtpXSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbW9kdWxlVHlwZXNJbmNsdWRlOwotICB9Ci0gIAotCi0KLQotICBwdWJsaWMgV2ViU2VydmljZUNsaWVudEltcGwgZ2V0V2ViU2VydmljZUNsaWVudEltcGwoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VDbGllbnRJbXBsPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyB3c2NpbXBsSWQgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImltcGxJZCIpOwotICAgICAgd2ViU2VydmljZUNsaWVudEltcGwgPSAoV2ViU2VydmljZUNsaWVudEltcGwpd2ViU2VydmljZUNsaWVudEltcGxzXy5nZXQod3NjaW1wbElkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VDbGllbnRJbXBsOwotICB9Ci0gIAotCi0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VDbGllbnRUeXBlSWQoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VDbGllbnRUeXBlSWQ9PW51bGwpCi0gICAgewotICAgICAgd2ViU2VydmljZUNsaWVudFR5cGVJZCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgid2ViU2VydmljZUNsaWVudFR5cGVJZCIpOwotICAgIH0KLSAgICByZXR1cm4gd2ViU2VydmljZUNsaWVudFR5cGVJZDsKLSAgfQotICAKLQotCi0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3dzcnQvQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA4NzRkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3dzcnQvQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSUNvbnRleHQ7Ci0KLS8qKgotICogQGF1dGhvciByc2luaGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0IGltcGxlbWVudHMgSUNvbnRleHQgewkKLQlwcml2YXRlIFdlYlNlcnZpY2VTY2VuYXJpbyBzY2VuYXJpbzsKLQlwcml2YXRlIGJvb2xlYW4gZGV2ZWxvcDsKLQlwcml2YXRlIGJvb2xlYW4gYXNzZW1ibGU7Ci0JcHJpdmF0ZSBib29sZWFuIGRlcGxveTsKLQlwcml2YXRlIGJvb2xlYW4gaW5zdGFsbDsKLQlwcml2YXRlIGJvb2xlYW4gcnVuOwotCXByaXZhdGUgYm9vbGVhbiBjbGllbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIHRlc3Q7Ci0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2g7Ci0JcHJpdmF0ZSBib29sZWFuIG92ZXJXcml0ZUZpbGVzOwotCXByaXZhdGUgYm9vbGVhbiBjcmVhdGVGb2xkZXJzOwotCXByaXZhdGUgYm9vbGVhbiBjaGVja091dEZpbGVzOwotCQotCXB1YmxpYyBib29sZWFuIGdldEFzc2VtYmxlKCkgewotCQlyZXR1cm4gYXNzZW1ibGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldENoZWNrT3V0RmlsZXMoKSB7Ci0JCXJldHVybiBjaGVja091dEZpbGVzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRDbGllbnQoKSB7Ci0JCXJldHVybiBjbGllbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldENyZWF0ZUZvbGRlcnMoKSB7Ci0JCXJldHVybiBjcmVhdGVGb2xkZXJzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXREZXBsb3koKSB7Ci0JCXJldHVybiBkZXBsb3k7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldERldmVsb3AoKSB7Ci0JCXJldHVybiBkZXZlbG9wOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnN0YWxsKCkgewotCQlyZXR1cm4gaW5zdGFsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0T3ZlcldyaXRlRmlsZXMoKSB7Ci0JCXJldHVybiBvdmVyV3JpdGVGaWxlczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2g7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldFJ1bigpIHsKLQkJcmV0dXJuIHJ1bjsKLQl9Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VTY2VuYXJpbyBnZXRTY2VuYXJpbygpIHsKLQkJcmV0dXJuIHNjZW5hcmlvOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRUZXN0KCkgewotCQlyZXR1cm4gdGVzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBc3NlbWJsZShib29sZWFuIGFzc2VtYmxlKSB7Ci0JCXRoaXMuYXNzZW1ibGUgPSBhc3NlbWJsZTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRDaGVja091dEZpbGVzKGJvb2xlYW4gY2hlY2tPdXRGaWxlcykgewotCQl0aGlzLmNoZWNrT3V0RmlsZXMgPSBjaGVja091dEZpbGVzOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldENsaWVudChib29sZWFuIGNsaWVudCkgewotCQl0aGlzLmNsaWVudCA9IGNsaWVudDsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGVGb2xkZXJzKGJvb2xlYW4gY3JlYXRlRm9sZGVycykgewotCQl0aGlzLmNyZWF0ZUZvbGRlcnMgPSBjcmVhdGVGb2xkZXJzOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldERlcGxveShib29sZWFuIGRlcGxveSkgewotCQl0aGlzLmRlcGxveSA9IGRlcGxveTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXREZXZlbG9wKGJvb2xlYW4gZGV2ZWxvcCkgewotCQl0aGlzLmRldmVsb3AgPSBkZXZlbG9wOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldEluc3RhbGwoYm9vbGVhbiBpbnN0YWxsKSB7Ci0JCXRoaXMuaW5zdGFsbCA9IGluc3RhbGw7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0T3ZlcldyaXRlRmlsZXMoYm9vbGVhbiBvdmVyV3JpdGVGaWxlcykgewotCQl0aGlzLm92ZXJXcml0ZUZpbGVzID0gb3ZlcldyaXRlRmlsZXM7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaChib29sZWFuIHB1Ymxpc2gpIHsKLQkJdGhpcy5wdWJsaXNoID0gcHVibGlzaDsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRSdW4oYm9vbGVhbiBydW4pIHsKLQkJdGhpcy5ydW4gPSBydW47Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0U2NlbmFyaW8oV2ViU2VydmljZVNjZW5hcmlvIHNjZW5hcmlvKSB7Ci0JCXRoaXMuc2NlbmFyaW8gPSBzY2VuYXJpbzsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRUZXN0KGJvb2xlYW4gdGVzdCkgewotCQl0aGlzLnRlc3QgPSB0ZXN0OwotCX0JCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1NlbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1NlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWJmNTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvd3NydC9TZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklTZWxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb24gaW1wbGVtZW50cyBJU2VsZWN0aW9uIHsKLQotCXByaXZhdGUgT2JqZWN0W10gc2VsZWN0aW9uOwotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRTZWxlY3Rpb24oKSAKLQl7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihPYmplY3RbXSBzZWxlY3Rpb24pCi0JewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvd3NydC9TZXJ2aWNlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1NlcnZpY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNGNmZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1NlcnZpY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwud3NydDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5JV2ViU2VydmljZVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlVHlwZSB7Ci0KLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHdlYlNlcnZpY2VJbXBsc187Ci0gIHByaXZhdGUgSGFzaE1hcCB3ZWJTZXJ2aWNlVHlwZXNfOwotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgV2ViU2VydmljZUltcGwgd2ViU2VydmljZUltcGw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBib3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZTsKLQlwcml2YXRlIFN0cmluZ1tdIHRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIHByaXZhdGUgU3RyaW5nW10gYm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGU7Ci0gIHByaXZhdGUgU3RyaW5nW10gdG9wRG93bk1vZHVsZVR5cGVzRXhjbHVkZTsKLSAgcHJpdmF0ZSBJV2ViU2VydmljZVR5cGUgd2ViU2VydmljZVR5cGU7Ci0gIAotCi0gIAotICBwdWJsaWMgU2VydmljZVR5cGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fLCBIYXNodGFibGUgd2ViU2VydmljZUltcGxzXywgSGFzaE1hcCB3ZWJTZXJ2aWNlVHlwZXNfKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmVsZW1fID0gZWxlbV87Ci0gICAgdGhpcy53ZWJTZXJ2aWNlSW1wbHNfID0gd2ViU2VydmljZUltcGxzXzsKLSAgICB0aGlzLndlYlNlcnZpY2VUeXBlc18gPSB3ZWJTZXJ2aWNlVHlwZXNfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEJvdHRvbVVwTW9kdWxlVHlwZXNFeGNsdWRlKCkKLSAgewotICAgIGlmIChib3R0b21VcE1vZHVsZVR5cGVzRXhjbHVkZT09bnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ciA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiYnVNb2R1bGVUeXBlc0V4Y2x1ZGUiKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgYm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGUgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJvdHRvbVVwTW9kdWxlVHlwZXNFeGNsdWRlLmxlbmd0aDsgaSsrKQotICAgICAgICAgIGJvdHRvbVVwTW9kdWxlVHlwZXNFeGNsdWRlW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBib3R0b21VcE1vZHVsZVR5cGVzRXhjbHVkZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Qm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGUoU3RyaW5nW10gYm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGUpCi0gIHsKLSAgICB0aGlzLmJvdHRvbVVwTW9kdWxlVHlwZXNFeGNsdWRlID0gYm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRCb3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZSgpCi0gIHsKLSAgICBpZiAoYm90dG9tVXBNb2R1bGVUeXBlc0luY2x1ZGU9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImJ1TW9kdWxlVHlwZXNJbmNsdWRlIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyLCAiICIpOwotICAgICAgICBpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIGJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZS5sZW5ndGg7IGkrKykKLSAgICAgICAgICBib3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZVtpXSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYm90dG9tVXBNb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlKFN0cmluZ1tdIGJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlKQotICB7Ci0gICAgdGhpcy5ib3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZSA9IGJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIGlmIChpZD09bnVsbCkKLSAgICB7Ci0gICAgICBpZCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiaWQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGlkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpCi0gIHsKLSAgICB0aGlzLmlkID0gaWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRUb3BEb3duTW9kdWxlVHlwZXNFeGNsdWRlKCkKLSAgewotICAgIGlmICh0b3BEb3duTW9kdWxlVHlwZXNFeGNsdWRlPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJ0ZE1vZHVsZVR5cGVzRXhjbHVkZSIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICB0b3BEb3duTW9kdWxlVHlwZXNFeGNsdWRlID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BEb3duTW9kdWxlVHlwZXNFeGNsdWRlLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHRvcERvd25Nb2R1bGVUeXBlc0V4Y2x1ZGVbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRvcERvd25Nb2R1bGVUeXBlc0V4Y2x1ZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRvcERvd25Nb2R1bGVUeXBlc0V4Y2x1ZGUoU3RyaW5nW10gdG9wRG93bk1vZHVsZVR5cGVzRXhjbHVkZSkKLSAgewotICAgIHRoaXMudG9wRG93bk1vZHVsZVR5cGVzRXhjbHVkZSA9IHRvcERvd25Nb2R1bGVUeXBlc0V4Y2x1ZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRUb3BEb3duTW9kdWxlVHlwZXNJbmNsdWRlKCkKLSAgewotICAgIGlmICh0b3BEb3duTW9kdWxlVHlwZXNJbmNsdWRlPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJ0ZE1vZHVsZVR5cGVzSW5jbHVkZSIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICB0b3BEb3duTW9kdWxlVHlwZXNJbmNsdWRlID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BEb3duTW9kdWxlVHlwZXNJbmNsdWRlLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGVbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGUoU3RyaW5nW10gdG9wRG93bk1vZHVsZVR5cGVzSW5jbHVkZSkKLSAgewotICAgIHRoaXMudG9wRG93bk1vZHVsZVR5cGVzSW5jbHVkZSA9IHRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJV2ViU2VydmljZVR5cGUgZ2V0V2ViU2VyaXZjZVR5cGUoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VUeXBlPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyB3c2lkID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJ3ZWJTZXJ2aWNlVHlwZUlkIik7Ci0gICAgICB3ZWJTZXJ2aWNlVHlwZSA9IChJV2ViU2VydmljZVR5cGUpd2ViU2VydmljZVR5cGVzXy5nZXQod3NpZCk7Ci0gICAgfQotICAgIHJldHVybiB3ZWJTZXJ2aWNlVHlwZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVR5cGUoSVdlYlNlcnZpY2VUeXBlIHdlYlNlcnZpY2VUeXBlKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlVHlwZSA9IHdlYlNlcnZpY2VUeXBlOwotICB9Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZUltcGwgZ2V0V2ViU2VydmljZUltcGwoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VJbXBsID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHdzaW1wbElkID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJpbXBsSWQiKTsKLSAgICAgIHdlYlNlcnZpY2VJbXBsID0gKFdlYlNlcnZpY2VJbXBsKXdlYlNlcnZpY2VJbXBsc18uZ2V0KHdzaW1wbElkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VJbXBsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlSW1wbDEoV2ViU2VydmljZUltcGwgd2ViU2VydmljZUltcGwpCi0gIHsKLSAgICB0aGlzLndlYlNlcnZpY2VJbXBsID0gd2ViU2VydmljZUltcGw7Ci0gIH0KLSAgCi0JCi0gIAotCQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VDbGllbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZUNsaWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlMzc4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZUNsaWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUNsaWVudEltcGwgewotCi0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fOyAKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlQ2xpZW50SW1wbChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV8pCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuZWxlbV8gPSBlbGVtXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgaWYgKGlkPT1udWxsKQotICAgIHsKLSAgICAgIGlkID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIH0KLSAgICByZXR1cm4gaWQ7Ci0gIH0KLSAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gIHsKLSAgICBpZiAobGFiZWw9PW51bGwpCi0gICAgewotICAgICAgbGFiZWwgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImxhYmVsIik7Ci0gICAgfQotICAgIHJldHVybiBsYWJlbDsKLSAgfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvd3NydC9XZWJTZXJ2aWNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YzVkNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlSW1wbCB7Ci0JCi0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fOwotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgU3RyaW5nW10gcmVzb3VyY2VUeXBlTWV0YWRhdGE7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBleHRlbnNpb25NZXRhZGF0YTsKLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlSW1wbChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV8pCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuZWxlbV8gPSBlbGVtXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRFeHRlbnNpb25NZXRhZGF0YSgpCi0gIHsKLSAgICBpZiAoZXh0ZW5zaW9uTWV0YWRhdGE9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImV4dGVuc2lvbk1ldGFkYXRhIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyLCAiICIpOwotICAgICAgICBpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIGV4dGVuc2lvbk1ldGFkYXRhID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25NZXRhZGF0YS5sZW5ndGg7IGkrKykKLSAgICAgICAgICBleHRlbnNpb25NZXRhZGF0YVtpXSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgfSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gZXh0ZW5zaW9uTWV0YWRhdGE7Ci0gIH0KLSAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICBpZiAoaWQ9PW51bGwpCi0gICAgewotICAgICAgaWQgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgfQotICAgIHJldHVybiBpZDsKLSAgfQotICAKLQotICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgewotICAgIGlmIChsYWJlbD09bnVsbCkKLSAgICB7Ci0gICAgICBsYWJlbCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9IAotICAKLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VUeXBlTWV0YWRhdGEoKQotICB7Ci0gICAgaWYgKHJlc291cmNlVHlwZU1ldGFkYXRhPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJyZXNvdXJjZVR5cGVNZXRhZGF0YSIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICByZXNvdXJjZVR5cGVNZXRhZGF0YSA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VUeXBlTWV0YWRhdGEubGVuZ3RoOyBpKyspCi0gICAgICAgICAgcmVzb3VyY2VUeXBlTWV0YWRhdGFbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc291cmNlVHlwZU1ldGFkYXRhOwotICB9Ci0gIAotCQotICAKLSAgCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvd3NydC9XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOGNlNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVR5cGVJbXBsOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeQotewotCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uUmVnaXN0cnkgaW5zdGFuY2VfOwotCi0gIEhhc2hNYXAgd2ViU2VydmljZVR5cGVzXzsKLQotICBIYXNodGFibGUgd2ViU2VydmljZUltcGxzXzsKLQotICBIYXNodGFibGUgd2ViU2VydmljZUNsaWVudEltcGxzXzsKLQotICBIYXNodGFibGUgc2VydmljZVR5cGVzXzsKLQotICBIYXNodGFibGUgY2xpZW50VHlwZXNfOwotCi0gIEhhc2h0YWJsZSB3ZWJTZXJ2aWNlUnVudGltZXNfOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICAqIAotICAgKiBAcmV0dXJuIEEgc2luZ2xldG9uIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uUmVnaXN0cnkgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSBuZXcgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgaW5zdGFuY2VfLmxvYWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBsb2FkKCkKLSAgewotICAgIC8vIENhbid0IGdldCByaWQgb2Ygd2ViU2VydmljZVR5cGVzIGluIE00Ci0gICAgd2ViU2VydmljZVR5cGVzXyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgd2ViU2VydmljZUltcGxzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHNlcnZpY2VUeXBlc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgY2xpZW50VHlwZXNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHdlYlNlcnZpY2VSdW50aW1lc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgCi0gICAgLy9Mb2FkIFdlYlNlcnZpY2VUeXBlcwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSIpOwotICAgIAotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjb25maWcubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBjb25maWdbaWR4XTsKLQotICAgICAgICBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJTZXJ2aWNlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgV2ViU2VydmljZVR5cGVJbXBsIHdzdCA9IG5ldyBXZWJTZXJ2aWNlVHlwZUltcGwoZWxlbSk7Ci0gICAgICAgICAgd2ViU2VydmljZVR5cGVzXy5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoImlkIiksIHdzdCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIC8vTG9hZCBXZWJTZXJ2aWNlSW1wbHMKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB3c0ltcGxFeHRzID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsICJ3c0ltcGwiKTsKLSAgICAKLSAgICBmb3IoaW50IGlkeD0wOyBpZHg8d3NJbXBsRXh0cy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IHdzSW1wbEV4dHNbaWR4XTsKLQotICAgICAgICBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJTZXJ2aWNlSW1wbCIpKQotICAgICAgICB7Ci0gICAgICAgICAgV2ViU2VydmljZUltcGwgd3NpbXBsID0gbmV3IFdlYlNlcnZpY2VJbXBsKGVsZW0pOwotICAgICAgICAgIHdlYlNlcnZpY2VJbXBsc18ucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCB3c2ltcGwpOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9Mb2FkIFdlYlNlcnZpY2VDbGllbnRJbXBscwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHdzQ2xpZW50SW1wbEV4dHMgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwgIndzQ2xpZW50SW1wbCIpOwotICAgIAotICAgIGZvcihpbnQgaWR4PTA7IGlkeDx3c0NsaWVudEltcGxFeHRzLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gd3NDbGllbnRJbXBsRXh0c1tpZHhdOwotCi0gICAgICAgIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VDbGllbnRJbXBsIikpCi0gICAgICAgIHsKLSAgICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50SW1wbCB3c0NsaWVudEltcGwgPSBuZXcgV2ViU2VydmljZUNsaWVudEltcGwoZWxlbSk7Ci0gICAgICAgICAgd2ViU2VydmljZUNsaWVudEltcGxzXy5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoImlkIiksIHdzQ2xpZW50SW1wbCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL0xvYWQgU2VydmljZVR5cGVzCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gc2VydmljZVR5cGVFeHRzID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsICJzZXJ2aWNlVHlwZSIpOwotICAgIAotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxzZXJ2aWNlVHlwZUV4dHMubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBzZXJ2aWNlVHlwZUV4dHNbaWR4XTsKLQotICAgICAgICBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJzZXJ2aWNlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgU2VydmljZVR5cGUgc3QgPSBuZXcgU2VydmljZVR5cGUoZWxlbSx3ZWJTZXJ2aWNlSW1wbHNfLHdlYlNlcnZpY2VUeXBlc18pOwotICAgICAgICAgIHNlcnZpY2VUeXBlc18ucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCBzdCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL0xvYWQgQ2xpZW50VHlwZXMKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjbGllbnRUeXBlRXh0cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAiY2xpZW50VHlwZSIpOwotICAgIAotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjbGllbnRUeXBlRXh0cy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IGNsaWVudFR5cGVFeHRzW2lkeF07Ci0KLSAgICAgICAgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygiY2xpZW50VHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgQ2xpZW50VHlwZSBjdCA9IG5ldyBDbGllbnRUeXBlKGVsZW0sd2ViU2VydmljZUNsaWVudEltcGxzXyk7Ci0gICAgICAgICAgY2xpZW50VHlwZXNfLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgY3QpOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9Mb2FkIFdlYlNlcml2Y2VSdW50aW1lcwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHdzcnRFeHRzID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsICJ3ZWJTZXJ2aWNlUnVudGltZSIpOwotICAgIAotICAgIGZvcihpbnQgaWR4PTA7IGlkeDx3c3J0RXh0cy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IHdzcnRFeHRzW2lkeF07Ci0KLSAgICAgICAgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygid2ViU2VydmljZVJ1bnRpbWUiKSkKLSAgICAgICAgewotICAgICAgICAgIFdlYlNlcnZpY2VSdW50aW1lSW5mbyB3c3J0SW5mbyA9IG5ldyBXZWJTZXJ2aWNlUnVudGltZUluZm8oZWxlbSwgc2VydmljZVR5cGVzXywgY2xpZW50VHlwZXNfKTsKLSAgICAgICAgICB3ZWJTZXJ2aWNlUnVudGltZXNfLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgd3NydEluZm8pOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gIH0gIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvd3NydC9XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTBlMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5JRUpCTmF0dXJlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuSVdlYlNlcnZpY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuVHlwZVNlbGVjdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VUeXBlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5MYWJlbHNBbmRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlUnVudGltZTsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgSVdlYlNlcnZpY2VSdW50aW1lIGdldFdlYlNlcnZpY2VSdW50aW1lKCBTdHJpbmcgcnVudGltZUlkICkKLSAgewotCVdlYlNlcnZpY2VSdW50aW1lSW5mbyB3c3J0SW5mbyAgICAgICAJCT0gZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHJ1bnRpbWVJZCk7Ci0JSVdlYlNlcnZpY2VSdW50aW1lICAgIHdlYnNlcnZpY2VSdW50aW1lICAgICA9IG51bGw7Ci0JaWYgKHdzcnRJbmZvICE9IG51bGwpCi0JewotCQl3ZWJzZXJ2aWNlUnVudGltZSA9IHdzcnRJbmZvLmdldFdlYlNlcnZpY2VSdW50aW1lKCk7Ci0JfQotCQotCXJldHVybiB3ZWJzZXJ2aWNlUnVudGltZTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBJV2ViU2VydmljZVR5cGUgZ2V0V2ViU2VydmljZVR5cGVCeUlkKFN0cmluZyBpZCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSByZWdpc3RyeS53ZWJTZXJ2aWNlVHlwZXNfLmdldChpZCk7Ci0JCi0gICAgaWYgKHJlc3VsdCE9bnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gKFdlYlNlcnZpY2VUeXBlSW1wbClyZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VSdW50aW1lSW5mbyBnZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQoU3RyaW5nIGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IHJlZ2lzdHJ5LndlYlNlcnZpY2VSdW50aW1lc18uZ2V0KGlkKTsKLSAgICBpZiAocmVzdWx0IT1udWxsKQotICAgIHsKLSAgICAgIHJldHVybiAoV2ViU2VydmljZVJ1bnRpbWVJbmZvKXJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gIAotICAKLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUnVudGltZUluZm8gZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUxhYmVsKFN0cmluZyBsYWJlbCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXIgPSByZWdpc3RyeS53ZWJTZXJ2aWNlUnVudGltZXNfLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VSdW50aW1lSW5mbyB3c3IgPSAoV2ViU2VydmljZVJ1bnRpbWVJbmZvKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzciE9bnVsbCkgewotICAgICAgICBpZiAobGFiZWwuZXF1YWxzKHdzci5nZXRMYWJlbCgpKSkKLSAgICAgICAgICByZXR1cm4gd3NyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgICAKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFJ1bnRpbWVzQnlUeXBlKFN0cmluZyB0eXBlSWQpIAotICB7Ci0gICAgQXJyYXlMaXN0IGlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gcmVnaXN0cnkud2ViU2VydmljZVJ1bnRpbWVzXy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlUnVudGltZUluZm8gd3NyID0gKFdlYlNlcnZpY2VSdW50aW1lSW5mbylpdGVyLm5leHQoKTsKLSAgICAgIFNlcnZpY2VUeXBlW10gc3RzID0gd3NyLmdldFNlcnZpY2VUeXBlcygpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHN0cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgSVdlYlNlcnZpY2VUeXBlIHdzdHlwZSA9IHN0c1tpXS5nZXRXZWJTZXJpdmNlVHlwZSgpOwotICAgICAgICBpZiAodHlwZUlkLmVxdWFscyh3c3R5cGUuZ2V0SWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZHMuYWRkKHdzci5nZXRJZCgpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChpZHMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBydW50aW1lSWRzID0gKFN0cmluZ1tdKWlkcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgcmV0dXJuIHJ1bnRpbWVJZHM7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9ICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyRmFjdG9yeUlkc0J5VHlwZShTdHJpbmcgdHlwZUlkKSAKLSAgewotICAgIFN0cmluZ1tdIHdzcnRzID0gZ2V0UnVudGltZXNCeVR5cGUodHlwZUlkKTsKLSAgICBpZiAod3NydHMgPT0gbnVsbCApCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgICAgCi0gICAgQXJyYXlMaXN0IGlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8d3NydHMubGVuZ3RoIDtpKyspCi0gICAgewotICAgICAgU3RyaW5nW10gZklkcyA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZCh3c3J0c1tpXSkuZ2V0U2VydmVyRmFjdG9yeUlkcygpOwotICAgICAgaWYgKGZJZHMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaj0wOyBqPGZJZHMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlkcy5jb250YWlucyhmSWRzW2pdKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZHMuYWRkKGZJZHNbal0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoaWRzLnNpemUoKSA+IDApCi0gICAgewotICAgICAgU3RyaW5nW10gc2VydmVyRmFjdG9yeUlkcyA9IChTdHJpbmdbXSlpZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgIHJldHVybiBzZXJ2ZXJGYWN0b3J5SWRzOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlcnZlclN1cHBvcnRlZEZvckNob3NlblR5cGUoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAgIFN0cmluZ1tdIGZJZHMgPSBnZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKHR5cGVJZCk7Ci0gICAgaWYgKGZJZHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaT0wO2k8Zklkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWQuZXF1YWxzKGZJZHNbaV0pKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAKLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzUnVudGltZVN1cHBvcnRlZEZvclR5cGUoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIFN0cmluZ1tdIHJJZHMgPSBnZXRSdW50aW1lc0J5VHlwZSh0eXBlSWQpOwotICAgIGlmIChySWRzID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoaW50IGk9MDtpPHJJZHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAocnVudGltZUlkLmVxdWFscyhySWRzW2ldKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZXJ2ZXJSdW50aW1lVHlwZVN1cHBvcnRlZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBTdHJpbmcgcnVudGltZUlkLCBTdHJpbmcgdHlwZUlkKSAgCi0gIHsKLSAgICBTdHJpbmdbXSBySWRzID0gZ2V0UnVudGltZXNCeVR5cGUodHlwZUlkKTsKLSAgICBpZiAocklkcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBySWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChydW50aW1lSWQuZXF1YWxzKHJJZHNbaV0pKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSBmSWRzID0gZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHJJZHNbaV0pLmdldFNlcnZlckZhY3RvcnlJZHMoKTsKLSAgICAgICAgaWYgKGZJZHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZklkcy5sZW5ndGg7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2VydmVyRmFjdG9yeUlkLmVxdWFscyhmSWRzW2pdKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gRm91bmQgaXQhCi0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGRvZXNSdW50aW1lU3VwcG9ydEoyRUVMZXZlbChTdHJpbmcgajJlZVZlcnNpb25JZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIFdlYlNlcnZpY2VSdW50aW1lSW5mbyB3c3J0ID0gZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHJ1bnRpbWVJZCk7Ci0gICAgaWYgKHdzcnQ9PW51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgU3RyaW5nW10gajJlZVZlcnNpb25zID0gd3NydC5nZXRKMmVlTGV2ZWxzKCk7Ci0gICAgaWYgKGoyZWVWZXJzaW9ucz09bnVsbCB8fCBqMmVlVmVyc2lvbnMubGVuZ3RoPT0wKSAKLSAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAgIGZvcihpbnQgaT0wOyBpPGoyZWVWZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoajJlZVZlcnNpb25zW2ldLmVxdWFscyhqMmVlVmVyc2lvbklkKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsgICAgICAgIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBkb2VzUnVudGltZVN1cHBvcnRTZXJ2ZXJUYXJnZXQoU3RyaW5nIHNlcnZlclRhcmdldElkLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgV2ViU2VydmljZVJ1bnRpbWVJbmZvIHdzcnQgPSBnZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQocnVudGltZUlkKTsKLSAgICBpZiAod3NydD09bnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBTdHJpbmdbXSBmSWRzID0gd3NydC5nZXRTZXJ2ZXJGYWN0b3J5SWRzKCk7Ci0gICAgZm9yKGludCBpPTA7aTxmSWRzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoZklkc1tpXSk7Ci0gICAgICBpZiAoc2VydmVyVHlwZSA9PSBudWxsKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIAotICAgICAgU3RyaW5nIHRoaXNTZXJ2ZXJUYXJnZXRJZCA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOyAKLSAgICAgIGlmICh0aGlzU2VydmVyVGFyZ2V0SWQuZXF1YWxzKHNlcnZlclRhcmdldElkKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBsaXN0IG9mIHZhbGlkIHByb2plY3RzIGZvciB0aGUgV2ViIHNlcnZpY2UgdHlwZSB3aXRoIGFuIGlkIG9mIHR5cGVJZC4KLSAgICogSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIFdlYiBzZXJ2aWNlIHR5cGUgZXh0ZW5zaW9uIGRvZXMgbm90IHNwZWNpZnkgd2hpY2ggcHJvamVjdAotICAgKiBuYXR1cmVzIGFyZSBpbmNsdWRlZCwgYSBhcnJheSBvZiBhbGwgV2ViIGFuZCBFSkIgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSB3aWxsCi0gICAqIGJlIHJldHVybmVkLgotICAgKiBAcGFyYW0gdHlwZUlkCi0gICAqIEByZXR1cm4gSVByb2plY3RbXSBhbiBhcnJheSBvZiB2YWxpZCBwcm9qZWN0cwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFByb2plY3RzQnlXZWJTZXJ2aWNlVHlwZShTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICBBcnJheUxpc3QgdmFsaWRQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKQotICAgIHsKLQkJCWlmICghcHJvamVjdHNbaV0uZ2V0TmFtZSgpLmVxdWFscygiU2VydmVycyIpKQotCQkJewotCQkJCXZhbGlkUHJvamVjdHMuYWRkKHByb2plY3RzW2ldKTsKLQkJCX0KLSAgICB9Ci0JCQotCQlyZXR1cm4gKElQcm9qZWN0W10pdmFsaWRQcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFswXSk7IAotCQkvLyByc2t0b2RvCi0JCS8qCi0gICAgSVdlYlNlcnZpY2VUeXBlIHdzdCA9IGdldFdlYlNlcnZpY2VUeXBlQnlJZCh0eXBlSWQpOwotICAgIGlmICh3c3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IHdzdC5nZXRDb25maWd1cmF0aW9uRWxlbWVudCgpOwotICAgICAgU3RyaW5nIGluY2x1ZGVkTmF0dXJlcyA9IGVsZW0uZ2V0QXR0cmlidXRlKCJpbmNsdWRlTmF0dXJlcyIpOwotICAgICAgU3RyaW5nIGV4Y2x1ZGVkTmF0dXJlcyA9IGVsZW0uZ2V0QXR0cmlidXRlKCJleGNsdWRlTmF0dXJlcyIpOwotICAgICAgaWYgKGluY2x1ZGVkTmF0dXJlcyE9bnVsbCAmJiBpbmNsdWRlZE5hdHVyZXMubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChpbmNsdWRlKHByb2plY3RzW2ldLCBpbmNsdWRlZE5hdHVyZXMpICYmIGV4Y2x1ZGUocHJvamVjdHNbaV0sIGV4Y2x1ZGVkTmF0dXJlcykpCi0gICAgICAgICAgICB2YWxpZFByb2plY3RzLmFkZChwcm9qZWN0c1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChJUHJvamVjdFtdKXZhbGlkUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvL0lmIHdzdCB3YXMgbnVsbCBvciB0aGUgZXh0ZW5zaW9uIGRpZG4ndCBzcGVjaWZ5IHdoaWNoIHByb2plY3QgbmF0dXJlcyBhcmUKLSAgICAvLyB0byBiZSBpbmNsdWRlZCwgcmV2ZXJ0IHRvIHRoZSBvbGQgYmVoYXZpb3VyCi0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcm9qZWN0cy5sZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdHNbal0pIHx8IFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3RzW2pdKSkKLSAgICAgICAgdmFsaWRQcm9qZWN0cy5hZGQocHJvamVjdHNbal0pOwotICAgIH0gICAgCi0gICAgcmV0dXJuIChJUHJvamVjdFtdKXZhbGlkUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCQkqLwotCQkvLyByc2t0b2RvCi0gIH0gIAotICAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbmNsdWRlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBpbmNsdWRlKQotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbmNsdWRlKTsKLSAgICB3aGlsZShzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChwcm9qZWN0Lmhhc05hdHVyZShzdC5uZXh0VG9rZW4oKSkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBleGNsdWRlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBleGNsdWRlKQotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihleGNsdWRlKTsKLSAgICB3aGlsZShzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChwcm9qZWN0Lmhhc05hdHVyZShzdC5uZXh0VG9rZW4oKSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9ICAKLQotICAKLSAgcHVibGljIHN0YXRpYyBMYWJlbHNBbmRJZHMgZ2V0U2VydmljZVR5cGVMYWJlbHMoKQotICB7Ci0gICAgTGFiZWxzQW5kSWRzIGxhYmVsSWRzID0gbmV3IExhYmVsc0FuZElkcygpOwotICAgIEl0ZXJhdG9yICAgICBpdGVyYXRvciA9IHJlZ2lzdHJ5LndlYlNlcnZpY2VUeXBlc18udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICBpbnQgICAgICAgICAgc2l6ZSAgICAgPSByZWdpc3RyeS53ZWJTZXJ2aWNlVHlwZXNfLnNpemUoKTsKLSAgICBTdHJpbmdbXSAgICAgbGFiZWxzICAgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgIFN0cmluZ1tdICAgICBpZHMgICAgICA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgaW50ICAgICAgICAgIGluZGV4ICAgID0gMDsKLSAgICAKLSAgICBsYWJlbElkcy5zZXRMYWJlbHNfKCBsYWJlbHMgKTsKLSAgICBsYWJlbElkcy5zZXRJZHNfKCBpZHMgKTsKLSAgICAKLSAgICB3aGlsZSggaXRlcmF0b3IuaGFzTmV4dCgpICkgCi0gICAgewotICAgICAgV2ViU2VydmljZVR5cGVJbXBsIHR5cGUgPSAoV2ViU2VydmljZVR5cGVJbXBsKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIAotICAgICAgaWRzW2luZGV4XSAgICA9IHR5cGUuZ2V0SWQoKTsKLSAgICAgIGxhYmVsc1tpbmRleF0gPSB0eXBlLmdldExhYmVsKCk7Ci0gICAgICBpbmRleCsrOwotICAgIH0gICAgCi0gICAgCi0gICAgcmV0dXJuIGxhYmVsSWRzOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UnVudGltZVZhbHVlRm9yKFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBTdHJpbmdbXSBySWRzID0gZ2V0UnVudGltZXNCeVR5cGUodHlwZUlkKTsKLSAgICBpZiAocklkcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcklkc1swXTsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0U2VydmVyVmFsdWVGb3IoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFN0cmluZ1tdIGZJZHMgPSBnZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKHR5cGVJZCk7Ci0gICAgaWYgKGZJZHM9PW51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICByZXR1cm4gZklkc1swXTsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VUeXBlQnlTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgVHlwZVNlbGVjdGlvbkZpbHRlciB0c2YgPSBuZXcgVHlwZVNlbGVjdGlvbkZpbHRlcigpOwotICAgIFN0cmluZ1tdIHdzdCA9IHRzZi5nZXRXZWJTZXJ2aWNlVHlwZUJ5SW5pdGlhbFNlbGVjdGlvbihzZWxlY3Rpb24sIHJlZ2lzdHJ5LndlYlNlcnZpY2VUeXBlc18pOwotICAgIHJldHVybiB3c3QgPT0gbnVsbCA/IG51bGwgOiB3c3Q7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBhbiBFSkIgcHJvamVjdCBpcyBuZWVkZWQgdG8gaG9zdCBhIFdlYiBzZXJ2aWNlCi0gICAqIG9mIHRoZSB0eXBlIGlkZW50aWZpZWQgYnkgdHlwZUlkLiBJZiBtdWx0aXBsZSBuYXR1cmVJZHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgCi0gICAqICJpbmNsdWRlTmF0dXJlcyIgYXR0cmlidXRlLCBvbmx5IHRoZSBmaXJzdCBvbmUgaXMgY2hlY2tlZC4gSWYgbm8gbmF0dXJlSWRzIGFyZSBzcGVjaWZpZWQsIAotICAgKiBmYWxzZSBpcyByZXR1cm5lZC4KLSAgICogCi0gICAqIEBkZXByZWNhdGVkICAKLSAgICogCVNob3VsZCBiZSByZWZhY3RvcmVkIGluIGZ1dHVyZSAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXF1aXJlc0VKQlByb2plY3QoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIElXZWJTZXJ2aWNlVHlwZSB3c3QgPSBnZXRXZWJTZXJ2aWNlVHlwZUJ5SWQodHlwZUlkKTsKLSAgICBpZiAod3N0ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSB3c3QuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLSAgICAgIFN0cmluZyBpbmNsdWRlZE5hdHVyZXMgPSBlbGVtLmdldEF0dHJpYnV0ZSgiaW5jbHVkZU5hdHVyZXMiKTsKLSAgICAgIGlmIChpbmNsdWRlZE5hdHVyZXM9PW51bGwgfHwgaW5jbHVkZWROYXR1cmVzLmxlbmd0aCgpPT0wKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5jbHVkZWROYXR1cmVzKTsKLSAgICAgICAgaWYoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGZpcnN0SW5jbHVkZWROYXR1cmUgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICBpZiAoZmlyc3RJbmNsdWRlZE5hdHVyZS5lcXVhbHMoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXF1aXJlc0VKQk1vZHVsZUZvcihTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBTdHJpbmcgcnVudGltZUlkLCBTdHJpbmcgdHlwZUlkKQotICB7Ci0JICAvLyByc2t0b2RvCi0JICByZXR1cm4gZmFsc2U7Ci0gIH0gIAotICAKLSAgLy9Qb3J0ZWQgZnJvbSB0aGUgZm9ybWVyIFdlYlNlcnZpY2VDbGllbnRSZWdpc3RyeQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UnVudGltZUxhYmVsQnlJZChTdHJpbmcgcnVudGltZUlkKSAKLSAgewotICAgIFdlYlNlcnZpY2VSdW50aW1lSW5mbyB3c3J0ID0gZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHJ1bnRpbWVJZCk7Ci0gICAgaWYgKHdzcnQgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIHJldHVybiB3c3J0LmdldExhYmVsKCk7Ci0gIH0gIAotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyTGFiZWxCeUlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0gIHsKLSAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJGYWN0b3J5SWQpOwotICAgIGlmIChzZXJ2ZXJUeXBlID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBTdHJpbmcgc2VydmVyTGFiZWwgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldFRleHQoc2VydmVyVHlwZSk7ICAgCi0gICAgcmV0dXJuIHNlcnZlckxhYmVsOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJJbnN0YW5jZUxhYmVsRnJvbUluc3RhbmNlSWQoIFN0cmluZyBpbnN0YW5jZUlkICkKLSAgewotICAgIElTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKCBpbnN0YW5jZUlkICk7ICAgIAotICAgIHJldHVybiBzZXJ2ZXIuZ2V0TmFtZSgpOwotICB9ICAKLSAgCi0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFJ1bnRpbWVzQnlDbGllbnRUeXBlKFN0cmluZyBjbGllbnRUeXBlSWQpIAotICB7Ci0gICAgQXJyYXlMaXN0IGlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gcmVnaXN0cnkud2ViU2VydmljZVJ1bnRpbWVzXy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlUnVudGltZUluZm8gd3NyID0gKFdlYlNlcnZpY2VSdW50aW1lSW5mbylpdGVyLm5leHQoKTsKLSAgICAgIENsaWVudFR5cGVbXSBjdHMgPSB3c3IuZ2V0Q2xpZW50VHlwZXMoKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxjdHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB3c2N0eXBlSWQgPSBjdHNbaV0uZ2V0V2ViU2VydmljZUNsaWVudFR5cGVJZCgpOwotICAgICAgICBpZiAod3NjdHlwZUlkLmVxdWFscyhjbGllbnRUeXBlSWQpKQotICAgICAgICB7Ci0gICAgICAgICAgaWRzLmFkZCh3c3IuZ2V0SWQoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoaWRzLnNpemUoKSA+IDApCi0gICAgewotICAgICAgU3RyaW5nW10gcnVudGltZUlkcyA9IChTdHJpbmdbXSlpZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgIHJldHVybiBydW50aW1lSWRzOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLQotICAKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHdlYlNlcnZpY2VDbGllbnRSdW50aW1lVHlwZUV4aXN0cyhTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBTdHJpbmcgcnVudGltZUlkLCBTdHJpbmcgY2xpZW50VHlwZUlkKSAKLSAgewotICAgIFN0cmluZ1tdIHJJZHMgPSBnZXRSdW50aW1lc0J5Q2xpZW50VHlwZShjbGllbnRUeXBlSWQpOwotICAgIGlmIChySWRzID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHJJZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHJ1bnRpbWVJZC5lcXVhbHMocklkc1tpXSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIGZJZHMgPSBnZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQocklkc1tpXSkuZ2V0U2VydmVyRmFjdG9yeUlkcygpOwotICAgICAgICBpZiAoZklkcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmSWRzLmxlbmd0aDsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWQuZXF1YWxzKGZJZHNbal0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBGb3VuZCBpdCEKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEFsbENsaWVudFJ1bnRpbWVzKCkgCi0gIHsKLSAgICBBcnJheUxpc3QgaWRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSByZWdpc3RyeS53ZWJTZXJ2aWNlUnVudGltZXNfLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VSdW50aW1lSW5mbyB3c3IgPSAoV2ViU2VydmljZVJ1bnRpbWVJbmZvKWl0ZXIubmV4dCgpOwotICAgICAgQ2xpZW50VHlwZVtdIGN0cyA9IHdzci5nZXRDbGllbnRUeXBlcygpOwotICAgICAgaWYgKGN0cyE9bnVsbCAmJiBjdHMubGVuZ3RoPjApCi0gICAgICB7Ci0gICAgICAgIC8vdGhpcyBydW50aW1lIHN1cHBvcnRzIHRoZSBjbGllbnQgc2NlbmFyaW8KLSAgICAgICAgaWRzLmFkZCh3c3IuZ2V0SWQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChpZHMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBydW50aW1lSWRzID0gKFN0cmluZ1tdKWlkcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgcmV0dXJuIHJ1bnRpbWVJZHM7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpIAotICB7ICAgIAotICAgIFN0cmluZ1tdIHJJZHMgPSBnZXRBbGxDbGllbnRSdW50aW1lcygpOwotICAgIGlmIChySWRzPT1udWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgQXJyYXlMaXN0IGlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8cklkcy5sZW5ndGggO2krKykKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBmSWRzID0gZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHJJZHNbaV0pLmdldFNlcnZlckZhY3RvcnlJZHMoKTsKLSAgICAgIGlmIChmSWRzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGo9MDsgajxmSWRzLmxlbmd0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpZHMuY29udGFpbnMoZklkc1tqXSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWRzLmFkZChmSWRzW2pdKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGlkcy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHNlcnZlckZhY3RvcnlJZHMgPSAoU3RyaW5nW10paWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICByZXR1cm4gc2VydmVyRmFjdG9yeUlkczsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q2xpZW50UHJvamVjdFR5cGVzKFN0cmluZyBjbGllbnRUeXBlSWQsIFN0cmluZyBydW50aW1lSWQpCi0gIHsKLSAgICBTdHJpbmdbXSBySWRzID0gZ2V0UnVudGltZXNCeUNsaWVudFR5cGUoY2xpZW50VHlwZUlkKTsKLSAgICBpZiAocklkcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHJJZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHJ1bnRpbWVJZC5lcXVhbHMocklkc1tpXSkpCi0gICAgICB7Ci0gICAgICAgIENsaWVudFR5cGVbXSBjdHMgPSBnZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQocklkc1tpXSkuZ2V0Q2xpZW50VHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaj0wOyBqPGN0cy5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB0aGlzQ2xpZW50VHlwZUlkID0gY3RzW2pdLmdldFdlYlNlcnZpY2VDbGllbnRUeXBlSWQoKTsKLSAgICAgICAgICBpZiAoY2xpZW50VHlwZUlkLmVxdWFscyh0aGlzQ2xpZW50VHlwZUlkKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL0ZvdW5kIHRoZSBvbmUhCi0gICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0VHlwZXMgPSBjdHNbal0uZ2V0TW9kdWxlVHlwZXNJbmNsdWRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gcHJvamVjdFR5cGVzOwotICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICAgIAotICAgIHJldHVybiBudWxsOyAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBMYWJlbHNBbmRJZHMgZ2V0Q2xpZW50VHlwZUxhYmVscygpCi0gIHsKLQkgIAotCSAgTGFiZWxzQW5kSWRzIGxhYmVsSWRzID0gbmV3IExhYmVsc0FuZElkcygpOwotCSAgU3RyaW5nW10gaWRzQXJyYXkgPSBuZXcgU3RyaW5nWzBdOwotCSAgU3RyaW5nW10gbGFiZWxzQXJyYXkgPSBuZXcgU3RyaW5nWzBdOwotCSAgbGFiZWxJZHMuc2V0SWRzXyhpZHNBcnJheSk7Ci0JICBsYWJlbElkcy5zZXRMYWJlbHNfKGxhYmVsc0FycmF5KTsKLQkKLQkgIFN0cmluZ1tdIHJJZHMgPSBnZXRBbGxDbGllbnRSdW50aW1lcygpOwotCSAgaWYgKHJJZHMgPT0gbnVsbCkKLQkgIHsKLQkJICByZXR1cm4gbGFiZWxJZHM7Ci0JICB9Ci0JCi0JICBBcnJheUxpc3QgaWRzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgQXJyYXlMaXN0IGxhYmVscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkgIGZvciAoaW50IGk9MDsgaSA8IHJJZHMubGVuZ3RoOyBpKyspCi0JICB7Ci0JCQlXZWJTZXJ2aWNlUnVudGltZUluZm8gd3NydCA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChySWRzW2ldKTsKLQkJCUNsaWVudFR5cGVbXSBjdHMgPSB3c3J0LmdldENsaWVudFR5cGVzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGN0cy5sZW5ndGg7IGorKykKLQkJCXsKLQkJCQlDbGllbnRUeXBlIGN0ID0gY3RzW2pdOwotCQkJCVN0cmluZyBpZCA9IGN0LmdldFdlYlNlcnZpY2VDbGllbnRUeXBlSWQoKTsKLQkJCQlpZiAoIWlkcy5jb250YWlucyhpZCkpCi0JCQkJewotCQkJCQlpZHMuYWRkKGlkKTsKLQkJCQkJbGFiZWxzLmFkZChjdC5nZXRXZWJTZXJ2aWNlQ2xpZW50SW1wbCgpLmdldExhYmVsKCkpOwotCQkJCX0KLQkJICB9Ci0KLQkJfQotCi0JCWlmIChpZHMuc2l6ZSgpID4gMCkKLQkJewotCQkJaWRzQXJyYXkgPSAoU3RyaW5nW10pIGlkcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCQkJbGFiZWxzQXJyYXkgPSAoU3RyaW5nW10pIGxhYmVscy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCQkJbGFiZWxJZHMuc2V0SWRzXyhpZHNBcnJheSk7Ci0JCQlsYWJlbElkcy5zZXRMYWJlbHNfKGxhYmVsc0FycmF5KTsKLQkJfQotCi0JCXJldHVybiBsYWJlbElkczsKLQotCX0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZTczY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC93c3J0L1dlYlNlcnZpY2VSdW50aW1lSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZVJ1bnRpbWU7Ci0KLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VSdW50aW1lSW5mbyB7Ci0KLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGFsbFNlcnZpY2VUeXBlc187Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGFsbENsaWVudFR5cGVzXzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGlkOwotICBwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFNlcnZpY2VUeXBlW10gc2VydmljZVR5cGVzOwotCXByaXZhdGUgQ2xpZW50VHlwZVtdIGNsaWVudFR5cGVzOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIHNlcnZsZXRMZXZlbHM7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gajJlZUxldmVsczsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBydW50aW1lSWRzOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIHNlcnZlckZhY3RvcnlJZHM7Ci0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCXByaXZhdGUgSVdlYlNlcnZpY2VSdW50aW1lIHdlYlNlcnZpY2VSdW50aW1lXzsKLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlUnVudGltZUluZm8oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fLCBIYXNodGFibGUgYWxsU2VydmljZVR5cGVzXywgSGFzaHRhYmxlIGFsbENsaWVudFR5cGVzXykKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lbGVtXyA9IGVsZW1fOwotICAgIHRoaXMuYWxsU2VydmljZVR5cGVzXyA9IGFsbFNlcnZpY2VUeXBlc187Ci0gICAgdGhpcy5hbGxDbGllbnRUeXBlc18gPSBhbGxDbGllbnRUeXBlc187Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0gIHsKLSAgICBpZiAoY2xhc3NOYW1lPT1udWxsKQotICAgIHsKLSAgICAgIGNsYXNzTmFtZT1lbGVtXy5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Ci0gICAgfQotICAgIHJldHVybiBjbGFzc05hbWU7Ci0gIH0KLSAgCi0KLSAgcHVibGljIENsaWVudFR5cGVbXSBnZXRDbGllbnRUeXBlcygpCi0gIHsKLSAgICBpZiAoY2xpZW50VHlwZXM9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImNsaWVudFR5cGVzIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyLCAiICIpOwotICAgICAgICBpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIGNsaWVudFR5cGVzID0gbmV3IENsaWVudFR5cGVbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpZW50VHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgY3RpZCA9IHN0Lm5leHRUb2tlbigpOyAgICAgICAgICAKLSAgICAgICAgICBjbGllbnRUeXBlc1tpXSA9IChDbGllbnRUeXBlKWFsbENsaWVudFR5cGVzXy5nZXQoY3RpZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNsaWVudFR5cGVzOwotICB9Ci0gIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgaWYgKGlkPT1udWxsKQotICAgIHsKLSAgICAgIGlkID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIH0KLSAgICByZXR1cm4gaWQ7Ci0gIH0KLSAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gIHsKLSAgICBpZiAobGFiZWw9PW51bGwpCi0gICAgewotICAgICAgbGFiZWwgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImxhYmVsIik7Ci0gICAgfQotICAgIHJldHVybiBsYWJlbDsKLSAgfSAgIAotCi0gIAotICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEoyZWVMZXZlbHMoKQotICB7Ci0gICAgaWYgKGoyZWVMZXZlbHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ciA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiajJlZUxldmVscyIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBqMmVlTGV2ZWxzID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqMmVlTGV2ZWxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIGoyZWVMZXZlbHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICB9ICAgICAgCi0gICAgCi0gICAgcmV0dXJuIGoyZWVMZXZlbHM7Ci0gIH0KLSAgCi0KLSAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRSdW50aW1lSWRzKCkKLSAgewotICAgIGlmIChydW50aW1lSWRzID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoInJ1bnRpbWVzIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyLCAiICIpOwotICAgICAgICBpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIHJ1bnRpbWVJZHMgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnRpbWVJZHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgcnVudGltZUlkc1tpXSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgfQotICAgIH0gICAgICAKLSAgICAKLSAgICByZXR1cm4gcnVudGltZUlkczsKLSAgfQotICAKLQotICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFNlcnZlckZhY3RvcnlJZHMoKQotICB7Ci0gICAgaWYgKHNlcnZlckZhY3RvcnlJZHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ciA9IGVsZW1fLmdldEF0dHJpYnV0ZSgic2VydmVycyIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBzZXJ2ZXJGYWN0b3J5SWRzID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJGYWN0b3J5SWRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHNlcnZlckZhY3RvcnlJZHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHNlcnZlckZhY3RvcnlJZHM7Ci0gIH0KLSAgCi0KLSAgcHVibGljIFNlcnZpY2VUeXBlW10gZ2V0U2VydmljZVR5cGVzKCkKLSAgewotICAgIGlmIChzZXJ2aWNlVHlwZXM9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoInNlcnZpY2VUeXBlcyIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBzZXJ2aWNlVHlwZXMgPSBuZXcgU2VydmljZVR5cGVbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZVR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGN0aWQgPSBzdC5uZXh0VG9rZW4oKTsgICAgICAgICAgCi0gICAgICAgICAgc2VydmljZVR5cGVzW2ldID0gKFNlcnZpY2VUeXBlKWFsbFNlcnZpY2VUeXBlc18uZ2V0KGN0aWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzZXJ2aWNlVHlwZXM7Ci0gIH0KLSAgCi0KLSAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTZXJ2bGV0TGV2ZWxzKCkKLSAgewotICAgIGlmIChzZXJ2bGV0TGV2ZWxzPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJzZXJ2bGV0TGV2ZWxzIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyLCAiICIpOwotICAgICAgICBpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIHNlcnZsZXRMZXZlbHMgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZsZXRMZXZlbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgc2VydmxldExldmVsc1tpXSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgfSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gc2VydmxldExldmVsczsKLSAgfQotICAKLSAgcHVibGljIElXZWJTZXJ2aWNlUnVudGltZSBnZXRXZWJTZXJ2aWNlUnVudGltZSgpCi0gIHsKLQlpZiAod2ViU2VydmljZVJ1bnRpbWVfID09IG51bGwpCi0JewotCQl0cnkKLQkJewotCQkJd2ViU2VydmljZVJ1bnRpbWVfID0gKElXZWJTZXJ2aWNlUnVudGltZSllbGVtXy5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gY2UpCi0JCXsKLQkJCQotCQl9Ci0JfQotCQotCXJldHVybiB3ZWJTZXJ2aWNlUnVudGltZV87Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkNDU4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3ZWJzZXJ2aWNldXRpbHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMjRkZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13ZWJzZXJ2aWNldXRpbHMuamFyCi13c2MuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTg1MTNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LndzZGw8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUuc29hcDwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMGFkNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS53c2MuamFyID0gc3JjLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBkb2MvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICB3ZWJzZXJ2aWNldXRpbHMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSB3c2MuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIHdlYnNlcnZpY2V1dGlscy5qYXIKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgd3NjLmphcixcCi0gICAgICAgICAgICAgICB3ZWJzZXJ2aWNldXRpbHMuamFyCi1zb3VyY2Uud2Vic2VydmljZXV0aWxzLmphciA9IHdlYnNlcnZpY2V1dGlscy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODRlMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMgQ29uc3VtcHRpb24KLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotWFBfV1NGSU5ERVI9b3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLndzZmluZGVyCi1YUF9XRUJfU0VSVklDRV9TVEFSVF9TRVJWRVJfVFlQRT1XZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlCi1YUF9TRVJWRVJfREVGQVVMVEVSPVNlcnZlciBEZWZhdWx0ZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWFhNGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBuYW1lPSIlUExVR0lOX05BTUUiCi0gICBwcm92aWRlci1uYW1lPSIlUExVR0lOX1BST1ZJREVSIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ3c2MuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UueHNkIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLndzaWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndlYiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9IndzZmluZGVyIgotICAgICAgbmFtZT0iJVhQX1dTRklOREVSIi8+Ci0KLSAgIDwhLS0gVGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnQgd2lsbCBiZSByZW1vdmVkLiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJ3ZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlIgotICAgICAgbmFtZT0iJVhQX1dFQl9TRVJWSUNFX1NUQVJUX1NFUlZFUl9UWVBFIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJzZXJ2ZXJEZWZhdWx0ZXIiCi0gICAgICBuYW1lPSIlWFBfU0VSVkVSX0RFRkFVTFRFUiIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLndlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUiPgotICAgICAgPHdlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUKLSAgICAgICAgICAgIGZhY3RvcnlJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuMzIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0VG9tY2F0U2VydmVyIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQzMl9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTdGFydFNlcnZlclR5cGU+Ci0gICAgICA8d2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZQotICAgICAgICAgICAgZmFjdG9yeUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uU3RhcnRUb21jYXRTZXJ2ZXIiCi0gICAgICAgICAgICBpZD0iU0VSVkVSX0lEX1RPTUNBVDQwX0xPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZT4KLSAgICAgIDx3ZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFRvbWNhdFNlcnZlciIKLSAgICAgICAgICAgIGlkPSJTRVJWRVJfSURfVE9NQ0FUNDFfTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlPgotICAgICAgPHdlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUKLSAgICAgICAgICAgIGZhY3RvcnlJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0VG9tY2F0U2VydmVyIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ1MF9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTdGFydFNlcnZlclR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NvbnN1bXB0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jb25zdW1wdGlvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzZjkzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NvbnN1bXB0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgU2FtcGxlIG1lc3NhZ2VzCi0jCi1NU0dfRVJST1JfSlRTX1BST1hZX0hBU19OT19NRVRIT0RTPUlXQUIwMTc5RSBVbmFibGUgdG8gY3JlYXRlIGEgc2FtcGxlIHRvIHRoZSBwcm94eSBiZWNhdXNlIHRoZSBwcm94eSBkb2VzIG5vdCBjb250YWluIG1ldGhvZHMuCi1NU0dfRVJST1JfSlRTX1BST1hZX0hBU19OT19ERUZBVUxUPUlXQUIwMTgwRSBVbmFibGUgdG8gY3JlYXRlIGEgc2FtcGxlIHRvIHRoZSBwcm94eSBiZWNhdXNlIHRoZSBwcm94eSBpcyBub3QgYSBiZWFuIChpLmUuLiB0aGUgc2FtcGxlIGRvZXMgbm90IGhhdmUgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IpLgotTVNHX0VSUk9SX0pUU19OT19QUk9YWV9NRVRIT0RTX1BST0NFU1NFRD1JV0FCMDE4MUUgVW5hYmxlIHRvIGNyZWF0ZSBhIHNhbXBsZSB0byB0aGUgcHJveHkgYmVjYXVzZSBub25lIG9mIHRoZSBtZXRob2RzIGluIHRoZSBwcm94eSB3ZXJlIHByb2Nlc3NlZC4KLU1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9UWVBFPUlXQUIwMTgyVyBUaGUgU2FtcGxlIEpTUCBjbGllbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nIHR5cGU6Ci1NU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfSU5ERVhFRF9QUk9QRVJUSUVTPUlXQUIwMTg3VyBUaGUgU2FtcGxlIEpTUCBjbGllbnQgZG9lcyBub3Qgc3VwcG9ydCBJbmRleGVkIHByb3BlcnRpZXMuCi1NU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfUEFSQU1FVEVSU19BUlJBWVM9SVdBQjAyMzdXIFRoZSBTYW1wbGUgSlNQIGNsaWVudCBkb2VzIG5vdCBzdXBwb3J0IGFycmF5czoKLU1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9QQVJBTUVURVJTX0lOUFVUUz1JV0FCMDEyNFcgVGhlIFNhbXBsZSBKU1AgY2xpZW50IGRvZXMgbm90IHN1cHBvcnQgaW5wdXQgcGFyYW1ldGVycyB0aGF0IGFyZSBub3QgYmVhbnM6Ci1NU0dfRVJST1JfSlRTX0NZQ0xJQ19CRUFOPUlXQUIwMTg4RSBUaGUgU2FtcGxlIEpTUCBjbGllbnQgZG9lcyBub3Qgc3VwcG9ydCBiZWFucyBjb250YWluaW5nIGF0dHJpYnV0ZXMgdGhhdCByZWZlcmVuY2UgdGhlIGJlYW5zLgotTVNHX1dBUk5fSlRTX1BST1hZX01FVEhPRFNfT01JVFRFRD1JV0FCMDE4OVcgVGhlIFNhbXBsZSBKU1AgY2xpZW50IG9taXR0ZWQgc29tZSBtZXRob2RzIGJlY2F1c2UgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdHlwZXMuCi1NU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEPUlXQUIwMDIxRSBTYW1wbGUgY3JlYXRpb24gd2FzIGNhbmNlbGVkCi1NU0dfV0FSTl9VTkFCTEVfVE9fRklORF9QUk9YWT1JV0FCMDAyMlcgVGhlIFByb3h5IFJlc291cmNlIGNvdW5kIG5vdCBub3QgYmUgZm91bmQuCi0KLQotIwotIyBGaWx0ZXJzCi0jCi1GSUxURVJfTVNHX0VSUk9SX05VTExfT0JKRUNUPUlXQUIwMDk3RSBObyBvYmplY3QgaGFzIGJlZW4gcHJvdmlkZWQuCi1GSUxURVJfTVNHX0VSUk9SX05PVF9GSUxFPUlXQUIwMDk4RSBUaGUgb2JqZWN0ICJ7MH0iIGlzIG5vdCBhIGZpbGUuCi1GSUxURVJfTVNHX0VSUk9SX05PVF9GT0xERVI9SVdBQjAxMzdFIFRoZSBvYmplY3QgInswfSIgaXMgbm90IGEgZm9sZGVyLgotCi1KQVZBX0ZJTFRFUl9OQU1FPUphdmEgZmlsZXMKLUpBVkFfRklMVEVSX0RFU0M9RmlsZXMgd2l0aCBuYW1lcyBlbmRpbmcgaW4gIi5qYXZhIiBvciAiLmNsYXNzIi4KLUpBVkFfRklMVEVSX01TR19FUlJPUl9XUk9OR19FWFRFTlNJT049SVdBQjAxMDJFIFRoZSBmaWxlICJ7MH0iIGRvZXMgbm90IGVuZCBpbiAiLmphdmEiIG9yICIuY2xhc3MiLgotCi1XU0RMX0ZJTFRFUl9OQU1FPVdTREwgZmlsZXMKLVdTRExfRklMVEVSX0RFU0M9RmlsZXMgd2l0aCBuYW1lcyBlbmRpbmcgaW4gIi53c2RsIi4KLVdTRExfRklMVEVSX01TR19FUlJPUl9XUk9OR19FWFRFTlNJT049SVdBQjAxMDNFIFRoZSBmaWxlICJ7MH0iIGRvZXMgbm90IGVuZCBpbiAiLndzZGwiLgotCi1JU0RfRklMVEVSX05BTUU9SVNEIGZpbGVzCi1JU0RfRklMVEVSX0RFU0M9RmlsZXMgd2l0aCBuYW1lcyBlbmRpbmcgaW4gIi5pc2QiLgotSVNEX0ZJTFRFUl9NU0dfRVJST1JfV1JPTkdfRVhURU5TSU9OPUlXQUIwMDk1RSBUaGUgZmlsZSAiezB9IiBkb2VzIG5vdCBlbmQgaW4gIi5pc2QiLgotCi1GT0xERVJfRklMVEVSX05BTUU9Rm9sZGVycwotRk9MREVSX0ZJTFRFUl9ERVNDPUZvbGRlcnMuCi0KLQotIwotIyBDb21tb24gbWVzc2FnZXMKLSMKLQotCi1NU0dfRVJST1JfUFJPSkVDVF9OT1RfRk9VTkQ9SVdBQjAwNjlFIFdlYiBwcm9qZWN0IHdhcyBub3QgZm91bmQuCi1NU0dfRVJST1JfSU5TVEFOQ0VfTk9UX0ZPVU5EPUlXQUIwMDcwRSBTZXJ2ZXIgd2FzIG5vdCBmb3VuZC4KLQotUFJPR1JFU1NfSU5GT19QVUJMSVNIX1dFQl9QUk9KRUNUPUlXQUIwMDcySSBQdWJsaXNoaW5nIFdlYiBwcm9qZWN0LgotCi0jCi0jIERlcGxveW1lbnQgc3RhdHVzCi0jCi1QUk9HUkVTU19JTkZPX0NPUFlfV0VCU0VSVklDRV9VVElMUz1JV0FCMDAyM0kgQ29weWluZyB0aGUgd2Vic2VydmljZSB1dGlsaXRpZXMuCi1QUk9HUkVTU19JTkZPX0NPUFlJTkdfRklMRT1JV0FCMDE5N0kgQ29weWluZyBTT0FQIHJ1bi10aW1lIGZpbGUuCi1QUk9HUkVTU19JTkZPX1NUQVJUX1dFQl9QUk9KRUNUPUlXQUIwMTk4SSBTdGFydGluZyBXZWIgcHJvamVjdC4KLVBST0dSRVNTX0lORk9fUFVCTElTSElOR19TRVJWRVI9SVdBQjAxOTlJIFB1Ymxpc2hpbmcgc2VydmVyLgotUFJPR1JFU1NfSU5GT19TVEFSVElOR19TRVJWRVI9SVdBQjAyMDBJIFN0YXJ0aW5nIHNlcnZlci4KLVBST0dSRVNTX0lORk9fUFVCTElTSF9XRUJfUFJPSkVDVD1JV0FCMDIwNUkgUHVibGlzaGluZyBXZWIgcHJvamVjdC4KLQotCi0jCi0jIERlcGxveW1lbnQgbWVzc2FnZXMKLSMKLU1TR19FUlJPUl9QUk9KRUNUX05PVF9GT1VORD1JV0FCMDIwN0UgV2ViIHByb2plY3Qgd2FzIG5vdCBmb3VuZC4KLU1TR19FUlJPUl9GSUxFQ09QWV9XRUJTRVJWSUNFX1VUSUxTPUlXQUIwMDI0RSBFcnJvciBpbiBjb3B5aW5nIFdlYnNlcnZpY2UgVXRpbGl0eSBmaWxlLgotTVNHX0VSUk9SX0lOU1RBTkNFX05PVF9GT1VORD1JV0FCMDIxMkUgU2VydmVyIHdhcyBub3QgZm91bmQuCi1NU0dfRVJST1JfU0VSVkVSPUlXQUIwMjEzRSBFcnJvciBpbiBzdGFydGluZyBzZXJ2ZXIuCi1NU0dfRVJST1JfUFVCTElTSD1JV0FCMDIxN0UgRXJyb3IgaW4gcHVibGlzaGluZyBXZWIgcHJvamVjdC4KLQotTVNHX1dBUk5fTk9fREJfRFJJVkVSPUlXQUIwMjIxVyBVbmFibGUgdG8gbG9jYXRlIGRiMmphdmEuemlwLCBwbGVhc2UgZW5zdXJlIGRiMmphdmEuemlwIGlzIGFkZGVkIHRvIHRoZSBzZXJ2ZXIgY2xhc3MgcGF0aC4KLQotTVNHX0VSUk9SX0JBRF9TRVJWRVJfQ09ORklHPUlXQUIwNTM0RSBVbmFibGUgdG8gYWRkIEVBUiBwcm9qZWN0IHRvIFNlcnZlciBDb25maWd1cmF0aW9uLgotTVNHX0VSUk9SX0NSRUFURV9TRVJWRVI9SVdBQjAwMjVFIFVuYWJsZSB0byBjcmVhdGUgc2VydmVyLgotCi0KLQotIwotIyBFSkIgbWVzc2FnZXMKLSMKLVRBU0tfTEFCRUxfQ1JFQVRFX0VKQl9QUk9KRUNUPUNyZWF0ZUVKQlByb2plY3RUYXNrCi1UQVNLX0RFU0NfQ1JFQVRFX0VKQl9QUk9KRUNUPUNyZWF0ZSBhbiBFSkIgUHJvamVjdC4KLU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0VKQl9QUk9KRUNUPUlXQUIwNDMyRSBVbmFibGUgdG8gY3JlYXRlIEVKQiBwcm9qZWN0LgotTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfQVBQX0NMSUVOVF9QUk9KRUNUPUlXQUIwMDI2RSBVbmFibGUgdG8gY3JlYXRlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IHswfS4KLU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0pBVkFfUFJPSkVDVD1JV0FCMDAyN0UgVW5hYmxlIHRvIGNyZWF0ZSBKYXZhIHByb2plY3QgezB9LgotTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUFSX1BST0pFQ1Q9SVdBQjAwNjJFIFVuYWJsZSB0byBjcmVhdGUgRUFSIHByb2plY3QgezB9LgotCi0jCi0jIFdlYlNlcnZpY2VNYXBwaW5nUGFnZSBNZXNzYWdlcwotIwotCi0jCi0jIFZhbGlkYXRvciB0YXNrIGRlc2NyaXB0aW9ucwotIwotVEFTS19MQUJFTF9XRUJTRVJWSUNFX0RJU0FCTEVfVkFMSURBVElPTj1EaXNhYmxlIHZhbGlkYXRvcnMuCi1UQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX1ZBTElEQVRJT049VGVtcG9yYXJpbHkgZGlzYWJsaW5nIHZhbGlkYXRvcnMuCi1UQVNLX0xBQkVMX1dFQlNFUlZJQ0VfUkVTVE9SRV9WQUxJREFUSU9OPVJlc3RvcmUgdmFsaWRhdG9ycy4KLVRBU0tfREVTQ19XRUJTRVJWSUNFX1JFU1RPUkVfVkFMSURBVElPTj1SZXN0b3Jpbmcgc3RhdGVzIG9mIHZhbGlkYXRvcnMuCi1UQVNLX0xBQkVMX1dFQlNFUlZJQ0VfRElTQUJMRV9CVUlMRD1EaXNhYmxlIGF1dG8gYnVpbGQuCi1UQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX0JVSUxEPVRlbXBvcmFyaWx5IGRpc2FibGluZyBhdXRvIGJ1aWxkLgotVEFTS19MQUJFTF9XRUJTRVJWSUNFX1JFU1RPUkVfQlVJTEQ9UmVzdG9yZSBhdXRvIGJ1aWxkLgotVEFTS19ERVNDX1dFQlNFUlZJQ0VfUkVTVE9SRV9CVUlMRD1SZXN0b3Jpbmcgc3RhdGUgb2YgYXV0byBidWlsZC4KLVRBU0tfTEFCRUxfV0VCU0VSVklDRV9CVUlMRF9QUk9KRUNUPUJ1aWxkIHByb2plY3QuCi1UQVNLX0RFU0NfV0VCU0VSVklDRV9CVUlMRF9QUk9KRUNUPUJ1aWxkaW5nIHByb2plY3QuCi0KLSMKLSMgTUlTQwotIwotVEFTS19ERVNDX0NSRUFURV9XRUJfUFJPSkVDVD1DcmVhdGUgV2ViIFByb2plY3QKLVRBU0tfTEFCRUxfQ1JFQVRFX1dFQl9QUk9KRUNUPUNyZWF0ZSBXZWIgUHJvamVjdAotTVNHX0VSUk9SX1dFQl9QUk9KRUNUX0NSRUFURT1JV0FCMDMxMEUgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGNyZWF0aW9uIG9mIHRoZSBXZWIgUHJvamVjdC4KLU1TR19FUlJPUl9TRVJWRVJfVklFV19PUEVOPUlXQUIwMTI2RSBUaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGlzIG9wZW4gZm9yIHswfS4gIENsb3NlIGl0IGFuZCByZXN0YXJ0IHRoZSB3aXphcmQuCi0KLSMKLSMgRGVmYXVsdCBQcm94eSBwcm9qZWN0IG1lc3NhZ2VzCi0jCi0KLQotIwotIwlEZXRlY3ROb25KYXZhQ2hhcnNDb21tYW5kCi0jCi1NU0dfV0FSTl9KQVZBX01FVEhPRF9TVEFSVF9XSVRIX1VQUEVSX0NBU0U9SVdBQjAxMjlXIEphdmEgbWV0aG9kIHswfSBpbiBjbGFzcyB7MX0gc3RhcnRzIHdpdGggYW4gdXBwZXIgY2FzZSBsZXR0ZXIuIE1ldGhvZCBuYW1lcyBzaG91bGQgYmVnaW4gd2l0aCBsb3dlciBjYXNlIGxldHRlcnMuCi1NU0dfV0FSTl9NRVRIT0RfTkFNRV9JTlZBTElEPUlXQUIwMTMxVyBKYXZhIG1ldGhvZCB7MH0gbmFtZSBjb250YWlucyB1bmRlcnNjb3JlIG9yIG51bWVyaWMgZGlnaXRzIGZvbGxvd2VkIGJ5IGEgbG93ZXIgY2FzZSBsZXR0ZXIuXAotTWV0aG9kIG5hbWVzIHNob3VsZCBub3QgY29udGFpbiBsb3dlciBjYXNlIGxldHRlcnMgYWZ0ZXIgYSBudW1lcmljIG9yIHVuZGVyc2NvcmUuCi1NU0dfV0FSTl9CT09MRUFOX1BST1BFUlRZX0FDQ0VTU09SUz1JV0FCMDEzMlcgQm9vbGVhbiBwcm9wZXJ0eSBhY2Nlc3NvciB7MH0gaW4gYmVhbiB7MX0gYmVnaW5zIHdpdGggImdldCIuIEJvb2xlYW4gZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIGJlZ2luIHd0aCAiaXMiLgotTVNHX1dBUk5fUEFDS0FHRV9OQU1FX0hBU19VUFBFUl9DQVNFPUlXQUIwMTMzVyBUaGUgcGFja2FnZSBuYW1lIHswfSBvZiBjbGFzcyB7MX0gaW5jbHVkZXMgdXBwZXIgY2FzZSBsZXR0ZXJzLiBQYWNrYWdlIG5hbWVzIHNob3VsZCBjb25zaXN0IG9mIGxvd2VyIGNhc2UgbGV0dGVycyBvbmx5LgotCi0jCi0jIEphdmFUb01vZGVsQ29tbWFuZAotIwotTEFCRUxfT0s9T0sKLURFU0NSSVBUSU9OX09LPVNlbGVjdCBPSyB0byBjb250aW51ZQotCi1MQUJFTF9DQU5DRUw9Q2FuY2VsCi1ERVNDUklQVElPTl9DQU5DRUw9U2VsZWN0IENhbmNlbCB0byBjYW5jZWwKLQotIwotIyBDcmVhdGVNb25pdG9yQ29tbWFuZAotIwotTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SPUlXQUIwMDAxRSBVbmFibGUgdG8gbW9uaXRvciBwb3J0IHswfSBvZiB7MX0uCi1NU0dfSU5GT19NT05JVE9SSU5HX05PVF9TVVBQT1JURUQ9SVdBQjAwMDJJIHswfSBkb2VzIG5vdCBzdXBwb3J0IHBvcnQgbW9uaXRvcmluZy4KLQotIwotIyBDb3B5V1NETENvbW1hbmQKLSMKLUNPTU1BTkRfTEFCRUxfQ09QWV9XU0RMPUNvcHlpbmcgV1NETAotQ09NTUFORF9ERVNDX0NPUFlfV1NETD1Db3B5aW5nIFdTREwgaW50byB0aGUgd29ya3NwYWNlIGZvciBXZWIgc2VydmljZSBkZXBsb3ltZW50Ci1NU0dfRVJST1JfQ09QWV9XU0RMPUlXQUIwMDI4RSBGYWlsZWQgdG8gY29weSBXU0RMIHswfSB0byB7MX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9HZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9HZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViYWZjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgZ2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRvciBpbXBsZW1lbnRzIFZpc2l0b3JBY3Rpb24KLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIC8qKgotICAqIFRoZSBTdHJpbmdCdWZmZXIgdGhhdCBob2xkcyB0aGUgY29kZWdlbiAKLSAgKiAqLwotICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGZidWZmZXI7IAotCi0gIC8qKgotICAqIFRoZSBWaXNpdG9yIHRoYXQgY2FsbHMgdGhlIHZpc2l0IG1ldGhvZCAKLSAgKiAqLwotICBwcm90ZWN0ZWQgVmlzaXRvciBmVmlzaXRvcjsgCi0KLSAgLyoqCi0gICogVmVjdG9yIHRoYXQgaG9sZHMgc3RhdGUgZGF0YSBmb3IgdGhpcyAgZ2VuZXJhdG9yIAotICAqICovCi0gIHByb3RlY3RlZCBWZWN0b3IgZlJlc2lkZW50VmVjdG9yOwotIAotICAvKgotICAqIFRoaXMgaW50IGhvbGRzIHRoZSBjdXJyZW50IG51bWJlciAKLSAgKi8KLSAgcHJvdGVjdGVkIGludCBmVW5pcXVlTnVtYmVyID0wOwotIAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZkNsaWVudEZvbGRlclBhdGg7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDVE9SWSA9ICJGYWN0b3J5IjsgCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCID0gIiAgICAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfVEFCID0gIiAgICAgICAgIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAiICI7Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIEdlbmVyYXRvciAoKQotICB7Ci0gICAgICBmYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgZlJlc2lkZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOyAKLSAgICAKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIEBwYXJhbSBTdHJpbmdCdWZmZXIgVGFrZXMgdGhlIGJ1ZmZlciBpdCB3aWxsIHdyaXRlIGNvZGUgdG8KLSAgKi8KLSAgcHVibGljIEdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgICAgZmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgIGZSZXNpZGVudFZlY3RvciA9IG5ldyBWZWN0b3IoKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIHJlc2lkZW50KQotICB7Ci0gICAgLy9ub3RoaW5nIHRvIGJlIGRvbmUgYnV0IG11c3QgYmUgaW1wbGVtZW50ZWQKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRGb2xkZXJQYXRoKCkKLSAgewotICAgIHJldHVybiBmQ2xpZW50Rm9sZGVyUGF0aDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEZvbGRlclBhdGgoU3RyaW5nIGZDbGllbnRGb2xkZXJQYXRoXykKLSAgewotICAgIGZDbGllbnRGb2xkZXJQYXRoID0gZkNsaWVudEZvbGRlclBhdGhfOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlTmFtZSA9ICIiOwotICBwcm90ZWN0ZWQgU3RyaW5nIHBvcnROYW1lID0gIiI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcGFja2FnZU5hbWUgPSAiIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBwcm94eUJhc2VOYW1lID0gIiI7Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5mbyhTdHJpbmcgc2VydmljZSwgU3RyaW5nIHBvcnQsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHByb3h5QmFzZSkKLSAgewotICAgIHNlcnZpY2VOYW1lID0gc2VydmljZTsKLSAgICBwb3J0TmFtZSA9IHBvcnQ7Ci0gICAgdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOyAKLSAgICBwcm94eUJhc2VOYW1lID0gcHJveHlCYXNlOyAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQkFEX1NZTUJPTFMgPSB7Jy0nLCAnICd9OyAvLyBzeW1ib2xzIHRoYXQgY2FuIGFwcGVhciBpbiB0aGUgZm9sZGVyIG5hbWUgYnV0IGl0IGlzIG5vdCBhbGxvd2VkIGluIGEgamF2YSBiZWFuIG5hbWUKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBVTkRFUlNDT1JFID0gJ18nOwkvLyByZXBsYWNlIHRoZSBhYm92ZSBvbmVzIGJ5IHVuZGVyc2NvcmUKLSAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uQmVhbklkKCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gZ2V0Q2xpZW50Rm9sZGVyUGF0aCgpOwotICAgIGludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoIi8iKTsKLSAgICBpbmRleCsrOwotICAgIFN0cmluZyBuZXdOYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXgpOwotICAgIGZvciAoIGludCBpID0gMDsgaSA8IEJBRF9TWU1CT0xTLmxlbmd0aDsgaSsrICkgewotICAgIAluZXdOYW1lID0gbmV3TmFtZS5yZXBsYWNlICggQkFEX1NZTUJPTFNbaV0sIFVOREVSU0NPUkUgKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld05hbWUrICJpZCI7Ci0gIH0KLQotICAvKgotICAqIFRoZSBOdW1iZXIgRmFjdG9yeSBpcyBoZXJlIGZvciBuYW1pbmcgcHVycG9zZXMuIEluIAotICAqIHRoaXMgd2F5IHdlIGluc3VyZSBubyBuYW1lcyB3ZSBjcmVhdGUgaW4gYSBwaWVjZSBvZgotICAqIGNvZGUgZ2VuIGFyZSB0aGUgc2FtZS4gV2Uga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVycwotICAqIHVzZWQgYW5kIHdlIGhhbmQgYmFjayB0aGUgbmV4dCBvbmUuIExpa2UgdGFrZSBhIG51bWJlciAKLSAgKiBidWRkeQotICAqIEBwYXJhbSBpbnQgbnVtYmVyIHdlIGFyZSBhdCBhcyB0aGUgc3RhdGUgZGF0YSBoYXMgdG8gYmUgc2V0dGFibGUKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TnVtYmVyRmFjdG9yeShpbnQgbnVtYmVyKQotICB7Ci0gICAgIGZVbmlxdWVOdW1iZXIgPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qCi0gICogVGhpcyBpcyBhIHVuaXF1ZSBudW1iZXIgZm9yIHN0YXRlIHB1cnBvc2VzCi0gICogQHJldHVybiBpbnQgCi0gICovCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyRmFjdG9yeSgpCi0gIHsKLSAgICAgcmV0dXJuIGZVbmlxdWVOdW1iZXI7IAotICB9Ci0gIC8qCi0gICogVGhpcyBpcyBhIHVuaXF1ZSBudW1iZXIgZm9yIG5hbWluZyBwdXJwb3NlcwotICAqIEByZXR1cm4gaW50IAotICAqLwotICBwdWJsaWMgaW50IGdldFVuaXF1ZU51bWJlcigpCi0gIHsKLSAgICAgcmV0dXJuIGZVbmlxdWVOdW1iZXIrKzsKLSAgfQotCi0KLSAgLyoqCi0gICogcmV0dXJucyB0aGUgY3VycmVudCBTdHJpbmdCdWZmZXIKLSAgKiBAcmV0dXJuIFN0cmluZ0J1ZmZlciBUYWtlcyB0aGUgYnVmZmVyIGl0IHdpbGwgd3JpdGUgY29kZSB0b28KLSAgKi8KLSAgcHVibGljIFN0cmluZ0J1ZmZlciBnZXRTdHJpbmdCdWZmZXIgKCkKLSAgewotICAgICAgcmV0dXJuIGZidWZmZXI7Ci0gIH0KLQotICAKLSAgLyoqCi0gICogcmV0dXJucyB0aGUgVmlzaXRvciB0aGF0IGNhbGxlZCB0aGlzIGdlbmVyYXRvcgotICAqIEByZXR1cm4gVmlzaXRvciAKLSAgKi8KLSAgcHVibGljIFZpc2l0b3IgZ2V0VmlzaXRvciAoKQotICB7Ci0gICAgICByZXR1cm4gZlZpc2l0b3I7Ci0gIH0KLSAgCi0KLQotCi0gIC8qKgotICAqIHZlY3RvciB1c2VkIHRvIGhvbGQgc3RhdGUgZGF0YSAKLSAgKiBAcGFyYW1ldGVyIFZpc2l0b3IgCi0gICovCi0gIHB1YmxpYyB2b2lkIHB1dFJlc2lkZW50VmVjdG9yIChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgICBmUmVzaWRlbnRWZWN0b3IuYWRkRWxlbWVudChvYmplY3QpOwotICB9Ci0gIAotCi0gIC8qKgotICAqIHZlY3RvciB1c2VkIHRvIGhvbGQgc3RhdGUgZGF0YSAKLSAgKiBAcGFyYW1ldGVyIFZpc2l0b3IgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc2lkZW50VmVjdG9yIChWZWN0b3IgdmVjdG9yKQotICB7Ci0gICAgICBmUmVzaWRlbnRWZWN0b3IgPSB2ZWN0b3I7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICogcmV0dXJucyB0aGUgcmVzaWRlbnQgdmVjdG9yCi0gICogQHJldHVybiBWaXNpdG9yIAotICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFJlc2lkZW50VmVjdG9yICgpCi0gIHsKLSAgICAgIHJldHVybiBmUmVzaWRlbnRWZWN0b3I7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgYW55IHN0YXRlIGEgZ2VuZXJhdG9yIG1heSBoYXZlCi0gICoKLSAgKiovCi0KLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpCi0gIHsKLSAgICAgLy90byBiZSBpbXBsZW1lbnRlZCBpbiBzdWJsYXNzZXMKLSAgfQotCi0KLSAgIC8qKgotICAqIHNldHMgdGhlIHZpc2l0b3IgdGhhdCBjYWxscyB0aGUgdmlzaXQKLSAgKiBAcGFyYW1ldGVyIFZpc2l0b3IgCi0gICovCi0KLSAgcHVibGljIHZvaWQgc2V0VmlzaXRvcihWaXNpdG9yIHZpc2l0b3IpCi0gIHsKLSAgICAgIGZWaXNpdG9yID0gdmlzaXRvcjsKLSAgfQotCi0KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgLy9pbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCi0gIAlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9SZWxWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vUmVsVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTcyYTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9SZWxWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW47Ci0gICAgICAKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWw7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiBUaGlzIHZpc3RvciB3aWxsIHZpc2l0IGVsZW1lbnRzIGluIGEgbW9kZWwgZ2l2ZW4gYSAKLSogcGFydGljdWxhciByZWwKLSogKi8KLXB1YmxpYyBjbGFzcyBSZWxWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICBwcml2YXRlIGludCBmRWxlbWVudENvdW50ZXI7Ci0gIHByaXZhdGUgaW50IGZUb3RhbEVsZW1lbnRzOwotICBwcml2YXRlIFN0cmluZyBmcmVsTmFtZTsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLQotICBwdWJsaWMgUmVsVmlzaXRvciAoU3RyaW5nIHJlbE5hbWUpCi0gIHsKLSAgICAgZnJlbE5hbWUgPSByZWxOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldFRvdGFsRWxlbWVudHNUb1Zpc2l0KCkKLSAgewotICAgICByZXR1cm4gZlRvdGFsRWxlbWVudHM7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KCkKLSAgewotICAgICBpZihnZXRUb3RhbEVsZW1lbnRzVG9WaXNpdCgpIC0gcHJlc2VudEVsZW1lbnQoKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGludCBwcmVzZW50RWxlbWVudCgpCi0gIHsKLSAgICAgcmV0dXJuIGZFbGVtZW50Q291bnRlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShWaXNpdG9yQWN0aW9uIHZhKQotICB7Ci0gICAgLy9pbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCi0gIH0gIAotICBwdWJsaWMgU3RhdHVzIHJ1biAoT2JqZWN0IHNvdXJjZUVsZW1lbnQsVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gIAkgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgICAgICBpbml0aWFsaXplKHZBY3Rpb24pOwotICAKLSAgICAgICAgdkFjdGlvbi5zZXRWaXNpdG9yKHRoaXMpOwotICAgICAgICBSZWwgcmVsID0gKChCYXNpY0VsZW1lbnQpc291cmNlRWxlbWVudCkuZ2V0UmVsKGZyZWxOYW1lKTsKLSAgICAgICAgLy9zZXQgc29tZSBzdGF0ZSBkYXRhCi0gICAgICAgIGZUb3RhbEVsZW1lbnRzID0gcmVsLmdldE51bWJlck9mVGFyZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgZkVsZW1lbnRDb3VudGVyID0gMDsgIAotICAgICAgICAKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IHJlbC5nZXRUYXJnZXRFbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgICAgIEJhc2ljRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gKEJhc2ljRWxlbWVudCllLm5leHRFbGVtZW50KCk7IAotICAgICAgICAgICBmRWxlbWVudENvdW50ZXIrKzsKLSAgICAgICAgICAgaW5pdGlhbGl6ZSh2QWN0aW9uKTsKLSAgICAgICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdCh0YXJnZXRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICB9IAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL1Zpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmZTY5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgaW50ZXJmYWNlIFZpc2l0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgcnVuIChPYmplY3Qgb2JqZWN0LCBWaXNpdG9yQWN0aW9uIHZBY3Rpb24pOwotICAgICAgICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL1Zpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9WaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYjBiNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL1Zpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBWaXNpdG9yQWN0aW9uLgotKiBUaGUgdmlzaXRvciB3YWxrcyB0aGUgbW9kZWwgYW5kIHRoZSBWaXNpdG9yQWN0aW9uIAotKiBkb2VzIHRoZSBhY3Rpb24KLSogKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlzaXRvckFjdGlvbiAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KTsKLSAgcHVibGljIHZvaWQgc2V0VmlzaXRvcihWaXNpdG9yIHZpc2l0b3IpOwotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cmluZyByZXNpZGVudFN0cmluZyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9BdHRyaWJ1dGVWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9BdHRyaWJ1dGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZmZkYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vQXR0cmlidXRlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uUmVsVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5JbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3I7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZVZpc2l0b3IgZXh0ZW5kcyBSZWxWaXNpdG9yCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGZSZXNpZGVudFN0cmluZzsgCi0gIHByaXZhdGUgVmVjdG9yIGZSZXNpZGVudFZlY3RvcjE7Ci0gIHByaXZhdGUgVmVjdG9yIGZSZXNpZGVudFZlY3RvcjI7Ci0KLSAgIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotCi0gIHB1YmxpYyBBdHRyaWJ1dGVWaXNpdG9yICgpCi0gIHsKLSAgICBzdXBlcihUeXBlRWxlbWVudC5SRUxfQVRUUklCVVRFUyk7Ci0gICAgZlJlc2lkZW50U3RyaW5nID0gIiI7Ci0gIH0KLQotICBwdWJsaWMgQXR0cmlidXRlVmlzaXRvciAoU3RyaW5nIHJlbCkKLSAgewotICAgIHN1cGVyKHJlbCk7Ci0gICAgZlJlc2lkZW50U3RyaW5nID0gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlc2lkZW50U3RyaW5nKFN0cmluZyByZXNpZGVudCkKLSAgewotICAgIGZSZXNpZGVudFN0cmluZyA9IHJlc2lkZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVzaWRlbnRWZWN0b3IxKFZlY3RvciByZXNpZGVudCkKLSAgewotICAgIGZSZXNpZGVudFZlY3RvcjEgPSByZXNpZGVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlc2lkZW50VmVjdG9yMihWZWN0b3IgcmVzaWRlbnQpCi0gIHsKLSAgICBmUmVzaWRlbnRWZWN0b3IyID0gcmVzaWRlbnQ7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShWaXNpdG9yQWN0aW9uIHZBY3Rpb24pCi0gIHsKLSAgICAgLy9oYWNrIGZvciAxOTc3MjYKLQotICAgICBpZih2QWN0aW9uIGluc3RhbmNlb2YgSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yKXsKLSAgICAgICBpZihmUmVzaWRlbnRWZWN0b3IxID09IG51bGwpIGZSZXNpZGVudFZlY3RvcjE9bmV3IFZlY3RvcigpOwotICAgICAgIGlmKGZSZXNpZGVudFZlY3RvcjIgPT0gbnVsbCkgZlJlc2lkZW50VmVjdG9yMj1uZXcgVmVjdG9yKCk7Ci0gICAgICAgKChJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IpdkFjdGlvbikuc2V0UGFyZW50R2V0dGVycyhmUmVzaWRlbnRWZWN0b3IxLGZSZXNpZGVudFZlY3RvcjIpOwotICAgICB9Ci0gIH0KLSAKLSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL0ZpZWxkVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vRmllbGRWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZGIzOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vRmllbGRWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5JbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3I7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEZpZWxkVmlzaXRvciBleHRlbmRzIEF0dHJpYnV0ZVZpc2l0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZlJlc2lkZW50U3RyaW5nOyAKLSAgcHJpdmF0ZSBWZWN0b3IgZlJlc2lkZW50VmVjdG9yMTsKLSAgcHJpdmF0ZSBWZWN0b3IgZlJlc2lkZW50VmVjdG9yMjsKLQotICAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0KLSAgcHVibGljIEZpZWxkVmlzaXRvciAoKQotICB7Ci0gICAgc3VwZXIoVHlwZUVsZW1lbnQuUkVMX0ZJRUxEUyk7Ci0gICAgZlJlc2lkZW50U3RyaW5nID0gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlc2lkZW50U3RyaW5nKFN0cmluZyByZXNpZGVudCkKLSAgewotICAgIGZSZXNpZGVudFN0cmluZyA9IHJlc2lkZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVzaWRlbnRWZWN0b3IxKFZlY3RvciByZXNpZGVudCkKLSAgewotICAgIGZSZXNpZGVudFZlY3RvcjEgPSByZXNpZGVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlc2lkZW50VmVjdG9yMihWZWN0b3IgcmVzaWRlbnQpCi0gIHsKLSAgICBmUmVzaWRlbnRWZWN0b3IyID0gcmVzaWRlbnQ7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShWaXNpdG9yQWN0aW9uIHZBY3Rpb24pCi0gIHsKLSAgICAgLy9oYWNrIGZvciAxOTc3MjYKLQotICAgICBpZih2QWN0aW9uIGluc3RhbmNlb2YgSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yKXsKLSAgICAgICBpZihmUmVzaWRlbnRWZWN0b3IxID09IG51bGwpIGZSZXNpZGVudFZlY3RvcjE9bmV3IFZlY3RvcigpOwotICAgICAgIGlmKGZSZXNpZGVudFZlY3RvcjIgPT0gbnVsbCkgZlJlc2lkZW50VmVjdG9yMj1uZXcgVmVjdG9yKCk7Ci0gICAgICAgKChJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IpdkFjdGlvbikuc2V0UGFyZW50R2V0dGVycyhmUmVzaWRlbnRWZWN0b3IxLGZSZXNpZGVudFZlY3RvcjIpOwotICAgICB9Ci0gIH0KLSAKLSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL01ldGhvZFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL01ldGhvZFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2NjQ2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9NZXRob2RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlJlbFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIE1ldGhvZFZpc2l0b3IgZXh0ZW5kcyBSZWxWaXNpdG9yCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotCi0gIHB1YmxpYyBNZXRob2RWaXNpdG9yICgpCi0gIHsKLSAgICAgc3VwZXIoQmVhbkVsZW1lbnQuUkVMX01FVEhPRFMpOwotICB9Ci0gIAotICAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1BhcmFtZXRlclZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1BhcmFtZXRlclZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0OTMxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9QYXJhbWV0ZXJWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlJlbFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyVmlzaXRvciBleHRlbmRzIFJlbFZpc2l0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0KLSAgcHVibGljIFBhcmFtZXRlclZpc2l0b3IgKCkKLSAgewotICAgICBzdXBlcihNZXRob2RFbGVtZW50LlJFTF9QQVJBTUVURVJTKTsKLSAgfQotICAKLSAgIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9SZXR1cm5QYXJhbWV0ZXJWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9SZXR1cm5QYXJhbWV0ZXJWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjIwNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vUmV0dXJuUGFyYW1ldGVyVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5SZWxWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIFJldHVyblBhcmFtZXRlclZpc2l0b3IgZXh0ZW5kcyBSZWxWaXNpdG9yCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotCi0gIHB1YmxpYyBSZXR1cm5QYXJhbWV0ZXJWaXNpdG9yICgpCi0gIHsKLSAgICAgc3VwZXIoTWV0aG9kRWxlbWVudC5SRUxfUkVUVVJOX1BBUkFNRVRFUlMpOwotICB9Ci0gIAotICAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1R5cGVWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9UeXBlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjU0NjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1R5cGVWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlJlbFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIFR5cGVWaXNpdG9yIGV4dGVuZHMgUmVsVmlzaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLQotICBwdWJsaWMgVHlwZVZpc2l0b3IgKCkKLSAgewotICAgIHN1cGVyKFR5cGVFbGVtZW50LlJFTF9UWVBFKTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzQmVhblZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzQmVhblZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwMWE3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0RldGVjdE5vbkphdmFDaGFyc0JlYW5WaXNpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMuSmF2YU1vZk1ldGhvZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQmVhbkVsZW1lbnQgdXNpbmcgdGhlCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIHRoZSBtZXRob2RzIGluIHRoZSBKYXZhQ2xhc3MKLSogKi8KLXB1YmxpYyBjbGFzcyBEZXRlY3ROb25KYXZhQ2hhcnNCZWFuVmlzaXRvckFjdGlvbiBleHRlbmRzIFZpc2l0b3JBY3Rpb25JbXBsCi17Ci0gIHByaXZhdGUgc3RhdGljIGNoYXIgVU5ERVJTQ09SRSA9ICdfJzsKLSAgcHJpdmF0ZSBib29sZWFuIHNlcnZpY2VCZWFuID0gZmFsc2U7Ci0KLSAgcHVibGljIERldGVjdE5vbkphdmFDaGFyc0JlYW5WaXNpdG9yQWN0aW9uICggVmVjdG9yIG1lc3NhZ2VzLCBWZWN0b3IgYmVhbnMpCi0gIAl7Ci0gIAkJc3VwZXIgKG1lc3NhZ2VzLCBiZWFucyk7Ci0gIAkJLy8gaWYgZmlyc3QgYmVhbiBmaXNpdGVkIHRoYXQgbWVhbnMgaXQgaXMgdGhlIFNlcnZpY2UgYmVhbgotICAJCWlmICggYmVhbnMgPT0gbnVsbCApIAotICAJCQlzZXJ2aWNlQmVhbiA9IHRydWU7Ci0gIAl9Ci0KLSAgLyoqCi0gICogVGhlIHZpc2l0IHdpbGwgY3JlYXRlIHRoZSBiZWFuCi0gICogV2FsayB0aGUgbWV0aG9kcwotICAqIEBwYXJhbSBKYXZhQ2xhc3MgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBiZWFuIG1vZGVsCi0gICoqLwotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3QgamF2YWNsYXNzKQotICB7Ci0gICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpamF2YWNsYXNzOwotICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGphdmFDbGFzcy5nZXRKYXZhUGFja2FnZSgpLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgU3RyaW5nIGJlYW5OYW1lID0gamF2YUNsYXNzLmdldE5hbWUoKTsKLQotICAgIGlmICghaXNCZWFuVmlzaXRlZChqYXZhQ2xhc3MpKSB7Ci0gICAgICAJYWRkVmlzaXRlZEJlYW4oamF2YUNsYXNzKTsKLQkJLy8gY2hlY2sgdGhlIGJlYW4gbmFtZQotCQljaGVja0JlYW5OYW1lKGJlYW5OYW1lKTsKLQkJY2hlY2tQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSwgYmVhbk5hbWUpOwotCSAgCURldGVjdE5vbkphdmFDaGFyc01ldGhvZFZpc2l0b3JBY3Rpb24gbWV0aG9kVmlzaXRvckFjdGlvbiA9IG5ldyBEZXRlY3ROb25KYXZhQ2hhcnNNZXRob2RWaXNpdG9yQWN0aW9uKGdldE1lc3NhZ2VzKCksIGdldEJlYW5zVmlzaXRlZCgpKTsKLSAgICAgIAlKYXZhTW9mTWV0aG9kVmlzaXRvciBtZXRob2RWaXNpdG9yID0gbmV3IEphdmFNb2ZNZXRob2RWaXNpdG9yKCk7Ci0gICAgCW1ldGhvZFZpc2l0b3IucnVuKGphdmFDbGFzcyxtZXRob2RWaXNpdG9yQWN0aW9uKTsKLSAgICAgfQotICAgIAotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgIH0KLQotICAgcHJpdmF0ZSB2b2lkIGNoZWNrQmVhbk5hbWUoU3RyaW5nIGJlYW5OYW1lKQotICAgCXsKLQkgCi0JIC8vIGNoZWNrIGlmIHRoZSBiZWFuIHN0YXJ0cyB3aXRoIGEgbG93ZXIgY2FzZQotCSBpZiAoIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShiZWFuTmFtZS5jaGFyQXQoMCkpKQotICAgIAlhZGRNZXNzYWdlKCJXQVJOX0JFQU5fTkFNRV9TVEFSVFNfV0lUSF9MT1dFUl9DQVNFIiwgbmV3IFN0cmluZ1tde2JlYW5OYW1lfSk7ICAKLQotCQotICAgICAvL2NoZWNrIGlmIHRoZSBuYW1lIGhhcyBhbiB1bmRlcnNjb3JlLCB0aGVuIG5leHQgbGV0dGVyIHNob3VsZCBiZSB1cHBlciBjYXNlCi0gICAgIGludCB1bmRlclNjb3JlSW5kZXggPSBiZWFuTmFtZS5pbmRleE9mKFVOREVSU0NPUkUpOwotCSBTdHJpbmcgdGVtcE5hbWUgPSBiZWFuTmFtZTsKLQkgd2hpbGUodW5kZXJTY29yZUluZGV4ICE9LTEpIHsKLQkJdGVtcE5hbWUgPSB0ZW1wTmFtZS5zdWJzdHJpbmcodW5kZXJTY29yZUluZGV4KzEpOwotCQlpZiAoIENoYXJhY3Rlci5pc0xvd2VyQ2FzZSh0ZW1wTmFtZS5jaGFyQXQoMCkpKSB7Ci0gICAgICAJCWFkZE1lc3NhZ2UoIk1TR19XQVJOX01FVEhPRF9OQU1FX0lOVkFMSUQiLCBuZXcgU3RyaW5nW10geyBiZWFuTmFtZSB9KTsgIAotICAgICAgCQlicmVhazsKLQkJCX0KLQkJZWxzZQotCQkJdW5kZXJTY29yZUluZGV4ID0gdGVtcE5hbWUuaW5kZXhPZihVTkRFUlNDT1JFKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1BhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGJlYW5OYW1lKQotCQl7Ci0JCQlpZiAoIXBhY2thZ2VOYW1lLmVxdWFscyhwYWNrYWdlTmFtZS50b0xvd2VyQ2FzZSgpKSkKLQkJCQlhZGRNZXNzYWdlKCJNU0dfV0FSTl9QQUNLQUdFX05BTUVfSEFTX1VQUEVSX0NBU0UiLCBuZXcgU3RyaW5nW10geyBwYWNrYWdlTmFtZSwgYmVhbk5hbWUgfSk7Ci0JCX0KLSB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0RldGVjdE5vbkphdmFDaGFyc01ldGhvZFZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzTWV0aG9kVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWU2NjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzTWV0aG9kVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mUGFyYW1ldGVyVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uCi0qIFRoaXMgVmlzaXRvckFjdGlvbiB3aWxsIGNyZWF0ZSBhIEJlYW5FbGVtZW50IHVzaW5nIHRoZSAKLSogSmF2YUNsYXNzIGFuZCB0aGUgQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5Ci0qIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHdhbGsgdGhlIG1ldGhvZHMgaW4gdGhlIEphdmFDbGFzcwotKiAqLwotcHVibGljIGNsYXNzIERldGVjdE5vbkphdmFDaGFyc01ldGhvZFZpc2l0b3JBY3Rpb24gZXh0ZW5kcyBWaXNpdG9yQWN0aW9uSW1wbCAKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBVTkRFUlNDT1JFID0gJ18nOwotICBwcml2YXRlIGJvb2xlYW4gc2VydmljZUJlYW4gPSBmYWxzZTsKLQotICAgcHVibGljIERldGVjdE5vbkphdmFDaGFyc01ldGhvZFZpc2l0b3JBY3Rpb24gKCBWZWN0b3IgbWVzc2FnZXMsIFZlY3RvciBiZWFucykKLSAgCXsKLSAgCQlzdXBlciAobWVzc2FnZXMsIGJlYW5zKTsKLSAgCQlpZiAoIGJlYW5zLnNpemUoKSA9PSAxKQotICAJCQlzZXJ2aWNlQmVhbiA9IHRydWU7Ci0gIAl9Ci0KLSAgLyoqCi0gICogQ3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgbWV0aG9kIAotICAqIEBwYXJhbSBNZXRob2QgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBpbWV0aG9kKQotICB7Ci0gICAgCi0gICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpaW1ldGhvZDsKLSAgICBTdHJpbmcgIGNsYXNzTmFtZSA9IG1ldGhvZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCkuZ2V0TmFtZSgpOwotICAgIFN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLQotCWlmICggc2VydmljZUJlYW4gJiYgIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgKQotCQljaGVja1VwcGVyQ2FzZShuYW1lLCBjbGFzc05hbWUpOwotCQotCS8vIGZvciBzZXJ2aWNlIGJlYW4gb3IgYW55IHJlZmVyZW5jZWQgYmVhbiBwcm9wZXJ0eSBhY2Nlc3NvcnMKLQkgaWYgKCBzZXJ2aWNlQmVhbiB8fCBuYW1lLnN0YXJ0c1dpdGgoImdldCIpIHx8IG5hbWUuc3RhcnRzV2l0aCgic2V0IikgfHwgbmFtZS5zdGFydHNXaXRoKCJpcyIpKSAKLQkgewotCSAgICBjaGVja1VuZGVyU2NvcmUobmFtZSwgY2xhc3NOYW1lKTsKLQkgICAgY2hlY2tOdW1lcmljRGlnaXRzKG5hbWUsIGNsYXNzTmFtZSk7Ci0JICAgIGNoZWNrQm9vbGVhblByb3BlcnRpZXMobWV0aG9kLCBjbGFzc05hbWUpOwotCQkgIAkKLQkgCURldGVjdE5vbkphdmFDaGFyc1BhcmFtZXRlclZpc2l0b3JBY3Rpb24gcGFyYW1ldGVyVmlzaXRvckFjdGlvbiA9IG5ldyBEZXRlY3ROb25KYXZhQ2hhcnNQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uKGdldE1lc3NhZ2VzKCksIGdldEJlYW5zVmlzaXRlZCgpKTsKLQkgCS8vIHJzayBQYXNzaW5nIGluIG51bGwgZm9yIHRoZSBlbnZpcm9ubWVudC4gRGV0ZWN0Tm9uSmF2YUNoYXJzUGFyYW1ldGVyVmlzaXRvckFjdGlvbiBhbHdheXMgcmV0dXJucyBhbiBPSyBzdGF0dXMuCi0gICAgCUphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yIHBhcmFtZXRlclZpc2l0b3IgPSBuZXcgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IobnVsbCk7Ci0gICAgCXBhcmFtZXRlclZpc2l0b3IucnVuKG1ldGhvZCwgcGFyYW1ldGVyVmlzaXRvckFjdGlvbik7ICAgCi0JICB9Ci0JIAotCSByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JfQotCi0gIHByaXZhdGUgdm9pZCBjaGVja1VwcGVyQ2FzZShTdHJpbmcgbmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAJIC8vIGluIGEgc2VydmljZSBiZWFuIGNoZWNrIGlmIGFueSBtZXRob2Qgc3RhcnRzIHdpdGggdXBwZXIgY2FzZSBsZXR0ZXIKLQkgaWYgKCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UobmFtZS5jaGFyQXQoMCkpKQotICAgIAkJYWRkTWVzc2FnZSgiTVNHX1dBUk5fSkFWQV9NRVRIT0RfU1RBUlRfV0lUSF9VUFBFUl9DQVNFIiwgbmV3IFN0cmluZ1tde25hbWUsIGNsYXNzTmFtZX0pOyAgCi0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjaGVja1VuZGVyU2NvcmUoU3RyaW5nIG5hbWUsIFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICAgLy9jaGVjayBpZiB0aGUgbmFtZSBoYXMgYW4gdW5kZXJzY29yZSwgdGhlbiBuZXh0IGxldHRlciBzaG91bGQgYmUgdXBwZXIgY2FzZQotICAgICBpbnQgdW5kZXJTY29yZUluZGV4ID0gbmFtZS5pbmRleE9mKFVOREVSU0NPUkUpOwotCSBTdHJpbmcgdGVtcE5hbWUgPSBuYW1lOwotCSB3aGlsZSh1bmRlclNjb3JlSW5kZXggIT0tMSkgewotCQl0ZW1wTmFtZSA9IHRlbXBOYW1lLnN1YnN0cmluZyh1bmRlclNjb3JlSW5kZXgrMSk7Ci0JCWlmICggQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHRlbXBOYW1lLmNoYXJBdCgwKSkpIHsKLSAgICAJCWFkZE1lc3NhZ2UoIk1TR19XQVJOX01FVEhPRF9OQU1FX0lOVkFMSUQiLCBuZXcgU3RyaW5nW117bmFtZSwgY2xhc3NOYW1lfSk7ICAKLSAgICAgCQlicmVhazsKLQkJfQotCQllbHNlCi0JCQl1bmRlclNjb3JlSW5kZXggPSB0ZW1wTmFtZS5pbmRleE9mKFVOREVSU0NPUkUpOwotCSAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjaGVja051bWVyaWNEaWdpdHMoU3RyaW5nIG5hbWUsIFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICAgLy9jaGVjayBpZiB0aGUgbmFtZSBoYXMgYSBudW1lcmljLCB0aGVuIG5leHQgbGV0dGVyIHNob3VsZCBiZSB1cHBlciBjYXNlCi0gICAgIGZvciAoIGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykKLSAgICAgCXsKLSAgICAgCQlpZiAoIENoYXJhY3Rlci5pc0RpZ2l0KG5hbWUuY2hhckF0KGkpKSkKLSAgICAgCQkJewotICAgICAJCQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShuYW1lLmNoYXJBdChpKzEpKSkgewotCQkJICAgIAkJYWRkTWVzc2FnZSgiTVNHX1dBUk5fTUVUSE9EX05BTUVfSU5WQUxJRCIsIG5ldyBTdHJpbmdbXXtuYW1lLCBjbGFzc05hbWV9KTsgIAotCQkJICAgICAJCWJyZWFrOwotIAkJCQkJfQotCQl9Ci0gICAgIH0KLSAgfQotICBwcml2YXRlIHZvaWQgY2hlY2tCb29sZWFuUHJvcGVydGllcyhNZXRob2QgbWV0aG9kLCBTdHJpbmcgY2xhc3NOYW1lKQotICAJewotICAJCWlmICghc2VydmljZUJlYW4gJiYgbWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKCJnZXQiKSAmJiAKLSAgCQkJKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygiYm9vbGVhbiIpIHx8Ci0gIAkJCSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5Cb29sZWFuIikpKQotICAJCQlhZGRNZXNzYWdlKCJNU0dfV0FSTl9CT09MRUFOX1BST1BFUlRZX0FDQ0VTU09SUyIsIG5ldyBTdHJpbmdbXXttZXRob2QuZ2V0TmFtZSgpLCBjbGFzc05hbWV9KTsgIAotICAJfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0RldGVjdE5vbkphdmFDaGFyc1BhcmFtZXRlclZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzUGFyYW1ldGVyVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjFiZjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzUGFyYW1ldGVyVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5BcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZCZWFuVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQmVhbkVsZW1lbnQgdXNpbmcgdGhlIAotKiBKYXZhQ2xhc3MgYW5kIHRoZSBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkKLSogSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgd2FsayB0aGUgbWV0aG9kcyBpbiB0aGUgSmF2YUNsYXNzCi0qICovCi1wdWJsaWMgY2xhc3MgRGV0ZWN0Tm9uSmF2YUNoYXJzUGFyYW1ldGVyVmlzaXRvckFjdGlvbiBleHRlbmRzIFZpc2l0b3JBY3Rpb25JbXBsIAotewotCi0gIHB1YmxpYyBEZXRlY3ROb25KYXZhQ2hhcnNQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uICggVmVjdG9yIG1lc3NhZ2VzLCBWZWN0b3IgYmVhbnMpCi0gIAl7Ci0gIAkJc3VwZXIgKG1lc3NhZ2VzLCBiZWFucyk7Ci0gIAl9Ci0KLSAgLyoqCi0gICogQ3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgbWV0aG9kIAotICAqIEBwYXJhbSBNZXRob2QgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBpamF2YVBhcmFtZXRlcikKLSAgewotICAgIAotICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciA9IChKYXZhUGFyYW1ldGVyKSBpamF2YVBhcmFtZXRlcjsKLSAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gbnVsbDsKLSAgICBpZiAoIGphdmFQYXJhbWV0ZXIuZ2V0SmF2YVR5cGUoKSBpbnN0YW5jZW9mIEphdmFDbGFzcykgCi0gICAgCXsKLSAgICAJamF2YUNsYXNzID0gKEphdmFDbGFzcykgamF2YVBhcmFtZXRlci5nZXRKYXZhVHlwZSgpOwotICAgIAlpZiAoamF2YUNsYXNzLmlzQXJyYXkoKSkKLSAgICAJICB7Ci0gICAgCSAgICBKYXZhSGVscGVycyBjb21wb25lbnRUeXBlID0gKChBcnJheVR5cGUpamF2YUNsYXNzKS5nZXRDb21wb25lbnRUeXBlQXNIZWxwZXIoKTsKLSAgICAJICAgIGlmIChjb21wb25lbnRUeXBlIGluc3RhbmNlb2YgSmF2YUNsYXNzKQotICAgIAkgICAgICB7Ci0gICAgCSAgICAgICAgamF2YUNsYXNzID0gKEphdmFDbGFzcyljb21wb25lbnRUeXBlOwotICAgIAkgICAgICB9Ci0gICAgCSAgICBlbHNlCi0gICAgCSAgICAgIHsKLSAgICAJICAgICAgICBqYXZhQ2xhc3MgPSBudWxsOyAvL1RoZSBhcnJheSBjb250YWlucyBwcmltaXRpdmUgdHlwZXMsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGZ1cnRoZXIgY2hlY2tpbmcuCi0gICAgCSAgICAgIH0KLSAgICAJICB9Ci0gICAgCX0KLSAgIAlpZiAodG9CZVZpc2l0ZWQoamF2YUNsYXNzKSkgICAgewotCQkJRGV0ZWN0Tm9uSmF2YUNoYXJzQmVhblZpc2l0b3JBY3Rpb24gYmVhblZpc2l0b3JBY3Rpb24gPSBuZXcgRGV0ZWN0Tm9uSmF2YUNoYXJzQmVhblZpc2l0b3JBY3Rpb24oZ2V0TWVzc2FnZXMoKSwgZ2V0QmVhbnNWaXNpdGVkKCkpOwotCQkJSmF2YU1vZkJlYW5WaXNpdG9yIGJlYW5WaXNpdG9yID0gbmV3IEphdmFNb2ZCZWFuVmlzaXRvcigpOwotCQkJYmVhblZpc2l0b3IucnVuKGphdmFDbGFzcyxiZWFuVmlzaXRvckFjdGlvbik7Ci0gIAkgIAl9Ci0gICAJCi0gICAJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotCi0gIHByaXZhdGUgYm9vbGVhbiB0b0JlVmlzaXRlZCAoSmF2YUNsYXNzIGphdmFDbGFzcykKLSAgewotCS8vY2hlY2sgZm9yIHJlY29nbml6ZWQgdHlwZXMgCi0JaWYoIGphdmFDbGFzcyA9PSBudWxsCXx8Ci0JICAgamF2YUNsYXNzLmlzUHJpbWl0aXZlKCkgfHwKLQkgICBqYXZhQ2xhc3MuZ2V0SmF2YU5hbWUoKS5zdGFydHNXaXRoKCJqYXZheCIpIHx8Ci0gICAgICAgVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oamF2YUNsYXNzLmdldEphdmFOYW1lKCkpKQotCSAgICAJcmV0dXJuIGZhbHNlOwotCWVsc2UKLQkJICAJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2UzN2Q1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZUeXBlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5BdHRyaWJ1dGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1vbi5TYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uCi0qIFRoaXMgVmlzaXRvckFjdGlvbiB3aWxsIGNyZWF0ZSBhIEF0dHJpYnV0ZUVsZW1lbnQgdXNpbmcgdGhlCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIGEgY29tcGxleCB0eXBlCi0qICovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24gZXh0ZW5kcyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24KLXsKLQkKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotICAvKgotICAqQ29uc3RydWN0b3IKLSAgKiovCi0gIHB1YmxpYyBKYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbihFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBwcm9qZWN0LCBFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRFbGVtZW50LHByb2plY3QsIGVudik7Ci0JU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gIH0KLQotICAvKioKLSAgKiBDcmVhdGUgYSB0eXBlIGVsZW1lbnQgZnJvbSB0aGUgSmF2YUhlbHBlcgotICAqIEBwYXJhbSBKYXZhUGFyYW1ldGVyIHRoZSBtb2YgZWxlbWVudCB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRlCi0gICoqLwotCi0KLSAgLy9iZWFuIGluZm8gY29kZQotCi0KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IHByb3BlcnR5RGVjb3JhdG9yKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAkgIAkKLSAgICAvL1Byb3BlcnR5RGVjb3JhdG9yIHBkID0gKFByb3BlcnR5RGVjb3JhdG9yKXByb3BlcnR5RGVjb3JhdG9yOwotICAgIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvciBwZCA9IChTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IpcHJvcGVydHlEZWNvcmF0b3I7ICAKLSAgICAKLSAgICAKLSAgICB0cnl7Ci0gICAgICAgLy9pZiB0aGUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyB1bnN1cHBvcnRlZCBkb250IG1ha2UgYW4gQXR0cmlidXRlCi0gICAgICBpZighKGdldFJldHVyblBhcmFtKCkgJiYgVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZSgoSmF2YUhlbHBlcnMpcGQuZ2V0UHJvcGVydHlUeXBlKCkpKSAKLSAgICAgIAkmJiAoVHlwZUZhY3RvcnkuaXNVblN1cHBvcnRlZFR5cGUoKEphdmFIZWxwZXJzKXBkLmdldFByb3BlcnR5VHlwZSgpKSkpewotICAgICAgCSAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9UWVBFIikgKyAoKEphdmFIZWxwZXJzKXBkLmdldFByb3BlcnR5VHlwZSgpKS5nZXRKYXZhTmFtZSgpLCBTdGF0dXMuV0FSTklORyApOwotCSAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0JICAgICAgLy9XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfVFlQRSIpICsgKChKYXZhSGVscGVycylwZC5nZXRQcm9wZXJ0eVR5cGUoKSkuZ2V0SmF2YU5hbWUoKSxudWxsKSk7Ci0JICAgICAgcmV0dXJuIHN0YXR1czsKLQkgIH0JCi0KLSAgICAgIE1ldGhvZCBzZXRNZXRob2QgPSBwZC5nZXRXcml0ZU1ldGhvZCgpOwotICAgICAgTWV0aG9kIGdldE1ldGhvZCA9IHBkLmdldFJlYWRNZXRob2QoKTsKLSAgICAgIGlmKHNldE1ldGhvZCAhPSBudWxsKXsKLSAgICAgIAlpZihzZXRNZXRob2QuaXNTdGF0aWMoKSl7Ci0gICAgICAgICAgc2V0TWV0aG9kPW51bGw7IAotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIGlmKGdldE1ldGhvZCAhPSBudWxsKXsKLSAgICAgIAlpZihnZXRNZXRob2QuaXNTdGF0aWMoKSl7Ci0gICAgICAgICAgZ2V0TWV0aG9kPW51bGw7Ci0gICAgICAJfQotICAgICAgfQotICAgICAgaWYocGQuaXNmU3RhdGljKCkpewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgICAgCi0gICAgICBBdHRyaWJ1dGVFbGVtZW50IGF0dHJpYnV0ZUVsZW1lbnQgPSAoQXR0cmlidXRlRWxlbWVudClCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuZ2V0QmVhbk1vZGVsRWxlbWVudChwcm9wZXJ0eURlY29yYXRvcixmUGFyZW50RWxlbWVudCk7Ci0KLSAgICAgIGlmKGF0dHJpYnV0ZUVsZW1lbnQgIT0gbnVsbCl7Ci0gICAgICAgIAotICAgICAgICAvL2xldHMgY2hlY2sgYW5kIHNlZSBpZiB0aGUgZ2V0dGVyIHRha2VzIGlucHV0IHBhcmFtcwotICAgICAgICAvL2lmIHNvIHRocm93IGFuIGVycm9yCi0gICAgICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICAgICAgaWYoZ2V0TWV0aG9kICE9IG51bGwpewotCSAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcltdID0gZ2V0TWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCSAgICAgICAgaWYoamF2YVBhcmFtZXRlci5sZW5ndGggPiAwKXsKLQkgICAgICAgICAgaWYoZ2V0UmV0dXJuUGFyYW0oKSkgcmV0dXJuIHN0YXR1czsKLQkgICAgICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9JTkRFWEVEX1BST1BFUlRJRVMiKSArIGdldE1ldGhvZC5nZXROYW1lKCksIFN0YXR1cy5XQVJOSU5HICk7Ci0JICAgICAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyAobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0JICAgICAgICAgIC8vCQlXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfSU5ERVhFRF9QUk9QRVJUSUVTIiApICsgZ2V0TWV0aG9kLmdldE5hbWUoKSxudWxsKSk7Ci0JICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0JICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoc2V0TWV0aG9kICE9IG51bGwpIGF0dHJpYnV0ZUVsZW1lbnQuc2V0U2V0dGVyTWV0aG9kKHNldE1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOwotICAgICAgICBpZihnZXRNZXRob2QgIT0gbnVsbCkgYXR0cmlidXRlRWxlbWVudC5zZXRHZXR0ZXJNZXRob2QoZ2V0TWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0KLSAgICAgICAgSmF2YU1vZlR5cGVWaXNpdG9yQWN0aW9uIHR5cGVWaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZUeXBlVmlzaXRvckFjdGlvbihhdHRyaWJ1dGVFbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotICAgICAgICB0eXBlVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgICAgIHR5cGVWaXNpdG9yQWN0aW9uLnNldEJlYW5zQ3JlYXRlZChnZXRCZWFuc0NyZWF0ZWQoKSk7Ci0gICAgICAgIHR5cGVWaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOyAKLSAgICAgICAgSmF2YU1vZlR5cGVWaXNpdG9yIHR5cGVWaXNpdG9yID0gbmV3IEphdmFNb2ZUeXBlVmlzaXRvcihlbnZfKTsKLSAgICAgICAgdHlwZVZpc2l0b3Iuc2V0Q2xpZW50UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgICBzdGF0dXMgPSB0eXBlVmlzaXRvci5ydW4ocGQsdHlwZVZpc2l0b3JBY3Rpb24pOwotICAgICAgIAotICAgICAgfQotICAgIAotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgewotICAgIAllbnZfLmdldExvZygpLmxvZyhMb2cuV0FSTklORywgNTA1NCwgdGhpcywgInZpc2l0IiwgZSk7Ci0gICAgCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yQWN0aW9uIiwgLy8kTk9OLU5MUy0xJAotICAgIAkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSlRTX0pTUF9HRU4iKSwgU3RhdHVzLldBUk5JTkcsIGUpOwotICAgIAl0cnkgewotCQkJZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0JCX0gY2F0Y2ggKFN0YXR1c0V4Y2VwdGlvbiBlMSkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24iLCAvLyROT04tTkxTLTEkCi0JICAgIAkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSlRTX0pTUF9HRU4iKSwgU3RhdHVzLkVSUk9SKTsKLQkJfQotICAgIAlyZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAvL2Vudi5Mb2cud3JpdGUodGhpcywidmlzaXQiLExvZy5PSyxlKTt9Ci0KLSAgfQotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYjAxZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tYW5kLk51bGxTdGF0dXNNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tYW5kLlN0YXR1c01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mQXR0cmlidXRlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMuSmF2YU1vZkZpZWxkVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMuSmF2YU1vZk1ldGhvZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQmVhbkVsZW1lbnQgdXNpbmcgdGhlCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIHRoZSBtZXRob2RzIGluIHRoZSBKYXZhQ2xhc3MKLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24gaW1wbGVtZW50cyBWaXNpdG9yQWN0aW9uCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwcm90ZWN0ZWQgRW52aXJvbm1lbnQgZW52XzsKLSAvLyBwcm90ZWN0ZWQgQmVhbkVsZW1lbnQgZkJlYW5FbGVtZW50OwotCi0gIHByb3RlY3RlZCBWaXNpdG9yIGZWaXNpdG9yOwotCi0gIC8qCi0gICogVGhlIHByb2plY3QgdGhhdCBkZWZpbmVzIHRoZSBjb250ZXh0Ci0gICoqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0KLSAgLyoKLSAgKiBUaGUgU3RhdHVzIG1vbml0b3IKLSAgKiovCi0gIHByb3RlY3RlZCBTdGF0dXNNb25pdG9yIG1vbml0b3JfOwotCi0gIC8qCi0gICogVGhlIG1vZGVsIHRoYXQgd2lsbCBiZSBjcmVhdGVkCi0gICoqLwotICBwcm90ZWN0ZWQgTW9kZWwgZk1vZGVsOwotCi0gIC8qCi0gICogVGhpcyBpcyB0aGUgcGFyZW50IGVsZW1lbnQgdXNlZCB3aGVuIGNyZWF0aW5nIGEKLSAgKiBuZXcgZWxlbWVudAotICAqLwotICBwcm90ZWN0ZWQgRWxlbWVudCBmUGFyZW50RWxlbWVudDsKLQotICAvKgotICAqIE1ldGhvZHMgcHJvY2Vzc2VkIGZyb20gcHJveHkKLSAgKi8KLSAgcHJvdGVjdGVkIFZlY3RvciBmQmVhbnNDcmVhdGVkOwotCi0gIHByaXZhdGUgQm9vbGVhblNlbGVjdGlvbltdIGZNZXRob2RzU2VsZWN0ZWQ7Ci0KLSAgLyoKLSAgKiB0aGlzIGJvb2xlYW4gdGVsbHMgd2V0aGVyIHRoZSBiZWFuIGlzIGEgcmV0dXJuIHBhcmFtZXRlciBvciBhbiBpbnB1dCBwYXJhbWV0ZXIKLSAgKiB1c3VhbGx5IHRoaXMgc2hvdWxkIGJlIHNldCBhcm91bmQgdGhlIHBhcmFtZXRlcnZpc2l0b3JhY3Rpb24sIGFuZCBwYXNzZWQgb24gZnJvbSB0aGVyZQotICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBmUmV0dXJuUGFyYW09ZmFsc2U7Ci0KLSAgcHVibGljIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbihTdHJpbmcgY2xpZW50UHJvamVjdCxCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcywgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgICBmTWV0aG9kc1NlbGVjdGVkID0gbWV0aG9kczsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsgCi0JZW52XyA9IGVudjsKLSAgfQotCi0KLQotICAvKgotICAqQ29uc3RydWN0b3IKLSAgKiBAcGFyYW0gTW9kZWwgbW9kZWwgaXMgdGhlIE1vZGVsIHRoYXQgdGhpcyBiZWFuIHdpbGwgYmUgcGxhY2VkIGluCi0gICogQHBhcmFtIElQcm9qZWN0IHVzZWQgaW4gbmF0dXJlCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uKE1vZGVsIG1vZGVsLCBTdHJpbmcgY2xpZW50UHJvamVjdCwgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgICBmTW9kZWwgPSBtb2RlbDsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQllbnZfID0gZW52OwotICB9Ci0KLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICogQHBhcmFtIEVsZW1lbnQgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQgdGhpcyBlbGVtZW50IHdpbGwgYmUgYWRkZWQgdG9vCi0gICogQHBhcmFtIElQcm9qZWN0IHVzZWQgaW4gbmF0dXJlCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uKEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIGNsaWVudFByb2plY3QsIEVudmlyb25tZW50IGVudiApCi0gIHsKLSAgICBmUGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQ7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQllbnZfID0gZW52OwotICB9Ci0KLSAgLyoqCi0gICogVGhlIHZpc2l0IHdpbGwgY3JlYXRlIHRoZSBiZWFuCi0gICogV2FsayB0aGUgbWV0aG9kcwotICAqIEBwYXJhbSBKYXZhQ2xhc3MgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBiZWFuIG1vZGVsCi0gICoqLwotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3QgamF2YWNsYXNzKQotICB7Ci0gIAlDaG9pY2UgT0tDaG9pY2UgPSBuZXcgQ2hvaWNlKCdPJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX09LIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9PSyIpKTsKLSAgCUNob2ljZSBDYW5jZWxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdDJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX0NBTkNFTCIpLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiREVTQ1JJUFRJT05fQ0FOQ0VMIikpOwotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFjbGFzczsKLSAgICAKLSAgICAKLSAgICBCZWFuRWxlbWVudCBiZWFuRWxlbWVudCA9IChCZWFuRWxlbWVudClCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuZ2V0QmVhbk1vZGVsRWxlbWVudChqYXZhQ2xhc3MsZlBhcmVudEVsZW1lbnQsZk1vZGVsKTsKLSAgICBpZihiZWFuRWxlbWVudC5pc093bmVyUGFyYW1ldGVyKCkpIHsKLSAgICAgICAgcmVzZXRCZWFuc0NyZWF0ZWQoKTsKLSAgICB9Ci0gICAgZk1vZGVsID0gYmVhbkVsZW1lbnQuZ2V0TW9kZWwoKTsKLQotICAgIC8vdGhpcyBmb3IgdGhlIHN1YnNlcXVlbnQgYmVhbnMgdGhhdCByZXByZXNlbnQgdHlwZXMKLSAgICAvL2ZpcnN0IGRvIHRoZSBhdHRyaWJ1dGVzCi0gICAgLy9pZiB3ZSBhcmUgbm90IG9uIHRoZSByb290Ci0gICAgaWYgKCEoYmVhbkVsZW1lbnQgPT0gZk1vZGVsLmdldFJvb3RFbGVtZW50KCkpKXsKLSAgICAgICBFbnVtZXJhdGlvbiBlID0gZ2V0QmVhbnNDcmVhdGVkKCkuZWxlbWVudHMoKTsKLSAgICAgICB3aGlsZShlLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIGlmKG5hbWUuZXF1YWxzKGphdmFDbGFzcy5nZXROYW1lKCkpKXsKLSAgICAgICAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KVFNfQ1lDTElDX0JFQU4iKSwgU3RhdHVzLldBUk5JTkcpOwotICAgICAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgICAgICAgCQkJLy9XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfRVJST1JfSlRTX0NZQ0xJQ19CRUFOIiApLG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICAKLSAgICAgICBKYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbiBhdHRyaWJ1dGVWaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yQWN0aW9uKGJlYW5FbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotICAgICAgIC8vYXR0cmlidXRlVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgICAgVmVjdG9yIGNoaWxkVmVjdG9yID0gKChWZWN0b3IpZ2V0QmVhbnNDcmVhdGVkKCkuY2xvbmUoKSk7Ci0gICAgICAgY2hpbGRWZWN0b3IuYWRkRWxlbWVudChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsgIAotICAgICAgIGF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24uc2V0QmVhbnNDcmVhdGVkKGNoaWxkVmVjdG9yKTsKLSAgICAgICBhdHRyaWJ1dGVWaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOwotICAgICAgIEphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yIGF0dHJpYnV0ZVZpc2l0b3IgPSBuZXcgSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3IoKTsKLSAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnNldFJldHVyblBhcmFtZXRlcihnZXRSZXR1cm5QYXJhbSgpKTsKLSAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLSAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnNldEVudmlyb25tZW50KGVudl8pOwotICAgICAgIHN0YXR1cyA9IGF0dHJpYnV0ZVZpc2l0b3IucnVuKGphdmFDbGFzcyxhdHRyaWJ1dGVWaXNpdG9yQWN0aW9uKTsKLSAgICAgICAvLwotICAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgICAKLSAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgIHsKLSAgICAgICAgIENob2ljZSByZXN1bHQgPSBlbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhDYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0gICAgICAgICB7Ci0gICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAgCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAgICB9Ci0gICAgICAgICAJCi0gICAgICAgfQotICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICBKYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uIGZpZWxkVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uKGJlYW5FbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotICAgICAgIC8vZmllbGRWaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICAgICBWZWN0b3IgY2hpbGRWZWN0b3IyID0gKChWZWN0b3IpZ2V0QmVhbnNDcmVhdGVkKCkuY2xvbmUoKSk7Ci0gICAgICAgY2hpbGRWZWN0b3IyLmFkZEVsZW1lbnQoamF2YUNsYXNzLmdldE5hbWUoKSk7ICAKLSAgICAgICBmaWVsZFZpc2l0b3JBY3Rpb24uc2V0QmVhbnNDcmVhdGVkKGNoaWxkVmVjdG9yMik7Ci0gICAgICAgZmllbGRWaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOwotICAgICAgIEphdmFNb2ZGaWVsZFZpc2l0b3IgZmllbGRWaXNpdG9yID0gbmV3IEphdmFNb2ZGaWVsZFZpc2l0b3IoKTsKLSAgICAgICBmaWVsZFZpc2l0b3Iuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgIHN0YXR1cyA9IGZpZWxkVmlzaXRvci5ydW4oamF2YUNsYXNzLGZpZWxkVmlzaXRvckFjdGlvbik7Ci0gICAgICAgLy8KLSAgICAgICBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgICAKLSAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgIHsKLSAgICAgICAgIENob2ljZSByZXN1bHQgPSBlbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhDYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0gICAgICAgICB7Ci0gICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAgCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAgICB9Ci0gICAgICAgICAJCi0gICAgICAgfQotICAgICAgIC8vICAgICAgIAotICAgICAgIAotICAgfQotCi0gICAgLy90aGlzIGlzIHRvIGluc3VyZSB3ZSBhcmUgb24gdGhlIHByb3h5Ci0gICAgLy9ub3cgZG8gdGhlIG1ldGhvZHMKLSAgICBpZiAoYmVhbkVsZW1lbnQgPT0gZk1vZGVsLmdldFJvb3RFbGVtZW50KCkpewotICAgICAgLy9maXJzdCBsZXRzIG1ha2Ugc3VyZSB0aGUgcHJveHkgaXMgaW4gZ29vZCBmb3JtCi0gICAgICAvLy1pdCBoYXMgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICAvLy1pdCBoYXMgYXQgbGVhc3Qgb25lIG1ldGhvZAotICAgICAgLy9vdGhlcndpc2UgcmV0dXJuIHRoZSBwcm9ibGVtIGluIHRoZSBmb3JtIG9mIGEgc3RhdHVzCi0KLSAgICAgIGlmICghcHJveHlDaGVjayhqYXZhQ2xhc3MsIHN0YXR1cykpIHJldHVybiBzdGF0dXM7Ci0gICAgICBKYXZhTW9mTWV0aG9kVmlzaXRvckFjdGlvbiBtZXRob2RWaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZNZXRob2RWaXNpdG9yQWN0aW9uKGJlYW5FbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotICAgICAgCi0gICAgICAvL21ldGhvZFZpc2l0b3JBY3Rpb24uc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgICAgSmF2YU1vZk1ldGhvZFZpc2l0b3IgbWV0aG9kVmlzaXRvciA9IG5ldyBKYXZhTW9mTWV0aG9kVmlzaXRvcigpOwotICAgICAgbWV0aG9kVmlzaXRvci5zZXRNZXRob2RTZWxlY3Rpb24oZk1ldGhvZHNTZWxlY3RlZCk7Ci0gICAgICBzdGF0dXMgPSBtZXRob2RWaXNpdG9yLnJ1bihqYXZhQ2xhc3MsbWV0aG9kVmlzaXRvckFjdGlvbik7Ci0KLSAgICAgIC8vCi0gICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgCi0gICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgewotICAgICAgICBDaG9pY2UgcmVzdWx0ID0gZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgICAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhDYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0gICAgICAgIHsKLSAgICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgICAgCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAgIH0KLSAgICAgICAgCQotICAgICAgfQotICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvL1RoaXMgaXMgd2hlcmUgd2UgY2hlY2sgZm9yIHNldmVyYWwgdGhpbmdzOgotICAgICAgLy8taWYgbm8gbWV0aG9kcyB3ZXJlIHByb2Nlc3NlZCBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkIHR5cGVzIHRoZW4gd2Ugc2VuZCBiYWNrIHRoYXQgcmVzdWx0Ci0gICAgICAvLy1pZiB0aGVyZSB3ZXJlIGFueSBtZXRob2RzIG9taXR0ZWQgd2Ugc2hvdWxkIHdhcm4gdGhlbQotCi0gICAgICAvL2ZpcnN0IG5vIG1ldGhvZHMKLSAgICAgIGlmICghbWV0aG9kVmlzaXRvckFjdGlvbi53ZXJlTWV0aG9kc1Byb2Nlc3NlZCgpKXsKLSAgICAgICAgLy90aGlzIGhhcyB0byBiZSBkb25lIHRvIGluc3VyZSB0aGUgZGlhbG9nIGlzIGFuIGVycm9yCi0gICAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pUU19OT19QUk9YWV9NRVRIT0RTX1BST0NFU1NFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgCXJldHVybiBzdGF0dXM7Ci0gICAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgICAvLwkJV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoICIlTVNHX0VSUk9SX0pUU19OT19QUk9YWV9NRVRIT0RTX1BST0NFU1NFRCIgKSxudWxsKSk7Ci0gICAgICB9ICAgICAgICAJCi0gICAgICAvL25vdyBtZXRob2RzIG9taXR0ZWQKLSAgICAgIGVsc2UgaWYobWV0aG9kVmlzaXRvckFjdGlvbi53ZXJlTWV0aG9kc09taXR0ZWQoKSl7Ci0gICAgICAgIC8vVGhlIGRpYWxvZyBpcyBhbHJlYWR5IGEgd2FybmluZyBzbyB3ZSBqdXN0IG5lZWQgdG8gc2V0IHRoZSBvdmVyYWxsIG1lc3NhZ2UKLSAgICAgIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfV0FSTl9KVFNfUFJPWFlfTUVUSE9EU19PTUlUVEVEIiksIFN0YXR1cy5XQVJOSU5HKTsKLSAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgICAvLwkJV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoICIlTVNHX1dBUk5fSlRTX1BST1hZX01FVEhPRFNfT01JVFRFRCIgKSxudWxsKSk7Ci0gICAgICB9CQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgcmVzaWRlbnQpCi0gIHsKLSAgICAvL25vdGhpbmcgdG8gYmUgZG9uZSBidXQgbXVzdCBiZSBpbXBsZW1lbnRlZAotICB9Ci0KLQotICAvKgotICAqIFJldHVybiB0aGUgbW9kZWwgdGhhdCB3YXMgY3JlYXRlZAotICAqIEByZXR1cm4gTW9kZWwgdGhlIGJlYW4gbW9kZWwgdGhhdCB3YXMgY3JlYXRlZAotICAqLwotICBwdWJsaWMgTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgcmV0dXJuIGZNb2RlbDsKLSAgfQotCi0gIC8qCi0gICogVGhlIHByb3h5IGNoZWNrIGluc3VyZXMgdGhlcmUgaXMgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZAotICAqIGF0IExlYXN0IG9uZSBtZXRob2QKLSAgKiBAcGFyYW0gSmF2YUNsYXNzIGphdmFDbGFzcyBpcyB1c2VkIHRvIHRyYXZlcnNlIHRoZSBtZXRob2RzIG9uIHRoZSBwcm94eQotICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm94eUNoZWNrKEphdmFDbGFzcyBqYXZhQ2xhc3MsIFN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGEgbWV0aG9kCi0gICAgIEl0ZXJhdG9yIG09amF2YUNsYXNzLmdldFB1YmxpY01ldGhvZHMoKS5pdGVyYXRvcigpOwotICAgICBpZiAoIW0uaGFzTmV4dCgpKXsKLSAgICAgCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSlRTX1BST1hZX0hBU19OT19NRVRIT0RTIiksU3RhdHVzLkVSUk9SKTsKLSAgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLSAgICAgICAvLwkJCVdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCAiJU1TR19FUlJPUl9KVFNfUFJPWFlfSEFTX05PX01FVEhPRFMiICksbnVsbCkpOwotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgfQkKLSAgICAgLy9ub3cgY2hlY2sgZm9yIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICB3aGlsZSAobS5oYXNOZXh0KCkpIHsKLSAgICAgICBNZXRob2QgbWV0aG9kPShNZXRob2QpbS5uZXh0KCk7Ci0gICAgICAgaWYgKGphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKXsKLSAgICAgICAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0gICAgICAgICAgaWYgKGphdmFQYXJhbWV0ZXIubGVuZ3RoID4gMCl7Ci0gICAgICAgICAgICAgLy90aGVuIHdlIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAgIAkgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KVFNfUFJPWFlfSEFTX05PX0RFRkFVTFQiKSxTdGF0dXMuRVJST1IpOwotICAgICAgICAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgICAgICAgIAkJLy9XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfRVJST1JfSlRTX1BST1hZX0hBU19OT19ERUZBVUxUIiApLG51bGwpKTsKLSAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0KLSAgfQotCi0gLyoqCi0gICogU2V0cyB0aGUgc3RhdHVzIG1vbml0b3IgdGhhdCB0aGlzIGFjdGlvbiB3aWxsIHVzZSB0byByZXBvcnQgc3RhdHVzIHRoYXQgb2NjcmVzIHdoaWxlIGV4ZWN1dGluZyB0aGUgQWN0aW9uLgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdGF0dXNNb25pdG9yICggU3RhdHVzTW9uaXRvciBtb25pdG9yICkKLSAgewotCW1vbml0b3JfID0gbW9uaXRvcjsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHN0YXR1cyBtb25pdG9yIHRoYXQgdGhpcyB0YXNrIGlzIHVzaW5nIHRvIHJlcG9ydCBzdGF0dXMuCi0gICovCi0gIHB1YmxpYyBTdGF0dXNNb25pdG9yIGdldFN0YXR1c01vbml0b3IgKCkKLSAgewotICAgIGlmIChtb25pdG9yXyA9PSBudWxsKQotICAgIHsKLSAgICAgIG1vbml0b3JfID0gbmV3IE51bGxTdGF0dXNNb25pdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiBtb25pdG9yXzsKLSAgfQotCi0KLSAgIC8qKgotICAqIGNoZWNrIGlmIHRoZSBhY3Rpb24gaGFzIGZpbmlzaGVkIHN1Y3Nlc3NmdWxseSAKLSAgKi8KLSAgLyoKLSAgcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsICgpCi0gIHsKLSAgIAlyZXR1cm4gZ2V0U3RhdHVzTW9uaXRvcigpLmNhbkNvbnRpbnVlKCk7Ci0gIH0KLSAgKi8gCi0gIHB1YmxpYyB2b2lkIHJlc2V0QmVhbnNDcmVhdGVkKCkKLSAgewotICAgIGZCZWFuc0NyZWF0ZWQgPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCWVudl8gPSBlbnY7Ci0gIH0KLSAgCi0gIC8qCi0gICogVGhlIGNvbW1hbmQgdGhhdCBjYWxsZWQgdGhpcyB3aWxsIGdldCB0aGUgcmVzdWx0cyBvZiB0aGUgb3BlcmF0aW9uIGluIHRoZSBmb3JtCi0gICogb2YgYSBzdGF0dXMuCi0gICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0QmVhbnNDcmVhdGVkICgpCi0gIHsKLSAgICBpZihmQmVhbnNDcmVhdGVkID09IG51bGwpIGZCZWFuc0NyZWF0ZWQgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcmV0dXJuIGZCZWFuc0NyZWF0ZWQ7Ci0gIH0KLQotICAvKgotICAqIFRoZSBjb21tYW5kIHRoYXQgY2FsbGVkIHRoaXMgd2lsbCBnZXQgdGhlIHJlc3VsdHMgb2YgdGhlIG9wZXJhdGlvbiBpbiB0aGUgZm9ybQotICAqIG9mIGEgc3RhdHVzLgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRCZWFuc0NyZWF0ZWQgKFZlY3RvciBiZWFuc0NyZWF0ZWQpCi0gIHsKLSAgICBmQmVhbnNDcmVhdGVkID0gYmVhbnNDcmVhdGVkOwotICB9Ci0KLSAgIC8qCi0gICogVGhpcyBib29sZWFuIHRlbGxzIHdldGhlciB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmV0dXJuIHBhcmFtIAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRSZXR1cm5QYXJhbSAoKQotICB7Ci0gICAgcmV0dXJuIGZSZXR1cm5QYXJhbTsKLSAgfQotCi0gIC8qCi0gICogVGhpcyBib29sZWFuIHRlbGxzIHdldGhlciB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmV0dXJuIHBhcmFtIAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXR1cm5QYXJhbSAoYm9vbGVhbiByZXR1cm5wYXJhbSkKLSAgewotICAgIGZSZXR1cm5QYXJhbSA9IHJldHVybnBhcmFtOwotICB9Ci0KLSAgIC8qCi0gICogVGhpcyBib29sZWFuIHRlbGxzIHdldGhlciB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmV0dXJuIHBhcmFtIAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3QgKCkKLSAgewotICAgIHJldHVybiBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgLyoKLSAgKiBUaGlzIGJvb2xlYW4gdGVsbHMgd2V0aGVyIHdlIGFyZSBkZWFsaW5nIHdpdGggYSByZXR1cm4gcGFyYW0gCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QgKFN0cmluZyBjbGllbnRQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotCi0KLSAgLyoqCi0gICogc2V0cyB0aGUgdmlzaXRvciB0aGF0IGNhbGxzIHRoZSB2aXNpdAotICAqIEBwYXJhbWV0ZXIgVmlzaXRvcgotICAqLwotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2l0b3IoVmlzaXRvciB2aXNpdG9yKQotICB7Ci0gICAgICBmVmlzaXRvciA9IHZpc2l0b3I7Ci0gIH0KLQotICAvKgotICAqIFNldHMgdGhlIHBhcmVudCBlbGVtZW50IHRoZSBjaGlsZCB0aGVuIGtub3dzIHdoZXJlIHRvCi0gICogYWRkIGl0c2VsZiB0byB0aGUgbW9kZWwKLSAgKiBAcGFyYW0gRWxlbWVudCBwYXJlbnQgZWxlbWVudAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGZQYXJlbnRFbGVtZW50ID0gZWxlbWVudDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4ZDZmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZUeXBlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuTW9kZWxFbGVtZW50c0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuRmllbGRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uLgotKiBUaGlzIFZpc2l0b3JBY3Rpb24gd2lsbCBjcmVhdGUgYSBBdHRyaWJ1dGVFbGVtZW50IHVzaW5nIHRoZQotKiBKYXZhQ2xhc3MgYW5kIHRoZSBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkKLSogSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgd2FsayBhIGNvbXBsZXggdHlwZQotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24gZXh0ZW5kcyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24KLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0KLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZkZpZWxkVmlzaXRvckFjdGlvbihFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBwcm9qZWN0LCBFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRFbGVtZW50LHByb2plY3QsIGVudik7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gIH0KLQotICAvKioKLSAgKiBDcmVhdGUgYSB0eXBlIGVsZW1lbnQgZnJvbSB0aGUgSmF2YUhlbHBlcgotICAqIEBwYXJhbSBKYXZhUGFyYW1ldGVyIHRoZSBtb2YgZWxlbWVudCB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRlCi0gICoqLwotCi0KLSAgLy9iZWFuIGluZm8gY29kZQotCi0KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IGZpZWxkXykKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIEZpZWxkIGZpZWxkID0gKEZpZWxkKWZpZWxkXzsKLSAgICAgCi0gICAgdHJ5ewotICAgICAgIC8vaWYgdGhlIHR5cGUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgdW5zdXBwb3J0ZWQgZG9udCBtYWtlIGFuIEF0dHJpYnV0ZQotICAgICAgaWYoIShnZXRSZXR1cm5QYXJhbSgpICYmIFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUoKEphdmFIZWxwZXJzKWZpZWxkLmdldEphdmFDbGFzcygpKSkgCi0gICAgICAJJiYgKFR5cGVGYWN0b3J5LmlzVW5TdXBwb3J0ZWRUeXBlKChKYXZhSGVscGVycylmaWVsZC5nZXRKYXZhQ2xhc3MoKSkpKXsKLSAgICAgIAkgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfVFlQRSIpICsgKChKYXZhSGVscGVycylmaWVsZC5nZXRKYXZhQ2xhc3MoKSkuZ2V0SmF2YU5hbWUoKSwgU3RhdHVzLldBUk5JTkcgKTsKLQkgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotCSAgICAgIC8vV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoICIlTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1RZUEUiKSArICgoSmF2YUhlbHBlcnMpZmllbGQuZ2V0SmF2YUNsYXNzKCkpLmdldEphdmFOYW1lKCksbnVsbCkpOwotCSAgICAgIHJldHVybiBzdGF0dXM7Ci0JICB9CQotCi0KLSAgICAgIEZpZWxkRWxlbWVudCBmaWVsZEVsZW1lbnQgPSAoRmllbGRFbGVtZW50KUJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KGZpZWxkLGZQYXJlbnRFbGVtZW50KTsKLQotICAgICAgaWYoZmllbGRFbGVtZW50ICE9IG51bGwpewotICAgICAgICAvL2xldHMgY2hlY2sgYW5kIHNlZSBpZiB0aGUgZ2V0dGVyIHRha2VzIGlucHV0IHBhcmFtcwotICAgICAgICAvL2lmIHNvIHRocm93IGFuIGVycm9yCi0gICAgICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICAgICAgCi0gICAgICAgIEphdmFNb2ZUeXBlVmlzaXRvckFjdGlvbiB0eXBlVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24oZmllbGRFbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotICAgICAgICB0eXBlVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgICAgIHR5cGVWaXNpdG9yQWN0aW9uLnNldEJlYW5zQ3JlYXRlZChnZXRCZWFuc0NyZWF0ZWQoKSk7Ci0gICAgICAgIHR5cGVWaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOyAKLSAgICAgICAgSmF2YU1vZlR5cGVWaXNpdG9yIHR5cGVWaXNpdG9yID0gbmV3IEphdmFNb2ZUeXBlVmlzaXRvcihlbnZfKTsKLSAgICAgICAgdHlwZVZpc2l0b3Iuc2V0Q2xpZW50UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgICBzdGF0dXMgPSB0eXBlVmlzaXRvci5ydW4oZmllbGQsdHlwZVZpc2l0b3JBY3Rpb24pOwotICAgICAgIAotICAgICAgfQotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAKLSAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpCi0JewotICAgIAllbnZfLmdldExvZygpLmxvZyhMb2cuV0FSTklORywgNTA1NSwgdGhpcywgInZpc2l0IiwgZSk7Ci0gICAgCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkphdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24iLCAvLyROT04tTkxTLTEkCi0gICAgCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KVFNfSlNQX0dFTiIpLCBTdGF0dXMuV0FSTklORywgZSk7Ci0gICAgCXRyeSB7Ci0gICAgCQllbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzKTsKLSAgICAJfSBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIGUxKSB7Ci0gICAgCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCJKYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uIiwgLy8kTk9OLU5MUy0xJAotICAgIAkJCQltc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pUU19KU1BfR0VOIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLSAgfQotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mTWV0aG9kVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mTWV0aG9kVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTlmYWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZk1ldGhvZFZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uCi0qIFRoaXMgVmlzaXRvckFjdGlvbiB3aWxsIGNyZWF0ZSBhIEJlYW5FbGVtZW50IHVzaW5nIHRoZSAKLSogSmF2YUNsYXNzIGFuZCB0aGUgQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5Ci0qIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHdhbGsgdGhlIG1ldGhvZHMgaW4gdGhlIEphdmFDbGFzcwotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZNZXRob2RWaXNpdG9yQWN0aW9uIGV4dGVuZHMgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHVibGljIFN0cmluZyBmVW5zdXBwb3J0ZWRQYXJhbWV0ZXJOYW1lOwotCi0gLyoKLSAgKiBNZXRob2RzIG9taXR0ZWQgZnJvbSB0aGUgcHJveHkKLSAgKi8KLSAgcHJvdGVjdGVkIFZlY3RvciBmTWV0aG9kc09taXR0ZWQ7Ci0KLSAgLyoKLSAgKiBNZXRob2RzIHByb2Nlc3NlZCBmcm9tIHByb3h5Ci0gICovCi0gIHByb3RlY3RlZCBWZWN0b3IgZk1ldGhvZHNQcm9jZXNzZWQ7Ci0KLSAgICAgCi0gIC8qCi0gICpDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZNZXRob2RWaXNpdG9yQWN0aW9uKEVsZW1lbnQgcGFyZW50RWxlbWVudCxTdHJpbmcgcHJvamVjdCwgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgc3VwZXIocGFyZW50RWxlbWVudCxwcm9qZWN0LCBlbnYpOwotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIGZNZXRob2RzT21pdHRlZCA9IG5ldyBWZWN0b3IoKTsKLSAgICBmTWV0aG9kc1Byb2Nlc3NlZCA9IG5ldyBWZWN0b3IoKTsKLQotICB9Ci0gICAKLSAgLyoqCi0gICogQ3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgbWV0aG9kIAotICAqIEBwYXJhbSBNZXRob2QgdGhlIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBpbWV0aG9kKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpaW1ldGhvZDsKLSAgICAgICAgICAgCi0gICAgaWYgKG1ldGhvZENoZWNrKG1ldGhvZCkpewotICAgICAgLy90aGlzIGlzIHRvIGNoZWNrIGltbWVkaWF0ZSBpbnB1dCBhbmQgcmV0dXJuIHBhcmFtZXRlcnMKLSAgICAgIC8vaWYgdGhlcmUgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSBpbiB0aGVzZSB3ZSBjYW4gcmVhY3QgaW1tZWRpYXRlbHkKLSAgICAgIC8vd2UgYWRkIGl0IHRvIHRoZSBvbWl0dGVkIG1ldGhvZHMgYW4gZ28gdG8gdGhlIG5leHQgb25lCi0gICAgICBpZighcGFyYW1ldGVyQ2hlY2sobWV0aG9kKSl7Ci0gICAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9QQVJBTUVURVJTX0FSUkFZUyIpICsgZlVuc3VwcG9ydGVkUGFyYW1ldGVyTmFtZSwgU3RhdHVzLldBUk5JTkcgKTsKLSAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzIChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLSAgICAgICAgLy8JCVdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCAiJU1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9QQVJBTUVURVJTX0FSUkFZUyIgKSArIGZVbnN1cHBvcnRlZFBhcmFtZXRlck5hbWUsbnVsbCkpOwotICAgICAgICBmTWV0aG9kc09taXR0ZWQuYWRkRWxlbWVudChtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICAgIGlmKCFudWxsQ29uc3RydWN0b3IobWV0aG9kKSl7Ci0gICAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9QQVJBTUVURVJTX0lOUFVUUyIpICsgZlVuc3VwcG9ydGVkUGFyYW1ldGVyTmFtZSwgU3RhdHVzLldBUk5JTkcgKTsKLSAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzIChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLSAgICAgICAJLy8JV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoICIlTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1BBUkFNRVRFUlNfSU5QVVRTIiApICsgZlVuc3VwcG9ydGVkUGFyYW1ldGVyTmFtZSxudWxsKSk7Ci0gICAgICAgIGZNZXRob2RzT21pdHRlZC5hZGRFbGVtZW50KG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgCi0gICAgICB9Ci0KLSAgICAgIC8vY2Fycnkgb24gYWxsIHBhcmFtZXRlcnMgc3VwcG9ydGVkCi0gICAgICBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudClCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuZ2V0QmVhbk1vZGVsRWxlbWVudChtZXRob2QsZlBhcmVudEVsZW1lbnQpOwotICAgICAgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3JBY3Rpb24gcGFyYW1ldGVyVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mUGFyYW1ldGVyVmlzaXRvckFjdGlvbihtZXRob2RFbGVtZW50LGNsaWVudFByb2plY3QsZW52Xyk7Ci0gICAgICBwYXJhbWV0ZXJWaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICAgIEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yIHBhcmFtZXRlclZpc2l0b3IgPSBuZXcgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IoZW52Xyk7Ci0gICAgICBzdGF0dXMgPSBwYXJhbWV0ZXJWaXNpdG9yLnJ1bihtZXRob2QscGFyYW1ldGVyVmlzaXRvckFjdGlvbik7ICAgCi0gICAgICAvL3NvbWV0aGluZyBtYXkgaGF2ZSBnb25lIHdyb25nIHdpdGggYW4gaW50ZXJuYWwgdHlwZQotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spewotICAgICAgICAvL1RoaXMgbWV0aG9kIGhhcyB0byBiZSBvbWl0dGVkCi0gICAgICAgIGZNZXRob2RzT21pdHRlZC5hZGRFbGVtZW50KG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOwotICAgICAgICBtZXRob2RFbGVtZW50LnNldE1ldGhvZE9tbWlzc2lvbih0cnVlKTsgIAotICAgICAgfQkKLSAgICAgIGVsc2UgewotICAgICAgICBmTWV0aG9kc1Byb2Nlc3NlZC5hZGRFbGVtZW50KG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOwotICAgICAgfQkKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotIAotICAvKgotICAqIFRlbGxzIHdldGhlciBhbnkgbWV0aG9kcyB3ZXJlIHByb2Nlc3NlZCAKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBhbnkgbWV0aG9kcyB3ZXJlIHByb2Nlc3NlZCAKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gd2VyZU1ldGhvZHNQcm9jZXNzZWQoKQotICB7Ci0gICAgaWYoZk1ldGhvZHNQcm9jZXNzZWQuaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKgotICAqIFRlbGxzIHdldGhlciB0aGVyZSB3ZXJlIG1ldGhvZHMgb21pdHRlZCBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkIHR5cGVzCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgbWV0aG9kcyB3ZXJlIG9taXR0ZWQKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gd2VyZU1ldGhvZHNPbWl0dGVkKCkKLSAgewotICAgIGlmKGZNZXRob2RzT21pdHRlZC5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICogVGhlcmUgbWF5IGJlIG1ldGhvZHMgdGhhdCB3ZSBkb250IHN1cHBvcnQKLSAgKiBhbmQgZG9udCB3YW50IGluIHRoZSBtb2RlbAotICAqIEBwYXJhbSBib29sZWFuIHRydWUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIGZpbmUKLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIG1ldGhvZENoZWNrKE1ldGhvZCBtZXRob2QpCi0gIHsKLSAgICBib29sZWFuIG9rID0gdHJ1ZTsKLSAgICAvLyBpZiB3ZSBoYXZlIGEgY29uc3RydWN0b3Igd2UgcmV0dXJuIGZhbHNlCi0gICAgaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHJldHVybiBmYWxzZTsKLQotICAgICAgIAotICAgIHJldHVybiBvazsKLSAgfQotCi0gIC8qKgotICAqIFRoZXJlIG1heSBiZSBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kIHRoYXQgaGF2ZSB0eXBlcwotICAqIG5vdCB5ZXQgc3VwcG9ydGVkIHJldHVybiBmYWxzZSBpZiB3ZSBmaW5kIGFueQotICAqIEBwYXJhbSBib29sZWFuIHRydWUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIGZpbmUKLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIHBhcmFtZXRlckNoZWNrKE1ldGhvZCBtZXRob2QpCi0gIHsKLQotICAgIGJvb2xlYW4gb2sgPSB0cnVlOwotICAgIAotICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXJbXSA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsgCi0gICAgYm9vbGVhbiBwYXJhbVN1cHBvcnRlZCA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7aTxqYXZhUGFyYW1ldGVyLmxlbmd0aDtpKyspIHsKLSAgICAgIEphdmFQYXJhbWV0ZXIgcGFyYW09amF2YVBhcmFtZXRlcltpXTsKLSAgICAgIEphdmFIZWxwZXJzIGphdmFIZWxwZXIxID0gcGFyYW0uZ2V0SmF2YVR5cGUoKTsKLSAgICAgIGlmKFR5cGVGYWN0b3J5LmlzVW5TdXBwb3J0ZWRUeXBlKGphdmFIZWxwZXIxKSkgewotICAgICAgICBmVW5zdXBwb3J0ZWRQYXJhbWV0ZXJOYW1lID0gcGFyYW0uZ2V0TmFtZSgpOyAKLSAgICAJcmV0dXJuIGZhbHNlOwotICAgICAgfSAgICAKLSAgICB9Ci0gIHJldHVybiBvazsKLSAgfQotCi0gCi0gIC8qKgotICAqIFRoZXJlIG1heSBiZSBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kIHRoYXQgaGF2ZSB0eXBlcwotICAqIG5vdCB5ZXQgc3VwcG9ydGVkIHJldHVybiBmYWxzZSBpZiB3ZSBmaW5kIGFueQotICAqIEBwYXJhbSBib29sZWFuIHRydWUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIGZpbmUKLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIG51bGxDb25zdHJ1Y3RvcihNZXRob2QgbWV0aG9kKQotICB7Ci0gICAgCi0gICAgYm9vbGVhbiBvayA9IHRydWU7Ci0gICAgLy9ub3cgdGhlIGlucHV0cwotICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcltdID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOyAKLSAgICBib29sZWFuIHBhcmFtU3VwcG9ydGVkID0gdHJ1ZTsKLSAgICBmb3IgKGludCBpID0gMDtpPGphdmFQYXJhbWV0ZXIubGVuZ3RoO2krKykgewotICAgICAgSmF2YVBhcmFtZXRlciBwYXJhbT1qYXZhUGFyYW1ldGVyW2ldOwotICAgICAgSmF2YUhlbHBlcnMgamF2YUhlbHBlcjEgPSBwYXJhbS5nZXRKYXZhVHlwZSgpOwotICAgICAgaWYoamF2YUhlbHBlcjEgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpewotICAgICAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcylqYXZhSGVscGVyMTsKLSAgICAgICAgaWYoVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oamF2YUNsYXNzLmdldEphdmFOYW1lKCkpKXJldHVybiB0cnVlOwotICAgICAgICAgIEl0ZXJhdG9yIG09amF2YUNsYXNzLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChtLmhhc05leHQoKSkgewotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZDI9KE1ldGhvZCltLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChqYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2QyLmdldE5hbWUoKSkpewotICAgICAgICAgICAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgICAgICAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtW10gPSBtZXRob2QyLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotICAgICAgICAgICAgICBpZiAoamF2YVBhcmFtLmxlbmd0aCA+IDApewotICAgICAgICAgICAgICAgIC8vdGhlbiB3ZSBoYXZlIG5vIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgICAgICAgICAgICBmVW5zdXBwb3J0ZWRQYXJhbWV0ZXJOYW1lID0gcGFyYW0uZ2V0TmFtZSgpOyAKLSAgICAJICAgICAgICBvayA9IGZhbHNlOwotICAgICAgICAgICAgICB9ICAgIAotICAgICAgICAgICAgICBlbHNlIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgcmV0dXJuIG9rOwotICB9Ci0KLSAKLQotCi0KLQotCi0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyY2UwNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mUGFyYW1ldGVyVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlBhcmFtZXRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uCi0qIFRoaXMgVmlzaXRvckFjdGlvbiB3aWxsIGNyZWF0ZSBhIHBhcmFtZXRlckVsZW1lbnQgdXNpbmcgdGhlIAotKiBKYXZhQ2xhc3MgYW5kIHRoZSBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkKLSogSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgd2FsayB0byBpdHMgdHlwZQotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uIGV4dGVuZHMgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gICAgCi0gIC8qCi0gICpDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uKEVsZW1lbnQgcGFyZW50RWxlbWVudCxTdHJpbmcgcHJvamVjdCwgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgc3VwZXIocGFyZW50RWxlbWVudCxwcm9qZWN0LCBlbnYpOwotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAgICAKLSAgfQotICAgCi0gIC8qKgotICAqIENyZWF0ZSBhIHBhcmFtZXRlciBlbGVtZW50IGZyb20gdGhlIG1ldGhvZCAKLSAgKiBAcGFyYW0gSmF2YVBhcmFtZXRlciB0aGUgbW9mIGVsZW1lbnQgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIFBhcmFtZXRlcgotICAqKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IGlqYXZhUGFyYW1ldGVyKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAlDaG9pY2UgT0tDaG9pY2UgPSBuZXcgQ2hvaWNlKCdPJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX09LIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9PSyIpKTsKLSAgCUNob2ljZSBDYW5jZWxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdDJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX0NBTkNFTCIpLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiREVTQ1JJUFRJT05fQ0FOQ0VMIikpOwotICAJCi0gICAgUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gKFBhcmFtZXRlckVsZW1lbnQpQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmdldEJlYW5Nb2RlbEVsZW1lbnQoaWphdmFQYXJhbWV0ZXIsZlBhcmVudEVsZW1lbnQpOwotICAgIEphdmFNb2ZUeXBlVmlzaXRvckFjdGlvbiB0eXBlVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24ocGFyYW1ldGVyRWxlbWVudCxjbGllbnRQcm9qZWN0LCBlbnZfKTsKLSAgICAvL3R5cGVWaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICB0eXBlVmlzaXRvckFjdGlvbi5zZXRSZXR1cm5QYXJhbShwYXJhbWV0ZXJFbGVtZW50LmlzUmV0dXJuKCkpOwotICAgIEphdmFNb2ZUeXBlVmlzaXRvciB0eXBlVmlzaXRvciA9IG5ldyBKYXZhTW9mVHlwZVZpc2l0b3IoZW52Xyk7Ci0gICAgdHlwZVZpc2l0b3Iuc2V0Q2xpZW50UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgIHN0YXR1cyA9IHR5cGVWaXNpdG9yLnJ1bihpamF2YVBhcmFtZXRlcix0eXBlVmlzaXRvckFjdGlvbik7Ci0gICAgLy8KLSAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuRVJST1IpCi0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgCi0gICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuV0FSTklORykKLSAgICB7Ci0gICAgICBDaG9pY2UgcmVzdWx0ID0gZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgewotICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgIAkgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgfQotICAgICAgCQotICAgIH0KLSAgICAvLyAgICAgICAgICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZlR5cGVWaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZTQ5OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mQmVhblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uCi0qIFRoaXMgVmlzaXRvckFjdGlvbiB3aWxsIGNyZWF0ZSBhIFR5cGVFbGVtZW50IHVzaW5nIHRoZQotKiBKYXZhQ2xhc3MgYW5kIHRoZSBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkKLSogSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgd2FsayBhIGNvbXBsZXggdHlwZQotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZUeXBlVmlzaXRvckFjdGlvbiBleHRlbmRzIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZlR5cGVWaXNpdG9yQWN0aW9uKEVsZW1lbnQgcGFyZW50RWxlbWVudCxTdHJpbmcgcHJvamVjdCwgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgc3VwZXIocGFyZW50RWxlbWVudCxwcm9qZWN0LCBlbnYpOwotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAgICAKLSAgfQotCi0gIC8qKgotICAqIENyZWF0ZSBhIHR5cGUgZWxlbWVudCBmcm9tIHRoZSBKYXZhSGVscGVyCi0gICogQHBhcmFtIEphdmFIZWxwZXIgdGhlIG1vZiBlbGVtZW50IHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBUeXBlCi0gICoqLwotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3QgdHlwZU5hdmlnYXRvcikKLSAgewotICAJIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgIAkgQ2hvaWNlIE9LQ2hvaWNlID0gbmV3IENob2ljZSgnTycsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9PSyIpLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiREVTQ1JJUFRJT05fT0siKSk7Ci0gIAkgQ2hvaWNlIENhbmNlbENob2ljZSA9IG5ldyBDaG9pY2UoJ0MnLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfQ0FOQ0VMIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9DQU5DRUwiKSk7ICAJIAotCi0gICAgIC8vaWYgYmVhbgotCSBKYXZhQ2xhc3MgamF2YUNsYXNzID0gbnVsbDsKLQkgaWYodHlwZU5hdmlnYXRvciBpbnN0YW5jZW9mIEphdmFDbGFzcyl7Ci0JICAgIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpdHlwZU5hdmlnYXRvcjsKLQkgfQotCi0KLSAgICAgLyogSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHJldHVybiBwYXJhbWV0ZXIgdGhlbiB3ZSBuZWVkIHRvIHRyZWF0IHRoaXMgZGlmZmVyZW50bHkgdGhlbiBpZiBpdCBpcyBhbiBpbnB1dCAKLSAgICAgKiAgcGFyYW1ldGVyLgotICAgICAqICBXZSBuZWVkIHRvIGZpcnN0IHNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgcmV0dXJuIHR5cGVzIGlmIG5vdCB3ZSB0cmVhdCBpdCB0aGUgc2FtZSBhcyBldmVyeXRoaW5nCi0gICAgICogIGVsc2UuCi0gICAgICovCi0gICAgIGlmKGdldFJldHVyblBhcmFtKCkgJiYgVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZSgoSmF2YUhlbHBlcnMpdHlwZU5hdmlnYXRvcikpewotICAgICAgIFR5cGVFbGVtZW50IHR5cGVFbGVtZW50ID0gKFR5cGVFbGVtZW50KUJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KHR5cGVOYXZpZ2F0b3IsZlBhcmVudEVsZW1lbnQpOwotICAgICB9CQotICAgICBlbHNlewotCSAgICBpZihUeXBlRmFjdG9yeS5pc1VuU3VwcG9ydGVkVHlwZSgoSmF2YUhlbHBlcnMpdHlwZU5hdmlnYXRvcikpewotCSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfVFlQRSIpICsgKChKYXZhSGVscGVycyl0eXBlTmF2aWdhdG9yKS5nZXRKYXZhTmFtZSgpLCBTdGF0dXMuV0FSTklORyApOwkgICAgCQotCSAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0gICAgICAgICAgICAgIC8vV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoICIlTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1RZUEUiICkgKyAoKEphdmFIZWxwZXJzKXR5cGVOYXZpZ2F0b3IpLmdldEphdmFOYW1lKCksbnVsbCkpOwotCSAgICAgIHJldHVybiBzdGF0dXM7Ci0JICAgIH0JCi0JICAgIAotCSAgICAvL2lmIGphdmFjbGFzcyBpcyBudWxsIHRoZW4gd2UgaGF2ZSBhIHNpbXBsZSB0eXBlIAotCSAgICBpZigoamF2YUNsYXNzID09IG51bGwpIHx8IFR5cGVGYWN0b3J5LnJlY29nbml6ZWRCZWFuKGphdmFDbGFzcy5nZXRKYXZhTmFtZSgpKSl7Ci0JICAgICAgVHlwZUVsZW1lbnQgdHlwZUVsZW1lbnQgPSAoVHlwZUVsZW1lbnQpQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmdldEJlYW5Nb2RlbEVsZW1lbnQodHlwZU5hdmlnYXRvcixmUGFyZW50RWxlbWVudCk7Ci0JICAgIH0KLQkgICAgZWxzZXsKLQkgICAgICBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24gYmVhblZpc2l0b3JBY3Rpb24gPSBuZXcgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uKGZQYXJlbnRFbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotCSAgICAgIGJlYW5WaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLQkgICAgICBiZWFuVmlzaXRvckFjdGlvbi5zZXRCZWFuc0NyZWF0ZWQoZ2V0QmVhbnNDcmVhdGVkKCkpOwotICAgICAgICAgIGJlYW5WaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOwotCQkgIEphdmFNb2ZCZWFuVmlzaXRvciBiZWFuVmlzaXRvciA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3IoKTsKLQkgICAgICBzdGF0dXMgPSBiZWFuVmlzaXRvci5ydW4oamF2YUNsYXNzLGJlYW5WaXNpdG9yQWN0aW9uKTsKLQkgICAgfQotICAgICB9Ci0gICAgIAotICAgICAvLwotICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgCi0gICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgIHsKLSAgICAgICBDaG9pY2UgcmVzdWx0ID0gZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICB7Ci0gICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgICAJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TQU1QTEVfQ1JFQVRJT05fQ0FOQ0VMRUQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgICB9Ci0gICAgICAgCQotICAgICB9Ci0gICAgIC8vCi0gICAgIHJldHVybiBzdGF0dXM7Ci0gICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL1Zpc2l0b3JBY3Rpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL1Zpc2l0b3JBY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjQzZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9WaXNpdG9yQWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotCi0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBWaXNpdG9yQWN0aW9uLgotKiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgd2FsayB0aGUgbWV0aG9kcyBpbiB0aGUgSmF2YUNsYXNzCi0qICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlzaXRvckFjdGlvbkltcGwgaW1wbGVtZW50cyBWaXNpdG9yQWN0aW9uIAotewotCi0gIHByaXZhdGUgVmlzaXRvciBmVmlzaXRvciA9IG51bGw7Ci0gIHByaXZhdGUgVmVjdG9yIGJlYW5zVmlzaXRlZCA9IG51bGw7Ci0gIHByaXZhdGUgVmVjdG9yIG1lc3NhZ2VzID0gbnVsbDsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0gIHB1YmxpYyBWaXNpdG9yQWN0aW9uSW1wbCggVmVjdG9yIG1lc3NhZ2VzLCBWZWN0b3IgYmVhbnNWaXNpdGVkKQotICAJewotICAJIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlczsKLSAgCSB0aGlzLmJlYW5zVmlzaXRlZCA9IGJlYW5zVmlzaXRlZDsKLSAgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi5wbHVnaW4iLCB0aGlzICk7Ci0gIAl9Ci0gIAotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cmluZyByZXNpZGVudCkKLSAgewotICAgIC8vbm90aGluZyB0byBiZSBkb25lIGJ1dCBtdXN0IGJlIGltcGxlbWVudGVkCi0gIH0KLQotIC8qKgotICAqIFJldHVybnMgdGhlIHZlY3RvciBvZiBhbGwgbWVzc2FnZXMgZm91bmQKLSAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRNZXNzYWdlcyAoKQotICB7Ci0gIAlpZiAobWVzc2FnZXMgPT0gbnVsbCkgCi0gIAkJbWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcmV0dXJuIG1lc3NhZ2VzOwotICB9Ci0KLSAgcHVibGljIFZlY3RvciBnZXRCZWFuc1Zpc2l0ZWQoKQotICAJewotCQlpZiAoIGJlYW5zVmlzaXRlZCA9PSBudWxsKQotICAJCQliZWFuc1Zpc2l0ZWQgPSBuZXcgVmVjdG9yKCk7IAotICAgICAgICByZXR1cm4gYmVhbnNWaXNpdGVkOwotICAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFZpc2l0ZWRCZWFuKCBKYXZhQ2xhc3MgYmVhbikKLSAgCXsKLSAgCQlpZiAoIGJlYW5zVmlzaXRlZCA9PSBudWxsKQotICAJCQliZWFuc1Zpc2l0ZWQgPSBuZXcgVmVjdG9yKCk7Ci0gIAkJYmVhbnNWaXNpdGVkLmFkZChiZWFuKTsKLSAgCX0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0JlYW5WaXNpdGVkIChKYXZhQ2xhc3MgYmVhbikKLSAgCXsKLSAgCQlyZXR1cm4gKGJlYW5zVmlzaXRlZCAhPSBudWxsICYmIGJlYW5zVmlzaXRlZC5jb250YWlucyhiZWFuKSk7Ci0gIAl9Ci0KLSAgLyoqCi0gICogc2V0cyB0aGUgdmlzaXRvciB0aGF0IGNhbGxzIHRoZSB2aXNpdAotICAqIEBwYXJhbWV0ZXIgVmlzaXRvcgotICAqLwotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2l0b3IoVmlzaXRvciB2aXNpdG9yKQotICB7Ci0gICAgICBmVmlzaXRvciA9IHZpc2l0b3I7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRNZXNzYWdlICggU3RyaW5nIGtleSApCi0gIHsKLSAgICBnZXRNZXNzYWdlcygpLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZShrZXkpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZE1lc3NhZ2UgKCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzICkKLSAgewotICAgIGdldE1lc3NhZ2VzKCkuYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKGtleSxhcmdzKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWQ1ZjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuRmllbGRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbW9uLlNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mQXR0cmlidXRlVmlzaXRvciBpbXBsZW1lbnRzIFZpc2l0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwcml2YXRlIFN0cmluZyBjbGllbnRQcm9qZWN0OwotICBwcml2YXRlIGJvb2xlYW4gcmV0dXJuUGFyYW1ldGVyOwotICBwcml2YXRlIEVudmlyb25tZW50IGVudjsKLSAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCXRoaXMuZW52ID0gZW52OwotICB9Ci0gIAotICAvKgotICAqIFVzZSB0aGlzIHRvIHJlZmxlY3QgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgIC8qCi0gICogVXNlIHRoaXMgdG8gcmVmbGVjdCAKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmV0dXJuUGFyYW1ldGVyKGJvb2xlYW4gcmV0dXJuUGFyYW1ldGVyKQotICB7Ci0gICAgdGhpcy5yZXR1cm5QYXJhbWV0ZXIgPSByZXR1cm5QYXJhbWV0ZXI7Ci0gIH0KLSAKLSAgCi0gIC8qCi0gICogR2V0IHRoZSBhdHRyaWJ1dGUgYmVsb25naW5nIHRvIHRoaXMgY29tcGxleCB0eXBlIAotICAqIEBwYXJhbSBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgdGhhdCBvd25zIHRoZSB0eXBlCi0gICogQHBhcmFtIFZpc2l0b3JBY3Rpb24gQWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvbiBlYWNoIG1ldGhvZAotICAqKi8KLSAgcHVibGljIFN0YXR1cyBydW4gKCBPYmplY3QgamF2YWNsYXNzLCBWaXNpdG9yQWN0aW9uIHZBY3Rpb24pCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcylqYXZhY2xhc3M7ICAgICAKLQotICAgIEhhc2h0YWJsZSBzcGRNYXAgPSBuZXcgSGFzaHRhYmxlKCk7ICAKLSAgICBmb3IgKEl0ZXJhdG9yIG09amF2YUNsYXNzLmdldFB1YmxpY01ldGhvZHMoKS5pdGVyYXRvcigpOyBtLmhhc05leHQoKTsgKSB7Ci0gICAgICBNZXRob2QgbWV0aG9kPShNZXRob2QpbS5uZXh0KCk7Ci0gICAgICBpZiAoKChtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLnN0YXJ0c1dpdGgoImdldCIpIAotICAgICAgCXx8IG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3RhcnRzV2l0aCgiaXMiKSkgCi0gICAgICAgICYmIG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPT0gMCApCi0gICAgICAgIHx8IChtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLnN0YXJ0c1dpdGgoInNldCIpIAotICAgICAgICAmJiBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID4gMCkpIHsKLSAgICAgICAgaW50IHN1YiA9IDM7Ci0gICAgICAgIGlmKG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3RhcnRzV2l0aCgiaXMiKSkKLSAgICAgICAgICBzdWIgPSAyOwkKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3Vic3RyaW5nKHN1Yik7ICAgIAotICAgICAgICBTdHJpbmcgbG93ZXIgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsMSkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgU3RyaW5nIHJlbWFpbmRlciA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSk7IAotICAgICAgICBwcm9wZXJ0eU5hbWUgPSBsb3dlciArIHJlbWFpbmRlcjsKLSAgICAgICAgaW50IGluZGV4ID0gcHJvcGVydHlOYW1lLmxhc3RJbmRleE9mKCIoIik7Ci0gICAgICAgIFN0cmluZyB0ZW1wID0gcHJvcGVydHlOYW1lOwotICAgICAgICBwcm9wZXJ0eU5hbWUgPSB0ZW1wLnN1YnN0cmluZygwLGluZGV4KTsgCi0gICAgICAgIAotICAgICAgICAvL2ZpbmQgdGhlIHByb3BlcnR5ZGVzY3JpcHRvcgotICAgICAgICBTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3Igc3BkID0gKFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcilzcGRNYXAuZ2V0KHByb3BlcnR5TmFtZSk7IAotICAgICAgICBpZihzcGQgPT0gbnVsbCl7Ci0gICAgICAgICAgc3BkID0gbmV3IFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgIHNwZE1hcC5wdXQocHJvcGVydHlOYW1lLHNwZCk7IAotICAgICAgICB9Ci0gICAgICAgIGlmKG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3RhcnRzV2l0aCgic2V0IikpCi0gICAgICAgICAgc3BkLnNldFdyaXRlTWV0aG9kKG1ldGhvZCk7Ci0gICAgICAgIGVsc2UgCi0gICAgICAgICAgc3BkLnNldFJlYWRNZXRob2QobWV0aG9kKTsKLQotICAgICAgICBGaWVsZEltcGwgZmllbGQgPSAoRmllbGRJbXBsKWphdmFDbGFzcy5nZXRGaWVsZE5hbWVkKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIEphdmFIZWxwZXJzIHByb3BlcnR5VHlwZSA9IG51bGw7IAotICAgICAgICBpZihmaWVsZCAhPSBudWxsKXsKLSAgICAgICAgICBwcm9wZXJ0eVR5cGUgPSBmaWVsZC5nZXRKYXZhVHlwZSgpOwotICAgICAgICAgIHNwZC5zZXRmU3RhdGljKGZpZWxkLmlzU3RhdGljKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgaWYobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKS5zdGFydHNXaXRoKCJnZXQiKSB8fCBtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLnN0YXJ0c1dpdGgoImlzIikpCi0gICAgICAgICAgCXByb3BlcnR5VHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICBKYXZhUGFyYW1ldGVyIHBhcmFtc1tdID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOyAKLSAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUgPSBwYXJhbXNbMF0uZ2V0SmF2YVR5cGUoKTsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfQotICAgICAgICAgIAkKLSAgICAgICAgc3BkLnNldFByb3BlcnR5VHlwZShwcm9wZXJ0eVR5cGUpOyAKLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIEVudW1lcmF0aW9uIHNwZEVudW0gPSBzcGRNYXAuZWxlbWVudHMoKTsKLSAgICB3aGlsZShzcGRFbnVtLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvciBzcGQgPSAoU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKXNwZEVudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmKHNwZENoZWNrKHNwZCkpCi0gICAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQoc3BkKTsgICAKLSAgICB9IAotICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gc3BkQ2hlY2soU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yIHNwZCkKLSAgeyAgCi0gICAgLy9jaGVjayBmb3IgaW5kZXhlZCBwcm9wZXJ0aWVzCi0gIAlNZXRob2Qgd3JpdGVNZXRob2QgPSBzcGQuZ2V0V3JpdGVNZXRob2QoKTsKLSAgCWlmKHdyaXRlTWV0aG9kICE9IG51bGwpCi0gIAkgIGlmKHdyaXRlTWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA+IDEpIHJldHVybiBmYWxzZTsKLSAgCQotICAJaWYoc3BkLmdldFByb3BlcnR5VHlwZSgpID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBpZihzcGQuZ2V0UHJvcGVydHlUeXBlKCkuaXNQcmltaXRpdmUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYocmV0dXJuUGFyYW1ldGVyICYmIFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUoc3BkLmdldFByb3BlcnR5VHlwZSgpKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYoIXJldHVyblBhcmFtZXRlciAmJiBUeXBlRmFjdG9yeS5pc1VuU3VwcG9ydGVkVHlwZShzcGQuZ2V0UHJvcGVydHlUeXBlKCkpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZighY2hlY2tQb2xhcml0eShzcGQpKSByZXR1cm4gZmFsc2U7ICAgCi0gICAgICAgCi0gICAgLy8gc28gaXRzIGEgYmVhbiBtYWtlIHN1cmUgaXQgaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciAgICAgICAKLSAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YU1vZlJlZiA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsKLSAgICBqYXZhTW9mUmVmLnNldENsaWVudFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLSAgICBqYXZhTW9mUmVmLnNldFByb3h5QmVhbigoKEphdmFIZWxwZXJzKXNwZC5nZXRQcm9wZXJ0eVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICBqYXZhTW9mUmVmLmV4ZWN1dGUoZW52KTsKLSAgICBpZihqYXZhTW9mUmVmLmdldEphdmFDbGFzcygpIGluc3RhbmNlb2YgSmF2YUNsYXNzKXsKLSAgICAgICBpZihUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihqYXZhTW9mUmVmLmdldEphdmFDbGFzcygpLmdldEphdmFOYW1lKCkpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICByZXR1cm4gZGVmYXVsdENoZWNrKChKYXZhQ2xhc3MpamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIAotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tQb2xhcml0eShTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3Igc3BkKXsKLSAgICAKLSAgCU1ldGhvZCByZWFkTWV0aG9kID0gc3BkLmdldFJlYWRNZXRob2QoKTsKLSAgCU1ldGhvZCB3cml0ZU1ldGhvZCA9IHNwZC5nZXRXcml0ZU1ldGhvZCgpOwotICAJaWYoKHJlYWRNZXRob2QgPT0gbnVsbCAmJiB3cml0ZU1ldGhvZCAhPSBudWxsKSB8fCAocmVhZE1ldGhvZCAhPSBudWxsICYmIHdyaXRlTWV0aG9kID09IG51bGwpKQotICAJICByZXR1cm4gdHJ1ZTsJCi0gIAlpZihyZWFkTWV0aG9kID09IG51bGwgJiYgd3JpdGVNZXRob2QgPT0gbnVsbCkKLSAgCSAgcmV0dXJuIGZhbHNlOwkKLSAgCSAgCQotICAJSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSB3cml0ZU1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLSAgICBmb3IoaW50IGkgPSAwO2k8IGphdmFQYXJhbWV0ZXIubGVuZ3RoO2krKyl7Ci0gICAgICBKYXZhUGFyYW1ldGVyIGpwID0gamF2YVBhcmFtZXRlcltpXTsgCQotICAgICAgU3RyaW5nIG5hbWUxID0ganAuZ2V0SmF2YVR5cGUoKS5nZXRKYXZhTmFtZSgpOwotICAgICAgU3RyaW5nIG5hbWUgPSByZWFkTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRKYXZhTmFtZSgpOwotICAgICAgaWYoanAuZ2V0SmF2YVR5cGUoKS5nZXRKYXZhTmFtZSgpLmVxdWFscyhyZWFkTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRKYXZhTmFtZSgpKSkKLSAgICAgICAgcmV0dXJuIHRydWU7IAotICAgIH0KLSAgCXJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRDaGVjayhKYXZhQ2xhc3MgamF2YUNsYXNzKXsKLSAgICAKLSAgICAgICBJdGVyYXRvciBtPWphdmFDbGFzcy5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgLy9ub3cgY2hlY2sgZm9yIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICBib29sZWFuIGRlZmF1bHRDb25zdCA9IHRydWU7Ci0gICAgICAgIHdoaWxlIChtLmhhc05leHQoKSkgewotICAgICAgICAgIE1ldGhvZCBtZXRob2Q9KE1ldGhvZCltLm5leHQoKTsKLSAgICAgICAgICBpZiAoamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpewotICAgICAgICAgICAgICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICAgICAgICAgICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXJbXSA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLSAgICAgICAgICAgICAgICBpZiAoamF2YVBhcmFtZXRlci5sZW5ndGggPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAvL3RoZW4gd2UgaGF2ZSBubyBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnN0ID0gZmFsc2U7IAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKGphdmFQYXJhbWV0ZXIubGVuZ3RoID09IDApewotICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRKYXZhVmlzaWJpbGl0eSgpLmdldFZhbHVlKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgCi0gICAgICAgcmV0dXJuIGRlZmF1bHRDb25zdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIHBvbGFyaXR5Q2hlY2soSmF2YUNsYXNzIGphdmFDbGFzcyl7Ci0gICAgCi0gICAgICAgSXRlcmF0b3IgbT1qYXZhQ2xhc3MuZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIC8vbm93IGNoZWNrIGZvciBhIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgICAgYm9vbGVhbiBkZWZhdWx0Q29uc3QgPSB0cnVlOwotICAgICAgICB3aGlsZSAobS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICBNZXRob2QgbWV0aG9kPShNZXRob2QpbS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgICAgICAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGphdmFQYXJhbWV0ZXIubGVuZ3RoID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgLy90aGVuIHdlIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb25zdCA9IGZhbHNlOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihqYXZhUGFyYW1ldGVyLmxlbmd0aCA9PSAwKXsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgIAotICAgICAgIHJldHVybiBkZWZhdWx0Q29uc3Q7Ci0gIH0KLSAgICAgICAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mQmVhblZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZkJlYW5WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMzhhMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mQmVhblZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mQmVhblZpc2l0b3IgaW1wbGVtZW50cyBWaXNpdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZkJlYW5WaXNpdG9yKCkKLSAgewotICB9Ci0gCi0gIHB1YmxpYyBTdGF0dXMgcnVuICggT2JqZWN0IGphdmFDbGFzcywgVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gICAgcmV0dXJuIHZBY3Rpb24udmlzaXQoKEphdmFDbGFzcylqYXZhQ2xhc3MpOyAgIAotICB9Ci0gICAgICAgIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZkZpZWxkVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mRmllbGRWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYTM5NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mRmllbGRWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5GaWVsZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mRmllbGRWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0KLSAgLyoKLSAgKiBDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZGaWVsZFZpc2l0b3IoKQotICB7Ci0gIH0KLQotICAvKgotICAqIFVzZSB0aGlzIHRvIHJlZmxlY3QgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgIC8qCi0gICogVXNlIHRoaXMgdG8gcmVmbGVjdCAKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgLyoKLSAgKiBHZXQgdGhlIGF0dHJpYnV0ZSBiZWxvbmdpbmcgdG8gdGhpcyBjb21wbGV4IHR5cGUgCi0gICogQHBhcmFtIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciB0aGF0IG93bnMgdGhlIHR5cGUKLSAgKiBAcGFyYW0gVmlzaXRvckFjdGlvbiBBY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIGVhY2ggbWV0aG9kCi0gICoqLwotICBwdWJsaWMgU3RhdHVzIHJ1biAoIE9iamVjdCBqYXZhY2xhc3MsIFZpc2l0b3JBY3Rpb24gdkFjdGlvbikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFjbGFzczsgICAgIAotCi0gICAgYm9vbGVhbiBob2xkZXJDbGFzcyA9IGZhbHNlOwotICAgIEVMaXN0IGltcGxlbWVudGVkID0gamF2YUNsYXNzLmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBsZW1lbnRlZC5zaXplKCk7IGkrKykgewotCSAgSmF2YUNsYXNzIGFuSW50ZXJmYWNlID0gKEphdmFDbGFzcykgaW1wbGVtZW50ZWQuZ2V0KGkpOwotCSAgaWYgKGFuSW50ZXJmYWNlLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoImphdmF4LnhtbC5ycGMuaG9sZGVycy5Ib2xkZXIiKSkKLQkgICAgaG9sZGVyQ2xhc3MgPSB0cnVlOwotCX0gICAgICAKLQotICAgICAvL2JlYW5pbmZvIGNvZGUKLSAgICBpZihob2xkZXJDbGFzcyl7ICAgICAKLSAgICAgIEVMaXN0IGUgID0gamF2YUNsYXNzLmdldEZpZWxkcygpOwotICAgICAgTGlzdEl0ZXJhdG9yIGxpc3QgPSBlLmxpc3RJdGVyYXRvcigpOwotICAgICAgd2hpbGUobGlzdC5oYXNOZXh0KCkpewotICAgICAgICBGaWVsZCBmaWVsZCA9IChGaWVsZClsaXN0Lm5leHQoKTsgICAgIAotICAgICAgICBpZihmaWVsZC5nZXRKYXZhVmlzaWJpbGl0eSgpLmdldFZhbHVlKCkgPT0gSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQyAmJiAhZmllbGQuaXNGaW5hbCgpICYmICFmaWVsZC5pc1N0YXRpYygpKXsKLSAgICAgICAgICBpZihmaWVsZENoZWNrKChGaWVsZEltcGwpZmllbGQpKQotICAgICAgICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChmaWVsZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfSAgICAgICAKLSAgcHJpdmF0ZSBib29sZWFuIGZpZWxkQ2hlY2soRmllbGRJbXBsIGZpZWxkKQotICB7Ci0gICAgLy8gc28gaXRzIGEgYmVhbiBtYWtlIHN1cmUgaXQgaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciAKLSAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YU1vZlJlZiA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsKLSAgICBqYXZhTW9mUmVmLnNldFByb3h5QmVhbihmaWVsZC5nZXRKYXZhVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgamF2YU1vZlJlZi5zZXRDbGllbnRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0gICAgamF2YU1vZlJlZi5leGVjdXRlKG51bGwpOwotICAgIGlmKGphdmFNb2ZSZWYuZ2V0SmF2YUNsYXNzKCkgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpewotICAgICAgaWYoVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKS5nZXRKYXZhTmFtZSgpKSkgcmV0dXJuIHRydWU7Ci0gICAgICByZXR1cm4gZGVmYXVsdENoZWNrKChKYXZhQ2xhc3MpamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gICAgICAgIAotIHByaXZhdGUgYm9vbGVhbiBkZWZhdWx0Q2hlY2soSmF2YUNsYXNzIGphdmFDbGFzcyl7Ci0gICAgCi0gICBJdGVyYXRvciBtPWphdmFDbGFzcy5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKTsKLSAgIC8vbm93IGNoZWNrIGZvciBhIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgIGJvb2xlYW4gZGVmYXVsdENvbnN0ID0gdHJ1ZTsKLSAgIHdoaWxlIChtLmhhc05leHQoKSkgewotICAgIE1ldGhvZCBtZXRob2Q9KE1ldGhvZCltLm5leHQoKTsKLSAgICBpZiAoamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpewotICAgICAgLy9ub3cgdGhlIGlucHV0cwotICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0gICAgICBpZiAoamF2YVBhcmFtZXRlci5sZW5ndGggPiAwKXsKLSAgICAgICAgLy90aGVuIHdlIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICBkZWZhdWx0Q29uc3QgPSBmYWxzZTsgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmKGphdmFQYXJhbWV0ZXIubGVuZ3RoID09IDApewotICAgICAgICBpZiAobWV0aG9kLmdldEphdmFWaXNpYmlsaXR5KCkuZ2V0VmFsdWUoKSA9PSAwKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBlbHNlIGlmKG1ldGhvZC5nZXRKYXZhVmlzaWJpbGl0eSgpLmdldFZhbHVlKCkgPT0gMSkgCi0gICAgICAgICAgZGVmYXVsdENvbnN0ID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgCi0gIHJldHVybiBkZWZhdWx0Q29uc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZk1ldGhvZFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZk1ldGhvZFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiMmQ5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZNZXRob2RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mTWV0aG9kVmlzaXRvciBpbXBsZW1lbnRzIFZpc2l0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHB1YmxpYyBTdHJpbmcgU0VUX0VORFBPSU5UID0gInNldEVuZFBvaW50IjsKLSAgcHVibGljIFN0cmluZyBHRVRfRU5EUE9JTlQgPSAiZ2V0RW5kUG9pbnQiOwotICBwcml2YXRlIEJvb2xlYW5TZWxlY3Rpb25bXSBmTWV0aG9kc1NlbGVjdGVkOwotCi0KLSAgLyoKLSAgKiBDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZNZXRob2RWaXNpdG9yKCkKLSAgewotICB9Ci0gCi0gIHB1YmxpYyBTdHJpbmcgVU5ERVJfU0NPUkUgPSAiXyI7Ci0KLSAgLyoKLSAgKiBSdW4gdGhyb3VnaCBhbGwgdGhlIG1ldGhvZHMgaW4gdGhpcyBiZWFuCi0gICogQHBhcmFtIEphdmFDbGFzcyBqYXZhY2xhc3MgdGhhdCBob2xkcyB0aGUgbWV0aG9kcwotICAqIEBwYXJhbSBWaXNpdG9yQWN0aW9uIEFjdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZWFjaCBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgcnVuICggT2JqZWN0IGphdmFjbGFzcywgVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpamF2YWNsYXNzOwotICAgIGZvciAoSXRlcmF0b3IgbT1qYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7IG0uaGFzTmV4dCgpOyApIHsKLSAgICAgIE1ldGhvZCBtZXRob2Q9KE1ldGhvZCltLm5leHQoKTsKLSAgICAgIGlmKGZNZXRob2RzU2VsZWN0ZWQgIT0gbnVsbCkgIHsKLSAgICAgICAgYm9vbGVhbiBtZXRob2RTZWxlY3RlZCA9IGZhbHNlOwotICAgICAgCWZvcihpbnQgaSA9MDtpIDwgZk1ldGhvZHNTZWxlY3RlZC5sZW5ndGg7aSsrKXsKLSAgICAgICAgICBpZihmTWV0aG9kc1NlbGVjdGVkW2ldID09IG51bGwpIGNvbnRpbnVlOwotICAgICAgICAgIGlmICggZk1ldGhvZHNTZWxlY3RlZFtpXS5nZXRWYWx1ZSgpLmVxdWFscyhtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKSkKLSAgICAgICAgICAgIG1ldGhvZFNlbGVjdGVkID0gKGJvb2xlYW4pIGZNZXRob2RzU2VsZWN0ZWRbaV0uaXNTZWxlY3RlZCgpOwotICAgICAgICB9CQkgICAgICAgIAkKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICBpZihtZXRob2RTZWxlY3RlZCkKLSAgICAgICAgICBzdGF0dXMgPSB2QWN0aW9uLnZpc2l0KG1ldGhvZCk7ICAKLSAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChtZXRob2QpOyAgIAotICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNZXRob2RTZWxlY3Rpb24oQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZFNlbGVjdGVkKQotICB7Ci0gICAgZk1ldGhvZHNTZWxlY3RlZCA9IG1ldGhvZFNlbGVjdGVkOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mUGFyYW1ldGVyVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mUGFyYW1ldGVyVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmU5OTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwcml2YXRlIEVudmlyb25tZW50IGVudl87Ci0KLSAgLyoKLSAgKiBDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yKEVudmlyb25tZW50IGVudikKLSAgewotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAgCQotICAJZW52XyA9IGVudjsKLSAgfQotICAKLSAgLyoKLSAgKiBSdW4gdGhyb3VnaCBhbGwgdGhlIHBhcmFtZXRlcnMgaW4gdGhpcyBtZXRob2QKLSAgKiBAcGFyYW0gSmF2YUNsYXNzIGphdmFjbGFzcyB0aGF0IGhvbGRzIHRoZSBwYXJhbWV0ZXJzCi0gICogQHBhcmFtIFZpc2l0b3JBY3Rpb24gQWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvbiBlYWNoIG1ldGhvZAotICAqKi8KLSAgcHVibGljIFN0YXR1cyBydW4gKCBPYmplY3QgaW1ldGhvZCwgVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAlDaG9pY2UgT0tDaG9pY2UgPSBuZXcgQ2hvaWNlKCdPJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX09LIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9PSyIpKTsKLSAgCUNob2ljZSBDYW5jZWxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdDJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX0NBTkNFTCIpLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiREVTQ1JJUFRJT05fQ0FOQ0VMIikpOyAgCQotICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKWltZXRob2Q7Ci0gICAKLSAgICBKYXZhSGVscGVycyBqYXZhUmV0dXJuUGFyYW1ldGVyID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAvL3BnbSBUaGlzIHZpc2l0b3IgdXNlZCB0byB0YWtlIGEgSmF2YVBhcmFtZXRlciB0eXBlIGFuZCBub3cgaXQgaXMgYmVpbmcgY2FsbGVkCi0gICAgLy8gICAgd2l0aCBhIEphdmFIZWxwZXJzIHR5cGUuICBHaWwsIHBsZWFzZSBlbnN1cmUgdGhhdCB0aGlzIGlzIE9rLgotICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQoamF2YVJldHVyblBhcmFtZXRlcik7Ci0gICAgLy8KLSAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuRVJST1IpCi0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgCi0gICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuV0FSTklORykKLSAgICB7Ci0gICAgICBDaG9pY2UgcmVzdWx0ID0gZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgewotICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgIAkgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgfQotICAgICAgCQotICAgIH0KLSAgICAvLyAgICAgICAgICAgCi0KLSAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgTGlzdCBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsgCi0gICAgCi0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBhcmFtZXRlcnMuc2l6ZSgpOyBpbmRleCsrKSAKLSAgICB7Ci0gICAgICBKYXZhUGFyYW1ldGVyIHBhcmFtPShKYXZhUGFyYW1ldGVyKXBhcmFtZXRlcnMuZ2V0KGluZGV4KTsKLSAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQocGFyYW0pOwotICAgICAgLy8KLSAgICAgIHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7IAotICAgICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuRVJST1IpCi0gICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgIAotICAgICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuV0FSTklORykKLSAgICAgIHsKLSAgICAgICAgQ2hvaWNlIHJlc3VsdCA9IGVudl8uZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMsIG5ldyBDaG9pY2VbXXtPS0Nob2ljZSwgQ2FuY2VsQ2hvaWNlfSk7Ci0gICAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgICB7Ci0gICAgICAgIAkgLy9yZXR1cm4gYW4gZXJyb3Igc3RhdHVzIHNpbmNlIHRoZSB1c2VyIGNhbmNlbGVkCi0gICAgICAgIAkgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgICB9Ci0gICAgICAgIAkKLSAgICAgIH0KLSAgICAgIC8vICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gICAgCi0gIH0KLSAgCi0gICAgICAgIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZlR5cGVWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZUeXBlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDNkY2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZlR5cGVWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuRmllbGRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbW9uLlNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZUeXBlVmlzaXRvciBpbXBsZW1lbnRzIFZpc2l0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBFbnZpcm9ubWVudCBlbnZfOwotCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0KLSAgLyoKLSAgKiBDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZUeXBlVmlzaXRvcihFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCWVudl8gPSBlbnY7Ci0gIH0KLQotICAgLyoKLSAgKiBVc2UgdGhpcyB0byByZWZsZWN0IAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0KFN0cmluZyBjbGllbnRQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotCi0gICAvKgotICAqIFVzZSB0aGlzIHRvIHJlZmxlY3QgCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgLyoKLSAgKiBHZXQgdGhlIHR5cGUgYmVsb25naW5nIHRvIHRoZSBwYXJhbWV0ZXIKLSAgKiBAcGFyYW0gSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyIHRoYXQgb3ducyB0aGUgdHlwZQotICAqIEBwYXJhbSBWaXNpdG9yQWN0aW9uIEFjdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZWFjaCBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgcnVuICggT2JqZWN0IHR5cGVOYXZpZ2F0b3IsIFZpc2l0b3JBY3Rpb24gdkFjdGlvbikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIGlmICh0eXBlTmF2aWdhdG9yIGluc3RhbmNlb2YgSmF2YVBhcmFtZXRlcil7Ci0KLSAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciA9IChKYXZhUGFyYW1ldGVyKXR5cGVOYXZpZ2F0b3I7Ci0gICAgICBKYXZhSGVscGVycyBqYXZhSGVscGVycyA9IGphdmFQYXJhbWV0ZXIuZ2V0SmF2YVR5cGUoKTsKLSAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQoamF2YUhlbHBlcnMpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlTmF2aWdhdG9yIGluc3RhbmNlb2YgSmF2YUhlbHBlcnMpewotICAgIAlzdGF0dXMgPSB2QWN0aW9uLnZpc2l0KHR5cGVOYXZpZ2F0b3IpOwkKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZU5hdmlnYXRvciBpbnN0YW5jZW9mIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcil7Ci0gICAgICBTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSAoU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKXR5cGVOYXZpZ2F0b3I7Ci0gICAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YU1vZlJlZiA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsKLSAgICAgIGphdmFNb2ZSZWYuc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0KTsKLSAgICAgIGphdmFNb2ZSZWYuc2V0UHJveHlCZWFuKCgoSmF2YUhlbHBlcnMpcGQuZ2V0UHJvcGVydHlUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICBzdGF0dXMgPSBqYXZhTW9mUmVmLmV4ZWN1dGUoZW52Xyk7Ci0gICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgCi0gICAgICBzdGF0dXMgPSB2QWN0aW9uLnZpc2l0KGphdmFNb2ZSZWYuZ2V0SmF2YUNsYXNzKCkpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlTmF2aWdhdG9yIGluc3RhbmNlb2YgRmllbGQpewotICAgICAgRmllbGRJbXBsIGZpZWxkID0gKEZpZWxkSW1wbCl0eXBlTmF2aWdhdG9yOwotICAgICAgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kIGphdmFNb2ZSZWYgPSBuZXcgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kKCk7Ci0gICAgICBqYXZhTW9mUmVmLnNldENsaWVudFByb2plY3QoY2xpZW50UHJvamVjdCk7Ci0gICAgICBqYXZhTW9mUmVmLnNldFByb3h5QmVhbihmaWVsZC5nZXRKYXZhVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgIAotICAgICAgc3RhdHVzID0gamF2YU1vZlJlZi5leGVjdXRlKGVudl8pOwotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgIAotICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChqYXZhTW9mUmVmLmdldEphdmFDbGFzcygpKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgICAgICAgCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Fic3RyYWN0U3RhcnRTZXJ2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQWJzdHJhY3RTdGFydFNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM4OGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQWJzdHJhY3RTdGFydFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0YXJ0U2VydmVyIHsKLSAKLXByaXZhdGUgSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci1wcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotcHJpdmF0ZSBMb2cgbG9nXzsKLXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotcHVibGljIEFic3RyYWN0U3RhcnRTZXJ2ZXIoKQotewotCWxvZ18gPSBuZXcgRWNsaXBzZUxvZygpOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ucGx1Z2luIiwgdGhpcyApOwotfQotCi0vKioKLSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAqLwotcHVibGljIHZvaWQgU3RhcnRTZXJ2ZXIgKElQcm9qZWN0IHByb2plY3QsIElTZXJ2ZXIgc2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGJvb2xlYW4gcmVzdGFydCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLXsKLQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0KLSAgIHRyeQotICB7Ci0gICAJCi0vLyAgICBJSmF2YVNlcnZlciBqYXZhU2VydmVyID0gKElKYXZhU2VydmVyKSBzZXJ2ZXIuZ2V0RGVsZWdhdGUoKTsKLS8vICAgIGFkZEphcnNUb0NsYXNzUGF0aChqYXZhU2VydmVyKTsKLSAgICB2YWxpZGF0ZVJlbW90ZVNlcnZlclBhdGgoc2VydmVyKTsKLQotICAgIGlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpICAvLyBUaGUgU2VydmVyIGlzIHJ1bm5pbmcKLSAgICB7IAotICAgICAgaWYgKHNlcnZlci5nZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSkKLSAgICAgIHsgICAgCi0gICAgICAJCi0gICAgICAgIHNlcnZlci5zeW5jaHJvbm91c1N0b3AoZmFsc2UpOwotICAgICAgICBsb2dfLmxvZyhMb2cuSU5GTywgNTA1MCwgdGhpcywgIlN0YXJ0U2VydmVyIiwgInByb2plY3Q9Iitwcm9qZWN0KyIsIFN0b3AgY29tbWFuZCBjb21wbGV0ZWQsIHJlc3RhcnQgbmVlZGVkIik7Ci0gICAgICAgIHB1Ymxpc2hQcm9qZWN0KHNlcnZlcik7Ci0gICAgCXN0YXJ0UHJvamVjdChzZXJ2ZXIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCQotICAgICAgICBpZiAocmVzdGFydCkgLy8gV0VCLUlORlxsaWIgbmVlZCB0byBiZSByZWxvYWRlZAotICAgICAgICB7Ci0gICAgICAgICAgcHVibGlzaFByb2plY3Qoc2VydmVyKTsgICAgICAKLSAgICAgICAgICByZXN0YXJ0UHJvamVjdChwcm9qZWN0LCBzZXJ2ZXIpOwotICAgICAgICB9ICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgCQotICAgIAkJcHVibGlzaFByb2plY3Qoc2VydmVyKTsKLSAgICAJCXN0YXJ0UHJvamVjdChzZXJ2ZXIpOwotICAgIAl9Ci19Ci0KLSAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgCXRocm93IGNlOwotICAJfQotICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSxlKSk7Ci0gIH0KLX0KLQotcHJvdGVjdGVkIHZvaWQgcHVibGlzaFByb2plY3QoSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uCi17Ci0gICAgICBtb25pdG9yLnN1YlRhc2soIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiUFJPR1JFU1NfSU5GT19QVUJMSVNISU5HX1NFUlZFUiIgKSApOwotICAgICAgSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG1vbml0b3IpOwotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0spCi0gICAgICAJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLSAgICAgIGxvZ18ubG9nKExvZy5JTkZPLCA1MDUxLCB0aGlzLCAicHVibGlzaFByb2plY3QiLCAiSVNlcnZlcj0iK3NlcnZlcisiLCBQdWJsaXNoIGNvbW1hbmQgY29tcGxldGVkIik7Ci0gfQotCi1wcm90ZWN0ZWQgdm9pZCBzdGFydFByb2plY3QoSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uCi17Ci0gIHRyeQotICB7Ci0gICAgbW9uaXRvci5zdWJUYXNrKCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggIlBST0dSRVNTX0lORk9fU1RBUlRJTkdfU0VSVkVSIiApICk7ICAgIAotICAgIHNlcnZlci5zeW5jaHJvbm91c1N0YXJ0KElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBtb25pdG9yKTsKLSAgICBsb2dfLmxvZyhMb2cuSU5GTywgNTA1MiwgdGhpcywgInN0YXJ0UHJvamVjdCIsICJJU2VydmVyPSIrc2VydmVyKyIsIFN0YXJ0IGNvbW1hbmQgY29tcGxldGVkIik7Ci0gICAgCi0gIH0KLSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0VSVkVSIiksZSkpOwotICB9ICAKLX0KLQotcHJvdGVjdGVkIHZvaWQgcmVzdGFydFByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uCi17Ci0gIHRyeQotICB7Ci0KLSAgICBtb25pdG9yLnN1YlRhc2soIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiUFJPR1JFU1NfSU5GT19TVEFSVElOR19TRVJWRVIiICkgKTsKLSAgICBFQVJOYXR1cmVSdW50aW1lW10gZWFycyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cyhwcm9qZWN0KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVhcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IGVhcnNbaV0uZ2V0UHJvamVjdCgpOwotICAgICAgaWYgKGVhclByb2plY3QgIT0gbnVsbCAmJiBTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHNlcnZlcixSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSwgbW9uaXRvcikpICAgIAotICAgICAgewotICAgICAgICAobmV3IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuYWN0aW9ucy5SZXN0YXJ0UHJvamVjdEFjdGlvbihlYXJQcm9qZWN0KSkucnVuKCk7Ci0gICAgICAgIGxvZ18ubG9nKExvZy5JTkZPLCA1MDUzLCB0aGlzLCAicmVzdGFydFByb2plY3QiLCAiZWFyUHJvamVjdD0iK2VhclByb2plY3QrIiwgUmVzdGFydCBwcm9qZWN0IGNvbW1hbmQgY29tcGxldGVkIik7Ci0gICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSxlKSk7Ci0gIH0gIAotfQotCi1wdWJsaWMgdm9pZCBydW5QcmVTZXJ2ZXJDb25maWcoSVNlcnZlciBzZXJ2ZXIsIElQcm9qZWN0IEVBUlByb2plY3QpewotCi0JcmV0dXJuOwotCQotfQotCi1wdWJsaWMgdm9pZCBydW5Qb3N0U2VydmVyQ29uZmlnKElTZXJ2ZXIgc2VydmVyLCBJUHJvamVjdCBFQVJQcm9qZWN0KXsKLQotCXJldHVybjsKLX0KLQotCi1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRKYXJzVG9DbGFzc1BhdGgoSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVSZW1vdGVTZXJ2ZXJQYXRoKElTZXJ2ZXIgc2VydmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotcHVibGljIHZvaWQgc3RvcFNlcnZlcihJU2VydmVyIHNlcnZlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0KLQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJc2VydmVyLnN5bmNocm9ub3VzU3RvcChmYWxzZSk7Ci0JCX0KLQl9CQotCQotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0FkZE1vZHVsZVRvU2VydmVyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9BZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4MjI1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0FkZE1vZHVsZVRvU2VydmVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckluc3RhbmNlSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvamVjdDsKLQlwcml2YXRlIFN0cmluZyBtb2R1bGU7Ci0JCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQl7Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGUoU3RyaW5nIG1vZHVsZSkKLQl7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoU3RyaW5nIHByb2plY3QpCi0JewotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZlckluc3RhbmNlSWQpCi0JewotCQl0aGlzLnNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0JCi0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5MzcwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Fzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIEFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotCXByaXZhdGUgU3RyaW5nCQkJCQkJcHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgbW9kdWxlXzsKLQlwcml2YXRlIFN0cmluZwkJCQkJCWVhclByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIGVhcl87Ci0JCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQl7Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQl9Ci0JCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoIFN0cmluZyBwcm9qZWN0ICkKLSAgewotCSAgcHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0JICAKLSAgcHVibGljIHZvaWQgc2V0TW9kdWxlKCBTdHJpbmcgbW9kdWxlICkKLSAgewotCSAgbW9kdWxlXyA9IG1vZHVsZTsKLSAgfQkKLQkKLSAgcHVibGljIHZvaWQgc2V0RUFSUHJvamVjdCggU3RyaW5nIGVhclByb2plY3QgKQotICB7Ci0JICBlYXJQcm9qZWN0XyA9IGVhclByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVhciggU3RyaW5nIGVhciApCi0gIHsKLQkgIGVhcl8gPSBlYXI7ICAKLSAgfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQnVpbGRQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9CdWlsZFByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOTc2MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9CdWlsZFByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLnZhbGlkYXRlLlZhbGlkYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgQnVpbGRQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0gIHByaXZhdGUgVmFsaWRhdGlvbk1hbmFnZXIgdmFsaWRhdGlvbk1hbmFnZXI7Ci0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdF87Ci0gIHByaXZhdGUgYm9vbGVhbiBmb3JjZUJ1aWxkXzsKLSAgLy8gcm0gcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQotICAvKioKLSAgICogRGVmYXVsdCBDVE9SOwotICAgKi8KLSAgcHVibGljIEJ1aWxkUHJvamVjdENvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlVEFTS19MQUJFTF9XRUJTRVJWSUNFX0JVSUxEX1BST0pFQ1QiKSwKLSAgICAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVUQVNLX0RFU0NfV0VCU0VSVklDRV9CVUlMRF9QUk9KRUNUIikgKTsKLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKGZvcmNlQnVpbGRfKQotICAgICAgICBwcm9qZWN0Xy5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25NYW5hZ2VyID09IG51bGwpCi0gICAgICAgIHByb2plY3RfLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgZWxzZSBpZiAodmFsaWRhdGlvbk1hbmFnZXIuZ2V0V29ya3NwYWNlQXV0b0J1aWxkUHJlZmVyZW5jZSgpKQotICAgICAgICBwcm9qZWN0Xy5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgLyoKLSAgICB0cnkKLSAgICB7Ci0gICAgICBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKQotICAgIHsKLSAgICAgIC8vIGNvbnRpbnVlIGV4ZWN1dGlvbgotICAgIH0KLSAgICBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKQotICAgIHsKLSAgICAgIC8vIGNvbnRpbnVlIGV4ZWN1dGlvbgotICAgIH0KLSAgICAqLwotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGZvcmNlQnVpbGQgVGhlIGZvcmNlQnVpbGQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Rm9yY2VCdWlsZChib29sZWFuIGZvcmNlQnVpbGQpIHsKLSAgICB0aGlzLmZvcmNlQnVpbGRfID0gZm9yY2VCdWlsZDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICB0aGlzLnByb2plY3RfID0gcHJvamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdmFsaWRhdGlvbk1hbmFnZXIgVGhlIHZhbGlkYXRpb25NYW5hZ2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25NYW5hZ2VyKFZhbGlkYXRpb25NYW5hZ2VyIHZhbGlkYXRpb25NYW5hZ2VyKSB7Ci0gICAgdGhpcy52YWxpZGF0aW9uTWFuYWdlciA9IHZhbGlkYXRpb25NYW5hZ2VyOwotICB9Ci0KLSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ2hlY2tQcm9qZWN0T0tDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NoZWNrUHJvamVjdE9LQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQ5NmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ2hlY2tQcm9qZWN0T0tDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBDaGVja1Byb2plY3RPS0NvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlkXzsKLQotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUgotICAgKi8KLSAgcHVibGljIENoZWNrUHJvamVjdE9LQ29tbWFuZCgpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICAKLSAgICBTdHJpbmcgdHlwZWlkID0gc2VydmljZVNlcnZlclR5cGVJZF87Ci0gICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLS8vICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVycy5pdGVyYXRvcigpOwotICAgIGJvb2xlYW4gdmlld09wZW4gPSBmYWxzZTsKLSAgICBTdHJpbmcgc2VydmVyTmFtZSA9IG51bGw7Ci0KLSAgICBmb3IgKGludCBpPTA7aTxzZXJ2ZXJzLmxlbmd0aDtpKyspIHsKLSAgICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIHNlcnZlcnNbaV07Ci0KLSAgICAgIC8vIElmIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciBpcyBvcGVuIGZvciB0aGUgc2VydmVyIHRoYXQgd2UgYXJlCi0gICAgICAvLyBkZXBsb3lpbmcKLSAgICAgIC8vIHRvIHdlIHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIGNsb3NlIGl0LgotICAgICAgaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKS5lcXVhbHModHlwZWlkKSkgewotICAgICAgICB2aWV3T3BlbiA9IHRydWU7Ci0gICAgICAgIHNlcnZlck5hbWUgPSBzZXJ2ZXIuZ2V0TmFtZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmlld09wZW4pIHsKLSAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NFUlZFUl9WSUVXX09QRU4iLCBuZXcgU3RyaW5nW10geyBzZXJ2ZXJOYW1lfSk7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgZXJyb3JNZXNzYWdlLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHNlcnZpY2VTZXJ2ZXJJZAotICAgKiAgICAgICAgICAgIFRoZSBzZXJ2aWNlU2VydmVyIGZhY3RvcnkgSWQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVNlcnZlclR5cGVJRChTdHJpbmcgc2VydmljZVNlcnZlcklkKSB7Ci0gICAgdGhpcy5zZXJ2aWNlU2VydmVyVHlwZUlkXyA9IHNlcnZpY2VTZXJ2ZXJJZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWU1MjNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIkNsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kIjsKLSAgcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiRW5zdXJlIERlcGxveWFibGUgaXMgYWRkZWQgdG8gU2VydmVyIENvbmZpZ3VyYXRpb24gZm9yIGNsaWVudCBwcm9qZWN0cyI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBCb29sZWFuIGNyZWF0aW9uU2NlbmFyaW9fID0gQm9vbGVhbi5UUlVFOwotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIGNsaWVudElkc187Ci0gIHByaXZhdGUgSVByb2plY3Qgc2FtcGxlUHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSURfOwotICBwcml2YXRlIFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSURfOwotICBwcml2YXRlIElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyXzsKLSAgcHJpdmF0ZSBJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVByb2plY3RVUkxfOwotICBwcml2YXRlIFN0cmluZyBzYW1wbGVQcm9qZWN0VVJMXzsKLQotICAvL2FkZGVkUHJvamVjdFRvU2VydmVyXyBpcyBzZXQgdG8gdHJ1ZSBpZgotICAvLy0gdGhlIHByb2plY3QgZXhpc3RzIEFORAotICAvLy0gdGhlIHNlcnZlciBleGlzdHMgKGkuZS4gdGhpcyBjb21tYW5kIGRpZCBub3QgY3JlYXRlIGl0KSBBTkQKLSAgLy8tIHRoaXMgY29tbWFuZCBhZGRlZCB0aGUgcHJvamVjdCB0byB0aGUgc2VydmVyCi0gIHByaXZhdGUgYm9vbGVhbiBhZGRlZFByb2plY3RUb1NlcnZlcl8gPSBmYWxzZTsgIAotICAvKioKLSAgICogRGVmYXVsdCBDVE9SCi0gICAqLwotICBwdWJsaWMgQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQoKSB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotICAgIHNldE5hbWUoTEFCRUwpOwotICB9Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUgotICAgKi8KLSAgcHVibGljIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kKGJvb2xlYW4gY3JlYXRpb25TY2VuYXJpbykgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIHNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLSAgICBzZXROYW1lKExBQkVMKTsKLSAgICBjcmVhdGlvblNjZW5hcmlvXyA9IG5ldyBCb29sZWFuKGNyZWF0aW9uU2NlbmFyaW8pOwotICB9Ci0KLSAgLyoqCi0gICAqIGV4ZWN1dGUKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB0cnkgewotCi0gICAgICAvLyBkZXRlcm1pbmUgY2xpZW50IG9yIHNlcnZpY2UgcHJvamVjdAotICAgICAgSVByb2plY3QgcHJvamVjdCA9ICBzYW1wbGVQcm9qZWN0XzsKLSAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgICAgIC8vIGdldCBzYW1wbGUgc2VydmVyIGZhY3RvcnkgSWQgYW5kIGluc3RhbmNlSWQKLSAgICAgIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQgPSBjbGllbnRJZHNfLmdldFNlcnZlcklkKCk7Ci0gICAgICBTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJbnN0SWQgPSBjbGllbnRJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKTsKLSAgICAgIElTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLSAgICAgIGlmIChleGlzdGluZ1NlcnZlckluc3RJZCA9PW51bGwpIHsKLSAgICAgIAlzZXJ2ZXI9IHNhbXBsZUV4aXN0aW5nU2VydmVyXzsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgLy8gZ2V0IGFuIElTZXJ2ZXIgb2JqZWN0OyBlaXRoZXIgZXhpc3Rpbmcgb3IgY3JlYXRlIG9uZQotICAgICAgIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihleGlzdGluZ1NlcnZlckluc3RJZCk7Ci0gICAgICB9Ci0gICAKLSAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgewotICAgICAgCS8vIGZpbmQgZXhhY3Qgc2VydmVyIGZvciBnaXZlbiBwcm9qZWN0Ci0gICAgICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotICAgICAgICBib29sZWFuIGZvdW5kU2VydmVyID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIGlmIChzZXJ2ZXJzW2ldLmVxdWFscyhzZXJ2ZXIpKQotICAgICAgICAgICAgZm91bmRTZXJ2ZXIgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmRTZXJ2ZXIpIHsKLSAgICAgICAgCVN0YXR1cyBtb2RTdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52ICxzZXJ2ZXIsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCB0cnVlLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0gICAgICAgIAlpZiAobW9kU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgCQlyZXR1cm4gbW9kU3RhdHVzOwotICAgICAgICAJCi0gICAgICAgICAgICBhZGRlZFByb2plY3RUb1NlcnZlcl8gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKFJlc291cmNlVXRpbHMuaXNUcnVlSmF2YVByb2plY3QocHJvamVjdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvL0Rvbid0IGF0dGVtcHQgdG8gYWRkIGEgSmF2YSBwcm9qZWN0IHRvIGEgc2VydmVyLCB0aGVyZWZvcmUgcGFzc2luZyBpbiBudWxsIGZvciB0aGUgbW9kdWxlLgotICAgICAgICAgIHNlcnZlciA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlU2VydmVyKGVudiwgbnVsbCwgc2VydmVyRmFjdG9yeUlkLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmVyID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVTZXJ2ZXIoZW52LCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgc2VydmVyRmFjdG9yeUlkLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DUkVBVEVfU0VSVkVSIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElNb2R1bGVbXSBwYXJlbnRNb2R1bGVzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLG51bGwpOwotICAgICAgICBpZiAocGFyZW50TW9kdWxlcyE9bnVsbCAmJiBwYXJlbnRNb2R1bGVzLmxlbmd0aCE9MCkgewotICAgICAgICAgIGlmICghU2VydmVyVXRpbC5jb250YWluc01vZHVsZShzZXJ2ZXIsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKSkgewotICAgICAgICAgICAgU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgc2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgdHJ1ZSwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotICAgICAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgICAgICAgcmV0dXJuIG1tU3RhdHVzOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0KLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8KLSAgICAgIFN0cmluZyBwcm9qZWN0VVJMID0gUmVzb3VyY2VVdGlscy5nZXRXZWJQcm9qZWN0VVJMKHByb2plY3QsIHNlcnZlckZhY3RvcnlJZCwgc2VydmVyKTsKLSAgICAgIGlmIChjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfID0gc2VydmVyOwotICAgICAgICBzZXJ2aWNlUHJvamVjdFVSTF8gPSBwcm9qZWN0VVJMOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHNhbXBsZUV4aXN0aW5nU2VydmVyXyA9IHNlcnZlcjsKLSAgICAgICAgc2FtcGxlUHJvamVjdFVSTF8gPSBwcm9qZWN0VVJMOwotICAgICAgfQotCi0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQkFEX1NFUlZFUl9DT05GSUciKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0KElQcm9qZWN0IHNhbXBsZVByb2plY3QpIHsKLSAgICBzYW1wbGVQcm9qZWN0XyA9IHNhbXBsZVByb2plY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVyVHlwZUlEKFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEKSB7Ci0gICAgc2VydmljZVNlcnZlclR5cGVJRF8gPSBzZXJ2aWNlU2VydmVyVHlwZUlEOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlU2VydmVyVHlwZUlEKFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSUQpIHsKLSAgICBzYW1wbGVTZXJ2ZXJUeXBlSURfID0gc2FtcGxlU2VydmVyVHlwZUlEOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKSB7Ci0gICAgc2VydmljZUV4aXN0aW5nU2VydmVyXyA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlcjsKLSAgfQotCi0gIHB1YmxpYyBJU2VydmVyIGdldFNlcnZpY2VFeGlzdGluZ1NlcnZlcigpIHsKLSAgICByZXR1cm4gc2VydmljZUV4aXN0aW5nU2VydmVyXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkKCkgewotCVN0cmluZyBpZCA9IG51bGw7Ci0JSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gbnVsbDsKLQlpZiAoc2VydmljZUV4aXN0aW5nU2VydmVyXyE9bnVsbCl7Ci0JICB3YyA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8uY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkgIGlkID0gKHdjIT1udWxsID8gd2MuZ2V0SWQoKSA6IG51bGwpOwotCX0KLQlyZXR1cm4gaWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyKSB7Ci0gICAgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLQotICBwdWJsaWMgSVNlcnZlciBnZXRTYW1wbGVFeGlzdGluZ1NlcnZlcigpIHsKLSAgICByZXR1cm4gc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVFeGlzdGluZ1NlcnZlckluc3RJZCgpIHsKLQlTdHJpbmcgaWQgPSBudWxsOwotCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IG51bGw7Ci0JaWYgKHNhbXBsZUV4aXN0aW5nU2VydmVyXyE9bnVsbCl7Ci0JICB3YyA9IHNhbXBsZUV4aXN0aW5nU2VydmVyXy5jcmVhdGVXb3JraW5nQ29weSgpOwotCSAgaWQgPSAod2MhPW51bGwgPyB3Yy5nZXRJZCgpIDogbnVsbCk7Ci0JfQotCXJldHVybiBpZDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlUHJvamVjdFVSTCgpIHsKLSAgICByZXR1cm4gc2VydmljZVByb2plY3RVUkxfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVQcm9qZWN0VVJMKCkgewotICAgIHJldHVybiBzYW1wbGVQcm9qZWN0VVJMXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgdHJzKXsKLSAgCXRoaXMuY2xpZW50SWRzXyA9IHRyczsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFkZGVkUHJvamVjdFRvU2VydmVyXy4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0QWRkZWRQcm9qZWN0VG9TZXJ2ZXIoKSB7Ci0gICAgcmV0dXJuIGFkZGVkUHJvamVjdFRvU2VydmVyXzsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NvbXB1dGVFbmRwb2ludENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTRkM2JjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotcHVibGljIGNsYXNzIENvbXB1dGVFbmRwb2ludENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0gIHByaXZhdGUgQm9vbGVhbiBtb25pdG9yU2VydmljZTsKLSAgcHJpdmF0ZSBJbnRlZ2VyIG1vbml0b3JlZFBvcnQ7Ci0KLSAgcHVibGljIENvbXB1dGVFbmRwb2ludENvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5Db21wdXRlRW5kcG9pbnRDb21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5Db21wdXRlRW5kcG9pbnRDb21tYW5kIik7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIG1vbml0b3JlZFBvcnQgVGhlIG1vbml0b3JlZFBvcnQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvcmVkUG9ydChJbnRlZ2VyIG1vbml0b3JlZFBvcnQpCi0gIHsKLSAgICB0aGlzLm1vbml0b3JlZFBvcnQgPSBtb25pdG9yZWRQb3J0OwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gbW9uaXRvclNlcnZpY2UgVGhlIG1vbml0b3JTZXJ2aWNlIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3JTZXJ2aWNlKEJvb2xlYW4gbW9uaXRvclNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLm1vbml0b3JTZXJ2aWNlID0gbW9uaXRvclNlcnZpY2U7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlc1BhcnNlciBUaGUgd2ViU2VydmljZXNQYXJzZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpCi0gIHsKLSAgICB0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2RsVVJJIFRoZSB3c2RsVVJJIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEVuZHBvaW50KCkKLSAgewotICAgIGlmIChtb25pdG9yU2VydmljZSAhPSBudWxsICYmIG1vbml0b3JTZXJ2aWNlLmJvb2xlYW5WYWx1ZSgpICYmIG1vbml0b3JlZFBvcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZiA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkkpOwotICAgICAgaWYgKGRlZiAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZGVmLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKWl0Lm5leHQoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0MiA9IHNlcnZpY2UuZ2V0UG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydClpdDIubmV4dCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdDMgPSBwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0My5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXQzLm5leHQoKTsKLSAgICAgICAgICAgICAgaWYgKGV4dCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gKChTT0FQQWRkcmVzcylleHQpLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgdXJsID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgbW9uaXRvcmVkUG9ydC5pbnRWYWx1ZSgpLCB1cmwuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpbnQgcHJvdG9jb2xJbmRleCA9IGxvY2F0aW9uLmluZGV4T2YoIjovLyIpOwotICAgICAgICAgICAgICAgICAgaWYgKHByb3RvY29sSW5kZXggIT0gLTEpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbCA9IGxvY2F0aW9uLnN1YnN0cmluZygwLCBwcm90b2NvbEluZGV4KzMpOwotICAgICAgICAgICAgICAgICAgICBpbnQgaG9zdFBvcnRJbmRleCA9IGxvY2F0aW9uLmluZGV4T2YoJy8nLCBwcm90b2NvbEluZGV4KzMpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhvc3RQb3J0SW5kZXggPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBob3N0UG9ydEluZGV4ID0gbG9jYXRpb24ubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgZmlsZSA9ICIiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gbG9jYXRpb24uc3Vic3RyaW5nKGhvc3RQb3J0SW5kZXgsIGxvY2F0aW9uLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3RQb3J0ID0gbG9jYXRpb24uc3Vic3RyaW5nKHByb3RvY29sSW5kZXgrMywgaG9zdFBvcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBob3N0SW5kZXggPSBob3N0UG9ydC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBob3N0OwotICAgICAgICAgICAgICAgICAgICBpZiAoaG9zdEluZGV4ICE9IC0xKQotICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPSBob3N0UG9ydC5zdWJzdHJpbmcoMCwgaG9zdEluZGV4KzEpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgaG9zdCA9IGhvc3RQb3J0ICsgJzonOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UG9ydCA9IFN0cmluZy52YWx1ZU9mKG1vbml0b3JlZFBvcnQuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBlbmRwb2ludCA9IG5ldyBTdHJpbmdCdWZmZXIocHJvdG9jb2wpOwotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludC5hcHBlbmQoaG9zdCk7Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50LmFwcGVuZChuZXdQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQuYXBwZW5kKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5kcG9pbnQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NvcHlXU0RMQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9Db3B5V1NETENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxMzM5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NvcHlXU0RMQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExXcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5Lk5ldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGouV1NETEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RTY2hlbWFJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFBhcnNlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQ29weVdTRExDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIFN0cmluZyBkZXN0aW5hdGlvblVSSTsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZjsKLSAgcHJpdmF0ZSBWZWN0b3IgaWdub3JlTGlzdDsKLQotICBwdWJsaWMgQ29weVdTRExDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCJDT01NQU5EX0xBQkVMX0NPUFlfV1NETCIpLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiQ09NTUFORF9ERVNDX0NPUFlfV1NETCIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWdub3JlTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGlmIChkZWYgPT0gbnVsbCkKLSAgICAgICAgZGVmID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSSSk7Ci0gICAgICBjb3B5V1NETChlbnYsIHdzZGxVUkksIGdldEJhc2VVUkkoZGVzdGluYXRpb25VUkkpLCBnZXRMb2NhbG5hbWUoZGVzdGluYXRpb25VUkkpLCBkZWYpOwotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DT1BZX1dTREwiLCBuZXcgU3RyaW5nW117d3NkbFVSSSwgZGVzdGluYXRpb25VUkl9KSwgU3RhdHVzLkVSUk9SLCB0KTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlXU0RMKEVudmlyb25tZW50IGVudiwgU3RyaW5nIHVyaSwgU3RyaW5nIGRlc3RVUkksIFN0cmluZyBkZXN0TG9jYWxuYW1lKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBVUklFeGNlcHRpb24KLSAgewotICAJRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotCQotCXRyeSB7Ci0JCWRlZmluaXRpb24gPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvblZlcmJvc2UodXJpKTsKLQkJY29weVdTREwoZW52LCB1cmksIGRlc3RVUkksIGRlc3RMb2NhbG5hbWUsIGRlZmluaXRpb24pOwkKLQl9IGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpIHsKLQkJY29weVhNTFNjaGVtYShlbnYsIHVyaSwgZGVzdFVSSSk7Ci0JfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlXU0RMKEVudmlyb25tZW50IGVudiwgU3RyaW5nIHVyaSwgU3RyaW5nIGRlc3RVUkksIFN0cmluZyBkZXN0TG9jYWxuYW1lLCBEZWZpbml0aW9uIGRlZmluaXRpb24pIHRocm93cyBXU0RMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGlnbm9yZUxpc3QuY29udGFpbnModXJpKSkKLSAgICAgIHJldHVybjsKLSAgICBpZ25vcmVMaXN0LmFkZCh1cmkpOwotICAgIGludCBpbmRleCA9IHdzZGxVUkkubGFzdEluZGV4T2YoJy8nKTsKLSAgICBTdHJpbmcgYmFzZVVSSSA9IGdldEJhc2VVUkkod3NkbFVSSSk7Ci0gICAgaWYgKGRlc3RMb2NhbG5hbWUgPT0gbnVsbCB8fCBkZXN0TG9jYWxuYW1lLmxlbmd0aCgpIDw9IDApCi0gICAgICBkZXN0TG9jYWxuYW1lID0gZ2V0TG9jYWxuYW1lKHdzZGxVUkkpOwotICAgIC8vIGNvcHkgV1NETAotICAgIFN0cmluZ0J1ZmZlciBkZXN0aW5hdGlvbkZpbGVVUkkgPSBuZXcgU3RyaW5nQnVmZmVyKGFkZFRyYWlsaW5nU2VwYXJhdG9yKGRlc3RVUkkpKTsKLSAgICBkZXN0aW5hdGlvbkZpbGVVUkkuYXBwZW5kKGRlc3RMb2NhbG5hbWUpOwotICAgIFdTRExGYWN0b3J5IHdzZGxGYWN0b3J5ID0gbmV3IFdTRExGYWN0b3J5SW1wbCgpOwotICAgIFdTRExXcml0ZXIgd3NkbFdyaXRlciA9IHdzZGxGYWN0b3J5Lm5ld1dTRExXcml0ZXIoKTsKLSAgICBPdXRwdXRTdHJlYW0gb3MgPSBlbnYuZ2V0VVJJRmFjdG9yeSgpLm5ld1VSSShkZXN0aW5hdGlvbkZpbGVVUkkudG9TdHJpbmcoKSkuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgd3NkbFdyaXRlci53cml0ZVdTREwoZGVmaW5pdGlvbiwgb3MpOwotICAgIG9zLmNsb3NlKCk7Ci0gICAgLy8gY29weSA8d3NkbDppbXBvcnQ+cwotICAgIE1hcCBpbXBvcnRzID0gZGVmaW5pdGlvbi5nZXRJbXBvcnRzKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IGltcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSAoTGlzdClpdC5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGxpc3RJdCA9IGxpc3QuaXRlcmF0b3IoKTsgbGlzdEl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEltcG9ydCB3c2RsSW1wb3J0ID0gKEltcG9ydClsaXN0SXQubmV4dCgpOwotICAgICAgICBTdHJpbmcgd3NkbEltcG9ydFVSSSA9IHdzZGxJbXBvcnQuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgaWYgKGlzUmVsYXRpdmUod3NkbEltcG9ydFVSSSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgaW1wb3J0QmFzZVVSSSA9IChuZXcgU3RyaW5nQnVmZmVyKGJhc2VVUkkpKS5hcHBlbmQod3NkbEltcG9ydFVSSSkudG9TdHJpbmcoKTsKLSAgICAgICAgICBTdHJpbmcgd3NkbEltcG9ydEJhc2VVUkkgPSBnZXRCYXNlVVJJKHdzZGxJbXBvcnRVUkkpOwotICAgICAgICAgIFN0cmluZ0J1ZmZlciBpbXBvcnREZXN0VVJJID0gbmV3IFN0cmluZ0J1ZmZlcihkZXN0VVJJKTsKLSAgICAgICAgICBpZiAod3NkbEltcG9ydEJhc2VVUkkgIT0gbnVsbCkKLSAgICAgICAgICAgIGltcG9ydERlc3RVUkkuYXBwZW5kKHdzZGxJbXBvcnRCYXNlVVJJKTsKLSAgICAgICAgICBjb3B5V1NETChlbnYsIGltcG9ydEJhc2VVUkksIGltcG9ydERlc3RVUkkudG9TdHJpbmcoKSwgZ2V0TG9jYWxuYW1lKHdzZGxJbXBvcnRVUkkpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0VHlwZXMoKTsKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IHNjaGVtYXMgPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzY2hlbWFzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXQubmV4dCgpOwotICAgICAgICBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCBzY2hlbWFFbGVtZW50ID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtZW50OwotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBudWxsOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNjaGVtYSA9IFhTRFNjaGVtYUltcGwuY3JlYXRlU2NoZW1hKHNjaGVtYUVsZW1lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyB0aGF0IGNhbm5vdCBiZSBwYXJzZWQgaW50byBhCi0gICAgICAgICAgICAvLyBYU0RTY2hlbWEgaW5zdGFuY2UKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29weVhNTFNjaGVtYShlbnYsIHhzZFNjaGVtYSwgYmFzZVVSSSwgZGVzdFVSSSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBzY2hlbWFFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbClleHRFbGVtZW50OwotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBudWxsOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNjaGVtYSA9IFhTRFNjaGVtYUltcGwuY3JlYXRlU2NoZW1hKHNjaGVtYUVsZW1lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyB0aGF0IGNhbm5vdCBiZSBwYXJzZWQgaW50byBhCi0gICAgICAgICAgICAvLyBYU0RTY2hlbWEgaW5zdGFuY2UKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29weVhNTFNjaGVtYShlbnYsIHhzZFNjaGVtYSwgYmFzZVVSSSwgZGVzdFVSSSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRCYXNlVVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICBpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignXFwnKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICByZXR1cm4gdXJpLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYWxuYW1lKFN0cmluZyB1cmkpCi0gIHsKLSAgICBpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignXFwnKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICByZXR1cm4gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiB1cmk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBhZGRUcmFpbGluZ1NlcGFyYXRvcihTdHJpbmcgcykKLSAgewotICAgIGlmICghKHMuZW5kc1dpdGgoIi8iKSB8fCBzLmVuZHNXaXRoKCJcXCIpKSkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHMpOwotICAgICAgc2IuYXBwZW5kKCcvJyk7Ci0gICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHM7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaXNSZWxhdGl2ZShTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuICh1cmkuaW5kZXhPZignOicpID09IC0xKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjb3B5WE1MU2NoZW1hKEVudmlyb25tZW50IGVudiwgU3RyaW5nIHVyaSwgU3RyaW5nIGRlc3RVUkkpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoaWdub3JlTGlzdC5jb250YWlucyh1cmkpKQotICAgICAgcmV0dXJuOwotICAgIGlnbm9yZUxpc3QuYWRkKHVyaSk7Ci0gICAgLy8gbG9hZCBhcyBhIGNhY2hlZCBzY2hlbWEKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEodXJpKTsKLSAgICAvLyBpZiBzY2hlbWEgaXMgbm90IGNhY2hlZCwgcGFyc2UgaXQKLSAgICBpZiAoeHNkU2NoZW1hID09IG51bGwpCi0gICAgewotICAgICAgWFNEUGFyc2VyIHAgPSBuZXcgWFNEUGFyc2VyKCk7Ci0gICAgICBJbnB1dFN0cmVhbSBpcyA9IE5ldFV0aWxzLmdldFVSTElucHV0U3RyZWFtKHVyaSk7Ci0gICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcC5wYXJzZShpcyk7Ci0gICAgICAgIHhzZFNjaGVtYSA9IHAuZ2V0U2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBjb3B5IHNjaGVtYQotICAgICAgRWxlbWVudCBlID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgIERPTVNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGUpOwotICAgICAgVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsICJVVEYtOCIpOwotICAgICAgc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiMiIpOwotICAgICAgT3V0cHV0U3RyZWFtIG9zID0gZW52LmdldFVSSUZhY3RvcnkoKS5uZXdVUkkoKG5ldyBTdHJpbmdCdWZmZXIoZGVzdFVSSSkpLmFwcGVuZChnZXRMb2NhbG5hbWUodXJpKSkudG9TdHJpbmcoKSkuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBzZXJpYWxpemVyLnRyYW5zZm9ybShkb21Tb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3MpKTsKLSAgICAgIG9zLmNsb3NlKCk7Ci0gICAgICAvLyBjb3B5IDx4c2Q6aW1wb3J0PnMgYW5kIDx4c2Q6aW5jbHVkZT5zCi0gICAgICBjb3B5WE1MU2NoZW1hKGVudiwgeHNkU2NoZW1hLCBnZXRCYXNlVVJJKHVyaSksIGRlc3RVUkkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjb3B5WE1MU2NoZW1hKEVudmlyb25tZW50IGVudiwgWFNEU2NoZW1hIHhzZFNjaGVtYSwgU3RyaW5nIGJhc2VVUkksIFN0cmluZyBkZXN0VVJJKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGNvcHkgPHhzZDppbXBvcnQ+cyBhbmQgPHhzZDppbmNsdWRlPnMKLSAgICAgIEVMaXN0IHhzZFNjaGVtYUNvbnRlbnRzID0geHNkU2NoZW1hLmdldENvbnRlbnRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0geHNkU2NoZW1hQ29udGVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGNvbnRlbnQgPSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hRGlyZWN0aXZlIHhzZFNjaGVtYURpcmVjdGl2ZSA9IChYU0RTY2hlbWFEaXJlY3RpdmUpY29udGVudDsKLSAgICAgICAgICBTdHJpbmcgeHNkU2NoZW1hRGlyZWN0aXZlTG9jYXRpb24gPSB4c2RTY2hlbWFEaXJlY3RpdmUuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgICBpZiAoeHNkU2NoZW1hRGlyZWN0aXZlTG9jYXRpb24gIT0gbnVsbCAmJiBpc1JlbGF0aXZlKHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZGlyZWN0aXZlVVJJID0gKG5ldyBTdHJpbmdCdWZmZXIoYmFzZVVSSSkpLmFwcGVuZCh4c2RTY2hlbWFEaXJlY3RpdmVMb2NhdGlvbikudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN0cmluZyBkaXJlY3RpdmVCYXNlVVJJID0gZ2V0QmFzZVVSSSh4c2RTY2hlbWFEaXJlY3RpdmVMb2NhdGlvbik7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgZGlyZWN0aXZlRGVzdFVSSSA9IG5ldyBTdHJpbmdCdWZmZXIoZGVzdFVSSSk7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aXZlQmFzZVVSSSAhPSBudWxsKQotICAgICAgICAgICAgICBkaXJlY3RpdmVEZXN0VVJJLmFwcGVuZChkaXJlY3RpdmVCYXNlVVJJKTsKLSAgICAgICAgICAgIGNvcHlYTUxTY2hlbWEoZW52LCBkaXJlY3RpdmVVUkksIGRpcmVjdGl2ZURlc3RVUkkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uVVJJKFN0cmluZyBkZXN0aW5hdGlvblVSSSkKLSAgewotICAgIHRoaXMuZGVzdGluYXRpb25VUkkgPSBkZXN0aW5hdGlvblVSSTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICB0aGlzLmRlZiA9IGRlZjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVBcHBDbGllbnRQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVBcHBDbGllbnRQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWRjNjAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlQXBwQ2xpZW50UHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmNyZWF0aW9uLkFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmNyZWF0aW9uLkFwcENsaWVudENvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LklTZXJ2ZXJUYXJnZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIENyZWF0ZUFwcENsaWVudFByb2plY3RDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyBhcHBDbGllbnRQcm9qZWN0TmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nIGVhclByb2plY3ROYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmFjdG9yeUlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb25fOyAgCi0gIAotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIENyZWF0ZUFwcENsaWVudFByb2plY3RDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlQXBwQ2xpZW50UHJvamVjdENvbW1hbmQiLCAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZUFwcENsaWVudFByb2plY3RDb21tYW5kIik7Ci0gICAgLy9zZXRSdW5JbldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0JTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ucGx1Z2luIiwgdGhpcyApOwotCQotICAgIHRyeQotICAgIHsKLSAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgaWYgKGVhclByb2plY3QgIT0gbnVsbCAmJiAhZWFyUHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQgYyA9IG5ldyBDcmVhdGVFQVJQcm9qZWN0Q29tbWFuZCgpOwotICAgICAgICBjLnNldEVhclByb2plY3ROYW1lKGVhclByb2plY3ROYW1lXyk7Ci0gICAgICAgIGMuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOwotICAgICAgICBjLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXyk7Ci0gICAgICAgIGMuZXhlY3V0ZShlbnYpOwotICAgICAgICBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lXyk7Ci0gICAgICB9Ci0gICAgICBJUHJvamVjdCBhcHBDbGllbnRQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGFwcENsaWVudFByb2plY3ROYW1lXyk7Ci0gICAgICBpZiAoYXBwQ2xpZW50UHJvamVjdCAhPSBudWxsICYmICFhcHBDbGllbnRQcm9qZWN0LmV4aXN0cygpKQotICAgICAgewotICAgICAgICBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCBpbmZvID0gbmV3IEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCk7Ci0gICAgICAgIGluZm8uc2V0UHJvcGVydHkoQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQ09NUE9ORU5UX05BTUUsIGFwcENsaWVudFByb2plY3ROYW1lXyk7Ci0gICAgICAgIGluZm8uc2V0UHJvcGVydHkoQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuRUFSX01PRFVMRV9OQU1FLCBlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9UT19FQVIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIAotICAgICAgICAvL1NldCB0aGUgSjJFRSB2ZXJzaW9uCi0gICAgICAgIFN0cmluZyBmaW5hbEoyRUVWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGoyZWVWZXJzaW9uXyAhPSBudWxsICYmIGoyZWVWZXJzaW9uXy5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5KMkVFX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGoyZWVWZXJzaW9uXykpOwotICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBqMmVlVmVyc2lvbl87Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVhclByb2plY3QgIT0gbnVsbCAmJiBlYXJQcm9qZWN0LmV4aXN0cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVBUk5hdHVyZVJ1bnRpbWUgZWFyID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKGVhclByb2plY3QpOwotICAgICAgICAgICAgaW50IGVhclZlcnNpb24gPSBlYXIuZ2V0SjJFRVZlcnNpb24oKTsKLSAgICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihlYXJWZXJzaW9uKSk7Ci0gICAgICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoZWFyVmVyc2lvbik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkoyRUVfVkVSU0lPTiwgbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKTsKLSAgICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0gICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vU2V0IHRoZSBzZXJ2ZXIgdGFyZ2V0Ci0gICAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWRfIT1udWxsICYmIHNlcnZlckZhY3RvcnlJZF8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotCQkvL1RPRE8gLSBBZGQgdGhpcyBsb2dpYyB0byBGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbCwgYW5kIG9wLi4uLgotCQkKLS8vICAgICAgICAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJUYXJnZXRJZEZyb21GYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXywgSVNlcnZlclRhcmdldENvbnN0YW50cy5BUFBfQ0xJRU5UX1RZUEUsIGZpbmFsSjJFRVZlcnNpb24pOyAKLS8vCQkgIGluZm8uc2V0UHJvcGVydHkoQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuU0VSVkVSX1RBUkdFVF9JRCwgcnVudGltZVRhcmdldElkICk7Ci0vLyAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9TRVJWRVJfVEFSR0VULCBCb29sZWFuLlRSVUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9DcmVhdGUgdGhlIEFwcENsaWVudCBwcm9qZWN0Ci0gICAgICAgIEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbihpbmZvKTsKLSAgICAgICAgb3BlcmF0aW9uLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0FQUF9DTElFTlRfUFJPSkVDVCIsIG5ldyBTdHJpbmdbXSB7YXBwQ2xpZW50UHJvamVjdE5hbWVffSksIFN0YXR1cy5FUlJPUiwgaXRlKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9BUFBfQ0xJRU5UX1BST0pFQ1QiLCBuZXcgU3RyaW5nW10ge2FwcENsaWVudFByb2plY3ROYW1lX30pLCBTdGF0dXMuRVJST1IsIGllKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QXBwQ2xpZW50UHJvamVjdE5hbWUoU3RyaW5nIGFwcENsaWVudFByb2plY3ROYW1lKQotICB7Ci0gICAgYXBwQ2xpZW50UHJvamVjdE5hbWVfID0gYXBwQ2xpZW50UHJvamVjdE5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVhclByb2plY3ROYW1lKFN0cmluZyBlYXJQcm9qZWN0TmFtZSkKLSAgewotICAgIGVhclByb2plY3ROYW1lXyA9IGVhclByb2plY3ROYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJc2VydmVyRmFjdG9yeUlkXyA9IHNlcnZlckZhY3RvcnlJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gIAlqMmVlVmVyc2lvbl8gPSBqMmVlVmVyc2lvbjsJCi0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2E0NWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLldlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgSURfV0VCID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5XZWIiOwotICBwcml2YXRlIFN0cmluZyBJRF9FSkIgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLkVKQiI7Ci0gIHByaXZhdGUgU3RyaW5nIElEX0FQUF9DTElFTlQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLkFwcENsaWVudCI7Ci0gIHByaXZhdGUgU3RyaW5nIElEX0pBVkEgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLkNvbnRhaW5lcmxlc3MiOwotCi0gIHByaXZhdGUgYm9vbGVhbiBwcm94eUNvZGVnZW5FbmFibGVkID0gdHJ1ZTsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdFR5cGVJZDsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm94eVByb2plY3Q7Ci0gIHByaXZhdGUgSVByb2plY3QgcHJveHlQcm9qZWN0RUFSOwotICBwcml2YXRlIFN0cmluZyBleGlzdGluZ1NlcnZlcklkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmFjdG9yeUlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb25fOwotICBwcml2YXRlIGJvb2xlYW4gbmVlZEVBUl87Ci0gIHByaXZhdGUgYm9vbGVhbiBhZGRlZFByb2plY3RUb1NlcnZlcl8gPSBmYWxzZTsKLQotICBwcml2YXRlIElTZXJ2ZXIgZkV4aXN0aW5nU2VydmVyID0gbnVsbDsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICAKLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUgotICAgKi8KLSAgcHVibGljIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQiLCAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kIik7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsgICAgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1VuZG9hYmxlKCl7Ci0gIAlyZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgdW5kbyhFbnZpcm9ubWVudCBlbnYpewotICAJU3RhdHVzIHN0YXQgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB0cnkJewotICAgIAkKLSAgICAgIC8vIGNoZWNrIGV4aXN0aW5nU2VydmVyCi0gICAgICBpZiAoZkV4aXN0aW5nU2VydmVyIT1udWxsKSB7Ci0JICAgIAkKLSAgICAJQWJzdHJhY3RTdGFydFNlcnZlciBzdGFydFNlcnZlckNvbW1hbmQgPSBudWxsOwotICAgIAlXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSByZWcgPSBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIAlzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChmRXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgIAlpZiAocHJveHlQcm9qZWN0RUFSIT1udWxsKSB7Ci0gICAgCQlzdGFydFNlcnZlckNvbW1hbmQucnVuUG9zdFNlcnZlckNvbmZpZyhmRXhpc3RpbmdTZXJ2ZXIsIHByb3h5UHJvamVjdEVBUik7Ci0gICAgCX0KLSAgICAgIH0KLSAgIAl9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UgKSB7Ci0gICAgICBJU3RhdHVzIGVtYmVkZGVkU3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICBzdGF0ID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdCk7Ci0gIAkJcmV0dXJuIHN0YXQ7Ci0gIAl9ICAJCi0gIAkKLSAgCXJldHVybiBzdGF0OwotICB9ICAKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgCS8vR2V0IHRoZSBleGlzdGluZyBzZXJ2ZXIKLQotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgSVNlcnZlciBleGlzdGluZ1NlcnZlciA9IG51bGw7Ci0JZkV4aXN0aW5nU2VydmVyID0gbnVsbDsgICAgCi0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVNlcnZlciB0aGlzU2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgICAgIElTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IG51bGw7Ci0gICAgICBTdHJpbmcgdGhpc1NlcnZlcklkID0gbnVsbDsKLSAgICAgIGlmICh0aGlzU2VydmVyIT1udWxsKSB7Ci0gICAgICAJd2MgPSB0aGlzU2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0gICAgICAJdGhpc1NlcnZlcklkID0gKHdjIT1udWxsID8gd2MuZ2V0SWQoKSA6IG51bGwpOwotICAgICAgfQotICAgICAgaWYgKHRoaXNTZXJ2ZXJJZC5lcXVhbHMoZXhpc3RpbmdTZXJ2ZXJJZF8pKXsKLSAgICAgICAgZXhpc3RpbmdTZXJ2ZXIgPSB0aGlzU2VydmVyOwotICAgICAgICBmRXhpc3RpbmdTZXJ2ZXIgPSBleGlzdGluZ1NlcnZlcjsKLSAgICAgIH0KLSAgICB9IAotICAgIAotICAgIC8vQ3JlYXRlIHRoZSBwcm9qZWN0Ci0gICAgaWYgKHByb3h5Q29kZWdlbkVuYWJsZWQpCi0gICAgewotICAgICAgaWYgKGNsaWVudFByb2plY3RUeXBlSWQgPT0gbnVsbCB8fCBjbGllbnRQcm9qZWN0VHlwZUlkLmxlbmd0aCgpIDw9IDApCi0gICAgICAgIGNsaWVudFByb2plY3RUeXBlSWQgPSAoV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKS5nZXRDbGllbnRUeXBlcygpKVswXTsKLSAgICAgIGlmIChJRF9XRUIuZXF1YWxzKGNsaWVudFByb2plY3RUeXBlSWQpKQotICAgICAgeyAgCi0gICAgICAgIENyZWF0ZVdlYlByb2plY3RDb21tYW5kIGMgPSBuZXcgQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQoKTsKLSAgICAgICAgYy5zZXRQcm9qZWN0TmFtZShwcm94eVByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChwcm94eVByb2plY3RFQVIgIT0gbnVsbCkKLSAgICAgICAgICBjLnNldEVhclByb2plY3ROYW1lKHByb3h5UHJvamVjdEVBUi5nZXROYW1lKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYy5zZXRFYXJQcm9qZWN0TmFtZSgiIik7Ci0gICAgICAgIAotICAgICAgICBjLnNldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWRfKTsKLSAgICAgICAgYy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbl8pOyAgICAgICAgICAgIAotICAgICAgICBjLnNldEV4aXN0aW5nU2VydmVyKGV4aXN0aW5nU2VydmVyKTsKLSAgICAgICAgYy5zZXROZWVkRUFSKG5lZWRFQVJfKTsKLSAgICAgICAgYy5zZXRBZGRlZFByb2plY3RUb1NlcnZlcihhZGRlZFByb2plY3RUb1NlcnZlcl8pOwotICAgICAgICAKLSAgICAgICAgc3RhdHVzID0gYy5leGVjdXRlKGVudik7Ci0gICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKXsKLSAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgICAgCi0gICAgICBTdGF0dXMgc3RhcnRTZXJ2ZXJTdGF0dXMgPSBzdGFydFNlcnZlcihlbnYsIHByb3h5UHJvamVjdCk7Ci0gICAgICBpZiAoc3RhcnRTZXJ2ZXJTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgCXJldHVybiBzdGFydFNlcnZlclN0YXR1czsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChJRF9FSkIuZXF1YWxzKGNsaWVudFByb2plY3RUeXBlSWQpKQotICAgICAgewotICAgICAgICBDcmVhdGVFSkJQcm9qZWN0Q29tbWFuZCBjID0gbmV3IENyZWF0ZUVKQlByb2plY3RDb21tYW5kKCk7Ci0gICAgICAgIGMuc2V0RWpiUHJvamVjdE5hbWUocHJveHlQcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgIGMuc2V0RWFyUHJvamVjdE5hbWUocHJveHlQcm9qZWN0RUFSLmdldE5hbWUoKSk7Ci0gICAgICAgIGMuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOwotICAgICAgICBjLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXyk7Ci0gICAgICAgIHN0YXR1cyA9IGMuZXhlY3V0ZShlbnYpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoSURfQVBQX0NMSUVOVC5lcXVhbHMoY2xpZW50UHJvamVjdFR5cGVJZCkpCi0gICAgICB7Ci0gICAgICAgIENyZWF0ZUFwcENsaWVudFByb2plY3RDb21tYW5kIGMgPSBuZXcgQ3JlYXRlQXBwQ2xpZW50UHJvamVjdENvbW1hbmQoKTsKLSAgICAgICAgYy5zZXRBcHBDbGllbnRQcm9qZWN0TmFtZShwcm94eVByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgYy5zZXRFYXJQcm9qZWN0TmFtZShwcm94eVByb2plY3RFQVIuZ2V0TmFtZSgpKTsKLSAgICAgICAgYy5zZXRTZXJ2ZXJGYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXyk7Ci0gICAgICAgIGMuc2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb25fKTsKLSAgICAgICAgc3RhdHVzID0gYy5leGVjdXRlKGVudik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChJRF9KQVZBLmVxdWFscyhjbGllbnRQcm9qZWN0VHlwZUlkKSkKLSAgICAgIHsKLSAgICAgICAgQ3JlYXRlSmF2YVByb2plY3RDb21tYW5kIGMgPSBuZXcgQ3JlYXRlSmF2YVByb2plY3RDb21tYW5kKCk7Ci0gICAgICAgIGMuc2V0UHJvamVjdE5hbWUocHJveHlQcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgIHN0YXR1cyA9IGMuZXhlY3V0ZShlbnYpOwotICAgICAgfQotICAgICAgICAgCi0gICAgfQotCi0gICAgdHJ5CXsKLSAgICAJCi0gICAJCUFic3RyYWN0U3RhcnRTZXJ2ZXIgc3RhcnRTZXJ2ZXJDb21tYW5kID0gbnVsbDsKLSAgIAkJV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgCXN0YXJ0U2VydmVyQ29tbWFuZCA9IChBYnN0cmFjdFN0YXJ0U2VydmVyKXJlZy5nZXRTZXJ2ZXJTdGFydEJ5VHlwZUlkKGV4aXN0aW5nU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAgCWlmIChwcm94eVByb2plY3RFQVIhPW51bGwgJiYgZXhpc3RpbmdTZXJ2ZXIhPW51bGwpIHsKLSAgICAgCQlzdGFydFNlcnZlckNvbW1hbmQucnVuUHJlU2VydmVyQ29uZmlnKGV4aXN0aW5nU2VydmVyLCBwcm94eVByb2plY3RFQVIpOwotICAgICAJCWZFeGlzdGluZ1NlcnZlciA9IGV4aXN0aW5nU2VydmVyOwotICAgICAJfQotICAgCX0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSApIHsKLSAgICAJSVN0YXR1cyBlbWJlZGRlZFN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgIAlzdGF0dXMgPSBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoZW1iZWRkZWRTdGF0dXMpOwotICAgIAllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gIAkJcmV0dXJuIHN0YXR1czsKLSAgCX0KLSAgCQotICAJcmV0dXJuIHN0YXR1czsgICAKLSAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBTdGF0dXMgc3RhcnRTZXJ2ZXIoRW52aXJvbm1lbnQgZW52LCBJUHJvamVjdCB3ZWJQcm9qZWN0KXsKLSAgCXRyeXsKLSAgCSAgICAvLyBzdGFydCBzZXJ2ZXIoQnVnIDQzNzcpCi0gIAkgICAgaWYgKG5lZWRFQVJfICYmICBmRXhpc3RpbmdTZXJ2ZXIgIT0gbnVsbCl7Ci0gIAkgICAgCVN0YXJ0UHJvamVjdENvbW1hbmQgc3BjID0gbmV3IFN0YXJ0UHJvamVjdENvbW1hbmQoKTsKLSAgCSAgICAJc3BjLnNldFNhbXBsZVByb2plY3Qod2ViUHJvamVjdCk7Ci0gIAkgICAgCXNwYy5zZXRTYW1wbGVFeGlzdGluZ1NlcnZlcihmRXhpc3RpbmdTZXJ2ZXIpOwotICAJICAgIAlzcGMuc2V0Q3JlYXRpb25TY2VuYXJpbyhuZXcgQm9vbGVhbigiZmFsc2UiKSk7Ci0gIAkgICAgCXJldHVybiBzcGMuZXhlY3V0ZShlbnYpOwkgICAgCQotICAJICAgIAkKLSAgCSAgICB9ICAJCQotICAJfQotICAJY2F0Y2goRXhjZXB0aW9uIGNlKXsKLSAgICAgICAgZW52LmdldExvZygpLmxvZyhMb2cuRVJST1IsIDUwNDYsIHRoaXMsICJleGVjdXRlIiwgY2UpOwotICAgICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFIiksIFN0YXR1cy5FUlJPUiwgY2UpOwotICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CQkKLSAgCX0KLSAgCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfSAgIAotICAKLSAgcHVibGljIHZvaWQgc2V0UHJveHlDb2RlZ2VuRW5hYmxlZChib29sZWFuIHByb3h5Q29kZWdlbkVuYWJsZWQpCi0gIHsKLSAgICB0aGlzLnByb3h5Q29kZWdlbkVuYWJsZWQgPSBwcm94eUNvZGVnZW5FbmFibGVkOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBwcm94eVByb2plY3RFQVIgVGhlIHByb3h5UHJvamVjdEVBUiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eVByb2plY3RFQVIoSVByb2plY3QgcHJveHlQcm9qZWN0RUFSKQotICB7Ci0gICAgdGhpcy5wcm94eVByb2plY3RFQVIgPSBwcm94eVByb2plY3RFQVI7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHByb3h5UHJvamVjdCBUaGUgcHJveHlQcm9qZWN0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5UHJvamVjdChJUHJvamVjdCBwcm94eVByb2plY3QpCi0gIHsKLSAgICB0aGlzLnByb3h5UHJvamVjdCA9IHByb3h5UHJvamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gY2xpZW50UHJvamVjdFR5cGVJZCBUaGUgY2xpZW50UHJvamVjdFR5cGVJZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0VHlwZUlkKFN0cmluZyBjbGllbnRQcm9qZWN0VHlwZUlkKQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0VHlwZUlkID0gY2xpZW50UHJvamVjdFR5cGVJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmVyRmFjdG9yeUlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0gIHsKLSAgCXNlcnZlckZhY3RvcnlJZF8gPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uKFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAJajJlZVZlcnNpb25fID0gajJlZVZlcnNpb247CQotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5lZWRFQVIoYm9vbGVhbiBuZWVkRUFSKQotICB7Ci0gICAgbmVlZEVBUl8gPSBuZWVkRUFSOwotICB9ICAgIAotICAKLSAgcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXJJZChTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJZCkKLSAgewotICAgIGV4aXN0aW5nU2VydmVySWRfID0gZXhpc3RpbmdTZXJ2ZXJJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QWRkZWRQcm9qZWN0VG9TZXJ2ZXIoYm9vbGVhbiBhZGRlZFByb2plY3RUb1NlcnZlcikgCi0gIHsKLSAgICBhZGRlZFByb2plY3RUb1NlcnZlcl8gPSBhZGRlZFByb2plY3RUb1NlcnZlcjsKLSAgfSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVFQVJQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVFQVJQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJjZWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRUFSQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LklTZXJ2ZXJUYXJnZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIGVhclByb2plY3ROYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmFjdG9yeUlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb25fOyAgCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVFQVJQcm9qZWN0Q29tbWFuZCIsICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQiKTsKLSAgICAvL3NldFJ1bkluV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLQlNZXNzYWdlVXRpbHMgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi5wbHVnaW4iLCB0aGlzICk7Ci0JCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhcHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgaW5mbyA9IG5ldyBFQVJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgcHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgLy9TZXQgdGhlIEoyRUUgdmVyc2lvbgotICAgICAgICBTdHJpbmcgZmluYWxKMkVFVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIGlmIChqMmVlVmVyc2lvbl8gIT0gbnVsbCAmJiBqMmVlVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQ09NUE9ORU5UX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGoyZWVWZXJzaW9uXykpOwotICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBqMmVlVmVyc2lvbl87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFQVJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5DT01QT05FTlRfVkVSU0lPTiwgbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKTsKLSAgICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL1NldCB0aGUgc2VydmVyIHRhcmdldAotICAgICAgICBpZiAoc2VydmVyRmFjdG9yeUlkXyE9bnVsbCAmJiBzZXJ2ZXJGYWN0b3J5SWRfLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLS8vCQkJVE9ETyAtIEFkZCB0aGlzIGxvZ2ljIHRvIEZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsLCBhbmQgb3AuLi4uCi0vLyAgICAgICAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8sIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuRUFSX1RZUEUsIGZpbmFsSjJFRVZlcnNpb24pOyAKLS8vICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuU0VSVkVSX1RBUkdFVF9JRCwgcnVudGltZVRhcmdldElkICk7Ci0vLyAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9TRVJWRVJfVEFSR0VULCBCb29sZWFuLlRSVUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9DcmVhdGUgdGhlIEVBUgotICAgICAgICBFQVJDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgRUFSQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24oaW5mbyk7Ci0gICAgICAgIG9wZXJhdGlvbi5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9FQVJfUFJPSkVDVCIsIG5ldyBTdHJpbmdbXSB7ZWFyUHJvamVjdE5hbWVffSksIFN0YXR1cy5FUlJPUiwgaXRlKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9FQVJfUFJPSkVDVCIsIG5ldyBTdHJpbmdbXSB7ZWFyUHJvamVjdE5hbWVffSksIFN0YXR1cy5FUlJPUiwgaWUpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gZWFyUHJvamVjdE5hbWVfIFRoZSBlYXJQcm9qZWN0TmFtZV8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdE5hbWUoU3RyaW5nIGVhclByb2plY3ROYW1lKQotICB7Ci0gICAgdGhpcy5lYXJQcm9qZWN0TmFtZV8gPSBlYXJQcm9qZWN0TmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gIAlzZXJ2ZXJGYWN0b3J5SWRfID0gc2VydmVyRmFjdG9yeUlkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgCWoyZWVWZXJzaW9uXyA9IGoyZWVWZXJzaW9uOwkKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUVKQlByb2plY3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUVKQlByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTM1YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVFSkJQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuYXJjaGl2ZW9wZXJhdGlvbnMuRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLmFyY2hpdmVvcGVyYXRpb25zLkVqYkNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnNlcnZlcnRhcmdldC5JU2VydmVyVGFyZ2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRUpCUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBMQUJFTCA9ICIlVEFTS19MQUJFTF9DUkVBVEVfRUpCX1BST0pFQ1QiOwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiJVRBU0tfREVTQ19DUkVBVEVfRUpCX1BST0pFQ1QiOwotICBwcml2YXRlIGJvb2xlYW4gaXNFSkJQcm9qZWN0UmVxdWlyZWRfID0gdHJ1ZTsKLSAgcHJpdmF0ZSBTdHJpbmcgZWpiUHJvamVjdE5hbWVfID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgZWFyUHJvamVjdE5hbWVfID0gbnVsbDsKLSAgCi0gIHByaXZhdGUgSVByb2plY3Qgc2VydmljZVByb2plY3Q7Ci0gIHByaXZhdGUgSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckZhY3RvcnlJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uXzsgIAotICAKLSAKLSAgcHVibGljIENyZWF0ZUVKQlByb2plY3RDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKExBQkVMLCBERVNDUklQVElPTik7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIENyZWF0ZUVKQlByb2plY3RUYXNrLgotICAgKiBAcGFyYW0gYXJnMAotICAgKiBAcGFyYW0gYXJnMQotICAgKi8KLSAgcHVibGljIENyZWF0ZUVKQlByb2plY3RDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2MpCi0gIHsKLSAgICBzdXBlcihsYWJlbCwgZGVzYyk7Ci0gICAgLy9zZXRSdW5JbldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICB0cnkKLSAgIHsKLSAgICBpZiAoZWpiUHJvamVjdE5hbWVfICE9IG51bGwgJiYgZWpiUHJvamVjdE5hbWVfLmxlbmd0aCgpID4gMCAmJiBlYXJQcm9qZWN0TmFtZV8gIT0gbnVsbCAmJiBlYXJQcm9qZWN0TmFtZV8ubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBjcmVhdGVFSkJQcm9qZWN0KGVqYlByb2plY3ROYW1lXywgZWFyUHJvamVjdE5hbWVfLCBlbnYpOwotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgCi0gICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAKLSAgICB9Ci0KLSAgICAvLyBHZXQgd2ViIHByb2plY3QgYW5kIGZvcm0gZWpiUHJvamVjdE5hbWUKLSAgICBpZiAoIWlzRUpCUHJvamVjdFJlcXVpcmVkXykKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICAKLSAgICBpZiAoZWpiUHJvamVjdE5hbWVfID09IG51bGwpCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgCi0gICAgLy8gRUpCIFByb2plY3QgYWxyZWFkeSBleGlzdHMKLSAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IEoyRUVQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZWpiUHJvamVjdE5hbWVfKTsKLSAgICBpZiAoY29udGFpbmVyLmV4aXN0cygpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgRUpCUHJvamVjdEluZm8KLSAgICBFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCBwcm9qZWN0SW5mbyA9IG5ldyBFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpOwotICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KCBFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5QUk9KRUNUX05BTUUsIGVqYlByb2plY3ROYW1lXyApOwotICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNSRUFURV9ERUZBVUxUX1NFU1NJT05fQkVBTixCb29sZWFuLlRSVUUpOwotCi0gICAgU3RhdHVzIHN0YXR1czsKLSAgICBpZiAoZWFyUHJvamVjdE5hbWVfICE9IG51bGwpCi0gICAgICBzdGF0dXMgPSBhZGRFQVJUb1Byb2plY3QoZWFyUHJvamVjdE5hbWVfLCBwcm9qZWN0SW5mbyk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHN0YXR1cyA9IGFkZEVBUlRvUHJvamVjdChzZXJ2aWNlUHJvamVjdCwgcHJvamVjdEluZm8sIGVudik7Ci0gICAgfQotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgIH0KLSAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgfQotICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdGF0dXMgYWRkRUFSVG9Qcm9qZWN0KFN0cmluZyBlYXJQcm9qZWN0TmFtZSwgRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgcHJvamVjdEluZm8pCi0gIHsKLSAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLSAgICAvLyBJUHJvamVjdCBlYXJQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lKTsKLSAgICAvLyBpZiAoIWVhclByb2plY3QuZXhpc3RzKCkpCi0gICAgeyAgICAJCi0gICAgICBFQVJOYXR1cmVSdW50aW1lIGVhciA9IG51bGw7Ci0gICAgICBpZiAoajJlZVZlcnNpb25fIT1udWxsICYmIGoyZWVWZXJzaW9uXy5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgCWVhciA9IEoyRUVVdGlscy5nZXRFQVIoSW50ZWdlci5wYXJzZUludChqMmVlVmVyc2lvbl8pKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWFyID0gSjJFRVV0aWxzLmdldDEzRUFSKCk7ICAgICAgCi0gICAgICAgIGlmIChlYXIgIT0gbnVsbCkKLSAgICAgICAgICBlYXJQcm9qZWN0ID0gZWFyLmdldFByb2plY3QoKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWFyID0gSjJFRVV0aWxzLmdldDEyRUFSKCk7Ci0gICAgICAgICAgaWYgKGVhciAhPSBudWxsKQotICAgICAgICAgICAgZWFyUHJvamVjdCA9IGVhci5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5FQVJfTU9EVUxFX05BTUUsIGVhclByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfVE9fRUFSLCBCb29sZWFuLlRSVUUpOwotICAgIAotICAgIC8vU2V0IHRoZSBKMkVFIHZlcnNpb24KLSAgICBTdHJpbmcgZmluYWxKMkVFVmVyc2lvbiA9IG51bGw7ICAgIAotICAgIGlmIChqMmVlVmVyc2lvbl8gIT0gbnVsbCAmJiBqMmVlVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICB7Ci0gICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5KMkVFX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGoyZWVWZXJzaW9uXykpOwotICAgICAgZmluYWxKMkVFVmVyc2lvbiA9IGoyZWVWZXJzaW9uXzsKLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZWFyUHJvamVjdCAhPSBudWxsICYmIGVhclByb2plY3QuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIEVBUk5hdHVyZVJ1bnRpbWUgZWFyID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKGVhclByb2plY3QpOwotICAgICAgICBpbnQgZWFyVmVyc2lvbiA9IGVhci5nZXRKMkVFVmVyc2lvbigpOwotICAgICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5KMkVFX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGVhclZlcnNpb24pKTsKLSAgICAgICAgZmluYWxKMkVFVmVyc2lvbiA9IFN0cmluZy52YWx1ZU9mKGVhclZlcnNpb24pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5KMkVFX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKSk7Ci0gICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0gICAgICB9ICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWRfIT1udWxsICYmIHNlcnZlckZhY3RvcnlJZF8ubGVuZ3RoKCk+MCkKLSAgICB7Ci0JCS8vCQlUT0RPIC0gQWRkIHRoaXMgbG9naWMgdG8gRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwsIGFuZCBvcC4uLi4KLS8vICAgICAgU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldElkRnJvbUZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWRfLCBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkVKQl9UWVBFLCBqMmVlVmVyc2lvbl8pOyAKLS8vICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuU0VSVkVSX1RBUkdFVF9JRCwgcnVudGltZVRhcmdldElkICk7Ci0vLyAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9TRVJWRVJfVEFSR0VULCBCb29sZWFuLlRSVUUpOwotICAgIH0KLQotICAgIEVqYkNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uIGVqYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvbiA9IG5ldyBFamJDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbihwcm9qZWN0SW5mbyk7ICAgIAkKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGVqYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JICAKLSAgICB9Ci0gICAgY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUpCX1BST0pFQ1QiKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9FSkJfUFJPSkVDVCIpLCBTdGF0dXMuRVJST1IsIGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdGF0dXMgYWRkRUFSVG9Qcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0LCBFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCBwcm9qZWN0SW5mbywgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgICAgIEVBUk5hdHVyZVJ1bnRpbWUgZWFyID0gbnVsbDsKLSAgICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gYWRkU2VydmljZUVBUlRvU2VydmVyID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gYWRkRGlzY292ZXJlZEVBUlRvU2VydmVyID0gZmFsc2U7Ci0gICAgICAgIElTZXJ2ZXIgZGlzY292ZXJlZEVBUnNTZXJ2ZXIgPSBudWxsOwotICAgICAgICBFQVJOYXR1cmVSdW50aW1lW10gZWFycyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cyhzZXJ2aWNlUHJvamVjdCk7Ci0gICAgICAgIHRyeSB7ICAgIAkKLSAgICAgIAotCSAgICBpZiAoZWFycyE9bnVsbCAmJiBlYXJzLmxlbmd0aCA+PSAxKSB7Ci0JICAgICAgZWFyID0gZWFyc1swXTsgICAgICAKLSAgICAgICAgICAgICBlYXJQcm9qZWN0ID0gZWFyLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICBpZiAoc2VydmljZUV4aXN0aW5nU2VydmVyICE9IG51bGwpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLSAgICAgICAgICAgICAgICAgc2VydmljZUV4aXN0aW5nU2VydmVyLnN5bmNocm9ub3VzU3RvcChmYWxzZSk7ICAgICAKLSAgICAgICAgICAgICAgIFN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIHNlcnZpY2VFeGlzdGluZ1NlcnZlciwgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUoZWFyUHJvamVjdCksIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgICAgICAgICAJcmV0dXJuIG1tU3RhdHVzOwotICAgICAgICAgICAgICAgYWRkU2VydmljZUVBUlRvU2VydmVyID0gdHJ1ZTsKLSAgICAgICAgICAgICB9Ci0KLQkgICAgfQotCSAgICBlbHNlIHsKLQkgICAgICAvL0NoZWNrIHRvIHNlZSBpZiBhbnkgZWxpZ2libGUgRUFScyBleGlzdCBpbiB0aGUgd29ya3NwYWNlLgotCSAgICAgIGVhciA9IEoyRUVVdGlscy5nZXQxMkVBUigpOwotCSAgICAgIGlmIChlYXIhPW51bGwpCi0JICAgICAgewotCSAgICAgIAllYXJQcm9qZWN0ID0gZWFyLmdldFByb2plY3QoKTsKLQotCSAgICAgIAkvLyBBZGQgZGVmYXVsdCBzZXJ2ZXIKLSAgICAgICAgICAgICAgSVNlcnZlciBkZWZhdWx0U2VydmVyID0gU2VydmVyVXRpbHMuZ2V0RGVmYXVsdEV4aXN0aW5nU2VydmVyKGVhclByb2plY3QpOyAgICAKLSAgICAgICAgICAgICAgaWYgKGRlZmF1bHRTZXJ2ZXIhPW51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgCWlmIChkZWZhdWx0U2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICAgICAgCSBkZWZhdWx0U2VydmVyLnN5bmNocm9ub3VzU3RvcChmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAJIH0KLSAgICAgICAgICAgICAgCVN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIGRlZmF1bHRTZXJ2ZXIsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgICAgICAgICAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAgICAgICAgICAgCQotCQkJYWRkRGlzY292ZXJlZEVBUlRvU2VydmVyID0gdHJ1ZTsKLQkJCWRpc2NvdmVyZWRFQVJzU2VydmVyID0gZGVmYXVsdFNlcnZlcjsJCQkKLSAgICAgICAgICAgICAgIH0KLQkgICAgICAgfQotCSAgICB9Ci0JICAgIAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9FSkJfUFJPSkVDVCIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgICAgICB9Ci0JICAgICAgCi0gICAgICBJUHJvamVjdCBlamJQcm9qZWN0ID0gbnVsbDsKLSAgICAgIC8vQWRkIHRoZSBwcm9qZWN0IGJhY2sgdG8gdGhlIFNlcnZlciBjb25maWcKLSAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkVBUl9NT0RVTEVfTkFNRSwgZWFyUHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1RPX0VBUiwgQm9vbGVhbi5UUlVFKTsJCi0gICAgICBFamJDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbiBlamJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24gPSBuZXcgRWpiQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24ocHJvamVjdEluZm8pOyAgICAJCi0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGVqYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUpCX1BST0pFQ1QiKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0VKQl9QUk9KRUNUIiksIFN0YXR1cy5FUlJPUiwgZXgpOyAgICAKLSAgICAgIH0gCi0KLSAgICAgIC8vZWpiUHJvamVjdCA9IHByb2plY3RJbmZvLnByaW1HZXRQcm9qZWN0KCk7Ci0KLSAgICAgIC8vQWRkIHRoZSBwcm9qZWN0IGJhY2sgdG8gdGhlIFNlcnZlciBjb25maWcKLSAgICAgIGlmIChhZGRTZXJ2aWNlRUFSVG9TZXJ2ZXIpCi0gICAgICB7Ci0gICAgICAJU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgc2VydmljZUV4aXN0aW5nU2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAKLSAgICAgIH0KLSAgICAgIGlmIChhZGREaXNjb3ZlcmVkRUFSVG9TZXJ2ZXIpCi0gICAgICB7Ci0gICAgICAJU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgZGlzY292ZXJlZEVBUnNTZXJ2ZXIsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgICAgCXJldHVybiBtbVN0YXR1czsgIAotICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdGF0dXMgY3JlYXRlRUpCUHJvamVjdChTdHJpbmcgZWpiUHJvamVjdE5hbWUsIFN0cmluZyBlYXJQcm9qZWN0TmFtZSwgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lKTsKLSAgICAgIGlmIChlYXJQcm9qZWN0ICE9IG51bGwgJiYgIWVhclByb2plY3QuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIENyZWF0ZUVBUlByb2plY3RDb21tYW5kIGMgPSBuZXcgQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQoKTsKLSAgICAgICAgYy5zZXRFYXJQcm9qZWN0TmFtZShlYXJQcm9qZWN0TmFtZSk7Ci0gICAgICAgIGMuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOwotICAgICAgICBjLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXyk7Ci0gICAgICAgIGMuZXhlY3V0ZShlbnYpOwotICAgICAgICBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lKTsKLSAgICAgIH0KLSAgICAgIElQcm9qZWN0IGVqYlByb2plY3QgPSByb290LmdldFByb2plY3QoZWpiUHJvamVjdE5hbWUpOwotICAgICAgaWYgKGVqYlByb2plY3QgIT0gbnVsbCAmJiAhZWpiUHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgaW5mbyA9IG5ldyBFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgZWpiUHJvamVjdE5hbWUpOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkVBUl9NT0RVTEVfTkFNRSwgZWFyUHJvamVjdE5hbWUpOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9UT19FQVIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIAotICAgICAgICBpbmZvLnNldFByb3BlcnR5KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNSRUFURV9ERUZBVUxUX1NFU1NJT05fQkVBTixCb29sZWFuLlRSVUUpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvL1NldCB0aGUgSjJFRSB2ZXJzaW9uCi0gICAgICAgIFN0cmluZyBmaW5hbEoyRUVWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGoyZWVWZXJzaW9uXyAhPSBudWxsICYmIGoyZWVWZXJzaW9uXy5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5KMkVFX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGoyZWVWZXJzaW9uXykpOwotICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBqMmVlVmVyc2lvbl87Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZWFyUHJvamVjdCAhPSBudWxsICYmIGVhclByb2plY3QuZXhpc3RzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgRUFSTmF0dXJlUnVudGltZSBlYXIgPSBFQVJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUoZWFyUHJvamVjdCk7Ci0gICAgICAgICAgICBpbnQgZWFyVmVyc2lvbiA9IGVhci5nZXRKMkVFVmVyc2lvbigpOwotICAgICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5KMkVFX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGVhclZlcnNpb24pKTsKLSAgICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihlYXJWZXJzaW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpOwotICAgICAgICAgICAgZmluYWxKMkVFVmVyc2lvbiA9IFN0cmluZy52YWx1ZU9mKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLSAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vU2V0IHRoZSBzZXJ2ZXIgdGFyZ2V0Ci0gICAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWRfIT1udWxsICYmIHNlcnZlckZhY3RvcnlJZF8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotLy8JCQlUT0RPIC0gQWRkIHRoaXMgbG9naWMgdG8gRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwsIGFuZCBvcC4uLi4KLS8vICAgICAgICAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJUYXJnZXRJZEZyb21GYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXyxJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkVKQl9UWVBFLCBmaW5hbEoyRUVWZXJzaW9uKTsgCi0vLyAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlNFUlZFUl9UQVJHRVRfSUQsIHJ1bnRpbWVUYXJnZXRJZCApOwotLy8gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfU0VSVkVSX1RBUkdFVCwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBFSkIgUHJvamVjdAotICAgICAgICBFamJDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgRWpiQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24oaW5mbyk7Ci0gICAgICAgIG9wZXJhdGlvbi5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIGFkZCBFQVIgdG8gU2VydmVyCi0gICAgICBpZiAoc2VydmljZUV4aXN0aW5nU2VydmVyIT1udWxsKXsKLSAgICAgICAgYm9vbGVhbiBlYXJBZGRlZFRvU2VydmVyID0gU2VydmVyVXRpbC5jb250YWluc01vZHVsZShzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIsUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUoZWFyUHJvamVjdCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFlYXJBZGRlZFRvU2VydmVyKSB7Ci0gICAgICAgICAgU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgc2VydmljZUV4aXN0aW5nU2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSAsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOyAgCi0gICAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAgIAotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgCi0gICAgfQotICAgIGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUpCX1BST0pFQ1QiKSwgU3RhdHVzLkVSUk9SLCBpdGUpOwotICAgIH0KLSAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0VKQl9QUk9KRUNUIiksIFN0YXR1cy5FUlJPUiwgaWUpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gZWFyUHJvamVjdE5hbWUgVGhlIGVhclByb2plY3ROYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVhclByb2plY3ROYW1lKFN0cmluZyBlYXJQcm9qZWN0TmFtZSkKLSAgewotICAgIHRoaXMuZWFyUHJvamVjdE5hbWVfID0gZWFyUHJvamVjdE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGVqYlByb2plY3ROYW1lIFRoZSBlamJQcm9qZWN0TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFamJQcm9qZWN0TmFtZShTdHJpbmcgZWpiUHJvamVjdE5hbWUpCi0gIHsKLSAgICB0aGlzLmVqYlByb2plY3ROYW1lXyA9IGVqYlByb2plY3ROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBpc0VKQlByb2plY3RSZXF1aXJlZCBUaGUgaXNFSkJQcm9qZWN0UmVxdWlyZWQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RUpCUHJvamVjdFJlcXVpcmVkKGJvb2xlYW4gaXNFSkJQcm9qZWN0UmVxdWlyZWQpCi0gIHsKLSAgICB0aGlzLmlzRUpCUHJvamVjdFJlcXVpcmVkXyA9IGlzRUpCUHJvamVjdFJlcXVpcmVkOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBlamJQcm9qZWN0TmFtZSBUaGUgZWpiUHJvamVjdE5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RUpCUHJvamVjdE5hbWUoU3RyaW5nIGVqYlByb2plY3ROYW1lKSB7Ci0gICAgdGhpcy5lamJQcm9qZWN0TmFtZV8gPSBlamJQcm9qZWN0TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2VydmljZUV4aXN0aW5nU2VydmVyIFRoZSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKSB7Ci0gICAgdGhpcy5zZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHNlcnZpY2VQcm9qZWN0IFRoZSBzZXJ2aWNlUHJvamVjdCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkgewotICAgIHRoaXMuc2VydmljZVByb2plY3QgPSBzZXJ2aWNlUHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmVyRmFjdG9yeUlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0gIHsKLSAgCXNlcnZlckZhY3RvcnlJZF8gPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uKFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAJajJlZVZlcnNpb25fID0gajJlZVZlcnNpb247CQotICB9ICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVKYXZhUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlSmF2YVByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMWEwMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVKYXZhUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVKYXZhUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lXzsKLQotICAvKioKLSAgICogRGVmYXVsdCBDVE9SCi0gICAqLwotICBwdWJsaWMgQ3JlYXRlSmF2YVByb2plY3RDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlSmF2YVByb2plY3RDb21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVKYXZhUHJvamVjdENvbW1hbmQiKTsKLSAgICAvL3NldFJ1bkluV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lXyk7Ci0gICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhcHJvamVjdC5leGlzdHMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgTnVsbFByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgcHJvamVjdC5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLm5ld1Byb2plY3REZXNjcmlwdGlvbihwcm9qZWN0LmdldE5hbWUoKSksIG1vbml0b3IpOwotICAgICAgICBwcm9qZWN0Lm9wZW4obW9uaXRvcik7Ci0gICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgZGVzYy5zZXROYXR1cmVJZHMobmV3IFN0cmluZ1tdIHtKYXZhQ29yZS5OQVRVUkVfSUR9KTsKLSAgICAgICAgSUNvbW1hbmQgY21kID0gZGVzYy5uZXdDb21tYW5kKCk7Ci0gICAgICAgIGNtZC5zZXRCdWlsZGVyTmFtZShKYXZhQ29yZS5CVUlMREVSX0lEKTsKLSAgICAgICAgZGVzYy5zZXRCdWlsZFNwZWMobmV3IElDb21tYW5kW10ge2NtZH0pOwotICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2MsIG1vbml0b3IpOwotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0gICAgICAgIFBhdGggcHJvamVjdFJvb3QgPSBuZXcgUGF0aChQYXRoLlJPT1QuYXBwZW5kKG5ldyBQYXRoKHByb2plY3QuZ2V0TmFtZSgpKSkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXcgSUNsYXNzcGF0aEVudHJ5W10ge0phdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHByb2plY3RSb290KSwgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkobmV3IFBhdGgoSmF2YVJ1bnRpbWUuSlJFX0NPTlRBSU5FUikpfSwgbW9uaXRvcik7Ci0gICAgICAgIGphdmFQcm9qZWN0LnNldE91dHB1dExvY2F0aW9uKHByb2plY3RSb290LCBtb25pdG9yKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfSkFWQV9QUk9KRUNUIiwgbmV3IFN0cmluZ1tdIHtwcm9qZWN0TmFtZV99KSwgU3RhdHVzLkVSUk9SLCBjZSk7Ci0gICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpCi0gIHsKLSAgICBwcm9qZWN0TmFtZV8gPSBwcm9qZWN0TmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVNb2R1bGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZU1vZHVsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0Y2IxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZU1vZHVsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTW9kdWxlQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBXRUIgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IEVKQiA9IDE7Ci0JcHVibGljIHN0YXRpYyBpbnQgQVBQQ0xJRU5UID0gMjsKLQlwdWJsaWMgc3RhdGljIGludCBFQVIgPSAzOwotCQotCXByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotCXByaXZhdGUgU3RyaW5nIG1vZHVsZU5hbWU7Ci0JcHJpdmF0ZSBpbnQgbW9kdWxlVHlwZTs7Ci0JcHJpdmF0ZSBTdHJpbmcgajJlZUxldmVsOwotCXByaXZhdGUgU3RyaW5nIHNlcnZlckZhY3RvcnlJZDsKLQkKLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCXsKLQkJLy9yc2sgdG9kbwotCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlTmFtZShTdHJpbmcgbW9kdWxlTmFtZSkKLQl7Ci0JCXRoaXMubW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7Ci0JfQkKLQotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlVHlwZSgpCi0JewotCQlyZXR1cm4gbW9kdWxlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVUeXBlKGludCBtb2R1bGVUeXBlKQotCXsKLQkJdGhpcy5tb2R1bGVUeXBlID0gbW9kdWxlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpCi0JewotCQl0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SjJlZUxldmVsKFN0cmluZyBsZXZlbCkKLQl7Ci0JCWoyZWVMZXZlbCA9IGxldmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotCXsKLQkJdGhpcy5zZXJ2ZXJGYWN0b3J5SWQgPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZU1vbml0b3JDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZU1vbml0b3JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NTFjN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVNb25pdG9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNb25pdG9yZWRTZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJNb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSVNlcnZlck1vbml0b3JNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTW9uaXRvckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1NFUlZJQ0VTID0gIldlYiBzZXJ2aWNlcyI7Ci0KLSAgcHJpdmF0ZSBCb29sZWFuIG1vbml0b3JTZXJ2aWNlOwotCi0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkOwotCi0gIHByaXZhdGUgSW50ZWdlciBtb25pdG9yZWRQb3J0OwotCi0gIHB1YmxpYyBDcmVhdGVNb25pdG9yQ29tbWFuZCgpIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZU1vbml0b3JDb21tYW5kIiwKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVNb25pdG9yQ29tbWFuZCIpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotICAgIGlmIChtb25pdG9yU2VydmljZSAhPSBudWxsICYmIG1vbml0b3JTZXJ2aWNlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2aWNlU2VydmVySW5zdGFuY2VJZCk7Ci0gICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKLQotICAgICAgICAvLyBJTW9uaXRvcmFibGVTZXJ2ZXIgbW9uaXRvcmFibGVTZXJ2ZXIgPSAoSU1vbml0b3JhYmxlU2VydmVyKQotICAgICAgICAvLyBzZXJ2ZXJEZWxlZ2F0ZTsKLSAgICAgICAgU2VydmVyUG9ydFtdIHBvcnRzID0gc2VydmVyLmdldFNlcnZlclBvcnRzKCk7Ci0gICAgICAgIFNlcnZlclBvcnQgcG9ydCA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGl0ID0gMDsgaXQgPCBwb3J0cy5sZW5ndGg7IGl0KyspIHsKLSAgICAgICAgICBTZXJ2ZXJQb3J0IHAgPSBwb3J0c1tpdF07Ci0gICAgICAgICAgU3RyaW5nIHByb3RvY29sID0gcC5nZXRQcm90b2NvbCgpOwotICAgICAgICAgIGlmIChwcm90b2NvbCAhPSBudWxsICYmIHByb3RvY29sLnRyaW0oKS50b0xvd2VyQ2FzZSgpLmVxdWFscygiaHR0cCIpKSB7Ci0gICAgICAgICAgICBwb3J0ID0gcDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgSVNlcnZlck1vbml0b3JNYW5hZ2VyIHNlcnZlck1vbml0b3JNYW5hZ2VyID0gU2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICBJTW9uaXRvcmVkU2VydmVyUG9ydFtdIG1vbml0b3JlZFBvcnRzID0gc2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0TW9uaXRvcmVkUG9ydHMoc2VydmVyKTsKLSAgICAgICAgICBmb3IgKGludCBpdDIgPSAwOyBpdDIgPCBtb25pdG9yZWRQb3J0cy5sZW5ndGg7IGl0MisrKSB7Ci0gICAgICAgICAgICBJTW9uaXRvcmVkU2VydmVyUG9ydCBpbXNQb3J0ID0gbW9uaXRvcmVkUG9ydHNbaXQyXTsKLSAgICAgICAgICAgIGlmIChwb3J0LmdldFBvcnQoKSA9PSBpbXNQb3J0LmdldFNlcnZlclBvcnQoKS5nZXRQb3J0KCkgJiYgaGFzQ29udGVudFdlYlNlcnZpY2VzKGltc1BvcnQpKSAvLyBwb3J0Ci0gICAgICAgICAgICAvLyBhbHJlYWR5Ci0gICAgICAgICAgICAvLyBiZWluZwotICAgICAgICAgICAgLy8gbW9uaXRvcmVkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICghaW1zUG9ydC5pc1N0YXJ0ZWQoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICBzZXJ2ZXJNb25pdG9yTWFuYWdlci5zdGFydE1vbml0b3IoaW1zUG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICBTdGF0dXMgZXJyb3IgPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SIiwKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBTdHJpbmcudmFsdWVPZihwb3J0LmdldFBvcnQoKSksIHNlcnZlci5nZXROYW1lKCl9KSwgU3RhdHVzLkVSUk9SLCBjZSk7Ci0gICAgICAgICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKGVycm9yKTsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbW9uaXRvcmVkUG9ydCA9IG5ldyBJbnRlZ2VyKGltc1BvcnQuZ2V0TW9uaXRvclBvcnQoKSk7Ci0gICAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElNb25pdG9yZWRTZXJ2ZXJQb3J0IGltc1BvcnQgPSBzZXJ2ZXJNb25pdG9yTWFuYWdlci5jcmVhdGVNb25pdG9yKHNlcnZlciwgcG9ydCwgLTEsIG5ldyBTdHJpbmdbXSB7IFdFQl9TRVJWSUNFU30pOwotICAgICAgICAgICAgc2VydmVyTW9uaXRvck1hbmFnZXIuc3RhcnRNb25pdG9yKGltc1BvcnQpOwotICAgICAgICAgICAgbW9uaXRvcmVkUG9ydCA9IG5ldyBJbnRlZ2VyKGltc1BvcnQuZ2V0TW9uaXRvclBvcnQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgICAgICAgICBTdGF0dXMgZXJyb3IgPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SIiwgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihwb3J0LmdldFBvcnQoKSksIHNlcnZlci5nZXROYW1lKCl9KSwgU3RhdHVzLkVSUk9SLCBjZSk7Ci0gICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKGVycm9yKTsKLSAgICAgICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgICAgICAgU3RhdHVzIGluZm8gPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0lORk9fTU9OSVRPUklOR19OT1RfU1VQUE9SVEVEIiwKLSAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgc2VydmVyLmdldE5hbWUoKX0pLCBTdGF0dXMuSU5GTyk7Ci0gICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRJbmZvKGluZm8pOwotICAgICAgICAgIHJldHVybiBpbmZvOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBoYXNDb250ZW50V2ViU2VydmljZXMoSU1vbml0b3JlZFNlcnZlclBvcnQgaW1zUG9ydCkgewotICAgIFN0cmluZ1tdIGNvbnRlbnRzID0gaW1zUG9ydC5nZXRDb250ZW50VHlwZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRzLmxlbmd0aDsgaSsrKQotICAgICAgaWYgKFdFQl9TRVJWSUNFUy5lcXVhbHMoY29udGVudHNbaV0pKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXIpIHsKLSAgICB0aGlzLnNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkID0gdHlwZVJ1bnRpbWVTZXJ2ZXIuZ2V0U2VydmVySW5zdGFuY2VJZCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVNlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkKSB7Ci0gICAgdGhpcy5zZXJ2aWNlU2VydmVySW5zdGFuY2VJZCA9IHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkOwotICB9Ci0KLSAgcHVibGljIEludGVnZXIgZ2V0TW9uaXRvcmVkUG9ydCgpIHsKLSAgICByZXR1cm4gbW9uaXRvcmVkUG9ydDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3JTZXJ2aWNlKEJvb2xlYW4gdmFsdWUpIHsKLSAgICBtb25pdG9yU2VydmljZSA9IHZhbHVlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVTZXJ2ZXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZVNlcnZlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzMzg0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZVNlcnZlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlU2VydmVyQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLQlwcml2YXRlIFN0cmluZyBzZXJ2ZXJGYWN0b3J5aWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmVySW5zdGFuY2VJZDsKLQkKLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCXsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlpZChTdHJpbmcgc2VydmVyRmFjdG9yeWlkKQotCXsKLQkJdGhpcy5zZXJ2ZXJGYWN0b3J5aWQgPSBzZXJ2ZXJGYWN0b3J5aWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJbnN0YW5jZUlkKCkKLQl7Ci0JCXJldHVybiBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2NmNTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5XZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVJ1bm5pbmdBY3Rpb25TZXJ2ZXI7Ci0KLS8qKgotICogCi0gKiAKLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNFSkIgPSBmYWxzZTsgIC8vIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiBwZXJoYXBzCi0gIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlc1dlYiA9IGZhbHNlOwotICBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgZWFyUHJvamVjdE5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIGV4aXN0aW5nU2VydmVySWQ7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckZhY3RvcnlJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uXzsgIAotICBwcml2YXRlIGJvb2xlYW4gbmVlZEVBUl87Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1NlcnZpY2VQcm9qZWN0RUpCXz0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBhZGRlZFByb2plY3RUb1NlcnZlcl8gPSBmYWxzZTsKLQotICBwcml2YXRlIElTZXJ2ZXIgZkV4aXN0aW5nU2VydmVyID0gbnVsbDsKLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUgotICAgKi8KLSAgcHVibGljIENyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZCgpIHsKLQotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kIiwKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQiKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvYWJsZSgpewotICAJcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHVuZG8oRW52aXJvbm1lbnQgZW52KXsKLSAgCVN0YXR1cyBzdGF0ID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgdHJ5CXsKLSAgICAJCi0gICAgICAvLyBjaGVjayBleGlzdGluZ1NlcnZlcgotICAgICAgaWYgKGZFeGlzdGluZ1NlcnZlciE9bnVsbCkgewotCi0gICAgICAgIC8vIGdldCBFQVIgcHJvamVjdAotICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IG51bGw7Ci0gICAgICAgIGlmIChlYXJQcm9qZWN0TmFtZSE9bnVsbCAmJiBlYXJQcm9qZWN0TmFtZS5sZW5ndGgoKT4wKSB7Ci0gICAgICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZSk7Ci0gICAgCX0gICAgCi0gICAgICAgIAotICAgIAlBYnN0cmFjdFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyQ29tbWFuZCA9IG51bGw7Ci0gICAgCVdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgCXN0YXJ0U2VydmVyQ29tbWFuZCA9IChBYnN0cmFjdFN0YXJ0U2VydmVyKXJlZy5nZXRTZXJ2ZXJTdGFydEJ5VHlwZUlkKGZFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgCWlmIChlYXJQcm9qZWN0IT1udWxsKSB7Ci0gICAgCQlzdGFydFNlcnZlckNvbW1hbmQucnVuUG9zdFNlcnZlckNvbmZpZyhmRXhpc3RpbmdTZXJ2ZXIsIGVhclByb2plY3QpOwotICAgIAl9Ci0gICAgICB9Ci0gICAJfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlICkgewotICAgICAgSVN0YXR1cyBlbWJlZGRlZFN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgc3RhdCA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXQpOwotICAJCXJldHVybiBzdGF0OwotICAJfSAgCQotICAJCi0gIAlyZXR1cm4gc3RhdDsKLSAgfSAgCi0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0JCi0gICAgaWYgKHByb2plY3ROYW1lID09IG51bGwpIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB9Ci0gICAgCi0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLSAgICBJU2VydmVyIGV4aXN0aW5nU2VydmVyID0gbnVsbDsgICAgCi0gICAgZkV4aXN0aW5nU2VydmVyID0gbnVsbDsgCi0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVNlcnZlciB0aGlzU2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgICAgIElTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IG51bGw7Ci0gICAgICBTdHJpbmcgdGhpc1NlcnZlcklkID0gbnVsbDsKLSAgICAgIAotICAgICAgaWYgKHRoaXNTZXJ2ZXIhPW51bGwpIHsKLSAgICAgIAl3YyA9IHRoaXNTZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLSAgICAgIAl0aGlzU2VydmVySWQgPSAod2MhPW51bGwgPyB3Yy5nZXRJZCgpIDogbnVsbCk7Ci0gICAgICB9Ci0gICAgICBpZiAodGhpc1NlcnZlcklkLmVxdWFscyhleGlzdGluZ1NlcnZlcklkKSkgewotICAgICAgICBleGlzdGluZ1NlcnZlciA9IHRoaXNTZXJ2ZXI7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChpc1NlcnZpY2VQcm9qZWN0RUpCXykKLSAgICB7Ci0gICAgICBDcmVhdGVFSkJQcm9qZWN0Q29tbWFuZCBjID0gbmV3IENyZWF0ZUVKQlByb2plY3RDb21tYW5kKCk7Ci0gICAgICBjLnNldEVqYlByb2plY3ROYW1lKHByb2plY3ROYW1lKTsKLSAgICAgIGMuc2V0RWFyUHJvamVjdE5hbWUoZWFyUHJvamVjdE5hbWUpOwotICAgICAgYy5zZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIoZXhpc3RpbmdTZXJ2ZXIpOwotICAgICAgYy5zZXRTZXJ2ZXJGYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXyk7Ci0gICAgICBjLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXyk7Ci0gICAgICBzdGF0dXMgPSBjLmV4ZWN1dGUoZW52KTsKLSAgICB9IAotICAgIGVsc2UKLSAgICB7Ci0gICAgICBDcmVhdGVXZWJQcm9qZWN0Q29tbWFuZCBjID0gbmV3IENyZWF0ZVdlYlByb2plY3RDb21tYW5kKCk7Ci0gICAgICBjLnNldFByb2plY3ROYW1lKHByb2plY3ROYW1lKTsKLSAgICAgIGMuc2V0RWFyUHJvamVjdE5hbWUoZWFyUHJvamVjdE5hbWUpOwotICAgICAgYy5zZXRFeGlzdGluZ1NlcnZlcihleGlzdGluZ1NlcnZlcik7Ci0gICAgICBjLnNldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWRfKTsKLSAgICAgIGMuc2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb25fKTsKLSAgICAgIGMuc2V0TmVlZEVBUihuZWVkRUFSXyk7Ci0gICAgICBjLnNldEFkZGVkUHJvamVjdFRvU2VydmVyKGFkZGVkUHJvamVjdFRvU2VydmVyXyk7Ci0gICAgICBzdGF0dXMgPSBjLmV4ZWN1dGUoZW52KTsKLSAgICB9Ci0gICAgCi0gICAgdHJ5CXsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSBudWxsOwotICAgICAgICBpZiAoZWFyUHJvamVjdE5hbWUhPW51bGwgJiYgZWFyUHJvamVjdE5hbWUubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWUpOwotICAgICAgICB9ICAgIAkKLSAgICAJCi0gICAJCUFic3RyYWN0U3RhcnRTZXJ2ZXIgc3RhcnRTZXJ2ZXJDb21tYW5kID0gbnVsbDsKLSAgIAkJV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgCXN0YXJ0U2VydmVyQ29tbWFuZCA9IChBYnN0cmFjdFN0YXJ0U2VydmVyKXJlZy5nZXRTZXJ2ZXJTdGFydEJ5VHlwZUlkKGV4aXN0aW5nU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAJc3RhcnRTZXJ2ZXJDb21tYW5kLnJ1blByZVNlcnZlckNvbmZpZyhleGlzdGluZ1NlcnZlciwgZWFyUHJvamVjdCk7Ci0gICAgCWZFeGlzdGluZ1NlcnZlciA9IGV4aXN0aW5nU2VydmVyOwotICAgCX0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSApIHsKLSAgICAJSVN0YXR1cyBlbWJlZGRlZFN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgIAlzdGF0dXMgPSBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoZW1iZWRkZWRTdGF0dXMpOwotICAgIAllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gIAkJcmV0dXJuIHN0YXR1czsKLSAgCX0KLSAgICAKLSAgICAvLyBTdGFydCBzZXJ2ZXIgaWYgcmVxJ2QKLSAgICBJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBmRXhpc3RpbmdTZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsgICAgIAotICAgIGlmICh3YyE9bnVsbCl7Ci0gICAgICB0cnkgewotICAgICAgICBPYmplY3QgeCA9IGZFeGlzdGluZ1NlcnZlci5nZXRBZGFwdGVyKElSdW5uaW5nQWN0aW9uU2VydmVyLmNsYXNzKTsKLSAgICAgICAgaWYgKHghPW51bGwgJiYgeCBpbnN0YW5jZW9mIElSdW5uaW5nQWN0aW9uU2VydmVyKSB7Ci0gICAgICAgICAgaW50IHN0YXRlID0gZkV4aXN0aW5nU2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0gICAgICAgICAgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pIHsKLSAgICAgICAgICAgIFN0cmluZyBtb2RlID0gSUxhdW5jaE1hbmFnZXIuUlVOX01PREU7Ci0gICAgICAgICAgICBmRXhpc3RpbmdTZXJ2ZXIuc3luY2hyb25vdXNTdGFydChtb2RlLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZXgpIHsKLSAgICAJSVN0YXR1cyBlbWJlZGRlZFN0YXR1cyA9IGNleC5nZXRTdGF0dXMoKTsKLSAgICAJc3RhdHVzID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAJCXJldHVybiBzdGF0dXM7ICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIAotICAgCi0gIAkKLSAgCXJldHVybiBzdGF0dXM7ICAgIAotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBlYXJQcm9qZWN0TmFtZSBUaGUgZWFyUHJvamVjdE5hbWUgdG8gc2V0LgotICAgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdE5hbWUoU3RyaW5nIGVhclByb2plY3ROYW1lKSB7Ci0KLSAgICB0aGlzLmVhclByb2plY3ROYW1lID0gZWFyUHJvamVjdE5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVySWQoU3RyaW5nIGV4aXN0aW5nU2VydmVySWQpCi0gIHsKLSAgICB0aGlzLmV4aXN0aW5nU2VydmVySWQgPSBleGlzdGluZ1NlcnZlcklkOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgVGhlIHByb2plY3ROYW1lIHRvIHNldC4KLSAgICogQHRvZG8gR2VuZXJhdGVkIGNvbW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCi0gICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcmVxdWlyZXNFSkIgVGhlIHJlcXVpcmVzRUpCIHRvIHNldC4KLSAgICogQHRvZG8gR2VuZXJhdGVkIGNvbW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVzRUpCKGJvb2xlYW4gcmVxdWlyZXNFSkIpIHsKLQotICAgIHRoaXMucmVxdWlyZXNFSkIgPSByZXF1aXJlc0VKQjsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHJlcXVpcmVzV2ViIFRoZSByZXF1aXJlc1dlYiB0byBzZXQuCi0gICAqIEB0b2RvIEdlbmVyYXRlZCBjb21tZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlc1dlYihib29sZWFuIHJlcXVpcmVzV2ViKSB7Ci0KLSAgICB0aGlzLnJlcXVpcmVzV2ViID0gcmVxdWlyZXNXZWI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gIAlzZXJ2ZXJGYWN0b3J5SWRfID0gc2VydmVyRmFjdG9yeUlkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgCWoyZWVWZXJzaW9uXyA9IGoyZWVWZXJzaW9uOwkKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmVlZEVBUihib29sZWFuIG5lZWRFQVIpCi0gIHsKLSAgICBuZWVkRUFSXyA9IG5lZWRFQVI7Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0SXNTZXJ2aWNlUHJvamVjdEVKQihib29sZWFuIGlzU2VydmljZVByb2plY3RFSkIpCi0gIHsKLSAgICB0aGlzLmlzU2VydmljZVByb2plY3RFSkJfID0gaXNTZXJ2aWNlUHJvamVjdEVKQjsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEFkZGVkUHJvamVjdFRvU2VydmVyKGJvb2xlYW4gYWRkZWRQcm9qZWN0VG9TZXJ2ZXIpIAotICB7Ci0gICAgYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gYWRkZWRQcm9qZWN0VG9TZXJ2ZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzZTMwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZVdlYlByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnNlcnZlcnRhcmdldC5JU2VydmVyVGFyZ2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5XZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX0NSRUFURV9XRUJfUFJPSkVDVCI7Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0NSRUFURV9XRUJfUFJPSkVDVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfRUFSX05BTUUgPSAiV2ViU2VydmljZUVBUiI7Ci0gIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lXyA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIGVhclByb2plY3ROYW1lXyA9IG51bGw7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm94eUNvZGVnZW5FbmFibGVkID0gdHJ1ZTsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmFjdG9yeUlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb25fOwotICBwcml2YXRlIElTZXJ2ZXIgZXhpc3RpbmdTZXJ2ZXJfOwotICBwcml2YXRlIGJvb2xlYW4gbmVlZEVBUl87Ci0gIHByaXZhdGUgYm9vbGVhbiB3ZUFkZGVkUHJvamVjdFRvU2VydmVyXyA9IGZhbHNlOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUgotICAgKi8KLSAgcHVibGljIENyZWF0ZVdlYlByb2plY3RDb21tYW5kKCkgewotCi0gICAgc3VwZXIoTEFCRUwsIERFU0NSSVBUSU9OKTsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIC8vc2V0UnVuSW5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2aWNlIFdlYiBQcm9qZWN0IHVzaW5nIHRoZSBwYXJhbWV0ZXIgUHJvamVjdCBuYW1lIE5vdGU6IHRvIGJlCi0gICAqIGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVXZWJQcm9qZWN0Q29tbWFuZChTdHJpbmcgc2VydmljZVByb2plY3ROYW1lKSB7Ci0KLSAgICBzdXBlcihMQUJFTCwgREVTQ1JJUFRJT04pOwotICAgIHByb2plY3ROYW1lXyA9IHNlcnZpY2VQcm9qZWN0TmFtZTsKLSAgICAvL3NldFJ1bkluV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQotICAgIGlmIChwcm9qZWN0TmFtZV8gPT0gbnVsbCB8fCBwcm9qZWN0TmFtZV8ubGVuZ3RoKCkgPT0gMCkgewotICAgIAllbnYuZ2V0TG9nKCkubG9nKExvZy5FUlJPUiwgNTA0NCwgdGhpcywgImV4ZWN1dGUiLCAiV2ViIHByb2plY3QgbmFtZSBub3Qgc2V0Iik7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFIiksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOyAKLSAgICB9Ci0KLSAgICBpZiAoZXhpc3RpbmdTZXJ2ZXJfID09IG51bGwpCi0gICAgewotICAgICAgZW52LmdldExvZygpLmxvZyhMb2cuRVJST1IsIDUwNDQsIHRoaXMsICJleGVjdXRlIiwgIlNlcnZlciBpcyBudWxsIik7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFIiksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOyAgICAgIAotICAgIH0KLSAgICAKLSAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICBJUHJvamVjdCB3ZWJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lXyk7Ci0gICAgSVByb2plY3QgZWFyUHJvamVjdCA9IG51bGw7Ci0gICAgaWYgKGVhclByb2plY3ROYW1lXyE9bnVsbCAmJiBlYXJQcm9qZWN0TmFtZV8ubGVuZ3RoKCk+MCkKLSAgICB7Ci0gICAgICBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lXyk7Ci0gICAgfQotICAgIAotICAgIGJvb2xlYW4gcHJvamVjdEV4aXN0cyA9IHdlYlByb2plY3QgIT0gbnVsbCAmJiB3ZWJQcm9qZWN0LmV4aXN0cygpOwotICAgIGJvb2xlYW4gYWRkZWRUb1NlcnZlciA9IGZhbHNlOwotICAgIGlmIChwcm9qZWN0RXhpc3RzKQotICAgIHsKLSAgICAgIGFkZGVkVG9TZXJ2ZXIgPSBTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKGV4aXN0aW5nU2VydmVyXyxSZXNvdXJjZVV0aWxzLmdldE1vZHVsZSh3ZWJQcm9qZWN0KSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgfQotICAgIAotICAgIGJvb2xlYW4gZWFyRXhpc3RzID0gZWFyUHJvamVjdCE9bnVsbCAmJiBlYXJQcm9qZWN0LmV4aXN0cygpOwotICAgIGJvb2xlYW4gZWFyQWRkZWRUb1NlcnZlciA9IHRydWU7Ci0gICAgaWYgKGVhckV4aXN0cykKLSAgICB7Ci0gICAgICBlYXJBZGRlZFRvU2VydmVyID0gU2VydmVyVXRpbC5jb250YWluc01vZHVsZShleGlzdGluZ1NlcnZlcl8sUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUoZWFyUHJvamVjdCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgIH0KLSAgICAKLSAgICBib29sZWFuIGFyZUFzc29jaWF0ZWQgPSBmYWxzZTsKLSAgICBpZiAocHJvamVjdEV4aXN0cyAmJiBlYXJFeGlzdHMpCi0gICAgewotICAgICAgYXJlQXNzb2NpYXRlZCA9IEoyRUVVdGlscy5pc0VBUkFzc29jaWF0ZWQod2ViUHJvamVjdCwgZWFyUHJvamVjdCk7Ci0gICAgfQotICAgIAotICAgIGJvb2xlYW4gc2VydmVyUmVxdWlyZXNFQVJSZW1vdmFsID0gdHJ1ZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBjaGVjayB0aGUgUmVnaXN0cnkgdG8gc2VlIGlmIHRoZSBzZXJ2ZXIgcmVxdWlyZXMgRUFSIHJlbW92YWwKLSAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWRfIT1udWxsKQotICAgICAgewotICAgICAgICBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSB3c3NSZWcgPSBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgICBzZXJ2ZXJSZXF1aXJlc0VBUlJlbW92YWwgPSB3c3NSZWcuaXNSZW1vdmVFQVJSZXF1aXJlZChzZXJ2ZXJGYWN0b3J5SWRfKTsgICAgCQkKLSAgICAgIH0gICAgCi0gICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgICBlbnYuZ2V0TG9nKCkubG9nKExvZy5FUlJPUiwgNTA0NiwgdGhpcywgImV4ZWN1dGUiLCBjZSk7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFIiksIFN0YXR1cy5FUlJPUiwgY2UpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgaWYgKCFuZWVkRUFSXyAmJiBwcm9qZWN0RXhpc3RzICYmIGFkZGVkVG9TZXJ2ZXIgJiYgIXdlQWRkZWRQcm9qZWN0VG9TZXJ2ZXJfKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gZXhpc3RpbmcgcHJvamVjdCwgZWFyIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbgotICAgIGlmIChuZWVkRUFSXyAmJiBwcm9qZWN0RXhpc3RzICYmIGVhckV4aXN0cyAmJiBlYXJBZGRlZFRvU2VydmVyICYmIGFyZUFzc29jaWF0ZWQgJiYgIXdlQWRkZWRQcm9qZWN0VG9TZXJ2ZXJfKXsKLSAgICAJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIH0KLSAgICAKLSAgICAvL0Fsd2F5cyBzdG9wIHRoZSBzZXJ2ZXIKLSAgICBTdGF0dXMgc3RvcHBpbmdTdGF0dXMgPSBzdG9wU2VydmVyKGVudik7Ci0gICAgaWYoc3RvcHBpbmdTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgIHJldHVybiBzdG9wcGluZ1N0YXR1czsKLSAgICAKLSAgICBpZiAoIW5lZWRFQVJfICYmIHByb2plY3RFeGlzdHMgJiYgYWRkZWRUb1NlcnZlcikKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgfSAgICAgICAKLSAgICBlbHNlIGlmICghbmVlZEVBUl8gJiYgcHJvamVjdEV4aXN0cyAmJiAhYWRkZWRUb1NlcnZlcikKLSAgICB7Ci0gICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBleGlzdGluZ1NlcnZlcl8sIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHdlYlByb2plY3QpICwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKCFuZWVkRUFSXyAmJiAhcHJvamVjdEV4aXN0cykKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gY3JlYXRlV2ViUHJvamVjdChlbnYpOwotICAgICAgaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgd2ViUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZV8pOwotICAgICAgCi0gICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBleGlzdGluZ1NlcnZlcl8sIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHdlYlByb2plY3QpICwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAgIAotICAgIH0KLSAgICBlbHNlIGlmIChwcm9qZWN0RXhpc3RzICYmIGVhckV4aXN0cyAmJiBhcmVBc3NvY2lhdGVkICYmIGFkZGVkVG9TZXJ2ZXIpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcm9qZWN0RXhpc3RzICYmIGVhckV4aXN0cyAmJiBhcmVBc3NvY2lhdGVkICYmICFhZGRlZFRvU2VydmVyKQotICAgIHsKLSAgICAgIFN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIGV4aXN0aW5nU2VydmVyXywgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUod2ViUHJvamVjdCkgLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgCXJldHVybiBtbVN0YXR1czsgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKHByb2plY3RFeGlzdHMgJiYgIWVhckV4aXN0cykKLSAgICB7Ci0gICAgICAvL0NyZWF0ZSB0aGUgRUFSIHByb2plY3QKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBjcmVhdGVFQVJQcm9qZWN0KGVudik7Ci0gICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgCi0gICAgICAvL0Fzc29jaWF0ZSB0aGUgV2ViIHByb2plY3QgYW5kIHRoZSBFQVIgcHJvamVjdAotICAgICAgSjJFRVV0aWxzLmFzc29jaWF0ZVdlYlByb2plY3Qod2ViUHJvamVjdCwgZWFyUHJvamVjdCk7Ci0gICAgICAKLSAgICAgIC8vQWRkIHRvIHNlcnZlcgotICAgICAgU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgZXhpc3RpbmdTZXJ2ZXJfLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZSh3ZWJQcm9qZWN0KSAsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXByb2plY3RFeGlzdHMgJiYgIWVhckV4aXN0cykKLSAgICB7Ci0gICAgICAvL0NyZWF0ZSBFQVIKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBjcmVhdGVFQVJQcm9qZWN0KGVudik7Ci0gICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgCi0gICAgICAvL0NyZWF0ZSBwcm9qZWN0Ci0gICAgICBzdGF0dXMgPSBjcmVhdGVXZWJQcm9qZWN0KGVudik7Ci0gICAgICBpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB3ZWJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lXyk7Ci0gICAgICAKLSAgICAgIC8vQWRkIHRvIHNlcnZlcgotICAgICAgU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgZXhpc3RpbmdTZXJ2ZXJfLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZSh3ZWJQcm9qZWN0KSAsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAgIAotICAgIH0KLSAgICBlbHNlIGlmICghcHJvamVjdEV4aXN0cyAmJiBlYXJFeGlzdHMpCi0gICAgewotICAgICAgLy9SZW1vdmUgdGhlIGVhciBmcm9tIHRoZSBzZXJ2ZXIgaWYgbmVjZXNzYXJ5Ci0gICAgICBpZiAoZWFyQWRkZWRUb1NlcnZlciAmJiBzZXJ2ZXJSZXF1aXJlc0VBUlJlbW92YWwpCi0gICAgICB7Ci0gICAgICAgIC8vIFN0b3BwaW5nIHNlcnZlciBhbmQgcmVtb3ZpbmcgRUFSIGZyb20gU2VydmVyCi0gICAgICAgIGlmIChleGlzdGluZ1NlcnZlcl8uZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0gICAgICAgIHsKLSAgICAgICAgICBleGlzdGluZ1NlcnZlcl8uc3luY2hyb25vdXNTdG9wKGZhbHNlKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIFN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIGV4aXN0aW5nU2VydmVyXywgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUoZWFyUHJvamVjdCksIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgCXJldHVybiBtbVN0YXR1czsgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy9DcmVhdGUgdGhlIFdlYiBwcm9qZWN0Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gY3JlYXRlV2ViUHJvamVjdChlbnYpOwotICAgICAgaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgd2ViUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZV8pOwotCi0gICAgICBib29sZWFuIGVhckFkZGVkVG9TZXJ2ZXJGaW5hbCA9IFNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoZXhpc3RpbmdTZXJ2ZXJfLFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgIGlmICghZWFyQWRkZWRUb1NlcnZlckZpbmFsKQotICAgICAgewotICAgICAgCVN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIGV4aXN0aW5nU2VydmVyXywgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUod2ViUHJvamVjdCkgLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgIAotICAgICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKHByb2plY3RFeGlzdHMgJiYgZWFyRXhpc3RzICYmICFhcmVBc3NvY2lhdGVkKQotICAgIHsKLSAgICAgIC8vUmVtb3ZlIHRoZSBlYXIgZnJvbSB0aGUgc2VydmVyIGlmIG5lY2Vzc2FyeQotICAgICAgaWYgKGVhckFkZGVkVG9TZXJ2ZXIgJiYgc2VydmVyUmVxdWlyZXNFQVJSZW1vdmFsKQotICAgICAgewotICAgICAgICAvLyBTdG9wcGluZyBzZXJ2ZXIgYW5kIHJlbW92aW5nIEVBUiBmcm9tIFNlcnZlcgotICAgICAgICBpZiAoZXhpc3RpbmdTZXJ2ZXJfLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotICAgICAgICB7Ci0gICAgICAgICAgZXhpc3RpbmdTZXJ2ZXJfLnN5bmNocm9ub3VzU3RvcChmYWxzZSk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBleGlzdGluZ1NlcnZlcl8sIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vQXNzb2NpYXRlIHRoZSBXZWIgcHJvamVjdCBhbmQgdGhlIEVBUiBwcm9qZWN0Ci0gICAgICBKMkVFVXRpbHMuYXNzb2NpYXRlV2ViUHJvamVjdCh3ZWJQcm9qZWN0LCBlYXJQcm9qZWN0KTsKLSAgICAgIAotICAgICAgYm9vbGVhbiBlYXJBZGRlZFRvU2VydmVyRmluYWwgPSBTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKGV4aXN0aW5nU2VydmVyXyxSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7ICAgICAgCi0gICAgICBpZiAoIWVhckFkZGVkVG9TZXJ2ZXJGaW5hbCkKLSAgICAgIHsKLSAgICAgIAlTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBleGlzdGluZ1NlcnZlcl8sIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHdlYlByb2plY3QpICwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7ICAKLSAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgCXJldHVybiBtbVN0YXR1czsgICAgICAKLSAgICAgIH0gICAgICAKLSAgICAgIAotICAgIH0KLQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHByaXZhdGUgU3RhdHVzIGNyZWF0ZVdlYlByb2plY3QoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgIAkKLSAgICBXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCBwcm9qZWN0SW5mbyA9IG5ldyBXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpOwotICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWVfKTsKLSAgICBTdHJpbmcgZmluYWxKMkVFVmVyc2lvbiA9IG51bGw7Ci0gICAgaWYgKGoyZWVWZXJzaW9uXyAhPSBudWxsICYmIGoyZWVWZXJzaW9uXy5sZW5ndGgoKT4wKQotICAgIHsKLSAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkoyRUVfVkVSU0lPTiwgbmV3IEludGVnZXIoajJlZVZlcnNpb25fKSk7Ci0gICAgICBmaW5hbEoyRUVWZXJzaW9uID0gajJlZVZlcnNpb25fOwotICAgIH0gICAgICAgIAotICAgIGVsc2UgICAgICAgIAotICAgIHsKLSAgICAgIGlmIChlYXJQcm9qZWN0TmFtZV8gIT1udWxsICYmIGVhclByb2plY3ROYW1lXy5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgICBpZiAoZWFyUHJvamVjdCAhPSBudWxsICYmIGVhclByb2plY3QuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBFQVJOYXR1cmVSdW50aW1lIGVhciA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShlYXJQcm9qZWN0KTsKLSAgICAgICAgICBpbnQgZWFyVmVyc2lvbiA9IGVhci5nZXRKMkVFVmVyc2lvbigpOwotICAgICAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkoyRUVfVkVSU0lPTiwgbmV3IEludGVnZXIoZWFyVmVyc2lvbikpOwotICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihlYXJWZXJzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpOwotICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuSjJFRV9WRVJTSU9OLCBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpOwotICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOyAgICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICB9ICAgIAotICAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBudWxsOwotICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWRfIT1udWxsICYmIHNlcnZlckZhY3RvcnlJZF8ubGVuZ3RoKCk+MCkKLSAgICB7Ci0vLwkJVE9ETyAtIEFkZCB0aGlzIGxvZ2ljIHRvIEZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsLCBhbmQgb3AuLi4uCi0vLyAgICAgIHJ1bnRpbWVUYXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldElkRnJvbUZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWRfLElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuV0VCX1RZUEUsIGZpbmFsSjJFRVZlcnNpb24pOyAKLS8vICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuU0VSVkVSX1RBUkdFVF9JRCwgcnVudGltZVRhcmdldElkICk7Ci0vLyAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9TRVJWRVJfVEFSR0VULCBCb29sZWFuLlRSVUUpOyAgICAgIAotICAgIH0gCi0gICAgCi0gICAgaWYgKGVhclByb2plY3ROYW1lXyAhPW51bGwgJiYgZWFyUHJvamVjdE5hbWVfLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuRUFSX01PRFVMRV9OQU1FLCBlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1RPX0VBUiwgQm9vbGVhbi5UUlVFKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9UT19FQVIsIEJvb2xlYW4uRkFMU0UpOwotICAgIH0KLSAgICAJCi0gICAgCi0KLSAgICAvL0NyZWF0ZSBhbmQgcnVuIHRoZSBvcGVyYXRpb24KLSAgICBXZWJDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbiBvcCA9IG5ldyBXZWJDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbihwcm9qZWN0SW5mbyk7Ci0gICAgICBvcC5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7ICAgIAotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlbnYuZ2V0TG9nKCkubG9nKExvZy5FUlJPUiwgNTA0NiwgdGhpcywgImNyZWF0ZVdlYlByb2plY3QiLCBlKTsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XRUJfUFJPSkVDVF9DUkVBVEUiKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIFN0YXR1cyBjcmVhdGVFQVJQcm9qZWN0KEVudmlyb25tZW50IGVudikKLSAgewotICAgIENyZWF0ZUVBUlByb2plY3RDb21tYW5kIHQgPSBuZXcgQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQoKTsKLSAgICB0LnNldEVhclByb2plY3ROYW1lKGVhclByb2plY3ROYW1lXyk7Ci0gICAgdC5zZXRTZXJ2ZXJGYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXyk7Ci0gICAgdC5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbl8pOwotICAgIFN0YXR1cyBzdGF0dXMgPSB0LmV4ZWN1dGUoZW52KTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9ICAgICAgICAgICAgIAotICAKLSAgcHJpdmF0ZSBTdGF0dXMgc3RvcFNlcnZlcihFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAJCi0gICAgdHJ5Ci0gICAJewotICAgCQlXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSByZWcgPSBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgCQlBYnN0cmFjdFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyQ29tbWFuZCA9IChBYnN0cmFjdFN0YXJ0U2VydmVyKXJlZy5nZXRTZXJ2ZXJTdGFydEJ5VHlwZUlkKGV4aXN0aW5nU2VydmVyXy5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgCXN0YXJ0U2VydmVyQ29tbWFuZC5zdG9wU2VydmVyKGV4aXN0aW5nU2VydmVyXyk7Ci0gICAgCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgIAl9Ci0gIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlICkKLSAgCXsKLSAgICAJSVN0YXR1cyBlbWJlZGRlZFN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgIAlTdGF0dXMgc3RhdHVzID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAJCXJldHVybiBzdGF0dXM7Ci0gIAl9ICAJCi0gIAkKLQotICB9Ci0gIAotICAvLyBUbyBiZSBkZXByZWNhdGVkCi0gIC8qCi0gIHByaXZhdGUgU3RhdHVzIGNyZWF0ZVdlYlByb2plY3QoU3RyaW5nIHdlYlByb2plY3ROYW1lLCBTdHJpbmcgZWFyUHJvamVjdE5hbWUsIEVudmlyb25tZW50IGVudikgewotCi0gICAgdHJ5IHsKLSAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZSk7Ci0gICAgICBpZiAoZWFyUHJvamVjdCAhPSBudWxsICYmICFlYXJQcm9qZWN0LmV4aXN0cygpKSB7Ci0gICAgICAgIENyZWF0ZUVBUlByb2plY3RDb21tYW5kIGMgPSBuZXcgQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQoKTsKLSAgICAgICAgYy5zZXRFYXJQcm9qZWN0TmFtZShlYXJQcm9qZWN0TmFtZSk7Ci0gICAgICAgIGMuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOwotICAgICAgICBjLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXyk7Ci0gICAgICAgIGMuZXhlY3V0ZShlbnYpOwotICAgICAgICBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lKTsKLSAgICAgIH0KLSAgICAgIElQcm9qZWN0IHdlYlByb2plY3QgPSByb290LmdldFByb2plY3Qod2ViUHJvamVjdE5hbWUpOwotICAgICAgaWYgKHdlYlByb2plY3QgIT0gbnVsbCAmJiAhd2ViUHJvamVjdC5leGlzdHMoKSkgewotICAgICAgICBXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCBpbmZvID0gbmV3IFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCk7Ci0gICAgICAgIGluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9OQU1FLCB3ZWJQcm9qZWN0TmFtZSk7Ci0gICAgICAgIGluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuRUFSX1BST0pFQ1RfTkFNRSwgZWFyUHJvamVjdE5hbWUpOwotICAgICAgICAvL2luZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1RPX0VBUiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfVE9fRUFSLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgaWYgKHNlcnZlckZhY3RvcnlJZF8hPW51bGwgJiYgc2VydmVyRmFjdG9yeUlkXy5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFJ1bnRpbWVUYXJnZXRJZEZyb21GYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXyk7IAotICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuU0VSVkVSX1RBUkdFVF9JRCwgcnVudGltZVRhcmdldElkICk7Ci0gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfU0VSVkVSX1RBUkdFVCwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoajJlZVZlcnNpb25fICE9IG51bGwgJiYgajJlZVZlcnNpb25fLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkoyRUVfVkVSU0lPTiwgbmV3IEludGVnZXIoajJlZVZlcnNpb25fKSk7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgV2ViUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXZWJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24oaW5mbyk7Ci0gICAgICAgIG9wZXJhdGlvbi5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dFQl9QUk9KRUNUX0NSRUFURSIpLCBTdGF0dXMuRVJST1IsCi0gICAgICAgICAgaXRlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFIiksIFN0YXR1cy5FUlJPUiwKLSAgICAgICAgICBpZSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAqLwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmV3RUFSTmFtZSgpIHsKLQotICAgIFN0cmluZyBuZXdFQVJOYW1lID0gREVGQVVMVF9FQVJfTkFNRTsKLSAgICAvL0NoZWNrIHRvIHNlZSBpZiBpdCBleGlzdHMKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChuZXdFQVJOYW1lKTsKLSAgICByZXR1cm4gbmV3RUFSTmFtZTsKLSAgfQotCi0gIAotICBwcml2YXRlIElQcm9qZWN0IGdldERlZmF1bHRFQVJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQotICAgIHRyeSB7Ci0gICAgICBFQVJOYXR1cmVSdW50aW1lW10gZWFycyA9IG51bGw7Ci0gICAgICBFQVJOYXR1cmVSdW50aW1lIGVhciA9IG51bGw7Ci0gICAgICBlYXJzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhwcm9qZWN0KTsKLSAgICAgIGlmIChlYXJzWzBdICE9IG51bGwgJiYgZWFycy5sZW5ndGggPj0gMSkgewotICAgICAgICAvLyBmb3VuZCBhbiBFQVIgY29udGFpbmluZyB0aGUgd2ViIHByb2plY3QKLSAgICAgICAgcmV0dXJuIGVhcnNbMF0uZ2V0UHJvamVjdCgpOwotICAgICAgfQotCi0gICAgICBpZiAoajJlZVZlcnNpb25fIT1udWxsICYmIGoyZWVWZXJzaW9uXy5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgCWVhciA9IEoyRUVVdGlscy5nZXRFQVIoSW50ZWdlci5wYXJzZUludChqMmVlVmVyc2lvbl8pKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWFyID0gSjJFRVV0aWxzLmdldDEyRUFSKCk7Ci0gICAgICAgIGlmIChlYXIgPT0gbnVsbCkKLSAgICAgICAgICBlYXIgPSBKMkVFVXRpbHMuZ2V0MTNFQVIoKTsKLSAgICAgICAgaWYgKGVhciA9PSBudWxsKQotICAgICAgICAgIGVhciA9IEoyRUVVdGlscy5nZXRFQVIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZWFyICE9IG51bGwpCi0gICAgICAgIHJldHVybiBlYXIuZ2V0UHJvamVjdCgpOwotICAgICAgZWxzZSB7Ci0gICAgICAgIFN0cmluZyBlYXJOYW1lID0gZ2V0TmV3RUFSTmFtZSgpOwotICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgcmV0dXJuIHJvb3QuZ2V0UHJvamVjdChlYXJOYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gZWFyUHJvamVjdE5hbWUKLSAgICogICAgICAgICAgVGhlIGVhclByb2plY3ROYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVhclByb2plY3ROYW1lKFN0cmluZyBlYXJQcm9qZWN0TmFtZSkgewotCi0gICAgdGhpcy5lYXJQcm9qZWN0TmFtZV8gPSBlYXJQcm9qZWN0TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcHJvamVjdE5hbWUKLSAgICogICAgICAgICAgVGhlIHByb2plY3ROYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCi0gICAgdGhpcy5wcm9qZWN0TmFtZV8gPSBwcm9qZWN0TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gZXhpc3RpbmdTZXJ2ZXIKLSAgICogICAgICAgICAgVGhlIGV4aXN0aW5nU2VydmVyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgZXhpc3RpbmdTZXJ2ZXIpIHsKLQotICAgIHRoaXMuZXhpc3RpbmdTZXJ2ZXJfID0gZXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gIAlzZXJ2ZXJGYWN0b3J5SWRfID0gc2VydmVyRmFjdG9yeUlkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgCWoyZWVWZXJzaW9uXyA9IGoyZWVWZXJzaW9uOwkKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmVlZEVBUihib29sZWFuIG5lZWRFQVIpCi0gIHsKLSAgICBuZWVkRUFSXyA9IG5lZWRFQVI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEFkZGVkUHJvamVjdFRvU2VydmVyKGJvb2xlYW4gYWRkZWRQcm9qZWN0VG9TZXJ2ZXIpIAotICB7Ci0gICAgd2VBZGRlZFByb2plY3RUb1NlcnZlcl8gPSBhZGRlZFByb2plY3RUb1NlcnZlcjsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Rpc2FibGVCdWlsZENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vRGlzYWJsZUJ1aWxkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjcwZWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vRGlzYWJsZUJ1aWxkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwudmFsaWRhdGUuVmFsaWRhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgRGlzYWJsZUJ1aWxkQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBNb2RlbCBtb2RlbF87Ci0gIHByaXZhdGUgVmFsaWRhdGlvbk1hbmFnZXIgbWFuYWdlcl87Ci0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfV0VCU0VSVklDRV9ESVNBQkxFX0JVSUxEIjsKLSAgcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX1dFQlNFUlZJQ0VfRElTQUJMRV9CVUlMRCI7Ci0gIC8qKgotICAgKiBDVE9SOwotICAgKi8KLSAgcHVibGljIERpc2FibGVCdWlsZENvbW1hbmQoKQotICB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0KLSAgICBzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7Ci0gICAgc2V0RGVzY3JpcHRpb24obXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQotICAgIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKS5yZXBvcnQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRBU0tfREVTQ19XRUJTRVJWSUNFX0RJU0FCTEVfQlVJTEQiKSk7Ci0KLSAgICBpZiAobWFuYWdlcl8hPW51bGwpIHsKLSAgICAgIG1hbmFnZXJfLmRpc2FibGVBdXRvQnVpbGQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIG1vZGVsCi0gICAqIAotICAgKiBAcGFyYW0gbW9kZWwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKE1vZGVsIG1vZGVsKSB7Ci0gICAgdGhpcy5tb2RlbF8gPSBtb2RlbDsKLSAgfSAgCi0gIAotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBtYW5hZ2VyXyBUaGUgbWFuYWdlcl8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbk1hbmFnZXIoVmFsaWRhdGlvbk1hbmFnZXIgbWFuYWdlcikgewotICAgIHRoaXMubWFuYWdlcl8gPSBtYW5hZ2VyOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vRGlzYWJsZVZhbGlkYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Rpc2FibGVWYWxpZGF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTAzNjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vRGlzYWJsZVZhbGlkYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgRGlzYWJsZVZhbGlkYXRpb25Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwcml2YXRlIFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXJfOwotICBwcml2YXRlIElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9XRUJTRVJWSUNFX0RJU0FCTEVfVkFMSURBVElPTiI7Ci0gIHByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19XRUJTRVJWSUNFX0RJU0FCTEVfVkFMSURBVElPTiI7Ci0KLSAgLyoqCi0gICAqIENUT1I7Ci0gICAqLwotICBwdWJsaWMgRGlzYWJsZVZhbGlkYXRpb25Db21tYW5kKCkgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCi0gICAgc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQotICAgIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKS5yZXBvcnQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRBU0tfREVTQ19XRUJTRVJWSUNFX0RJU0FCTEVfVkFMSURBVElPTiIpKTsKLQotICAgIElQcm9qZWN0IHByb2plY3QgPSBzZXJ2aWNlUHJvamVjdF87Ci0gICAgaWYgKHByb2plY3QgIT0gbnVsbCkgbWFuYWdlcl8uZGlzYWJsZVZhbGlkYXRpb25Gb3JQcm9qZWN0KHByb2plY3QpOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gbWFuYWdlcl8KLSAgICogICAgICAgICAgICBUaGUgbWFuYWdlcl8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbk1hbmFnZXIoVmFsaWRhdGlvbk1hbmFnZXIgbWFuYWdlcikgewotICAgIHRoaXMubWFuYWdlcl8gPSBtYW5hZ2VyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCl7Ci0gICAgdGhpcy5zZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9HZXRNb25pdG9yQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9HZXRNb25pdG9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTEzNGE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vR2V0TW9uaXRvckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotLy8gVE9ETzogR2V0IHJpZCBvZiB0aGlzLiBBIHJlcGxhY2VtZW50IGlzIGluIG9yZy5lY2xpcHNlLndzdC53cy4KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5JTW9uaXRvcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuTW9uaXRvckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZXRNb25pdG9yQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBib29sZWFuIG1vbml0b3JTZXJ2aWNlOwotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotICBwcml2YXRlIExpc3QgZW5kcG9pbnRzOwotCi0gIHB1YmxpYyBHZXRNb25pdG9yQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkdldE1vbml0b3JDb21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5HZXRNb25pdG9yQ29tbWFuZCIpOwotICAgIG1vbml0b3JTZXJ2aWNlID0gdHJ1ZTsKLSAgICBjcmVhdGUgPSB0cnVlOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIGVuZHBvaW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZiAobW9uaXRvclNlcnZpY2UgJiYgd2ViU2VydmljZXNQYXJzZXIgIT0gbnVsbCAmJiB3c2RsVVJJICE9IG51bGwgJiYgd3NkbFVSSS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSSSk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBNYXAgc2VydmljZXMgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3Igc2VydmljZXNJdCA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHNlcnZpY2VzSXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKXNlcnZpY2VzSXQubmV4dCgpOwotICAgICAgICAgIE1hcCBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHBvcnRzSXQgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBwb3J0c0l0Lmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgUG9ydCB3c2RsUG9ydCA9IChQb3J0KXBvcnRzSXQubmV4dCgpOwotICAgICAgICAgICAgTGlzdCBleHRFbGVtZW50cyA9IHdzZGxQb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBleHRFbGVtZW50c0l0ID0gZXh0RWxlbWVudHMuaXRlcmF0b3IoKTsgZXh0RWxlbWVudHNJdC5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWV4dEVsZW1lbnRzSXQubmV4dCgpOwotICAgICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnQgPSBudWxsOwotICAgICAgICAgICAgICBVUkwgZW5kcG9pbnRVUkwgPSBudWxsOwotICAgICAgICAgICAgICBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKQotICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gKChTT0FQQWRkcmVzcylleHRFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICAgICAgICBlbHNlIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpCi0gICAgICAgICAgICAgICAgZW5kcG9pbnQgPSAoKEhUVFBBZGRyZXNzKWV4dEVsZW1lbnQpLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICAgICAgICAgIGlmIChlbmRwb2ludCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZW5kcG9pbnRVUkwgPSBuZXcgVVJMKGVuZHBvaW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChlbmRwb2ludFVSTCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3RvY29sID0gZW5kcG9pbnRVUkwuZ2V0UHJvdG9jb2woKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGVuZHBvaW50VVJMLmdldEhvc3QoKTsKLSAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IGVuZHBvaW50VVJMLmdldFBvcnQoKTsKLSAgICAgICAgICAgICAgICBpZiAocG9ydCA9PSAtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoImh0dHAiLmVxdWFsc0lnbm9yZUNhc2UocHJvdG9jb2wpKQotICAgICAgICAgICAgICAgICAgICBwb3J0ID0gODA7Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmICgiaHR0cHMiLmVxdWFsc0lnbm9yZUNhc2UocHJvdG9jb2wpKQotICAgICAgICAgICAgICAgICAgICBwb3J0ID0gNDQzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCAmJiBwcm90b2NvbC5zdGFydHNXaXRoKCJodHRwIikgJiYgaG9zdCAhPSBudWxsICYmIGhvc3QubGVuZ3RoKCkgPiAwICYmIHBvcnQgIT0gLTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgSU1vbml0b3IgbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICBJTW9uaXRvcltdIG1vbml0b3JzID0gTW9uaXRvckNvcmUuZ2V0TW9uaXRvcnMoKTsKLSAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtb25pdG9ycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhvc3QuZXF1YWxzSWdub3JlQ2FzZShtb25pdG9yc1tpXS5nZXRSZW1vdGVIb3N0KCkpICYmIHBvcnQgPT0gbW9uaXRvcnNbaV0uZ2V0UmVtb3RlUG9ydCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgbSA9IG1vbml0b3JzW2ldOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAobSA9PSBudWxsICYmIGNyZWF0ZSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1vbml0b3JlZFBvcnQgPSBTb2NrZXRVdGlsLmZpbmRVbnVzZWRQb3J0KDUwMDAsIDE1MDAwKTsKLSAgICAgICAgICAgICAgICAgICAgSU1vbml0b3JXb3JraW5nQ29weSBtb25pdG9yV29ya2luZ0NvcHkgPSBNb25pdG9yQ29yZS5jcmVhdGVNb25pdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1vbml0b3JXb3JraW5nQ29weS5zZXRMb2NhbFBvcnQobW9uaXRvcmVkUG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIG1vbml0b3JXb3JraW5nQ29weS5zZXRSZW1vdGVIb3N0KGhvc3QpOwotICAgICAgICAgICAgICAgICAgICBtb25pdG9yV29ya2luZ0NvcHkuc2V0UmVtb3RlUG9ydChwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvcldvcmtpbmdDb3B5LnNldFByb3RvY29sKCJIVFRQIik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgbSA9IG1vbml0b3JXb3JraW5nQ29weS5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHdhcm5pbmcgPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkFCTEVfVE9fU1RBUlRfTU9OSVRPUiIsIG5ldyBPYmplY3RbXXtTdHJpbmcudmFsdWVPZihwb3J0KSwgZW5kcG9pbnR9KSwgU3RhdHVzLldBUk5JTkcsIHQpOwotICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnYgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQod2FybmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChTdGF0dXNFeGNlcHRpb24gc2UpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaWYgKG0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoIW0uaXNSdW5uaW5nKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBtLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihlbmRwb2ludFVSTC5nZXRQcm90b2NvbCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjovL2xvY2FsaG9zdDoiKTsKLSAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobS5nZXRMb2NhbFBvcnQoKSkpOwotICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChlbmRwb2ludFVSTC5nZXRGaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50cy5hZGQoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHdhcm5pbmcgPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkFCTEVfVE9fU1RBUlRfTU9OSVRPUiIsIG5ldyBPYmplY3RbXXtTdHJpbmcudmFsdWVPZihwb3J0KSwgZW5kcG9pbnR9KSwgU3RhdHVzLldBUk5JTkcsIHQpOwotICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnYgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQod2FybmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChTdGF0dXNFeGNlcHRpb24gc2UpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yU2VydmljZShib29sZWFuIG1vbml0b3JTZXJ2aWNlKQotICB7Ci0gICAgdGhpcy5tb25pdG9yU2VydmljZSA9IG1vbml0b3JTZXJ2aWNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENyZWF0ZShib29sZWFuIGNyZWF0ZSkKLSAgewotICAgIHRoaXMuY3JlYXRlID0gY3JlYXRlOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RW5kcG9pbnRzKCkKLSAgewotICAgIHJldHVybiBlbmRwb2ludHM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0phdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiNDYzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0phdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLQotLy9jb3JlIHN0dWZmCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YUVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotKiBUaGlzIGNsYXNzIGlzIHRvIGJlIHVzZWQgdG8gQnVpbGQgdGhlIGRhdGEgbW9kZWwKLSogZmlyc3Qgd2UgZ2V0IHRoZSBqYXZhIGNsYXNzIGFuZCB0aGVuIGJ1aWxkIHRoZSBtb2RlbAotKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSAiSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kIjsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OID0gInJlZmxlY3Rpb24gZm9yIGEgZ2l2ZW4gY2xhc3MiOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgT0tfTUVTU0FHRSA9ICAiVGhlIG1vZGVsIGhhcyBiZWVuIGJ1aWx0ICI7IAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSkFWQV9FWFRFTlNJT04gPSAiLmphdmEiOwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRVhURU5TSU9OID0gIi5jbGFzcyI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0gIHByaXZhdGUgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0gIHByaXZhdGUgSmF2YUhlbHBlcnMgamF2YUNsYXNzOwotICBwcml2YXRlIFN0cmluZyBxbmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgcHJveHlCZWFuOwotICBwcml2YXRlIElQcm9qZWN0IGNsaWVudElQcm9qZWN0OwotIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCB3aXRoIHRoZSBnaXZlbiBsYWJlbCBhbmQgZGVzY3JpcHRpb24KLSAgKiAKLSAgKi8KLSAgcHVibGljIEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCgpCi0gIHsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQotICAgIHNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLSAgICBzZXROYW1lKExBQkVMKTsKLSAgfQotICAKLSAgLy8gc2V0dGVycyBmb3IgdGhpcyBjb21tYW5kCi0gIAotICAgIAotICAvKioKLSAgKiBUaGUgZW5kIHJlc3VsdCBvZiB0aGlzIHdob2xlIHByb2Nlc3MgaXMgdG8gZ2V0IHRoZSBKYXZhIENsYXNzCi0gICovCi0gIHB1YmxpYyBKYXZhSGVscGVycyBnZXRKYXZhQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIGphdmFDbGFzczsKLSAgfQotCi0gIAotICBwcml2YXRlIHZvaWQgcHJvY2Vzc1FOYW1lKCkKLSAgewotICAgICAgcW5hbWUgPSBwcm94eUJlYW47Ci0JICBpZiAocW5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChKQVZBX0VYVEVOU0lPTikpIHsKLQkJICBxbmFtZSA9IHFuYW1lLnN1YnN0cmluZygwLChxbmFtZS5sZW5ndGgoKSAtNSkpOwotCSAgfQotCSAgaWYgKHFuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoQ0xBU1NfRVhURU5TSU9OKSkgewotCQkgIHFuYW1lID0gcW5hbWUuc3Vic3RyaW5nKDAsKHFuYW1lLmxlbmd0aCgpIC02KSk7Ci0JICB9Ci0gICB9Ci0gICAgICAKLSAgLyoqCi0gICogR2V0IHRoZSBqYXZhIG1vZGVsIGZyb20gdGhlIHJlc291cmNlIHRoZW4gCi0gICogYnVpbGQgdGhlIG1vZGVsIGZyb20gdGhlIG1vZgotICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gCS8vanVzdCBtYWtlIHN1cmUgdGhlIHByb2plY3QgYW5kIHFuYW1lIGFyZSB0aGVyZQotICAJLy90aGV5IGFyZSBlc3NlbnRpYWwgZm9yIHRoaXMgb3BlcmF0aW9uCi0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAlJUHJvamVjdCBjbGllbnRJUHJvamVjdCA9IChJUHJvamVjdClSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShjbGllbnRQcm9qZWN0KTsKLSAgCXByb2Nlc3NRTmFtZSgpOwotICAJaWYoY2xpZW50UHJvamVjdCA9PSBudWxsIHx8IHFuYW1lID09IG51bGwpCi0gIAkgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19XQVJOX1VOQUJMRV9UT19GSU5EX1BST1hZIiksU3RhdHVzLldBUk5JTkcpOwotICAJCi0gICAgSmF2YUVNRk5hdHVyZSBuYXR1cmUgPSAoSmF2YUVNRk5hdHVyZSlKYXZhRU1GTmF0dXJlLmdldFJ1bnRpbWUoY2xpZW50SVByb2plY3QpOwotICAgIGlmKG5hdHVyZSA9PSBudWxsKXsKLSAgICAgIHRyeXsKLSAgICAgICAgbmF0dXJlID0gKEphdmFFTUZOYXR1cmUpSmF2YUVNRk5hdHVyZS5jcmVhdGVSdW50aW1lKGNsaWVudElQcm9qZWN0KTsgIAkKLSAgICAgIH1jYXRjaChDb3JlRXhjZXB0aW9uIGV4Yyl7fQotICAgIH0KLSAgICByZXNvdXJjZVNldCA9IG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpOwotICAgIGphdmFDbGFzcyA9IChKYXZhSGVscGVycylKYXZhQ2xhc3NJbXBsLnJlZmxlY3QocW5hbWUsIHJlc291cmNlU2V0KTsgCi0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJveHlCZWFuKFN0cmluZyBwcm94eUJlYW4pCi0gIHsKLSAgCXRoaXMucHJveHlCZWFuID0gcHJveHlCZWFuOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAJdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL01hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL01hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYzdkYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9NYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIHNlbmdwbAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRJT04gPSAiU3RhcnQgV2ViIFByb2plY3QiOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBMQUJFTCA9ICJTZXJ2ZXJTdGFydFVwTWFuYWdlciI7Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCQotCXByaXZhdGUgQm9vbGVhbiBpc1N0YXJ0U2VydmljZUVuYWJsZWRfOwotCXByaXZhdGUgQm9vbGVhbiBpc1Rlc3RTZXJ2aWNlRW5hYmxlZF87Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJZF87Ci0JcHJpdmF0ZSBJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl87Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBzYW1wbGVQcm9qZWN0XzsKLQlwcml2YXRlIFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSWRfOwotCXByaXZhdGUgSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcl87Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfOwotCi0JLyoqCi0JICogRGVmYXVsdCBDVE9SOwotCSAqLwotCXB1YmxpYyBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZCgpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0JCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0JICovCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQl7Ci0JICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotCSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQUk9HUkVTU19JTkZPX1NUQVJUX1dFQl9QUk9KRUNUIikpOwotCSAKLQkgICAgaWYgKGlzU3RhcnRTZXJ2aWNlRW5hYmxlZF8uYm9vbGVhblZhbHVlKCkgJiYgc2VydmljZUV4aXN0aW5nU2VydmVyXyE9bnVsbCl7Ci0JICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGluZyBzZXJ2aWNlIHNlcnZlciBzdGFydDogIitzZXJ2aWNlUHJvamVjdF8rIiAgIitzZXJ2aWNlU2VydmVyVHlwZUlkXyk7Ci0JICAgIAlTdGFydFByb2plY3RDb21tYW5kIHNwYyA9IG5ldyBTdGFydFByb2plY3RDb21tYW5kKCk7Ci0JICAgIAlzcGMuc2V0U2VydmljZVByb2plY3Qoc2VydmljZVByb2plY3RfKTsKLQkgICAgCXNwYy5zZXRTZXJ2aWNlU2VydmVyVHlwZUlEKHNlcnZpY2VTZXJ2ZXJUeXBlSWRfKTsKLQkgICAgCXNwYy5zZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIoc2VydmljZUV4aXN0aW5nU2VydmVyXyk7Ci0JICAgIAlzcGMuc2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZChpc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXyk7Ci0JICAgIAlzcGMuZXhlY3V0ZShlbnYpOwotCSAgICB9Ci0JICAgIAotCSAgICBpZihpc1Rlc3RTZXJ2aWNlRW5hYmxlZF8uYm9vbGVhblZhbHVlKCkmJiBzYW1wbGVFeGlzdGluZ1NlcnZlcl8hPW51bGwgJiYgc2VydmljZUV4aXN0aW5nU2VydmVyXyE9bnVsbCAmJiAhc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfLmVxdWFscyhzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfKSl7Ci0JICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGluZyBjbGllbnQgc2VydmVyIHN0YXJ0OiAiK3NhbXBsZVByb2plY3RfKyIgICIrc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfXyk7Ci0JICAgIAlTdGFydFByb2plY3RDb21tYW5kIHNwYyA9IG5ldyBTdGFydFByb2plY3RDb21tYW5kKCk7Ci0JICAgIAlzcGMuc2V0U2FtcGxlUHJvamVjdChzYW1wbGVQcm9qZWN0Xyk7Ci0JICAgIAlzcGMuc2V0U2FtcGxlU2VydmVyVHlwZUlEKHNhbXBsZVNlcnZlclR5cGVJZF8pOwotCSAgICAJc3BjLnNldFNhbXBsZUV4aXN0aW5nU2VydmVyKHNhbXBsZUV4aXN0aW5nU2VydmVyXyk7Ci0JICAgIAlzcGMuc2V0Q3JlYXRpb25TY2VuYXJpbyhuZXcgQm9vbGVhbigiZmFsc2UiKSk7Ci0JICAgIAlzcGMuZXhlY3V0ZShlbnYpOwkgICAgCQotCSAgICB9Ci0JICAgIAotCSAgICByZXR1cm4gc3RhdHVzOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gaXNTdGFydFNlcnZpY2VFbmFibGVkIFRoZSBpc1N0YXJ0U2VydmljZUVuYWJsZWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0U2VydmljZShCb29sZWFuIGlzU3RhcnRTZXJ2aWNlRW5hYmxlZCkgewotCQl0aGlzLmlzU3RhcnRTZXJ2aWNlRW5hYmxlZF8gPSBpc1N0YXJ0U2VydmljZUVuYWJsZWQ7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBpc1Rlc3RTZXJ2aWNlRW5hYmxlZCBUaGUgaXNUZXN0U2VydmljZUVuYWJsZWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKEJvb2xlYW4gaXNUZXN0U2VydmljZUVuYWJsZWQpIHsKLQkJdGhpcy5pc1Rlc3RTZXJ2aWNlRW5hYmxlZF8gPSBpc1Rlc3RTZXJ2aWNlRW5hYmxlZDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNlcnZpY2VFeGlzdGluZ1NlcnZlciBUaGUgc2VydmljZUV4aXN0aW5nU2VydmVyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIpIHsKLQkJdGhpcy5zZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfID0gc2VydmljZUV4aXN0aW5nU2VydmVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZXJ2aWNlU2VydmVyVHlwZUlkIFRoZSBzZXJ2aWNlU2VydmVyVHlwZUlkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVyVHlwZUlkKFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlkKSB7Ci0JCXRoaXMuc2VydmljZVNlcnZlclR5cGVJZF8gPSBzZXJ2aWNlU2VydmVyVHlwZUlkOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gc2VydmljZVByb2plY3QgVGhlIHNlcnZpY2VQcm9qZWN0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkgewotCQl0aGlzLnNlcnZpY2VQcm9qZWN0XyA9IHNlcnZpY2VQcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgVGhlIHNhbXBsZUV4aXN0aW5nU2VydmVyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTYW1wbGVFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyKSB7Ci0JCXRoaXMuc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBzYW1wbGVQcm9qZWN0IFRoZSBzYW1wbGVQcm9qZWN0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0KElQcm9qZWN0IHNhbXBsZVByb2plY3QpIHsKLQkJdGhpcy5zYW1wbGVQcm9qZWN0XyA9IHNhbXBsZVByb2plY3Q7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBzYW1wbGVTZXJ2ZXJUeXBlSWQgVGhlIHNhbXBsZVNlcnZlclR5cGVJZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2FtcGxlU2VydmVyVHlwZUlkKFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSWQpIHsKLQkJdGhpcy5zYW1wbGVTZXJ2ZXJUeXBlSWRfID0gc2FtcGxlU2VydmVyVHlwZUlkOwotCX0JCi0JCi0JLyoqCi0JICogQHBhcmFtIGlzUmVzdGFydFByb2plY3ROZWVkZWQgVGhlIGlzUmVzdGFydFByb2plY3ROZWVkZWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQoYm9vbGVhbiBpc1Jlc3RhcnRQcm9qZWN0TmVlZGVkKSB7Ci0JCXRoaXMuaXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZF8gPSBpc1Jlc3RhcnRQcm9qZWN0TmVlZGVkOwotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1B1Ymxpc2hQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9QdWJsaXNoUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdkNjUyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1B1Ymxpc2hQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotcHVibGljIGNsYXNzIFB1Ymxpc2hQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRJT04gPSAiUHVibGlzaCBXZWIgUHJvamVjdCI7Ci1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgTEFCRUwgICAgICAgPSAiUHVibGlzaFByb2plY3RDb21tYW5kIjsKLXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotcHJpdmF0ZSBTdHJpbmcgcHJvamVjdDsKLXByaXZhdGUgU3RyaW5nIHNlcnZlclR5cGVJRDsKLXByaXZhdGUgSVNlcnZlciBleGlzdGluZ1NlcnZlcjsKLQotCi0vKioKLSAqIERlZmF1bHQgQ1RPUjsKLSAqLwotcHVibGljIFB1Ymxpc2hQcm9qZWN0Q29tbWFuZCgpIHsKLSAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICBzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gIHNldE5hbWUoTEFCRUwpOyAgCi0gIC8vVE9ETyBzZXRSdW5JbldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihmYWxzZSk7Ci19Ci0KLS8qKgotICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICovCi1wdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotewotICAKLSAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB0cnkKLSAgewotICAgIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKS5yZXBvcnQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiUFJPR1JFU1NfSU5GT19QVUJMSVNIX1dFQl9QUk9KRUNUIiApICk7Ci0gICAgCi0gICAgaWYgKHByb2plY3QgPT0gbnVsbCl7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BST0pFQ1RfTk9UX0ZPVU5EIiksIFN0YXR1cy5FUlJPUik7IAotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0JCi0gICAgSVByb2plY3QgaVByb2plY3QgPSAoSVByb2plY3QpUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UocHJvamVjdCk7Ci0gICAgSVNlcnZlciBpbnN0YW5jZSA9IFNlcnZlclV0aWxzLmdldFNlcnZlckZvck1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShpUHJvamVjdCksIHNlcnZlclR5cGVJRCwgZXhpc3RpbmdTZXJ2ZXIsIHRydWUsIEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOU1RBTkNFX05PVF9GT1VORCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICAgIElTdGF0dXMgcmV0dXJuZWRTdGF0dXMgPSBpbnN0YW5jZS5wdWJsaXNoKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotICAgICAgc3RhdHVzID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKHJldHVybmVkU3RhdHVzKTsKLSAgICAgIAotICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzIChpbnN0YW5jZS5wdWJsaXNoKGdldFByb2dyZXNzTW9uaXRvcigpKSk7Ci0gICAgICBlbnYuZ2V0TG9nKCkubG9nKExvZy5PSywgNTAyNiwgdGhpcywgImV4ZWN1dGUiLCBuZXcgU3RyaW5nKCJwcm9qZWN0PSIrcHJvamVjdCsiIHN1Y2Nlc3NmdWxseSBwdWJsaXNoZWQiKSk7Ci0gICAgICAvL0xvZy53cml0ZShQdWJsaXNoUHJvamVjdENvbW1hbmQuY2xhc3MsImV4ZWN1dGUiLExvZy5PSywicHJvamVjdD0iK3Byb2plY3QrIiBzdWNjZXNzZnVsbHkgcHVibGlzaGVkIik7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUFVCTElTSCIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIH0KLX0KLQotCi1wdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0KQotewotICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotfQotCi1wdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNlcnZlclR5cGVJRCkKLXsKLSAgdGhpcy5zZXJ2ZXJUeXBlSUQgPSBzZXJ2ZXJUeXBlSUQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgZXhpc3RpbmdTZXJ2ZXIpCi17Ci0gIHRoaXMuZXhpc3RpbmdTZXJ2ZXIgPSBleGlzdGluZ1NlcnZlcjsKLX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vUmVzdG9yZUJ1aWxkU3RhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1Jlc3RvcmVCdWlsZFN0YXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBmNTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vUmVzdG9yZUJ1aWxkU3RhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLnZhbGlkYXRlLlZhbGlkYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBSZXN0b3JlQnVpbGRTdGF0ZUNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0KLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwcml2YXRlIFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXJfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9XRUJTRVJWSUNFX1JFU1RPUkVfQlVJTEQiOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfV0VCU0VSVklDRV9SRVNUT1JFX0JVSUxEIjsKLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUjsKLSAgICovCi0gIHB1YmxpYyBSZXN0b3JlQnVpbGRTdGF0ZUNvbW1hbmQoKQotICB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0KLSAgICBzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7Ci0gICAgc2V0RGVzY3JpcHRpb24obXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsgICAgCi0KLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLnJlcG9ydChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVEFTS19ERVNDX1dFQlNFUlZJQ0VfUkVTVE9SRV9CVUlMRCIpKTsKLQotICAgIG1hbmFnZXJfLnJlc3RvcmVBdXRvQnVpbGQoKTsKLQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAgIAotICAvKioKLSAgICogQHBhcmFtIG1hbmFnZXJfIFRoZSBtYW5hZ2VyXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uTWFuYWdlcihWYWxpZGF0aW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgdGhpcy5tYW5hZ2VyXyA9IG1hbmFnZXI7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9SZXN0b3JlVmFsaWRhdGlvblN0YXRlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9SZXN0b3JlVmFsaWRhdGlvblN0YXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjdkZTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vUmVzdG9yZVZhbGlkYXRpb25TdGF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwudmFsaWRhdGUuVmFsaWRhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIFJlc3RvcmVWYWxpZGF0aW9uU3RhdGVDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCAKLXsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwcml2YXRlIFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXJfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9XRUJTRVJWSUNFX1JFU1RPUkVfVkFMSURBVElPTiI7Ci0gIHByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19XRUJTRVJWSUNFX1JFU1RPUkVfVkFMSURBVElPTiI7ICAKLQotICBwcml2YXRlIGJvb2xlYW4gcnVuVmFsaWRhdGlvbl87Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUjsKLSAgICovCi0gIHB1YmxpYyBSZXN0b3JlVmFsaWRhdGlvblN0YXRlQ29tbWFuZCggYm9vbGVhbiBydW5WYWxpZGF0aW9uICkKLSAgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCi0gICAgc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7IAotICAgIHJ1blZhbGlkYXRpb25fID0gcnVuVmFsaWRhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLnJlcG9ydChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVEFTS19ERVNDX1dFQlNFUlZJQ0VfUkVTVE9SRV9WQUxJREFUSU9OIikpOwotCi0gICAgbWFuYWdlcl8ucmVzdG9yZVZhbGlkYXRpb25Gb3JQcm9qZWN0cyggcnVuVmFsaWRhdGlvbl8gKTsgICAgCi0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSB2YWxpZGF0aW9uIG1hbmFnZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbk1hbmFnZXIoVmFsaWRhdGlvbk1hbmFnZXIgbWFuYWdlcikgewotICAgIHRoaXMubWFuYWdlcl8gPSBtYW5hZ2VyOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1NlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjY4MDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kIjsKLSAgcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiRW5zdXJlIERlcGxveWFibGUgaXMgYWRkZWQgdG8gU2VydmVyIENvbmZpZ3VyYXRpb24iOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgQm9vbGVhbiBjcmVhdGlvblNjZW5hcmlvXyA9IEJvb2xlYW4uVFJVRTsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHNfOwotICBwcml2YXRlIElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0XzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBzYW1wbGVQcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRF87Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRF87Ci0gIHByaXZhdGUgSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotICBwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUHJvamVjdFVSTF87Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3RVUkxfOwotICAKLSAgLy9hZGRlZFByb2plY3RUb1NlcnZlcl8gaXMgc2V0IHRvIHRydWUgaWYKLSAgLy8tIHRoZSBwcm9qZWN0IGV4aXN0cyBBTkQKLSAgLy8tIHRoZSBzZXJ2ZXIgZXhpc3RzIChpLmUuIHRoaXMgY29tbWFuZCBkaWQgbm90IGNyZWF0ZSBpdCkgQU5ECi0gIC8vLSB0aGlzIGNvbW1hbmQgYWRkZWQgdGhlIHByb2plY3QgdG8gdGhlIHNlcnZlcgotICBwcml2YXRlIGJvb2xlYW4gYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUgotICAgKi8KLSAgcHVibGljIFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZCgpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gICAgc2V0TmFtZShMQUJFTCk7Ci0gIH0KLQotICAvKioKLSAgICogRGVmYXVsdCBDVE9SCi0gICAqLwotICBwdWJsaWMgU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kKGJvb2xlYW4gY3JlYXRpb25TY2VuYXJpbykgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIHNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLSAgICBzZXROYW1lKExBQkVMKTsKLSAgICBjcmVhdGlvblNjZW5hcmlvXyA9IG5ldyBCb29sZWFuKGNyZWF0aW9uU2NlbmFyaW8pOwotICB9Ci0KLSAgLyoqCi0gICAqIGV4ZWN1dGUKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQotCSAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQiKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgdHJ5IHsKLQotICAgICAgaWYgKCEoY3JlYXRpb25TY2VuYXJpb18uYm9vbGVhblZhbHVlKCkpICkKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLQotICAgICAgLy8gZGV0ZXJtaW5lIGNsaWVudCBvciBzZXJ2aWNlIHByb2plY3QKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoKGNyZWF0aW9uU2NlbmFyaW9fLmJvb2xlYW5WYWx1ZSgpKSA/IHNlcnZpY2VQcm9qZWN0XyA6IHNhbXBsZVByb2plY3RfKTsKLSAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgICAgIHNhbXBsZVNlcnZlclR5cGVJRF8gPSBjbGllbnRJZHNfLmdldFNlcnZlcklkKCk7Ci0gICAgICAKLSAgICAgIC8vIGRldGVybWluZSBzZXJ2aWNlIG9yIHNhbXBsZSBzZXJ2ZXIgZmFjdG9yeSBJZAotICAgICAgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCA9ICgoY3JlYXRpb25TY2VuYXJpb18uYm9vbGVhblZhbHVlKCkpID8gc2VydmljZVNlcnZlclR5cGVJRF8gOiBzYW1wbGVTZXJ2ZXJUeXBlSURfKTsKLQotICAgICAgLy8gZ2V0IGFuIElTZXJ2ZXIgb2JqZWN0OyBlaXRoZXIgZXhpc3Rpbmcgb3IgY3JlYXRlIG9uZQotICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoKGNyZWF0aW9uU2NlbmFyaW9fLmJvb2xlYW5WYWx1ZSgpKSA/IHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gOiBzYW1wbGVFeGlzdGluZ1NlcnZlcl8pOwotICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0gICAgICAJLy8gZmluZCBleGFjdCBzZXJ2ZXIgZm9yIGdpdmVuIHByb2plY3QKLSAgICAgICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gZm91bmRTZXJ2ZXIgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgaWYgKHNlcnZlcnNbaV0uZXF1YWxzKHNlcnZlcikpCi0gICAgICAgICAgICBmb3VuZFNlcnZlciA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmb3VuZFNlcnZlcikgewotICAgICAgICAgIFN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIHNlcnZlciwgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIHRydWUsIEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLSAgICAgICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAgICAgICAgIAotICAgICAgICAgIGFkZGVkUHJvamVjdFRvU2VydmVyXyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAoIShjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgJiYgc2VydmljZVNlcnZlclR5cGVJRF8gPT0gc2FtcGxlU2VydmVyVHlwZUlEXykgLy9DbGllbnQKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlciA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlcl87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgc2VydmVyID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVTZXJ2ZXIoZW52LCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgc2VydmVyRmFjdG9yeUlkLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DUkVBVEVfU0VSVkVSIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIGlmIG1vZHVsZSBpcyBhbHJlYWR5IGFzc29jaWF0ZWQKLSAgICAgICAgSU1vZHVsZVtdIHBhcmVudE1vZHVsZXMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotICAgICAgICBpZiAocGFyZW50TW9kdWxlcyE9bnVsbCAmJiBwYXJlbnRNb2R1bGVzLmxlbmd0aCE9MCkgewotICAgICAgICAgIGlmICghU2VydmVyVXRpbC5jb250YWluc01vZHVsZShzZXJ2ZXIsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKSkgeyAgICAgICAgCi0gICAgICAgICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBzZXJ2ZXIsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCB0cnVlLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0gICAgICAgICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgICAgICAgICByZXR1cm4gbW1TdGF0dXM7ICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgIAotICAgICAgfQotICAgICAgCi0gICAgICAvLwotICAgICAgU3RyaW5nIHByb2plY3RVUkwgPSBSZXNvdXJjZVV0aWxzLmdldFdlYlByb2plY3RVUkwocHJvamVjdCwgc2VydmVyRmFjdG9yeUlkLCBzZXJ2ZXIpOwotICAgICAgaWYgKGNyZWF0aW9uU2NlbmFyaW9fLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2ZXI7Ci0gICAgICAgIHNlcnZpY2VQcm9qZWN0VVJMXyA9IHByb2plY3RVUkw7Ci0gICAgICAgIGlmIChzZXJ2aWNlU2VydmVyVHlwZUlEXy5lcXVhbHMoc2FtcGxlU2VydmVyVHlwZUlEXykgJiYgY2xpZW50SWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk9PW51bGwpewotICAgICAgICAJc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfID0gc2VydmljZUV4aXN0aW5nU2VydmVyXzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHNhbXBsZUV4aXN0aW5nU2VydmVyXyA9IHNlcnZlcjsKLSAgICAgICAgc2FtcGxlUHJvamVjdFVSTF8gPSBwcm9qZWN0VVJMOwotICAgICAgfQotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0JBRF9TRVJWRVJfQ09ORklHIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KSB7Ci0gICAgc2VydmljZVByb2plY3RfID0gc2VydmljZVByb2plY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0KElQcm9qZWN0IHNhbXBsZVByb2plY3QpIHsKLSAgICBzYW1wbGVQcm9qZWN0XyA9IHNhbXBsZVByb2plY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVyVHlwZUlEKFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEKSB7Ci0gICAgc2VydmljZVNlcnZlclR5cGVJRF8gPSBzZXJ2aWNlU2VydmVyVHlwZUlEOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlU2VydmVyVHlwZUlEKFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSUQpIHsKLSAgICBzYW1wbGVTZXJ2ZXJUeXBlSURfID0gc2FtcGxlU2VydmVyVHlwZUlEOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKSB7Ci0gICAgc2VydmljZUV4aXN0aW5nU2VydmVyXyA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlcjsKLSAgfQotCi0gIHB1YmxpYyBJU2VydmVyIGdldFNlcnZpY2VFeGlzdGluZ1NlcnZlcigpIHsKLSAgICByZXR1cm4gc2VydmljZUV4aXN0aW5nU2VydmVyXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkKCkgewotCVN0cmluZyBpZCA9IG51bGw7Ci0JSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gbnVsbDsKLQotCWlmIChzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfIT1udWxsKXsKLQkgIHdjID0gc2VydmljZUV4aXN0aW5nU2VydmVyXy5jcmVhdGVXb3JraW5nQ29weSgpOwotCSAgaWQgPSAod2MhPW51bGwgPyB3Yy5nZXRJZCgpIDogbnVsbCk7Ci0JfQotCi0JcmV0dXJuIGlkOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVFeGlzdGluZ1NlcnZlckluc3RJZCgpewotCVN0cmluZyBpZCA9IG51bGw7Ci0JSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gbnVsbDsKLQlpZiAoc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfIT1udWxsKXsKLQkgIHdjID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JICBpZCA9ICh3YyE9bnVsbCA/IHdjLmdldElkKCkgOiBudWxsKTsKLQl9Ci0KLQlyZXR1cm4gaWQ7Ci0JCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIpIHsKLSAgICBzYW1wbGVFeGlzdGluZ1NlcnZlcl8gPSBzYW1wbGVFeGlzdGluZ1NlcnZlcjsKLSAgfQotCi0gIHB1YmxpYyBJU2VydmVyIGdldFNhbXBsZUV4aXN0aW5nU2VydmVyKCkgewotICAgIHJldHVybiBzYW1wbGVFeGlzdGluZ1NlcnZlcl87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VQcm9qZWN0VVJMKCkgewotICAgIHJldHVybiBzZXJ2aWNlUHJvamVjdFVSTF87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVByb2plY3RVUkwoKSB7Ci0gICAgcmV0dXJuIHNhbXBsZVByb2plY3RVUkxfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZCl7Ci0gIAl0aGlzLmNsaWVudElkc18gPSBjbGllbnRJZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRBZGRlZFByb2plY3RUb1NlcnZlcigpIHsKLSAgICByZXR1cm4gYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1N0YXJ0UHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vU3RhcnRQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTA2MTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vU3RhcnRQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5XZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotcHVibGljIGNsYXNzIFN0YXJ0UHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUSU9OID0gIlN0YXJ0IFdlYiBQcm9qZWN0IjsKLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBMQUJFTCA9ICJTdGFydFByb2plY3RDb21tYW5kIjsKLXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotcHJpdmF0ZSBCb29sZWFuIGNyZWF0aW9uU2NlbmFyaW9fID0gQm9vbGVhbi5UUlVFOwotCi1wcml2YXRlIGJvb2xlYW4gaXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZF87Ci1wcml2YXRlIElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0XzsKLXByaXZhdGUgSVByb2plY3Qgc2FtcGxlUHJvamVjdF87Ci1wcml2YXRlIFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEXzsKLXByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRF87Ci1wcml2YXRlIElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyXzsKLXByaXZhdGUgSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcl87Ci0KLS8vIHJtIHByaXZhdGUgTW9kZWwgbW9kZWxfOwotCi0vKioKLSAqIERlZmF1bHQgQ1RPUjsKLSAqLwotcHVibGljIFN0YXJ0UHJvamVjdENvbW1hbmQoKSB7Ci0JU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0Jc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotCXNldE5hbWUoTEFCRUwpOyAgICAKLSAgICAvL1RPRE8gc2V0UnVuSW5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oZmFsc2UpOwotfQotCi0vKioKLSAqIERlZmF1bHQgQ1RPUjsKLSAqLwotcHVibGljIFN0YXJ0UHJvamVjdENvbW1hbmQoYm9vbGVhbiBjcmVhdGlvblNjZW5hcmlvICkgewotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLQlzZXROYW1lKExBQkVMKTsKLQkKLQkvL1RPRE8gc2V0UnVuSW5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oZmFsc2UpOwotCWNyZWF0aW9uU2NlbmFyaW9fID0gbmV3IEJvb2xlYW4oY3JlYXRpb25TY2VuYXJpbyk7Ci19Ci0KLS8qKgotICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICovCi1wdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotewotICAgIAotICAKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQUk9HUkVTU19JTkZPX1NUQVJUX1dFQl9QUk9KRUNUIikpOwotICAgIAotICAgIAotICAgIElQcm9qZWN0IHByb2plY3QgPSAoKGNyZWF0aW9uU2NlbmFyaW9fLmJvb2xlYW5WYWx1ZSgpKSA/IHNlcnZpY2VQcm9qZWN0XyA6IHNhbXBsZVByb2plY3RfKTsKLSAgICBTdHJpbmcgc2VydmVyVHlwZUlEID0gKChjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgPyBzZXJ2aWNlU2VydmVyVHlwZUlEXyA6IHNhbXBsZVNlcnZlclR5cGVJRF8pOwotICAgIElTZXJ2ZXIgc2VydmVyID0gKChjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgPyBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfIDogc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfKTsgICAKLSAgICBpZiAoc2VydmVyVHlwZUlEID09IG51bGwgJiYgc2VydmVyIT1udWxsKSB7Ci0gICAgCXNlcnZlclR5cGVJRCA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICB9Ci0gICAgaWYgKHByb2plY3QgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BST0pFQ1RfTk9UX0ZPVU5EIiksIFN0YXR1cy5FUlJPUik7ICAKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQkKLSAgICBJU2VydmVyIGluc3RhbmNlID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyRm9yTW9kdWxlKFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBzZXJ2ZXJUeXBlSUQsIHNlcnZlciwgdHJ1ZSwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5TVEFOQ0VfTk9UX0ZPVU5EIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgdHJ5Ci0gICAJewotICAgCQlBYnN0cmFjdFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyQ29tbWFuZCA9IG51bGw7Ci0gICAJCVdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgIAlzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChpbnN0YW5jZS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgCXN0YXJ0U2VydmVyQ29tbWFuZC5TdGFydFNlcnZlcihwcm9qZWN0LCBpbnN0YW5jZSwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudiksIGlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfKTsKLSAgICAJcmV0dXJuIHN0YXR1czsKLSAgIAl9Ci0gIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlICkKLSAgCXsKLSAgICAJSVN0YXR1cyBlbWJlZGRlZFN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgIAlzdGF0dXMgPSBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoZW1iZWRkZWRTdGF0dXMpOwotICAgIAllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gIAkJcmV0dXJuIHN0YXR1czsKLSAgCX0KLSAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgIAl7Ci0gICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAJICAgcmV0dXJuIHN0YXR1czsKLSAgIAl9Ci0gICAKLX0KLQotcHVibGljIHZvaWQgc2V0Q3JlYXRpb25TY2VuYXJpbyhCb29sZWFuIGNyZWF0aW9uU2NlbmFyaW8pCi17Ci0JY3JlYXRpb25TY2VuYXJpb18gPSBjcmVhdGlvblNjZW5hcmlvOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkKLXsKLSAgc2VydmljZVByb2plY3RfID0gc2VydmljZVByb2plY3Q7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoSVByb2plY3Qgc2FtcGxlUHJvamVjdCkKLXsKLSAgc2FtcGxlUHJvamVjdF8gPSBzYW1wbGVQcm9qZWN0OwotfQotCi1wdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVyVHlwZUlEKFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEKQotewotICBzZXJ2aWNlU2VydmVyVHlwZUlEXyA9IHNlcnZpY2VTZXJ2ZXJUeXBlSUQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNhbXBsZVNlcnZlclR5cGVJRChTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEKQotewotICBzYW1wbGVTZXJ2ZXJUeXBlSURfID0gc2FtcGxlU2VydmVyVHlwZUlEOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIpCi17Ci0gIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7Ci0gIGlmIChzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfICE9IG51bGwpCi0gICAgc2V0U2VydmljZVNlcnZlclR5cGVJRChzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLX0KLQotcHVibGljIHZvaWQgc2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcikKLXsKLSAgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIGlmIChzYW1wbGVFeGlzdGluZ1NlcnZlcl8gIT0gbnVsbCkKLSAgICBzZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLX0KLQotcHVibGljIHZvaWQgc2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZChib29sZWFuIHdlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkKQotewotICBpc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXyA9IHdlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1N0YXJ0U2VydmVyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9TdGFydFNlcnZlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5ZTk5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1N0YXJ0U2VydmVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBTdGFydFNlcnZlckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmVySW5zdGFuY2VJZDsKLQkKLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCXsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZlckluc3RhbmNlSWQpCi0JewotCQl0aGlzLnNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1N0YXJ0VG9tY2F0U2VydmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1N0YXJ0VG9tY2F0U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOGJjNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9TdGFydFRvbWNhdFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotCi1wdWJsaWMgY2xhc3MgU3RhcnRUb21jYXRTZXJ2ZXIgZXh0ZW5kcyBBYnN0cmFjdFN0YXJ0U2VydmVyIHsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXJzVG9DbGFzc1BhdGgoSVNlcnZlciB0SW5zdGFuY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVtb3RlU2VydmVyUGF0aChJU2VydmVyIHNlcnZlcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wU2VydmVyKElTZXJ2ZXIgc2VydmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0KLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCQlzZXJ2ZXIuc3luY2hyb25vdXNTdG9wKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9Gb2xkZXJSZXNvdXJjZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vRm9sZGVyUmVzb3VyY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMzI4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9Gb2xkZXJSZXNvdXJjZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkFueUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLQotCi0vKioKLSogVGhpcyBpcyBhIGtpbmQgb2Yge0BsaW5rIEZpbHRlcn0gdGhhdCBhY2NlcHRzIG9ubHkgb2JqZWN0cwotKiB3aGljaCBpbmRpY2F0ZSBhIEphdmEgcmVzb3VyY2UuIEluIHBhcnRpY3VsYXIsIGFueQotKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlfSB3aG9zZQotKiBwYXRobmFtZSwgb3IgYW55IG9iamVjdCB3aG9zZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYXMKLSogcmV0dXJuZWQgYnkgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4sIGVuZHMgaW4KLSogIjxjb2RlPi5qYXZhPC9jb2RlPiIgb3IgIjxjb2RlPi5jbGFzczwvY29kZT4iIHdpbGwgYmUgYWNjZXB0ZWQuCi0qIEFsbCBvdGhlciBvYmplY3RzIHdpbGwgYmUgcmVqZWN0ZWQuCi0qLwotcHVibGljIGNsYXNzIEZvbGRlclJlc291cmNlRmlsdGVyIGV4dGVuZHMgQW55RmlsdGVyCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5KYXZhUmVzb3VyY2VGaWx0ZXI8L2NvZGU+IHRoYXQgZmlsdGVycwotICAqICI8Y29kZT4uamF2YTwvY29kZT4iIGFuZCAiPGNvZGU+LmNsYXNzPC9jb2RlPiIgb2JqZWN0cy4KLSAgKiBFcXVpdmFsZW50IHRvIDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcihBTExfRklMRVMpPC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIEZvbGRlclJlc291cmNlRmlsdGVyICgpIHsgfQotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlRk9MREVSX0ZJTFRFUl9OQU1FIik7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVGT0xERVJfRklMVEVSX0RFU0MiKTsKLSAgfQotCi0gcHVibGljIElTdGF0dXMgc3RhdHVzT2YgKCBPYmplY3Qgb2JqZWN0ICkKLSAgewotICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0YXR1cygKLSAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAwLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUZJTFRFUl9NU0dfRVJST1JfTlVMTF9PQkpFQ1QiKSwKLSAgICAgICAgbnVsbAotICAgICAgKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2Upb2JqZWN0OwotICAgICAgbmFtZSA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZPTERFUikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgICAgMCwKLSAgICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUZJTFRFUl9NU0dfRVJST1JfTk9UX0ZPTERFUiIsbmV3IE9iamVjdFtdIHtuYW1lfSksCi0gICAgICAgICAgbnVsbAotICAgICAgICApOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLCIiLG51bGwpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGFjY2VwdHNOYW1lICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0lTZXJ2ZXJEZWZhdWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0lTZXJ2ZXJEZWZhdWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxZjFkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9JU2VydmVyRGVmYXVsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi0KLS8qKgotICogSW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIHByb3ZpZGUgbG9naWMgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvCi0gKiB0aGUgc2VydmVyIGRlZmF1bHRpbmcgYWxnb3JpdGhtLiAKLSAqIChTZWUgdGhlIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi5zZXJ2ZXJEZWZhdWx0ZXIgZXh0ZW5zaW9uIHBvaW50KSAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckRlZmF1bHRlcgotewotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBwcm9qZWN0Ci0gICAqIEByZXR1cm4gU2VydmVySW5mby4gCi0gICAqIElmIG5vIGV4aXN0aW5nIHNlcnZlciBvciBzZXJ2ZXIgdHlwZSBpcyByZWNvbW1lbmRlZCwgcmV0dXJuIG51bGwuCi0gICAqIElmIGEgc2VydmVyIHR5cGUgaXMgcmVjb21tZW5kZWQsIHJldHVybiBhbiBpbnN0YW5jZSBvZiBTZXJ2ZXJJbmZvIHdpdGggYSBub24tbnVsbAotICAgKiBub24tZW1wdHkgU3RyaW5nIGZvciB0aGUgc2VydmVyRmFjdG9yeUlkIGFuZCBudWxsIGZvciB0aGUgc2VydmVySW5zdGFuY2VJZC4KLSAgICogSWYgYSBzZXJ2ZXIgaW5zdGFuY2UgaXMgcmVjb21tZW5kZWQsIHJldHVybiBhbiBpbnN0YW5jZSBvZiBTZXJ2ZXJJbmZvIHdpdGggYSBub24tbnVsbAotICAgKiBub24tZW1wdHkgU3RyaW5nIGZvciB0aGUgc2VydmVyRmFjdG9yeUlkIGFuZCB0aGUgc2VydmVySW5zdGFuY2VJZC4KLSAgICovCi0gIHB1YmxpYyBTZXJ2ZXJJbmZvIHJlY29tbWVuZERlZmF1bHRTZXJ2ZXIoSVByb2plY3QgcHJvamVjdCk7Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vSmF2YVJlc291cmNlRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9KYXZhUmVzb3VyY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0NGY5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9KYXZhUmVzb3VyY2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uQW55RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luOwotCi0KLS8qKgotKiBUaGlzIGlzIGEga2luZCBvZiB7QGxpbmsgRmlsdGVyfSB0aGF0IGFjY2VwdHMgb25seSBvYmplY3RzCi0qIHdoaWNoIGluZGljYXRlIGEgSmF2YSByZXNvdXJjZS4gSW4gcGFydGljdWxhciwgYW55Ci0qIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2V9IHdob3NlCi0qIHBhdGhuYW1lLCBvciBhbnkgb2JqZWN0IHdob3NlIHN0cmluZyByZXByZXNlbnRhdGlvbiBhcwotKiByZXR1cm5lZCBieSA8Y29kZT50b1N0cmluZygpPC9jb2RlPiwgZW5kcyBpbgotKiAiPGNvZGU+LmphdmE8L2NvZGU+IiBvciAiPGNvZGU+LmNsYXNzPC9jb2RlPiIgd2lsbCBiZSBhY2NlcHRlZC4KLSogQWxsIG90aGVyIG9iamVjdHMgd2lsbCBiZSByZWplY3RlZC4KLSovCi1wdWJsaWMgY2xhc3MgSmF2YVJlc291cmNlRmlsdGVyIGV4dGVuZHMgQW55RmlsdGVyCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogQSA8Y29kZT5KYXZhUmVzb3VyY2VGaWx0ZXI8L2NvZGU+IGNvbnN0cnVjdGVkIHdpdGggdGhpcyB2YWx1ZSB3aWxsCi0gICogYWNjZXB0ICI8Y29kZT4uamF2YTwvY29kZT4iLCBidXQgbm90ICI8Y29kZT4uY2xhc3M8L2NvZGU+Iiwgb2JqZWN0cy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEpBVkFfRklMRVMgPSAoYnl0ZSkxOwotCi0gIC8qKgotICAqIEEgPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyPC9jb2RlPiBjb25zdHJ1Y3RlZCB3aXRoIHRoaXMgdmFsdWUgd2lsbAotICAqIGFjY2VwdCAiPGNvZGU+LmNsYXNzPC9jb2RlPiIsIGJ1dCBub3QgIjxjb2RlPi5qYXZhPC9jb2RlPiIsIG9iamVjdHMuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBDTEFTU19GSUxFUyA9IChieXRlKTI7Ci0KLSAgLyoqCi0gICogQSA8Y29kZT5KYXZhUmVzb3VyY2VGaWx0ZXI8L2NvZGU+IGNvbnN0cnVjdGVkIHdpdGggdGhpcyB2YWx1ZSB3aWxsCi0gICogYWNjZXB0IGJvdGggIjxjb2RlPi5qYXZhPC9jb2RlPiIgYW5kICI8Y29kZT4uY2xhc3M8L2NvZGU+IiBvYmplY3RzLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQUxMX0ZJTEVTID0gKGJ5dGUpMjU1OwotCi0gIHByaXZhdGUgYnl0ZSBleHRlbnNpb25zXzsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcjwvY29kZT4gdGhhdCBmaWx0ZXJzCi0gICogIjxjb2RlPi5qYXZhPC9jb2RlPiIgYW5kICI8Y29kZT4uY2xhc3M8L2NvZGU+IiBvYmplY3RzLgotICAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyKEFMTF9GSUxFUyk8L2NvZGU+LgotICAqLwotICBwdWJsaWMgSmF2YVJlc291cmNlRmlsdGVyICgpCi0gIHsKLSAgICB0aGlzKEFMTF9GSUxFUyk7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcjwvY29kZT4gdGhhdCBmaWx0ZXJzCi0gICogIjxjb2RlPi5qYXZhPC9jb2RlPiIgb2JqZWN0cywgIjxjb2RlPi5jbGFzczwvY29kZT4iIG9iamVjdHMsCi0gICogb3IgYm90aCBpZiB0aGUgdmFsdWUgb2YgPGNvZGU+ZXh0ZW5zaW9uczwvY29kZT4gaXMKLSAgKiB7QGxpbmsgI0pBVkFfRklMRVN9LCB7QGxpbmsgI0NMQVNTX0ZJTEVTfSBvciB7QGxpbmsgI0FMTF9GSUxFU30KLSAgKiByZXNwZWN0aXZlbHkuCi0gICogQHBhcmFtIGV4dGVuc2lvbnMgT25lIG9mCi0gICoge0BsaW5rICNKQVZBX0ZJTEVTfSwge0BsaW5rICNDTEFTU19GSUxFU30gb3Ige0BsaW5rICNBTExfRklMRVN9LgotICAqLwotICBwdWJsaWMgSmF2YVJlc291cmNlRmlsdGVyICggYnl0ZSBleHRlbnNpb25zICkKLSAgewotICAgIGV4dGVuc2lvbnNfID0gZXh0ZW5zaW9uczsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUpBVkFfRklMVEVSX05BTUUiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUpBVkFfRklMVEVSX0RFU0MiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogU2VlIHtAbGluayBGaWx0ZXIjc3RhdHVzT2Z9IGZvciBnZW5lcmFsIGNvbW1lbnRzLgotICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBmaWx0ZXIuCi0gICogQHJldHVybiBBbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9Ci0gICogaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBpZiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPgotICAqIHJlcHJlc2VudHMgYSBKYXZhIHJlc291cmNlLgotICAqLwotICBwdWJsaWMgSVN0YXR1cyBzdGF0dXNPZiAoIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgIDAsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlRklMVEVSX01TR19FUlJPUl9OVUxMX09CSkVDVCIpLAotICAgICAgICBudWxsCi0gICAgICApOwotICAgIH0KLQotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlvYmplY3Q7Ci0gICAgICBuYW1lID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgICAgMCwKLSAgICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUZJTFRFUl9NU0dfRVJST1JfTk9UX0ZJTEUiLG5ldyBPYmplY3RbXSB7bmFtZX0pLAotICAgICAgICAgIG51bGwKLSAgICAgICAgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWUgPSBvYmplY3QudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBpZiAoIWFjY2VwdHNOYW1lKG5hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgIDAsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlSkFWQV9GSUxURVJfTVNHX0VSUk9SX1dST05HX0VYVEVOU0lPTiIsbmV3IE9iamVjdFtdIHtuYW1lfSksCi0gICAgICAgIG51bGwKLSAgICAgICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwiIixudWxsKTsKLSAgfQotCi0gIC8vCi0gIC8vIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhY2NlcHRhYmxlIGJhc2VkIHVwb24gaXRzIGV4dGVuc2lvbgotICAvLyBhbmQgdGhlIHZhbHVlIG9mIHRoZSBleHRlbnNpb25zXyBiaXRtYXNrLgotICAvLwotICBwcml2YXRlIGJvb2xlYW4gYWNjZXB0c05hbWUgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICByZXR1cm4gKCAKLSAgICAgIChuYW1lLmVuZHNXaXRoKCIuamF2YSIpICYmICgoZXh0ZW5zaW9uc18gJiBKQVZBX0ZJTEVTKSAhPSAwKSkgfHwKLSAgICAgIChuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSAmJiAoKGV4dGVuc2lvbnNfICYgQ0xBU1NfRklMRVMpICE9IDApKQotICAgICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL01hcHBpbmdVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vTWFwcGluZ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZTg0ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vTWFwcGluZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLQotCi0vKioKLSogVGhpcyBjbGFzcyBjb250YWlucyB1c2VmdWwgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIFNlcnZlciBwbHVnaW4gZnVuY3Rpb25zCi0qLwotcHVibGljIGZpbmFsIGNsYXNzIE1hcHBpbmdVdGlscwotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFUlZJQ0VfRVhUID0gIlNlcnZpY2Uud3NkbCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JJTkRJTkdfRVhUID0gIkJpbmRpbmcud3NkbCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1Y0X1NFUlZJQ0VfRVhUID0gIi1zZXJ2aWNlLndzZGwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WNF9CSU5ESU5HX0VYVCA9ICItYmluZGluZy53c2RsIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRVhURU5TSU9OID0gIi53c2RsIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRk9MREVSID0gIndzZGwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NLRUxFVE9OX1BBQ0tBR0VOQU1FID0gInNlcnZpY2UiOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIFdTREwgZm9sZGVyIHBhdGgKLSAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdAotICAqLwotICBwdWJsaWMgc3RhdGljIElQYXRoIGdldFdTRExGb2xkZXJQYXRoIChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgSVBhdGggd3NkbEZvbGRlcj1udWxsOwotLy8gIAlJUGF0aCB3ZWJNb2R1bGVTZXJ2ZXJSb290ID0gUmVzb3VyY2VVdGlscy5nZXRXZWJNb2R1bGVTZXJ2ZXJSb290KCBwcm9qZWN0ICkuZ2V0RnVsbFBhdGgoKTsKLSAgCUlQYXRoIHdlYk1vZHVsZVNlcnZlclJvb3QgPSBKMkVFVXRpbHMuZ2V0Rmlyc3RXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLSAgCWlmICh3ZWJNb2R1bGVTZXJ2ZXJSb290ICE9IG51bGwgKQotICAJCXdzZGxGb2xkZXIgPSB3ZWJNb2R1bGVTZXJ2ZXJSb290LmFwcGVuZChXU0RMX0ZPTERFUik7Ci0gICAgcmV0dXJuIHdzZGxGb2xkZXI7Ci0gIH0KLSAgICAKLQotICAgLyoqCi0gICogUmV0dXJucyB0aGUgYmFzZSBuYW1lIGJhc2VkIG9uIFdTREwgZmlsZSBuYW1lCi0gICogQHBhcmFtIHdzZGxOYW1lIFdTREwgZmlsZSBuYW1lCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhc2VOYW1lIChTdHJpbmcgd3NkbExvY2F0aW9uICkKLSAgewotICAJU3RyaW5nIHdzZGxOYW1lPXdzZGxMb2NhdGlvbjsKLSAgCQotICAJaW50IGluZGV4ID0gd3NkbExvY2F0aW9uLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgaWYgKGluZGV4IT0gLTEpIHsKLSAgICAgIHdzZGxOYW1lID0gd3NkbExvY2F0aW9uLnN1YnN0cmluZyhpbmRleCsxLHdzZGxOYW1lLmxlbmd0aCgpKTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIGJhc2VOYW1lPXdzZGxOYW1lOwotICAgIGlmICggd3NkbE5hbWUuZW5kc1dpdGgoREVGQVVMVF9TRVJWSUNFX0VYVCkgKSB7Ci0gICAgICBiYXNlTmFtZSA9IHdzZGxOYW1lLnN1YnN0cmluZygwLCh3c2RsTmFtZS5sZW5ndGgoKSAtIERFRkFVTFRfU0VSVklDRV9FWFQubGVuZ3RoKCkpKTsKLSAgICB9IGVsc2UgaWYgKCB3c2RsTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKERFRkFVTFRfVjRfU0VSVklDRV9FWFQpICkgewotICAgICAgYmFzZU5hbWUgPSB3c2RsTmFtZS5zdWJzdHJpbmcoMCwod3NkbE5hbWUubGVuZ3RoKCkgLSBERUZBVUxUX1Y0X1NFUlZJQ0VfRVhULmxlbmd0aCgpKSk7Ci0gICAgfSBlbHNlIGlmICh3c2RsTmFtZS5lbmRzV2l0aChERUZBVUxUX0JJTkRJTkdfRVhUKSkgewotICAgICAgYmFzZU5hbWUgPSB3c2RsTmFtZS5zdWJzdHJpbmcoMCwod3NkbE5hbWUubGVuZ3RoKCktREVGQVVMVF9CSU5ESU5HX0VYVC5sZW5ndGgoKSkpOwotICAgIH0gZWxzZSBpZiAod3NkbE5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChERUZBVUxUX1Y0X0JJTkRJTkdfRVhUKSkgewotICAgICAgYmFzZU5hbWUgPSB3c2RsTmFtZS5zdWJzdHJpbmcoMCwod3NkbE5hbWUubGVuZ3RoKCktREVGQVVMVF9WNF9CSU5ESU5HX0VYVC5sZW5ndGgoKSkpOwotICAgIH0gZWxzZSBpZiAod3NkbE5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChXU0RMX0VYVEVOU0lPTikpIHsKLSAgICAJYmFzZU5hbWUgPSB3c2RsTmFtZS5zdWJzdHJpbmcoMCwod3NkbE5hbWUubGVuZ3RoKCkgLSBXU0RMX0VYVEVOU0lPTi5sZW5ndGgoKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBubyByZWNvZ25pemFibGUgc3VmZml4LCBqdXN0IHJlbW92ZSBleHRlbnNpb24sIGlmIGFueQotICAgICAgaW50IGluZGV4NCA9IGJhc2VOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICBpZiAoaW5kZXg0IT0tMSkKLSAgICAgICAgYmFzZU5hbWUgPSBiYXNlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXg0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGJhc2VOYW1lOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1Byb3BlcnRpZXNSZXNvdXJjZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vUHJvcGVydGllc1Jlc291cmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmIyZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vUHJvcGVydGllc1Jlc291cmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkFueUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLQotCi0vKioKLSogVGhpcyBpcyBhIGtpbmQgb2Yge0BsaW5rIEZpbHRlcn0gdGhhdCBhY2NlcHRzIG9ubHkgb2JqZWN0cwotKiB3aGljaCBpbmRpY2F0ZSBhIEphdmEgcmVzb3VyY2UuIEluIHBhcnRpY3VsYXIsIGFueQotKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlfSB3aG9zZQotKiBwYXRobmFtZSwgb3IgYW55IG9iamVjdCB3aG9zZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYXMKLSogcmV0dXJuZWQgYnkgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4sIGVuZHMgaW4KLSogIjxjb2RlPi5qYXZhPC9jb2RlPiIgb3IgIjxjb2RlPi5jbGFzczwvY29kZT4iIHdpbGwgYmUgYWNjZXB0ZWQuCi0qIEFsbCBvdGhlciBvYmplY3RzIHdpbGwgYmUgcmVqZWN0ZWQuCi0qLwotcHVibGljIGNsYXNzIFByb3BlcnRpZXNSZXNvdXJjZUZpbHRlciBleHRlbmRzIEFueUZpbHRlcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyPC9jb2RlPiB0aGF0IGZpbHRlcnMKLSAgKiAiPGNvZGU+LmphdmE8L2NvZGU+IiBhbmQgIjxjb2RlPi5jbGFzczwvY29kZT4iIG9iamVjdHMuCi0gICogRXF1aXZhbGVudCB0byA8Y29kZT5KYXZhUmVzb3VyY2VGaWx0ZXIoQUxMX0ZJTEVTKTwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBQcm9wZXJ0aWVzUmVzb3VyY2VGaWx0ZXIgKCkKLSAgewotICAgIAotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlUFJPUEVSVElFU19GSUxURVJfTkFNRSIpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlUFJPUEVSVElFU19GSUxURVJfREVTQyIpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9Ci0gICogZGVzY3JpYmluZyB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPidzIGFzc2Vzc21lbnQgb2YKLSAgKiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4KLSAgKiBTZWUge0BsaW5rIEZpbHRlciNzdGF0dXNPZn0gZm9yIGdlbmVyYWwgY29tbWVudHMuCi0gICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbHRlci4KLSAgKiBAcmV0dXJuIEFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1c30KLSAgKiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGlmIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICogcmVwcmVzZW50cyBhIEphdmEgcmVzb3VyY2UuCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgMCwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVGSUxURVJfTVNHX0VSUk9SX05VTExfT0JKRUNUIiksCi0gICAgICAgIG51bGwKLSAgICAgICk7Ci0gICAgfQotCi0gICAgU3RyaW5nIG5hbWUgPSBudWxsOwotCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKW9iamVjdDsKLSAgICAgIG5hbWUgPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFN0YXR1cygKLSAgICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgICAwLAotICAgICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlRklMVEVSX01TR19FUlJPUl9OT1RfRklMRSIsbmV3IE9iamVjdFtdIHtuYW1lfSksCi0gICAgICAgICAgbnVsbAotICAgICAgICApOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgbmFtZSA9IG9iamVjdC50b1N0cmluZygpOwotICAgIH0KLQotCWlmICghbmFtZS5lbmRzV2l0aCgiLnByb3BlcnRpZXMiKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0YXR1cygKLSAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAwLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJVBST1BFUlRJRVNfRklMVEVSX01TR19FUlJPUl9XUk9OR19FWFRFTlNJT04iLG5ldyBPYmplY3RbXSB7bmFtZX0pLAotICAgICAgICBudWxsCi0gICAgICApOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsIiIsbnVsbCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vU2VydmVySW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vU2VydmVySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI1Y2IyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1NlcnZlckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVySW5mbwotewotICBTdHJpbmcgc2VydmVyRmFjdG9yeUlkOwotICBTdHJpbmcgc2VydmVySW5zdGFuY2VJZDsKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVyRmFjdG9yeUlkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJGYWN0b3J5SWQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZlckZhY3RvcnlJZDsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHNlcnZlckZhY3RvcnlJZCBUaGUgc2VydmVyRmFjdG9yeUlkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gICAgdGhpcy5zZXJ2ZXJGYWN0b3J5SWQgPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVySW5zdGFuY2VJZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySW5zdGFuY2VJZCgpCi0gIHsKLSAgICByZXR1cm4gc2VydmVySW5zdGFuY2VJZDsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHNlcnZlckluc3RhbmNlSWQgVGhlIHNlcnZlckluc3RhbmNlSWQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmVySW5zdGFuY2VJZChTdHJpbmcgc2VydmVySW5zdGFuY2VJZCkKLSAgewotICAgIHRoaXMuc2VydmVySW5zdGFuY2VJZCA9IHNlcnZlckluc3RhbmNlSWQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1dTRExQYXJzZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9XU0RMUGFyc2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDVhZjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1dTRExQYXJzZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotLyoqCi0gKiAKLSAqIFRoZSBmYWN0b3J5IGNsYXNzIGNhbiBiZSB1c2VkIHRvIGdldCBhdCBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUKLSAqIFdTREwgcGFyc2VyLiAgTm90ZTogIFRoaXMgY2xhc3MgaXMgdGVtcG9yYXJ5LiAgV2Ugd2lsbCBwcm9iYWJseSBjb21lCi0gKiB1cCB3aXRoIGEgYmV0dGVyIG1ldGhvZCBvZiBoYW5kbGluZyBwYXNzaW5nIGFyb3VuZCB0aGUgcGFyc2VyLgotICoKLSAqLwotcHVibGljIGNsYXNzIFdTRExQYXJzZXJGYWN0b3J5IAotewotICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlc1BhcnNlckV4dCBwYXJzZXJfOwotICAKLSAgcHJpdmF0ZSBXU0RMUGFyc2VyRmFjdG9yeSgpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXU0RMUGFyc2VyKCkKLSAgewotICAgIGlmKCBwYXJzZXJfID09IG51bGwgKQotCXsKLQkgIHBhcnNlcl8gPSBuZXcgV2ViU2VydmljZXNQYXJzZXJFeHQoKTsKLQl9Ci0JCi0JcmV0dXJuIHBhcnNlcl87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1dTRExSZXNvdXJjZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV1NETFJlc291cmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NzJmNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV1NETFJlc291cmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkFueUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLQotCi0vKioKLSogVGhpcyBpcyBhIGtpbmQgb2Yge0BsaW5rIEZpbHRlcn0gdGhhdCBhY2NlcHRzIG9ubHkgb2JqZWN0cwotKiB3aGljaCBpbmRpY2F0ZSBhIFdTREwgcmVzb3VyY2UuIEluIHBhcnRpY3VsYXIsIGFueQotKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlfSB3aG9zZQotKiBwYXRobmFtZSwgb3IgYW55IG9iamVjdCB3aG9zZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYXMKLSogcmV0dXJuZWQgYnkgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4sIGVuZHMgaW4KLSogIjxjb2RlPi53c2RsPC9jb2RlPiIgd2lsbCBiZSBhY2NlcHRlZC4KLSogQWxsIG90aGVyIG9iamVjdHMgd2lsbCBiZSByZWplY3RlZC4KLSovCi1wdWJsaWMgY2xhc3MgV1NETFJlc291cmNlRmlsdGVyIGV4dGVuZHMgQW55RmlsdGVyCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5XU0RMUmVzb3VyY2VGaWx0ZXI8L2NvZGU+LgotICAqLwotICBwdWJsaWMgV1NETFJlc291cmNlRmlsdGVyICgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJVdTRExfRklMVEVSX05BTUUiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJVdTRExfRklMVEVSX0RFU0MiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogU2VlIHtAbGluayBGaWx0ZXIjc3RhdHVzT2Z9IGZvciBnZW5lcmFsIGNvbW1lbnRzLgotICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBmaWx0ZXIuCi0gICogQHJldHVybiBBbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9Ci0gICogaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBpZiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPgotICAqIHJlcHJlc2VudHMgYSBXU0RMIHJlc291cmNlLgotICAqLwotICBwdWJsaWMgSVN0YXR1cyBzdGF0dXNPZiAoIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgIDAsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlRklMVEVSX01TR19FUlJPUl9OVUxMX09CSkVDVCIpLAotICAgICAgICBudWxsCi0gICAgICApOwotICAgIH0KLQotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlvYmplY3Q7Ci0gICAgICBuYW1lID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgICAgMCwKLSAgICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUZJTFRFUl9NU0dfRVJST1JfTk9UX0ZJTEUiLG5ldyBPYmplY3RbXSB7bmFtZX0pLAotICAgICAgICAgIG51bGwKLSAgICAgICAgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWUgPSBvYmplY3QudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBpZiAoIW5hbWUuZW5kc1dpdGgoIi53c2RsIikpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgMCwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVXU0RMX0ZJTFRFUl9NU0dfRVJST1JfV1JPTkdfRVhURU5TSU9OIixuZXcgT2JqZWN0W10ge25hbWV9KSwKLSAgICAgICAgbnVsbAotICAgICAgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLCIiLG51bGwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9XZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxZjNkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9XZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotCi0KLQotLyoqCi0qIFRoaXMgaXMgdGhlIHJlZ2lzdHJ5IG9mIFdlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUgb2JqZWN0cy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkKLXsKLQotICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSBpbnN0YW5jZV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIFN0YXJ0U2VydmVyVHlwZXM7Ci0KLSAgLy8KLSAgLy8gTG9hZHMgV2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZSBvYmplY3RzIGludG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gU2VlIG1ldGhvZCBnZXRJbnN0YW5jZSgpLgotICAvLwotICBwcml2YXRlIHZvaWQgbG9hZCAoKQotICB7Ci0gICAgU3RhcnRTZXJ2ZXJUeXBlcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlIik7Ci0KLSAgICBmb3IoaW50IGlkeD0wOyBpZHg8Y29uZmlnLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gY29uZmlnW2lkeF07Ci0gICAgICB0cnkgCi0gICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGZhY3RvcnlJZF8gPSBlbGVtLmdldEF0dHJpYnV0ZSgiZmFjdG9yeUlkIik7Ci0JCSAgU3RhcnRTZXJ2ZXJUeXBlcy5wdXQoZmFjdG9yeUlkXywgZWxlbSk7Ci0JICAKLSAgICAgIH0gCi0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIEVjbGlwc2VMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLSAgICAgICAgbG9nLmxvZyhMb2cuRVJST1IsIDUwNDcsIHRoaXMsICJsb2FkIiwgZSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICogQHJldHVybiBBIHNpbmdsZXRvbiBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgZ2V0SW5zdGFuY2UgKCkKLSAgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSBuZXcgV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkoKTsKLSAgICAgIGluc3RhbmNlXy5sb2FkKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICAgcHVibGljIE9iamVjdCBnZXRTZXJ2ZXJTdGFydEJ5VHlwZUlkIChTdHJpbmcgdHlwZUlEKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgewotICAgIGlmICh0eXBlSUQ9PW51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICByZXR1cm4gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpU3RhcnRTZXJ2ZXJUeXBlcy5nZXQodHlwZUlEKSkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgfQotICAKLSAgIHB1YmxpYyBib29sZWFuIGlzUmVtb3ZlRUFSUmVxdWlyZWQoU3RyaW5nIHR5cGVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgCWlmICh0eXBlSWQhPW51bGwpIHsKLSAgIAkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KVN0YXJ0U2VydmVyVHlwZXMuZ2V0KHR5cGVJZCk7Ci0gICAJCWlmIChlbGVtIT1udWxsKXsKLSAgIAkJCVN0cmluZyB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKCJyZW1vdmVFQVIiKTsKLSAgIAkJCWlmICh2YWx1ZSE9bnVsbCl7Ci0gICAJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0gICAJCQl9Ci0gICAJCX0KLSAgIAl9Ci0JcmV0dXJuIHRydWU7ICAgCQkgCi0gICB9ICAgCi19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BcnJheUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BcnJheUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3YWE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXJyYXlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhIGJlYW4uCi0qIE5lYXJlc3QgbW9yYWwgZXF1aXZhbGVudHM6IGphdmEubGFuZy5DbGFzcywgamF2YS5iZWFucy5CZWFuRGVzY3JpcHRvci4KLSovCi1wdWJsaWMgY2xhc3MgQXJyYXlFbGVtZW50IGV4dGVuZHMgVHlwZUVsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQVJSQVlfTkFNRSA9ICIxMDEwMTAxMGFycmF5MTAxMDEwMTAiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfTUVUSE9EUyA9ICJyZWxtZXRob2RzIjsKLSAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IgCi0gICogQHBhcmFtIHByb2plY3RFbGVtZW50IFRoZSBwcm9qZWN0IHRoaXMgQmVhbiBiZWxvbmdzIHRvLgotICAqLwotICBwdWJsaWMgQXJyYXlFbGVtZW50IChTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMobmFtZSxuZXcgQmFzaWNNb2RlbCgiUHJvamVjdCIpLHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgCi0gICogQHBhcmFtIHBhcmFtZXRlckVsZW1lbnQgVGhlIHBhcmFtZXRlciB0aGlzIEJlYW4gYmVsb25ncyB0by4KLSAgKi8KLSAgcHVibGljIEFycmF5RWxlbWVudCAoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLGJvb2xlYW4gaXNSb290KQotICB7Ci0gICAgc3VwZXIobmFtZSxtb2RlbCxUeXBlRWxlbWVudC5BUlJBWSk7Ci0gICAgaWYoaXNSb290KSBtb2RlbC5zZXRSb290RWxlbWVudCh0aGlzKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuUk9PVDsKLSAgfQotICAKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2FzZSB3aGVuIHRoaXMgaXMgbm90IHRoZSByb290IG9iamVjdAotICAqIGhlcmUgaXQgcmVwcmVzZW50cyBjb21wbGV4IHR5cGVzCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIFBhcmFtZXRlciB0aGF0IG93bnMgdGhpcyBiZWFuIHR5cGUuCi0gICogQHBhcmFtIFN0cmluZyBOYW1lIG9mIHRoZSBiZWFuIGVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBBcnJheUVsZW1lbnQgKCBQYXJhbWV0ZXJFbGVtZW50IHBhcmFtZXRlckVsZW1lbnQsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxwYXJhbWV0ZXJFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5BUlJBWSk7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LlBBUkFNRVRFUl9PV05FUjsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2FzZSB3aGVuIHRoaXMgaXMgbm90IHRoZSByb290IG9iamVjdAotICAqIGhlcmUgaXQgcmVwcmVzZW50cyBjb21wbGV4IHR5cGVzCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIFBhcmFtZXRlciB0aGF0IG93bnMgdGhpcyBiZWFuIHR5cGUuCi0gICogQHBhcmFtIFN0cmluZyBOYW1lIG9mIHRoZSBQYXJhbWV0ZXJFbGVtZW50LgotICAqLwotICBwdWJsaWMgQXJyYXlFbGVtZW50ICggQXR0cmlidXRlRWxlbWVudCBhdHRyaWJ1dGVFbGVtZW50LCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsYXR0cmlidXRlRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuQVJSQVkpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5BVFRSSUJVVEVfT1dORVI7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNhc2Ugd2hlbiB0aGlzIGlzIG5vdCB0aGUgcm9vdCBvYmplY3QKLSAgKiBoZXJlIGl0IHJlcHJlc2VudHMgY29tcGxleCB0eXBlcwotICAqIEBwYXJhbSBGaWVsZEVsZW1lbnQgVGhlIFBhcmFtZXRlciB0aGF0IG93bnMgdGhpcyBiZWFuIHR5cGUuCi0gICogQHBhcmFtIFN0cmluZyBOYW1lIG9mIHRoZSBQYXJhbWV0ZXJFbGVtZW50LgotICAqLwotICBwdWJsaWMgQXJyYXlFbGVtZW50ICggRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGZpZWxkRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuQVJSQVkpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5GSUVMRF9PV05FUjsKLSAgfQotCi0KLSAgLyoKLSAgKiBkZXRlcm1pbmUgd2V0aGVyIHRoaXMgaXMgYW4gb2JqZWN0IGFycmF5IG9yCi0gICogcHJpbWl0aXZlIGFycmF5Ci0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIEFSUkFZX05BTUUgKyBnZXROYW1lKCk7Ci0gIH0KLQotIAotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0FycmF5VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0FycmF5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhjN2U0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BcnJheVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcmVjb2duaXplZCByZXR1cm4gdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgQXJyYXlUeXBlIGV4dGVuZHMgUmVjb2duaXplZFJldHVyblR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZlR5cGVOYW1lOwotCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgQXJyYXlUeXBlKFN0cmluZyB0eXBlTmFtZSkKLSAgewotICAgIHRoaXMoVHlwZUZhY3RvcnkuQVJSQVlfTkFNRSx0eXBlTmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgQXJyYXlUeXBlKFN0cmluZyBuYW1lLFN0cmluZyB0eXBlTmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICAgIGZUeXBlTmFtZSA9IHR5cGVOYW1lOwotICB9IAotCi0gCi0gICAvKioKLSAgKiBUaGlzIGlzIGJhc2ljYWxseSB0aGUgZnVuY3Rpb24gdGhhdCBkaWN0YXRlcyBob3cgd2Ugd2FudCB0byBkaXNwbGF5IHRoaXMgdHlwZSAKLSAgKiB1cG9uIHJlY2VpdmluZyBpdCBhcyBhIHJldHVybiBmcm9tIGEgcHJveHkgbWV0aG9kCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBkaXNwbGF5IHN0cmluZwotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKQotICB7Ci0gICAgIAotICAgIFN0cmluZyBub25CZWFuID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiamF2YS51dGlsLkxpc3QgbGlzdCIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiPSBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdCgiICsgbmFtZSArICIpOyIgK1N0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAJICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIHRlbXAiKyBnZXRVbmlxdWVOYW1lKCkgKyIgPSBsaXN0IiArIGdldFVuaXF1ZU5hbWUoKSArICIudG9TdHJpbmcoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSAgCi0gICAgCSAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlPXRlbXAiKyBnZXRVbmlxdWVOYW1lKCkgKyIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlIisgU3RyaW5nVXRpbHMuTkVXTElORTsKLQotICAgIHJldHVybiBub25CZWFuOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BdHRyaWJ1dGVFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXR0cmlidXRlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjA2NzlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BdHRyaWJ1dGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmEgYmVhbiBtZXRob2QgcGFyYW1ldGVyLgotKiBOZWFyZXN0IG1vcmFsIGVxdWl2YWxlbnRzOiBqYXZhLmJlYW5zLlBhcmFtZXRlckRlc2NyaXB0b3IuCi0qLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQgaW1wbGVtZW50cyBBdHRyaWJ1dGVFbGVtZW50VHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9UWVBFID0gInR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfT1dOSU5HX0JFQU4gPSAib3duaW5nYmVhbiI7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZlNldHRlck1ldGhvZDsKLSAgcHJpdmF0ZSBTdHJpbmcgZkdldHRlck1ldGhvZDsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RvciB0aGlzIHRha2VzIHRoZSBvd25pbmcgYmVhbi4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgotICAqIEBwYXJhbSBiZWFuRWxlbWVudCB0aGUgYmVhbiB0aGF0IG93bnMgdGhpcyBhdHRyaWJ1dGUuCi0gICovCi0gIHB1YmxpYyBBdHRyaWJ1dGVFbGVtZW50ICggQmVhbkVsZW1lbnQgYmVhbkVsZW1lbnQsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxiZWFuRWxlbWVudCxSRUxfT1dOSU5HX0JFQU4sQmVhbkVsZW1lbnQuUkVMX0FUVFJJQlVURVMpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXR0ZXJNZXRob2QoU3RyaW5nIHNldHRlck1ldGhvZCkKLSAgewotICAgIGZTZXR0ZXJNZXRob2QgPSBzZXR0ZXJNZXRob2Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNldHRlck1ldGhvZCgpCi0gIHsKLSAgICByZXR1cm4gZlNldHRlck1ldGhvZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0R2V0dGVyTWV0aG9kKCkKLSAgewotICAgIHJldHVybiBmR2V0dGVyTWV0aG9kOwotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIHNldEdldHRlck1ldGhvZChTdHJpbmcgZ2V0dGVyTWV0aG9kKQotICB7Ci0gICAgZkdldHRlck1ldGhvZCA9IGdldHRlck1ldGhvZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyU2lnbmF0dXJlKFN0cmluZyBhdHRyaWJ1dGUpCi0gIHsKLSAgICBpbnQgYnJhY2tldCA9IGZTZXR0ZXJNZXRob2QuaW5kZXhPZigiKCIpOwotICAgIGJyYWNrZXQrKzsKLSAgICBTdHJpbmcgc2V0dGVyID0gZlNldHRlck1ldGhvZC5zdWJzdHJpbmcoMCxicmFja2V0KTsKLSAgICBTdHJpbmcgZnVsbFNldHRlciA9IHNldHRlciArIGF0dHJpYnV0ZSArICIpOyI7Ci0gICAKLSAgICByZXR1cm4gZnVsbFNldHRlcjsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIEJlYW4gdGhhdCBvd25zIHRoaXMgQXR0cmlidXRlLgotICAqIEByZXR1cm4gQmVhbkVsZW1lbnQgVGhlIGJlYW4gdGhhdCBvd25zIHRoaXMgYXR0cmlidXRlLgotICAqLwotICBwdWJsaWMgQmVhbkVsZW1lbnQgZ2V0T3duaW5nQmVhbkVsZW1lbnQgKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhSRUxfT1dOSU5HX0JFQU4pOwotICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKEJlYW5FbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGw7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSB0eXBlIHRoYXQgaXMgb3duZWQgYnkgdGhpcyBhdHRyaWJ1dHRlLgotICAqIEByZXR1cm4gVHlwZUVsZW1lbnQgVGhlIFR5cGUgdGhhdCBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgKi8KLSAgcHVibGljIFR5cGVFbGVtZW50IGdldFR5cGVFbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX1RZUEUpOwotICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKFR5cGVFbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGw7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0F0dHJpYnV0ZUVsZW1lbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXR0cmlidXRlRWxlbWVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwYjZmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXR0cmlidXRlRWxlbWVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmEgYmVhbiBtZXRob2QgcGFyYW1ldGVyLgotKiBOZWFyZXN0IG1vcmFsIGVxdWl2YWxlbnRzOiBqYXZhLmJlYW5zLlBhcmFtZXRlckRlc2NyaXB0b3IuCi0qLwotcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGVFbGVtZW50VHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAgCi0gIHB1YmxpYyB2b2lkIHNldFNldHRlck1ldGhvZChTdHJpbmcgc2V0dGVyTWV0aG9kKTsKLSAgcHVibGljIFN0cmluZyBnZXRTZXR0ZXJNZXRob2QoKTsKLSAgcHVibGljIFN0cmluZyBnZXRHZXR0ZXJNZXRob2QoKTsKLSAgcHVibGljIHZvaWQgc2V0R2V0dGVyTWV0aG9kKFN0cmluZyBnZXR0ZXJNZXRob2QpOwotICBwdWJsaWMgQmVhbkVsZW1lbnQgZ2V0T3duaW5nQmVhbkVsZW1lbnQgKCk7Ci0gIHB1YmxpYyBUeXBlRWxlbWVudCBnZXRUeXBlRWxlbWVudCAoKTsKLSAgLyoqCi0gICogUmV0dXJuIHRoZSBzaWduYXR1cmUgd2l0aCB0aGlzIHZhbHVlIGFzIHRoZSBwYXJtZXRlcgotICAqCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyU2lnbmF0dXJlKFN0cmluZyBhdHRyaWJ1dGUpOwotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5FbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQmVhbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzZGE5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQmVhbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmEgYmVhbi4KLSogTmVhcmVzdCBtb3JhbCBlcXVpdmFsZW50czogamF2YS5sYW5nLkNsYXNzLCBqYXZhLmJlYW5zLkJlYW5EZXNjcmlwdG9yLgotKi8KLXB1YmxpYyBjbGFzcyBCZWFuRWxlbWVudCBleHRlbmRzIFR5cGVFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNUQVRFTEVTU19CRUFOID0gIjEwMTAxMDEwc3RhdGVsZXNzYmVhbjEwMTAxMDEwIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX01FVEhPRFMgPSAicmVsbWV0aG9kcyI7Ci0gCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIAotICAqIEBwYXJhbSBwcm9qZWN0RWxlbWVudCBUaGUgcHJvamVjdCB0aGlzIEJlYW4gYmVsb25ncyB0by4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50IChTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMobmFtZSxuZXcgQmFzaWNNb2RlbCgiUHJvamVjdCIpLHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgCi0gICogQHBhcmFtIHBhcmFtZXRlckVsZW1lbnQgVGhlIHBhcmFtZXRlciB0aGlzIEJlYW4gYmVsb25ncyB0by4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50IChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsYm9vbGVhbiBpc1Jvb3QpCi0gIHsKLSAgICBzdXBlcihuYW1lLG1vZGVsLFR5cGVFbGVtZW50LkJFQU4pOwotICAgIGlmKGlzUm9vdCkgbW9kZWwuc2V0Um9vdEVsZW1lbnQodGhpcyk7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LlJPT1Q7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNhc2Ugd2hlbiB0aGlzIGlzIG5vdCB0aGUgcm9vdCBvYmplY3QKLSAgKiBoZXJlIGl0IHJlcHJlc2VudHMgY29tcGxleCB0eXBlcwotICAqIEBwYXJhbSBQYXJhbWV0ZXJFbGVtZW50IFRoZSBQYXJhbWV0ZXIgdGhhdCBvd25zIHRoaXMgYmVhbiB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgYmVhbiBlbGVtZW50LgotICAqLwotICBwdWJsaWMgQmVhbkVsZW1lbnQgKCBQYXJhbWV0ZXJFbGVtZW50IHBhcmFtZXRlckVsZW1lbnQsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxwYXJhbWV0ZXJFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5CRUFOKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuUEFSQU1FVEVSX09XTkVSOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgZm9yIHRoZSBjYXNlIHdoZW4gdGhpcyBpcyBub3QgdGhlIHJvb3Qgb2JqZWN0Ci0gICogaGVyZSBpdCByZXByZXNlbnRzIGNvbXBsZXggdHlwZXMKLSAgKiBAcGFyYW0gUGFyYW1ldGVyRWxlbWVudCBUaGUgUGFyYW1ldGVyIHRoYXQgb3ducyB0aGlzIGJlYW4gdHlwZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE5hbWUgb2YgdGhlIFBhcmFtZXRlckVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBCZWFuRWxlbWVudCAoIEF0dHJpYnV0ZUVsZW1lbnQgYXR0cmlidXRlRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGF0dHJpYnV0ZUVsZW1lbnQsVHlwZUVsZW1lbnQuUkVMX09XTkVSLFR5cGVFbGVtZW50LlJFTF9UWVBFLFR5cGVFbGVtZW50LkJFQU4pOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5BVFRSSUJVVEVfT1dORVI7Ci0gIAotICB9Ci0KLSAgIC8qKgotICAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2FzZSB3aGVuIHRoaXMgaXMgbm90IHRoZSByb290IG9iamVjdAotICAqIGhlcmUgaXQgcmVwcmVzZW50cyBjb21wbGV4IHR5cGVzCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIFBhcmFtZXRlciB0aGF0IG93bnMgdGhpcyBiZWFuIHR5cGUuCi0gICogQHBhcmFtIFN0cmluZyBOYW1lIG9mIHRoZSBQYXJhbWV0ZXJFbGVtZW50LgotICAqLwotICBwdWJsaWMgQmVhbkVsZW1lbnQgKCBGaWVsZEVsZW1lbnQgZmllbGRFbGVtZW50LCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsZmllbGRFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5CRUFOKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuRklFTERfT1dORVI7Ci0gIAotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgTWV0aG9kIG9iamVjdHMgb2YgdGhpcyBCZWFuLgotICAqIEByZXR1cm4gRW51bWVyYXRpb24gQWxsIE1ldGhvZCBvYmplY3RzIG9mIHRoaXMgQmVhbi4KLSAgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldE1ldGhvZHMgKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfTUVUSE9EUyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgTWV0aG9kIG9iamVjdHMgb2YgdGhpcyBCZWFuLgotICAqIEByZXR1cm4gaW50IFRoZSBudW1iZXIgb2YgTWV0aG9kIG9iamVjdHMgb2YgdGhpcyBCZWFuLgotICAqLwotICBwdWJsaWMgaW50IGdldE51bWJlck9mTWV0aG9kRWxlbWVudHMgKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9NRVRIT0RTKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgaWYoaXNTdGF0ZUxlc3MoKSkgcmV0dXJuIFNUQVRFTEVTU19CRUFOICsgZ2V0TmFtZSgpOwotICAgIHJldHVybiBnZXROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRlTGVzcygpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlYSA9IGdldEVsZW1lbnRzKFR5cGVFbGVtZW50LlJFTF9BVFRSSUJVVEVTKTsKLSAgICBFbnVtZXJhdGlvbiBlZiA9IGdldEVsZW1lbnRzKFR5cGVFbGVtZW50LlJFTF9GSUVMRFMpOwotICAgIGlmKGVhLmhhc01vcmVFbGVtZW50cygpIHx8IGVmLmhhc01vcmVFbGVtZW50cygpKSByZXR1cm4gZmFsc2U7Ci0gICAgZWxzZSByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDc5OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1vbi5TYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLS8qKgotICogVHlwZUZhY3RvcnkKLSAqIENyZWF0aW9uIGRhdGU6ICg0LzEwLzIwMDEgMTI6NDE6NDggUE0pCi0gKiBAYXV0aG9yOiBHaWxiZXJ0IEFuZHJld3MKLSAqLwotcHVibGljIGNsYXNzIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOX1BBUkFNX05BTUU9InJldHVybnAiOwotCi0gIHByaXZhdGUgQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5KCl7fQotCi0gIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRCZWFuTW9kZWxFbGVtZW50KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmdldEJlYW5Nb2RlbEVsZW1lbnQob2JqZWN0LG51bGwsbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0QmVhbk1vZGVsRWxlbWVudChPYmplY3Qgb2JqZWN0LEVsZW1lbnQgcGFyZW50RWxlbWVudCkKLSAgewotICAgIHJldHVybiBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuZ2V0QmVhbk1vZGVsRWxlbWVudChvYmplY3QscGFyZW50RWxlbWVudCxudWxsKTsKLSAgfQotICAKLSAvKgotICAqIFRha2UgaW4gYW4gb2JqZWN0IGFuZCByZXR1cm4gYW4gZWxlbWVudCBkZXBlbmRpbmcgb24gd2hhdCAKLSAgKiB0eXBlIHdlIGFyZSBkZWFsaW5nIHdpdGggZnJvbSB0aGUgamF2YW1vZgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEJlYW5Nb2RlbEVsZW1lbnQoT2JqZWN0IG9iamVjdCxFbGVtZW50IHBhcmVudEVsZW1lbnQsIE1vZGVsIG1vZGVsKQotICB7Ci0gICAgRWxlbWVudCByZXR1cm5FbGVtZW50ID0gbnVsbDsKLQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpewotICAgICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3Mpb2JqZWN0OwotICAgICAgU3RyaW5nIGphdmFOYW1lID0gamF2YUNsYXNzLmdldEphdmFOYW1lKCk7Ci0gICAgICBpZiAoIWphdmFDbGFzcy5pc0FycmF5KCkpeyAKLQkgICAgICBpZihwYXJlbnRFbGVtZW50ID09IG51bGwgJiYgbW9kZWwgPT1udWxsKSByZXR1cm5FbGVtZW50ID0gbmV3IEJlYW5FbGVtZW50KGphdmFOYW1lKTsKLQkgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgPT0gbnVsbCAmJiBtb2RlbCAhPW51bGwpIHJldHVybkVsZW1lbnQgPSBuZXcgQmVhbkVsZW1lbnQoamF2YU5hbWUsbW9kZWwsZmFsc2UpOwotCSAgICAgIGVsc2V7Ci0JICAgICAgICBpZihwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUGFyYW1ldGVyRWxlbWVudCl7IAotCSAgICAgICAgICAgUGFyYW1ldGVyRWxlbWVudCB0ZW1wRWxlbWVudCA9IChQYXJhbWV0ZXJFbGVtZW50KXBhcmVudEVsZW1lbnQ7Ci0JICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEJlYW5FbGVtZW50KHRlbXBFbGVtZW50LGphdmFOYW1lKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUVsZW1lbnQpewotCSAgICAgICAgICAgQXR0cmlidXRlRWxlbWVudCB0ZW1wRWxlbWVudCA9IChBdHRyaWJ1dGVFbGVtZW50KXBhcmVudEVsZW1lbnQ7Ci0JICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEJlYW5FbGVtZW50KHRlbXBFbGVtZW50LGphdmFOYW1lKTsKLQkgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEZpZWxkRWxlbWVudCl7Ci0gICAgICAgICAgICAgICBGaWVsZEVsZW1lbnQgdGVtcEVsZW1lbnQgPSAoRmllbGRFbGVtZW50KXBhcmVudEVsZW1lbnQ7Ci0JICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEJlYW5FbGVtZW50KHRlbXBFbGVtZW50LGphdmFOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpewotICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBQYXJhbWV0ZXJFbGVtZW50KChNZXRob2RFbGVtZW50KXBhcmVudEVsZW1lbnQsUkVUVVJOX1BBUkFNX05BTUUsTWV0aG9kRWxlbWVudC5SRUxfUkVUVVJOX1BBUkFNRVRFUlMsdHJ1ZSk7Ci0gICAgICAgICAgICB9CSAgICAgICAgIAotCSAgICAgIH0KLSAgICAgIH0gCi0gICAgICBlbHNlewotICAgICAgICAgIGlmKHBhcmVudEVsZW1lbnQgPT0gbnVsbCAmJiBtb2RlbCA9PW51bGwpIHJldHVybkVsZW1lbnQgPSBuZXcgQXJyYXlFbGVtZW50KGphdmFOYW1lKTsKLQkgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgPT0gbnVsbCAmJiBtb2RlbCAhPW51bGwpIHJldHVybkVsZW1lbnQgPSBuZXcgQXJyYXlFbGVtZW50KGphdmFOYW1lLG1vZGVsLGZhbHNlKTsKLQkgICAgICBlbHNlewotCSAgICAgICAgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFBhcmFtZXRlckVsZW1lbnQpeyAKLQkgICAgICAgICAgIFBhcmFtZXRlckVsZW1lbnQgdGVtcEVsZW1lbnQgPSAoUGFyYW1ldGVyRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBBcnJheUVsZW1lbnQodGVtcEVsZW1lbnQsamF2YU5hbWUpOwotCSAgICAgICAgfQotCSAgICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQXR0cmlidXRlRWxlbWVudCl7Ci0JICAgICAgICAgICBBdHRyaWJ1dGVFbGVtZW50IHRlbXBFbGVtZW50ID0gKEF0dHJpYnV0ZUVsZW1lbnQpcGFyZW50RWxlbWVudDsKLQkgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgQXJyYXlFbGVtZW50KHRlbXBFbGVtZW50LGphdmFOYW1lKTsKLQkgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEZpZWxkRWxlbWVudCl7Ci0gICAgICAgICAgICAgICBGaWVsZEVsZW1lbnQgdGVtcEVsZW1lbnQgPSAoRmllbGRFbGVtZW50KXBhcmVudEVsZW1lbnQ7Ci0JICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEFycmF5RWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KXsKLSAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgUGFyYW1ldGVyRWxlbWVudCgoTWV0aG9kRWxlbWVudClwYXJlbnRFbGVtZW50LFJFVFVSTl9QQVJBTV9OQU1FLE1ldGhvZEVsZW1lbnQuUkVMX1JFVFVSTl9QQVJBTUVURVJTLHRydWUpOwotICAgICAgICAgICAgfQotCi0JICAgICAgfQotICAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcil7Ci0gICAgICBTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSAoU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKW9iamVjdDsKLSAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgQXR0cmlidXRlRWxlbWVudCgoQmVhbkVsZW1lbnQpcGFyZW50RWxlbWVudCxwZC5nZXROYW1lKCkpOyAgCi0gICAgfQotICAgIGVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgRmllbGQpewotICAgICAgRmllbGQgZmllbGQgPSAoRmllbGQpb2JqZWN0OwotICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBGaWVsZEVsZW1lbnQoKEJlYW5FbGVtZW50KXBhcmVudEVsZW1lbnQsZmllbGQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kKXsKLSAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKW9iamVjdDsKLSAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgTWV0aG9kRWxlbWVudCgoQmVhbkVsZW1lbnQpcGFyZW50RWxlbWVudCxtZXRob2QuZ2V0TmFtZSgpLCBtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLSAgICB9Ci0gICAgLy9ub24gYmVhbmluZm8KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpewotICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW9iamVjdDsgIAotICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBBdHRyaWJ1dGVFbGVtZW50KChCZWFuRWxlbWVudClwYXJlbnRFbGVtZW50LG5hbWUpOwotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBKYXZhUGFyYW1ldGVyKXsKLSAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciA9IChKYXZhUGFyYW1ldGVyKW9iamVjdDsKLQotICAgICAgCi0gICAgICBpZiAoamF2YVBhcmFtZXRlci5pc1JldHVybigpKSAKLSAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgUGFyYW1ldGVyRWxlbWVudCgoTWV0aG9kRWxlbWVudClwYXJlbnRFbGVtZW50LFJFVFVSTl9QQVJBTV9OQU1FLE1ldGhvZEVsZW1lbnQuUkVMX1JFVFVSTl9QQVJBTUVURVJTLHRydWUpOyAKLSAgICAgIGVsc2V7IAotICAgICAgICAgLy9hIGphdmEgcGFyYW1ldGVyIGdpdmVzIHVzIHRoZSBxdWFsaWZpZWQgbmFtZSB3ZSBkb250IHdhbnQgdGhpcwotICAgICAgICAgU3RyaW5nIG5hbWUgPSBqYXZhUGFyYW1ldGVyLmdldFF1YWxpZmllZE5hbWUoKTsKLSAgICAgICAgIFN0cmluZyBzaG9ydE5hbWU7Ci0gICAgICAgICBpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgICAgICBpZiAoaW5kZXggIT0gLTEpewotICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICBzaG9ydE5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0gICAgICAgICB9Ci0gICAgICBlbHNlIHNob3J0TmFtZSA9IG5hbWU7Ci0KLSAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgUGFyYW1ldGVyRWxlbWVudCgoTWV0aG9kRWxlbWVudClwYXJlbnRFbGVtZW50LHNob3J0TmFtZSxNZXRob2RFbGVtZW50LlJFTF9QQVJBTUVURVJTLGZhbHNlKTsgCi0KLSAgICAgIH0KLSAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEphdmFIZWxwZXJzKXsKLSAgICAgIEphdmFIZWxwZXJzIGphdmFIZWxwZXIgPSAoSmF2YUhlbHBlcnMpb2JqZWN0OwotICAgICAgU3RyaW5nIGphdmFOYW1lOyAKLSAgICAgIGlmIChqYXZhSGVscGVyLmlzQXJyYXkoKSkgamF2YU5hbWUgPSBUeXBlRmFjdG9yeS5BUlJBWV9OQU1FOwotICAgICAgZWxzZSBqYXZhTmFtZSA9IGphdmFIZWxwZXIuZ2V0SmF2YU5hbWUoKTsKLSAgICAgIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUGFyYW1ldGVyRWxlbWVudCl7Ci0gICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBTaW1wbGVFbGVtZW50KChQYXJhbWV0ZXJFbGVtZW50KXBhcmVudEVsZW1lbnQsamF2YU5hbWUsamF2YUhlbHBlci5pc1ByaW1pdGl2ZSgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUVsZW1lbnQpewotICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgU2ltcGxlRWxlbWVudCgoQXR0cmlidXRlRWxlbWVudClwYXJlbnRFbGVtZW50LGphdmFOYW1lLGphdmFIZWxwZXIuaXNQcmltaXRpdmUoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBGaWVsZEVsZW1lbnQpewotICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgU2ltcGxlRWxlbWVudCgoRmllbGRFbGVtZW50KXBhcmVudEVsZW1lbnQsamF2YU5hbWUsamF2YUhlbHBlci5pc1ByaW1pdGl2ZSgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpewotICAgICAgCXJldHVybkVsZW1lbnQgPSBuZXcgUGFyYW1ldGVyRWxlbWVudCgoTWV0aG9kRWxlbWVudClwYXJlbnRFbGVtZW50LFJFVFVSTl9QQVJBTV9OQU1FLE1ldGhvZEVsZW1lbnQuUkVMX1JFVFVSTl9QQVJBTUVURVJTLHRydWUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuRWxlbWVudDsKLSAgfQotICAKLSAgCi0gIAotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0RlY2ltYWxUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQmlnRGVjaW1hbFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkYTBjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQmlnRGVjaW1hbFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBCaWdEZWNpbWFsVHlwZSBleHRlbmRzIFNpbXBsZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgQmlnRGVjaW1hbFR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuQklHX0RFQ0lNQUxfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuICJuZXcgamF2YS5tYXRoLkJpZ0RlY2ltYWwoIiArIG5hbWUgKyAiKTsiOwotICB9Ci0KLSAgLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBuYW1lICsgIi50b1N0cmluZygpIjsKLSAgfQotIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0ludGVnZXJUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQmlnSW50ZWdlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmNjAzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQmlnSW50ZWdlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBCaWdJbnRlZ2VyVHlwZSBleHRlbmRzIFNpbXBsZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgQmlnSW50ZWdlclR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuQklHX0lOVEVHRVJfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuICJuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoIiArIG5hbWUgKyAiKTsiOwotICB9Ci0KLSAgLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBuYW1lICsgIi50b1N0cmluZygpIjsKLSAgfQotIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RhdGFUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg2MWE2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRGF0YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHNpbXBsaWZ5IHRoZSBjb2RlZ2VuIHByb2Nlc3MKLSogQmVjYXVzZSBjb2RlZ2VuIG1heSBiZSBwcm9jZXNzZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSB0eXBlCi0qIHdlIGNhbiBoYW5kbGUgaG93IGVhY2ggdHlwZSB3YW50cyB0aGUgY29kZSB0byBsb29rIGZvciBhIHNwZWNpZmljIHRhc2sgCi0qIGJ5IGNyZWF0aW5nIGEgZGF0YXR5cGUgYW5kIGNhbGxpbmcgZ2VuZXJpYyBtZXRob2RzIHRoYXQgYXJlIAotKiB0byBiZSBzcGVjaWFsaXplZCBpbiBzdWJjbGFzc2VzCi0qLwotcHVibGljIGludGVyZmFjZSBEYXRhVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX1RZUEUgPSAidHlwZSI7Ci0KLSAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBoYW5kcyBiYWNrIHRoZSBjb2RlIHJlcXVpcmVkIHRvIGdvIGZyb20gdGhlIAotICAqIHN0cmluZyB0aGUgdXNlciBlbnRlcmVkIHRvIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgZWxlbWVudAotICAqIEBwYXJhbSBTdHJpbmcgdHlwZU5hbWUgdGhpcyBpcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIHR5cGUgaWUgaW50LGJvb2xlYW4KLSAgKiBAcGFyYW0gU3RyaW5nIG5vZGVOYW1lIFRoZSBub2RlTmFtZSBpcyBqdXN0IHRoZSBhdHRyaWJ1dGVuYW1lICsgVGVtcC4gCi0gICogQHBhcmFtIFN0cmluZyB0aGUgYXR0cmlidXRlTmFtZSAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgc3RyaW5nQ29udmVyc2lvbihTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotCi0gIC8qKgotICAqIE9mdGVuIHRpbWVzIGluIG9yZGVyIHRvIGNvbnZlcnQgYSB0eXBlIHRvIHN0cmluZywgc3RyaW5nIHRvIHR5cGUgb3IganVzdCBwbGFpbiBwcm92aWRlIGFuIGlucHV0IGZvcm0KLSAgKiBBIHRlbXBvcmFyeSB2YXJpYWJsZSBpcyB1c2VkLiBJZiB3ZSBydW4gaW50byBhIHNpdHV0aW9uIHdoZXJlIHR3byBvZiB0aGUgc2FtZSB0eXBlcyBhcmUgdXNlZCBpbiB0aGUgIAotICAqIHNhbWUgbWV0aG9kIHRoZXNlIHRlbXBvcmFyeSB2YXJpYWJsZXMgc2hhcmUgdGhlIHNhbWUgbmFtZSBzcGFjZS4gSXQgaXNudCBlbm91Z2ggdG8gdXNlIGEgbmFtZSAKLSAgKiBiZWNhdXNlIG9mIHdlIG1heSBoYXZlIGEgbmVzdGVkIHNjZW5hcmlvLiBUaGVyZWZvcmUgYW55IHRlbXBvcmFyeSB2YXJpYWJsZSB0aGF0IGlzIHVzZWQgaW4gYSBkYXRhVHlwZQotICAqIG11c3QgdXNlIGEgdW5pcXVlIG5hbWUgYXBlZW5kZWQgdG8gdGhlIGVuZC4gVGhpcyBuYW1lIG11c3QgYmUgcGFzc2VkIGluIGFuZCBpdCBpcyB1cCB0byB0aGUgdXNlciBvZgotICAqIERhdGFUeXBlIHRvIGluc3VyZSBpdCBpcyB1bmlxdWUuCi0gICogQHJldHVybiBVbmlxdWUgTmFtZSAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0VW5pcXVlTmFtZShTdHJpbmcgbmFtZSk7Ci0KLSAgLyoqCi0gICogVGhpcyBpcyB0aGUgbmFtZSBlYWNoIHRlbXAgdmFyaWFibGUgd2lsbCB1c2UKLSAgKiAKLSAgKgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoKTsKLSAgCi0gIC8qKgotICAqIFRoaXMgZnVuY3Rpb24gZGljdGF0ZXMgaG93IHlvdSB3YW50IHRvIHByb2Nlc3MgdGhlIAotICAqIGluY29taW5nIHN0cmluZyBmcm9tIHRoZSBpbnB1dCBqc3AuIFlvdSBtYXkgb3IgbWF5IG5vdCB1c2UgdGhlIG1hcmt1cCAKLSAgKiBmdW5jdGlvbiBkZXBlbmRpbmcgb24gdGhlIHR5cGUuIFRoZSBzaW1wbGUgdHlwZXMgdXNlIGl0LiBEb21FbGVtZW50IGRvZXMgbm90Ci0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGNvZGUgdG8gYmUgZ2VuZXJhdGVkCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdENvZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBpZCk7Ci0KLQotICAvKioKLSAgKiBJbnB1dCBmb3JtIHJldHVybnMgdGhlIHVzZXIgaW5wdXQgaHRtbAotICAqIEBwYXJhbSBTdHJpbmcgbmFtZSBUaGUgbmFtZSBvZiB0aGUgaW5wdXQgZWxlbWVudAotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBmb3JtIHVzZWQgdG8gY29sbGVjdCB0aGUgZGF0YQotICAqLwotICBwdWJsaWMgU3RyaW5nIGlucHV0Rm9ybShTdHJpbmcgbmFtZSk7Ci0gIAotICAvKioKLSAgKiBjb252ZXJ0cyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm94eSAKLSAgKiBiYWNrIHRvIGEgc3RyaW5nIAotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHR5cGUgdG8gc3RyaW5nLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgKiByZXR1cm4gdGhlIHR5cGUKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgdHlwZShpbmNsdWRpbmcgcGFja2FnZSkuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRGF0ZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9EYXRlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTgzOTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9EYXRlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgRGF0ZVR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIERhdGVUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LkJJR19ERUNJTUFMX05BTUUpOwotICB9Ci0gCi0KLSAgLyoqCi0gICogaW5wdXRGb3JtIHJldHVybnMgdGhlIHVzZXIgaW5wdXQgaHRtbAotICAqIFRoZSBzaW1wbGUgZm9ybSBpcyBqdXN0IGEgdGV4dCBpbnB1dCBib3gKLSAgKiBUaGlzIGhhcyBiZWVuIHNwZWNpYWxpemVkIHRvIHNob3cgYW4gZXhhbXBsZQotICAqIEBwYXJhbSBTdHJpbmcgbmFtZSBUaGUgbmFtZSBvZiB0aGUgaW5wdXQgZWxlbWVudAotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBmb3JtIHVzZWQgdG8gY29sbGVjdCB0aGUgZGF0YQotICAqLwotICBwdWJsaWMgU3RyaW5nIGlucHV0Rm9ybShTdHJpbmcgbmFtZSkKLSAgewotICAgICBTdHJpbmcgaW5wdXRGb3JtID0gIjxURCBBTElHTj1cImxlZnRcIj48SU5QVVQgVFlQRT1cIlRFWFRcIiBOQU1FPVwiIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiXCIgU0laRT0yMD48L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJqYXZhLnRleHQuRGF0ZUZvcm1hdCBkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGphdmEudGV4dC5EYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIGdjRXhhbXAiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICA9IG5ldyBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJqYXZhLnV0aWwuRGF0ZSBkYXRlIiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGdjRXhhbXAiICsgZ2V0VW5pcXVlTmFtZSgpKyAiLmdldFRpbWUoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiU3RyaW5nIHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIuZm9ybWF0KGRhdGUiICsgZ2V0VW5pcXVlTmFtZSgpKyAiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjxURCBBTElHTj1cImxlZnRcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9UUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjxUUj4iICArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VEQ+IDwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VEQgQUxJR049XCJsZWZ0XCI+IGVnLiA8JT0gdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgJT4gPC9URD4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIHJldHVybiBpbnB1dEZvcm07Ci0gIH0KLQotCi0gIC8qCi0gICogVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBzcGVjaWFsaXplZAotICAqIFdlIG11c3QgdXNlIHRoZSBkYXRlIGZ1bmN0aW9uIHRvIGhlbHAKLSAgKiB1cyBjb252ZXJ0IGJhY2sgYW5kIGZvcnRoCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgc3RyaW5nQ29udmVyc2lvbihTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGNvbnZlcnNpb24gPSAgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiamF2YS50ZXh0LkRhdGVGb3JtYXQgZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBqYXZhLnRleHQuRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKTsiICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICAiamF2YS51dGlsLkRhdGUgIiArIG5vZGVOYW1lICArICAiPSBkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIi5wYXJzZSgiICsgYXR0cmlidXRlTmFtZSArICIpOyIgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiIiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICogdGhpcyBpcyBuZWVkZWQgZm9yIG1vc3QgY2FzZSAKLSAgKiBidXQgaXQgaXMgcGVyaXBoZXJhbCBhcyB0aGUgc3RyaW5nY29udmVyc2lvbiBuZWVkZWQgCi0gICogdG8gYmUgb3ZlcnJpZGRlbgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotCi0KLQotICAvKioKLSAgKiBjb252ZXJ0cyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm94eSAKLSAgKiBiYWNrIHRvIGEgc3RyaW5nIAotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHR5cGUgdG8gc3RyaW5nLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKQotICB7Ci0KLSAgICBTdHJpbmcgY29udmVyc2lvbiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImphdmEudGV4dC5EYXRlRm9ybWF0IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gamF2YS50ZXh0LkRhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgCSAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gb3JnLmVjbGlwc2UuanN0LndzLnV0aWwuSnNwVXRpbHMubWFya3VwKGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiLmZvcm1hdCgiICsgbmFtZSArIikpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JT0gdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0KLSAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotCi0KLQotICAvKioKLSAgKiBUaGUgc3RyaW5nQ29udmVyc2lvbiBmdW5jdGlvbiBuYWlscyBvdXQgc3BlY2lmaWMgY29udmVyc2lvbiBtZXRob2RzIHVzZWQgYW1vbmcgc2ltcGxlIHR5cGVzIAotICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IFNpbXBsZVR5cGUgc3ViY2xhc3NlcwotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2Ygc3RyaW5nIGFmdGVyIHRoZSByZXF1ZXN0IGNhbGwKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWN0dWFsIGNvbnZlcnNpb24gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZVRvU3RyaW5nKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRG9tRWxlbWVudFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9Eb21FbGVtZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDQwNmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9Eb21FbGVtZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgRG9tRWxlbWVudFR5cGUgaW1wbGVtZW50cyBEYXRhVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGZUeXBlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGZVbmlxdWVOYW1lOwotCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgRG9tRWxlbWVudFR5cGUoKQotICB7Ci0gICAgZlR5cGUgPSAib3JnLnczYy5kb20uRWxlbWVudCI7Ci0gICAgZlVuaXF1ZU5hbWUgPSAiIjsKLSAgfQotCi0gIC8qKgotICAqIGlucHV0Rm9ybSByZXR1cm5zIHRoZSB1c2VyIGlucHV0IGh0bWwKLSAgKiBUaGUgRG9tRWxlbWVudCBmb3JtIGlzIGEgdGV4dCBib3gKLSAgKiBAcGFyYW0gU3RyaW5nIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGlucHV0IGVsZW1lbnQKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZm9ybSB1c2VkIHRvIGNvbGxlY3QgdGhlIGRhdGEKLSAgKi8KLSAgcHVibGljIFN0cmluZyBpbnB1dEZvcm0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGlucHV0Rm9ybSA9ICI8VEQgQUxJR049XCJsZWZ0XCI+PFRFWFRBUkVBIFJvd3M9NyBDb2xzPTQ1IE5BTUU9XCIiIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICJcIj48L1RFWFRBUkVBPjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9UUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIGlucHV0Rm9ybTsKLSAgfQotCi0gICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGRpY3RhdGVzIGhvdyB5b3Ugd2FudCB0byBwcm9jZXNzIHRoZSAKLSAgKiBpbmNvbWluZyBzdHJpbmcgZnJvbSB0aGUgaW5wdXQganNwLiBZb3UgbWF5IG9yIG1heSBub3QgdXNlIHRoZSBtYXJrdXAgCi0gICogZnVuY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSB0eXBlLiBUaGUgc2ltcGxlIHR5cGVzIHVzZSBpdC4gRG9tRWxlbWVudCBkb2VzIG5vdAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RDb2RlKFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpCi0gIHsKLSAgICAgU3RyaW5nIHJlcXVlc3RDb2RlID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIiArIEdlbmVyYXRvci5TUEFDRSAKLSAgICAgCSAgICAgICAgICAgICAgICAgICArIGlkICsgIj0gIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFwiIgotICAgICAJICAgICAgICAgICAgICAgICAgICsgbmFtZSArIlwiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIHJlcXVlc3RDb2RlOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBoYW5kcyBiYWNrIHRoZSBjb2RlIHJlcXVpcmVkIHRvIGdvIGZyb20gdGhlIAotICAqIHN0cmluZyB0aGUgdXNlciBlbnRlcmVkIHRvIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgZWxlbWVudAotICAqIEBwYXJhbSBTdHJpbmcgdHlwZU5hbWUgdGhpcyBpcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIHR5cGUgaWUgaW50LGJvb2xlYW4KLSAgKiBAcGFyYW0gU3RyaW5nIG5vZGVOYW1lIFRoZSBub2RlTmFtZSBpcyBqdXN0IHRoZSBhdHRyaWJ1dGVuYW1lICsgVGVtcC4gCi0gICogQHBhcmFtIFN0cmluZyB0aGUgYXR0cmlidXRlTmFtZSAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgc3RyaW5nQ29udmVyc2lvbihTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGNvbnZlcnNpb24gPSAgR2VuZXJhdG9yLkRPVUJMRV9UQUIgCi0gICAgICAgICAgICAgICAgICAgICAgICsgIm9yZy53M2MuZG9tLkVsZW1lbnQgIiArIG5vZGVOYW1lICsgIj0gb3JnLmVjbGlwc2UuanN0LndzLnV0aWwuRG9tRWxlbWVudEhlbHBlci5jcmVhdGVEb21FbGVtZW50RnJvbVhNTFN0cmluZygiICsgYXR0cmlidXRlTmFtZSArICIpOyIgCi0JICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIGNvbnZlcnNpb247IAotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBpcyBiYXNpY2FsbHkgdGhlIGZ1bmN0aW9uIHRoYXQgZGljdGF0ZXMgaG93IHdlIHdhbnQgdG8gZGlzcGxheSB0aGlzIHR5cGUgCi0gICogdXBvbiByZWNlaXZpbmcgaXQgYXMgYSByZXR1cm4gZnJvbSBhIHByb3h5IG1ldGhvZAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIHR5cGUKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZGlzcGxheSBzdHJpbmcKLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlQ29udmVyc2lvbihTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyB0eXBlVG9TdHJpbmcgPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJTdHJpbmcgdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbC5Eb21FbGVtZW50SGVscGVyLmRvbVdyaXRlcigiICsgbmFtZSArICIsIG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCkiICsgIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlPSB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiAlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLQotICAgIHJldHVybiB0eXBlVG9TdHJpbmc7Ci0gIH0KLQotICAvKioKLSAgKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgdGhlIG5hbWUoaW5jbHVkaW5nIHBhY2thZ2UpLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGZUeXBlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKCkKLSAgewotICAgIHJldHVybiBmVW5pcXVlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVuaXF1ZU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmVW5pcXVlTmFtZSA9IG5hbWU7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRmllbGRFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRmllbGRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjhmYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0ZpZWxkRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhIGJlYW4gbWV0aG9kIHBhcmFtZXRlci4KLSogTmVhcmVzdCBtb3JhbCBlcXVpdmFsZW50czogamF2YS5iZWFucy5QYXJhbWV0ZXJEZXNjcmlwdG9yLgotKi8KLXB1YmxpYyBjbGFzcyBGaWVsZEVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQgaW1wbGVtZW50cyBBdHRyaWJ1dGVFbGVtZW50VHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgU3RyaW5nIGZTZXR0ZXJNZXRob2Q7Ci0gIHByaXZhdGUgU3RyaW5nIGZHZXR0ZXJNZXRob2Q7Ci0KLSAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1RZUEUgPSAidHlwZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9PV05JTkdfQkVBTiA9ICJvd25pbmdiZWFuIjsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIHRoaXMgdGFrZXMgdGhlIG93bmluZyBiZWFuLgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICogQHBhcmFtIGJlYW5FbGVtZW50IHRoZSBiZWFuIHRoYXQgb3ducyB0aGlzIGF0dHJpYnV0ZS4KLSAgKi8KLSAgcHVibGljIEZpZWxkRWxlbWVudCAoIEJlYW5FbGVtZW50IGJlYW5FbGVtZW50LCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsYmVhbkVsZW1lbnQsUkVMX09XTklOR19CRUFOLEJlYW5FbGVtZW50LlJFTF9GSUVMRFMpOwotICAgIGZTZXR0ZXJNZXRob2QgPSBuYW1lOwotICAgIGZHZXR0ZXJNZXRob2QgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2V0dGVyTWV0aG9kKFN0cmluZyBzZXR0ZXJNZXRob2QpCi0gIHsKLSAgICBmU2V0dGVyTWV0aG9kID0gc2V0dGVyTWV0aG9kOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXR0ZXJNZXRob2QoKQotICB7Ci0gICAgcmV0dXJuIGZTZXR0ZXJNZXRob2Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEdldHRlck1ldGhvZCgpCi0gIHsKLSAgICByZXR1cm4gZkdldHRlck1ldGhvZDsKLSAgfQotIAotICBwdWJsaWMgdm9pZCBzZXRHZXR0ZXJNZXRob2QoU3RyaW5nIGdldHRlck1ldGhvZCkKLSAgewotICAgIGZHZXR0ZXJNZXRob2QgPSBnZXR0ZXJNZXRob2Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNldHRlclNpZ25hdHVyZShTdHJpbmcgYXR0cmlidXRlKQotICB7Ci0gICAgcmV0dXJuIGZTZXR0ZXJNZXRob2QgKyAiID0gIiArIGF0dHJpYnV0ZSArICI7IjsKLSAgfQotICAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIEJlYW4gdGhhdCBvd25zIHRoaXMgQXR0cmlidXRlLgotICAqIEByZXR1cm4gQmVhbkVsZW1lbnQgVGhlIGJlYW4gdGhhdCBvd25zIHRoaXMgYXR0cmlidXRlLgotICAqLwotICBwdWJsaWMgQmVhbkVsZW1lbnQgZ2V0T3duaW5nQmVhbkVsZW1lbnQgKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhSRUxfT1dOSU5HX0JFQU4pOwotICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKEJlYW5FbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGw7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSB0eXBlIHRoYXQgaXMgb3duZWQgYnkgdGhpcyBhdHRyaWJ1dHRlLgotICAqIEByZXR1cm4gVHlwZUVsZW1lbnQgVGhlIFR5cGUgdGhhdCBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgKi8KLSAgcHVibGljIFR5cGVFbGVtZW50IGdldFR5cGVFbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX1RZUEUpOwotICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKFR5cGVFbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGw7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0dyZWdvcmlhbkNhbGVuZGFyVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0dyZWdvcmlhbkNhbGVuZGFyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2NmYmY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9HcmVnb3JpYW5DYWxlbmRhclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBHcmVnb3JpYW5DYWxlbmRhclR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIEdyZWdvcmlhbkNhbGVuZGFyVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5HUkVHT1JJQU5fQ0FMRU5EQVJfTkFNRSk7Ci0gIH0KLQotCi0gIC8qKgotICAqIGlucHV0Rm9ybSByZXR1cm5zIHRoZSB1c2VyIGlucHV0IGh0bWwKLSAgKiBUaGUgc2ltcGxlIGZvcm0gaXMganVzdCBhIHRleHQgaW5wdXQgYm94Ci0gICogVGhpcyBoYXMgYmVlbiBzcGVjaWFsaXplZCB0byBzaG93IGFuIGV4YW1wbGUKLSAgKiBAcGFyYW0gU3RyaW5nIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGlucHV0IGVsZW1lbnQKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZm9ybSB1c2VkIHRvIGNvbGxlY3QgdGhlIGRhdGEKLSAgKi8KLSAgcHVibGljIFN0cmluZyBpbnB1dEZvcm0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGlucHV0Rm9ybSA9ICI8VEQgQUxJR049XCJsZWZ0XCI+PElOUFVUIFRZUEU9XCJURVhUXCIgTkFNRT1cIiIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIlwiIFNJWkU9MjA+PC9URD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiamF2YS50ZXh0LkRhdGVGb3JtYXQgZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBqYXZhLnRleHQuRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgImphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciBnY0V4YW1wIiArIGdldFVuaXF1ZU5hbWUoKSsgIiAgPSBuZXcgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiamF2YS51dGlsLkRhdGUgZGF0ZSIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBnY0V4YW1wIiArIGdldFVuaXF1ZU5hbWUoKSsgIi5nZXRUaW1lKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiLmZvcm1hdChkYXRlIiArIGdldFVuaXF1ZU5hbWUoKSsgIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPFREIEFMSUdOPVwibGVmdFwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8L1RSPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPFRSPiIgICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjxURD4gPC9URD4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjxURCBBTElHTj1cImxlZnRcIj4gZWcuIDwlPSB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiAlPiA8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9UUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgcmV0dXJuIGlucHV0Rm9ybTsKLSAgfQotIAotIAotICAvKgotICAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgc3BlY2lhbGl6ZWQKLSAgKiBXZSBtdXN0IHVzZSB0aGUgZGF0ZSBmdW5jdGlvbiB0byBoZWxwCi0gICogdXMgY29udmVydCBiYWNrIGFuZCBmb3J0aAotICAqLwotICAgcHVibGljIFN0cmluZyBzdHJpbmdDb252ZXJzaW9uKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgewotICAgICBTdHJpbmcgY29udmVyc2lvbiA9ICBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJqYXZhLnRleHQuRGF0ZUZvcm1hdCBkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGphdmEudGV4dC5EYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpOyIgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTkVXTElORSArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgICJqYXZhLnV0aWwuRGF0ZSBkYXRlVGVtcCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgID0gZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIucGFyc2UoIiArIGF0dHJpYnV0ZU5hbWUgKyAiKTsiICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTkVXTElORSArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciIgKyBHZW5lcmF0b3IuU1BBQ0UgKyBub2RlTmFtZSArICIgPSAiICsgIm5ldyBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIoKTsiIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTkVXTElORSArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgbm9kZU5hbWUgKyAiLnNldFRpbWUoZGF0ZVRlbXAiICsgZ2V0VW5pcXVlTmFtZSgpKyAiKTsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiIiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICogdGhpcyBpcyBuZWVkZWQgZm9yIG1vc3QgY2FzZSAKLSAgKiBidXQgaXQgaXMgcGVyaXBoZXJhbCBhcyB0aGUgc3RyaW5nY29udmVyc2lvbiBuZWVkZWQgCi0gICogdG8gYmUgb3ZlcnJpZGRlbgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIC8qKgotICAqIGNvbnZlcnRzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIHByb3h5IAotICAqIGJhY2sgdG8gYSBzdHJpbmcgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgdHlwZSB0byBzdHJpbmcuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZUNvbnZlcnNpb24oU3RyaW5nIG5hbWUpCi0gIHsKLQotICAgIFN0cmluZyBjb252ZXJzaW9uID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiamF2YS50ZXh0LkRhdGVGb3JtYXQgZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBqYXZhLnRleHQuRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAJICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJqYXZhLnV0aWwuRGF0ZSBkYXRlIiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9ICIgKyBuYW1lICsgIi5nZXRUaW1lKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgCSAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gb3JnLmVjbGlwc2UuanN0LndzLnV0aWwuSnNwVXRpbHMubWFya3VwKGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiLmZvcm1hdChkYXRlIiArIGdldFVuaXF1ZU5hbWUoKSArICIpKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCU9IHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotCi0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLQotCi0KLSAgLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0hhc2h0YWJsZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9IYXNodGFibGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZmYyY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0hhc2h0YWJsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHJlY29nbml6ZWQgcmV0dXJuIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIEhhc2h0YWJsZVR5cGUgZXh0ZW5kcyBSZWNvZ25pemVkUmV0dXJuVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIEhhc2h0YWJsZVR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuSEFTSFRBQkxFX05BTUUpOwotICB9Ci0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9NYXBUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvTWFwVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM1YmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9NYXBUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSByZWNvZ25pemVkIHJldHVybiB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBNYXBUeXBlIGV4dGVuZHMgUmVjb2duaXplZFJldHVyblR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBNYXBUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5Lk1BUF9OQU1FKTsKLSAgfQotCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvTWV0aG9kRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL01ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4OTJmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvTWV0aG9kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YSBiZWFuIG1ldGhvZC4KLSogTmVhcmVzdCBtb3JhbCBlcXVpdmFsZW50czogamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLCBqYXZhLmJlYW5zLk1ldGhvZERlc2NyaXB0b3IuCi0qLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX0JFQU4gPSAiYmVhbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9QQVJBTUVURVJTID0gInBhcmFtZXRlcnMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUkVUVVJOX1BBUkFNRVRFUlMgPSAicmV0dXJucGFyYW1ldGVycyI7Ci0gIHByaXZhdGUgU3RyaW5nIGZEaXNwbGF5TmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgZk5hbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBmTWV0aG9kT21pdHRlZDsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gYmVhbiBUaGUgQmVhbiB0aGF0IG93bnMgdGhpcyBtZXRob2QuCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4KLSAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgbWV0aG9kLgotICAqLwotICBwdWJsaWMgTWV0aG9kRWxlbWVudCAoIEJlYW5FbGVtZW50IGJlYW5FbGVtZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRpc3BsYXlOYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxiZWFuRWxlbWVudCxSRUxfQkVBTixCZWFuRWxlbWVudC5SRUxfTUVUSE9EUyk7Ci0gICAgZkRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgZk5hbWUgPSBuYW1lOwotICAgIGZNZXRob2RPbWl0dGVkID0gZmFsc2U7Ci0gICAgCi0gIH0KLQotICAvKgotICAqIEluIHRoZSBldmVudCB0aGF0IHRoZXJlIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUKLSAgKiB3ZSB3aWxsIHNldCB0aGUgb21taXNzaW9uIGJvb2xlYW4gdmFyaWFibGUKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpcyB0byBiZSBvbW1pdGVkCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGdldE1ldGhvZE9tbWlzc2lvbigpCi0gIHsKLSAgICByZXR1cm4gZk1ldGhvZE9taXR0ZWQ7Ci0gIH0KLQotICAvKgotICAqIEluIHRoZSBldmVudCB0aGF0IHRoZXJlIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUKLSAgKiB3ZSB3aWxsIGdldCB0aGUgb21taXNzaW9uIGJvb2xlYW4gdmFyaWFibGUKLSAgKiBAcGFyYW0gYm9vbGVhbiB0cnVlIGlmIHRoaXMgbWV0aG9kIGlzIHRvIGJlIG9tbWl0ZWQKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kT21taXNzaW9uKGJvb2xlYW4gYm9vbCkKLSAgewotICAgIGZNZXRob2RPbWl0dGVkID0gYm9vbDsKLSAgfQotCi0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBmTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZEaXNwbGF5TmFtZTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIEJlYW4gdGhhdCBvd25zIHRoaXMgbWV0aG9kLgotICAqIEByZXR1cm4gQmVhbiBUaGUgQmVhbiB0aGF0IG93bnMgdGhpcyBtZXRob2QuCi0gICovCi0gIHB1YmxpYyBCZWFuRWxlbWVudCBnZXRCZWFuRWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9CRUFOKTsKLSAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChCZWFuRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgcmV0dXJuIHBhcmFtZXRlciBvZiB0aGlzIG1ldGhvZC4KLSAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIGhvbGRzIHRoZSByZXR1cm4gcGFyYW1ldGVyIG9mIHRoaXMgbWV0aG9kLgotICAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UmV0dXJuUGFyYW1ldGVyRW51bSAoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9SRVRVUk5fUEFSQU1FVEVSUyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIHRoZSByZXR1cm4gcGFyYW1ldGVyIG9mIHRoaXMgbWV0aG9kLgotICAqIEByZXR1cm4gRW51bWVyYXRpb24gaG9sZHMgdGhlIHJldHVybiBwYXJhbWV0ZXIgb2YgdGhpcyBtZXRob2QuCi0gICovCi0gIHB1YmxpYyBQYXJhbWV0ZXJFbGVtZW50IGdldFJldHVyblBhcmFtZXRlckVsZW1lbnQgKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRSZXR1cm5QYXJhbWV0ZXJFbnVtKCk7Ci0gICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCkgPyAoUGFyYW1ldGVyRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgUGFyYW1ldGVyIG9iamVjdHMgb2YgdGhpcyBtZXRob2QuCi0gICogQHJldHVybiBFbnVtZXJhdGlvbiBBbGwgUGFyYW1ldGVyIG9iamVjdHMgb2YgdGhpcyBtZXRob2QuCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJhbWV0ZXJFbGVtZW50cyAoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9QQVJBTUVURVJTKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBQYXJhbWV0ZXIgb2JqZWN0cyBvZiB0aGlzIG1ldGhvZC4KLSAgKiBAcmV0dXJuIGludCBUaGUgbnVtYmVyIG9mIFBhcmFtZXRlciBvYmplY3RzIG9mIHRoaXMgbWV0aG9kLgotICAqLwotICBwdWJsaWMgaW50IGdldE51bWJlck9mUGFyYW1ldGVyRWxlbWVudHMgKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9QQVJBTUVURVJTKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUGFyYW1ldGVyRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1BhcmFtZXRlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiMDY3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUGFyYW1ldGVyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhIGJlYW4gbWV0aG9kIHBhcmFtZXRlci4KLSogTmVhcmVzdCBtb3JhbCBlcXVpdmFsZW50czogamF2YS5iZWFucy5QYXJhbWV0ZXJEZXNjcmlwdG9yLgotKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX01FVEhPRCA9ICJtZXRob2QiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfVFlQRSA9ICJ0eXBlIjsKLQotICBwdWJsaWMgYm9vbGVhbiBmUmV0dXJuUGFyYW1ldGVyPWZhbHNlOwotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogQHBhcmFtIG1ldGhvZCBUaGUgTWV0aG9kIHRoYXQgb3ducyB0aGlzIHBhcmFtZXRlci4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLgotICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuCi0gICovCi0gIHB1YmxpYyBQYXJhbWV0ZXJFbGVtZW50ICggTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHJlbFR5cGUsYm9vbGVhbiByZXR1cm5QYXJhbWV0ZXIgKQotICB7Ci0gICAgdGhpcyhuYW1lLG1ldGhvZEVsZW1lbnQsUkVMX01FVEhPRCxyZWxUeXBlKTsKLSAgICBmUmV0dXJuUGFyYW1ldGVyID0gcmV0dXJuUGFyYW1ldGVyOwotICB9Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gbWV0aG9kIFRoZSBNZXRob2QgdGhhdCBvd25zIHRoaXMgcGFyYW1ldGVyLgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuCi0gICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlci4KLSAgKi8KLSAgcHVibGljIFBhcmFtZXRlckVsZW1lbnQgKFN0cmluZyBuYW1lLCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQsIFN0cmluZyBvdXRSZWwsU3RyaW5nIGluUmVsKQotICB7Ci0gICAgc3VwZXIobmFtZSxtZXRob2RFbGVtZW50LG91dFJlbCxpblJlbCk7Ci0gIH0KLSAgIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBNZXRob2QgdGhhdCBvd25zIHRoaXMgcGFyYW1ldGVyLgotICAqIEByZXR1cm4gTWV0aG9kIFRoZSBNZXRob2QgdGhhdCBvd25zIHRoaXMgcGFyYW1ldGVyLgotICAqLwotICBwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX01FVEhPRCk7Ci0gICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCkgPyAoTWV0aG9kRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgTWV0aG9kIHRoYXQgb3ducyB0aGlzIHBhcmFtZXRlci4KLSAgKiBAcmV0dXJuIE1ldGhvZCBUaGUgTWV0aG9kIHRoYXQgb3ducyB0aGlzIHBhcmFtZXRlci4KLSAgKi8KLSAgcHVibGljIFR5cGVFbGVtZW50IGdldFR5cGVFbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX1RZUEUpOwotICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKFR5cGVFbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JldHVybigpCi0gIHsKLSAgICByZXR1cm4gZlJldHVyblBhcmFtZXRlcjsKLSAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVBcnJheVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVBcnJheVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg3MzA2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQXJyYXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHJlY29nbml6ZWQgcmV0dXJuIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZUFycmF5VHlwZSBleHRlbmRzIEFycmF5VHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZUFycmF5VHlwZShTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5QUklNSVRJVkVfQVJSQVlfTkFNRSwgdHlwZU5hbWUpOwotICB9Ci0KLSAgIC8qKgotICAqIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBmdW5jdGlvbiB0aGF0IGRpY3RhdGVzIGhvdyB3ZSB3YW50IHRvIGRpc3BsYXkgdGhpcyB0eXBlIAotICAqIHVwb24gcmVjZWl2aW5nIGl0IGFzIGEgcmV0dXJuIGZyb20gYSBwcm94eSBtZXRob2QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgVGhlIGRpc3BsYXkgc3RyaW5nCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZUNvbnZlcnNpb24oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgdHJpcHBsZVRhYiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgR2VuZXJhdG9yLlRBQjsKLQotICAgIFN0cmluZyBub25CZWFuID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIHRlbXAiICsgZ2V0VW5pcXVlTmFtZSgpICsgIiA9IFwiW1wiOyIgCi0gICAgCSAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImZvcihpbnQgaSIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiPTA7aSIgK2dldFVuaXF1ZU5hbWUoKSArICI8ICIgKyBuYW1lIAotICAgIAkgICAgICAgICAgICAgICAgICAgKyAiLmxlbmd0aDtpIiArIGdldFVuaXF1ZU5hbWUoKSArICIrKyl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgIAkgICAgICAgICAgICAgKyB0cmlwcGxlVGFiICsgInRlbXAiKyBnZXRVbmlxdWVOYW1lKCkgKyIgPSB0ZW1wIitnZXRVbmlxdWVOYW1lKCkgKyAiICsgIiArIG5hbWUgKyAiW2kiICsgZ2V0VW5pcXVlTmFtZSgpIAotICAgIAkgICAgICAgICAgICAgICAgICAgKyAiXSArIFwiLFwiOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJ9IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiaW50IGxlbmd0aCIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiID0gdGVtcCIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiLmxlbmd0aCgpOyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAidGVtcCIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiID0gdGVtcCIrZ2V0VW5pcXVlTmFtZSgpKyIuc3Vic3RyaW5nKDAsKGxlbmd0aCIrZ2V0VW5pcXVlTmFtZSgpKyIgLSAxKSkgKyBcIl1cIjsiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgCSAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgIAkgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JT10ZW1wIisgZ2V0VW5pcXVlTmFtZSgpICsiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JSIrIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0KLSAgICByZXR1cm4gbm9uQmVhbjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQm9vbGVhblR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVCb29sZWFuVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNThhZDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVCb29sZWFuVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlQm9vbGVhblR5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZUJvb2xlYW5UeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlBSSU1fQk9PTEVBTl9OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gIkJvb2xlYW4udmFsdWVPZigiICsgbmFtZSArICIpLmJvb2xlYW5WYWx1ZSgpOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLSAgCi0gIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUJ5dGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQnl0ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0NWQyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQnl0ZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZUJ5dGVUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVCeXRlVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5QUklNX0JZVEVfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICJCeXRlLnBhcnNlQnl0ZSgiICsgbmFtZSArICIpOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLSAgCi0gIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUNoYXJUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQ2hhclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyZjkwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQ2hhclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZUNoYXJUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVDaGFyVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5QUklNX0NIQVJfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICIiICsgbmFtZSArICIuY2hhckF0KDApOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLSAgCi0gIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZURvdWJsZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVEb3VibGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzYyZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZURvdWJsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZURvdWJsZVR5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZURvdWJsZVR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTV9ET1VCTEVfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICJEb3VibGUucGFyc2VEb3VibGUoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVGbG9hdFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVGbG9hdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwZjlkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlRmxvYXRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVGbG9hdFR5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZUZsb2F0VHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5QUklNX0ZMT0FUX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSAiRmxvYXQucGFyc2VGbG9hdCgiICsgbmFtZSArICIpOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLSAgCi0gIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUludFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVJbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMzNkZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUludFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZUludFR5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZUludFR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTV9JTlRFR0VSX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSAiSW50ZWdlci5wYXJzZUludCgiICsgbmFtZSArICIpOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLSAgCi0gIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUphdmFUeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUphdmFUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzE1MjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVKYXZhVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVKYXZhVHlwZXMgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZUphdmFUeXBlcyhTdHJpbmcgdHlwZSkKLSAgewotICAgIHN1cGVyKHR5cGUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gZlR5cGUgKyAiLnZhbHVlT2YoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOyAgICAKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIlN0cmluZy52YWx1ZU9mKCIgKyBuYW1lICsgIikiOwotICB9Ci0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlTG9uZ1R5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVMb25nVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBjODI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVMb25nVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlTG9uZ1R5cGUgZXh0ZW5kcyBQcmltaXRpdmVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZUxvbmdUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlBSSU1fTE9OR19OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gIkxvbmcucGFyc2VMb25nKCIgKyBuYW1lICsgIik7IjsKLSAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotICAKLSAgCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlU2hvcnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlU2hvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOTFjZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZVNob3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlU2hvcnRUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVTaG9ydFR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTV9TSE9SVF9OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gIlNob3J0LnBhcnNlU2hvcnQoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjUxNzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJpbWl0aXZlVHlwZSBleHRlbmRzIFNpbXBsZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgUHJpbWl0aXZlVHlwZShTdHJpbmcgdHlwZSkKLSAgewotICAgIHN1cGVyKHR5cGUpOwotICB9Ci0gCi0gLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAiU3RyaW5nLnZhbHVlT2YoIiArIG5hbWUgKyAiKSI7Ci0gIH0KLSAgCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUmVjb2duaXplZFJldHVyblR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9SZWNvZ25pemVkUmV0dXJuVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzcyMWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9SZWNvZ25pemVkUmV0dXJuVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcmVjb2duaXplZCByZXR1cm4gdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgUmVjb2duaXplZFJldHVyblR5cGUgaW1wbGVtZW50cyBEYXRhVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGZUeXBlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGZVbmlxdWVOYW1lOwotCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgUmVjb2duaXplZFJldHVyblR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBmVHlwZSA9IHR5cGU7Ci0gICAgZlVuaXF1ZU5hbWUgPSAiIjsKLSAgfQotCi0gIC8qKgotICAqIG5vdCByZWxldmFudCBhdCB0aGlzIHBvaW50IAotICAqLwotICBwdWJsaWMgU3RyaW5nIGlucHV0Rm9ybShTdHJpbmcgbmFtZSkKLSAgewotICAgICByZXR1cm4gIiI7Ci0gIH0KLQotICAgLyoqCi0gICogYWdhaW4gbm90IHJlbGV2YW50Ci0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdENvZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBpZCkKLSAgewotICAgICByZXR1cm4gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRzIGJhY2sgdGhlIGNvZGUgcmVxdWlyZWQgdG8gZ28gZnJvbSB0aGUgCi0gICogc3RyaW5nIHRoZSB1c2VyIGVudGVyZWQgdG8gdGhlIGFjdHVhbCB0eXBlIG9mIHRoZSBlbGVtZW50Ci0gICogQHBhcmFtIFN0cmluZyB0eXBlTmFtZSB0aGlzIGlzIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgdHlwZSBpZSBpbnQsYm9vbGVhbgotICAqIEBwYXJhbSBTdHJpbmcgbm9kZU5hbWUgVGhlIG5vZGVOYW1lIGlzIGp1c3QgdGhlIGF0dHJpYnV0ZW5hbWUgKyBUZW1wLiAKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBhdHRyaWJ1dGVOYW1lIAotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlIC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBzdHJpbmdDb252ZXJzaW9uKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBmdW5jdGlvbiB0aGF0IGRpY3RhdGVzIGhvdyB3ZSB3YW50IHRvIGRpc3BsYXkgdGhpcyB0eXBlIAotICAqIHVwb24gcmVjZWl2aW5nIGl0IGFzIGEgcmV0dXJuIGZyb20gYSBwcm94eSBtZXRob2QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgVGhlIGRpc3BsYXkgc3RyaW5nCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZUNvbnZlcnNpb24oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgbm9uQmVhbiA9ICAgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiaWYoIiArIG5hbWUgKyAiIT0gbnVsbCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgICAKLSAgICAJICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIHRlbXAiICsgZ2V0VW5pcXVlTmFtZSgpKyIgPSAiICsgbmFtZSArICIudG9TdHJpbmcoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSAgCi0gICAgCSAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgICI8JT10ZW1wIiArIGdldFVuaXF1ZU5hbWUoKSArIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAgIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAifSI7Ci0gICAgcmV0dXJuIG5vbkJlYW47Ci0gIH0KLQotICAvKioKLSAgKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgdGhlIG5hbWUoaW5jbHVkaW5nIHBhY2thZ2UpLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGZUeXBlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKCkKLSAgewotICAgIHJldHVybiBmVW5pcXVlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVuaXF1ZU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmVW5pcXVlTmFtZSA9IG5hbWU7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU09BUEVsZW1lbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU09BUEVsZW1lbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OWUwMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1NPQVBFbGVtZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgU09BUEVsZW1lbnRUeXBlIGltcGxlbWVudHMgRGF0YVR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBmVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBmVW5pcXVlTmFtZTsKLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFNPQVBFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBmVHlwZSA9ICJqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCI7Ci0gICAgZlVuaXF1ZU5hbWUgPSAiIjsKLSAgfQotCi0gIC8qKgotICAqIGlucHV0Rm9ybSByZXR1cm5zIHRoZSB1c2VyIGlucHV0IGh0bWwKLSAgKiBUaGUgRG9tRWxlbWVudCBmb3JtIGlzIGEgdGV4dCBib3gKLSAgKiBAcGFyYW0gU3RyaW5nIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGlucHV0IGVsZW1lbnQKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZm9ybSB1c2VkIHRvIGNvbGxlY3QgdGhlIGRhdGEKLSAgKi8KLSAgcHVibGljIFN0cmluZyBpbnB1dEZvcm0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGlucHV0Rm9ybSA9ICI8VEQgQUxJR049XCJsZWZ0XCI+PFRFWFRBUkVBIFJvd3M9NyBDb2xzPTQ1IE5BTUU9XCIiIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICJcIj48L1RFWFRBUkVBPjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9UUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIGlucHV0Rm9ybTsKLSAgfQotCi0gICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGRpY3RhdGVzIGhvdyB5b3Ugd2FudCB0byBwcm9jZXNzIHRoZSAKLSAgKiBpbmNvbWluZyBzdHJpbmcgZnJvbSB0aGUgaW5wdXQganNwLiBZb3UgbWF5IG9yIG1heSBub3QgdXNlIHRoZSBtYXJrdXAgCi0gICogZnVuY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSB0eXBlLiBUaGUgc2ltcGxlIHR5cGVzIHVzZSBpdC4gRG9tRWxlbWVudCBkb2VzIG5vdAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RDb2RlKFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpCi0gIHsKLSAgICAgU3RyaW5nIHJlcXVlc3RDb2RlID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIiArIEdlbmVyYXRvci5TUEFDRSAKLSAgICAgCSAgICAgICAgICAgICAgICAgICArIGlkICsgIj0gIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFwiIgotICAgICAJICAgICAgICAgICAgICAgICAgICsgbmFtZSArIlwiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIHJlcXVlc3RDb2RlOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBoYW5kcyBiYWNrIHRoZSBjb2RlIHJlcXVpcmVkIHRvIGdvIGZyb20gdGhlIAotICAqIHN0cmluZyB0aGUgdXNlciBlbnRlcmVkIHRvIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgZWxlbWVudAotICAqIEBwYXJhbSBTdHJpbmcgdHlwZU5hbWUgdGhpcyBpcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIHR5cGUgaWUgaW50LGJvb2xlYW4KLSAgKiBAcGFyYW0gU3RyaW5nIG5vZGVOYW1lIFRoZSBub2RlTmFtZSBpcyBqdXN0IHRoZSBhdHRyaWJ1dGVuYW1lICsgVGVtcC4gCi0gICogQHBhcmFtIFN0cmluZyB0aGUgYXR0cmlidXRlTmFtZSAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgc3RyaW5nQ29udmVyc2lvbihTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGNvbnZlcnNpb24gPSAgR2VuZXJhdG9yLkRPVUJMRV9UQUIgCi0gICAgICAgICAgICAgICAgICAgICAgICsgImphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50ICIgKyBub2RlTmFtZSArICI9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLlNvYXBFbGVtZW50SGVscGVyLmNyZWF0ZVNPQVBFbGVtZW50RnJvbVhNTFN0cmluZygiICsgYXR0cmlidXRlTmFtZSArICIpOyIgCi0JICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgKiBUaGlzIGlzIGJhc2ljYWxseSB0aGUgZnVuY3Rpb24gdGhhdCBkaWN0YXRlcyBob3cgd2Ugd2FudCB0byBkaXNwbGF5IHRoaXMgdHlwZSAKLSAgKiB1cG9uIHJlY2VpdmluZyBpdCBhcyBhIHJldHVybiBmcm9tIGEgcHJveHkgbWV0aG9kCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBkaXNwbGF5IHN0cmluZwotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIHR5cGVUb1N0cmluZyA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLlNvYXBFbGVtZW50SGVscGVyLnNvYXBFbGVtZW50V3JpdGVyKCIgKyBuYW1lICsgIiwgbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKSIgKyAiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCU9IHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotCi0gICAgcmV0dXJuIHR5cGVUb1N0cmluZzsKLSAgfQotCi0gIC8qKgotICAqIHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHR5cGUKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbmFtZShpbmNsdWRpbmcgcGFja2FnZSkuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZlR5cGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZVbmlxdWVOYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VW5pcXVlTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGZVbmlxdWVOYW1lID0gbmFtZTsKLSAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TaW1wbGVFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU2ltcGxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDc4MzQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TaW1wbGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIDEgb2YgdGhyZWUgdHlwZSBlbGVtZW50cyByZXByZXNlbnRzIHByaW1pdGl2ZXMgCi0qLwotcHVibGljIGNsYXNzIFNpbXBsZUVsZW1lbnQgZXh0ZW5kcyBUeXBlRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RvciAKLSAgKiBAcGFyYW0gUGFyYW1ldGVyRWxlbWVudCBUaGUgUGFyYW1ldGVyIHRoYXQgb3ducyB0aGlzIHNpbXBsZSB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgc2ltcGxlIGVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBTaW1wbGVFbGVtZW50ICggUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBwcmltKQotICB7Ci0gICAgc3VwZXIobmFtZSxwYXJhbWV0ZXJFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5TSU1QTEUpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5QQVJBTUVURVJfT1dORVI7Ci0gICAgc2V0UHJpbWl0aXZlKHByaW0pOwotICB9Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RvciAKLSAgKiBAcGFyYW0gUGFyYW1ldGVyRWxlbWVudCBUaGUgQXR0cmlidXRlIHRoYXQgb3ducyB0aGlzIHNpbXBsZSB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgQXR0cmlidXRlRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIFNpbXBsZUVsZW1lbnQgKCBBdHRyaWJ1dGVFbGVtZW50IGF0dHJpYnV0ZUVsZW1lbnQsIFN0cmluZyBuYW1lLCBib29sZWFuIHByaW0pCi0gIHsKLSAgICBzdXBlcihuYW1lLGF0dHJpYnV0ZUVsZW1lbnQsVHlwZUVsZW1lbnQuUkVMX09XTkVSLFR5cGVFbGVtZW50LlJFTF9UWVBFLFR5cGVFbGVtZW50LlNJTVBMRSk7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LkFUVFJJQlVURV9PV05FUjsKLSAgICBzZXRQcmltaXRpdmUocHJpbSk7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RvciAKLSAgKiBAcGFyYW0gUGFyYW1ldGVyRWxlbWVudCBUaGUgQXR0cmlidXRlIHRoYXQgb3ducyB0aGlzIHNpbXBsZSB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgQXR0cmlidXRlRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIFNpbXBsZUVsZW1lbnQgKCBGaWVsZEVsZW1lbnQgZmllbGRFbGVtZW50LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBwcmltKQotICB7Ci0gICAgc3VwZXIobmFtZSxmaWVsZEVsZW1lbnQsVHlwZUVsZW1lbnQuUkVMX09XTkVSLFR5cGVFbGVtZW50LlJFTF9UWVBFLFR5cGVFbGVtZW50LlNJTVBMRSk7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LkZJRUxEX09XTkVSOwotICAgIHNldFByaW1pdGl2ZShwcmltKTsKLSAgfQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1NpbXBsZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TaW1wbGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MTk0ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1NpbXBsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbXBsZVR5cGUgaW1wbGVtZW50cyBEYXRhVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGZUeXBlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGZVbmlxdWVOYW1lOwotCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgU2ltcGxlVHlwZShTdHJpbmcgdHlwZSkKLSAgewotICAgIGZUeXBlID0gdHlwZTsKLSAgfQotCi0gIC8qKgotICAqIGlucHV0Rm9ybSByZXR1cm5zIHRoZSB1c2VyIGlucHV0IGh0bWwKLSAgKiBUaGUgc2ltcGxlIGZvcm0gaXMganVzdCBhIHRleHQgaW5wdXQgYm94Ci0gICogQHBhcmFtIFN0cmluZyBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnB1dCBlbGVtZW50Ci0gICogQHJldHVybiBTdHJpbmcgVGhlIGZvcm0gdXNlZCB0byBjb2xsZWN0IHRoZSBkYXRhCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgaW5wdXRGb3JtKFN0cmluZyBuYW1lKQotICB7Ci0gICAgIFN0cmluZyBpbnB1dEZvcm0gPSAiPFREIEFMSUdOPVwibGVmdFwiPjxJTlBVVCBUWVBFPVwiVEVYVFwiIE5BTUU9XCIiIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICJcIiBTSVpFPTIwPjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9UUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIGlucHV0Rm9ybTsKLSAgfQotCi0gICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGRpY3RhdGVzIGhvdyB5b3Ugd2FudCB0byBwcm9jZXNzIHRoZSAKLSAgKiBpbmNvbWluZyBzdHJpbmcgZnJvbSB0aGUgaW5wdXQganNwLiBZb3UgbWF5IG9yIG1heSBub3QgdXNlIHRoZSBtYXJrdXAgCi0gICogZnVuY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSB0eXBlLiBUaGUgc2ltcGxlIHR5cGVzIHVzZSBpdC4gRG9tRWxlbWVudCBkb2VzIG5vdAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RDb2RlKFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpCi0gIHsKLSAgICAgU3RyaW5nIHJlcXVlc3RDb2RlID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIiArIEdlbmVyYXRvci5TUEFDRSAKLSAgICAgCSAgICAgICAgICAgICAgICAgICArIGlkICsgIj0gIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFwiIgotICAgICAJICAgICAgICAgICAgICAgICAgICsgbmFtZSArIlwiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIHJlcXVlc3RDb2RlOwotICAgfQotIAotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRzIGJhY2sgdGhlIGNvZGUgcmVxdWlyZWQgdG8gZ28gZnJvbSB0aGUgCi0gICogc3RyaW5nIHRoZSB1c2VyIGVudGVyZWQgdG8gdGhlIGFjdHVhbCB0eXBlIG9mIHRoZSBlbGVtZW50Ci0gICogaXQgdXNlcyBhbm90aGVyIGZ1bmN0aW9uIHRoYXQgYWxsIHN1YmNsYXNzZXMgb2YgU2ltcGxlVHlwZSBhcmUgcmVxdWlyZWQgdG8gaW1wbGVtZW50Ci0gICogVGhlIFN0cmluZ1RvVHlwZSBmdW5jdGlvbgotICAqIEBwYXJhbSBTdHJpbmcgdHlwZU5hbWUgdGhpcyBpcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIHR5cGUgaWUgaW50LGJvb2xlYW4KLSAgKiBAcGFyYW0gU3RyaW5nIG5vZGVOYW1lIFRoZSBub2RlTmFtZSBpcyBqdXN0IHRoZSBhdHRyaWJ1dGVuYW1lICsgVGVtcC4gCi0gICogQHBhcmFtIFN0cmluZyB0aGUgYXR0cmlidXRlTmFtZSAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgc3RyaW5nQ29udmVyc2lvbihTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGNvbnZlcnNpb24gPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArIHR5cGVOYW1lICsgR2VuZXJhdG9yLlNQQUNFICsgbm9kZU5hbWUgCi0gICAgIAkgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLlNQQUNFICsgIiA9ICIgKyBTdHJpbmdUb1R5cGUoYXR0cmlidXRlTmFtZSkgCi0gICAgIAkgICAgICAgICAgICAgICAgICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotICAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAqIGNvbnZlcnRzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIHByb3h5IAotICAqIGJhY2sgdG8gYSBzdHJpbmcgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgdHlwZSB0byBzdHJpbmcuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZUNvbnZlcnNpb24oU3RyaW5nIG5hbWUpCi0gIHsKLQotICAgIFN0cmluZyBjb252ZXJzaW9uID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gb3JnLmVjbGlwc2UuanN0LndzLnV0aWwuSnNwVXRpbHMubWFya3VwKCIgKyBUeXBlVG9TdHJpbmcobmFtZSkgKyAiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCU9IHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotCi0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLQotICAgLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSk7Ci0KLSAgLyoqCi0gICogcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBuYW1lKGluY2x1ZGluZyBwYWNrYWdlKS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiBmVHlwZTsKLSAgfQotCi0gICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZVbmlxdWVOYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VW5pcXVlTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGZVbmlxdWVOYW1lID0gbmFtZTsKLSAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TdGF0ZUxlc3NCZWFuVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1N0YXRlTGVzc0JlYW5UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YTk4YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1N0YXRlTGVzc0JlYW5UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSByZWNvZ25pemVkIHJldHVybiB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZUxlc3NCZWFuVHlwZSBleHRlbmRzIFJlY29nbml6ZWRSZXR1cm5UeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0KLSAgcHJpdmF0ZSBTdHJpbmcgZlR5cGVOYW1lOwotCi0KLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgCi0gIHB1YmxpYyBTdGF0ZUxlc3NCZWFuVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlNUQVRFTEVTU19CRUFOKTsKLSAgICBmVHlwZU5hbWUgPSBuYW1lOwotCi0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1N0cmluZ1R5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TdHJpbmdUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTljNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1N0cmluZ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdUeXBlIGV4dGVuZHMgU2ltcGxlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBTdHJpbmdUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlNUUklOR19OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlIC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9IG5hbWUgKyAiOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247ICAgIAotICB9Ci0KLSAgLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAiU3RyaW5nLnZhbHVlT2YoIiArIG5hbWUgKyAiKSI7Ci0gIH0KLSAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9UeXBlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1R5cGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjIyY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1R5cGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLS8qKgotKiBUeXBlRWxlbWVudCBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgSmF2YSBiZWFuIGZlYXR1cmVzIHRoYXQgaGF2ZSB0eXBlcy4KLSovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZUVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IEJFQU4gPSAwOwotICBwdWJsaWMgc3RhdGljIGludCBTSU1QTEUgPSAxOwotICBwdWJsaWMgc3RhdGljIGludCBBUlJBWSA9IDI7Ci0KLSAgcHJpdmF0ZSBpbnQgZlR5cGU7Ci0gIHByb3RlY3RlZCBpbnQgZk93bmVyVHlwZTsKLSAgcHJpdmF0ZSBib29sZWFuIGZQcmltaXRpdmUgPSBmYWxzZTsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4gQXV0b21hdGljYWxseSBhZGRzIHRoaXMgb2JqZWN0IHRvIHRoZSBnaXZlbiBtb2RlbC4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudAotICAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgdG8gb3duIHRoaXMgb2JqZWN0LgotICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0LCBvbmUgb2YKLSAgKiA8Y29kZT5CRUFOPC9jb2RlPiwgPGNvZGU+U0lNUExFPC9jb2RlPiBvciA8Y29kZT5BUlJBWTwvY29kZT4uCi0gICovCi0gIHByb3RlY3RlZCBUeXBlRWxlbWVudCAoIFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgaW50IHR5cGUgKQotICB7Ci0gICAgc3VwZXIobmFtZSxtb2RlbCk7Ci0gICAgZlR5cGUgPSB0eXBlOwotICB9Ci0KLSAgLyoqCi0gICovCi0gIHByb3RlY3RlZCBUeXBlRWxlbWVudCAoIFN0cmluZyBuYW1lLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBvdXRib3VuZFJlbE5hbWUsIFN0cmluZyBpbmJvdW5kUmVsTmFtZSwgaW50IHR5cGUgKQotICB7Ci0gICAgc3VwZXIobmFtZSxlbGVtZW50LG91dGJvdW5kUmVsTmFtZSxpbmJvdW5kUmVsTmFtZSk7Ci0gICAgZlR5cGUgPSB0eXBlOwotICB9Ci0KLSAgLyoKLSAgKlRoaXMgd2lsbCB0ZWxsIHlvdSB3ZXRoZXIgdGhlIHR5cGUgaXMgYSBiZWFuCi0gICpAcGFyYW0gQm9vbGVhbiByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBiZWFuCi0gICoqLwotICBwdWJsaWMgYm9vbGVhbiBpc0JlYW4oKQotICB7Ci0gICAgaWYgKGZUeXBlID09IEJFQU4pIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qCi0gICpUaGlzIHdpbGwgdGVsbCB5b3Ugd2V0aGVyIHRoZSB0eXBlIGlzIGEgYmVhbgotICAqQHBhcmFtIEJvb2xlYW4gcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYmVhbgotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKQotICB7Ci0gICAgcmV0dXJuIGZQcmltaXRpdmU7Ci0gIH0KLQotICAvKgotICAqVGhpcyB3aWxsIHRlbGwgeW91IHdldGhlciB0aGUgdHlwZSBpcyBhIGJlYW4KLSAgKkBwYXJhbSBCb29sZWFuIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGJlYW4KLSAgKiovCi0gIHByb3RlY3RlZCB2b2lkIHNldFByaW1pdGl2ZShib29sZWFuIHByaW0pCi0gIHsKLSAgICBmUHJpbWl0aXZlID0gcHJpbTsgCi0gIH0KLQotCi0gIC8qCi0gICogVGhpcyBpcyBtYWlubHkgbmVlZGVkIGZvciBhcnJheXMgYXMgd2l0aCBhbGwgdHlwZXMgdGhlCi0gICogbmFtZXMgY29tZSBvdXQgYXMgamF2YS51dGlsLnR5cGUsIGJ1dCB3aXRoIGFuIGFycmF5IGl0IAotICAqIGlzbnQgZXhwbGljaXQgaW4gdGVsbGluZyB1cyBpdHMgYW4gYXJyYXkKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci0gIAotICAvKgotICAqVGhpcyB3aWxsIHRlbGwgeW91IHdldGhlciB0aGUgdHlwZSBpcyBhIHNpbXBsZQotICAqQHBhcmFtIEJvb2xlYW4gcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgc2ltcGxlCi0gICoqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZSgpCi0gIHsKLSAgICBpZiAoZlR5cGUgPT0gU0lNUExFKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKgotICAqVGhpcyB3aWxsIHRlbGwgeW91IHdldGhlciB0aGUgdHlwZSBpcyBhIGFycmF5Ci0gICpAcGFyYW0gQm9vbGVhbiByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhcnJheQotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBcnJheSgpCi0gIHsKLSAgICBpZiAoZlR5cGUgPT0gQVJSQVkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9BVFRSSUJVVEVTID0gImF0dHJpYnV0ZXMiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfRklFTERTID0gImZpZWxkcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9UWVBFID0gInR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfT1dORVIgPSAib3duZXIiOwotCi0gIHB1YmxpYyBzdGF0aWMgaW50IFBBUkFNRVRFUl9PV05FUiA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgaW50IEFUVFJJQlVURV9PV05FUiA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgaW50IEZJRUxEX09XTkVSID0gMjsKLSAgcHVibGljIHN0YXRpYyBpbnQgUk9PVCA9IDM7Ci0KLSAgLyoKLSAgKiBUaGlzIGNvdWxkIGJlIFRoZSByb290IHRlc3QgYmVhbgotICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoaXMgaXMgcm9vdCBiZWFuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzUm9vdCgpCi0gIHsKLSAgICBpZihmT3duZXJUeXBlID09IFJPT1QpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qCi0gICogVGhpcyBUeXBlIGNvdWxkIGJlIG93bmVkIGJ5IGEgUGFyYW1ldGVyIG9yIGFuIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoaXMgaXMgb3duZWQgYnkgYSBwYXJhbWV0ZXIKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNPd25lclBhcmFtZXRlcigpCi0gIHsKLSAgICBpZihmT3duZXJUeXBlID09IFBBUkFNRVRFUl9PV05FUikgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoKLSAgKiBUaGlzIFR5cGUgY291bGQgYmUgb3duZWQgYnkgYSBQYXJhbWV0ZXIgb3IgYW4gYXR0cmlidXRlCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhpcyBpcyBvd25lZCBieSBhbiBhdHRyaWJ1dGUgCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzT3duZXJBdHRyaWJ1dGUoKQotICB7Ci0gICAgaWYoZk93bmVyVHlwZSA9PSBBVFRSSUJVVEVfT1dORVIpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qCi0gICogVGhpcyBUeXBlIGNvdWxkIGJlIG93bmVkIGJ5IGEgUGFyYW1ldGVyIG9yIGFuIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoaXMgaXMgb3duZWQgYnkgYW4gYXR0cmlidXRlIAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc093bmVyRmllbGQoKQotICB7Ci0gICAgaWYoZk93bmVyVHlwZSA9PSBGSUVMRF9PV05FUikgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBUeXBlIG1heSBiZSBvd25lZCBieSBhIHBhcmFtZXRlciBvciBhbiBhdHRyaWJ1dGUgCi0gICogVXNlIHRoaXMgbWV0aG9kIGluIGNvbmp1bmN0aW9uIHdpdGggaXNPd25lclBhcmFtdGVyLCBpc093bmVyCi0gICogQHJldHVybiBCYXNpY0VsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoaXMgYXR0cmlidXRlLgotICAqLwotICBwdWJsaWMgQmFzaWNFbGVtZW50IGdldE93bmluZ0VsZW1lbnQgKCkKLSAgewotICAgIGlmIChpc093bmVyUGFyYW1ldGVyKCkpewotICAgICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9PV05FUik7Ci0gICAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChCYXNpY0VsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgICB9Ci0gICAgZWxzZSBpZihpc093bmVyQXR0cmlidXRlKCkpewotICAgICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9PV05FUik7Ci0gICAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChCYXNpY0VsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgICB9Ci0gICAgZWxzZSBpZihpc093bmVyRmllbGQoKSl7Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX09XTkVSKTsKLSAgICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKEJhc2ljRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9UeXBlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1R5cGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOTgyMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1R5cGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotLyoqCi0gKiBUeXBlRmFjdG9yeQotICogQ3JlYXRpb24gZGF0ZTogKDQvMTAvMjAwMSAxMjo0MTo0OCBQTSkKLSAqIEBhdXRob3I6IEdpbGJlcnQgQW5kcmV3cwotICovCi1wdWJsaWMgY2xhc3MgVHlwZUZhY3RvcnkgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfTkFNRSAgICAgICAgICAgICAgICAgICA9ICJqYXZhLm5ldC5VUkwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfTkFNRSAgICAgICAgICAgICAgID0gImphdmEubGFuZy5TdHJpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSUdfREVDSU1BTF9OQU1FICAgICAgICAgID0gImphdmEubWF0aC5CaWdEZWNpbWFsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklHX0lOVEVHRVJfTkFNRSAgICAgICAgICA9ICJqYXZhLm1hdGguQmlnSW50ZWdlciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfTkFNRSAgICAgICAgICAgICAgICAgPSAiamF2YS51dGlsLkRhdGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVHT1JJQU5fQ0FMRU5EQVJfTkFNRSA9ICJqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxFTkRBUl9OQU1FICAgICAgICAgICAgID0gImphdmEudXRpbC5DYWxlbmRhciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xFQU5fTkFNRSAgICAgICAgICAgICAgPSAiamF2YS5sYW5nLkJvb2xlYW4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCWVRFX05BTUUgICAgICAgICAgICAgICAgICA9ICJqYXZhLmxhbmcuQnl0ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9OQU1FICAgICAgICAgICAgICAgPSAiamF2YS5sYW5nLkRvdWJsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMT0FUX05BTUUgICAgICAgICAgICAgICAgID0gImphdmEubGFuZy5GbG9hdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVHRVJfTkFNRSAgICAgICAgICAgICAgID0gImphdmEubGFuZy5JbnRlZ2VyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9OR19OQU1FICAgICAgICAgICAgICAgICAgPSAiamF2YS5sYW5nLkxvbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVF9OQU1FICAgICAgICAgICAgICAgICA9ICJqYXZhLmxhbmcuU2hvcnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSQUNURVJfTkFNRSAgICAgICAgICAgID0gImphdmEubGFuZy5DaGFyYWN0ZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0JPT0xFQU5fTkFNRSAgICAgICAgID0gImJvb2xlYW4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0JZVEVfTkFNRSAgICAgICAgICAgID0gImJ5dGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0RPVUJMRV9OQU1FICAgICAgICAgID0gImRvdWJsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fRkxPQVRfTkFNRSAgICAgICAgICAgPSAiZmxvYXQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0lOVEVHRVJfTkFNRSAgICAgICAgID0gImludCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fTE9OR19OQU1FICAgICAgICAgICAgPSAibG9uZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fU0hPUlRfTkFNRSAgICAgICAgICAgPSAic2hvcnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0NIQVJfTkFNRSAgICAgICAgICAgID0gImNoYXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEX05BTUUgICAgICAgICAgICAgICAgICA9ICJ2b2lkIjsKLQotICAvL3NvbWUgc3BlY2lhbCBjb21wbGV4Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPTV9FTEVNRU5UX05BTUUgICA9ICJvcmcudzNjLmRvbS5FbGVtZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9FTEVNRU5UX05BTUUgPSAiamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURUxFU1NfQkVBTiA9IEJlYW5FbGVtZW50LlNUQVRFTEVTU19CRUFOOwotCi0KLQotICBwdWJsaWMgc3RhdGljIEhhc2h0YWJsZSBqYXZhVHlwZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIAotICBwdWJsaWMgVHlwZUZhY3RvcnkoKXt9Ci0KLSAgc3RhdGljewotICAgIGphdmFUeXBlcy5wdXQoQk9PTEVBTl9OQU1FLG5ldyBQcmltaXRpdmVKYXZhVHlwZXMoQk9PTEVBTl9OQU1FKSk7Ci0gICAgamF2YVR5cGVzLnB1dChCWVRFX05BTUUsICAgbmV3IFByaW1pdGl2ZUphdmFUeXBlcyhCWVRFX05BTUUpKTsKLSAgICBqYXZhVHlwZXMucHV0KERPVUJMRV9OQU1FLCBuZXcgUHJpbWl0aXZlSmF2YVR5cGVzKERPVUJMRV9OQU1FKSk7Ci0gICAgamF2YVR5cGVzLnB1dChGTE9BVF9OQU1FLCAgbmV3IFByaW1pdGl2ZUphdmFUeXBlcyhGTE9BVF9OQU1FKSk7Ci0gICAgamF2YVR5cGVzLnB1dChJTlRFR0VSX05BTUUsbmV3IFByaW1pdGl2ZUphdmFUeXBlcyhJTlRFR0VSX05BTUUpKTsKLSAgICBqYXZhVHlwZXMucHV0KExPTkdfTkFNRSwgICBuZXcgUHJpbWl0aXZlSmF2YVR5cGVzKExPTkdfTkFNRSkpOwotICAgIGphdmFUeXBlcy5wdXQoU0hPUlRfTkFNRSwgIG5ldyBQcmltaXRpdmVKYXZhVHlwZXMoU0hPUlRfTkFNRSkpOwotICAgIGphdmFUeXBlcy5wdXQoQ0hBUkFDVEVSX05BTUUsICBuZXcgUHJpbWl0aXZlSmF2YVR5cGVzKENIQVJBQ1RFUl9OQU1FKSk7Ci0gIH0KLQotCi0gIC8qCi0gICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdXMgdG8gaGFuZGxlIHJlY29nbml6ZWQgYmVhbnMgCi0gICogaW4gZGlzcGxheWluZyBhbmQgZ2VuZXJhdGluZyBjb2RlIGZvciB0aGVtIGluc3RlYWQgb2YgCi0gICogdHJlYXRpbmcgdGhlbSBhcyBjb21wbGV4IHR5cGVzCi0gICovIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVjb2duaXplZEJlYW4oU3RyaW5nIHR5cGUpCi0gIHsKLQotICAgIC8vICAgICAKLSAgICAvL2N1cnJlbnQgcmVjb2duaXplZCBiZWFucyAobW9zdGx5IGphdmEubGFuZykKLSAgICBpZiAodHlwZS5lcXVhbHMoQk9PTEVBTl9OQU1FKSAgICAgICAgICAgICB8fAotICAgICAgICB0eXBlLmVxdWFscyhCWVRFX05BTUUpICAgICAgICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoRE9VQkxFX05BTUUpICAgICAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKEZMT0FUX05BTUUpICAgICAgICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoSU5URUdFUl9OQU1FKSAgICAgICAgICAgICB8fAotICAgICAgICB0eXBlLmVxdWFscyhMT05HX05BTUUpICAgICAgICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoU0hPUlRfTkFNRSkgICAgICAgICAgICAgIHx8ICAgICAgCi0gICAgICAgIHR5cGUuZXF1YWxzKENIQVJBQ1RFUl9OQU1FKSAgICAgICAgICB8fCAgICAgIAotICAgICAgICB0eXBlLmVxdWFscyhET01fRUxFTUVOVF9OQU1FKSAgICAgICAgfHwgICAgICAKLQkgICAgdHlwZS5lcXVhbHMoU09BUF9FTEVNRU5UX05BTUUpICAgICAgICB8fAotICAgICAgICB0eXBlLmVxdWFscyhCSUdfREVDSU1BTF9OQU1FKSAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKEJJR19JTlRFR0VSX05BTUUpICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoREFURV9OQU1FKSAgICAgICAgICAgICAgICB8fAotICAgICAgICB0eXBlLmVxdWFscyhHUkVHT1JJQU5fQ0FMRU5EQVJfTkFNRSkgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoQ0FMRU5EQVJfTkFNRSkgICAgICAgICAgIHx8IAotICAgICAgICB0eXBlLmVxdWFscyhVUkxfTkFNRSkgICAgICAgICAgICAgICAgIHx8ICAgIAotICAgICAgICB0eXBlLmVxdWFscyhTVFJJTkdfTkFNRSkpICByZXR1cm4gdHJ1ZTsgICAgICAKLSAgICAgcmV0dXJuIGZhbHNlOyAKLSAgCi0gIH0KLQotICAvKgotICAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHVzIHRvIGhhbmRsZSB1bnN1cHBvcnRlZCB0eXBlcyAKLSAgKiBpZiB3ZSBkb250IHdhbnQgdG8gc3VwcG9ydCBhIHR5cGUgYW5kIHdlIHdhbnQgdG8gb21pdHQgdGhpcyAgCi0gICogbWV0aG9kIGZyb20gdGhlIHNhbXBsZXMKLSAgKiBAcGFyYW0gamF2YUhlbHBlcnMgdGhpcyBpcyB0aGUgdHlwZSB0byBiZSBldmFsdWF0ZWQKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkCi0gICovIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVblN1cHBvcnRlZFR5cGUoSmF2YUhlbHBlcnMgamF2YUhlbHBlcnMpCi0gIHsKLSAgICAvL3dlIGFsc28gZG9udCBzdXBwb3J0IGFycmF5cwotICAgIGlmIChqYXZhSGVscGVycy5pc0FycmF5KCl8fAotICAgIAkJamF2YUhlbHBlcnMuZ2V0SmF2YU5hbWUoKS5lcXVhbHMoTUFQX05BTUUpfHwKLSAgICAJCWphdmFIZWxwZXJzLmdldEphdmFOYW1lKCkuZXF1YWxzKFZFQ1RPUl9OQU1FKXx8Ci0gICAgCQlqYXZhSGVscGVycy5nZXRKYXZhTmFtZSgpLmVxdWFscygiamF2YS5sYW5nLmNsYXNzIikJKSByZXR1cm4gdHJ1ZTsKLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBIQVNIVEFCTEVfTkFNRSA9ICJqYXZhLnV0aWwuSGFzaHRhYmxlIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQX05BTUUgPSAiamF2YS51dGlsLk1hcCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFZFQ1RPUl9OQU1FID0gImphdmEudXRpbC5WZWN0b3IiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBBUlJBWV9OQU1FID0gQXJyYXlFbGVtZW50LkFSUkFZX05BTUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSSU1JVElWRV9BUlJBWV9OQU1FID0gInByaW1pdGl2ZWFycmF5IjsKLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWNvZ25pemVkUmV0dXJuVHlwZShKYXZhSGVscGVycyBqYXZhSGVscGVycykKLSAgewotICAgIC8vYXJyYXlzIAotICAgIC8vSGFzaHRhYmxlCi0gICAgLy9WZWN0b3JzCi0gICAgaWYgKGphdmFIZWxwZXJzLmlzQXJyYXkoKSkgcmV0dXJuIHRydWU7Ci0gICAgZWxzZSBpZiAoamF2YUhlbHBlcnMuZ2V0SmF2YU5hbWUoKS5lcXVhbHMoSEFTSFRBQkxFX05BTUUpKXJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKGphdmFIZWxwZXJzLmdldEphdmFOYW1lKCkuZXF1YWxzKFZFQ1RPUl9OQU1FKSlyZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIGlmIChqYXZhSGVscGVycy5nZXRKYXZhTmFtZSgpLmVxdWFscyhNQVBfTkFNRSkpcmV0dXJuIHRydWU7Ci0gICAgZWxzZSByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWNvZ25pemVkUmV0dXJuVHlwZShTdHJpbmcgdHlwZSkKLSAgewotICAgIC8vYXJyYXlzIAotICAgIC8vSGFzaHRhYmxlCi0gICAgLy9WZWN0b3JzCi0gICAgaWYgKHR5cGUuc3RhcnRzV2l0aChBUlJBWV9OQU1FKSkgcmV0dXJuIHRydWU7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoSEFTSFRBQkxFX05BTUUpKXJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFZFQ1RPUl9OQU1FKSlyZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhNQVBfTkFNRSkpcmV0dXJuIHRydWU7Ci0gICAgZWxzZSByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGF0ZUxlc3NCZWFuKFN0cmluZyB0eXBlKQotICB7Ci0gICAgaWYodHlwZS5zdGFydHNXaXRoKFNUQVRFTEVTU19CRUFOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQotICAvKioKLSAgKiBDcmVhdGVzIGEgdHlwZSBiYXNlZCBvbiB0aGUgSmF2YUhlbHBlciB0aGVuIHNldHMgdGhpcyB0eXBlIGluIHRoZSBlbGVtZW50Ci0gICogQHBhcmFtcyBKYXZhSGVscGVycyB0aGlzIGhvbGRzIHRoZSB0eXBlCi0gICogQHBhcmFtIFR5cGVFbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIHdpbGwgaG9sZCB0aGUgdHlwZSBjcmVhdGVkCi0gICogQHBhcmFtIFN0cmluZyBVbmlxdWVuYW1lIHRvIGJlIHVzZWQgd2hlbiBuYW1pbmcgdGVtcCB2YXJpYWJsZXMKLSAgKi8KLSAKLSAgcHVibGljIHN0YXRpYyBEYXRhVHlwZSBjcmVhdGVUeXBlKFN0cmluZyB0eXBlLCBTdHJpbmcgVW5pcXVlTmFtZSkKLSAgewotICAgIC8vdGhpcyBndXkgbWlnaHQgYmUgYm90aCBzdGF0ZWxlc3MgYW5kIG9uZSBvZiB0aGUgYmVsb3cgZWxlbWVudHMKLSAgICAvL3dlIHdvdWxkIGxpa2UgdG8gYmUgYXMgc3BlY2lmaWMgYXMgd2UgY2FuLCBzdGF0ZWxlc3MgaXMgdGhlIHdvcnN0IGNhc2UgCi0gICAgYm9vbGVhbiBzdGF0ZWxlc3MgPSBmYWxzZTsgIAotICAgIGlmKHR5cGUuc3RhcnRzV2l0aChTVEFURUxFU1NfQkVBTikpIHsKLSAgICAgIHN0YXRlbGVzcyA9IHRydWU7Ci0gICAgICB0eXBlID0gdHlwZS5zdWJzdHJpbmcoMjkpOyAKLSAgICB9Ci0gICAKLSAgICBEYXRhVHlwZSBkYXRhdHlwZSA9IG51bGw7Ci0gICAgaWYgICAgICAodHlwZS5lcXVhbHMoUFJJTV9CT09MRUFOX05BTUUpKSBkYXRhdHlwZSA9IG5ldyBQcmltaXRpdmVCb29sZWFuVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFBSSU1fQllURV9OQU1FKSkgICAgIGRhdGF0eXBlID0gbmV3IFByaW1pdGl2ZUJ5dGVUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoUFJJTV9ET1VCTEVfTkFNRSkpICBkYXRhdHlwZSA9IG5ldyBQcmltaXRpdmVEb3VibGVUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoUFJJTV9GTE9BVF9OQU1FKSkgICBkYXRhdHlwZSA9IG5ldyBQcmltaXRpdmVGbG9hdFR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhQUklNX0xPTkdfTkFNRSkpICAgIGRhdGF0eXBlID0gbmV3IFByaW1pdGl2ZUxvbmdUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoUFJJTV9JTlRFR0VSX05BTUUpKSBkYXRhdHlwZSA9IG5ldyBQcmltaXRpdmVJbnRUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoUFJJTV9DSEFSX05BTUUpKSAgICBkYXRhdHlwZSA9IG5ldyBQcmltaXRpdmVDaGFyVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFBSSU1fU0hPUlRfTkFNRSkpICAgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlU2hvcnRUeXBlKCk7Ci0gICAgCi0KLSAgICAvL3NlZSBpZiB0aGlzIGNyaXR0ZXIgaXMgYSBqYXZhdHlwZQotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKEJPT0xFQU5fTkFNRSkgICAgIHx8Ci0gICAgICAgICAgICB0eXBlLmVxdWFscyhCWVRFX05BTUUpICAgICAgICB8fAotICAgICAgICAgICAgdHlwZS5lcXVhbHMoRE9VQkxFX05BTUUpICAgICAgfHwKLSAgICAgICAgICAgIHR5cGUuZXF1YWxzKEZMT0FUX05BTUUpICAgICAgIHx8Ci0gICAgICAgICAgICB0eXBlLmVxdWFscyhJTlRFR0VSX05BTUUpICAgICB8fAotICAgICAgICAgICAgdHlwZS5lcXVhbHMoTE9OR19OQU1FKSAgICAgICAgfHwKLSAgICAgICAgICAgIHR5cGUuZXF1YWxzKENIQVJBQ1RFUl9OQU1FKSAgfHwKLSAgICAgICAgICAgIHR5cGUuZXF1YWxzKFNIT1JUX05BTUUpKSAgICAgICAgZGF0YXR5cGUgPSAoRGF0YVR5cGUpamF2YVR5cGVzLmdldCh0eXBlKTsgICAKLQotICAgIC8vc2VlIGlmIGl0cyBhIGNhc2Ugd2UgaGFuZGxlCi0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoU1RSSU5HX05BTUUpKSAgICAgICAgICAgICAgIGRhdGF0eXBlID0gbmV3IFN0cmluZ1R5cGUoKTsgCi0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoVk9JRF9OQU1FKSkgICAgICAgICAgICAgICAgIGRhdGF0eXBlID0gbmV3IFZvaWRUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoRE9NX0VMRU1FTlRfTkFNRSkpICAgICAgICAgIGRhdGF0eXBlID0gbmV3IERvbUVsZW1lbnRUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoU09BUF9FTEVNRU5UX05BTUUpKSAgICAgICAgIGRhdGF0eXBlID0gbmV3IFNPQVBFbGVtZW50VHlwZSgpOyAgCi0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoQklHX0RFQ0lNQUxfTkFNRSkpICAgICAgICAgIGRhdGF0eXBlID0gbmV3IEJpZ0RlY2ltYWxUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoQklHX0lOVEVHRVJfTkFNRSkpICAgICAgICAgIGRhdGF0eXBlID0gbmV3IEJpZ0ludGVnZXJUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoREFURV9OQU1FKSkgICAgICAgICAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBEYXRlVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFVSTF9OQU1FKSkgICAgICAgICAgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgVVJMVHlwZSgpOyAKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhHUkVHT1JJQU5fQ0FMRU5EQVJfTkFNRSkpICBkYXRhdHlwZSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhclR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhDQUxFTkRBUl9OQU1FKSkgIGRhdGF0eXBlID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyVHlwZSgpOwotCi0gICAgLy9pdCBjb3VsZCBiZSBhIHJldHVybiB0eXBlIHdlIHN1cHBvcnQKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhIQVNIVEFCTEVfTkFNRSkpICAgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgSGFzaHRhYmxlVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFZFQ1RPUl9OQU1FKSkgICAgICAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBWZWN0b3JUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoTUFQX05BTUUpKSAgICAgICAgICAgICAgICAgIGRhdGF0eXBlID0gbmV3IE1hcFR5cGUoKTsKLQotICAgIC8vIG5lZWQgdG8gc2VlIGlmIGl0IGlzIGFuIG9iamVjdCBhcnJheQotICAgIC8vb3IgYSBwcmltaXRpdmUKLSAgICBlbHNlIGlmICh0eXBlLnN0YXJ0c1dpdGgoQVJSQVlfTkFNRSkpeyAgICAgICAgICAgICAgCi0gICAgCVN0cmluZyBuYW1lID0gdHlwZS5zdWJzdHJpbmcoMjEpOyAKLSAgICAgICAgaWYobmFtZS5zdGFydHNXaXRoKFBSSU1fQk9PTEVBTl9OQU1FKSB8fAotICAgICAgICAgIG5hbWUuc3RhcnRzV2l0aChQUklNX0JZVEVfTkFNRSkgICAgIHx8Ci0gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFBSSU1fRE9VQkxFX05BTUUpICB8fAotICAgICAgICAgIG5hbWUuc3RhcnRzV2l0aChQUklNX0ZMT0FUX05BTUUpICAgIHx8Ci0gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFBSSU1fTE9OR19OQU1FKSAgICB8fAotICAgICAgICAgIG5hbWUuc3RhcnRzV2l0aChQUklNX0lOVEVHRVJfTkFNRSkgIHx8Ci0gICAgICAgICAgbmFtZS5zdGFydHNXaXRoKFBSSU1fQ0hBUl9OQU1FKSAgICB8fAotICAgICAgICAgIG5hbWUuc3RhcnRzV2l0aChQUklNX1NIT1JUX05BTUUpKQotICAgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlQXJyYXlUeXBlKG5hbWUpOyAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgCWRhdGF0eXBlID0gbmV3IEFycmF5VHlwZShuYW1lKTsKLQotICAgIH0KLSAgICBlbHNlIGlmIChzdGF0ZWxlc3MpewotICAgICAgICBkYXRhdHlwZSA9IG5ldyBTdGF0ZUxlc3NCZWFuVHlwZSh0eXBlKTsKLQotICAgIH0KLQotCi0gICAgZGF0YXR5cGUuc2V0VW5pcXVlTmFtZShVbmlxdWVOYW1lKTsKLSAgICByZXR1cm4gZGF0YXR5cGU7Ci0gICAgIAotICB9Ci0gIAotICAKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVVJMVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1VSTFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwZmIyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVVJMVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFVSTFR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFVSTFR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuVVJMX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gIm5ldyBqYXZhLm5ldC5VUkwoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOyAgICAKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gbmFtZSArICIudG9TdHJpbmcoKSI7Ci0gIH0KLSAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9WZWN0b3JUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVmVjdG9yVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTA3MThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9WZWN0b3JUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSByZWNvZ25pemVkIHJldHVybiB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3JUeXBlIGV4dGVuZHMgUmVjb2duaXplZFJldHVyblR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBWZWN0b3JUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlZFQ1RPUl9OQU1FKTsKLSAgfQotCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVm9pZFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9Wb2lkVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmRlOTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9Wb2lkVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgVm9pZFR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgVm9pZFR5cGUoKQotICB7Ci0gICAgc3VwZXIoInZvaWQiKTsKLSAgfQotCi0gICAvKioKLSAgKiBmb3IgYSB2b2lkIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIAotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlIC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIlN0cmluZy52YWx1ZU9mKCIgKyBuYW1lICsgIikiOwotICB9Ci0gCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3ZhbGlkYXRlL1ZhbGlkYXRpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC92YWxpZGF0ZS9WYWxpZGF0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmE5NzY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3ZhbGlkYXRlL1ZhbGlkYXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLQotLyoqCi0gICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG9mIHByb2plY3RzIHRoYXQgc29tZSB0YXNrcyBtYXkgd2FudAotICAqIHRvIGRpc2FibGUuICBUaGUgbWFuYWdlciBjYW4gdGhlbiBiZSB1c2VkIHRvIHJlc3RvcmUgdGhlIHZhbGlkYXRpb24gc3RhdGUuCi0qKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTWFuYWdlcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAgICogVGhpcyBzZXQgY29udGFpbnMgYSBzZXQgb2YgSVByb2plY3RzIHRoYXQgbmVlZCB0byBiZSB2YWxpZGF0ZWQuCi0gICoqLwotICBwcml2YXRlIEhhc2hTZXQgcHJvamVjdHMgPSBudWxsOyAgICAgICAgICAgICAgCi0KLSAgLyoqCi0gICAgKiBUaGlzIG9iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgajJlZSB2YWxpZGF0b3IuCi0gICoqLwotICAvL3BnbSBwcml2YXRlIFZhbGlkYXRvck1hbmFnZXIgajJlZU1hbmFnZXIgPSBudWxsOwotCi0gIC8qKgotICAgICogVGhpcyBib29sZWFuIGNvbnRhaW5zIHRoZSBhdXRvIGJ1aWxkIHNldHRpbmcgdW5kZXIgcHJlZmVycmVuY2UKLSAgKiovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0F1dG9CdWlsZF87Ci0gIHByaXZhdGUgYm9vbGVhbiBhdXRvQnVpbGREaXNhYmxlZF87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIFZhbGlkYXRpb25NYW5hZ2VyKCkKLSAgewotICAgIHByb2plY3RzICAgID0gbmV3IEhhc2hTZXQoKTsKLSAgICAvL3BnbSBqMmVlTWFuYWdlciA9IFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpOwotICAgIHNldEF1dG9CdWlsZFByZWZlcmVuY2UoKTsKLSAgICBhdXRvQnVpbGREaXNhYmxlZF8gPSBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAgKiBEaXNhYmxlcyB0aGUgdmFsaWRhdGlvbiBmb3IgYSBwcm9qZWN0IGlmIHJlcXVpcmVkLgotICAqKi8KLSAgcHVibGljIHZvaWQgZGlzYWJsZVZhbGlkYXRpb25Gb3JQcm9qZWN0KCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgeyAgICAKLSAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBwcm9qZWN0IG5lZWRzIGhhdmUgdmFsaWRhdGlvbiB0dXJuZWQgYmFjayBvbi4KLSAgICBwcm9qZWN0cy5hZGQoIHByb2plY3QgKTsKLSAgICAKLSAgICAvL3BnbSBqMmVlTWFuYWdlci5zdXNwZW5kQWxsVmFsaWRhdGlvbiggdHJ1ZSApOwotICB9Ci0KLSAgLyoqCi0gICAgKiBSZXN0b3JlcyB0aGUgdmFsaWRhdGlvbiBzdGF0ZSBmb3IgYWxsIG5lZWRlZCBwcm9qZWN0cy4KLSAgKiovCi0gIHB1YmxpYyB2b2lkIHJlc3RvcmVWYWxpZGF0aW9uRm9yUHJvamVjdHMoIGJvb2xlYW4gcnVuVmFsaWRhdGlvbiApCi0gIHsKLSAgICAvL3BnbSBqMmVlTWFuYWdlci5zdXNwZW5kQWxsVmFsaWRhdGlvbiggZmFsc2UgKTsKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHByb2plY3RzLml0ZXJhdG9yKCk7Ci0KLSAgICB3aGlsZSggaXRlcmF0b3IuaGFzTmV4dCgpICkKLSAgICB7Ci0gICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KShpdGVyYXRvci5uZXh0KCkpOwotCi0gICAgICAvLyBOb3cga2ljayBvZmYgdmFsaWRhdGlvbiBmb3IgdGhpcyBwcm9qZWN0IGlmIHRoaXMgd2FzIHJlcXVlc3RlZC4KLSAgICAgIGlmKCBydW5WYWxpZGF0aW9uICkKLSAgICAgIHsKLQkgICAgLy9wZ20gRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gdmFsaWRPcCA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiggcHJvamVjdCwgbnVsbCApOwotCSAgICAvL3BnbSB2YWxpZE9wLnJ1biggbW9uaXRvciApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeUF1dG9CdWlsZChib29sZWFuIGlzQXV0b0J1aWxkKSB7Ci0gICAgdHJ5IHsKLSAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgSVdvcmtzcGFjZURlc2NyaXB0aW9uIHdvcmtzcGFjZURlc2MgPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgIHdvcmtzcGFjZURlc2Muc2V0QXV0b0J1aWxkaW5nKGlzQXV0b0J1aWxkKTsKLSAgICAgIHdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbih3b3Jrc3BhY2VEZXNjKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzYWJsZUF1dG9CdWlsZCgpIHsKLSAgICBpZiAoIWF1dG9CdWlsZERpc2FibGVkXykgewotICAgICAgc2V0QXV0b0J1aWxkUHJlZmVyZW5jZSgpOwotICAgICAgbW9kaWZ5QXV0b0J1aWxkKGZhbHNlKTsKLSAgICAgIGF1dG9CdWlsZERpc2FibGVkXyA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzdG9yZUF1dG9CdWlsZCgpIHsKLSAgICBpZiAoYXV0b0J1aWxkRGlzYWJsZWRfKSB7Ci0gICAgICBtb2RpZnlBdXRvQnVpbGQoZ2V0QXV0b0J1aWxkUHJlZmVyZW5jZSgpKTsKLSAgICAgIGF1dG9CdWlsZERpc2FibGVkXyA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNldEF1dG9CdWlsZFByZWZlcmVuY2UoKSB7Ci0gICAgaXNBdXRvQnVpbGRfID0gZ2V0V29ya3NwYWNlQXV0b0J1aWxkUHJlZmVyZW5jZSgpOwotICAgIHJldHVybiBpc0F1dG9CdWlsZF87Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRBdXRvQnVpbGRQcmVmZXJlbmNlKCkgewotICAgIHJldHVybiBpc0F1dG9CdWlsZF87Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRXb3Jrc3BhY2VBdXRvQnVpbGRQcmVmZXJlbmNlKCkgewotICAgIElXb3Jrc3BhY2VEZXNjcmlwdGlvbiB3b3Jrc3BhY2VEZXNjID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgcmV0dXJuIHdvcmtzcGFjZURlc2MuaXNBdXRvQnVpbGRpbmcoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvQmluZGluZ0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9CaW5kaW5nRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODRmYjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9CaW5kaW5nRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwud3NkbG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIEJpbmRpbmdFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfUE9SVCA9ICJwb3J0IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX09QRVJBVElPTlMgPSAib3BlcmF0aW9ucyI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9QT1JUX1RZUEUgPSAicG9ydHR5cGUiOwotICAKLSAgcHVibGljIEJpbmRpbmdFbGVtZW50IChQb3J0RWxlbWVudCBwb3J0RWxlbWVudCxTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUscG9ydEVsZW1lbnQsUkVMX1BPUlQsUG9ydEVsZW1lbnQuUkVMX0JJTkRJTkcpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFBvcnQoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9QT1JUKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQb3J0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX1BPUlRfVFlQRSk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0T3BlcmF0aW9ucygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX09QRVJBVElPTlMpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZk9wZXJhdGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE51bWJlck9mRWxlbWVudHMoUkVMX09QRVJBVElPTlMpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9EZWZpbml0aW9uRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL0RlZmluaXRpb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODE1NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL0RlZmluaXRpb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgRGVmaW5pdGlvbkVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9TRVJWSUNFUyA9ICJzZXJ2aWNlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9XU0RMID0gIndzZGwiOwotICAKLSAgcHVibGljIERlZmluaXRpb25FbGVtZW50IChXU0RMRWxlbWVudCB3c2RsRWxlbWVudCxTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsd3NkbEVsZW1lbnQsUkVMX1dTREwsV1NETEVsZW1lbnQuUkVMX0RFRklOSVRJT05TKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRXU0RMKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfV1NETCk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0U2VydmljZXMoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9TRVJWSUNFUyk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE51bWJlck9mU2VydmljZXMoKQotICB7Ci0gICAgcmV0dXJuIGdldE51bWJlck9mRWxlbWVudHMoUkVMX1NFUlZJQ0VTKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvTWVzc2FnZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9NZXNzYWdlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDZiYjEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9NZXNzYWdlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwud3NkbG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIE1lc3NhZ2VFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfT1BFUkFUSU9OID0gIm9wZXJhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9QQVJUUyA9ICJwYXJ0cyI7Ci0gIAotICBwdWJsaWMgTWVzc2FnZUVsZW1lbnQgKE9wZXJhdGlvbkVsZW1lbnQgb3BlcmF0aW9uRWxlbWVudCxTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsb3BlcmF0aW9uRWxlbWVudCxSRUxfT1BFUkFUSU9OLE9wZXJhdGlvbkVsZW1lbnQuUkVMX01FU1NBR0VTKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRPcGVyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9PUEVSQVRJT04pOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFBhcnRzKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfUEFSVFMpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZlBhcnRzKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9QQVJUUyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL09wZXJhdGlvbkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9PcGVyYXRpb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MGFmNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL09wZXJhdGlvbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25FbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfQklORElORyA9ICJiaW5kaW5nIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX01FU1NBR0VTID0gIm1lc3NhZ2VzIjsKLQotICBwdWJsaWMgT3BlcmF0aW9uRWxlbWVudCAoQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGJpbmRpbmdFbGVtZW50LFJFTF9CSU5ESU5HLEJpbmRpbmdFbGVtZW50LlJFTF9PUEVSQVRJT05TKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfQklORElORyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9NRVNTQUdFUyk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE51bWJlck9mTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIGdldE51bWJlck9mRWxlbWVudHMoUkVMX01FU1NBR0VTKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUGFydEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9QYXJ0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRmNjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9QYXJ0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwud3NkbG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFBhcnRFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfTUVTU0FHRSA9ICJtZXNzYWdlIjsKLSAgICAKLSAgcHVibGljIFBhcnRFbGVtZW50IChNZXNzYWdlRWxlbWVudCBtZXNzYWdlRWxlbWVudCxTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsbWVzc2FnZUVsZW1lbnQsUkVMX01FU1NBR0UsTWVzc2FnZUVsZW1lbnQuUkVMX1BBUlRTKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfTUVTU0FHRSk7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BvcnRFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUG9ydEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhODBlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUG9ydEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBQb3J0RWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX0JJTkRJTkcgPSAiYmluZGluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9TRVJWSUNFID0gInNlcnZpY2UiOwotICAKLSAgcHVibGljIFBvcnRFbGVtZW50IChTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCxTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsc2VydmljZUVsZW1lbnQsUkVMX1NFUlZJQ0UsU2VydmljZUVsZW1lbnQuUkVMX1BPUlRTKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfU0VSVklDRSk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QmluZGluZygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX0JJTkRJTkcpOwotICB9Ci0gCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9Qb3J0VHlwZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9Qb3J0VHlwZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhY2NlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUG9ydFR5cGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgUG9ydFR5cGVFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfQklORElORyA9ICJiaW5kaW5nIjsKLSAgCi0gIHB1YmxpYyBQb3J0VHlwZUVsZW1lbnQgKEJpbmRpbmdFbGVtZW50IGJpbmRpbmdFbGVtZW50LFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxiaW5kaW5nRWxlbWVudCxSRUxfQklORElORyxCaW5kaW5nRWxlbWVudC5SRUxfUE9SVF9UWVBFKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfQklORElORyk7Ci0gIH0KLQotIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvU2VydmljZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9TZXJ2aWNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2U4NjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9TZXJ2aWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwud3NkbG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2VFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfUE9SVFMgPSAicG9ydHMiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfREVGSU5JVElPTiA9ICJkZWZpbml0aW9uIjsKLSAgCi0gIHB1YmxpYyBTZXJ2aWNlRWxlbWVudCAoRGVmaW5pdGlvbkVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGRlZmluaXRpb25FbGVtZW50LFJFTF9ERUZJTklUSU9OLERlZmluaXRpb25FbGVtZW50LlJFTF9TRVJWSUNFUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX0RFRklOSVRJT04pOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFBvcnRzKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfUE9SVFMpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZlBvcnRzKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9QT1JUUyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1N0dWJiZWRXU0RMTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9TdHViYmVkV1NETE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NWUyMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1N0dWJiZWRXU0RMTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBTdHViYmVkV1NETE1vZGVsCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwcm90ZWN0ZWQgTW9kZWwgZk1vZGVsOwotICBwdWJsaWMgU3R1YmJlZFdTRExNb2RlbCgpCi0gIHsKLSAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IG5ldyBXU0RMRWxlbWVudCgiV1NETEZpbGVzIik7Ci0gICAgZk1vZGVsID0gd3NkbEVsZW1lbnQuZ2V0TW9kZWwoKTsgICAKLSAgfQotCi0gIHB1YmxpYyBNb2RlbCBnZXRXU0RMTW9kZWwoKQotICB7Ci0gICAgcmV0dXJuIGZNb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGJ1aWxkTW9kZWwoKQotICB7Ci0gICAgRGVmaW5pdGlvbkVsZW1lbnQgZGVmMSA9IG5ldyBEZWZpbml0aW9uRWxlbWVudCgoV1NETEVsZW1lbnQpZk1vZGVsLmdldFJvb3RFbGVtZW50KCksIlN0b2NrUXVvdGUiKTsgCi0gICAgU2VydmljZUVsZW1lbnQgc2VyMSA9IG5ldyBTZXJ2aWNlRWxlbWVudChkZWYxLCJnZXRRdW90ZSIpOwotICAgIFNlcnZpY2VFbGVtZW50IHNlcjIgPSBuZXcgU2VydmljZUVsZW1lbnQoZGVmMSwic2V0UXVvdGUiKTsKLSAgICBQb3J0RWxlbWVudCBwb3J0MSA9IG5ldyBQb3J0RWxlbWVudChzZXIxLCJwb3J0MSIpOwotICAgIFBvcnRFbGVtZW50IHBvcnQyID0gbmV3IFBvcnRFbGVtZW50KHNlcjEsInBvcnQyIik7Ci0gICAgUG9ydEVsZW1lbnQgcG9ydDMgPSBuZXcgUG9ydEVsZW1lbnQoc2VyMiwicG9ydDEiKTsKLSAgICBQb3J0RWxlbWVudCBwb3J0NCA9IG5ldyBQb3J0RWxlbWVudChzZXIyLCJwb3J0MiIpOwotICAgIEJpbmRpbmdFbGVtZW50IGJpbmQxID0gbmV3IEJpbmRpbmdFbGVtZW50KHBvcnQxLCJiaW5kMSIpOwotICAgIEJpbmRpbmdFbGVtZW50IGJpbmQyID0gbmV3IEJpbmRpbmdFbGVtZW50KHBvcnQyLCJiaW5kMSIpOwotICAgIEJpbmRpbmdFbGVtZW50IGJpbmQzID0gbmV3IEJpbmRpbmdFbGVtZW50KHBvcnQzLCJiaW5kMSIpOwotICAgIEJpbmRpbmdFbGVtZW50IGJpbmQ0ID0gbmV3IEJpbmRpbmdFbGVtZW50KHBvcnQ0LCJiaW5kMSIpOwotICAgIE9wZXJhdGlvbkVsZW1lbnQgb3AxID0gbmV3IE9wZXJhdGlvbkVsZW1lbnQoYmluZDEsIm9wMSIpOwotICAgIE9wZXJhdGlvbkVsZW1lbnQgb3AyID0gbmV3IE9wZXJhdGlvbkVsZW1lbnQoYmluZDIsIm9wMSIpOwotICAgIE9wZXJhdGlvbkVsZW1lbnQgb3AzID0gbmV3IE9wZXJhdGlvbkVsZW1lbnQoYmluZDMsIm9wMSIpOwotICAgIE9wZXJhdGlvbkVsZW1lbnQgb3A0ID0gbmV3IE9wZXJhdGlvbkVsZW1lbnQoYmluZDQsIm9wMSIpOwotICAgIE1lc3NhZ2VFbGVtZW50IG1lMSA9IG5ldyBNZXNzYWdlRWxlbWVudChvcDEsIm1lMSIpOwotICAgIE1lc3NhZ2VFbGVtZW50IG1lMiA9IG5ldyBNZXNzYWdlRWxlbWVudChvcDEsIm1lMiIpOwotICAgIFBhcnRFbGVtZW50IHBlMSAgPSBuZXcgUGFydEVsZW1lbnQobWUxLCJwZTEiKTsKLSAgICBQYXJ0RWxlbWVudCBwZTIgID0gbmV3IFBhcnRFbGVtZW50KG1lMiwicGUyIik7Ci0KLSAgICBEZWZpbml0aW9uRWxlbWVudCBkZWYyID0gbmV3IERlZmluaXRpb25FbGVtZW50KChXU0RMRWxlbWVudClmTW9kZWwuZ2V0Um9vdEVsZW1lbnQoKSwiVGVtcENvbnZlcnNpb24iKTsgCi0gICAgU2VydmljZUVsZW1lbnQgc2VyMyA9IG5ldyBTZXJ2aWNlRWxlbWVudChkZWYyLCJnZXRUZW1wIik7Ci0gICAgU2VydmljZUVsZW1lbnQgc2VyNCA9IG5ldyBTZXJ2aWNlRWxlbWVudChkZWYyLCJzZXRUZW1wIik7Ci0gICAgUG9ydEVsZW1lbnQgcG9ydDUgPSBuZXcgUG9ydEVsZW1lbnQoc2VyMywicG9ydDEiKTsKLSAgICBQb3J0RWxlbWVudCBwb3J0NiA9IG5ldyBQb3J0RWxlbWVudChzZXI0LCJwb3J0MSIpOwotICAgIEJpbmRpbmdFbGVtZW50IGJpbmQ1ID0gbmV3IEJpbmRpbmdFbGVtZW50KHBvcnQ1LCJiaW5kMSIpOwotICAgIEJpbmRpbmdFbGVtZW50IGJpbmQ2ID0gbmV3IEJpbmRpbmdFbGVtZW50KHBvcnQ2LCJiaW5kMSIpOwotICAgIE9wZXJhdGlvbkVsZW1lbnQgb3A1ID0gbmV3IE9wZXJhdGlvbkVsZW1lbnQoYmluZDUsIm9wMSIpOwotICAgIE9wZXJhdGlvbkVsZW1lbnQgb3A2ID0gbmV3IE9wZXJhdGlvbkVsZW1lbnQoYmluZDYsIm9wMSIpOwotCi0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1dTRExFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvV1NETEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhYTc4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvV1NETEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX0RFRklOSVRJT05TID0gImRlZmluaXRpb25zIjsKLSAgCi0gIC8qCi0gICoKLSAgKiovCi0gIHB1YmxpYyBXU0RMRWxlbWVudCAoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzKG5hbWUsbmV3IEJhc2ljTW9kZWwoIldTRExNb2RlbCIpKTsKLSAgfQotCi0gIHB1YmxpYyBXU0RMRWxlbWVudCAoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsKQotICB7Ci0gICAgc3VwZXIobmFtZSxtb2RlbCk7Ci0gICAgbW9kZWwuc2V0Um9vdEVsZW1lbnQodGhpcyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RGVmaW5pdGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9ERUZJTklUSU9OUyk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE51bWJlck9mRGVmaW5pdGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE51bWJlck9mRWxlbWVudHMoUkVMX0RFRklOSVRJT05TKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVBc3NlbWJseUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVBc3NlbWJseUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNDc5YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlQXNzZW1ibHlGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIENsaWVudFByZUFzc2VtYmx5RnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVEZXBsb3lGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlRGVwbG95RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5ZWJmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVEZXBsb3lGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIENsaWVudFByZURlcGxveUZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlRGV2ZWxvcEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVEZXZlbG9wRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3NWRkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVEZXZlbG9wRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRQcmVEZXZlbG9wRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVJbnN0YWxsRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZUluc3RhbGxGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2U5NGEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZUluc3RhbGxGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIENsaWVudFByZUluc3RhbGxGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL1NlcnZpY2VQcmVBc3NlbWJseUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlQXNzZW1ibHlGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ1NmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL1NlcnZpY2VQcmVBc3NlbWJseUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVByZUFzc2VtYmx5RnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlRGVwbG95RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL1NlcnZpY2VQcmVEZXBsb3lGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmY0YTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL1NlcnZpY2VQcmVEZXBsb3lGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VQcmVEZXBsb3lGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL1NlcnZpY2VQcmVEZXZlbG9wRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL1NlcnZpY2VQcmVEZXZlbG9wRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyMzE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlRGV2ZWxvcEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVByZURldmVsb3BGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL1NlcnZpY2VQcmVJbnN0YWxsRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL1NlcnZpY2VQcmVJbnN0YWxsRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxNzkwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlSW5zdGFsbEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVByZUluc3RhbGxGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vcGx1Z2luL1dlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9wbHVnaW4vV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NGE3NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9wbHVnaW4vV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgcGx1Z2luLgotKiA8cD4KLSogVGhpcyBwbHVnaW4gY29udGFpbnMgdGhlIGJ1bGsgb2YgdGhlIFdlYiBTZXJ2aWNlcyBydW50aW1lLgotKiBPbmx5IHRoZSBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UgcG9ydGlvbiBvZiB0aGUgcnVudGltZSBpcwotKiBmb3VuZCBlbHNld2hlcmUgLSBpbiB0aGUgb3JnLmVjbGlwc2UuanN0LndzLnVpIHBsdWdpbi4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luIGV4dGVuZHMgUGx1Z2luCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgcGx1Z2luIGluIHBsdWdpbi54bWwuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0KLSAgLyoqCi0gICogVGhlIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotICAqLwotICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4gaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgTG9nIGxvZ187Ci0gCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBydW50aW1lIHBsdWdpbiBvYmplY3QgZm9yIHRoaXMgcGx1Z2luLgotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luICgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGluc3RhbmNlXyA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAqIChXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5qc3Qud3MiKTsKLSAgKiBAcmV0dXJuIFRoZSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4gc2luZ2xldG9uLgotICAqLwotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbiBnZXRJbnN0YW5jZSAoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gICAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiBwbHVnaW4ucHJvcGVydGllcy4KLSAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXkgKQotICB7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi5wbHVnaW4iLCBpbnN0YW5jZV8gKTsKLSAgICAKLSAgICBpZigga2V5LnN0YXJ0c1dpdGgoIiUiKSkKLSAgICB7Ci0gICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKCAxLCBrZXkubGVuZ3RoKCkgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG1zZ1V0aWxzLmdldE1lc3NhZ2Uoa2V5KTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gICogcGx1Z2luLnByb3BlcnRpZXMuIFN1YnN0aXR1dGlvbiBzZXF1ZW5jZXMgaW4gdGhlIG1lc3NhZ2Ugc3RyaW5nCi0gICogYXJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBhcnJheSBvZiBzdWJzdGl0dXRpb24gb2JqZWN0cyAod2hpY2gKLSAgKiBhcmUgbW9zdCBmcmVxdWVudGx5IHN0cmluZ3MpLiBTZWUgdGhlIEpESydzCi0gICoge0BsaW5rIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0fQotICAqIGNsYXNzIGZvciBmdXJ0aGVyIGRldGFpbHMgb24gc3Vic3RpdHV0aW9uLgotICAqIEByZXR1cm4gVGhlIFN0cmluZyBtZXNzYWdlLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncyApCi0gIHsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0TWVzc2FnZShrZXkpLGFyZ3MpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzZlNDVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQXR0cmlidXRlRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSW5wdXRGaWxlVHlwZUdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgZXh0ZW5kcyBJbnB1dEZpbGVUeXBlR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgcHJpdmF0ZSBib29sZWFuIGZTdGF0ZUxlc3M7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0gIHB1YmxpYyBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBjdXJyZW50TGV2ZWwsIGludCBsZXZlbHNEZWVwKQotICB7Ci0gICAgIHN1cGVyKGJ1ZmZlcixjdXJyZW50TGV2ZWwsbGV2ZWxzRGVlcCk7Ci0gIH0KLQotIAotICAvKgotICAqIFRha2VzIGluIGFuIG9iamVjdCB0byBiZSBhY3RlZCB1cG9uIGJ5IHRoaXMgdmlzaXRvciBhY3Rpb24KLSAgKiBAcGFyYW0gT2JqZWN0IFRoZSBvYmplY3QgdG8gYmUgYWN0ZWQgdXBvbgotICAqLwotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgIAotICAgICBBdHRyaWJ1dGVFbGVtZW50VHlwZSBhdHRyaWJ1dGVFbGVtZW50VHlwZSA9IChBdHRyaWJ1dGVFbGVtZW50VHlwZSlvYmplY3Q7Ci0gICAgIC8vaWYgaXQgaXMgYSBiZWFuIGlzIGl0IHN0YXRlbGVzcwotICAgICBhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRUeXBlRWxlbWVudCgpOyAKLSAgICAgICAgCi0gICAgIGlmKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFR5cGVFbGVtZW50KCkuaXNCZWFuKCkpewotICAgICAgIEJlYW5FbGVtZW50IGJlYW4gPSAoQmVhbkVsZW1lbnQpYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKTsKLSAgICAgICBmU3RhdGVMZXNzID0gYmVhbi5pc1N0YXRlTGVzcygpOwotICAgICB9CSAKLQotICAgICBUeXBlVmlzaXRvciB0eXBlVmlzaXRvciA9IG5ldyBUeXBlVmlzaXRvcigpOwotICAgICBJbnB1dEZpbGVUeXBlR2VuZXJhdG9yIGlucHV0RmlsZVR5cGVHZW5lcmF0b3IgPSBuZXcgSW5wdXRGaWxlVHlwZUdlbmVyYXRvcihmYnVmZmVyLGZDdXJyZW50TGV2ZWwsZkxldmVsc0RlZXApOwotICAgICBpZihhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRUeXBlRWxlbWVudCgpLmlzQmVhbigpICYmICFUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKSkgCi0gICAgIAkmJiAhKGdldFJldHVyblBhcmFtKCkgJiYgKFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5nZXRUeXBlTmFtZSgpKSB8fCBmU3RhdGVMZXNzKSkpCi0gICAgICAgICAgICAgICAgCi0gICAgIGFkZFBhcmVudEdldHRlcihhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRHZXR0ZXJNZXRob2QoKSxhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKSk7Ci0gICAgIGlucHV0RmlsZVR5cGVHZW5lcmF0b3IuYWRkUGFyZW50R2V0dGVyKHJldHVyblBhcmVudEdldHRlcigpLHJldHVyblBhcmVudEdldHRlclR5cGUoKSk7Ci0gICAgIGlucHV0RmlsZVR5cGVHZW5lcmF0b3Iuc2V0SW5zdGFuY2VOYW1lKGZJbnN0YW5jZU5hbWUpOwotICAgICBpbnB1dEZpbGVUeXBlR2VuZXJhdG9yLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOwotICAgICB0eXBlVmlzaXRvci5ydW4oYXR0cmlidXRlRWxlbWVudFR5cGUsaW5wdXRGaWxlVHlwZUdlbmVyYXRvcik7ICAgCi0gICAgIGZidWZmZXIgPSBpbnB1dEZpbGVUeXBlR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgICAKLSAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmOGZkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uTWV0aG9kVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgTWV0aG9kRmlsZWdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBJbnB1dEZpbGVHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwdWJsaWMgU3RyaW5nIGZSZXN1bHROYW1lOwotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIHVzZWQgZGlyZWN0bHkgCi0gICovCi0gIHB1YmxpYyBJbnB1dEZpbGVHZW5lcmF0b3IgKFN0cmluZyByZXN1bHQpCi0gIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICBmUmVzdWx0TmFtZSA9IHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIGNhbGxlZCBmcm9tIHN1YmNsYXNzZXMKLSAgKi8KLSAgcHVibGljIElucHV0RmlsZUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHJlc3VsdCkKLSAgewotICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgICAgIGZSZXN1bHROYW1lID0gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogY2FsbGVkIGZyb20gc3ViY2xhc3NlcwotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZXMoU3RyaW5nIHJlc3VsdHMpCi0gIHsKLSAgICBmUmVzdWx0TmFtZSA9IHJlc3VsdHM7Ci0gIH0KLQotICAvL3Rha2VzIGluIGEgYmVhbiBub2RlCi0gICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICAgewotICAgICAgRWxlbWVudCBiZWFuRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8JUBwYWdlIGNvbnRlbnRUeXBlPVwidGV4dC9odG1sO2NoYXJzZXQ9VVRGLThcIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxIVE1MPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SEVBRD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPFRJVExFPklucHV0czwvVElUTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvSEVBRD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEJPRFk+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxIMT5JbnB1dHM8L0gxPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIlN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihcIm1ldGhvZFwiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaW50IG1ldGhvZElEID0gMDsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaWYgKG1ldGhvZCA9PSBudWxsKSBtZXRob2RJRCA9IC0xOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJib29sZWFuIHZhbGlkID0gdHJ1ZTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiaWYobWV0aG9kSUQgIT0gLTEpIG1ldGhvZElEID0gSW50ZWdlci5wYXJzZUludChtZXRob2QpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgCi0gICAgICBmYnVmZmVyLmFwcGVuZCgic3dpdGNoIChtZXRob2RJRCl7ICIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIAkKLSAgICAgIC8vIGdvIHRvIHRoZSBuZXh0IGdlbmVyYXRvcgotICAgICAgTWV0aG9kVmlzaXRvciBtZXRob2RWaXNpdG9yID0gbmV3IE1ldGhvZFZpc2l0b3IoKTsKLSAgICAgIElucHV0RmlsZUhlbHAxR2VuZXJhdG9yIGlucHV0RmlsZUhlbHAxR2VuZXJhdG9yID0gbmV3IElucHV0RmlsZUhlbHAxR2VuZXJhdG9yKGZidWZmZXIsZlJlc3VsdE5hbWUpOyAKLSAgICAgIG1ldGhvZFZpc2l0b3IucnVuKGJlYW5FbGVtZW50LGlucHV0RmlsZUhlbHAxR2VuZXJhdG9yKTsKLSAgICAgIGZidWZmZXIgPSBpbnB1dEZpbGVIZWxwMUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgZmJ1ZmZlci5hcHBlbmQoImNhc2UgMTExMTExMTExMToiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgidmFsaWQgPSBmYWxzZTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEZPUk0gTUVUSE9EPVwiUE9TVFwiIEFDVElPTj1cIiIgKyBmUmVzdWx0TmFtZSArICJcIiBUQVJHRVQ9XCJyZXN1bHRcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJISURERU5cIiBOQU1FPVwibWV0aG9kXCIgVkFMVUU9XCI8JT1tZXRob2QlPlwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEFCTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxUUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPFREIENPTFNQQU49XCIxXCIgQUxJR049XCJMRUZUXCI+VVJMU3RyaW5nOjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxURCBBTElHTj1cImxlZnRcIj48SU5QVVQgVFlQRT1cIlRFWFRcIiBOQU1FPVwidXJsMTExMTExMTExMVwiIFNJWkU9MjA+PC9URD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9UUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9UQUJMRT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEJSPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SU5QVVQgVFlQRT1cIlNVQk1JVFwiIFZBTFVFPVwiSW52b2tlXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxJTlBVVCBUWVBFPVwiUkVTRVRcIiBWQUxVRT1cIkNsZWFyXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvRk9STT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiYnJlYWs7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoImNhc2UgMTExMTExMTExMjoiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgidmFsaWQgPSBmYWxzZTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEZPUk0gTUVUSE9EPVwiUE9TVFwiIEFDVElPTj1cIiIgKyBmUmVzdWx0TmFtZSArICJcIiBUQVJHRVQ9XCJyZXN1bHRcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJISURERU5cIiBOQU1FPVwibWV0aG9kXCIgVkFMVUU9XCI8JT1tZXRob2QlPlwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8QlI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxJTlBVVCBUWVBFPVwiU1VCTUlUXCIgVkFMVUU9XCJJbnZva2VcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJSRVNFVFwiIFZBTFVFPVwiQ2xlYXJcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9GT1JNPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJicmVhazsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAKLSAgICAgIAotCi0gICAgICBmYnVmZmVyLmFwcGVuZCgifSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgICAgCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiaWYgKHZhbGlkKSB7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiU2VsZWN0IGEgbWV0aG9kIHRvIHRlc3QuIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAgCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZChHZW5lcmF0b3IuVEFCICsgInJldHVybjsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgifSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9CT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hUTUw+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUhlbHAxR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUhlbHAxR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYjQ5ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVIZWxwMUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLlBhcmFtZXRlclZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSW5wdXRGaWxlSGVscDFHZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSW5wdXRGaWxlSGVscDFHZW5lcmF0b3IgZXh0ZW5kcyBJbnB1dEZpbGVHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX1NUQVRFID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxfU1RBVEUgPSAyOwotCi0gIHB1YmxpYyBpbnQgZnN0YXRlOwotICAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlSGVscDFHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gICAgICBmc3RhdGUgPSBJTklUSUFMX1NUQVRFOwotICB9Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIElucHV0RmlsZUhlbHAxR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyLFN0cmluZyByZXN1bHROYW1lKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIscmVzdWx0TmFtZSk7Ci0gICAgICBmc3RhdGUgPSBJTklUSUFMX1NUQVRFOwotICB9Ci0gIAotICAvKgotICAqIFRha2VzIGluIGFuIGVsZW1lbnQKLSAgKiBAcGFyYW0gT2JqZWN0IFRha2VzIGluIGFuIG9iamVjdCB0byBiZSBhY3RlZCB1cG9uCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgRWxlbWVudCBtZXRob2RFbGVtZW50ID0gKEVsZW1lbnQpb2JqZWN0OwotICAgICBNZXRob2RFbGVtZW50IG1ldGhvZCA9IChNZXRob2RFbGVtZW50KW1ldGhvZEVsZW1lbnQ7Ci0gICAgIGlmIChtZXRob2QuZ2V0TWV0aG9kT21taXNzaW9uKCkpIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICAgCi0gICAgIFBhcmFtZXRlclZpc2l0b3IgcGFyYW1ldGVyVmlzaXRvciA9IG5ldyBQYXJhbWV0ZXJWaXNpdG9yKCk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCJjYXNlICIgKyBtZXRob2QuZ2V0TnVtYmVySUQoKSsgIjoiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCJ2YWxpZCA9IGZhbHNlOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiPEZPUk0gTUVUSE9EPVwiUE9TVFwiIEFDVElPTj1cIiIgKyBmUmVzdWx0TmFtZSArICJcIiBUQVJHRVQ9XCJyZXN1bHRcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCI8SU5QVVQgVFlQRT1cIkhJRERFTlwiIE5BTUU9XCJtZXRob2RcIiBWQUxVRT1cIjwlPW1ldGhvZCU+XCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgIAotICAgICAvLyBnbyB0byB0aGUgbmV4dCBnZW5lcmF0b3IKLSAgICAgSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IgaW5wdXRGaWxlSGVscDJHZW5lcmF0b3IgPSBuZXcgSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IoZmJ1ZmZlcik7IAotICAgICBwYXJhbWV0ZXJWaXNpdG9yLnJ1bihtZXRob2RFbGVtZW50LGlucHV0RmlsZUhlbHAyR2VuZXJhdG9yKTsKLSAgICAgZmJ1ZmZlciA9IGlucHV0RmlsZUhlbHAyR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgICAKLSAgICAgZmJ1ZmZlci5hcHBlbmQoIjxCUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCI8SU5QVVQgVFlQRT1cIlNVQk1JVFwiIFZBTFVFPVwiSW52b2tlXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJSRVNFVFwiIFZBTFVFPVwiQ2xlYXJcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCI8L0ZPUk0+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCJicmVhazsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAKLQotICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgIAotICAKLSAgfSAgIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2YzI4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUhlbHAyR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlJlbFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5UeXBlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5QYXJhbWV0ZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBJbnB1dEZpbGVIZWxwMkdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBJbnB1dEZpbGVIZWxwMkdlbmVyYXRvciBleHRlbmRzIElucHV0RmlsZUhlbHAxR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgLyoKLSAgKiBUaGlzIGlzIGFjdHVhbGx5IHVzZWQgYnkgdGhlIHJlc3VsdCBnZW5lcmF0b3IgdG8gc2hvdyB0aGUgCi0gICogcmVzdWx0YW50IEJlYW4KLSAgKiBUaGUgbmFtZSBpcyB0aGUgbmFtZSB0aGUgcmVzdWx0YW50IGJlYW4gaXMgdXNpbmcgYXMgaXRzIGluc3RhbmNlIG5hbWUKLSAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmSW5zdGFuY2VOYW1lOwotICBwcml2YXRlIGJvb2xlYW4gZlJldHVyblBhcmFtPWZhbHNlOwotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gICAgICBmSW5zdGFuY2VOYW1lPSIiOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBpcyBzdGF0ZSBkYXRhIHRvIGJlIHVzZWQgYnkgdGhlIGdlbmVyYXRvcnMKLSAgKiBAcGFyYW0gU3RyaW5nIG5hbWUgVGhlIGluc3RhbmNlIG5hbWUgb2YgdGhlIHBhcmFtZXRlcnMgdHlwZSBiZWFuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldEluc3RhbmNlTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGZJbnN0YW5jZU5hbWUgPSBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBpcyBzdGF0ZSBkYXRhIHRvIGJlIHVzZWQgYnkgdGhlIGdlbmVyYXRvcnMKLSAgKiBAcmV0dXJuIFN0cmluZyBuYW1lIFRoZSBpbnN0YW5jZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXJzIHR5cGUgYmVhbgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEluc3RhbmNlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZkluc3RhbmNlTmFtZTsKLSAgfQotCi0KLSAgLyoKLSAgKiBUYWtlcyBpbiBhbiBvYmplY3QgdG8gYmUgYWN0ZWQgdXBvbiBieSB0aGlzIHZpc2l0b3IgYWN0aW9uCi0gICogQHBhcmFtIE9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24KLSAgKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICAgRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gKEVsZW1lbnQpb2JqZWN0OwotICAgICAgUmVsVmlzaXRvciB2aXNpdG9yID0gKFJlbFZpc2l0b3IpZ2V0VmlzaXRvcigpOwotICAgICAgUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXIgPSAoUGFyYW1ldGVyRWxlbWVudClwYXJhbWV0ZXJFbGVtZW50OwotCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiPFRBQkxFPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQotICAgICAgVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3IgPSBuZXcgVHlwZVZpc2l0b3IoKTsKLSAgICAgIElucHV0RmlsZVR5cGVHZW5lcmF0b3IgaW5wdXRGaWxlVHlwZUdlbmVyYXRvciA9IG5ldyBJbnB1dEZpbGVUeXBlR2VuZXJhdG9yKGZidWZmZXIsMCk7Ci0gICAgICBpbnB1dEZpbGVUeXBlR2VuZXJhdG9yLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOwotICAgICAgaW5wdXRGaWxlVHlwZUdlbmVyYXRvci5zZXRJbnN0YW5jZU5hbWUoZkluc3RhbmNlTmFtZSk7Ci0gICAgICB0eXBlVmlzaXRvci5ydW4ocGFyYW1ldGVyRWxlbWVudCxpbnB1dEZpbGVUeXBlR2VuZXJhdG9yKTsKLSAgICAgIGZidWZmZXIgPSBpbnB1dEZpbGVUeXBlR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9UQUJMRT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRSZXR1cm5QYXJhbSgpCi0gIHsKLSAgICByZXR1cm4gZlJldHVyblBhcmFtOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmV0dXJuUGFyYW0oYm9vbGVhbiByZXR1cm5QYXJhbSkKLSAgewotICAgIGZSZXR1cm5QYXJhbSA9IHJldHVyblBhcmFtOwotICB9IAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlVHlwZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVUeXBlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTM0NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVUeXBlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLkF0dHJpYnV0ZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5GaWVsZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQXR0cmlidXRlRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuU2ltcGxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBJbnB1dEZpbGVUeXBlR2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIElucHV0RmlsZVR5cGVHZW5lcmF0b3IgZXh0ZW5kcyBJbnB1dEZpbGVIZWxwMkdlbmVyYXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZlBhcmVudEdldHRlcnM7Ci0gIHByb3RlY3RlZCBpbnQgZkxldmVsc0RlZXA7Ci0gIHByb3RlY3RlZCBpbnQgZkNvbHNwYW47Ci0gIHByb3RlY3RlZCBpbnQgZkN1cnJlbnRMZXZlbDsKLSAgcHJpdmF0ZSBib29sZWFuIGZJc1NpbXBsZTsKLSAgcHJpdmF0ZSBib29sZWFuIGZTdGF0ZUxlc3NCZWFuOwotICBwcml2YXRlIFZlY3RvciBmR2V0dGVyczsKLSAgcHJpdmF0ZSBWZWN0b3IgZlR5cGVzOwotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlVHlwZUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGN1cnJlbnRMZXZlbCkKLSAgewotICAgICBzdXBlcihidWZmZXIpOwotICAgICBmQ3VycmVudExldmVsID0gY3VycmVudExldmVsOwotICAgICBmTGV2ZWxzRGVlcCA9IC0xOwotICAgICBmUGFyZW50R2V0dGVycyA9ICIiOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0gIHB1YmxpYyBJbnB1dEZpbGVUeXBlR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgY3VycmVudExldmVsLGludCBsZXZlbHNEZWVwKQotICB7Ci0gICAgIHN1cGVyKGJ1ZmZlcik7Ci0gICAgIGZDdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWw7Ci0gICAgIGZMZXZlbHNEZWVwID0gbGV2ZWxzRGVlcDsKLSAgICAgZlBhcmVudEdldHRlcnMgPSAiIjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBhcmVudEdldHRlcnMoVmVjdG9yIGdldHRlcixWZWN0b3IgdHlwZSkKLSAgewotICAgICBpZihmR2V0dGVycyAhPSBudWxsKXsKLSAgICAgICBmR2V0dGVycy5jbGVhcigpOwotICAgICAgIGZUeXBlcy5jbGVhcigpOwotICAgICB9Ci0gICAgIGFkZFBhcmVudEdldHRlcihnZXR0ZXIsdHlwZSk7Ci0gIH0KLQotCi0gIC8qKgotICAqIFRoaXMgZnVuY3Rpb24gaG9sZHMgc29tZSBzdGF0ZSBkYXRhIHRoYXQgaXMgaW1wb3J0YW50IGluIGdldHRpbmcgdGhlIAotICAqIFN0cmluZ3MgZm9yIGRpc3BsYXkgb2YgcmVzdWx0YW50IGJlYW5zCi0gICogQHBhcmFtIFN0cmluZyBnZXR0ZXIgdGhpcyBpcyB0aGUgZ2V0dGVyIG9mIGFuIGF0dHJpYnV0ZQotICAqIFRoZSBpZGVhIGlzIHRoYXQgYnkgdGhlIHRpbWUgd2UgZ2V0IHRvIHRoZSBzaW1wbGUgdHlwZQotICAqIHdlIGhhdmUgZ2V0QWRkcmVzcygpLmdldFN0cmVldCgpLi4uLgotICAqLwotICBwdWJsaWMgdm9pZCBhZGRQYXJlbnRHZXR0ZXIoU3RyaW5nIGdldHRlciwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBpZihmR2V0dGVycyA9PSBudWxsKSBmR2V0dGVycyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZihmVHlwZXMgPT0gbnVsbCkgZlR5cGVzID0gbmV3IFZlY3RvcigpOwotICAgIGZHZXR0ZXJzLmFkZEVsZW1lbnQoZ2V0dGVyKTsKLSAgICBmVHlwZXMuYWRkRWxlbWVudCh0eXBlKTsKLSAgfQotCi0gIC8qCi0gICogdGhpcyB3aWxsIGJlIHVzZWQgd2hlbiBwYXNzaW5nIGJldHdlZW4gdHdvIHZpc2l0b3JzCi0gICoKLSAgKi8KLSAgcHVibGljIHZvaWQgYWRkUGFyZW50R2V0dGVyKFZlY3RvciBnZXR0ZXJzLCBWZWN0b3IgdHlwZXMpCi0gIHsKLSAgICBpZihmR2V0dGVycyA9PSBudWxsKSBmR2V0dGVycyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZihmVHlwZXMgPT0gbnVsbCkgZlR5cGVzID0gbmV3IFZlY3RvcigpOwotICAgIGludCBzaXplID0gZ2V0dGVycy5zaXplKCk7ICAgIAotICAgIGZvcihpbnQgaSA9IDA7IGk8c2l6ZTsgaSsrKXsKLSAgICAgIGZHZXR0ZXJzLmFkZEVsZW1lbnQoZ2V0dGVycy5nZXQoaSkpOwotICAgICAgZlR5cGVzLmFkZEVsZW1lbnQodHlwZXMuZ2V0KGkpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHJldHVyblBhcmVudEdldHRlcihpbnQgY291bnQpCi0gIHsKLSAgICBpZiAoZkdldHRlcnMgPT0gbnVsbCB8fCBjb3VudCA+IGZHZXR0ZXJzLnNpemUoKSkgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuIChTdHJpbmcpZkdldHRlcnMuZ2V0KGNvdW50KTsgIAotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyByZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKGludCBjb3VudCkKLSAgewotICAgIGlmIChmVHlwZXMgPT0gbnVsbCB8fCBjb3VudCA+IGZUeXBlcy5zaXplKCkpIHJldHVybiBudWxsOwotICAgIHJldHVybiAoU3RyaW5nKWZUeXBlcy5nZXQoY291bnQpOyAgCi0gIH0KLQotICBwcm90ZWN0ZWQgVmVjdG9yIHJldHVyblBhcmVudEdldHRlcigpCi0gIHsKLSAgICBpZiAoZkdldHRlcnMgPT0gbnVsbCApIHJldHVybiBuZXcgVmVjdG9yKCk7Ci0gICAgcmV0dXJuIGZHZXR0ZXJzOyAgCi0gIH0KLQotICBwcm90ZWN0ZWQgVmVjdG9yIHJldHVyblBhcmVudEdldHRlclR5cGUoKQotICB7Ci0gICAgaWYgKGZUeXBlcyA9PSBudWxsICkgcmV0dXJuIG5ldyBWZWN0b3IoKTsKLSAgICByZXR1cm4gZlR5cGVzOyAgCi0gIH0KLQotICBwcm90ZWN0ZWQgaW50IGdldHRlckNvdW50KCkKLSAgewotICAgIGlmKGZHZXR0ZXJzID09IG51bGwpIHJldHVybiAwOwotICAgIHJldHVybiBmR2V0dGVycy5zaXplKCk7IAotICB9Ci0KLQotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgc29tZSBzdGF0ZSBkYXRhIHRoYXQgaXMgaW1wb3J0YW50IGluIGdldHRpbmcgdGhlIAotICAqIFN0cmluZ3MgZm9yIGRpc3BsYXkgb2YgcmVzdWx0YW50IGJlYW5zCi0gICogQHJldHVybiBTdHJpbmcgdGhlIHN0cmluZyBvZiBnZXR0ZXJzIHRvIHRoaXMgcG9pbnQKLSAgKiBUaGUgaWRlYSBpcyB0aGF0IGJ5IHRoZSB0aW1lIHdlIGdldCB0byB0aGUgc2ltcGxlIHR5cGUKLSAgKiB3ZSBoYXZlIGdldEFkZHJlc3MoKS5nZXRTdHJlZXQoKS4uLi4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRHZXR0ZXJzKCkKLSAgewotICAgIHJldHVybiBmUGFyZW50R2V0dGVyczsKLSAgfQotICAKLSAgLyoKLSAgKiBUYWtlcyBpbiBhbiBvYmplY3QgdG8gYmUgYWN0ZWQgdXBvbiBieSB0aGlzIHZpc2l0b3IgYWN0aW9uCi0gICogQHBhcmFtIE9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24KLSAgKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICBUeXBlRWxlbWVudCBlbGVtZW50ID0gKFR5cGVFbGVtZW50KW9iamVjdDsKLSAgICAgICAgICAKLSAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaW1wbGVFbGVtZW50KSBmSXNTaW1wbGUgPSB0cnVlOwotICAgICBlbHNlIGZJc1NpbXBsZSA9IGZhbHNlOwotCi0gICAgIC8vdGhpcyBjb3VsZCBiZSBhIHN0YXRlbGVzc2JlYW4gbmVlZCB0byBrbm93Ci0gICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQmVhbkVsZW1lbnQgKXsKLSAgICAgICAgQmVhbkVsZW1lbnQgYmVhbiA9IChCZWFuRWxlbWVudCllbGVtZW50OwotICAgICAgICBpZiAoYmVhbi5pc1N0YXRlTGVzcygpKSBmU3RhdGVMZXNzQmVhbiA9IHRydWU7Ci0gICAgIH0KLQotCi0KLSAgICAgLy9Db21wbGV4IHR5cGUgc3VwcG9ydAotICAgICAvL2ZpcnN0IEkgbmVlZCB0byBmaW5kIG91dCBob3cgbWFueSBsZXZlbHMgZGVlcAotICAgICBpZihmTGV2ZWxzRGVlcCA9PSAtMSl7Ci0gICAgICAgIEF0dHJpYnV0ZVZpc2l0b3IgYXR0cmlidXRlVmlzaXRvciA9IG5ldyBBdHRyaWJ1dGVWaXNpdG9yKCk7Ci0gICAgICAgIExldmVsc0RlZXBWaXNpdG9yQWN0aW9uIGxkdmEgPSBuZXcgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24oKTsKLSAgICAgICAgYXR0cmlidXRlVmlzaXRvci5ydW4oZWxlbWVudCxsZHZhKTsKLSAgICAgICAgZkxldmVsc0RlZXAgPSBsZHZhLmdldExldmVsc0RlZXAoKTsKLSAgICAgICAgLy9jaGVjayBvdXQgdGhlIGZpZWxkcyAKLSAgICAgICAgRmllbGRWaXNpdG9yIGZpZWxkVmlzaXRvciA9IG5ldyBGaWVsZFZpc2l0b3IoKTsKLSAgICAgICAgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24gbGR2YTIgPSBuZXcgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24oKTsKLSAgICAgICAgZmllbGRWaXNpdG9yLnJ1bihlbGVtZW50LGxkdmEyKTsKLQotICAgICAgICBpZihmTGV2ZWxzRGVlcCA8IGxkdmEyLmdldExldmVsc0RlZXAoKSlmTGV2ZWxzRGVlcCA9IGxkdmEyLmdldExldmVsc0RlZXAoKTsgCi0gICAgICAgIGZMZXZlbHNEZWVwKys7Ci0gICAgIH0gCi0gICAgIGZDb2xzcGFuID0gZkxldmVsc0RlZXAgLSBmQ3VycmVudExldmVsOwotCi0gICAgIC8vaWYgd2UgaGF2ZSBhIHJldHVybiBwYXJhbSB3aXRoIG5vIGdldHRlciBtYWtlIHN1cmUgd2UgYXJlIG9uIHRoZSAKLSAgICAgLy9hdHRyaWJ1dGUgYW5kIG5vdCB0aGUgcGFyYW1ldGVyIHRoZW4gcmV0dXJuCi0gICAgIGlmKGdldFJldHVyblBhcmFtKCkgJiYgIGVsZW1lbnQuZ2V0T3duaW5nRWxlbWVudCgpIGluc3RhbmNlb2YgQXR0cmlidXRlRWxlbWVudFR5cGUgJiYoKChBdHRyaWJ1dGVFbGVtZW50VHlwZSllbGVtZW50LmdldE93bmluZ0VsZW1lbnQoKSkuZ2V0R2V0dGVyTWV0aG9kKCkgPT0gbnVsbCkgKSByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICAgLy9Db2RlIGdlbiBmb3IgYWxsIGVsZW1lbnRzCi0gICAgIGZidWZmZXIuYXBwZW5kKCI8VFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZDdXJyZW50TGV2ZWw7aSsrKXsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxURCBXSURUSD1cIjUlXCI+PC9URD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIH0KLSAgICAgZmJ1ZmZlci5hcHBlbmQoIjxURCBDT0xTUEFOPVwiIiArIGZDb2xzcGFuICsgIlwiIEFMSUdOPVwiTEVGVFwiPiIgKyBlbGVtZW50LmdldE93bmluZ0VsZW1lbnQoKS5nZXROYW1lKCkgKyAiOjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAgIAotICAgICBpZihmSXNTaW1wbGUgfHwgVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oZWxlbWVudC5nZXROYW1lKCkpIAotICAgICAgICAgICAgICAgIHx8IChnZXRSZXR1cm5QYXJhbSgpICYmIGZTdGF0ZUxlc3NCZWFuKSAKLSAgICAgICAgICAgICAgICB8fCAoZ2V0UmV0dXJuUGFyYW0oKSAmJiBUeXBlRmFjdG9yeS5pc1JlY29nbml6ZWRSZXR1cm5UeXBlKGVsZW1lbnQuZ2V0VHlwZU5hbWUoKSkpKXsKLSAgICAgICAgaWYoZ2V0SW5zdGFuY2VOYW1lKCkuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgIERhdGFUeXBlIGRhdGFUeXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlVHlwZShlbGVtZW50LmdldE5hbWUoKSxlbGVtZW50LmdldE93bmluZ0VsZW1lbnQoKS5nZXRNVUlEKCkpOwotICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChkYXRhVHlwZS5pbnB1dEZvcm0oZWxlbWVudC5nZXRPd25pbmdFbGVtZW50KCkuZ2V0TVVJRCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAgaWYoZ2V0UmV0dXJuUGFyYW0oKSAmJiAoVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZShlbGVtZW50LmdldFR5cGVOYW1lKCkpIHx8IGZTdGF0ZUxlc3NCZWFuKSl7Ci0gICAgICAgICAgICAgRGF0YVR5cGUgZGF0YVR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGVUeXBlKGVsZW1lbnQuZ2V0VHlwZU5hbWUoKSxlbGVtZW50LmdldE93bmluZ0VsZW1lbnQoKS5nZXRNVUlEKCkpOyAgCi0gICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZU5hbWUgPSAidHlwZSIgKyBkYXRhVHlwZS5nZXRVbmlxdWVOYW1lKCk7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxURD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCJpZigiICsgIGdldEluc3RhbmNlTmFtZSgpICsgIiAhPSBudWxsKXsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAgICAgU3RyaW5nIGFmdGVyU3RyaW5nID0gZ2V0SW5zdGFuY2VOYW1lKCk7IAotICAgICAgICAgICAgIFN0cmluZyB0bXBTdHJpbmcgPSAidGViZWNlIjsKLSAgICAgICAgICAgICBTdHJpbmcgcHJldlN0cmluZyA9IGdldEluc3RhbmNlTmFtZSgpOwotICAgICAgICAgICAgIFN0cmluZyBuZXdUbXBTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPGdldHRlckNvdW50KCk7aSsrKXsKLSAgICAgICAgICAgICAgIG5ld1RtcFN0cmluZyA9IHRtcFN0cmluZyArIGk7Ci0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChyZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKGkpICsgIiAiICsgbmV3VG1wU3RyaW5nICsgIj0iICsgcHJldlN0cmluZyArICIuIiArIHJldHVyblBhcmVudEdldHRlcihpKSArICI7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgICAgcHJldlN0cmluZyA9IG5ld1RtcFN0cmluZzsgCi0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIiArIG5ld1RtcFN0cmluZyArICIgIT0gbnVsbCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgICAgYWZ0ZXJTdHJpbmcgPSBuZXdUbXBTdHJpbmc7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKGVsZW1lbnQuZ2V0TmFtZSgpICsgIiAiICsgdW5pcXVlTmFtZSArICIgPSAiICsgYWZ0ZXJTdHJpbmcgKyAiLiIgKyAoKEF0dHJpYnV0ZUVsZW1lbnRUeXBlKWVsZW1lbnQuZ2V0T3duaW5nRWxlbWVudCgpKS5nZXRHZXR0ZXJNZXRob2QoKSsgIjsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7ICAgICAgICAgICAgIAotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKGRhdGFUeXBlLlR5cGVDb252ZXJzaW9uKHVuaXF1ZU5hbWUpKTsKLSAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPGdldHRlckNvdW50KCk7aSsrKXsKLSAgICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCJ9Iik7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCJ9JT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgZWxzZXsgCi0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxURD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCJpZigiICsgIGdldEluc3RhbmNlTmFtZSgpICsgIiAhPSBudWxsKXsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAgICAgU3RyaW5nIGFmdGVyU3RyaW5nID0gZ2V0SW5zdGFuY2VOYW1lKCk7Ci0gICAgICAgICAgICAgU3RyaW5nIHRtcFN0cmluZyA9ICJ0ZWJlY2UiOwotICAgICAgICAgICAgIFN0cmluZyBwcmV2U3RyaW5nID0gZ2V0SW5zdGFuY2VOYW1lKCk7Ci0gICAgICAgICAgICAgU3RyaW5nIG5ld1RtcFN0cmluZyA9ICIiOwotICAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8Z2V0dGVyQ291bnQoKTtpKyspewotICAgICAgICAgICAgICAgbmV3VG1wU3RyaW5nID0gdG1wU3RyaW5nICsgaTsKLSAgICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKHJldHVyblBhcmVudEdldHRlclR5cGUoaSkgKyAiICIgKyBuZXdUbXBTdHJpbmcgKyAiPSIgKyBwcmV2U3RyaW5nICsgIi4iICsgcmV0dXJuUGFyZW50R2V0dGVyKGkpICsgIjsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAgICAgICBwcmV2U3RyaW5nID0gbmV3VG1wU3RyaW5nOyAKLSAgICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCJpZigiICsgbmV3VG1wU3RyaW5nICsgIiAhPSBudWxsKXsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAgICAgICBhZnRlclN0cmluZyA9IG5ld1RtcFN0cmluZzsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8JT0iKTsKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChhZnRlclN0cmluZyArICIuIiArICgoQXR0cmlidXRlRWxlbWVudFR5cGUpZWxlbWVudC5nZXRPd25pbmdFbGVtZW50KCkpLmdldEdldHRlck1ldGhvZCgpKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iKTsKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiKTsKLSAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPGdldHRlckNvdW50KCk7aSsrKXsKLSAgICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCJ9Iik7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCJ9JT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAKLSAgICAgfQotICAgICAgICAgCi0gICAgICAvL05vdyBjYXJyeSBvbiBkb3duIHRoZSByZXN0IG9mIHRoZSBiZWFuCi0gICAgIGVsc2UgewotICAgICAgICBBdHRyaWJ1dGVWaXNpdG9yIGF0dHJpYnV0ZVZpc2l0b3IgPSBuZXcgQXR0cmlidXRlVmlzaXRvcigpOwotICAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnNldFJlc2lkZW50VmVjdG9yMShyZXR1cm5QYXJlbnRHZXR0ZXIoKSk7Ci0gICAgICAgIGF0dHJpYnV0ZVZpc2l0b3Iuc2V0UmVzaWRlbnRWZWN0b3IyKHJldHVyblBhcmVudEdldHRlclR5cGUoKSk7Ci0gICAgICAgIElucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvciBpbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgPSBuZXcgSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yKGZidWZmZXIsKGZDdXJyZW50TGV2ZWwgKyAxKSxmTGV2ZWxzRGVlcCk7Ci0gICAgICAgIGlucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5zZXRSZXR1cm5QYXJhbShnZXRSZXR1cm5QYXJhbSgpKTsKLSAgICAgICAgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLnNldEluc3RhbmNlTmFtZShmSW5zdGFuY2VOYW1lKTsKLSAgICAgICAgYXR0cmlidXRlVmlzaXRvci5ydW4oZWxlbWVudCxpbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IpOwotICAgICAgICBmYnVmZmVyID0gaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgICAgIAotICAgICAgICAvL25vdyBkbyBmaWVsZHMgdmVyeSBzaW1pbGFyCi0gICAgICAgIEZpZWxkVmlzaXRvciBmaWVsZFZpc2l0b3IgPSBuZXcgRmllbGRWaXNpdG9yKCk7Ci0gICAgICAgIGZpZWxkVmlzaXRvci5zZXRSZXNpZGVudFZlY3RvcjEocmV0dXJuUGFyZW50R2V0dGVyKCkpOwotICAgICAgICBmaWVsZFZpc2l0b3Iuc2V0UmVzaWRlbnRWZWN0b3IyKHJldHVyblBhcmVudEdldHRlclR5cGUoKSk7Ci0gICAgICAgIElucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvciBpbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyID0gbmV3IElucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcihmYnVmZmVyLChmQ3VycmVudExldmVsICsgMSksZkxldmVsc0RlZXApOwotICAgICAgICBpbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyLnNldFJldHVyblBhcmFtKGdldFJldHVyblBhcmFtKCkpOwotICAgICAgICBpbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyLnNldEluc3RhbmNlTmFtZShmSW5zdGFuY2VOYW1lKTsKLSAgICAgICAgZmllbGRWaXNpdG9yLnJ1bihlbGVtZW50LGlucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcjIpOwotICAgICAgICBmYnVmZmVyID0gaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5nZXRTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAKLSAgICAgICAgCi0KLSAgICAgfQotCi0KLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9MZXZlbHNEZWVwVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9MZXZlbHNEZWVwVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjE0MTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLkF0dHJpYnV0ZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5GaWVsZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5UeXBlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5BdHRyaWJ1dGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbi4KLSogKi8KLXB1YmxpYyBjbGFzcyBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbiBpbXBsZW1lbnRzIFZpc2l0b3JBY3Rpb24gCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwcml2YXRlIFZpc2l0b3IgZlZpc2l0b3I7Ci0gIHByaXZhdGUgaW50IGZMZXZlbHNEZWVwOwotICBwcml2YXRlIGludCBmRGVlcGVzdExldmVsOwotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogVGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgKiAKLSAgKi8KLSAgcHVibGljIExldmVsc0RlZXBWaXNpdG9yQWN0aW9uICgpCi0gIHsKLSAgICBmTGV2ZWxzRGVlcCA9IDA7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBUaGlzIGlzIHRoZSBzdGFydGluZyBwb2ludAotICAqIAotICAqLwotICBwdWJsaWMgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24gKGludCBjdXJyZW50LGJvb2xlYW4gaW5jcmVtZW50KQotICB7Ci0gICAgZkxldmVsc0RlZXAgPSBjdXJyZW50OwotICAgIGlmKGluY3JlbWVudCkgZkxldmVsc0RlZXArKzsKLSAgICBmRGVlcGVzdExldmVsID0gZkxldmVsc0RlZXA7IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cmluZyByZXNpZGVudCkKLSAgewotICAgIC8vbm90aGluZyB0byBiZSBkb25lIGJ1dCBtdXN0IGJlIGltcGxlbWVudGVkCi0gIH0KLQotCi0KLSAgLyoqCi0gICogVGhlIHZpc2l0b3IgdGhhdCBjYWxsZWQgdGhpcyBWaXNpdG9yQWN0aW9uCi0gICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3IgdGhhdCBjYWxsZWQgdGhpcyB2aXNpdG9yIGFjdGlvbgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRWaXNpdG9yKFZpc2l0b3IgdmlzaXRvcikKLSAgewotICAgICBmVmlzaXRvciA9IHZpc2l0b3I7Ci0gIH0KLQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxldmVsIG9mIG5lc3Rpbmcgd2l0aGluIHRoaXMgYmVhbgotICAqIEByZXR1cm4gaW50IHJldHVybnMgdGhlIGludCBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgbmVzdHMgb2YgdGhpcyBiZWFuCi0gICovCi0gIHB1YmxpYyBpbnQgZ2V0TGV2ZWxzRGVlcCgpCi0gIHsKLSAgICAgcmV0dXJuIGZEZWVwZXN0TGV2ZWw7Ci0gIH0KLSAKLQotICAvKioKLSAgKiBUYWtlcyBpbiBhbiBvYmplY3QgdG8gYmUgYWN0ZWQgdXBvbiBieSB0aGlzIHZpc2l0b3IgYWN0aW9uCi0gICogQHBhcmFtIE9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24KLSAgKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpb2JqZWN0OwotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVFbGVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBUeXBlRWxlbWVudCl7Ci0gICAgICAgICBUeXBlVmlzaXRvciB0eXBlVmlzaXRvciA9IG5ldyBUeXBlVmlzaXRvcigpOwotICAgICAgICAgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24gbHZkYSA9IG5ldyBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbihmTGV2ZWxzRGVlcCx0cnVlKTsKLSAgICAgICAgIHR5cGVWaXNpdG9yLnJ1bihlbGVtZW50LGx2ZGEpOwotCi0gICAgICAgICBpZiAobHZkYS5nZXRMZXZlbHNEZWVwKCkgPiBmRGVlcGVzdExldmVsKSBmRGVlcGVzdExldmVsID0gbHZkYS5nZXRMZXZlbHNEZWVwKCk7IAotICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQmVhbkVsZW1lbnQgJiYgIShUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihlbGVtZW50LmdldE5hbWUoKSkpKXsKLSAgICAgICAgIEF0dHJpYnV0ZVZpc2l0b3IgYXR0cmlidXRlVmlzaXRvciA9IG5ldyBBdHRyaWJ1dGVWaXNpdG9yKCk7Ci0gICAgICAgICBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbiBsdmRhID0gbmV3IExldmVsc0RlZXBWaXNpdG9yQWN0aW9uKGZMZXZlbHNEZWVwLGZhbHNlKTsKLSAgICAgICAgIGF0dHJpYnV0ZVZpc2l0b3IucnVuKGVsZW1lbnQsbHZkYSk7Ci0gICAgICAgICBpZiAobHZkYS5nZXRMZXZlbHNEZWVwKCkgPiBmRGVlcGVzdExldmVsKSBmRGVlcGVzdExldmVsID0gbHZkYS5nZXRMZXZlbHNEZWVwKCk7IAotICAgCi0gICAgICAgICBGaWVsZFZpc2l0b3IgZmllbGRWaXNpdG9yID0gbmV3IEZpZWxkVmlzaXRvcigpOwotICAgICAgICAgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24gbHZkYTIgPSBuZXcgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24oZkxldmVsc0RlZXAsZmFsc2UpOwotICAgICAgICAgZmllbGRWaXNpdG9yLnJ1bihlbGVtZW50LGx2ZGEyKTsKLSAgICAgICAgIGlmIChsdmRhMi5nZXRMZXZlbHNEZWVwKCkgPiBmRGVlcGVzdExldmVsKSBmRGVlcGVzdExldmVsID0gbHZkYTIuZ2V0TGV2ZWxzRGVlcCgpOyAKLSAgIAotICAgICAgfQotICAgICAgICAgCi0gICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsgICAKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL01ldGhvZEZpbGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTWV0aG9kRmlsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmM2ZThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTWV0aG9kRmlsZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLk1ldGhvZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIE1ldGhvZEZpbGVnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRmlsZUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAgCi0gIHB1YmxpYyBTdHJpbmcgZklucHV0TmFtZTsKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0gIHB1YmxpYyBNZXRob2RGaWxlR2VuZXJhdG9yIChTdHJpbmcgaW5wdXRzKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBmSW5wdXROYW1lID0gaW5wdXRzOwotICB9Ci0KLSAgIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIEBwYXJhbSBTdHJpbmdCdWZmZXIgYnVmZmVyIHRvIGFwcGVuZCBjb2RlZ2VuIAotICAqLwotICBwdWJsaWMgTWV0aG9kRmlsZUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcixTdHJpbmcgaW5wdXRzKQotICB7Ci0gICAgc3VwZXIoYnVmZmVyKTsKLSAgICBmSW5wdXROYW1lID0gaW5wdXRzOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZXMoU3RyaW5nIGlucHV0cykKLSAgewotICAgIGZJbnB1dE5hbWUgPSBpbnB1dHM7Ci0gIH0KLQotICAvL3B1YmxpYyBzdGF0aWMgU3RyaW5nIExPQ0FUT1IgPSAiTG9jYXRvciI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJFQU4gPSAiUHJveHkiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBHRVQgPSAiZ2V0IjsKLQotICAKLSAgLy90YWtlcyBpbiBhIGJlYW4gbm9kZQotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICAgewotICAgICAgRWxlbWVudCBiZWFuRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIEJlYW5FbGVtZW50IGJlYW4gPSAoQmVhbkVsZW1lbnQpYmVhbkVsZW1lbnQ7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCVAcGFnZSBjb250ZW50VHlwZT1cInRleHQvaHRtbDtjaGFyc2V0PVVURi04XCIlPiIpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxIVE1MPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIjxIRUFEPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIjxUSVRMRT5NZXRob2RzPC9USVRMRT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICI8L0hFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiPEJPRFk+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiPEgxPk1ldGhvZHM8L0gxPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIjxVTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBNZXRob2RWaXNpdG9yIG1ldGhvZFZpc2l0b3IgPSBuZXcgTWV0aG9kVmlzaXRvcigpOwotICAgICAgTWV0aG9kRmlsZUhlbHBHZW5lcmF0b3IgbWV0aG9kRmlsZUhlbHBHZW5lcmF0b3IgPSBuZXcgTWV0aG9kRmlsZUhlbHBHZW5lcmF0b3IoZmJ1ZmZlcixmSW5wdXROYW1lKTsgCi0gICAgICBtZXRob2RWaXNpdG9yLnJ1bihiZWFuRWxlbWVudCxtZXRob2RGaWxlSGVscEdlbmVyYXRvcik7Ci0gICAgICBmYnVmZmVyID0gbWV0aG9kRmlsZUhlbHBHZW5lcmF0b3IuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9VTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICI8L0JPRFk+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiPC9IVE1MPiIpOwotICAgICAgCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTWV0aG9kRmlsZUhlbHBHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTWV0aG9kRmlsZUhlbHBHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjYTIzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL01ldGhvZEZpbGVIZWxwR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBNZXRob2RGaWxlZ2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIE1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yIGV4dGVuZHMgTWV0aG9kRmlsZUdlbmVyYXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICoKLSAgKi8KLSAgcHVibGljIE1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyLFN0cmluZyBpbnB1dE5hbWUpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcixpbnB1dE5hbWUpOwotICB9Ci0KLQotICAvL3Rha2VzIGluIGEgTWV0aG9kIG5vZGUKLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICAgRWxlbWVudCBtZXRob2RFbGVtZW50ID0gKEVsZW1lbnQpb2JqZWN0OwotICAgICAgTWV0aG9kRWxlbWVudCBtZXRob2QgPSAoTWV0aG9kRWxlbWVudCltZXRob2RFbGVtZW50OwotICAgICAgaWYgKG1ldGhvZC5nZXRNZXRob2RPbW1pc3Npb24oKSkgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgICAgCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiPExJPjxBIEhSRUY9XCIiICsgZklucHV0TmFtZSArICI/bWV0aG9kPSIgKyBtZXRob2QuZ2V0TnVtYmVySUQoKSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiXCIgVEFSR0VUPVwiaW5wdXRzXCI+ICIgKyBtZXRob2QuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9BPjwvTEk+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjA5OWRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLlR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkF0dHJpYnV0ZUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkRhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBSZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIFJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgZXh0ZW5kcyBSZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwcml2YXRlIFZlY3RvciBmU2V0dGVyVmVjdG9yOyAKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gYnVmZmVyIFN0cmluZ0J1ZmZlciBvYmplY3QgdGhhdCB0aGlzIGNvZGUgZ2VuZXJhdG9yIHdyaXRlcyB0byAKLSAgKi8KLSAgcHVibGljIFJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gICAgICAKLSAgfQotICAKLSAgLyoqCi0gICogU2V0dGVyIHZlY3RvcgotICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFNldHRlclZlY3RvcigpCi0gIHsKLSAgICAgIHJldHVybiBmU2V0dGVyVmVjdG9yOwotICB9Ci0gIAotCi0gIC8qKgotICAqIFZpc2l0IE1ldGhvZCBnZW5lcmF0ZXMgY29kZSBmb3IgdGhpcyBWaXNpdG9yCi0gICogQHBhcmFtIFBhcmFtZXRlciBwYXJhbWV0ZXIgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCAKLSAgKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICBBdHRyaWJ1dGVFbGVtZW50VHlwZSBhdHRyaWJ1dGVFbGVtZW50VHlwZSA9IChBdHRyaWJ1dGVFbGVtZW50VHlwZSlvYmplY3Q7Ci0gICAgIEJhc2ljRWxlbWVudCBlbGVtZW50ID0gKEJhc2ljRWxlbWVudClvYmplY3Q7Ci0gICAgIGlmKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFR5cGVFbGVtZW50KCkuaXNTaW1wbGUoKSB8fCBUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKSkpeyAgICAgIAotICAgICAgICAvL3N0YXJ0IHRoZSBjb2RlZ2VuCi0gICAgICAgIC8vYXNrIHRoZSBkYXRhdHlwZSBmb3IgaXRzIHJlcXVlc3QgbGluZSwgaXQgbWF5IG5lZWQgbWFyayB1cCBvciBub3QuCi0gICAgICAgIC8vaWUgRm9yIHRoZSBzaW1wbGUgdHlwZXMgd2UgbmVlZCB0aGUgbWFyayB1cAotICAgICAgICAvL2ZvciB0aGUgZG9tIGVsZW1lbnQgd2UgY2FudCB1c2UgaXQuCi0gICAgICAgIERhdGFUeXBlIGRhdGFUeXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlVHlwZShhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKSxlbGVtZW50LmdldE1VSUQoKSk7Ci0gICAgICAgIHNldFR5cGVPd25lcklkKGlkTmFtZShlbGVtZW50LmdldE5hbWUoKSkpOyAKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoZGF0YVR5cGUuZ2V0UmVxdWVzdENvZGUoZWxlbWVudC5nZXRNVUlEKCksZ2V0VHlwZU93bmVySWQoKSkpOwotICAgICAgICAgICAgICAgIAotICAgICB9Ci0gICAgIAotICAgICBUeXBlVmlzaXRvciB0eXBlVmlzaXRvciA9IG5ldyBUeXBlVmlzaXRvcigpOwotICAgICBSZXN1bHRGaWxlVHlwZUdlbmVyYXRvciByZXN1bHRGaWxlVHlwZUdlbmVyYXRvciA9IG5ldyBSZXN1bHRGaWxlVHlwZUdlbmVyYXRvcihmYnVmZmVyKTsKLSAgICAgcmVzdWx0RmlsZVR5cGVHZW5lcmF0b3Iuc2V0TnVtYmVyRmFjdG9yeShnZXROdW1iZXJGYWN0b3J5KCkpOwotICAgICByZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5zZXRUeXBlT3duZXJJZChnZXRUeXBlT3duZXJJZCgpKTsKLSAgICAgCi0gICAgIHR5cGVWaXNpdG9yLnJ1bihhdHRyaWJ1dGVFbGVtZW50VHlwZSxyZXN1bHRGaWxlVHlwZUdlbmVyYXRvcik7Ci0gICAgIHNldE51bWJlckZhY3RvcnkocmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IuZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgVmVjdG9yIHNldHRlcklucHV0cyA9IHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmdldFJlc2lkZW50VmVjdG9yKCk7IAotICAgICBpZihhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRTZXR0ZXJNZXRob2QoKSA9PSBudWxsKSByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7IAotICAgICBwdXRSZXNpZGVudFZlY3RvcihhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRTZXR0ZXJTaWduYXR1cmUoKFN0cmluZylzZXR0ZXJJbnB1dHMuZmlyc3RFbGVtZW50KCkpKTsKLSAgICAgCi0gICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfSAgIAotCi0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9SZXN1bHRGaWxlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjRhM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9SZXN1bHRGaWxlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLk1ldGhvZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIE1ldGhvZEZpbGVnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0RmlsZUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciAKLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFJJUExFX1RBQiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgR2VuZXJhdG9yLlRBQjsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFFVQURfVEFCID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQjsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHNldEVuZHBvaW50TWV0aG9kOwotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgUmVzdWx0RmlsZUdlbmVyYXRvciAoKQotICB7Ci0gICAgICBzdXBlcigpOwotICB9Ci0KLSAgIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgUmVzdWx0RmlsZUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgfQotCi0gIC8vdGFrZXMgaW4gYSBiZWFuIG5vZGUKLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICAgRWxlbWVudCBiZWFuRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIEJlYW5FbGVtZW50IGJlYW4gPSAoQmVhbkVsZW1lbnQpYmVhbkVsZW1lbnQ7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCVAcGFnZSBjb250ZW50VHlwZT1cInRleHQvaHRtbDtjaGFyc2V0PVVURi04XCIlPiIpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxIVE1MPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SEVBRD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPFRJVExFPlJlc3VsdDwvVElUTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvSEVBRD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEJPRFk+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxIMT5SZXN1bHQ8L0gxPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0KLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8anNwOnVzZUJlYW4gaWQ9XCIiKyBnZXRTZXNzaW9uQmVhbklkKCkgKyAiXCIgc2NvcGU9XCJzZXNzaW9uXCIgY2xhc3M9XCIiKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKGJlYW4uZ2V0TmFtZSgpICsgIlwiIC8+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgaWYgKHNldEVuZHBvaW50TWV0aG9kICE9IG51bGwgJiYgc2V0RW5kcG9pbnRNZXRob2QubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCJpZiAocmVxdWVzdC5nZXRQYXJhbWV0ZXIoXCJlbmRwb2ludFwiKSAhPSBudWxsICYmIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFwiZW5kcG9pbnRcIikubGVuZ3RoKCkgPiAwKSIpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoZ2V0U2Vzc2lvbkJlYW5JZCgpKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIi4iKTsKLSAgICAgICAgaW50IGluZGV4ID0gc2V0RW5kcG9pbnRNZXRob2QuaW5kZXhPZignPycpOwotICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBmYnVmZmVyLmFwcGVuZChzZXRFbmRwb2ludE1ldGhvZC5zdWJzdHJpbmcoMCwgaW5kZXgpKTsKLSAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiKG5ldyAiKTsKLSAgICAgICAgICBmYnVmZmVyLmFwcGVuZChzZXRFbmRwb2ludE1ldGhvZC5zdWJzdHJpbmcoaW5kZXgrMSwgc2V0RW5kcG9pbnRNZXRob2QubGVuZ3RoKCkpKTsKLSAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFwiZW5kcG9pbnRcIikpKTsiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmYnVmZmVyLmFwcGVuZChzZXRFbmRwb2ludE1ldGhvZCk7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIihyZXF1ZXN0LmdldFBhcmFtZXRlcihcImVuZHBvaW50XCIpKTsiKTsKLSAgICAgICAgfQotICAgICAgICBmYnVmZmVyLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+Iik7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgfQotICAgICAgZmJ1ZmZlci5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7IAotICAgICAgICAgICAgCi0gICAgICAvL2NhcnJ5IG9uIHdpdGggcmVndWxhciBnb3JwCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiU3RyaW5nIG1ldGhvZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFwibWV0aG9kXCIpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJpbnQgbWV0aG9kSUQgPSAwOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJpZiAobWV0aG9kID09IG51bGwpIG1ldGhvZElEID0gLTE7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoImlmKG1ldGhvZElEICE9IC0xKSBtZXRob2RJRCA9IEludGVnZXIucGFyc2VJbnQobWV0aG9kKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7IAotICAgICAgZmJ1ZmZlci5hcHBlbmQoImJvb2xlYW4gZ290TWV0aG9kID0gZmFsc2U7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQotICAgICAgZmJ1ZmZlci5hcHBlbmQoInRyeSB7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoInN3aXRjaCAobWV0aG9kSUQpeyAiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgCi0gICAgICAvLyBnbyB0byB0aGUgbmV4dCBnZW5lcmF0b3IKLSAgICAgIE1ldGhvZFZpc2l0b3IgbWV0aG9kVmlzaXRvciA9IG5ldyBNZXRob2RWaXNpdG9yKCk7Ci0gICAgICBSZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IgcmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yID0gbmV3IFJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvcihmYnVmZmVyKTsgCi0gICAgICByZXN1bHRGaWxlSGVscDFHZW5lcmF0b3Iuc2V0TnVtYmVyRmFjdG9yeShnZXROdW1iZXJGYWN0b3J5KCkpOwotICAgICAgcmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yLnNldENsaWVudEZvbGRlclBhdGgoZ2V0Q2xpZW50Rm9sZGVyUGF0aCgpKTsKLSAgICAgIG1ldGhvZFZpc2l0b3IucnVuKGJlYW5FbGVtZW50LHJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvcik7Ci0gICAgICBzZXROdW1iZXJGYWN0b3J5KHJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5nZXROdW1iZXJGYWN0b3J5KCkpOwotCi0gICAgICBmYnVmZmVyID0gcmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotIAotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7ICAgIAotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7ICIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJleGNlcHRpb246IDwlPSBlICU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoInJldHVybjsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgifSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJpZighZ290TWV0aG9kKXsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgicmVzdWx0OiBOL0EiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgifSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0JPRFk+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvSFRNTD4iKTsKLQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIH0KLQotICAvKioKLSAgICogQHBhcmFtIHNldEVuZHBvaW50TWV0aG9kIFRoZSBzZXRFbmRwb2ludE1ldGhvZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXRFbmRwb2ludE1ldGhvZChTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2QpCi0gIHsKLSAgICB0aGlzLnNldEVuZHBvaW50TWV0aG9kID0gc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDYzYTE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uUGFyYW1ldGVyVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLlJldHVyblBhcmFtZXRlclZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgUmVzdWx0RmlsZWdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IgZXh0ZW5kcyBSZXN1bHRGaWxlR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9TVEFURSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTkFMX1NUQVRFID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVRFTVAgPSAibXRlbXAiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBCRUFOID0gIlByb3h5IjsKLQotICAvKioKLSAgKiBrZWVwcyB0aGUgc3RhdGUgb2YgdGhlIHZpc2l0b3IgCi0gICogKi8KLQotICBwcml2YXRlIGludCBmc3RhdGU7Ci0KLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIEBwYXJhbSBidWZmZXIgU3RyaW5nQnVmZmVyIG9iamVjdCB0aGF0IHRoaXMgY29kZSBnZW5lcmF0b3Igd3JpdGVzIHRvIAotICAqLwotICBwdWJsaWMgUmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIpOwotICAgICAgZnN0YXRlID0gSU5JVElBTF9TVEFURTsKLSAgICAKLSAgfQotICAKLSAgLyoqCi0gICogVmlzaXQgTWV0aG9kIGdlbmVyYXRlcyBjb2RlIGZvciB0aGlzIFZpc2l0b3IKLSAgKiBAcGFyYW0gbWV0aG9kIG1ldGhvZCBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciAKLSAgKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoRWxlbWVudClvYmplY3Q7Ci0gIAotCi0gICAgIE1ldGhvZEVsZW1lbnQgbWV0aG9kID0gKE1ldGhvZEVsZW1lbnQpbWV0aG9kRWxlbWVudDsKLSAgICAgaWYgKG1ldGhvZC5nZXRNZXRob2RPbW1pc3Npb24oKSkgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgIGZidWZmZXIuYXBwZW5kKCJjYXNlICIgKyBtZXRob2QuZ2V0TnVtYmVySUQoKSsgIjoiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIHZpc2l0SGVscGVyKG1ldGhvZCk7Ci0gICAgIAotICAgICBmYnVmZmVyLmFwcGVuZCgiYnJlYWs7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAKLSAgCi0gICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfSAgIAotICAvKioKLSAgKiBIZWxwcyBvdXQgdGhlIHZpc2l0b3IKLSAgKiBAcGFyYW0gbWV0aG9kIG1ldGhvZCBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciAKLSAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXRIZWxwZXIgKEVsZW1lbnQgbWV0aG9kRWxlbWVudCkKLSAgewotCi0gICAgIGZidWZmZXIuYXBwZW5kKEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImdvdE1ldGhvZCA9IHRydWU7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAKLSAgICAgTWV0aG9kRWxlbWVudCBtZXRob2QgPSAoTWV0aG9kRWxlbWVudCltZXRob2RFbGVtZW50OwotICAgICAvLyBnbyB0byB0aGUgbmV4dCBnZW5lcmF0b3IKLSAgICAgUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yIHJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvciA9IG5ldyBSZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IoZmJ1ZmZlcik7IAotICAgICByZXN1bHRGaWxlSGVscDJHZW5lcmF0b3Iuc2V0TnVtYmVyRmFjdG9yeShnZXROdW1iZXJGYWN0b3J5KCkpOwotICAgICBQYXJhbWV0ZXJWaXNpdG9yIHBhcmFtZXRlclZpc2l0b3IgPSBuZXcgUGFyYW1ldGVyVmlzaXRvcigpOwotICAgICBwYXJhbWV0ZXJWaXNpdG9yLnJ1bihtZXRob2RFbGVtZW50LHJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvcik7Ci0gICAgIGZidWZmZXIgPSByZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0gICAgIHNldE51bWJlckZhY3RvcnkocmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLmdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgIC8vIHdlIG11c3Qgbm93IGdyYWIgdGhlIHN0YXRlIGRhdGEgZnJvbSB0aGUgcmVzaWRlbnQgdmVjdG9yCi0gICAgIHNldFJlc2lkZW50VmVjdG9yKHJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvci5nZXRSZXNpZGVudFZlY3RvcigpKTsKLQotICAgICAKLSAgICAgLy90aGVyZSBpcyBubyByZXR1cm4gdHlwZSBpZiB2b2lkIG9jY3VycyAgICAKLSAgICAKLSAgICAgCi0gICAgIGlmIChtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpKQotICAgICAgICBmYnVmZmVyLmFwcGVuZChHZW5lcmF0b3IuRE9VQkxFX1RBQiArIGdldFNlc3Npb25CZWFuSWQoKSArICIuIiArbWV0aG9kLmdldE5hbWUoKSArICIoIik7Ci0KLSAgICAgZWxzZXsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyBtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpICsgR2VuZXJhdG9yLlNQQUNFICsgbWV0aG9kLmdldE1VSUQoKSArIE1URU1QICsgR2VuZXJhdG9yLlNQQUNFKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIj0iICsgR2VuZXJhdG9yLlNQQUNFICsgZ2V0U2Vzc2lvbkJlYW5JZCgpICsgIi4iICsgbWV0aG9kLmdldE5hbWUoKSArICIoIik7Ci0gICAgIH0KLQotICAgICBFbnVtZXJhdGlvbiBlID0gZlJlc2lkZW50VmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCIsIik7ICAgIAotICAgICB9Ci0gICAgIGZidWZmZXIuYXBwZW5kKCIpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgaWYgKCFtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpICYmICFtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuaXNQcmltaXRpdmUoKSl7Ci0gICAgICAgIC8vaW4gY2FzZSBvdXIgcmVzdWx0IGlzIG51bGwKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoImlmKCIgKyBtZXRob2QuZ2V0TVVJRCgpICsgIm10ZW1wID09IG51bGwpeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZCgiPCU9IiArIG1ldGhvZC5nZXRNVUlEKCkgKyAibXRlbXAgJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIn1lbHNleyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgfQotICAgICAKLSAgICAgLy9ub3cgbGV0cyBkaXNwbGF5IHRoZSByZXR1cm4gYmVhbgotICAgICAvLyBpZiBpdCBpcyBzaW1wbGUgd2UgZG9udCBuZWVkIHRvIHVzZSB0aGUgZ2VuZXJhdG9yCi0gICAgIAotICAgICBpZiAoIW1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0VHlwZUVsZW1lbnQoKS5nZXROYW1lKCkuZXF1YWxzKCJ2b2lkIikpewotICAgICAgICBpZiAobWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmlzU2ltcGxlKCkgCi0gICAgICAgICAgIHx8IFR5cGVGYWN0b3J5LnJlY29nbml6ZWRCZWFuKG1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0VHlwZUVsZW1lbnQoKS5nZXROYW1lKCkpCi0gICAgICAgICAgIHx8IFR5cGVGYWN0b3J5LmlzU3RhdGVMZXNzQmVhbihtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuZ2V0VHlwZU5hbWUoKSkKLSAgICAgICAgICAgfHwgVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZShtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuZ2V0VHlwZU5hbWUoKSkpewotICAgICAgICAgICBEYXRhVHlwZSBkYXRhVHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZVR5cGUobWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldFR5cGVOYW1lKCksbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRNVUlEKCkpOwotICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChkYXRhVHlwZS5UeXBlQ29udmVyc2lvbihtZXRob2QuZ2V0TVVJRCgpICsgTVRFTVApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlewotICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAgIElucHV0RmlsZUhlbHAyR2VuZXJhdG9yIGlucHV0RmlsZUhlbHAyR2VuZXJhdG9yID0gbmV3IElucHV0RmlsZUhlbHAyR2VuZXJhdG9yKGZidWZmZXIpOwotICAgICAgICAgICBpbnB1dEZpbGVIZWxwMkdlbmVyYXRvci5zZXRJbnN0YW5jZU5hbWUobWV0aG9kLmdldE1VSUQoKSArIE1URU1QKTsKLSAgICAgICAgICAgaW5wdXRGaWxlSGVscDJHZW5lcmF0b3Iuc2V0UmV0dXJuUGFyYW0odHJ1ZSk7Ci0gICAgICAgICAgIFJldHVyblBhcmFtZXRlclZpc2l0b3IgcmV0dXJuUGFyYW1ldGVyVmlzaXRvciA9IG5ldyBSZXR1cm5QYXJhbWV0ZXJWaXNpdG9yKCk7Ci0gICAgICAgICAgIHJldHVyblBhcmFtZXRlclZpc2l0b3IucnVuKG1ldGhvZCxpbnB1dEZpbGVIZWxwMkdlbmVyYXRvcik7Ci0gICAgICAgICAgIGZidWZmZXIgPSBpbnB1dEZpbGVIZWxwMkdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotCi0gICAgICAgIH0KLSAgICAgfQotCi0gICAgaWYgKCFtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpICAmJiAhbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmlzUHJpbWl0aXZlKCkpIGZidWZmZXIuYXBwZW5kKCJ9IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAgICAKLSAgICAKLSAgfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9SZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNGZlODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9SZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuUGFyYW1ldGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIFJlc3VsdEZpbGVIZWxwMmdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwcml2YXRlIFN0cmluZyBmVHlwZU93bmVySWQ7ICAKLQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIEBwYXJhbSBidWZmZXIgU3RyaW5nQnVmZmVyIG9iamVjdCB0aGF0IHRoaXMgY29kZSBnZW5lcmF0b3Igd3JpdGVzIHRvIAotICAqLwotICBwdWJsaWMgUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIpOwotICAgICAgCi0gIH0KLSAgCi0gIC8qKgotICAqIFZpc2l0IE1ldGhvZCBnZW5lcmF0ZXMgY29kZSBmb3IgdGhpcyBWaXNpdG9yCi0gICogQHBhcmFtIFBhcmFtZXRlciBwYXJhbWV0ZXIgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCAKLSAgKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIAotCi0gICAgIFBhcmFtZXRlckVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCA9IChQYXJhbWV0ZXJFbGVtZW50KW9iamVjdDsKLSAgICAgRWxlbWVudCBlbGVtZW50PSBwYXJhbWV0ZXJFbGVtZW50LmdldFR5cGVFbGVtZW50KCk7IAotICAgICBpZihwYXJhbWV0ZXJFbGVtZW50LmdldFR5cGVFbGVtZW50KCkuaXNTaW1wbGUoKSB8fCBUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihwYXJhbWV0ZXJFbGVtZW50LmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpKSl7ICAgICAgCi0gICAgICAgIC8vc3RhcnQgdGhlIGNvZGVnZW4KLSAgICAgICAgIC8vYXNrIHRoZSBkYXRhdHlwZSBmb3IgaXRzIHJlcXVlc3QgbGluZSwgaXQgbWF5IG5lZWQgbWFyayB1cCBvciBub3QuCi0gICAgICAgIC8vaWUgRm9yIHRoZSBzaW1wbGUgdHlwZXMgd2UgbmVlZCB0aGUgbWFyayB1cAotICAgICAgICAvL2ZvciB0aGUgZG9tIGVsZW1lbnQgd2UgY2FudCB1c2UgaXQuCi0gICAgICAgIERhdGFUeXBlIGRhdGFUeXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlVHlwZShwYXJhbWV0ZXJFbGVtZW50LmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpLHBhcmFtZXRlckVsZW1lbnQuZ2V0TVVJRCgpKTsKLSAgICAgICAgc2V0VHlwZU93bmVySWQoaWROYW1lKHBhcmFtZXRlckVsZW1lbnQuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKGRhdGFUeXBlLmdldFJlcXVlc3RDb2RlKHBhcmFtZXRlckVsZW1lbnQuZ2V0TVVJRCgpLGdldFR5cGVPd25lcklkKCkpKTsKLSAgICAgfQotICAgICAgICAgCi0gICAgIC8vdmlzaXQgdGhlIHR5cGUgZ2VuZXJhdG9yCi0gICAgIFJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yIHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yID0gbmV3IFJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yKGZidWZmZXIpOyAKLSAgICAgcmVzdWx0RmlsZVR5cGVHZW5lcmF0b3Iuc2V0TnVtYmVyRmFjdG9yeShnZXROdW1iZXJGYWN0b3J5KCkpOwotICAgICByZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5zZXRUeXBlT3duZXJJZChnZXRUeXBlT3duZXJJZCgpKTsKLSAgICAgVHlwZVZpc2l0b3IgVHlwZVZpc2l0b3IgPSBuZXcgVHlwZVZpc2l0b3IoKTsKLSAgICAgVHlwZVZpc2l0b3IucnVuKHBhcmFtZXRlckVsZW1lbnQscmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IpOwotICAgICBmYnVmZmVyID0gcmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0gICAgIHNldE51bWJlckZhY3RvcnkocmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IuZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKXJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmdldFJlc2lkZW50VmVjdG9yKCkuZmlyc3RFbGVtZW50KCk7Ci0gICAgIHB1dFJlc2lkZW50VmVjdG9yKG5hbWUpOyAKLSAgICAgCi0gICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlT3duZXJJZCgpCi0gIHsKLSAgICAgaWYgKGZUeXBlT3duZXJJZCA9PSBudWxsKSBmVHlwZU93bmVySWQgPSAiIjsgCi0gICAgIHJldHVybiBmVHlwZU93bmVySWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUeXBlT3duZXJJZChTdHJpbmcgbmFtZSkKLSAgewotICAgIGZUeXBlT3duZXJJZCA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGlkTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAJCi0gICAgU3RyaW5nIHVuaXF1ZU51bSA9IFN0cmluZy52YWx1ZU9mKGdldFVuaXF1ZU51bWJlcigpKTsKLSAgICBTdHJpbmcgbmV3TmFtZSA9IG5hbWUucmVwbGFjZSgnLicsJzEnKSArICJfIiArdW5pcXVlTnVtICsgImlkIjsKLSAgICByZXR1cm4gbmV3TmFtZTsKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiYWQ4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uQXR0cmlidXRlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLkZpZWxkVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIFJlc3VsdEZpbGVIZWxwMmdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHRGaWxlVHlwZUdlbmVyYXRvciBleHRlbmRzIFJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0KLSAgcHVibGljIFN0cmluZyBmVHlwZUlkTmFtZTsKLSAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogQHBhcmFtIGJ1ZmZlciBTdHJpbmdCdWZmZXIgb2JqZWN0IHRoYXQgdGhpcyBjb2RlIGdlbmVyYXRvciB3cml0ZXMgdG8gCi0gICovCi0gIHB1YmxpYyBSZXN1bHRGaWxlVHlwZUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgfQotICAKLSAgLyoqCi0gICogVmlzaXQgTWV0aG9kIGdlbmVyYXRlcyBjb2RlIGZvciB0aGlzIFZpc2l0b3IKLSAgKiBAcGFyYW0gUGFyYW1ldGVyIHBhcmFtZXRlciBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkIAotICAqLwotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgIEVsZW1lbnQgdHlwZUVsZW1lbnQgPSAoRWxlbWVudClvYmplY3Q7Ci0gICAgIFR5cGVFbGVtZW50IHR5cGUgPSAoVHlwZUVsZW1lbnQpdHlwZUVsZW1lbnQ7ICAgICAgCi0gICAgIC8vIHJpZ2h0IG5vdyB3ZSBvbmx5IGhhdmUgc2ltcGxlIHRvIHdvcnJ5IGFib3V0Ci0gICAgIGlmKHR5cGUuaXNTaW1wbGUoKSB8fCBUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbih0eXBlLmdldE5hbWUoKSkpewotICAgICAgIC8vIGNyZWF0ZSB0aGUgdHlwZSB0aGF0IHJlcHJlc2VudHMgdGhlIHNpbXBsZSB0eXBlIG5hbWUKLSAgICAgICBEYXRhVHlwZSBkYXRhVHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZVR5cGUodHlwZS5nZXROYW1lKCksdHlwZS5nZXRPd25pbmdFbGVtZW50KCkuZ2V0TVVJRCgpKTsKLSAgCi0gICAgICAgU3RyaW5nIG5vZGVOYW1lID0gZ2V0VHlwZU93bmVySWQoKSsgIlRlbXAiOwotICAgICAgIGZidWZmZXIuYXBwZW5kKGRhdGFUeXBlLnN0cmluZ0NvbnZlcnNpb24odHlwZS5nZXROYW1lKCksbm9kZU5hbWUsZ2V0VHlwZU93bmVySWQoKSkpOwotCi0gICAgICAgcHV0UmVzaWRlbnRWZWN0b3Iobm9kZU5hbWUpOwotICAgICB9Ci0KLSAgICAgZWxzZSB7Ci0gICAgICAgLy9tdXN0IGJlIGNvbXBsZXgKLSAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSB0eXBlRWxlbWVudC5nZXROYW1lKCk7IAotICAgICAgIGZUeXBlSWROYW1lID0gaWROYW1lKHR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgQXR0cmlidXRlVmlzaXRvciBhdHRyaWJ1dGVWaXNpdG9yID0gbmV3IEF0dHJpYnV0ZVZpc2l0b3IoKTsKLSAgICAgICBSZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yIHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgPSBuZXcgUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcihmYnVmZmVyKTsKLSAgICAgICByZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnJ1bih0eXBlRWxlbWVudCxyZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yKTsKLSAgICAgICBzZXROdW1iZXJGYWN0b3J5KHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgICBmYnVmZmVyID0gcmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgIEZpZWxkVmlzaXRvciBmaWVsZFZpc2l0b3IgPSBuZXcgRmllbGRWaXNpdG9yKCk7Ci0gICAgICAgUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvciByZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMiA9IG5ldyBSZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yKGZidWZmZXIpOwotICAgICAgIHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgICBmaWVsZFZpc2l0b3IucnVuKHR5cGVFbGVtZW50LHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyKTsKLSAgICAgICBzZXROdW1iZXJGYWN0b3J5KHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyLmdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgICAgZmJ1ZmZlciA9IHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyLmdldFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAKLSAgICAgICBmYnVmZmVyLmFwcGVuZChHZW5lcmF0b3IuRE9VQkxFX1RBQiArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICBmYnVmZmVyLmFwcGVuZChHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8anNwOnVzZUJlYW4gaWQ9XCIiICsgZlR5cGVJZE5hbWUgKyAiXCIgc2NvcGU9XCJzZXNzaW9uXCIgY2xhc3M9XCIiICsgdHlwZU5hbWUgKyAiXCIgLz4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAKLSAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5nZXRSZXNpZGVudFZlY3RvcigpLmVsZW1lbnRzKCk7Ci0gICAgICAgd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyBmVHlwZUlkTmFtZSArICIuIiArIGUubmV4dEVsZW1lbnQoKSArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgIH0KLQotICAgICAgIEVudW1lcmF0aW9uIGUyID0gcmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcjIuZ2V0UmVzaWRlbnRWZWN0b3IoKS5lbGVtZW50cygpOwotICAgICAgIHdoaWxlKGUyLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgICAgICBmYnVmZmVyLmFwcGVuZChHZW5lcmF0b3IuRE9VQkxFX1RBQiArIGZUeXBlSWROYW1lICsgIi4iICsgZTIubmV4dEVsZW1lbnQoKSArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgIH0gCi0gICAgICAgcHV0UmVzaWRlbnRWZWN0b3IoZlR5cGVJZE5hbWUpOwotICAgICAgIC8vZW5kIG9mIGNoYW5nZXMKLSAgICAgCi0gICAgfQotICAgICAKLSAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9ICAgCi0gIAotCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9UZXN0Q2xpZW50RmlsZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9UZXN0Q2xpZW50RmlsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmZiODhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vVGVzdENsaWVudEZpbGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgVGVzdENsaWVudEZpbGVnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgVGVzdENsaWVudEZpbGVHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHB1YmxpYyBTdHJpbmcgZk1ldGhvZE5hbWU7Ci0gIHB1YmxpYyBTdHJpbmcgZklucHV0TmFtZTsKLSAgcHVibGljIFN0cmluZyBmUmVzdWx0TmFtZTsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqCi0gICovCi0gIHB1YmxpYyBUZXN0Q2xpZW50RmlsZUdlbmVyYXRvciAoU3RyaW5nIGlucHV0cywgU3RyaW5nIG1ldGhvZHMsIFN0cmluZyByZXN1bHRzKQotICB7Ci0gICAgIHN1cGVyKCk7Ci0gICAgIGZJbnB1dE5hbWUgPSBpbnB1dHM7Ci0gICAgIGZNZXRob2ROYW1lID0gbWV0aG9kczsKLSAgICAgZlJlc3VsdE5hbWUgPSByZXN1bHRzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWVzKFN0cmluZyBpbnB1dHMsIFN0cmluZyBtZXRob2RzLCBTdHJpbmcgcmVzdWx0cykKLSAgewotICAgIGZJbnB1dE5hbWUgPSBpbnB1dHM7Ci0gICAgZk1ldGhvZE5hbWUgPSBtZXRob2RzOwotICAgIGZSZXN1bHROYW1lID0gcmVzdWx0czsKLSAgfQotCi0gIC8vdGFrZXMgaW4gYSBiZWFuIG5vZGUKLSAgIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gICB7Ci0gICAgICBFbGVtZW50IGJlYW5FbGVtZW50ID0gKEVsZW1lbnQpb2JqZWN0OwotICAgICAgCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCVAcGFnZSBjb250ZW50VHlwZT1cInRleHQvaHRtbDtjaGFyc2V0PVVURi04XCIlPiIpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxIVE1MPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SEVBRD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPFRJVExFPldlYiBTZXJ2aWNlcyBUZXN0IENsaWVudDwvVElUTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvSEVBRD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICIiKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8RlJBTUVTRVQgIENPTFM9XCIyMjAsKlwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8RlJBTUUgU1JDPVwiIisgZk1ldGhvZE5hbWUgKyAiXCIgTkFNRT1cIm1ldGhvZHNcIiBNQVJHSU5XSURUSD1cIjFcIiBNQVJHSU5IRUlHSFQ9XCIxXCIgU0NST0xMSU5HPVwieWVzXCIgRlJBTUVCT1JERVI9XCIxXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGUkFNRVNFVCAgUk9XUz1cIjgwJSwyMCVcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEZSQU1FIFNSQz1cIiIrIGZJbnB1dE5hbWUgICsgIlwiIE5BTUU9XCJpbnB1dHNcIiAgTUFSR0lOV0lEVEg9XCIxXCIgTUFSR0lOSEVJR0hUPVwiMVwiIFNDUk9MTElORz1cInllc1wiIEZSQU1FQk9SREVSPVwiMVwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIpLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJTdHJpbmdCdWZmZXIgcmVzdWx0SlNQID0gbmV3IFN0cmluZ0J1ZmZlcihcIiIpLmFwcGVuZChmUmVzdWx0TmFtZSkuYXBwZW5kKCJcIik7IikuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoInJlc3VsdEpTUC5hcHBlbmQoXCI/XCIpOyIpLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJqYXZhLnV0aWwuRW51bWVyYXRpb24gcmVzdWx0RW51bSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsiKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ3aGlsZSAocmVzdWx0RW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeyIpLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJPYmplY3QgcmVzdWx0T2JqID0gcmVzdWx0RW51bS5uZXh0RWxlbWVudCgpOyIpLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJyZXN1bHRKU1AuYXBwZW5kKHJlc3VsdE9iai50b1N0cmluZygpKS5hcHBlbmQoXCI9XCIpLmFwcGVuZChyZXF1ZXN0LmdldFBhcmFtZXRlcihyZXN1bHRPYmoudG9TdHJpbmcoKSkpLmFwcGVuZChcIiZcIik7IikuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0iKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEZSQU1FIFNSQz1cIjwlPXJlc3VsdEpTUC50b1N0cmluZygpJT5cIiBOQU1FPVwicmVzdWx0XCIgIE1BUkdJTldJRFRIPVwiMVwiIE1BUkdJTkhFSUdIVD1cIjFcIiBTQ1JPTExJTkc9XCJ5ZXNcIiBGUkFNRUJPUkRFUj1cIjFcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9GUkFNRVNFVD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0KLQotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxOT0ZSQU1FUz4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEJPRFk+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIlRoZSBXZWIgU2VydmljZXMgVGVzdCBDbGllbnQgcmVxdWlyZXMgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMgZnJhbWVzLiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0JPRFk+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvTk9GUkFNRVM+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvRlJBTUVTRVQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvSFRNTD4iKTsKLQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tYW5kL0dlbmVyYXRlUGFnZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvbW1hbmQvR2VuZXJhdGVQYWdlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjNiNTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvbW1hbmQvR2VuZXJhdGVQYWdlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLQotLyoqCi0gKiBNb2ZUb0JlYW5Nb2RlbENvbW1hbmQKLSAqIENyZWF0aW9uIGRhdGU6ICg0LzEwLzIwMDEgMTI6NDE6NDggUE0pCi0gKiBAYXV0aG9yOiBHaWxiZXJ0IEFuZHJld3MKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlUGFnZUNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQkJCi1wcml2YXRlIFN0cmluZyBMQUJFTCA9ICJHZW5lcmF0ZVBhZ2VDb21tYW5kIjsKLXByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIkdlbmVyYXRlIGNvZGUgYmFzZWQgb24gdGhlIG1vZGVsIjsKLXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotcHJpdmF0ZSBNb2RlbCBtb2RlbF87Ci1wcml2YXRlIEdlbmVyYXRvciBmR2VuZXJhdG9yOwotcHJpdmF0ZSBJRmlsZSBmSUZpbGU7Ci1wcml2YXRlIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHRfOwotcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlN0cmluZ0J1ZmZlcjsKLQotcHJpdmF0ZSBFbGVtZW50IHJvb3RFbGVtZW50XzsKLS8qKgotICogQnVpbGQgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEdlbmVyYXRlUGFnZUNvbW1hbmQoKQotewotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLQlzZXROYW1lKExBQkVMKTsgIAkJCi19Ci0KLS8qKgotKiBDb25zdHJ1Y3RvcgotKiBUaGlzIGNvbW1hbmQgd2lsbCBnZW5lcmF0ZSBjb2RlIGZyb20gYSBNb2RlbAotKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRvIGJlIHRyYXZlcnNlZAotKiBAcGFyYW0gZ2VuZXJhdG9yIFRoZSBjb2RlIGdlbmVyYXRvciB0byBiZSB1c2VkCi0qIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gcGxhY2UgdGhlIGZpbmlzaGVkIHByb2R1Y3QKLSovCi1wdWJsaWMgR2VuZXJhdGVQYWdlQ29tbWFuZChSZXNvdXJjZUNvbnRleHQgY29udGV4dCwgTW9kZWwgbW9kZWwsIEdlbmVyYXRvciBnZW5lcmF0b3IsIElGaWxlIGZpbGUpCi17Ci0gIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotICBzZXROYW1lKExBQkVMKTsJCi0gIAotICBtb2RlbF8gPSBtb2RlbDsKLSAgZkdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLSAgZklGaWxlID0gZmlsZTsKLSAgcmVzb3VyY2VDb250ZXh0XyA9IGNvbnRleHQ7Ci19Ci0KLXB1YmxpYyBNb2RlbCBnZXREYXRhTW9kZWwoKQotewotICByZXR1cm4gbW9kZWxfOwotfQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi17Ci0gIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICB0cnkgewotICAgIGZHZW5lcmF0b3IudmlzaXQobW9kZWxfLmdldFJvb3RFbGVtZW50KCkpOwotICAgIGZTdHJpbmdCdWZmZXIgPSBmR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgIFN0cmluZyB0ZW1wU3RyaW5nID0gZlN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotICAgIE91dHB1dFN0cmVhbSBmaWxlUmVzb3VyY2UgPSBGaWxlUmVzb3VyY2VVdGlscy5uZXdGaWxlT3V0cHV0U3RyZWFtKHJlc291cmNlQ29udGV4dF8sIGZJRmlsZS5nZXRGdWxsUGF0aCgpLCBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkpOwotICAgIC8vUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0oZmlsZVJlc291cmNlKTsKLSAgICAvL3BzLnByaW50KHRlbXBTdHJpbmcpOwotICAgIE91dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZpbGVSZXNvdXJjZSwiVVRGLTgiKTsKLSAgICBvc3cud3JpdGUodGVtcFN0cmluZywwLGZTdHJpbmdCdWZmZXIubGVuZ3RoKCkpOyAgCi0gICAgb3N3LmNsb3NlKCk7Ci0gICAgZmlsZVJlc291cmNlLmNsb3NlKCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9leGMpIHsKLSAgCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIGlvZXhjLmdldE1lc3NhZ2UoKSwgU3RhdHVzLkVSUk9SKTsKLSAgCXJldHVybiBzdGF0dXM7Ci0gIH0KLX0KLQotcHVibGljIHZvaWQgc2V0Um9vdEVsZW1lbnQoRWxlbWVudCByb290RWxlbWVudCkKLXsKLSAgcm9vdEVsZW1lbnRfID0gcm9vdEVsZW1lbnQ7Ci19Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29tbWFuZC9KYXZhVG9Nb2RlbENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvbW1hbmQvSmF2YVRvTW9kZWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYjcwMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29tbWFuZC9KYXZhVG9Nb2RlbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9ucy5KYXZhTW9mQmVhblZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZCZWFuVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLkJvb2xlYW5TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBjb21tYW5kcyB0aGF0IG5lZWQgdG8gcmVwb3J0IHByb2dyZXNzCi0qIGFuZCBzdGF0dXMgZHVyaW5nIGFuZCBhZnRlciB0aGVpciBleGVjdXRpb24uIFRoaXMgY2xhc3MgZXh0ZW5kcwotKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCBBYnN0cmFjdENvbW1hbmR9Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSogd2l0aCBtZXRob2RzIHRvIHtAbGluayAjc2V0UHJvZ3Jlc3NNb25pdG9yIHNldH0KLSogYW5kIHtAbGluayAjZ2V0UHJvZ3Jlc3NNb25pdG9yIGdldH0gYSBwcm9ncmVzcyBtb25pdG9yLAotKiBhbmQgdG8gZ2V0IGEgc3RhdHVzIG9iamVjdCB7QGxpbmsgI2dldFJlYWR5U3RhdHVzIGJlZm9yZX0KLSogb3Ige0BsaW5rICNnZXRSZXN1bHRTdGF0dXMgYWZ0ZXJ9IGV4ZWN1dGlvbi4KLSogPHA+Ci0qIE5vdGUgdGhhdCB0aGUgcmVzcG9uc2liaWxpdHkgb2YgcHJvdmlkaW5nIGFuCi0qIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yfQotKiByZXN0cyB3aXRoIGZyYW1ld29ya3MgdGhhdCBjb25zdHJ1Y3Qgb3IgcnVuIFByb2dyZXNzQ29tbWFuZCBvYmplY3RzLAotKiB3aGVyZWFzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBwcm92aWRpbmcgYW4KLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9Ci0qIG9iamVjdCBsaWVzIHdpdGggdGhlIHN1YmNsYXNzZXMgb2YgUHJvZ3Jlc3NDb21tYW5kLgotKiBTdWJjbGFzc2VzIG11c3QgZm9sbG93IHRoZSBydWxlcyBkZXNjcmliZWQgZm9yCi0qIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kIEFic3RyYWN0Q29tbWFuZH0uCi0qLwotcHVibGljIGNsYXNzIEphdmFUb01vZGVsQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0gIHByaXZhdGUgSVJlc291cmNlIHJlc291cmNlOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRQcm9qZWN0OwotICBwcml2YXRlIEJvb2xlYW5TZWxlY3Rpb25bXSBtZXRob2RzOwotICBwcml2YXRlIFN0cmluZyBwcm94eUJlYW47Ci0gIHByaXZhdGUgSmF2YUNsYXNzIGphdmFDbGFzczsKLSAgcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLSAgcHJpdmF0ZSBFbGVtZW50IHBhcmVudEVsZW1lbnQ7Ci0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gIkphdmFUb01vZGVsQ29tbWFuZCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OID0gInRoaXMgY3JlYXRlcyBhIG1vZGVsIGZyb20gYSByZXNvdXJjZSI7Ci0gCi0gIAotCi0gIHB1YmxpYyBKYXZhVG9Nb2RlbENvbW1hbmQgKCkKLSAgewotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7ICAJCi0gIAlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gIAlzZXROYW1lKExBQkVMKTsKLSAgfQotCi0gIAotICBwcml2YXRlIFN0YXR1cyBjcmVhdGVKYXZhUmVmbGVjdGlvbihFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YU1vZlJlZmxlY3Rpb25Db21tYW5kID0gbmV3IEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCgpOwotICAgIGphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5zZXRDbGllbnRQcm9qZWN0KGNsaWVudFByb2plY3QpOwotICAgIGphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5zZXRQcm94eUJlYW4ocHJveHlCZWFuKTsKLSAgICAvL2phdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgc3RhdHVzID0gamF2YU1vZlJlZmxlY3Rpb25Db21tYW5kLmV4ZWN1dGUoZW52KTsKLSAgICBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5nZXRKYXZhQ2xhc3MoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICogVGhlIE1vZGVsIHRoYXQgd2FzIGNyZWF0ZWQgZnJvbSB0aGlzIGphdmFtb2YKLSAgKiBAcmV0dXJuIE1vZGVsIFRoZSBkYXRhIG1vZGVsIHRoYXQgd2FzIGNyZWF0ZWQKLSAgKiovCi0gIHB1YmxpYyBNb2RlbCBnZXREYXRhTW9kZWwoKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsOwotICB9Ci0KLSAgLyoqCi0gICogQnVpbGQgdGhlIGRhdGFtb2RlbCBmcm9tIHRoZSBtb2YKLSAgKi8KLSAgcHVibGljIFN0YXR1cyBidWlsZE1vZGVsRnJvbU1vZiAoRW52aXJvbm1lbnQgZW52KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gIAkKLSAgCUNob2ljZSBPS0Nob2ljZSA9IG5ldyBDaG9pY2UoJ08nLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9PSyIpLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9PSyIpKTsKLSAgCUNob2ljZSBDYW5jZWxDaG9pY2UgPSBuZXcgQ2hvaWNlKCdDJywgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTEFCRUxfQ0FOQ0VMIiksIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkRFU0NSSVBUSU9OX0NBTkNFTCIpKTsKLSAgCQotICAgIC8vIHdlIGNvdWxkIGhhdmUgb25lIG9mIHRocmVlIGNhc2VzOgotICAgIC8vMS4gVGhlIG1vZGVsIGlzIG51bGwgbWVhbmluZyB3ZSB3YW50IGFuZCB0aGUgcGFyZW50IGVsZW1lbnQgaXMgbnVsbCwgbWVhbmluZyB3ZSB3YW50IHRvCi0gICAgLy8gICBjcmVhdGUgYSBicmFuZCBuZXcgbW9kZWwgYW5kIG1ha2UgdGhpcyBiZWFuIGl0cyByb290Ci0gICAgLy8yLiBUaGUgbW9kZWwgaXMgbnVsbCBidXQgdGhlIHBhcmVudEVsZW1lbnQgaXMgbm90LCBtZWFuaW5nIHdlIHdhbnQgdG8gYWRkIHRoZSBCZWFuIHRvIHRoZQotICAgIC8vICAgZ2l2ZW4gcGFyZW50IGVsZW1lbnQKLSAgICAvLzMuIFRoZSBtb2RlbCBpcyBub3QgbnVsbCBob3dldmVyIHRoZSBwYXJlbnRFbGVtZW50IGlzLCBtZWFuaW5nIHdlIHdhbnQgdG8gYWRkIHRoaXMgQmVhbiB0bwotICAgIC8vICAgVGhpcyBtb2RlbCBidXQgZG9udCBhdHRhY2ggaXQgdG8gYW55dGhpbmcKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQotICAgICAgaWYobW9kZWwgPT0gbnVsbCAmJiBwYXJlbnRFbGVtZW50ID09IG51bGwpewotICAgICAgICAgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uIGJlYW5WaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbihjbGllbnRQcm9qZWN0LG1ldGhvZHMsIGVudik7Ci0gICAgICAgICAvL2JlYW5WaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLQkgICAgIEphdmFNb2ZCZWFuVmlzaXRvciBiZWFuVmlzaXRvciA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3IoKTsKLSAgICAgICAgIHN0YXR1cyA9IGJlYW5WaXNpdG9yLnJ1bihqYXZhQ2xhc3MsYmVhblZpc2l0b3JBY3Rpb24pOwotICAgICAgICAgLy8KLSAgICAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgICAgICAgCXJldHVybiBzdGF0dXM7Ci0gICAgICAgICAKLSAgICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgICAgICB7Ci0gICAgICAgICAgIENob2ljZSByZXN1bHQgPSBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMsIG5ldyBDaG9pY2VbXXtPS0Nob2ljZSwgQ2FuY2VsQ2hvaWNlfSk7Ci0gICAgICAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgIAkgLy9yZXR1cm4gYW4gZXJyb3Igc3RhdHVzIHNpbmNlIHRoZSB1c2VyIGNhbmNlbGVkCi0gICAgICAgICAgIAkgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgCQotICAgICAgICAgfQotICAgICAgICAgLy8KLSAgICAgICAgIG1vZGVsID0gYmVhblZpc2l0b3JBY3Rpb24uZ2V0TW9kZWwoKTsKLQotICAgICAgfQotICAgICAgZWxzZSBpZiAobW9kZWwgPT0gbnVsbCAmJiBwYXJlbnRFbGVtZW50ICE9IG51bGwpewotICAgICAgICAgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uIGJlYW5WaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbihwYXJlbnRFbGVtZW50LGNsaWVudFByb2plY3QsIGVudik7Ci0gICAgICAgICAvL2JlYW5WaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLQkgICAgIEphdmFNb2ZCZWFuVmlzaXRvciBiZWFuVmlzaXRvciA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3IoKTsKLSAgICAgICAgIHN0YXR1cyA9IGJlYW5WaXNpdG9yLnJ1bihqYXZhQ2xhc3MsYmVhblZpc2l0b3JBY3Rpb24pOwotICAgICAgICAgLy8KLSAgICAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgICAgICAgCXJldHVybiBzdGF0dXM7Ci0gICAgICAgICAKLSAgICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgICAgICB7Ci0gICAgICAgICAgIENob2ljZSByZXN1bHQgPSBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMsIG5ldyBDaG9pY2VbXXtPS0Nob2ljZSwgQ2FuY2VsQ2hvaWNlfSk7Ci0gICAgICAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgIAkgLy9yZXR1cm4gYW4gZXJyb3Igc3RhdHVzIHNpbmNlIHRoZSB1c2VyIGNhbmNlbGVkCi0gICAgICAgICAgIAkgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgCQotICAgICAgICAgfQotICAgICAgICAgLy8gICAgICAgICAKLSAgICAgICAgIG1vZGVsID0gYmVhblZpc2l0b3JBY3Rpb24uZ2V0TW9kZWwoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uIGJlYW5WaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbihtb2RlbCxjbGllbnRQcm9qZWN0LCBlbnYpOwotICAgICAgICAgLy9iZWFuVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0JICAgICBKYXZhTW9mQmVhblZpc2l0b3IgYmVhblZpc2l0b3IgPSBuZXcgSmF2YU1vZkJlYW5WaXNpdG9yKCk7Ci0gICAgICAgICBzdGF0dXMgPSBiZWFuVmlzaXRvci5ydW4oamF2YUNsYXNzLGJlYW5WaXNpdG9yQWN0aW9uKTsKLSAgICAgICAgIC8vCi0gICAgICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgICAgCi0gICAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgICAgewotICAgICAgICAgICBDaG9pY2UgcmVzdWx0ID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAgICAJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIAkKLSAgICAgICAgIH0KLSAgICAgICAgIC8vICAgICAgICAgCi0gICAgICAgICBtb2RlbCA9IGJlYW5WaXNpdG9yQWN0aW9uLmdldE1vZGVsKCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgKiBHZXQgdGhlIGphdmEgbW9kZWwgZnJvbSB0aGUgcmVzb3VyY2UgdGhlbgotICAqIGJ1aWxkIHRoZSBtb2RlbCBmcm9tIHRoZSBtb2YKLSAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIGlmKGNsaWVudFByb2plY3QgPT0gbnVsbCkgcmV0dXJuIHN0YXR1czsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKGNsaWVudFByb2plY3QpOwotICAgIAotICAJc3RhdHVzID0gY3JlYXRlSmF2YVJlZmxlY3Rpb24oZW52KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICB0cnl7Ci0gICAgICBzdGF0dXMgPSBidWlsZE1vZGVsRnJvbU1vZihlbnYpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Y2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpewotICAgICAgSVN0YXR1cyBlbWJlZGRlZFN0YXR1cyA9IGV4Yy5nZXRTdGF0dXMoKTsKLSAgICAgIHN0YXR1cyA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHNldE1ldGhvZHMoQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHMpCi0gIHsKLSAgCXRoaXMubWV0aG9kcyA9ICBtZXRob2RzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0KFN0cmluZyBjbGllbnRQcm9qZWN0KQotICB7Ci0gIAl0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRFbGVtZW50KEVsZW1lbnQgcGFyZW50RWxlbWVudCkKLSAgewotICAJdGhpcy5wYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudDsKLSAgfQotICAgICAKLSAgcHVibGljIHZvaWQgc2V0UHJveHlCZWFuKFN0cmluZyBwcm94eUJlYW4pCi0gIHsKLSAgCXRoaXMucHJveHlCZWFuID0gcHJveHlCZWFuOwotICB9Ci0KLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvbW1vbi9TYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvbW1vbi9TYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRmNGIwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tb24vU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgUHJvcGVydHlEZXNjcmlwdG9yLgotKiAqLwotcHVibGljIGNsYXNzIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHByaXZhdGUgTWV0aG9kIGZSZWFkTWV0aG9kOwotICBwcml2YXRlIE1ldGhvZCBmV3JpdGVNZXRob2Q7Ci0gIHByaXZhdGUgU3RyaW5nIGZQcm9wZXJ0eU5hbWU7Ci0gIHByaXZhdGUgSmF2YUhlbHBlcnMgZlByb3BlcnR5VHlwZTsgCi0gIHByaXZhdGUgYm9vbGVhbiBmU3RhdGljOwotICAKLSAgLyoKLSAgKiBDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgbmFtZSkKLSAgewotICAgIGZQcm9wZXJ0eU5hbWUgPSBuYW1lOyAKLSAgfQotCi0gIC8qCi0gICogc2V0IHRoZSBSZWFkTWV0aG9kCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFJlYWRNZXRob2QoTWV0aG9kIHJlYWRNZXRob2QpCi0gIHsKLSAgICBmUmVhZE1ldGhvZCA9IHJlYWRNZXRob2Q7Ci0gIH0KLQotICAgLyoKLSAgKiBnZXQgdGhlIFJlYWRNZXRob2QgCi0gICovCi0gIHB1YmxpYyBNZXRob2QgZ2V0UmVhZE1ldGhvZCgpCi0gIHsKLSAgICByZXR1cm4gZlJlYWRNZXRob2Q7Ci0gIH0KLQotICAvKgotICAqIHNldCB0aGUgd3JpdGVNZXRob2QKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3JpdGVNZXRob2QoTWV0aG9kIHdyaXRlTWV0aG9kKQotICB7Ci0gICAgZldyaXRlTWV0aG9kID0gd3JpdGVNZXRob2Q7Ci0gIH0KLQotICAgLyoKLSAgKiBnZXQgdGhlIHdyaXRlTWV0aG9kIAotICAqLwotICBwdWJsaWMgTWV0aG9kIGdldFdyaXRlTWV0aG9kKCkKLSAgewotICAgIHJldHVybiBmV3JpdGVNZXRob2Q7Ci0gIH0KLQotICAvKgotICAqIHNldCB0aGUgcHJvcGVydHlOYW1lCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmUHJvcGVydHlOYW1lPSBuYW1lOwotICB9Ci0KLSAgIC8qCi0gICogZ2V0IHRoZSBwcm9wZXJ0eU5hbWUKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBmUHJvcGVydHlOYW1lOwotICB9Ci0KLSAgLyoKLSAgKiBzZXQgdGhlIFByb3BlcnR5VHlwZQotICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVR5cGUoSmF2YUhlbHBlcnMgcHJvcGVydHlUeXBlKQotICB7Ci0gICAgZlByb3BlcnR5VHlwZSA9IHByb3BlcnR5VHlwZTsKLSAgfQotCi0gICAvKgotICAqIGdldCB0aGUgUHJvcGVydHlUeXBlIAotICAqLwotICBwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0UHJvcGVydHlUeXBlKCkKLSAgewotICAgIHJldHVybiBmUHJvcGVydHlUeXBlOwotICB9Ci0gICAgICAKLSAgcHVibGljIGJvb2xlYW4gaXNmU3RhdGljKCkKLSAgewotICAJcmV0dXJuIGZTdGF0aWM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRmU3RhdGljKGJvb2xlYW4gZlN0YXRpYykKLSAgewotICAgIHRoaXMuZlN0YXRpYyA9IGZTdGF0aWM7CQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL0lXU0ZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9JV1NGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VhN2ZmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL0lXU0ZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi53c2ZpbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElXU0ZpbmRlcgotewotICBwdWJsaWMgU3RyaW5nIGdldElEKCk7Ci0gIHB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBpZCk7Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpOwotCi0gIHB1YmxpYyBMaXN0IGZpbmQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvTGl2ZVdTRExGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvTGl2ZVdTRExGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhZTQ5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL0xpdmVXU0RMRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi53c2ZpbmRlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIExpdmVXU0RMRmlsdGVyIGV4dGVuZHMgVGhyZWFkCi17Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUkxfOwotICBwcml2YXRlIGJvb2xlYW4gZmluaXNoXzsKLSAgcHJpdmF0ZSBib29sZWFuIGxpdmVfOwotCi0gIHB1YmxpYyBMaXZlV1NETEZpbHRlcihTdHJpbmcgd3NkbFVSTCkKLSAgewotICAgIHdzZGxVUkxfID0gd3NkbFVSTDsKLSAgICBmaW5pc2hfID0gZmFsc2U7Ci0gICAgbGl2ZV8gPSBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETFVSTCgpCi0gIHsKLSAgICByZXR1cm4gd3NkbFVSTF87Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaCgpCi0gIHsKLSAgICByZXR1cm4gZmluaXNoXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzV1NETExpdmUoKQotICB7Ci0gICAgcmV0dXJuIGxpdmVfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGxpdmVfID0gdmFsaWRhdGVXU0RMKCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICBsaXZlXyA9IGZhbHNlOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZmluaXNoXyA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlV1NETCgpIHRocm93cyBXU0RMRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbgotICB7Ci0gIAlXZWJTZXJ2aWNlc1BhcnNlckV4dCBwYXJzZXIgPSBuZXcgV2ViU2VydmljZXNQYXJzZXJFeHQoKTsKLSAgCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IHBhcnNlci5nZXRXU0RMRGVmaW5pdGlvblZlcmJvc2Uod3NkbFVSTF8pOwotICAgIE1hcCBzZXJ2aWNlcyA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICBJdGVyYXRvciBzZXJ2aWNlSXRlcmF0b3IgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChzZXJ2aWNlSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKXNlcnZpY2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBNYXAgcG9ydHMgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICBJdGVyYXRvciBwb3J0SXRlcmF0b3IgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKHBvcnRJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KXBvcnRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgSXRlcmF0b3IgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzSXRlcmF0b3IgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGV4dGVuc2liaWxpdHlFbGVtZW50c0l0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWV4dGVuc2liaWxpdHlFbGVtZW50c0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICBpZiAoKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHx8IChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIEhUVFBBZGRyZXNzKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9XU0ZpbmRlckNvbW1vbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9XU0ZpbmRlckNvbW1vbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2MxY2M4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvV1NGaW5kZXJDb21tb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLndzZmluZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb2plY3QuRUpCTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklFSkJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5JV2ViTmF0dXJlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkoyRUVXZWJOYXR1cmVSdW50aW1lOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NGaW5kZXJDb21tb24gaW1wbGVtZW50cyBJV1NGaW5kZXIKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgaWRfOwotICBwcml2YXRlIFN0cmluZyBuYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVzY187Ci0KLSAgcHVibGljIFdTRmluZGVyQ29tbW9uKCkKLSAgewotICAgIGlkXyA9IG51bGw7Ci0gICAgbmFtZV8gPSBudWxsOwotICAgIGRlc2NfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKQotICB7Ci0gICAgcmV0dXJuIGlkXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBpZCkKLSAgewotICAgIGlkXyA9IGlkOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBuYW1lXyA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBkZXNjXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKQotICB7Ci0gICAgZGVzY18gPSBkZXNjOwotICB9Ci0KLSAgcHJvdGVjdGVkIElQcm9qZWN0W10gZ2V0V29ya3NwYWNlUHJvamVjdHMoKQotICB7Ci0gICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgcmV0dXJuIHJvb3QuZ2V0UHJvamVjdHMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBKMkVFV2ViTmF0dXJlUnVudGltZSBnZXRXZWJOYXR1cmUoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElQcm9qZWN0TmF0dXJlIG5hdHVyZSA9IHByb2plY3QuZ2V0TmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpOwotICAgICAgaWYgKG5hdHVyZSAhPSBudWxsICYmIG5hdHVyZSBpbnN0YW5jZW9mIEoyRUVXZWJOYXR1cmVSdW50aW1lKQotICAgICAgICByZXR1cm4gKEoyRUVXZWJOYXR1cmVSdW50aW1lKW5hdHVyZTsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCBFSkJOYXR1cmVSdW50aW1lIGdldEVKQk5hdHVyZShJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVByb2plY3ROYXR1cmUgbmF0dXJlID0gcHJvamVjdC5nZXROYXR1cmUoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpOwotICAgICAgaWYgKG5hdHVyZSAhPSBudWxsICYmIG5hdHVyZSBpbnN0YW5jZW9mIEVKQk5hdHVyZVJ1bnRpbWUpCi0gICAgICAgIHJldHVybiAoRUpCTmF0dXJlUnVudGltZSluYXR1cmU7Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZvbGRlciBnZXRGb2xkZXJSb290UHVibGlzaGFibGUoSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViTmF0dXJlKQotICB7Ci0gICAgcmV0dXJuIChJRm9sZGVyKXdlYk5hdHVyZS5nZXRSb290UHVibGlzaGFibGVGb2xkZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRm9sZGVyIGdldEZvbGRlcldFQklORihKMkVFV2ViTmF0dXJlUnVudGltZSB3ZWJOYXR1cmUpCi0gIHsKLSAgICByZXR1cm4gd2ViTmF0dXJlLmdldFByb2plY3QoKS5nZXRGb2xkZXIod2ViTmF0dXJlLmdldFdFQklORlBhdGgoKS50b1N0cmluZygpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRm9sZGVyIGdldEZvbGRlck1FVEFJTkYoRUpCTmF0dXJlUnVudGltZSBlamJOYXR1cmUpCi0gIHsKLSAgICByZXR1cm4gZWpiTmF0dXJlLmdldE1ldGFGb2xkZXIoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9XU0ZpbmRlclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL1dTRmluZGVyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkN2M5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL1dTRmluZGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ud3NmaW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBXU0ZpbmRlclJlZ2lzdHJ5Ci17Ci0gIHByaXZhdGUgc3RhdGljIFdTRmluZGVyUmVnaXN0cnkgaW5zdGFuY2VfOwotICBwcml2YXRlIFZlY3RvciB3c2ZpbmRlcnNfOwotCi0gIHByaXZhdGUgV1NGaW5kZXJSZWdpc3RyeSgpCi0gIHsKLSAgICB3c2ZpbmRlcnNfID0gbmV3IFZlY3RvcigpOwotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICogQHJldHVybiBBIHNpbmdsZXRvbiBXU0ZpbmRlclJlZ2lzdHJ5IG9iamVjdC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBXU0ZpbmRlclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSBuZXcgV1NGaW5kZXJSZWdpc3RyeSgpOwotICAgICAgaW5zdGFuY2VfLmluaXQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGluaXQoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBwbHVnaW5SZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iLCAid3NmaW5kZXIiKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gY29uZmlnRWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElXU0ZpbmRlcikKLSAgICAgICAgewotICAgICAgICAgIElXU0ZpbmRlciB3c2ZpbmRlciA9IChJV1NGaW5kZXIpb2JqZWN0OwotICAgICAgICAgIHdzZmluZGVyLnNldElEKGNvbmZpZ0VsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0gICAgICAgICAgd3NmaW5kZXIuc2V0TmFtZShjb25maWdFbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgICAgICAgd3NmaW5kZXIuc2V0RGVzY3JpcHRpb24oY29uZmlnRWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpKTsKLSAgICAgICAgICB3c2ZpbmRlcnNfLmFkZCh3c2ZpbmRlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFdTRmluZGVycygpCi0gIHsKLSAgICByZXR1cm4gd3NmaW5kZXJzXzsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0V2ViU2VydmljZXMoKQotICB7Ci0gICAgTGlzdCB3cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBMaXN0IHdzRmluZGVycyA9IGdldFdTRmluZGVycygpOwotICAgIGZvciAoSXRlcmF0b3IgaXQgPSB3c0ZpbmRlcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBJV1NGaW5kZXIgd3NGaW5kZXIgPSAoSVdTRmluZGVyKWl0Lm5leHQoKTsKLSAgICAgIHdzLmFkZEFsbCh3c0ZpbmRlci5maW5kKCkpOwotICAgIH0KLSAgICByZXR1cm4gd3M7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Eb21FbGVtZW50SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvRG9tRWxlbWVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDFjZGY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Eb21FbGVtZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy51dGlsOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21FbGVtZW50SGVscGVyIHsKLQotCi0gIHB1YmxpYyBzdGF0aWMgb3JnLnczYy5kb20uRWxlbWVudCBjcmVhdGVEb21FbGVtZW50RnJvbVhNTFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHhtbFN0cmluZyApCi0gIHsKLSAgICBqYXZhLmlvLlN0cmluZ1JlYWRlciBzdHJpbmdSZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoeG1sU3RyaW5nKTsgCi0gICAgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2Uoc3RyaW5nUmVhZGVyKTsgCi0gICAgdHJ5Ci0gICAgewotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2NCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZG9jQnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY0J1aWxkZXIucGFyc2UoaW5wdXRTb3VyY2UpOwotICAgICAgcmV0dXJuIGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGRvbVdyaXRlcihvcmcudzNjLmRvbS5Ob2RlIG5vZGUsamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICBpZiAoIG5vZGUgPT0gbnVsbCApIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0JaW50IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0Jc3dpdGNoICggdHlwZSApIHsKLQkgIGNhc2Ugb3JnLnczYy5kb20uTm9kZS5ET0NVTUVOVF9OT0RFOiB7Ci0JICBidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IikgKyAiPGJyPiIpOwotCSAgZG9tV3JpdGVyKCgob3JnLnczYy5kb20uRG9jdW1lbnQpbm9kZSkuZ2V0RG9jdW1lbnRFbGVtZW50KCksYnVmZmVyKTsKLQkgIGJyZWFrOwotCX0KLQkgIGNhc2Ugb3JnLnczYy5kb20uTm9kZS5FTEVNRU5UX05PREU6IHsKLQkgIGJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI8IiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSkpOwotCSAgb3JnLnczYy5kb20uQXR0ciBhdHRyc1tdID0gc29ydEF0dHJpYnV0ZXMobm9kZS5nZXRBdHRyaWJ1dGVzKCkpOwotCSAgZm9yICggaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKysgKSB7Ci0JICAgIG9yZy53M2MuZG9tLkF0dHIgYXR0ciA9IGF0dHJzW2ldOwotCSAgICBidWZmZXIuYXBwZW5kKCIgIiArIGF0dHIuZ2V0Tm9kZU5hbWUoKSArICI9XCIiICsgSnNwVXRpbHMubWFya3VwKGF0dHIuZ2V0Tm9kZVZhbHVlKCkpICsgIlwiIik7Ci0JICB9Ci0JICAgIGJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI+IikpOwotCSAgICBvcmcudzNjLmRvbS5Ob2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCSAgICBpZiAoIGNoaWxkcmVuICE9IG51bGwgKSB7Ci0JICAgICAgaW50IGxlbiA9IGNoaWxkcmVuLmdldExlbmd0aCgpOwotCQkgIGZvciAoIGludCBpID0gMDsgaSA8IGxlbjsgaSsrICkgewotCQkgICAgaWYoKChvcmcudzNjLmRvbS5Ob2RlKWNoaWxkcmVuLml0ZW0oaSkpLmdldE5vZGVUeXBlKCkgPT0gb3JnLnczYy5kb20uTm9kZS5FTEVNRU5UX05PREUpCi0JCQkgIGJ1ZmZlci5hcHBlbmQoIjxicj4iKTsKLQkJCWRvbVdyaXRlcihjaGlsZHJlbi5pdGVtKGkpLGJ1ZmZlcik7Ci0JCSAgfQotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI8LyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiIpKTsKLQkJYnJlYWs7Ci0gICAgICB9Ci0JICBjYXNlIG9yZy53M2MuZG9tLk5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOiB7Ci0JICAgIG9yZy53M2MuZG9tLk5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JICAgIGlmICggY2hpbGRyZW4gIT0gbnVsbCApIHsKLQkJICBpbnQgbGVuID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0JCSAgZm9yICggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKQotCSAgICAgIHsKLQkJICAgIGJ1ZmZlci5hcHBlbmQoY2hpbGRyZW4uaXRlbShpKSk7Ci0JCSAgfQotCQl9Ci0JCWJyZWFrOwotCSAgfQotCSAgY2FzZSBvcmcudzNjLmRvbS5Ob2RlLkNEQVRBX1NFQ1RJT05fTk9ERTogewotCSAgICBidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cChub2RlLmdldE5vZGVWYWx1ZSgpKSk7Ci0JICAgIGJyZWFrOwotICAgICAgfQotCSAgY2FzZSBvcmcudzNjLmRvbS5Ob2RlLlRFWFRfTk9ERTp7Ci0JICAgIGJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JICBjYXNlIG9yZy53M2MuZG9tLk5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOnsKLQkJYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAoIjw/IikpOwotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCVN0cmluZyBkYXRhID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJaWYgKCBkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDAgKXsKLQkgICAgICBidWZmZXIuYXBwZW5kKCIgIik7Ci0JCSAgYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgiPz4iKSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgIH0KLQkgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0gCi0JcHVibGljIHN0YXRpYyBvcmcudzNjLmRvbS5BdHRyW10gc29ydEF0dHJpYnV0ZXMob3JnLnczYy5kb20uTmFtZWROb2RlTWFwIGF0dHJzKQotCXsKLQkgIGludCBsZW4gPSAoYXR0cnMgIT0gbnVsbCkgPyBhdHRycy5nZXRMZW5ndGgoKSA6IDA7Ci0JICBvcmcudzNjLmRvbS5BdHRyIGFycmF5W10gPSBuZXcgb3JnLnczYy5kb20uQXR0cltsZW5dOwotCSAgZm9yICggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKXsKLQkgICBhcnJheVtpXSA9IChvcmcudzNjLmRvbS5BdHRyKWF0dHJzLml0ZW0oaSk7Ci0JICB9Ci0JICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBsZW4gLSAxOyBpKysgKSB7Ci0JICAgIFN0cmluZyBuYW1lICA9IGFycmF5W2ldLmdldE5vZGVOYW1lKCk7Ci0JICAgIGludCBpbmRleCA9IGk7Ci0JICAgIGZvciAoIGludCBqID0gaSArIDE7IGogPCBsZW47IGorKyApIHsKLQkgICAgICBTdHJpbmcgY3VyTmFtZSA9IGFycmF5W2pdLmdldE5vZGVOYW1lKCk7Ci0JCSAgaWYgKCBjdXJOYW1lLmNvbXBhcmVUbyhuYW1lKSA8IDAgKSB7Ci0JCSAgICBuYW1lICA9IGN1ck5hbWU7Ci0JCQlpbmRleCA9IGo7Ci0JCSAgfQotCQl9Ci0JCWlmICggaW5kZXggIT0gaSApIHsKLQkJICBvcmcudzNjLmRvbS5BdHRyIHRlbXAgPSBhcnJheVtpXTsKLQkJICBhcnJheVtpXSA9IGFycmF5W2luZGV4XTsKLQkJICBhcnJheVtpbmRleF0gPSB0ZW1wOwotCQl9Ci0JICB9Ci0JICByZXR1cm4gKGFycmF5KTsKLSAgICB9Ci0gCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Kc3BVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL0pzcFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjkwMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL0pzcFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3BVdGlscyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFya3VwKFN0cmluZyB0ZXh0KSB7Ci0JCQlpZiAodGV4dCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotCQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGkpOwotCQkJCXN3aXRjaCAoYykgewotCQkJCQljYXNlICc8JzoKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiZsdDsiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICcmJzoKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiZhbXA7Iik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnPic6Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCImZ3Q7Iik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnIic6Ci0JCQkJCQlidWZmZXIuYXBwZW5kKCImcXVvdDsiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvU29hcEVsZW1lbnRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTg1MTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy51dGlsOwotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU29hcEVsZW1lbnRIZWxwZXIgewotLyoKLSAqIFRoaXMgY2xhc3MgaXMgYmVpbmcgZ3V0dGVkIGZvciB0aGUgbW9tZW50LAotICogdW50aWwgYSBtZWFucyBmb3IgaW5jbHVkaW5nIHNhYWouamFyIG9yIGFuCi0gKiBlcXVpdmFsZW50IGtlZXBlciBvZiB0aGUgamF2YXgueG1sLnNvYXAgcGFja2FnZQotICogY2FuIGJlIGRldGVybWluZWQuIFRoZSBkaXNhYmxpbmcgb2YgdGhpcyBjbGFzcwotICogd2lsbCBvbmx5IGNhdXNlIHByb2JsZW1zIGlmIFNhbXBsZSBKU1BzIGFyZQotICogZ2VuZXJhdGVkIGZvciBXZWIgU2VydmljZSBwcm94aWVzIHRoYXQgaGF2ZQotICogU09BUEVsZW1lbnRzIG9uIHRoZWlyIGludGVyZmFjZXMuCi0gKiAKLSAgcHVibGljIHN0YXRpYyBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCBjcmVhdGVTT0FQRWxlbWVudEZyb21YTUxTdHJpbmcoU3RyaW5nIHhtbFN0cmluZykgdGhyb3dzIFNvYXBFbGVtZW50UnVudGltZUV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IFNvYXBFbGVtZW50UnVudGltZUV4Y2VwdGlvbigiU29hcEVsZW1lbnQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2FtcGxlIG9uIHRoZSBjdXJyZW50IHJ1bnRpbWUuIFBsZWFzZSB1c2UgV2ViU3BoZXJlIHY1LjEgb3IgaGlnaGVyLiIpOyAgICAKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBzb2FwRWxlbWVudFdyaXRlcihqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCBub2RlLGphdmEubGFuZy5TdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgaWYgKG5vZGUgPT0gbnVsbCApIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gICAgCi0gICAgICBidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgiPCIgKyBub2RlLmdldEVsZW1lbnROYW1lKCkuZ2V0TG9jYWxOYW1lKCkpKTsKLSAgICAgIGphdmEudXRpbC5JdGVyYXRvciBhdHRycyA9IG5vZGUuZ2V0QWxsQXR0cmlidXRlcygpOwotICAgICAgd2hpbGUoYXR0cnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLk5hbWUgYXR0ciA9IChqYXZheC54bWwuc29hcC5OYW1lKWF0dHJzLm5leHQoKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiICIgKyBhdHRyLmdldFF1YWxpZmllZE5hbWUoKSArICI9XCIiICsgSnNwVXRpbHMubWFya3VwKG5vZGUuZ2V0QXR0cmlidXRlVmFsdWUoYXR0cikpICsgIlwiIik7Ci0gICAgICB9Ci0gICAgICBidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgiPiIpKTsKLSAgICAgIGphdmEudXRpbC5JdGVyYXRvciBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgaWYgKCBjaGlsZHJlbiAhPSBudWxsICkgewotICAgICAgICB3aGlsZShjaGlsZHJlbi5oYXNOZXh0KCkpewotICAgICAgICAgIGphdmF4LnhtbC5zb2FwLk5vZGUgY2hpbGROb2RlID0gKGphdmF4LnhtbC5zb2FwLk5vZGUpY2hpbGRyZW4ubmV4dCgpOwotICAgICAgICAgIGlmKGNoaWxkTm9kZSBpbnN0YW5jZW9mIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50KXsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjxicj4iKTsKLSAgICAgICAgICAgIHNvYXBFbGVtZW50V3JpdGVyKChqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCljaGlsZE5vZGUsYnVmZmVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAoKChqYXZheC54bWwuc29hcC5UZXh0KWNoaWxkTm9kZSkuZ2V0VmFsdWUoKSkpOyAKLSAgICAgICAgfQotICAgICAgICBidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgiPC8iICsgbm9kZS5nZXRFbGVtZW50TmFtZSgpLmdldExvY2FsTmFtZSgpICsgIj4iKSk7Ci0JICB9Ci0gICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudFJ1bnRpbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzNWVmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvU29hcEVsZW1lbnRSdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTb2FwRWxlbWVudFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gIHsKLQotICAvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM3NjE2OTMzNzI2NzQ3NDg0NzFMOwotCi1wdWJsaWMgU29hcEVsZW1lbnRSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKXsKLSAgICBzdXBlcihtZXNzYWdlKTsKLSAgfQotICAKLSAgCi0gICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyMzQ2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4ZTM3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAqLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmZTY1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMgQ3JlYXRpb24gRUpCIEdyYXBoaWNhbCBVc2VyIEludGVyZmFjZQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLSMKLSMgV2ViIHNlcnZpY2UgdHlwZXMKLSMKLVdFQlNFUlZJQ0VUWVBFX05BTUVfRUpCX1RQPUVKQiBXZWIgU2VydmljZQotV0VCU0VSVklDRVRZUEVfTkFNRV9XU0RMX0VKQl9UUD1Ta2VsZXRvbiBFSkIgV2ViIFNlcnZpY2UKLQotIwotIyBQb3AtdXAgYWN0aW9ucwotIwotQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFPUNyZWF0ZSBXZWIgc2VydmljZQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2I1MDk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIG5hbWU9IiVQTFVHSU5fTkFNRSIKLSAgIHByb3ZpZGVyLW5hbWU9IiVQTFVHSU5fUFJPVklERVIiPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgIDwvcmVxdWlyZXM+Ci0KLSAgIDwhLS0gRUpCIFdlYiBTZXJ2aWNlIFR5cGVzIC0tPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSI+Ci08IS0tCi0gICAgICA8d2ViU2VydmljZVR5cGUKLSAgICAgICAgICAgIGxhYmVsPSIlV0VCU0VSVklDRVRZUEVfTkFNRV9XU0RMX0VKQl9UUCIKLSAgICAgICAgICAgIHJlc291cmNlVHlwZU1ldGFkYXRhPSJGaWxlIElSZXNvdXJjZSIKLSAgICAgICAgICAgIGV4dGVuc2lvbk1ldGFkYXRhPSIud3NkbCIKLSAgICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LldTRExTZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICBpbmNsdWRlTmF0dXJlcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk5hdHVyZSIKLSAgICAgICAgICAgIGV4Y2x1ZGVOYXR1cmVzPSIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnR5cGUud3NkbC5lamIiPgotICAgICAgPC93ZWJTZXJ2aWNlVHlwZT4KLS0tPgotICAgICAgPHdlYlNlcnZpY2VUeXBlCi0JCSAgICBsYWJlbD0iJVdFQlNFUlZJQ0VUWVBFX05BTUVfRUpCX1RQIgotCQkgICAgcmVzb3VyY2VUeXBlTWV0YWRhdGE9IkVKQk9iamVjdCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW4gU2Vzc2lvbkltcGwiCi0JCSAgICBleHRlbnNpb25NZXRhZGF0YT0iLmphdmEgLmNsYXNzIC5TZXNzaW9uSW1wbCIKLQkJICAgIG9iamVjdFNlbGVjdGlvbldpZGdldD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkVKQlNlbGVjdGlvbldpZGdldCIKLQkJICAgIGluY2x1ZGVOYXR1cmVzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTmF0dXJlIgotCQkgICAgZXhjbHVkZU5hdHVyZXM9IiIKLQkJICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS5lamIiPgotICAJIDwvd2ViU2VydmljZVR5cGU+Ci0KLQk8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBQb3B1cHMgLS0+Ci0gICAgICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW4iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuamF2YSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9ERVBMT1lfV0VCU0VSVklDRSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5lamIucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YmJkYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13c3MtdWkuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjQ1NGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OGU5OTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXNvdXJjZS53c3MtdWkuamFyID0gc3JjLwotYmluLmluY2x1ZGVzID0gd3NzLXVpLmphcixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9leHBvcnRfd3MuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZXhwb3J0X3dzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0NGVmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9leHBvcnRfd3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZXhwb3J0X3dzX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9leHBvcnRfd3Nfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRmY2Q3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9leHBvcnRfd3Nfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfd2Vic2Vydl93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld193ZWJzZXJ2X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzM3ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld193ZWJzZXJ2X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc193aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkMWY5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyNDcwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBDcmVhdGlvbiBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi1QTFVHSU5fTkVXX0NBVEVHT1JZX05BTUVfV1M9V2ViIFNlcnZpY2VzCi1QTFVHSU5fTkVXX1dJWkFSRF9OQU1FX1dTX1NFUlZJQ0U9V2ViIFNlcnZpY2UKLVBMVUdJTl9FWFBPUlRfV0laQVJEX05BTUVfV1M9V2ViIFNlcnZpY2UKLVBMVUdJTl9ORVdfV0laQVJEX0RFU0NfV1NfU0VSVklDRT1DcmVhdGUgYSBuZXcgWE1MIHdlYiBzZXJ2aWNlLgotUExVR0lOX0VYUE9SVF9XSVpBUkRfREVTQ19XUz1BIHdpemFyZCBmb3IgZXhwb3J0aW5nIGEgd2ViIHNlcnZpY2UuCi0KLSMKLSMJV2ViIFNlcnZpY2VzIFByZWZlcmFuY2UgUGFnZXMKLSMKLSMgRGlhbG9ncwotQ0hFQ0tCT1hfU0hPV19ERVBMT1lfV0VCX1NFUlZJQ0VfRElBTE9HPUhpZGUgQ3JlYXRlIFdlYiBzZXJ2aWNlIERpYWxvZwotQ0hFQ0tCT1hfU0hPV19HRU5FUkFURV9TS0VMRVRPTl9ESUFMT0c9SGlkZSBHZW5lcmF0ZSBKYXZhIEJlYW4gU2tlbGV0b24gRGlhbG9nCi1DSEVDS0JPWF9TSE9XX0dFTkVSQVRFX1dTRExfRklMRVNfRElBTE9HPUhpZGUgR2VuZXJhdGUgV1NETCBGaWxlcyBEaWFsb2cKLUNIRUNLQk9YX1NIT1dfUFVCTElTSF9XU0RMX0RJQUxPRz1IaWRlIFB1Ymxpc2ggV1NETCBEaWFsb2cKLQotUFJFRkVSRU5DRV9DQVRFR09SWV9TQ0VOQVJJT19ERUZBVUxUUz1TY2VuYXJpbyBEZWZhdWx0cwotCi0KLSMKLSMgUHJlZmVyZW5jZXMgVG9vbHRpcHMKLSMKLSNBY3Rpb24gRGlhbG9ncwotVE9PTFRJUF9QUEFEX0NIRUNLQk9YX0RFUExPWT1IaWRlcyB0aGUgZGlhbG9nIGZvciBkZXBsb3lpbmcgYSBXZWIgc2VydmljZSBhY3Rpb24KLVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9TS0VMRVRPTj1IaWRlcyB0aGUgZGlhbG9nIGZvciBnZW5lcmF0aW5nIEphdmEgYmVhbiBTa2VsZXRvbiBhY3Rpb24KLVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9XU0RMPUhpZGVzIHRoZSBkaWFsb2cgZm9yIGdlbmVyYXRpbmcgV1NETCBmaWxlcyBhY3Rpb24KLVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9QVUJMSVNIPUhpZGVzIHRoZSBkaWFsb2cgZm9yIHB1Ymxpc2hpbmcgdGhlIFdTREwgYWN0aW9uCi0KLSMKLSMgUG9wLXVwIGFjdGlvbnMKLSMKLUFDVElPTl9ERVBMT1lfV0VCU0VSVklDRT1DcmVhdGUgV2ViIHNlcnZpY2UKLUFDVElPTl9HRU5FUkFURV9KQVZBX1NLRUxFVE9OPUdlbmVyYXRlIEphdmEgYmVhbiBza2VsZXRvbgotQUNUSU9OX1BVQkxJU0hfV1NETD1QdWJsaXNoIFdTREwgZmlsZQotCi0jCi0jIFdpemFyZHMuCi0jCi1XSVpBUkRfVElUTEVfV1NTPVdlYiBTZXJ2aWNlCi0KLQotIwotIyBQb3AtdXAgYWN0aW9ucwotIwotQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFPUNyZWF0ZSBXZWIgc2VydmljZQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhMTZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIG5hbWU9IiVQTFVHSU5fTkFNRSIKLSAgIHByb3ZpZGVyLW5hbWU9IiVQTFVHSU5fUFJPVklERVIiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0id3NzLXVpLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuZXhwbG9yZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnV0aWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDwhLS0gV2l6YXJkcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX05FV19DQVRFR09SWV9OQU1FX1dTIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy51aS5uZXciPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fTkVXX1dJWkFSRF9OQU1FX1dTX1NFUlZJQ0UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3X3dlYnNlcnZfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkR5bmFtaWNXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVBMVUdJTl9ORVdfV0laQVJEX0RFU0NfV1NfU0VSVklDRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCI+Ci0gICAgICA8ZHluYW1pY1dpemFyZAotICAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNfd2l6LmdpZiIKLSAgICAgICAgICAgIHRpdGxlPSIlV0laQVJEX1RJVExFX1dTUyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5iaW5kaW5nLlNlcnZlcldpZGdldEJpbmRpbmciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgPC9keW5hbWljV2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fRVhQT1JUX1dJWkFSRF9OQU1FX1dTIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXhwb3J0X3dzLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkIgotICAgICAgICAgICAgaWQ9IndzZXhwb3J0Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVQTFVHSU5fRVhQT1JUX1dJWkFSRF9ERVNDX1dTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9leHBvcnRfd3Nfd2l6LmdpZiIKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fRVhQT1JUX1dJWkFSRF9OQU1FX1dTIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuRXhwb3J0V1NXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgaWQ9IndzZXhwb3J0Ij4KLSAgICAgIDwvZHluYW1pY1dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiPgotICAgICAgPGR5bmFtaWNXaXphcmQKLSAgICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2V4cG9ydF93c193aXouZ2lmIgotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9FWFBPUlRfV0laQVJEX05BTUVfV1MiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZy5FeHBvcnRXU1dpZGdldEJpbmRpbmciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5wdWJsaXNoIj4KLSAgICAgIDwvZHluYW1pY1dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tICJEb24ndCBTaG93IE1lIiBQcmVmZXJlbmNlcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSI+Ci0KLSAgICAgIDxhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZQotICAgICAgICAgICAgbmFtZT0iJUNIRUNLQk9YX1NIT1dfREVQTE9ZX1dFQl9TRVJWSUNFX0RJQUxPRyIKLSAgICAgICAgICAgIHRvb2x0aXA9IiVUT09MVElQX1BQQURfQ0hFQ0tCT1hfREVQTE9ZIgotICAgICAgICAgICAgaW5mb3BvcD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLlBQQUQwMDA2IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuamF2YSI+Ci0gICAgICA8L2FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlPgotCi0gICAgICA8YWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVDSEVDS0JPWF9TSE9XX0dFTkVSQVRFX1NLRUxFVE9OX0RJQUxPRyIKLSAgICAgICAgICAgIHRvb2x0aXA9IiVUT09MVElQX1BQQURfQ0hFQ0tCT1hfU0tFTEVUT04iCi0gICAgICAgICAgICBpbmZvcG9wPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkuUFBBRDAwMDgiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0Lndzcy5wb3B1cC5jYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5za2VsZXRvbiI+Ci0gICAgICA8L2FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlPgotCi0gICAgICA8YWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVDSEVDS0JPWF9TSE9XX1BVQkxJU0hfV1NETF9ESUFMT0ciCi0gICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1BVQkxJU0giCi0gICAgICAgICAgICBpbmZvcG9wPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkuUFBBRDAwMDkiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0Lndzcy5wb3B1cC5jYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnB1Ymxpc2giPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gUG9wdXBzIC0tPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IiouamF2YSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5qYXZhIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0IgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5qYXZhIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkLmphdmEiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fREVQTE9ZX1dFQlNFUlZJQ0UiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5za2VsZXRvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1NLRUxFVE9OIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuc2tlbGV0b24iPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9TS0VMRVRPTiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGwiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkLnNrZWxldG9uIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfU0tFTEVUT04iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5za2VsZXRvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1NLRUxFVE9OIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4iCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkLmphdmEiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fREVQTE9ZX1dFQlNFUlZJQ0UiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5qYXZhIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAgCi0gICAgICAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NpbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5za2VsZXRvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1NLRUxFVE9OIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzZGwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5wdWJsaXNoIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX1BVQkxJU0hfV1NETCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5wdWJsaXNoIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tIFByZWZlcmVuY2UgUGFnZXMgLS0+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfU0NFTkFSSU9fREVGQVVMVFMiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnByZWZlcmVuY2VzLlNjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkucHJlZmVyZW5jZXMuU2NlbmFyaW9EZWZhdWx0c1ByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3JlYXRpb24vdWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NyZWF0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTRjNDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3JlYXRpb24vdWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIFdTREwgVGVzdCBFcnJvcnMKLSMKLU1TR19FUlJPUl9VTkFCTEVfVE9fTEFVTkNIX1dTRExfVEVTVD1JV0FCMDM2MUUgQW4gZXJyb3Igb2NjdXJyZWQuIFVuYWJsZSB0byBsYXVuY2ggV1NETCB0ZXN0IGZhY2lsaXR5LgotCi0KLSMKLSMgV2l6YXJkIHBhZ2VzCi0jCi1QQUdFX1RJVExFX09CSkVDVF9TRUxFQ1RJT049T2JqZWN0IFNlbGVjdGlvbiBQYWdlCi1QQUdFX0RFU0NfT0JKRUNUX1NFTEVDVElPTj1PYmplY3QgU2VsZWN0aW9uIFBhZ2UKLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcwMjU4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVNb2R1bGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5Bc3NvY2lhdGVNb2R1bGVXaXRoRUFSQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBQcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCAKLXsKLQlwcml2YXRlIElXZWJTZXJ2aWNlCQkJCXdlYlNlcnZpY2VfOwotCXByaXZhdGUgU3RyaW5nCQkJCQkJcHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgbW9kdWxlXzsKLQlwcml2YXRlIFN0cmluZwkJCQkJCWVhclByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIGVhcl87Ci0JcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBqMmVlTGV2ZWxfOwotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgCi0gIHsKLQkgIFN5c3RlbS5vdXQucHJpbnRsbiggIkluIFByZSBzZXJ2aWNlIGFzc2VtYmxlIGNvbW1hbmQuIiApOwotICAgIAotCQkvL0NyZWF0ZSB0aGUgc2VydmljZSBFQVIgbW9kdWxlCi0JCUNyZWF0ZU1vZHVsZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBDcmVhdGVNb2R1bGVDb21tYW5kKCk7Ci0JCWNvbW1hbmQuc2V0UHJvamVjdE5hbWUoZWFyUHJvamVjdF8pOwotCQljb21tYW5kLnNldE1vZHVsZU5hbWUoZWFyXyk7Ci0JCWNvbW1hbmQuc2V0TW9kdWxlVHlwZShDcmVhdGVNb2R1bGVDb21tYW5kLkVBUik7Ci0JCWNvbW1hbmQuc2V0U2VydmVyRmFjdG9yeUlkKHdlYlNlcnZpY2VfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVyRmFjdG9yeUlkKCkpOwotCQljb21tYW5kLnNldEoyZWVMZXZlbChqMmVlTGV2ZWxfKTsKLQkJU3RhdHVzIHN0YXR1cyA9IGNvbW1hbmQuZXhlY3V0ZShlbnZpcm9ubWVudCk7Ci0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotCQl7Ci0JCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICByZXR1cm4gc3RhdHVzOwotCQl9CQkJCi0JCQotCQkKLQkJLy9Bc3NvY2lhdGUgdGhlIHNlcnZpY2UgbW9kdWxlIGFuZCBzZXJ2aWNlIEVBUgotCQlBc3NvY2lhdGVNb2R1bGVXaXRoRUFSQ29tbWFuZCBhc3NvY2lhdGVDb21tYW5kID0gbmV3IEFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kKCk7Ci0JCWFzc29jaWF0ZUNvbW1hbmQuc2V0UHJvamVjdChwcm9qZWN0Xyk7Ci0JCWFzc29jaWF0ZUNvbW1hbmQuc2V0TW9kdWxlKG1vZHVsZV8pOwotCQlhc3NvY2lhdGVDb21tYW5kLnNldEVBUlByb2plY3QoZWFyUHJvamVjdF8pOwotCQlhc3NvY2lhdGVDb21tYW5kLnNldEVhcihlYXJfKTsKLQkJc3RhdHVzID0gYXNzb2NpYXRlQ29tbWFuZC5leGVjdXRlKGVudmlyb25tZW50KTsKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0JCXsKLQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwkJICAKLQkJfQkJCQotCQkKLQkJcmV0dXJuIHN0YXR1czsJICAKLSAgfQotCQotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KCBTdHJpbmcgcHJvamVjdCApCi0gIHsKLQkgIHByb2plY3RfID0gcHJvamVjdDsKLSAgfQotCSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vZHVsZSggU3RyaW5nIG1vZHVsZSApCi0gIHsKLQkgIG1vZHVsZV8gPSBtb2R1bGU7Ci0gIH0JCi0JCi0gIHB1YmxpYyB2b2lkIHNldEVhclByb2plY3QoIFN0cmluZyBlYXJQcm9qZWN0ICkKLSAgewotCSAgZWFyUHJvamVjdF8gPSBlYXJQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXIoIFN0cmluZyBlYXIgKQotICB7Ci0JICBlYXJfID0gZWFyOyAgCi0gIH0KLQkKLSAKLSAgcHVibGljIHZvaWQgc2V0SjJlZUxldmVsKCBTdHJpbmcgajJlZUxldmVsICkKLSAgewotCSAgajJlZUxldmVsXyA9IGoyZWVMZXZlbDsgIAotICB9Ci0JCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgKQotICB7Ci0JICB3ZWJTZXJ2aWNlXyA9IHdlYlNlcnZpY2U7ICAKLSAgfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VEZXBsb3lDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlRGVwbG95Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JiNTc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VEZXBsb3lDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBQcmVTZXJ2aWNlRGVwbG95Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgCi0gIHsKLQlTeXN0ZW0ub3V0LnByaW50bG4oICJJbiBQcmUgc2VydmljZSBkZXBsb3kgY29tbWFuZC4iICk7Ci0KLQlyZXR1cm4gc3VwZXIuZXhlY3V0ZShlbnZpcm9ubWVudCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vUHJlU2VydmljZURldmVsb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDc3ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vUHJlU2VydmljZURldmVsb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZVN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LlNpbXBsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyXzsKLSAgcHJpdmF0ZSBFbnZpcm9ubWVudCAgICAgICBlbnZpcm9ubWVudF87Ci0gIHByaXZhdGUgSUNvbnRleHQgICAgICAgICAgY29udGV4dF87Ci0gIHByaXZhdGUgSVNlbGVjdGlvbiAgICAgICAgc2VsZWN0aW9uXzsKLQlwcml2YXRlIFN0cmluZwkJCQkJCXByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIG1vZHVsZV87Ci0JcHJpdmF0ZSBTdHJpbmcJCQkJCQllYXJQcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBlYXJfOwotCQotICBwcml2YXRlIElXZWJTZXJ2aWNlICAgICAgIHdlYlNlcnZpY2VfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIGoyZWVMZXZlbF87Ci0gIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0ICAgcmVzb3VyY2VDb250ZXh0XzsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBydW5fOwotICBwcml2YXRlIGJvb2xlYW4gY2xpZW50XzsKLSAgcHJpdmF0ZSBib29sZWFuIHRlc3RfOwotICBwcml2YXRlIGJvb2xlYW4gcHVibGlzaF87Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSAKLSAgewotCSAgSVdlYlNlcnZpY2VSdW50aW1lIHdzcnQgICA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVJ1bnRpbWUoIHR5cGVSdW50aW1lU2VydmVyXy5nZXRSdW50aW1lSWQoKSApOwotCSAgV2ViU2VydmljZUluZm8gICAgIHdzSW5mbyA9IG5ldyBXZWJTZXJ2aWNlSW5mbygpOwotCi0JICBTeXN0ZW0ub3V0LnByaW50bG4oICJJbiBQcmUgc2VydmljZSBkZXZlbG9wIGNvbW1hbmQuIiApOwotCQotCSAgd3NJbmZvLnNldEoyZWVMZXZlbCggajJlZUxldmVsXyApOwotCQl3c0luZm8uc2V0U2VydmVyRmFjdG9yeUlkKCB0eXBlUnVudGltZVNlcnZlcl8uZ2V0U2VydmVySWQoKSApOwotCQl3c0luZm8uc2V0U3RhdGUoIFdlYlNlcnZpY2VTdGF0ZS5VTktOT1dOX0xJVEVSQUwgKTsKLQkJd3NJbmZvLnNldFdlYlNlcnZpY2VSdW50aW1lSWQoIHR5cGVSdW50aW1lU2VydmVyXy5nZXRSdW50aW1lSWQoKSApOwotCi0JCWVudmlyb25tZW50XyA9IGVudmlyb25tZW50OwotCQl3ZWJTZXJ2aWNlXyAgPSB3c3J0LmdldFdlYlNlcnZpY2UoIHdzSW5mbyApOwotCQotCQkvL1NldCB1cCB0aGUgSUNvbnRleHQKLQkJV2ViU2VydmljZVNjZW5hcmlvIHNjZW5hcmlvID0gbnVsbDsKLQkJaWYgKHR5cGVSdW50aW1lU2VydmVyXy5nZXRUeXBlSWQoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmpzdC53cy50eXBlLmphdmEiKSkKLQkJewotCQkJc2NlbmFyaW8gPSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVBfTElURVJBTDsKLQkJfQotCQllbHNlIGlmICh0eXBlUnVudGltZVNlcnZlcl8uZ2V0VHlwZUlkKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS53c2RsIikpCi0JCXsKLQkJICBzY2VuYXJpbyA9IFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOX0xJVEVSQUw7Ci0JCX0KLQkKLQkJY29udGV4dF8gICAgID0gbmV3IFNpbXBsZUNvbnRleHQodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgcnVuXywgY2xpZW50XywgdGVzdF8sIHB1Ymxpc2hfLCAKLQkJCQkJCQkJCQkJCQkJCQkJCXNjZW5hcmlvLCAKLQkJCQkJCQkJCQkJCQkJCQkJCXJlc291cmNlQ29udGV4dF8uaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSwKLQkJCQkJCQkJCQkJCQkJCQkJCXJlc291cmNlQ29udGV4dF8uaXNDcmVhdGVGb2xkZXJzRW5hYmxlZCgpLAotCQkJCQkJCQkJCQkJCQkJCQkJcmVzb3VyY2VDb250ZXh0Xy5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpOwotCi0gICAgLy9DcmVhdGUgdGhlIHNlcnZpY2UgbW9kdWxlCi0JCUNyZWF0ZU1vZHVsZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBDcmVhdGVNb2R1bGVDb21tYW5kKCk7Ci0JCWNvbW1hbmQuc2V0UHJvamVjdE5hbWUocHJvamVjdF8pOwotCQljb21tYW5kLnNldE1vZHVsZU5hbWUobW9kdWxlXyk7Ci0JCS8vcnNrIHRvZG8gLS0gcGljayB0aGUgY29ycmVjdCBtb2R1bGUgdHlwZSBiYXNlZCBvbiB0aGUgV2ViIHNlcnZpY2UgdHlwZSwgaXQncyBoYXJkIGNvZGVkIHRvIFdFQiBmb3Igbm93LgotCQljb21tYW5kLnNldE1vZHVsZVR5cGUoQ3JlYXRlTW9kdWxlQ29tbWFuZC5XRUIpOwotCQljb21tYW5kLnNldFNlcnZlckZhY3RvcnlJZCh0eXBlUnVudGltZVNlcnZlcl8uZ2V0U2VydmVySWQoKSk7Ci0JCWNvbW1hbmQuc2V0SjJlZUxldmVsKGoyZWVMZXZlbF8pOwotCQlTdGF0dXMgc3RhdHVzID0gY29tbWFuZC5leGVjdXRlKGVudmlyb25tZW50KTsKLQkJCi0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotCQl7Ci0JCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJfQkJCQotCSAgcmV0dXJuIHN0YXR1czsJCQkJCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXIgKQotICB7Ci0JICB0eXBlUnVudGltZVNlcnZlcl8gPSB0eXBlUnVudGltZVNlcnZlcjsgIAotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotCSAgcmV0dXJuIHR5cGVSdW50aW1lU2VydmVyXzsKLSAgfQotCQotICBwdWJsaWMgdm9pZCBzZXRKMmVlTGV2ZWwoIFN0cmluZyBqMmVlTGV2ZWwgKQotICB7Ci0JajJlZUxldmVsXyA9IGoyZWVMZXZlbDsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEoyZWVMZXZlbCgpCi0gIHsKLQkgIHJldHVybiBqMmVlTGV2ZWxfOyAgCi0gIH0KLQkKLSAgcHVibGljIElXZWJTZXJ2aWNlIGdldFdlYlNlcnZpY2UoKQotICB7Ci0JcmV0dXJuIHdlYlNlcnZpY2VfOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBFbnZpcm9ubWVudCBnZXRFbnZpcm9ubWVudCgpCi0gIHsKLQlyZXR1cm4gZW52aXJvbm1lbnRfOwotICB9Ci0gIAotICBwdWJsaWMgSUNvbnRleHQgZ2V0Q29udGV4dCgpCi0gIHsKLSAgICByZXR1cm4gY29udGV4dF87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQ29udGV4dCggUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCApCi0gIHsKLSAgICByZXNvdXJjZUNvbnRleHRfID0gcmVzb3VyY2VDb250ZXh0OwkgIAotICB9Ci0gIAotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGlvbl87CSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbiggSVNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICB7Ci0Jc2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHByb2plY3RfOwkgIAotICB9Ci0JCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoIFN0cmluZyBwcm9qZWN0ICkKLSAgewotCSAgcHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0JIAotICBwdWJsaWMgU3RyaW5nIGdldE1vZHVsZSgpCi0gIHsKLSAgICByZXR1cm4gbW9kdWxlXzsJICAKLSAgfQotCQotICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoIFN0cmluZyBtb2R1bGUgKQotICB7Ci0JICBtb2R1bGVfID0gbW9kdWxlOwotICB9Ci0JCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWFyUHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gZWFyUHJvamVjdF87CSAgCi0gIH0KLQkKLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdCggU3RyaW5nIGVhclByb2plY3QgKQotICB7Ci0JICBlYXJQcm9qZWN0XyA9IGVhclByb2plY3Q7Ci0gIH0KLQkKLSAgcHVibGljIFN0cmluZyBnZXRFYXIoKQotICB7Ci0JICByZXR1cm4gZWFyXzsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXIoIFN0cmluZyBlYXIgKQotICB7Ci0JICBlYXJfID0gZWFyOyAgCi0gIH0KLSAgCi0JcHVibGljIHZvaWQgc2V0U3RhcnRTZXJ2aWNlKGJvb2xlYW4gc3RhcnRTZXJ2aWNlKQotCXsKLQkJcnVuXyA9IHN0YXJ0U2VydmljZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoYm9vbGVhbiB0ZXN0U2VydmljZSkKLQl7Ci0JCXRlc3RfID0gdGVzdFNlcnZpY2U7Ci0JfQkKLQkKLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFNlcnZpY2UoYm9vbGVhbiBwdWJsaXNoU2VydmljZSkKLSAgewotICAgIHB1Ymxpc2hfID0gcHVibGlzaFNlcnZpY2U7Ci0gIH0KLQkKLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlblByb3h5KQotICB7Ci0gICAgY2xpZW50XyA9IGdlblByb3h5OyAgCi0gIH0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VJbnN0YWxsQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vUHJlU2VydmljZUluc3RhbGxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjFlNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vUHJlU2VydmljZUluc3RhbGxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQWRkTW9kdWxlVG9TZXJ2ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVTZXJ2ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBQcmVTZXJ2aWNlSW5zdGFsbENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotCXByaXZhdGUgSVdlYlNlcnZpY2UJCQkJd2ViU2VydmljZV87Ci0JcHJpdmF0ZSBTdHJpbmcJCQkJCQlwcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBtb2R1bGVfOwotCXByaXZhdGUgU3RyaW5nCQkJCQkJZWFyUHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgZWFyXzsKLQkJCi0JICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIAotCSAgewotCQkgIFN5c3RlbS5vdXQucHJpbnRsbiggIkluIFByZSBzZXJ2aWNlIGluc3RhbGwgY29tbWFuZC4iICk7Ci0JCQkKLQkJCWlmICh3ZWJTZXJ2aWNlXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFNlcnZlckluc3RhbmNlSWQoKT09bnVsbCkKLQkJCXsKLQkJCQlDcmVhdGVTZXJ2ZXJDb21tYW5kIGNyZWF0ZVNlcnZlckNvbW1hbmQgPSBuZXcgQ3JlYXRlU2VydmVyQ29tbWFuZCgpOwotCQkJCWNyZWF0ZVNlcnZlckNvbW1hbmQuc2V0U2VydmVyRmFjdG9yeWlkKHdlYlNlcnZpY2VfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVyRmFjdG9yeUlkKCkpOwotCQkJCVN0YXR1cyBjcmVhdGVTZXJ2ZXJTdGF0dXMgPSBjcmVhdGVTZXJ2ZXJDb21tYW5kLmV4ZWN1dGUoZW52aXJvbm1lbnQpOwotCQkJCWlmIChjcmVhdGVTZXJ2ZXJTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLk9LKQotCQkJCXsKLQkJCQkJd2ViU2VydmljZV8uZ2V0V2ViU2VydmljZUluZm8oKS5zZXRTZXJ2ZXJJbnN0YW5jZUlkKGNyZWF0ZVNlcnZlckNvbW1hbmQuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaWYgKGNyZWF0ZVNlcnZlclN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0JCQkJCXsKLQkJCQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihjcmVhdGVTZXJ2ZXJTdGF0dXMpOwotCQkJCQl9CQkJCQkJCQkKLQkJCQkJcmV0dXJuIGNyZWF0ZVNlcnZlclN0YXR1czsKLQkJCQl9Ci0JCQl9Ci0JCQkgIAotCQkJCi0JCQkKLQkJCUFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZCgpOwotCQkJY29tbWFuZC5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHdlYlNlcnZpY2VfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLQkJCWlmIChlYXJQcm9qZWN0XyAhPSBudWxsICYmIGVhclByb2plY3RfLmxlbmd0aCgpPjAgJiYgZWFyXyE9IG51bGwgJiYgZWFyXy5sZW5ndGgoKT4wKQotCQkJewotCQkJCWNvbW1hbmQuc2V0UHJvamVjdChlYXJQcm9qZWN0Xyk7Ci0JCQkJY29tbWFuZC5zZXRNb2R1bGUoZWFyXyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJY29tbWFuZC5zZXRQcm9qZWN0KHByb2plY3RfKTsKLQkJCQljb21tYW5kLnNldE1vZHVsZShtb2R1bGVfKTsJCQkJCi0JCQl9Ci0KLQkJCVN0YXR1cyBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoZW52aXJvbm1lbnQpOwotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0JCQl7Ci0JCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQl9CQkJCi0JCSAgcmV0dXJuIHN0YXR1czsKLQkgIH0KLQotCSAgcHVibGljIHZvaWQgc2V0UHJvamVjdCggU3RyaW5nIHByb2plY3QgKQotCSAgewotCQkgIHByb2plY3RfID0gcHJvamVjdDsKLQkgIH0KLQkJICAKLQkgIHB1YmxpYyB2b2lkIHNldE1vZHVsZSggU3RyaW5nIG1vZHVsZSApCi0JICB7Ci0JCSAgbW9kdWxlXyA9IG1vZHVsZTsKLQkgIH0JCi0JCQotCSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdCggU3RyaW5nIGVhclByb2plY3QgKQotCSAgewotCQkgIGVhclByb2plY3RfID0gZWFyUHJvamVjdDsKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgc2V0RWFyKCBTdHJpbmcgZWFyICkKLQkgIHsKLQkJICBlYXJfID0gZWFyOyAgCi0JICB9Ci0JCQotCSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZSggSVdlYlNlcnZpY2Ugd2ViU2VydmljZSApCi0JICB7Ci0JCSAgd2ViU2VydmljZV8gPSB3ZWJTZXJ2aWNlOyAgCi0JICB9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vUHJlU2VydmljZVJ1bkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VSdW5Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMjE1ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vUHJlU2VydmljZVJ1bkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0U2VydmVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgUHJlU2VydmljZVJ1bkNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotCXByaXZhdGUgSVdlYlNlcnZpY2UJCQkJd2ViU2VydmljZV87Ci0JCi0JICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIAotCSAgewotCQkgIFN5c3RlbS5vdXQucHJpbnRsbiggIkluIFByZSBzZXJ2aWNlIHJ1biBjb21tYW5kLiIgKTsKLQkJCQotCQkJU3RhcnRTZXJ2ZXJDb21tYW5kIGNvbW1hbmQgPSBuZXcgU3RhcnRTZXJ2ZXJDb21tYW5kKCk7Ci0JCQljb21tYW5kLnNldFNlcnZlckluc3RhbmNlSWQod2ViU2VydmljZV8uZ2V0V2ViU2VydmljZUluZm8oKS5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotCQkJU3RhdHVzIHN0YXR1cyA9IGNvbW1hbmQuZXhlY3V0ZShlbnZpcm9ubWVudCk7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLQkJCXsKLQkJCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsJCQkgIAotCQkJfQkJCQotCQkJcmV0dXJuIHN0YXR1czsKLQkJCQotCSAgfQotCQkKLQkgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgKQotCSAgewotCQkgIHdlYlNlcnZpY2VfID0gd2ViU2VydmljZTsgIAotCSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9TZXJ2aWNlUm9vdEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9TZXJ2aWNlUm9vdEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTliOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vU2VydmljZVJvb3RGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuRGVwbG95U2VydmljZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkRldmVsb3BTZXJ2aWNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuSW5zdGFsbFNlcnZpY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5SdW5TZXJ2aWNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUm9vdEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudCAKLXsKLSAgcHVibGljIFNlcnZpY2VSb290RnJhZ21lbnQoKQotICB7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IERldmVsb3BTZXJ2aWNlRnJhZ21lbnQoKSApOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgUHJlU2VydmljZUFzc2VtYmxlQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgYWRkKCBuZXcgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQoKSApOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgUHJlU2VydmljZURlcGxveUNvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IERlcGxveVNlcnZpY2VGcmFnbWVudCgpICk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBQcmVTZXJ2aWNlSW5zdGFsbENvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQoKSApOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgUHJlU2VydmljZVJ1bkNvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IFJ1blNlcnZpY2VGcmFnbWVudCgpICk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5KSAKLSAgewotCQkvL01hcHBpbmdzIGZyb20gZnJhbWV3b3JrIHRvIGV4dGVuc2lvbiBmcmFnbWVudHMKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBEZXZlbG9wU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgRGV2ZWxvcFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgRGV2ZWxvcFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJTZWxlY3Rpb24iLCBEZXZlbG9wU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIERldmVsb3BTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIERldmVsb3BTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIERldmVsb3BTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhciIsIERldmVsb3BTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLQkJCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIEFzc2VtYmxlU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLQkKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIERlcGxveVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJTZWxlY3Rpb24iLCBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIERlcGxveVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgRGVwbG95U2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIERlcGxveVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgRGVwbG95U2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgSW5zdGFsbFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgSW5zdGFsbFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgSW5zdGFsbFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgSW5zdGFsbFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBJbnN0YWxsU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBJbnN0YWxsU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgUnVuU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgUnVuU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBSdW5TZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgUnVuU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIFJ1blNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgUnVuU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIFJ1blNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgUnVuU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCQotCQkvL01hcHBpbmdzIGZyb20gZnJhbWV3b3JrIHRvIGZyYW1ld29yayBjb21tYW5kcwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhciIsIFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsJCQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJKMmVlTGV2ZWwiLCBQcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kLmNsYXNzICk7Ci0JCQotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFByZVNlcnZpY2VJbnN0YWxsQ29tbWFuZC5jbGFzcyApOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgUHJlU2VydmljZUluc3RhbGxDb21tYW5kLmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBQcmVTZXJ2aWNlSW5zdGFsbENvbW1hbmQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIFByZVNlcnZpY2VJbnN0YWxsQ29tbWFuZC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgUHJlU2VydmljZUluc3RhbGxDb21tYW5kLmNsYXNzICk7CQkKLQotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFByZVNlcnZpY2VSdW5Db21tYW5kLmNsYXNzICk7Ci0JCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGMzNzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkucGx1Z2luOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIENyZWF0aW9uIFVJIHBsdWdpbi4KLSogPHA+Ci0qIFRoZSBXZWIgU2VydmljZXMgQ3JlYXRpb24gVUkgcGx1Z2luJ3Mgc29sZSBmdW5jdGlvbiBpcyB0byBhZGQgCi0qIHVzZXIgaW50ZXJmYWNlIG9mIHRoZSBXZWIgU2VydmljZXMgQ3JlYXRpb24gV2l6YXJkLCBjb250YWluZWQgaW4gIAotKiB0aGUgb3JnLmVjbGlwc2UuanN0LndzLnVpIHBsdWdpbi4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpIjsKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luIGluc3RhbmNlXzsKLSAgcHJpdmF0ZSBMb2cgbG9nXzsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgKiBUaGUgInBsdWdpbiIgZWxlbWVudCBpbiBwbHVnaW4ueG1sIHNob3VsZCBpbmNsdWRlIHRoZSBhdHRyaWJ1dGUKLSAgKiBjbGFzcyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luIi4KLSAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luICgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGluc3RhbmNlXyA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAqIChXZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbilQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSIpOwotICAqIEByZXR1cm4gVGhlIFdlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luIHNpbmdsZXRvbi4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbiBnZXRJbnN0YW5jZSAoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gICogcGx1Z2luLnByb3BlcnRpZXMuCi0gICogQHJldHVybiBUaGUgU3RyaW5nIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5ICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkucGx1Z2luIiwgaW5zdGFuY2VfICk7Ci0gICAgCi0gICAgaWYoIGtleS5zdGFydHNXaXRoKCIlIikpCi0gICAgewotICAgICAga2V5ID0ga2V5LnN1YnN0cmluZyggMSwga2V5Lmxlbmd0aCgpICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBtc2dVdGlscy5nZXRNZXNzYWdlKGtleSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHBsdWdpbi5wcm9wZXJ0aWVzLiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotICAqIGFyZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoCi0gICogYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIHRoZSBKREsncwotICAqIHtAbGluayBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdH0KLSAgKiBjbGFzcyBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHN1YnN0aXR1dGlvbi4KLSAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MgKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSxhcmdzKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIHJlc291cmNlCi0gICogYXMgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBpbnN0YWxsIGxvY2F0aW9uLgotICAqIEByZXR1cm4gQW4gaW1hZ2UgZGVzY3JpcHRvciwgcG9zc2libHkgbnVsbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMIGluc3RhbGxVUkwgPSBpbnN0YW5jZV8uZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLSAgICAgIFVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCxuYW1lKTsKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvcHJlZmVyZW5jZXMvU2NlbmFyaW9EZWZhdWx0c1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3ByZWZlcmVuY2VzL1NjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGFiNGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvcHJlZmVyZW5jZXMvU2NlbmFyaW9EZWZhdWx0c1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5TZXJ2ZXJXaXphcmRXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFNjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIAotewotCXByaXZhdGUgU2VydmVyV2l6YXJkV2lkZ2V0IHNlcnZlcldpZGdldF8gPSBudWxsOwotCQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpICAgeyB9CQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIAotCXsKLQkgIFVJVXRpbHMgdXRpbHMgPSBuZXcgVUlVdGlscyhudWxsLCBudWxsKTsKLQkgIAotCSAgQ29tcG9zaXRlIHBhZ2UgPSB1dGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMSApOwotCSAgCi0gICAgICBzZXJ2ZXJXaWRnZXRfID0gbmV3IFNlcnZlcldpemFyZFdpZGdldCggZmFsc2UgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uYWRkQ29udHJvbHMoIHBhZ2UsIG5ldyBMaXN0ZW5lcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBFdmVudCBldnQgKXt9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0JICBpbml0aWFsaXplVmFsdWVzKCk7Ci0JICByZXR1cm4gcGFnZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0JewotCSAgU2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0KLSAgICAgIC8vIFNldCB2YWx1ZXMgZnJvbSBjb250ZXh0LgotCSAgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmVySWRzID0gbmV3IFR5cGVSdW50aW1lU2VydmVyKCk7Ci0JICBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHMgPSBuZXcgVHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLQkJCi0JICBzZXJ2ZXJJZHMuc2V0VHlwZUlkKCBjb250ZXh0LmdldFdlYlNlcnZpY2VUeXBlKCkgKTsKLQkgIGNsaWVudElkcy5zZXRUeXBlSWQoIGNvbnRleHQuZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKSApOwotCQkKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBzZXJ2ZXJJZHMgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIGNsaWVudElkcyApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRHZW5lcmF0ZVByb3h5KCBuZXcgQm9vbGVhbihjb250ZXh0LmdldEdlbmVyYXRlUHJveHkoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0UHVibGlzaFNlcnZpY2UoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFN0YXJ0U2VydmljZSggbmV3IEJvb2xlYW4oY29udGV4dC5nZXRTdGFydFdlYlNlcnZpY2UoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0VGVzdFNlcnZpY2UoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0VGVzdFdlYlNlcnZpY2UoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0TW9uaXRvclNlcnZpY2UobmV3IEJvb2xlYW4oY29udGV4dC5nZXRNb25pdG9yV2ViU2VydmljZSgpKSk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLmludGVybmFsaXplKCk7Ci0JfQotCQotICAgIC8qKgotCSAqIERvZXMgYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGRlZmF1bHQgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKQotCXsKLQkgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCSAgc2V0VG9EZWZhdWx0cygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VG9EZWZhdWx0cygpCi0JewotCSAgU2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0KLSAgICAgIC8vIFNldCB2YWx1ZXMgZnJvbSBjb250ZXh0LgotCSAgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmVySWRzID0gbmV3IFR5cGVSdW50aW1lU2VydmVyKCk7Ci0JICBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHMgPSBuZXcgVHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLQkJCi0JICBzZXJ2ZXJJZHMuc2V0VHlwZUlkKCBjb250ZXh0LmdldFdlYlNlcnZpY2VUeXBlRGVmYXVsdCgpICk7Ci0JICBjbGllbnRJZHMuc2V0VHlwZUlkKCBjb250ZXh0LmdldENsaWVudFdlYlNlcnZpY2VUeXBlRGVmYXVsdCgpICk7Ci0JCQotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoIHNlcnZlcklkcyApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRDbGllbnRUeXBlUnVudGltZVNlcnZlciggY2xpZW50SWRzICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldEdlbmVyYXRlUHJveHkoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0R2VuZXJhdGVQcm94eURlZmF1bHQoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0UHVibGlzaFNlcnZpY2UoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyRGVmYXVsdCgpKSApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRTdGFydFNlcnZpY2UoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0U3RhcnRXZWJTZXJ2aWNlRGVmYXVsdCgpKSApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRUZXN0U2VydmljZSggbmV3IEJvb2xlYW4oY29udGV4dC5nZXRUZXN0V2ViU2VydmljZURlZmF1bHQoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0TW9uaXRvclNlcnZpY2UobmV3IEJvb2xlYW4oY29udGV4dC5nZXRNb25pdG9yV2ViU2VydmljZURlZmF1bHQoKSkpOwotICAgICAgc2VydmVyV2lkZ2V0Xy5pbnRlcm5hbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKiAgQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0JewotCSAgc3RvcmVWYWx1ZXMoKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpCi0JewotCSAgU2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0JICAKLQkgIFR5cGVSdW50aW1lU2VydmVyIHNlcnZlcklkcyA9IHNlcnZlcldpZGdldF8uZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCk7Ci0JICBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHMgPSBzZXJ2ZXJXaWRnZXRfLmdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCk7Ci0JICAKLSAgICAgIGNvbnRleHQuc2V0V2ViU2VydmljZVR5cGUoIHNlcnZlcklkcy5nZXRUeXBlSWQoKSApOwotICAgICAgY29udGV4dC5zZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSggY2xpZW50SWRzLmdldFR5cGVJZCgpICk7Ci0gICAgICBjb250ZXh0LnNldEdlbmVyYXRlUHJveHkoIHNlcnZlcldpZGdldF8uZ2V0R2VuZXJhdGVQcm94eSgpLmJvb2xlYW5WYWx1ZSgpICk7Ci0gICAgICBjb250ZXh0LnNldExhdW5jaFdlYlNlcnZpY2VFeHBsb3Jlciggc2VydmVyV2lkZ2V0Xy5nZXRQdWJsaXNoU2VydmljZSgpLmJvb2xlYW5WYWx1ZSgpICk7Ci0gICAgICBjb250ZXh0LnNldFN0YXJ0V2ViU2VydmljZSggc2VydmVyV2lkZ2V0Xy5nZXRTdGFydFNlcnZpY2UoKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgY29udGV4dC5zZXRUZXN0V2ViU2VydmljZSggc2VydmVyV2lkZ2V0Xy5nZXRUZXN0U2VydmljZSgpLmJvb2xlYW5WYWx1ZSgpICk7Ci0gICAgICBjb250ZXh0LnNldE1vbml0b3JXZWJTZXJ2aWNlKHNlcnZlcldpZGdldF8uZ2V0TW9uaXRvclNlcnZpY2UoKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpCi0JewotCSAgcGVyZm9ybU9rKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2NjYTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuUHJlZmVyZW5jZXNTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV2ViU2VydmljZUNsaWVudFR5cGVXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuTGFiZWxzQW5kSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZlcldpemFyZFdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgoteyAgIAotICBwcml2YXRlIFdlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0IGNsaWVudFdpZGdldF87Ci0gIHByaXZhdGUgUHJlZmVyZW5jZXNTZWxlY3Rpb25XaWRnZXQgcHJlZmVyZW5jZXNXaWRnZXRfOwotICBwcml2YXRlIExpc3RlbmVyICAgICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyXzsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciAgICAgICAgICBpZHNfOwotICBwcml2YXRlIExhYmVsc0FuZElkcyAgICAgICAgICAgICAgIGxhYmVsSWRzXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5UHJlZmVyZW5jZXNfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDAxIGZvciB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX1BBR0UgPSAiUFdQUjAwMDEiOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDA1IGZvciB0aGUgR2VuZXJhdGUgUHJveHkgY2hlY2sgYm94IG9mIHRoZSBQcm9qZWN0IFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfR0VORVJBVEVfUFJPWFkgPSAiUFdQUjAwMDUiOwotICBwcml2YXRlIEJ1dHRvbiAgZ2VuZXJhdGVQcm94eV87Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdQUjAwMTAgZm9yIHRoZSBXZWIgU2VydmljZSBUeXBlIGNvbWJvIGJveCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NPTUJPX1RZUEUgPSAiUFdQUjAwMTAiOwotICBwcml2YXRlIENvbWJvICB3ZWJzZXJ2aWNlVHlwZV87Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdQUjAwMTEgZm9yIHRoZSBXaXphcmQgU2NlbmFyaW8gU2VydmljZSBncm91cCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0dST1VQX1NDRU5BUklPX1NFUlZJQ0UgPSAiUFdQUjAwMTEiOwotICBwcml2YXRlIEJ1dHRvbiBzdGFydFNlcnZpY2VfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDA5IGZvciB0aGUgU3RhcnQgV2ViIFByb2plY3QgY2hlY2sgYm94IGNoZWNrIGJveCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX1NUQVJUX1dFQl9QUk9KRUNUID0gIlBXUFIwMDA5IjsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAxMyBmb3IgdGhlIHRlc3Qgc2VydmljZSBjaGVja2JveCBvZiB0aGUgcHJvamVjdCBwYWdlKi8gIAotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfVEVTVF9TRVJWSUNFID0gIlBXUFIwMDEzIjsKLSAgcHJpdmF0ZSBCdXR0b24gdGVzdFNlcnZpY2VfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDE0IGZvciB0aGUgbW9uaXRvciBzZXJ2aWNlIGNoZWNrYm94IG9mIHRoZSBwcm9qZWMgcGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DSEVDS0JPWF9NT05JVE9SX1NFUlZJQ0UgPSAiUFdQUjAwMTQiOwotICBwcml2YXRlIEJ1dHRvbiBtb25pdG9yU2VydmljZTsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAxMiBmb3IgdGhlIExhdW5jaCBVRERJIGNoZWNrIGJveCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX0xBVU5DSF9XUyA9ICJQV1BSMDAxMiI7Ci0gIHByaXZhdGUgQnV0dG9uIGxhdW5jaFVkZGlfOwotICAKLSAgcHVibGljIFNlcnZlcldpemFyZFdpZGdldCggYm9vbGVhbiBkaXNwbGF5UHJlZmVyZW5jZXMgKQotICB7Ci0gICAgZGlzcGxheVByZWZlcmVuY2VzXyA9IGRpc3BsYXlQcmVmZXJlbmNlczsgIAotICB9Ci0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBTdHJpbmcgICAgICAgY3JlYXRlUGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1dGlscyAgICA9IG5ldyBVSVV0aWxzKCBtc2dVdGlscywgY3JlYXRlUGx1Z2luSWQgKTsKLSAgICAKLSAgICBzdGF0dXNMaXN0ZW5lcl8gPSBzdGF0dXNMaXN0ZW5lcjsKLSAgICAKLSAgCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIHBhcmVudCwgcGx1Z2luSWQgKyAiLiIgKyAgSU5GT1BPUF9QV1BSX1BBR0UgKTsKLSAgCQotICAJQ29tcG9zaXRlIHNlcnZlckNvbXBvc2l0ZSA9IHV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAxICk7Ci0gIAkKLSAgCUdyb3VwIHNlcnZpY2VHcm91cCA9IHV0aWxzLmNyZWF0ZUdyb3VwKCBzZXJ2ZXJDb21wb3NpdGUsICJHUk9VUF9TQ0VOQVJJT19TRVJWSUNFIiwKLSAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1BSX0dST1VQX1NDRU5BUklPX1NFUlZJQ0UiLCAKLSAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUFJfR1JPVVBfU0NFTkFSSU9fU0VSVklDRSwKLQkJCQkJCQkJCQkJMiwgMTAsIDEwKTsKLSAgCQotICAJCi0gIAkvLyBDcmVhdGUgd2Vic2VydmljZSBjb21ibyBib3guCi0gICAgd2Vic2VydmljZVR5cGVfID0gdXRpbHMuY3JlYXRlQ29tYm8oIHNlcnZpY2VHcm91cCwgIkxBQkVMX1dFQlNFUlZJQ0VUWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdQUl9DT01CT19UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NPTUJPX1RZUEUsIAotCQkJCQkJCQkJCSBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICB3ZWJzZXJ2aWNlVHlwZV8uYWRkTGlzdGVuZXIoIFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGJ1dHRvbnNHcm91cCA9IHV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggc2VydmljZUdyb3VwLCAxICk7Ci0gICAgR3JpZERhdGEgIGJ1dHRvbkdyaWQgICA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGJ1dHRvbkdyaWQuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIGJ1dHRvbnNHcm91cC5zZXRMYXlvdXREYXRhKCBidXR0b25HcmlkICk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIHN0YXJ0IHNlcnZpY2UgY2hlY2sgYm94LgotICAgIHN0YXJ0U2VydmljZV8gPSB1dGlscy5jcmVhdGVDaGVja2JveCggYnV0dG9uc0dyb3VwLCAiQlVUVE9OX1NUQVJUX1dFQl9QUk9KRUNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfQ0hFQ0tCT1hfU1RBUlRfV0VCX1BST0pFQ1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX1NUQVJUX1dFQl9QUk9KRUNUICk7Ci0gICAgc3RhcnRTZXJ2aWNlXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdGFydFByZXNzZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICBsYXVuY2hVZGRpXyA9IHV0aWxzLmNyZWF0ZUNoZWNrYm94KCBidXR0b25zR3JvdXAsICJCVVRUT05fV1NfUFVCTElTSCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdQUl9DSEVDS0JPWF9MQVVOQ0hfV1MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DSEVDS0JPWF9MQVVOQ0hfV1MgKTsKLSAgICAKLSAgICBDb21wb3NpdGUgcHJveHlDb21wb3NpdGUgPSB1dGlscy5jcmVhdGVDb21wb3NpdGUoIHNlcnZlckNvbXBvc2l0ZSwgMSwgNSwgMCApOwotICAgIAotICAgIC8vIENyZWF0ZSBnZW5lcmF0ZSBwcm94eSBjaGVjayBib3guCi0gICAgZ2VuZXJhdGVQcm94eV8gPSB1dGlscy5jcmVhdGVDaGVja2JveCggcHJveHlDb21wb3NpdGUsICJCVVRUT05fR0VORVJBVEVfUFJPWFkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfQ0hFQ0tCT1hfR0VORVJBVEVfUFJPWFkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DSEVDS0JPWF9HRU5FUkFURV9QUk9YWSApOwotICAgIGdlbmVyYXRlUHJveHlfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRXaWRnZXRfLmVuYWJsZVdpZGdldCggZ2VuZXJhdGVQcm94eV8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIAotICAgIC8vIENyZWF0ZSBjbGllbnQgc2VsZWN0aW9uIHdpZGdldC4KLSAgICBjbGllbnRXaWRnZXRfID0gbmV3IFdlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0KCk7Ci0gICAgY2xpZW50V2lkZ2V0Xy5hZGRDb250cm9scyggc2VydmVyQ29tcG9zaXRlLCBzdGF0dXNMaXN0ZW5lciApOwotICAgIAotICAgIENvbXBvc2l0ZSB0ZXN0R3JvdXAgPSB1dGlscy5jcmVhdGVDb21wb3NpdGUoc2VydmVyQ29tcG9zaXRlLDEpOwotICAgIAotICAgIC8vICBDcmVhdGUgdGVzdCBzZXJ2aWNlIGNoZWNrIGJveC4KLSAgICB0ZXN0U2VydmljZV8gPSB1dGlscy5jcmVhdGVDaGVja2JveCggdGVzdEdyb3VwLCAiQ0hFQ0tCT1hfVEVTVF9XRUJTRVJWSUNFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdQUl9DSEVDS0JPWF9URVNUX1NFUlZJQ0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfVEVTVF9TRVJWSUNFICk7Ci0KLSAgICBtb25pdG9yU2VydmljZSA9IHV0aWxzLmNyZWF0ZUNoZWNrYm94KCB0ZXN0R3JvdXAsICJDSEVDS0JPWF9NT05JVE9SX1dFQlNFUlZJQ0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1BSX0NIRUNLQk9YX01PTklUT1JfU0VSVklDRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DSEVDS0JPWF9NT05JVE9SX1NFUlZJQ0UgKTsKLSAgICAKLSAgICBpZiggZGlzcGxheVByZWZlcmVuY2VzXyApCi0gICAgewotICAgICAgLy8gQ3JlYXRlIHRoZSBwcmVmZXJlbmNlcyB3aWRnZXRzLgotICAgICAgcHJlZmVyZW5jZXNXaWRnZXRfID0gbmV3IFByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0KCk7Ci0gICAgICBwcmVmZXJlbmNlc1dpZGdldF8uYWRkQ29udHJvbHMoIHNlcnZlckNvbXBvc2l0ZSwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlU3RhcnRQcmVzc2VkKCkKLSAgewotICAgIGJvb2xlYW4gZW5hYmxlZCA9IHN0YXJ0U2VydmljZV8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCi0gICAgdGVzdFNlcnZpY2VfLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICBtb25pdG9yU2VydmljZS5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgIGxhdW5jaFVkZGlfLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgICBnZW5lcmF0ZVByb3h5Xy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgY2xpZW50V2lkZ2V0Xy5lbmFibGVXaWRnZXQoIGdldEdlbmVyYXRlUHJveHkoKS5ib29sZWFuVmFsdWUoKSApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzICkKLSAgewotICAgIGNsaWVudFdpZGdldF8uc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoIGlkcyApOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLQkvL3Jza3JlZyAgCi0gICAgLy9XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSByZWdpc3RyeSAgID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsJICAKLSAgICBMYWJlbHNBbmRJZHMgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbElkcyAgID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRTZXJ2aWNlVHlwZUxhYmVscygpOwotCS8vcnNrcmVnCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uICA9IDA7Ci0gICAgU3RyaW5nW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUlkcyA9IGxhYmVsSWRzLmdldElkc18oKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZElkID0gaWRzLmdldFR5cGVJZCgpOwotICAgIAotICAgIHdlYnNlcnZpY2VUeXBlXy5yZW1vdmVMaXN0ZW5lciggU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXJfICk7Ci0gICAgd2Vic2VydmljZVR5cGVfLnNldEl0ZW1zKCBsYWJlbElkcy5nZXRMYWJlbHNfKCkgKTsKLSAgICAgICAgCi0gICAgLy8gTm93IGZpbmQgdGhlIHNlbGVjdGVkIG9uZS4KLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgc2VydmljZUlkcy5sZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGlmKCBzZWxlY3RlZElkLmVxdWFscyggc2VydmljZUlkc1tpbmRleCBdKSApCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9IGluZGV4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgd2Vic2VydmljZVR5cGVfLnNlbGVjdCggc2VsZWN0aW9uICk7Ci0gICAgd2Vic2VydmljZVR5cGVfLmFkZExpc3RlbmVyKCBTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lcl8gKTsKLSAgICBpZHNfICAgICAgPSBpZHM7ICAKLSAgICBsYWJlbElkc18gPSBsYWJlbElkczsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcigpCi0gIHsKLSAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSB3ZWJzZXJ2aWNlVHlwZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAKLSAgICBpZHNfLnNldFR5cGVJZCggbGFiZWxJZHNfLmdldElkc18oKVtzZWxlY3Rpb25JbmRleF0gKTsKLSAgICAKLSAgICByZXR1cm4gaWRzXzsgIAotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRTdGFydFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBzdGFydFNlcnZpY2VfLmdldFNlbGVjdGlvbigpICk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U3RhcnRTZXJ2aWNlKCBCb29sZWFuIHZhbHVlICkKLSAgewotICAgIHN0YXJ0U2VydmljZV8uc2V0U2VsZWN0aW9uKCB2YWx1ZS5ib29sZWFuVmFsdWUoKSApOwotICB9Ci0KLSAgcHVibGljIEJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCB0ZXN0U2VydmljZV8uZ2V0U2VsZWN0aW9uKCkgJiYgc3RhcnRTZXJ2aWNlXy5nZXRTZWxlY3Rpb24oKSApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZSggQm9vbGVhbiB2YWx1ZSApCi0gIHsKLSAgICB0ZXN0U2VydmljZV8uc2V0U2VsZWN0aW9uKCB2YWx1ZS5ib29sZWFuVmFsdWUoKSApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuIGdldE1vbml0b3JTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbihtb25pdG9yU2VydmljZS5nZXRTZWxlY3Rpb24oKSAmJiBzdGFydFNlcnZpY2VfLmdldFNlbGVjdGlvbigpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoQm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIG1vbml0b3JTZXJ2aWNlLnNldFNlbGVjdGlvbih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0gIH0KLQotICBwdWJsaWMgQm9vbGVhbiBnZXRQdWJsaXNoU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oIGxhdW5jaFVkZGlfLmdldFNlbGVjdGlvbigpICYmIHN0YXJ0U2VydmljZV8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFNlcnZpY2UoIEJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgbGF1bmNoVWRkaV8uc2V0U2VsZWN0aW9uKCB2YWx1ZS5ib29sZWFuVmFsdWUoKSApOyAgCi0gIH0KLQotICBwdWJsaWMgQm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggZ2VuZXJhdGVQcm94eV8uZ2V0U2VsZWN0aW9uKCkgJiYgc3RhcnRTZXJ2aWNlXy5nZXRTZWxlY3Rpb24oKSApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KCBCb29sZWFuIHZhbHVlICkKLSAgewotICAgIGdlbmVyYXRlUHJveHlfLnNldFNlbGVjdGlvbiggdmFsdWUuYm9vbGVhblZhbHVlKCkgKTsgIAotICB9Ci0KLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIHByZWZlcmVuY2VzV2lkZ2V0Xy5nZXRSZXNvdXJjZUNvbnRleHQoKTsgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoIFJlc291cmNlQ29udGV4dCBjb250ZXh0ICkKLSAgewotICAgIHByZWZlcmVuY2VzV2lkZ2V0Xy5zZXRSZXNvdXJjZUNvbnRleHQoIGNvbnRleHQgKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCkKLSAgewotICAgIGhhbmRsZVN0YXJ0UHJlc3NlZCgpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIAotICAgIC8vIElmIHRoZSB3ZWJzZXJ2aWNlIGhhcyBub3QgYmVlbiBzZWxlY3RlZCB0aGVuIHVzZXIgY2FuIG5vdCBtb3ZlCi0gICAgLy8gZm9yd2FyZCB0byB0aGUgbmV4dCBwYWdlLgotICAgIGlmKCB3ZWJzZXJ2aWNlVHlwZV8uZ2V0VGV4dCgpLmVxdWFscygiIikgKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCAiIiwgU3RhdHVzLkVSUk9SICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNGRjZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kCi17ICAgIAotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyXzsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uXzsKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICAvLyByc2tyZWcJICAKLSAgICAvL1dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICBTdHJpbmcgdHlwZSAgICAgID0gZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0V2ViU2VydmljZVR5cGUoKTsgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBydW50aW1lICAgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldERlZmF1bHRSdW50aW1lVmFsdWVGb3IoIHR5cGUgKTsKLQkKLSAgICAvL1N0cmluZyBzZXJ2ZXJJRCAgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldERlZmF1bHRTZXJ2ZXJWYWx1ZUZvciggdHlwZSApOwotICAgIFN0cmluZyBmYWN0b3J5SUQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldERlZmF1bHRTZXJ2ZXJWYWx1ZUZvcih0eXBlKTsKLSAgICAvLyByc2tyZWcgICAgCi0gICAgdHlwZVJ1bnRpbWVTZXJ2ZXJfID0gbmV3IFR5cGVSdW50aW1lU2VydmVyKCk7Ci0gICAgCi0gICAgdHlwZVJ1bnRpbWVTZXJ2ZXJfLnNldFR5cGVJZCggdHlwZSApOwotICAgIHR5cGVSdW50aW1lU2VydmVyXy5zZXRSdW50aW1lSWQoIHJ1bnRpbWUgKTsKLSAgICB0eXBlUnVudGltZVNlcnZlcl8uc2V0U2VydmVySWQoIGZhY3RvcnlJRCApOwotICAgIAotICAgIC8vRGVmYXVsdCB0aGUgdHlwZUlkIGZyb20gdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0JLy8gcnNrcmVnCi0gICAgU3RyaW5nW10gdHlwZUlkcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVR5cGVCeVNlbGVjdGlvbihpbml0aWFsU2VsZWN0aW9uXyk7Ci0JLy8gcnNrcmVnCi0gICAgaWYgKHR5cGVJZHMhPW51bGwgJiYgdHlwZUlkcy5sZW5ndGg+MCkKLSAgICB7Ci0gICAgICB0eXBlUnVudGltZVNlcnZlcl8uc2V0VHlwZUlkKHR5cGVJZHNbMF0pOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaW5pdGlhbFNlbGVjdGlvbl8gPSBzZWxlY3Rpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7IAotICAgIHJldHVybiB0eXBlUnVudGltZVNlcnZlcl87Ci0gIH0KLQotICBwdWJsaWMgQm9vbGVhbiBnZXRTdGFydFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRTdGFydFdlYlNlcnZpY2UoKSApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuIGdldFB1Ymxpc2hTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkgKTsKLSAgfQotCi0gIHB1YmxpYyBCb29sZWFuIGdldEdlbmVyYXRlUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRHZW5lcmF0ZVByb3h5KCkgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRNb25pdG9yU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0TW9uaXRvcldlYlNlcnZpY2UoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2YmUxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQgZXh0ZW5kcyBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kCi17ICAgIAotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBzdGFydFNlcnZpY2VfOwotICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgIHRlc3RTZXJ2aWNlXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBwdWJsaXNoU2VydmljZV87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgZ2VuZXJhdGVQcm94eV87Ci0JcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgICByZXNvdXJjZUNvbnRleHRfOwotICAgIAotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcigpCi0gIHsgCi0gICAgcmV0dXJuIHR5cGVSdW50aW1lU2VydmVyXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gc3RhcnRTZXJ2aWNlXzsgIAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHRlc3RTZXJ2aWNlXzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHB1Ymxpc2hTZXJ2aWNlXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIGdlbmVyYXRlUHJveHlfOyAgCi0gIH0KLQkKLQlwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGdldFJlc291cmNlQ29udGV4dCgpCi0JewotCQlyZXR1cm4gcmVzb3VyY2VDb250ZXh0XzsKLQl9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIGdlbmVyYXRlUHJveHlfIFRoZSBnZW5lcmF0ZVByb3h5XyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KGJvb2xlYW4gZ2VuZXJhdGVQcm94eV8pCi0gIHsKLSAgICB0aGlzLmdlbmVyYXRlUHJveHlfID0gZ2VuZXJhdGVQcm94eV87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBwdWJsaXNoU2VydmljZV8gVGhlIHB1Ymxpc2hTZXJ2aWNlXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQdWJsaXNoU2VydmljZShib29sZWFuIHB1Ymxpc2hTZXJ2aWNlXykKLSAgewotICAgIHRoaXMucHVibGlzaFNlcnZpY2VfID0gcHVibGlzaFNlcnZpY2VfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gc3RhcnRTZXJ2aWNlXyBUaGUgc3RhcnRTZXJ2aWNlXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdGFydFNlcnZpY2UoYm9vbGVhbiBzdGFydFNlcnZpY2VfKQotICB7Ci0gICAgdGhpcy5zdGFydFNlcnZpY2VfID0gc3RhcnRTZXJ2aWNlXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHRlc3RTZXJ2aWNlXyBUaGUgdGVzdFNlcnZpY2VfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKGJvb2xlYW4gdGVzdFNlcnZpY2VfKQotICB7Ci0gICAgdGhpcy50ZXN0U2VydmljZV8gPSB0ZXN0U2VydmljZV87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB0eXBlUnVudGltZVNlcnZlcl8gVGhlIHR5cGVSdW50aW1lU2VydmVyXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXJfKQotICB7Ci0gICAgdGhpcy50eXBlUnVudGltZVNlcnZlcl8gPSB0eXBlUnVudGltZVNlcnZlcl87Ci0gIH0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoUmVzb3VyY2VDb250ZXh0IHJjKQotCXsKLQkJcmVzb3VyY2VDb250ZXh0XyA9IHJjOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9FeHBvcnRXU1dpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0V4cG9ydFdTV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQzZTU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0V4cG9ydFdTV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlB1Ymxpc2hXU1dpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgRXhwb3J0V1NXaWRnZXRCaW5kaW5nIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcKLXsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSAgIGNhbkZpbmlzaFJlZ2lzdHJ5OwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnk7Ci0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5OwotICBwcml2YXRlIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50IHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZzsKLQotICBwdWJsaWMgRXhwb3J0V1NXaWRnZXRCaW5kaW5nKCkKLSAgewotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZyA9IG5ldyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCgpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgU2VxdWVuY2VGcmFnbWVudCByb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgICAgICAgICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiV1NFeHBvcnQiKSk7Ci0gICAgICAgICAgICAgICByb290LmFkZChwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcpOwotICAgICAgICAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kKCksICIiKSk7Ci0gICAgICAgICAgICAgICByZXR1cm4gcm9vdDsgIAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5jYW5GaW5pc2hSZWdpc3RyeSA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlckNhbkZpbmlzaCh0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICAgIHRoaXMuZGF0YU1hcHBpbmdSZWdpc3RyeSA9IGRhdGFSZWdpc3RyeTsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcucmVnaXN0ZXJEYXRhTWFwcGluZ3ModGhpcy5kYXRhTWFwcGluZ1JlZ2lzdHJ5KTsKLSAgICAKLSAgICAvLyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudAotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9Qcml2YXRlVURESSIsIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmNsYXNzKTsKLSAgICAKLSAgICAvLyBMYXVuY2hXZWJTZXJ2aWNlc0V4cGxvcmVyQ29tbWFuZAotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJGb3JjZUxhdW5jaE91dHNpZGVJREUiLCBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5LmFkZE1hcHBpbmcoUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiTGF1bmNoT3B0aW9ucyIsIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQuY2xhc3MpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIHRoaXMud2lkZ2V0UmVnaXN0cnkgPSB3aWRnZXRSZWdpc3RyeTsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyh0aGlzLndpZGdldFJlZ2lzdHJ5KTsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCgiV1NFeHBvcnQiLCAKLSAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfUFVCTElTSCIpLAotICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTX1BVQkxJU0giKSwKLSAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgewotICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgUHVibGlzaFdTV2lkZ2V0KHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL1B1Ymxpc2hXU0RMV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvUHVibGlzaFdTRExXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYzMwNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvUHVibGlzaFdTRExXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIFB1Ymxpc2hXU0RMV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIHB1YmxpYyBQdWJsaXNoV1NETFdpZGdldEJpbmRpbmcoKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlRnJhZ21lbnQoKTsgIAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpLCAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9TZXJ2ZXJXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9TZXJ2ZXJXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzlmMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvU2VydmVyV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ29tcHV0ZUVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZU1vbml0b3JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLk1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuQ2hlY2tGb3JNaXNzaW5nRmlsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YS5TZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5GaW5pc2hGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuc2VsZWN0aW9uLlNlbGVjdGlvblRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlB1Ymxpc2hXU1dpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0Lk9iamVjdFNlbGVjdGlvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5PYmplY3RTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5BZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3RXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hEZWZhdWx0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkZpbmlzaEphdmFUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5UZXN0RGVmYXVsdGluZ0ZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuV1NETFRlc3RMYXVuY2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkuZXh0ZW5zaW9uLlByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkuZXh0ZW5zaW9uLlNlcnZpY2VSb290RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLlNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLlNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMucnVudGltZS5TZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUuU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnRlc3QuTGF1bmNoRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMudGVzdC5TZXJ2aWNlVGVzdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnRlc3QuU2VydmljZVRlc3RXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMudGVzdC5XZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5XU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi1wdWJsaWMgY2xhc3MgU2VydmVyV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIHByaXZhdGUgQ2FuRmluaXNoUmVnaXN0cnkgICBjYW5GaW5pc2hSZWdpc3RyeV87Ci0gIHByaXZhdGUgV2lkZ2V0UmVnaXN0cnkgICAgICB3aWRnZXRSZWdpc3RyeV87Ci0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWc7Ci0KLSAgcHVibGljIFNlcnZlcldpZGdldEJpbmRpbmcoKQotICB7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnID0gbmV3IFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50KCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmljZVJvb3RDb21tYW5kRnJhZ21lbnQoKTsgIAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gICAgY2FuRmluaXNoUmVnaXN0cnlfID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnLnJlZ2lzdGVyQ2FuRmluaXNoKGNhbkZpbmlzaFJlZ2lzdHJ5Xyk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpLCAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnlfID0gZGF0YVJlZ2lzdHJ5OwotICAgIAotICAgIC8vIEJlZm9yZSBTZXJ2ZXJXaXphcmRXaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTdGFydFNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBDcmVhdGVNb25pdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIENvbXB1dGVFbmRwb2ludENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHVibGlzaFNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIAotICAgIC8vIEFmdGVyIFNlcnZlcldpemFyZFdpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJTdGFydFNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJUZXN0U2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIk1vbml0b3JTZXJ2aWNlIiwgQ3JlYXRlTW9uaXRvckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIk1vbml0b3JTZXJ2aWNlIiwgQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiUHVibGlzaFNlcnZpY2UiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyBCZWZvcmUgT2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAKLSAgICAvLyBCZWZvcmUgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0IiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZUoyRUVWZXJzaW9uIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlTmVlZEVBUiIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudE5lZWRFQVIiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICAKLSAgICAgICAgICAgIAotICAgIC8vIEFmdGVyIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiU2VydmljZUoyRUVWZXJzaW9uIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiU2VydmljZVByb2plY3QyRUFSUHJvamVjdCIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiU2VydmljZU5lZWRFQVIiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudE5lZWRFQVIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0KLSAgICAvLyBNYXAgZnJhZ21lbnRzIHRoYXQgZGVwZW5kIG9uIGRhdGEuICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJFeHRlbnNpb25GcmFnbWVudC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlTW9uaXRvckNvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDcmVhdGVNb25pdG9yQ29tbWFuZC5jbGFzcywgIk1vbml0b3JlZFBvcnQiLCBDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyBDb21wdXRlRW5kcG9pbnRDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5jbGFzcywgIkVuZHBvaW50IiwgU2VydmljZVRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbXB1dGVFbmRwb2ludENvbW1hbmQuY2xhc3MsICJFbmRwb2ludCIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotCi0gICAgLy9TZXJ2aWNlVGVzdFdpZGdldCBtYXBwaW5ncyAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZpY2VUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDcmVhdGVNb25pdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVRlc3RGYWNpbGl0aWVzIiwgU2VydmljZVRlc3RXaWRnZXQuY2xhc3MpOyAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZVRlc3RXaWRnZXQuY2xhc3MsICJMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcywgIkxhdW5jaGVkU2VydmljZVRlc3ROYW1lIiwgRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcywgIkxhdW5jaGVkU2VydmljZVRlc3ROYW1lIiwgVGVzdERlZmF1bHRpbmdGcmFnbWVudC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb3h5UHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm94eVByb2plY3RFQVIiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdFR5cGUiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RUeXBlSWQiLCBudWxsKTsgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVyIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJGYWN0b3J5SWQiLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJKMkVFVmVyc2lvbiIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCAiU2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJFeGlzdGluZ1NlcnZlcklkIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuY2xhc3MsICJBZGRlZFByb2plY3RUb1NlcnZlciIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyBCZWZvcmUgQ2xpZW50IFRlc3Qgd2lkZ2V0LgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIAotICAgIC8vIEJlZm9yZSBDbGllbnRUZXN0V2lkZ2V0Ci0gICAgICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFRlc3REZWZhdWx0aW5nRnJhZ21lbnQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJGb2xkZXIiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJKc3BGb2xkZXIiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJSdW5DbGllbnRUZXN0IixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiTWV0aG9kcyIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgCi0gICAgCi0gICAgLy8gQWZ0ZXIgQ2xpZW50VGVzdFdpZGdldCAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IixGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlJ1bkNsaWVudFRlc3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJNZXRob2RzIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiVGVzdFNlcnZpY2UiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RJRCIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiSXNUZXN0V2lkZ2V0IixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIC8vIFB1Ymxpc2hXU1dpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHVibGlzaFNlcnZpY2UiLCBQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9QdWJsaWNVRERJIiwgbnVsbCk7Ci0gICAgCi0gICAgLy8gUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9Qcml2YXRlVURESSIsIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmNsYXNzKTsKLSAgICAKLSAgICAvLyBMYXVuY2hXZWJTZXJ2aWNlc0V4cGxvcmVyQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIlB1Ymxpc2hUb1ByaXZhdGVVRERJIiwgTGF1bmNoRnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIlB1Ymxpc2hUb1B1YmxpY1VEREkiLCBMYXVuY2hGcmFnbWVudC5jbGFzcyk7Ci0gICAgLy8gVE9ETyBOZWVkIGRlZmF1bHRzIGZvciB0aGVzZSBwcm9wZXJ0aWVzLgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIkZvcmNlTGF1bmNoT3V0c2lkZUlERSIsIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIkxhdW5jaE9wdGlvbnMiLCBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kLmNsYXNzKTsKLSAgCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnlfID0gd2lkZ2V0UmVnaXN0cnk7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnLnJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mod2lkZ2V0UmVnaXN0cnlfKTsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIlNlcnZlcldpemFyZFdpZGdldCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19QUk9KRUNUIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfUFJPSkVDVCIpLAotCQkJCSAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0JCQkJICAgICAgICB7Ci0JCQkJICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQkJCSAgICAgICAgICB7Ci0JCQkJICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJXaXphcmRXaWRnZXQoIHRydWUgKTsKLQkJCQkgICAgICAgICAgfQotCQkJCSAgICAgICAgfSApOwotCi0gICAgTWVzc2FnZVV0aWxzIGNyZWF0aW9uVUlNZXNzYWdlVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkucGx1Z2luIiwgdGhpcyk7Ci0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvblVJTWVzc2FnZVV0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfT0JKRUNUX1NFTEVDVElPTiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25VSU1lc3NhZ2VVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfT0JKRUNUX1NFTEVDVElPTiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RTZWxlY3Rpb25XaWRnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX1JVTlRJTUVfU0VMRUNUSU9OIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfUlVOVElNRV9TRUxFQ1RJT04iKSwKLQkJCQkJCW5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCQkJCQkJICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkJCQkJCSAgewotCQkJCQkJICAgIHJldHVybiBuZXcgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldCgpOwotCQkJCQkJICB9Ci0JCQkJCQl9ICk7IAotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIlRlc3RTZXJ2aWNlIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTVEVTVCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTVEVTVCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlVGVzdFdpZGdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQ2xpZW50VGVzdFdpZGdldCIsIAotICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19TQU1QTEUiKSwKLSAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU19TQU1QTEUiKSwKLSAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50VGVzdFdpZGdldCgpOyAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiUHVibGlzaCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19QVUJMSVNIIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfUFVCTElTSCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQdWJsaXNoV1NXaWRnZXQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgfQotICAgIAotICBwcml2YXRlIGNsYXNzIEluaXRSZWdpc3RyaWVzIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotICB7ICAKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgY2xpZW50UmVnaXN0cnlfID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIHByaXZhdGUgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgc2VydmVyUmVnaXN0cnlfID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIAotICAgIHsKLSAgICAgIGNsaWVudFJlZ2lzdHJ5Xy5zZXREYXRhTWFwcGluZ1JlZ2lzdHJ5KCBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyApOwotICAgICAgY2xpZW50UmVnaXN0cnlfLnNldFdpZGdldFJlZ2lzdHJ5KCB3aWRnZXRSZWdpc3RyeV8gKTsKLSAgICAgIGNsaWVudFJlZ2lzdHJ5Xy5zZXRDYW5GaW5pc2hSZWdpc3RyeSggY2FuRmluaXNoUmVnaXN0cnlfICk7Ci0gICAgICAKLSAgICAgIHNlcnZlclJlZ2lzdHJ5Xy5zZXREYXRhTWFwcGluZ1JlZ2lzdHJ5KCBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyApOwotICAgICAgc2VydmVyUmVnaXN0cnlfLnNldFdpZGdldFJlZ2lzdHJ5KCB3aWRnZXRSZWdpc3RyeV8gKTsKLSAgICAgIHNlcnZlclJlZ2lzdHJ5Xy5zZXRDYW5GaW5pc2hSZWdpc3RyeSggY2FuRmluaXNoUmVnaXN0cnlfICk7Ci0gICAgICAKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBDbGllbnRGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudAotICB7Ci0gICAgYm9vbGVhbiBnZW5Qcm94eV8gPSBmYWxzZTsKLSAgICAKLSAgICBwdWJsaWMgQ2xpZW50RnJhZ21lbnQoKQotICAgIHsgICAgICAKLSAgICAgIHNldENvbmRpdGlvbiggbmV3IENvbmRpdGlvbigpIAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5Qcm94eV87Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgIAotICAgICAgU2VxdWVuY2VGcmFnbWVudCBjbGllbnRSb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgICAgIAotICAgICAgY2xpZW50Um9vdC5hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kKCBmYWxzZSApLCAiIikpOwotICAgICAgY2xpZW50Um9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZCgpLCAiIikpOyAvL05vdGU6IGFkZGVkIGhlcmUgZm9yIGNsaWVudAotICAgICAgY2xpZW50Um9vdC5hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kKCksICIiKSk7ICAgICAgCi0gICAgICBjbGllbnRSb290LmFkZCggbmV3IENsaWVudEV4dGVuc2lvbkZyYWdtZW50KCkgKTsKLSAgICAgIGNsaWVudFJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kKCksICIiICkpOwotICAgICAgCi0gICAgICBzZXRUcnVlRnJhZ21lbnQoIGNsaWVudFJvb3QgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eSggYm9vbGVhbiBnZW5Qcm94eSApCi0gICAgewotICAgICAgZ2VuUHJveHlfID0gZ2VuUHJveHk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gICAgewotICAgICAgLy8gTWFwIHRoZSBvdXRwdXQgb2YgdGhlIHNlcnZpY2Ugc2NlbmFyaW8gdG8gdGhlIGNsaWVudCBzY2VuYXJpby4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBTZXJ2aWNlUm9vdENvbW1hbmRGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLSAgewotICAgIHB1YmxpYyBTZXJ2aWNlUm9vdENvbW1hbmRGcmFnbWVudCgpCi0gICAgewotICAgICAgLy9hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENoZWNrRm9yTWlzc2luZ0ZpbGVzKCksICIiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgSW5pdFJlZ2lzdHJpZXMoKSwgIiIgKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoICJTZXJ2ZXJXaXphcmRXaWRnZXQiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IE9iamVjdFNlbGVjdGlvbkZyYWdtZW50KCkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggIlNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLSAgICAgIC8vYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kKCksICIiKSk7IC8vTm90ZTogYWRkZWQgaGVyZSAgICAgICAgICAgIAotICAgICAgLy9hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZCgpLCAiIikpOwotICAgICAgLy9hZGQoIG5ldyBTZXJ2ZXJFeHRlbnNpb25GcmFnbWVudCgpICk7Ci0JICBhZGQoIG5ldyBTZXJ2aWNlUm9vdEZyYWdtZW50KCkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENyZWF0ZU1vbml0b3JDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDb21wdXRlRW5kcG9pbnRDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTZXJ2aWNlVGVzdEZyYWdtZW50KCAiVGVzdFNlcnZpY2UiKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFRlc3REZWZhdWx0aW5nRnJhZ21lbnQoKSwiIikpOwotICAgICAgYWRkKCBuZXcgQ2xpZW50RnJhZ21lbnQoKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQobmV3IE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kKCksIiIpKTsKLSAgICAgIGFkZCggbmV3IENsaWVudFRlc3RGcmFnbWVudCggIkNsaWVudFRlc3RXaWRnZXQiKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoICJQdWJsaXNoIikgKTsKLSAgICAgIGFkZChwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcpOwotICAgICAgYWRkKG5ldyBMYXVuY2hGcmFnbWVudCgpKTsKLSAgICAgIGFkZChuZXcgRmluaXNoRnJhZ21lbnQoKSk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gICAgewotICAgICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKGRhdGFNYXBwaW5nUmVnaXN0cnlfKTsgICAKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotCi0gICAgICAvL2RhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIG51bGwpOwotICAgICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEluaXRpYWxTZWxlY3Rpb24iLCBudWxsKTsKLQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIk9iamVjdFNlbGVjdGlvbiIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRJbml0aWFsU2VsZWN0aW9uIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluaXRpYWxQcm9qZWN0IiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEluaXRpYWxQcm9qZWN0IiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotICAgICAgCi0gICAgICAvLyBNYXAgU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlN0YXJ0U2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQdWJsaXNoU2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgCSAgCi0gICAgICAvLyBNYXAgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBPYmplY3RTZWxlY3Rpb25GcmFnbWVudC5jbGFzcywgIlR5cGVSdW50aW1lU2VydmVyIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiU3RhcnRTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlB1Ymxpc2hTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlB1Ymxpc2hTZXJ2aWNlIiwgUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiUHVibGlzaFRvUHVibGljVURESSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy90byB0aGUgdGVzdCB3aXphcmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgU2VydmljZVRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFdTRExUZXN0TGF1bmNoQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBXU0RMVGVzdExhdW5jaENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0JICAKLSAgICAgIAotICAgICAgLy8gTWFwIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0IiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VKMkVFVmVyc2lvbiIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlTmVlZEVBUiIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudE5lZWRFQVIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIAotICAgICAgLy8gTWFwIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlckV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBTZXJ2aWNlVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHVibGlzaCIsIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmNsYXNzKTsgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIixXU0RMVGVzdExhdW5jaENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLQkgIAotCSAgICAvLyBTZXR1cCB0aGUgUHJlU2VydmljZURldmVsb3BDb21tYW5kLgotCQkJLy8KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiU3RhcnRTZXJ2aWNlIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJQdWJsaXNoU2VydmljZSIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOwkJCQotCQkJLy8KLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlSjJFRVZlcnNpb24iLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3RFQVIiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBudWxsICk7Ci0gICAgICAvLwotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIk9iamVjdFNlbGVjdGlvbiIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIG5ldyBTZWxlY3Rpb25UcmFuc2Zvcm1lcigpICk7Ci0JCQkKLQkJCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyApOwotICAgICAgCi0gICAgICAvLyBNYXAgQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBDcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm9qZWN0TmFtZSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0RUFSIiwgQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdE5hbWUiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyU2VydmVyIiwgQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzLCJTZXJ2ZXJGYWN0b3J5SWQiLG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlSjJFRVZlcnNpb24iLCBDcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MsICJKMkVFVmVyc2lvbiIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIlNlcnZpY2VOZWVkRUFSIixDcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MsIk5lZWRFQVIiLG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIklzU2VydmljZVByb2plY3RFSkIiLENyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAKLSAgICAgIC8vIE1hcCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiQ2xpZW50SWRzIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiTGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJKMmVlVmVyc2lvbiIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEZpbmlzaEphdmFUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgCi0gICAgICAvL1NlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTdGFydFNlcnZpY2UiLCBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVNlcnZlckluc3RhbmNlSWQiLCBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsIlNlcnZpY2VFeGlzdGluZ1NlcnZlciIsIG5ldyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclNlcnZlciIsIFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5jbGFzcywiU2VydmljZVNlcnZlclR5cGVJRCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlckluc3RJZCIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0YW5jZUlkIixudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5jbGFzcywgIlNhbXBsZUV4aXN0aW5nU2VydmVySW5zdElkIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIkNsaWVudEV4aXN0aW5nU2VydmVySW5zdGFuY2VJZCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kLmNsYXNzLCAiU2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkIiwgQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzLCJFeGlzdGluZ1NlcnZlcklkIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsICJBZGRlZFByb2plY3RUb1NlcnZlciIsIENyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQiLCBDcmVhdGVNb25pdG9yQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlckluc3RJZCIsIEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzLCAiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotCi0gICAgICAvLyBNYXAgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCBmb3IgU2VydmVyU3RhcnQoKQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0RUFSIiwgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkVhclByb2plY3ROYW1lIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQiLCBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCJFeGlzdGluZ1NlcnZlcklkIiwgbnVsbCk7Ci0gICAgICAgICAgCi0gICAgICAvLyBNYXAgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJveHlQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJveHlQcm9qZWN0RUFSIiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVySW5zdGFuY2UiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIkV4aXN0aW5nU2VydmVyIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiU2VydmVyRmFjdG9yeUlkIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJKMkVFVmVyc2lvbiIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJOZWVkRUFSIiwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgLy9TZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQgZm9yIGNsaWVudCBzaWRlCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXJJbnN0YW5jZSIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCJTYW1wbGVFeGlzdGluZ1NlcnZlciIsIG5ldyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIoKSk7Ci0KLSAgICAgIC8vIE1BUCBwb3N0IHNlcnZlciBjb25maWcgY2FsbAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkVhclByb2plY3ROYW1lIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlckluc3RhbmNlIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkV4aXN0aW5nU2VydmVySWQiLCBudWxsKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiU2V0RW5kcG9pbnRNZXRob2QiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiSXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlN0YXJ0U2VydmljZSIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJTZXJ2ZXIiLCBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5jbGFzcywiU2VydmljZVNlcnZlclR5cGVJZCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kLmNsYXNzLCAiU2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkIiwgTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQuY2xhc3MsIlNlcnZpY2VFeGlzdGluZ1NlcnZlciIsIG5ldyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIoKSk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlckluc3RhbmNlIiwgTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQuY2xhc3MsIlNhbXBsZUV4aXN0aW5nU2VydmVyIiwgbmV3IFNlcnZlckluc3RUb0lTZXJ2ZXJUcmFuc2Zvcm1lcigpKTsgICAgICAKLSAgICAgIAotICAgICAgLy8gTWFwIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFRlc3REZWZhdWx0aW5nRnJhZ21lbnQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJSdW5DbGllbnRUZXN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJNZXRob2RzIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyk7ICAgICAKLSAgICAKLSAgICAgIC8vTWFwIEZpbmlzaCBDb21tYW5kIAotICAgICAgCi0gICAgICAKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1NlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1NlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1YmU2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvcnVudGltZS9TZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5ydW50aW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uVmFsaWRhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUuQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lLlByb2plY3RTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5SdW50aW1lU2VydmVyU2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3RDaG9pY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0vKgotICoKLSAqIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQKLSAqIFRoaXMgd2lkZ2V0IGlzIHRoZSBwYXJlbnQgd2lkZ2V0IGZvciBzZXJ2ZXIgYW5kIGNsaWVudCBkZXBsb3ltZW50L2Vudmlyb25tZW50IHNldHRpbmdzIAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIFN0cmluZyBjcmVhdGVQbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpIjsKLSAgCi0gIC8qIENPTlRFWFRfSUQgUFdSUzAwMDIgZm9yIHRoZSBXaXphcmQgU2NlbmFyaW8gU2VydmljZSBjb25maWd1cmF0aW9uIG9mIHRoZSBSdW50aW1lIFNlbGVjdGlvbiBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19HUk9VUF9TRVJWSUNFID0gICJQV1JTMDAwMiI7Ci0gIAotICBwcml2YXRlIFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25XaWRnZXQgcnVudGltZVdpZGdldF87Ci0gIHByaXZhdGUgUHJvamVjdFNlbGVjdGlvbldpZGdldCAgICAgICBwcm9qZWN0V2lkZ2V0XzsKLSAgcHJpdmF0ZSBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0IGNsaWVudFdpZGdldF87Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgICAgICAgICBzZXJ2aWNlQ2hvaWNlc187Ci0gIHByaXZhdGUgVGV4dE1vZGlmeUxpc3RlbmVyICAgICAgICAgICB0ZXh0TGlzdGVuZXJfOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gaXNDbGllbnRXaWRnZXRWaXNpYmxlXyA9IHRydWU7Ci0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgVUlVdGlscyAgICAgIHVpVXRpbHMgID0gbmV3IFVJVXRpbHMobXNnVXRpbHNfLCBjcmVhdGVQbHVnaW5JZF8gKTsgCi0gICAgCi0gICAgQ29tcG9zaXRlIHJvb3QgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAxICk7Ci0gICAgCi0gICAgVGV4dCBtZXNzYWdlVGV4dCA9IG5ldyBUZXh0KCByb290LCBTV1QuV1JBUCB8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICAKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOyAKLSAgICBnZC5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0gICAgCi0gICAgbWVzc2FnZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgbWVzc2FnZVRleHQuc2V0VGV4dCgKLSAgICAgICAgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19HRU5FUkFMX1BST0pFQ1RfQU5EX0VBUiIsIG5ldyBTdHJpbmdbXSB7IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfU0VSVklDRV9TVUIiKX0pCi0gICAgICAgICsgIlxuIgotICAgICAgICArIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRUFSX1BST0pFQ1RfV0lMTF9CRV9DUkVBVEVEIikpOwotICAgIAotICAgIENvbXBvc2l0ZSBzZXJ2ZXJDb21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIHJvb3QsIDEsIDUsIDAgKTsKLSAgICAKLSAgICBHcm91cCBzZXJ2ZXJHcm91cCA9IHVpVXRpbHMuY3JlYXRlR3JvdXAoIHNlcnZlckNvbXAsICJMQUJFTF9TRUxFQ1RJT05fVklFV19USVRMRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBJTkZPUE9QX1BXUlNfR1JPVVBfU0VSVklDRSwKLQkJCQkJCQkJCQkJIDIsIDUsIDUpOwotICAgIAotICAgIHJ1bnRpbWVXaWRnZXRfID0gbmV3IFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25XaWRnZXQoIGZhbHNlICk7Ci0gICAgcnVudGltZVdpZGdldF8uYWRkQ29udHJvbHMoIHNlcnZlckdyb3VwLCBzdGF0dXNMaXN0ZW5lciApOwotICAgIHRleHRMaXN0ZW5lcl8gPSBuZXcgVGV4dE1vZGlmeUxpc3RlbmVyKCk7Ci0gICAgcnVudGltZVdpZGdldF8uYWRkTW9kaWZ5TGlzdGVuZXIoIHRleHRMaXN0ZW5lcl8gKTsKLSAgICAgICAgICAgICAKLSAgICBwcm9qZWN0V2lkZ2V0XyA9IG5ldyBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0KCk7Ci0gICAgcHJvamVjdFdpZGdldF8uYWRkQ29udHJvbHMoIHNlcnZlckdyb3VwLCBzdGF0dXNMaXN0ZW5lciApOwotICAgIAotICAgIGNsaWVudFdpZGdldF8gPSBuZXcgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldCgpOwotICAgIGNsaWVudFdpZGdldF8uYWRkQ29udHJvbHMoIHJvb3QsIHN0YXR1c0xpc3RlbmVyICk7Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgLy9JZiBnZW5lcmF0ZSBwcm94eSBpcyBub3Qgc2VsZWN0ZWQsIGRvbid0IHNob3cgdGhlIGNsaWVudCBwb3J0aW9uIG9mIHRoZSBwYWdlLgotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KCBCb29sZWFuIHZhbHVlICkKLSAgewotICAgIGNsaWVudFdpZGdldF8uc2V0VmlzaWJsZSggdmFsdWUuYm9vbGVhblZhbHVlKCkgKTsgCi0gICAgaXNDbGllbnRXaWRnZXRWaXNpYmxlXyA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBydW50aW1lV2lkZ2V0Xy5nZXRUeXBlUnVudGltZVNlcnZlcigpOyAgCi0gIH0KLSAgIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLSAgICBydW50aW1lV2lkZ2V0Xy5yZW1vdmVNb2RpZnlMaXN0ZW5lciggdGV4dExpc3RlbmVyXyApOwotICAgIHJ1bnRpbWVXaWRnZXRfLnNldFR5cGVSdW50aW1lU2VydmVyKCBpZHMgKTsgIAotICAgIHByb2plY3RXaWRnZXRfLnNldFR5cGVSdW50aW1lU2VydmVyKGlkcyk7Ci0gICAgcnVudGltZVdpZGdldF8uYWRkTW9kaWZ5TGlzdGVuZXIoIHRleHRMaXN0ZW5lcl8gKTsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBjbGllbnRXaWRnZXRfLmdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCk7ICAKLSAgfQotICAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgY2xpZW50V2lkZ2V0Xy5zZXRDbGllbnRUeXBlUnVudGltZVNlcnZlciggaWRzICk7ICAKLSAgfQotICAKLSAgcHVibGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHByb2plY3RXaWRnZXRfLmdldFByb2plY3RDaG9pY2VzKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoU2VsZWN0aW9uTGlzdENob2ljZXMgc2VydmljZVByb2plY3QyRUFSUHJvamVjdCkKLSAgewotICAgIHByb2plY3RXaWRnZXRfLnNldFByb2plY3RDaG9pY2VzKHNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QpOwotICB9Ci0gIAotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRSdW50aW1lMkNsaWVudFR5cGVzKCk7Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0UnVudGltZTJDbGllbnRUeXBlcyhTZWxlY3Rpb25MaXN0Q2hvaWNlcyBydW50aW1lMkNsaWVudFR5cGVzKQotICB7Ci0gICAgY2xpZW50V2lkZ2V0Xy5zZXRSdW50aW1lMkNsaWVudFR5cGVzKHJ1bnRpbWUyQ2xpZW50VHlwZXMpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VKMkVFVmVyc2lvbigpCi0gIHsKLSAgICByZXR1cm4gcnVudGltZVdpZGdldF8uZ2V0SjJFRVZlcnNpb24oKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUoyRUVWZXJzaW9uKFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAgIHJ1bnRpbWVXaWRnZXRfLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgICBwcm9qZWN0V2lkZ2V0Xy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SjJFRVZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0SjJFRVZlcnNpb24oKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgY2xpZW50V2lkZ2V0Xy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFNlcnZpY2VOZWVkRUFSKCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0V2lkZ2V0Xy5nZXROZWVkRUFSKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOZWVkRUFSKGJvb2xlYW4gYikKLSAgewotICAgIHByb2plY3RXaWRnZXRfLnNldE5lZWRFQVIoYik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldENsaWVudE5lZWRFQVIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0Q2xpZW50TmVlZEVBUigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnROZWVkRUFSKGJvb2xlYW4gYikKLSAgewotICAgIGNsaWVudFdpZGdldF8uc2V0Q2xpZW50TmVlZEVBUihiKTsKLSAgfSAgCi0gIAotICBwcml2YXRlIGNsYXNzIFRleHRNb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIAotICB7Ci0gIAlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gIAl7Ci0JCWlmKCBjbGllbnRXaWRnZXRfLmlzVmlzaWJsZSgpICkKLSAgCQl7ICAJICAKLQkJICBUeXBlUnVudGltZVNlcnZlciBzZXJ2aWNlSWRzID0gcnVudGltZVdpZGdldF8uZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKTsKLSAgCQkgIFR5cGVSdW50aW1lU2VydmVyIGNsaWVudElkcyAgPSBjbGllbnRXaWRnZXRfLmdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCk7Ci0gIAkJCi0gIAkJICBjbGllbnRJZHMuc2V0UnVudGltZUlkKCBzZXJ2aWNlSWRzLmdldFJ1bnRpbWVJZCgpICk7Ci0gIAkJICBjbGllbnRJZHMuc2V0U2VydmVySWQoIHNlcnZpY2VJZHMuZ2V0U2VydmVySWQoKSApOwotICAJCSAgY2xpZW50SWRzLnNldFNlcnZlckluc3RhbmNlSWQoIHNlcnZpY2VJZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpICk7Ci0KLSAgCQkgIGNsaWVudFdpZGdldF8uc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIGNsaWVudElkcyApOwotICAJCSAgY2xpZW50V2lkZ2V0Xy5zZXRKMkVFVmVyc2lvbihydW50aW1lV2lkZ2V0Xy5nZXRKMkVFVmVyc2lvbigpKTsgIAkKLSAgCQl9Ci0JCQotCQkvL1NldCB0aGUgY3VycmVudCBzZXJ2ZXIgc2VsZWN0aW9uIGFuZCBKMkVFIGxldmVsIG9uIHRoZSBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0Ci0JCXByb2plY3RXaWRnZXRfLnNldFR5cGVSdW50aW1lU2VydmVyKHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCkpOwotCQlwcm9qZWN0V2lkZ2V0Xy5zZXRKMkVFVmVyc2lvbihydW50aW1lV2lkZ2V0Xy5nZXRKMkVFVmVyc2lvbigpKTsKLSAgCX0KLSAgfQotIAotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2dldFN0YXR1cygpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpIAotICB7Ci0gICAgU3RhdHVzIHNlcnZpY2VTdGF0dXMgPSBydW50aW1lV2lkZ2V0Xy5nZXRTdGF0dXMoKTsKLSAgICBTdGF0dXMgcHJvamVjdFN0YXR1cyA9IHByb2plY3RXaWRnZXRfLmdldFN0YXR1cygpOwotICAgIFN0YXR1cyBjbGllbnRTdGF0dXMgID0gY2xpZW50V2lkZ2V0Xy5nZXRTdGF0dXMoKTsgICAgCi0gICAgU3RhdHVzIGZpbmFsU3RhdHVzICAgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIAotICAgIC8vIGNhbGwgY2hpbGQgd2lkZ2V0cycgZ2V0U3RhdHVzKCkKLSAgICBpZiggc2VydmljZVN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgewotICAgICAgZmluYWxTdGF0dXMgPSBzZXJ2aWNlU3RhdHVzOwotICAgIH0KLSAgICBlbHNlIGlmKCBjbGllbnRTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IgKQotICAgIHsKLSAgICAgIGlmIChpc0NsaWVudFdpZGdldFZpc2libGVfKQotICAgICAgICBmaW5hbFN0YXR1cyA9IGNsaWVudFN0YXR1czsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHByb2plY3RTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09IFN0YXR1cy5FUlJPUikgewotICAgICAgZmluYWxTdGF0dXMgPSBwcm9qZWN0U3RhdHVzOwotICAgIH0KLSAgICAKLSAgICAvL1ZhbGlkYXRlIHNlcnZpY2Ugc2lkZSBzZXJ2ZXIgdGFyZ2V0IGFuZCBKMkVFIGxldmVsCi0gICAgU2VsZWN0aW9uTGlzdENob2ljZXMgc2VydmljZVByb2plY3RzID0gcHJvamVjdFdpZGdldF8uZ2V0UHJvamVjdENob2ljZXMoKTsKLSAgICBTdHJpbmcgc2VydmljZUVBUk5hbWUgPSBudWxsOwotICAgIFN0cmluZyBzZXJ2aWNlUHJvak5hbWUgPSBudWxsOwotICAgIFN0cmluZyBzZXJ2aWNlU2VydmVyRmFjdG9yeUlkID0gbnVsbDsKLSAgICBWYWxpZGF0aW9uVXRpbHMgdmFsVXRpbHMgPSBuZXcgVmFsaWRhdGlvblV0aWxzKCk7Ci0gICAgaWYgKHNlcnZpY2VQcm9qZWN0cyE9bnVsbCkKLSAgICB7Ci0gICAgICBzZXJ2aWNlRUFSTmFtZSAgPSBzZXJ2aWNlUHJvamVjdHMuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAgICAgc2VydmljZVByb2pOYW1lID0gc2VydmljZVByb2plY3RzLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIHNlcnZpY2VTZXJ2ZXJGYWN0b3J5SWQgPSBydW50aW1lV2lkZ2V0Xy5nZXRUeXBlUnVudGltZVNlcnZlcigpLmdldFNlcnZlcklkKCk7Ci0gICAgICBTdHJpbmcgc2VydmljZUoyRUVsZXZlbCA9IHJ1bnRpbWVXaWRnZXRfLmdldEoyRUVWZXJzaW9uKCk7Ci0gICAgICBTdGF0dXMgc2VydmljZVByb2plY3RTdGF0dXMgPSB2YWxVdGlscy52YWxpZGF0ZVByb2plY3RUYXJnZXRBbmRKMkVFKHNlcnZpY2VQcm9qTmFtZSwgc2VydmljZUVBUk5hbWUsIHNlcnZpY2VTZXJ2ZXJGYWN0b3J5SWQsIHNlcnZpY2VKMkVFbGV2ZWwpOwotICAgICAgaWYoc2VydmljZVByb2plY3RTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgewotICAgICAgICBmaW5hbFN0YXR1cyA9IHNlcnZpY2VQcm9qZWN0U3RhdHVzOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvL0Vuc3VyZSB0aGUgc2VydmljZSBwcm9qZWN0IHR5cGUgKFdlYi9FSkIpIGlzIHZhbGlkCi0gICAgaWYgKHNlcnZpY2VQcm9qTmFtZSE9bnVsbCAmJiBzZXJ2aWNlUHJvak5hbWUubGVuZ3RoKCk+MCkKLSAgICB7Ci0gICAgICBJUHJvamVjdCBzZXJ2aWNlUHJvaiA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0oc2VydmljZVByb2pOYW1lKSkpOwotICAgICAgaWYgKHNlcnZpY2VQcm9qLmV4aXN0cygpKQotICAgICAgewotICAgICAgICAvL0RldGVybWluZSB3aGV0aGVyIGFuIEVKQiBwcm9qZWN0IGlzIHJlcXVpcmVkCi0gICAgICAgIFN0cmluZyB3ZWJTZXJ2aWNlUnVudGltZUlkID0gcnVudGltZVdpZGdldF8uZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRSdW50aW1lSWQoKTsKLSAgICAgICAgU3RyaW5nIHdlYlNlcnZpY2VUeXBlSWQgPSBydW50aW1lV2lkZ2V0Xy5nZXRUeXBlUnVudGltZVNlcnZlcigpLmdldFR5cGVJZCgpOwotCQkvLyByc2tyZWcKLSAgICAgICAgLy9XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZ2lzdHJ5ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgLy9TdHJpbmcgc2VydmVyVHlwZUlkID0gd3NzcnRSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoc2VydmljZVNlcnZlckZhY3RvcnlJZCkuZ2V0SWQoKTsKLQkJLy9TdHJpbmcgc2VydmVyVHlwZUlkID0gd3NzcnRSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoc2VydmljZVNlcnZlckZhY3RvcnlJZCkuZ2V0SWQoKTsKLSAgICAgICAgYm9vbGVhbiBpc0VKQlJlcXVpcmVkID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5yZXF1aXJlc0VKQk1vZHVsZUZvcihzZXJ2aWNlU2VydmVyRmFjdG9yeUlkLCB3ZWJTZXJ2aWNlUnVudGltZUlkLCB3ZWJTZXJ2aWNlVHlwZUlkKTsKLSAgICAgICAgaWYgKCFpc0VKQlJlcXVpcmVkKQotICAgICAgICB7Ci0gICAgICAgICAgLy9DaGVjayB0aGUgV2ViIHNlcnZpY2UgdHlwZSB0byBzZWUgaWYgYW4gRUpCIHByb2plY3QgaXMgcmVxdWlyZWQKLSAgICAgICAgICAvL2lzRUpCUmVxdWlyZWQgPSB3c3NydFJlZ2lzdHJ5LnJlcXVpcmVzRUpCUHJvamVjdCh3ZWJTZXJ2aWNlVHlwZUlkKTsKLQkJCWlzRUpCUmVxdWlyZWQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLnJlcXVpcmVzRUpCUHJvamVjdCh3ZWJTZXJ2aWNlVHlwZUlkKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGlzRUpCUmVxdWlyZWQgJiYgIVJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHNlcnZpY2VQcm9qKSkKLSAgICAgICAgewotICAgICAgICAgIGZpbmFsU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0lOVkFMSURfRUpCX1BST0pFQ1QiLG5ldyBTdHJpbmdbXXtzZXJ2aWNlUHJvak5hbWV9KSxTdGF0dXMuRVJST1IpOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBpZiAoIWlzRUpCUmVxdWlyZWQgJiYgIVJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHNlcnZpY2VQcm9qKSkKLSAgICAgICAgewotICAgICAgICAgIGZpbmFsU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0lOVkFMSURfV0VCX1BST0pFQ1QiLG5ldyBTdHJpbmdbXXtzZXJ2aWNlUHJvak5hbWV9KSxTdGF0dXMuRVJST1IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChpc0NsaWVudFdpZGdldFZpc2libGVfKSAKLSAgICB7Ci0gICAgICBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjbGllbnRQcm9qZWN0cyA9IGNsaWVudFdpZGdldF8uZ2V0UHJvamVjdFNlbGVjdGlvbldpZGdldCgpLmdldFByb2plY3RDaG9pY2VzKCk7ICAgICAgCi0gICAgICBpZiAoY2xpZW50UHJvamVjdHMhPW51bGwgJiYgc2VydmljZVByb2plY3RzIT1udWxsKSAKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGNsaWVudEVBUk5hbWUgICA9IGNsaWVudFByb2plY3RzLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgU3RyaW5nIGNsaWVudFByb2pOYW1lICA9IGNsaWVudFByb2plY3RzLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLQotICAgICAgICAvLyBjaGVjayBzYW1lIEVBUi1uZXNzIC0tLS0tCi0gICAgICAgIFN0cmluZyB3YXJuaW5nX21zZyA9IGdldEVBUlByb2plY3RXYXJuaW5nTWVzc2FnZShzZXJ2aWNlRUFSTmFtZSwgY2xpZW50RUFSTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBpZiggY2xpZW50UHJvak5hbWUgIT0gbnVsbCAmJiBzZXJ2aWNlUHJvak5hbWUgIT0gbnVsbCAmJiAKLSAgICAgICAgICAgIGNsaWVudFByb2pOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIHNlcnZpY2VQcm9qTmFtZSApKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGZpbmFsU3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5FUlJPUikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3YXJuaW5nX21zZyA9IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiTVNHX1NBTUVfQ0xJRU5UX0FORF9TRVJWSUNFX0VBUlMiLCBuZXcgU3RyaW5nW117ICJXRUIiIH0gKTsKLSAgICAgICAgICAgIGZpbmFsU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIHdhcm5pbmdfbXNnLCBTdGF0dXMuV0FSTklORyApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3YXJuaW5nX21zZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGZpbmFsU3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5FUlJPUikKLSAgICAgICAgICAJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiLCB3YXJuaW5nX21zZywgU3RhdHVzLldBUk5JTkcgKTsgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy8gVE9ETzogdmFsaWRhdGUgcHJvamVjdHMgKGkuZSAxLjIgdnMgMS4zIFdlYiBQcm9qZWN0cykgYWdhaW5zdCBzZXJ2ZXJzCi0gICAgCi0gICAgCi0gICAgCi0gICAgcmV0dXJuIGZpbmFsU3RhdHVzOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRFQVJQcm9qZWN0V2FybmluZ01lc3NhZ2UoU3RyaW5nIHNlcnZpY2VFQVJOYW1lLCBTdHJpbmcgY2xpZW50RUFSTmFtZSApIHsKLQotICAgIC8vIGNoZWNrIGlmIHNlcnZpY2UgYW5kIGNsaWVudCBzaGFyZSB0aGUgc2FtZSBFQVIKLSAgICBpZiAoc2VydmljZUVBUk5hbWUhPW51bGwgJiYgY2xpZW50RUFSTmFtZSE9bnVsbCkgewotICAgIAotICAgICAgaWYgKGNsaWVudEVBUk5hbWUuZXF1YWxzSWdub3JlQ2FzZShzZXJ2aWNlRUFSTmFtZSkgJiYgY2xpZW50RUFSTmFtZS5sZW5ndGgoKT4wKSB7Ci0gICAgICAgIHJldHVybiBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX1NBTUVfQ0xJRU5UX0FORF9TRVJWSUNFX0VBUlMiLCBuZXcgU3RyaW5nW117ICJFQVIiIH0pOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotCi0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvcnVudGltZS9TZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmMDk2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvcnVudGltZS9TZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FQVJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uU2VydmVyU2VsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXMuUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUuQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuSVdlYlNlcnZpY2VSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlByb2plY3RUb3BvbG9neUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgREVGQVVMVF9DTElFTlRfRUFSX1BST0pFQ1RfRVhUID0gIkVBUiI7CQotICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgIGdlbmVyYXRlUHJveHlfOwotICAKLSAgLy8gd2ViU2VydmljZVJ1bnRpbWVKMkVFVHlwZSBjb250YWlucyB0aGUgZGVmYXVsdCBXZWIgc2VydmljZSBydW50aW1lIGFuZCBKMkVFIGxldmVsIGJhc2VkIG9uIHRoZSBpbml0aWFsIHNlbGVjdGlvbi4KLSAgLy8gSWYgdGhlIGluaXRpYWxTZWxlY2l0b24gZG9lcyBub3QgcmVzdWx0IGluIGEgdmFsaWQgV2ViIHNlcnZpY2UgcnVudGltZSBhbmQgSjJFRSBsZXZlbCwgd2ViU2VydmljZVJ1bnRpbWVKMkVFVHlwZQotICAvLyBzaG91bGQgcmVtYWluIG51bGwgZm9yIHRoZSBsaWZlIG9mIHRoaXMgaW5zdGFuY2UuCi0gIHByaXZhdGUgV1NSdW50aW1lSjJFRVR5cGUgd2ViU2VydmljZVJ1bnRpbWVKMkVFVHlwZSA9IG51bGw7Ci0gIAotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHNlcnZpY2VJZHNfOwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3RfOwotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb25fOwotICBwcml2YXRlIElQcm9qZWN0IGluaXRpYWxQcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUoyRUVWZXJzaW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIHNlcnZpY2VOZWVkRUFSXyA9IHRydWU7Ci0KLSAgcHVibGljIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICBTdGF0dXMgY2xpZW50U2lkZVN0YXR1cyA9IHN1cGVyLmV4ZWN1dGUoZW52KTsKLSAgICAgaWYgKGNsaWVudFNpZGVTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICB7Ci0gICAgICAgcmV0dXJuIGNsaWVudFNpZGVTdGF0dXM7Ci0gICAgIH0KLSAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0JIC8vIHJza3JlZyBSZW1vdmUgYWxsIHRoZSBpbnRlbGxpZ2VudCBkZWZhdWx0aW5nIGZvciBNNAotICAgICAvL3NldERlZmF1bHRTZXJ2aWNlUnVudGltZUZyb21QcmVmZXJlbmNlKCk7Ci0gICAgIC8vc2V0RGVmYXVsdFNlcnZpY2VKMkVFVmVyc2lvbkZyb21QcmVmZXJlbmNlKCk7ICAgICAgCi0gICAgIC8vd2ViU2VydmljZVJ1bnRpbWVKMkVFVHlwZSA9IGdldFdTUnVudGltZUFuZEoyRUVGcm9tUHJvamVjdChpbml0aWFsUHJvamVjdF8pOwotICAgICAvL2lmICh3ZWJTZXJ2aWNlUnVudGltZUoyRUVUeXBlICE9IG51bGwpCi0gICAgIC8vewotICAgICAgIC8vc2VydmljZUoyRUVWZXJzaW9uXyA9IHdlYlNlcnZpY2VSdW50aW1lSjJFRVR5cGUuZ2V0SjJlZVZlcnNpb25JZCgpOwotICAgICAgIC8vc2VydmljZUlkc18uc2V0UnVudGltZUlkKHdlYlNlcnZpY2VSdW50aW1lSjJFRVR5cGUuZ2V0V3NySWQoKSk7IAotICAgICAvL30KLQkgCi0JIHNlcnZpY2VJZHNfLnNldFJ1bnRpbWVJZChXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldERlZmF1bHRSdW50aW1lVmFsdWVGb3Ioc2VydmljZUlkc18uZ2V0VHlwZUlkKCkpKTsKLQkgc2VydmljZUoyRUVWZXJzaW9uXyA9IChXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSkuZ2V0SjJlZUxldmVscygpKVswXTsgCi0KLQkgCi0gICAgIC8vIFNldCB0aGUgZGVmYXVsdCBjbGllbnQgdHlwZSB0byBhIHdlYiBjbGllbnQgdHlwZS4KLSAgICAgc2V0V2ViQ2xpZW50VHlwZSgpOwotICAgICAKLSAgICAgLy8gRGVmYXVsdCBwcm9qZWN0cyBFQVJzIGFuZCBzZXJ2ZXJzLgotICAgICAvL3NldERlZmF1bHRQcm9qZWN0cygpOwotICAgICBzZXREZWZhdWx0RUFScygpOwotICAgICAvL3NldERlZmF1bHRTZXJ2ZXIoKTsKLQkgc2VydmljZUlkc18uc2V0U2VydmVySWQoKFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpKS5nZXRTZXJ2ZXJGYWN0b3J5SWRzKCkpWzBdKTsKLSAgICAgdXBkYXRlU2VydmljZUVBUnMoKTsKLSAgICAgdXBkYXRlQ2xpZW50RUFScygpOwotCSAKLSAgICAgLy8gcnNrcmVnCSAKLSAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL0NhdGNoIGFsbCBFeGNlcHRpb25zIGluIG9yZGVyIHRvIGdpdmUgc29tZSBmZWVkYmFjayB0byB0aGUgdXNlcgotICAgICAgU3RhdHVzIGVycm9yU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9UQVNLX0VYQ0VQVEVEIixuZXcgU3RyaW5nW117ZS5nZXRNZXNzYWdlKCl9KSxTdGF0dXMuRVJST1IsIGUpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0gICAgICByZXR1cm4gZXJyb3JTdGF0dXM7Ci0gICAgfQotICAgIAotICB9ICAKLQotICBwcml2YXRlIHZvaWQgc2V0V2ViQ2xpZW50VHlwZSgpCi0gIHsKLSAgICBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjaG9pY2VzID0gZ2V0UnVudGltZTJDbGllbnRUeXBlcygpOwotICAgIFN0cmluZyAgICAgICAgICAgICAgIHdlYklkICAgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLldlYiI7Ci0gICAgCi0gICAgaWYoIGNob2ljZXMgIT0gbnVsbCApCi0gICAgewotICAgICAgY2hvaWNlcy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoIHdlYklkICk7ICAgCi0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0YXJnZXQgUnVudGltZSBhbmQgSjJFRSB2YWx1ZQotICAgKiBAcGFyYW0gcHJvamVjdAotICAgKiBAcmV0dXJuCi0gICAqLwotICAvLyByc2tyZWcKLSAgLyoKLSAgcHJpdmF0ZSBXU1J1bnRpbWVKMkVFVHlwZSBnZXRXU1J1bnRpbWVBbmRKMkVFRnJvbVByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIFdTUnVudGltZUoyRUVUeXBlIHdzckoyRUUgPSBudWxsOwotICAgIC8vSWYgdGhlcmUgaXMgYSB2YWxpZCBpbml0aWFsIHNlbGVjdGlvbiwgdXNlIGl0IHRvIGRldGVybWluZQotICAgIC8vcmVhc29uYWJsZSBKMkVFIHZlcnNpb24gYW5kIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgdmFsdWVzCi0KLSAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpCi0gICAgewotICAgICAgaWYgKFJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHByb2plY3QpIHx8IFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3QpKQotICAgICAgewotICAgICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZyA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgICAgIAotICAgICAgICAvL0dldCB0aGUgSjJFRSBsZXZlbAotICAgICAgICBpbnQgdmVyc2lvbklkID0gSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKHByb2plY3QpOwotICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IFN0cmluZy52YWx1ZU9mKHZlcnNpb25JZCk7Ci0gICAgICAgIAotICAgICAgICAvL0dldCB0aGUgcnVudGltZSB0YXJnZXQgb2YgdGhlIHByb2plY3QKLSAgICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFJ1bnRpbWVUYXJnZXQocHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gbnVsbDsKLSAgICAgICAgaWYgKHJ1bnRpbWVUYXJnZXQgIT0gbnVsbCkgCi0gICAgICAgICAgcnVudGltZVRhcmdldElkID0gcnVudGltZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIAotICAgICAgICAvL0lmIHRoZSBwcmVmZXJyZWQgV2ViIHNlcnZpY2UgcnVudGltZSBzdXBwb3J0cyB0aGlzIEoyRUUgbGV2ZWwgYW5kIHRoaXMgc2VydmVyIHRhcmdldCwga2VlcCBpdAotICAgICAgICBpZiAod3NzcnRSZWcuZG9lc1J1bnRpbWVTdXBwb3J0SjJFRUxldmVsKHZlcnNpb25TdHJpbmcsIHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpKSAmJgotICAgICAgICAgICAgKChydW50aW1lVGFyZ2V0ID09IG51bGwpIHx8IAotICAgICAgICAgICAgIChydW50aW1lVGFyZ2V0ICE9IG51bGwgJiYgd3NzcnRSZWcuZG9lc1J1bnRpbWVTdXBwb3J0U2VydmVyVGFyZ2V0KHJ1bnRpbWVUYXJnZXRJZCwgc2VydmljZUlkc18uZ2V0UnVudGltZUlkKCkpKQotICAgICAgICAgICAgKQotICAgICAgICAgICApCi0gICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vU2V0IHRoZSBKMkVFIGxldmVsIGFuZCBXZWIgc2VydmljZSBydW50aW1lCi0gICAgICAgICAgICB3c3JKMkVFID0gbmV3IFdTUnVudGltZUoyRUVUeXBlKCk7Ci0gICAgICAgICAgICB3c3JKMkVFLnNldFdzcklkKHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpKTsKLSAgICAgICAgICAgIHdzckoyRUUuc2V0SjJlZVZlcnNpb25JZCh2ZXJzaW9uU3RyaW5nKTsKLSAgICAgICAgICAgIHJldHVybiB3c3JKMkVFOwotCi0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy9Mb29rIGZvciBhIHJ1bnRpbWUgdGhhdCBtYXRjaGVzIGJvdGggdGhlIEoyRUUgbGV2ZWwgYW5kIHRoZSBzZXJ2ZXIgdGFyZ2V0LgotICAgICAgICAgIFN0cmluZ1tdIHZhbGlkUnVudGltZXMgPSB3c3NydFJlZy5nZXRSdW50aW1lc0J5VHlwZShzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFJ1bnRpbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh3c3NydFJlZy5kb2VzUnVudGltZVN1cHBvcnRKMkVFTGV2ZWwodmVyc2lvblN0cmluZywgdmFsaWRSdW50aW1lc1tpXSkgJiYKLSAgICAgICAgICAgICAgICAoKHJ1bnRpbWVUYXJnZXQgPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAgKHJ1bnRpbWVUYXJnZXQhPW51bGwgJiYgd3NzcnRSZWcuZG9lc1J1bnRpbWVTdXBwb3J0U2VydmVyVGFyZ2V0KHJ1bnRpbWVUYXJnZXRJZCwgdmFsaWRSdW50aW1lc1tpXSkpCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgd3NySjJFRSA9IG5ldyBXU1J1bnRpbWVKMkVFVHlwZSgpOwotICAgICAgICAgICAgICB3c3JKMkVFLnNldFdzcklkKHZhbGlkUnVudGltZXNbaV0pOwotICAgICAgICAgICAgICB3c3JKMkVFLnNldEoyZWVWZXJzaW9uSWQodmVyc2lvblN0cmluZyk7Ci0gICAgICAgICAgICAgIHJldHVybiB3c3JKMkVFOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgCi0gICAgcmV0dXJuIHdzckoyRUU7Ci0gIH0KLSAgKi8KLSAgLy8gcnNrcmVnCi0gIAotICAvLyByc2tyZWcKLSAgLyoKLSAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRTZXJ2aWNlUnVudGltZUZyb21QcmVmZXJlbmNlKCkKLSAgewotICAJCi0gICAgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgU3RyaW5nIHBSdW50aW1lSWQgPSBjb250ZXh0LmdldFJ1bnRpbWVJZCgpOwotICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHdzc3J0UmVnID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAvL2lmIHRoZSBwcmVmZXJyZWQgcnVudGltZSBpbiBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUsIHNlbGVjdCBpdC4KLSAgICBpZiAod3NzcnRSZWcuaXNSdW50aW1lU3VwcG9ydGVkRm9yVHlwZShzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSwgcFJ1bnRpbWVJZCkpCi0gICAgewotICAgICAgc2VydmljZUlkc18uc2V0UnVudGltZUlkKHBSdW50aW1lSWQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9TZXQgdGhlIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgdG8gb25lIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZCB0eXBlLgotICAgICAgU3RyaW5nW10gdmFsaWRSdW50aW1lcyA9IHdzc3J0UmVnLmdldFJ1bnRpbWVzQnlUeXBlKHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpKTsKLSAgICAgIGlmICh2YWxpZFJ1bnRpbWVzICE9IG51bGwgJiYgdmFsaWRSdW50aW1lcy5sZW5ndGg+MCkKLSAgICAgIHsKLSAgICAgICAgc2VydmljZUlkc18uc2V0UnVudGltZUlkKHZhbGlkUnVudGltZXNbMF0pOwotICAgICAgfQotICAgIH0KLSAgfQotICAqLwotICAvLyByc2tyZWcKLSAgCi0gIC8vIHJza3JlZwotICAvKgotICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdFNlcnZpY2VKMkVFVmVyc2lvbkZyb21QcmVmZXJlbmNlKCkKLSAgewotICAgIGlmIChzZXJ2aWNlSWRzXyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBydW50aW1lSWQgPSBzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKTsKLSAgICAgIGlmIChydW50aW1lSWQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdlYlNlcnZpY2VSdW50aW1lIHdzciA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHJ1bnRpbWVJZCk7Ci0gICAgICAgIGlmICh3c3IgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ1tdIHZlcnNpb25zID0gd3NyLmdldEoyRUVWZXJzaW9ucygpOyAgICAgICAgICAKLSAgICAgICAgICAvL0lmIHRoZSBwcmVmZXJyZWQgSjJFRSB2ZXJzaW9uIGlzIGluIHZlcnNpb25zLCBwaWNrIHRoZSBwcmVmZXJyZWQgb25lLiAKLSAgICAgICAgICAvL090aGVyd2lzZSwgcGljayB0aGUgZmlyc3Qgb25lLgotICAgICAgICAgIGlmICh2ZXJzaW9ucyAhPSBudWxsICYmIHZlcnNpb25zLmxlbmd0aCA+IDApCi0gICAgICAgICAgewotICAgICAgICAgIAlQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLSAgICAgICAgICAJU3RyaW5nIHBKMkVFID0gY29udGV4dC5nZXRKMkVFVmVyc2lvbigpOwotICAgICAgICAgIAlpZiAocEoyRUUhPW51bGwgJiYgcEoyRUUubGVuZ3RoKCk+MCkKLSAgICAgICAgICAJewotICAgICAgICAgICAgICBmb3IgKGludCBpPTA7aTx2ZXJzaW9ucy5sZW5ndGg7aSsrKQotICAgICAgICAgIAkgIHsKLSAgICAgICAgICAJCWlmICh2ZXJzaW9uc1tpXS5lcXVhbHMocEoyRUUpKQotICAgICAgICAgIAkJewotICAgICAgICAgIAkJCXNlcnZpY2VKMkVFVmVyc2lvbl8gPSB2ZXJzaW9uc1tpXTsKLSAgICAgICAgICAJCSAgICByZXR1cm47Ci0gICAgICAgICAgCQl9Ci0gICAgICAgICAgCSAgfQotICAgICAgICAgIAl9Ci0gICAgICAgICAgCXNlcnZpY2VKMkVFVmVyc2lvbl8gPSB2ZXJzaW9uc1swXTsKLSAgICAgICAgICAJcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IAotICAqLyAKLSAgLy8gcnNrcmVnCi0gIAotICAvLyByc2tyZWcKLSAgLyoKLSAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRQcm9qZWN0cygpCi0gIHsKLQkKLQkvL0hhbmRsZSB0aGUgY2FzZSB3aGVyZSBubyB2YWxpZCBpbml0aWFsIHNlbGVjdGlvbiBleGlzdHMKLSAgICBpZiAoaW5pdGlhbFByb2plY3RfPT0gbnVsbCB8fCAoaW5pdGlhbFByb2plY3RfIT1udWxsICYmIHdlYlNlcnZpY2VSdW50aW1lSjJFRVR5cGU9PW51bGwpKQotICAgIHsKLSAgICAgIC8vU2VsZWN0IHRoZSBmaXJzdCBleGlzdGluZyBwcm9qZWN0IHRoYXQgaXMgdmFsaWQuCi0gICAgICBzZXRTZXJ2aWNlUHJvamVjdFRvRmlyc3RWYWxpZCgpOwotICAgICAgU3RyaW5nIHNlcnZpY2VQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgIAotICAgICAgLy9TZWxlY3QgYSBjbGllbnQgcHJvamVjdCB3aXRoICJjbGllbnQiIGFkZGVkIHRvIHRoZSBhYm92ZSBwcm9qZWN0IG5hbWUuCi0gICAgICBTdHJpbmcgY2xpZW50UHJvamVjdE5hbWUgPSBSZXNvdXJjZVV0aWxzLmdldENsaWVudFdlYlByb2plY3ROYW1lKHNlcnZpY2VQcm9qZWN0TmFtZSwgc2VydmljZUlkc18uZ2V0VHlwZUlkKCkgKTsKLSAgICAgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoY2xpZW50UHJvamVjdE5hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0gICAgCi0JICAgIAotCi0JLy9TZXQgdGhlIHNlcnZpY2UgcHJvamVjdCBzZWxlY3Rpb24gdG8gdGhpcyBpbml0aWFsUHJvamVjdAotCWdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoaW5pdGlhbFByb2plY3RfLmdldE5hbWUoKSk7Ci0JU3RyaW5nIGNsaWVudFByb2plY3ROYW1lID0gUmVzb3VyY2VVdGlscy5nZXRDbGllbnRXZWJQcm9qZWN0TmFtZShpbml0aWFsUHJvamVjdF8uZ2V0TmFtZSgpLCBzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSApOyAKLQkvL1NldCB0aGUgY2xpZW50IHByb2plY3Qgc2VsZWN0aW9uIHRvIGNsaWVudFByb2plY3QKLQlnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGNsaWVudFByb2plY3ROYW1lKTsKLQkJICAgICAgCSAgICAKLSAgfQotICAKLQotICBwcml2YXRlIHZvaWQgc2V0U2VydmljZVByb2plY3RUb0ZpcnN0VmFsaWQoKQotICB7Ci0gICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgd3NzcnRSZWcgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZ1tdIHByb2plY3ROYW1lcyA9IGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpOwotICAgIGZvciAoaW50IGk9MDtpPHByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSgobmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShwcm9qZWN0TmFtZXNbaV0pKSk7Ci0gICAgICBpZiAocHJvamVjdC5pc09wZW4oKSAmJiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdCkgfHwgUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3QocHJvamVjdCkpKQotICAgICAgewotICAgICAgICAvL0dldCB0aGUgSjJFRSBsZXZlbAotICAgICAgICBpbnQgdmVyc2lvbklkID0gSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKHByb2plY3QpOwotICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IFN0cmluZy52YWx1ZU9mKHZlcnNpb25JZCk7Ci0gICAgICAgIAotICAgICAgICAvL0dldCB0aGUgcnVudGltZSB0YXJnZXQgb2YgdGhlIHByb2plY3QKLSAgICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFJ1bnRpbWVUYXJnZXQocHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gbnVsbDsKLSAgICAgICAgaWYgKHJ1bnRpbWVUYXJnZXQgIT0gbnVsbCkgCi0gICAgICAgICAgcnVudGltZVRhcmdldElkID0gcnVudGltZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoc2VydmljZUoyRUVWZXJzaW9uXyE9bnVsbCAmJiBzZXJ2aWNlSjJFRVZlcnNpb25fLmxlbmd0aCgpPjAgJiYgc2VydmljZUoyRUVWZXJzaW9uXy5lcXVhbHModmVyc2lvblN0cmluZykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAod3NzcnRSZWcuZG9lc1J1bnRpbWVTdXBwb3J0SjJFRUxldmVsKHZlcnNpb25TdHJpbmcsIHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpKSAmJgotICAgICAgICAgICAgICgocnVudGltZVRhcmdldCA9PSBudWxsKSB8fCAKLSAgICAgICAgICAgICAoKHJ1bnRpbWVUYXJnZXQhPW51bGwpICYmIHdzc3J0UmVnLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChydW50aW1lVGFyZ2V0SWQsIHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpKSkpIAotICAgICAgICAgICAgICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKHByb2plY3ROYW1lc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vRGlkbid0IGZpbmQgYSBzaW5nbGUgcHJvamVjdCB0aGF0IHdvcmtlZC4gRGVmYXVsdCB0byBhIG5ldyBwcm9qZWN0IG5hbWUuCi0gICAgZ2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdCgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShSZXNvdXJjZVV0aWxzLmdldERlZmF1bHRXZWJQcm9qZWN0TmFtZSgpKTsKLSAgfQotICAqLwotICAvLyByc2tyZWcKLSAgCi0gIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0RUFScygpCi0gIHsKLQotICAJLy9TZXJ2aWNlLXNpZGUKLSAgICBTdHJpbmcgaW5pdGlhbFByb2plY3ROYW1lID0gZ2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdCgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsgCi0gICAgSVByb2plY3QgaW5pdGlhbFByb2plY3QgPSAgIEZpbGVSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGluaXRpYWxQcm9qZWN0TmFtZSk7ICAJCi0gIAlJUHJvamVjdCBkZWZhdWx0U2VydmljZUVBUiA9IGdldERlZmF1bHRFQVJGcm9tU2VydmljZVByb2plY3QoaW5pdGlhbFByb2plY3QpOwotICAJZ2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdCgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShkZWZhdWx0U2VydmljZUVBUi5nZXROYW1lKCkpOwotICAJCi0gIAkvL0NsaWVudC1zaWRlCi0gICAgU3RyaW5nIGluaXRpYWxDbGllbnRQcm9qZWN0TmFtZSA9IGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7IAotICAgIElQcm9qZWN0IGluaXRpYWxDbGllbnRQcm9qZWN0ID0gKElQcm9qZWN0KSgobmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKS50cmFuc2Zvcm0oaW5pdGlhbENsaWVudFByb2plY3ROYW1lKSk7ICAJCi0gIAlJUHJvamVjdCBkZWZhdWx0Q2xpZW50RUFSID0gZ2V0RGVmYXVsdEVBUkZyb21DbGllbnRQcm9qZWN0KGluaXRpYWxDbGllbnRQcm9qZWN0KTsKLSAgCQotICAJLy9JZiB0aGUgY2xpZW50IHByb2plY3QgZXhpc3RzIGFuZCB0aGUgZGVmYXVsdCBFQVIgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUgc2VydmljZSBwcm9qZWN0LCAKLSAgCS8vcGljayB0aGUgZGVmYXVsdENsaWVudEVBUgotICAJaWYoaW5pdGlhbENsaWVudFByb2plY3QhPW51bGwgJiYgaW5pdGlhbENsaWVudFByb2plY3QuZXhpc3RzKCkgCi0gIAkgICAmJiBkZWZhdWx0Q2xpZW50RUFSLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGRlZmF1bHRTZXJ2aWNlRUFSLmdldE5hbWUoKSkpCi0gIAl7Ci0gIAkJZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShkZWZhdWx0Q2xpZW50RUFSLmdldE5hbWUoKSk7Ci0gIAl9Ci0gIAllbHNlCi0gIAl7Ci0gICAgICBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IHB0Yz0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKTsKLSAgICAgIGlmICghcHRjLmlzVXNlVHdvRUFScygpKSB7Ci0gICAgICAJZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShkZWZhdWx0U2VydmljZUVBUi5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIElQcm9qZWN0IHByb3h5RUFSUHJvamVjdCA9IGdldFVuaXF1ZUNsaWVudEVBUihkZWZhdWx0Q2xpZW50RUFSLmdldE5hbWUoKSwgZGVmYXVsdFNlcnZpY2VFQVIuZ2V0TmFtZSgpLCBpbml0aWFsQ2xpZW50UHJvamVjdE5hbWUpOwotICAgICAgICBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKHByb3h5RUFSUHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgfSAgCQkKLSAgCX0KLSAgfQotICAKLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXRVbmlxdWVDbGllbnRFQVIoU3RyaW5nIGVhclByb2plY3QsIFN0cmluZyBzZXJ2aWNlUHJvamVjdCwgU3RyaW5nIGNsaWVudFByb2plY3ROYW1lKSB7Ci0KLSAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBuZXcgU3RyaW5nKCk7Ci0gICAgaWYgKCFlYXJQcm9qZWN0LmVxdWFsc0lnbm9yZUNhc2Uoc2VydmljZVByb2plY3QpKSB7Ci0gICAgICBwcm9qZWN0TmFtZSA9IGVhclByb2plY3Q7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcHJvamVjdE5hbWUgPSBjbGllbnRQcm9qZWN0TmFtZStERUZBVUxUX0NMSUVOVF9FQVJfUFJPSkVDVF9FWFQ7Ci0gICAgICBpbnQgaT0xOyAgICAgIAotICAgICAgd2hpbGUgKHByb2plY3ROYW1lLmVxdWFsc0lnbm9yZUNhc2Uoc2VydmljZVByb2plY3QpKSB7Ci0gICAgICAgIHByb2plY3ROYW1lID0gcHJvamVjdE5hbWUraTsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJvamVjdE5hbWUuZXF1YWxzKCIiKSA/IG51bGwgOiBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAKLSAgfQotICAKLSAgLy8gcnNrcmVnCi0gIC8qCi0gIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0U2VydmVyKCkKLSAgewotICAgIC8vQ2FsY3VsYXRlIHJlYXNvbmFibGUgZGVmYXVsdCBzZXJ2ZXIgYmFzZWQgb24gdGhlIGRlZmF1bHQgcHJvamVjdCBzZWxlY3Rpb24uIAotCi0gICAgU3RyaW5nIGluaXRpYWxQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7IAotICAgIElQcm9qZWN0IGluaXRpYWxQcm9qZWN0ID0gKElQcm9qZWN0KSgobmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKS50cmFuc2Zvcm0oaW5pdGlhbFByb2plY3ROYW1lKSk7Ci0gICAgaWYgKGluaXRpYWxQcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRTZXJ2ZXJJbmZvRnJvbUV4aXN0aW5nUHJvamVjdChpbml0aWFsUHJvamVjdCwgc2VydmljZUlkc18uZ2V0VHlwZUlkKCksIHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpLCB0cnVlKTsKLSAgICAgIGlmIChzZXJ2ZXJJbmZvIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAoc2VydmVySW5mb1swXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzBdLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJJbmZvWzBdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmVySW5mb1sxXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzFdLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHNlcnZlckluZm9bMV0pOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL3RoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0LgotICAgIHsKLSAgICAgIC8vRG9lcyB0aGUgRUFSIGV4aXN0PwotICAgICAgU3RyaW5nIGluaXRpYWxFQVJQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBJUHJvamVjdCBpbml0aWFsRUFSUHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKGluaXRpYWxFQVJQcm9qZWN0TmFtZSkpOwotICAgICAgaWYgKGluaXRpYWxFQVJQcm9qZWN0LmV4aXN0cygpKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSBzZXJ2ZXJJbmZvID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0U2VydmVySW5mb0Zyb21FeGlzdGluZ1Byb2plY3QoaW5pdGlhbEVBUlByb2plY3QsIHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpLCBzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSwgZmFsc2UpOwotICAgICAgICBpZiAoc2VydmVySW5mbyE9bnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChzZXJ2ZXJJbmZvWzBdIT1udWxsICYmIHNlcnZlckluZm9bMF0ubGVuZ3RoKCk+MCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJJbmZvWzBdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHNlcnZlckluZm9bMV0hPW51bGwgJiYgc2VydmVySW5mb1sxXS5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlcnZpY2VJZHNfLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVySW5mb1sxXSk7Ci0gICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL1dlIGhhdmUgYSBuZXcgcHJvamVjdCBhbmQgRUFSLiBVc2UgdGhlIHJ1bnRpbWUvc2VydmVyIHNlbGVjdGlvbiAKLSAgICAgICAgLy9wcmVmZXJlbmNlcyB0byBzZXQgdGhlIGRlZmF1bHQgc2VydmVyL3NlcnZlciB0eXBlLgotICAgICAgICAvL1BpY2sgYSBzZXJ2ZXIgdHlwZSB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgV2ViIHNlcnZpY2UgcnVudGltZQotICAgICAgICAvL0lmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHNlcnZlciB0aGF0IHdvcmtzLCBwaWNrIHRoYXQgb25lLgotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gc2VydmVySW5mbyA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFNlcnZlckZyb21XZWJTZXJ2Y2VSdW50aW1lQW5kSjJFRShzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSwgc2VydmljZUoyRUVWZXJzaW9uXyk7Ci0gICAgICAgIGlmIChzZXJ2ZXJJbmZvIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHNlcnZlckluZm9bMF0hPW51bGwgJiYgc2VydmVySW5mb1swXS5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlcnZpY2VJZHNfLnNldFNlcnZlcklkKHNlcnZlckluZm9bMF0pOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc2VydmVySW5mb1sxXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzFdLmxlbmd0aCgpPjApCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VydmljZUlkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJJbmZvWzFdKTsKLSAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIAotICAgIAotICAgIC8vRGVmYXVsdCB0aGUgY2xpZW50IHNlcnZlciAgICAKLSAgfQotICAqLwotICAvLyByc2tyZWcKLSAgCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVTZXJ2aWNlRUFScygpCi0gIHsKLSAgCS8vU2V0IEVBUiBzZWxlY3Rpb24gdG8gbnVsbCBpZiB0aGUgcHJvamVjdC9zZXJ2ZXIgZGVmYXVsdHMgaW1wbHkgYW4gRUFSIHNob3VsZCBub3QgYmUgY3JlYXRlZAotICAJU3RyaW5nIHNlcnZpY2VQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIAlJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCA9IEZpbGVSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHNlcnZpY2VQcm9qZWN0TmFtZSk7Ci0gIAlpZiAoc2VydmljZVByb2plY3QgIT0gbnVsbCAmJiBzZXJ2aWNlUHJvamVjdC5leGlzdHMoKSkKLSAgCXsKLSAgCSAgLy9HZXQgdGhlIHJ1bnRpbWUgdGFyZ2V0IG9uIHRoZSBzZXJ2aWNlUHJvamVjdAotICAJICBJUnVudGltZSBzZXJ2aWNlVGFyZ2V0ID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0UnVudGltZVRhcmdldChzZXJ2aWNlUHJvamVjdE5hbWUpOwotICAJICBTdHJpbmcgajJlZVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb24oc2VydmljZVByb2plY3QpKTsKLSAgCSAgaWYgKHNlcnZpY2VUYXJnZXQgIT0gbnVsbCkKLSAgCSAgewotICAJICAJaWYgKCFTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKHNlcnZpY2VUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpLGoyZWVWZXJzaW9uKSkKLSAgCSAgCXsKLSAgCSAgICAgIC8vRGVmYXVsdCB0aGUgRUFSIHNlbGVjdGlvbiB0byBiZSBlbXB0eQotICAJICAJICBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldEluZGV4KC0xKTsKLSAgCSAgCSAgc2VydmljZU5lZWRFQVJfID0gZmFsc2U7Ci0gIAkgIAl9Ci0gIAkgIAkJCi0gIAkgIH0KLSAgCX0KLSAgCWVsc2UKLSAgCXsKLSAgCQkvL1VzZSB0aGUgc2VydmVyIHR5cGUKLSAgCQlTdHJpbmcgc2VydmVyVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZpY2VJZHNfLmdldFNlcnZlcklkKCkpOwotICAJCWlmIChzZXJ2ZXJUYXJnZXRJZCE9bnVsbCAmJiBzZXJ2ZXJUYXJnZXRJZC5sZW5ndGgoKT4wKQotICAJCXsKLSAgCQkgIGlmICghU2VydmVyVXRpbHMuaXNUYXJnZXRWYWxpZEZvckVBUihzZXJ2ZXJUYXJnZXRJZCxzZXJ2aWNlSjJFRVZlcnNpb25fKSkKLSAgCSAgCSAgewotICAJICAgICAgICAvL0RlZmF1bHQgdGhlIEVBUiBzZWxlY3Rpb24gdG8gYmUgZW1wdHkKLSAgCSAgCSAgICBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldEluZGV4KC0xKTsKLSAgCSAgCSAgICBzZXJ2aWNlTmVlZEVBUl8gPSBmYWxzZTsKLSAgCSAgCSAgfQotICAJCX0KLSAgCX0KLSAgCQotICAJCQotICB9Ci0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaW5pdGlhbFNlbGVjdGlvbl8gPSBzZWxlY3Rpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxQcm9qZWN0KElQcm9qZWN0IGluaXRpYWxQcm9qZWN0KQotICB7Ci0gICAgaW5pdGlhbFByb2plY3RfID0gaW5pdGlhbFByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzICkKLSAgewotICAgIHNlcnZpY2VJZHNfID0gaWRzOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlSWRzXzsgCi0gIH0KLQotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdCgpCi0gIHsKLSAgICBpZiAoc2VydmljZVByb2plY3QyRUFSUHJvamVjdF8gPT0gbnVsbCkKLSAgICB7Ci0JICAvLyByc2tyZWcKLSAgICAgIC8vSVByb2plY3RbXSBwcm9qZWN0cyA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdHNCeVdlYlNlcnZpY2VUeXBlKHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpKTsKLQkgIElQcm9qZWN0W10gcHJvamVjdHMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFByb2plY3RzQnlXZWJTZXJ2aWNlVHlwZShzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSk7Ci0JICAvLyByc2tyZWcKLQkgIFN0cmluZ1tdIHByb2plY3ROYW1lcyA9IG5ldyBTdHJpbmdbcHJvamVjdHMubGVuZ3RoXTsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgCQlwcm9qZWN0TmFtZXNbaV0gPSBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0JICB9Ci0JICBTZWxlY3Rpb25MaXN0IGxpc3QgPSBuZXcgU2VsZWN0aW9uTGlzdChwcm9qZWN0TmFtZXMsIDApOwotCSAgVmVjdG9yIGNob2ljZXMgPSBuZXcgVmVjdG9yKCk7Ci0JICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JICAgIGNob2ljZXMuYWRkKGdldFByb2plY3RFQVJDaG9pY2UocHJvamVjdHNbaV0pKTsKLQkgIH0KLQkgIHNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3RfID0gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKGxpc3QsIGNob2ljZXMsIGdldEVBUlByb2plY3RzKCkpOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZVByb2plY3QyRUFSUHJvamVjdF87IAotICB9Ci0gICAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGdlbmVyYXRlUHJveHlfLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gZ2VuZXJhdGVQcm94eV87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBnZW5lcmF0ZVByb3h5XyBUaGUgZ2VuZXJhdGVQcm94eV8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHlfKQotICB7Ci0gICAgdGhpcy5nZW5lcmF0ZVByb3h5XyA9IGdlbmVyYXRlUHJveHlfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSjJFRVZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VKMkVFVmVyc2lvbl87Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFNlcnZpY2VOZWVkRUFSKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlTmVlZEVBUl87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBFQVIgZm9yIGEgZ2l2ZW4gcHJvamVjdAotICAgKiBAcGFyYW0gcHJvamVjdAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIElQcm9qZWN0IGdldERlZmF1bHRFQVJGcm9tU2VydmljZVByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIGlmIChwcm9qZWN0IT1udWxsICYmIHByb2plY3QuZXhpc3RzKCkpIAotICAgIHsKLSAgICAgIElTZXJ2ZXJbXSBjb25maWd1cmVkU2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKTsKLSAgICAgIElTZXJ2ZXIgZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgPSBTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihjb25maWd1cmVkU2VydmVycywgc2VydmljZUlkc18uZ2V0VHlwZUlkKCkgKTsKLSAgICAgIAotICAgICAgRUFSTmF0dXJlUnVudGltZVtdIGVhclByb2plY3RzID0gSjJFRVV0aWxzLmdldEVBUlByb2plY3RzKHByb2plY3QsIGZpcnN0U3VwcG9ydGVkU2VydmVyKTsKLSAgICAgIGlmIChlYXJQcm9qZWN0cyE9bnVsbCAmJiBlYXJQcm9qZWN0c1swXSBpbnN0YW5jZW9mIEVBUk5hdHVyZVJ1bnRpbWUpIAotICAgICAgICByZXR1cm4gZWFyUHJvamVjdHNbMF0uZ2V0UHJvamVjdCgpOwotICAgIH0KLSAgICAKLSAgICBpbnQgdmVyc2lvbklkID0gLTE7Ci0gICAgaWYgKHNlcnZpY2VKMkVFVmVyc2lvbl8gIT0gbnVsbCAmJiBzZXJ2aWNlSjJFRVZlcnNpb25fLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgdmVyc2lvbklkID0gSW50ZWdlci5wYXJzZUludChzZXJ2aWNlSjJFRVZlcnNpb25fKTsKLSAgICB9Ci0gICAgRUFSTmF0dXJlUnVudGltZSBuZXdFQVIgPSBKMkVFVXRpbHMuZ2V0RUFSKHZlcnNpb25JZCk7Ci0gICAgSVByb2plY3QgZWFyUHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0U2VydmljZUVBUlByb2plY3ROYW1lKCkpOwotICAgICAgCi0gICAgaWYgKG5ld0VBUiE9bnVsbCkKLSAgICAgIGVhclByb2plY3QgPSBuZXdFQVIuZ2V0UHJvamVjdCgpOwotCi0gICAgcmV0dXJuIGVhclByb2plY3Q7ICAJCi0gIH0KLSAgCi0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L0xhdW5jaEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9MYXVuY2hGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmJkMzBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L0xhdW5jaEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci0KLQotcHVibGljIGNsYXNzIExhdW5jaEZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50Ci17Ci0gIHByaXZhdGUgYm9vbGVhbiBwdWJsaXNoVG9QdWJsaWNVRERJXzsgIAotICBwcml2YXRlIGJvb2xlYW4gcHVibGlzaFRvUHJpdmF0ZVVERElfOwotICAKLSAgcHVibGljIExhdW5jaEZyYWdtZW50KCkKLSAgewotICAgIENvbmRpdGlvbiBjb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAocHVibGlzaFRvUHVibGljVURESV8gfHwgcHVibGlzaFRvUHJpdmF0ZVVERElfKTsKLSAgICAgIH0KLSAgICB9OwotICAgIHNldENvbmRpdGlvbiggY29uZGl0aW9uICk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kKCksICIiICkgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFRvUHVibGljVURESShib29sZWFuIHB1Ymxpc2hUb1B1YmxpY1VEREkpCi0gIHsKLSAgICBwdWJsaXNoVG9QdWJsaWNVRERJXyA9IHB1Ymxpc2hUb1B1YmxpY1VEREk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1ByaXZhdGVVRERJKGJvb2xlYW4gcHVibGlzaFRvUHJpdmF0ZVVEREkpCi0gIHsKLSAgCXB1Ymxpc2hUb1ByaXZhdGVVRERJXyA9IHB1Ymxpc2hUb1ByaXZhdGVVRERJOwotICB9Ci0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1NlcnZpY2VUZXN0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1NlcnZpY2VUZXN0RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5ZDA0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9TZXJ2aWNlVGVzdEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XU0RMVGVzdExhdW5jaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2VUZXN0RnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBib29sZWFuIHRlc3RTZXJ2aWNlOwotICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVQcm94eTsKLSAgCi0gIAotICBwdWJsaWMgU2VydmljZVRlc3RGcmFnbWVudCggU3RyaW5nIGlkICkKLSAgewotICAJU2VxdWVuY2VGcmFnbWVudCB0ZXN0Um9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gIAlDb25kaXRpb24gY29uZGl0aW9uID0gbmV3IENvbmRpdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RTZXJ2aWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBzZXRDb25kaXRpb24oIGNvbmRpdGlvbiApOwotICAgIAotICAgIHRlc3RSb290LmFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgV2ViU2VydmljZVRlc3REZWZhdWx0aW5nQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgdGVzdFJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIGlkICkgKTsKLSAgICBzZXRUcnVlRnJhZ21lbnQoIHRlc3RSb290ICk7Ci0gICAgICAKLSAgfQotIAotICAKLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgCQotICAJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZVRlc3REZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RJRCIsV1NETFRlc3RMYXVuY2hDb21tYW5kLmNsYXNzKTsKLSAgCQotICAJLy9mcm9tIHRoZSB3aXphcmQgCi0gIAlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcywgIlRlc3RJRCIsV1NETFRlc3RMYXVuY2hDb21tYW5kLmNsYXNzKTsKLSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VUZXN0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJFeHRlcm5hbEJyb3dzZXIiLFdTRExUZXN0TGF1bmNoQ29tbWFuZC5jbGFzcyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoYm9vbGVhbiBnZW5lcmF0ZVByb3h5KQotICB7Ci0gIAl0aGlzLmdlbmVyYXRlUHJveHkgPSBnZW5lcmF0ZVByb3h5OwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAJcmV0dXJuIGdlbmVyYXRlUHJveHk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRlc3RTZXJ2aWNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoIGJvb2xlYW4gdGVzdFNlcnZpY2UgKQotICB7Ci0gICAgdGhpcy50ZXN0U2VydmljZSA9IHRlc3RTZXJ2aWNlOwotICB9Ci0KLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3Rlc3QvU2VydmljZVRlc3RXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1NlcnZpY2VUZXN0V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMWIxNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3Rlc3QvU2VydmljZVRlc3RXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XU0RMVGVzdExhdW5jaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlVGVzdFdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSI7Ci0KLSAgcHJpdmF0ZSBDb21ibyB0ZXN0VHlwZUNvbWJvXzsKLSAgLypDT05URVhUX0lEIFBTVFAwMDAxIGZvciB0aGUgVGVzdCBUeXBlIENvbWJvIGJveCBvZiB0aGUgU2VydmljZSBUZXN0IFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BTVFBfQ09NQk9CT1hfVEVTVCA9ICJQU1RQMDAwMSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUFNUUF9DT01CT0JPWF9URVNUID0gIlRPT0xUSVBfUFNUUF9DT01CT0JPWF9URVNUIjsKLQotICBwcml2YXRlIEJ1dHRvbiBsYXVuY2hCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUFNUUDAwMDIgZm9yIHRoZSBsYXVuY2ggYnV0dG9uIG9mIHRoZSBTZXJ2aWNlIFRlc3QgUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFNUUF9MQVVOQ0hfQlVUVE9OID0gIlBTVFAwMDAyIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QU1RQX0xBVU5DSF9CVVRUT04gPSAiVE9PTFRJUF9QU1RQX0xBVU5DSF9CVVRUT04iOwotICAKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0IGZhY2lsaXRpZXNfOwotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBjcmVhdGVQbHVnaW5JZF8gKTsKLSAgICAgICAgCi0gICAgQ29tcG9zaXRlIHRlc3RDb21wb3NpdGUgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAzLCAwLCAwICk7Ci0gICAgCi0gICAgdGVzdFR5cGVDb21ib18gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKCB0ZXN0Q29tcG9zaXRlLCAiTEFCRUxfVEVTVF9UWVBFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BTVFBfQ09NQk9CT1hfVEVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFNUUF9DT01CT0JPWF9URVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgCi0gICAgbGF1bmNoQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggdGVzdENvbXBvc2l0ZSwgIkJVVFRPTl9MQVVOQ0hfU0VSVklDRV9URVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUFNUUF9MQVVOQ0hfQlVUVE9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QU1RQX0xBVU5DSF9CVVRUT04gKTsKLSAgICBsYXVuY2hCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTGF1bmNoQnV0dG9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHNlcnZpY2VpZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlclByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0gIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lID0gIiI7Ci0gIHByaXZhdGUgRW52aXJvbm1lbnQgZW52OwotICBwcml2YXRlIExpc3QgZW5kcG9pbnRzOwotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUxhdW5jaEJ1dHRvbigpCi0gIHsKLSAgCQotICAJU3RyaW5nIHRlc3RJRCA9IHRlc3RUeXBlQ29tYm9fLmdldFRleHQoKTsKLSAgCWxhdW5jaGVkU2VydmljZVRlc3ROYW1lID0gdGVzdElEOwotICAJV1NETFRlc3RMYXVuY2hDb21tYW5kIHd0bGMgPSBuZXcgV1NETFRlc3RMYXVuY2hDb21tYW5kKCk7Ci0gIAl3dGxjLnNldFRlc3RJRCh0ZXN0SUQpOwotICAJd3RsYy5zZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoc2VydmljZWlkcyk7Ci0gIAl3dGxjLnNldFNlcnZlclByb2plY3Qoc2VydmVyUHJvamVjdCk7Ci0gIAl3dGxjLnNldFdzZGxVUkkod3NkbFVSSSk7Ci0gIAl3dGxjLnNldEV4dGVybmFsQnJvd3Nlcih0cnVlKTsKLSAgCXd0bGMuc2V0RW5kcG9pbnQoZW5kcG9pbnRzKTsKLSAgCVN0YXR1cyBzdGF0dXMgPSB3dGxjLmV4ZWN1dGUoZW52KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVRlc3RGYWNpbGl0aWVzKCBTZWxlY3Rpb25MaXN0IGZhY2lsaXRpZXMgKQotICB7Ci0gICAgZmFjaWxpdGllc18gPSBmYWNpbGl0aWVzOwotICAgIHRlc3RUeXBlQ29tYm9fLnNldEl0ZW1zKCBmYWNpbGl0aWVzLmdldExpc3QoKSApOwotICAgIHRlc3RUeXBlQ29tYm9fLnNlbGVjdCggZmFjaWxpdGllcy5nZXRJbmRleCgpICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0IGdldFNlcnZpY2VUZXN0RmFjaWxpdGllcygpCi0gIHsKLSAgICBmYWNpbGl0aWVzXy5zZXRJbmRleCggdGVzdFR5cGVDb21ib18uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAgIHJldHVybiBmYWNpbGl0aWVzXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdElEKCkKLSAgewotICAJcmV0dXJuIHRlc3RUeXBlQ29tYm9fLmdldFRleHQoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAJdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KFN0cmluZyBzZXJ2ZXJQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5zZXJ2ZXJQcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciBzZXJ2aWNlaWRzKQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlaWRzID0gc2VydmljZWlkczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudChFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCXRoaXMuZW52ID0gZW52OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50KQotICB7Ci0gICAgaWYgKGVuZHBvaW50ICE9IG51bGwgJiYgZW5kcG9pbnQubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgdi5hZGQoZW5kcG9pbnQpOwotICAgICAgc2V0RW5kcG9pbnRzKHYpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnRzKExpc3QgZW5kcG9pbnRzKQotICB7Ci0gICAgdGhpcy5lbmRwb2ludHMgPSBlbmRwb2ludHM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1dlYlNlcnZpY2VUZXN0RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1dlYlNlcnZpY2VUZXN0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3ZmYxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE1LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdDsKLQotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUZXN0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotICAKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0IHNlcnZpY2VUZXN0RmFjaWxpdGllczsJCi0gIHByaXZhdGUgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQ7Ci0gIHByaXZhdGUgU3RyaW5nIHRlc3RJRDsKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVNjZW5hcmlvQ29udGV4dCBzY2VuYXJpb0NvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCkuY29weSgpOwotICAJdGVzdElEID0gc2NlbmFyaW9Db250ZXh0LmdldE5vbkphdmFUZXN0U2VydmljZSgpOwotICAJU3RyaW5nW10gdGVzdFR5cGVzID0gc2NlbmFyaW9Db250ZXh0LmdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsKLSAgCQotICAJCi0gIAllbnZpcm9ubWVudCA9IGVudjsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgCVdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgd3N0dFJlZ2lzdHJ5ID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAJCi0gICAgCi0gIAlWZWN0b3Igd3NkbE5hbWVzID0gbmV3IFZlY3RvcigpOwotICAJZm9yKGludCBpID0wIDtpPHRlc3RUeXBlcy5sZW5ndGg7aSsrKXsKLSAgCSAgV2ViU2VydmljZVRlc3RFeHRlbnNpb24gd3NjdGUgPSAoV2ViU2VydmljZVRlc3RFeHRlbnNpb24pd3N0dFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKHRlc3RUeXBlc1tpXSk7ICAJCi0gIAkgIGlmKCF3c2N0ZS5pc0phdmEoKSl7Ci0gIAkgICAgd3NkbE5hbWVzLmFkZEVsZW1lbnQodGVzdFR5cGVzW2ldKTsKLSAgCSAgfQotICAJfQotICAgIAotICAJU3RyaW5nIGphdmFOYW1lc0FycmF5W10gPSBuZXcgU3RyaW5nW3dzZGxOYW1lcy5zaXplKCldOwotICAJRW51bWVyYXRpb24gZSA9IHdzZGxOYW1lcy5lbGVtZW50cygpOwotICAJaW50IGkgPSAwOwotICAJd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICBqYXZhTmFtZXNBcnJheVtpXSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAJICBpKys7Ci0gIAl9Ci0gIAkKLSAgCQotICAJc2VydmljZVRlc3RGYWNpbGl0aWVzID0gbmV3IFNlbGVjdGlvbkxpc3QoamF2YU5hbWVzQXJyYXksMCk7ICAJCi0gIAkKLSAJcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0IGdldFNlcnZpY2VUZXN0RmFjaWxpdGllcygpCi0gIHsKLSAgCXJldHVybiBzZXJ2aWNlVGVzdEZhY2lsaXRpZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRlc3RJRCgpCi0gIHsKLSAgCXJldHVybiB0ZXN0SUQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFbnZpcm9ubWVudCBnZXRFbnZpcm9ubWVudCgpCi0gIHsKLSAgCXJldHVybiBlbnZpcm9ubWVudDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEV4dGVybmFsQnJvd3NlcigpCi0gIHsKLSAgCXJldHVybiBmYWxzZTsKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Ly5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkNmEwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi11ZGRpcmVnaXN0cnkuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOTk5ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3M8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MudWk8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZWQxMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2UudWRkaXJlZ2lzdHJ5LmphciA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IHVkZGlyZWdpc3RyeS5qYXIsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3JlZ2lzdHJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9pY29ucy9yZWdpc3RyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDNjYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3JlZ2lzdHJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9pY29ucy91ZGRpcHJpdmF0ZWNvbmZpZ193aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3VkZGlwcml2YXRlY29uZmlnX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNjExZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3VkZGlwcml2YXRlY29uZmlnX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2ZiZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIFVuaXZlcnNhbCBEZXNjcmlwdGlvbiBEaXNjb3ZlcnkgYW5kIEludGVncmF0aW9uIFJlZ2lzdHJ5Ci1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19VTklUX1RFU1RfVUREST1Vbml0IFRlc3QgVURESQotCi1YUF9QUklWQVRFX1VERElfUkVHSVNUUllfVFlQRVM9UHJpdmF0ZSBVRERJIFJlZ2lzdHJ5IFR5cGVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWZjMmUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIG5hbWU9IiVQTFVHSU5fTkFNRSIKLSAgIHByb3ZpZGVyLW5hbWU9IiVQTFVHSU5fUFJPVklERVIiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS5wbHVnaW4uV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0idWRkaXJlZ2lzdHJ5LmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0KLSAgPGRlc2NyaXB0aW9uPgotICAlUExVR0lOX0RFU0MKLSAgPC9kZXNjcmlwdGlvbj4KLSAgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icHJpdmF0ZVVERElSZWdpc3RyeVR5cGUiIG5hbWU9IiVYUF9QUklWQVRFX1VERElfUkVHSVNUUllfVFlQRVMiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5wcml2YXRlVURESVJlZ2lzdHJ5VHlwZSI+Ci0gICAgICA8cHJpdmF0ZVVERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQUklWQVRFX1VERElfUkVHSVNUUllfVFlQRV9JTVBMIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlSW1wbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZC5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZUltcGwiPgotICAgICAgPC9wcml2YXRlVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfV0laQVJEX05BTUVfV1NfVU5JVF9URVNUX1VEREkiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9yZWdpc3RyeS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5iaW5kaW5nLlByaXZhdGVVRERJV2lkZ2V0QmluZGluZyI+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19VTklUX1RFU1RfVURESSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuYmluZGluZy5Qcml2YXRlVURESVdpZGdldEJpbmRpbmciCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy91ZGRpcHJpdmF0ZWNvbmZpZ193aXouZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5iaW5kaW5nLlByaXZhdGVVRERJV2lkZ2V0QmluZGluZyI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDwhLS0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fTkVXX1dJWkFSRF9OQU1FX1dTX1VOSVRfVEVTVF9VRERJIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvcmVnaXN0cnkuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy51aS5uZXciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQuUHJpdmF0ZVVERElXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQuUHJpdmF0ZVVERElXaXphcmQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVBMVUdJTl9ORVdfV0laQVJEX0RFU0NfV1NfVU5JVF9URVNUX1VEREkKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIC0tPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvcGx1Z2luL1dlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS9wbHVnaW4vV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGEzMjNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS9wbHVnaW4vV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgVURESSBSZWdpc3RyeSBwbHVnaW4uCi0qIDxwPgotKiBUaGUgV2ViIFNlcnZpY2VzIFVEREkgUmVnaXN0cnkgcGx1Z2luJ3MgaXMgdG8gYWRkIHRoZQotKiBvcHRpb24gdG8gY3JlYXRlIGEgdW5pdCB0ZXN0IFVEREkgcmVnaXN0cnkgCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0gIC8qKgotICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgcGx1Z2luIGluIHBsdWdpbi54bWwuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkiOwotCi0gIC8qKgotICAqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbiBpbnN0YW5jZV87Ci0gIHByaXZhdGUgTG9nIGxvZ187Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4gKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgaW5zdGFuY2VfID0gdGhpczsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4gRXF1aXZhbGVudCB0byBjYWxsaW5nCi0gICogKFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Iik7Ci0gICogQHJldHVybiBUaGUgV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbiBzaW5nbGV0b24uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbiBnZXRJbnN0YW5jZSAoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIHJlc291cmNlCi0gICogYXMgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBpbnN0YWxsIGxvY2F0aW9uLgotICAqIEByZXR1cm4gQW4gaW1hZ2UgZGVzY3JpcHRvciwgcG9zc2libHkgbnVsbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMIGluc3RhbGxVUkwgPSBpbnN0YW5jZV8uZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLSAgICAgIFVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCxuYW1lKTsKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHBsdWdpbi5wcm9wZXJ0aWVzLgotICAqIEByZXR1cm4gVGhlIFN0cmluZyBtZXNzYWdlLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIGtleSApCi0gIHsKLSAgICByZXR1cm4gUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoaW5zdGFuY2VfLmdldEJ1bmRsZSgpLGtleSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHBsdWdpbi5wcm9wZXJ0aWVzLiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotICAqIGFyZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoCi0gICogYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIHRoZSBKREsncwotICAqIHtAbGluayBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdH0KLSAgKiBjbGFzcyBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHN1YnN0aXR1dGlvbi4KLSAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MgKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSxhcmdzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwNTg0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLS8qCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkucGx1Z2luLldlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW47Ci0qLwotCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIGJ5dGUgb3BlcmF0aW9uVHlwZTsKLSAgcHJpdmF0ZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSByZWdpc3RyeVR5cGU7Ci0gIAotICAvKgotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luLklEICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgCWlmIChyZWdpc3RyeVR5cGUgIT0gbnVsbCkKLSAgCXsKLSAgCSAgc3dpdGNoIChvcGVyYXRpb25UeXBlKQotICAJICB7Ci0gIAkgIAljYXNlIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlLk9QX0RFUExPWToKLSAgCSAgICAgIHJldHVybiByZWdpc3RyeVR5cGUuZGVwbG95KGVudik7Ci0gIAkgIAljYXNlIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlLk9QX1VQREFURToKLSAgCSAgCSAgcmV0dXJuIHJlZ2lzdHJ5VHlwZS51cGRhdGUoZW52KTsKLSAgCSAgCWNhc2UgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuT1BfUkVNT1ZFOgotICAJICAJICByZXR1cm4gcmVnaXN0cnlUeXBlLnJlbW92ZShlbnYpOwotICAJICAJZGVmYXVsdDoKLSAgCSAgfQotICAJfQotICAJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gICovCi0KLSAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIGdldFJlZ2lzdHJ5VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKTsKLSAgfQotICAKLSAgcHVibGljIGJ5dGUgZ2V0T3BlcmF0aW9uVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uVHlwZTsKLSAgfQotICAKLSAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIGdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCkKLSAgewotICAJcmV0dXJuIHJlZ2lzdHJ5VHlwZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlZ2lzdHJ5VHlwZShQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSByZWdUeXBlKQotICB7Ci0gIAlzZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZShyZWdUeXBlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uVHlwZShieXRlIHR5cGUpCi0gIHsKLSAgICBvcGVyYXRpb25UeXBlID0gdHlwZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgcmVnVHlwZSkKLSAgewotICAJcmVnaXN0cnlUeXBlID0gcmVnVHlwZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDc0MTE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5BYnN0cmFjdENvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSByZWdpc3RyeVR5cGU7Ci0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5OwotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5OwotICAKLSAgcHVibGljIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50KCkKLSAgewotICAJc3VwZXIoKENvbW1hbmRGYWN0b3J5KW51bGwsICIiKTsKLSAgfQotCi0gIC8qKiAKLSAgICAqIEdldHMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAgKiBudWxsIHdoZW4gdGhlcmUgaXMgbm8gZmlyc3QgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldEZpcnN0U3ViRnJhZ21lbnQoKQotICB7Ci0gIAlpZiAocmVnaXN0cnlUeXBlICE9IG51bGwpCi0gIAl7Ci0gICAgICByZWdpc3RyeVR5cGUucmVnaXN0ZXJDYW5GaW5pc2goY2FuRmluaXNoUmVnaXN0cnkpOwotICAgICAgcmVnaXN0cnlUeXBlLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKGRhdGFNYXBwaW5nUmVnaXN0cnkpOwotICAgICAgcmVnaXN0cnlUeXBlLnJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mod2lkZ2V0UmVnaXN0cnkpOwotICAgICAgcmV0dXJuIHJlZ2lzdHJ5VHlwZS5jcmVhdGUoKS5jcmVhdGUoKTsKLSAgCX0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgICogR2V0cyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zIG51bGwKLSAgICAqIHdoZW4gdGhlcmUgaXMgbm8gbmV4dCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0TmV4dFN1YkZyYWdtZW50KENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCkKLSAgewotICAJcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgZGF0YSBtYXBwaW5ncyBmb3IgdGhpcyBjb21tYW5kIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSkKLSAgewotICAJZGF0YU1hcHBpbmdSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5ID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy53aWRnZXRSZWdpc3RyeSA9IHdpZGdldFJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAgKiBBbGwgd2l6YXJkIGZyYWdtZW50cyBuZWVkIHRvIGJlIGNsb25lYWJsZS4KLSAgKiovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0gIAlQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCgpOwotICAJZnJhZ21lbnQucmVnaXN0ZXJEYXRhTWFwcGluZ3MoZGF0YU1hcHBpbmdSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5yZWdpc3RlckNhbkZpbmlzaChjYW5GaW5pc2hSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHdpZGdldFJlZ2lzdHJ5KTsKLSAgCWZyYWdtZW50LnNldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKHJlZ2lzdHJ5VHlwZSk7Ci0gIAlyZXR1cm4gZnJhZ21lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIHJlZ2lzdHJ5VHlwZSkKLSAgewotICAJdGhpcy5yZWdpc3RyeVR5cGUgPSByZWdpc3RyeVR5cGU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5YmUzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS5wbHVnaW4uV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZC5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZC5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLQotLyoqCi0qIFRoaXMgVURESSBjb25maWd1cmF0aW9uIHBhZ2UgcHJvbXB0cyB0aGUgdXNlcgotKiBmb3IgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUKLSogdW5pdCB0ZXN0IFVEREkgcmVnaXN0cnkuCi0qLwotcHVibGljIGNsYXNzIFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotCi0gIHByaXZhdGUgQnV0dG9uIGRlcGxveVJhZGlvXzsKLSAgcHJpdmF0ZSBMYWJlbCB0eXBlc0xhYmVsXzsKLSAgcHJpdmF0ZSBDb21ibyB0eXBlc0NvbWJvXzsKLSAgcHJpdmF0ZSBCdXR0b24gdXBkYXRlUmFkaW9fOwotICBwcml2YXRlIEJ1dHRvbiByZW1vdmVSYWRpb187Ci0gIHByaXZhdGUgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVbXSB0eXBlc187Ci0gIHByaXZhdGUgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgaW5zdGFsbGVkVHlwZV87Ci0KLSAgLy8gSW5mb3BvcAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BVUFJfUFJJVkFURV9VRERJX1BBR0UgPSBXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luLklEICsgIi5wdXByMDAwMSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFVQUl9QUklWQVRFX1VERElfVFlQRSA9IFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uSUQgKyAiLnB1cHIwMDAyIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QVVBSX0RFUExPWV9QUklWQVRFX1VEREkgPSBXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luLklEICsgIi5wdXByMDAwMyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFVQUl9VUERBVEVfUFJJVkFURV9VRERJID0gV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5JRCArICIucHVwcjAwMDUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BVUFJfUkVNT1ZFX1BSSVZBVEVfVURESSA9IFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uSUQgKyAiLnB1cHIwMDA0IjsKLQotICBwdWJsaWMgUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQoKQotICB7Ci0gICAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gIAl0aGlzLnN0YXR1c0xpc3RlbmVyID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFVQUl9QUklWQVRFX1VERElfUEFHRSIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSU5GT1BPUF9QVVBSX1BSSVZBVEVfVURESV9QQUdFKTsKLQotICAgIEdyaWRMYXlvdXQgZ2w7Ci0gICAgR3JpZERhdGEgZ2Q7Ci0gICAgCi0gICAgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgCWhhbmRsZVdpZGdldEV2ZW50KGV2ZW50KTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotICAgIAotICAgIGRlcGxveVJhZGlvXyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgIGRlcGxveVJhZGlvXy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkJVVFRPTl9ERVBMT1lfVURESV9SRUdJU1RSWSIpKTsKLSAgICBkZXBsb3lSYWRpb18uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIGRlcGxveVJhZGlvXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0gICAgZGVwbG95UmFkaW9fLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFVQUl9ERVBMT1lfUFJJVkFURV9VRERJIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChkZXBsb3lSYWRpb18sIElORk9QT1BfUFVQUl9ERVBMT1lfUFJJVkFURV9VRERJKTsKLQotICAgIENvbXBvc2l0ZSB0eXBlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSA1OwotICAgIGdsLnZlcnRpY2FsU3BhY2luZyA9IDE1OwotICAgIGdsLm1hcmdpbldpZHRoID0gMjA7Ci0gICAgdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIHR5cGVzTGFiZWxfID0gbmV3IExhYmVsKHR5cGVDb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICB0eXBlc0xhYmVsXy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkxBQkVMX1BSSVZBVEVfVURESV9SRUdJU1RSWV9UWVBFUyIpKTsKLSAgICB0eXBlc0xhYmVsXy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BVUFJfUFJJVkFURV9VRERJX1RZUEUiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHR5cGVzTGFiZWxfLCBJTkZPUE9QX1BVUFJfUFJJVkFURV9VRERJX1RZUEUpOwotCi0gICAgdHlwZXNDb21ib18gPSBuZXcgQ29tYm8odHlwZUNvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgdHlwZXNDb21ib18uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgdHlwZXNDb21ib18uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotICAgIHR5cGVzQ29tYm9fLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFVQUl9QUklWQVRFX1VERElfVFlQRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAodHlwZXNDb21ib18sIElORk9QT1BfUFVQUl9QUklWQVRFX1VERElfVFlQRSk7Ci0KLSAgICB1cGRhdGVSYWRpb18gPSBuZXcgQnV0dG9uKHBhcmVudCxTV1QuUkFESU8pOwotICAgIHVwZGF0ZVJhZGlvXy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkJVVFRPTl9VUERBVEVfVURESV9SRUdJU1RSWSIpKTsKLSAgICB1cGRhdGVSYWRpb18uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICB1cGRhdGVSYWRpb18uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbixsaXN0ZW5lcik7Ci0gICAgdXBkYXRlUmFkaW9fLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFVQUl9VUERBVEVfUFJJVkFURV9VRERJIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh1cGRhdGVSYWRpb18sIElORk9QT1BfUFVQUl9VUERBVEVfUFJJVkFURV9VRERJKTsKLQotICAgIHJlbW92ZVJhZGlvXyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgIHJlbW92ZVJhZGlvXy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkJVVFRPTl9SRU1PVkVfVURESV9SRUdJU1RSWSIpKTsKLSAgICByZW1vdmVSYWRpb18uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICByZW1vdmVSYWRpb18uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotICAgIHJlbW92ZVJhZGlvXy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BVUFJfUkVNT1ZFX1BSSVZBVEVfVURESSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocmVtb3ZlUmFkaW9fLCBJTkZPUE9QX1BVUFJfUkVNT1ZFX1BSSVZBVEVfVURESSk7ICAgICAgICAgICAgICAgIAotCi0gICAgbG9hZFR5cGVzKCk7Ci0gICAgaW5pdCgpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIGxvYWRUeXBlcygpCi0gIHsKLSAgICB0eXBlc18gPSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZXMoKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBpbml0KCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXNfLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICh0eXBlc19baV0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHlwZXNDb21ib18uYWRkKHR5cGVzX1tpXS5nZXROYW1lKCkpOwotICAgICAgICBpZiAodHlwZXNfW2ldLmlzUHJpdmF0ZVVERElSZWdpc3RyeUluc3RhbGxlZCgpKQotICAgICAgICAgIGluc3RhbGxlZFR5cGVfID0gdHlwZXNfW2ldOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHlwZXNDb21ib18uZ2V0SXRlbUNvdW50KCkgPiAwKQotICAgICAgdHlwZXNDb21ib18uc2V0VGV4dCh0eXBlc0NvbWJvXy5nZXRJdGVtKDApKTsKLSAgICBpZiAoaW5zdGFsbGVkVHlwZV8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVSYWRpb18uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIHJlbW92ZVJhZGlvXy5zZXRFbmFibGVkKHRydWUpOyAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHVwZGF0ZVJhZGlvXy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIHJlbW92ZVJhZGlvXy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlV2lkZ2V0RXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHJlbW92ZVJhZGlvXyB8fCBldmVudC53aWRnZXQgPT0gdXBkYXRlUmFkaW9fKQotICAgIHsKLSAgICAgIGJvb2xlYW4gaXNVcGRhdGVPclJlbW92ZVNlbGVjdGVkID0gKChCdXR0b24pZXZlbnQud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIHR5cGVzTGFiZWxfLnNldEVuYWJsZWQoIWlzVXBkYXRlT3JSZW1vdmVTZWxlY3RlZCk7Ci0gICAgICB0eXBlc0NvbWJvXy5zZXRFbmFibGVkKCFpc1VwZGF0ZU9yUmVtb3ZlU2VsZWN0ZWQpOwotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gZGVwbG95UmFkaW9fKQotICAgIHsKLSAgICAgIGJvb2xlYW4gaXNEZXBsb3lTZWxlY3RlZCA9ICgoQnV0dG9uKWV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICB0eXBlc0xhYmVsXy5zZXRFbmFibGVkKGlzRGVwbG95U2VsZWN0ZWQpOwotICAgICAgdHlwZXNDb21ib18uc2V0RW5hYmxlZChpc0RlcGxveVNlbGVjdGVkKTsKLSAgICB9Ci0gICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpOwotICB9Ci0gIAotICBwdWJsaWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKQotICB7Ci0gIAlpZiAoZGVwbG95UmFkaW9fLmdldFNlbGVjdGlvbigpKQotICAJewotICAJICBTdHJpbmcgc2VsZWN0ZWRSZWdpc3RyeU5hbWUgPSB0eXBlc0NvbWJvXy5nZXRUZXh0KCk7Ci0gIAkgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXNfLmxlbmd0aDsgaSsrKQotICAgICAgICBpZiAoc2VsZWN0ZWRSZWdpc3RyeU5hbWUuZXF1YWxzKHR5cGVzX1tpXS5nZXROYW1lKCkpKQotICAJICAJICByZXR1cm4gdHlwZXNfW2ldOwotICAgICAgcmV0dXJuIG51bGw7Ci0gIAl9Ci0gIAllbHNlCi0gIAkgIHJldHVybiBpbnN0YWxsZWRUeXBlXzsKLSAgfQotICAKLSAgcHVibGljIGJ5dGUgZ2V0T3BlcmF0aW9uVHlwZSgpCi0gIHsKLSAgCWlmIChkZXBsb3lSYWRpb18uZ2V0U2VsZWN0aW9uKCkpCi0gIAkgIHJldHVybiBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5PUF9ERVBMT1k7Ci0gIAllbHNlIGlmICh1cGRhdGVSYWRpb18uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICByZXR1cm4gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuT1BfVVBEQVRFOwotICAJZWxzZSBpZiAocmVtb3ZlUmFkaW9fLmdldFNlbGVjdGlvbigpKQotICAgICAgcmV0dXJuIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlLk9QX1JFTU9WRTsKLSAgCWVsc2UKLSAgCSAgcmV0dXJuIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlLk9QX0RFUExPWTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIHByaXZhdGVVRERJUmVnaXN0cnlUeXBlID0gZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKTsKLSAgICBpZiAocHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgIT0gbnVsbCkKLSAgICAgIHJldHVybiBwcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5nZXRPcGVyYXRpb25TdGF0dXMoZ2V0T3BlcmF0aW9uVHlwZSgpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX1VERElfUkVHSVNUUllfQVZBSUxBQkxFIiksIFN0YXR1cy5FUlJPUik7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldENvbmRpdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0Q29uZGl0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY5MmQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0Q29uZGl0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXRDb25kaXRpb25Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCBpbXBsZW1lbnRzIENvbmRpdGlvbgotewotICBwcml2YXRlIGJvb2xlYW4gY29uZGl0aW9uOwotCi0gIHB1YmxpYyBQcml2YXRlVURESVNlbGVjdGlvbldpZGdldENvbmRpdGlvbkNvbW1hbmQoKQotICB7Ci0gICAgY29uZGl0aW9uID0gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIGNvbmRpdGlvbiA9ICFjb25kaXRpb247Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIHVuZG8oRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgY29uZGl0aW9uID0gIWNvbmRpdGlvbjsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kI2lzVW5kb2FibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkKLSAgewotICAgIHJldHVybiBjb25kaXRpb247Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9iaW5kaW5nL1ByaXZhdGVVRERJV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvYmluZGluZy9Qcml2YXRlVURESVdpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiN2JkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9iaW5kaW5nL1ByaXZhdGVVRERJV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LnBsdWdpbi5XZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzLlByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXRDb25kaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBQcml2YXRlVURESVdpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnk7Ci0gIHByaXZhdGUgV2lkZ2V0UmVnaXN0cnkgICAgICB3aWRnZXRSZWdpc3RyeTsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0gIHByaXZhdGUgUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kRnJhZ21lbnQgcHJpdmF0ZVVERElTZWxGcmFnbWVudDsKLSAgcHJpdmF0ZSBQcml2YXRlVURESVNlbGVjdGlvbldpZGdldENvbmRpdGlvbkNvbW1hbmQgY29uZGl0aW9uQ29tbWFuZDsKLSAgCi0gIHB1YmxpYyBQcml2YXRlVURESVdpZGdldEJpbmRpbmcoKQotICB7Ci0gICAgcHJpdmF0ZVVERElTZWxGcmFnbWVudCA9IG5ldyBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCgpOwotICAgIGNvbmRpdGlvbkNvbW1hbmQgPSBuZXcgUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXRDb25kaXRpb25Db21tYW5kKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgewotICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgewotICAgICAgICBTZXF1ZW5jZUZyYWdtZW50IHJvb3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgICAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQoY29uZGl0aW9uQ29tbWFuZCwgIiIpKTsKLSAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KCJQcml2YXRlVURESVNlbGVjdGlvbldpZGdldCIpKTsKLSAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KGNvbmRpdGlvbkNvbW1hbmQsICIiKSk7Ci0gICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kKCksICIiKSk7Ci0gICAgICAgIHJvb3QuYWRkKHByaXZhdGVVRERJU2VsRnJhZ21lbnQpOwotICAgICAgICByZXR1cm4gcm9vdDsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5ID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gICAgcHJpdmF0ZVVERElTZWxGcmFnbWVudC5yZWdpc3RlckNhbkZpbmlzaCh0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5KTsKLSAgICAKLSAgICBjYW5GaW5pc2hSZWdpc3RyeS5hZGRDb25kaXRpb24oY29uZGl0aW9uQ29tbWFuZCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5ID0gZGF0YVJlZ2lzdHJ5OwotICAgIHByaXZhdGVVRERJU2VsRnJhZ21lbnQucmVnaXN0ZXJEYXRhTWFwcGluZ3MoZGF0YU1hcHBpbmdSZWdpc3RyeSk7Ci0gICAgCi0gICAgLy8gUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kCi0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeS5hZGRNYXBwaW5nKFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUiLCBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkuYWRkTWFwcGluZyhQcml2YXRlVURESVNlbGVjdGlvbldpZGdldC5jbGFzcywgIk9wZXJhdGlvblR5cGUiLCBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeS5hZGRNYXBwaW5nKFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUiLCBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudC5jbGFzcyk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIHRoaXMud2lkZ2V0UmVnaXN0cnkgPSB3aWRnZXRSZWdpc3RyeTsKLSAgICBwcml2YXRlVURESVNlbEZyYWdtZW50LnJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3ModGhpcy53aWRnZXRSZWdpc3RyeSk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoIlByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0IiwgCi0gICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1BSSVZBVEVfVURESV9DT05GSUciKSwKLSAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19QUklWQVRFX1VERElfQ09ORklHIiksCi0JICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgIHsKLQkgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0JICAgIHsKLQkgICAgICByZXR1cm4gbmV3IFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0KCk7Ci0JICAgIH0KLQkgIH0KLSAgICApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNWIwMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci0KLQotcHVibGljIGludGVyZmFjZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSBleHRlbmRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIC8vIG9wZXJhdGlvbiB0eXBlcwotICBwdWJsaWMgc3RhdGljIGJ5dGUgT1BfREVQTE9ZID0gMHgwOwotICBwdWJsaWMgc3RhdGljIGJ5dGUgT1BfVVBEQVRFID0gMHgxOwotICBwdWJsaWMgc3RhdGljIGJ5dGUgT1BfUkVNT1ZFID0gMHgyOwotCi0gIC8vIGdlbmVyYWwgaW5mb3JtYXRpb24KLSAgcHVibGljIFN0cmluZyBnZXRJRCgpOwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlVURESVJlZ2lzdHJ5SW5zdGFsbGVkKCk7Ci0gIHB1YmxpYyBTdGF0dXMgZ2V0T3BlcmF0aW9uU3RhdHVzKGJ5dGUgb3BlcmF0aW9uKTsKLQotICAvLyByZWdpc3RyeSBVUkxzCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeUFQSSgpOwotICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hBUEkoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiYmM3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuYmluZGluZy5Qcml2YXRlVURESVdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci0KLQotcHVibGljIGNsYXNzIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlSW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS51ZGRpLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlCi17Ci0gICAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlSW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVVRERJUmVnaXN0cnlJbnN0YWxsZWQoKSB7Ci0gICAgICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlW10gdHlwZXMgPSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHR5cGVzW2ldLmlzUHJpdmF0ZVVERElSZWdpc3RyeUluc3RhbGxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJpdmF0ZVVERElSZWdpc3RyeUlucXVpcnlBUEkoKSB7Ci0gICAgICAgIFZlY3RvciBpbnF1aXJ5QVBJVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzID0gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0eXBlc1tpXS5pc1ByaXZhdGVVRERJUmVnaXN0cnlJbnN0YWxsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gdHlwZXNbaV0uZ2V0SW5xdWlyeUFQSSgpOwotICAgICAgICAgICAgICAgIGlmIChpbnF1aXJ5QVBJICE9IG51bGwgJiYgaW5xdWlyeUFQSS5zdGFydHNXaXRoKCJodHRwIikpCi0gICAgICAgICAgICAgICAgICAgIGlucXVpcnlBUElWZWN0b3IuYWRkKGlucXVpcnlBUEkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gaW5xdWlyeUFQSUFycmF5ID0gbmV3IFN0cmluZ1tpbnF1aXJ5QVBJVmVjdG9yLnNpemUoKV07Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBpbnF1aXJ5QVBJVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgaW5xdWlyeUFQSUFycmF5W2pdID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlucXVpcnlBUElBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVB1Ymxpc2hBUEkoKSB7Ci0gICAgICAgIFZlY3RvciBwdWJsaXNoQVBJVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzID0gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0eXBlc1tpXS5pc1ByaXZhdGVVRERJUmVnaXN0cnlJbnN0YWxsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaXNoQVBJID0gdHlwZXNbaV0uZ2V0UHVibGlzaEFQSSgpOwotICAgICAgICAgICAgICAgIGlmIChwdWJsaXNoQVBJICE9IG51bGwgJiYgcHVibGlzaEFQSS5zdGFydHNXaXRoKCJodHRwIikpCi0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hBUElWZWN0b3IuYWRkKHB1Ymxpc2hBUEkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcHVibGlzaEFQSUFycmF5ID0gbmV3IFN0cmluZ1twdWJsaXNoQVBJVmVjdG9yLnNpemUoKV07Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBwdWJsaXNoQVBJVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgcHVibGlzaEFQSUFycmF5W2pdID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHB1Ymxpc2hBUElBcnJheTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENvbW1hbmRXaWRnZXRCaW5kaW5nIGdldEJpbmRpbmcoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgUHJpdmF0ZVVERElXaWRnZXRCaW5kaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxZDZjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2l6YXJkL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IGluc3RhbmNlXzsKLSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzXzsKLQotICAgIHByaXZhdGUgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSgpIHsKLSAgICB9Ci0gIAotICAgIC8qKgotICAgICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgICogQHJldHVybiBBIHNpbmdsZXRvbiBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IG9iamVjdC4KLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgaWYgKGluc3RhbmNlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YW5jZV8gPSBuZXcgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSgpOwotICAgICAgICAgICAgaW5zdGFuY2VfLmdldENvbmZpZ0VsZW1lbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgICB9Ci0gIAotICAgIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWdFbGVtZW50cygpIHsKLSAgICAgICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgIGNvbmZpZ0VsZW1lbnRzXyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcml2YXRlVURESVJlZ2lzdHJ5VHlwZSIpOwotICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdFbGVtZW50c18ubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgd2VpZ2h0ID0gZ2V0V2VpZ2h0KGNvbmZpZ0VsZW1lbnRzX1tpXSk7Ci0gICAgICAgICAgaW50IGluZGV4ID0gLTE7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IHYuc2l6ZSgpLTE7IGogPj0gMDsgai0tKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh3ZWlnaHQgPiBnZXRXZWlnaHQoKElDb25maWd1cmF0aW9uRWxlbWVudCl2LmdldChqKSkpCi0gICAgICAgICAgICAgIGluZGV4ID0gajsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgICAgIHYuYWRkKGluZGV4LCBjb25maWdFbGVtZW50c19baV0pOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHYuYWRkKGNvbmZpZ0VsZW1lbnRzX1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgdi5jb3B5SW50byhjb25maWdFbGVtZW50c18pOwotICAgICAgICByZXR1cm4gY29uZmlnRWxlbWVudHNfOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFdlaWdodChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZS5nZXRBdHRyaWJ1dGUoIndlaWdodCIpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotICAgICAgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlnRWxlbWVudEJ5SUQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDxjb25maWdFbGVtZW50c18ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjb25maWdFbGVtZW50c19baV0uZ2V0QXR0cmlidXRlKCJpZCIpLmVxdWFscyhpZCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ0VsZW1lbnRzX1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVbXSBnZXRUeXBlcygpIHsKLSAgICAgICAgVmVjdG9yIHR5cGVzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzXy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdHlwZU9iaiA9IGNvbmZpZ0VsZW1lbnRzX1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlT2JqIGluc3RhbmNlb2YgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHR5cGVzLmFkZCh0eXBlT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgfQotCi0gICAgICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlW10gdHlwZXNBcnJheSA9IG5ldyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVt0eXBlcy5zaXplKCldOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICB0eXBlc0FycmF5W2pdID0gKFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKXR5cGVzLmVsZW1lbnRBdChqKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZXNBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgZ2V0VHlwZUJ5SUQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3QgdHlwZU9iaiA9IGdldENvbmZpZ0VsZW1lbnRCeUlEKGlkKS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICAgICAgaWYgKHR5cGVPYmogaW5zdGFuY2VvZiBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKXR5cGVPYmo7IAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFNlcnZlckZhY3RvcnlJREJ5SUQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gZ2V0Q29uZmlnRWxlbWVudEJ5SUQoaWQpOwotICAgICAgICBpZiAoY29uZmlnRWxlbWVudCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgICAgIFZlY3RvciBpZFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgic2VydmVyRmFjdG9yeUlEIiksICIsIik7Ci0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIGlkVmVjdG9yLmFkZChzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1tpZFZlY3Rvci5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZHNbaV0gPSAoU3RyaW5nKWlkVmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaWRzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdWRkaXJlZ2lzdHJ5L3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdWRkaXJlZ2lzdHJ5L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGQ4YWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3VkZGlyZWdpc3RyeS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgUHJpdmF0ZVVERElDb25maWdQYWdlCi0jCi1QQUdFX1RJVExFX1BSSVZBVEVfVURESV9DT05GSUc9VW5pdCBUZXN0IFVEREkgUmVnaXN0cnkgQ29uZmlndXJhdGlvbgotUEFHRV9ERVNDX1BSSVZBVEVfVURESV9DT05GSUc9Q29uZmlndXJlIHRoZSB1bml0IHRlc3QgVURESSByZWdpc3RyeS4KLQotIwotIyBUb29sdGlwIGZvciBQcml2YXRlVURESUNvbmZpZ1BhZ2UKLSMKLVRPT0xUSVBfUFVQUl9QUklWQVRFX1VERElfUEFHRT1EZXBsb3kgb3IgcmVtb3ZlIGEgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkKLVRPT0xUSVBfUFVQUl9QUklWQVRFX1VERElfVFlQRT1DaG9vc2UgdGhlIHR5cGUgb2YgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkgeW91IHdhbnQgdG8gZGVwbG95Ci1UT09MVElQX1BVUFJfREVQTE9ZX1BSSVZBVEVfVUREST1EZXBsb3kgYSBVbml0IFRlc3QgVURESSBSZWdpc3RyeQotVE9PTFRJUF9QVVBSX1VQREFURV9QUklWQVRFX1VEREk9VXBkYXRlIHRoZSBleGlzdGluZyBVbml0IFRlc3QgVURESSBSZWdpc3RyeQotVE9PTFRJUF9QVVBSX1JFTU9WRV9QUklWQVRFX1VEREk9UmVtb3ZlIHRoZSBleGlzdGluZyBVbml0IFRlc3QgVURESSBSZWdpc3RyeQotCi0jCi0jIENvbW1vbiB3aXphcmQgc3RyaW5ncy4KLSMKLUxBQkVMX1BSSVZBVEVfVURESV9SRUdJU1RSWV9UWVBFUz1Qcml2YXRlIFVEREkgUmVnaXN0cnkgdHlwZToKLUJVVFRPTl9ERVBMT1lfVURESV9SRUdJU1RSWT1EZXBsb3kgdGhlIFVuaXQgVGVzdCBVRERJIFJlZ2lzdHJ5Ci1CVVRUT05fVVBEQVRFX1VERElfUkVHSVNUUlk9VXBkYXRlIHRoZSBwcmV2aW91c2x5IGRlcGxveWVkIFVEREkgcmVnaXN0cnkKLUJVVFRPTl9SRU1PVkVfVURESV9SRUdJU1RSWT1SZW1vdmUgdGhlIHByZXZpb3VzbHkgZGVwbG95ZWQgVURESSByZWdpc3RyeQotCi0jCi0jIFdpemFyZCBwYWdlIHRhc2sgbGFiZWxzIGFuZCBkZXNjcmlwdGlvbnMKLSMgKHVzZWQgb25seSBmb3IgcHJvZ3Jlc3MgaW5kaWNhdGlvbikuCi0jCi0KLSMKLSMgRGlhbG9nIG1lc3NhZ2VzCi0jCi0KLSMKLSMgUHJvZ3Jlc3MgbWVzc2FnZXMKLSMKLQotIwotIyBXYXJuaW5nIG1lc3NhZ2VzCi0jCi0KLSMKLSMgRXJyb3IgbWVzc2FnZXMKLSMKLU1TR19FUlJPUl9OT19VRERJX1JFR0lTVFJZX0FWQUlMQUJMRT1JV0FCMDM2M0UgTm8gVURESSByZWdpc3RyeSBhdmFpbGFibGUuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1YjM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmZhZDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotd3MtdWkuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2VmOWFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNGNjYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXNvdXJjZS53cy11aS5qYXIgPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSB3cy11aS5qYXIsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZG9jLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIHRlc3QvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9pY29ucy9qYXJfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL2ljb25zL2phcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTJmNGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL2ljb25zL2phcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhZWU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi1QTFVHSU5fTkVXX0NBVEVHT1JZX05BTUVfV1M9V2ViIFNlcnZpY2VzCi0KLSMKLSMJV2ViIFNlcnZpY2VzIFByZWZlcmFuY2UgUGFnZXMKLSMKLSMgQ2F0ZWdvcmllcwotUFJFRkVSRU5DRV9DQVRFR09SWV9SRVNPVVJDRV9NQU5BR0VNRU5UPVJlc291cmNlIE1hbmFnZW1lbnQKLQotIwotIyAgV1MtSSBQcmVmZXJlbmNlIHBhZ2VzCi0jCi0jIFdTLUkgQ29tcGxpYW5jZSBQYWdlCi0jCi1QUkVGRVJFTkNFX0NBVEVHT1JZX1dTST1XUy1JIENvbXBsaWFuY2UKLQotIwotIyBQb3B1cCBhY3Rpb24gQ2F0ZWdvcnkKLSMKLUxBQkVMX1BPUFVQX0NBVEVHT1JZX1dFQl9TRVJWSUNFUz1XZWIgU2VydmljZXMKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDliYWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnVpIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBuYW1lPSIlUExVR0lOX05BTUUiCi0gICBwcm92aWRlci1uYW1lPSIlUExVR0lOX1BST1ZJREVSIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV2ViU2VydmljZVVJUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ3cy11aS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfQ0FURUdPUllfTkFNRV9XUyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICAKLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9SRVNPVVJDRV9NQU5BR0VNRU5UIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQotICAgICAgCi0KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudSI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVMQUJFTF9QT1BVUF9DQVRFR09SWV9XRUJfU0VSVklDRVMiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudSI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICBuYW1lPSJwb3B1cEFjdGlvbnMiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotPCEtLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbiIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkuZWpiLnBvcHVwTWVudSI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVMQUJFTF9QT1BVUF9DQVRFR09SWV9XRUJfU0VSVklDRVMiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LmVqYi5wb3B1cE1lbnUiPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgbmFtZT0icG9wdXBBY3Rpb25zIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgPC9tZW51PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0tLT4gICAgICAKLQotICAgPC9leHRlbnNpb24+Ci0gICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vTGF1bmNoSW1wb3J0V2l6YXJkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9MYXVuY2hJbXBvcnRXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5MjY4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9MYXVuY2hJbXBvcnRXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgbGF1bmNoZXMgdGhlIGltcG9ydCB3aXphcmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hJbXBvcnRXaXphcmRBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUKLXsKLSAgICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbl87Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIAotICAgIHsKLSAgICAgIER5bmFtaWNXaXphcmQgd2l6YXJkID0gbmV3IER5bmFtaWNXaXphcmQoKTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHdpemFyZC5zZXRJbml0aWFsRGF0YSggIndzaW1wb3J0IiApOwotICAgICAgICB3aXphcmQuaW5pdCggUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uXyApOwotICAgICAgfQotICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgCi0gIAkgIFdpemFyZERpYWxvZyBkaWFsb2c9IG5ldyBXaXphcmREaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCB3aXphcmQpOwotCSAgZGlhbG9nLnNldFBhZ2VTaXplKCA1MDAsIDQwMCApOwotCSAgZGlhbG9nLmNyZWF0ZSgpOwotCSAgZGlhbG9nLm9wZW4oKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgCi0gICAgewotICAgICAgaWYoIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICkKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uXyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2ViU2VydmljZURlcGxveS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2ViU2VydmljZURlcGxveS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ0OGI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvYWN0aW9uL1dlYlNlcnZpY2VEZXBsb3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VEZXBsb3kgewotCXB1YmxpYyB2b2lkIHJ1bihJUmVzb3VyY2Ugc2VsZWN0aW9uKTsgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XZWJTZXJ2aWNlRGVwbG95QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XZWJTZXJ2aWNlRGVwbG95QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YjEwOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2ViU2VydmljZURlcGxveUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRGVwbG95QWN0aW9uIGV4dGVuZHMgV2luZG93QWN0aW9uRGVsZWdhdGUgewotcHVibGljIHZvaWQgcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uIGFjdGlvbikgewotCi0gICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZVByb2plY3QoKTsKLQotICAgU3RyaW5nIFtdIHR5cGVJZHMgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJUeXBlSWRzQnlNb2R1bGUocHJvamVjdCk7Ci0gICBPYmplY3QgdGhlQWN0aW9uID0gbnVsbDsKLQotICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC53cy51aSIsICJ3ZWJzZXJ2aWNlZGVwbG95Iik7Ci0gICB0cnkgewotICAgCQotICAgCWlmICh0eXBlSWRzID09IG51bGwgfHwgdHlwZUlkcy5sZW5ndGggPD0gMCkKLSAgIAl7Ci0gICAJIAkvLyB0aGF0IG1lYW5zIHRoZSBtb2R1bGUgaXMgbm90IGF0dGFjaGVkIHRvIGEgc2VydmVyIHRoZW4gcGljayB0aGUgZmlyc3QgZXh0ZW5zaW9uIGZvdW5kCi0gICAJICAgIHRoZUFjdGlvbiA9IGVsZW1lbnRzWzBdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAJfQotICAgCWVsc2UgaWYgKCB0eXBlSWRzLmxlbmd0aCA9PSAxKQotICAgCXsKLSAgIAkJLy8gdGhhdCBtZWFucyB0aGUgbW9kdWxlIGlzIGF0dGFjaGVkIHRvIG9uZSBzZXJ2ZXIgdGhlbiBmaW5kcyBpdCBpZCBhbmQgYSBtYXRjaGluIGV4dGVuc2lvbiBvciBnaXZlIGEgbWVzc2FnZQotICAgCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgCXsKLQkJICAgCVN0cmluZyBpZCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiZmFjdG9yeUlkIik7Ci0gICAgCSAgIAlpZiAoIHR5cGVJZHNbMF0uZXF1YWxzKGlkKSkKLQkJICAgCXsKLQkJICAgCQl0aGVBY3Rpb24gPSBlbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkgICAJCWJyZWFrOwotCQkgICAJfQotICAgCQl9Ci0gICAJCWlmICh0aGVBY3Rpb24gPT0gbnVsbCApCi0gICAJCQl7Ci0gICAJCQkJLy8gZ2l2ZSBhIG1lc3NhZ2UKLSAgIAkJCX0KLSAgIAl9Ci0gICAJZWxzZQotICAgCXsKLQkJLy8gVGhlIG1vZHVsZSBpcyBhdHRhY2hlZCB0byBtb3JlIHRoYW4gb25lIHNlcnZlciBmaW5kIHRoZSBmaXJzdCBzZXJ2ZXItZXh0ZW5zaW9uIGNvdXBsZQotCQkvLyBUQkQ6IGFkZCBhIGRpYWxvZyB0byBjaG9vc2UgdGhlIHNlcnZlciBmb3IgZGVwbG95bWVudAotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgCXsKLQkJICAgCVN0cmluZyBpZCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiZmFjdG9yeUlkIik7Ci0JCSAgIAlmb3IgKCBpbnQgaz0wOyBrPCB0eXBlSWRzLmxlbmd0aDsgaysrKQotCQkgICAJewotICAgIAkgICAJCWlmICggdHlwZUlkc1trXS5lcXVhbHMoaWQpKQotCQkgICAJCXsKLQkJICAgCQkJdGhlQWN0aW9uID0gZWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJICAgCQkJYnJlYWs7Ci0JCSAgIAkJfQotCQkgICAJfQotCQkgICBpZiAodGhlQWN0aW9uICE9IG51bGwpIGJyZWFrOwotICAgCQkgfQotCQlpZiAodGhlQWN0aW9uID09IG51bGwpIAotCQkJewotCQkJCS8vIGdpdmUgYSBNZXNzYWdlCi0JCQl9Ci0gICAJfQotCi0gICAgaWYgKHRoZUFjdGlvbiBpbnN0YW5jZW9mIFdlYlNlcnZpY2VEZXBsb3kpCi0gICAgICAgICAgKChXZWJTZXJ2aWNlRGVwbG95KXRoZUFjdGlvbikucnVuKHByb2plY3QpOyAgIAotICB9Ci0KLSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotfQotIAotCi0JcHJpdmF0ZSBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCi0JCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHByb2plY3QpOwotCQlpZiAobW9kdWxlcyE9bnVsbCAmJiBtb2R1bGVzLmxlbmd0aCE9MCkgewotCQkJcmV0dXJuIG1vZHVsZXNbMF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotIAl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XaW5kb3dBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2luZG93QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3ZTI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XaW5kb3dBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdpbmRvd0FjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi1wdWJsaWMgV2luZG93QWN0aW9uRGVsZWdhdGUoKSB7Ci0gICAgc3VwZXIoKTsKLSB9Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSAKLSB7Ci0gfQotCi1wdWJsaWMgdm9pZCBpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7IH0KLQotcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiBhY3Rpb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICBmU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gfQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JZlNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLX0KLXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JcmV0dXJuIGZTZWxlY3Rpb247Ci19Ci0KLXB1YmxpYyBJUHJvamVjdCBnZXRTZWxlY3RlZFJlc291cmNlUHJvamVjdCgpIHsKLSBJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLSBJUmVzb3VyY2UgcmVzb3VyY2VfID0gbnVsbDsKLSAgIHRyeSB7Ci0gICAJCWlmIChmU2VsZWN0aW9uICE9IG51bGwgJiYgZlNlbGVjdGlvbi5zaXplKCkgPT0gMSkgICAgewotICAgICAgCQlPYmplY3Qgb2JqID0gZlNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgCQlpZiAob2JqICE9IG51bGwpICAgIHsKLSAgICAgIAkJCWlmICggb2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSAKLSAgICAgIAkJCQl7Ci0gICAgICAJCQkJCXJlc291cmNlXyA9IChJUmVzb3VyY2UpIG9iajsKLSAgICAgIAkJCQl9Ci0gICAgICAJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KQotICAgICAgCQkJewotICAgICAgICAJCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBVbml0ID0gKElDb21waWxhdGlvblVuaXQpb2JqOwotICAgICAgICAJCQlyZXNvdXJjZV89IGNvbXBVbml0LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotICAgICAgCQkJfQotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCQlwcm9qZWN0ID0gKChJSmF2YVByb2plY3QpIG9iaikuZ2V0UHJvamVjdCgpOwotCQkJCX0KLQotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqKTsKLQkJCQl9Ci0KLSAgICAgIAkJCWlmICggcmVzb3VyY2VfICE9IG51bGwgKQotICAgCQkJCQlwcm9qZWN0ID0gcmVzb3VyY2VfLmdldFByb2plY3QoKTsKLSAgICAgICAgIAkJCi0gICAgCQl9Ci0gICAJCX0KLSAgIAl9CQotICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgcmV0dXJuIHByb2plY3Q7Ci0gfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9EaWFsb2dSZXNvdXJjZUJyb3dzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0RpYWxvZ1Jlc291cmNlQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGZmYjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0RpYWxvZ1Jlc291cmNlQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0qIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBkaWFsb2cgZm9yIGJyb3dzaW5nIHdvcmtzcGFjZSByZXNvdXJjZXMuCi0qIFNlZSBhbHNvIHtAbGluayBEaWFsb2dVdGlscyNicm93c2VSZXNvdXJjZXN9LgotKi8KLXB1YmxpYyBjbGFzcyBEaWFsb2dSZXNvdXJjZUJyb3dzZXIgZXh0ZW5kcyBEaWFsb2cKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9SRVNPVVJDRV9UUkVFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5EUkVTMDAwMSI7Ci0KLSAgcHJpdmF0ZSBTaGVsbCBzaGVsbF87Ci0gIHByaXZhdGUgSVJlc291cmNlIHJvb3RfOwotICBwcml2YXRlIElGaWx0ZXJbXSBmaWx0ZXJzXzsKLSAgcHJpdmF0ZSBib29sZWFuIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF87Ci0gIHByaXZhdGUgSVJlc291cmNlW10gc2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBUcmVlIHJlc291cmNlVHJlZV87Ci0gIHByaXZhdGUgVHJlZVZpZXdlciBmaWxlVmlld2VyXzsKLQotICBwdWJsaWMgRGlhbG9nUmVzb3VyY2VCcm93c2VyKFNoZWxsIHNoZWxsLCBJUmVzb3VyY2Ugcm9vdCwgSUZpbHRlciBmaWx0ZXIpCi0gIHsKLSAgICB0aGlzKHNoZWxsLCByb290LCBuZXcgSUZpbHRlcltde2ZpbHRlcn0pOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5EaWFsb2dSZXNvdXJjZUJyb3dzZXI8L2NvZGU+Ci0gICogdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnBhcmVudCBTaGVsbDwvY29kZT4uCi0gICogVGhlIGRpYWxvZyByZW5kZXJzIGFsbCByZXNvdXJjZXMgaW5jbHVkaW5nIGFuZAotICAqIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5yb290IElSZXNvdXJjZTwvY29kZT4KLSAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQge0BsaW5rIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsfS4KLSAgKiBvciBudWxsIHRvIGNyZWF0ZSBhIHRvcC1sZXZlbCBzaGVsbC4KLSAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlfSwKLSAgKiBvciBudWxsIHRvIGJlZ2luIHdpdGggdGhlIHdvcmtzcGFjZSByb290LgotICAqIEBwYXJhbSBmaWx0ZXJzIEFuIGFycmF5IG9mIGphdmEubGFuZy5TdHJpbmcKLSAgKi8KLSAgcHVibGljIERpYWxvZ1Jlc291cmNlQnJvd3NlcihTaGVsbCBzaGVsbCwgSVJlc291cmNlIHJvb3QsIElGaWx0ZXJbXSBmaWx0ZXJzKQotICB7Ci0gICAgc3VwZXIoc2hlbGwpOwotICAgIHNoZWxsXyA9IHNoZWxsOwotCi0gICAgSVJlc291cmNlIG1vZHVsZVJvb3QgPSByb290OwotICAgIGlmIChyb290IGluc3RhbmNlb2YgSVByb2plY3QpCi0gICAgewotICAgICAgSVByb2plY3QgcCA9IChJUHJvamVjdCltb2R1bGVSb290OwotICAgICAgSjJFRU5hdHVyZSBuYXR1cmUgPSAoSjJFRU5hdHVyZSkgSjJFRU5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZShwKTsKLSAgICAgIGlmIChuYXR1cmUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbW9kdWxlUm9vdCA9IG5hdHVyZS5nZXRNb2R1bGVTZXJ2ZXJSb290KCk7Ci0gICAgICB9Ci0gICAgCi0gICAgfQotCi0gICAgcm9vdF8gPSAobW9kdWxlUm9vdCA9PSBudWxsKSA/IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkgOiBtb2R1bGVSb290OwotICAgIGZpbHRlcnNfID0gKGZpbHRlcnMgPT0gbnVsbCkgPyBuZXcgSUZpbHRlclswXSA6IGZpbHRlcnM7Ci0gICAgbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXyA9IGZhbHNlOwotICAgIHNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULlJFU0laRSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0gIH0KLQotICAvKioKLSAgKiBFbmFibGVzIG9yIGRpc2FibGVzIG11bHRpcGxlIHNlbGVjdGlvbiBpbiB0aGUgdHJlZSB2aWV3LgotICAqIE11bHRpcGxlIHNlbGVjdGlvbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotICAqIEBwYXJhbSBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQgVHJ1ZSB0byBlbmFibGVkIG9yIGZhbHNlIHRvIGRpc2FibGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldE11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZChib29sZWFuIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZCkKLSAgewotICAgIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF8gPSBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQ7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb25zIG1hZGUgaW4gdGhlIGRpYWxvZyBpZiBPSyB3YXMgcHJlc3NlZCwKLSAgKiBvciBudWxsIGlmIENhbmNlbCB3YXMgcHJlc3NlZC4gUmV0dXJucyBudWxsIGlmIHRoZSBkaWFsb2cKLSAgKiBoYXMgbmV2ZXIgYmVlbiBvcGVuZWQuCi0gICogQHJldHVybiBBbiBhcnJheSBvZiBzZWxlY3RlZCByZXNvdXJjZXMsIHBvc3NpYmx5IGVtcHR5LCBwb3NzaWJseSBudWxsLgotICAqLwotICBwdWJsaWMgSVJlc291cmNlW10gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25fOwotICB9Ci0KLSAgcHVibGljIElSZXNvdXJjZSBnZXRGaXJzdFNlbGVjdGlvbigpCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uXyAhPSBudWxsICYmIHNlbGVjdGlvbl8ubGVuZ3RoID4gMCkKLSAgICAgIHJldHVybiBzZWxlY3Rpb25fWzBdOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBDYW5jZWwgYnV0dG9uIGlzIHByZXNzZWQuCi0gICogSW5zdXJlcyB0aGF0IHtAbGluayAjZ2V0UmVzdWx0fSB3aWxsIHJldHVybiBudWxsLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkKLSAgewotICAgIHNlbGVjdGlvbl8gPSBudWxsOwotICAgIHNldFJldHVybkNvZGUoRGlhbG9nLkNBTkNFTCk7Ci0gICAgc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBwcmVzc2VkLgotICAqIFNxdWlycmVscyBhd2F5IHRoZSBsaXN0IG9mIHplcm8gb3IgbW9yZSBzZWxlY3RlZAotICAqIDxjb2RlPklSZXNvdXJjZTwvY29kZT5zIHRvIGJlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UmVzdWx0fS4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkKLSAgewotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZmlsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgc2VsZWN0aW9uXyA9IG5ldyBJUmVzb3VyY2Vbc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCldOwotICAgICAgaW50IGkgPSAwOwotICAgICAgSXRlcmF0b3IgaXQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgICAgICAgIHNlbGVjdGlvbl9baSsrXSA9IChJUmVzb3VyY2Upb2JqZWN0OwotICAgICAgfQotICAgIH0KLSAgICBzZXRSZXR1cm5Db2RlKERpYWxvZy5PSyk7Ci0gICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gIH0KLQotICAvKioKLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGx9LgotICAqIEBwYXJhbSBzaGVsbCBUaGUgc2hlbGwuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQoZ2V0TWVzc2FnZSgiJURJQUxPR19USVRMRV9SRVNPVVJDRV9CUk9XU0VSIikpOwotICB9Ci0KLSAgLyoqIAotICAqIENyZWF0ZXMgdGhlIGRpYWxvZyBhcmVhLgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0gICogQHJldHVybiBUaGUgY29udHJvbCBhcmVhLgotICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGdkLndpZHRoSGludCA9IDQwMDsKLSAgICBnZC5oZWlnaHRIaW50ID0gMzAwOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBpZiAobXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXykKLSAgICB7Ci0gICAgICByZXNvdXJjZVRyZWVfID0gbmV3IFRyZWUoY29tcG9zaXRlLFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzb3VyY2VUcmVlXyA9IG5ldyBUcmVlKGNvbXBvc2l0ZSxTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgfQotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLSAgICBnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgcmVzb3VyY2VUcmVlXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICByZXNvdXJjZVRyZWVfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1JFU09VUkNFX1RSRUUiKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZXNvdXJjZVRyZWVfLCBJTkZPUE9QX1JFU09VUkNFX1RSRUUpOwotCi0gICAgZmlsZVZpZXdlcl8gPSBuZXcgVHJlZVZpZXdlcihyZXNvdXJjZVRyZWVfKTsKLSAgICBmaWxlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLSAgICBmaWxlVmlld2VyXy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSkpOwotICAgIGZpbGVWaWV3ZXJfLmFkZEZpbHRlcigKLSAgICAgIG5ldyBWaWV3ZXJGaWx0ZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudE9iamVjdCwgT2JqZWN0IG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIGlmICgob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKSAmJiAoKElSZXNvdXJjZSlvYmplY3QpLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnNfLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZmlsdGVyc19baV0uYWNjZXB0cyhvYmplY3QpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gICAgZmlsZVZpZXdlcl8uc2V0SW5wdXQocm9vdF8pOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtc2dJZCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZShtc2dJZCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0ZpbGVFeHRlbnNpb25GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0ZpbGVFeHRlbnNpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzNTVjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9GaWxlRXh0ZW5zaW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhIGNsYXNzIG9mIG9iamVjdHMgdGhhdCBmaWx0ZXIKLSogb3RoZXIgb2JqZWN0cyBmb3IgaW5jbHVzaW9uIG9yIGV4Y2x1c2lvbiBieSBzb21lIGNvbnN1bWVyLgotKi8KLXB1YmxpYyBjbGFzcyBGaWxlRXh0ZW5zaW9uRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlcgotewotICBwcml2YXRlIFN0cmluZ1tdIGV4dGVuc2lvbnNfOwotCi0gIHB1YmxpYyBGaWxlRXh0ZW5zaW9uRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMpCi0gIHsKLSAgICBleHRlbnNpb25zXyA9IChleHRlbnNpb25zICE9IG51bGwpID8gZXh0ZW5zaW9ucyA6IG5ldyBTdHJpbmdbMF07Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS5lZGl0b3IuY29tbW9uLkZpbGVFeHRlbnNpb25GaWx0ZXIiOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkuZWRpdG9yLmNvbW1vbi5GaWxlRXh0ZW5zaW9uRmlsdGVyIjsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LiBUaGlzIG1ldGhvZAotICAqIG11c3QgcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYge0BsaW5rICNzdGF0dXNPZn0KLSAgKiByZXR1cm5zIGFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IHdpdGggYSBzZXZlcml0eSBvZgotICAqIGxlc3MgdGhhbiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpCi0gICAgewotICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSlvYmplY3Q7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnNfLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCAmJiBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoZXh0ZW5zaW9uc19baV0pKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0lGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0lGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1ZGI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9JRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbjsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgYSBjbGFzcyBvZiBvYmplY3RzIHRoYXQgZmlsdGVyCi0qIG90aGVyIG9iamVjdHMgZm9yIGluY2x1c2lvbiBvciBleGNsdXNpb24gYnkgc29tZSBjb25zdW1lci4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWx0ZXIKLXsKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gICogYWNjZXB0cyB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4gVGhpcyBtZXRob2QKLSAgKiBtdXN0IHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHtAbGluayAjc3RhdHVzT2Z9Ci0gICogcmV0dXJucyBhbiA8Y29kZT5JU3RhdHVzPC9jb2RlPiB3aXRoIGEgc2V2ZXJpdHkgb2YKLSAgKiBsZXNzIHRoYW4gPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4uCi0gICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gICogYWNjZXB0cyB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyhPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL1VJVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL1VJVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1ZDIzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9VSVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFVJVXRpbHMgCi17Ci0gIFN0cmluZyAgICAgICBpbmZvUG9waWRfOwotICBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICAKLSAgcHVibGljIFVJVXRpbHMoIE1lc3NhZ2VVdGlscyBtc2dVdGlscywgU3RyaW5nIGluZm9Qb3BpZCApCi0gIHsKLSAgICBtc2dVdGlsc18gID0gbXNnVXRpbHM7Ci0gICAgaW5mb1BvcGlkXyA9IGluZm9Qb3BpZDsKLSAgfQotICAKLSAgcHVibGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbiggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAgIHJldHVybiBjcmVhdGVCdXR0b24oIFNXVC5SQURJTywgcGFyZW50LCBsYWJlbE5hbWUsIHRvb2x0aXAsIGluZm9wb3AgKTsKLSAgfQotICAKLSAgcHVibGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAgIHJldHVybiBjcmVhdGVCdXR0b24oIFNXVC5DSEVDSywgcGFyZW50LCBsYWJlbE5hbWUsIHRvb2x0aXAsIGluZm9wb3AgKTsKLSAgfQotICAKLSAgcHVibGljIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxOYW1lLCBTdHJpbmcgdG9vbHRpcCwgU3RyaW5nIGluZm9wb3AgKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUJ1dHRvbiggU1dULk5PTkUsIHBhcmVudCwgbGFiZWxOYW1lLCB0b29sdGlwLCBpbmZvcG9wICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCdXR0b24gY3JlYXRlQnV0dG9uKCBpbnQga2luZCwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKCBwYXJlbnQsIGtpbmQgKTsKLSAgICAKLSAgICB0b29sdGlwID0gdG9vbHRpcCA9PSBudWxsID8gbGFiZWxOYW1lIDogdG9vbHRpcDsKLSAgICBidXR0b24uc2V0VGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIGxhYmVsTmFtZSApICk7Ci0gICAgYnV0dG9uLnNldFRvb2xUaXBUZXh0KCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggdG9vbHRpcCApICk7Ci0gICAgCi0gICAgaWYoIGluZm9wb3AgIT0gbnVsbCApIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIGJ1dHRvbiwgaW5mb1BvcGlkXyArICIuIiArIGluZm9wb3AgKTsKLSAgICAKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0gIAotICBwdWJsaWMgQ29tYm8gY3JlYXRlQ29tYm8oIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbE5hbWUsIFN0cmluZyB0b29sdGlwLCBTdHJpbmcgaW5mb3BvcCwgaW50IHN0eWxlICkKLSAgeyAgICAKLSAgICB0b29sdGlwID0gdG9vbHRpcCA9PSBudWxsID8gbGFiZWxOYW1lIDogdG9vbHRpcDsKLSAgICAKLSAgICBpZiggbGFiZWxOYW1lICE9IG51bGwgKQotICAgIHsKLSAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5XUkFQKTsKLSAgICAgIGxhYmVsLnNldFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCBsYWJlbE5hbWUgKSApOwotICAgICAgbGFiZWwuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCB0b29sdGlwICkgKTsKLSAgICB9Ci0gICAgCi0gICAgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oIHBhcmVudCwgc3R5bGUgKTsKLSAgICBHcmlkRGF0YSBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgICAKLSAgICBjb21iby5zZXRMYXlvdXREYXRhKCBncmlkZGF0YSApOwotICAgIGNvbWJvLnNldFRvb2xUaXBUZXh0KCBtc2dVdGlsc18uZ2V0TWVzc2FnZSh0b29sdGlwKSk7Ci0gICAgCi0gICAgaWYoIGluZm9wb3AgIT0gbnVsbCApIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIGNvbWJvLCBpbmZvUG9waWRfICsgIi4iICsgaW5mb3BvcCApOwotICAgIAotICAgIHJldHVybiBjb21ibzsgICAgICAKLSAgfQotICAKLSAgcHVibGljIFRleHQgY3JlYXRlVGV4dCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wLCBpbnQgc3R5bGUgKQotICB7ICAgIAotICAgIHRvb2x0aXAgPSB0b29sdGlwID09IG51bGwgPyBsYWJlbE5hbWUgOiB0b29sdGlwOwotICAgIAotICAgIGlmKCBsYWJlbE5hbWUgIT0gbnVsbCApCi0gICAgewotICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULldSQVApOwotICAgICAgbGFiZWwuc2V0VGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIGxhYmVsTmFtZSApICk7Ci0gICAgICBsYWJlbC5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIHRvb2x0aXAgKSApOwotICAgIH0KLSAgICAKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dCggcGFyZW50LCBzdHlsZSApOwotICAgIEdyaWREYXRhIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgCi0gICAgdGV4dC5zZXRMYXlvdXREYXRhKCBncmlkZGF0YSApOwotICAgIHRleHQuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKHRvb2x0aXApKTsKLSAgICAKLSAgICBpZiggaW5mb3BvcCAhPSBudWxsICkgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggdGV4dCwgaW5mb1BvcGlkXyArICIuIiArIGluZm9wb3AgKTsKLSAgICAKLSAgICByZXR1cm4gdGV4dDsgICAgICAKLSAgfQotICAKLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoIENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW5zICkKLSAgewotICAgIHJldHVybiBjcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgY29sdW1ucywgLTEsIC0xICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKCBDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucywgaW50IG1hcmdpbkhlaWdodCwgaW50IG1hcmdpbldpZHRoICkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgCi0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ICAgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRsYXlvdXQubnVtQ29sdW1ucyAgID0gY29sdW1uczsKLSAgCi0gICAgaWYoIG1hcmdpbkhlaWdodCA+PSAwICkgZ3JpZGxheW91dC5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQ7Ci0gICAgaWYoIG1hcmdpbldpZHRoID49IDAgKSAgZ3JpZGxheW91dC5tYXJnaW5XaWR0aCAgPSBtYXJnaW5XaWR0aDsKLSAgICAKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCBncmlkbGF5b3V0ICk7Ci0gICAgR3JpZERhdGEgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggZ3JpZGRhdGEgKTsKLSAgICAKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIAotICB9Ci0gIHB1YmxpYyBHcm91cCBjcmVhdGVHcm91cCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAJcmV0dXJuIGNyZWF0ZUdyb3VwKCBwYXJlbnQsIGdyb3VwTmFtZSwgdG9vbHRpcCwgaW5mb3BvcCwgMSwgLTEsIC0xICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBHcm91cCBjcmVhdGVHcm91cCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wLCBpbnQgY29sdW1ucywgaW50IG1hcmdpbkhlaWdodCwgaW50IG1hcmdpbldpZHRoICkKLSAgewotICAgIEdyb3VwICAgICAgbmV3R3JvdXAgICAgPSBuZXcgR3JvdXAoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICBHcmlkRGF0YSAgIGdyaWRkYXRhICAgID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ICA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgCi0gICAgZ3JpZGxheW91dC5udW1Db2x1bW5zICA9IGNvbHVtbnM7Ci0gIAotICAgIGlmKCBtYXJnaW5IZWlnaHQgPj0gMCApIGdyaWRsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0OwotICAgIGlmKCBtYXJnaW5XaWR0aCA+PSAwICkgIGdyaWRsYXlvdXQubWFyZ2luV2lkdGggID0gbWFyZ2luV2lkdGg7Ci0gICAgICAgIAotICAgIHRvb2x0aXAgPSB0b29sdGlwID09IG51bGwgPyBncm91cE5hbWUgOiB0b29sdGlwOwotICAgIG5ld0dyb3VwLnNldExheW91dCggZ3JpZGxheW91dCApOwotICAgIG5ld0dyb3VwLnNldFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCBncm91cE5hbWUgKSApOwotICAgIG5ld0dyb3VwLnNldExheW91dERhdGEoIGdyaWRkYXRhICk7Ci0gICAgbmV3R3JvdXAuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCB0b29sdGlwICkpOwotICAgIAotICAgIGlmKCBpbmZvcG9wICE9IG51bGwgKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5ld0dyb3VwLCBpbmZvUG9waWRfICsgIi4iICsgaW5mb3BvcCk7Ci0gICAgCi0gICAgcmV0dXJuIG5ld0dyb3VwOwotICB9Ci0gIAotICBwdWJsaWMgVHJlZSBjcmVhdGVUcmVlKCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdG9vbHRpcCwgU3RyaW5nIGluZm9wb3AsIGludCBzdHlsZSApCi0gIHsKLSAgICAKLSAgICB0b29sdGlwID0gdG9vbHRpcCA9PSBudWxsID8gIiIgOiB0b29sdGlwOwotICAgIAotICAgIFRyZWUgdHJlZSA9IG5ldyBUcmVlKCBwYXJlbnQsIHN0eWxlICk7Ci0gICAgIAotICAgIHRyZWUuc2V0TGF5b3V0RGF0YSggY3JlYXRlRmlsbEFsbCgpICk7Ci0gICAgdHJlZS5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UodG9vbHRpcCkpOwotICAgIAotICAgIGlmKCBpbmZvcG9wICE9IG51bGwgKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCB0cmVlLCBpbmZvUG9waWRfICsgIi4iICsgaW5mb3BvcCApOwotICAgIAotICAgIHJldHVybiB0cmVlOyAgICAgIAotICAgIAotICB9Ci0gIAotICBwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0b29sdGlwLCBTdHJpbmcgaW5mb3BvcCwgaW50IHN0eWxlICkKLSAgewotICAgIAotICAgIHRvb2x0aXAgPSB0b29sdGlwID09IG51bGwgPyAiIiA6IHRvb2x0aXA7Ci0gICAgCi0gICAgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoIHBhcmVudCwgc3R5bGUgKTsKLSAgICAgCi0gICAgLy90YWJsZS5zZXRMYXlvdXREYXRhKCBjcmVhdGVGaWxsQWxsKCkgKTsKLSAgICB0YWJsZS5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UodG9vbHRpcCkpOwotICAgIAotICAgIGlmKCBpbmZvcG9wICE9IG51bGwgKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCB0YWJsZSwgaW5mb1BvcGlkXyArICIuIiArIGluZm9wb3AgKTsKLSAgICAKLSAgICByZXR1cm4gdGFibGU7ICAgICAgCi0gICAgCi0gIH0gIAotICAKLSAgcHVibGljIExhYmVsIGNyZWF0ZUhvcml6b250YWxTZXBhcmF0b3IoIENvbXBvc2l0ZSBwYXJlbnQsIGludCBzcGFjaW5nICkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMSwgc3BhY2luZywgLTEgKTsKLSAgICAgCi0JTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKCBjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCApOwotCQotCUdyaWREYXRhIGdyaWRkYXRhICA9IG5ldyBHcmlkRGF0YSggR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMICk7Ci0Jc2VwYXJhdG9yLnNldExheW91dERhdGEoIGdyaWRkYXRhICk7Ci0gICAKLQlyZXR1cm4gc2VwYXJhdG9yOwotICB9Ci0gIAotICBwdWJsaWMgR3JpZERhdGEgY3JlYXRlRmlsbEFsbCgpCi0gIHsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfAotCQkJICAgICAgICAgICAgICAgICAgICAgIEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCApOwotICAgIHJldHVybiBkYXRhOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2RpYWxvZy9EaWFsb2dVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9kaWFsb2cvRGlhbG9nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlYWYwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2RpYWxvZy9EaWFsb2dVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lclNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLQotCi0vKioKLSogQ29udGFpbnMgdXRpbGl0eSBtZXRob2RzIGZvciBsYXVuY2hpbmcgdmFyaW91cyBjb21tb24gZGlhbG9ncy4KLSovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGlhbG9nVXRpbHMKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIC8qKgotICAqIFJhaXNlcyBhIGRpYWxvZyBmb3IgYnJvd3NpbmcgY29udGFpbmVycy4KLSAgKiBAcGFyYW0gcGFyZW50U2hlbGwgVGhlIHBhcmVudCBzaGVsbCwgb3B0aW9uYWxseSBudWxsLgotICAqIEBwYXJhbSBpbml0aWFsUGF0aG5hbWUgVGhlIGluaXRpYWwgc2VsZWN0aW9uLgotICAqIEByZXR1cm4gVGhlIHNlbGVjdGVkIGNvbnRhaW5lciBvciBudWxsIGlmIHRoZSBkaWFsb2cKLSAgKiBpcyBjYW5jZWxsZWQsIG9yIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiwgb3IgdGhlIHNlbGVjdGlvbgotICAqIGlzIG5vdCBhIHByb2plY3Qgb3IgYSBmb2xkZXIuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUNvbnRhaW5lcnMgKCBTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGluaXRpYWxQYXRobmFtZSApCi0gIHsKLSAgICBTdHJpbmcgc2VsZWN0ZWRQYXRobmFtZSA9IG51bGw7Ci0gICAgSVBhdGggaW5pdGlhbFBhdGggPSBuZXcgUGF0aChpbml0aWFsUGF0aG5hbWUpOwotICAgIElSZXNvdXJjZSBpbml0aWFsUmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5maW5kTWVtYmVyKGluaXRpYWxQYXRoKTsKLSAgICBpZiAoaW5pdGlhbFJlc291cmNlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGluaXRpYWxQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpCi0gICAgICB7Ci0gICAgICAgIGluaXRpYWxSZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoaW5pdGlhbFBhdGguc2VnbWVudCgwKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbml0aWFsUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0gICAgICB7Ci0gICAgICAgIGluaXRpYWxSZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldEZvbGRlcihpbml0aWFsUGF0aCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaW5pdGlhbFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLSAgICAgIHsKLSAgICAgICAgaW5pdGlhbFJlc291cmNlID0gaW5pdGlhbFJlc291cmNlLmdldFBhcmVudCgpOwotICAgICAgfQotICAgIH0KLSAgICBDb250YWluZXJTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZyhwYXJlbnRTaGVsbCwoSUNvbnRhaW5lcilpbml0aWFsUmVzb3VyY2UsdHJ1ZSxudWxsKTsKLSAgICBkaWFsb2cub3BlbigpOwotICAgIE9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCA+IDApCi0gICAgewotICAgICAgaWYgKHJlc3VsdFswXSBpbnN0YW5jZW9mIElQYXRoKQotICAgICAgewotICAgICAgICBJUGF0aCBwYXRoID0gKElQYXRoKXJlc3VsdFswXTsKLSAgICAgICAgc2VsZWN0ZWRQYXRobmFtZSA9IHBhdGgudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNlbGVjdGVkUGF0aG5hbWU7Ci0gIH0KLQotICAvKioKLSAgKiBSYWlzZXMgYSBkaWFsb2cgZm9yIGJyb3dzaW5nIHJlc291cmNlcy4KLSAgKiBAcGFyYW0gcGFyZW50U2hlbGwgVGhlIHBhcmVudCBzaGVsbCwgb3B0aW9uYWxseSBudWxsLgotICAqIEBwYXJhbSB0b3BSZXNvdXJjZSBUaGUgcmVzb3VyY2UgdW5kZXIgd2hpY2ggdG8gYnJvd3NlLgotICAqIElmIG51bGwsIGFsbCByZXNvdXJjZXMgaW4gdGhlIHdvcmtzcGFjZSBhcmUgYnJvd3NlZC4KLSAgKiBAcGFyYW0gaW5pdGlhbFNlbGVjdGlvbiBUaGUgaW5pdGlhbCBzZWxlY3Rpb24sIG9yIG51bGwgZm9yIG5vbmUuCi0gICogSWYgdGhlIGluaXRpYWwgc2VsZWN0aW9uIGlzIG5vdCBudWxsIGFuZCBleGlzdHMgaW4gdGhlIHNldCBvZgotICAqIHJlc291cmNlcyBmb3VuZCBieSB0aGUgYnJvd3NlciwgdGhhdCByZXNvdXJjZSBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LgotICAqIEBwYXJhbSBmaWx0ZXIgVGhlIHJlc291cmNlIGZpbHRlciBvYmplY3QuCi0gICogQHJldHVybiBUaGUgc2VsZWN0ZWQgcmVzb3VyY2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGJyb3dzZVJlc291cmNlcyAoIFNoZWxsIHBhcmVudFNoZWxsLCBJUmVzb3VyY2UgdG9wUmVzb3VyY2UsIElSZXNvdXJjZSBpbml0aWFsU2VsZWN0aW9uLCBGaWx0ZXIgZmlsdGVyKQotICB7Ci0gICAgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgcmRzID0gbmV3IFJlc291cmNlU2VsZWN0aW9uRGlhbG9nKHBhcmVudFNoZWxsLHRvcFJlc291cmNlLGluaXRpYWxTZWxlY3Rpb24sZmlsdGVyKTsKLSAgICByZHMuc2V0TXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkKGZhbHNlKTsKLSAgICBpZiAocmRzLm9wZW4oKSA9PSBEaWFsb2cuT0spCi0gICAgewotICAgICAgSVJlc291cmNlW10gcmVzb3VyY2VzID0gcmRzLmdldFJlc3VsdCgpOwotICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsICYmIHJlc291cmNlcy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VzWzBdOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIDxiPkltcGxlbWVudGF0aW9uIHJlbWFpbnMgVEJELjwvYj48YnI+Ci0gICogUmFpc2VzIGEgZGlhbG9nIGZvciBicm93c2luZyBjbGFzc2VzIG9uIGEgcHJvamVjdCdzIGNsYXNzIHBhdGguCi0gICogQHBhcmFtIHBhcmVudFNoZWxsIFRoZSBwYXJlbnQgc2hlbGwsIG9wdGlvbmFsbHkgbnVsbC4KLSAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdC4KLSAgKiBAcmV0dXJuIFRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgamF2YSBjbGFzcy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQ2xhc3NlcyAoIFNoZWxsIHBhcmVudFNoZWxsLCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgewotICAgIHJldHVybiBicm93c2VDbGFzc2VzKHBhcmVudFNoZWxsLCBwcm9qZWN0LCAoSVJ1bm5hYmxlQ29udGV4dCludWxsKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUNsYXNzZXMgKCBTaGVsbCBwYXJlbnRTaGVsbCwgSVByb2plY3QgcHJvamVjdCwgSVdpemFyZENvbnRhaW5lciBjb250YWluZXIpCi0gIHsKLSAgICByZXR1cm4gYnJvd3NlQ2xhc3NlcyhwYXJlbnRTaGVsbCwgcHJvamVjdCwgKElSdW5uYWJsZUNvbnRleHQpY29udGFpbmVyKTsKLSAgfQotCi0gIC8qKgotICAqIFJhaXNlcyBhIGRpYWxvZyBmb3IgYnJvd3NpbmcgY2xhc3NlcyBvbiBhIHByb2plY3QncyBjbGFzcyBwYXRoLgotICAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsLCBvcHRpb25hbGx5IG51bGwuCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QuCi0gICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBsYXVuY2hpbmcgd2l6YXJkLgotICAqIEByZXR1cm4gVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZWxlY3RlZCBqYXZhIGNsYXNzLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VDbGFzc2VzICggU2hlbGwgcGFyZW50U2hlbGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUnVubmFibGVDb250ZXh0IGN0eHQpIAotICB7Ci0gICAgcmV0dXJuIGJyb3dzZUNsYXNzZXMocGFyZW50U2hlbGwsIG5ldyBJUmVzb3VyY2VbXSB7cHJvamVjdH0sIGN0eHQpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VDbGFzc2VzKFNoZWxsIHBhcmVudFNoZWxsLCBJUmVzb3VyY2VbXSByZXNvdXJjZXMsIElSdW5uYWJsZUNvbnRleHQgY3R4dCkKLSAgewotICAgIElUeXBlIGl0eXBlID0gYnJvd3NlQ2xhc3Nlc0FzSVR5cGUocGFyZW50U2hlbGwsIHJlc291cmNlcywgY3R4dCk7Ci0gICAgaWYgKGl0eXBlICE9IG51bGwpCi0gICAgICByZXR1cm4gaXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgSVR5cGUgYnJvd3NlQ2xhc3Nlc0FzSVR5cGUoU2hlbGwgcGFyZW50U2hlbGwsIElSZXNvdXJjZVtdIHJlc291cmNlcywgSVJ1bm5hYmxlQ29udGV4dCBjdHh0KQotICB7Ci0JVmVjdG9yIGphdmFFbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykKLQl7Ci0JICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2VzW2ldKTsKLQkgIGlmIChqYXZhRWxlbWVudCAhPSBudWxsKQotCSAgICBqYXZhRWxlbWVudHMuYWRkKGphdmFFbGVtZW50KTsKLQl9Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSAoSUphdmFFbGVtZW50W10pamF2YUVsZW1lbnRzLnRvQXJyYXkobmV3IElKYXZhRWxlbWVudFswXSk7Ci0JCi0gICAgSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotICAgIHNjb3BlLnNldEluY2x1ZGVzQ2xhc3NwYXRocyh0cnVlKTsKLSAgICBzY29wZS5zZXRJbmNsdWRlc0JpbmFyaWVzKHRydWUpOwotCi0gICAgLy9DcmVhdGluZyBhbmQgb3BlbmluZyBhIFR5cGVTZWxlY3Rpb25EaWFsb2cKLSAgICB0cnkKLQl7Ci0gICAgICBTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2cocGFyZW50U2hlbGwsIGN0eHQsIHNjb3BlLCBJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywgZmFsc2UpOwotICAgICAgZGlhbG9nLnNldFRpdGxlKFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlRElBTE9HX1RJVExFX0NMQVNTX0JST1dTRSIpKTsKLSAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlRElBTE9HX1RJVExFX0NMQVNTX0JST1dTRSIpKTsgICAgCi0gICAgICBkaWFsb2cub3BlbigpOwotCi0gICAgICAvL0dldHRpbmcgdGhlIHJlc3VsdCBhbmQgcmV0dXJuaW5nIGl0Ci0gICAgICBPYmplY3RbXSByZXN1bHRzID0gZGlhbG9nLmdldFJlc3VsdCgpOwotICAgICAgaWYgKHJlc3VsdHMgIT0gbnVsbCAmJiByZXN1bHRzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmIChyZXN1bHRzWzBdIGluc3RhbmNlb2YgSVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKElUeXBlKXJlc3VsdHNbMF07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpCi0JewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFJhaXNlcyBhIGRpYWxvZyBmb3IgYnJvd3NpbmcgaW50ZXJmYWNlcyBvbiBhIHByb2plY3QncyBjbGFzcyBwYXRoLgotICAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsLCBvcHRpb25hbGx5IG51bGwuCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QuCi0gICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBsYXVuY2hpbmcgd2l6YXJkLgotICAqIEByZXR1cm4gVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZWxlY3RlZCBqYXZhIGludGVyZmFjZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlSW50ZXJmYWNlcyggU2hlbGwgcGFyZW50U2hlbGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdpemFyZENvbnRhaW5lciBjb250YWluZXIpIAotICAJCQkJCQkJCQkgICAgCi0gIHsKLSAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IG51bGw7Ci0KLSAgICAvL0xpbWl0aW5nIHNlYXJjaCBzY29wZSB0byB0aGUgcHJvamVjdAotICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbMV07Ci0gICAgcmVzb3VyY2VzWzBdPXByb2plY3Q7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50WzFdOwotCWVsZW1lbnRzWzBdID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlc1swXSk7Ci0gICAgSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotICAgIHNjb3BlLnNldEluY2x1ZGVzQ2xhc3NwYXRocyh0cnVlKTsKLSAgICBzY29wZS5zZXRJbmNsdWRlc0JpbmFyaWVzKHRydWUpOwotCi0gICAgLy9DcmVhdGluZyBhbmQgb3BlbmluZyBhIFR5cGVTZWxlY3Rpb25EaWFsb2cKLSAgICB0cnkKLQl7Ci0gICAgCVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZyhwYXJlbnRTaGVsbCwgY29udGFpbmVyLCBzY29wZSwgSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX1RZUEVTLCBmYWxzZSk7Ci0gICAgCWRpYWxvZy5zZXRUaXRsZShXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJURJQUxPR19USVRMRV9JTlRFUkZBQ0VfQlJPV1NFIikpOwotICAgIAlkaWFsb2cuc2V0TWVzc2FnZShXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJURJQUxPR19USVRMRV9JTlRFUkZBQ0VfQlJPV1NFIikpOyAgICAKLSAgICAJZGlhbG9nLm9wZW4oKTsKLQotICAgIAkvL0dldHRpbmcgdGhlIHJlc3VsdCBhbmQgcmV0dXJuaW5nIGl0Ci0gICAgCU9iamVjdFtdIHJlc3VsdHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgCWlmIChyZXN1bHRzICE9IG51bGwgJiYgcmVzdWx0cy5sZW5ndGggPiAwKQotICAgIAl7Ci0gICAgCQlpZiAocmVzdWx0c1swXSBpbnN0YW5jZW9mIElUeXBlKQotICAgIAkJewotICAgIAkJCUlUeXBlIHJlc3VsdEludGVyZmFjZSA9IChJVHlwZSlyZXN1bHRzWzBdOwotICAgIAkJCWludGVyZmFjZU5hbWUgPSByZXN1bHRJbnRlcmZhY2UuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpCi0JewotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaW50ZXJmYWNlTmFtZTsKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvZGlhbG9nL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2RpYWxvZy9SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzQ3OGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvZGlhbG9nL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5kaWFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkFueUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLQotLyoqCi0qIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBkaWFsb2cgZm9yIGJyb3dzaW5nIHdvcmtzcGFjZSByZXNvdXJjZXMuCi0qIFNlZSBhbHNvIHtAbGluayBEaWFsb2dVdGlscyNicm93c2VSZXNvdXJjZXN9LgotKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIExpc3RlbmVyCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8vCi0gIC8vIERpYWxvZyBjb250cm9scy4KLSAgLy8KLSAgcHJpdmF0ZSBMYWJlbCBmaWx0ZXJMYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gZmlsdGVyQ29tYm9fOwotICAvKkNPTlRFWFRfSUQgRFJFUzAwMDEgZm9yIHRoZSBSZXNvdXJjZSBUeXBlIGNvbWJvIGJveCBvZiB0aGUgUmVzb3VyY2UgU2VsZWN0aW9uIERpYWxvZyovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUE9QX0RSRVNfQ09NQk9fUkVTT1VSQ0VfVFlQRSA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuRFJFUzAwMDEiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFRJUF9EUkVTX0NPTUJPX1JFU09VUkNFX1RZUEUgPSAiJVRPT0xUSVBfRFJFU19DT01CT19SRVNPVVJDRV9UWVBFIjsKLSAgLy8KLSAgcHJpdmF0ZSBUcmVlIHJlc291cmNlVHJlZV87Ci0gIHByaXZhdGUgVHJlZVZpZXdlciBmaWxlVmlld2VyXzsKLSAgLypDT05URVhUX0lEIERSRVMwMDAyIGZvciB0aGUgUmVzb3VyY2UgdHJlZSBvZiB0aGUgUmVzb3VyY2UgU2VsZWN0aW9uIERpYWxvZyovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUE9QX0RSRVNfVFJFRV9SRVNPVVJDRSA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuRFJFUzAwMDIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFRJUF9EUkVTX1RSRUVfUkVTT1VSQ0UgPSAiJVRPT0xUSVBfRFJFU19UUkVFX1JFU09VUkNFIjsKLQotICAvLwotICAvLyBFc3NlbnRpYWwgZ29vZGllcy4KLSAgLy8KLSAgcHJpdmF0ZSBTaGVsbCBzaGVsbF87Ci0gIHByaXZhdGUgSVJlc291cmNlIHJvb3RfOwotICBwcml2YXRlIElSZXNvdXJjZSBpbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBGaWx0ZXJbXSBmaWx0ZXJzXzsKLSAgcHJpdmF0ZSBGaWx0ZXIgY3VycmVudEZpbHRlcl87Ci0gIHByaXZhdGUgSVJlc291cmNlW10gc2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF87Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZzwvY29kZT4KLSAgKiB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cGFyZW50IFNoZWxsPC9jb2RlPi4KLSAgKiBUaGUgZGlhbG9nIHJlbmRlcnMgYWxsIHJlc291cmNlcyBpbmNsdWRpbmcgYW5kCi0gICogdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnJvb3QgSVJlc291cmNlPC9jb2RlPi4KLSAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQge0BsaW5rIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsfSwKLSAgKiBvciBudWxsIHRvIGNyZWF0ZSBhIHRvcC1sZXZlbCBzaGVsbC4KLSAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlfSwKLSAgKiBvciBudWxsIHRvIGJlZ2luIHdpdGggdGhlIHdvcmtzcGFjZSByb290LgotICAqIEBwYXJhbSBpbml0aWFsU2VsZWN0aW9uIFRoZSBpbml0aWFsbHkgc2VsZWN0ZWQgb2JqZWN0IG9yIG51bGwgaWYgbm9uZS4KLSAgKi8KLSAgcHVibGljIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nICggU2hlbGwgcGFyZW50LCBJUmVzb3VyY2Ugcm9vdCwgSVJlc291cmNlIGluaXRpYWxTZWxlY3Rpb24gKQotICB7Ci0gICAgdGhpcyhwYXJlbnQscm9vdCxpbml0aWFsU2VsZWN0aW9uLG5ldyBGaWx0ZXJbXSB7bmV3IEFueUZpbHRlcigpfSk7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPlJlc291cmNlU2VsZWN0aW9uRGlhbG9nPC9jb2RlPgotICAqIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5wYXJlbnQgU2hlbGw8L2NvZGU+LgotICAqIFRoZSBkaWFsb2cgcmVuZGVycyBhbGwgcmVzb3VyY2VzIGluY2x1ZGluZyBhbmQKLSAgKiB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cm9vdCBJUmVzb3VyY2U8L2NvZGU+IHRoYXQKLSAgKiBhcmUgYWNjZXB0ZWQgYnkgdGhlIGdpdmVuIGZpbHRlci4KLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRmlsdGVyI2FjY2VwdHN9LgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGx9LAotICAqIG9yIG51bGwgdG8gY3JlYXRlIGEgdG9wLWxldmVsIHNoZWxsLgotICAqIEBwYXJhbSByb290IFRoZSByb290IHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2V9LAotICAqIG9yIG51bGwgdG8gYmVnaW4gd2l0aCB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24gVGhlIGluaXRpYWxseSBzZWxlY3RlZCBvYmplY3Qgb3IgbnVsbCBpZiBub25lLgotICAqIEBwYXJhbSBmaWx0ZXIgVGhlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkZpbHRlcn0sCi0gICogb3IgbnVsbCB0byBkZWZhdWx0IHRvIGFsbCByZXNvdXJjZXMgdW5kZXIgdGhlIDxjb2RlPnJvb3Q8L2NvZGU+LgotICAqLwotICBwdWJsaWMgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgKCBTaGVsbCBwYXJlbnQsIElSZXNvdXJjZSByb290LCBJUmVzb3VyY2UgaW5pdGlhbFNlbGVjdGlvbiwgRmlsdGVyIGZpbHRlciApCi0gIHsKLSAgICB0aGlzKHBhcmVudCxyb290LGluaXRpYWxTZWxlY3Rpb24sbmV3IEZpbHRlcltdIHtmaWx0ZXJ9KTsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+UmVzb3VyY2VTZWxlY3Rpb25EaWFsb2c8L2NvZGU+Ci0gICogdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnBhcmVudCBTaGVsbDwvY29kZT4uCi0gICogVGhlIGRpYWxvZyByZW5kZXJzIGFsbCByZXNvdXJjZXMgaW5jbHVkaW5nIGFuZAotICAqIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5yb290IElSZXNvdXJjZTwvY29kZT4gdGhhdAotICAqIGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVycy4KLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRmlsdGVyI2FjY2VwdHN9LgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGx9LgotICAqIG9yIG51bGwgdG8gY3JlYXRlIGEgdG9wLWxldmVsIHNoZWxsLgotICAqIEBwYXJhbSByb290IFRoZSByb290IHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2V9LAotICAqIG9yIG51bGwgdG8gYmVnaW4gd2l0aCB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24gVGhlIGluaXRpYWxseSBzZWxlY3RlZCBvYmplY3Qgb3IgbnVsbCBpZiBub25lLgotICAqIEBwYXJhbSBmaWx0ZXJzIEFuIGFycmF5IG9mIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkZpbHRlcn0KLSAgKiBvYmplY3RzLgotICAqIElmIHRoZSBhcnJheSBpcyBudWxsIG9yIG9mIGxlbmd0aCB6ZXJvLCB0aGVuIGFsbCByZXNvdXJjZXMgYXJlIGFjY2VwdGVkCi0gICogKGllLiBlcXVpdmFsZW50IHRvIDxjb2RlPlJlc291cmNlU2VsZWN0aW9uRGlhbG9nKHBhcmVudCxyb290KTwvY29kZT4uCi0gICogSWYgdGhlIGFycmF5IGlzIG9mIGxlbmd0aCBvbmUsIHRoZW4gdGhlIGRpYWxvZyB3aWxsIGNvbnNpc3Qgb2YgYSBzaW5nbGUKLSAgKiBjb250cm9sIHNob3dpbmcgYSBsaXN0IG9mIGFsbCBmaWx0ZXJlZCByZXNvdXJjZXMuCi0gICogSWYgdGhlIGFycmF5IGlzIG9mIGxlbmd0aCBncmVhdGVyIHRoYW4gb25lLCB0aGVuIHRoZSBkaWFsb2cgd2lsbAotICAqIGNvbnNpc3Qgb2YgYSBjb21ibyBib3ggY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGZpbHRlcnMgYW5kIHdpdGggdGhlCi0gICogZmlyc3QgZmlsdGVyIChpZS4gPGNvZGU+ZmlsdGVyc1swXTwvY29kZT4pIHNlbGVjdGVkIGJ5IGRlZmF1bHQsIGZvbGxvd2VkCi0gICogYnkgYSBjb250cm9sIHNob3dpbmcgYSBsaXN0IG9mIGFsbCByZXNvdXJjZXMgZmlsdGVyZWQgYnkgdGhlIHNlbGVjdGVkIGZpbHRlci4gCi0gICovCi0gIHB1YmxpYyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyAoIFNoZWxsIHBhcmVudCwgSVJlc291cmNlIHJvb3QsIElSZXNvdXJjZSBpbml0aWFsU2VsZWN0aW9uLCBGaWx0ZXJbXSBmaWx0ZXJzICkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgc2hlbGxfID0gcGFyZW50OwotICAgIHJvb3RfID0gcm9vdCA9PSBudWxsID8gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkgOiByb290OwotICAgIGluaXRpYWxTZWxlY3Rpb25fID0gaW5pdGlhbFNlbGVjdGlvbjsKLSAgICBmaWx0ZXJzXyA9IChmaWx0ZXJzID09IG51bGwgfHwgZmlsdGVycy5sZW5ndGggPT0gMCkgPyBuZXcgRmlsdGVyW10ge25ldyBBbnlGaWx0ZXIoKX0gOiBmaWx0ZXJzOwotICAgIGN1cnJlbnRGaWx0ZXJfID0gZmlsdGVyc19bMF07Ci0gICAgbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXyA9IGZhbHNlOwotICAgIHNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULlJFU0laRSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0gIH0KLQotICAvKioKLSAgKiBFbmFibGVzIG9yIGRpc2FibGVzIG11bHRpcGxlIHNlbGVjdGlvbiBpbiB0aGUgdHJlZSB2aWV3LgotICAqIE11bHRpcGxlIHNlbGVjdGlvbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotICAqIEBwYXJhbSBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQgVHJ1ZSB0byBlbmFibGVkIG9yIGZhbHNlIHRvIGRpc2FibGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldE11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZCAoIGJvb2xlYW4gbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkICkKLSAgewotICAgIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF8gPSBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQ7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb25zIG1hZGUgaW4gdGhlIGRpYWxvZyBpZiBPSyB3YXMgcHJlc3NlZCwKLSAgKiBvciBudWxsIGlmIENhbmNlbCB3YXMgcHJlc3NlZC4gUmV0dXJucyBudWxsIGlmIHRoZSBkaWFsb2cKLSAgKiBoYXMgbmV2ZXIgYmVlbiBvcGVuZWQuCi0gICogQHJldHVybiBBbiBhcnJheSBvZiBzZWxlY3RlZCByZXNvdXJjZXMsIHBvc3NpYmx5IGVtcHR5LCBwb3NzaWJseSBudWxsLgotICAqLwotICBwdWJsaWMgSVJlc291cmNlW10gZ2V0UmVzdWx0ICgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uXzsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBDYW5jZWwgYnV0dG9uIGlzIHByZXNzZWQuCi0gICogSW5zdXJlcyB0aGF0IHtAbGluayAjZ2V0UmVzdWx0fSB3aWxsIHJldHVybiBudWxsLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkICgpCi0gIHsKLSAgICBzZWxlY3Rpb25fID0gbnVsbDsKLSAgICBzZXRSZXR1cm5Db2RlKERpYWxvZy5DQU5DRUwpOwotICAgIHN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgcHJlc3NlZC4KLSAgKiBTcXVpcnJlbHMgYXdheSB0aGUgbGlzdCBvZiB6ZXJvIG9yIG1vcmUgc2VsZWN0ZWQKLSAgKiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+cyB0byBiZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFJlc3VsdH0uCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCAoKQotICB7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBmaWxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBzZWxlY3Rpb25fID0gbmV3IElSZXNvdXJjZVtzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKV07Ci0gICAgICBpbnQgaT0wOwotICAgICAgSXRlcmF0b3IgaXRlciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgICAgICB7Ci0gICAgICAgICAgc2VsZWN0aW9uX1tpKytdID0gKElSZXNvdXJjZSlvYmplY3Q7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgc2V0UmV0dXJuQ29kZShEaWFsb2cuT0spOwotICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICB9Ci0KLSAgLyoqCi0gICogU2VlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsfS4KLSAgKiBAcGFyYW0gc2hlbGwgVGhlIHNoZWxsLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbCAoIFNoZWxsIHNoZWxsICkKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICBzaGVsbC5zZXRUZXh0KFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlRElBTE9HX1RJVExFX1JFU09VUkNFX0JST1dTRSIpKTsKLSAgfQotCi0gIC8qKiAKLSAgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYXJlYS4KLSAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlLgotICAqIEByZXR1cm4gVGhlIGNvbnRyb2wgYXJlYS4KLSAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYSAoIENvbXBvc2l0ZSBwYXJlbnQgKQotICB7Ci0gICAgR3JpZExheW91dCBnbDsKLSAgICBHcmlkRGF0YSBnZDsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gNDAwOwotICAgIGdkLmhlaWdodEhpbnQgPSAzMDA7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIGlmIChmaWx0ZXJzXy5sZW5ndGggPiAxKQotICAgIHsKLSAgICAgIENvbXBvc2l0ZSBmID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsU1dULk5PTkUpOwotICAgICAgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgICAgZi5zZXRMYXlvdXQoZ2wpOwotICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICAgIGYuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAgIGZpbHRlckxhYmVsXyA9IG5ldyBMYWJlbChmLFNXVC5XUkFQKTsKLSAgICAgIGZpbHRlckxhYmVsXy5zZXRUZXh0KFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfUkVTT1VSQ0VfRklMVEVSIikpOwotICAgICAgZmlsdGVyTGFiZWxfLnNldFRvb2xUaXBUZXh0KFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKFRPT0xUSVBfRFJFU19DT01CT19SRVNPVVJDRV9UWVBFKSk7Ci0KLSAgICAgIGZpbHRlckNvbWJvXyA9IG5ldyBDb21ibyhmLFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgICBmaWx0ZXJDb21ib18uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICBmaWx0ZXJDb21ib18uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbix0aGlzKTsKLSAgICAgIGZpbHRlckNvbWJvXy5zZXRUb29sVGlwVGV4dChXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZShUT09MVElQX0RSRVNfQ09NQk9fUkVTT1VSQ0VfVFlQRSkpOwotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmaWx0ZXJDb21ib18sSU5GT1BPUF9EUkVTX0NPTUJPX1JFU09VUkNFX1RZUEUpOwotICAgIH0KLQotICAgIGlmIChtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWRfKQotICAgIHsKLSAgICAgIHJlc291cmNlVHJlZV8gPSBuZXcgVHJlZShjb21wb3NpdGUsU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXNvdXJjZVRyZWVfID0gbmV3IFRyZWUoY29tcG9zaXRlLFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLSAgICB9Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICByZXNvdXJjZVRyZWVfLnNldExheW91dERhdGEoZ2QpOwotLy8gIHJlc291cmNlVHJlZV8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbix0aGlzKTsKLSAgICByZXNvdXJjZVRyZWVfLnNldFRvb2xUaXBUZXh0KFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKFRPT0xUSVBfRFJFU19UUkVFX1JFU09VUkNFKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZXNvdXJjZVRyZWVfLElORk9QT1BfRFJFU19UUkVFX1JFU09VUkNFKTsKLQotICAgIGZpbGVWaWV3ZXJfID0gbmV3IFRyZWVWaWV3ZXIocmVzb3VyY2VUcmVlXyk7Ci0gICAgZmlsZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgZmlsZVZpZXdlcl8uc2V0TGFiZWxQcm92aWRlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIoCi0JCQkJICAgICAgICBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCAKLQkJCQkgICAgICAgIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpKSk7Ci0gICAgZmlsZVZpZXdlcl8uYWRkRmlsdGVyKAotICAgICAgbmV3IFZpZXdlckZpbHRlciAoKQotICAgICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QgKCBWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50T2JqZWN0LCBPYmplY3Qgb2JqZWN0ICkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybgotICAgICAgICAgICgKLSAgICAgICAgICAgICgob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKSAmJiAoKElSZXNvdXJjZSlvYmplY3QpLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLSAgICAgICAgICAgIHx8IChSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy50aGlzLmN1cnJlbnRGaWx0ZXJfLmFjY2VwdHMob2JqZWN0KSkKLSAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgICBmaWxlVmlld2VyXy5zZXRJbnB1dChyb290Xyk7Ci0gICAgZmlsZVZpZXdlcl8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotICAgICAgbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCAoIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCApCi0gICAgICAgIHsKLS8vICAgICAgICBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy50aGlzLnZhbGlkYXRlUGFnZVRvU3RhdHVzKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uXyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZpbGVWaWV3ZXJfLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy50aGlzLmluaXRpYWxTZWxlY3Rpb25fKSx0cnVlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYW4gZXZlbnQgb2NjdXJzIG9uIHRoZSBwYWdlLgotICAqIEhhbmRsZXMgdGhlIGV2ZW50IGFuZCByZXZhbGlkYXRlcyB0aGUgcGFnZS4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgb2NjdXJlZC4KLSAgKi8KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKCBFdmVudCBldmVudCApCi0gIHsKLS8vICB2YWxpZGF0ZVBhZ2VUb1N0YXR1cygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3BsdWdpbi9XZWJTZXJ2aWNlVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcGx1Z2luL1dlYlNlcnZpY2VVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTkxNzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcGx1Z2luL1dlYlNlcnZpY2VVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgcGx1Z2luLgotKiA8cD4KLSogVGhpcyBwbHVnaW4gY29udGFpbnMgdGhlIGdyYXBoaWMgdXNlciBpbnRlcmZhY2UgdG8gdGhlCi0qIFdlYiBTZXJ2aWNlcyBydW50aW1lIGZvdW5kIGluIG9yZy5lY2xpcHNlLmpzdC53cy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotCS8vIENvcHlyaWdodAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9Ci0JCSIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLnVpIjsKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VVSVBsdWdpbiBpbnN0YW5jZV87Ci0KLSAgcHJpdmF0ZSBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgYWN0aW9uRGlhbG9nc0NvbnRleHRfOwotICBwcml2YXRlIExvZyBsb2dfOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBydW50aW1lIHBsdWdpbiBvYmplY3QgZm9yIHRoaXMgcGx1Z2luLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VVSVBsdWdpbigpIHsKLQlzdXBlcigpOwotCWluc3RhbmNlXyA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAqIChXZWJTZXJ2aWNlVUlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5qc3Qud3MudWkiKTsKLSAgKiBAcmV0dXJuIFRoZSBXZWJTZXJ2aWNlVUlQbHVnaW4gc2luZ2xldG9uLgotICAqLwotICBzdGF0aWMgcHVibGljIFdlYlNlcnZpY2VVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLQotICBwdWJsaWMgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGdldEFjdGlvbkRpYWxvZ3NDb250ZXh0KCkgCi0gIAl7Ci0gIAkgIGlmIChhY3Rpb25EaWFsb2dzQ29udGV4dF8gPT0gbnVsbCkKLSAgCSAgCXsKLSAgCSAgCQlhY3Rpb25EaWFsb2dzQ29udGV4dF8gPSBuZXcgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0KCk7Ci0gIAkgIAkJYWN0aW9uRGlhbG9nc0NvbnRleHRfLmxvYWQoKTsKLSAgCSAgCX0KLSAgCSAgcmV0dXJuIGFjdGlvbkRpYWxvZ3NDb250ZXh0XzsKLSAgCX0KLQkJCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gICogdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0gICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLSAgKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotICAqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLSAgKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotICAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgCi0JewotCSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLnVpLnBsdWdpbiIsIGluc3RhbmNlXyApOwotCSAgICAKLQkgICAgaWYoIGtleS5zdGFydHNXaXRoKCIlIikpCi0JICAgIHsKLQkgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKCAxLCBrZXkubGVuZ3RoKCkgKTsKLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIG1zZ1V0aWxzLmdldE1lc3NhZ2Uoa2V5KTsKLSAgICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLSAgKiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotICAqIGFyZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoCi0gICogYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IGZvcgotICAqIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLSAgKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotICAqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLSAgKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotICAqIEBwYXJhbSBhcmdzIFRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZQotICAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBtZXNzYWdlIGluIHBsdWdpbi5wcm9wZXJ0aWVzIGFuZAotICAqIGJ5IHRoZSBydWxlcyBvZiBjbGFzcyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLSAgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSwgYXJncyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCByZXNvdXJjZQotICAqIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbi4KLSAgKiBAcmV0dXJuIEFuIGltYWdlIGRlc2NyaXB0b3IsIHBvc3NpYmx5IG51bGwuCi0gICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGluc3RhbmNlXy5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIGltYWdlVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBuYW1lKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpblN0YXRlTG9jYXRpb24oKSB7Ci0gICAgcmV0dXJuIFBsYXRmb3JtLmdldFBsdWdpblN0YXRlTG9jYXRpb24odGhpcykudG9PU1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIikpLmdldEZpbGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMmJhOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkXzsKLQlwdWJsaWMgdm9pZCBzZXRJZCAoU3RyaW5nIGlkKSB7Ci0JCWlkXyA9IGlkOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgIAlyZXR1cm4gaWRfOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIG5hbWVfOwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJbmFtZV8gPSBuYW1lOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgCXJldHVybiBuYW1lXzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBpbmZvcG9wXzsKLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcG9wIChTdHJpbmcgaW5mb3BvcCkgewotICAgIAlpbmZvcG9wXyA9IGluZm9wb3A7Ci0gICAgCX0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEluZm9wb3AgKCkgewotICAgIAlyZXR1cm4gaW5mb3BvcF87Ci0gICAgCX0KLQotCXByaXZhdGUgU3RyaW5nIHRvb2x0aXBfOwotICAgIHB1YmxpYyB2b2lkIHNldFRvb2x0aXAgKFN0cmluZyB0b29sdGlwKSB7Ci0gICAgCXRvb2x0aXBfPSB0b29sdGlwOwotICAgIAl9Ci0gICAgcHVibGljIFN0cmluZyBnZXRUb29sdGlwICgpIHsKLSAgICAJcmV0dXJuIHRvb2x0aXBfOwotICAgIAl9Ci0KLSB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmEzYTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5Ci17Ci0gIHByaXZhdGUgc3RhdGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgSGFzaHRhYmxlIHR5cGVzQnlOYW1lXzsKLQotICAvLwotICAvLyBMb2FkcyBXZWJTZXJ2aWNlVHlwZSBvYmplY3RzIGludG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gVGhpcyBpcyBkb25lIGJ5IHF1ZXJ5aW5nIHRoZSBwbHVnaW4gcmVnaXN0cnkgZm9yIGFsbCBleHRlbnNpb25zCi0gIC8vIGhhbmdpbmcgb24gdGhlIHdlYlNlcnZpY2VUeXBlIGV4dGVuc2lvbiBwb2ludC4gRXh0ZW5zaW9ucwotICAvLyBtdXN0IGltcGxlbWVudCB0aGUgb3JnLmVjbGlwc2UuanN0LndzLnVpLndpemFyZC5XZWJTZXJ2aWNlVHlwZQotICAvLyBpbnRlcmZhY2UuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkRGlhbG9nc1ByZWZlcmVuY2VzICgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MudWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSIpOwotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjb25maWcubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBjb25maWdbaWR4XTsKLSAgICAgIHRyeSAKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlID0gZWxlbS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICBpZiAoYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgaW5zdGFuY2VvZiBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBkaWFsb2cgPSAoQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUpIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlOwotICAgICAgICAgIGRpYWxvZy5zZXRJZCgoU3RyaW5nKWVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLSAgICAgICAgICBkaWFsb2cuc2V0TmFtZSgoU3RyaW5nKWVsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgICAgICAgIGRpYWxvZy5zZXRJbmZvcG9wKChTdHJpbmcpZWxlbS5nZXRBdHRyaWJ1dGUoImluZm9wb3AiKSk7Ci0gICAgICAgICAgZGlhbG9nLnNldFRvb2x0aXAoKFN0cmluZyllbGVtLmdldEF0dHJpYnV0ZSgidG9vbHRpcCIpKTsKLSAgICAgICAgICBhZGQoZGlhbG9nKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vCi0gIC8vIExvYWRzIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIG9iamVjdHMgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBTZWUgbWV0aG9kIGdldEluc3RhbmNlKCkuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkICgpCi0gIHsKLSAgICB0eXBlc0J5TmFtZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgbG9hZERpYWxvZ3NQcmVmZXJlbmNlcygpOwotICB9Ci0KLSAgLy8KLSAgLy8gQWRkIHRoZSBnaXZlbiBXZWJTZXJ2aWNlVHlwZSB0byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBTZWUgbWV0aG9kIGxvYWQoKS4KLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGFkZCAoIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGRpYWxvZyApCi0gIHsKLSAgICB0eXBlc0J5TmFtZV8ucHV0KGRpYWxvZy5nZXRJZCgpLGRpYWxvZyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICogQHJldHVybiBBIHNpbmdsZXRvbiBXZWJTZXJ2aWNlVHlwZVJlZ2lzdHJ5IG9iamVjdC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlICgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2VfID0gbmV3IEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkoKTsKLSAgICAgIGluc3RhbmNlXy5sb2FkKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VUeXBlPC9jb2RlPiBvYmplY3RzLgotICAqIEByZXR1cm4gQWxsIHJlZ2lzdGVyZWQgPGNvZGU+V2ViU2VydmljZVR5cGU8L2NvZGU+IG9iamVjdHMuCi0gICovCi0gIHB1YmxpYyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVtdIGdldEFjdGlvbkRpYWxvZ3NQcmVmcmVuY2VzICgpCi0gIHsKLSAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVtdIGRpYWxvZ3MgPSBuZXcgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbdHlwZXNCeU5hbWVfLnNpemUoKV07Ci0gICAgRW51bWVyYXRpb24gZSA9IHR5cGVzQnlOYW1lXy5lbGVtZW50cygpOwotICAgIGZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIHsKLSAgICAgIGRpYWxvZ3NbaV0gPSAoQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUpZS5uZXh0RWxlbWVudCgpOwotICAgIH0KLSAgICByZXR1cm4gZGlhbG9nczsKLSAgfQotCi0gIHB1YmxpYyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBnZXRBY3Rpb25EaWFsb2dQcmVmcmVuY2VUeXBlQnlOYW1lIChTdHJpbmcgbmFtZSkKLSAgewotICAJcmV0dXJuIChuYW1lID09IG51bGwgPyBudWxsIDogKEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlKXR5cGVzQnlOYW1lXy5nZXQobmFtZSkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ3NQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3YmM0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ3NQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotCi07Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgTGlzdGVuZXIKLXsKLSAgLypDT05URVhUX0lEIFBQQUQwMDAxIGZvciB0aGUgQWN0aW9uIERpYWxvZ3MgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUEFEX1BBR0UgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQQUQwMDAxIjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gc2hvd0FsbDsKLSAgLypDT05URVhUX0lEIFBQQUQwMDAyIGZvciB0aGUgIHNob3cgYWxsIGNoZWNrIGJveCBvbiB0aGUgQWN0aW9uIERpYWxvZ3MgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUEFEX0JVVFRPTl9TSE9XX0FMTCA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuUFBBRDAwMDIiOwotICAvLwotICBwcml2YXRlIEJ1dHRvbiBoaWRlQWxsOwotICAvKkNPTlRFWFRfSUQgUFBBRDAwMDMgZm9yIHRoZSAgaGlkZSBhbGwgY2hlY2sgYm94IG9uIHRoZSBBY3Rpb24gRGlhbG9ncyBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BQQURfQlVUVE9OX0hJREVfQUxMID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUEFEMDAwMyI7Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgY2hlY2tCb3hlc187Ci0KLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAgIGNoZWNrQm94ZXNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGFkZE9wdGlvbmFsRGlhbG9nc0NoZWNrQm94ZXMgKHN1cGVycGFyZW50KTsKLQluZXcgTGFiZWwoc3VwZXJwYXJlbnQsIFNXVC5IT1JJWk9OVEFMKTsKLQkKLQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCi0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BQQURfUEFHRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LElORk9QT1BfUFBBRF9QQUdFKTsKLQkKLSAgICBzaG93QWxsID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBzaG93QWxsLnNldFRleHQoZ2V0TWVzc2FnZSgiJUJVVFRPTl9TSE9XX0FMTF9ESUFMT0dTIikpOwotICAgIHNob3dBbGwuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgc2hvd0FsbC5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QUEFEX0JVVFRPTl9TSE9XX0FMTCIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAoc2hvd0FsbCxJTkZPUE9QX1BQQURfQlVUVE9OX1NIT1dfQUxMKTsKLSAgIAotICAgIGhpZGVBbGwgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGhpZGVBbGwuc2V0VGV4dChnZXRNZXNzYWdlKCIlQlVUVE9OX0hJREVfQUxMX0RJQUxPR1MiKSk7Ci0gICAgaGlkZUFsbC5hZGRMaXN0ZW5lciAoIFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIGhpZGVBbGwuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFBBRF9CVVRUT05fSElERV9BTEwiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKGhpZGVBbGwsSU5GT1BPUF9QUEFEX0JVVFRPTl9ISURFX0FMTCk7Ci0KLSAgICBpbml0aWFsaXplVmFsdWVzKCk7Ci0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KHN1cGVycGFyZW50KTsKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSAKLSAgewotICAJCXJldHVybiBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZShrZXkpOwotICB9Ci0KLSBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIAotIHsKLSAgICBpZiAoc2hvd0FsbCA9PSBldmVudC53aWRnZXQpCi0JCWhhbmRsZVNob3dBbGxFdmVudCgpOwotICAgIAotICAgIGVsc2UgaWYgKCBoaWRlQWxsID09IGV2ZW50LndpZGdldCkKLSAgICAJaGFuZGxlSGlkZUFsbEV2ZW50KCk7Ci0gfQotCi0gcHJpdmF0ZSB2b2lkIGhhbmRsZVNob3dBbGxFdmVudCAoKQotIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gY2hlY2tCb3hlc18uZWxlbWVudHMoKTsKLSAJZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgCXsKLSAgICAJCUJ1dHRvbiBkaWFsb2cgPSAoQnV0dG9uKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgCQlkaWFsb2cuc2V0U2VsZWN0aW9uKCB0cnVlICk7Ci0gICAgCX0gICAgICAgICAgICAgICAgICAgICAgCi0gfQotCi0gcHJpdmF0ZSB2b2lkIGhhbmRsZUhpZGVBbGxFdmVudCAoKQotIHsKLSAJRW51bWVyYXRpb24gZSA9IGNoZWNrQm94ZXNfLmVsZW1lbnRzKCk7Ci0gCWZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIAl7Ci0gICAgCQlCdXR0b24gZGlhbG9nID0gKEJ1dHRvbikgZS5uZXh0RWxlbWVudCgpOwotICAgIAkJZGlhbG9nLnNldFNlbGVjdGlvbiggZmFsc2UgKTsKLSAgICAJfQotIH0KLSAKLSBwcml2YXRlIHZvaWQgYWRkT3B0aW9uYWxEaWFsb2dzQ2hlY2tCb3hlcyAoIENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEFjdGlvbkRpYWxvZ3NDb250ZXh0KCk7Ci0gICAgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbXSBkaWFsb2dzID0gY29udGV4dC5nZXREaWFsb2dzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgCUJ1dHRvbiBjaGVja0JveCA9IGNyZWF0ZUNoZWNrQm94KHBhcmVudCAsIGRpYWxvZ3NbaV0uZ2V0TmFtZSgpKTsKLSAgICAJY2hlY2tCb3guc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZShkaWFsb2dzW2ldLmdldFRvb2x0aXAoKSkpOwotICAgIAlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNoZWNrQm94LGRpYWxvZ3NbaV0uZ2V0SW5mb3BvcCgpKTsKLSAgICAJY2hlY2tCb3hlc18ucHV0KGRpYWxvZ3NbaV0uZ2V0SWQoKSwgY2hlY2tCb3gpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tCb3goIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0ICkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5DSEVDSyApOwotICAgIGJ1dHRvbi5zZXRUZXh0KCB0ZXh0ICk7Ci0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBzdG9yZVZhbHVlcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHBlcmZvcm1PaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgeyB9Ci0KLSAgLyoqCi0gICAqIFRoZSBwcm94eSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMKLSAgICogaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5lbGVtZW50cygpOwotICAgIGZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIHsKLSAgICAgIEJ1dHRvbiBkaWFsb2cgPSAoQnV0dG9uKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBkaWFsb2cuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2VzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotICB7Ci0gICAgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRBY3Rpb25EaWFsb2dzQ29udGV4dCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5rZXlzKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGNoZWNrQm94ZXNfLmdldChpZCk7Ci0gICAgICBidXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNBY3Rpb25EaWFsb2dFbmFibGVkKGlkKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAgIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QWN0aW9uRGlhbG9nc0NvbnRleHQoKTsKLQotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5rZXlzKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgY29udGV4dC5zZXRBY3Rpb25EaWFsb2dFbmFibGVkKGlkLCAoKEJ1dHRvbiljaGVja0JveGVzXy5nZXQoaWQpKS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNiNjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRDb250ZXh0Ci17Ci0gcHJpdmF0ZSBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBbXSBkaWFsb2dzXzsKLQotcHVibGljIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCAoKSAKLXsKLQlzdXBlciggIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpKTsKLX0KLXB1YmxpYyB2b2lkIGxvYWQoKSAKLXsKLSAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5IHJlZyA9IEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBkaWFsb2dzXyA9IHJlZy5nZXRBY3Rpb25EaWFsb2dzUHJlZnJlbmNlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlhbG9nc18ubGVuZ3RoOyBpKyspIHsKLSAgICAJc2V0RGVmYXVsdChkaWFsb2dzX1tpXS5nZXRJZCgpLCB0cnVlKTsKLSAgIH0KLX0KLQotcHVibGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlW10gZ2V0RGlhbG9ncygpCi17Ci0gIHJldHVybiBkaWFsb2dzXzsKLX0KLQotcHVibGljIHZvaWQgc2V0QWN0aW9uRGlhbG9nRW5hYmxlZCAoIFN0cmluZyBpZCwgYm9vbGVhbiB2YWx1ZSkKLXsKLSAJc2V0VmFsdWUgKGlkLCB2YWx1ZSk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzQWN0aW9uRGlhbG9nRW5hYmxlZCggU3RyaW5nIGlkKQotewotICAgICBpZiAoaWQgPT0gbnVsbCApIAotICAgICAJcmV0dXJuIHRydWU7Ci0JIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihpZCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUHJvamVjdFRvcG9sb2d5UHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUHJvamVjdFRvcG9sb2d5UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliNjQ4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1Byb2plY3RUb3BvbG9neVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlByb2plY3RUb3BvbG9neURlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VG9wb2xvZ3lQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lcgotewotICAvKkNPTlRFWFRfSUQgUFBTRDAwMDEgZm9yIHRoZSBQcm9qZWN0IFRvcG9sb2d5IFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFRQUF9QQUdFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFRQMDAwMSI7Ci0KLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciBjbGllbnRUeXBlVmlld2VyXzsKLSAgcHJpdmF0ZSBCdXR0b24gbW92ZVVwXzsKLSAgcHJpdmF0ZSBCdXR0b24gbW92ZURvd25fOwotICBwcml2YXRlIFZlY3RvciBjbGllbnRUeXBlc187Ci0gIC8qIENPTlRFWFRfSUQgUFRQUDAwMDIgZm9yIHRoZSBjbGllbnQgdHlwZSB0YWJsZSB2aWV3ZXIgb24gdGhlIFByb2plY3QgVG9wb2xvZ3kgUHJlZmVyZW5jZSBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFRQUF9DTElFTlRfVFlQRSA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuUFRQUDAwMDIiOwotICAvKiBDT05URVhUX0lEIFBUUFAwMDAzIGZvciB0aGUgbW92ZSB1cCBidXR0b24gb24gdGhlIFByb2plY3QgVG9wb2xvZ3kgUHJlZmVyZW5jZSBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFRQUF9NT1ZFX1VQID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QVFBQMDAwMyI7Ci0gIC8qIENPTlRFWFRfSUQgUFRQUDAwMDQgZm9yIHRoZSBtb3ZlIGRvd24gYnV0dG9uIG9uIHRoZSBQcm9qZWN0IFRvcG9sb2d5IFByZWZlcmVuY2UgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BUUFBfTU9WRV9ET1dOID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QVFBQMDAwNCI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gdHdvRUFSXzsKLSAgLyogQ09OVEVYVF9JRCBQVFBQMDAwNSBmb3IgdGhlIGVuYWJsZSAyIEVBUnMgY2hlY2tib3ggb24gdGhlIFByb2plY3QgVG9wb2xvZ3kgUHJlZmVyZW5jZSBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFRQUF9UV09fRUFSX0NIRUNLQk9YID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QVFBQMDAwNSI7Ci0KLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSAgIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoIHN1cGVycGFyZW50LCBTV1QuTk9ORSApOwkKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIHBhcmVudC5zZXRMYXlvdXQoIGxheW91dCApOwotICAgIHBhcmVudC5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QVFBQX1BBR0UiKSk7Ci0gICAgcGFyZW50LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCxJTkZPUE9QX1BUUFBfUEFHRSk7ICAgIAotCi0gICAgVGV4dCBjbGllbnRUeXBlTGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuV1JBUCk7Ci0gICAgY2xpZW50VHlwZUxhYmVsLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX0NMSUVOVF9UWVBFX05BTUUiKSk7Ci0KLSAgICBDb21wb3NpdGUgY2xpZW50VHlwZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY2xpZW50VHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCi0gICAgVGFibGUgdGFibGU9IG5ldyBUYWJsZShjbGllbnRUeXBlQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gMjU2OwotICAgIHRhYmxlLnNldExheW91dERhdGEoZ2QpOwotICAgIHRhYmxlLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX0NMSUVOVF9UWVBFX1RBQkxFX1ZJRVdFUiIpKTsKLQotICAgIGNsaWVudFR5cGVzXyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjbGllbnRUeXBlVmlld2VyXyA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgY2xpZW50VHlwZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDbGllbnRUeXBlQ29udGVudFByb3ZpZGVyKCkpOwotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IENsaWVudFR5cGVMYWJlbFByb3ZpZGVyKCkpOwotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnNldElucHV0KGNsaWVudFR5cGVzXyk7Ci0KLSAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgdGFibGVDb2x1bW4uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfQ0xJRU5UX1RZUEUiKSk7Ci0gICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5EYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMjU2LCAyNTYsIGZhbHNlKTsKLSAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbkRhdGEpOwotICAgIHRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLSAgICBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoY2xpZW50VHlwZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMTsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICBjLnNldExheW91dChnbCk7Ci0KLSAgICBtb3ZlVXBfID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0gICAgbW92ZVVwXy5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9NT1ZFX1VQIikpOwotICAgIG1vdmVVcF8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgbW92ZVVwXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBtb3ZlVXBfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX01PVkVfVVAiKSk7Ci0KLSAgICBtb3ZlRG93bl8gPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLSAgICBtb3ZlRG93bl8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfTU9WRV9ET1dOIikpOwotICAgIG1vdmVEb3duXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICBtb3ZlRG93bl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgbW92ZURvd25fLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX01PVkVfRE9XTiIpKTsKLQotICAgIHR3b0VBUl8gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICB0d29FQVJfLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX0VOQUJMRV9UV09fRUFSUyIpKTsKLSAgICB0d29FQVJfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX0VOQUJMRV9UV09fRUFSUyIpKTsKLQotICAgIGluaXRpYWxpemVWYWx1ZXMoKTsKLSAgICBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc3VwZXJwYXJlbnQpOyAgICAKLQotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgCi0gIHsKLSAgICAgIAlyZXR1cm4gV2ViU2VydmljZVVJUGx1Z2luLmdldE1lc3NhZ2Uoa2V5KTsKLSAgfQotCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBzdG9yZVZhbHVlcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHBlcmZvcm1PaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgeyB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdG8gdGhlaXIgYnVybmVkLWluIGRlZmF1bHRzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpCi0gIHsKLSAgICBjbGllbnRUeXBlc18uY2xlYXIoKTsKLSAgICBTdHJpbmdbXSB0eXBlcyA9IFByb2plY3RUb3BvbG9neURlZmF1bHRzLmdldENsaWVudFR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgIGNsaWVudFR5cGVzXy5hZGQodHlwZXNbaV0pOwotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICB0d29FQVJfLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2UgaGVscGVyLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotICB7Ci0gICAgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKTsKLSAgICBTdHJpbmdbXSB0eXBlcyA9IGNvbnRleHQuZ2V0Q2xpZW50VHlwZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgY2xpZW50VHlwZXNfLmFkZCh0eXBlc1tpXSk7Ci0gICAgLy8gY2hlY2sgd2hldGhlciB3ZSBtaXNzZWQgYW55IHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgbGlzdAotICAgIGJvb2xlYW4gbWlzc2VkID0gZmFsc2U7Ci0gICAgdHlwZXMgPSBQcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cy5nZXRDbGllbnRUeXBlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGNsaWVudFR5cGVzXy5pbmRleE9mKHR5cGVzW2ldKSA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgY2xpZW50VHlwZXNfLmFkZCh0eXBlc1tpXSk7Ci0gICAgICAgIG1pc3NlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChtaXNzZWQpCi0gICAgewotICAgICAgdHlwZXMgPSBuZXcgU3RyaW5nW2NsaWVudFR5cGVzXy5zaXplKCldOwotICAgICAgY2xpZW50VHlwZXNfLmNvcHlJbnRvKHR5cGVzKTsKLSAgICAgIGNvbnRleHQuc2V0Q2xpZW50VHlwZXModHlwZXMpOwotICAgIH0KLSAgICAvLyByZWZyZXNoIHZpZXdlcgotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICB0d29FQVJfLnNldFNlbGVjdGlvbihjb250ZXh0LmlzVXNlVHdvRUFScygpKTsKLSAgIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2UgaGVscGVyLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAgIFByb2plY3RUb3BvbG9neUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0KCk7Ci0gICAgU3RyaW5nW10gdHlwZXMgPSBuZXcgU3RyaW5nW2NsaWVudFR5cGVzXy5zaXplKCldOwotICAgIGNsaWVudFR5cGVzXy5jb3B5SW50byh0eXBlcyk7Ci0gICAgY29udGV4dC5zZXRDbGllbnRUeXBlcyh0eXBlcyk7Ci0gICAgY29udGV4dC5zZXRVc2VUd29FQVJzKHR3b0VBUl8uZ2V0U2VsZWN0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBjbGllbnRUeXBlVmlld2VyXy5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGlmIChlLndpZGdldCA9PSBtb3ZlVXBfICYmIGluZGV4ID4gMCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGNsaWVudFR5cGVzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICBjbGllbnRUeXBlc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXgtMSk7Ci0gICAgICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1vdmVEb3duXyAmJiBpbmRleCA8IGNsaWVudFR5cGVzXy5zaXplKCktMSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGNsaWVudFR5cGVzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICBjbGllbnRUeXBlc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXgrMSk7Ci0gICAgICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIENsaWVudFR5cGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHZhbHVlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gKChWZWN0b3IpdmFsdWUpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIAotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgCi0gICAgewotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgQ2xpZW50VHlwZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzXzsKLQotICAgIHB1YmxpYyBDbGllbnRUeXBlTGFiZWxQcm92aWRlcigpCi0gICAgewotICAgICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICBjb25maWdFbGVtZW50c18gPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAiY2xpZW50UHJvamVjdFR5cGUiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50QnlBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzXy5sZW5ndGg7IGkrKykKLSAgICAgICAgaWYgKGNvbmZpZ0VsZW1lbnRzX1tpXS5nZXRBdHRyaWJ1dGUobmFtZSkuZXF1YWxzKHZhbHVlKSkKLSAgICAgICAgICByZXR1cm4gY29uZmlnRWxlbWVudHNfW2ldOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQotICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBhcmcwKSAKLSAgICB7IAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgdmFsdWUpIAotICAgIHsKLSAgICAgIHJldHVybiBnZXRFbGVtZW50QnlBdHRyaWJ1dGUoImlkIiwgdmFsdWUudG9TdHJpbmcoKSkuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOyAKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUmVzb3VyY2VNYW5hZ21lbnRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MTU2MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VEZWZhdWx0czsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLSAgLypDT05URVhUX0lEIFBQUk0wMDAxIGZvciB0aGUgUmVzb3VyY2UgTWFuYWdtZW50IFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFBSTV9QQUdFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwMSI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIG92ZXJXcml0ZUZpbGVzOwotICAvKkNPTlRFWFRfSUQgUFBSTTAwMDIgZm9yIHRoZSBmaWxlIG92ZXJ3cml0ZSBjaGVjayBib3ggb24gdGhlIFJlc291cmNlIE1hbmFnZW1lbnQgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuUFBSTTAwMDIiOwotICAvLwotICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVGb2xkZXJzOwotICAvKkNPTlRFWFRfSUQgUFBSTTAwMDMgZm9yIHRoZSBjcmVhdGUgZm9sZGVycyBjaGVjayBib3ggb24gdGhlIFJlc291cmNlIE1hbmFnZW1lbnQgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFJNX0NIRUNLQk9YX0NSRUFURV9GT0xERVJTID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwMyI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIGNoZWNrb3V0RmlsZXM7Ci0gIC8qQ09OVEVYVF9JRCBQUFJNMDAwNCBmb3IgdGhlIGNoZWNrb3V0IGZpbGVzIGNoZWNrIGJveCBvbiB0aGUgUmVzb3VyY2UgTWFuYWdlbWVudCBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BQUk1fQ0hFQ0tCT1hfQ0hFQ0tfT1VUID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwNCI7Ci0KLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotICAJCi0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BQUk1fUEFHRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LCBJTkZPUE9QX1BQUk1fUEFHRSk7Ci0KLSAgICBvdmVyV3JpdGVGaWxlcyA9IGNyZWF0ZUNoZWNrQm94KHBhcmVudCwgV2ViU2VydmljZVVJUGx1Z2luLmdldE1lc3NhZ2UoIiVCVVRUT05fT1ZFUldSSVRFX0ZJTEVTIiApKTsKLSAgICBvdmVyV3JpdGVGaWxlcy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAob3ZlcldyaXRlRmlsZXMsIElORk9QT1BfUFBSTV9DSEVDS0JPWF9PVkVSV1JJVEVfRklMRVMpOwotCi0gICAgY3JlYXRlRm9sZGVycyAgPSBjcmVhdGVDaGVja0JveChwYXJlbnQsIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlQlVUVE9OX0NSRUFURV9GT0xERVJTIiApKTsKLSAgICBjcmVhdGVGb2xkZXJzLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BQUk1fQ0hFQ0tCT1hfQ1JFQVRFX0ZPTERFUlMiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKGNyZWF0ZUZvbGRlcnMsIElORk9QT1BfUFBSTV9DSEVDS0JPWF9DUkVBVEVfRk9MREVSUyk7Ci0KLSAgICBjaGVja291dEZpbGVzID0gY3JlYXRlQ2hlY2tCb3gocGFyZW50LCBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJUJVVFRPTl9DSEVDS09VVF9GSUxFUyIgKSk7ICAgIAotICAgIGNoZWNrb3V0RmlsZXMuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFBSTV9DSEVDS0JPWF9DSEVDS19PVVQiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKGNoZWNrb3V0RmlsZXMsIElORk9QT1BfUFBSTV9DSEVDS0JPWF9DSEVDS19PVVQpOwotCi0gICAgaW5pdGlhbGl6ZVZhbHVlcygpOwotICAgIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nLmFwcGx5RGlhbG9nRm9udChzdXBlcnBhcmVudCk7ICAgIAotCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotIAotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIAotICB7Ci0gIAkJcmV0dXJuIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKGtleSk7Ci0gIH0KLQotICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVDaGVja0JveCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQgKQotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULkNIRUNLICk7Ci0gICAgYnV0dG9uLnNldFRleHQoIHRleHQgKTsKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgLyoqCi0gICAqIERvZXMgYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGRlZmF1bHQgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKQotICB7Ci0gICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0gIH0KLQotICAvKioKLSAgICogRG8gYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIE9LIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKiAgQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLSAgewotICAgIHN0b3JlVmFsdWVzKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotICB7Ci0gICAgcGVyZm9ybU9rKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpICB7IH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyB1c2luZyBkZWZhdWx0IHZhbHVlcwotICAgKiBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKQotICB7Ci0gICAgb3ZlcldyaXRlRmlsZXMuc2V0U2VsZWN0aW9uKCBSZXNvdXJjZURlZmF1bHRzLmdldE92ZXJ3cml0ZUZpbGVzRGVmYXVsdCgpKTsKLSAgICBjcmVhdGVGb2xkZXJzLnNldFNlbGVjdGlvbiggUmVzb3VyY2VEZWZhdWx0cy5nZXRDcmVhdGVGb2xkZXJzRGVmYXVsdCgpKTsKLSAgICBjaGVja291dEZpbGVzLnNldFNlbGVjdGlvbiggUmVzb3VyY2VEZWZhdWx0cy5nZXRDaGVja291dEZpbGVzRGVmYXVsdCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0gIHsKLSAgICAvLyBnZXQgdGhlIHBlcnNpc3RlbnQgY29udGV4dCBmcm9tIHRoZSBwbHVnaW4KLSAgICBSZXNvdXJjZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZUNvbnRleHQoKTsKLSAgICBvdmVyV3JpdGVGaWxlcy5zZXRTZWxlY3Rpb24oIGNvbnRleHQuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSk7Ci0gICAgY3JlYXRlRm9sZGVycy5zZXRTZWxlY3Rpb24oIGNvbnRleHQuaXNDcmVhdGVGb2xkZXJzRW5hYmxlZCgpKTsKLSAgICBjaGVja291dEZpbGVzLnNldFNlbGVjdGlvbiggY29udGV4dC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpOyAgICAKLSAgIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gICAgLy8gZ2V0IHRoZSBwZXJzaXN0ZW50IGNvbnRleHQgZnJvbSB0aGUgcGx1Z2luCi0gICAgUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgY29udGV4dC5zZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQoIG92ZXJXcml0ZUZpbGVzLmdldFNlbGVjdGlvbigpICk7Ci0gICAgY29udGV4dC5zZXRDcmVhdGVGb2xkZXJzRW5hYmxlZCggY3JlYXRlRm9sZGVycy5nZXRTZWxlY3Rpb24oKSApOwotICAgIGNvbnRleHQuc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoIGNoZWNrb3V0RmlsZXMuZ2V0U2VsZWN0aW9uKCkgKTsgICAgCi0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvU2NlbmFyaW9EZWZhdWx0c1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDlkMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9EZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2NlbmFyaW9EZWZhdWx0c1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIAotICBwcml2YXRlIFRhYmxlVmlld2VyIHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl87IAotICBwcml2YXRlIEJ1dHRvbiBtb3ZlVXBfOwotICBwcml2YXRlIEJ1dHRvbiBtb3ZlRG93bl87Ci0gIHByaXZhdGUgVmVjdG9yIHdlYlNlcnZpY2VUZXN0VHlwZXNfOwotICAKLSAgLypDT05URVhUX0lEIFBQU0QwMDAxIGZvciB0aGUgU2NlbmFyaW8gRGVmYXVsdHMgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFNEX1BBR0UgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQU0QwMDAxIjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gbGF1bmNoU2FtcGxlOwotICAvKkNPTlRFWFRfSUQgUFBTRDAwMDIgZm9yIHRoZSBsYXVuY2ggc2FtcGxlIGNoZWNrIGJveCBvbiB0aGUgU2NlbmFyaW8gRGVmYXVsdHMgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QUFNEX0NIRUNLQk9YX0xBVU5DSF9TQU1QTEUgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQU0QwMDAyIjsKLSAgLy8KLSAgcHJpdmF0ZSBMYWJlbCBzYW1wbGVHZW5lcmF0aW9uTGFiZWxfOwotICBwcml2YXRlIENvbWJvIHNhbXBsZUdlbmVyYXRpb25UeXBlc187Ci0gIC8qQ09OVEVYVF9JRCBQUFNEMDAwNCBmb3IgdGhlIHNhbXBsZSBKU1AgdHlwZSBjb21ibyBib3ggb24gdGhlIFNjZW5hcmlvIERlZmF1bHRzIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFBTRF9DT01CT19TQU1QTEVfR0VOID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFNEMDAwNCI7Ci0KLSAgcHJpdmF0ZSBMYWJlbCB3c2V4cGxvcmVyVHlwZXNMYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gd3NleHBsb3JlclR5cGVzXzsKLSAgLypDT05URVhUX0lEIFBQU0QwMDAzIGZvciB0aGUgd2ViIGV4cGxvcmVyIHR5cGUgY29tYm8gYm94IG9uIHRoZSBTY2VuYXJpbyBEZWZhdWx0cyBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BQU0RfQ09NQk9fRVhQTE9SRVIgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQU0QwMDAzIjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAgIAotICAJQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BQU0RfUEFHRSIpKTsKLSAgICBwYXJlbnQuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LElORk9QT1BfUFBTRF9QQUdFKTsgICAgCi0KLSAgICBsYXVuY2hTYW1wbGUgPSBjcmVhdGVDaGVja0JveChwYXJlbnQsIGdldE1lc3NhZ2UoIiVCVVRUT05fTEFVTkNIX1NBTVBMRSIpKTsKLSAgICBsYXVuY2hTYW1wbGUuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFBTRF9DSEVDS0JPWF9MQVVOQ0hfU0FNUExFIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobGF1bmNoU2FtcGxlLCBJTkZPUE9QX1BQU0RfQ0hFQ0tCT1hfTEFVTkNIX1NBTVBMRSk7Ci0KLSAgICAKLSAgICBUZXh0IHRlc3RTZXJ2aWNlVHlwZUxhYmVsID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULldSQVApOwotICAgIHRlc3RTZXJ2aWNlVHlwZUxhYmVsLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX1NBTVBMRV9UWVBFUyIpKTsKLQotICAgIENvbXBvc2l0ZSB3ZWJTZXJ2aWNlVGVzdFR5cGVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIHdlYlNlcnZpY2VUZXN0VHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCi0gICAgVGFibGUgdGFibGU9IG5ldyBUYWJsZSh3ZWJTZXJ2aWNlVGVzdFR5cGVDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLSAgICBnZC53aWR0aEhpbnQgPSAyNTY7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgdGFibGUuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfQ0xJRU5UX1RZUEVfVEFCTEVfVklFV0VSIikpOwotCi0gICAgd2ViU2VydmljZVRlc3RUeXBlc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXyA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdlYlNlcnZpY2VUZXN0VHlwZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IFdlYlNlcnZpY2VUZXN0VHlwZUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXy5zZXRJbnB1dCh3ZWJTZXJ2aWNlVGVzdFR5cGVzXyk7Ci0KLSAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgdGFibGVDb2x1bW4uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfQ0xJRU5UX1RZUEVfTkFNRSIpKTsKLSAgICBDb2x1bW5XZWlnaHREYXRhIGNvbHVtbkRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyNTYsIDI1NiwgZmFsc2UpOwotICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uRGF0YSk7Ci0gICAgdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgIENvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZSh3ZWJTZXJ2aWNlVGVzdFR5cGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgYy5zZXRMYXlvdXQoZ2wpOwotCi0gICAgbW92ZVVwXyA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotICAgIG1vdmVVcF8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfTU9WRV9VUCIpKTsKLSAgICBtb3ZlVXBfLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgIG1vdmVVcF8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgbW92ZVVwXy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9NT1ZFX1VQIikpOwotCi0gICAgbW92ZURvd25fID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0gICAgbW92ZURvd25fLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX01PVkVfRE9XTiIpKTsKLSAgICBtb3ZlRG93bl8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgbW92ZURvd25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIG1vdmVEb3duXy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9NT1ZFX0RPV04iKSk7Ci0KLSAgICBpbml0aWFsaXplVmFsdWVzKCk7Ci0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KHN1cGVycGFyZW50KTsgICAgCi0KLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSAKLSAgewotICAgICAgCXJldHVybiBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZShrZXkpOwotICB9Ci0gCi0gIHByaXZhdGUgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCApCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuQ0hFQ0sgKTsKLSAgICBidXR0b24uc2V0VGV4dCggdGV4dCApOwotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICAvKioKLSAgICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0gIHsKLSAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICBpbml0aWFsaXplRGVmYXVsdHMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqICBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKQotICB7Ci0gICAgdHJ5ewotICAgICAgc3RvcmVWYWx1ZXMoKTsKLSAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBleGMpewotICAgIAlleGMucHJpbnRTdGFja1RyYWNlKCk7fQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHRyeXsKLSAgCXBlcmZvcm1PaygpOwotICAgIH1jYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGMpewotICAgICAgZXhjLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgIHsgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHRvIHRoZWlyIGJ1cm5lZC1pbiBkZWZhdWx0cy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKQotICB7Ci0gICAgU2NlbmFyaW9EZWZhdWx0cyBkZWZhdWx0cyA9IG5ldyBTY2VuYXJpb0RlZmF1bHRzKCk7Ci0gICAgLy9wZ20gbGF1bmNoU2FtcGxlLnNldFNlbGVjdGlvbiggZGVmYXVsdHMuZ2V0TGF1bmNoU2FtcGxlRGVmYXVsdCgpKTsKLSAgICAKLSAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5jbGVhcigpOwotICAgIFN0cmluZ1tdIHR5cGVzID0gZGVmYXVsdHMuZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5hZGQodHlwZXNbaV0pOwotICAgIHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl8ucmVmcmVzaCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBoZWxwZXIuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0gIHsKLSAgCVNjZW5hcmlvQ29udGV4dCAgY29udGV4dCAgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0gICAgU2NlbmFyaW9EZWZhdWx0cyBkZWZhdWx0cyA9IG5ldyBTY2VuYXJpb0RlZmF1bHRzKCk7Ci0gICAgLy9wZ20gbGF1bmNoU2FtcGxlLnNldFNlbGVjdGlvbiggY29udGV4dC5pc0xhdW5jaFNhbXBsZUVuYWJsZWQoKSk7Ci0gICAgICAgIAotICAgIFN0cmluZ1tdIHR5cGVzID0gY29udGV4dC5nZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgIHdlYlNlcnZpY2VUZXN0VHlwZXNfLmFkZCh0eXBlc1tpXSk7Ci0gICAgLy8gY2hlY2sgd2hldGhlciB3ZSBtaXNzZWQgYW55IHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgbGlzdAotICAgIGJvb2xlYW4gbWlzc2VkID0gZmFsc2U7Ci0gICAgdHlwZXMgPSBkZWZhdWx0cy5nZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAod2ViU2VydmljZVRlc3RUeXBlc18uaW5kZXhPZih0eXBlc1tpXSkgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHdlYlNlcnZpY2VUZXN0VHlwZXNfLmFkZCh0eXBlc1tpXSk7Ci0gICAgICAgIG1pc3NlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChtaXNzZWQpCi0gICAgewotICAgICAgdHlwZXMgPSBuZXcgU3RyaW5nW3dlYlNlcnZpY2VUZXN0VHlwZXNfLnNpemUoKV07Ci0gICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5jb3B5SW50byh0eXBlcyk7Ci0gICAgICBjb250ZXh0LnNldFdlYlNlcnZpY2VUZXN0VHlwZXModHlwZXMpOwotICAgIH0KLSAgICAvLyByZWZyZXNoIHZpZXdlcgotICAgIHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgfQotCi0gIC8qKgotICAgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBoZWxwZXIuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gICAgU2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0gICAgU3RyaW5nW10gdHlwZXMgPSBuZXcgU3RyaW5nW3dlYlNlcnZpY2VUZXN0VHlwZXNfLnNpemUoKV07Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlc18uY29weUludG8odHlwZXMpOwotICAgIGNvbnRleHQuc2V0V2ViU2VydmljZVRlc3RUeXBlcyh0eXBlcyk7Ci0gICAgCi0gICAgLy9wZ20gY29udGV4dC5zZXRMYXVuY2hTYW1wbGVFbmFibGVkKGxhdW5jaFNhbXBsZS5nZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGludCBpbmRleCA9IHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl8uZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAoZS53aWRnZXQgPT0gbW92ZVVwXyAmJiBpbmRleCA+IDApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5pbnNlcnRFbGVtZW50QXQob2JqZWN0LCBpbmRleC0xKTsKLSAgICAgICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBtb3ZlRG93bl8gJiYgaW5kZXggPCB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5zaXplKCktMSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IHdlYlNlcnZpY2VUZXN0VHlwZXNfLnJlbW92ZShpbmRleCk7Ci0gICAgICAgIHdlYlNlcnZpY2VUZXN0VHlwZXNfLmluc2VydEVsZW1lbnRBdChvYmplY3QsIGluZGV4KzEpOwotICAgICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIFdlYlNlcnZpY2VUZXN0VHlwZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgdmFsdWUpIAotICAgIHsKLSAgICAgIHJldHVybiAoKFZlY3Rvcil2YWx1ZSkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSAKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBXZWJTZXJ2aWNlVGVzdFR5cGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotICB7Ci0gICAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50c187Ci0KLSAgICBwdWJsaWMgV2ViU2VydmljZVRlc3RUeXBlTGFiZWxQcm92aWRlcigpCi0gICAgewotICAgICAgV2ViU2VydmljZVRlc3RSZWdpc3RyeSB3c3RyID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgY29uZmlnRWxlbWVudHNfID0gd3N0ci5nZXRDb25maWdFbGVtZW50cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKLSAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgYXJnMCkgCi0gICAgeyAKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IHZhbHVlKSAKLSAgICB7Ci0gICAgICAvL3JldHVybiBnZXRFbGVtZW50QnlBdHRyaWJ1dGUoImlkIiwgdmFsdWUudG9TdHJpbmcoKSkuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOyAKLSAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS91ZGRpL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3VkZGkvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxODg4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3VkZGkvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLQotcHVibGljIGludGVyZmFjZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZQotewotICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZVVERElSZWdpc3RyeUluc3RhbGxlZCgpOwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcml2YXRlVURESVJlZ2lzdHJ5SW5xdWlyeUFQSSgpOwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcml2YXRlVURESVJlZ2lzdHJ5UHVibGlzaEFQSSgpOwotICAgIHB1YmxpYyBDb21tYW5kV2lkZ2V0QmluZGluZyBnZXRCaW5kaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3VpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy91aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlNGU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UKLVBMVUdJTl9WRU5ET1I9SW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLgotUExVR0lOX0RFU0M9XAotVGhlIFdlYiBzZXJ2aWNlcyBHVUkgcGx1Z2luIGRlbGl2ZXJzIHRoZSBncmFwaGljYWwgXAotdXNlciBpbnRlcmZhY2UgdG8gdGhlIFdlYiBzZXJ2aWNlcyBmdW5jdGlvbiBvZiB0aGUgXAotV2ViIHNlcnZpY2VzIHBsdWdpbi4KLQotUExVR0lOX05FV19DQVRFR09SWV9OQU1FX1dTPVdlYiBTZXJ2aWNlcwotCi0jCi0jCVdlYiBTZXJ2aWNlcyBQcmVmZXJhbmNlIFBhZ2VzCi0jCi0jIENhdGVnb3JpZXMKLVBSRUZFUkVOQ0VfQ0FURUdPUllfUkVTT1VSQ0VfTUFOQUdFTUVOVD1SZXNvdXJjZSBNYW5hZ2VtZW50Ci1QUkVGRVJFTkNFX0NBVEVHT1JZX0NPREVfR0VORVJBVElPTj1Db2RlIEdlbmVyYXRpb24KLVBSRUZFUkVOQ0VfQ0FURUdPUllfU0NFTkFSSU9fREVGQVVMVFM9U2NlbmFyaW8gRGVmYXVsdHMKLVBSRUZFUkVOQ0VfQ0FURUdPUllfUFJPSkVDVF9UT1BPTE9HWT1Qcm9qZWN0IFRvcG9sb2d5Ci1QUkVGRVJFTkNFX0NBVEVHT1JZX0RSSVZFUl9KQVJTPUpEQkMgZHJpdmVycwotCi0KLSMKLSNTY2VuYXJpbyBEZWZhdWx0cwotQlVUVE9OX0xBVU5DSF9TQU1QTEU9TGF1bmNoIHRoZSBzYW1wbGUgd2hlbiBnZW5lcmF0ZWQKLUxBQkVMX1VERElfQ0FUX0RBVEFfQ09MVU1OX0RFTElNPVVzZXIgZGVmaW5lZCBVRERJIENhdGVnb3J5IGRhdGEgY29sdW1uIGRlbGltaXRlcjoKLUxBQkVMX1VERElfQ0FUX0RBVEFfU1RSSU5HX0RFTElNPVVzZXIgZGVmaW5lZCBVRERJIENhdGVnb3J5IGRhdGEgc3RyaW5nIGRlbGltaXRlcjoKLU1TR19FUlJPUl9DT0xVTU5fU1RSSU5HX0RFTElNU19JREVOVElDQUw9SVdBQjA0ODFFIFVEREkgY29sdW1uIGFuZCBzdHJpbmcgZGVsaW1pdGVycyBtdXN0IG5vdCBiZSBpZGVudGljYWwuCi1MQUJFTF9NT1ZFX1VQPU1vdmUgdXAKLUxBQkVMX01PVkVfRE9XTj1Nb3ZlIGRvd24KLQotIwotIyBQcmVmZXJlbmNlcyBUb29sdGlwcwotIwotCi0jU2NlbmFyaW8gRGVmYXVsdHMKLVRPT0xUSVBfUFBTRF9QQUdFPVNldCB0aGUgZGVmYXVsdHMgZm9yIHRoZSBXZWIgc2VydmljZSBzY2VuYXJpb3MuCi1UT09MVElQX1BQU0RfQ0hFQ0tCT1hfTEFVTkNIX1NBTVBMRT1MYXVuY2ggdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiBhZnRlciBnZW5lcmF0aW9uLgotVE9PTFRJUF9QUFNEX0NPTUJPX1NBTVBMRV9HRU49U2VsZWN0IHRoZSB0eXBlIG9mIHNhbXBsZSBKU1AgdG8gYmUgZ2VuZXJhdGVkLgotVE9PTFRJUF9QUFNEX0NPTUJPX0VYUExPUkVSPVNlbGVjdCB0aGUgdHlwZSBvZiB0aGUgV2ViIHNlcnZpY2VzIGV4cGxvcmVyIHRvIGJlIHVzZWQuCi1UT09MVElQX1BQU0RfVURESV9DQVRfREFUQV9DT0xVTU5fREVMSU09Y29sdW1uIGRlbGltaXRlciBmb3IgdXNlciBkZWZpbmVkIFVEREkgY2F0ZWdvcnkgZGF0YQotVE9PTFRJUF9QUFNEX1VERElfQ0FUX0RBVEFfU1RSSU5HX0RFTElNPXN0cmluZyBkZWxpbWl0ZXIgZm9yIHVzZXIgZGVmaW5lZCBVRERJIGNhdGVnb3J5IGRhdGEKLVRPT0xUSVBfQ0xJRU5UX1RZUEVfVEFCTEVfVklFV0VSPVByZWZlcnJlZCBvcmRlciBvZiB0aGUgbGlzdCBvZiBjbGllbnQgdHlwZXMKLVRPT0xUSVBfTU9WRV9VUD1Nb3ZlIHRoZSBzZWxlY3RlZCBjbGllbnQgdHlwZSB1cCB0aGUgbGlzdAotVE9PTFRJUF9NT1ZFX0RPV049TW92ZSB0aGUgc2VsZWN0ZWQgY2xpZW50IHR5cGUgZG93biB0aGUgbGlzdAotCi0jCi0jIFJlc291cmNlIE1hbmFnbWVudAotVE9PTFRJUF9QUFJNX1BBR0U9U2V0IHByZWZlcmVuY2VzIHRoYXQgY29udHJvbCByZXNvdXJjZXMgdXNlZC9nZW5lcmF0ZWQgYnkgdGhlIFdlYiBzZXJ2aWNlLgotVE9PTFRJUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUz1PdmVyd3JpdGUgZmlsZXMgd2l0aG91dCB3YXJuaW5nLgotVE9PTFRJUF9QUFJNX0NIRUNLQk9YX0NSRUFURV9GT0xERVJTPUNyZWF0ZSBmb2xkZXJzIHdoZW4gbmVjZXNzYXJ5LgotVE9PTFRJUF9QUFJNX0NIRUNLQk9YX0NIRUNLX09VVD1DaGVjayBvdXQgZmlsZXMgd2l0aG91dCB3YXJuaW5nLgotQlVUVE9OX0NSRUFURV9GT0xERVJTPUNyZWF0ZSBmb2xkZXJzIHdoZW4gbmVjZXNzYXJ5Ci1CVVRUT05fT1ZFUldSSVRFX0ZJTEVTPU92ZXJ3cml0ZSBmaWxlcyB3aXRob3V0IHdhcm5pbmcKLUJVVFRPTl9DSEVDS09VVF9GSUxFUz1DaGVjayBvdXQgZmlsZXMgd2l0aG91dCB3YXJuaW5nCi0KLSMKLSMgR2VuZXJhbCBtZXNzYWdlcy4KLSMKLUlTVEFUVVNfV0lUSE9VVF9FWENFUFRJT049ezB9Ci1JU1RBVFVTX1dJVEhfRVhDRVBUSU9OPXswfVxuRXhjZXB0aW9uOiB7MX0KLU1TR19JTkZPX1NBVkVEX1NUQVRVUz1JV0FCMDI5N0kgUHJlc3MgdGhlIERldGFpbHMgYnV0dG9uIHRvIHNlZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgotCi0jCi0jIFR5cGVTZWxlY3Rpb25EaWFsb2cKLSMKLURJQUxPR19USVRMRV9DTEFTU19CUk9XU0U9QnJvd3NlIENsYXNzZXMKLURJQUxPR19USVRMRV9JTlRFUkZBQ0VfQlJPV1NFPUJyb3dzZSBJbnRlcmZhY2VzCi0KLSMKLSMgQ29tbW9uIHdpemFyZCBzdHJpbmdzLgotIwotTEFCRUxfV1NFWFBMT1JFUl9UWVBFUz1XZWIgU2VydmljZXMgRXhwbG9yZXIKLUxBQkVMX1NBTVBMRV9UWVBFUz1KYXZhIHByb3h5IHNhbXBsZQotCi0jCi0jIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nCi0jCi1ESUFMT0dfVElUTEVfUkVTT1VSQ0VfQlJPV1NFPUJyb3dzZSBGaWxlcwotTEFCRUxfUkVTT1VSQ0VfRklMVEVSPUZpbHRlcjoKLQotIwotIyBUb29sdGlwcyBmb3IgZGlhbG9nLlJlc291cmNlU2VsZWN0aW9uRGlhbG9nCi0jIERSRVM9RGlhbG9nL1JFU291cmNlcwotIwotVE9PTFRJUF9EUkVTX0NPTUJPX1JFU09VUkNFX1RZUEU9VHlwZSBvZiByZXNvdXJjZXMgdG8gYnJvd3NlLgotVE9PTFRJUF9EUkVTX1RSRUVfUkVTT1VSQ0U9UmVzb3VyY2VzIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uLgotCi0KLQotIwotIyBIVFRQIEJhc2ljIEF1dGhlbnRpY2F0aW9uCi0jCi1QUkVGRVJFTkNFX0NBVEVHT1JZX0hUVFBfQkFTSUNfQVVUSD1IVFRQIEJhc2ljIEF1dGgKLUNIRUNLQk9YX1BSRUZFUkVOQ0VfRU5BQkxFX0hUVFBfQkFTSUNfQVVUSD1FbmFibGUgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbgotTEFCRUxfUFJFRkVSRU5DRV9IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUU9SFRUUCBiYXNpYyBhdXRoIHVzZXIgbmFtZToKLUxBQkVMX1BSRUZFUkVOQ0VfSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JEPUhUVFAgYmFzaWMgYXV0aCBwYXNzd29yZDoKLQotVE9PTFRJUF9FTkFCTEVfSFRUUF9CQVNJQ19BVVRIPVNwZWNpZnkgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiBzZXR0aW5nIGZvciBXZWIgc2VydmljZXMgdG9vbGluZ3MuCi1UT09MVElQX0hUVFBfQkFTSUNfQVVUSF9VU0VSTkFNRT1Vc2VyIG5hbWUgZm9yIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24uCi1UT09MVElQX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRD1QYXNzd29yZCBmb3IgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbi4KLQotCi0jCi0jIE1lc3NhZ2VzIGZvciBwcm9qZWN0IHRvcG9sb2d5IHByZWZlcmVuY2UgcGFnZQotIwotVE9PTFRJUF9QVFBQX1BBR0U9UHJlZmVyZW5jZSB0aGF0IGNvbnRyb2wgdGhlIHByb2plY3QgdG9wb2xvZ3kgb2YgeW91ciBXZWIgc2VydmljZSBhbmQgY2xpZW50IHNjZW5hcmlvcy4KLVRPT0xUSVBfRU5BQkxFX1RXT19FQVJTPUVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBnZW5lcmF0ZSB5b3VyIFdlYiBzZXJ2aWNlIGFuZCBXZWIgc2VydmljZSBjbGllbnQgaW4gZGlmZmVyZW50IEVBUiBwcm9qZWN0cy4KLQotTEFCRUxfRU5BQkxFX1RXT19FQVJTPUdlbmVyYXRlIFdlYiBzZXJ2aWNlIGFuZCBXZWIgc2VydmljZSBjbGllbnQgaW4gZGlmZmVyZW50IEVBUiBwcm9qZWN0cwotTEFCRUxfQ0xJRU5UX1RZUEVfTkFNRT1DbGllbnQgdHlwZToKLQotCi0jCi0jCUFjdGlvbkRpYWxvZ3MgUGFnZQotIwotUFJFRkVSRU5DRV9DQVRFR09SWV9ESUFMT0dTPURpYWxvZ3MKLQotIwotIyBSZXNvdXJjZSBCcm93c2VyCi0jCi1ESUFMT0dfVElUTEVfUkVTT1VSQ0VfQlJPV1NFUj1SZXNvdXJjZSBicm93c2VyCi1UT09MVElQX1JFU09VUkNFX1RSRUU9Q2hvb3NlIGEgcmVzb3VyY2UuCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGU1N2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotd3MuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmY2Mjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC53c2RsPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3Qud3MudWRkaTRqPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1YWRiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGRvYy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB3cy5qYXIKLXNvdXJjZS53cy5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ4YzhiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzIj4KLSAgIDxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPgotICAgPC9jb21wb25lbnQtZGVwZW5kcz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cyIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmV4cGxvcmVyIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1YThiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcwotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkNzRjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cyIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgbmFtZT0iJVBMVUdJTl9OQU1FIgotICAgcHJvdmlkZXItbmFtZT0iJVBMVUdJTl9QUk9WSURFUiIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPiAKLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLnVkZGk0aiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53ZWIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tYW5kL051bGxTdGF0dXNNb25pdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvTnVsbFN0YXR1c01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyY2JjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvTnVsbFN0YXR1c01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0qIEEgTnVsbFN0YXR1c1JlbmRlcmVyIHRocm93cyBhd2F5IElTdGF0dXMgaW5mb3JtYXRpb24uCi0qLwotcHVibGljIGNsYXNzIE51bGxTdGF0dXNNb25pdG9yIGltcGxlbWVudHMgU3RhdHVzTW9uaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByb3RlY3RlZCBib29sZWFuIHJlc3VsdDsKLQotICAvKioKLSAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAqLwotICBwdWJsaWMgTnVsbFN0YXR1c01vbml0b3IgKCkgIHt9Ci0gIC8qKgotICAqIERvZXMgbm90aGluZy4KLSAgKi8KLSAgcHVibGljIGludCByZXBvcnRTdGF0dXMoSVN0YXR1cyBzdGF0dXMsIFZlY3RvciBvcHRpb25zKSB7IHJldHVybiAwOyB9Ci0gIHB1YmxpYyBib29sZWFuIHJlcG9ydFN0YXR1cyhJU3RhdHVzIHN0YXR1cykgCi0gIHsgCi0gICAgc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkKLSAgICB7Ci0gICAgICBjYXNlIElTdGF0dXMuRVJST1I6Ci0gICAgICBjYXNlIElTdGF0dXMuV0FSTklORzoKLSAgICAgIAkJcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAJCWJyZWFrOwotCSAgY2FzZSBJU3RhdHVzLklORk86Ci0gICAgICBkZWZhdWx0OiAvL0lTdGF0dXMuT0sKLSAgICAgIAkJcmVzdWx0ID0gdHJ1ZTsgCi0gICAgICAJCWJyZWFrOwotICAgICB9Ci0gCXJldHVybiByZXN1bHQ7Ci0gIH0KLSAgcHVibGljIHZvaWQgZHVtcFNhdmVkU3RhdHVzKCkgeyB9Ci0gIHB1YmxpYyBib29sZWFuIGNhbkNvbnRpbnVlKCkgCi0gIHsgCi0JcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0ICgpIHsKLSAgCQlyZXN1bHQgPSB0cnVlOwotICAJfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzTW9uaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tYW5kL1N0YXR1c01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlOTFkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSogQSBTdGF0dXNNb25pdG9yIHJlcG9ydHMgSVN0YXR1cyBpbmZvcm1hdGlvbiB0byBhIGRpc3BsYXkgc3lzdGVtLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdHVzTW9uaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIHJlcG9ydHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBzdGF0dXMgb2JqZWN0LgotICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVwb3J0Ci0gICogSVN0YXR1cyBpbmZvcm1hdGlvbiB0byBhIGdpdmVuIGRpc3BsYXkgc3lzdGVtLAotICAqIHN1Y2ggYXMgU1dULCB0aGUgY29tbWFuZCBsaW5lLCBvciBhIHRyYWNlIGZpbGUuCi0gICovCi0gIHB1YmxpYyBpbnQgcmVwb3J0U3RhdHVzKElTdGF0dXMgc3RhdHVzLCBWZWN0b3Igb3B0aW9ucyk7Ci0gIHB1YmxpYyBib29sZWFuIHJlcG9ydFN0YXR1cyhJU3RhdHVzIHN0YXR1cyk7Ci0gIHB1YmxpYyB2b2lkIGR1bXBTYXZlZFN0YXR1cygpOwotICBwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZSgpOwotICBwdWJsaWMgdm9pZCByZXNldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tYW5kL1N0YXR1c1JlbmRlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmZjNhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSogQSBTdGF0dXNSZW5kZXJlciByZW5kZXJzIElTdGF0dXMgaW5mb3JtYXRpb24gdG8gYSBkaXNwbGF5IHN5c3RlbS4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXR1c1JlbmRlcmVyCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogUmVuZGVycyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHN0YXR1cyBvYmplY3QuCi0gICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW5kZXIKLSAgKiBJU3RhdHVzIGluZm9ybWF0aW9uIHRvIGEgZ2l2ZW4gZGlzcGxheSBzeXN0ZW0sCi0gICogc3VjaCBhcyBTV1QsIHRoZSBjb21tYW5kIGxpbmUsIG9yIGEgdHJhY2UgZmlsZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcmVuZGVyICggSVN0YXR1cyBzdGF0dXMgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0FueUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vQW55RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDBhMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vQW55RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotCi0KLS8qKgotKiBUaGlzIGlzIGEga2luZCBvZiB7QGxpbmsgRmlsdGVyfSB0aGF0IGFjY2VwdHMgYWxsIG9iamVjdHMsCi0qIGFuZCBpcyBhIHN1aXRhYmxlIGJhc2UgY2xhc3MgZm9yIG5ldyA8Y29kZT5GaWx0ZXJzPC9jb2RlPi4KLSovCi1wdWJsaWMgY2xhc3MgQW55RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5BbnlGaWx0ZXI8L2NvZGU+LgotICAqLwotICBwdWJsaWMgQW55RmlsdGVyICgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVBTllfRklMVEVSX05BTUUiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVBTllfRklMVEVSX0RFU0MiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogU2VlIHtAbGluayBGaWx0ZXIjc3RhdHVzT2Z9IGZvciBnZW5lcmFsIGNvbW1lbnRzLgotICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkFueUZpbHRlcjwvY29kZT4KLSAgKiByZXR1cm5zIGEgc3RhdHVzIHdpdGggc2V2ZXJpdHkgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4uCi0gICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0gICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbHRlci4KLSAgKiBAcmV0dXJuIEFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1c30uCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLFdlYlNlcnZpY2VQbHVnaW4uSUQsMCwiIixudWxsKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB7QGxpbmsgI3N0YXR1c09mfSByZXR1cm5zCi0gICogYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfSB3aXRoIGEKLSAgKiBzZXZlcml0eSBvZiBsZXNzIHRoYW4gPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4uCi0gICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhIGhpZ2hlci1wZXJmb3JtYW5jZQotICAqIGltcGxlbWVudGF0aW9uLgotICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBmaWx0ZXIuCi0gICogQHJldHVybiBUcnVlIGlmIGFuZCBvbmx5IGlmIHtAbGluayAjc3RhdHVzT2Z9IHJldHVybnMKLSAgKiBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9IHdpdGggYQotICAqIHNldmVyaXR5IG9mIGxlc3MgdGhhbiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyAoIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgcmV0dXJuICFzdGF0dXNPZihvYmplY3QpLm1hdGNoZXMoSVN0YXR1cy5FUlJPUik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0Vudmlyb25tZW50VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0Vudmlyb25tZW50VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2ZDE0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9FbnZpcm9ubWVudFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlRyYW5zaWVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVByb2dyZXNzTW9uaXRvcjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbnZpcm9ubWVudFV0aWxzCi17Ci0gIC8qKgotICAgKiBAcGFyYW0gZW52Ci0gICAqIEByZXR1cm4gSVByb2dyZXNzTW9uaXRvcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldElQcm9ncmVzc01vbml0b3IoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAkgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgIAkgSVByb2dyZXNzTW9uaXRvciBlY2xpcHNlTW9uaXRvciA9IG51bGw7Ci0gICAgIAkgaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKQotICAgICAJIHsKLSAgICAgCSAJZWNsaXBzZU1vbml0b3IgPSAoKEVjbGlwc2VQcm9ncmVzc01vbml0b3IpbW9uaXRvcikuZ2V0TW9uaXRvcigpOwotICAgICAJIH0KLSAgICAgCSByZXR1cm4gZWNsaXBzZU1vbml0b3I7Ci0gIH0KLSAgCi0gIAotICAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGVudiBUaGlzIHNob3VsZCBiZSBhbiBFY2xpcHNlRW52aXJvbm1lbnQuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFJlc291cmNlQ29udGV4dC4KLSAgICovIAotICBwdWJsaWMgc3RhdGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoIEVudmlyb25tZW50IGVudiApCi0gIHsKLSAgICBSZXNvdXJjZUNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0gICAgCi0gICAgaWYoIGVudiBpbnN0YW5jZW9mIEVjbGlwc2VFbnZpcm9ubWVudCApCi0gICAgewotICAgICAgY29udGV4dCA9ICgoRWNsaXBzZUVudmlyb25tZW50KWVudikuZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb250ZXh0ID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY29udGV4dDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBpc3RhdHVzCi0gICAqIEByZXR1cm4gU3RhdHVzCi0gICAqLwotCi0gIC8qKgotICAgKiBUT0RPOiBEZWxldGUuIFRoZXJlJ3MgYSByZXBsYWNlbWVudCBpbiB0aGUgZW52IHBsdWdpbi4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0YXR1cyBjb252ZXJ0SVN0YXR1c1RvU3RhdHVzKElTdGF0dXMgaXN0YXR1cykKLSAgewotICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgU3RyaW5nIG1lc3NhZ2UgPSBpc3RhdHVzLmdldE1lc3NhZ2UoKTsKLSAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSBpc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgaW50IG5vT2ZDaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICBpZiAobm9PZkNoaWxkcmVuID4gMCkKLSAgICB7Ci0gICAgICBTdGF0dXNbXSBzdGF0dXNDaGlsZHJlbiA9IG5ldyBTdGF0dXNbbm9PZkNoaWxkcmVuXTsKLSAgICAgIGZvciAoaW50IGk9MDtpPG5vT2ZDaGlsZHJlbjtpKyspCi0gICAgICB7Ci0gICAgICAgIHN0YXR1c0NoaWxkcmVuW2ldID0gY29udmVydElTdGF0dXNUb1N0YXR1cyhjaGlsZHJlbltpXSk7Ci0gICAgICB9Ci0KLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbWVzc2FnZSxzdGF0dXNDaGlsZHJlbik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgc2V2ZXJpdHkgPSBpc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0gICAgICBpbnQgc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuT0s7Ci0gICAgICBzd2l0Y2ggKHNldmVyaXR5KQotICAgICAgewotICAgICAgICBjYXNlIElTdGF0dXMuRVJST1I6Ci0gICAgICAgICAgc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuRVJST1I7Ci0gICAgICAgIAlicmVhazsKLSAgICAgICAgY2FzZSBJU3RhdHVzLldBUk5JTkc6Ci0gICAgICAgICAgc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuV0FSTklORzsKLSAgICAgICAgCWJyZWFrOwotICAgICAgICBjYXNlIElTdGF0dXMuSU5GTwk6Ci0gICAgICAgICAgc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuSU5GTzsKLSAgICAgICAgCWJyZWFrOyAgICAgIAkKLSAgICAgICAgY2FzZSBJU3RhdHVzLk9LOgotICAgICAgICAgIHN0YXR1c1NldmVyaXR5ID0gU3RhdHVzLk9LOwotICAgICAgICAJYnJlYWs7ICAgICAgCQotICAgICAgICBkZWZhdWx0OgotICAgICAgfQotICAgICAgVGhyb3dhYmxlIGUgPSBpc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtZXNzYWdlLHN0YXR1c1NldmVyaXR5LGUpOwotICAgIH0KLSAgICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogVE9ETzogRGVsZXRlLiBUaGVyZSdzIGEgcmVwbGFjZW1lbnQgaW4gdGhlIGVudiBwbHVnaW4uIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJU3RhdHVzIGNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoU3RhdHVzIHN0YXR1cywgU3RyaW5nIHBsdWdpbklkKQotICB7Ci0gICAgSVN0YXR1cyBpc3RhdHVzOwotICAgIFN0cmluZyBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLSAgICBUaHJvd2FibGUgdGhyb3dhYmxlID0gc3RhdHVzLmdldFRocm93YWJsZSgpOwotICAgIGlmIChzdGF0dXMuaGFzQ2hpbGRyZW4oKSkKLSAgICB7Ci0gICAgICBTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgICAgaW50IG5vT2ZDaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICAgIElTdGF0dXNbXSBpc3RhdHVzQ2hpbGRyZW4gPSBuZXcgSVN0YXR1c1tub09mQ2hpbGRyZW5dOwotICAgICAgZm9yIChpbnQgaT0wO2k8bm9PZkNoaWxkcmVuO2krKykKLSAgICAgIHsKLSAgICAgICAgaXN0YXR1c0NoaWxkcmVuW2ldID0gY29udmVydFN0YXR1c1RvSVN0YXR1cyhjaGlsZHJlbltpXSwgcGx1Z2luSWQpOwotICAgICAgfQotCi0gICAgICBpc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklkLDAsaXN0YXR1c0NoaWxkcmVuLG1lc3NhZ2UsdGhyb3dhYmxlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotICAgICAgaW50IGlzdGF0dXNTZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0gICAgICBzd2l0Y2ggKHNldmVyaXR5KQotICAgICAgewotICAgICAgICBjYXNlIFN0YXR1cy5FUlJPUjoKLSAgICAgICAgICBpc3RhdHVzU2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotICAgICAgICAJYnJlYWs7Ci0gICAgICAgIGNhc2UgU3RhdHVzLldBUk5JTkc6Ci0gICAgICAgICAgaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotICAgICAgICAJYnJlYWs7Ci0gICAgICAgIGNhc2UgU3RhdHVzLklORk86Ci0gICAgICAgICAgaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotICAgICAgICAJYnJlYWs7ICAgICAgCQotICAgICAgICBjYXNlIFN0YXR1cy5PSzoKLSAgICAgICAgICBpc3RhdHVzU2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotICAgICAgICAJYnJlYWs7ICAgICAgCQotICAgICAgICBkZWZhdWx0OgotICAgICAgfSAgICAgIAotICAgICAgaXN0YXR1cyA9IG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKGlzdGF0dXNTZXZlcml0eSxwbHVnaW5JZCwwLG1lc3NhZ2UsdGhyb3dhYmxlKTsKLSAgICB9Ci0gICAgICAKLSAgICByZXR1cm4gaXN0YXR1czsKLSAgfSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmMGJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGEgY2xhc3Mgb2Ygb2JqZWN0cyB0aGF0IGZpbHRlcgotKiBvdGhlciBvYmplY3RzIGZvciBpbmNsdXNpb24gb3IgZXhjbHVzaW9uIGJ5IHNvbWUgY29uc3VtZXIuCi0qLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXIKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9Ci0gICogZGVzY3JpYmluZyB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPidzIGFzc2Vzc21lbnQgb2YKLSAgKiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4KLSAgKiBUaGUgc2V2ZXJpdHkgb2YgdGhlCi0gICogcmV0dXJuZWQgPGNvZGU+SVN0YXR1czwvY29kZT4gaXMgYXMgZm9sbG93czoKLSAgKiA8dWw+Ci0gICogPGxpPgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNPS30KLSAgKiBpZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBhY2NlcHRzIHRoZSA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICogd2l0aCBubyBmdXJ0aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgY2FsbGVyIChtZWFuaW5nIHRoZQotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRNZXNzYWdlfSBhbmQKLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjZ2V0RXhjZXB0aW9ufSBtZXRob2RzCi0gICogYXJlIGlnbm9yZWQpLgotICAqIDxsaT4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjSU5GT30KLSAgKiBpZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBhY2NlcHRzIHRoZSA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2V9IGFuZAotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRFeGNlcHRpb259IG1ldGhvZHMuCi0gICogPGxpPgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNXQVJOSU5HfQotICAqIGlmIHRoZSA8Y29kZT5GaWx0ZXI8L2NvZGU+IGFjY2VwdHMgdGhlIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2V9IGFuZAotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRFeGNlcHRpb259IG1ldGhvZHMuCi0gICogPGxpPgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNFUlJPUn0KLSAgKiBpZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBkb2VzIG5vdCBhY2NlcHQgdGhlIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2V9IGFuZAotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRFeGNlcHRpb259IG1ldGhvZHMuCi0gICogPC91bD4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gQW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApOwotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LiBUaGlzIG1ldGhvZAotICAqIG11c3QgcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYge0BsaW5rICNzdGF0dXNPZn0KLSAgKiByZXR1cm5zIGFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IHdpdGggYSBzZXZlcml0eSBvZgotICAqIGxlc3MgdGhhbiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzICggT2JqZWN0IG9iamVjdCApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vSVByb2plY3RUb1N0cmluZ1RyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9JUHJvamVjdFRvU3RyaW5nVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAzMDAwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9JUHJvamVjdFRvU3RyaW5nVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLQotCi0vKioKLSAqIFRyYW5zZnJvbXMgYSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2plY3QgdG8gamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgSVByb2plY3RUb1N0cmluZ1RyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIgewotCQotCSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotCSAgewotCSAgCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpdmFsdWU7Ci0JICAgIHJldHVybiBwcm9qZWN0LmdldE5hbWUoKTsKLQkgIH0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTk4ZGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA4LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLQotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqLwotcHVibGljIGNsYXNzIEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeSB7Ci0JCi0gCQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMVVJJKFNlcnZpY2VJbXBsIHNlcnZpY2VJbXBsKQotICB7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBzZXJ2aWNlSW1wbC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gIAlTdHJpbmcgbG9jYXRpb24gPSBkZWZpbml0aW9uLmdldExvY2F0aW9uKCk7Ci0gIAkKLSAgCXJldHVybiBsb2NhdGlvbjsKLSAgfQotICAgCi0gIC8vaGFzIHRvIGJlIHVuZGVyIHRoZSB3ZWJjb250ZW50Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQl9DT05URU5UID0gIldlYkNvbnRlbnQiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMVVJJKFNlcnZpY2VSZWYgc2VydmljZUltcGwpCi0gIHsKLSAgCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc2VydmljZUltcGwpOwotICAJSVBhdGggcGF0aCA9IHByb2plY3QuZ2V0TG9jYXRpb24oKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAJcGF0aCA9IHBhdGguYXBwZW5kKFdFQl9DT05URU5UKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAJcGF0aCA9IHBhdGguYXBwZW5kKHNlcnZpY2VJbXBsLmdldFdzZGxGaWxlKCkpOwotICAJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aC50b1N0cmluZygpKTsKLSAgCXRyeXsKLSAgCSAgVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKLSAgCSAgcmV0dXJuIHVybC50b1N0cmluZygpOwotICAJfWNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXtyZXR1cm4gbnVsbDt9Ci0gIAkKLSB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMVVJJKFdTRExSZXNvdXJjZUltcGwgd3NkbFJJKQotICB7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsUkkuZ2V0RGVmaW5pdGlvbigpOwotICAJU3RyaW5nIGxvY2F0aW9uID0gZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpOwotICAJCi0gIAlyZXR1cm4gbG9jYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTSUxQYXRoKFdTRExSZXNvdXJjZUltcGwgd3NkbFJJKQotICB7Ci0gIAlyZXR1cm4gY29udmVydFRvUmVsYXRpdmUoZ2V0V1NETFVSSSh3c2RsUkkpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NJTFBhdGgoU2VydmljZVJlZiBzZXJ2aWNlSW1wbCkKLSAgewotICAJcmV0dXJuIGNvbnZlcnRUb1JlbGF0aXZlKGdldFdTRExVUkkoc2VydmljZUltcGwpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NJTFBhdGgoU2VydmljZUltcGwgc2VydmljZUltcGwpCi0gIHsKLSAgCXJldHVybiBjb252ZXJ0VG9SZWxhdGl2ZShnZXRXU0RMVVJJKHNlcnZpY2VJbXBsKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTEU9ImZpbGU6LyI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTEVMPSJmaWxlOiI7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9SZWxhdGl2ZShTdHJpbmcgdXJpKQotICB7Ci0gIAkvL3JlbW92ZSBmaWxlOgotICAJU3RyaW5nIHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLSAgICByb290ID0gRklMRSArIHJvb3Q7Ci0gIAlTdHJpbmcgcm9vdEwgPSBGSUxFTCArIHJvb3Q7Ci0gICAgaWYodXJpLnN0YXJ0c1dpdGgocm9vdCkgfHwgdXJpLnN0YXJ0c1dpdGgocm9vdEwpKXsKLSAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKHJvb3QubGVuZ3RoKCkpOyAgCQotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KMkVFVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjVkZmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5BZGRNb2R1bGVUb0VBUlByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uSUVBUk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvamVjdC5FSkJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSUVKQk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5KMkVFV2ViTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBzb21lIHVzZWZ1bCBKMkVFIHV0aWxpdGllcy4KLSAqIAotICogQGF1dGhvciBQZXRlciBNb29nawotICogQGRhdGUgQXVndXN0IDIzLCAyMDAxCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKMkVFVXRpbHMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB3ZWJQcm9qZWN0TmF0dXJlID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRTsgLy8gSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZWpiUHJvamVjdE5hdHVyZSA9IElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEU7IC8vIElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlYXJQcm9qZWN0TmF0dXJlID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRTsgLy8gSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQ7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKMkVFIHZlcnNpb24gaWQgKGRlZmluZWQgaW4gSjJFRVZlcnNpb25Db25zdGFudHMpIG9mIHRoZQotCSAqIHByb2plY3QuIElmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGhhdmUgYSBKMkVFTmF0dXJlLCAtMSBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqIEByZXR1cm4gdGhlIEoyRUUgdmVyc2lvbiBpZCAoZGVmaW5lZCBpbiBKMkVFVmVyc2lvbkNvbnN0YW50cyksIC0xIGlmIHAKLQkgKiAgICAgICAgIGRvZXMgbm90IGhhdmUgYSBKMkVFTmF0dXJlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgbW9kdWxlJ3MgajJlZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SjJFRVZlcnNpb24oSVByb2plY3QgcCkgewotCQlpbnQgajJlZVZlciA9IC0xOwotCQlTdHJ1Y3R1cmVFZGl0IG1jID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudFtdIHdiY3MgPSBtYy5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCQlpZiAod2Jjcy5sZW5ndGghPTApIHsKLQkJCQlqMmVlVmVyID0gZ2V0V2ViTW9kdWxlSjJFRVZlcnNpb24od2Jjc1swXSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCWZpbmFsbHl7Ci0JCQlpZiAobWMhPW51bGwpCi0JCQkJbWMuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBqMmVlVmVyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEoyRUVWZXJzaW9uQXNTdHJpbmcoSVByb2plY3QgcCl7Ci0JCWludCBqMmVlVmVyID0gZ2V0SjJFRVZlcnNpb24ocCk7Ci0JCWlmIChqMmVlVmVyIT0tMSl7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoajJlZVZlcik7Ci0JCX0KLQkJZWxzZSAKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBXZWIgTW9kdWxlJ3MgSjJFRSB2ZXJzaW9uCi0JICogQHBhcmFtIHdiTW9kdWxlCi0JICogQHJldHVybiB0aGUgSjJFRSB2ZXJzaW9uIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0V2ViTW9kdWxlSjJFRVZlcnNpb24oV29ya2JlbmNoQ29tcG9uZW50IHdiTW9kdWxlKSB7Ci0JCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbnVsbDsKLQkJaW50IG5WZXJzaW9uID0gMTI7Ci0JCXRyeSB7Ci0JCQl3ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQod2JNb2R1bGUpOwotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkgewotCQkJCW5WZXJzaW9uID0gd2ViRWRpdC5nZXRKMkVFVmVyc2lvbigpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3ZWJFZGl0ICE9IG51bGwpCi0JCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIG5WZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYWxsIG9mIHRoZSBFQVIgcHJvamVjdHMgdGhhdCByZWZlcmVuY2UgdGhlIHNwZWNpZmllZAotCSAqIHByb2plY3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBUk5hdHVyZVJ1bnRpbWVbXSBnZXRFQVJQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQotCQlFQVJOYXR1cmVSdW50aW1lW10gZWFycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMocHJvamVjdCk7Ci0JCXJldHVybiBlYXJzOwotCX0KLQkJCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFQVJQcm9qZWN0TmFtZXNGb3JXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJVmVjdG9yIEVBUk5hbWVzID0gbmV3IFZlY3RvcigpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlFQVJOYXR1cmVSdW50aW1lW10gZWFycyA9IGdldEVBUlByb2plY3RzKHByb2plY3QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRUFSTmFtZXMuYWRkKGVhcnNbaV0uZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEVBUk5hbWVzLmlzRW1wdHkoKSA/IG51bGwgOiAoU3RyaW5nW10pIEVBUk5hbWVzCi0JCQkJLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyBhbGwgb2YgdGhlIEVBUiBwcm9qZWN0cyB0aGF0IHJlZmVyZW5jZSB0aGUgc3BlY2lmaWVkCi0JICogZWpiIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBFQVJOYXR1cmVSdW50aW1lW10gZ2V0RUpCRUFSUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCkgewotCQlFQVJOYXR1cmVSdW50aW1lW10gZWFycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMocHJvamVjdCk7Ci0JCXJldHVybiBlYXJzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RUFSUHJvamVjdE5hbWVzRm9yRUpCUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVZlY3RvciBFQVJOYW1lcyA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJRUFSTmF0dXJlUnVudGltZVtdIGVhcnMgPSBnZXRFSkJFQVJQcm9qZWN0cyhwcm9qZWN0KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWFycy5sZW5ndGg7IGkrKykgewotCQkJCUVBUk5hbWVzLmFkZChlYXJzW2ldLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBFQVJOYW1lcy5pc0VtcHR5KCkgPyBudWxsIDogKFN0cmluZ1tdKSBFQVJOYW1lcwotCQkJCS50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRUFSTmF0dXJlUnVudGltZVtdIGdldEFwcENsaWVudEVBUlByb2plY3RzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJRUFSTmF0dXJlUnVudGltZVtdIGVhcnMgPSBKMkVFUHJvamVjdFV0aWxpdGllcwotCQkJCS5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpOwotCQlyZXR1cm4gZWFyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFQVIgbmF0dXJlIHJ1bnRpbWUgZnJvbSBhbiBFQVIgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBJUHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIEVBUiBwcm9qZWN0Ci0JICogQHJldHVybiBFQVJOYXR1cmVSdW50aW1lIG9mIHRoZSBwcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBFQVJOYXR1cmVSdW50aW1lIGdldEVBUk5hdHVyZVJ1bnRpbWVGcm9tUHJvamVjdCgKLQkJCUlQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBFQVIgbmFtZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgd2ViIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFQVJOYW1lcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJzID0gZ2V0RUFSUHJvamVjdHMocHJvamVjdCk7Ci0JCVN0cmluZ1tdIGVhck5hbWVzID0gbmV3IFN0cmluZ1tlYXJzID09IG51bGwgPyAwIDogZWFycy5sZW5ndGhdOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBlYXJOYW1lcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCWVhck5hbWVzW2luZGV4XSA9IGVhcnNbaW5kZXhdLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlyZXR1cm4gZWFyTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogRmluZCBhbGwgRUpCIHByb2plY3RzIGZvciBhIHBhcnRpY3VsYXIgRUFSIE5hdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmVjdG9yIG9mIEVKQk5hdHVyZVJ1bnRpbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIGdldEVKQlByb2plY3RzKEVBUk5hdHVyZVJ1bnRpbWUgZWFyKSB7Ci0JCVZlY3RvciBlamJzID0gbmV3IFZlY3RvcigpOwotCQlJdGVyYXRvciBlYXJQcm9qZWN0cyA9IGVhci5nZXRNb2R1bGVQcm9qZWN0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGVhclByb2plY3RzLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iamVjdCA9IGVhclByb2plY3RzLm5leHQoKTsKLQotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJSjJFRU5hdHVyZSBqMmVlTmF0dXJlID0gKEoyRUVOYXR1cmUpIG9iamVjdDsKLQotCQkJCWlmIChqMmVlTmF0dXJlIGluc3RhbmNlb2YgRUpCTmF0dXJlUnVudGltZSkgewotCQkJCQllamJzLmFkZChqMmVlTmF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWpiczsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGFsbCBXZWIgcHJvamVjdHMgZm9yIGEgcGFydGljdWxhciBFQVIgTmF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gYSB2ZWN0b3Igb2YgSjJFRVdlYk5hdHVyZVJ1bnRpbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIGdldFdlYlByb2plY3RzKEVBUk5hdHVyZVJ1bnRpbWUgZWFyKSB7Ci0JCVZlY3RvciB3ZWJQcm9qZWN0cyA9IG5ldyBWZWN0b3IoKTsKLQkJSXRlcmF0b3IgZWFyUHJvamVjdHMgPSBlYXIuZ2V0TW9kdWxlUHJvamVjdHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChlYXJQcm9qZWN0cy5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBlYXJQcm9qZWN0cy5uZXh0KCk7Ci0KLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCUoyRUVOYXR1cmUgajJlZU5hdHVyZSA9IChKMkVFTmF0dXJlKSBvYmplY3Q7Ci0KLQkJCQlpZiAoajJlZU5hdHVyZSBpbnN0YW5jZW9mIEoyRUVXZWJOYXR1cmVSdW50aW1lKSB7Ci0JCQkJCXdlYlByb2plY3RzLmFkZChqMmVlTmF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gd2ViUHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiByZXR1cm5zIGEgbGlzdCBvZiBwcm9qZWN0cyBuYW1lcyBmb3IgYSBnaXZlbiBlYXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFSkJQcm9qZWN0TmFtZXMoRUFSTmF0dXJlUnVudGltZSBlYXIpIHsKLQkJVmVjdG9yIGVqYk5hdHVyZXMgPSBnZXRFSkJQcm9qZWN0cyhlYXIpOwotCQlTdHJpbmdbXSBlamJQcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW2VqYk5hdHVyZXMuc2l6ZSgpXTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZWpiUHJvamVjdE5hbWVzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJZWpiUHJvamVjdE5hbWVzW2luZGV4XSA9ICgoRUpCTmF0dXJlUnVudGltZSkgKGVqYk5hdHVyZXMKLQkJCQkJLmVsZW1lbnRBdChpbmRleCkpKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGVqYlByb2plY3ROYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHJldHVybnMgYSBWZWN0b3Igb2YgYmVhbiBTdHJpbmcgbmFtZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgZ2V0QmVhbk5hbWVzKEVKQkphciBqYXIpIHsKLQkJLy8gV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucy4KLQkJLy8gTGlzdCBjbXBCZWFucyA9IGphci5nZXRCZWFuTWFuYWdlZEJlYW5zKCk7Ci0JCS8vIExpc3QgYm1wQmVhbnMgPSBqYXIuZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0JCUxpc3Qgc2Vzc2lvbkJlYW5zID0gamFyLmdldFNlc3Npb25CZWFucygpOwotCi0JCVZlY3RvciBuYW1lcyA9IG5ldyBWZWN0b3IoKTsKLQotCQkvLyBnZXRCZWFuTmFtZXMoIG5hbWVzLCBjbXBCZWFucyApOwotCQkvLyBnZXRCZWFuTmFtZXMoIG5hbWVzLCBibXBCZWFucyApOwotCQlnZXRCZWFuTmFtZXMobmFtZXMsIHNlc3Npb25CZWFucyk7Ci0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lcwotCSAqICAgICAgICAgICAgc3BlY2lmaWVzIHRoYXQgdmVjdG9yIG9mIHN0cmluZ3MgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWRkIGJlYW4KLQkgKiAgICAgICAgICAgIG5hbWVzIHRvLgotCSAqIEBwYXJhbSBiZWFucwotCSAqICAgICAgICAgICAgc3BlY2lmaWVzIGEgbGlzdCBvZiBiZWFucy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEJlYW5OYW1lcyhWZWN0b3IgbmFtZXMsIExpc3QgYmVhbnMpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBiZWFucy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIChpdGVyYXRvci5uZXh0KCkpOwotCi0JCQlpZiAoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJCVNlc3Npb24gc2Vzc2lvbkJlYW4gPSAoU2Vzc2lvbikgYmVhbjsKLQotCQkJCWlmIChzZXNzaW9uQmVhbi5nZXRTZXNzaW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gU2Vzc2lvblR5cGUuU1RBVEVMRVNTKSB7Ci0JCQkJCW5hbWVzLmFkZChiZWFuLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBXZWJQcm9qZWN0LCBnaXZlbiB0aGUgRUpCCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbUVKQihFbnRlcnByaXNlQmVhbiBlamIpIHsKLQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlamIpOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBhcnJheSBvZiBJUHJvamVjdCwgZ2l2ZW4gYSBWZWN0b3Igb2YgSjJFRU5hdHVyZSdzCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldElQcm9qZWN0c0Zyb21KMkVFTmF0dXJlcyhWZWN0b3IgajJlZW5hdHVyZVZlY3RvcikgewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gbmV3IElQcm9qZWN0W2oyZWVuYXR1cmVWZWN0b3IgPT0gbnVsbAotCQkJCT8gMAotCQkJCTogajJlZW5hdHVyZVZlY3Rvci5zaXplKCldOwotCQlFbnVtZXJhdGlvbiBlID0gajJlZW5hdHVyZVZlY3Rvci5lbGVtZW50cygpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlKMkVFTmF0dXJlIG5hdHVyZSA9IChKMkVFTmF0dXJlKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbmF0dXJlLmdldFByb2plY3QoKTsKLQkJCXByb2plY3RzW2ldID0gcHJvamVjdDsKLQkJCWkrKzsKLQkJfQotCi0JCXJldHVybiBwcm9qZWN0czsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0RUFSUHJvamVjdHMoKSB7Ci0JCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLS8vCQkJCWlmIChwcm9qZWN0c1tpXS5oYXNOYXR1cmUoSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKSB7Ci0JCQkJaWYgKFJlc291cmNlVXRpbHMuaXNFQVJQcm9qZWN0KHByb2plY3RzW2ldKSkgewotCQkJCQl2LmFkZChwcm9qZWN0c1tpXSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQkJfQotCi0JCX0KLQkJSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFt2LnNpemUoKV07Ci0JCXYuY29weUludG8oZWFyUHJvamVjdHMpOwotCQlyZXR1cm4gZWFyUHJvamVjdHM7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXQgYSBKMkVFIDEuMiBFQVIgUHJvamVjdC4gUmV0dXJucyBudWxsIGlmIG5vIEoyRUUgMS4yIEVBUiBQcm9qZWN0cwotCSAqIGV4aXN0Ci0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBUk5hdHVyZVJ1bnRpbWUgZ2V0MTJFQVIoKSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIGFsbEVBUnMgPSBnZXRFQVJQcm9qZWN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFQVJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gcmV0dXJuIHRoZSBmaXJzdCAxLjIgRUFSIGVuY291bnRlcmVkCi0JCQkJRUFSTmF0dXJlUnVudGltZSB0aGlzRUFSID0gKEVBUk5hdHVyZVJ1bnRpbWUpIChhbGxFQVJzW2ldCi0JCQkJCQkuZ2V0TmF0dXJlKElFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSk7Ci0JCQkJaWYgKHRoaXNFQVIuZ2V0SjJFRVZlcnNpb24oKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCkgewotCQkJCQlyZXR1cm4gdGhpc0VBUjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vIGhhbmRsZSBleGNlcHRpb24KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0MTJFQVJQcm9qZWN0KCl7Ci0JCXRyeXsKLQkJCUlQcm9qZWN0W10gYWxsRUFScyA9IGdldEVBUlByb2plY3RzKCk7Ci0JCQlmb3IgKGludCBpPTA7aTxhbGxFQVJzLmxlbmd0aDtpKyspewotCQkJCS8vIHJldHVybiB0aGUgZmlyc3QgMS4yIEVBUiBwcm9qZWN0Ci0JCQkJSVByb2plY3QgZWFyID0gYWxsRUFSc1tpXTsKLQkJCQlpZiAoZ2V0SjJFRVZlcnNpb25Bc1N0cmluZyhlYXIpLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkoyRUVfVkVSU0lPTl8xXzIpKXsKLQkJCQkJcmV0dXJuIGVhcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBKMkVFIDEuMyBFQVIgUHJvamVjdC4gUmV0dXJucyBudWxsIGlmIG5vIEoyRUUgMS4zIEVBUiBQcm9qZWN0cwotCSAqIGV4aXN0Ci0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBUk5hdHVyZVJ1bnRpbWUgZ2V0MTNFQVIoKSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIGFsbEVBUnMgPSBnZXRFQVJQcm9qZWN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFQVJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gcmV0dXJuIHRoZSBmaXJzdCAxLjMgRUFSIGVuY291bnRlcmVkCi0JCQkJRUFSTmF0dXJlUnVudGltZSB0aGlzRUFSID0gKEVBUk5hdHVyZVJ1bnRpbWUpIChhbGxFQVJzW2ldCi0JCQkJCQkuZ2V0TmF0dXJlKElFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSk7Ci0JCQkJaWYgKHRoaXNFQVIuZ2V0SjJFRVZlcnNpb24oKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkgewotCQkJCQlyZXR1cm4gdGhpc0VBUjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoqCi0JICogR2V0IGEgSjJFRSAxLjMgRUFSIFByb2plY3QuIFJldHVybnMgbnVsbCBpZiBubyBKMkVFIDEuMyBFQVIgUHJvamVjdHMgZXhpc3RzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0MTNFQVJQcm9qZWN0KCl7Ci0JCXRyeXsKLQkJCUlQcm9qZWN0W10gYWxsRUFScyA9IGdldEVBUlByb2plY3RzKCk7Ci0JCQlmb3IgKGludCBpPTA7aTxhbGxFQVJzLmxlbmd0aDtpKyspewotCQkJCS8vIHJldHVybiB0aGUgZmlyc3QgMS4zIEVBUiBwcm9qZWN0Ci0JCQkJSVByb2plY3QgZWFyID0gYWxsRUFSc1tpXTsKLQkJCQlpZiAoZ2V0SjJFRVZlcnNpb25Bc1N0cmluZyhlYXIpLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkoyRUVfVkVSU0lPTl8xXzMpKXsKLQkJCQkJcmV0dXJuIGVhcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdmVyc2lvbklkCi0JICogQHJldHVybgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFQVJOYXR1cmVSdW50aW1lIGdldEVBUihpbnQgdmVyc2lvbklkKSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIGFsbEVBUnMgPSBnZXRFQVJQcm9qZWN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFQVJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRUFSTmF0dXJlUnVudGltZSB0aGlzRUFSID0gKEVBUk5hdHVyZVJ1bnRpbWUpIChhbGxFQVJzW2ldCi0JCQkJCQkuZ2V0TmF0dXJlKElFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSk7Ci0JCQkJaWYgKHRoaXNFQVIuZ2V0SjJFRVZlcnNpb24oKSA9PSB2ZXJzaW9uSWQpIHsKLQkJCQkJcmV0dXJuIHRoaXNFQVI7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBoYW5kbGUgZXhjZXB0aW9uCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IEVBUiBwcm9qZWN0IG9mIGEgZ2l2ZW4gdmVyc2lvbiBpZAotCSAqIEBwYXJhbSB2ZXJzaW9uSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRFQVJQcm9qZWN0T2ZWZXJzaW9uKGludCB2ZXJzaW9uSWQpewotCQl0cnkgewotCQkJSVByb2plY3RbXSBhbGxFQVJzID0gZ2V0RUFSUHJvamVjdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRUFScy5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9qZWN0IGVhciA9IGFsbEVBUnNbaV07Ci0JCQkJaWYgKGdldEoyRUVWZXJzaW9uKGVhcikgPT0gdmVyc2lvbklkKSB7Ci0JCQkJCXJldHVybiBlYXI7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsRnJvbUoyRUVWZXJzaW9uKFN0cmluZyBqMmVlVmVyc2lvbkludCkgewotCQlpZiAoajJlZVZlcnNpb25JbnQgPT0gbnVsbCB8fCBqMmVlVmVyc2lvbkludC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOwotCi0JCWludCBqMmVlVmVyc2lvbiA9IEludGVnZXIucGFyc2VJbnQoajJlZVZlcnNpb25JbnQpOwotCQlzd2l0Y2ggKGoyZWVWZXJzaW9uKSB7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUOwotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80X1RFWFQ7Ci0JCQlkZWZhdWx0IDoKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoaXMgaXMgbm90IGEgSjJFRSB2ZXJzaW9uISEiKTsKLQkJCQlyZXR1cm4gIiI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKMkVFVmVyc2lvbkZyb21MYWJlbChTdHJpbmcgajJlZUxhYmVsKSB7Ci0JCVN0cmluZyBqMmVlMTJTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0JCVN0cmluZyBqMmVlMTNTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCVN0cmluZyBqMmVlMTRTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCWlmIChqMmVlTGFiZWwuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQpKQotCQkJcmV0dXJuIGoyZWUxMlN0cmluZzsKLQotCQlpZiAoajJlZUxhYmVsLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUKSkKLQkJCXJldHVybiBqMmVlMTNTdHJpbmc7Ci0KLQkJaWYgKGoyZWVMYWJlbC5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVCkpCi0JCQlyZXR1cm4gajJlZTE0U3RyaW5nOwotCi0JCXJldHVybiAiIjsKLQotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGVhciBwcm9qZWN0cyBpbiB3aGljaCB0aGlzIHByb2plY3QgaXMgYSBuZXN0ZWQgbW9kdWxlOwotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdAotCSAqIEByZXR1cm4gRUFScyBFQVIgcHJvamVjdHMsIHBvc3NpYmx5IG51bGwKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqICAgVGhpcyBtZXRob2QgaGFzIHRvbyBtdWNoIGNvbXBsZXhpdHk7IHRvIGJlIHNpbXBsaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBUk5hdHVyZVJ1bnRpbWVbXSBnZXRFQVJQcm9qZWN0cyhJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCwKLQkJCUlTZXJ2ZXIgc2VydmVyKSB7Ci0KLQkJRUFSTmF0dXJlUnVudGltZVtdIGVhclByb2plY3RzID0gbnVsbDsKLQkJRUFSTmF0dXJlUnVudGltZSBlYXIgPSBudWxsOwotCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLQotCQlpZiAoc2VydmljZVByb2plY3QgIT0gbnVsbCAmJiBzZXJ2aWNlUHJvamVjdC5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQotCQkJCUVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJzID0gbnVsbDsKLQkJCQlib29sZWFuIGlzV2ViRUpCT3JBcHBDbGllbnQgPSBSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChzZXJ2aWNlUHJvamVjdCkgLy9zZXJ2aWNlUHJvamVjdC5oYXNOYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCkKLQkJCQkJCXx8ICBSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChzZXJ2aWNlUHJvamVjdCkgLy9zZXJ2aWNlUHJvamVjdC5oYXNOYXR1cmUoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpCi0JCQkJCQl8fCAgUmVzb3VyY2VVdGlscy5pc0FwcENsaWVudFByb2plY3Qoc2VydmljZVByb2plY3QpOy8vc2VydmljZVByb2plY3QuaGFzTmF0dXJlKElBcHBsaWNhdGlvbkNsaWVudE5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpOwotCQkJCWlmICghaXNXZWJFSkJPckFwcENsaWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQllYXJzID0gSjJFRVByb2plY3RVdGlsaXRpZXMKLQkJCQkJCS5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHNlcnZpY2VQcm9qZWN0KTsKLQotCQkJCS8vIHNlcGFyYXRlIEVBUnMgd2hpY2ggYXJlIGFscmVhZHkgZGVwbG95ZWQgdG8gdGhlIGV4aXN0aW5nCi0JCQkJLy8gc2VydmVyCi0JCQkJaWYgKGVhcnMgIT0gbnVsbCAmJiBlYXJzLmxlbmd0aCA+PSAxKSB7Ci0JCQkJCUFycmF5TGlzdCBwcmVmZXJyZWRFQVJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlBcnJheUxpc3Qgc2Vjb25kYXJ5RUFSTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQllYXIgPSBlYXJzW2ldOwotCQkJCQkJZWFyUHJvamVjdCA9IGVhci5nZXRQcm9qZWN0KCk7Ci0JCQkJCQlJTW9kdWxlIG1vZHVsZSA9IFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpOwotCQkJCQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKHNlcnZlciAhPSBudWxsCi0JCQkJCQkJCQl8fCBTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHNlcnZlciwKLQkJCQkJCQkJCQkJbW9kdWxlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKSkgewotCQkJCQkJCQlwcmVmZXJyZWRFQVJMaXN0LmFkZChlYXIpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNlY29uZGFyeUVBUkxpc3QuYWRkKGVhcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGFkZCBzZWNvbmRhcnlFQVJMaXN0IGl0ZW1zIHRvIGVuZCBvZiBwcmltYXJ5IGxpc3QKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWNvbmRhcnlFQVJMaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCQlwcmVmZXJyZWRFQVJMaXN0LmFkZChzZWNvbmRhcnlFQVJMaXN0LmdldChqKSk7Ci0JCQkJCX0KLQkJCQkJLy8gdG9BcnJheQotCQkJCQlpZiAocHJlZmVycmVkRUFSTGlzdCAhPSBudWxsKSB7Ci0JCQkJCQllYXJQcm9qZWN0cyA9IChFQVJOYXR1cmVSdW50aW1lW10pIHByZWZlcnJlZEVBUkxpc3QKLQkJCQkJCQkJLnRvQXJyYXkobmV3IEVBUk5hdHVyZVJ1bnRpbWVbMF0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGNlKSB7Ci0JCQkJTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0JCQkJbG9nLmxvZyhMb2cuRVJST1IsIDUwMzksIEoyRUVVdGlscy5jbGFzcywgImdldEVBUlByb2plY3RzIiwgY2UpOwotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVhclByb2plY3RzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IEVBUiBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdCBhbmQgc2VydmVyCi0JICogQHBhcmFtIHNlcnZpY2VQcm9qZWN0Ci0JICogQHBhcmFtIHNlcnZlcgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0RGVmYXVsdEVBUlByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QsIElTZXJ2ZXIgc2VydmVyKSB7Ci0KLQkJSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IG51bGw7Ci0JCUlQcm9qZWN0IGVhciA9IG51bGw7Ci0KLQkJaWYgKHNlcnZpY2VQcm9qZWN0ICE9IG51bGwgJiYgc2VydmljZVByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0KLQkJCQlib29sZWFuIGlzV2ViRUpCT3JBcHBDbGllbnQgPSBSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChzZXJ2aWNlUHJvamVjdCkgLy9zZXJ2aWNlUHJvamVjdC5oYXNOYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCkKLQkJCQkJCXx8ICBSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChzZXJ2aWNlUHJvamVjdCkgLy9zZXJ2aWNlUHJvamVjdC5oYXNOYXR1cmUoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpCi0JCQkJCQl8fCAgUmVzb3VyY2VVdGlscy5pc0FwcENsaWVudFByb2plY3Qoc2VydmljZVByb2plY3QpOy8vc2VydmljZVByb2plY3QuaGFzTmF0dXJlKElBcHBsaWNhdGlvbkNsaWVudE5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpOwotCQkJCWlmICghaXNXZWJFSkJPckFwcENsaWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlJUHJvamVjdFtdIGVhcnMgPSBnZXRFQVJQcm9qZWN0cygpOwotCi0JCQkJLy8gc2VwYXJhdGUgRUFScyB3aGljaCBhcmUgYWxyZWFkeSBkZXBsb3llZCB0byB0aGUgZXhpc3RpbmcKLQkJCQkvLyBzZXJ2ZXIKLQkJCQlpZiAoZWFycyAhPSBudWxsICYmIGVhcnMubGVuZ3RoID49IDEpIHsKLQkJCQkJQXJyYXlMaXN0IHByZWZlcnJlZEVBUkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUFycmF5TGlzdCBzZWNvbmRhcnlFQVJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWVhciA9IGVhcnNbaV07Ci0JCQkJCQlJTW9kdWxlIG1vZHVsZSA9IFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhcik7Ci0JCQkJCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoc2VydmVyICE9IG51bGwKLQkJCQkJCQkJCXx8IFNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoc2VydmVyLAotCQkJCQkJCQkJCQltb2R1bGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpKSB7Ci0JCQkJCQkJCXByZWZlcnJlZEVBUkxpc3QuYWRkKGVhcik7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2Vjb25kYXJ5RUFSTGlzdC5hZGQoZWFyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gYWRkIHNlY29uZGFyeUVBUkxpc3QgaXRlbXMgdG8gZW5kIG9mIHByaW1hcnkgbGlzdAotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlY29uZGFyeUVBUkxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJCXByZWZlcnJlZEVBUkxpc3QuYWRkKHNlY29uZGFyeUVBUkxpc3QuZ2V0KGopKTsKLQkJCQkJfQotCQkJCQkvLyB0b0FycmF5Ci0JCQkJCWlmIChwcmVmZXJyZWRFQVJMaXN0ICE9IG51bGwpIHsKLQkJCQkJCWVhclByb2plY3RzID0gKElQcm9qZWN0W10pIHByZWZlcnJlZEVBUkxpc3QudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGNlKSB7Ci0JCQkJTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0JCQkJbG9nLmxvZyhMb2cuRVJST1IsIDUwMzksIEoyRUVVdGlscy5jbGFzcywgImdldEVBUlByb2plY3RzIiwgY2UpOwotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVhclByb2plY3RzWzBdOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIEVKQiBwcm9qZWN0cyBpbiB0aGUgZWFycwotCSAqIAotCSAqIEBwYXJhbSBlYXJQcm9qZWN0cwotCSAqIEByZXR1cm4gcHJvamVjdHMgRUpCIHByb2plY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEVKQjJfMFByb2plY3RzRnJvbUVBUlMoRUFSTmF0dXJlUnVudGltZVtdIGVhclByb2plY3RzKSB7Ci0JCWlmIChlYXJQcm9qZWN0cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQXJyYXlMaXN0IGVqYlByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWFyUHJvamVjdHNbaV0gaW5zdGFuY2VvZiBFQVJOYXR1cmVSdW50aW1lKSB7Ci0JCQkJRUFSTmF0dXJlUnVudGltZSBlYXIgPSAoRUFSTmF0dXJlUnVudGltZSkgZWFyUHJvamVjdHNbaV07Ci0JCQkJTWFwIHByb2plY3RzSW5FQVIgPSBlYXIuZ2V0TW9kdWxlUHJvamVjdHMoKTsKLQkJCQlpZiAocHJvamVjdHNJbkVBUiAhPSBudWxsICYmICFwcm9qZWN0c0luRUFSLmlzRW1wdHkoKSkgewotCQkJCQlJdGVyYXRvciBpdGVyID0gcHJvamVjdHNJbkVBUi52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCU9iamVjdCBNT0ZPYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChNT0ZPYmplY3QgaW5zdGFuY2VvZiBFSkJOYXR1cmVSdW50aW1lKSB7Ci0JCQkJCQkJaWYgKCgoRUpCTmF0dXJlUnVudGltZSkgTU9GT2JqZWN0KQotCQkJCQkJCQkJLmdldE1vZHVsZVZlcnNpb24oKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKSB7Ci0JCQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoKEVKQk5hdHVyZVJ1bnRpbWUpIE1PRk9iamVjdCkKLQkJCQkJCQkJCQkuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJCQllamJQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvciBlYXJQcm9qZWN0cyBsb29wCi0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSBlamJQcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFswXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFSkIgcHJvamVjdHMgaW4gdGhlIGVhcnMKLQkgKiAKLQkgKiBAcGFyYW0gZWFyUHJvamVjdHMKLQkgKiBAcmV0dXJuIHByb2plY3RzIEVKQiBwcm9qZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRFSkJQcm9qZWN0c0Zyb21FQVJTKAotCQkJRUFSTmF0dXJlUnVudGltZVtdIGVhclByb2plY3RzKSB7Ci0JCWlmIChlYXJQcm9qZWN0cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQXJyYXlMaXN0IGVqYlByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWFyUHJvamVjdHNbaV0gaW5zdGFuY2VvZiBFQVJOYXR1cmVSdW50aW1lKSB7Ci0JCQkJRUFSTmF0dXJlUnVudGltZSBlYXIgPSAoRUFSTmF0dXJlUnVudGltZSkgZWFyUHJvamVjdHNbaV07Ci0JCQkJTWFwIHByb2plY3RzSW5FQVIgPSBlYXIuZ2V0TW9kdWxlUHJvamVjdHMoKTsKLQkJCQlpZiAocHJvamVjdHNJbkVBUiAhPSBudWxsICYmICFwcm9qZWN0c0luRUFSLmlzRW1wdHkoKSkgewotCQkJCQlJdGVyYXRvciBpdGVyID0gcHJvamVjdHNJbkVBUi52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCU9iamVjdCBNT0ZPYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChNT0ZPYmplY3QgaW5zdGFuY2VvZiBFSkJOYXR1cmVSdW50aW1lKSB7Ci0KLQkJCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKChFSkJOYXR1cmVSdW50aW1lKSBNT0ZPYmplY3QpCi0JCQkJCQkJCQkuZ2V0UHJvamVjdCgpOwotCQkJCQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJZWpiUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQkJCQkJCX0KLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IC8vIGVuZCBmb3IgZWFyUHJvamVjdHMgbG9vcAotCi0JCXJldHVybiAoSVByb2plY3RbXSkgZWpiUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBjb21iaW5lUHJvamVjdEFycmF5cyhJUHJvamVjdFtdIHByb2plY3RBcnJheTEsCi0JCQlJUHJvamVjdFtdIHByb2plY3RBcnJheTIpIHsKLQotCQkvLyBjaGVjayBpZiBlaXRoZXIgb3IgYm90aCBhcnJheXMgYXJlIG51bGwuCi0JCWlmIChwcm9qZWN0QXJyYXkxID09IG51bGwgJiYgcHJvamVjdEFycmF5MiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKHByb2plY3RBcnJheTEgIT0gbnVsbCAmJiBwcm9qZWN0QXJyYXkyID09IG51bGwpCi0JCQlyZXR1cm4gcHJvamVjdEFycmF5MTsKLQkJZWxzZSBpZiAocHJvamVjdEFycmF5MSA9PSBudWxsICYmIHByb2plY3RBcnJheTIgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9qZWN0QXJyYXkyOwotCi0JCUlQcm9qZWN0W10gY29tYmluZWRQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtwcm9qZWN0QXJyYXkxLmxlbmd0aAotCQkJCSsgcHJvamVjdEFycmF5Mi5sZW5ndGhdOwotCi0JCVN5c3RlbS5hcnJheWNvcHkocHJvamVjdEFycmF5MSwgMCwgY29tYmluZWRQcm9qZWN0cywgMCwKLQkJCQlwcm9qZWN0QXJyYXkxLmxlbmd0aCk7Ci0JCWlmIChwcm9qZWN0QXJyYXkyLmxlbmd0aCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJvamVjdEFycmF5MiwgMCwgY29tYmluZWRQcm9qZWN0cywKLQkJCQkJcHJvamVjdEFycmF5MS5sZW5ndGgsIHByb2plY3RBcnJheTIubGVuZ3RoKTsKLQkJfQotCi0JCXJldHVybiBjb21iaW5lZFByb2plY3RzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIFdlYiBwcm9qZWN0cyBpbiB0aGUgZWFyKHMpCi0JICogCi0JICogQHBhcmFtIGVhclByb2plY3RzCi0JICogQHJldHVybiBwcm9qZWN0cyBXZWIgcHJvamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0V2ViUHJvamVjdHNGcm9tRUFSUygKLQkJCUVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJQcm9qZWN0cykgewotCQlpZiAoZWFyUHJvamVjdHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUFycmF5TGlzdCB3ZWJQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVhclByb2plY3RzW2ldIGluc3RhbmNlb2YgRUFSTmF0dXJlUnVudGltZSkgewotCQkJCUVBUk5hdHVyZVJ1bnRpbWUgZWFyID0gKEVBUk5hdHVyZVJ1bnRpbWUpIGVhclByb2plY3RzW2ldOwotCQkJCU1hcCBwcm9qZWN0c0luRUFSID0gZWFyLmdldE1vZHVsZVByb2plY3RzKCk7Ci0JCQkJaWYgKHByb2plY3RzSW5FQVIgIT0gbnVsbCAmJiAhcHJvamVjdHNJbkVBUi5pc0VtcHR5KCkpIHsKLQkJCQkJSXRlcmF0b3IgaXRlciA9IHByb2plY3RzSW5FQVIudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQkvLyBJUHJvamVjdE5hdHVyZSBuYXR1cmUgPQotCQkJCQkJLy8gaXRlci5uZXh0KCkuZ2V0TmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpOwotCQkJCQkJT2JqZWN0IE1PRk9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKE1PRk9iamVjdCBpbnN0YW5jZW9mIEoyRUVXZWJOYXR1cmVSdW50aW1lKSB7Ci0JCQkJCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSjJFRVdlYk5hdHVyZVJ1bnRpbWUpIE1PRk9iamVjdCkKLQkJCQkJCQkJCS5nZXRQcm9qZWN0KCk7Ci0JCQkJCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJCQl3ZWJQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZW5kIGZvciBlYXJQcm9qZWN0cyBsb29wCi0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSB3ZWJQcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFswXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCMl8wUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0KLQkJaWYgKFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQl0cnkgewotCi0JCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKQotCQkJCQkJJiYgRUpCTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3QpCi0JCQkJCQkJCS5nZXRNb2R1bGVWZXJzaW9uKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBhbiBFQVIgMS4yIG9yIEVBUiAxLjMKLQkgKiBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYW4gRUFSIDEuMiBvciBhbiBFQVIgMS4zIFByb2plY3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFQVJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFQVJBc3NvY2lhdGVkKElQcm9qZWN0IG1vZHVsZSwgSVByb2plY3QgRUFSKSB7Ci0KLQkJRUFSTmF0dXJlUnVudGltZVtdIGVhcnMgPSBnZXRFQVJQcm9qZWN0cyhtb2R1bGUsIG51bGwpOwotCQlpZiAoZWFycyAhPSBudWxsICYmIGVhcnMubGVuZ3RoICE9IDApIHsKLQkJCVZlY3RvciBFQVJOYW1lcyA9IG5ldyBWZWN0b3IoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWFycy5sZW5ndGg7IGkrKykgewotCQkJCUVBUk5hbWVzLmFkZChlYXJzW2ldLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQkJfQotCQkJU3RyaW5nW10gZWFyTmFtZXMgPSAoU3RyaW5nW10pIEVBUk5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCQlpZiAoQXJyYXlzLmJpbmFyeVNlYXJjaChlYXJOYW1lcywgRUFSLmdldE5hbWUoKSkgPj0gMCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzb2NpYXRlV2ViUHJvamVjdChJUHJvamVjdCBtb2R1bGUsIElQcm9qZWN0IEVBUlByb2plY3QpIHsKLQkJdHJ5IHsKLQotCQkJU3RyaW5nIHVyaSA9IG1vZHVsZS5nZXROYW1lKCkgKyAiLndhciI7Ci0JCQlTdHJpbmcgY29udGV4dFJvb3QgPSBtb2R1bGUuZ2V0TmFtZSgpOwotCQkJQWRkTW9kdWxlVG9FQVJQcm9qZWN0Q29tbWFuZCBhbWllYyA9IG5ldyBBZGRNb2R1bGVUb0VBUlByb2plY3RDb21tYW5kKAotCQkJCQltb2R1bGUsIEVBUlByb2plY3QsIHVyaSwgY29udGV4dFJvb3QsIG51bGwpOwotCQkJaWYgKGFtaWVjLmNhbkV4ZWN1dGUoKSkKLQkJCQlhbWllYy5leGVjdXRlKCk7Ci0JCQkvKgotCQkJICogRUFSTmF0dXJlUnVudGltZSBFQVJOYXR1cmUgPQotCQkJICogKEVBUk5hdHVyZVJ1bnRpbWUpZ2V0RUFSTmF0dXJlUnVudGltZUZyb21Qcm9qZWN0KEVBUlByb2plY3QpOwotCQkJICogCi0JCQkgKiBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IEVBUk5hdHVyZS5nZXRBcHBsaWNhdGlvbigpOyBNb2R1bGUgbW9kID0KLQkJCSAqIChNb2R1bGUpYXBwbGljYXRpb24uZ2V0Rmlyc3RNb2R1bGUobW9kdWxlLmdldE5hbWUoKSk7Ci0JCQkgKiBFQVJFZGl0TW9kZWwgZWRtID0gRUFSTmF0dXJlLmdldEVhckVkaXRNb2RlbEZvclJlYWQoKTsKLQkJCSAqIGVkbS5hZGRNb2R1bGVNYXBwaW5nKG1vZCwgRUFSUHJvamVjdCk7IGVkbS5yZWxlYXNlQWNjZXNzKCk7Ci0JCQkgKiAKLQkJCSAqLwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzb2NpYXRlRUpCUHJvamVjdChJUHJvamVjdCBlamJQcm9qZWN0LAotCQkJSVByb2plY3QgRUFSUHJvamVjdCkgewotCQl0cnkgewotCQkJU3RyaW5nIHVyaSA9IGVqYlByb2plY3QuZ2V0TmFtZSgpICsgIi5qYXIiOwotCQkJU3RyaW5nIGNvbnRleHRSb290ID0gZWpiUHJvamVjdC5nZXROYW1lKCk7Ci0JCQlBZGRNb2R1bGVUb0VBUlByb2plY3RDb21tYW5kIGFtaWVjID0gbmV3IEFkZE1vZHVsZVRvRUFSUHJvamVjdENvbW1hbmQoCi0JCQkJCWVqYlByb2plY3QsIEVBUlByb2plY3QsIHVyaSwgY29udGV4dFJvb3QsIG51bGwpOwotCQkJaWYgKGFtaWVjLmNhbkV4ZWN1dGUoKSkKLQkJCQlhbWllYy5leGVjdXRlKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgTW9kdWxlJ3MgV0VCLUlORiBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEZpcnN0V2ViSW5mUGF0aChJUHJvamVjdCBwcm9qZWN0KXsKLQkJSVBhdGggbW9kdWxlUGF0aCA9IG51bGw7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkgIG1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJICBXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkgIAotCQkgIGlmICh3YmNzLmxlbmd0aCE9MCkgewotLy8JCQlXZWJBcnRpZmFjdEVkaXQgd2ViRWRpdCA9IG51bGw7Ci0vLwkJCXRyeSB7Ci0vLwkJCSAgd2ViRWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHdiY3NbMF0pOwotLy8JCQkgIGlmICh3ZWJFZGl0IT1udWxsKXsKLS8vCQkJCSAgSVBhdGggd2ViWE1MUGF0aCA9IHdlYkVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JQYXRoKCk7Ci0vLwkJCQkgIG1vZHVsZVBhdGggPSB3ZWJYTUxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLS8vCQkJCSAgU3lzdGVtLm91dC5wcmludGxuKCJXZWJNb2R1bGVQYXRoL0REUGF0aCA9ICIrbW9kdWxlUGF0aCk7Ci0vLwkJCSAgfQotLy8JCQl9Ci0vLwkJCWZpbmFsbHl7Ci0vLwkJCQlpZiAod2ViRWRpdCE9bnVsbCkKLS8vCQkJCQl3ZWJFZGl0LmRpc3Bvc2UoKTsKLS8vCQkJfQotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgd2Jjc1swXS5nZXROYW1lKCkpOwotCQkJSVZpcnR1YWxGb2xkZXIgd2ViSW5mRGlyID0gY29tcG9uZW50LmdldEZvbGRlcihuZXcgUGF0aCgiL1dFQi1JTkYiKSk7Ci0JCQltb2R1bGVQYXRoID0gd2ViSW5mRGlyLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaXJzdFdlYkluZlBhdGggPSAiICttb2R1bGVQYXRoKTsKLQkJICB9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGV4KXt9Ci0JCWZpbmFsbHl7Ci0JCQlpZiAobWMhPW51bGwpCi0JCQkJbWMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZHVsZVBhdGg7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRGaXJzdFdlYkNvbnRlbnRQYXRoKElQcm9qZWN0IHByb2plY3QpewotCQkKLQkJSVBhdGggbW9kdWxlUGF0aCA9IG51bGw7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkgIG1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJICBXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkgIGlmICh3YmNzLmxlbmd0aCE9MCkgewotLy8JCQlXZWJBcnRpZmFjdEVkaXQgd2ViRWRpdCA9IG51bGw7Ci0vLwkJCXRyeSB7Ci0vLwkJCSAgd2ViRWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHdiY3NbMF0pOwotLy8JCQkgIGlmICh3ZWJFZGl0IT1udWxsKXsKLS8vCQkJCSAgSVBhdGggd2ViWE1MUGF0aCA9IHdlYkVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JQYXRoKCk7Ci0vLwkJCQkgIG1vZHVsZVBhdGggPSB3ZWJYTUxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygyKTsKLS8vCQkJCSAgU3lzdGVtLm91dC5wcmludGxuKCJXZWJDb250ZW50IFBhdGggPSAiK21vZHVsZVBhdGgpOwotLy8JCQkgIH0KLS8vCQkJfQotLy8JCQlmaW5hbGx5ewotLy8JCQkJaWYgKHdlYkVkaXQhPW51bGwpCi0vLwkJCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0vLwkJCX0KLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIHdiY3NbMF0uZ2V0TmFtZSgpKTsKLQkJCW1vZHVsZVBhdGggPSBjb21wb25lbnQuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpcnN0V2ViQ29udGVudFBhdGggPSAiICttb2R1bGVQYXRoKTsKLQkJICB9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGV4KXt9Ci0JCWZpbmFsbHl7Ci0JCQlpZiAobWMhPW51bGwpCi0JCQkJbWMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZHVsZVBhdGg7CQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRGaXJzdFdlYkNvbnRlbnRDb250YWluZXIoSVByb2plY3QgcHJvamVjdCl7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKLQkJSVBhdGggbW9kdWxlUGF0aCA9IGdldEZpcnN0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JCUlSZXNvdXJjZSByZXMgPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShtb2R1bGVQYXRoKTsKLQkJaWYgKHJlcyE9bnVsbCl7Ci0JCSAgY29udGFpbmVyID0gcmVzLmdldFBhcmVudCgpOwotCQl9CQkKLQkJICAKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgTW9kdWxlIG5hbWUgCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RXZWJNb2R1bGVOYW1lKElQcm9qZWN0IHByb2plY3QpewotCQlTdHJpbmcgbW9kdWxlTmFtZSA9IG51bGw7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkgIG1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJICBXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkgIGlmICh3YmNzLmxlbmd0aCE9MCkgewotCQkJICBtb2R1bGVOYW1lID0gd2Jjc1swXS5nZXROYW1lKCk7Ci0JCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlyc3QgTW9kdWxlIG5hbWUgPSAiK21vZHVsZU5hbWUpOwotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpe30KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kdWxlTmFtZTsJCQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vSmF2YU1PRlV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KYXZhTU9GVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4Y2RiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KYXZhTU9GVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YUNsYXNzSW1wbDsKLQotLyoqCi0qIFRoaXMgY2xhc3MgY29udGFpbnMgc29tZSB1c2VmdWwgdXRpbGl0aWVzIGZvciBkZWFsaW5nIHdpdGggdGhlIEphdmFNT0YKLSovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhTU9GVXRpbHMKLXsKLSAvKioKLSAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIG9mIHRoZSBnaXZlbiBuYW1lIGlzIGxvYWRhYmxlIGluIHRoZSBnaXZlbgotICAqIHByb2plY3QuCi0gICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGlzIGxvYWRhYmxlIGFuZCBubyBleGNlcHRpb25zIGFyZSB0aHJvd24uIAotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGFzc0xvYWRhYmxlKFN0cmluZyBjbGFzc05hbWUsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgIAlyZXR1cm4gaXNDbGFzc0xvYWRhYmxlKGdldEphdmFDbGFzcyhjbGFzc05hbWUscHJvamVjdCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NMb2FkYWJsZShKYXZhQ2xhc3MgamF2YUNsYXNzKQotICB7Ci0JcmV0dXJuIGphdmFDbGFzcy5pc0V4aXN0aW5nVHlwZSgpOyAgICAKLSAgfQotCi0gIC8qKgotICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaGFzIGEgcHVibGljIGNvbnN0cnVjdG9yCi0gICogd2l0aCBhbiBlbXB0eSBwYXJhbWV0ZXIgbGlzdC4KLSAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MKLSAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdAotICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2xhc3MgaXMgbG9hZGFibGUgZnJvbSB0aGUgcHJvamVjdCBhbmQgdGhlIAotICAqICAgICAgICAgY2xhc3MgaGFzIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggYW4gZW1wdHkgcGFyYW1ldGVyIGxpc3QgIAotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHVibGljRGVmYXVsdEN0b3IoU3RyaW5nIGNsYXNzTmFtZSwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBoYXNQdWJsaWNEZWZhdWx0Q3RvcihnZXRKYXZhQ2xhc3MoY2xhc3NOYW1lLCBwcm9qZWN0KSk7Ci0gIH0KLQotCi0gcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1B1YmxpY0RlZmF1bHRDdG9yKEphdmFDbGFzcyBqYXZhQ2xhc3MpCi0gIHsKLSAgIAotICAgIExpc3QgbWV0aG9kTGlzdCA9IGphdmFDbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgaWYgKG1ldGhvZExpc3Q9PW51bGwpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIEl0ZXJhdG9yIGlNZXRob2RzID0gbWV0aG9kTGlzdC5pdGVyYXRvcigpOwotICAgIGJvb2xlYW4gdXNlckRlZmluZWRDdG9yID0gZmFsc2U7Ci0gICAgd2hpbGUgKGlNZXRob2RzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBNZXRob2QgdGhpc01ldGhvZCA9IChNZXRob2QpaU1ldGhvZHMubmV4dCgpOwotCi0gICAgICBpZiAodGhpc01ldGhvZC5pc0NvbnN0cnVjdG9yKCkpCi0gICAgICB7Ci0gICAgICAgIHVzZXJEZWZpbmVkQ3RvciA9IHRydWU7IAotCi0gICAgICAgIC8vU2luY2UgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBjdG9yLCB0aGUgZGVmYXVsdCBjdG9yIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCi0gICAgICAgIC8vV2UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgdXNlciBoYXMgcHJvdmlkZWQgYSBwdWJsaWMgY3RvciB3aXRoIG5vIHBhcmFtZXRlcnMuCi0KLSAgICAgICAgLy9jaGVjayBpZiBwdWJsaWMKLSAgICAgICAgaWYgKHRoaXNNZXRob2QuZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpID09IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUMpCi0gICAgICAgIHsKLSAgICAgICAgICAvL3NlZSBpZiBwYXJhbWV0ZXIgbGlzdCBpcyBlbXB0eQotICAgICAgICAgIExpc3QgcGFyYW1MaXN0ID0gdGhpc01ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgaWYgKHBhcmFtTGlzdC5pc0VtcHR5KCkgKQotICAgICAgICAgIHsKLQkgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLQotICAgIGlmICh1c2VyRGVmaW5lZEN0b3IpCi0gICAgewotCSAgcmV0dXJuIGZhbHNlOyAvL2lmIHRoZSB1c2VyIGRlZmluZWQgYSBjdG9yIGFuZCB3ZSBzdGlsbCBoYXZlbid0Ci0JICAJICAgICAgICAgICAgLy9yZXR1cm5lZCB0cnVlLCBub25lIG9mIHRoZW0gd2VyZSBwdWJsaWMgd2l0aCBubyBwYXJhbWV0ZXJzLgotICAgIH0KLSAgICBlbHNlCi0gICAgeyAKLSAgICAgICByZXR1cm4gdHJ1ZTsgICAgCi0gICAgfQotCi0gIH0KLSAgLyoqCi0gICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlLgotICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcwotICAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgaW50ZXJmYWNlCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGFuZCBpbnRlcmZhY2UgYXJlIGxvYWRhYmxlIGZyb20gdGhlIHByb2plY3QgYW5kCi0gICogICAgICAgICB0aGUgY2xhc3MgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlLgotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW1wbGVtZW50c0ludGVyZmFjZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgSVByb2plY3QgcHJvamVjdCkKLSAgCQkJdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgcmV0dXJuIGltcGxlbWVudHNJbnRlcmZhY2UoZ2V0SmF2YUNsYXNzKGNsYXNzTmFtZSwgcHJvamVjdCksIGdldEphdmFDbGFzcyhpbnRlcmZhY2VOYW1lLCBwcm9qZWN0KSk7Ci0gIH0KLQotcHVibGljIHN0YXRpYyBib29sZWFuIGltcGxlbWVudHNJbnRlcmZhY2UoSmF2YUNsYXNzIGphdmFDbGFzcywgSmF2YUNsYXNzIGludGVyZmFjZUNsYXNzKQotICB7Ci0gICAKLSAgICBpZiAoIWphdmFDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFpbnRlcmZhY2VDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICByZXR1cm4gamF2YUNsYXNzLmltcGxlbWVudHNJbnRlcmZhY2UoaW50ZXJmYWNlQ2xhc3MpOwotICB9Ci0KLSAgLyoqCi0gICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBleHRlbmRzIHRoZSBzcGVjaWZpZWQgc3VwZXJjbGFzcwotICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcwotICAqIEBwYXJhbSBzdXBlckNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHN1cGVyY2xhc3MKLSAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdAotICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2xhc3MgYW5kIHN1cGVyQ2xhc3MgYXJlIGxvYWRhYmxlIGZyb20gdGhlIHByb2plY3QgYW5kCi0gICogICAgICAgICB0aGUgY2xhc3MgZXh0ZW5kcyB0aGUgc3VwZXJDbGFzcwotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXh0ZW5kc0NsYXNzKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBzdXBlckNsYXNzTmFtZSwgSVByb2plY3QgcHJvamVjdCkKLSAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5kc0NsYXNzKGdldEphdmFDbGFzcyhjbGFzc05hbWUscHJvamVjdCksIGdldEphdmFDbGFzcyhzdXBlckNsYXNzTmFtZSwgcHJvamVjdCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4dGVuZHNDbGFzcyhKYXZhQ2xhc3MgamF2YUNsYXNzLCBKYXZhQ2xhc3Mgc3VwZXJDbGFzcykKLSAgewotICAgIHJldHVybiBzdXBlckNsYXNzLmlzQXNzaWduYWJsZUZyb20oamF2YUNsYXNzKTsKLSAgfQotCi0gIC8qKgotICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYWN0dWFsbHkgYW4gaW50ZXJmYWNlCi0gICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGlzIGxvYWRhYmxlIGZyb20gdGhlIHByb2plY3QgYW5kIGlzIAotICAqICAgICAgICAgYWN0dWFsbHkgYW4gaW50ZXJmYWNlCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludGVyZmFjZShTdHJpbmcgY2xhc3NOYW1lLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgIHJldHVybiBpc0ludGVyZmFjZShnZXRKYXZhQ2xhc3MoY2xhc3NOYW1lLCBwcm9qZWN0KSk7Ci0gIH0KLQotIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludGVyZmFjZShKYXZhQ2xhc3MgamF2YUNsYXNzKQotICB7Ci0gICAgICByZXR1cm4gamF2YUNsYXNzLmlzSW50ZXJmYWNlKCk7Ci0gIH0KLSBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQWJzdHJhY3RNZXRob2RzIChTdHJpbmcgY2xhc3NOYW1lLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotIAl7Ci0JICAgIHJldHVybiBoYXNBYnN0cmFjdE1ldGhvZHMoZ2V0SmF2YUNsYXNzKGNsYXNzTmFtZSwgcHJvamVjdCkpOwotICAJfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNBYnN0cmFjdE1ldGhvZHMgKEphdmFDbGFzcyBqYXZhQ2xhc3MpCi0gCXsKLQkgICBMaXN0IG1ldGhvZExpc3QgPSBqYXZhQ2xhc3MuZ2V0TWV0aG9kcygpOwotICAgICAgIGlmIChtZXRob2RMaXN0PT1udWxsKQotICAgICAgCXJldHVybiBmYWxzZTsKLQotCSAgIEl0ZXJhdG9yIGlNZXRob2RzID0gbWV0aG9kTGlzdC5pdGVyYXRvcigpOwotCSAgIHdoaWxlIChpTWV0aG9kcy5oYXNOZXh0KCkpCi0gICAgCXsKLSAgICAgIAkJTWV0aG9kIHRoaXNNZXRob2QgPSAoTWV0aG9kKWlNZXRob2RzLm5leHQoKTsKLQkJCWlmICggdGhpc01ldGhvZC5pc0Fic3RyYWN0KCkpIHJldHVybiB0cnVlOwotCSAgIAl9Ci0JCXJldHVybiBmYWxzZTsKLSAJfQotCi0gcHVibGljIHN0YXRpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKFN0cmluZyBjbGFzc05hbWUgLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotIAl7Ci0gCQlKYXZhRU1GTmF0dXJlIGpNT0YgPSAoSmF2YUVNRk5hdHVyZSlKYXZhRU1GTmF0dXJlLmNyZWF0ZVJ1bnRpbWUocHJvamVjdCk7Ci0gICAgCXJldHVybiAgKEphdmFDbGFzcylKYXZhQ2xhc3NJbXBsLnJlZmxlY3QoY2xhc3NOYW1lLCBqTU9GLmdldFJlc291cmNlU2V0KCkpOwotIAl9Ci0KLSBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFNFSUZpbGUoSmF2YUNsYXNzIGJlYW5DbGFzcywgSmF2YUNsYXNzIHNlaUNsYXNzKQotIAl7Ci0gCQlpZiAoIXNlaUNsYXNzLmlzSW50ZXJmYWNlKCkpCi0gCQkJcmV0dXJuIGZhbHNlOwotCi0JCVZlY3RvciBiZWFuTWV0aG9kc0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gCQlMaXN0IGJlYW5NZXRob2RzID0gYmVhbkNsYXNzLmdldE1ldGhvZHMoKTsKLQkJSXRlcmF0b3IgYmVhbk1ldGhvZHNJdGVyYXRvciA9IGJlYW5NZXRob2RzLml0ZXJhdG9yKCk7Ci0JICAgCXdoaWxlIChiZWFuTWV0aG9kc0l0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAJewotICAgICAgCQlNZXRob2QgdGhpc01ldGhvZCA9IChNZXRob2QpYmVhbk1ldGhvZHNJdGVyYXRvci5uZXh0KCk7Ci0JCQliZWFuTWV0aG9kc0xpc3QuYWRkKHRoaXNNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLQkgICAJfQotCi0JCUxpc3Qgc2VpTWV0aG9kcyA9IHNlaUNsYXNzLmdldE1ldGhvZHMoKTsKLSAJCWlmIChiZWFuTWV0aG9kcyA9PSBudWxsICkgewotIAkJCWlmICggc2VpTWV0aG9kcyA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLSAJCQllbHNlCXJldHVybiBmYWxzZTsKLSAJCX0KLQkJaWYgKHNlaU1ldGhvZHMgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCi0JCUl0ZXJhdG9yIHNlaU1ldGhvZHNJdGVyYXRvciA9IHNlaU1ldGhvZHMuaXRlcmF0b3IoKTsKLQkgICAJd2hpbGUgKHNlaU1ldGhvZHNJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgCXsKLSAgICAgIAkJTWV0aG9kIHRoaXNNZXRob2QgPSAoTWV0aG9kKXNlaU1ldGhvZHNJdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoICFiZWFuTWV0aG9kc0xpc3QuY29udGFpbnModGhpc01ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCSAgIAl9Ci0JCXJldHVybiB0cnVlOwotIAkJCi0gCX0KLSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1Jlc291cmNlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1Jlc291cmNlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxYjQwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9SZXNvdXJjZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmNvbXBvbmVudGNvcmUudXRpbC5BcHBDbGllbnRBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmNvbXBvbmVudGNvcmUudXRpbC5FSkJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmVjbGlwc2UuRWNsaXBzZUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklVUkxQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHVzZWZ1bCBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggRWNsaXBzZSByZXNvdXJjZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZVV0aWxzIHsKLQotCS8vCi0JLy8gS2VlcHMgdGhlIElXb3Jrc3BhY2VSb290IGhhbmdpbmcgYXJvdW5kLiBTZWUgZ2V0V29ya3NwYWNlUm9vdCgpLgotCS8vCi0JcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZVJvb3Qgcm9vdF8gPSBudWxsOwotCi0JLy8KLQkvLyBLZWVwcyB0aGUgSVdvcmtzcGFjZSBoYW5naW5nIGFyb3VuZC4gU2VlIGdldFdvcmtzcGFjZSgpLgotCS8vCi0JcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZSB3b3Jrc3BhY2VfID0gbnVsbDsKLQotCS8qKgotCSAqIEFzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UHJvamVjdFR5cGUgZ2V0UHJvamVjdFR5cGUoKX0sIGluZGljYXRlcyB0aGF0Ci0JICogdGhlIGdpdmVuIHByb2plY3QgaGFzIG5vIEphdmEgb3IgV2ViIG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGUgUFJPSkVDVF9UWVBFX05PTkUgPSAwOwotCi0JLyoqCi0JICogQXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRQcm9qZWN0VHlwZSBnZXRQcm9qZWN0VHlwZSgpfSwgaW5kaWNhdGVzIHRoYXQKLQkgKiB0aGUgZ2l2ZW4gcHJvamVjdCBoYXMgYSBKYXZhIHByb2plY3QgbmF0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBQUk9KRUNUX1RZUEVfSkFWQSA9IDE7Ci0KLQkvKioKLQkgKiBBcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFByb2plY3RUeXBlIGdldFByb2plY3RUeXBlKCl9LCBpbmRpY2F0ZXMgdGhhdAotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyBhIFdlYiBwcm9qZWN0IG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGUgUFJPSkVDVF9UWVBFX1dFQiA9IDI7Ci0KLQkvKioKLQkgKiBBcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFByb2plY3RUeXBlIGdldFByb2plY3RUeXBlKCl9LCBpbmRpY2F0ZXMgdGhhdAotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyBhbiBFSkIgcHJvamVjdCBuYXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlIFBST0pFQ1RfVFlQRV9FSkIgPSA0OwotCi0JLyoqCi0JICogU3RhdHVzIENvZGUgZXhwbGFpbmluZyB0aGUgQ29yZUV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlamJQcm9qZWN0TmF0dXJlID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRTsKLQkvLyBrc2MgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVqYjJQcm9qZWN0TmF0dXJlID0KLQkvLyBJRUpCTmF0dXJlQ29uc3RhbnRzLkVKQl8yMF9OQVRVUkVfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgU09BUCBycGNyb3V0ZXIgc2VydmxldCBleHRlbnNpb24gdG8gYmUgYWRkZWQgdG8gd2ViIHByb2plY3QgVVJMCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9FWFQgPSAiL3NlcnZsZXQvcnBjcm91dGVyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NMSUVOVF9XRUJfUFJPSkVDVF9FWFQgPSAiQ2xpZW50IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FSkJfUFJPSkVDVF9OQU1FID0gIldlYlNlcnZpY2VFSkJQcm9qZWN0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XRUJfUFJPSkVDVF9OQU1FID0gIldlYlNlcnZpY2VQcm9qZWN0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ST1VURVJfUFJPSkVDVF9FWFQgPSAiUm91dGVyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFUlZJQ0VfRUFSX1BST0pFQ1RfTkFNRSA9ICJXZWJTZXJ2aWNlRUFSIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DTElFTlRfRUFSX1BST0pFQ1RfTkFNRSA9ICJXZWJTZXJ2aWNlQ2xpZW50RUFSIjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElXb3Jrc3BhY2VSb290IG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBJV29ya3NwYWNlUm9vdCBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewotCQlpZiAocm9vdF8gPT0gbnVsbCkgewotCQkJcm9vdF8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQl9Ci0JCXJldHVybiByb290XzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJV29ya3NwYWNlIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBJV29ya3NwYWNlIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlpZiAod29ya3NwYWNlXyA9PSBudWxsKSB7Ci0JCQlpZiAocm9vdF8gPT0gbnVsbCkgewotCQkJCXJvb3RfID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCX0KLQkJCXdvcmtzcGFjZV8gPSByb290Xy5nZXRXb3Jrc3BhY2UoKTsKLQkJfQotCQlyZXR1cm4gd29ya3NwYWNlXzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgSVJlc291cmNlfW9mIHRoZQotCSAqIGdpdmVuIGFic29sdXRlIHBhdGhuYW1lIG9yIG51bGwgaWYgbm8gc3VjaCByZXNvdXJjZSBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZShTdHJpbmcgYWJzb2x1dGVQYXRobmFtZSkgewotCQlpZiAoYWJzb2x1dGVQYXRobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmluZFJlc291cmNlKG5ldyBQYXRoKGFic29sdXRlUGF0aG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgSVJlc291cmNlfW9mIHRoZQotCSAqIGdpdmVuIGFic29sdXRlIHBhdGggb3IgbnVsbCBpZiBubyBzdWNoIHJlc291cmNlIGV4aXN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gYWJzb2x1dGVQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgPGNvZGU+SVBhdGg8L2NvZGU+IG9mIHRoZSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZShJUGF0aCBhYnNvbHV0ZVBhdGgpIHsKLQkJaWYgKGFic29sdXRlUGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZmluZE1lbWJlcihhYnNvbHV0ZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gc3RyaW5nIGFzIGEgbmFtZSBmb3IgYSByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4gdHlwZShzKS4KLQkgKiBUaGlzIG1ldGhvZCBvYmV5cyB0aGUgY29udHJhY3Qgb2YKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSN2YWxpZGF0ZU5hbWUgSVdvcmtzcGFjZS52YWxpZGF0ZU5hbWUoKX0uCi0JICogCi0JICogQHBhcmFtIHNlZ21lbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHRvIHZhbGlkYXRlLgotCSAqIEBwYXJhbSB0eXBlTWFzawotCSAqICAgICAgICAgICAgVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gdHlwZSBvciB0eXBlcy4KLQkgKiBAcmV0dXJuIFRoZSBzdGF0dXMgd2l0aCBhIHZhbHVlIGlmIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBwYXRoCi0JICogICAgICAgICBpcyB2YWxpZCwgb3Igd2l0aCBhcHByb3ByaWF0ZSBzZXZlcml0eSBhbmQgbWVzc2FnZSBpbmZvcm1hdGlvbiBpZgotCSAqICAgICAgICAgdGhlIHBhdGggaXMgbm90IHZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZU5hbWUoU3RyaW5nIHNlZ21lbnQsIGludCB0eXBlTWFzaykgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlTmFtZShzZWdtZW50LCB0eXBlTWFzayk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiBzdHJpbmcgYXMgdGhlIHBhdGggb2YgYSByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4KLQkgKiB0eXBlKHMpLiBUaGlzIG1ldGhvZCBvYmV5cyB0aGUgY29udHJhY3Qgb2YKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZSN2YWxpZGF0ZVBhdGggSVdvcmtzcGFjZS52YWxpZGF0ZVBhdGgoKX0uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHRvIHZhbGlkYXRlLgotCSAqIEBwYXJhbSB0eXBlTWFzawotCSAqICAgICAgICAgICAgVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4gdHlwZSBvciB0eXBlcy4KLQkgKiBAcmV0dXJuIFRoZSBzdGF0dXMgd2l0aCBhIHZhbHVlIGlmIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBwYXRoCi0JICogICAgICAgICBpcyB2YWxpZCwgb3Igd2l0aCBhcHByb3ByaWF0ZSBzZXZlcml0eSBhbmQgbWVzc2FnZSBpbmZvcm1hdGlvbiBpZgotCSAqICAgICAgICAgdGhlIHBhdGggaXMgbm90IHZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVBhdGgoU3RyaW5nIHBhdGgsIGludCB0eXBlTWFzaykgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlUGF0aChwYXRoLCB0eXBlTWFzayk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiBKYXZhIHR5cGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBKYXZhIHR5cGUgbmFtZS4KLQkgKiBAcmV0dXJuIFRoZSBzdGF0dXMgd2l0aCBhIHZhbHVlIG9mIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBuYW1lCi0JICogICAgICAgICBpcyB2YWxpZCwgb3Igd2l0aCBhcHByb3ByaWF0ZSBzZXZlcml0eSBhbmQgbWVzc2FnZSBpbmZvcm1hdGlvbiBpZgotCSAqICAgICAgICAgbmFtZSBpcyBub3QgdmFsaWQuIFRoZSBwcmltaXRpdmUgdHlwZXMgKGJvb2xlYW4sIGNoYXIsIGJ5dGUsCi0JICogICAgICAgICBzaG9ydCwgaW50LCBsb25nLCBmbG9hdCwgZG91YmxlKSBhcmUgdmFsaWQuIEFycmF5cyBvZiB2YWxpZCB0eXBlcwotCSAqICAgICAgICAgYXJlIHRoZW1zZWx2ZXMgdmFsaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSmF2YVR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSkgewotCQkvLwotCQkvLyBTdHJpcCBvZmYgdGhlIHRyYWlsaW5nIGFycmF5IGJpdHMsIGlmIGFueS4KLQkJLy8KLQkJaW50IGEgPSB0eXBlTmFtZS5pbmRleE9mKCdbJyk7Ci0JCWlmIChhID4gMCkgewotCQkJdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgYSk7Ci0JCX0KLQkJLy8KLQkJLy8gQWxsb3cgcHJpbWl0aXZlcy4KLQkJLy8KLQkJaWYgKGlzUHJpbWl0aXZlSmF2YVR5cGUodHlwZU5hbWUpKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBXZWJTZXJ2aWNlUGx1Z2luLklELCAwLCAiIiwgbnVsbCk7Ci0JCX0KLQkJLy8KLQkJLy8gRGVmZXIgdG8gSmF2YUNvbnZlbnRpb25zLgotCQkvLwotCQlyZXR1cm4gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKHR5cGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnR5cGVOYW1lPC9jb2RlPiBpcyBhIEphdmEgcHJpbWl0aXZlCi0JICogKGJvb2xlYW4sIGNoYXIsIGJ5dGUsIHNob3J0LCBpbnQsIGxvbmcsIGZsb2F0LCBkb3VibGUpLgotCSAqIAotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdHlwZSBuYW1lIGlzIGEgSmF2YSBwcmltaXRpdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlSmF2YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiAodHlwZU5hbWUuZXF1YWxzKCJib29sZWFuIikgfHwgdHlwZU5hbWUuZXF1YWxzKCJjaGFyIikKLQkJCQl8fCB0eXBlTmFtZS5lcXVhbHMoImJ5dGUiKSB8fCB0eXBlTmFtZS5lcXVhbHMoInNob3J0IikKLQkJCQl8fCB0eXBlTmFtZS5lcXVhbHMoImludCIpIHx8IHR5cGVOYW1lLmVxdWFscygibG9uZyIpCi0JCQkJfHwgdHlwZU5hbWUuZXF1YWxzKCJmbG9hdCIpIHx8IHR5cGVOYW1lLmVxdWFscygiZG91YmxlIikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhbmRsZSBvZiB0aGUgSVByb2plY3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+LiBOZWl0aGVyIHRoZSBnaXZlbiBwYXRoIG5vciB0aGUgcHJvamVjdCBuZWVkCi0JICogZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4gVGhlIHBhdGggbXVzdCBiZSBhYnNvbHV0ZSwgYW5kIG11c3QgY29uc2lzdCBvZiBhdAotCSAqIGxlYXN0IG9uZSBzZWdtZW50LgotCSAqIAotCSAqIEByZXR1cm4gQW4gSVByb2plY3QgaGFuZGxlIGZvciB0aGUgcHJvamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnaXZlbgotCSAqICAgICAgICAgPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcGF0aCBkb2VzIG5vdAotCSAqICAgICAgICAgc3BlY2lmeSBhIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0T2YoSVBhdGggYWJzb2x1dGVQYXRoKSB7Ci0JCWlmIChhYnNvbHV0ZVBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBhYnNvbHV0ZVBhdGguc2VnbWVudCgwKTsKLQkJCWlmIChwcm9qZWN0TmFtZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IGlzIGEgSmF2YSBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYSBKYXZhIFByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IGlzIGEgSmF2YSBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYSBKYXZhIFByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZUphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuICghaXNXZWJQcm9qZWN0KHByb2plY3QpICYmICFpc0FwcENsaWVudFByb2plY3QocHJvamVjdCkgJiYgIWlzRUFSUHJvamVjdChwcm9qZWN0KQotCQkJCSYmICFpc0VKQlByb2plY3QocHJvamVjdCkgJiYgaXNKYXZhUHJvamVjdChwcm9qZWN0KSk7Ci0JCS8qCi0JCSAqIHRyeSB7IFN0cmluZ1tdIG5hdHVyZXMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7Ci0JCSAqIHJldHVybiAobmF0dXJlcy5sZW5ndGggPT0gMSAmJgotCQkgKiBuYXR1cmVzWzBdLmVxdWFscyhKYXZhQ29yZS5OQVRVUkVfSUQpKTsgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7IH0KLQkJICogcmV0dXJuIGZhbHNlOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IGlzIGEgV2ViIFByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyBhIFdlYiBQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGlzV2ViID0gZmFsc2U7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkgIG1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJICBXb3JrYmVuY2hDb21wb25lbnRbXSB3YmNzID0gbWMuZ2V0V29ya2JlbmNoTW9kdWxlcygpOwotCQkgIGlmICh3YmNzLmxlbmd0aCE9MCkgewotCQkJICBpc1dlYiA9IFdlYkFydGlmYWN0RWRpdC5pc1ZhbGlkV2ViTW9kdWxlKHdiY3NbMF0pOwotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpewotCQkJLy8gaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCWZpbmFsbHl7Ci0JCQlpZiAobWMhPW51bGwpCi0JCQkJbWMuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGlzV2ViOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VBUlByb2plY3QoSVByb2plY3QgcHJvamVjdCl7Ci0JCWJvb2xlYW4gaXNFQVIgPSBmYWxzZTsKLQkJU3RydWN0dXJlRWRpdCBtYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCSAgbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkgIFdvcmtiZW5jaENvbXBvbmVudFtdIHdiY3MgPSBtYy5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCSAgaWYgKHdiY3MubGVuZ3RoIT0wKSB7Ci0JCQlFQVJBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJICBlYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQod2Jjc1swXSk7Ci0JCQkgIGlmIChlYXJFZGl0IT1udWxsKXsKLQkJCQlpc0VBUiA9IHRydWU7Ci0JCQkgIH0KLQkJCX0KLQkJCWZpbmFsbHl7Ci0JCQkJaWYgKGVhckVkaXQhPW51bGwpCi0JCQkJCWVhckVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpe30KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpc0VBUjsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBhbiBFSkIgMS4xIG9yIEVKQiAyLjAKLQkgKiBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYW4gRUpCIDEuMSBvciBhbiBFSkIgMi4wIFByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXNFSkIgPSBmYWxzZTsKLQkJU3RydWN0dXJlRWRpdCBtYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCSAgbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkgIFdvcmtiZW5jaENvbXBvbmVudFtdIHdiY3MgPSBtYy5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCSAgaWYgKHdiY3MubGVuZ3RoIT0wKSB7Ci0JCQlFSkJBcnRpZmFjdEVkaXQgZWpiRWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJICBlamJFZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQod2Jjc1swXSk7Ci0JCQkgIGlmIChlamJFZGl0IT1udWxsKXsKLQkJCQlpc0VKQiA9IHRydWU7Ci0JCQkgIH0KLQkJCX0KLQkJCWZpbmFsbHl7Ci0JCQkJaWYgKGVqYkVkaXQhPW51bGwpCi0JCQkJCWVqYkVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpe30KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpc0VKQjsJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBhbiBBcHBsaWNhdGlvbiBDbGllbnQKLQkgKiBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYW4gQXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcHBDbGllbnRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiBpc0FwcENsaWVudCA9IGZhbHNlOwotCQlTdHJ1Y3R1cmVFZGl0IG1jID0gbnVsbDsKLQkJdHJ5IHsKLQkJICBtYyA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCSAgV29ya2JlbmNoQ29tcG9uZW50W10gd2JjcyA9IG1jLmdldFdvcmtiZW5jaE1vZHVsZXMoKTsKLQkJICBpZiAod2Jjcy5sZW5ndGghPTApIHsKLQkJCUFwcENsaWVudEFydGlmYWN0RWRpdCBhcHBDbGllbnRFZGl0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYXBwQ2xpZW50RWRpdCA9IEFwcENsaWVudEFydGlmYWN0RWRpdC5nZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JSZWFkKHdiY3NbMF0pOwotCQkJICBpZiAoYXBwQ2xpZW50RWRpdCE9bnVsbCl7Ci0JCQkJICBpc0FwcENsaWVudCA9IHRydWU7Ci0JCQkgIH0KLQkJCX0KLQkJCWZpbmFsbHl7Ci0JCQkJaWYgKGFwcENsaWVudEVkaXQhPW51bGwpCi0JCQkJCWFwcENsaWVudEVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpe30KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpc0FwcENsaWVudDsJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+cHJvamVjdDwvY29kZT4gYXMgYSBiaXRtYXNrLgotCSAqIFJlbGV2YW50IGJpdG1hc2sgdmFsdWVzIGFyZToKLQkgKiA8b2w+Ci0JICogPGxpPntAbGluayAjUFJPSkVDVF9UWVBFX0pBVkEgUFJPSkVDVF9UWVBFX0pBVkF9Ci0JICogPGxpPntAbGluayAjUFJPSkVDVF9UWVBFX1dFQiBQUk9KRUNUX1RZUEVfV0VCfQotCSAqIDxsaT57QGxpbmsgI1BST0pFQ1RfVFlQRV9FSkIgUFJPSkVDVF9UWVBFX0VKQn0KLQkgKiA8bGk+e0BsaW5rICNQUk9KRUNUX1RZUEVfTk9ORSBQUk9KRUNUX1RZUEVfTk9ORX0KLQkgKiA8L29sPgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRoZSB0eXBlIGJpdG1hc2sgb2YgdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlIGdldFByb2plY3RUeXBlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJYnl0ZSBwcm9qZWN0VHlwZSA9IFBST0pFQ1RfVFlQRV9OT05FOwotCQlpZiAoUmVzb3VyY2VVdGlscy5pc0phdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlwcm9qZWN0VHlwZSB8PSBQUk9KRUNUX1RZUEVfSkFWQTsKLQkJfQotCQlpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCXByb2plY3RUeXBlIHw9IFBST0pFQ1RfVFlQRV9XRUI7Ci0JCX0KLQkJaWYgKFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlwcm9qZWN0VHlwZSB8PSBQUk9KRUNUX1RZUEVfRUpCOwotCQl9Ci0JCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotCQlsb2cubG9nKExvZy5JTkZPLCA1MDMxLCBSZXNvdXJjZVV0aWxzLmNsYXNzLCAiZ2V0UHJvamVjdFR5cGUiLAotCQkJCSJwcm9qZWN0PSIgKyBwcm9qZWN0ICsgIixwcm9qZWN0VHlwZT0iICsgcHJvamVjdFR5cGUpOwotCi0JCXJldHVybiBwcm9qZWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvamVjdFR5cGVBc1N0cmluZyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9FSkIiKTsKLQkJZWxzZSBpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfV0VCIik7Ci0JCWVsc2UgaWYgKFJlc291cmNlVXRpbHMuaXNKYXZhUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9KQVZBIik7Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIFdlYk1vZHVsZSBEZXBsb3lhYmxlIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhcyBhbgotCSAqIDxjb2RlPklEZXBsb3lhYmxlPC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gV2ViIG5hdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBXZWJNb2R1bGUgRGVwbG95YWJsZSBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4gb3IgbnVsbCBpZiB0aGUKLQkgKiAgICAgICAgIHByb2plY3QgaGFzIG5vIFdlYiBuYXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHByb2plY3QpOwotCQlpZiAobW9kdWxlcyE9bnVsbCAmJiBtb2R1bGVzLmxlbmd0aCE9MCkgewotCQkJcmV0dXJuIG1vZHVsZXNbMF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGQgb3V0cHV0IGxvY2F0aW9uIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhcyBhbgotCSAqIDxjb2RlPklQYXRoPC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gSmF2YSBuYXR1cmUuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVGhlIGJ1aWxkIG91dHB1dCBsb2NhdGlvbiBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4gb3IgbnVsbAotCSAqICAgICAgICAgaWYgdGhlIHByb2plY3QgaGFzIG5vIEphdmEgbmF0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YU91dHB1dExvY2F0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVBhdGggb3V0cHV0TG9jYXRpb24gPSBudWxsOwotCQl0cnkgewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlvdXRwdXRMb2NhdGlvbiA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0JCWxvZy5sb2coTG9nLklORk8sIDUwMzIsIFJlc291cmNlVXRpbHMuY2xhc3MsICJnZXRKYXZhT3V0cHV0TG9jYXRpb24iLAotCQkJCSJwcm9qZWN0PSIgKyBwcm9qZWN0ICsgIixvdXRwdXRMb2NhdGlvbj0iICsgb3V0cHV0TG9jYXRpb24pOwotCi0JCXJldHVybiBvdXRwdXRMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYnVpbGQgc291cmNlIGxvY2F0aW9uIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhcyBhbgotCSAqIDxjb2RlPklQYXRoPC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBlaXRoZXIgaGFzIG5vIEphdmEgbmF0dXJlCi0JICogb3IgaWYgdGhlIHByb2plY3QncyBidWlsZCBjbGFzc3BhdGggY29udGFpbnMgbm8gZm9sZGVycyBsb2NhbCB0byB0aGUKLQkgKiBwcm9qZWN0LiBJZiB0aGUgcHJvamVjdCBoYXMgbW9yZSB0aGFuIG9uZSBvZiBpdHMgb3duIGZvbGRlcnMgb24gdGhlIGJ1aWxkCi0JICogY2xhc3NwYXRoLCB0aGVuIG9uZSBvZiB0aGVtIGlzIGNob3NlbiBhcmJpdHJhcmlseSBhcyB0aGUgYnVpbGQgc291cmNlCi0JICogbG9jYXRpb24uIFRvIHdvcmsgd2l0aCBhbGwgZW50cmllcyBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoLCB1c2UKLQkgKiB7QGxpbmsgI2dldEphdmFQYWNrYWdlRnJhZ21lbnRSb290cyBnZXRKYXZhUGFja2FnZUZyYWdtZW50Um9vdHMoKX1vcgotCSAqIHtAbGluayAjZ2V0SmF2YUNsYXNzcGF0aCBnZXRKYXZhQ2xhc3NwYXRoKCl9LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIEEgYnVpbGQgc291cmNlIGxvY2F0aW9uIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiBvciBudWxsIGlmCi0JICogICAgICAgICB0aGUgcHJvamVjdCBoYXMgbm8gSmF2YSBuYXR1cmUgb3IgaWYgdGhlIHByb2plY3QncyBidWlsZAotCSAqICAgICAgICAgY2xhc3NwYXRoIGNvbnRhaW5zIG5vIGZvbGRlcnMgbG9jYWwgdG8gdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhU291cmNlTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlJUGF0aCBzb3VyY2VMb2NhdGlvbiA9IG51bGw7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gZnJhZ21lbnRSb290cyA9IGdldEphdmFQYWNrYWdlRnJhZ21lbnRSb290cyhwcm9qZWN0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudFJvb3RzLmxlbmd0aCAmJiBzb3VyY2VMb2NhdGlvbiA9PSBudWxsOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSVJlc291cmNlIGZyYWdtZW50Um9vdCA9IGZyYWdtZW50Um9vdHNbaV0KLQkJCQkJCS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCQlpZiAoZnJhZ21lbnRSb290ICE9IG51bGwKLQkJCQkJCSYmIChmcmFnbWVudFJvb3QuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQkJCSYmIChmcmFnbWVudFJvb3QuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKSkgewotCQkJCQlzb3VyY2VMb2NhdGlvbiA9IGZyYWdtZW50Um9vdC5nZXRGdWxsUGF0aCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLQkJbG9nLmxvZyhMb2cuSU5GTywgNTAzMCwgUmVzb3VyY2VVdGlscy5jbGFzcywgImdldEphdmFTb3VyY2VMb2NhdGlvbiIsCi0JCQkJInByb2plY3Q9IiArIHByb2plY3QgKyAiLHNvdXJjZUxvY2F0aW9uPSIgKyBzb3VyY2VMb2NhdGlvbik7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkphdmEgc291cmNlTG9jYXRpb24gPSAiK3NvdXJjZUxvY2F0aW9uKTsKLQkJcmV0dXJuIHNvdXJjZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVBhdGhbXSBnZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKElQcm9qZWN0IHByb2plY3QpIHsKLQkJVmVjdG9yIHBhdGhWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gZnJhZ21lbnRSb290cyA9IGdldEphdmFQYWNrYWdlRnJhZ21lbnRSb290cyhwcm9qZWN0KTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50Um9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSVJlc291cmNlIGZyYWdtZW50Um9vdCA9IGZyYWdtZW50Um9vdHNbaV0KLQkJCQkJCS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCQlpZiAoZnJhZ21lbnRSb290ICE9IG51bGwKLQkJCQkJCSYmIChmcmFnbWVudFJvb3QuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQkJCSYmIChmcmFnbWVudFJvb3QuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKSkgewotCQkJCQlwYXRoVmVjdG9yLmFkZChmcmFnbWVudFJvb3QuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLQkJbG9nLmxvZyhMb2cuSU5GTywgNTAzMywgUmVzb3VyY2VVdGlscy5jbGFzcywKLQkJCQkiZ2V0QWxsSmF2YVNvdXJjZUxvY2F0aW9ucyIsICJwcm9qZWN0PSIgKyBwcm9qZWN0KTsKLQotCQlyZXR1cm4gKElQYXRoW10pIHBhdGhWZWN0b3IudG9BcnJheShuZXcgUGF0aFtwYXRoVmVjdG9yLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBidWlsZCBzb3VyY2UgcGFja2FnZSBmcmFnbWVudCByb290IG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPgotCSAqIGFzIGFuIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBlaXRoZXIKLQkgKiBoYXMgbm8gSmF2YSBuYXR1cmUgb3IgaWYgdGhlIHByb2plY3QncyBidWlsZCBjbGFzc3BhdGggY29udGFpbnMgbm8KLQkgKiBmb2xkZXJzIGxvY2FsIHRvIHRoZSBwcm9qZWN0LiBJZiB0aGUgcHJvamVjdCBoYXMgbW9yZSB0aGFuIG9uZSBvZiBpdHMgb3duCi0JICogZm9sZGVycyBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoLCB0aGVuIG9uZSBvZiB0aGVtIGlzIGNob3NlbiBhcmJpdHJhcmlseSBhcwotCSAqIHRoZSBidWlsZCBzb3VyY2UgbG9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gQSBidWlsZCBzb3VyY2UgcGFja2FnZSBmcmFnbWVudCByb290IG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPgotCSAqICAgICAgICAgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gSmF2YSBuYXR1cmUgb3IgaWYgdGhlIHByb2plY3QncwotCSAqICAgICAgICAgYnVpbGQgY2xhc3NwYXRoIGNvbnRhaW5zIG5vIGZvbGRlcnMgbG9jYWwgdG8gdGhlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRKYXZhU291cmNlUGFja2FnZUZyYWdtZW50Um9vdCgKLQkJCUlQcm9qZWN0IHByb2plY3QpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IG51bGw7Ci0JCUlQYXRoIGphdmFTb3VyY2VMb2NhdGlvbiA9IGdldEphdmFTb3VyY2VMb2NhdGlvbihwcm9qZWN0KTsKLQkJdHJ5IHsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJcGFja2FnZUZyYWdtZW50Um9vdCA9IGphdmFQcm9qZWN0Ci0JCQkJCQkuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QoamF2YVNvdXJjZUxvY2F0aW9uKTsKLQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotCQlsb2cubG9nKExvZy5JTkZPLCA1MDM0LCBSZXNvdXJjZVV0aWxzLmNsYXNzLAotCQkJCSJnZXRKYXZhU291cmNlUGFja2FnZUZyYWdtZW50Um9vdCIsICJwcm9qZWN0PSIgKyBwcm9qZWN0Ci0JCQkJCQkrICIsc291cmNlTG9jYXRpb249IiArIGphdmFTb3VyY2VMb2NhdGlvbgotCQkJCQkJKyAiLHNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3Q9IiArIHBhY2thZ2VGcmFnbWVudFJvb3QpOwotCi0JCXJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+IGFzIGFuCi0JICogYXJyYXkgb2YgPGNvZGU+SVBhY2thZ2VGcmFnbWVudFJvb3Q8L2NvZGU+IG9iamVjdHMuIElmIHRoZSBwcm9qZWN0IGhhcwotCSAqIG5vIEphdmEgbmF0dXJlIHRoZW4gdGhlIHJldHVybmVkIGFycmF5IHdpbGwgYmUgb2YgbGVuZ3RoIHplcm8uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMgb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBnZXRKYXZhUGFja2FnZUZyYWdtZW50Um9vdHMoCi0JCQlJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqYXZhUHJvamVjdAotCQkJCQkJLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudFJvb3RzOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGQgY2xhc3NwYXRoIGVudHJpZXMgb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+IGFzIGFuCi0JICogYXJyYXkgb2YgPGNvZGU+SUNsYXNzcGF0aEVudHJ5PC9jb2RlPiBvYmplY3RzLiBJZiB0aGUgcHJvamVjdCBoYXMgbm8KLQkgKiBKYXZhIG5hdHVyZSB0aGVuIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGJlIG9mIGxlbmd0aCB6ZXJvLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRoZSBjbGFzc3BhdGggZW50cmllcyBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRKYXZhQ2xhc3NwYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cmllcyA9IGphdmFQcm9qZWN0Ci0JCQkJCQkuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQkJcmV0dXJuIGNsYXNzcGF0aEVudHJpZXM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGFpbmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3Qgb2YgdGhlCi0JICogcHJvamVjdCAoaWUuIHRoZSAid2ViQXBwbGljYXRpb24iIGZvbGRlcikgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8KLQkgKiBXZWIgbmF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRoZSB3ZWIgc2VydmVyIG1vZHVsZSByb290IGNvbnRhaW5lciBvciBudWxsIGlmIHRoZSBwcm9qZWN0IGhhcwotCSAqICAgICAgICAgbm8gV2ViIG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgZ2V0V2ViTW9kdWxlU2VydmVyUm9vdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlDb250YWluZXIgd2ViTW9kdWxlU2VydmVyUm9vdCA9IG51bGw7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkJbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50W10gd2JjcyA9IG1jLmdldFdvcmtiZW5jaE1vZHVsZXMoKTsKLQkJCWlmICh3YmNzLmxlbmd0aCE9MCkgewotCQkJCXdlYk1vZHVsZVNlcnZlclJvb3QgPSBTdHJ1Y3R1cmVFZGl0LmdldE91dHB1dENvbnRhaW5lclJvb3Qod2Jjc1swXSk7Ci0JCQkJSUZvbGRlcltdIGZvbGRlciA9IFN0cnVjdHVyZUVkaXQuZ2V0T3V0cHV0Q29udGFpbmVyc0ZvclByb2plY3QocHJvamVjdCk7Ci0JCQkJCi0JCQkJaWYgKGZvbGRlci5sZW5ndGghPTApCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJXZWJNb2R1bGVTZXJ2ZXJSb290ID0gIitmb2xkZXJbMF0pOwotCQkJCQotCQkJfQotLy8JCQlJUHJvamVjdE5hdHVyZSBuYXR1cmUgPSBwcm9qZWN0LmdldE5hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKTsKLS8vCQkJaWYgKG5hdHVyZSAhPSBudWxsICYmIChuYXR1cmUgaW5zdGFuY2VvZiBJRHluYW1pY1dlYk5hdHVyZSkpIHsKLS8vCQkJICBJRHluYW1pY1dlYk5hdHVyZSB3ZWJOYXR1cmUgPSAoSUR5bmFtaWNXZWJOYXR1cmUpIG5hdHVyZTsKLS8vCQkJCXdlYk1vZHVsZVNlcnZlclJvb3QgPSB3ZWJOYXR1cmUuZ2V0Um9vdFB1Ymxpc2hhYmxlRm9sZGVyKCk7Ci0vLwkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotCQkJbG9nLmxvZyhMb2cuRVJST1IsIDUwMzUsIFJlc291cmNlVXRpbHMuY2xhc3MsICJnZXRXZWJNb2R1bGVTZXJ2ZXJSb290IiwKLQkJCQkJInByb2plY3Q9IiArIHByb2plY3QgKyAiLHdlYk1vZHVsZVNlcnZlclJvb3Q9IgotCQkJCQkJCSsgd2ViTW9kdWxlU2VydmVyUm9vdCk7CQkJCi0JCX0KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlyZXR1cm4gd2ViTW9kdWxlU2VydmVyUm9vdDsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTCBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgd2ViIHNlcnZlciBtb2R1bGUgcm9vdCBvZiB0aGUKLQkgKiBwcm9qZWN0IGluIGEgc2VydmVyIGluc3RhbmNlIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYiBuYXR1cmUgb3IKLQkgKiBoYXMgbm8gYXNzb2NpYXRpb24gdG8gYSBzZXJ2ZXIgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3QgVVJMIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYgotCSAqICAgICAgICAgbmF0dXJlIG9yIGhhcyBubyBhc3NvY2lhdGlvbiB0byBhIHNlcnZlciBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXZWJQcm9qZWN0VVJMKElQcm9qZWN0IHByb2plY3QsCi0JCQlTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBJU2VydmVyIHNlcnZlcikgewotCi0JCVN0cmluZyB3ZWJQcm9qZWN0VVJMID0gbnVsbDsKLQkJSU1vZHVsZSBtb2R1bGUgPSBnZXRNb2R1bGUocHJvamVjdCk7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJSVNlcnZlciBzZXJ2ZXJJbnN0YW5jZSA9IFNlcnZlclV0aWxzLmdldFNlcnZlckZvck1vZHVsZShtb2R1bGUsCi0JCQkJCXNlcnZlckZhY3RvcnlJZCwgc2VydmVyLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWlmIChzZXJ2ZXJJbnN0YW5jZSAhPSBudWxsKSB7Ci0vLwkJCQlVUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpIHNlcnZlckluc3RhbmNlLmdldERlbGVnYXRlKCkpLmdldE1vZHVsZVJvb3RVUkwobW9kdWxlKTsKLQkJCQlVUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpc2VydmVySW5zdGFuY2UuZ2V0QWRhcHRlcihJVVJMUHJvdmlkZXIuY2xhc3MpKS5nZXRNb2R1bGVSb290VVJMKG1vZHVsZSk7Ci0JCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzID0gdXJsLnRvU3RyaW5nKCk7Ci0JCQkJCXdlYlByb2plY3RVUkwgPSAocy5lbmRzV2l0aCgiLyIpID8gcy5zdWJzdHJpbmcoMCwgcwotCQkJCQkJCS5sZW5ndGgoKSAtIDEpIDogcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLQkJbG9nLmxvZyhMb2cuSU5GTywgNTAzNiwgUmVzb3VyY2VVdGlscy5jbGFzcywgImdldFdlYlByb2plY3RVUkwiLAotCQkJCSJwcm9qZWN0PSIgKyBwcm9qZWN0ICsgIix3ZWJQcm9qZWN0VVJMPSIgKyB3ZWJQcm9qZWN0VVJMKTsKLQotCQlyZXR1cm4gd2ViUHJvamVjdFVSTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmb3JnZWQgVVJMIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSB3ZWIgc2VydmVyIG1vZHVsZSByb290Ci0JICogb2YgdGhlIHByb2plY3QgaW4gYSBzZXJ2ZXIgaW5zdGFuY2Ugb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gV2ViCi0JICogbmF0dXJlIG9yIGhhcyBubyBhc3NvY2lhdGlvbiB0byBhIHNlcnZlciBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gVGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3QgVVJMIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYgotCSAqICAgICAgICAgbmF0dXJlIG9yIGhhcyBubyBhc3NvY2lhdGlvbiB0byBhIHNlcnZlciBpbnN0YW5jZS4KLQkgKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcmdlZFdlYlByb2plY3RVUkwoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgSVNlcnZlciBzZXJ2ZXIpewotICAJCi0gIAlTdHJpbmcgd2ViUHJvamVjdFVSTCA9IG51bGw7Ci0gIAlJTW9kdWxlIG1vZHVsZSA9IGdldE1vZHVsZShwcm9qZWN0KTsKLSAgCWlmIChtb2R1bGUgIT0gbnVsbCkKLSAgCXsKLSAgCQkvL0lTZXJ2ZXIgc2VydmVySW5zdGFuY2UgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJGb3JNb2R1bGUobW9kdWxlLAotCQkgIC8vIHNlcnZlckZhY3RvcnlJZCwgc2VydmVyLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgCQlpZiAoc2VydmVyICE9IG51bGwpCi0gIAkJewotICAJCQlTdHJpbmcgaG9zdG5hbWUgPSBzZXJ2ZXIuZ2V0SG9zdCgpOwotCi0gIAkJCS8vIGdldCBTZXJ2ZXJQb3J0Ci0gIAkJCWludCBwb3J0TnVtYmVyID0gMDsKLQotICAJICAgICAgICAgIFNlcnZlclBvcnRbXSBwb3J0cyA9IHNlcnZlci5nZXRTZXJ2ZXJQb3J0cygpOwotICAJICAgICAgICAgIFNlcnZlclBvcnQgcG9ydCA9IG51bGw7Ci0gIAkgICAgICAgICAgZm9yIChpbnQgaXQgPSAwOyBpdDxwb3J0cy5sZW5ndGg7IGl0KyspCi0gIAkgICAgICAgICAgewotICAJICAgICAgICAgICAgU2VydmVyUG9ydCBwID0gcG9ydHNbaXRdOwotICAJICAgICAgICAgICAgU3RyaW5nIHByb3RvY29sID0gcC5nZXRQcm90b2NvbCgpOwotICAJICAgICAgICAgICAgaWYgKHByb3RvY29sICE9IG51bGwgJiYgcHJvdG9jb2wudHJpbSgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJodHRwIikpCi0gIAkgICAgICAgICAgICB7Ci0gIAkgICAgICAgICAgICAgIHBvcnQgPSBwOwotICAJICAgICAgICAgICAgICBwb3J0TnVtYmVyID0gcC5nZXRQb3J0KCk7Ci0gIAkgICAgICAgICAgICAgIGJyZWFrOwotICAJICAgICAgICAgICAgfQotICAJICAgICAgICAgIH0KLSAgCSAgICAgICAgICAKLSAgCSAgICAgICAgCi0gIAkgICAgICAgIAotICAJICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgCSAgICAgICAgdHJ5IHsKLSAgCSAgICAgICAgCXVybCA9IG5ldyBVUkwoImh0dHAiLCBob3N0bmFtZSwgcG9ydE51bWJlciwgIiIpOwotICAJICAgICAgICB9Ci0gIAkgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgCSAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gIAkgICAgICAgIH0KLQotICAJICAgICAgICAKLSAgCQkJLy9VUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpIHNlcnZlckluc3RhbmNlLmdldERlbGVnYXRlKCkpLmdldE1vZHVsZVJvb3RVUkwobW9kdWxlKTsKLSAgCQkJCi0gIAkJCWlmICh1cmwgIT0gbnVsbCkKLSAgCQkJewotICAJCQkJU3RyaW5nIHMgPSB1cmwudG9TdHJpbmcoKTsKLSAgCQkJCXdlYlByb2plY3RVUkwgPSBzICsgIi8iK3Byb2plY3QuZ2V0TmFtZSgpOwotICAJCQkJLy93ZWJQcm9qZWN0VVJMID0gKHMuZW5kc1dpdGgoIi8iKSA/IHMuc3Vic3RyaW5nKDAscy5sZW5ndGgoKS0xKSA6IHMpOwotICAJCQl9Ci0gIAkJfQotICAJfQotIAlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLSAgICBsb2cubG9nKExvZy5JTkZPLCA1MDM2LCBSZXNvdXJjZVV0aWxzLmNsYXNzLCAiZ2V0V2ViUHJvamVjdFVSTCIsICJwcm9qZWN0PSIrcHJvamVjdCsiLHdlYlByb2plY3RVUkw9Iit3ZWJQcm9qZWN0VVJMKTsKLSAgCXJldHVybiB3ZWJQcm9qZWN0VVJMOyAgCQotICB9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSB3ZWIgc2VydmVyIG1vZHVsZSByb290IG9mIHRoZQotCSAqIHByb2plY3QgaW4gYSBzZXJ2ZXIgaW5zdGFuY2Ugb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gV2ViIG5hdHVyZSBvcgotCSAqIGhhcyBubyBhc3NvY2lhdGlvbiB0byBhIHNlcnZlciBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBUaGUgd2ViIHNlcnZlciBtb2R1bGUgcm9vdCBVUkwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gV2ViCi0JICogICAgICAgICBuYXR1cmUgb3IgaGFzIG5vIGFzc29jaWF0aW9uIHRvIGEgc2VydmVyIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdlYlByb2plY3RVUkwoSVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmcgd2ViUHJvamVjdFVSTCA9IG51bGw7Ci0JCUlNb2R1bGUgbW9kdWxlID0gZ2V0TW9kdWxlKHByb2plY3QpOwotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXIgc2VydmVySW5zdGFuY2UgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJGb3JNb2R1bGUobW9kdWxlKTsKLQkJCWlmIChzZXJ2ZXJJbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQkJVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKXNlcnZlckluc3RhbmNlLmdldEFkYXB0ZXIoSVVSTFByb3ZpZGVyLmNsYXNzKSkuZ2V0TW9kdWxlUm9vdFVSTChtb2R1bGUpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcyA9IHVybC50b1N0cmluZygpOwotCQkJCQl3ZWJQcm9qZWN0VVJMID0gKHMuZW5kc1dpdGgoIi8iKSA/IHMuc3Vic3RyaW5nKDAsIHMKLQkJCQkJCQkubGVuZ3RoKCkgLSAxKSA6IHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLQkJbG9nLmxvZyhMb2cuSU5GTywgNTAzNywgUmVzb3VyY2VVdGlscy5jbGFzcywgImdldFdlYlByb2plY3RVUkwiLAotCQkJCSJwcm9qZWN0PSIgKyBwcm9qZWN0ICsgIix3ZWJQcm9qZWN0VVJMPSIgKyB3ZWJQcm9qZWN0VVJMKTsKLQotCQlyZXR1cm4gd2ViUHJvamVjdFVSTDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbmNvZGVkV2ViUHJvamVjdFVSTChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyB1cmwgPSBnZXRXZWJQcm9qZWN0VVJMKHByb2plY3QpOwotCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IHVybC5sYXN0SW5kZXhPZignLycpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGVuY29kZWRVUkwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZW5jb2RlZFVSTC5hcHBlbmQodXJsLnN1YnN0cmluZygwLCBpbmRleCArIDEpKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgY3R4dFJvb3QgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwuc3Vic3RyaW5nKGluZGV4ICsgMSwgdXJsLmxlbmd0aCgpKSwgIlVURi04Iik7Ci0JCQkJCWludCBwbHVzSW5kZXggPSBjdHh0Um9vdC5pbmRleE9mKCcrJyk7Ci0JCQkJCXdoaWxlIChwbHVzSW5kZXggIT0gLTEpIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCXNiLmFwcGVuZChjdHh0Um9vdC5zdWJzdHJpbmcoMCwgcGx1c0luZGV4KSk7Ci0JCQkJCQlzYi5hcHBlbmQoIiUyMCIpOwotCQkJCQkJc2IuYXBwZW5kKGN0eHRSb290LnN1YnN0cmluZyhwbHVzSW5kZXggKyAxLCBjdHh0Um9vdAotCQkJCQkJCS5sZW5ndGgoKSkpOwotCQkJCQkJY3R4dFJvb3QgPSBzYi50b1N0cmluZygpOwotCQkJCQkJcGx1c0luZGV4ID0gY3R4dFJvb3QuaW5kZXhPZignKycpOwotCQkJCQl9Ci0JCQkJCWVuY29kZWRVUkwuYXBwZW5kKGN0eHRSb290KTsKLQkJCQl9Y2F0Y2ggKElPRXhjZXB0aW9uIGlvKXsKLQkJCQkJLy9oYW5kbGVyIGV4Y2VwdGlvbgotCQkJCX0JCQkJCi0JCQkJdXJsID0gZW5jb2RlZFVSTC50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gb2YgYSBKYXZhIHJlc291cmNlLCByZXR1cm5zIHRoZQotCSAqIHBhY2thZ2UgbmFtZSBvZiB0aGUgcmVzb3VyY2Ugb3IgbnVsbCBpZiB0aGUgcmVzb3VyY2UgaXMgbm90IHByb3Blcmx5Ci0JICogbG9jYXRlZCBpbiBhIHByb2plY3Qgb3IgZm9sZGVyIG9uIHRoZSBidWlsZCBjbGFzc3BhdGggb3IgdGhhdCBpcyB0aGUKLQkgKiBidWlsZCBvdXRwdXQgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gYWJzb2x1dGVQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgSmF2YSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIEphdmEgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF2YVJlc291cmNlUGFja2FnZU5hbWUoSVBhdGggYWJzb2x1dGVQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBqYXZhRm9sZGVyUGF0aCA9IGFic29sdXRlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdE9mKGFic29sdXRlUGF0aCk7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnQgZnJhZ21lbnQgPSBqYXZhUHJvamVjdAotCQkJCQkJLmZpbmRQYWNrYWdlRnJhZ21lbnQoamF2YUZvbGRlclBhdGgpOwotCQkJCWlmIChmcmFnbWVudCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBmcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCQkJCX0KLQkJCQlJUGF0aCBvdXRwdXRQYXRoID0gZ2V0SmF2YU91dHB1dExvY2F0aW9uKHByb2plY3QpOwotCQkJCWlmIChvdXRwdXRQYXRoLmlzUHJlZml4T2YoamF2YUZvbGRlclBhdGgpKSB7Ci0JCQkJCUlQYXRoIGphdmFQYWNrYWdlUGF0aCA9IGphdmFGb2xkZXJQYXRoCi0JCQkJCQkJLnJlbW92ZUZpcnN0U2VnbWVudHMob3V0cHV0UGF0aC5zZWdtZW50Q291bnQoKSk7Ci0JCQkJCXJldHVybiBqYXZhUGFja2FnZVBhdGguaXNFbXB0eSgpID8gbnVsbCA6IGphdmFQYWNrYWdlUGF0aAotCQkJCQkJCS50b1N0cmluZygpLnJlcGxhY2UoSVBhdGguU0VQQVJBVE9SLCAnLicpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBvZiBhIEphdmEgcmVzb3VyY2UsIHJldHVybnMgdGhlCi0JICogcGFja2FnZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBhcyBhIHJlbGF0aXZlIHBhdGhuYW1lIG9yIG51bGwgaWYgdGhlCi0JICogcmVzb3VyY2UgaXMgbm90IHByb3Blcmx5IGxvY2F0ZWQgaW4gYSBwcm9qZWN0IG9yIGZvbGRlciBvbiB0aGUgYnVpbGQKLQkgKiBjbGFzc3BhdGguCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIEphdmEgcmVzb3VyY2UuCi0JICogQHJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBKYXZhIHJlc291cmNlIGFzIGEgcmVsYXRpdmUgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFSZXNvdXJjZVBhY2thZ2VQYXRoKElQYXRoIGFic29sdXRlUGF0aCkgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBSZXNvdXJjZVV0aWxzCi0JCQkJLmdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKGFic29sdXRlUGF0aCk7Ci0JCXJldHVybiAocGFja2FnZU5hbWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgUGF0aChwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywKLQkJCQlJUGF0aC5TRVBBUkFUT1IpKSk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gb2YgYSBKYXZhIHJlc291cmNlLCByZXR1cm5zIHRoZQotCSAqIGFic29sdXRlIHBhdGggb2YgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgaXMgb24gdGhlIGJ1aWxkIGNsYXNzcGF0aCBvcgotCSAqIGlzIHRoZSBidWlsZCBvdXRwdXQgcGF0aCBhbmQgdGhhdCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEKLQkgKiByZXNvdXJjZSwgb3IgbnVsbCBpZiBubyBzdWNoIHByb2plY3Qgb3IgZm9sZGVyIGV4aXN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gYWJzb2x1dGVQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgSmF2YSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwcm9qZWN0IG9yIGZvbGRlciBjb250YWluaW5nIHRoZSBmdWxseQotCSAqICAgICAgICAgcXVhbGlmaWVkIEphdmEgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhUmVzb3VyY2VSb290UGF0aChJUGF0aCBhYnNvbHV0ZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0T2YoYWJzb2x1dGVQYXRoKTsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwZnJzID0gamF2YVByb2plY3QKLQkJCQkJCS5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGZycy5sZW5ndGg7IGkrKykgewotCQkJCQlJUmVzb3VyY2UgZnJhZ21lbnRSb290ID0gcGZyc1tpXS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCQkJaWYgKGZyYWdtZW50Um9vdCAhPSBudWxsKSB7Ci0JCQkJCQlJUGF0aCBmcmFnbWVudFBhdGggPSBmcmFnbWVudFJvb3QuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCWlmIChmcmFnbWVudFBhdGguaXNQcmVmaXhPZihhYnNvbHV0ZVBhdGgpKSB7Ci0JCQkJCQkJcmV0dXJuIGZyYWdtZW50UGF0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlJUGF0aCBvdXRwdXRQYXRoID0gZ2V0SmF2YU91dHB1dExvY2F0aW9uKHByb2plY3QpOwotCQkJCWlmIChvdXRwdXRQYXRoLmlzUHJlZml4T2YoYWJzb2x1dGVQYXRoKSkgewotCQkJCQlyZXR1cm4gb3V0cHV0UGF0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBhbiBVUkwgKEhUVFAgb3IgRklMRSkgdG8gYW4gRWNsaXBzZSByZXNvdXJjZSwgcmV0dXJuaW5nIHRoZQotCSAqIFVSTCBzdHJpbmcgaWYgc3VjY2Vzc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiBBIHZhbHVlIG9mIG51bGwgd2lsbAotCSAqIGRlZmluaXRlbHkgYmUgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbm90IG1ldDoKLQkgKiA8b2w+Ci0JICogPGxpPlRoZSBhYnNvbHV0ZSBwYXRoIGJlZ2lucyB3aXRoIGEgV2ViIFByb2plY3QuCi0JICogPGxpPlRoZSBsZWFkaW5nIHBvcnRpb24gb2YgdGhlIGFic29sdXRlIHBhdGggbWF0Y2hlcyB0aGUgcGF0aCBvZiB0aGUKLQkgKiBjb250YWluZXIgcmV0dXJuZWQgYnkgeyNsaW5rICNnZXRXZWJNb2R1bGVTZXJ2ZXJSb290Ci0JICogZ2V0V2ViTW9kdWxlU2VydmVyUm9vdH0gZm9yIHRoZSBwcm9qZWN0LgotCSAqIDxsaT5UaGUgcGF0aCBkb2VzIG5vdCBsZWFkIHRvIHRoZSBXRUItSU5GIGZvbGRlciBvciBhbnkgZGVzY2VuZGVudAotCSAqIHRoZXJlb2YuCi0JICogPGxpPlRoZSBXZWIgUHJvamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZXhwbGljaXQgb3IgZGVmYXVsdCBzZXJ2ZXIKLQkgKiBpbnN0YW5jZS4KLQkgKiA8L29sPgotCSAqIAotCSAqIEBwYXJhbSBhYnNvbHV0ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSBVUkwgb2YgdGhlIGZpbGUsIG9yIG51bGwgaWYgbm8gVVJMIGNhbiBiZSBkZXRlcm1pbmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVSTEZyb21QYXRoKElQYXRoIGFic29sdXRlUGF0aCwKLQkJCVN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBnZXRVUkxGcm9tUGF0aChhYnNvbHV0ZVBhdGgsIGdldFdlYlByb2plY3RVUkwoCi0JCQkJZ2V0UHJvamVjdE9mKGFic29sdXRlUGF0aCksIHNlcnZlckZhY3RvcnlJZCwgc2VydmVyKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VVJMRnJvbVBhdGgoSVBhdGggYWJzb2x1dGVQYXRoLCBTdHJpbmcgd2ViUHJvamVjdFVSTCkgewotCQlTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdE9mKGFic29sdXRlUGF0aCk7Ci0JCUlDb250YWluZXIgd2ViTW9kdWxlU2VydmVyUm9vdCA9IGdldFdlYk1vZHVsZVNlcnZlclJvb3QocHJvamVjdCk7Ci0JCWlmICh3ZWJNb2R1bGVTZXJ2ZXJSb290ICE9IG51bGwpIHsKLQkJCUlQYXRoIHdlYk1vZHVsZVNlcnZlclJvb3RQYXRoID0gd2ViTW9kdWxlU2VydmVyUm9vdC5nZXRGdWxsUGF0aCgpOwotCQkJaWYgKHdlYk1vZHVsZVNlcnZlclJvb3RQYXRoLmlzUHJlZml4T2YoYWJzb2x1dGVQYXRoKSkgewotCQkJCWludCBudW1TZWdtZW50ID0gd2ViTW9kdWxlU2VydmVyUm9vdFBhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJaW50IG51bVNlZ21lbnRGcm9tUGF0aCA9IGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQlpZiAobnVtU2VnbWVudEZyb21QYXRoID4gbnVtU2VnbWVudCkgewotCQkJCQlTdHJpbmcgbmV4dFNlZ21lbnQgPSBhYnNvbHV0ZVBhdGguc2VnbWVudChudW1TZWdtZW50KTsKLQkJCQkJLy8gY2hlY2sgaWYgdGhlIHNlZ21lbnQgYWZ0ZXIgdGhlIFdlYk1vZHVsZVNlcnZlclJvb3QgaXMKLQkJCQkJLy8gV0VCLUlORiAoaWdub3JpbmcgY2FzZSkKLQkJCQkJaWYgKG5leHRTZWdtZW50ICE9IG51bGwJJiYgIW5leHRTZWdtZW50LmVxdWFsc0lnbm9yZUNhc2UoIldFQi1JTkYiKSkgewotCQkJCQkJSVBhdGggcmVsYXRpdmVQYXRoID0gYWJzb2x1dGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobnVtU2VnbWVudCk7Ci0JCQkJCQlpZiAod2ViUHJvamVjdFVSTCAhPSBudWxsKQotCQkJCQkJCXVybC5hcHBlbmQod2ViUHJvamVjdFVSTCkuYXBwZW5kKElQYXRoLlNFUEFSQVRPUikuYXBwZW5kKHJlbGF0aXZlUGF0aC50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAobnVtU2VnbWVudEZyb21QYXRoID09IG51bVNlZ21lbnQpCi0JCQkJCXVybC5hcHBlbmQod2ViUHJvamVjdFVSTCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHVybC5sZW5ndGgoKSA8IDEpIHsKLQkJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQl1cmwuYXBwZW5kKGdldFJlc291cmNlVVJJKHdvcmtzcGFjZS5nZXRGaWxlKGFic29sdXRlUGF0aCkpKTsKLQkJfQotCQlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLQkJbG9nLmxvZyhMb2cuSU5GTywgNTAzOCwgUmVzb3VyY2VVdGlscy5jbGFzcywgImdldFVSTEZyb21QYXRoIiwKLQkJCQkiYWJzb2x1dGVQYXRoPSIgKyBhYnNvbHV0ZVBhdGggKyAiLHVybD0iICsgdXJsKTsKLQotCQlyZXR1cm4gdXJsLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGZpbGUgb2YgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYW5kIHJldHVybnMgaXRzCi0JICogaGFuZGxlIGFzIGFuIDxjb2RlPklGaWxlPC9jb2RlPi4gSWYgdGhlIGZpbGUgY2Fubm90IGJlIGNyZWF0ZWQsIGEKLQkgKiA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBjb250YWluaW5nIGFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IG9iamVjdAotCSAqIGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gYWJzb2x1dGVQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byBjcmVhdGUuIFRoZSBwcm9qZWN0IGF0IHRoZQotCSAqICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBwYXRoIG11c3QgYWxyZWFkeSBleGlzdCwgdGhhdCBpcywgdGhpcyBtZXRob2QKLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogICAgICAgICAgICBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLQkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9aGFuZGxlIG9mIHRoZQotCSAqICAgICAgICAgZmlsZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfXdpdGggYQotCSAqICAgICAgICAgICAgIHNldmVyaXR5IG9mIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+IGFuZCBhCi0JICogICAgICAgICAgICAgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZS4KLQkgKi8KLQkvLyAgcHVibGljIHN0YXRpYyBJRmlsZSBjcmVhdGVGaWxlICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBJUGF0aCBhYnNvbHV0ZVBhdGgsCi0JLy8gICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yCi0JLy8gICkKLQkvLyAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgewotCS8vICAgIGlmICghYWJzb2x1dGVQYXRoLmlzQWJzb2x1dGUoKSkKLQkvLyAgICB7Ci0JLy8gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXZWJTZXJ2aWNlUGx1Z2luLklELDAsV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX1BBVEhfTk9UX0FCU09MVVRFIixuZXcKLQkvLyBPYmplY3RbXSB7YWJzb2x1dGVQYXRoLnRvU3RyaW5nKCl9KSxudWxsKSk7Ci0JLy8gICAgfQotCS8vICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPCAxKQotCS8vICAgIHsKLQkvLyAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdlYlNlcnZpY2VQbHVnaW4uSUQsMCxXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfUEFUSF9FTVBUWSIsbmV3Ci0JLy8gT2JqZWN0W10ge2Fic29sdXRlUGF0aC50b1N0cmluZygpfSksbnVsbCkpOwotCS8vICAgIH0KLQkvLyAgICBpZiAoYWJzb2x1dGVQYXRoLnNlZ21lbnRDb3VudCgpIDwgMikKLQkvLyAgICB7Ci0JLy8gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXZWJTZXJ2aWNlUGx1Z2luLklELDAsV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX1BBVEhfTk9UX0ZPTERFUiIsbmV3Ci0JLy8gT2JqZWN0W10ge2Fic29sdXRlUGF0aC50b1N0cmluZygpfSksbnVsbCkpOwotCS8vICAgIH0KLQkvLyAgICBJQ29udGFpbmVyIHBhcmVudCA9IG1ha2VGb2xkZXJQYXRoKHJlc291cmNlQ29udGV4dCwKLQkvLyBhYnNvbHV0ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLCBwcm9ncmVzc01vbml0b3IsIHN0YXR1c01vbml0b3IpOwotCS8vICAgIFN0cmluZyBmaWxlTmFtZSA9IGFic29sdXRlUGF0aC5sYXN0U2VnbWVudCgpOwotCS8vICAgIHJldHVybiBtYWtlRmlsZShyZXNvdXJjZUNvbnRleHQsIHBhcmVudCwgZmlsZU5hbWUsIGlucHV0U3RyZWFtLAotCS8vIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzTW9uaXRvcik7Ci0JLy8gIH0KLQkvKioKLQkgKiBDcmVhdGVzIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhIGZpbGUgb2YgdGhlIGdpdmVuCi0JICogPGNvZGU+cmVsYXRpdmVQYXRoPC9jb2RlPiBhbmQgcmV0dXJucyBpdHMgaGFuZGxlIGFzIGFuCi0JICogPGNvZGU+SUZpbGU8L2NvZGU+LiBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCwgYQotCSAqIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcgYW4gPGNvZGU+SVN0YXR1czwvY29kZT4gb2JqZWN0Ci0JICogaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBhYnNvbHV0ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS4gVGhlIHByb2plY3QgYXQgdGhlCi0JICogICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIHBhdGggbXVzdCBhbHJlYWR5IGV4aXN0LCB0aGF0IGlzLCB0aGlzIG1ldGhvZAotCSAqICAgICAgICAgICAgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotCSAqIEBwYXJhbSBjcmVhdGVGb2xkZXJzCi0JICogICAgICAgICAgICBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotCSAqICAgICAgICAgICAge0BsaW5rICNDUkVBVEUgQ1JFQVRFfW9yIHtAbGluayAjRE9OVF9DUkVBVEUgRE9OVF9DUkVBVEV9LgotCSAqICAgICAgICAgICAgPHVsPgotCSAqICAgICAgICAgICAgPGxpPjxjb2RlPkNSRUFURTwvY29kZT4tIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbgotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gZG8gbm90IGV4aXN0LCB0aGV5IHdpbGwKLQkgKiAgICAgICAgICAgIGJlIGNyZWF0ZWQuCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+RE9OVF9DUkVBVEU8L2NvZGU+LSBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMKLQkgKiAgICAgICAgICAgIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGRvIG5vdCBleGlzdCwgdGhlCi0JICogICAgICAgICAgICBtZXRob2Qgd2lsbCB0aHJvdyBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+LgotCSAqICAgICAgICAgICAgPC91bD4KLQkgKiBAcGFyYW0gb3ZlcndyaXRlRmlsZQotCSAqICAgICAgICAgICAgVGhlIHBvbGljeSBmb3IgZXhpc3RpbmcgZmlsZXMsIG9uZSBvZgotCSAqICAgICAgICAgICAge0BsaW5rICNPVkVSV1JJVEUgT1ZFUldSSVRFfW9yCi0JICogICAgICAgICAgICB7QGxpbmsgI0RPTlRfT1ZFUldSSVRFIERPTlRfT1ZFUldSSVRFfS4KLQkgKiAgICAgICAgICAgIDx1bD4KLQkgKiAgICAgICAgICAgIDxsaT48Y29kZT5PVkVSV1JJVEU8L2NvZGU+LSBJZiBhIHJlc291cmNlIG9mIHRoZSBzYW1lIG5hbWUKLQkgKiAgICAgICAgICAgIGFzIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzIGFuZCBpcwotCSAqICAgICAgICAgICAgYSBmaWxlLCBpdCB3aWxsIGJlIHJlcGxhY2VkLiBJZiB0aGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMKLQkgKiAgICAgICAgICAgIGFuZCBpdCBpcyBub3QgYSBmaWxlLCB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZCBhCi0JICogICAgICAgICAgICA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLQkgKiAgICAgICAgICAgIDxsaT48Y29kZT5ET05UX09WRVJXUklURTwvY29kZT4tIElmIGFueSByZXNvdXJjZSBvZiB0aGUKLQkgKiAgICAgICAgICAgIHNhbWUgbmFtZSBhcyB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5Ci0JICogICAgICAgICAgICBleGlzdHMsIHRoZW4gbm8gZmlsZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGEKLQkgKiAgICAgICAgICAgIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotCSAqICAgICAgICAgICAgPC91bD4KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogICAgICAgICAgICBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLQkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9aGFuZGxlIG9mIHRoZQotCSAqICAgICAgICAgZmlsZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfXdpdGggYQotCSAqICAgICAgICAgICAgIHNldmVyaXR5IG9mIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+IGFuZCBhCi0JICogICAgICAgICAgICAgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoZSBjYXVzZS4KLQkgKi8KLQkvLyAgcHVibGljIHN0YXRpYyBJRmlsZSBjcmVhdGVGaWxlICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBJUHJvamVjdCBwcm9qZWN0LAotCS8vICAgIElQYXRoIHJlbGF0aXZlUGF0aCwKLQkvLyAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwKLQkvLyAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLQkvLyAgICBTdGF0dXNNb25pdG9yIHN0YXR1c01vbml0b3IKLQkvLyAgKQotCS8vICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCS8vICB7Ci0JLy8gICAgSVBhdGggYWJzb2x1dGVQYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZChyZWxhdGl2ZVBhdGgpOwotCS8vICAgIHJldHVybiBjcmVhdGVGaWxlKHJlc291cmNlQ29udGV4dCwgYWJzb2x1dGVQYXRoLCBpbnB1dFN0cmVhbSwKLQkvLyBwcm9ncmVzc01vbml0b3IsIHN0YXR1c01vbml0b3IpOwotCS8vICB9Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBvdXRwdXQgc3RyZWFtIHRoYXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgdG8gdGhlIGdpdmVuCi0JICogPGNvZGU+ZmlsZTwvY29kZT4uIEFjdHVhbCBjaGFuZ2VzIHRvIHRoZSB3b3Jrc3BhY2UgbWF5IG9jY3VyIGR1cmluZwotCSAqIGNyZWF0aW9uIG9mIHRoZSBzdHJlYW0sIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHN0cmVhbSwgb3Igd2hlbiB0aGUgc3RyZWFtCi0JICogaXMgY2xvc2VkLiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcgYW4KLQkgKiA8Y29kZT5JU3RhdHVzPC9jb2RlPiB3aWxsIGJlIHRocm93biBhdCBzb21lIHBvaW50IGluIHRoZSBsaWZlY3ljbGUgb2YKLQkgKiB0aGUgc3RyZWFtIGlmIHRoZSBmaWxlIHJlc291cmNlIGNhbm5vdCBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfWhhbmRsZSBvZgotCSAqICAgICAgICAgICAgdGhlIGZpbGUgcmVzb3VyY2UgdG8gY3JlYXRlLiBUaGUgcHJvamVjdCBpbXBsaWVkIGJ5IHRoZQotCSAqICAgICAgICAgICAgcGF0aG5hbWUgb2YgdGhlIGZpbGUgbXVzdCBhbHJlYWR5IGV4aXN0LCB0aGF0IGlzLCB0aGlzIG1ldGhvZAotCSAqICAgICAgICAgICAgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotCSAqIEByZXR1cm4gQW4gPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPiB0aWVkIHRvIHRoZSBmaWxlIHJlc291cmNlLiBBY3R1YWwKLQkgKiAgICAgICAgIGNoZWNrcyBvZiBvciBjaGFuZ2VzIHRvIHRoZSB3b3Jrc3BhY2UgbWF5IG9jY3VyIGFzIGVhcmx5IGR1cmluZwotCSAqICAgICAgICAgc3RyZWFtIGNyZWF0aW9uLCBjbG9zdXJlLCBvciBhbnkgdGltZSBpbiBiZXR3ZWVuLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEFuIGV4Y2VwdGlvbiBjb250YWluaW5nIGFuCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9d2l0aCBhCi0JICogICAgICAgICAgICAgc2V2ZXJpdHkgb2YgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4gYW5kIGEKLQkgKiAgICAgICAgICAgICBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLiBSZWFzb25zIGluY2x1ZGU6Ci0JICogICAgICAgICAgICAgPG9sPgotCSAqICAgICAgICAgICAgIDxsaT5UaGUgcHJvamVjdCBvZiB0aGUgZ2l2ZW4gZmlsZSdzIHBhdGggZG9lcyBub3QgZXhpc3QuCi0JICogICAgICAgICAgICAgPGxpPkEgbm9uLWZpbGUgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBvZiB0aGUgZ2l2ZW4gZmlsZQotCSAqICAgICAgICAgICAgIGFscmVhZHkgZXhpc3RzLgotCSAqICAgICAgICAgICAgIDxsaT5BIGZpbGUgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBvZiB0aGUgZ2l2ZW4gZmlsZQotCSAqICAgICAgICAgICAgIGFscmVhZHkgZXhpc3RzLCBhbmQgPGNvZGU+b3ZlcndyaXRlRmlsZTwvY29kZT4gaXMgZmFsc2UuCi0JICogICAgICAgICAgICAgPGxpPk9uZSBvciBtb3JlIGludGVybWVkaWF0ZSBmb2xkZXJzIHRvIHRoZSBnaXZlbiBmaWxlIGRvCi0JICogICAgICAgICAgICAgbm90IGV4aXN0LCBhbmQgPGNvZGU+Y3JlYXRlRm9sZGVyczwvY29kZT4gaXMgZmFsc2UuCi0JICogICAgICAgICAgICAgPC9vbD4KLQkgKi8KLQotCS8vICBwdWJsaWMgc3RhdGljIE91dHB1dFN0cmVhbSBuZXdGaWxlT3V0cHV0U3RyZWFtICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IGNvbnRleHQsCi0JLy8gICAgSUZpbGUgZmlsZSwKLQkvLyAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLQkvLyAgICBTdGF0dXNNb25pdG9yIHN0YXR1c01vbml0b3IKLQkvLyAgKQotCS8vICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCS8vICB7Ci0JLy8gICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0oY29udGV4dCwgZmlsZSwgcHJvZ3Jlc3NNb25pdG9yLAotCS8vIHN0YXR1c01vbml0b3IpOwotCS8vICB9Ci0JLyoqCi0JICogQ29waWVzIGEgc2V0IG9mIGZpbGVzIGZyb20gYSBwbHVnaW4ncyBpbnN0YWxsYXRpb24gbG9jYXRpb24gdG8gYW4gRWNsaXBzZQotCSAqIGZvbGRlci4gVGhlIGZpbGVzIGFyZSBuYW1lZCBpbiBhbiBpbmRleCBmaWxlIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhlCi0JICogcGx1Z2luJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBpbmRleFBhdGhuYW1lCi0JICogICAgICAgICAgICBBIGZpbGUgY29udGFpbmluZyBhIHdoaXRlc3BhY2UtZGVsaW1pdHRlZCBsaXN0IG9mIHBhdGhuYW1lcyBvZgotCSAqICAgICAgICAgICAgdGhlIGZpbGVzIHRvIGNvcHkuIFRoZSBwYXRobmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgPGNvZGU+cGx1Z2luIHNvdXJjZVBhdGg8L2NvZGU+LiBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSB0YXJnZXRQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgRWNsaXBzZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gd2hpY2ggdGhlIGZpbGVzCi0JICogICAgICAgICAgICB3aWxsIGJlIGNvcGllZC4gVGhlIHJlbGF0aXZlIHBhdGhuYW1lcyBvZiB0aGUgZmlsZXMgbmFtZWQgaW4KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5pbmRleFBhdGhuYW1lPC9jb2RlPiBmaWxlIGFyZSBwcmVzZXJ2ZWQuIE11c3Qgbm90Ci0JICogICAgICAgICAgICBiZSBudWxsLgotCSAqIEBwYXJhbSBjcmVhdGVGb2xkZXJzCi0JICogICAgICAgICAgICBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotCSAqICAgICAgICAgICAge0BsaW5rICNDUkVBVEUgQ1JFQVRFfW9yIHtAbGluayAjRE9OVF9DUkVBVEUgRE9OVF9DUkVBVEV9LgotCSAqICAgICAgICAgICAgPHVsPgotCSAqICAgICAgICAgICAgPGxpPjxjb2RlPkNSRUFURTwvY29kZT4tIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbgotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gZG8gbm90IGV4aXN0LCB0aGV5IHdpbGwKLQkgKiAgICAgICAgICAgIGJlIGNyZWF0ZWQuCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+RE9OVF9DUkVBVEU8L2NvZGU+LSBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMKLQkgKiAgICAgICAgICAgIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGRvIG5vdCBleGlzdCwgdGhlCi0JICogICAgICAgICAgICBtZXRob2Qgd2lsbCB0aHJvdyBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+LgotCSAqICAgICAgICAgICAgPC91bD4KLQkgKiBAcGFyYW0gb3ZlcndyaXRlRmlsZXMKLQkgKiAgICAgICAgICAgIFRoZSBwb2xpY3kgZm9yIGV4aXN0aW5nIGZpbGVzLCBvbmUgb2YKLQkgKiAgICAgICAgICAgIHtAbGluayAjT1ZFUldSSVRFIE9WRVJXUklURX1vcgotCSAqICAgICAgICAgICAge0BsaW5rICNET05UX09WRVJXUklURSBET05UX09WRVJXUklURX0uCi0JICogICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICA8bGk+PGNvZGU+T1ZFUldSSVRFPC9jb2RlPi0gSWYgYSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lCi0JICogICAgICAgICAgICBhcyB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cyBhbmQgaXMKLQkgKiAgICAgICAgICAgIGEgZmlsZSwgaXQgd2lsbCBiZSByZXBsYWNlZC4gSWYgdGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzCi0JICogICAgICAgICAgICBhbmQgaXQgaXMgbm90IGEgZmlsZSwgdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQgYQotCSAqICAgICAgICAgICAgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+RE9OVF9PVkVSV1JJVEU8L2NvZGU+LSBJZiBhbnkgcmVzb3VyY2Ugb2YgdGhlCi0JICogICAgICAgICAgICBzYW1lIG5hbWUgYXMgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeQotCSAqICAgICAgICAgICAgZXhpc3RzLCB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZCBhCi0JICogICAgICAgICAgICA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLQkgKiAgICAgICAgICAgIDwvdWw+Ci0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c313aXRoIGEKLQkgKiAgICAgICAgICAgICBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotCSAqICAgICAgICAgICAgIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0JICovCi0JLy8gIHN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5SW5kZXhlZEZpbGVzICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBQbHVnaW4gcGx1Z2luLAotCS8vICAgIElQYXRoIHNvdXJjZVBhdGgsCi0JLy8gICAgSVBhdGggaW5kZXhQYXRobmFtZSwKLQkvLyAgICBJUGF0aCB0YXJnZXRQYXRoLAotCS8vICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCS8vICAgIFN0YXR1c01vbml0b3Igc3RhdHVzTW9uaXRvcgotCS8vICApCi0JLy8gIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JLy8gIHsKLQkvLyAgICB0cnkKLQkvLyAgICB7Ci0JLy8gICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IHBsdWdpbi5vcGVuU3RyZWFtKGluZGV4UGF0aG5hbWUpOwotCS8vICAgICAgRW51bWVyYXRpb24gZmlsZW5hbWVzID0gU3RyaW5nVXRpbHMucGFyc2VGaWxlbmFtZXNGcm9tU3RyZWFtKGlucHV0KTsKLQkvLyAgICAgIGNvcHlFbnVtZXJhdGVkRmlsZXMocmVzb3VyY2VDb250ZXh0LCBwbHVnaW4sIHNvdXJjZVBhdGgsIGZpbGVuYW1lcywKLQkvLyB0YXJnZXRQYXRoLCBwcm9ncmVzc01vbml0b3IsIHN0YXR1c01vbml0b3IpOwotCS8vICAgIH0KLQkvLyAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkvLyAgICB7Ci0JLy8gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5FUlJPUixwbHVnaW4uZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwwLFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9JTyIpLGUpKTsKLQkvLyAgICB9Ci0JLy8gIH0KLQkvKioKLQkgKiBDb3BpZXMgYSBzZXQgb2YgZmlsZXMgZnJvbSBhIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbiB0byBhbiBFY2xpcHNlCi0JICogZm9sZGVyLiBUaGUgZmlsZXMgYXJlIG5hbWVkIGluIGFuIGVudW1lcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBwYXRobmFtZXMKLQkgKiAgICAgICAgICAgIEFuIGVudW1lcmF0aW9uIG9mIHBhdGhuYW1lcyBvZiB0aGUgZmlsZXMgdG8gY29weS4gVGhlCi0JICogICAgICAgICAgICBwYXRobmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW4gc291cmNlUGF0aDwvY29kZT4uCi0JICogICAgICAgICAgICBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSB0YXJnZXRQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgRWNsaXBzZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gd2hpY2ggdGhlIGZpbGVzCi0JICogICAgICAgICAgICB3aWxsIGJlIGNvcGllZC4gVGhlIHJlbGF0aXZlIHBhdGhuYW1lcyBvZiB0aGUgZmlsZXMgbmFtZWQgaW4KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5wYXRobmFtZXM8L2NvZGU+IGVudW1lcmF0aW9uIGFyZSBwcmVzZXJ2ZWQuIE11c3QKLQkgKiAgICAgICAgICAgIG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSBjcmVhdGVGb2xkZXJzCi0JICogICAgICAgICAgICBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotCSAqICAgICAgICAgICAge0BsaW5rICNDUkVBVEUgQ1JFQVRFfW9yIHtAbGluayAjRE9OVF9DUkVBVEUgRE9OVF9DUkVBVEV9LgotCSAqICAgICAgICAgICAgPHVsPgotCSAqICAgICAgICAgICAgPGxpPjxjb2RlPkNSRUFURTwvY29kZT4tIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbgotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gZG8gbm90IGV4aXN0LCB0aGV5IHdpbGwKLQkgKiAgICAgICAgICAgIGJlIGNyZWF0ZWQuCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+RE9OVF9DUkVBVEU8L2NvZGU+LSBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMKLQkgKiAgICAgICAgICAgIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGRvIG5vdCBleGlzdCwgdGhlCi0JICogICAgICAgICAgICBtZXRob2Qgd2lsbCB0aHJvdyBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+LgotCSAqICAgICAgICAgICAgPC91bD4KLQkgKiBAcGFyYW0gb3ZlcndyaXRlRmlsZXMKLQkgKiAgICAgICAgICAgIFRoZSBwb2xpY3kgZm9yIGV4aXN0aW5nIGZpbGVzLCBvbmUgb2YKLQkgKiAgICAgICAgICAgIHtAbGluayAjT1ZFUldSSVRFIE9WRVJXUklURX1vcgotCSAqICAgICAgICAgICAge0BsaW5rICNET05UX09WRVJXUklURSBET05UX09WRVJXUklURX0uCi0JICogICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICA8bGk+PGNvZGU+T1ZFUldSSVRFPC9jb2RlPi0gSWYgYSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lCi0JICogICAgICAgICAgICBhcyB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cyBhbmQgaXMKLQkgKiAgICAgICAgICAgIGEgZmlsZSwgaXQgd2lsbCBiZSByZXBsYWNlZC4gSWYgdGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzCi0JICogICAgICAgICAgICBhbmQgaXQgaXMgbm90IGEgZmlsZSwgdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQgYQotCSAqICAgICAgICAgICAgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+RE9OVF9PVkVSV1JJVEU8L2NvZGU+LSBJZiBhbnkgcmVzb3VyY2Ugb2YgdGhlCi0JICogICAgICAgICAgICBzYW1lIG5hbWUgYXMgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeQotCSAqICAgICAgICAgICAgZXhpc3RzLCB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZCBhCi0JICogICAgICAgICAgICA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLQkgKiAgICAgICAgICAgIDwvdWw+Ci0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c313aXRoIGEKLQkgKiAgICAgICAgICAgICBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotCSAqICAgICAgICAgICAgIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0JICovCi0JLy8gIHN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5RW51bWVyYXRlZEZpbGVzICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBQbHVnaW4gcGx1Z2luLAotCS8vICAgIElQYXRoIHNvdXJjZVBhdGgsCi0JLy8gICAgRW51bWVyYXRpb24gcGF0aG5hbWVzLAotCS8vICAgIElQYXRoIHRhcmdldFBhdGgsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yCi0JLy8gICkKLQkvLyAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgewotCS8vICAgIHdoaWxlIChwYXRobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gICAgewotCS8vICAgICAgU3RyaW5nIGZpbGVuYW1lID0gKFN0cmluZylwYXRobmFtZXMubmV4dEVsZW1lbnQoKTsKLQkvLyAgICAgIGNvcHlGaWxlKHJlc291cmNlQ29udGV4dCwgcGx1Z2luLCBzb3VyY2VQYXRoLCBuZXcgUGF0aChmaWxlbmFtZSksCi0JLy8gdGFyZ2V0UGF0aCwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNNb25pdG9yKTsKLQkvLyAgICB9Ci0JLy8gIH0KLQkvKioKLQkgKiBDb3BpZXMgYSBmaWxlIGZyb20gYSBwbHVnaW4ncyBpbnN0YWxsYXRpb24gbG9jYXRpb24gdG8gYW4gRWNsaXBzZSBmb2xkZXIuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgVGhlIHBsdWdpbiBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSBzb3VyY2VQYXRoCi0JICogICAgICAgICAgICBUaGUgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIDxjb2RlPnBsdWdpbjwvY29kZT4gaW5zdGFsbAotCSAqICAgICAgICAgICAgbG9jYXRpb24sIGNvbnRhaW5pbmcgdGhlIGZpbGVzIHRvIGNvcHkuIElmIG51bGwsIHRoZW4gdGhlCi0JICogICAgICAgICAgICBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbiBpcyB0aGUgc291cmNlIHBhdGggKGllLiBudWxsIGlzCi0JICogICAgICAgICAgICBlcXVpdmFsZW50IHRvICIuIikuCi0JICogQHBhcmFtIHBhdGhuYW1lCi0JICogICAgICAgICAgICBUaGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgdG8gY29weS4gVGhlIHBhdGhuYW1lIGlzIHJlbGF0aXZlIHRvCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+cGx1Z2luIHNvdXJjZVBhdGg8L2NvZGU+LiBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSB0YXJnZXRQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgRWNsaXBzZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gd2hpY2ggdGhlIGZpbGUgd2lsbAotCSAqICAgICAgICAgICAgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgaXMgcHJlc2VydmVkLgotCSAqICAgICAgICAgICAgTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gY3JlYXRlRm9sZGVycwotCSAqICAgICAgICAgICAgVGhlIGludGVybWVkaWF0ZSBmb2xkZXIgY3JlYXRpb24gcG9saWN5LCBvbmUgb2YKLQkgKiAgICAgICAgICAgIHtAbGluayAjQ1JFQVRFIENSRUFURX1vciB7QGxpbmsgI0RPTlRfQ1JFQVRFIERPTlRfQ1JFQVRFfS4KLQkgKiAgICAgICAgICAgIDx1bD4KLQkgKiAgICAgICAgICAgIDxsaT48Y29kZT5DUkVBVEU8L2NvZGU+LSBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMgaW4KLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGRvIG5vdCBleGlzdCwgdGhleSB3aWxsCi0JICogICAgICAgICAgICBiZSBjcmVhdGVkLgotCSAqICAgICAgICAgICAgPGxpPjxjb2RlPkRPTlRfQ1JFQVRFPC9jb2RlPi0gSWYgYW55IGludGVybWVkaWF0ZSBmb2xkZXJzCi0JICogICAgICAgICAgICBpbiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBkbyBub3QgZXhpc3QsIHRoZQotCSAqICAgICAgICAgICAgbWV0aG9kIHdpbGwgdGhyb3cgYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPi4KLQkgKiAgICAgICAgICAgIDwvdWw+Ci0JICogQHBhcmFtIG92ZXJ3cml0ZUZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBwb2xpY3kgZm9yIGV4aXN0aW5nIGZpbGVzLCBvbmUgb2YKLQkgKiAgICAgICAgICAgIHtAbGluayAjT1ZFUldSSVRFIE9WRVJXUklURX1vcgotCSAqICAgICAgICAgICAge0BsaW5rICNET05UX09WRVJXUklURSBET05UX09WRVJXUklURX0uCi0JICogICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICA8bGk+PGNvZGU+T1ZFUldSSVRFPC9jb2RlPi0gSWYgYSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lCi0JICogICAgICAgICAgICBhcyB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiBhbHJlYWR5IGV4aXN0cyBhbmQgaXMKLQkgKiAgICAgICAgICAgIGEgZmlsZSwgaXQgd2lsbCBiZSByZXBsYWNlZC4gSWYgdGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzCi0JICogICAgICAgICAgICBhbmQgaXQgaXMgbm90IGEgZmlsZSwgdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQgYQotCSAqICAgICAgICAgICAgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uCi0JICogICAgICAgICAgICA8bGk+PGNvZGU+RE9OVF9PVkVSV1JJVEU8L2NvZGU+LSBJZiBhbnkgcmVzb3VyY2Ugb2YgdGhlCi0JICogICAgICAgICAgICBzYW1lIG5hbWUgYXMgdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeQotCSAqICAgICAgICAgICAgZXhpc3RzLCB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZCBhCi0JICogICAgICAgICAgICA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLQkgKiAgICAgICAgICAgIDwvdWw+Ci0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c313aXRoIGEKLQkgKiAgICAgICAgICAgICBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotCSAqICAgICAgICAgICAgIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0JICovCi0JLy8gIHN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5RmlsZSAoCi0JLy8gICAgICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0JLy8gICAgUGx1Z2luIHBsdWdpbiwKLQkvLyAgICBJUGF0aCBzb3VyY2VQYXRoLAotCS8vICAgIElQYXRoIHBhdGhuYW1lLAotCS8vICAgIElQYXRoIHRhcmdldFBhdGgsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yCi0JLy8gICkKLQkvLyAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgewotCS8vICAgIHRyeQotCS8vICAgIHsKLQkvLyAgICAgIElQYXRoIHRhcmdldCA9IHRhcmdldFBhdGguYXBwZW5kKHBhdGhuYW1lKTsKLQkvLyAgICAgIElQYXRoIHNvdXJjZSA9IHNvdXJjZVBhdGggPT0gbnVsbCA/IHBhdGhuYW1lIDoKLQkvLyBzb3VyY2VQYXRoLmFwcGVuZChwYXRobmFtZSk7Ci0JLy8gICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IHBsdWdpbi5vcGVuU3RyZWFtKHNvdXJjZSk7Ci0JLy8gICAgICBjcmVhdGVGaWxlKHJlc291cmNlQ29udGV4dCwgdGFyZ2V0LCBpbnB1dCwgcHJvZ3Jlc3NNb25pdG9yLAotCS8vIHN0YXR1c01vbml0b3IpOwotCS8vICAgIH0KLQkvLyAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkvLyAgICB7Ci0JLy8gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5FUlJPUixwbHVnaW4uZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwwLFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9JTyIpLGUpKTsKLQkvLyAgICB9Ci0JLy8gIH0KLQkvKioKLQkgKiBDb3BpZXMgYSBzZXQgb2YgZmlsZXMgZnJvbSBhIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbiB0byBhIG5hdGl2ZQotCSAqIGRpcmVjdG9yeS4gVGhlIGZpbGVzIGFyZSBuYW1lZCBpbiBhbiBpbmRleCBmaWxlIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhlCi0JICogcGx1Z2luJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBpbmRleFBhdGhuYW1lCi0JICogICAgICAgICAgICBBIGZpbGUgY29udGFpbmluZyBhIHdoaXRlc3BhY2UtZGVsaW1pdHRlZCBsaXN0IG9mIHBhdGhuYW1lcyBvZgotCSAqICAgICAgICAgICAgdGhlIGZpbGVzIHRvIGNvcHkuIFRoZSBwYXRobmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZQotCSAqICAgICAgICAgICAgPGNvZGU+cGx1Z2luIHNvdXJjZVBhdGg8L2NvZGU+LiBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSB0YXJnZXRQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgbmF0aXZlIGRpcmVjdG9yeSB0byB3aGljaCB0aGUgZmlsZXMKLQkgKiAgICAgICAgICAgIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWVzIG9mIHRoZSBmaWxlcyBuYW1lZCBpbgotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPmluZGV4UGF0aG5hbWU8L2NvZGU+IGZpbGUgYXJlIHByZXNlcnZlZC4gTXVzdCBub3QKLQkgKiAgICAgICAgICAgIGJlIG51bGwuCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGFuIElPIGVycm9yIGhhcyBvY2N1cmVkLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5SW5kZXhlZEZpbGVzVG9PUyhQbHVnaW4gcGx1Z2luLCBJUGF0aCBzb3VyY2VQYXRoLAotCQkJSVBhdGggaW5kZXhQYXRobmFtZSwgSVBhdGggdGFyZ2V0UGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IHBsdWdpbi5vcGVuU3RyZWFtKGluZGV4UGF0aG5hbWUpOwotCQlFbnVtZXJhdGlvbiBmaWxlbmFtZXMgPSBTdHJpbmdVdGlscy5wYXJzZUZpbGVuYW1lc0Zyb21TdHJlYW0oaW5wdXQpOwotCQljb3B5RW51bWVyYXRlZEZpbGVzVG9PUyhwbHVnaW4sIHNvdXJjZVBhdGgsIGZpbGVuYW1lcywgdGFyZ2V0UGF0aCwKLQkJCQlwcm9ncmVzc01vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBhIHNldCBvZiBmaWxlcyBmcm9tIGEgcGx1Z2luJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIHRvIGEgbmF0aXZlCi0JICogZGlyZWN0b3J5LiBUaGUgZmlsZXMgYXJlIG5hbWVkIGluIGFuIGVudW1lcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBwYXRobmFtZXMKLQkgKiAgICAgICAgICAgIEFuIGVudW1lcmF0aW9uIG9mIHBhdGhuYW1lcyBvZiB0aGUgZmlsZXMgdG8gY29weS4gVGhlCi0JICogICAgICAgICAgICBwYXRobmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW4gc291cmNlUGF0aDwvY29kZT4uCi0JICogICAgICAgICAgICBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSB0YXJnZXRQYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgbmF0aXZlIGRpcmVjdG9yeSB0byB3aGljaCB0aGUgZmlsZXMKLQkgKiAgICAgICAgICAgIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWVzIG9mIHRoZSBmaWxlcyBuYW1lZCBpbgotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPnBhdGhuYW1lczwvY29kZT4gZW51bWVyYXRpb24gYXJlIHByZXNlcnZlZC4gTXVzdAotCSAqICAgICAgICAgICAgbm90IGJlIG51bGwuCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGFuIElPIGVycm9yIGhhcyBvY2N1cmVkLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5RW51bWVyYXRlZEZpbGVzVG9PUyhQbHVnaW4gcGx1Z2luLCBJUGF0aCBzb3VyY2VQYXRoLAotCQkJRW51bWVyYXRpb24gcGF0aG5hbWVzLCBJUGF0aCB0YXJnZXRQYXRoLAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXdoaWxlIChwYXRobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyBmaWxlbmFtZSA9IChTdHJpbmcpIHBhdGhuYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJY29weUZpbGVUb09TKHBsdWdpbiwgc291cmNlUGF0aCwgbmV3IFBhdGgoZmlsZW5hbWUpLCB0YXJnZXRQYXRoLAotCQkJCQlwcm9ncmVzc01vbml0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGEgZmlsZSBmcm9tIGEgcGx1Z2luJ3MgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIHRvIGEgbmF0aXZlCi0JICogZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIFRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGgsIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5wbHVnaW48L2NvZGU+IGluc3RhbGwKLQkgKiAgICAgICAgICAgIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LiBJZiBudWxsLCB0aGVuIHRoZQotCSAqICAgICAgICAgICAgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24gaXMgdGhlIHNvdXJjZSBwYXRoIChpZS4gbnVsbCBpcwotCSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byAiLiIpLgotCSAqIEBwYXJhbSBwYXRobmFtZQotCSAqICAgICAgICAgICAgVGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIGNvcHkuIFRoZSBwYXRobmFtZSBpcyByZWxhdGl2ZSB0bwotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPnBsdWdpbiBzb3VyY2VQYXRoPC9jb2RlPi4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gdGFyZ2V0UGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIG5hdGl2ZSBkaXJlY3RvcnkgdG8gd2hpY2ggdGhlIGZpbGUKLQkgKiAgICAgICAgICAgIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgaXMKLQkgKiAgICAgICAgICAgIHByZXNlcnZlZC4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogICAgICAgICAgICBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGluZGljYXRpbmcgYW4gSU8gZXJyb3IgaGFzIG9jY3VyZWQuCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGNvcHlGaWxlVG9PUyhQbHVnaW4gcGx1Z2luLCBJUGF0aCBzb3VyY2VQYXRoLAotCQkJSVBhdGggcGF0aG5hbWUsIElQYXRoIHRhcmdldFBhdGgsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVBhdGggdGFyZ2V0ID0gdGFyZ2V0UGF0aC5hcHBlbmQocGF0aG5hbWUpOwotCQlJUGF0aCBzb3VyY2UgPSBzb3VyY2VQYXRoID09IG51bGwgPyBwYXRobmFtZSA6IHNvdXJjZVBhdGgKLQkJCQkuYXBwZW5kKHBhdGhuYW1lKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBwbHVnaW4ub3BlblN0cmVhbShzb3VyY2UpOwotCQlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0LnRvT1NTdHJpbmcoKSk7Ci0JCWNvcHlTdHJlYW0oaW5wdXQsIG91dHB1dCk7Ci0JCWlucHV0LmNsb3NlKCk7Ci0JCW91dHB1dC5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIENvcGllcyBkYXRhIGZyb20gb25lIHN0cmVhbSB0byBhbm90aGVyLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgVGhlIGlucHV0IHN0cmVhbS4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHN0cmVhbS4KLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBBbiBleGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHByb2Nlc3NpbmcgZWl0aGVyIG9mCi0JICogICAgICAgICAgICAgdGhlIHN0cmVhbXMuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBpbnQgY29weVN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCB0ID0gMDsKLQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCQlpbnQgbiA9IGlucHV0LnJlYWQoYnVmZmVyKTsKLQkJd2hpbGUgKG4gPj0gMCkgewotCQkJb3V0cHV0LndyaXRlKGJ1ZmZlciwgMCwgbik7Ci0JCQl0ICs9IG47Ci0JCQluID0gaW5wdXQucmVhZChidWZmZXIpOwotCQl9Ci0JCXJldHVybiB0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuYXRpdmUgZGlyZWN0b3J5IHBhdGggZXF1YWwgdG8gdGhlIHBhcmVudCBwb3J0aW9uIG9mIHRoZSBnaXZlbgotCSAqIDxjb2RlPnBhdGhuYW1lPC9jb2RlPi4gSWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cywgdGhlbiBubyBhY3Rpb24KLQkgKiBpcyB0YWtlbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSB3aG9zZSBwYXJlbnQgZGlyZWN0b3J5IHNob3VsZCBiZQotCSAqICAgICAgICAgICAgY3JlYXRlZC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGlmIGFuIElPIGVycm9yIG9jY3Vycy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgY3JlYXRlUGFyZW50RGlyZWN0b3J5Rm9yKFN0cmluZyBwYXRobmFtZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGhuYW1lKTsKLQkJRmlsZSBwYXJlbnQgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQubWtkaXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJUmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBUaGUgc2VsZWN0aW9uCi0JICogQHJldHVybiBJUmVzb3VyY2UgaWYgdGhlIHNlbGVjdGlvbiByZXByZXNlbnRzIGFuIElSZXNvdXJjZS4gUmV0dXJucyBudWxsCi0JICogICAgICAgICBvdGhlcndpc2UuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKE9iamVjdCBvYmopCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqZWN0ID0gIisgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlyZXMgPSAoSVJlc291cmNlKSBvYmo7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBVbml0ID0gKElDb21waWxhdGlvblVuaXQpIG9iajsKLQkJCQlyZXMgPSBjb21wVW5pdC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pIHsKLQkJCQlFbnRlcnByaXNlQmVhbiBlamJCZWFuID0gKEVudGVycHJpc2VCZWFuKSBvYmo7Ci0JCQkJSVByb2plY3QgZWpiUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlamJCZWFuKTsKLQkJCQlpZiAoZWpiUHJvamVjdCAhPSBudWxsKQotCQkJCQlyZXMgPSBlamJQcm9qZWN0OwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcmVzOwotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIE5hdWdodHkgYml0cy4uLgotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JLy8KLQkvLyBDcmVhdGVzIGEgcGF0aCBvZiBmb2xkZXJzLgotCS8vIERvIG5vdCBjYWxsIHdpdGggYW4gYWJzb2x1dGVQYXRoIG9mIGxlc3MgdGhhbiBvbmUgc2VnbWVudC4KLQkvLwotCS8vICBwcml2YXRlIHN0YXRpYyBJQ29udGFpbmVyIG1ha2VGb2xkZXJQYXRoICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBJUGF0aCBhYnNvbHV0ZVBhdGgsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yCi0JLy8gICkKLQkvLyAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgewotCS8vICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPD0gMSkKLQkvLyAgICB7Ci0JLy8gICAgICByZXR1cm4gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoYWJzb2x1dGVQYXRoLnNlZ21lbnQoMCkpOwotCS8vICAgIH0KLQkvLyAgICBlbHNlCi0JLy8gICAgewotCS8vICAgICAgSUNvbnRhaW5lciBwYXJlbnQgPSBtYWtlRm9sZGVyUGF0aChyZXNvdXJjZUNvbnRleHQsCi0JLy8gYWJzb2x1dGVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNNb25pdG9yKTsKLQkvLyAgICAgIFN0cmluZyBmb2xkZXJOYW1lID0gYWJzb2x1dGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0JLy8gICAgICByZXR1cm4gbWFrZUZvbGRlcihyZXNvdXJjZUNvbnRleHQsIHBhcmVudCxmb2xkZXJOYW1lLCBwcm9ncmVzc01vbml0b3IgLAotCS8vIHN0YXR1c01vbml0b3IpOwotCS8vICAgIH0KLQkvLyAgfQotCS8vCi0JLy8gQ3JlYXRlcyBhIGZvbGRlciB1bmRlciBhIGNvbnRhaW5lci4KLQkvLyBUaGUgY29udGFpbmVyIG11c3QgYWxyZWFkeSBleGlzdC4KLQkvLwotCS8vIHByaXZhdGUgc3RhdGljIElGb2xkZXIgbWFrZUZvbGRlciAoCi0JLy8gICAgICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0JLy8gICAgSUNvbnRhaW5lciBwYXJlbnQsCi0JLy8gICAgU3RyaW5nIGZvbGRlck5hbWUsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yCi0JLy8gICkKLQkvLyAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgewotCS8vICAgIElSZXNvdXJjZSBjaGlsZCA9IHBhcmVudC5maW5kTWVtYmVyKGZvbGRlck5hbWUpOwotCS8vICAgIGlmIChjaGlsZCA9PSBudWxsKQotCS8vICAgIHsKLQkvLyAgICAgIGlmICghcmVzb3VyY2VDb250ZXh0LmlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKSkgewotCS8vICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMobmV3Ci0JLy8gU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlUGx1Z2luLklELDAsCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfRk9MREVSX0NSRUFUSU9OX0RJU0FCTEVEIiwKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxmb2xkZXJOYW1lfSksbnVsbCksCi0JLy8gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkpOwotCS8vICAgICAgICBpZiAocmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JLy8KLQkvLyAgICAgICAgICBpZiAoIHJlc3VsdCA9PSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQpCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvbnRleHQuc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQodHJ1ZSk7Ci0JLy8KLQkvLyAgICAgIH0KLQkvLyAgICAgIElGb2xkZXIgZm9sZGVyID0gcGFyZW50LmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJOYW1lKSk7Ci0JLy8gICAgICBmb2xkZXIuY3JlYXRlKHRydWUsdHJ1ZSxwcm9ncmVzc01vbml0b3IpOwotCS8vICAgICAgcmV0dXJuIGZvbGRlcjsKLQkvLyAgICB9Ci0JLy8gICAgZWxzZSBpZiAoY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpCi0JLy8gICAgewotCS8vICAgICAgcmV0dXJuIChJRm9sZGVyKWNoaWxkOwotCS8vICAgIH0KLQkvLyAgICBlbHNlCi0JLy8gICAgewotCS8vICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3Ci0JLy8gU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZVBsdWdpbi5JRCwwLFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRk9MREVSIixuZXcKLQkvLyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZvbGRlck5hbWUpLnRvU3RyaW5nKCl9KSxudWxsKSk7Ci0JLy8gICAgfQotCS8vICB9Ci0KLQkvLwotCS8vIENyZWF0ZXMgYSBmaWxlIHVuZGVyIGEgY29udGFpbmVyLgotCS8vIFRoZSBjb250YWluZXIgbXVzdCBhbHJlYWR5IGV4aXN0LgotCS8vCi0JLy8gcHJpdmF0ZSBzdGF0aWMgSUZpbGUgbWFrZUZpbGUgKAotCS8vICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0JLy8gICAgSUNvbnRhaW5lciBwYXJlbnQsCi0JLy8gICAgU3RyaW5nIGZpbGVOYW1lLAotCS8vICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLAotCS8vICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCS8vICAgIFN0YXR1c01vbml0b3Igc3RhdHVzTW9uaXRvcgotCS8vICApCi0JLy8gIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JLy8gIHsKLQkvLyAgICBJUmVzb3VyY2UgY2hpbGQgPSBwYXJlbnQuZmluZE1lbWJlcihmaWxlTmFtZSk7Ci0JLy8gICAgaWYgKGNoaWxkICE9IG51bGwpCi0JLy8gICAgewotCS8vICAgICAgaWYgKGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkvLyAgICAgIHsKLQkvLyAgICAgICAgaWYgKCFyZXNvdXJjZUNvbnRleHQuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSkgewotCS8vICAgICAgICAgIGludCByZXN1bHQgPSBzdGF0dXNNb25pdG9yLnJlcG9ydFN0YXR1cyggbmV3Ci0JLy8gU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlUGx1Z2luLklELDAsCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQiLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwYXJlbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLGZpbGVOYW1lfSksbnVsbCksCi0JLy8gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkpOwotCS8vCi0JLy8gICAgICAgICAgaWYgKHJlc3VsdCA9PSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCS8vCi0JLy8gICAgICAgICAgaWYgKCByZXN1bHQgPT0gSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZCh0cnVlKTsKLQkvLyAgICAgICAgfQotCS8vICAgICAgICAvL1dlIGhhdmUgcGVybWlzc2lvbiB0byBvdmVyd3JpdGUgc28gY2hlY2sgaWYgZmlsZSBpcyByZWFkLW9ubHkKLQkvLyAgICAgICAgaWYgKGNoaWxkLmlzUmVhZE9ubHkoKSkKLQkvLyAgICAgICAgewotCS8vICAgICAgICAgIGlmICghcmVzb3VyY2VDb250ZXh0LmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSkgewotCS8vCi0JLy8gICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoIG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZVBsdWdpbi5JRCwwLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0ZJTEVfQ0hFQ0tPVVRfRElTQUJMRUQiLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwYXJlbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLGZpbGVOYW1lfSksbnVsbCksCi0JLy8gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkpOwotCS8vCi0JLy8gICAgICAgICAgICBpZiAocmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JLy8KLQkvLyAgICAgICAgICAgIGlmICggcmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29udGV4dC5zZXRDaGVja291dEZpbGVzRW5hYmxlZCh0cnVlKTsKLQkvLyAgICAgICAgICB9Ci0JLy8KLQkvLyAgICAgICAgICBJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlWzFdOwotCS8vICAgICAgICAgIGZpbGVzWzBdID0gKElGaWxlKWNoaWxkOwotCS8vCi0JLy8gICAgICAgICAgaWYgKAotCS8vICFzdGF0dXNNb25pdG9yLnJlcG9ydFN0YXR1cyhnZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsbnVsbCkpKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQkvLyAgICAgICAgfQotCS8vCi0JLy8gICAgICAgIC8vQ2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgZXhpc3RpbmcgZmlsZS4KLQkvLyAgICAgICAgICAgIElGaWxlIGZpbGUgPSBwYXJlbnQuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpOwotCS8vICAgICAgICBmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLHRydWUsdHJ1ZSxwcm9ncmVzc01vbml0b3IpOwotCS8vICAgICAgICByZXR1cm4gZmlsZTsKLQkvLwotCS8vICAgICAgfQotCS8vICAgICAgZWxzZQotCS8vICAgICAgewotCS8vICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXZWJTZXJ2aWNlUGx1Z2luLklELDAsV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GSUxFIixuZXcKLQkvLyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZpbGVOYW1lKX0pLG51bGwpKTsKLQkvLyAgICAgIH0KLQkvLyAgICB9Ci0JLy8gICAgZWxzZQotCS8vICAgIHsKLQkvLyAgICAgICAgLy9DcmVhdGUgYSBuZXcgZmlsZS4KLQkvLyAgICAgICAgSUZpbGUgZmlsZSA9IHBhcmVudC5nZXRGaWxlKG5ldyBQYXRoKGZpbGVOYW1lKSk7Ci0JLy8gICAgICAgIGZpbGUuY3JlYXRlKGlucHV0U3RyZWFtLHRydWUscHJvZ3Jlc3NNb25pdG9yKTsKLQkvLyAgICAgICAgcmV0dXJuIGZpbGU7Ci0JLy8gICAgfQotCS8vICB9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGEgZmlsZSB1bmRlciBhIGNvbnRhaW5lci4gVGhlIGNvbnRhaW5lciBtdXN0IGFscmVhZHkgZXhpc3QuCi0JICogCi0JICogQHBhcmFtIGZpbGUgLQotCSAqICAgICAgICAgICAgdGhlIElGaWxlIHRvIGJlIGRlbGV0ZWQKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHBhcmFtIHN0YXR1c01vbml0b3IKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaWYgaXQgZXhpc3RzIGFuZCBpcwotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQuIEZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQkvLyAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZpbGUgKAotCS8vICAgICAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotCS8vICAgIElGaWxlIGZpbGUsCi0JLy8gICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0JLy8gICAgU3RhdHVzTW9uaXRvciBzdGF0dXNNb25pdG9yICkKLQkvLyAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCS8vICAgIHsKLQkvLyAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCi0JLy8gICAgICAgIHsKLQkvLyAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKSB7Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoIG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZVBsdWdpbi5JRCwwLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQiLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10KLQkvLyB7ZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksZmlsZS5nZXROYW1lKCl9KSxudWxsKSwKLQkvLyBnZXRUaHJlZVN0YXRlRmlsZU9wdGlvbnMoKSk7Ci0JLy8KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCS8vCi0JLy8gICAgICAgICAgICAgICAgaWYgKCByZXN1bHQgPT0gSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvbnRleHQuc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKHRydWUpOwotCS8vICAgICAgICAgICAgICAgICAgICAgICAgfQotCS8vICAgICAgICAgICAgICAgIC8vV2UgaGF2ZSBwZXJtaXNzaW9uIHRvIG92ZXJ3cml0ZSBzbyBjaGVjayBpZiBmaWxlIGlzIHJlYWQtb25seQotCS8vICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzUmVhZE9ubHkoKSkKLQkvLyAgICAgICAgICAgICAgICB7Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpIHsKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoIG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZVBsdWdpbi5JRCwwLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRCIsCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXQotCS8vIHtmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxmaWxlLmdldE5hbWUoKX0pLG51bGwpLAotCS8vIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpKTsKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JLy8KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnNldENoZWNrb3V0RmlsZXNFbmFibGVkKHRydWUpOwotCS8vCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIElGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbMV07Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICBmaWxlc1swXSA9IGZpbGU7Ci0JLy8KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKLQkvLyAhc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLG51bGwpKSkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCS8vICAgICAgICAgICAgICAgIH0KLQkvLyAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZSh0cnVlLHByb2dyZXNzTW9uaXRvcik7Ci0JLy8gICAgICAgICAgICAgICAgfQotCS8vICAgICAgICAvL0F0IHRoaXMgcG9pbnQsIGVpdGhlciB0aGUgZmlsZSBkaWQgbm90IGV4aXN0IG9yIHdlIHN1Y2Nlc3NmdWxseSBkZWxldGVkCi0JLy8gaXQuIFJldHVybiBzdWNjZXNzLgotCS8vICAgICAgICByZXR1cm4gdHJ1ZTsKLQkvLyAgfQotCS8qKgotCSAqIERlbGV0ZXMgYSBmb2xkZXIgdW5kZXIgYSBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIGZvbGRlciAtCi0JICogICAgICAgICAgICB0aGUgSUZvbGRlciB0byBiZSBkZWxldGVkCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSBzdGF0dXNNb25pdG9yCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3Qgb3IgaWYgaXQgZXhpc3RzIGFuZCBpcwotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgYWxvbmcgd2l0aCBpdHMgbWVtYmVycy4gRmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCS8vICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRm9sZGVyICgKLQkvLyAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotCS8vICAgIElGb2xkZXIgZm9sZGVyLAotCS8vICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCS8vICAgIFN0YXR1c01vbml0b3Igc3RhdHVzTW9uaXRvcgotCS8vICApCi0JLy8gIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JLy8gIHsKLQkvLyAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkgcmV0dXJuIHRydWU7Ci0JLy8KLQkvLyAgICBib29sZWFuIGRlbGV0ZWQgPSB0cnVlOwotCS8vICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IGZvbGRlci5tZW1iZXJzKCk7Ci0JLy8gICAgZm9yIChpbnQgaT0wOyBpPHJlc291cmNlcy5sZW5ndGg7IGkrKykKLQkvLyAgICB7Ci0JLy8gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JLy8gICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLQkvLyAgICAgIHsKLQkvLyAgICAgICAgZGVsZXRlZCA9IGRlbGV0ZUZpbGUocmVzb3VyY2VDb250ZXh0LCAoSUZpbGUpcmVzb3VyY2UsIHByb2dyZXNzTW9uaXRvciwKLQkvLyBzdGF0dXNNb25pdG9yKTsKLQkvLyAgICAgIH0KLQkvLyAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpCi0JLy8gICAgICB7Ci0JLy8gICAgICAgIGRlbGV0ZWQgPSBkZWxldGVGb2xkZXIoIHJlc291cmNlQ29udGV4dCwgKElGb2xkZXIpcmVzb3VyY2UsCi0JLy8gcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNNb25pdG9yKTsKLQkvLyAgICAgIH0KLQkvLwotCS8vICAgICAgaWYgKCFkZWxldGVkKSBicmVhazsKLQkvLyAgICB9Ci0JLy8gICAgaWYgKGRlbGV0ZWQpIHsKLQkvLyAgICAgIGZvbGRlci5kZWxldGUodHJ1ZSwgdHJ1ZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQkvLyAgICAgIHJldHVybiB0cnVlOwotCS8vICAgIH0KLQkvLyAgICBlbHNlCi0JLy8gICAgICByZXR1cm4gZmFsc2U7Ci0JLy8KLQkvLyAgfQotCS8qKgotCSAqIERlbGV0ZXMgYSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgbmFtZWQgaW4gYW4gaW5kZXggZmlsZSBsb2NhdGVkIHJlbGF0aXZlCi0JICogdG8gdGhlIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBUaGUgcGx1Z2luIGNvbnRhaW5pbmcgdGhlIGluZGV4ZWQgZmlsZSBNdXN0IG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSBzb3VyY2VQYXRoIC0KLQkgKiAgICAgICAgICAgIHJlbGF0aXZlIHBhdGggb2YgdGhlIGluZGV4ZWQgZmlsZSBwYXNzaW5nIGEgbnVsbCBpbiBoYXMgdGhlCi0JICogICAgICAgICAgICBzYW1lIGVmZmVjdCBhcyBwYXNzaW5nIGEgIi4iIGluCi0JICogQHBhcmFtIGluZGV4RmlsZVBhdGggLQotCSAqICAgICAgICAgICAgdGhlIGluZGV4ZWQgZmlsZW5hbWUgTXVzdCBub3QgYmUgbnVsbAotCSAqIEBwYXJhbSB0YXJnZXRQYXRoIC0KLQkgKiAgICAgICAgICAgIHBhdGggY29udGFpbmluZyB0aGUgZmlsZXMgbmFtZWQgaW4gdGhlIGluZGV4ZWQgZmlsZSBNdXN0IG5vdAotCSAqICAgICAgICAgICAgYmUgbnVsbCwgdGhpcyBwYXRoIG11c3QgZW5kIHdpdGggYSB0cmFpbGluZyBzZXBhcmF0b3IKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JLy8gIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVJbmRleEZpbGVzRnJvbU9TICgKLQkvLyAgICBQbHVnaW4gcGx1Z2luLAotCS8vICAgIElQYXRoIGluZGV4RmlsZVBhdGgsCi0JLy8gICAgSVBhdGggdGFyZ2V0UGF0aAotCS8vICApCi0JLy8gIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBwbHVnaW4ub3BlblN0cmVhbShpbmRleEZpbGVQYXRoKTsKLQkvLyAgICBFbnVtZXJhdGlvbiBmaWxlbmFtZXMgPSBTdHJpbmdVdGlscy5wYXJzZUZpbGVuYW1lc0Zyb21TdHJlYW0oaW5wdXQpOwotCS8vICAgIHdoaWxlIChmaWxlbmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkvLyAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9Ci0JLy8gdGFyZ2V0UGF0aC5hcHBlbmQoKFN0cmluZylmaWxlbmFtZXMubmV4dEVsZW1lbnQoKSkudG9GaWxlKCk7Ci0JLy8gICAgICBpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSkKLQkvLyAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLQkvLyAgICB9Ci0JLy8gIH0KLQkvKioKLQkgKiBSZXR1cm5zIGEgVVJJIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gRWNsaXBzZSByZXNvdXJjZSwgb3IgbnVsbCBpZiBubyBzdWNoCi0JICogcmVmZXJlbmNlIGNhbiBiZSBkZXRlcm1pbmVkIChmb3IgZXhhbXBsZSwgaWYgdGhlIHJlc291cmNlIGRvZXMgbm90IGV4aXN0Ci0JICogaW4gdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UuCi0JICogQHJldHVybiBUaGUgVVJJIGFzIGEgc3RyaW5nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIFVSSSB0byB0aGUgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVUkkoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVN0cmluZyB1cmkgPSBudWxsOwotCQlJUGF0aCBsb2NhdGlvbiA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQl1cmkgPSAiZmlsZToiICsgbG9jYXRpb24udG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBVUkkgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiBFY2xpcHNlIHJlc291cmNlIHVzaW5nIHRoZQotCSAqICJwbGF0Zm9ybToiIHByb3RvY29sLCBvciBudWxsIGlmIG5vIHN1Y2ggcmVmZXJlbmNlIGNhbiBiZSBkZXRlcm1pbmVkIChmb3IKLQkgKiBleGFtcGxlLCBpZiB0aGUgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2UuCi0JICogQHJldHVybiBUaGUgVVJJIGFzIGEgc3RyaW5nLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIFVSSSB0byB0aGUgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1SZXNvdXJjZVVSSShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCXVyaSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiICsgbG9jYXRpb24udG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgYmluZGluZyBuYW1lc3BhY2Ugc3RyaW5nIGdpdmVuIGEgSmF2YSBiZWFuIG5hbWUKLQkgKiAodXNpbmcgdGhlIGNvbnZlbnRpb24gdXNlZCBieSBDVEMgaW4gR00pLiBlLmcuIEphdmEgYmVhbiBNeUNsYXNzIHJlc3VsdAotCSAqIGluIGJpbmRpbmcgbmFtZXNwYWNlIG9mCi0JICogImh0dHA6Ly93d3cubXljbGFzcy5jb20vZGVmaW5pdGlvbnMvTXlDbGFzc1JlbW90ZUludGVyZmFjZSIKLQkgKiAKLQkgKiBAcGFyYW0gYmVhbk5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBqYXZhIGJlYW4uCi0JICogQHJldHVybiBUaGUgYmluZGluZyBuYW1lc3BhY2UgYXMgYSBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmluZGluZ05hbWVzcGFjZShTdHJpbmcgYmVhbk5hbWUpIHsKLQkJcmV0dXJuICJodHRwOi8vd3d3LiIgKyBiZWFuTmFtZS50b0xvd2VyQ2FzZSgpICsgIi5jb20vZGVmaW5pdGlvbnMvIgotCQkJCSsgYmVhbk5hbWUgKyAiUmVtb3RlSW50ZXJmYWNlIjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNjaGVtYSBuYW1lc3BhY2Ugc3RyaW5nIGdpdmVuIGEgSmF2YSBiZWFuIG5hbWUgKHVzaW5nCi0JICogdGhlIGNvbnZlbnRpb24gdXNlZCBieSBDVEMgaW4gR00pLiBlLmcuIEphdmEgYmVhbiBNeUNsYXNzIHJlc3VsdCBpbgotCSAqIHNjaGVtYSBuYW1lc3BhY2Ugb2YKLQkgKiAiaHR0cDovL3d3dy5teWNsYXNzLmNvbS9zY2hlbWFzL015Q2xhc3NSZW1vdGVJbnRlcmZhY2UiCi0JICogCi0JICogQHBhcmFtIGJlYW5OYW1lCi0JICogICAgICAgICAgICBUaGUgamF2YSBiZWFuLgotCSAqIEByZXR1cm4gVGhlIHNjaGVtYXMgbmFtZXNwYWNlIGFzIGEgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNjaGVtYU5hbWVzcGFjZShTdHJpbmcgYmVhbk5hbWUpIHsKLQkJcmV0dXJuICJodHRwOi8vd3d3LiIgKyBiZWFuTmFtZS50b0xvd2VyQ2FzZSgpICsgIi5jb20vc2NoZW1hcy8iCi0JCQkJKyBiZWFuTmFtZSArICJSZW1vdGVJbnRlcmZhY2UiOwotCX0KLQotCS8vICBwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRUaHJlZVN0YXRlRmlsZU9wdGlvbnMoKSB7Ci0JLy8gICAgICAgIFZlY3RvciBvcHRpb25zID0gbmV3IFZlY3RvcigpOwotCS8vICAgIG9wdGlvbnMuYWRkKG5ldwotCS8vIFN0YXR1c09wdGlvbihJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19JRCxJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwiIiwiIikpOwotCS8vICAgIG9wdGlvbnMuYWRkKG5ldwotCS8vIFN0YXR1c09wdGlvbihJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQsSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCIiLCIiKSk7Ci0JLy8gICAgb3B0aW9ucy5hZGQobmV3Ci0JLy8gU3RhdHVzT3B0aW9uKElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCIiLCIiKSk7Ci0JLy8gICAgcmV0dXJuIG9wdGlvbnM7Ci0JLy8gIH0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JLyoqCi0JICogR2V0cyB0aGUgU09BUCBycGNyb3V0ZXIgc2VydmxldCBVUkwgZm9yIHRoZSBzZXJ2aWNlIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHBhcmFtIHNlcnZlckZhY3RvcnlJZAotCSAqICAgICAgICAgICAgVGhlIHNlcnZlciBmYWN0b3J5IGlkCi0JICogQHBhcmFtIHNlcnZlcgotCSAqICAgICAgICAgICAgVGhlIHNlcnZlcgotCSAqIEByZXR1cm4gVGhlIFVSTCwgcG9zc2libHkgbnVsbC4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZsZXRVUkwoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBnZXRTZXJ2bGV0VVJMKGdldFdlYlByb2plY3RVUkwocHJvamVjdCwgc2VydmVyRmFjdG9yeUlkLCBzZXJ2ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2bGV0VVJMKFN0cmluZyB3ZWJQcm9qZWN0VVJMKSB7Ci0JCWlmICh3ZWJQcm9qZWN0VVJMID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIHdlYlByb2plY3RVUkwgKyBTRVJWTEVUX0VYVDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjbGllbnQgV2ViIHByb2plY3QgbmFtZQotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QgbmFtZSB0byBiYXNlIG9uLgotCSAqIEBwYXJhbSB0eXBlSWQgdGhlIHdlYnNlcnZpY2UgdHlwZSBpZC4KLQkgKiBAcmV0dXJuIFRoZSBjbGllbnQgV2ViIHByb2plY3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGllbnRXZWJQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyB0eXBlSWQpIAotCXsKLQkJU3RyaW5nICAgYmFzZUNsaWVudFdlYlByb2plY3ROYW1lID0gcHJvamVjdE5hbWUgKyBERUZBVUxUX0NMSUVOVF9XRUJfUFJPSkVDVF9FWFQ7Ci0JCUlQYXRoICAgIHByb2plY3RQYXRoOwotCQlJUHJvamVjdCBwcm9qZWN0OwotCQlib29sZWFuICBmb3VuZFdlYlByb2plY3QgICAgID0gZmFsc2U7Ci0JCWludCAgICAgIGkgICAgICAgICAgICAgICAgICAgPSAxOwotCQkKLQkJaWYoIGlzU2tlbGV0b25FSkJUeXBlKCB0eXBlSWQgKSApCi0JCXsKLQkJICAvLyBGb3IgdGhlIHNrZWxldG9uIEVKQiBzY2VuYXJpbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHNsaWdodGx5IGRpZmZlcmVudAotCQkgIC8vIGJhc2UgbmFtZS4gIFdoZW4gdGhlIEVKQiBwcm9qZWN0IGlzIGNyZWF0ZWQgYW5vdGhlciBwcm9qZWN0Ci0JCSAgLy8gaXMgY3JlYXRlZCB3aXRoICJDbGllbnQiIHRhY2tlZCBvbnRvIHRoZSBlbmQuICBXZSB3aWxsCi0JCSAgLy8gYWRkICJXUyIgdG8gb3VyIGNsaWVudCBzbyB3ZSBkb24ndCBjb2xsaWRlIHdpdGggdGhlIG90aGVyCi0JCSAgLy8gY2xpZW50IHByb2plY3QuCi0JCSAgYmFzZUNsaWVudFdlYlByb2plY3ROYW1lID0gcHJvamVjdE5hbWUgKyAiV1MiICsgREVGQVVMVF9DTElFTlRfV0VCX1BST0pFQ1RfRVhUOyAgICAKLQkJfQotCQkKLQkJU3RyaW5nICBjbGllbnRXZWJQcm9qZWN0TmFtZSA9IGJhc2VDbGllbnRXZWJQcm9qZWN0TmFtZTsKLQkJCi0JCXdoaWxlICghZm91bmRXZWJQcm9qZWN0KSAKLQkJewotCQkgIHByb2plY3RQYXRoID0gbmV3IFBhdGgoY2xpZW50V2ViUHJvamVjdE5hbWUpLm1ha2VBYnNvbHV0ZSgpOwotCQkgIHByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihwcm9qZWN0UGF0aCk7Ci0JCSAgCi0JCSAgaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgIVJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHByb2plY3QpKSAKLQkJICB7Ci0JCQljbGllbnRXZWJQcm9qZWN0TmFtZSA9IGJhc2VDbGllbnRXZWJQcm9qZWN0TmFtZSArIGk7Ci0JCQlpKys7Ci0JCSAgfQotCQkgIGVsc2UgCi0JCSAgewotCQkJZm91bmRXZWJQcm9qZWN0ID0gdHJ1ZTsKLQkJICB9Ci0JCX0KLQkJCi0JCXJldHVybiBjbGllbnRXZWJQcm9qZWN0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2VsZXRvbkVKQlR5cGUoIFN0cmluZyB0eXBlSUQgKQotCXsKLQkgIHJldHVybiB0eXBlSUQuZXF1YWxzKCAib3JnLmVjbGlwc2UuanN0LndzLnR5cGUud3NkbC5lamIiICk7ICAgIAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RUpCUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0VKQl9QUk9KRUNUX05BTUU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFdlYlByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9XRUJfUFJPSkVDVF9OQU1FOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJvdXRlclByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlyZXR1cm4gcHJvamVjdE5hbWUgKyBERUZBVUxUX1JPVVRFUl9QUk9KRUNUX0VYVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0U2VydmljZUVBUlByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9TRVJWSUNFX0VBUl9QUk9KRUNUX05BTUU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdENsaWVudEVBUlByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9DTElFTlRfRUFSX1BST0pFQ1RfTkFNRTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU2VsZWN0aW9uVG9SZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU2VsZWN0aW9uVG9SZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGU5ZjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1NlbGVjdGlvblRvUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uVG9SZXNvdXJjZSBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyI3RyYW5zZm9ybShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXZhbHVlOwotICAgIElSZXNvdXJjZSAgICAgICAgICAgIHJlc291cmNlICA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHNlbGVjdGlvbiAhPSBudWxsICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgCi0gICAgICBpZiggb2JqZWN0ICE9IG51bGwgKQotICAgICAgewotICAgICAgICBpZiggb2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb3VyY2UgPSAoSVJlc291cmNlKW9iamVjdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBvYmplY3QgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0ICkKLSAgICAgICAgewotICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcFVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdClvYmplY3Q7Ci0gICAgICAgICAgCi0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzb3VyY2UgPSBjb21wVW5pdC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2goIEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBvYmplY3QgaW5zdGFuY2VvZiBFbnRlcnByaXNlQmVhbiApIAotICAgICAgICB7Ci0gICAgICAgICAgRW50ZXJwcmlzZUJlYW4gZWpiQmVhbiAgICA9IChFbnRlcnByaXNlQmVhbilvYmplY3Q7Ci0gICAgICAgICAgSVByb2plY3QgICAgICAgZWpiUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCggZWpiQmVhbiApOwotICAgICAgICAgIAotICAgICAgICAgIGlmKCBlamJQcm9qZWN0ICE9IG51bGwgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc291cmNlID0gZWpiUHJvamVjdDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzb3VyY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1NlcnZlclV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TZXJ2ZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQ3NmRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1NlcnZlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LklTZXJ2ZXJUYXJnZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LlNlcnZlclRhcmdldEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklQcm9qZWN0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklSdW5uaW5nQWN0aW9uU2VydmVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgdXNlZnVsIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBTZXJ2ZXIgcGx1Z2luIGZ1bmN0aW9ucwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VydmVyVXRpbHMgewotCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsJCQotICBwcml2YXRlIEhhc2h0YWJsZSBzZXJ2ZXJJZFRvTGFiZWxfOwotICBwcml2YXRlIEhhc2h0YWJsZSBzZXJ2ZXJMYWJlbFRvSWRfOwotICBwcml2YXRlIHN0YXRpYyBTZXJ2ZXJVdGlscyBpbnN0YW5jZV87Ci0KLSAgcHVibGljIHN0YXRpYyBTZXJ2ZXJVdGlscyBnZXRJbnN0YW5jZSgpIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBTZXJ2ZXJVdGlscygpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotCi0gIH0KLQotICBwdWJsaWMgU2VydmVyVXRpbHMoKXsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsgIAkKLSAgfSAgCi0gIAotICAvLyBHZXRzIHRoZSBTZXJ2ZXIgbGFiZWxzIGdpdmVuIHRoZSBzZXJ2ZXIgZmFjdG9yeSBpZAotICBwdWJsaWMgdm9pZCBnZXRTZXJ2ZXJMYWJlbHNBbmRJZHMoKSB7Ci0gICAgc2VydmVySWRUb0xhYmVsXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBzZXJ2ZXJMYWJlbFRvSWRfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIElTZXJ2ZXJUeXBlW10gc2VydmVyVHlwZXMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgc2VydmVyVHlwZXMubGVuZ3RoOyBpZHgrKykgewotCi0gICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBzZXJ2ZXJUeXBlc1tpZHhdOwotCi0gICAgICBTdHJpbmcgaWQgPSBzZXJ2ZXJUeXBlLmdldElkKCk7Ci0gICAgICBTdHJpbmcgc2VydmVyTGFiZWwgPSBzZXJ2ZXJUeXBlLmdldE5hbWUoKTsKLSAgICAgIGlmICghKGlkID09IG51bGwpICYmICEoc2VydmVyTGFiZWwgPT0gbnVsbCkpIHsKLSAgICAgICAgc2VydmVySWRUb0xhYmVsXy5wdXQoaWQsIHNlcnZlckxhYmVsKTsKLSAgICAgICAgc2VydmVyTGFiZWxUb0lkXy5wdXQoc2VydmVyTGFiZWwsIGlkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckxhYmVsRm9ySWQoU3RyaW5nIGZhY3RvcnlJZCkgewotICAgIGlmIChzZXJ2ZXJJZFRvTGFiZWxfID09IG51bGwpCi0gICAgICB0aGlzLmdldFNlcnZlckxhYmVsc0FuZElkcygpOwotICAgIHJldHVybiAoU3RyaW5nKSBzZXJ2ZXJJZFRvTGFiZWxfLmdldChmYWN0b3J5SWQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJZEZvckxhYmVsKFN0cmluZyBmYWN0b3J5TGFiZWwpIHsKLSAgICBpZiAoc2VydmVyTGFiZWxUb0lkXyA9PSBudWxsKQotICAgICAgdGhpcy5nZXRTZXJ2ZXJMYWJlbHNBbmRJZHMoKTsKLSAgICByZXR1cm4gKFN0cmluZykgc2VydmVyTGFiZWxUb0lkXy5nZXQoZmFjdG9yeUxhYmVsKTsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyBtb2RpZnlNb2R1bGVzKEVudmlyb25tZW50IGVudiwgSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGUgbW9kdWxlLCBib29sZWFuIGFkZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLSAgCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IG51bGw7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgdHJ5IHsKLQotICAgICAgaWYgKG1vZHVsZT09bnVsbCB8fCAhbW9kdWxlLmdldFByb2plY3QoKS5leGlzdHMoKSkgewotICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgfQotCi0KLSAgICAgIC8vIGNoZWNrIGlmIG1vZHVsZSBpcyBhIHRydWUgSmF2YSBwcm9qZWN0Ci0gIAkgIGlmIChtb2R1bGUgaW5zdGFuY2VvZiBJTW9kdWxlKXsKLSAgCSAgCUlNb2R1bGUgcG0gPSAoSU1vZHVsZSltb2R1bGU7Ci0gIAkgIAlpZiAocG0hPW51bGwpewotICAJICAJCUlQcm9qZWN0IHByb2plY3QgPSBwbS5nZXRQcm9qZWN0KCk7Ci0gIAkgIAkJaWYgKHByb2plY3Q9PW51bGwgfHwgUmVzb3VyY2VVdGlscy5pc1RydWVKYXZhUHJvamVjdChwcm9qZWN0KSkgewotICAJCQkJcmV0dXJuIHN0YXR1czsKLSAgCSAgCQl9Ci0gIAkgIAl9Ci0gIAkgIH0KLSAgICAgICAKLSAgICAgIHdjID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7ICAgICAKLSAgICAgIGlmICh3YyE9bnVsbCl7Ci0gICAgICAJT2JqZWN0IHggPSBzZXJ2ZXIuZ2V0QWRhcHRlcihJUnVubmluZ0FjdGlvblNlcnZlci5jbGFzcyk7Ci0gICAgICAgIGlmICh4IT1udWxsICYmIHggaW5zdGFuY2VvZiBJUnVubmluZ0FjdGlvblNlcnZlcikgewotICAgICAgICAgaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0gICAgICAgICBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikgewotICAgICAgICAgICBTdHJpbmcgbW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotICAgICAgICAgICBzZXJ2ZXIuc3luY2hyb25vdXNTdGFydChtb2RlLCBtb25pdG9yKTsKLSAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAKLSAgICAgIExpc3QgbGlzdCA9IEFycmF5cy5hc0xpc3Qoc2VydmVyLmdldE1vZHVsZXMoKSk7Ci0gICAgICBpZiAoYWRkKSB7Ci0gICAgICAgIGlmICghbGlzdC5jb250YWlucyhtb2R1bGUpKSB7Ci0gICAgICAgICAgU2VydmVyVXRpbC5tb2RpZnlNb2R1bGVzKHdjLCBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlfSwgbmV3IElNb2R1bGVbMF0sIG1vbml0b3IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsgLy8gcmVtb3ZlcyBtb2R1bGUKLSAgICAgICAgaWYgKGxpc3QuY29udGFpbnMobW9kdWxlKSkgewotICAgICAgICAgIFNlcnZlclV0aWwubW9kaWZ5TW9kdWxlcyh3YywgbmV3IElNb2R1bGVbMF0sIG5ldyBJTW9kdWxlW10geyBtb2R1bGV9LCBtb25pdG9yKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAJLy8gaGFuZGxlIGNhc2Ugb2YgTnVsbCBXQzsgbm9uLWlzc3VlIGZvciBub3cKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSwgU3RhdHVzLkVSUk9SLCBjZSk7Ci0gICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgZmluYWxseSB7Ci0gICAgICAgIGlmICh3YyAhPSBudWxsKSB7Ci0gICAgICAgICAgLy8gQWx3YXlzIHNhdmVBbGwgYW5kIHJlbGVhc2UgdGhlIHNlcnZlcldvcmtpbmdDb3B5Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAJd2Muc2F2ZUFsbCh0cnVlLCBtb25pdG9yKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZXgpewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSwgU3RhdHVzLkVSUk9SLCBjZXgpOwotICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9ICAKLQotICBwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZ2V0U2VydmVyRm9yTW9kdWxlKElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgc2VydmVyVHlwZUlkLCBJU2VydmVyIHNlcnZlciwgYm9vbGVhbiBjcmVhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiBzZXJ2ZXI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGdldFNlcnZlckZvck1vZHVsZShtb2R1bGUsIHNlcnZlclR5cGVJZCwgY3JlYXRlLCBtb25pdG9yKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSVNlcnZlciBnZXRTZXJ2ZXJGb3JNb2R1bGUoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBzZXJ2ZXJUeXBlSWQsIGJvb2xlYW4gY3JlYXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICB0cnkgewotCi0gICAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKG1vZHVsZSwgbW9uaXRvcik7Ci0KLSAgICAgIGlmIChzZXJ2ZXJzICE9IG51bGwgJiYgc2VydmVycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgIGlmIChzZXJ2ZXJUeXBlSWQgPT0gbnVsbCB8fCBzZXJ2ZXJUeXBlSWQubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICByZXR1cm4gc2VydmVyc1swXTsgLy8gV1NBRCB2NCBiZWhhdmlvcgotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIGlmIChzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpLmVxdWFsc0lnbm9yZUNhc2Uoc2VydmVyVHlwZUlkKSkKLSAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJzW2ldOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBjcmVhdGVTZXJ2ZXIobW9kdWxlLCBzZXJ2ZXJUeXBlSWQsIG1vbml0b3IpOwotCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBJU2VydmVyIGdldFNlcnZlckZvck1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotICAgIHRyeSB7Ci0gICAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKG1vZHVsZSwgbnVsbCk7Ci0gICAgICByZXR1cm4gKChzZXJ2ZXJzICE9IG51bGwgJiYgc2VydmVycy5sZW5ndGggPiAwKSA/IHNlcnZlcnNbMF0gOiBudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSVNlcnZlciBjcmVhdGVTZXJ2ZXIoRW52aXJvbm1lbnQgZW52LCBJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIHNlcnZlclR5cGVJZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLSAgCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXJXQyA9IG51bGw7Ci0gIAlJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0gIAl0cnkgewotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyVHlwZUlkKTsKLSAgICAgIHNlcnZlcldDID0gc2VydmVyVHlwZS5jcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZUlkLCBudWxsLCBtb25pdG9yKTsKLSAgICAgIHRyeXsKLSAgICAgICAgaWYgKHNlcnZlcldDIT1udWxsKXsKLSAgICAgICAgICBzZXJ2ZXIgPSBzZXJ2ZXJXQy5zYXZlQWxsKHRydWUsIG1vbml0b3IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaChDb3JlRXhjZXB0aW9uIGNlKXsKLSAgICAgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NFUlZFUiIpLCBTdGF0dXMuRVJST1IsIGNlKTsKLSAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotCi0gICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKLSAgICAgICAgCi0gICAgICAJT2JqZWN0IHggPSBzZXJ2ZXIuZ2V0QWRhcHRlcihJUnVubmluZ0FjdGlvblNlcnZlci5jbGFzcyk7Ci0gICAgICAgIGlmICh4IT1udWxsICYmIHggaW5zdGFuY2VvZiBJUnVubmluZ0FjdGlvblNlcnZlcikgewotICAgICAgICAgaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0gICAgICAgICBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikgewotICAgICAgICAgICBTdHJpbmcgbW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotICAgICAgICAgICBzZXJ2ZXIuc3luY2hyb25vdXNTdGFydChtb2RlLCBtb25pdG9yKTsKLSAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICAKLSAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsICYmIG1vZHVsZS5nZXRQcm9qZWN0KCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICBJTW9kdWxlW10gcGFyZW50TW9kdWxlcyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotICAgICAgICAgIGlmIChwYXJlbnRNb2R1bGVzIT1udWxsICYmIHBhcmVudE1vZHVsZXMubGVuZ3RoIT0wKSB7Ci0gICAgICAgICAgCW1vZHVsZSA9IChJTW9kdWxlKXBhcmVudE1vZHVsZXNbMF07Ci0gICAgICAgICAgfQotICAgICAgICAgIHNlcnZlcldDLm1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZX0sIG5ldyBJTW9kdWxlWzBdLCBtb25pdG9yKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHNlcnZlcjsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NFUlZFUiIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICBmaW5hbGx5ewotICAgIAl0cnl7Ci0gICAgCQlpZiAoc2VydmVyV0MhPW51bGwpewotICAgIAkJCXNlcnZlcldDLnNhdmVBbGwodHJ1ZSwgbW9uaXRvcik7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSl7Ci0gICAgICAgICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSwgU3RhdHVzLkVSUk9SLCBjZSk7Ci0gICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7ICAgIAkJCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIH0KLSAgfSAgCi0gIAotICAvKgotICAgKiBjcmVhdGVTZXJ2ZXIgVGhpcyBjcmVhdGVzIGEgc2VydmVyIGJ1dCBkb2VzIG5vdCByZXBvcnQgZXJyb3JzLiAKLSAgICogQHBhcmFtIG1vZHVsZSAKLSAgICogQHBhcmFtIHNlcnZlclR5cGVJZAotICAgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yCi0gICAqIEByZXR1cm4gSVNlcnZlciByZXR1cm5zIG51bGwgaWYgdW5zdWNjZXNzZnVsCi0gICAqIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJU2VydmVyIGNyZWF0ZVNlcnZlcihJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIHNlcnZlclR5cGVJZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gIAlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyV0MgPSBudWxsOwotICAJSVNlcnZlciBzZXJ2ZXI9IG51bGw7Ci0gIAl0cnkgewotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyVHlwZUlkKTsKLSAgICAgIHNlcnZlcldDID0gc2VydmVyVHlwZS5jcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZUlkLCBudWxsLCBtb25pdG9yKTsKLSAgICAgIAotICAgICAgdHJ5ewotICAgICAgICBpZiAoc2VydmVyV0MhPW51bGwpewotICAgICAgICAgIHNlcnZlciA9IHNlcnZlcldDLnNhdmVBbGwodHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKENvcmVFeGNlcHRpb24gY2UpewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0gICAgICAgIAotICAgICAgCU9iamVjdCB4ID0gc2VydmVyLmdldEFkYXB0ZXIoSVJ1bm5pbmdBY3Rpb25TZXJ2ZXIuY2xhc3MpOwotICAgICAgICBpZiAoeCE9bnVsbCAmJiB4IGluc3RhbmNlb2YgSVJ1bm5pbmdBY3Rpb25TZXJ2ZXIpIHsKLSAgICAgICAgIGludCBzdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotICAgICAgICAgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pIHsKLSAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKLSAgICAgICAgICAgc2VydmVyLnN5bmNocm9ub3VzU3RhcnQobW9kZSwgbW9uaXRvcik7Ci0gICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgICBpZiAobW9kdWxlICE9IG51bGwpIHsKLSAgICAgICAgICBJTW9kdWxlW10gcGFyZW50TW9kdWxlcyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotICAgICAgICAgIGlmIChwYXJlbnRNb2R1bGVzIT1udWxsICYmIHBhcmVudE1vZHVsZXMubGVuZ3RoIT0wKSB7Ci0gICAgICAgICAgCW1vZHVsZSA9IChJTW9kdWxlKXBhcmVudE1vZHVsZXNbMF07Ci0gICAgICAgICAgfQotICAgICAgICAgIHNlcnZlcldDLm1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZX0sIG5ldyBJTW9kdWxlWzBdLCBtb25pdG9yKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHNlcnZlcjsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZmluYWxseXsKLSAgICAJdHJ5ewotICAgIAkJaWYgKHNlcnZlcldDIT1udWxsKXsKLSAgICAJCQlzZXJ2ZXJXQy5zYXZlQWxsKHRydWUsIG1vbml0b3IpOwotICAgIAkJfQotICAgIAl9Ci0gICAgCWNhdGNoKENvcmVFeGNlcHRpb24gY2UpewotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCQkvL2hhbmRsZXIgY29yZSBleGNlcHRpb24KLSAgICAJfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyVHlwZUlkc0J5TW9kdWxlKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICBWZWN0b3Igc2VydmVySWRzID0gbmV3IFZlY3RvcigpOwotICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotICAgICAgaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgc2VydmVySWRzLmFkZChzZXJ2ZXJzW2ldLmdldElkKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10pIHNlcnZlcklkcy50b0FycmF5KG5ldyBTdHJpbmdbc2VydmVySWRzLnNpemUoKV0pOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBJU2VydmVyIGdldERlZmF1bHRFeGlzdGluZ1NlcnZlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJOYW1lOwotCi0gICAgLy9JU2VydmVyUHJlZmVyZW5jZXMgc2VydmVyUHJlZmVyZW5jZXMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclByZWZlcmVuY2VzKCk7Ci0gICAgSVByb2plY3RQcm9wZXJ0aWVzIHByb3BzID0gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KTsKLSAgICBJU2VydmVyIHByZWZlcnJlZFNlcnZlciA9IHByb3BzLmdldERlZmF1bHRTZXJ2ZXIoKTsKLSAgICAvL0lTZXJ2ZXIgcHJlZmVycmVkU2VydmVyID0gc2VydmVyUHJlZmVyZW5jZXMuZ2V0RGVwbG95YWJsZVNlcnZlclByZWZlcmVuY2UoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCkpOwotICAgIGlmIChwcmVmZXJyZWRTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiBwcmVmZXJyZWRTZXJ2ZXI7Ci0KLSAgICBJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0gICAgaWYgKGNvbmZpZ3VyZWRTZXJ2ZXJzICE9IG51bGwgJiYgY29uZmlndXJlZFNlcnZlcnMubGVuZ3RoID4gMCkgeyByZXR1cm4gY29uZmlndXJlZFNlcnZlcnNbMF07IH0KLQotICAgIElTZXJ2ZXJbXSBub25Db25maWd1cmVkU2VydmVycyA9IFNlcnZlclV0aWwuZ2V0QXZhaWxhYmxlU2VydmVyc0Zvck1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgZmFsc2UsIG51bGwpOwotICAgIGlmIChub25Db25maWd1cmVkU2VydmVycyAhPSBudWxsICYmIG5vbkNvbmZpZ3VyZWRTZXJ2ZXJzLmxlbmd0aCA+IDApIHsgcmV0dXJuIG5vbkNvbmZpZ3VyZWRTZXJ2ZXJzWzBdOyB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIAotICAvKgotICAgKiBAcGFyYW0gbW9kdWxlVHlwZSAtIGFkIGRlZmluZWQgaW4gSVNlcnZlclRhcmdldENvbnN0YW50cyAoaS5lLiBFQVJfVFlQRSwgV0VCX1RZUEUsIGV0Yy4pCi0gICAqIEBwYXJhbSBqMmVlVmVyc2lvbiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludCB2YWx1ZXMgaW4gSjJFRVZlcnNpb25Db25zdGFudHMKLSAgICogaS5lLiAiMTIiIG9yICIxMyIgb3IgIjE0IgotICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgaWQgb2YgdGhlIHNlcnZlciB0YXJnZXQgLSB0byBiZSB1c2VkIGluIHByb2plY3QgY3JlYXRpb24gb3BlcmF0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZlclRhcmdldElkRnJvbUZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBTdHJpbmcgbW9kdWxlVHlwZSwgU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkKTsKLSAgICBpZiAoc2VydmVyVHlwZSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgU3RyaW5nIHNlcnZlclJ1bnRpbWVUeXBlSWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAKLSAgICBTdHJpbmcgc3RKMkVFVmVyc2lvbiA9IFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgICBMaXN0IHJ1bnRpbWVzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFNlcnZlclRhcmdldHMobW9kdWxlVHlwZSwgc3RKMkVFVmVyc2lvbik7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHJ1bnRpbWVzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIElSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpcnVudGltZXMuZ2V0KGkpOwotICAgICAgU3RyaW5nIHRoaXNSdW50aW1lVHlwZUlkID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICBpZiAodGhpc1J1bnRpbWVUeXBlSWQuZXF1YWxzKHNlcnZlclJ1bnRpbWVUeXBlSWQpKQotICAgICAgewotICAgICAgICByZXR1cm4gcnVudGltZS5nZXRJZCgpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIC8qCi0gICAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgdGhlIHNlcnZlcidzIGZhY3RvcnkgaWQKLSAgICogQHJldHVybnMgdGhlIHJ1bnRpbWUgdHlwZSBpZCBnaXZlbiB0aGUgc2VydmVyJ3MgZmFjdG9yeSBpZC4gUmV0dXJucyBhIGJsYW5rIFN0cmluZyBpZiB0aGUgbm8gU2VydmVyVHlwZSBleGlzdHMgZm9yIHRoZSBnaXZlbiBmYWN0b3J5IGlkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UnVudGltZVRhcmdldElkRnJvbUZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkKTsKLSAgICBpZiAoc2VydmVyVHlwZSE9bnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICByZXR1cm4gc2VydmVyUnVudGltZUlkOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgdGhlIHNlcnZlcidzIGZhY3RvcnkgaWQKLSAgICogQHJldHVybnMgdGhlIHNlcnZlciB0eXBlIGlkIGdpdmVuIHRoZSBzZXJ2ZXIncyBmYWN0b3J5IGlkLiBSZXR1cm5zIGEgYmxhbmsgU3RyaW5nIGlmIHRoZSBubyBTZXJ2ZXJUeXBlIGV4aXN0cyBmb3IgdGhlIGdpdmVuIGZhY3RvcnkgaWQuCi0gICAqLyAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZlclR5cGVJZEZyb21GYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkKTsKLSAgCWlmIChzZXJ2ZXJUeXBlIT1udWxsKQotICAJewotICAJICBTdHJpbmcgc2VydmVyVHlwZUlkID0gc2VydmVyVHlwZS5nZXRJZCgpOwotICAJICByZXR1cm4gc2VydmVyVHlwZUlkOwotICAJfQotICAJZWxzZQotICAJICByZXR1cm4gIiI7Ci0gIH0KLQotICAvKgotICAgKiBAcGFyYW0gajJlZVZlcnNpb24gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnQgdmFsdWVzIGluIEoyRUVWZXJzaW9uQ29uc3RhbnRzCi0gICAqIGkuZS4gIjEyIiBvciAiMTMiIG9yICIxNCIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RhcmdldFZhbGlkRm9yRUFSKFN0cmluZyBydW50aW1lVGFyZ2V0SWQsIFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAJaWYgKHJ1bnRpbWVUYXJnZXRJZCA9PSBudWxsKQotICAJCXJldHVybiBmYWxzZTsKLSAgCQotICAJU3RyaW5nIGVhck1vZHVsZVR5cGUgPSBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkVBUl9UWVBFOwotCVN0cmluZyBzdEoyRUVWZXJzaW9uID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyVGFyZ2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb24pOwotICAJTGlzdCBydW50aW1lcyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRTZXJ2ZXJUYXJnZXRzKGVhck1vZHVsZVR5cGUsIHN0SjJFRVZlcnNpb24pOwotICAgIGZvciAoaW50IGk9MDsgaTxydW50aW1lcy5zaXplKCk7IGkrKyApCi0gICAgewotICAgICAgSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSlydW50aW1lcy5nZXQoaSk7Ci0gICAgICBTdHJpbmcgdGhpc0lkID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICBpZiAodGhpc0lkLmVxdWFscyhydW50aW1lVGFyZ2V0SWQpKQotICAgICAgCXJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyoKLSAgICogQHBhcmFtIGoyZWVWZXJzaW9uIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW50IHZhbHVlcyBpbiBKMkVFVmVyc2lvbkNvbnN0YW50cwotICAgKiBpLmUuICIxMiIgb3IgIjEzIiBvciAiMTQiCi0gICAqIEBwYXJhbSB0aGUgcHJvamVjdCB0eXBlIGZyb20gSVNlcnZlclRhcmdldENvbnN0YW50cwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGFyZ2V0VmFsaWRGb3JQcm9qZWN0VHlwZShTdHJpbmcgcnVudGltZVRhcmdldElkLCBTdHJpbmcgajJlZVZlcnNpb24sIFN0cmluZyBwcm9qZWN0VHlwZSkKLSAgewotICAJaWYgKHJ1bnRpbWVUYXJnZXRJZCA9PSBudWxsKQotICAJCXJldHVybiBmYWxzZTsKLSAgCQotICAJaWYgKHByb2plY3RUeXBlPT1udWxsIHx8IHByb2plY3RUeXBlLmxlbmd0aCgpPT0wKQotICAJICByZXR1cm4gZmFsc2U7Ci0gIAkKLSAgCVN0cmluZyBzdEoyRUVWZXJzaW9uID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyVGFyZ2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb24pOwotICAJTGlzdCBydW50aW1lcyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRTZXJ2ZXJUYXJnZXRzKHByb2plY3RUeXBlLCBzdEoyRUVWZXJzaW9uKTsKLSAgICBmb3IgKGludCBpPTA7IGk8cnVudGltZXMuc2l6ZSgpOyBpKysgKQotICAgIHsKLSAgICAgIElSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpcnVudGltZXMuZ2V0KGkpOwotICAgICAgU3RyaW5nIHRoaXNJZCA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgaWYgKHRoaXNJZC5lcXVhbHMocnVudGltZVRhcmdldElkKSkKLSAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJUYXJnZXRKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgICBTdHJpbmcgc3RKMkVFVmVyc2lvbiA9IG51bGw7Ci0gICAgaWYgKGoyZWVWZXJzaW9uPT1udWxsIHx8IGoyZWVWZXJzaW9uLmxlbmd0aCgpPT0wKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgaW50IGoyZWVWZXJzaW9uSW50ID0gSW50ZWdlci5wYXJzZUludChqMmVlVmVyc2lvbik7Ci0gICAgc3dpdGNoIChqMmVlVmVyc2lvbkludCkKLSAgICB7Ci0gICAgICBjYXNlIChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk6Ci0gICAgICAgIHJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTI7Ci0gICAgICBjYXNlIChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk6Ci0gICAgICAgIHJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTM7Ci0gICAgICBjYXNlIChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk6Ci0gICAgICAgIHJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTQ7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0YXR1c09iamVjdEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0YXR1c09iamVjdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmMGZlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdGF0dXNPYmplY3RIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFN0YXR1c09iamVjdEhhbmRsZXIKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfREVUQUlMUyA9IDE2OwotCi0gIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBnZW5lcmF0ZVRyZWVTdGF0dXMgKElTdGF0dXMgc3RhdHVzKSAKLSAgCXsKLSAgICAvLwotICAgIC8vIFRoZXJlIGNvdWxkIGJlIGxvdHMgb2YgVGhyb3dhYmxlcywgQ29yZUV4Y2VwdGlvbnMsCi0gICAgLy8gV3JhcHBlZEV4Y2VwdGlvbnMgYW5kIElTdGF0dXMgb2JqZWN0cyBiZW5lYXRoIHRoZQotICAgIC8vIGdpdmVuIHN0YXR1cy4gRmluZCB0aGVtLgotICAgIC8vCi0gICAgTGlua2VkTGlzdCBzdGF0dXNMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICBhcHBlbmRTdGF0dXMoTUFYX0RFVEFJTFMsIHN0YXR1c0xpc3QsIHN0YXR1cywgc3RhdHVzLmdldFNldmVyaXR5KCkpOwotICAgIGlmIChzdGF0dXNMaXN0LnNpemUoKSA+IDApCi0gICAgewotICAgICAgSVN0YXR1cyBuZXdTdGF0dXMgPSAoSVN0YXR1cylzdGF0dXNMaXN0LnJlbW92ZUZpcnN0KCk7Ci0gICAgICBpZiAoc3RhdHVzTGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBJU3RhdHVzW10gc2Vjb25kYXJ5U3RhdHVzQXJyYXkgPSBuZXcgSVN0YXR1c1tzdGF0dXNMaXN0LnNpemUoKV07Ci0gICAgICAgIGludCBuID0gMDsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHN0YXR1c0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgc2Vjb25kYXJ5U3RhdHVzQXJyYXlbbisrXSA9IChJU3RhdHVzKWkubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIG5ld1N0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhzdGF0dXMuZ2V0UGx1Z2luKCksc3RhdHVzLmdldENvZGUoKSxzZWNvbmRhcnlTdGF0dXNBcnJheSxzdGF0dXMuZ2V0TWVzc2FnZSgpLHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmV3U3RhdHVzOwotICAgIH0KLSAgICBlbHNlIAotICAgIAlyZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8vCi0gIC8vIEFwcGVuZHMgemVybyBvciBtb3JlIElTdGF0dXMgb2JqZWN0cyB0byB0aGUgbGlzdCBvZiBJU3RhdHVzIG9iamVjdHMKLSAgLy8gYmFzZWQgdXBvbiBhbiBJU3RhdHVzLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBpbnQgYXBwZW5kU3RhdHVzICggaW50IG1heCwgTGlzdCBzdGF0dXNMaXN0LCBJU3RhdHVzIHN0YXR1cywgaW50IHNldmVyaXR5ICkKLSAgewotICAgIGlmIChtYXggPiAwICYmIHN0YXR1cyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vCi0gICAgICAvLyBBcHBlbmQgYW4gSVN0YXR1cyBvYmplY3QgZm9yIHRoZSBnaXZlbiBzdGF0dXMnIG1lc3NhZ2UuCi0gICAgICAvLwotICAgICAgaWYgKHN0YXR1cy5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWF4ID0gYXBwZW5kKHN0YXR1c0xpc3QsbWF4LHNldmVyaXR5LHN0YXR1cy5nZXRQbHVnaW4oKSxzdGF0dXMuZ2V0Q29kZSgpLHN0YXR1cy5nZXRNZXNzYWdlKCksc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgIH0KLSAgICAgIC8vCi0gICAgICAvLyBBcHBlbmQgdGhlIElTdGF0dXMnIFRocm93YWJsZSwgaWYgYW55LgotICAgICAgLy8KLSAgICAgIG1heCA9IGFwcGVuZFRocm93YWJsZShtYXgsc3RhdHVzTGlzdCxzdGF0dXMuZ2V0RXhjZXB0aW9uKCksc2V2ZXJpdHkpOwotICAgICAgLy8KLSAgICAgIC8vIElmIHRoZSBJU3RhdHVzIGlzIGEgbXVsdGkgc3RhdHVzLCBhcHBlbmQgdGhlIGNoaWxkcmVuLgotICAgICAgLy8KLSAgICAgIElTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aCAmJiBtYXg+MDsgaSsrKQotICAgICAgewotICAgICAgICBtYXggPSBhcHBlbmRTdGF0dXMobWF4LHN0YXR1c0xpc3QsY2hpbGRyZW5baV0sc2V2ZXJpdHkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWF4OwotICB9Ci0KLSAgLy8KLSAgLy8gQXBwZW5kcyB6ZXJvIG9yIG1vcmUgSVN0YXR1cyBvYmplY3RzIHRvIHRoZSBsaXN0IG9mIElTdGF0dXMgb2JqZWN0cwotICAvLyBiYXNlZCB1cG9uIGEgVGhyb3dhYmxlLiBXcmFwcGVkRXhjZXB0aW9ucyBhbmQgQ29yZUV4Y2VwdGlvbnMgYXJlCi0gIC8vIGdpdmVuIHNwZWNpYWwgdHJlYXRtZW50LgotICAvLwotICBwcml2YXRlIHN0YXRpYyBpbnQgYXBwZW5kVGhyb3dhYmxlICggaW50IG1heCwgTGlzdCBzdGF0dXNMaXN0LCBUaHJvd2FibGUgdGhyb3dhYmxlLCBpbnQgc2V2ZXJpdHkgKQotICB7Ci0gICAgaWYgKG1heCA+IDAgJiYgdGhyb3dhYmxlICE9IG51bGwpCi0gICAgewotICAgICAgLy8KLSAgICAgIC8vIEFwcGVuZCBhbiBJU3RhdHVzIG9iamVjdCBmb3IgdGhlIGV4Y2VwdGlvbidzIG1lc3NhZ2UuCi0gICAgICAvLwotICAgICAgaWYgKHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWF4ID0gYXBwZW5kKHN0YXR1c0xpc3QsbWF4LHNldmVyaXR5LFdlYlNlcnZpY2VQbHVnaW4uSUQsMCx0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLHRocm93YWJsZSk7Ci0gICAgICB9Ci0gICAgICAvLwotICAgICAgLy8gSWYgdGhlIGV4Y2VwdGlvbiBpcyBhIFdyYXBwZWRFeGNlcHRpb24sIGFwcGVuZCB0aGUgd3JhcHBlZCBFeGNlcHRpb24uCi0gICAgICAvLwotICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIFdyYXBwZWRFeGNlcHRpb24gd2V4YyA9IChXcmFwcGVkRXhjZXB0aW9uKXRocm93YWJsZTsKLSAgICAgICAgbWF4ID0gYXBwZW5kVGhyb3dhYmxlKG1heCxzdGF0dXNMaXN0LHdleGMuZXhjZXB0aW9uKCksc2V2ZXJpdHkpOwotICAgICAgfQotICAgICAgLy8KLSAgICAgIC8vIElmIHRoZSBleGNlcHRpb24gaXMgYSBDb3JlRXhjZXB0aW9uLCBhcHBlbmQgdGhlIGVuY2xvc2VkIElTdGF0dXMuCi0gICAgICAvLwotICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIENvcmVFeGNlcHRpb24gY2V4YyA9IChDb3JlRXhjZXB0aW9uKXRocm93YWJsZTsKLSAgICAgICAgbWF4ID0gYXBwZW5kU3RhdHVzKG1heCxzdGF0dXNMaXN0LGNleGMuZ2V0U3RhdHVzKCksc2V2ZXJpdHkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWF4OwotICB9Ci0KLSAgLy8KLSAgLy8gQ3JlYXRlcyBhbmQgYXBwZW5kcyBhbiBJU3RhdHVzIHRvIHRoZSBsaXN0IG9mIElTdGF0dXMgb2JqZWN0cy4KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGFwcGVuZCAoIExpc3Qgc3RhdHVzTGlzdCwgaW50IG1heCwgaW50IHNldmVyaXR5LCBTdHJpbmcgaWQsIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSApCi0gIHsKLSAgICBpZiAobWF4ID4gMCkKLSAgICB7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksaWQsY29kZSxtZXNzYWdlLHRocm93YWJsZSk7Ci0gICAgICBzdGF0dXNMaXN0LmFkZChzdGF0dXMpOwotICAgICAgbWF4LS07Ci0gICAgfQotICAgIHJldHVybiBtYXg7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MzNlMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLQotLyoqCi0gKiBUcmFuc2Zyb21zIGEgamF2YS5sYW5nLlN0cmluZyB0byBhbiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2plY3QKLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyI3RyYW5zZm9ybShqYXZhLmxhbmcuT2JqZWN0KQotICAgKiBAcGFyYW0gT2JqZWN0IFRoaXMgbXVzdCBiZSBhIGphdmEubGFuZy5TdHJpbmcKLSAgICogQHJldHVybiBPYmplY3QgUmV0dXJucyBhbiBJUHJvamVjdAotICAgKi8KLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0gICAgU3RyaW5nIHZhbHVlU3RyaW5nID0gKFN0cmluZyl2YWx1ZTsKLSAgICBpZiAodmFsdWVTdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgICAgcHJvamVjdCA9IEZpbGVSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KChTdHJpbmcpdmFsdWUpOwotICAgIAotICAgIHJldHVybiBwcm9qZWN0OyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RyaW5nVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0cmluZ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWZkOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RyaW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLQotLyoqCi0gICogVGhpcyBjbGFzcyBjb250YWlucyBzb21lIHVzZWZ1bCBzdHJpbmcgdXRpbGl0aWVzIHRoYXQgYXJlIG5vdCBwcm92aWRlZCBieQotICAqIGVpdGhlciBTdHJpbmcgb3IgU3RyaW5nQnVmZmVyLgotICAqCi0gICogQGF1dGhvciBQZXRlciBNb29nawotICAqIEBkYXRlICAgSnVseSAxMywgMjAwMAotKiovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nVXRpbHMKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgbGluZSBzZXBhcmF0b3IuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0xJTkUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLSAgcHJpdmF0ZSBTdHJpbmdVdGlscygpe307Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCBzcGxpdHMgYSBzaW5nbGUgbGluZSBvZiB0ZXh0IGludG8gbXVsdGlwbGUgbGluZXMKLSAgICAqIGJhc2VkIG9uIGEgbWF4aW11bSBsaW5lIGxlbmd0aC4gIFRoZSBtZXRob2Qgd2lsbCB0cnkgdG8gZml0IGFzCi0gICAgKiBtYW55IHdvcmRzIGFzIHBvc3NpYmxlIG9udG8gYSBsaW5lIHdpdGhvdXQgZXhjZWVkaW5nIHRoZSBtYXhpbXVtCi0gICAgKiBsaW5lIGxlbmd0aC4gIE5vdGU6IHRoZSBvbmx5IGNhc2Ugd2hlcmUgYSBsaW5lIG1pZ2h0IGV4Y2VlZCB0aGUKLSAgICAqIG1heGltdW0gaXMgaWYgYSBzaW5nbGUgd29yZCBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bS4KLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3BsaXR0ZXIoIFN0cmluZyB0ZXh0LCBpbnQgbWF4X2xlbmd0aCApCi0gIHsKLSAgICBWZWN0b3IgICAgICAgICAgcmV0dXJuX3RleHQgPSBuZXcgVmVjdG9yKDIwKTsKLSAgICBTdHJpbmdbXSAgICAgICAgcmV0dXJuX3N0cjsKLSAgICBpbnQgICAgICAgICAgICAgaW5kZXggPSAwOwotCi0gICAgd2hpbGUoIGluZGV4IDwgdGV4dC5sZW5ndGgoKSApCi0gICAgewotICAgICAgU3RyaW5nIHN0ciA9IHRleHQuc3Vic3RyaW5nKCBpbmRleCwgTWF0aC5taW4oIG1heF9sZW5ndGggKyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Lmxlbmd0aCgpICkgKTsKLSAgICAgIGludCBzcGFjZV9pbmRleCA9IHN0ci5sYXN0SW5kZXhPZiggIiAiICk7Ci0KLSAgICAgIGlmKCBpbmRleCArIHN0ci5sZW5ndGgoKSA8IHRleHQubGVuZ3RoKCkgJiYKLSAgICAgICAgICB0ZXh0LmNoYXJBdCggaW5kZXggKyBzdHIubGVuZ3RoKCkgLSAxICkgIT0gJyAnICYmCi0gICAgICAgICAgdGV4dC5jaGFyQXQoIGluZGV4ICsgc3RyLmxlbmd0aCgpICkgIT0gJyAnICYmCi0gICAgICAgICAgc3BhY2VfaW5kZXggIT0gLTEgKQotICAgICAgewotICAgICAgICByZXR1cm5fdGV4dC5hZGRFbGVtZW50KCBzdHIuc3Vic3RyaW5nKCAwLCBzcGFjZV9pbmRleCApICk7Ci0gICAgICAgIGluZGV4ICs9IHNwYWNlX2luZGV4ICsgMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuX3RleHQuYWRkRWxlbWVudCggc3RyLnRyaW0oKSApOwotICAgICAgICBpbmRleCArPSBzdHIubGVuZ3RoKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuX3N0ciA9IG5ldyBTdHJpbmdbcmV0dXJuX3RleHQuc2l6ZSgpXTsKLQotICAgIGZvciggaW5kZXggPSAwOyBpbmRleCA8IHJldHVybl90ZXh0LnNpemUoKTsgaW5kZXgrKyApCi0gICAgewotICAgICAgcmV0dXJuX3N0cltpbmRleF0gPSAoU3RyaW5nKShyZXR1cm5fdGV4dC5lbGVtZW50QXQoaW5kZXgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dXJuX3N0cjsKLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN0cmluZyB3aXRoIGEgcmVwZWF0ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuCi0gICoqLwotICBzdGF0aWMgcHVibGljIFN0cmluZyByZXBlYXQoIGNoYXIgdGhlX2NoYXIsIGludCBjb3VudCApCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlciggY291bnQgKTsKLQotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKyApCi0gICAgewotICAgICAgYnVmLmFwcGVuZCggdGhlX2NoYXIgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIGZsYXR0ZW5zIGFuIGFycmF5IG9mIGFyZ3VtZW50cyB0byBhIHN0cmluZy4KLSAgICAqIFRoZSBtZXRob2QgcmVzcGVjdHMgZW1iZWRkZWQgd2hpdGVzcGFjZSBhbmQgcXVvdGVzLgotICAgICogPHVsPgotICAgICogPGxpPkFueSBhcmd1bWVudCB3aXRoIGVtYmVkZGVkIHdoaXRlc3BhY2Ugd2lsbCBiZSBmbGF0dGVuZWQgb3V0Ci0gICAgKiB3aXRoIGVuY2xvc2luZyBxdW90ZXMuIEZvciBleGFtcGxlLCB0aGUgc2luZ2xlIGFyZ3VtZW50Ci0gICAgKiA8dT5IZWxsbyBXb3JsZDwvdT4KLSAgICAqIHdpbGwgYmUgcmV0dXJuZWQgYXMKLSAgICAqIDx1PiJIZWxsbyBXb3JsZCI8L3U+LgotICAgICogPGxpPkFueSBhcmd1bWVudCB3aXRoIHF1b3RlcyB3aWxsIGJlIGZsYXR0ZW5lZCBvdXQgd2l0aCB0aGUKLSAgICAqIHF1b3RlcyBlc2NhcGVkLiBGb3IgZXhhbXBsZSwgdGhlIHNpbmdsZSBhcmd1bWVudAotICAgICogPHU+IkhhcHB5IGRheXMiPC91PgotICAgICogd2lsbCBiZSByZXR1cm5lZCBhcwotICAgICogPHU+XCJIYXBweSBkYXlzXCI8L3U+LgotICAgICogPC91bD4KLSAgICAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGFycmF5IG9mIHN0cmluZ3MgdG8gZmxhdHRlbi4KLSAgICAqIEByZXR1cm4gdGhlIGZsYXR0ZW5lZCBzdHJpbmcuCi0gICovCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGZsYXR0ZW5Bcmd1bWVudHMgKCBTdHJpbmdbXSBhcmd1bWVudHMgKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIGZvciAoaW50IGk9MDsgaTxhcmd1bWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgLy8KLSAgICAgIC8vIEFwcGVuZCBhIHNlcGFyYXRvciAoZXhjZXB0IHRoZSBmaXJzdCB0aW1lKS4KLSAgICAgIC8vCi0gICAgICBpZiAoaSA+IDApIGJ1Zi5hcHBlbmQoJyAnKTsKLQotICAgICAgLy8KLSAgICAgIC8vIExvb2sgZm9yIHdoaXRlc3BhY2UuCi0gICAgICAvLwotICAgICAgYm9vbGVhbiB3aGl0ZXNwYWNlID0gZmFsc2U7Ci0gICAgICBjaGFyW10gY2hhcnMgPSBhcmd1bWVudHNbaV0udG9DaGFyQXJyYXkoKTsKLSAgICAgIGZvciAoaW50IGo9MDsgIXdoaXRlc3BhY2UgJiYgajxjaGFycy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhcnNbal0pKQotICAgICAgICB7Ci0gICAgICAgICAgd2hpdGVzcGFjZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8KLSAgICAgIC8vIEFwcGVuZCB0aGUgYXJndW1lbnQsIHF1b3RlZCBhcyBuZWNlc3NhcnkuCi0gICAgICAvLwotICAgICAgaWYgKHdoaXRlc3BhY2UpIGJ1Zi5hcHBlbmQoJyInKTsKLSAgICAgIGZvciAoaW50IGo9MDsgajxjaGFycy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoYXJzW2pdID09ICciJykgYnVmLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgYnVmLmFwcGVuZChjaGFyc1tqXSk7Ci0gICAgICB9Ci0gICAgICBpZiAod2hpdGVzcGFjZSkgYnVmLmFwcGVuZCgnIicpOwotICAgIH0KLQotICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBtZXRob2QgcGFyc2VzIHdoaXRlc3BhY2UtZGVsaW1pdHRlZCBmaWxlbmFtZXMgZnJvbQotICAgICogdGhlIGdpdmVuIDxjb2RlPmlucHV0PC9jb2RlPiBzdHJlYW0uIDxiPkxpbWl0YXRpb246PC9iPgotICAgICogUXVvdGVkIGZpbGVuYW1lcyBvciBmaWxlbmFtZXMgd2l0aCBlbWJlZGRlZCB3aGl0ZXNwYWNlCi0gICAgKiBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCi0gICAgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IHN0cmVhbS4KLSAgICAqIEByZXR1cm4gQW4gZW51bWVyYXRpb24gb2YgZmlsZW5hbWVzIGZyb20gdGhlIHN0cmVhbS4KLSAgKi8KLSAgc3RhdGljIHB1YmxpYyBFbnVtZXJhdGlvbiBwYXJzZUZpbGVuYW1lc0Zyb21TdHJlYW0gKCBJbnB1dFN0cmVhbSBpbnB1dCApCi0gIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgVmVjdG9yIGZpbGVuYW1lcyA9IG5ldyBWZWN0b3IoNjQsNjQpOwotICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotICAgIGJ5dGUgc3RhdGUgPSBTVEFURV9XUzsKLSAgICBpbnQgaWMgPSBpbnB1dC5yZWFkKCk7Ci0gICAgd2hpbGUgKGljID49IDApCi0gICAgewotICAgICAgY2hhciBjID0gKGNoYXIpaWM7Ci0gICAgICBzd2l0Y2ggKHN0YXRlKQotICAgICAgewotICAgICAgICBjYXNlIFNUQVRFX1dTOgotICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGMpOwotICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9OV1M7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX05XUzoKLSAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpCi0gICAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGJ1ZmZlci50b1N0cmluZygpOwotICAgICAgICAgICAgZmlsZW5hbWVzLmFkZChmaWxlbmFtZSk7Ci0gICAgICAgICAgICBidWZmZXIgPSBudWxsOwotICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9XUzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpYyA9IGlucHV0LnJlYWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbGVuYW1lcy5lbGVtZW50cygpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTVEFURV9XUyA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU1RBVEVfTldTID0gMTsKLQotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpcyB0aGUgdHlwZSBwYXNzZWQgaW4gaXMgYSBwcmltdGl2ZSBqYXZhIHR5cGUKLSAgKiBAcGFyYW0gY2xhc3MgbmFtZSBTdHJpbmcKLSAgKiBAcmV0dXJuIHRydWUgaXMgcHJpbWl0aXZlIHR5cGUKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlVHlwZShTdHJpbmcgdHlwZU5hbWUpIAotICB7Ci0KLSAgICBpZiAodHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYm9vbGVhbiIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJieXRlIikgfHwKLSAgICAgIHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImRvdWJsZSIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJmbG9hdCIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJpbnQiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgibG9uZyIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJzaG9ydCIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJjaGFyIikpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgfQotCi0gIC8qKgotICAqIFRoZSBtZXRob2QgcmVwbGFjZSB0aGUgY2hhcmFjdGVycyB0aGF0IGFyZSBhbGxvd2VkIGluIFVSSXMKLSAgKiBhbmQgbm90IGFsbG93ZWQgaW4gSmF2YSBjbGFzcyBuYW1lcyB0byBhbiB1bmRlcnNjb3JlICgnXycpCi0gICogQHBhcmFtIFVSSSBTdHJpbmcKLSAgKiBAcmV0dXJuIHZhbGlkIEphdmEgY2xhc3MgbmFtZSBTdHJpbmcKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVJJMkNsYXNzTmFtZSggU3RyaW5nIHVyaSApIHsKLSAgICBTdHJpbmcgY2xhc3NOYW1lID0gdXJpOwotICAgIGZvciAoIGludCBpID0gMDsgaSA8IFVSSV9TWU1CT0xTLmxlbmd0aDsgaSsrICkgewotICAgIAljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSAoIFVSSV9TWU1CT0xTW2ldLCBVTkRFUlNDT1JFICk7Ci0gICAgfQotICAgIHJldHVybiBjbGFzc05hbWU7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gVVJJX1NZTUJPTFMgPSB7Jy0nLCAnficsICcjJywgJy8nLCAnLid9OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFVOREVSU0NPUkUgPSAnXyc7Ci0KLQotICAvKioKLSAgICogVGhpcyByZXR1cm5zIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIGJhc2VkIG9uIHRoZSBnaXZlbiBuYW1lLiAKLSAgICogKGZvbGxvd3MgSkFYLVJQQyAxLjAgUHVibGljIFJldmlldyBEcmFmdCAyIHJlY29tbWVuZGF0aW9ucykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGphdmFJZGVudGlmaWVyRm9yKFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGJvb2xlYW4gc2tpcHBlZCA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBsb2NhbE5hbWUubGVuZ3RoKCk7IGkgPCBsZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBjaGFyIGNoYXJhY3RlciA9IGxvY2FsTmFtZS5jaGFyQXQoaSk7Ci0gICAgICBpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGNoYXJhY3RlcikgJiYgIWlzRGVsaW1pdGVyKGNoYXJhY3RlcikpCi0gICAgICB7Ci0gICAgICAgIGlmIChza2lwcGVkICYmIHJlc3VsdC5sZW5ndGgoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhcmFjdGVyID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoYXJhY3Rlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZChjaGFyYWN0ZXIpOwotICAgICAgICBza2lwcGVkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNraXBwZWQgPXRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFKYXZhQ29udmVudGlvbnMudmFsaWRhdGVJZGVudGlmaWVyKHJlc3VsdC50b1N0cmluZygpKS5pc09LKCkpCi0gICAgewotICAgICAgcmVzdWx0Lmluc2VydCgwLCAiXyIpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEZWxpbWl0ZXIoY2hhciBjaGFyYWN0ZXIpCi0gIHsKLSAgICByZXR1cm4gIlx1MDAyRFx1MDAyRVx1MDAzQVx1MDA1Rlx1MDBCN1x1MDM4N1x1MDZERFx1MDZERSIuaW5kZXhPZihjaGFyYWN0ZXIpICE9IC0xOwotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYTY2NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRDb250ZXh0IGltcGxlbWVudHMgUHJvamVjdFRvcG9sb2d5Q29udGV4dAotewotCi1wdWJsaWMgUGVyc2lzdGVudFByb2plY3RUb3BvbG9neUNvbnRleHQgKCkgCi17Ci0Jc3VwZXIoIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKSk7Ci19Ci0gcHVibGljIHZvaWQgbG9hZCgpIHsKLSAgICBTdHJpbmdbXSBpZHMgPSBQcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cy5nZXRDbGllbnRUeXBlcygpOwotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSAhPSAwKQotICAgICAgICBzYi5hcHBlbmQoIiAiKTsKLSAgICAgIHNiLmFwcGVuZChpZHNbaV0pOwotICAgIH0KLSAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQ0xJRU5UX1RZUEVTLCBzYi50b1N0cmluZygpKTsKLSAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVVNFX1RXT19FQVJTLCBQcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cy5pc1VzZVR3b0VBUnMoKSk7Ci0gfQotCi0gcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZXMoU3RyaW5nW10gaWRzKQotIHsKLSAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKQotICAgewotICAgICBpZiAoaSAhPSAwKQotICAgICAgIHNiLmFwcGVuZCgiICIpOwotICAgICBzYi5hcHBlbmQoaWRzW2ldKTsKLSAgIH0KLSAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ0xJRU5UX1RZUEVTLCBzYi50b1N0cmluZygpKTsKLSB9Ci0KLSBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xpZW50VHlwZXMoKQotIHsKLSAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0NMSUVOVF9UWVBFUykpOwotICAgU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07Ci0gICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspCi0gICAgIHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgIHJldHVybiBzOwotIH0KLQotIHB1YmxpYyB2b2lkIHNldFVzZVR3b0VBUnMoYm9vbGVhbiB1c2UpCi0gewotICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9VU0VfVFdPX0VBUlMsIHVzZSk7Ci0gfQotIHB1YmxpYyBib29sZWFuIGlzVXNlVHdvRUFScygpCi0gewotICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVVNFX1RXT19FQVJTKTsKLSB9Ci0KLSBwdWJsaWMgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBjb3B5KCkgewotIAlUcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGNvbnRleHQgPSBuZXcgVHJhbnNpZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpOwotCWNvbnRleHQuc2V0Q2xpZW50VHlwZXMoZ2V0Q2xpZW50VHlwZXMoKSk7Ci0JY29udGV4dC5zZXRVc2VUd29FQVJzKGlzVXNlVHdvRUFScygpKTsKLQlyZXR1cm4gY29udGV4dDsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50U2NlbmFyaW9Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudFNjZW5hcmlvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFmMDQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50U2NlbmFyaW9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dCBpbXBsZW1lbnRzIFNjZW5hcmlvQ29udGV4dAotewotICBwdWJsaWMgUGVyc2lzdGVudFNjZW5hcmlvQ29udGV4dCgpCi0gIHsKLSAgICBzdXBlcihXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkpOyAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxvYWQoKQotICB7Ci0gICAgU2NlbmFyaW9EZWZhdWx0cyBkZWZhdWx0cyA9IG5ldyBTY2VuYXJpb0RlZmF1bHRzKCk7Ci0gICAgU3RyaW5nW10gaWRzID0gZGVmYXVsdHMuZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSAhPSAwKSBzYi5hcHBlbmQoIiwiKTsKLSAgICAgIHNiLmFwcGVuZChpZHNbaV0pOwotICAgIH0KLSAgICBTdHJpbmcgbm9uSmF2YVRlc3RTZXJ2aWNlID0gZGVmYXVsdHMuZ2V0Tm9uSmF2YVRlc3RTZXJ2aWNlRGVmYXVsdCgpOwotICAgIHNldERlZmF1bHRTdHJpbmdJZk5vRGVmYXVsdChQUkVGRVJFTkNFX1dFQlNFUlZJQ0VfVEVTVF9UWVBFUywgc2IudG9TdHJpbmcoKSk7Ci0gICAgc2V0RGVmYXVsdFN0cmluZ0lmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfTk9OX0pBVkFfVEVTVF9TRVJWSUNFLCBub25KYXZhVGVzdFNlcnZpY2UpOwotICAgIAotICAgIHNldERlZmF1bHRTdHJpbmdJZk5vRGVmYXVsdChQUkVGRVJFTkNFX0NMSUVOVF9XRUJTRVJWSUNFX1RZUEUsIGRlZmF1bHRzLndlYnNlcnZpY2VDbGllbnRUeXBlRGVmYXVsdCgpICk7Ci0gICAgc2V0RGVmYXVsdFN0cmluZ0lmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9UWVBFLCBkZWZhdWx0cy53ZWJzZXJ2aWNlVHlwZUlkRGVmYXVsdCgpICk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX0dFTkVSQVRFX1BST1hZLCBkZWZhdWx0cy5nZW5lcmF0ZVByb3h5RGVmYXVsdCgpICk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX0xBVU5DSF9XRUJTRVJWSUNFX0VYUExPUkVSLCBkZWZhdWx0cy5sYXVuY2hXZWJzZXJ2aWNlRXhwbG9yZXJEZWZhdWx0KCkgKTsKLSAgICBzZXREZWZhdWx0Qm9vbGVhbklmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfU1RBUlRfV0VCU0VSVklDRSwgZGVmYXVsdHMuc3RhcnRXZWJzZXJ2aWNlRGVmYXVsdCgpICk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX1RFU1RfV0VCU0VSVklDRSwgZGVmYXVsdHMudGVzdFdlYnNlcnZpY2VEZWZhdWx0KCkgKTsKLSAgICBzZXREZWZhdWx0Qm9vbGVhbklmTm9EZWZhdWx0KFBSRUZFUkVOQ0VfTU9OSVRPUl9XRUJTRVJWSUNFLCBkZWZhdWx0cy5nZXRNb25pdG9yV2ViU2VydmljZURlZmF1bHQoKSk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX0xBVU5DSF9TQU1QTEUsIGRlZmF1bHRzLmxhdW5jaFNhbXBsZSgpICk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5vbkphdmFUZXN0U2VydmljZSgpCi0gIHsKLSAgICBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZ1tdIHRlc3RUeXBlcyA9IGdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RUeXBlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbiB3c2UgPSAoV2ViU2VydmljZVRlc3RFeHRlbnNpb24pIHJlZ2lzdHJ5Ci0gICAgICAgICAgLmdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKHRlc3RUeXBlc1tpXSk7Ci0gICAgICBpZiAoIXdzZS5pc0phdmEoKSkgcmV0dXJuIHRlc3RUeXBlc1tpXTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKFN0cmluZ1tdIGlkcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSAhPSAwKSBzYi5hcHBlbmQoIiwiKTsKLSAgICAgIHNiLmFwcGVuZChpZHNbaV0pOwotICAgIH0KLSAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1dFQlNFUlZJQ0VfVEVTVF9UWVBFUywgc2IudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKAotICAgICAgICBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9URVNUX1RZUEVTKSwgIiwiKTsKLSAgICBTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspCi0gICAgICBzW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICBwdWJsaWMgU2NlbmFyaW9Db250ZXh0IGNvcHkoKQotICB7Ci0gICAgVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBuZXcgVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0KCk7Ci0gICAgY29udGV4dC5zZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKGdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKSk7Ci0gICAgY29udGV4dC5zZXROb25KYXZhVGVzdFNlcnZpY2UoZ2V0Tm9uSmF2YVRlc3RTZXJ2aWNlKCkpOwotICAgIAotICAgIGNvbnRleHQuc2V0Q2xpZW50V2ViU2VydmljZVR5cGUoIGdldENsaWVudFdlYlNlcnZpY2VUeXBlKCkgKTsKLSAgICBjb250ZXh0LnNldFdlYlNlcnZpY2VUeXBlKCBnZXRXZWJTZXJ2aWNlVHlwZSgpICk7Ci0gICAgY29udGV4dC5zZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoIGdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlcigpICk7Ci0gICAgY29udGV4dC5zZXRTdGFydFdlYlNlcnZpY2UoIGdldFN0YXJ0V2ViU2VydmljZSgpICk7Ci0gICAgY29udGV4dC5zZXRHZW5lcmF0ZVByb3h5KCBnZXRHZW5lcmF0ZVByb3h5KCkgKTsKLSAgICBjb250ZXh0LnNldFRlc3RXZWJTZXJ2aWNlKCBnZXRUZXN0V2ViU2VydmljZSgpICk7Ci0gICAgY29udGV4dC5zZXRNb25pdG9yV2ViU2VydmljZShnZXRNb25pdG9yV2ViU2VydmljZSgpKTsKLSAgICBjb250ZXh0LnNldExhdW5jaFNhbXBsZUVuYWJsZWQoIGlzTGF1bmNoU2FtcGxlRW5hYmxlZCgpICk7Ci0gICAgCi0gICAgcmV0dXJuIGNvbnRleHQ7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0NMSUVOVF9XRUJTRVJWSUNFX1RZUEUpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFdlYlNlcnZpY2VUeXBlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdFN0cmluZyhQUkVGRVJFTkNFX0NMSUVOVF9XRUJTRVJWSUNFX1RZUEUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldEdlbmVyYXRlUHJveHkoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9HRU5FUkFURV9QUk9YWSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlUHJveHlEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBnZXREZWZhdWx0Qm9vbGVhbihQUkVGRVJFTkNFX0dFTkVSQVRFX1BST1hZKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0xBVU5DSF9XRUJTRVJWSUNFX0VYUExPUkVSKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdEJvb2xlYW4oUFJFRkVSRU5DRV9MQVVOQ0hfV0VCU0VSVklDRV9FWFBMT1JFUik7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0U3RhcnRXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0V2ViU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9TVEFSVF9XRUJTRVJWSUNFKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRXZWJTZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdEJvb2xlYW4oUFJFRkVSRU5DRV9TVEFSVF9XRUJTRVJWSUNFKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRUZXN0V2ViU2VydmljZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0V2ViU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9URVNUX1dFQlNFUlZJQ0UpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0V2ViU2VydmljZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRCb29sZWFuKFBSRUZFUkVOQ0VfVEVTVF9XRUJTRVJWSUNFKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRXZWJTZXJ2aWNlVHlwZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VUeXBlKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9UWVBFKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9XRUJTRVJWSUNFX1RZUEUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldENsaWVudFdlYlNlcnZpY2VUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRXZWJTZXJ2aWNlVHlwZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9DTElFTlRfV0VCU0VSVklDRV9UWVBFLCB2YWx1ZSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0R2VuZXJhdGVQcm94eShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoIFBSRUZFUkVOQ0VfR0VORVJBVEVfUFJPWFksIHZhbHVlKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExhdW5jaFdlYlNlcnZpY2VFeHBsb3Jlcihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoIFBSRUZFUkVOQ0VfTEFVTkNIX1dFQlNFUlZJQ0VfRVhQTE9SRVIsIHZhbHVlKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRTdGFydFdlYlNlcnZpY2UoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0YXJ0V2ViU2VydmljZShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoIFBSRUZFUkVOQ0VfU1RBUlRfV0VCU0VSVklDRSwgdmFsdWUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldFRlc3RXZWJTZXJ2aWNlKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUZXN0V2ViU2VydmljZShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoIFBSRUZFUkVOQ0VfVEVTVF9XRUJTRVJWSUNFLCB2YWx1ZSk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRXZWJTZXJ2aWNlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVR5cGUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoIFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9UWVBFLCB2YWx1ZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldE1vbml0b3JXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldE1vbml0b3JXZWJTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX01PTklUT1JfV0VCU0VSVklDRSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldE1vbml0b3JXZWJTZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdEJvb2xlYW4oUFJFRkVSRU5DRV9NT05JVE9SX1dFQlNFUlZJQ0UpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRNb25pdG9yV2ViU2VydmljZShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvcldlYlNlcnZpY2UoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfTU9OSVRPUl9XRUJTRVJWSUNFLCB2YWx1ZSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0TGF1bmNoU2FtcGxlRW5hYmxlZERlZmF1bHQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoU2FtcGxlRW5hYmxlZERlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRCb29sZWFuKFBSRUZFUkVOQ0VfTEFVTkNIX1NBTVBMRSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjaXNMYXVuY2hTYW1wbGVFbmFibGVkKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGF1bmNoU2FtcGxlRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9MQVVOQ0hfU0FNUExFKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRMYXVuY2hTYW1wbGVFbmFibGVkKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMYXVuY2hTYW1wbGVFbmFibGVkKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9MQVVOQ0hfU0FNUExFLCB2YWx1ZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGRiMmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cyBVRERJUHJlZmVyZW5jZUNvbnRleHQKLXsKLSAgcHVibGljIFBlcnNpc3RlbnRVRERJUHJlZmVyZW5jZUNvbnRleHQoKQotICB7Ci0gICAgc3VwZXIoV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxvYWQoKQotICB7Ci0gICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1VERElfQ0FUX0RBVEFfQ09MVU1OX0RFTElNSVRFUiwgVURESVByZWZlcmVuY2VEZWZhdWx0cy5nZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcigpKTsKLSAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVURESV9DQVRfREFUQV9TVFJJTkdfREVMSU1JVEVSLCBVRERJUHJlZmVyZW5jZURlZmF1bHRzLmdldFVkZGlDYXREYXRhU3RyaW5nRGVsaW1pdGVyKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VWRkaUNhdERhdGFDb2x1bW5EZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikKLSAgewotICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVURESV9DQVRfREFUQV9DT0xVTU5fREVMSU1JVEVSLCBkZWxpbWl0ZXIpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX1VERElfQ0FUX0RBVEFfQ09MVU1OX0RFTElNSVRFUik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVZGRpQ2F0RGF0YVN0cmluZ0RlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKQotICB7Ci0gICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9VRERJX0NBVF9EQVRBX1NUUklOR19ERUxJTUlURVIsIGRlbGltaXRlcik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVkZGlDYXREYXRhU3RyaW5nRGVsaW1pdGVyKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfVURESV9DQVRfREFUQV9TVFJJTkdfREVMSU1JVEVSKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUHJvamVjdFRvcG9sb2d5Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTZkMzM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdFRvcG9sb2d5Q29udGV4dCAKLXsKLSAgLyoqCi0gICAgKiBUaGlzIGNvbnN0YW50IFN0cmluZyBpcyB1c2VkIHRvIGxvb2t1cCB0aGUgcHJlZmVycmVkIG9yZGVyIG9mIHRoZSBkaWZmZXJlbnQgY2xpZW50IHR5cGVzCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NMSUVOVF9UWVBFUyA9ICJjbGllbnRUeXBlcyI7Ci0gIAotICAvKioKLSAgICAqIFRoaXMgY29uc3RhbnQgU3RyaW5nIGlzIHVzZWQgdG8gbG9va3VwIHRoZSB0d28gRUFSIG9wdGlvbgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9VU0VfVFdPX0VBUlMgPSAidXNlVHdvRUFScyI7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlcyhTdHJpbmdbXSBpZHMpOwotICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xpZW50VHlwZXMoKTsKLQotICBwdWJsaWMgdm9pZCBzZXRVc2VUd29FQVJzKGJvb2xlYW4gdXNlKTsKLSAgcHVibGljIGJvb2xlYW4gaXNVc2VUd29FQVJzKCk7Ci0KLSAgcHVibGljIFByb2plY3RUb3BvbG9neUNvbnRleHQgY29weSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1Byb2plY3RUb3BvbG9neURlZmF1bHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUHJvamVjdFRvcG9sb2d5RGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwYzYwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUHJvamVjdFRvcG9sb2d5RGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGdldENsaWVudFR5cGVzKCkKLSAgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0Zvcigib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwgImNsaWVudFByb2plY3RUeXBlIik7Ci0gICAgU3RyaW5nW10gdHlwZXMgPSBuZXcgU3RyaW5nW2VsZW1lbnRzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgIHR5cGVzW2ldID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIHJldHVybiB0eXBlczsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1VzZVR3b0VBUnMoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9TY2VuYXJpb0NvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9TY2VuYXJpb0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJjYmQyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvU2NlbmFyaW9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFNjZW5hcmlvQ29udGV4dCAKLXsKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1dFQlNFUlZJQ0VfVEVTVF9UWVBFUyA9ICJ3ZWJTZXJ2aWNlVGVzdFR5cGVzIjsKLSAgICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX05PTl9KQVZBX1RFU1RfU0VSVklDRT0gIm5vbkphdmFUZXN0U2VydmljZSI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9UWVBFID0gIndlYlNlcnZpY2VUeXBlIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9TVEFSVF9XRUJTRVJWSUNFID0gInN0YXJ0V2ViU2VydmljZSI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTEFVTkNIX1dFQlNFUlZJQ0VfRVhQTE9SRVIgPSAibGF1bmNoV2ViU2VydmljZUV4cGxvcmVyIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9HRU5FUkFURV9QUk9YWSA9ICJnZW5lcmF0ZVByb3h5IjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DTElFTlRfV0VCU0VSVklDRV9UWVBFID0gImNsaWVudFdlYlNlcnZpY2VUeXBlIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9URVNUX1dFQlNFUlZJQ0UgPSAidGVzdFdlYlNlcnZpY2UiOwotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX01PTklUT1JfV0VCU0VSVklDRSA9ICJtb25pdG9yV2ViU2VydmljZSI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTEFVTkNIX1NBTVBMRSA9ICJsYXVuY2hTYW1wbGUiOwotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsKLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVRlc3RUeXBlcyhTdHJpbmdbXSB0ZXN0VHlwZXMpOwotICAKLSAgcHVibGljIFN0cmluZyBnZXROb25KYXZhVGVzdFNlcnZpY2UoKTsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVR5cGUoKTsKLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZURlZmF1bHQoKTsKLSAgcHVibGljIHZvaWQgICBzZXRXZWJTZXJ2aWNlVHlwZSggU3RyaW5nIHZhbHVlICk7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRTdGFydFdlYlNlcnZpY2UoKTsKLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRXZWJTZXJ2aWNlRGVmYXVsdCgpOwotICBwdWJsaWMgdm9pZCAgICBzZXRTdGFydFdlYlNlcnZpY2UoIGJvb2xlYW4gdmFsdWUgKTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlcigpOwotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXJEZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkICAgIHNldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlciggYm9vbGVhbiB2YWx1ZSApOwotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpOwotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5RGVmYXVsdCgpOwotICBwdWJsaWMgdm9pZCAgICBzZXRHZW5lcmF0ZVByb3h5KCBib29sZWFuIHZhbHVlICk7Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFdlYlNlcnZpY2VUeXBlKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50V2ViU2VydmljZVR5cGVEZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkICAgc2V0Q2xpZW50V2ViU2VydmljZVR5cGUoIFN0cmluZyB2YWx1ZSApOwotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0VGVzdFdlYlNlcnZpY2UoKTsKLSAgcHVibGljIGJvb2xlYW4gZ2V0VGVzdFdlYlNlcnZpY2VEZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkICAgIHNldFRlc3RXZWJTZXJ2aWNlKCBib29sZWFuIHZhbHVlICk7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRNb25pdG9yV2ViU2VydmljZSgpOwotICBwdWJsaWMgYm9vbGVhbiBnZXRNb25pdG9yV2ViU2VydmljZURlZmF1bHQoKTsKLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvcldlYlNlcnZpY2UoYm9vbGVhbiB2YWx1ZSk7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0xhdW5jaFNhbXBsZUVuYWJsZWQoKTsKLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoU2FtcGxlRW5hYmxlZERlZmF1bHQoKTsKLSAgcHVibGljIHZvaWQgICAgc2V0TGF1bmNoU2FtcGxlRW5hYmxlZCggYm9vbGVhbiB2YWx1ZSApOwotICAKLSAgcHVibGljIFNjZW5hcmlvQ29udGV4dCBjb3B5KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1NjZW5hcmlvRGVmYXVsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9TY2VuYXJpb0RlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZWE4MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1NjZW5hcmlvRGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLkxhYmVsc0FuZElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLQotCi0KLXB1YmxpYyBjbGFzcyBTY2VuYXJpb0RlZmF1bHRzCi17ICAKLSAgCi0JCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCkKLSAgewotICAJLy93ZSB3aWxsIHNldCB0aGUgaG9tZSBncm93biBzYW1wbGUgYXMgdGhlIGZpcnN0IGNob2ljZQotICAJV2ViU2VydmljZVRlc3RSZWdpc3RyeSB0ZXN0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gIAkKLSAgCUxhYmVsc0FuZElkcyBsYWJlbHNhbmRpZHMgPSB0ZXN0UmVnaXN0cnkuZ2V0TGFiZWxzQW5kSURzKCk7Ci0gIAlTdHJpbmdbXSBsYWJlbHMgPSBsYWJlbHNhbmRpZHMuZ2V0TGFiZWxzXygpOwotICAJU3RyaW5nW10gaWRzID0gbGFiZWxzYW5kaWRzLmdldElkc18oKTsKLSAgCQotICAJU3RyaW5nW10gbmV3TmFtZXMgPSBuZXcgU3RyaW5nW2xhYmVscy5sZW5ndGhdOwotICAJaW50IGluZGV4ID0gLTE7Ci0gIAlmb3IoaW50IGkgPSAwO2k8aWRzLmxlbmd0aDtpKyspewotICAJICBpZihpZHNbaV0uZXF1YWxzKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LldlYlNlcnZpY2VTYW1wbGVUZXN0IikpICAJCi0gIAkgICAgaW5kZXggPSBpOyAgIAotICAJfQotICAJaWYoaW5kZXggIT0gLTEpewotICAJICBuZXdOYW1lc1swXSA9IGxhYmVsc1tpbmRleF07Ci0gIAkgIGludCBqID0gMTsKLSAgCSAgZm9yKGludCBpID0gMDtpPGxhYmVscy5sZW5ndGg7aSsrKXsKLSAgCSAgICBpZihpICE9IGluZGV4KXsKLSAgCSAgCSAgbmV3TmFtZXNbal0gPSBsYWJlbHNbaV07IAotICAJICAgICAgaisrOwotICAJICAgIH0KLSAgCSAgfQotICAJfQotICAJZWxzZSByZXR1cm4gbGFiZWxzOwotICAJCi0gIAlyZXR1cm4gbmV3TmFtZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9uSmF2YVRlc3RTZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gIldlYiBTZXJ2aWNlcyBFeHBsb3JlciI7CQotICB9IAotICAKLSAgcHVibGljIFN0cmluZyB3ZWJzZXJ2aWNlVHlwZUlkRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC53cy50eXBlLmphdmEiOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBzdGFydFdlYnNlcnZpY2VEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBsYXVuY2hXZWJzZXJ2aWNlRXhwbG9yZXJEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVQcm94eURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIHdlYnNlcnZpY2VDbGllbnRUeXBlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIjsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gdGVzdFdlYnNlcnZpY2VEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldE1vbml0b3JXZWJTZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGxhdW5jaFNhbXBsZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1RyYW5zaWVudFByb2plY3RUb3BvbG9neUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9UcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTI4OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1RyYW5zaWVudFByb2plY3RUb3BvbG9neUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCBpbXBsZW1lbnRzIFByb2plY3RUb3BvbG9neUNvbnRleHQKLXsKLSBwcml2YXRlIFN0cmluZ1tdIGNsaWVudFR5cGVzOwotIHByaXZhdGUgYm9vbGVhbiB0d29FQVJzOwotIAotIHB1YmxpYyBUcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0ICgpIHt9Ci0KLSBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlcyhTdHJpbmdbXSBjbGllbnRUeXBlcykKLSB7Ci0gICB0aGlzLmNsaWVudFR5cGVzID0gY2xpZW50VHlwZXM7Ci0gfQotIHB1YmxpYyBTdHJpbmdbXSBnZXRDbGllbnRUeXBlcygpCi0gewotICAgcmV0dXJuIGNsaWVudFR5cGVzOwotIH0KLQotIHB1YmxpYyB2b2lkIHNldFVzZVR3b0VBUnMoYm9vbGVhbiB1c2UpCi0gewotICAgdGhpcy50d29FQVJzID0gdXNlOwotIH0KLSBwdWJsaWMgYm9vbGVhbiBpc1VzZVR3b0VBUnMoKQotIHsKLSAgIHJldHVybiB0d29FQVJzOwotIH0KLQotIHB1YmxpYyBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGNvcHkoKSB7Ci0gCVRyYW5zaWVudFByb2plY3RUb3BvbG9neUNvbnRleHQgY29udGV4dCA9IG5ldyBUcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0KCk7Ci0JY29udGV4dC5zZXRDbGllbnRUeXBlcyhnZXRDbGllbnRUeXBlcygpKTsKLQljb250ZXh0LnNldFVzZVR3b0VBUnMoaXNVc2VUd29FQVJzKCkpOwotCXJldHVybiBjb250ZXh0OwotIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9UcmFuc2llbnRTY2VuYXJpb0NvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9UcmFuc2llbnRTY2VuYXJpb0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczMDYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0IGltcGxlbWVudHMgU2NlbmFyaW9Db250ZXh0Ci17Ci0gIHByaXZhdGUgU3RyaW5nW10gd2ViU2VydmljZVRlc3RUeXBlczsKLSAgcHJpdmF0ZSBTdHJpbmcgICBub25KYXZhVGVzdFNlcnZpY2U7Ci0gIHByaXZhdGUgU3RyaW5nICAgd2ViU2VydmljZVR5cGVfOwotICBwcml2YXRlIGJvb2xlYW4gIHN0YXJ0V2ViU2VydmljZV87Ci0gIHByaXZhdGUgYm9vbGVhbiAgbGF1bmNoV2ViU2VydmljZUV4cGxvcmVyXzsKLSAgcHJpdmF0ZSBib29sZWFuICBnZW5lcmF0ZVByb3h5XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICBjbGllbnRXZWJTZXJ2aWNlVHlwZV87Ci0gIHByaXZhdGUgYm9vbGVhbiAgdGVzdFdlYlNlcnZpY2VfOwotICBwcml2YXRlIGJvb2xlYW4gIG1vbml0b3JXZWJTZXJ2aWNlOwotICBwcml2YXRlIGJvb2xlYW4gIGxhdW5jaFNhbXBsZV87Ci0gIAotICBwcml2YXRlIFNjZW5hcmlvRGVmYXVsdHMgZGVmYXVsdHMgPSBuZXcgU2NlbmFyaW9EZWZhdWx0cygpOwotIAotICBwdWJsaWMgVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0ICgpIHt9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROb25KYXZhVGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5vbkphdmFUZXN0U2VydmljZTsKLSAgfQotIAotICBwdWJsaWMgdm9pZCBzZXROb25KYXZhVGVzdFNlcnZpY2UoU3RyaW5nIG5vbkphdmFUZXN0U2VydmljZSkKLSAgewotICAgIHRoaXMubm9uSmF2YVRlc3RTZXJ2aWNlID0gbm9uSmF2YVRlc3RTZXJ2aWNlOwkKLSAgfQotIAotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKFN0cmluZ1tdIHdlYlNlcnZpY2VUZXN0VHlwZXMpCi0gIHsKLSAgICB0aGlzLndlYlNlcnZpY2VUZXN0VHlwZXMgPSB3ZWJTZXJ2aWNlVGVzdFR5cGVzOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gd2ViU2VydmljZVRlc3RUeXBlczsJCi0gIH0KLSAKLSAgcHVibGljIFNjZW5hcmlvQ29udGV4dCBjb3B5KCkgewotICAJVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBuZXcgVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0KCk7Ci0JY29udGV4dC5zZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKGdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKSk7Ci0JY29udGV4dC5zZXROb25KYXZhVGVzdFNlcnZpY2UoZ2V0Tm9uSmF2YVRlc3RTZXJ2aWNlKCkpOwotCQotCWNvbnRleHQuc2V0V2ViU2VydmljZVR5cGUoIGdldFdlYlNlcnZpY2VUeXBlKCkgKTsKLQljb250ZXh0LnNldENsaWVudFdlYlNlcnZpY2VUeXBlKCBnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSgpICk7Ci0JY29udGV4dC5zZXRHZW5lcmF0ZVByb3h5KCBnZXRHZW5lcmF0ZVByb3h5KCkgKTsKLQljb250ZXh0LnNldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlciggZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkgKTsKLQljb250ZXh0LnNldFN0YXJ0V2ViU2VydmljZSggZ2V0U3RhcnRXZWJTZXJ2aWNlKCkgKTsKLQljb250ZXh0LnNldFRlc3RXZWJTZXJ2aWNlKCBnZXRUZXN0V2ViU2VydmljZSgpICk7Ci0JY29udGV4dC5zZXRNb25pdG9yV2ViU2VydmljZShnZXRNb25pdG9yV2ViU2VydmljZSgpKTsKLQljb250ZXh0LnNldExhdW5jaFNhbXBsZUVuYWJsZWQoIGlzTGF1bmNoU2FtcGxlRW5hYmxlZCgpICk7Ci0JcmV0dXJuIGNvbnRleHQ7Ci0gIH0KLSAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFdlYlNlcnZpY2VUeXBlKCkKLSAgewotICAgIHJldHVybiBjbGllbnRXZWJTZXJ2aWNlVHlwZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50V2ViU2VydmljZVR5cGVEZWZhdWx0KCl7IHJldHVybiBkZWZhdWx0cy53ZWJzZXJ2aWNlQ2xpZW50VHlwZURlZmF1bHQoKTsgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRHZW5lcmF0ZVByb3h5KCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIGdlbmVyYXRlUHJveHlfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5RGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMuZ2VuZXJhdGVQcm94eURlZmF1bHQoKTsgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkKLSAgewotICAgIHJldHVybiBsYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXJfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXJEZWZhdWx0KCl7IHJldHVybiBkZWZhdWx0cy5sYXVuY2hXZWJzZXJ2aWNlRXhwbG9yZXJEZWZhdWx0KCk7IH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0U3RhcnRXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0V2ViU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gc3RhcnRXZWJTZXJ2aWNlXzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRXZWJTZXJ2aWNlRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMuc3RhcnRXZWJzZXJ2aWNlRGVmYXVsdCgpOyB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldFRlc3RXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFRlc3RXZWJTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiB0ZXN0V2ViU2VydmljZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFRlc3RXZWJTZXJ2aWNlRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMudGVzdFdlYnNlcnZpY2VEZWZhdWx0KCk7IH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0V2ViU2VydmljZVR5cGUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gd2ViU2VydmljZVR5cGVfOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VUeXBlRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMud2Vic2VydmljZVR5cGVJZERlZmF1bHQoKTsgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRDbGllbnRXZWJTZXJ2aWNlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50V2ViU2VydmljZVR5cGUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgY2xpZW50V2ViU2VydmljZVR5cGVfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0R2VuZXJhdGVQcm94eShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgZ2VuZXJhdGVQcm94eV8gPSB2YWx1ZTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExhdW5jaFdlYlNlcnZpY2VFeHBsb3Jlcihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgbGF1bmNoV2ViU2VydmljZUV4cGxvcmVyXyA9IHZhbHVlOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldFN0YXJ0V2ViU2VydmljZShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3RhcnRXZWJTZXJ2aWNlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBzdGFydFdlYlNlcnZpY2VfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0VGVzdFdlYlNlcnZpY2UoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RXZWJTZXJ2aWNlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICB0ZXN0V2ViU2VydmljZV8gPSB2YWx1ZTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldFdlYlNlcnZpY2VUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVHlwZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB3ZWJTZXJ2aWNlVHlwZV8gPSB2YWx1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0TW9uaXRvcldlYlNlcnZpY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0TW9uaXRvcldlYlNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG1vbml0b3JXZWJTZXJ2aWNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRNb25pdG9yV2ViU2VydmljZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGRlZmF1bHRzLmdldE1vbml0b3JXZWJTZXJ2aWNlRGVmYXVsdCgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRNb25pdG9yV2ViU2VydmljZShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvcldlYlNlcnZpY2UoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIG1vbml0b3JXZWJTZXJ2aWNlID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0TGF1bmNoU2FtcGxlRW5hYmxlZERlZmF1bHQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoU2FtcGxlRW5hYmxlZERlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGRlZmF1bHRzLmxhdW5jaFNhbXBsZSgpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2lzTGF1bmNoU2FtcGxlRW5hYmxlZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xhdW5jaFNhbXBsZUVuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIGxhdW5jaFNhbXBsZV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0TGF1bmNoU2FtcGxlRW5hYmxlZChib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TGF1bmNoU2FtcGxlRW5hYmxlZChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgbGF1bmNoU2FtcGxlXyA9IHZhbHVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVURESVByZWZlcmVuY2VDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVURESVByZWZlcmVuY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNGFkZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1VERElQcmVmZXJlbmNlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dDsKLQotcHVibGljIGludGVyZmFjZSBVRERJUHJlZmVyZW5jZUNvbnRleHQgCi17Ci0gIC8qCi0gICAqIFRoaXMgY29uc3RhbnQgU3RyaW5nIGlzIHVzZWQgdG8gbG9va3VwIHRoZSBjb2x1bW4gZGVsaW1pdGVyIGZvciB1c2VyLWRlZmluZWQgVURESQotICAgKiBDYXRlZ29yeSBkYXRhLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9VRERJX0NBVF9EQVRBX0NPTFVNTl9ERUxJTUlURVIgPSAidWRkaUNhdERhdGFDb2x1bW5EZWxpbWl0ZXIiOwotICAKLSAgLyoKLSAgICogVGhpcyBjb25zdGFudCBTdHJpbmcgaXMgdXNlZCB0byBsb29rdXAgdGhlIHN0cmluZyBkZWxpbWl0ZXIgZm9yIHVzZXItZGVmaW5lZCBVRERJCi0gICAqIENhdGVnb3J5IGRhdGEuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1VERElfQ0FUX0RBVEFfU1RSSU5HX0RFTElNSVRFUiA9ICJ1ZGRpQ2F0RGF0YVN0cmluZ0RlbGltaXRlciI7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKTsKLSAgcHVibGljIFN0cmluZyBnZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcigpOwotICBwdWJsaWMgdm9pZCBzZXRVZGRpQ2F0RGF0YVN0cmluZ0RlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKTsKLSAgcHVibGljIFN0cmluZyBnZXRVZGRpQ2F0RGF0YVN0cmluZ0RlbGltaXRlcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9VRERJUHJlZmVyZW5jZURlZmF1bHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVURESVByZWZlcmVuY2VEZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWViYTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9VRERJUHJlZmVyZW5jZURlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgVURESVByZWZlcmVuY2VEZWZhdWx0cwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcigpCi0gIHsKLSAgICByZXR1cm4gIiMiOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVZGRpQ2F0RGF0YVN0cmluZ0RlbGltaXRlcigpCi0gIHsKLSAgICByZXR1cm4gIlwiIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kYXRhL0xhYmVsc0FuZElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kYXRhL0xhYmVsc0FuZElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQwZjY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZGF0YS9MYWJlbHNBbmRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhOwotCi1wdWJsaWMgY2xhc3MgTGFiZWxzQW5kSWRzCi17Ci0gIHByaXZhdGUgU3RyaW5nW10gbGFiZWxzXzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBpZHNfOwotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaWRzXy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRJZHNfKCkKLSAgewotICAgIHJldHVybiBpZHNfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gaWRzXyBUaGUgaWRzXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJZHNfKFN0cmluZ1tdIGlkc18pCi0gIHsKLSAgICB0aGlzLmlkc18gPSBpZHNfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxhYmVsc18uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0TGFiZWxzXygpCi0gIHsKLSAgICByZXR1cm4gbGFiZWxzXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGxhYmVsc18gVGhlIGxhYmVsc18gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TGFiZWxzXyhTdHJpbmdbXSBsYWJlbHNfKQotICB7Ci0gICAgdGhpcy5sYWJlbHNfID0gbGFiZWxzXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kYXRhL1R5cGVSdW50aW1lU2VydmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RhdGEvVHlwZVJ1bnRpbWVTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjMzQ5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RhdGEvVHlwZVJ1bnRpbWVTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhOwotCi1wdWJsaWMgY2xhc3MgVHlwZVJ1bnRpbWVTZXJ2ZXIKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgdHlwZUlkXyAgICAgPSAiIjsKLSAgcHJpdmF0ZSBTdHJpbmcgcnVudGltZUlkXyAgPSAiIjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVySWRfICAgPSAiIjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVySW5zdGFuY2VJZF87Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBydW50aW1lSWRfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSdW50aW1lSWQoKQotICB7Ci0gICAgcmV0dXJuIHJ1bnRpbWVJZF87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBydW50aW1lSWRfIFRoZSBydW50aW1lSWRfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWVJZChTdHJpbmcgcnVudGltZUlkXykKLSAgewotICAgIHRoaXMucnVudGltZUlkXyA9IHJ1bnRpbWVJZF87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVySWRfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJZCgpCi0gIHsKLSAgICByZXR1cm4gc2VydmVySWRfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gc2VydmVySWRfIFRoZSBzZXJ2ZXJJZF8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmVySWQoU3RyaW5nIHNlcnZlcklkXykKLSAgewotICAgIHRoaXMuc2VydmVySWRfID0gc2VydmVySWRfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlckluc3RhbmNlSWRfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJbnN0YW5jZUlkKCkKLSAgewotICAgIHJldHVybiBzZXJ2ZXJJbnN0YW5jZUlkXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHNlcnZlckluc3RhbmNlSWRfIFRoZSBzZXJ2ZXJJbnN0YW5jZUlkXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJJbnN0YW5jZUlkKFN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkXykKLSAgewotICAgIHRoaXMuc2VydmVySW5zdGFuY2VJZF8gPSBzZXJ2ZXJJbnN0YW5jZUlkXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlSWRfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlSWQoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVJZF87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB0eXBlSWRfIFRoZSB0eXBlSWRfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVJZChTdHJpbmcgdHlwZUlkXykKLSAgewotICAgIHRoaXMudHlwZUlkXyA9IHR5cGVJZF87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJ0eXBlKCIgKyB0eXBlSWRfICsgIikgcnVudGltZSgiICsgcnVudGltZUlkXyArICIpIGZhY3RvcnkoIiArIHNlcnZlcklkXyArICIpIHNlcnZJbnN0SWQoIiArIHNlcnZlckluc3RhbmNlSWRfICsgIikiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RpYWxvZy9JU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RpYWxvZy9JU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4N2JmZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kaWFsb2cvSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci0KLS8qKgotKiBDb25zdGFudHMgZm9yIHN0YXR1cyBkaWFsb2dzCi0qLwotcHVibGljIGludGVyZmFjZSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzIHsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJZZXMiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRVNfSUQgPSAyOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJZZXMgdG8gYWxsIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVTX1RPX0FMTF9JRCA9IDQ7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIkNhbmNlbCIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9JRCA9IDE7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIk9LIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfSUQgPSAwOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJEZXRhaWxzIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVUQUlMU19JRCA9IDEzOwotCi0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIlllcyIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFU19MQUJFTCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfWUVTX0xBQkVMIik7Ci0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIlllcyB0byBhbGwiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRVNfVE9fQUxMX0xBQkVMID0gV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlU1RBVFVTX0RJQUxPR19ZRVNfVE9fQUxMX0xBQkVMIik7Ci0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIkNhbmNlbCIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTkNFTF9MQUJFTCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfQ0FOQ0VMX0xBQkVMIik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXhlY3V0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4ZWN1dGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczMjZiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXhlY3V0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQ7Ci0KLS8qKgotKiBBbGwgRXh0ZW5zaW9ucyB3aXRoIGV4ZWN0dXRhYmxlIGV4dGVuc2lvbnMgc2hvdWxkIGltcGxlbWVudCB0aGlzIAotKiB0byBmaXQgb3VyIGZyYW1ld29yawotKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZUV4ZWN1dGFibGUKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIC8qKgotICAqUmV0dXJucyBhIHdpemFyZCBmcmFnbWVudCBmb3IgdGhpcyBleGVudGlvbiB0eXBlIAotICAqCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRmluaXNoQ29tbWFuZCBnZXRGaW5pc2hDb21tYW5kKCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJjNDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotCi0vKioKLSogVGhpcyByZXByZXNlbnRzIGFuIGV4dGVuc2lvbiBpbiB0aGUgcGx1Z2luIHJlZ2lzdHJ5IAotKiBJdCBqb2IgaXMgdG8gYWN0IGFzIGEgcHJveHkgdG8gdGhlIGljb25maWdlbGVtZW50Ci0qLwotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlRXh0ZW5zaW9uCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIElmIHRoZSBleHRlbnNpb24gaGFzIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBleGVjdXRlZCBvciBhIGZyYWdtZW50IGFkZGVkCi0gICogQHJldHVybiBXZWJTZXJ2aWNlRXhlY3V0YWJsZSB0aGlzIGludGVyZmFjZSBob2xkcyBleGVjdXRhYmxlIGNvZGUgYW5kIGEgCi0gICogZnJhZ21lbnQKLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VFeGVjdXRhYmxlIGdldFdlYlNlcnZpY2VFeGVjdXRhYmxlRXh0ZW5zaW9uKCk7Ci0KLSAgLyoqCi0gICogVGhpcyBpcyB0aGUgY29uZmlnIGVsZW1lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZW5zaW9uIGluZm8KLSAgKiBAcGFyYW0gSUNvbmZpZ3VyYXRpb25FbGVtZW50IEV4dGVuc2lvbiBlbGVtZW50Ci0gICovCi0gIHB1YmxpYyB2b2lkIHNldENvbmZpZ0VsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpOwotIAotICAvKioKLSAgKiBJZiB0aGUgZXh0ZW5zaW9uIGhhcyBjb2RlIHRoYXQgCi0gICogQHJldHVybiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgRXh0ZW5zaW9uIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWdFbGVtZW50KCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OWU5MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotCi0KLQotCi0KLS8qKgotKiBUaGlzIHJlcHJlc2VudHMgYW4gZXh0ZW5zaW9uIGluIHRoZSBwbHVnaW4gcmVnaXN0cnkgCi0qIEl0IGpvYiBpcyB0byBhY3QgYXMgYSBwcm94eSB0byB0aGUgaWNvbmZpZ2VsZW1lbnQKLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUV4dGVuc2lvbkltcGwgaW1wbGVtZW50cyBXZWJTZXJ2aWNlRXh0ZW5zaW9uCi17Ci0KLQlwcml2YXRlIExvZwlsb2dfOwotCQotICAvKgotICAqIFRoZSBDb25maWdFbGVtZW50IHRoYXQgaG9sZHMgZXh0ZW5zaW9uIGluZm8KLSAgKi8KLSAgcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50XzsKLQotICAvKgotICAqIFRoZSBleHRlbnNpb24gZXhlY3V0YWJsZSAKLSAgKi8KLSAgcHJvdGVjdGVkIFdlYlNlcnZpY2VFeGVjdXRhYmxlIHdlYlNlcnZpY2VFeGVjdXRhYmxlXzsKLSAgCi0KLSAgcHVibGljIFdlYlNlcnZpY2VFeHRlbnNpb25JbXBsKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotICB7Ci0gICAgY29uZmlnRWxlbWVudF8gPSBjb25maWdFbGVtZW50OwotICAgIGxvZ18gPSBuZXcgRWNsaXBzZUxvZygpOwotICB9Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogSWYgdGhlIGV4dGVuc2lvbiBoYXMgY29kZSB0aGF0IG5lZWRzIHRvIGJlIGV4ZWN1dGVkIG9yIGEgZnJhZ21lbnQgYWRkZWQKLSAgKiBAcmV0dXJuIFdlYlNlcnZpY2VFeGVjdXRhYmxlIHRoaXMgaW50ZXJmYWNlIGhvbGRzIGV4ZWN1dGFibGUgY29kZSBhbmQgYSAKLSAgKiBmcmFnbWVudAotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUV4ZWN1dGFibGUgZ2V0V2ViU2VydmljZUV4ZWN1dGFibGVFeHRlbnNpb24oKQotICB7Ci0gICAgaWYod2ViU2VydmljZUV4ZWN1dGFibGVfICE9IG51bGwpIHJldHVybiB3ZWJTZXJ2aWNlRXhlY3V0YWJsZV87Ci0KLSAgICB0cnl7Ci0gICAgICBPYmplY3Qgd2ViU2VydmljZUV4ZWN1dGFibGUgPSBjb25maWdFbGVtZW50Xy5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgCi0gICAgICBpZiggd2ViU2VydmljZUV4ZWN1dGFibGUgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRXhlY3V0YWJsZSkKLSAgICAgICAgcmV0dXJuIChXZWJTZXJ2aWNlRXhlY3V0YWJsZSl3ZWJTZXJ2aWNlRXhlY3V0YWJsZTsgCi0gICAgICBlbHNlCi0gICAgICAJbG9nXy5sb2coTG9nLkVSUk9SLCA1MDI4LCB0aGlzLCAiZ2V0V2ViU2VydmljZUV4ZWN1dGFibGVFeHRlbnNpb24iLCAiSW5jb3JyZWN0IFdlYlNlcnZpY2VUZXN0OiIgKyB3ZWJTZXJ2aWNlRXhlY3V0YWJsZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7ICAgICAgCi0gICAgfWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotICAgICAgbG9nXy5sb2coTG9nLkVSUk9SLCA1MDI5LCB0aGlzLCAiZ2V0V2ViU2VydmljZUV4ZWN1dGFibGVFeHRlbnNpb24iLGUpOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBpcyB0aGUgY29uZmlnIGVsZW1lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZW5zaW9uIGluZm8KLSAgKiBAcGFyYW0gSUNvbmZpZ3VyYXRpb25FbGVtZW50IEV4dGVuc2lvbiBlbGVtZW50Ci0gICovCi0gIHB1YmxpYyB2b2lkIHNldENvbmZpZ0VsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpCi0gIHsKLSAgICBjb25maWdFbGVtZW50XyA9IGNvbmZpZ0VsZW1lbnQ7Ci0gIH0JCi0KLSAgLyoqCi0gICogVGhpcyBpcyB0aGUgY29uZmlnIGVsZW1lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZW5zaW9uIGluZm8KLSAgKiBAcmV0dXJuIElDb25maWd1cmF0aW9uRWxlbWVudCBFeHRlbnNpb24gZWxlbWVudAotICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGNvbmZpZ0VsZW1lbnRfOwotICB9Ci0gIAotICAvKioKLSAgKiBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGJlaW5nIHVzZWQKLSAgKiBAcmV0dXJuIFN0cmluZyBuYW1lIG9mIHRoaXMgZXh0ZW5zaW9uCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29uZmlnRWxlbWVudCgpLmdldEF0dHJpYnV0ZSggIm5hbWUiICk7Ci0gIH0KLQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjMWQwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0OwotCi0KLS8qKgotKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZXh0ZW5zaW9ucyBmb3IgYSBnaXZlbiBleHRlbnNpb24tcG9pbnQgCi0qIGFsc28gcmV0dXJucyB0aGUgZXh0ZW5zaW9uIG9iamVjdHMgCi0qCi0qLwotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkKLXsKLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIGV4dGVuc2lvbnMKLSAgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCBleHRlbnNpb25zLgotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZUV4dGVuc2lvbk5hbWVzICgpOwotICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgZXh0ZW5zaW9uIG9iamVjdCBvZiB0aGUgZ2l2ZW4gbmFtZQotICAqQHJldHVybiBXZWJTZXJ2aWNlRXh0ZW5zaW9uIG9iamVjdAotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUV4dGVuc2lvbiBnZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uc0J5TmFtZSggU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAqIFJldHVybnMgQWxsIGV4dGVudGlvbiBvYmplY3RzIGluIHRoaXMgcmVnaXN0cnkKLSAgKkByZXR1cm4gV2ViU2VydmljZUV4dGVuc2lvbiBvYmplY3RzCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uW10gZ2V0V2ViU2VydmljZUV4dGVuc2lvbnMoKTsKLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjVjZWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuTGFiZWxzQW5kSWRzOwotCi0KLS8qKgotKiBUaGlzIGlzIGEgZ2VuZXJpYyByZWdpc3RyeSB3aGljaCBzZXRzIHVwIGdlbmVyYWwgY29kZSBpbiBoYW5kbGluZyAgIAotKiBJQ29uZmlnRWxlbWVudHMgZm9yIGFuIGV4dGVuc2lvbgotKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICAKLSAgcHJpdmF0ZSBIYXNodGFibGUgbmFtZUV4dGVuc2lvblRhYmxlXzsKLSAgcHJpdmF0ZSBWZWN0b3IgaWRfOwotICBwcml2YXRlIFZlY3RvciBsYWJlbF87Ci0gIHByaXZhdGUgTGFiZWxzQW5kSWRzIGxhYmVsc2FuZGlkc187Ci0gICAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsKCkKLSAgewotICAgIG5hbWVFeHRlbnNpb25UYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgbGFiZWxfID0gbmV3IFZlY3RvcigpOwotICAgIGlkXyA9IG5ldyBWZWN0b3IoKTsKLSAgICBsb2FkRXh0ZW5zaW9ucygpOwotICB9Ci0gIAotICAvKioKLSAgKiBDaGlsZHJlbiByZWdpc3RyaWVzIHdpbGwgaGF2ZSBkaWZmZXJlbnQgZXh0ZW5zaW9uIHR5cGVzIAotICAqIEByZXR1cm4gV2Vic2VydmljZUV4dGVuc2lvbiBob2xkcyBhIGNvbmZpZyBlbGVtCi0gICogZm9yIHRoYXQgZXh0ZW5zaW9uIGNhcGFibGUgb2YgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCi0gICovCi0gIHB1YmxpYyBhYnN0cmFjdCBXZWJTZXJ2aWNlRXh0ZW5zaW9uIGNyZWF0ZVdlYlNlcnZpY2VFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpOwotCi0gIC8qKgotICAqIENoaWxkcmVuIG11c3QgaW1wbGVtZW50IGhvdyB0aGV5IGdldCB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gCi0gICogQHJldHVybiBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBhbiBhcnJheSBvZiBlbGVtZW50cyBwYXJ0aWN1bGFyIHRvIHRoYXQKLSAgKiBleHRlbnNpb24KLSAgKi8KLSAgcHVibGljIGFic3RyYWN0IElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldENvbmZpZ0VsZW1lbnRzKCk7Ci0KLSAgLyoKLSAgKiBMb2FkcyBXZWJTZXJ2aWNlRXh0ZW5zaW9ucyBmb3IgV2ViU2VydmljZUNsaWVudFRlc3QgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAqIFRoaXMgaXMgZG9uZSBieSBxdWVyeWluZyB0aGUgcGx1Z2luIHJlZ2lzdHJ5IGZvciBhbGwgZXh0ZW5zaW9ucwotICAqIHRoYXQgZXh0ZW5kIHdlYlNlcnZpY2VDbGllbnRUZXN0ICAKLSAgKi8KLSAgcHJpdmF0ZSB2b2lkIGxvYWRFeHRlbnNpb25zICgpCi0gIHsgICAgCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gZ2V0Q29uZmlnRWxlbWVudHMoKTsKLQotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjb25maWcubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBjb25maWdbaWR4XTsKLSAgICAgIFN0cmluZyBuYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoICJuYW1lIiApOwotICAgICAgU3RyaW5nIGlkID0gICBlbGVtLmdldEF0dHJpYnV0ZSggImlkIiApOyAgICAgIAotICAgICAgV2ViU2VydmljZUV4dGVuc2lvbiB3ZWJTZXJ2aWNlRXh0ZW5zaW9uID0gY3JlYXRlV2ViU2VydmljZUV4dGVuc2lvbihlbGVtKTsJCi0gICAgICBuYW1lRXh0ZW5zaW9uVGFibGVfLnB1dChuYW1lLHdlYlNlcnZpY2VFeHRlbnNpb24pOwotICAgICAgbGFiZWxfLmFkZChuYW1lKTsKLSAgICAgIGlkXy5hZGQoaWQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIGV4dGVuc2lvbnMKLSAgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCBleHRlbnNpb25zLgotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZUV4dGVuc2lvbk5hbWVzICgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZ1tdKW5hbWVFeHRlbnNpb25UYWJsZV8ua2V5U2V0KCkudG9BcnJheSggbmV3IFN0cmluZ1swXSApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbmFtZXMgYW5kIElkcyAKLSAgICovCi0gIHB1YmxpYyBMYWJlbHNBbmRJZHMgZ2V0TGFiZWxzQW5kSURzKCkKLSAgewotICAJbGFiZWxzYW5kaWRzXyA9IG5ldyBMYWJlbHNBbmRJZHMoKTsKLSAgCWxhYmVsc2FuZGlkc18uc2V0TGFiZWxzXygoU3RyaW5nW10pbGFiZWxfLnRvQXJyYXkoIG5ldyBTdHJpbmdbMF0gKSk7Ci0gIAlsYWJlbHNhbmRpZHNfLnNldElkc18oKFN0cmluZ1tdKWlkXy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICkpOwotICAJcmV0dXJuIGxhYmVsc2FuZGlkc187Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGV4dGVuc2lvbiBvYmplY3Qgb2YgdGhlIGdpdmVuIG5hbWUKLSAgKiBAcmV0dXJuIFdlYlNlcnZpY2VFeHRlbnNpb24gb2JqZWN0Ci0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uIGdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAoV2ViU2VydmljZUV4dGVuc2lvbiluYW1lRXh0ZW5zaW9uVGFibGVfLmdldChuYW1lKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgQWxsIGV4dGVudGlvbiBvYmplY3RzIGluIHRoaXMgcmVnaXN0cnkKLSAgKkByZXR1cm4gV2ViU2VydmljZUV4dGVuc2lvbiBvYmplY3RzCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uW10gZ2V0V2ViU2VydmljZUV4dGVuc2lvbnMoKQotICB7Ci0gICAgcmV0dXJuIChXZWJTZXJ2aWNlRXh0ZW5zaW9uW10pbmFtZUV4dGVuc2lvblRhYmxlXy52YWx1ZXMoKS50b0FycmF5KCBuZXcgV2ViU2VydmljZUV4dGVuc2lvblswXSApOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUZpbmlzaENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VGaW5pc2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTI5YmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUZpbmlzaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKgotKiA8Y29weXJpZ2h0PgotKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSoKLSogPC9jb3B5cmlnaHQ+Ci0qLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VGaW5pc2hDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9KYXZhUHJveHlUZXN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9KYXZhUHJveHlUZXN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTAzOTcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvSmF2YVByb3h5VGVzdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKgotKiA8Y29weXJpZ2h0PgotKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSoKLSogPC9jb3B5cmlnaHQ+Ci0qLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFQcm94eVRlc3RDb21tYW5kIGV4dGVuZHMgV2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kCi17Ci0KLSAvKioKLSAgKiBUaGlzIGhvbGRzIGFuIGluZm8gY2xhc3MgdGhhdCBjb21lcyBmcm9tIHVzZXIgaW5wdXQgb3Igc29tZSBjYWxjaWxhdGlvbnMgdGhhdCBuZWVkcyB0byBiZQotICAqIHVzZWQgZm9yIHRoZSBmaW5pc2gKLSAgKi8KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEpzcEZvbGRlcihTdHJpbmcganNwRm9sZGVyKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJ1bkNsaWVudFRlc3QoYm9vbGVhbiBydW5DbGllbnRUZXN0KTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoU3RyaW5nIHNhbXBsZVByb2plY3QpOwotICAKLSAgcHVibGljIHZvaWQgc2V0UHJveHlCZWFuKFN0cmluZyBwcm94eUJlYW4pOwotICAKLSAgcHVibGljIHZvaWQgc2V0U2V0RW5kcG9pbnRNZXRob2QoU3RyaW5nIHNldEVuZHBvaW50TWV0aG9kKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpOwotICAKLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcyk7Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV1NETFRlc3RGaW5pc2hDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC90ZXN0L1dTRExUZXN0RmluaXNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTIzZGNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV1NETFRlc3RGaW5pc2hDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioKLSogPGNvcHlyaWdodD4KLSoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qCi0qIDwvY29weXJpZ2h0PgotKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgV1NETFRlc3RGaW5pc2hDb21tYW5kIGV4dGVuZHMgV2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kCi17Ci0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KFN0cmluZyBzZXJ2ZXJQcm9qZWN0KTsKLSAgcHVibGljIHZvaWQgc2V0V3NkbFNlcnZpY2VVUkwoU3RyaW5nIHdzZGxVUkkpOwotICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbEJyb3dzZXIoYm9vbGVhbiBleHRlcm5hbCk7IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTFhYjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VFeHRlbnNpb25JbXBsOwotCi0KLQotLyoqCi0qIFRoaXMgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gaW4gdGhlIHBsdWdpbiByZWdpc3RyeSAKLSogSXQgam9iIGlzIHRvIGFjdCBhcyBhIHByb3h5IHRvIHRoZSBpY29uZmlnZWxlbWVudAotKiBJbiBwYXJ0aWN1bGFyIGl0IGhvbGRzIGEgY2xpZW50IHRlc3QgZXh0ZW5zaW9uIGVsZW1lbnQgCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uIGV4dGVuZHMgV2ViU2VydmljZUV4dGVuc2lvbkltcGwKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotICB7Ci0gICAgc3VwZXIoY29uZmlnRWxlbWVudCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFdpbGwgdGhpcyB0ZXN0Q2xpZW50IGdlbmVyYXRlIGNvZGUKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjb2RlZ2VuIG5lZWRlZAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NvZGVHZW5OZWVkZWQoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAiY29kZWdlbiIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFVzZSB0aGUgZGVmYXVsdCBGb2xkZXIgUHJvdmlkZWQgYnkgdXMKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBubyBzcGVjaWFsIGZvbGRlciByZXF1aXJlcwotICAqLwotICBwdWJsaWMgYm9vbGVhbiB1c2VEZWZhdWx0Q29kZUdlbkZvbGRlcigpCi0gIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJkZWZhdWx0Y29kZWdlbmZvbGRlciIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBVc2UgU3BlY2lhbCBGb2xkZXIgZm9yIGdlbmVyYXRlZCBjb2RlCi0gICogQHJldHVybiBTdHJpbmcgc3BlY2lhbCBmb2xkZXIgbmFtZQotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvZGVHZW5Gb2xkZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJjb2RlZ2VuZm9sZGVyIiApOwotICB9Ci0KLSAgLyoqCi0gICogRG8gd2UgbmVlZCB0byBsYXVuY2ggc29tZXRoaW5nCi0gICogQHJldHVybiBCb29sZWFuIGlmIHRydWUgbGF1bmNoIGNvZGVnZW4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMYXVuY2hSZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJsYXVuY2hSZXF1aXJlZCIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBEbyB3ZSBuZWVkIHRoZSBtZXRob2RzIGZvciB0aGUgcHJveHkKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBwcm94eSBtZXRob2RzIG5lZWRlZAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcmVNZXRob2RzTmVlZGVkKCkKLSAgewotICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoZ2V0Q29uZmlnRWxlbWVudCgpLmdldEF0dHJpYnV0ZSggIm1ldGhvZHNuZWVkZWQiICkpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0KLSAgLyoqCi0gICogRG9lcyB0aGlzIHRlc3QgbWFjaGluZSBuZWVkIGEgc2VydmVyCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgYSBzZXJ2ZXIgaXMgcmVxdWlyZWQKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJOZWVkZWQoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAic2VydmVybmVlZGVkIiApKS5ib29sZWFuVmFsdWUoKTsKLSAgfQotCi0gIC8qKgotICAqIFVzZSB0aGUgRGVmYXVsdCBTZXJ2ZXIgY2hvc2VuIGJ5IHRoZSB3aXphcmQKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZGVmYXVsdCBzZXJ2ZXIgaXMgd2FudGVkCi0gICovCi0gIHB1YmxpYyBib29sZWFuIHVzZURlZmF1bHRTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAiZGVmYXVsdHNlcnZlciIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBVc2UgdGhlIERlZmF1bHQgU2VydmVyIGNob3NlbiBieSB0aGUgd2l6YXJkCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIGRlZmF1bHQgc2VydmVyIGlzIHdhbnRlZAotICAqLwotICBwdWJsaWMgU3RyaW5nIHVzZVNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29uZmlnRWxlbWVudCgpLmdldEF0dHJpYnV0ZSggInVzZXNlcnZlciIgKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzSmF2YSgpCi0gIHsKLSAgCXJldHVybiBCb29sZWFuLnZhbHVlT2YoZ2V0Q29uZmlnRWxlbWVudCgpLmdldEF0dHJpYnV0ZSggImphdmEiICkpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0gIAkKLSAgCi19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlODdmZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKgotKiA8Y29weXJpZ2h0PgotKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSoKLSogPC9jb3B5cmlnaHQ+Ci0qLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRmluaXNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotcHVibGljIGludGVyZmFjZSBXZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQgZXh0ZW5kcyBXZWJTZXJ2aWNlRmluaXNoQ29tbWFuZAotewotCi0gIC8qKgotICAgKiBJZiB0aGUgY29tbWFuZCBuZWVkcyBhIHNlcnZlciB0aGlzIGlzIHRoZSBjaG9zZW4gCi0gICAqIGNsaWVudCBzZXJ2ZXJJRAotICAgKiBAcGFyYW0gc2FtcGxlU2VydmVyVHlwZUlECi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQpOwotICAKLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIElTZXJ2ZXIgaWYgcmVxdWlyZWQKLSAgICogQHBhcmFtIHNhbXBsZUV4aXN0aW5nU2VydmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcik7Ci0gIAotICAvKioKLSAgICogVGhpcyBpcyB0aGUgZW5kcG9pbnRzIGlmIG1vbml0b3Igc2VydmljZSBpcyBlbmFibGVkCi0gICAqIEBwYXJhbSBlbmRwb2ludHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50KExpc3QgZW5kcG9pbnRzKTsKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC90ZXN0L1dlYlNlcnZpY2VUZXN0UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDA2NDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQuV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5SW1wbDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgZXh0ZW5kcyBXZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICAvKgotICAgKiBUaGlzIGlzIGEgc2luZ2xldG9uIGJlY2FzdWUgaXQgd2FzIGRlY2lkZWQgdGhhdCB0aGUgbWVtb3J5IGZvb3QgcHJpbnQgCi0gICAqIGlzIG5vdCBhcyBleHBlbnNpdmUgYXMgdGhlIHRpbWUgdGFrZW4gcmV0cmlldmluZyB0aGUgZGF0YQotICAgKiAKLSAgICovCi0gIAotICAKLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVRlc3RSZWdpc3RyeSB3c3RyOwotICAKLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAJaWYod3N0ciA9PSBudWxsKSB3c3RyID0gbmV3IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkoKTsKLSAgICByZXR1cm4gd3N0cjsKLSAgfQotICAKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIENoaWxkcmVuIHJlZ2lzdHJpZXMgd2lsbCBoYXZlIGRpZmZlcmVudCBleHRlbnNpb24gdHlwZXMgCi0gICogQHJldHVybiBXZWJzZXJ2aWNlRXh0ZW5zaW9uIGhvbGRzIGEgY29uZmlnIGVsZW0KLSAgKiBmb3IgdGhhdCBleHRlbnNpb24gY2FwYWJsZSBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIGZpbGUKLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VFeHRlbnNpb24gY3JlYXRlV2ViU2VydmljZUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkKLSAgewotICAgIHJldHVybiBuZXcgV2ViU2VydmljZVRlc3RFeHRlbnNpb24oY29uZmlnRWxlbWVudCk7Ci0gIH0KLQotICAvKioKLSAgKiBDaGlsZHJlbiBtdXN0IGltcGxlbWVudCBob3cgdGhleSBnZXQgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIAotICAqIEByZXR1cm4gSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYW4gYXJyYXkgb2YgZWxlbWVudHMgcGFydGljdWxhciB0byB0aGF0Ci0gICogZXh0ZW5zaW9uCi0gICovCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWdFbGVtZW50cygpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJTZXJ2aWNlVGVzdCIpOwotICAgIHJldHVybiBjb25maWc7ICAgIAotICB9Ci0KLQotICAgIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvcGx1Z2luL1dlYlNlcnZpY2VQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvcGx1Z2luL1dlYlNlcnZpY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNiNjNmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3BsdWdpbi9XZWJTZXJ2aWNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5VRERJUHJlZmVyZW5jZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudFJlc291cmNlQ29udGV4dDsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIHBsdWdpbi4KLSogPHA+Ci0qIFRoaXMgcGx1Z2luIGNvbnRhaW5zIHRoZSBidWxrIG9mIHRoZSBXZWIgU2VydmljZXMgcnVudGltZS4KLSogT25seSB0aGUgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIHBvcnRpb24gb2YgdGhlIHJ1bnRpbWUgaXMKLSogZm91bmQgZWxzZXdoZXJlIC0gaW4gdGhlIG9yZy5lY2xpcHNlLmpzdC53cy51aSBwbHVnaW4uCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzIjsKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VQbHVnaW4gaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHRfOwotICBwcml2YXRlIFBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQgc2NlbmFyaW9Db250ZXh0XzsKLSAgcHJpdmF0ZSBQZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCBwcm9qZWN0VG9wb2xvZ3lDb250ZXh0XzsKLSAgcHJpdmF0ZSBQZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0IHVkZGlQcmVmZXJlbmNlQ29udGV4dDsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlUGx1Z2luKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgaW5zdGFuY2VfID0gdGhpczsgCi0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAgKiBAcmV0dXJuIFRoZSBXZWJTZXJ2aWNlUGx1Z2luIHNpbmdsZXRvbi4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUGx1Z2luIGdldEluc3RhbmNlICgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIAotICB7Ci0gIAkJKChQZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCkgZ2V0UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpKS5sb2FkKCk7Ci0gIAkJKChQZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0KSBnZXRVRERJUHJlZmVyZW5jZUNvbnRleHQoKSkubG9hZCgpOwotICB9Ci0KLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKQotICB7Ci0gIAkJaWYgKHJlc291cmNlQ29udGV4dF8gPT0gbnVsbCkgCi0gIAkJCXJlc291cmNlQ29udGV4dF8gPSBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiByZXNvdXJjZUNvbnRleHRfOwotICB9Ci0KLSAgcHVibGljIFNjZW5hcmlvQ29udGV4dCBnZXRTY2VuYXJpb0NvbnRleHQoKQotICB7Ci0gIAkJaWYgKHNjZW5hcmlvQ29udGV4dF8gPT0gbnVsbCkKLSAgCQl7Ci0gIAkJICBzY2VuYXJpb0NvbnRleHRfID0gbmV3IFBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQoKTsKLSAgCQkgIHNjZW5hcmlvQ29udGV4dF8ubG9hZCgpOwotICAJCX0KLQotCQlyZXR1cm4gc2NlbmFyaW9Db250ZXh0XzsKLSAgfQotCi0gIHB1YmxpYyBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKQotICB7Ci0gICAgaWYgKHByb2plY3RUb3BvbG9neUNvbnRleHRfID09IG51bGwpCi0gICAgICBwcm9qZWN0VG9wb2xvZ3lDb250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpOwotICAgIHJldHVybiBwcm9qZWN0VG9wb2xvZ3lDb250ZXh0XzsKLSAgfQotCi0gIAotICBwdWJsaWMgVURESVByZWZlcmVuY2VDb250ZXh0IGdldFVERElQcmVmZXJlbmNlQ29udGV4dCgpCi0gIHsKLSAgICBpZiAodWRkaVByZWZlcmVuY2VDb250ZXh0ID09IG51bGwpCi0gICAgICB1ZGRpUHJlZmVyZW5jZUNvbnRleHQgPSBuZXcgUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dCgpOwotICAgIHJldHVybiB1ZGRpUHJlZmVyZW5jZUNvbnRleHQ7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiBwbHVnaW4ucHJvcGVydGllcy4KLSAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXkgKQotICB7Ci0gICAgcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKGluc3RhbmNlXy5nZXRCdW5kbGUoKSxrZXkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiBwbHVnaW4ucHJvcGVydGllcy4gU3Vic3RpdHV0aW9uIHNlcXVlbmNlcyBpbiB0aGUgbWVzc2FnZSBzdHJpbmcKLSAgKiBhcmUgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIGFycmF5IG9mIHN1YnN0aXR1dGlvbiBvYmplY3RzICh3aGljaAotICAqIGFyZSBtb3N0IGZyZXF1ZW50bHkgc3RyaW5ncykuIFNlZSB0aGUgSkRLJ3MKLSAgKiB7QGxpbmsgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXR9Ci0gICogY2xhc3MgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gICogQHJldHVybiBUaGUgU3RyaW5nIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzICkKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRNZXNzYWdlKGtleSksYXJncyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWJkYWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi0KLU1TR19FUlJPUl9TRVJWRVI9SVdBQjAyMTNFIEVycm9yIGluIHN0YXJ0aW5nIHNlcnZlci4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTkwYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotcnVudGltZQotdGVtcC5mb2xkZXIKLWVudmNvcmUuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyN2RlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODgzYmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgZW52Y29yZS5qYXIKLXNyYy5pbmNsdWRlcyA9IC5jbGFzc3BhdGgsXAotICAgICAgICAgICAgICAgLnByb2plY3QsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8KLXNvdXJjZS5lbnZjb3JlLmphciA9IHNyYy8KLW91dHB1dC5lbnZjb3JlLmphciA9IGJpbi8KLWphcnMuY29tcGlsZS5vcmRlciA9IGVudmNvcmUuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNDU4ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZCI+Ci0gICA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj4KLSAgIDwvY29tcG9uZW50LWRlcGVuZHM+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MTcwOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPUVudmlyb25tZW50IENvbW1hbmQgRnJhbWV3b3JrIChjb3JlKQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMDdmYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUiCi0gICB2ZXJzaW9uID0gIjEuMC4wIgotICAgbmFtZSA9ICIlUExVR0lOX05BTUUiCi0gICBwcm92aWRlci1uYW1lID0gIiVQTFVHSU5fUFJPVklERVIiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImVudmNvcmUuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiZGEzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLS8qKgotICogQ29tbWFuZHMgYXJlIGV4ZWN1dGFibGUsIHVuZG9hYmxlLCByZWRvYWJsZSBvYmplY3RzLgotICogRXZlcnkgQ29tbWFuZCBoYXMgYSBuYW1lIGFuZCBhIGRlc2NyaXB0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmQKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIENvbW1hbmQsIGEgc2hvcnQgdHJhbnNsYXRhYmxlIHN0cmluZwotICAgKiBpbmRpY2F0aW5nIHdoYXQgdGhlIENvbW1hbmQgZG9lcy4gQ2FuIGJlIG51bGwuCi0gICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIENvbW1hbmQuIENhbiBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQ29tbWFuZC4gQ2FuIGJlIG51bGwuCi0gICAqIEByZXR1cm4gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBDb21tYW5kLiBDYW4gYmUgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCk7Ci0gIAotICAvKioKLSAgICogRXhlY3V0ZXMgdGhlIENvbW1hbmQuCi0gICAqIEBwYXJhbSBlbnZpcm9ubWVudCBUaGUgZW52aXJvbm1lbnQuCi0gICAqIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gQSA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZSBkZWdyZWUKLSAgICogdG8gd2hpY2ggdGhlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG1ldGhvZCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICogQSB2YWx1ZCBvZiA8Y29kZT5udWxsPC9jb2RlPiwgb3IgYSBTdGF0dXMgd2l0aCBhIHNldmVyaXR5Ci0gICAqIG9mIGxlc3MgdGhhbiA8Y29kZT5TdGF0dXMuRVJST1I8L2NvZGU+IHNpZ25pZmllcyBzdWNjZXNzLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlICggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKTsKLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiwgYW5kIG9ubHkgaWYsIHRoZSBDb21tYW5kJ3MKLSAgICogPGNvZGU+dW5kbzwvY29kZT4gbWV0aG9kIGlzIHN1cHBvcnRlZC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBDb21tYW5kIHN1cHBvcnRzIGJlaW5nIHVuZG9uZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUgKCk7Ci0KLSAgLyoqCi0gICAqIFVuZG9lcyB0aGUgQ29tbWFuZC4KLSAgICogQHBhcmFtIGVudmlyb25tZW50IFRoZSBlbnZpcm9ubWVudC4KLSAgICogTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHJldHVybiBBIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0IGluZGljYXRpbmcgdGhlIGRlZ3JlZQotICAgKiB0byB3aGljaCB0aGUgPGNvZGU+dW5kbzwvY29kZT4gbWV0aG9kIHdhcyBzdWNjZXNzZnVsLgotICAgKiBBIHZhbHVkIG9mIDxjb2RlPm51bGw8L2NvZGU+LCBvciBhIFN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkKLSAgICogb2YgbGVzcyB0aGFuIDxjb2RlPlN0YXR1cy5FUlJPUjwvY29kZT4gc2lnbmlmaWVzIHN1Y2Nlc3MuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIHVuZG8gKCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmLCBhbmQgb25seSBpZiwgdGhlIENvbW1hbmQncwotICAgKiA8Y29kZT5yZWRvPC9jb2RlPiBtZXRob2QgaXMgc3VwcG9ydGVkLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIENvbW1hbmQgc3VwcG9ydHMgYmVpbmcgcmVkb25lLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWRvYWJsZSAoKTsKLQotICAvKioKLSAgICogUmUtZXhlY3V0ZXMgdGhlIENvbW1hbmQuCi0gICAqIEBwYXJhbSBlbnZpcm9ubWVudCBUaGUgZW52aXJvbm1lbnQuCi0gICAqIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gQSA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZSBkZWdyZWUKLSAgICogdG8gd2hpY2ggdGhlIDxjb2RlPnJlZG88L2NvZGU+IG1ldGhvZCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICogQSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiwgb3IgYSBTdGF0dXMgd2l0aCBhIHNldmVyaXR5Ci0gICAqIG9mIGxlc3MgdGhlbiA8Y29kZT5TdGF0dXMuRVJST1I8L2NvZGU+IHNpZ25pZmllcyBzdWNjZXNzLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyByZWRvICggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL0NvbW1hbmRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9Db21tYW5kRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjhkZjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL0NvbW1hbmRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gY3JlYXRlIENvbW1hbmQgb2JqZWN0cy4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZEZhY3RvcnkgCi17Ci0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgY3JlYXRlZCBDb21tYW5kIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBDb21tYW5kIGNyZWF0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvQ29tbWFuZE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL0NvbW1hbmRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YjQ3OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvQ29tbWFuZE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0KLS8qKgotICogQ29tbWFuZE1hbmFnZXJzIGhlbHAgbWFuYWdlIHRoZSBsaWZlY3ljbGUgb2YgQ29tbWFuZHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZE1hbmFnZXIKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIENvbW1hbmRNYW5hZ2VyIGlzIGNhcGFibGUgb2YgdW5kb2luZwotICAgKiBDb21tYW5kcy4gU29tZSBDb21tYW5kTWFuYWdlcnMgYW5kIEVudmlyb25tZW50cyBtYXkgYmUgb2YKLSAgICogYSBzb3J0IHRoYXQgd2lsbCBuZXZlciB1bmRvKCkgQ29tbWFuZHMuIENvbW1hbmQuZXhlY3V0ZSgpCi0gICAqIG1ldGhvZHMgc2hvdWxkIHRha2UgYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIHRvIG9wdGltaXplCi0gICAqIG91dCBhbnkgY2FjaGluZyBsb2dpYyB3aGVuZXZlciB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvRW5hYmxlZCAoKTsKLQotICAvLyBUaGVyZSdzIHByb2JhYmx5IG1vcmUsIGxpa2UgZmFjdG9yeSBtZXRob2RzIGZvciBjcmVhdGluZwotICAvLyBVbmRvL1JlZG8gc3RhY2tzIGFuZCBzdHVmZiBsaWtlIHRoYXQuCi0gIAotICBwdWJsaWMgRGF0YU1hcHBpbmdSZWdpc3RyeSBnZXRNYXBwaW5nUmVnaXN0cnkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL011bHRpQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvTXVsdGlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYWI1ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvTXVsdGlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotICogVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGdyb3VwIG11bHRpcGxlIENvbW1hbmRzIHRvZ2V0aGVyCi0gKiBpbnRvIGEgc2luZ2xlIHNlcXVlbmNlIGxpc3Qgb2YgY29tbWFuZHMgdG8gZXhlY3V0ZS4KLSAqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotCSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSAgICAgICAgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKLQotICBwcml2YXRlIExpc3QgICAgICAgICAgICBjb21tYW5kc18gICAgICA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gIHByaXZhdGUgQ29tbWFuZFtdICAgICAgIGNvbW1hbmRzQXJyYXlfID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIE11bHRpQ29tbWFuZCB3aXRoIG5vIG5hbWUsIGRlc2NyaXB0aW9uLCBvciBsaXN0IG9mIGNvbW1hbmRzLgotICAgKgotICAgKi8KLSAgcHVibGljIE11bHRpQ29tbWFuZCAoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIE11dGlsQ29tbWFuZHMgd2l0aCBhbiBlbXB0eSBsaXN0IG9mIGNvbW1hbmRzLgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZC4KLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uIEEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQuCi0gICAqLwotICBwdWJsaWMgTXVsdGlDb21tYW5kICggU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiApCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgTXVsdGlDb21tYW5kCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29tbWFuZC4KLSAgICogQHBhcmFtIGNvbW1hbmRzIGFuIGluaXRpYWwgbGlzdCBvZiB0aGUgY29tbWFuZHMgdG8gZXhlY3V0ZS4KLSAgICovCi0gIHB1YmxpYyBNdWx0aUNvbW1hbmQgKCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBDb21tYW5kW10gY29tbWFuZHMgKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgY29tbWFuZHNfLmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbW1hbmRzKSk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIGNvbW1hbmQgdG8gdGhlIGxpc3Qgb2YgY29tbWFuZHMgdG8gZXhlY3V0ZS4KLSAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQgdG8gYWRkLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkICggQ29tbWFuZCBjb21tYW5kICkKLSAgewotICAgIGNvbW1hbmRzQXJyYXlfID0gbnVsbDsKLSAgICBjb21tYW5kc18uYWRkKGNvbW1hbmQpOwotICB9Ci0KLSAgLyoqCi0gICAqICAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kI2dldE5hbWUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gbmFtZSA6IChjb21tYW5kc18uc2l6ZSgpID4gMCA/ICgoQ29tbWFuZCljb21tYW5kc18uZ2V0KDApKS5nZXROYW1lKCkgOiBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kI2dldERlc2NyaXB0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIHJldHVybiBkZXNjcmlwdGlvbiAhPSBudWxsID8gZGVzY3JpcHRpb24gOiAoY29tbWFuZHNfLnNpemUoKSA+IDAgPyAoKENvbW1hbmQpY29tbWFuZHNfLmdldCgwKSkuZ2V0RGVzY3JpcHRpb24oKSA6IG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGVzIHRoZSBsaXN0IG9mIGNvbW1hbmRzIGluIHRoZSBNdWx0aUNvbW1hbmQuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUgKCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbnVsbDsKLSAgICBDb21tYW5kW10gY29tbWFuZHMgPSBjb21tYW5kc0FycmF5KCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPGNvbW1hbmRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IGNvbW1hbmRzW2ldLmV4ZWN1dGUoZW52aXJvbm1lbnQpOwotICAgICAgCi0gICAgICBpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLm1hdGNoZXMoU3RhdHVzLkVSUk9SKSkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpLS07IGk+PTA7IGktLSkKLSAgICAgICAgewotICAgICAgICAgIGNvbW1hbmRzW2ldLnVuZG8oZW52aXJvbm1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogSW5kaWNhdGVzIGlmIHRoaXMgY29tbWFuZCBpcyB1bmRvYWJsZS4gIElmIG9uZSBvZiB0aGUgY29tbWFuZHMKLSAgICogaW4gdGhlIGxpc3QgaXMgdW5kb2FibGUgdGhlIGVudGlyZSBsaXN0IGlzIGNvbnNpZGVyZWQgdG8gYmUgCi0gICAqIHVuZG9hYmxlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvYWJsZSAoKQotICB7Ci0gICAgTGlzdEl0ZXJhdG9yIGkgPSBjb21tYW5kc18ubGlzdEl0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGkuaGFzUHJldmlvdXMoKSkKLSAgICB7Ci0gICAgICBpZiAoISgoQ29tbWFuZClpLnByZXZpb3VzKCkpLmlzVW5kb2FibGUoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBVbmRvcyB0aGlzIGNvbW1hbmQgaWYgaXQgY2FuLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyB1bmRvICggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gICAgTGlzdEl0ZXJhdG9yIGkgPSBjb21tYW5kc18ubGlzdEl0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGkuaGFzUHJldmlvdXMoKSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKENvbW1hbmQpaS5wcmV2aW91cygpKS51bmRvKGVudmlyb25tZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9hYmxlIG9yIG5vdC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVkb2FibGUgKCkKLSAgewotICAgIExpc3RJdGVyYXRvciBpID0gY29tbWFuZHNfLmxpc3RJdGVyYXRvcigpOwotICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBpZiAoISgoQ29tbWFuZClpLm5leHQoKSkuaXNSZWRvYWJsZSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlZXhlY3V0ZXMgdGhpcyBjb21tYW5kLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyByZWRvICggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gICAgQ29tbWFuZFtdIGNvbW1hbmRzID0gY29tbWFuZHNBcnJheSgpOwotICAgIGZvciAoaW50IGk9MDsgaTxjb21tYW5kcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBjb21tYW5kc1tpXS5yZWRvKGVudmlyb25tZW50KTsKLSAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMubWF0Y2hlcyhTdGF0dXMuRVJST1IpKQotICAgICAgewotICAgICAgICBmb3IgKGktLTsgaT49MDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgY29tbWFuZHNbaV0udW5kbyhlbnZpcm9ubWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgcHJpdmF0ZSBDb21tYW5kW10gY29tbWFuZHNBcnJheSAoKQotICB7Ci0gICAgaWYgKGNvbW1hbmRzQXJyYXlfID09IG51bGwpCi0gICAgewotICAgICAgY29tbWFuZHNBcnJheV8gPSAoQ29tbWFuZFtdKWNvbW1hbmRzXy50b0FycmF5KG5ldyBDb21tYW5kWzBdKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbW1hbmRzQXJyYXlfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9TaW1wbGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9TaW1wbGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzBjYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvU2ltcGxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSAqIFRoaXMgaXMgYSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvbW1hbmQgaW50ZXJmYWNlIHRoYXQgc3ViY2xhc3MKLSAqIGNhbiBleHRlbmQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uXzsKLSAgCi0gIHB1YmxpYyBTaW1wbGVDb21tYW5kKCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uICkKLSAgewotICAgIG5hbWVfICAgICAgICA9IG5hbWU7Ci0gICAgZGVzY3JpcHRpb25fID0gZGVzY3JpcHRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBTaW1wbGVDb21tYW5kKCkKLSAgeyAgCi0gICAgbmFtZV8gICAgICAgID0gIiI7Ci0gICAgZGVzY3JpcHRpb25fID0gIiI7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZSggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgbmFtZV8gPSBuYW1lOyAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29tbWFuZC4KLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uIHRoZSBkZXNjcmlwdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKCBTdHJpbmcgZGVzY3JpcHRpb24gKQotICB7Ci0gICAgZGVzY3JpcHRpb25fID0gZGVzY3JpcHRpb247Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZShvcmcuZWNsaXBzZS5lbnYuY29tbW9uLkVudmlyb25tZW50KQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tYW5kLkNvbW1hbmQjZ2V0RGVzY3JpcHRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZGVzY3JpcHRpb25fOwotICB9Ci0KLSAgLyoqKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tYW5kLkNvbW1hbmQjZ2V0TmFtZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0gIAotICAvKiopCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1hbmQuQ29tbWFuZCNpc1JlZG9hYmxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVkb2FibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1hbmQuQ29tbWFuZCNpc1VuZG9hYmxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1hbmQuQ29tbWFuZCNyZWRvKG9yZy5lY2xpcHNlLmVudi5jb21tb24uRW52aXJvbm1lbnQpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIHJlZG8oRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCi0gIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tYW5kLkNvbW1hbmQjdW5kbyhvcmcuZWNsaXBzZS5lbnYuY29tbW9uLkVudmlyb25tZW50KQotICAgKi8KLSAgcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9DaG9pY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9DaG9pY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjYzliOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vQ2hvaWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotcHVibGljIGNsYXNzIENob2ljZSB7Ci0KLSAgCXByb3RlY3RlZCBjaGFyIHNob3J0Y3V0ID0gJyAnOyAKLQlwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsID0gbnVsbDsKLSAgCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotICAJCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENob2ljZS4KLQkgKi8KLQlwdWJsaWMgQ2hvaWNlKCkgewotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi0JICogQHBhcmFtIHNob3J0Y3V0Ci0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIENob2ljZShjaGFyIHNob3J0Y3V0LCBTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5zaG9ydGN1dCA9IHNob3J0Y3V0OwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi0JICogQHBhcmFtIHNob3J0Y3V0Ci0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIENob2ljZShjaGFyIHNob3J0Y3V0LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLnNob3J0Y3V0ID0gc2hvcnRjdXQ7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVzY3JpcHRpb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlc2NyaXB0aW9uLgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaG9ydGN1dC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBjaGFyCi0JICovCi0JcHVibGljIGNoYXIgZ2V0U2hvcnRjdXQoKSB7Ci0JCXJldHVybiBzaG9ydGN1dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG9ydGN1dC4KLQkgKiBAcGFyYW0gc2hvcnRjdXQgVGhlIHNob3J0Y3V0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3J0Y3V0KGNoYXIgc2hvcnRjdXQpIHsKLQkJdGhpcy5zaG9ydGN1dCA9IHNob3J0Y3V0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0NvbmRpdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0NvbmRpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTJmZWExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9Db25kaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBib29sZWFuIGNvbmRpdGlvbiB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgZm9yIGFueSBvYmplY3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uZGl0aW9uCi17Ci0gIC8qKgotICAgKiBUaGlzIHJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IHBhc3NlcyB0aGlzIGNvbmRpdGlvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vRW52aXJvbm1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9FbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQ0MjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9FbnZpcm9ubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJRmFjdG9yeTsKLQotCi0vKioKLSAqIEFuIEVudmlyb25tZW50IHByb3ZpZGVzIHRoZSBtZWFucyBmb3IgYSAKLSAqIDxvbD4KLSAqIDxsaT5BIGxvZyBmb3Igd3JpdGluZyBtZXNzYWdlcyB0byBhIGxvZ2dpbmcgZmFjaWxpdHksPC9saT4KLSAqIDxsaT5BIHByb2dyZXNzIG1vbml0b3IgZm9yIHJlY2VpdmluZyBwcm9ncmVzcyBpbmZvcm1hdGlvbiw8L2xpPgotICogPGxpPkEgc3RhdHVzIGhhbmRsZXIgZm9yIHJlY2VpdmluZyBhbmQgcHJvY2Vzc2luZyBzdGF0dXMgcmVwb3J0cyw8L2xpPgotICogPGxpPkEgZmFjdG9yeSBmb3IgdGhlIGhhbmRsaW5nIG9mIFVSSXMgKHJlc291cmNlcykuPC9saT4KLSAqIDwvb2w+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW52aXJvbm1lbnQKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgYSBsb2dnaW5nIGZhY2lsaXR5LgotICAgKi8KLSAgcHVibGljIExvZyBnZXRMb2cgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBwcm9ncmVzcyBtb25pdG9yLgotICAgKi8KLSAgcHVibGljIFByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBzdGF0dXMgaGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXNIYW5kbGVyIGdldFN0YXR1c0hhbmRsZXIgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBVUkkgZmFjdG9yeS4KLSAgICogSGludDogSW1wbGVtZW50ZXJzIHNob3VsZCBpbnN1cmUgdGhhdCB0aGUgRmFjdG9yeSB0aGV5IHJldHVybgotICAgKiBoYXMgYSByZWZlcmVuY2UgdG8gdGhpcyBFbnZpcm9ubWVudCBzbyB0aGF0IFVSSSBvYmplY3RzIGNhbgotICAgKiByZXBvcnQgcHJvZ3Jlc3MgYW5kIGFubm91bmNlIHN0YXR1cy4KLSAgICovCi0gIHB1YmxpYyBVUklGYWN0b3J5IGdldFVSSUZhY3RvcnkgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBjb21waWxlciBhcHByb3ByaWF0ZSB0byB0aGUgZW52aXJvbm1lbnQuCi0gICAqLwotICBwdWJsaWMgSmF2YUNvbXBpbGVyIGdldEphdmFDb21waWxlciAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBoZWxwcyBtYW5hZ2UgZXhlY3V0aW9uL3VuZG9pbmcgb2YgQ29tbWFuZHMuCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZE1hbmFnZXIgZ2V0Q29tbWFuZE1hbmFnZXIgKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vRW52aXJvbm1lbnRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9FbnZpcm9ubWVudEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzE1YjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9FbnZpcm9ubWVudEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIGZvciBjb25kaXRpb25zIHJhaXNlZCBieSB0aGUgRW52aXJvbm1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZpcm9ubWVudEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAvKioKLSAgICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM5Nzg5ODMyNzU4OTk0MDIwMzZMOwotICAKLSAgcHJvdGVjdGVkIFN0YXR1cyBzdGF0dXMgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgRW52aXJvbm1lbnRFeGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgRW52aXJvbm1lbnRFeGNlcHRpb24gKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBFbnZpcm9ubWVudEV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBFbnZpcm9ubWVudEV4Y2VwdGlvbiAoIFN0YXR1cyBzdGF0dXMgKQotICB7Ci0gICAgc3VwZXIoc3RhdHVzID09IG51bGwgPyBudWxsIDogc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgU3RhdHVzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9FdmFsdWF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0V2YWx1YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ODU5MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0V2YWx1YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotLyoqCi0gICogVGhpcyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgd2hlbiBhIGNvbmRpdGlvbmFsIG9iamVjdCBuZWVkcyB0byBiZSByZXR1cm5lZC4KLSoqLwotcHVibGljIGludGVyZmFjZSBFdmFsdWF0ZQotewotICAvKioKLSAgICAqIEByZXR1cm4gcmV0dXJucyBhbiBvYmplY3QgYmFzZWQgb24gc29tZSBldmFsdWF0ZWQgY29uZGl0aW9uLgotICAqKi8KLSAgcHVibGljIE9iamVjdCBldmFsdWF0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0phdmFDb21waWxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0phdmFDb21waWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzEwZDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9KYXZhQ29tcGlsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGFuIG9iamVjdCB0aGF0IGRvZXMgSmF2YSBjb21waWxhdGlvbgotICogb2YgYSByZXNvdXJjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQ29tcGlsZXIKLXsKLSAgLyoqCi0gICAqIENvbXBpbGVzIHRoZSBnaXZlbiBKYXZhIGZpbGUgdG8gdGhlIGdpdmVuIGNsYXNzIGZpbGUsCi0gICAqIHVzaW5nIGNvbnRleHQgaW5mb3JtYXRpb24gb24gY2xhc3NwYXRocywgb3B0aW9ucywgZXRjLgotICAgKi8KLSAgcHVibGljIHZvaWQgY29tcGlsZSAoIFVSSSBqYXZhVXJpLCBVUkkgY2xhc3NVcmksIEphdmFDb21waWxlckNvbnRleHQgY29udGV4dCApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0phdmFDb21waWxlckNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9KYXZhQ29tcGlsZXJDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzk3NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0phdmFDb21waWxlckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgZGF0YQotICogcmVxdWlyZWQgYnkgSmF2YUNvbXBpbGVyLmNvbXBpbGUoKS4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQ29tcGlsZXJDb250ZXh0Ci17Ci0gIC8vIFRCRC4uLgotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0xvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL0xvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE4YzgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9Mb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotLyoqCi0gKiBMb2cgb2JqZWN0cyBwcm92aWRlIGEgbWVhbnMgZm9yIGxvZ2dpbmcgaW5mb3JtYXRpb24gZm9yIEZGREMgZXRjLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvZwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSA0OwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgbG9nZ2luZyBpcyBlbmFibGVkLgotICAgKiBUaGVyZSBpcyBubyByZXF1aXJlbWVudCB0byBjYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSBhdHRlbXB0aW5nCi0gICAqIGEgY2FsbCB0byBvbmUgb2YgdGhlIDxjb2RlPmxvZzwvY29kZT4gbWV0aG9kcywgYXMgdGhleSB3aWxsCi0gICAqIHF1aWV0bHkgZG8gbm90aGluZyBpZiBsb2dnaW5nIGlzIGRpc2FibGVkLiBUaGlzIG1ldGhvZCBjYW4gYmUKLSAgICogdXNlZnVsLCBob3dldmVyLCBhbnl3aGVyZSB0aGUgY29zdCBvZiBidWlsZGluZyB1cCB0aGUgcGFyYW1ldGVycwotICAgKiB0byBhIGxvZyBtZXRob2QgbWlnaHQgYmUgaGlnaCBhbmQgYmVzdCBhdm9pZGVkIGV4Y2VwdCB3aGVuIGxvZ2dpbmcKLSAgICogaXMgZW5hYmxlZC4KLSAgICogQHJldHVybiBUcnVlIGlmIGxvZ2dpbmcgaXMgZW5hYmxlZCwgYW5kIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCAoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRoZSBkZWJ1ZyBvcHRpb24gaXMgc2V0IHRvIHRydWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQgKFN0cmluZyBvcHRpb24pOwotCi0gIC8qKgotICAgKiBMb2dzIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIG1lc3NhZ2VOdW0gIFRoZSBtZXNzYWdlIG51bWJlci4KLSAgICogQHBhcmFtIGNhbGxlciBUaGUgb2JqZWN0IChmb3Igbm9uLXN0YXRpYyBtZXRob2RzKSBvciBjbGFzcyAoZm9yCi0gICAqIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy4KLSAgICogQHBhcmFtIG1ldGhvZCBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLgotICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRoZSBUaHJvd2FibGUgdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nICggaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRocm93YWJsZSApOwotICAKLSAgLyoqCi0gICAqIExvZ3MgYSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+LgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LgotICAgKiBAcGFyYW0gZGVidWcgb3B0aW9uCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtIFRoZSBtZXNzYWdlIG51bWJlci4KLSAgICogQHBhcmFtIGNhbGxlciBUaGUgb2JqZWN0IChmb3Igbm9uLXN0YXRpYyBtZXRob2RzKSBvciBjbGFzcyAoZm9yCi0gICAqIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy4KLSAgICogQHBhcmFtIG1ldGhvZCBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLgotICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRoZSBUaHJvd2FibGUgdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nICggaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRocm93YWJsZSApOwotCi0gIC8qKgotICAgKiBMb2dzIGEgPGNvZGU+U3RhdHVzPC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIG1lc3NhZ2VOdW0gIFRoZSBtZXNzYWdlIG51bWJlci4KLSAgICogQHBhcmFtIGNhbGxlciBUaGUgb2JqZWN0IChmb3Igbm9uLXN0YXRpYyBtZXRob2RzKSBvciBjbGFzcyAoZm9yCi0gICAqIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy4KLSAgICogQHBhcmFtIG1ldGhvZCBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLgotICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBTdGF0dXMgdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nICggaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgU3RhdHVzIHN0YXR1cyApOwotICAKLSAgLyoqCi0gICAqIExvZ3MgYSA8Y29kZT5TdGF0dXM8L2NvZGU+LgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LgotICAgKiBAcGFyYW0gZGVidWcgb3B0aW9uCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgU3RhdHVzIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgU3RyaW5nIG9wdGlvbiwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFN0YXR1cyBzdGF0dXMgKTsKLQotICAvKioKLSAgICogTG9ncyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+LgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIE9iamVjdCB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBPYmplY3Qgb2JqZWN0ICk7Ci0gIAotICAvKioKLSAgICogTG9ncyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+LgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBsb2dnaW5nIGVudHJ5LgotICAgKiBAcGFyYW0gZGVidWcgb3B0aW9uCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIG9iamVjdCBUaGUgT2JqZWN0IHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgU3RyaW5nIG9wdGlvbiwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIE9iamVjdCBvYmplY3QgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9NZXNzYWdlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9NZXNzYWdlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2ZTYwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vTWVzc2FnZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNvbnZpZW5lbnQgd2F5IHRvIGFjY2VzcyByZXNvdXJjZSBidW5kbGVzIGFuZAotICogcmV0aWV2ZSB0cmFuc2xhdGVkIHN0cmluZ3MuCi0gKgotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VVdGlscwotewotICBwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlXzsKLSAgCi0gIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBidW5kbGVzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGJ1bmRsZUlkIHRoZSByZXNvdXJjZSBidW5kbGUgSUQuCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIGNsYXNzIGxvYWRlciBmb3IgdGhpcyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIHJldHJpZXZlCi0gICAqICAgICAgICAgICAgICAgdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlVXRpbHMoIFN0cmluZyBidW5kbGVJZCwgT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICB0aGlzKCBidW5kbGVJZCwgb2JqZWN0LmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSApOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBidW5kbGVJZCB0aGUgcmVzb3VyY2UgYnVuZGxlIElELgotICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBjbGFzcyBsb2FkZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmV0cmlldmUKLSAgICogICAgICAgICAgICAgICB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VVdGlscyggU3RyaW5nIGJ1bmRsZUlkLCBDbGFzc0xvYWRlciBsb2FkZXIgKQotICB7Ci0gICAgcmVzb3VyY2VfID0gKFJlc291cmNlQnVuZGxlKWJ1bmRsZXNfLmdldCggYnVuZGxlSWQgKTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2VfID09IG51bGwgKQotICAgIHsKLSAgICAgIHJlc291cmNlXyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSggYnVuZGxlSWQsIExvY2FsZS5nZXREZWZhdWx0KCksIGxvYWRlciApOwotICAgICAgYnVuZGxlc18ucHV0KCBidW5kbGVJZCwgcmVzb3VyY2VfICk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBmb3IgdGhlIHN0cmluZyB0byByZXRyaWV2ZS4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSB0cmFuc2xhdGVkIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXkgKQotICB7Ci0gICAgU3RyaW5nIHZhbHVlID0ga2V5OwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHZhbHVlID0gcmVzb3VyY2VfLmdldFN0cmluZygga2V5ICk7IAotICAgIH0KLSAgICBjYXRjaCggVGhyb3dhYmxlIGV4YyApCi0gICAgewotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGtleSB0aGUga2V5IGZvciB0aGUgc3RyaW5nIHRvIHJldHJpZXZlLgotICAgKiBAcGFyYW0gYXJncyBUaGVzZSBhcmd1bWVudHMgd2lsbCBiZSBzdWJzdGl0dXRlZCBpbnRvIHRoZSB0cmFuc2xhdGVkIHN0cmluZy4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSB0cmFuc2xhdGVkIHN0cmluZyB3aXRoIGFueSBzdWJzdGl0dXRpb25zLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncyApCi0gIHsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoIGdldE1lc3NhZ2Uoa2V5KSxhcmdzICk7Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vTnVsbFByb2dyZXNzTW9uaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL051bGxQcm9ncmVzc01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzllZDNhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vTnVsbFByb2dyZXNzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLS8qKgotICogIEEgUHJvZ3Jlc3NNb25pdG9yIHRoYXQgZG9lcyBub3RoaW5nLiAKLSAqLwotcHVibGljIGNsYXNzIE51bGxQcm9ncmVzc01vbml0b3IgaW1wbGVtZW50cyBQcm9ncmVzc01vbml0b3IKLXsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3IjZ2V0Q2hpbGRQcm9ncmVzc01vbml0b3IoKQotCSAqLwotCXB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0Q2hpbGRQcm9ncmVzc01vbml0b3IoKSAKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsUmVxdWVzdGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbFJlcXVlc3RlZCgpIAotCXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yI3JlcG9ydChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydChTdHJpbmcgcHJvZ3Jlc3MpIAotCXsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vTnVsbFN0YXR1c0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9OdWxsU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI0YzQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9OdWxsU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLXB1YmxpYyBjbGFzcyBOdWxsU3RhdHVzSGFuZGxlciBpbXBsZW1lbnRzIFN0YXR1c0hhbmRsZXIKLXsKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuZW52LmNvbW1vbi5TdGF0dXMsIG9yZy5lY2xpcHNlLmVudi5jb21tb24uQ2hvaWNlW10pCi0gICAqLwotICBwdWJsaWMgQ2hvaWNlIHJlcG9ydChTdGF0dXMgc3RhdHVzLCBDaG9pY2VbXSBjaG9pY2VzKSAKLSAgewotICAJQ2hvaWNlIHJlc3VsdCA9IG51bGw7Ci0gIAkKLSAgCS8vIEFsd2F5cyB0YWtlIHRoZSBmaXJzdCBjaG9pY2UgaWYgYXZhaWxhYmxlLgotICAgIGlmKCBjaG9pY2VzICE9IG51bGwgJiYgY2hvaWNlcy5sZW5ndGggPiAwICkKLSAgICB7Ci0gICAgCXJlc3VsdCA9IGNob2ljZXNbMF07Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0KFN0YXR1cyBzdGF0dXMpIHRocm93cyBTdGF0dXNFeGNlcHRpb24KLSAgewotICB9Ci0gIAotICAvKgotICAgKiBSZXBvcnQgYSB3YXJuaW5nLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydFdhcm5pbmcoU3RhdHVzIHN0YXR1cykKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoKLSAgICogUmVwb3J0IGFuZCBlcnJvci4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiByZXBvcnRFcnJvclN0YXR1cyhTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlciNyZXBvcnRFcnJvcihvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoU3RhdHVzIHN0YXR1cykKLSAgewotICAgIHJlcG9ydEVycm9yU3RhdHVzKCBzdGF0dXMgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0SW5mbyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0SW5mbyhTdGF0dXMgc3RhdHVzKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9Qcm9ncmVzc01vbml0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9Qcm9ncmVzc01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzMTUzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotcHVibGljIGludGVyZmFjZSBQcm9ncmVzc01vbml0b3IKLXsKLSAgLyoqCi0gICAqIFJlcG9ydHMgcHJvZ3Jlc3MuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnQgKCBTdHJpbmcgcHJvZ3Jlc3MgKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBwcm9ncmVzcyBtb25pdG9yIHRoYXQgd2lsbCByZWNvcmQgcHJvZ3Jlc3MKLSAgICogbWVzc2FnZXMgYXMgImNoaWxkcmVuIiBvZiB0aGUgbWVzc2FnZSBtb3N0IHJlY2VudGx5IHJlcG9ydGVkCi0gICAqIHRocnUgdGhlIHBhcmVudCBtb25pdG9yLgotICAgKi8KLSAgcHVibGljIFByb2dyZXNzTW9uaXRvciBnZXRDaGlsZFByb2dyZXNzTW9uaXRvciAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbnZpcm9ubWVudCBoYXMgcmVxdWVzdGVkIGNhbmNlbGxhdGlvbgotICAgKiBvZiB0aGUgb3BlcmF0aW9uIGluIHByb2dyZXNzLiBJdCBpcyBlbnRpcmVseSB1cCB0byBhIENvbW1hbmQKLSAgICogdG8gZGVjaWRlIGlmLCBhbmQgd2hlbiwgdG8gY29uc3VsdCB0aGlzIG1ldGhvZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsUmVxdWVzdGVkICgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1JhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwYjRhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSTsKLQotLyoqCi0gKiBDYXJyaWVzIHBvc2l0aW9uIGluZm9ybWF0aW9uIHdpdGhpbiBhIHJlc291cmNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJhbmdlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAtMTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UgdGhlIHJhbmdlIGFwcGxpZXMgdG8uCi0gICAqLwotICBwdWJsaWMgVVJJIGdldFVSSSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5kZXgsIHplcm8taW5kZXhlZCwgb2YgdGhlIGZpcnN0IGxpbmUKLSAgICogb2YgdGhlIHJhbmdlLgotICAgKi8KLSAgcHVibGljIGludCBnZXRTdGFydGluZ0xpbmVOdW1iZXIgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluZGV4LCB6ZXJvLWluZGV4ZWQsIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICogb2YgdGhlIHJhbmdlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFN0YXJ0aW5nQ2hhck51bWJlckluTGluZSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5kZXgsIHplcm8taW5kZXhlZCwgb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgotICAgKiBvZiB0aGUgcmFuZ2UgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U3RhcnRpbmdDaGFyTnVtYmVySW5VUkkgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluZGV4LCB6ZXJvLWluZGV4ZWQsIG9mIHRoZSBsYXN0IGxpbmUKLSAgICogb2YgdGhlIHJhbmdlLgotICAgKi8KLSAgcHVibGljIGludCBnZXRFbmRpbmdMaW5lTnVtYmVyICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQsIHplcm8taW5kZXhlZCwgb2YgdGhlIGxhc3QgY2hhcmFjdGVyCi0gICAqIG9mIHRoZSByYW5nZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgotICAgKi8KLSAgcHVibGljIGludCBnZXRFbmRpbmdDaGFyTnVtYmVySW5MaW5lICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbmRleCwgemVyby1pbmRleGVkLCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIKLSAgICogb2YgdGhlIHJhbmdlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEVuZGluZ0NoYXJOdW1iZXJJblVSSSAoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9SYW5nZVZlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1JhbmdlVmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMDg2ODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1JhbmdlVmVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogVGhpcyBWZWN0b3IgbWFrZXMgdGhlIHByb3RlY3RlZCBtZXRob2QgcmVtb3ZlUmFuZ2UgcHVibGljLgotICoKLSAqLwotcHVibGljIGNsYXNzIFJhbmdlVmVjdG9yIGV4dGVuZHMgVmVjdG9yCi17Ci0gIC8qKgotICAgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDA0ODc5MzQ3NjY1OTIzMDc3M0w7Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlUmFuZ2UoIGludCBzdGFydCwgaW50IGVuZCApCi0gIHsKLSAgICBzdXBlci5yZW1vdmVSYW5nZSggc3RhcnQsIGVuZCApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vU2ltcGxlU3RhdHVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vU2ltcGxlU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjM2ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1NpbXBsZVN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEEgdXN1YWxseSBzdWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mIFN0YXR1cy4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0YXR1cyBpbXBsZW1lbnRzIFN0YXR1cwotewotICAKLSAgcHJpdmF0ZSBMaXN0IGNoaWxkcmVuXyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gIHByaXZhdGUgU3RyaW5nIGlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZV87Ci0gIHByaXZhdGUgaW50IHNldmVyaXR5XzsKLSAgcHJpdmF0ZSBUaHJvd2FibGUgdGhyb3dhYmxlXzsKLQotICAvKioKLSAgICogTWV0aG9kIFNpbXBsZVN0YXR1cy4KLSAgICogQHBhcmFtIGlkCi0gICAqLwotICBwdWJsaWMgU2ltcGxlU3RhdHVzICggU3RyaW5nIGlkICkKLSAgewotICAgIHRoaXMoaWQsIiIsT0ssbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIFNpbXBsZVN0YXR1cy4KLSAgICogQHBhcmFtIGlkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzZXZlcml0eQotICAgKi8KLSAgcHVibGljIFNpbXBsZVN0YXR1cyAoIFN0cmluZyBpZCwgU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSApCi0gIHsKLSAgICB0aGlzKGlkLG1lc3NhZ2Usc2V2ZXJpdHksbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIFNpbXBsZVN0YXR1cy4KLSAgICogQHBhcmFtIGlkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqIEBwYXJhbSBjaGlsZHJlbgotICAgKi8KLSAgcHVibGljIFNpbXBsZVN0YXR1cyAoIFN0cmluZyBpZCwgU3RyaW5nIG1lc3NhZ2UsIFN0YXR1c1tdIGNoaWxkcmVuICkKLSAgewotICAgIHRoaXMoaWQsbWVzc2FnZSxPSyxudWxsKTsKLSAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgY2hpbGRyZW5fLmFkZChjaGlsZHJlbltpXSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBTaW1wbGVTdGF0dXMuCi0gICAqIEBwYXJhbSBpZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiBAcGFyYW0gc2V2ZXJpdHkKLSAgICogQHBhcmFtIHRocm93YWJsZQotICAgKi8KLSAgcHVibGljIFNpbXBsZVN0YXR1cyAoIFN0cmluZyBpZCwgU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSwgVGhyb3dhYmxlIHRocm93YWJsZSApCi0gIHsKLSAgICBpZF8gPSBpZDsKLSAgICBtZXNzYWdlXyA9IG1lc3NhZ2U7Ci0gICAgc2V2ZXJpdHlfID0gc2V2ZXJpdHk7Ci0gICAgdGhyb3dhYmxlXyA9IHRocm93YWJsZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIFN0YXR1cyNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkICgpCi0gIHsKLSAgICByZXR1cm4gaWRfOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgU3RhdHVzI2dldE1lc3NhZ2UoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlICgpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZV87Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBTdGF0dXMjZ2V0U2V2ZXJpdHkoKQotICAgKi8KLSAgcHVibGljIGludCBnZXRTZXZlcml0eSAoKQotICB7Ci0gICAgaW50IHNldmVyaXR5ID0gc2V2ZXJpdHlfOwotICAgIGlmIChjaGlsZHJlbl8uc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpID0gY2hpbGRyZW5fLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSAoU3RhdHVzKWkubmV4dCgpOwotICAgICAgICBpbnQgY2hpbGRTZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotICAgICAgICBpZiAoY2hpbGRTZXZlcml0eSA+IHNldmVyaXR5KQotICAgICAgICB7Ci0gICAgICAgICAgc2V2ZXJpdHkgPSBjaGlsZFNldmVyaXR5OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzZXZlcml0eTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIFN0YXR1cyNnZXRUaHJvd2FibGUoKQotICAgKi8KLSAgcHVibGljIFRocm93YWJsZSBnZXRUaHJvd2FibGUgKCkKLSAgewotICAgIHJldHVybiB0aHJvd2FibGVfOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgU3RhdHVzI2hhc0NoaWxkcmVuKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuICgpCi0gIHsKLSAgICByZXR1cm4gY2hpbGRyZW5fLnNpemUoKSA+IDA7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBTdGF0dXMjZ2V0Q2hpbGRyZW4oKQotICAgKi8KLSAgcHVibGljIFN0YXR1c1tdIGdldENoaWxkcmVuICgpCi0gIHsKLSAgICByZXR1cm4gKFN0YXR1c1tdKWNoaWxkcmVuXy50b0FycmF5KG5ldyBTdGF0dXNbMF0pOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgU3RhdHVzI21hdGNoZXMoaW50KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyAoIGludCBtYXNrICkKLSAgewotICAgIHJldHVybiAoZ2V0U2V2ZXJpdHkoKSB8IG1hc2spICE9IDA7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGFkZENoaWxkLgotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRDaGlsZCAoIFN0YXR1cyBzdGF0dXMgKQotICB7Ci0gICAgY2hpbGRyZW5fLmFkZChzdGF0dXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vU3RhdHVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZThhZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29tbW9uL1N0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb247Ci0KLS8qKgotICogQ2FycmllcyBzdGF0dXMgaW5mb3JtYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdHVzCi17Ci0gIC8qKgotICAgKiBTdGF0dXM6IEV2ZXJ5dGhpbmcgaXMgZmluZSwgYW5kIHRoZXJlIGFyZSBubyBtZXNzYWdlcyBvciBkZXRhaWxzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSAwOwotCi0gIC8qKgotICAgKiBTdGF0dXM6IEV2ZXJ5dGhpbmcgaXMgZmluZSwgYnV0IHRoZXJlIGlzIGluZm9ybWF0aW9uIHRvIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSAxOwotCi0gIC8qKgotICAgKiBTdGF0dXM6IFRoaW5ncyBhcmUgd29ya2luZywgYnV0IHBvc3NpYmx5IG5vdCBhcyBleHBlY3RlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSAyOwotCi0gIC8qKgotICAgKiBTdGF0dXM6IEJsYW1tby4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gNDsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5vbi10cmFuc2xhdGVkIGFwcGxpY2F0aW9uIHNwZWNpZmljIGlkZW50aWZpZXIuCi0gICAqIE1heSByZXR1cm4gbnVsbC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSB0cmFuc2xhdGVkIChsb2NhbGUtc2Vuc2l0aXZlKSBtZXNzYWdlLgotICAgKiBNYXkgcmV0dXJuIG51bGwuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNldmVyaXR5LgotICAgKi8KLSAgcHVibGljIGludCBnZXRTZXZlcml0eSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhbiBleGNlcHRpb24gKHRocm93YWJsZSkgYmVoaW5kIHRoZSBzdGF0dXMsIGlmIGFueS4KLSAgICogTWF5IHJldHVybiBudWxsLgotICAgKi8KLSAgcHVibGljIFRocm93YWJsZSBnZXRUaHJvd2FibGUgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHN0YXR1cyBvYmplY3QgaGFzIGNoaWxkIHN0YXR1cyBvYmplY3RzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4gKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGltbWVkaWF0ZSBjaGlsZCBTdGF0dXMgb2JqZWN0cyBvZiB0aGlzIG9iamVjdC4KLSAgICogTmV2ZXIgcmV0dXJucyBudWxsLCBidXQgbWF5IHJldHVybiBhIHplcm8tbGVuZ3RoIGFycmF5LgotICAgKi8KLSAgcHVibGljIFN0YXR1c1tdIGdldENoaWxkcmVuICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdGF0dXMnIHNldmVyaXR5IG1hdGNoZXMgdGhlIHNldmVyaXR5Ci0gICAqIG1hc2sgcGFzc2VkIGluLiBTdHJpY3RseSBzcGVha2luZzoKLSAgICogdGhpcy5tYXRjaGVzKHRoYXQpID09ICh0aGlzLmdldFNldmVyaXR5KCkgfCB0aGF0ICE9IDApCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzICggaW50IG1hc2sgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9TdGF0dXNFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9TdGF0dXNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1YmM2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vU3RhdHVzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBleGNlcHRpb24gY2xhc3MgdXNlZCBieSBTdGF0dXNIYW5kbGVycyB0byB0ZWxsIHRoZWlyCi0gKiBjYWxsZXJzIHRoYXQgcHJvY2Vzc2luZyBzaG91bGQgc3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFN0YXR1c0V4Y2VwdGlvbiBleHRlbmRzIEVudmlyb25tZW50RXhjZXB0aW9uCi17Ci0gIC8qKgotICAgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotICAgKiAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNjE4MTQxMTYwMzIyMTE5OTkyTDsKLQotICAvKioKLSAgICogVGhlIENob2ljZSB0aGF0IGxlYWQgdG8gdGhlIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24sCi0gICAqIGlmIGFueSAoaWUuIG1heSBiZSBudWxsKS4KLSAgICovCi0gIHByb3RlY3RlZCBDaG9pY2UgY2hvaWNlOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFN0YXR1c0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBTdGF0dXMuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzRXhjZXB0aW9uKCBTdGF0dXMgc3RhdHVzICkKLSAgewotICAgIHN1cGVyKCBzdGF0dXMgKTsgIAotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlLgotICAgKiBUaGUgQ2hvaWNlIG1heSBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIFN0YXR1c0V4Y2VwdGlvbiAoIENob2ljZSBjaG9pY2UgKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmNob2ljZSA9IGNob2ljZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFN0YXR1c0V4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBDaG9pY2UKLSAgICogYW5kIHN0YXR1cyBvYmplY3QuIFRoZSBDaG9pY2UgbWF5IGJlIG51bGwuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzRXhjZXB0aW9uICggU3RhdHVzIHN0YXR1cywgQ2hvaWNlIGNob2ljZSApCi0gIHsKLSAgICBzdXBlcihzdGF0dXMpOwotICAgIHRoaXMuY2hvaWNlID0gY2hvaWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIENob2ljZSBvYmplY3QgaW5zaWRlIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIENob2ljZSBnZXRDaG9pY2UgKCkKLSAgewotICAgIHJldHVybiBjaG9pY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9TdGF0dXNIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb21tb24vU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTRiMzEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbW1vbi9TdGF0dXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbjsKLQotLyoqCi0gKiBQcm9jZXNzZXMgc3RhdHVzIGV2ZW50cyByYWlzZWQgYnkgdGhlIGNhbGxlciBhbmQgcmV0dXJucyBhbgotICogaW5kaWNhdGlvbiBvZiBjaG9pY2VzIG1hZGUgYnkgdGhlIHJlY2lwaWVudCBvZiB0aGUgc3RhdHVzIGFuZAotICogbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBhZ2FpbnN0IHRoZSBjYWxsZXIgdG8gaGF2ZSB0aGVtIGFib3J0Ci0gKiBwcm9jZXNpbmcuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdHVzSGFuZGxlcgotewotICAvKioKLSAgICogUmVwb3J0cyB0aGUgZ2l2ZW4gU3RhdHVzIGFuZCBzZXQgb2YgcG9zc2libGUgcmVzcG9uc2VzLgotICAgKiBSZXR1cm5zIHRoZSBjaG9pY2UgbWFkZSBieSB0aGUgaGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgcmVwb3J0ICggU3RhdHVzIHN0YXR1cywgQ2hvaWNlW10gY2hvaWNlcyApOwotICAKLSAgLyoqCi0gICAqIFJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyB3aXRoIGltcGxpZWQgb3B0aW9ucyB0byBlaXRoZXIKLSAgICogY29udGludWUgb3IgYWJvcnQuCi0gICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGhhbmRsZXIgZGVjaWRlcyB0aGUgY2FsbGVyCi0gICAqIHNob3VsZCBzdG9wIHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnQgKCBTdGF0dXMgc3RhdHVzICkgdGhyb3dzIFN0YXR1c0V4Y2VwdGlvbjsKLSAgCi0gIC8qKgotICAgKiBSZXBvcnQgdGhlIGdpdmVuIEVycm9yIFN0YXR1cy4gIE5vIHVzZXIgZmVlZGJhY2sgaXMgcHJvdmlkZWQuCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKCBTdGF0dXMgc3RhdHVzICk7Ci0gIAotICAvKioKLSAgICogUmVwb3J0IHRoZSBnaXZlbiBJbmZvIFN0YXR1cy4gIE5vIHVzZXIgZmVlZGJhY2sgaXMgcHJvdmlkZWQuCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEluZm8oIFN0YXR1cyBzdGF0dXMgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2NvbnRleHQvQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29udGV4dC9Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMWM5YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29udGV4dC9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSB3YXkgdG8gZ2V0IGFuZCBzZXQgcHJlZmVyZW5jZSBpbmZvcm1hdGlvbi4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dCAKLXsKLSAvKioKLSAgKiBMb2FkcyB0aGUgcHJlZmVyZW5jZSBkYXRhIGludG8gdGhpcyBDb250ZXh0IG9iamVjdC4KLSAgKgotICAqLwotIHB1YmxpYyB2b2lkIGxvYWQoKTsKLQotIC8qKgotICAqIFNldHMgdGhlIGRlZmF1bHQgZm9yIGEgYm9vbGVhbiBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyB2b2lkIHNldERlZmF1bHQgKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKTsgCi0gCi0gLyoqCi0gICogU2V0cyB0aGUgZGVmYXVsdCBmb3IgYSBzdHJpbmcgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXREZWZhdWx0IChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKLSAKLSAvKioKLSAgKiBTZXRzIHRoZSBkZWZhdWx0IGZvciBhIGludCBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyB2b2lkIHNldERlZmF1bHQgKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOyAKLQotIC8qKgotICAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHN0cmluZyBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyB2b2lkIHNldFZhbHVlIChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKLSAKLSAvKioKLSAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBib29sZWFuIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIHZvaWQgc2V0VmFsdWUgKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKTsKLSAKLSAvKioKLSAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBpbnQgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRWYWx1ZSAoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSk7ICAgCi0KLSAvKioKLSAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgYSBzdHJpbmcgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIFN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nICggU3RyaW5nIG5hbWUpOwotIAotIC8qKgotICAqIEdldHMgdGhlIHZhbHVlIGZvciBhIGJvb2xlYW4gcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIGJvb2xlYW4gZ2V0VmFsdWVBc0Jvb2xlYW4gKCBTdHJpbmcgbmFtZSk7Ci0gCi0gLyoqCi0gICogR2V0cyB0aGUgdmFsdWUgZm9yIGEgaW50IHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyBpbnQgZ2V0VmFsdWVBc0ludCAoIFN0cmluZyBuYW1lKTsgIAkJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb250ZXh0L1Jlc291cmNlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29udGV4dC9SZXNvdXJjZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwZDdiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb250ZXh0L1Jlc291cmNlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlQ29udGV4dCAKLXsKLSAvKioKLSAgICogVGhpcyBjb25zdGFudCBzdHJpbmcgaXMgdXNlZCB0byBsb29rdXAgdGhlIG92ZXJ3cml0ZSBmaWxlcyBnZW5lcmFsIHByZWZlcmVuY2UgZnJvbQotICAgKiB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAqKi8KLSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX09WRVJXUklURSA9ICJmaWxlc092ZXJ3cml0ZSI7Ci0KLSAvKioKLSAgICogVGhpcyBjb25zdGFudCBzdHJpbmcgaXMgdXNlZCB0byBsb29rdXAgdGhlIGNyZWF0ZSBmb2xkZXJzIGdlbmVyYWwgcHJlZmVyZW5jZSBmcm9tCi0gICAqIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICoqLwotIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ1JFQVRFX0ZPTERFUlMgPSAiY3JlYXRlRm9sZGVycyI7Ci0gCi0gLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgc3RyaW5nIGlzIHVzZWQgdG8gbG9va3VwIHRoZSBjaGVja291dCBmaWxlcyBnZW5lcmFsIHByZWZlcmVuY2UgZnJvbQotICAgKiB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAqKi8KLSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NIRUNLT1VUID0gImZpbGVzQ2hlY2tvdXQiOwotCi0gLyoqCi0gICogCi0gICogQHBhcmFtIGVuYWJsZSBzZXQgd2hldGhlciBvdmVyd3JpdGluZyBvZiBmaWxlcyBpcyBlbmFibGVkLgotICAqLwotIHB1YmxpYyB2b2lkIHNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZCAoIGJvb2xlYW4gZW5hYmxlKTsKLSAKLSAvKioKLSAgKiAKLSAgKiBAcmV0dXJuIHJldHVybnMgd2hldGhlciBvdmVyd3JpdGluZyBvZiBmaWxlcyBpcyBlbmFibGVkLgotICAqLwotIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCk7Ci0gCi0gLyoqCi0gICogCi0gICogQHBhcmFtIGVuYWJsZSBzZXQgd2hldGhlciBjcmVhdGlvbiBvZiBmb2xkZXJzIGlzIGVuYWJsZWQuCi0gICovCi0gcHVibGljIHZvaWQgc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQoIGJvb2xlYW4gZW5hYmxlKTsKLSAKLSAvKioKLSAgKiAKLSAgKiBAcmV0dXJuIHJldHVybnMgd2hldGhlciBjcmVhdGlvbiBvZiBmb2xkZXJzIGlzIGVuYWJsZWQuCi0gICovCi0gcHVibGljIGJvb2xlYW4gaXNDcmVhdGVGb2xkZXJzRW5hYmxlZCgpOyAKLSAKLSAvKioKLSAgKiAKLSAgKiBAcGFyYW0gZW5hYmxlIHNldHMgd2hldGhlciBhdXRvbWF0aWMgY2hlY2tvdXQgb2YgZmlsZXMgaXMgZW5hYmxlZC4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRDaGVja291dEZpbGVzRW5hYmxlZCggYm9vbGVhbiBlbmFibGUpOwotIAotIC8qKgotICAqIAotICAqIEByZXR1cm4gcmV0dXJucyB3aGV0aGVyIGF1dG9tYXRpYyBjaGVja291dCBvZiBmaWxlcyBpcyBlbmFibGVkLgotICAqLwotIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKTsKLSAKLSAvKioKLSAgKiAKLSAgKiBAcmV0dXJuIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgUmVzb3VyY2VDb250ZXh0LgotICAqLwotIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgY29weSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29udGV4dC9SZXNvdXJjZURlZmF1bHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb250ZXh0L1Jlc291cmNlRGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJjODRiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb250ZXh0L1Jlc291cmNlRGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dDsKLQotcHVibGljIGNsYXNzIFJlc291cmNlRGVmYXVsdHMKLXsKLSBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZFUkVOQ0VfT1ZFUldSSVRFX0RFRkFVTFQgPSBmYWxzZTsKLSBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZFUkVOQ0VfQ1JFQVRFX0ZPTERFUlNfREVGQVVMVCA9IHRydWU7Ci0gcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGRVJFTkNFX0NIRUNLT1VUX0RFRkFVTFQgPSBmYWxzZTsKLQotIC8qKgotICAqIAotICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciBvdmVyd3JpdGluZyBmaWxlcy4KLSAgKi8KLSBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0T3ZlcndyaXRlRmlsZXNEZWZhdWx0ICgpCi0gewotIAlyZXR1cm4gUFJFRkVSRU5DRV9PVkVSV1JJVEVfREVGQVVMVDsKLSB9Ci0gCi0gLyoqCi0gICogCi0gICogQHJldHVybiByZXR1cm5zIHRoZSBkZWZhdWx0IHNldHRpbmcgb2ZyIGNyZWF0aW5nIGZvbGRlcnMuCi0gICovCi0gcHVibGljIHN0YXRpYyBib29sZWFuIGdldENyZWF0ZUZvbGRlcnNEZWZhdWx0ICgpCi0geyAKLQlyZXR1cm4gUFJFRkVSRU5DRV9DUkVBVEVfRk9MREVSU19ERUZBVUxUOwotIH0KLQotIC8qKgotICAqIAotICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciBjaGVja2luZyBvdXQgZmlsZXMuCi0gICovCi0gcHVibGljIHN0YXRpYyBib29sZWFuIGdldENoZWNrb3V0RmlsZXNEZWZhdWx0KCkKLSB7Ci0JcmV0dXJuIFBSRUZFUkVOQ0VfQ0hFQ0tPVVRfREVGQVVMVDsKLSB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb250ZXh0L1RyYW5zaWVudFJlc291cmNlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvY29udGV4dC9UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0NWI0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9jb250ZXh0L1RyYW5zaWVudFJlc291cmNlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIFJlc291cmNlQ29udGV4dCBpbnRlcmZhY2Ugd2hlcmUgdGhlIHN0YXRlCi0gKiBvZiB0aGUgY29udGV4dCBkYXRhIGlzIHRyYW5zaWVudC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRSZXNvdXJjZUNvbnRleHQgaW1wbGVtZW50cyBSZXNvdXJjZUNvbnRleHQgCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBvdmVyV3JpdGVGaWxlczsKLSAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUZvbGRlcnM7Ci0gIHByaXZhdGUgYm9vbGVhbiBjaGVja091dEZpbGVzOwotCi0gIHB1YmxpYyBUcmFuc2llbnRSZXNvdXJjZUNvbnRleHQoKSB7Ci0gICAgc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKFJlc291cmNlRGVmYXVsdHMuZ2V0T3ZlcndyaXRlRmlsZXNEZWZhdWx0KCkpOwotICAgIHNldENyZWF0ZUZvbGRlcnNFbmFibGVkKFJlc291cmNlRGVmYXVsdHMuZ2V0Q3JlYXRlRm9sZGVyc0RlZmF1bHQoKSk7Ci0gICAgc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoUmVzb3VyY2VEZWZhdWx0cy5nZXRDaGVja291dEZpbGVzRGVmYXVsdCgpKTsKLSAgfQotCi0gIC8qKiAgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQjc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLSAgICBvdmVyV3JpdGVGaWxlcyA9IGVuYWJsZTsKLSAgfQotICAKLSAgLyoqICAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dCNpc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpIHsKLSAgICByZXR1cm4gb3ZlcldyaXRlRmlsZXM7Ci0gIH0KLQotICAvKiogIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0I3NldENyZWF0ZUZvbGRlcnNFbmFibGVkKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDcmVhdGVGb2xkZXJzRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgIGNyZWF0ZUZvbGRlcnMgPSBlbmFibGU7Ci0gIH0KLSAgCi0gIC8qKiAgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQjaXNDcmVhdGVGb2xkZXJzRW5hYmxlZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NyZWF0ZUZvbGRlcnNFbmFibGVkKCkgewotICAgIHJldHVybiBjcmVhdGVGb2xkZXJzOwotICB9Ci0KLSAgLyoqICAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dCNzZXRDaGVja291dEZpbGVzRW5hYmxlZChib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLSAgICBjaGVja091dEZpbGVzID0gZW5hYmxlOwotICB9Ci0gIAotICAvKiogIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0I2lzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNDaGVja291dEZpbGVzRW5hYmxlZCgpIHsKLSAgICByZXR1cm4gY2hlY2tPdXRGaWxlczsKLSAgfQotICAKLSAgLyoqICAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dCNjb3B5KCkKLSAgICovCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgY29weSgpIHsKLSAgICBSZXNvdXJjZUNvbnRleHQgY2MgPSBuZXcgVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgY2Muc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKGlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkpOwotICAgIGNjLnNldENyZWF0ZUZvbGRlcnNFbmFibGVkKGlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKSk7Ci0gICAgY2Muc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoaXNDaGVja291dEZpbGVzRW5hYmxlZCgpKTsKLSAgICByZXR1cm4gY2M7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2RhdGEvRGF0YU1hcHBpbmdSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZGF0YS9EYXRhTWFwcGluZ1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjQyY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZGF0YS9EYXRhTWFwcGluZ1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGE7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YU1hcHBpbmdSZWdpc3RyeQotewotICAvKioKLSAgICogVGhpcyBtZXRob2QgYWRkcyBhIGRhdGEgbWFwcGluZyBmcm9tIGEgc291cmNlIG9iamVjdCB0byBhIHRhcmdldAotICAgKiBvYmplY3QuICBXaGVuIHRoZSBzb3VyY2VPYmplY3QgaXMgZW5jb3VudGVyZWQgYnkgdGhlIGZyYW1ld29yayB0aGUKLSAgICogc291cmNlUHJvcGVydHkgd2lsbCBiZSBjYWxsZWQgYW5kIHRoZSBkYXRhIHdpbGwgYmUgcGFzc2VkIHRvIHRoZQotICAgKiB0YXJnZXRQcm9wZXJ0eSBpbiB0aGUgdGFyZ2V0T2JqZWN0LiAgSWYgYSB0cmFuc2Zvcm1lciBvYmplY3QgaXMKLSAgICogc3BlY2lmaWVkIHRoZSBzb3VyY2VPYmplY3QgaXMgdHJhbnNmb3JtZWQgYmVmb3JlIGJlaW5nIHBhc3NlZCB0bwotICAgKiB0aGUgdGFyZ2V0IG9iamVjdC4KLSAgICogCi0gICAqIEBwYXJhbSBzb3VyY2VUeXBlICAgICAgVGhlIHNvdXJjZSBvYmplY3QuCi0gICAqIEBwYXJhbSBzb3VyY2VQcm9wZXJ0eSAgVGhlIHNvdXJjZSBwcm9wZXJ0eS4KLSAgICogQHBhcmFtIHRhcmdldFR5cGUgICAgICBUaGUgdGFyZ2V0IG9iamVjdC4KLSAgICogQHBhcmFtIHRhcmdldFByb3BlcnR5ICBUaGUgdGFyZ2V0IHByb3BlcnR5LgotICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgICAgIFRoZSB0cmFuc2Zvcm1lciBvYmplY3QgdGhhdCB0cmFuc2Zvcm1zIHRoZQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTWFwcGluZyggQ2xhc3MgICAgICAgc291cmNlVHlwZSwKLQkJCQkJCSAgU3RyaW5nICAgICAgc291cmNlUHJvcGVydHksCi0JCQkJCQkgIENsYXNzICAgICAgIHRhcmdldFR5cGUsCi0JCQkJCQkgIFN0cmluZyAgICAgIHRhcmdldFByb3BlcnR5LAotCQkJCQkJICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciApOwotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGFib3ZlIHdpdGggdGFyZ2V0UHJvcGVydHkgdGhlIHNhbWUKLSAgICogYXMgdGhlIHNvdXJjZVByb3BlcnR5IGFuZCB3aXRoIHRoZSB0cmFuc2Zvcm1lciBzZXQgdG8gbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBzb3VyY2VUeXBlICAgICBUaGUgc291cmNlIG9iamVjdC4KLSAgICogQHBhcmFtIHNvdXJjZVByb3BlcnR5IFRoZSBzb3VyY2UgcHJvcGVydHkuCi0gICAqIEBwYXJhbSB0YXJnZXRUeXBlICAgICBUaGUgdGFyZ2V0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoIENsYXNzICAgICAgIHNvdXJjZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgICAgIHNvdXJjZVByb3BlcnR5LAotCSAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICB0YXJnZXRUeXBlICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9kYXRhL1RyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9kYXRhL1RyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhODBmMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZGF0YS9UcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gdHJhbnNmb3JtIGFuIG9iamVjdCBmcm9tIG9uZSBjbGFzcyB0byBhbm90aGVyLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmFuc2Zvcm1lcgotewotICAvKgotICAgKiBAcmV0dXJuIHJldHVybnMgYSB0cmFuc2Zvcm1lZCBvYmplY3QgYmFzZWQgb24gdGhlIGlucHV0IHZhbHVlLgotICAgKi8KLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oIE9iamVjdCB2YWx1ZSApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZW52aXJvbm1lbnQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2Vudmlyb25tZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDc3NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZW52aXJvbm1lbnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgZm9yIFNpbXBsZVVSSUZhY3RvcnkKLSMKLU1TR19OVUxMX0FSR19TUEVDSUZJRUQ9TnVsbCBzcGVjaWZpZWQgYXMgYXJndW1lbnQgdG8gezB9LgotTVNHX1NDSEVNRV9OT1RfRk9VTkQ9U2NoZW1lIG5vdCBmb3VuZCBmb3IgVVJJIHswfS4KLU1TR19BQlNPTFVURV9QQVRIX1dJVEhPVVRfU0NIRU1FPUFic29sdXRlIHBhdGggc3BlY2lmaWVkIHdpdGhvdXQgYSBzY2hlbWUgZm9yIFVSSSB7MH0uCi0KLSMKLSMgQ29tbW9uIE1lc3NhZ2VzCi0jCi1NU0dfVVJJX05PVF9SRUxBVElWRT1VUkw6IHswfSBpcyBub3QgcmVsYXRpdmUuCi1NU0dfRVJST1JfVU5FWFBFQ1RFRF9FUlJPUj1JV0FCMDAxNEUgVW5leHBlY3RlZCBleGNlcHRpb24gb2NjdXJlZC4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0Fic3RyYWN0Q29tbWFuZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhM2U0MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0KLS8qKgotICAqIFRoaXMgY2xhc3MgaXMgdXNlZCBhcyB0aGUgYmFzZSBjbGFzcyBmb3Igb3RoZXIgc3RhbmRhcmQgZnJhZ21lbnQgY2xhc3Nlcy4KLSAgKiAKLSoqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50IGltcGxlbWVudHMgQ29tbWFuZEZyYWdtZW50Ci17Ci0gIHByaXZhdGUgQ29tbWFuZEZhY3RvcnkgY29tbWFuZEZhY3RvcnlfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgIGlkXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICBkb05vdFJ1bkluVHJhbnNhY3Rpb25fID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENvcHkgY29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSBmcmFnbWVudAotICAgKi8KLSAgcHJvdGVjdGVkIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50KCBBYnN0cmFjdENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICBjb21tYW5kRmFjdG9yeV8gPSBmcmFnbWVudC5jb21tYW5kRmFjdG9yeV87Ci0gICAgaWRfICAgICAgICAgICAgID0gZnJhZ21lbnQuaWRfOwotICB9Ci0gIAotICAvKioKLSAgICAqIENyZWF0ZXMgYSBuZXcgQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQuCi0gICAgKgotICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGV4ZWN1dGFibGUgY29tbWFuZCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgKiovCi0gIHB1YmxpYyBBYnN0cmFjdENvbW1hbmRGcmFnbWVudCggQ29tbWFuZEZhY3RvcnkgY29tbWFuZEZhY3RvcnksIFN0cmluZyBpZCApCi0gIHsKLSAgICBjb21tYW5kRmFjdG9yeV8gPSBjb21tYW5kRmFjdG9yeTsgIAotICAgIGlkXyAgICAgID0gaWQ7Ci0gIH0gCi0gIAotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiBpZF87Ci0gIH0KLSAgIAotICBwdWJsaWMgdm9pZCBzZXRJZCggU3RyaW5nIGlkICkKLSAgewotICAgIGlkXyA9IGlkOyAKLSAgfQotICAKLSAgLyoqIAotICAgICogR2V0cyBleGVjdXRhYmxlIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICAqIG51bGwgd2hlbiB0aGVyZSBpcyBubyBmaXJzdCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRmFjdG9yeSBnZXRDb21tYW5kRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gY29tbWFuZEZhY3RvcnlfOwotICB9Ci0gIAotICAvKioKLSAgICogIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCByZXRyaWV2ZSB0aGUgZGF0YSBtYXBwaW5ncyBmb3IgdGhpcyBjb21tYW5kIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoIERhdGFNYXBwaW5nUmVnaXN0cnkgcmVnaXN0cnkgKQotICB7Ci0gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIG5vdCB0byBhZGQgYW55IGVudHJpZXMgdG8gdGhlIHJlZ2lzdHJ5LgotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gSWYgdGhlIGNvbW1hbmRzIGZvciB0aGlzIGZyYWdtZW50IHNob3VsZCBub3QgYmUgcnVuIHdpdGhpbiBhIHRyYW5zYWN0aW9uIHRoZW4KLSAgICogdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0cnVlLiAgSWYgdGhlIGZyYWdtZW50IGRvZXMgbm90IGNhcmUgaWYgaXQgaXMgcnVuIGluIGEgdHJhbnNhY3Rpb24KLSAgICogb3Igbm90IGl0IHNob3VsZCByZXR1cm4gZmFsc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBkb05vdFJ1bkluVHJhbnNhY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIGRvTm90UnVuSW5UcmFuc2FjdGlvbl87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBydW4gaW4gdHJhbnNhY3Rpb24gcHJvcGVydHkuCi0gICAqIEBwYXJhbSBkb05vdFJ1bkluVHJhbnNhY3Rpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERvTm90UnVuSW5UcmFuc2FjdGlvbiggYm9vbGVhbiBkb05vdFJ1bkluVHJhbnNhY3Rpb24gKQotICB7Ci0gICAgZG9Ob3RSdW5JblRyYW5zYWN0aW9uXyA9IGRvTm90UnVuSW5UcmFuc2FjdGlvbjsKLSAgfQotICAKLSAgLyoqCi0gICAgKiBBbGwgZnJhZ21lbnRzIG5lZWQgdG8gYmUgY2xvbmVhYmxlLgotICAqKi8KLSAgYWJzdHJhY3QgcHVibGljIE9iamVjdCBjbG9uZSgpOyAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQm9vbGVhbkZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Cb29sZWFuRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiZGE4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Cb29sZWFuRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLQotCi0vKioKLSAgKiBUaGlzIGNsYXNzIHJldHVybnMgZWl0aGVyIHRoZSB0cnVlIGZyYWdtZW50IG9yIHRoZSBmYWxzZSBmcmFnbWVudAotICAqIGJhc2VkIG9uIHRoZSByZXNwb25zZSBmcm9tIHRoZSBjb25kaXRpb24gb2JqZWN0LgotKiovCi1wdWJsaWMgY2xhc3MgQm9vbGVhbkZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBDb21tYW5kRnJhZ21lbnQgdHJ1ZUZyYWdtZW50XzsKLSAgcHJpdmF0ZSBDb21tYW5kRnJhZ21lbnQgZmFsc2VGcmFnbWVudF87Ci0gIHByaXZhdGUgQ29uZGl0aW9uICAgICAgIGNvbmRpdGlvbl87Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIEJvb2xlYW5GcmFnbWVudCB3aXRoIGRlZmF1bHQgdmFsdWVzLgotICAgKgotICAgKi8KLSAgcHVibGljIEJvb2xlYW5GcmFnbWVudCgpCi0gIHsKLSAgICB0aGlzKCBudWxsLCBudWxsLCBuZXcgQ29uZGl0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIH0sIAotICAgICAgICAgICAgICAgICAgICAgIG51bGwsICIiICk7ICAKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gdHJ1ZUZyYWdtZW50ICBUaGUgZnJhZ21lbnQgY2hvc2VuIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4KLSAgICogQHBhcmFtIGZhbHNlRnJhZ21lbnQgVGhlIGZyYWdtZW50IGNob3NlbiBpZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLgotICAgKiBAcGFyYW0gY29uZGl0aW9uICAgICBUaGUgY29uZGl0aW9uLgotICAgKi8KLSAgcHVibGljIEJvb2xlYW5GcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IHRydWVGcmFnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZEZyYWdtZW50IGZhbHNlRnJhZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbiAgICAgICBjb25kaXRpb24gKQotICB7Ci0gICAgdGhpcyggdHJ1ZUZyYWdtZW50LCBmYWxzZUZyYWdtZW50LCBjb25kaXRpb24sIG51bGwsICIiICk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIC8qKgotICAgICogQ3JlYXRlcyBhIG5ldyBCb29sZWFuRnJhZ21lbnQuCi0gICAgKgotICAgICogQHBhcmFtIHRydWVGcmFnbWVudCByZXR1cm5lZCBpZiBjb25kaXRpb24gaXMgdHJ1ZS4KLSAgICAqIEBwYXJhbSBmYWxzZUZyYWdtZW50IHJldHVybmVkIGlmIGNvbmRpdGlvbiBpcyBmYWxzZS4KLSAgICAqIEBwYXJhbSBjb25kaXRpb24gdGhlIGNvbmRpdGlvbiBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSBjb25kaXRpb24uCi0gICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgZXhlY3RhYmxlIGNvbW1hbmQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICoqLwotICBwdWJsaWMgQm9vbGVhbkZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgIHRydWVGcmFnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRGcmFnbWVudCBmYWxzZUZyYWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgIGNvbmRpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRGYWN0b3J5ICBjb21tYW5kRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgICAgICAgICBpZCApCi0gIHsKLSAgICBzdXBlciggY29tbWFuZEZhY3RvcnksIGlkICk7Ci0KLSAgICB0cnVlRnJhZ21lbnRfICAgICAgID0gdHJ1ZUZyYWdtZW50OwotICAgIGZhbHNlRnJhZ21lbnRfICAgICAgPSBmYWxzZUZyYWdtZW50OwotICAgIGNvbmRpdGlvbl8gICAgICAgICAgPSBjb25kaXRpb247IAotICB9Ci0KLSAgLyoqCi0gICAqIENvcHkgY29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSBmcmFnCi0gICAqLwotICBwcm90ZWN0ZWQgQm9vbGVhbkZyYWdtZW50KCBCb29sZWFuRnJhZ21lbnQgZnJhZyApCi0gIHsKLSAgICB0aGlzKCBudWxsLAotICAgIAkgIG51bGwsCi0gICAgCSAgZnJhZy5jb25kaXRpb25fLAotICAgIAkgIGZyYWcuZ2V0Q29tbWFuZEZhY3RvcnkoKSwKLSAgICAJICBmcmFnLmdldElkKCkgKTsKLQotICAgIC8vIE5vdyB3ZSBoYXZlIHRvIGNsb25lIGluIHRoZSB0cnVlIGFuZCBmYWxzZQotICAgIC8vIGZyYWdtZW50cy4KLSAgICB0cnVlRnJhZ21lbnRfICA9IChDb21tYW5kRnJhZ21lbnQpdHJ1ZUZyYWdtZW50Xy5jbG9uZSgpOwotICAgIGZhbHNlRnJhZ21lbnRfID0gKENvbW1hbmRGcmFnbWVudClmYWxzZUZyYWdtZW50Xy5jbG9uZSgpOwotICB9Ci0gIAotICAvKioKLSAgICAqIE1ha2VzIGEgY29weSBvZiB0aGUgQ29tbWFuZEZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBmcmFnbWVudC4KLSAgKiovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuRnJhZ21lbnQoIHRoaXMgKTsKLSAgfQotCi0gIC8qKiAKLSAgICAqIEdldHMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAgKiBudWxsIHdoZW4gdGhlcmUgaXMgbm8gZmlyc3QgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldEZpcnN0U3ViRnJhZ21lbnQoKQotICB7ICAgIAotICAgIHJldHVybiBjb25kaXRpb25fLmV2YWx1YXRlKCkgPyB0cnVlRnJhZ21lbnRfIDogZmFsc2VGcmFnbWVudF87Ci0gIH0KLSAgCi0gIC8qKgotICAgICogR2V0cyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zIG51bGwKLSAgICAqIHdoZW4gdGhlcmUgaXMgbm8gbmV4dCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0TmV4dFN1YkZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb25kaXRpb24uCi0gICAqIEBwYXJhbSBjb25kaXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbmRpdGlvbiggQ29uZGl0aW9uIGNvbmRpdGlvbiApCi0gIHsKLSAgICBjb25kaXRpb25fID0gY29uZGl0aW9uOyAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIHRydWUgZnJhZ21lbnQuCi0gICAqIEBwYXJhbSBmcmFnbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHJ1ZUZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgdHJ1ZUZyYWdtZW50XyA9IGZyYWdtZW50OwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgZmFsc2UgZnJhZ21lbnQuCi0gICAqIEBwYXJhbSBmcmFnbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmFsc2VGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIGZhbHNlRnJhZ21lbnRfID0gZnJhZ21lbnQ7Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9DaG9pY2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQ2hvaWNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVmODBmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9DaG9pY2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FdmFsdWF0ZTsKLQotCi0vKioKLSAgKiBUaGlzIGNsYXNzIHJldHVybnMgYSBmcmFnbWVudCBmcm9tIGEgbGlzdCBvZiBmcmFnbWVudHMgYmFzZWQKLSAgKiBvbiB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIEV2YWx1YXRlIG9iamVjdC4KLSoqLwotcHVibGljIGNsYXNzIENob2ljZUZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQgCi17Ci0gIHByaXZhdGUgSGFzaHRhYmxlICAgICAgZnJhZ21lbnRUYWJsZV87Ci0gIHByaXZhdGUgRXZhbHVhdGUgICAgICAgZXZhbHVhdGVfOwotCi0gIC8qKgotICAgICogQ3JlYXRlIGEgY2xvbmUgd2l0aCBuZXcgYSBuZXcgaGFzaHRhYmxlLgotICAqKi8KLSAgcHJvdGVjdGVkIENob2ljZUZyYWdtZW50KCBDaG9pY2VGcmFnbWVudCBmcmFnICkKLSAgewotICAgIHN1cGVyKCBmcmFnLmdldENvbW1hbmRGYWN0b3J5KCksIGZyYWcuZ2V0SWQoKSApOwotICAgIAotICAgIGV2YWx1YXRlXyAgICAgID0gZnJhZy5ldmFsdWF0ZV87Ci0gICAgZnJhZ21lbnRUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAKLSAgICBFbnVtZXJhdGlvbiBrZXlzID0gZnJhZy5mcmFnbWVudFRhYmxlXy5rZXlzKCk7Ci0KLSAgICAvLyBDbG9uZSB0aGUgZnJhZ21lbnRzIGluIHRoZSB0YWJsZS4KLSAgICB3aGlsZSgga2V5cy5oYXNNb3JlRWxlbWVudHMoKSApCi0gICAgewotICAgICAgT2JqZWN0IGtleSA9IGtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgIGZyYWdtZW50VGFibGVfLnB1dCgga2V5LCAoKENvbW1hbmRGcmFnbWVudClmcmFnLmZyYWdtZW50VGFibGVfLmdldChrZXkpKS5jbG9uZSgpICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgQ2hvaWNlRnJhZ21lbnQoIE9iamVjdFtdICAgICAgICAgIGtleXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZEZyYWdtZW50W10gZnJhZ21lbnRzICkKLSAgewotICAJdGhpcygga2V5cywgZnJhZ21lbnRzLCBudWxsLCBudWxsLCAiIiApOyAgICAKLSAgfQotICAKLSAgcHVibGljIENob2ljZUZyYWdtZW50KCBPYmplY3RbXSAgICAgICAgICBrZXlzLAotICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRGcmFnbWVudFtdIGZyYWdtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBFdmFsdWF0ZSAgICAgICAgICBldmFsdWF0ZSApCi0gIHsKLSAgCXRoaXMoIGtleXMsIGZyYWdtZW50cywgZXZhbHVhdGUsIG51bGwsICIiICk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRFdmFsdWF0ZSggRXZhbHVhdGUgZXZhbHVhdGUgKQotICB7Ci0gICAgZXZhbHVhdGVfID0gZXZhbHVhdGU7ICAKLSAgfQotICAKLSAgLyoqCi0gICAgKiBDb25zdHJ1Y3RzIGEgY2hvaWNlIGZyYWdtZW50LiAgVGhlIGtleSBhdCBpbmRleCBYIGlzIG1hcHBlZCB0byAKLSAgICAqIHRvIHRoZSBmcmFnbWVudCBhdCBpbmRleCBYLgotICAgICoKLSAgICAqIEBwYXJhbSBrZXlzIHRoZXNlIGtleXMgbXVzdCBiZSB1bmlxdWUgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZXF1YWxzIG1ldGhvZC4KLSAgICAqIFRoZXkgYXJlIHVzZWQgdG8gaWRlbnRpZnkgd2hpY2ggZnJhZ21lbnQgdG8gcmV0dXJuLgotICAgICogQHBhcmFtIGZyYWdtZW50cyB0aGVzZSBhcmUgdGhlIGZyYWdtZW50cyB0byBiZSByZXR1cm5lZC4gIE51bGwgaXMgbm90IGFsbG93ZWQKLSAgICAqIGFzIGFuIGVudHJ5IGluIHRoZSBhcnJheS4KLSAgICAqIEBwYXJhbSBldmFsdWF0ZSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZXZhbHVhdGUgb2JqZWN0IGlzIHVzZWQKLSAgICAqIGFzIHRoZSBrZXkgdG8gbG9jYXRlIGEgZnJhZ21lbnQuCi0gICAgKiBAcGFyYW0gc3RhdGUgdGhlIHN0YXRlIHBhc3NlZCB0byBldmFsdWF0ZS4KLSAgKiovCi0gIHB1YmxpYyBDaG9pY2VGcmFnbWVudCggT2JqZWN0W10gICAgICAgICAga2V5cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kRnJhZ21lbnRbXSBmcmFnbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRXZhbHVhdGUgICAgICAgICAgZXZhbHVhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZEZhY3RvcnkgICAgY29tbWFuZEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgICAgaWQgKQotICB7Ci0gICAgc3VwZXIoIGNvbW1hbmRGYWN0b3J5LCBpZCApOwotCi0gICAgZXZhbHVhdGVfICAgICAgPSBldmFsdWF0ZTsKLSAgICBmcmFnbWVudFRhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIGlmKCBrZXlzID09IG51bGwgfHwgZnJhZ21lbnRzID09IG51bGwgfHwga2V5cy5sZW5ndGggIT0gZnJhZ21lbnRzLmxlbmd0aCApCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkJhZCBrZXlzIG9yIGZyYWdtZW50cy4iICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBDcmVhdGUgdGhlIGZyYWdtZW50IHRhYmxlLgotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGtleXMubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgZnJhZ21lbnRUYWJsZV8ucHV0KCBrZXlzW2luZGV4XSwgZnJhZ21lbnRzW2luZGV4XSApOwotICAgICAgfSAgICAgCi0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICAqIE1ha2VzIGEgY29weSBvZiB0aGUgQ29tbWFuZEZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBmcmFnbWVudC4KLSAgKiovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBDaG9pY2VGcmFnbWVudCggdGhpcyApOwotICB9Ci0gIAotICAvKiogCi0gICAgKiBHZXRzIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucwotICAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXRGaXJzdFN1YkZyYWdtZW50KCkKLSAgeyAgICAKLSAgICBPYmplY3Qga2V5ICAgICAgICAgICAgICA9IGV2YWx1YXRlXy5ldmFsdWF0ZSgpOwotICAgIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCA9IChDb21tYW5kRnJhZ21lbnQpZnJhZ21lbnRUYWJsZV8uZ2V0KGtleSk7Ci0KLSAgICBpZiggZnJhZ21lbnQgPT0gbnVsbCApCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIktleSBub3QgZm91bmQgaW4gdGFibGUuIEtleT0iICsga2V5ICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZyYWdtZW50OwotICB9Ci0gIAotICAvKioKLSAgICAqIEdldHMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucyBudWxsCi0gICAgKiB3aGVuIHRoZXJlIGlzIG5vIG5leHQgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldE5leHRTdWJGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRmFjdG9yeUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRmFjdG9yeUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3N2JmMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZhY3RvcnlGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5JQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21tYW5kRmFjdG9yeUZyYWdtZW50IGltcGxlbWVudHMgQ29tbWFuZEZyYWdtZW50IAotewotICBwcml2YXRlIFZlY3RvciBjb21tYW5kc187Ci0gIAotICAvKioKLSAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIHJldHVybgotICAgKiBhbiBDb21tYW5kRmFjdG9yeS4KLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBnZXRJQ29tbWFuZEZhY3RvcnkoKTsKLSAgCi0gIC8qKgotICAgKiBBbGwgd2l6YXJkIGZyYWdtZW50cyBuZWVkIHRvIGJlIGNsb25lYWJsZS4KLSAgKiovCi0gIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgY2xvbmUoKTsKLSAgCi0gIHByb3RlY3RlZCBDb21tYW5kRmFjdG9yeUZyYWdtZW50KCBDb21tYW5kRmFjdG9yeUZyYWdtZW50IGZyYWcgKQotICB7Ci0gICAgY29tbWFuZHNfID0gZnJhZy5jb21tYW5kc187ICAKLSAgfQotICAKLSAgcHVibGljIENvbW1hbmRGYWN0b3J5RnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiBSZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotICAKLSAgLyoqIAotICAgICogR2V0cyBleGVjdXRhYmxlIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICAqIG51bGwgd2hlbiB0aGVyZSBpcyBubyBmaXJzdCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRmFjdG9yeSBnZXRDb21tYW5kRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKiAKLSAgICAqIEdldHMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAgKiBudWxsIHdoZW4gdGhlcmUgaXMgbm8gZmlyc3QgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldEZpcnN0U3ViRnJhZ21lbnQoKQotICB7Ci0JQ29tbWFuZEZyYWdtZW50IHJlc3VsdCA9IG51bGw7Ci0JCi0gICAgY29tbWFuZHNfID0gY3JlYXRlQ29tbWFuZHMoKTsJCi0KLQlpZiggY29tbWFuZHNfLnNpemUoKSA+IDAgKQotCXsKLQkgIHJlc3VsdCA9IChDaGlsZEZyYWdtZW50KWNvbW1hbmRzXy5lbGVtZW50QXQoMCk7Ci0JfQotCQotCXJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICAqIEdldHMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucyBudWxsCi0gICAgKiB3aGVuIHRoZXJlIGlzIG5vIG5leHQgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldE5leHRTdWJGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotCUNvbW1hbmRGcmFnbWVudCByZXN1bHQgPSBudWxsOwotCQkKLQlpZiggY29tbWFuZHNfICE9IG51bGwgJiYgZnJhZ21lbnQgaW5zdGFuY2VvZiBDaGlsZEZyYWdtZW50ICkgCi0JewotCSAgQ2hpbGRGcmFnbWVudCBjaGlsZCA9IChDaGlsZEZyYWdtZW50KWZyYWdtZW50OwotCSAgCi0JICBpbnQgaW5kZXggPSBjaGlsZC5pbmRleF87Ci0JCi0gICAgICBpZiggaW5kZXggIT0gLTEgKQotCSAgewotCSAgICBpbmRleCsrOwotCSAgCi0JICAgIGlmKCBpbmRleCA8IGNvbW1hbmRzXy5zaXplKCkgKQotCQl7Ci0JCSAgcmVzdWx0ID0gKENvbW1hbmRGcmFnbWVudCljb21tYW5kc18uZWxlbWVudEF0KCBpbmRleCApOwotCQl9Ci0JICB9Ci0JfQotCQotCXJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgZGF0YSBtYXBwaW5ncyBmb3IgdGhpcyBjb21tYW5kIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoIERhdGFNYXBwaW5nUmVnaXN0cnkgcmVnaXN0cnkgKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gSWYgdGhlIGNvbW1hbmRzIGZvciB0aGlzIGZyYWdtZW50IHNob3VsZCBub3QgYmUgcnVuIHdpdGhpbiBhIHRyYW5zYWN0aW9uIHRoZW4KLSAgICogdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0cnVlLiAgSWYgdGhlIGZyYWdtZW50IGRvZXMgbm90IGNhcmUgaWYgaXQgaXMgcnVuIGluIGEgdHJhbnNhY3Rpb24KLSAgICogb3Igbm90IGl0IHNob3VsZCByZXR1cm4gZmFsc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBkb05vdFJ1bkluVHJhbnNhY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAKLSAgCi0gIHByaXZhdGUgVmVjdG9yIGNyZWF0ZUNvbW1hbmRzKCkKLSAgewotCVZlY3RvciAgICAgICAgICBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQlJQ29tbWFuZEZhY3RvcnkgZmFjdG9yeSAgPSBnZXRJQ29tbWFuZEZhY3RvcnkoKTsKLQlpbnQgICAgICAgICAgICAgaW5kZXggICAgPSAwOwotCQkgIAotCXdoaWxlKCBmYWN0b3J5ICE9IG51bGwgJiYgZmFjdG9yeS5oYXNOZXh0KCkgKQotCXsKLQkgIENvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKWZhY3RvcnkuZ2V0TmV4dENvbW1hbmQoKTsKLQkJCQotCSAgY29tbWFuZHMuYWRkKCBuZXcgQ2hpbGRGcmFnbWVudCggY29tbWFuZCwgaW5kZXgrKyApICk7Ci0JfQotCQotCXJldHVybiBjb21tYW5kczsKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBDaGlsZEZyYWdtZW50IGV4dGVuZHMgU2ltcGxlRnJhZ21lbnQKLSAgewotCWludCBpbmRleF87Ci0JCi0JcHVibGljIENoaWxkRnJhZ21lbnQoIENvbW1hbmQgY29tbWFuZCwgaW50IGluZGV4ICkKLQl7Ci0JICBzdXBlciggY29tbWFuZCwgY29tbWFuZC5nZXRDbGFzcygpLmdldE5hbWUoKSApOwotCSAgaW5kZXhfID0gaW5kZXg7Ci0JfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGZlMDZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLQotCi0vKioKLSAgKiBUaGlzIGludGVyZmFjZSBkZXNjcmliZXMgYSBsaXN0IG9mIGludGVycnVwdGFibGUgY29tbWFuZHMuICBUaGUKLSAgKiBvcmRlciBvZiB0aGlzIGxpc3Qgb2YgY29tbWFuZHMgaXMgZGVmaW5lZCBieSB0aGUgZ2V0Rmlyc3RTdWJGcmFnbWVudCBhbmQKLSAgKiBnZXROZXh0U3ViRnJhZ21lbnQgbWV0aG9kcy4KLSoqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBDbG9uZWFibGUKLXsgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiBSZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0gIAotICAvKiogCi0gICAgKiBHZXRzIGV4ZWN1dGFibGUgY29tbWFuZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucwotICAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGYWN0b3J5IGdldENvbW1hbmRGYWN0b3J5KCk7Ci0KLSAgLyoqIAotICAgICogR2V0cyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICAqIG51bGwgd2hlbiB0aGVyZSBpcyBubyBmaXJzdCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0Rmlyc3RTdWJGcmFnbWVudCgpOwotCi0gIC8qKgotICAgICogR2V0cyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zIG51bGwKLSAgICAqIHdoZW4gdGhlcmUgaXMgbm8gbmV4dCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0TmV4dFN1YkZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKTsKLSAgCi0gIC8qCi0gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgZGF0YSBtYXBwaW5ncyBmb3IgdGhpcyBjb21tYW5kIGZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoIERhdGFNYXBwaW5nUmVnaXN0cnkgcmVnaXN0cnkgKTsKLQotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gSWYgdGhlIGNvbW1hbmRzIGZvciB0aGlzIGZyYWdtZW50IHNob3VsZCBub3QgYmUgcnVuIHdpdGhpbiBhIHRyYW5zYWN0aW9uIHRoZW4KLSAgICogdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0cnVlLiAgSWYgdGhlIGZyYWdtZW50IGRvZXMgbm90IGNhcmUgaWYgaXQgaXMgcnVuIGluIGEgdHJhbnNhY3Rpb24KLSAgICogb3Igbm90IGl0IHNob3VsZCByZXR1cm4gZmFsc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBkb05vdFJ1bkluVHJhbnNhY3Rpb24oKTsKLSAgCi0gIC8qKgotICAgICogQWxsIHdpemFyZCBmcmFnbWVudHMgbmVlZCB0byBiZSBjbG9uZWFibGUuCi0gICoqLwotICBwdWJsaWMgT2JqZWN0IGNsb25lKCk7ICAKLX0gIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZyYWdtZW50RW5naW5lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRnJhZ21lbnRFbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZkMGY3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRnJhZ21lbnRFbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhRmxvd01hbmFnZXI7Ci0KLQotCi0vKioKLSAqIFRoZSBDb21tYW5kRnJhZ21lbnRFbmdpbmUgcHJvdmlkZXMgYSBjb252aWVuZW50IHdheSB0byB0cmF2ZXJzZSBDb21tYW5kRnJhZ21lbnRzCi0gKiBhbmQgcG9zc2libGl0eSBleGVjdXRlIGl0cyBhc3NvY2lhdGUgQ29tbWFuZC4KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRGcmFnbWVudEVuZ2luZSBpbXBsZW1lbnRzIENvbW1hbmRNYW5hZ2VyCi17Ci0gIHByaXZhdGUgU3RhY2sgICAgICAgICAgICBjb21tYW5kU3RhY2tfOwotICBwcml2YXRlIEZyYWdtZW50TGlzdGVuZXIgdW5kb0ZyYWdtZW50TGlzdGVuZXJfOwotICBwcml2YXRlIEZyYWdtZW50TGlzdGVuZXIgbmV4dEZyYWdtZW50TGlzdGVuZXJfOwotICBwcml2YXRlIEZyYWdtZW50TGlzdGVuZXIgcGVla0ZyYWdtZW50TGlzdGVuZXJfOwotICBwcml2YXRlIERhdGFGbG93TWFuYWdlciAgZGF0YU1hbmFnZXJfOwotICBwcml2YXRlIEVudmlyb25tZW50ICAgICAgZW52aXJvbm1lbnRfOwotICBwcml2YXRlIFN0YXR1cyAgICAgICAgICAgbGFzdFN0YXR1c187Ci0gIAotICAvKioKLSAgICogQ3JlYXRlcyBhIENvbW1hbmRGcmFnbWVudEVuZ2luZS4KLSAgICogCi0gICAqIEBwYXJhbSBzdGFydEZyYWdtZW50IHRoZSByb290IGZyYWdtZW50IHdoZXJlIHRyYXZlcnNhbCB3aWxsIGJlZ2luLgotICAgKiBAcGFyYW0gZGF0YU1hbmFnZXIgdGhlIGRhdGEgbWFuYWdlciBjb250YWluaW5nIGFsbCBvZiB0aGUgZGF0YSBtYXBwaW5ncy4KLSAgICogQHBhcmFtIGVudmlyb25tZW50IHRoZSBlbnZpcm9ubWVudC4KLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRFbmdpbmUoIENvbW1hbmRGcmFnbWVudCBzdGFydEZyYWdtZW50LCBEYXRhRmxvd01hbmFnZXIgZGF0YU1hbmFnZXIsIEVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAJU2VxdWVuY2VGcmFnbWVudCByb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgCXJvb3QuYWRkKCBzdGFydEZyYWdtZW50ICk7Ci0gIAkgIAkKLSAgCWNvbW1hbmRTdGFja18gPSBuZXcgU3RhY2soKTsKLSAgCQotICAJYWRkVG9TdGFjayggcm9vdCwgLTEgKTsKLSAgCWFkZFRvU3RhY2soIHN0YXJ0RnJhZ21lbnQsIDAgKTsKLSAgCQotICAJZGF0YU1hbmFnZXJfID0gZGF0YU1hbmFnZXI7Ci0gIAllbnZpcm9ubWVudF8gPSBlbnZpcm9ubWVudDsKLSAgfSAKLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIERhdGEgbWFwcGluZyByZWdpc3RyeS4KLSAgICovCi0gIHB1YmxpYyBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGdldE1hcHBpbmdSZWdpc3RyeSgpCi0gIHsKLQlyZXR1cm4gZGF0YU1hbmFnZXJfLmdldE1hcHBpbmdSZWdpc3RyeSgpOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gdGhlIFN0YXR1cyBmcm9tIHRoZSBsYXN0IENvbW1hbmQgZXhlY3V0ZWQuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldExhc3RTdGF0dXMoKQotICB7Ci0gICAgcmV0dXJuIGxhc3RTdGF0dXNfOwotICB9Ci0gIAotICAvKioKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb0VuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBuZXh0IGZyYWdtZW50IGxpc3RlbmVyIGZvciB0aGlzIGVuZ2luZS4gIFRoaXMgbGlzdGVuZXIgd2lsbCBiZQotICAgKiBjYWxsZWQgZm9yIGVhY2ggZnJhZ21lbnQgdGhhdCBpcyB0cmF2ZXJzZWQgaW4gbW92ZUZvcndhcmRUb05leHRTdG9wIG9wZXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgZnJhZ21lbnQgbGlzdGVuZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROZXh0RnJhZ21lbnRMaXN0ZW5lciggRnJhZ21lbnRMaXN0ZW5lciBsaXN0ZW5lciApCi0gIHsKLSAgICBuZXh0RnJhZ21lbnRMaXN0ZW5lcl8gPSBsaXN0ZW5lcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIG5leHQgZnJhZ21lbnQgbGlzdGVuZXIgZm9yIHRoaXMgZW5naW5lLiAgVGhpcyBsaXN0ZW5lciB3aWxsIGJlCi0gICAqIGNhbGxlZCBmb3IgZWFjaCBmcmFnbWVudCB0aGF0IGlzIHRyYXZlcnNlZCBpbiBwZWVrRm9yd2FyZFRvTmV4dFN0b3Agb3BlcmF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBmcmFnbWVudCBsaXN0ZW5lci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBlZWtGcmFnbWVudExpc3RlbmVyKCBGcmFnbWVudExpc3RlbmVyIGxpc3RlbmVyICkKLSAgewotICAgIHBlZWtGcmFnbWVudExpc3RlbmVyXyA9IGxpc3RlbmVyOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgcGVlayBmcmFnbWVudCBsaXN0ZW5lciBmb3IgdGhpcyBlbmdpbmUuICBUaGlzIGxpc3RlbmVyIHdpbGwgYmUKLSAgICogY2FsbGVkIGZvciBlYWNoIGZyYWdtZW50IHRoYXQgaXMgdHJhdmVyc2VkIGluIHVuZG9Ub0xhc3RTdG9wIG9wZXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgZnJhZ21lbnQgbGlzdGVuZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVbmRvRnJhZ21lbnRMaXN0ZW5lciggRnJhZ21lbnRMaXN0ZW5lciBsaXN0ZW5lciApCi0gIHsKLSAgICB1bmRvRnJhZ21lbnRMaXN0ZW5lcl8gPSBsaXN0ZW5lcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRyYXZlcnNlIHRoZSBDb21tYW5kRnJhZ21lbnRzIHN0YXJ0aW5nIHdpdGggdGhlIENvbW1hbmRGcmFnbWVudCBvbiB0aGUKLSAgICogdG9wIG9mIHRoZSBjb21tYW5kIGZyYWdtZW50IHN0YWNrLiAgVGhlIG9wZXJhdGlvbiBkb2VzIE5PVCBjaGFuZ2UgdGhlCi0gICAqIGNvbW1hbmQgZnJhZ21lbnQgc3RhY2sgYW5kIGRvZXMgbm90IGV4ZWN1dGUgYW55IGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoCi0gICAqIGEgQ29tbWFuZEZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcGVla0ZvcndhcmRUb05leHRTdG9wKCkKLSAgewotICAJQ29tbWFuZExpc3RFbnRyeSB0b3BFbnRyeSAgICAgID0gKENvbW1hbmRMaXN0RW50cnkpY29tbWFuZFN0YWNrXy5sYXN0RWxlbWVudCgpOyAgCQotICAJaW50ICAgICAgICAgICAgICBwYXJlbnRJbmRleCAgID0gdG9wRW50cnkucGFyZW50SW5kZXhfOwotICAJQ29tbWFuZEZyYWdtZW50ICBjaGlsZEZyYWdtZW50ID0gdG9wRW50cnkuZnJhZ21lbnRfOyAKLSAgCWJvb2xlYW4gICAgICAgICAgY29udGludWVMb29wICA9IG5hdmlnYXRlQ2hpbGRGcmFnbWVudHMoIGNoaWxkRnJhZ21lbnQsIGZhbHNlICk7Ci0gIAkgIAkKLSAgCXdoaWxlKCBwYXJlbnRJbmRleCAhPSAtMSAmJiBjb250aW51ZUxvb3AgKQotICAJeyAgCQotICAJICBDb21tYW5kTGlzdEVudHJ5IHBhcmVudEVudHJ5ICAgID0gKENvbW1hbmRMaXN0RW50cnkpY29tbWFuZFN0YWNrXy5lbGVtZW50QXQoIHBhcmVudEluZGV4ICk7Ci0gIAkgIENvbW1hbmRGcmFnbWVudCAgcGFyZW50RnJhZ21lbnQgPSBwYXJlbnRFbnRyeS5mcmFnbWVudF87Ci0gIAkgIENvbW1hbmRGcmFnbWVudCAgbmV4dEZyYWdtZW50ICAgPSBwYXJlbnRGcmFnbWVudC5nZXROZXh0U3ViRnJhZ21lbnQoIGNoaWxkRnJhZ21lbnQgKTsKLSAgCSAgCi0gIAkgIGlmKCBuZXh0RnJhZ21lbnQgPT0gbnVsbCApCi0gIAkgIHsKLSAgCSAgCS8vIFRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmcgZnJhZ21lbnRzIHRvIG5hdmlnYXRlIHNvIHdlIHdpbGwgcG9wIHVwIHRvIHRoZSBwYXJlbnQKLSAgCSAgCS8vIGFuIGNvbnRpbnVlIG5hdmlnYXRpb24gdGhlcmUuCi0gIAkgIAlwYXJlbnRJbmRleCAgID0gcGFyZW50RW50cnkucGFyZW50SW5kZXhfOwotICAJICAJY2hpbGRGcmFnbWVudCA9IHBhcmVudEZyYWdtZW50OyAKLSAgCSAgfQotICAJICBlbHNlCi0gIAkgIHsgIAkgIAkKLSAgCSAgCWlmKCBuYXZpZ2F0ZUNoaWxkRnJhZ21lbnRzKCBuZXh0RnJhZ21lbnQsIHRydWUgKSApIAotICAJICAJewotICAJICAJICAvLyBXZSBhcmUgY29udGludWluZyB0byBuYXZpZ2F0ZS4gIFRoaXMgdGltZSB3ZSB3YW50IHRvIHRyYXZlcnNlIHRoZSBzaWJsaW5nCi0gIAkgIAkgIC8vIG9mIG5leHRGcmFnbWVudC4gCi0gIAkgIAkgIGNoaWxkRnJhZ21lbnQgPSBuZXh0RnJhZ21lbnQ7Ci0gIAkgIAl9Ci0gIAkgIAllbHNlCi0gIAkgIAl7Ci0gIAkgIAkgIC8vIFdlIGFyZSBzdG9wcGluZyBvdXIgbmF2aWdhdGlvbi4KLSAgCSAgCSAgY29udGludWVMb29wID0gZmFsc2U7Ci0gIAkgIAl9Ci0gIAkgIH0KLSAgCX0KLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBUcmF2ZXJzZSB0aGUgQ29tbWFuZEZyYWdtZW50cyBzdGFydGluZyB3aXRoIHRoZSBDb21tYW5kRnJhZ21lbnQgb24gdGhlCi0gICAqIHRvcCBvZiB0aGUgY29tbWFuZCBmcmFnbWVudCBzdGFjay4gIFRoaXMgb3BlcmF0aW9uIGRvZXMgY2hhbmdlIHRoZQotICAgKiBjb21tYW5kIGZyYWdtZW50IHN0YWNrIGFuZCBkb2VzIGV4ZWN1dGUgYW55IGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoCi0gICAqIGEgQ29tbWFuZEZyYWdtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgbW92ZUZvcndhcmRUb05leHRTdG9wKCkKLSAgewotICAJQ29tbWFuZExpc3RFbnRyeSB0b3BFbnRyeSAgICAgICAgPSAoQ29tbWFuZExpc3RFbnRyeSljb21tYW5kU3RhY2tfLmxhc3RFbGVtZW50KCk7ICAJCi0gIAlpbnQgICAgICAgICAgICAgIHBhcmVudEluZGV4ICAgICA9IHRvcEVudHJ5LnBhcmVudEluZGV4XzsKLSAgCUNvbW1hbmRGcmFnbWVudCAgY3VycmVudEZyYWdtZW50ID0gdG9wRW50cnkuZnJhZ21lbnRfOyAgCi0gIAlib29sZWFuICAgICAgICAgIGNvbnRpbnVlRXhlY3V0ZSA9IHZpc2l0VG9wKCk7Ci0gIAlDb21tYW5kRnJhZ21lbnQgIGNoaWxkRnJhZ21lbnQgICAgPSBjdXJyZW50RnJhZ21lbnQuZ2V0Rmlyc3RTdWJGcmFnbWVudCgpOwotICAJCi0gIAkvLyBJZiB0aGUgY3VycmVudCBmcmFnbWVudCBoYXMgY2hpbGQgZnJhZ21lbnRzIHdlIG5lZWQgdG8gdHJhdmVyc2UgdGhlc2UgY2hpbGRyZW4uCi0gIAl3aGlsZSggY2hpbGRGcmFnbWVudCAhPSBudWxsICYmIGNvbnRpbnVlRXhlY3V0ZSApCi0gIAl7Ci0gIAkgIHBhcmVudEluZGV4ID0gY29tbWFuZFN0YWNrXy5zaXplKCkgLSAxOwotICAJICBhZGRUb1N0YWNrKCBjaGlsZEZyYWdtZW50LCBwYXJlbnRJbmRleCApOwotICAJICBjb250aW51ZUV4ZWN1dGUgPSB2aXNpdFRvcCgpOwotICAJICBjdXJyZW50RnJhZ21lbnQgPSBjaGlsZEZyYWdtZW50OwotICAJICBjaGlsZEZyYWdtZW50ICAgPSBjdXJyZW50RnJhZ21lbnQuZ2V0Rmlyc3RTdWJGcmFnbWVudCgpOwotICAJfQotICAJCi0gIAkvLyBUaGUgcHJldmlvdXMgd2hpbGUgbG9vcCBoYXMgZ3VhcmFudGVlZCB0aGF0IGN1cnJlbnRGcmFnbWVudCBoYXMgbm8KLSAgCS8vIGNoaWxkIGZyYWdtZW50cy4gVGhpcyB3aGlsZSBsb29wIGFzc3VtZXMgdGhpcyB0byBiZSB0aGUgY2FzZS4KLSAgCXdoaWxlKCBwYXJlbnRJbmRleCAhPSAtMSAmJiBjb250aW51ZUV4ZWN1dGUgKQotICAJeyAgCSAgIAkKLSAgCSAgQ29tbWFuZExpc3RFbnRyeSBwYXJlbnRFbnRyeSAgICA9IChDb21tYW5kTGlzdEVudHJ5KWNvbW1hbmRTdGFja18uZWxlbWVudEF0KCBwYXJlbnRJbmRleCApOwotICAJICBDb21tYW5kRnJhZ21lbnQgIHBhcmVudEZyYWdtZW50ID0gcGFyZW50RW50cnkuZnJhZ21lbnRfOwotICAJICBDb21tYW5kRnJhZ21lbnQgIG5leHRGcmFnbWVudCAgID0gbnVsbDsKLSAgCSAgCi0gIAkgIGlmKCBjdXJyZW50RnJhZ21lbnQgPT0gbnVsbCApCi0gIAkgIHsKLSAgCSAgICBuZXh0RnJhZ21lbnQgPSBwYXJlbnRGcmFnbWVudC5nZXRGaXJzdFN1YkZyYWdtZW50KCk7Ci0gIAkgIH0KLSAgCSAgZWxzZQotICAJICB7CQotICAJICAgIG5leHRGcmFnbWVudCA9IHBhcmVudEZyYWdtZW50LmdldE5leHRTdWJGcmFnbWVudCggY3VycmVudEZyYWdtZW50ICk7Ci0gIAkgIH0KLSAgCSAgCi0gIAkgIGlmKCBuZXh0RnJhZ21lbnQgPT0gbnVsbCApCi0gIAkgIHsKLSAgCSAgCS8vIFRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmcgZnJhZ21lbnRzIHRvIG5hdmlnYXRlIHNvIHdlIHdpbGwgcG9wIHVwIHRvIHRoZSBwYXJlbnQKLSAgCSAgCS8vIGFuZCBjb250aW51ZSBuYXZpZ2F0aW9uIHRoZXJlLgotICAJICAJcGFyZW50SW5kZXggICAgID0gcGFyZW50RW50cnkucGFyZW50SW5kZXhfOwotICAJICAJY3VycmVudEZyYWdtZW50ID0gcGFyZW50RnJhZ21lbnQ7IAotICAJICB9Ci0gIAkgIGVsc2UKLSAgCSAgeyAgCQotICAJICAJLy8gV2UgaGF2ZSBhIG5ldyBmcmFnbWVudCB0aGF0IHdlIG5lZWQgdG8gYWRkIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotICAJICAJYWRkVG9TdGFjayggbmV4dEZyYWdtZW50LCBwYXJlbnRJbmRleCApOyAgCSAgCQotICAJICAgIHBhcmVudEluZGV4ICAgICA9IGNvbW1hbmRTdGFja18uc2l6ZSgpIC0gMTsgIAkKLSAgCSAgICBjb250aW51ZUV4ZWN1dGUgPSB2aXNpdFRvcCgpOwotICAJICAgIGN1cnJlbnRGcmFnbWVudCA9IG51bGw7ICAJICAJCi0gIAkgIH0KLSAgCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiB0aGUgdGhlcmUgaXMgbm90IGxvbmdlciBhbnkgZWxlbWVudHMgb24gdGhlIHN0YWNrLiAgTm90ZToKLSAgICogICAgICAgICAgICAgICAgIHRoYXQgbGFzdCB0d28gZW50cmllcyBhcmUgYWx3YXlzIGxlZnQgb24gdGhlIHN0YWNrLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gdW5kb1RvTGFzdFN0b3AoKQotICB7ICAgIAotICAJQ29tbWFuZExpc3RFbnRyeSB0b3BFbnRyeSA9IChDb21tYW5kTGlzdEVudHJ5KWNvbW1hbmRTdGFja18ubGFzdEVsZW1lbnQoKTsJCi0gIAkKLQkvLyBBbHdheXMgdW5kbyB0aGUgdG9wIGVsZW1lbnQuCi0gIAlwZXJmb3JtVW5kbyggdG9wRW50cnkgKTsKLSAgCQkKLSAgICB3aGlsZSggdG9wRW50cnkucGFyZW50SW5kZXhfICE9IDAgKQotICAJewotICAgICAgY29tbWFuZFN0YWNrXy5wb3AoKTsKLSAgCSAgdG9wRW50cnkgPSAoQ29tbWFuZExpc3RFbnRyeSljb21tYW5kU3RhY2tfLmxhc3RFbGVtZW50KCk7CSAgCi0gICAgICAKLSAgCSAgcGVyZm9ybVVuZG8oIHRvcEVudHJ5ICk7Ci0gIAkgIAotICAJICBpZiggdG9wRW50cnkuZnJhZ21lbnRTdG9wcGVkXyApCi0gIAkgIHsKLSAgCSAgICBicmVhazsKLSAgCSAgfQotICAJfQotICAJCi0gIAlyZXR1cm4gdG9wRW50cnkucGFyZW50SW5kZXhfID09IDA7Ci0gIH0KLSAgIAotICBwcml2YXRlIHZvaWQgcGVyZm9ybVVuZG8oIENvbW1hbmRMaXN0RW50cnkgZW50cnkgKQotICB7Ci0gICAgaWYoIGVudHJ5LnBhcmVudEluZGV4XyA9PSAwICkgcmV0dXJuOwotICAgIAotCUNvbW1hbmQgY21kID0gZW50cnkuY29tbWFuZF87Ci0gIAkgIAotICAJaWYoIGNtZCAhPSBudWxsICYmIGNtZC5pc1VuZG9hYmxlKCkgJiYgIWVudHJ5LmJlZm9yZUV4ZWN1dGVfICkKLQl7Ci0JICBjbWQudW5kbyggZW52aXJvbm1lbnRfICk7Ci0JICBlbnRyeS5iZWZvcmVFeGVjdXRlXyA9IHRydWU7Ci0JfQotICAJICAKLQl1bmRvRnJhZ21lbnRMaXN0ZW5lcl8ubm90aWZ5KCBlbnRyeS5mcmFnbWVudF8gKTsgIAkKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIG5hdmlnYXRlQ2hpbGRGcmFnbWVudHMoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCwgYm9vbGVhbiB2aXNpdEN1cnJlbnQgKQotICB7Ci0gIAlib29sZWFuICAgICAgICAgY29udGludWVOYXZpZ2F0ZSA9IHRydWU7Ci0gIAlDb21tYW5kRnJhZ21lbnQgY2hpbGRGcmFnICAgICAgICA9IG51bGw7IAotICAJICAKLSAgCWlmKCB2aXNpdEN1cnJlbnQgKQotICAJewotICAJICBjb250aW51ZU5hdmlnYXRlID0gcGVla0ZyYWdtZW50TGlzdGVuZXJfLm5vdGlmeSggZnJhZ21lbnQgKTsKLSAgICAgIGRhdGFNYW5hZ2VyXy5wcm9jZXNzKCBmcmFnbWVudCApOwotICAJfQotICAJCi0gIAljaGlsZEZyYWcgPSBmcmFnbWVudC5nZXRGaXJzdFN1YkZyYWdtZW50KCk7Ci0gICAJCi0gIAl3aGlsZSggY2hpbGRGcmFnICE9IG51bGwgJiYgY29udGludWVOYXZpZ2F0ZSApCi0gIAl7Ci0gIAkgIGNvbnRpbnVlTmF2aWdhdGUgPSBuYXZpZ2F0ZUNoaWxkRnJhZ21lbnRzKCBjaGlsZEZyYWcsIHRydWUgKTsKLSAgCSAgY2hpbGRGcmFnICAgICAgICA9IGZyYWdtZW50LmdldE5leHRTdWJGcmFnbWVudCggY2hpbGRGcmFnICk7Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBjb250aW51ZU5hdmlnYXRlOwotICB9Ci0gICAgCi0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFRvcCgpCi0gIHsgIAotICAJQ29tbWFuZExpc3RFbnRyeSBlbnRyeSAgICAgICAgICAgPSAoQ29tbWFuZExpc3RFbnRyeSljb21tYW5kU3RhY2tfLmxhc3RFbGVtZW50KCk7Ci0gIAlib29sZWFuICAgICAgICAgY29udGludWVOYXZpZ2F0ZSA9IG5leHRGcmFnbWVudExpc3RlbmVyXy5ub3RpZnkoIGVudHJ5LmZyYWdtZW50XyApOwotICAJICAKLSAgCWlmKCBjb250aW51ZU5hdmlnYXRlICkKLSAgCXsKLSAgCSAgLy8gQ2FsbCB0aGUgc2V0dGVycyBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAgIGRhdGFNYW5hZ2VyXy5wcm9jZXNzKCBlbnRyeS5mcmFnbWVudF8gKTsKLSAgICAgIAotICAgICAgLy8gQWRkIGFueSBydWxlcyB0byB0aGUgbWFwcGluZyByZWdpc3RyeSBiZWZvcmUgd2UgZXhlY3V0ZSB0aGUgY29tbWFuZC4KLSAgICAgIGVudHJ5LmZyYWdtZW50Xy5yZWdpc3RlckRhdGFNYXBwaW5ncyggZGF0YU1hbmFnZXJfLmdldE1hcHBpbmdSZWdpc3RyeSgpICk7Ci0gICAKLSAgCSAgbGFzdFN0YXR1c18gPSBydW5Db21tYW5kKCBlbnRyeSApOwotICAJICAKLSAgCSAgaWYoIGxhc3RTdGF0dXNfLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkgY29udGludWVOYXZpZ2F0ZSA9IGZhbHNlOwotICAJfQotICAJCi0gICAJaWYoICFjb250aW51ZU5hdmlnYXRlICkgZW50cnkuZnJhZ21lbnRTdG9wcGVkXyA9IHRydWU7Ci0gICAJCi0gIAlyZXR1cm4gY29udGludWVOYXZpZ2F0ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGFkZFRvU3RhY2soIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCwgaW50IHBhcmVudEluZGV4ICkKLSAgewotICAgIENvbW1hbmRMaXN0RW50cnkgZW50cnkgPSBuZXcgQ29tbWFuZExpc3RFbnRyeSggZnJhZ21lbnQsIHBhcmVudEluZGV4ICk7Ci0gICAgY29tbWFuZFN0YWNrXy5wdXNoKCBlbnRyeSApOwotICB9Ci0gIAotICBwcml2YXRlIFN0YXR1cyBydW5Db21tYW5kKCBDb21tYW5kTGlzdEVudHJ5IGVudHJ5ICkKLSAgewotCUNvbW1hbmRGYWN0b3J5IGZhY3RvcnkgID0gZW50cnkuZnJhZ21lbnRfLmdldENvbW1hbmRGYWN0b3J5KCk7Ci0gIAlTdGF0dXMgICAgICAgICBzdGF0dXMgICA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gIAkKLSAgCWlmKCBmYWN0b3J5ICE9IG51bGwgKQotICAJewotICAJICBDb21tYW5kIGNtZCAgICA9IGZhY3RvcnkuY3JlYXRlKCk7Ci0gIAkgIGVudHJ5LmNvbW1hbmRfID0gY21kOwotICAJICAgIAotICAJICBpZiggY21kICE9IG51bGwgKQotICAJICB7Ci0gIAkgICAgZGF0YU1hbmFnZXJfLnByb2Nlc3MoIGNtZCApOwotICAJICAJICAKLSAgCSAgICB0cnkKLSAgCSAgICB7Ci0gIAkgICAgICBlbnZpcm9ubWVudF8uZ2V0TG9nKCkubG9nKExvZy5JTkZPLCAiY29tbWFuZCIsIDUwMDEsIHRoaXMsICJydW5Db21tYW5kIiwgIkV4ZWN1dGluZzogIiArIGNtZC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gIAkgIAkgICAgCi0gCSAgICAgIHN0YXR1cyA9IGNtZC5leGVjdXRlKCBlbnZpcm9ubWVudF8gKTsgCSAgICAgIAotCQkgIGVudHJ5LmJlZm9yZUV4ZWN1dGVfID0gZmFsc2U7Ci0gIAkgICAgfQotICAJICAgIGNhdGNoKCBUaHJvd2FibGUgZXhjICkKLSAgCSAgICB7Ci0gIAkgICAgICBNZXNzYWdlVXRpbHMgdXRpbHMgICAgICAgICAgID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmVudmlyb25tZW50IiwgdGhpcyApOwotICAJICAgICAgU2ltcGxlU3RhdHVzIHVuZXhwZWN0ZWRFcnJvciA9IG5ldyBTaW1wbGVTdGF0dXMoImlkIiwgZXhjLmdldE1lc3NhZ2UoKSwgU3RhdHVzLkVSUk9SLCBleGMgKTsKLSAgCSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCB1dGlscy5nZXRNZXNzYWdlKCAiTVNHX0VSUk9SX1VORVhQRUNURURfRVJST1IiICksIG5ldyBTdGF0dXNbXXt1bmV4cGVjdGVkRXJyb3J9ICk7Ci0gIAkgICAgICBlbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKCBzdGF0dXMgKTsKLSAgCSAgICB9Ci0gIAkgICAgZmluYWxseQotICAJICAgIHsKLSAgCSAgICAgIFN0cmluZyBtZXNzYWdlID0gIk9rIjsKLSAgCSAgICAgIAotICAJICAgICAgaWYoIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gIAkgICAgICB7Ci0gIAkgICAgICAgIG1lc3NhZ2UgPSAiRXJyb3I6ICIgKyBzdGF0dXMuZ2V0TWVzc2FnZSgpOyAKLSAgCSAgICAgIH0KLSAgCSAgICAgIAotCSAgICAgIGVudmlyb25tZW50Xy5nZXRMb2coKS5sb2coTG9nLklORk8sICJjb21tYW5kIiwgNTAwMSwgdGhpcywgInJ1bkNvbW1hbmQiLCAiRXhlY3V0aW9uIHN0YXR1czogIiArIG1lc3NhZ2UgKTsKLSAgCSAgICB9Ci0gIAkgIH0KLSAgCX0KLSAgCQotICAJcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBDb21tYW5kTGlzdEVudHJ5Ci0gIHsKLSAgCXB1YmxpYyBDb21tYW5kTGlzdEVudHJ5KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQsIGludCBwYXJlbnRJbmRleCApCi0gIAl7Ci0gIAkgIGZyYWdtZW50XyAgICAgICAgPSBmcmFnbWVudDsKLSAgCSAgcGFyZW50SW5kZXhfICAgICA9IHBhcmVudEluZGV4OwotICAJICBmcmFnbWVudFN0b3BwZWRfID0gZmFsc2U7Ci0JICBiZWZvcmVFeGVjdXRlXyAgID0gdHJ1ZTsKLSAgCX0KLSAgCSAgCQotICAJcHVibGljIENvbW1hbmQgICAgICAgICBjb21tYW5kXzsKLSAgCXB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnRfOwotICAJcHVibGljIGludCAgICAgICAgICAgICBwYXJlbnRJbmRleF87Ci0gIAlwdWJsaWMgYm9vbGVhbiAgICAgICAgIGZyYWdtZW50U3RvcHBlZF87Ci0JcHVibGljIGJvb2xlYW4gICAgICAgICBiZWZvcmVFeGVjdXRlXzsKLSAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGcmFnbWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGcmFnbWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjYzQ3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRnJhZ21lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgd2F5IHRvIGNyZWF0ZSBDb21tYW5kRnJhZ21lbnRzLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kRnJhZ21lbnRGYWN0b3J5Ci17Ci0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgY3JlYXRlZCBDb21tYW5kRnJhZ21lbnQgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODA3NmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5IAotewotICAvKioKLSAgICogVGhlIGZyYW1ld29yayBjYWxscyB0aGlzIG1ldGhvZCB0byBnZXQgdGhlIENvbW1hbmRGcmFnbWVudEZhY3RvcnkKLSAgICogZm9yIGEgcGFydGljdWxhciBleHRlbnNpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIENyZWF0ZXMgYSBDb21tYW5kRnJhZ21lbnRGYWN0b3J5LgotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0V4dGVuc2lvbkZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9FeHRlbnNpb25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2RlM2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0V4dGVuc2lvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5yZWdpc3RyeS5Db21tYW5kUmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbkZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQgCi17Ci0gIHByaXZhdGUgU3RyaW5nW10gICAgICAgIGlkc187OwotICBwcml2YXRlIENvbW1hbmRSZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlICAgICAgIGZyYWdtZW50c187Ci0gIAotICAvKioKLSAgICogIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAqCi0gICAqLwotICBwdWJsaWMgRXh0ZW5zaW9uRnJhZ21lbnQoKQotICB7Ci0gICAgc3VwZXIoIG51bGwsICIiICk7ICAKLSAgICBmcmFnbWVudHNfID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBDb3B5IGNvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gRnJhZ21lbnQgdGhlIGZyYWdtZW50IHRvIGNvcHkKLSAgICovCi0gIHByb3RlY3RlZCBFeHRlbnNpb25GcmFnbWVudCggRXh0ZW5zaW9uRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgc3VwZXIoIGZyYWdtZW50ICk7Ci0gICAgCi0gICAgaWRzXyAgICAgICAgICAgICAgID0gZnJhZ21lbnQuaWRzXzsKLSAgICBleHRlbnNpb25SZWdpc3RyeV8gPSBmcmFnbWVudC5leHRlbnNpb25SZWdpc3RyeV87Ci0gICAgZnJhZ21lbnRzXyAgICAgICAgID0gZnJhZ21lbnQuZnJhZ21lbnRzXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gaWRzIFNldHMgdGhlIElEcyBmb3IgdGhpcyBleHRlbnNpb24gZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25JZHMoIFN0cmluZ1tdIGlkcyApCi0gIHsKLSAgICBpZHNfID0gaWRzOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSByZWdpc3RyeSBTZXRzIHRoZSByZWdpc3RyeSBmb3IgdGhpcyBleHRlbnNpb24gZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25SZWdpc3RyeSggQ29tbWFuZFJlZ2lzdHJ5IHJlZ2lzdHJ5ICkKLSAgewotICAgIGV4dGVuc2lvblJlZ2lzdHJ5XyA9IHJlZ2lzdHJ5OyAKLSAgfQotICAgICAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNnZXRGaXJzdFN1YkZyYWdtZW50KCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0Rmlyc3RTdWJGcmFnbWVudCgpIAotICB7Ci0gICAgQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkgZmFjdG9yeSAgPSBleHRlbnNpb25SZWdpc3RyeV8uZ2V0RmFjdG9yeUZhY3RvcnkoIGlkc18gKTsKLSAgICAKLSAgICBpZiggZmFjdG9yeSA9PSBudWxsICkgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgQ29tbWFuZEZyYWdtZW50ICAgICAgICAgICAgICAgZnJhZ21lbnQgPSAoQ29tbWFuZEZyYWdtZW50KWZyYWdtZW50c18uZ2V0KCBmYWN0b3J5ICk7Ci0gICAgCi0gICAgaWYoIGZyYWdtZW50ID09IG51bGwgKQotICAgIHsKLSAgICAgIGZyYWdtZW50ID0gZmFjdG9yeS5jcmVhdGUoKS5jcmVhdGUoKTsKLSAgICAgIGZyYWdtZW50c18ucHV0KCBmYWN0b3J5LCBmcmFnbWVudCApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gIGZyYWdtZW50OwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjZ2V0TmV4dFN1YkZyYWdtZW50KG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0TmV4dFN1YkZyYWdtZW50KENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCkgCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNjbG9uZSgpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IEV4dGVuc2lvbkZyYWdtZW50KCB0aGlzICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0ZyYWdtZW50TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0ZyYWdtZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc2MmM2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9GcmFnbWVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnQgZm9yIGNvZGUgdGhhdCBuZWVkcyB0byBsaXN0ZW4gdG8gZnJhZ21lbnRzCi0gKiB0aGF0IGFyZSBiZWluZyB0cmF2ZXJzZSBieSB0aGUgQ29tbWFuZEZyYWdtZW50RW5naW5lLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBGcmFnbWVudExpc3RlbmVyIAotewotICAvKgotICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgYSBjb21tYW5kRnJhZ21lbnQgaXMgYmVpbmcgdmlzaXRlZCBkdXJpbmcKLSAgICogYSB0cmF2ZXJzYWwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBub3RpZnkoIENvbW1hbmRGcmFnbWVudCBjb21tYW5kRnJhZ21lbnQgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0xvb3BDb25kaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L0xvb3BDb25kaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3ODBiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Mb29wQ29uZGl0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50OwotCi0vKioKLSAgKiBUaGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCB3aGVuIGEgY29uZGl0aW9uYWwgb2JqZWN0IG5lZWRzIHRvIGJlIHJldHVybmVkLgotKiovCi1wdWJsaWMgaW50ZXJmYWNlIExvb3BDb25kaXRpb24KLXsKLSAgLyoqCi0gICAgKiBFdmFsdWF0ZXMgYSBsb29wIGNvbmRpdGlvbi4KLSAgICAqCi0gICAgKiBAcGFyYW0gbG9vcCB0aGUgbG9vcCBmcmFnbWVudCB0aGF0IGlzIGJlaW5nIGV2YWx1YXRlZC4KLSAgICAqIEBwYXJhbSBmcmFnbWVudCB0aGUgY2hpbGQgZnJhZ21lbnQgb2YgdGhlIGxvb3AgCi0gICAgKiAgICAgICAgdW5kZXIgZXZhbHVhdGlvbi4gIE5vdGU6IGZyYWdtZW50IGNhbiBiZSBudWxsLgotICAgICogQHJldHVybiByZXR1cm5zIGFuIG9iamVjdCBiYXNlZCBvbiBzb21lIGV2YWx1YXRlZCBjb25kaXRpb24uCi0gICoqLwotICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSggTG9vcEZyYWdtZW50IGxvb3AsIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvTG9vcEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Mb29wRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxODM1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9Mb29wRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlJhbmdlVmVjdG9yOwotCi0KLS8qKgotICAqIFRoaXMgY2xhc3MgcmV0dXJucyBhIGR5bmFtaWNhbGx5IGRldGVybWluZWQgbnVtYmVyIG9mCi0gICogZnJhZ21lbnRzLiAgVGhpcyBsb29wIHdpbGwgcmV0dXJuIHRoZSBmcmFnbWVudCBwYXJhbWV0ZXIKLSAgKiBhcyBsb25nIGFzIHRoZSBzdG9wQ29uZGl0aW9uIGV2YWx1YXRlcyB0byBmYWxzZS4gIE90aGVyd2lzZSwKLSAgKiBudWxsIGlzIHJldHVybmVkLgotKiovCi1wdWJsaWMgY2xhc3MgTG9vcEZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBMb29wQ29uZGl0aW9uICAgc3RvcENvbmRpdGlvbl87Ci0gIHByaXZhdGUgQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50XzsKLSAgcHJpdmF0ZSBSYW5nZVZlY3RvciAgICAgZnJhZ21lbnRIaXN0b3J5XzsKLQotICAvKioKLSAgICAqIENvcHkgY29udHJ1Y3RvciBmb3IgdGhpcyBmcmFnbWVudC4KLSAgKiovCi0gIHByb3RlY3RlZCBMb29wRnJhZ21lbnQoIExvb3BGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICB0aGlzKCBmcmFnbWVudC5mcmFnbWVudF8sCi0gICAgCSAgZnJhZ21lbnQuc3RvcENvbmRpdGlvbl8sCi0gICAgCSAgZnJhZ21lbnQuZ2V0Q29tbWFuZEZhY3RvcnkoKSwKLSAgICAJICBmcmFnbWVudC5nZXRJZCgpICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMb29wRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIExvb3BDb25kaXRpb24gICBzdG9wQ29uZGl0aW9uICkKLSAgewotICAgIHRoaXMoIGZyYWdtZW50LCBzdG9wQ29uZGl0aW9uLCBudWxsLCAiIiApOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi0gIC8qKgotICAgICogQHBhcmFtIGZyYWdtZW50IHRoZSBmcmFnbWVudCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhlIGxvb3AuCi0gICAgKiBAcGFyYW0gc3RvcENvbmRpdGlvbiB3aGVuIGZhbHNlIHRoZSBmcmFnbWVudCB3aWxsIGJlIHJldHVybmVkLCAKLSAgICAqIG90aGVyd2lzZSBudWxsIGlzIHJldHVybmVkLgotICAgICogQHBhcmFtIHN0YXRlIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIGNvbmRpdGlvbi4KLSAgICAqIEBwYXJhbSBjb21tYW5kIHRoZSBleGVjdXRhYmxlIGNvbW1hbmQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICoqLwotICBwdWJsaWMgTG9vcEZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIExvb3BDb25kaXRpb24gICBzdG9wQ29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kRmFjdG9yeSAgY29tbWFuZEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgICAgICAgICBpZCAgICkKLSAgewotICAgIHN1cGVyKCBjb21tYW5kRmFjdG9yeSwgaWQgKTsKLQotICAgIGZyYWdtZW50XyAgICAgICAgPSBmcmFnbWVudDsKLSAgICBzdG9wQ29uZGl0aW9uXyAgID0gc3RvcENvbmRpdGlvbjsKLSAgICBmcmFnbWVudEhpc3RvcnlfID0gbmV3IFJhbmdlVmVjdG9yKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgICogTWFrZXMgYSBjb3B5IG9mIHRoZSBDb21tYW5kRnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGZyYWdtZW50LgotICAqKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IExvb3BGcmFnbWVudCggdGhpcyApOwotICB9Ci0KLSAgLyoqCi0gICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZnJhZ21lbnQKLSAgICAqCi0gICAgKiBAcGFyYW0gZnJhZ21lbnQgdGhlIGZyYWdtZW50IHRvIHNlYXJjaC4KLSAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoaXMgZnJhZ21lbnQuCi0gICoqLwotICBwdWJsaWMgaW50IGluZGV4T2YoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICByZXR1cm4gZnJhZ21lbnRIaXN0b3J5Xy5pbmRleE9mKCBmcmFnbWVudCApOwotICB9Ci0KLQotICAvKiogCi0gICAgKiBHZXRzIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucwotICAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXRGaXJzdFN1YkZyYWdtZW50KCkKLSAgeyAgICAKLSAgICByZXR1cm4gZ2V0TmV4dFN1YkZyYWdtZW50KCBudWxsICk7Ci0gIH0KLQotICAvKioKLSAgICAqIEdldHMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucyBudWxsCi0gICAgKiB3aGVuIHRoZXJlIGlzIG5vIG5leHQgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldE5leHRTdWJGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWcgKQotICB7Ci0gICAgQ29tbWFuZEZyYWdtZW50IG5leHRGcmFnICA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHN0b3BDb25kaXRpb25fLmV2YWx1YXRlKCB0aGlzLCBmcmFnICkgKQotICAgIHsKLSAgICAgIC8vIFRoZSBzdG9wIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuCi0gICAgICAvLyBEbyBub3RoaW5nLgotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgIAotICAgICAgaW50IGZyYWdJbmRleCA9IGluZGV4T2YoIGZyYWcgKTsKLQotICAgICAgLy8gTm90ZTogd2hlbiBmcmFnbWVudCA9PSBudWxsIHRoZSBmcmFnSW5kZXgKLSAgICAgIC8vICAgICAgIHNob3VsZCBiZSAtMS4gIFRoZXJlZm9yZSwgaWYgdGhlcmUKLSAgICAgIC8vICAgICAgIGlzIGFscmVhZHkgYSBmaXJzdCBmcmFnbWVudCBpbgotICAgICAgLy8gICAgICAgZnJhZ21lbnRIaXN0b3J5IHRoYXQgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgIGlmKCBmcmFnSW5kZXggKyAxIDwgZnJhZ21lbnRIaXN0b3J5Xy5zaXplKCkgKQotICAgICAgewotICAgICAgICAvLyBXZSBoYXZlIGEgY29weSBvZiB0aGUgZnJhZ21lbnQgYWxyZWFkeS4KLSAgICAgICAgbmV4dEZyYWcgPSAoQ29tbWFuZEZyYWdtZW50KShmcmFnbWVudEhpc3RvcnlfLmVsZW1lbnRBdCggZnJhZ0luZGV4ICsgMSApKTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG5leHRGcmFnID0gKENvbW1hbmRGcmFnbWVudCkoZnJhZ21lbnRfLmNsb25lKCkpOwotICAgICAgICBmcmFnbWVudEhpc3RvcnlfLmFkZCggbmV4dEZyYWcgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmV4dEZyYWc7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L1NlcXVlbmNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L1NlcXVlbmNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkY2ZlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9mcmFnbWVudC9TZXF1ZW5jZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmRGYWN0b3J5OwotCi0KLS8qKgotICAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNlcXVlbmNlIG9mIENvbW1hbmRGcmFnbWVudHMuCi0qKi8KLXB1YmxpYyBjbGFzcyBTZXF1ZW5jZUZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBMaXN0IGZyYWdtZW50TGlzdF87Ci0KLSAgcHJvdGVjdGVkIFNlcXVlbmNlRnJhZ21lbnQoIFNlcXVlbmNlRnJhZ21lbnQgZnJhZyApCi0gIHsKLSAgCXN1cGVyKCBmcmFnLmdldENvbW1hbmRGYWN0b3J5KCksIGZyYWcuZ2V0SWQoKSApOwotICAJCi0gICAgZnJhZ21lbnRMaXN0XyA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgZnJhZy5mcmFnbWVudExpc3RfLnNpemUoKTsgaW5kZXgrKyApCi0gICAgewotICAgICAgT2JqZWN0IG5ld0ZyYWcgPSAoKENvbW1hbmRGcmFnbWVudClmcmFnLmZyYWdtZW50TGlzdF8uZ2V0KGluZGV4KSkuY2xvbmUoKTsKLSAgICAgIGZyYWdtZW50TGlzdF8uYWRkKCBuZXdGcmFnICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgU2VxdWVuY2VGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50W10gZnJhZ21lbnRzLCAKLQkJCQkJCSAgIENvbW1hbmRGYWN0b3J5ICAgIGNvbW1hbmRGYWN0b3J5LCAKLQkJCQkJICAgICAgIFN0cmluZyAgICAgICAgICAgIGlkICApCi0gIHsKLSAgCXN1cGVyKCBjb21tYW5kRmFjdG9yeSwgaWQgKTsKLSAgCQotICAgIGlmKCBmcmFnbWVudHMgIT0gbnVsbCApCi0gICAgewotICAgICAgZnJhZ21lbnRMaXN0XyA9IEFycmF5cy5hc0xpc3QoIGZyYWdtZW50cyApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZnJhZ21lbnRMaXN0XyA9IG5ldyBWZWN0b3IoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZXF1ZW5jZUZyYWdtZW50KCkKLSAgewotICAJc3VwZXIoIG51bGwsICIiICk7Ci0gIAkKLSAgCWZyYWdtZW50TGlzdF8gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICAqIEFwcGVuZHMgYSBmcmFnbWVudCB0byB0aGUgc2VxdWVuY2UuIAotICAqKi8KLSAgcHVibGljIHZvaWQgYWRkKCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgZnJhZ21lbnRMaXN0Xy5hZGQoIGZyYWdtZW50ICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgICogTWFrZXMgYSBjb3B5IG9mIHRoZSBDb21tYW5kRnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGZyYWdtZW50LgotICAqKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFNlcXVlbmNlRnJhZ21lbnQoIHRoaXMgKTsKLSAgfQotCi0gIC8qKiAKLSAgICAqIEdldHMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAgKiBudWxsIHdoZW4gdGhlcmUgaXMgbm8gZmlyc3QgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldEZpcnN0U3ViRnJhZ21lbnQoKQotICB7Ci0gICAgQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ID0gbnVsbDsKLQotICAgIGlmKCBmcmFnbWVudExpc3RfID09IG51bGwgfHwgZnJhZ21lbnRMaXN0Xy5zaXplKCkgPT0gMCApCi0gICAgewotICAgICAgZnJhZ21lbnQgPSBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgIAotICAgICAgZnJhZ21lbnQgPSAoQ29tbWFuZEZyYWdtZW50KSggZnJhZ21lbnRMaXN0Xy5nZXQoMCkgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZnJhZ21lbnQ7ICAgIAotICB9Ci0KLSAgLyoqCi0gICAgKiBHZXRzIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMgbnVsbAotICAgICogd2hlbiB0aGVyZSBpcyBubyBuZXh0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXROZXh0U3ViRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICBpbnQgaW5kZXggPSBmcmFnbWVudExpc3RfLmluZGV4T2YoIGZyYWdtZW50ICk7Ci0KLSAgICBpZiggaW5kZXggPT0gLTEgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJGcmFnbWVudCBub3QgZm91bmQgaW4gc2VxdWVuY2UuIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbmRleCsrOwotCi0gICAgICBpZiggaW5kZXggPj0gZnJhZ21lbnRMaXN0Xy5zaXplKCkgKQotICAgICAgewotICAgICAgICAvLyBUaGVyZSBpcyBub3RoaW5nIGZvbGxvd2luZyB0aGlzIGZyYWdtZW50IHNvIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gUmV0dXJuIHRoZSBuZXh0IGZyYWdtZW50LgotICAgICAgICByZXR1cm4gKENvbW1hbmRGcmFnbWVudCkoZnJhZ21lbnRMaXN0Xy5nZXQoIGluZGV4ICkpOwotICAgICAgfQotICAgIH0KLSAgfQkKLX0gIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvU2ltcGxlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL2ZyYWdtZW50L1NpbXBsZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMzU5MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZnJhZ21lbnQvU2ltcGxlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS4qOwotCi0vKioKLSAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYW4gZW1wdHkgb2YgV2l6YXJkRnJhZ21lbnQuCi0qKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50Ci17Ci0gIHB1YmxpYyBTaW1wbGVGcmFnbWVudCgpCi0gIHsKLSAgICB0aGlzKCAoQ29tbWFuZEZhY3RvcnkpbnVsbCwgIiIgKTsKLSAgfQotICAKLSAgcHVibGljIFNpbXBsZUZyYWdtZW50KCBTdHJpbmcgaWQgKQotICB7Ci0gICAgdGhpcyggKENvbW1hbmRGYWN0b3J5KW51bGwsIGlkICk7ICAKLSAgfQotICAKLSAgcHVibGljIFNpbXBsZUZyYWdtZW50KCBmaW5hbCBDb21tYW5kIGNvbW1hbmQsIFN0cmluZyBpZCApCi0gIHsKLSAgICBzdXBlciggbmV3IENvbW1hbmRGYWN0b3J5KCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kIGNyZWF0ZSgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQ7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9LCBpZCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTaW1wbGVGcmFnbWVudCggQ29tbWFuZEZhY3RvcnkgY29tbWFuZEZhY3RvcnksIFN0cmluZyBpZCApCi0gIHsKLSAgCXN1cGVyKCBjb21tYW5kRmFjdG9yeSwgaWQgKTsKLSAgfQotICAKLSAgLyoqCi0gICAgKiBDb3B5IGNvbnN0cnVjdG9yIGZvciBmcmFnbWVudC4KLSAgKiovCi0gIHByb3RlY3RlZCBTaW1wbGVGcmFnbWVudCggU2ltcGxlRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgc3VwZXIoIGZyYWdtZW50LmdldENvbW1hbmRGYWN0b3J5KCksIGZyYWdtZW50LmdldElkKCkgKTsKLSAgfQotICAgIAotICAvKioKLSAgICAqIEFsbCB3aXphcmQgZnJhZ21lbnRzIG5lZWQgdG8gYmUgY2xvbmVhYmxlLgotICAqKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZUZyYWdtZW50KCB0aGlzICk7Ci0gIH0KLQotCi0gIC8qKiAKLSAgICAqIEdldHMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAgKiBudWxsIHdoZW4gdGhlcmUgaXMgbm8gZmlyc3QgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldEZpcnN0U3ViRnJhZ21lbnQoKXsgcmV0dXJuIG51bGw7IH0KLQotICAvKioKLSAgICAqIEdldHMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKiBTaW5jZSB0aGlzIGlzIGEgc2ltcGxlIGZyYWdtZW50LCB0aGVyZSBpcyBubyBuZXh0IGZyYWdtZW50Ci0gICAgKiBzbyB3ZSB3aWxsIGFsd2F5cyByZXR1cm4gbnVsbC4gCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucyBudWxsCi0gICAgKiB3aGVuIHRoZXJlIGlzIG5vIG5leHQgY2hpbGQuCi0gICoqLyAgCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0TmV4dFN1YkZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKXsgcmV0dXJuIG51bGw7IH0KLX0gIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvcmVnaXN0cnkvQ29tbWFuZFJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9yZWdpc3RyeS9Db21tYW5kUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0YTlhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9yZWdpc3RyeS9Db21tYW5kUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBhIHdheSB0byBjcmVhdGUgYSBDb21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeQotICogZnJvbSBhbiBhcnJheSBvZiBpZHMuCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRSZWdpc3RyeSAKLXsgIAotICAvKioKLSAgICogQ3JlYXRlcyBhIENvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5IGZyb20gYW4gYXJyYXkgb2YgaWRzLgotICAgKiAKLSAgICogQHBhcmFtIGlkcyB0aGUgaWRzLgotICAgKiBAcmV0dXJuIHRoZSBDb21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkgZ2V0RmFjdG9yeUZhY3RvcnkoIFN0cmluZ1tdIGlkcyApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvc2VsZWN0aW9uL0Jvb2xlYW5TZWxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3NlbGVjdGlvbi9Cb29sZWFuU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjdlYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvc2VsZWN0aW9uL0Jvb2xlYW5TZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogVGhpcyBjbGFzcyBjb21iaW5lcyBhIHN0cmluZyB3aXRoIGEgYm9vbGVhbiB2YWx1ZS4gIFRoaXMgaXMKLSAqIHVzZWZ1bCBmb3Igc3RvcmluZyB0aGUgc3RhdGUgZGF0YSBmb3IgYSBib29sZWFuIHNlbGVjdGlvbiBsaXN0LgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIEJvb2xlYW5TZWxlY3Rpb24KLXsKLSAgcHJpdmF0ZSBTdHJpbmcgIHZhbHVlXzsKLSAgcHJpdmF0ZSBib29sZWFuIHNlbGVjdGVkXzsKLSAgCi0gIHB1YmxpYyBCb29sZWFuU2VsZWN0aW9uKCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQgKQotICB7Ci0gICAgdmFsdWVfICAgID0gdmFsdWU7Ci0gICAgc2VsZWN0ZWRfID0gc2VsZWN0ZWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiBHZXQgdGhlIHN0cmluZyB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIEdldCB0aGUgYm9vbGVhbiB2YWx1ZSBmb3IgdGhpcyBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkKLSAgewotICAgIHJldHVybiBzZWxlY3RlZF87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3NlbGVjdGlvbi9DaG9pY2VzVG9TdHJpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3NlbGVjdGlvbi9DaG9pY2VzVG9TdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjZWFiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9zZWxlY3Rpb24vQ2hvaWNlc1RvU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLS8qKgotICogVGhpcyB0cmFuc2Zvcm1lciBjbGFzcyBzZWxlY3RzIGEgc3RyaW5nIGF0IGEgcGFydGljdWxhciBsZXZlbAotICogaW4gYSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIENob2ljZXNUb1N0cmluZyBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi17Ci0gIHByaXZhdGUgaW50IGxldmVsXzsKLSAgCi0gIHB1YmxpYyBDaG9pY2VzVG9TdHJpbmcoIGludCBsZXZlbCApCi0gIHsKLSAgICBsZXZlbF8gPSBsZXZlbDsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXIjdHJhbnNmb3JtKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybSggT2JqZWN0IHZhbHVlICkKLSAgewotICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNob2ljZXMgPSAoU2VsZWN0aW9uTGlzdENob2ljZXMpdmFsdWU7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxldmVsXzsgaW5kZXgrKyApCi0gICAgewotICAgICAgY2hvaWNlcyA9IGNob2ljZXMuZ2V0Q2hvaWNlKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBjaG9pY2VzLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0IHRyYW5zZm9ybSggU2VsZWN0aW9uTGlzdENob2ljZXMgY2hvaWNlcyApCi0gIHsKLSAgICByZXR1cm4gKFNlbGVjdGlvbkxpc3QpdHJhbnNmb3JtKCAoT2JqZWN0KWNob2ljZXMgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvc2VsZWN0aW9uL0R5bmFtaWNMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9zZWxlY3Rpb24vRHluYW1pY0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmOTA0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9zZWxlY3Rpb24vRHluYW1pY0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuc2VsZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgRHluYW1pYyB2ZXJzaW9uIG9mIHRoZSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIER5bmFtaWNMaXN0IAotewotICBwcml2YXRlIFZlY3RvciBzdHJpbmdMaXN0XyA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBWZWN0b3IgZHluYW1pY0xpc3RWZWN0b3JMaXN0XyA9IG5ldyBWZWN0b3IoKTsKLSAgCi0gIC8qKgotICAgKiBBZGRzIGFuIGVudHJ5IGludG8gdGhlIGR5bmFtaWMgbGlzdC4KLSAgICogCi0gICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHN0cmluZyB2YWx1ZXMgdGhhdCBsZWFkIHRvIHRoZSB0YXJnZXQuCi0gICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZCggU3RyaW5nW10gdmFsdWVzLCBPYmplY3QgdGFyZ2V0ICkKLSAgewotICAgIER5bmFtaWNMaXN0IGN1cnJlbnRMaXN0ID0gdGhpczsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgdmFsdWVzLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgU3RyaW5nIHZhbHVlICAgICAgPSB2YWx1ZXNbaW5kZXhdOwotICAgICAgaW50ICAgIGxlbmd0aCAgICAgPSBjdXJyZW50TGlzdC5zdHJpbmdMaXN0Xy5zaXplKCk7Ci0gICAgICBpbnQgICAgZm91bmRJbmRleCA9IC0xOwotICAgICAgCi0gICAgICAvLyBGaW5kIHRoZSBzdHJpbmcgaW4gdGhlIGN1cnJlbnQgbGlzdC4KLSAgICAgIGZvciggaW50IHNlYXJjaEluZGV4ID0gMDsgc2VhcmNoSW5kZXggPCBsZW5ndGg7IHNlYXJjaEluZGV4KysgKQotICAgICAgewotICAgICAgICBTdHJpbmcgc3RyaW5nID0gKFN0cmluZyljdXJyZW50TGlzdC5zdHJpbmdMaXN0Xy5lbGVtZW50QXQoIHNlYXJjaEluZGV4ICk7IAotICAgICAgICAKLSAgICAgICAgaWYoIHN0cmluZy5lcXVhbHMoIHZhbHVlICkgKSAKLSAgICAgICAgewotICAgICAgICAgIGZvdW5kSW5kZXggPSBzZWFyY2hJbmRleDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBpZiggZm91bmRJbmRleCA9PSAtMSApCi0gICAgICB7Ci0gICAgICAgIC8vIFdlIGhhdmUgYSBuZXcgc3RyaW5nIHNvIGFkZCBpdCB0byB0aGUgbGlzdC4KLSAgICAgICAgY3VycmVudExpc3Quc3RyaW5nTGlzdF8uYWRkKCB2YWx1ZSApOwotICAgICAgICBjdXJyZW50TGlzdC5keW5hbWljTGlzdFZlY3Rvckxpc3RfLmFkZCggbmV3IER5bmFtaWNMaXN0KCkgKTsKLSAgICAgICAgZm91bmRJbmRleCA9IGxlbmd0aDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgY3VycmVudExpc3QgPSAoRHluYW1pY0xpc3QpY3VycmVudExpc3QuZHluYW1pY0xpc3RWZWN0b3JMaXN0Xy5lbGVtZW50QXQoIGZvdW5kSW5kZXggKTsgICAgICAgCi0gICAgfQotICAgIAotICAgIGN1cnJlbnRMaXN0LmR5bmFtaWNMaXN0VmVjdG9yTGlzdF8uYWRkKCB0YXJnZXQgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBvYmplY3QgZnJvbSB0aGlzIER5bmFtaWNMaXN0Ci0gICAqIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyB0b0xpc3RDaG9pY2VzKCkKLSAgewotICAgIFNlbGVjdGlvbkxpc3QgbGlzdCAgID0gbmV3IFNlbGVjdGlvbkxpc3QoIChTdHJpbmdbXSlzdHJpbmdMaXN0Xy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICksIDApOwotICAgIGludCAgICAgICAgICAgbGVuZ3RoID0gZHluYW1pY0xpc3RWZWN0b3JMaXN0Xy5zaXplKCk7Ci0gICAgVmVjdG9yICAgICAgICB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7IAotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBkeW5hbWljTGlzdFZlY3Rvckxpc3RfLmVsZW1lbnRBdChpbmRleCk7Ci0gICAgICAKLSAgICAgIGlmKCBvYmogaW5zdGFuY2VvZiBEeW5hbWljTGlzdCApCi0gICAgICB7Ci0gICAgICAgIHZlY3Rvci5hZGQoICgoRHluYW1pY0xpc3Qpb2JqKS50b0xpc3RDaG9pY2VzKCkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdmVjdG9yLmFkZCggb2JqICk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMoIGxpc3QsIHZlY3RvciApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9zZWxlY3Rpb24vU2VsZWN0aW9uTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvc2VsZWN0aW9uL1NlbGVjdGlvbkxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkYWQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9zZWxlY3Rpb24vU2VsZWN0aW9uTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5zZWxlY3Rpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzdG9yZXMgYSBsaXN0IHN0cmluZ3MgYWxvbmcgd2l0aCBhIHNlbGVjdGlvbkluZGV4IHdoaWNoCi0gKiBzdG9yZXMgdGhlIGN1cnJlbnQgc3RyaW5nIHRoYXQgc2VsZWN0ZWQuICBUaGVyZSBpcyBhbHNvIGEgc2VsZWN0aW9uCi0gKiB2YWx1ZS4gIElmIHRoaXMgdmFsdWUgaXMgb25lIG9mIHRoZSBzdHJpbmdzIGluIHRoZSB0aGUgc3RyaW5nIGxpc3QKLSAqIHRoZW4gc2VsZWN0aW9uSW5kZXggd2lsbCBjb250YWluIHRoZSBpbmRleCBvZiB0aGlzIHN0cmluZy4gIElmIGl0Ci0gKiBpcyBub3QgaW4gdGhlIGxpc3QgdGhlbiB0aGUgc2VsZWN0aW9uVmFsdWUgc3RyaW5nIHdpbGwgY29udGFpbiB0aGlzCi0gKiB2YWx1ZSBhbmQgc2VsZWN0aW9uSW5kZXggd2lsbCBiZSBzZXQgdG8gLTEuICBUaGlzIGNsYXNzIGNhbiBiZQotICogdXNlZCB0byBzdG9yZSB0aGUgc3RhdGUgZGF0YSBmb3IgYSBDb21ibyBib3guCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25MaXN0Ci17Ci0gIHByaXZhdGUgaW50ICAgICAgc2VsZWN0aW9uSW5kZXhfOwotICBwcml2YXRlIFN0cmluZ1tdIGxpc3RfOwotICBwcml2YXRlIFN0cmluZyAgIHNlbGVjdGlvblZhbHVlXzsKLSAgCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0KCBTdHJpbmdbXSBsaXN0LCBpbnQgc2VsZWN0aW9uSW5kZXggKQotICB7Ci0gICAgbGlzdF8gICAgICAgICAgID0gbGlzdDsKLSAgICBzZWxlY3Rpb25JbmRleF8gPSBzZWxlY3Rpb25JbmRleDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIHNlbGVjdGlvbiB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVmFsdWUoIFN0cmluZyB2YWx1ZSApCi0gIHsKLSAgICBzZWxlY3Rpb25WYWx1ZV8gPSB2YWx1ZTsgIAotICAgIHNlbGVjdGlvbkluZGV4XyA9IC0xOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsaXN0Xy5sZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGlmKCB2YWx1ZS5lcXVhbHMoIGxpc3RfW2luZGV4XSApICkKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uSW5kZXhfID0gaW5kZXg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfSAKLSAgCi0gIC8qCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgc3RyaW5nIGxpc3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0TGlzdCgpCi0gIHsKLSAgICByZXR1cm4gbGlzdF87Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzdHJpbmcgaW4gdGhlIGxpc3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbmRleCggaW50IGluZGV4ICkKLSAgewotICAgIHNlbGVjdGlvbkluZGV4XyA9IGluZGV4OwotICAgIHNlbGVjdGlvblZhbHVlXyA9IG51bGw7Ci0gIH0KLSAKLSAgLyoKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzdHJpbmcuICBUaGUgdmFsdWUKLSAgICogd2lsbCBiZSAtMSBpZiB0aGUgc2VsZWN0aW9uIHZhbHVlIGlzIG5vdCBpbiB0aGUgc3RyaW5nIGxpc3QuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEluZGV4KCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25JbmRleF87ICAKLSAgfQotICAKLSAgLyoKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBjdXJyZW50IHN0cmluZyBzZWxlY3Rpb24gZm9yIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgaWYoIHNlbGVjdGlvblZhbHVlXyAhPSBudWxsICkgcmV0dXJuIHNlbGVjdGlvblZhbHVlXzsKLSAgICAKLSAgICBpZiggc2VsZWN0aW9uSW5kZXhfID09IC0xIHx8IHNlbGVjdGlvbkluZGV4XyA+IGxpc3RfLmxlbmd0aC0xICkKLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbGlzdF9bIHNlbGVjdGlvbkluZGV4XyBdOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvc2VsZWN0aW9uL1NlbGVjdGlvbkxpc3RDaG9pY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9zZWxlY3Rpb24vU2VsZWN0aW9uTGlzdENob2ljZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0NjI0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9zZWxlY3Rpb24vU2VsZWN0aW9uTGlzdENob2ljZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnNlbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHN0b3JlIGEgaGllcmFyY2h5IG9mIFNlbGVjdGlvbkxpc3QKLSAqIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25MaXN0Q2hvaWNlcwotewotICBwcml2YXRlIFNlbGVjdGlvbkxpc3Qgc2VsZWN0aW9uTGlzdF87Ci0gIHByaXZhdGUgVmVjdG9yICAgICAgICBjaG9pY2VzXzsKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0IG5ld1ZhbHVlU2VsZWN0aW9uTGlzdF87Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBsaXN0ICAgICBUaGUgc2VsZWN0aW9uIGxpc3QuCi0gICAqIEBwYXJhbSBjaG9pY2VzICBUaGlzIGlzIGEgdmVjdG9yIG9mIFNlbGVjdGlvbkxpc3RDaG9pZXMgYW5kIGNhbiBiZQotICAgKiAgICAgICAgICAgICAgICAgbnVsbCBpZiB0aGVyZSBhcmUgbm8gY2hvaWNlcy4gIFRoaXMgaW5kZXggb2YgbGlzdAotICAgKiAgICAgICAgICAgICAgICAgaXMgdXNlZCB0byBpbmRleCBpbnRvIGNob2ljZXMuICBJZiBpbmRleCBpcyAtMSB0aGVuCi0gICAqICAgICAgICAgICAgICAgICB0aGUgbmV3VmFsdWVTZWxlY3Rpb25MaXN0IGlzIHVzZWQuCi0gICAqLwotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMoIFNlbGVjdGlvbkxpc3QgbGlzdCwgVmVjdG9yIGNob2ljZXMgKQotICB7Ci0gICAgc2VsZWN0aW9uTGlzdF8gPSBsaXN0OwotICAgIGNob2ljZXNfICAgICAgID0gY2hvaWNlczsKLSAgICAKLSAgICBuZXdWYWx1ZVNlbGVjdGlvbkxpc3RfID0gbmV3IFNlbGVjdGlvbkxpc3QoIG5ldyBTdHJpbmdbMF0sIC0xICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyggU2VsZWN0aW9uTGlzdCBsaXN0LCBWZWN0b3IgY2hvaWNlcywgU2VsZWN0aW9uTGlzdCBuZXdMaXN0ICkKLSAgewotICAgIHRoaXMoIGxpc3QsIGNob2ljZXMgKTsKLSAgICBuZXdWYWx1ZVNlbGVjdGlvbkxpc3RfID0gbmV3TGlzdDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgY3VycmVudCBTZWxlY3Rpb24gbGlzdC4KLSAgICovCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0IGdldExpc3QoKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGlvbkxpc3RfOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgY2hvaWNlcyBmb3IgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldENob2ljZXMoKQotICB7Ci0gICAgcmV0dXJuIGNob2ljZXNfOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBsZXZlbCB0aGUgbGV2ZWwgaW4gdGhlIGhpZXJhcmNoeSB3aGVyZSB3ZSB3YW50IHRvIGdldCB0aGUgY2hvaWNlcy4KLSAgICogQHJldHVybiByZXR1cm5zIGEgdmVjdG9yIG9mIFNlbGVjdGlvbkxpc3RDaG9pY2VzLgotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRDaG9pY2VzQXRMZXZlbCggaW50IGxldmVsICkKLSAgewotICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNob2ljZXMgPSB0aGlzOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZXZlbDsgaW5kZXgrKyApCi0gICAgewotICAgICAgY2hvaWNlcyA9IGNob2ljZXMuZ2V0Q2hvaWNlKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBjaG9pY2VzLmdldENob2ljZXMoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGN1cnJlbnQgU2VsZWN0aW9uTGlzdENob2ljZQotICAgKi8KLSAgcHVibGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldENob2ljZSgpCi0gIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JbmRleCA9IHNlbGVjdGlvbkxpc3RfLmdldEluZGV4KCk7Ci0gICAgU2VsZWN0aW9uTGlzdENob2ljZXMgcmVzdWx0ICAgICAgICAgPSBudWxsOwotICAgIAotICAgIGlmKCBzZWxlY3Rpb25JbmRleCA9PSAtMSApCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKCBuZXdWYWx1ZVNlbGVjdGlvbkxpc3RfLCBudWxsICk7Ci0gICAgfQotICAgIGVsc2UgaWYoIGNob2ljZXNfICE9IG51bGwgJiYgY2hvaWNlc18uc2l6ZSgpICE9IDAgKSAKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoU2VsZWN0aW9uTGlzdENob2ljZXMpY2hvaWNlc18uZWxlbWVudEF0KCBzZWxlY3Rpb25JbmRleCApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGNob2ljZSB3ZSB3YW50LgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIFNlbGVjdGlvbkxpc3RDaG9pY2UgYXQgdGhlIGluZGV4IHNwZWNpZmllZC4KLSAgICovCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRDaG9pY2UoaW50IGluZGV4KQotICB7Ci0gICAgU2VsZWN0aW9uTGlzdENob2ljZXMgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGdldExpc3QoKS5nZXRMaXN0KCkubGVuZ3RoKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyggbmV3VmFsdWVTZWxlY3Rpb25MaXN0XywgbnVsbCApOyAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gKFNlbGVjdGlvbkxpc3RDaG9pY2VzKWNob2ljZXNfLmVsZW1lbnRBdCggaW5kZXggKTsKLSAgICB9Ci0gICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvTmF0aXZlRmlsZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9OYXRpdmVGaWxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2E4YjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9OYXRpdmVGaWxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUklFeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYXRpdmVGaWxlQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLSAgcHJvdGVjdGVkIFVSSVtdIHVyaXNUb1JlYWQ7Ci0KLSAgcHJvdGVjdGVkIFVSSVtdIHVyaXNUb1dyaXRlOwotCi0gIHByb3RlY3RlZCBOYXRpdmVGaWxlQ29tbWFuZCAoKQotICB7Ci0gICAgdGhpcyhudWxsLG51bGwpOwotICB9Ci0KLSAgcHJvdGVjdGVkIE5hdGl2ZUZpbGVDb21tYW5kICggU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiApCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpCi0gIHsKLSAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVUklzVG9SZWFkICggVVJJW10gdXJpc1RvUmVhZCApCi0gIHsKLSAgICB0aGlzLnVyaXNUb1JlYWQgPSB1cmlzVG9SZWFkOwotICB9Ci0KLSAgcHVibGljIFVSSVtdIGdldFVSSXNUb1JlYWQgKCkKLSAgewotICAgIHJldHVybiB1cmlzVG9SZWFkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VVJJc1RvV3JpdGUgKCBVUklbXSB1cmlzVG9Xcml0ZSApCi0gIHsKLSAgICB0aGlzLnVyaXNUb1dyaXRlID0gdXJpc1RvV3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgVVJJW10gZ2V0VVJJc1RvV3JpdGUgKCkKLSAgewotICAgIHJldHVybiB1cmlzVG9Xcml0ZTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZSAoIEVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIEZpbGVbXSBmaWxlc1RvUmVhZCA9IGdldEZpbGVzKHVyaXNUb1JlYWQpOwotICAgIEZpbGVbXSBmaWxlc1RvV3JpdGUgPSBnZXRGaWxlcyh1cmlzVG9Xcml0ZSk7Ci0gICAgcHJlUHJvY2VzcyhmaWxlc1RvUmVhZCxmaWxlc1RvV3JpdGUpOwotICAgIFN0YXR1cyBzdGF0dXMgPSBleGVjdXRlKGVudmlyb25tZW50LGZpbGVzVG9SZWFkLGZpbGVzVG9Xcml0ZSk7Ci0gICAgcG9zdFByb2Nlc3MoZmlsZXNUb1JlYWQsZmlsZXNUb1dyaXRlKTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IFN0YXR1cyBleGVjdXRlICggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIEZpbGVbXSBmaWxlc1RvUmVhZCwgRmlsZVtdIGZpbGVzVG9Xcml0ZSApOwotCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUgKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgdW5kbyAoIEVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWRvYWJsZSAoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyByZWRvICggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJlUHJvY2VzcyAoIEZpbGVbXSBmaWxlc1RvUmVhZCwgRmlsZVtdIGZpbGVzVG9Xcml0ZSApCi0gIHsKLSAgICAvLyBUQkQuCi0gIH0KLQotICBwcml2YXRlIHZvaWQgcG9zdFByb2Nlc3MgKCBGaWxlW10gZmlsZXNUb1JlYWQsIEZpbGVbXSBmaWxlc1RvV3JpdGUgKQotICB7Ci0gICAgLy8gVEJELgotICB9Ci0KLSAgcHJpdmF0ZSBGaWxlW10gZ2V0RmlsZXMgKCBVUklbXSB1cmlzICkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgaWYgKHVyaXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8dXJpcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHVyaXNbaV0uaXNBdmFpbGFibGVBc0ZpbGUoKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKHVyaXNbaV0uYXNGaWxlKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVVJJRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKEZpbGVbXSlsaXN0LnRvQXJyYXkobmV3IEZpbGVbMF0pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvUmVsYXRpdmVTY2hlbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9SZWxhdGl2ZVNjaGVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDdmOTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9SZWxhdGl2ZVNjaGVtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIFJlbGF0aXZlU2NoZW1lIGltcGxlbWVudHMgVVJJU2NoZW1lCi17Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI2lzSGllcmFyY2hpY2FsKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGllcmFyY2hpY2FsKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI2lzVmFsaWQob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFVSSSB1cmkpCi0gIHsKLSAgICByZXR1cm4gIXVyaS50b1N0cmluZygpLnN0YXJ0c1dpdGgoICIvIiApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI25ld1VSSShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkoU3RyaW5nIHVyaSkgCi0gIHsKLSAgICByZXR1cm4gbmV3IFJlbGF0aXZlVVJJKCB1cmkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSShVUkkgdXJpKSAKLSAgewotICAgIHJldHVybiBuZXcgUmVsYXRpdmVVUkkoIHVyaS50b1N0cmluZygpICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKGphdmEubmV0LlVSTCkKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFVSTCB1cmwpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJsLnRvU3RyaW5nKCkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSN2YWxpZGF0ZShvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgdmFsaWRhdGUoVVJJIHVyaSkKLSAgewotICAgIFN0YXR1cyByZXN1bHQgPSBudWxsOwotICAgIAotICAgIGlmKCBpc1ZhbGlkKCB1cmkgKSApCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsICIiLCBTdGF0dXMuT0sgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCAiIiwgU3RhdHVzLkVSUk9SICk7ICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9SZWxhdGl2ZVVSSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1JlbGF0aXZlVVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTc3ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1JlbGF0aXZlVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIFJlbGF0aXZlVVJJIGltcGxlbWVudHMgVVJJCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJpXzsKLSAgCi0gIHB1YmxpYyBSZWxhdGl2ZVVSSSggU3RyaW5nIHVyaSApCi0gIHsKLSAgICB1cmlfID0gdXJpOyAgIAotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXBwZW5kKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIFVSSSBhcHBlbmQoVVJJIHJlbGF0aXZlVVJJKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBpZiggIXJlbGF0aXZlVVJJLmlzUmVsYXRpdmUoKSkgCi0gICAgIHsKLSAgICAgIE1lc3NhZ2VVdGlscyBtc2cgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZW52aXJvbm1lbnQiLCBuZXcgRHVtbXkoKSApOwotICAgICAgCi0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiUmVsYXRpdmVVUkkiLCAKLSAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2UoICJNU0dfVVJJX05PVF9SRUxBVElWRSIsIG5ldyBPYmplY3RbXXsgcmVsYXRpdmVVUkkudG9TdHJpbmcoKSB9KSwKLSAgICAgICAgICAgICAgU3RhdHVzLkVSUk9SICkpOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgbmV3VVJJID0gdXJpXyArICIvIiArIHJlbGF0aXZlVVJJLnRvU3RyaW5nKCk7Ci0gICAgCi0gICAgcmV0dXJuIGdldFVSSVNjaGVtZSgpLm5ld1VSSSggbmV3VVJJICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNGaWxlKCkKLSAgICovCi0gIHB1YmxpYyBGaWxlIGFzRmlsZSgpIAotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNTdHJpbmcoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBhc1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gdXJpXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvU3RyaW5nKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIHVyaV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc1VSTCgpCi0gICAqLwotICBwdWJsaWMgVVJMIGFzVVJMKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgVVJMIHVybCA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgdXJsID0gbmV3IFVSTCggdXJpXyApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJSZWxhdGl2ZVVSSSIsIGV4Yy5nZXRNZXNzYWdlKCksIFN0YXR1cy5FUlJPUiApLAotICAgICAgICAgICAgdGhpcyApOyAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHVybDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNlcmFzZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldElucHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldE91dHB1dFN0cmVhbSgpCi0gICAqLwotICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldFVSSVNjaGVtZSgpCi0gICAqLwotICBwdWJsaWMgVVJJU2NoZW1lIGdldFVSSVNjaGVtZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFJlbGF0aXZlU2NoZW1lKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNBdmFpbGFibGVBc0ZpbGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc0ZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzQXZhaWxhYmxlQXNVUkwoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc1VSTCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0hpZXJhcmNoaWNhbCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0xlYWYoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMZWFmKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1ByZXNlbnQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1JlYWRhYmxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUmVsYXRpdmUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1dyaXRhYmxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV3JpdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2xpc3QoKQotICAgKi8KLSAgcHVibGljIFVSSVtdIGxpc3QoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3IFVSSVswXTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KG9yZy5lY2xpcHNlLmVudi51cmkuVVJJRmlsdGVyKQotICAgKi8KLSAgcHVibGljIFVSSVtdIGxpc3QoVVJJRmlsdGVyIHVyaUZpbHRlcikgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBVUklbMF07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjcGFyZW50KCkKLSAgICovCi0gIHB1YmxpYyBVUkkgcGFyZW50KCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgaW50IGxhc3RTbGFzaCAgPSB1cmlfLmxhc3RJbmRleE9mKCAnLycgKTsKLSAgICBpbnQgZmlyc3RTbGFzaCA9IHVyaV8uaW5kZXhPZiggJy8nICk7Ci0gICAgCi0gICAgLy8gSWYgdGhlcmUgaXMgYSBwYXJlbnQsIHRoZW4gaXQgbXVzdCBzdGFydCB3aXRoIGEgc2xhc2gKLSAgICAvLyBhbmQgZW5kIHdpdGggYSBzbGFzaC4KLSAgICBpZiggbGFzdFNsYXNoID09IC0xIHx8IGZpcnN0U2xhc2ggPT0gLTEgKSByZXR1cm4gbnVsbDsKLSAgICAgICAgCi0gICAgcmV0dXJuIGdldFVSSVNjaGVtZSgpLm5ld1VSSSggdXJpXy5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoICkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNyZW5hbWUob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW5hbWUoVVJJIG5ld1VSSSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgdXJpXyA9IG5ld1VSSS50b1N0cmluZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoRm9sZGVyKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoRm9sZGVyKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdG91Y2hMZWFmKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoTGVhZigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3Zpc2l0KG9yZy5lY2xpcHNlLmVudi51cmkuVVJJVmlzaXRvciwgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklGaWx0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChVUklWaXNpdG9yIHVyaVZpc2l0b3IsIFVSSUZpbHRlciB1cmlGaWx0ZXIpCi0gICAgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBjb250aW51ZVZpc2l0ID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBJZiB0aGUgZmlsdGVyIGFjY2VwdHMgdGhpcyB3ZSB3aWxsIHZpc2l0IGl0LgotICAgIGlmKCB1cmlGaWx0ZXIuYWNjZXB0cyggdGhpcyApICkKLSAgICB7Ci0gICAgICBjb250aW51ZVZpc2l0ID0gdXJpVmlzaXRvci52aXNpdCggdGhpcyApOyAgCi0gICAgfQotICAgICAgIAotICAgIFVSSVtdIGNoaWxkcmVuICA9IGxpc3QoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoICYmIGNvbnRpbnVlVmlzaXQ7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGNoaWxkcmVuW2luZGV4XS52aXNpdCggdXJpVmlzaXRvciwgdXJpRmlsdGVyICk7Ci0gICAgfSAgCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdmlzaXQob3JnLmVjbGlwc2UuZW52LnVyaS5VUklWaXNpdG9yKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoVVJJVmlzaXRvciB1cmlWaXNpdG9yKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIGNvbnRpbnVlVmlzaXQgPSB1cmlWaXNpdG9yLnZpc2l0KCB0aGlzICk7ICAKLSAgICAKLSAgICBVUklbXSBjaGlsZHJlbiAgPSBsaXN0KCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aCAmJiBjb250aW51ZVZpc2l0OyBpbmRleCsrICkKLSAgICAgewotICAgICAgY2hpbGRyZW5baW5kZXhdLnZpc2l0KCB1cmlWaXNpdG9yICk7Ci0gICAgfSAgCi0gIH0KLSAgICAKLSAgcHJpdmF0ZSBjbGFzcyBEdW1teSAKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvU2ltcGxlVVJJRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1NpbXBsZVVSSUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhYWYxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvU2ltcGxlVVJJRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVVUklGYWN0b3J5IGltcGxlbWVudHMgVVJJRmFjdG9yeQotewotICBwcml2YXRlIEhhc2h0YWJsZSAgICBzY2hlbWVzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnXyAgICAgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZW52aXJvbm1lbnQiLCB0aGlzICk7Ci0gIAotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgVVJJU2NoZW1lIHNjaGVtZSA9IG5ld1VSSVNjaGVtZSggdXJpICk7Ci0gICAgCi0gICAgcmV0dXJuIHNjaGVtZS5uZXdVUkkoIHVyaSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkoVVJMIHVybCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgVVJJU2NoZW1lIHNjaGVtZSA9IG5ld1VSSVNjaGVtZSggdXJsLnRvU3RyaW5nKCkgKTsKLSAgICAKLSAgICByZXR1cm4gc2NoZW1lLm5ld1VSSSggdXJsICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqLwotICBwdWJsaWMgVVJJU2NoZW1lIG5ld1VSSVNjaGVtZShTdHJpbmcgc2NoZW1lT3JVUkkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIFVSSVNjaGVtZSBuZXdTY2hlbWUgPSBudWxsOwotICAgIAotICAgIGlmKCBzY2hlbWVPclVSSSA9PSBudWxsICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICAgICAgbmV3IFNpbXBsZVN0YXR1cyggIlNpbXBsZVVSSUZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfLmdldE1lc3NhZ2UoICJNU0dfTlVMTF9BUkdfU1BFQ0lGSUVEIiwgbmV3IE9iamVjdFtdeyJuZXdVUklTY2hlbWUifSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiApICk7Ci0gICAgfQotICAgIAotICAgIGludCBjb2xvbiAgICA9IHNjaGVtZU9yVVJJLmluZGV4T2YoJzonKTsKLSAgICBpbnQgc2xhc2ggICAgPSBzY2hlbWVPclVSSS5pbmRleE9mKCcvJyk7Ci0gICAgCi0gICAgLy8gQSBwcm90b2NvbCB3YXMgc3BlY2lmaWVkLiAgTm90ZTogYSBjb2xvbiBhcHBlYXJpbmcgYWZ0ZXIgYSBwYXRoIGlzIG5vdAotICAgIC8vIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgcHJvdG9jb2wgZm9yIHRoaXMgVVJJLgotICAgIGlmKCAoY29sb24gIT0gLTEgJiYgc2xhc2ggPT0gLTEpIHx8ICggY29sb24gIT0gLTEgJiYgY29sb24gPCBzbGFzaCApICkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJvdG9jb2wgPSBzY2hlbWVPclVSSS5zdWJzdHJpbmcoMCwgY29sb24gKTsKLSAgICAgIG5ld1NjaGVtZSAgICAgICA9IChVUklTY2hlbWUpc2NoZW1lc18uZ2V0KCBwcm90b2NvbCApOwotICAgICAgCi0gICAgICBpZiggbmV3U2NoZW1lID09IG51bGwgKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJTaW1wbGVVUklGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICBtc2dfLmdldE1lc3NhZ2UoICJNU0dfU0NIRU1FX05PVF9GT1VORCIsIG5ldyBPYmplY3RbXXsgc2NoZW1lT3JVUkkgfSksCi0gICAgICAgICAgICAgICAgU3RhdHVzLkVSUk9SICkgKTsgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYoIHNjaGVtZU9yVVJJLnN0YXJ0c1dpdGgoICIvIikgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIAotICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJTaW1wbGVVUklGYWN0b3J5IiwKLSAgICAgICAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX0FCU09MVVRFX1BBVEhfV0lUSE9VVF9TQ0hFTUUiLCBuZXcgT2JqZWN0W117IHNjaGVtZU9yVVJJIH0pLAotICAgICAgICAgICAgICBTdGF0dXMuRVJST1IgKSApOwotICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBuZXdTY2hlbWUgPSBuZXcgUmVsYXRpdmVTY2hlbWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5ld1NjaGVtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJTY2hlbWUoIFN0cmluZyBwcm90b2NvbCwgVVJJU2NoZW1lIHNjaGVtZSApCi0gIHsKLSAgICBzY2hlbWVzXy5wdXQoIHByb3RvY29sLCBzY2hlbWUgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1VSSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1VSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YxMjc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBBIFVSSSByZXByZXNlbnRzIGEgVW5pdmVyYWwgUmVzb3VyY2UgSWRlbnRpZmVyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVSSQotewotICAvKioKLSAgICogUmV0dXJucyB0aGUgc3RyaW5nIGZvcm0gb2YgdGhlIFVSSS4KLSAgICogVGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJU2NoZW1lIGZvciB0aGUgc2NoZW1lIG9mIHRoaXMgVVJJLgotICAgKiBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0gICAqLwotICBwdWJsaWMgVVJJU2NoZW1lIGdldFVSSVNjaGVtZSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmZiB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIFVSSSBleGlzdHMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBVUkkgZXhpc3RzCi0gICAqIGFuZCBpcyBhIGxlYWYuIFJldHVybnMgdHJ1ZSBhbHdheXMgZm9yIG5vbi1oaWVyYXJjaGljYWwgc2NoZW1lcy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGVhZiAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmZiB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIFVSSSBleGlzdHMKLSAgICogYW5kIGlzIHJlYWRhYmxlLiBBIHJlYWRhYmxlIGxlYWYgcmVzb3VyY2UgaW5kaWNhdGVzIHRoYXQgYW4KLSAgICogaW5wdXQgc3RyZWFtIGNhbiBiZSBvcGVuZWQgb24gdGhlIHJlc291cmNlLiBBIHJlYWRhYmxlIGZvbGRlcgotICAgKiByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGZvbGRlciwgaWYgYW55LAotICAgKiBjYW4gYmUgZGV0ZXJtaW5lZCB2aWEgdGhlIGxpc3QoKSBvciB2aXNpdCgpIG1ldGhvZHMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgVVJJIGV4aXN0cwotICAgKiBhbmQgaXMgd3JpdGFibGUuIEEgd3JpdGFibGUgbGVhZiByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCBhbgotICAgKiBvdXRwdXQgc3RyZWFtIGNhbiBiZSBvcGVuZWQgb24gdGhlIHJlc291cmNlLiBBIHdyaXRhYmxlIGZvbGRlcgotICAgKiByZXNvdXJjZSBpbmRpY2F0ZXMgdGhhdCBuZXcgcmVzb3VyY2VzIGNhbiBiZSBjcmVhdGVkIGluIHRoZSBmb2xkZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRhYmxlICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWZmIHRoaXMgVVJJIGJlbG9uZ3MgdG8gYSBoaWVyYXJjaGljYWwgc2NoZW1lLgotICAgKiBUaGUgcmVzb3VyY2UgbmVlZCBub3QgZXhpc3QuCi0gICAqIHRoaXMuaXNIaWVyYXJjaGljYWwoKSA9PSB0aGlzLmdldFVSSVNjaGVtZSgpLmlzSGllcmFyY2hpY2FsKCkuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmZiB0aGlzIFVSSSBpcyBhIHJlbGF0aXZlIFVSSS4KLSAgICogVGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWxhdGl2ZSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIG9mIHRoZSBmb2xkZXIgY29udGFpbmluZyB0aGlzIFVSSS4KLSAgICogVGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotICAgKi8KLSAgcHVibGljIFVSSSBwYXJlbnQgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldywgbm9ybWFsaXplZCBVUkkgZm9ybWVkIGJ5IGFwcGVuZGluZyB0aGUgZ2l2ZW4KLSAgICogcmVsYXRpdmUgVVJJIHRvIHRoaXMgVVJJLiBCb3RoIFVSSXMgbXVzdCBiZSBoaWVyYXJjaGljYWwuCi0gICAqIFRoZSByZXN1bHRpbmcgVVJJIHdpbGwgYWx3YXlzIGJlIGhpZXJhcmNoaWNhbC4gVGhlIGdpdmVuCi0gICAqIFVSSSBtdXN0IGJlIHJlbGF0aXZlLiBUaGlzIFVSSSBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUuCi0gICAqIHRoZSByZXN1bHRpbmcgVVJJIHdpbGwgYmUgZXF1aXZhbGVudGx5IHJlbGF0aXZlIG9yIGFic29sdXRlLgotICAgKi8KLSAgcHVibGljIFVSSSBhcHBlbmQgKCBVUkkgcmVsYXRpdmVVUkkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBHZXRzIGFuIElucHV0U3RyZWFtIGZvciByZWFkaW5nIGZyb20gdGhlIHJlc291cmNlCi0gICAqIGlkZW50aWZpZWQgYnkgdGhpcyBsZWFmIG9yIG5vbi1oaWVyYXJjaGljYWwgVVJJLgotICAgKi8KLSAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEdldHMgYW4gT3V0cHV0U3RyZWFtIGZvciB3cml0aW5nIHRvIHRoZSByZXNvdXJjZQotICAgKiBpZGVudGlmaWVkIGJ5IHRoaXMgbGVhZiBvciBub24taGllcmFyY2hpY2FsIFVSSS4KLSAgICovCi0gIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHJlc291cmNlIGF0IHRoZSBsb2NhdGlvbiBpZGVudGlmaWVkIGJ5Ci0gICAqIHRoZSBVUkkuIE9uIGNvbXBsZXRpb24sIHRoaXMuaXNMZWFmKCkgPT0gdHJ1ZS4gSWYgYSBsZWFmCi0gICAqIHJlc291cmNlIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIElmIGEKLSAgICogbm9uLWxlYWYgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgdW5kZXIgdGhpcyBVUkksIGNyZWF0aW9uCi0gICAqIHdpbGwgZmFpbCBhbmQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hMZWFmICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgZm9sZGVyIHJlc291cmNlIGF0IHRoZSBsb2NhdGlvbiBpZGVudGlmaWVkIGJ5Ci0gICAqIHRoZSBVUkkuIFRoZSBzY2hlbWUgb2YgdGhlIFVSSSBtdXN0IGJlIGhpZXJhcmNoaWNhbC4KLSAgICogT24gY29tcGxldGlvbiwgdGhpcy5pc0xlYWYoKSA9PSBmYWxzZS4gSWYgYSBmb2xkZXIgcmVzb3VyY2UKLSAgICogYWxyZWFkeSBleGlzdHMsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4gSWYgYSBsZWFmIHJlc291cmNlCi0gICAqIGFscmVhZHkgZXhpc3RzIHVuZGVyIHRoaXMgVVJJLCBjcmVhdGlvbiB3aWxsIGZhaWwgYW5kIGFuCi0gICAqIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoRm9sZGVyICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEVyYXNlcyB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIFVSSS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVyYXNlICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJlbmFtZXMgb3IgbW92ZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBVUkkKLSAgICogdG8gdGhlIG5ldyBVUkkuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW5hbWUgKCBVUkkgbmV3VVJJICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogVmlzaXRzIHRoaXMgcmVzb3VyY2UgYW5kIGl0cyBkZWNlbmRhbnRzIGluIHByZS1vcmRlciBmYXNoaW9uLgotICAgKiBGb3IgZWFjaCByZXNvdXJjZSwgd2hldGhlciBhIGZvbGRlciBvciBhIGxlYWYsIHRoZSBnaXZlbgotICAgKiBVUklWaXNpdG9yJ3MgdmlzaXQoKSBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIFVSSSBvZiB0aGUKLSAgICogcmVzb3VyY2UuIElmIFVSSVZpc2l0b3IudmlzaXQoKSByZXR1cm5zIGZhbHNlLCB0aGUgdmlzaXRpbmcKLSAgICogYWxnb3JpdGhtIHdpbGwgInBydW5lIiB0aGUgZGVjZW5kYW50cyBvZiB0aGUgcmVzb3VyY2UgYW5kCi0gICAqIGNhcnJ5IG9uIHZpc2l0aW5nIHRoZSByZXN0IG9mIHRoZSB0cmVlLiBJZiBVUklWaXNpdG9yLnZpc2l0KCkKLSAgICogcmV0dXJucyB0cnVlLCB0aGUgdmlzaXRpbmcgYWxnb3JpdGhtIHdpbGwgY29udGludWUgaXRzIHdhbGsKLSAgICogZG93biB0aGUgcmVzb3VyY2UncyBkZXNjZW5kYW50cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0ICggVVJJVmlzaXRvciB1cmlWaXNpdG9yICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQXMgZm9yIHZpc2l0KFVSSVZpc2l0b3IpLCBleGNlcHQgb25seSByZXNvdXJjZSBVUklzIHRoYXQgYXJlCi0gICAqIGFjY2VwdGVkIGJ5IHRoZSBnaXZlbiBmaWx0ZXIgYXJlIHZpc2l0ZWQuIElmIGEgZm9sZGVyIHJlc291cmNlCi0gICAqIGZhaWxzIHRvIGJlIGFjY2VwdGVkIGJ5IHRoZSBmaWx0ZXIsIHRoaXMgd2lsbCBub3QgcHJldmVudCB0aGUKLSAgICogdmlzaXRpbmcgYWxnb3JpdGhtIGZyb20gd2Fsa2luZyB0aGUgcmVzb3VyY2UncyBkZXNjZW5kYW50cy4KLSAgICogSXQgcmVtYWlucyB0aGUgam9iIG9mIHRoZSB2aXNpdG9yIHRvIGNob29zZSB3aGV0aGVyIG9yIG5vdCB0bwotICAgKiBwcnVuZSBhIGJyYW5jaCBieSByZXR1cm5pbmcgZmFsc2Ugb3IgdHJ1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0ICggVVJJVmlzaXRvciB1cmlWaXNpdG9yLCBVUklGaWx0ZXIgdXJpRmlsdGVyICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgVVJJcyBmb3IgdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4KLSAgICogaGllcmFyY2hpY2FsLCBub24tbGVhZiBVUkkuIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbCwKLSAgICogdGhvdWdoIGl0IG1heSByZXR1cm4gYSB6ZXJvIGxlbmd0aCBhcnJheS4KLSAgICovCi0gIHB1YmxpYyBVUklbXSBsaXN0ICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEFzIGZvciBsaXN0KCksIGV4Y2VwdCBvbmx5IFVSSXMgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIGdpdmVuCi0gICAqIGZpbHRlciBhcmUgcmV0dXJuZWQgaW4gdGhlIGFycmF5LiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwsCi0gICAqIHRob3VnaCBpdCBtYXkgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkuCi0gICAqLwotICBwdWJsaWMgVVJJW10gbGlzdCAoIFVSSUZpbHRlciB1cmlGaWx0ZXIgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFzVVJMKCkgbWV0aG9kIGlzIGZhaXIgZ2FtZSwKLSAgICogaW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgVVJJIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhIFVSTC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNVUkwgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBVUkwgb2JqZWN0IGZvciB0aGUgcmVzb3VyY2UgdW5kZXIgdGhpcyBVUkkuCi0gICAqIFRoZXJlIGFyZSBtYW55IFVSSXMgYW5kIFVSSVNjaGVtZXMgZm9yIHdoaWNoIHRoaXMgbWV0aG9kCi0gICAqIHdpbGwgZmFpbCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5Ci0gICAqIGluIGNhc2VzIHdoZXJlIFVSSXMgYXJlIGtub3duIHRvIGJlIHJlcHJlc2VudGFibGUgYXMgVVJMcy4KLSAgICovCi0gIHB1YmxpYyBVUkwgYXNVUkwgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhc0ZpbGUoKSBtZXRob2QgaXMgZmFpciBnYW1lLAotICAgKiBpbiBvdGhlciB3b3JkcywgaWYgdGhpcyBVUkkgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGEgRmlsZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNGaWxlICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgRmlsZSBvYmplY3QgZm9yIHRoZSByZXNvdXJjZSB1bmRlciB0aGlzIFVSSS4KLSAgICogVGhlcmUgYXJlIG1hbnkgVVJJcyBhbmQgVVJJU2NoZW1lcyBmb3Igd2hpY2ggdGhpcyBtZXRob2QKLSAgICogd2lsbCBmYWlsIGFuZCB0aHJvdyBhbiBleGNlcHRpb24uIEl0IHNob3VsZCBiZSB1c2VkIG9ubHkKLSAgICogaW4gY2FzZXMgd2hlcmUgVVJJcyBhcmUga25vd24gdG8gYmUgYmFja2VkIGJ5IHBoeXNpY2FsIGZpbGVzLgotICAgKi8KLSAgcHVibGljIEZpbGUgYXNGaWxlICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBhcyBhIHN0cmluZy4KLSAgICogRXF1aXZhbGVudCB0byB0b1N0cmluZygpLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBhc1N0cmluZyAoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyNjIxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbW9zdCBleGNlcHRpb25zIHRocm93biBieSBVUkkgY2xhc3Nlcy4KLSAqIEV2ZXJ5IFVSSUV4Y2VwdGlvbiBjYXJyaWVzIGEgVVJJIGFuZCBhIFN0YXR1cywgZWFjaCBvZiB3aGljaCBtYXkKLSAqIGJlIG51bGwuIFRoZSBnZXRNZXNzYWdlKCkgbWV0aG9kIGFzIGluaGVyaXRlZCBmcm9tIEV4Y2VwdGlvbiB3aWxsCi0gKiByZXR1cm4gdGhlIG1lc3NhZ2UgZnJvbSB0aGUgVVJJRXhjZXB0aW4ncyBTdGF0dXMgb2JqZWN0LCBpZiBhbnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgLyoqCi0gICAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU4MTMwMjcxNDI0NzU2MDE4TDsKLQotICAvKioKLSAgICogQSBTdGF0dXMgb2JqZWN0IGNvbnRhaW5pbmcgZGV0YWlscyBhYm91dCB0aGUgZXhjZXB0aW9uLAotICAgKiBpZiBhcHBsaWNhYmxlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0YXR1cyBzdGF0dXM7Ci0KLSAgLyoqCi0gICAqIFRoZSBVUkkgZm9yIHdoaWNoIHRoZSBleGNlcHRpb24gb2NjdXJlZCwKLSAgICogaWYgYXBwbGljYWJsZS4KLSAgICovCi0gIHByb3RlY3RlZCBVUkkgdXJpOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBTdGF0dXMuCi0gICAqIFRoZSBzdGF0dXMgbWF5IGJlIG51bGwuCi0gICAqLwotICBwdWJsaWMgVVJJRXhjZXB0aW9uICggU3RhdHVzIHN0YXR1cyApCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgVVJJRXhjZXB0aW9uIGZvciB0aGUgZ2l2ZW4gU3RhdHVzIGFuZCBVUkksCi0gICAqIGVhY2ggb2Ygd2hpY2ggbWF5IGJlIG51bGwuCi0gICAqLwotICBwdWJsaWMgVVJJRXhjZXB0aW9uICggU3RhdHVzIHN0YXR1cywgVVJJIHVyaSApCi0gIHsKLSAgICBzdXBlcihzdGF0dXMgIT0gbnVsbCA/IHN0YXR1cy5nZXRNZXNzYWdlKCkgOiBudWxsKTsKLSAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKLSAgICB0aGlzLnVyaSA9IHVyaTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBTdGF0dXMgb2JqZWN0IGluc2lkZSB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzICgpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBpbnNpZGUgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgVVJJIGdldFVSSSAoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1VSSUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkN2I4ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1VSSUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFRoaXMgaXMgYSBmYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgVVJJIGFuZCBVUklTY2hlbWUgb2JqZWN0cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBVUklGYWN0b3J5Ci17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IFVSSSBmb3IgdGhlIGdpdmVuIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJICggU3RyaW5nIHVyaSApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgVVJJIGZvciB0aGUgZ2l2ZW4gVVJMLgotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkgKCBVUkwgdXJsICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBVUklTY2hlbWUgZm9yIHRoZSBnaXZlbiBzY2hlbWUgc3RyaW5nLgotICAgKiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbG9ucywgdGhlIGVudGlyZSBzdHJpbmcgaXMgaW50ZXJwcmV0dGVkCi0gICAqIGFzIHRoZSBuYW1lIG9mIHRoZSBzY2hlbWUuIElmIHRoZSBzdHJpbmcgY29udGFpbnMgYSBjb2xvbiwgdGhlbiB0aGUKLSAgICogc3Vic3RyaW5nIHVwIHRvIGJ1dCBleGNsdWRpbmcgdGhlIGZpcnN0IGNvbG9uIGlzIGludGVycHJldHRlZCBhcyB0aGUKLSAgICogbmFtZSBvZiB0aGUgc2NoZW1lLCBtZWFuaW5nIHRoZSBjYWxsZXIgY2FuIHBhc3MgaW4gYW55IFVSSSBzdHJpbmcgaW4KLSAgICogb3JkZXIgdG8gZ2V0IGEgVVJJU2NoZW1lIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBVUklTY2hlbWUgbmV3VVJJU2NoZW1lICggU3RyaW5nIHNjaGVtZU9yVVJJICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlYWI5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgb3IgbGlzdCBVUklzLgotICogUmVmZXIgdG8ge0BsaW5rIFVSSSNnZXRDaGlsZHJlbn0uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVVJJRmlsdGVyCi17Ci0gIC8qKgotICAgKiBGaWx0ZXJzIHRoZSBnaXZlbiBVUkkuCi0gICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIHRvIGZpbHRlci4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSByZXNvdXJjZSBtYXRjaGVzIHRoZSBmaWx0ZXIsCi0gICAqIGZhbHNlIGlmIGl0IGRvZXMgbm90LgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBJZiB0aGUgZmlsdGVyIGZhaWxzIHRvIGFuYWx5emUgdGhlIHJlc291cmNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyAoIFVSSSB1cmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1VSSVNjaGVtZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1VSSVNjaGVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjc3ZTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklTY2hlbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotLyoqCi0gKiBBIFVSSVNjaGVtZSByZXByZXNlbnRzIGEgc2luZ2xlIHNjaGVtZSBmb3Igc29tZSBhIGZhbWlseSBvZgotICogVW5pdmVyYWwgUmVzb3VyY2UgSWRlbnRpZmllcnMuIEV4YW1wbGVzIGluY2x1ZGUgImZpbGUiLCAiaHR0cCIKLSAqIGFuZCAicGxhdGZvcm0iIChFY2xpcHNlKS4KLSAqLwotcHVibGljIGludGVyZmFjZSBVUklTY2hlbWUKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgVVJJLgotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkgKCBTdHJpbmcgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBVUkkuCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSSAoIFVSTCB1cmwgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IFVSSS4KLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJICggVVJJIHVyaSApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHByb3BlciBuYW1lIG9mIHRoZSBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBpcyBhIGhpZXJhcmNoaWNhbCBzY2hlbWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBnaXZlbiBVUkkgc2F0aXNmaWVzIHRoZQotICAgKiBncmFtbWF0aWNhbCByZXF1aXJlbWVudHMgb2YgdGhlIHNjaGVtZS4gQWJzb2x1dGUgVVJJcyBtdXN0Ci0gICAqIGJlZ2luIHdpdGggIjxzY2hlbWU+OiIuIFJlbGF0aXZlIFVSSXMgbXVzdCBlaXRoZXIgbm90IGNvbnRhaW4KLSAgICogYSBjb2xvbiwgIjoiLCBvciBpdCBtdXN0IGJlZ2luIHdpdGggIi4vIi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQgKCBVUkkgdXJpICk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBTdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIGdpdmVuCi0gICAqIFVSSSBpcyB2YWxpZC4gVGhlIHNldmVyaXR5IGFuZCBtZXNzYWdlIG9mIHRoZSBTdGF0dXMgb2JqZWN0Ci0gICAqIHdpbGwgZGVzY3JpYmUgdGhpcy4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgdmFsaWRhdGUgKCBVUkkgdXJpICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvVVJJVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjliMzE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmk7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBzZXZlcmFsIHN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgZm9yCi0gKiB3b3JraW5nIHdpdGggVVJJcy4KLSAqLwotcHVibGljIGNsYXNzIFVSSVV0aWxzCi17Ci0gIC8qKgotICAgKiBDb3BpZXMgYWxsIGJ5dGVzIGZyb20gdGhlIG9sZCBVUkkgdG8gdGhlIG5ldyBVUkkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgY29weSAoIFVSSSBvbGRVcmksIFVSSSBuZXdVcmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBNb3ZlcyBvbmUgVVJJIHRvIGFub3RoZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbW92ZSAoIFVSSSBvbGRVcmksIFVSSSBuZXdVcmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCB0ZW1wb3JhcnkgbGVhZiBVUkkuCi0gICAqIFRoZSBzY2hlbWUgb2YgdGhlIFVSSSBtYXkgYmUsIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSwgImZpbGU6Ii4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGdldFRlbXBvcmFyeUxlYWZVUkkgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldywgdGVtcG9yYXJ5IGZvbGRlciBVUkkuCi0gICAqIFRoZSBzY2hlbWUgb2YgdGhlIFVSSSBtYXkgYmUsIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSwgImZpbGU6Ii4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGdldFRlbXBvcmFyeUZvbGRlclVSSSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1VSSVZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9VUklWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMTViZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvdXJpL1VSSVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB2aXNpdCBVUklzLgotICogUmVmZXIgdG8ge0BsaW5rIFVSSSN2aXNpdH0uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVVJJVmlzaXRvcgotewotICAvKioKLSAgICogVmlzaXRzIHRoZSBnaXZlbiBVUkkuCi0gICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIHRvIHZpc2l0LgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlc291cmNlJ3MgZGVzY2VuZGFudHMgc2hvdWxkIGJlIHZpc2l0ZWQsCi0gICAqIG9yIGZhbHNlIGlmIHRoZXkgc2hvdWxkIG5vdCBiZSB2aXNpdGVkLgotICAgKiBAdGhyb3dzIFVSSUV4Y2VwdGlvbiBJZiB0aGUgdmlzaXQgbWV0aG9kIGZhaWxzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gdmlzaXQgKCBVUkkgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9maWxlL0ZpbGVTY2hlbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9maWxlL0ZpbGVTY2hlbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1NzJmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvZmlsZS9GaWxlU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5maWxlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlJlbGF0aXZlU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5SZWxhdGl2ZVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJOwotCi0KLXB1YmxpYyBjbGFzcyBGaWxlU2NoZW1lIGV4dGVuZHMgUmVsYXRpdmVTY2hlbWUgCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNpc1ZhbGlkKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChVUkkgdXJpKQotICB7Ci0gICAgcmV0dXJuIHVyaS50b1N0cmluZygpLnN0YXJ0c1dpdGgoICJmaWxlOiIgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFN0cmluZyB1cmkpIAotICB7Ci0gICAgU3RyaW5nIG5ld1VSSSA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHVyaS5zdGFydHNXaXRoKCAiZmlsZToiKSApCi0gICAgewotICAgICAgLy8gVGhlIGZpbGUgcHJvdG9jb2wgaGFzIGJlZW4gc3BlY2lmaWVkIHNvIGtlZXAgaXQgYXMgaXMuCi0gICAgICBuZXdVUkkgPSB1cmk7Ci0gICAgfQotICAgIGVsc2UgaWYoIHVyaS5zdGFydHNXaXRoKCAiLyIpICkKLSAgICB7Ci0gICAgICAvLyBUaGUgZmlsZSBzY2hlbWUgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCBzbyB3ZSB3aWxsIGFkZCBpdC4KLSAgICAgIG5ld1VSSSA9ICJmaWxlOiIgKyB1cmk7Ci0gICAgfQotICAgIAotICAgIGlmKCBuZXdVUkkgPT0gbnVsbCApCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJpICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEZpbGVVUkkoIG5ld1VSSSApOwotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSShVUkkgdXJpKSAKLSAgewotICAgIHJldHVybiBuZXcgRmlsZVVSSSggdXJpLnRvU3RyaW5nKCkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkoamF2YS5uZXQuVVJMKQotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkoVVJMIHVybCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IEZpbGVVUkkoIHVybC50b1N0cmluZygpICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9maWxlL0ZpbGVVUkkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb3JlL3VyaS9maWxlL0ZpbGVVUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5MTY3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS91cmkvZmlsZS9GaWxlVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuZmlsZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlJlbGF0aXZlVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUklTY2hlbWU7Ci0KLQotcHVibGljIGNsYXNzIEZpbGVVUkkgZXh0ZW5kcyBSZWxhdGl2ZVVSSSAKLXsKLSAgcHJpdmF0ZSBGaWxlIGZpbGVfID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBGaWxlVVJJKCBTdHJpbmcgdXJpICkKLSAgewotICAgIHN1cGVyKCB1cmkgKTsKLSAgICAKLSAgICBpZiggZ2V0VVJJU2NoZW1lKCkuaXNWYWxpZCggdGhpcyApICkKLSAgICB7Ci0gICAgICBmaWxlXyA9IG5ldyBGaWxlKCB1cmkuc3Vic3RyaW5nKCA1LCB1cmkubGVuZ3RoKCkgKSApOwotICAgIH0KLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2FzRmlsZSgpCi0gICAqLwotICBwdWJsaWMgRmlsZSBhc0ZpbGUoKSAKLSAgewotICAgIHJldHVybiBmaWxlXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2VyYXNlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVyYXNlKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgZGVsZXRlRmlsZSggZmlsZV8gKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBkZWxldGVGaWxlKCBGaWxlIGZpbGUgKQotICB7Ci0gICAgaWYoIGZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgRmlsZVtdIGNoaWxkcmVuID0gZmlsZS5saXN0RmlsZXMoKTsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIEZpbGUgY2hpbGQgPSBjaGlsZHJlbltpbmRleF07Ci0gICAgICAgIAotICAgICAgICBpZiggY2hpbGQuaXNEaXJlY3RvcnkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICBkZWxldGVGaWxlKCBjaGlsZCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGZpbGUuZGVsZXRlKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRJbnB1dFN0cmVhbSgpCi0gICAqLwotICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlIHBhcmVudCA9IGZpbGVfLmdldFBhcmVudEZpbGUoKTsKLSAgICAgIHBhcmVudC5ta2RpcnMoKTsKLSAgICAgIAotICAgICAgc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSggZmlsZV8gKTsgIAotICAgIH0KLSAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIGV4Yy5nZXRNZXNzYWdlKCksIFN0YXR1cy5FUlJPUiwgZXhjICk7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBzdGF0dXMsIHRoaXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0cmVhbTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRPdXRwdXRTdHJlYW0oKQotICAgKi8KLSAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlXy5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAKLSAgICAgIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBmaWxlXyApOyAgCi0gICAgfQotICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgZXhjLmdldE1lc3NhZ2UoKSwgU3RhdHVzLkVSUk9SLCBleGMgKTsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIHN0YXR1cywgdGhpcyApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RyZWFtOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2dldFVSSVNjaGVtZSgpCi0gICAqLwotICBwdWJsaWMgVVJJU2NoZW1lIGdldFVSSVNjaGVtZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEZpbGVTY2hlbWUoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0F2YWlsYWJsZUFzRmlsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gZmlsZV8gIT0gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0F2YWlsYWJsZUFzVVJMKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNVUkwoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNMZWFmKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGVhZigpCi0gIHsKLSAgICByZXR1cm4gZmlsZV8uaXNGaWxlKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNQcmVzZW50KCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudCgpCi0gIHsKLSAgICByZXR1cm4gZmlsZV8uZXhpc3RzKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNSZWFkYWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKCkKLSAgewotICAgIHJldHVybiBmaWxlXy5jYW5SZWFkKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNXcml0YWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRhYmxlKCkKLSAgewotICAgIHJldHVybiBmaWxlXy5jYW5Xcml0ZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2xpc3QoKQotICAgKi8KLSAgcHVibGljIFVSSVtdIGxpc3QoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlW10gY2hpbGRyZW4gPSBmaWxlXy5saXN0RmlsZXMoKTsKLSAgICBVUklbXSAgVVJJcyAgICAgPSBuZXcgVVJJWzBdOwotICAgIAotICAgIGlmKCBjaGlsZHJlbiAhPSBudWxsICkKLSAgICB7Ci0gICAgICBpbnQgICBsZW5ndGggICA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICAgIAotICAgICAgVVJJcyA9IG5ldyBVUklbbGVuZ3RoXTsKLSAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBVUklzW2luZGV4XSA9IG5ldyBGaWxlVVJJKCAiZmlsZToiICsgY2hpbGRyZW5baW5kZXhdLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBVUklzOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2xpc3Qob3JnLmVjbGlwc2UuZW52LnVyaS5VUklGaWx0ZXIpCi0gICAqLwotICBwdWJsaWMgVVJJW10gbGlzdChVUklGaWx0ZXIgdXJpRmlsdGVyKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlW10gICBjaGlsZHJlbiA9IGZpbGVfLmxpc3RGaWxlcygpOwotICAgIGludCAgICAgIGxlbmd0aCAgID0gY2hpbGRyZW4gPT0gbnVsbCA/IDAgOiBjaGlsZHJlbi5sZW5ndGg7Ci0gICAgVmVjdG9yICAgVVJJcyAgICAgPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgVVJJIG5ld1VSSSA9IG5ldyBGaWxlVVJJKCAiZmlsZToiICsgY2hpbGRyZW5baW5kZXhdLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAKLSAgICAgIGlmKCB1cmlGaWx0ZXIuYWNjZXB0cyggbmV3VVJJKSApCi0gICAgICB7Ci0gICAgICAgIFVSSXMuYWRkKCBuZXdVUkkgKTsKLSAgICAgIH0gCi0gICAgfQotICAgIAotICAgIHJldHVybiAoVVJJW10pVVJJcy50b0FycmF5KCBuZXcgVVJJWzBdICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjcmVuYW1lKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVuYW1lKFVSSSBuZXdVUkkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHVyaV8gPSBuZXdVUkkudG9TdHJpbmcoKTsKLSAgICBmaWxlXy5yZW5hbWVUbyggbmV3IEZpbGUoIHVyaV8gKSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoRm9sZGVyKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoRm9sZGVyKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgZmlsZV8ubWtkaXJzKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjdG91Y2hMZWFmKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoTGVhZigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZm9sZGVycyBhcmUgY3JlYXRlZC4KLSAgICAgIEZpbGUgcGFyZW50ID0gZmlsZV8uZ2V0UGFyZW50RmlsZSgpOwotICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgICAgCi0gICAgICBmaWxlXy5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgZXhjLmdldE1lc3NhZ2UoKSwgU3RhdHVzLkVSUk9SLCBleGMgKTsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIHN0YXR1cywgdGhpcyApOyAgICAgIAotICAgIH0KLSAgfQotICAgIAotICBwcml2YXRlIGNsYXNzIER1bW15IAotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvQ2xhc3NFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZGF0YS9DbGFzc0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMDhkMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZGF0YS9DbGFzc0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc0VudHJ5Ci17Ci0gIHB1YmxpYyBPYmplY3QgbGFzdE9iamVjdF87Ci0gIHB1YmxpYyBWZWN0b3IgZ2V0dGVyTGlzdF87Ci0gIHB1YmxpYyBWZWN0b3Igc2V0dGVyTGlzdF87Ci0gIHB1YmxpYyBpbnQgICAgb3JkZXJfOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZGF0YS9EYXRhRmxvd01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvRGF0YUZsb3dNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYWM5MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZGF0YS9EYXRhRmxvd01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGE7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotCi1wdWJsaWMgY2xhc3MgRGF0YUZsb3dNYW5hZ2VyIAotewotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnlJbXBsIHJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgICAgICAgICAgICAgICBjbGFzc1RhYmxlXzsKLSAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgICBvcmRlcl87Ci0gIHByaXZhdGUgRW52aXJvbm1lbnQJCQkJZW52aXJvbm1lbnRfOwotICAKLSAgcHVibGljIERhdGFGbG93TWFuYWdlciggRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwgcmVnaXN0cnksIEVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIHJlZ2lzdHJ5XyAgID0gcmVnaXN0cnk7Ci0gICAgY2xhc3NUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgb3JkZXJfICAgICAgPSAwOwotICAgIGVudmlyb25tZW50XyA9IGVudmlyb25tZW50OwotICB9Ci0gIAotICBwdWJsaWMgRGF0YU1hcHBpbmdSZWdpc3RyeSBnZXRNYXBwaW5nUmVnaXN0cnkoKQotICB7Ci0gICAgcmV0dXJuIHJlZ2lzdHJ5XzsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3MoIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgLy8gQWRkIHRoaXMgb2JqZWN0IHRvIHRoZSBjbGFzc1RhYmxlXyBpZiByZXF1aXJlZC4KLSAgICBTdHJpbmcgICAgIG9iamVjdFR5cGUgPSBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgQ2xhc3NFbnRyeSBjbGFzc0VudHJ5ID0gKENsYXNzRW50cnkpY2xhc3NUYWJsZV8uZ2V0KCBvYmplY3RUeXBlICk7Ci0JCi0gICAgZW52aXJvbm1lbnRfLmdldExvZygpLmxvZyhMb2cuSU5GTywgImRhdGEiLCA1MDA0LCB0aGlzLCAicHJvY2VzcyIsICJQcm9jZXNzaW5nOiAiICsgb2JqZWN0VHlwZSApOwotICAgIAotICAgIGlmKCBjbGFzc0VudHJ5ID09IG51bGwgKQotICAgIHsKLSAgICAgIGNsYXNzRW50cnkgPSBuZXcgQ2xhc3NFbnRyeSgpOwotICAgICAgY2xhc3NUYWJsZV8ucHV0KCBvYmplY3RUeXBlLCBjbGFzc0VudHJ5ICk7Ci0gICAgfQotICAgIAotICAgIGNsYXNzRW50cnkubGFzdE9iamVjdF8gPSBvYmplY3Q7Ci0gICAgY2xhc3NFbnRyeS5vcmRlcl8gICAgICA9IG9yZGVyXysrOwotICAgIAotICAgIC8vIE5vdyBwcm9jZXNzIHRoZSBzZXR0ZXJzIGZvciB0aGlzIG9iamVjdAotICAgIFZlY3RvciBydWxlRW50cmllcyAgPSByZWdpc3RyeV8uZ2V0UnVsZUVudHJpZXMoIG9iamVjdFR5cGUgKTsKLSAgICAKLSAgICBpZiggcnVsZUVudHJpZXMgIT0gbnVsbCApCi0gICAgewotICAgICAgaWYoIGNsYXNzRW50cnkuc2V0dGVyTGlzdF8gPT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIGNsYXNzRW50cnkuc2V0dGVyTGlzdF8gPSBnZXRTZXR0ZXJMaXN0KCBvYmplY3QgKTsgIAotICAgICAgfSAgICAKLSAgICAgIAotICAgICAgLy8gRm9yIGVhY2ggc2V0dGVyIGluIHRoaXMgb2JqZWN0IHRyeSB0byBmaW5kIGEgcnVsZS4KLSAgICAgIGZvciggaW50IHNldHRlckluZGV4ID0gMDsgc2V0dGVySW5kZXggPCBjbGFzc0VudHJ5LnNldHRlckxpc3RfLnNpemUoKTsgc2V0dGVySW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdE1ldGhvZCBjdXJyZW50T2JqZWN0TWV0aG9kID0gbmV3IE9iamVjdE1ldGhvZCgpOwotICAgICAgICBNZXRob2QgICAgICAgc2V0dGVyTWV0aG9kICAgICAgICA9IChNZXRob2QpY2xhc3NFbnRyeS5zZXR0ZXJMaXN0Xy5lbGVtZW50QXQoIHNldHRlckluZGV4ICk7Ci0gICAgICAgIFJ1bGVFbnRyeSAgICBjdXJyZW50UnVsZUVudHJ5ICAgID0gbnVsbDsKLQotICAgICAgICBjdXJyZW50T2JqZWN0TWV0aG9kLm9yZGVyID0gLTE7Ci0gICAgICAgIAotICAgICAgICAvLyBGaW5kIHJ1bGVzIHRoYXQgbWF0Y2ggdGhpcyBzZXR0ZXIuICBOb3RlOiB0aGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBydWxlCi0gICAgICAgIC8vIHRoYXQgbWF0Y2hlcyB0aGlzIHNldHRlci4gIEluIHRoaXMgY2FzZSB3ZSB1c2UgdGhlIG1vc3QgcmVjZW50LCB3aGljaCBpcyAKLSAgICAgICAgLy8gZGVmaW5lZCBieSB0aGUgb3JkZXIgZmllbGQuCi0gICAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBydWxlRW50cmllcy5zaXplKCk7IGluZGV4KysgKQotICAgICAgICB7Ci0gICAgICAgICAgUnVsZUVudHJ5IHJ1bGVFbnRyeSA9IChSdWxlRW50cnkpcnVsZUVudHJpZXMuZWxlbWVudEF0KCBpbmRleCApOyAgICAgICAKLSAgICAgICAgICAKLSAgICAgICAgICBpZiggc2V0dGVyTWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoICJzZXQiICsgcnVsZUVudHJ5LnRhcmdldFByb3BlcnR5XyApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXZSBmb3VuZCBhIHNldHRlciBmb3IgdGhpcyBydWxlLiAgTm93IGZpbmQgdGhlIGdldHRlciBtZXRob2QuCi0gICAgICAgICAgICAvLyBOb3RlOiBnZXRHZXR0ZXJNZXRob2QgYWx3YXlzIHJldHVybnMgYSB2YWx1ZSwgYnV0IGlmIHRoZXJlIGlzIG5vCi0gICAgICAgICAgICAvLyAgICAgICBnZXR0ZXJzIGF2YWlsYWJsZSBpdCB3aWxsIHNldCB0aGUgb3JkZXIgdG8gLTEuCi0gICAgICAgICAgICBPYmplY3RNZXRob2QgZ2V0dGVyID0gZ2V0R2V0dGVyTWV0aG9kKCBydWxlRW50cnkuc291cmNlVHlwZV8sIHJ1bGVFbnRyeS5zb3VyY2VQcm9wZXJ0eV8gKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGdldHRlci5vcmRlciA9PSAtMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJZW52aXJvbm1lbnRfLmdldExvZygpLmxvZyhMb2cuSU5GTyAsICJkYXRhIiwgNTAwNSwgdGhpcywgInByb2Nlc3MiLCAiICA+Pk5vIGdldHRlciBmb3VuZCBmb3IgcHJvcGVydHk6ICIgKyBzZXR0ZXJNZXRob2QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGN1cnJlbnRPYmplY3RNZXRob2Qub3JkZXIgPCBnZXR0ZXIub3JkZXIgKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBtb3JlIHJlY2VudCBnZXR0ZXIuCi0gICAgICAgICAgICAgIGN1cnJlbnRPYmplY3RNZXRob2QgPSBnZXR0ZXI7Ci0gICAgICAgICAgICAgIGN1cnJlbnRSdWxlRW50cnkgPSBydWxlRW50cnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IAotICAgICAgICAKLSAgICAgICAgaWYoIGN1cnJlbnRPYmplY3RNZXRob2Qub3JkZXIgIT0gLTEgKQotICAgICAgICB7Ci0gICAgICAgICAgaW52b2tlTWV0aG9kKCBjdXJyZW50T2JqZWN0TWV0aG9kLm9iamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0TWV0aG9kLm1ldGhvZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGVyTWV0aG9kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSdWxlRW50cnkudHJhbnNmb3JtZXJfICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAllbnZpcm9ubWVudF8uZ2V0TG9nKCkubG9nKExvZy5JTkZPLCAiZGF0YSIsIDUwMDYsIHRoaXMsICJwcm9jZXNzIiwgIiAgPj5ObyBydWxlIGZvdW5kIGZvciBzZXR0ZXI6ICIgKyBzZXR0ZXJNZXRob2QuZ2V0TmFtZSgpICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBGaW5kIGFsbCB0aGUgc2V0dGVycyBmb3IgdGhpcyBvYmplY3QgYW5kIHJldHVybiBhIHZlY3RvciBvZiB0aGVtLgotICAgKiAKLSAgICogQHBhcmFtIG9iamVjdAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIFZlY3RvciBnZXRTZXR0ZXJMaXN0KCBPYmplY3Qgb2JqZWN0ICkKLSAgewotICAgIFZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgTWV0aG9kW10gbWV0aG9kcyA9IG9iamVjdC5nZXRDbGFzcygpLmdldE1ldGhvZHMoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbWV0aG9kcy5sZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIE1ldGhvZCAgbWV0aG9kICAgICA9IG1ldGhvZHNbaW5kZXhdOwotICAgICAgYm9vbGVhbiBpc1B1YmxpYyAgID0gTW9kaWZpZXIuaXNQdWJsaWMoIG1ldGhvZC5nZXRNb2RpZmllcnMoKSApOwotICAgICAgQ2xhc3MgICByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAKLSAgICAgIGlmKCBpc1B1YmxpYyAmJiAKLSAgICAgICAgICByZXR1cm5UeXBlID09IFZvaWQuVFlQRSAmJiAKLSAgICAgICAgICBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMSAmJgotICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aCggInNldCIgKSkKLSAgICAgIHsKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUoIHRydWUgKTsKLSAgICAgICAgcmVzdWx0LmFkZCggbWV0aG9kICk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgT2JqZWN0TWV0aG9kIGdldEdldHRlck1ldGhvZCggU3RyaW5nIHNvdXJjZVR5cGUsIFN0cmluZyBzb3VyY2VQcm9wZXJ0eSApCi0gIHsKLSAgICBDbGFzc0VudHJ5ICAgY2xhc3NFbnRyeSA9IChDbGFzc0VudHJ5KWNsYXNzVGFibGVfLmdldCggc291cmNlVHlwZSApOwotICAgIE9iamVjdE1ldGhvZCBnZXR0ZXJGb3VuZCA9IG5ldyBPYmplY3RNZXRob2QoKTsKLSAgICAKLSAgICAvLyBJbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIGdldHRlciB5ZXQuCi0gICAgZ2V0dGVyRm91bmQub3JkZXIgPSAtMTsKLSAgICAKLSAgICBpZiggY2xhc3NFbnRyeSAhPSBudWxsICkKLSAgICB7Ci0gICAgICBpZiggY2xhc3NFbnRyeS5nZXR0ZXJMaXN0XyA9PSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgLy8gQnVpbGQgdGhlIGdldHRlciBsaXN0LgotICAgICAgICBjbGFzc0VudHJ5LmdldHRlckxpc3RfID0gZ2V0R2V0dGVyTGlzdCggY2xhc3NFbnRyeS5sYXN0T2JqZWN0XyApOwotICAgICAgfQotICAgICAgCi0gICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2xhc3NFbnRyeS5nZXR0ZXJMaXN0Xy5zaXplKCk7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBNZXRob2QgZ2V0dGVyID0gKE1ldGhvZCljbGFzc0VudHJ5LmdldHRlckxpc3RfLmVsZW1lbnRBdCggaW5kZXggKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBnZXR0ZXIuZ2V0TmFtZSgpLmVxdWFscyggImdldCIgKyBzb3VyY2VQcm9wZXJ0eSApKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0dGVyRm91bmQub3JkZXIgID0gY2xhc3NFbnRyeS5vcmRlcl87Ci0gICAgICAgICAgZ2V0dGVyRm91bmQubWV0aG9kID0gZ2V0dGVyOwotICAgICAgICAgIGdldHRlckZvdW5kLm9iamVjdCA9IGNsYXNzRW50cnkubGFzdE9iamVjdF87Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGdldHRlckZvdW5kOwotICB9Ci0gIAotICBwcml2YXRlIFZlY3RvciBnZXRHZXR0ZXJMaXN0KCBPYmplY3Qgb2JqZWN0ICkKLSAgewotICAgIFZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgTWV0aG9kW10gbWV0aG9kcyA9IG9iamVjdC5nZXRDbGFzcygpLmdldE1ldGhvZHMoKTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbWV0aG9kcy5sZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIE1ldGhvZCAgbWV0aG9kICAgICA9IG1ldGhvZHNbaW5kZXhdOwotICAgICAgYm9vbGVhbiBpc1B1YmxpYyAgID0gTW9kaWZpZXIuaXNQdWJsaWMoIG1ldGhvZC5nZXRNb2RpZmllcnMoKSApOwotICAgICAgQ2xhc3MgICByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAKLSAgICAgIGlmKCBpc1B1YmxpYyAmJiAKLSAgICAgICAgICByZXR1cm5UeXBlICE9IFZvaWQuVFlQRSAmJiAKLSAgICAgICAgICBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMCAmJgotICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aCggImdldCIgKSkKLSAgICAgIHsKLSAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUoIHRydWUgKTsKLSAgICAgICAgcmVzdWx0LmFkZCggbWV0aG9kICk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgICAKLSAgcHJpdmF0ZSB2b2lkIGludm9rZU1ldGhvZCggT2JqZWN0ICAgICAgc291cmNlT2JqZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kICAgICAgc291cmNlTWV0aG9kICwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCAgICAgIGNsaWVudE9iamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCAgICAgIGNsaWVudE1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpCi0gIHsgIAkKLSAgCU9iamVjdCBkYXRhID0gbnVsbDsKLSAgCSAgCSAgCQotICAJdHJ5Ci0gIAl7Ci0gIAkgIGRhdGEgPSBzb3VyY2VNZXRob2QuaW52b2tlKCBzb3VyY2VPYmplY3QsIG5ldyBPYmplY3RbMF0gKTsKLSAgCX0KLSAgCWNhdGNoKCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YyApCi0gIAl7Ci0gIAkgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIC8vIHBnbSBOZWVkIHRvIGV4dGVybmFsaXplIHRoaXMgc3RyaW5nLgotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlByb3ZpZGVyIFwiIiArIHNvdXJjZU9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgdGhyZXcgYW4gZXhjZXB0aW9uLiIgKTsKLSAgCX0KLSAgCWNhdGNoKCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4YyApCi0gIAl7Ci0gIAkgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIC8vIHBnbSBOZWVkIHRvIGV4dGVybmFsaXplIHRoaXMgc3RyaW5nLgotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlByb3ZpZGVyIFwiIiArIHNvdXJjZU9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIHRocmV3IGFuIGV4Y2VwdGlvbi4iICk7Ci0gIAl9Ci0gIAkKLSAgCWVudmlyb25tZW50Xy5nZXRMb2coKS5sb2coTG9nLklORk8sICJkYXRhIiwgNTAwNywgdGhpcywgImludm9rZU1ldGhvZCAiLCIgIFNldHRpbmcgcHJvcDogIiArIGNsaWVudE1ldGhvZC5nZXROYW1lKCkgKyAiIGRhdGE9IiArIGRhdGEgKyAiIGZyb206ICIgKyBzb3VyY2VPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLSAgCQotICAJCi0gIAlpZiggdHJhbnNmb3JtZXIgIT0gbnVsbCApCi0gIAl7Ci0gIAkgIGRhdGEgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oIGRhdGEgKTsgIAkgICAgCi0gIAl9Ci0gIAkKLSAgCXRyeQotICAJeyAgCSAgCi0gIAkgIGNsaWVudE1ldGhvZC5pbnZva2UoIGNsaWVudE9iamVjdCwgbmV3IE9iamVjdFtdeyBkYXRhIH0gKTsKLSAgCX0KLSAgCWNhdGNoKCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YyApCi0gIAl7Ci0gIAkgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIC8vIHBnbSBOZWVkIHRvIGV4dGVybmFsaXplIHRoaXMgc3RyaW5nLgotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkNsaWVudCBcIiIgKyBjbGllbnRPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIHRocmV3IGFuIGV4Y2VwdGlvbi4iICk7Ci0gIAl9Ci0gIAljYXRjaCggSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleGMgKQotICAJewotICAJICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAvLyBwZ20gTmVlZCB0byBleHRlcm5hbGl6ZSB0aGlzIHN0cmluZy4KLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJDbGllbnQgXCIiICsgY2xpZW50T2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiB0aHJldyBhbiBleGNlcHRpb24uIiApOwotICAJfQotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIE9iamVjdE1ldGhvZAotICB7Ci0gICAgcHVibGljIE9iamVjdCBvYmplY3Q7Ci0gICAgcHVibGljIE1ldGhvZCBtZXRob2Q7Ci0gICAgcHVibGljIGludCAgICBvcmRlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZGF0YS9EYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZGF0YS9EYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzJhMDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotCi1wdWJsaWMgY2xhc3MgRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwgaW1wbGVtZW50cyBEYXRhTWFwcGluZ1JlZ2lzdHJ5Ci17ICAKLSAgcHJpdmF0ZSBIYXNodGFibGUgcnVsZXNUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgcHVibGljIFZlY3RvciBnZXRSdWxlRW50cmllcyggU3RyaW5nIHRhcmdldFR5cGUgKQotICB7Ci0gICAgcmV0dXJuIChWZWN0b3IpcnVsZXNUYWJsZV8uZ2V0KCB0YXJnZXRUeXBlICk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkjYWRkTWFwcGluZyhqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5DbGFzcywgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoIENsYXNzIHNvdXJjZVR5cGUsIFN0cmluZyBzb3VyY2VQcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdGFyZ2V0VHlwZSwgU3RyaW5nIHRhcmdldFByb3BlcnR5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIAotICB7Ci0gICAgVmVjdG9yICAgIHJ1bGVFbnRyaWVzID0gKFZlY3RvcilydWxlc1RhYmxlXy5nZXQoIHRhcmdldFR5cGUuZ2V0TmFtZSgpICk7Ci0gICAgUnVsZUVudHJ5IHJ1bGVFbnRyeSAgID0gbnVsbDsKLSAgICAKLSAgICBpZiggcnVsZUVudHJpZXMgPT0gbnVsbCApCi0gICAgewotICAgICAgcnVsZUVudHJpZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBydWxlc1RhYmxlXy5wdXQoIHRhcmdldFR5cGUuZ2V0TmFtZSgpLCBydWxlRW50cmllcyApOwotICAgIH0KLSAgICAKLSAgICAvLyBGaW5kIHRoZSBydWxlIGVudHJ5Ci0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHJ1bGVFbnRyaWVzLnNpemUoKTsgaW5kZXgrKyApCi0gICAgewotICAgICAgUnVsZUVudHJ5IG5ld0VudHJ5ID0gKFJ1bGVFbnRyeSlydWxlRW50cmllcy5lbGVtZW50QXQoIGluZGV4ICk7Ci0gICAgCi0gICAgICBpZiggc291cmNlUHJvcGVydHkuZXF1YWxzKCBuZXdFbnRyeS5zb3VyY2VQcm9wZXJ0eV8gKSAmJgotICAgICAgICAgIHNvdXJjZVR5cGUuZXF1YWxzKCBuZXdFbnRyeS5zb3VyY2VUeXBlXyApICYmCi0gICAgICAgICAgdGFyZ2V0UHJvcGVydHkuZXF1YWxzKCBuZXdFbnRyeS50YXJnZXRQcm9wZXJ0eV8gKSApCi0gICAgICB7Ci0gICAgICAgIC8vIFRoZSBlbnRyeSBhbHJlYWR5IGV4aXN0cwotICAgICAgICBydWxlRW50cnkgPSBuZXdFbnRyeTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmKCBydWxlRW50cnkgPT0gbnVsbCApCi0gICAgewotICAgICAgLy8gVGhlIHJ1bGUgZGlkbid0IGV4aXN0IGFscmVhZHkgc28gd2Ugd2lsbCBjcmVhdGUgYSBuZXcgb25lLgotICAgICAgcnVsZUVudHJ5ID0gbmV3IFJ1bGVFbnRyeShzb3VyY2VUeXBlLmdldE5hbWUoKSwgc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5LCB0cmFuc2Zvcm1lciApOwotICAgICAgcnVsZUVudHJpZXMuYWRkKCBydWxlRW50cnkgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIEp1c3QgdXBkYXRlIHRoZSB0cmFuc2Zvcm1lci4KLSAgICAgIHJ1bGVFbnRyeS50cmFuc2Zvcm1lcl8gPSB0cmFuc2Zvcm1lcjsgIAotICAgIH0KLSAgfQotICAgIAotICAgIC8vcnVsZUVudHJpZXNfLgotLy8gICAgU3RyaW5nICAgIHNvdXJjZUNsYXNzID0gc291cmNlVHlwZS5nZXROYW1lKCk7Ci0vLyAgICBTdHJpbmcgICAgdGFyZ2V0Q2xhc3MgPSB0YXJnZXRUeXBlLmdldE5hbWUoKTsKLS8vICAgIFZlY3RvciAgICBlbnRyaWVzICAgICA9IChWZWN0b3IpcnVsZUVudHJpZXNfLmdldCggc291cmNlQ2xhc3MgKTsgCi0vLyAgICBSdWxlRW50cnkgcnVsZUVudHJ5ICAgPSBudWxsOwotLy8gICAgCi0vLyAgICBpZiggZW50cmllcyAhPSBudWxsICkKLS8vICAgIHsKLS8vICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgbWFwcGluZyBhbHJlYWR5IGV4aXN0cy4KLS8vICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVudHJpZXMuc2l6ZSgpOyBpbmRleCsrICkKLS8vICAgICAgewotLy8gICAgICAgIFJ1bGVFbnRyeSBmb3VuZEVudHJ5ID0gKFJ1bGVFbnRyeSllbnRyaWVzLmVsZW1lbnRBdCggaW5kZXggKTsKLS8vICAgICAgICAKLS8vICAgICAgICBpZiggc291cmNlUHJvcGVydHkuZXF1YWxzKCBmb3VuZEVudHJ5LnNvdXJjZVByb3BlcnR5XyApICYmCi0vLyAgICAgICAgICAgIHRhcmdldFR5cGUuZXF1YWxzKCBmb3VuZEVudHJ5LnRhcmdldFR5cGVfICkgJiYKLS8vICAgICAgICAgICAgdGFyZ2V0UHJvcGVydHkuZXF1YWxzKCBmb3VuZEVudHJ5LnRhcmdldFByb3BlcnR5XyApICkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBydWxlRW50cnkgPSBmb3VuZEVudHJ5OwotLy8gICAgICAgICAgcnVsZUVudHJ5LnRyYW5zZm9ybWVyXyA9IHRyYW5zZm9ybWVyOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICAKLS8vICAgICAgLy8gVGhlcmUgaXMgYW4gZXhpc3RpbmcgdmVjdG9yIGZvciB0aGlzIHNvdXJjZUNsYXNzLCBidXQgaXQgZGlkbid0Ci0vLyAgICAgIC8vIGNvbnRhaW4gdGhpcyBuZXcgcnVsZSBzbyB3ZSB3aWxsIGFkZCBpdCBpbi4KLS8vICAgICAgaWYoIHJ1bGVFbnRyeSA9PSBudWxsICkKLS8vICAgICAgewotLy8gICAgICAgIHJ1bGVFbnRyeSA9IG5ldyBSdWxlRW50cnkoIHNvdXJjZVByb3BlcnR5LCB0YXJnZXRDbGFzcywgdGFyZ2V0UHJvcGVydHksIHRyYW5zZm9ybWVyICk7Ci0vLyAgICAgICAgZW50cmllcy5hZGQoIHJ1bGVFbnRyeSApOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICBlbHNlCi0vLyAgICB7Ci0vLyAgICAgIC8vIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHZlY3RvciBmb3IgdGhpcyBzb3VyY2VDbGFzcy4KLS8vICAgICAgZW50cmllcyA9IG5ldyBWZWN0b3IoKTsKLS8vICAgICAgcnVsZUVudHJ5ID0gbmV3IFJ1bGVFbnRyeSggc291cmNlUHJvcGVydHksIHRhcmdldENsYXNzLCB0YXJnZXRQcm9wZXJ0eSwgdHJhbnNmb3JtZXIgKTsKLS8vICAgICAgZW50cmllcy5hZGQoIHJ1bGVFbnRyeSApOwotLy8gICAgICBydWxlRW50cmllc18ucHV0KCBzb3VyY2VDbGFzcywgZW50cmllcyApOyAgCi0vLyAgICB9ICAgIAotLy8gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkjYWRkTWFwcGluZyhqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5DbGFzcykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoQ2xhc3Mgc291cmNlVHlwZSwgU3RyaW5nIHNvdXJjZVByb3BlcnR5LCBDbGFzcyB0YXJnZXRUeXBlKSAKLSAgewotICAgIGFkZE1hcHBpbmcoIHNvdXJjZVR5cGUsIHNvdXJjZVByb3BlcnR5LCB0YXJnZXRUeXBlLCBzb3VyY2VQcm9wZXJ0eSwgbnVsbCApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9kYXRhL1J1bGVFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZGF0YS9SdWxlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzOTczNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9kYXRhL1J1bGVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIFJ1bGVFbnRyeSAKLXsKLSAgcHVibGljIFN0cmluZyAgICAgIHNvdXJjZVR5cGVfOwotICBwdWJsaWMgU3RyaW5nICAgICAgc291cmNlUHJvcGVydHlfOwotICBwdWJsaWMgU3RyaW5nICAgICAgdGFyZ2V0UHJvcGVydHlfOwotICBwdWJsaWMgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXJfOwotICAKLSAKLSAgcHVibGljIFJ1bGVFbnRyeSggU3RyaW5nIHNvdXJjZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3VyY2VQcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5LCAKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgKQotICB7Ci0gICAgc291cmNlVHlwZV8gICAgID0gc291cmNlVHlwZTsKLSAgICBzb3VyY2VQcm9wZXJ0eV8gPSBzb3VyY2VQcm9wZXJ0eTsKLSAgICB0YXJnZXRQcm9wZXJ0eV8gPSB0YXJnZXRQcm9wZXJ0eTsgICAgCi0gICAgdHJhbnNmb3JtZXJfICAgID0gdHJhbnNmb3JtZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lDb21tYW5kRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSUNvbW1hbmRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjE1ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSUNvbW1hbmRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kOwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJldHVybiBhIHNlcXVlbmNlIG9mIENvbW1hbmRzLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tbWFuZEZhY3RvcnkgZXh0ZW5kcyBJdGVyYXRvciAKLXsKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgQ29tbWFuZCBpbiB0aGUgc2VxdWVuY2UuCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZCBnZXROZXh0Q29tbWFuZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU2ltcGxlQ29tbWFuZEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL1NpbXBsZUNvbW1hbmRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMmExN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU2ltcGxlQ29tbWFuZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZDsKLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbW1hbmRGYWN0b3J5IGltcGxlbWVudHMgSUNvbW1hbmRGYWN0b3J5IAotewotICAgIHByaXZhdGUgVmVjdG9yIGNvbW1hbmRzXzsKLQlwcml2YXRlIGludCAgICBpbmRleF87Ci0JCi0JcHVibGljIFNpbXBsZUNvbW1hbmRGYWN0b3J5KCBWZWN0b3IgY29tbWFuZHMgKQotCXsKLQkgIGNvbW1hbmRzXyA9IGNvbW1hbmRzOwotCSAgaW5kZXhfICAgID0gMDsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmQgZ2V0TmV4dENvbW1hbmQoKSAKLQl7Ci0JCXJldHVybiAoQ29tbWFuZCluZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgCi0JewotICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIAotCXsKLQkJcmV0dXJuIGluZGV4XyA8IGNvbW1hbmRzXy5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBuZXh0KCkgCi0JewotCQlyZXR1cm4gY29tbWFuZHNfLmVsZW1lbnRBdChpbmRleF8rKyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOTBmYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXJ1bnRpbWUKLXRlbXAuZm9sZGVyCi1lbnYuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTBiNzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5lbnYgcGx1Z2luLgotCi0jIFR1cm4gb24gZGVidWdnaW5nIG1hc3RlciBzd2l0Y2ggZm9yIHRoZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYgcGx1Z2luLgotb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L2RlYnVnPXRydWUKLQotIyBUdXJuIG9uIGRpZmZlcmVudCB0cmFjaW5nIGxldmVsCi1vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvdHJhY2UvaW5mbz10cnVlCi1vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvdHJhY2Uvd2FybmluZz10cnVlCi1vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvdHJhY2UvZXJyb3I9dHJ1ZQotCi0jIFR1cm4gb24gZGF0YSBmbG93IHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi90cmFjZS9kYXRhPXRydWUKLQotIyBUdXJuIG9uIGNvbW1hbmQgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3RyYWNlL2NvbW1hbmQ9dHJ1ZQotCi0jIFR1cm4gb24gZW1pdHRlciB0cmFjaW5nCi1vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvdHJhY2UvZW1pdHRlcj10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGRhZDEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDIwNzZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVudi5qYXIKLXNyYy5pbmNsdWRlcyA9IC5jbGFzc3BhdGgsXAotICAgICAgICAgICAgICAgLnByb2plY3QsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS5lbnYuamFyID0gc3JjLwotb3V0cHV0LmVudi5qYXIgPSBiaW4vCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBlbnYuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmRlMDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9RW52aXJvbm1lbnQgQ29tbWFuZCBGcmFtZXdvcmsgKGhlYWRsZXNzKQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLVBMVUdJTl9YUF9EWU5BTUlDX1dJWkFSRD1EeW5hbWljIFdpemFyZAotUExVR0lOX1hQX1BPUFVQX0RJQUxPR1M9T3B0aW9uYWwgUG9wLXVwIEFjdGlvbiBEaWFsb2dzIFR5cGVzCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0M2I4OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiCi0gICBuYW1lPSIlUExVR0lOX05BTUUiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVQTFVHSU5fUFJPVklERVIiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnBsdWdpbi5FbnZQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImVudi5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uub3NnaSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9ImR5bmFtaWNXaXphcmQiCi0gICAgICBuYW1lPSIlUExVR0lOX1hQX0RZTkFNSUNfV0laQVJEIi8+Ci0gICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSIKLSAgICAgIG5hbWU9IiVQTFVHSU5fWFBfUE9QVVBfRElBTE9HUyIvPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL0NsYXNzUGF0aC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb21tb24vQ2xhc3NQYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMWE3ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb21tb24vQ2xhc3NQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogCi0gKiBUaGUgY2xhc3MgcHJvdmlkZXMgYW5kIGVhc3kgd2F5IHRvIGJ1aWxkIGNsYXNzcGF0aHMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NQYXRoIAotewotICBwcml2YXRlIFN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gbmV3UGF0aCBhcHBlbmRzIHRoaXMgbmV3IHBhdGggdG8gdGhlIGVuZCBvZiB0aGUgY2xhc3NwYXRoLgotICAgKi8KLSAgcHVibGljIHZvaWQgYXBwZW5kUGF0aCggU3RyaW5nIG5ld1BhdGggKQotICB7Ci0gIAkvLyBObyB2YWx1ZSB0byBwdXQgb24gcGF0aCwgc28ganVzdCByZXR1cm4KLSAgCWlmKCBuZXdQYXRoLmVxdWFscyggIiIgKSApIHJldHVybjsKLSAgCQotICAJLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgcGF0aCBpbiB0aGUgc3RyaW5nIHRoZW4gd2UgZG9uJ3QgbmVlZCBhIHBhdGgKLSAgCS8vIHNlcGFyYXRvci4KLSAgCWlmKCBwYXRoLmxlbmd0aCgpID09IDAgKQotICAJewotICAJICBwYXRoLmFwcGVuZCggbmV3UGF0aCApOwotICAJfQotICAJZWxzZQotICAJewotICAJICBwYXRoLmFwcGVuZCggRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciArIG5ld1BhdGggKTsKLSAgCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGFwcGVuZHMgYWxsIGphciBhbmQgemlwIGZpbGVzIGluIGEgcGFydGljdWxhciBkaXJlY3RvcnkgdG8KLSAgICogdGhlIGNsYXNzcGF0aC4KLSAgICogCi0gICAqIEBwYXJhbSBkaXJlY3Rvcnkgc3BlY2lmaWVzIGEgZGlyZWN0b3J5IGNvbnRhaW5zIGphciBhbmQgemlwIGZpbGVzLgotICAgKi8KLSAgcHVibGljIHZvaWQgYXBwZW5kRGlyKCBTdHJpbmcgZGlyZWN0b3J5ICkKLSAgewotICAJRmlsZSBkaXIgPSBuZXcgRmlsZSggZGlyZWN0b3J5ICk7Ci0gIAkKLSAgCWlmKCAhZGlyLmlzRGlyZWN0b3J5KCkgKSByZXR1cm47Ci0gIAkKLSAgCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLSAgCQotICAJZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGZpbGVzLmxlbmd0aDsgaW5kZXgrKyApCi0gIAl7Ci0gIAkgIEZpbGUgICBmaWxlID0gZmlsZXNbaW5kZXhdOwotICAJICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotICAJICAKLSAgCSAgaWYoIGZpbGUuaXNGaWxlKCkgJiYKLSAgCSAgICAgICggbmFtZS5lbmRzV2l0aCggIi5qYXIiICkgfHwKLSAgCSAgICAgICAgbmFtZS5lbmRzV2l0aCggIi56aXAiICkgKSApCi0gIAkgIHsKLSAgCSAgCWFwcGVuZFBhdGgoIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLSAgCSAgfQotICAJICAgICAgICAKLSAgCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gbmV3UGF0aCBhcHBlbmRzIGEgbmV3IGNsYXNzcGF0aCB0byB0aGUgZW5kIG9mIHRoaXMgY2xhc3NwYXRoLgotICAgKi8KLSAgcHVibGljIHZvaWQgYXBwZW5kUGF0aCggQ2xhc3NQYXRoIG5ld1BhdGggKQotICB7Ci0gIAlhcHBlbmRQYXRoKCBuZXdQYXRoLnBhdGgudG9TdHJpbmcoKSApOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBmdWxsIHN0cmluZyBjbGFzc3BhdGggd2l0aCBzZXBhcmF0b3JzLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL0Vudmlyb25tZW50VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL0Vudmlyb25tZW50VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE0M2I3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9FbnZpcm9ubWVudFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmVhbGV5QGNhLmlibS5jb20KLSAqIAotICogVGhpcyBjbGFzcyBjb250YWlucyB1dGlsaXR5IG1ldGhvZHMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBnZW5lcmljCi0gKiBFbnZpcm9ubWVudCBjbGFzZXMgYW5kIEVjbGlwc2UgY2xhc3Nlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVudmlyb25tZW50VXRpbHMgewotCS8qKgotCSAqIENvbnZlcnRzIGFuIEVjbGlwc2UgPGNvZGU+SVN0YXR1czwvY29kZT4gdG8gYW4gRW52aXJvbm1lbnQKLQkgKiA8Y29kZT5TdGF0dXM8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpc3RhdHVzCi0JICogICAgICAgICAgICBUaGUgRWNsaXBzZSBzdGF0dXMgb2JqZWN0LgotCSAqIEByZXR1cm4gQW4gZXF1aXZhbGVudCBFbnZpcm9ubWVudCBzdGF0dXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RhdHVzIGNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoSVN0YXR1cyBpc3RhdHVzKSB7Ci0JCVN0YXR1cyBzdGF0dXM7Ci0JCVN0cmluZyBtZXNzYWdlID0gaXN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IGlzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJaW50IG5vT2ZDaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJaWYgKG5vT2ZDaGlsZHJlbiA+IDApIHsKLQkJCVN0YXR1c1tdIHN0YXR1c0NoaWxkcmVuID0gbmV3IFN0YXR1c1tub09mQ2hpbGRyZW5dOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub09mQ2hpbGRyZW47IGkrKykgewotCQkJCXN0YXR1c0NoaWxkcmVuW2ldID0gY29udmVydElTdGF0dXNUb1N0YXR1cyhjaGlsZHJlbltpXSk7Ci0JCQl9Ci0KLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1lc3NhZ2UsIHN0YXR1c0NoaWxkcmVuKTsKLQkJfSBlbHNlIHsKLQkJCWludCBzZXZlcml0eSA9IGlzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLQkJCWludCBzdGF0dXNTZXZlcml0eSA9IFN0YXR1cy5PSzsKLQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCWNhc2UgSVN0YXR1cy5FUlJPUjoKLQkJCQlzdGF0dXNTZXZlcml0eSA9IFN0YXR1cy5FUlJPUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HOgotCQkJCXN0YXR1c1NldmVyaXR5ID0gU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuSU5GTzoKLQkJCQlzdGF0dXNTZXZlcml0eSA9IFN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJU3RhdHVzLk9LOgotCQkJCXN0YXR1c1NldmVyaXR5ID0gU3RhdHVzLk9LOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCX0KLQkJCVRocm93YWJsZSBlID0gaXN0YXR1cy5nZXRFeGNlcHRpb24oKTsKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1lc3NhZ2UsIHN0YXR1c1NldmVyaXR5LCBlKTsKLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYW4gRW52aXJvbm1lbnQgPGNvZGU+U3RhdHVzPC9jb2RlPiB0byBhbiBFY2xpcHNlCi0JICogPGNvZGU+SVN0YXR1czwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGlzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBFbnZpcm9ubWVudCBzdGF0dXMgb2JqZWN0LgotCSAqIEByZXR1cm4gQW4gZXF1aXZhbGVudCBFY2xpcHNlIHN0YXR1cyBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoU3RhdHVzIHN0YXR1cywgU3RyaW5nIHBsdWdpbklkKSB7Ci0JCUlTdGF0dXMgaXN0YXR1czsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQlUaHJvd2FibGUgdGhyb3dhYmxlID0gc3RhdHVzLmdldFRocm93YWJsZSgpOwotCQlpZiAoc3RhdHVzLmhhc0NoaWxkcmVuKCkpIHsKLQkJCVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQlpbnQgbm9PZkNoaWxkcmVuID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJSVN0YXR1c1tdIGlzdGF0dXNDaGlsZHJlbiA9IG5ldyBJU3RhdHVzW25vT2ZDaGlsZHJlbl07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vT2ZDaGlsZHJlbjsgaSsrKSB7Ci0JCQkJaXN0YXR1c0NoaWxkcmVuW2ldID0gY29udmVydFN0YXR1c1RvSVN0YXR1cyhjaGlsZHJlbltpXSwKLQkJCQkJCXBsdWdpbklkKTsKLQkJCX0KLQotCQkJaXN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhwbHVnaW5JZCwgMCwgaXN0YXR1c0NoaWxkcmVuLCBtZXNzYWdlLAotCQkJCQl0aHJvd2FibGUpOwotCQl9IGVsc2UgewotCQkJaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0JCQlpbnQgaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCWNhc2UgU3RhdHVzLkVSUk9SOgotCQkJCWlzdGF0dXNTZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFN0YXR1cy5XQVJOSU5HOgotCQkJCWlzdGF0dXNTZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgU3RhdHVzLklORk86Ci0JCQkJaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTdGF0dXMuT0s6Ci0JCQkJaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQl9Ci0JCQlpc3RhdHVzID0gbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMoaXN0YXR1c1NldmVyaXR5LAotCQkJCQlwbHVnaW5JZCwgMCwgbWVzc2FnZSwgdGhyb3dhYmxlKTsKLQkJfQotCi0JCXJldHVybiBpc3RhdHVzOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29tbW9uL0ZpbGVSZXNvdXJjZU91dHB1dFN0cmVhbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb21tb24vRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNTE0ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb21tb24vRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci0KLQotCi0vKioKLSogVGhpcyBjbGFzcyBkZWZpbmVzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCB3cml0ZXMgdG8gYW4KLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfS4KLSovCi1wdWJsaWMgY2xhc3MgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtCi17Ci0KLSAgSVBhdGggICAgICAgICAgICAgICAgIGZGaWxlUGF0aDsKLSAgUmVzb3VyY2VDb250ZXh0ICAgICAgIGZSZXNvdXJjZUNvbnRleHQ7IAotICBQcm9ncmVzc01vbml0b3IgICAgICAgZk1vbml0b3I7ICAgCi0gIFN0YXR1c0hhbmRsZXIgICAgICAgICBmU3RhdHVzSGFuZGxlcjsKLSAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0gIGJvb2xlYW4gICAgICAgICAgICAgICBmT3BlbjsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSB0byB0aGUKLSAgKiBnaXZlbiA8Y29kZT5maWxlPC9jb2RlPi4gVGhlIHdvcmtzcGFjZSBpcyBuZWl0aGVyIGV4YW1pbmVkIG5vcgotICAqIGFsdGVyZWQgZHVyaW5nIGNvbnN0cnVjdGlvbi4gQWxsIHJlc291cmNlIGNyZWF0aW9uIGlzIGRlZmVycmVkCi0gICogdW50aWwgbGF0ZXIgaW4gdGhlIHN0cmVhbSdzIGxpZmVjeWNsZSwgc3VjaCBhcyBkdXJpbmcgd3JpdGluZwotICAqIG9yIGNsb3N1cmUuCi0gICogPGI+Tm90ZTo8L2I+IFRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBjcmVhdGluZyBhIHN0cmVhbSB0aGF0Ci0gICogd3JpdGVzIHRvIGFuIElGaWxlIGlzIHRvIGNhbGwgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZAotICAqIHtAbGluayBGaWxlUmVzb3VyY2VVdGlscyNuZXdGaWxlT3V0cHV0U3RyZWFtIEZpbGVSZXNvdXJjZVV0aWxzLm5ld0ZpbGVPdXRwdXRTdHJlYW0oKX0KLSAgKiBhbmQgd29yayB3aXRoIHRoZSByZXN1bHRpbmcgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPi4KLSAgKiBEaXJlY3QgY29uc3RydWN0aW9uIG9mIGEgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtIGlzIG5vdCByZWNvbW1lbmRlZC4KLSAgKiBAcGFyYW0gZmlsZSBUaGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfQotICAqIGhhbmRsZSBvZiB0aGUgZmlsZSByZXNvdXJjZSB0byBjcmVhdGUuIFRoZSBwcm9qZWN0IGltcGxpZWQgYnkgdGhlCi0gICogcGF0aG5hbWUgb2YgdGhlIGZpbGUgbXVzdCBhbHJlYWR5IGV4aXN0LAotICAqIHRoYXQgaXMsIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLSAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAqLwotICBwdWJsaWMgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtICggCi0gIAkJCVJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsIAotICAJCQlJUGF0aCAgICAgICAgICAgZmlsZVBhdGgsIAotICAJCQlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLSAgCQkJU3RhdHVzSGFuZGxlciAgIHN0YXR1c0hhbmRsZXIKLSAgCQkJKQotICB7Ci0gICAgZkZpbGVQYXRoID0gZmlsZVBhdGg7Ci0gICAgZlJlc291cmNlQ29udGV4dCA9IHJlc291cmNlQ29udGV4dDsKLSAgICBmTW9uaXRvciA9IG1vbml0b3I7Ci0gICAgZlN0YXR1c0hhbmRsZXIgPSBzdGF0dXNIYW5kbGVyOwotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgZk9wZW4gPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICogQ2xvc2VzIHRoZSBzdHJlYW0uCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGUgc3RyZWFtLgotICAqIEZvciBleGFtcGxlLCBpZiB0aGlzIHN0cmVhbSB3YXMgY29uc3RydWN0ZWQgd2l0aCBvdmVyd3JpdGVGaWxlID0gZmFsc2UKLSAgKiBhbmQgYSBmaWxlIG9mIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZW4gYW4gSU9FeGNlcHRpb24gd2lsbAotICAqIGJlIHRocm93biBlaXRoZXIgbm93IG9yIGR1cmluZyBhbiBlYXJsaWVyIHtAbGluayAjd3JpdGUgd3JpdGV9LgotICAqLwotICBwdWJsaWMgdm9pZCBjbG9zZSAoKQotICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmICghZk9wZW4pIHJldHVybjsKLSAgICBmT3BlbiA9IGZhbHNlOwotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICBieXRlW10gYnVmZmVyID0gZkJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpOwotICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHRlbXBJbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGVSZXNvdXJjZVV0aWxzLmNyZWF0ZUZpbGUoZlJlc291cmNlQ29udGV4dCwgZkZpbGVQYXRoLCB0ZW1wSW5wdXRTdHJlYW0sIGZNb25pdG9yLCBmU3RhdHVzSGFuZGxlcik7Ci0gICAgfQotCi0gICAgY2F0Y2ggKFJlc291cmNlRXhjZXB0aW9uIGUgKQotICAgIAl7Ci0gICAgCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgIAl9Ci0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICogRmx1c2hlcyB0aGUgc3RyZWFtLiBUaGlzIGRvZXMgbm90IGltcGx5IHRoZSBGaWxlIHJlc291cmNlCi0gICogd2lsbCBiZSBjcmVhdGVkIG9yIGJlY29tZSB2aXNpYmxlIHdpdGhpbiB0aGUgd29ya2JlbmNoLgotICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLiBGb3IgZXhhbXBsZSwgaWYgdGhpcwotICAqIHN0cmVhbSB3YXMgY29uc3RydWN0ZWQgd2l0aCBvdmVyd3JpdGVGaWxlID0gZmFsc2UgYW5kIGEgZmlsZSBvZiB0aGUKLSAgKiBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZW4gYW4gSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBhdAotICAqIHRoaXMgcG9pbnQuCi0gICovCi0gIHB1YmxpYyB2b2lkIGZsdXNoICgpCi0gIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbS5mbHVzaCgpOwotICB9Ci0KLSAgLyoqCi0gICogV3JpdGVzIGFsbCBieXRlcyBmcm9tIHRoZSBnaXZlbiBhcnJheSB0byB0aGUgc3RyZWFtLgotICAqIEBwYXJhbSBiIFRoZSBhcnJheSBvZiBieXRlcyB0byB3cml0ZS4KLSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4gRm9yIGV4YW1wbGUsIGlmIHRoaXMKLSAgKiBzdHJlYW0gd2FzIGNvbnN0cnVjdGVkIHdpdGggb3ZlcndyaXRlRmlsZSA9IGZhbHNlIGFuZCBhIGZpbGUgb2YgdGhlCi0gICogc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGVuIGFuIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQKLSAgKiB0aGlzIHBvaW50LgotICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZSAoIGJ5dGVbXSBiICkKLSAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlKGIpOwotICB9Ci0KLSAgLyoqCi0gICogV3JpdGVzIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGFycmF5IGJlZ2lubmluZyBhdCBzb21lIG9mZnNldAotICAqIGFuZCBjb250aW51aW5nIGZvciBzb21lIG51bWJlciBvZiBieXRlcyAobGVuKSB0byB0aGUgc3RyZWFtLgotICAqIEBwYXJhbSBiIFRoZSBhcnJheSBvZiBieXRlcyB0byB3cml0ZS4KLSAgKiBAcGFyYW0gb2ZmIFRoZSBvZmZzZXQgaW50byB0aGUgYXJyYXkgdG8gYmVnaW4gd3JpdGluZy4KLSAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuIEZvciBleGFtcGxlLCBpZiB0aGlzCi0gICogc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZSBhbmQgYSBmaWxlIG9mIHRoZQotICAqIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0gICogdGhpcyBwb2ludC4KLSAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUgKCBieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbiApCi0gIHsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlKGIsb2ZmLGxlbik7Ci0gIH0KLQotICAvKioKLSAgKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZSB0byB0aGUgc3RyZWFtLgotICAqIEBwYXJhbSBiIFRoZSBieXRlIHRvIHdyaXRlLgotICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLiBGb3IgZXhhbXBsZSwgaWYgdGhpcwotICAqIHN0cmVhbSB3YXMgY29uc3RydWN0ZWQgd2l0aCBvdmVyd3JpdGVGaWxlID0gZmFsc2UgYW5kIGEgZmlsZSBvZiB0aGUKLSAgKiBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZW4gYW4gSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBhdAotICAqIHRoaXMgcG9pbnQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlICggaW50IGIgKQotICB7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbS53cml0ZShiKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9GaWxlUmVzb3VyY2VVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb21tb24vRmlsZVJlc291cmNlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5MzU2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9GaWxlUmVzb3VyY2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbjsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotCi0KLQotLyoqCi0qIFRoaXMgY2xhc3MgY29udGFpbnMgdXNlZnVsIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBFY2xpcHNlIHJlc291cmNlcy4KLSovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmlsZVJlc291cmNlVXRpbHMKLXsKLSAgLy8KLSAgLy8gS2VlcHMgdGhlIElXb3Jrc3BhY2UgaGFuZ2luZyBhcm91bmQuIFNlZSBnZXRXb3Jrc3BhY2UoKS4KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZSB3b3Jrc3BhY2VfID0gbnVsbDsKLSAgLy8KLSAgLy8gS2VlcHMgdGhlIElXb3Jrc3BhY2VSb290IGhhbmdpbmcgYXJvdW5kLiBTZWUgZ2V0V29ya3NwYWNlUm9vdCgpLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlUm9vdCByb290XyA9IG51bGw7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBNZXNzYWdlVXRpbHMgbXNnXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uLmVudmlyb25tZW50IiwgbmV3IEZpbGVSZXNvdXJjZVV0aWxzKCkgKTsKLQotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgSVdvcmtzcGFjZVJvb3Qgb2JqZWN0LgotICAqIEByZXR1cm4gVGhlIElXb3Jrc3BhY2VSb290IG9iamVjdC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290ICgpCi0gIHsKLSAgICBpZiAocm9vdF8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByb290XyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgfQotICAgIHJldHVybiByb290XzsKLSAgfQotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgSVdvcmtzcGFjZSBvYmplY3QuCi0gICogQHJldHVybiBUaGUgSVdvcmtzcGFjZSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UgKCkKLSAgewotICAgIGlmICh3b3Jrc3BhY2VfID09IG51bGwpCi0gICAgewotICAgICAgaWYgKHJvb3RfID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJvb3RfID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgd29ya3NwYWNlXyA9IHJvb3RfLmdldFdvcmtzcGFjZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gd29ya3NwYWNlXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYW4gYXJyYXkgb2YgdGhyZWUgY29tbW9uIGNob2ljZXMuIChpZS4gWWVzLCB5ZXMgYWxsLCBhbmQgY2FuY2VsICkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ2hvaWNlW10gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkgCi0gIHsKLSAgICBWZWN0b3IgY2hvaWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICBjaG9pY2VzLmFkZChuZXcgQ2hvaWNlKCAnWScsIG1zZ18uZ2V0TWVzc2FnZSgiTEFCRUxfWUVTIikpKTsKLSAgICBjaG9pY2VzLmFkZChuZXcgQ2hvaWNlKCAnQScsIG1zZ18uZ2V0TWVzc2FnZSgiTEFCRUxfWUVTX1RPX0FMTCIpKSk7Ci0gICAgY2hvaWNlcy5hZGQobmV3IENob2ljZSggJ0MnLCBtc2dfLmdldE1lc3NhZ2UoIkxBQkVMX0NBTkNFTCIpKSk7Ci0gICAgCi0gICAgcmV0dXJuIChDaG9pY2VbXSljaG9pY2VzLnRvQXJyYXkobmV3IENob2ljZVtjaG9pY2VzLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIGFuCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBJUmVzb3VyY2V9Ci0gICogb2YgdGhlIGdpdmVuIGFic29sdXRlIHBhdGhuYW1lIG9yIG51bGwgaWYgbm8gc3VjaCByZXNvdXJjZSBleGlzdHMuCi0gICogQHBhcmFtIGFic29sdXRlUGF0aG5hbWUgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlc291cmNlLgotICAqIEByZXR1cm4gVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZSAoIFN0cmluZyBhYnNvbHV0ZVBhdGhuYW1lICkKLSAgewotICAgIGlmIChhYnNvbHV0ZVBhdGhuYW1lID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmaW5kUmVzb3VyY2UobmV3IFBhdGgoYWJzb2x1dGVQYXRobmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgSVJlc291cmNlfQotICAqIG9mIHRoZSBnaXZlbiBhYnNvbHV0ZSBwYXRoIG9yIG51bGwgaWYgbm8gc3VjaCByZXNvdXJjZSBleGlzdHMuCi0gICogQHBhcmFtIGFic29sdXRlUGF0aCBUaGUgYWJzb2x1dGUgPGNvZGU+SVBhdGg8L2NvZGU+IG9mIHRoZSByZXNvdXJjZS4KLSAgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotICAqLwotICBwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBmaW5kUmVzb3VyY2UgKCBJUGF0aCBhYnNvbHV0ZVBhdGggKQotICB7Ci0gICAgaWYgKGFic29sdXRlUGF0aCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gRmlsZVJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmZpbmRNZW1iZXIoYWJzb2x1dGVQYXRoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvcGllcyBhIGZpbGUgZnJvbSBhIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbgotICAgKiB0byBhbiBFY2xpcHNlIGZvbGRlci4KLSAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGNvbnRhaW5pbmcgdGhlIGZpbGVzIHRvIGNvcHkuCi0gICAqIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSBzb3VyY2VQYXRoIFRoZSBwYXRoLCByZWxhdGl2ZSB0byB0aGUgPGNvZGU+cGx1Z2luPC9jb2RlPgotICAgKiBpbnN0YWxsIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LgotICAgKiBJZiBudWxsLCB0aGVuIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbiBpcyB0aGUgc291cmNlIHBhdGgKLSAgICogKGllLiBudWxsIGlzIGVxdWl2YWxlbnQgdG8gIi4iKS4KLSAgICogQHBhcmFtIHBhdGhuYW1lIFRoZSBwYXRobmFtZSBvZiB0aGUgZmlsZSB0byBjb3B5LgotICAgKiBUaGUgcGF0aG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIDxjb2RlPnBsdWdpbiBzb3VyY2VQYXRoPC9jb2RlPi4KLSAgICogTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHBhcmFtIHRhcmdldFBhdGggVGhlIGFic29sdXRlIEVjbGlwc2UgcGF0aCBvZiB0aGUgZm9sZGVyIHRvCi0gICAqIHdoaWNoIHRoZSBmaWxlIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWUgb2YgdGhlCi0gICAqIGZpbGUgaXMgcHJlc2VydmVkLgotICAgKiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcGFyYW0gY3JlYXRlRm9sZGVycyBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotICAgKiB7QGxpbmsgI0NSRUFURSBDUkVBVEV9IG9yIHtAbGluayAjRE9OVF9DUkVBVEUgRE9OVF9DUkVBVEV9LgotICAgKiA8dWw+Ci0gICAqIDxsaT48Y29kZT5DUkVBVEU8L2NvZGU+IC0KLSAgICogSWYgYW55IGludGVybWVkaWF0ZSBmb2xkZXJzIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+Ci0gICAqIGRvIG5vdCBleGlzdCwgdGhleSB3aWxsIGJlIGNyZWF0ZWQuCi0gICAqIDxsaT48Y29kZT5ET05UX0NSRUFURTwvY29kZT4gLQotICAgKiBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMgaW4gdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4KLSAgICogZG8gbm90IGV4aXN0LCB0aGUgbWV0aG9kIHdpbGwgdGhyb3cgYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPi4KLSAgICogPC91bD4KLSAgICogQHBhcmFtIG92ZXJ3cml0ZUZpbGUgVGhlIHBvbGljeSBmb3IgZXhpc3RpbmcgZmlsZXMsIG9uZSBvZgotICAgKiB7QGxpbmsgI09WRVJXUklURSBPVkVSV1JJVEV9IG9yIHtAbGluayAjRE9OVF9PVkVSV1JJVEUgRE9OVF9PVkVSV1JJVEV9LgotICAgKiA8dWw+Ci0gICAqIDxsaT48Y29kZT5PVkVSV1JJVEU8L2NvZGU+IC0KLSAgICogSWYgYSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzIGFuZCBpcyBhIGZpbGUsCi0gICAqIGl0IHdpbGwgYmUgcmVwbGFjZWQuCi0gICAqIElmIHRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXQgaXMgbm90IGEgZmlsZSwKLSAgICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgICogYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLSAgICogPGxpPjxjb2RlPkRPTlRfT1ZFUldSSVRFPC9jb2RlPiAtCi0gICAqIElmIGFueSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzLAotICAgKiB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZAotICAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAgKiA8L3VsPgotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLSAgICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9Ci0gICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAgKiBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLgotICAgKi8KLSAgIHN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5RmlsZSggUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luIHBsdWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggc291cmNlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggcGF0aG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIHRhcmdldFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c0hhbmRsZXIgc3RhdHVzTW9uaXRvciApCi0gICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICB7Ci0gICAgIHRyeQotICAgICB7Ci0gICAgICAgSVBhdGggdGFyZ2V0ID0gdGFyZ2V0UGF0aC5hcHBlbmQocGF0aG5hbWUpOwotICAgICAgIElQYXRoIHNvdXJjZSA9IHNvdXJjZVBhdGggPT0gbnVsbCA/IHBhdGhuYW1lIDogc291cmNlUGF0aC5hcHBlbmQocGF0aG5hbWUpOwotICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gcGx1Z2luLm9wZW5TdHJlYW0oc291cmNlKTsKLSAgICAgICBjcmVhdGVGaWxlKHJlc291cmNlQ29udGV4dCwgdGFyZ2V0LCBpbnB1dCwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNNb25pdG9yKTsKLSAgICAgfQotICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgewotICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTyIpLGUpKTsKLSAgICAgfQotICAgfQotICAgCi0gIC8qKgotICAgKiBEZWxldGVzIGEgZmlsZSB1bmRlciBhIGNvbnRhaW5lci4KLSAgICogVGhlIGNvbnRhaW5lciBtdXN0IGFscmVhZHkgZXhpc3QuCi0gICAqIEBwYXJhbSBmaWxlIC0gdGhlIElGaWxlIHRvIGJlIGRlbGV0ZWQKLSAgICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotICAgKiBAcGFyYW0gc3RhdHVzTW9uaXRvcgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaWYgaXQgZXhpc3RzIGFuZCBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZC4gRmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZpbGUoIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzSGFuZGxlciBzdGF0dXNNb25pdG9yKQotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoZmlsZS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKQotICAgICAgewotICAgICAgICBTaW1wbGVTdGF0dXMgc3RhdHVzIAotICAgICAgICAgID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX0VSUk9SX0ZJTEVfT1ZFUldSSVRFX0RJU0FCTEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldE5hbWUoKX0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMuV0FSTklORyApOwotICAgICAgICAKLSAgICAgICAgQ2hvaWNlIGNob2ljZSA9IHN0YXR1c01vbml0b3IucmVwb3J0KCBzdGF0dXMsIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpICk7Ci0gICAgICAgIAotICAgICAgICBpZiggY2hvaWNlLmdldFNob3J0Y3V0KCkgPT0gJ0MnICkgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYoIGNob2ljZS5nZXRTaG9ydGN1dCgpID09ICdBJyApIHJlc291cmNlQ29udGV4dC5zZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vV2UgaGF2ZSBwZXJtaXNzaW9uIHRvIG92ZXJ3cml0ZSBzbyBjaGVjayBpZiBmaWxlIGlzIHJlYWQtb25seQotICAgICAgaWYgKGZpbGUuaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTaW1wbGVTdGF0dXMgc3RhdHVzIAotICAgICAgICAgID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX0VSUk9SX0ZJTEVfQ0hFQ0tPVVRfRElTQUJMRUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGZpbGUuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0TmFtZSgpfSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cy5XQVJOSU5HICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgQ2hvaWNlIGNob2ljZSA9IHN0YXR1c01vbml0b3IucmVwb3J0KCBzdGF0dXMsIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYoIGNob2ljZS5nZXRTaG9ydGN1dCgpID09ICdDJyApIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiggY2hvaWNlLmdldFNob3J0Y3V0KCkgPT0gJ0EnICkgcmVzb3VyY2VDb250ZXh0LnNldENoZWNrb3V0RmlsZXNFbmFibGVkKHRydWUpOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVsxXTsKLSAgICAgICAgZmlsZXNbMF0gPSBmaWxlOwotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IGdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcywgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBpZiggc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICBTaW1wbGVTdGF0dXMgdmFsaWRhdGVTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgc3RhdHVzLmdldE1lc3NhZ2UoKSwgU2ltcGxlU3RhdHVzLkVSUk9SICk7Ci0gICAgICAgICAgc3RhdHVzTW9uaXRvci5yZXBvcnRFcnJvciggdmFsaWRhdGVTdGF0dXMgKTsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgZmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0gICAgfQotICAgIC8vQXQgdGhpcyBwb2ludCwgZWl0aGVyIHRoZSBmaWxlIGRpZCBub3QgZXhpc3Qgb3Igd2Ugc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQKLSAgICAvLyBpdC4gUmV0dXJuIHN1Y2Nlc3MuCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogRGVsZXRlcyBhIGZvbGRlciB1bmRlciBhIGNvbnRhaW5lci4KLSAgICogQHBhcmFtIGZvbGRlciAtIHRoZSBJRm9sZGVyIHRvIGJlIGRlbGV0ZWQKLSAgICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotICAgKiBAcGFyYW0gc3RhdHVzTW9uaXRvcgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZvbGRlciBkb2VzIG5vdCBleGlzdCBvciBpZiBpdCBleGlzdHMgYW5kIGlzIHN1Y2Nlc3NmdWxseSBkZWxldGVkIGFsb25nIHdpdGggaXRzIG1lbWJlcnMuIEZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRm9sZGVyKCBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZvbGRlciBmb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzSGFuZGxlciBzdGF0dXNNb25pdG9yICkKLSAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgIHsKLSAgICAgaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHJldHVybiB0cnVlOwotCi0gICAgIGJvb2xlYW4gICAgIGRlbGV0ZWQgICA9IHRydWU7Ci0gICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IGZvbGRlci5tZW1iZXJzKCk7Ci0gICAgIAotICAgICBmb3IgKGludCBpPTA7IGk8cmVzb3VyY2VzLmxlbmd0aDsgaSsrKQotICAgICB7Ci0gICAgICAgSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgIHsKLSAgICAgICAgIGRlbGV0ZWQgPSBkZWxldGVGaWxlKHJlc291cmNlQ29udGV4dCwgKElGaWxlKXJlc291cmNlLCBwcm9ncmVzc01vbml0b3IsIHN0YXR1c01vbml0b3IpOwotICAgICAgIH0KLSAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKQotICAgICAgIHsKLSAgICAgICAgIGRlbGV0ZWQgPSBkZWxldGVGb2xkZXIoIHJlc291cmNlQ29udGV4dCwgKElGb2xkZXIpcmVzb3VyY2UsIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzTW9uaXRvcik7Ci0gICAgICAgfQotCi0gICAgICAgaWYoICFkZWxldGVkICkgYnJlYWs7Ci0gICAgIH0KLSAgICAgCi0gICAgIGlmKCBkZWxldGVkICkKLSAgICAgewotICAgICAgIGZvbGRlci5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgcmV0dXJuIHRydWU7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLQotICAvKioKLSAgKiBDcmVhdGVzIGEgZmlsZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPgotICAqIGFuZCByZXR1cm5zIGl0cyBoYW5kbGUgYXMgYW4gPGNvZGU+SUZpbGU8L2NvZGU+LgotICAqIElmIHRoZSBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkLCBhCi0gICogPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gY29udGFpbmluZyBhbgotICAqIDxjb2RlPklTdGF0dXM8L2NvZGU+IG9iamVjdCBpcyB0aHJvd24uCi0gICogQHBhcmFtIGFic29sdXRlUGF0aCBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCi0gICogVGhlIHByb2plY3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aCBtdXN0IGFscmVhZHkgZXhpc3QsCi0gICogdGhhdCBpcywgdGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0gICogQHJldHVybiBUaGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfQotICAqIGhhbmRsZSBvZiB0aGUgZmlsZS4KLSAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c30KLSAgKiB3aXRoIGEgc2V2ZXJpdHkgb2YgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4gYW5kIGEKLSAgKiBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLgotICAqLwotICBwdWJsaWMgc3RhdGljIElGaWxlIGNyZWF0ZUZpbGUgKAotICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0gICAgSVBhdGggICAgICAgICAgIGFic29sdXRlUGF0aCwKLSAgICBJbnB1dFN0cmVhbSAgICAgaW5wdXRTdHJlYW0sCi0gICAgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLSAgICBTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlciApCi0KLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgeyAgICAKLSAgICBpZiAoIWFic29sdXRlUGF0aC5pc0Fic29sdXRlKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAiUmVzb3VyY2VVdGlscyIsMCxtc2dfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QQVRIX05PVF9BQlNPTFVURSIsbmV3IE9iamVjdFtdIHthYnNvbHV0ZVBhdGgudG9TdHJpbmcoKX0pLG51bGwpKTsKLSAgICB9Ci0gICAgaWYgKGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKSA8IDEpCi0gICAgewotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJSZXNvdXJjZVV0aWxzIiwwLG1zZ18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BBVEhfRU1QVFkiLG5ldyBPYmplY3RbXSB7YWJzb2x1dGVQYXRoLnRvU3RyaW5nKCl9KSxudWxsKSk7Ci0gICAgfQotICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPCAyKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwiUmVzb3VyY2VVdGlscyIsMCxtc2dfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QQVRIX05PVF9GT0xERVIiLG5ldyBPYmplY3RbXSB7YWJzb2x1dGVQYXRoLnRvU3RyaW5nKCl9KSxudWxsKSk7Ci0gICAgfQotICAgIElDb250YWluZXIgcGFyZW50ICAgPSBtYWtlRm9sZGVyUGF0aChyZXNvdXJjZUNvbnRleHQsIGFic29sdXRlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzSGFuZGxlcik7Ci0gICAgU3RyaW5nICAgICBmaWxlTmFtZSA9IGFic29sdXRlUGF0aC5sYXN0U2VnbWVudCgpOwotICAgIAotICAgIHJldHVybiBtYWtlRmlsZShyZXNvdXJjZUNvbnRleHQsIHBhcmVudCwgZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBwcm9ncmVzc01vbml0b3IsIHN0YXR1c0hhbmRsZXIpOwotICB9Ci0KLSAgLyoqCi0gICogQ3JlYXRlcyB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cHJvamVjdDwvY29kZT4KLSAgKiBhIGZpbGUgb2YgdGhlIGdpdmVuIDxjb2RlPnJlbGF0aXZlUGF0aDwvY29kZT4KLSAgKiBhbmQgcmV0dXJucyBpdHMgaGFuZGxlIGFzIGFuIDxjb2RlPklGaWxlPC9jb2RlPi4KLSAgKiBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCwgYQotICAqIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcgYW4KLSAgKiA8Y29kZT5JU3RhdHVzPC9jb2RlPiBvYmplY3QgaXMgdGhyb3duLgotICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgotICAqIFRoZSBwcm9qZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhdGggbXVzdCBhbHJlYWR5IGV4aXN0LAotICAqIHRoYXQgaXMsIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLSAgKiBAcGFyYW0gY3JlYXRlRm9sZGVycyBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotICAqIHtAbGluayAjQ1JFQVRFIENSRUFURX0gb3Ige0BsaW5rICNET05UX0NSRUFURSBET05UX0NSRUFURX0uCi0gICogPHVsPgotICAqIDxsaT48Y29kZT5DUkVBVEU8L2NvZGU+IC0KLSAgKiBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMgaW4gdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4KLSAgKiBkbyBub3QgZXhpc3QsIHRoZXkgd2lsbCBiZSBjcmVhdGVkLgotICAqIDxsaT48Y29kZT5ET05UX0NSRUFURTwvY29kZT4gLQotICAqIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPgotICAqIGRvIG5vdCBleGlzdCwgdGhlIG1ldGhvZCB3aWxsIHRocm93IGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4uCi0gICogPC91bD4KLSAgKiBAcGFyYW0gb3ZlcndyaXRlRmlsZSBUaGUgcG9saWN5IGZvciBleGlzdGluZyBmaWxlcywgb25lIG9mCi0gICoge0BsaW5rICNPVkVSV1JJVEUgT1ZFUldSSVRFfSBvciB7QGxpbmsgI0RPTlRfT1ZFUldSSVRFIERPTlRfT1ZFUldSSVRFfS4KLSAgKiA8dWw+Ci0gICogPGxpPjxjb2RlPk9WRVJXUklURTwvY29kZT4gLQotICAqIElmIGEgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2l2ZW4KLSAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzIGFuZCBpcyBhIGZpbGUsCi0gICogaXQgd2lsbCBiZSByZXBsYWNlZC4KLSAgKiBJZiB0aGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgYW5kIGl0IGlzIG5vdCBhIGZpbGUsCi0gICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAqIDxsaT48Y29kZT5ET05UX09WRVJXUklURTwvY29kZT4gLQotICAqIElmIGFueSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAqIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeSBleGlzdHMsCi0gICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAqIDwvdWw+Ci0gICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLSAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9Ci0gICogaGFuZGxlIG9mIHRoZSBmaWxlLgotICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAqIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSUZpbGUgY3JlYXRlRmlsZSAoCi0gICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLSAgICBJUHJvamVjdCAgICAgICAgcHJvamVjdCwKLSAgICBJUGF0aCAgICAgICAgICAgcmVsYXRpdmVQYXRoLAotICAgIElucHV0U3RyZWFtICAgICBpbnB1dFN0cmVhbSwKLSAgICBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotICAgIFN0YXR1c0hhbmRsZXIgICBzdGF0dXNNb25pdG9yICkKLSAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgewotICAgIElQYXRoIGFic29sdXRlUGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQocmVsYXRpdmVQYXRoKTsKLSAgICByZXR1cm4gY3JlYXRlRmlsZShyZXNvdXJjZUNvbnRleHQsIGFic29sdXRlUGF0aCwgaW5wdXRTdHJlYW0sIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzTW9uaXRvcik7Ci0gIH0KLQotICAvKioKLSAgKiBDcmVhdGVzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSB0byB0aGUKLSAgKiBnaXZlbiA8Y29kZT5maWxlPC9jb2RlPi4gQWN0dWFsIGNoYW5nZXMgdG8gdGhlIHdvcmtzcGFjZQotICAqIG1heSBvY2N1ciBkdXJpbmcgY3JlYXRpb24gb2YgdGhlIHN0cmVhbSwgd2hpbGUgd3JpdGluZyB0bwotICAqIHRoZSBzdHJlYW0sIG9yIHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQuCi0gICogQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBjb250YWluaW5nCi0gICogYW4gPGNvZGU+SVN0YXR1czwvY29kZT4gd2lsbCBiZSB0aHJvd24KLSAgKiBhdCBzb21lIHBvaW50IGluIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN0cmVhbQotICAqIGlmIHRoZSBmaWxlIHJlc291cmNlIGNhbm5vdCBiZSBjcmVhdGVkLgotICAqIEBwYXJhbSBmaWxlIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9Ci0gICogaGFuZGxlIG9mIHRoZSBmaWxlIHJlc291cmNlIHRvIGNyZWF0ZS4gVGhlIHByb2plY3QgaW1wbGllZCBieSB0aGUKLSAgKiBwYXRobmFtZSBvZiB0aGUgZmlsZSBtdXN0IGFscmVhZHkgZXhpc3QsCi0gICogdGhhdCBpcywgdGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0gICogQHJldHVybiBBbiA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+IHRpZWQgdG8gdGhlIGZpbGUgcmVzb3VyY2UuCi0gICogQWN0dWFsIGNoZWNrcyBvZiBvciBjaGFuZ2VzIHRvIHRoZSB3b3Jrc3BhY2UgbWF5IG9jY3VyIGFzIGVhcmx5IGR1cmluZwotICAqIHN0cmVhbSBjcmVhdGlvbiwgY2xvc3VyZSwgb3IgYW55IHRpbWUgaW4gYmV0d2Vlbi4KLSAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c30KLSAgKiB3aXRoIGEgc2V2ZXJpdHkgb2YgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4gYW5kIGEKLSAgKiBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLgotICAqIFJlYXNvbnMgaW5jbHVkZToKLSAgKiA8b2w+Ci0gICogPGxpPlRoZSBwcm9qZWN0IG9mIHRoZSBnaXZlbiBmaWxlJ3MgcGF0aCBkb2VzIG5vdCBleGlzdC4KLSAgKiA8bGk+QSBub24tZmlsZSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIG9mIHRoZSBnaXZlbiBmaWxlCi0gICogYWxyZWFkeSBleGlzdHMuCi0gICogPGxpPkEgZmlsZSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIG9mIHRoZSBnaXZlbiBmaWxlCi0gICogYWxyZWFkeSBleGlzdHMsIGFuZCA8Y29kZT5vdmVyd3JpdGVGaWxlPC9jb2RlPiBpcyBmYWxzZS4KLSAgKiA8bGk+T25lIG9yIG1vcmUgaW50ZXJtZWRpYXRlIGZvbGRlcnMgdG8gdGhlIGdpdmVuIGZpbGUKLSAgKiBkbyBub3QgZXhpc3QsIGFuZCA8Y29kZT5jcmVhdGVGb2xkZXJzPC9jb2RlPiBpcyBmYWxzZS4KLSAgKiA8L29sPgotICAqLwotCi0gIHB1YmxpYyBzdGF0aWMgT3V0cHV0U3RyZWFtIG5ld0ZpbGVPdXRwdXRTdHJlYW0gKAotICAgICAgIFJlc291cmNlQ29udGV4dCBjb250ZXh0LAotICAgICAgIElQYXRoICAgICAgICAgICBmaWxlLAotICAgICAgIFByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0gICAgICAgU3RhdHVzSGFuZGxlciAgIHN0YXR1c0hhbmRsZXIgKQotIAotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0oY29udGV4dCwgZmlsZSwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNIYW5kbGVyKTsKLSAgfQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBOYXVnaHR5IGJpdHMuLi4KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8KLSAgLy8gQ3JlYXRlcyBhIHBhdGggb2YgZm9sZGVycy4KLSAgLy8gRG8gbm90IGNhbGwgd2l0aCBhbiBhYnNvbHV0ZVBhdGggb2YgbGVzcyB0aGFuIG9uZSBzZWdtZW50LgotICAvLwotICAvKioKLSAgICogQ3JlYXRlcyBhIHBhdGggb2YgZm9sZGVycy4KLSAgICogRG8gbm90IGNhbGwgd2l0aCBhbiBhYnNvbHV0ZVBhdGggb2YgbGVzcyB0aGFuIG9uZSBzZWdtZW50LgotICAgKiBAcGFyYW0gcmVzb3VyY2VDb250ZXh0IHRoZSByZXNvdXJjZSBjb250ZXh0IGZvciBtYWtpbmcgZm9sZGVycy4KLSAgICogQHBhcmFtIGFic29sdXRlUGF0aCB0aGUgcGF0aCBvZiBmb2xkZXJzIHRoYXQgd2lsbCBiZSBjcmVhdGVkLgotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIGJlIHVzZWQuCi0gICAqIEBwYXJhbSBzdGF0dXNIYW5kbGVyIHRoZSBzdGF0dXMgaGFuZGxlci4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBJQ29udGFpbmVyIG9mIHRoZSBjcmVhdGVkIGZvbGRlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBtYWtlRm9sZGVyUGF0aCAoCi0gICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLSAgICBJUGF0aCBhYnNvbHV0ZVBhdGgsCi0gICAgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLSAgICBTdGF0dXNIYW5kbGVyIHN0YXR1c0hhbmRsZXIgKQotICAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKSA8PSAxKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChhYnNvbHV0ZVBhdGguc2VnbWVudCgwKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBJQ29udGFpbmVyIHBhcmVudCA9IG1ha2VGb2xkZXJQYXRoKHJlc291cmNlQ29udGV4dCwgYWJzb2x1dGVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNIYW5kbGVyICk7Ci0gICAgICBTdHJpbmcgZm9sZGVyTmFtZSA9IGFic29sdXRlUGF0aC5sYXN0U2VnbWVudCgpOwotICAgICAgCi0gICAgICByZXR1cm4gbWFrZUZvbGRlcihyZXNvdXJjZUNvbnRleHQsIHBhcmVudCxmb2xkZXJOYW1lLCBwcm9ncmVzc01vbml0b3IgLCBzdGF0dXNIYW5kbGVyICk7Ci0gICAgfQotICB9Ci0gIC8vCi0gIC8vIENyZWF0ZXMgYSBmb2xkZXIgdW5kZXIgYSBjb250YWluZXIuCi0gIC8vIFRoZSBjb250YWluZXIgbXVzdCBhbHJlYWR5IGV4aXN0LgotICAvLwotIHByaXZhdGUgc3RhdGljIElGb2xkZXIgbWFrZUZvbGRlciAoCi0gICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLSAgICBJQ29udGFpbmVyICAgICAgcGFyZW50LAotICAgIFN0cmluZyAgICAgICAgICBmb2xkZXJOYW1lLAotICAgIFByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0gICAgU3RhdHVzSGFuZGxlciAgIHN0YXR1c0hhbmRsZXIgKQotICAKLSAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIElSZXNvdXJjZSBjaGlsZCAgPSBwYXJlbnQuZmluZE1lbWJlcihmb2xkZXJOYW1lKTsKLSAgICBDaG9pY2UgICAgcmVzdWx0ID0gbnVsbDsKLSAgICAKLSAgICBpZiggY2hpbGQgPT0gbnVsbCApCi0gICAgewotICAgICAgaWYgKCFyZXNvdXJjZUNvbnRleHQuaXNDcmVhdGVGb2xkZXJzRW5hYmxlZCgpKSAgCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN0YXR1c0hhbmRsZXIucmVwb3J0KAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJSZXNvdXJjZVV0aWxzIiwKLSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICBtc2dfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9GT0xERVJfQ1JFQVRJT05fRElTQUJMRUQiLAotICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgcGFyZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZm9sZGVyTmFtZX0gKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMuV0FSTklORywgbnVsbCApLCAKLSAgICAgICAgICAgICAgICBnZXRUaHJlZVN0YXRlRmlsZU9wdGlvbnMoKSApOwotICAgICAgICAKLSAgICAgICAgaWYoIHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5nZXRTaG9ydGN1dCgpID09ICdDJyApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCByZXN1bHQuZ2V0U2hvcnRjdXQoKSA9PSAnQScgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnNldENyZWF0ZUZvbGRlcnNFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIElGb2xkZXIgZm9sZGVyID0gcGFyZW50LmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJOYW1lKSk7Ci0gICAgICBmb2xkZXIuY3JlYXRlKHRydWUsdHJ1ZSxudWxsKTsKLSAgICAgIHJldHVybiBmb2xkZXI7Ci0gICAgfQotICAgIGVsc2UgaWYoIGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLSAgICB7Ci0gICAgICByZXR1cm4gKElGb2xkZXIpY2hpbGQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLSAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgCi0gICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZVV0aWxzIiwKLSAgICAgICAgICAgICAgICAgICAgMCwgCi0JCQkJCW1zZ18uZ2V0TWVzc2FnZSggIk1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRk9MREVSIiwKLQkJCQkJICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IHBhcmVudC5nZXRGdWxsUGF0aCgpLmFwcGVuZChmb2xkZXJOYW1lKS50b1N0cmluZygpIH0pLAotCQkJbnVsbCApICk7Ci0gICAgfQotICB9Ci0KLSAgLy8KLSAgLy8gQ3JlYXRlcyBhIGZpbGUgdW5kZXIgYSBjb250YWluZXIuCi0gIC8vIFRoZSBjb250YWluZXIgbXVzdCBhbHJlYWR5IGV4aXN0LgotICAvLwotIHByaXZhdGUgc3RhdGljIElGaWxlIG1ha2VGaWxlICgKLSAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotICAgIElDb250YWluZXIgICAgICBwYXJlbnQsCi0gICAgU3RyaW5nICAgICAgICAgIGZpbGVOYW1lLAotICAgIElucHV0U3RyZWFtICAgICBpbnB1dFN0cmVhbSwKLSAgICBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotICAgIFN0YXR1c0hhbmRsZXIgICBzdGF0dXNIYW5kbGVyICkKLSAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIGNoaWxkICA9IHBhcmVudC5maW5kTWVtYmVyKGZpbGVOYW1lKTsKLSAgICBDaG9pY2UgICAgcmVzdWx0ID0gbnVsbDsKLSAgICAKLSAgICBpZiggY2hpbGQgIT0gbnVsbCApCi0gICAgewotICAgICAgaWYoIGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSApCi0gICAgICB7Ci0gICAgICAgIGlmKCAhcmVzb3VyY2VDb250ZXh0LmlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkgKSAgIAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gc3RhdHVzSGFuZGxlci5yZXBvcnQoIAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJSZXNvdXJjZVV0aWxzIiwKLSAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIG1zZ18uZ2V0TWVzc2FnZSggIk1TR19FUlJPUl9GSUxFX09WRVJXUklURV9ESVNBQkxFRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3BhcmVudC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksZmlsZU5hbWV9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMuV0FSTklORyApLAotCQkJCQkgIAkJICAgIAotICAgICAgICAgICAgICAgIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYoIHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5nZXRTaG9ydGN1dCgpID09ICdDJyApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYoIHJlc3VsdC5nZXRTaG9ydGN1dCgpID09ICdBJyApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0JCi0gICAgICAgIAotICAgICAgICAvL1dlIGhhdmUgcGVybWlzc2lvbiB0byBvdmVyd3JpdGUgc28gY2hlY2sgaWYgZmlsZSBpcyByZWFkLW9ubHkKLSAgICAgICAgaWYoIGNoaWxkLmdldFJlc291cmNlQXR0cmlidXRlcygpLmlzUmVhZE9ubHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiggIXJlc291cmNlQ29udGV4dC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkgKSAKLSAgICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHQgPSBzdGF0dXNIYW5kbGVyLnJlcG9ydCggCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVN0YXR1cyggIlJlc291cmNlVXRpbHMiLAotICAgICAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgIG1zZ18uZ2V0TWVzc2FnZSggIk1TR19FUlJPUl9GSUxFX0NIRUNLT1VUX0RJU0FCTEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgcGFyZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxmaWxlTmFtZX0gKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMuV0FSTklORyApLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUaHJlZVN0YXRlRmlsZU9wdGlvbnMoKSApOwotICAgICAgICAgICAgCi0JCSAgICBpZiggcmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmdldFNob3J0Y3V0KCkgPT0gJ0MnICkKLQkJICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JCSAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCByZXN1bHQuZ2V0U2hvcnRjdXQoKSA9PSAnQScgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXNvdXJjZUNvbnRleHQuc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVsxXTsKLSAgICAgICAgICBmaWxlc1swXSA9IChJRmlsZSljaGlsZDsKLSAgICAgICAgICAKLSAgICAgICAgICBJU3RhdHVzICAgICAgc3RhdHVzID0gZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLG51bGwpOwotICAgICAgICAgIFNpbXBsZVN0YXR1cyBzcyAgICAgPSBuZXcgU2ltcGxlU3RhdHVzKCBzdGF0dXMuZ2V0UGx1Z2luKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgCi0JCQkJCQkJCQkJCQkgIHN0YXR1cy5nZXRFeGNlcHRpb24oKSApOwotICAgICAgICAgIAotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1c0hhbmRsZXIucmVwb3J0KCBzcyApOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCggU3RhdHVzRXhjZXB0aW9uIGV4YyApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9DaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBleGlzdGluZyBmaWxlLgotICAgICAgICBJRmlsZSBmaWxlID0gcGFyZW50LmdldEZpbGUoIG5ldyBQYXRoKGZpbGVOYW1lKSApOwotICAgICAgICBmaWxlLnNldENvbnRlbnRzKCBpbnB1dFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIAotICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlVXRpbHMiLAotICAgICAgICAgICAgICAgICAgICAgIDAsIAotCQkJCSAgICAgIG1zZ18uZ2V0TWVzc2FnZSggIk1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRklMRSIsCi0JCQkJICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3BhcmVudC5nZXRGdWxsUGF0aCgpLmFwcGVuZChmaWxlTmFtZSl9KSwKLQkJCQkJICBudWxsICkgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vQ3JlYXRlIGEgbmV3IGZpbGUuCi0gICAgICBJRmlsZSBmaWxlID0gcGFyZW50LmdldEZpbGUoIG5ldyBQYXRoKGZpbGVOYW1lKSApOwotICAgICAgZmlsZS5jcmVhdGUoIGlucHV0U3RyZWFtLCB0cnVlLCBudWxsKTsKLSAgICAgIAotICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9TdHJpbmdVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb21tb24vU3RyaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmYWM2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9TdHJpbmdVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICAqIFRoaXMgY2xhc3MgY29udGFpbnMgc29tZSB1c2VmdWwgc3RyaW5nIHV0aWxpdGllcyB0aGF0IGFyZSBub3QgcHJvdmlkZWQgYnkKLSAgKiBlaXRoZXIgU3RyaW5nIG9yIFN0cmluZ0J1ZmZlci4KLSAgKgotICAqIEBhdXRob3IgUGV0ZXIgTW9vZ2sKLSAgKiBAZGF0ZSAgIEp1bHkgMTMsIDIwMDAKLSoqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ1V0aWxzCi17Ci0gIC8qKgotICAqIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBsaW5lIHNlcGFyYXRvci4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICBwcml2YXRlIFN0cmluZ1V0aWxzKCl7fTsKLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHNwbGl0cyBhIHNpbmdsZSBsaW5lIG9mIHRleHQgaW50byBtdWx0aXBsZSBsaW5lcwotICAgICogYmFzZWQgb24gYSBtYXhpbXVtIGxpbmUgbGVuZ3RoLiAgVGhlIG1ldGhvZCB3aWxsIHRyeSB0byBmaXQgYXMKLSAgICAqIG1hbnkgd29yZHMgYXMgcG9zc2libGUgb250byBhIGxpbmUgd2l0aG91dCBleGNlZWRpbmcgdGhlIG1heGltdW0KLSAgICAqIGxpbmUgbGVuZ3RoLiAgTm90ZTogdGhlIG9ubHkgY2FzZSB3aGVyZSBhIGxpbmUgbWlnaHQgZXhjZWVkIHRoZQotICAgICogbWF4aW11bSBpcyBpZiBhIHNpbmdsZSB3b3JkIGlzIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtLgotICAgICogQHBhcmFtIHRleHQgYSBzaW5nbGUgbGluZSBhIHRleHQgdGhhdCBpcyB0byBiZSBzcGxpdC4KLSAgICAqIEBwYXJhbSBtYXhfbGVuZ3RoIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBlYWNoIHNwbGl0IGxpbmUuCi0gICAgKiBAcmV0dXJuIGEgc3RyaW5nIGFycmF5IG9mIHRoZSBzcGxpdCBsaW5lcy4KLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3BsaXR0ZXIoIFN0cmluZyB0ZXh0LCBpbnQgbWF4X2xlbmd0aCApCi0gIHsKLSAgICBWZWN0b3IgICAgICAgICAgcmV0dXJuX3RleHQgPSBuZXcgVmVjdG9yKDIwKTsKLSAgICBTdHJpbmdbXSAgICAgICAgcmV0dXJuX3N0cjsKLSAgICBpbnQgICAgICAgICAgICAgaW5kZXggPSAwOwotCi0gICAgd2hpbGUoIGluZGV4IDwgdGV4dC5sZW5ndGgoKSApCi0gICAgewotICAgICAgU3RyaW5nIHN0ciA9IHRleHQuc3Vic3RyaW5nKCBpbmRleCwgTWF0aC5taW4oIG1heF9sZW5ndGggKyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Lmxlbmd0aCgpICkgKTsKLSAgICAgIGludCBzcGFjZV9pbmRleCA9IHN0ci5sYXN0SW5kZXhPZiggIiAiICk7Ci0KLSAgICAgIGlmKCBpbmRleCArIHN0ci5sZW5ndGgoKSA8IHRleHQubGVuZ3RoKCkgJiYKLSAgICAgICAgICB0ZXh0LmNoYXJBdCggaW5kZXggKyBzdHIubGVuZ3RoKCkgLSAxICkgIT0gJyAnICYmCi0gICAgICAgICAgdGV4dC5jaGFyQXQoIGluZGV4ICsgc3RyLmxlbmd0aCgpICkgIT0gJyAnICYmCi0gICAgICAgICAgc3BhY2VfaW5kZXggIT0gLTEgKQotICAgICAgewotICAgICAgICByZXR1cm5fdGV4dC5hZGRFbGVtZW50KCBzdHIuc3Vic3RyaW5nKCAwLCBzcGFjZV9pbmRleCApICk7Ci0gICAgICAgIGluZGV4ICs9IHNwYWNlX2luZGV4ICsgMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuX3RleHQuYWRkRWxlbWVudCggc3RyLnRyaW0oKSApOwotICAgICAgICBpbmRleCArPSBzdHIubGVuZ3RoKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuX3N0ciA9IG5ldyBTdHJpbmdbcmV0dXJuX3RleHQuc2l6ZSgpXTsKLQotICAgIGZvciggaW5kZXggPSAwOyBpbmRleCA8IHJldHVybl90ZXh0LnNpemUoKTsgaW5kZXgrKyApCi0gICAgewotICAgICAgcmV0dXJuX3N0cltpbmRleF0gPSAoU3RyaW5nKShyZXR1cm5fdGV4dC5lbGVtZW50QXQoaW5kZXgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dXJuX3N0cjsKLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN0cmluZyB3aXRoIGEgcmVwZWF0ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuCi0gICAgKiBAcGFyYW0gdGhlX2NoYXIgdGhlIGNoYXJhY3RlciB0byBiZSByZXBlYXRlZC4KLSAgICAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWUgdGhpcyBjaGFyYWN0ZXIgc2hvdWxkIGJlIHJlcGVhdGVkLgotICAgICogQHJldHVybiB0aGUgcmVzdWx0aW5nIHN0cmluZyBvZiByZXBlYXRlZCBjaGFyYWN0ZXJzLgotICAqKi8KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgcmVwZWF0KCBjaGFyIHRoZV9jaGFyLCBpbnQgY291bnQgKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIGNvdW50ICk7Ci0KLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGJ1Zi5hcHBlbmQoIHRoZV9jaGFyICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCBmbGF0dGVucyBhbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gYSBzdHJpbmcuCi0gICAgKiBUaGUgbWV0aG9kIHJlc3BlY3RzIGVtYmVkZGVkIHdoaXRlc3BhY2UgYW5kIHF1b3Rlcy4KLSAgICAqIDx1bD4KLSAgICAqIDxsaT5BbnkgYXJndW1lbnQgd2l0aCBlbWJlZGRlZCB3aGl0ZXNwYWNlIHdpbGwgYmUgZmxhdHRlbmVkIG91dAotICAgICogd2l0aCBlbmNsb3NpbmcgcXVvdGVzLiBGb3IgZXhhbXBsZSwgdGhlIHNpbmdsZSBhcmd1bWVudAotICAgICogPHU+SGVsbG8gV29ybGQ8L3U+Ci0gICAgKiB3aWxsIGJlIHJldHVybmVkIGFzCi0gICAgKiA8dT4iSGVsbG8gV29ybGQiPC91Pi4KLSAgICAqIDxsaT5BbnkgYXJndW1lbnQgd2l0aCBxdW90ZXMgd2lsbCBiZSBmbGF0dGVuZWQgb3V0IHdpdGggdGhlCi0gICAgKiBxdW90ZXMgZXNjYXBlZC4gRm9yIGV4YW1wbGUsIHRoZSBzaW5nbGUgYXJndW1lbnQKLSAgICAqIDx1PiJIYXBweSBkYXlzIjwvdT4KLSAgICAqIHdpbGwgYmUgcmV0dXJuZWQgYXMKLSAgICAqIDx1PlwiSGFwcHkgZGF5c1wiPC91Pi4KLSAgICAqIDwvdWw+Ci0gICAgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBhcnJheSBvZiBzdHJpbmdzIHRvIGZsYXR0ZW4uCi0gICAgKiBAcmV0dXJuIHRoZSBmbGF0dGVuZWQgc3RyaW5nLgotICAqLwotICBzdGF0aWMgcHVibGljIFN0cmluZyBmbGF0dGVuQXJndW1lbnRzICggU3RyaW5nW10gYXJndW1lbnRzICkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBmb3IgKGludCBpPTA7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIC8vCi0gICAgICAvLyBBcHBlbmQgYSBzZXBhcmF0b3IgKGV4Y2VwdCB0aGUgZmlyc3QgdGltZSkuCi0gICAgICAvLwotICAgICAgaWYgKGkgPiAwKSBidWYuYXBwZW5kKCcgJyk7Ci0KLSAgICAgIC8vCi0gICAgICAvLyBMb29rIGZvciB3aGl0ZXNwYWNlLgotICAgICAgLy8KLSAgICAgIGJvb2xlYW4gd2hpdGVzcGFjZSA9IGZhbHNlOwotICAgICAgY2hhcltdIGNoYXJzID0gYXJndW1lbnRzW2ldLnRvQ2hhckFycmF5KCk7Ci0gICAgICBmb3IgKGludCBqPTA7ICF3aGl0ZXNwYWNlICYmIGo8Y2hhcnMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYXJzW2pdKSkKLSAgICAgICAgewotICAgICAgICAgIHdoaXRlc3BhY2UgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vCi0gICAgICAvLyBBcHBlbmQgdGhlIGFyZ3VtZW50LCBxdW90ZWQgYXMgbmVjZXNzYXJ5LgotICAgICAgLy8KLSAgICAgIGlmICh3aGl0ZXNwYWNlKSBidWYuYXBwZW5kKCciJyk7Ci0gICAgICBmb3IgKGludCBqPTA7IGo8Y2hhcnMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGFyc1tqXSA9PSAnIicpIGJ1Zi5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoY2hhcnNbal0pOwotICAgICAgfQotICAgICAgaWYgKHdoaXRlc3BhY2UpIGJ1Zi5hcHBlbmQoJyInKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHBhcnNlcyB3aGl0ZXNwYWNlLWRlbGltaXR0ZWQgZmlsZW5hbWVzIGZyb20KLSAgICAqIHRoZSBnaXZlbiA8Y29kZT5pbnB1dDwvY29kZT4gc3RyZWFtLiA8Yj5MaW1pdGF0aW9uOjwvYj4KLSAgICAqIFF1b3RlZCBmaWxlbmFtZXMgb3IgZmlsZW5hbWVzIHdpdGggZW1iZWRkZWQgd2hpdGVzcGFjZQotICAgICogYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgotICAgICogQHBhcmFtIGlucHV0IFRoZSBpbnB1dCBzdHJlYW0uCi0gICAgKiBAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIGZpbGVuYW1lcyBmcm9tIHRoZSBzdHJlYW0uCi0gICovCi0gIHN0YXRpYyBwdWJsaWMgRW51bWVyYXRpb24gcGFyc2VGaWxlbmFtZXNGcm9tU3RyZWFtICggSW5wdXRTdHJlYW0gaW5wdXQgKQotICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFZlY3RvciBmaWxlbmFtZXMgPSBuZXcgVmVjdG9yKDY0LDY0KTsKLSAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLSAgICBieXRlIHN0YXRlID0gU1RBVEVfV1M7Ci0gICAgaW50IGljID0gaW5wdXQucmVhZCgpOwotICAgIHdoaWxlIChpYyA+PSAwKQotICAgIHsKLSAgICAgIGNoYXIgYyA9IChjaGFyKWljOwotICAgICAgc3dpdGNoIChzdGF0ZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBTVEFURV9XUzoKLSAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpCi0gICAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjKTsKLSAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfTldTOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9OV1M6Ci0gICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoYyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBidWZmZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGZpbGVuYW1lcy5hZGQoZmlsZW5hbWUpOwotICAgICAgICAgICAgYnVmZmVyID0gbnVsbDsKLSAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfV1M7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWMgPSBpbnB1dC5yZWFkKCk7Ci0gICAgfQotICAgIHJldHVybiBmaWxlbmFtZXMuZWxlbWVudHMoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU1RBVEVfV1MgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFNUQVRFX05XUyA9IDE7Ci0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaXMgdGhlIHR5cGUgcGFzc2VkIGluIGlzIGEgcHJpbXRpdmUgamF2YSB0eXBlCi0gICogQHBhcmFtIGNsYXNzIG5hbWUgU3RyaW5nCi0gICogQHJldHVybiB0cnVlIGlzIHByaW1pdGl2ZSB0eXBlCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUoU3RyaW5nIHR5cGVOYW1lKSAKLSAgewotCi0gICAgaWYgKHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImJvb2xlYW4iKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYnl0ZSIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJkb3VibGUiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiZmxvYXQiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaW50IikgfHwKLSAgICAgIHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImxvbmciKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic2hvcnQiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiY2hhciIpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotICAvKioKLSAgKiBUaGUgbWV0aG9kIHJlcGxhY2UgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsb3dlZCBpbiBVUklzCi0gICogYW5kIG5vdCBhbGxvd2VkIGluIEphdmEgY2xhc3MgbmFtZXMgdG8gYW4gdW5kZXJzY29yZSAoJ18nKQotICAqIEBwYXJhbSBVUkkgU3RyaW5nCi0gICogQHJldHVybiB2YWxpZCBKYXZhIGNsYXNzIG5hbWUgU3RyaW5nCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSSTJDbGFzc05hbWUoIFN0cmluZyB1cmkgKSB7Ci0gICAgU3RyaW5nIGNsYXNzTmFtZSA9IHVyaTsKLSAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBVUklfU1lNQk9MUy5sZW5ndGg7IGkrKyApIHsKLSAgICAJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UgKCBVUklfU1lNQk9MU1tpXSwgVU5ERVJTQ09SRSApOwotICAgIH0KLSAgICByZXR1cm4gY2xhc3NOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW5kIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRyYWNlYmFjayBpbmZvcm1hdGlvbiBvZgotICAgKiBhIFRocm93YWJsZS4gIFRoaXMgaXMgdGhlIHNhbWUgdHJhY2ViYWNrIGRhdGEgdGhhdCBpcyBkaXNwbGF5ZWQgYnkgZXhjLnByaW50U3RhY2tUcmFjZSgpLgotICAgKiBAcGFyYW0gZXhjIHRoZSBleGNlcHRpb24KLSAgICogQHJldHVybiBhIHN0cmluZyBhcnJheSBvZiB0aGUgdHJhY2ViYWNrIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTdGFja1RyYWNlKCBUaHJvd2FibGUgZXhjICkKLSAgewotICAgIFZlY3RvciAgICAgICBsaW5lcyAgICAgICAgPSBuZXcgVmVjdG9yKCk7Ci0gICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciAgcHJpbnRXcml0ZXIgID0gbmV3IFByaW50V3JpdGVyKCBzdHJpbmdXcml0ZXIgKTsKLSAgICAKLSAgICBleGMucHJpbnRTdGFja1RyYWNlKCBwcmludFdyaXRlciApOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHByaW50V3JpdGVyLmNsb3NlKCk7Ci0gICAgICBzdHJpbmdXcml0ZXIuY2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2goIEV4Y2VwdGlvbiBuZXN0ZWRFeGMgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmdSZWFkZXIgc3RyaW5nUmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlciggc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkgKTsKLSAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgICAgID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBzdHJpbmdSZWFkZXIgKTsKLSAgICBTdHJpbmcgICAgICAgICBsaW5lICAgICAgID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgCi0gICAgICB3aGlsZSggbGluZSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgbGluZXMuYWRkKCBsaW5lLnRyaW0oKSApOwotICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBFeGNlcHRpb24gbmVzdGVkRXhjICkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIChTdHJpbmdbXSlsaW5lcy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBVUklfU1lNQk9MUyA9IHsnLScsICd+JywgJyMnLCAnLycsICcuJ307Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVU5ERVJTQ09SRSA9ICdfJzsKLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGVsaW1pdGVyKGNoYXIgY2hhcmFjdGVyKQotICB7Ci0gICAgcmV0dXJuICJcdTAwMkRcdTAwMkVcdTAwM0FcdTAwNUZcdTAwQjdcdTAzODdcdTA2RERcdTA2REUiLmluZGV4T2YoY2hhcmFjdGVyKSAhPSAtMTsKLSAgfQotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9XYWl0Rm9yQXV0b0J1aWxkQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb21tb24vV2FpdEZvckF1dG9CdWlsZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzMWYxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9XYWl0Rm9yQXV0b0J1aWxkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIFdhaXRGb3JBdXRvQnVpbGRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIAotICB7Ci0gIAlTaW1wbGVTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgCQotCXRyeSAKLQl7Ci0JICBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCX0gCi0JY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGV4YyApIAotCXsKLQkgIC8vIFVJU3luY2hyb25pemVyLnN5bmNFeGVjIHNlZW1zIHRvIGludGVycnVwdCB0aGUgVUkgdHJlYWQgd2hlbiB0aGUgYXV0b2J1aWxkZXIgaXMgZG9uZS4gIE5vdCBzdXJlLCB3aHkuCi0JICAvLyBJJ20gYXNzdW1pbmcgaGVyZSB0aGF0IHRoZSBhdXRvYnVpbGRlciBoYXMgYWN0dWFsbHkgY29tcGxldGVkIGl0cyBzdHVmZi4JCi0JfQotCQkKLQlyZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb21tb24vZW52aXJvbm1lbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxNjBiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvbW1vbi9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBmb3IgRWNsaXBzZVNjaGVtZQotIwotTVNHX0lOVkFMSURfUExBVEZPUk1fVVJMPUludmFsaWQgVVJMOiB7MH0gZm9yIGFuIEVjbGlwc2UgcGxhdGZvcm0uCi0KLSMKLSMgTWVzc2FnZXMgZm9yIFJlc291Y2VVdGlscwotIwotTVNHX0VSUk9SX1BBVEhfTk9UX0FCU09MVVRFPUlXQUIwMDAzRSBQYXRoIHswfSBpcyBub3QgYWJzb2x1dGUgZm9yIGNyZWF0aW5nIGEgZmlsZS4KLU1TR19FUlJPUl9QQVRIX0VNUFRZPUlXQUIwMDA0RSBQYXRoIHswfSBpcyBlbXB0eSB3aGlsZSBjcmVhdGluZyBhIGZpbGUuCi1NU0dfRVJST1JfUEFUSF9OT1RfRk9MREVSPUlXQUIwMDA1RSBQYXRoIHswfSBpcyBub3QgYSBmb2xkZXIgZm9yIGNyZWF0aW5nIGEgZmlsZS4KLU1TR19FUlJPUl9GT0xERVJfQ1JFQVRJT05fRElTQUJMRUQ9SVdBQjAwMDdFIEZvbGRlciBjcmVhdGlvbiBoYXMgYmVlbiBkaXNhYmxlZCBmb3IgcGFyZW50IGZvbGRlciB7MH0gYW5kIGNoaWxkIHsxfS4KLU1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRk9MREVSPUlXQUIwMDA4RSBSZXNvdXJjZSB7MH0gaXMgbm90IGEgZm9sZGVyLgotTVNHX1dBUk5fRklMRV9PVkVSV1JJVEVfRElTQUJMRUQ9SVdBQjAwMDlXIENhbiBub3Qgb3ZlcndyaXRlIGZpbGUgezF9IGluIGZvbGRlciB7MH0uCi1NU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRD1JV0FCMDAxMEUgQ2FuIG5vdCBjaGVja291dCBmaWxlIHsxfSBpbiBmb2xkZXIgezB9LgotTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GSUxFPUlXQUIwMDExRSBUaGUgZm9sbG93aW5nIHBhdGggaXMgbm90IGEgcmVzb3VyY2U6IHswfS4KLU1TR19FUlJPUl9GT0xERVJfSEFTX0NISUxEUkVOPUlXQUIwMDEyRSBDYW4gbm90IGNyZWF0ZSBmb2xkZXI6IHswfSB0aGF0IGFscmVhZHkgaGFzIGNoaWxkcmVuLgotTVNHX0VSUk9SX0lPPUlXQUIwMDA2RSBBbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgcmVzb3VyY2UgInswfSIuCi1NU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQ9SVdBQjAxNjRFIENhbm5vdCBjcmVhdGUgdGhlIGZpbGUgInsxfSIgcmVsYXRpdmUgdG8gdGhlIHBhdGggInswfSIgYmVjYXVzZSBhdXRvbWF0aWMgZmlsZSBvdmVyd3JpdGluZyBoYXMgbm90IGJlZW4gZW5hYmxlZC4gRG8geW91IHdhbnQgdG8gZW5hYmxlIGl0IGZvciB0aGlzIGZpbGU/Ci1NU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRD1JV0FCMDA2MUUgQ2Fubm90IGNyZWF0ZSB0aGUgZmlsZSAiezF9IiByZWxhdGl2ZSB0byB0aGUgcGF0aCAiezB9IiBiZWNhdXNlIGF1dG9tYXRpYyBmaWxlIGNoZWNrIG91dCBoYXMgbm90IGJlZW4gZW5hYmxlZC4gRG8geW91IHdhbnQgdG8gZW5hYmxlIGl0IGZvciB0aGlzIGZpbGU/Ci0KLUxBQkVMX1lFUz1ZZXMKLUxBQkVMX1lFU19UT19BTEw9WWVzIEFsbAotTEFCRUxfQ0FOQ0VMPUNhbmNlbAotCi1USVRMRV9XQVJOSU5HPVdhcm5pbmc6Ci1USVRMRV9FUlJPUj1FcnJvcjoKLVRJVExFX0lORk89SW5mbzoKLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29udGV4dC9QZXJzaXN0ZW50Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb250ZXh0L1BlcnNpc3RlbnRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZDgxMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9jb250ZXh0L1BlcnNpc3RlbnRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuQ29udGV4dDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgYXMgdGhlIGJhc2UgY2xhc3MgZm9yIHR5cGVzIHRoYXQgd2hhdCB0byBwZXJzaXN0IHByZWZlcmVuY2UKLSAqIGRhdGEgaW4gdGhlIHBsdWdpbiBwcmVmZXJlbmNlcyBhcmVhLgotICoKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJzaXN0ZW50Q29udGV4dCBpbXBsZW1lbnRzIENvbnRleHQKLXsKLSBwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXNfOwotIHByb3RlY3RlZCBQbHVnaW4gcGx1Z2luXzsKLQotIHB1YmxpYyBQZXJzaXN0ZW50Q29udGV4dCAoIFBsdWdpbiBwbHVnaW4pCi0gCXsKLSAJCXBsdWdpbl8gPSBwbHVnaW47Ci0gCSAgCXByZWZlcmVuY2VzXyA9IHBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotIAl9Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSBkZWZhdWx0IGZvciBhIGJvb2xlYW4gcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXREZWZhdWx0IChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotIAlwcmVmZXJlbmNlc18uc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0gCX0KLSAKLSAvKioKLSAgKiBTZXRzIHRoZSBkZWZhdWx0IGZvciBhIHN0cmluZyBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyB2b2lkIHNldERlZmF1bHQgKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAJcHJlZmVyZW5jZXNfLnNldERlZmF1bHQobmFtZSx2YWx1ZSk7Ci0gCX0KLSAKLSAvKioKLSAgKiBTZXRzIHRoZSBkZWZhdWx0IGZvciBhIGludCBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyB2b2lkIHNldERlZmF1bHQgKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLSAJcHJlZmVyZW5jZXNfLnNldERlZmF1bHQobmFtZSx2YWx1ZSk7Ci0gCX0KLSAKLSAvKioKLSAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBzdHJpbmcgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRWYWx1ZSAoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotIAlwcmVmZXJlbmNlc18uc2V0VmFsdWUobmFtZSx2YWx1ZSk7Ci0gCXBsdWdpbl8uc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0gCX0KLSAKLSAvKioKLSAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBib29sZWFuIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIHZvaWQgc2V0VmFsdWUgKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0gCXByZWZlcmVuY2VzXy5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gCXBsdWdpbl8uc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0gCX0KLSAKLSAvKioKLSAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBpbnQgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRWYWx1ZSAoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotIAlwcmVmZXJlbmNlc18uc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotIAlwbHVnaW5fLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotIC8qKgotICAqIEdldHMgdGhlIHZhbHVlIGZvciBhIHN0cmluZyBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgU3RyaW5nIGdldFZhbHVlQXNTdHJpbmcgKCBTdHJpbmcgbmFtZSkgewotIAlyZXR1cm4gcHJlZmVyZW5jZXNfLmdldFN0cmluZyhuYW1lKTsKLSAJfQotIAotIC8qKgotICAqIEdldHMgdGhlIHZhbHVlIGZvciBhIGJvb2xlYW4gcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGdldFZhbHVlQXNCb29sZWFuICggU3RyaW5nIG5hbWUpIHsKLSAJcmV0dXJuIHByZWZlcmVuY2VzXy5nZXRCb29sZWFuKG5hbWUpOwotIAl9Ci0gIAotICAvKioKLSAgICogR2V0cyB0aGUgdmFsdWUgZm9yIGEgaW50IHByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICAqLwotIHB1YmxpYyBpbnQgZ2V0VmFsdWVBc0ludCggU3RyaW5nIG5hbWUpIHsKLSAJCXJldHVybiBwcmVmZXJlbmNlc18uZ2V0SW50KG5hbWUpOwotIAl9Ci0gCi0gLyoqCi0gICogR2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBzdHJpbmcgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTdHJpbmcoU3RyaW5nIG5hbWUpCi0gewotIAlyZXR1cm4gcHJlZmVyZW5jZXNfLmdldERlZmF1bHRTdHJpbmcobmFtZSk7Ci0gfQotIAotIC8qKgotICAqIEdldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgYm9vbGVhbiBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHJldHVybiB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyBib29sZWFuIGdldERlZmF1bHRCb29sZWFuKFN0cmluZyBuYW1lKQotIHsKLSAJcmV0dXJuIHByZWZlcmVuY2VzXy5nZXREZWZhdWx0Qm9vbGVhbihuYW1lKTsKLSB9Ci0gCi0gLyoqCi0gICogR2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBpbnQgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgaW50IGdldERlZmF1bHRJbnQoU3RyaW5nIG5hbWUpCi0gewotIAlyZXR1cm4gcHJlZmVyZW5jZXNfLmdldERlZmF1bHRJbnQobmFtZSk7Ci0gfQotIAotIC8qKgotICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgc3RyaW5nIHByZWZlcmVuY2UgaWYgYSBkZWZhdWx0IHZhbHVlIGhhcwotICAqIG5vdCBhbHJlYWR5IGJlZW4gc2V0LgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWUKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXREZWZhdWx0U3RyaW5nSWZOb0RlZmF1bHQoIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSApCi0gewotICAgLy8gSWYgdGhlIGtleSBhbHJlYWR5IGhhcyBhIGRlZmF1bHQgdmFsdWUgd2UgZG9uJ3Qgd2FudCB0byBvdmVycmlkZSBpdC4KLSAgIGlmKCBwcmVmZXJlbmNlc18uZ2V0RGVmYXVsdFN0cmluZygga2V5ICkuZXF1YWxzKCIiKSApIAotICAgewotICAgICBwcmVmZXJlbmNlc18uc2V0RGVmYXVsdCgga2V5LCB2YWx1ZSApOwotICAgfQotIH0KLSAKLSAvKioKLSAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIGJvb2xlYW4gcHJlZmVyZW5jZSBpZiBhIGRlZmF1bHQgdmFsdWUgaGFzCi0gICogbm90IGFscmVhZHkgYmVlbiBzZXQuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZQotICAqLwotIHB1YmxpYyB2b2lkIHNldERlZmF1bHRCb29sZWFuSWZOb0RlZmF1bHQoIFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUgKQotIHsKLSAgIC8vIElmIHRoZSBrZXkgYWxyZWFkeSBoYXMgYSBkZWZhdWx0IHZhbHVlIHdlIGRvbid0IHdhbnQgdG8gb3ZlcnJpZGUgaXQuCi0gICBpZiggcHJlZmVyZW5jZXNfLmdldERlZmF1bHRTdHJpbmcoIGtleSApLmVxdWFscygiIikgKSAKLSAgIHsKLSAgICAgcHJlZmVyZW5jZXNfLnNldERlZmF1bHQoIGtleSwgdmFsdWUgKTsKLSAgIH0KLSB9Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBpbnQgcHJlZmVyZW5jZSBpZiBhIGRlZmF1bHQgdmFsdWUgaGFzCi0gICogbm90IGFscmVhZHkgYmVlbiBzZXQuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZQotICAqLwotIHB1YmxpYyB2b2lkIHNldERlZmF1bHRJbnRJZk5vRGVmYXVsdCggU3RyaW5nIGtleSwgaW50IHZhbHVlICkKLSB7Ci0gICAvLyBJZiB0aGUga2V5IGFscmVhZHkgaGFzIGEgZGVmYXVsdCB2YWx1ZSB3ZSBkb24ndCB3YW50IHRvIG92ZXJyaWRlIGl0LgotICAgaWYoIHByZWZlcmVuY2VzXy5nZXREZWZhdWx0U3RyaW5nKCBrZXkgKS5lcXVhbHMoIiIpICkgCi0gICB7Ci0gICAgIHByZWZlcmVuY2VzXy5zZXREZWZhdWx0KCBrZXksIHZhbHVlICk7Ci0gICB9Ci0gfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9lY2xpcHNlL0Jhc2VFY2xpcHNlRW52aXJvbm1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvZWNsaXBzZS9CYXNlRWNsaXBzZUVudmlyb25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0M2MwNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9lY2xpcHNlL0Jhc2VFY2xpcHNlRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhZGRzIHJlc291cmNlcyB0byB0aGUgYmFzZSBFbnZpcm9ubWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlRWNsaXBzZUVudmlyb25tZW50IGV4dGVuZHMgRW52aXJvbm1lbnQgCi17Ci0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgUmVzb3VyY2VDb250ZXh0IG9iamVjdCBmb3IgdGhpcyBlbnZpcm9ubWVudC4KLSAgICovCQotICBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGdldFJlc291cmNlQ29udGV4dCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9lY2xpcHNlL0NvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvZWNsaXBzZS9Db25zb2xlRWNsaXBzZUVudmlyb25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzcwODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9lY2xpcHNlL0NvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkphdmFDb21waWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5OdWxsU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5TaW1wbGVVUklGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUklGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5maWxlLkZpbGVTY2hlbWU7Ci0KLQotLyoqCi0gKiAgVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCBmb3IgdXNlIGluIGEgaGVhZGxlc3MgRWNsaXBzZSBlbnZpcm9ubWVudC4gIAotICovCi1wdWJsaWMgY2xhc3MgQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudCBpbXBsZW1lbnRzIEJhc2VFY2xpcHNlRW52aXJvbm1lbnQKLXsKLQlwcml2YXRlIENvbW1hbmRNYW5hZ2VyICAgY29tbWFuZE1hbmFnZXJfICA9IG51bGw7Ci0JcHJpdmF0ZSBTaW1wbGVVUklGYWN0b3J5IHVyaUZhY3RvcnlfICAgICAgPSBudWxsOwotCXByaXZhdGUgUmVzb3VyY2VDb250ZXh0ICByZXNvdXJjZUNvbnRleHRfID0gbnVsbDsKLQlwcml2YXRlIFByb2dyZXNzTW9uaXRvciAgbW9uaXRvcl8gICAgICAgICA9IG51bGw7Ci0JcHJpdmF0ZSBTdGF0dXNIYW5kbGVyICAgIHN0YXR1c0hhbmRsZXJfICAgPSBudWxsOwotCSAgCi0JcHVibGljIENvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQoIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQgKQotCXsKLQkgIHRoaXMoIG51bGwsIHJlc291cmNlQ29udGV4dCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbmV3IE51bGxTdGF0dXNIYW5kbGVyKCkgKTsJCi0JfQotCQotCXB1YmxpYyBDb25zb2xlRWNsaXBzZUVudmlyb25tZW50KCBDb21tYW5kTWFuYWdlciAgY29tbWFuZE1hbmFnZXIsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotCQkJICAgIAkgICAgICAgICAgICAgICAgICBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQkJICAgICAgICAgICAgICAgICAgU3RhdHVzSGFuZGxlciAgIHN0YXR1c0hhbmRsZXIgKQotCXsKLQkgIGNvbW1hbmRNYW5hZ2VyXyAgPSBjb21tYW5kTWFuYWdlcjsKLQkgIHJlc291cmNlQ29udGV4dF8gPSByZXNvdXJjZUNvbnRleHQ7Ci0JICB1cmlGYWN0b3J5XyAgICAgID0gbmV3IFNpbXBsZVVSSUZhY3RvcnkoKTsKLQkgIG1vbml0b3JfICAgICAgICAgPSBtb25pdG9yOwotCSAgc3RhdHVzSGFuZGxlcl8gICA9IHN0YXR1c0hhbmRsZXI7Ci0JICAgIAotCSAgdXJpRmFjdG9yeV8ucmVnaXN0ZXJTY2hlbWUoICJwbGF0Zm9ybSIsIG5ldyBFY2xpcHNlU2NoZW1lKCB0aGlzICkgKTsKLQkgIHVyaUZhY3RvcnlfLnJlZ2lzdGVyU2NoZW1lKCAiZmlsZSIsIG5ldyBGaWxlU2NoZW1lKCkgKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZS5CYXNlRWNsaXBzZUVudmlyb25tZW50I2dldFJlc291cmNlQ29udGV4dCgpCi0JICovCi0JcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKSAKLQl7Ci0JCXJldHVybiByZXNvdXJjZUNvbnRleHRfOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQjZ2V0Q29tbWFuZE1hbmFnZXIoKQotCSAqLwotCXB1YmxpYyBDb21tYW5kTWFuYWdlciBnZXRDb21tYW5kTWFuYWdlcigpIAotCXsKLQkJcmV0dXJuIGNvbW1hbmRNYW5hZ2VyXzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldEphdmFDb21waWxlcigpCi0JICovCi0JcHVibGljIEphdmFDb21waWxlciBnZXRKYXZhQ29tcGlsZXIoKSAKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQjZ2V0TG9nKCkKLQkgKi8KLQlwdWJsaWMgTG9nIGdldExvZygpIAotCXsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTG9nKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRQcm9ncmVzc01vbml0b3IoKQotCSAqLwotCXB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgCi0JewotCQlyZXR1cm4gbW9uaXRvcl87Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRTdGF0dXNIYW5kbGVyKCkKLQkgKi8KLQlwdWJsaWMgU3RhdHVzSGFuZGxlciBnZXRTdGF0dXNIYW5kbGVyKCkgCi0JewotCQlyZXR1cm4gc3RhdHVzSGFuZGxlcl87Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRVUklGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgVVJJRmFjdG9yeSBnZXRVUklGYWN0b3J5KCkgCi0JewotCQlyZXR1cm4gdXJpRmFjdG9yeV87Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9lY2xpcHNlL0VjbGlwc2VMb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvZWNsaXBzZS9FY2xpcHNlTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYWZhYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9lY2xpcHNlL0VjbGlwc2VMb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYucGx1Z2luLkVudlBsdWdpbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMb2cgaW1wbGVtZW50cyBMb2cgCi17Ci0vLwlwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0JcHVibGljIEVjbGlwc2VMb2coKSB7Ci0JCS8qCi0JCWxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIpOwotCQkvLyBsb2dnZXIuc2V0TG9nRmlsZU5hbWUoImVudi5sb2ciKTsKLQkJbG9nZ2VyLnNldExldmVsKExldmVsLklORk8pOyAvLyBsb2cgYWxsIGxldmVscyBmb3Igbm93Ci0JCSovCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZyNpc0VuYWJsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIEVudlBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZyNpc0VuYWJsZWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoU3RyaW5nIG9wdGlvbikgewotCQlyZXR1cm4gInRydWUiLmVxdWFscyhQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3RyYWNlLyIKLQkJCQkrIG9wdGlvbikpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLAotCQkJU3RyaW5nIG1ldGhvZCwgT2JqZWN0IG9iamVjdCkgewotCQkKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlzd2l0Y2ggKHNldmVyaXR5KSB7Ci0JCQkJY2FzZSBMb2cuRVJST1IgOgotCQkJCQlpZiAoaXNFbmFibGVkKCJlcnJvciIpKQotLy8JCQkJCQlsb2dnZXIKLS8vCQkJCQkJCQkubG9nRXJyb3IoZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJFICIKLS8vCQkJCQkJCQkJCSsgY2FsbGVyICsgIjo6IiArIG1ldGhvZCArICI6IG9iamVjdD0iCi0vLwkJCQkJCQkJCQkrIG9iamVjdCk7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJFICIKLQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IgotCQkJCQkJCSsgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMb2cuV0FSTklORyA6Ci0JCQkJCWlmIChpc0VuYWJsZWQoIndhcm5pbmciKSkKLS8vCQkJCQkJbG9nZ2VyCi0vLwkJCQkJCQkJLmxvZ1dhcm5pbmcoZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKQotLy8JCQkJCQkJCQkJKyAiVyAiICsgY2FsbGVyICsgIjo6IiArIG1ldGhvZAotLy8JCQkJCQkJCQkJKyAiOiBvYmplY3Q9IiArIG9iamVjdCk7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKQotCQkJCQkJCQkrICJXICIgKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kCi0JCQkJCQkJCSsgIjogb2JqZWN0PSIgKyBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIExvZy5JTkZPIDoKLQkJCQkJaWYgKGlzRW5hYmxlZCgiaW5mbyIpKQotLy8JCQkJCQlsb2dnZXIKLS8vCQkJCQkJCQkubG9nSW5mbyhnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkkgIgotLy8JCQkJCQkJCQkJKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kICsgIjogb2JqZWN0PSIKLS8vCQkJCQkJCQkJCSsgb2JqZWN0KTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkkgIgotCQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IgotCQkJCQkJCQkrIG9iamVjdCk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLAotCQkJU3RyaW5nIG1ldGhvZCwgU3RhdHVzIHN0YXR1cykgewotCQlsb2coc2V2ZXJpdHksIG1lc3NhZ2VOdW0sIGNhbGxlciwgbWV0aG9kLCAoT2JqZWN0KXN0YXR1cyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkxvZyNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5UaHJvd2FibGUpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsCi0JCQlTdHJpbmcgbWV0aG9kLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyggc2V2ZXJpdHksIG1lc3NhZ2VOdW0sIGNhbGxlciwgbWV0aG9kLCAoT2JqZWN0KW51bGwgKTsKLQkJdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpOwotCQkvKgotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCQljYXNlIExvZy5FUlJPUiA6Ci0JCQkJCWlmIChpc0VuYWJsZWQoImVycm9yIikpCi0JCQkJCQlsb2dnZXIubG9nRXJyb3IoZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJFICIKLQkJCQkJCQkJKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kKTsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKHRocm93YWJsZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTG9nLldBUk5JTkcgOgotCQkJCQlpZiAoaXNFbmFibGVkKCJ3YXJuaW5nIikpCi0JCQkJCQlsb2dnZXIubG9nV2FybmluZyhnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIlcgIgotCQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QpOwotCQkJCQlsb2dnZXIubG9nV2FybmluZyh0aHJvd2FibGUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIExvZy5JTkZPIDoKLQkJCQkJaWYgKGlzRW5hYmxlZCgiaW5mbyIpKQotCQkJCQkJbG9nZ2VyLmxvZ0luZm8oZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJJICIKLQkJCQkJCQkJKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kKTsKLQkJCQkJbG9nZ2VyLmxvZ0luZm8odGhyb3dhYmxlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJKi8KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwKLQkJCU9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIE9iamVjdCBvYmplY3QpIHsKLQkJLyoKLQkJaWYgKGlzRW5hYmxlZChvcHRpb24pKQotCQkJbG9nZ2VyLmxvZ0luZm8oZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJJICIgKyBjYWxsZXIKLQkJCQkJKyAiOjoiICsgbWV0aG9kICsgIjogb2JqZWN0PSIgKyBvYmplY3QpOwotCQkqLwotCQlpZiAoaXNFbmFibGVkKG9wdGlvbikpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJJICIgKyBjYWxsZXIKLQkJCQkJKyAiOjoiICsgbWV0aG9kICsgIjogb2JqZWN0PSIgKyBvYmplY3QpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuVGhyb3dhYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLAotCQkJT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQkvKgotCQlpZiAoaXNFbmFibGVkKG9wdGlvbikpIHsKLQkJCWxvZ2dlci5sb2dJbmZvKGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiSSAiICsgY2FsbGVyCi0JCQkJCSsgIjo6IiArIG1ldGhvZCk7Ci0JCQlsb2dnZXIubG9nSW5mbyh0aHJvd2FibGUpOwotCQl9Ci0JCSovCi0JCWlmIChpc0VuYWJsZWQob3B0aW9uKSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiSSAiICsgY2FsbGVyCi0JCQkJCSsgIjo6IiArIG1ldGhvZCk7Ci0JCQl0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwKLQkJCU9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFN0YXR1cyBzdGF0dXMpIHsKLQkJbG9nKHNldmVyaXR5LCBvcHRpb24sIG1lc3NhZ2VOdW0sIGNhbGxlciwgbWV0aG9kLCAoT2JqZWN0KXN0YXR1cyk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2VOdW1TdHJpbmcoaW50IG1lc3NhZ2VOdW0pIHsKLQkJU3RyaW5nIG1lc3NhZ2VOdW1TdHJpbmcgPSAiSVdBQiI7Ci0JCWlmIChtZXNzYWdlTnVtID4gOTk5OSB8fCBtZXNzYWdlTnVtIDwgMCkKLQkJCW1lc3NhZ2VOdW0gPSA5OTk5OyAvL2RlZmF1bHQgbWVzc2FnZSBudW1iZXIKLQkJbWVzc2FnZU51bVN0cmluZyArPSAobmV3IEludGVnZXIobWVzc2FnZU51bSkpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBtZXNzYWdlTnVtU3RyaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvZWNsaXBzZS9FY2xpcHNlU2NoZW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2VjbGlwc2UvRWNsaXBzZVNjaGVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDk5NzExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvZWNsaXBzZS9FY2xpcHNlU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlJlbGF0aXZlVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJU2NoZW1lOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlU2NoZW1lIGltcGxlbWVudHMgVVJJU2NoZW1lCi17Ci0gIHByaXZhdGUgQmFzZUVjbGlwc2VFbnZpcm9ubWVudCAgZW52aXJvbm1lbnRfOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyAgICAgICAgICAgIG1zZ187Ci0gIAotICBwdWJsaWMgRWNsaXBzZVNjaGVtZSggQmFzZUVjbGlwc2VFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApCi0gIHsKLSAgICBlbnZpcm9ubWVudF8gPSBlbnZpcm9ubWVudDsKLSAgICBtc2dfICAgICAgICAgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbi5lbnZpcm9ubWVudCIsIHRoaXMgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChVUkkgdXJpKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIAotICAgIGlmKCB1cmkgPT0gbnVsbCApIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBnZXRQYXRoRnJvbVBsYXRmb3JtVVJJKCB1cmkudG9TdHJpbmcoKSApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFN0cmluZyB1cmkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBuZXdVUkkgPSBudWxsOwotICAgIAotICAgIGlmKCB1cmkuc3RhcnRzV2l0aCggInBsYXRmb3JtOi9yZXNvdXJjZSIpICkKLSAgICB7Ci0gICAgICAvLyBUaGUgcGxhdGZvcm0gaGFzIGJlZW4gc3BlY2lmaWVkIHNvIGtlZXAgaXQgYXMgaXMuCi0gICAgICBuZXdVUkkgPSB1cmk7Ci0gICAgfQotICAgIGVsc2UgaWYoIHVyaS5pbmRleE9mKCAiOiIpICE9IC0xICkKLSAgICB7Ci0gICAgICAvLyBUaGUgcGxhdGZvcm0gdXJpIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gc29tZSBvdGhlciBwcm90b2NvbC4gCi0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlU2NoZW1lIiwKLSAgICAgICAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCJNU0dfSU5WQUxJRF9QTEFURk9STV9VUkwiLCBuZXcgT2JqZWN0W117dXJpfSksCi0gICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiApICk7Ci0gICAgIH0KLSAgICBlbHNlIGlmKCB1cmkuc3RhcnRzV2l0aCggIi8iKSApCi0gICAgewotICAgICAgLy8gVGhlIHBsYXRmb3JtIHNjaGVtZSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIHNvIHdlIHdpbGwgYWRkIGl0LgotICAgICAgbmV3VVJJID0gInBsYXRmb3JtOi9yZXNvdXJjZSIgKyB1cmk7Ci0gICAgfQotICAgIAotICAgIGlmKCBuZXdVUkkgPT0gbnVsbCApCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJpICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEVjbGlwc2VVUkkoIG5ld1VSSSwgZW52aXJvbm1lbnRfICk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSShVUkkgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3VVJJKCB1cmkudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSShVUkwgdXJsKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3VVJJKCB1cmwudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlKFVSSSB1cmkpCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBnZXRQYXRoRnJvbVBsYXRmb3JtVVJJKCB1cmkudG9TdHJpbmcoKSApOwotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IGV4Yy5nZXRTdGF0dXMoKTsgCi0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXRzIHRoZSAicGxhdGZvcm06L3Jlc291cmNlIiBJUGF0aCBnaXZlbiBhIHVybAotICAgKiAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aEZyb21QbGF0Zm9ybVVSSShTdHJpbmcgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uIAotICB7Ci0gICAgU3RyaW5nIHJlc291cmNlRmlsZSA9IG51bGw7Ci0gICAgVVJMICAgIHVybCAgICAgICAgICA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgdXJsID0gbmV3IFVSTCggdXJpICk7IAotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgeyAKLSAgICB9Ci0gICAgCi0gICAgaWYoIHVybCA9PSBudWxsICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlU2NoZW1lIiwKLSAgICAgICAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCJNU0dfSU5WQUxJRF9QTEFURk9STV9VUkwiLCBuZXcgT2JqZWN0W117dXJpfSksCi0gICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiApICk7Ci0gICAgfQotICAgIGlmKCB1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoInBsYXRmb3JtIikgKSAKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzb3VyY2VVUkwgPSB1cmwuZ2V0RmlsZSgpOwotICAgICAgCi0gICAgICBpZiAocmVzb3VyY2VVUkwuc3RhcnRzV2l0aCgiL3Jlc291cmNlIikpIAotICAgICAgewotICAgICAgICByZXNvdXJjZUZpbGUgPSByZXNvdXJjZVVSTC5zdWJzdHJpbmcoMTApOyAgIC8vIG9taXQgdGhlICIvcmVzb3VyY2UiIHBvcnRpb24KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlU2NoZW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfLmdldE1lc3NhZ2UoIk1TR19JTlZBTElEX1BMQVRGT1JNX1VSTCIsIG5ldyBPYmplY3RbXXt1cmwuZ2V0RmlsZSgpfSksCi0JCQkJCQkJU3RhdHVzLkVSUk9SICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc291cmNlRmlsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gYWJzb2x1dGVQYXRoIGFuIGFic29sdXRlIElQYXRoCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgcGxhdGZvcm0gVVJJIGZvciB0aGlzIHBhdGguCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSTEZyb21QYXRoKCBJUGF0aCBhYnNvbHV0ZVBhdGggKQotICB7Ci0gICAgcmV0dXJuICJwbGF0Zm9ybTovcmVzb3VyY2UiICsgYWJzb2x1dGVQYXRoOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2VjbGlwc2UvRWNsaXBzZVVSSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi9lY2xpcHNlL0VjbGlwc2VVUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5ZmU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2VjbGlwc2UvRWNsaXBzZVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlJlbGF0aXZlVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS51cmkuVVJJRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUklTY2hlbWU7Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VVUkkgZXh0ZW5kcyBSZWxhdGl2ZVVSSQotewotICBwcml2YXRlIEJhc2VFY2xpcHNlRW52aXJvbm1lbnQgZW52aXJvbm1lbnRfOwotICBwcml2YXRlIEVjbGlwc2VTY2hlbWUgICAgICAgICAgc2NoZW1lXzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgICAgICAgICAgIG1zZ187Ci0gIHByaXZhdGUgRmlsZSAgICAgICAgICAgICAgICAgICBmaWxlXzsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlVVJJKCBTdHJpbmcgdXJpLCBCYXNlRWNsaXBzZUVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIHN1cGVyKCB1cmkgKTsKLSAgICAKLSAgICBlbnZpcm9ubWVudF8gID0gZW52aXJvbm1lbnQ7Ci0gICAgc2NoZW1lXyAgICAgICA9IG5ldyBFY2xpcHNlU2NoZW1lKCBlbnZpcm9ubWVudCApOwotICAgIG1zZ18gICAgICAgICAgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvbW1vbi5lbnZpcm9ubWVudCIsIHRoaXMgKTsKLSAgICBmaWxlXyAgICAgICAgID0gZ2V0RmlsZSgpOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2VyYXNlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVyYXNlKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5IAotICAgIHsKLSAgICAgIElSZXNvdXJjZSBmaWxlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpICkgCi0gICAgICB7Ci0gICAgICAgIGlmKCBmaWxlIGluc3RhbmNlb2YgSUZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgRmlsZVJlc291cmNlVXRpbHMuZGVsZXRlRmlsZSggZW52aXJvbm1lbnRfLmdldFJlc291cmNlQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRmlsZSlmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRQcm9ncmVzc01vbml0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZmlsZSBpbnN0YW5jZW9mIElGb2xkZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgRmlsZVJlc291cmNlVXRpbHMuZGVsZXRlRm9sZGVyKCBlbnZpcm9ubWVudF8uZ2V0UmVzb3VyY2VDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSUZvbGRlcilmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFByb2dyZXNzTW9uaXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFN0YXR1c0hhbmRsZXIoKSApOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGNhdGNoKCBFeGNlcHRpb24gZXhjICkgCi0gICAgeyAgICAgIAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiRWNsaXBzZVVSSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLmdldE1lc3NhZ2UoKSwKLQkJICAgICAgICAgICAgICAgICAgICBTdGF0dXMuRVJST1IsCi0JCQkgICAgICAgICAgICAgICAgZXhjICksIAotICAgICAgICAgIHRoaXMgKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRJbnB1dFN0cmVhbSgpCi0gICAqLwotICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkgCi0gICAgewotICAgICAgLy8gSWYgYSBjbGFzcyBjYXN0IGV4Y2VwdGlvbiBpcyB0aHJvdyBpdCB3aWxsIGJlIHByb3BvZ2F0ZWQgYXMKLSAgICAgIC8vIGEgVVJJRXhjZXB0aW9uLgotICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSlnZXRSZXNvdXJjZSgpOwotCi0gICAgICAvL2NhbGwgZ2V0Q29udGVudHMgb24gdGhlIGVjbGlwc2UgRmlsZSBvYmplY3QKLSAgICAgIGlmKCBmaWxlICE9IG51bGwgKSAKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuZ2V0Q29udGVudHMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFRocm93YWJsZSBleGMgKSAKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlVVJJIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMuZ2V0TWVzc2FnZSgpLAotCQkJCQkJCVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlleGMgKSwKLSAgICAgICAgICB0aGlzICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBmb2xkZXIgZXhpc3RzLgotICAgIFVSSSBwYXJlbnQgPSBwYXJlbnQoKTsKLSAgICAKLSAgICBpZiggIXBhcmVudC5pc1ByZXNlbnQoKSApCi0gICAgewotICAgICAgcGFyZW50KCkudG91Y2hGb2xkZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGdldE91dFN0cmVhbSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0VVJJU2NoZW1lKCkKLSAgICovCi0gIHB1YmxpYyBVUklTY2hlbWUgZ2V0VVJJU2NoZW1lKCkKLSAgewotICAgIHJldHVybiBzY2hlbWVfOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNMZWFmKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGVhZigpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCAmJiAKLSAgICAgICAgICByZXNvdXJjZS5leGlzdHMoKSAmJiAKLSAgICAgICAgICByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICAvLyBUaGlzIFVSSSBkb2VzIG5vdCBleGlzdC4KLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1ByZXNlbnQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkgKQotICAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgLy8gVGhpcyBVUkkgZG9lcyBub3QgZXhpc3QuCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUmVhZGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSgpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpICkKLSAgICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIFRoaXMgVVJJIGRvZXMgbm90IGV4aXN0LgotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNSZWxhdGl2ZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aXZlKCkKLSAgeyAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1dyaXRhYmxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV3JpdGFibGUoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCAmJiAKLSAgICAgICAgICByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSAmJiAKLSAgICAgICAgICAhcmVzb3VyY2UuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuaXNSZWFkT25seSgpICkKLSAgICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIFRoaXMgVVJJIGRvZXMgbm90IGV4aXN0LgotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KCkKLSAgICovCi0gIHB1YmxpYyBVUklbXSBsaXN0KCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlICAgID0gZ2V0UmVzb3VyY2UoKTsKLSAgICBVUklbXSAgICAgdXJpQ2hpbGRyZW4gPSBuZXcgVVJJWzBdOwotICAgIAotICAgIGlmKCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiApCi0gICAgewotICAgICAgSUZvbGRlciAgICAgZm9sZGVyICAgPSAoSUZvbGRlcilyZXNvdXJjZTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElSZXNvdXJjZVtdIGNoaWxkcmVuICAgID0gZm9sZGVyLm1lbWJlcnMoKTsgIAotICAKLSAgICAgICAgdXJpQ2hpbGRyZW4gPSBuZXcgVVJJW2NoaWxkcmVuLmxlbmd0aF07Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgICAgewotICAgICAgICAgIElQYXRoIHBhdGggPSBjaGlsZHJlbltpbmRleF0uZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICB1cmlDaGlsZHJlbltpbmRleF0gPSBuZXcgRWNsaXBzZVVSSSggc2NoZW1lXy5nZXRVUkxGcm9tUGF0aChwYXRoKSwgZW52aXJvbm1lbnRfICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiB1cmlDaGlsZHJlbjsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2xpc3Qob3JnLmVjbGlwc2UuZW52LnVyaS5VUklGaWx0ZXIpCi0gICAqLwotICBwdWJsaWMgVVJJW10gbGlzdChVUklGaWx0ZXIgdXJpRmlsdGVyKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgIFVSSVtdICAgICByZXN1bHQgICA9IG5ldyBVUklbMF07Ci0gICAgCi0gICAgaWYoIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLSAgICAgewotICAgICAgSUZvbGRlciAgICAgZm9sZGVyICAgPSAoSUZvbGRlcilyZXNvdXJjZTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElSZXNvdXJjZVtdIGNoaWxkcmVuICAgID0gZm9sZGVyLm1lbWJlcnMoKTsgICAgICAgCi0gICAgICAgIFZlY3RvciAgICAgIHVyaUNoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICAgICB7Ci0gICAgICAgICAgSVBhdGggcGF0aCA9IGNoaWxkcmVuW2luZGV4XS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgIFVSSSAgIHVyaSAgPSBuZXcgRWNsaXBzZVVSSSggc2NoZW1lXy5nZXRVUkxGcm9tUGF0aChwYXRoKSwgZW52aXJvbm1lbnRfICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYoIHVyaUZpbHRlci5hY2NlcHRzKCB1cmkgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgdXJpQ2hpbGRyZW4uYWRkKCB1cmkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IChVUklbXSl1cmlDaGlsZHJlbi50b0FycmF5KCBuZXcgVVJJWzBdICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjcmVuYW1lKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVuYW1lKFVSSSBuZXdVUkkgKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaEZvbGRlcigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaEZvbGRlcigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgCi0gICAgaWYoIHJlc291cmNlICE9IG51bGwgKQotICAgIHsgCi0gICAgICBpZiggcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgKQotICAgICAgewotICAgICAgICBJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKXJlc291cmNlOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpZiggZm9sZGVyLm1lbWJlcnMoKS5sZW5ndGggPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiRWNsaXBzZVVSSSIsCi0gICAgICAgICAgICAgICAgICAgIG1zZ18uZ2V0TWVzc2FnZSggIk1TR19FUlJPUl9GT0xERVJfSEFTX0NISUxEUkVOIiwgbmV3IE9iamVjdFtdeyBmb2xkZXIudG9TdHJpbmcoKSB9ICksCi0gICAgICAgICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiApLAotICAgICAgICAgICAgICAgIHRoaXMgKTsKLQkJCQkJCQkJCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsgICAgICAgIAotICAgICAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIAotICAgICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiRWNsaXBzZVVSSSIsCi0gICAgICAgICAgICAgICAgICBleGMuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgU3RhdHVzLkVSUk9SLAotCQkJCSAgZXhjICksCi0gICAgICAgICAgICAgIHRoaXMgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgLy8/Pz8gTm90IHN1cmUgd2hhdCB0byBkbyBpZiB0b3VjaGluZyBhIGZvbGRlciBhbmQgdGhlIFVSSSBleGlzdHMgYW5kIGl0IGlzIG5vdCBhIGZvbGRlci4KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIElQYXRoIG5ld1BhdGggPSBuZXcgUGF0aCggc2NoZW1lXy5nZXRQYXRoRnJvbVBsYXRmb3JtVVJJKCB1cmlfICkgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIEZpbGVSZXNvdXJjZVV0aWxzLm1ha2VGb2xkZXJQYXRoKCBlbnZpcm9ubWVudF8uZ2V0UmVzb3VyY2VDb250ZXh0KCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0UHJvZ3Jlc3NNb25pdG9yKCksCi0JCQkgIAkgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFN0YXR1c0hhbmRsZXIoKSApOwotICAgICAgfQotICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiRWNsaXBzZVVSSSIsCi0gICAgICAgICAgICAgICAgZXhjLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICBTdGF0dXMuRVJST1IsCi0JCQkJCQkJCWV4YyApLAotICAgICAgICAgICAgdGhpcyApOwotICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaExlYWYoKQotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hMZWFmKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgewotICAgICAgLy8gVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIHNvIGRvIG5vdGhpbmcuCi0gICAgfSAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBwYXJlbnQgZm9yIHRoaXMgbGVhZiBhbmQgY3JlYXRlIGl0IGlmIHJlcXVpcmVkLgotICAgICAgVVJJIHBhcmVudCA9IHBhcmVudCgpOwotICAgICAgCi0gICAgICBpZiggIXBhcmVudC5pc1ByZXNlbnQoKSApCi0gICAgICB7ICAKLSAgICAgICAgcGFyZW50KCkudG91Y2hGb2xkZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIEdldCBhbiBvdXRwdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSBhbmQgaW1tZWRpYXRlbHkgY2xvc2UgaXQuCi0gICAgICAgIC8vIFRoaXMgc2hvdWxkIGNyZWF0ZSBhIDAgYnl0ZSBmaWxlLgotICAgICAgICBnZXRPdXRTdHJlYW0oKS5jbG9zZSgpOwotICAgICAgfQotICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlVVJJIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy5nZXRNZXNzYWdlKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQkJCSAgICAgIGV4YyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzICk7IAotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsgICAgCi0gICAgSVBhdGggIHBhdGggICAgICAgICAgICAgPSBuZXcgUGF0aCggc2NoZW1lXy5nZXRQYXRoRnJvbVBsYXRmb3JtVVJJKHVyaV8pICk7Ci0gICAgU3RyaW5nIGFic29sdXRlUGF0aG5hbWUgPSBwYXRoLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0gICAKLSAgICByZXR1cm4gRmlsZVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKGFic29sdXRlUGF0aG5hbWUpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRPdXRwdXRTdHJlYW0oKQotICAgKi8KLSAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZ2V0T3V0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVBhdGggICAgICAgIGZpbGUgICA9IG5ldyBQYXRoKCBzY2hlbWVfLmdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaV8gKSApLm1ha2VBYnNvbHV0ZSgpOwotICAgIE91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgIAotICAgIHN0cmVhbSA9IEZpbGVSZXNvdXJjZVV0aWxzLm5ld0ZpbGVPdXRwdXRTdHJlYW0gKCBlbnZpcm9ubWVudF8uZ2V0UmVzb3VyY2VDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0UHJvZ3Jlc3NNb25pdG9yKCksCi0gCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRTdGF0dXNIYW5kbGVyKCkgKTsgICAgCi0gICAgcmV0dXJuIHN0cmVhbTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBGaWxlIG9iamVjdCBmb3IgdGhlIHJlc291cmNlIHVuZGVyIHRoaXMgVVJJLgotICAgKiBUaGVyZSBhcmUgbWFueSBVUklzIGFuZCBVUklTY2hlbWVzIGZvciB3aGljaCB0aGlzIG1ldGhvZAotICAgKiB3aWxsIGZhaWwgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgc2hvdWxkIGJlIHVzZWQgb25seQotICAgKiBpbiBjYXNlcyB3aGVyZSBVUklzIGFyZSBrbm93biB0byBiZSBiYWNrZWQgYnkgcGh5c2ljYWwgZmlsZXMuCi0gICAqLwotICBwdWJsaWMgRmlsZSBhc0ZpbGUgKCkKLSAgewotICAJcmV0dXJuIGZpbGVfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSSNpc0F2YWlsYWJsZUFzRmlsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzRmlsZSgpIAotICB7Ci0gIAlyZXR1cm4gZmlsZV8gIT0gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBGaWxlIGdldEZpbGUoKQotICB7Ci0gICAgU3RyaW5nIHBsYXRmb3JtUmVzID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7Ci0gICAgRmlsZSAgIHJlc3VsdCAgICAgID0gbnVsbDsKLSAgICAKLSAgICBpZiAodXJpXy5zdGFydHNXaXRoKHBsYXRmb3JtUmVzKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgRmlsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQodXJpXy5zdWJzdHJpbmcocGxhdGZvcm1SZXMubGVuZ3RoKCksIHVyaV8ubGVuZ3RoKCkpKS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tYW5kbGluZS9Db21tYW5kTGluZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tYW5kbGluZS9Db21tYW5kTGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzdiZDBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbWFuZGxpbmUvQ29tbWFuZExpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tYW5kbGluZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkJpdFNldDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb21tb24uU3RyaW5nVXRpbHM7Ci0KLQotLyoqCi0gICogPHA+VGhpcyBpcyBhIGdlbmVyaWMgY29tbWFuZCBsaW5lIHBhcnNpbmcgY2xhc3MuICBUaGUgcHJvZ3JhbW1lciBuZWVkIG9ubHkgc3BlY2lmeQotICAqIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlaXIgY29tbWFuZCBsaW5lKGllLiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIGZsYWdzLCBldGMpCi0gICogYW5kIHRoaXMgY2xhc3Mgd2lsbCBwZXJmb3JtIHRoZSByZXN0IG9mIHRoZSBwYXJzaW5nIHdvcmsuICBBcyBhbiBhZGRlZCBib251cyB0aGlzCi0gICogY2xhc3Mgd2lsbCBhbHNvIGNyZWF0ZSBmb3JtYXRlZCBoZWxwIHRleHQgdGhhdCBkaXNwbGF5cyB0aGUgc3ludGF4IG9mIHRoaXMKLSAgKiBjb21tYW5kIGxpbmUuCi0gICoKLSAgKiA8cD5UaGUgbWFpbiBwYXJhbWV0ZXIgdG8gdGhlIENvbW1hbmRMaW5lIGNvbnN0cnVjdG9yIGlzIGEgdHdvIGRpbWVuc2lvbmFsIFN0cmluZwotICAqIGFycmF5LiAgVGhlcmUgYXJlIDUgY29sdW1ucyBpbiB0aGlzIGFycmF5IGFuZCBhcyBtYW55IHJvd3MgYXMgbmVlZGVkIGZvciBlYWNoCi0gICogZmxhZyBvciBwb3NpdGlvbmFsIHBhcmFtZXRlci4gIFRoZSBmaXZlIGNvbHVtbnMgYXJlOgotICAqCi0gICogPG9sPgotICAqIDxsaT5UaGUgbmFtZSBvZiB0aGUgZmxhZyhlZy4gImhlbHAiIG9yICJhIiwgZXRjKQotICAqICAgICBOb3RlOiBubyBkYXNoIHNob3VsZCBiZSBpbiB0aGUgbmFtZSBoZXJlLiAgVGhlIHVzZXIgd291bGQgc3BlY2lmeSAiLWhlbHAiIG9uIHRoZQotICAqICAgICAgICAgICBjb21tYW5kIGxpbmUgdGhvdWdoLgotICAqIDxsaT5UaGUgbmFtZSBvZiB0aGUgZmxhZyBwYXJhbWV0ZXIoaWYgYW55KQotICAqIDxsaT5BIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBmbGFnIGNhbiBhcHBlYXIgbW9yZSB0aGFuIG9uY2Ugb24gdGhlCi0gICogICAgIGNvbW1hbmQgbGluZS4KLSAgKiA8bGk+QSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgZmxhZyBtdXN0IGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAqIDxsaT5BIGhlbHAgdGV4dCBzdHJpbmcgd2hpY2ggZGVzY3JpYmVzIHRoaXMgcGFydGljdWxhciBmbGFnIG9yIHBvc2l0aW9uYWwgcGFyYW1ldGVyLgotICAqIDwvb2w+Ci0gICoKLSAgKiA8cD5FYWNoIHJvdyBpbiB0aGUgc3RyaW5nIGFycmF5IGlzIGFzc29jaWF0ZSB3aXRoIGVpdGhlciBhIHBvc2l0aW9uYWwgcGFyYW1ldGVyCi0gICogb3Igd2l0aCBhIGZsYWcuICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBjb21tYW5kIGxpbmU6Ci0gICogPHVsPgotICAqIDxsaT5NeV9wcm9nIHJlcXVpcmVkX3Bhcm0xIC1hYiBwYXJtX2Zvcl9hYiByZXF1aXJlZF9wYXJtMiAtaGVscCBvcHRpb25hbF9wYXJtcwotICAqIDwvdWw+Ci0gICoKLSAgKiA8cD5JbiB0aGlzIGV4YW1wbGUgTXlfcHJvZyBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbS4gIHJlcXVpcmVkX3Bhcm0xIGFuZAotICAqIHJlcXVpcmVkX3Bhcm0yIG11c3QgYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBOb3RpY2UgdGhhdCB0aGV5IGRvIG5vdAotICAqIGhhdmUgdG8gYmUgYWRqYWNlbnQgdG8gZWFjaCBvdGhlciBvbiB0aGUgY29tbWFuZCBsaW5lLiBvcHRpb25hbF9wYXJtcyBtYXkgb3B0aW9uYWxseQotICAqIHNwZWNpZmllZC4gIG9wdGlvbmFsX3Bhcm1zIGNhbiBiZSAwIG9yIG1vcmUgcGFyYW1ldGVycy4gIFRoZXkgZG9lcyBub3QgbmVlZCB0byBiZQotICAqIGFkamFjZW50IHRvIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzLCBidXQgdGhleSBkbyBuZWVkIHRvIGZvbGxvdyB0aGUgcmVxdWlyZWQKLSAgKiBwYXJhbWV0ZXJzLiBUd28gZmxhZ3MgYXJlIHNwZWNpZmllZCAiLWFiIiBhbmQgIi1oZWxwIi4gIFRoZSAiLWFiIiBmbGFnIGhhcyBhCi0gICogcGFyYW1ldGVyICJwYXJtX2Zvcl9hYiIgYXNzb2NpYXRlZCB3aXRoIGl0LiAgTm90ZTogYSBmbGFnIGNhbiBub3QgaGF2ZSBhbiBvcHRpb25hbAotICAqIHBhcmFtZXRlci4gKGllLiBhIGZsYWcgZWl0aGVyIG5ldmVyIGhhdmUgYSBwYXJhbWV0ZXIgb3IgaXQgYWx3YXlzIGhhcyBhIHBhcmFtZXRlcikKLSAgKiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBmaXJzdCB0d28gcm93cyBpbiB0aGUgc3RyaW5nIGFycmF5IHdvdWxkIGRlc2NyaWJlIHJlcXVpcmVkX3Bhcm0xCi0gICogYW5kIHJlcXVpcmVkX3Bhcm0yLiAgVGhlIHRoaXJkIGVudHJ5IHdvdWxkIGRlc2NyaWJlIG9wdGlvbmFsX3Bhcm1zLiAgVGhlIGZvdXJ0aCBhbmQKLSAgKiBmaWZ0aCByb3dzIHdvdWxkIGRlc2NyaWJlICItYWIiIGFuZCAiLWhlbHAiLiAgRm9yIHRoaXMgY29tbWFuZCBsaW5lIHRoZSBzdHJpbmcgYXJyYXkKLSAgKiB3b3VsZCBsb29rIGxpa2UgdGhpczoKLSAgKgotICAqIDx1bD4KLSAgKiA8bGk+eyB7IENvbW1hbmRMaW5lLlBPU0lUSU9OQUwsICJwYXJtMSIsIENvbW1hbmRMaW5lLk5PX0RVUFMsCi0gICogICAgICAgQ29tbWFuZExpbmUuUkVRVUlSRUQsICJwYXJtMSBoZWxwIHRleHQiIH0sCi0gICogPGxpPnsgQ29tbWFuZExpbmUuUE9TSVRJT05BTCwgInBhcm0yIiwgQ29tbWFuZExpbmUuTk9fRFVQUywKLSAgKiAgICAgICBDb21tYW5kTGluZS5SRVFVSVJFRCwgInBhcm0yIGhlbHAgdGV4dCIgfSwKLSAgKiA8bGk+eyBDb21tYW5kTGluZS5QT1NJVElPTkFMLCAib3B0aW9uYWxfcGFybXMiLCBDb21tYW5kTGluZS5EVVBTX09LLAotICAqICAgICAgIENvbW1hbmRMaW5lLlJFUVVJUkVELCAib3B0aW9uYWwgaGVscCB0ZXh0IiB9LAotICAqIDxsaT57ICJhYiIsICJwYXJtX2Zvcl9hYiIsIENvbW1hbmRMaW5lLk5PX0RVUFMsCi0gICogICAgICAgQ29tbWFuZExpbmUuT1BUSU9OQUwsICJhYiBoZWxwIHRleHQiIH0sCi0gICogPGxpPnsgImhlbHAiLCBDb21tYW5kTGluZS5OT19QQVJNLCBDb21tYW5kTGluZS5OT19EVVBTLAotICAqICAgICAgIENvbW1hbmRMaW5lLk9QVElPTkFMLCAiZGlzcGxheXMgdGhpcyBoZWxwIHRleHQiIH0gfQotICAqIDwvdWw+Ci0gICoKLSAgKiA8cD5TdHJpbmcgYXJyYXkgcnVsZXM6Ci0gICoKLSAgKiA8b2w+Ci0gICogPGxpPlBvc2l0aW9uYWwgcm93cyBtdXN0IGFsd2F5cyBjb21lIGZpcnN0IGluIHRoZSBhcnJheS4gIFRoZXNlIHJvd3MgbXVzdAotICAqICAgICBoYXZlIGEgbmFtZSBzcGVjaWZpZWQgaW4gY29sdW1uIDIsIGV4Y2VwdCBmb3Igb25lIGNhc2UuICBJZiB5b3Ugd2FudCB0byBpbmRpY2F0ZSB0aGF0Ci0gICogICAgIHRoZXJlIGFyZSBubyBvcHRpb25hbCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgeW91IHdvdWxkIHB1dCBDb21tYW5kTGluZS5OT19QQVJNCi0gICogICAgIGluIGNvbHVtbiAyIG9mIHRoZSBwb3NpdGlvbmFsIHJvdy4gIFlvdSB3b3VsZCBhbHNvIG5lZWQgdG8gcHV0IENvbW1hbmRMaW5lLk9QVElPTkFMCi0gICogICAgIGluIGNvbHVtbiA0IHNpbmNlIHRoaXMgcm93IGlzIGZvciBvcHRpb25hbCBwYXJhbWV0ZXJzKG9yIHRoZSBub24tZXhpc3RlbmNlIG9mCi0gICogICAgIG9wdGlvbmFsIHBhcmFtZXRlcnMgYXMgdGhlIGNhc2UgbWF5IGJlKQotICAqIDxsaT5PbmNlIGEgcG9zaXRpb25hbCByb3cgc3BlY2lmaWVzIHRoYXQgaXQgaXMgb3B0aW9uYWwsIG5vIGZ1cnRoZXIgcG9zaXRpb25hbCByb3dzCi0gICogICAgIG1heSBiZSBzcGVjaWZpZWQuCi0gICogPGxpPkF0IGxlYXN0IG9uZSBwb3NpdGlvbmFsIHJvdyBtdXN0IGJlIHNwZWNpZmllZCwgZXZlbiBpZiBpdCBpcyB0byBqdXN0IHRvIHNwZWNpZnkgdGhhdAotICAqICAgICB0aGVyZSBhcmUgbm8gb3B0aW9uYWwgcGFyYW1ldGVycy4KLSAgKiA8bGk+RmxhZyBuYW1lcyBtdXN0IGJlIGluIGxvd2VyIGNhc2UuICBOb3RlOiB0aGUgdXNlciBjYW4gc3BlY2lmeSB1cHBlciBvciBsb3dlciBjYXNlCi0gICogICAgIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICogPGxpPklmIGEgZmxhZyBoYXMgYSBwYXJhbWV0ZXIgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBzaG91bGQgYmUgcHV0IGludG8gY29sdW1uIDIuCi0gICogICAgIG90aGVyd2lzZSBDb21tYW5kTGluZS5OT19QQVJNIHNob3VsZCBiZSBwdXQgaW4gY29sdW1uIDIuCi0gICogPGxpPklmIGEgZmxhZyBpcyBhbGxvd2VkIHRvIGFwcGVhciBtb3JlIHRoYW4gb25jZSBvbiB0aGUgY29tbWFuZCBsaW5lIHRoZW4KLSAgKiAgICAgQ29tbWFuZExpbmUuRFVQU19PSyBzaG91bGQgYmUgcHV0IGludG8gY29sdW1uIDMsIG90aGVyd2lzZSBDb21tYW5kTGluZS5OT19EVVBTCi0gICogICAgIHNob3VsZCBiZSBwdXQgaW50byBjb2x1bW4gMy4KLSAgKiA8bGk+SWYgYSBmbGFnIG11c3QgYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgdGhlbiBDb21tYW5kTGluZS5SRVFVSVJFRCBzaG91bGQKLSAgKiAgICAgYmUgc3BlY2lmaWVkIGluIGNvbHVtbiA0LCBvdGhlcndpc2UgQ29tbWFuZExpbmUuT1BUSU9OQUwgc2hvdWxkIGJlIHNwZWNpZmllZC4KLSAgKiA8bGk+QSBoZWxwIGZsYWcgbXVzdCBiZSBzcGVjaWZpZWQuCi0gICogPGxpPlRoZSBzdHJpbmdzIHNwZWNpZmllZCBpbiB0aGUgZmxhZ3MgY29sdW1uLCB0aGUgcGFyYW1ldGVyIG5hbWUgY29sdW1uLCBhbmQgdGhlCi0gICogICAgIGhlbHAgY29sdW1uIGFyZSBhbHdheXMgdHJhbnNsYXRlZCB1c2luZyB0aGUgcmVzb3VyY2UgYnVuZGxlIHNwZWNpZmllZC4gIE9mCi0gICogICAgIGNvdXJzZSB0aGUgc3BlY2lhbCBzdHJpbmcgdmFsdWVzIHN1Y2ggYXMgUE9TSVRJT05BTCBhbmQgTk9fUEFSTSBhcmUgbm90Ci0gICogICAgIHRyYW5zbGF0ZWQuCi0gICogPC9vbD4KLSAgKgotICAqIDxwPiBGbGFnIG1hdGNoaW5nIHJ1bGVzOgotICAqIDxvbD4KLSAgKiA8bGk+VGhlIHBhcnNlciB3aWxsIGF0dGVtcHQgdG8gbWF0Y2ggYSB1c2VyIHNwZWNpZmllZCBmbGFnIHdpdGggdGhlIG1pbmltdW0gbnVtYmVyCi0gICogICAgIG9mIHByb2dyYW1tZXIgc3BlY2lmaWVkIGZsYWcgY2hhcmFjdGVycy4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvZ3JhbW1lciBoYXMKLSAgKiAgICAgc3BlY2lmaWVkIHRoYXQgdGhlIGZsYWcgaXMgImhlbHAiIHRoZSB1c2VyIGNvdWxkIHNwZWNpZnkgIi1oIiwgIi1oZSIsICItaGVsIiwgb3IKLSAgKiAgICAgIi1oZWxwIi4gIElmIHRoZSBwcm9ncmFtbWVyIGhhcyBhbHNvIHNwZWNpZmllZCBhIGZsYWcgY2FsbGVkICJoZWxsbyIsIHRoZQotICAqICAgICB1c2VyIHdvdWxkIGdldCBhbiBlcnJvciBtZXNzYWdlIGZvciBzcGVjaWZpbmcgZWl0aGVyICItaCIsICItaGUiIG9yICItaGVsIiwgc2luY2UKLSAgKiAgICAgaXQgaXMgYW1iaWd1b3VzIHdoaWNoIGZsYWcgaXMgYmVpbmcgcmVmZXJlZCB0by4gIEJvdGggIi1oZWxsIiBhbmQgIi1oZWxsbyIKLSAgKiAgICAgd291bGQgYmUgb2sgZm9yIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGhlbGxvIGZsYWcgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAgKiA8bGk+SWYgYSBmbGFnIGhhcyBhIHBhcmFtZXRlciwgdGhlIHBhcmFtZXRlciBtYXkgYmUgaW1tZWRpYXRlbHkgYWRqYWNlbnQgdG8gdGhlIGZsYWcuCi0gICogICAgIEZvciBleGFtcGxlIGlmICJhYmNkIiBpcyBzcGVjaWZpZWQgYXMgYSBmbGFnIHdpdGggYSBwYXJhbWV0ZXIsIHRoZSB1c2VyIGNvdWxkCi0gICogICAgIHNwZWNpZnkgdGhlIGZvbGxvd2luZyBhc3N1bWluZyB0aGVyZSBhcmUgbm8gb3RoZXIgYW1iaWd1b3VzIGZsYWdzLiAiLWFiY2RwYXJtIiwKLSAgKiAgICAgIi1hYmNwYXJtIiwgIi1hYnBhcm0iLCBvciAiLWFwYXJtIiB3aGVyZSBwYXJtIGlzIHRoZSBwYXJhbWV0ZXIgZm9yIHRoZSBmbGFnLgotICAqICAgICAoT2YgY291cnNlIHRoZSB1c2VyIGNhbiBhbHdheXMgcHV0IGEgd2hpdGUgc3BhY2UgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlCi0gICogICAgIHBhcmFtZXRlci4pCi0gICogPGxpPklmIGEgZmxhZyBkb2VzIG5vdCBoYXZlIGEgcGFyYW1ldGVyIGFuZCBhIHBhcmFtZXRlciBpcyBhZGphY2VudCB0byBpdCB0aGVuIHRoaXMKLSAgKiAgICAgcGFyYW1ldGVyIGlzIGludGVycHJldGVkIGFzIGEgcG9zaXRpb25hbCBwYXJhbWV0ZXIuICBGb3IgZXhhbXBsZSBpZiAiYWJjYiIgaXMKLSAgKiAgICAgc3BlY2lmaWVkIGFzIGEgZmxhZyBhbmQgdGhlIHVzZXIgc3BlY2lmaWVzICItYWJoZWxsbyIsIHRoZW4gdGhlIGZpcnN0ICJhYiIgd2lsbCBiZQotICAqICAgICBpbnRlcnByZXRlZCBhcyB0aGUgZmxhZyBhbmQgImhlbGxvIiB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgcG9zaXRpb25hbAotICAqICAgICBwYXJhbWV0ZXIuCi0gICogPC9vbD4KLSAgKgotICAqIEBhdXRob3IgUGV0ZXIgTW9vZ2sKLSAgKiBAZGF0ZSAgIEp1bHkgMTMsIDIwMDAKLSoqLwotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZExpbmUKLXsKLSAgLy8gQ29uc3RhbnQgc3RyaW5ncyB0aGF0IHRoZSB1c2VyIHNob3VsZCB1c2UgaW4gdGhlaXIgZmxhZ3NfaW5mbyBpbnB1dCBhcnJheS4KLSAgLyoqCi0gICAgKiBTcGVjaWZpZXMgdGhhdCB0aGlzIGZsYWcgb3IgcG9zaXRpb25hbCBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRCAgID0gInJlcXVpcmVkIjsKLSAgLyoqCi0gICAgKiBTcGVjaWZpZXMgdGhhdCB0aGlzIGZsYWcgb3IgcG9zaXRpb25hbCBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTCAgID0gIm9wdGlvbmFsIjsKLSAgLyoqCi0gICAgKiBTcGVjaWZpZXMgdGhhdCB0aGlzIGZsYWcgbWF5IGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAgICogTm90ZTogVGhpcyBzdHJpbmcgaGFzIG5vIG1lYW5pbmcgZm9yIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4KLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERVUFNfT0sgICAgPSAiZHVwc19vayI7Ci0gIC8qKgotICAgICogU3BlY2lmaWVzIHRoYXQgdGhpcyBmbGFnIG1heSBub3QgYmUgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgKiBOb3RlOiBUaGlzIHN0cmluZyBoYXMgbm8gbWVhbmluZyBmb3IgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fRFVQUyAgICA9ICJub19kdXBzIjsKLSAgLyoqCi0gICAgKiBTcGVjaWZpZXMgdGhhdCBhIHJvdyBpcyBhIHBvc2l0aW9uYWwgcGFyYW1ldGVyIHJvdy4KLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU0lUSU9OQUwgPSAiIjsKLSAgLyoqCi0gICAgKiBTcGVjaWZpZXMgdGhhdCBhIGZsYWcgaGFzIG5vIHBhcmFtZXRlci4gIEZvciBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgdGhpcwotICAgICogc3RyaW5nIGluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSBubyBvcHRpb25hbCBwYXJhbWV0ZXJzLgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fUEFSTSAgICA9ICIiOwotICAKLSAgLyoqCi0gICAgKiBAcGFyYW0gZmxhZ3NfaW5mbyBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUKLSAgICAqICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgbGluZSBwYXJzZXIuICBTZWUgdGhlIGNsYXNzIGRlc2NyaXB0aW9uIGZvciBhCi0gICAgKiAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uIG9mIHdoYXQgdGhpcyBzdHJpbmcgYXJyYXkgc2hvdWxkIGxvb2sgbGlrZS4KLSAgICAqIEBwYXJhbSBoZWxwX2ZsYWcgIFRoaXMgc3RyaW5nIGluZGljYXRlcyB3aGljaCBmbGFnIGluIHRoZSBmbGFnc19pbmZvCi0gICAgKiAgICAgICAgICAgICAgICAgICBhcnJheSBpcyB0aGUgaGVscCBmbGFnLgotICAgICogQHBhcmFtIHRvb2xfbmFtZSAgVGhpcyBzdHJpbmcgaW5kaWNhdGVzIHRoZSBuYW1lIG9mIHRoZSB0b29sIHRoYXQgdGhpcwotICAgICogICAgICAgICAgICAgICAgICAgY29tbWFuZCBsaW5lIHBhcnNlciBpcyBiZWluZyB1c2VkIGZvci4gIFRoaXMgc3RyaW5nCi0gICAgKiAgICAgICAgICAgICAgICAgICBpcyBvbmx5IHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgaGVscCB0ZXh0LgotICAqKi8KLSAgcHVibGljIENvbW1hbmRMaW5lKCBTdHJpbmdbXVtdICAgICBmbGFnc19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICBoZWxwX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgICAgICAgIHRvb2xfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgZmxhZ01lc3NhZ2VzICkKLSAgICAgICAgICAgICAgICAgICAKLSAgICB0aHJvd3MgSW50ZXJuYWxFcnJvckV4YwotICB7Ci0gICAgdGhpcy5mbGFnc19pbmZvICAgPSBmbGFnc19pbmZvOwotICAgIHRoaXMuaGVscF9mbGFnICAgID0gaGVscF9mbGFnOwotICAgIHRoaXMudG9vbF9uYW1lICAgID0gdG9vbF9uYW1lOwotICAgIHRoaXMuZmxhZ01lc3NhZ2VzID0gZmxhZ01lc3NhZ2VzOwotICAgIAotICAgIG1lc3NhZ2VzID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1hbmRsaW5lLmNvbW1hbmRsaW5lIiApOwotICAgIHZlcmlmeV9mbGFnc19pbmZvKCk7Ci0gIH0KLQotICAvKioKLSAgICAqIENhbGwgdGhpcyBtZXRob2QgdG8gcGFyc2UgYSBjb21tYW5kIGxpbmUuCi0gICAgKiBAcGFyYW0gYXJncyBUaGlzIGlzIHRoZSBzdHJpbmcgYXJyYXkgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICAgICogQHRocm93cyBGbGFnX2Vycm9yIElmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgdGhlIGNvbW1hbmQgbGluZSBpbmNvcnJlY3RseQotICAgICogICAgICAgICAgICAgICAgICAgIGEgRmxhZ19lcnJvciBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uICBVc2UgZ2V0TWVzc2FnZQotICAgICogICAgICAgICAgICAgICAgICAgIHRvIGdldCBhIGRlc2NyaXB0aW9uIG9mIHRoZSB1c2VyIGVycm9yLgotICAgICoKLSAgICAqIEB0aHJvd3MgSGVscF9zcGVjaWZpZWQgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIHRoZSBoZWxwIGZsYWcgdGhpcyBleGNlcHRpb24KLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB0aHJvd24uICBVc2UgZ2V0TWVzc2FnZSB0byBnZXQgYSBmdWxseQotICAgICogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgc3ludGF4IGRlc2NyaXB0aW9uIG9mIHRoaXMgY29tbWFuZCBsaW5lLgotICAqKi8KLSAgcHVibGljIHZvaWQgY2hlY2tfZmxhZ3MoIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRmxhZ19lcnJvcgotICB7Ci0gICAgZmxhZ3Nfc3BlY2lmaWVkID0gbmV3IFZlY3RvcltmbGFnc19pbmZvLmxlbmd0aF07Ci0KLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGJvb2xlYW4gcHJvY2Vzc2VkX3RoZV9uZXh0X2FyZyA9IHByb2Nlc3NfYXJnKCBhcmdzLCBpbmRleCApOwotICAgICAgaWYoIHByb2Nlc3NlZF90aGVfbmV4dF9hcmcgPT0gdHJ1ZSApIGluZGV4Kys7Ci0gICAgfQotCi0gICAgLy8gSWYgaGVscCB3YXMgc3BlY2lmaWVkIHdlIHdpbGwgbm90IGNoZWNrIHRoZSByZWd1bGFyIHJ1bGVzLgotICAgIGlmKCAhZmxhZ19zcGVjaWZpZWQoIGhlbHBfZmxhZyApICkKLSAgICB7Ci0gICAgICAvLyBDaGVjayBmb3IgZmxhZ3MgYnJlYWtpbmcgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBmbGFnc19pbmZvLgotICAgICAgY2hlY2tfcnVsZXMoKTsKLQotICAgICAgLy8gQ2FsbCBzdWJjbGFzc2VkIG1ldGhvZCB0byBzZWUgaWYgbW9yZSBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkLgotICAgICAgbW9yZV9wcm9jZXNzaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCBpcyBmb3Igc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF0Ci0gICAgKiB0aGUgdmVyeSBlbmQgb2YgY2hlY2tfZmxhZ3MgbWV0aG9kLiAgSXQgaXMgaW50ZW5kZWQgdGhhdCBzdWJjbGFzc2VzIHdvdWxkCi0gICAgKiBwZXJmb3JtIGFkZGl0aW9uYWwgY29tbWFuZCBsaW5lIGNoZWNraW5nIGhlcmUuCi0gICoqLwotICBwcm90ZWN0ZWQgdm9pZCBtb3JlX3Byb2Nlc3NpbmcoKSB0aHJvd3MgRmxhZ19lcnJvciwgSW50ZXJuYWxFcnJvckV4YwotICB7Ci0gIH0KLQotICAvKioKLSAgICAqIE9uY2UgdGhlIGNvbW1hbmQgbGluZSBoYXMgYmVlbiBwYXJzZWQgYnkgY2FsbGluZyBjaGVja19mbGFncyBhCi0gICAgKiBjYWxsIGNhbiBiZSBtYWRlIHRvIHRoaXMgbWV0aG9kIHRvIGdldCB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBmbGFnLgotICAgICogSWYgdGhlIGZsYWcgd2FzIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgKiBJZiB0aGUgZmxhZyB3YXMgc3BlY2lmaWVkLCBidXQgaGFzIG5vIHBhcmFtZXRlcnMgYSB2YWxpZCB2ZWN0b3Igd2lsbCBiZQotICAgICogcmV0dXJuZWQgY29udGFpbmluZyBhIG51bGwuCi0gICoqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0X2ZsYWdfcGFybXMoIFN0cmluZyBmbGFnICkKLSAgewotICAgIGludCAgICAgcm93ICAgICAgICA9IDA7Ci0gICAgYm9vbGVhbiBmbGFnX2ZvdW5kID0gZmFsc2U7Ci0KLSAgICB3aGlsZSggZmxhZ19mb3VuZCA9PSBmYWxzZSAmJiByb3cgPCBmbGFnc19pbmZvLmxlbmd0aCApCi0gICAgewotICAgICAgaWYoIGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF0uZXF1YWxzKCBmbGFnICkgKQotICAgICAgewotICAgICAgICBmbGFnX2ZvdW5kID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcm93Kys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYoIGZsYWdfZm91bmQgPT0gdHJ1ZSApIAotICAgIHsKLSAgICAgIFZlY3RvciBwYXJtcyA9IGZsYWdzX3NwZWNpZmllZFtyb3ddOwotICAgICAgcmV0dXJuIHBhcm1zID09IG51bGwgPyBudWxsIDogKFN0cmluZ1tdKShwYXJtcy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICkpOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIGdldCBhbGwgb2YgdGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4KLSAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYm90aCB0aGUgcmVxdWlyZWQgcG9zaXRpb25hbHMgYW5kIHRoZQotICAgICogb3B0aW9uYWwgcG9zaXRpb25hbHMgaW4gdGhhdCBvcmRlci4gIElmIG5vIHBvc2l0aW9uYWwgcGFyYW1ldGVycwotICAgICogd2VyZSBzcGVjaWZpZWQgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotICAqKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldF9wb3NpdGlvbmFscygpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZ1tdKWZsYWdzX3NwZWNpZmllZFtQT1NJVElPTkFMX1JPV10udG9BcnJheSggbmV3IFN0cmluZ1swXSApOwotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhpcyBmbGFnIHdhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKLSAgICAqIG90aGVyd2lzZSBmYWxzZSBpcyByZXR1cm5lZC4KLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIGZsYWdfc3BlY2lmaWVkKCBTdHJpbmcgZmxhZyApCi0gIHsKLSAgICByZXR1cm4gZ2V0X2ZsYWdfcGFybXMoIGZsYWcgKSAhPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGZ1bGx5IGZvcm1hdGVkIGhlbHAgdGV4dCBzeW50YXggZm9yIHRoaXMKLSAgICAqIGNvbW1hbmQgbGluZS4KLSAgKiovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0X2hlbHBfdGV4dCgpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgaGVscF90ZXh0ICA9IG5ldyBTdHJpbmdCdWZmZXIoNDAwKTsKLSAgICBpbnQgICAgICAgICAgaGVscF93aWR0aCA9IEhFTFBfTElORV9MRU4gLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtICAgICAgICAgICAgICAvLyBibGFua3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSAgICAgICAgICAgICAgLy8gZGFzaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2ZsYWdfc2l6ZSAtICAvLyBmbGFnIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gICAgICAgICAgICAgIC8vIGJsYW5rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbmFtZV9zaXplIC0gIC8vIG5hbWUgZmllbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE7ICAgICAgICAgICAgICAgLy8gYmxhbmsKLQotICAgIGhlbHBfdGV4dC5hcHBlbmQoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9JTkZPX1NZTlRBWCApICsKLSAgICAgICAgICAgICAgICAgICAgICAiOiAiICsgdG9vbF9uYW1lICsgIiAiICk7Ci0KLSAgICAvLyBEaXNwbGF5IHRoZSByZXF1aXJlZCBwb3NpdGlvbmFscyBpZiBhbnkuCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHJlcXVpcmVkX3Bvc2l0aW9uYWxzOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBoZWxwX3RleHQuYXBwZW5kKCBmbGFnTWVzc2FnZXMuZ2V0U3RyaW5nKCBmbGFnc19pbmZvW2luZGV4XVtOQU1FX0NPTF0gKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICIgKTsKLSAgICB9Ci0KLSAgICBoZWxwX3RleHQuYXBwZW5kKCAiWyIgKyBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRkxBR1MgKSArCi0gICAgICAgICAgICAgICAgICAgICAgIl0gIiApOwotCi0gICAgaWYoIG9wdGlvbmFsX3Bvc2l0aW9uYWxzX2FsbG93ZWQgPT0gdHJ1ZSApCi0gICAgewotICAgICAgaGVscF90ZXh0LmFwcGVuZCggZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tvcHRpb25hbF9saXN0X2luZGV4XVtOQU1FX0NPTF0gKSApOwotICAgIH0KLQotICAgIGhlbHBfdGV4dC5hcHBlbmQoICJcbiAgIiArIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9JTkZPX1dIRVJFICkgKyAiXG4iICk7Ci0KLSAgICAvLyBDcmVhdGUgb25lIGxpbmUgb2YgZGVzY3JpcHRpb24gZm9yIGVhY2ggcGFyYW1ldGVyCi0gICAgZm9yKCBpbnQgcm93ID0gMDsgcm93IDwgZmxhZ3NfaW5mby5sZW5ndGg7IHJvdysrICkKLSAgICB7Ci0gICAgICBTdHJpbmcgY29sdW1uSWQgICA9IGZsYWdzX2luZm9bcm93XVtOQU1FX0NPTF07Ci0gICAgICBTdHJpbmcgY29sdW1uTmFtZSA9IGNvbHVtbklkID09IE5PX1BBUk0gPyAiIiA6IGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGNvbHVtbklkICk7Ci0KLSAgICAgIFN0cmluZyBmbGFnSWQgICAgID0gZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXTsKLSAgICAgIFN0cmluZyBmbGFnTmFtZSAgID0gZmxhZ0lkID09IFBPU0lUSU9OQUwgPyBQT1NJVElPTkFMIDogZmxhZ01lc3NhZ2VzLmdldFN0cmluZyhmbGFnSWQpOwotCi0gICAgICBpbnQgZmxhZ19wYWRkaW5nID0gbWF4X2ZsYWdfc2l6ZSAtIGZsYWdOYW1lLmxlbmd0aCgpOwotICAgICAgaW50IG5hbWVfcGFkZGluZyA9IG1heF9uYW1lX3NpemUgLSBjb2x1bW5OYW1lLmxlbmd0aCgpOwotCi0gICAgICAvLyBTa2lwIHRoaXMgcm93IGlmIHRoaXMgaXMgYSBtYXJrZXIgZm9yIG5vIG9wdGlvbmFsIHBvc2l0aW9uYWxzLgotICAgICAgaWYoIGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF0gPT0gUE9TSVRJT05BTCAmJgotICAgICAgICAgIGZsYWdzX2luZm9bcm93XVtOQU1FX0NPTF0gPT0gTk9fUEFSTSApIGNvbnRpbnVlOwotCi0gICAgICBpZiggZmxhZ05hbWUgPT0gUE9TSVRJT05BTCApCi0gICAgICB7Ci0gICAgICAgIGhlbHBfdGV4dC5hcHBlbmQoIGdldEJsYW5rcygzICkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaGVscF90ZXh0LmFwcGVuZCggIiAgLSIgKyBmbGFnTmFtZSApOwotICAgICAgfQotCi0gICAgICBoZWxwX3RleHQuYXBwZW5kKCBnZXRCbGFua3MoIGZsYWdfcGFkZGluZyArIDEgKSApOwotICAgICAgaGVscF90ZXh0LmFwcGVuZCggY29sdW1uTmFtZSApOwotICAgICAgaGVscF90ZXh0LmFwcGVuZCggZ2V0QmxhbmtzKCBuYW1lX3BhZGRpbmcgKyAxICkgKTsKLQotICAgICAgU3RyaW5nICAgY29sdW1uSGVscCA9IGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdzX2luZm9bcm93XVtIRUxQX0NPTF0gKTsKLSAgICAgIFN0cmluZ1tdIHNwbGl0X2hlbHBfdGV4dAotICAgICAgICA9IFN0cmluZ1V0aWxzLnNwbGl0dGVyKCBjb2x1bW5IZWxwLCBoZWxwX3dpZHRoICk7Ci0KLSAgICAgIGlmKCBzcGxpdF9oZWxwX3RleHQubGVuZ3RoID4gMCApCi0gICAgICAgIGhlbHBfdGV4dC5hcHBlbmQoIHNwbGl0X2hlbHBfdGV4dFswXSArICJcbiIgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgaGVscF90ZXh0LmFwcGVuZCggIlxuIiApOwotCi0gICAgICBmb3IoIGludCBpbmRleCA9IDE7IGluZGV4IDwgc3BsaXRfaGVscF90ZXh0Lmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIGhlbHBfdGV4dC5hcHBlbmQoIGdldEJsYW5rcyggSEVMUF9MSU5FX0xFTiAtIGhlbHBfd2lkdGggKSApOwotICAgICAgICBoZWxwX3RleHQuYXBwZW5kKCBzcGxpdF9oZWxwX3RleHRbaW5kZXhdICsgIlxuIiApOwotICAgICAgfQotICAgICAgCi0gICAgICBoZWxwX3RleHQuYXBwZW5kKCAiXG4iICk7Ci0gICAgfQotCi0gICAgcmV0dXJuICIiICsgaGVscF90ZXh0OwotICB9Ci0gIAotICAvKioKLSAgICogIFJldHVybiBhIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJsYW5rcy4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldEJsYW5rcyggaW50IGNvdW50ICkKLSAgewotICAJY2hhcltdIGJsYW5rcyA9IG5ldyBjaGFyW2NvdW50XTsKLSAgCUFycmF5cy5maWxsKCBibGFua3MsIDAsIGNvdW50LCAnICcgKTsKLSAgCQotICAJcmV0dXJuIG5ldyBTdHJpbmcoIGJsYW5rcyApOwotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNlIGZvciBhbGwgY29tbWFuZCBsaW5lIGV4Y2VwdGlvbiBjbGFzc2VzLgotICAqKi8KLSAgc3RhdGljIHB1YmxpYyBjbGFzcyBFcnJvckV4YyBleHRlbmRzIEV4Y2VwdGlvbgotICB7Ci0gIAkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc1NjczMTcyNTk3OTM3MjBMOwotCi0JcHVibGljIEVycm9yRXhjKCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gYXJncyApCi0gIAl7Ci0gIAkgIHN1cGVyKCBNZXNzYWdlRm9ybWF0LmZvcm1hdCggbWVzc2FnZSwgYXJncyApICk7Ci0gIAl9Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgY2xhc3Mgd2lsbCBiZSB0aHJvd24gd2hlbiBhbiBpbnRlcm5hbCBlcnJvciBpcyBkZXRlY3RlZC4KLSAgICAqIFRoaXMgdXN1YWxseSBoYXBwZW5zIGlmIHRoZSBmbGFnIGRlc2NyaXB0aW9uIGluZm9ybWF0aW9uIHdhcwotICAgICogc3BlY2lmaWVkIGluY29ycmVjdGx5LgotICAqKi8KLSAgc3RhdGljIHB1YmxpYyBjbGFzcyBJbnRlcm5hbEVycm9yRXhjIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gIHsgIAkKLSAgCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODQxMDYyMTEzNjYxNDQ1MEw7Ci0KLQlwdWJsaWMgSW50ZXJuYWxFcnJvckV4YyggU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGFyZ3MgKQotICAJewotICAJICBzdXBlciggTWVzc2FnZUZvcm1hdC5mb3JtYXQoIG1lc3NhZ2UsIGFyZ3MgKSApOwotICAJfQotICAJCi0gIAlwdWJsaWMgSW50ZXJuYWxFcnJvckV4YyggU3RyaW5nIG1lc3NhZ2UgKQotICAJewotICAJICB0aGlzKCBtZXNzYWdlLCAoU3RyaW5nW10pbnVsbCApOwotICAJfQotICAJCi0gIAlwdWJsaWMgSW50ZXJuYWxFcnJvckV4YyggU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBhcmcgKQotICAJewotICAJICB0aGlzKCBtZXNzYWdlLCBuZXcgU3RyaW5nW117IGFyZyB9ICk7Ci0gIAl9Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgY2xhc3Mgd2lsbCBiZSB0aHJvd24gaWYgYSB1c2VyIGVycm9yIG9jY3VycyB3aGlsZSBwYXJzaW5nIHRoZSBjb21tYW5kIGxpbmUuCi0gICoqLwotICBzdGF0aWMgcHVibGljIGNsYXNzIEZsYWdfZXJyb3IgZXh0ZW5kcyBFcnJvckV4YwotICB7Ci0gICAgLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzODMyNjIxNzc2ODc3NjYzNTM3TDsKLQotCXB1YmxpYyBGbGFnX2Vycm9yKCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgc3VwZXIoIG1lc3NhZ2UsIGFyZ3MgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmxhZ19lcnJvciggU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBhcmcgKQotICAgIHsKLSAgICAgIHN1cGVyKCBtZXNzYWdlLCBuZXcgU3RyaW5nW117IGFyZyB9ICk7Ci0gICAgfQotCi0gICAgcHVibGljIEZsYWdfZXJyb3IoIFN0cmluZyBtZXNzYWdlICkKLSAgICB7Ci0gICAgICBzdXBlciggbWVzc2FnZSwgbnVsbCApOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgICogVHJpZXMgdG8gcHJvY2VzcyBhIHNpbmdsZSBmbGFnIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgKiBAcGFyYW0gIGFyZ3MgICAgICBBbGwgdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLgotICAgICogQHBhcmFtICBhcmdfaW5kZXggVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkLgotICAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IHdlIGFyZSBwcm9jZXNzaW5nIGlzIGEgZmxhZyB0aGF0IGhhcyBhCi0gICAgKiAgICAgICAgIHBhcmFtZXRlciBhbmQgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIG5leHQgYXJndW1lbnQuCi0gICoqLwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc19hcmcoIFN0cmluZ1tdIGFyZ3MsIGludCBhcmdfaW5kZXggKSB0aHJvd3MgRmxhZ19lcnJvcgotICB7Ci0gICAgYm9vbGVhbiBwcm9jZXNzZWRfbmV4dF9hcmcgPSBmYWxzZTsKLQotICAgIGlmKCBhcmdzW2FyZ19pbmRleF0uY2hhckF0KDApID09ICctJyApCi0gICAgewotICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBmbGFnLgotICAgICAgaW50IGZsYWdfaW5kZXggPSAxOwotICAgICAgaW50IGluZm9faW5kZXggPSBnZXRfaW5mb19pbmRleCggYXJnc1thcmdfaW5kZXhdLCBmbGFnX2luZGV4ICk7Ci0gICAgICBpbnQgbWF4X2luZGV4ICA9IGdldF9tYXhfaW5kZXgoIGFyZ3NbYXJnX2luZGV4XSwgZmxhZ19pbmRleCwgaW5mb19pbmRleCApOwotCi0gICAgICBpZiggZmxhZ3NfaW5mb1tpbmZvX2luZGV4XVtOQU1FX0NPTF0gIT0gTk9fUEFSTSApCi0gICAgICB7Ci0gICAgICAgIC8vIFRoaXMgZmxhZyB0YWtlcyBhIHBhcmFtZXRlciBzbyBjaGVjayBpZiBpdCBpcyBzdHVjayB0byB0aGlzCi0gICAgICAgIC8vIGFyZy4KLSAgICAgICAgaWYoIG1heF9pbmRleCA8IGFyZ3NbYXJnX2luZGV4XS5sZW5ndGgoKSApCi0gICAgICAgIHsKLSAgICAgICAgICBhZGRfZmxhZ19wYXJtKCBpbmZvX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJnX2luZGV4XS5zdWJzdHJpbmcoIG1heF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2FyZ19pbmRleF0ubGVuZ3RoKCkgKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIFRoaXMgZmxhZyBoYXMgYSBwYXJhbWV0ZXIgYW5kIGl0IHdhc24ndCBzdHVjayB0byB0aGUgZmxhZywKLSAgICAgICAgICAvLyBzbyB3ZSB3aWxsIHRyeSB0byBnZXQgaXQgZnJvbSB0aGUgbmV4dCBhcmcuCi0gICAgICAgICAgaWYoIGFyZ19pbmRleCsxIDwgYXJncy5sZW5ndGggJiYKLSAgICAgICAgICAgICAgYXJnc1thcmdfaW5kZXgrMV0uY2hhckF0KDApICE9ICctJyApCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gV2UgZm91bmQgYW4gcGFyYW1ldGVyIGluIHRoZSBuZXh0IHN0cmluZyBzbyB3ZSB3aWxsIHVzZSB0aGlzCi0gICAgICAgICAgICAvLyBvbmUgYXMgYSBwYXJhbWV0ZXIgZm9yIHRoaXMgZmxhZy4gIE5vdGU6IGlmIHdhcyBubyBwYXJhbWV0ZXIKLSAgICAgICAgICAgIC8vIGFmdGVyIHRoZSBmbGFnIGF0IGFsbCwgdGhlIGVycm9yIHdpbGwgYmUgY2F1Z2h0IGluIHRoZQotICAgICAgICAgICAgLy8gY2hlY2tfcnVsZXMgbWV0aG9kLgotICAgICAgICAgICAgYWRkX2ZsYWdfcGFybSggaW5mb19pbmRleCwgYXJnc1thcmdfaW5kZXgrMV0gKTsKLSAgICAgICAgICAgIHByb2Nlc3NlZF9uZXh0X2FyZyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBFcnJvciBtaXNzaW5nIHBhcmFtYXRlci4gVGhpcyBlcnJvciBpcyBjYXVnaHQgYnkgY2hlY2tfcnVsZXMuCi0gICAgICAgICAgICBhZGRfZmxhZ19wYXJtKCBpbmZvX2luZGV4LCBudWxsICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFRoZSBmbGFnIGRvZXMgbm90IGhhdmUgYSBwYXJhbWV0ZXIgc28gd2Ugd2lsbCBhZGQgYSBudWxsLgotICAgICAgICBhZGRfZmxhZ19wYXJtKCBpbmZvX2luZGV4LCBudWxsICk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGEgcG9zaXRpb25hbCBwYXJhbWV0ZXIgaXMgc3R1Y2sgdG8gdGhpcyBmbGFnLgotICAgICAgICBpZiggbWF4X2luZGV4IDwgYXJnc1thcmdfaW5kZXhdLmxlbmd0aCgpICkKLSAgICAgICAgewotICAgICAgICAgIGFkZF9wb3NpdGlvbmFsKCBhcmdzW2FyZ19pbmRleF0uc3Vic3RyaW5nKCBtYXhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJnX2luZGV4XS5sZW5ndGgoKSApICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFRoaXMgaXMgYSBwb3NpdGlvbmFsIHBhcmFtZXRlci4KLSAgICAgIGFkZF9wb3NpdGlvbmFsKCBhcmdzW2FyZ19pbmRleF0gKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcHJvY2Vzc2VkX25leHRfYXJnOwotICB9Ci0KLSAgLyoqCi0gICAgKiBGaW5kcyB0aGUgcm93IGZvciB0aGUgZmxhZyB0aGF0IHVuaXF1ZWx5IG1hdGNoZWQgdGhpcyBmbGFnIHN0ci4KLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmxhZ3NfaW5mbyBpbmRleCBvZiB0aGUgbWF0Y2hpbmcgZmxhZy4KLSAgKiovCi0gIHByaXZhdGUgaW50IGdldF9pbmZvX2luZGV4KCBTdHJpbmcgZmxhZ19zdHIsIGludCBzdGFydF9pbmRleCApCi0gICAgdGhyb3dzIEZsYWdfZXJyb3IKLSAgewotICAgIC8vaW50IGluZm9fc3RhcnQgID0gMTsKLSAgICAvL2ludCBpbmZvX2VuZCAgICA9IGZsYWdzX2luZm8ubGVuZ3RoOwotICAgIGludCBpbmZvX2luZGV4OwotICAgIGludCBmb3VuZF9jb3VudCA9IDA7Ci0gICAgaW50IGluZm9fY29sX2luZGV4ID0gMDsKLSAgICBpbnQgbGFzdF9pbmZvX2luZGV4ID0gMDsKLQotICAgIEJpdFNldCBmbGFnc19yZWplY3RlZCA9IG5ldyBCaXRTZXQoKTsKLQotICAgIC8vIExvb3Agb3ZlciBlYWNoIGNoYXIgaW4gZmxhZ19zdHIuICBOb3RlOiB3ZSB3aWxsIHByb2JhYmx5IGJhaWwgZWFybHkuCi0gICAgZm9yKCBpbnQgZmxhZ19jb2xfaW5kZXggPSBzdGFydF9pbmRleDsgZmxhZ19jb2xfaW5kZXggPCBmbGFnX3N0ci5sZW5ndGgoKTsgZmxhZ19jb2xfaW5kZXgrKyApCi0gICAgewotICAgICAgLy8gTG9vcCBvdmVyIGVhY2ggZmxhZyBpbiBmbGFnX2luZm8KLSAgICAgIGZvciggaW5mb19pbmRleCA9IDA7IGluZm9faW5kZXggPCBmbGFnc19pbmZvLmxlbmd0aDsgaW5mb19pbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGZsYWdJZCAgID0gZmxhZ3NfaW5mb1tpbmZvX2luZGV4XVtGTEFHX0NPTF07Ci0gICAgICAgIFN0cmluZyBmbGFnTmFtZSA9IGZsYWdJZCA9PSBQT1NJVElPTkFMID8gUE9TSVRJT05BTCA6IGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdJZCApOwotCi0gICAgICAgIGlmKCBmbGFnc19yZWplY3RlZC5nZXQoIGluZm9faW5kZXggKSA9PSBmYWxzZSAmJgotICAgICAgICAgICAgaW5mb19jb2xfaW5kZXggPCBmbGFnTmFtZS5sZW5ndGgoKSAmJgotICAgICAgICAgICAgICBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoZmxhZ19zdHIuY2hhckF0KGZsYWdfY29sX2luZGV4KSkgPT0KLSAgICAgICAgICAgICAgZmxhZ05hbWUuY2hhckF0KGluZm9fY29sX2luZGV4KSApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3VuZF9jb3VudCsrOwotICAgICAgICAgIGxhc3RfaW5mb19pbmRleCA9IGluZm9faW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmxhZ3NfcmVqZWN0ZWQuc2V0KCBpbmZvX2luZGV4ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYoIGZvdW5kX2NvdW50ID09IDEgKQotICAgICAgewotICAgICAgICAvLyBXZSBoYXZlIGEgbWF0Y2guCi0gICAgICAgIHJldHVybiBsYXN0X2luZm9faW5kZXg7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKCBmb3VuZF9jb3VudCA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgLy8gRmxhZyBub3QgZm91bmQgYXQgYWxsLgotICAgICAgICB0aHJvdyBuZXcgRmxhZ19lcnJvciggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX0ZMQUdfTk9UX0ZPVU5EICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX3N0ci5zdWJzdHJpbmcoIHN0YXJ0X2luZGV4ICkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gTW9yZSB0aGFuIG9uZSBmbGFnIHdhcyBmb3VuZCB3aXRoIHRoaXMgY2hhciBzbyB3ZSB3aWxsIGdvIHRvIHRoZQotICAgICAgICAvLyBuZXh0IGNoYXIgdG8gdW5pcXVlbHkgbWF0Y2ggaXQuCi0gICAgICAgIGluZm9fY29sX2luZGV4Kys7Ci0gICAgICAgIC8vaW5mb19zdGFydCA9IGxhc3RfaW5mb19pbmRleCAtIGZvdW5kX2NvdW50ICsgMTsKLSAgICAgICAgLy9pbmZvX2VuZCAgID0gbGFzdF9pbmZvX2luZGV4ICsgMTsKLSAgICAgICAgZm91bmRfY291bnQgPSAwOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZSBvbmx5IHdheSB0byBnZXQgdG8gdGhpcyBjb2RlIGlzIGlmIHRoZSBsb29wIGV4aXRlZCB3aXRoCi0gICAgLy8gdGhlIGZvdW5kX2NvdW50IGdyZWF0ZXIgdGhhbiAxLiAgVGhlcmVmb3JlLCB0aGUgZmxhZyBzcGVjaWZpZWQgaXMKLSAgICAvLyBhbWJpZ3VvdXMuCi0gICAgdGhyb3cgbmV3IEZsYWdfZXJyb3IoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9BTUJJR1VPVVNfRkxBRyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX3N0ci5zdWJzdHJpbmcoIHN0YXJ0X2luZGV4KSApOwotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCB0cmllcyB0byBtYXRjaCBhcyBtYW55IGNoYXJhY3RlcnMgYXMgcG9zc2libGUgb2YgdGhlIHVzZXIKLSAgICAqIHNwZWNpZmllZCBmbGFnIHdpdGggdGhlIG1hdGNoZWQgZmxhZyBzdHJpbmcuCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IG1hdGNoaW5nIGZsYWcgY2hhcmFyYWN0ZXIuCi0gICoqLwotICBwcml2YXRlIGludCBnZXRfbWF4X2luZGV4KCBTdHJpbmcgZmxhZ19zdHIsIGludCBmbGFnX3N0YXJ0LCBpbnQgaW5mb19pbmRleCApCi0gIHsKLSAgICBpbnQgZmxhZ19jb2xfaW5kZXggPSBmbGFnX3N0YXJ0OwotICAgIGludCBpbmZvX2NvbF9pbmRleCA9IDA7Ci0KLSAgICBTdHJpbmcgaW5mb19zdHIgPSBmbGFnTWVzc2FnZXMuZ2V0U3RyaW5nKCBmbGFnc19pbmZvW2luZm9faW5kZXhdW0ZMQUdfQ09MXSApOwotCi0gICAgd2hpbGUoIGZsYWdfY29sX2luZGV4IDwgZmxhZ19zdHIubGVuZ3RoKCkgJiYKLSAgICAgICAgICAgaW5mb19jb2xfaW5kZXggPCBpbmZvX3N0ci5sZW5ndGgoKSApCi0gICAgewotICAgICAgaWYoIENoYXJhY3Rlci50b0xvd2VyQ2FzZSggZmxhZ19zdHIuY2hhckF0KGZsYWdfY29sX2luZGV4KSApICE9Ci0gICAgICAgICAgaW5mb19zdHIuY2hhckF0KGluZm9fY29sX2luZGV4KSApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBmbGFnX2NvbF9pbmRleCsrOwotICAgICAgaW5mb19jb2xfaW5kZXgrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmxhZ19jb2xfaW5kZXg7Ci0gIH0KLQotICAvKioKLSAgICAqIEFkZHMgYSBwb3NpdGlvbmFsIHBhcmFtZXRlciB0byBmbGFnc19zcGVjaWZpZWQuCi0gICoqLwotICBwcml2YXRlIHZvaWQgYWRkX3Bvc2l0aW9uYWwoIFN0cmluZyBwb3NpdGlvbmFsX3Bhcm0gKQotICB7Ci0gICAgaWYoIGZsYWdzX3NwZWNpZmllZFtQT1NJVElPTkFMX1JPV10gPT0gbnVsbCApCi0gICAgICBmbGFnc19zcGVjaWZpZWRbUE9TSVRJT05BTF9ST1ddID0gbmV3IFZlY3RvcigzKTsKLQotICAgIGZsYWdzX3NwZWNpZmllZFtQT1NJVElPTkFMX1JPV10uYWRkKCBwb3NpdGlvbmFsX3Bhcm0gKTsKLSAgfQotCi0gIC8qKgotICAgICogQWRkcyBhIGZsYWcgYW5kIGl0cyBwYXJhbWV0ZXIgdG8gZmxhZ3Nfc3BlY2lmaWVkLiAgSWYgb25seSB0aGUKLSAgICAqIGZsYWcgd2FzIHNwZWNpZmllZCwgdGhlbiBhIG51bGwgc2hvdWxkIGJlIHBhc3NlZCB0byBmbGFnX3Bhcm0uCi0gICoqLwotICBwcml2YXRlIHZvaWQgYWRkX2ZsYWdfcGFybSggaW50IGZsYWdfaW5kZXgsIFN0cmluZyBmbGFnX3Bhcm0gKQotICAgIHRocm93cyBGbGFnX2Vycm9yCi0gIHsKLSAgICBpZiggZmxhZ3NfaW5mb1tmbGFnX2luZGV4XVtEVVBfQ09MXSA9PSBOT19EVVBTICYmCi0gICAgICAgIGZsYWdzX3NwZWNpZmllZFtmbGFnX2luZGV4XSAhPSBudWxsICkKLSAgICAgIHRocm93IG5ldyBGbGFnX2Vycm9yKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfRFVQTElDQVRFX0ZMQUdTX05PVF9BTExPV0VEICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdzX2luZm9bZmxhZ19pbmRleF1bRkxBR19DT0xdICkgKTsKLQotICAgIGlmKCBmbGFnc19zcGVjaWZpZWRbZmxhZ19pbmRleF0gPT0gbnVsbCApCi0gICAgICBmbGFnc19zcGVjaWZpZWRbZmxhZ19pbmRleF0gPSBuZXcgVmVjdG9yKDMpOwotCi0gICAgZmxhZ3Nfc3BlY2lmaWVkW2ZsYWdfaW5kZXhdLmFkZCggZmxhZ19wYXJtICk7Ci0gIH0KLQotICAvKioKLSAgICAqIENoZWNrcyB0aGF0IHRoZSB1c2VyIGhhc24ndCBicm9rZW4gYW55IGNvbW1hbmQgbGluZSBydWxlcy4KLSAgKiovCi0gIHByaXZhdGUgdm9pZCBjaGVja19ydWxlcygpIHRocm93cyBGbGFnX2Vycm9yCi0gIHsKLSAgICAvLyBDaGVjayB0aGF0IGFsbCBvZiB0aGUgcmVxdWlyZWQgcG9zaXRpb25hbHMgd2VyZSBzcGVjaWZpZWQuCi0gICAgaW50IHBvc2l0aW9uYWxfY291bnQgPSAwOwotCi0gICAgaWYoIGZsYWdzX3NwZWNpZmllZFtQT1NJVElPTkFMX1JPV10gIT0gbnVsbCApCi0gICAgewotICAgICAgcG9zaXRpb25hbF9jb3VudCA9IGZsYWdzX3NwZWNpZmllZFtQT1NJVElPTkFMX1JPV10uc2l6ZSgpOwotICAgIH0KLQotICAgIGlmKCByZXF1aXJlZF9wb3NpdGlvbmFscyA+IHBvc2l0aW9uYWxfY291bnQgKQotICAgICAgdGhyb3cgbmV3IEZsYWdfZXJyb3IoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9NSVNTSU5HX1BPU0lUSU9OQUwgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tyZXF1aXJlZF9wb3NpdGlvbmFscy0xXVtOQU1FX0NPTF0gKSApOwotCi0gICAgZWxzZSBpZiggcmVxdWlyZWRfcG9zaXRpb25hbHMgPCBwb3NpdGlvbmFsX2NvdW50ICYmCi0gICAgICAgICAgICAgb3B0aW9uYWxfcG9zaXRpb25hbHNfYWxsb3dlZCA9PSBmYWxzZSApCi0gICAgICB0aHJvdyBuZXcgRmxhZ19lcnJvciggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX1RPT19NQU5ZX1BPU0lUSU9OQUxTICkgKTsKLQotICAgIGZvciggaW50IHJvdyA9IDA7IHJvdyA8IGZsYWdzX2luZm8ubGVuZ3RoOyByb3crKyApCi0gICAgewotICAgICAgaWYoIGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF0gPT0gUE9TSVRJT05BTCApIGNvbnRpbnVlOwotCi0gICAgICBpZiggZmxhZ3Nfc3BlY2lmaWVkW3Jvd10gPT0gbnVsbCAmJgotICAgICAgICAgIGZsYWdzX2luZm9bcm93XVtSRVFVSVJFRF9DT0xdID09IFJFUVVJUkVEICkKLSAgICAgICAgdGhyb3cgbmV3IEZsYWdfZXJyb3IoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9NSVNTSU5HX1JFUVVJUkVEX0ZMQUcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTWVzc2FnZXMuZ2V0U3RyaW5nKCBmbGFnc19pbmZvW3Jvd11bRkxBR19DT0xdICkgKTsKLQotICAgICAgaW50IHBhcm1fY291bnQgPSAwOwotCi0gICAgICBpZiggZmxhZ3Nfc3BlY2lmaWVkW3Jvd10gIT0gbnVsbCApIHBhcm1fY291bnQgPSBmbGFnc19zcGVjaWZpZWRbcm93XS5zaXplKCk7Ci0KLSAgICAgIC8vIENoZWNrIGZvciB0b28gbWFueSBmbGFnIHBhcmFtZXRlcnMuCi0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0RVUF9DT0xdID09IE5PX0RVUFMgJiYgcGFybV9jb3VudCA+IDEgKQotICAgICAgICB0aHJvdyBuZXcgRmxhZ19lcnJvciggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX0RVUExJQ0FURV9GTEFHU19OT1RfQUxMT1dFRCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF0gKSApOwotCi0gICAgICAvLyBDaGVjayBmb3IgbWlzc2luZyBmbGFnIHBhcmFtZXRlci4KLSAgICAgIGlmKCBwYXJtX2NvdW50ID4gMCAmJiBmbGFnc19pbmZvW3Jvd11bTkFNRV9DT0xdICE9IE5PX1BBUk0gKQotICAgICAgewotICAgICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgZmxhZ3Nfc3BlY2lmaWVkW3Jvd10uc2l6ZSgpOyBpbmRleCsrICkKLSAgICAgICAgewotICAgICAgICAgIGlmKCBmbGFnc19zcGVjaWZpZWRbcm93XS5lbGVtZW50QXQoaW5kZXgpID09IG51bGwgKQotICAgICAgICAgICAgdGhyb3cgbmV3IEZsYWdfZXJyb3IoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9NSVNTSU5HX0ZMQUdfUEFSQU1FVEVSICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF0gKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tyb3ddW05BTUVfQ09MXSApIH0gKTsKLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGF0IGEgcHJvcGVyIGZsYWdzX2luZm8gc3RyaW5nIGFycmF5IHdhcyBwYXNzZWQKLSAgICAqIHRvIHVzIGJ5IHRoZSBwcm9ncmFtbWVyLgotICAqKi8KLSAgcHJpdmF0ZSB2b2lkIHZlcmlmeV9mbGFnc19pbmZvKCkgdGhyb3dzIEludGVybmFsRXJyb3JFeGMKLSAgewotICAgIGJvb2xlYW4gZG9uZV9wb3NpdGlvbmFscyA9IGZhbHNlOwotICAgIGJvb2xlYW4gaGVscF9zcGVjaWZpZWQgICA9IGZhbHNlOwotCi0gICAgcmVxdWlyZWRfcG9zaXRpb25hbHMgPSAwOwotICAgIG9wdGlvbmFsX3Bvc2l0aW9uYWxzX2FsbG93ZWQgPSBmYWxzZTsKLSAgICBvcHRpb25hbF9saXN0X2luZGV4ID0gLTE7Ci0gICAgbWF4X2ZsYWdfc2l6ZSA9IDA7Ci0gICAgbWF4X25hbWVfc2l6ZSA9IDA7Ci0KLSAgICBpZiggZmxhZ3NfaW5mbyA9PSBudWxsIHx8IGZsYWdzX2luZm8ubGVuZ3RoID09IDAgKQotICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3JFeGMoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9OT19GTEFHU19EQVRBX1NQRUNJRklFRCAgKSApOwotCi0gICAgaWYoIGZsYWdzX2luZm9bUE9TSVRJT05BTF9ST1ddICE9IG51bGwgJiYKLSAgICAgICAgZmxhZ3NfaW5mb1tQT1NJVElPTkFMX1JPV10ubGVuZ3RoID4gMCAmJgotICAgICAgICBmbGFnc19pbmZvW1BPU0lUSU9OQUxfUk9XXVtGTEFHX0NPTF0gIT0gUE9TSVRJT05BTCApCi0gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX0ZJUlNUX0ZMQUdfTk9UX1BPU0lUSU9OQUwgKSApOwotCi0gICAgZm9yKCBpbnQgcm93ID0gMDsgcm93IDwgZmxhZ3NfaW5mby5sZW5ndGg7IHJvdysrICkKLSAgICB7Ci0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddID09IG51bGwgKQotICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX05VTExfRkxBR19ST1cgKSApOwotCi0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddLmxlbmd0aCAhPSA1ICkKLSAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3JFeGMoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9JTkNPUlJFQ1RfUk9XX1NJWkUgKSApOwotCi0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSA9PSBudWxsIHx8Ci0gICAgICAgICAgZmxhZ3NfaW5mb1tyb3ddW05BTUVfQ09MXSA9PSBudWxsIHx8Ci0gICAgICAgICAgZmxhZ3NfaW5mb1tyb3ddW0hFTFBfQ09MXSA9PSBudWxsICkKLSAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3JFeGMoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9OVUxMX0lOX1JPVyApICk7Ci0KLSAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd11bRkxBR19DT0xdLmVxdWFscyggaGVscF9mbGFnICkgKSBoZWxwX3NwZWNpZmllZCA9IHRydWU7Ci0KLSAgICAgIFN0cmluZyBmbGFnSWQgICA9IGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF07Ci0gICAgICBTdHJpbmcgbmFtZUlkICAgPSBmbGFnc19pbmZvW3Jvd11bTkFNRV9DT0xdOwotCi0gICAgICBTdHJpbmcgZmxhZ19jb2wgPSBmbGFnSWQgPT0gUE9TSVRJT05BTCA/IFBPU0lUSU9OQUwgOiBmbGFnTWVzc2FnZXMuZ2V0U3RyaW5nKCBmbGFnSWQgKTsKLSAgICAgIFN0cmluZyBuYW1lX2NvbCA9IG5hbWVJZCA9PSBOT19QQVJNID8gTk9fUEFSTSA6IGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIG5hbWVJZCApOwotCi0gICAgICBpZiggZmxhZ19jb2wubGVuZ3RoKCkgPiBtYXhfZmxhZ19zaXplICkKLSAgICAgICAgbWF4X2ZsYWdfc2l6ZSA9IGZsYWdfY29sLmxlbmd0aCgpOwotCi0gICAgICBpZiggbmFtZV9jb2wgIT0gTk9fUEFSTSAmJiBuYW1lX2NvbC5sZW5ndGgoKSA+IG1heF9uYW1lX3NpemUgKQotICAgICAgICBtYXhfbmFtZV9zaXplID0gbmFtZV9jb2wubGVuZ3RoKCk7Ci0KLSAgICAgIC8vIEVuc3VyZSB0aGF0IGZsYWdzIGFyZSBhbGwgaW4gbG93ZXJjYXNlLgotICAgICAgaWYoICFmbGFnX2NvbC5lcXVhbHMoIGZsYWdfY29sLnRvTG93ZXJDYXNlKCkgKSApCi0gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yRXhjKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfRkxBR19OT1RfTE9XRVJDQVNFICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX2NvbCApOwotCi0gICAgICAvLyBFbnN1cmUgdGhhdCBvbmx5IHRoZSBwcmVkZWZpbmVkIGR1cCBzdHJpbmdzIGFyZSB1c2VkLgotICAgICAgLy8gTm90ZTogaXQncyBvayB0byB1c2UgIT0gd2hlbiBjb21wYXJpbmcgY29uc3RhbnQgc3RyaW5ncyBsaXRlcmFscy4KLSAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd11bRFVQX0NPTF0gPT0gbnVsbCB8fAotICAgICAgICAgICggZmxhZ3NfaW5mb1tyb3ddW0RVUF9DT0xdICE9IE5PX0RVUFMgJiYKLSAgICAgICAgICAgIGZsYWdzX2luZm9bcm93XVtEVVBfQ09MXSAhPSBEVVBTX09LICkgKQotICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9EVVBfU1RSSU5HICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc19pbmZvW3Jvd11bRFVQX0NPTF0gKTsKLQotICAgICAgLy8gRW5zdXJlIHRoYXQgb25seSB0aGUgcHJlZGVmaW5lZCByZXF1aXJlZCBzdHJpbmdzIGFyZSB1c2VkLgotICAgICAgaWYoIGZsYWdzX2luZm9bcm93XVtSRVFVSVJFRF9DT0xdID09IG51bGwgfHwKLSAgICAgICAgICAoIGZsYWdzX2luZm9bcm93XVtSRVFVSVJFRF9DT0xdICE9IFJFUVVJUkVEICYmCi0gICAgICAgICAgICBmbGFnc19pbmZvW3Jvd11bUkVRVUlSRURfQ09MXSAhPSBPUFRJT05BTCApICkKLSAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3JFeGMoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9JTkNPUlJFQ1RfUkVRVUlSRURfU1RSSU5HICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc19pbmZvW3Jvd11bUkVRVUlSRURfQ09MXSApOwotCi0gICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIHBvc2l0aW9uYWxzLgotICAgICAgaWYoIGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF0gPT0gUE9TSVRJT05BTCApCi0gICAgICB7Ci0gICAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd11bUkVRVUlSRURfQ09MXSA9PSBSRVFVSVJFRCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW05BTUVfQ09MXSA9PSBOT19QQVJNICkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yRXhjKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfUkVRVUlSRURfUE9TSVRJT05BTF9ORUVEU19OQU1FICkgKTsKLQotICAgICAgICAgIHJlcXVpcmVkX3Bvc2l0aW9uYWxzKys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZmxhZ3NfaW5mb1tyb3ddW05BTUVfQ09MXSAhPSBOT19QQVJNICkKLSAgICAgICAgewotICAgICAgICAgIC8vIFdlIHVzZSB0aGUgTkFNRV9DT0wgZmllbGQgZm9yIGFuIG9wdGlvbmFsIHBvc2l0aW9uYWwgdG8gZGVub3RlCi0gICAgICAgICAgLy8gd2hldGhlciBhZGRpdGlvbmFsIHBvc2l0aW9uYWxzIGFyZSBhbGxvd2VkIG9yIG5vdC4KLSAgICAgICAgICBvcHRpb25hbF9wb3NpdGlvbmFsc19hbGxvd2VkID0gdHJ1ZTsKLSAgICAgICAgICBvcHRpb25hbF9saXN0X2luZGV4ID0gcm93OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIEVuc3VyZSB0aGF0IHBvc2l0aW9uYWxzIGFyZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmZvLgotICAgICAgaWYoIGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF0gIT0gUE9TSVRJT05BTCB8fAotICAgICAgICAgICggZG9uZV9wb3NpdGlvbmFscyA9PSBmYWxzZSAmJgotICAgICAgICAgICAgZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSA9PSBQT1NJVElPTkFMICYmCi0gICAgICAgICAgICBmbGFnc19pbmZvW3Jvd11bUkVRVUlSRURfQ09MXSA9PSBPUFRJT05BTCApICkKLSAgICAgIHsKLSAgICAgICAgZG9uZV9wb3NpdGlvbmFscyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKCBkb25lX3Bvc2l0aW9uYWxzID09IHRydWUgKQotICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX1BPU0lUSU9OQUxfTk9UX0FUX0JFR0lOTklORyApICk7Ci0gICAgfQotCi0gICAgLy8gRW5zdXJlIHRoYXQgYSBoZWxwIGZsYWcgd2FzIHNwZWNpZmllZCBpbiB0aGUgaW5mbyBsaXN0LgotICAgIGlmKCBoZWxwX3NwZWNpZmllZCA9PSBmYWxzZSApCi0gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX0hFTFBfRkxBR19OT1RfU1BFQ0lGSUVEICkgKTsKLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBkdW1wIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IGEgcGFyc2VkCi0gICAgKiBjb21tYW5kIGxpbmUuCi0gICoqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCi0gICAgZm9yKCBpbnQgcm93ID0gMDsgcm93IDwgZmxhZ3NfaW5mby5sZW5ndGg7IHJvdysrICkKLSAgICB7Ci0gICAgICBiLmFwcGVuZCggIlxuIiApOwotCi0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSA9PSBQT1NJVElPTkFMICkKLSAgICAgICAgYi5hcHBlbmQoICJQb3NpdGlvbmFsOiIgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYi5hcHBlbmQoIGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF0gKSArICI6IiApOwotCi0KLSAgICAgIGlmKCBmbGFnc19zcGVjaWZpZWRbcm93XSA9PSBudWxsICkKLSAgICAgICAgYi5hcHBlbmQoICJubyBwYXJhbWV0ZXJzIiApOwotICAgICAgZWxzZQotICAgICAgICBmb3IoIGludCBwYXJtX2luZGV4ID0gMDsgcGFybV9pbmRleCA8IGZsYWdzX3NwZWNpZmllZFtyb3ddLnNpemUoKTsgcGFybV9pbmRleCsrICkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBwYXJtID0gKFN0cmluZylmbGFnc19zcGVjaWZpZWRbcm93XS5lbGVtZW50QXQocGFybV9pbmRleCk7Ci0gICAgICAgICAgYi5hcHBlbmQoIHBhcm0gKyAiOiIgKTsKLSAgICAgICAgfQotICAgICAgYi5hcHBlbmQoICJcbiIgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gIiIrYjsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0NPTCAgICAgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0wgICAgID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERVUF9DT0wgICAgICA9IDI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFRF9DT0wgPSAzOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEVMUF9DT0wgICAgID0gNDsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJT05BTF9ST1cgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEVMUF9MSU5FX0xFTiAgPSA3NTsKLQotICBwcml2YXRlIFN0cmluZ1tdW10gZmxhZ3NfaW5mbzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgIGhlbHBfZmxhZzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgIHRvb2xfbmFtZTsKLSAgcHJpdmF0ZSBWZWN0b3JbXSAgIGZsYWdzX3NwZWNpZmllZDsKLSAgcHJpdmF0ZSBpbnQgICAgICAgIHJlcXVpcmVkX3Bvc2l0aW9uYWxzOwotICBwcml2YXRlIGJvb2xlYW4gICAgb3B0aW9uYWxfcG9zaXRpb25hbHNfYWxsb3dlZDsKLSAgcHJpdmF0ZSBpbnQgICAgICAgIG9wdGlvbmFsX2xpc3RfaW5kZXg7Ci0gIHByaXZhdGUgaW50ICAgICAgICBtYXhfZmxhZ19zaXplOwotICBwcml2YXRlIGludCAgICAgICAgbWF4X25hbWVfc2l6ZTsKLQotICBwcm90ZWN0ZWQgUmVzb3VyY2VCdW5kbGUgbWVzc2FnZXM7Ci0gIHByaXZhdGUgICBSZXNvdXJjZUJ1bmRsZSBmbGFnTWVzc2FnZXM7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1hbmRsaW5lL0ZsYWdNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tYW5kbGluZS9GbGFnTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhMTI4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1hbmRsaW5lL0ZsYWdNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbWFuZGxpbmU7Ci0KLS8qKgotICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzdG9yZSBjb25zdGFudCBzdHJpbmcgZXJyb3IgbWVzc2FnZXMKLSAgKiBnZW5lcmF0ZWQgYnkgQ29tbWFuZExpbmUuamF2YQotICAqCi0gICoKLSAgKiBAYXV0aG9yIFBldGVyIE1vb2drCi0gICogQGRhdGUgICBKdWx5IDEzLCAyMDAwCi0gICogQHNlZSAgICBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbWFuZGxpbmUuQ29tbWFuZExpbmUKLSoqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRmxhZ01lc3NhZ2VzCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX0ZMQUdfTk9UX0ZPVU5EID0gIlBBUlNFUl9FUlJPUl9GTEFHX05PVF9GT1VORCI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX0FNQklHVU9VU19GTEFHID0gIlBBUlNFUl9FUlJPUl9BTUJJR1VPVVNfRkxBRyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX01JU1NJTkdfUE9TSVRJT05BTCA9ICJQQVJTRVJfRVJST1JfTUlTU0lOR19QT1NJVElPTkFMIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfVE9PX01BTllfUE9TSVRJT05BTFMgPSAiUEFSU0VSX0VSUk9SX1RPT19NQU5ZX1BPU0lUSU9OQUxTIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfTUlTU0lOR19SRVFVSVJFRF9GTEFHID0gIlBBUlNFUl9FUlJPUl9NSVNTSU5HX1JFUVVJUkVEX0ZMQUciOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9EVVBMSUNBVEVfRkxBR1NfTk9UX0FMTE9XRUQgPSAiUEFSU0VSX0VSUk9SX0RVUExJQ0FURV9GTEFHU19OT1RfQUxMT1dFRCI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX01JU1NJTkdfRkxBR19QQVJBTUVURVIgPSAiUEFSU0VSX0VSUk9SX01JU1NJTkdfRkxBR19QQVJBTUVURVIiOwotCi0gIC8vIEVycm9yIGludGVybmFsIGVycm9yIG1lc3NhZ2VzLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfTUVTU0FHRV9NSVNTSU5HX0FSRyA9ICJQQVJTRVJfRVJST1JfTUVTU0FHRV9NSVNTSU5HX0FSRyI7Ci0KLSAgLy8gSW50ZXJuYWwgY29tbWFuZCBsaW5lIGVycm9yIG1lc3NhZ2VzLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfTk9fRkxBR1NfREFUQV9TUEVDSUZJRUQgPSAiUEFSU0VSX0VSUk9SX05PX0ZMQUdTX0RBVEFfU1BFQ0lGSUVEIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfRklSU1RfRkxBR19OT1RfUE9TSVRJT05BTCA9ICJQQVJTRVJfRVJST1JfRklSU1RfRkxBR19OT1RfUE9TSVRJT05BTCI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX05VTExfRkxBR19ST1cgPSAiUEFSU0VSX0VSUk9SX05VTExfRkxBR19ST1ciOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9JTkNPUlJFQ1RfUk9XX1NJWkUgPSAiUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9ST1dfU0laRSI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX05VTExfSU5fUk9XID0gIlBBUlNFUl9FUlJPUl9OVUxMX0lOX1JPVyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9EVVBfU1RSSU5HID0gIlBBUlNFUl9FUlJPUl9JTkNPUlJFQ1RfRFVQX1NUUklORyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9SRVFVSVJFRF9TVFJJTkcgPSAiUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9SRVFVSVJFRF9TVFJJTkciOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9QT1NJVElPTkFMX05PVF9BVF9CRUdJTk5JTkcgPSAiUEFSU0VSX0VSUk9SX1BPU0lUSU9OQUxfTk9UX0FUX0JFR0lOTklORyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX0hFTFBfRkxBR19OT1RfU1BFQ0lGSUVEID0gIlBBUlNFUl9FUlJPUl9IRUxQX0ZMQUdfTk9UX1NQRUNJRklFRCI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX0ZMQUdTX05PVF9PUkRFUkVEID0gIlBBUlNFUl9FUlJPUl9GTEFHU19OT1RfT1JERVJFRCI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX0ZMQUdfTk9UX0xPV0VSQ0FTRSA9ICJQQVJTRVJfRVJST1JfRkxBR19OT1RfTE9XRVJDQVNFIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfUkVRVUlSRURfUE9TSVRJT05BTF9ORUVEU19OQU1FID0gIlBBUlNFUl9FUlJPUl9SRVFVSVJFRF9QT1NJVElPTkFMX05FRURTX05BTUUiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9JTkZPX1NZTlRBWCA9ICJQQVJTRVJfU1lOVEFYIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRkxBR1MgPSAiUEFSU0VSX0ZMQUdTIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9JTkZPX1dIRVJFID0gIlBBUlNFUl9XSEVSRSI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1hbmRsaW5lL2NvbW1hbmRsaW5lLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1hbmRsaW5lL2NvbW1hbmRsaW5lLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTI5ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tYW5kbGluZS9jb21tYW5kbGluZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUEFSU0VSX0VSUk9SX0ZMQUdfTk9UX0ZPVU5EPUlXQUIwMTIzRSBGbGFnIC17MH0gaXMgbm90IHZhbGlkLgotUEFSU0VSX0VSUk9SX0FNQklHVU9VU19GTEFHPUlXQUIwMjg0RSBGbGFnIC17MH0gaXMgYW1iaWd1b3VzLgotUEFSU0VSX0VSUk9SX01JU1NJTkdfUE9TSVRJT05BTD1JV0FCMDI4NUUgTWlzc2luZyB7MH0gcGFyYW1ldGVyLgotUEFSU0VSX0VSUk9SX1RPT19NQU5ZX1BPU0lUSU9OQUxTPUlXQUIwMjg2RSBUb28gbWFueSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgc3BlY2lmaWVkLgotUEFSU0VSX0VSUk9SX01JU1NJTkdfUkVRVUlSRURfRkxBRz1JV0FCMDI4OEUgRmxhZyAtezB9IGlzIG1pc3NpbmcuCi1QQVJTRVJfRVJST1JfRFVQTElDQVRFX0ZMQUdTX05PVF9BTExPV0VEPUlXQUIwMjkzRSBGbGFnIC17MH0gaGFzIGJlZW4gc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlLgotUEFSU0VSX0VSUk9SX01JU1NJTkdfRkxBR19QQVJBTUVURVI9SVdBQjAyOTRFIEZsYWcgLXswfSBpcyBtaXNzaW5nIHBhcmFtZXRlciB7MX0uCi1QQVJTRVJfRVJST1JfTUVTU0FHRV9NSVNTSU5HX0FSRz1JV0FCMDMxOUUgRXJyb3IgbWVzc2FnZSB7MH0gaXMgbWlzc2luZyBhbiBhcmd1bWVudC4KLVBBUlNFUl9FUlJPUl9OT19GTEFHU19EQVRBX1NQRUNJRklFRD1JV0FCMDM0NUUgU3BlY2lmeSBmbGFnIGluZm9ybWF0aW9uLgotUEFSU0VSX0VSUk9SX0ZJUlNUX0ZMQUdfTk9UX1BPU0lUSU9OQUw9SVdBQjAzNDZFIFRoZSBmaXJzdCBmbGFnIG11c3QgYmUgcG9zaXRpb25hbC4KLVBBUlNFUl9FUlJPUl9OVUxMX0ZMQUdfUk9XPUlXQUIwMzQ3RSBOdWxsIGZsYWcgcm93LgotUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9ST1dfU0laRT1JV0FCMDM0OEUgRmxhZyByb3cgbXVzdCBoYXZlIDUgc3RyaW5ncy4KLVBBUlNFUl9FUlJPUl9OVUxMX0lOX1JPVz1JV0FCMDM0OUUgRmxhZyBpbmZvcm1hdGlvbiBjb250YWlucyBhIG51bGwgc3RyaW5nLgotUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9EVVBfU1RSSU5HPUlXQUIwMzUwRSBEdXBsaWNhdGUgc3RyaW5nIHswfSBpcyBub3QgdmFsaWQuCi1QQVJTRVJfRVJST1JfSU5DT1JSRUNUX1JFUVVJUkVEX1NUUklORz1JV0FCMDM1MUUgUmVxdWlyZWQgc3RyaW5nIHswfSBpcyBub3QgdmFsaWQuCi1QQVJTRVJfRVJST1JfUE9TSVRJT05BTF9OT1RfQVRfQkVHSU5OSU5HPUlXQUIwMzUyRSBQb3NpdGlvbmFsIGZsYWcgaXMgbm90IGF0IHRoZSBiZWdpbm5pbmcuCi1QQVJTRVJfRVJST1JfSEVMUF9GTEFHX05PVF9TUEVDSUZJRUQ9SVdBQjAzNTNFIEhlbHAgZmxhZyBpcyBub3Qgc3BlY2lmaWVkIGluIGluZm9ybWF0aW9uIGFycmF5LgotUEFSU0VSX0VSUk9SX0ZMQUdTX05PVF9PUkRFUkVEPUlXQUIwMzU0RSBGbGFncyBhcmUgbm90IGluIGxleGljYWwgb3JkZXIuCi1QQVJTRVJfRVJST1JfRkxBR19OT1RfTE9XRVJDQVNFPUlXQUIwMzU1RSBGbGFnIHswfSBpcyBub3QgbG93ZXJjYXNlLgotUEFSU0VSX0VSUk9SX1JFUVVJUkVEX1BPU0lUSU9OQUxfTkVFRFNfTkFNRT1JV0FCMDM1NkUgUmVxdWlyZWQgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBhIG5hbWUgc3BlY2lmaWVkLgotUEFSU0VSX1NZTlRBWD1TeW50YXgKLVBBUlNFUl9GTEFHUz1GbGFncwotUEFSU0VSX1dIRVJFPVdoZXJlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbnRleHQvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb250ZXh0L0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkYTRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbnRleHQvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5wcmVmZXJlbmNlcy5BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeQotewotICBwcml2YXRlIFZlY3RvciBwcmVmZXJlbmNlc187Ci0gIAotICBwcml2YXRlIHN0YXRpYyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5XzsKLQotICBwcml2YXRlIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkoKQotICB7Ci0gICAgcHJlZmVyZW5jZXNfID0gbmV3IFZlY3RvcigpOwotICAgIAotICAgIGxvYWREaWFsb2dzUHJlZmVyZW5jZXMoKTsgIAotICB9Ci0gIAotICBzdGF0aWMgcHVibGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYoIHJlZ2lzdHJ5XyA9PSBudWxsICkKLSAgICB7Ci0gICAgICByZWdpc3RyeV8gPSBuZXcgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVnaXN0cnlfOwotICB9Ci0gIAotICAvLwotICBwcml2YXRlIHZvaWQgbG9hZERpYWxvZ3NQcmVmZXJlbmNlcyAoKQotICB7Ci0gIAlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUiKTsKLSAgICAKLSAgICBmb3IoaW50IGlkeD0wOyBpZHg8Y29uZmlnLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCAgICAgIGVsZW0gICA9IGNvbmZpZ1tpZHhdOyAgICAgCi0gICAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBkaWFsb2cgPSBuZXcgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUoKTsKLSAgICAgIAotICAgICAgZGlhbG9nLnNldElkKCBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSApOwotICAgICAgZGlhbG9nLnNldE5hbWUoIGVsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIikgKTsKLSAgICAgIGRpYWxvZy5zZXRJbmZvcG9wKCBlbGVtLmdldEF0dHJpYnV0ZSgiaW5mb3BvcCIpICk7Ci0gICAgICBkaWFsb2cuc2V0VG9vbHRpcCggZWxlbS5nZXRBdHRyaWJ1dGUoInRvb2x0aXAiKSApOwotICAgICAgZGlhbG9nLnNldENhdGVnb3J5KCBlbGVtLmdldEF0dHJpYnV0ZSgiY2F0ZWdvcnkiKSApOwotICAgICAgCi0gICAgICBTdHJpbmcgc2hvd0NoZWNrYm94ID0gZWxlbS5nZXRBdHRyaWJ1dGUoICJzaG93Y2hlY2tib3giICk7Ci0gICAgICBTdHJpbmcgYWx3YXlzSGlkZSAgID0gZWxlbS5nZXRBdHRyaWJ1dGUoICJhbHdheXNoaWRlIiApOwotICAgICAgCi0gICAgICBkaWFsb2cuc2V0U2hvd0NoZWNrYm94KCBzaG93Q2hlY2tib3ggPT0gbnVsbCA/IHRydWUgOiBzaG93Q2hlY2tib3guZXF1YWxzKCAidHJ1ZSIgKSApOwotICAgICAgZGlhbG9nLnNldEFsd2F5c0hpZGUoIGFsd2F5c0hpZGUgPT0gbnVsbCA/IGZhbHNlIDogYWx3YXlzSGlkZS5lcXVhbHMoICJ0cnVlIiApICk7Ci0gICAgICAKLSAgICAgIHByZWZlcmVuY2VzXy5hZGQoZGlhbG9nKTsgICAgICAgIAotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYWxsIHJlZ2lzdGVyZWQgPGNvZGU+V2ViU2VydmljZVR5cGU8L2NvZGU+IG9iamVjdHMuCi0gICogQHJldHVybiBBbGwgcmVnaXN0ZXJlZCA8Y29kZT5XZWJTZXJ2aWNlVHlwZTwvY29kZT4gb2JqZWN0cy4KLSAgKi8KLSAgcHVibGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlW10gZ2V0QWN0aW9uRGlhbG9nc1ByZWZyZW5jZXMgKCkKLSAgewotICAgIHJldHVybiAoQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbXSlwcmVmZXJlbmNlc18udG9BcnJheSggbmV3IEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlWzBdKTsKLSAgfQotICAKLSAgcHVibGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGdldEFjdGlvbkRpYWxvZ3NQcmVmcmVuY2UoIFN0cmluZyBpZCApCi0gIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBwcmVmZXJlbmNlc18uc2l6ZSgpOwotICAgIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIHJlc3VsdCA9IG51bGw7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgcHJlZmVyZW5jZSA9IChBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSlwcmVmZXJlbmNlc18uZWxlbWVudEF0KCBpbmRleCApOwotICAgICAgCi0gICAgICBpZiggcHJlZmVyZW5jZS5nZXRJZCgpLmVxdWFscyggaWQgKSApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHByZWZlcmVuY2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbnRleHQvUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbnRleHQvUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMjJhNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb250ZXh0L1BlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5wbHVnaW4uRW52UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5wcmVmZXJlbmNlcy5BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQKLXsKLSAgcHJpdmF0ZSBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotICAKLSAgcHJpdmF0ZSBzdGF0aWMgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGluc3RhbmNlXyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQoKQotICB7Ci0gICAgc3VwZXIoRW52UGx1Z2luLmdldEluc3RhbmNlKCkpOwotICB9Ci0gIAotICBzdGF0aWMgcHVibGljIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiggaW5zdGFuY2VfID09IG51bGwgKQotICAgIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQoKTsKLSAgICAgIGluc3RhbmNlXy5sb2FkKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBsb2FkKCkKLSAgewotICAgIHJlZ2lzdHJ5ID0gQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlW10gZGlhbG9ncyA9IHJlZ2lzdHJ5LmdldEFjdGlvbkRpYWxvZ3NQcmVmcmVuY2VzKCk7Ci0gIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlhbG9ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBzZXREZWZhdWx0KGRpYWxvZ3NbaV0uZ2V0SWQoKSwgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVtdIGdldERpYWxvZ3MoKQotICB7Ci0gICAgcmV0dXJuIHJlZ2lzdHJ5LmdldEFjdGlvbkRpYWxvZ3NQcmVmcmVuY2VzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3Rpb25EaWFsb2dFbmFibGVkKFN0cmluZyBpZCwgYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHNldFZhbHVlKGlkLCB2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0FjdGlvbkRpYWxvZ0VuYWJsZWQoU3RyaW5nIGlkKQotICB7Ci0gICAgaWYgKGlkID09IG51bGwpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihpZCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coIFN0cmluZyBpZCApCi0gIHsKLSAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBkaWFsb2cgPSByZWdpc3RyeS5nZXRBY3Rpb25EaWFsb2dzUHJlZnJlbmNlKCBpZCApOyAgICAKLSAgIAotICAgIHJldHVybiAoZGlhbG9nLmdldFNob3dDaGVja2JveCgpICYmICFkaWFsb2cuZ2V0QWx3YXlzSGlkZSgpICYmICFpc0FjdGlvbkRpYWxvZ0VuYWJsZWQoIGlkICkpIHx8Ci0gICAgICAgICAgICAhZGlhbG9nLmdldFNob3dDaGVja2JveCgpICYmICFkaWFsb2cuZ2V0QWx3YXlzSGlkZSgpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBzaG93Q2hlY2tib3goIFN0cmluZyBpZCApCi0gIHsKLSAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBkaWFsb2cgPSByZWdpc3RyeS5nZXRBY3Rpb25EaWFsb2dzUHJlZnJlbmNlKCBpZCApOyAgICAKLSAgICAKLSAgICByZXR1cm4gZGlhbG9nID09IG51bGwgPyBmYWxzZSA6IGRpYWxvZy5nZXRTaG93Q2hlY2tib3goKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb250ZXh0L1BlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9QZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNDk0ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb250ZXh0L1BlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29udGV4dC5QZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlRGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29udGV4dC5UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnBsdWdpbi5FbnZQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dCBpbXBsZW1lbnRzIFJlc291cmNlQ29udGV4dAotewotICBwcml2YXRlIHN0YXRpYyBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0IGNvbnRleHRfID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiggY29udGV4dF8gPT0gbnVsbCApCi0gICAgewotICAgICAgY29udGV4dF8gPSBuZXcgUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCgpOwotICAgICAgY29udGV4dF8ubG9hZCgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY29udGV4dF87Ci0gIH0KLSAgCi0gIHByaXZhdGUgUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCgpCi0gIHsKLSAgICBzdXBlcihFbnZQbHVnaW4uZ2V0SW5zdGFuY2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBsb2FkKCkKLSAgewotICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9PVkVSV1JJVEUsIFJlc291cmNlRGVmYXVsdHMKLSAgICAgICAgLmdldE92ZXJ3cml0ZUZpbGVzRGVmYXVsdCgpKTsKLSAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQ1JFQVRFX0ZPTERFUlMsIFJlc291cmNlRGVmYXVsdHMKLSAgICAgICAgLmdldENyZWF0ZUZvbGRlcnNEZWZhdWx0KCkpOwotICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9DSEVDS09VVCwgUmVzb3VyY2VEZWZhdWx0cy5nZXRDaGVja291dEZpbGVzRGVmYXVsdCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZChib29sZWFuIGVuYWJsZSkKLSAgewotICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfT1ZFUldSSVRFLCBlbmFibGUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfT1ZFUldSSVRFKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENyZWF0ZUZvbGRlcnNFbmFibGVkKGJvb2xlYW4gZW5hYmxlKQotICB7Ci0gICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9DUkVBVEVfRk9MREVSUywgZW5hYmxlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfQ1JFQVRFX0ZPTERFUlMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoYm9vbGVhbiBlbmFibGUpCi0gIHsKLSAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0NIRUNLT1VULCBlbmFibGUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDaGVja291dEZpbGVzRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9DSEVDS09VVCk7Ci0gIH0KLQotICBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGNvcHkoKQotICB7Ci0gICAgUmVzb3VyY2VDb250ZXh0IGNjID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotICAgIGNjLnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZChpc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKTsKLSAgICBjYy5zZXRDcmVhdGVGb2xkZXJzRW5hYmxlZChpc0NyZWF0ZUZvbGRlcnNFbmFibGVkKCkpOwotICAgIGNjLnNldENoZWNrb3V0RmlsZXNFbmFibGVkKGlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSk7Ci0gICAgcmV0dXJuIGNjOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3BsdWdpbi9FbnZQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvcGx1Z2luL0VudlBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjhmNGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvcGx1Z2luL0VudlBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEVudlBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRW52UGx1Z2luIGluc3RhbmNlOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBFbnZQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnZQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYTU1MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnByZWZlcmVuY2VzOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBkZWZpbmUgcHJlZmVyZW5jZSBpZHMuIEl0IGNvcnJlc3BvbmRzIHRvIGluZm9ybWF0aW9uCi0gKiBzcGVjaWZpZWQgYnkgYSBhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBleHRlbnNpb24gcG9pbnQuCi0gKiBFYWNoIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGVudHJ5IHdpbGwgcmVzdWx0IGluIGFuIGVudHJ5IGluIHRoZQotICogYWN0aW9uIGRpYWxvZ3MgcHJlZmVyZW5jZSBwYWdlIGlmIHRoZSBzaG93Y2hlY2tib3ggZmllbGQgaXMgdHJ1ZS4KLSAqICAgCi0gKiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIDxwcmU+Ci0gICogICAmbHQ7ZXh0ZW5zaW9uCi0gKiAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIiZndDsKLSAqICAgICAmbHQ7YWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLSAqICAgICAgICAgICBzaG93Y2hlY2tib3g9InRydWUiCi0gKiAgICAgICAgICAgbmFtZT0iJUNIRUNLQk9YX1NIT1dfR0VORVJBVEVfSkFWQV9QUk9YWV9ESUFMT0ciCi0gKiAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gKiAgICAgICAgICAgdG9vbHRpcD0iJVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9XU0RMMlBST1hZIgotICogICAgICAgICAgIGluZm9wb3A9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5QUEFEMDAwNCIKLSAqICAgICAgICAgICBhbHdheXNoaWRlPSJmYWxzZSIKLSAqICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIiZndDsKLSAqICAgICAmbHQ7L2FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlJmd0OwotICogPC9wcmU+Ci0gKgotICogVGhpcyBhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBleHRlbnNpb24gcG9pbnQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIE9iamVjdENvbnRyaWJ1dGlvbgotICogZXh0ZW5zaW9uIHBvaW50LiAgRm9yIGV4YW1wbGU6IAotICogCi0gKiAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAqICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gKiAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2RsIgotICogICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICogPCEtLSBXU0RMIFRvIEphdmEgQmVhbiBQcm94eSAtLT4KLSAqICAgICAgICA8YWN0aW9uCi0gKiAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9QUk9YWSIKLSAqICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICogICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAqICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAqICAgICAgICA8L2FjdGlvbj4KLSAqICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAqCi0gKiBUaGUgT2JqZWN0Q29udHJpYnV0aW9uIGVudHJ5IGlzIGxpbmtlZCB3aXRoIHRoZSBhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBlbnRyeQotICogdmlhIHRoZSBpZCBhdHRyaWJ1dGUgb2YgdGhlIE9iamVjdENvbnRpcmJ1dGlvbiBhbmQgdGhlIGlkIGF0dHJpYnV0ZSBvZiBhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZS4KLSAqIE5vdGU6IHRoZSBpZCBpbiB0aGUgYWN0aW9uIGVudHJ5IGlzIGFsd2F5cyBhc3NvY2lhdGVkIHdpdGggdGhlIGR5bmFtaWMgd2l6YXJkIHRoYXQKLSAqIHNob3VsZCBiZSBwb3B1cGVkIHVwLiAgSW4gdGhlIGV4YW1wbGUgYWJvdmUgdGhlIE9iamVjdGlvbkNvbnRyaWJ1dGlvbiBpZCBhbmQgdGhlCi0gKiBhY3Rpb24gaWRzIGFyZSB0aGUgc2FtZSwgYnV0IHRoaXMgbmVlZCBub3QgYmUgdGhlIGNhc2UuICAKLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi17Ci0gIHByaXZhdGUgU3RyaW5nICBpZF87Ci0gIHByaXZhdGUgU3RyaW5nICBuYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgIGluZm9wb3BfOwotICBwcml2YXRlIFN0cmluZyAgdG9vbHRpcF87Ci0gIHByaXZhdGUgYm9vbGVhbiBzaG93Q2hlY2tib3hfOwotICBwcml2YXRlIGJvb2xlYW4gYWx3YXlzSGlkZV87Ci0gIHByaXZhdGUgU3RyaW5nICBjYXRlZ29yeV87Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGlkIGZvciB0aGlzIHBvcHVwIGFjdGlvbi4gIFRoaXMgaWQgbGluayB0aGUgYWN0aW9uRGlhbG9nUHJlZmVyZW5jZQotICAgKiB3aXRoIGFuIE9iamVjdENvbnRyaWJ1dGlvbi4KLSAgICogQHBhcmFtIGlkIHRoZSBpZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkKLSAgewotICAgIGlkXyA9IGlkOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGlkIGZvciB0aGlzIHBvcHVwIGFjdGlvbi4KLSAgICogQHJldHVybiB0aGUgaWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiBpZF87Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbmFtZSBmb3IgdGhpcyBwb3B1cCBhY3Rpb24uICBUaGlzIG5hbWUgaXMgZGlzcGxheWVkIG9uIHRoZQotICAgKiBkaWFsb2cgcHJlZmVyZW5jZXMgcGFnZSBhbmQgbXVzdCBiZSB0cmFuc2xhdGVkLgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcG9wdXAgY2hlY2sgYm94LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIG5hbWVfID0gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBkaXNwbGF5IHZhbHVlIGZvciB0aGlzIHBvcHVwIGNoZWNrIGJveC4KLSAgICogTm90ZTogdGhpcyB2YWx1ZSBtYXkgYmUgbnVsbCBpZiB0aGUgZ2V0U2hvd0NoZWNrQm94IG1ldGhvZCByZXR1cm5zIGZhbHNlLgotICAgKiBAcmV0dXJuIHRoZSBuYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBpbmZvIHBvcCB2YWx1ZSBmb3IgdGhpcyBwb3B1cCBjaGVjayBib3guCi0gICAqIEBwYXJhbSBpbmZvcG9wCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbmZvcG9wKFN0cmluZyBpbmZvcG9wKQotICB7Ci0gICAgaW5mb3BvcF8gPSBpbmZvcG9wOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGluZm8gcG9wIHZhbHVlIGZvciB0aGlzIHBvcHVwIGNoZWNrIGJveC4KLSAgICogTm90ZTogdGhpcyB2YWx1ZSBtYXkgYmUgbnVsbCBpZiB0aGUgZ2V0U2hvd0NoZWNrQm94IG1ldGhvZCByZXR1cm5zIGZhbHNlLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgaW5mb3BvcCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcCgpCi0gIHsKLSAgICByZXR1cm4gaW5mb3BvcF87Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdG9vbHRpcCB2YWx1ZSBmb3IgdGhpcyBwb3B1cCBjaGVjayBib3guCi0gICAqIEBwYXJhbSB0b29sdGlwCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUb29sdGlwKFN0cmluZyB0b29sdGlwKQotICB7Ci0gICAgdG9vbHRpcF8gPSB0b29sdGlwOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHRvb2x0aXAgdmFsdWUgZm9yIHRoaXMgcG9wdXAgY2hlY2sgYm94LgotICAgKiBOb3RlOiB0aGlzIHZhbHVlIG1heSBiZSBudWxsIGlmIHRoZSBnZXRTaG93Q2hlY2tCb3ggbWV0aG9kIHJldHVybnMgZmFsc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSB0b29sdGlwIHZhbHVlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUb29sdGlwKCkKLSAgewotICAgIHJldHVybiB0b29sdGlwXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIHNob3cgY2hlY2sgYm94IHZhbHVlIGZvciB0aGlzIHBvcHVwLiAgSWYgdGhlIHZhbHVlIGlzIHRydWUgdGhlbgotICAgKiB0aGlzIHBvcHVwIHdpbGwgYXBwZWFyIG9uIGFuIGFjdGlvbiBkaWFsb2dzIHByZWZlcmVuY2UgcGFnZS4gIEFsc28gaWYgdGhpcwotICAgKiB2YWx1ZSBpcyB0cnVlIGFuZCB0aGUgYWx3YXlzIGhpZGUgdmFsdWUgaXMgZmFsc2UgdGhlbiBhIGNoZWNrIGJveCB3aWxsIGJlIGRpc3BsYXllZAotICAgKiBvbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGlzIHBvcHVwIHdoaWNoIGFza3MgdGhlIHVzZXIgaWYgdGhleSB3YW50IHRoZSBwb3B1cAotICAgKiB0byBiZSBkaXNwbGF5ZWQgdGhlIG5leHQgdGltZSBhcmUgdG8ganVzdCBleGVjdXRlIHRoZSBwb3B1cCBhY3Rpb24uCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgc2hvdyBjaGVjayBib3ggdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93Q2hlY2tib3goIGJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgc2hvd0NoZWNrYm94XyA9IHZhbHVlOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0cyB0aGUgc2hvdyBjaGVjayBib3ggdmFsdWUuCi0gICAqIEByZXR1cm4gdGhlIHNob3cgY2hlY2sgYm94IHZhbHVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd0NoZWNrYm94KCkKLSAgewotICAgIHJldHVybiBzaG93Q2hlY2tib3hfOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgYWx3YXlzIGhpZGUgdmFsdWUuICBUaGlzIHZhbHVlIHNwZWNpZmllcyB0aGF0IHRoZSBwb3B1cCBzaG91bGQgYWx3YXlzCi0gICAqIGJlIGV4ZWN1dGVkIHdpdGhvdXQgYnJpbmdpbmcgdXAgdGhlIHBvcHVwIHdpemFyZC4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBhbHdheXMgaGlkZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFsd2F5c0hpZGUoIGJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgYWx3YXlzSGlkZV8gPSB2YWx1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGFsd2F5cyBoaWRlIHZhbHVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0QWx3YXlzSGlkZSgpCi0gIHsKLSAgICByZXR1cm4gYWx3YXlzSGlkZV87IAotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgY2F0ZWdvcnkgaWQgZm9yIHBvcHVwIGFjdGlvbi4gIEFsbCBwb3B1cCBhY3Rpb25zIHdpdGggdGhlIHNhbWUKLSAgICogY2F0ZWdvcnkgaWQgd2lsbCBiZSBncm91cGVkIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIHBvcHVwIGFjdGlvbiBwcmVmZXJlbmNlIHBhZ2UuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgY2F0ZWdvcnkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeSggU3RyaW5nIHZhbHVlICkKLSAgewotICAgIGNhdGVnb3J5XyA9IHZhbHVlOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGNhdGVnb3J5IGlkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpCi0gIHsKLSAgICByZXR1cm4gY2F0ZWdvcnlfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjMWU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi0uY2R0cHJvamVjdAotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotcGFyc2VyLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWI2NjQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3NjU5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwYXJzZXIuamFyCi1zb3VyY2UucGFyc2VyLmphciA9IHNyYy8KLW91dHB1dC5wYXJzZXIuamFyID0gYmluLwotc3JjLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1YWM2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIFBhcnNlcgotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTNkZjMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIG5hbWU9IiVQTFVHSU5fTkFNRSIKLSAgIHByb3ZpZGVyLW5hbWU9IiVQTFVHSU5fUFJPVklERVIiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5QYXJzZXJQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InBhcnNlci5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLndzaWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MudWRkaTRqIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLmF4aXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9QYXJzZXJQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9QYXJzZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjNzIzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvUGFyc2VyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBQYXJzZXJQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBQYXJzZXJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSAgID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLlBhcnNlclBsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGFyc2VyUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBQYXJzZXJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Rpc2NvL0RJU0NPQ29udHJhY3RSZWZlcmVuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9kaXNjby9ESVNDT0NvbnRyYWN0UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNGI3MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Rpc2NvL0RJU0NPQ29udHJhY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5kaXNjbzsKLQotcHVibGljIGNsYXNzIERJU0NPQ29udHJhY3RSZWZlcmVuY2UgZXh0ZW5kcyBESVNDT1JlZmVyZW5jZQotewotICBwcml2YXRlIFN0cmluZyBkb2NSZWZfOwotICAKLSAgcHVibGljIERJU0NPQ29udHJhY3RSZWZlcmVuY2UoU3RyaW5nIHJlZixTdHJpbmcgZG9jUmVmKQotICB7Ci0gICAgc3VwZXIocmVmKTsKLSAgICBkb2NSZWZfID0gZG9jUmVmOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldERvY1JlZigpCi0gIHsKLSAgICByZXR1cm4gZG9jUmVmXzsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9kaXNjby9ESVNDT1BhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Rpc2NvL0RJU0NPUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZjNjYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Rpc2NvL0RJU0NPUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9tc2RubWFnL2lzc3Vlcy8wMi8wMi94bWwvZGVmYXVsdC5hc3B4IGZvciBtb3JlCi0gKiBkZXRhaWxzIG9uIERJU0NPLgotICovCi1wdWJsaWMgY2xhc3MgRElTQ09QYXJzZXIKLXsKLSAgcHJpdmF0ZSBEb2N1bWVudEJ1aWxkZXIgcGFyc2VyXzsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTlNfRElTQ08gPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvZGlzY28vIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRElTQ09WRVJZID0gImRpc2NvdmVyeSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERJU0NPVkVSWV9SRUYgPSAiZGlzY292ZXJ5UmVmIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTlNfQ09OVFJBQ1RfUkVGID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL2Rpc2NvL3NjbC8iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBDT05UUkFDVF9SRUYgPSAiY29udHJhY3RSZWYiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBSRUYgPSAicmVmIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRE9DX1JFRiA9ICJkb2NSZWYiOwotCi0gIHB1YmxpYyBESVNDT1BhcnNlcigpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY0J1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgZG9jQnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICBwYXJzZXJfID0gZG9jQnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkKLSAgICB7Ci0gICAgICBwYXJzZXJfID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRElTQ09SZWZlcmVuY2VbXSBwYXJzZShTdHJpbmcgZGlzY29VUkksIElucHV0U291cmNlIHNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKHBhcnNlcl8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBwYXJzZXJfLnBhcnNlKHNvdXJjZSk7Ci0gICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgLy8gUm9vdCBlbGVtZW50IG11c3QgYnkgPGRpc2NvOmRpc2NvdmVyeQotICAgICAgLy8geG1sbnM6ZGlzY289Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL2Rpc2NvLyI+Ci0gICAgICBpZiAocm9vdEVsZW1lbnQgIT0gbnVsbCAmJiByb290RWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoTlNfRElTQ08pICYmIHJvb3RFbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhESVNDT1ZFUlkpKQotICAgICAgewotICAgICAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gcm9vdEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBWZWN0b3IgZGlzY29SZWZlcmVuY2VzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotICAgICAgICAgIGlmIChjaGlsZE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KWNoaWxkTm9kZTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIG5zVVJJID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuc1VSSS5lcXVhbHMoTlNfRElTQ08pICYmIGxvY2FsTmFtZS5lcXVhbHMoRElTQ09WRVJZX1JFRikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIERJU0NPIGxpbmsuCi0gICAgICAgICAgICAgIFN0cmluZyByZWYgPSBjb252ZXJ0VG9BYnNvbHV0ZVVSSShkaXNjb1VSSSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoUkVGKSk7Ci0gICAgICAgICAgICAgIGRpc2NvUmVmZXJlbmNlcy5hZGRFbGVtZW50KG5ldyBESVNDT1JlZmVyZW5jZShyZWYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG5zVVJJLmVxdWFscyhOU19DT05UUkFDVF9SRUYpICYmIGxvY2FsTmFtZS5lcXVhbHMoQ09OVFJBQ1RfUkVGKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gV1NETCBsaW5rLgotICAgICAgICAgICAgICBTdHJpbmcgcmVmID0gY29udmVydFRvQWJzb2x1dGVVUkkoZGlzY29VUkksIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFJFRikpOwotICAgICAgICAgICAgICBTdHJpbmcgZG9jUmVmID0gY29udmVydFRvQWJzb2x1dGVVUkkoZGlzY29VUkksIGVsZW1lbnQuZ2V0QXR0cmlidXRlKERPQ19SRUYpKTsKLSAgICAgICAgICAgICAgZGlzY29SZWZlcmVuY2VzLmFkZEVsZW1lbnQobmV3IERJU0NPQ29udHJhY3RSZWZlcmVuY2UocmVmLCBkb2NSZWYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG51bWJlck9mRElTQ09SZWZlcmVuY2VzID0gZGlzY29SZWZlcmVuY2VzLnNpemUoKTsKLSAgICAgICAgaWYgKG51bWJlck9mRElTQ09SZWZlcmVuY2VzID4gMCkKLSAgICAgICAgewotICAgICAgICAgIERJU0NPUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBESVNDT1JlZmVyZW5jZVtudW1iZXJPZkRJU0NPUmVmZXJlbmNlc107Ci0gICAgICAgICAgZGlzY29SZWZlcmVuY2VzLmNvcHlJbnRvKHJlZmVyZW5jZXMpOwotICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFRoZSBkb2N1bWVudCBpcyBub3QgYSB2YWxpZCBESVNDTyBkb2N1bWVudC4KLSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRUb0Fic29sdXRlVVJJKFN0cmluZyBkaXNjb1VSSSwgU3RyaW5nIHJlZlVSSSkKLSAgewotICAgIGlmIChyZWZVUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocmVmVVJJLmluZGV4T2YoIjovLyIpID4gLTEpCi0gICAgICB7Ci0gICAgICAgIC8vIHJlZlVSSSBpcyBhbHJlYWR5IGFic29sdXRlLgotICAgICAgICByZXR1cm4gcmVmVVJJOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYWJzb2x1dGVVUkkgPSBuZXcgU3RyaW5nQnVmZmVyKGRpc2NvVVJJLnN1YnN0cmluZygwLCBNYXRoLm1heChkaXNjb1VSSS5sYXN0SW5kZXhPZignXFwnKSwgZGlzY29VUkkubGFzdEluZGV4T2YoJy8nKSArIDEpKSk7Ci0gICAgICAgIGFic29sdXRlVVJJLmFwcGVuZChyZWZVUkkpOwotICAgICAgICByZXR1cm4gYWJzb2x1dGVVUkkudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZGlzY28vRElTQ09SZWZlcmVuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9kaXNjby9ESVNDT1JlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzEzYmJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9kaXNjby9ESVNDT1JlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvOwotCi1wdWJsaWMgY2xhc3MgRElTQ09SZWZlcmVuY2UKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcmVmXzsKLSAgCi0gIHB1YmxpYyBESVNDT1JlZmVyZW5jZShTdHJpbmcgcmVmKQotICB7Ci0gICAgcmVmXyA9IHJlZjsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRSZWYoKQotICB7Ci0gICAgcmV0dXJuIHJlZl87Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZGlzY292ZXJ5L05ldFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZGlzY292ZXJ5L05ldFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YmM1Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Rpc2NvdmVyeS9OZXRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvdmVyeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBzdW4ubWlzYy5CQVNFNjRFbmNvZGVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTmV0VXRpbHMKLXsKLQotICAvKioKLSAgICogR2V0IHRoZSBqYXZhLm5ldC5VUkxDb25uZWN0aW9uIGdpdmVuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgVVJMLiBUaGlzIGNsYXNzIGVuc3VyZXMKLSAgICogdGhhdCBwcm94eSBzZXR0aW5ncyBpbiBXU0FEIGFyZSByZXNwZWN0ZWQuCi0gICAqIEBwYXJhbSB1cmxTdHJpbmcgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgVVJMLgotICAgKiBAcmV0dXJuIGphdmEubmV0LlVSTENEb25uZWN0aW9uIFVSTENvbm5lY3Rpb24gdG8gdGhlIFVSTC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVVJMQ29ubmVjdGlvbiBnZXRVUkxDb25uZWN0aW9uKFN0cmluZyB1cmxTdHJpbmcpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkwgdXJsID0gY3JlYXRlVVJMKHVybFN0cmluZyk7Ci0gICAgICBVUkxDb25uZWN0aW9uIHVjID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICBTdHJpbmcgcHJveHlVc2VyTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVVzZXJOYW1lIik7Ci0gICAgICBTdHJpbmcgcHJveHlQYXNzd29yZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVBhc3N3b3JkIik7Ci0gICAgICBpZiAocHJveHlVc2VyTmFtZSAhPSBudWxsICYmIHByb3h5UGFzc3dvcmQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHVzZXJOYW1lUGFzc3dvcmQgPSBuZXcgU3RyaW5nQnVmZmVyKHByb3h5VXNlck5hbWUpOwotICAgICAgICB1c2VyTmFtZVBhc3N3b3JkLmFwcGVuZCgnOicpLmFwcGVuZChwcm94eVBhc3N3b3JkKTsKLSAgICAgICAgQkFTRTY0RW5jb2RlciBlbmNvZGVyID0gbmV3IEJBU0U2NEVuY29kZXIoKTsKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gZW5jb2Rlci5lbmNvZGUodXNlck5hbWVQYXNzd29yZC50b1N0cmluZygpLmdldEJ5dGVzKCkpOwotICAgICAgICB1c2VyTmFtZVBhc3N3b3JkLnNldExlbmd0aCgwKTsKLSAgICAgICAgdXNlck5hbWVQYXNzd29yZC5hcHBlbmQoIkJhc2ljICIpLmFwcGVuZChlbmNvZGluZyk7Ci0gICAgICAgIHVjLnNldFJlcXVlc3RQcm9wZXJ0eSgiUHJveHktYXV0aG9yaXphdGlvbiIsdXNlck5hbWVQYXNzd29yZC50b1N0cmluZygpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB1YzsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgamF2YS5pby5JbnB1dFN0cmVhbSBmb3IgYSBVUkwgZ2l2ZW4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBVUkwuIFRoaXMgY2xhc3MKLSAgICogZW5zdXJlcyB0aGF0IHByb3h5IHNldHRpbmdzIGluIFdTQUQgYXJlIHJlc3BlY3RlZC4KLSAgICogQHBhcmFtIHVybFN0cmluZyBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBVUkwuCi0gICAqIEByZXR1cm4gamF2YS5pby5JbnB1dFN0cmVhbSBJbnB1dFN0cmVhbSBmb3IgcmVhZGluZyB0aGUgVVJMIHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW5wdXRTdHJlYW0gZ2V0VVJMSW5wdXRTdHJlYW0oU3RyaW5nIHVybFN0cmluZykKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTENvbm5lY3Rpb24gdWMgPSBnZXRVUkxDb25uZWN0aW9uKHVybFN0cmluZyk7Ci0gICAgICBpZiAodWMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSB1Yy5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICByZXR1cm4gaXM7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgVVJMIGZyb20gYSBzdHJpbmcuCi0gICAqIEBwYXJhbSB1cmxTdHJpbmcgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgVVJMLgotICAgKiBAcmV0dXJuIFVSTCBqYXZhLmxhbmcuVVJMIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkwuCi0gICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFVSTCBjcmVhdGVVUkwoU3RyaW5nIHVybFN0cmluZykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICB7Ci0gIAlyZXR1cm4gbmV3IFVSTCh1cmxTdHJpbmcpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Rpc2NvdmVyeS9XZWJTZXJ2aWNlc1BhcnNlckV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Rpc2NvdmVyeS9XZWJTZXJ2aWNlc1BhcnNlckV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2E5NzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9kaXNjb3ZlcnkvV2ViU2VydmljZXNQYXJzZXJFeHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5kaXNjb3Zlcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzUGFyc2VyRXh0IGV4dGVuZHMgV2ViU2VydmljZXNQYXJzZXIgewotCi0gICAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyRXh0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlckV4dChTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHN1cGVyKHVyaSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFVSTCBjcmVhdGVVUkwoU3RyaW5nIHVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBOZXRVdGlscy5jcmVhdGVVUkwodXJsKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYjVhNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmZhdm9yaXRlczsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc0NvbnN0YW50cwotewotICAvLyBOYW1lc3BhY2UKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1dTREwgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVURESV9WMSA9ICJ1cm46dWRkaS1vcmc6YXBpIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VERElfVjIgPSAidXJuOnVkZGktb3JnOmFwaV92MiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VRERJX0JJTkRJTkcgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMS8xMC9pbnNwZWN0aW9uL3VkZGkvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1dTSUxfSU5TUEVDVElPTiA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAxLzEwL2luc3BlY3Rpb24vIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzTGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOGYxMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNMaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5mYXZvcml0ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuTGluazsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc0xpbmsKLXsKLSAgcHJvdGVjdGVkIExpbmsgbGlua187Ci0KLSAgcHVibGljIEZhdm9yaXRlc0xpbmsoKQotICB7Ci0gICAgbGlua18gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIExpbmsgZ2V0TGluaygpCi0gIHsKLSAgICByZXR1cm4gbGlua187Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMaW5rKExpbmsgbGluaykKLSAgewotICAgIGxpbmtfID0gbGluazsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNSZWdpc3RyeVR5cGVBYnN0cmFjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNSZWdpc3RyeVR5cGVBYnN0cmFjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjkyNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzUmVnaXN0cnlUeXBlQWJzdHJhY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5mYXZvcml0ZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5BYnN0cmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkluc3BlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkxpbms7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLlNlcnZpY2VOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLldTSUxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi51ZGRpLkJ1c2luZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi51ZGRpLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuaW1wbC5BYnN0cmFjdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmltcGwuRGVzY3JpcHRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5pbXBsLkxpbmtJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5pbXBsLlNlcnZpY2VOYW1lSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuaW1wbC5leHRlbnNpb24udWRkaS5CdXNpbmVzc0Rlc2NyaXB0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuaW1wbC5leHRlbnNpb24udWRkaS5TZXJ2aWNlRGVzY3JpcHRpb25JbXBsOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5CdXNpbmVzc0tleTsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuU2VydmljZUtleTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZhdm9yaXRlc1JlZ2lzdHJ5VHlwZUFic3RyYWN0IGltcGxlbWVudHMgSUZhdm9yaXRlc1JlZ2lzdHJ5VHlwZQotewotICBwdWJsaWMgRmF2b3JpdGVzUmVnaXN0cnlUeXBlQWJzdHJhY3QoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFJlYWRMb2NhdGlvbigpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFdyaXRlTG9jYXRpb24oKTsKLSAgcHJvdGVjdGVkIGFic3RyYWN0IFdTSUxEb2N1bWVudCBnZXRXU0lMRG9jdW1lbnQoKTsKLQotICBwdWJsaWMgdm9pZCBpbml0KCkKLSAgewotICAgIGdldFdTSUxEb2N1bWVudCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFdTSUxEb2N1bWVudCBsb2FkV1NJTERvY3VtZW50KFN0cmluZyBwYXRoLCBib29sZWFuIGZvcmNlKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgV1NJTERvY3VtZW50IHdzaWxEb2MgPSBXU0lMRG9jdW1lbnQubmV3SW5zdGFuY2UoKTsKLSAgICAgIHdzaWxEb2MucmVhZChuZXcgRmlsZVJlYWRlcihuZXcgRmlsZShwYXRoKSkpOwotICAgICAgcmV0dXJuIHdzaWxEb2M7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICBpZiAoZm9yY2UpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIFdTSUxEb2N1bWVudC5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdDIpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZhdm9yaXRlc1ZlcnNpb24oKQotICB7Ci0gICAgV1NJTERvY3VtZW50IHdzaWxEb2MgPSBnZXRXU0lMRG9jdW1lbnQoKTsKLSAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jLmdldEluc3BlY3Rpb24oKTsKLSAgICBBYnN0cmFjdFtdIGFic3RyYWN0cyA9IGluc3BlY3Rpb24uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgaWYgKGFic3RyYWN0cy5sZW5ndGggPiAwKQotICAgICAgcmV0dXJuIGFic3RyYWN0c1swXS5nZXRUZXh0KCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGYXZvcml0ZXNWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKQotICB7Ci0gICAgV1NJTERvY3VtZW50IHdzaWxEb2MgPSBnZXRXU0lMRG9jdW1lbnQoKTsKLSAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jLmdldEluc3BlY3Rpb24oKTsKLSAgICBBYnN0cmFjdCBhYnN0ID0gbmV3IEFic3RyYWN0SW1wbCgpOwotICAgIGFic3Quc2V0VGV4dCh2ZXJzaW9uKTsKLSAgICBpbnNwZWN0aW9uLnJlbW92ZUFic3RyYWN0cygpOwotICAgIGluc3BlY3Rpb24uYWRkQWJzdHJhY3QoYWJzdCk7Ci0gIH0KLQotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2F2ZSgpIHRocm93cyBXU0lMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgV1NJTERvY3VtZW50IHdzaWxEb2MgPSBnZXRXU0lMRG9jdW1lbnQoKTsKLSAgICBpZiAod3NpbERvYyAhPSBudWxsKQotICAgICAgd3NpbERvYy53cml0ZShnZXRXcml0ZUxvY2F0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIElGYXZvcml0ZXNVRERJUmVnaXN0cnlbXSBnZXRGYXZvcml0ZXNVRERJUmVnaXN0cmllcygpCi0gIHsKLSAgICBMaW5rW10gbGlua3MgPSBsb2FkVURESVJlZ2lzdHJpZXMoKTsKLSAgICBGYXZvcml0ZXNVRERJUmVnaXN0cnlbXSByZWdpc3RyaWVzID0gbmV3IEZhdm9yaXRlc1VERElSZWdpc3RyeVtsaW5rcy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcmVnaXN0cmllc1tpXSA9IG5ldyBGYXZvcml0ZXNVRERJUmVnaXN0cnkoKTsKLSAgICAgIHJlZ2lzdHJpZXNbaV0uc2V0TGluayhsaW5rc1tpXSk7Ci0gICAgfQotICAgIHJldHVybiByZWdpc3RyaWVzOwotICB9Ci0KLSAgcHVibGljIElGYXZvcml0ZXNVRERJQnVzaW5lc3NbXSBnZXRGYXZvcml0ZXNVRERJQnVzaW5lc3NlcygpCi0gIHsKLSAgICBMaW5rW10gbGlua3MgPSBsb2FkVURESUJ1c2luZXNzZXMoKTsKLSAgICBGYXZvcml0ZXNVRERJQnVzaW5lc3NbXSBidXNpbmVzc2VzID0gbmV3IEZhdm9yaXRlc1VERElCdXNpbmVzc1tsaW5rcy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgYnVzaW5lc3Nlc1tpXSA9IG5ldyBGYXZvcml0ZXNVRERJQnVzaW5lc3MoKTsKLSAgICAgIGJ1c2luZXNzZXNbaV0uc2V0TGluayhsaW5rc1tpXSk7Ci0gICAgfQotICAgIHJldHVybiBidXNpbmVzc2VzOwotICB9Ci0KLSAgcHVibGljIElGYXZvcml0ZXNVRERJU2VydmljZVtdIGdldEZhdm9yaXRlc1VERElTZXJ2aWNlcygpCi0gIHsKLSAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBsb2FkVURESVNlcnZpY2VzKCk7Ci0gICAgRmF2b3JpdGVzVURESVNlcnZpY2VbXSB1ZGRpU2VydmljZXMgPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2Vbc2VydmljZXMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHVkZGlTZXJ2aWNlc1tpXSA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZSgpOwotICAgICAgdWRkaVNlcnZpY2VzW2ldLnNldFNlcnZpY2Uoc2VydmljZXNbaV0pOwotICAgIH0KLSAgICByZXR1cm4gdWRkaVNlcnZpY2VzOwotICB9Ci0KLSAgcHVibGljIElGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZVtdIGdldEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlcygpCi0gIHsKLSAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBsb2FkVURESVNlcnZpY2VJbnRlcmZhY2VzKCk7Ci0gICAgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VbXSBzZXJJbnRzID0gbmV3IEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlW3NlcnZpY2VzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBzZXJJbnRzW2ldID0gbmV3IEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlKCk7Ci0gICAgICBzZXJJbnRzW2ldLnNldFNlcnZpY2Uoc2VydmljZXNbaV0pOwotICAgIH0KLSAgICByZXR1cm4gc2VySW50czsKLSAgfQotCi0gIHB1YmxpYyBJRmF2b3JpdGVzV1NETFtdIGdldEZhdm9yaXRlc1dTRExzKCkKLSAgewotICAgIFNlcnZpY2VbXSBzZXJ2aWNlcyA9IGxvYWRXU0RMU2VydmljZXMoKTsKLSAgICBGYXZvcml0ZXNXU0RMW10gd3NkbHMgPSBuZXcgRmF2b3JpdGVzV1NETFtzZXJ2aWNlcy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgd3NkbHNbaV0gPSBuZXcgRmF2b3JpdGVzV1NETCgpOwotICAgICAgd3NkbHNbaV0uc2V0U2VydmljZShzZXJ2aWNlc1tpXSk7Ci0gICAgfQotICAgIHJldHVybiB3c2RsczsKLSAgfQotCi0gIHB1YmxpYyBJRmF2b3JpdGVzV1NJTFtdIGdldEZhdm9yaXRlc1dTSUxzKCkKLSAgewotICAgIExpbmtbXSBsaW5rcyA9IGxvYWRXU0lMcygpOwotICAgIEZhdm9yaXRlc1dTSUxbXSB3c2lscyA9IG5ldyBGYXZvcml0ZXNXU0lMW2xpbmtzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB3c2lsc1tpXSA9IG5ldyBGYXZvcml0ZXNXU0lMKCk7Ci0gICAgICB3c2lsc1tpXS5zZXRMaW5rKGxpbmtzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdzaWxzOwotICB9Ci0KLSAgcHVibGljIExpbmtbXSBsb2FkVURESVJlZ2lzdHJpZXMoKSB7Ci0gICAgcmV0dXJuIGxvYWRMaW5rc0J5TmFtZXNwYWNlKEZhdm9yaXRlc0NvbnN0YW50cy5OQU1FU1BBQ0VfVURESV9WMSk7Ci0gIH0KLSAgICAKLSAgcHVibGljIExpbmtbXSBsb2FkVURESUJ1c2luZXNzZXMoKSB7Ci0gICAgcmV0dXJuIGxvYWRMaW5rc0J5TmFtZXNwYWNlKEZhdm9yaXRlc0NvbnN0YW50cy5OQU1FU1BBQ0VfVURESV9WMik7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZVtdIGxvYWRVRERJU2VydmljZXMoKSB7Ci0gICAgcmV0dXJuIGxvYWRTZXJ2aWNlc0J5TmFtZXNwYWNlKEZhdm9yaXRlc0NvbnN0YW50cy5OQU1FU1BBQ0VfVURESV9WMik7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZVtdIGxvYWRVRERJU2VydmljZUludGVyZmFjZXMoKSB7Ci0gICAgcmV0dXJuIGxvYWRTZXJ2aWNlc0J5TmFtZXNwYWNlKEZhdm9yaXRlc0NvbnN0YW50cy5OQU1FU1BBQ0VfVURESV9WMSk7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZVtdIGxvYWRXU0RMU2VydmljZXMoKSB7Ci0gICAgcmV0dXJuIGxvYWRTZXJ2aWNlc0J5TmFtZXNwYWNlKEZhdm9yaXRlc0NvbnN0YW50cy5OQU1FU1BBQ0VfV1NETCk7Ci0gIH0KLQotICBwdWJsaWMgTGlua1tdIGxvYWRXU0lMcygpIHsKLSAgICByZXR1cm4gbG9hZExpbmtzQnlOYW1lc3BhY2UoRmF2b3JpdGVzQ29uc3RhbnRzLk5BTUVTUEFDRV9XU0lMX0lOU1BFQ1RJT04pOwotICB9Ci0KLSAgcHJpdmF0ZSBTZXJ2aWNlW10gbG9hZFNlcnZpY2VzQnlOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgIFZlY3RvciBzZXJ2aWNlVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgaWYgKHdzaWxEb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jLmdldEluc3BlY3Rpb24oKTsKLSAgICAgIFNlcnZpY2VbXSBzZXJ2aWNlcyA9IGluc3BlY3Rpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgICBEZXNjcmlwdGlvbltdIGRlc2MgPSBzZXJ2aWNlc1tpXS5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgIGlmIChkZXNjWzBdLmdldFJlZmVyZW5jZWROYW1lc3BhY2UoKS5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgICAgc2VydmljZVZlY3Rvci5hZGQoc2VydmljZXNbaV0pOwotICAgICAgfQotICAgIH0KLSAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBuZXcgU2VydmljZVtzZXJ2aWNlVmVjdG9yLnNpemUoKV07Ci0gICAgc2VydmljZVZlY3Rvci5jb3B5SW50byhzZXJ2aWNlcyk7Ci0gICAgcmV0dXJuIHNlcnZpY2VzOwotICB9Ci0KLSAgcHJpdmF0ZSBMaW5rW10gbG9hZExpbmtzQnlOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgIFZlY3RvciBsaW5rVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgaWYgKHdzaWxEb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jLmdldEluc3BlY3Rpb24oKTsKLSAgICAgIExpbmtbXSBsaW5rcyA9IGluc3BlY3Rpb24uZ2V0TGlua3MoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChsaW5rc1tpXS5nZXRSZWZlcmVuY2VkTmFtZXNwYWNlKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgbGlua1ZlY3Rvci5hZGQobGlua3NbaV0pOwotICAgICAgfQotICAgIH0KLSAgICBMaW5rW10gbGlua3MgPSBuZXcgTGlua1tsaW5rVmVjdG9yLnNpemUoKV07Ci0gICAgbGlua1ZlY3Rvci5jb3B5SW50byhsaW5rcyk7Ci0gICAgcmV0dXJuIGxpbmtzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmF2b3JpdGVzVURESVJlZ2lzdHJ5KElGYXZvcml0ZXNVRERJUmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgICBhZGRVRERJUmVnaXN0cnkocmVnaXN0cnkuZ2V0TmFtZSgpLCByZWdpc3RyeS5nZXRJbnF1aXJ5VVJMKCksIHJlZ2lzdHJ5LmdldFB1Ymxpc2hVUkwoKSwgcmVnaXN0cnkuZ2V0UmVnaXN0cmF0aW9uVVJMKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmF2b3JpdGVzVURESUJ1c2luZXNzKElGYXZvcml0ZXNVRERJQnVzaW5lc3MgYnVzaW5lc3MpCi0gIHsKLSAgICBhZGRVRERJQnVzaW5lc3MoYnVzaW5lc3MuZ2V0TmFtZSgpLCBidXNpbmVzcy5nZXRJbnF1aXJ5VVJMKCksIGJ1c2luZXNzLmdldEJ1c2luZXNzS2V5KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmF2b3JpdGVzVURESVNlcnZpY2UoSUZhdm9yaXRlc1VERElTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBhZGRVRERJU2VydmljZShzZXJ2aWNlLmdldE5hbWUoKSwgc2VydmljZS5nZXRJbnF1aXJ5VVJMKCksIHNlcnZpY2UuZ2V0U2VydmljZUtleSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlKElGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZSBzZXJ2aWNlSW50ZXJmYWNlKQotICB7Ci0gICAgYWRkVURESVNlcnZpY2VJbnRlcmZhY2Uoc2VydmljZUludGVyZmFjZS5nZXROYW1lKCksIHNlcnZpY2VJbnRlcmZhY2UuZ2V0SW5xdWlyeVVSTCgpLCBzZXJ2aWNlSW50ZXJmYWNlLmdldFNlcnZpY2VJbnRlcmZhY2VLZXkoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGYXZvcml0ZXNXU0RMKElGYXZvcml0ZXNXU0RMIHdzZGwpCi0gIHsKLSAgICBhZGRXU0RMU2VydmljZSh3c2RsLmdldFdzZGxVcmwoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGYXZvcml0ZXNXU0lMKElGYXZvcml0ZXNXU0lMIHdzaWwpCi0gIHsKLSAgICBhZGRXU0lMTGluayh3c2lsLmdldFdzaWxVcmwoKSk7Ci0gIH0KLQotICBwdWJsaWMgTGluayBhZGRVRERJUmVnaXN0cnkoU3RyaW5nIHJlZ2lzdHJ5TmFtZSwgU3RyaW5nIGlucXVpcnlBUEksIFN0cmluZyBwdWJsaXNoQVBJLCBTdHJpbmcgcmVnaXN0cmF0aW9uVVJMKSB7Ci0gICAgV1NJTERvY3VtZW50IHdzaWxEb2MgPSBnZXRXU0lMRG9jdW1lbnQoKTsKLSAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jLmdldEluc3BlY3Rpb24oKTsKLSAgICBMaW5rIGxpbmsgPSBuZXcgTGlua0ltcGwoKTsKLSAgICAvLyByZWdpc3RyeSBuYW1lCi0gICAgQWJzdHJhY3QgYWJzdCA9IG5ldyBBYnN0cmFjdEltcGwoKTsKLSAgICBhYnN0LnNldFRleHQocmVnaXN0cnlOYW1lKTsKLSAgICBsaW5rLmFkZEFic3RyYWN0KGFic3QpOwotICAgIC8vIGlucXVpcnkgVVJMCi0gICAgQWJzdHJhY3QgYWJzdDIgPSBuZXcgQWJzdHJhY3RJbXBsKCk7Ci0gICAgYWJzdDIuc2V0VGV4dChpbnF1aXJ5QVBJKTsKLSAgICBsaW5rLmFkZEFic3RyYWN0KGFic3QyKTsKLSAgICAvLyBwdWJsaXNoIFVSTAotICAgIEFic3RyYWN0IGFic3QzID0gbmV3IEFic3RyYWN0SW1wbCgpOwotICAgIGlmIChwdWJsaXNoQVBJICE9IG51bGwpCi0gICAgICBhYnN0My5zZXRUZXh0KHB1Ymxpc2hBUEkpOwotICAgIGVsc2UKLSAgICAgIGFic3QzLnNldFRleHQoIiIpOwotICAgIGxpbmsuYWRkQWJzdHJhY3QoYWJzdDMpOwotICAgIC8vIHJlZ2lzdHJhdGlvbiBVUkwKLSAgICBBYnN0cmFjdCBhYnN0NCA9IG5ldyBBYnN0cmFjdEltcGwoKTsKLSAgICBpZiAocmVnaXN0cmF0aW9uVVJMICE9IG51bGwpCi0gICAgICBhYnN0NC5zZXRUZXh0KHJlZ2lzdHJhdGlvblVSTCk7Ci0gICAgZWxzZQotICAgICAgYWJzdDQuc2V0VGV4dCgiIik7Ci0gICAgbGluay5hZGRBYnN0cmFjdChhYnN0NCk7Ci0gICAgLy8gYWRkIG5hbWVzcGFjZQotICAgIGxpbmsuc2V0UmVmZXJlbmNlZE5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjEpOwotICAgIGluc3BlY3Rpb24uYWRkTGluayhsaW5rKTsKLSAgICByZXR1cm4gbGluazsKLSAgfQotCi0gIHB1YmxpYyBMaW5rIGFkZFVERElCdXNpbmVzcyhTdHJpbmcgYnVzaW5lc3NOYW1lLCBTdHJpbmcgaW5xdWlyeUFQSSwgU3RyaW5nIGJ1c2luZXNzS2V5KSB7Ci0gICAgV1NJTERvY3VtZW50IHdzaWxEb2MgPSBnZXRXU0lMRG9jdW1lbnQoKTsKLSAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jLmdldEluc3BlY3Rpb24oKTsKLSAgICBMaW5rIGxpbmsgPSBuZXcgTGlua0ltcGwoKTsKLSAgICBBYnN0cmFjdCBhYnN0ID0gbmV3IEFic3RyYWN0SW1wbCgpOwotICAgIGFic3Quc2V0VGV4dChidXNpbmVzc05hbWUpOwotICAgIGxpbmsuYWRkQWJzdHJhY3QoYWJzdCk7Ci0gICAgbGluay5zZXRSZWZlcmVuY2VkTmFtZXNwYWNlKEZhdm9yaXRlc0NvbnN0YW50cy5OQU1FU1BBQ0VfVURESV9WMik7Ci0gICAgQnVzaW5lc3NEZXNjcmlwdGlvbiBiZCA9IG5ldyBCdXNpbmVzc0Rlc2NyaXB0aW9uSW1wbCgpOwotICAgIGJkLnNldExvY2F0aW9uKGlucXVpcnlBUEkpOwotICAgIEJ1c2luZXNzS2V5IGtleSA9IG5ldyBCdXNpbmVzc0tleShidXNpbmVzc0tleSk7Ci0gICAgYmQuc2V0QnVzaW5lc3NLZXkoa2V5KTsKLSAgICBsaW5rLnNldEV4dGVuc2lvbkVsZW1lbnQoYmQpOwotICAgIGluc3BlY3Rpb24uYWRkTGluayhsaW5rKTsKLSAgICByZXR1cm4gbGluazsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlIGFkZFVERElTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGlucXVpcnlBUEksIFN0cmluZyBzZXJ2aWNlS2V5KSB7Ci0gICAgV1NJTERvY3VtZW50IHdzaWxEb2MgPSBnZXRXU0lMRG9jdW1lbnQoKTsKLSAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jLmdldEluc3BlY3Rpb24oKTsKLSAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZUltcGwoKTsKLSAgICBTZXJ2aWNlTmFtZSBuYW1lID0gbmV3IFNlcnZpY2VOYW1lSW1wbCgpOwotICAgIG5hbWUuc2V0VGV4dChzZXJ2aWNlTmFtZSk7Ci0gICAgc2VydmljZS5hZGRTZXJ2aWNlTmFtZShuYW1lKTsKLSAgICBEZXNjcmlwdGlvbiBkZXNjID0gbmV3IERlc2NyaXB0aW9uSW1wbCgpOwotICAgIGRlc2Muc2V0UmVmZXJlbmNlZE5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjIpOwotICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IG5ldyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCk7Ci0gICAgc2Quc2V0TG9jYXRpb24oaW5xdWlyeUFQSSk7Ci0gICAgU2VydmljZUtleSBrZXkgPSBuZXcgU2VydmljZUtleShzZXJ2aWNlS2V5KTsKLSAgICBzZC5zZXRTZXJ2aWNlS2V5KGtleSk7Ci0gICAgZGVzYy5zZXRFeHRlbnNpb25FbGVtZW50KHNkKTsKLSAgICBzZXJ2aWNlLmFkZERlc2NyaXB0aW9uKGRlc2MpOwotICAgIGluc3BlY3Rpb24uYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICByZXR1cm4gc2VydmljZTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlIGFkZFVERElTZXJ2aWNlSW50ZXJmYWNlKFN0cmluZyBzZXJJbnROYW1lLCBTdHJpbmcgaW5xdWlyeUFQSSwgU3RyaW5nIHNlckludEtleSkgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2VJbXBsKCk7Ci0gICAgU2VydmljZU5hbWUgbmFtZSA9IG5ldyBTZXJ2aWNlTmFtZUltcGwoKTsKLSAgICBuYW1lLnNldFRleHQoc2VySW50TmFtZSk7Ci0gICAgc2VydmljZS5hZGRTZXJ2aWNlTmFtZShuYW1lKTsKLSAgICBEZXNjcmlwdGlvbiBkZXNjID0gbmV3IERlc2NyaXB0aW9uSW1wbCgpOwotICAgIGRlc2Muc2V0UmVmZXJlbmNlZE5hbWVzcGFjZShGYXZvcml0ZXNDb25zdGFudHMuTkFNRVNQQUNFX1VERElfVjEpOwotICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IG5ldyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCk7Ci0gICAgc2Quc2V0TG9jYXRpb24oaW5xdWlyeUFQSSk7Ci0gICAgU2VydmljZUtleSBrZXkgPSBuZXcgU2VydmljZUtleShzZXJJbnRLZXkpOwotICAgIHNkLnNldFNlcnZpY2VLZXkoa2V5KTsKLSAgICBkZXNjLnNldEV4dGVuc2lvbkVsZW1lbnQoc2QpOwotICAgIHNlcnZpY2UuYWRkRGVzY3JpcHRpb24oZGVzYyk7Ci0gICAgaW5zcGVjdGlvbi5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgIHJldHVybiBzZXJ2aWNlOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2UgYWRkV1NETFNlcnZpY2UoU3RyaW5nIHVybCkgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2VJbXBsKCk7Ci0gICAgRGVzY3JpcHRpb24gZGVzYyA9IG5ldyBEZXNjcmlwdGlvbkltcGwoKTsKLSAgICBkZXNjLnNldExvY2F0aW9uKHVybCk7Ci0gICAgZGVzYy5zZXRSZWZlcmVuY2VkTmFtZXNwYWNlKEZhdm9yaXRlc0NvbnN0YW50cy5OQU1FU1BBQ0VfV1NETCk7Ci0gICAgc2VydmljZS5hZGREZXNjcmlwdGlvbihkZXNjKTsKLSAgICBpbnNwZWN0aW9uLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgcmV0dXJuIHNlcnZpY2U7Ci0gIH0KLQotICBwdWJsaWMgTGluayBhZGRXU0lMTGluayhTdHJpbmcgdXJsKSB7Ci0gICAgV1NJTERvY3VtZW50IHdzaWxEb2MgPSBnZXRXU0lMRG9jdW1lbnQoKTsKLSAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jLmdldEluc3BlY3Rpb24oKTsKLSAgICBMaW5rIGxpbmsgPSBuZXcgTGlua0ltcGwoKTsKLSAgICBsaW5rLnNldExvY2F0aW9uKHVybCk7Ci0gICAgbGluay5zZXRSZWZlcmVuY2VkTmFtZXNwYWNlKEZhdm9yaXRlc0NvbnN0YW50cy5OQU1FU1BBQ0VfV1NJTF9JTlNQRUNUSU9OKTsKLSAgICBpbnNwZWN0aW9uLmFkZExpbmsobGluayk7Ci0gICAgcmV0dXJuIGxpbms7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNVRERJUmVnaXN0cnkoSUZhdm9yaXRlc1VERElSZWdpc3RyeSByZWdpc3RyeSkKLSAgewotICAgIGlmIChyZWdpc3RyeSBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElSZWdpc3RyeSkKLSAgICAgIHJlbW92ZUxpbmsoKChGYXZvcml0ZXNVRERJUmVnaXN0cnkpcmVnaXN0cnkpLmdldExpbmsoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNVRERJQnVzaW5lc3MoSUZhdm9yaXRlc1VERElCdXNpbmVzcyBidXNpbmVzcykKLSAgewotICAgIGlmIChidXNpbmVzcyBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElCdXNpbmVzcykKLSAgICAgIHJlbW92ZUxpbmsoKChGYXZvcml0ZXNVRERJQnVzaW5lc3MpYnVzaW5lc3MpLmdldExpbmsoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNVRERJU2VydmljZShJRmF2b3JpdGVzVURESVNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIGlmIChzZXJ2aWNlIGluc3RhbmNlb2YgRmF2b3JpdGVzVURESVNlcnZpY2UpCi0gICAgICByZW1vdmVTZXJ2aWNlKCgoRmF2b3JpdGVzVURESVNlcnZpY2Upc2VydmljZSkuZ2V0U2VydmljZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlKElGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZSBzZXJ2aWNlSW50ZXJmYWNlKQotICB7Ci0gICAgaWYgKHNlcnZpY2VJbnRlcmZhY2UgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZSkKLSAgICAgIHJlbW92ZVNlcnZpY2UoKChGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZSlzZXJ2aWNlSW50ZXJmYWNlKS5nZXRTZXJ2aWNlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzV1NETChJRmF2b3JpdGVzV1NETCB3c2RsKQotICB7Ci0gICAgaWYgKHdzZGwgaW5zdGFuY2VvZiBGYXZvcml0ZXNXU0RMKQotICAgICAgcmVtb3ZlU2VydmljZSgoKEZhdm9yaXRlc1dTREwpd3NkbCkuZ2V0U2VydmljZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZhdm9yaXRlc1dTSUwoSUZhdm9yaXRlc1dTSUwgd3NpbCkKLSAgewotICAgIGlmICh3c2lsIGluc3RhbmNlb2YgRmF2b3JpdGVzV1NJTCkKLSAgICAgIHJlbW92ZUxpbmsoKChGYXZvcml0ZXNXU0lMKXdzaWwpLmdldExpbmsoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgaW5zcGVjdGlvbi5yZW1vdmVTZXJ2aWNlKHNlcnZpY2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGluayhMaW5rIGxpbmspCi0gIHsKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvYyA9IGdldFdTSUxEb2N1bWVudCgpOwotICAgIEluc3BlY3Rpb24gaW5zcGVjdGlvbiA9IHdzaWxEb2MuZ2V0SW5zcGVjdGlvbigpOwotICAgIGluc3BlY3Rpb24ucmVtb3ZlTGluayhsaW5rKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhMjQ2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmZhdm9yaXRlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5TZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzU2VydmljZQotewotICBwcm90ZWN0ZWQgU2VydmljZSBzZXJ2aWNlXzsKLQotICBwdWJsaWMgRmF2b3JpdGVzU2VydmljZSgpCi0gIHsKLSAgICBzZXJ2aWNlXyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgc2VydmljZV8gPSBzZXJ2aWNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1VERElCdXNpbmVzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJQnVzaW5lc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmODE3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1VERElCdXNpbmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZmF2b3JpdGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi51ZGRpLkJ1c2luZXNzRGVzY3JpcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJQnVzaW5lc3MgZXh0ZW5kcyBGYXZvcml0ZXNMaW5rIGltcGxlbWVudHMgSUZhdm9yaXRlc1VERElCdXNpbmVzcwotewotICBwdWJsaWMgRmF2b3JpdGVzVURESUJ1c2luZXNzKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIChsaW5rXy5nZXRBYnN0cmFjdHMoKSlbMF0uZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkKLSAgewotICAgIHJldHVybiAoKEJ1c2luZXNzRGVzY3JpcHRpb24pbGlua18uZ2V0RXh0ZW5zaW9uRWxlbWVudCgpKS5nZXRMb2NhdGlvbigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRCdXNpbmVzc0tleSgpCi0gIHsKLSAgICByZXR1cm4gKChCdXNpbmVzc0Rlc2NyaXB0aW9uKWxpbmtfLmdldEV4dGVuc2lvbkVsZW1lbnQoKSkuZ2V0QnVzaW5lc3NLZXkoKS5nZXRUZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnF1aXJ5VVJMKFN0cmluZyBpbnF1aXJ5VVJMKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRCdXNpbmVzc0tleShTdHJpbmcga2V5KQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzVURESVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1VERElSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTlhMzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzVURESVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5mYXZvcml0ZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuQWJzdHJhY3Q7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJUmVnaXN0cnkgZXh0ZW5kcyBGYXZvcml0ZXNMaW5rIGltcGxlbWVudHMgSUZhdm9yaXRlc1VERElSZWdpc3RyeQotewotICBwdWJsaWMgRmF2b3JpdGVzVURESVJlZ2lzdHJ5KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIChsaW5rXy5nZXRBYnN0cmFjdHMoKSlbMF0uZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkKLSAgewotICAgIHJldHVybiAobGlua18uZ2V0QWJzdHJhY3RzKCkpWzFdLmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpCi0gIHsKLSAgICBBYnN0cmFjdFtdIGFic3RyYWN0cyA9IGxpbmtfLmdldEFic3RyYWN0cygpOwotICAgIGlmIChhYnN0cmFjdHMubGVuZ3RoID4gMikKLSAgICB7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IGFic3RyYWN0c1syXS5nZXRUZXh0KCk7Ci0gICAgICBpZiAocHVibGlzaFVSTCAhPSBudWxsICYmIHB1Ymxpc2hVUkwubGVuZ3RoKCkgPiAwKQotICAgICAgICByZXR1cm4gcHVibGlzaFVSTDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpCi0gIHsKLSAgICBBYnN0cmFjdFtdIGFic3RyYWN0cyA9IGxpbmtfLmdldEFic3RyYWN0cygpOwotICAgIGlmIChhYnN0cmFjdHMubGVuZ3RoID4gMykKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVnaXN0cmF0aW9uVVJMID0gYWJzdHJhY3RzWzNdLmdldFRleHQoKTsKLSAgICAgIGlmIChyZWdpc3RyYXRpb25VUkwgIT0gbnVsbCAmJiByZWdpc3RyYXRpb25VUkwubGVuZ3RoKCkgPiAwKQotICAgICAgICByZXR1cm4gcmVnaXN0cmF0aW9uVVJMOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAobGlua18uZ2V0QWJzdHJhY3RzKCkpWzBdLnNldFRleHQobmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnF1aXJ5VVJMKFN0cmluZyBpbnF1aXJ5VVJMKQotICB7Ci0gICAgKGxpbmtfLmdldEFic3RyYWN0cygpKVsxXS5zZXRUZXh0KGlucXVpcnlVUkwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFVSTChTdHJpbmcgcHVibGlzaFVSTCkKLSAgewotICAgIEFic3RyYWN0W10gYWJzdHJhY3RzID0gbGlua18uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgaWYgKGFic3RyYWN0cy5sZW5ndGggPiAyKQotICAgICAgYWJzdHJhY3RzWzJdLnNldFRleHQocHVibGlzaFVSTCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZWdpc3RyYXRpb25VUkwoU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCkKLSAgewotICAgIEFic3RyYWN0W10gYWJzdHJhY3RzID0gbGlua18uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgaWYgKGFic3RyYWN0cy5sZW5ndGggPiAzKQotICAgICAgYWJzdHJhY3RzWzNdLnNldFRleHQocmVnaXN0cmF0aW9uVVJMKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWFlMjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzVURESVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmZhdm9yaXRlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS5TZXJ2aWNlRGVzY3JpcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJU2VydmljZSBleHRlbmRzIEZhdm9yaXRlc1NlcnZpY2UgaW1wbGVtZW50cyBJRmF2b3JpdGVzVURESVNlcnZpY2UKLXsKLSAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIChzZXJ2aWNlXy5nZXRTZXJ2aWNlTmFtZXMoKSlbMF0uZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkKLSAgewotICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IChTZXJ2aWNlRGVzY3JpcHRpb24pKHNlcnZpY2VfLmdldERlc2NyaXB0aW9ucygpKVswXS5nZXRFeHRlbnNpb25FbGVtZW50KCk7Ci0gICAgcmV0dXJuIHNkLmdldExvY2F0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VLZXkoKQotICB7Ci0gICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gKFNlcnZpY2VEZXNjcmlwdGlvbikoc2VydmljZV8uZ2V0RGVzY3JpcHRpb25zKCkpWzBdLmdldEV4dGVuc2lvbkVsZW1lbnQoKTsKLSAgICByZXR1cm4gc2QuZ2V0U2VydmljZUtleSgpLmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VLZXkoU3RyaW5nIGtleSkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjM2NjMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZmF2b3JpdGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi51ZGRpLlNlcnZpY2VEZXNjcmlwdGlvbjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlIGV4dGVuZHMgRmF2b3JpdGVzU2VydmljZSBpbXBsZW1lbnRzIElGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZQotewotICBwdWJsaWMgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gKHNlcnZpY2VfLmdldFNlcnZpY2VOYW1lcygpKVswXS5nZXRUZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKQotICB7Ci0gICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gKFNlcnZpY2VEZXNjcmlwdGlvbikoc2VydmljZV8uZ2V0RGVzY3JpcHRpb25zKCkpWzBdLmdldEV4dGVuc2lvbkVsZW1lbnQoKTsKLSAgICByZXR1cm4gc2QuZ2V0TG9jYXRpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUludGVyZmFjZUtleSgpCi0gIHsKLSAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSAoU2VydmljZURlc2NyaXB0aW9uKShzZXJ2aWNlXy5nZXREZXNjcmlwdGlvbnMoKSlbMF0uZ2V0RXh0ZW5zaW9uRWxlbWVudCgpOwotICAgIHJldHVybiBzZC5nZXRTZXJ2aWNlS2V5KCkuZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5xdWlyeVVSTChTdHJpbmcgaW5xdWlyeVVSTCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUludGVyZmFjZUtleShTdHJpbmcga2V5KQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzV1NETC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNXU0RMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NmQ3NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9GYXZvcml0ZXNXU0RMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5mYXZvcml0ZXM7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNXU0RMIGV4dGVuZHMgRmF2b3JpdGVzU2VydmljZSBpbXBsZW1lbnRzIElGYXZvcml0ZXNXU0RMCi17Ci0gIHB1YmxpYyBGYXZvcml0ZXNXU0RMKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldFdzZGxVcmwoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVybCgpCi0gIHsKLSAgICByZXR1cm4gKHNlcnZpY2VfLmdldERlc2NyaXB0aW9ucygpKVswXS5nZXRMb2NhdGlvbigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V3NkbFVybChTdHJpbmcgd3NkbFVSTCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0Zhdm9yaXRlc1dTSUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzV1NJTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjZmMzEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvRmF2b3JpdGVzV1NJTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZmF2b3JpdGVzOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzV1NJTCBleHRlbmRzIEZhdm9yaXRlc0xpbmsgaW1wbGVtZW50cyBJRmF2b3JpdGVzV1NJTAotewotICBwdWJsaWMgRmF2b3JpdGVzV1NJTCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBnZXRXc2lsVXJsKCk7Ci0gIH0KLQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NpbFVybCgpCi0gIHsKLSAgICByZXR1cm4gbGlua18uZ2V0TG9jYXRpb24oKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdzaWxVcmwoU3RyaW5nIHdzaWxVUkwpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzUmVnaXN0cnlUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNSZWdpc3RyeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlN2UxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNSZWdpc3RyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmZhdm9yaXRlczsKLQotcHVibGljIGludGVyZmFjZSBJRmF2b3JpdGVzUmVnaXN0cnlUeXBlCi17Ci0gIHB1YmxpYyBJRmF2b3JpdGVzVURESVJlZ2lzdHJ5W10gZ2V0RmF2b3JpdGVzVURESVJlZ2lzdHJpZXMoKTsKLSAgcHVibGljIElGYXZvcml0ZXNVRERJQnVzaW5lc3NbXSBnZXRGYXZvcml0ZXNVRERJQnVzaW5lc3NlcygpOwotICBwdWJsaWMgSUZhdm9yaXRlc1VERElTZXJ2aWNlW10gZ2V0RmF2b3JpdGVzVURESVNlcnZpY2VzKCk7Ci0gIHB1YmxpYyBJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VbXSBnZXRGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZXMoKTsKLSAgcHVibGljIElGYXZvcml0ZXNXU0RMW10gZ2V0RmF2b3JpdGVzV1NETHMoKTsKLSAgcHVibGljIElGYXZvcml0ZXNXU0lMW10gZ2V0RmF2b3JpdGVzV1NJTHMoKTsKLQotICBwdWJsaWMgdm9pZCBhZGRGYXZvcml0ZXNVRERJUmVnaXN0cnkoSUZhdm9yaXRlc1VERElSZWdpc3RyeSByZWdpc3RyeSk7Ci0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1VERElCdXNpbmVzcyhJRmF2b3JpdGVzVURESUJ1c2luZXNzIGJ1c2luZXNzKTsKLSAgcHVibGljIHZvaWQgYWRkRmF2b3JpdGVzVURESVNlcnZpY2UoSUZhdm9yaXRlc1VERElTZXJ2aWNlIHNlcnZpY2UpOwotICBwdWJsaWMgdm9pZCBhZGRGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZShJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2Ugc2VydmljZUludGVyZmFjZSk7Ci0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1dTREwoSUZhdm9yaXRlc1dTREwgd3NkbCk7Ci0gIHB1YmxpYyB2b2lkIGFkZEZhdm9yaXRlc1dTSUwoSUZhdm9yaXRlc1dTSUwgd3NpbCk7Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzVURESVJlZ2lzdHJ5KElGYXZvcml0ZXNVRERJUmVnaXN0cnkgcmVnaXN0cnkpOwotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNVRERJQnVzaW5lc3MoSUZhdm9yaXRlc1VERElCdXNpbmVzcyBidXNpbmVzcyk7Ci0gIHB1YmxpYyB2b2lkIHJlbW92ZUZhdm9yaXRlc1VERElTZXJ2aWNlKElGYXZvcml0ZXNVRERJU2VydmljZSBzZXJ2aWNlKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UoSUZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UpOwotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNXU0RMKElGYXZvcml0ZXNXU0RMIHdzZGwpOwotICBwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNXU0lMKElGYXZvcml0ZXNXU0lMIHdzaWwpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNVRERJQnVzaW5lc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElCdXNpbmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjYzZDA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElCdXNpbmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZmF2b3JpdGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYXZvcml0ZXNVRERJQnVzaW5lc3MKLXsKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpOwotICBwdWJsaWMgU3RyaW5nIGdldEJ1c2luZXNzS2V5KCk7Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0gIHB1YmxpYyB2b2lkIHNldElucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpOwotICBwdWJsaWMgdm9pZCBzZXRCdXNpbmVzc0tleShTdHJpbmcga2V5KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzVURESVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhY2Q1MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzVURESVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5mYXZvcml0ZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhdm9yaXRlc1VERElSZWdpc3RyeQotewotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpOwotICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpOwotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotICBwdWJsaWMgdm9pZCBzZXRJbnF1aXJ5VVJMKFN0cmluZyBpbnF1aXJ5VVJMKTsKLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFVSTChTdHJpbmcgcHVibGlzaFVSTCk7Ci0gIHB1YmxpYyB2b2lkIHNldFJlZ2lzdHJhdGlvblVSTChTdHJpbmcgcmVnaXN0cmF0aW9uVVJMKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNVRERJU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjZhOWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci5mYXZvcml0ZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZhdm9yaXRlc1VERElTZXJ2aWNlCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKTsKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlS2V5KCk7Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0gIHB1YmxpYyB2b2lkIHNldElucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpOwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlS2V5KFN0cmluZyBrZXkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci9mYXZvcml0ZXMvSUZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDdjMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmZhdm9yaXRlczsKLQotcHVibGljIGludGVyZmFjZSBJRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UKLXsKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpOwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VJbnRlcmZhY2VLZXkoKTsKLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLSAgcHVibGljIHZvaWQgc2V0SW5xdWlyeVVSTChTdHJpbmcgaW5xdWlyeVVSTCk7Ci0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbnRlcmZhY2VLZXkoU3RyaW5nIGtleSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNXU0RMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNXU0RMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMmJjZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzV1NETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZmF2b3JpdGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYXZvcml0ZXNXU0RMCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxVcmwoKTsKLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVybChTdHJpbmcgd3NkbFVSTCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNXU0lMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvZmF2b3JpdGVzL0lGYXZvcml0ZXNXU0lMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWYzOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL2Zhdm9yaXRlcy9JRmF2b3JpdGVzV1NJTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZmF2b3JpdGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGYXZvcml0ZXNXU0lMCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldFdzaWxVcmwoKTsKLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLSAgcHVibGljIHZvaWQgc2V0V3NpbFVybChTdHJpbmcgd3NpbFVSTCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9IVE1MSGVhZEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL0hUTUxIZWFkSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGVmMmI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL0hUTUxIZWFkSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgSFRNTEhlYWRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLXsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIFNUQVJUX1RBRyA9ICc8JzsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIEVORF9UQUcgPSAnPic7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhFQURfU1RBUlRfVEFHID0gIjxoZWFkPiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhFQURfRU5EX1RBRyA9ICI8L2hlYWQ+IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUk9PVF9TVEFSVF9UQUcgPSAiPHJvb3Q+IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUk9PVF9FTkRfVEFHID0gIjwvcm9vdD4iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBVVEY4ID0gIlVURi04IjsgIAotICAKLSAgLy8gV1NJTCB0YWcgaW5mb3JtYXRpb24uCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIE1FVEEgPSAibWV0YSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5TUEVDVElPTiA9ICJzZXJ2aWNlSW5zcGVjdGlvbiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIENPTlRFTlQgPSAiY29udGVudCI7Ci0gIAotICAvLyBESVNDTyB0YWcgaW5mb3JtYXRpb24uCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIExJTksgPSAibGluayI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRFWFRfWE1MID0gInRleHQveG1sIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUkVMID0gInJlbCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEFMVEVSTkFURSA9ICJhbHRlcm5hdGUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIUkVGID0gImhyZWYiOwotICAgIAotICBwcml2YXRlIFN0cmluZyBiYXNlVVJJXzsKLSAgcHJpdmF0ZSBWZWN0b3Igd3NpbHNfOwotICBwcml2YXRlIFZlY3RvciBkaXNjb3NfOwotICAKLSAgcHVibGljIEhUTUxIZWFkSGFuZGxlcihTdHJpbmcgYmFzZVVSSSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgYmFzZVVSSV8gPSBiYXNlVVJJOwotICAgIHdzaWxzXyA9IG5ldyBWZWN0b3IoKTsKLSAgICBkaXNjb3NfID0gbmV3IFZlY3RvcigpOwotICB9Ci0gCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXc2lscygpCi0gIHsKLSAgICBTdHJpbmdbXSB3c2lscyA9IG5ldyBTdHJpbmdbd3NpbHNfLnNpemUoKV07Ci0gICAgd3NpbHNfLmNvcHlJbnRvKHdzaWxzKTsKLSAgICByZXR1cm4gd3NpbHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXREaXNjb3MoKQotICB7Ci0gICAgU3RyaW5nW10gZGlzY29zID0gbmV3IFN0cmluZ1tkaXNjb3NfLnNpemUoKV07Ci0gICAgZGlzY29zXy5jb3B5SW50byhkaXNjb3MpOwotICAgIHJldHVybiBkaXNjb3M7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHFOYW1lTEMgPSBxTmFtZS50b0xvd2VyQ2FzZSgpOwotICAgIGlmIChxTmFtZUxDLmVxdWFscyhNRVRBKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZVZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShOQU1FKTsKLSAgICAgIGlmIChTRVJWSUNFX0lOU1BFQ1RJT04uZXF1YWxzKG5hbWVWYWx1ZSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB3c2lsVVJJID0gYXR0cmlidXRlcy5nZXRWYWx1ZShDT05URU5UKTsKLSAgICAgICAgaWYgKGJhc2VVUklfICE9IG51bGwgJiYgd3NpbFVSSS5pbmRleE9mKCI6LyIpID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgIHNiLmFwcGVuZChiYXNlVVJJXy5zdWJzdHJpbmcoMCwgYmFzZVVSSV8ubGFzdEluZGV4T2YoIi8iKSsxKSk7Ci0gICAgICAgICAgc2IuYXBwZW5kKHdzaWxVUkkpOwotICAgICAgICAgIHdzaWxVUkkgPSBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghd3NpbHNfLmNvbnRhaW5zKHdzaWxVUkkpKQotICAgICAgICAgIHdzaWxzXy5hZGQod3NpbFVSSSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHFOYW1lTEMuZXF1YWxzKExJTkspKQotICAgIHsKLSAgICAgIC8vIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL21zZG5tYWcvaXNzdWVzLzAyLzAyL3htbC9kZWZhdWx0LmFzcHggZm9yIG1vcmUgZGV0YWlscyBvbiBESVNDTy4KLSAgICAgIFN0cmluZyB0eXBlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShUWVBFKTsKLSAgICAgIFN0cmluZyByZWwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKFJFTCk7Ci0gICAgICBTdHJpbmcgaHJlZiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSFJFRik7Ci0gICAgICBpZiAoVEVYVF9YTUwuZXF1YWxzKHR5cGUpICYmIEFMVEVSTkFURS5lcXVhbHMocmVsKSAmJiBocmVmICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBkaXNjb1VSSSA9IGhyZWY7Ci0gICAgICAgIGlmIChkaXNjb1VSSS5pbmRleE9mKCI6LyIpID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgIHNiLmFwcGVuZChiYXNlVVJJXy5zdWJzdHJpbmcoMCxiYXNlVVJJXy5sYXN0SW5kZXhPZigiLyIpKzEpKTsKLSAgICAgICAgICBzYi5hcHBlbmQoZGlzY29VUkkpOwotICAgICAgICAgIGRpc2NvVVJJID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWRpc2Nvc18uY29udGFpbnMoZGlzY29VUkkpKQotICAgICAgICAgIGRpc2Nvc18uYWRkKGRpc2NvVVJJKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFydmVzdFRhZ3MoU3RyaW5nQnVmZmVyIHRhcmdldCxTdHJpbmcgZG9jdW1lbnQsU3RyaW5nIHRhZykKLSAgewotICAgIGludCBpbmRleCA9IGRvY3VtZW50LmluZGV4T2YoU1RBUlRfVEFHKTsKLSAgICBpbnQgZG9jdW1lbnRMZW5ndGggPSBkb2N1bWVudC5sZW5ndGgoKTsKLSAgICBpbnQgdGFnTGVuZ3RoID0gdGFnLmxlbmd0aCgpOwotICAgIHdoaWxlIChpbmRleCAhPSAtMSAmJiAoaW5kZXgrMSt0YWdMZW5ndGgpPGRvY3VtZW50TGVuZ3RoKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHIgPSBkb2N1bWVudC5zdWJzdHJpbmcoaW5kZXgrMSxpbmRleCsxK3RhZ0xlbmd0aCk7Ci0gICAgICBpZiAoc3RyLnRvTG93ZXJDYXNlKCkuZXF1YWxzKHRhZykpCi0gICAgICB7Ci0gICAgICAgIHN0ciA9IGRvY3VtZW50LnN1YnN0cmluZyhpbmRleCxkb2N1bWVudC5pbmRleE9mKEVORF9UQUcsaW5kZXgrMSkrMSk7Ci0gICAgICAgIHRhcmdldC5hcHBlbmQoc3RyKTsKLSAgICAgICAgaW5kZXggKz0gc3RyLmxlbmd0aCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBpbmRleCsrOwotICAgICAgaW5kZXggPSBkb2N1bWVudC5pbmRleE9mKFNUQVJUX1RBRyxpbmRleCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgYnl0ZVtdIGhhcnZlc3RIZWFkVGFncyhieXRlW10gYikKLSAgewotICAgIFN0cmluZyBzOwotICAgIHRyeQotICAgIHsKLSAgICAgIHMgPSBuZXcgU3RyaW5nKGIsIFVURjgpOwotICAgIH0KLSAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpCi0gICAgewotICAgICAgcyA9IG5ldyBTdHJpbmcoYik7Ci0gICAgfQotICAgIFN0cmluZyBoZWFkID0gcy50b0xvd2VyQ2FzZSgpOwotICAgIGludCBoZWFkU3RhcnRJbmRleCA9IGhlYWQuaW5kZXhPZihIRUFEX1NUQVJUX1RBRyk7Ci0gICAgaW50IGhlYWRFbmRJbmRleCA9IGhlYWQuaW5kZXhPZihIRUFEX0VORF9UQUcpOwotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBzYi5hcHBlbmQoUk9PVF9TVEFSVF9UQUcpOwotICAgIGlmIChoZWFkU3RhcnRJbmRleCAhPSAtMSAmJiBoZWFkRW5kSW5kZXggIT0gLTEpCi0gICAgewotICAgICAgaGVhZCA9IHMuc3Vic3RyaW5nKGhlYWRTdGFydEluZGV4LCBoZWFkRW5kSW5kZXgrSEVBRF9FTkRfVEFHLmxlbmd0aCgpKTsKLSAgICAgIGhhcnZlc3RUYWdzKHNiLGhlYWQsTUVUQSk7Ci0gICAgICBoYXJ2ZXN0VGFncyhzYixoZWFkLExJTkspOwotICAgIH0KLSAgICBzYi5hcHBlbmQoUk9PVF9FTkRfVEFHKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL3dzaWwvSWxsZWdhbEFyZ3VtZW50c0V4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL3dzaWwvSWxsZWdhbEFyZ3VtZW50c0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTNjZjBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL0lsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsOwotCi1wdWJsaWMgY2xhc3MgSWxsZWdhbEFyZ3VtZW50c0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjUzMzk4MTE3NjI4NTU2MTIzNEw7Ci0KLSAgcHVibGljIElsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24oU3RyaW5nIGFyZykKLSAgewotICAgIHN1cGVyKGFyZyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL1VERElVUklIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL1VERElVUklIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViMjFmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9VRERJVVJJSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFVERElVUklIZWxwZXIKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZU0VSVklDRV9VUklfVEVNUExBVEUgPSAidWRkaXNlcnZpY2U6cXVlcnk6ezB9OnF1ZXJ5OnsxfSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFS0VZX1VSSV9URU1QTEFURSA9ICJ1ZGRpc2VydmljZTpzZXJ2aWNlS2V5OnswfTpzZXJ2aWNlS2V5OnsxfSI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRRdWVyeVNlcnZpY2VVUkkoU3RyaW5nIHF1ZXJ5LFN0cmluZyBpbnF1aXJ5VVJMKQotICB7Ci0gICAgU3RyaW5nW10gdXJpUGFyYW1zID0ge3F1ZXJ5LGlucXVpcnlVUkx9OwotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChRVUVSWVNFUlZJQ0VfVVJJX1RFTVBMQVRFLHVyaVBhcmFtcyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFNlcnZpY2VLZXlVUkkoU3RyaW5nIHNlcnZpY2VLZXksU3RyaW5nIGlucXVpcnlVUkwpCi0gIHsKLSAgICBTdHJpbmdbXSB1cmlQYXJhbXMgPSB7c2VydmljZUtleSxpbnF1aXJ5VVJMfTsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoU0VSVklDRUtFWV9VUklfVEVNUExBVEUsdXJpUGFyYW1zKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gcGFyc2VVUkkoU3RyaW5nIHBhdHRlcm4sU3RyaW5nIHVyaSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIE1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChwYXR0ZXJuKTsKLSAgICAgIE9iamVjdFtdIHBhcnNlZFJlc3VsdHMgPSBtZi5wYXJzZSh1cmkpOwotICAgICAgaWYgKHBhcnNlZFJlc3VsdHMgIT0gbnVsbCAmJiBwYXJzZWRSZXN1bHRzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHJlc3VsdHMgPSBuZXcgU3RyaW5nW3BhcnNlZFJlc3VsdHMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8cGFyc2VkUmVzdWx0cy5sZW5ndGg7aSsrKQotICAgICAgICAgIHJlc3VsdHNbaV0gPSAoU3RyaW5nKXBhcnNlZFJlc3VsdHNbaV07Ci0gICAgICAgIHJldHVybiByZXN1bHRzOwotICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gcGFyc2VTZXJ2aWNlS2V5VVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gcGFyc2VVUkkoU0VSVklDRUtFWV9VUklfVEVNUExBVEUsdXJpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBwYXJzZVF1ZXJ5U2VydmljZVVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgcmV0dXJuIHBhcnNlVVJJKFFVRVJZU0VSVklDRV9VUklfVEVNUExBVEUsdXJpKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL1dXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjNhMzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL1dXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDkxODIxMTAyMTYyMDMxNjA0OUw7Ci0KLSAgcHJpdmF0ZSBJT0V4Y2VwdGlvbiBpb2VfOwotICBwcml2YXRlIFN0cmluZyB3d3dBdXRoTXNnXzsKLSAgcHJpdmF0ZSBTdHJpbmcgdXJsXzsKLQotICBwdWJsaWMgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24oSU9FeGNlcHRpb24gaW9lLCBTdHJpbmcgd3d3QXV0aE1zZywgU3RyaW5nIHVybCkKLSAgewotICAgIHN1cGVyKGlvZS5nZXRNZXNzYWdlKCkpOwotICAgIGlvZV8gPSBpb2U7Ci0gICAgd3d3QXV0aE1zZ18gPSB3d3dBdXRoTXNnOwotICAgIHVybF8gPSB1cmw7Ci0gIH0KLQotICBwdWJsaWMgSU9FeGNlcHRpb24gZ2V0SU9FeGNlcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIGlvZV87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdXV0F1dGhlbnRpY2F0aW9uTXNnKCkKLSAgewotICAgIHJldHVybiB3d3dBdXRoTXNnXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkKLSAgewotICAgIHJldHVybiB1cmxfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9XV1dBdXRoZW50aWNhdGlvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL1dXV0F1dGhlbnRpY2F0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmRkYzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL1dXV0F1dGhlbnRpY2F0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgV1dXQXV0aGVudGljYXRpb25IYW5kbGVyCi17Ci0gIHB1YmxpYyB2b2lkIGhhbmRsZVdXV0F1dGhlbnRpY2F0aW9uKFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHd3d2FlKTsKLSAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9XZWJTZXJ2aWNlRW50aXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9XZWJTZXJ2aWNlRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NmJkMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL3dzaWwvV2ViU2VydmljZUVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VFbnRpdHkKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VTktOT1dOID0gLTE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSFRNTCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfV1NJTCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfV1NETCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVURESV9TRVJWSUNFID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ESVNDTyA9IDQ7Ci0KLSAgcHJpdmF0ZSBPYmplY3QgcGFyZW50XzsKLSAgcHJpdmF0ZSBMaXN0IGNoaWxkcmVuXzsKLSAgcHJpdmF0ZSBpbnQgdHlwZV87Ci0gIHByaXZhdGUgU3RyaW5nIHVyaV87Ci0gIHByaXZhdGUgYnl0ZVtdIGJ5dGVzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cFVzZXJuYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cFBhc3N3b3JkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZG9jdW1lbnRhdGlvbl87Ci0gIHByaXZhdGUgT2JqZWN0IG1vZGVsXzsKLQotICBwdWJsaWMgV2ViU2VydmljZUVudGl0eSgpCi0gIHsKLSAgICBwYXJlbnRfID0gbnVsbDsKLSAgICBjaGlsZHJlbl8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdHlwZV8gPSBUWVBFX1VOS05PV047Ci0gICAgdXJpXyA9IG51bGw7Ci0gICAgYnl0ZXNfID0gbnVsbDsKLSAgICBodHRwVXNlcm5hbWVfID0gbnVsbDsKLSAgICBodHRwUGFzc3dvcmRfID0gbnVsbDsKLSAgICBkb2N1bWVudGF0aW9uXyA9IG51bGw7Ci0gICAgbW9kZWxfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkKLSAgewotICAgIHJldHVybiBwYXJlbnRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpCi0gIHsKLSAgICBwYXJlbnRfID0gcGFyZW50OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgcmV0dXJuIGNoaWxkcmVuXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZENoaWxkKE9iamVjdCBjaGlsZCkKLSAgewotICAgIGNoaWxkcmVuXy5hZGQoY2hpbGQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoT2JqZWN0IGNoaWxkKQotICB7Ci0gICAgY2hpbGRyZW5fLnJlbW92ZShjaGlsZCk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkKLSAgewotICAgIHR5cGVfID0gdHlwZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLSAgewotICAgIHJldHVybiB1cmlfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICB1cmlfID0gdXJpOwotICB9Ci0KLSAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpCi0gIHsKLSAgICByZXR1cm4gYnl0ZXNfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Qnl0ZXMoYnl0ZVtdIGJ5dGVzKQotICB7Ci0gICAgYnl0ZXNfID0gYnl0ZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEhUVFBVc2VybmFtZSgpCi0gIHsKLSAgICByZXR1cm4gaHR0cFVzZXJuYW1lXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhUVFBVc2VybmFtZShTdHJpbmcgaHR0cFVzZXJuYW1lKQotICB7Ci0gICAgaHR0cFVzZXJuYW1lXyA9IGh0dHBVc2VybmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SFRUUFBhc3N3b3JkKCkKLSAgewotICAgIHJldHVybiBodHRwUGFzc3dvcmRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SFRUUFBhc3N3b3JkKFN0cmluZyBodHRwUGFzc3dvcmQpCi0gIHsKLSAgICBodHRwUGFzc3dvcmRfID0gaHR0cFBhc3N3b3JkOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50YXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50YXRpb25fOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudGF0aW9uKFN0cmluZyBkb2N1bWVudGF0aW9uKQotICB7Ci0gICAgZG9jdW1lbnRhdGlvbl8gPSBkb2N1bWVudGF0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbF87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKE9iamVjdCBtb2RlbCkKLSAgewotICAgIG1vZGVsXyA9IG1vZGVsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNFbnRpdHlSZXNvbHZlZCgpCi0gIHsKLSAgICByZXR1cm4gKGJ5dGVzXyAhPSBudWxsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL1dlYlNlcnZpY2VzUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9wYXJzZXIvd3NpbC9XZWJTZXJ2aWNlc1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDBmNDQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL1dlYlNlcnZpY2VzUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkFic3RyYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuSW5zcGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24uRXh0ZW5zaW9uRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLnVkZGkuU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS5VRERJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24ud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY28uRElTQ09Db250cmFjdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLmRpc2NvLkRJU0NPUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIuZGlzY28uRElTQ09SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBsdWdpbjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBzdW4ubWlzYy5CQVNFNjRFbmNvZGVyOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNQYXJzZXIKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfTk9ORSA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1dTSUwgPSAxPDwwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJTRV9XU0RMID0gMTw8MTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfTElOS1MgPSAxPDwyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJTRV9ESVNDTyA9IDE8PDM7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgdXJpXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgdXJpVG9FbnRpdHlUYWJsZV87Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFBhc3N3b3JkXzsKLQotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgdGhpcyhudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlcihTdHJpbmcgdXJpKQotICB7Ci0gICAgdXJpXyA9IHVyaTsKLSAgICB1cmlUb0VudGl0eVRhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBodHRwQmFzaWNBdXRoVXNlcm5hbWVfID0gbnVsbDsKLSAgICBodHRwQmFzaWNBdXRoUGFzc3dvcmRfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLSAgewotICAgIHJldHVybiB1cmlfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICB1cmlfID0gdXJpOwotICB9Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VFbnRpdHkgZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgICByZXR1cm4gKFdlYlNlcnZpY2VFbnRpdHkpdXJpVG9FbnRpdHlUYWJsZV8uZ2V0KHVyaSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgV1NJTERvY3VtZW50IGdldFdTSUxEb2N1bWVudChTdHJpbmcgd3NpbFVSSSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBnZXRXU0lMRG9jdW1lbnRWZXJib3NlKHdzaWxVUkkpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBXU0lMRG9jdW1lbnQgZ2V0V1NJTERvY3VtZW50VmVyYm9zZShTdHJpbmcgd3NpbFVSSSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLCBXU0lMRXhjZXB0aW9uCi0gIHsKLSAgICBXZWJTZXJ2aWNlRW50aXR5IHdzRW50aXR5ID0gZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdzaWxVUkkpOwotICAgIGlmICh3c0VudGl0eSA9PSBudWxsKQotICAgIHsKLSAgICAgIHdzRW50aXR5ID0gbmV3IFdlYlNlcnZpY2VFbnRpdHkoKTsKLSAgICAgIHdzRW50aXR5LnNldFVSSSh3c2lsVVJJKTsKLSAgICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dCh3c2lsVVJJLCB3c0VudGl0eSk7Ci0gICAgfQotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jdW1lbnQgPSAoV1NJTERvY3VtZW50KXdzRW50aXR5LmdldE1vZGVsKCk7Ci0gICAgaWYgKHdzaWxEb2N1bWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIGJ5dGVbXSBiID0gZ2V0SW5wdXRTdHJlYW1Bc0J5dGVBcnJheSh3c2lsVVJJKTsKLSAgICAgIHdzRW50aXR5LnNldEJ5dGVzKGIpOwotICAgICAgc2V0SFRUUFNldHRpbmdzKHdzRW50aXR5KTsKLSAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYikpOwotICAgICAgd3NpbERvY3VtZW50ID0gV1NJTERvY3VtZW50Lm5ld0luc3RhbmNlKCk7Ci0gICAgICB3c2lsRG9jdW1lbnQucmVhZChpc3IpOwotICAgICAgd3NFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NJTCk7Ci0gICAgICB3c0VudGl0eS5zZXRNb2RlbCh3c2lsRG9jdW1lbnQpOwotICAgIH0KLSAgICByZXR1cm4gd3NpbERvY3VtZW50OwotICB9Ci0KLSAgcHVibGljIERlZmluaXRpb24gZ2V0V1NETERlZmluaXRpb24oU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0V1NETERlZmluaXRpb25WZXJib3NlKHdzZGxVUkkpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldFdTRExEZWZpbml0aW9uVmVyYm9zZShTdHJpbmcgd3NkbFVSSSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLCBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBXZWJTZXJ2aWNlRW50aXR5IHdzRW50aXR5ID0gZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdzZGxVUkkpOwotICAgIGlmICh3c0VudGl0eSA9PSBudWxsKQotICAgIHsKLSAgICAgIHdzRW50aXR5ID0gbmV3IFdlYlNlcnZpY2VFbnRpdHkoKTsKLSAgICAgIHdzRW50aXR5LnNldFVSSSh3c2RsVVJJKTsKLSAgICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dCh3c2RsVVJJLCB3c0VudGl0eSk7Ci0gICAgfQotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKXdzRW50aXR5LmdldE1vZGVsKCk7Ci0gICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBieXRlW10gYiA9IGdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkod3NkbFVSSSk7Ci0gICAgICB3c0VudGl0eS5zZXRCeXRlcyhiKTsKLSAgICAgIHNldEhUVFBTZXR0aW5ncyh3c0VudGl0eSk7Ci0gICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpOwotICAgICAgV1NETEZhY3RvcnkgZmFjdG9yeSA9IFdTRExQbHVnaW4uSU5TVEFOQ0UuY3JlYXRlV1NETDRKRmFjdG9yeSgpOwotICAgICAgV1NETFJlYWRlciB3c2RsUmVhZGVyID0gZmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICBkZWZpbml0aW9uID0gd3NkbFJlYWRlci5yZWFkV1NETCh3c2RsVVJJLCBuZXcgSW5wdXRTb3VyY2UoYmFpcykpOwotICAgICAgd3NFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NETCk7Ci0gICAgICB3c0VudGl0eS5zZXRNb2RlbChkZWZpbml0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwYXJzZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBwYXJzZVVSTChQQVJTRV9XU0lMIHwgUEFSU0VfV1NETCB8IFBBUlNFX0xJTktTIHwgUEFSU0VfRElTQ08pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGFyc2UoaW50IHBhcnNlT3B0aW9uKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgcGFyc2VVUkwocGFyc2VPcHRpb24pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBhcnNlVVJMKGludCBwYXJzZU9wdGlvbikgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24KLSAgewotICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NFbnRpdHkgPSBuZXcgV2ViU2VydmljZUVudGl0eSgpOwotICAgIHdzRW50aXR5LnNldFVSSSh1cmlfKTsKLSAgICBieXRlW10gYiA9IGdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkodXJpXyk7Ci0gICAgd3NFbnRpdHkuc2V0Qnl0ZXMoYik7Ci0gICAgc2V0SFRUUFNldHRpbmdzKHdzRW50aXR5KTsKLSAgICB1cmlUb0VudGl0eVRhYmxlXy5wdXQodXJpXywgd3NFbnRpdHkpOwotICAgIC8vIHBhcnNlIHVyaV8gYXMgYSBIVE1MIGRvY3VtZW50Ci0gICAgSFRNTEhlYWRIYW5kbGVyIGhlYWRIYW5kbGVyID0gbmV3IEhUTUxIZWFkSGFuZGxlcih1cmlfKTsKLSAgICBieXRlW10gaGVhZCA9IGhlYWRIYW5kbGVyLmhhcnZlc3RIZWFkVGFncyhiKTsKLSAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShmYWxzZSk7Ci0gICAgZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICBTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBwYXJzZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGhlYWQpLCBoZWFkSGFuZGxlcik7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgfQotICAgIFN0cmluZ1tdIHdzaWxVUklzID0gaGVhZEhhbmRsZXIuZ2V0V3NpbHMoKTsKLSAgICBTdHJpbmdbXSBkaXNjb1VSSXMgPSBoZWFkSGFuZGxlci5nZXREaXNjb3MoKTsKLSAgICAvLyB0cnVlIGlmIHVyaV8gaXMgYSBIVE1MIGRvY3VtZW50Ci0gICAgaWYgKHdzaWxVUklzLmxlbmd0aCA+IDAgfHwgZGlzY29VUklzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgd3NFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfSFRNTCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzaWxVUklzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgYWJzb2x1dGVVUkkgPSBjb252ZXJ0VG9BYnNvbHV0ZVVSSSh1cmlfLCB3c2lsVVJJc1tpXSk7Ci0gICAgICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NpbEVudGl0eSA9IG5ldyBXZWJTZXJ2aWNlRW50aXR5KCk7Ci0gICAgICAgIHdzaWxFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NJTCk7Ci0gICAgICAgIHdzaWxFbnRpdHkuc2V0VVJJKGFic29sdXRlVVJJKTsKLSAgICAgICAgYXNzb2NpYXRlKHdzRW50aXR5LCB3c2lsRW50aXR5KTsKLSAgICAgICAgdXJpVG9FbnRpdHlUYWJsZV8ucHV0KGFic29sdXRlVVJJLCB3c2lsRW50aXR5KTsKLSAgICAgICAgaWYgKChwYXJzZU9wdGlvbiB8IFBBUlNFX1dTSUwpID09IHBhcnNlT3B0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcGFyc2VXU0lMKGFic29sdXRlVVJJLCBwYXJzZU9wdGlvbik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBpPTA7aTxkaXNjb1VSSXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgV2ViU2VydmljZUVudGl0eSBkaXNjb0VudGl0eSA9IG5ldyBXZWJTZXJ2aWNlRW50aXR5KCk7Ci0gICAgICAgIGRpc2NvRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX0RJU0NPKTsKLSAgICAgICAgZGlzY29FbnRpdHkuc2V0VVJJKGRpc2NvVVJJc1tpXSk7Ci0gICAgICAgIGFzc29jaWF0ZSh3c0VudGl0eSxkaXNjb0VudGl0eSk7Ci0gICAgICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dChkaXNjb1VSSXNbaV0sZGlzY29FbnRpdHkpOwotICAgICAgICBpZiAoKHBhcnNlT3B0aW9uIHwgUEFSU0VfRElTQ08pID09IHBhcnNlT3B0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcGFyc2VESVNDTyhkaXNjb1VSSXNbaV0scGFyc2VPcHRpb24pOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBmYWxzZSBpZiB1cmlfIGlzIG5vdCBhIEhUTUwgZG9jdW1lbnQKLSAgICAvLyB0aGVuIHBhcnNlIHVyaV8gYXMgYSBXU0lMIGRvY3VtZW50Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBwYXJzZVdTSUwodXJpXywgcGFyc2VPcHRpb24pOwotICAgICAgICAvLyBubyBleGNlcHRpb24gdGhyb3duIGlmIHVyaV8gaXMgYSBXU0lMIGRvY3VtZW50Ci0gICAgICAgIHdzRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX1dTSUwpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgICAvLyBleGNlcHRpb24gdGhyb3duIGlmIHVyaV8gaXMgbm90IGEgV1NJTCBkb2N1bWVudAotICAgICAgICAvLyB0aGVuIHBhcnNlIHVyaV8gYXMgYSBESVNDTyBkb2N1bWVudC4KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBwYXJzZURJU0NPKHVyaV8sIHBhcnNlT3B0aW9uKTsKLSAgICAgICAgICAvLyBubyBleGNlcHRpb24gdGhyb3duIGlmIHVyaV8gaXMgYSBESVNDTyBkb2N1bWVudAotICAgICAgICAgIHdzRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX0RJU0NPKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQyKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gZXhjZXB0aW9uIHRocm93biBpZiB1cmlfIGlzIG5vdCBhIERJU0NPIGRvY3VtZW50Ci0gICAgICAgICAgLy8gdGhlbiBwYXJzZSB1cmlfIGFzIGEgV1NETCBkb2N1bWVudAotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcnNlV1NETCh1cmlfKTsKLSAgICAgICAgICAgIC8vIG5vIGV4Y2VwdGlvbiB0aHJvd24gaWYgdXJpXyBpcyBhIFdTREwgZG9jdW1lbnQKLSAgICAgICAgICAgIHdzRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB0aHJvd24gaWYgdXJpXyBpcyBub3QgYSBXU0RMIGRvY3VtZW50Ci0gICAgICAgICAgICAvLyB0aGVuIGRvIG5vdGhpbmcKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcGFyc2VXU0lMKFN0cmluZyB3c2lsVVJJLCBpbnQgcGFyc2VPcHRpb24pIHRocm93cyBXU0lMRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXU0RMRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgV2ViU2VydmljZUVudGl0eSB3c2lsRW50aXR5ID0gZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdzaWxVUkkpOwotICAgIFdTSUxEb2N1bWVudCB3c2lsRG9jID0gKFdTSUxEb2N1bWVudCl3c2lsRW50aXR5LmdldE1vZGVsKCk7Ci0gICAgaWYgKHdzaWxEb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3BzIGZyb20gb2NjdXJyaW5nIHdoZW4gYSBXU0lMIGN5Y2xlcyBvY2N1ci4KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgd3NpbERvYyA9IGdldFdTSUxEb2N1bWVudFZlcmJvc2Uod3NpbFVSSSk7Ci0gICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvYy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgU2VydmljZVtdIHNlcnZpY2VzID0gaW5zcGVjdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgRGVzY3JpcHRpb25bXSBkZXNjcyA9IHNlcnZpY2VzW2ldLmdldERlc2NyaXB0aW9ucygpOwotICAgICAgLy8gU2V0IHRoZSBkb2N1bWVudGF0aW9uIHRvIHRoZSA8c2VydmljZT4gZWxlbWVudCdzIGZpcnN0IGFic3RyYWN0LgotICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb24gPSBudWxsOwotICAgICAgQWJzdHJhY3RbXSBhYnN0cmFjdHMgPSBzZXJ2aWNlc1tpXS5nZXRBYnN0cmFjdHMoKTsKLSAgICAgIGlmIChhYnN0cmFjdHMgIT0gbnVsbCAmJiBhYnN0cmFjdHMubGVuZ3RoID4gMCkKLSAgICAgICAgZG9jdW1lbnRhdGlvbiA9IGFic3RyYWN0c1swXS5nZXRUZXh0KCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2NzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgCVN0cmluZyByZWZlcmVuY2VkTlMgPSBkZXNjc1tqXS5nZXRSZWZlcmVuY2VkTmFtZXNwYWNlKCk7Ci0gICAgICAJLy8gSWYgYSA8ZGVzY3JpcHRpb24+IGVsZW1lbnQgY29udGFpbnMgYW4gYWJzdHJhY3QsIHVzZSBpdCB0byBvdmVycmlkZSB0aGUgc2VydmljZSBkb2N1bWVudGF0aW9uLiAgICAgIAkKLSAgICAgIAlhYnN0cmFjdHMgPSBkZXNjc1tqXS5nZXRBYnN0cmFjdHMoKTsKLSAgICAgIAlpZiAoYWJzdHJhY3RzICE9IG51bGwgJiYgYWJzdHJhY3RzLmxlbmd0aCA+IDApCi0gICAgICAJICBkb2N1bWVudGF0aW9uID0gYWJzdHJhY3RzWzBdLmdldFRleHQoKTsKLSAgICAgICAgaWYgKFdTRExDb25zdGFudHMuTlNfVVJJX1dTREwuZXF1YWxzKHJlZmVyZW5jZWROUykpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBkZXNjc1tqXS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsICYmIGxvY2F0aW9uLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYWJzb2x1dGVVUkkgPSBjb252ZXJ0VG9BYnNvbHV0ZVVSSSh3c2lsVVJJLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICBXZWJTZXJ2aWNlRW50aXR5IHdzZGxFbnRpdHkgPSBuZXcgV2ViU2VydmljZUVudGl0eSgpOwotICAgICAgICAgICAgd3NkbEVudGl0eS5zZXRUeXBlKFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0RMKTsKLSAgICAgICAgICAgIHdzZGxFbnRpdHkuc2V0VVJJKGFic29sdXRlVVJJKTsKLSAgICAgICAgICAgIHdzZGxFbnRpdHkuc2V0RG9jdW1lbnRhdGlvbihkb2N1bWVudGF0aW9uKTsKLSAgICAgICAgICAgIGFzc29jaWF0ZSh3c2lsRW50aXR5LCB3c2RsRW50aXR5KTsKLSAgICAgICAgICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dChhYnNvbHV0ZVVSSSwgd3NkbEVudGl0eSk7Ci0gICAgICAgICAgICBpZiAoKHBhcnNlT3B0aW9uIHwgUEFSU0VfV1NETCkgPT0gcGFyc2VPcHRpb24pCi0gICAgICAgICAgICAgIHBhcnNlV1NETChhYnNvbHV0ZVVSSSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFVERElDb25zdGFudHMuTlNfVVJJX1VERElfVjIuZXF1YWxzKHJlZmVyZW5jZWROUykpCi0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpb25FbGVtZW50IGVlID0gZGVzY3Nbal0uZ2V0RXh0ZW5zaW9uRWxlbWVudCgpOwotICAgICAgICAgIGlmIChlZSBpbnN0YW5jZW9mIFNlcnZpY2VEZXNjcmlwdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSAoU2VydmljZURlc2NyaXB0aW9uKWVlOwotICAgICAgICAgICAgU3RyaW5nIGlucXVpcnlVUkwgPSBzZC5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VLZXkgPSBzZC5nZXRTZXJ2aWNlS2V5KCkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgV2ViU2VydmljZUVudGl0eSB1ZGRpU2VydmljZUVudGl0eSA9IG5ldyBXZWJTZXJ2aWNlRW50aXR5KCk7Ci0gICAgICAgICAgICB1ZGRpU2VydmljZUVudGl0eS5zZXRUeXBlKFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9VRERJX1NFUlZJQ0UpOwotICAgICAgICAgICAgU3RyaW5nIHVkZGlTZXJ2aWNlS2V5VVJJID0gVURESVVSSUhlbHBlci5nZXRTZXJ2aWNlS2V5VVJJKHNlcnZpY2VLZXksaW5xdWlyeVVSTCk7Ci0gICAgICAgICAgICB1ZGRpU2VydmljZUVudGl0eS5zZXRVUkkodWRkaVNlcnZpY2VLZXlVUkkpOwotICAgICAgICAgICAgdWRkaVNlcnZpY2VFbnRpdHkuc2V0RG9jdW1lbnRhdGlvbihkb2N1bWVudGF0aW9uKTsKLSAgICAgICAgICAgIGFzc29jaWF0ZSh3c2lsRW50aXR5LHVkZGlTZXJ2aWNlRW50aXR5KTsKLSAgICAgICAgICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dCh1ZGRpU2VydmljZUtleVVSSSx1ZGRpU2VydmljZUVudGl0eSk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBwYXJzZSBXU0RMIGlmIG5lY2Vzc2FyeS4uLgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBMaW5rW10gbGlua3MgPSBpbnNwZWN0aW9uLmdldExpbmtzKCk7ICAgIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKFdTSUxDb25zdGFudHMuTlNfVVJJX1dTSUwuZXF1YWxzKGxpbmtzW2ldLmdldFJlZmVyZW5jZWROYW1lc3BhY2UoKSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBkb2N1bWVudGF0aW9uID0gbnVsbDsKLSAgICAgICAgQWJzdHJhY3RbXSBhYnN0cmFjdHMgPSBsaW5rc1tpXS5nZXRBYnN0cmFjdHMoKTsKLSAgICAgICAgaWYgKGFic3RyYWN0cyAhPSBudWxsICYmIGFic3RyYWN0cy5sZW5ndGggPiAwKQotICAgICAgICAgIGRvY3VtZW50YXRpb24gPSBhYnN0cmFjdHNbMF0uZ2V0VGV4dCgpOwotICAgICAgICBTdHJpbmcgbGlua0xvY2F0aW9uID0gbGlua3NbaV0uZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIGFic29sdXRlVVJJID0gY29udmVydFRvQWJzb2x1dGVVUkkod3NpbFVSSSwgbGlua0xvY2F0aW9uKTsKLSAgICAgICAgLy8gUHJldmVudCBjeWNsZXMuCi0gICAgICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NpbExpbmtFbnRpdHkgPSBnZXRXZWJTZXJ2aWNlRW50aXR5QnlVUkkoYWJzb2x1dGVVUkkpOwotICAgICAgICBpZiAod3NpbExpbmtFbnRpdHkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHdzaWxMaW5rRW50aXR5ID0gbmV3IFdlYlNlcnZpY2VFbnRpdHkoKTsKLSAgICAgICAgICB3c2lsTGlua0VudGl0eS5zZXRUeXBlKFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0lMKTsKLSAgICAgICAgICB3c2lsTGlua0VudGl0eS5zZXRVUkkoYWJzb2x1dGVVUkkpOwotICAgICAgICAgIHdzaWxMaW5rRW50aXR5LnNldERvY3VtZW50YXRpb24oZG9jdW1lbnRhdGlvbik7Ci0gICAgICAgICAgdXJpVG9FbnRpdHlUYWJsZV8ucHV0KGFic29sdXRlVVJJLCB3c2lsTGlua0VudGl0eSk7Ci0gICAgICAgICAgaWYgKChwYXJzZU9wdGlvbiB8IFBBUlNFX0xJTktTKSA9PSBwYXJzZU9wdGlvbikKLSAgICAgICAgICAgIHBhcnNlV1NJTChhYnNvbHV0ZVVSSSwgcGFyc2VPcHRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGFzc29jaWF0ZSh3c2lsRW50aXR5LHdzaWxMaW5rRW50aXR5KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBwYXJzZURJU0NPKFN0cmluZyBkaXNjb1VSSSwgaW50IHBhcnNlT3B0aW9uKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiwgRXhjZXB0aW9uCi0gIHsKLSAgICBXZWJTZXJ2aWNlRW50aXR5IGRpc2NvRW50aXR5ID0gZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKGRpc2NvVVJJKTsKLSAgICBieXRlW10gYiA9IGdldElucHV0U3RyZWFtQXNCeXRlQXJyYXkoZGlzY29VUkkpOwotICAgIGRpc2NvRW50aXR5LnNldEJ5dGVzKGIpOwotICAgIHNldEhUVFBTZXR0aW5ncyhkaXNjb0VudGl0eSk7Ci0gICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiKTsKLSAgICBESVNDT1BhcnNlciBwYXJzZXIgPSBuZXcgRElTQ09QYXJzZXIoKTsKLSAgICBESVNDT1JlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBwYXJzZXIucGFyc2UoZGlzY29VUkksbmV3IElucHV0U291cmNlKGJhaXMpKTsKLSAgICBpZiAocmVmZXJlbmNlcyAhPSBudWxsICYmIHJlZmVyZW5jZXMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPTA7aTxyZWZlcmVuY2VzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChyZWZlcmVuY2VzW2ldIGluc3RhbmNlb2YgRElTQ09Db250cmFjdFJlZmVyZW5jZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGNvbnRyYWN0UmVmCi0gICAgICAgICAgRElTQ09Db250cmFjdFJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRElTQ09Db250cmFjdFJlZmVyZW5jZSlyZWZlcmVuY2VzW2ldOwotICAgICAgICAgIFN0cmluZyByZWYgPSByZWZlcmVuY2UuZ2V0UmVmKCk7Ci0gICAgICAgICAgU3RyaW5nIGRvY1JlZiA9IHJlZmVyZW5jZS5nZXREb2NSZWYoKTsKLSAgICAgICAgICBXZWJTZXJ2aWNlRW50aXR5IHdzZGxFbnRpdHkgPSBuZXcgV2ViU2VydmljZUVudGl0eSgpOwotICAgICAgICAgIHdzZGxFbnRpdHkuc2V0VHlwZShXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NETCk7Ci0gICAgICAgICAgd3NkbEVudGl0eS5zZXRVUkkocmVmKTsKLSAgICAgICAgICB3c2RsRW50aXR5LnNldERvY3VtZW50YXRpb24oZG9jUmVmKTsKLSAgICAgICAgICBhc3NvY2lhdGUoZGlzY29FbnRpdHksd3NkbEVudGl0eSk7Ci0gICAgICAgICAgdXJpVG9FbnRpdHlUYWJsZV8ucHV0KHJlZix3c2RsRW50aXR5KTsKLSAgICAgICAgICBpZiAoKHBhcnNlT3B0aW9uIHwgUEFSU0VfV1NETCkgPT0gcGFyc2VPcHRpb24pCi0gICAgICAgICAgICBwYXJzZVdTREwocmVmKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBkaXNjb3ZlcnlSZWYKLSAgICAgICAgICBTdHJpbmcgcmVmID0gcmVmZXJlbmNlc1tpXS5nZXRSZWYoKTsKLSAgICAgICAgICAvLyBQcmV2ZW50IGN5Y2xlcy4KLSAgICAgICAgICBXZWJTZXJ2aWNlRW50aXR5IGRpc2NvTGlua0VudGl0eSA9IGdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSShyZWYpOwotICAgICAgICAgIGlmIChkaXNjb0xpbmtFbnRpdHkgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkaXNjb0xpbmtFbnRpdHkgPSBuZXcgV2ViU2VydmljZUVudGl0eSgpOwotICAgICAgICAgICAgZGlzY29MaW5rRW50aXR5LnNldFR5cGUoV2ViU2VydmljZUVudGl0eS5UWVBFX0RJU0NPKTsKLSAgICAgICAgICAgIGRpc2NvTGlua0VudGl0eS5zZXRVUkkocmVmKTsKLSAgICAgICAgICAgIHVyaVRvRW50aXR5VGFibGVfLnB1dChyZWYsZGlzY29MaW5rRW50aXR5KTsKLSAgICAgICAgICAgIGlmICgocGFyc2VPcHRpb24gfCBQQVJTRV9MSU5LUykgPT0gcGFyc2VPcHRpb24pCi0gICAgICAgICAgICAgIHBhcnNlRElTQ08ocmVmLHBhcnNlT3B0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYXNzb2NpYXRlKGRpc2NvRW50aXR5LGRpc2NvTGlua0VudGl0eSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIERlZmluaXRpb24gcGFyc2VXU0RMKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24KLSAgewotICAgIHJldHVybiBnZXRXU0RMRGVmaW5pdGlvblZlcmJvc2Uod3NkbFVSSSk7Ci0gIH0KLQotICBwcml2YXRlIGJ5dGVbXSBnZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KFN0cmluZyB1cmlTdHJpbmcpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgLy8gVHJ5IHRvIGdldCBhIGNhY2hlZCBjb3B5IG9mIHRoZSBieXRlW10KLSAgICBXZWJTZXJ2aWNlRW50aXR5IHdzRW50aXR5ID0gZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHVyaVN0cmluZyk7Ci0gICAgaWYgKHdzRW50aXR5ICE9IG51bGwpCi0gICAgewotICAgICAgYnl0ZVtdIGJ5dGVzID0gd3NFbnRpdHkuZ2V0Qnl0ZXMoKTsKLSAgICAgIGlmIChieXRlcyAhPSBudWxsKQotICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgfQotICAgIC8vIEdldCB0aGUgYnl0ZVtdIGJ5IG9wZW5pbmcgYSBzdHJlYW0gdG8gdGhlIFVSSQotICAgIFVSTCB1cmwgPSBjcmVhdGVVUkwodXJpU3RyaW5nKTsKLSAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAvLyBwcm94eSBzZXJ2ZXIgc2V0dGluZwotICAgIFN0cmluZyBwcm94eVVzZXJOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJodHRwLnByb3h5VXNlck5hbWUiKTsKLSAgICBTdHJpbmcgcHJveHlQYXNzd29yZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVBhc3N3b3JkIik7Ci0gICAgaWYgKHByb3h5VXNlck5hbWUgIT0gbnVsbCAmJiBwcm94eVBhc3N3b3JkICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHVzZXJOYW1lUGFzc3dvcmQgPSBuZXcgU3RyaW5nQnVmZmVyKHByb3h5VXNlck5hbWUpOwotICAgICAgdXNlck5hbWVQYXNzd29yZC5hcHBlbmQoJzonKS5hcHBlbmQocHJveHlQYXNzd29yZCk7Ci0gICAgICBCQVNFNjRFbmNvZGVyIGVuY29kZXIgPSBuZXcgQkFTRTY0RW5jb2RlcigpOwotICAgICAgU3RyaW5nIGVuY29kaW5nID0gZW5jb2Rlci5lbmNvZGUodXNlck5hbWVQYXNzd29yZC50b1N0cmluZygpLmdldEJ5dGVzKCkpOwotICAgICAgdXNlck5hbWVQYXNzd29yZC5zZXRMZW5ndGgoMCk7Ci0gICAgICB1c2VyTmFtZVBhc3N3b3JkLmFwcGVuZCgiQmFzaWMgIikuYXBwZW5kKGVuY29kaW5nKTsKLSAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJQcm94eS1hdXRob3JpemF0aW9uIiwgdXNlck5hbWVQYXNzd29yZC50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiBzZXR0aW5nCi0gICAgaWYgKGh0dHBCYXNpY0F1dGhVc2VybmFtZV8gIT0gbnVsbCAmJiBodHRwQmFzaWNBdXRoUGFzc3dvcmRfICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihodHRwQmFzaWNBdXRoVXNlcm5hbWVfKTsKLSAgICAgIHNiLmFwcGVuZCgnOicpLmFwcGVuZChodHRwQmFzaWNBdXRoUGFzc3dvcmRfKTsKLSAgICAgIEJBU0U2NEVuY29kZXIgZW5jb2RlciA9IG5ldyBCQVNFNjRFbmNvZGVyKCk7Ci0gICAgICBTdHJpbmcgZW5jb2RpbmcgPSBlbmNvZGVyLmVuY29kZShzYi50b1N0cmluZygpLmdldEJ5dGVzKCkpOwotICAgICAgc2Iuc2V0TGVuZ3RoKDApOwotICAgICAgc2IuYXBwZW5kKCJCYXNpYyAiKS5hcHBlbmQoZW5jb2RpbmcpOwotICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoIkF1dGhvcml6YXRpb24iLCBzYi50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlzID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgU3RyaW5nIHd3d0F1dGhNc2cgPSBjb25uLmdldEhlYWRlckZpZWxkKCJXV1ctQXV0aGVudGljYXRlIik7Ci0gICAgICBpZiAod3d3QXV0aE1zZyAhPSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24obmV3IElPRXhjZXB0aW9uKCksIHd3d0F1dGhNc2csIHVyaVN0cmluZyk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgU3RyaW5nIHd3d0F1dGhNc2cgPSBjb25uLmdldEhlYWRlckZpZWxkKCJXV1ctQXV0aGVudGljYXRlIik7Ci0gICAgICBpZiAod3d3QXV0aE1zZyAhPSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24oaW9lLCB3d3dBdXRoTXNnLCB1cmlTdHJpbmcpOwotICAgICAgZWxzZQotICAgICAgICB0aHJvdyBpb2U7Ci0gICAgfQotICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgaW50IGJ5dGVSZWFkID0gaXMucmVhZChiKTsKLSAgICB3aGlsZSAoYnl0ZVJlYWQgIT0gLTEpCi0gICAgewotICAgICAgYmFvcy53cml0ZShiLCAwLCBieXRlUmVhZCk7Ci0gICAgICBieXRlUmVhZCA9IGlzLnJlYWQoYik7Ci0gICAgfQotICAgIGlzLmNsb3NlKCk7Ci0gICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBVUkwgY3JlYXRlVVJMKFN0cmluZyB1cmwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXcgVVJMKHVybCk7Ci0gIH0KLQotICBwcml2YXRlIGJ5dGVbXSBnZXRCeXRlcyhXZWJTZXJ2aWNlRW50aXR5IHdzRW50aXR5KSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24KLSAgewotICAgIGJ5dGVbXSBiID0gd3NFbnRpdHkuZ2V0Qnl0ZXMoKTsKLSAgICBpZiAoYiA9PSBudWxsKQotICAgIHsKLSAgICAgIGIgPSBnZXRJbnB1dFN0cmVhbUFzQnl0ZUFycmF5KHdzRW50aXR5LmdldFVSSSgpKTsKLSAgICAgIHdzRW50aXR5LnNldEJ5dGVzKGIpOwotICAgICAgc2V0SFRUUFNldHRpbmdzKHdzRW50aXR5KTsKLSAgICB9Ci0gICAgcmV0dXJuIGI7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzb2NpYXRlKFdlYlNlcnZpY2VFbnRpdHkgcGFyZW50LCBXZWJTZXJ2aWNlRW50aXR5IGNoaWxkKQotICB7Ci0gICAgcGFyZW50LmFkZENoaWxkKGNoaWxkKTsKLSAgICBjaGlsZC5zZXRQYXJlbnQocGFyZW50KTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRUb0Fic29sdXRlVVJJKFN0cmluZyBiYXNlVVJJLFN0cmluZyByZWZVUkkpCi0gIHsKLSAgICBpZiAocmVmVVJJICE9IG51bGwgJiYgcmVmVVJJLmluZGV4T2YoIjoiKSA8IDApCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIGFic29sdXRlVVJJID0gbmV3IFN0cmluZ0J1ZmZlcihiYXNlVVJJLnN1YnN0cmluZygwLE1hdGgubWF4KGJhc2VVUkkubGFzdEluZGV4T2YoJ1xcJyksYmFzZVVSSS5sYXN0SW5kZXhPZignLycpKzEpKSk7Ci0gICAgICBhYnNvbHV0ZVVSSS5hcHBlbmQocmVmVVJJKTsKLSAgICAgIHJldHVybiBhYnNvbHV0ZVVSSS50b1N0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gcmVmVVJJOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldEhUVFBTZXR0aW5ncyhXZWJTZXJ2aWNlRW50aXR5IGVudGl0eSkKLSAgewotICAgIGlmIChodHRwQmFzaWNBdXRoVXNlcm5hbWVfICE9IG51bGwgJiYgaHR0cEJhc2ljQXV0aFBhc3N3b3JkXyAhPSBudWxsKQotICAgIHsKLSAgICAgIGVudGl0eS5zZXRIVFRQVXNlcm5hbWUoaHR0cEJhc2ljQXV0aFVzZXJuYW1lXyk7Ci0gICAgICBlbnRpdHkuc2V0SFRUUFBhc3N3b3JkKGh0dHBCYXNpY0F1dGhQYXNzd29yZF8pOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SFRUUEJhc2ljQXV0aFVzZXJuYW1lKCkKLSAgewotICAgIHJldHVybiBodHRwQmFzaWNBdXRoVXNlcm5hbWVfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SFRUUEJhc2ljQXV0aFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkKLSAgewotICAgIGh0dHBCYXNpY0F1dGhVc2VybmFtZV8gPSB1c2VybmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKCkKLSAgewotICAgIHJldHVybiBodHRwQmFzaWNBdXRoUGFzc3dvcmRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkKLSAgewotICAgIGh0dHBCYXNpY0F1dGhQYXNzd29yZF8gPSBwYXNzd29yZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL3dzaWwvd3NpbC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvcGFyc2VyL3dzaWwvd3NpbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTYwYzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3BhcnNlci93c2lsL3dzaWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGZvciBBZGRXU0RMVG9XU0lMQ29tbWFuZAotIwotTVNHX0VSUk9SX0lOVkFMSURfQVJHVU1FTlRTPUlXQUIwMDU1RSBJbnZhbGlkIGNvbW1hbmQgYXJndW1lbnRzLgotTVNHX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlRTPUlXQUIwMTA1RSBJbGxlZ2FsIGFyZ3VtZW50LgotTVNHX0VSUk9SX0lOVkFMSURfV1NETF9VUkk9SVdBQjAxODVFIEludmFsaWQgV1NETCBVUkkuCi1NU0dfRVJST1JfSU5WQUxJRF9XU0lMX1VSST1JV0FCMDIwNkUgSW52YWxpZCBXU0lMIFVSSS4KLU1TR19FUlJPUl9VTlJFU09MVkFCTEVfV1NETD1JV0FCMDQwNUUgV1NETCBpcyB1bnJlc29sdmFibGUuCi1NU0dfRVJST1JfVU5FWFBFQ1RFRF9FWENFUFRJT049SVdBQjA0NTFFIEFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGhhcyBvY2N1cmVkLgotTVNHX0VSUk9SX01BTEZPUk1FRF9XU0RMPUlXQUIwNDUyRSBXU0RMIGlzIG1hbGZvcm1lZCwgZXJyb3IgcGFyc2luZyBXU0RMLgotTVNHX0VSUk9SX1dSSVRFX1dTSUw9SVdBQjA0NTNFIEVycm9yIHdyaXRpbmcgV1NJTC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5N2QxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXdzdWkuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTQ4N2QyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmEzNDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS53c3VpLmphciA9IHNyYy8KLW91dHB1dC53c3VpLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgd3N1aS5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IHNyYy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTA4M2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIFVJCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotUExVR0lOX05FV19DQVRFR09SWV9OQU1FX1dTPVdlYiBTZXJ2aWNlcwotUFJFRkVSRU5DRV9DQVRFR09SWV9XU0k9V1MtSSBDb21wbGlhbmNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OTMyNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLnVpIgotICAgbmFtZT0iJVBMVUdJTl9OQU1FIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIlUExVR0lOX1BST1ZJREVSIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV1NVSVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0id3N1aS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53cyIvPgotICAgPC9yZXF1aXJlcz4KLQotCTxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCi0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfQ0FURUdPUllfTkFNRV9XUyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuV2ViU2VydmljZXNQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICAKLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9XU0kiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5XU0lDb21wbGlhbmNlUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5XU0lDb21wbGlhbmNlUHJlZmVyZW5jZVBhZ2UiPgotICAgICAgPC9wYWdlPgotCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotCi0gICAgICA8cGFnZQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfV1NJIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJvcGVydGllcy5XU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJvcGVydGllcy5XU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlIj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hdHVyZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgPC9wYWdlPgotICAgICAgCi0gICAgICA8cGFnZQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVQUkVGRVJFTkNFX0NBVEVHT1JZX1dTSSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByb3BlcnRpZXMuV1NJQ29tcGxpYW5jZVByb3BlcnR5UGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByb3BlcnRpZXMuV1NJQ29tcGxpYW5jZVByb3BlcnR5UGFnZSI+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBuYW1lPSJuYXR1cmUiCi0gICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgIDwvcGFnZT4KLQotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdWkvd3NydC9JT2JqZWN0U2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdWkvd3NydC9JT2JqZWN0U2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjNmE3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3VpL3dzcnQvSU9iamVjdFNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLnVpLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVNlbGVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJT2JqZWN0U2VsZWN0b3IgewotCQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWwpOwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpOwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdCgpOwotCXB1YmxpYyBTdGF0dXMgdmFsaWRhdGVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWwpOwotCXB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9wbHVnaW4vV1NVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9wbHVnaW4vV1NVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDcxYmJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvcGx1Z2luL1dTVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wbHVnaW47Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXMuUGVyc2lzdGVudFdTSUFQQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXMuUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIHBsdWdpbi4KLSogPHA+Ci0qIFRoaXMgcGx1Z2luIGNvbnRhaW5zIHRoZSBncmFwaGljIHVzZXIgaW50ZXJmYWNlIHRvIHRoZQotKiBXZWIgU2VydmljZXMgcnVudGltZSBmb3VuZCBpbiBvcmcuZWNsaXBzZS5qc3Qud3MuCi0qLwotcHVibGljIGNsYXNzIFdTVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0JLy8gQ29weXJpZ2h0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0KLQkJIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotIC8qKgotICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAqLwotIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC53cy51aSI7Ci0KLSAvKioKLSAqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAqLwotIHByaXZhdGUgc3RhdGljIFdTVUlQbHVnaW4gaW5zdGFuY2VfOwotCi0gcHJpdmF0ZSBQZXJzaXN0ZW50V1NJU1NCUENvbnRleHQgd3NpU1NCUENvbnRleHRfOwotIHByaXZhdGUgUGVyc2lzdGVudFdTSUFQQ29udGV4dCB3c2lBUENvbnRleHRfOwotIHByaXZhdGUgTG9nIGxvZ187Ci0gCi0gLyoqCi0gICogQ29uc3RydWN0cyBhIHJ1bnRpbWUgcGx1Z2luIG9iamVjdCBmb3IgdGhpcyBwbHVnaW4uCi0gICovCi0gcHVibGljIFdTVUlQbHVnaW4oKSB7Ci0Jc3VwZXIoKTsKLQlpbnN0YW5jZV8gPSB0aGlzOwotIH0KLQotIC8qKgotICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAqIChXU1VJUGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2Uud3N0LndzLnVpIik7Ci0gKiBAcmV0dXJuIFRoZSBXU1VJUGx1Z2luIHNpbmdsZXRvbi4KLSAqLwotIHN0YXRpYyBwdWJsaWMgV1NVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLSAgIHJldHVybiBpbnN0YW5jZV87Ci0gfQotCi0JLyoqCi0JICogR2V0IFdTSSBDb250ZXh0Ci0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFdTSVNTQlBDb250ZXh0IG9yIGdldFdTSUFQQ29udGV4dCBpbnN0ZWFkCi0JICogCi0JICovIAotIHB1YmxpYyBQZXJzaXN0ZW50V1NJQ29udGV4dCBnZXRXU0lDb250ZXh0KCkgCi0gCXsgLy8gZGVmYXVsdGluZyB0byBnZXQgV1NJIFNpbXBsZSBTT0FQIEJpbmRpbmcgUHJvZmlsZSBjb250ZXh0Ci0gCSAgcmV0dXJuIGdldFdTSVNTQlBDb250ZXh0KCk7Ci0gCX0KLSAKLSAvKioKLQkgKiBHZXQgV1NJIFNpbXBsZSBTT0FQIEJpbmRpbmcgUHJvZmlsZSBDb250ZXh0Ci0JICogCi0JICovIAotIHB1YmxpYyBQZXJzaXN0ZW50V1NJU1NCUENvbnRleHQgZ2V0V1NJU1NCUENvbnRleHQoKSAKLQl7Ci0JICBpZiAod3NpU1NCUENvbnRleHRfID09IG51bGwpCi0JICAJewotCSAgCQl3c2lTU0JQQ29udGV4dF8gPSBuZXcgUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0KCk7Ci0JICAJCXdzaVNTQlBDb250ZXh0Xy5sb2FkKCk7Ci0JICAJfQotCSAgcmV0dXJuIHdzaVNTQlBDb250ZXh0XzsKLQl9Ci0gCi0gLyoqCi0JICogR2V0IFdTSSBBdHRhY2htZW50IFByb2ZpbGUgQ29udGV4dAotCSAqIAotCSAqLyAKLSBwdWJsaWMgUGVyc2lzdGVudFdTSUFQQ29udGV4dCBnZXRXU0lBUENvbnRleHQoKSAKLQl7Ci0JICBpZiAod3NpQVBDb250ZXh0XyA9PSBudWxsKQotCSAgCXsKLQkgIAkJd3NpQVBDb250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50V1NJQVBDb250ZXh0KCk7Ci0JICAJCXdzaUFQQ29udGV4dF8ubG9hZCgpOwotCSAgCX0KLQkgIHJldHVybiB3c2lBUENvbnRleHRfOwotCX0KLQotIC8qKgotICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAqIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvciB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlLgotICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLSAqIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiCi0gKiB3aGVyZSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhIGxpbmUgb2YgdGhlCi0gKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0gKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIAotCXsKLQkgICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy51aS5wbHVnaW4iLCBpbnN0YW5jZV8gKTsKLQkgICAgCi0JICAgIGlmKCBrZXkuc3RhcnRzV2l0aCgiJSIpKQotCSAgICB7Ci0JICAgICAga2V5ID0ga2V5LnN1YnN0cmluZyggMSwga2V5Lmxlbmd0aCgpICk7Ci0JICAgIH0KLQkgICAgCi0JICAgIHJldHVybiBtc2dVdGlscy5nZXRNZXNzYWdlKGtleSk7Ci0gICB9Ci0KLSAvKioKLSAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLSAqIFN1YnN0aXR1dGlvbiBzZXF1ZW5jZXMgaW4gdGhlIG1lc3NhZ2Ugc3RyaW5nCi0gKiBhcmUgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIGFycmF5IG9mIHN1YnN0aXR1dGlvbiBvYmplY3RzICh3aGljaAotICogYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IGZvcgotICogZnVydGhlciBkZXRhaWxzIG9uIHN1YnN0aXR1dGlvbi4KLSAqIEBwYXJhbSBrZXkgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuCi0gKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotICogd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotICogZm9ybTogIktFWSA9IHZhbHVlIi4KLSAqIEBwYXJhbSBhcmdzIFRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZQotICogYXMgcmVxdWlyZWQgYnkgdGhlIG1lc3NhZ2UgaW4gcGx1Z2luLnByb3BlcnRpZXMgYW5kCi0gKiBieSB0aGUgcnVsZXMgb2YgY2xhc3MgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuCi0gKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0TWVzc2FnZShrZXkpLCBhcmdzKTsKLSB9Ci0KLSAvKioKLSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIHJlc291cmNlCi0gKiBhcyByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24uCi0gKiBAcmV0dXJuIEFuIGltYWdlIGRlc2NyaXB0b3IsIHBvc3NpYmx5IG51bGwuCi0gKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVVJMID0gaW5zdGFuY2VfLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0JCQlVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIG5hbWUpOwotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgcmV0dXJuIG51bGw7Ci0gICB9Ci0gfQotCi0gcHVibGljIFN0cmluZyBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKCkgewotICAgcmV0dXJuIFBsYXRmb3JtLmdldFBsdWdpblN0YXRlTG9jYXRpb24odGhpcykudG9PU1N0cmluZygpOwotIH0KLQotIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSW5zdGFsbExvY2F0aW9uKCkgewotICAgdHJ5IHsKLSAgICAgcmV0dXJuIFBsYXRmb3JtLnJlc29sdmUoZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSkuZ2V0RmlsZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvV2ViU2VydmljZXNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9XZWJTZXJ2aWNlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZWU2YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9XZWJTZXJ2aWNlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBUaGUgV2ViU2VydmljZXNQcmVmZXJlbmNlUGFnZQotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotLyoqCi0gKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBTV1QgY29udHJvbCBmb3IgdGhlIGN1c3RvbWl6ZWQgYm9keSAKLSAqIG9mIHRoaXMgcHJlZmVyZW5jZSBwYWdlIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLgotICogPHA+Ci0gKiBUaGlzIGZyYW1ld29yayBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZQotICogc3ViY2xhc3Nlcy4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0gKiBAcmV0dXJuIHRoZSBuZXcgY29udHJvbAotICovCi1wcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUgcGFyZW50KSB7Ci0JcmV0dXJuIG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci19Ci0vKioKLSAqIERvIGFueSBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBieSB0aGUgZGVza3RvcC4gQnkgZGVmYXVsdCBkbyBub3RoaW5nLgotICovCi1wdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggZGVza3RvcCkge30KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSUFQQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSUFQQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmYwNGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRXU0lBUENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbi5XU1VJUGx1Z2luOwotCi0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRXU0lBUENvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50V1NJQ29udGV4dAotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fV1NJX0FQX0NPTVBMSUFOQ0UgPSAibm9uV1NJQVBDb21wbGlhbmNlIjsKLQotcHVibGljIFBlcnNpc3RlbnRXU0lBUENvbnRleHQgKCkgCi17Ci0Jc3VwZXIoKTsKLQlub25fd3NpX2NvbXBsaWFuY2UgPSBOT05fV1NJX0FQX0NPTVBMSUFOQ0U7Ci0JbmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKFdTVUlQbHVnaW4uSUQgLCBub25fd3NpX2NvbXBsaWFuY2UpOwotCXdzaVdhcm5pbmdfID0gIldTSV9BUF9XQVJOSU5HIjsKLQl3c2lFcnJvcl8gPSAiV1NJX0FQX0VSUk9SIjsKLX0KLQotcHVibGljIFN0cmluZyBnZXRQZXJzaXN0ZW50V1NJQ29tcGxpYW5jZSAoKQotewotCVN0cmluZyBwcm9wZXJ0eSA9IGdldFZhbHVlQXNTdHJpbmcobm9uX3dzaV9jb21wbGlhbmNlKTsKLQkvLyBkZWZhdWx0IHRvIElnbm9yZSBpZiBubyBpbml0IGhhcyBiZWVuIGRvbmUgZnJvbSBpbmkgZmlsZQotCWlmIChwcm9wZXJ0eSA9PSBudWxsIHx8IHByb3BlcnR5LmVxdWFscygiIikpIHsKLQkJc2V0VmFsdWUoIG5vbl93c2lfY29tcGxpYW5jZSwgSUdOT1JFX05PTl9XU0kpOwotCQlyZXR1cm4gSUdOT1JFX05PTl9XU0k7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIHByb3BlcnR5OwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRXU0lDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2JkMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29udGV4dC5QZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudFdTSUNvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dAotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1BfTk9OX1dTSSA9ICIwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOX05PTl9XU0kgPSAiMSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFX05PTl9XU0kgPSAiMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MTE9XX1dTSV9QUkVGRVJFTkNFID0gIjMiOwotCi0JcHJvdGVjdGVkIFF1YWxpZmllZE5hbWUgbmFtZSA9IG51bGw7IC8vIHNldCBpbiBzdWJjbGFzcwotCXByb3RlY3RlZCBTdHJpbmcgbm9uX3dzaV9jb21wbGlhbmNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fV1NJX1NTQlBfQ09NUExJQU5DRSA9ICJub25XU0lTU0JQQ29tcGxpYW5jZSI7Ci0JcHJvdGVjdGVkIFN0cmluZyB3c2lXYXJuaW5nXzsgLy8gc2V0IGluIHN1YmNsYXNzCi0JcHJvdGVjdGVkIFN0cmluZyB3c2lFcnJvcl87IC8vIHNldCBpbiBzdWJjbGFzcwotCi1wdWJsaWMgUGVyc2lzdGVudFdTSUNvbnRleHQgKCkgCi17Ci0Jc3VwZXIoICBXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkpOwotCQotLy8gIE5PVEU6ICBuYW1lLCB3c2lXYXJuaW5nXyBhbmQgd3NpRXJyb3JfIHNob3VsZCBiZSBzZXQgaW4gdGhlIHN1YmNsYXNzZXMuICBUaGlzIGlzIHByb3ZpZGluZyBkZWZhdWx0aW5nIG9ubHkuCi0Jbm9uX3dzaV9jb21wbGlhbmNlID0gTk9OX1dTSV9TU0JQX0NPTVBMSUFOQ0U7Ci0JbmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKFdTVUlQbHVnaW4uSUQgLCBub25fd3NpX2NvbXBsaWFuY2UpOwotCXdzaVdhcm5pbmdfID0gIldTSV9TU0JQX1dBUk5JTkciOwotCXdzaUVycm9yXyA9ICJXU0lfU1NCUF9FUlJPUiI7Ci19Ci0KLXB1YmxpYyB2b2lkIGxvYWQoKSAKLXsKLQkvLyBsZXQgdGhlIGRlZmF1bHQgYmUgcmVhZCBmcm9tIHBsdWdpbl9jb3N0b21pemF0aW9uLmluaSBmaWxlCi0JLy8gc2V0RGVmYXVsdChub25fd3NpX2NvbXBsaWFuY2UsIFdBUk5fTk9OX1dTSSk7Ci19Ci0KLS8vIHRvIGJlIHVzZWQgb25seSBieSB0aGUgcHJlZmVyZW5jZSBwYWdlCi1wdWJsaWMgdm9pZCB1cGRhdGVXU0lDb21wbGlhbmNlcyAoIFN0cmluZyB2YWx1ZSkKLXsKLSAJCXNldFZhbHVlKCBub25fd3NpX2NvbXBsaWFuY2UsIHZhbHVlKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRQZXJzaXN0ZW50V1NJQ29tcGxpYW5jZSAoKQotewotCVN0cmluZyBwcm9wZXJ0eSA9IGdldFZhbHVlQXNTdHJpbmcobm9uX3dzaV9jb21wbGlhbmNlKTsKLS8vCSBkZWZhdWx0IHRvIElnbm9yZSBpZiBubyBpbml0IGhhcyBiZWVuIGRvbmUgZnJvbSBpbmkgZmlsZQotCWlmIChwcm9wZXJ0eSA9PSBudWxsIHx8IHByb3BlcnR5LmVxdWFscygiIikpIHsKLQkJc2V0VmFsdWUoIG5vbl93c2lfY29tcGxpYW5jZSwgSUdOT1JFX05PTl9XU0kpOwotCQlyZXR1cm4gSUdOT1JFX05PTl9XU0k7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIHByb3BlcnR5OwotfQotCi1wdWJsaWMgYm9vbGVhbiBTdG9wTm9uV1NJQ29tcGxpYW5jZXMoKQotewotCSByZXR1cm4gU1RPUF9OT05fV1NJLmVxdWFscyhnZXRQZXJzaXN0ZW50V1NJQ29tcGxpYW5jZSgpKTsKLX0KLQotcHVibGljIGJvb2xlYW4gV2Fybk5vbldTSUNvbXBsaWFuY2VzKCkKLXsKLQkgcmV0dXJuIFdBUk5fTk9OX1dTSS5lcXVhbHMoZ2V0UGVyc2lzdGVudFdTSUNvbXBsaWFuY2UoKSk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIElnbm9yZU5vbldTSUNvbXBsaWFuY2VzKCkKLXsKLQkgcmV0dXJuIElHTk9SRV9OT05fV1NJLmVxdWFscyhnZXRQZXJzaXN0ZW50V1NJQ29tcGxpYW5jZSgpKTsKLX0KLQotLy8gdG8gYmUgdXNlZCBvbmx5IGJ5IHRoZSBwcm9wZXJ0eSBwYWdlCi1wdWJsaWMgdm9pZCB1cGRhdGVQcm9qZWN0V1NJQ29tcGxpYW5jZXMgKCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsdWUpCi17Ci0gICAgdHJ5IHsKLQkJcHJvamVjdC5zZXRQZXJzaXN0ZW50UHJvcGVydHkobmFtZSwgdmFsdWUpOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7IAotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHN1Y2ggUHJvamVjdCIpOwotICAgIAlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLSAgICAJbG9nLmxvZyhMb2cuSU5GTywgNTA4NCwgdGhpcywgInVwZGF0ZVByb2plY3RXU0lDb21wbGlhbmNlcyIsICJObyBzdWNoIFByb2plY3QgIitwcm9qZWN0KTsKLSAgICB9Ci19Ci0KLXB1YmxpYyBib29sZWFuIHByb2plY3RTdG9wTm9uV1NJQ29tcGxpYW5jZXMoSVByb2plY3QgcHJvamVjdCkKLXsKLSAJcmV0dXJuIFNUT1BfTk9OX1dTSS5lcXVhbHMoZ2V0UHJvamVjdFBlcnNpc3RlbnRQcm9wZXJ0eShwcm9qZWN0KSk7ICAgIAotfQotCi1wdWJsaWMgYm9vbGVhbiBwcm9qZWN0V2Fybk5vbldTSUNvbXBsaWFuY2VzKElQcm9qZWN0IHByb2plY3QpCi17Ci0gCXJldHVybiBXQVJOX05PTl9XU0kuZXF1YWxzKGdldFByb2plY3RQZXJzaXN0ZW50UHJvcGVydHkocHJvamVjdCkpOyAgICAKLX0KLQotcHVibGljIGJvb2xlYW4gcHJvamVjdElnbm9yZU5vbldTSUNvbXBsaWFuY2VzKElQcm9qZWN0IHByb2plY3QpCi17Ci0gCXJldHVybiBJR05PUkVfTk9OX1dTSS5lcXVhbHMoZ2V0UHJvamVjdFBlcnNpc3RlbnRQcm9wZXJ0eShwcm9qZWN0KSk7ICAgIAotfQotCi0KLS8vIHRvIGJlIHVzZWQgb25seSBieSB0aGUgcHJvcGVydHkgcGFnZQotcHVibGljIGJvb2xlYW4gcHJvamVjdEZvbGxvd1dTSVByZWZlcmFuY2UoSVByb2plY3QgcHJvamVjdCkKLXsKLSAgICB0cnkgewotIAlTdHJpbmcgcHJvcGVydHkgPSBwcm9qZWN0LmdldFBlcnNpc3RlbnRQcm9wZXJ0eShuYW1lKTsKLSAgICByZXR1cm4gKHByb3BlcnR5ID09IG51bGwgfHwgcHJvcGVydHkuZXF1YWxzKCIiKSB8fCBwcm9wZXJ0eS5lcXVhbHMoRk9MTE9XX1dTSV9QUkVGRVJFTkNFKSk7Ci0gICAgCX0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSAgICAgewotICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgfSAgICAgCi19Ci0KLXByaXZhdGUgU3RyaW5nIGdldFByb2plY3RQZXJzaXN0ZW50UHJvcGVydHkoSVByb2plY3QgcHJvamVjdCkKLXsKLQlTdHJpbmcgcHJvcGVydHkgPSBnZXRQcm9qZWN0V1NJQ29tcGxpYW5jZShwcm9qZWN0KTsKLQlpZiAocHJvcGVydHkuZXF1YWxzKEZPTExPV19XU0lfUFJFRkVSRU5DRSkpIHsKLQkJcHJvcGVydHkgPSBnZXRQZXJzaXN0ZW50V1NJQ29tcGxpYW5jZSgpOwotCX0KLQlyZXR1cm4gcHJvcGVydHk7Ci0gfQotCi1wdWJsaWMgU3RyaW5nIGdldFByb2plY3RXU0lDb21wbGlhbmNlKElQcm9qZWN0IHByb2plY3QpCi17Ci0gIHRyeSB7Ci0gICAgIAlTdHJpbmcgcHJvcGVydHkgPSBwcm9qZWN0LmdldFBlcnNpc3RlbnRQcm9wZXJ0eShuYW1lKTsKLSAgICAgCWlmIChwcm9wZXJ0eSA9PSBudWxsIHx8IHByb3BlcnR5LmVxdWFscygiIikpCi0gICAgIAl7Ci0gICAgIAkJcHJvcGVydHkgPSBGT0xMT1dfV1NJX1BSRUZFUkVOQ0U7Ci0gICAgIAl9Ci0gICAgIAlyZXR1cm4gcHJvcGVydHk7Ci0gICAgIH0KLSAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgICAgIHsKLSAgICAJU3lzdGVtLm91dC5wcmludGxuKCJObyBzdWNoIFByb2plY3QiKTsKLSAgICAJcmV0dXJuIGdldFBlcnNpc3RlbnRXU0lDb21wbGlhbmNlKCk7Ci0gICAgIH0gICAgIAotfQotCi1wdWJsaWMgU3RyaW5nIGdldFdhcm5pbmcoKQotewotCXJldHVybiB3c2lXYXJuaW5nXzsKLX0KLQotcHVibGljIFN0cmluZyBnZXRFcnJvcigpCi17Ci0JcmV0dXJuIHdzaUVycm9yXzsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NJU1NCUENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiNDMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NJU1NCUENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbi5XU1VJUGx1Z2luOwotCi0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRXU0lDb250ZXh0Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9XU0lfU1NCUF9DT01QTElBTkNFID0gIm5vbldTSVNTQlBDb21wbGlhbmNlIjsKLQotcHVibGljIFBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dCAoKSAKLXsKLQlzdXBlcigpOwotCW5vbl93c2lfY29tcGxpYW5jZSA9IE5PTl9XU0lfU1NCUF9DT01QTElBTkNFOwotCW5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShXU1VJUGx1Z2luLklEICwgbm9uX3dzaV9jb21wbGlhbmNlKTsKLQl3c2lXYXJuaW5nXyA9ICJXU0lfU1NCUF9XQVJOSU5HIjsKLQl3c2lFcnJvcl8gPSAiV1NJX1NTQlBfRVJST1IiOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9XU0lDb21wbGlhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1dTSUNvbXBsaWFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTEyMDEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1dTSUNvbXBsaWFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbi5XU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLQotCi0KLXB1YmxpYyBjbGFzcyBXU0lDb21wbGlhbmNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIKLQotewotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JICAKLSAgLypDT05URVhUX0lEIFBXU0kwMDAxIGZvciB0aGUgV1MtSSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfUEFHRSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDAwIjsKLSAgLy8KLQotICBwcml2YXRlIExhYmVsIHdzaV9zc2JwX0xhYmVsXzsKLSAgcHJpdmF0ZSBDb21ibyB3c2lfc3NicF9UeXBlc187Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDEgZm9yIHRoZSBzdG9wIFdTLUkgU1NCUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19TVE9QX05PTl9XU0kgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwMSI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwMiBmb3IgdGhlIHdhcm4gV1MtSSBTU0JQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9TU0JQX0NPTUJPX1dBUk5fTk9OX1dTSSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDAyIjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDAzIGZvciB0aGUgaWdub3JlIFdTLUkgU1NCUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19JR05PUkVfTk9OX1dTSSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDAzIjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDA0IGZvciB0aGUgV1MtSSBTU0JQIHR5cGUgY29tYm8gYm94IG9uIHRoZSBXUy1JIEFQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9TU0JQX0NPTUJPX1RZUEUgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwNCI7Ci0gIAotICBwcml2YXRlIExhYmVsIHdzaV9hcF9MYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gd3NpX2FwX1R5cGVzXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwNSBmb3IgdGhlIHN0b3AgV1MtSSBBUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfQVBfQ09NQk9fU1RPUF9OT05fV1NJID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDUiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDYgZm9yIHRoZSB3YXJuIFdTLUkgQVAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX0FQX0NPTUJPX1dBUk5fTk9OX1dTSSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDA2IjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDA3IGZvciB0aGUgaWdub3JlIFdTLUkgQVAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX0FQX0NPTUJPX0lHTk9SRV9OT05fV1NJID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDciOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDggZm9yIHRoZSBXUy1JIEFQIHR5cGUgY29tYm8gYm94IG9uIHRoZSBXUy1JIEFQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9BUF9DT01CT19UWVBFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDgiOwotICAgIAotICBwcml2YXRlIGludCBzYXZlZFNTQlBTZXR0aW5nXyA9IC0xOwotCi0KLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLndzdC53cy51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICAKLSAgICBJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCi0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICBwYXJlbnQuc2V0VG9vbFRpcFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdTSV9QQUdFIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChwYXJlbnQsSU5GT1BPUF9QV1NJX1BBR0UpOwotCi0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0KLSAgICBDb21wb3NpdGUgd3NpX0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHBhcmVudCwgU1dULk5PTkUpOwotICAgIHdzaV9Db21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICB3c2lfQ29tcG9zaXRlLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICAKLSAgICB3c2lfYXBfTGFiZWxfID0gbmV3IExhYmVsKHdzaV9Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICB3c2lfYXBfTGFiZWxfLnNldFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX1dTSV9BUCIpKTsKLSAgICB3c2lfYXBfTGFiZWxfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUT09MVElQX1BXU0lfQVBfTEFCRUwiKSk7Ci0gICAgd3NpX2FwX1R5cGVzXyA9IG5ldyBDb21ibyh3c2lfQ29tcG9zaXRlLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgd3NpX2FwX1R5cGVzXy5zZXRUb29sVGlwVGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVE9PTFRJUF9QV1NJX0FQX0NPTUJPIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh3c2lfYXBfVHlwZXNfLElORk9QT1BfUFdTSV9BUF9DT01CT19UWVBFKTsKLSAgICAKLSAgICB3c2lfYXBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiU1RPUF9OT05fV1NJIikpOwotICAgIHdzaV9hcF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJXQVJOX05PTl9XU0kiKSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIklHTk9SRV9OT05fV1NJIikpOwotICAgIAotICAgIHdzaV9hcF9UeXBlc18uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgd3NpX3NzYnBfTGFiZWxfID0gbmV3IExhYmVsKHdzaV9Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICB3c2lfc3NicF9MYWJlbF8uc2V0VGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfV1NJX1NTQlAiKSk7Ci0gICAgd3NpX3NzYnBfTGFiZWxfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUT09MVElQX1BXU0lfU1NCUF9MQUJFTCIpKTsKLSAgICB3c2lfc3NicF9UeXBlc18gPSBuZXcgQ29tYm8od3NpX0NvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUT09MVElQX1BXU0lfU1NCUF9DT01CTyIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAod3NpX3NzYnBfVHlwZXNfLElORk9QT1BfUFdTSV9TU0JQX0NPTUJPX1RZUEUpOwotICAgIAotICAgIHdzaV9zc2JwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlNUT1BfTk9OX1dTSSIpKTsKLSAgICB3c2lfc3NicF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJXQVJOX05PTl9XU0kiKSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiSUdOT1JFX05PTl9XU0kiKSk7Ci0gIAotICAgIGluaXRpYWxpemVWYWx1ZXMoKTsKLSAgICBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc3VwZXJwYXJlbnQpOyAgICAKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0ICkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5SQURJTyApOwotICAgIGJ1dHRvbi5zZXRUZXh0KCB0ZXh0ICk7Ci0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBzdG9yZVZhbHVlcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHBlcmZvcm1PaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgIHsgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzCi0gICAqIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpCi0gIHsKLSAgICAvLyBmb3JjZSBXU0kgY29tcGxpYW5jZSBieSBkZWZhdWx0Ci0gICAgCi0gICAgd3NpX3NzYnBfVHlwZXNfLnNlbGVjdCh3c2lfc3NicF9UeXBlc18uaW5kZXhPZihtc2dVdGlsc18uZ2V0TWVzc2FnZSgiSUdOT1JFX05PTl9XU0kiKSkpOwotICAgIGludCBhcFNlbGVjdGlvbiA9IHdzaV9hcF9UeXBlc18uaW5kZXhPZihtc2dVdGlsc18uZ2V0TWVzc2FnZSgiSUdOT1JFX05PTl9XU0kiKSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5zZWxlY3QoYXBTZWxlY3Rpb24pOwotICAgIHNhdmVkU1NCUFNldHRpbmdfID0gLTE7ICAvLyBkbyBub3QgcmVzdG9yZSBzYXZlZCBTU0JQIHNldHRpbmcKLSAgICBwcm9jZXNzQVBTZWxlY3Rpb24oYXBTZWxlY3Rpb24pOwotCi0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotICB7Ci0gICAgCi0JU3RyaW5nIFdTSVRleHQgPSBnZXRXU0lTZWxlY3Rpb24oV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSVNTQlBDb250ZXh0KCkpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5zZWxlY3Qod3NpX3NzYnBfVHlwZXNfLmluZGV4T2YoV1NJVGV4dCkpOwotICAgIAotICAgIGludCBhcFNlbGVjdGlvbiA9IHdzaV9hcF9UeXBlc18uaW5kZXhPZihnZXRXU0lTZWxlY3Rpb24oV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSUFQQ29udGV4dCgpKSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5zZWxlY3QoYXBTZWxlY3Rpb24pOwotICAgIHNhdmVkU1NCUFNldHRpbmdfID0gLTE7ICAvLyBkbyBub3QgcmVzdG9yZSBzYXZlZCBTU0JQIHNldHRpbmcKLSAgICBwcm9jZXNzQVBTZWxlY3Rpb24oYXBTZWxlY3Rpb24pOwotICAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFdTSVNlbGVjdGlvbihQZXJzaXN0ZW50V1NJQ29udGV4dCBjb250ZXh0KQotICB7Ci0gICAgCi0gICAgU3RyaW5nIFdTSXZhbHVlID0gY29udGV4dC5nZXRQZXJzaXN0ZW50V1NJQ29tcGxpYW5jZSgpOwotICAgIFN0cmluZyBXU0lUZXh0ID0gbXNnVXRpbHNfLmdldE1lc3NhZ2UoIldBUk5fTk9OX1dTSSIpOwotICAgIGlmIChQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0kuZXF1YWxzKFdTSXZhbHVlKSkgewotCQlXU0lUZXh0ID0gbXNnVXRpbHNfLmdldE1lc3NhZ2UoIlNUT1BfTk9OX1dTSSIpOwotCX0gZWxzZSBpZiAoUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kuZXF1YWxzKFdTSXZhbHVlKSkgewotCQlXU0lUZXh0ID0gbXNnVXRpbHNfLmdldE1lc3NhZ2UoIklHTk9SRV9OT05fV1NJIik7Ci0JfQotCXJldHVybiBXU0lUZXh0OwotICB9Ci0gIC8qKgotICAgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpCi0gIHsKLSAgCXVwZGF0ZVdTSUNvbnRleHQod3NpX3NzYnBfVHlwZXNfLmdldFNlbGVjdGlvbkluZGV4KCksIFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lTU0JQQ29udGV4dCgpKTsKLSAgCXVwZGF0ZVdTSUNvbnRleHQod3NpX2FwX1R5cGVzXy5nZXRTZWxlY3Rpb25JbmRleCgpLCBXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJQVBDb250ZXh0KCkpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdXBkYXRlV1NJQ29udGV4dChpbnQgc2VsZWN0aW9uSW5kZXgsIFBlcnNpc3RlbnRXU0lDb250ZXh0IGNvbnRleHQpCi0gIHsKLSAgICAvLyBnZXQgdGhlIHBlcnNpc3RlbnQgY29udGV4dCBmcm9tIHRoZSBwbHVnaW4KLSAgICAKLSAgICBTdHJpbmcgdmFsdWU9bnVsbDsKLSAgICBzd2l0Y2ggKHNlbGVjdGlvbkluZGV4KSB7Ci0gICAgCWNhc2UgMDoKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJOwotICAgIAkJYnJlYWs7Ci0gICAgCWNhc2UgMToKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuV0FSTl9OT05fV1NJOwotICAgIAkJYnJlYWs7Ci0gICAgCWNhc2UgMjoKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0k7CQkKLSAgICAJCWJyZWFrOwotICAgIH0KLSAgICBjb250ZXh0LnVwZGF0ZVdTSUNvbXBsaWFuY2VzKHZhbHVlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAJCi0gIAlwcm9jZXNzQVBTZWxlY3Rpb24oIHdzaV9hcF9UeXBlc18uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAJCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3NBUFNlbGVjdGlvbihpbnQgc2VsZWN0aW9uKSB7Ci0gIAlpZiAoc2VsZWN0aW9uID09IDIpIHsgLy8gcmVzZXQgU1NCUCB0byBkZWZhdWx0IGlmIEFQIGlzIGlnbm9yZQotICAJCXdzaV9zc2JwX1R5cGVzXy5zZXRFbmFibGVkKHRydWUpOwotICAJCWlmIChzYXZlZFNTQlBTZXR0aW5nXyAhPSAtMSkgIHsKLSAgCQkJLy8gcmVzdG9yZSBzYXZlZCBTU0JQIHNldHRpbmcsIGlmIGFueQotICAJCQl3c2lfc3NicF9UeXBlc18uc2VsZWN0KHNhdmVkU1NCUFNldHRpbmdfKTsKLSAgCQkJc2F2ZWRTU0JQU2V0dGluZ18gPSAtMTsKLSAgCQl9Ci0gIAl9IGVsc2UgeyAvLyBzZXQgU1NCUCB0byBmb2xsb3cgQVAgc2V0dGluZyBpZiBTVE9QIG9yIFdBUk4gY2hvc2VuCi0gIAkJaWYgKHNhdmVkU1NCUFNldHRpbmdfID09IC0xKSAgeyAgLy8gU1NCUCBzZXR0aW5nIG5vdCBzYXZlZAotICAJCQlzYXZlZFNTQlBTZXR0aW5nXyA9IHdzaV9zc2JwX1R5cGVzXy5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAJCX0KLSAgCQl3c2lfc3NicF9UeXBlc18uc2VsZWN0KHNlbGVjdGlvbik7Ci0gIAkJd3NpX3NzYnBfVHlwZXNfLnNldEVuYWJsZWQoZmFsc2UpOwotICAJCQotICAJfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1dTSUNvbXBsaWFuY2VVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvV1NJQ29tcGxpYW5jZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNmRjOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvV1NJQ29tcGxpYW5jZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlcjsKLQotCi1wdWJsaWMgY2xhc3MgV1NJQ29tcGxpYW5jZVV0aWxzCi17Ci1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUdOT1JFX0lEID0wOwotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElHTk9SRV9BTExfSUQgPTE7Ci1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FOQ0VMX0lEID0yOwotCi1wcml2YXRlIHN0YXRpYyBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBnZXRXU0lTZXZlcml0eSAoSVByb2plY3QgcHJvamVjdCwgUGVyc2lzdGVudFdTSUNvbnRleHQgY29udGV4dCkgaW5zdGVhZAotICogQHBhcmFtIHByb2plY3QKLSAqIEByZXR1cm4gaW50Ci0gKi8KLXB1YmxpYyBzdGF0aWMgaW50IGdldFdTSVNldmVyaXR5IChJUHJvamVjdCBwcm9qZWN0KQotewotCXJldHVybiBnZXRXU0lTZXZlcml0eSAocHJvamVjdCwgV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSVNTQlBDb250ZXh0KCkpOwotfQotLyoqCi0gKiBAcGFyYW0gcHJvamVjdAotICogQHBhcmFtIGNvbnRleHQKLSAqIEByZXR1cm4KLSAqLwotcHVibGljIHN0YXRpYyBpbnQgZ2V0V1NJU2V2ZXJpdHkgKElQcm9qZWN0IHByb2plY3QsIFBlcnNpc3RlbnRXU0lDb250ZXh0IGNvbnRleHQpCi17Ci0JaWYgKGNvbnRleHQucHJvamVjdFN0b3BOb25XU0lDb21wbGlhbmNlcyhwcm9qZWN0KSkKLQkJcmV0dXJuIFN0YXR1cy5FUlJPUjsKLQllbHNlIGlmIChjb250ZXh0LnByb2plY3RXYXJuTm9uV1NJQ29tcGxpYW5jZXMocHJvamVjdCkpCi0JCXJldHVybiBTdGF0dXMuV0FSTklORzsKLQllbHNlCi0JCXJldHVybiBTdGF0dXMuSU5GTzsKLX0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2UgY2hlY2tXU0lDb21wbGlhbmNlICggU3RhdHVzSGFuZGxlciBtb25pdG9yLCBTdGF0dXNbXSBzdGF0dXMsIElQcm9qZWN0IHByb2plY3QsIFBlcnNpc3RlbnRXU0lDb250ZXh0IGNvbnRleHQpIGluc3RlYWQKLSAqIEBwYXJhbSBtb25pdG9yIFN0YXR1c0hhbmRsZXIKLSAqIEBwYXJhbSBzdGF0dXMgU3RhdHVzW10KLSAqIEBwYXJhbSBwcm9qZWN0IElQcm9qZWN0Ci0gKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0byBjb250aW51ZQotICovCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tXU0lDb21wbGlhbmNlICggU3RhdHVzSGFuZGxlciBtb25pdG9yLCBTdGF0dXNbXSBzdGF0dXMsIElQcm9qZWN0IHByb2plY3QpCi17CS8vIGNoZWNrIGZvciBTU0JQIGJ5IGRlZmF1bHQKLQlyZXR1cm4gY2hlY2tXU0lDb21wbGlhbmNlICggbW9uaXRvciwgc3RhdHVzLCBwcm9qZWN0LCBXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJU1NCUENvbnRleHQoKSk7Ci19Ci0vKioKLSAqIEBwYXJhbSBtb25pdG9yIFN0YXR1c0hhbmRsZXIKLSAqIEBwYXJhbSBzdGF0dXMgU3RhdHVzW10KLSAqIEBwYXJhbSBwcm9qZWN0IElQcm9qZWN0Ci0gKiBAcGFyYW0gY29udGV4dCBQZXJzaXN0ZW50V1NJQ29udGV4dAotICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdG8gY29udGludWUKLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrV1NJQ29tcGxpYW5jZSAoIFN0YXR1c0hhbmRsZXIgbW9uaXRvciwgU3RhdHVzW10gc3RhdHVzLCBJUHJvamVjdCBwcm9qZWN0LCBQZXJzaXN0ZW50V1NJQ29udGV4dCBjb250ZXh0KQotewotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS53c3Qud3MudWkiOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSk7IAotCQotICAJaWYgKGNvbnRleHQucHJvamVjdFN0b3BOb25XU0lDb21wbGlhbmNlcyhwcm9qZWN0KSkKLSAgCQl7Ci0gIAkJCS8vIGVtaXQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJuIGZhbHNlCi0gIAkJCVNpbXBsZVN0YXR1cyBzdGF0dXNfID0gbmV3IFNpbXBsZVN0YXR1cyhXU1VJUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZShjb250ZXh0LmdldEVycm9yKCkpLCBTdGF0dXMuRVJST1IpOwotICAJCQkvLyBhZGRpbmcgYWxsIG1lc3NhZ2VzIGZyb20gV1NJIEluY29tcGxpYW5jZXMKLSAgCQkJZm9yIChpbnQgaSA9IDA7IGk8IHN0YXR1cy5sZW5ndGg7IGkrKykKLQkgIAkJCXN0YXR1c18uYWRkQ2hpbGQoc3RhdHVzW2ldKTsgCQkJCi0JCQltb25pdG9yLnJlcG9ydEVycm9yKHN0YXR1c18pOwotICAJCQlyZXR1cm4gZmFsc2U7Ci0gIAkJfQotICAJZWxzZSBpZiAoY29udGV4dC5wcm9qZWN0V2Fybk5vbldTSUNvbXBsaWFuY2VzKHByb2plY3QpKQotICAJCXsKLSAgCQkJLy8gZ2l2ZSBhIHdhcm5pbmcgbWVzc2FnZSB3aXRoIHRoZSBvcHRpb25zIHRvIHN0b3AsIGlnbm9yZSB0aGlzIG9uZSwgb3IgaWdub3JlIGFsbCBjb21pbmcgbWVzc2FnZXMKLSAgCQkJU2ltcGxlU3RhdHVzIHN0YXR1c18gPSBuZXcgU2ltcGxlU3RhdHVzKFdTVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKGNvbnRleHQuZ2V0V2FybmluZygpKSwgU3RhdHVzLldBUk5JTkcpOwotICAJCQkvLyBhZGRpbmcgYWxsIG1lc3NhZ2VzIGZyb20gV1NJIEluY29tcGxpYW5jZXMKLSAgCQkJZm9yIChpbnQgaSA9IDA7IGk8IHN0YXR1cy5sZW5ndGg7IGkrKykKLQkgIAkJCXN0YXR1c18uYWRkQ2hpbGQoc3RhdHVzW2ldKTsKLQotICAJCQlDaG9pY2UgaWdub3JlQ2hvaWNlID0gbmV3IENob2ljZSgnSScsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJJR05PUkVfTEFCRUwiKSwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIklHTk9SRV9ERVNDUklQVElPTiIpKTsKLSAgCQkJQ2hvaWNlIGlnbm9yZUFsbENob2ljZSA9IG5ldyBDaG9pY2UoJ0EnLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiSUdOT1JFX0FMTF9MQUJFTCIpLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiSUdOT1JFX0FMTF9ERVNDUklQVElPTiIpKTsKLSAgCQkJQ2hvaWNlIGNhbmNlbENob2ljZSA9IG5ldyBDaG9pY2UoJ0MnLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiQ0FOQ0VMX0xBQkVMIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJDQU5DRUxfREVTQ1JJUFRJT04iKSk7Ci0gIAkJCUNob2ljZSByZXN1bHQgPSBtb25pdG9yLnJlcG9ydChzdGF0dXNfLCBuZXcgQ2hvaWNlW117aWdub3JlQ2hvaWNlLCBpZ25vcmVBbGxDaG9pY2UsIGNhbmNlbENob2ljZX0pOwotICAJCQkKLSAgCQkJLy8gaWYgdGhlIHVzZXIgY2xvc2VzIHRoZSBtZXNzYWdlIGJveCBvciBzZWxlY3RzIGlnbm9yZSBjb250aW51ZQotICAJCQlpZiAocmVzdWx0ID09IG51bGwgfHwgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhpZ25vcmVDaG9pY2UuZ2V0TGFiZWwoKSkpKQotICAgICAgICAJCQlyZXR1cm4gdHJ1ZTsKLSAgCQkJLy8gaWYgdGhlIHVzZXIgc2VsZWN0cyBpZ25vcmUgYWxsLCBjaGFuZ2UgdGhlIHByZWZlcmVuY2UKLQkgICAgICAgIGVsc2UgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoaWdub3JlQWxsQ2hvaWNlLmdldExhYmVsKCkpKQotCSAgICAgICAgCXsKLQkgICAgICAgIAkJY29udGV4dC51cGRhdGVQcm9qZWN0V1NJQ29tcGxpYW5jZXMocHJvamVjdCwgUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kpOwotCSAgICAgICAgCQlyZXR1cm4gdHJ1ZTsKLQkgICAgICAgIAl9Ci0JCQkvLyBpZiB0aGUgdXNlciBzZWxlY3RzIHRvIGNhbmNlbCAsIGRvIG5vdCBjb250aW51ZSB3aXRoIHRoZSBjb21tYW5kCi0gICAgICAgIAllbHNlIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoY2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotICAJCX0KLSAgcmV0dXJuIHRydWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJvcGVydGllcy9XU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcm9wZXJ0aWVzL1dTSUNvbXBsaWFuY2VQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiODMzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcm9wZXJ0aWVzL1dTSUNvbXBsaWFuY2VQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBXU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLSAgIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkgIAotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDEgZm9yIHRoZSBXUy1JIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9QQUdFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDAiOwotICAvLwotCi0gIHByaXZhdGUgTGFiZWwgd3NpX3NzYnBfTGFiZWxfOwotICBwcml2YXRlIENvbWJvIHdzaV9zc2JwX1R5cGVzXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwMSBmb3IgdGhlIHN0b3AgV1MtSSBTU0JQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9TU0JQX0NPTUJPX1NUT1BfTk9OX1dTSSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDAxIjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDAyIGZvciB0aGUgd2FybiBXUy1JIFNTQlAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX1NTQlBfQ09NQk9fV0FSTl9OT05fV1NJID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDIiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDMgZm9yIHRoZSBpZ25vcmUgV1MtSSBTU0JQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9TU0JQX0NPTUJPX0lHTk9SRV9OT05fV1NJID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDMiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDQgZm9yIHRoZSBXUy1JIFNTQlAgdHlwZSBjb21ibyBib3ggb24gdGhlIFdTLUkgQVAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX1NTQlBfQ09NQk9fVFlQRSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDA0IjsKLSAgCi0gIHByaXZhdGUgTGFiZWwgd3NpX2FwX0xhYmVsXzsKLSAgcHJpdmF0ZSBDb21ibyB3c2lfYXBfVHlwZXNfOwotICAKLSAgLypDT05URVhUX0lEIFBXU0kwMDA1IGZvciB0aGUgc3RvcCBXUy1JIEFQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9BUF9DT01CT19TVE9QX05PTl9XU0kgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwNSI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwNiBmb3IgdGhlIHdhcm4gV1MtSSBBUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfQVBfQ09NQk9fV0FSTl9OT05fV1NJID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDYiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDcgZm9yIHRoZSBpZ25vcmUgV1MtSSBBUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfQVBfQ09NQk9fSUdOT1JFX05PTl9XU0kgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwNyI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwOCBmb3IgdGhlIFdTLUkgQVAgdHlwZSBjb21ibyBib3ggb24gdGhlIFdTLUkgQVAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX0FQX0NPTUJPX1RZUEUgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwOCI7Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDkgZm9yIHRoZSBXUy1JIGZvbGxvdyBwcmVmZXJlbmNlIHJhZGlvIGJ1dHRvbiB0aGUgV1MtSSBTU0JQIGNvbXBsaWFuY2UgcHJvamVjdCBwcm9wZXJ0eSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUFBfUFdTSV9SQURJT19GT0xMT1dfV1NJX1NTQlBfUFJFRkVSRU5DRSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDA5IjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDEwIGZvciB0aGUgV1MtSSBmb2xsb3cgcHJlZmVyZW5jZSByYWRpbyBidXR0b24gdGhlIFdTLUkgQVAgY29tcGxpYW5jZSBwcm9qZWN0IHByb3BlcnR5IFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QUF9QV1NJX1JBRElPX0ZPTExPV19XU0lfQVBfUFJFRkVSRU5DRSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDEwIjsKLQotICBwcml2YXRlIGludCBzYXZlZFNTQlBTZXR0aW5nXyA9IC0xOwotICAKLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLndzdC53cy51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkKLSAgICBJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0gICAgCi0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICBwYXJlbnQuc2V0VG9vbFRpcFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdTSV9QQUdFIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChwYXJlbnQsIElORk9QT1BfUFdTSV9QQUdFKTsKLQotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotCi0gICAgQ29tcG9zaXRlIHdzaV9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICB3c2lfQ29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgd3NpX0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgICAgIAotICAgIHdzaV9hcF9MYWJlbF8gPSBuZXcgTGFiZWwod3NpX0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHdzaV9hcF9MYWJlbF8uc2V0VGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfV1NJX0FQIikpOwotICAgIHdzaV9hcF9MYWJlbF8uc2V0VG9vbFRpcFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdTSV9BUF9MQUJFTCIpKTsKLSAgICB3c2lfYXBfVHlwZXNfID0gbmV3IENvbWJvKHdzaV9Db21wb3NpdGUsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICB3c2lfYXBfVHlwZXNfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUT09MVElQX1BXU0lfQVBfQ09NQk8iKSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCApICk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHdzaV9hcF9UeXBlc18sSU5GT1BPUF9QV1NJX0FQX0NPTUJPX1RZUEUpOwotICAgIAotICAgIHdzaV9hcF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJTVE9QX05PTl9XU0kiKSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIldBUk5fTk9OX1dTSSIpKTsKLSAgICB3c2lfYXBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiSUdOT1JFX05PTl9XU0kiKSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkZPTExPV19XU0lfUFJFRkVSRU5DRSIpKTsKLQotICAgIHdzaV9hcF9UeXBlc18uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgd3NpX3NzYnBfTGFiZWxfID0gbmV3IExhYmVsKHdzaV9Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICB3c2lfc3NicF9MYWJlbF8uc2V0VGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfV1NJX1NTQlAiKSk7Ci0gICAgd3NpX3NzYnBfTGFiZWxfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUT09MVElQX1BXU0lfU1NCUF9MQUJFTCIpKTsKLSAgICB3c2lfc3NicF9UeXBlc18gPSBuZXcgQ29tYm8od3NpX0NvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5zZXRUb29sVGlwVGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVE9PTFRJUF9QV1NJX1NTQlBfQ09NQk8iKSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAod3NpX3NzYnBfVHlwZXNfLElORk9QT1BfUFdTSV9TU0JQX0NPTUJPX1RZUEUpOwotICAgIAotICAgIHdzaV9zc2JwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlNUT1BfTk9OX1dTSSIpKTsKLSAgICB3c2lfc3NicF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJXQVJOX05PTl9XU0kiKSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiSUdOT1JFX05PTl9XU0kiKSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiRk9MTE9XX1dTSV9QUkVGRVJFTkNFIikpOwotCi0gICAgaW5pdGlhbGl6ZVZhbHVlcygpOwotICAgIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nLmFwcGx5RGlhbG9nRm9udChzdXBlcnBhcmVudCk7ICAgIAotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLSAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSAKLSAgewotICAJCXJldHVybiBXU1VJUGx1Z2luLmdldE1lc3NhZ2Uoa2V5KTsKLSAgfQotCi0gIHByaXZhdGUgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCApCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuUkFESU8gKTsKLSAgICBidXR0b24uc2V0VGV4dCggdGV4dCApOwotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICAvKioKLSAgICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0gIHsKLSAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICBpbml0aWFsaXplRGVmYXVsdHMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqICBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKQotICB7Ci0gICAgc3RvcmVWYWx1ZXMoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpCi0gIHsKLSAgICBwZXJmb3JtT2soKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpICAgeyAKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHVzaW5nIGRlZmF1bHQgdmFsdWVzCi0gICAqIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpCi0gIHsKLSAgICB3c2lfc3NicF9UeXBlc18uc2VsZWN0KHdzaV9zc2JwX1R5cGVzXy5pbmRleE9mKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJGT0xMT1dfV1NJX1BSRUZFUkVOQ0UiKSkpOwotICAgIGludCBhcFNlbGVjdGlvbiA9IHdzaV9hcF9UeXBlc18uaW5kZXhPZihtc2dVdGlsc18uZ2V0TWVzc2FnZSgiRk9MTE9XX1dTSV9QUkVGRVJFTkNFIikpOwotICAgIHdzaV9hcF9UeXBlc18uc2VsZWN0KGFwU2VsZWN0aW9uKTsKLSAgICBzYXZlZFNTQlBTZXR0aW5nXyA9IC0xOyAgLy8gZG8gbm90IHJlc3RvcmUgc2F2ZWQgU1NCUCBzZXR0aW5nCi0gICAgcHJvY2Vzc0FQU2VsZWN0aW9uKGFwU2VsZWN0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLSAgCVN0cmluZyBXU0lUZXh0ID0gZ2V0V1NJU2VsZWN0aW9uKFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lTU0JQQ29udGV4dCgpKTsKLSAgICB3c2lfc3NicF9UeXBlc18uc2VsZWN0KHdzaV9zc2JwX1R5cGVzXy5pbmRleE9mKFdTSVRleHQpKTsKLSAgICAKLSAgICBpbnQgYXBTZWxlY3Rpb24gPSB3c2lfYXBfVHlwZXNfLmluZGV4T2YoZ2V0V1NJU2VsZWN0aW9uKFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lBUENvbnRleHQoKSkpOwotICAgIHdzaV9hcF9UeXBlc18uc2VsZWN0KGFwU2VsZWN0aW9uKTsKLSAgICBzYXZlZFNTQlBTZXR0aW5nXyA9IC0xOyAgLy8gZG8gbm90IHJlc3RvcmUgc2F2ZWQgU1NCUCBzZXR0aW5nCi0gICAgcHJvY2Vzc0FQU2VsZWN0aW9uKGFwU2VsZWN0aW9uKTsKLQl9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0V1NJU2VsZWN0aW9uKFBlcnNpc3RlbnRXU0lDb250ZXh0IGNvbnRleHQpCi0gIHsKLSAgICAKLSAgCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGdldEVsZW1lbnQoKTsKLSAgCVN0cmluZyBXU0l2YWx1ZSA9IGNvbnRleHQuZ2V0UHJvamVjdFdTSUNvbXBsaWFuY2UocHJvamVjdCk7Ci0JU3RyaW5nIFdTSVRleHQgPSBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiRk9MTE9XX1dTSV9QUkVGRVJFTkNFIik7Ci0JaWYgKFBlcnNpc3RlbnRXU0lDb250ZXh0LlNUT1BfTk9OX1dTSS5lcXVhbHMoV1NJdmFsdWUpKSB7Ci0JCVdTSVRleHQgPSBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiU1RPUF9OT05fV1NJIik7Ci0JfSBlbHNlIGlmIChQZXJzaXN0ZW50V1NJQ29udGV4dC5XQVJOX05PTl9XU0kuZXF1YWxzKFdTSXZhbHVlKSkgewotCQlXU0lUZXh0ID0gbXNnVXRpbHNfLmdldE1lc3NhZ2UoIldBUk5fTk9OX1dTSSIpOwotCX0gZWxzZSBpZiAoUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kuZXF1YWxzKFdTSXZhbHVlKSkgewotCQlXU0lUZXh0ID0gbXNnVXRpbHNfLmdldE1lc3NhZ2UoIklHTk9SRV9OT05fV1NJIik7Ci0JfQotCXJldHVybiBXU0lUZXh0OwotICB9Ci0gIAotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gIAl1cGRhdGVXU0lDb250ZXh0KHdzaV9zc2JwX1R5cGVzXy5nZXRTZWxlY3Rpb25JbmRleCgpLCBXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJU1NCUENvbnRleHQoKSk7Ci0gIAl1cGRhdGVXU0lDb250ZXh0KHdzaV9hcF9UeXBlc18uZ2V0U2VsZWN0aW9uSW5kZXgoKSwgV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSUFQQ29udGV4dCgpKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdTSUNvbnRleHQoaW50IHNlbGVjdGlvbkluZGV4LCBQZXJzaXN0ZW50V1NJQ29udGV4dCBjb250ZXh0KQotICB7ICAgIAotICAJU3RyaW5nIHZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuRk9MTE9XX1dTSV9QUkVGRVJFTkNFOwotICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGdldEVsZW1lbnQoKTsKLSAgICAKLSAgICBzd2l0Y2ggKHNlbGVjdGlvbkluZGV4KSB7Ci0gICAgCWNhc2UgMDoKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJOwotICAgIAkJYnJlYWs7Ci0gICAgCWNhc2UgMToKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuV0FSTl9OT05fV1NJOwotICAgIAkJYnJlYWs7Ci0gICAgCWNhc2UgMjoKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0k7CQkKLSAgICAJCWJyZWFrOwotICAgIAljYXNlIDM6Ci0gICAgCQl2YWx1ZSA9IFBlcnNpc3RlbnRXU0lDb250ZXh0LkZPTExPV19XU0lfUFJFRkVSRU5DRTsJCQotICAgIAkJYnJlYWs7Ci0gICAgfQotICAgIGNvbnRleHQudXBkYXRlUHJvamVjdFdTSUNvbXBsaWFuY2VzKHByb2plY3QsIHZhbHVlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAJCi0gIAlwcm9jZXNzQVBTZWxlY3Rpb24oIHdzaV9hcF9UeXBlc18uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAJCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3NBUFNlbGVjdGlvbihpbnQgc2VsZWN0aW9uKSB7Ci0gIAlpZiAoc2VsZWN0aW9uID09IDIpIHsgLy8gcmVzZXQgU1NCUCB0byBkZWZhdWx0IGlmIEFQIGlzIGlnbm9yZQotICAJCXdzaV9zc2JwX1R5cGVzXy5zZXRFbmFibGVkKHRydWUpOwotICAJCWlmIChzYXZlZFNTQlBTZXR0aW5nXyAhPSAtMSkgIHsKLSAgCQkJLy8gcmVzdG9yZSBzYXZlZCBTU0JQIHNldHRpbmcsIGlmIGFueQotICAJCQl3c2lfc3NicF9UeXBlc18uc2VsZWN0KHNhdmVkU1NCUFNldHRpbmdfKTsKLSAgCQkJc2F2ZWRTU0JQU2V0dGluZ18gPSAtMTsKLSAgCQl9Ci0gIAl9IGVsc2UgeyAvLyBzZXQgU1NCUCB0byBmb2xsb3cgQVAgc2V0dGluZyBpZiBTVE9QIG9yIFdBUk4gY2hvc2VuCi0gIAkJaWYgKHNhdmVkU1NCUFNldHRpbmdfID09IC0xKSAgeyAgLy8gU1NCUCBzZXR0aW5nIG5vdCBzYXZlZAotICAJCQlzYXZlZFNTQlBTZXR0aW5nXyA9IHdzaV9zc2JwX1R5cGVzXy5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAJCX0KLSAgCQl3c2lfc3NicF9UeXBlc18uc2VsZWN0KHNlbGVjdGlvbik7Ci0gIAkJd3NpX3NzYnBfVHlwZXNfLnNldEVuYWJsZWQoZmFsc2UpOwotICAJCQotICAJfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3VpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy91aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzNDdjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIFVJCi1QTFVHSU5fVkVORE9SPUVjbGlwc2Uub3JnCi1QTFVHSU5fREVTQz1cCi1UaGUgV2ViIHNlcnZpY2VzIEdVSSBwbHVnaW4gZGVsaXZlcnMgdGhlIGdyYXBoaWNhbCBcCi11c2VyIGludGVyZmFjZSB0byB0aGUgV2ViIHNlcnZpY2VzIGZ1bmN0aW9uIGluIHRoZSBXU1Qgc3VicHJvamVjdC4KLQotUExVR0lOX05FV19DQVRFR09SWV9OQU1FX1dTPVdlYiBTZXJ2aWNlcwotCi0KLSMKLSMgIFdTLUkgUHJlZmVyZW5jZSBwYWdlcwotIwotIyBXUy1JIENvbXBsaWFuY2UgUGFnZQotIwotUFJFRkVSRU5DRV9DQVRFR09SWV9XU0k9V1MtSSBDb21wbGlhbmNlCi1TVE9QX05PTl9XU0k9UmVxdWlyZSBjb21wbGlhbmNlCi1XQVJOX05PTl9XU0k9U3VnZ2VzdCBjb21wbGlhbmNlCi1JR05PUkVfTk9OX1dTST1JZ25vcmUgY29tcGxpYW5jZQotRk9MTE9XX1dTSV9QUkVGRVJFTkNFPUZvbGxvdyBQcmVmZXJlbmNlCi0KLVRPT0xUSVBfUFdTSV9QQUdFPVdlYiBTZXJ2aWNlcyBJbnRlcm9wZXJhYmlsaXR5Ci1UT09MVElQX1BXU0lfUkFESU9fU1RPUF9OT05fV1NJPVN0b3AgYW5kIHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZSBpZiB5b3UgbWFrZSBhIGNob2ljZSB0aGF0IGRvZXMgbm90IGNvbXBseSB3aXRoIFdTLUkuCi1UT09MVElQX1BXU0lfUkFESU9fV0FSTklOR19OT05fV1NJPVByb2R1Y2UgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgeW91IG1ha2UgYSBjaG9pY2UgdGhhdCBkb2VzIG5vdCBjb21wbHkgd2l0aCBXUy1JLgotVE9PTFRJUF9QV1NJX1JBRElPX0lHTk9SRV9OT05fV1NJPVNpbGVudGx5IGFsbG93IGNob2ljZXMgdGhhdCBkbyBub3QgY29tcGx5IHdpdGggV1MtSS4KLVRPT0xUSVBfUFdTSV9SQURJT19GT0xMT1dfV1NJX1BSRUZFUkVOQ0U9UHJvamVjdCB3b3VsZCB1c2UgV1MtSSBjb21wbGlhbmNlIGxldmVsIHNldCBpbiBXb3Jrc3BhY2UgUHJlZmVyZW5jZS4KLQotTEFCRUxfV1NJX1NTQlA9V1MtSSBTU0JQIGNvbXBsaWFuY2UgbGV2ZWwKLVRPT0xUSVBfUFdTSV9TU0JQX0xBQkVMPVdTLUkgU2ltcGxlIFNPQVAgQmluZGluZyBQcm9maWxlIGNvbXBsaWFuY2UgbGV2ZWwKLVRPT0xUSVBfUFdTSV9TU0JQX0NPTUJPPUNob29zZSB0aGUgV1MtSSBTaW1wbGUgU09BUCBCaW5kaW5nIFByb2ZpbGUgY29tcGxpYW5jZSBsZXZlbAotCi1MQUJFTF9XU0lfQVA9V1MtSSBBUCBjb21wbGlhbmNlIGxldmVsCi1UT09MVElQX1BXU0lfQVBfTEFCRUw9V1MtSSBBdHRhY2htZW50IFByb2ZpbGUgY29tcGxpYW5jZSBsZXZlbAotVE9PTFRJUF9QV1NJX0FQX0NPTUJPPUNob29zZSB0aGUgV1MtSSBBdHRhY2htZW50IFByb2ZpbGUgY29tcGxpYW5jZSBsZXZlbAotCi0KLSMKLSMJV1MtSSBDb21wbGlhbmNlIE1lc3NhZ2VzCi0jCi1XU0lfU1NCUF9FUlJPUj1Zb3UgaGF2ZSBtYWRlIGEgY2hvaWNlIHRoYXQgbWF5IHJlc3VsdCBpbiBhIFdlYiBzZXJ2aWNlIHRoYXQgZG9lcyBub3QgY29tcGx5IHdpdGggdGhlIFdTLUkgU2ltcGxlIFNPQVAgQmluZGluZyBQcm9maWxlLiBZb3VyIGN1cnJlbnQgV2ViIHNlcnZpY2VzIHByZWZlcmVuY2UgaXMgc2V0IHRvIHJlcXVpcmUgY29tcGxpYW5jZSB3aXRoIFdTLUkgU1NCUC4KLVdTSV9TU0JQX1dBUk5JTkc9WW91IGhhdmUgbWFkZSBhIGNob2ljZSB0aGF0IG1heSByZXN1bHQgaW4gYSBXZWIgc2VydmljZSB0aGF0IGRvZXMgbm90IGNvbXBseSB3aXRoIHRoZSBXUy1JIFNpbXBsZSBTT0FQIEJpbmRpbmcgUHJvZmlsZS4gRG8geW91IHdpc2ggdG8gaWdub3JlIHRoaXMgd2FybmluZyBhbmQgY29udGludWU/Ci1XU0lfU1NCUF9JTkNPTVBMSUFOVF9SVU5USU1FPVRoZSBzZWxlY3RlZCBXZWIgU2VydmljZSBydW50aW1lIGRvZXMgbm90IGNvbXBseSB3aXRoIHRoZSBXUy1JIFNpbXBsZSBTT0FQIEJpbmRpbmcgUHJvZmlsZS4KLVdTSV9BUF9FUlJPUj1Zb3UgaGF2ZSBtYWRlIGEgY2hvaWNlIHRoYXQgbWF5IHJlc3VsdCBpbiBhIFdlYiBzZXJ2aWNlIHRoYXQgZG9lcyBub3QgY29tcGx5IHdpdGggdGhlIFdTLUkgQXR0YWNobWVudCBQcm9maWxlLiBZb3VyIGN1cnJlbnQgV2ViIHNlcnZpY2VzIHByZWZlcmVuY2UgaXMgc2V0IHRvIHJlcXVpcmUgY29tcGxpYW5jZSB3aXRoIFdTLUkgQVAuCi1XU0lfQVBfV0FSTklORz1Zb3UgaGF2ZSBtYWRlIGEgY2hvaWNlIHRoYXQgbWF5IHJlc3VsdCBpbiBhIFdlYiBzZXJ2aWNlIHRoYXQgZG9lcyBub3QgY29tcGx5IHdpdGggdGhlIFdTLUkgQXR0YWNobWVudCBQcm9maWxlLiBEbyB5b3Ugd2lzaCB0byBpZ25vcmUgdGhpcyB3YXJuaW5nIGFuZCBjb250aW51ZT8KLVdTSV9BUF9JTkNPTVBMSUFOVF9SVU5USU1FPVRoZSBzZWxlY3RlZCBXZWIgU2VydmljZSBydW50aW1lIGRvZXMgbm90IGNvbXBseSB3aXRoIHRoZSBXUy1JIEF0dGFjaG1lbnQgUHJvZmlsZS4KLUlHTk9SRV9MQUJFTD1JZ25vcmUKLUlHTk9SRV9ERVNDUklQVElPTj1JZ25vcmUgdGhlIFdTLUkgbm9uLWNvbXBsaWFuY2UgYW5kIGNvbnRpbnVlCi1JR05PUkVfQUxMX0xBQkVMPUlnbm9yZSBBbGwKLUlHTk9SRV9BTExfREVTQ1JJUFRJT049QWx3YXlzIGlnbm9yZSB0aGUgV1MtSSBub24tY29tcGxpYW5jZSBhbmQgY29udGludWUKLUNBTkNFTF9MQUJFTD1DYW5jZWwKLVRBU0tfTEFCRUxfV1NJX05PTkNPTVBMSUFOVD1DaGVjayBmb3IgV1NJIENvbXBsaWFuY2UKLVRBU0tfREVTQ19XU0lfTk9OQ09NUExJQU5UPUNoZWNrIGZvciBXU0kgQ29tcGxpYW5jZQotQ0FOQ0VMX0RFU0NSSVBUSU9OPUNhbmNlbAotTk9UX09LPUNhbm5vdCBjb250aW51ZSBkdWUgdG8gV1MtSSBub24tY29tcGxpYW5jZQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0ZjFiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi13cy5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OTRlMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNTE4ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc291cmNlLndzLmphciA9IHNyYy8KLW91dHB1dC53cy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHdzLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTE3NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC53cyI+Ci0gICA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj4KLSAgIDwvY29tcG9uZW50LWRlcGVuZHM+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLmF4aXMiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS5zb2FwIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUud3NpbCIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlciIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MudWRkaTRqIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53cy51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NzJkOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi1NU0dfRVJST1JfVU5BQkxFX1RPX1NUQVJUX01PTklUT1I9SVdBQjAwMDFFIFVuYWJsZSB0byBtb25pdG9yIHBvcnQgezB9IG9mIHsxfS4KLQotIyBDdXJyZW50bHkga25vd24gcHVibGljIFVEREkgcmVnaXN0cmllcwotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX0lCTT1JQk0gVURESSBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX0lCTV9URVNUPUlCTSBVRERJIFRlc3QgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9NSUNST1NPRlQ9TWljcm9zb2Z0IFVEREkgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9NSUNST1NPRlRfVEVTVD1NaWNyb3NvZnQgVURESSBUZXN0IFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQPVNBUCBVRERJIFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQX1RFU1Q9U0FQIFVEREkgVGVzdCBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1hNRVRIT0RTPVhNZXRob2RzIFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTlRUQ09NTT1OVFQgQ29tbXVuaWNhdGlvbnMgUmVnaXN0cnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWFhMmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBuYW1lPSIlUExVR0lOX05BTUUiCi0gICBwcm92aWRlci1uYW1lPSIlUExVR0lOX1BST1ZJREVSIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5XU1BsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0id3MuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS53c2lsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL1dTUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL1dTUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYzBmNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9XU1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdTUGx1Z2luIHBsdWdpbjsKLQotCS8vIFJlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBXU1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLCBvciAna2V5JyBpZiBub3QKLQkgKiBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFdTUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90Ci0JICogZm91bmQuIFJlcGxhY2VzIHN1YnN0aXR1dGlvbiB2YXJpYWJsZXMgaW4gdGhlIG1lc3NhZ2UgYnkgb2JqZWN0cyBpbiAnYXJncycuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUKLQkJCQkJCS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC53cy5XU1BsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY0Nvbm5lY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzhjYWEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY0Nvbm5lY3Rpb24gaW1wbGVtZW50cyBDb25uZWN0aW9uCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBSZWwgZlJlbDsKLSAgcHJpdmF0ZSBFbGVtZW50IGZFbGVtZW50OwotICBwcml2YXRlIENvbm5lY3Rpb24gZk9wcG9zaW5nQ29ubmVjdGlvbjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRCT1VORCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQk9VTkQgPSAxOwotCi0gIHB1YmxpYyBzdGF0aWMgQ29ubmVjdGlvbltdIGNyZWF0ZVBhaXIgKCBSZWwgb3V0Ym91bmRSZWwsIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCwgUmVsIGluYm91bmRSZWwsIEVsZW1lbnQgc291cmNlRWxlbWVudCApCi0gIHsKLSAgICBCYXNpY0Nvbm5lY3Rpb24gb3V0Ym91bmRDb25uZWN0aW9uID0gbmV3IEJhc2ljQ29ubmVjdGlvbihvdXRib3VuZFJlbCx0YXJnZXRFbGVtZW50KTsKLSAgICBCYXNpY0Nvbm5lY3Rpb24gaW5ib3VuZENvbm5lY3Rpb24gPSBuZXcgQmFzaWNDb25uZWN0aW9uKGluYm91bmRSZWwsc291cmNlRWxlbWVudCk7Ci0gICAgb3V0Ym91bmRDb25uZWN0aW9uLmZPcHBvc2luZ0Nvbm5lY3Rpb24gPSBpbmJvdW5kQ29ubmVjdGlvbjsKLSAgICBpbmJvdW5kQ29ubmVjdGlvbi5mT3Bwb3NpbmdDb25uZWN0aW9uID0gb3V0Ym91bmRDb25uZWN0aW9uOwotICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbltdIHtvdXRib3VuZENvbm5lY3Rpb24saW5ib3VuZENvbm5lY3Rpb259OwotICB9Ci0KLSAgcHVibGljIEJhc2ljQ29ubmVjdGlvbiAoIFJlbCByZWwsIEVsZW1lbnQgZWxlbWVudCApCi0gIHsKLSAgICBmUmVsID0gcmVsOwotICAgIGZFbGVtZW50ID0gZWxlbWVudDsKLSAgICBmT3Bwb3NpbmdDb25uZWN0aW9uID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBSZWwgZ2V0UmVsICgpCi0gIHsKLSAgICByZXR1cm4gZlJlbDsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmRWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyBDb25uZWN0aW9uIGdldE9wcG9zaW5nQ29ubmVjdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIGZPcHBvc2luZ0Nvbm5lY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpCi0gIHsKLSAgICByZXR1cm4gZkVsZW1lbnQuZ2V0TmFtZSgpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZDA4ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQmFzaWNFbGVtZW50IGltcGxlbWVudHMgRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgU3RyaW5nIGZOYW1lOwotICBwcml2YXRlIFN0cmluZyBmTVVJRDsKLSAgcHJpdmF0ZSBNb2RlbCBmTW9kZWw7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGZSZWxzOwotICBwcml2YXRlIEhhc2h0YWJsZSBmUHJvcGVydGllczsKLSAgcHJpdmF0ZSBWZWN0b3IgZkxpc3RlbmVyczsKLQotICBwdWJsaWMgQmFzaWNFbGVtZW50ICggU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsICkKLSAgewotICAgIGZOYW1lID0gbmFtZTsKLSAgICBzZXRNVUlEKG1vZGVsLm1ha2VNVUlEKG5hbWUpKTsKLSAgICBtb2RlbC5hZGRFbGVtZW50KHRoaXMpOwotICAgIGZNb2RlbCA9IG1vZGVsOwotICAgIGZSZWxzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGZMaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZlByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZlByb3BlcnRpZXMucHV0KFByb3BlcnR5Lk5BTUUsbmV3IEJhc2ljUHJvcGVydHkoUHJvcGVydHkuTkFNRSxmTmFtZSkpOwotICB9Ci0KLSAgcHVibGljIEJhc2ljRWxlbWVudCAoIFN0cmluZyBuYW1lLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBvdXRib3VuZFJlbE5hbWUsIFN0cmluZyBpbmJvdW5kUmVsTmFtZSApCi0gIHsKLSAgICB0aGlzKG5hbWUsZWxlbWVudC5nZXRNb2RlbCgpKTsKLSAgICBjb25uZWN0KGVsZW1lbnQsb3V0Ym91bmRSZWxOYW1lLGluYm91bmRSZWxOYW1lKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIDxjb2RlPkVsZW1lbnQ8L2NvZGU+Ci0gICogb2YgdGhlIHNhbWUgY2xhc3MgYW5kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgbW9kZWwsCi0gICogYnV0IHdpdGggbm8gUHJvcGVydGllcywgUmVscyBvciBMaXN0ZW5lcnMgZXhjZXB0IGZvcgotICAqIHRoZSB7QGxpbmsgUHJvcGVydHkjTkFNRSBOQU1FfSBwcm9wZXJ0eS4KLSAgKiBAcmV0dXJuIE9iamVjdCBBIG5ldyBFbGVtZW50LgotICAqLwotICBwdWJsaWMgRWxlbWVudCBzaGFsbG93Q2xvbmUgKCkKLSAgewotICAgIHJldHVybiBuZXcgQmFzaWNFbGVtZW50KGZOYW1lLGZNb2RlbCk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyA8Y29kZT5FbGVtZW50PC9jb2RlPgotICAqIG9mIHRoZSBzYW1lIGNsYXNzIGFuZCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIG1vZGVsCi0gICogYW5kIHdpdGggYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBFbGVtZW50J3MgUHJvcGVydGllcy4KLSAgKiBUaGUgUmVscyBhbmQgTGlzdGVuZXJzIGFyZSBub3QgY2xvbmVkLgotICAqIEByZXR1cm4gRWxlbWVudCBBIG5ldyBFbGVtZW50LgotICAqLwotICBwdWJsaWMgZmluYWwgRWxlbWVudCBkZWVwQ2xvbmUgKCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IHNoYWxsb3dDbG9uZSgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRQcm9wZXJ0aWVzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpZS5uZXh0RWxlbWVudCgpOwotICAgICAgUHJvcGVydHkgbmV3UHJvcGVydHkgPSAoUHJvcGVydHkpcHJvcGVydHkuc2hhbGxvd0Nsb25lKCk7Ci0gICAgICBuZXdFbGVtZW50LnNldFByb3BlcnR5KG5ld1Byb3BlcnR5KTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgKiBNb2RlbC1WaWV3LUNvbnRyb2xsZXI6IEFsbCBwcm9wZXJ0eSBjaGFuZ2VzIHRvIHRoZSBtb2RlbAotICAqIChzdWNoIGFzIHRob3NlIG1hZGUgYnkgYSB3aXphcmQgaW4gdGhlIHJvbGUgb2YgYSBDb250cm9sbGVyKQotICAqIHNob3VsZCB5aWVsZCBldmVudHMgdG8gd2hpY2ggYW4gaW50ZXJlc3RlZCBwYXJ0eSBjYW4gbGlzdGVuCi0gICogKHN1Y2ggYXMgYSB3aXphcmQgaW4gdGhlIHJvbGUgb2YgYSBWaWV3ZXIpLgotICAqIEBwYXJhbSB0bWwgVGhlIGxpc3RlbmVyIHRvIGFkZC4KLSAgKi8KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIgKCBFbGVtZW50TGlzdGVuZXIgbGlzdGVuZXIgKQotICB7Ci0gICAgZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICB9Ci0KLSAgcHVibGljIE1vZGVsIGdldE1vZGVsICgpCi0gIHsKLSAgICByZXR1cm4gZk1vZGVsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCAoKQotICB7Ci0gICAgcmV0dXJuIChmTW9kZWwgIT0gbnVsbCAmJiBmTW9kZWwuY29udGFpbnNFbGVtZW50KHRoaXMpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZSAoKQotICB7Ci0gICAgcmV0dXJuIGZNb2RlbC5yZW1vdmVFbGVtZW50KHRoaXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZSAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIGZOYW1lID0gbmFtZTsKLSAgICBmUHJvcGVydGllcy5wdXQoUHJvcGVydHkuTkFNRSxuZXcgQmFzaWNQcm9wZXJ0eShQcm9wZXJ0eS5OQU1FLGZOYW1lKSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBmTmFtZTsKLSAgfQotCi0gIC8qCi0gICogVGhlIGdldHRlciBmb3IgdGhlIE1VSUQKLSAgKiBUaGUgTVVJRCBpcyB0aGUgTW9kZWwgVW5pcXVlIElkZW50aWZpZXIsIG1hZGUgZnJvbSB0aGUgbmFtZSBhbmQgYW4KLSAgKiBhcHBlbmRlZCB1bmlxdWUgbnVtYmVyIAotICAqIEByZXR1cm4gU3RyaW5nIGEgdW5pcXVlIGlkIGZvciB0aGlzIGVsZW1lbnQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBtb2RlbCAKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNVUlEKCkKLSAgewotICAgIHJldHVybiBmTVVJRDsKLSAgfQotCi0gIC8qCi0gICoKLSAgKgotICAqLwotICBwdWJsaWMgaW50IGdldE51bWJlcklEKCkKLSAgewotICAgIFN0cmluZyBudW1iZXIgPSBnZXRNVUlEKCkuc3Vic3RyaW5nKGdldE5hbWUoKS5sZW5ndGgoKSk7ICAKLSAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChudW1iZXIpOwotICB9Ci0KLSAgLyoKLSAgKiBTZXQgdGhlIE1VSUQgd2hpY2ggd2FzIG1hZGUgYnkgdGhlIG1vZGVsCi0gICogU2hvdWxkIG9ubHkgYmUgc2V0dGFibGUgd2l0aGluIHRoaXMgZWxlbWVudAotICAqIFNldCBvbmNlIHVwb24gY3JlYXRpb24sIHlvdSBjYW4gY2hhbmdlIHRoZSBuYW1lCi0gICogYnV0IHRoZSBpZCB3aWxsIHJlbWFpbiBjb25zdGFudC4KLSAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldE1VSUQoU3RyaW5nIE1VSUQpCi0gIHsKLSAgICBmTVVJRCA9IE1VSUQ7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkgKCBQcm9wZXJ0eSBwcm9wZXJ0eSApCi0gIHsKLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHkuZ2V0TmFtZSgpOwotICAgIFByb3BlcnR5IG9sZFByb3BlcnR5ID0gZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICBmUHJvcGVydGllcy5wdXQocHJvcGVydHlOYW1lLHByb3BlcnR5KTsKLSAgICBpZiAob2xkUHJvcGVydHkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUFkZEV2ZW50IGV2ZW50ID0gbmV3IFByb3BlcnR5QWRkRXZlbnQodGhpcyxwcm9wZXJ0eSk7Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gZkxpc3RlbmVycy5lbGVtZW50cygpOwotICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgICgoRWxlbWVudExpc3RlbmVyKWUubmV4dEVsZW1lbnQoKSkucHJvcGVydHlBZGRlZChldmVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBPYmplY3Qgb2xkVmFsdWUgPSBvbGRQcm9wZXJ0eS5nZXRWYWx1ZSgpOwotICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gcHJvcGVydHkuZ2V0VmFsdWUoKTsKLSAgICAgIGlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKG9sZFZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUgPT0gbnVsbCB8fCAoIW9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpKQotICAgICAgICB7Ci0gICAgICAgICAgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMscHJvcGVydHksb2xkUHJvcGVydHkpOwotICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBmTGlzdGVuZXJzLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgKChFbGVtZW50TGlzdGVuZXIpZS5uZXh0RWxlbWVudCgpKS5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wZXJ0eS5OQU1FKSkgZk5hbWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUFzT2JqZWN0ICggU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSApCi0gIHsKLSAgICBzZXRQcm9wZXJ0eShuZXcgQmFzaWNQcm9wZXJ0eShuYW1lLHZhbHVlKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUFzU3RyaW5nICggU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSApCi0gIHsKLSAgICBzZXRQcm9wZXJ0eShuZXcgQmFzaWNQcm9wZXJ0eShuYW1lLHZhbHVlKSk7Ci0gIH0KLQotICBwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICByZXR1cm4gKFByb3BlcnR5KWZQcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlBc09iamVjdCAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIFByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UHJvcGVydHkobmFtZSk7Ci0gICAgcmV0dXJuIChwcm9wZXJ0eSA9PSBudWxsID8gbnVsbCA6IHByb3BlcnR5LmdldFZhbHVlKCkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUFzU3RyaW5nICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQcm9wZXJ0eShuYW1lKTsKLSAgICByZXR1cm4gKHByb3BlcnR5ID09IG51bGwgPyBudWxsIDogcHJvcGVydHkuZ2V0VmFsdWVBc1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQcm9wZXJ0aWVzICgpCi0gIHsKLSAgICByZXR1cm4gZlByb3BlcnRpZXMuZWxlbWVudHMoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNvbm5lY3QgKCBFbGVtZW50IHRhcmdldEVsZW1lbnQsIFN0cmluZyBvdXRib3VuZFJlbE5hbWUsIFN0cmluZyBpbmJvdW5kUmVsTmFtZSApCi0gIHsKLSAgICBpZiAoZk1vZGVsID09IG51bGwgfHwgZk1vZGVsICE9IHRhcmdldEVsZW1lbnQuZ2V0TW9kZWwoKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgRWxlbWVudCBzb3VyY2VFbGVtZW50ID0gdGhpczsKLSAgICBSZWwgb3V0Ym91bmRSZWwgPSBzb3VyY2VFbGVtZW50LmdldFJlbChvdXRib3VuZFJlbE5hbWUpOwotICAgIFJlbCBpbmJvdW5kUmVsID0gdGFyZ2V0RWxlbWVudC5nZXRSZWwoaW5ib3VuZFJlbE5hbWUpOwotICAgIENvbm5lY3Rpb25bXSBwYWlyID0gQmFzaWNDb25uZWN0aW9uLmNyZWF0ZVBhaXIob3V0Ym91bmRSZWwsdGFyZ2V0RWxlbWVudCxpbmJvdW5kUmVsLHNvdXJjZUVsZW1lbnQpOwotICAgIG91dGJvdW5kUmVsLmFkZENvbm5lY3Rpb24ocGFpcltCYXNpY0Nvbm5lY3Rpb24uT1VUQk9VTkRdKTsKLSAgICBpbmJvdW5kUmVsLmFkZENvbm5lY3Rpb24ocGFpcltCYXNpY0Nvbm5lY3Rpb24uSU5CT1VORF0pOwotICAgIFJlbEFkZEV2ZW50IGV2ZW50ID0gbmV3IFJlbEFkZEV2ZW50KHBhaXIpOwotICAgIEVudW1lcmF0aW9uIGVTb3VyY2UgPSBnZXRMaXN0ZW5lcnMoKTsKLSAgICBFbnVtZXJhdGlvbiBlVGFyZ2V0ID0gdGFyZ2V0RWxlbWVudC5nZXRMaXN0ZW5lcnMoKTsKLSAgICB3aGlsZSAoZVNvdXJjZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICAoKEVsZW1lbnRMaXN0ZW5lcillU291cmNlLm5leHRFbGVtZW50KCkpLnJlbEFkZGVkKGV2ZW50KTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoZVRhcmdldC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICAoKEVsZW1lbnRMaXN0ZW5lcillVGFyZ2V0Lm5leHRFbGVtZW50KCkpLnJlbEFkZGVkKGV2ZW50KTsKLSAgICB9Ci0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdCAoIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCwgU3RyaW5nIG91dGJvdW5kUmVsTmFtZSApCi0gIHsKLSAgICByZXR1cm4gZGlzY29ubmVjdCh0YXJnZXRFbGVtZW50LGdldFJlbChvdXRib3VuZFJlbE5hbWUpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RSZWwgKCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lICkKLSAgewotICAgIHJldHVybiBkaXNjb25uZWN0UmVsKGdldFJlbChvdXRib3VuZFJlbE5hbWUpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RBbGwgKCkKLSAgewotICAgIGlmIChmTW9kZWwgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIEVudW1lcmF0aW9uIGUgPSBmUmVscy5lbGVtZW50cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFJlbCByZWwgPSAoUmVsKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGRpc2Nvbm5lY3RSZWwocmVsKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RWxlbWVudHMgKCBTdHJpbmcgcmVsTmFtZSApCi0gIHsKLSAgICByZXR1cm4gZ2V0UmVsKHJlbE5hbWUpLmdldFRhcmdldEVsZW1lbnRzKCk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE51bWJlck9mRWxlbWVudHMgKCBTdHJpbmcgcmVsTmFtZSApCi0gIHsKLSAgICByZXR1cm4gZ2V0UmVsKHJlbE5hbWUpLmdldE51bWJlck9mVGFyZ2V0RWxlbWVudHMoKTsKLSAgfQotCi0gIHB1YmxpYyBSZWwgZ2V0UmVsICggU3RyaW5nIHJlbE5hbWUgKQotICB7Ci0gICAgUmVsIHJlbCA9IChSZWwpZlJlbHMuZ2V0KHJlbE5hbWUpOwotICAgIGlmIChyZWwgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWwgPSBuZXcgQmFzaWNSZWwocmVsTmFtZSx0aGlzKTsKLSAgICAgIGZSZWxzLnB1dChyZWxOYW1lLHJlbCk7Ci0gICAgfQotICAgIHJldHVybiByZWw7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UmVscyAoKQotICB7Ci0gICAgcmV0dXJuIGZSZWxzLmVsZW1lbnRzKCk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TGlzdGVuZXJzKCkKLSAgewotICAgIHJldHVybiBmTGlzdGVuZXJzLmVsZW1lbnRzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBkaXNjb25uZWN0ICggRWxlbWVudCB0YXJnZXRFbGVtZW50LCBSZWwgb3V0Ym91bmRSZWwgKQotICB7Ci0gICAgaWYgKGZNb2RlbCA9PSBudWxsIHx8IGZNb2RlbCAhPSB0YXJnZXRFbGVtZW50LmdldE1vZGVsKCkgfHwgb3V0Ym91bmRSZWwgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIENvbm5lY3Rpb24gb3V0Ym91bmRDb25uZWN0aW9uID0gb3V0Ym91bmRSZWwuZ2V0Q29ubmVjdGlvblRvKHRhcmdldEVsZW1lbnQpOwotICAgIGlmIChvdXRib3VuZENvbm5lY3Rpb24gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIENvbm5lY3Rpb24gaW5ib3VuZENvbm5lY3Rpb24gPSBvdXRib3VuZENvbm5lY3Rpb24uZ2V0T3Bwb3NpbmdDb25uZWN0aW9uKCk7Ci0gICAgUmVsUmVtb3ZlRXZlbnQgZXZlbnQgPSBuZXcgUmVsUmVtb3ZlRXZlbnQobmV3IENvbm5lY3Rpb24gW10ge291dGJvdW5kQ29ubmVjdGlvbixpbmJvdW5kQ29ubmVjdGlvbn0pOwotICAgICAgRW51bWVyYXRpb24gZSA9IGZMaXN0ZW5lcnMuZWxlbWVudHMoKTsKLSAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICAoKEVsZW1lbnRMaXN0ZW5lcillLm5leHRFbGVtZW50KCkpLnJlbFJlbW92ZWQoZXZlbnQpOwotICAgICAgfQotCi0gICAgRW51bWVyYXRpb24gZVRhcmdldCA9IHRhcmdldEVsZW1lbnQuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgd2hpbGUgKGVUYXJnZXQuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgKChFbGVtZW50TGlzdGVuZXIpZVRhcmdldC5uZXh0RWxlbWVudCgpKS5yZWxSZW1vdmVkKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBSZWwgaW5ib3VuZFJlbCA9IGluYm91bmRDb25uZWN0aW9uLmdldFJlbCgpOwotICAgIGJvb2xlYW4gZG9uZSA9IG91dGJvdW5kUmVsLnJlbW92ZUNvbm5lY3Rpb24ob3V0Ym91bmRDb25uZWN0aW9uKTsKLSAgICBpbmJvdW5kUmVsLnJlbW92ZUNvbm5lY3Rpb24oaW5ib3VuZENvbm5lY3Rpb24pOwotICAgIHJldHVybiBkb25lOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGlzY29ubmVjdFJlbCAoIFJlbCBvdXRib3VuZFJlbCApCi0gIHsKLSAgICBpZiAoZk1vZGVsID09IG51bGwgfHwgb3V0Ym91bmRSZWwgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIEVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBFbGVtZW50W291dGJvdW5kUmVsLmdldE51bWJlck9mVGFyZ2V0RWxlbWVudHMoKV07Ci0gICAgaW50IGkgPSAwOwotICAgIEVudW1lcmF0aW9uIGUgPSBvdXRib3VuZFJlbC5nZXRUYXJnZXRFbGVtZW50cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIGVsZW1lbnRzW2krK10gPSAoRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgfQotICAgIHdoaWxlIChpLS0gPiAwKQotICAgIHsKLSAgICAgIGRpc2Nvbm5lY3QoZWxlbWVudHNbaV0sb3V0Ym91bmRSZWwpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCkKLSAgewotICAgIHJldHVybiBnZXROYW1lKCk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjNiNDM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY01vZGVsIGltcGxlbWVudHMgTW9kZWwKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIFN0cmluZyBmTmFtZTsKLSAgcHJpdmF0ZSBIYXNodGFibGUgZkVsZW1lbnRzOwotICBwcml2YXRlIEVsZW1lbnQgZlJvb3Q7Ci0gIC8vVGhpcyBpcyB1c2VkIGJ5IHRoZSBNVUlECi0gIHByaXZhdGUgaW50IGZVbmlxdWVOdW1iZXJDb3VudGVyOwotCi0gIHB1YmxpYyBCYXNpY01vZGVsICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgZk5hbWUgPSBuYW1lOwotICAgIGZFbGVtZW50cyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBmUm9vdCA9IG51bGw7Ci0gICAgZlVuaXF1ZU51bWJlckNvdW50ZXIgPSAwOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZSAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIGZOYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKQotICB7Ci0gICAgcmV0dXJuIGZOYW1lOwotICB9Ci0KLQotICAvKgotICAqIHNpbXBsZSBjb3VudGVyIHRoYXQgaW5jcmVtZW50cyBlYWNoIGNhbGwgCi0gICovCi0gIHB1YmxpYyBpbnQgZ2V0VW5pcXVlTnVtYmVyKCkKLSAgewotICAgIGZVbmlxdWVOdW1iZXJDb3VudGVyKys7Ci0gICAgcmV0dXJuIGZVbmlxdWVOdW1iZXJDb3VudGVyOwotICB9Ci0KLSAgLyoKLSAgKiBUaGlzIHdpbGwgdXNlIGEgdW5pcXVlIG51bWJlciBhbmQgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIG5hbWUgCi0gICogQHBhcmFtIFN0cmluZyBuYW1lIG9mIHRoZSBlbGVtZW50Ci0gICogQHJldHVybiBTdHJpbmcgTVVJRAotICAqLwotICBwdWJsaWMgU3RyaW5nIG1ha2VNVUlEKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIG51bSA9IFN0cmluZy52YWx1ZU9mKGdldFVuaXF1ZU51bWJlcigpKTsKLSAgICBTdHJpbmcgbXVpZCA9IG5hbWUgKyBudW07Ci0gICAgcmV0dXJuIG11aWQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBib29sZWFuIHNldFJvb3RFbGVtZW50ICggRWxlbWVudCByb290ICkKLSAgewotICAgIGlmIChyb290LmdldE1vZGVsKCkgPT0gbnVsbCkKLSAgICAgIGFkZEVsZW1lbnQocm9vdCk7Ci0gICAgZWxzZSBpZiAocm9vdC5nZXRNb2RlbCgpICE9IHRoaXMpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZlJvb3QgPSByb290OwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgZ2V0Um9vdEVsZW1lbnQgKCkKLSAgewotICAgIGlmIChmUm9vdCA9PSBudWxsKSBmUm9vdCA9IGdldEZpcnN0RWxlbWVudCgpOwotICAgIHJldHVybiBmUm9vdDsKLSAgfQotCi0KLSAgLyoqCi0gICogR2V0IHRoZSBlbGVtZW50cyB0aGF0IGhhdmUgdGhpcyBuYW1lCi0gICogQHBhcmFtIFN0cmluZyBuYW1lIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IAotICAqIEByZXR1cm4gVmVjdG9yIGEgdmVjdG9yIG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGlzIG5hbWUKLSAgKiBUaGVzZSBlbGVtZW50cyBtYXkgYmUgb2YgZGlmZmVyZW50IHR5cGVzCi0gICoqLwotCi0gIHB1YmxpYyBWZWN0b3IgZ2V0RWxlbWVudHNCeU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBWZWN0b3IgdmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIEVudW1lcmF0aW9uIGUgPSBmRWxlbWVudHMua2V5cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgdmVjdG9yLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgfQotICAgIHJldHVybiB2ZWN0b3I7Ci0gIH0KLQotIAotCi0gIHB1YmxpYyBib29sZWFuIGFkZEVsZW1lbnQgKCBFbGVtZW50IGVsZW1lbnQgKQotICB7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0TW9kZWwoKSAhPSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgZkVsZW1lbnRzLnB1dChlbGVtZW50LGVsZW1lbnQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxlbWVudCAoIEVsZW1lbnQgZWxlbWVudCApCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXRNb2RlbCgpICE9IHRoaXMpIHJldHVybiBmYWxzZTsKLSAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICBpZiAoZlJvb3QgPT0gZWxlbWVudCkgZlJvb3QgPSBudWxsOwotICAgIHJldHVybiAoZkVsZW1lbnRzLnJlbW92ZShlbGVtZW50KSA9PSBlbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbGVtZW50cyAoKQotICB7Ci0gICAgcmV0dXJuIGZFbGVtZW50cy5lbGVtZW50cygpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZkVsZW1lbnRzICgpCi0gIHsKLSAgICByZXR1cm4gZkVsZW1lbnRzLnNpemUoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRWxlbWVudCAoIEVsZW1lbnQgZWxlbWVudCApCi0gIHsKLSAgICByZXR1cm4gZkVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnQpOwotICB9Ci0KLSAgcHJpdmF0ZSBFbGVtZW50IGdldEZpcnN0RWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKCk7Ci0gICAgcmV0dXJuIChlLmhhc01vcmVFbGVtZW50cygpID8gKEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY2MWE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotcHVibGljIGNsYXNzIEJhc2ljUHJvcGVydHkgaW1wbGVtZW50cyBQcm9wZXJ0eQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgU3RyaW5nIGZOYW1lOwotICBwcml2YXRlIE9iamVjdCBmVmFsdWU7Ci0KLSAgcHVibGljIEJhc2ljUHJvcGVydHkgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICBmTmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgQmFzaWNQcm9wZXJ0eSAoIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUgKQotICB7Ci0gICAgZk5hbWUgPSBuYW1lOwotICAgIGZWYWx1ZSA9IHZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNoYWxsb3cgY2xvbmUgb2YgdGhpcyA8Y29kZT5Qcm9wZXJ0eTwvY29kZT4uCi0gICogUHJvcGVydHkga2V5IGFuZCB2YWx1ZSByZWZlcmVuY2VzIGFyZSBjbG9uZWQsCi0gICogYnV0IHRoZSB2YWx1ZSBvYmplY3RzIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuCi0gICogQHJldHVybiBQcm9wZXJ0eSBBIG5ldyBQcm9wZXJ0eS4KLSAgKi8KLSAgcHVibGljIFByb3BlcnR5IHNoYWxsb3dDbG9uZSAoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCYXNpY1Byb3BlcnR5KGZOYW1lLGZWYWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBmTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlICggT2JqZWN0IHZhbHVlICkKLSAgewotICAgIGZWYWx1ZSA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSAoKQotICB7Ci0gICAgcmV0dXJuIGZWYWx1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlQXNTdHJpbmcgKCBTdHJpbmcgdmFsdWUgKQotICB7Ci0gICAgZlZhbHVlID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlQXNTdHJpbmcgKCkKLSAgewotICAgIHJldHVybiAoZlZhbHVlICE9IG51bGwgPyBmVmFsdWUudG9TdHJpbmcoKSA6IG51bGwpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljUmVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY1JlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTMzNmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljUmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIEJhc2ljUmVsIGltcGxlbWVudHMgUmVsCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZk5hbWU7Ci0gIHByaXZhdGUgRWxlbWVudCBmU291cmNlRWxlbWVudDsKLSAgcHJpdmF0ZSBWZWN0b3IgZkNvbm5lY3Rpb25zOwotCi0gIHB1YmxpYyBCYXNpY1JlbCAoIFN0cmluZyBuYW1lLCBFbGVtZW50IHNvdXJjZUVsZW1lbnQgKQotICB7Ci0gICAgZk5hbWUgPSBuYW1lOwotICAgIGZTb3VyY2VFbGVtZW50ID0gc291cmNlRWxlbWVudDsKLSAgICBmQ29ubmVjdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBmTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGdldFNvdXJjZUVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmU291cmNlRWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRUYXJnZXRFbGVtZW50cyAoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBFbGVtZW50RW51bWVyYXRpb24oZkNvbm5lY3Rpb25zLmVsZW1lbnRzKCkpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZlRhcmdldEVsZW1lbnRzICgpCi0gIHsKLSAgICByZXR1cm4gZkNvbm5lY3Rpb25zLnNpemUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZENvbm5lY3Rpb24gKCBDb25uZWN0aW9uIGNvbm5lY3Rpb24gKQotICB7Ci0gICAgZkNvbm5lY3Rpb25zLmFkZEVsZW1lbnQoY29ubmVjdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVDb25uZWN0aW9uICggQ29ubmVjdGlvbiBjb25uZWN0aW9uICkKLSAgewotICAgIHJldHVybiBmQ29ubmVjdGlvbnMucmVtb3ZlRWxlbWVudChjb25uZWN0aW9uKTsKLSAgfQotCi0gIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb25UbyAoIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCApCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZkNvbm5lY3Rpb25zLmVsZW1lbnRzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgQ29ubmVjdGlvbiBjID0gKENvbm5lY3Rpb24pZS5uZXh0RWxlbWVudCgpOwotICAgICAgaWYgKGMuZ2V0RWxlbWVudCgpID09IHRhcmdldEVsZW1lbnQpIHJldHVybiBjOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCkKLSAgewotICAgIHJldHVybiBnZXROYW1lKCk7Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIEVsZW1lbnRFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uCi0gIHsKLSAgICBwcml2YXRlIEVudW1lcmF0aW9uIGZDb25uZWN0aW9uRW51bWVyYXRpb247Ci0KLSAgICBwdWJsaWMgRWxlbWVudEVudW1lcmF0aW9uICggRW51bWVyYXRpb24gY29ubmVjdGlvbkVudW1lcmF0aW9uICkKLSAgICB7Ci0gICAgICBmQ29ubmVjdGlvbkVudW1lcmF0aW9uID0gY29ubmVjdGlvbkVudW1lcmF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cyAoKQotICAgIHsKLSAgICAgIHJldHVybiBmQ29ubmVjdGlvbkVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQgKCkKLSAgICB7Ci0gICAgICByZXR1cm4gKChDb25uZWN0aW9uKWZDb25uZWN0aW9uRW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSkuZ2V0RWxlbWVudCgpOwotICAgIH0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Db25uZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Db25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjI3MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgYSBjb25uZWN0aW9uIHRoYXQgdGllcyBhIFJlbCB0byBhIE5vZGUuCi0qIE5vcm1hbGx5IENvbm5lY3Rpb24gb2JqZWN0cyBhcmUgbWFudWZhY3R1cmVkIGFuZCBtYW5hZ2VkIHdpdGhpbiB0aGUKLSogZGVyaXZlZCBjbGFzc2VzIG9mIHRoZSBNb2RlbCBmcmFtZXdvcmssIGFuZCBhcmUgbm90IG1hbmlwdWxhdGVkIGJ5Ci0qIHRoZSBjYWxsZXIgZGlyZWN0bHkuCi0qLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgUmVsIHRoYXQgb3ducyB0aGlzIGNvbm5lY3Rpb24uCi0gICogQHJldHVybiBSZWwgVGhlIFJlbCB0aGF0IG93bnMgdGhpcyBjb25uZWN0aW9uLgotICAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbCwgdGhhdCBpcywgYSBDb25uZWN0aW9uCi0gICogY2Fubm90IGV4aXN0IHdpdGhvdXQgYSBSZWwgdG8gb3duIGl0LgotICAqLwotICBwdWJsaWMgUmVsIGdldFJlbCAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBOb2RlIHRoYXQgdGhpcyBjb25uZWN0aW9uIHBvaW50cyB0by4KLSAgKiBAcmV0dXJuIE5vZGUgVGhlIE5vZGUgdGhpcyBjb25uZWN0aW9uIHBvaW50cyB0by4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwsIHRoYXQgaXMsIGEgQ29ubmVjdGlvbgotICAqIGNhbm5vdCBleGlzdCB3aXRob3V0IGEgTm9kZSB0byBwb2ludCB0by4KLSAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBvcHBvc2luZyBjb25uZWN0aW9uIHRvIHRoaXMgY29ubmVjdGlvbi4KLSAgKiBDb25uZWN0aW9uIG9iamVjdHMgYWx3YXlzIGV4aXN0IGluIHBhaXJzLCB0aGF0IGlzLAotICAqIGlmIG5vZGUgIlBhcmVudCIgaGFzIGEgcmVsYXRpb25zaGlwIG5hbWVkICJDaGlsZHJlbiIKLSAgKiBjb250YWluaW5nIGEgY29ubmVjdGlvbiB0byBub2RlICJDaGlsZCIsIHRoZW4gdGhlcmUKLSAgKiBtdXN0IGV4aXN0IGFuIG9wcG9zaW5nIGNvbm5lY3Rpb24gZnJvbSAiQ2hpbGQiIHRvCi0gICogIlBhcmVudCIgaW4gc29tZSByZWxhdGlvbnNoaXAgb2YgIkNoaWxkIiAoZm9yIGV4YW1wbGUsCi0gICogaW4gYSByZWxhdGlvbnNoaXAgY2FsbGVkICJQYXJlbnRzIikuCi0gICogQHJldHVybiBDb25uZWN0aW9uIFRoZSBvcHBvc2luZyBjb25uZWN0aW9uLgotICAqIEFzIGEgZ2VuZXJhbCBydWxlLCB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgcmV0dXJuIG51bGwuCi0gICogSXQgbWF5IG9ubHkgcmV0dXJuIG51bGwgZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiB0aGUgcGFpcgotICAqIG9mIGNvbm5lY3Rpb25zLgotICAqLwotICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRPcHBvc2luZ0Nvbm5lY3Rpb24gKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzNzIxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgZWxlbWVudHMgdGhhdCBjYW4gYmUgbWFuYWdlZCBieSBhIE1vZGVsLgotKiBFdmVyeSBlbGVtZW50IGhhcyBhIG5hbWUsIGEgc2V0IG9mIHByb3BlcnRpZXMsIGFuZCBhIHNldCBvZiByZWxhdGlvbnNoaXBzCi0qIHRvIG90aGVyIGVsZW1lbnRzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIDxjb2RlPkVsZW1lbnQ8L2NvZGU+Ci0gICogb2YgdGhlIHNhbWUgY2xhc3MgYW5kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgbW9kZWwsCi0gICogYnV0IHdpdGggbm8gUHJvcGVydGllcywgUmVscyBvciBMaXN0ZW5lcnMgZXhjZXB0IGZvcgotICAqIHRoZSB7QGxpbmsgUHJvcGVydHkjTkFNRSBOQU1FfSBwcm9wZXJ0eS4KLSAgKiBAcmV0dXJuIE9iamVjdCBBIG5ldyBFbGVtZW50LgotICAqLwotICBwdWJsaWMgRWxlbWVudCBzaGFsbG93Q2xvbmUgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgPGNvZGU+RWxlbWVudDwvY29kZT4KLSAgKiBvZiB0aGUgc2FtZSBjbGFzcyBhbmQgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBtb2RlbAotICAqIGFuZCB3aXRoIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgRWxlbWVudCdzIFByb3BlcnRpZXMuCi0gICogVGhlIFJlbHMgYW5kIExpc3RlbmVycyBhcmUgbm90IGNsb25lZC4KLSAgKiBAcmV0dXJuIEVsZW1lbnQgQSBuZXcgRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEVsZW1lbnQgZGVlcENsb25lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1vZGVsIHRoaXMgZWxlbWVudCBiZWxvbmdzIHRvLCBvciBudWxsIGlmIHRoZSBlbGVtZW50Ci0gICogaGFzIG5vdCBiZWVuIGFkZGVkIHRvIGEgbW9kZWwuIFNlZSBhbHNvIHtAbGluayAjaXNWYWxpZCBpc1ZhbGlkKCl9LgotICAqIEByZXR1cm4gTW9kZWwgVGhlIG1vZGVsIHRoaXMgZWxlbWVudCBiZWxvbmdzIHRvLCBvciBudWxsIGlmIG5vbmUuCi0gICovCi0gIHB1YmxpYyBNb2RlbCBnZXRNb2RlbCAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBlbGVtZW50IGJlbG9uZ3MgdG8gYSBtb2RlbC4KLSAgKiBTZWUgYWxzbyB7QGxpbmsgI2dldE1vZGVsIGdldE1vZGVsKCl9LgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgZWxlbWVudCBiZWxvbmdzIHRvIGEgbW9kZWwuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQgKCk7Ci0KLSAgLyoqCi0gICogUmVtb3ZlcyB0aGlzIGVsZW1lbnQgZnJvbSB0aGUgbW9kZWwgdG8gd2hpY2ggaXQgY3VycmVudGx5IGJlbG9uZ3MuCi0gICogQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwge0BsaW5rICNnZXRNb2RlbCBnZXRNb2RlbCgpfSB3aWxsIHJldHVybgotICAqIG51bGwgYW5kIHtAbGluayAjaXNWYWxpZCBpc1ZhbGlkKCl9IHdpbGwgcmV0dXJuIGZhbHNlLgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBlbGVtZW50IHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tCi0gICogaXRzIG1vZGVsLiBUaGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGJlbG9uZwotICAqIHRvIGFueSBtb2RlbC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlICgpOwotCi0gIC8qKgotICAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50IGFuZCB1cGRhdGVzIHRoZSAibmFtZSIgcHJvcGVydHkuCi0gICogRXZlcnkgZWxlbWVudCBpbmNsdWRlcyBhIHByb3BlcnR5IGNhbGxlZCAibmFtZSIgKHNlZSBQcm9wZXJ0eS5OQU1FKQotICAqIHdob3NlIHZhbHVlIGlzIHRoZSBzYW1lIHN0cmluZyBhcyBwYXNzZWQgaW50byBzZXROYW1lKCkuCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50LgotICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lICggU3RyaW5nIG5hbWUgKTsKLQotICAvKioKLSAgKgotICAqLwotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lciAoIEVsZW1lbnRMaXN0ZW5lciBsaXN0ZW5lciApOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50LgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAqIEFkZHMgb3Igc2V0cyBhIHByb3BlcnR5IG9mIHRoaXMgZWxlbWVudC4KLSAgKiBQcm9wZXJ0aWVzIHNldCB1c2luZyB0aGlzIG1ldGhvZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIGVpdGhlcgotICAqIHtAbGluayAjZ2V0UHJvcGVydHkgZ2V0UHJvcGVydHkoKX0gb3IKLSAgKiB7QGxpbmsgI2dldFByb3BlcnR5QXNPYmplY3QgZ2V0UHJvcGVydHlBc09iamVjdCgpfS4KLSAgKiBFdmVyeSBlbGVtZW50IGluY2x1ZGVzIGEgcHJvcGVydHkgY2FsbGVkICJuYW1lIiAoc2VlIFByb3BlcnR5Lk5BTUUpCi0gICogd2hvc2UgdmFsdWUgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHBhc3NlZCBpbnRvIHtAbGluayAjc2V0TmFtZSBzZXROYW1lKCl9LgotICAqIEFueSBwcmV2aW91cyBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgcmVwbGFjZWQuCi0gICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBzZXQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5ICggUHJvcGVydHkgcHJvcGVydHkgKTsKLQotICAvKioKLSAgKiBBZGRzIG9yIHNldHMgYSBwcm9wZXJ0eSBvZiB0aGlzIGVsZW1lbnQuCi0gICogUHJvcGVydGllcyBzZXQgdXNpbmcgdGhpcyBtZXRob2QgY2FuIGJlIHJldHJpZXZlZCB1c2luZyBlaXRoZXIKLSAgKiB7QGxpbmsgI2dldFByb3BlcnR5IGdldFByb3BlcnR5KCl9IG9yCi0gICoge0BsaW5rICNnZXRQcm9wZXJ0eUFzT2JqZWN0IGdldFByb3BlcnR5QXNPYmplY3QoKX0uCi0gICogRXZlcnkgZWxlbWVudCBpbmNsdWRlcyBhIHByb3BlcnR5IGNhbGxlZCAibmFtZSIgKHNlZSBQcm9wZXJ0eS5OQU1FKQotICAqIHdob3NlIHZhbHVlIGlzIHRoZSBzYW1lIHN0cmluZyBhcyBwYXNzZWQgaW50byB7QGxpbmsgI3NldE5hbWUgc2V0TmFtZSgpfS4KLSAgKiBBbnkgcHJldmlvdXMgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIHJlcGxhY2VkLgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuCi0gICogQHBhcmFtIHZhbHVlIFRoZSBPYmplY3QgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlBc09iamVjdCAoIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUgKTsKLQotICAvKioKLSAgKiBBZGRzIG9yIHNldHMgYSBTdHJpbmcgcHJvcGVydHkgb2YgdGhpcyBlbGVtZW50LgotICAqIFByb3BlcnRpZXMgc2V0IHVzaW5nIHRoaXMgbWV0aG9kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgZWl0aGVyCi0gICoge0BsaW5rICNnZXRQcm9wZXJ0eSBnZXRQcm9wZXJ0eSgpfSwKLSAgKiB7QGxpbmsgI2dldFByb3BlcnR5QXNPYmplY3QgZ2V0UHJvcGVydHlBc09iamVjdCgpfSBvcgotICAqIHtAbGluayAjZ2V0UHJvcGVydHlBc1N0cmluZyBnZXRQcm9wZXJ0eUFzU3RyaW5nKCl9LgotICAqIEV2ZXJ5IGVsZW1lbnQgaW5jbHVkZXMgYSBwcm9wZXJ0eSBjYWxsZWQgIm5hbWUiIChzZWUgUHJvcGVydHkuTkFNRSkKLSAgKiB3aG9zZSB2YWx1ZSBpcyB0aGUgc2FtZSBzdHJpbmcgYXMgcGFzc2VkIGludG8ge0BsaW5rICNzZXROYW1lIHNldE5hbWUoKX0uCi0gICogQW55IHByZXZpb3VzIHByb3BlcnR5IHdpdGggdGhlIHNhbWUgbmFtZSBpcyByZXBsYWNlZC4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgotICAqIEBwYXJhbSB2YWx1ZSBUaGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5QXNTdHJpbmcgKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KLSAgKiBFdmVyeSBlbGVtZW50IGluY2x1ZGVzIGEgcHJvcGVydHkgY2FsbGVkICJuYW1lIiAoc2VlIFByb3BlcnR5Lk5BTUUpCi0gICogd2hvc2UgdmFsdWUgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHBhc3NlZCBpbnRvIHtAbGluayAjc2V0TmFtZSBzZXROYW1lKCl9LgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXR1cm4uCi0gICogQHJldHVybiBQcm9wZXJ0eSBUaGUgcHJvcGVydHksIG9yIG51bGwgaWYgbm9uZS4KLSAgKi8KLSAgcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5ICggU3RyaW5nIG5hbWUgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBPYmplY3QgdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsCi0gICogaWYgdGhlcmUgaXMgbm9uZS4KLSAgKiBFdmVyeSBlbGVtZW50IGluY2x1ZGVzIGEgcHJvcGVydHkgY2FsbGVkICJuYW1lIiAoc2VlIFByb3BlcnR5Lk5BTUUpCi0gICogd2hvc2UgdmFsdWUgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHBhc3NlZCBpbnRvIHtAbGluayAjc2V0TmFtZSBzZXROYW1lKCl9LgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXR1cm4uCi0gICogQHJldHVybiBPYmplY3QgVGhlIHByb3BlcnR5IHZhbHVlIGFzIGFuIE9iamVjdCwgb3IgbnVsbCBpZiBub25lLgotICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5QXNPYmplY3QgKCBTdHJpbmcgbmFtZSApOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwKLSAgKiBpZiB0aGVyZSBpcyBub25lLgotICAqIEV2ZXJ5IGVsZW1lbnQgaW5jbHVkZXMgYSBwcm9wZXJ0eSBjYWxsZWQgIm5hbWUiIChzZWUgUHJvcGVydHkuTkFNRSkKLSAgKiB3aG9zZSB2YWx1ZSBpcyB0aGUgc2FtZSBzdHJpbmcgYXMgcGFzc2VkIGludG8ge0BsaW5rICNzZXROYW1lIHNldE5hbWUoKX0uCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHVybi4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgcHJvcGVydHkgdmFsdWUgYXMgYSBTdHJpbmcsIG9yIG51bGwgaWYgbm9uZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUFzU3RyaW5nICggU3RyaW5nIG5hbWUgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFsbCBwcm9wZXJ0aWVzIG9mIHRoaXMgZWxlbWVudC4KLSAgKiBUaGVyZSBpcyBhbHdheXMgYXQgbGVhc3Qgb25lIHByb3BlcnR5IHRoYXQgY2FycmllcyB0aGUKLSAgKiBuYW1lIG9mIHRoaXMgZWxlbWVudCAoc2VlIHtAbGluayAjc2V0TmFtZSBzZXROYW1lKCl9KS4KLSAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIEFuIGVudW1lcmF0aW9uIG9mIGFsbCBwcm9wZXJ0aWVzIG9mIHRoaXMgZWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFByb3BlcnRpZXMgKCk7Ci0KLSAgLyoqCi0gICogQ3JlYXRlcyBhIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhpcyBlbGVtZW50IGFuZCBhbm90aGVyLgotICAqIEJvdGggcmVsYXRpb25zaGlwcyBhcmUgaWRlbnRpZmllZCBieSBuYW1lcy4gVGhlIG5hbWVzIG9mIGFsbCB0aGUKLSAgKiBvdXRib3VuZCByZWxhdGlvbnNoaXBzIG9mIGEgZWxlbWVudCBtdXN0IGJlIG11dHVhbGx5IHVuaXF1ZS4KLSAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjb25uZWN0IHRvLgotICAqIEBwYXJhbSBvdXRib3VuZFJlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCB0byBjb250YWluIHRoZQotICAqIGNvbm5lY3Rpb24gdG8gdGhlIGVsZW1lbnQuCi0gICogQHBhcmFtIGluYm91bmRSZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgdG8gY29udGFpbiB0aGUKLSAgKiBpbnZlcnNlIGNvbm5lY3Rpb24gYmFjayB0byB0aGlzIGVsZW1lbnQuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCi0gICogQm90aCBlbGVtZW50cyBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBtb2RlbCwgb3RoZXIgZmFsc2UgaXMgcmV0dXJuZWQuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGNvbm5lY3QgKCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBvdXRib3VuZFJlbE5hbWUsIFN0cmluZyBpbmJvdW5kUmVsTmFtZSApOwotCi0gIC8qKgotICAqIERpc21hbnRsZXMgdGhlIGNvbm5lY3Rpb24gdG8gYW5vdGhlciBlbGVtZW50IGluIGEgZ2l2ZW4gcmVsYXRpb25zaGlwLgotICAqIFRoZSBpbnZlcnNlIGNvbm5lY3Rpb24gaXMgYWxzbyBhdXRvbWF0aWNhbGx5IGRpc21hbnRsZWQuCi0gICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gZGlzY29ubmVjdCBmcm9tLgotICAqIEBwYXJhbSBvdXRib3VuZFJlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCBjb250YWluaW5nCi0gICogdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGVsZW1lbnQuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgcmVtb3ZlZCBzdWNjZXNzZnVsbHkuCi0gICogQm90aCBlbGVtZW50cyBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBtb2RlbCwgb3RoZXIgZmFsc2UgaXMgcmV0dXJuZWQuCi0gICogSWYgdGhlIGVsZW1lbnRzIGFyZSBub3QgY29ubmVjdGVkIHRocm91Z2ggdGhlIGdpdmVuIHJlbGF0aW9uc2hpcCwgdGhlbgotICAqIGZhbHNlIGlzIHJldHVybmVkLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0ICggRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lICk7Ci0KLSAgLyoqCi0gICogRGlzbWFudGxlcyB0aGUgY29ubmVjdGlvbiB0byBhbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIHJlbGF0aW9uc2hpcC4KLSAgKiBUaGUgaW52ZXJzZSBjb25uZWN0aW9ucyBhcmUgYWxzbyBhdXRvbWF0aWNhbGx5IGRpc21hbnRsZWQuCi0gICogQHBhcmFtIG91dGJvdW5kUmVsTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIGFsbCBjb25uZWN0aW9ucyBhcmUgcmVtb3ZlZCBzdWNjZXNzZnVsbHkuCi0gICogVGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBiZWxvbmcgdG8gYSBtb2RlbC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdFJlbCAoIFN0cmluZyBvdXRib3VuZFJlbE5hbWUgKTsKLQotICAvKioKLSAgKiBEaXNtYW50bGVzIGFsbCBjb25uZWN0aW9ucyBmcm9tIHRoaXMgZWxlbWVudC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBhbGwgY29ubmVjdGlvbnMgYXJlIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgotICAqIFRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgYmVsb25nIHRvIGEgbW9kZWwuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RBbGwgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgZWxlbWVudHMKLSAgKiBjb25uZWN0ZWQgdGhydSB0aGUgZ2l2ZW4gcmVsYXRpb25zaGlwLgotICAqIEBwYXJhbSByZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gICogQHJldHVybiBFbnVtZXJhdGlvbiBUaGUgZWxlbWVudHMgaW4gdGhlIHJlbGF0aW9uc2hpcC4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwuCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbGVtZW50cyAoIFN0cmluZyByZWxOYW1lICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBnaXZlbiByZWxhdGlvbnNoaXAuCi0gICogQHBhcmFtIHJlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLSAgKiBAcmV0dXJuIGludCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSByZWxhdGlvbnNoaXAuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlLgotICAqLwotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRMaXN0ZW5lcnMoKTsKLQotICBwdWJsaWMgaW50IGdldE51bWJlck9mRWxlbWVudHMgKCBTdHJpbmcgcmVsTmFtZSApOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHJlbGF0aW9uc2hpcCBvYmplY3Qgb2YgdGhlIGdpdmVuIG5hbWUuCi0gICogQHBhcmFtIHJlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLSAgKiBAcmV0dXJuIGludCBUaGUgcmVsYXRpb25zaGlwLiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwuCi0gICogSW4gb3RoZXIgd29yZHMsIGFueSByZWZlcmVuY2UgdG8gYSByZWxhdGlvbnNoaXAgbmFtZSBhdXRvbWF0aWNhbGx5Ci0gICogYnJpbmdzIGEgY29ycmVzcG9uZGluZyBSZWwgb2JqZWN0IGludG8gZXhpc3RlbmNlLiBDYXJlbGVzcyBuYW1pbmcKLSAgKiBtYXkgcmVzdWx0IGluIHRoZSB7QGxpbmsgI2dldFJlbHMgZ2V0UmVscygpfSBtZXRob2QgcmV0dXJuaW5nIGFuIGVudW1lcmF0aW9uIG9mCi0gICogbW9yZSByZWxhdGlvbnNoaXBzIHRoYW4gd291bGQgYmUgbWVhbmluZ2Z1bCwgZWZmaWNpZW50IG9yIHVzZWZ1bC4KLSAgKi8KLSAgcHVibGljIFJlbCBnZXRSZWwgKCBTdHJpbmcgcmVsTmFtZSApOwotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIGtub3duIHJlbGF0aW9uc2hpcHMuCi0gICogQHJldHVybiBFbnVtZXJhdGlvbiBUaGUgb3V0Ym91bmQgcmVsYXRpb25zaGlwcyBvZiB0aGUgZWxlbWVudC4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwuCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRSZWxzICgpOwotCi0KLSAgLyoKLSAgKiBUaGVyZSBpcyBhIG5lZWQgc29tZXRpbWVzIGZvciBlYWNoIGVsZW1lbnQgaW4gYSBtb2RlbCB0byBoYXZlIGEgdW5pcXVlIGlkZW50aWZpZXIuCi0gICogTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBsZWZ0IHRvIGEgbmFtZSwgYnV0IHNpbmNlIHRoZSBlbGVtZW50IG1ha2VyIGdpdmVzIGl0IGl0cyBuYW1lCi0gICogdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBhIG1vZGVsIGNvdWxkIGhhdmUgdHdvIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZS4gSWYgdGhleSAKLSAgKiBhcmUgdGhlIHNhbWUgZWxlbWVudCB0eXBlIHRoZW4gdGhlcmUgd291bGQgYmUgbm8gd2F5IHRvIGRpZmZlcmVuY2lhdGUgYmV0d2VlbiB0aGUgdHdvLgotICAqIFRoZSBmb2xsb3dpbmcgZ2V0dGVyIGFuZCBzZXR0ZXIgd2lsbCBwcm92aWRlIGEgdW5pcXVlIGlkZW50aWZpZXIuIFRoaXMgaWRlbnRpZmllciB3aWxsIGJlIGtub3duIAotICAqIGFzIHRoZSBtdWlkIG9yIE1vZGVsIFVuaXF1ZSBJZGVudGlmaWVyLiBVbmxpa2UgYSB1dWlkIGl0IHdpbGwgb25seSBiZSBhc3N1cmVkIHVuaXF1ZW5lc3MgCi0gICogd2l0aGluIGl0cyBvd24gbW9kZWwuIFRoZSBpbnRlbnRpb24gaXMgdG8gdXNlIGEgdW5pcXVlIG51bWJlciBhcHBlbmRlZCB0byB0aGUgZW5kIAotICAqIG9mIHRoZSBuYW1lLgotICAqIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGdldHRlcgotICAqIEByZXR1cm4gU3RyaW5nIHRoZSB1bmlxdWUgaWRlbnRpZmllcgotICAqLwotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TVVJRCgpOwotICAKLSAgCi0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMwY2ZkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotKiBUaGlzIGlzIHdoZXJlIHdlIHN0b3JlIGFsbCB0aGUgc3RhdGUgZGF0YSB0aGF0IHZhcmlvdXMgVUlzCi0qIChzdWNoIGFzIHRoZSBOZXdXU0RMQ3JlYXRpb25XaXphcmQpIGNhcHR1cmUgZnJvbSB0aGUgdXNlcgotKiBhbmQgdGhlbiBuZWVkIHRvIHByb2Nlc3MuCi0qLwotcHVibGljIGNsYXNzIEVsZW1lbnRBZGFwdGVyIGltcGxlbWVudHMgRWxlbWVudExpc3RlbmVyCi17Ci0gIC8qKgotICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5IGFuZCB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcHJvcGVydHlBZGRlZCAoIFByb3BlcnR5QWRkRXZlbnQgZXZlbnQgKQotICB7Ci0gIH0KLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGluIHRoZSBtb2RlbCBjaGFuZ2VzLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5LCBvbGQgdmFsdWUKLSAgKiBhbmQgbmV3IHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQgKCBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ICkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpbiB0aGUgbW9kZWwgaXMgcmVtb3ZlZC4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBwcm9wZXJ0eSBhbmQgb2xkIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQgKCBQcm9wZXJ0eVJlbW92ZUV2ZW50IGV2ZW50ICkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHkgYW5kIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCByZWxBZGRlZCAoIFJlbEFkZEV2ZW50IGV2ZW50ICkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHkgYW5kIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkICggUmVsUmVtb3ZlRXZlbnQgZXZlbnQgKQotICB7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4MTllMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogVGhpcyBpcyB3aGVyZSB3ZSBzdG9yZSBhbGwgdGhlIHN0YXRlIGRhdGEgdGhhdCB2YXJpb3VzIFVJcwotKiAoc3VjaCBhcyB0aGUgTmV3V1NETENyZWF0aW9uV2l6YXJkKSBjYXB0dXJlIGZyb20gdGhlIHVzZXIKLSogYW5kIHRoZW4gbmVlZCB0byBwcm9jZXNzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudExpc3RlbmVyCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHkgYW5kIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUFkZGVkICggUHJvcGVydHlBZGRFdmVudCBldmVudCApOwotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgaW4gdGhlIG1vZGVsIGNoYW5nZXMuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHksIG9sZCB2YWx1ZQotICAqIGFuZCBuZXcgdmFsdWUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZCAoIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgKTsKLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGluIHRoZSBtb2RlbCBpcyByZW1vdmVkLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5IGFuZCBvbGQgdmFsdWUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZCAoIFByb3BlcnR5UmVtb3ZlRXZlbnQgZXZlbnQgKTsKLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBwcm9wZXJ0eSBhbmQgdmFsdWUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHJlbEFkZGVkICggUmVsQWRkRXZlbnQgZXZlbnQgKTsKLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBwcm9wZXJ0eSBhbmQgdmFsdWUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQgKCBSZWxSZW1vdmVFdmVudCBldmVudCApOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Nb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmMjk3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgYSBzaW1wbGUgZGF0YSBtb2RlbCBjb25zaXN0aW5nIG9mCi0qIGEgbmV0d29yayBvZiBuYW1lZCBub2RlcyAoY2xhc3MgTm9kZSkuIEV2ZXJ5IG5vZGUgY2FycmllcyBhIHNldAotKiBvZiBuYW1lZCBwcm9wZXJ0aWVzIChjbGFzcyBQcm9wZXJ0eSkuIE5vZGVzIGFyZSBpbnRlcnJlbGF0ZWQgYnkKLSogcmVsYXRpb25zaGlwcyAoY2xhc3MgUmVsKSBhbmQgY29ubmVjdGlvbnMgKGNsYXNzIENvbm5lY3Rpb24pLgotKiBFYWNoIE1vZGVsIGtlZXBzIGEgcmVnaXN0cnkgb2YgYWxsIG9mIGl0cyBub2RlcywgYW5kIGtlZXBzIGEKLSogcmVmZXJlbmNlIHRvIG9uZSAicm9vdCIgbm9kZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc3RhcnRpbmcKLSogcG9pbnQgZm9yIG5hdmlnYXRpb24uCi0qLwotcHVibGljIGludGVyZmFjZSBNb2RlbAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIG1vZGVsLgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2RlbC4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZSAoIFN0cmluZyBuYW1lICk7Ci0KLSAgLyoqCi0gICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgbW9kZWwuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIG5hbWUgb2YgdGhlIG1vZGVsLiBUaGlzIG11c3Qgbm90IGJlIG51bGwuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKTsKLQotICAvKioKLSAgKiBTZXRzIGEgbm9kZSBhcyB0aGUgcm9vdCBvZiB0aGUgbW9kZWwuIElmIHRoZSBub2RlIGRvZXMgbm90Ci0gICogYmVsb25nIHRvIGEgbW9kZWwsIHRoZW4gaXQgaXMgYWRkZWQgYXV0b21hdGljYWxseS4gSWYgdGhlCi0gICogbm9kZSBhbHJlYWR5IGJlbG9uZ3MgdG8gYW5vdGhlciBtb2RlbCwgdGhlbiB0aGUgcm9vdCBub2RlCi0gICogaXMgbm90IHNldCBhbmQgbWV0aG9kIHJldHVybnMgZmFsc2UuCi0gICogQHBhcmFtIHJvb3QgVGhlIG5vZGUgdG8gc2V0IGFzIHRoZSByb290LiBUaGUgbm9kZSBtdXN0Ci0gICogYmVsb25nIGVpdGhlciB0byB0aGlzIG1vZGVsIG9yIHRvIG5vIG1vZGVsLiBUaGlzIG11c3QKLSAgKiBub3QgYmUgbnVsbC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiB0aGUgbm9kZSB3YXMgc2V0IGFzIHRoZSByb290LgotICAqIFRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UgaWYgdGhlIGdpdmVuIG5vZGUgYWxyZWFkeSBiZWxvbmdzCi0gICogdG8gYW5vdGhlciBtb2RlbC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0Um9vdEVsZW1lbnQgKCBFbGVtZW50IHJvb3QgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSByb290IG5vZGUuIFRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGEgbm9kZQotICAqIGV4Y2VwdCBvbiBhbiBlbXB0eSBNb2RlbC4gSWYgc2V0Um9vdE5vZGUoKSBoYXMgbm90IGJlZW4KLSAgKiBjYWxsZWQsIG9yIGlmIHRoZSBsYXN0IHJvb3Qgbm9kZSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbCwKLSAgKiB0aGVuIHRoZSBtZXRob2Qgd2lsbCBzZWxlY3QgYW5kIHJldHVybiBhbiBhcmJpdHJhcnkgbm9kZSBhcwotICAqIHRoZSByb290LiBUaGlzIG1ldGhvZCB3aWxsIGNvbnNpc3RlbnRseSByZXR1cm4gdGhlIHNhbWUgbm9kZQotICAqIHVudGlsIGVpdGhlcgotICAqIChhKSBzZXRSb290Tm9kZSgpIGlzIGNhbGxlZCB3aXRoIGEgZGlmZmVyZW50IG5vZGUgb3IKLSAgKiAoYikgcmVtb3ZlTm9kZSgpIGlzIGNhbGxlZCB0byByZW1vdmUgdGhlIG5vZGUgZnJvbSB0aGUgbW9kZWwuCi0gICogQHJldHVybiBOb2RlIFRoZSBjdXJyZW50IHJvb3Qgbm9kZSwgb3IgbnVsbCBpZiB0aGUgbW9kZWwgaXMgZW1wdHkuCi0gICovCi0KLSAgcHVibGljIEVsZW1lbnQgZ2V0Um9vdEVsZW1lbnQgKCk7Ci0KLSAgLyoqCi0gICogR2V0IHRoZSBlbGVtZW50cyB0aGF0IGhhdmUgdGhpcyBuYW1lCi0gICogQHBhcmFtIFN0cmluZyBuYW1lIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IAotICAqIEByZXR1cm4gVmVjdG9yIGEgdmVjdG9yIG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGlzIG5hbWUKLSAgKiBUaGVzZSBlbGVtZW50cyBtYXkgYmUgb2YgZGlmZmVyZW50IHR5cGVzCi0gICoqLwotCi0gIHB1YmxpYyBWZWN0b3IgZ2V0RWxlbWVudHNCeU5hbWUoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAqIEFkZHMgYSBub2RlIHRvIHRoZSBtb2RlbC4gSWYgdGhlIG5vZGUgYWxyZWFkeSBiZWxvbmdzIHRvIGFub3RoZXIKLSAgKiBtb2RlbCB0aGVuIGl0IHdpbGwgbm90IGJlIGFkZGVkLgotICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGFkZC4gVGhpcyBtdXN0IG5vdCBiZSBudWxsLgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBub2RlIHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkuCi0gICogVGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSBpZiB0aGUgZ2l2ZW4gbm9kZSBhbHJlYWR5IGJlbG9uZ3MgdG8KLSAgKiB0aGUgY3VycmVudCBtb2RlbCBvciB0byBhbm90aGVyIG1vZGVsLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhZGRFbGVtZW50ICggRWxlbWVudCBlbGVtZW50ICk7Ci0KLSAgLyoqCi0gICogUmVtb3ZlcyBhIG5vZGUgZnJvbSB0aGUgbW9kZWwuCi0gICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gcmVtb3ZlLiBUaGlzIG11c3Qgbm90IGJlIG51bGwuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgdGhlIG5vZGUgd2FzIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgotICAqIFRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UgaWYgdGhlIGdpdmVuIG5vZGUgZG9lcyBub3QgYmVsb25nCi0gICogdG8gdGhpcyBtb2RlbC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxlbWVudCAoIEVsZW1lbnQgZWxlbWVudCApOwotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIG5vZGVzIGluIHRoZSBtb2RlbCBhbmQgaW4gbm8KLSAgKiBwYXJ0aWN1bGFyIG9yZGVyLAotICAqIEByZXR1cm4gRW51bWVyYXRpb24gQW4gZW51bWVyYXRpb24gb2YgYWxsIG5vZGVzIGluIHRoZSBtb2RlbC4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwuCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbGVtZW50cyAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIG1vZGVsLgotICAqIEByZXR1cm4gaW50IFRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIG1vZGVsLgotICAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJPZkVsZW1lbnRzICgpOwotCi0gIC8qKgotICAqIERldGVybWluZXMgaWYgdGhpcyBtb2RlbCBjb250YWlucyB0aGUgZ2l2ZW4gbm9kZS4KLSAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBjaGVjayBmb3IuIFRoaXMgbXVzdCBub3QgYmUgbnVsbC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgbW9kZWwgY29udGFpbnMgdGhlIG5vZGUuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRWxlbWVudCAoIEVsZW1lbnQgZWxlbWVudCApOwotCi0gIC8qCi0gICogVGhpcyBmdW5jdGlvbiB3aWxsIHByb3ZpZGUgdGhlIG5leHQgbnVtYmVyIGluIHRoZSBxdWV1ZSBmb3IgdGhlIE1VSUQKLSAgKgotICAqLwotICBwdWJsaWMgaW50IGdldFVuaXF1ZU51bWJlcigpOwotCi0gIC8qCi0gICogaGVyZXMgd2hhdCB3ZSBjYWxsIGZyb20gdGhlIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIFN0cmluZyBtYWtlTVVJRChTdHJpbmcgbmFtZSk7Ci0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3OTNiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgcHJvcGVydGllcyBvZiBhIE5vZGUuCi0qIEV2ZXJ5IHByb3BlcnR5IGhhcyBhbiBpbW11dGFibGUgbmFtZSBhbmQgYSB2YWx1ZSBvZiB0eXBlIE9iamVjdC4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogRXZlcnkgTm9kZSBoYXMgYSBwcm9wZXJ0eSBjYWxsZWQgIm5hbWUiIHRoYXQgaXMgZXF1aXZhbGVudAotICAqIHRvIGFuZCBrZXB0IHN5bmNocm9uaXplZCB3aXRoIE5vZGUuZ2V0TmFtZSgpIGFuZCBOb2RlLnNldE5hbWUoKS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hhbGxvdyBjbG9uZSBvZiB0aGlzIDxjb2RlPlByb3BlcnR5PC9jb2RlPi4KLSAgKiBQcm9wZXJ0eSBrZXkgYW5kIHZhbHVlIHJlZmVyZW5jZXMgYXJlIGNsb25lZCwKLSAgKiBidXQgdGhlIHZhbHVlIG9iamVjdHMgdGhlbXNlbHZlcyBhcmUgbm90IGNsb25lZC4KLSAgKiBAcmV0dXJuIFByb3BlcnR5IEEgbmV3IFByb3BlcnR5LgotICAqLwotICBwdWJsaWMgUHJvcGVydHkgc2hhbGxvd0Nsb25lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBub2RlLgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBuYW1lIG9mIHRoaXMgbm9kZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkuCi0gICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuIEFueSBwcmV2aW91cyB2YWx1ZSBpcyByZXBsYWNlZC4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsdWUgKCBPYmplY3QgdmFsdWUgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgotICAqIEByZXR1cm4gT2JqZWN0IFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LCBwb3NzaWJseSBudWxsLgotICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlICgpOwotCi0gIC8qKgotICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgYXMgYSBzdHJpbmcuCi0gICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgdG8gc2V0LiBBbnkgcHJldmlvdXMgdmFsdWUgaXMgcmVwbGFjZWQuCi0gICogVGhlIHR5cGUgb2YgdGhlIHByZXZpb3VzIHZhbHVlLCBpZiBhbnksIGlzIG9mIG5vIGNvbnNlcXVlbmNlLgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUFzU3RyaW5nICggU3RyaW5nIHZhbHVlICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBhcyBhIHN0cmluZy4KLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBhcyBhIHN0cmluZywgcG9zc2libHkgbnVsbC4KLSAgKiBJZiB0aGUgc2V0IHZhbHVlIGlzIGFuIGFyYml0cmFyeSBPYmplY3QsIHRoZW4gT2JqZWN0LnRvU3RyaW5nKCkgaXMKLSAgKiByZXR1cm5lZC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nICgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlBZGRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlBZGRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmZjMDU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5QWRkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogQ2FycmllcyBkYXRhIHJlbGV2YW50IHRvIHdoZW4gYSBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCi0qLwotcHVibGljIGNsYXNzIFByb3BlcnR5QWRkRXZlbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBCYXNpY0VsZW1lbnQgZkVsZW1lbnQ7Ci0KLSAgLyoqCi0gICogVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAqLwotICBwcm90ZWN0ZWQgUHJvcGVydHkgZlByb3BlcnR5OwotCi0gCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdGhhdCB3YXMgYWRkZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgcHJvcGVydHkncyB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBQcm9wZXJ0eUFkZEV2ZW50ICggQmFzaWNFbGVtZW50IGVsZW1lbnQsIFByb3BlcnR5IHByb3BlcnR5KQotICB7Ci0gICAgZkVsZW1lbnQgPSBlbGVtZW50OwotICAgIGZQcm9wZXJ0eSA9IHByb3BlcnR5OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1vZGVsIHRoYXQgY2hhbmdlZCAodGhhdCBwcm9kdWNlZCB0aGlzIGV2ZW50KS4KLSAgICogQHJldHVybiBUaW55TW9kZWwgVGhlIG1vZGVsIHRoYXQgY2hhbmdlZC4KLSAgICovCi0gIHB1YmxpYyBCYXNpY0VsZW1lbnQgZ2V0RWxlbWVudCAoKQotICB7Ci0gICAgcmV0dXJuIGZFbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1vZGVsIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgcHJvcGVydHkgdGhhdCB3YXMgYWRkZWQuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkgKCkKLSAgewotICAgIHJldHVybiBmUHJvcGVydHk7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWRlN2NiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogQ2FycmllcyBkYXRhIHJlbGV2YW50IHRvIHdoZW4gYSBwcm9wZXJ0eSBpcyBjaGFuZ2VkIGluIHRoZSBtb2RlbC4KLSovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VFdmVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFRoZSBtb2RlbCB0aGUgY2hhbmdlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIEJhc2ljRWxlbWVudCBmRWxlbWVudDsKLQotICAvKioKLSAgKiBUaGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLgotICAqLwotICBwcm90ZWN0ZWQgUHJvcGVydHkgZlByb3BlcnR5OwotCi0gIC8qKgotICAqIFRoZSBwcm9wZXJ0eSdzIG9sZCB2YWx1ZS4KLSAgKi8KLSAgcHJvdGVjdGVkIFByb3BlcnR5IGZPbGRQcm9wZXJ0eTsKLQotICAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRoYXQgY2hhbmdlZC4KLSAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuCi0gICAqIEBwYXJhbSBvbGRWYWx1ZSBUaGUgcHJvcGVydHkncyBvbGQgdmFsdWUuCi0gICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgcHJvcGVydHkncyBuZXcgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHlDaGFuZ2VFdmVudCAoIEJhc2ljRWxlbWVudCBlbGVtZW50ICwgUHJvcGVydHkgcHJvcGVydHksIFByb3BlcnR5IG9sZFByb3BlcnR5ICkKLSAgewotICAgIGZFbGVtZW50ID0gZWxlbWVudDsKLSAgICBmUHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICBmT2xkUHJvcGVydHkgPSBvbGRQcm9wZXJ0eTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCB0aGF0IGNoYW5nZWQgKHRoYXQgcHJvZHVjZWQgdGhpcyBldmVudCkuCi0gICAqIEByZXR1cm4gVGlueU1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqLwotICBwdWJsaWMgQmFzaWNFbGVtZW50IGdldEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuCi0gICAqIEByZXR1cm4gVGlueU1vZGVsIFRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkgKCkKLSAgewotICAgIHJldHVybiBmUHJvcGVydHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbW9kZWwgcHJvcGVydHkncyBvbGQgdmFsdWUuCi0gICAqIEByZXR1cm4gVGlueU1vZGVsIFRoZSBwcm9wZXJ0eSdzIG9sZCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBQcm9wZXJ0eSBnZXRPbGRQcm9wZXJ0eSAoKQotICB7Ci0gICAgcmV0dXJuIGZPbGRQcm9wZXJ0eTsKLSAgfQotCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Qcm9wZXJ0eVJlbW92ZUV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Qcm9wZXJ0eVJlbW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDY4ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlSZW1vdmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotKiBDYXJyaWVzIGRhdGEgcmVsZXZhbnQgdG8gd2hlbiBhIHByb3BlcnR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgbW9kZWwuCi0qLwotcHVibGljIGNsYXNzIFByb3BlcnR5UmVtb3ZlRXZlbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBCYXNpY0VsZW1lbnQgZkVsZW1lbnQ7Ci0KLSAgLyoqCi0gICogVGhlIHByb3BlcnR5IHRoYXQgd2FzIHJlbW92ZWQuCi0gICovCi0gIHByb3RlY3RlZCBQcm9wZXJ0eSBmUHJvcGVydHk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRoYXQgY2hhbmdlZC4KLSAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0aGF0IHdhcyByZW1vdmVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnR5J3MgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHlSZW1vdmVFdmVudCAoIEJhc2ljRWxlbWVudCBlbGVtZW50LCBQcm9wZXJ0eSBwcm9wZXJ0eSkKLSAgewotICAgIGZFbGVtZW50ID0gZWxlbWVudDsKLSAgICBmUHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCB0aGF0IGNoYW5nZWQgKHRoYXQgcHJvZHVjZWQgdGhpcyBldmVudCkuCi0gICAqIEByZXR1cm4gVGlueU1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqLwotICBwdWJsaWMgQmFzaWNFbGVtZW50IGdldEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBwcm9wZXJ0eSB0aGF0IHdhcyByZW1vdmVkLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgcHJvcGVydHkgdGhhdCB3YXMgcmVtb3ZlZC4KLSAgICovCi0gIHB1YmxpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eSAoKQotICB7Ci0gICAgcmV0dXJuIGZQcm9wZXJ0eTsKLSAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MWE2ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGFic3RyYWN0IGNsYXNzIGZvciByZWxhdGlvbnNoaXBzIGluIGEgTW9kZWwuCi0qLwotcHVibGljIGludGVyZmFjZSBSZWwKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcmVsYXRpb25zaGlwLiBSZWxhdGlvbnNoaXAgbmFtZXMKLSAgKiBjYW5ub3QgYmUgY2hhbmdlZC4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbm9kZSB0aGF0IG93bnMgdGhpcyByZWxhdGlvbnNoaXAuCi0gICogQHJldHVybiBOb2RlIFRoZSBub2RlIHRoYXQgb3ducyB0aGlzIHJlbGF0aW9uc2hpcC4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwsIHRoYXQgaXMsIHJlbGF0aW9uc2hpcHMKLSAgKiBjYW5ub3QgZXhpc3QgaW4gdGhlIGFic2VuY2Ugb2YgYSBub2RlLgotICAqLwotICBwdWJsaWMgRWxlbWVudCBnZXRTb3VyY2VFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgbm9kZXMgaW4gdGhpcyByZWxhdGlvbnNoaXAuCi0gICogQHJldHVybiBFbnVtZXJhdGlvbiBUaGUgbm9kZXMgaW4gdGhpcyByZWxhdGlvbnNoaXAuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgotICAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0VGFyZ2V0RWxlbWVudHMgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoaXMgcmVsYXRpb25zaGlwLgotICAqIEByZXR1cm4gaW50IFRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhpcyByZWxhdGlvbnNoaXAuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlLgotICAqLwotICBwdWJsaWMgaW50IGdldE51bWJlck9mVGFyZ2V0RWxlbWVudHMgKCk7Ci0KLSAgLyoqCi0gICogQWRkcyBhIGNvbm5lY3Rpb24gdG8gdGhpcyByZWxhdGlvbnNoaXAuIFRoaXMgbWV0aG9kIGlzCi0gICogaW50ZW5kZWQgZm9yIHVzZSBieSBkZXJpdmF0aW9ucyBvZiB0aGUgTW9kZWwgZnJhbWV3b3JrLAotICAqIG5vdCBieSB1c2VycyBvZiB0aGUgZnJhbWV3b3JrLiBDb25uZWN0aW9uIG9iamVjdHMgc2hvdWxkCi0gICogb25seSBiZSBjb25zdHJ1Y3RlZCwgYWRkZWQsIHJlbW92ZWQgYW5kIHJldHJpZXZlZCBieQotICAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgTm9kZSBhbmQgUmVsIGludGVyZmFjZXMuCi0gICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gYWRkLgotICAqLwotICBwdWJsaWMgdm9pZCBhZGRDb25uZWN0aW9uICggQ29ubmVjdGlvbiBjb25uZWN0aW9uICk7Ci0KLSAgLyoqCi0gICogUmVtb3ZlcyBhIGNvbm5lY3Rpb24gZnJvbSB0aGlzIHJlbGF0aW9uc2hpcC4gVGhpcyBtZXRob2QgaXMKLSAgKiBpbnRlbmRlZCBmb3IgdXNlIGJ5IGRlcml2YXRpb25zIG9mIHRoZSBNb2RlbCBmcmFtZXdvcmssCi0gICogbm90IGJ5IHVzZXJzIG9mIHRoZSBmcmFtZXdvcmsuIENvbm5lY3Rpb24gb2JqZWN0cyBzaG91bGQKLSAgKiBvbmx5IGJlIGNvbnN0cnVjdGVkLCBhZGRlZCwgcmVtb3ZlZCBhbmQgcmV0cmlldmVkIGJ5Ci0gICogaW1wbGVtZW50YXRpb25zIG9mIHRoZSBOb2RlIGFuZCBSZWwgaW50ZXJmYWNlcy4KLSAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byByZW1vdmUuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGZvdW5kIGFuZCByZW1vdmVkLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVDb25uZWN0aW9uICggQ29ubmVjdGlvbiBjb25uZWN0aW9uICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgQ29ubmVjdGlvbiBvYmplY3QgZm9yIHRoZSBnaXZlbiB0YXJnZXQgbm9kZS4KLSAgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGRlcml2YXRpb25zIG9mIHRoZSBNb2RlbAotICAqIGZyYW1ld29yaywgbm90IGJ5IHVzZXJzIG9mIHRoZSBmcmFtZXdvcmsuIENvbm5lY3Rpb24gb2JqZWN0cwotICAqIHNob3VsZCBvbmx5IGJlIGNvbnN0cnVjdGVkLCBhZGRlZCwgcmVtb3ZlZCBhbmQgcmV0cmlldmVkIGJ5Ci0gICogaW1wbGVtZW50YXRpb25zIG9mIHRoZSBOb2RlIGFuZCBSZWwgaW50ZXJmYWNlcy4KLSAgKiBAcGFyYW0gdGFyZ2V0Tm9kZSBUaGUgbm9kZSB0byBmaW5kIHRoZSBDb25uZWN0aW9uIHRvLgotICAqIEByZXR1cm4gQ29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiwgb3IgbnVsbCBpZiBub25lLgotICAqLwotICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uVG8gKCBFbGVtZW50IHRhcmdldEVsZW1lbnQgKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsQWRkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbEFkZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYTEwZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsQWRkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotLyoqCi0qIENhcnJpZXMgZGF0YSByZWxldmFudCB0byB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotKi8KLXB1YmxpYyBjbGFzcyBSZWxBZGRFdmVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFRoZSBtb2RlbCB0aGUgY2hhbmdlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIENvbm5lY3Rpb24gZk91dEJvdW5kOwotCi0gIC8qKgotICAqIFRoZSBtb2RlbCB0aGUgY2hhbmdlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIENvbm5lY3Rpb24gZkluQm91bmQ7Ci0KLSAgLyoqCi0gICogVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAqLwotICBwcm90ZWN0ZWQgUHJvcGVydHkgZlByb3BlcnR5OwotCi0gCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdGhhdCB3YXMgYWRkZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgcHJvcGVydHkncyB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBSZWxBZGRFdmVudCAoQ29ubmVjdGlvbltdIHBhaXIpCi0gIHsKLSAgICAgZk91dEJvdW5kID0gcGFpcltCYXNpY0Nvbm5lY3Rpb24uT1VUQk9VTkRdOwotICAgICBmSW5Cb3VuZCA9IHBhaXJbQmFzaWNDb25uZWN0aW9uLklOQk9VTkRdOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG91dGJvdW5kIGNvbm5lY3Rpb24gdGhhdCBjaGFuZ2VkIAotICAqKi8KLSAgcHVibGljIENvbm5lY3Rpb24gZ2V0T3V0Qm91bmRDb25uZWN0aW9uICgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZWQgcmVsIG5hbWUgCi0gICoqLwotICBwdWJsaWMgU3RyaW5nIGdldE91dEJvdW5kUmVsTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kLmdldFJlbCgpLmdldE5hbWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFuZ2VkIHJlbAotICAqKi8KLSAgcHVibGljIFJlbCBnZXRPdXRCb3VuZFJlbCgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kLmdldFJlbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZWQgcmVsIG5hbWUgCi0gICoqLwotICBwdWJsaWMgU3RyaW5nIGdldEluQm91bmRSZWxOYW1lKCkKLSAgewotICAgIHJldHVybiBmSW5Cb3VuZC5nZXRSZWwoKS5nZXROYW1lKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhbmdlZCByZWwKLSAgKiovCi0gIHB1YmxpYyBSZWwgZ2V0SW5Cb3VuZFJlbCgpCi0gIHsKLSAgICByZXR1cm4gZkluQm91bmQuZ2V0UmVsKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgb3V0Ym91bmQgZWxlbWVudCB0aGF0IGNoYW5nZWQgCi0gICoqLwotICBwdWJsaWMgRWxlbWVudCBnZXRQYXJlbnRFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kLmdldEVsZW1lbnQoKTsKLSAgfQotCi0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5ib3VuZCBjb25uZWN0aW9uIHRoYXQgY2hhbmdlZCAKLSAgKiovCi0gIHB1YmxpYyBFbGVtZW50IGdldENoaWxkRWxlbWVudCAoKQotICB7Ci0gICAgcmV0dXJuIGZJbkJvdW5kLmdldEVsZW1lbnQoKTsKLSAgfQotCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9SZWxSZW1vdmVFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsUmVtb3ZlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmYTRmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9SZWxSZW1vdmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotLyoqCi0qIENhcnJpZXMgZGF0YSByZWxldmFudCB0byB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotKi8KLXB1YmxpYyBjbGFzcyBSZWxSZW1vdmVFdmVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFRoZSBtb2RlbCB0aGUgY2hhbmdlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIENvbm5lY3Rpb24gZk91dEJvdW5kOwotCi0gIC8qKgotICAqIFRoZSBtb2RlbCB0aGUgY2hhbmdlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIENvbm5lY3Rpb24gZkluQm91bmQ7Ci0KLSAgLyoqCi0gICogVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAqLwotICBwcm90ZWN0ZWQgUHJvcGVydHkgZlByb3BlcnR5OwotCi0gCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdGhhdCB3YXMgYWRkZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgcHJvcGVydHkncyB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBSZWxSZW1vdmVFdmVudCAoQ29ubmVjdGlvbltdIHBhaXIpCi0gIHsKLSAgICAgZk91dEJvdW5kID0gcGFpcltCYXNpY0Nvbm5lY3Rpb24uT1VUQk9VTkRdOwotICAgICBmSW5Cb3VuZCA9IHBhaXJbQmFzaWNDb25uZWN0aW9uLklOQk9VTkRdOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1vZGVsIHRoYXQgY2hhbmdlZCAodGhhdCBwcm9kdWNlZCB0aGlzIGV2ZW50KS4KLSAgICogQHJldHVybiBUaW55TW9kZWwgVGhlIG1vZGVsIHRoYXQgY2hhbmdlZC4KLSAgICovCi0gIHB1YmxpYyBDb25uZWN0aW9uIGdldE91dEJvdW5kICgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1vZGVsIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgcHJvcGVydHkgdGhhdCB3YXMgYWRkZWQuCi0gICAqLwotICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRJbkJvdW5kICgpCi0gIHsKLSAgICByZXR1cm4gZkluQm91bmQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhbmdlZCByZWwgbmFtZSAKLSAgKiovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T3V0Qm91bmRSZWxOYW1lKCkKLSAgewotICAgIHJldHVybiBmT3V0Qm91bmQuZ2V0UmVsKCkuZ2V0TmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZWQgcmVsCi0gICoqLwotICBwdWJsaWMgUmVsIGdldE91dEJvdW5kUmVsKCkKLSAgewotICAgIHJldHVybiBmT3V0Qm91bmQuZ2V0UmVsKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhbmdlZCByZWwgbmFtZSAKLSAgKiovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5Cb3VuZFJlbE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZJbkJvdW5kLmdldFJlbCgpLmdldE5hbWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFuZ2VkIHJlbAotICAqKi8KLSAgcHVibGljIFJlbCBnZXRJbkJvdW5kUmVsKCkKLSAgewotICAgIHJldHVybiBmSW5Cb3VuZC5nZXRSZWwoKTsKLSAgfQotICAKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgb3V0Ym91bmQgZWxlbWVudCB0aGF0IGNoYW5nZWQgCi0gICoqLwotICBwdWJsaWMgRWxlbWVudCBnZXRPdXRCb3VuZEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmT3V0Qm91bmQuZ2V0RWxlbWVudCgpOwotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbmJvdW5kIGNvbm5lY3Rpb24gdGhhdCBjaGFuZ2VkIAotICAqKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0SW5ib3VuZEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmSW5Cb3VuZC5nZXRFbGVtZW50KCk7Ci0gIH0KLSAgCi0KLSAgCi19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0Fic3RyYWN0Q2xpZW50RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9BYnN0cmFjdENsaWVudEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNjAzMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0Fic3RyYWN0Q2xpZW50RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRmFjdG9yeUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2VDbGllbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENsaWVudEZyYWdtZW50IGV4dGVuZHMgQ29tbWFuZEZhY3RvcnlGcmFnbWVudAotewotICBwcm90ZWN0ZWQgSVdlYlNlcnZpY2VDbGllbnQgd2ViU2VydmljZUNsaWVudF87Ci0gIHByb3RlY3RlZCBFbnZpcm9ubWVudCAgICAgICBlbnZpcm9ubWVudF87Ci0gIHByb3RlY3RlZCBJQ29udGV4dCAgICAgICAgICBjb250ZXh0XzsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gICAgICAgIHNlbGVjdGlvbl87Ci0gIHByb3RlY3RlZCBTdHJpbmcgICAgICAgICAgICBtb2R1bGVfOwotICBwcm90ZWN0ZWQgU3RyaW5nICAgICAgICAgICAgZWFyXzsKLSAgICAKLSAgcHVibGljIEFic3RyYWN0Q2xpZW50RnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBBYnN0cmFjdENsaWVudEZyYWdtZW50KCBBYnN0cmFjdENsaWVudEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotCXN1cGVyKCBmcmFnbWVudCApOyAKLQkKLQl3ZWJTZXJ2aWNlQ2xpZW50XyA9IGZyYWdtZW50LndlYlNlcnZpY2VDbGllbnRfOwotCWVudmlyb25tZW50XyAgICAgID0gZnJhZ21lbnQuZW52aXJvbm1lbnRfOwotCWNvbnRleHRfICAgICAgICAgID0gZnJhZ21lbnQuY29udGV4dF87Ci0Jc2VsZWN0aW9uXyAgICAgICAgPSBmcmFnbWVudC5zZWxlY3Rpb25fOwotCW1vZHVsZV8gICAgICAgICAgID0gZnJhZ21lbnQubW9kdWxlXzsKLQllYXJfICAgICAgICAgICAgICA9IGZyYWdtZW50LmVhcl87Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZSggSVdlYlNlcnZpY2VDbGllbnQgd2ViU2VydmljZSApCi0gIHsKLQl3ZWJTZXJ2aWNlQ2xpZW50XyA9IHdlYlNlcnZpY2U7ICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApCi0gIHsKLQllbnZpcm9ubWVudF8gPSBlbnZpcm9ubWVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29udGV4dCggSUNvbnRleHQgY29udGV4dCApCi0gIHsJICAKLQljb250ZXh0XyA9IGNvbnRleHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbiggSVNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICB7Ci0Jc2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoIFN0cmluZyBtb2R1bGUgKQotICB7Ci0JbW9kdWxlXyA9IG1vZHVsZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWFyKCBTdHJpbmcgZWFyICkKLSAgewotCWVhcl8gPSBlYXI7ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0Fic3RyYWN0U2VydmljZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5ODcxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRmFjdG9yeUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlcnZpY2VGcmFnbWVudCBleHRlbmRzIENvbW1hbmRGYWN0b3J5RnJhZ21lbnQKLXsKLSAgcHJvdGVjdGVkIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2VfOwotICBwcm90ZWN0ZWQgRW52aXJvbm1lbnQgZW52aXJvbm1lbnRfOwotICBwcm90ZWN0ZWQgSUNvbnRleHQgICAgY29udGV4dF87Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uICBzZWxlY3Rpb25fOwotICBwcm90ZWN0ZWQgU3RyaW5nICAgICAgbW9kdWxlXzsKLSAgcHJvdGVjdGVkIFN0cmluZyAgICAgIGVhcl87Ci0gICAgCi0gIHB1YmxpYyBBYnN0cmFjdFNlcnZpY2VGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFic3RyYWN0U2VydmljZUZyYWdtZW50KCBBYnN0cmFjdFNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgCi0JCi0Jd2ViU2VydmljZV8gID0gZnJhZ21lbnQud2ViU2VydmljZV87Ci0JZW52aXJvbm1lbnRfID0gZnJhZ21lbnQuZW52aXJvbm1lbnRfOwotCWNvbnRleHRfICAgICA9IGZyYWdtZW50LmNvbnRleHRfOwotCXNlbGVjdGlvbl8gICA9IGZyYWdtZW50LnNlbGVjdGlvbl87Ci0JbW9kdWxlXyAgICAgID0gZnJhZ21lbnQubW9kdWxlXzsKLQllYXJfICAgICAgICAgPSBmcmFnbWVudC5lYXJfOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgKQotICB7Ci0Jd2ViU2VydmljZV8gPSB3ZWJTZXJ2aWNlOyAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudCggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0JZW52aXJvbm1lbnRfID0gZW52aXJvbm1lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbnRleHQoIElDb250ZXh0IGNvbnRleHQgKQotICB7CSAgCi0JY29udGV4dF8gPSBjb250ZXh0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oIElTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgewotCXNlbGVjdGlvbl8gPSBzZWxlY3Rpb247ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9kdWxlKCBTdHJpbmcgbW9kdWxlICkKLSAgewotCW1vZHVsZV8gPSBtb2R1bGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVhciggU3RyaW5nIGVhciApCi0gIHsKLQllYXJfID0gZWFyOyAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9Bc3NlbWJsZUNsaWVudEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvQXNzZW1ibGVDbGllbnRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzZhMGVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9Bc3NlbWJsZUNsaWVudEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQXNzZW1ibGVDbGllbnRGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q2xpZW50RnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBBc3NlbWJsZUNsaWVudEZyYWdtZW50KCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgQXNzZW1ibGVDbGllbnRGcmFnbWVudCggQXNzZW1ibGVDbGllbnRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZ2V0SUNvbW1hbmRGYWN0b3J5KCkgCi0gIHsKLQlJQ29tbWFuZEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCi0JaWYoIHdlYlNlcnZpY2VDbGllbnRfID09IG51bGwgKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoIG5ldyBWZWN0b3IoKSApOwotCX0KLQllbHNlCi0JewotCSAgZmFjdG9yeSA9IHdlYlNlcnZpY2VDbGllbnRfLmFzc2VtYmxlKCBlbnZpcm9ubWVudF8sIGNvbnRleHRfLCBzZWxlY3Rpb25fLCBtb2R1bGVfLCBlYXJfICk7CQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0Fzc2VtYmxlU2VydmljZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmN2QwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0U2VydmljZUZyYWdtZW50IAotewotICBwdWJsaWMgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudCggQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0Jc3VwZXIoIGZyYWdtZW50ICk7ICAKLSAgfQotICAKLSAgcHVibGljIE9iamVjdCBjbG9uZSgpIAotICB7Ci0JcmV0dXJuIG5ldyBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudCgpOwotICB9Ci0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBnZXRJQ29tbWFuZEZhY3RvcnkoKSAKLSAgewotCUlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkKLQlpZiggd2ViU2VydmljZV8gPT0gbnVsbCApCi0JewotCSAgZmFjdG9yeSA9IG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeSggbmV3IFZlY3RvcigpICk7Ci0JfQotCWVsc2UKLQl7Ci0JICBmYWN0b3J5ID0gd2ViU2VydmljZV8uYXNzZW1ibGUoIGVudmlyb25tZW50XywgY29udGV4dF8sIHNlbGVjdGlvbl8sIG1vZHVsZV8sIGVhcl8gKTsJCi0JfQotCQotCXJldHVybiBmYWN0b3J5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGVwbG95Q2xpZW50RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9EZXBsb3lDbGllbnRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZhNDU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9EZXBsb3lDbGllbnRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIERlcGxveUNsaWVudEZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDbGllbnRGcmFnbWVudCAKLXsKLSAgcHVibGljIERlcGxveUNsaWVudEZyYWdtZW50KCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgRGVwbG95Q2xpZW50RnJhZ21lbnQoIERlcGxveUNsaWVudEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotCXN1cGVyKCBmcmFnbWVudCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLSAgewotCXJldHVybiBuZXcgRGVwbG95Q2xpZW50RnJhZ21lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZ2V0SUNvbW1hbmRGYWN0b3J5KCkgCi0gIHsKLQlJQ29tbWFuZEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCi0JaWYoIHdlYlNlcnZpY2VDbGllbnRfID09IG51bGwgKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoIG5ldyBWZWN0b3IoKSApOwotCX0KLQllbHNlCi0JewotCSAgZmFjdG9yeSA9IHdlYlNlcnZpY2VDbGllbnRfLmRlcGxveSggZW52aXJvbm1lbnRfLCBjb250ZXh0Xywgc2VsZWN0aW9uXywgbW9kdWxlXywgZWFyXyApOwkKLQl9Ci0JCi0JcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9EZXBsb3lTZXJ2aWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9EZXBsb3lTZXJ2aWNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzZGMzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGVwbG95U2VydmljZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRGVwbG95U2VydmljZUZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQoIERlcGxveVNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IERlcGxveVNlcnZpY2VGcmFnbWVudCgpOwotICB9Ci0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBnZXRJQ29tbWFuZEZhY3RvcnkoKSAKLSAgewotCUlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkKLQlpZiggd2ViU2VydmljZV8gPT0gbnVsbCApCi0JewotCSAgZmFjdG9yeSA9IG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeSggbmV3IFZlY3RvcigpICk7Ci0JfQotCWVsc2UKLQl7Ci0JICBmYWN0b3J5ID0gd2ViU2VydmljZV8uZGVwbG95KCBlbnZpcm9ubWVudF8sIGNvbnRleHRfLCBzZWxlY3Rpb25fLCBtb2R1bGVfLCBlYXJfICk7CQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0RldmVsb3BDbGllbnRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0RldmVsb3BDbGllbnRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY5NDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9EZXZlbG9wQ2xpZW50RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBEZXZlbG9wQ2xpZW50RnJhZ21lbnQgZXh0ZW5kcyBBYnN0cmFjdENsaWVudEZyYWdtZW50IAotewotICBwdWJsaWMgRGV2ZWxvcENsaWVudEZyYWdtZW50KCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgRGV2ZWxvcENsaWVudEZyYWdtZW50KCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0Jc3VwZXIoIGZyYWdtZW50ICk7ICAKLSAgfQotICAKLSAgcHVibGljIE9iamVjdCBjbG9uZSgpIAotICB7Ci0JcmV0dXJuIG5ldyBEZXZlbG9wQ2xpZW50RnJhZ21lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZ2V0SUNvbW1hbmRGYWN0b3J5KCkgCi0gIHsKLQlJQ29tbWFuZEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCi0JaWYoIHdlYlNlcnZpY2VDbGllbnRfID09IG51bGwgKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoIG5ldyBWZWN0b3IoKSApOwotCX0KLQllbHNlCi0JewotCSAgZmFjdG9yeSA9IHdlYlNlcnZpY2VDbGllbnRfLmRldmVsb3AoIGVudmlyb25tZW50XywgY29udGV4dF8sIHNlbGVjdGlvbl8sIG1vZHVsZV8sIGVhcl8gKTsJCi0JfQotCQotCXJldHVybiBmYWN0b3J5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGV2ZWxvcFNlcnZpY2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0RldmVsb3BTZXJ2aWNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxZWRlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGV2ZWxvcFNlcnZpY2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIERldmVsb3BTZXJ2aWNlRnJhZ21lbnQgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2VGcmFnbWVudCAKLXsKLSAgcHVibGljIERldmVsb3BTZXJ2aWNlRnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBEZXZlbG9wU2VydmljZUZyYWdtZW50KCBEZXZlbG9wU2VydmljZUZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotCXN1cGVyKCBmcmFnbWVudCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLSAgewotCXJldHVybiBuZXcgRGV2ZWxvcFNlcnZpY2VGcmFnbWVudCgpOwotICB9Ci0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBnZXRJQ29tbWFuZEZhY3RvcnkoKSAKLSAgewotCUlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkKLQlpZiggd2ViU2VydmljZV8gPT0gbnVsbCApCi0JewotCSAgZmFjdG9yeSA9IG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeSggbmV3IFZlY3RvcigpICk7Ci0JfQotCWVsc2UKLQl7Ci0JICBmYWN0b3J5ID0gd2ViU2VydmljZV8uZGV2ZWxvcCggZW52aXJvbm1lbnRfLCBjb250ZXh0Xywgc2VsZWN0aW9uXywgbW9kdWxlXywgZWFyXyApOwkKLQl9Ci0JCi0JcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JbnN0YWxsQ2xpZW50RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JbnN0YWxsQ2xpZW50RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1NDVhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvSW5zdGFsbENsaWVudEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbENsaWVudEZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDbGllbnRGcmFnbWVudCAKLXsKLSAgcHVibGljIEluc3RhbGxDbGllbnRGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEluc3RhbGxDbGllbnRGcmFnbWVudCggSW5zdGFsbENsaWVudEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotCXN1cGVyKCBmcmFnbWVudCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLSAgewotCXJldHVybiBuZXcgSW5zdGFsbENsaWVudEZyYWdtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdldElDb21tYW5kRmFjdG9yeSgpIAotICB7Ci0JSUNvbW1hbmRGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQotCWlmKCB3ZWJTZXJ2aWNlQ2xpZW50XyA9PSBudWxsICkKLQl7Ci0JICBmYWN0b3J5ID0gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KCBuZXcgVmVjdG9yKCkgKTsKLQl9Ci0JZWxzZQotCXsKLQkgIGZhY3RvcnkgPSB3ZWJTZXJ2aWNlQ2xpZW50Xy5pbnN0YWxsKCBlbnZpcm9ubWVudF8sIGNvbnRleHRfLCBzZWxlY3Rpb25fLCBtb2R1bGVfLCBlYXJfICk7CQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0luc3RhbGxTZXJ2aWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JbnN0YWxsU2VydmljZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYjgyZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0luc3RhbGxTZXJ2aWNlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsU2VydmljZUZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBJbnN0YWxsU2VydmljZUZyYWdtZW50KCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgSW5zdGFsbFNlcnZpY2VGcmFnbWVudCggSW5zdGFsbFNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZ2V0SUNvbW1hbmRGYWN0b3J5KCkgCi0gIHsKLQlJQ29tbWFuZEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCi0JaWYoIHdlYlNlcnZpY2VfID09IG51bGwgKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoIG5ldyBWZWN0b3IoKSApOwotCX0KLQllbHNlCi0JewotCSAgZmFjdG9yeSA9IHdlYlNlcnZpY2VfLmluc3RhbGwoIGVudmlyb25tZW50XywgY29udGV4dF8sIHNlbGVjdGlvbl8sIG1vZHVsZV8sIGVhcl8gKTsJCi0JfQotCQotCXJldHVybiBmYWN0b3J5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvUnVuQ2xpZW50RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9SdW5DbGllbnRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzk1OGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9SdW5DbGllbnRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFJ1bkNsaWVudEZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDbGllbnRGcmFnbWVudCAKLXsKLSAgcHVibGljIFJ1bkNsaWVudEZyYWdtZW50KCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgUnVuQ2xpZW50RnJhZ21lbnQoIFJ1bkNsaWVudEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotCXN1cGVyKCBmcmFnbWVudCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLSAgewotCXJldHVybiBuZXcgUnVuQ2xpZW50RnJhZ21lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZ2V0SUNvbW1hbmRGYWN0b3J5KCkgCi0gIHsKLQlJQ29tbWFuZEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCi0JaWYoIHdlYlNlcnZpY2VDbGllbnRfID09IG51bGwgKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoIG5ldyBWZWN0b3IoKSApOwotCX0KLQllbHNlCi0JewotCSAgZmFjdG9yeSA9IHdlYlNlcnZpY2VDbGllbnRfLnJ1biggZW52aXJvbm1lbnRfLCBjb250ZXh0Xywgc2VsZWN0aW9uXywgbW9kdWxlXywgZWFyXyApOwkKLQl9Ci0JCi0JcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9SdW5TZXJ2aWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9SdW5TZXJ2aWNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1MTdjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvUnVuU2VydmljZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUnVuU2VydmljZUZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBSdW5TZXJ2aWNlRnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBSdW5TZXJ2aWNlRnJhZ21lbnQoIFJ1blNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IFJ1blNlcnZpY2VGcmFnbWVudCgpOwotICB9Ci0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBnZXRJQ29tbWFuZEZhY3RvcnkoKSAKLSAgewotCUlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkKLQlpZiggd2ViU2VydmljZV8gPT0gbnVsbCApCi0JewotCSAgZmFjdG9yeSA9IG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeSggbmV3IFZlY3RvcigpICk7Ci0JfQotCWVsc2UKLQl7Ci0JICBmYWN0b3J5ID0gd2ViU2VydmljZV8ucnVuKCBlbnZpcm9ubWVudF8sIGNvbnRleHRfLCBzZWxlY3Rpb25fLCBtb2R1bGVfLCBlYXJfICk7CQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9tb25pdG9yL0dldE1vbml0b3JDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vbml0b3IvR2V0TW9uaXRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwODBmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vbml0b3IvR2V0TW9uaXRvckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5tb25pdG9yOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5JTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklNb25pdG9yV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5Nb25pdG9yQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5XU1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZXRNb25pdG9yQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCXByaXZhdGUgYm9vbGVhbiBtb25pdG9yU2VydmljZTsKLQotCXByaXZhdGUgYm9vbGVhbiBjcmVhdGU7Ci0KLQlwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotCi0JcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLQotCXByaXZhdGUgTGlzdCBlbmRwb2ludHM7Ci0KLQlwdWJsaWMgR2V0TW9uaXRvckNvbW1hbmQoKSB7Ci0JCXN1cGVyKAotCQkJCSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uR2V0TW9uaXRvckNvbW1hbmQiLAotCQkJCSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uR2V0TW9uaXRvckNvbW1hbmQiKTsKLQkJbW9uaXRvclNlcnZpY2UgPSB0cnVlOwotCQljcmVhdGUgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQkJZW5kcG9pbnRzID0gbmV3IFZlY3RvcigpOwotCQlpZiAobW9uaXRvclNlcnZpY2UgJiYgd2ViU2VydmljZXNQYXJzZXIgIT0gbnVsbCAmJiB3c2RsVVJJICE9IG51bGwKLQkJCQkmJiB3c2RsVVJJLmxlbmd0aCgpID4gMCkgewotCQkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd2ViU2VydmljZXNQYXJzZXIKLQkJCQkJLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkkpOwotCQkJaWYgKGRlZmluaXRpb24gIT0gbnVsbCkgewotCQkJCU1hcCBzZXJ2aWNlcyA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIHNlcnZpY2VzSXQgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBzZXJ2aWNlc0l0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgc2VydmljZXNJdC5uZXh0KCk7Ci0JCQkJCU1hcCBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBwb3J0c0l0ID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgcG9ydHNJdAotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlQb3J0IHdzZGxQb3J0ID0gKFBvcnQpIHBvcnRzSXQubmV4dCgpOwotCQkJCQkJTGlzdCBleHRFbGVtZW50cyA9IHdzZGxQb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotCQkJCQkJZm9yIChJdGVyYXRvciBleHRFbGVtZW50c0l0ID0gZXh0RWxlbWVudHMuaXRlcmF0b3IoKTsgZXh0RWxlbWVudHNJdAotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1lbnRzSXQKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJU3RyaW5nIGVuZHBvaW50ID0gbnVsbDsKLQkJCQkJCQlVUkwgZW5kcG9pbnRVUkwgPSBudWxsOwotCQkJCQkJCWlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpCi0JCQkJCQkJCWVuZHBvaW50ID0gKChTT0FQQWRkcmVzcykgZXh0RWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCQkJCQllbHNlIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpCi0JCQkJCQkJCWVuZHBvaW50ID0gKChIVFRQQWRkcmVzcykgZXh0RWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCQkJCQlpZiAoZW5kcG9pbnQgIT0gbnVsbCkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJZW5kcG9pbnRVUkwgPSBuZXcgVVJMKGVuZHBvaW50KTsKLQkJCQkJCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGVuZHBvaW50VVJMICE9IG51bGwpIHsKLQkJCQkJCQkJU3RyaW5nIHByb3RvY29sID0gZW5kcG9pbnRVUkwuZ2V0UHJvdG9jb2woKTsKLQkJCQkJCQkJU3RyaW5nIGhvc3QgPSBlbmRwb2ludFVSTC5nZXRIb3N0KCk7Ci0JCQkJCQkJCWludCBwb3J0ID0gZW5kcG9pbnRVUkwuZ2V0UG9ydCgpOwotCQkJCQkJCQlpZiAocG9ydCA9PSAtMSkgewotCQkJCQkJCQkJaWYgKCJodHRwIi5lcXVhbHNJZ25vcmVDYXNlKHByb3RvY29sKSkKLQkJCQkJCQkJCQlwb3J0ID0gODA7Ci0JCQkJCQkJCQllbHNlIGlmICgiaHR0cHMiLmVxdWFsc0lnbm9yZUNhc2UocHJvdG9jb2wpKQotCQkJCQkJCQkJCXBvcnQgPSA0NDM7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKHByb3RvY29sICE9IG51bGwKLQkJCQkJCQkJCQkmJiBwcm90b2NvbC5zdGFydHNXaXRoKCJodHRwIikKLQkJCQkJCQkJCQkmJiBob3N0ICE9IG51bGwgJiYgaG9zdC5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJCQkmJiBwb3J0ICE9IC0xKSB7Ci0JCQkJCQkJCQlJTW9uaXRvciBtID0gbnVsbDsKLQkJCQkJCQkJCUlNb25pdG9yW10gbW9uaXRvcnMgPSBNb25pdG9yQ29yZQotCQkJCQkJCQkJCQkuZ2V0TW9uaXRvcnMoKTsKLQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCQlpZiAoaG9zdC5lcXVhbHNJZ25vcmVDYXNlKG1vbml0b3JzW2ldCi0JCQkJCQkJCQkJCQkuZ2V0UmVtb3RlSG9zdCgpKQotCQkJCQkJCQkJCQkJJiYgcG9ydCA9PSBtb25pdG9yc1tpXQotCQkJCQkJCQkJCQkJCQkuZ2V0UmVtb3RlUG9ydCgpKSB7Ci0JCQkJCQkJCQkJCW0gPSBtb25pdG9yc1tpXTsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKG0gPT0gbnVsbCAmJiBjcmVhdGUpIHsKLQkJCQkJCQkJCQlpbnQgbW9uaXRvcmVkUG9ydCA9IFNvY2tldFV0aWwKLQkJCQkJCQkJCQkJCS5maW5kVW51c2VkUG9ydCg1MDAwLCAxNTAwMCk7Ci0JCQkJCQkJCQkJSU1vbml0b3JXb3JraW5nQ29weSBtb25pdG9yV29ya2luZ0NvcHkgPSBNb25pdG9yQ29yZQotCQkJCQkJCQkJCQkJLmNyZWF0ZU1vbml0b3IoKTsKLQkJCQkJCQkJCQltb25pdG9yV29ya2luZ0NvcHkKLQkJCQkJCQkJCQkJCS5zZXRMb2NhbFBvcnQobW9uaXRvcmVkUG9ydCk7Ci0JCQkJCQkJCQkJbW9uaXRvcldvcmtpbmdDb3B5LnNldFJlbW90ZUhvc3QoaG9zdCk7Ci0JCQkJCQkJCQkJbW9uaXRvcldvcmtpbmdDb3B5LnNldFJlbW90ZVBvcnQocG9ydCk7Ci0JCQkJCQkJCQkJbW9uaXRvcldvcmtpbmdDb3B5LnNldFByb3RvY29sKCJIVFRQIik7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJbSA9IG1vbml0b3JXb3JraW5nQ29weS5zYXZlKCk7Ci0JCQkJCQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkJCQkJCQkJU3RhdHVzIHdhcm5pbmcgPSBuZXcgU2ltcGxlU3RhdHVzKAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS53c3Qud3MiLAotCQkJCQkJCQkJCQkJCVdTUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKAotCQkJCQkJCQkJCQkJCQkJCQkiTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SIiwKLQkJCQkJCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQkJCQkJCQlTdHJpbmcKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS52YWx1ZU9mKHBvcnQpLAotCQkJCQkJCQkJCQkJCQkJCQkJCWVuZHBvaW50IH0pLAotCQkJCQkJCQkJCQkJCVN0YXR1cy5XQVJOSU5HLCB0KTsKLQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCWlmIChlbnYgIT0gbnVsbCkKLQkJCQkJCQkJCQkJCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpCi0JCQkJCQkJCQkJCQkJCQkucmVwb3J0KHdhcm5pbmcpOwotCQkJCQkJCQkJCQl9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gc2UpIHsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChtICE9IG51bGwpIHsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlpZiAoIW0uaXNSdW5uaW5nKCkpCi0JCQkJCQkJCQkJCQltLnN0YXJ0KCk7Ci0JCQkJCQkJCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoCi0JCQkJCQkJCQkJCQkJZW5kcG9pbnRVUkwuZ2V0UHJvdG9jb2woKSk7Ci0JCQkJCQkJCQkJCXNiLmFwcGVuZCgiOi8vbG9jYWxob3N0OiIpOwotCQkJCQkJCQkJCQlzYi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobQotCQkJCQkJCQkJCQkJCS5nZXRMb2NhbFBvcnQoKSkpOwotCQkJCQkJCQkJCQlzYi5hcHBlbmQoZW5kcG9pbnRVUkwuZ2V0RmlsZSgpKTsKLQkJCQkJCQkJCQkJZW5kcG9pbnRzLmFkZChzYi50b1N0cmluZygpKTsKLQkJCQkJCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQkJCQkJCQlTdGF0dXMgd2FybmluZyA9IG5ldyBTaW1wbGVTdGF0dXMoCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLndzdC53cyIsCi0JCQkJCQkJCQkJCQkJV1NQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoCi0JCQkJCQkJCQkJCQkJCQkJCSJNU0dfRVJST1JfVU5BQkxFX1RPX1NUQVJUX01PTklUT1IiLAotCQkJCQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLnZhbHVlT2YocG9ydCksCi0JCQkJCQkJCQkJCQkJCQkJCQkJZW5kcG9pbnQgfSksCi0JCQkJCQkJCQkJCQkJU3RhdHVzLldBUk5JTkcsIHQpOwotCQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQkJaWYgKGVudiAhPSBudWxsKQotCQkJCQkJCQkJCQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkKLQkJCQkJCQkJCQkJCQkJCS5yZXBvcnQod2FybmluZyk7Ci0JCQkJCQkJCQkJCX0gY2F0Y2ggKFN0YXR1c0V4Y2VwdGlvbiBzZSkgewotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb25pdG9yU2VydmljZShib29sZWFuIG1vbml0b3JTZXJ2aWNlKSB7Ci0JCXRoaXMubW9uaXRvclNlcnZpY2UgPSBtb25pdG9yU2VydmljZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKSB7Ci0JCXRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKSB7Ci0JCXRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRlKGJvb2xlYW4gY3JlYXRlKSB7Ci0JCXRoaXMuY3JlYXRlID0gY3JlYXRlOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEVuZHBvaW50cygpIHsKLQkJcmV0dXJuIGVuZHBvaW50czsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0Fic3RyYWN0V2ViU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0Fic3RyYWN0V2ViU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmY5MWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5JQ29tbWFuZEZhY3Rvcnk7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V2ViU2VydmljZSBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlIHsKLQkKLQlwcml2YXRlIFdlYlNlcnZpY2VJbmZvIGluZm87Ci0KLQlwdWJsaWMgQWJzdHJhY3RXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pIHsKLQkJdGhpcy5pbmZvID0gaW5mbzsKLQl9Ci0JCi0KLQlwdWJsaWMgV2ViU2VydmljZUluZm8gZ2V0V2ViU2VydmljZUluZm8oKSB7Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgYXNzZW1ibGUoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JCi0KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IGRlcGxveShFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKTsKLQkKLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgZGV2ZWxvcChFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKTsKLQkJCi0KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JCi0KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IHJ1bihFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhOWJjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuSUNvbW1hbmRGYWN0b3J5OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQgaW1wbGVtZW50cyBJV2ViU2VydmljZUNsaWVudCB7Ci0JCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50SW5mbyBpbmZvOwotCi0JcHVibGljIEFic3RyYWN0V2ViU2VydmljZUNsaWVudChXZWJTZXJ2aWNlQ2xpZW50SW5mbyBpbmZvKSB7Ci0JCXRoaXMuaW5mbyA9IGluZm87Ci0JfQotCQotCi0JcHVibGljIFdlYlNlcnZpY2VDbGllbnRJbmZvIGdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkgewotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotCQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBkZXBsb3koRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JCi0KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IGRldmVsb3AoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JCQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBpbnN0YWxsKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotCQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBydW4oRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmEyZmUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5JQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lIGltcGxlbWVudHMgSVdlYlNlcnZpY2VSdW50aW1lIHsKLQotCXB1YmxpYyBhYnN0cmFjdCBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pOwotCS8qKgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJV2ViU2VydmljZUNsaWVudCBnZXRXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm8pOwotCS8qKgotCSAqLwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYW5ub3VuY2UoSVdlYlNlcnZpY2Ugd2ViU2VydmljZSkKLQl7Ci0JCS8vVE9ETyBwcm92aWRlIGEgYm9pbGVyLXBsYXRlIGFubm91bmNlIGltcGxlbWVudGF0aW9uLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQ2YTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZXh0IHsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRBc3NlbWJsZSgpOwotCQotCXB1YmxpYyBib29sZWFuIGdldENoZWNrT3V0RmlsZXMoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRDbGllbnQoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRDcmVhdGVGb2xkZXJzKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVwbG95KCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0RGV2ZWxvcCgpOwotCQotCXB1YmxpYyBib29sZWFuIGdldEluc3RhbGwoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRPdmVyV3JpdGVGaWxlcygpOwotCQotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2goKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRSdW4oKTsKLQkKLQlwdWJsaWMgV2ViU2VydmljZVNjZW5hcmlvIGdldFNjZW5hcmlvKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0VGVzdCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVNlbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3MmYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElTZWxlY3Rpb24gewotCQotCU9iamVjdFtdIGdldFNlbGVjdGlvbigpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVdlYlNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA4ZTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlSW5mbyBnZXRXZWJTZXJ2aWNlSW5mbygpOwotCQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGV2ZWxvcChFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgcnVuKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVdlYlNlcnZpY2VDbGllbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDMzY2U0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5JQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2VDbGllbnQgewotCQotCS8qKgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlQ2xpZW50SW5mbyBnZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpOwotCQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGV2ZWxvcChFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBhc3NlbWJsZShFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXIpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgcnVuKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7CQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVdlYlNlcnZpY2VQdWJsaXNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZVB1Ymxpc2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2E0NzIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZVB1Ymxpc2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5JQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2VQdWJsaXNoZXIgewotCQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgcHVibGlzaChFbnZpcm9ubWVudCBlbnYsIElXZWJTZXJ2aWNlIHdzKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlUnVudGltZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWNjOGNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZVJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5JQ29tbWFuZEZhY3Rvcnk7Ci0KLQotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZVJ1bnRpbWUgewotCQotCS8qKgotCSAqLwotCXB1YmxpYyBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pOwotCS8qKgotCSAqLwotCXB1YmxpYyBJV2ViU2VydmljZUNsaWVudCBnZXRXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm8pOwotCS8qKgotCSAqLwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYW5ub3VuY2UoSVdlYlNlcnZpY2Ugd2ViU2VydmljZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZVRlc3Rlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlVGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NjMxZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlVGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLklDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZVRlc3RlciB7Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdlbmVyYXRlKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhcik7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBsYXVuY2goRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlQ2xpZW50SW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VDbGllbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5Yjc3OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VDbGllbnRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50SW5mbyB7Ci0KLQlwcml2YXRlIFdlYlNlcnZpY2VTdGF0ZSBzdGF0ZTsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VydmxldExldmVsOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBqMmVlTGV2ZWw7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHNlcnZlckZhY3RvcnlJZDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VydmVySW5zdGFuY2VJZDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgd2ViU2VydmljZVJ1bnRpbWVJZDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgd3NkbFVSTDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaW1wbFVSTDsKLQkKLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbXBsVVJMKCkgewotCQlyZXR1cm4gaW1wbFVSTDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SW1wbFVSTChqYXZhLmxhbmcuU3RyaW5nIGltcGxVUkwpIHsKLQkJdGhpcy5pbXBsVVJMID0gaW1wbFVSTDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SjJlZUxldmVsKCkgewotCQlyZXR1cm4gajJlZUxldmVsOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRKMmVlTGV2ZWwoamF2YS5sYW5nLlN0cmluZyBsZXZlbCkgewotCQlqMmVlTGV2ZWwgPSBsZXZlbDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VydmVyRmFjdG9yeUlkKCkgewotCQlyZXR1cm4gc2VydmVyRmFjdG9yeUlkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoamF2YS5sYW5nLlN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpIHsKLQkJdGhpcy5zZXJ2ZXJGYWN0b3J5SWQgPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0JfQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNlcnZlckluc3RhbmNlSWQoKSB7Ci0JCXJldHVybiBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJJbnN0YW5jZUlkKGphdmEubGFuZy5TdHJpbmcgc2VydmVySW5zdGFuY2VJZCkgewotCQl0aGlzLnNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZXJ2bGV0TGV2ZWwoKSB7Ci0JCXJldHVybiBzZXJ2bGV0TGV2ZWw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNlcnZsZXRMZXZlbChqYXZhLmxhbmcuU3RyaW5nIHNlcnZsZXRMZXZlbCkgewotCQl0aGlzLnNlcnZsZXRMZXZlbCA9IHNlcnZsZXRMZXZlbDsKLQl9Ci0JcHVibGljIFdlYlNlcnZpY2VTdGF0ZSBnZXRTdGF0ZSgpIHsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTdGF0ZShXZWJTZXJ2aWNlU3RhdGUgc3RhdGUpIHsKLQkJdGhpcy5zdGF0ZSA9IHN0YXRlOwotCX0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRXZWJTZXJ2aWNlUnVudGltZUlkKCkgewotCQlyZXR1cm4gd2ViU2VydmljZVJ1bnRpbWVJZDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVJ1bnRpbWVJZChqYXZhLmxhbmcuU3RyaW5nIHdlYlNlcnZpY2VSdW50aW1lSWQpIHsKLQkJdGhpcy53ZWJTZXJ2aWNlUnVudGltZUlkID0gd2ViU2VydmljZVJ1bnRpbWVJZDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0V3NkbFVSTCgpIHsKLQkJcmV0dXJuIHdzZGxVUkw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFdzZGxVUkwoamF2YS5sYW5nLlN0cmluZyB3c2RsVVJMKSB7Ci0JCXRoaXMud3NkbFVSTCA9IHdzZGxVUkw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvV2ViU2VydmljZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1N2MyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvV2ViU2VydmljZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VJbmZvIHsKLQotCXByaXZhdGUgV2ViU2VydmljZVN0YXRlIHN0YXRlOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzZXJ2bGV0TGV2ZWw7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGoyZWVMZXZlbDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VydmVyRmFjdG9yeUlkOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB3ZWJTZXJ2aWNlUnVudGltZUlkOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB3c2RsVVJMOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBlbmRQb2ludFVSTDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaW1wbFVSTDsKLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmRQb2ludFVSTCgpCi0JewotCQlyZXR1cm4gZW5kUG9pbnRVUkw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEVuZFBvaW50VVJMKGphdmEubGFuZy5TdHJpbmcgZW5kUG9pbnRVUkwpCi0JewotCQl0aGlzLmVuZFBvaW50VVJMID0gZW5kUG9pbnRVUkw7Ci0JfQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEltcGxVUkwoKQotCXsKLQkJcmV0dXJuIGltcGxVUkw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEltcGxVUkwoamF2YS5sYW5nLlN0cmluZyBpbXBsVVJMKQotCXsKLQkJdGhpcy5pbXBsVVJMID0gaW1wbFVSTDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SjJlZUxldmVsKCkKLQl7Ci0JCXJldHVybiBqMmVlTGV2ZWw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEoyZWVMZXZlbChqYXZhLmxhbmcuU3RyaW5nIGxldmVsKQotCXsKLQkJajJlZUxldmVsID0gbGV2ZWw7Ci0JfQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNlcnZlckZhY3RvcnlJZCgpCi0JewotCQlyZXR1cm4gc2VydmVyRmFjdG9yeUlkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoamF2YS5sYW5nLlN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0JewotCQl0aGlzLnNlcnZlckZhY3RvcnlJZCA9IHNlcnZlckZhY3RvcnlJZDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VydmVySW5zdGFuY2VJZCgpCi0JewotCQlyZXR1cm4gc2VydmVySW5zdGFuY2VJZDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U2VydmVySW5zdGFuY2VJZChqYXZhLmxhbmcuU3RyaW5nIHNlcnZlckluc3RhbmNlSWQpCi0JewotCQl0aGlzLnNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZXJ2bGV0TGV2ZWwoKQotCXsKLQkJcmV0dXJuIHNlcnZsZXRMZXZlbDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U2VydmxldExldmVsKGphdmEubGFuZy5TdHJpbmcgc2VydmxldExldmVsKQotCXsKLQkJdGhpcy5zZXJ2bGV0TGV2ZWwgPSBzZXJ2bGV0TGV2ZWw7Ci0JfQotCXB1YmxpYyBXZWJTZXJ2aWNlU3RhdGUgZ2V0U3RhdGUoKQotCXsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTdGF0ZShXZWJTZXJ2aWNlU3RhdGUgc3RhdGUpCi0JewotCQl0aGlzLnN0YXRlID0gc3RhdGU7Ci0JfQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFdlYlNlcnZpY2VSdW50aW1lSWQoKQotCXsKLQkJcmV0dXJuIHdlYlNlcnZpY2VSdW50aW1lSWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VSdW50aW1lSWQoamF2YS5sYW5nLlN0cmluZyB3ZWJTZXJ2aWNlUnVudGltZUlkKQotCXsKLQkJdGhpcy53ZWJTZXJ2aWNlUnVudGltZUlkID0gd2ViU2VydmljZVJ1bnRpbWVJZDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0V3NkbFVSTCgpCi0JewotCQlyZXR1cm4gd3NkbFVSTDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0V3NkbFVSTChqYXZhLmxhbmcuU3RyaW5nIHdzZGxVUkwpCi0JewotCQl0aGlzLndzZGxVUkwgPSB3c2RsVVJMOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlU2NlbmFyaW8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlU2NlbmFyaW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU0NGQ4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvV2ViU2VydmljZVNjZW5hcmlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJTZXJ2aWNlU2NlbmFyaW8gZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IKLXsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT01VUCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPUERPV04gPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlQgPSAyOwotICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV2ViU2VydmljZVNjZW5hcmlvIEJPVFRPTVVQX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVNjZW5hcmlvKEJPVFRPTVVQLCAiQk9UVE9NVVAiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU2NlbmFyaW8gVE9QRE9XTl9MSVRFUkFMID0gbmV3IFdlYlNlcnZpY2VTY2VuYXJpbyhUT1BET1dOLCAiVE9QRE9XTiIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTY2VuYXJpbyBDTElFTlRfTElURVJBTCA9IG5ldyBXZWJTZXJ2aWNlU2NlbmFyaW8oQ0xJRU5ULCAiQ0xJRU5UIik7Ci0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU2NlbmFyaW9bXSBWQUxVRVNfQVJSQVkgPQotICAgIG5ldyBXZWJTZXJ2aWNlU2NlbmFyaW9bXQotICAgIHsKLQkgIEJPVFRPTVVQX0xJVEVSQUwsCi0JICBUT1BET1dOX0xJVEVSQUwsCi0JICBDTElFTlRfTElURVJBTCwKLSAgICB9OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VTY2VuYXJpbyBnZXQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU2NlbmFyaW8gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVNjZW5hcmlvIGdldChpbnQgdmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKHZhbHVlKQotICAgIHsKLSAgICAgIGNhc2UgQk9UVE9NVVA6IHJldHVybiBCT1RUT01VUF9MSVRFUkFMOwotICAgICAgY2FzZSBUT1BET1dOOiByZXR1cm4gVE9QRE9XTl9MSVRFUkFMOwotICAgICAgY2FzZSBDTElFTlQ6IHJldHVybiBDTElFTlRfTElURVJBTDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7CQotICB9Ci0KLSAgLyoqCi0gICAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByaXZhdGUgV2ViU2VydmljZVNjZW5hcmlvKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcih2YWx1ZSwgbmFtZSk7Ci0gIH0KLQotfSAvL1dlYlNlcnZpY2VTY2VuYXJpbwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTNlZGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIFdlYlNlcnZpY2VTdGF0ZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvcgotewotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZFTE9QRUQgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NFTUJMRUQgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVBMT1lFRCA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTExFRCA9IDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTk5JTkcgPSA1OwotICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV2ViU2VydmljZVN0YXRlIFVOS05PV05fTElURVJBTCA9IG5ldyBXZWJTZXJ2aWNlU3RhdGUoVU5LTk9XTiwgIlVOS05PV04iKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU3RhdGUgREVWRUxPUEVEX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVN0YXRlKERFVkVMT1BFRCwgIkRFVkVMT1BFRCIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTdGF0ZSBBU1NFTUJMRURfTElURVJBTCA9IG5ldyBXZWJTZXJ2aWNlU3RhdGUoQVNTRU1CTEVELCAiQVNTRU1CTEVEIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV2ViU2VydmljZVN0YXRlIERFUExPWUVEX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVN0YXRlKERFUExPWUVELCAiREVQTE9ZRUQiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU3RhdGUgSU5TVEFMTEVEX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVN0YXRlKElOU1RBTExFRCwgIklOU1RBTExFRCIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTdGF0ZSBSVU5OSU5HX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVN0YXRlKFJVTk5JTkcsICJSVU5OSU5HIik7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV2ViU2VydmljZVN0YXRlW10gVkFMVUVTX0FSUkFZID0KLSAgICBuZXcgV2ViU2VydmljZVN0YXRlW10KLSAgICB7Ci0JICBVTktOT1dOX0xJVEVSQUwsCi0JICBERVZFTE9QRURfTElURVJBTCwKLQkgIEFTU0VNQkxFRF9MSVRFUkFMLAotCSAgREVQTE9ZRURfTElURVJBTCwKLQkgIElOU1RBTExFRF9MSVRFUkFMLAotCSAgUlVOTklOR19MSVRFUkFMLAotICAgIH07Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVN0YXRlIGdldChTdHJpbmcgbmFtZSkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VTdGF0ZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0gICAgICBpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlU3RhdGUgZ2V0KGludCB2YWx1ZSkKLSAgewotICAgIHN3aXRjaCAodmFsdWUpCi0gICAgewotICAgICAgY2FzZSBVTktOT1dOOiByZXR1cm4gVU5LTk9XTl9MSVRFUkFMOwotICAgICAgY2FzZSBERVZFTE9QRUQ6IHJldHVybiBERVZFTE9QRURfTElURVJBTDsKLSAgICAgIGNhc2UgQVNTRU1CTEVEOiByZXR1cm4gQVNTRU1CTEVEX0xJVEVSQUw7Ci0JICBjYXNlIERFUExPWUVEOiByZXR1cm4gREVQTE9ZRURfTElURVJBTDsKLQkgIGNhc2UgSU5TVEFMTEVEOiByZXR1cm4gSU5TVEFMTEVEX0xJVEVSQUw7Ci0JICBjYXNlIFJVTk5JTkc6IHJldHVybiBSVU5OSU5HX0xJVEVSQUw7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwkKLSAgfQotCi0gIC8qKgotICAgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcml2YXRlIFdlYlNlcnZpY2VTdGF0ZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIodmFsdWUsIG5hbWUpOwotICB9Ci0KLX0gLy9XZWJTZXJ2aWNlU3RhdGUKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2lsL0FkZFdTRExUb1dTSUxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzaWwvQWRkV1NETFRvV1NJTENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxODc1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzaWwvQWRkV1NETFRvV1NJTENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2lsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5BYnN0cmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkluc3BlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLldTSUxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi5FeHRlbnNpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24ud3NkbC5JbXBsZW1lbnRlZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi53c2RsLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLndzZGwuUmVmZXJlbmNlZFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLnhtbC5YTUxXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLnVyaS5VUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUudXJpLlVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLklsbGVnYWxBcmd1bWVudHNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5XV1dBdXRoZW50aWNhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkV1NETFRvV1NJTENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19XU0lMID0gIi13c2lsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHX1dTREwgPSAiLXdzZGwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfUkVTT0xWRV9XU0RMID0gIi1yZXNvbHZld3NkbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUUgPSAiLWh0dHB1c2VybmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19IVFRQX0JBU0lDX0FVVEhfUEFTU1dPUkQgPSAiLWh0dHBwYXNzd29yZCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGlkID0gIm9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5BZGRXU0RMVG9XU0lMQ29tbWFuZCI7Ci0gIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzQnVuZGxlXzsKLSAgcHJpdmF0ZSBXV1dBdXRoZW50aWNhdGlvbkhhbmRsZXIgd3d3QXV0aEhhbmRsZXJfOwotICBwcml2YXRlIFN0cmluZ1tdIGFyZ3NfOwotICBwcml2YXRlIFN0cmluZyB3c2lsXzsKLSAgcHJpdmF0ZSBBcnJheUxpc3Qgd3NkbHNfOwotICBwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZVdTRExfOwotICBwcml2YXRlIFN0cmluZyBodHRwVXNlcm5hbWVfOwotICBwcml2YXRlIFN0cmluZyBodHRwUGFzc3dvcmRfOwotCi0gIHB1YmxpYyBBZGRXU0RMVG9XU0lMQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlci53c2lsLkFkZFdTRExUb1dTSUxDb21tYW5kIiwgIm9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC5BZGRXU0RMVG9XU0lMQ29tbWFuZCIpOwotICAgIHJlc0J1bmRsZV8gPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIud3NpbC53c2lsIik7Ci0gICAgd3d3QXV0aEhhbmRsZXJfID0gbnVsbDsKLSAgICBhcmdzXyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgY2xlYXJQYXJzZWRBcmdzKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY2xlYXJQYXJzZWRBcmdzKCkKLSAgewotICAgIHdzaWxfID0gbnVsbDsKLSAgICBpZiAod3NkbHNfID09IG51bGwpCi0gICAgICB3c2Rsc18gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZWxzZQotICAgICAgd3NkbHNfLmNsZWFyKCk7Ci0gICAgcmVzb2x2ZVdTRExfID0gZmFsc2U7Ci0gICAgaHR0cFVzZXJuYW1lXyA9IG51bGw7Ci0gICAgaHR0cFBhc3N3b3JkXyA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZXMgdGhlIENvbW1hbmQuCi0gICAqIAotICAgKiBAcGFyYW0gZW52aXJvbm1lbnQKLSAgICogICAgICAgICAgICBUaGUgZW52aXJvbm1lbnQuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gQSA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlCi0gICAqICAgICAgICAgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gbWV0aG9kIHdhcyBzdWNjZXNzZnVsLiBBIHZhbHVkIG9mIDxjb2RlPm51bGw8L2NvZGU+LAotICAgKiAgICAgICAgIG9yIGEgU3RhdHVzIHdpdGggYSBzZXZlcml0eSBvZiBsZXNzIHRoYW4gPGNvZGU+U3RhdHVzLkVSUk9SPC9jb2RlPgotICAgKiAgICAgICAgIHNpZ25pZmllcyBzdWNjZXNzLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgVVJJRmFjdG9yeSB1cmlGYWN0b3J5ID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIC8vIFBhcnNlIGFyZ3VtZW50cwotICAgIHRyeQotICAgIHsKLSAgICAgIHBhcnNlQXJndW1lbnRzKCk7Ci0gICAgfQotICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRzRXhjZXB0aW9uIGlhZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9JTExFR0FMX0FSR1VNRU5UUyIpLCBTdGF0dXMuRVJST1IsIGlhZSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9JTlZBTElEX0FSR1VNRU5UUyIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgIH0KLSAgICAvLyBDcmVhdGUgbmV3IFdTSUwgZG9jdW1lbnQKLSAgICBXU0lMRG9jdW1lbnQgd3NpbERvY3VtZW50ID0gbnVsbDsKLSAgICBVUkwgd3NpbFVSTCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgd3NpbERvY3VtZW50ID0gV1NJTERvY3VtZW50Lm5ld0luc3RhbmNlKCk7Ci0gICAgICB3c2lsVVJMID0gbmV3IFVSTCh3c2lsXyk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfSU5WQUxJRF9XU0lMX1VSSSIpLCBTdGF0dXMuRVJST1IsIG11cmxlKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTSUxFeGNlcHRpb24gd3NpbGUpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfVU5FWFBFQ1RFRF9FWENFUFRJT04iKSwgU3RhdHVzLkVSUk9SLCB3c2lsZSk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFJlYWQgV1NJTAotICAgIHRyeQotICAgIHsKLSAgICAgIElucHV0U3RyZWFtIGlzID0gdXJpRmFjdG9yeS5uZXdVUkkod3NpbFVSTCkuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgIGlmIChpcyAhPSBudWxsKQotICAgICAgewotICAgICAgICB3c2lsRG9jdW1lbnQucmVhZChuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKTsKLSAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFVSSUV4Y2VwdGlvbiB1cmllKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OIiksIFN0YXR1cy5FUlJPUiwgdXJpZSk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfVU5FWFBFQ1RFRF9FWENFUFRJT04iKSwgU3RhdHVzLkVSUk9SLCBpb2UpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBjYXRjaCAoV1NJTEV4Y2VwdGlvbiB3c2lsZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9VTkVYUEVDVEVEX0VYQ0VQVElPTiIpLCBTdGF0dXMuRVJST1IsIHdzaWxlKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgLy8gaW50ZXJuYWxFeGVjdXRlCi0gICAgU3RyaW5nIGh0dHBVc2VybmFtZSA9IG51bGw7Ci0gICAgU3RyaW5nIGh0dHBQYXNzd29yZCA9IG51bGw7Ci0gICAgaWYgKHdzZGxzXy5zaXplKCkgPT0gMSAmJiBodHRwVXNlcm5hbWVfICE9IG51bGwgJiYgaHR0cFBhc3N3b3JkXyAhPSBudWxsKQotICAgIHsKLSAgICAgIGh0dHBVc2VybmFtZSA9IGh0dHBVc2VybmFtZV87Ci0gICAgICBodHRwUGFzc3dvcmQgPSBodHRwUGFzc3dvcmRfOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gd3NkbHNfLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgU3RyaW5nIHdzZGwgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbnVsbDsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBzdGF0dXMgPSBpbnRlcm5hbEV4ZWN1dGUoZW52aXJvbm1lbnQsIHdzaWxEb2N1bWVudCwgcGxhdGZvcm0yRmlsZSh1cmlGYWN0b3J5LCB3c2lsXyksIHdzZGwsIGh0dHBVc2VybmFtZSwgaHR0cFBhc3N3b3JkKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB3d3dhZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHd3d0F1dGhIYW5kbGVyXyAhPSBudWxsICYmIGh0dHBVc2VybmFtZSA9PSBudWxsICYmIGh0dHBQYXNzd29yZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgd3d3QXV0aEhhbmRsZXJfLmhhbmRsZVdXV0F1dGhlbnRpY2F0aW9uKHd3d2FlKTsKLSAgICAgICAgICBTdHJpbmcgaGFuZGxlclVzZXJuYW1lID0gd3d3QXV0aEhhbmRsZXJfLmdldFVzZXJuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGhhbmRsZXJQYXNzd29yZCA9IHd3d0F1dGhIYW5kbGVyXy5nZXRQYXNzd29yZCgpOwotICAgICAgICAgIGlmIChoYW5kbGVyVXNlcm5hbWUgIT0gbnVsbCAmJiBoYW5kbGVyUGFzc3dvcmQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3RhdHVzID0gaW50ZXJuYWxFeGVjdXRlKGVudmlyb25tZW50LCB3c2lsRG9jdW1lbnQsIHBsYXRmb3JtMkZpbGUodXJpRmFjdG9yeSwgd3NpbF8pLCB3c2RsLCBoYW5kbGVyVXNlcm5hbWUsIGhhbmRsZXJQYXNzd29yZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24gd3d3YWUyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdGF0dXMgd3d3YWVTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1VOUkVTT0xWQUJMRV9XU0RMIiksIFN0YXR1cy5FUlJPUiwgd3d3YWUyLmdldElPRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Iod3d3YWVTdGF0dXMpOwotICAgICAgICAgICAgICByZXR1cm4gd3d3YWVTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0YXR1cyBzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9VTlJFU09MVkFCTEVfV1NETCIpLCBTdGF0dXMuRVJST1IsIHd3d2FlLmdldElPRXhjZXB0aW9uKCkpOwotICAgICAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzKTsKLSAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IFN0YXR1cy5PSykKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgLy8gV3JpdGUgV1NJTAotICAgIHRyeQotICAgIHsKLSAgICAgIFhNTFdyaXRlciB4bWxXcml0ZXIgPSBuZXcgWE1MV3JpdGVyKCk7Ci0gICAgICBPdXRwdXRTdHJlYW0gb3MgPSB1cmlGYWN0b3J5Lm5ld1VSSSh3c2lsVVJMKS5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgIGlmIChvcyAhPSBudWxsKQotICAgICAgICB4bWxXcml0ZXIud3JpdGVEb2N1bWVudCh3c2lsRG9jdW1lbnQsIG9zKTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0gICAgICBvcy5jbG9zZSgpOwotICAgIH0KLSAgICBjYXRjaCAoVVJJRXhjZXB0aW9uIHVyaWUpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfV1JJVEVfV1NJTCIpLCBTdGF0dXMuRVJST1IsIHVyaWUpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1dSSVRFX1dTSUwiKSwgU3RhdHVzLkVSUk9SLCBpb2UpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBjYXRjaCAoV1NJTEV4Y2VwdGlvbiB3c2lsZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9XUklURV9XU0lMIiksIFN0YXR1cy5FUlJPUiwgd3NpbGUpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhpZCwgIiIsIFN0YXR1cy5PSywgbnVsbCk7Ci0gIH0KLQotICBwcml2YXRlIFN0YXR1cyBpbnRlcm5hbEV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIFdTSUxEb2N1bWVudCB3c2lsRG9jdW1lbnQsIFN0cmluZyB3c2lsLCBTdHJpbmcgd3NkbCwgU3RyaW5nIGh0dHBVc2VybmFtZSwgU3RyaW5nIGh0dHBQYXNzd29yZCkgdGhyb3dzIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotICAgIEFycmF5TGlzdCB3c2RsU2VydmljZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBBcnJheUxpc3Qgd3NkbEJpbmRpbmcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHJlc29sdmVXU0RMXykKLSAgICB7Ci0gICAgICAvLyBQYXJzZSBXU0RMCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZGVmaW5pdGlvbiA9IHBhcnNlV1NETCh3c2RsLCB3c2RsU2VydmljZSwgd3NkbEJpbmRpbmcsIGh0dHBVc2VybmFtZSwgaHR0cFBhc3N3b3JkKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX0lOVkFMSURfV1NETF9VUkkiKSwgU3RhdHVzLkVSUk9SLCBtdXJsZSk7Ci0gICAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLSAgICAgIHsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfVU5SRVNPTFZBQkxFX1dTREwiKSwgU3RhdHVzLkVSUk9SLCBpb2UpOwotICAgICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkKLSAgICAgIHsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfVU5FWFBFQ1RFRF9FWENFUFRJT04iKSwgU3RhdHVzLkVSUk9SLCBwY2UpOwotICAgICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gc2F4ZSkKLSAgICAgIHsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfTUFMRk9STUVEX1dTREwiKSwgU3RhdHVzLkVSUk9SLCBzYXhlKTsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIEFkZCBXU0RMIHRvIFdTSUwKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jdW1lbnQuZ2V0SW5zcGVjdGlvbigpOwotICAgICAgU2VydmljZSBzZXJ2aWNlID0gd3NpbERvY3VtZW50LmNyZWF0ZVNlcnZpY2UoKTsKLSAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZG9jdW1lbnRhdGlvbiA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgICAgQWJzdHJhY3Qgc2VydmljZUFic3RyYWN0ID0gd3NpbERvY3VtZW50LmNyZWF0ZUFic3RyYWN0KCk7Ci0gICAgICAgIHNlcnZpY2VBYnN0cmFjdC5zZXRUZXh0KEVsZW1lbnQyU3RyaW5nKGRvY3VtZW50YXRpb24pKTsKLSAgICAgICAgc2VydmljZS5hZGRBYnN0cmFjdChzZXJ2aWNlQWJzdHJhY3QpOwotICAgICAgfQotICAgICAgRGVzY3JpcHRpb24gZGVzYyA9IHdzaWxEb2N1bWVudC5jcmVhdGVEZXNjcmlwdGlvbigpOwotICAgICAgZGVzYy5zZXRSZWZlcmVuY2VkTmFtZXNwYWNlKFdTRExDb25zdGFudHMuTlNfVVJJX1dTREwpOwotICAgICAgZGVzYy5zZXRMb2NhdGlvbihnZXRSZWxhdGl2ZVVSSSh3c2lsLCB3c2RsKSk7Ci0gICAgICBFeHRlbnNpb25CdWlsZGVyIGV4dEJ1aWxkZXIgPSB3c2lsRG9jdW1lbnQuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRCdWlsZGVyKFdTRExDb25zdGFudHMuTlNfVVJJX1dTSUxfV1NETCk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsIHx8IGVuZHBvaW50UHJlc2VudChkZWZpbml0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHdzZGxTZXJ2aWNlLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBSZWZlcmVuY2UgcmVmZXJlbmNlID0gKFJlZmVyZW5jZSkgZXh0QnVpbGRlci5jcmVhdGVFbGVtZW50KG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0lMX1dTREwsIFdTRExDb25zdGFudHMuRUxFTV9SRUZFUkVOQ0UpKTsKLSAgICAgICAgICByZWZlcmVuY2Uuc2V0RW5kcG9pbnRQcmVzZW50KG5ldyBCb29sZWFuKHRydWUpKTsKLSAgICAgICAgICBSZWZlcmVuY2VkU2VydmljZSByZWZTZXJ2aWNlID0gKFJlZmVyZW5jZWRTZXJ2aWNlKSBleHRCdWlsZGVyLmNyZWF0ZUVsZW1lbnQobmV3IFFOYW1lKFdTRExDb25zdGFudHMuTlNfVVJJX1dTSUxfV1NETCwgV1NETENvbnN0YW50cy5FTEVNX1JFRl9TRVJWSUNFKSk7Ci0gICAgICAgICAgcmVmU2VydmljZS5zZXRSZWZlcmVuY2VkU2VydmljZU5hbWUoKFFOYW1lKSBpdC5uZXh0KCkpOwotICAgICAgICAgIHJlZmVyZW5jZS5zZXRSZWZlcmVuY2VkU2VydmljZShyZWZTZXJ2aWNlKTsKLSAgICAgICAgICBkZXNjLnNldEV4dGVuc2lvbkVsZW1lbnQocmVmZXJlbmNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBSZWZlcmVuY2UgcmVmZXJlbmNlID0gKFJlZmVyZW5jZSkgZXh0QnVpbGRlci5jcmVhdGVFbGVtZW50KG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0lMX1dTREwsIFdTRExDb25zdGFudHMuRUxFTV9SRUZFUkVOQ0UpKTsKLSAgICAgICAgcmVmZXJlbmNlLnNldEVuZHBvaW50UHJlc2VudChuZXcgQm9vbGVhbihmYWxzZSkpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gd3NkbEJpbmRpbmcuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEltcGxlbWVudGVkQmluZGluZyBiaW5kaW5nID0gKEltcGxlbWVudGVkQmluZGluZykgZXh0QnVpbGRlci5jcmVhdGVFbGVtZW50KG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0lMX1dTREwsIFdTRExDb25zdGFudHMuRUxFTV9JTVBMX0JJTkRJTkcpKTsKLSAgICAgICAgICBiaW5kaW5nLnNldEJpbmRpbmdOYW1lKChRTmFtZSkgaXQubmV4dCgpKTsKLSAgICAgICAgICByZWZlcmVuY2UuYWRkSW1wbGVtZW50ZWRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzZXJ2aWNlLmFkZERlc2NyaXB0aW9uKGRlc2MpOwotICAgICAgaW5zcGVjdGlvbi5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLSAgICBjYXRjaCAoV1NJTEV4Y2VwdGlvbiB3c2lsZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9VTkVYUEVDVEVEX0VYQ0VQVElPTiIpLCBTdGF0dXMuRVJST1IsIHdzaWxlKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OIiksIFN0YXR1cy5FUlJPUiwgdCk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKGlkLCAiIiwgU3RhdHVzLk9LLCBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmLCBhbmQgb25seSBpZiwgdGhlIENvbW1hbmQncyA8Y29kZT51bmRvPC9jb2RlPgotICAgKiBtZXRob2QgaXMgc3VwcG9ydGVkLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBDb21tYW5kIHN1cHBvcnRzIGJlaW5nIHVuZG9uZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFVuZG9lcyB0aGUgQ29tbWFuZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbnZpcm9ubWVudAotICAgKiAgICAgICAgICAgIFRoZSBlbnZpcm9ubWVudC4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHJldHVybiBBIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0IGluZGljYXRpbmcgdGhlIGRlZ3JlZSB0byB3aGljaCB0aGUKLSAgICogICAgICAgICA8Y29kZT51bmRvPC9jb2RlPiBtZXRob2Qgd2FzIHN1Y2Nlc3NmdWwuIEEgdmFsdWQgb2YgPGNvZGU+bnVsbDwvY29kZT4sCi0gICAqICAgICAgICAgb3IgYSBTdGF0dXMgd2l0aCBhIHNldmVyaXR5IG9mIGxlc3MgdGhhbiA8Y29kZT5TdGF0dXMuRVJST1I8L2NvZGU+Ci0gICAqICAgICAgICAgc2lnbmlmaWVzIHN1Y2Nlc3MuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIHVuZG8oRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCi0gIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhpZCwgIiIsIFN0YXR1cy5PSywgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogUmUtZXhlY3V0ZXMgdGhlIENvbW1hbmQuCi0gICAqIAotICAgKiBAcGFyYW0gZW52aXJvbm1lbnQKLSAgICogICAgICAgICAgICBUaGUgZW52aXJvbm1lbnQuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gQSA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlCi0gICAqICAgICAgICAgPGNvZGU+cmVkbzwvY29kZT4gbWV0aG9kIHdhcyBzdWNjZXNzZnVsLiBBIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+LAotICAgKiAgICAgICAgIG9yIGEgU3RhdHVzIHdpdGggYSBzZXZlcml0eSBvZiBsZXNzIHRoZW4gPGNvZGU+U3RhdHVzLkVSUk9SPC9jb2RlPgotICAgKiAgICAgICAgIHNpZ25pZmllcyBzdWNjZXNzLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyByZWRvKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgcmV0dXJuIGV4ZWN1dGUoZW52aXJvbm1lbnQpOwotICB9Ci0KLSAgcHJpdmF0ZSBEZWZpbml0aW9uIHBhcnNlV1NETChTdHJpbmcgd3NkbCwgQXJyYXlMaXN0IHdzZGxTZXJ2aWNlLCBBcnJheUxpc3Qgd3NkbEJpbmRpbmcsIFN0cmluZyBodHRwVXNlcm5hbWUsIFN0cmluZyBodHRwUGFzc3dvcmQpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBXZWJTZXJ2aWNlc1BhcnNlciB3c1BhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlcih3c2RsKTsKLSAgICBpZiAoaHR0cFVzZXJuYW1lICE9IG51bGwgJiYgaHR0cFBhc3N3b3JkICE9IG51bGwpCi0gICAgewotICAgICAgd3NQYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFVzZXJuYW1lKGh0dHBVc2VybmFtZSk7Ci0gICAgICB3c1BhcnNlci5zZXRIVFRQQmFzaWNBdXRoUGFzc3dvcmQoaHR0cFBhc3N3b3JkKTsKLSAgICB9Ci0gICAgd3NQYXJzZXIucGFyc2UoV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfTk9ORSk7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd3NQYXJzZXIuZ2V0V1NETERlZmluaXRpb24od3NkbCk7Ci0gICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNYXAgc2VydmljZXMgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VydmljZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgd3NkbFNlcnZpY2UuYWRkKHBhcnNlUU5hbWUoKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpIGl0Lm5leHQoKSkpOwotICAgICAgTWFwIGJpbmRpbmdzID0gZGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGJpbmRpbmdzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHdzZGxCaW5kaW5nLmFkZChwYXJzZVFOYW1lKChqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKSBpdC5uZXh0KCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZW5kcG9pbnRQcmVzZW50KERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHJldHVybiAoZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnNpemUoKSA+IDApOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFyZ3VtZW50cygpCi0gIHsKLSAgICByZXR1cm4gYXJnc187Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudHMoU3RyaW5nW10gYXJncykKLSAgewotICAgIGFyZ3NfID0gYXJnczsKLSAgfQotCi0gIHB1YmxpYyBXV1dBdXRoZW50aWNhdGlvbkhhbmRsZXIgZ2V0V1dXQXV0aGVudGljYXRpb25IYW5kbGVyKCkKLSAgewotICAgIHJldHVybiB3d3dBdXRoSGFuZGxlcl87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXV1dBdXRoZW50aWNhdGlvbkhhbmRsZXIoV1dXQXV0aGVudGljYXRpb25IYW5kbGVyIHd3d0F1dGhIYW5kbGVyKQotICB7Ci0gICAgd3d3QXV0aEhhbmRsZXJfID0gd3d3QXV0aEhhbmRsZXI7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcGFyc2VBcmd1bWVudHMoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50c0V4Y2VwdGlvbgotICB7Ci0gICAgY2xlYXJQYXJzZWRBcmdzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzXy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoQVJHX1dTSUwuZXF1YWxzKGFyZ3NfW2ldKSkKLSAgICAgICAgd3NpbF8gPSBhcmdzX1srK2ldOwotICAgICAgZWxzZSBpZiAoQVJHX1dTREwuZXF1YWxzKGFyZ3NfW2ldKSkKLSAgICAgICAgd3NkbHNfLmFkZChhcmdzX1srK2ldKTsKLSAgICAgIGVsc2UgaWYgKEFSR19SRVNPTFZFX1dTREwuZXF1YWxzKGFyZ3NfW2ldKSkKLSAgICAgICAgcmVzb2x2ZVdTRExfID0gdHJ1ZTsKLSAgICAgIGVsc2UgaWYgKEFSR19IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUUuZXF1YWxzKGFyZ3NfW2ldKSkKLSAgICAgICAgaHR0cFVzZXJuYW1lXyA9IGFyZ3NfWysraV07Ci0gICAgICBlbHNlIGlmIChBUkdfSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JELmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIGh0dHBQYXNzd29yZF8gPSBhcmdzX1srK2ldOwotICAgICAgZWxzZQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50c0V4Y2VwdGlvbihhcmdzX1tpXSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBRTmFtZSBwYXJzZVFOYW1lKFN0cmluZyBxbmFtZVN0cmluZykKLSAgewotICAgIGludCBjb2xvbkluZGV4ID0gcW5hbWVTdHJpbmcuaW5kZXhPZignOicpOwotICAgIFN0cmluZyBucyA9IChjb2xvbkluZGV4ICE9IC0xKSA/IHFuYW1lU3RyaW5nLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KSA6ICIiOwotICAgIFN0cmluZyBsb2NhbHBhcnQgPSAoY29sb25JbmRleCAhPSAtMSkgPyBxbmFtZVN0cmluZy5zdWJzdHJpbmcoY29sb25JbmRleCArIDEsIHFuYW1lU3RyaW5nLmxlbmd0aCgpKSA6IHFuYW1lU3RyaW5nOwotICAgIHJldHVybiBuZXcgUU5hbWUobnMsIGxvY2FscGFydCk7Ci0gIH0KLQotICBwcml2YXRlIFFOYW1lIHBhcnNlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSkKLSAgewotICAgIHJldHVybiBuZXcgUU5hbWUocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIEVsZW1lbnQyU3RyaW5nKEVsZW1lbnQgZSkgdGhyb3dzIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBieXRlW10gYiA9IG5ldyBieXRlWzBdOwotICAgIGlmIChlICE9IG51bGwpCi0gICAgewotICAgICAgRE9NU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZSk7Ci0gICAgICBUcmFuc2Zvcm1lciBzZXJpYWxpemVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLSAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjIiKTsKLSAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgc2VyaWFsaXplci50cmFuc2Zvcm0oZG9tU291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgIGJhb3MuY2xvc2UoKTsKLSAgICAgIGIgPSBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU3RyaW5nKGIpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgcGxhdGZvcm0yRmlsZShVUklGYWN0b3J5IHVyaUZhY3RvcnksIFN0cmluZyB1cmkpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gdXJpRmFjdG9yeS5uZXdVUkkodXJpKS5hc0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICB0LnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIEZXRF9TTEFTSCA9ICcvJzsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIEJXRF9TTEFTSCA9ICdcXCc7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhcmVudERpciA9ICIuLi8iOwotCi0gIHByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlVVJJKFN0cmluZyBiYXNlVVJJLCBTdHJpbmcgdGFyZ2V0VVJJKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIGJhc2VVUklDb3B5ID0gYmFzZVVSSS5yZXBsYWNlKEJXRF9TTEFTSCwgRldEX1NMQVNIKTsKLSAgICAgIFN0cmluZyB0YXJnZXRVUklDb3B5ID0gdGFyZ2V0VVJJLnJlcGxhY2UoQldEX1NMQVNILCBGV0RfU0xBU0gpOwotICAgICAgaW50IG1hdGNoaW5nSW5kZXggPSAtMTsKLSAgICAgIGludCBpbmRleCA9IHRhcmdldFVSSUNvcHkuaW5kZXhPZihGV0RfU0xBU0gpOwotICAgICAgd2hpbGUgKGluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBpZiAoYmFzZVVSSUNvcHkuc3RhcnRzV2l0aCh0YXJnZXRVUklDb3B5LnN1YnN0cmluZygwLCBpbmRleCArIDEpKSkKLSAgICAgICAgewotICAgICAgICAgIG1hdGNoaW5nSW5kZXggPSBpbmRleDsKLSAgICAgICAgICBpbmRleCA9IHRhcmdldFVSSUNvcHkuaW5kZXhPZihGV0RfU0xBU0gsIGluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKG1hdGNoaW5nSW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGludCBzbGFzaENvdW50ID0gLTE7Ci0gICAgICAgIGludCBmcm9tSW5kZXggPSBtYXRjaGluZ0luZGV4OwotICAgICAgICB3aGlsZSAoZnJvbUluZGV4ICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgc2xhc2hDb3VudCsrOwotICAgICAgICAgIGZyb21JbmRleCA9IGJhc2VVUklDb3B5LmluZGV4T2YoRldEX1NMQVNILCBmcm9tSW5kZXggKyAxKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgcmVsYXRpdmVVUkkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2xhc2hDb3VudDsgaSsrKQotICAgICAgICAgIHJlbGF0aXZlVVJJLmFwcGVuZChwYXJlbnREaXIpOwotICAgICAgICByZWxhdGl2ZVVSSS5hcHBlbmQodGFyZ2V0VVJJLnN1YnN0cmluZyhtYXRjaGluZ0luZGV4ICsgMSwgdGFyZ2V0VVJJLmxlbmd0aCgpKSk7Ci0gICAgICAgIHJldHVybiByZWxhdGl2ZVVSSS50b1N0cmluZygpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gdGFyZ2V0VVJJOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1NpbXBsZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9TaW1wbGVDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMDYyNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c3J0L1NpbXBsZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29udGV4dCBpbXBsZW1lbnRzIElDb250ZXh0IHsKLQotCWJvb2xlYW4gZGV2ZWxvcDsKLQlib29sZWFuIGFzc2VtYmxlOwotCWJvb2xlYW4gZGVwbG95OwotCWJvb2xlYW4gaW5zdGFsbDsKLQlib29sZWFuIHJ1bjsKLQlib29sZWFuIGNsaWVudDsKLQlib29sZWFuIHRlc3Q7Ci0JYm9vbGVhbiBwdWJsaXNoOwotCQotCVdlYlNlcnZpY2VTY2VuYXJpbyBzY2VuYXJpbzsKLQkKLQlib29sZWFuIG92ZXJ3cml0ZUZpbGVzOwotCWJvb2xlYW4gY3JlYXRlRm9sZGVyczsKLQlib29sZWFuIGNoZWNrT3V0RmlsZXM7Ci0JCi0JCi0JCi0JCi0JcHVibGljIFNpbXBsZUNvbnRleHQoKQotCXsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIFNpbXBsZUNvbnRleHQoYm9vbGVhbiBkZXZlbG9wLCBib29sZWFuIGFzc2VtYmxlLCBib29sZWFuIGRlcGxveSwgYm9vbGVhbiBpbnN0YWxsLCBib29sZWFuIHJ1biwgYm9vbGVhbiBjbGllbnQsIGJvb2xlYW4gdGVzdCwgYm9vbGVhbiBwdWJsaXNoLCBXZWJTZXJ2aWNlU2NlbmFyaW8gc2NlbmFyaW8sIGJvb2xlYW4gb3ZlcndyaXRlRmlsZXMsIGJvb2xlYW4gZm9sZGVycywgYm9vbGVhbiBjaGVja091dEZpbGVzKSB7Ci0JCXN1cGVyKCk7CQkKLQkJdGhpcy5kZXZlbG9wID0gZGV2ZWxvcDsKLQkJdGhpcy5hc3NlbWJsZSA9IGFzc2VtYmxlOwotCQl0aGlzLmRlcGxveSA9IGRlcGxveTsKLQkJdGhpcy5pbnN0YWxsID0gaW5zdGFsbDsKLQkJdGhpcy5ydW4gPSBydW47Ci0JCXRoaXMuY2xpZW50ID0gY2xpZW50OwotCQl0aGlzLnRlc3QgPSB0ZXN0OwotCQl0aGlzLnB1Ymxpc2ggPSBwdWJsaXNoOwotCQl0aGlzLnNjZW5hcmlvID0gc2NlbmFyaW87Ci0JCXRoaXMub3ZlcndyaXRlRmlsZXMgPSBvdmVyd3JpdGVGaWxlczsKLQkJdGhpcy5jcmVhdGVGb2xkZXJzID0gZm9sZGVyczsKLQkJdGhpcy5jaGVja091dEZpbGVzID0gY2hlY2tPdXRGaWxlczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0QXNzZW1ibGUoKSB7Ci0JCXJldHVybiBhc3NlbWJsZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0QXNzZW1ibGUoYm9vbGVhbiBhc3NlbWJsZSkgewotCQl0aGlzLmFzc2VtYmxlID0gYXNzZW1ibGU7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldENoZWNrT3V0RmlsZXMoKSB7Ci0JCXJldHVybiBjaGVja091dEZpbGVzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRDaGVja091dEZpbGVzKGJvb2xlYW4gY2hlY2tPdXRGaWxlcykgewotCQl0aGlzLmNoZWNrT3V0RmlsZXMgPSBjaGVja091dEZpbGVzOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDbGllbnQoKSB7Ci0JCXJldHVybiBjbGllbnQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldENsaWVudChib29sZWFuIGNsaWVudCkgewotCQl0aGlzLmNsaWVudCA9IGNsaWVudDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0Q3JlYXRlRm9sZGVycygpIHsKLQkJcmV0dXJuIGNyZWF0ZUZvbGRlcnM7Ci0JfQotCXB1YmxpYyB2b2lkIHNldENyZWF0ZUZvbGRlcnMoYm9vbGVhbiBjcmVhdGVGb2xkZXJzKSB7Ci0JCXRoaXMuY3JlYXRlRm9sZGVycyA9IGNyZWF0ZUZvbGRlcnM7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldERlcGxveSgpIHsKLQkJcmV0dXJuIGRlcGxveTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RGVwbG95KGJvb2xlYW4gZGVwbG95KSB7Ci0JCXRoaXMuZGVwbG95ID0gZGVwbG95OwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZXZlbG9wKCkgewotCQlyZXR1cm4gZGV2ZWxvcDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RGV2ZWxvcChib29sZWFuIGRldmVsb3ApIHsKLQkJdGhpcy5kZXZlbG9wID0gZGV2ZWxvcDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0SW5zdGFsbCgpIHsKLQkJcmV0dXJuIGluc3RhbGw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEluc3RhbGwoYm9vbGVhbiBpbnN0YWxsKSB7Ci0JCXRoaXMuaW5zdGFsbCA9IGluc3RhbGw7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldE92ZXJXcml0ZUZpbGVzKCkgewotCQlyZXR1cm4gb3ZlcndyaXRlRmlsZXM7Ci0JfQotCXB1YmxpYyB2b2lkIHNldE92ZXJXcml0ZUZpbGVzKGJvb2xlYW4gb3ZlcndyaXRlRmlsZXMpIHsKLQkJdGhpcy5vdmVyd3JpdGVGaWxlcyA9IG92ZXJ3cml0ZUZpbGVzOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoKCkgewotCQlyZXR1cm4gcHVibGlzaDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UHVibGlzaChib29sZWFuIHB1Ymxpc2gpIHsKLQkJdGhpcy5wdWJsaXNoID0gcHVibGlzaDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0UnVuKCkgewotCQlyZXR1cm4gcnVuOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRSdW4oYm9vbGVhbiBydW4pIHsKLQkJdGhpcy5ydW4gPSBydW47Ci0JfQotCXB1YmxpYyBXZWJTZXJ2aWNlU2NlbmFyaW8gZ2V0U2NlbmFyaW8oKSB7Ci0JCXJldHVybiBzY2VuYXJpbzsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U2NlbmFyaW8oV2ViU2VydmljZVNjZW5hcmlvIHNjZW5hcmlvKSB7Ci0JCXRoaXMuc2NlbmFyaW8gPSBzY2VuYXJpbzsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0VGVzdCgpIHsKLQkJcmV0dXJuIHRlc3Q7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFRlc3QoYm9vbGVhbiB0ZXN0KSB7Ci0JCXRoaXMudGVzdCA9IHRlc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxM2YyNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotd3NkbGVkaXRvci5qYXIKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3Qud3NkbC51aV8xLjAuMC5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWE0ZGRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NkbC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZjY5MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHdzZGxlZGl0b3IuamFyCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IHdzZGxlZGl0b3IuamFyCi1zb3VyY2Uud3NkbGVkaXRvci5qYXIgPSBzcmMvCi1vdXRwdXQud3NkbGVkaXRvci5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3JlbG9hZGdyYW1tYXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9pY29ucy9yZWxvYWRncmFtbWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0YzljYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3JlbG9hZGdyYW1tYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9pY29ucy92YWxpZGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3ZhbGlkYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzNDdhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvd3NkbF9maWxlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3dzZGxfZmlsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWIxZjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvd3NkbF9maWxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2NTdlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hCi0hIFBsdWdpbgotIQotX1VJX1BMVUdJTl9OQU1FICAgICAgICAgICAgID0gV1NETCBFZGl0b3IKLV9VSV9FRElUT1JfTkFNRSAgICAgICAgICAgICA9IFdTREwgRWRpdG9yCi1fVUlfV1NETF9MQUJFTCAgICAgICAgICAgICAgPSBXU0RMIEZpbGVzCi0KLQotX1VJX0hJREVfQklORElOR1MgICAgICAgICAgID0gSGlkZSBCaW5kaW5ncwotX1VJX0JBQ0tfVE8gICAgICAgICAgICAgICAgID0gQmFjayB0byB7MH0KLV9VSV9CQUNLICAgICAgICAgICAgICAgICAgICA9IEJhY2sgdG8gUHJldmlvdXMgVmlldwotCi0hIE5ldyBwcm9wZXJ0eSB0YWJzCi1fVUlfTEFCRUxfR0VORVJBTCAgICAgICA9IEdlbmVyYWwKLV9VSV9MQUJFTF9PVEhFUiAgICAgICAgID0gT3RoZXIKLV9VSV9MQUJFTF9BVFRSSUJVVEVTICAgID0gQXR0cmlidXRlcwotX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT04gPSBEb2N1bWVudGF0aW9uCi1fVUlfTEFCRUxfRkFDRVRTICAgICAgICA9IEZhY2V0cwotX1VJX0xBQkVMX0VOVU1FUkFUSU9OUyAgPSBFbnVtZXJhdGlvbnMKLV9VSV9MQUJFTF9OQU1FU1BBQ0UgICAgID0gTmFtZXNwYWNlCi0KLSEgU2VjdGlvbiB0aXRsZSBmb3Igb3RoZXIgYXR0cmlidXRlcwotX1VJX1NFQ1RJT05fQURWQU5DRURfQVRUUklCVVRFUyAgID0gQWR2YW5jZWQKLQotIQotISBXb3JrYm9vayBQYWdlcwotIQotX1VJX1RBQl9TT1VSQ0UgPSBTb3VyY2UKLV9VSV9UQUJfR1JBUEggID0gR3JhcGgKLQotX1VJX0FERF9FWFRFTlNJQklMSVRZX0VMRU1FTlQgICAgPSBBZGQgRXh0ZW5zaWJpbGl0eSBFbGVtZW50Ci1fVUlfQ1JFQVRFX1dTRExfRE9DVU1FTlRBVElPTiAgICA9IENyZWF0ZSBXU0RMIERvY3VtZW50YXRpb24KLV9VSV9GT0xERVJfTk9UX0NSRUFURUQgICAgICAgICAgID0gRm9sZGVyIG5vdCBjcmVhdGVkCi1fVUlfQ1JFQVRJTkdfRE9DVU1FTlRBVElPTiAgICAgICA9IENyZWF0aW5nIERvY3VtZW50YXRpb24KLV9VSV9MQUJFTF9DUkVBVEVfRk9MREVSX0ZPUl9ET0NTID0gQ3JlYXRlIGEgbmV3IGZvbGRlciBmb3IgdGhlIGh0bWwgZG9jdW1lbnRhdGlvbiBmaWxlcwotX1VJX0xBQkVMX0NSRUFUSU5HX0hUTUxfRklMRVMgICAgPSBDcmVhdGluZyBIVE1MIGZpbGVzCi1fVUlfTEFCRUxfTkVXX0ZPTERFUiAgICAgICAgICAgICA9IE5ldyBmb2xkZXIKLQotX1VJX0FDVElPTl9BREQgICAgICAgICAgICAgPSBBZGQKLV9VSV9BQ1RJT05fQ09QWSAgICAgICAgICAgID0gQ29weQotX1VJX0FDVElPTl9QQVNURSAgICAgICAgICAgPSBQYXN0ZQotX1VJX0FDVElPTl9ERUxFVEUgICAgICAgICAgPSBEZWxldGUKLV9VSV9BQ1RJT05fTVVMVElQTEVfREVMRVRFID0gTXVsdGlwbGUgRGVsZXRlCi1fVUlfQUNUSU9OX1JFTkFNRSAgICAgICAgICA9IFJlbmFtZQotCi1fVUlfTEFCRUxfQklORElOR19XSVpBUkQgPSBCaW5kaW5nIFdpemFyZAotX1VJX0FDVElPTl9HRU5FUkFURV9IVE1MX0RPQ1VNRU5UQVRJT04gPSBHZW5lcmF0ZSBIVE1MIERvY3VtZW50YXRpb24gZm9yIHRoaXMgV1NETCBkb2N1bWVudAotX1VJX0FDVElPTl9WQUxJREFURV9XU0RMX0RPQ1VNRU5UID0gVmFsaWRhdGUgV1NETCBEb2N1bWVudAotCi1fVUlfQUNUSU9OX0FERF9DSElMRCAgICAgICAgPSBBZGQgQ2hpbGQKLV9VSV9BQ1RJT05fU0VUX0JJTkRJRyAgICAgICA9IFNldCBCaW5kaW5nLi4uCi1fVUlfQUNUSU9OX1NFVF9QT1JUVFlQRSAgICAgPSBTZXQgUG9ydFR5cGUuLi4KLV9VSV9BQ1RJT05fU0VUX01FU1NBR0UgICAgICA9IFNldCBNZXNzYWdlLi4uCi1fVUlfQUNUSU9OX1NFVF9FTEVNRU5UICAgICAgPSBTZXQgRWxlbWVudC4uLgotX1VJX0FDVElPTl9TRVRfVFlQRSAgICAgICAgID0gU2V0IFR5cGUuLi4KLV9VSV9MQUJFTF9CSU5ESU5HX09QRVJBVElPTiA9IEJpbmRpbmcgT3BlcmF0aW9uCi1fVUlfQUNUSU9OX05FV19NRVNTQUdFICAgICAgPSBOZXcgTWVzc2FnZQotX1VJX0FDVElPTl9ORVdfU0VSVklDRSAgICAgID0gTmV3IFNlcnZpY2UKLV9VSV9BQ1RJT05fTkVXX1BPUlRUWVBFICAgICA9IE5ldyBQb3J0VHlwZQotX1VJX0FDVElPTl9ORVdfQklORElORyAgICAgID0gTmV3IEJpbmRpbmcKLV9VSV9BQ1RJT05fTkVXX1BPUlQgICAgICAgICA9IE5ldyBQb3J0Ci1fVUlfQUNUSU9OX05FV19PUEVSQVRJT04gICAgPSBOZXcgT3BlcmF0aW9uCi1fVUlfQUNUSU9OX05FV19GQVVMVCAgICAgICAgPSBOZXcgRmF1bHQKLV9VSV9BQ1RJT05fTkVXX1BBUlQgICAgICAgICA9IE5ldyBQYXJ0Ci0KLV9VSV9BQ1RJT05fQUREX0lNUE9SVCAgICAgICAgICAgID0gQWRkIEltcG9ydAotX1VJX0FDVElPTl9BRERfU0NIRU1BICAgICAgICAgICAgPSBBZGQgU2NoZW1hCi1fVUlfQUNUSU9OX0FERF9TRVJWSUNFICAgICAgICAgICA9IEFkZCBTZXJ2aWNlCi1fVUlfQUNUSU9OX0FERF9CSU5ESU5HICAgICAgICAgICA9IEFkZCBCaW5kaW5nCi1fVUlfQUNUSU9OX0FERF9PUEVSQVRJT04gICAgICAgICA9IEFkZCBPcGVyYXRpb24KLV9VSV9BQ1RJT05fQUREX0JJTkRJTkdfT1BFUkFUSU9OID0gQWRkIEJpbmRpbmcgT3BlcmF0aW9uCi1fVUlfQUNUSU9OX0FERF9QQVJUICAgICAgICAgICAgICA9IEFkZCBQYXJ0Ci1fVUlfQUNUSU9OX0FERF9QT1JUICAgICAgICAgICAgICA9IEFkZCBQb3J0Ci1fVUlfQUNUSU9OX0FERF9QT1JUVFlQRSAgICAgICAgICA9IEFkZCBQb3J0IFR5cGUKLV9VSV9BQ1RJT05fQUREX01FU1NBR0UgICAgICAgICAgID0gQWRkIE1lc3NhZ2UKLV9VSV9BQ1RJT05fQUREX0lOUFVUICAgICAgICAgICAgID0gQWRkIElucHV0Ci1fVUlfQUNUSU9OX0FERF9PVVRQVVQgICAgICAgICAgICA9IEFkZCBPdXRwdXQKLV9VSV9BQ1RJT05fQUREX0ZBVUxUICAgICAgICAgICAgID0gQWRkIEZhdWx0Ci0KLV9VSV9MQUJFTF9ERUZJTklUSU9OID0gRGVmaW5pdGlvbgotX1VJX0xBQkVMX0JJTkRJTkcgID0gQmluZGluZwotX1VJX0xBQkVMX0lOUFVUICAgID0gSW5wdXQKLV9VSV9MQUJFTF9PVVRQVVQgICA9IE91dHB1dAotX1VJX0xBQkVMX0ZBVUxUICAgID0gRmF1bHQKLV9VSV9MQUJFTF9NRVNTQUdFICA9IE1lc3NhZ2UKLV9VSV9MQUJFTF9QT1JUICAgICA9IFBvcnQKLV9VSV9MQUJFTF9QT1JUVFlQRSA9IFBvcnQgVHlwZQotX1VJX0xBQkVMX1NFUlZJQ0UgID0gU2VydmljZQotX1VJX0xBQkVMX0VMRU1FTlRTID0gRWxlbWVudHMKLV9VSV9MQUJFTF9UWVBFUyAgICA9IFR5cGVzCi1fVUlfTEFCRUxfTkFNRSAgICAgID0gTmFtZQotX1VJX0xBQkVMX09QRVJBVElPTiA9IE9wZXJhdGlvbgotX1VJX0xBQkVMX0VMRU1FTlQgID0gRWxlbWVudAotX1VJX0xBQkVMX1RZUEUgICAgID0gVHlwZQotCi1fVUlfTEFCRUxfUkVBRF9PTkxZICAgICA9IHJlYWQtb25seQotCi0hIE5vdGUgdG8gdHJhbnNsYXRvcnM6IGtlZXAgdGhlIG9uZSBjaGFyYWN0ZXIgc3BhY2UgYW5kIGNvbG9uIGFmdGVyIHRoZSB0cmFuc2xhdGlvbiBvZiBWaWV3Ci1fVUlfTUVOVV9WSUVXICAgICAgICAgPSBWaWV3IDoKLV9VSV9MQUJFTF9YU0RfQ09NUE9ORU5UUyA9IFhTRCBDb21wb25lbnRzCi0KLV9VSV9MQUJFTF9VTktOT1dOX09CSkVDVCA9IFVua25vd24gT2JqZWN0Ci1fVUlfTEFCRUxfVU5LTk9XTl9OT0RFICAgPSBVbmtub3duIE5vZGUKLV9VSV9MQUJFTF9WSUVXX05PVF9BVkFJTEFCTEUgPSBWaWV3IG5vdCBhdmFpbGFibGUgZm9yIHNlbGVjdGVkIG9iamVjdAotCi1fVUlfTEFCRUxfUE9SVF9XX0NPTE9OICAgICA9IFBvcnQgOiAKLV9VSV9MQUJFTF9QT1JUVFlQRV9XX0NPTE9OID0gUG9ydFR5cGUgOiAKLV9VSV9MQUJFTF9TRVJWSUNFX1dfQ09MT04gID0gU2VydmljZSA6IAotX1VJX0xBQkVMX1VOS05PV04gID0gVW5rbm93biA6IAotX1VJX0xBQkVMX1ZJRVdfQllfU0VSVklDRSA9IFZpZXcgQnkgOiBTZXJ2aWNlCi0KLV9VSV9GT0xERVJfSU1QT1JUUyA9IEltcG9ydHMKLV9VSV9GT0xERVJfTUVTU0FHRVM9IE1lc3NhZ2VzCi1fVUlfRk9MREVSX1NFUlZJQ0VTID0gU2VydmljZXMKLV9VSV9GT0xERVJfQklORElOR1MgPSBCaW5kaW5ncwotX1VJX0ZPTERFUl9QT1JUVFlQRVMgPSBQb3J0IFR5cGVzCi1fVUlfRk9MREVSX1RZUEVTICAgICA9IFR5cGVzCi1fVUlfRk9MREVSX0VYVEVOU0lCSUxJVFlfRUxFTUVOVFMgPSBFeHRlbnNpYmxpdHkgRWxlbWVudHMKLV9VSV9GT0xERVJfREVGSU5JVElPTiA9IERlZmluaXRpb24KLQotX1VJX0xBQkVMX05PTkUgPSAobm9uZSkKLV9VSV9NRU5VQkFSX0dFTkVSQVRFX0JJTkRJTkcgPSBHZW5lcmF0ZSBCaW5kaW5nCi0KLV9VSV9MQUJFTF9IVFRQX0JJTkRJTkdfT1BUSU9OUyA9IEhUVFAgQmluZGluZyBPcHRpb25zCi0KLV9VSV9TT01FX0VMRU1FTlRfTkFNRSA9IHNvbWUtZWxlbWVudC1uYW1lCi0KLV9VSV9MQUJFTF9CSU5ESU5HX0lOUFVUICAgPSBCaW5kaW5nIElucHV0Ci1fVUlfTEFCRUxfQklORElOR19PVVRQVVQgID0gQmluZGluZyBPdXRwdXQKLV9VSV9MQUJFTF9CSU5ESU5HX0ZBVUxUICAgPSBCaW5kaW5nIEZhdWx0Ci0KLV9VSV9MQUJFTF9CSU5ESU5HX09QRVJBVElPTiA9IEJpbmRpbmcgT3BlcmF0aW9uCi0KLV9VSV9MQUJFTF9VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVCA9IFVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50Ci0KLV9VSV9MQUJFTF9JTVBPUlQgPSBJbXBvcnQKLV9VSV9MQUJFTF9OQU1FU1BBQ0UgPSBOYW1lc3BhY2UKLV9VSV9MQUJFTF9QUkVGSVggPSBQcmVmaXgKLV9VSV9MQUJFTF9MT0NBVElPTiA9IExvY2F0aW9uCi1fVUlfVElUTEVfU0VMRUNUID0gU2VsZWN0Ci1fVUlfVElUTEVfU0VMRUNUX0ZJTEUgPSBTZWxlY3QgRmlsZQotX1VJX0RFU0NSSVBUSU9OX1NFTEVDVF9XU0RMX09SX1hTRCA9IFNlbGVjdCBhIFdTREwgb3IgWFNEIGZpbGUgdG8gaW1wb3J0LgotCi1fVUlfTEFCRUxfUEFSQU1FVEVSX09SREVSID0gUGFyYW1ldGVyIE9yZGVyCi1fVUlfTEFCRUxfUEFSVCA9IFBhcnQKLV9VSV9MQUJFTF9SRUZFUkVOQ0VfS0lORCA9IFJlZmVyZW5jZSBraW5kOgotX1VJX0xBQkVMX09WRVJWSUVXID0gT3ZlcnZpZXcKLV9VSV9MQUJFTF9WSUVXX05PVF9JTVBMRU1FTlRFRCA9IFRoaXMgdmlldyBpcyBub3QgeWV0IGltcGxlbWVudGVkLgotX1VJX0xBQkVMX0JJTkRJTkdfVklFVyA9IEJpbmRpbmcgVmlldwotX1VJX0xBQkVMX0RPQ1VNRU5USU9OID0gRG9jdW1lbnRhdGlvbgotX1VJX0xBQkVMX1BST1BFUlRZID0gUHJvcGVydHkKLV9VSV9MQUJFTF9WQUxVRSA9IFZhbHVlCi0KLV9VSV9CVVRUT05fTkVXICAgID0gTmV3Li4uCi1fVUlfQlVUVE9OX0lNUE9SVCA9IEltcG9ydC4uLgotCi1fVUlfQlVUVE9OX0NSRUFURV9BU1NPQ0lBVEVEX0JJTkRJTkdTID0gQ3JlYXRlIGFzc29jaWF0ZWQgYmluZGluZ3MKLV9VSV9USVRMRV9HRU5FUkFURV9CSU5ESU5HX1dJWkFSRCA9IEdlbmVyYXRlIEJpbmRpbmcgV2l6YXJkCi0KLV9VSV9MQUJFTF9OQU1FU1BBQ0VfVVJJU19UT19CRV9JTkNMVURFRCA9IE5hbWVzcGFjZSBVUklzIHRvIGJlIGluY2x1ZGVkCi1fVUlfQUNUSU9OX0FERCA9IEFkZAotCi1fVUlfVElUTEVfU0VMRUNUX1dTRExfRklMRSA9IFNlbGVjdCBXU0RMIEZpbGUKLV9VSV9ERVNDUklQVElPTl9TRUxFQ1RfV1NETF9GSUxFX1RPX0lNUE9SVCA9IFNlbGVjdCBhIFdTREwgZmlsZSB0byBpbXBvcnQKLQotX1VJX1RJVExFX1NQRUNJRllfQklORElORyA9IFNwZWNpZnkgQmluZGluZwotX1VJX1RJVExFX1NQRUNJRllfVFlQRSA9IFNwZWNpZnkgVHlwZQotX1VJX1RJVExFX1NQRUNJRllfRUxFTUVOVCA9IFNwZWNpZnkgRWxlbWVudAotX1VJX1RJVExFX1NQRUNJRllfTUVTU0FHRSA9IFNwZWNpZnkgTWVzc2FnZQotX1VJX1RJVExFX1NQRUNJRllfUE9SVFRZUEUgPSBTcGVjaWZ5IFBvcnQgVHlwZQotCi1fVUlfVElUTEVfU1BFQ0lGWV9CSU5ESU5HX0RFVEFJTFMgPSBTcGVjaWZ5IEJpbmRpbmcgRGV0YWlscwotX1VJX0xBQkVMX1NQRUNJRllfQklORElOR19ERVRBSUxTX0RFU0MgPSBTcGVjaWZ5IHRoZSBkZXRhaWxzIG9mIHRoZSBiaW5kaW5nIHlvdSB3aXNoIHRvIGdlbmVyYXRlLgotCi0hIFRyYW5zbGF0b3JzOiBMZWF2ZSB0aGUgezB9IGFzIGlzCi1fVUlfUkFESU9fU0VMRUNUX0VYSVNUSU5HICA9IFNlbGVjdCBhbiBleGlzdGluZyB7MH0KLV9VSV9SQURJT19DUkVBVEVfTkVXICAgICAgID0gQ3JlYXRlIGEgbmV3IHswfQotX1VJX1JBRElPX0lNUE9SVF9GUk9NX0ZJTEUgPSBJbXBvcnQgezB9IGZyb20gYSBmaWxlCi1fVUlfTEFCRUxfTkFNRV9PRl9JVEVNICAgICA9IE5hbWUgb2YgezB9OgotCi0hIFRyYW5zbGF0b3JzOiBMZWF2ZSB0aGUgezB9IGFzIGlzCi1fVUlfREVTQ1JJUFRJT05fQ0hPT1NFX0ZST01fRVhJU1RJTkcgPSBDaG9vc2UgezB9IGZyb20gdGhlIGxpc3QKLV9VSV9ERVNDUklQVElPTl9QUk9WSURFX05BTUUgPSBQcm92aWRlIGEgbmFtZSBvZiB0aGUgezB9IHRvIGNyZWF0ZQotX1VJX0RFU0NSSVBUSU9OX0lNUE9SVF9GSUxFID0gU2VsZWN0IGEgZmlsZSBhbmQgdGhlbiBjaG9vc2UgdGhlIHswfQotX1VJX0hFTFAgPSBIZWxwCi1fVUlfTEFCRUxfRklMRSA9IEZpbGU6Ci1fVUlfQlVUVE9OX0JST1dTRSA9IEJyb3dzZS4uLgotCi1fVUlfVElUTEVfTkVXX1dTRExfRklMRSA9IE5ldyBXU0RMIEZpbGUKLV9VSV9USVRMRV9PUFRJT05TICAgICAgID0gT3B0aW9ucwotCi1fVUlfREVTQ1JJUFRJT05fU1BFQ0lGWV9CSU5ESU5HX1BBR0UgPSBEZXNjcmlwdGlvbiBvZiBTcGVjaWZ5IEJpbmRpbmcgUGFnZQotX1VJX1JBRElPX0dFTkVSQVRFX0NPTlRFTlQgPSBHZW5lcmF0ZSBjb250ZW50IGZvciBhbiBleGlzdGluZyBiaW5kaW5nCi1fVUlfUkFESU9fR0VORVJBVEVfTkVXX0JJTkRJTkcgPSBHZW5lcmF0ZSBhIG5ldyBiaW5kaW5nCi1fVUlfTEFCRUxfQklORElOR19OQU1FID0gTmFtZToKLV9VSV9MQUJFTF9CSU5ESU5HX1BST1RPQ09MID0gUHJvdG9jb2w6Ci1fVUlfQ0hFQ0tCT1hfT1ZFUldSSVRFID0gT3ZlcndyaXRlIGV4aXN0aW5nIGJpbmRpbmcgaW5mb3JtYXRpb24KLV9VSV9MQUJFTF9TT0FQX0JJTkRJTkdfT1BUSU9OUyA9IFNPQVAgQmluZGluZyBPcHRpb25zCi1fVUlfUkFESU9fRE9DVU1FTlRfTElURVJBTCA9IGRvY3VtZW50IGxpdGVyYWwKLV9VSV9SQURJT19SUENfTElURVJBTCA9IHJwYyBsaXRlcmFsCi1fVUlfUkFESU9fUlBDX0VOQ09ERUQgPSBycGMgZW5jb2RlZAotCi1fVUlfREVTQ1JJUFRJT05fTkVXX1dTRExfRklMRSA9IFNwZWNpZnkgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBuZXcgV1NETCBmaWxlLgotX1VJX0xBQkVMX1RBUkdFVF9OQU1FU1BBQ0UgPSBUYXJnZXQgbmFtZXNwYWNlOgotX1VJX0xBQkVMX1BSRUZJWF9XSVRIX0NPTE9OID0gUHJlZml4OgotX1VJX0xBQkVMX0RFRklOSVRJT05fTkFNRSAgID0gRGVmaW5pdGlvbiBuYW1lOgotX1VJX0xBQkVMX0NSRUFURV9ORVdfV1NETF9GSUxFID0gQ3JlYXRlIGEgbmV3IFdTREwgRmlsZQotX1VJX0xBQkVMX0NSRUFURV9XU0RMX1NLRUxFVE9OID0gQ3JlYXRlIFdTREwgU2tlbGV0b24KLV9VSV9MQUJFTF9ORVdfQ0FURUdPUllfTkFNRV9XUyA9IFdlYiBTZXJ2aWNlcwotCi0hIFRyYW5zbGF0b3JzOiBMZWF2ZSB0aGUgezB9IGFzIGlzCi1fVUlfRVJST1JfTkFNRVNQQUNFX0lOVkFMSUQgPSBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBpcyBpbnZhbGlkCi1fVUlfRVJST1JfUFJFRklYX0lTX0lOVkFMSUQgPSBQcmVmaXggezB9IGlzIGludmFsaWQKLV9VSV9FUlJPUl9QUkVGSVhfSVNfQV9EVVBMSUNBVEUgPSBQcmVmaXggezB9IGlzIGEgZHVwbGljYXRlCi1fVUlfRVJST1JfTU9SRV9USEFOX09ORV9QUkVGSVhfSVNfQkxBTksgPSBNb3JlIHRoYW4gb25lIHByZWZpeCBpcyBibGFuawotX1VJX0VSUk9SX0ZJTEVfTVVTVF9FTkRfV0lUSF9XU0RMID0gRXJyb3I6IEZpbGUgbXVzdCBlbmQgd2l0aCB3c2RsCi1fVUlfRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyA9IEZpbGUgYWxyZWFkeSBleGlzdHM6IHswfQotCi1fVUlfRVJST1JfSU5WQUxJRF9XU0RMID0gSW52YWxpZCBXU0RMCi1fVUlfRVJST1JfSU5WQUxJRF9XU0RMX0RFU0MgPSBUaGUgV1NETCBGaWxlIGlzIGludmFsaWQuICBGaXggZXJyb3JzIGFuZCB0aGVuIHJldHJ5IHRoaXMgYWN0aW9uLgotX1VJX0VSUk9SX0VSUk9SICAgICAgICAgICAgID0gRXJyb3IKLV9VSV9FUlJPUl9GT0xERVJfTk9UX0NSRUFURUQgID0gRm9sZGVyIG5vdCBjcmVhdGVkLgotX1VJX0VSUk9SX0NSRUFUSU5HX0hUTUxfRklMRVMgPSBFcnJvciBjcmVhdGluZyBIVE1MIGZpbGVzLgotCi1fVUlfRVJST1JfSU1QT1JUX0VSUk9SICAgICAgPSBJbXBvcnQgRXJyb3IKLV9VSV9FUlJPUl9JTVBPUlRJTkdfSVRTRUxGICA9IFRoaXMgZmlsZSBpcyBhdHRlbXB0aW5nIHRvIGltcG9ydCBpdHNlbGYuICBDaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbXBvcnQuCi0KLQotX1VJX1VTRV9XUy1JX1NUWUxFX1NDSEVNQV9JTVBPUlQgICAgICAgPSBVc2UgV1MtSSBzdHlsZSBzY2hlbWEgaW1wb3J0Ci1fVUlfQklORElOR19XSVpBUkQgICAgICAgICAgICAgICAgICAgICA9IEJpbmRpbmcgV2l6YXJkCi1fVUlfU1BFQ0lGWV9CSU5ESU5HX0RFVEFJTFNfTEFCRUwgICAgICA9IFNwZWNpZnkgdGhlIGRldGFpbHMgb2YgdGhlIGJpbmRpbmcgdGhhdCB3aWxsIGJlIGNyZWF0ZWQKLV9VSV9QT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gUG9ydCBUeXBlCi1fVUlfUE9SVF9XSVpBUkQgICAgICAgICAgICAgICAgICAgICAgICA9IFBvcnQgV2l6YXJkCi1fVUlfU1BFQ0lGWV9QT1JUX0RFVEFJTFMgICAgICAgICAgICAgICA9IFNwZWNpZnkgUG9ydCBEZXRhaWxzCi1fVUlfU1BFQ0lGWV9QT1JUX0RFVEFJTFNfVE9fQkVfQ1JFQVRFRCA9IFNwZWNpZnkgdGhlIGRldGFpbHMgb2YgdGhlIHBvcnQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQKLV9VSV9CSU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQmluZGluZwotX1VJX05BTUVTUEFDRVMgICAgICAgICAgICAgICAgICAgICAgICAgPSBOYW1lc3BhY2VzCi1fVUlfRURJVF9OQU1FU1BBQ0VTICAgICAgICAgICAgICAgICAgICA9IEVkaXQgTmFtZXNwYWNlcy4uLgotX1VJX1NFTEVDVF9SRUdJU1RFUkVEX05BTUVTUEFDRVMgICAgICAgPSBTZWxlY3QgRnJvbSBSZWdpc3RlcmVkIE5hbWVzcGFjZXMKLV9VSV9TUEVDSUZZX05FV19OQU1FU1BBQ0UgICAgICAgICAgICAgID0gU3BlY2lmeSBOZXcgTmFtZXNwYWNlCi1fVUlfU0VMRUNUX05BTUVTUEFDRV9UT19BREQgICAgICAgICAgICA9IFNlbGVjdCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB0byBhZGQuCi1fVUlfRU5URVJfUkVRX1BSRUZJWF9BTkRfTkFNRVNQQUNFICAgICA9IEVudGVyIHRoZSByZXF1aXJlZCBwcmVmaXggYW5kIG5hbWVzcGFjZSBVUkkgZm9yIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24uCi1fVUlfVEFSR0VUX05BTUVTUEFDRSAgICAgICAgICAgICAgICAgICA9IFRhcmdldCBOYW1lc3BhY2UKLV9VSV9OQU1FU1BBQ0VfREVDTEFSQVRJT05TICAgICAgICAgICAgID0gTmFtZXNwYWNlIERlY2xhcmF0aW9ucwotX1VJX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBZGQuLi4KLV9VSV9BRERfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OU19USVRMRSAgID0gQWRkIE5hbWVzcGFjZSBEZWNsYXJhdGlvbnMKLV9VSV9TT0FQX1BPUlRfREVUQUlMUyAgICAgICAgICAgICAgICAgID0gU09BUCBQb3J0IERldGFpbHMKLV9VSV9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTG9jYXRpb246Ci1fVUlfSFRUUF9QT1JUX0RFVEFJTFMgICAgICAgICAgICAgICAgICA9IEhUVFAgUG9ydCBEZXRhaWxzCi1fVUlfRURJVF9OQU1FU1BBQ0VTX0RJQUxPR19USVRMRSAgICAgICA9IEVkaXQgTmFtZXNwYWNlcwotX1VJX0RFUEVOREVOQ0lFU19DSEFOR0VEICAgICAgICAgICAgICAgPSBEZXBlbmRlbmNpZXMgQ2hhbmdlZAotX1VJX0RFUEVOREVOQ0lFU19DSEFOR0VEX1JFRlJFU0ggICAgICAgPSBPbmUgb3IgbW9yZSBkZXBlbmRlbmNpZXMgaGF2ZSBjaGFuZ2VkLiAgRG8geW91IHdhbnQgdG8gcmVmcmVzaCB0aGUgZWRpdG9yIHRvIHJlZmxlY3QgdGhlc2UgY2hhbmdlcz8KLV9VSV9SRUxPQURfREVQRU5ERU5DSUVTICAgICAgICAgICAgICAgID0gUmVsb2FkIERlcGVuZGVuY2llcwotX1VJX1VOU1BFQ0lGSUVEICAgICAgICAgICAgICAgICAgICAgICAgPSAodW5zcGVjaWZpZWQpCi1fVUlfTk9fSU1QT1JUX1NQRUNJRklFRCAgICAgICAgICAgICAgICA9IChubyBpbXBvcnQgbG9jYXRpb24gc3BlY2lmaWVkKQotX1VJX0dFTkVSQVRFX0JJTkRJTkdfQ09OVEVOVCAgICAgICAgICAgPSBHZW5lcmF0ZSBCaW5kaW5nIENvbnRlbnQuLi4KLV9VSV9PUEVOX0lNUE9SVCAgICAgICAgICAgICAgICAgICAgICAgID0gT3BlbiBJbXBvcnQKLQotX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UgPSBEZWZhdWx0IFRhcmdldCBOYW1lc3BhY2U6Ci1fVUlfUFJFRl9QQUdFX0NSRUFUSU5HX0ZJTEVTCQkgICA9IENyZWF0aW5nIGZpbGVzCi0KLV9VSV9DUkVBVEVfTUVTU0FHRV9DSEVDS0JPWF9MQUJFTCAgICAgICA9IENyZWF0ZSBkZWZhdWx0IG1lc3NhZ2VzCi1fVUlfREVMRVRFX0FTU09DSUFURURfTVNHX0FORF9QQVJUUyAgICAgPSBEZWxldGUgYXNzb2NpYXRlZCBNZXNzYWdlcyBhbmQgUGFydHMKLV9VSV9ERUxFVEVfT1BFUkFUSU9OX1RJVExFICAgICAgICAgICAgICA9IERlbGV0ZSBPcGVyYXRpb24KLV9VSV9MQUJFTF9XQVJOSU5HX0RVUExJQ0FURV9OQU1FX0VYSVNUUyA9IFdhcm5pbmc6IGR1cGxpY2F0ZSBuYW1lIGFscmVhZHkgZXhpc3RzCi0KLV9XQVJOX05BTUVfSEFTX1NQQUNFICAgICAgICAgPSBJV0FYMTQwMlcgTmFtZSBmaWVsZCBjYW5ub3QgY29udGFpbiBhIHNwYWNlCi1fV0FSTl9OQU1FX0lOVkFMSURfRklSU1QgICAgICA9IElXQVgxNDAzVyBGaXJzdCBjaGFyYWN0ZXIgaW4gbmFtZSBmaWVsZCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nICgnXycsICc6JywgJ2xldHRlcicpCi1fV0FSTl9OQU1FX01VU1RfQ09OVEFJTl9BVF9MRUFTVF9PTkVfQ0hBUiA9IElXQVgxNDE1VyBOYW1lIGZpZWxkIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyCi1fV0FSTl9OQU1FX0lOVkFMSURfQ0hBUiAgICAgICA9IElXQVgxNDA0VyBOYW1lIGZpZWxkIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyICgnCi1fVUlfTkFNRV9JTlZBTElEX0NIQVJfRU5EICAgPSAnKQotCi0KLSEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotISBUcmFuc2xhdG9ycyA6IHBsZWFzZSBkb24ndCB0cmFuc2xhdGUgYW55IHN0cmluZyBiZWxvdyB0aGlzIGxpbmUgCi0hIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSEgX0RFQlVHX1VQREFURV9QT0xJQ1kgPSAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjg0NWVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbiAgICAgICAgICAgICAgICAgICAgIAotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpIgotICAgbmFtZT0iJV9VSV9QTFVHSU5fTkFNRSIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZSA9ICJFY2xpcHNlLm9yZyIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ3c2RsZWRpdG9yLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+ICAgIAotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmdlZiIvPiAgICAgICAgICAKLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPiAgICAgIAotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4gICAgICAKLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+ICAgICAgCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwudXJpcmVzb2x2ZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS54c2QiLz4gICAgICAgICAgICAKLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54c2QudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWRpdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIG5hbWU9IiVfVUlfRURJVE9SX05BTUUiCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvd3NkbF9maWxlX29iai5naWYiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJ3c2RsIiAgICAgICAgICAgCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvciIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuV1NETEFjdGlvbkJhckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3IiPgotICAgICAgPC9lZGl0b3I+Ci0gICA8L2V4dGVuc2lvbj4gICAgCi0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImludGVybmFsRWRpdG9yRXh0ZW5zaW9ucyIgbmFtZT0iSW50ZXJuYWwgRWRpdG9yIEV4dGVuc2lvbnMiLz4gIAotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzIiBuYW1lPSJFeHRlbnNpYmlsaXR5IEl0ZW0gVHJlZSBQcm92aWRlcnMiLz4gICAKLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNvbnRlbnRHZW5lcmF0b3JzIiBuYW1lPSJQb3J0IGFuZCBCaW5kaW5nIENvbnRlbnQgR2VuZXJhdG9ycyIvPiAgICAgICAgICAgICAgICAgICAgICAKLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByb3BlcnR5U291cmNlUHJvdmlkZXIiIG5hbWU9IlByb3BlcnR5IFNvdXJjZSBQcm92aWRlcnMiLz4KLSAgIAotICAgPCEtLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHN1cGxlbWVudCBXU0RMIDEuMSBzY2hlbWFzIGluIG9yZGVyIHRvICAgLS0+Ci0gICA8IS0tIGNvbnN0cmFpbiB0aGUgZXh0ZW5zaWJsaXR5IGVsZW1lbnRzIHRoYXQgYXJlIGFsbG93ZWQgYXQgdGhlICd3c2RsJyBsZXZlbCAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIiBuYW1lPSJFeHRlbnNpYmxpdHkgRWxlbWVudCBGaWx0ZXIiLz4gICAKLQotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlciIgbmFtZT0iUHJvcGVydHkgRGVzY3JpcHRvciBQcm92aWRlciIvPiAgIAotICAgICAgICAKLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZGV0YWlsc1ZpZXdlclByb3ZpZGVycyIgbmFtZT0iRGV0YWlscyBWaWV3ZXIgUHJvdmlkZXJzIi8+ICAgIAotICAgICAgICAgICAKLSAgIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzIj4KLSAgICAgIDxleHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzLmh0dHAiCi0gICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgICAgICAgbGFiZWxQcm92aWRlckNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5vdXRsaW5lLkhUVFBMYWJlbFByb3ZpZGVyIj4gICAgICAgICAKLSAgICAgIDwvZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAgICAgIAotCi0gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVycyI+Ci0gICAgICA8ZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVycy5zb2FwIgotICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgIGxhYmVsUHJvdmlkZXJDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwub3V0bGluZS5TT0FQTGFiZWxQcm92aWRlciI+ICAgICAgICAgCi0gICAgICA8L2V4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAKLQotICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5jb250ZW50R2VuZXJhdG9ycyI+Ci0gICAgICA8Y29udGVudEdlbmVyYXRvcgotICAgICAgICBuYW1lPSJTT0FQIgotICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgIGNvbnRlbnRHZW5lcmF0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5Tb2FwQ29udGVudEdlbmVyYXRvciIKLSAgICAgICAgcG9ydE9wdGlvbnNQYWdlQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWkuU29hcFBvcnRPcHRpb25zUGFnZSIKLSAgICAgICAgYmluZGluZ09wdGlvbnNQYWdlQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWkuU29hcEJpbmRpbmdPcHRpb25zUGFnZSI+Ci0gICAgICA8L2NvbnRlbnRHZW5lcmF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgIAotCi0gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmNvbnRlbnRHZW5lcmF0b3JzIj4KLSAgICAgIDxjb250ZW50R2VuZXJhdG9yCi0gICAgICAgIG5hbWU9IkhUVFAiCi0gICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgICAgICAgY29udGVudEdlbmVyYXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLkh0dHBDb250ZW50R2VuZXJhdG9yIgotICAgICAgICBwb3J0T3B0aW9uc1BhZ2VDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aS5IdHRwUG9ydE9wdGlvbnNQYWdlIgotICAgICAgICBiaW5kaW5nT3B0aW9uc1BhZ2VDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aS5IdHRwQmluZGluZ09wdGlvbnNQYWdlIj4KLSAgICAgIDwvY29udGVudEdlbmVyYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIj4KLSAgICAgIDxleHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcgotICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXIuU29hcEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIiPgotICAgICAgPC9leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIj4KLSAgICAgIDxleHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcgotICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXIuSHR0cEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIiPgotICAgICAgPC9leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcj4KLSAgIDwvZXh0ZW5zaW9uPiAgIAotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIj4KLSAgICAgIDxleHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcgotICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXIuTWltZUV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIiPgotICAgICAgPC9leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlcj4KLSAgIDwvZXh0ZW5zaW9uPiAgICAKLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlciI+Ci0gICAgICA8ZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIKLSAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlci5YU0RFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIj4KLSAgICAgIDwvZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXI+Ci0gICA8L2V4dGVuc2lvbj4gICAgICAKLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgIDxjYXRlZ29yeQotICAgICAJaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy51aS5uZXciCi0gICAgIAluYW1lPSIlX1VJX0xBQkVMX05FV19DQVRFR09SWV9OQU1FX1dTIi8+Ci0gICAgIDx3aXphcmQKLSAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiCi0gICAgICAgbmFtZT0iV1NETCIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdXU0RMV2l6YXJkIgotICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3IgotICAgICAgIGljb249Imljb25zL3dzZGxfZmlsZV9vYmouZ2lmIj4KLSAgICAgICA8ZGVzY3JpcHRpb24+JV9VSV9MQUJFTF9DUkVBVEVfTkVXX1dTRExfRklMRTwvZGVzY3JpcHRpb24+Ci0gICAgICAgPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPiAKLSAgICAgPC93aXphcmQ+Ci0KLSAgICAgPHdpemFyZAotICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSIKLSAgICAgICBuYW1lPSJXU0RMIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1dTRExXaXphcmQiCi0gICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLSAgICAgICBpY29uPSJpY29ucy93c2RsX2ZpbGVfb2JqLmdpZiI+Ci0gICAgICAgPGRlc2NyaXB0aW9uPiVfVUlfTEFCRUxfQ1JFQVRFX05FV19XU0RMX0ZJTEU8L2Rlc2NyaXB0aW9uPgotICAgICAgIDxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4gCi0gICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAKLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+IAotICAgPGVkaXRvckNvbnRyaWJ1dGlvbiAKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5hcnRpY2xlcy5hY3Rpb24uY29udHJpYnV0aW9uLmVkaXRvcjIiIAotICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3IiPgotCi0gICAgICA8bWVudQotICAgICAgICAgaWQ9IldTRExFZGl0b3IiCi0gICAgICAgICBsYWJlbD0iJV9VSV9FRElUT1JfTkFNRSIKLSAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyI+Ci0gICAgICAgICA8c2VwYXJhdG9yIG5hbWU9Imdyb3VwMSIvPgotICAgICAgPC9tZW51PgotICAgICAKLSAgICAgIDxhY3Rpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5hY3Rpb25zLlJlbG9hZERlcGVuZGVuY2llc0FjdGlvbkRlbGVnYXRlIiAKLSAgICAgICAgIGxhYmVsPSIlX1VJX1JFTE9BRF9ERVBFTkRFTkNJRVMiCi0gICAgICAgICBpY29uPSJpY29ucy9yZWxvYWRncmFtbWFyLmdpZiIgCi0gICAgICAgICB0b29sdGlwPSJSZWxvYWQgRGVwZW5kZW5jaWVzIgotICAgICAgICAgbWVudWJhclBhdGg9IldTRExFZGl0b3IvZ3JvdXAxIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uRGVsZWdhdGUiPiAKLSAgICAgIDwvYWN0aW9uPiAgCi0gICAgICAgICAKLSAgICAgIDwhLS0KLSAgICAgIDxhY3Rpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlZhbGlkYXRlQWN0aW9uRGVsZWdhdGUiIAotICAgICAgICAgbGFiZWw9IiVfVUlfQUNUSU9OX1ZBTElEQVRFX1dTRExfRE9DVU1FTlQiIAotICAgICAgICAgaWNvbj0iaWNvbnMvdmFsaWRhdGUuZ2lmIiAKLSAgICAgICAgIHRvb2x0aXA9IiVfVUlfQUNUSU9OX1ZBTElEQVRFX1dTRExfRE9DVU1FTlQiCi0gICAgICAgICBtZW51YmFyUGF0aD0iV1NETEVkaXRvci9ncm91cDEiCi0gICAgICAgICB0b29sYmFyUGF0aD0iJU5vcm1hbC9XU0RMRWRpdG9yIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuVmFsaWRhdGVBY3Rpb25EZWxlZ2F0ZSI+IAotICAgICAgPC9hY3Rpb24+ICAgICAgCi0gICAgICAtLT4KLSAgICAgICAgICAgICAgICAgCi0gICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci08L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JPCEtLSBwbGFjZSBldmVyeXRoaW5nIGluICJXZWIgYW5kIFhNTCIgLS0+Ci0gICAgICA8cGFnZQotCQkJbmFtZT0iJV9VSV9XU0RMX0xBQkVMIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbmRlZGNvbmZpZ3VyYXRpb24iPgotICAgICAgPCEtLSBhZGQgcHJlZmVyZW5jZSBwYWdlcyB0byB0aGUgY29udGV4dCBtZW51IGFjdGlvbiAoSUQgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBkZWNsYXJlZCAicGF0aCIgYWJvdmUpIC0tPgotICAgICAgPGRlZmluaXRpb24KLSAgICAgIAkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yLnNvdXJjZSIgLz4KLTwhLS0KLSAgICAgIDxwcm9wZXJ0eXNoZWV0Y29uZmlndXJhdGlvbgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuV1NETFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIgotICAgICAgICAgICAgdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMVGV4dEVkaXRvciI+Ci0gICAgICA8L3Byb3BlcnR5c2hlZXRjb25maWd1cmF0aW9uPgotLS0+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5wcm9wZXJ0eUNvbnRyaWJ1dG9yIj4KLSAgICAgIDxwcm9wZXJ0eUNvbnRyaWJ1dG9yCi0gICAgICAgICAgICB0eXBlTWFwcGVyPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uV1NETFR5cGVNYXBwZXIiCi0gICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMVGV4dEVkaXRvciIKLSAgICAgICAgICAgIHNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5XU0RMU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlciIKLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5XU0RMTGFiZWxQcm92aWRlciI+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeQotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImdlbmVyYWwiPgotICAgICAgICAgPC9wcm9wZXJ0eUNhdGVnb3J5PgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJuYW1lc3BhY2UiPgotICAgICAgICAgPC9wcm9wZXJ0eUNhdGVnb3J5PgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJvdGhlciI+Ci0gICAgICAgICA8L3Byb3BlcnR5Q2F0ZWdvcnk+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeQotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImF0dHJpYnV0ZXMiPgotICAgICAgICAgPC9wcm9wZXJ0eUNhdGVnb3J5PgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbnVtZXJhdGlvbnMiPgotICAgICAgICAgPC9wcm9wZXJ0eUNhdGVnb3J5PgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkb2N1bWVudGF0aW9uIj4KLSAgICAgICAgIDwvcHJvcGVydHlDYXRlZ29yeT4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZmFjZXRzIj4KLSAgICAgICAgIDwvcHJvcGVydHlDYXRlZ29yeT4KLSAgICAgIDwvcHJvcGVydHlDb250cmlidXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5wcm9wZXJ0eVRhYnMiPgotICAgICAgPHByb3BlcnR5VGFicwotICAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETFRleHRFZGl0b3IiPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9HRU5FUkFMIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImdlbmVyYWwiCi0gICAgICAgICAgICAgICBpZD0iY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIj4KLSAgICAgICAgIDwvcHJvcGVydHlUYWI+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX05BTUVTUEFDRSIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJuYW1lc3BhY2UiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0iY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIgotICAgICAgICAgICAgICAgaWQ9ImNvbS5pYm0ueG1sd2Vic2VydmljZXMubmFtZXNwYWNlIj4KLSAgICAgICAgIDwvcHJvcGVydHlUYWI+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX09USEVSIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgICAgICAgICAgaWQ9ImNvbS5pYm0ueG1sd2Vic2VydmljZXMub3RoZXIiPgotICAgICAgICAgPC9wcm9wZXJ0eVRhYj4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfQVRUUklCVVRFUyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJhdHRyaWJ1dGVzIgotICAgICAgICAgICAgICAgaWQ9ImNvbS5pYm0ueG1sd2Vic2VydmljZXMuYXR0cmlidXRlcyI+Ci0gICAgICAgICA8L3Byb3BlcnR5VGFiPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9FTlVNRVJBVElPTlMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZW51bWVyYXRpb25zIgotICAgICAgICAgICAgICAgaWQ9ImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZW51bWVyYXRpb25zIj4KLSAgICAgICAgIDwvcHJvcGVydHlUYWI+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT04iCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmRvY3VtZW50YXRpb24iPgotICAgICAgICAgPC9wcm9wZXJ0eVRhYj4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfU0VDVElPTl9BRFZBTkNFRF9BVFRSSUJVVEVTIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImZhY2V0cyIKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmZhY2V0cyI+Ci0gICAgICAgICA8L3Byb3BlcnR5VGFiPgotICAgICAgPC9wcm9wZXJ0eVRhYnM+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbEVkaXRvckV4dGVuc2lvbnMiPgotICAgICA8aW50ZXJuYWxFZGl0b3JFeHRlbnNpb24gY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5YU0RFeHRlbnNpb24iLz4KLSAgPC9leHRlbnNpb24+ICAKLQotICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5leHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcnMiPgotICAgICAgPGV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5leHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcnMueHNkIgotICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAgICAgICAgICAgIAotICAgICAgICBsYWJlbFByb3ZpZGVyQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5YU0RMYWJlbFByb3ZpZGVyIj4KLSAgICAgIDwvZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICA8IS0tIGludGlhbGl6ZSB3c2RsIHNvdXJjZSB2YWxpZGF0b3IgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIHNjb3BlPSJ0b3RhbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JXU0RMIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnJlY29uY2lsZXIuRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvcldTREwiPgotICAJICAgICA8Y29udGVudFR5cGVJZGVudGlmaWVyIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC53c2Rsc291cmNlIj4KLSAgICAgICAgICAgIDxwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCI+Ci0gICAgICAgICAgICA8L3BhcnRpdGlvblR5cGU+Ci0gICAgICAgICA8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4gICAgICAgCi0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2UyOGI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmF2aWdhdGlvbkxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5XU0RMTWVudUFjdGlvbkNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLldTRExHcmFwaFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuV1NETEVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETE1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwub3V0bGluZS5FeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmUuTW9kZWxBZGFwdGVyQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmUuTW9kZWxBZGFwdGVyTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyLlNFRERvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC50eXBlc3lzdGVtLkV4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMTm9kZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMuV1NETERldGFpbHNWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy5XU0RMRGV0YWlsc1ZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8vcHVibGljIGNsYXNzIFdTRExFZGl0b3IgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dE11bHRpUGFnZUVkaXRvclBhcnQgaW1wbGVtZW50cyBJTmF2aWdhdGlvbkxvY2F0aW9uUHJvdmlkZXIKLXB1YmxpYyBjbGFzcyBXU0RMRWRpdG9yIGV4dGVuZHMgV1NETE11bHRpUGFnZUVkaXRvclBhcnQgaW1wbGVtZW50cyBJTmF2aWdhdGlvbkxvY2F0aW9uUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIEV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIgZXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlcjsKLQotICBwcm90ZWN0ZWQgV1NETFRleHRFZGl0b3IgdGV4dEVkaXRvcjsKLSAgcHJvdGVjdGVkIFdTRExHcmFwaFZpZXdlciBncmFwaFZpZXdlcjsKLSAgcHJvdGVjdGVkIFdTRExEZXRhaWxzVmlld2VyIGRldGFpbHNWaWV3ZXI7Ci0gIHByb3RlY3RlZCBXU0RMU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyOwotICBwcm90ZWN0ZWQgU2FzaEZvcm0gc2FzaEZvcm07Ci0KLSAgaW50IGdyYXBoUGFnZUluZGV4OwotCi0gIC8vcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlOwotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcm90ZWN0ZWQgV1NETEVkaXRvclJlc291cmNlQ2hhbmdlSGFuZGxlciByZXNvdXJjZUNoYW5nZUhhbmRsZXI7Ci0gIAotICAvLyBVc2VkIGZvciBDdXQsIENvcHksIFBhc3RlIGFjdGlvbnMuICBUaGlzIGFjdHMgYXMgYSBjb3B5LCBjdXQsIHBhc3RlIGNsaXBib2FyZAotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgY2xpcGJvYXJkRWxlbWVudDsKLQotICBwdWJsaWMgV1NETEVkaXRvcigpCi0gIHsKLSAgICBzZWxlY3Rpb25NYW5hZ2VyID0gbmV3IFdTRExTZWxlY3Rpb25NYW5hZ2VyKCk7Ci0gIH0KLSAgCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgotCXsKLSAgICBzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcGFnZS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGFydEluaXRFeGNlcHRpb24pIAotICAgIHsKLQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICAKLSAgICB9Ci0JfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoa2V5ID09IElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcykKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzZWxlY3Rpb25NYW5hZ2VyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICAvLyBjYWxsIHRoZSBleHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyJ3MgaW5wdXRDaGFuZ2VkIG1ldGhvZCBhIG51bGwgdmlld2VyIAotICAgIC8vIHNvIHRoYXQgdGhlIG91dGxpbmUncyBjb250ZW50cHJvdmlkZXIvYWRhcHRlcnMgZG9uJ3QgYXR0ZW1wdCB0byB1cGRhdGUgdGhlIHZpZXdlcgotICAgIC8vIGFmdGVyIHRoZSBlZGl0b3IgY2xvc2VzCi0gICAgZXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlci5pbnB1dENoYW5nZWQobnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgaWYgKHJlc291cmNlQ2hhbmdlSGFuZGxlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc291cmNlQ2hhbmdlSGFuZGxlci5kaXNwb3NlKCk7Ci0gICAgfQotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHB1YmxpYyBXU0RMU2VsZWN0aW9uTWFuYWdlciBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25NYW5hZ2VyOwotICB9Ci0KLSAgcHVibGljIEV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIgZ2V0RXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlcigpCi0gIHsKLSAgICBpZiAoZXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIGV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIgPSBuZXcgRXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlcih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgV1NETFRleHRFZGl0b3IgZ2V0V1NETFRleHRFZGl0b3IoKQotICB7Ci0gICAgcmV0dXJuIHRleHRFZGl0b3I7Ci0gIH0KLQotICBwdWJsaWMgV1NETEdyYXBoVmlld2VyIGdldEdyYXBoVmlld2VyKCkKLSAgewotICAgIHJldHVybiBncmFwaFZpZXdlcjsKLSAgfQotCi0gIHB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldFN0cnVjdHVyZWRNb2RlbCgpCi0gIHsKLSAgICByZXR1cm4gdGV4dEVkaXRvci5nZXRNb2RlbCgpOwotICB9Ci0KLSAgcHVibGljIERvY3VtZW50IGdldFhNTERvY3VtZW50KCkKLSAgewotICAgIHJldHVybiAoKElET01Nb2RlbCl0ZXh0RWRpdG9yLmdldE1vZGVsKCkpLmdldERvY3VtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgdGhlIHBhZ2VzIG9mIHRoaXMgbXVsdGktcGFnZSBlZGl0b3IuCi0gICAqIDxwPgotICAgKiBTdWJjbGFzc2VzIG9mIDxjb2RlPk11bHRpUGFnZUVkaXRvcjwvY29kZT4gbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0gICAqIDwvcD4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhZ2VzKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChyZXNvdXJjZUNoYW5nZUhhbmRsZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzb3VyY2VDaGFuZ2VIYW5kbGVyID0gbmV3IFdTRExFZGl0b3JSZXNvdXJjZUNoYW5nZUhhbmRsZXIodGhpcyk7Ci0gICAgICAgIHJlc291cmNlQ2hhbmdlSGFuZGxlci5hdHRhY2goKTsKLSAgICAgIH0KLSAgICAgIGNyZWF0ZVNvdXJjZVBhZ2UoKTsKLSAgICAgIGFkZFNvdXJjZVBhZ2UoKTsKLQotICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBXU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dChXU0RMUmVzb3VyY2VJbXBsLlVTRV9FWFRFTlNJT05fRkFDVE9SSUVTLCBCb29sZWFuLkZBTFNFKTsKLQotICAgICAgSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dClnZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0KLSAgICAgIC8vIGNyZWF0ZSBhIGRlZmluaXRpb24gYmFzZWQgb24gdGhlIHRleHQgZWRpdG9yIGRvY3VtZW50Ci0gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBkZWZpbml0aW9uID0gV1NETFJlc291cmNlVXRpbC5jcmVhdGVEZWZpbml0aW9uKHJlc291cmNlU2V0LCBmaWxlLCBnZXRYTUxEb2N1bWVudCgpKTsKLQotICAgICAgV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5zZXRUeXBlU3lzdGVtUHJvdmlkZXIoZGVmaW5pdGlvbiwgbmV3IEV4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXIodGhpcykpOwotCi0gICAgICAvL1JlZmVyZW5jZU1hbmFnZXIuYWRhcHREZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgbmV3IFNFRERvY3VtZW50QWRhcHRlcihnZXRTdHJ1Y3R1cmVkTW9kZWwoKSwgZGVmaW5pdGlvbik7Ci0gICAgICBjcmVhdGVBbmRBZGRHcmFwaFBhZ2UoKTsKLQotICAgICAgLy8gZ2V0IHRoZSB0eXBlIG9mIHBhZ2UgYW5kIHNldCB0aGUgYWN0aXZlIHBhZ2UgdG8gc2hvdwotICAgICAgaW50IHBhZ2VJbmRleFRvU2hvdyA9IGdldERlZmF1bHRQYWdlSW5kZXgoKTsKLSAgICAgIHNldEFjdGl2ZVBhZ2UocGFnZUluZGV4VG9TaG93KTsKLSAgICAgIAotICAgICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXREZWZpbml0aW9uKCkpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24oU1NFQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiQW5fZXJyb3JfaGFzX29jY3VycmVkX3doZW4xX0VSUk9SXyIpKTsgLy8kTk9OLU5MUy0xJCA9ICJBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hlbiBpbml0aWFsaXppbmcgdGhlIGlucHV0IGZvciB0aGUgdGhlIGVkaXRvcidzIHNvdXJjZSBwYWdlLiIKLSAgICB9Ci0gICAgLy8gVE9ETzogYWRkIGEgY2F0Y2ggYmxvY2sgaGVyZSBmb3IgYW55IGV4Y2VwdGlvbiB0aGUgZGVzaWduIHBhZ2UgdGhyb3dzIGFuZCBjb252ZXJ0IGl0IGludG8gYSBtb3JlIGluZm9ybWF0aXZlIG1lc3NhZ2UuCi0gIH0KLQotICBwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRQYWdlSW5kZXgoKQotICB7Ci0gICAgaWYgKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0UGFnZSgpLmVxdWFscyhXU0RMRWRpdG9yUGx1Z2luLkdSQVBIX1BBR0UpKQotICAgIHsKLSAgICAgIGlmIChncmFwaFBhZ2VJbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdyYXBoUGFnZUluZGV4OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc291cmNlUGFnZUluZGV4OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuV1NETE11bHRpUGFnZUVkaXRvclBhcnQjY3JlYXRlVGV4dEVkaXRvcigpCi0gICAqLwotICBwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRFZGl0b3IgY3JlYXRlVGV4dEVkaXRvcigpCi0gIHsKLSAgICB0ZXh0RWRpdG9yID0gbmV3IFdTRExUZXh0RWRpdG9yKHRoaXMpOwotICAgIHJldHVybiB0ZXh0RWRpdG9yOwotICB9Ci0KLSAgLyoqCi0gICAqIGNyZWF0ZSBvdXIgb3duCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb3VyY2VQYWdlKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5jcmVhdGVTb3VyY2VQYWdlKCk7Ci0KLSAgICB0ZXh0RWRpdG9yID0gKFdTRExUZXh0RWRpdG9yKWdldFRleHRFZGl0b3IoKTsKLSAgfQotCi0gIGludCBzb3VyY2VQYWdlSW5kZXggPSAtMTsKLSAgLyoqCi0gICAqIEFkZHMgdGhlIHNvdXJjZSBwYWdlIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFNvdXJjZVBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLSAgewotICAgIHNvdXJjZVBhZ2VJbmRleCA9IGFkZFBhZ2UodGV4dEVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0KLSAgCXNldFBhZ2VUZXh0KHNvdXJjZVBhZ2VJbmRleCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVEFCX1NPVVJDRSIpKTsKLSAgICAvLyBkZWZlY3QgMjIzMDQzIC4uLiBkbyB0ZXh0RWRpdG9yLnNldE1vZGVsKCkgaGVyZSBpbnN0ZWFkIG9mIGluIGNyZWF0ZVNvdXJjZVBhZ2UoKQotICAgIHRleHRFZGl0b3Iuc2V0TW9kZWwoKElGaWxlRWRpdG9ySW5wdXQpZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgLy8gdGhlIHVwZGF0ZXMgY3JpdGljYWwsIHRvIGdldCB2aWV3ZXIgc2VsZWN0aW9uIG1hbmFnZXIgYW5kIGhpZ2hsaWdodGluZyB0byB3b3JrCi0gICAgdGV4dEVkaXRvci51cGRhdGUoKTsKLSAgfQotICAKLSAgaW50W10gd2VpZ2h0czsKLSAgcHVibGljIHZvaWQgc2V0RGVzaWduV2VpZ2h0cyhpbnRbXSB3ZWlnaHRzLCBib29sZWFuIHVwZGF0ZVNvdXJjZURlc2lnbikKLSAgewotICAgIHRoaXMud2VpZ2h0cyA9IHdlaWdodHM7Ci0gICAgaWYgKHVwZGF0ZVNvdXJjZURlc2lnbikKLSAgICB7Ci0gICAgICBzYXNoRm9ybS5zZXRXZWlnaHRzKHdlaWdodHMpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IGFyZykKLSAgewotICAgIHN1cGVyLnBhZ2VDaGFuZ2UoYXJnKTsKLSAgICBpZiAoZ2V0UGFnZVRleHQoYXJnKS5lcXVhbHMoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVEFCX1NPVVJDRSIpKSkgLy8gVFJBTlNMQVRFICEKLSAgICB7Ci0gICAgICAvLyB1cGRhdGUgdGhlIGlucHV0Ci0gICAgfQotICAgIGVsc2UgaWYgKGdldFBhZ2VUZXh0KGFyZykuZXF1YWxzKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RBQl9HUkFQSCIpKSkgLy8gVFJBTlNMQVRFICEKLSAgICB7Ci0gICAgICAvLyB1cGRhdGUgdGhlIGlucHV0Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgQ29sb3IgZGl2aWRlckNvbG9yOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIHRoZSBncmFwaCBwYWdlIGFuZCBhZGRzIGl0IHRvIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAgICoqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBbmRBZGRHcmFwaFBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLSAgewotICAgIC8vIGNyZWF0ZSB0aGUgZ3JhcGggcGFnZQotICAgIHNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKGdldENvbnRhaW5lcigpLCBTV1QuQk9SREVSKTsKLSAgICBzYXNoRm9ybS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICBzYXNoRm9ybS5zZXRPcmllbnRhdGlvbihTV1QuVkVSVElDQUwpOwotICAgIGludFtdIHdlaWdodHMgPSB7IDgsIDMgfTsKLQotICAgIGdyYXBoUGFnZUluZGV4ID0gYWRkUGFnZShzYXNoRm9ybSk7Ci0gICAgc2V0UGFnZVRleHQoZ3JhcGhQYWdlSW5kZXgsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RBQl9HUkFQSCIpKTsKLQotICAgIC8vIGNyZWF0ZSB0aGUgZ3JhcGggdmlld2VyCi0gICAgZ3JhcGhWaWV3ZXIgPSBuZXcgV1NETEdyYXBoVmlld2VyKHRoaXMpOwotICAgIGdyYXBoVmlld2VyLmNyZWF0ZUNvbnRyb2woc2FzaEZvcm0pOwotCi0vLyAgICBkZXRhaWxzVmlld2VyID0gbmV3IFdTRExEZXRhaWxzVmlld2VyKHRoaXMpOyAgICAKLS8vICAgIGRldGFpbHNWaWV3ZXIuY3JlYXRlQ29udHJvbChzYXNoRm9ybSk7ICAKLS8vCi0vLyAgICBzYXNoRm9ybS5zZXRXZWlnaHRzKHdlaWdodHMpOwotCi0gICAgaWYgKGRpdmlkZXJDb2xvciA9PSBudWxsKQotICAgIHsKLSAgICAgIGRpdmlkZXJDb2xvciA9IG5ldyBDb2xvcihnZXRDb250YWluZXIoKS5nZXREaXNwbGF5KCksIDE0MywgMTQxLCAxMzgpOwotICAgIH0KLQotICAgIGdldENvbnRhaW5lcigpLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKQotICAgIHsKLSAgICAgIC8qKgotICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXIjcGFpbnRDb250cm9sKFBhaW50RXZlbnQpCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgQ29tcG9zaXRlKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKXNvdXJjZTsKLSAgICAgICAgICBSZWN0YW5nbGUgYm91bmRhcnkgPSBjb21wLmdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICBlLmdjLnNldEZvcmVncm91bmQoZGl2aWRlckNvbG9yKTsKLSAgICAgICAgICBlLmdjLmRyYXdMaW5lKGJvdW5kYXJ5LngsIGJvdW5kYXJ5LnksIGJvdW5kYXJ5LnggKyBib3VuZGFyeS53aWR0aCwgYm91bmRhcnkueSk7Ci0gICAgICAgICAgc2V0RGVzaWduV2VpZ2h0cyhzYXNoRm9ybS5nZXRXZWlnaHRzKCksIHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpCi0gIHsKLSAgICBzdXBlci5zZXRGb2N1cygpOwotICAgIGludCBhY3RpdmVQYWdlID0gZ2V0QWN0aXZlUGFnZSgpOwotICAgIGlmIChhY3RpdmVQYWdlID09IHNvdXJjZVBhZ2VJbmRleCkKLSAgICB7Ci0gICAgICBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuc2V0RGVmYXVsdFBhZ2UoV1NETEVkaXRvclBsdWdpbi5TT1VSQ0VfUEFHRSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuc2V0RGVmYXVsdFBhZ2UoV1NETEVkaXRvclBsdWdpbi5HUkFQSF9QQUdFKTsKLSAgICB9Ci0gIH0KLQotICAvLwotICAvLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWx0SW5XU0RMRWRpdG9yRXh0ZW5zaW9uIGltcGxlbWVudHMgV1NETEVkaXRvckV4dGVuc2lvbgotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb25UeXBlU3VwcG9ydGVkKGludCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IE9VVExJTkVfVFJFRV9DT05URU5UX1BST1ZJREVSCi0gICAgICAgIHx8IHR5cGUgPT0gT1VUTElORV9MQUJFTF9QUk9WSURFUgotICAgICAgICB8fCB0eXBlID09IEVESVRfUEFSVF9GQUNUT1JZCi0gICAgICAgIHx8IHR5cGUgPT0gREVUQUlMU19WSUVXRVJfUFJPVklERVIKLSAgICAgICAgfHwgdHlwZSA9PSBNRU5VX0FDVElPTl9DT05UUklCVVRPUgotICAgICAgICB8fCB0eXBlID09IE5PREVfUkVDT05DSUxFUgotICAgICAgICB8fCB0eXBlID09IE5PREVfQVNTT0NJQVRJT05fUFJPVklERVI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgcmV0dXJuIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCAmJiAhKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSkgfHwgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb25PYmplY3QoaW50IHR5cGUsIFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgICB7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgIHN3aXRjaCAodHlwZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBPVVRMSU5FX1RSRUVfQ09OVEVOVF9QUk9WSURFUiA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlcihXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBPVVRMSU5FX0xBQkVMX1BST1ZJREVSIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgTW9kZWxBZGFwdGVyTGFiZWxQcm92aWRlcihXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBERVRBSUxTX1ZJRVdFUl9QUk9WSURFUiA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFdTRExEZXRhaWxzVmlld2VyUHJvdmlkZXIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBNRU5VX0FDVElPTl9DT05UUklCVVRPUiA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFdTRExNZW51QWN0aW9uQ29udHJpYnV0b3Iod3NkbEVkaXRvcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgTk9ERV9BU1NPQ0lBVElPTl9QUk9WSURFUiA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFdTRExOb2RlQXNzb2NpYXRpb25Qcm92aWRlcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIEVESVRfUEFSVF9GQUNUT1JZIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgV1NETEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLQotIAotICBwdWJsaWMgdm9pZCByZWxvYWREZXBlbmRlbmNpZXMoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZ2V0R3JhcGhWaWV3ZXIoKS5nZXRDb21wb25lbnRWaWV3ZXIoKS5zZXRQcmVzZXJ2ZUV4cGFuc2lvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICBXU0RMUmVzb3VyY2VVdGlsLnJlbG9hZERpcmVjdGl2ZXMoZGVmaW5pdGlvbik7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnVwZGF0ZUJpbmRpbmdSZWZlcmVuY2VzKGRlZmluaXRpb24pOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC51cGRhdGVQb3J0VHlwZVJlZmVyZW5jZXMoZGVmaW5pdGlvbik7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnVwZGF0ZU1lc3NhZ2VSZWZlcmVuY2VzKGRlZmluaXRpb24pOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC51cGRhdGVTY2hlbWFSZWZlcmVuY2VzKGRlZmluaXRpb24pOwotCi0gICAgICAvLyB0aGUgbGluZSBiZWxvdyBzaW1wbHkgY2F1c2VzIGEgbm90aWZpY2F0aW9uIGluIG9yZGVyIHRvIHVwZGF0ZSBvdXIgdmlld3MKLSAgICAgIC8vCi0gICAgICBkZWZpbml0aW9uLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRlZmluaXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBnZXRHcmFwaFZpZXdlcigpLmdldENvbXBvbmVudFZpZXdlcigpLnNldFByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgb3Blbk9uU2VsZWN0aW9uKFN0cmluZyBzcGVjaWZpY2F0aW9uKQotICB7Ci0gICAgRU9iamVjdCBlT2JqZWN0ID0gZ2V0RGVmaW5pdGlvbigpLmVSZXNvdXJjZSgpLmdldEVPYmplY3Qoc3BlY2lmaWNhdGlvbik7Ci0gICAgaWYgKGVPYmplY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVPYmplY3QpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSU5hdmlnYXRpb25Mb2NhdGlvbiBjcmVhdGVFbXB0eU5hdmlnYXRpb25Mb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbmV3IEludGVybmFsVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbih0ZXh0RWRpdG9yLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgSU5hdmlnYXRpb25Mb2NhdGlvbiBjcmVhdGVOYXZpZ2F0aW9uTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIG5ldyBJbnRlcm5hbFRleHRTZWxlY3Rpb25OYXZpZ2F0aW9uTG9jYXRpb24odGV4dEVkaXRvciwgdHJ1ZSk7Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgSW50ZXJuYWxUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uIGV4dGVuZHMgVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbgotICB7Ci0gICAgcHVibGljIEludGVybmFsVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbihJVGV4dEVkaXRvciBwYXJ0LCBib29sZWFuIGluaXRpYWxpemUpCi0gICAgewotICAgICAgc3VwZXIocGFydCwgaW5pdGlhbGl6ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IHBhcnQgPSBzdXBlci5nZXRFZGl0b3JQYXJ0KCk7Ci0gICAgICBpZiAocGFydCBpbnN0YW5jZW9mIFdTRExFZGl0b3IpCi0gICAgICB7Ci0gICAgICAgIHBhcnQgPSAoKFdTRExFZGl0b3IpcGFydCkuZ2V0VGV4dEVkaXRvcigpOwotICAgICAgfQotICAgICAgcmV0dXJuIHBhcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0RWRpdG9yUGFydCgpOwotICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBXU0RMVGV4dEVkaXRvcikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoV1NETFRleHRFZGl0b3IpcGFydCkuZ2V0V1NETEVkaXRvcigpLmdldFRpdGxlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRUZXh0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBSZXR1cm5zIHRoZSBlbGVtZW50IGN1cnJlbnRseSBvbiB0aGUgY29weSwgY3V0LCBwYXN0ZSBjbGlwYm9hcmQKLSAgcHVibGljIFdTRExFbGVtZW50IGdldENsaXBib2FyZENvbnRlbnRzKCkgewotICAJcmV0dXJuIGNsaXBib2FyZEVsZW1lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaXBib2FyZENvbnRlbnRzKFdTRExFbGVtZW50IGVsZW1lbnQpIHsKLSAgCWNsaXBib2FyZEVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMRWRpdG9yUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMRWRpdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNWRmMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLkNvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5Db250ZW50R2VuZXJhdG9yUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLk5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMRWRpdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiAvLywgSVBsdWdpbkhlbHBlcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGVmYXVsdHBhZ2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9QQUdFID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBocGFnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9QQUdFID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNvdXJjZXBhZ2UiOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhTRF9FRElUT1JfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5YU0RFZGl0b3IiOyAKLSAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSA9ICJodHRwOi8vdGVtcHVyaS5vcmciOwotICAKLSAgcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUFJPTVBUID0gMDsKLSAgcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfSUdOT1JFID0gMTsKLSAgcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUkVMT0FEID0gMjsKLQotICBwcm90ZWN0ZWQgc3RhdGljIFdTRExFZGl0b3JQbHVnaW4gaW5zdGFuY2U7Ci0gIC8vICBwcm90ZWN0ZWQgWE1MU2NoZW1hUGFja2FnZSB4bWxzY2hlbWFQYWNrYWdlOwotLy8gIHByaXZhdGUgc3RhdGljIE1zZ0xvZ2dlciBteU1zZ0xvZ2dlcjsKLQotICBwcml2YXRlIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSB3c2RsRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci0gIHByaXZhdGUgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXJSZWdpc3RyeTsKLSAgcHJpdmF0ZSBFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5IHRyZWVQcm92aWRlclJlZ2lzdHJ5OwotICBwcml2YXRlIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBwcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5OwotICBwcml2YXRlIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBwcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnk7Ci0gIHByaXZhdGUgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5OwotICBwcml2YXRlIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSBjb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci0gIHByaXZhdGUgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IGRldGFpbHNWaWV3ZXJQcm92aWRlclJlZ2lzdHJ5OyAgCi0gIC8vcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGdyYXllZEltYWdlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotICBwcml2YXRlIGludCBkZXBlbmRlbmNpZXNDaGFuZ2VkUG9saWN5ID0gREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUkVMT0FEOwotCi0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFJlc291cmNlcyBoZWxwZXIuCi0gICAqLwotCi0gIHB1YmxpYyBXU0RMRWRpdG9yUGx1Z2luKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpCi0gIHsKLSAgICBzdXBlcihkZXNjcmlwdG9yKTsKLSAgICBpbnN0YW5jZSA9IHRoaXM7Ci0KLSAgICAvLyBUT0RPLi4uIHJlbW92ZSB0aGlzIGNvZGUgd2hlbiB3ZSBhZGQgJ2RlcGVuZGVuY2llc0NoYW5nZWRQb2xpY3knCi0gICAgLy8gdG8gYW4gZWRpdG9yIHByZWZlcmVuY2VzIHBhZ2UKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyaW5nID0gZ2V0V1NETFN0cmluZygiX0RFQlVHX1VQREFURV9QT0xJQ1kiKTsKLSAgICAgIGludCBwb2xpY3kgPSBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZyk7Ci0gICAgICBpZiAocG9saWN5ID49IDAgJiYgcG9saWN5IDw9IERFUEVOREVDSUVTX0NIQU5HRURfUE9MSUNZX1JFTE9BRCkKLSAgICAgIHsKLSAgICAgICAgZGVwZW5kZW5jaWVzQ2hhbmdlZFBvbGljeSA9IHBvbGljeTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5IGdldFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAod3NkbEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgd3NkbEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5ID0gbmV3IFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgbmV3IEludGVybmFsRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIod3NkbEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdzZGxFZGl0b3JFeHRlbnNpb25SZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0RGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKGRldGFpbHNWaWV3ZXJQcm92aWRlclJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotCSAgZGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnkgPSBuZXcgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICBuZXcgRGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnlSZWFkZXIoZGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotICAgIH0KLSAgICByZXR1cm4gZGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IGdldEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXJSZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAoZXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgZXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5ID0gbmV3IE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgbmV3IEVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIoZXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXJSZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5IGdldEV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKHRyZWVQcm92aWRlclJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgdHJlZVByb3ZpZGVyUmVnaXN0cnkgPSBuZXcgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeSgpOwotICAgICAgbmV3IEV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnlSZWFkZXIodHJlZVByb3ZpZGVyUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotICAgIH0KLSAgICByZXR1cm4gdHJlZVByb3ZpZGVyUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IGdldFByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKHByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5ID0gbmV3IE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgbmV3IFByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnlSZWFkZXIocHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXJSZWdpc3RyeSkucmVhZFJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5OwotICB9Ci0KLSAgcHVibGljIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBnZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKHByb3BlcnR5U291cmNlUHJvdmlkZXJSZWdpc3RyeSA9PSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5U291cmNlUHJvdmlkZXJSZWdpc3RyeSA9IG5ldyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAgIG5ldyBQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnlSZWFkZXIocHJvcGVydHlTb3VyY2VQcm92aWRlclJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BlcnR5U291cmNlUHJvdmlkZXJSZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0UHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkgPSBuZXcgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICBuZXcgUHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkocHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotICAgIH0KLSAgICByZXR1cm4gcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5IGdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAoY29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgY29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5ID0gbmV3IENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgbmV3IENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihjb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotICAgIH0KLSAgICByZXR1cm4gY29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgSW5zdGFsbCBVUkwKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJMIGdldEluc3RhbGxVUkwoKQotICB7Ci0gICAgcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcmVzb3VyY2Ugc3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMU3RyaW5nKFN0cmluZyBrZXkpCi0gIHsKLSAgICByZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXREZXNjcmlwdG9yKCkuZ2V0UmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcoa2V5KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcmVzb3VyY2Ugc3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMU3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBhcmcwKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFdTRExTdHJpbmcoa2V5KSwgbmV3IE9iamVjdCBbXSB7IGFyZzAgfSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgcmVzb3VyY2Ugc3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMU3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRXU0RMU3RyaW5nKGtleSksIG5ldyBPYmplY3QgW10geyBhcmcwLCBhcmcxIH0pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgcGx1Z2luIHBoeXNpY2FsIGRpcmVjdG9yeSBsb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJUGF0aCBnZXRQbHVnaW5Mb2NhdGlvbigpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUGF0aCBpbnN0YWxsUGF0aCA9IG5ldyBQYXRoKGdldEluc3RhbGxVUkwoKS50b0V4dGVybmFsRm9ybSgpKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotICAgICAgU3RyaW5nIGluc3RhbGxTdHIgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKG5ldyBVUkwoaW5zdGFsbFBhdGgudG9TdHJpbmcoKSkpLmdldEZpbGUoKTsKLSAgICAgIHJldHVybiBuZXcgUGF0aChpbnN0YWxsU3RyKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIldTRExFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luTG9jYXRpb24oKSBleGNlcHRpb24uLiIgKyBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGltYWdlRGVzY3JpcHRvckNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIHByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgaW50ZXJuYWxHZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkKLSAgewotICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXQoa2V5KTsKLSAgICBpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpCi0gICAgewotICAgICAgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFdTRExFZGl0b3JQbHVnaW4uY2xhc3MsIGtleSk7Ci0gICAgICBpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGltYWdlRGVzY3JpcHRvckNhY2hlLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkKLSAgewotICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmludGVybmFsR2V0SW1hZ2VEZXNjcmlwdG9yKGtleSk7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGljb25OYW1lKQotICB7Ci0gICAgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotICAgIAotICAgIGlmIChpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1hZ2VSZWdpc3RyeS5wdXQoaWNvbk5hbWUsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShnZXRDbGFzcygpLCBpY29uTmFtZSkpOwotICAgICAgcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXksIGJvb2xlYW4gaXNHcmF5ZWQpCi0gICAgeyAKLSAgICAgIEltYWdlIGltYWdlID0gbnVsbDsKLSAgICAgIGlmICghaXNHcmF5ZWQpCi0gICAgICB7Ci0gICAgICAgIGltYWdlID0gc3VwZXIuZ2V0SW1hZ2Uoa2V5KTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbWFnZSA9IChJbWFnZSlncmF5ZWRJbWFnZU1hcC5nZXQoa2V5KTsKLSAgICAgICAgaWYgKGltYWdlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJbWFnZSBjb2xvckltYWdlID0gc3VwZXIuZ2V0SW1hZ2Uoa2V5KTsKLSAgICAgICAgICBpZiAoY29sb3JJbWFnZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBjb2xvckltYWdlLCBTV1QuSU1BR0VfR1JBWSk7Ly9TV1QuSU1BR0VfRElTQUJMRSk7Ci0gICAgICAgICAgICBncmF5ZWRJbWFnZU1hcC5wdXQoa2V5LCBpbWFnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotICAqLwotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1ldGFkYXRhIGRpcmVjdG9yeSBmb3IgdGhpcyBwbHVnaW4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhRGlyZWN0b3J5KCkKLSAgewotICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdTRExFZGl0b3JQbHVnaW4gZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkKLSAgewotICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFNoZWxsIGdldFNoZWxsKCkKLSAgewotICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkKLSAgewotICAgIHN1cGVyLmluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoc3RvcmUpOwotICAgIHN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9QQUdFLCBHUkFQSF9QQUdFKTsKLSAgICAKLSAgICAvLyBXU0RMUHJlZmVyZW5jZVBhZ2UgcHJlZnMKLSAgICBzdG9yZS5zZXREZWZhdWx0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UiKSwgREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAvLyBEbyB3ZSBuZWVkIHRoaXMgcHJlZmVyZW5jZSBiZWxvdz8gIExvb2sgYXQgV1NETFByZWZlcmVuY2VQYWdlLmphdmEKLS8vICAgIHN0b3JlLnNldERlZmF1bHQoIkRlZnVhbHQgTG9jYXRpb246IiwgImh0dHA6Ly93d3cuZXhhbXBsZS5jb20iKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIHNldERlZmF1bHRQYWdlCi0gICAqIFNldCB0aGUgZGVmYXVsdCBwYWdlIHRvIG9wZW4gd2hlbiB0aGUgZWRpdG9yIHN0YXJ0cy4gTWFpbnRhaW5zIHRoZSBzdGF0ZQotICAgKiB3aGVuIFdTQUQgaXMgc2h1dGRvd24gYW5kIHJlc3RhcnRlZC4KLSAgICogQHBhcmFtIHBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlZmF1bHRQYWdlKFN0cmluZyBwYWdlKQotICB7Ci0gICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoREVGQVVMVF9QQUdFLCBwYWdlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhERUZBVUxUX1BBR0UpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXREZXBlbmRlbmNpZXNDaGFuZ2VkUG9saWN5KCkKLSAgewotICAgIC8vcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludChERVBFTkRFQ0lFU19DSEFOR0VEX1BPTElDWSk7Ci0gICAgcmV0dXJuIGRlcGVuZGVuY2llc0NoYW5nZWRQb2xpY3k7Ci0gIH0KLX0KLQotY2xhc3MgQmFzZVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSI7Ci0KLSAgLyoqCi0gICAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KFN0cmluZyBleHRlbnNpb25Qb2ludElkKQotICB7Ci0gIAlib29sZWFuICBib28gPSB0cnVlOwotICAgIElQbHVnaW5SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0gICAgSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBleHRlbnNpb25Qb2ludElkKTsKLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gIH0KLX0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnaW4gbWFuaWZlc3RzIGFuZCByZWdpc3RlcnMgZWFjaCBpbnRlcm5hbCBlZGl0b3IgZXh0ZW5zaW9uCi0gKi8KLWNsYXNzIEludGVybmFsRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBCYXNlUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImludGVybmFsRWRpdG9yRXh0ZW5zaW9ucyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImludGVybmFsRWRpdG9yRXh0ZW5zaW9uIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeTsKLQotICBwdWJsaWMgSW50ZXJuYWxFZGl0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgc3VwZXIucmVhZFJlZ2lzdHJ5KEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZEVsZW1lbnQoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLSAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDbGFzc0xvYWRlciBwbHVnaW5DbHNMb2FkZXIgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKS5nZXRQbHVnaW4oKS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgcmVnaXN0cnkuYWRkKHBsdWdpbkNsc0xvYWRlciwgY2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgdGhlIHBsdWdpbiBtYW5pZmVzdHMgYW5kIHJlZ2lzdGVycyBlYWNoIGV4dGVuc2liaWxpdHkgaXRlbSB0cmVlIHByb3ZpZGVyCi0gKi8KLWNsYXNzIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlciBleHRlbmRzIEJhc2VSZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY29udGVudEdlbmVyYXRvcnMiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NPTlRFTlRfR0VORVJBVE9SID0gImNvbnRlbnRHZW5lcmF0b3IiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NPTlRFTlRfR0VORVJBVE9SX1BST1ZJREVSID0gImNvbnRlbnRHZW5lcmF0b3JQcm92aWRlciI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DT05URU5UX0dFTkVSQVRPUl9DTEFTUyA9ICJjb250ZW50R2VuZXJhdG9yQ2xhc3MiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUE9SVF9PUFRJT05TX1BBR0VfQ0xBU1MgPSAicG9ydE9wdGlvbnNQYWdlQ2xhc3MiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQklORElOR19PUFRJT05TX1BBR0VfQ0xBU1MgPSAiYmluZGluZ09wdGlvbnNQYWdlQ2xhc3MiOwotCi0gIHByb3RlY3RlZCBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnk7Ci0KLSAgcHVibGljIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgc3VwZXIucmVhZFJlZ2lzdHJ5KEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZEVsZW1lbnQoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMRU1FTlRfQ09OVEVOVF9HRU5FUkFUT1IpKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FU1BBQ0UpOwotICAgICAgU3RyaW5nIGdlbmVyYXRvckNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NPTlRFTlRfR0VORVJBVE9SX0NMQVNTKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgZ2VuZXJhdG9yQ2xhc3MgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbiBiaW5kaW5nR2VuZXJhdG9yRXh0ZW5zaW9uID0gbmV3IENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24obmFtZSwgZ2VuZXJhdG9yQ2xhc3MpOwotICAgICAgICBiaW5kaW5nR2VuZXJhdG9yRXh0ZW5zaW9uLnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICBiaW5kaW5nR2VuZXJhdG9yRXh0ZW5zaW9uLnNldFBvcnRPcHRpb25zUGFnZUNsYXNzTmFtZShlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUE9SVF9PUFRJT05TX1BBR0VfQ0xBU1MpKTsKLSAgICAgICAgYmluZGluZ0dlbmVyYXRvckV4dGVuc2lvbi5zZXRCaW5kaW5nT3B0aW9uc1BhZ2VDbGFzc05hbWUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0JJTkRJTkdfT1BUSU9OU19QQUdFX0NMQVNTKSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luQ2xhc3NzTG9hZGVyID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCkuZ2V0UGx1Z2luKCkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgIGJpbmRpbmdHZW5lcmF0b3JFeHRlbnNpb24uc2V0Q2xhc3NMb2FkZXIocGx1Z2luQ2xhc3NzTG9hZGVyKTsKLSAgICAgICAgICByZWdpc3RyeS5hZGQoYmluZGluZ0dlbmVyYXRvckV4dGVuc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMRU1FTlRfQ09OVEVOVF9HRU5FUkFUT1JfUFJPVklERVIpKQotICAgIHsKLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgewotCQlDb250ZW50R2VuZXJhdG9yUHJvdmlkZXJFeHRlbnNpb24gY29udGVudEdlbmVyYXRvckV4dGVuc2lvbiA9IG5ldyBDb250ZW50R2VuZXJhdG9yUHJvdmlkZXJFeHRlbnNpb24oY2xhc3NOYW1lKTsKLSAgICAgICAgcmVnaXN0cnkuYWRkKGNvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBCYXNlUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUVfU1BBQ0UgPSAibmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBleHRlbnNpb25Qb2ludElkOwotICBwcm90ZWN0ZWQgU3RyaW5nIHRhZ05hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBhdHRyaWJ1dGVOYW1lczsKLSAgcHJvdGVjdGVkIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLSAgcHJpdmF0ZSBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIoU3RyaW5nIGV4dGVuc2lvblBvaW50SWQsIFN0cmluZyB0YWdOYW1lLCBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25Qb2ludElkID0gZXh0ZW5zaW9uUG9pbnRJZDsKLSAgICB0aGlzLnRhZ05hbWUgPSB0YWdOYW1lOwotICAgIHRoaXMubnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5ID0gbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5OwotICB9Ci0KLSAgcHVibGljIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCwgU3RyaW5nIHRhZ05hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcyhleHRlbnNpb25Qb2ludElkLCB0YWdOYW1lLCBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIGF0dHJpYnV0ZU5hbWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICBhdHRyaWJ1dGVOYW1lc1swXSA9IGF0dHJpYnV0ZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKFN0cmluZyBleHRlbnNpb25Qb2ludElkLCBTdHJpbmcgdGFnTmFtZSwgU3RyaW5nW10gYXR0cmlidXRlTmFtZXMsIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzKGV4dGVuc2lvblBvaW50SWQsIHRhZ05hbWUsIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgdGhpcy5hdHRyaWJ1dGVOYW1lcyA9IGF0dHJpYnV0ZU5hbWVzOwotICB9Ci0gIC8qKgotICAgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBzdXBlci5yZWFkUmVnaXN0cnkoZXh0ZW5zaW9uUG9pbnRJZCk7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZEVsZW1lbnQoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKHRhZ05hbWUpKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRV9TUEFDRSk7Ci0gICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENsYXNzTG9hZGVyIHBsdWdpbkNsYXNzc0xvYWRlciA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbkNsYXNzTG9hZGVyKCk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lcy5sZW5ndGggPT0gMSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lc1swXSk7Ci0gICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeS5wdXQobmFtZXNwYWNlLCBjbGFzc05hbWUsIHBsdWdpbkNsYXNzc0xvYWRlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZXNbaV07Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWFwLnB1dChhdHRyaWJ1dGVOYW1lLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkucHV0KG5hbWVzcGFjZSwgbWFwLCBwbHVnaW5DbGFzc3NMb2FkZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcGx1Z2luIG1hbmlmZXN0cyBhbmQgcmVnaXN0ZXJzIGVhY2ggZXh0ZW5zaWJpbGl0eSBpdGVtIHRyZWUgcHJvdmlkZXIKLSAqLwotY2xhc3MgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeVJlYWRlciBleHRlbmRzIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXIiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFUVF9OQU1FUyA9IHsgImxhYmVsUHJvdmlkZXJDbGFzcyIsICJjb250ZW50UHJvdmlkZXJDbGFzcyIgfTsKLQotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeVJlYWRlcihOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgc3VwZXIoRVhURU5TSU9OX1BPSU5UX0lELCBUQUdfTkFNRSwgQVRUX05BTUVTLCBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpOwotICB9Ci19Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIEVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIiOwotCi0gIHB1YmxpYyBFbGVtZW50Q29udGVudEZpbHRlckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpCi0gIHsKLSAgICBzdXBlcihFWFRFTlNJT05fUE9JTlRfSUQsIFRBR19OQU1FLCAiY2xhc3MiLCBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpOwotICB9Ci19Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIFByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAicHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXIiOwotCi0gIHB1YmxpYyBQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5UmVhZGVyKE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpCi0gIHsKLSAgICBzdXBlcihFWFRFTlNJT05fUE9JTlRfSUQsIFRBR19OQU1FLCAiY2xhc3MiLCBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBzdXBlci5yZWFkRWxlbWVudChlbGVtZW50KTsKLSAgfQotfQotCi1jbGFzcyBQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInByb3BlcnR5U291cmNlUHJvdmlkZXIiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJwcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIjsKLQotICBwdWJsaWMgUHJvcGVydHlTb3VyY2VQcm92aWRlclJlZ2lzdHJ5UmVhZGVyKE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpCi0gIHsKLSAgICBzdXBlcihFWFRFTlNJT05fUE9JTlRfSUQsIFRBR19OQU1FLCAiY2xhc3MiLCBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBzdXBlci5yZWFkRWxlbWVudChlbGVtZW50KTsKLSAgfQotfQotCi1jbGFzcyBQcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXJSZWdpc3RyeSBleHRlbmRzIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAicHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAicHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyIjsKLQotICBwdWJsaWMgUHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkoTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSkKLSAgewotICAgIHN1cGVyKEVYVEVOU0lPTl9QT0lOVF9JRCwgVEFHX05BTUUsICJjbGFzcyIsIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlYWRFbGVtZW50KGVsZW1lbnQpOwotICB9Ci19Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIERldGFpbHNWaWV3ZXJQcm92aWRlclJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJkZXRhaWxzVmlld2VyUHJvdmlkZXJzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZGV0YWlsc1ZpZXdlclByb3ZpZGVyIjsKLQotICBwdWJsaWMgRGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnlSZWFkZXIoTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSkKLSAgewotICAgIHN1cGVyKEVYVEVOU0lPTl9QT0lOVF9JRCwgVEFHX05BTUUsICJjbGFzcyIsIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlYWRFbGVtZW50KGVsZW1lbnQpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvclJlc291cmNlQ2hhbmdlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvclJlc291cmNlQ2hhbmdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzc3OTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExFZGl0b3JSZXNvdXJjZUNoYW5nZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIFdTRExFZGl0b3JSZXNvdXJjZUNoYW5nZUhhbmRsZXIKLXsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGVSZXF1aXJlZDsKLSAgcHJvdGVjdGVkIEludGVybmFsUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotICBwcm90ZWN0ZWQgSW50ZXJuYWxQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyOwotCi0gIHB1YmxpYyBXU0RMRWRpdG9yUmVzb3VyY2VDaGFuZ2VIYW5kbGVyKFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgewotICAgIHRoaXMud3NkbEVkaXRvciA9IHdzZGxFZGl0b3I7Ci0gICAgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICBwYXJ0TGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxQYXJ0TGlzdGVuZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGF0dGFjaCgpCi0gIHsKLSAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLSAgICB3c2RsRWRpdG9yLmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLSAgICB3c2RsRWRpdG9yLmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIE1hcCBjb21wdXRlRGVwZW5kZW5jeU1hcCgpCi0gIHsKLSAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKTsKLSAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGRlZmluaXRpb24uZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpaS5uZXh0KCk7Ci0gICAgICBpZiAocmVzb3VyY2UgIT0gZGVmaW5pdGlvbi5lUmVzb3VyY2UoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHVyaSA9IHJlc291cmNlLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChtYXAuZ2V0KHVyaSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG1hcC5wdXQodXJpLCB1cmkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVsb2FkKCkKLSAgewotICAJYm9vbGVhbiBkb1JlbG9hZCA9IGZhbHNlOyAgCQotCWludCBwb2xpY3kgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RGVwZW5kZW5jaWVzQ2hhbmdlZFBvbGljeSgpOwotCQotICAJaWYgKHBvbGljeSA9PSBXU0RMRWRpdG9yUGx1Z2luLkRFUEVOREVDSUVTX0NIQU5HRURfUE9MSUNZX1BST01QVCkKLSAgCXsKLQkJZG9SZWxvYWQgPSBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbih3c2RsRWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9ERVBFTkRFTkNJRVNfQ0hBTkdFRCIpLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9ERVBFTkRFTkNJRVNfQ0hBTkdFRF9SRUZSRVNIIikpOyAgCQotICAJfQotICAJZWxzZSBpZiAocG9saWN5ID09IFdTRExFZGl0b3JQbHVnaW4uREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUkVMT0FEKQotICAJewotICAJCWRvUmVsb2FkID0gdHJ1ZTsKLSAgCX0KLSAgCQotICAgIGlmIChkb1JlbG9hZCkKLSAgICB7ICAgIAotICAgICAgd3NkbEVkaXRvci5yZWxvYWREZXBlbmRlbmNpZXMoKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5pbmdUb1Jlc291cmNlQ2hhbmdlcygpCi0gIHsKLSAgCWludCBwb2xpY3kgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RGVwZW5kZW5jaWVzQ2hhbmdlZFBvbGljeSgpOwotICAJcmV0dXJuIHBvbGljeSA9PSBXU0RMRWRpdG9yUGx1Z2luLkRFUEVOREVDSUVTX0NIQU5HRURfUE9MSUNZX1BST01QVCB8fAotICAJCSAgIHBvbGljeSA9PSBXU0RMRWRpdG9yUGx1Z2luLkRFUEVOREVDSUVTX0NIQU5HRURfUE9MSUNZX1JFTE9BRDsKLSAgfQotCi0KLSAgY2xhc3MgSW50ZXJuYWxSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvcgotICB7Ci0gICAgcHJvdGVjdGVkIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlbmRpbmcgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgaW50IGNvdW50ID0gMDsKLQotICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkKLSAgICB7ICAgICAgCQotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAJICAgICAJCi0gICAgICBpZiAoZGlzcGxheSAhPSBudWxsICYmIGlzTGlzdGVuaW5nVG9SZXNvdXJjZUNoYW5nZXMoKSAmJiAhaXNVcGRhdGVSZXF1aXJlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSkKLSAgICAgICAgewotICAgICAgICAgIElSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gZXZlbnQuZ2V0RGVsdGEoKS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRlbHRhc1tpXS5hY2NlcHQodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzUGVuZGluZykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc1BlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgZGlzcGxheS50aW1lckV4ZWMoMjAwMCwgbmV3IFRpbWVyRXZlbnQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLSAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICB7Ci0gICAgICAgIGlmICghbGlzdC5jb250YWlucyhyZXNvdXJjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChyZXNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGNsYXNzIFRpbWVyRXZlbnQgaW1wbGVtZW50cyBSdW5uYWJsZQotICAgIHsKLSAgICAgIHB1YmxpYyBUaW1lckV2ZW50KCkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIk5ld1RpbWVyRXZlbnQoIiArIHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpLmVSZXNvdXJjZSgpLmdldFVSSSgpICsgIikgIiArIGNvdW50KTsgICAgICAJCi0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlpLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgcGxhdGZvcm1QYXRoID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwIGRlcGVuZGVuY3lNYXAgPSBjb21wdXRlRGVwZW5kZW5jeU1hcCgpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlpLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgcGxhdGZvcm1QYXRoID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS50b1N0cmluZygpOwotICAgICAgICAgIGlmIChkZXBlbmRlbmN5TWFwLmdldChwbGF0Zm9ybVBhdGgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNVcGRhdGVSZXF1aXJlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAod3NkbEVkaXRvci5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5nZXRBY3RpdmVQYXJ0KCkgPT0gd3NkbEVkaXRvcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXNVcGRhdGVSZXF1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICBwZXJmb3JtUmVsb2FkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaXNQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgSW50ZXJuYWxQYXJ0TGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgICAgaWYgKHBhcnQgPT0gd3NkbEVkaXRvcikKLSAgICAgIHsgICAgIAotICAgICAgICBpZiAoaXNVcGRhdGVSZXF1aXJlZCkKLSAgICAgICAgewotICAgICAgICAgIGlzVXBkYXRlUmVxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICBwZXJmb3JtUmVsb2FkKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KQotICAgIHsKLSAgICB9Ci0gIH0KLQotCi19Ci0KLS8qCi1jbGFzcyBEZXBlbmRlbmN5VmlzaXRvcgotewotCXB1YmxpYyB2b2lkIHZpc2l0SW1wb3J0KEltcG9ydCB0aGVJbXBvcnQpCi0JewotCQlpZiAodGhlSW1wb3J0LmdldEVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLQkJewotCQkJdmlzaXREZWZpbml0aW9uKHRoZUltcG9ydC5nZXRFRGVmaW5pdGlvbigpKTsKLQkJfQotCQllbHNlIGlmICh0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpICE9IG51bGwpCi0JCXsKLQkJCXZpc2l0U2NoZW1hKHRoZUltcG9ydC5nZXRFU2NoZW1hKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRYU0RTY2hlbWFEaXJlY3RpdmUoWFNEU2NoZW1hRGlyZWN0aXZlIGRpcmVjdGl2ZSkKLQl7Ci0JCVhTRFNjaGVtYSByZWZlcmVuY2VkU2NoZW1hID0gZGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0JCWlmIChyZWZlcmVuY2VkU2NoZW1hICE9IG51bGwpCi0JCXsKLQkJCXZpc2l0U2NoZW1hKHJlZmVyZW5jZWRTY2hlbWEpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikKLQl7Ci0JCWlmIChkZWZpbml0aW9uICE9IG51bGwpCi0JCXsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQl7Ci0JCQkJdmlzaXRJbXBvcnQoKEltcG9ydClpLm5leHQoKSk7Ci0JCQl9Ci0JCQlUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0JCQlpZiAodHlwZXMgIT0gbnVsbCkKLQkJCXsKLQotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlPYmplY3QgbyA9IGkubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotCQkJCQl7Ci0JCQkJCQlYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KW87Ci0JCQkJCQlpZiAoZS5nZXRFWFNEU2NoZW1hKCkgIT0gbnVsbCkKLQkJCQkJCXsKLQkJCQkJCQl2aXNpdFNjaGVtYShlLmdldEVYU0RTY2hlbWEoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotCXsKLQkJZm9yIChJdGVyYXRvciBpID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlPYmplY3QgbyA9IGkubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0JCQl7Ci0JCQkJdmlzaXRYU0RTY2hlbWFEaXJlY3RpdmUoKFhTRFNjaGVtYURpcmVjdGl2ZSlvKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotY2xhc3MgUmVsb2FkRGVwZW5kZW5jeVZpc2l0b3IgZXh0ZW5kcyBEZXBlbmRlbmN5VmlzaXRvcgotewotCXB1YmxpYyB2b2lkIHZpc2l0SW1wb3J0KEltcG9ydCB0aGVJbXBvcnQpCi0JewotCQlDb21wb25lbnRIYW5kbGVyIGhhbmRsZXIgPSBXU0RMUmVjb25jaWxlci5nZXRSZWNvbmNpbGVyKHRoZUltcG9ydCk7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdCh0aGVJbXBvcnQpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGhhbmRsZXIgIT0gbnVsbCkKLQkJewotCQkJaGFuZGxlci5yZWNvbmNpbGUod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCksIHRoZUltcG9ydCwgZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFhTRFNjaGVtYURpcmVjdGl2ZShYU0RTY2hlbWFEaXJlY3RpdmUgZGlyZWN0aXZlKQotCXsKLQotCX0KLX0qLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExNdWx0aVBhZ2VFZGl0b3JQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmVkOTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExNdWx0aVBhZ2VFZGl0b3JQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLklYTUxQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvclhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgV1NETE11bHRpUGFnZUVkaXRvclBhcnQgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0IGltcGxlbWVudHMgSVByb3BlcnR5TGlzdGVuZXIKLXsKLQotCSAgLyoqCi0JICAgKiAKLQkgICAqLwotCSAgcHVibGljIFdTRExNdWx0aVBhZ2VFZGl0b3JQYXJ0KCkKLQkgIHsKLQkgICAgc3VwZXIoKTsKLQkgIH0KLQkgIAotCSAgLyoqCi0JICAgKiBJbnRlcm5hbCBwYXJ0IGFjdGl2YXRpb24gbGlzdGVuZXIKLQkgICAqLwotCSAgY2xhc3MgUGFydExpc3RlbmVyIGV4dGVuZHMgU2hlbGxBZGFwdGVyIGltcGxlbWVudHMgSVBhcnRMaXN0ZW5lciB7Ci0JICAgIHByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZkFjdGl2ZVBhcnQ7Ci0JICAgIHByaXZhdGUgYm9vbGVhbiBmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSBmYWxzZTsKLQotCSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWN0aXZhdGlvbigpIHsKLQotCSAgICAgIGlmIChmSXNIYW5kbGluZ0FjdGl2YXRpb24pCi0JICAgICAgICByZXR1cm47Ci0KLQkgICAgICBpZiAoZkFjdGl2ZVBhcnQgPT0gV1NETE11bHRpUGFnZUVkaXRvclBhcnQudGhpcykgewotCSAgICAgICAgZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gdHJ1ZTsKLQkgICAgICAgIHRyeSB7Ci0JICAgICAgICAgIHNhZmVseVNhbml0eUNoZWNrU3RhdGUoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGZpbmFsbHkgewotCSAgICAgICAgICBmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSBmYWxzZTsKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQotCSAgICAvKioKLQkgICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQpCi0JICAgICAqLwotCSAgICBwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkgICAgICBmQWN0aXZlUGFydCA9IHBhcnQ7Ci0JICAgICAgaGFuZGxlQWN0aXZhdGlvbigpOwotCSAgICB9Ci0KLQkgICAgLyoqCi0JICAgICAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0KQotCSAgICAgKi8KLQkgICAgcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JICAgIH0KLQotCSAgICAvKioKLQkgICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQpCi0JICAgICAqLwotCSAgICBwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkgICAgfQotCi0JICAgIC8qKgotCSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0KQotCSAgICAgKi8KLQkgICAgcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkgICAgICBmQWN0aXZlUGFydCA9IG51bGw7Ci0JICAgIH0KLQotCSAgICAvKioKLQkgICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQpCi0JICAgICAqLwotCSAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkgICAgfQotCi0JICAgIC8qCi0JICAgICAqIEBzZWUgU2hlbGxMaXN0ZW5lciNzaGVsbEFjdGl2YXRlZChTaGVsbEV2ZW50KQotCSAgICAgKi8KLQkgICAgcHVibGljIHZvaWQgc2hlbGxBY3RpdmF0ZWQoU2hlbGxFdmVudCBlKSB7Ci0JICAgICAgaGFuZGxlQWN0aXZhdGlvbigpOwotCSAgICB9Ci0JICB9Ci0KLQkgIGNsYXNzIFRleHRJbnB1dExpc3RlbmVyIGltcGxlbWVudHMgSVRleHRJbnB1dExpc3RlbmVyIHsKLQkgICAgcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkgICAgfQotCi0JICAgIHB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JICAgIH0KLQkgIH0KLQotCSAgLyoqIFRoZSBzb3VyY2UgcGFnZSBpbmRleC4gKi8KLQkgIHByaXZhdGUgaW50IGZTb3VyY2VQYWdlSW5kZXg7Ci0JICAvKiogVGhlIHRleHQgZWRpdG9yLiAqLwotCSAgcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBmVGV4dEVkaXRvcjsKLQotCSAgcHJpdmF0ZSBQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyOwotCi0KLQkgIC8qCi0JICAgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIG1ha2UgZmlyZVByb3BlcnR5Q2hhbmdlZCBhY2Nlc3NiaWJsZSBmcm9tIHNvbWUKLQkgICAqIChhbm9ub21vdXMpIGlubmVyIGNsYXNzZXMuCi0JICAgKi8KLQkgIHByb3RlY3RlZCB2b2lkIF9maXJlUHJvcGVydHlDaGFuZ2UoaW50IHByb3BlcnR5KSB7Ci0JICAgIHN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSk7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogQWRkcyB0aGUgc291cmNlIHBhZ2Ugb2YgdGhlIG11bHRpLXBhZ2UgZWRpdG9yLgotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCBhZGRTb3VyY2VQYWdlKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkgICAgdHJ5IHsKLQkgICAgICBmU291cmNlUGFnZUluZGV4ID0gYWRkUGFnZShmVGV4dEVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JICAgICAgc2V0UGFnZVRleHQoZlNvdXJjZVBhZ2VJbmRleCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVEFCX1NPVVJDRSIpKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgIC8vIHRoZSB1cGRhdGUncyBjcml0aWNhbCwgdG8gZ2V0IHZpZXdlciBzZWxlY3Rpb24gbWFuYWdlciBhbmQKLQkgICAgICAvLyBoaWdobGlnaHRpbmcgdG8gd29yawotCSAgICAgIGZUZXh0RWRpdG9yLnVwZGF0ZSgpOwotCSAgCi0JICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfVElUTEUpOwotCSAgCi0JICAgICAgLy8gQ2hhbmdlcyB0byB0aGUgVGV4dCBWaWV3ZXIncyBkb2N1bWVudCBpbnN0YW5jZSBzaG91bGQgYWxzbyBmb3JjZSBhbgotCSAgICAgIC8vIGlucHV0IHJlZnJlc2gKLQkgICAgICBmVGV4dEVkaXRvci5nZXRUZXh0Vmlld2VyKCkuYWRkVGV4dElucHV0TGlzdGVuZXIobmV3IFRleHRJbnB1dExpc3RlbmVyKCkpOwotCSAgICB9Ci0JICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkgICAgICAvLyBkaXNwb3NlIGVkaXRvcgotCSAgICAgIGRpc3Bvc2UoKTsKLQotCSAgICAgIHRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihTU0VDb3JlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJBbl9lcnJvcl9oYXNfb2NjdXJyZWRfd2hlbjFfRVJST1JfIikpOyAvLyROT04tTkxTLTEkCi0JICAgIH0KLQkgIH0KLQotCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNjcmVhdGVQYWdlcygpCi0JICAgKi8KLQkgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhZ2VzKCkKLQkgIHsKLQkgICAgdHJ5Ci0JICAgIHsKLQkgICAgICAvLyBzb3VyY2UgcGFnZSBNVVNUIGJlIGNyZWF0ZWQgYmVmb3JlIGRlc2lnbiBwYWdlLCBub3cKLQkgICAgICBjcmVhdGVTb3VyY2VQYWdlKCk7Ci0JICAgICAgYWRkU291cmNlUGFnZSgpOwotCSAgICAgIHNldEFjdGl2ZVBhZ2UoKTsKLQotCSAgICAvLyBmdXR1cmVfVE9ETzogYWRkIGEgY2F0Y2ggYmxvY2sgaGVyZSBmb3IgYW55IGV4Y2VwdGlvbiB0aGUgZGVzaWduCi0JICAgIC8vIHBhZ2UgdGhyb3dzIGFuZCBjb252ZXJ0IGl0IGludG8gYSBtb3JlIGluZm9ybWF0aXZlIG1lc3NhZ2UuCi0JICAgIH0KLQkgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkgICAgfQotCSAgfQotCi0JICAvKioKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2NyZWF0ZVNpdGUob3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQpCi0JICAgKi8KLQkgIHByb3RlY3RlZCBJRWRpdG9yU2l0ZSBjcmVhdGVTaXRlKElFZGl0b3JQYXJ0IGVkaXRvcikgewotCSAgICBJRWRpdG9yU2l0ZSBzaXRlID0gbnVsbDsKLQkgICAgaWYgKGVkaXRvciA9PSBmVGV4dEVkaXRvcikgewotCSAgICAgIHNpdGUgPSBuZXcgTXVsdGlQYWdlRWRpdG9yU2l0ZSh0aGlzLCBlZGl0b3IpIHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclNpdGUjZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKQotCSAgICAgICAgICovCi0JICAgICAgICBwdWJsaWMgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCSAgICAgICAgICBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSBzdXBlci5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCSAgICAgICAgICBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgbXVsdGlDb250cmlidXRvciA9IFdTRExNdWx0aVBhZ2VFZGl0b3JQYXJ0LnRoaXMuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0vLwkgICAgICAgICAgaWYgKG11bHRpQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBYTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgewotLy8JICAgICAgICAgICAgY29udHJpYnV0b3IgPSAoKFhNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBtdWx0aUNvbnRyaWJ1dG9yKS5zb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcjsKLS8vCSAgICAgICAgICB9Ci0JICAgICAgICAgIHJldHVybiBjb250cmlidXRvcjsKLQkgICAgICAgIH0KLQkgICAgICB9OwotCSAgICB9Ci0JICAgIGVsc2UgewotCSAgICAgIHNpdGUgPSBzdXBlci5jcmVhdGVTaXRlKGVkaXRvcik7Ci0JICAgIH0KLQkgICAgcmV0dXJuIHNpdGU7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogQ3JlYXRlcyB0aGUgc291cmNlIHBhZ2Ugb2YgdGhlIG11bHRpLXBhZ2UgZWRpdG9yLgotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb3VyY2VQYWdlKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkgICAgZlRleHRFZGl0b3IgPSBjcmVhdGVUZXh0RWRpdG9yKCk7Ci0JICAgIGZUZXh0RWRpdG9yLnNldEVkaXRvclBhcnQodGhpcyk7Ci0KLQkgICAgLy8gU2V0IHRoZSBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIG5vdyBzbyB0aGUgdGV4dCBlZGl0b3Igd29uJ3QgdXNlCi0JICAgIC8vIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlyc3QKLQkgICAgLy8gYW5kIHN3aXRjaCB0byB0aGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGxhdGVyLgotCSAgICAvLyBETVcgcmVtb3ZlZCBzZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIDMvMjYvMjAwMyBzaW5jZSBhZGRlZAotCSAgICAvLyBjcmVhdGVQYXJ0Q29udHJvbCB0byBvdXIgdGV4dCBlZGl0b3IuCi0JICAgIC8vIGZUZXh0RWRpdG9yLnNldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkgICAgZlRleHRFZGl0b3IuYWRkUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBNZXRob2QgY3JlYXRlVGV4dEVkaXRvci4KLQkgICAqIAotCSAgICogQHJldHVybiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcgotCSAgICovCi0JICBwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRFZGl0b3IgY3JlYXRlVGV4dEVkaXRvcigpIHsKLQkgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclhNTCgpOwotCSAgfQotCi0JICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQkgIHsKLQkgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0JICAgIHdpbmRvdy5nZXRQYXJ0U2VydmljZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCSAgICB3aW5kb3cuZ2V0U2hlbGwoKS5yZW1vdmVTaGVsbExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0KLQkgICAgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkgICAgaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpIHsKLQkgICAgICBmVGV4dEVkaXRvci5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotCSAgICB9Ci0KLQkgICAgLy8gbW92ZWQgdG8gbGFzdCB3aGVuIGFkZGVkIHdpbmRvdyAuLi4gc2VlbXMgbGlrZQotCSAgICAvLyB3ZSdkIGJlIGluIGRhbmdlciBvZiBsb3Npbmcgc29tZSBkYXRhLCBsaWtlIHNpdGUsCi0JICAgIC8vIG9yIHNvbWV0aGluZy4KLQkgICAgc3VwZXIuZGlzcG9zZSgpOwotCSAgfQotCi0JICAvKgotCSAgICogKG5vbi1KYXZhZG9jKSBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhpcyBlZGl0b3IuIDxwPiBTdWJjbGFzc2VzIG11c3QKLQkgICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZSBmb3IgYW4KLQkgICAqIGVkaXRvci4gRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlIDxjb2RlPiBJRWRpdG9yUGFydCA8L2NvZGU+PC9wPgotCSAgICogCi0JICAgKiBAc2VlIElFZGl0b3JQYXJ0Ci0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkgICAgZlRleHRFZGl0b3IuZG9TYXZlKG1vbml0b3IpOwotCSAgICAvLyAgICAvLyB0aGlzIGlzIGEgdGVtcG9yYXJ5IHdheSB0byBmb3JjZSB2YWxpZGF0aW9uLgotCSAgICAvLyAgICAvLyB3aGVuIHRoZSB2YWxpZGF0b3IgaXMgYSB3b3JrYmVuY2ggYnVpbGRlciwgdGhlIGZvbGxvd2luZyBsaW5lcwotCSAgICAvLyBjYW4gYmUgcmVtb3ZlZAotCSAgICAvLyAgICBpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsKQotCSAgICAvLyAgICAgIGZEZXNpZ25WaWV3ZXIuc2F2ZU9jY3VycmVkKCk7Ci0KLQkgIH0KLQotCSAgLyoKLQkgICAqIChub24tSmF2YWRvYykgU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWRpdG9yIHRvIGFub3RoZXIgb2JqZWN0LiA8cD4KLQkgICAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIG9wZW4tc2F2ZS1jbG9zZQotCSAgICogbGlmZWN5Y2xlIGZvciBhbiBlZGl0b3IuIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT4gSUVkaXRvclBhcnQKLQkgICAqIDwvY29kZT48L3A+Ci0JICAgKiAKLQkgICAqIEBzZWUgSUVkaXRvclBhcnQKLQkgICAqLwotCSAgcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JICAgIGZUZXh0RWRpdG9yLmRvU2F2ZUFzKCk7Ci0JICAgIC8vIDI1MzYxOQotCSAgICAvLyBmb2xsb3dpbmcgdXNlZCB0byBiZSBleGVjdXRlZCBoZXJlLCBidXQgaXMKLQkgICAgLy8gbm93IGNhbGxlZCAiYmFjayIgZnJvbSB0ZXh0IGVkaXRvciAoc2luY2UKLQkgICAgLy8gbXVsaXRpcGxlIHBhdGhzIHRvIHRoZSBwZXJmb3JtU2F2ZUFzIGluIFN0cnVjdHVyZWRUZXh0RWRpdG9yLgotCSAgICAvL2RvU2F2ZUFzRm9yU3RydWN0dXJlZFRleHRNdWxpdFBhZ2VQYXJ0KCk7Ci0JICB9Ci0KLQkgIHByaXZhdGUgdm9pZCBlZGl0b3JJbnB1dElzQWNjZXB0YWJsZShJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkgICAgICAvLyB2ZXJpZnkgdGhhdCBpdCBjYW4gYmUgb3BlbmVkCi0JICAgICAgQ29yZUV4Y2VwdGlvbltdIGNvcmVFeGNlcHRpb25BcnJheSA9IG5ldyBDb3JlRXhjZXB0aW9uWzFdOwotCSAgICAgIGlmIChmaWxlRG9lc05vdEV4aXN0KChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCwgY29yZUV4Y2VwdGlvbkFycmF5KSkgewotCSAgICAgICAgLy8gdG9kbyB1c2UgbWVzc2FnZSBmb3JtYXR0ZXIgZm9yIHswfQotCSAgICAgICAgVGhyb3dhYmxlIGNvcmVFeGNlcHRpb24gPSBjb3JlRXhjZXB0aW9uQXJyYXlbMF07Ci0JICAgICAgICBpZiAoY29yZUV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlc291cmNlRXhjZXB0aW9uKSB7Ci0JICAgICAgICAgIC8vIEknbSBhc3N1bWluZyB0aGlzIGlzIGFsd2F5cyAnZG9lcyBub3QgZXhpc3QnCi0JICAgICAgICAgIC8vIHdlJ2xsIHJlZnJlc2ggbG9jYWwgZ28gbWltaWMgYmVoYXZpb3Igb2YgZGVmYXVsdAotCSAgICAgICAgICAvLyBlZGl0b3IsIHdoZXJlIHRoZQotCSAgICAgICAgICAvLyB0cm91Ymxlc29tZSBmaWxlIGlzIHJlZnJlc2hlZCAoYW5kIHdpbGwgY2F1c2UgaXQgdG8KLQkgICAgICAgICAgLy8gJ2Rpc2FwcGVhcicgZnJvbSBOYXZpZ2F0b3IuCi0JICAgICAgICAgIHRyeSB7Ci0JICAgICAgICAgICAgKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkgICAgICAgICAgICAvLyB2ZXJ5IHVubGlrZWx5Ci0vLwkgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGNlKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgICB0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oU1NFQ29yZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiMjNjb25jYXRfRVhDXyIsIChuZXcgT2JqZWN0W117aW5wdXQuZ2V0TmFtZSgpfSkpKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICAvLyROT04tTkxTLTEkID0gIlJlc291cmNlIHswfSBkb2VzIG5vdCBleGlzdC4iCi0JICAgICAgICB9Ci0JICAgICAgICBlbHNlIHsKLQkgICAgICAgICAgdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKFNTRUNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIjMyY29uY2F0X0VYQ18iLCAobmV3IE9iamVjdFtde2lucHV0LmdldE5hbWUoKX0pKSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgICAgLy8kTk9OLU5MUy0xJCA9ICJFZGl0b3IgY291bGQgbm90IGJlIG9wZW4gb24gezB9IgotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotCSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkgICAgICBJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JICAgICAgdHJ5IHsKLQkgICAgICAgIGNvbnRlbnRzID0gKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldENvbnRlbnRzKCk7Ci0JICAgICAgfQotCSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIG5vU3RvcmFnZUV4YykgewotCSAgICAgIH0KLQkgICAgICBpZiAoY29udGVudHMgPT0gbnVsbCkgewotCSAgICAgICAgdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKFNTRUNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIjMyY29uY2F0X0VYQ18iLCAobmV3IE9iamVjdFtde2lucHV0LmdldE5hbWUoKX0pKSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgICB9Ci0JICAgICAgZWxzZSB7Ci0JICAgICAgICB0cnkgewotCSAgICAgICAgICBjb250ZW50cy5jbG9zZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQotCSAgLy8gIHZvaWQgZG9TYXZlQXNGb3JTdHJ1Y3R1cmVkVGV4dE11bGl0UGFnZVBhcnQoKSB7Ci0JICAvLyAgICBzZXRQYWdlVGV4dChnZXRBY3RpdmVQYWdlKCksIGZUZXh0RWRpdG9yLmdldFRpdGxlKCkpOwotCSAgLy8gICAgc2V0SW5wdXQoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JICAvLyAgICBpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsKSB7Ci0JICAvLyAgICAgIC8vZkRlc2lnblZpZXdlci5zZXRFZGl0b3JJbnB1dChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkgIC8vICAgICAgZkRlc2lnblZpZXdlci5zZXRNb2RlbChnZXRNb2RlbCgpKTsKLQkgIC8vICAgICAgZkRlc2lnblZpZXdlci5zYXZlQXNPY2N1cnJlZCgpOwotCSAgLy8gICAgfQotCSAgLy8gICAgLy8gZXZlbiB0aG91Z2ggd2UndmUgc2V0IHRpdGxlIGV0Yy4sIHNldmVyYWwgdGltZXMgYWxyZWFkeSEKLQkgIC8vICAgIC8vIG9ubHkgbm93IGlzIGFsbCBwcmVwYXJlZCBmb3IgaXQuCi0JICAvLyAgICBmaXJlUHJvcGVydHlDaGFuZ2UoSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSk7Ci0JICAvLyAgICBmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0JICAvLyAgfQotCSAgLyoKLQkgICAqIChub24tSmF2YWRvYykgSW5pdGlhbGl6ZXMgdGhlIGVkaXRvciBwYXJ0IHdpdGggYSBzaXRlIGFuZCBpbnB1dC4gPHA+Ci0JICAgKiBTdWJjbGFzc2VzIG9mIDxjb2RlPiBFZGl0b3JQYXJ0IDwvY29kZT4gbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0JICAgKiBXaXRoaW4gdGhlIGltcGxlbWVudGF0aW9uIHN1YmNsYXNzZXMgc2hvdWxkIHZlcmlmeSB0aGF0IHRoZSBpbnB1dCB0eXBlCi0JICAgKiBpcyBhY2NlcHRhYmxlIGFuZCB0aGVuIHNhdmUgdGhlIHNpdGUgYW5kIGlucHV0LiBIZXJlIGlzIHNhbXBsZSBjb2RlOgotCSAgICogPC9wPjxwcmU+IGlmICghKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkpIHRocm93IG5ldwotCSAgICogUGFydEluaXRFeGNlcHRpb24oIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgSUZpbGVFZGl0b3JJbnB1dCIpOwotCSAgICogc2V0U2l0ZShzaXRlKTsgc2V0SW5wdXQoZWRpdG9ySW5wdXQpOyA8L3ByZT4KLQkgICAqLwotCSAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsZURvZXNOb3RFeGlzdChJRmlsZUVkaXRvcklucHV0IGlucHV0LCBUaHJvd2FibGVbXSBjb3JlRXhjZXB0aW9uKSB7Ci0JICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JICAgIElucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkgICAgaWYgKCghKGlucHV0LmV4aXN0cygpKSkgfHwgKCEoaW5wdXQuZ2V0RmlsZSgpLmV4aXN0cygpKSkpIHsKLQkgICAgICByZXN1bHQgPSB0cnVlOwotCSAgICB9Ci0JICAgIGVsc2UgewotCSAgICAgIHRyeSB7Ci0JICAgICAgICBpblN0cmVhbSA9IGlucHV0LmdldEZpbGUoKS5nZXRDb250ZW50cyh0cnVlKTsKLQkgICAgICB9Ci0JICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCSAgICAgICAgLy8gdmVyeSBsaWtlbHkgdG8gYmUgZmlsZSBub3QgZm91bmQKLQkgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0JICAgICAgICBjb3JlRXhjZXB0aW9uWzBdID0gZTsKLQkgICAgICB9Ci0JICAgICAgZmluYWxseSB7Ci0JICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotCSAgICAgICAgICB0cnkgewotCSAgICAgICAgICAgIGlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgfQotCSAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCi0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgICAgcmV0dXJuIHJlc3VsdDsKLQkgIH0KLQotCSAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgewotCSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQotCSAgICAgIC8vIERNVzogSSdtIGJ1bGxldC1wcm9vZmluZyB0aGlzIGJlY2F1c2UKLQkgICAgICAvLyBpdHMgYmVlbiByZXBvcnRlZCAob24gNC4wMyB2ZXJzaW9uKSBhIG51bGwgcG9pbnRlciBzb21ldGltZXMKLQkgICAgICAvLyBoYXBwZW5zIGhlcmUgb24gc3RhcnR1cCwgd2hlbiBhbiBlZGl0b3IgaGFzIGJlZW4gbGVmdAotCSAgICAgIC8vIG9wZW4gd2hlbiB3b3JrYmVuY2ggc2h1dGRvd24uCi0JICAgICAgaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpIHsKLQkgICAgICAgIHJlc3VsdCA9IGZUZXh0RWRpdG9yLmdldEFkYXB0ZXIoa2V5KTsKLQkgICAgICB9Ci0JICAgIHJldHVybiByZXN1bHQ7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogSUV4dGVuZGVkTWFya3VwRWRpdG9yIG1ldGhvZAotCSAgICovCi0JICBwdWJsaWMgTm9kZSBnZXRDYXJldE5vZGUoKSB7Ci0JICAgIGlmIChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkKLQkgICAgICByZXR1cm4gbnVsbDsKLQotCSAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpLmdldENhcmV0Tm9kZSgpOwotCSAgfQotCi0JICAvKioKLQkgICAqIElFeHRlbmRlZFNpbXBsZUVkaXRvciBtZXRob2QKLQkgICAqLwotCSAgcHVibGljIGludCBnZXRDYXJldFBvc2l0aW9uKCkgewotCSAgICBpZiAoZ2V0VGV4dEVkaXRvcigpID09IG51bGwpCi0JICAgICAgcmV0dXJuIC0xOwotCi0JICAgIHJldHVybiBnZXRUZXh0RWRpdG9yKCkuZ2V0Q2FyZXRQb3NpdGlvbigpOwotCSAgfQotCi0JICAvKioKLQkgICAqIElFeHRlbmRlZFNpbXBsZUVkaXRvciBtZXRob2QKLQkgICAqLwotCSAgcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkgICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotCSAgICAgIHJldHVybiBudWxsOwotCi0JICAgIHJldHVybiBnZXRUZXh0RWRpdG9yKCkuZ2V0RG9jdW1lbnQoKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBJRXh0ZW5kZWRNYXJrdXBFZGl0b3IgbWV0aG9kCi0JICAgKi8KLQkgIHB1YmxpYyBEb2N1bWVudCBnZXRET01Eb2N1bWVudCgpIHsKLQkgICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotCSAgICAgIHJldHVybiBudWxsOwotCi0JICAgIHJldHVybiBnZXRUZXh0RWRpdG9yKCkuZ2V0RE9NRG9jdW1lbnQoKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgbWV0aG9kCi0JICAgKi8KLQkgIHB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCkgewotCSAgICByZXR1cm4gdGhpczsKLQkgIH0KLQotCSAgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JICAgIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCSAgICBpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkKLQkgICAgICBtb2RlbCA9IGZUZXh0RWRpdG9yLmdldE1vZGVsKCk7Ci0JICAgIHJldHVybiBtb2RlbDsKLQkgIH0KLQotCSAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCSAgfQotCi0JICAvKioKLQkgICAqIElFeHRlbmRlZE1hcmt1cEVkaXRvciBtZXRob2QKLQkgICAqLwotCSAgcHVibGljIExpc3QgZ2V0U2VsZWN0ZWROb2RlcygpIHsKLQkgICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotCSAgICAgIHJldHVybiBudWxsOwotCSAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGVkTm9kZXMoKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgbWV0aG9kCi0JICAgKi8KLQkgIHB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb25SYW5nZSgpIHsKLQkgICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKQotCSAgICAgIHJldHVybiBuZXcgUG9pbnQoLTEsIC0xKTsKLQotCSAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JICB9Ci0KLQkgIHB1YmxpYyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKCkgewotCSAgICByZXR1cm4gZlRleHRFZGl0b3I7Ci0JICB9Ci0KLQkgIC8qCi0JICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJV29ya2JlbmNoUGFydC4KLQkgICAqLwotCSAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkgICAgU3RyaW5nIHRpdGxlID0gbnVsbDsKLQkgICAgaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKSB7Ci0JICAgICAgaWYgKGdldEVkaXRvcklucHV0KCkgIT0gbnVsbCkgewotCSAgICAgICAgdGl0bGUgPSBnZXRFZGl0b3JJbnB1dCgpLmdldE5hbWUoKTsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgICAgdGl0bGUgPSBnZXRUZXh0RWRpdG9yKCkuZ2V0VGl0bGUoKTsKLQkgICAgfQotCSAgICBpZiAodGl0bGUgPT0gbnVsbCkgewotCSAgICAgIHRpdGxlID0gZ2V0UGFydE5hbWUoKTsKLQkgICAgfQotCSAgICByZXR1cm4gdGl0bGU7Ci0JICB9Ci0KLQkgIC8qCi0JICAgKiAobm9uLUphdmFkb2MpIFNldHMgdGhlIGN1cnNvciBhbmQgc2VsZWN0aW9uIHN0YXRlIGZvciB0aGlzIGVkaXRvciB0bwotCSAgICogdGhlIHBhc3NhZ2UgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gbWFya2VyLiA8cD4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICAgKiBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+IElFZGl0b3JQYXJ0IDwvY29kZT48L3A+Ci0JICAgKiAKLQkgICAqIEBzZWUgSUVkaXRvclBhcnQKLQkgICAqLwotCSAgcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCSAgICAvLyAocGEpIDIwMDIwMjE3IHRoaXMgd2FzIG51bGwgd2hlbiBvcGVuaW5nIGFuIGVkaXRvciB0aGF0IHdhcwotCSAgICAvLyBhbHJlYWR5IG9wZW4KLQkgICAgaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpIHsKLQkgICAgICBJR290b01hcmtlciBtYXJrZXJHb3RvZXIgPSAoSUdvdG9NYXJrZXIpIGZUZXh0RWRpdG9yLmdldEFkYXB0ZXIoSUdvdG9NYXJrZXIuY2xhc3MpOwotCSAgICAgIG1hcmtlckdvdG9lci5nb3RvTWFya2VyKG1hcmtlcik7Ci0JICAgIH0KLQkgIH0KLQotCSAgcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JICAgIGVkaXRvcklucHV0SXNBY2NlcHRhYmxlKGlucHV0KTsKLQkgICAgdHJ5IHsKLQkgICAgICBzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkgICAgICBpZiAocGFydExpc3RlbmVyID09IG51bGwpIHsKLQkgICAgICAgIHBhcnRMaXN0ZW5lciA9IG5ldyBQYXJ0TGlzdGVuZXIoKTsKLQkgICAgICB9Ci0JICAgICAgLy9nZXRTaXRlKCkuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdG5lcik7Ci0JICAgICAgLy8gd2Ugd2FudCB0byBsaXN0ZW4gZm9yIG91ciBvd24gYWN0aXZhdGlvbgotCSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCSAgICAgIHdpbmRvdy5nZXRQYXJ0U2VydmljZSgpLmFkZFBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCSAgICAgIHdpbmRvdy5nZXRTaGVsbCgpLmFkZFNoZWxsTGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkgICAgfQotCSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkgICAgICBpZiAoZSBpbnN0YW5jZW9mIFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKSB7Ci0JICAgICAgICBUaHJvd2FibGUgdCA9ICgoU291cmNlRWRpdGluZ1J1bnRpbWVFeGNlcHRpb24pIGUpLmdldE9yaWdpbmFsRXhjZXB0aW9uKCk7Ci0JICAgICAgICBpZiAodCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0JICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0KTsKLQkgICAgICAgICAgLy8gZmlsZSBub3QgZm91bmQKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgICAgc2V0UGFydE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLQkgIH0KLQotCSAgLyoKLQkgICAqIChub24tSmF2YWRvYykgUmV0dXJucyB3aGV0aGVyIHRoZSAic2F2ZSBhcyIgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZCBieQotCSAgICogdGhpcyBlZGl0b3IuIDxwPiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wbGVtZW50IHRoZQotCSAgICogb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZSBmb3IgYW4gZWRpdG9yLiBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUKLQkgICAqIDxjb2RlPiBJRWRpdG9yUGFydCA8L2NvZGU+PC9wPgotCSAgICogCi0JICAgKiBAc2VlIElFZGl0b3JQYXJ0Ci0JICAgKi8KLQkgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkgICAgcmV0dXJuIGZUZXh0RWRpdG9yICE9IG51bGwgJiYgZlRleHRFZGl0b3IuaXNTYXZlQXNBbGxvd2VkKCk7Ci0JICB9Ci0KLQkgIC8qCi0JICAgKiAobm9uLUphdmFkb2MpIFJldHVybnMgd2hldGhlciB0aGUgY29udGVudHMgb2YgdGhpcyBlZGl0b3Igc2hvdWxkIGJlCi0JICAgKiBzYXZlZCB3aGVuIHRoZSBlZGl0b3IgaXMgY2xvc2VkLiA8cD4gVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT4gdHJ1ZQotCSAgICogPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgZWRpdG9yIGlzIGRpcnR5ICggPGNvZGU+IGlzRGlydHkgPC9jb2RlPiApLgotCSAgICogPC9wPgotCSAgICovCi0JICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVPbkNsb3NlTmVlZGVkKCkgewotCSAgICAvLyBvdmVycmlkaW5nIHN1cGVyIGNsYXNzIHNpbmNlIGl0IGRvZXMgYSBsb3dseSBpc0RpcnR5IQotCSAgICBpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkKLQkgICAgICByZXR1cm4gZlRleHRFZGl0b3IuaXNTYXZlT25DbG9zZU5lZWRlZCgpOwotCSAgICByZXR1cm4gaXNEaXJ0eSgpOwotCSAgfQotCi0JICAvKioKLQkgICAqIE5vdGlmaWVzIHRoaXMgbXVsdGktcGFnZSBlZGl0b3IgdGhhdCB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBpZCBoYXMKLQkgICAqIGJlZW4gYWN0aXZhdGVkLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgZGlmZmVyZW50Ci0JICAgKiB0YWIuCi0JICAgKiAKLQkgICAqIEBwYXJhbSBuZXdQYWdlSW5kZXgKLQkgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBhY3RpdmF0ZWQgcGFnZQotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLQkgICAgc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCi0JICAgIHNhdmVMYXN0QWN0aXZlUGFnZUluZGV4KG5ld1BhZ2VJbmRleCk7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogUG9zdHMgdGhlIHVwZGF0ZSBjb2RlICJiZWhpbmQiIHRoZSBydW5uaW5nIG9wZXJhdGlvbi4KLQkgICAqLwotCSAgcHJvdGVjdGVkIHZvaWQgcG9zdE9uRGlzcGxheVF1ZShSdW5uYWJsZSBydW5uYWJsZSkgewotCSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JICAgIElXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkgICAgaWYgKHdpbmRvd3MgIT0gbnVsbCAmJiB3aW5kb3dzLmxlbmd0aCA+IDApIHsKLQkgICAgICBEaXNwbGF5IGRpc3BsYXkgPSB3aW5kb3dzWzBdLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotCSAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgICAgcnVubmFibGUucnVuKCk7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogSW5kaWNhdGVzIHRoYXQgYSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLQkgICAqIAotCSAgICogQHBhcmFtIHNvdXJjZQotCSAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHdob3NlIHByb3BlcnR5IGhhcyBjaGFuZ2VkCi0JICAgKiBAcGFyYW0gcHJvcElkCi0JICAgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgcHJvcGVydHkgd2hpY2ggaGFzIGNoYW5nZWQ7IHByb3BlcnR5IGlkcyBhcmUKLQkgICAqICAgICAgICAgICAgZ2VuZXJhbGx5IGRlZmluZWQgYXMgY29uc3RhbnRzIG9uIHRoZSBzb3VyY2UgY2xhc3MKLQkgICAqLwotCSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLQkgICAgc3dpdGNoIChwcm9wSWQpIHsKLQkgICAgICAvLyBoYWQgdG8gaW1wbGVtZW50IGlucHV0IGNoYW5nZWQgImxpc3RlbmVyIiBzbyB0aGF0Ci0JICAgICAgLy8gc3RydWN1dGVkVGV4dCBjb3VsZCB0ZWxsIGl0IGNvbnRhaW5pbmcgZWRpdG9yIHRoYXQKLQkgICAgICAvLyB0aGUgaW5wdXQgaGFzIGNoYW5nZSwgd2hlbiBhICdyZXNvdXJjZSBtb3ZlZCcgZXZlbnQgaXMKLQkgICAgICAvLyBmb3VuZC4KLQkgICAgICBjYXNlIElFZGl0b3JQYXJ0LlBST1BfSU5QVVQgOgotCSAgICAgIGNhc2UgSUVkaXRvclBhcnQuUFJPUF9ESVJUWSA6IHsKLQkgICAgICAgIGlmIChzb3VyY2UgPT0gZlRleHRFZGl0b3IpIHsKLQkgICAgICAgICAgaWYgKGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkgIT0gZ2V0RWRpdG9ySW5wdXQoKSkgewotCSAgICAgICAgICAgIHNldElucHV0KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCSAgICAgICAgICAgIC8vIHRpdGxlIHNob3VsZCBhbHdheXMgY2hhbmdlIHdoZW4gaW5wdXQgY2hhbmdlcy4KLQkgICAgICAgICAgICAvLyBjcmVhdGUgcnVubmFibGUgZm9yIGZvbGxvd2luZyBwb3N0IGNhbGwKLQkgICAgICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkgICAgICAgICAgICAgICAgX2ZpcmVQcm9wZXJ0eUNoYW5nZShJV29ya2JlbmNoUGFydC5QUk9QX1RJVExFKTsKLQkgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9OwotCSAgICAgICAgICAgIC8vIFVwZGF0ZSBpcyBqdXN0IHRvIHBvc3QgdGhpbmdzIG9uIHRoZSBkaXNwbGF5IHF1ZXVlCi0JICAgICAgICAgICAgLy8gKHRocmVhZCkuIFdlIGhhdmUgdG8gZG8gdGhpcyB0byBnZXQgdGhlIGRpcnR5Ci0JICAgICAgICAgICAgLy8gcHJvcGVydHkgdG8gZ2V0IHVwZGF0ZWQgYWZ0ZXIgb3RoZXIgdGhpbmdzIG9uIHRoZQotCSAgICAgICAgICAgIC8vIHF1ZXVlIGFyZSBleGVjdXRlZC4KLQkgICAgICAgICAgICBwb3N0T25EaXNwbGF5UXVlKHJ1bm5hYmxlKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgYnJlYWs7Ci0JICAgICAgfQotCSAgICAgIGNhc2UgSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSA6IHsKLQkgICAgICAgIC8vIHVwZGF0ZSB0aGUgaW5wdXQgaWYgdGhlIHRpdGxlIGlzIGNoYW5nZWQKLQkgICAgICAgIGlmIChzb3VyY2UgPT0gZlRleHRFZGl0b3IpIHsKLQkgICAgICAgICAgaWYgKGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkgIT0gZ2V0RWRpdG9ySW5wdXQoKSkgewotCSAgICAgICAgICAgIHNldElucHV0KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgICBicmVhazsKLQkgICAgICB9Ci0JICAgICAgZGVmYXVsdCA6IHsKLQkgICAgICAgIC8vIHByb3BhZ2F0ZSBjaGFuZ2VzLiBJcyB0aGlzIG5lZWRlZD8gQW5zd2VyOiBZZXMuCi0JICAgICAgICBpZiAoc291cmNlID09IGZUZXh0RWRpdG9yKSB7Ci0JICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wSWQpOwotCSAgICAgICAgfQotCSAgICAgICAgYnJlYWs7Ci0JICAgICAgfQotCSAgICB9Ci0KLQkgIH0KLQotCSAgcHJvdGVjdGVkIHZvaWQgc2FmZWx5U2FuaXR5Q2hlY2tTdGF0ZSgpIHsKLQkgICAgLy8gSWYgd2UncmUgY2FsbGVkIGJlZm9yZSBlZGl0b3IgaXMgY3JlYXRlZCwgc2ltcGx5IGlnbm9yZSBzaW5jZSB3ZQotCSAgICAvLyBkZWxlZ2F0ZSB0aGlzIGZ1bmN0aW9uIHRvIG91ciBlbWJlZGRlZCBUZXh0RWRpdG9yCi0JICAgIGlmIChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkKLQkgICAgICByZXR1cm47Ci0KLQkgICAgZ2V0VGV4dEVkaXRvcigpLnNhZmVseVNhbml0eUNoZWNrU3RhdGUoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0KLQkgIH0KLQotCSAgcHJvdGVjdGVkIHZvaWQgc2F2ZUxhc3RBY3RpdmVQYWdlSW5kZXgoaW50IG5ld1BhZ2VJbmRleCkgewotCSAgICAvLyBzYXZlIHRoZSBsYXN0IGFjdGl2ZSBwYWdlIGluZGV4IHRvIHByZWZlcmVuY2UgbWFuYWdlcgotCSAgICBnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShJWE1MUHJlZmVyZW5jZU5hbWVzLkxBU1RfQUNUSVZFX1BBR0UsIG5ld1BhZ2VJbmRleCk7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogU2V0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBwYWdlLgotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCBzZXRBY3RpdmVQYWdlKCkgewotCSAgICAvLyByZXRyaWV2ZSB0aGUgbGFzdCBhY3RpdmUgcGFnZSBpbmRleCBmcm9tIHByZWZlcmVuY2UgbWFuYWdlcgotCSAgICBpbnQgYWN0aXZlUGFnZUluZGV4ID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KElYTUxQcmVmZXJlbmNlTmFtZXMuTEFTVF9BQ1RJVkVfUEFHRSk7Ci0KLQkgICAgLy8gV2UgY2hlY2sgdGhpcyByYW5nZSBzaW5jZSBzb21lb25lIGNvdWxkIGhhbmQgZWRpdCB0aGUgWE1MCi0JICAgIC8vIHByZWZlcmVuY2UgZmlsZSB0byBhbiBpbnZhbGlkIHZhbHVlIC4uLiB3aGljaCBJIGtub3cgZnJvbQotCSAgICAvLyBleHBlcmllbmNlIDooIC4uLiBpZiB0aGV5IGRvLCB3ZSdsbCByZXNldCB0byBkZWZhdWx0IGFuZCBjb250aW51ZQotCSAgICAvLyByYXRoZXIgdGhhbiB0aHJvdyBhbiBhc3NlcnRpb24gZXJyb3IgaW4gdGhlIHNldEFjdGl2ZVBhZ2UoaW50KQotCSAgICAvLyBtZXRob2QuCi0JICAgIGlmIChhY3RpdmVQYWdlSW5kZXggPCAwIHx8IGFjdGl2ZVBhZ2VJbmRleCA+PSBnZXRQYWdlQ291bnQoKSkgewotCSAgICAgIGFjdGl2ZVBhZ2VJbmRleCA9IGZTb3VyY2VQYWdlSW5kZXg7Ci0JICAgIH0KLQkgICAgc2V0QWN0aXZlUGFnZShhY3RpdmVQYWdlSW5kZXgpOwotCSAgfQotCi0JICAvKgotCSAgICogKG5vbi1KYXZhZG9jKQotCSAgICogCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICAgKi8KLQkgIHByb3RlY3RlZCB2b2lkIHNldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCSAgICAvLyBJZiBkcml2ZW4gZnJvbSB0aGUgU291cmNlIHBhZ2UsIGl0J3MgIm1vZGVsIiBtYXkgbm90IGJlIHVwIHRvIGRhdGUKLQkgICAgLy8gd2l0aCB0aGUgaW5wdXQganVzdCB5ZXQuIFdlJ2xsIHJlbHkgb24gbGF0ZXIgbm90aWZpY2F0aW9uIGZyb20gdGhlCi0JICAgIC8vIFRleHRWaWV3ZXIgdG8gc2V0IHVzIHN0cmFpZ2h0Ci0JICAgIHN1cGVyLnNldElucHV0KGlucHV0KTsKLQkgICAgc2V0UGFydE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBJRXh0ZW5kZWRNYXJrdXBFZGl0b3IgbWV0aG9kCi0JICAgKi8KLQkgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChTaGVsbCBjb250ZXh0KSB7Ci0JICAgIGlmIChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkKLQkgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBXU0RMRWRpdG9yUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5JTkZPLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCSAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpLnZhbGlkYXRlRWRpdChjb250ZXh0KTsKLQkgIH0KLQkgIAotCX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExTZWxlY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMU2VsZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE0ZDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExTZWxlY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotCi1wdWJsaWMgY2xhc3MgV1NETFNlbGVjdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsgICAgICAgCi0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlTm90aWZ5ID0gdHJ1ZTsKLQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIElTZWxlY3Rpb25Qcm92aWRlciBzb3VyY2UpCi0gIHsgIAotICAgIGlmIChlbmFibGVOb3RpZnkpCi0gICAgewotICAgICAgY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICAgIGVuYWJsZU5vdGlmeSA9IGZhbHNlOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc291cmNlLCBzZWxlY3Rpb24pOwotICAgICAgICBMaXN0IGNvcHlPZkxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QobGlzdGVuZXJMaXN0KTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29weU9mTGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgICAgbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgZW5hYmxlTm90aWZ5ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAKLQotICAvLyAgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLSAgLy8KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdGhpcyk7Ci0gIH0KLQotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSAKLSAgewotICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIAotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSAKLSAgewotICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICB9IAotICAKLSAgLy8gaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIC8vCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSAgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChlbmFibGVOb3RpZnkpCi0gICAgewotICAgICAgc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpLCBldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLSAgICB9Ci0gIH0KLX0gICAgICAgICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETFRleHRFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2I5NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETFRleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlldy5ldmVudHMuSU5vZGVTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXcuZXZlbnRzLk5vZGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JTW9kZWxRdWVyeUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlci5FeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmUuV1NETENvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uV1NETFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uRGF0YVR5cGVWYWx1ZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLkVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMVGV4dEVkaXRvciBleHRlbmRzIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGltcGxlbWVudHMgSU5vZGVTZWxlY3Rpb25MaXN0ZW5lciwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IKLXsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLSAgcHJvdGVjdGVkIFdTRExDb250ZW50T3V0bGluZVBhZ2Ugb3V0bGluZVBhZ2U7Ci0gIHByb3RlY3RlZCBXU0RMU2VsZWN0aW9uTWFuYWdlciB3c2RsU2VsZWN0aW9uTWFuYWdlcjsKLSAgcHJvdGVjdGVkIEludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBJbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5RXh0ZW5zaW9uSGVscGVyIG1vZGVsUXVlcnlFeHRlbnNpb25IZWxwZXI7Ci0gIHByb3RlY3RlZCBMaXN0IG1vZGVsUXVlcnlDb250cmlidXRvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgcHVibGljIFdTRExUZXh0RWRpdG9yKFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgewotICAgIHRoaXMud3NkbEVkaXRvciA9IHdzZGxFZGl0b3I7Ci0gICAgd3NkbFNlbGVjdGlvbk1hbmFnZXIgPSB3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLSAgICB3c2RsU2VsZWN0aW9uTWFuYWdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRSZWdpc3RlcmVkRXh0ZW5zaW9ucyhXU0RMRWRpdG9yRXh0ZW5zaW9uLk1PREVMX1FVRVJZX0NPTlRSSUJVVE9SKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLk1PREVMX1FVRVJZX0NPTlRSSUJVVE9SLCB3c2RsRWRpdG9yKTsKLSAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsUXVlcnlDb250cmlidXRvckxpc3QuYWRkKG8pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBhcmcwKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlUGFydENvbnRyb2woYXJnMCk7Ci0gICAgYWRkT3Blbk9uU2VsZWN0aW9uTGlzdGVuZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZE9wZW5PblNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgewotICAgIEtleUFkYXB0ZXIga2V5QWRhcHRlciA9IG5ldyBLZXlBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBhcmcwKQotICAgICAgewotICAgICAgICBpZiAoYXJnMC5rZXlDb2RlID09IFNXVC5GMykKLSAgICAgICAgewotICAgICAgICAgIExpc3QgbGlzdCA9IGdldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGVzKCk7Ci0gICAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgT3Blbk9uU2VsZWN0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBPcGVuT25TZWxlY3Rpb25IZWxwZXIod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCkpOyAgIAotICAgICAgICAgICAgICBoZWxwZXIub3BlbkVkaXRvcigoTm9kZSlvYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgZ2V0VGV4dFZpZXdlcigpLmdldFRleHRXaWRnZXQoKS5hZGRLZXlMaXN0ZW5lcihrZXlBZGFwdGVyKTsKLSAgfQotCi0gCi0gIC8qCi0gICAqIEBzZWUgU3RydWN0dXJlZFRleHRFZGl0b3Ijc2V0TW9kZWwoSUZpbGVFZGl0b3JJbnB1dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKElGaWxlRWRpdG9ySW5wdXQgaW5wdXQpCi0gIHsKLSAgICBpZiAobW9kZWxRdWVyeUV4dGVuc2lvbkhlbHBlciAhPSBudWxsKQotICAgIHsKLSAgICAgIG1vZGVsUXVlcnlFeHRlbnNpb25IZWxwZXIuZGlzcG9zZSgpOwotICAgICAgbW9kZWxRdWVyeUV4dGVuc2lvbkhlbHBlciA9IG51bGw7Ci0gICAgfQotCi0gICAgc3VwZXIuc2V0TW9kZWwoaW5wdXQpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gbW9kZWxRdWVyeUNvbnRyaWJ1dG9yTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgSU1vZGVsUXVlcnlDb250cmlidXRvciBtb2RlbFF1ZXJ5Q29udHJpYnV0b3IgPSAoSU1vZGVsUXVlcnlDb250cmlidXRvcilpLm5leHQoKTsKLSAgICAgIG1vZGVsUXVlcnlDb250cmlidXRvci5zZXRNb2RlbCgoSURPTU1vZGVsKWdldE1vZGVsKCkpOwotICAgIH0KLQotICAgIC8vIGNvbnRyaWJ1dGUgdGhlIE1vZGVsUXVlcnlFeHRlbnNpb25IZWxwZXIgYXMgYW4gZXh0ZW5zaW9uIHRvbwotICAgIC8vCi0gICAgbW9kZWxRdWVyeUV4dGVuc2lvbkhlbHBlciA9IG5ldyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uSGVscGVyKChJRE9NTW9kZWwpZ2V0TW9kZWwoKSk7Ci0gIH0KLQotICAKLSAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHJlcXVpcmVkKQotICB7Ci0JCWlmIChJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpCi0JCXsKLQkJICByZXR1cm4gZ2V0Q29udGVudE91dGxpbmVQYWdlKCk7Ci0JCX0gICAgCi0JCWlmIChJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkKLQkJewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsIHx8IGZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkgPT0gbnVsbCB8fCBmUHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLQkJCXsKLS8vCQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0ZSBXU0RMIFByb3BlcnR5IFNoZWV0Iik7Ci0vLyAgICAgICAgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gY2ZnID0gY3JlYXRlUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKTsKLS8vICAgICAgICBpZiAoY2ZnICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICBpZiAoY2ZnIGluc3RhbmNlb2YgU3RydWN0dXJlZFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAoKFN0cnVjdHVyZWRQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbikgY2ZnKS5zZXRFZGl0b3IodGhpcyk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UgcHJvcGVydHlTaGVldFBhZ2UgPSBuZXcgQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UoKTsKLS8vICAgICAgICAgICAgcHJvcGVydHlTaGVldFBhZ2Uuc2V0Q29uZmlndXJhdGlvbihjZmcpOwotLy8gICAgICAgICAgICBwcm9wZXJ0eVNoZWV0UGFnZS5zZXRNb2RlbChnZXRNb2RlbCgpKTsKLS8vICAgICAgICAgICAgZlByb3BlcnR5U2hlZXRQYWdlID0gcHJvcGVydHlTaGVldFBhZ2U7Ci0vLyAgICAgICAgfQotCi0vLyAgCSAgICBmUHJvcGVydHlTaGVldFBhZ2UgPSBuZXcgV1NETFByb3BlcnR5U2hlZXRQYWdlKGdldE1vZGVsKCksIGdldEVkaXRvclBhcnQoKSk7Ci0vLyAgCSAgICAoKFdTRExQcm9wZXJ0eVNoZWV0UGFnZSkgZlByb3BlcnR5U2hlZXRQYWdlKS5zZXRTZWxlY3Rpb25NYW5hZ2VyKGdldFdTRExFZGl0b3IoKS5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOyAvL2dldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0vLy8vCSAgCSAgKChXU0RMUHJvcGVydHlTaGVldFBhZ2UpIGZQcm9wZXJ0eVNoZWV0UGFnZSkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcigoV1NETFByb3BlcnR5U2hlZXRQYWdlKSBmUHJvcGVydHlTaGVldFBhZ2UpOwotLy8gIAkgICAgKChXU0RMUHJvcGVydHlTaGVldFBhZ2UpZlByb3BlcnR5U2hlZXRQYWdlKS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKG5ldyBFeHRlbnNpYmxlUHJvcGVydHlTb3VyY2VQcm92aWRlcihnZXRXU0RMRWRpdG9yKCkpKTsKLS8vLy8gIAkgICAgZ2V0V1NETEVkaXRvcigpLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKFdTRExQcm9wZXJ0eVNoZWV0UGFnZSlmUHJvcGVydHlTaGVldFBhZ2UpOwotCi0gIAkgICAgZlByb3BlcnR5U2hlZXRQYWdlID0gbmV3IFdTRExUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSh0aGlzLCBnZXRXU0RMRWRpdG9yKCkpOwotICAJICAgICgoV1NETFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKWZQcm9wZXJ0eVNoZWV0UGFnZSkuc2V0U2VsZWN0aW9uTWFuYWdlcihnZXRXU0RMRWRpdG9yKCkuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLQotCQkJfQotCQkJcmV0dXJuIGZQcm9wZXJ0eVNoZWV0UGFnZTsKLQkJfQotCQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihyZXF1aXJlZCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvcGVydHlDYXRlZ29yaWVzKCkKLSAgewotICAgIHJldHVybiBuZXcgU3RyaW5nW10geyAiZ2VuZXJhbCIsICJuYW1lc3BhY2UiLCAib3RoZXIiLCAiYXR0cmlidXRlcyIsICJkb2N1bWVudGF0aW9uIiwgImZhY2V0cyIgfTsKLSAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IjZ2V0Q29udHJpYnV0b3JJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250cmlidXRvcklkKCkKLQl7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMVGV4dEVkaXRvciI7Ci0JLy8JIHJldHVybiBnZXRTaXRlKCkuZ2V0SWQoKTsKLSAgfQotICAKLSAgLyoKLSAgICogQHNlZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciNnZXRDb250ZW50T3V0bGluZVBhZ2UoKQotICAgKi8KLSAgcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkKLSAgewotICAgIGlmICgob3V0bGluZVBhZ2UgPT0gbnVsbCkgfHwgb3V0bGluZVBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgKG91dGxpbmVQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpKQotICAgIHsKLSAgICAgIG91dGxpbmVQYWdlID0gbmV3IFdTRExDb250ZW50T3V0bGluZVBhZ2Uod3NkbEVkaXRvcik7Ci0gICAgICBvdXRsaW5lUGFnZS5zZXRDb250ZW50UHJvdmlkZXIod3NkbEVkaXRvci5nZXRFeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyKCkpOwotICAgICAgb3V0bGluZVBhZ2Uuc2V0TGFiZWxQcm92aWRlcih3c2RsRWRpdG9yLmdldEV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIoKSk7Ci0gICAgICBvdXRsaW5lUGFnZS5zZXRNb2RlbCh3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKSk7IC8vWE1MRG9jdW1lbnQoKSk7Ci0KLSAgICAgIGdldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIoKS5hZGROb2RlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihnZXRWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgICAgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlci5zZXRFdmVudFNvdXJjZShvdXRsaW5lUGFnZSk7Ci0gICAgfQotICAgIHJldHVybiBvdXRsaW5lUGFnZTsKLSAgfQotCi0gIHB1YmxpYyBXU0RMRWRpdG9yIGdldFdTRExFZGl0b3IoKQotICB7Ci0gICAgcmV0dXJuIChXU0RMRWRpdG9yKWdldEVkaXRvclBhcnQoKTsKLSAgfQotCi0gIC8vIHVzZWQgdG8gbWFwIHNlbGVjdGlvbnMgZnJvbSB0aGUgb3V0bGluZSB2aWV3IHRvIHRoZSBzb3VyY2UgdmlldwotICAvLyB0aGlzIGNsYXNzIHRoaW5rcyBvZiBzZWxlY3Rpb25zIGluIHRlcm1zIG9mIERPTSBlbGVtZW50Ci0gIGNsYXNzIEludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdEZvck90aGVyTW9kZWwoT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBudWxsOwotCi0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IChOb2RlKW9iamVjdDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0Tm9kZUZvck9iamVjdChvYmplY3QpOwotICAgICAgfQotCi0gICAgICAvLyB0aGUgdGV4dCBlZGl0b3IgY2FuIG9ubHkgYWNjZXB0IHNlZCBub2RlcyEKLSAgICAgIC8vCi0gICAgICBpZiAoIShub2RlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Ob2RlKSkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAgIC8vIGhlcmUgd2UgY29udmVydCB0aGUgbW9kZWwgc2VsZWN0aW9uIHRvIGEgbm9kZSBzZWxlY3Rpb24gcmVxJ2QgZm9yIHRoZSBzb3VyY2UgdmlldwotICAgIC8vCi0gICAgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbm9kZVNlbGVjdGlvbkNoYW5nZWQoTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAgIC8vIGhlcmUgd2UgY29udmVydCBhbiBub2RlIHNlbGVjaXRvbiB0byBhIG1vZGVsIHNlbGVjdGlvbiBhcyByZXEnZCBieSB0aGUgb3RoZXIgdmlld3MKLSAgICAvLwotICAgIGlmICghZXZlbnQuZ2V0U291cmNlKCkuZXF1YWxzKGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gICAgICBMaXN0IGxpc3QgPSBldmVudC5nZXRTZWxlY3RlZE5vZGVzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgICAgIHsKLQkgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudClub2RlOwotCSAgICAgICAgICBicmVhazsKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotCSAgICAgICAgewotCSAgICAgICAgICBlbGVtZW50ID0gKChBdHRyKW5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCSAgICAgICAgICBicmVhazsKLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBPYmplY3QgbyA9IGVsZW1lbnQ7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCksIGVsZW1lbnQpOwotICAgICAgICBpZiAobW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG8gPSBtb2RlbE9iamVjdDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAobyAhPSBudWxsKQotICAgICAgewotICAgICAgICB3c2RsU2VsZWN0aW9uTWFuYWdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obyksIGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB3c2RsU2VsZWN0aW9uTWFuYWdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSwgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdXBkYXRlKCkKLSAgewotICAgIHN1cGVyLnVwZGF0ZSgpOwotICAgIGlmIChvdXRsaW5lUGFnZSAhPSBudWxsKQotICAgICAgb3V0bGluZVBhZ2Uuc2V0TW9kZWwoZ2V0TW9kZWwoKSk7Ci0gIH0KLQotICBwdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUV4dGVuc2lvbkhlbHBlcgotICB7Ci0gICAgcHJvdGVjdGVkIE1vZGVsUXVlcnkgbW9kZWxRdWVyeTsKLSAgICBwcm90ZWN0ZWQgRGF0YVR5cGVWYWx1ZUV4dGVuc2lvbiBkYXRhVHlwZVZhbHVlRXh0ZW5zaW9uOwotICAgIHByb3RlY3RlZCBFbGVtZW50Q29udGVudEZpbHRlckV4dGVuc2lvbiBlbGVtZW50Q29udGVudEZpbHRlckV4dGVuc2lvbjsKLQotICAgIHB1YmxpYyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uSGVscGVyKElET01Nb2RlbCB4bWxNb2RlbCkKLSAgICB7Ci0gICAgICBkYXRhVHlwZVZhbHVlRXh0ZW5zaW9uID0gbmV3IFdTRExEYXRhVHlwZVZhbHVlRXh0ZW5zaW9uKCk7Ci0gICAgICBlbGVtZW50Q29udGVudEZpbHRlckV4dGVuc2lvbiA9IG5ldyBXU0RMRWxlbWVudENvbnRlbnRGaWx0ZXJFeHRlbnNpb24oKTsKLQotICAgICAgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoeG1sTW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICBpZiAobW9kZWxRdWVyeSAhPSBudWxsICYmIG1vZGVsUXVlcnkuZ2V0RXh0ZW5zaW9uTWFuYWdlcigpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsUXVlcnkuZ2V0RXh0ZW5zaW9uTWFuYWdlcigpLmFkZEV4dGVuc2lvbihkYXRhVHlwZVZhbHVlRXh0ZW5zaW9uKTsKLSAgICAgICAgbW9kZWxRdWVyeS5nZXRFeHRlbnNpb25NYW5hZ2VyKCkuYWRkRXh0ZW5zaW9uKGVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgICBpZiAobW9kZWxRdWVyeSAhPSBudWxsICYmIG1vZGVsUXVlcnkuZ2V0RXh0ZW5zaW9uTWFuYWdlcigpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsUXVlcnkuZ2V0RXh0ZW5zaW9uTWFuYWdlcigpLnJlbW92ZUV4dGVuc2lvbihkYXRhVHlwZVZhbHVlRXh0ZW5zaW9uKTsKLSAgICAgICAgbW9kZWxRdWVyeS5nZXRFeHRlbnNpb25NYW5hZ2VyKCkucmVtb3ZlRXh0ZW5zaW9uKGVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGV4dGVuZCB0aGUgTW9kZWxRdWVyeSBiZWhhdmlvdXIgc28gdGhhdCB3ZSBjYW4gY29udHJpYnV0ZSBvdXIgb3duCi0gICAqICdhbGxvd2VkIHZhbHVlcycgZm9yIGF0dHJpYnV0ZXMgb3IgZWxlbWVudHMgKGUuZy4gdGhlICd0eXBlJyBhdHRyaWJ1dGUpLgotICAgKi8KLSAgcHVibGljIGNsYXNzIFdTRExEYXRhVHlwZVZhbHVlRXh0ZW5zaW9uIGltcGxlbWVudHMgRGF0YVR5cGVWYWx1ZUV4dGVuc2lvbgotICB7Ci0gICAgcHVibGljIGludCBnZXRUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gREFUQV9UWVBFX1ZBTFVFX0VYVEVOU0lPTjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIldTRExEYXRhVHlwZVZhbHVlRXh0ZW5zaW9uIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIGphdmEudXRpbC5MaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBpZiAoY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikKLSAgICAgIHsKLSAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZ2V0V1NETEVkaXRvcigpLmdldERlZmluaXRpb24oKSk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50RWxlbWVudE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICBOb2RlIHBhcmVudE5vZGUgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgU3RyaW5nIHBhcmVudE5hbWUgPSAiIjsKLSAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlLmdldExvY2FsTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNoZWNrTmFtZShuYW1lLCAibWVzc2FnZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwodXRpbC5nZXRNZXNzYWdlTmFtZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJiaW5kaW5nIikpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZEFsbCh1dGlsLmdldEJpbmRpbmdOYW1lcygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgInR5cGUiKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiYmluZGluZyIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QuYWRkQWxsKHV0aWwuZ2V0UG9ydFR5cGVOYW1lcygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgInBhcnQiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZEFsbCh1dGlsLmdldENvbXBvbmVudE5hbWVMaXN0KHRydWUpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJlbGVtZW50IikpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgInBhcnQiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZEFsbCh1dGlsLmdldENvbXBvbmVudE5hbWVMaXN0KGZhbHNlKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja05hbWUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHRva2VuKQotICAgIHsKLSAgICAgIGlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUudHJpbSgpLmVxdWFscyh0b2tlbikpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGNsYXNzIHBlcmZvcm1zIHNvbWUgZmlsdGVyaW5nIGZvciBzb21lIGtub3duIGV4dGVuc2libGl0eSBlbGVtZW50cyB0byBlbmFibGUKLSAgICogc21hcnRlciBzdWdnZXN0aW9ucyB0aGFuIHRob3NlIHByb3ZpZGVkIGJ5IHRoZSAnZHVtYicgd3NkbCBzY2hlbWEgCi0gICAqLwotICBwdWJsaWMgY2xhc3MgV1NETEVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uIGltcGxlbWVudHMgRWxlbWVudENvbnRlbnRGaWx0ZXJFeHRlbnNpb24KLSAgewotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEVMRU1FTlRfQ09OVEVOVF9GSUxURVI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gICAgewotICAgICAgcmV0dXJuICJXU0RMRWxlbWVudENvbnRlbnRGaWx0ZXJFeHRlbnNpb24iOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUGFyZW50RWxlbWVudE1lc3NhZ2VSZWZlcmVuY2UoU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImlucHV0IikgfHwgcGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJvdXRwdXQiKSB8fCBwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImZhdWx0Iik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDTU5vZGVNZXNzYWdlUmVmZXJlbmNlQ29udGVudChTdHJpbmcgY21Ob2RlTmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gY21Ob2RlTmFtZS5lcXVhbHMoImJvZHkiKSB8fCBjbU5vZGVOYW1lLmVxdWFscygiaGVhZGVyIikgfHwgY21Ob2RlTmFtZS5lcXVhbHMoImZhdWx0IikgfHwgY21Ob2RlTmFtZS5lcXVhbHMoInVybFJlcGxhY2VtZW50IikgfHwgY21Ob2RlTmFtZS5lcXVhbHMoInVybEVuY29kZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaWx0ZXJBdmFpbGFibGVFbGVtZW50Q29udGVudChMaXN0IGxpc3QsIEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgewotICAgICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lc3BhY2VVUkkgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgLy8gb25seSBmaWx0ZXIgY2hpbGRyZW4gZm9yICdub24tc2NoZW1hJyBlbGVtZW50cwotICAgICAgLy8gICAgIAkKLSAgICAgIGlmICghV1NETENvbnN0YW50cy5YU0RfTkFNRVNQQUNFX1VSSS5lcXVhbHMocGFyZW50RWxlbWVudE5hbWVzcGFjZVVSSSkpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBsaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBpbmNsdWRlID0gdHJ1ZTsKLSAgICAgICAgICBDTU5vZGUgY21Ob2RlID0gKENNTm9kZSlsaXN0LmdldChpKTsKLSAgICAgICAgICBTdHJpbmcgY21Ob2RlTmFtZSA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50TmFtZSAhPSBudWxsICYmIGNtTm9kZU5hbWUgIT0gbnVsbCAmJiBjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsKLSAgICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsKLSAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETy4uLiBwcm92aWRlIGEgbGlzdCBvZiBuYW1lc3BhY2VzIHRoYXQgc2hvdWxkIGFsd2F5cyBnZXQgZmlsdGVyZWQgb3V0IAotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikgfHwgbmFtZXNwYWNlVVJJLmVxdWFscyhXU0RMQ29uc3RhbnRzLlhTRF9OQU1FU1BBQ0VfVVJJKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBleGNsdWRlIHNvYXAtZW5jIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciBmaWx0ZXIgPSAoRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlcilXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlclJlZ2lzdHJ5KCkuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBmaWx0ZXIuaXNWYWxpZENvbnRleHQoZWxlbWVudCwgY21Ob2RlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICghaW5jbHVkZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LnJlbW92ZShpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBJbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyIGdldEludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JcmV0dXJuIGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjYmY3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEVFTWVudUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOyAKLSAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFN3aXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JTWVudUFjdGlvbkNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExHcm91cE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTUNvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmFjdGlvbnMuTWVudUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS51dGlsLlhNTENvbW1vblJlc291cmNlczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8qKgotICogVE9ETy4uLiB0aGVyZSBhcmUgbGlrZWx5IHNldmVyYWwgcGxhY2VzIHdoZXJlIHdlIGNhbiByZWZhY3RvciBjb2RlIGZyb20gIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIKLSAqLwotcHVibGljIGNsYXNzIEFkZEVFTWVudUFjdGlvbkNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSU1lbnVBY3Rpb25Db250cmlidXRvcgoteyAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIE1lbnVCdWlsZGVyIG1lbnVCdWlsZGVyID0gbmV3IE1lbnVCdWlsZGVyKCk7Ci0KLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZU1lbnVBY3Rpb25zKGZpbmFsIElNZW51TWFuYWdlciBtZW51LCBOb2RlIG5vZGUsIE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBib29sZWFuIGlzU3VibWVudVJlcXVpcmVkID0gZmFsc2U7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICB7ICAgICAKLSAgICAgIFdTRExTd2l0Y2ggd3NkbFN3aXRjaCA9IG5ldyBXU0RMU3dpdGNoKCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotCSAgICAgIH0gCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0JICAgICAgfSAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0KQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkgICAgICB9IAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotCSAgICAgIH0KLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0KQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkgICAgICB9IAotIAotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZURlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgICAgICB7ICAgICAgCi0gICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkgICAgICB9ICAgICAgICAgICAKLSAgICAgCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlUG9ydChQb3J0IHBvcnQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgICAgIH0gCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCB1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAJewotICAgICAgCQlpZiAoZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRBY3Rpb25zKHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5nZXRFbGVtZW50KCkpLnNpemUoKSA+IDApCi0gICAgICAJCXsgICAgICAJCQotICAgICAgCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICAgIAkJfQotICAgICAgCQllbHNlCi0gICAgICAJCXsKLSAgICAgIAkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotICAgICAgCQl9Ci0gICAgICAJfQotICAgICAgfTsgICAgICAgIAotICAgICAgaXNTdWJtZW51UmVxdWlyZWQgPSB3c2RsU3dpdGNoLmRvU3dpdGNoKChXU0RMRWxlbWVudClvYmplY3QpICE9IG51bGw7Ci0gICAgICBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KG9iamVjdCk7ICAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkKLSAgICB7Ci0gICAgICBXU0RMR3JvdXBPYmplY3QgZ3JvdXBPYmplY3QgPSAoV1NETEdyb3VwT2JqZWN0KW9iamVjdDsKLSAgICAgCi0gICAgICBzd2l0Y2ggKGdyb3VwT2JqZWN0LmdldFR5cGUoKSkKLSAgICAgIHsgICAKLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuRVhURU5TSUJJTElUWV9FTEVNRU5UU19HUk9VUCA6IAotICAgICAgICB7Ci0gICAgICAgICAgaXNTdWJtZW51UmVxdWlyZWQgPSB0cnVlOwotICAgICAgICAgIGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZ3JvdXBPYmplY3QuZ2V0RGVmaW5pdGlvbigpKTsgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgICB9Ci0KLSAgICBpZiAoaXNTdWJtZW51UmVxdWlyZWQpCi0gICAgewotICAgICAgTWVudU1hbmFnZXIgc3VibWVudSA9IG5ldyBNZW51TWFuYWdlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BRERfRVhURU5TSUJJTElUWV9FTEVNRU5UIikpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgLy8gaGVyZSBJJ20gYXR0ZW1wdGluZyB0byBhZGQgdGhlIG1lbnUgaXRlbSBpbiBhICdnb29kJyBwbGFjZSBpbiB0aGUgZXhpc2l0aW5nIG1lbnUKLSAgICAgIC8vIHRvZG8gYWRkIG1lbnUgZ3JvdXBzIHRvIGF2b2lkIHRoZSBuZWVkIGZvciB0aGlzIHRlc3QKLSAgICAgIC8vCi0vLyAgICAgIGlmIChtZW51LmZpbmQoImFkZGNoaWxkIikgIT0gbnVsbCkKLS8vICAgICAgewotLy8gICAgICAJbWVudS5pbnNlcnRBZnRlcigiYWRkY2hpbGQiLCBzdWJtZW51KTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlCi0vLyAgICAgIHsKLS8vICAgICAgCW1lbnUuYWRkKHN1Ym1lbnUpOwotLy8gICAgICB9CSAKLSAgICAJbWVudS5hZGQoc3VibWVudSk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgIHsKLSAgICAgICAgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnRBY3Rpb25zKHN1Ym1lbnUsIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2liaWxpdHlFbGVtZW50QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAgICAgICAgICAKLSAgICBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgCi0gICAgaWYgKGVkICE9IG51bGwpCi0gICAgewotICAgICAgYWRkQWN0aW9uSGVscGVyKG1lbnUsIGdldEV4dGVuc2liaWxpdHlFbGVtZW50QWN0aW9ucyhlbGVtZW50KSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudEFjdGlvbnMoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgTGlzdCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvLyBhZGQgaW5zZXJ0IGNoaWxkIG5vZGUgYWN0aW9ucwotICAgICAgLy8KLSAgICAgIGludCBpYyA9IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUzsKLSAgICAgIGludCB2YyA9IE1vZGVsUXVlcnkuVkFMSURJVFlfU1RSSUNUOwotCi0gICAgICBtb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZWxlbWVudCwgZWQsIC0xLCBpYywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG1vZGVsUXVlcnlBY3Rpb25MaXN0OwotICB9Ci0gIAotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEFjdGlvbkhlbHBlcihJTWVudU1hbmFnZXIgbWVudSwgTGlzdCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCBhY3Rpb25MaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gbW9kZWxRdWVyeUFjdGlvbkxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiA9IChNb2RlbFF1ZXJ5QWN0aW9uKWkubmV4dCgpOwotICAgICAgQ01Ob2RlIGNtbm9kZSA9IGFjdGlvbi5nZXRDTU5vZGUoKTsKLSAgICAgIGlmIChjbW5vZGUgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc090aGVyTmFtZXNwYWNlID0gZmFsc2U7Ci0gICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWNtbm9kZS5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOwotICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKSAgICAgICAgICAKLSAgICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IAotICAgICAgICAgIGlzT3RoZXJOYW1lc3BhY2UgPSBuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiAhbmFtZXNwYWNlVVJJLmVxdWFscyhXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNPdGhlck5hbWVzcGFjZSkKLSAgICAgICAgewotICAgICAgICAgIGludCBjbU5vZGVUeXBlID0gY21ub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICAgICAgaWYgKGFjdGlvbi5nZXRLaW5kKCkgPT0gTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHN3aXRjaCAoY21Ob2RlVHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFjdGlvbkxpc3QuYWRkKG5ldyBBZGROb2RlQWN0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbiljbW5vZGUsIGFjdGlvbi5nZXRQYXJlbnQoKSwgYWN0aW9uLmdldFN0YXJ0SW5kZXgoKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgICB9ICAKLSAgICBtZW51QnVpbGRlci5wb3B1bGF0ZU1lbnUobWVudSwgYWN0aW9uTGlzdCwgZmFsc2UpOwotICB9ICAgCi0KLSAgLyoqCi0gICAqIEFkZE5vZGVBY3Rpb24KLSAgICovCi0gIHB1YmxpYyBjbGFzcyBBZGROb2RlQWN0aW9uIGV4dGVuZHMgQmFzZU5vZGVBY3Rpb24KLSAgewotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB1bmRvRGVzY3JpcHRpb247IAotICAgIHByb3RlY3RlZCBDTU5vZGUgY21ub2RlOwotICAgIHByb3RlY3RlZCBpbnQgaW5kZXg7Ci0gICAgcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCi0KLSAgICBwdWJsaWMgQWRkTm9kZUFjdGlvbihDTU5vZGUgY21ub2RlLCBOb2RlIHBhcmVudCwgIGludCBpbmRleCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLmNtbm9kZSA9IGNtbm9kZTsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5pbmRleCA9IGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZyB0ZXh0ID0gZ2V0TGFiZWwocGFyZW50LCBjbW5vZGUpOwotICAgICAgc2V0VGV4dCh0ZXh0KTsgICAgIAotICAgICAgZGVzY3JpcHRpb24gPSB0ZXh0OwotICAgICAgdW5kb0Rlc2NyaXB0aW9uID0gWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfTUVOVV9BREQiKSArICIgIiArIHRleHQ7Ci0gICAgICAvL3NldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXRJbWFnZURlc2NyaXB0b3IoY21ub2RlKSk7IAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9ICI/IiArIGNtbm9kZSArICI/IjsKLSAgICAgIGlmIChjbW5vZGUgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShjbW5vZGUsIHBhcmVudCwgbnVsbCk7ICAgICAgICAgCi0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OyAgIAotICAgIH0gIAotCi0gICAgcHVibGljIE5vZGUgZ2V0Tm9kZSgpCi0gICAgewotICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIHVuZG9EZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKCk7Ci0KLSAgICAgIGlmIChjbW5vZGUgIT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsgICAgICAgIAotCi0gICAgICAgIERPTUNvbnRlbnRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRE9NQ29udGVudEJ1aWxkZXJJbXBsKGRvY3VtZW50KTsgCi0gICAgICAgIGJ1aWxkZXIuc2V0UHJvcGVydHkoRE9NQ29udGVudEJ1aWxkZXIuUFJPUEVSVFlfQlVJTERfQkxBTktfVEVYVF9OT0RFUywgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgYnVpbGRlci5zZXRCdWlsZFBvbGljeShET01Db250ZW50QnVpbGRlci5CVUlMRF9PTkxZX1JFUVVJUkVEX0NPTlRFTlQpOwotICAgICAgICBidWlsZGVyLmJ1aWxkKHBhcmVudCwgY21ub2RlKTsKLSAgICAgICAgaW5zZXJ0Tm9kZXNBdEluZGV4KHBhcmVudCwgYnVpbGRlci5nZXRSZXN1bHQoKSwgaW5kZXgsIHRydWUpOwotICAgICAgfQotCi0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9IAotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0Tm9kZXNBdEluZGV4KE5vZGUgcGFyZW50LCBMaXN0IGxpc3QsIGludCBpbmRleCwgYm9vbGVhbiBmb3JtYXQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgaW5kZXggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgIH0KLSAgICAgIE5vZGUgcmVmQ2hpbGQgPSAoaW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSkgPyBub2RlTGlzdC5pdGVtKGluZGV4KSA6IG51bGw7Ci0gICAgCi0gICAgICAvLyBoZXJlIHdlIGNvbnNpZGVyIHRoZSBjYXNlIHdoZXJlIHRoZSBwcmV2aW91cyBub2RlIGlzIGEgJ3doaXRlIHNwYWNlJyBUZXh0IG5vZGUKLSAgICAgIC8vIHdlIHNob3VsZCByZWFsbHkgZG8gdGhlIGluc2VydCBiZWZvcmUgdGhpcyBub2RlCi0gICAgICAvLwotICAgICAgaW50IHByZXZJbmRleCA9IGluZGV4IC0gMTsKLSAgICAgIE5vZGUgcHJldkNoaWxkID0gKHByZXZJbmRleCA8IG5vZGVMaXN0LmdldExlbmd0aCgpKSA/IG5vZGVMaXN0Lml0ZW0ocHJldkluZGV4KSA6IG51bGw7Ci0JICAgIGlmIChpc1doaXRlc3BhY2VUZXh0Tm9kZShwcmV2Q2hpbGQpKSAKLSAgICAgIHsKLQkgIAkgIHJlZkNoaWxkID0gcHJldkNoaWxkOwotCSAgICB9Ci0gICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbmV3Tm9kZSA9IChOb2RlKWkubmV4dCgpOwotICAgIAotICAgICAgICBpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnQ7Ci0gICAgICAgICAgcGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKChBdHRyKW5ld05vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmQ2hpbGQpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBuZXdOb2RlID0gKE5vZGUpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChmb3JtYXQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCSAgICAgIEZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3JYTUwgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0JCSAgICAgIGZvcm1hdFByb2Nlc3NvclhNTC5mb3JtYXROb2RlKChJRE9NTm9kZSluZXdOb2RlKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAvL3NldFZpZXdlclNlbGVjdGlvbihsaXN0KTsKLSAgICB9ICAgCi0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1doaXRlc3BhY2VUZXh0Tm9kZShOb2RlIG5vZGUpIAotICAgIHsKLQkgICAgcmV0dXJuIChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKTsKLSAgICB9IAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19ICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkRWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhODkyZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpZGdldHMuTmV3Q29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbGVtZW50QWN0aW9uIGV4dGVuZHMgQmFzZU5vZGVBY3Rpb24gewotCXByb3RlY3RlZCBOb2RlIHBhcmVudE5vZGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXg7Ci0JcHJvdGVjdGVkIFN0cmluZyBub2RlTmFtZTsKLQlwcm90ZWN0ZWQgRWxlbWVudCBuZXdFbGVtZW50OwotCXByb3RlY3RlZCBOb2RlIHJlbGF0aXZlTm9kZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0JcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY29tcHV0ZVRvcExldmVsUmVmQ2hpbGQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZWxlY3ROZXdseUNyZWF0ZWRPYmplY3QgPSB0cnVlOyAvLyBXZSBzaG91bGQgbm90IGJlCi0JCQkJCQkJCQkJCQkJCS8vIHNlbGVjdGluZyB0aGUKLQkJCQkJCQkJCQkJCQkJLy8gb2JqZWN0IGluIHRoZQotCQkJCQkJCQkJCQkJCQkvLyBhY3Rpb24uLi4uLiBUT0RPCi0KLQlwdWJsaWMgQWRkRWxlbWVudEFjdGlvbihTdHJpbmcgdGV4dCwgU3RyaW5nIGltYWdlRGVzY3JpcHRvcktleSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJc2V0VGV4dCh0ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcktleSkpOwotCQl0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOwotCQl0aGlzLm5vZGVOYW1lID0gbm9kZU5hbWU7Ci0JfQotCi0JcHVibGljIEFkZEVsZW1lbnRBY3Rpb24oU3RyaW5nIHRleHQsIFN0cmluZyBpbWFnZURlc2NyaXB0b3JLZXksIE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlzZXRUZXh0KHRleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoV1NETEVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yS2V5KSk7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0JCXRoaXMucHJlZml4ID0gcHJlZml4OwotCQl0aGlzLm5vZGVOYW1lID0gbG9jYWxOYW1lOwotCX0KLQotCXB1YmxpYyBBZGRFbGVtZW50QWN0aW9uKFN0cmluZyB0ZXh0LCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUpIHsKLQkJc2V0VGV4dCh0ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwpOwotCQl0aGlzLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlOwotCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJdGhpcy5ub2RlTmFtZSA9IGxvY2FsTmFtZTsKLQl9Ci0KLQlwdWJsaWMgQWRkRWxlbWVudEFjdGlvbihOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIE5vZGUgcmVsYXRpdmVOb2RlKSB7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0JCXRoaXMucHJlZml4ID0gcHJlZml4OwotCQl0aGlzLm5vZGVOYW1lID0gbG9jYWxOYW1lOwotCQl0aGlzLnJlbGF0aXZlTm9kZSA9IHJlbGF0aXZlTm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wdXRlVG9wTGV2ZWxSZWZDaGlsZChib29sZWFuIGlzRW5hYmxlZCkgewotCQljb21wdXRlVG9wTGV2ZWxSZWZDaGlsZCA9IGlzRW5hYmxlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpIHsKLQkJdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93RGlhbG9nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWJvb2xlYW4gb2sgPSBzaG93RGlhbG9nKCk7Ci0JCWlmIChvaykgewotCQkJYmVnaW5SZWNvcmRpbmcoKTsKLQkJCXBlcmZvcm1BZGRFbGVtZW50KCk7Ci0JCQllbmRSZWNvcmRpbmcoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkgewotCQlpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQluZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChub2RlTmFtZSk7Ci0JCQlhZGRBdHRyaWJ1dGVzKG5ld0VsZW1lbnQpOwotCQkJaWYgKHJlbGF0aXZlTm9kZSA9PSBudWxsICYmIGNvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKSB7Ci0JCQkJcmVsYXRpdmVOb2RlID0gY29tcHV0ZVRvcExldmVsUmVmQ2hpbGQobmV3RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCWlmIChyZWxhdGl2ZU5vZGUgPT0gbnVsbCkgewotCQkJCXBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdFbGVtZW50LCByZWxhdGl2ZU5vZGUpOwotCQkJfQotCQkJLy8gZm9ybWF0KHBhcmVudE5vZGUpOwotCQkJZm9ybWF0KG5ld0VsZW1lbnQpOwotCQkJLy8gVWdseS4uLi4uIFdlIHNob3VsZCBub3QgYmUgc2VsZWN0aW5nIHRoZSBvYmplY3QgaW4gdGhlIGdyYXBoCi0JCQkvLyB2aWV3IGluIHRoZSBBY3Rpb24uCi0JCQkvLyBUaGlzIHNob3VsZCBiZSByZWZhY3RvcmVkIG91dC4gV2UgYWRkIHRoaXMgYm9vbGVhbiBjaGVjawotCQkJLy8gYmVjYXVzZSBXU0RMU2V0VHlwZURpYWxvZy5qYXZhCi0JCQkvLyB1c2VzIEFkZEltcG9ydEFjdGlvbi5qYXZhIGJ1dCB3ZSBzaG91bGQgbm90IGJlIHNlbGVjdGluZyB0aGUKLQkJCS8vIG5ld2x5IGNyZWF0ZWQgaW1wb3J0Li4uLgotCQkJaWYgKHNlbGVjdE5ld2x5Q3JlYXRlZE9iamVjdCkgewotCQkJCXNlbGVjdE9iamVjdEZvck5ld0VsZW1lbnQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIFVnbHkuLi4uLiBXZSBzaG91bGQgbm90IGJlIHNlbGVjdGluZyB0aGUgb2JqZWN0IGluIHRoZSBncmFwaCB2aWV3IGluCi0JLy8gdGhlIEFjdGlvbi4KLQkvLyBUaGlzIHNob3VsZCBiZSByZWZhY3RvcmVkIG91dC4gV2UgYWRkIHRoaXMgYm9vbGVhbiBjaGVjayBiZWNhdXNlCi0JLy8gV1NETFNldFR5cGVEaWFsb2cuamF2YQotCS8vIHVzZXMgQWRkSW1wb3J0QWN0aW9uLmphdmEgYnV0IHdlIHNob3VsZCBub3QgYmUgc2VsZWN0aW5nIHRoZSBuZXdseQotCS8vIGNyZWF0ZWQgaW1wb3J0Li4uLgotCS8vIFdlIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSBjYWxsaW5nIHJ1bigpCi0JcHVibGljIHZvaWQgc2VsZWN0T2JqZWN0Rm9yTmV3RWxlbWVudChib29sZWFuIHNlbGVjdCkgewotCQlzZWxlY3ROZXdseUNyZWF0ZWRPYmplY3QgPSBzZWxlY3Q7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudE5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERCIpOwotCX0KLQotCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgbm9kZU5hbWUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnROb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHByZWZpeCArICI6IiArIG5vZGVOYW1lKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KSB7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXQoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCWlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCS8vIGZvcm1hdCBzZWxlY3RlZCBub2RlCi0JCQlGb3JtYXRQcm9jZXNzb3JYTUwgZm9ybWF0UHJvY2Vzc29yWE1MID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkJZm9ybWF0UHJvY2Vzc29yWE1MLmZvcm1hdE5vZGUoKElET01Ob2RlKSBwYXJlbnROb2RlKTsKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEVsZW1lbnQgZ2V0RGVmaW5pdGlvbkVsZW1lbnQoRWxlbWVudCBwYXJlbnRFbGVtZW50KSB7Ci0JCUVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBudWxsOwotCi0JCWZvciAoTm9kZSBub2RlID0gcGFyZW50RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCQlpZiAoV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShlbGVtZW50KSA9PSBXU0RMQ29uc3RhbnRzLkRFRklOSVRJT04pIHsKLQkJCQkJZGVmaW5pdGlvbkVsZW1lbnQgPSBlbGVtZW50OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmluaXRpb25FbGVtZW50OwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGdldE5ld0VsZW1lbnQoKSB7Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0JCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0T2JqZWN0Rm9yTmV3RWxlbWVudCgpIHsKLQkJaWYgKGVkaXRvclBhcnQgPT0gbnVsbCkgewotCQkJZWRpdG9yUGFydCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCX0KLQkJaWYgKGVkaXRvclBhcnQgIT0gbnVsbCAmJiBkZWZpbml0aW9uICE9IG51bGwpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoZGVmaW5pdGlvbiwgbmV3RWxlbWVudCk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSAoSVNlbGVjdGlvblByb3ZpZGVyKSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0T2JqZWN0KFdTRExFbGVtZW50IG9iamVjdCkgewotCQlpZiAoZWRpdG9yUGFydCA9PSBudWxsKSB7Ci0JCQllZGl0b3JQYXJ0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJfQotCQlpZiAoZWRpdG9yUGFydCAhPSBudWxsICYmIGRlZmluaXRpb24gIT0gbnVsbCkgewotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgZWRpdG9yUGFydC5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iamVjdCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgc2hvd0RpYWxvZ0hlbHBlcihTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSwgTGlzdCB1c2VkTmFtZXMpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IGRlZmF1bHROYW1lOwotCQlOZXdDb21wb25lbnREaWFsb2cgZGlhbG9nID0gbmV3IE5ld0NvbXBvbmVudERpYWxvZyhXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIHRpdGxlLCBkZWZhdWx0TmFtZSwgdXNlZE5hbWVzKTsKLQkJaW50IHJjID0gZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLQkJaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCXJlc3VsdCA9IGRpYWxvZy5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgY29tcHV0ZVRvcExldmVsUmVmQ2hpbGQoTm9kZSBub2RlVG9BZGQpIHsKLQkJTm9kZSByZXN1bHQgPSBudWxsOwotCQlpbnQgYSA9IGdldFByZWNlZGVuY2Uobm9kZVRvQWRkKTsKLQotCQlmb3IgKE5vZGUgbm9kZSA9IHBhcmVudE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlpbnQgYiA9IGdldFByZWNlZGVuY2Uobm9kZSk7Ci0JCQkJaWYgKGIgPiBhKSB7Ci0JCQkJCXJlc3VsdCA9IG5vZGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmluaXRpb25TdHViKCkgewotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIHRoZSBEZWZpbml0aW9ucyBlbGVtZW50IHdpdGggcHJvcGVyIG5hbWVzcGFjZQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQkJCWlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkgewotCQkJCWNoYXJTZXQgPSAiVVRGLTgiOwotCQkJfQotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ4bWwiLCAidmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIGNoYXJTZXQgKyAiXCIiKSk7Ci0JCQlFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ3c2RsOmRlZmluaXRpb25zIik7Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChyb290KTsKLQotCQkJLy8gQWRkIHZhcmlvdXMgbmFtZXNwYWNlIGF0dHJpYnV0ZXMgaGVyZS4KLQkJCXJvb3Quc2V0QXR0cmlidXRlKCJ4bWxuczpzb2FwIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iKTsKLQkJCXJvb3Quc2V0QXR0cmlidXRlKCJ4bWxuczp0bnMiLCBnZXREZWZhdWx0TmFtZXNwYWNlKCkpOwotCQkJcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOndzZGwiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iKTsKLQkJCXJvb3Quc2V0QXR0cmlidXRlKCJ4bWxuczp4c2QiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLQkJCXJvb3Quc2V0QXR0cmlidXRlKCJuYW1lIiwgZ2V0RmlsZU5hbWUoKSk7Ci0JCQlyb290LnNldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgZ2V0RGVmYXVsdE5hbWVzcGFjZSgpKTsKLQotCQkJZGVmaW5pdGlvbi5zZXRFbGVtZW50KHJvb3QpOwotCQkJcGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCQlwcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKCkgewotCQlTdHJpbmcgbmFtZXNwYWNlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QUkVGX1BBR0VfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFIikpOwotCQlpZiAoIW5hbWVzcGFjZS5lbmRzV2l0aCgiLyIpKSB7Ci0JCQluYW1lc3BhY2UgPSBuYW1lc3BhY2UuY29uY2F0KCIvIik7Ci0JCX0KLQotCQluYW1lc3BhY2UgKz0gZ2V0RmlsZU5hbWUoKSArICIvIjsKLQotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlTdHJpbmcgZmlsZUxvY2F0aW9uID0gZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpOwotCQlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGZpbGVMb2NhdGlvbik7Ci0JCXJldHVybiBmaWxlUGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKS50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSGFzaE1hcCBwcmVjZWRlbmNlTWFwID0gY3JlYXRlUHJlY2VkZW5jZU1hcCgpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0UHJlY2VkZW5jZShOb2RlIG5vZGUpIHsKLQkJaW50IHJlc3VsdCA9IDI7Ci0JCVN0cmluZyBsb2NhbE5hbWUgPSBub2RlLmdldExvY2FsTmFtZSgpOwotCQlpZiAobG9jYWxOYW1lICE9IG51bGwpIHsKLQkJCUludGVnZXIgaW50ZWdlciA9IChJbnRlZ2VyKSBwcmVjZWRlbmNlTWFwLmdldChsb2NhbE5hbWUpOwotCQkJaWYgKGludGVnZXIgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGludGVnZXIuaW50VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSGFzaE1hcCBjcmVhdGVQcmVjZWRlbmNlTWFwKCkgewotCQlIYXNoTWFwIGhhc2hNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDEpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5JTVBPUlRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDMpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5UWVBFU19FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoNCkpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDUpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5QT1JUX1RZUEVfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDYpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5CSU5ESU5HX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig3KSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuU0VSVklDRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoOCkpOwotCQlyZXR1cm4gaGFzaE1hcDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkRWxlbWVudERlY2xhcmF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZGVlMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFkZEVsZW1lbnREZWNsYXJhdGlvbkFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotCXByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXg7Ci0JCi0JcHVibGljIEFkZEVsZW1lbnREZWNsYXJhdGlvbkFjdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBzdWdnZXN0ZWRQcmVmaXgpCi0JewotCQl0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJdGhpcy5wcmVmaXggPSBzdWdnZXN0ZWRQcmVmaXg7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpCi0JewotCQlTdHJpbmcgZXhpc3RpbmdQcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChuYW1lc3BhY2UpOwotCQlpZiAoZXhpc3RpbmdQcmVmaXggIT0gbnVsbCkKLQkJewotCQkJcHJlZml4ID0gZXhpc3RpbmdQcmVmaXg7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwcmVmaXggPSBOYW1lVXRpbC5idWlsZFVuaXF1ZVByZWZpeChkZWZpbml0aW9uLCBwcmVmaXgpOwotCQkJRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLQkJCWlmIChkZWZpbml0aW9uRWxlbWVudCAhPSBudWxsKQotCQkJewotCQkJCWRlZmluaXRpb25FbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeCwgbmFtZXNwYWNlKTsKLQkJCX0JCQkKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkKLQl7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRJbXBvcnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkSW1wb3J0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODUzNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRJbXBvcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsgCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEFkZEltcG9ydEFjdGlvbiBleHRlbmRzIEFkZEVsZW1lbnRBY3Rpb24KLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb247Ci0gIHByb3RlY3RlZCBTdHJpbmcgZWxlbWVudERlY2xhcmF0aW9uTmFtZXNwYWNlUHJlZml4OwotCi0gIHB1YmxpYyBBZGRJbXBvcnRBY3Rpb24oSUVkaXRvclBhcnQgcGFydCwgRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgpCi0gIHsKLQl0aGlzKHBhcnQsIGRlZmluaXRpb24sIHBhcmVudE5vZGUsIHByZWZpeCwgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGRJbXBvcnRBY3Rpb24oSUVkaXRvclBhcnQgcGFydCwgRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfSU1QT1JUIiksICJpY29ucy9pbXBvcnRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgImltcG9ydCIpOwotCSAgc2V0RGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLQkgIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotCSAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JICBzZXRFZGl0b3JQYXJ0KHBhcnQpOwotCSAgCi0JICBpZiAocGFydCBpbnN0YW5jZW9mIFdTRExFZGl0b3IpIHsKLQkgIAlkb2N1bWVudCA9ICgoV1NETEVkaXRvcikgcGFydCkuZ2V0WE1MRG9jdW1lbnQoKTsKLQkgIH0KLSAgfQotICAgICAgICAKLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgbm9kZU5hbWUpCi0gIHsKLSAgCWlmIChlbGVtZW50RGVjbGFyYXRpb25OYW1lc3BhY2VQcmVmaXggIT0gbnVsbCAmJiBuYW1lc3BhY2UgIT0gbnVsbCkKLSAgCXsgCi0gICAgCUVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0gICAgCWlmIChkZWZpbml0aW9uRWxlbWVudCAhPSBudWxsKQotICAgIAl7ICAgIAotCSAgCSAgZGVmaW5pdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgZWxlbWVudERlY2xhcmF0aW9uTmFtZXNwYWNlUHJlZml4LCBuYW1lc3BhY2UpOwotICAgIAl9ICAgICAgCQotICAJfQotICAJcmV0dXJuIHN1cGVyLmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnREZWNsYXJhdGlvbk5hbWVzcGFjZVByZWZpeChTdHJpbmcgbnNQcmVmaXgpCi0gIHsKLSAgCXRoaXMuZWxlbWVudERlY2xhcmF0aW9uTmFtZXNwYWNlUHJlZml4ID0gbnNQcmVmaXg7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIsIG5hbWVzcGFjZSAhPSBudWxsID8gbmFtZXNwYWNlIDogIiIpOwotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJsb2NhdGlvbiIsIGxvY2F0aW9uICE9IG51bGwgPyBsb2NhdGlvbiA6ICIiKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkgewotICAJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCB8fCAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkpIHsKLSAgCQljcmVhdGVEZWZpbml0aW9uU3R1YigpOwotICAJfQotICAJCi0gIAlzdXBlci5wZXJmb3JtQWRkRWxlbWVudCgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRNZXNzYWdlVUlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkTWVzc2FnZVVJQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNWI3YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRNZXNzYWdlVUlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkTWVzc2FnZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpZGdldHMuTmV3Q29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRNZXNzYWdlVUlBY3Rpb24gZXh0ZW5kcyBXU0RMRWxlbWVudFVJQWN0aW9uCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFN0cmluZyBuYW1lOwotICBwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIAotICBwdWJsaWMgQWRkTWVzc2FnZVVJQWN0aW9uCi0gIAkoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAKLSAgICAgU3RyaW5nIG5hbWUsIAotICAgICBib29sZWFuIGNyZWF0ZVBhcnQpCi0gIHsKLSAgICBzdXBlcgotICAgIAkobmV3IEFkZE1lc3NhZ2VDb21tYW5kKGRlZmluaXRpb24sbmFtZSxjcmVhdGVQYXJ0KSwgCi0gICAgCSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREIiksIAotICAgIAkgV1NETENvbnN0YW50cy5NRVNTQUdFX0VMRU1FTlRfVEFHLCAKLSAgICAJIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9tZXNzYWdlX29iai5naWYiKSk7Ci0gICAgCi0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0gCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3dEaWFsb2coKQotICB7Ci0JICBuYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShkZWZpbml0aW9uLCBuYW1lKTsKLQkgIG5hbWUgPSBzaG93RGlhbG9nSGVscGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ORVdfTUVTU0FHRSIpLCBuYW1lKTsKLQkgIHJldHVybiBuYW1lICE9IG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgc2hvd0RpYWxvZ0hlbHBlcihTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSkKLSAgeyAgIAotICAgIFN0cmluZyByZXN1bHQgPSBkZWZhdWx0TmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBOZXdDb21wb25lbnREaWFsb2cgZGlhbG9nID0gbmV3IE5ld0NvbXBvbmVudERpYWxvZyhXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIHRpdGxlLCBkZWZhdWx0TmFtZSk7Ci0gICAgaW50IHJjID0gZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLSAgICBpZiAocmMgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBkaWFsb2cuZ2V0TmFtZSgpOyAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBudWxsOwotICAgIH0gICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotICAKLSAgcHJvdGVjdGVkIHZvaWQgcHJlUnVuKCkKLSAgewotICAgICgoQWRkTWVzc2FnZUNvbW1hbmQpc3VwZXIubW9kZWxBY3Rpb24pLnNldExvY2FsTmFtZShuYW1lKTsKLSAgfQotCi0gIHByb3RlY3RlZCBXU0RMRWxlbWVudCBnZXRPd25lcigpCi0gIHsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZE5hbWVzcGFjZURlY2xhcmF0aW9uc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM1MmUzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZE5hbWVzcGFjZURlY2xhcmF0aW9uc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLXB1YmxpYyBjbGFzcyBBZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIEVsZW1lbnQgb3duZXJFbGVtZW50OwotICBwcm90ZWN0ZWQgU3RyaW5nW10gbmFtZXNwYWNlTmFtZXM7Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBwcmVmZXJyZWRQcmVmaXhlczsKLQotICBwdWJsaWMgQWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zQWN0aW9uKEVsZW1lbnQgb3duZXJFbGVtZW50LCBTdHJpbmdbXSBuYW1lc3BhY2VOYW1lcywgU3RyaW5nW10gcHJlZmVycmVkUHJlZml4ZXMpCi0gIHsKLSAgICB0aGlzLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDsKLSAgICB0aGlzLm5hbWVzcGFjZU5hbWVzID0gbmFtZXNwYWNlTmFtZXM7Ci0gICAgdGhpcy5wcmVmZXJyZWRQcmVmaXhlcyA9IHByZWZlcnJlZFByZWZpeGVzOwotICB9Ci0KLSAgcHVibGljIEFkZE5hbWVzcGFjZURlY2xhcmF0aW9uc0FjdGlvbihFbGVtZW50IG93bmVyRWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZU5hbWUsIFN0cmluZyBwcmVmZXJyZWRQcmVmaXgpCi0gIHsKLSAgICB0aGlzLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDsKLSAgICBuYW1lc3BhY2VOYW1lcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgbmFtZXNwYWNlTmFtZXNbMF0gPSBuYW1lc3BhY2VOYW1lOwotCi0gICAgcHJlZmVycmVkUHJlZml4ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgIHByZWZlcnJlZFByZWZpeGVzWzBdID0gcHJlZmVycmVkUHJlZml4OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGlmIChvd25lckVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBOYW1lZE5vZGVNYXAgbWFwID0gb3duZXJFbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIEhhc2h0YWJsZSBwcmVmaXhUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0cmlidXRlID0gKEF0dHIpIG1hcC5pdGVtKGkpOwotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLnN0YXJ0c1dpdGgoInhtbG5zOiIpKQotICAgICAgICB7Ci0gICAgICAgICAgdGFibGUucHV0KGF0dHJpYnV0ZS5nZXRWYWx1ZSgpLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgIHByZWZpeFRhYmxlLnB1dChhdHRyaWJ1dGVOYW1lLnN1YnN0cmluZyg2KSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscygieG1sbnMiKSkKLSAgICAgICAgewotICAgICAgICAgIHRhYmxlLnB1dChhdHRyaWJ1dGUuZ2V0VmFsdWUoKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICBwcmVmaXhUYWJsZS5wdXQoIiIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VOYW1lcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IG5hbWVzcGFjZU5hbWVzW2ldOwotICAgICAgICBpZiAodGFibGUuZ2V0KG5hbWVzcGFjZSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoaSA8IHByZWZlcnJlZFByZWZpeGVzLmxlbmd0aCkgPyBwcmVmZXJyZWRQcmVmaXhlc1tpXSA6ICJwMCI7Ci0gICAgICAgICAgaWYgKHByZWZpeFRhYmxlLmdldChwcmVmaXgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJlZml4ID0gY29tcHV0ZVVuaXF1ZVByZWZpeCgicCIsIHByZWZpeFRhYmxlKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IHByZWZpeC5sZW5ndGgoKSA+IDAgPyAieG1sbnM6IiArIHByZWZpeCA6ICJ4bWxucyI7Ci0gICAgICAgICAgb3duZXJFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBuYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlVW5pcXVlUHJlZml4KFN0cmluZyBiYXNlLCBIYXNodGFibGUgdGFibGUpCi0gIHsKLSAgICBpbnQgaSA9IDA7Ci0gICAgU3RyaW5nIHByZWZpeCA9IGJhc2U7Ci0gICAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgaWYgKHRhYmxlLmdldChwcmVmaXgpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcmVmaXggPSBiYXNlICsgaTsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkV1NJU2NoZW1hSW1wb3J0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZWE1OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBBZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24gZXh0ZW5kcyBCYXNlTm9kZUFjdGlvbgotewotICAgIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnREZWNsYXJhdGlvbk5hbWVzcGFjZVByZWZpeDsKLQotICAgIHB1YmxpYyBBZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pCi0gICAgewotICAgICAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgICAgICBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWZpbml0aW9uRWxlbWVudDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKQotICAgIHsKLSAgICAJcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfSU1QT1JUIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0T3JDcmVhdGVUeXBlc0VsZW1lbnQoKQotICAgIHsKLSAgICAgICAgRWxlbWVudCB0eXBlc0VsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoZGVmaW5pdGlvbi5nZXRUeXBlcygpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9uRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkZEVsZW1lbnRBY3Rpb24gYWRkVHlwZXNBY3Rpb24gPSBuZXcgQWRkRWxlbWVudEFjdGlvbigiIiwgImljb25zL3hzZF9vYmouZ2lmIiwgZGVmaW5pdGlvbkVsZW1lbnQsIGRlZmluaXRpb25FbGVtZW50LmdldFByZWZpeCgpLCAidHlwZXMiKTsKLSAgICAgICAgICAgICAgICBhZGRUeXBlc0FjdGlvbi5zZXRDb21wdXRlVG9wTGV2ZWxSZWZDaGlsZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBhZGRUeXBlc0FjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAgICB0eXBlc0VsZW1lbnQgPSBhZGRUeXBlc0FjdGlvbi5nZXROZXdFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0KHR5cGVzRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlc0VsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbi5nZXRUeXBlcygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZXNFbGVtZW50OwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRJbXBvcnRIb2xkZXJFbGVtZW50KEVsZW1lbnQgdHlwZXNFbGVtZW50KSB7Ci0gICAgCUVsZW1lbnQgaW1wb3J0SG9sZGVyRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gdHlwZXNFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLSAgICAgICAgICAgICAgICBpZiAoInNjaGVtYSIuZXF1YWxzKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0SG9sZGVyRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGltcG9ydEhvbGRlckVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0T3JDcmVhdGVJbXBvcnRIb2xkZXJFbGVtZW50KEVsZW1lbnQgdHlwZXNFbGVtZW50KQotICAgIHsKLSAgICAgICAgRWxlbWVudCBpbXBvcnRIb2xkZXJFbGVtZW50ID0gZ2V0SW1wb3J0SG9sZGVyRWxlbWVudCh0eXBlc0VsZW1lbnQpOwotICAgICAgICBpZiAoaW1wb3J0SG9sZGVyRWxlbWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGRFbGVtZW50QWN0aW9uIGFkZEltcG9ydEhvbGRlckFjdGlvbiA9IG5ldyBBZGRFbGVtZW50QWN0aW9uKCIiLCAiaWNvbnMveHNkX29iai5naWYiLCB0eXBlc0VsZW1lbnQsICJ4c2QiLCAic2NoZW1hIikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczp4c2QiLCBXU0RMQ29uc3RhbnRzLlhTRF9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgYWRkSW1wb3J0SG9sZGVyQWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgaW1wb3J0SG9sZGVyRWxlbWVudCA9IGFkZEltcG9ydEhvbGRlckFjdGlvbi5nZXROZXdFbGVtZW50KCk7Ci0gICAgICAgICAgICBmb3JtYXQoaW1wb3J0SG9sZGVyRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGltcG9ydEhvbGRlckVsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gYWRkIHRoZSBpbXBvcnQgaWYgaXQncyBhbHJlYWR5IHRoZXJlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0Tm90QWxyZWFkeUV4aXN0cygpIHsKLSAgICAJYm9vbGVhbiBub3RFeGlzdHMgPSB0cnVlOwotICAgIAkKLSAgICAJaWYgKGRlZmluaXRpb24uZ2V0VHlwZXMoKSAhPSBudWxsKSB7Ci0gICAgCQlFbGVtZW50IHR5cGVzRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uLmdldFR5cGVzKCkpOwotICAgIAkJRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gZ2V0SW1wb3J0SG9sZGVyRWxlbWVudCh0eXBlc0VsZW1lbnQpOwotCi0gICAgCQlpZiAoc2NoZW1hRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgCQkJLy8gQ29sbGVjdCBjaGlsZHJlbgotICAgIAkJCU5vZGUgbm9kZSA9IHNjaGVtYUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgIAkJCWphdmEudXRpbC5WZWN0b3Igc2NoZW1hQ2hpbGRyZW4gPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgIAkJCWlmIChub2RlICE9IG51bGwpIHsKLSAgICAJCQkJTm9kZSBjaGlsZCA9IG5vZGU7Ci0JCQkJCQotICAgIAkJCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UZXh0SW1wbCkpIHsKLSAgICAJCQkJCXNjaGVtYUNoaWxkcmVuLmFkZEVsZW1lbnQoY2hpbGQpOwotICAgIAkJCQl9Ci0JCQkJCQotICAgIAkJCQl3aGlsZSAoY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKSB7Ci0gICAgCQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgCQkJCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UZXh0SW1wbCkpIHsKLSAgICAJCQkJCQlzY2hlbWFDaGlsZHJlbi5hZGRFbGVtZW50KGNoaWxkKTsKLSAgICAJCQkJCX0KLSAgICAJCQkJfQotCi0gICAgCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzY2hlbWFDaGlsZHJlbi5zaXplKCk7IGluZGV4KyspIHsKLSAgICAJCQkJCUVsZW1lbnQgc2NoZW1hQ2hpbGQgPSAoRWxlbWVudCkgc2NoZW1hQ2hpbGRyZW4uZWxlbWVudEF0KGluZGV4KTsKLSAgICAJCQkJCVN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IHNjaGVtYUNoaWxkLmdldEF0dHJpYnV0ZSgic2NoZW1hTG9jYXRpb24iKTsKLSAgICAJCQkJCVN0cmluZyBzY2hlbWFOYW1lc3BhY2UgPSBzY2hlbWFDaGlsZC5nZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIpOwotCQkJCQotICAgIAkJCQkJaWYgKHNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgbmFtZXNwYWNlICE9IG51bGwgJiYKLSAgICAJCQkJCQkJc2NoZW1hTG9jYXRpb24uZXF1YWxzKGxvY2F0aW9uKSAmJiBzY2hlbWFOYW1lc3BhY2UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAJCQkJCQlub3RFeGlzdHMgPSBmYWxzZTsKLSAgICAJCQkJCQlicmVhazsKLSAgICAJCQkJCX0KLSAgICAJCQkJfQotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgIAkKLSAgICAJcmV0dXJuIG5vdEV4aXN0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgICAgaWYgKGRlZmluaXRpb25FbGVtZW50ICE9IG51bGwgJiYgaW1wb3J0Tm90QWxyZWFkeUV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBiZWdpblJlY29yZGluZygpOwotICAgICAgICAgICAgcGVyZm9ybUFkZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGVuZFJlY29yZGluZygpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IHR5cGVzRWxlbWVudCA9IGdldE9yQ3JlYXRlVHlwZXNFbGVtZW50KCk7Ci0gICAgICAgICAgICBFbGVtZW50IGltcG9ydEhvbGRlckVsZW1lbnQgPSBnZXRPckNyZWF0ZUltcG9ydEhvbGRlckVsZW1lbnQodHlwZXNFbGVtZW50KTsKLQotICAgICAgICAgICAgQWRkRWxlbWVudEFjdGlvbiBhZGRJbXBvcnRBY3Rpb24gPSBuZXcgQWRkRWxlbWVudEFjdGlvbigiIiwgImljb25zL3hzZF9vYmouZ2lmIiwgaW1wb3J0SG9sZGVyRWxlbWVudCwgaW1wb3J0SG9sZGVyRWxlbWVudC5nZXRQcmVmaXgoKSwgImltcG9ydCIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIiwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIiwgbG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBhZGRJbXBvcnRBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBhZGRJbXBvcnRBY3Rpb24uZ2V0TmV3RWxlbWVudCgpOwotICAgICAgICAgICAgZm9ybWF0KG5ld0VsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudERlY2xhcmF0aW9uTmFtZXNwYWNlUHJlZml4KFN0cmluZyBuc1ByZWZpeCkKLSAgICB7Ci0gICAgICAgIHRoaXMuZWxlbWVudERlY2xhcmF0aW9uTmFtZXNwYWNlUHJlZml4ID0gbnNQcmVmaXg7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGZvcm1hdChOb2RlIHBhcmVudE5vZGUpCi0gICAgewotICAgICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIEZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3JYTUwgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICAgICAgICBmb3JtYXRQcm9jZXNzb3JYTUwuZm9ybWF0Tm9kZSgoSURPTU5vZGUpcGFyZW50Tm9kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDFlMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYXNlTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOyAKLSAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTm9kZUFjdGlvbiBleHRlbmRzIEFjdGlvbgoteyAKLSAgcHVibGljIGFic3RyYWN0IE5vZGUgZ2V0Tm9kZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpOwotCi0gIHB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKCkKLSAgeyAgICAKLSAgICBOb2RlIG5vZGUgPSBnZXROb2RlKCk7ICAKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRVbmRvRGVzY3JpcHRpb24oKSk7ICAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoKQotICB7ICAgICAgICAgICAgICAgICAKLSAgICBOb2RlIG5vZGUgPSBnZXROb2RlKCk7IAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsgIAotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQ29weUdsb2JhbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db3B5R2xvYmFsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDVmZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db3B5R2xvYmFsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQ29weUdsb2JhbEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0gIAlwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvcjsKLSAgCXByaXZhdGUgV1NETEVsZW1lbnQgc2VsZWN0aW9uOwotICAJCi0gIAlwdWJsaWMgQ29weUdsb2JhbEFjdGlvbihXU0RMRWxlbWVudCBzZWxlY3Rpb24sIElFZGl0b3JQYXJ0IGVkaXRvcikgewotICAJCXNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0NPUFkiKSk7Ci0gIAkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIAkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0gIAkJc2V0RW5hYmxlZFN0YXRlKCk7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgV1NETEVkaXRvcikgewotICAJCQkoKFdTRExFZGl0b3IpIGVkaXRvcikuc2V0Q2xpcGJvYXJkQ29udGVudHMoc2VsZWN0aW9uKTsKLSAgCQkJCi0gIAkJCSgoV1NETEVkaXRvcikgZWRpdG9yKS5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotICAJCX0KLSAgCX0KLSAgCQotICAJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKFdTRExFbGVtZW50IG5ld1NlbGVjdGlvbikgewotICAJCXNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLSAgCQlzZXRFbmFibGVkU3RhdGUoKTsKLSAgCX0KLSAgCQotICAJcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlZFN0YXRlKCkgewotICAJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgCQkJc2V0RW5hYmxlZCh0cnVlKTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkgIAkJc2V0RW5hYmxlZChmYWxzZSk7Ci0gIAkJfQotICAJfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db3B5V1NETEVsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQ29weVdTRExFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZTdmOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db3B5V1NETEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRPcGVyYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLldTRExFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5XU0RMVHJlZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoKLSAqIENsYXNzIHdoaWNoIGNvcGllcyBhIFdTRExFbGVtZW50IGFuZCBpdCdzICdjaGlsZHJlbicgZWxlbWVudHMuCi0gKiBGb3IgZXhhbXBsZSwgYSBjb3B5IGNvbW1hbmQgb24gYSBPcGVyYXRpb24gd2lsbCByZXN1bHQgaW4gYSBjb3B5Ci0gKiBvZiB0aGUgb3BlcmF0aW9uIGFuZCBpdCdzIGlucHV0L291dHB1dC9mYXVsdHMsIGFuZCBpdCdzIG1lc3NhZ2UKLSAqIGFuZCBwYXJ0cy4KLSAqLwotcHVibGljIGNsYXNzIENvcHlXU0RMRWxlbWVudEFjdGlvbiBleHRlbmRzIFdTRExEcmFnQWN0aW9uIHsKLQlXU0RMRWxlbWVudCBlbGVtZW50LCBwYXJlbnQ7Ci0JTm9kZSBwYXJlbnROb2RlOwotCVdTRExFbGVtZW50Q29tbWFuZCB3c2RsRWxlbWVudENvbW1hbmQ7Ci0JRWRpdFBhcnRWaWV3ZXIgZWRpdFBhcnRWaWV3ZXI7Ci0JCi0JLyoKLQkgKiAgZWxlbWVudCA9IFRoZSBXU0RMRWxlbWVudCBiZWluZyBjb3BpZWQKLQkgKiAgcGFyZW50ID0gVGhlIFBhcmVudCBvZiB0aGUgJ25ldycgV1NETEVsZW1lbnQKLQkgKiAgcGFyZW50Tm9kZSA9IEVsZW1lbnRJbXBsIChmb3IgdW5kbykKLQkgKi8JCi0JcHVibGljIENvcHlXU0RMRWxlbWVudEFjdGlvbihFZGl0UGFydFZpZXdlciBlZGl0UGFydFZpZXdlciwgV1NETEVsZW1lbnQgZWxlbWVudCwgV1NETEVsZW1lbnQgcGFyZW50LCBOb2RlIHBhcmVudE5vZGUpIHsKLQkJc2V0VGV4dCgiQ29weSBXU0RMRWxlbWVudCIpOyAgLy8gRG8gbm90IFRyYW5zbGF0ZSBUaGlzCi0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CQotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLQkJdGhpcy5lZGl0UGFydFZpZXdlciA9IGVkaXRQYXJ0Vmlld2VyOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbil7Ci0JCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBQb3J0VHlwZSkgewotCQkJCVBvcnRUeXBlIHB0ID0gKFBvcnRUeXBlKSBwYXJlbnQ7Ci0JCQkJT3BlcmF0aW9uIG9wID0gKE9wZXJhdGlvbikgZWxlbWVudDsKLQkJCQl3c2RsRWxlbWVudENvbW1hbmQgID0gbmV3IEFkZE9wZXJhdGlvbkNvbW1hbmQocHQsIG9wLCBOYW1lVXRpbC5idWlsZFVuaXF1ZU9wZXJhdGlvbk5hbWUocHQsIG9wLmdldE5hbWUoKSksIHRydWUpOwkJCi0JCQl9Ci0JCX0KLQkJLyoKLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2VSZWZlcmVuY2UpIHsKLQkKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSW5wdXQpIHsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPdXRwdXQpIHsKLQkJCQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGYXVsdCkgewotCQkJCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2UpIHsKLQkJCQotCQl9Ci0JCSovCi0JCQotCQlpZiAod3NkbEVsZW1lbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHdzZGxFbGVtZW50Q29tbWFuZCA9PSBudWxsKSB7Ci0JCQlpZiAoY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJcnVuQ29tbWFuZCgpOwotCQkJfQotCQl9Ci0JCSBlbHNlIHsKLQkJIAlydW5Db21tYW5kKCk7Ci0JCSB9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBydW5Db21tYW5kKCkgewotCSAJdGhpcy5iZWdpblJlY29yZGluZygpOwotCQl3c2RsRWxlbWVudENvbW1hbmQucnVuKCk7Ci0JCXNlbGVjdFdTRExFbGVtZW50KHdzZGxFbGVtZW50Q29tbWFuZC5nZXRXU0RMRWxlbWVudCgpKTsKLQkJdGhpcy5lbmRSZWNvcmRpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdFdTRExFbGVtZW50KFdTRExFbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gU2VsZWN0IHRoZSBuZXdseSBjcmVhdGVkIGVsZW1lbnQKLQkgICAgLy8gRXhwYW5kIGFsbCB0aGUgYXNzb2NpYXRlZCBlbGVtZW50cyAnYmVsb3cnIHRoZSBnaXZlbiBlbGVtZW50Ci0JICAgIE1hcCBlZGl0UGFydE1hcCA9IGVkaXRQYXJ0Vmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKTsKLQkgICAgV1NETFRyZWVOb2RlRWRpdFBhcnQgd3NkbEVkaXRQYXJ0ID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBlZGl0UGFydE1hcC5nZXQoZWxlbWVudCk7Ci0JICAgIGlmICh3c2RsRWRpdFBhcnQgIT0gbnVsbCkgewotCSAgICAJZWRpdFBhcnRWaWV3ZXIuc2VsZWN0KHdzZGxFZGl0UGFydCk7Ci0JCSAgICBleHBhbmRFZGl0UGFydHMoZWxlbWVudCwgdHJ1ZSk7Ci0JICAgIH0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZEVkaXRQYXJ0cyhPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBleHBhbmRDaGlsZHJlbikgewotCSAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JICAgIAlNYXAgZWRpdFBhcnRNYXAgPSBlZGl0UGFydFZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCk7Ci0JICAgIAlXU0RMVHJlZU5vZGVFZGl0UGFydCB3c2RsRWRpdFBhcnQgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIGVkaXRQYXJ0TWFwLmdldChlbGVtZW50KTsKLQkJCXdzZGxFZGl0UGFydC5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCQotCQkJaWYgKGV4cGFuZENoaWxkcmVuKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBXU0RMRWRpdG9yVXRpbC5nZXRNb2RlbEdyYXBoVmlld0NoaWxkcmVuKGVsZW1lbnQpLml0ZXJhdG9yKCk7Ci0JCQkJCi0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlleHBhbmRFZGl0UGFydHMoaXRlcmF0b3IubmV4dCgpLCBleHBhbmRDaGlsZHJlbik7Ci0JCQkJfQotCQkJfQotCSAgICB9Ci0JfQotCQotCS8vIEluaGVyaXRlZCBjbGFzc2VzIGZyb20gQmFzZU5vZGVBY3Rpb24KLQkgIHB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JICAJcmV0dXJuIHBhcmVudE5vZGU7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCSAgCXJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQ09QWSIpOwotCSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlRG9jQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlRG9jQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0YjljNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZURvY0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3Rm9sZGVyTWFpblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZURvY0FjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUKLXsKLSAgcHJvdGVjdGVkIElGaWxlIGlGaWxlOwotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLQotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMRURJVE9SX0RPQ0dFTl9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZG9jZ2VuIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBWQUxJREFURV9XU0RMX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGUud3NkbCI7IC8vJE5PTi1OTFMtMSQKLQotICBwcm90ZWN0ZWQgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IG51bGw7Ci0KLSAgcHVibGljIENyZWF0ZURvY0FjdGlvbkRlbGVnYXRlKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RmlsZShJRmlsZSBpRmlsZSkKLSAgewotICAgIHRoaXMuaUZpbGUgPSBpRmlsZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvclBhcnQoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0gIHsKLS8vIFRPRE86IFVuY29tbWVudCB3aGVuIHZhbGlkYXRpb24gaXMgY2hlY2tlZCBpbnRvIGNvcm9uYSAgICAKLS8vICAgIElTaGFyZWRTZXJ2aWNlIHZhbGlkYXRlU2hhcmVkU2VydmljZSA9IEV4dGVuc2lvblBsdWdpbi5nZXRTaGFyZWRTZXJ2aWNlKCJWYWxpZGF0ZVdTRExTaGFyZWRTZXJ2aWNlIik7IC8vJE5PTi1OTFMtMSQKLS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbih2YWxpZGF0ZVNoYXJlZFNlcnZpY2UpOwotLy8gICAgaWYgKHZhbGlkYXRlU2hhcmVkU2VydmljZSAhPSBudWxsKQotLy8gICAgewotLy8gICAgICB0cnkKLS8vICAgICAgewotLy8gICAgICAgIEJvb2xlYW4gcmMgPSAoQm9vbGVhbikgdmFsaWRhdGVTaGFyZWRTZXJ2aWNlLnJ1bihpRmlsZSk7Ci0vLyAgICAgICAgaWYgKHJjLmJvb2xlYW5WYWx1ZSgpKQotLy8gICAgICAgIHsKLSAgICAgICAgICBOZXdXU0RMRG9jRm9sZGVyV2l6YXJkIHdpeiA9IG5ldyBOZXdXU0RMRG9jRm9sZGVyV2l6YXJkKCk7Ci0gICAgICAgICAgTmV3V1NETERvY0RpYWxvZyBkbGcgPSBuZXcgTmV3V1NETERvY0RpYWxvZyhXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIHdpeik7Ci0gICAgICAgICAgZGxnLm9wZW4oKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0VSUk9SX0lOVkFMSURfV1NETCIpLCAvLyROT04tTkxTLTEkCi0vLyAgICAgICAgICBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9JTlZBTElEX1dTRExfREVTQyIpKTsgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0vLyAgICAgIHsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCAiRXJyb3IiLCAvLyROT04tTkxTLTEkCi0vLyAgICAgICJDYW5ub3QgZmluZCB2YWxpZGF0b3IiKTsgLy8kTk9OLU5MUy0xJAotLy8gICAgfQotICB9Ci0KLSAgY2xhc3MgR2VuSFRNTE9wZXJhdGlvbiBleHRlbmRzIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbgotICB7Ci0gICAgSUZpbGUgaUZpbGU7Ci0gICAgU3RyaW5nIG91dHB1dExvY2F0aW9uOwotICAgIHB1YmxpYyBHZW5IVE1MT3BlcmF0aW9uKElGaWxlIGlGaWxlKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICB0aGlzLmlGaWxlID0gaUZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0TG9jYXRpb24oU3RyaW5nIG91dHB1dExvY2F0aW9uKQotICAgIHsKLSAgICAgIHRoaXMub3V0cHV0TG9jYXRpb24gPSBvdXRwdXRMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgCS8qCi0gICAgICBtb25pdG9yLmJlZ2luVGFzayhXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9DUkVBVElOR19IVE1MX0ZJTEVTIiksIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIFdTRExEb2MgZG9jID0gbmV3IFdTRExEb2MobmV3IFdTRExEb2NGaWxlV3JpdGVyKCkpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUGx1Z2luIHBsdWdpbiA9IFBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZG9jZ2VuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSVBhdGggaW5zdGFsbFBhdGggPSBuZXcgUGF0aChwbHVnaW4uZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKS50b0V4dGVybmFsRm9ybSgpKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotICAgICAgICBTdHJpbmcgaW5zdGFsbFN0ciA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChpbnN0YWxsUGF0aC50b1N0cmluZygpKSkuZ2V0RmlsZSgpOwotICAgICAgICBQYXRoIGRvY2dlblBhdGggPSBuZXcgUGF0aChpbnN0YWxsU3RyKTsKLQotICAgICAgICBkb2Muc2V0VGVtcGxhdGVMb2NhdGlvbihkb2NnZW5QYXRoLnRvT1NTdHJpbmcoKSArICJ0ZW1wbGF0ZSIgKyBGaWxlLnNlcGFyYXRvcik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZG9jLnNldE9wdGlvbnMoaUZpbGUuZ2V0UmF3TG9jYXRpb24oKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9PU1N0cmluZygpLCBvdXRwdXRMb2NhdGlvbiwgIiIpOwotCi0gICAgICAgIGRvYy5hZGRGaWxlKGlGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIGRvYy5kb0J1aWxkU3RlcCgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOyAKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICB9Ci0gICAgICAqLwotICAgIH0KLSAgfQotCi0gIGNsYXNzIFdTRExEb2NOZXdGb2xkZXJNYWluUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZvbGRlck1haW5QYWdlCi0gIHsKLSAgICBwdWJsaWMgV1NETERvY05ld0ZvbGRlck1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkKLSAgICB7Ci0gICAgICBzdXBlcihwYWdlTmFtZSwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaUZpbGUpKTsKLSAgICAgIHNldERlc2NyaXB0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0NSRUFURV9GT0xERVJfRk9SX0RPQ1MiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBOZXdXU0RMRG9jRm9sZGVyV2l6YXJkIGV4dGVuZHMgV2l6YXJkCi0gIHsKLSAgICBJRm9sZGVyIGZvbGRlcjsKLQotICAgIHByaXZhdGUgV1NETERvY05ld0ZvbGRlck1haW5QYWdlIG5ld0ZvbGRlclBhZ2U7Ci0KLSAgICBwdWJsaWMgTmV3V1NETERvY0ZvbGRlcldpemFyZCgpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIHNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICAgIHsKLSAgICAgIGZvbGRlciA9IG5ld0ZvbGRlclBhZ2UuY3JlYXRlTmV3Rm9sZGVyKCk7Ci0gICAgICBpZiAoZm9sZGVyID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKFdTRExFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfRVJST1IiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9GT0xERVJfTk9UX0NSRUFURUQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBHZW5IVE1MT3BlcmF0aW9uIG9wID0gbmV3IEdlbkhUTUxPcGVyYXRpb24oaUZpbGUpOwotICAgICAgb3Auc2V0T3V0cHV0TG9jYXRpb24oZm9sZGVyLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIG9wLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLSAgICAgICAgLy8gcmVmcmVzaCBmb2xkZXIgYW5kIG9wZW4gaW5kZXguaHRtbCBpbiB3ZWIgYnJvd3NlcgotICAgICAgICBmb2xkZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0gICAgICAgIFN0cmluZyBpbmRleEh0bWxGaWxlID0gZm9sZGVyLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IgKyAiaW5kZXguaHRtbCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSUZpbGUgaW5kZXhIdG1sSUZpbGUgPSBnZXRXb3Jrc3BhY2VGaWxlRnJvbUxvY2FsTG9jYXRpb24oaW5kZXhIdG1sRmlsZSk7Ci0gICAgICAgIGlmIChpbmRleEh0bWxJRmlsZSAhPSBudWxsICYmIGluZGV4SHRtbElGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV2ZWFsU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGluZGV4SHRtbElGaWxlKSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgb3BlbkVkaXRvcihpbmRleEh0bWxJRmlsZSwgIm9yZy5lY2xpcHNlLndlYmJyb3dzZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0VSUk9SX0VSUk9SIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9DUkVBVElOR19IVE1MX0ZJTEVTIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgICAvLyAgICAgICAgY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmV2ZWFsU2VsZWN0aW9uKGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIGZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICBmaW5hbCBJV29ya2JlbmNoUGFydCBmb2N1c1BhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsKLSAgICAgICAgaWYgKGZvY3VzUGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpCi0gICAgICAgIHsKLSAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMKLSAgICAgICAgICAobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKChJU2V0U2VsZWN0aW9uVGFyZ2V0KWZvY3VzUGFydCkuc2VsZWN0UmV2ZWFsKHNlbGVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBpRmlsZSwgZmluYWwgU3RyaW5nIGVkaXRvcklkKQotICAgIHsKLSAgICAgIGlmIChpRmlsZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0KLSAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjCi0gICAgICAgIChuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgewotICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGlGaWxlKSwgZWRpdG9ySWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIEIyQkdVSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRXhjZXB0aW9uIGVuY291bnRlcmVkIHdoZW4gYXR0ZW1wdGluZyB0byBvcGVuIGZpbGU6ICIgKyBpRmlsZSArICJcblxuIiArIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSUZpbGUgZ2V0V29ya3NwYWNlRmlsZUZyb21Mb2NhbExvY2F0aW9uKFN0cmluZyBmaWxlTmFtZSkKLSAgICB7Ci0gICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgIGlmICh3b3Jrc3BhY2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSUZpbGUgaUZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlTmFtZSkpOwotICAgICAgICBpZiAoaUZpbGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBpRmlsZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkKLSAgICB7Ci0gICAgICBuZXdGb2xkZXJQYWdlID0gbmV3IFdTRExEb2NOZXdGb2xkZXJNYWluUGFnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9ORVdfRk9MREVSIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBhZGRQYWdlKG5ld0ZvbGRlclBhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpCi0gICAgewotICAgICAgaWYgKG5ld0ZvbGRlclBhZ2UuaXNQYWdlQ29tcGxldGUoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIElGb2xkZXIgZ2V0Rm9sZGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZm9sZGVyOwotICAgIH0KLSAgfQotCi0gIGNsYXNzIE5ld1dTRExEb2NEaWFsb2cgZXh0ZW5kcyBXaXphcmREaWFsb2cKLSAgewotICAgIHB1YmxpYyBOZXdXU0RMRG9jRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJV2l6YXJkIG5ld1dpemFyZCkKLSAgICB7Ci0gICAgICBzdXBlcihwYXJlbnRTaGVsbCwgbmV3V2l6YXJkKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikKLSAgewotICAgIGVkaXRvclBhcnQgPSB0YXJnZXRFZGl0b3I7Ci0gICAgaUZpbGUgPSBudWxsOwotICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gdGFyZ2V0RWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICBpRmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldEZpbGUoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQzODY4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlQWN0aW9uIGV4dGVuZHMgQmFzZU5vZGVBY3Rpb24gewotCSBwcm90ZWN0ZWQgTGlzdCBsaXN0OwotCSBwcm90ZWN0ZWQgU3RyaW5nIGRlbGV0ZVN0cmluZyA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKSArICIgIjsgLy8kTk9OLU5MUy0xJAotLy8JIHByaXZhdGUgT2JqZWN0IG9iamVjdDsKLS8vCSBwcml2YXRlIE5vZGUgbm9kZTsKLQkKLQlwdWJsaWMgRGVsZXRlQWN0aW9uKE9iamVjdCBvYmplY3QsIE5vZGUgbm9kZSkgewotCQlzZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKSk7ICAvLyROT04tTkxTLTEkCi0JICAgIGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JICAgIGxpc3QuYWRkKG9iamVjdCk7Ci0JfQotCQotCXB1YmxpYyBEZWxldGVBY3Rpb24oTGlzdCBkZWxldGVMaXN0KSB7Ci0JCXNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURSIpKTsgIC8vJE5PTi1OTFMtMSQKLQkgICAgbGlzdCA9IGRlbGV0ZUxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3IgZ2V0UmVmZXJlbmNlZE1lc3NhZ2VzKE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJVmVjdG9yIG1lc3NhZ2VzID0gbmV3IFZlY3RvcigpOwotCQltZXNzYWdlcy5hZGRBbGwoZ2V0TWVzc2FnZXMob3BlcmF0aW9uLmdldEVGYXVsdHMoKSkpOwotCQkKLQkJaWYgKG9wZXJhdGlvbi5nZXRFSW5wdXQoKSAhPSBudWxsICYmIG9wZXJhdGlvbi5nZXRFSW5wdXQoKS5nZXRFTWVzc2FnZSgpICE9IG51bGwpCi0JCQltZXNzYWdlcy5hZGRFbGVtZW50KG9wZXJhdGlvbi5nZXRFSW5wdXQoKS5nZXRFTWVzc2FnZSgpKTsKLQkJaWYgKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkgIT0gbnVsbCAmJiBvcGVyYXRpb24uZ2V0RU91dHB1dCgpLmdldEVNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCW1lc3NhZ2VzLmFkZEVsZW1lbnQob3BlcmF0aW9uLmdldEVPdXRwdXQoKS5nZXRFTWVzc2FnZSgpKTsKLQkJCi0JCXJldHVybiBtZXNzYWdlczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyBXZSB3YW50IHRvIGRlbGV0ZSBPcGVyYXRpb25zIGZpcnN0LiAgU28gd2UgbmVlZCB0byBzb3J0IHRoZSBsaXN0Ci0JCUxpc3Qgc29ydGVkTGlzdCA9IG5ldyBBcnJheUxpc3QobGlzdC5zaXplKCkpOwotCQlJdGVyYXRvciBsaXN0SXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQotCQl3aGlsZSAobGlzdEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHVuc29ydGVkT2JqZWN0ID0gbGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh1bnNvcnRlZE9iamVjdCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotCQkJCXNvcnRlZExpc3QuYWRkKDAsIHVuc29ydGVkT2JqZWN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvcnRlZExpc3QuYWRkKHVuc29ydGVkT2JqZWN0KTsKLQkJCX0KLQkJfQotCQkKLQkJTm9kZSByZWNvcmRpbmdOb2RlID0gbnVsbDsKLQkJaWYgKHNvcnRlZExpc3Quc2l6ZSgpID4gMSkgewotCQkJcmVjb3JkaW5nTm9kZSA9IGdldEVsZW1lbnQoc29ydGVkTGlzdC5nZXQoMCkpOwotCQkJYmVnaW5SZWNvcmRpbmcocmVjb3JkaW5nTm9kZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX01VTFRJUExFX0RFTEVURSIpKTsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzb3J0ZWRMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLQkJCQlkZWxldGVPcGVyYXRpb24oKE9wZXJhdGlvbikgb2JqZWN0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhcnQpIHsKLQkJCQlkZWxldGVQYXJ0KChQYXJ0KSBvYmplY3QpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJRGVsZXRlTm9kZUFjdGlvbiBkZWxldGVOb2RlQWN0aW9uID0gbmV3IERlbGV0ZU5vZGVBY3Rpb24oZ2V0RWxlbWVudChvYmplY3QpKTsKLQkJCQlkZWxldGVOb2RlQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAocmVjb3JkaW5nTm9kZSAhPSBudWxsKSB7Ci0JCQllbmRSZWNvcmRpbmcocmVjb3JkaW5nTm9kZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBWZWN0b3IgZ2V0TWVzc2FnZXMoTGlzdCBmYXVsdHMpIHsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZmF1bHRzLml0ZXJhdG9yKCk7Ci0JCQotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlGYXVsdCBmYXVsdCA9IChGYXVsdCkgaXQubmV4dCgpOwotCQkJaWYgKGZhdWx0LmdldEVNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCXYuYWRkRWxlbWVudChmYXVsdC5nZXRFTWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHY7Ci0JfQotCQotCXByaXZhdGUgVmVjdG9yIGdldFBhcnRzKFZlY3RvciBtZXNzYWdlcykgewotCQlWZWN0b3IgcGFydHMgPSBuZXcgVmVjdG9yKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuaXRlcmF0b3IoKTsKLQkJCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBpdC5uZXh0KCk7Ci0JCQkKLQkJCWlmIChtZXNzYWdlLmdldEVQYXJ0cygpICE9IG51bGwpIHsKLQkJCQlwYXJ0cy5hZGRBbGwobWVzc2FnZS5nZXRFUGFydHMoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwYXJ0czsKLQl9Ci0JCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpCi0JewotCSAgcmV0dXJuIGxpc3Quc2l6ZSgpID4gMCA/IChOb2RlKSBnZXRFbGVtZW50KGxpc3QuZ2V0KDApKSA6IG51bGw7Ci0JfSAKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkKLQl7Ci0JICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgdm9pZCBkZWxldGVPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlEZWxldGVPcGVyYXRpb25EaWFsb2cgZGlhbG9nID0gbmV3IERlbGV0ZU9wZXJhdGlvbkRpYWxvZyhXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIG9wZXJhdGlvbi5nZXROYW1lKCkpOwotCSAgICBpbnQgcmV0dXJuQ29kZSA9IGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0JICAgIAotCSAgICBpZiAocmV0dXJuQ29kZSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JICAgIAlpZiAoZGlhbG9nLmRlbGV0ZU1lc3NhZ2VzQW5kUGFydHMoKSkgewotCSAgICAJCS8vIEdldCBhbGwgYXNzb2NpYXRlZCBtZXNzYWdlcwotCSAgICAJCVZlY3RvciBtZXNzYWdlcyA9IGdldFJlZmVyZW5jZWRNZXNzYWdlcyhvcGVyYXRpb24pOwotCSAgICAJCQotCSAgICAJCS8vIERldGVybWluZSB3aGljaCBNZXNzYWdlcyBhcmUgcmVmZXJlbmNlZCBmcm9tICdvdXRzaWRlJyB0aGlzIG9wZXJhdGlvbgotCSAgICAJCVZlY3RvciByZWZlcmVuY2VkTWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0JICAgIAkJaWYgKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0RVBvcnRUeXBlcygpICE9IG51bGwpIHsKLQkgICAgCQkJSXRlcmF0b3IgcG9ydFR5cGVJdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0RVBvcnRUeXBlcygpLml0ZXJhdG9yKCk7Ci0JICAgIAkJCVZlY3RvciBvcGVyYXRpb25zID0gbmV3IFZlY3RvcigpOwotCSAgICAJCQkKLQkgICAgCQkJd2hpbGUgKHBvcnRUeXBlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JICAgIAkJCQlQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgcG9ydFR5cGVJdGVyYXRvci5uZXh0KCk7Ci0JICAgIAkJCQkKLQkgICAgCQkJCWlmIChwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpICE9IG51bGwpIHsKLQkgICAgCQkJCQlJdGVyYXRvciBvcGVyYXRpb25JdGVyYXRvciA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLQkgICAgCQkJCQl3aGlsZSAob3BlcmF0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JICAgIAkJCQkJCU9wZXJhdGlvbiBuZXh0T3BlcmF0aW9uID0gKE9wZXJhdGlvbikgb3BlcmF0aW9uSXRlcmF0b3IubmV4dCgpOwotCSAgICAJCQkJCQlpZiAoIW5leHRPcGVyYXRpb24uZXF1YWxzKG9wZXJhdGlvbikpCi0JICAgIAkJCQkJCQlvcGVyYXRpb25zLmFkZChuZXh0T3BlcmF0aW9uKTsKLQkgICAgCQkJCQl9Ci0JICAgIAkJCQl9Ci0JICAgIAkJCX0KLQkgICAgCQkJCi0JICAgIAkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBvcGVyYXRpb25zLnNpemUoKTsgaW5kZXgrKykgewotCSAgICAJCQkJcmVmZXJlbmNlZE1lc3NhZ2VzLmFkZEFsbChnZXRSZWZlcmVuY2VkTWVzc2FnZXMoKE9wZXJhdGlvbikgb3BlcmF0aW9ucy5lbGVtZW50QXQoaW5kZXgpKSk7Ci0JICAgIAkJCX0KLQkgICAgCQkKLQkgICAgCQkJLy8gRmlsdGVyIHdoaWNoIE1lc3NhZ2VzIG5lZWQgdG8gYmUgZGVsZXRlZAotCSAgICAJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbWVzc2FnZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JICAgIAkJCQlpbnQgZm91bmRJbmRleCA9IHJlZmVyZW5jZWRNZXNzYWdlcy5pbmRleE9mKG1lc3NhZ2VzLmVsZW1lbnRBdChpbmRleCkpOwotCSAgICAJCQkJCi0JICAgIAkJCQlpZiAoZm91bmRJbmRleCAhPSAtMSkgewotCSAgICAJCQkJCS8vIE1lc3NhZ2UgaXMgcmVmZXJlbmNlZCBlbHNld2hlcmUuICBEbyBub3QgZGVsZXRlCi0JICAgIAkJCQkJbWVzc2FnZXMucmVtb3ZlKGluZGV4KTsKLQkgICAgCQkJCX0KLQkgICAgCQkJfQotCSAgICAJCX0KLQkgICAgCQkKLQkgICAgCQkvLyBHZXQgYWxsIGFzc29jaWF0ZWQgcGFydHMKLQkgICAgCQlWZWN0b3IgcGFydHMgPSBnZXRQYXJ0cyhtZXNzYWdlcyk7Ci0JICAgIAkJCi0JICAgIAkJLy8gUmVtb3ZlIG91ciBsaXN0IG9mIE1lc3NhZ2VzIGFuZCBQYXJ0cwotCSAgICAJCVBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBvcGVyYXRpb24uZUNvbnRhaW5lcigpOwotCSAgICAJCU5vZGUgcmVjb3JkaW5nTm9kZSA9IHBvcnRUeXBlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRFbGVtZW50KCk7Ci0JICAgIAkJYmVnaW5SZWNvcmRpbmcocmVjb3JkaW5nTm9kZSwgZGVsZXRlU3RyaW5nICsgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfT1BFUkFUSU9OIikpOwotCSAgICAJCQotCSAgICAJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBtZXNzYWdlcy5zaXplKCk7IGluZGV4KyspIHsKLQkgICAgCQkJTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIG1lc3NhZ2VzLmVsZW1lbnRBdChpbmRleCk7Ci0JICAgIAkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBtZXNzYWdlLmVDb250YWluZXIoKTsKLQkgICAgCQkJZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKS5yZW1vdmUobWVzc2FnZSk7Ci0JICAgIAkJfQotCi0JICAgIAkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBhcnRzLnNpemUoKTsgaW5kZXgrKykgewotCSAgICAJCQlQYXJ0IHBhcnQgPSAoUGFydCkgcGFydHMuZWxlbWVudEF0KGluZGV4KTsKLQkgICAgCQkJTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIHBhcnQuZUNvbnRhaW5lcigpOwotCSAgICAJCQltZXNzYWdlLmdldEVQYXJ0cygpLnJlbW92ZShwYXJ0KTsKLQkgICAgCQl9Ci0JICAgIAkJCi0JICAgIAkJLy8gRGVsZXRlIHRoZSBPcGVyYXRpb24KLQkgICAgCQlwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLnJlbW92ZShvcGVyYXRpb24pOwotCi0JICAgIAkJZW5kUmVjb3JkaW5nKHJlY29yZGluZ05vZGUpOwotCSAgICAJfQotCSAgICAJZWxzZSB7Ci0JICAgIAkJLy8gT25seSBkZWxldGUgdGhlIE9wZXJhdGlvbgotCSAgICAJCVBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBvcGVyYXRpb24uZUNvbnRhaW5lcigpOwotCSAgICAJCU5vZGUgcmVjb3JkaW5nTm9kZSA9IHBvcnRUeXBlLmdldEVsZW1lbnQoKTsKLQkgICAgCQkKLQkgICAgCQliZWdpblJlY29yZGluZyhyZWNvcmRpbmdOb2RlLCBkZWxldGVTdHJpbmcgKyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9PUEVSQVRJT04iKSk7IC8vIFRyYW5zbGF0ZSB0aGlzISEhCi0JICAgIAkJcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKS5yZW1vdmUob3BlcmF0aW9uKTsKLQkgICAgCQllbmRSZWNvcmRpbmcocmVjb3JkaW5nTm9kZSk7Ci0JICAgIAl9Ci0JICAgIH0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZVBhcnQoUGFydCBwYXJ0KSB7Ci0JCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBwYXJ0LmVDb250YWluZXIoKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJYmVnaW5SZWNvcmRpbmcobWVzc2FnZS5nZXRFbGVtZW50KCksIGRlbGV0ZVN0cmluZyArIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BBUlQiKSk7Ci0JCQltZXNzYWdlLmdldEVQYXJ0cygpLnJlbW92ZShwYXJ0KTsKLQkJCWVuZFJlY29yZGluZyhtZXNzYWdlLmdldEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBFbGVtZW50IGdldEVsZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQpIHsKLQkJCWVsZW1lbnQgPSAoKFdTRExFbGVtZW50KSBvYmplY3QpLmdldEVsZW1lbnQoKTsKLQkJfQotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWEpIHsKLQkJCWVsZW1lbnQgPSAoKFhTRFNjaGVtYSkgb2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIGJlZ2luIHJlY29yZGluZyBjaGFuZ2VzLgotCSAqIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgcmVwbGFjZSBCYXNlTm9kZUFjdGlvbi5iZWdpblJlY29yZGluZygpCi0JICogd2hlbiBhbGwgZGVsZXRlcyBhcmUgbW9kZWwgZHJpdmVuLgotCSAqLwotCSAgcHJpdmF0ZSB2b2lkIGJlZ2luUmVjb3JkaW5nKE5vZGUgbm9kZSwgU3RyaW5nIHVuZG9EZXNjcmlwdGlvbikKLQkgIHsgICAgCi0JICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0JICAgIHsKLQkgICAgICAoKElET01Ob2RlKW5vZGUpLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgdW5kb0Rlc2NyaXB0aW9uKTsgIAotCSAgICB9Ci0JICB9Ci0KLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIGJlZ2luIHJlY29yZGluZyBjaGFuZ2VzLgotCSAqIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgcmVwbGFjZSBCYXNlTm9kZUFjdGlvbi5iZWdpblJlY29yZGluZygpCi0JICogd2hlbiBhbGwgZGVsZXRlcyBhcmUgbW9kZWwgZHJpdmVuLgotCSAqLwotCSAgcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKE5vZGUgbm9kZSkKLQkgIHsKLQkgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLQkgICAgewotCSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7ICAKLQkgICAgfQotCSAgfQotCQotCXByaXZhdGUgY2xhc3MgRGVsZXRlT3BlcmF0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXJ7Ci0JCXByaXZhdGUgQnV0dG9uIGNoZWNrQnV0dG9uID0gbnVsbDsKLQkJcHJpdmF0ZSBib29sZWFuIGRlbGV0ZU1lc3NhZ2VzQW5kUGFydHMgPSB0cnVlOwotCQlwcml2YXRlIFN0cmluZyBvcGVyYXRpb25OYW1lOwotCQkgCi0JCXB1YmxpYyBEZWxldGVPcGVyYXRpb25EaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihzaGVsbCk7Ci0JCQlvcGVyYXRpb25OYW1lID0gbmFtZTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSAKLQkJICB7Ci0JCSAgICBDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCSAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQotCQkgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCSAgICBHcmlkRGF0YSBnZEZpbGw9IG5ldyBHcmlkRGF0YSgpOwotCQkgICAgZ2RGaWxsLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0JCSAgICBnZEZpbGwuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLQkJICAgIGdkRmlsbC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLQkJICAgIGdkRmlsbC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkRmlsbCk7Ci0KLQkJICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkgICAgbGFiZWwuc2V0VGV4dChvcGVyYXRpb25OYW1lKTsKLS8vCQkgICAgbGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9PUEVSQVRJT04iKSArICIgIiArIG9wZXJhdGlvbk5hbWUpOwotCQkgICAgR3JpZERhdGEgbGFiZWxEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCSAgICBsYWJlbERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkgICAgCi0JCSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsRGF0YSk7Ci0JCSAgICAKLQkJICAgIExhYmVsIGVtcHR5TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCSAgICBHcmlkRGF0YSBlbXB0eURhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJICAgIGVtcHR5RGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCSAgICBlbXB0eUxhYmVsLnNldExheW91dERhdGEoZW1wdHlEYXRhKTsKLQotCQkgICAgY2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJICAgIGNoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihkZWxldGVNZXNzYWdlc0FuZFBhcnRzKTsKLQkJICAgIGNoZWNrQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkgICAgTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkgICAgbmFtZUxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfREVMRVRFX0FTU09DSUFURURfTVNHX0FORF9QQVJUUyIpKTsKLQkJICAgIAotCQkgICAgcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JCSAgfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZGVsZXRlTWVzc2FnZXNBbmRQYXJ0cygpIHsKLQkJCXJldHVybiBkZWxldGVNZXNzYWdlc0FuZFBhcnRzOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgIHt9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgIHsKLQkJCWlmIChlLndpZGdldCA9PSBjaGVja0J1dHRvbikgewotCQkJCWlmIChjaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlkZWxldGVNZXNzYWdlc0FuZFBhcnRzID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlbGV0ZU1lc3NhZ2VzQW5kUGFydHMgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNyZWF0ZUFuZE9wZW4oKSB7Ci0JCQljcmVhdGUoKTsKLQkJICAgIGdldFNoZWxsKCkuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9ERUxFVEVfT1BFUkFUSU9OX1RJVExFIikpOwotCQkgICAgc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCSAgICByZXR1cm4gb3BlbigpOwotCQl9Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRGVsZXRlSW50ZXJmYWNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZUludGVyZmFjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzY0Mjg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRGVsZXRlSW50ZXJmYWNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBEZWxldGVJbnRlcmZhY2VBY3Rpb24gewotCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlTGlzdChMaXN0IGxpc3QpOwotCQotCXB1YmxpYyB2b2lkIHJ1bigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZU5vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExNjgxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZU5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsgCi0gICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVOb2RlQWN0aW9uIGV4dGVuZHMgQmFzZU5vZGVBY3Rpb24KLXsgCi0gIHByb3RlY3RlZCBMaXN0IGxpc3Q7Ci0KLSAgcHVibGljIERlbGV0ZU5vZGVBY3Rpb24oTm9kZSBub2RlKQotICB7Ci0gICAgc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFIikpOyAgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgbGlzdC5hZGQobm9kZSk7Ci0gIH0gICAgCi0gIAotICBwdWJsaWMgRGVsZXRlTm9kZUFjdGlvbihMaXN0IG5vZGVMaXN0KQotICB7Ci0gICAgc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFIikpOyAgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgSXRlcmF0b3IgaXQgPSBub2RlTGlzdC5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAJbGlzdC5hZGQoaXQubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmVnaW5SZWNvcmRpbmcoKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSAoTm9kZSlpLm5leHQoKTsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpbm9kZTsKLSAgICAgICAgYXR0ci5nZXRPd25lckVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBOb2RlIHByZXZpb3VzU2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgICAgaWYgKHByZXZpb3VzU2libGluZyAhPSBudWxsICYmIGlzV2hpdGVzcGFjZVRleHROb2RlKHByZXZpb3VzU2libGluZykpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHByZXZpb3VzU2libGluZyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAKLQotICAgIGVuZFJlY29yZGluZygpOwotICB9ICAgCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNXaGl0ZXNwYWNlVGV4dE5vZGUoTm9kZSBub2RlKSAKLSAgewotCSAgcmV0dXJuIChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKTsKLSAgfSAgICAKLQotICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgewotICAgIHJldHVybiBsaXN0LnNpemUoKSA+IDAgPyAoTm9kZSlsaXN0LmdldCgwKSA6IG51bGw7Ci0gIH0gCi0KLSAgcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVXU0RMQW5kWFNEQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZVdTRExBbmRYU0RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4NGM5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZVdTRExBbmRYU0RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgZGVsZXRlIHdpdGggdGhlIFdTREwgRWRpdG9yJ3MgZ3JhcGggdmlldy4gIHRoZSBvYmplY3QgZm9yCi0gKiBkZWxldGlvbiBjb3VsZCBiZSBhIFdTREwgJ29iamVjdCcgb3IgYW4gWFNEICdvYmplY3QnLiAgV2UgbmVlZCB0byBtYWtlIHRoaXMKLSAqIGRpc3RpbmN0aW9uIGJlY2F1c2Ugd2UgaGF2ZSB0d28gZGlmZmVyZW50IERlbGV0ZSBjbGFzc2VzLiAgT25lIHRvIGhhbmRsZQotICogV1NETCBhbmQgYW5vdGhlciB0byBoYW5kbGUgWFNELgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlV1NETEFuZFhTREFjdGlvbiBleHRlbmRzIEJhc2VOb2RlQWN0aW9uIHsKLQlMaXN0IGxpc3Q7Ci0JTm9kZSByZWNvcmRpbmdOb2RlOwotCVdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLQotCXB1YmxpYyBEZWxldGVXU0RMQW5kWFNEQWN0aW9uKExpc3QgZGVsZXRlTGlzdCwgTm9kZSByZWNvcmRpbmdOb2RlLCBXU0RMRWRpdG9yIHdzZGxFZGl0b3IpIHsKLQkJc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFIikpOwotCQlsaXN0ID0gZGVsZXRlTGlzdDsKLQkJdGhpcy5yZWNvcmRpbmdOb2RlID0gcmVjb3JkaW5nTm9kZTsKLQkJdGhpcy53c2RsRWRpdG9yID0gd3NkbEVkaXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJTGlzdCB3c2RsRGVsZXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB4c2REZWxldGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQkKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCB8fCBvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWEpIHsKLQkJCQl3c2RsRGVsZXRlTGlzdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXhzZERlbGV0ZUxpc3QuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCU9iamVjdCBuZXdTZWxlY3Rpb24gPSBudWxsOwotCQlPYmplY3QgdG9wTGV2ZWxPYmplY3QgPSBudWxsOwotCQlpZiAod3NkbERlbGV0ZUxpc3Quc2l6ZSgpID4gMCB8fCB4c2REZWxldGVMaXN0LnNpemUoKSA+IDApCi0JCXsJCi0JCQl0cnkKLQkJCXsKLQkJCWJlZ2luUmVjb3JkaW5nKCk7CQotCQkJCQotCQkKLQkJLy8gRGVsZXRlIFdTREwgb2JqZWN0cwotCQlpZiAod3NkbERlbGV0ZUxpc3Quc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0IHdzZGxPYmplY3QgPSB3c2RsRGVsZXRlTGlzdC5nZXQoMCk7Ci0JCQlpZiAod3NkbE9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KSB7Ci0JCQkJbmV3U2VsZWN0aW9uID0gKChXU0RMRWxlbWVudCkgd3NkbE9iamVjdCkuZUNvbnRhaW5lcigpOwotCQkJCXRvcExldmVsT2JqZWN0ID0gZ2V0VG9wTGV2ZWxXU0RMT2JqZWN0KChXU0RMRWxlbWVudCkgd3NkbE9iamVjdCk7Ci0JCQl9Ci0JCQkKLQkJCURlbGV0ZUFjdGlvbiB3c2RsRGVsZXRlID0gbmV3IERlbGV0ZUFjdGlvbih3c2RsRGVsZXRlTGlzdCk7Ci0JCQl3c2RsRGVsZXRlLnJ1bigpOwotCQl9Ci0JCQotCQkvLyBEZWxldGUgWFNEIG9iamVjdHMKLQkJaWYgKHhzZERlbGV0ZUxpc3Quc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0IHhzZE9iamVjdCA9IHhzZERlbGV0ZUxpc3QuZ2V0KDApOwotCQkJaWYgKHhzZE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KSB7Ci0JCQkJbmV3U2VsZWN0aW9uID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgeHNkT2JqZWN0KS5nZXRDb250YWluZXIoKTsKLQkJCQl0b3BMZXZlbE9iamVjdCA9IGdldFRvcExldmVsWFNET2JqZWN0KChYU0RDb25jcmV0ZUNvbXBvbmVudCkgeHNkT2JqZWN0KTsKLQkJCX0KLQkJCQotCQkJRGVsZXRlSW50ZXJmYWNlQWN0aW9uIHhzZERlbGV0ZSA9IChEZWxldGVJbnRlcmZhY2VBY3Rpb24pIGdldFhTRERlbGV0ZSgpOwotCQkJeHNkRGVsZXRlLnNldERlbGV0ZUxpc3QoeHNkRGVsZXRlTGlzdCk7Ci0JCQl4c2REZWxldGUucnVuKCk7Ci0JCQkvLyBIYWNrIHRvIGZvcmNlIGEgcmVmcmVzaCBvZiBhbGwgY29tcG9uZW50cyBvZiB0aGUgR3JhcGggVmlldy4gIFRoaXMgaXMgbmVlZGVkCi0JCQkvLyBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgZGVsZXRlIGEgWFNEIEVsZW1lbnQgKFZpZXcgaW5wdXQgPT0gRGVmaW5pdGlvbikuICBUaGUgWFNECi0JCQkvLyBFbGVtZW50IEVkaXRQYXJ0IHZpc3VhbCB3b3VsZCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSB2aWV3LgotCQkJd3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCkuc2V0UU5hbWUod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCkuZ2V0UU5hbWUoKSk7Ci0JCX0KLQkJCX0KLQkJCWZpbmFsbHkKLQkJCXsKLQkJCSAgZW5kUmVjb3JkaW5nKCk7Ci0JCQl9Ci0JCQkvLyBNYWtlIG91ciBzZWxlY3Rpb24gYWZ0ZXIgb3VyIERlbGV0aW9ucwotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcil3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLQkJICAgIGlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKQotCQkgICAgewotCQkgICAgCWlmIChuZXdTZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICBuZXdTZWxlY3Rpb24gPSAoKFhTRFBhcnRpY2xlKSBuZXdTZWxlY3Rpb24pLmdldENvbnRhaW5lcigpOwotCSAgICAgICAgICAgIH0KLQkgICAgCQkKLQkJICAgIAlpZiAobmV3U2VsZWN0aW9uID09IG51bGwpIHsKLQkJICAgIAkJbmV3U2VsZWN0aW9uID0gZ2V0TmV3U2VsZWN0aW9uKCk7Ci0JCSAgICAJfQotCQkgICAgCWlmIChuZXdTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkgICAgCQkvLyBXZSBoYXZlIGEgbmV3U2VsZWN0aW9uLCBidXQgaXQgbWF5IGFsc28gYmUgZGVsZXRlZCBieSB0aGUgdXNlci4gIEluIHRoaXMgY2FzZSwgc2VsZWN0IHRoZSB0b3AgbGV2ZWwgb2JqZWN0Ci0JCSAgICAJCWlmIChsaXN0LmNvbnRhaW5zKG5ld1NlbGVjdGlvbikgJiYgdG9wTGV2ZWxPYmplY3QgIT0gbnVsbCkgewotCQkgICAgCQkJbmV3U2VsZWN0aW9uID0gdG9wTGV2ZWxPYmplY3Q7Ci0JCSAgICAJCX0KLQotCQkgICAgCQlzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKSk7Ci0JCSAgICAJfQotCQkgICAgfQotCQl9Ci0JfQotCQotCXB1YmxpYyBOb2RlIGdldE5vZGUoKQotCXsKLQkgIHJldHVybiByZWNvcmRpbmdOb2RlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkKLQl7Ci0JICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0WFNERGVsZXRlKCkgewotCQlXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uTUVOVV9BQ1RJT05fQ09OVFJJQlVUT1IpOwotCSAgICBPYmplY3QgeHNkRGVsZXRlID0gbnVsbDsKLQkgICAgCi0JICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkgICAgewotLy8JICAgIAl4c2REZWxldGUgPSBleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLlhTRF9ERUxFVEVfQUNUSU9OLCB3c2RsRWRpdG9yKTsKLQkgICAgCXhzZERlbGV0ZSA9IGV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uWFNEX0RFTEVURV9BQ1RJT04sIG51bGwpOwotCSAgICAJaWYgKHhzZERlbGV0ZSAhPSBudWxsKSB7Ci0JICAgIAkJYnJlYWs7Ci0JICAgIAl9Ci0JICAgIH0JICAgIAotCSAgICAKLQkgICAgcmV0dXJuIHhzZERlbGV0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0TmV3U2VsZWN0aW9uKCkgewotCQkvLyBIYWNrIHVzaW5nIHdzZGxlZGl0b3IuLi4uICBUaGlzIHNpdHVhdGlvbiBvY2N1cnMgd2hlbiB3ZSBkZWxldGUgdGhlIFNjaGVtYSBmcm9tIHRoZSBUeXBlcyBncm91cC4uLi4gIFdlCi0JCS8vIHVzdWFsbHkgZ2V0IHRoZSBjb250YWluZXIgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkLi4uIGhvd2V2ZXIsIGluIHRoaXMgc2l0dWF0aW9uLCB0aGUgY29udGFpbmVyIHdvdWxkCi0JCS8vIGJlIG51bGwgYmVjYXVzZSB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWQgaXMgYSBTY2hlbWEuLi4uLi4KLQkJT2JqZWN0IHNlbGVjdGlvbjsKLQkJdHJ5IHsKLQkJCXNlbGVjdGlvbiA9IHdzZGxFZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5nZXRDb21wb25lbnRWaWV3ZXIoKS5nZXRJbnB1dCgpOwotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJc2VsZWN0aW9uID0gd3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzZWxlY3Rpb24gPSB3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIFdTRExFbGVtZW50IGdldFRvcExldmVsV1NETE9iamVjdChXU0RMRWxlbWVudCBlbGVtZW50KSB7Ci0JCVdTRExFbGVtZW50IHRvcE9iamVjdCA9IChXU0RMRWxlbWVudCkgZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCQotCQl3aGlsZSAodG9wT2JqZWN0ICE9IG51bGwgJiYgISh0b3BPYmplY3QgaW5zdGFuY2VvZiBEZWZpbml0aW9uKSkgewotCQkJdG9wT2JqZWN0ID0gKFdTRExFbGVtZW50KSB0b3BPYmplY3QuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJcmV0dXJuIHRvcE9iamVjdDsKLQl9Ci0JCi0JcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRUb3BMZXZlbFhTRE9iamVjdChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJWFNEQ29uY3JldGVDb21wb25lbnQgdG9wT2JqZWN0ID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotCQkKLQkJd2hpbGUgKHRvcE9iamVjdCAhPSBudWxsICYmICEodG9wT2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hKSkgewotCQkJdG9wT2JqZWN0ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSB0b3BPYmplY3QuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJcmV0dXJuIHRvcE9iamVjdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0TmFtZXNwYWNlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0TmFtZXNwYWNlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzRiZTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5uc2VkaXQuRWRpdE5hbWVzcGFjZXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSW5mb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgRWRpdE5hbWVzcGFjZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQotICBwdWJsaWMgRWRpdE5hbWVzcGFjZXNBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FRElUX05BTUVTUEFDRVMiKSk7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBET01OYW1lc3BhY2VJbmZvTWFuYWdlciBuYW1lc3BhY2VJbmZvTWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTWFuYWdlci5nZXROYW1lc3BhY2VJbmZvTGlzdChlbGVtZW50KTsKLSAgICAgIExpc3Qgb2xkTmFtZXNwYWNlSW5mb0xpc3QgPSBOYW1lc3BhY2VJbmZvLmNsb25lTmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCi0gICAgICAvLyBoZXJlIHdlIHN0b3JlIGEgY29weSBvZiB0aGUgb2xkIGluZm8gZm9yIGVhY2ggTmFtZXNwYWNlSW5mbwotICAgICAgLy8gdGhpcyBpbmZvIHdpbGwgYmUgdXNlZCBpbiBjcmVhdGVQcmVmaXhNYXBwaW5nKCkgdG8gZmlndXJlIG91dCBob3cgdG8gdXBkYXRlIHRoZSBkb2N1bWVudCAKLSAgICAgIC8vIGluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZXMKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotICAgICAgICBOYW1lc3BhY2VJbmZvIG9sZENvcHkgPSBuZXcgTmFtZXNwYWNlSW5mbyhpbmZvKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eSgib2xkQ29weSIsIG9sZENvcHkpOwotICAgICAgfQotCi0JICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0gICAgICBFZGl0TmFtZXNwYWNlc0RpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdE5hbWVzcGFjZXNEaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCAgcGF0aCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRURJVF9OQU1FU1BBQ0VTX0RJQUxPR19USVRMRSIpLCBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gICAgICBpbnQgcmMgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotICAgICAgaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgICB7ICAgICAgCQotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgZGlhbG9nLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJCi0gICAgICAgIExpc3QgbmV3SW5mb0xpc3QgPSBkaWFsb2cuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKTsKLSAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLSAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhlbGVtZW50LCBuZXdJbmZvTGlzdCwgZmFsc2UpOwotCi0vKgotICAgICAgICAvLyBzZWUgaWYgd2UgbmVlZCB0byByZW5hbWUgYW55IHByZWZpeGVzCi0gICAgICAgIE1hcCBwcmVmaXhNYXBwaW5nID0gY3JlYXRlUHJlZml4TWFwcGluZyhvbGROYW1lc3BhY2VJbmZvTGlzdCwgbmFtZXNwYWNlSW5mb0xpc3QpOwotICAgICAgICBpZiAocHJlZml4TWFwcGluZy5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgLy9tYW5hZ2VyLmdldE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0gICAgICAgICAgUmVwbGFjZVByZWZpeEFjdGlvbiByZXBsYWNlUHJlZml4QWN0aW9uID0gbmV3IFJlcGxhY2VQcmVmaXhBY3Rpb24oZWxlbWVudCwgcHJlZml4TWFwcGluZyk7Ci0gICAgICAgICAgcmVwbGFjZVByZWZpeEFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAvL21hbmFnZXIuZ2V0TW9kZWwoKS5jaGFuZ2VkTW9kZWwoKTsKLSAgICAgICAgfQotKi8gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBNYXAgY3JlYXRlUHJlZml4TWFwcGluZyhMaXN0IG9sZExpc3QsIExpc3QgbmV3TGlzdCkKLSAgewotICAgIE1hcCBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICBIYXNodGFibGUgb2xkVVJJVG9QcmVmaXhUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0gICAgICBvbGRVUklUb1ByZWZpeFRhYmxlLnB1dChvbGRJbmZvLnVyaSwgb2xkSW5mbyk7Ci0gICAgfQotCi0gICAgZm9yIChJdGVyYXRvciBpID0gbmV3TGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBuZXdJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotICAgICAgTmFtZXNwYWNlSW5mbyBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIG9sZFVSSVRvUHJlZml4VGFibGUuZ2V0KG5ld0luZm8udXJpICE9IG51bGwgPyBuZXdJbmZvLnVyaSA6ICIiKTsKLQotICAgICAgLy8gaWYgb2xkSW5mbyBpcyBub24gbnVsbCAuLi4gdGhlcmUncyBhIG1hdGNoaW5nIFVSSSBpbiB0aGUgb2xkIHNldAotICAgICAgLy8gd2UgY2FuIHVzZSBpdHMgcHJlZml4IHRvIGRldGVtaW5lIG91dCBtYXBwaW5nCi0gICAgICAvLwotICAgICAgLy8gaWYgb2xkSW5mbyBpcyBudWxsIC4uLiAgd2UgdXNlIHRoZSAnb2xkQ29weScgd2Ugc3Rhc2hlZCBhd2F5IAotICAgICAgLy8gYXNzdW1pbmcgdGhhdCB0aGUgdXNlciBjaGFuZ2VkIHRoZSBVUkkgYW5kIHRoZSBwcmVmaXgKLSAgICAgIGlmIChvbGRJbmZvID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgbmV3SW5mby5nZXRQcm9wZXJ0eSgib2xkQ29weSIpOwotICAgICAgfQotCi0gICAgICBpZiAob2xkSW5mbyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gbmV3SW5mby5wcmVmaXggIT0gbnVsbCA/IG5ld0luZm8ucHJlZml4IDogIiI7Ci0gICAgICAgIFN0cmluZyBvbGRQcmVmaXggPSBvbGRJbmZvLnByZWZpeCAhPSBudWxsID8gb2xkSW5mby5wcmVmaXggOiAiIjsKLSAgICAgICAgaWYgKCFvbGRQcmVmaXguZXF1YWxzKG5ld1ByZWZpeCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXAucHV0KG9sZFByZWZpeCwgbmV3UHJlZml4KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0V4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDIwZGI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOyAgICAgICAgICAgICAgICAgICAgICAgIAotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSU1lbnVBY3Rpb25Db250cmlidXRvcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLSAgcHJvdGVjdGVkIElNZW51QWN0aW9uQ29udHJpYnV0b3JbXSBtZW51QWN0aW9uQ29udHJpYnV0b3JzOyAgCi0KLSAgcHVibGljIEV4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3IoV1NETEVkaXRvciB3c2RsRWRpdG9yKQotICB7Ci0gICAgdGhpcy53c2RsRWRpdG9yID0gd3NkbEVkaXRvcjsgCi0KLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCi0gICAgV1NETEVkaXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSByZWdpc3RyeS5nZXRSZWdpc3RlcmVkRXh0ZW5zaW9ucyhXU0RMRWRpdG9yRXh0ZW5zaW9uLk1FTlVfQUNUSU9OX0NPTlRSSUJVVE9SKTsKLSAgICBtZW51QWN0aW9uQ29udHJpYnV0b3JzID0gbmV3IElNZW51QWN0aW9uQ29udHJpYnV0b3JbZXh0ZW5zaW9ucy5sZW5ndGhdOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51QWN0aW9uQ29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIG1lbnVBY3Rpb25Db250cmlidXRvcnNbaV0gPSAoSU1lbnVBY3Rpb25Db250cmlidXRvcilleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLk1FTlVfQUNUSU9OX0NPTlRSSUJVVE9SLCB3c2RsRWRpdG9yKTsKLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBjb250cmlidXRlTWVudUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIE5vZGUgbm9kZSwgT2JqZWN0IG9iamVjdCkKLSAgeyAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51QWN0aW9uQ29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKG1lbnVBY3Rpb25Db250cmlidXRvcnNbaV0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWVudUFjdGlvbkNvbnRyaWJ1dG9yc1tpXS5jb250cmlidXRlTWVudUFjdGlvbnMobWFuYWdlciwgbm9kZSwgb2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0lEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9JRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4Njk1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0lEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQlwdWJsaWMgdm9pZCBpbml0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zKElBY3Rpb25CYXJzIGJhcnMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUGFzdGVHbG9iYWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUGFzdGVHbG9iYWxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyNDljNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1Bhc3RlR2xvYmFsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFBhc3RlR2xvYmFsQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvcjsKLQlwcml2YXRlIFdTRExFbGVtZW50IHNlbGVjdGlvbjsKLQlwcml2YXRlIE5vZGUgc2VsZWN0aW9uTm9kZTsKLQkKLQlwdWJsaWMgUGFzdGVHbG9iYWxBY3Rpb24oV1NETEVsZW1lbnQgc2VsZWN0aW9uLCBJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fUEFTVEUiKSk7ICAvLyBUcmFuc2xhdGUgVGhpcwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0JCXNlbGVjdGlvbk5vZGUgPSBzZWxlY3Rpb24uZ2V0RWxlbWVudCgpOwotCQlzZXRFbmFibGVkU3RhdGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgV1NETEVkaXRvcikgewotCQkJV1NETEVkaXRvciB3c2RsRWRpdG9yID0gKFdTRExFZGl0b3IpIGVkaXRvcjsKLQkJCUNvcHlXU0RMRWxlbWVudEFjdGlvbiBjb3B5QWN0aW9uID0gbmV3IENvcHlXU0RMRWxlbWVudEFjdGlvbih3c2RsRWRpdG9yLmdldEdyYXBoVmlld2VyKCkuZ2V0Q29tcG9uZW50Vmlld2VyKCksIHdzZGxFZGl0b3IuZ2V0Q2xpcGJvYXJkQ29udGVudHMoKSwgc2VsZWN0aW9uLCBzZWxlY3Rpb25Ob2RlKTsKLQkJCWNvcHlBY3Rpb24ucnVuKCk7Ci0JCX0KLQl9Ci0JCi0gIAlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oV1NETEVsZW1lbnQgbmV3U2VsZWN0aW9uKSB7Ci0gIAkJc2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotICAJCXNldEVuYWJsZWRTdGF0ZSgpOwotICAJfQotICAJCi0gIAlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVkU3RhdGUoKSB7Ci0gIAkJV1NETEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IG51bGw7Ci0gIAkJaWYgKChwYXJlbnRFbGVtZW50ID0gc2hvd1Bhc3RlQWN0aW9uKChXU0RMRWxlbWVudCkgc2VsZWN0aW9uLCBlZGl0b3IpKSAhPSBudWxsKSB7Ci0gIAkJCXNlbGVjdGlvbiA9IHBhcmVudEVsZW1lbnQ7Ci0gIAkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0gIAkJfQotICAJCWVsc2UgewotICAJCQlzZXRFbmFibGVkKGZhbHNlKTsKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCSBwcml2YXRlIFdTRExFbGVtZW50IHNob3dQYXN0ZUFjdGlvbihXU0RMRWxlbWVudCBlbGVtZW50LCBJRWRpdG9yUGFydCBlUGFydCkgewotICAJICAJV1NETEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IG51bGw7Ci0gIAkgIAkKLSAgCSAgCWlmIChlUGFydCBpbnN0YW5jZW9mIFdTRExFZGl0b3IpIHsKLSAgCSAgCQlXU0RMRWxlbWVudCBjbGlwYm9hcmRFbGVtZW50ID0gKChXU0RMRWRpdG9yKSBlUGFydCkuZ2V0Q2xpcGJvYXJkQ29udGVudHMoKTsKLSAgCSAgCQkKLSAgCSAgCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBvcnRUeXBlKSB7Ci0gIAkgIAkJCWlmIChjbGlwYm9hcmRFbGVtZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gIAkgIAkJCQlwYXJlbnRFbGVtZW50ID0gZWxlbWVudDsKLSAgCSAgCQkJfQotICAJICAJCX0KLSAgCSAgCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAJICAJCQlpZiAoY2xpcGJvYXJkRWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAJICAJCQkJcGFyZW50RWxlbWVudCA9IChXU0RMRWxlbWVudCkgKChPcGVyYXRpb24pIGVsZW1lbnQpLmVDb250YWluZXIoKTsKLSAgCSAgCQkJfQotICAJICAJCX0KLSAgCSAgCX0KLSAgCSAgCQotICAJICAJcmV0dXJuIHBhcmVudEVsZW1lbnQ7Ci0gIAkgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwNDYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbG9hZERlcGVuZGVuY2llc0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZQotewotCXByaXZhdGUgV1NETEVkaXRvciB3c2RsRWRpdG9yOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpCi0JewotCQl3c2RsRWRpdG9yID0gKHRhcmdldEVkaXRvciBpbnN0YW5jZW9mIFdTRExFZGl0b3IpID8gKFdTRExFZGl0b3IpdGFyZ2V0RWRpdG9yIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0JewotCQlpZiAod3NkbEVkaXRvciAhPSBudWxsKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQl3c2RsRWRpdG9yLnJlbG9hZERlcGVuZGVuY2llcygpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbmFtZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0Yjk5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsgCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvci5CaW5kaW5nUmVuYW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aXNpdG9yLk1lc3NhZ2VSZW5hbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3IuUG9ydFR5cGVSZW5hbWVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIFJlbmFtZUFjdGlvbiAvL2V4dGVuZHMgQmFzZU5vZGVBY3Rpb24gaW1wbGVtZW50cyBSdW5uYWJsZQotewotICBwcm90ZWN0ZWQgT2JqZWN0IG1vZGVsT2JqZWN0OyAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgbmV3TmFtZTsKLSAgcHJvdGVjdGVkIE5vZGUgbm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgUmVuYW1lQWN0aW9uKE9iamVjdCBtb2RlbE9iamVjdCwgU3RyaW5nIG5ld05hbWUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMubW9kZWxPYmplY3QgPSBtb2RlbE9iamVjdDsKLSAgICB0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotICAgIHRoaXMubm9kZSA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0Tm9kZUZvck9iamVjdChtb2RlbE9iamVjdCk7Ci0gIH0gICAgICAKLQotICAvKgotICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgewotICAgIHJldHVybiBub2RlOwotICB9Ci0gICovCi0KLSAgLyoKLSAgcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9SRU5BTUUiKTsgIC8vJE5PTi1OTFMtMSQKLSAgfQotICAqLwotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPcGVyYXRpb24pIAotICAgIHsKLSAgICAgIHJlbmFtZU9wZXJhdGlvbkhlbHBlcigoT3BlcmF0aW9uKW1vZGVsT2JqZWN0KTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIElucHV0IHx8Ci0gICAgICAgICAgICAgbW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPdXRwdXQgfHwKLSAgICAgICAgICAgICBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIHJlbmFtZUlPRkhlbHBlcigoV1NETEVsZW1lbnQpbW9kZWxPYmplY3QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVuYW1lTW9kZWxPYmplY3RIZWxwZXIobW9kZWxPYmplY3QsIG5ld05hbWUpOwotICAgIH0KLSAgfSAKLQotICBwcm90ZWN0ZWQgdm9pZCByZW5hbWVNb2RlbE9iamVjdEhlbHBlcihPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyB0aGVOZXdOYW1lKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsgCi0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIHRoZU5ld05hbWUpOwotICAgIH0gICAgCi0KLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlKQotICAgIHsKLSAgICAgIE1lc3NhZ2VSZW5hbWVyIHJlbmFtZXIgPSBuZXcgTWVzc2FnZVJlbmFtZXIoKE1lc3NhZ2UpbW9kZWxPYmplY3QsIHRoZU5ld05hbWUpOwotICAgICAgcmVuYW1lci52aXNpdEJpbmRpbmdzKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgUG9ydFR5cGUpCi0gICAgewotICAgICAgUG9ydFR5cGVSZW5hbWVyIHJlbmFtZXIgPSBuZXcgUG9ydFR5cGVSZW5hbWVyKChQb3J0VHlwZSltb2RlbE9iamVjdCwgdGhlTmV3TmFtZSk7Ci0gICAgICByZW5hbWVyLnZpc2l0QmluZGluZ3MoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nKQotICAgIHsKLSAgICAgIEJpbmRpbmdSZW5hbWVyIHJlbmFtZXIgPSBuZXcgQmluZGluZ1JlbmFtZXIoKEJpbmRpbmcpbW9kZWxPYmplY3QsIHRoZU5ld05hbWUpOwotICAgICAgcmVuYW1lci52aXNpdFNlcnZpY2VzKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVuYW1lT3BlcmF0aW9uSGVscGVyKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICAvLyBmaW5kIGJpbmRpbmcgb3BlcmF0aW9ucyB3aXRoIGEgbWF0Y2hpbmcgc2lnbmF0dXJlCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsgCi0gICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZGVmaW5pdGlvbik7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB1dGlsLmdldEJpbmRpbmdPcGVyYXRpb25zKG9wZXJhdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbilpLm5leHQoKTsKLSAgICAgIHJlbmFtZU1vZGVsT2JqZWN0SGVscGVyKGJpbmRpbmdPcGVyYXRpb24sIG5ld05hbWUpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICByZW5hbWVNb2RlbE9iamVjdEhlbHBlcihvcGVyYXRpb24sIG5ld05hbWUpOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW5hbWVJT0ZIZWxwZXIoV1NETEVsZW1lbnQgb2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9iamVjdC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7IAotICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBudWxsOwotCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElucHV0KQotICAgIHsKLSAgICAgIGxpc3QgPSB1dGlsLmdldEJpbmRpbmdJbnB1dHMoKElucHV0KW9iamVjdCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE91dHB1dCkKLSAgICB7Ci0gICAgICBsaXN0ID0gdXRpbC5nZXRCaW5kaW5nT3V0cHV0cygoT3V0cHV0KW9iamVjdCk7Ci0gICAgfQotICAgIGVsc2UgLy8gZmF1bHQKLSAgICB7Ci0gICAgICBsaXN0ID0gdXRpbC5nZXRCaW5kaW5nRmF1bHRzKChGYXVsdClvYmplY3QpOwotICAgIH0KLSAgICAgIAotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3QgYmluZGluZ09iamVjdCA9IGkubmV4dCgpOwotICAgICAgICByZW5hbWVNb2RlbE9iamVjdEhlbHBlcihiaW5kaW5nT2JqZWN0LCBuZXdOYW1lKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotCi0gICAgcmVuYW1lTW9kZWxPYmplY3RIZWxwZXIob2JqZWN0LCBuZXdOYW1lKTsKLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmYzNWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy5JbnZva2VTZXREaWFsb2c7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBTZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbiBleHRlbmRzIEFkZEVsZW1lbnRBY3Rpb24KLXsKLSAgT2JqZWN0IGlucHV0OwotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLSAgcHJvdGVjdGVkIFN0cmluZyBraW5kOwotCi0gIHB1YmxpYyBTZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbigKLSAgICBTdHJpbmcgdGV4dCwKLSAgICBOb2RlIHBhcmVudE5vZGUsCi0gICAgU3RyaW5nIHByZWZpeCwKLSAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgIE9iamVjdCBpbnB1dCkKLSAgewotICAgIHN1cGVyKHRleHQsIHBhcmVudE5vZGUsIHByZWZpeCwgbG9jYWxOYW1lKTsKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlS2luZChTdHJpbmcga2luZCkKLSAgewotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpCi0gIHsKLSAgICBJbnZva2VTZXREaWFsb2cgZGlhbG9nID0gbmV3IEludm9rZVNldERpYWxvZygpOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFBhcnQpCi0gICAgewotICAgICAgZGlhbG9nLnNldFJlZmVyZW5jZUtpbmQoa2luZCk7Ci0gICAgfQotICAgIGRpYWxvZy5ydW4oaW5wdXQsIGVkaXRvclBhcnQpOwotICAgIAotICAgIC8vIFdlIHNob3VsZG4ndCBrbm93IGFib3V0IHRoZSBlZGl0b3IgaW4gdGhpcyBjbGFzcwotICAgIFdTRExFZGl0b3IgZWRpdG9yID0gKFdTRExFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgZWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaW5wdXQpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXROZXdDb21wb25lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU2V0TmV3Q29tcG9uZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZTYzNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TZXROZXdDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkTWVzc2FnZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuV1NETEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IuQmluZGluZ0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5DcmVhdGVXU0RMRWxlbWVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0cy5OZXdDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qCi0gKiBUT0RPOiBOZWVkIHRvIGNsZWFuIHVwIHRoaXMgY2xhc3MuLi4uIFdlIHByb2JhYmx5IGRvbid0IHVzZSBxdWl0ZSBhIGZldyBvZiB0aGVzZQotICogbWV0aG9kcy9pbnN0YW5jZSB2YXJpYWJsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXROZXdDb21wb25lbnRBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIE9iamVjdCBpbnB1dDsKLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcga2luZDsKLSAgcHJpdmF0ZSBTdHJpbmcgdHlwZUtpbmQgPSAiY29tcGxleCI7ICAgICAgLy8gVE9ETzogUmVmYWN0b3IgY29kZSB0byBoYW5kbGUgdGhpcyBiZXR0ZXIKLQotICBwdWJsaWMgU2V0TmV3Q29tcG9uZW50QWN0aW9uKAotICAgIFN0cmluZyB0ZXh0LAotICAgIE5vZGUgcGFyZW50Tm9kZSwKLSAgICBTdHJpbmcgcHJlZml4LAotICAgIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgT2JqZWN0IGlucHV0KQotICB7Ci0gICAgc3VwZXIodGV4dCwgcGFyZW50Tm9kZSwgcHJlZml4LCBsb2NhbE5hbWUpOwotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VLaW5kKFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VHlwZUtpbmQoU3RyaW5nIHR5cGVLaW5kKQotICB7Ci0gICAgICB0aGlzLnR5cGVLaW5kID0gdHlwZUtpbmQ7Ci0gIH0KLQotICAvLyBUT0RPOiBDbGVhbiB1cCBuZXh0IG1ldGhvZHMgYmVsb3chISEKLSAgcHJpdmF0ZSBXU0RMRWxlbWVudENvbW1hbmQgY29tbWFuZDsKLSAgcHJpdmF0ZSBTdHJpbmcgbmV3RGlhbG9nVGl0bGUgPSAiTmV3IENvbXBvbmVudCI7Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpCi0gIHsKLSAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgU3RyaW5nIGRlZmF1bHROYW1lID0gZ2V0RGVmYXVsdE5hbWUoKTsKLSAgICBOZXdDb21wb25lbnREaWFsb2cgZGlhbG9nID0gbmV3IE5ld0NvbXBvbmVudERpYWxvZyhzaGVsbCwgbmV3RGlhbG9nVGl0bGUsIGRlZmF1bHROYW1lLCBnZXRVc2VkTmFtZXMoKSk7Ci0KLSAgICBpbnQgZGlhbG9nQ29kZSA9IGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0gICAgCi0gICAgaWYgKGRpYWxvZ0NvZGUgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFBvcnQpIHsKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoUG9ydCkgaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBuZXdOYW1lID0gZGlhbG9nLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETzogV2Ugc2hvdWxkIGJlIHNtYXJ0ZXIgaW4gY2hvb3Npbmcgc29tZSBkZWZhdWx0IG9wdGlvbnMvc2V0dGluZ3MgZm9yIGdlbmVyYXRpbmcgYSBuZXcgQmluZGluZwotICAgICAgICAgICAgQmluZGluZ0dlbmVyYXRvciBiaW5kaW5nR2VuZXJhdG9yID0gbmV3IEJpbmRpbmdHZW5lcmF0b3IoZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICBiaW5kaW5nR2VuZXJhdG9yLnNldE5hbWUobmV3TmFtZSk7Ci0gICAgICAgICAgICBiaW5kaW5nR2VuZXJhdG9yLnNldFByb3RvY29sKCJTT0FQIik7Ci0gICAgICAgICAgICBiaW5kaW5nR2VuZXJhdG9yLmdlbmVyYXRlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgaXRlbVByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgIGlmIChpdGVtUHJlZml4ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXRlbVByZWZpeCA9ICIiOwotICAgICAgICAgIH0KLSAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IHdzZGxFbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KChXU0RMRWxlbWVudCkgaW5wdXQpOwotICAgICAgICAgIHdzZGxFbGVtZW50LnNldEF0dHJpYnV0ZSgiYmluZGluZyIsIGl0ZW1QcmVmaXgubGVuZ3RoKCkgPT0gMCA/IG5ld05hbWUgOiBpdGVtUHJlZml4ICsgIjoiICsgbmV3TmFtZSk7ICAgICAKLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJpbmRpbmcpIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoQmluZGluZykgaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICAgIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBuZXdOYW1lID0gZGlhbG9nLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBkZWZpbml0aW9uRWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgIC8vIFVzZSBBZGRNZXNzYWdlQWN0aW9uIGluIFdTRExNZW51QWN0aW9uQ29udHJpYnV0b3IKLSAgICAgICAgICAgIEFkZEVsZW1lbnRBY3Rpb24gYWRkUG9ydFR5cGVBY3Rpb24gPSBuZXcgQWRkRWxlbWVudEFjdGlvbigiIiwgImljb25zL21lc3NhZ2Vfb2JqLmdpZiIsIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsICJwb3J0VHlwZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICAgICAgYWRkUG9ydFR5cGVBY3Rpb24uc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQodHJ1ZSk7Ci0gICAgICAgICAgICBhZGRQb3J0VHlwZUFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgbmV3TWVzc2FnZSA9IGFkZFBvcnRUeXBlQWN0aW9uLmdldE5ld0VsZW1lbnQoKTsKLSAgICAgICAgICAgIG5ld01lc3NhZ2Uuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmV3TmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIC8vIG5lZWQgdG8gZ2V0IHRoZSBwcmVmaXggZm9yIHRoZSBpdGVtCi0gICAgICAgICAgICAvLyBjb3VsZCBnZXQgbGlzdCBvZiB1cGRhdGVkIG1lc3NhZ2VzIGFuZCB0aGVuIHNlbGVjdCBidXQgY3VycmVudGx5IHdlIG9ubHkgaGF2ZSB0aGUgbG9jYWwgbmFtZQotICAgICAgICAgICAgU3RyaW5nIGl0ZW1QcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIGlmIChpdGVtUHJlZml4ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGl0ZW1QcmVmaXggPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHBvcnRUeXBlVmFsdWUgPSBpdGVtUHJlZml4Lmxlbmd0aCgpID09IDAgPyBuZXdOYW1lIDogaXRlbVByZWZpeCArICI6IiArIG5ld05hbWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgICAgICAvLyBTZXQgdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgcG9ydFR5cGVWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCB3c2RsRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdCgoV1NETEVsZW1lbnQpIGlucHV0KTsKLSAgICAgICAgICAgICAgICB3c2RsRWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBwb3J0VHlwZVZhbHVlKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJbnB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIE91dHB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIEZhdWx0KSB7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKE1lc3NhZ2VSZWZlcmVuY2UpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IGRpYWxvZy5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIEFkZE1lc3NhZ2VDb21tYW5kIGFjdGlvbiA9IG5ldyBBZGRNZXNzYWdlQ29tbWFuZChkZWZpbml0aW9uLCBuZXdOYW1lKTsKLSAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBhY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLSAgICAgICAgICAgIENyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuZ2V0UGFydEluZm8obWVzc2FnZSk7IAotICAgICAgICAgICAgQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlUGFydChtZXNzYWdlKTsKLQotICAgICAgICAgIC8vIG5lZWQgdG8gZ2V0IHRoZSBwcmVmaXggZm9yIHRoZSBpdGVtCi0gICAgICAgICAgLy8gY291bGQgZ2V0IGxpc3Qgb2YgdXBkYXRlZCBtZXNzYWdlcyBhbmQgdGhlbiBzZWxlY3QgYnV0IGN1cnJlbnRseSB3ZSBvbmx5IGhhdmUgdGhlIGxvY2FsIG5hbWUKLSAgICAgICAgICBTdHJpbmcgaXRlbVByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgIGlmIChpdGVtUHJlZml4ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXRlbVByZWZpeCA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgd3NkbEVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoKFdTRExFbGVtZW50KSBpbnB1dCk7Ci0gICAgICAgICAgd3NkbEVsZW1lbnQuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgaXRlbVByZWZpeC5sZW5ndGgoKSA9PSAwID8gbmV3TmFtZSA6IGl0ZW1QcmVmaXggKyAiOiIgKyBuZXdOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFBhcnQpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNpbmdQcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBuZXdOYW1lID0gZGlhbG9nLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGtpbmQuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVLaW5kLmVxdWFsc0lnbm9yZUNhc2UoImNvbXBsZXgiKSkgewotICAgICAgICAgICAgICAgICAgICAoKEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZCkgY29tbWFuZCkuaXNDb21wbGV4VHlwZSh0cnVlKTsgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAoKEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZCkgY29tbWFuZCkuaXNDb21wbGV4VHlwZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAoKEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZCkgY29tbWFuZCkucnVuKG5ld05hbWUpOwotICAgICAgICAgICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwuc2V0Q29tcG9uZW50UmVmZXJlbmNlKChQYXJ0KSBpbnB1dCwgdHJ1ZSwgcmVmZXJlbmNpbmdQcmVmaXguZXF1YWxzKCIiKSA/IG5ld05hbWUgOiByZWZlcmVuY2luZ1ByZWZpeCArICI6IiArIG5ld05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoa2luZC5lcXVhbHNJZ25vcmVDYXNlKCJlbGVtZW50IikpIHsKLSAgICAgICAgICAgICAgICAoKEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQpIGNvbW1hbmQpLnJ1bihuZXdOYW1lKTsKLSAgICAgICAgICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZSgoUGFydCkgaW5wdXQsIGZhbHNlLCByZWZlcmVuY2luZ1ByZWZpeC5lcXVhbHMoIiIpID8gbmV3TmFtZSA6IHJlZmVyZW5jaW5nUHJlZml4ICsgIjoiICsgbmV3TmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFdlIHNob3VsZG4ndCBrbm93IGFib3V0IHRoZSBlZGl0b3IgaW4gdGhpcyBjbGFzcwotICAgICAgV1NETEVkaXRvciBlZGl0b3IgPSAoV1NETEVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGlucHV0KSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0VXNlZE5hbWVzKCkgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgUG9ydCkgewotICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoUG9ydCkgaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICByZXR1cm4gTmFtZVV0aWwuZ2V0VXNlZEJpbmRpbmdOYW1lcyhkZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQmluZGluZykgewotICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoQmluZGluZykgaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICByZXR1cm4gTmFtZVV0aWwuZ2V0VXNlZFBvcnRUeXBlTmFtZXMoZGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElucHV0IHx8IGlucHV0IGluc3RhbmNlb2YgT3V0cHV0IHx8IGlucHV0IGluc3RhbmNlb2YgRmF1bHQpIHsKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKE1lc3NhZ2VSZWZlcmVuY2UpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgcmV0dXJuIE5hbWVVdGlsLmdldFVzZWRNZXNzYWdlTmFtZXMoZGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFBhcnQpIHsKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFBhcnQpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgaWYgKGtpbmQuZXF1YWxzSWdub3JlQ2FzZSgiZWxlbWVudCIpKSB7Ci0gICAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZChkZWZpbml0aW9uLCAiTmV3RWxlbWVudCIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBwYXJlbnRTY2hlbWEgPSAoKEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQpIGNvbW1hbmQpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgcmV0dXJuIGdldFVzZWRFbGVtZW50TmFtZXMocGFyZW50U2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoa2luZC5lcXVhbHNJZ25vcmVDYXNlKCJ0eXBlIikpIHsKLSAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQoZGVmaW5pdGlvbiwgIk5ld1R5cGUiKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBYU0RTY2hlbWEgcGFyZW50U2NoZW1hID0gKChBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQpIGNvbW1hbmQpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgTGlzdCB1c2VkTmFtZXM7Ci0gICAgICAgICAgICAgIGlmICh0eXBlS2luZC5lcXVhbHNJZ25vcmVDYXNlKCJjb21wbGV4IikpIHsKLSAgICAgICAgICAgICAgICAgIHVzZWROYW1lcyA9IGdldFVzZWRDb21wbGV4VHlwZU5hbWVzKHBhcmVudFNjaGVtYSk7ICAgIAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgdXNlZE5hbWVzID0gZ2V0VXNlZFNpbXBsZVR5cGVOYW1lcyhwYXJlbnRTY2hlbWEpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICByZXR1cm4gdXNlZE5hbWVzOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIChuZXcgQXJyYXlMaXN0KCkpOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFBvcnQpIHsKLSAgICAgICAgICBuZXdEaWFsb2dUaXRsZSA9ICJOZXcgQmluZGluZyI7ICAgICAgIC8vIFRPRE86IFVnbHkgSGFjay4uLiByZW1vdmUKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZiA9ICgoUG9ydCkgaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICByZXR1cm4gTmFtZVV0aWwuZ2V0VW5pcXVlTmFtZUhlbHBlcigiTmV3QmluZGluZyIsIE5hbWVVdGlsLmdldFVzZWRCaW5kaW5nTmFtZXMoZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJpbmRpbmcpIHsKLSAgICAgICAgICBuZXdEaWFsb2dUaXRsZSA9ICJOZXcgUG9ydCBUeXBlIjsgICAgICAgLy8gVE9ETzogVWdseSBIYWNrLi4uIHJlbW92ZQotICAgICAgICAgIERlZmluaXRpb24gZGVmID0gKChCaW5kaW5nKSBpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgICAgIHJldHVybiBOYW1lVXRpbC5nZXRVbmlxdWVOYW1lSGVscGVyKCJOZXdQb3J0VHlwZSIsIE5hbWVVdGlsLmdldFVzZWRQb3J0VHlwZU5hbWVzKGRlZikpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJbnB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIE91dHB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIEZhdWx0KSB7Ci0gICAgICAgICAgbmV3RGlhbG9nVGl0bGUgPSAiTmV3IE1lc3NhZ2UiOyAgICAgICAvLyBUT0RPOiBVZ2x5IEhhY2suLi4gcmVtb3ZlCi0gICAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSAoKE1lc3NhZ2VSZWZlcmVuY2UpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgcmV0dXJuIE5hbWVVdGlsLmdldFVuaXF1ZU5hbWVIZWxwZXIoIk5ld01lc3NhZ2UiLCBOYW1lVXRpbC5nZXRVc2VkTWVzc2FnZU5hbWVzKGRlZikpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0gICAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSAoKFBhcnQpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGtpbmQuZXF1YWxzSWdub3JlQ2FzZSgiZWxlbWVudCIpKSB7Ci0gICAgICAgICAgICAgIG5ld0RpYWxvZ1RpdGxlID0gIk5ldyBFbGVtZW50IjsgICAgICAgLy8gVE9ETzogVWdseSBIYWNrLi4uIHJlbW92ZQotICAgICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQoZGVmLCAiTmV3RWxlbWVudCIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBwYXJlbnRTY2hlbWEgPSAoKEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQpIGNvbW1hbmQpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgTGlzdCB1c2VkTmFtZXMgPSBnZXRVc2VkRWxlbWVudE5hbWVzKHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgIHJldHVybiBOYW1lVXRpbC5nZXRVbmlxdWVOYW1lSGVscGVyKCJOZXdFbGVtZW50IiwgdXNlZE5hbWVzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoa2luZC5lcXVhbHNJZ25vcmVDYXNlKCJ0eXBlIikpIHsKLSAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQoZGVmLCAiTmV3VHlwZSIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBwYXJlbnRTY2hlbWEgPSAoKEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZCkgY29tbWFuZCkuZ2V0U2NoZW1hKCk7Ci0KLSAgICAgICAgICAgICAgU3RyaW5nIG5ld0l0ZW1OYW1lID0gIk5ld0NvbXBsZXhUeXBlIjsKLSAgICAgICAgICAgICAgTGlzdCB1c2VkTmFtZXMgPSBudWxsOwotICAgICAgICAgICAgICBpZiAodHlwZUtpbmQuZXF1YWxzSWdub3JlQ2FzZSgiY29tcGxleCIpKSB7Ci0gICAgICAgICAgICAgICAgICBuZXdEaWFsb2dUaXRsZSA9ICJOZXcgQ29tcGxleCBUeXBlIjsgICAgICAgLy8gVE9ETzogVWdseSBIYWNrLi4uIHJlbW92ZQotICAgICAgICAgICAgICAgICAgdXNlZE5hbWVzID0gZ2V0VXNlZENvbXBsZXhUeXBlTmFtZXMocGFyZW50U2NoZW1hKTsgICAgCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBuZXdEaWFsb2dUaXRsZSA9ICJOZXcgU2ltcGxlIFR5cGUiOyAgICAgICAvLyBUT0RPOiBVZ2x5IEhhY2suLi4gcmVtb3ZlCi0gICAgICAgICAgICAgICAgICB1c2VkTmFtZXMgPSBnZXRVc2VkU2ltcGxlVHlwZU5hbWVzKHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICBuZXdJdGVtTmFtZSA9ICJOZXdTaW1wbGVUeXBlIjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgcmV0dXJuIG5ld0l0ZW1OYW1lID0gTmFtZVV0aWwuZ2V0VW5pcXVlTmFtZUhlbHBlcihuZXdJdGVtTmFtZSwgdXNlZE5hbWVzKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJldHVybiAiTmV3Q29tcG9uZW50IjsKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGdldFVzZWRTaW1wbGVUeXBlTmFtZXMoWFNEU2NoZW1hIHNjaGVtYSkgewotICAgICAgTGlzdCBuYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAKLSAgICAgIEl0ZXJhdG9yIHR5cGVzSXQgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlICh0eXBlc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIHR5cGVzSXQubmV4dCgpOwotICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgbmFtZXNMaXN0LmFkZCh0eXBlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gbmFtZXNMaXN0OwotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0VXNlZENvbXBsZXhUeXBlTmFtZXMoWFNEU2NoZW1hIHNjaGVtYSkgewotICAgICAgTGlzdCBuYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAKLSAgICAgIEl0ZXJhdG9yIHR5cGVzSXQgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlICh0eXBlc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIHR5cGVzSXQubmV4dCgpOwotICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgIG5hbWVzTGlzdC5hZGQodHlwZS5nZXROYW1lKCkpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIG5hbWVzTGlzdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGdldFVzZWRFbGVtZW50TmFtZXMoWFNEU2NoZW1hIHNjaGVtYSkgewotICAgICAgTGlzdCBuYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAKLSAgICAgIEl0ZXJhdG9yIGVsZW1lbnRzSXQgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoZWxlbWVudHNJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzSXQubmV4dCgpOwotICAgICAgICAgIG5hbWVzTGlzdC5hZGQoZWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gbmFtZXNMaXN0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TbWFydFJlbmFtZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TbWFydFJlbmFtZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDM1ZmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU21hcnRSZW5hbWVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoKLSAqIFRoaXMgY2xhc3MgcmVuYW1lcyAncmVsYXRlZCcgV1NETEVsZW1lbnRzLiAgVGhlIHNjZW5hcmlvIGlzIGFzIGZvbGxvd3M6Ci0gKiBUaGUgdXNlciByZW5hbWVzIGEgV1NETEVsZW1lbnQgaW4gdGhlIGVkaXRvciwgc2F5IGEgTWVzc2FnZS4gIFRoaXMgY2xhc3MKLSAqIHdpbGwgZmluZCB0aGUgJ3JlbGF0ZWQnIGVsZW1lbnRzIHRvIHRoaXMgTWVzc2FnZSBhbmQgcmVuYW1lIHRoZW0gYXMgd2VsbC4KLSAqIEl0IHdpbGwgb25seSByZW5hbWUgYSAncmVsYXRlZCcgZWxlbWVudCBpZiB0aGUgZWxlbWVudCBuYW1lIChvciBwYXJ0IG9mIGl0KQotICogaXMgZ2VuZXJhdGVkLgotICogCi0gKiBTZWUgTmFtZVV0aWwuamF2YQotICovCi1wdWJsaWMgY2xhc3MgU21hcnRSZW5hbWVBY3Rpb24gZXh0ZW5kcyBCYXNlTm9kZUFjdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQlwcm90ZWN0ZWQgT2JqZWN0IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBuZXdOYW1lOwotCXByaXZhdGUgTGlzdCBtZXNzYWdlUmVmZXJlbmNlczsgLy8gVGhpcyB2YXJpYWJsZSBzaG91bGQgYmUgYWNjZXNzZWQgYnkgbWV0aG9kIGdldEFsbE1lc3NhZ2VSZWZlcmVuY2VzKCkKLQlwcm90ZWN0ZWQgTm9kZSBub2RlOyAgIAotCQotCXB1YmxpYyBTbWFydFJlbmFtZUFjdGlvbihPYmplY3QgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc2V0VGV4dCgiU21hcnQgUmVuYW1lIEFjdGlvbiIpOyAvLyBEbyBub3QgdHJhbnNsYXRlCi0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JICAgIHRoaXMubm9kZSA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0Tm9kZUZvck9iamVjdChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkgICByZXR1cm4gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fUkVOQU1FIik7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlSZW5hbWVBY3Rpb24gcmVuYW1lcjsKLQkJU3RyaW5nIG9sZE5hbWU7Ci0JCQotCQliZWdpblJlY29yZGluZygpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotCQkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIGVsZW1lbnQ7Ci0JCQlvbGROYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsKLQotCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBSZW5hbWUgT3BlcmF0aW9uIAotCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24ob3BlcmF0aW9uLCBuZXdOYW1lKTsKLQkJCXJlbmFtZXIucnVuKCk7Ci0JCQkKLQkJCS8vIFJlbmFtZSBJbnB1dAotCQkJSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0JCQkvKgotCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaXNJbnB1dE91dHB1dE5hbWVHZW5lcmF0ZWQob2xkTmFtZSwgaW5wdXQuZ2V0TmFtZSgpKSkgewotCQkJCXJlbmFtZXIgPSBuZXcgUmVuYW1lQWN0aW9uKGlucHV0LCBuZXdOYW1lKTsKLQkJCQlyZW5hbWVyLnJ1bigpOwotCQkJfQotCQkJKi8KLQkJCQotCQkJLy8gUmVuYW1lIE91dHB1dAotCQkJT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0JCQkvKgotCQkJaWYgKG91dHB1dCAhPSBudWxsICYmIGlzSW5wdXRPdXRwdXROYW1lR2VuZXJhdGVkKG9sZE5hbWUsIG91dHB1dC5nZXROYW1lKCkpKSB7Ci0JCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24ob3V0cHV0LCBuZXdOYW1lKTsKLQkJCQlyZW5hbWVyLnJ1bigpOwotCQkJfQotCQkJKi8KLQkJCQotCQkJLy8gUmVuYW1lIE1lc3NhZ2VzIGFuZCBQYXJ0cwotCQkJTWVzc2FnZSBtc2c7Ci0KLQkJCS8vIElucHV0Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRFTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQltc2cgPSBpbnB1dC5nZXRFTWVzc2FnZSgpOwotCQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOwotCi0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCW9sZE1lc3NhZ2VOYW1lID0gbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQkJCQotCQkJCQlpZiAoaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvbGRNZXNzYWdlTmFtZSwgb2xkTmFtZSwgIlJlcXVlc3QiKSkgewotCQkJCQkJcmVuYW1lTWVzc2FnZUhlbHBlcihtc2csIGNvbXB1dGVOZXdNZXNzYWdlTmFtZShtc2csIG9sZE5hbWUsIG5ld05hbWUpKTsKLQkJCQkJCQotCQkJCQkJaWYgKG1zZy5nZXRFUGFydHMoKSAhPSBudWxsKQotCQkJCQkJCXJlbmFtZVBhcnRzSGVscGVyKG1zZy5nZXRFUGFydHMoKSwgb2xkTWVzc2FnZU5hbWUsIG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLCB0cnVlKTsJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIE91dHB1dAotCQkJaWYgKG91dHB1dCAhPSBudWxsICYmIG91dHB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCW1zZyA9IG91dHB1dC5nZXRFTWVzc2FnZSgpOwotCQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOwotCQkJCQotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQkKLQkJCQkJaWYgKGlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob2xkTWVzc2FnZU5hbWUsIG9sZE5hbWUsICJSZXNwb25zZSIpKSB7Ci0JCQkJCQlyZW5hbWVNZXNzYWdlSGVscGVyKG1zZywgY29tcHV0ZU5ld01lc3NhZ2VOYW1lKG1zZywgb2xkTmFtZSwgbmV3TmFtZSkpOwotCQkJCQkJCi0JCQkJCQlpZiAobXNnLmdldEVQYXJ0cygpICE9IG51bGwpCi0JCQkJCQkJcmVuYW1lUGFydHNIZWxwZXIobXNnLmdldEVQYXJ0cygpLCBvbGRNZXNzYWdlTmFtZSwgbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIHRydWUpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gRmF1bHRzCi0JCQlMaXN0IGZhdWx0cyA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCk7Ci0JCQlpZiAoZmF1bHRzICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBpdCA9IGZhdWx0cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGl0Lm5leHQoKTsKLQkJCQkJbXNnID0gZmF1bHQuZ2V0RU1lc3NhZ2UoKTsKLQkJCQkJU3RyaW5nIG9sZE1lc3NhZ2VOYW1lID0gIiI7Ci0KLQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQkJCi0JCQkJCQlpZiAoaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvbGRNZXNzYWdlTmFtZSwgb2xkTmFtZSwgZmF1bHQuZ2V0TmFtZSgpKSkgewotCQkJCQkJCXJlbmFtZU1lc3NhZ2VIZWxwZXIobXNnLCBjb21wdXRlTmV3TWVzc2FnZU5hbWUobXNnLCBvbGROYW1lLCBuZXdOYW1lKSk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKG1zZy5nZXRFUGFydHMoKSAhPSBudWxsKQotCQkJCQkJCQlyZW5hbWVQYXJ0c0hlbHBlcihtc2cuZ2V0RVBhcnRzKCksIG9sZE1lc3NhZ2VOYW1lLCBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElucHV0KSB7Ci0JCQlJbnB1dCBpbnB1dCA9IChJbnB1dCkgZWxlbWVudDsKLQkJCW9sZE5hbWUgPSBpbnB1dC5nZXROYW1lKCk7Ci0JCQlpZiAob2xkTmFtZSA9PSBudWxsKSB7Ci0JCQkJb2xkTmFtZSA9ICIiOwotCQkJfQotCQkJCi0JCQlpZiAob2xkTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWlucHV0LnNldE5hbWUobmV3TmFtZSk7Ci0KLS8vCQkJIFJlbmFtZSBNZXNzYWdlcyBhbmQgUGFydHMKLQkJCU1lc3NhZ2UgbXNnOwotCQkJCi0JCQkvLyBJbnB1dAotCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZ2V0RU1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJbXNnID0gaW5wdXQuZ2V0RU1lc3NhZ2UoKTsKLQkJCQlTdHJpbmcgb2xkTWVzc2FnZU5hbWUgPSAiIjsKLQkJCQkKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJb2xkTWVzc2FnZU5hbWUgPSBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCQkJCi0JCQkJCWlmIChpc01lc3NhZ2VOYW1lR2VuZXJhdGVkKG9sZE1lc3NhZ2VOYW1lLCBvbGROYW1lLCAiUmVxdWVzdCIpKSB7Ci0JCQkJCQlyZW5hbWVNZXNzYWdlSGVscGVyKG1zZywgY29tcHV0ZU5ld01lc3NhZ2VOYW1lKG1zZywgb2xkTmFtZSwgbmV3TmFtZSkpOwotCQkJCQkJCi0JCQkJCQlpZiAobXNnLmdldEVQYXJ0cygpICE9IG51bGwpCi0JCQkJCQkJcmVuYW1lUGFydHNIZWxwZXIobXNnLmdldEVQYXJ0cygpLCBvbGRNZXNzYWdlTmFtZSwgbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIHRydWUpOwkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgT3V0cHV0KSB7Ci0JCQlPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCkgZWxlbWVudDsKLQkJCW9sZE5hbWUgPSBvdXRwdXQuZ2V0TmFtZSgpOwotCQkJaWYgKG9sZE5hbWUgPT0gbnVsbCkgewotCQkJCW9sZE5hbWUgPSAiIjsKLQkJCX0KLQkJCQotCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlvdXRwdXQuc2V0TmFtZShuZXdOYW1lKTsKLQotLy8JCQkgUmVuYW1lIE1lc3NhZ2VzIGFuZCBQYXJ0cwotCQkJTWVzc2FnZSBtc2c7Ci0JCQkKLQkJCS8vIE91dHB1dAotCQkJaWYgKG91dHB1dCAhPSBudWxsICYmIG91dHB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCW1zZyA9IG91dHB1dC5nZXRFTWVzc2FnZSgpOwotCQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOwotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQlpZiAoaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvbGRNZXNzYWdlTmFtZSwgb2xkTmFtZSwgIlJlc3BvbnNlIikpIHsKLQkJCQkJCXJlbmFtZU1lc3NhZ2VIZWxwZXIobXNnLCBjb21wdXRlTmV3TWVzc2FnZU5hbWUobXNnLCBvbGROYW1lLCBuZXdOYW1lKSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChtc2cuZ2V0RVBhcnRzKCkgIT0gbnVsbCkKLQkJCQkJCQlyZW5hbWVQYXJ0c0hlbHBlcihtc2cuZ2V0RVBhcnRzKCksIG9sZE1lc3NhZ2VOYW1lLCBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZhdWx0KSB7Ci0JCQlGYXVsdCBmYXVsdCA9IChGYXVsdCkgZWxlbWVudDsKLQkJCU1lc3NhZ2UgbXNnID0gZmF1bHQuZ2V0RU1lc3NhZ2UoKTsKLQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOwotCQkJb2xkTmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLQkJCQotCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBSZW5hbWUgdGhlIEZhdWx0Ci0JCQlyZW5hbWVyID0gbmV3IFJlbmFtZUFjdGlvbihmYXVsdCwgbmV3TmFtZSk7Ci0JCQlyZW5hbWVyLnJ1bigpOwotCi0JCQkvLyBSZW5hbWUgdGhlIE1lc3NhZ2UgYW5kIFBhcnRzCi0JCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQotCQkJCU9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIGZhdWx0LmVDb250YWluZXIoKTsKLQkJCQlpZiAoaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvbGRNZXNzYWdlTmFtZSwgb3AuZ2V0TmFtZSgpLCBvbGROYW1lKSkgewotCQkJCQlyZW5hbWVNZXNzYWdlSGVscGVyKG1zZywgY29tcHV0ZU5ld01lc3NhZ2VOYW1lKG1zZywgb2xkTmFtZSwgbmV3TmFtZSkpOwotCQkJCQkKLQkJCQkJaWYgKG1zZy5nZXRFUGFydHMoKSAhPSBudWxsKQotCQkJCQkJcmVuYW1lRmF1bHRQYXJ0cyhtc2cuZ2V0RVBhcnRzKCksIG9wLmdldE5hbWUoKSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlKSB7Ci0JCQlNZXNzYWdlIG1zZyA9IChNZXNzYWdlKSBlbGVtZW50OwotCQkJb2xkTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJU3RyaW5nIG9sZE1lc3NhZ2VOYW1lID0gbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQkKLQkJCWlmIChvbGROYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJcmVuYW1lTWVzc2FnZUhlbHBlcihtc2csIGNvbXB1dGVOZXdNZXNzYWdlTmFtZShtc2csIG9sZE5hbWUsIG5ld05hbWUpKTsKLQkJCQkJCi0JCQlpZiAobXNnLmdldEVQYXJ0cygpICE9IG51bGwpCi0JCQkJcmVuYW1lUGFydHNIZWxwZXIobXNnLmdldEVQYXJ0cygpLCBvbGRNZXNzYWdlTmFtZSwgbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0JCQlQYXJ0IHBhcnQgPSAoUGFydCkgZWxlbWVudDsKLQkJCVN0cmluZyBvbGRQYXJ0TmFtZSA9IHBhcnQuZ2V0TmFtZSgpOwotCQkJCi0JCQlpZiAob2xkUGFydE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlyZW5hbWVyID0gbmV3IFJlbmFtZUFjdGlvbihlbGVtZW50LCBuZXdOYW1lKTsKLQkJCXJlbmFtZXIucnVuKCk7Ci0JCQkKLS8vCQkJUmVuYW1lIEVsZW1lbnRzCi0JCQlyZW5hbWVYU0RFbGVtZW50KHBhcnQsIG9sZFBhcnROYW1lLCBuZXdOYW1lKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUG9ydCkgewotCQkJUG9ydCBwb3J0ID0gKFBvcnQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgb2xkUG9ydE5hbWUgPSBwb3J0LmdldE5hbWUoKTsKLQkJCQotCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24oZWxlbWVudCwgbmV3TmFtZSk7Ci0JCQlyZW5hbWVyLnJ1bigpOwotCi0vLwkJCVJlbmFtZSBCaW5kaW5nCi0JCQlCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0JCQlpZiAoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMob2xkUG9ydE5hbWUpKSB7Ci0JCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24oYmluZGluZywgbmV3TmFtZSk7CQotCQkJCXJlbmFtZXIucnVuKCk7Ci0JCQl9Ci0JCX0KLQkJZW5kUmVjb3JkaW5nKCk7Ci0JfQotCQotCS8vIGJvb2xlYW4gaXNJbnB1dE91dHB1dCBzaG91bGQgYmUgc2V0IHRvIHRydWUgaWYgdGhlIHBhcnQgaXMgYW4gSW5wdXQgb3IgT3V0cHV0LgotCS8vIFNldCBmYWxzZSBpZiB0aGUgcGFydCBpcyBhIEZhdWx0LgotCXByaXZhdGUgdm9pZCByZW5hbWVQYXJ0c0hlbHBlcihMaXN0IHBhcnRzTGlzdCwgU3RyaW5nIG9sZFN1YlN0cmluZywgU3RyaW5nIG5ld1N1YlN0cmluZywgYm9vbGVhbiBpc0lucHV0T3V0cHV0KSB7Ci0JCVJlbmFtZUFjdGlvbiByZW5hbWVyOwotCQkKLQkJaWYgKHBhcnRzTGlzdCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBwSXQgPSBwYXJ0c0xpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChwSXQuaGFzTmV4dCgpKSB7Ci0JCQkJUGFydCBwYXJ0ID0gKFBhcnQpIHBJdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIG9sZFBhcnROYW1lID0gcGFydC5nZXROYW1lKCk7Ci0JCQkJCi0JCQkJaWYgKGlzUGFydE5hbWVHZW5lcmF0ZWQob2xkUGFydE5hbWUsIG9sZFN1YlN0cmluZykpIHsKLQkJCQkJU3RyaW5nIG5ld1BhcnROYW1lOwotCQkJCQlpZiAoaXNJbnB1dE91dHB1dCkgewotCQkJCQkJbmV3UGFydE5hbWUgPSBjb21wdXRlTmV3UGFydE5hbWUocGFydCwgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbmV3UGFydE5hbWUgPSBjb21wdXRlTmV3RmF1bHRQYXJ0TmFtZShwYXJ0LCBvbGRTdWJTdHJpbmcsIG5ld1N1YlN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJlbmFtZXIgPSBuZXcgUmVuYW1lQWN0aW9uKHBhcnQsIG5ld1BhcnROYW1lKTsKLQkJCQkJcmVuYW1lci5ydW4oKTsKLQkJCQkJCi0JCQkJCS8vIFJlbmFtZSBFbGVtZW50cwotCQkJCQlyZW5hbWVYU0RFbGVtZW50KHBhcnQsIG9sZFBhcnROYW1lLCBuZXdQYXJ0TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBQYXJ0IG5hbWUgd2hlbiB0aGUgRmF1bHQgbmFtZSBpcyBjaGFuZ2VkLiAgT25seQotCS8vIGNoYW5nZSB0aGUgUGFydCBuYW1lIGlmIHRoZSBwYXJ0IG5hbWUgaXMgYSBnZW5lcmF0ZWQgbmFtZS4KLQkvLyBDb21wYXJlIHRvIHJlbmFtZVBhcnRzSGVscGVyKCkuICBUaGUgcmVuYW1lUGFydHNIZWxwZXIoKSBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBGYXVsdAotCS8vIGhhcyBOT1QgYmVlbiByZW5hbWVkLCByYXRoZXIsIGl0IGlzIHRyaWdnZXJlZCBieSBzb21lIG90aGVyIG5hbWluZyAoZXguIE9wZXJhdGlvbgotCS8vIHJlbmFtaW5nKS4gIEl0IHdpbGwgdXBkYXQgSW5wdXQvT3V0cHV0LCBBTkQgRmF1bHQgUGFydHMuCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZUZhdWx0UGFydHMoTGlzdCBwYXJ0c0xpc3QsIFN0cmluZyBiYXNlTmFtZSwgU3RyaW5nIG9sZFN1YlN0cmluZywgU3RyaW5nIG5ld1N1YlN0cmluZykgewotCQlSZW5hbWVBY3Rpb24gcmVuYW1lcjsKLQkJCi0JCWlmIChwYXJ0c0xpc3QgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgcEl0ID0gcGFydHNMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAocEl0Lmhhc05leHQoKSkgewotCQkJCVBhcnQgcGFydCA9IChQYXJ0KSBwSXQubmV4dCgpOwotCQkJCVN0cmluZyBvbGRQYXJ0TmFtZSA9IHBhcnQuZ2V0TmFtZSgpOwotCQkJCQotCQkJCWlmIChpc1BhcnROYW1lR2VuZXJhdGVkKG9sZFBhcnROYW1lLCBiYXNlTmFtZSwgb2xkU3ViU3RyaW5nKSkgewotCQkJCQlTdHJpbmcgbmV3UGFydE5hbWU7Ci0JCQkJCW5ld1BhcnROYW1lID0gY29tcHV0ZU5ld0ZhdWx0UGFydE5hbWUocGFydCwgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcpOwotCQkJCQlyZW5hbWVyID0gbmV3IFJlbmFtZUFjdGlvbihwYXJ0LCBuZXdQYXJ0TmFtZSk7Ci0JCQkJCXJlbmFtZXIucnVuKCk7Ci0JCQkJCQotCQkJCQkvLyBSZW5hbWUgRWxlbWVudHMKLQkJCQkJcmVuYW1lWFNERWxlbWVudChwYXJ0LCBvbGRQYXJ0TmFtZSwgbmV3UGFydE5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBjb21wdXRlTmV3TWVzc2FnZU5hbWUoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgb2xkU3ViU3RyaW5nLCBTdHJpbmcgbmV3U3ViU3RyaW5nKSB7Ci0JCVN0cmluZyBzdHJpbmcgPSBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCXJldHVybiByZXBsYWNlU2VjdGlvbldpdGhTdWJTdHJpbmcoc3RyaW5nLCBvbGRTdWJTdHJpbmcsIG5ld1N1YlN0cmluZywgMCk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZU5ld0ZhdWx0TWVzc2FnZU5hbWUoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgb2xkU3ViU3RyaW5nLCBTdHJpbmcgbmV3U3ViU3RyaW5nKSB7Ci0JCVN0cmluZyBzdHJpbmcgPSBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCXJldHVybiByZXBsYWNlU2VjdGlvbldpdGhTdWJTdHJpbmcoc3RyaW5nLCBvbGRTdWJTdHJpbmcsIG5ld1N1YlN0cmluZywgMSk7CQkKLQl9Ci0JCi0JLy8gTWV0aG9kIGZvciBJbnB1dCwgT3V0cHV0LCBhbmQgRmF1bHQgUGFydHMKLQkvLyBTZWUgY29tcHV0ZU5ld0ZhdWx0UGFydE5hbWUoKSBmb3IgY29tcGFyaXNvbgotCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVOZXdQYXJ0TmFtZShQYXJ0IHBhcnQsIFN0cmluZyBvbGRTdWJTdHJpbmcsIFN0cmluZyBuZXdTdWJTdHJpbmcpIHsKLQkJU3RyaW5nIHN0cmluZyA9IHBhcnQuZ2V0TmFtZSgpOwotCQlyZXR1cm4gcmVwbGFjZVNlY3Rpb25XaXRoU3ViU3RyaW5nKHN0cmluZywgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcsIDApOwkJCi0JfQotCQotCS8vIE1ldGhvZCBmb3IgRmF1bHQgUGFydHMKLQkvLyBUaGlzIG1ldGhvZCBiZWhhdmVzIGluIHRoZSBleGFjdCBzYW1lIHdheSBhcyBjb21wdXRlTmV3UGFydE5hbWUoKSBleGNlcHQgaXQgc3RhcnRzIHNlYXJjaGluZyBmb3IgYSBtYXRjaAotCS8vIGFmdGVyIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlcnMgd2hvIHdpc2ggdG8gcmVuYW1lIGEgZ2VuZXJhdGVkIChGYXVsdCkgcGFydAotCS8vIHdoZXJlIHRoZSBGYXVsdCBuYW1lIGhhcyBjaGFuZ2VkLiAgV2Ugc3RhcnQgb3VyIHNlYXJjaCBhZnRlciB0aGUgZmlyc3QgY2hhcmFjdGVyIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBuYW1lCi0JLy8gb2YgdGhlIHBhcnQgaXMgYnVpbHQgYnkgYXBwZW5kaW5nIHRoZSBGYXVsdCBuYW1lIGFmdGVyIHRoZSBPcGVyYXRpb24gbmFtZS4KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlTmV3RmF1bHRQYXJ0TmFtZShQYXJ0IHBhcnQsIFN0cmluZyBvbGRTdWJTdHJpbmcsIFN0cmluZyBuZXdTdWJTdHJpbmcpIHsKLQkJU3RyaW5nIHN0cmluZyA9IHBhcnQuZ2V0TmFtZSgpOwotCQlyZXR1cm4gcmVwbGFjZVNlY3Rpb25XaXRoU3ViU3RyaW5nKHN0cmluZywgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcsIDEpOwkJCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VTZWN0aW9uV2l0aFN1YlN0cmluZyhTdHJpbmcgZnVsbFN0cmluZywgU3RyaW5nIG9sZFN1YlN0cmluZywgU3RyaW5nIG5ld1N1YlN0cmluZywgaW50IHN0YXJ0U2VhcmNoSW5kZXgpIHsKLQkJU3RyaW5nQnVmZmVyIGZ1bGxTQiA9IG5ldyBTdHJpbmdCdWZmZXIoZnVsbFN0cmluZyk7Ci0JCWludCBpbmRleCA9IGZ1bGxTQi5pbmRleE9mKG9sZFN1YlN0cmluZywgc3RhcnRTZWFyY2hJbmRleCk7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQlyZXR1cm4gZnVsbFNCLnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgb2xkU3ViU3RyaW5nLmxlbmd0aCgpLCBuZXdTdWJTdHJpbmcpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCXJldHVybiAiIjsKLQl9Ci0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21tb25OYW1lR2VuZXJhdG9yQ2hlY2soU3RyaW5nIHRhcmdldE5hbWUsIFN0cmluZyBiYXNlTmFtZSwgU3RyaW5nIGFwcGVuZE5hbWUpIHsKLQkJLy8gRmlyc3QgY3JpdGVyaWEgaXMgdGFyZ2V0TmFtZSBtdXN0IHN0YXJ0IHdpdGggdGhlIGJhc2VOYW1lCi0JCWlmICghdGFyZ2V0TmFtZS5zdGFydHNXaXRoKGJhc2VOYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlpZiAoYXBwZW5kTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBTZWNvbmQgY3JpdGVyaWEuICBUaGUgYXBwZW5kZWQgbmFtZSBtdXN0IGJlIGluIHRoZSB0YXJnZXROYW1lIGFuZCBiZWdpbiByaWdodAotCQkJLy8gYWZ0ZXIgdGhlIGJhc2VOYW1lIGxvY2F0aW9uCi0JCQlpZiAoIXRhcmdldE5hbWUuc3RhcnRzV2l0aChhcHBlbmROYW1lLCBiYXNlTmFtZS5sZW5ndGgoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQkKLQkJLy8gVGhpcmQgY3JpdGVyaWEgKGlmIG5lY2Vzc2FyeSkuICBJZiBiYXNlTmFtZSArIGFwcGVuZE5hbWUgaXMgc2hvcnRlciB0aGFuIHRhcmdldE5hbWUsCi0JCS8vIHRoZW4gdGhlcmUgbXVzdCBiZSAnZXh0cmEnIGNoYXJhY3RlcnMgYXQgdGhlIGVuZCBvZiB0YXJnZXROYW1lLiAgVGhlc2UgY2hhcmFjdGVycyBtdXN0Ci0JCS8vIG1ha2UgdXAgYW4gaW50ZWdlci4gIElmIG5vdCwgaXQgaXMgbm90IGEgZ2VuZXJhdGVkIHN0cmluZy4KLQkJaW50IHN1Ykxlbmd0aCA9IGJhc2VOYW1lLmxlbmd0aCgpICsgYXBwZW5kTmFtZS5sZW5ndGgoKTsKLQkJaWYgKHRhcmdldE5hbWUubGVuZ3RoKCkgPiBzdWJMZW5ndGgpIHsKLQkJCS8vIFdlIGhhdmUgJ2V4dHJhJyBjaGFyYWN0ZXJzCi0JCQlTdHJpbmcgZXh0cmFzID0gdGFyZ2V0TmFtZS5zdWJzdHJpbmcoc3ViTGVuZ3RoKTsKLQkJCQotCQkJaWYoIWlzRGlnaXQoZXh0cmFzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPcGVyYXRpb25OYW1lR2VuZXJhdGVkKFN0cmluZyBvcE5hbWUsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBvcE5hbWUuZXF1YWxzKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChTdHJpbmcgbXNnTmFtZSwgU3RyaW5nIGJhc2VOYW1lLCBTdHJpbmcgYXBwZW5kTmFtZSkgewotCQlyZXR1cm4gY29tbW9uTmFtZUdlbmVyYXRvckNoZWNrKG1zZ05hbWUsIGJhc2VOYW1lLCBhcHBlbmROYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5wdXRPdXRwdXROYW1lR2VuZXJhdGVkKFN0cmluZyBpbk91dE5hbWUsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBpbk91dE5hbWUuZXF1YWxzKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYXVsdE5hbWVHZW5lcmF0ZWQoU3RyaW5nIGZhdWx0TmFtZSwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZhdWx0TmFtZS5lcXVhbHMobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhcnROYW1lR2VuZXJhdGVkKFN0cmluZyBwYXJ0TmFtZSwgU3RyaW5nIGJhc2VOYW1lKSB7Ci0JCXJldHVybiBjb21tb25OYW1lR2VuZXJhdG9yQ2hlY2socGFydE5hbWUsIGJhc2VOYW1lLCAiIik7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1BhcnROYW1lR2VuZXJhdGVkKFN0cmluZyBwYXJ0TmFtZSwgU3RyaW5nIGJhc2VOYW1lLCBTdHJpbmcgYXBwZW5kTmFtZSkgewotCQlyZXR1cm4gY29tbW9uTmFtZUdlbmVyYXRvckNoZWNrKHBhcnROYW1lLCBiYXNlTmFtZSwgYXBwZW5kTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWdpdChTdHJpbmcgc3RyaW5nKSB7Ci0JCWJvb2xlYW4gclZhbHVlID0gdHJ1ZTsKLQkJY2hhcltdIGNoYXJzID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGFycy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzRGlnaXQoY2hhcnNbaW5kZXhdKSkgewotCQkJCXJWYWx1ZSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gclZhbHVlOwotCX0KLQkKLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhaWQgaW4gcmVuYW1pbmcgYSBtZXNzYWdlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZU1lc3NhZ2VIZWxwZXIoTWVzc2FnZSBtc2csIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUxpc3QgbWVzc2FnZVJlZnMgPSBnZXRSZWZlcmVuY2luZ01lc3NhZ2VSZWZlcmVuY2VzKG1zZywgZ2V0QWxsTWVzc2FnZVJlZmVyZW5jZXMoKSk7Ci0JCQotCQlSZW5hbWVBY3Rpb24gcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24obXNnLCBuZXdOYW1lKTsKLQkJcmVuYW1lci5ydW4oKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVzc2FnZVJlZnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmZXJlbmNlID0gKE1lc3NhZ2VSZWZlcmVuY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW1lc3NhZ2VSZWZlcmVuY2Uuc2V0RU1lc3NhZ2UobXNnKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0UmVmZXJlbmNpbmdNZXNzYWdlUmVmZXJlbmNlcyhNZXNzYWdlIG1zZywgTGlzdCBtZXNzYWdlUmVmcykgewotCQlWZWN0b3IgcmVmZXJlbmNlc1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQkJUU5hbWUgbWVzc2FnZVFOYW1lID0gbXNnLmdldFFOYW1lKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVzc2FnZVJlZnMuaXRlcmF0b3IoKTsKLQkJCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZmVyZW5jZSA9IChNZXNzYWdlUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobWVzc2FnZVJlZmVyZW5jZS5nZXRFTWVzc2FnZSgpICE9IG51bGwgJiYgbWVzc2FnZVFOYW1lLmVxdWFscyhtZXNzYWdlUmVmZXJlbmNlLmdldEVNZXNzYWdlKCkuZ2V0UU5hbWUoKSkpIHsKLQkJCQlyZWZlcmVuY2VzVmVjdG9yLmFkZEVsZW1lbnQobWVzc2FnZVJlZmVyZW5jZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZWZlcmVuY2VzVmVjdG9yOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0QWxsTWVzc2FnZVJlZmVyZW5jZXMoKSB7Ci0JCWlmIChtZXNzYWdlUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlUmVmZXJlbmNlcyA9IG5ldyBWZWN0b3IoKTsKLQkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoV1NETEVsZW1lbnQpIGVsZW1lbnQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLQkJCUxpc3QgcG9ydFR5cGVzID0gZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCk7Ci0JCQotCQkJaWYgKHBvcnRUeXBlcyAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgcG9ydFR5cGVJdGVyYXRvciA9IHBvcnRUeXBlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChwb3J0VHlwZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlMaXN0IG9wZXJhdGlvbnNMaXN0ID0gKChQb3J0VHlwZSkgcG9ydFR5cGVJdGVyYXRvci5uZXh0KCkpLmdldEVPcGVyYXRpb25zKCk7Ci0JCQkJCQotCQkJCQlpZiAob3BlcmF0aW9uc0xpc3QgIT0gbnVsbCkgewotCQkJCQkJSXRlcmF0b3Igb3BlcmF0aW9uc0l0ZXJhdG9yID0gb3BlcmF0aW9uc0xpc3QuaXRlcmF0b3IoKTsKLQkJCQkJCXdoaWxlIChvcGVyYXRpb25zSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJbWVzc2FnZVJlZmVyZW5jZXMuYWRkQWxsKGdldEFsbE1lc3NhZ2VSZWZlcmVuY2VzKChPcGVyYXRpb24pIG9wZXJhdGlvbnNJdGVyYXRvci5uZXh0KCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG1lc3NhZ2VSZWZlcmVuY2VzOwotCX0KLQkKLQlwcml2YXRlIFZlY3RvciBnZXRBbGxNZXNzYWdlUmVmZXJlbmNlcyhPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCVZlY3RvciBpb2ZzID0gbmV3IFZlY3RvcigpOwotCQlJdGVyYXRvciBpdCA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJaW9mcy5hZGRFbGVtZW50KGl0Lm5leHQoKSk7Ci0JCX0KLQkJCi0JCWlmIChpb2ZzID09IG51bGwpCi0JCQlpb2ZzID0gbmV3IFZlY3RvcigpOwotCQkKLQkJaWYgKG9wZXJhdGlvbi5nZXRFSW5wdXQoKSAhPSBudWxsKQotCQkJaW9mcy5hZGRFbGVtZW50KG9wZXJhdGlvbi5nZXRFSW5wdXQoKSk7Ci0JCQotCQlpZiAob3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKQotCQkJaW9mcy5hZGRFbGVtZW50KG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkpOwotCQkKLQkJcmV0dXJuIGlvZnM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW5hbWVYU0RFbGVtZW50KFBhcnQgcGFydCwgU3RyaW5nIG9sZFhTRE5hbWUsIFN0cmluZyBuZXdYU0ROYW1lKSB7Ci0JCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSBwYXJ0LmdldEVsZW1lbnREZWNsYXJhdGlvbigpOwotCQlpZiAoZWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwgJiYgb2xkWFNETmFtZS5lcXVhbHMoZWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKSkpIHsKLQkJCXJlbmFtZUVsZW1lbnREZWNsYXJhdGlvbkhlbHBlcihlbGVtZW50RGVjbGFyYXRpb24sIG9sZFhTRE5hbWUsIG5ld1hTRE5hbWUpOwotCQkJCi0JCQkvLyBIZXJlIHdlIHJlbmFtZSB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JCQkvLwotCQkJUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUocGFydC5nZXRFbGVtZW50TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBuZXdYU0ROYW1lKTsKLQkJCXBhcnQuc2V0RWxlbWVudE5hbWUocW5hbWUpOwkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW5hbWVFbGVtZW50RGVjbGFyYXRpb25IZWxwZXIoWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiwgU3RyaW5nIG9sZFhTRE5hbWUsIFN0cmluZyBuZXdYU0ROYW1lKSB7Ci0JCWlmIChlbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCAmJiBlbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhvbGRYU0ROYW1lKSkgewotCQkJZWxlbWVudERlY2xhcmF0aW9uLnNldE5hbWUobmV3WFNETmFtZSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjIwMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Tb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLklFeHRlbmRlZENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETE11bHRpUGFnZUVkaXRvclBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBTb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSUV4dGVuZGVkQ29udHJpYnV0b3IgewotCi0JcHJvdGVjdGVkIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIFdTRExNdWx0aVBhZ2VFZGl0b3JQYXJ0IG11bHRpUGFnZUVkaXRvciA9IG51bGw7Ci0KLQkvLyBFZGl0b3JFeHRlbnNpb24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElFeHRlbmRlZENvbnRyaWJ1dG9yIGV4dGVuZGVkQ29udHJpYnV0b3I7Ci0KLQlwdWJsaWMgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBuZXcgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0KLQkJLy8gUmVhZCBhY3Rpb24gZXh0ZW5zaW9ucy4KLQkJRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyKCk7Ci0JCWV4dGVuZGVkQ29udHJpYnV0b3IgPSBidWlsZGVyLnJlYWRBY3Rpb25FeHRlbnNpb25zKEVESVRPUl9JRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCXN1cGVyLmluaXQoYWN0aW9uQmFycyk7Ci0KLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkgewotCQkJaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKGFjdGlvbkJhcnMpOwotCQkJaW5pdFNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKGFjdGlvbkJhcnMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5pbml0KGFjdGlvbkJhcnMsIGdldFBhZ2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJaWYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5pbml0KGFjdGlvbkJhcnMsIGdldFBhZ2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKQotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuZGlzcG9zZSgpOwotCi0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKQotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IuZGlzcG9zZSgpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLQotCQlhZGRUb01lbnUobWVudSk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElFeHRlbmRlZENvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY29udHJpYnV0ZVRvUG9wdXBNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0KLQkJYWRkVG9Qb3B1cE1lbnUobWVudSk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvUG9wdXBNZW51KG1lbnUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUG9wdXBNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQlhZGRUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvU3RhdHVzTGluZShtYW5hZ2VyKTsKLQotCQlhZGRUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvU3RhdHVzTGluZShtYW5hZ2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElFeHRlbmRlZENvbnRyaWJ1dG9yI3VwZGF0ZVRvb2xiYXJBY3Rpb25zKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVUb29sYmFyQWN0aW9ucygpIHsKLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IudXBkYXRlVG9vbGJhckFjdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCS8vIHNhdmUgbXVsdGlQYWdlRWRpdG9yIGJlZm9yZSBjYWxsaW5nIHN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpCi0JCS8vIHN1cGVyLnNldEFjdGl2ZUVkaXRvciB3aWxsIGNhbGwgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpCi0JCS8vIG11bHRpUGFnZUVkaXRvciBpcyBuZWVkZWQgaW4gc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpCi0JCWlmICh0YXJnZXRFZGl0b3IgaW5zdGFuY2VvZiBXU0RMTXVsdGlQYWdlRWRpdG9yUGFydCkKLQkJCW11bHRpUGFnZUVkaXRvciA9IChXU0RMTXVsdGlQYWdlRWRpdG9yUGFydCkgdGFyZ2V0RWRpdG9yOwotCi0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpOwotCi0JCXVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJLy8gVGhpcyBjb250cmlidXRvciBpcyBkZXNpZ25lZCBmb3IgU3RydWN0dXJlZFRleHRNdWx0aVBhZ2VFZGl0b3JQYXJ0LgotCQkvLyBUbyBzYWZlLWd1YXJkIHRoaXMgZnJvbSBwcm9ibGVtcyBjYXVzZWQgYnkgdW5leHBlY3RlZCB1c2FnZSBieSBvdGhlciBlZGl0b3JzLCB0aGUgZm9sbG93aW5nCi0JCS8vIGNoZWNrIGlzIGFkZGVkLgotCQlpZiAobXVsdGlQYWdlRWRpdG9yICE9IG51bGwpIHsKLQkJCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCAmJiBhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcikKLQkJCQlhY3RpdmF0ZVNvdXJjZVBhZ2UoYWN0aXZlRWRpdG9yKTsKLQkJCWVsc2UKLQkJCQlhY3RpdmF0ZURlc2lnblBhZ2UoYWN0aXZlRWRpdG9yKTsKLQkJfQotCi0JCXVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0KLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldEFjdGlvbkJhcnMoKTsKLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkgewotCQkJLy8gdXBkYXRlIG1lbnUgYmFyIGFuZCB0b29sIGJhcgotCQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZURlc2lnblBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsICYmIGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJfQotCi0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsICYmIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQkvLyBpZiBkZXNpZ24gcGFnZSBpcyBub3QgcmVhbGx5IGFuIElFZGl0b3JQYXJ0LCBhY3RpdmVFZGl0b3IgPT0gbnVsbCwgc28gcGFzcyBpbiBtdWx0aVBhZ2VFZGl0b3IgaW5zdGVhZCAoZDI4MjQxNCkKLQkJCWlmIChhY3RpdmVFZGl0b3IgPT0gbnVsbCkgewotCQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihtdWx0aVBhZ2VFZGl0b3IpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCQl9Ci0JCQkoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVTb3VyY2VQYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlpZiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBpbnN0YW5jZW9mIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCX0KLQotCQlpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCQkoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Tb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyMmY0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yWE1MOwotCi0KLS8qKgotICogU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgZm9yIG11bHRpIHBhZ2UgZWRpdG9yJ3Mgc291cmNlIHBhZ2UgY29udHJpYnV0b3IuCi0gKgotICogVXNlIFdTRExFZGl0b3JBY3Rpb25Db250cmlidXRvciBmb3Igc2luZ2xlIHBhZ2UgZWRpdG9yCi0gKiAqLwotcHVibGljIGNsYXNzIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yWE1MIHsKLQotCXByaXZhdGUgSUFjdGlvbkJhcnMgZkJhcnM7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYWxsczoKLQkgKiA8dWw+Ci0JICogIDxsaT48Y29kZT5jb250cmlidXRlVG9NZW51PC9jb2RlPiB3aXRoIDxjb2RlPmJhcnM8L2NvZGU+JyBtZW51IG1hbmFnZXI8L2xpPgotCSAqICA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvVG9vbEJhcjwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicgdG9vbCBiYXIKLQkgKiAgICBtYW5hZ2VyPC9saT4KLQkgKiAgPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmU8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nIHN0YXR1cyBsaW5lCi0JICogICAgbWFuYWdlcjwvbGk+Ci0JICogPC91bD4KLQkgKiBUaGUgZ2l2ZW4gYWN0aW9uIGJhcnMgYXJlIGFsc28gcmVtZW1iZXJlZCBhbmQgbWFkZSBhY2Nlc3NpYmxlIHZpYSAKLQkgKiA8Y29kZT5nZXRBY3Rpb25CYXJzPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYmFycyB0aGUgYWN0aW9uIGJhcnMKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMpIHsKLQkJZkJhcnMgPSBiYXJzOwotCQljb250cmlidXRlVG9NZW51KGJhcnMuZ2V0TWVudU1hbmFnZXIoKSk7Ci0JCWNvbnRyaWJ1dGVUb1Rvb2xCYXIoYmFycy5nZXRUb29sQmFyTWFuYWdlcigpKTsKLQkJY29udHJpYnV0ZVRvU3RhdHVzTGluZShiYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBjb250cmlidXRvcidzIGFjdGlvbiBiYXJzLgotCSAqCi0JICogQHJldHVybiB0aGUgYWN0aW9uIGJhcnMKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKLQkJcmV0dXJuIGZCYXJzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyYTY0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExUZXh0RWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgV1NETEFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IKLXsKLSAgcHJvdGVjdGVkIFdTRExUZXh0RWRpdG9yIHRleHRFZGl0b3I7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBXU0RMQWN0aW9uQmFyQ29udHJpYnV0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikKLSAgewotICAgIHN1cGVyLnNldEFjdGl2ZVBhZ2UoYWN0aXZlRWRpdG9yKTsKLQotICAgIC8vIGFsd2F5cyBlbmFibGUgdW5kby9yZWRvIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggcGFnZSB3ZSdyZSBvbi4gIFRoZSB1bmRvL3JlZG8gY29tZXMgZnJvbSB0aGUgZWRpdG9yCi0gICAgLy8gICAgCi0gICAgdXBkYXRlQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuVU5ETywgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ETywgdHJ1ZSk7Ci0gICAgdXBkYXRlQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuUkVETywgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETywgdHJ1ZSk7Ci0KLSAgICAvLyB0dXJuIHRoZXNlIG9mZiBzbyB0aGF0IHRoZSBhY3Rpb25oYW5kbGVyIHdpbGwgaGFuZGxlIGl0IGZvciB1cwotICAgIC8vCi0gICAgLy91cGRhdGVBY3Rpb24oSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DVVQsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkNVVCwgZmFsc2UpOwotICAgIC8vdXBkYXRlQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ09QWSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQ09QWSwgZmFsc2UpOwotICAgIC8vdXBkYXRlQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuUEFTVEUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlBBU1RFLCBmYWxzZSk7Ci0KLSAgICBnZXRBY3Rpb25CYXJzKCkudXBkYXRlQWN0aW9uQmFycygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQWN0aW9uKFN0cmluZyBnbG9iYWxBY3Rpb25JZCwgU3RyaW5nIHRleHRFZGl0b3JBY3Rpb25JZCwgYm9vbGVhbiBlbmFibGUpCi0gIHsKLSAgICBnZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihnbG9iYWxBY3Rpb25JZCwgZW5hYmxlID8gZ2V0QWN0aW9uKHRleHRFZGl0b3IsIHRleHRFZGl0b3JBY3Rpb25JZCkgOiBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBhY3Rpb24gcmVnaXN0ZWQgd2l0aCB0aGUgZ2l2ZW4gdGV4dCBlZGl0b3IuCi0gICAqIEByZXR1cm4gSUFjdGlvbiBvciBudWxsIGlmIGVkaXRvciBpcyBudWxsLgotICAgKi8KLSAgcHJvdGVjdGVkIElBY3Rpb24gZ2V0QWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgU3RyaW5nIGFjdGlvbklEKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIChlZGl0b3IgPT0gbnVsbCA/IG51bGwgOiBlZGl0b3IuZ2V0QWN0aW9uKGFjdGlvbklEKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpCi0gIHsKLSAgICBzdXBlci5hZGRUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoIldTRExFZGl0b3IiKSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpCi0gIHsKLSAgICBzdXBlci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLSAgICB0ZXh0RWRpdG9yID0gbnVsbDsKLSAgICBpZiAoYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgV1NETEVkaXRvcikKLSAgICB7Ci0gICAgICB0ZXh0RWRpdG9yID0gKChXU0RMRWRpdG9yKSBhY3RpdmVFZGl0b3IpLmdldFdTRExUZXh0RWRpdG9yKCk7Ci0gICAgfQotICAgIAotICAgIHVwZGF0ZUFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlVORE8sIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIHRydWUpOwotICAgIHVwZGF0ZUFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlJFRE8sIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8sIHRydWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExEcmFnQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExEcmFnQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODNjMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRHJhZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5XU0RMVHJlZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETERyYWdBY3Rpb24gZXh0ZW5kcyBCYXNlTm9kZUFjdGlvbiB7Ci0JcHJvdGVjdGVkIFdTRExUcmVlTm9kZUVkaXRQYXJ0IG1vdmluZ0NoaWxkRWRpdFBhcnQ7Ci0JcHJvdGVjdGVkIFBvaW50IHBvaW50ZXJMb2NhdGlvbjsKLQkKLQkvKgotCSAqIFN1Yi1jbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXJ1bigpOwotCX0KLQkKLQkvKgotCSAqIFN1Yi1jbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICIiOwotCX0KLQkKLQkvKgotCSAqIFN1Yi1jbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBTdWItY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0RmVlZGJhY2tGaWd1cmUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETERyYWdSZW9yZGVyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExEcmFnUmVvcmRlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFkOWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETERyYWdSZW9yZGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLldTRExEcmFnQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLldTRExDb21wb25lbnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLldTRExUcmVlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgV1NETERyYWdSZW9yZGVyQWN0aW9uIGV4dGVuZHMgV1NETERyYWdBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IG1vdmluZ0NoaWxkOwotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgbmV3UGFyZW50OwotICBwcm90ZWN0ZWQgV1NETFRyZWVOb2RlRWRpdFBhcnQgbGVmdFNpYmxpbmdFZGl0UGFydDsKLSAgcHJvdGVjdGVkIFdTRExUcmVlTm9kZUVkaXRQYXJ0IHJpZ2h0U2libGluZ0VkaXRQYXJ0OwotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgbGVmdFNpYkVsZW1lbnQ7Ci0gIHByb3RlY3RlZCBXU0RMRWxlbWVudCByaWdodFNpYkVsZW1lbnQ7Ci0gIHByb3RlY3RlZCBib29sZWFuIGNhbk5ldmVyRXhlY3V0ZSA9IGZhbHNlOwotICAKLSAgcHVibGljIFdTRExEcmFnUmVvcmRlckFjdGlvbihXU0RMVHJlZU5vZGVFZGl0UGFydCBtb3ZpbmdDaGlsZEVkaXRQYXJ0LCBFZGl0UGFydCBwb2ludGVyRWRpdFBhcnQsIFBvaW50IHBvaW50ZXJMb2NhdGlvbikgewotICAJdGhpcy5tb3ZpbmdDaGlsZEVkaXRQYXJ0ID0gbW92aW5nQ2hpbGRFZGl0UGFydDsKLSAgCXRoaXMucG9pbnRlckxvY2F0aW9uID0gcG9pbnRlckxvY2F0aW9uOwotCi0JRWRpdFBhcnQgcG9zc2libGVQYXJlbnQgPSBnZXRQYXJlbnRFZGl0UGFydChwb2ludGVyRWRpdFBhcnQpOwotCQotCWlmICghKHBvc3NpYmxlUGFyZW50IGluc3RhbmNlb2YgV1NETFRyZWVOb2RlRWRpdFBhcnQpKSB7Ci0JCWNhbk5ldmVyRXhlY3V0ZSA9IHRydWU7Ci0JCXJldHVybjsKLQl9Ci0gIAkKLQlXU0RMVHJlZU5vZGVFZGl0UGFydCB0YXJnZXRQYXJlbnRFZGl0UGFydCA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCkgcG9zc2libGVQYXJlbnQ7Ci0Jd3NkbEVkaXRvciA9ICgoV1NETENvbXBvbmVudFZpZXdlcikgcG9zc2libGVQYXJlbnQuZ2V0Vmlld2VyKCkpLmdldFdTRExFZGl0b3IoKTsKLQkKLQlpZiAocG9pbnRlckVkaXRQYXJ0LmdldFBhcmVudCgpICE9IG51bGwpIHsKLQkJLy8gU29ydCB0aGUgc2libGluZ3MgKGFuZCBpdHNlbGYpCi0JCUxpc3QgdGFyZ2V0RWRpdFBhcnRTaWJsaW5ncyA9IHBvaW50ZXJFZGl0UGFydC5nZXRQYXJlbnQoKS5nZXRDaGlsZHJlbigpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHRhcmdldEVkaXRQYXJ0U2libGluZ3MsIG5ldyBWZXJ0aWNhbEVkaXRQYXJ0Q29tcGFyYXRvcigpKTsKLSAgCi0JCS8vIEdldCAnbGVmdCcgYW5kICdyaWdodCcgc2libGluZ3MKLQkJbGVmdFNpYmxpbmdFZGl0UGFydCA9IGdldFZlcnRpY2FsTGVmdFNpYmxpbmcodGFyZ2V0RWRpdFBhcnRTaWJsaW5ncywgbW92aW5nQ2hpbGRFZGl0UGFydCwgcG9pbnRlckxvY2F0aW9uKTsKLQkJcmlnaHRTaWJsaW5nRWRpdFBhcnQgPSBnZXRWZXJ0aWNhbFJpZ2h0U2libGluZyh0YXJnZXRFZGl0UGFydFNpYmxpbmdzLCBtb3ZpbmdDaGlsZEVkaXRQYXJ0LCBwb2ludGVyTG9jYXRpb24pOyAgICAgICAgICAgCQotCi0JCWlmIChtb3ZpbmdDaGlsZEVkaXRQYXJ0ICE9IG51bGwpCi0JCQltb3ZpbmdDaGlsZCA9IChXU0RMRWxlbWVudCkgbW92aW5nQ2hpbGRFZGl0UGFydC5nZXRNb2RlbCgpOwotCQlpZiAobGVmdFNpYmxpbmdFZGl0UGFydCAhPSBudWxsKQotCQkJbGVmdFNpYkVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIGxlZnRTaWJsaW5nRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYgKHJpZ2h0U2libGluZ0VkaXRQYXJ0ICE9IG51bGwpCi0JCQlyaWdodFNpYkVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIHJpZ2h0U2libGluZ0VkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQotCQluZXdQYXJlbnQgPSAoV1NETEVsZW1lbnQpIHRhcmdldFBhcmVudEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JfQotCWVsc2UgewotCQluZXdQYXJlbnQgPSAoV1NETEVsZW1lbnQpIHRhcmdldFBhcmVudEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCWxlZnRTaWJFbGVtZW50ID0gbnVsbDsKLQkJcmlnaHRTaWJFbGVtZW50PSBudWxsOwotCX0KLSAgfQotICAgICAgICAgICAgCi0gIHB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotICAgIGlmIChjYW5OZXZlckV4ZWN1dGUgfHwgbmV3UGFyZW50ID09IG51bGwgfHwgbW92aW5nQ2hpbGQgPT0gbnVsbCkgewotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIElucHV0KSB7Ci0gICAgCWlmICghKGxlZnRTaWJFbGVtZW50IGluc3RhbmNlb2YgRmF1bHQpICYmIG5ld1BhcmVudC5lcXVhbHMobW92aW5nQ2hpbGQuZUNvbnRhaW5lcigpKSkgewotICAgIAkJcmVzdWx0ID0gdHJ1ZTsKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIGlmIChtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIE91dHB1dCkgewotICAgIAlpZiAoIShsZWZ0U2liRWxlbWVudCBpbnN0YW5jZW9mIEZhdWx0KSAmJiBuZXdQYXJlbnQuZXF1YWxzKG1vdmluZ0NoaWxkLmVDb250YWluZXIoKSkpIHsKLSAgICAJCXJlc3VsdCA9IHRydWU7Ci0gICAgCX0KLSAgICB9Ci0gICAgZWxzZSBpZiAobW92aW5nQ2hpbGQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0gICAgCWlmIChuZXdQYXJlbnQgaW5zdGFuY2VvZiBNZXNzYWdlICYmIG5ld1BhcmVudC5lcXVhbHMobW92aW5nQ2hpbGQuZUNvbnRhaW5lcigpKSkgewotICAgIAkJcmVzdWx0ID0gdHJ1ZTsKLSAgICAJfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgIAotCi0KLSAgLyoKLSAgICogQHNlZSBJQWN0aW9uI3J1bigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gICAgYmVnaW5SZWNvcmRpbmcoKTsKLSAgCWlmIChjYW5FeGVjdXRlKCkpIHsKLSAgCQlpZiAobW92aW5nQ2hpbGQgaW5zdGFuY2VvZiBJbnB1dCkgewotICAJCQlJbnB1dCBpbnB1dCA9IChJbnB1dCkgbW92aW5nQ2hpbGQ7Ci0gIAkJCU9wZXJhdGlvbkltcGwgb3BlcmF0aW9uID0gKE9wZXJhdGlvbkltcGwpIGlucHV0LmVDb250YWluZXIoKTsKLSAgCQkJCi0gIAkJCWlmIChsZWZ0U2libGluZ0VkaXRQYXJ0ID09IG51bGwpIHsKLSAgCQkJCS8vIElucHV0L091dHB1dCBzdHlsZQotICAJCQkJc2V0SW5wdXRPdXRwdXRPcmRlcihvcGVyYXRpb24sIHRydWUpOwotICAJCQl9Ci0gIAkJCWVsc2UgewotICAJCQkJLy8gT3V0cHV0L0lucHV0IHN0eWxlCi0gIAkJCQlzZXRJbnB1dE91dHB1dE9yZGVyKG9wZXJhdGlvbiwgZmFsc2UpOwotICAJCQl9Ci0gIAkJfQotICAJCWVsc2UgaWYgKG1vdmluZ0NoaWxkIGluc3RhbmNlb2YgT3V0cHV0KSB7Ci0gCQkJT3V0cHV0IG91dHB1dCA9IChPdXRwdXQpIG1vdmluZ0NoaWxkOwotICAJCQlPcGVyYXRpb25JbXBsIG9wZXJhdGlvbiA9IChPcGVyYXRpb25JbXBsKSBvdXRwdXQuZUNvbnRhaW5lcigpOwotICAJCQkKLSAgCQkJaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgPT0gbnVsbCkgewotICAJCQkJLy8gT3V0cHV0L0lucHV0IHN0eWxlCi0gIAkJCQlzZXRJbnB1dE91dHB1dE9yZGVyKG9wZXJhdGlvbiwgZmFsc2UpOwotICAJCQl9Ci0gIAkJCWVsc2UgewotICAJCQkJLy8gSW5wdXQvT3V0cHV0IHN0eWxlCi0gIAkJCQlzZXRJbnB1dE91dHB1dE9yZGVyKG9wZXJhdGlvbiwgdHJ1ZSk7Ci0gIAkJCX0KLSAgCQl9Ci0gIAkJZWxzZSBpZiAobW92aW5nQ2hpbGQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0gIAkJCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBuZXdQYXJlbnQ7Ci0gIAkJCUxpc3QgcGFydHMgPSBtZXNzYWdlLmdldEVQYXJ0cygpOwotCi0gIAkJCXBhcnRzLnJlbW92ZShtb3ZpbmdDaGlsZCk7Ci0KLSAgCQkJaW50IGxlZnRJbmRleCA9IC0xLCByaWdodEluZGV4ID0gLTE7Ci0gIAkJCWlmIChsZWZ0U2liRWxlbWVudCAhPSBudWxsKSB7Ci0gIAkJCQlsZWZ0SW5kZXggPSBwYXJ0cy5pbmRleE9mKGxlZnRTaWJFbGVtZW50KTsKLSAgCQkJfQotICAJCQlpZiAocmlnaHRTaWJFbGVtZW50ICE9IG51bGwpIHsKLSAgCQkJCXJpZ2h0SW5kZXggPSBwYXJ0cy5pbmRleE9mKHJpZ2h0U2liRWxlbWVudCk7Ci0gIAkJCX0KLQotICAJCQlpZiAobGVmdEluZGV4ID09IC0xKSB7Ci0gIAkJCQkvLyBBZGQgbW92aW5nIGNoaWxkIHRvIHRoZSBmcm9udAotICAJCQkJcGFydHMuYWRkKDAsIG1vdmluZ0NoaWxkKTsgIAkJCQkKLSAgCQkJfQotICAJCQllbHNlIGlmIChyaWdodEluZGV4ID09IC0xKSB7Ci0gIAkJCQkvLyBBZGQgbW92aW5nIGNoaWxkIHRvIHRoZSBlbmQKLSAgCQkJCXBhcnRzLmFkZChtb3ZpbmdDaGlsZCk7Ci0gIAkJCX0KLSAgCQkJZWxzZSB7Ci0gIAkJCQkvLyBBZGQgbW92aW5nIGNoaWxkIGFmdGVyIHRoZSBvY2N1cmVuY2Ugb2YgdGhlIGxlZnQgc2libGluZwotICAJCQkJcGFydHMuYWRkKGxlZnRJbmRleCArIDEsIG1vdmluZ0NoaWxkKTsKLSAgCQkJfQotICAJCX0KLSAgCQl3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW92aW5nQ2hpbGQpKTsKLSAgCX0KLS8vICAgIGVuZFJlY29yZGluZygpOwotICB9Ci0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRGZWVkYmFja0ZpZ3VyZSgpIHsKLSAgCUlGaWd1cmUgZmVlZGJhY2tGaWd1cmUgPSBudWxsOwotICAgIGlmIChmZWVkYmFja0ZpZ3VyZSA9PSBudWxsICYmIG1vdmluZ0NoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBXU0RMVHJlZU5vZGVFZGl0UGFydCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBQb2x5bGluZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vICBwb2x5TGluZS5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9EQVNIRE9UKTsgICAgICAKLSAgICAgICgoUG9seWxpbmUpZmVlZGJhY2tGaWd1cmUpLnNldExpbmVXaWR0aCgyKTsJCi0gICAgICBkcmF3TGluZXMoKFBvbHlsaW5lKSBmZWVkYmFja0ZpZ3VyZSk7Ci0gICAgfQotICAgIAotICAJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotICB9Ci0KLSAgLyogUmV0dXJuIGEgUG9pbnRMaXN0IHdoaWNoIHdpbGwgYmUgdXNlZCB0byBhZGQgYSBmZWVkYmFjayBmaWd1cmUuICBUaGUgZmVlZGJhY2sgZmlndXJlIHdpbGwgYmUgYQotICAgKiBQb2x5bGluZSBjb21wb3NlZCBvZiB0aGUgUG9pbnRzIGluIHRoZSBQb2ludExpc3QKLSAgICovCi0gIHByaXZhdGUgUG9pbnRMaXN0IGRyYXdMaW5lcyhQb2x5bGluZSBwb2x5TGluZSkgewotICAgIFBvaW50TGlzdCBwb2ludExpc3QgPSBuZXcgUG9pbnRMaXN0KCk7IAotICAgIAotICAgIGlmIChsZWZ0U2libGluZ0VkaXRQYXJ0ICE9IG51bGwpIHsKLSAgICAJUmVjdGFuZ2xlIGxlZnRSZWN0YW5nbGUgPSBsZWZ0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCSAgIAlpbnQgeENvb3JkID0gbGVmdFJlY3RhbmdsZS54ICsgMTU7Ci0JICAJaW50IHlDb29yZCA9IGxlZnRSZWN0YW5nbGUueTsKLQkgICAJaW50IGhlaWdodCA9IGxlZnRSZWN0YW5nbGUuaGVpZ2h0OwotCSAgIAlpbnQgd2lkdGggPSBsZWZ0UmVjdGFuZ2xlLndpZHRoIC0gMTU7Ci0KLQkgICAJLy8gRHJhdyBsZWZ0IGVuZCBsaW5lCi0JICAgCWFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCArIDMsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0IC0gMyk7Ci0JICAgCWFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCAtIDMsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0KTsKLQkgICAJCi0JICAgCS8vIERyYXcgaG9yaXpvbnRhbCBsaW5lCi0JICAgCWFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIGhlaWdodCk7Ci0JICAgCQotCSAgIAkvLyBEcmF3IHJpZ2h0IGVuZCBsaW5lCi0JICAgCWFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0LCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0IC0gMyk7Ci0JICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQgKyAzKTsgICAJCi0gICAgfQotICAgIGVsc2UgaWYgKHJpZ2h0U2libGluZ0VkaXRQYXJ0ICE9IG51bGwpIHsKLSAgICAJUmVjdGFuZ2xlIHJpZ2h0UmVjdGFuZ2xlID0gcmlnaHRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0gICAgCWludCB4Q29vcmQgPSByaWdodFJlY3RhbmdsZS54ICsgMTU7Ci0gICAgCWludCB5Q29vcmQgPSByaWdodFJlY3RhbmdsZS55OwotICAgCQlpbnQgaGVpZ2h0ID0gcmlnaHRSZWN0YW5nbGUuaGVpZ2h0OwotICAgCQlpbnQgd2lkdGggPSByaWdodFJlY3RhbmdsZS53aWR0aCAtIDE1OwkKLQotICAgCQkvLyBEcmF3IGxlZnQgZW5kIGxpbmUKLQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgMywgeENvb3JkLCB5Q29vcmQgLSAzKTsKLQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkIC0gMywgeENvb3JkLCB5Q29vcmQpOwotCSAgIAkKLQkgICAJLy8gRHJhdyBob3Jpem9udGFsIGxpbmUKLQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkKTsKLQkgICAJCi0JICAgCS8vIERyYXcgcmlnaHQgZW5kIGxpbmUKLQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgLSAzKTsKLQkgIAlhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkICsgd2lkdGgsIHlDb29yZCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIDMpOyAgIAotICAgIH0KLQotICAgIHJldHVybiBwb2ludExpc3Q7Ci0gIH0gICAgICAgICAgICAgICAgICAgIAotICAKLSAgcHJvdGVjdGVkIFBvbHlsaW5lIGFkZExpbmVUb1BvbHlsaW5lKFBvbHlsaW5lIHBvbHlsaW5lLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKLQlwb2x5bGluZS5hZGRQb2ludChuZXcgUG9pbnQoeDEsIHkxKSk7Ci0JcG9seWxpbmUuYWRkUG9pbnQobmV3IFBvaW50KHgyLCB5MikpOwotCi0JcmV0dXJuIHBvbHlsaW5lOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotICAvKgotICAgKiBQcmUtY29uZGl0aW9uOiBUaGUgTGlzdCBzaWJsaW5ncyBzaG91bGQgYmUgc29ydGVkIGJ5IGl0J3MgeS1jb29yZGluYXRlIAotICAgKi8KLSAgcHJpdmF0ZSBXU0RMVHJlZU5vZGVFZGl0UGFydCBnZXRWZXJ0aWNhbFJpZ2h0U2libGluZyhMaXN0IHNpYmxpbmdzLCBXU0RMVHJlZU5vZGVFZGl0UGFydCBtb3ZpbmdFZGl0UGFydCwgUG9pbnQgcG9pbnRlckxvY2F0aW9uKSB7Ci0gIAlXU0RMVHJlZU5vZGVFZGl0UGFydCByaWdodFNpYmxpbmcgPSBudWxsOwotICAJaW50IHBvaW50ZXJZTG9jYXRpb24gPSBwb2ludGVyTG9jYXRpb24ueTsKLQotICAJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNpYmxpbmdzLnNpemUoKTsgaW5kZXgrKykgewotICAJCVdTRExUcmVlTm9kZUVkaXRQYXJ0IHNpYmxpbmcgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCk7Ci0gIAkJaW50IHNpYmxpbmdZTG9jYXRpb24gPSBzaWJsaW5nLmdldFNlbGVjdGlvbkZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpLnk7Ci0KLSAgCQlpZiAoc2libGluZ1lMb2NhdGlvbiA+IHBvaW50ZXJZTG9jYXRpb24pIHsKLSAgCQkJcmlnaHRTaWJsaW5nID0gc2libGluZzsKLSAgCQkJYnJlYWs7Ci0gIAkJfQotICAJfQotICAJCi0gIAlyZXR1cm4gcmlnaHRTaWJsaW5nOwotICB9Ci0KLSAgLyoKLSAgICogUHJlLWNvbmRpdGlvbjogVGhlIExpc3Qgc2libGluZ3Mgc2hvdWxkIGJlIHNvcnRlZCBieSBpdCdzIHktY29vcmRpbmF0ZSAKLSAgICovCi0gIHByaXZhdGUgV1NETFRyZWVOb2RlRWRpdFBhcnQgZ2V0VmVydGljYWxMZWZ0U2libGluZyhMaXN0IHNpYmxpbmdzLCBXU0RMVHJlZU5vZGVFZGl0UGFydCBtb3ZpbmdFZGl0UGFydCwgUG9pbnQgcG9pbnRlckxvY2F0aW9uKSB7Ci0gIAlXU0RMVHJlZU5vZGVFZGl0UGFydCBsZWZ0U2libGluZyA9IG51bGw7Ci0gIAlpbnQgcG9pbnRlcllMb2NhdGlvbiA9IHBvaW50ZXJMb2NhdGlvbi55OwotCi0gIAlpbnQgaW5kZXg7Ci0gIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzaWJsaW5ncy5zaXplKCk7IGluZGV4KyspIHsKLSAgCQlXU0RMVHJlZU5vZGVFZGl0UGFydCBzaWJsaW5nID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXgpOwotICAJCWludCBzaWJsaW5nWUxvY2F0aW9uID0gc2libGluZy5nZXRTZWxlY3Rpb25GaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS55OwotICAJICAJCi0gIAkJaWYgKHNpYmxpbmdZTG9jYXRpb24gPiBwb2ludGVyWUxvY2F0aW9uKSB7Ci0gIAkJCWlmIChpbmRleCA+IDApIHsKLSAgCQkJCWxlZnRTaWJsaW5nID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXggLSAxKTsKLSAgCQkJfQotCi0gIAkJCWJyZWFrOwotICAJCX0KLSAgCX0KLQotICAJaWYgKGluZGV4ID09IHNpYmxpbmdzLnNpemUoKSkgewotICAJCWxlZnRTaWJsaW5nID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXggLSAxKTsKLSAgCX0KLQotICAJcmV0dXJuIGxlZnRTaWJsaW5nOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZ2V0UGFyZW50RWRpdFBhcnQoRWRpdFBhcnQgdGFyZ2V0KQotICB7Ci0gIAlyZXR1cm4gdGFyZ2V0LmdldFBhcmVudCgpOwotICB9Ci0gIAotICAvLyBib29sZWFuIGlucHV0Rmlyc3QgPSB0cnVlIGlmIHRoZSBJbnB1dCBpcyB0aGUgZmlyc3QgaW4gdGhlIG9yZGVyIG9mIElucHV0IGFuZCBPdXRwdXQKLSAgcHJpdmF0ZSB2b2lkIHNldElucHV0T3V0cHV0T3JkZXIoT3BlcmF0aW9uSW1wbCBvcGVyYXRpb24sIGJvb2xlYW4gaW5wdXRGaXJzdCkgewotICAJLy8gV2UgbmVlZCB0byBkZXRlcm1pbmUgbW9yZSBpbmZvIGJlZm9yZSB3ZSBjYW4gc2V0IHRoZSBzdHlsZQkKLSAgCWlmIChpbnB1dEZpcnN0ICYmIG9wZXJhdGlvbi5nZXRFSW5wdXQoKSAhPSBudWxsKSB7Ci0gIAkJLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW4gT3V0cHV0Ci0gIAkJaWYgKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkgIT0gbnVsbCkgewotICAJCQkvLyBPcmRlciBpczogSW5wdXQsIE91dHB1dAotLyogIAkJCQotICAJCQlOb2RlIG9wZXJhdGlvbk5vZGUgPSBvcGVyYXRpb24uZ2V0RWxlbWVudCgpOwkJCi0gIAkJCU5vZGVMaXN0IGNoaWxkTm9kZUxpc3QgPSBvcGVyYXRpb25Ob2RlLmdldENoaWxkTm9kZXMoKTsKLSAgCQkJCi0gIAkJCU5vZGUgaW5wdXROb2RlID0gb3BlcmF0aW9uLmdldEVJbnB1dCgpLmdldEVsZW1lbnQoKTsKLSAgCQkJTm9kZSBvdXRwdXROb2RlID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKS5nZXRFbGVtZW50KCk7Ci0gIAkJCQotICAJCQlOb2RlIGlucHV0VGV4dE5vZGUgPSBpbnB1dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgCQkJTm9kZSBvdXRwdXRUZXh0Tm9kZSA9IG91dHB1dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgCQkJCi0gIAkJCWludCBpbnB1dE5vZGVJbmRleCA9IGdldE5vZGVJbmRleChjaGlsZE5vZGVMaXN0LCBpbnB1dE5vZGUpOwotICAJCQlpbnQgb3V0cHV0Tm9kZUluZGV4ID0gZ2V0Tm9kZUluZGV4KGNoaWxkTm9kZUxpc3QsIG91dHB1dE5vZGUpOwotICAJCQkKLSAgCQkJaWYgKGlucHV0Tm9kZUluZGV4ID4gb3V0cHV0Tm9kZUluZGV4KSB7Ci0gIAkJCQkvLyBXZSBuZWVkIHRvIHN3YXAgSW5wdXQgYW5kIE91dHB1dAotICAJCQkJb3BlcmF0aW9uTm9kZS5yZW1vdmVDaGlsZChpbnB1dE5vZGUpOwotICAJCQkJb3BlcmF0aW9uTm9kZS5yZW1vdmVDaGlsZChvdXRwdXROb2RlKTsKLSAgCQkJCQotICAJCQkJb3BlcmF0aW9uTm9kZS5pbnNlcnRCZWZvcmUoaW5wdXROb2RlLCBvdXRwdXRUZXh0Tm9kZSk7Ci0gIAkJCQlvcGVyYXRpb25Ob2RlLmluc2VydEJlZm9yZShvdXRwdXROb2RlLCBpbnB1dFRleHROb2RlKTsKLSAgCQkJfQotKi8gIAkJCQotICAJCQkKLSAgCQkJc2V0T3BlcmF0aW9uU3R5bGUob3BlcmF0aW9uLCBPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpOwotICAJCX0KLSAgCQkvKgotICAJCWVsc2UgewotICAJCQkvLyBPcmRlciBpczogSW5wdXQKLSAgCQkJc2V0T3BlcmF0aW9uU3R5bGUob3BlcmF0aW9uLCBPcGVyYXRpb25UeXBlLk9ORV9XQVkpOwotICAJCX0KLSAgCQkqLwotICAJfQotICAJZWxzZSBpZiAob3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKSB7Ci0gIAkJLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW4gSW5wdXQKLSAgCQlpZiAob3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpIHsKLSAgCQkJLy8gT3JkZXIgaXM6IE91dHB1dCwgSW5wdXQKLS8qICAJCQkKLSAgCQkJTm9kZSBvcGVyYXRpb25Ob2RlID0gb3BlcmF0aW9uLmdldEVsZW1lbnQoKTsJCQotICAJCQlOb2RlTGlzdCBjaGlsZE5vZGVMaXN0ID0gb3BlcmF0aW9uTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gIAkJCQotICAJCQlOb2RlIGlucHV0Tm9kZSA9IG9wZXJhdGlvbi5nZXRFSW5wdXQoKS5nZXRFbGVtZW50KCk7Ci0gIAkJCU5vZGUgb3V0cHV0Tm9kZSA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkuZ2V0RWxlbWVudCgpOwotICAJCQkKLSAgCQkJTm9kZSBpbnB1dFRleHROb2RlID0gaW5wdXROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gIAkJCU5vZGUgb3V0cHV0VGV4dE5vZGUgPSBvdXRwdXROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gIAkJCQotICAJCQlpbnQgaW5wdXROb2RlSW5kZXggPSBnZXROb2RlSW5kZXgoY2hpbGROb2RlTGlzdCwgaW5wdXROb2RlKTsKLSAgCQkJaW50IG91dHB1dE5vZGVJbmRleCA9IGdldE5vZGVJbmRleChjaGlsZE5vZGVMaXN0LCBvdXRwdXROb2RlKTsKLSAgCQkJCi0gIAkJCWlmIChvdXRwdXROb2RlSW5kZXggPiBpbnB1dE5vZGVJbmRleCkgewotICAJCQkJLy8gV2UgbmVlZCB0byBzd2FwIElucHV0IGFuZCBPdXRwdXQKLSAgCQkJCW9wZXJhdGlvbk5vZGUucmVtb3ZlQ2hpbGQoaW5wdXROb2RlKTsKLSAgCQkJCW9wZXJhdGlvbk5vZGUucmVtb3ZlQ2hpbGQob3V0cHV0Tm9kZSk7Ci0KLSAgCQkJCW9wZXJhdGlvbk5vZGUuaW5zZXJ0QmVmb3JlKGlucHV0Tm9kZSwgb3V0cHV0VGV4dE5vZGUpOwotICAJCQkJb3BlcmF0aW9uTm9kZS5pbnNlcnRCZWZvcmUob3V0cHV0Tm9kZSwgaW5wdXRUZXh0Tm9kZSk7Ci0gIAkJCX0KLSovICAJCQkKLSAgCQkJc2V0T3BlcmF0aW9uU3R5bGUob3BlcmF0aW9uLCBPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpOwotICAJCX0KLSAgCQkvKgotICAJCWVsc2UgewotICAJCQkvLyBPcmRlciBpczogT3V0cHV0Ci0gIAkJCXNldE9wZXJhdGlvblN0eWxlKG9wZXJhdGlvbiwgT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT04pOwotICAJCX0KLSAgCQkqLwotICAJfQotICB9Ci0KLS8qCi0gKiByZXR1cm4gLTEgaWYgbm9kZSBpcyBub3QgZm91bmQgaW4gdGhlIGdpdmVuIG5vZGVMaXN0Ci0gKi8KLQlwcml2YXRlIGludCBnZXROb2RlSW5kZXgoTm9kZUxpc3Qgbm9kZUxpc3QsIE5vZGUgbm9kZSkgewotCQlpbnQgaW5kZXggPSAwOwotCQl3aGlsZSAoaW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSAmJiAhKG5vZGVMaXN0Lml0ZW0oaW5kZXgpLmVxdWFscyhub2RlKSkpIHsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJCi0JCWlmIChpbmRleCA+PSBub2RlTGlzdC5nZXRMZW5ndGgoKSkgewotCQkJaW5kZXggPSAtMTsKLQkJfQotCQkKLQkJcmV0dXJuIGluZGV4OwotCX0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXRPcGVyYXRpb25TdHlsZShPcGVyYXRpb25JbXBsIG9wZXJhdGlvbiwgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlKSB7Ci0gIAkvLyBJZiB0aGVyZSBpcyBubyBzdHlsZSB0byBiZWdpbiB3aXRoLCBkb24ndCBzZXQgb25lIG5vdwotICAJaWYgKG9wZXJhdGlvbi5nZXRTdHlsZSgpID09IG51bGwpIHsKLSAgCQlyZXR1cm47Ci0gIAl9Ci0gIAkKLSAgCW9wZXJhdGlvbi5zZXRTdHlsZShvcGVyYXRpb25UeXBlKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBWZXJ0aWNhbEVkaXRQYXJ0Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotICAJCi0gIAlwdWJsaWMgVmVydGljYWxFZGl0UGFydENvbXBhcmF0b3IoKSB7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgcGFydDEsIE9iamVjdCBwYXJ0MikgewotICAJCWludCBjb21wYXJlVmFsdWUgPSAwOwotCi0gIAkJaWYgKHBhcnQxIGluc3RhbmNlb2YgV1NETFRyZWVOb2RlRWRpdFBhcnQgJiYgcGFydDIgaW5zdGFuY2VvZiBXU0RMVHJlZU5vZGVFZGl0UGFydCkgewotICAJCQlXU0RMVHJlZU5vZGVFZGl0UGFydCBlZGl0UGFydDEgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIHBhcnQxOwotICAJCQlXU0RMVHJlZU5vZGVFZGl0UGFydCBlZGl0UGFydDIgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIHBhcnQyOwotICAJCQkKLSAgCQkJaW50IGVkaXRQYXJ0MVkgPSBlZGl0UGFydDEuZ2V0U2VsZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkueTsKLSAgCQkJaW50IGVkaXRQYXJ0MlkgPSBlZGl0UGFydDIuZ2V0U2VsZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkueTsKLSAgCQkJCi0gIAkJCUludGVnZXIgaW50ZWdlclBhcnQxID0gbmV3IEludGVnZXIoZWRpdFBhcnQxWSk7Ci0gIAkJCUludGVnZXIgaW50ZWdlclBhcnQyID0gbmV3IEludGVnZXIoZWRpdFBhcnQyWSk7Ci0gIAkJCQotICAJCQljb21wYXJlVmFsdWUgPSBpbnRlZ2VyUGFydDEuY29tcGFyZVRvKGludGVnZXJQYXJ0Mik7Ci0gIAkJfQotCi0gIAkJcmV0dXJuIGNvbXBhcmVWYWx1ZTsKLSAgCX0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRHJhZ1NldE1lc3NhZ2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETERyYWdTZXRNZXNzYWdlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZjllODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRHJhZ1NldE1lc3NhZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OyAKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5JQ29ubmVjdGVkRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLldTRExDb21wb25lbnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkdyb3VwRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLldTRExUcmVlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEVsZW1lbnRJbXBsOwotCi1wdWJsaWMgY2xhc3MgV1NETERyYWdTZXRNZXNzYWdlQWN0aW9uIGV4dGVuZHMgV1NETERyYWdBY3Rpb24gewotCXByb3RlY3RlZCBFZGl0UGFydCBwb2ludGVyRWRpdFBhcnQ7Ci0JcHJvdGVjdGVkIFdTRExFbGVtZW50IG1vdmluZ0NoaWxkOwotCXByb3RlY3RlZCBXU0RMRWxlbWVudCBwb2ludGVyTW9kZWxFbGVtZW50OwotCQotCXB1YmxpYyBXU0RMRHJhZ1NldE1lc3NhZ2VBY3Rpb24oV1NETFRyZWVOb2RlRWRpdFBhcnQgbW92aW5nQ2hpbGRFZGl0UGFydCwgRWRpdFBhcnQgcG9pbnRlckVkaXRQYXJ0LCBQb2ludCBwb2ludGVyTG9jYXRpb24pIHsKLQkJdGhpcy5tb3ZpbmdDaGlsZEVkaXRQYXJ0ID0gbW92aW5nQ2hpbGRFZGl0UGFydDsKLQkJdGhpcy5wb2ludGVyRWRpdFBhcnQgPSBwb2ludGVyRWRpdFBhcnQ7Ci0JCXRoaXMucG9pbnRlckxvY2F0aW9uID0gcG9pbnRlckxvY2F0aW9uOwotCQkKLQkJbW92aW5nQ2hpbGQgPSAoV1NETEVsZW1lbnQpIG1vdmluZ0NoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJcG9pbnRlck1vZGVsRWxlbWVudCA9IChXU0RMRWxlbWVudCkgcG9pbnRlckVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQotCQkvLyBBbGxvdyB0aGUgdXNlciB0byBob3ZlciBvdmVyIGEgUGFydCAob2YgYSBNZXNzYWdlKSB0byBzZXQgdGhlIE1lc3NhZ2UKLQkJaWYgKHBvaW50ZXJNb2RlbEVsZW1lbnQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0JCQl0aGlzLnBvaW50ZXJFZGl0UGFydCA9IHBvaW50ZXJFZGl0UGFydC5nZXRQYXJlbnQoKTsKLQkJCXBvaW50ZXJNb2RlbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIHRoaXMucG9pbnRlckVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JICAgIGlmIChwb2ludGVyTW9kZWxFbGVtZW50ID09IG51bGwgfHwgbW92aW5nQ2hpbGQgPT0gbnVsbCkgewotCSAgICAJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAgIAotCSAgICBpZiAobW92aW5nQ2hpbGQgaW5zdGFuY2VvZiBJbnB1dCB8fCBtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIE91dHB1dCB8fCBtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIEZhdWx0KSB7Ci0JICAgIAlpZiAocG9pbnRlck1vZGVsRWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2UpIHsKLQkgICAgCQlyZXN1bHQgPSB0cnVlOwotCSAgICAJfQotCSAgICB9Ci0KLQkgICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoY2FuRXhlY3V0ZSgpKSB7Ci0JCQlNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWZlcmVuY2UgPSAoTWVzc2FnZVJlZmVyZW5jZSkgbW92aW5nQ2hpbGQ7Ci0JCQltZXNzYWdlUmVmZXJlbmNlLnNldEVNZXNzYWdlKChNZXNzYWdlKSBwb2ludGVyTW9kZWxFbGVtZW50KTsKLQkJCSgoV1NETEVsZW1lbnRJbXBsKSBtZXNzYWdlUmVmZXJlbmNlKS51cGRhdGVFbGVtZW50KHRydWUpOwotCQkJCi0JCQlXU0RMRWRpdG9yIHdzZGxFZGl0b3IgPSAoKFdTRExDb21wb25lbnRWaWV3ZXIpIHBvaW50ZXJFZGl0UGFydC5nZXRWaWV3ZXIoKSkuZ2V0V1NETEVkaXRvcigpOwotCQkJd3NkbEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vdmluZ0NoaWxkKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUZpZ3VyZSBnZXRGZWVkYmFja0ZpZ3VyZSgpIHsKLQkJUG9seWxpbmUgcG9seWZpZ3VyZSA9IG5ldyBQb2x5bGluZSgpOwotCQlHcm91cEVkaXRQYXJ0IGxlZnRHcm91cEVkaXRQYXJ0ID0gZ2V0R3JvdXBFZGl0UGFydChtb3ZpbmdDaGlsZEVkaXRQYXJ0KTsKLQkJR3JvdXBFZGl0UGFydCByaWdodEdyb3VwRWRpdFBhcnQgPSBnZXRHcm91cEVkaXRQYXJ0KHBvaW50ZXJFZGl0UGFydCk7Ci0JCWludCBteCA9IHJpZ2h0R3JvdXBFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54IC0gNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAKLSAgICAgICAgZHJhd0xpbmUocG9seWZpZ3VyZSwgbGVmdEdyb3VwRWRpdFBhcnQub3V0cHV0Q29ubmVjdGlvbi5nZXRGaWd1cmUoKSwgKChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwb2ludGVyRWRpdFBhcnQpLmdldEZpZ3VyZSgpLCBteCk7Ci0JCQotCQlyZXR1cm4gcG9seWZpZ3VyZTsKLQl9Ci0JCi0JICBwcm90ZWN0ZWQgdm9pZCBkcmF3TGluZShQb2x5bGluZSBmZWVkYmFja0ZpZ3VyZSwgSUZpZ3VyZSBhLCBJRmlndXJlIGIsIGludCBteCkKLQkgIHsKLQkgICAgICAgIFJlY3RhbmdsZSByMSA9IGdldENvbm5lY3Rpb25Cb3VuZHMoYSk7Ci0JICAgICAgICBSZWN0YW5nbGUgcjIgPSBnZXRDb25uZWN0aW9uQm91bmRzKGIpOwotCSAgICAgICAgaW50IHgxID0gcjEueCArIHIxLndpZHRoOwotCSAgICAgICAgaW50IHkxID0gcjEueSArIHIxLmhlaWdodCAvIDI7Ci0JICAgICAgICBpbnQgeDIgPSByMi54IC0gMTsKLQkgICAgICAgIGludCB5MiA9IHIyLnkgKyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAvLyBkcmF3IGhvcml6b250YWwgbGluZQotCSAgICAgICAJYWRkTGluZVRvUG9seWxpbmUoZmVlZGJhY2tGaWd1cmUsIHgxLCB5MSwgbXgsIHkxKTsKLQotCSAgICAgICAgLy8gZHJhdyBob3Jpem9udGFsIGxpbmUKLQkgICAgICAgCWFkZExpbmVUb1BvbHlsaW5lKGZlZWRiYWNrRmlndXJlLCBteCwgeTIsIHgyIC0gMSwgeTIpOwotCi0JICAgICAgICAvLyBkcmF3IHRoZSBhcnJvdyBoZWFkCi0JICAgICAgIAlhZGRMaW5lVG9Qb2x5bGluZShmZWVkYmFja0ZpZ3VyZSwgeDIgLSAxLCB5MiwgeDIgLSA0LCB5MiAtIDMpOwotCSAgICAgICAJYWRkTGluZVRvUG9seWxpbmUoZmVlZGJhY2tGaWd1cmUsIHgyIC0gMSwgeTIsIHgyIC0gNCwgeTIgKyAzKTsKLQkgIH0KLQotCSAgcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRDb25uZWN0aW9uQm91bmRzKElGaWd1cmUgZmlndXJlKQotCSAgeyAgICAgICAgICAgICAgICAgCi0JICAgIFJlY3RhbmdsZSByID0gbnVsbDsKLQkgICAgaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIElDb25uZWN0ZWRGaWd1cmUpCi0JICAgIHsKLQkgICAgICBJQ29ubmVjdGVkRmlndXJlIGNvbm5lY3RlZEZpZ3VyZSA9IChJQ29ubmVjdGVkRmlndXJlKWZpZ3VyZTsKLQkgICAgICByID0gY29ubmVjdGVkRmlndXJlLmdldENvbm5lY3Rpb25GaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkgICAgICByID0gZmlndXJlLmdldEJvdW5kcygpOwotCSAgICB9Ci0JICAgIHJldHVybiByOyAKLQkgIH0gICAgICAgICAgICAgICAgICAgICAgCi0JICAKLQkgIHByb3RlY3RlZCBQb2x5bGluZSBhZGRMaW5lVG9Qb2x5bGluZShQb2x5bGluZSBwb2x5bGluZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSB7Ci0gICAgICAJcG9seWxpbmUuYWRkUG9pbnQobmV3IFBvaW50KHgxLCB5MSkpOwotICAgICAgCXBvbHlsaW5lLmFkZFBvaW50KG5ldyBQb2ludCh4MiwgeTIpKTsKLSAgICAgIAlwb2x5bGluZS5zZXRMaW5lV2lkdGgoMSk7Ci0gICAgICAJLy9wb2x5bGluZS5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9ET1QpOwotICAgICAgCQotICAgICAgCXJldHVybiBwb2x5bGluZTsKLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSBHcm91cEVkaXRQYXJ0IGdldEdyb3VwRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkgIAlFZGl0UGFydCBwYXJlbnRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0JICAJCi0JICAJaWYgKHBhcmVudFBhcnQgPT0gbnVsbCkgewotCSAgCQlyZXR1cm4gbnVsbDsKLQkgIAl9Ci0JICAJaWYgKCEocGFyZW50UGFydCBpbnN0YW5jZW9mIEdyb3VwRWRpdFBhcnQpKSB7Ci0JICAJCXBhcmVudFBhcnQgPSBnZXRHcm91cEVkaXRQYXJ0KHBhcmVudFBhcnQpOwotCSAgCX0KLQkgIAkKLQkgIAlyZXR1cm4gKEdyb3VwRWRpdFBhcnQpIHBhcmVudFBhcnQ7Ci0JICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2ExZTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5XU0RMRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aWRnZXRzLk5ld0NvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMRWxlbWVudEFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnRDb21tYW5kIG1vZGVsQ29tbWFuZDsKLSAgcHJpdmF0ZSBTdHJpbmcgdW5kb0Rlc2NyaXB0aW9uOwotICBwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnRBY3Rpb24KLSAgCShXU0RMRWxlbWVudENvbW1hbmQgY29tbWFuZCwKLSAgCSBTdHJpbmcgdW5kb0Rlc2NyaXB0aW9uLAotICAJIFN0cmluZyBsYWJlbCwKLSAgCSBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcihsYWJlbCxpbWFnZSk7Ci0gICAgbW9kZWxDb21tYW5kID0gY29tbWFuZDsKLSAgICB0aGlzLnVuZG9EZXNjcmlwdGlvbiA9IHVuZG9EZXNjcmlwdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvclBhcnQoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdW5kb0Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIFdTRExFbGVtZW50IGdldE93bmVyKCk7Ci0gIAotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93RGlhbG9nKCk7Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYm9vbGVhbiBvayA9IHNob3dEaWFsb2coKTsKLSAgICBpZiAob2spCi0gICAgewotCSAgICBwcmVSdW4oKTsKLQkgICAgbW9kZWxDb21tYW5kLnJ1bigpOwotCSAgICBmb3JtYXQoKTsKLQkgICAgc2VsZWN0T2JqZWN0KCk7Ci0JICAgIHBvc3RSdW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHByZVJ1bigpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcG9zdFJ1bigpCi0gIHsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBiZWdpblJlY29yZGluZygpCi0gIHsgICAgCi0gICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICBpZiAoZ2V0T3duZXIoKSAhPSBudWxsKQotICAgICAgbm9kZSA9IGdldE93bmVyKCkuZ2V0RWxlbWVudCgpOyAKLSAgICAKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRVbmRvRGVzY3JpcHRpb24oKSk7ICAKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5kUmVjb3JkaW5nKCkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICBpZiAoZ2V0T3duZXIoKSAhPSBudWxsKQotICAgICAgbm9kZSA9IGdldE93bmVyKCkuZ2V0RWxlbWVudCgpOyAKLSAgICAKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7ICAKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxDb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBmb3JtYXQoKQotICB7Ci0gICAgTm9kZSBwYXJlbnROb2RlID0gbnVsbDsKLSAgICBpZiAoZ2V0T3duZXIoKSAhPSBudWxsKQotICAgICAgcGFyZW50Tm9kZSA9IGdldE93bmVyKCkuZ2V0RWxlbWVudCgpOyAKLSAgICAKLSAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSAKLSAgICB7Ci0JCSAgLy8gZm9ybWF0IHNlbGVjdGVkIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBGb3JtYXRQcm9jZXNzb3JYTUwgZm9ybWF0UHJvY2Vzc29yWE1MID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotICAgICAgZm9ybWF0UHJvY2Vzc29yWE1MLmZvcm1hdE5vZGUoKElET01Ob2RlKXBhcmVudE5vZGUpOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNlbGVjdE9iamVjdCgpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsICYmIGdldE93bmVyKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0V1NETEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcillZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSk7Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgIH0gICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBzaG93RGlhbG9nSGVscGVyKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lKQotICB7ICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IGRlZmF1bHROYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE5ld0NvbXBvbmVudERpYWxvZyBkaWFsb2cgPSBuZXcgTmV3Q29tcG9uZW50RGlhbG9nKFdTRExFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgdGl0bGUsIGRlZmF1bHROYW1lKTsKLSAgICBpbnQgcmMgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotICAgIGlmIChyYyA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRpYWxvZy5nZXROYW1lKCk7ICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgfSAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETEVsZW1lbnRVSUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRWxlbWVudFVJQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZWUxYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRWxlbWVudFVJQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuV1NETEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTRExFbGVtZW50VUlBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50Q29tbWFuZCBtb2RlbEFjdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgdW5kb0Rlc2NyaXB0aW9uOwotICBwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnRVSUFjdGlvbgotICAJKFdTRExFbGVtZW50Q29tbWFuZCBhY3Rpb24sCi0gIAkgU3RyaW5nIHVuZG9EZXNjcmlwdGlvbiwKLSAgCSBTdHJpbmcgbGFiZWwsCi0gIAkgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKQotICB7Ci0gICAgc3VwZXIobGFiZWwsaW1hZ2UpOwotICAgIG1vZGVsQWN0aW9uID0gYWN0aW9uOwotICAgIHRoaXMudW5kb0Rlc2NyaXB0aW9uID0gdW5kb0Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiB1bmRvRGVzY3JpcHRpb247Ci0gIH0KLQotICBwcml2YXRlIE5vZGUgZ2V0T3duZXJOb2RlKCkKLSAgewotICAgIGlmIChnZXRPd25lcigpICE9IG51bGwpCi0gICAgICByZXR1cm4gZ2V0T3duZXIoKS5nZXRFbGVtZW50KCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgZ2V0T3duZXIoKTsKLSAgCi0gIGFic3RyYWN0IHByb3RlY3RlZCBib29sZWFuIHNob3dEaWFsb2coKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBib29sZWFuIG9rID0gc2hvd0RpYWxvZygpOwotICAgIGlmIChvaykKLSAgICB7Ci0JICAgIHByZVJ1bigpOwotCSAgICBtb2RlbEFjdGlvbi5ydW4oKTsKLQkgICAgZm9ybWF0KCk7Ci0JICAgIHNlbGVjdE9iamVjdCgpOwotCSAgICBwb3N0UnVuKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwcmVSdW4oKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHBvc3RSdW4oKQotICB7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYmVnaW5SZWNvcmRpbmcoKQotICB7ICAgIAotICAgIE5vZGUgbm9kZSA9IGdldE93bmVyTm9kZSgpOyAgCi0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICAoKElET01Ob2RlKW5vZGUpLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkpOyAgCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVuZFJlY29yZGluZygpCi0gIHsgICAgICAgICAgICAgICAgIAotICAgIE5vZGUgbm9kZSA9IGdldE93bmVyTm9kZSgpOyAKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7ICAKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxBY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGZvcm1hdCgpCi0gIHsKLSAgICBOb2RlIHBhcmVudE5vZGUgPSBnZXRPd25lck5vZGUoKTsKLSAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSAKLSAgICB7Ci0JCSAgLy8gZm9ybWF0IHNlbGVjdGVkIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBGb3JtYXRQcm9jZXNzb3JYTUwgZm9ybWF0UHJvY2Vzc29yWE1MID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotICAgICAgZm9ybWF0UHJvY2Vzc29yWE1MLmZvcm1hdE5vZGUoKElET01Ob2RlKXBhcmVudE5vZGUpOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNlbGVjdE9iamVjdCgpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsICYmIGdldE93bmVyKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0V1NETEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcillZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSk7Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgIH0gICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMTWVudUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExYjY2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFN3aXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkSW5wdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZE1lc3NhZ2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZE9wZXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSU1lbnVBY3Rpb25Db250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuV1NETFRyZWVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNyZWF0ZVdTRExFbGVtZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aWRnZXRzLk5ld0NvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aWRnZXRzLk5ld0NvbXBvbmVudFdpdGhDaGlsZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aXphcmRzLkJpbmRpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkcy5Qb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMTWVudUFjdGlvbkNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSU1lbnVBY3Rpb25Db250cmlidXRvcgotewotICBwcm90ZWN0ZWQgQWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3IgYWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci0gIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0KLSAgcHVibGljIFdTRExNZW51QWN0aW9uQ29udHJpYnV0b3IoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIGFkZEVFTWVudUFjdGlvbkNvbnRyaWJ1dG9yID0gbmV3IEFkZEVFTWVudUFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgTGlzdCBjcmVhdGVMaXN0KEFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoYWN0aW9uKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLQlwcml2YXRlIGNsYXNzIE9wZW5TY2hlbWFPblNlbGVjdGlvbkhlbHBlciBleHRlbmRzIEFjdGlvbiB7Ci0JCU9iamVjdCBvYmplY3Q7Ci0JCQotCQlwdWJsaWMgT3BlblNjaGVtYU9uU2VsZWN0aW9uSGVscGVyKE9iamVjdCBvYmplY3QpIHsKLQkJCXNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfT1BFTl9JTVBPUlQiKSk7Ci0JCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJCQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEltcG9ydCkgewotCQkJCVN0cmluZyBsb2NhdGlvbiA9ICgoSW1wb3J0KSBvYmplY3QpLmdldExvY2F0aW9uVVJJKCk7Ci0JCQkJCi0JCQkJaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24udHJpbSgpLmVxdWFscygiIikpCi0JCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFdTRExFbGVtZW50KSBvYmplY3QpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLQkJCW9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuT3Blbk9uU2VsZWN0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk9wZW5PblNlbGVjdGlvbkhlbHBlcihkZWZpbml0aW9uKTsKLQkJICAgIGhlbHBlci5vcGVuRWRpdG9yKChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgb2JqZWN0KTsKLQkJfQotCX0KLQotICBwdWJsaWMgdm9pZCBjb250cmlidXRlTWVudUFjdGlvbnMoZmluYWwgSU1lbnVNYW5hZ2VyIG1lbnUsIGZpbmFsIE5vZGUgbm9kZSwgT2JqZWN0IG9iamVjdCkKLSAgewotICAgIGZpbmFsIElNZW51TWFuYWdlciBhZGRNZW51OwotICAgIGJvb2xlYW4gYWRkRWRpdEFjdGlvbiA9IGZhbHNlOwotICAgIGZpbmFsIGJvb2xlYW4gaXNFZGl0YWJsZSA9IChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCAmJiBub2RlICE9IG51bGwgJiYgaXNFZGl0YWJsZSkKLSAgICB7Ci0gICAgICBhZGRFZGl0QWN0aW9uID0gdHJ1ZTsKLSAgICAgIGFkZE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9DSElMRCIpLCAiYWRkY2hpbGQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBtZW51LmFkZChhZGRNZW51KTsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoV1NETEVsZW1lbnQpIG9iamVjdCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCi0gICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotCi0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW1wb3J0KSB7Ci0gICAgICAJbWVudS5hZGQobmV3IE9wZW5TY2hlbWFPblNlbGVjdGlvbkhlbHBlcihvYmplY3QpKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgV1NETFN3aXRjaCB3c2RsU3dpdGNoID0gbmV3IFdTRExTd2l0Y2goKQotICAgICAgewotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0VkaXRhYmxlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRCaW5kaW5nT3BlcmF0aW9uQWN0aW9uKG5vZGUsICJOZXdCaW5kaW5nT3BlcmF0aW9uIiwgcHJlZml4KSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIG1lbnUuYWRkKGNyZWF0ZVNldFBvcnRUeXBlTWVudShiaW5kaW5nLCBpc0VkaXRhYmxlKSk7Ci0gICAgICAgICAgbWVudS5hZGQobmV3IEdlbmVyYXRlQmluZGluZ0NvbnRlbnRBY3Rpb24oYmluZGluZywgaXNFZGl0YWJsZSkpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNFZGl0YWJsZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkQmluZGluZ0lucHV0QWN0aW9uKGVkaXRvclBhcnQsIG5vZGUsIHByZWZpeCkpOwotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZEJpbmRpbmdPdXRwdXRBY3Rpb24oZWRpdG9yUGFydCwgbm9kZSwgcHJlZml4KSk7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkQmluZGluZ0ZhdWx0QWN0aW9uKG5vZGUsIHByZWZpeCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZURlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgIG1lbnUuYWRkKG5ldyBFZGl0TmFtZXNwYWNlc0FjdGlvbihkZWZpbml0aW9uKSk7Ci0gICAgICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgIAkKLSAgICAgICAgICBpZiAoaXNFZGl0YWJsZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkTWVzc2FnZUFjdGlvbihkZWZpbml0aW9uLCBudWxsLCBub2RlLCBwcmVmaXgsICgoV1NETEVkaXRvcikgZWRpdG9yUGFydCkuZ2V0WE1MRG9jdW1lbnQoKSkpOwotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZFNlcnZpY2VBY3Rpb24oZGVmaW5pdGlvbiwgbnVsbCwgbm9kZSwgcHJlZml4LCAoKFdTRExFZGl0b3IpIGVkaXRvclBhcnQpLmdldFhNTERvY3VtZW50KCkpKTsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRQb3J0VHlwZUFjdGlvbihkZWZpbml0aW9uLCBudWxsLCBub2RlLCBwcmVmaXgsICgoV1NETEVkaXRvcikgZWRpdG9yUGFydCkuZ2V0WE1MRG9jdW1lbnQoKSkpOwotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZEJpbmRpbmdBY3Rpb24oZGVmaW5pdGlvbiwgKChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KS5nZXRYTUxEb2N1bWVudCgpKSk7Ly8sIG51bGwsIG5vZGUsIHByZWZpeCkpOwotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZEltcG9ydEFjdGlvbihlZGl0b3JQYXJ0LCBkZWZpbml0aW9uLCBub2RlLCBwcmVmaXgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VGYXVsdChGYXVsdCBmYXVsdCkKLSAgICAgICAgewotICAgICAgICAgIG1lbnUuYWRkKGNyZWF0ZVNldE1lc3NhZ2VNZW51KGZhdWx0LCBpc0VkaXRhYmxlKSk7Ci0gICAgICAgICAgLy9tZW51LmFkZChjcmVhdGVBZGRCaW5kaW5nTWVudUZvcklPRihmYXVsdCkpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICBtZW51LmFkZChjcmVhdGVTZXRNZXNzYWdlTWVudShpbnB1dCwgaXNFZGl0YWJsZSkpOwotICAgICAgICAgIC8vbWVudS5hZGQoY3JlYXRlQWRkQmluZGluZ01lbnVGb3JJT0YoaW5wdXQpKTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZU91dHB1dChPdXRwdXQgb3V0cHV0KQotICAgICAgICB7Ci0gICAgICAgICAgbWVudS5hZGQoY3JlYXRlU2V0TWVzc2FnZU1lbnUob3V0cHV0LCBpc0VkaXRhYmxlKSk7Ci0gICAgICAgICAgLy9tZW51LmFkZChjcmVhdGVBZGRCaW5kaW5nTWVudUZvcklPRihvdXRwdXQpKTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRWRpdGFibGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZFBhcnRBY3Rpb24oZWRpdG9yUGFydCwgbWVzc2FnZSwgbm9kZSwgcHJlZml4KSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNFZGl0YWJsZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkSW5wdXRBY3Rpb24oZWRpdG9yUGFydCwgbm9kZSwgb3BlcmF0aW9uLCBwcmVmaXgpKTsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRPdXRwdXRBY3Rpb24oZWRpdG9yUGFydCwgbm9kZSwgb3BlcmF0aW9uLCBwcmVmaXgpKTsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRGYXVsdEFjdGlvbihlZGl0b3JQYXJ0LCBub2RlLCBvcGVyYXRpb24sIHByZWZpeCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvL21lbnUuYWRkKGNyZWF0ZUFkZEJpbmRpbmdNZW51Rm9yT3BlcmF0aW9uKG9wZXJhdGlvbikpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlUGFydChQYXJ0IHBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBtZW51LmFkZChjcmVhdGVTZXRQYXJ0TWVudShwYXJ0LCAoRWxlbWVudCkgbm9kZSwgImVsZW1lbnQiLCBpc0VkaXRhYmxlKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBtZW51LmFkZChjcmVhdGVTZXRQYXJ0TWVudShwYXJ0LCAoRWxlbWVudCkgbm9kZSwgInR5cGUiLCBpc0VkaXRhYmxlKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVBvcnQoUG9ydCBwb3J0KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKGNyZWF0ZVNldEJpbmRpbmdNZW51KHBvcnQsIChFbGVtZW50KSBub2RlLCBpc0VkaXRhYmxlKSk7Ci0gICAgICAgICAgICBpZiAocG9ydC5nZXRFQmluZGluZygpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1lbnUuYWRkKGNyZWF0ZVNldFBvcnRUeXBlTWVudShwb3J0LmdldEVCaW5kaW5nKCksIGlzRWRpdGFibGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0VkaXRhYmxlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRPcGVyYXRpb25BY3Rpb24oZWRpdG9yUGFydCwgcG9ydFR5cGUsIG5vZGUsIHByZWZpeCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRWRpdGFibGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZFBvcnRBY3Rpb24oc2VydmljZSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcHVibGljIE9iamVjdCBjYXNlVHlwZXMoVHlwZXMgdHlwZXMpCi0gICAgICAgIC8veyAgIAotICAgICAgICAvLyAgcmV0dXJuIGNyZWF0ZVR5cGVzQWRhcHRlcigpOwotICAgICAgICAvLyB9IAotICAgICAgfTsKLSAgICAgIHdzZGxTd2l0Y2guZG9Td2l0Y2goKFdTRExFbGVtZW50KSBvYmplY3QpOwotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgewotICAgICAgYWRkTWVudSA9IG5ldyBNZW51TWFuYWdlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NISUxEIiksICJhZGRjaGlsZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIG1lbnUuYWRkKGFkZE1lbnUpOwotICAgICAgCi0gICAgICBXU0RMR3JvdXBPYmplY3QgZ3JvdXBPYmplY3QgPSAoV1NETEdyb3VwT2JqZWN0KSBvYmplY3Q7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCk7Ci0KLSAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAgIC8vZm9yIChJdGVyYXRvciBpID0gYWN0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgLy97ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvLyAgQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24paS5uZXh0KCk7Ci0gICAgICAvLyAgbWFuYWdlci5hZGQoYWN0aW9uKTsgCi0gICAgICAvL30KLQotICAgICAgc3dpdGNoIChncm91cE9iamVjdC5nZXRUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0Lk1FU1NBR0VTX0dST1VQIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkTWVzc2FnZUFjdGlvbihncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCksIG51bGwsIG5vZGUsIHByZWZpeCwgKChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KS5nZXRYTUxEb2N1bWVudCgpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LlNFUlZJQ0VTX0dST1VQIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkU2VydmljZUFjdGlvbihncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCksIG51bGwsIG5vZGUsIHByZWZpeCwgKChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KS5nZXRYTUxEb2N1bWVudCgpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LlBPUlRfVFlQRVNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRQb3J0VHlwZUFjdGlvbihncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCksIG51bGwsIG5vZGUsIHByZWZpeCwgKChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KS5nZXRYTUxEb2N1bWVudCgpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LkJJTkRJTkdTX0dST1VQIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkQmluZGluZ0FjdGlvbihncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCksICgoV1NETEVkaXRvcikgZWRpdG9yUGFydCkuZ2V0WE1MRG9jdW1lbnQoKSkpOy8vLCBudWxsLCBub2RlLCBwcmVmaXgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuSU1QT1JUU19HUk9VUCA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZEltcG9ydEFjdGlvbihlZGl0b3JQYXJ0LCBncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCksIG5vZGUsIHByZWZpeCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgCi0gICAJYWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3IuY29udHJpYnV0ZU1lbnVBY3Rpb25zKG1lbnUsIG5vZGUsIG9iamVjdCk7Ci0KLSAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50ICYmIG5vZGUgIT0gbnVsbCAmJiBhZGRFZGl0QWN0aW9uICYmIG5vZGUgIT0gbnVsbCAmJiBpc0VkaXRhYmxlKQotICAgIHsKLSAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ3VycmVudGx5LCBvbmx5IGFsbG93IENvcHkgYW5kIFBhc3RlIG9uIE9wZXJhdGlvbnMKLSAgICAJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAgIAkJLy8gQWRkIEN1dCwgQ29weSBBY3Rpb25zCi0gICAgCQkvLyBOb3RlOiAgVGhlIEN1dCwgQ29weSwgUGFzdGUgQWN0aW9ucyBhcmUgTW9kZWwgRHJpdmVuLiAgVGhlIERlbGV0ZSBBY3Rpb24gaXMgc3RpbGwKLSAgICAJCS8vIGN1cnJlbnRseSBET00gZHJpdmVuLgotICAgIAkJLy8gICAgICBtZW51LmFkZChuZXcgQ3V0QWN0aW9uKChXU0RMRWxlbWVudCkgb2JqZWN0LCBlZGl0b3JQYXJ0KSk7Ci0gICAJCSAJbWVudS5hZGQobmV3IENvcHlHbG9iYWxBY3Rpb24oKFdTRExFbGVtZW50KSBvYmplY3QsIGVkaXRvclBhcnQpKTsKLSAgICAJfQotCi0gICAJIAlBY3Rpb24gcGFzdGVBY3Rpb24gPSBuZXcgUGFzdGVHbG9iYWxBY3Rpb24oKFdTRExFbGVtZW50KSBvYmplY3QsIGVkaXRvclBhcnQpOwotICAgCSAJaWYgKHBhc3RlQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0gICAJIAkJbWVudS5hZGQocGFzdGVBY3Rpb24pOwotICAgCSAJfQotICAgCSAJCi0JIAltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDdXJyZW50bHksIG9ubHkgYWxsb3cgQ29weSBhbmQgUGFzdGUgb24gT3BlcmF0aW9ucwotCQkKLQkJLy8gR2V0IHRoZSBsaXN0IG9mIHNlbGVjdGVkIGVsZW1lbnRzLiAgVXNlIHRoaXMgbGlzdCBmb3IgdGhlIERlbGV0ZUFjdGlvbi4JCQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25MaXN0ID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSAoKFdTRExFZGl0b3IpIGVkaXRvclBhcnQpLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3Rpb24oKTsJCi0JCUFjdGlvbiBkZWxldGVBdGlvbiA9IG5ldyBEZWxldGVXU0RMQW5kWFNEQWN0aW9uKHNlbGVjdGlvbkxpc3QudG9MaXN0KCksIG5vZGUsIChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KTsKLQkJbWVudS5hZGQoZGVsZXRlQXRpb24pOwotCQlkZWxldGVBdGlvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUpOwotICAgIH0KLSAgICAKLSAgICAvLyBBbGxvdyBSZW5hbWUgdGhyb3VnaCBhIGRpYWxvZyBtZWNoYW5pc20uLi4uLiAgVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB3aGVuCi0gICAgLy8gZGlyZWN0IGVkaXRpbmcgaXMgcmVhZHkKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQgJiYgaXNFZGl0YWJsZSkgewotICAgIAlSZW5hbWVEaWFsb2dBY3Rpb24gcmVuYW1lRGlhbG9nID0gbmV3IFJlbmFtZURpYWxvZ0FjdGlvbigoV1NETEVsZW1lbnQpIG9iamVjdCk7Ci0gICAgCWlmIChyZW5hbWVEaWFsb2cuc2hvd1JlbmFtZURpYWxvZygpKQotICAgIAkJbWVudS5hZGQocmVuYW1lRGlhbG9nKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICBwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlQWRkQmluZGluZ01lbnVGb3JPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikgCi0gIHsKLSAgICBNZW51TWFuYWdlciBzdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCJBZGQgQmluZGluZyIpOyAgICAgICAgICAgICAgICAgICAgCi0gIAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7IAotICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGRlZmluaXRpb24pOwotICAKLSAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkKLSAgICB7ICAgICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gdXRpbC5nZXRCaW5kaW5ncyhvcGVyYXRpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7ICAgCi0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gbWF0Y2hpbmdCaW5kaW5nT3BlcmF0aW9uID0gbnVsbDsKLSAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pai5uZXh0KCk7Ci0gICAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUuZXF1YWxzKGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7IAotICAgICAgICAgICAgbWF0Y2hpbmdCaW5kaW5nT3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgIAotICAKLSAgICAgICAgaWYgKG1hdGNoaW5nQmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIEVsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSBXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgICAgICAgc3ViTWVudS5hZGQobmV3IEFkZEJpbmRpbmdPcGVyYXRpb25BY3Rpb24oYmluZGluZ0VsZW1lbnQsIG9wZXJhdGlvbiwgcHJlZml4KSk7Ci0gICAgICAgIH0gICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdWJNZW51OwotICB9Ki8KLQotICAvKgotICBwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlQWRkQmluZGluZ01lbnVGb3JJT0YoV1NETEVsZW1lbnQgaW9mKSAKLSAgewotICAgIE1lbnVNYW5hZ2VyIHN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIkFkZCBCaW5kaW5nIik7ICAgICAgICAgICAgICAgICAgICAKLSAgCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaW9mLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsgCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24paW9mLmVDb250YWluZXIoKTsKLSAgCi0gICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZGVmaW5pdGlvbik7Ci0gIAotICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICBpZiAob3BlcmF0aW9uTmFtZSAhPSBudWxsKQotICAgIHsgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gdXRpbC5nZXRCaW5kaW5ncyhvcGVyYXRpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7ICAgCi0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKWkubmV4dCgpOwotICAKLSAgICAgICAgYm9vbGVhbiBoYXNOYW1lID0gZmFsc2U7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pai5uZXh0KCk7Ci0gICAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUuZXF1YWxzKGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYXNOYW1lID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgIAotICAKLSAgICAgICAgaWYgKCFoYXNOYW1lKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIFRPRE8uLi4gc2hvdWxkIHdlIGFkZCB0aGUgb3BlcmF0aW9uIHRvIGFsbCBvZiB0aGUgYmluZGluZ3M/Ci0gICAgICAgICAgLy8KLSAgICAgICAgICBFbGVtZW50IGJpbmRpbmdFbGVtZW50ID0gV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGJpbmRpbmcpOwotICAgICAgICAgIHN1Yk1lbnUuYWRkKG5ldyBBZGRCaW5kaW5nT3BlcmF0aW9uQWN0aW9uKGJpbmRpbmdFbGVtZW50LCBvcGVyYXRpb25OYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN1Yk1lbnU7Ci0gIH0KLSAgKi8KLQotICBwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlU2V0QmluZGluZ01lbnUoUG9ydCBwb3J0LCBFbGVtZW50IHBvcnRFbGVtZW50LCBib29sZWFuIGlzRWRpdGFibGUpCi0gIHsKLSAgICBNZW51TWFuYWdlciBzdWJtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCJTZXQgQmluZGluZyIpOyAgICAgICAvLyBUT0RPOiBFeHRlcm5hbGl6ZSBTdHJpbmcKLSAgICAKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBwb3J0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotICAgIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0KLSAgICAvLyBUT0RPOiBFeHRlcm5hbGl6ZSBTdHJpbmcgYmVsb3cKLSAgICBTZXROZXdDb21wb25lbnRBY3Rpb24gc2V0TmV3QWN0aW9uID0gbmV3IFNldE5ld0NvbXBvbmVudEFjdGlvbigiTmV3IEJpbmRpbmcuLi4iLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAiYmluZGluZyIsIHBvcnQpOwotICAgIHNldE5ld0FjdGlvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgc2V0TmV3QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgc3VibWVudS5hZGQoc2V0TmV3QWN0aW9uKTsgICAgIAotICAgIAotICAgIC8vIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9TRVRfQklORElHIikKLSAgICBTZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbiBhY3Rpb24gPSBuZXcgU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24oIkV4aXN0aW5nIEJpbmRpbmcuLi4iLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAiYmluZGluZyIsIHBvcnQpOwotICAgIGFjdGlvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgYWN0aW9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0gICAgc3VibWVudS5hZGQoYWN0aW9uKTsKLSAgICAKLSAgICByZXR1cm4gc3VibWVudTsKLSAgfQotCi0gIHByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVTZXRQb3J0VHlwZU1lbnUoQmluZGluZyBiaW5kaW5nLCBib29sZWFuIGlzRWRpdGFibGUpCi0gIHsgICAgICAKLSAgICBNZW51TWFuYWdlciBzdWJtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCJTZXQgUG9ydFR5cGUiKTsgIC8vIFRPRE86IEV4dGVybmFsaXplIFN0cmluZ3MKLQotICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gYmluZGluZy5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotICAgICAgU3RyaW5nIHByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgIAotICAgICAgLy8gVE9ETzogRXh0ZXJuYWxpemUgU3RyaW5nIGJlbG93Ci0gICAgICBTZXROZXdDb21wb25lbnRBY3Rpb24gc2V0TmV3QWN0aW9uID0gbmV3IFNldE5ld0NvbXBvbmVudEFjdGlvbigiTmV3IFBvcnQgVHlwZS4uLiIsIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsICJwb3J0VHlwZSIsIGJpbmRpbmcpOwotICAgICAgc2V0TmV3QWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICAgIHNldE5ld0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgc3VibWVudS5hZGQoc2V0TmV3QWN0aW9uKTsgICAgICAKLQotICAgICAgLy8gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX1NFVF9QT1JUVFlQRSIpCi0gICAgICBTZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbiBhY3Rpb24gPSBuZXcgU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24oIkV4aXN0aW5nIFBvcnQgVHlwZS4uLiIsIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsICJwb3J0VHlwZSIsIGJpbmRpbmcpOwotICAgICAgYWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICAgIGFjdGlvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUpOyAgICAgIAotICAgICAgc3VibWVudS5hZGQoYWN0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1Ym1lbnU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlU2V0TWVzc2FnZU1lbnUoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQsIGJvb2xlYW4gaXNFZGl0YWJsZSkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxFbGVtZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotICAgIEVsZW1lbnQgcmVmZXJlbmNpbmdFbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KHdzZGxFbGVtZW50KTsKLQotICAgIE1lbnVNYW5hZ2VyIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIlNldCBNZXNzYWdlIik7ICAgICAgIC8vIFRPRE86IEV4dGVybmFsaXplIFN0cmluZ3MKLSAgICBpZiAoZGVmaW5pdGlvbkVsZW1lbnQgIT0gbnVsbCAmJiByZWZlcmVuY2luZ0VsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotICAgICAgCi0gICAgICAvLyBUT0RPOiBFeHRlcm5hbGl6ZSBTdHJpbmcgYmVsb3cKLSAgICAgIFNldE5ld0NvbXBvbmVudEFjdGlvbiBzZXROZXdBY3Rpb24gPSBuZXcgU2V0TmV3Q29tcG9uZW50QWN0aW9uKCJOZXcgTWVzc2FnZS4uLiIsIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsICJtZXNzYWdlIiwgd3NkbEVsZW1lbnQpOwotICAgICAgc2V0TmV3QWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICAgIHNldE5ld0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgc3VibWVudS5hZGQoc2V0TmV3QWN0aW9uKTsgIAotICAgICAgCi0gICAgICAvLyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fU0VUX01FU1NBR0UiKQotICAgICAgU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24gYWN0aW9uID0gbmV3IFNldEV4aXN0aW5nQ29tcG9uZW50QWN0aW9uKCJFeGlzdGluZyBNZXNzZ2FlLi4uIiwgZGVmaW5pdGlvbkVsZW1lbnQsIHByZWZpeCwgIm1lc3NhZ2UiLCB3c2RsRWxlbWVudCk7Ci0gICAgICBhY3Rpb24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotICAgICAgYWN0aW9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0gICAgICBzdWJtZW51LmFkZChhY3Rpb24pOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3VibWVudTsKLSAgfQotCi0gIHByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVTZXRQYXJ0TWVudShQYXJ0IHBhcnQsIEVsZW1lbnQgcG9ydEVsZW1lbnQsIFN0cmluZyByZWZlcmVuY2VLaW5kLCBib29sZWFuIGlzRWRpdGFibGUpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBwYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotICAgIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0KLSAgICBTdHJpbmcgYWN0aW9uTmFtZTsKLSAgICBNZW51TWFuYWdlciBzdWJtZW51ID0gbnVsbDsKLSAgICBpZiAocmVmZXJlbmNlS2luZC5lcXVhbHNJZ25vcmVDYXNlKCJlbGVtZW50IikpIC8vIE5PTiBOTFMKLSAgICB7Ci0vLyAgICAgIGFjdGlvbk5hbWUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fU0VUX0VMRU1FTlQiKTsKLSAgICAgIGFjdGlvbk5hbWUgPSAiRXhpc3RpbmcgRWxlbWVudC4uLiI7Ci0gIAotICAgICAgc3VibWVudSA9IG5ldyBNZW51TWFuYWdlcigiU2V0IEVsZW1lbnQiKTsgICAgICAgLy8gVE9ETzogRXh0ZXJuYWxpemUgU3RyaW5ncwotICAgICAgCi0gICAgICAvLyBUT0RPOiBFeHRlcm5hbGl6ZSBTdHJpbmcgYmVsb3cKLSAgICAgIFNldE5ld0NvbXBvbmVudEFjdGlvbiBzZXROZXdFbGVtZW50QWN0aW9uID0gbmV3IFNldE5ld0NvbXBvbmVudEFjdGlvbigiTmV3IEVsZW1lbnQuLi4iLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAiZWxlbWVudCIsIHBhcnQpOwotICAgICAgc2V0TmV3RWxlbWVudEFjdGlvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgICBzZXROZXdFbGVtZW50QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICBzZXROZXdFbGVtZW50QWN0aW9uLnNldFJlZmVyZW5jZUtpbmQocmVmZXJlbmNlS2luZCk7Ci0gICAgICBzdWJtZW51LmFkZChzZXROZXdFbGVtZW50QWN0aW9uKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLS8vICAgICAgYWN0aW9uTmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9TRVRfVFlQRSIpOwotICAgICAgYWN0aW9uTmFtZSA9ICJFeGlzdGluZyBUeXBlLi4uIjsKLSAgICAgICAgICAKLSAgICAgIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIlNldCBUeXBlIik7ICAgICAgIC8vIFRPRE86IEV4dGVybmFsaXplIFN0cmluZ3MKLSAgICAgIAotICAgICAgLy8gVE9ETzogRXh0ZXJuYWxpemUgU3RyaW5nIGJlbG93Ci0gICAgICBTZXROZXdDb21wb25lbnRBY3Rpb24gc2V0TmV3Q29tcGxleEFjdGlvbiA9IG5ldyBTZXROZXdDb21wb25lbnRBY3Rpb24oIk5ldyBDb21wbGV4IFR5cGUuLi4iLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAiY29tcGxleCB0eXBlIiwgcGFydCk7Ci0gICAgICBzZXROZXdDb21wbGV4QWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICAgIHNldE5ld0NvbXBsZXhBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIHNldE5ld0NvbXBsZXhBY3Rpb24uc2V0UmVmZXJlbmNlS2luZChyZWZlcmVuY2VLaW5kKTsKLSAgICAgIHNldE5ld0NvbXBsZXhBY3Rpb24uc2V0VHlwZUtpbmQoImNvbXBsZXgiKTsKLSAgICAgIEltYWdlIGltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RDb21wbGV4VHlwZS5naWYiKTsKLSAgICAgIHNldE5ld0NvbXBsZXhBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tSW1hZ2UoaW1hZ2UpKTsKLSAgICAgIHN1Ym1lbnUuYWRkKHNldE5ld0NvbXBsZXhBY3Rpb24pOwotICAgICAgCi0gICAgICAvLyBUT0RPOiBFeHRlcm5hbGl6ZSBTdHJpbmcgYmVsb3cKLSAgICAgIFNldE5ld0NvbXBvbmVudEFjdGlvbiBzZXROZXdTaW1wbGVBY3Rpb24gPSBuZXcgU2V0TmV3Q29tcG9uZW50QWN0aW9uKCJOZXcgU2ltcGxlIFR5cGUuLi4iLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAic2ltcGxlIHR5cGUiLCBwYXJ0KTsKLSAgICAgIHNldE5ld1NpbXBsZUFjdGlvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgICBzZXROZXdTaW1wbGVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIHNldE5ld1NpbXBsZUFjdGlvbi5zZXRSZWZlcmVuY2VLaW5kKHJlZmVyZW5jZUtpbmQpOwotICAgICAgc2V0TmV3U2ltcGxlQWN0aW9uLnNldFR5cGVLaW5kKCJzaW1wbGUiKTsKLSAgICAgIGltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpOwotICAgICAgc2V0TmV3U2ltcGxlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUltYWdlKGltYWdlKSk7Ci0KLSAgICAgIHN1Ym1lbnUuYWRkKHNldE5ld1NpbXBsZUFjdGlvbik7IAotICAgIH0KLQotICAgIAotICAgIFNldEV4aXN0aW5nQ29tcG9uZW50QWN0aW9uIGFjdGlvbiA9IG5ldyBTZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbihhY3Rpb25OYW1lLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCBhY3Rpb25OYW1lLCBwYXJ0KTsKLSAgICBhY3Rpb24uc2V0UmVmZXJlbmNlS2luZChyZWZlcmVuY2VLaW5kKTsKLSAgICBhY3Rpb24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotICAgIGFjdGlvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUpOwotICAgIHN1Ym1lbnUuYWRkKGFjdGlvbik7Ci0gICAgCi0gICAgcmV0dXJuIHN1Ym1lbnU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgV1NETEVsZW1lbnQgc2hvd1Bhc3RlQWN0aW9uKFdTRExFbGVtZW50IGVsZW1lbnQsIElFZGl0b3JQYXJ0IGVQYXJ0KSB7Ci0gIAlXU0RMRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gbnVsbDsKLSAgCQotICAJaWYgKGVQYXJ0IGluc3RhbmNlb2YgV1NETEVkaXRvcikgewotICAJCVdTRExFbGVtZW50IGNsaXBib2FyZEVsZW1lbnQgPSAoKFdTRExFZGl0b3IpIGVQYXJ0KS5nZXRDbGlwYm9hcmRDb250ZW50cygpOwotICAJCQotICAJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUG9ydFR5cGUpIHsKLSAgCQkJaWYgKGNsaXBib2FyZEVsZW1lbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgCQkJCXBhcmVudEVsZW1lbnQgPSBlbGVtZW50OwotICAJCQl9Ci0gIAkJfQotICAJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gIAkJCWlmIChjbGlwYm9hcmRFbGVtZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gIAkJCQlwYXJlbnRFbGVtZW50ID0gKFdTRExFbGVtZW50KSAoKE9wZXJhdGlvbikgZWxlbWVudCkuZUNvbnRhaW5lcigpOwotICAJCQl9Ci0gIAkJfQotICAJfQotICAJCi0gIAlyZXR1cm4gcGFyZW50RWxlbWVudDsKLSAgfQotfQotCi1jbGFzcyBBZGRCaW5kaW5nT3BlcmF0aW9uQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gIHByb3RlY3RlZCBPcGVyYXRpb24gb3BlcmF0aW9uOwotCi0gIHB1YmxpYyBBZGRCaW5kaW5nT3BlcmF0aW9uQWN0aW9uKE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICAvLyBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREIikgKyAiICIgKyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX09QRVJBVElPTiIpLCAiaWNvbnMvb3BlcmF0aW9uYmluZGluZ19vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAib3BlcmF0aW9uIik7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9CSU5ESU5HX09QRVJBVElPTiIpLCAiaWNvbnMvb3BlcmF0aW9uYmluZGluZ19vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAib3BlcmF0aW9uIik7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBBZGRCaW5kaW5nT3BlcmF0aW9uQWN0aW9uKE5vZGUgcGFyZW50Tm9kZSwgT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIHRoaXMocGFyZW50Tm9kZSwgb3BlcmF0aW9uLmdldE5hbWUoKSwgcHJlZml4KTsKLSAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICB7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1BZGRFbGVtZW50KCk7Ci0KLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKG9wZXJhdGlvbi5nZXRJbnB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5ldyBBZGRCaW5kaW5nSW5wdXRBY3Rpb24oZWRpdG9yUGFydCwgbmV3RWxlbWVudCwgcHJlZml4KS5ydW4oKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcGVyYXRpb24uZ2V0T3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmV3IEFkZEJpbmRpbmdPdXRwdXRBY3Rpb24oZWRpdG9yUGFydCwgbmV3RWxlbWVudCwgcHJlZml4KS5ydW4oKTsKLSAgICAgIH0KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICAgIG5ldyBBZGRCaW5kaW5nRmF1bHRBY3Rpb24obmV3RWxlbWVudCwgZmF1bHQsIHByZWZpeCkucnVuKCk7Ci0gICAgICB9Ci0gICAgICBmb3JtYXQob3BlcmF0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICB9Ci19Ci0KLQotY2xhc3MgQWRkT3BlcmF0aW9uQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSAiTmV3T3BlcmF0aW9uIjsKLSAgcHJvdGVjdGVkIFBvcnRUeXBlIHBvcnRUeXBlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVTdWJDb21wb25lbnRzID0gZmFsc2U7Ci0KLSAgcHVibGljIEFkZE9wZXJhdGlvbkFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBQb3J0VHlwZSBwb3J0VHlwZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9PUEVSQVRJT04iKSwgImljb25zL29wZXJhdGlvbl9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAib3BlcmF0aW9uIik7Ci0gICAgc2V0RWRpdG9yUGFydChlZGl0b3JQYXJ0KTsKLSAgICBzZXREZWZpbml0aW9uKHBvcnRUeXBlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgdGhpcy5wb3J0VHlwZSA9IHBvcnRUeXBlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvd0RpYWxvZygpCi0gIHsKLSAgICBuYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVPcGVyYXRpb25OYW1lKHBvcnRUeXBlKTsKLSAgICBuYW1lID0gc2hvd0RpYWxvZ0hlbHBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fTkVXX09QRVJBVElPTiIpLCBuYW1lLCBOYW1lVXRpbC5nZXRVc2VkT3BlcmF0aW9uTmFtZXMocG9ydFR5cGUpKTsKLSAgICByZXR1cm4gbmFtZSAhPSBudWxsOwotICB9Ci0KLS8vICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLS8vICB7Ci0vLyAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotLy8gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpCi0gIHsKLSAgCWlmIChjcmVhdGVTdWJDb21wb25lbnRzKSB7Ci0gIAkgIAlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5vcGVyYXRpb25OYW1lID0gbmFtZTsKLSAgCSAgCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuZ2V0UGFydEluZm8ocG9ydFR5cGUpOwotICAJCU9wZXJhdGlvbiBvcGVyYXRpb24gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVPcGVyYXRpb24ocG9ydFR5cGUpOwotICAJCWZvcm1hdChvcGVyYXRpb24uZ2V0RWxlbWVudCgpKTsgIAkJCi0gIAkJc2VsZWN0T2JqZWN0KG9wZXJhdGlvbik7Ci0gIAkJZXhwYW5kRWRpdFBhcnRzKG9wZXJhdGlvbix0cnVlKTsKLSAgCX0KLSAgCWVsc2UgewotICAJCURlZmluaXRpb24gZGVmID0gcG9ydFR5cGUuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwkKLQkJCi0gIAkJLy8gQWRkIE9wZXJhdGlvbgotICAJCUFkZE9wZXJhdGlvbkNvbW1hbmQgb3BBY3Rpb24gPSBuZXcgQWRkT3BlcmF0aW9uQ29tbWFuZChwb3J0VHlwZSwgbmFtZSk7Ci0JCW9wQWN0aW9uLnJ1bigpOwotCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgb3BBY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLQkJCi0JCS8vIEFkZCBPdXRwdXQKLSAgCQlBZGRPdXRwdXRDb21tYW5kIG91dEFjdGlvbiA9IG5ldyBBZGRPdXRwdXRDb21tYW5kKG9wZXJhdGlvbiwgTmFtZVV0aWwuYnVpbGRVbmlxdWVJbnB1dE5hbWUocG9ydFR5cGUsIG9wZXJhdGlvbi5nZXROYW1lKCksICIiKSk7Ci0gIAkJb3V0QWN0aW9uLnJ1bigpOwotICAJCQotCQkvLyBBZGQgSW5wdXQKLQkJQWRkSW5wdXRDb21tYW5kIGluQWN0aW9uID0gbmV3IEFkZElucHV0Q29tbWFuZChvcGVyYXRpb24sIE5hbWVVdGlsLmJ1aWxkVW5pcXVlT3V0cHV0TmFtZShwb3J0VHlwZSwgb3BlcmF0aW9uLmdldE5hbWUoKSwgIiIpKTsKLSAgCQlpbkFjdGlvbi5ydW4oKTsKLQotICAJCWZvcm1hdChvcGVyYXRpb24uZ2V0RWxlbWVudCgpKTsKLQotIAkgIAlzZWxlY3RPYmplY3Qob3BlcmF0aW9uKTsKLSAJICAJZXhwYW5kRWRpdFBhcnRzKG9wZXJhdGlvbiwgdHJ1ZSk7Ci0gIAl9Ci0gIH0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRFZGl0UGFydHMoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZXhwYW5kQ2hpbGRyZW4pIHsKLQkgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCSAgICAJRWRpdFBhcnRWaWV3ZXIgZWRpdFBhcnRWaWV3ZXIgPSAoKFdTRExFZGl0b3IpIGVkaXRvclBhcnQpLmdldEdyYXBoVmlld2VyKCkuZ2V0Q29tcG9uZW50Vmlld2VyKCk7Ci0JICAgIAlNYXAgZWRpdFBhcnRNYXAgPSBlZGl0UGFydFZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCk7Ci0JICAgIAlXU0RMVHJlZU5vZGVFZGl0UGFydCB3c2RsRWRpdFBhcnQgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIGVkaXRQYXJ0TWFwLmdldChlbGVtZW50KTsKLQkJCXdzZGxFZGl0UGFydC5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJCQotCQkJaWYgKGV4cGFuZENoaWxkcmVuKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBXU0RMRWRpdG9yVXRpbC5nZXRNb2RlbEdyYXBoVmlld0NoaWxkcmVuKGVsZW1lbnQpLml0ZXJhdG9yKCk7Ci0JCQkJCi0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlleHBhbmRFZGl0UGFydHMoaXRlcmF0b3IubmV4dCgpLCBleHBhbmRDaGlsZHJlbik7Ci0JCQkJfQotCQkJfQotCSAgICB9Ci0JfQotCi0gIHB1YmxpYyBTdHJpbmcgc2hvd0RpYWxvZ0hlbHBlcihTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSwgTGlzdCB1c2VkTmFtZXMpCi0gIHsgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gZGVmYXVsdE5hbWU7IAotICAgIE5ld0NvbXBvbmVudFdpdGhDaGlsZERpYWxvZyBkaWFsb2cgPSBuZXcgTmV3Q29tcG9uZW50V2l0aENoaWxkRGlhbG9nKFdTRExFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgdGl0bGUsIGRlZmF1bHROYW1lLCB1c2VkTmFtZXMpOwotICAgIGludCByYyA9IGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0gICAgaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGlhbG9nLmdldE5hbWUoKTsgIAotICAgICAgY3JlYXRlU3ViQ29tcG9uZW50cyA9IGRpYWxvZy5jcmVhdGVTdWJDb21wb25lbnRzKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBudWxsOwotICAgIH0gICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19Ci0KLWFic3RyYWN0IGNsYXNzIEFkZElPRkFjdGlvbiBleHRlbmRzIEFkZEVsZW1lbnRBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIE9wZXJhdGlvbiBvcGVyYXRpb247Ci0KLSAgcHVibGljIEFkZElPRkFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBTdHJpbmcgdGV4dCwgU3RyaW5nIGltYWdlRGVzY3JpcHRvcktleSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLCBPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgc3VwZXIodGV4dCwgaW1hZ2VEZXNjcmlwdG9yS2V5LCBwYXJlbnROb2RlLCBwcmVmaXgsIGxvY2FsTmFtZSk7Ci0gICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgc2V0RWRpdG9yUGFydChlZGl0b3JQYXJ0KTsKLSAgICBzZXREZWZpbml0aW9uKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnRUb0JpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50KTsKLQotICAvKgotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgewotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgIiIpOwotICB9Ci0gICovCi0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKQotICB7Ci0gICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChkZWZpbml0aW9uKTsKLQotICAgICAgZm9yIChJdGVyYXRvciBpID0gdXRpbC5nZXRCaW5kaW5nT3BlcmF0aW9ucyhvcGVyYXRpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgICBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGJpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICBpZiAoYmluZGluZ09wZXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBlcmZvcm1BZGRFbGVtZW50VG9CaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb25FbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9ybWF0KG9wZXJhdGlvbi5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgfQotfQotCi1jbGFzcyBBZGRJbnB1dEFjdGlvbiBleHRlbmRzIEFkZElPRkFjdGlvbgotewotICBwdWJsaWMgQWRkSW5wdXRBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgTm9kZSBwYXJlbnROb2RlLCBPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoZWRpdG9yUGFydCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9JTlBVVCIpLCAiaWNvbnMvaW5wdXRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgImlucHV0Iiwgb3BlcmF0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50VG9CaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwgRWxlbWVudCBiaW5kaW5nT3BlcmF0aW9uRWxlbWVudCkKLSAgewotICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpID09IG51bGwpCi0gICAgewotICAgICAgbmV3IEFkZEJpbmRpbmdJbnB1dEFjdGlvbihlZGl0b3JQYXJ0LCBiaW5kaW5nT3BlcmF0aW9uRWxlbWVudCwgcHJlZml4KS5ydW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkgewotICAJUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpICgoV1NETEVsZW1lbnRJbXBsKSBvcGVyYXRpb24pLmdldENvbnRhaW5lcigpOwotICAJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9UWVBFX09SX0RFRklOSVRJT04gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5nZXRQYXJ0SW5mbyhwb3J0VHlwZSk7Ci0gIAlJbnB1dCBpbnB1dCA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZUlucHV0KHBvcnRUeXBlLCBvcGVyYXRpb24sIG51bGwpOyAKLSAgCWZvcm1hdChpbnB1dC5nZXRFbGVtZW50KCkpOwotICAJc2VsZWN0T2JqZWN0KGlucHV0KTsKLSAgfQotfQotCi1jbGFzcyBBZGRPdXRwdXRBY3Rpb24gZXh0ZW5kcyBBZGRJT0ZBY3Rpb24KLXsKLSAgcHVibGljIEFkZE91dHB1dEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBOb2RlIHBhcmVudE5vZGUsIE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBzdXBlcihlZGl0b3JQYXJ0LCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX09VVFBVVCIpLCAiaWNvbnMvb3V0cHV0X29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJvdXRwdXQiLCBvcGVyYXRpb24pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnRUb0JpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50KQotICB7Ci0gICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpID09IG51bGwpCi0gICAgewotICAgICAgbmV3IEFkZEJpbmRpbmdPdXRwdXRBY3Rpb24oZWRpdG9yUGFydCwgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQsIHByZWZpeCkucnVuKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpIHsKLSAgCS8vIERldGVybWluZSBQYXJ0IGluZm8KLSAgCVBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSAoKFdTRExFbGVtZW50SW1wbCkgb3BlcmF0aW9uKS5nZXRDb250YWluZXIoKTsKLSAgCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuZ2V0UGFydEluZm8ocG9ydFR5cGUpOwotICAJT3V0cHV0IG91dHB1dCA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU91dHB1dChwb3J0VHlwZSwgb3BlcmF0aW9uKTsgCi0gIAlmb3JtYXQob3V0cHV0LmdldEVsZW1lbnQoKSk7Ci0gIAlzZWxlY3RPYmplY3Qob3V0cHV0KTsKLSAgfQotfQotCi1jbGFzcyBBZGRGYXVsdEFjdGlvbiBleHRlbmRzIEFkZElPRkFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSAiTmV3RmF1bHQiOwotICBwdWJsaWMgQWRkRmF1bHRBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgTm9kZSBwYXJlbnROb2RlLCBPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoZWRpdG9yUGFydCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9GQVVMVCIpLCAiaWNvbnMvZmF1bHRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgImZhdWx0Iiwgb3BlcmF0aW9uKTsKLSAgICBuYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVGYXVsdE5hbWUob3BlcmF0aW9uKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKQotICB7Ci0gICAgbmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlRmF1bHROYW1lKG9wZXJhdGlvbik7Ci0gICAgbmFtZSA9IHNob3dEaWFsb2dIZWxwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX05FV19GQVVMVCIpLCBuYW1lLCBOYW1lVXRpbC5nZXRVc2VkRmF1bHROYW1lcyhvcGVyYXRpb24pKTsKLSAgICByZXR1cm4gbmFtZSAhPSBudWxsOwotICB9Ci0KLSAgLyoKLSAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibWVzc2FnZSIsICIiKTsKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotICB9Ci0gICovCi0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnRUb0JpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50KQotICB7Ci0gICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0ZhdWx0KG5hbWUpID09IG51bGwpCi0gICAgewotICAgICAgbmV3IEFkZEJpbmRpbmdGYXVsdEFjdGlvbihiaW5kaW5nT3BlcmF0aW9uRWxlbWVudCwgcHJlZml4KS5ydW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkgewotICAJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuZmF1bHROYW1lID0gbmFtZTsKLSAgCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuZ2V0UGFydEluZm8ob3BlcmF0aW9uKTsKLSAgCUZhdWx0IGZhdWx0ID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlRmF1bHQob3BlcmF0aW9uKTsKLSAgCWZvcm1hdChmYXVsdC5nZXRFbGVtZW50KCkpOyAgCQotICAJc2VsZWN0T2JqZWN0KGZhdWx0KTsKLSAgfQotfQotCi1jbGFzcyBBZGRCaW5kaW5nSW5wdXRBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIHB1YmxpYyBBZGRCaW5kaW5nSW5wdXRBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9JTlBVVCIpLCAiaWNvbnMvaW5wdXRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgImlucHV0Iik7Ci0gICAgc2V0RWRpdG9yUGFydChlZGl0b3JQYXJ0KTsKLSAgfQotfQotCi1jbGFzcyBBZGRCaW5kaW5nT3V0cHV0QWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwdWJsaWMgQWRkQmluZGluZ091dHB1dEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX09VVFBVVCIpLCAiaWNvbnMvb3V0cHV0X29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJvdXRwdXQiKTsKLSAgICBzZXRFZGl0b3JQYXJ0KGVkaXRvclBhcnQpOwotICB9Ci19Ci0KLWNsYXNzIEFkZEJpbmRpbmdGYXVsdEFjdGlvbiBleHRlbmRzIEFkZEVsZW1lbnRBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIEZhdWx0IGZhdWx0OwotCi0gIHB1YmxpYyBBZGRCaW5kaW5nRmF1bHRBY3Rpb24oTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9GQVVMVCIpLCAiaWNvbnMvZmF1bHRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgImZhdWx0Iik7Ci0gIH0KLQotICBwdWJsaWMgQWRkQmluZGluZ0ZhdWx0QWN0aW9uKE5vZGUgcGFyZW50Tm9kZSwgRmF1bHQgZmF1bHQsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICB0aGlzKHBhcmVudE5vZGUsIHByZWZpeCk7Ci0gICAgdGhpcy5mYXVsdCA9IGZhdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBpZiAoZmF1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsICJOZXdGYXVsdCIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBmYXVsdC5nZXROYW1lKCkpOwotICAgIH0KLSAgfQotfQotCi1jbGFzcyBBZGRNZXNzYWdlQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLSAgcHVibGljIEFkZE1lc3NhZ2VBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9NRVNTQUdFIiksICJpY29ucy9tZXNzYWdlX29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJtZXNzYWdlIik7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIEFkZE1lc3NhZ2VBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4LCBEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfTUVTU0FHRSIpLCAiaWNvbnMvbWVzc2FnZV9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAibWVzc2FnZSIpOwotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnNldERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotICAgIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBzaG93RGlhbG9nKCkKLSAgewotICAgIG5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKGRlZmluaXRpb24sIG5hbWUpOwotICAgIG5hbWUgPSBzaG93RGlhbG9nSGVscGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ORVdfTUVTU0FHRSIpLCBuYW1lLCBOYW1lVXRpbC5nZXRVc2VkTWVzc2FnZU5hbWVzKGRlZmluaXRpb24pKTsKLSAgICByZXR1cm4gbmFtZSAhPSBudWxsOwotICB9Ci0KLS8vICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLS8vICB7Ci0vLyAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotLy8gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkgewotICAJTm9kZUxpc3QgbGlzdCA9IGRvY3VtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgCWlmIChwYXJlbnROb2RlID09IG51bGx8fCBsaXN0LmdldExlbmd0aCgpID09IDApIHsKLSAgCQljcmVhdGVEZWZpbml0aW9uU3R1YigpOwotICAJfQotICAJCi0gIAlBZGRNZXNzYWdlQ29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmaW5pdGlvbiwgbmFtZSk7Ci0JYWN0aW9uLnJ1bigpOwotCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBhY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLQlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVQYXJ0KG1lc3NhZ2UpOwotCWZvcm1hdChtZXNzYWdlLmdldEVsZW1lbnQoKSk7Ci0Jc2VsZWN0T2JqZWN0KG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci19Ci0KLWNsYXNzIEFkZFBhcnRBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIHByb3RlY3RlZCBNZXNzYWdlIG1lc3NhZ2U7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICBwdWJsaWMgQWRkUGFydEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBNZXNzYWdlIG1lc3NhZ2UsIE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfUEFSVCIpLCAiaWNvbnMvcGFydF9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAicGFydCIpOwotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgc2V0RWRpdG9yUGFydChlZGl0b3JQYXJ0KTsKLSAgICBzZXREZWZpbml0aW9uKG1lc3NhZ2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKQotICB7Ci0gICAgbmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlUGFydE5hbWUobWVzc2FnZSwgbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICBuYW1lID0gc2hvd0RpYWxvZ0hlbHBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fTkVXX1BBUlQiKSwgbmFtZSwgTmFtZVV0aWwuZ2V0VXNlZFBhcnROYW1lcyhtZXNzYWdlKSk7Ci0gICAgcmV0dXJuIG5hbWUgIT0gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICB7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLSAgICBTdHJpbmcgeHNkUHJlZml4ID0gbWVzc2FnZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0UHJlZml4KFdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkkpOwotICAgIGlmICh4c2RQcmVmaXggPT0gbnVsbCkKLSAgICB7Ci0gICAgCUVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QobWVzc2FnZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOyAgICAJCi0gICAgICAgIG5ldyBBZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNBY3Rpb24oZGVmaW5pdGlvbkVsZW1lbnQsIFdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkksICJ4c2QiKS5ydW4oKTsKLQkJeHNkUHJlZml4ID0gbWVzc2FnZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0UHJlZml4KFdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkkpOwotICAgIH0KLQkJCQotICAgIFN0cmluZyBkZWZhdWx0VHlwZU5hbWUgPSAic3RyaW5nIjsKLSAgICBpZiAoeHNkUHJlZml4ICE9IG51bGwgJiYgeHNkUHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBkZWZhdWx0VHlwZU5hbWUgPSB4c2RQcmVmaXggKyAiOiIgKyBkZWZhdWx0VHlwZU5hbWU7Ci0gICAgfQotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgZGVmYXVsdFR5cGVOYW1lKTsKLSAgfQotfQotCi1jbGFzcyBBZGRTZXJ2aWNlQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLSAgcHVibGljIEFkZFNlcnZpY2VBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9TRVJWSUNFIiksICJpY29ucy9zZXJ2aWNlX29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJzZXJ2aWNlIik7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIEFkZFNlcnZpY2VBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4LCBEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfU0VSVklDRSIpLCAiaWNvbnMvc2VydmljZV9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAic2VydmljZSIpOwotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnNldERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotICAgIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvd0RpYWxvZygpCi0gIHsKLSAgICBpZiAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZVNlcnZpY2VOYW1lKGRlZmluaXRpb24pOwotICAgIH0KLSAgICBuYW1lID0gc2hvd0RpYWxvZ0hlbHBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fTkVXX1NFUlZJQ0UiKSwgbmFtZSwgTmFtZVV0aWwuZ2V0VXNlZFNlcnZpY2VOYW1lcyhkZWZpbml0aW9uKSk7Ci0gICAgcmV0dXJuIG5hbWUgIT0gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICB7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKSB7ICAJCi0gIAlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCB8fCBsaXN0LmdldExlbmd0aCgpID09IDApIHsKLSAgCQljcmVhdGVEZWZpbml0aW9uU3R1YigpOwotICAJfQotICAJCi0gIAlzdXBlci5wZXJmb3JtQWRkRWxlbWVudCgpOwotICB9Ci19Ci0KLWNsYXNzIEFkZFBvcnRUeXBlQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLSAgcHVibGljIEFkZFBvcnRUeXBlQWN0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIG5hbWUsIE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfUE9SVFRZUEUiKSwgImljb25zL3BvcnR0eXBlX29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJwb3J0VHlwZSIpOwotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICBzZXRDb21wdXRlVG9wTGV2ZWxSZWZDaGlsZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBBZGRQb3J0VHlwZUFjdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lLCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgsIERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9QT1JUVFlQRSIpLCAiaWNvbnMvcG9ydHR5cGVfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgInBvcnRUeXBlIik7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMuc2V0RGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0gICAgc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKQotICB7Ci0gICAgbmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlUG9ydFR5cGVOYW1lKGRlZmluaXRpb24sIG5hbWUpOwotICAgIG5hbWUgPSBzaG93RGlhbG9nSGVscGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ORVdfUE9SVFRZUEUiKSwgbmFtZSwgTmFtZVV0aWwuZ2V0VXNlZFBvcnRUeXBlTmFtZXMoZGVmaW5pdGlvbikpOwotICAgIHJldHVybiBuYW1lICE9IG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgewotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBvcnRUeXBlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKSB7Ci0gIAlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCB8fCBsaXN0LmdldExlbmd0aCgpID09IDApIHsKLSAgCQljcmVhdGVEZWZpbml0aW9uU3R1YigpOwotICAJfQotICAJCi0gIAlzdXBlci5wZXJmb3JtQWRkRWxlbWVudCgpOwotICB9Ci19Ci0KLWNsYXNzIEFkZEJpbmRpbmdBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotCi0gIHB1YmxpYyBBZGRCaW5kaW5nQWN0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwgRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0JJTkRJTkciKSwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFdTRExFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9iaW5kaW5nX29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAvL3NldFRvb2xUaXBUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQklORElOR19XSVpBUkQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBCaW5kaW5nV2l6YXJkIHdpemFyZCA9IG5ldyBCaW5kaW5nV2l6YXJkKGRlZmluaXRpb24sIGRvY3VtZW50KTsKLSAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQotICAgIGludCByZXN1bHQgPSB3aXphcmREaWFsb2cub3BlbigpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgewotICAgICAgLy90b2RvLi4uICAgICAgCi0gICAgfQotICB9Ci19Ci0KLWNsYXNzIEFkZFBvcnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLQlwcm90ZWN0ZWQgU2VydmljZSBzZXJ2aWNlOwotCi0JcHVibGljIEFkZFBvcnRBY3Rpb24oU2VydmljZSBzZXJ2aWNlKQotCXsKLQkJc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9QT1JUIiksIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShXU0RMRWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvYmluZGluZ19vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCS8vc2V0VG9vbFRpcFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX1dJWkFSRCIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpCi0JewotCQlQb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBQb3J0V2l6YXJkKHNlcnZpY2UpOwotCQlXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQl3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0KLQkJaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotCQl7Ci0JCQkvL3RvZG8uLi4gICAgICAKLQkJfQotCX0KLX0KLQotY2xhc3MgR2VuZXJhdGVCaW5kaW5nQ29udGVudEFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotCXByb3RlY3RlZCBCaW5kaW5nIGJpbmRpbmc7Ci0JcHVibGljIEdlbmVyYXRlQmluZGluZ0NvbnRlbnRBY3Rpb24oQmluZGluZyBiaW5kaW5nLCBib29sZWFuIGlzRWRpdGFibGUpCi0JewotCQlzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9HRU5FUkFURV9CSU5ESU5HX0NPTlRFTlQiKSk7Ci0JCXRoaXMuYmluZGluZyA9IGJpbmRpbmc7Ci0JCXNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpCi0JewotCQlCaW5kaW5nV2l6YXJkIHdpemFyZCA9IG5ldyBCaW5kaW5nV2l6YXJkKGJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBCaW5kaW5nV2l6YXJkLktJTkRfUkVHRU5FUkFURV9CSU5ESU5HKTsKLQkJd2l6YXJkLnNldEJpbmRpbmdOYW1lKENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0TmFtZShiaW5kaW5nKSk7Ci0JCXdpemFyZC5zZXRQb3J0VHlwZU5hbWUoQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRQb3J0VHlwZVJlZmVyZW5jZShiaW5kaW5nKSk7Ci0JCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCXdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQkJd2l6YXJkRGlhbG9nLm9wZW4oKTsJCi0JfQotfQotCi0vL1RoaXMgaXMgYSB0ZW1wb3JhcnkgY2xhc3MgdG8gYWxsb3cgcmVuYW1pbmcuICBUaGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aGVuIGRpcmVjdAotLy9yZW5hbWluZyBpcyByZWFkeQotY2xhc3MgUmVuYW1lRGlhbG9nQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIFdTRExFbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdE5hbWUgPSAiTmV3TmFtZSI7Ci0JcHJpdmF0ZSBMaXN0IHVzZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIGJvb2xlYW4gdXNlU21hcnRSZW5hbWUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gc2hvd0RpYWxvZyA9IGZhbHNlOwotCQotCXB1YmxpYyBSZW5hbWVEaWFsb2dBY3Rpb24oV1NETEVsZW1lbnQgc2VsZWN0aW9uKSB7Ci0JCXNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX1JFTkFNRSIpKTsKLQkJZWxlbWVudCA9IHNlbGVjdGlvbjsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVN0cmluZyByZXN1bHQ7Ci0KLQkJTmV3Q29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IG5ldyBOZXdDb21wb25lbnREaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fUkVOQU1FIiksIGRlZmF1bHROYW1lLCB1c2VkTmFtZXMpOwotCQlpbnQgcmMgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotCQlpZiAocmMgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLQkJewotCQkgIHJlc3VsdCA9IGRpYWxvZy5nZXROYW1lKCk7Ci0JCSAgaWYgKHVzZVNtYXJ0UmVuYW1lKSB7Ci0JCSAgCVNtYXJ0UmVuYW1lQWN0aW9uIHNtYXJ0UmVuYW1lID0gbmV3IFNtYXJ0UmVuYW1lQWN0aW9uKGVsZW1lbnQsIHJlc3VsdCk7CQotCQkgIAlzbWFydFJlbmFtZS5ydW4oKTsKLQkJICB9Ci0JCSAgZWxzZSB7Ci0JCSAgCVJlbmFtZUFjdGlvbiByZW5hbWUgPSBuZXcgUmVuYW1lQWN0aW9uKGVsZW1lbnQsIHJlc3VsdCk7Ci0JCSAgCXJlbmFtZS5ydW4oKTsKLQkJICB9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGYXVsdCkgewotCQkJdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZEZhdWx0TmFtZXMoKE9wZXJhdGlvbikgKChGYXVsdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpKTsKLQkJCWRlZmF1bHROYW1lID0gKChGYXVsdCkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCi0JCQlzaG93RGlhbG9nID0gdHJ1ZTsKLQkJCXVzZVNtYXJ0UmVuYW1lID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWVzc2FnZSkgewotCQkJdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZE1lc3NhZ2VOYW1lcyhlbGVtZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0JCQlkZWZhdWx0TmFtZSA9ICgoTWVzc2FnZSkgZWxlbWVudCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCQotCQkJc2hvd0RpYWxvZyA9IHRydWU7Ci0JCQl1c2VTbWFydFJlbmFtZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotCQkJdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZE9wZXJhdGlvbk5hbWVzKChQb3J0VHlwZSkgKChPcGVyYXRpb24pIGVsZW1lbnQpLmVDb250YWluZXIoKSk7CQkKLQkJCWRlZmF1bHROYW1lID0gKChPcGVyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQotCQkJc2hvd0RpYWxvZyA9IHRydWU7Ci0JCQl1c2VTbWFydFJlbmFtZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBhcnQpIHsKLQkJCXVzZWROYW1lcyA9IE5hbWVVdGlsLmdldFVzZWRQYXJ0TmFtZXMoKE1lc3NhZ2UpICgoUGFydCkgZWxlbWVudCkuZUNvbnRhaW5lcigpKTsJCQkKLQkJCWRlZmF1bHROYW1lID0gKChQYXJ0KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkKLQkJCXNob3dEaWFsb2cgPSB0cnVlOwotCQkJdXNlU21hcnRSZW5hbWUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQb3J0VHlwZSkgewotCQkJdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZFBvcnRUeXBlTmFtZXMoZWxlbWVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQkJZGVmYXVsdE5hbWUgPSAoKFBvcnRUeXBlKSBlbGVtZW50KS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCi0JCQlzaG93RGlhbG9nID0gdHJ1ZTsKLQkJCXVzZVNtYXJ0UmVuYW1lID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBvcnQpIHsKLQkJCXVzZWROYW1lcyA9IE5hbWVVdGlsLmdldFVzZWRQb3J0TmFtZXMoKFNlcnZpY2UpICgoUG9ydCkgZWxlbWVudCkuZUNvbnRhaW5lcigpKTsKLQkJCWRlZmF1bHROYW1lID0gKChQb3J0KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkKLQkJCXNob3dEaWFsb2cgPSB0cnVlOwotCQkJdXNlU21hcnRSZW5hbWUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCaW5kaW5nKSB7Ci0JCQl1c2VkTmFtZXMgPSBOYW1lVXRpbC5nZXRVc2VkQmluZGluZ05hbWVzKGVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsJCQkKLQkJCWRlZmF1bHROYW1lID0gKChCaW5kaW5nKSBlbGVtZW50KS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCi0JCQlzaG93RGlhbG9nID0gdHJ1ZTsKLQkJCXVzZVNtYXJ0UmVuYW1lID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2UpIHsKLQkJCXVzZWROYW1lcyA9IE5hbWVVdGlsLmdldFVzZWRTZXJ2aWNlTmFtZXMoZWxlbWVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQkJZGVmYXVsdE5hbWUgPSAoKFNlcnZpY2UpIGVsZW1lbnQpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQkKLQkJCXNob3dEaWFsb2cgPSB0cnVlOwotCQkJdXNlU21hcnRSZW5hbWUgPSBmYWxzZTsKLQkJfQotCQl1c2VkTmFtZXMucmVtb3ZlKGRlZmF1bHROYW1lKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc2hvd1JlbmFtZURpYWxvZygpIHsKLQkJcmV0dXJuIHNob3dEaWFsb2c7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETE1lbnVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMTWVudUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MWMyMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMTWVudUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFdTRExNZW51TGlzdGVuZXIgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotICBwcm90ZWN0ZWQgRXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvciBleHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yOwotCi0gIHB1YmxpYyBXU0RMTWVudUxpc3RlbmVyKFdTRExFZGl0b3IgZWRpdG9yLCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICBzdXBlcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuZXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvciA9IG5ldyBFeHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yKGVkaXRvcik7Ci0gICAgdGhpcy5zZWxlY3Rpb25Qcm92aWRlciA9IHNlbGVjdGlvblByb3ZpZGVyOyAgICAgICAgICAgICAgCi0gIH0KLSAgICAgIAotICBwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGVkT2JqZWN0KCkKLSAgeyAgICAgIAotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7ICAgIAotICAgIHJldHVybiBzZWxlY3Rpb24uaXNFbXB0eSgpID8gbnVsbCA6ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgT2JqZWN0IG9iamVjdCA9IGdldFNlbGVjdGVkT2JqZWN0KCk7Ci0gICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICB7Ci0gICAgICBub2RlID0gKE5vZGUpb2JqZWN0OwotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICB7Ci0gICAgICBub2RlID0gKChXU0RMRWxlbWVudClvYmplY3QpLmdldEVsZW1lbnQoKTsgICAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkKLSAgICB7Ci0gICAgICBub2RlID0gICgoV1NETEdyb3VwT2JqZWN0KW9iamVjdCkuZ2V0RGVmaW5pdGlvbigpLmdldEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgZXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvci5jb250cmlidXRlTWVudUFjdGlvbnMobWFuYWdlciwgbm9kZSwgb2JqZWN0KTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTk4MTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkQmluZGluZ0NvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZTsKLSAgcHJpdmF0ZSBCaW5kaW5nIGJpbmRpbmc7Ci0gCi0gIHB1YmxpYyBBZGRCaW5kaW5nQ29tbWFuZAotCQkoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAgCi0JCSBTdHJpbmcgbG9jYWxOYW1lKQotCXsKLQkgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLQl9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGJpbmRpbmc7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmluZGluZyA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgYmluZGluZy5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSxsb2NhbE5hbWUpKTsKLSAgICBiaW5kaW5nLnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgZGVmaW5pdGlvbi5hZGRCaW5kaW5nKGJpbmRpbmcpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nRmF1bHRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nRmF1bHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTAyYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ0ZhdWx0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkQmluZGluZ0ZhdWx0Q29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0OwotICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb247Ci0gIFN0cmluZyBuYW1lOwotICAKLSAgcHVibGljIEFkZEJpbmRpbmdGYXVsdENvbW1hbmQoQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMuYmluZGluZ09wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBiaW5kaW5nRmF1bHQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgYmluZGluZ0ZhdWx0LnNldE5hbWUobmFtZSk7IAotICAgIGJpbmRpbmdGYXVsdC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGJpbmRpbmdPcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdCgoQmluZGluZ0ZhdWx0KWJpbmRpbmdGYXVsdCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gYmluZGluZ0ZhdWx0OwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdJbnB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdJbnB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwM2I0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nSW5wdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRCaW5kaW5nSW5wdXRDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQ7Ci0gIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbjsKLSAgU3RyaW5nIG5hbWU7Ci0gIAotICBwdWJsaWMgQWRkQmluZGluZ0lucHV0Q29tbWFuZChCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sIFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5iaW5kaW5nT3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGJpbmRpbmdJbnB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICBiaW5kaW5nSW5wdXQuc2V0TmFtZShuYW1lKTsgCi0gICAgYmluZGluZ0lucHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oYmluZGluZ09wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ0lucHV0KChCaW5kaW5nSW5wdXQpYmluZGluZ0lucHV0KTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBiaW5kaW5nSW5wdXQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdPcGVyYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nT3BlcmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWUwZjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdPcGVyYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZEJpbmRpbmdPcGVyYXRpb25Db21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgQmluZGluZyBiaW5kaW5nOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgYmluZGluZ0lucHV0TmFtZSA9ICIiOwotICBwcml2YXRlIFN0cmluZyBiaW5kaW5nT3V0cHV0TmFtZSA9ICIiOwotICBwcml2YXRlIFN0cmluZyBiaW5kaW5nRmF1bHROYW1lID0iIjsKLSAgCi0gIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uOwotICAKLSAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUJpbmRpbmdJbnB1dCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlQmluZGluZ091dHB1dCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlQmluZGluZ0ZhdWx0ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgQWRkQmluZGluZ09wZXJhdGlvbkNvbW1hbmQoQmluZGluZyBiaW5kaW5nLFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgQWRkQmluZGluZ09wZXJhdGlvbkNvbW1hbmQKLSAgICAoQmluZGluZyBiaW5kaW5nLCAgCi0gICAgIFN0cmluZyBuYW1lLAotICAgICBib29sZWFuIGNyZWF0ZUJpbmRpbmdJbnB1dCwKLSAgICAgYm9vbGVhbiBjcmVhdGVCaW5kaW5nT3V0cHV0LAotICAgICBib29sZWFuIGNyZWF0ZUJpbmRpbmdGYXVsdCkKLSAgewotICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmNyZWF0ZUJpbmRpbmdJbnB1dCA9IGNyZWF0ZUJpbmRpbmdJbnB1dDsKLSAgICB0aGlzLmNyZWF0ZUJpbmRpbmdPdXRwdXQgPSBjcmVhdGVCaW5kaW5nT3V0cHV0OwotICAgIHRoaXMuY3JlYXRlQmluZGluZ0ZhdWx0ID0gY3JlYXRlQmluZGluZ0ZhdWx0OwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBiaW5kaW5nT3BlcmF0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLnNldE5hbWUobmFtZSk7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICBiaW5kaW5nLmFkZEJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICBXU0RMRWxlbWVudENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgaWYgKGNyZWF0ZUJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZEJpbmRpbmdJbnB1dENvbW1hbmQoYmluZGluZ09wZXJhdGlvbixiaW5kaW5nSW5wdXROYW1lKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgfQotCi0gICAgaWYgKGNyZWF0ZUJpbmRpbmdPdXRwdXQpCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRCaW5kaW5nT3V0cHV0Q29tbWFuZChiaW5kaW5nT3BlcmF0aW9uLGJpbmRpbmdPdXRwdXROYW1lKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgfQotCi0gICAgaWYgKGNyZWF0ZUJpbmRpbmdGYXVsdCkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZEJpbmRpbmdGYXVsdENvbW1hbmQoYmluZGluZ09wZXJhdGlvbixiaW5kaW5nRmF1bHROYW1lKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nSW5wdXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5iaW5kaW5nSW5wdXROYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QmluZGluZ091dHB1dE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmdPdXRwdXROYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QmluZGluZ0ZhdWx0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMuYmluZGluZ0ZhdWx0TmFtZSA9IG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdPdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nT3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjg2YjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdPdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkQmluZGluZ091dHB1dENvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0OwotICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb247Ci0gIFN0cmluZyBuYW1lOwotICAKLSAgcHVibGljIEFkZEJpbmRpbmdPdXRwdXRDb21tYW5kKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmdPcGVyYXRpb24gPSBiaW5kaW5nT3BlcmF0aW9uOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmluZGluZ091dHB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgYmluZGluZ091dHB1dC5zZXROYW1lKG5hbWUpOyAKLSAgICBiaW5kaW5nT3V0cHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oYmluZGluZ09wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dCgoQmluZGluZ091dHB1dCliaW5kaW5nT3V0cHV0KTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBiaW5kaW5nT3V0cHV0OwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEZhdWx0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkRmF1bHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYTA2YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkRmF1bHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlNtYXJ0UmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZEZhdWx0Q29tbWFuZCBleHRlbmRzIEFkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kCi17Ci0gIHByaXZhdGUgRmF1bHQgb3JpZ2luYWxGYXVsdDsKLSAgCi0gIHB1YmxpYyBBZGRGYXVsdENvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihvcGVyYXRpb24sbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgQWRkRmF1bHRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGNyZWF0ZU1lc3NhZ2UpCi0gIHsKLSAgICBzdXBlcihvcGVyYXRpb24sbmFtZSxjcmVhdGVNZXNzYWdlKTsKLSAgfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYSBGYXVsdCBiYXNlZCBvbiB0aGUgZ2l2ZW4gRmF1bHQuICBJbiBlc3NlbmNlLCB0aGlzIHdpbGwKLSAgICogY3JlYXRlIGEgY29weSBvZiB0aGUgZ2l2ZW4gRmF1bHQuCi0gICAqLwotICBwdWJsaWMgQWRkRmF1bHRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIEZhdWx0IG9yaWdpbmFsRmF1bHQsIFN0cmluZyBuYW1lKSB7Ci0gIAlzdXBlcihvcGVyYXRpb24sIG5hbWUsIGZhbHNlKTsKLSAgCQotICAJdGhpcy5vcmlnaW5hbEZhdWx0ID0gb3JpZ2luYWxGYXVsdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIG1lc3NhZ2VSZWZlcmVuY2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmF1bHQoKTsKLSAgICBtZXNzYWdlUmVmZXJlbmNlLnNldE5hbWUobmFtZSk7IAotICAgIG1lc3NhZ2VSZWZlcmVuY2Uuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICBvcGVyYXRpb24uYWRkRmF1bHQoKEZhdWx0KW1lc3NhZ2VSZWZlcmVuY2UpOwotICAgIAotICAgIC8vICBUQkQgLSBhZGQgYmluZGluZyBmYXVsdAotCi0gICAgaWYgKG9yaWdpbmFsRmF1bHQgPT0gbnVsbCkgewotICAgIAlpZiAoY3JlYXRlTWVzc2FnZSkKLSAgICAJCWNyZWF0ZU1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCS8vIERvIG5lY2Vzc2FyeSBjb3B5aW5nIG9mIGRhdGEgZnJvbSBvcmlnaW5hbCBGYXVsdCB0byBuZXcgRmF1bHQKLSAgICAJaWYgKG9yaWdpbmFsRmF1bHQuZ2V0RU1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0gICAgCQlTdHJpbmcgb3JpZ2luYWxNc2dOYW1lID0gb3JpZ2luYWxGYXVsdC5nZXRFTWVzc2FnZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgCQkKLSAgICAJCWJvb2xlYW4gZ2VuZWQgPSBmYWxzZTsKLSAgICAJCWlmIChvcmlnaW5hbEZhdWx0LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE9wZXJhdGlvbikKLSAgICAJCQlnZW5lZCA9IFNtYXJ0UmVuYW1lQWN0aW9uLmlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob3JpZ2luYWxNc2dOYW1lLCAoKE9wZXJhdGlvbikgb3JpZ2luYWxGYXVsdC5lQ29udGFpbmVyKCkpLmdldE5hbWUoKSwgIiIpOwotICAgIAkJCi0gICAgCQlTdHJpbmcgbmV3TXNnTmFtZSA9ICIiOwotICAgIAkJaWYgKGdlbmVkKSB7Ci0gICAgCQkJbmV3TXNnTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUob3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgbWVzc2FnZVJlZmVyZW5jZSk7Ci0gICAgCQl9Ci0gICAgCQllbHNlIHsKLSAgICAJCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIAkJCU1lc3NhZ2UgdE1lc3NhZ2UgPSBvcmlnaW5hbEZhdWx0LmdldEVNZXNzYWdlKCk7Ci0gICAgCQkJbmV3TXNnTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUoZGVmaW5pdGlvbiwgdE1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgCQl9Ci0gICAgCQkKLSAgICAJCWNyZWF0ZU1lc3NhZ2Uob3JpZ2luYWxGYXVsdCwgTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBtZXNzYWdlUmVmZXJlbmNlKSk7Ci0gICAgCX0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEltcG9ydENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEltcG9ydENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjNGViNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRJbXBvcnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRJbXBvcnRDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotICBwcml2YXRlIEltcG9ydCBpbXBvcnRFbGVtZW50OwotICAKLSAgcHVibGljIEFkZEltcG9ydENvbW1hbmQKLSAgCShEZWZpbml0aW9uIGRlZmluaXRpb24sICAKLSAgCSBTdHJpbmcgbmFtZXNwYWNlLAotICAJIFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGltcG9ydEVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaW1wb3J0RWxlbWVudCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbXBvcnQoKTsKLSAgICBpbXBvcnRFbGVtZW50LnNldE5hbWVzcGFjZVVSSShuYW1lc3BhY2UpOwotICAgIGltcG9ydEVsZW1lbnQuc2V0TG9jYXRpb25VUkkobG9jYXRpb24pOwotICAgIGltcG9ydEVsZW1lbnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICBkZWZpbml0aW9uLmFkZEltcG9ydChpbXBvcnRFbGVtZW50KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRJbnB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZElucHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTMzYjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZElucHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5TbWFydFJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRJbnB1dENvbW1hbmQgZXh0ZW5kcyBBZGRNZXNzYWdlUmVmZXJlbmNlQ29tbWFuZAotewotICBwcml2YXRlIElucHV0IG9yaWdpbmFsSW5wdXQ7Ci0JCi0gIHB1YmxpYyBBZGRJbnB1dENvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihvcGVyYXRpb24sbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgQWRkSW5wdXRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGNyZWF0ZU1lc3NhZ2UpCi0gIHsKLSAgICBzdXBlcihvcGVyYXRpb24sbmFtZSxjcmVhdGVNZXNzYWdlKTsKLSAgfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYW4gSW5wdXQgYmFzZWQgb24gdGhlIGdpdmVuIElucHV0LiAgSW4gZXNzZW5jZSwgdGhpcyB3aWxsCi0gICAqIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIElucHV0LgotICAgKi8KLSAgcHVibGljIEFkZElucHV0Q29tbWFuZChPcGVyYXRpb24gb3BlcmF0aW9uLCBJbnB1dCBvcmlnaW5hbElucHV0LCBTdHJpbmcgbmFtZSkgewotICAJc3VwZXIob3BlcmF0aW9uLCBuYW1lLCBmYWxzZSk7Ci0gIAkKLSAgCXRoaXMub3JpZ2luYWxJbnB1dCA9IG9yaWdpbmFsSW5wdXQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBtZXNzYWdlUmVmZXJlbmNlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlucHV0KCk7Ci0gIC8vICBtZXNzYWdlUmVmZXJlbmNlLnNldE5hbWUobmFtZSk7IAotICAgIG1lc3NhZ2VSZWZlcmVuY2Uuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICBvcGVyYXRpb24uc2V0SW5wdXQoKElucHV0KW1lc3NhZ2VSZWZlcmVuY2UpOwotICAgIAotICAgIC8vIFRCRCAtIGFkZCBiaW5kaW5nIGlucHV0IAotICAgIAotICAgIGlmIChvcmlnaW5hbElucHV0ID09IG51bGwpIHsKLSAgICAJaWYgKGNyZWF0ZU1lc3NhZ2UpCi0gICAgCQljcmVhdGVNZXNzYWdlKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgIAkvLyBEbyBuZWNlc3NhcnkgY29weWluZyBvZiBkYXRhIGZyb20gb3JpZ2luYWwgSW5wdXQgdG8gbmV3IElucHV0Ci0gICAgCWlmIChvcmlnaW5hbElucHV0LmdldEVNZXNzYWdlKCkgIT0gbnVsbCkgewotICAgIAkJU3RyaW5nIG9yaWdpbmFsTXNnTmFtZSA9IG9yaWdpbmFsSW5wdXQuZ2V0RU1lc3NhZ2UoKS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgIAkJCi0gICAgCQlib29sZWFuIGdlbmVkID0gZmFsc2U7Ci0gICAgCQlpZiAob3JpZ2luYWxJbnB1dC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0gICAgCQkJZ2VuZWQgPSBTbWFydFJlbmFtZUFjdGlvbi5pc01lc3NhZ2VOYW1lR2VuZXJhdGVkKG9yaWdpbmFsTXNnTmFtZSwgKChPcGVyYXRpb24pIG9yaWdpbmFsSW5wdXQuZUNvbnRhaW5lcigpKS5nZXROYW1lKCksICJSZXF1ZXN0Iik7Ci0gICAgCQkKLSAgICAJCVN0cmluZyBuZXdNc2dOYW1lID0gIiI7Ci0gICAgCQlpZiAoZ2VuZWQpIHsKLSAgICAJCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBtZXNzYWdlUmVmZXJlbmNlKTsKLSAgICAJCX0KLSAgICAJCWVsc2UgewotICAgIAkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgCQkJTWVzc2FnZSB0TWVzc2FnZSA9IG9yaWdpbmFsSW5wdXQuZ2V0RU1lc3NhZ2UoKTsKLSAgICAJCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShkZWZpbml0aW9uLCB0TWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAJCX0KLQotICAgIAkJY3JlYXRlTWVzc2FnZShvcmlnaW5hbElucHV0LCBuZXdNc2dOYW1lKTsKLSAgICAJfQotICAgIH0KLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1lc3NhZ2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRNZXNzYWdlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTE0ZDAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1lc3NhZ2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5TbWFydFJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkTWVzc2FnZUNvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZTsKLSAgcHJpdmF0ZSBNZXNzYWdlIG1lc3NhZ2U7Ci0gIHByaXZhdGUgTWVzc2FnZSBvcmlnaW5hbE1lc3NhZ2U7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlUGFydCA9IGZhbHNlOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBUlRfTkFNRSA9ICJOZXdQYXJ0IjsKLSAgCi0gIHB1YmxpYyBBZGRNZXNzYWdlQ29tbWFuZAotICAJKERlZmluaXRpb24gZGVmaW5pdGlvbiwgIAotICAJIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgQWRkTWVzc2FnZUNvbW1hbmQKLQkJKERlZmluaXRpb24gZGVmaW5pdGlvbiwgCi0JCSBTdHJpbmcgbG9jYWxOYW1lLAotCQkgYm9vbGVhbiBjcmVhdGVQYXJ0KQotCXsKLQkgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLQkgIHRoaXMuY3JlYXRlUGFydCA9IGNyZWF0ZVBhcnQ7Ci0JfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYSBNZXNzYWdlIGJhc2VkIG9uIHRoZSBnaXZlbiBNZXNzYWdlLiAgSW4gZXNzZW5jZSwgdGhpcyB3aWxsCi0gICAqIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIE1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgQWRkTWVzc2FnZUNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBNZXNzYWdlIG9yaWdpbmFsTWVzc2FnZSwgU3RyaW5nIGxvY2FsTmFtZSwgYm9vbGVhbiBjb3B5UGFydCkgewotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0JdGhpcy5jcmVhdGVQYXJ0ID0gY29weVBhcnQ7Ci0gIAl0aGlzLm9yaWdpbmFsTWVzc2FnZSA9IG9yaWdpbmFsTWVzc2FnZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIG1lc3NhZ2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZSgpOwotICAgIG1lc3NhZ2Uuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksbG9jYWxOYW1lKSk7Ci0gICAgbWVzc2FnZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIGRlZmluaXRpb24uYWRkTWVzc2FnZShtZXNzYWdlKTsKLSAgICAKLSAgICBpZiAob3JpZ2luYWxNZXNzYWdlID09IG51bGwpIHsKLSAgICAJaWYgKGNyZWF0ZVBhcnQpCi0gICAgCXsKLSAgICAJCUFkZFBhcnRDb21tYW5kIGNvbW1hbmQgPSAKLSAgICAJCQluZXcgQWRkUGFydENvbW1hbmQobWVzc2FnZSxERUZBVUxUX1BBUlRfTkFNRSxXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCJzdHJpbmciLHRydWUpOwotICAgIAkJY29tbWFuZC5ydW4oKTsKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJaWYgKG9yaWdpbmFsTWVzc2FnZS5nZXRFUGFydHMoKSAhPSBudWxsKSB7Ci0gICAgCQlJdGVyYXRvciBpdCA9IG9yaWdpbmFsTWVzc2FnZS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotICAgIAkJCi0gICAgCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgCQkJUGFydCBwYXJ0ID0gKFBhcnQpIGl0Lm5leHQoKTsKLSAgICAJCQlBZGRQYXJ0Q29tbWFuZCBjb21tYW5kOwotICAgIAkJCWlmIChTbWFydFJlbmFtZUFjdGlvbi5pc1BhcnROYW1lR2VuZXJhdGVkKHBhcnQuZ2V0TmFtZSgpLCBvcmlnaW5hbE1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpCi0gICAgCQkJCWNvbW1hbmQgPSBuZXcgQWRkUGFydENvbW1hbmQobWVzc2FnZSwgcGFydCwgTmFtZVV0aWwuYnVpbGRVbmlxdWVQYXJ0TmFtZShtZXNzYWdlLCBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKTsJCi0gICAgCQkJZWxzZQotICAgIAkJCQljb21tYW5kID0gbmV3IEFkZFBhcnRDb21tYW5kKG1lc3NhZ2UsIHBhcnQsIHBhcnQuZ2V0TmFtZSgpKTsKLSAgICAJCQkKLSAgICAJCQkKLSAgICAJCQljb21tYW5kLnJ1bigpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TG9jYWxOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRNZXNzYWdlUmVmZXJlbmNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWMxMWVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotICBwcm90ZWN0ZWQgTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmZXJlbmNlOwotICBwcm90ZWN0ZWQgT3BlcmF0aW9uIG9wZXJhdGlvbjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlTWVzc2FnZSA9IGZhbHNlOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX01FU1NBR0VfTkFNRSA9ICJOZXdNZXNzYWdlIjsKLQotICBwdWJsaWMgQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gY3JlYXRlTWVzc2FnZSkKLSAgewotICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy5jcmVhdGVNZXNzYWdlID0gY3JlYXRlTWVzc2FnZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1lc3NhZ2UoKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBBZGRNZXNzYWdlQ29tbWFuZCBjb21tYW5kID0gCi0gICAgICBuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmaW5pdGlvbixERUZBVUxUX01FU1NBR0VfTkFNRSxjcmVhdGVNZXNzYWdlKTsgICAgICAKLSAgICBjb21tYW5kLnJ1bigpOwotICAgIG1lc3NhZ2VSZWZlcmVuY2Uuc2V0RU1lc3NhZ2UoKE1lc3NhZ2UpY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpKTsKLSAgfQotICAKLSAgLyoKLSAgICogT3ZlcmxvYWRlZCBjcmVhdGVNZXNzYWdlKGFyZykgbWV0aG9kLiAgU2ltaWxhciB0byB0byBjcmVhdGVNZXNzYWdlKCkgYnV0IHRha2VzIGluIGEgTWVzc2FnZVJlZmVyZW5jZS4KLSAgICogTWV0aG9kIHVzZWQgdG8gY3JlYXRlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgTWVzc2FnZSAoY29udGFpbmVkIGluIHRoZSBwYXNzZWQgaW4gTWVzc2FnZVJlZmVyZW5jZSkuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNZXNzYWdlKE1lc3NhZ2VSZWZlcmVuY2Ugb3JpZ2luYWxNUmVmLCBTdHJpbmcgbmV3TWVzc2FnZVJlZk5hbWUpIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIE1lc3NhZ2UgdE1lc3NhZ2UgPSBvcmlnaW5hbE1SZWYuZ2V0RU1lc3NhZ2UoKTsKLSAgICBBZGRNZXNzYWdlQ29tbWFuZCBjb21tYW5kID0gCi0gICAgICBuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmaW5pdGlvbiwgdE1lc3NhZ2UsIG5ld01lc3NhZ2VSZWZOYW1lLCB0cnVlKTsKLSAgICBjb21tYW5kLnJ1bigpOwotICAgIG1lc3NhZ2VSZWZlcmVuY2Uuc2V0RU1lc3NhZ2UoKE1lc3NhZ2UpY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpKTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlUmVmZXJlbmNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkT3BlcmF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkT3BlcmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDU5ZmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE9wZXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRPcGVyYXRpb25Db21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgUG9ydFR5cGUgcG9ydFR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gIHByaXZhdGUgT3BlcmF0aW9uIG9wZXJhdGlvbjsKLSAgcHJpdmF0ZSBPcGVyYXRpb24gb3JpZ2luYWxPcGVyYXRpb247Ci0gIHByaXZhdGUgYm9vbGVhbiBjb3B5SW5PdXRGYXVsdDsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVJbnB1dCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlT3V0cHV0ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVGYXVsdCA9IGZhbHNlOwotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTlBVVF9OQU1FID0gIiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfT1VUUFVUX05BTUUgPSAiIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9GQVVMVF9OQU1FID0gIiI7Ci0gIAotICBwdWJsaWMgQWRkT3BlcmF0aW9uQ29tbWFuZAotCQkoUG9ydFR5cGUgcG9ydFR5cGUsICAKLQkJIFN0cmluZyBuYW1lKQotCXsKLQkgIHRoaXMucG9ydFR5cGUgPSBwb3J0VHlwZTsKLQkgIHRoaXMubmFtZSA9IG5hbWU7Ci0JfQotICAKLSAgcHVibGljIEFkZE9wZXJhdGlvbkNvbW1hbmQKLQkJKFBvcnRUeXBlIHBvcnRUeXBlLCAgCi0JCSBTdHJpbmcgbmFtZSwKLQkJIGJvb2xlYW4gY3JlYXRlSW5wdXQsCi0JCSBib29sZWFuIGNyZWF0ZU91dHB1dCwKLQkJIGJvb2xlYW4gY3JlYXRlRmF1bHQpCi0JewotCSAgdGhpcy5wb3J0VHlwZSA9IHBvcnRUeXBlOwotCSAgdGhpcy5uYW1lID0gbmFtZTsKLQkgIHRoaXMuY3JlYXRlSW5wdXQgPSBjcmVhdGVJbnB1dDsKLQkgIHRoaXMuY3JlYXRlT3V0cHV0ID0gY3JlYXRlT3V0cHV0OwotCSAgdGhpcy5jcmVhdGVGYXVsdCA9IGNyZWF0ZUZhdWx0OwotCX0KLSAgCi0gIC8qCi0gICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gY3JlYXRlIGFuIE9wZXJhdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gT3BlcmF0aW9uLiAgSW4gZXNzZW5jZSwgdGhpcyB3aWxsCi0gICAqIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIE9wZXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBBZGRPcGVyYXRpb25Db21tYW5kKFBvcnRUeXBlIHBvcnRUeXBlLCBPcGVyYXRpb24gb3JpZ2luYWxPcGVyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGNvcHlJbk91dEZhdWx0KSB7Ci0gIAl0aGlzLnBvcnRUeXBlID0gcG9ydFR5cGU7Ci0gIAl0aGlzLm9yaWdpbmFsT3BlcmF0aW9uID0gb3JpZ2luYWxPcGVyYXRpb247Ci0gIAl0aGlzLm5hbWUgPSBuYW1lOwotICAJdGhpcy5jb3B5SW5PdXRGYXVsdCA9IGNvcHlJbk91dEZhdWx0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgb3BlcmF0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIG9wZXJhdGlvbi5zZXROYW1lKG5hbWUpOwotICAgIG9wZXJhdGlvbi5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKHBvcnRUeXBlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgcG9ydFR5cGUuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0KLSAgICBpZiAob3JpZ2luYWxPcGVyYXRpb24gPT0gbnVsbCkgeyAgICAKLSAgICAJV1NETEVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIAlpZiAoY3JlYXRlSW5wdXQpCi0gICAgCXsKLSAgICAJCWNvbW1hbmQgPSBuZXcgQWRkSW5wdXRDb21tYW5kKG9wZXJhdGlvbixERUZBVUxUX0lOUFVUX05BTUUsdHJ1ZSk7Ci0gICAgCQljb21tYW5kLnJ1bigpOwotICAgIAl9Ci0gICAgCi0gICAgCWlmIChjcmVhdGVPdXRwdXQpCi0gICAgCXsKLSAgICAJCWNvbW1hbmQgPSBuZXcgQWRkT3V0cHV0Q29tbWFuZChvcGVyYXRpb24sREVGQVVMVF9PVVRQVVRfTkFNRSx0cnVlKTsKLSAgICAJCWNvbW1hbmQucnVuKCk7Ci0gICAgCX0KLSAgICAKLSAgICAJaWYgKGNyZWF0ZUZhdWx0KQotICAgIAl7Ci0gICAgCQljb21tYW5kID0gbmV3IEFkZEZhdWx0Q29tbWFuZChvcGVyYXRpb24sREVGQVVMVF9GQVVMVF9OQU1FLHRydWUpOwotICAgIAkJY29tbWFuZC5ydW4oKTsKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJLy8gRG8gbmVjZXNzYXJ5IGNvcHlpbmcgb2YgZGF0YSBmcm9tIG9yaWdpbmFsIG9wZXJhdGlvbiB0byBuZXcgb3BlcmF0aW9uCi0gICAgCS8vIFBhcmFtYXRlciBvcmRlcmluZz8gRG9jdW1lbnRhdGlvbj8gIFRoaXMgcGFydCBzdGlsbCBuZWVkcyB0byBiZSB3b3JrZWQgb24gICAgCQotICAgIAkvLyBDb3B5ICdraWRzJyBpZiBuZWNlc3NhcnkKLSAgICAJaWYgKGNvcHlJbk91dEZhdWx0KSB7Ci0gICAgCQlXU0RMRWxlbWVudENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAJaWYgKG9yaWdpbmFsT3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKQotICAgICAgICAJewotICAgICAgICAJCU91dHB1dCBvdXRwdXQgPSBvcmlnaW5hbE9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0gICAgICAgIAkJY29tbWFuZCA9IG5ldyBBZGRPdXRwdXRDb21tYW5kKG9wZXJhdGlvbiwgb3V0cHV0LCBOYW1lVXRpbC5idWlsZFVuaXF1ZU91dHB1dE5hbWUocG9ydFR5cGUsIG9wZXJhdGlvbi5nZXROYW1lKCksICIiKSk7Ci0gICAgICAgIAkJY29tbWFuZC5ydW4oKTsKLSAgICAgICAgCX0KLSAgICAgICAgCQotICAgICAgICAJaWYgKG9yaWdpbmFsT3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpCi0gICAgICAgIAl7Ci0gICAgICAgIAkJSW5wdXQgaW5wdXQgPSBvcmlnaW5hbE9wZXJhdGlvbi5nZXRFSW5wdXQoKTsKLSAgICAgICAgCQljb21tYW5kID0gbmV3IEFkZElucHV0Q29tbWFuZChvcGVyYXRpb24sIGlucHV0LCBOYW1lVXRpbC5idWlsZFVuaXF1ZUlucHV0TmFtZShwb3J0VHlwZSwgb3BlcmF0aW9uLmdldE5hbWUoKSwgIiIpKTsKLSAgICAgICAgCQljb21tYW5kLnJ1bigpOwotICAgICAgICAJfQotICAgICAgICAKLSAgICAgICAgCWlmIChvcmlnaW5hbE9wZXJhdGlvbi5nZXRFRmF1bHRzKCkgIT0gbnVsbCkKLSAgICAgICAgCXsKLSAgICAgICAgCQlJdGVyYXRvciBpdCA9IG9yaWdpbmFsT3BlcmF0aW9uLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOwotICAgICAgICAJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgCQkJRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGl0Lm5leHQoKTsKLSAgICAgICAgCQkJY29tbWFuZCA9IG5ldyBBZGRGYXVsdENvbW1hbmQob3BlcmF0aW9uLCBmYXVsdCwgTmFtZVV0aWwuYnVpbGRVbmlxdWVGYXVsdE5hbWUob3JpZ2luYWxPcGVyYXRpb24sIGZhdWx0LmdldE5hbWUoKSkpOwotICAgICAgICAJCQljb21tYW5kLnJ1bigpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAJCQotICAgIAl9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE91dHB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1N2M1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRPdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5TbWFydFJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRPdXRwdXRDb21tYW5kIGV4dGVuZHMgQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBPdXRwdXQgb3JpZ2luYWxPdXRwdXQ7Ci0gIAotICBwdWJsaWMgQWRkT3V0cHV0Q29tbWFuZChPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG9wZXJhdGlvbixuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBBZGRPdXRwdXRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGNyZWF0ZU1lc3NhZ2UpCi0gIHsKLSAgICBzdXBlcihvcGVyYXRpb24sbmFtZSxjcmVhdGVNZXNzYWdlKTsKLSAgfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYW4gT3V0cHV0IGJhc2VkIG9uIHRoZSBnaXZlbiBPdXRwdXQuICBJbiBlc3NlbmNlLCB0aGlzIHdpbGwKLSAgICogY3JlYXRlIGEgY29weSBvZiB0aGUgZ2l2ZW4gT3V0cHV0LgotICAgKi8KLSAgcHVibGljIEFkZE91dHB1dENvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgT3V0cHV0IG9yaWdpbmFsT3V0cHV0LCBTdHJpbmcgbmFtZSkgewotICAJc3VwZXIob3BlcmF0aW9uLCBuYW1lLCBmYWxzZSk7Ci0gIAkKLSAgCXRoaXMub3JpZ2luYWxPdXRwdXQgPSBvcmlnaW5hbE91dHB1dDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIG1lc3NhZ2VSZWZlcmVuY2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0cHV0KCk7Ci0vLyAgICBtZXNzYWdlUmVmZXJlbmNlLnNldE5hbWUobmFtZSk7Ci0gICAgbWVzc2FnZVJlZmVyZW5jZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIG9wZXJhdGlvbi5zZXRPdXRwdXQoKE91dHB1dCltZXNzYWdlUmVmZXJlbmNlKTsKLSAgICAKLSAgICAvLyAgVEJEIC0gYWRkIGJpbmRpbmcgb3V0cHV0IAotICAgIAotICAgIGlmIChvcmlnaW5hbE91dHB1dCA9PSBudWxsKSB7Ci0gICAgCWlmIChjcmVhdGVNZXNzYWdlKQotICAgIAkJY3JlYXRlTWVzc2FnZSgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJLy8gRG8gbmVjZXNzYXJ5IGNvcHlpbmcgb2YgZGF0YSBmcm9tIG9yaWdpbmFsIE91dHB1dCB0byBuZXcgT3V0cHV0Ci0gICAgCWlmIChvcmlnaW5hbE91dHB1dC5nZXRFTWVzc2FnZSgpICE9IG51bGwpIHsKLSAgICAJCVN0cmluZyBvcmlnaW5hbE1zZ05hbWUgPSBvcmlnaW5hbE91dHB1dC5nZXRFTWVzc2FnZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQotCQlib29sZWFuIGdlbmVkID0gZmFsc2U7Ci0JCWlmIChvcmlnaW5hbE91dHB1dC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0JCQlnZW5lZCA9IFNtYXJ0UmVuYW1lQWN0aW9uLmlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob3JpZ2luYWxNc2dOYW1lLCAoKE9wZXJhdGlvbikgb3JpZ2luYWxPdXRwdXQuZUNvbnRhaW5lcigpKS5nZXROYW1lKCksICJSZXNwb25zZSIpOwotCQkKLQkJU3RyaW5nIG5ld01zZ05hbWUgPSAiIjsKLQkJaWYgKGdlbmVkKSB7Ci0JCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBtZXNzYWdlUmVmZXJlbmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0JCQlNZXNzYWdlIHRNZXNzYWdlID0gb3JpZ2luYWxPdXRwdXQuZ2V0RU1lc3NhZ2UoKTsKLQkJCW5ld01zZ05hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKGRlZmluaXRpb24sIHRNZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCQl9Ci0JCQotICAgIAljcmVhdGVNZXNzYWdlKG9yaWdpbmFsT3V0cHV0LCBuZXdNc2dOYW1lKTsKLSAgICAJfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGFydENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBhcnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlN2VkNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGFydENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuUGFydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZFBhcnRDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgTWVzc2FnZSBtZXNzYWdlOwotICBwcml2YXRlIFN0cmluZyBuYW1lOwotICBwcml2YXRlIFBhcnQgcGFydDsKLSAgcHJpdmF0ZSBQYXJ0IG9yaWdpbmFsUGFydDsKLSAgCi0gIHByaXZhdGUgUU5hbWUgdHlwZU9yRWxlbWVudE5hbWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB1c2VUeXBlID0gdHJ1ZTsKLQotICBwdWJsaWMgQWRkUGFydENvbW1hbmQKLQkJKE1lc3NhZ2UgbWVzc2FnZSwKLQkJIFN0cmluZyBuYW1lKQotCXsKLQkgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JICB0aGlzLm5hbWUgPSBuYW1lOwotCX0KLSAgCi0gIHB1YmxpYyBBZGRQYXJ0Q29tbWFuZAotCQkoTWVzc2FnZSBtZXNzYWdlLAotCQkgU3RyaW5nIG5hbWUsCi0JCSBTdHJpbmcgbmFtZXNwYWNlLAotCQkgU3RyaW5nIGxvY2FsTmFtZSwKLQkJIGJvb2xlYW4gdXNlVHlwZSkKLQl7Ci0JICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCSAgdGhpcy5uYW1lID0gbmFtZTsKLQkgIHRoaXMudXNlVHlwZSA9IHVzZVR5cGU7Ci0JICB0eXBlT3JFbGVtZW50TmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2UsbG9jYWxOYW1lKTsKLQl9Ci0gIAotICAvKgotICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGNyZWF0ZSBhIFBhcnQgYmFzZWQgb24gdGhlIGdpdmVuIFBhcnQuICBJbiBlc3NlbmNlLCB0aGlzIHdpbGwKLSAgICogY3JlYXRlIGEgY29weSBvZiB0aGUgZ2l2ZW4gUGFydC4KLSAgICovCi0gIHB1YmxpYyBBZGRQYXJ0Q29tbWFuZAotCShNZXNzYWdlIG1lc3NhZ2UsCi0JIFBhcnQgb3JpZ2luYWxQYXJ0LAotCSBTdHJpbmcgbmFtZSkKLSAgewotICAJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgCXRoaXMubmFtZSA9IG5hbWU7Ci0gIAl0aGlzLm9yaWdpbmFsUGFydCA9IG9yaWdpbmFsUGFydDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgQWRkUGFydENvbW1hbmQKLQkJKE1lc3NhZ2UgbWVzc2FnZSwKLQkJIFN0cmluZyBuYW1lLAotCQkgU3RyaW5nIG5hbWVzcGFjZSwKLQkJIFN0cmluZyBsb2NhbE5hbWUpCi0JewotCSAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkgIHRoaXMubmFtZSA9IG5hbWU7Ci0JICB0eXBlT3JFbGVtZW50TmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2UsbG9jYWxOYW1lKTsKLQl9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBwYXJ0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaWYgKHR5cGVPckVsZW1lbnROYW1lID09IG51bGwpCi0gICAgICB0eXBlT3JFbGVtZW50TmFtZSA9IGNyZWF0ZURlZmF1bHRUeXBlTmFtZSgpOwotICAgIAotICAgIC8vIEFkZCBuYW1lc3BhY2UgdG8gdGhlIERlZmluaXRpb25zIGlmIGl0IGlzIG5vdCB0aGVyZSB5ZXQuCi0gICAgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oKTsKLSAgICAKLSAgICBwYXJ0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcnQoKTsKLSAgICBwYXJ0LnNldE5hbWUobmFtZSk7Ci0gICAgCi0gICAgaWYgKG9yaWdpbmFsUGFydCA9PSBudWxsKSB7Ci0gICAgCWlmICh1c2VUeXBlKQotICAgIAkJcGFydC5zZXRUeXBlTmFtZSh0eXBlT3JFbGVtZW50TmFtZSk7Ci0gICAgCWVsc2UKLSAgICAJCXBhcnQuc2V0RWxlbWVudE5hbWUodHlwZU9yRWxlbWVudE5hbWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJaWYgKG9yaWdpbmFsUGFydC5nZXRUeXBlTmFtZSgpICE9IG51bGwpCi0gICAgCQlwYXJ0LnNldFR5cGVOYW1lKG9yaWdpbmFsUGFydC5nZXRUeXBlTmFtZSgpKTsKLQotICAgIAlTdHJpbmcgbmV3RWxlbWVudE5hbWUgPSBudWxsOwotICAgIAlpZiAob3JpZ2luYWxQYXJ0LmdldEVsZW1lbnROYW1lKCkgIT0gbnVsbCkgewotICAgIAkJCi0gICAgCQlib29sZWFuIGNyZWF0ZU5ld0VsZW1lbnQgPSB0cnVlOwotICAgIAkJaWYgKG9yaWdpbmFsUGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKSAhPSBudWxsICYmIG9yaWdpbmFsUGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAJCWlmICghKG9yaWdpbmFsUGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJRE9NTm9kZSkpIHsKLSAgICAgICAgCQkJY3JlYXRlTmV3RWxlbWVudCA9IGZhbHNlOwotICAgICAgICAJCX0gICAgICAgIAkJCi0gICAgCQl9Ci0gICAgCQkKLSAgICAJCWlmIChjcmVhdGVOZXdFbGVtZW50KSB7Ci0gICAgCQkJbmV3RWxlbWVudE5hbWUgPSBnZXROZXdOYW1lSGVscGVyKG5hbWUsIG9yaWdpbmFsUGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIGZhbHNlKTsKLSAgICAJCQlwYXJ0LnNldEVsZW1lbnROYW1lKG5ldyBRTmFtZShvcmlnaW5hbFBhcnQuZ2V0RWxlbWVudE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwgbmV3RWxlbWVudE5hbWUpKTsKLQkKLSAgICAJCQlpZiAob3JpZ2luYWxQYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSAhPSBudWxsKSB7Ci0gICAgCQkJCWlmIChuZXdFbGVtZW50TmFtZSA9PSBudWxsKSB7Ci0gICAgCQkJCQluZXdFbGVtZW50TmFtZSA9IGdldE5ld05hbWVIZWxwZXIobmFtZSwgb3JpZ2luYWxQYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgZmFsc2UpOwotICAgIAkJCQl9Ci0gICAgCQkKLSAgICAJCQkJQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZCBlbGVtZW50QWN0aW9uID0gbmV3IEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQob3JpZ2luYWxQYXJ0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgbmV3RWxlbWVudE5hbWUpOwotICAgIAkJCQllbGVtZW50QWN0aW9uLnJ1bigpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJCWVsc2UgewotICAgIAkJCXBhcnQuc2V0RWxlbWVudE5hbWUobmV3IFFOYW1lKG9yaWdpbmFsUGFydC5nZXRFbGVtZW50TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBvcmlnaW5hbFBhcnQuZ2V0RWxlbWVudE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICAgIAkKLSAgICBwYXJ0LnNldEVuY2xvc2luZ0RlZmluaXRpb24obWVzc2FnZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICgoUGFydEltcGwpcGFydCkucmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7IAotICAgIG1lc3NhZ2UuYWRkUGFydChwYXJ0KTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG1lc3NhZ2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIGlmICghZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCkuY29udGFpbnNWYWx1ZSh0eXBlT3JFbGVtZW50TmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgewotICAgICAgZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoInAiLHR5cGVPckVsZW1lbnROYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICgoV1NETEVsZW1lbnRJbXBsKWRlZmluaXRpb24pLnVwZGF0ZUVsZW1lbnQoZmFsc2UpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBRTmFtZSBjcmVhdGVEZWZhdWx0VHlwZU5hbWUoKQotICB7Ci0gICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwic3RyaW5nIik7Ci0gICAgcmV0dXJuIHFuYW1lOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXROZXdOYW1lSGVscGVyKFN0cmluZyBiYXNlLCBEZWZpbml0aW9uIGRlZiwgYm9vbGVhbiBpc1R5cGUpCi0gIHsgCi0gICAgU3RyaW5nIG5hbWUgPSBiYXNlOyAgICAKLSAgICBpbnQgY291bnQgPSAwOwotCi0gICAgLy8gVWdseS4uLi4gIFJlZG8gdGhpcy4uLgotICAgIC8vIEdldCBhIGxpc3Qgb2YgRWxlbWVudHMuLi4KLSAgICBMaXN0IGVsZW1lbnRMaXN0ID0gbnVsbDsKLSAgICBpZiAoZGVmLmdldEVUeXBlcygpICE9IG51bGwpIHsKLSAgICAJTGlzdCB4c2RzTGlzdCA9IGRlZi5nZXRFVHlwZXMoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgCWlmICh4c2RzTGlzdCAhPSBudWxsKSB7Ci0gICAgCQlJdGVyYXRvciB4c2RzSXRlcmF0b3IgPSB4c2RzTGlzdC5pdGVyYXRvcigpOwotICAgIAkJWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNkRWxlbWVudCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgeHNkc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAJCVhTRFNjaGVtYSBzY2hlbWEgPSB4c2RFbGVtZW50LmdldFNjaGVtYSgpOwotICAgIAkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0gICAgCQkJZWxlbWVudExpc3QgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICAgIAotICAgIGlmIChlbGVtZW50TGlzdCAhPSBudWxsKSB7Ci0gICAgCWludCBpbmRleCA9IDA7Ci0gICAgCXdoaWxlIChpbmRleCA8IGVsZW1lbnRMaXN0LnNpemUoKSkgewotICAgIAkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRMaXN0LmdldChpbmRleCk7Ci0gICAgCQkKLSAgICAJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpKSkgewotICAgIAkJCWNvdW50Kys7Ci0gICAgCQkJbmFtZSA9IG5hbWUgKyBjb3VudDsKLSAgICAJCQlpbmRleCA9IDA7Ci0gICAgCQl9Ci0gICAgCQllbHNlIHsKLSAgICAJCQlpbmRleCsrOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBvcnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQb3J0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjQ3YzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBvcnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkUG9ydENvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTZXJ2aWNlIHNlcnZpY2U7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gIHByaXZhdGUgUG9ydCBwb3J0OwotICAKLSAgcHVibGljIEFkZFBvcnRDb21tYW5kCi0JCShTZXJ2aWNlIHNlcnZpY2UsCi0JCSBTdHJpbmcgbmFtZSkKLQl7Ci0JICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCSAgdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBwb3J0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIHBvcnQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9ydCgpOwotICAgIHBvcnQuc2V0TmFtZShuYW1lKTsKLSAgICBwb3J0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oc2VydmljZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIHNlcnZpY2UuYWRkUG9ydChwb3J0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUG9ydFR5cGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQb3J0VHlwZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWViNGQ1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQb3J0VHlwZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkUG9ydFR5cGVDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0gIHByaXZhdGUgUG9ydFR5cGUgcG9ydFR5cGU7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlT3BlcmF0aW9uID0gZmFsc2U7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfT1BFUkFUSU9OX05BTUUgPSAiTmV3T3BlcmF0aW9uIjsKLQotICBwdWJsaWMgQWRkUG9ydFR5cGVDb21tYW5kCi0JCShEZWZpbml0aW9uIGRlZmluaXRpb24sICAKLQkJIFN0cmluZyBsb2NhbE5hbWUpCi0JewotCSAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQkgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotCX0KLQotICBwdWJsaWMgQWRkUG9ydFR5cGVDb21tYW5kCi0JCShEZWZpbml0aW9uIGRlZmluaXRpb24sIAotCQkgU3RyaW5nIGxvY2FsTmFtZSwKLQkJIGJvb2xlYW4gY3JlYXRlT3BlcmF0aW9uKQotCXsKLQkgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLQkgIHRoaXMuY3JlYXRlT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uOwotCX0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuV1NETEVsZW1lbnRBY3Rpb24jZ2V0V1NETEVsZW1lbnQoKQotICAgKi8KLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBwb3J0VHlwZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBwb3J0VHlwZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0VHlwZSgpOwotICAgIHBvcnRUeXBlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLGxvY2FsTmFtZSkpOwotICAgIHBvcnRUeXBlLnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgZGVmaW5pdGlvbi5hZGRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgCi0gICAgaWYgKGNyZWF0ZU9wZXJhdGlvbikKLSAgICB7Ci0gICAgICBBZGRPcGVyYXRpb25Db21tYW5kIGNvbW1hbmQgPSAKLSAgICAgICAgbmV3IEFkZE9wZXJhdGlvbkNvbW1hbmQocG9ydFR5cGUsREVGQVVMVF9PUEVSQVRJT05fTkFNRSx0cnVlLHRydWUsZmFsc2UpOwotICAgICAgY29tbWFuZC5ydW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldExvY2FsTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGxvY2FsTmFtZSA9IG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFNlcnZpY2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRTZXJ2aWNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWZlZDQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFNlcnZpY2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkU2VydmljZUNvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZTsKLSAgcHJpdmF0ZSBTZXJ2aWNlIHNlcnZpY2U7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlUG9ydCA9IGZhbHNlOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX1BPUlRfTkFNRSA9ICJOZXdQb3J0IjsKLQotICBwdWJsaWMgQWRkU2VydmljZUNvbW1hbmQKLQkJKERlZmluaXRpb24gZGVmaW5pdGlvbiwgIAotCQkgU3RyaW5nIGxvY2FsTmFtZSkKLQl7Ci0JICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCSAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0JfQotCi0JcHVibGljIEFkZFNlcnZpY2VDb21tYW5kCi0JCShEZWZpbml0aW9uIGRlZmluaXRpb24sIAotCQkgU3RyaW5nIGxvY2FsTmFtZSwKLQkJIGJvb2xlYW4gY3JlYXRlUG9ydCkKLQl7Ci0JICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCSAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0JICB0aGlzLmNyZWF0ZVBvcnQgPSBjcmVhdGVQb3J0OwotCX0KLQotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgc2VydmljZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlKCk7Ci0gICAgc2VydmljZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSxsb2NhbE5hbWUpKTsKLSAgICBzZXJ2aWNlLnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgZGVmaW5pdGlvbi5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgIAotICAgIGlmIChjcmVhdGVQb3J0KQotICAgIHsKLSAgICAgIEFkZFBvcnRDb21tYW5kIGNvbW1hbmQgPSAKLSAgICAgICAgbmV3IEFkZFBvcnRDb21tYW5kKHNlcnZpY2UsREVGQVVMVF9QT1JUX05BTUUpOwotICAgICAgY29tbWFuZC5ydW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldExvY2FsTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGxvY2FsTmFtZSA9IG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFR5cGVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkVHlwZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NjhmZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkVHlwZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotLy8gRGVmaW5pdGlvbiBtdXN0IG5vdCBoYXZlICJ0eXBlcyIgZWxlbWVudCB0byBydW4gdGhpcyBjb21tYW5kLgotcHVibGljIGZpbmFsIGNsYXNzIEFkZFR5cGVzQ29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBUeXBlcyB0eXBlczsKLSAgCi0gIHB1YmxpYyBBZGRUeXBlc0NvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgCWlmICgodHlwZXMgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpKSAhPSBudWxsKQotICAgICAgcmV0dXJuOyAvLyAidHlwZXMiIGFscmVhZHkgZXhpc3RzLgotICAJCi0gICAgdHlwZXMgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZXMoKTsKLSAgICB0eXBlcy5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIGRlZmluaXRpb24uc2V0VHlwZXModHlwZXMpOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MmNiNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBFeHRlbnNpYmxlRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudDsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJOwotICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0gIHByaXZhdGUgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50OwotICBwcml2YXRlIE1hcCBwcm9wZXJ0aWVzOwotIAotICBwdWJsaWMgQWRkVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZAotICAgIChFeHRlbnNpYmxlRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudCwgCi0gICAgIFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2libGVFbGVtZW50ID0gZXh0ZW5zaWJsZUVsZW1lbnQ7Ci0gICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kCi0gICAgKEV4dGVuc2libGVFbGVtZW50IGV4dGVuc2libGVFbGVtZW50LCAKLSAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgTWFwIHByb3BlcnRpZXMpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2libGVFbGVtZW50ID0gZXh0ZW5zaWJsZUVsZW1lbnQ7Ci0gICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBleHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgCWV4dGVuc2liaWxpdHlFbGVtZW50ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAJZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RWxlbWVudFR5cGUobmV3IFFOYW1lKG5hbWVzcGFjZVVSSSxsb2NhbE5hbWUpKTsKLSAgCQotICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IG51bGw7Ci0gICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgCWVudHJ5ID0gKE1hcC5FbnRyeSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAJU3RyaW5nIGF0dHJpYnV0ZSA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAJU3RyaW5nIHZhbHVlID0gKFN0cmluZyllbnRyeS5nZXRWYWx1ZSgpOyAgICAgIAkKLSAgICAgIAkoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsdmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgCWV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgCWV4dGVuc2libGVFbGVtZW50LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTlmMTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi0KLS8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgWFNERWxlbWVudERlY2xhcmF0aW9uIGluIHRoZSB0YXJnZXROYW1lc3BhY2UuCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICBwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZTsKLSAgcHJpdmF0ZSBYU0RTY2hlbWEgc2NoZW1hOwotICAKLSAgLyoqCi0gICAqIFRPRE86Ci0gICAqIFdlIGhhdmUgYSBwb3RlbnRpYWwgcHJvYmxlbSBoZXJlLi4uLiAgV2hhdCBpZiB0aGUgZGVmaW5pdGlvbiB0YXJnZXRuYW1lc3BhY2UgaXMgbnVsbC4uLi4KLSAgICovCi0gIHB1YmxpYyBBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICogVXNlIEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUpCi0gICAqLwotICBwdWJsaWMgQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZAotICAgIChEZWZpbml0aW9uIGRlZmluaXRpb24sIAotICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCAKLSAgICAgU3RyaW5nIGVsZW1lbnROYW1lKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGdldFNjaGVtYSgpOwotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IAotICAgICAgWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgZWxlbWVudERlY2wuc2V0TmFtZShlbGVtZW50TmFtZSk7Ci0gICAgCi0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZURlZmluaXRpb24gPSBnZXRYU0RTdHJpbmdUeXBlKHhzZFNjaGVtYSk7Ci0gICAgZWxlbWVudERlY2wuc2V0VHlwZURlZmluaXRpb24oc2ltcGxlVHlwZURlZmluaXRpb24pOyAgICAKLSAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoZWxlbWVudERlY2wpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oU3RyaW5nIG5ld0VsZW1lbnROYW1lKSB7Ci0gIAllbGVtZW50TmFtZSA9IG5ld0VsZW1lbnROYW1lOwotICAJcnVuKCk7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFNwZWNpZnkgd2hpY2ggU2NoZW1hIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSBUeXBlLgotICAgKiBDYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSBjYWxsaW5nIHJ1bigpLiAgT3RoZXJ3aXNlIGl0IHdpbGwgdXNlIHRoZSBmaXJzdAotICAgKiBTY2hlbWEgaXQgZmluZHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkgewotICAJdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFJldHVybiB0aGUgU2NoZW1hIHVzZWQgdG8gY3JlYXRlIHRoZSBUeXBlCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpIHsKLSAgCWlmIChzY2hlbWEgPT0gbnVsbCkgewotICAJCXJldHVybiBnZXRYU0RTY2hlbWEodGFyZ2V0TmFtZXNwYWNlKTsKLSAgCX0KLSAgCWVsc2UgewotICAJCXJldHVybiBzY2hlbWE7Ci0gIAl9Ci0gIH0KLSAgCi0gIHByaXZhdGUgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gZ2V0WFNEU3RyaW5nVHlwZShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpOwotICB9Ci0gIAotICBwcml2YXRlIFhTRFNjaGVtYSBnZXRYU0RTY2hlbWEoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkKLSAgewotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gICAgCi0gICAgLy8gRG8gd2UgaGF2ZSBhIHNjaGVtYSBhbHJlYWR5PwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0VHlwZXMoKS5nZXRTY2hlbWFzKHRhcmdldE5hbWVzcGFjZSkuaXRlcmF0b3IoKTsKLSAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpaXRlcmF0b3IubmV4dCgpOyAvLyBHZXQgdGhlIGZpcnN0IG9uZS4KLSAgICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CSAgICAKLSAgICAgIC8vIENyZWF0ZSBhIG5ldyBzY2hlbWEgYmVjYXVzZSB0aGVyZSdzIG5vbmUuCi0gICAgICBBZGRYU0RTY2hlbWFDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNEU2NoZW1hQ29tbWFuZChkZWZpbml0aW9uLHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICBjb21tYW5kLnJ1bigpOwotICAgICAgcmV0dXJuICgoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpKS5nZXRTY2hlbWEoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgVHlwZXMgZ2V0VHlwZXMoKQotICB7Ci0gICAgLy8gVHlwZXMgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0gICAgVHlwZXMgdHlwZXMgPSAoVHlwZXMpZGVmaW5pdGlvbi5nZXRUeXBlcygpOwotICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgcmV0dXJuIHR5cGVzOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBBZGRUeXBlc0NvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRUeXBlc0NvbW1hbmQoZGVmaW5pdGlvbik7Ci0gICAgICBjb21tYW5kLnJ1bigpOwotICAgICAgcmV0dXJuIChUeXBlcyljb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RTY2hlbWFDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RTY2hlbWFDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYmQxZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNEU2NoZW1hQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRYU0RTY2hlbWFDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50OwotICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0gIAotICBwdWJsaWMgQWRkWFNEU2NoZW1hQ29tbWFuZChEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTRFNjaGVtYUNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgeyAgICAKLSAgICBleHRlbnNpYmlsaXR5RWxlbWVudCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgIGV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gCi0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotICAgIHhzZFNjaGVtYS5zZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgieHNkIik7Ci0gICAgeHNkU2NoZW1hLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgIC8vIENob29zZSB0aGUgcHJlZml4IENob29zZSB0aGUgcHJlZml4IHVzZWQgZm9yIHRoaXMgc2NoZW1hJ3MgbmFtZXNwYWNlIGFuZCB0aGUgc2NoZW1hIGZvciBzY2hlbWEncyBuYW1lc3BhY2UuCi0gICAgLy8gICAgCi0gICAgamF2YS51dGlsLk1hcCBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLS8vICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0KCJwIiwgeHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwLnB1dAotCSAgKHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpLG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7Ci0gICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0U2NoZW1hKHhzZFNjaGVtYSk7Ci0gICAgICAgCi0gICAgLy8gVEJEIC0gQ2hlY2sgaWYgbXVsdGlwbGUgc2NoZW1hcyB3aXRoIHRoZSBzYW1lIHRhcmdldE5hbWVzcGFjZSBjYW4gY28tZXhpc3QuCi0gICAgVHlwZXMgdHlwZXMgPSBnZXRUeXBlcygpOwotICAgIHR5cGVzLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgfQotCi0gIHByaXZhdGUgVHlwZXMgZ2V0VHlwZXMoKQotICB7Ci0gICAgLy8gVHlwZXMgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcylkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICByZXR1cm4gdHlwZXM7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEFkZFR5cGVzQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFR5cGVzQ29tbWFuZChkZWZpbml0aW9uKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgICByZXR1cm4gKFR5cGVzKWNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDQ2MzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLS8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgWFNEVHlwZURlZmluaXRpb24gaW4gdGhlIHRhcmdldE5hbWVzcGFjZS4KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7Ci0gIHByaXZhdGUgWFNEU2NoZW1hIHNjaGVtYTsKLSAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxleFR5cGUgPSB0cnVlOwotICAKLSAgLyoqCi0gICAqIFRPRE86Ci0gICAqIFdlIGhhdmUgYSBwb3RlbnRpYWwgcHJvYmxlbSBoZXJlLi4uLiAgV2hhdCBpZiB0aGUgZGVmaW5pdGlvbiB0YXJnZXRuYW1lc3BhY2UgaXMgbnVsbC4uLi4KLSAgICovCi0gIHB1YmxpYyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUsIGJvb2xlYW4gaXNDb21wbGV4VHlwZSkKLSAgewotICAJdGhpcyhkZWZpbml0aW9uLCB0eXBlTmFtZSk7Ci0gIAl0aGlzLmlzQ29tcGxleFR5cGUgPSBpc0NvbXBsZXhUeXBlOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICogVXNlIEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB0eXBlTmFtZSkKLSAgICovCi0gIHB1YmxpYyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQKLSAgICAoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAKLSAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgU3RyaW5nIHR5cGVOYW1lKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0gICAgWFNETmFtZWRDb21wb25lbnQgdHlwZURlZjsKLSAgICAKLSAgICBpZiAoaXNDb21wbGV4VHlwZSkgewotICAgIAl0eXBlRGVmID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgIAl0eXBlRGVmID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgdHlwZURlZi5zZXROYW1lKHR5cGVOYW1lKTsKLSAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQodHlwZURlZik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgbmV3VHlwZU5hbWUpIHsKLSAgCXR5cGVOYW1lID0gbmV3VHlwZU5hbWU7Ci0gIAlydW4oKTsKLSAgfQotICAKLSAgLyoKLSAgICogU3BlY2lmaXkgaWYgd2Ugc2hvdWxkIGNyZWF0ZSBhIGNvbXBsZXggb3Igc2ltcGxlIHR5cGUuICBUaGlzIHNob3VsZCBzaG91bGQgYmUKLSAgICogY2FsbGVkIGJlZm9yZSBydW4oKS4KLSAgICogT3ZlcnJpZGVzIHRoZSB2YWx1ZSBzZXQgd2hlbiB0aGUgY29uc3RydWN0b3IKLSAgICogQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIHR5cGVOYW1lLCBib29sZWFuIGlzQ29tcGxleFR5cGUpCi0gICAqIGlzIHVzZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpc0NvbXBsZXhUeXBlKGJvb2xlYW4gaXNDb21wbGV4VHlwZSkgewotICAJdGhpcy5pc0NvbXBsZXhUeXBlID0gaXNDb21wbGV4VHlwZTsKLSAgfQotICAKLSAgLyoKLSAgICogU3BlY2lmeSB3aGljaCBTY2hlbWEgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIFR5cGUuCi0gICAqIENhbGwgdGhpcyBtZXRob2QgYmVmb3JlIGNhbGxpbmcgcnVuKCkuICBPdGhlcndpc2UgaXQgd2lsbCB1c2UgdGhlIGZpcnN0Ci0gICAqIFNjaGVtYSBpdCBmaW5kcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKSB7Ci0gIAl0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgfQotICAKLSAgLyoKLSAgICogUmV0dXJuIHRoZSBTY2hlbWEgdXNlZCB0byBjcmVhdGUgdGhlIFR5cGUKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkgewotICAJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0gIAkJcmV0dXJuIGdldFhTRFNjaGVtYSh0YXJnZXROYW1lc3BhY2UpOwotICAJfQotICAJZWxzZSB7Ci0gIAkJcmV0dXJuIHNjaGVtYTsKLSAgCX0KLSAgfQotCi0gIHByaXZhdGUgWFNEU2NoZW1hIGdldFhTRFNjaGVtYShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgICAKLSAgICAvLyBEbyB3ZSBoYXZlIGEgc2NoZW1hIGFscmVhZHk/Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRUeXBlcygpLmdldFNjaGVtYXModGFyZ2V0TmFtZXNwYWNlKS5pdGVyYXRvcigpOwotICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgeHNkU2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyYXRvci5uZXh0KCk7IC8vIEdldCB0aGUgZmlyc3Qgb25lLgotICAgICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsJICAgIAotICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNjaGVtYSBiZWNhdXNlIHRoZXJlJ3Mgbm9uZS4KLSAgICAgIEFkZFhTRFNjaGVtYUNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTY2hlbWFDb21tYW5kKGRlZmluaXRpb24sdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgICByZXR1cm4gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCljb21tYW5kLmdldFdTRExFbGVtZW50KCkpLmdldFNjaGVtYSgpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBUeXBlcyBnZXRUeXBlcygpCi0gIHsKLSAgICAvLyBUeXBlcyBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0IHlldC4KLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcylkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICByZXR1cm4gdHlwZXM7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEFkZFR5cGVzQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFR5cGVzQ29tbWFuZChkZWZpbml0aW9uKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgICByZXR1cm4gKFR5cGVzKWNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL1dTRExFbGVtZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvV1NETEVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzljMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvV1NETEVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHVibGljIGFic3RyYWN0IFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJ1bigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9BYnN0cmFjdEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9BYnN0cmFjdEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTZhNWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQWJzdHJhY3RHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuQWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0R2VuZXJhdG9yCi17Ci0gIC8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TUEVDSUZJRUQgPSAiKHVuc3BlY2lmaWVkKSI7IC8vV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9OT05FIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJTkRJTkdfR0VORVJBVE9SID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9SVF9HRU5FUkFUT1IgPSAyOyAgCi0KLSAgcHJvdGVjdGVkIENvbnRlbnRHZW5lcmF0b3IgYmluZGluZ0NvbnRlbnRHZW5lcmF0b3I7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcndyaXRlOwotICBwcm90ZWN0ZWQgT2JqZWN0W10gb3B0aW9uczsKLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IG5ld0NvbXBvbmVudDsKLQotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFR5cGUoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IE5vZGUgZ2V0UGFyZW50Tm9kZSgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlQ29udGVudCgpOwotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCk7Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0TmV3Q29tcG9uZW50KCkKLSAgewotICAJcmV0dXJuIG5ld0NvbXBvbmVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAJdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAJcmV0dXJuIG5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFJlZk5hbWUoU3RyaW5nIHJlZk5hbWUpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFJlZk5hbWUoKTsKLQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKCk7Ci0KLSAgICAgIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24gZXh0ZW5zaW9uID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24ocHJvdG9jb2wpOwotICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBiaW5kaW5nQ29udGVudEdlbmVyYXRvciA9IGV4dGVuc2lvbi5jcmVhdGVCaW5kaW5nQ29udGVudEdlbmVyYXRvcigpOwotICAgICAgfQotCi0gICAgICBpZiAoYmluZGluZ0NvbnRlbnRHZW5lcmF0b3IgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0NvbnRlbnRHZW5lcmF0b3IgPSBuZXcgRW1wdHlCaW5kaW5nQ29udGVudEdlbmVyYXRvcigpOwotICAgICAgfQotCi0gICAgICBiaW5kaW5nQ29udGVudEdlbmVyYXRvci5pbml0KGdldERlZmluaXRpb24oKSwgdGhpcywgb3B0aW9ucyk7Ci0KLSAgICAgIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgIGlmIChkZWZpbml0aW9uRWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBBZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNBY3Rpb24gYWN0aW9uID0KLSAgICAgICAgICBuZXcgQWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zQWN0aW9uKGRlZmluaXRpb25FbGVtZW50LCBiaW5kaW5nQ29udGVudEdlbmVyYXRvci5nZXRSZXF1aXJlZE5hbWVzcGFjZXMoKSwgYmluZGluZ0NvbnRlbnRHZW5lcmF0b3IuZ2V0UHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXMoKSk7Ci0gICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgIH0KLQotICAgICAgZ2VuZXJhdGVDb250ZW50KCk7Ci0gICAgICBmb3JtYXQoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2wpCi0gIHsKLSAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPcHRpb25zKE9iamVjdFtdIG9wdGlvbnMpCi0gIHsKLSAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpCi0gIHsKLSAgICByZXR1cm4gcHJvdG9jb2w7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGUoYm9vbGVhbiBvdmVyd3JpdGUpCi0gIHsKLSAgICB0aGlzLm92ZXJ3cml0ZSA9IG92ZXJ3cml0ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldE92ZXJ3cml0ZSgpCi0gIHsKLSAgICByZXR1cm4gb3ZlcndyaXRlOwotICB9Ci0KLSAgY2xhc3MgRW1wdHlCaW5kaW5nQ29udGVudEdlbmVyYXRvciBpbXBsZW1lbnRzIENvbnRlbnRHZW5lcmF0b3IKLSAgewotICAgIHB1YmxpYyB2b2lkIGluaXQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBPYmplY3QgZ2VuZXJhdG9yLCBPYmplY3RbXSBvcHRpb25zKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXMoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoRWxlbWVudCBwb3J0RWxlbWVudCwgUG9ydCBwb3J0KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdDb250ZW50KEVsZW1lbnQgYmluZGluZ0VsZW1lbnQsIFBvcnRUeXBlIHBvcnRUeXBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQsIE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0lucHV0Q29udGVudChFbGVtZW50IGJpbmRpbmdJbnB1dEVsZW1lbnQsIElucHV0IGlucHV0KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPdXRwdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ091dHB1dEVsZW1lbnQsIE91dHB1dCBvdXRwdXQpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0ZhdWx0Q29udGVudChFbGVtZW50IGJpbmRpbmdGYXVsdEVsZW1lbnQsIEZhdWx0IGZhdWx0KQotICAgIHsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZygpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSBnZXRQYXJlbnROb2RlKCk7Ci0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICAoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGdldFVuZG9EZXNjcmlwdGlvbigpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoKQotICB7Ci0gICAgTm9kZSBub2RlID0gZ2V0UGFyZW50Tm9kZSgpOwotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZm9ybWF0KCkKLSAgewotICAgIE5vZGUgbm9kZSA9IGdldFBhcmVudE5vZGUoKTsKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAvL21vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0gICAgICAvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3JYTUwgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICBmb3JtYXRQcm9jZXNzb3JYTUwuZm9ybWF0Tm9kZSgoSURPTU5vZGUpbm9kZSk7Ci0gICAgICAKLSAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgLy9tb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVXU0RMRWxlbWVudChFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBlbGVtZW50TmFtZSkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBwYXJlbnRFbGVtZW50LmdldFByZWZpeCgpOwotICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgIjoiICsgZWxlbWVudE5hbWUpIDogZWxlbWVudE5hbWU7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBwYXJlbnRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkgLG5hbWUpOwotICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBlbGVtZW50TmFtZSkKLSAgewotICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgIjoiICsgZWxlbWVudE5hbWUpIDogZWxlbWVudE5hbWU7Ci0gICAgLy8gVE9ETy4uLiBjb25zaWRlciBjcmVhdGVFbGVtZW50TlMgZm9yIHRoZXNlIGVsZW1lbnRzIHRvbwotICAgIC8vCi0gICAgRWxlbWVudCByZXN1bHQgPSBwYXJlbnRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KG5hbWUpOwotICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0JpbmRpbmdHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQmluZGluZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDdiZTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQmluZGluZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQmluZGluZ0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0R2VuZXJhdG9yCi17Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByb3RlY3RlZCBTdHJpbmcgcG9ydFR5cGVOYW1lOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZUJpbmRpbmdCb2R5ID0gdHJ1ZTsgCi0KLSAgcHVibGljIEJpbmRpbmdHZW5lcmF0b3IoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVCaW5kaW5nQm9keShib29sZWFuIGdlbmVyYXRlQmluZGluZ0JvZHkpCi0gIHsKLSAgICB0aGlzLmdlbmVyYXRlQmluZGluZ0JvZHkgPSBnZW5lcmF0ZUJpbmRpbmdCb2R5OwotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldFR5cGUoKQotICB7Ci0gIAlyZXR1cm4gQklORElOR19HRU5FUkFUT1I7Ci0gIH0KLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLmRlZmluaXRpb247Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTUVOVUJBUl9HRU5FUkFURV9CSU5ESU5HIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZWZOYW1lKFN0cmluZyByZWZOYW1lKQotICB7Ci0gICAgc2V0UG9ydFR5cGVOYW1lKHJlZk5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJlZk5hbWUoKQotICB7Ci0gIAlyZXR1cm4gcG9ydFR5cGVOYW1lOwotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIHNldFBvcnRUeXBlTmFtZShTdHJpbmcgcG9ydFR5cGVOYW1lKQotICB7Ci0gICAgdGhpcy5wb3J0VHlwZU5hbWUgPSBwb3J0VHlwZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBvcnRUeXBlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcG9ydFR5cGVOYW1lOwotICB9Ci0KLSAgY2xhc3MgQmluZGluZ09wZXJhdGlvblRhYmxlCi0gIHsKLSAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgcHV0QmluZGluZ09wZXJhdGlvbigoQmluZGluZ09wZXJhdGlvbikgaS5uZXh0KCkpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dEJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICAgIHsKLSAgICAgIFN0cmluZyBrZXkgPSBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBtYXAuZ2V0KGtleSk7Ci0gICAgICBpZiAobGlzdCA9PSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBtYXAucHV0KGtleSwgbGlzdCk7Ci0gICAgICB9Ci0gICAgICBpZiAoIWxpc3QuY29udGFpbnMoYmluZGluZ09wZXJhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGJpbmRpbmdPcGVyYXRpb24pOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGxvb2t1cEJpbmRpbmdPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBudWxsOwotCi0gICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgbWFwLmdldChvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGxpc3QuZ2V0KDApOwotICAgICAgfQotCi0gICAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbjsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbnRlbnQoKQotICB7Ci0gICAgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLQotICAgIEJpbmRpbmcgYmluZGluZyA9IGdldE9yQ3JlYXRlQmluZGluZyhuYW1lLCBkZWZpbml0aW9uRWxlbWVudCk7Ci0JbmV3Q29tcG9uZW50ID0gYmluZGluZzsKLSAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgIHsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwuc2V0UG9ydFR5cGVSZWZlcmVuY2UoYmluZGluZywgcG9ydFR5cGVOYW1lICE9IG51bGwgPyBwb3J0VHlwZU5hbWUgOiAiIik7Ci0gICAgfQotCi0gICAgRWxlbWVudCBiaW5kaW5nRWxlbWVudCA9IGJpbmRpbmcgIT0gbnVsbCA/IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChiaW5kaW5nKSA6IG51bGw7Ci0KLSAgICBpZiAoYmluZGluZ0VsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAob3ZlcndyaXRlKQotICAgICAgewotICAgICAgICBMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKE5vZGUgbm9kZSA9IGJpbmRpbmdFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZXMuYWRkKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBpLm5leHQoKTsKLSAgICAgICAgICBiaW5kaW5nRWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0JICBnZW5lcmF0ZVBvcnRDb250ZW50KGJpbmRpbmcpOwotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nLmdldEVQb3J0VHlwZSgpOwotICAgICAgICAgICAKLSAgICAgIGlmIChiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5zaXplKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgIGJpbmRpbmdDb250ZW50R2VuZXJhdG9yLmdlbmVyYXRlQmluZGluZ0NvbnRlbnQoYmluZGluZ0VsZW1lbnQsIHBvcnRUeXBlKTsKLSAgICAgIH0KLQotCSAgaWYgKHBvcnRUeXBlICE9IG51bGwgJiYgZ2VuZXJhdGVCaW5kaW5nQm9keSkKLQkgIHsJICAKLQkJCUJpbmRpbmdPcGVyYXRpb25UYWJsZSB0YWJsZSA9IG5ldyBCaW5kaW5nT3BlcmF0aW9uVGFibGUoKTsKLQkJCXRhYmxlLmFkZEJpbmRpbmcoYmluZGluZyk7Ci0JCQkJICAJCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IHRhYmxlLmxvb2t1cEJpbmRpbmdPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgICBpZiAoYmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdlbmVyYXRlQmluZGluZ09wZXJhdGlvbihiaW5kaW5nLCBiaW5kaW5nRWxlbWVudCwgb3BlcmF0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFU2VydmljZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGkubmV4dCgpOwotICAgICAgLyoKLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHNlcnZpY2UuZ2V0RVBvcnRzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgai5uZXh0KCk7Ci0gICAgICAgIGlmIChwb3J0LmdldEJpbmRpbmcoKSA9PSBiaW5kaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHBvcnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnNpemUoKSA9PSAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgcG9ydEVsZW1lbnQgPSBXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocG9ydCk7Ci0gICAgICAgICAgICBiaW5kaW5nQ29udGVudEdlbmVyYXRvci5nZW5lcmF0ZVBvcnRDb250ZW50KHBvcnRFbGVtZW50LCBwb3J0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0qLwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQmluZGluZ09wZXJhdGlvbihCaW5kaW5nIGJpbmRpbmcsIEVsZW1lbnQgYmluZGluZ0VsZW1lbnQsIE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50ID0gY3JlYXRlV1NETEVsZW1lbnQoYmluZGluZ0VsZW1lbnQsICJvcGVyYXRpb24iKTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICBiaW5kaW5nQ29udGVudEdlbmVyYXRvci5nZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCBvcGVyYXRpb24pOwotCi0gICAgSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBiaW5kaW5nSW5wdXRFbGVtZW50ID0gY3JlYXRlV1NETEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbkVsZW1lbnQsICJpbnB1dCIpOwotICAgICAgaWYgKGlucHV0LmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBiaW5kaW5nSW5wdXRFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIGlucHV0LmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICBiaW5kaW5nQ29udGVudEdlbmVyYXRvci5nZW5lcmF0ZUJpbmRpbmdJbnB1dENvbnRlbnQoYmluZGluZ0lucHV0RWxlbWVudCwgaW5wdXQpOwotICAgIH0KLQotICAgIE91dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0RU91dHB1dCgpOwotICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGJpbmRpbmdPdXRwdXRFbGVtZW50ID0gY3JlYXRlV1NETEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbkVsZW1lbnQsICJvdXRwdXQiKTsKLSAgICAgIGlmIChvdXRwdXQuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPdXRwdXRFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG91dHB1dC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgYmluZGluZ0NvbnRlbnRHZW5lcmF0b3IuZ2VuZXJhdGVCaW5kaW5nT3V0cHV0Q29udGVudChiaW5kaW5nT3V0cHV0RWxlbWVudCwgb3V0cHV0KTsKLSAgICB9Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvcGVyYXRpb24uZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaS5uZXh0KCk7Ci0KLSAgICAgIEVsZW1lbnQgYmluZGluZ0ZhdWx0RWxlbWVudCA9IGNyZWF0ZVdTRExFbGVtZW50KGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCAiZmF1bHQiKTsKLSAgICAgIGlmIChmYXVsdC5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0ZhdWx0RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBmYXVsdC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgYmluZGluZ0NvbnRlbnRHZW5lcmF0b3IuZ2VuZXJhdGVCaW5kaW5nRmF1bHRDb250ZW50KGJpbmRpbmdGYXVsdEVsZW1lbnQsIGZhdWx0KTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgQmluZGluZyBnZXRPckNyZWF0ZUJpbmRpbmdIZWxwZXIoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBCaW5kaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXREZWZpbml0aW9uKCkuZ2V0RUJpbmRpbmdzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nTmFtZSA9IGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGJpbmRpbmdOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGJpbmRpbmc7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBCaW5kaW5nIGdldE9yQ3JlYXRlQmluZGluZyhTdHJpbmcgbmFtZSwgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCkKLSAgewotICAgIEJpbmRpbmcgcmVzdWx0ID0gZ2V0T3JDcmVhdGVCaW5kaW5nSGVscGVyKG5hbWUpOwotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotICAgICAgQWRkQmluZGluZ0FjdGlvbiBhY3Rpb24gPSBuZXcgQWRkQmluZGluZ0FjdGlvbihkZWZpbml0aW9uLCBuYW1lLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4KTsKLSAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgIHJlc3VsdCA9IGdldE9yQ3JlYXRlQmluZGluZ0hlbHBlcihuYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgfQotfQotCi1jbGFzcyBBZGRCaW5kaW5nQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLSAgcHVibGljIEFkZEJpbmRpbmdBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoImJpbmRpbmciLCAiaWNvbnMvYmluZGluZ19vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAiYmluZGluZyIpOwotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICBzZXRDb21wdXRlVG9wTGV2ZWxSZWZDaGlsZCh0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICB7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICIiKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ05hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNiZmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yOyAgCi0gICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0b3IKLXsgICAgICAgIAotCQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRERSRVNTX0xPQ0FUSU9OID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iOyAgCi0gIHB1YmxpYyB2b2lkIGluaXQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBPYmplY3QgZ2VuZXJhdG9yLCBPYmplY3RbXSBvcHRpb25zKTsKLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCk7Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXMoKTsKLQotICAvLyBnZW5lcmF0ZXMgdGhlICdhZGRyZXNzJyBleHRlbnNpYmxpdHkgZWxlbWVudCBmb3IgYSBwb3J0Ci0gIC8vCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoRWxlbWVudCBwb3J0RWxlbWVudCwgUG9ydCBwb3J0KTsKLSAKLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nQ29udGVudChFbGVtZW50IGJpbmRpbmdFbGVtZW50LCBQb3J0VHlwZSBwb3J0VHlwZSk7Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3BlcmF0aW9uQ29udGVudChFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCBPcGVyYXRpb24gb3BlcmF0aW9uKTsKLSAKLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nSW5wdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ0lucHV0RWxlbWVudCwgSW5wdXQgaW5wdXQpOyAgICAKLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPdXRwdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ091dHB1dEVsZW1lbnQsIE91dHB1dCBvdXRwdXQpOwotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0ZhdWx0Q29udGVudChFbGVtZW50IGJpbmRpbmdGYXVsdEVsZW1lbnQsIEZhdWx0IGZhdWx0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDNlYWZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWkuQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlOwotICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY29udGVudEdlbmVyYXRvckNsYXNzTmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBwb3J0T3B0aW9uc1BhZ2VDbGFzc05hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgYmluZGluZ09wdGlvbnNQYWdlQ2xhc3NOYW1lOwotCi0gIHB1YmxpYyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGVudEdlbmVyYXRvckNsYXNzTmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy5jb250ZW50R2VuZXJhdG9yQ2xhc3NOYW1lID0gY29udGVudEdlbmVyYXRvckNsYXNzTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICB7Ci0gICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICB9Ci0KLSAgcHVibGljIENvbnRlbnRHZW5lcmF0b3IgY3JlYXRlQmluZGluZ0NvbnRlbnRHZW5lcmF0b3IoKQotICB7Ci0gICAgQ29udGVudEdlbmVyYXRvciByZXN1bHQgPSBudWxsOwotICAgIGlmIChjb250ZW50R2VuZXJhdG9yQ2xhc3NOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIENsYXNzIHRoZUNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjb250ZW50R2VuZXJhdG9yQ2xhc3NOYW1lKSA6IENsYXNzLmZvck5hbWUoY29udGVudEdlbmVyYXRvckNsYXNzTmFtZSk7Ci0gICAgICAgIHJlc3VsdCA9IChDb250ZW50R2VuZXJhdG9yKSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSBjcmVhdGVCaW5kaW5nQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlKCkKLSAgewotICAgIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSByZXN1bHQgPSBudWxsOwotICAgIGlmIChiaW5kaW5nT3B0aW9uc1BhZ2VDbGFzc05hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGJpbmRpbmdPcHRpb25zUGFnZUNsYXNzTmFtZSkgOiBDbGFzcy5mb3JOYW1lKGJpbmRpbmdPcHRpb25zUGFnZUNsYXNzTmFtZSk7Ci0gICAgICAgIHJlc3VsdCA9IChDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UpIHRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIGNyZWF0ZVBvcnRDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UoKQotICB7Ci0gICAgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHBvcnRPcHRpb25zUGFnZUNsYXNzTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MocG9ydE9wdGlvbnNQYWdlQ2xhc3NOYW1lKSA6IENsYXNzLmZvck5hbWUocG9ydE9wdGlvbnNQYWdlQ2xhc3NOYW1lKTsKLSAgICAgICAgcmVzdWx0ID0gKENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSkgdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdPcHRpb25zUGFnZUNsYXNzTmFtZShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgYmluZGluZ09wdGlvbnNQYWdlQ2xhc3NOYW1lID0gc3RyaW5nOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UG9ydE9wdGlvbnNQYWdlQ2xhc3NOYW1lKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBwb3J0T3B0aW9uc1BhZ2VDbGFzc05hbWUgPSBzdHJpbmc7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBuYW1lc3BhY2UgPSBzdHJpbmc7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0NWJhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0gIHByb3RlY3RlZCBMaXN0IHN0YXRpY0V4dGVuc2lvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBMaXN0IGR5bmFtaWNFeHRlbnNpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIHB1YmxpYyB2b2lkIGFkZChDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbikKLSAgewotICAgIHN0YXRpY0V4dGVuc2lvbkxpc3QuYWRkKGV4dGVuc2lvbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGQoQ29udGVudEdlbmVyYXRvclByb3ZpZGVyRXh0ZW5zaW9uIGV4dGVuc2lvbikKLSAgewotICAgIGR5bmFtaWNFeHRlbnNpb25MaXN0LmFkZChleHRlbnNpb24pOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbkxpc3QoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKHN0YXRpY0V4dGVuc2lvbkxpc3QpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGR5bmFtaWNFeHRlbnNpb25MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ29udGVudEdlbmVyYXRvclByb3ZpZGVyRXh0ZW5zaW9uIGR5bmFtaWNFeHRlbnNpb24gPSAoQ29udGVudEdlbmVyYXRvclByb3ZpZGVyRXh0ZW5zaW9uKSBpLm5leHQoKTsKLSAgICAgICAgQ29udGVudEdlbmVyYXRvclByb3ZpZGVyIHByb3ZpZGVyID0gZHluYW1pY0V4dGVuc2lvbi5jcmVhdGVDb250ZW50R2VuZXJhdG9yUHJvdmlkZXIoKTsKLSAgICAgICAgTGlzdCBkeW5hbWljYWxseUNvbnRyaWJ1dGVkRXh0ZW5zaW9ucyA9IHByb3ZpZGVyLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25zKCk7Ci0gICAgICAgIGlmIChkeW5hbWljYWxseUNvbnRyaWJ1dGVkRXh0ZW5zaW9ucyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZHluYW1pY2FsbHlDb250cmlidXRlZEV4dGVuc2lvbnMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QmluZGluZ0V4dGVuc2lvbk5hbWVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRSZWdpc3RlcmVkRXh0ZW5zaW9uTGlzdCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uKSBpLm5leHQoKTsKLSAgICAgIGxpc3QuYWRkKGV4dGVuc2lvbi5nZXROYW1lKCkpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGdldEV4dGVuc2lvbkZvck5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbiByZXN1bHQgPSBudWxsOwotICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRSZWdpc3RlcmVkRXh0ZW5zaW9uTGlzdCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbiBleHRlbnNpb24gPSAoQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBleHRlbnNpb247Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGdldEV4dGVuc2lvbkZvck5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRSZWdpc3RlcmVkRXh0ZW5zaW9uTGlzdCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbiBleHRlbnNpb24gPSAoQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhleHRlbnNpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGV4dGVuc2lvbjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoKLSAgICogQGRlcHJlY2F0ZWQgLSB1c2UgZ2V0RXh0ZW5zaW9uRm9yTmFtZQotICAgKi8KLSAgcHVibGljIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24gZ2V0Q29udGVudEdlbmVyYXRvckV4dGVuc2lvbihTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBnZXRFeHRlbnNpb25Gb3JOYW1lKG5hbWUpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9Db250ZW50R2VuZXJhdG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZGZiNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9Db250ZW50R2VuZXJhdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0b3JQcm92aWRlcgotewotCXB1YmxpYyBMaXN0IGdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3JQcm92aWRlckV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9Db250ZW50R2VuZXJhdG9yUHJvdmlkZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwMmY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3JQcm92aWRlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudEdlbmVyYXRvclByb3ZpZGVyRXh0ZW5zaW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOwotICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0KLSAgcHVibGljIENvbnRlbnRHZW5lcmF0b3JQcm92aWRlckV4dGVuc2lvbihTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgewotICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgfQotCi0gIHB1YmxpYyBDb250ZW50R2VuZXJhdG9yUHJvdmlkZXIgY3JlYXRlQ29udGVudEdlbmVyYXRvclByb3ZpZGVyKCkKLSAgewotCUNvbnRlbnRHZW5lcmF0b3JQcm92aWRlciByZXN1bHQgPSBudWxsOwotICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkgOiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgIHJlc3VsdCA9IChDb250ZW50R2VuZXJhdG9yUHJvdmlkZXIpIHRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvSHR0cENvbnRlbnRHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvSHR0cENvbnRlbnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4Zjc4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0h0dHBDb250ZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgSHR0cENvbnRlbnRHZW5lcmF0b3IgaW1wbGVtZW50cyBDb250ZW50R2VuZXJhdG9yCi17Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUG9zdDsKLSAgcHJvdGVjdGVkIFN0cmluZyBhZGRyZXNzTG9jYXRpb24gPSBDb250ZW50R2VuZXJhdG9yLkFERFJFU1NfTE9DQVRJT047Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSByZXF1aXJlZE5hbWVzcGFjZXMgPSB7ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIH07Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nW10gcHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXMgPSB7ICJtaW1lIiwgImh0dHAiIH07Ci0KLSAgcHVibGljIHZvaWQgaW5pdChEZWZpbml0aW9uIGRlZmluaXRpb24sIE9iamVjdCBnZW5lcmF0b3IsIE9iamVjdFtdIG9wdGlvbnMpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnNbMF0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQm9vbGVhbiBpc1Bvc3RPcHRpb24gPSAoQm9vbGVhbikgb3B0aW9uc1swXTsKLSAgICAgICAgaXNQb3N0ID0gaXNQb3N0T3B0aW9uLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMSAmJiBvcHRpb25zWzFdICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGFkZHJlc3NMb2NhdGlvbiA9IChTdHJpbmcpIG9wdGlvbnNbMV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFJlcXVpcmVkTmFtZXNwYWNlcygpCi0gIHsKLSAgICByZXR1cm4gcmVxdWlyZWROYW1lc3BhY2VzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFByZWZlcnJlZE5hbWVzcGFjZVByZWZpeGVzKCkKLSAgewotICAgIHJldHVybiBwcmVmZXJyZWROYW1lc3BhY2VQcmVmaXhlczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoRWxlbWVudCBwb3J0RWxlbWVudCwgUG9ydCBwb3J0KQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChwb3J0RWxlbWVudCwgImh0dHAiLCAiYWRkcmVzcyIpOwotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJsb2NhdGlvbiIsIGFkZHJlc3NMb2NhdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdDb250ZW50KEVsZW1lbnQgYmluZGluZ0VsZW1lbnQsIFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChiaW5kaW5nRWxlbWVudCwgImh0dHAiLCAiYmluZGluZyIpOwotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ2ZXJiIiwgaXNQb3N0ID8gIlBPU1QiIDogIkdFVCIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3BlcmF0aW9uQ29udGVudChFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCBPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChiaW5kaW5nT3BlcmF0aW9uRWxlbWVudCwgImh0dHAiLCAib3BlcmF0aW9uIik7Ci0gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoImxvY2F0aW9uIiwgIi8iICsgb3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdJbnB1dENvbnRlbnQoRWxlbWVudCBiaW5kaW5nSW5wdXRFbGVtZW50LCBJbnB1dCBpbnB1dCkKLSAgewotICAgIGlmIChpc1Bvc3QpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChiaW5kaW5nSW5wdXRFbGVtZW50LCAibWltZSIsICJjb250ZW50Iik7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ0lucHV0RWxlbWVudCwgImh0dHAiLCAidXJsRW5jb2RlZCIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ091dHB1dENvbnRlbnQoRWxlbWVudCBiaW5kaW5nT3V0cHV0RWxlbWVudCwgT3V0cHV0IG91dHB1dCkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ091dHB1dEVsZW1lbnQsICJtaW1lIiwgImNvbnRlbnQiKTsKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L3htbCIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nRmF1bHRDb250ZW50KEVsZW1lbnQgYmluZGluZ0ZhdWx0RWxlbWVudCwgRmF1bHQgZmF1bHQpCi0gIHsKLSAgICAvL1RPRE8hIQotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBlbGVtZW50TmFtZSkKLSAgewotICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgIjoiICsgZWxlbWVudE5hbWUpIDogZWxlbWVudE5hbWU7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBwYXJlbnRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KG5hbWUpOwotICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9Qb3J0R2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL1BvcnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlZjM0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL1BvcnRHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBQb3J0R2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RHZW5lcmF0b3IKLXsKLSAgcHJvdGVjdGVkIFNlcnZpY2Ugc2VydmljZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBiaW5kaW5nTmFtZTsKLQotICBwdWJsaWMgUG9ydEdlbmVyYXRvcihTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiBQT1JUX0dFTkVSQVRPUjsKLSAgfQotCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldERlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZTsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChzZXJ2aWNlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1BPUlQiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlZk5hbWUoU3RyaW5nIHJlZk5hbWUpCi0gIHsKLSAgICBzZXRCaW5kaW5nTmFtZShyZWZOYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVmTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gYmluZGluZ05hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nTmFtZShTdHJpbmcgYmluZGluZ05hbWUpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmdOYW1lID0gYmluZGluZ05hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUNvbnRlbnQoKQotICB7Ci0gICAgRWxlbWVudCBwb3J0RWxlbWVudCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gc2VydmljZS5nZXRFUG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGkubmV4dCgpOwotICAgICAgaWYgKHBvcnQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcG9ydEVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocG9ydCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBkb0dlbmVyYXRlQ29udGVudCA9IGZhbHNlOwotICAgIGlmIChwb3J0RWxlbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3Qoc2VydmljZSk7Ci0gICAgICBwb3J0RWxlbWVudCA9IGNyZWF0ZVdTRExFbGVtZW50KHNlcnZpY2VFbGVtZW50LCAicG9ydCIpOwotICAgICAgcG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0gICAgICBkb0dlbmVyYXRlQ29udGVudCA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkb0dlbmVyYXRlQ29udGVudCA9IG92ZXJ3cml0ZTsKLSAgICB9Ci0KLSAgICBwb3J0RWxlbWVudC5zZXRBdHRyaWJ1dGUoImJpbmRpbmciLCBiaW5kaW5nTmFtZSAhPSBudWxsID8gYmluZGluZ05hbWUgOiAiIik7Ci0gICAgUG9ydCBwb3J0ID0gKFBvcnQpIFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudChnZXREZWZpbml0aW9uKCksIHBvcnRFbGVtZW50KTsKLSAgICBuZXdDb21wb25lbnQgPSBwb3J0OwotCi0gICAgLy9wb3J0RWxlbWVudC4KLSAgICBiaW5kaW5nQ29udGVudEdlbmVyYXRvci5nZW5lcmF0ZVBvcnRDb250ZW50KHBvcnRFbGVtZW50LCBwb3J0KTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvU29hcENvbnRlbnRHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvU29hcENvbnRlbnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViZjUyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL1NvYXBDb250ZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yOyAgCi0gICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFNvYXBDb250ZW50R2VuZXJhdG9yIGltcGxlbWVudHMgQ29udGVudEdlbmVyYXRvcgoteyAKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgRE9DVU1FTlRfTElURVJBTCA9IDE7Ci0gIHByaXZhdGUgZmluYWwgaW50IFJQQ19MSVRFUkFMICAgICAgPSAyOwotICBwcml2YXRlIGZpbmFsIGludCBSUENfRU5DT0RFRCAgICAgID0gMzsKLQotICBwcm90ZWN0ZWQgaW50IGJpbmRpbmdPcHRpb24gPSBET0NVTUVOVF9MSVRFUkFMOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVZhbHVlID0gIiI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgYWRkcmVzc0xvY2F0aW9uID0gQ29udGVudEdlbmVyYXRvci5BRERSRVNTX0xPQ0FUSU9OOyAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZ1tdIHJlcXVpcmVkTmFtZXNwYWNlcyA9IHsiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyJ9OwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZ1tdIHByZWZlcnJlZE5hbWVzcGFjZVByZWZpeGVzID0geyJzb2FwIn07Ci0KLQotICBwdWJsaWMgdm9pZCBpbml0KERlZmluaXRpb24gZGVmaW5pdGlvbiwgT2JqZWN0IGdlbmVyYXRvciwgT2JqZWN0W10gb3B0aW9ucykKLSAgeyAgICAgICAgICAgICAgCi0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3B0aW9uID0gY29tcHV0ZUJpbmRpbmdPcHRpb24ob3B0aW9ucyk7Ci0KLSAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDEgJiYgb3B0aW9uc1sxXSAhPSBudWxsKQotICAgICAgewotICAgICAgCWFkZHJlc3NMb2NhdGlvbiA9IChTdHJpbmcpb3B0aW9uc1sxXTsKLSAgICAgIH0gIAotICAgIH0KLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZVZhbHVlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9IAotICB9Ci0gIAotICBwcml2YXRlIGludCBjb21wdXRlQmluZGluZ09wdGlvbihPYmplY3RbXSBvcHRpb25zKSB7Ci0gIAlpbnQgb3B0aW9uID0gRE9DVU1FTlRfTElURVJBTDsKLSAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnNbMF0gIT0gbnVsbCkKLSAgICB7Ci0JCWJvb2xlYW4gaXNEb2N1bWVudExpdGVyYWxPcHRpb24gPSAoKEJvb2xlYW4pb3B0aW9uc1swXSkuYm9vbGVhblZhbHVlKCk7Ci0JCWlmIChpc0RvY3VtZW50TGl0ZXJhbE9wdGlvbikKLQkJCW9wdGlvbiA9ICBET0NVTUVOVF9MSVRFUkFMOwotCQllbHNlCi0JCQlvcHRpb24gPSBSUENfRU5DT0RFRDsJCQotCQkKLSAgICAJaWYgKG9wdGlvbnMubGVuZ3RoID49IDMgJiYgb3B0aW9uc1syXSAhPSBudWxsKSB7Ci0gICAgCQkvLyBFeHRyYSBpbmZvIHNlbnQgaW4KLSAgICAJCWlmICgoKEJvb2xlYW4pb3B0aW9uc1syXSkuYm9vbGVhblZhbHVlKCkpCi0gICAgCQkJb3B0aW9uID0gUlBDX0xJVEVSQUw7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gb3B0aW9uOwotICB9Ci0gICAgIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCkKLSAgewotICAgIHJldHVybiByZXF1aXJlZE5hbWVzcGFjZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQcmVmZXJyZWROYW1lc3BhY2VQcmVmaXhlcygpCi0gIHsKLSAgICByZXR1cm4gcHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXM7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoRWxlbWVudCBwb3J0RWxlbWVudCwgUG9ydCBwb3J0KQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChwb3J0RWxlbWVudCwgInNvYXAiLCAiYWRkcmVzcyIpOwotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJsb2NhdGlvbiIsIGFkZHJlc3NMb2NhdGlvbik7ICAgICAKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nQ29udGVudChFbGVtZW50IGJpbmRpbmdFbGVtZW50LCBQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ0VsZW1lbnQsICJzb2FwIiwgImJpbmRpbmciKTsKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgic3R5bGUiLCAoYmluZGluZ09wdGlvbiA9PSBET0NVTUVOVF9MSVRFUkFMKSA/ICJkb2N1bWVudCIgOiAicnBjIik7IAotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0cmFuc3BvcnQiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQsIE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCAic29hcCIsICJvcGVyYXRpb24iKTsKLSAgICAKLSAgICBTdHJpbmcgc29hcEFjdGlvblZhbHVlID0gbmFtZXNwYWNlVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmICghc29hcEFjdGlvblZhbHVlLmVuZHNXaXRoKCIvIikpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIHNvYXBBY3Rpb25WYWx1ZSArPSAiLyI7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHNvYXBBY3Rpb25WYWx1ZSArPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJzb2FwQWN0aW9uIiwgc29hcEFjdGlvblZhbHVlKTsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nSW5wdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ0lucHV0RWxlbWVudCwgSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBnZW5lcmF0ZVNvYXBCb2R5KGJpbmRpbmdJbnB1dEVsZW1lbnQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3V0cHV0Q29udGVudChFbGVtZW50IGJpbmRpbmdPdXRwdXRFbGVtZW50LCBPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgZ2VuZXJhdGVTb2FwQm9keShiaW5kaW5nT3V0cHV0RWxlbWVudCk7Ci0gIH0gICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdGYXVsdENvbnRlbnQoRWxlbWVudCBiaW5kaW5nRmF1bHRFbGVtZW50LCBGYXVsdCBmYXVsdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ0ZhdWx0RWxlbWVudCwgInNvYXAiLCAiZmF1bHQiKTsgICAgICAKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIGZhdWx0LmdldE5hbWUoKSk7IAotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ1c2UiLCAoYmluZGluZ09wdGlvbiA9PSBSUENfRU5DT0RFRCkgPyAiZW5jb2RlZCIgOiAibGl0ZXJhbCIpOwotICAgIGlmIChiaW5kaW5nT3B0aW9uID09IFJQQ19FTkNPREVEKQotICAgIHsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJlbmNvZGluZ1N0eWxlIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIiwgbmFtZXNwYWNlVmFsdWUpOwotICAgIH0KLSAgICBlbHNlIGlmIChiaW5kaW5nT3B0aW9uID09IFJQQ19MSVRFUkFMKSB7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiLCBuYW1lc3BhY2VWYWx1ZSk7Ci0gICAgfQotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNvYXBCb2R5KEVsZW1lbnQgcGFyZW50RWxlbWVudCkKLSAgeyAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBzb2FwQWN0aW9uVmFsdWUgPSAiIjsKLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHNvYXBBY3Rpb25WYWx1ZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfSAgICAKLQotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQocGFyZW50RWxlbWVudCwgInNvYXAiLCAiYm9keSIpOyAgICAgIAotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ1c2UiLCAoYmluZGluZ09wdGlvbiA9PSBSUENfRU5DT0RFRCkgPyAiZW5jb2RlZCIgOiAibGl0ZXJhbCIpOyAKLSAgICBpZiAoYmluZGluZ09wdGlvbiA9PSBSUENfRU5DT0RFRCkKLSAgICB7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgiZW5jb2RpbmdTdHlsZSIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIsIG5hbWVzcGFjZVZhbHVlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYmluZGluZ09wdGlvbiA9PSBSUENfTElURVJBTCkgewotICAgIAllbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIiwgbmFtZXNwYWNlVmFsdWUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgZWxlbWVudE5hbWUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgIjoiICsgZWxlbWVudE5hbWUpIDogZWxlbWVudE5hbWU7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBwYXJlbnRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KG5hbWUpOwotICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL0NvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzgzMDk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWk7ICAKLSAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IuQWJzdHJhY3RHZW5lcmF0b3I7Ci0KLQotcHVibGljIGludGVyZmFjZSBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgaW5pdChBYnN0cmFjdEdlbmVyYXRvciBhYnN0cmFjdEdlbmVyYXRvcik7ICAgICAgICAgICAgIAotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlQXBwbGljYWJsZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvSHR0cEJpbmRpbmdPcHRpb25zUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9IdHRwQmluZGluZ09wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ODZhZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9IdHRwQmluZGluZ09wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IuQWJzdHJhY3RHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBIdHRwQmluZGluZ09wdGlvbnNQYWdlIGltcGxlbWVudHMgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQnV0dG9uIGdldEJ1dHRvbjsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBwb3N0QnV0dG9uOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gIHByb3RlY3RlZCBBYnN0cmFjdEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0KLSAgcHVibGljIEh0dHBCaW5kaW5nT3B0aW9uc1BhZ2UoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KEFic3RyYWN0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgewotICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBjb250cm9sLnNldExheW91dChsYXlvdXQpOwotCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgIAotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIG9wdGlvbnNIZWFkaW5nID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKTsKLSAgICBvcHRpb25zSGVhZGluZy5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0hUVFBfQklORElOR19PUFRJT05TIikpOwotCi0gICAgZ2V0QnV0dG9uID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuUkFESU8pOwotICAgIGdldEJ1dHRvbi5zZXRUZXh0KCJIVFRQIEdFVCIpOwotICAgIGdldEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLSAgICBwb3N0QnV0dG9uID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuUkFESU8pOwotICAgIHBvc3RCdXR0b24uc2V0VGV4dCgiSFRUUCBQT1NUIik7Ci0KLSAgICBpZiAoZ2VuZXJhdG9yLmdldE5hbWUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdlbmVyYXRvci5nZXREZWZpbml0aW9uKCk7Ci0gICAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCBnZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBkZWZpbml0aW9uLmdldEJpbmRpbmcocW5hbWUpOwotICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBlZUxpc3QgPSBiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgaWYgKGVlTGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVlTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGVlKTsKLSAgICAgICAgICBTdHJpbmcgdmVyYiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2ZXJiIik7Ci0gICAgICAgICAgaWYgKCJQT1NUIi5lcXVhbHModmVyYikpCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2V0QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICBwb3N0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwb3N0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGdldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQljb21wdXRlT3B0aW9ucygpOwotCQotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc092ZXJ3cml0ZUFwcGxpY2FibGUoKQotICB7Ci0gIAlyZXR1cm4gdHJ1ZTsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLQljb21wdXRlT3B0aW9ucygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZU9wdGlvbnMoKQotICB7Ci0gICAgT2JqZWN0W10gb3B0aW9ucyA9IG5ldyBPYmplY3RbMV07Ci0gICAgb3B0aW9uc1swXSA9IG5ldyBCb29sZWFuKHBvc3RCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgIGdlbmVyYXRvci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvSHR0cFBvcnRPcHRpb25zUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9IdHRwUG9ydE9wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkODkzY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9IdHRwUG9ydE9wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWk7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5BYnN0cmFjdEdlbmVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgSHR0cFBvcnRPcHRpb25zUGFnZSBpbXBsZW1lbnRzIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSwgTW9kaWZ5TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgYWRkcmVzc0ZpZWxkOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gIHByb3RlY3RlZCBBYnN0cmFjdEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0KLSAgcHVibGljIEh0dHBQb3J0T3B0aW9uc1BhZ2UoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KEFic3RyYWN0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgewotICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBjb250cm9sLnNldExheW91dChsYXlvdXQpOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIG9wdGlvbnNIZWFkaW5nID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKTsKLSAgICBvcHRpb25zSGVhZGluZy5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0hUVFBfUE9SVF9ERVRBSUxTIikpOwotCi0gICAgQ29tcG9zaXRlIG5hbWVWYWx1ZUdyb3VwID0gbmV3IENvbXBvc2l0ZShjb250cm9sLCBTV1QuTk9ORSk7Ci0gICAgbmFtZVZhbHVlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQyID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGxheW91dDIubWFyZ2luV2lkdGggPSAwOwotICAgIG5hbWVWYWx1ZUdyb3VwLnNldExheW91dChsYXlvdXQyKTsKLQotICAgIExhYmVsIGFkZHJlc3NMYWJlbCA9IG5ldyBMYWJlbChuYW1lVmFsdWVHcm91cCwgU1dULk5PTkUpOwotICAgIGFkZHJlc3NMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xPQ0FUSU9OIikgKyAiICIpOwotICAgIGFkZHJlc3NGaWVsZCA9IG5ldyBUZXh0KG5hbWVWYWx1ZUdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICBhZGRyZXNzRmllbGQuc2V0VGV4dCgiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotICAgIGFkZHJlc3NGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBhZGRyZXNzRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlQXBwbGljYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gIHsKLSAgICBPYmplY3RbXSBvcHRpb25zID0gbmV3IE9iamVjdFsyXTsKLSAgICBvcHRpb25zWzFdID0gYWRkcmVzc0ZpZWxkLmdldFRleHQoKTsKLSAgICBnZW5lcmF0b3Iuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9Tb2FwQmluZGluZ09wdGlvbnNQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL1NvYXBCaW5kaW5nT3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliZjAyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL1NvYXBCaW5kaW5nT3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5BYnN0cmFjdEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFNvYXBCaW5kaW5nT3B0aW9uc1BhZ2UgaW1wbGVtZW50cyBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBCdXR0b24gZG9jTGl0ZXJhbDsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBycGNMaXRlcmFsOwotICBwcm90ZWN0ZWQgQnV0dG9uIHJwY0VuY29kZWQ7Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29udHJvbDsKLSAgcHJvdGVjdGVkIEFic3RyYWN0R2VuZXJhdG9yIGdlbmVyYXRvcjsKLQotICBwdWJsaWMgU29hcEJpbmRpbmdPcHRpb25zUGFnZSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoQWJzdHJhY3RHZW5lcmF0b3IgZ2VuZXJhdG9yKQotICB7Ci0gICAgdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIG9wdGlvbnNIZWFkaW5nID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKTsKLSAgICBvcHRpb25zSGVhZGluZy5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1NPQVBfQklORElOR19PUFRJT05TIikpOwotCi0gICAgZG9jTGl0ZXJhbCA9IG5ldyBCdXR0b24oY29udHJvbCwgU1dULlJBRElPKTsKLSAgICBkb2NMaXRlcmFsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfUkFESU9fRE9DVU1FTlRfTElURVJBTCIpKTsKLSAgICBkb2NMaXRlcmFsLnNldFNlbGVjdGlvbih0cnVlKTsKLQotICAgIHJwY0xpdGVyYWwgPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5SQURJTyk7Ci0gICAgcnBjTGl0ZXJhbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1JBRElPX1JQQ19MSVRFUkFMIikpOwotICAgIAotICAgIHJwY0VuY29kZWQgPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5SQURJTyk7Ci0gICAgcnBjRW5jb2RlZC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1JBRElPX1JQQ19FTkNPREVEIikpOwotCi0gICAgaWYgKGdlbmVyYXRvci5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgZ2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKHFuYW1lKTsKLSAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExpc3QgZWVMaXN0ID0gYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGlmIChlZUxpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBlZUxpc3QuZ2V0KDApOwotCi0gICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGVlKTsKLSAgICAgICAgICBTdHJpbmcgc3R5bGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgic3R5bGUiKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoInJwYyIuZXF1YWxzKHN0eWxlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgUlBDIExpdGVyYWwgb3IgUlBDIEVuY29kZWQKLSAgICAgICAgICAJU3RyaW5nIHVzZSA9ICJlbmNvZGVkIjsKLSAgICAgICAgICAJTGlzdCBvcGVyYXRpb25zID0gYmluZGluZy5nZXRFQmluZGluZ09wZXJhdGlvbnMoKTsKLSAgICAgICAgICAJaWYgKG9wZXJhdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgIAkJZWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgCQlCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcGVyYXRpb25zLmdldCgwKTsKLSAgICAgICAgICAJCWlmIChvcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpICE9IG51bGwgJiYgb3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgIAkJCU9iamVjdCBvYmplY3QgPSBvcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5nZXQoMCk7Ci0gICAgICAgICAgCQkJZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChvYmplY3QpOwotICAgICAgICAgIAkJfQotICAgICAgICAgIAkJZWxzZSBpZiAob3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCAmJiBvcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgIAkJCU9iamVjdCBvYmplY3QgPSBvcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuZ2V0KDApOwotICAgICAgICAgIAkJCWVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3Qob2JqZWN0KTsKLSAgICAgICAgICAJCX0KLSAgICAgICAgICAJCWVsc2UgaWYgKG9wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAJCQlCaW5kaW5nRmF1bHQgZmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBvcGVyYXRpb24uZ2V0RUJpbmRpbmdGYXVsdHMoKS5nZXQoMCk7Ci0gICAgICAgICAgCQkJTGlzdCBmYXVsdEVFID0gZmF1bHQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgCQkJCi0gICAgICAgICAgCQkJaWYgKGZhdWx0RUUuc2l6ZSgpID4gMCkgewotICAgICAgICAgIAkJCQllbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGZhdWx0RUUuZ2V0KDApKTsKLSAgICAgICAgICAJCQl9Ci0gICAgICAgICAgCQl9Ci0gICAgICAgICAgCQkKLSAgICAgICAgICAJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAJCQl1c2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidXNlIik7Ci0gICAgICAgICAgCQl9Ci0gICAgICAgICAgCX0KLSAgICAgICAgICAJCi0gICAgICAgICAgCWlmICh1c2UgIT0gbnVsbCAmJiAibGl0ZXJhbCIuZXF1YWxzKHVzZSkpIHsKLSAgICAgICAgICAJCWRvY0xpdGVyYWwuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAJCXJwY0xpdGVyYWwuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgIAkJcnBjRW5jb2RlZC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgIAl9Ci0gICAgICAgICAgCWVsc2UgeyAgICAgICAgICAJCi0gICAgICAgICAgCQlkb2NMaXRlcmFsLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgCQlycGNMaXRlcmFsLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgCQlycGNFbmNvZGVkLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAJfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGRvY0xpdGVyYWwuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgcnBjTGl0ZXJhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBycGNFbmNvZGVkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGNvbXB1dGVPcHRpb25zKCk7Ci0KLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlQXBwbGljYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0gICAgY29tcHV0ZU9wdGlvbnMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVPcHRpb25zKCkKLSAgewotICAgIE9iamVjdFtdIG9wdGlvbnMgPSBuZXcgT2JqZWN0WzNdOwotICAgIG9wdGlvbnNbMF0gPSBuZXcgQm9vbGVhbihkb2NMaXRlcmFsLmdldFNlbGVjdGlvbigpKTsKLSAgICBvcHRpb25zWzJdID0gbmV3IEJvb2xlYW4ocnBjTGl0ZXJhbC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgZ2VuZXJhdG9yLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9Tb2FwUG9ydE9wdGlvbnNQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL1NvYXBQb3J0T3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiYzYwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL1NvYXBQb3J0T3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5BYnN0cmFjdEdlbmVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgU29hcFBvcnRPcHRpb25zUGFnZSBpbXBsZW1lbnRzIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSwgTW9kaWZ5TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgYWRkcmVzc0ZpZWxkOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gIHByb3RlY3RlZCBBYnN0cmFjdEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0KLSAgcHVibGljIFNvYXBQb3J0T3B0aW9uc1BhZ2UoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KEFic3RyYWN0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgewotICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBjb250cm9sLnNldExheW91dChsYXlvdXQpOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIG9wdGlvbnNIZWFkaW5nID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKTsKLSAgICBvcHRpb25zSGVhZGluZy5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1NPQVBfUE9SVF9ERVRBSUxTIikpOwotCi0gICAgQ29tcG9zaXRlIG5hbWVWYWx1ZUdyb3VwID0gbmV3IENvbXBvc2l0ZShjb250cm9sLCBTV1QuTk9ORSk7Ci0gICAgbmFtZVZhbHVlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQyID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGxheW91dDIubWFyZ2luV2lkdGggPSAwOwotICAgIG5hbWVWYWx1ZUdyb3VwLnNldExheW91dChsYXlvdXQyKTsKLQotICAgIExhYmVsIGFkZHJlc3NMYWJlbCA9IG5ldyBMYWJlbChuYW1lVmFsdWVHcm91cCwgU1dULk5PTkUpOwotICAgIGFkZHJlc3NMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xPQ0FUSU9OIikgKyAiICIpOwotICAgIGFkZHJlc3NGaWVsZCA9IG5ldyBUZXh0KG5hbWVWYWx1ZUdyb3VwLCBTV1QuQk9SREVSKTsKLSAgICBhZGRyZXNzRmllbGQuc2V0VGV4dCgiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotICAgIGFkZHJlc3NGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBhZGRyZXNzRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlQXBwbGljYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gIHsKLSAgICBPYmplY3RbXSBvcHRpb25zID0gbmV3IE9iamVjdFsyXTsKLSAgICBvcHRpb25zWzFdID0gYWRkcmVzc0ZpZWxkLmdldFRleHQoKTsKLSAgICBnZW5lcmF0b3Iuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9JbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL0ltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5NmNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL0ltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvcgotewotICBWZWN0b3IgaW1wb3J0ZWRGaWxlczsKLQotICBJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyKCkKLSAgewotICAgIGltcG9ydGVkRmlsZXMgPSBuZXcgVmVjdG9yKCk7IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBJUmVzb3VyY2VEZWx0YSByZXNvdXJjZURlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAocmVzb3VyY2VEZWx0YSAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgcmVzb3VyY2VEZWx0YS5hY2NlcHQodGhpcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0vLyAgICAgIEIyQkdVSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRXhjZXB0aW9uIGNhdWdodCBkdXJpbmcgcmVzb3VyY2UgY2hhbmdlIiArIGUpOwotLy8gICAgICBCMkJHVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGVDdXJyZW50VGhyZWFkKCk7IAotICAgIH0gICAgICAKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKQotICB7Ci0gICAgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkKLSAgICB7Ci0gICAgICBpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElGaWxlKSAKLSAgICAgICAgaW1wb3J0ZWRGaWxlcy5hZGQoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0SW1wb3J0ZWRGaWxlcygpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0ZWRGaWxlczsKLSAgfQotICAgIAotICAvLyBUaGlzIHJldHVybnMgdGhlIGZpcnN0IGltcG9ydGVkIGZpbGUgaW4gdGhlIGxpc3Qgb2YgaW1wb3J0ZWQgZmlsZXMKLSAgcHVibGljIElGaWxlIGdldEltcG9ydGVkRmlsZSgpCi0gIHsKLSAgICBpZiAoaW1wb3J0ZWRGaWxlcy5pc0VtcHR5KCkgPT0gZmFsc2UpIAotICAgICAgcmV0dXJuIChJRmlsZSlpbXBvcnRlZEZpbGVzLmZpcnN0RWxlbWVudCgpOwotICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9JbnZva2VTZXREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvSW52b2tlU2V0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTg2NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9JbnZva2VTZXREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy5XU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMuV1NETENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMuV1NETFNldENvbXBvbmVudEhlbHBlcjsKLQotcHVibGljIGNsYXNzIEludm9rZVNldERpYWxvZwotewotICBTdHJpbmcga2luZDsKLSAgU3RyaW5nIG5ld1ZhbHVlID0gIiI7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VLaW5kKFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3VmFsdWU7IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oT2JqZWN0IGlucHV0LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgICBXU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG51bGw7Ci0gICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICBJRmlsZSBpRmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFdTRExFbGVtZW50KSBpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgU3RyaW5nIHByb3BlcnR5ID0gIiI7Ci0gICAgICBMaXN0IGxvb2t1cFBhdGhzID0gbmV3IEFycmF5TGlzdCgyKTsKLSAgICAgIAotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0gICAgewotICAgICAgICBTdHJpbmcgZGlhbG9nVGl0bGUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9TUEVDSUZZX1BPUlRUWVBFIik7Ci0gICAgICAgIAotICAgICAgICBXU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgV1NETENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyKGlGaWxlLCBkZWZpbml0aW9uLCBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSk7Ci0gICAgICAgIGRpYWxvZyA9IG5ldyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nKHNoZWxsLCBkaWFsb2dUaXRsZSwgcHJvdmlkZXIpOwotICAgICAgICBwcm92aWRlci5zZXREaWFsb2coZGlhbG9nKTsKLSAgICAgICAgcHJvcGVydHkgPSAidHlwZSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgUG9ydCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBkaWFsb2dUaXRsZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX1NQRUNJRllfQklORElORyIpOwotICAgICAgICAKLSAgICAgICAgV1NETENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihpRmlsZSwgZGVmaW5pdGlvbiwgV1NETENvbnN0YW50cy5CSU5ESU5HKTsKLSAgICAgICAgZGlhbG9nID0gbmV3IFdTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2coc2hlbGwsIGRpYWxvZ1RpdGxlLCBwcm92aWRlcik7Ci0gICAgICAgIHByb3ZpZGVyLnNldERpYWxvZyhkaWFsb2cpOwotICAgICAgICBwcm9wZXJ0eSA9ICJiaW5kaW5nIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYXJ0KQotICAgIHsKLSAgICAgICAgTGlzdCB2YWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KDIpOwotICAgICAgICB2YWxpZEV4dGVuc2lvbnMuYWRkKCJ3c2RsIik7Ci0gICAgICAgIHZhbGlkRXh0ZW5zaW9ucy5hZGQoInhzZCIpOwotICAgICAgICBsb29rdXBQYXRocyA9IG5ldyBBcnJheUxpc3QoNCk7Ci0gICAgICAgIFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0gICAgICAgIGlmIChraW5kLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSkgewotICAgICAgICAgICAgcHJvcGVydHkgPSAiIjsgCi0gICAgICAgICAgICBTdHJpbmcgZGlhbG9nVGl0bGUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9TUEVDSUZZX1RZUEUiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJvdmlkZXIgPSBuZXcgV1NETENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyKGlGaWxlLCBkZWZpbml0aW9uLCBXU0RMQ29uc3RhbnRzLlRZUEUsIHZhbGlkRXh0ZW5zaW9ucyk7Ci0gICAgICAgICAgICBkaWFsb2cgPSBuZXcgV1NETENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwgZGlhbG9nVGl0bGUsIHByb3ZpZGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHByb3BlcnR5ID0gIiI7IAotICAgICAgICAgICAgU3RyaW5nIGRpYWxvZ1RpdGxlID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfU1BFQ0lGWV9FTEVNRU5UIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByb3ZpZGVyID0gbmV3IFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihpRmlsZSwgZGVmaW5pdGlvbiwgV1NETENvbnN0YW50cy5FTEVNRU5ULCB2YWxpZEV4dGVuc2lvbnMpOwotICAgICAgICAgICAgZGlhbG9nID0gbmV3IFdTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2coc2hlbGwsIGRpYWxvZ1RpdGxlLCBwcm92aWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdmlkZXIuc2V0RGlhbG9nKGRpYWxvZyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSW5wdXQgfHwgaW5wdXQgaW5zdGFuY2VvZiBPdXRwdXQgfHwgaW5wdXQgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBkaWFsb2dUaXRsZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX1NQRUNJRllfTUVTU0FHRSIpOwotCi0gICAgICAgIFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG5ldyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIoaUZpbGUsIGRlZmluaXRpb24sIFdTRExDb25zdGFudHMuTUVTU0FHRSk7Ci0gICAgICAgIGRpYWxvZyA9IG5ldyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nKHNoZWxsLCBkaWFsb2dUaXRsZSwgcHJvdmlkZXIpOyAgIAotICAgICAgICBwcm92aWRlci5zZXREaWFsb2coZGlhbG9nKTsKLSAgICAgICAgcHJvcGVydHkgPSAibWVzc2FnZSI7Ci0gICAgfQotCi0gICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgIGRpYWxvZy5jcmVhdGUoKTsKLQotICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICBXU0RMU2V0Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IG5ldyBXU0RMU2V0Q29tcG9uZW50SGVscGVyKGlGaWxlLCBkZWZpbml0aW9uKTsKLSAgICAgICAgaWYgKGtpbmQgIT0gbnVsbCAmJiBraW5kLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSkgewotICAgICAgICAgICAgaGVscGVyLnNldFhTRFR5cGVDb21wb25lbnQoKFBhcnQpIGlucHV0LCBkaWFsb2cuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGtpbmQgIT0gbnVsbCAmJiBraW5kLmVxdWFsc0lnbm9yZUNhc2UoImVsZW1lbnQiKSl7Ci0gICAgICAgICAgICBoZWxwZXIuc2V0WFNERWxlbWVudENvbXBvbmVudCgoUGFydCkgaW5wdXQsIGRpYWxvZy5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBoZWxwZXIuc2V0V1NETENvbXBvbmVudCgoV1NETEVsZW1lbnQpIGlucHV0LCBwcm9wZXJ0eSwgZGlhbG9nLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0gCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETENvbXBvbmVudEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMQ29tcG9uZW50RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NzUwMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMQ29tcG9uZW50RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54bWwuWE1MQ29tcG9uZW50RmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54bWwuWE1MUXVpY2tTY2FuOwotCi1wdWJsaWMgY2xhc3MgV1NETENvbXBvbmVudEZpbmRlciBleHRlbmRzIFhNTENvbXBvbmVudEZpbmRlciB7Ci0gICAgTGlzdCBsb29rdXBUYWdQYXRoczsKLSAgICAKLSAgICBwdWJsaWMgV1NETENvbXBvbmVudEZpbmRlcihMaXN0IHRhZ1BhdGhzKSB7Ci0gICAgICAgIGxvb2t1cFRhZ1BhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsb29rdXBUYWdQYXRocy5hZGRBbGwodGFnUGF0aHMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdCBnZXRXb3JrYmVuY2hSZXNvdXJjZUNvbXBvbmVudHMoaW50IHNjb3BlKSB7Ci0gICAgICAgIExpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBmaWxlUGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHNlYXJjaCB0aHJvdWdoIHRoZSBjdXJyZW50IGZpbGUgd2UncmUgd29ya2luZyBvbi4KLSAgICAgICAgaWYgKGN1cnJlbnRJRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBleGNsdWRlRmlsZXMuYWRkKGN1cnJlbnRJRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEZpbmQgZmlsZXMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBjcml0ZXJpYSBzcGVjaWZpZWQgaW4gTGlzdCBleHRlbnNpb25zIGFuZAotICAgICAgICAvLyBMaXN0IGV4Y2x1ZGVGaWxlcy4KLSAgICAgICAgc3dpdGNoIChzY29wZSkgewotICAgICAgICBjYXNlIEVOQ0xPU0lOR19QUk9KRUNUX1NDT1BFOgotICAgICAgICAgICAgZmlsZVBhdGhzID0gZ2V0RW5jbG9zaW5nUHJvamVjdEZpbGVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICBjYXNlIEVOVElSRV9XT1JLU1BBQ0VfU0NPUEU6Ci0gICAgICAgICAgICBmaWxlUGF0aHMgPSBnZXRXb3Jrc3BhY2VGaWxlcygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBjb21wb25lbnRzIGluIGVhY2ggb2YgdGhlIGZpbGVzIHNwZWNpZmllZCBpbiB0aGUgcGF0aC4KLSAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmdbXSBuYW1lQXR0ciA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICAgIG5hbWVBdHRyWzBdID0gIm5hbWUiOwotICAgICAgICBhdHRyaWJ1dGVzLmFkZChuYW1lQXR0cik7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5hbWVBdHRyKTsKLSAgICAgICAgYXR0cmlidXRlcy5hZGQobmFtZUF0dHIpOwotICAgICAgICBhdHRyaWJ1dGVzLmFkZChuYW1lQXR0cik7Ci0KLSAgICAgICAgSXRlcmF0b3IgcGF0aHNJdGVyYXRvciA9IGZpbGVQYXRocy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocGF0aHNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLS8vICAgICAgICAgICBTdHJpbmcgc3RyaW5nUGF0aCA9ICgoUGF0aCkgcGF0aHNJdGVyYXRvci5uZXh0KCkpLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgICAgU3RyaW5nIHN0cmluZ1BhdGggPSAoKFBhdGgpIHBhdGhzSXRlcmF0b3IubmV4dCgpKS50b1N0cmluZygpOwotICAgICAgICAgICBjb21wb25lbnRzLmFkZEFsbChYTUxRdWlja1NjYW4uZ2V0VGFnSW5mbyhzdHJpbmdQYXRoLCBsb29rdXBUYWdQYXRocywgYXR0cmlidXRlcykpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29tcG9uZW50czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL1dTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU2NDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLmNvbW1vbi5JQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRTZWxlY3Rpb25EaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgWE1MQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIHsKLQkKLSAgICBwdWJsaWMgV1NETENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBJQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoc2hlbGwsIGRpYWxvZ1RpdGxlLCBwcm92aWRlcik7Ci0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL1dTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxMWExOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL1dTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5JbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnR5cGVzeXN0ZW0uRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy5jb21tb24uSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueG1sLlhNTENvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNESW1wb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBYTUxDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTFRfSU5fVFlQRSA9ICJCVUlMVF9JTl9UWVBFIjsKLSAgICAKLSAgICBwcml2YXRlIFdTRExDb21wb25lbnRGaW5kZXIgd3NkbENvbXBvbmVudEZpbmRlcjsKLSAgICBwcml2YXRlIFdTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nOwotICAgIHByaXZhdGUgV1NETENvbXBvbmVudExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLSAgICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgICBwcml2YXRlIExpc3QgbG9va3VwVGFnUGF0aHM7Ci0gICAgcHJpdmF0ZSBpbnQga2luZDsKLSAgICAKLSAgICAvKgotICAgICAqIFRha2VzIGluIHRoZSBJRmlsZSB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmcuCi0gICAgICovCi0gICAgcHVibGljIFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihJRmlsZSBmaWxlLCBEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCBraW5kKSB7Ci0gICAgCXRoaXMua2luZCA9IGtpbmQ7Ci0gICAgICAgIExpc3QgdmFsaWRFeHQgPSBuZXcgQXJyYXlMaXN0KDEpOwotICAgICAgICB2YWxpZEV4dC5hZGQoIndzZGwiKTsKLSAgICAgICAgdGhpcy5sb29rdXBUYWdQYXRocyA9IGdldExvb2t1cFRhZ1BhdGgoKTsKLSAgICAgICAgd3NkbENvbXBvbmVudEZpbmRlciA9IG5ldyBXU0RMQ29tcG9uZW50RmluZGVyKGxvb2t1cFRhZ1BhdGhzKTsKLSAgICAgICAgd3NkbENvbXBvbmVudEZpbmRlci5zZXRGaWxlKGZpbGUpOwotICAgICAgICB3c2RsQ29tcG9uZW50RmluZGVyLnNldFZhbGlkRXh0ZW5zaW9ucyh2YWxpZEV4dCk7Ci0gICAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgICAgIGxhYmVsUHJvdmlkZXIgPSBuZXcgV1NETENvbXBvbmVudExhYmVsUHJvdmlkZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0TG9va3VwVGFnUGF0aCgpCi0gICAgeyAgICAJCi0gICAgCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAJc3dpdGNoIChraW5kKQotCQl7Ci0JCWNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HIDoKLQkJewotCQkJbGlzdC5hZGQoIi9kZWZpbml0aW9ucy9iaW5kaW5nIik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFdTRExDb25zdGFudHMuUE9SVF9UWVBFIDoKLQkJewotCQkJbGlzdC5hZGQoIi9kZWZpbml0aW9ucy9wb3J0VHlwZSIpOwotCQkJYnJlYWs7Ci0JCX0JCi0JCWNhc2UgV1NETENvbnN0YW50cy5NRVNTQUdFIDoKLQkJewotCQkJbGlzdC5hZGQoIi9kZWZpbml0aW9ucy9tZXNzYWdlIik7Ci0JCQlicmVhazsKLQkJfSAgIAotCQljYXNlIFdTRExDb25zdGFudHMuVFlQRSA6Ci0JCXsKLQkJCWxpc3QuYWRkKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL3NpbXBsZVR5cGUiKTsKLQkJCWxpc3QuYWRkKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2NvbXBsZXhUeXBlIik7Ci0JCQlsaXN0LmFkZCgiL3NjaGVtYS9jb21wbGV4VHlwZSIpOwotCQkJbGlzdC5hZGQoIi9zY2hlbWEvc2ltcGxlVHlwZSIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBXU0RMQ29uc3RhbnRzLkVMRU1FTlQgOgotCQl7Ci0JCQlsaXN0LmFkZCgiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9lbGVtZW50Iik7Ci0JCQlsaXN0LmFkZCgiL3NjaGVtYS9lbGVtZW50Iik7Ci0JCQlicmVhazsKLQkJfQotCQl9ICAgIAkKLSAgICAJcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihJRmlsZSBmaWxlLCBEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCBraW5kLCBMaXN0IHZhbGlkRXh0KSB7Ci0gICAgICAgIHRoaXMoZmlsZSwgZGVmaW5pdGlvbiwga2luZCk7Ci0gICAgICAgIHdzZGxDb21wb25lbnRGaW5kZXIuc2V0VmFsaWRFeHRlbnNpb25zKHZhbGlkRXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGlhbG9nKFdTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nKSB7Ci0gICAgICAgIHRoaXMuZGlhbG9nID0gZGlhbG9nOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXU0RMQ29tcG9uZW50T2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0LCBMaXN0IGlucHV0Q29tcG9uZW50cywgU3RyaW5nIHRhZ1BhdGgpIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBpbnB1dENvbXBvbmVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG5ldyBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKHRhZ1BhdGgpOyAKLSAgICAgICAgICAgIHNwZWMuYWRkQXR0cmlidXRlSW5mbygibmFtZSIsIHdzZGxFbGVtZW50LmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgICAgICAgICBzcGVjLnNldFRhcmdldE5hbWVzcGFjZSh3c2RsRWxlbWVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbm9ybWFsaXplZEZpbGUgPSBnZXROb3JtYWxpemVkTG9jYXRpb24od3NkbEVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgc3BlYy5zZXRGaWxlTG9jYXRpb24obm9ybWFsaXplZEZpbGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGREYXRhSXRlbVRvVHJlZU5vZGUobGlzdCwgc3BlYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVhTRENvbXBvbmVudE9iamVjdHMoSUNvbXBvbmVudExpc3QgbGlzdCwgTGlzdCBpbnB1dENvbXBvbmVudHMsIFN0cmluZyB0YWdQYXRoKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gaW5wdXRDb21wb25lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IHhzZEVsZW1lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG5ldyBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKHRhZ1BhdGgpOyAKLSAgICAgICAgICAgIHNwZWMuYWRkQXR0cmlidXRlSW5mbygibmFtZSIsIHhzZEVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHNwZWMuc2V0VGFyZ2V0TmFtZXNwYWNlKHhzZEVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbm9ybWFsaXplZEZpbGUgPSBnZXROb3JtYWxpemVkTG9jYXRpb24oeHNkRWxlbWVudC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIHNwZWMuc2V0RmlsZUxvY2F0aW9uKG5vcm1hbGl6ZWRGaWxlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYWRkRGF0YUl0ZW1Ub1RyZWVOb2RlKGxpc3QsIHNwZWMpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBnZXRDb21wb25lbnRzKElDb21wb25lbnRMaXN0IGxpc3QsIGJvb2xlYW4gcXVpY2spIHsKLSAgICAgICAgaWYgKHF1aWNrKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB0YWdzID0gbG9va3VwVGFnUGF0aHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlICh0YWdzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGdldENvbXBvbmVudHNRdWljayhsaXN0LCAoU3RyaW5nKSB0YWdzLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBHcmFiIGNvbXBvbmVudHMgZnJvbSB3b3Jrc3BhY2UgbG9jYXRpb25zCi0gICAgICAgICAgICBTdHJpbmcgc2NvcGUgPSAiIjsKLSAgICAgICAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNjb3BlID0gZGlhbG9nLmdldFNlYXJjaFNjb3BlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIExpc3QgY29tcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoc2NvcGUuZXF1YWxzKFhNTENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5TQ09QRV9FTkNMT1NJTkdfUFJPSkVDVCkpIHsKLSAgICAgICAgICAgICAgICBjb21wcyA9IHdzZGxDb21wb25lbnRGaW5kZXIuZ2V0V29ya2JlbmNoUmVzb3VyY2VDb21wb25lbnRzKFhNTENvbXBvbmVudEZpbmRlci5FTkNMT1NJTkdfUFJPSkVDVF9TQ09QRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzY29wZS5lcXVhbHMoWE1MQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nLlNDT1BFX1dPUktTUEFDRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wcyA9IHdzZGxDb21wb25lbnRGaW5kZXIuZ2V0V29ya2JlbmNoUmVzb3VyY2VDb21wb25lbnRzKFhNTENvbXBvbmVudEZpbmRlci5FTlRJUkVfV09SS1NQQUNFX1NDT1BFKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSXRlcmF0b3IgY29tcHNJdCA9IGNvbXBzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoY29tcHNJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIGl0ZW0gPSAoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgY29tcHNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYWRkRGF0YUl0ZW1Ub1RyZWVOb2RlKGxpc3QsIGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBnZXRDb21wb25lbnRzUXVpY2soSUNvbXBvbmVudExpc3QgbGlzdCwgU3RyaW5nIHRhZ1BhdGgpIHsKLSAgICAgICAgLy8gR3JhYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgZmlsZQotICAgICAgICBpZiAodGFnUGF0aC5lcXVhbHMoIi9kZWZpbml0aW9ucy9iaW5kaW5nIikpIHsKLSAgICAgICAgICAgIC8vIEdyYWIgZXhwbGljdGx5IGRlZmluZWQgY29tcG9uZW50cwotICAgICAgICAgICAgY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMobGlzdCwgZGVmaW5pdGlvbi5nZXRFQmluZGluZ3MoKSwgdGFnUGF0aCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdyYWIgZGlyZWN0bHkgaW1wb3J0ZWQgY29tcG9uZW50cwotICAgICAgICAgICAgSXRlcmF0b3IgaW1wb3J0c0l0ID0gZ2V0V1NETEZpbGVJbXBvcnRzKGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKSkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpbXBvcnRzSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgSW1wb3J0IGltcG9ydEl0ZW0gPSAoSW1wb3J0KSBpbXBvcnRzSXQubmV4dCgpOwotICAgICAgICAgICAgICAgIERlZmluaXRpb24gaW1wb3J0RGVmaW5pdGlvbiA9IGltcG9ydEl0ZW0uZ2V0RURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICBMaXN0IGltcG9ydGVkQ29tcG9uZW50cyA9IGltcG9ydERlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMobGlzdCwgaW1wb3J0ZWRDb21wb25lbnRzLCB0YWdQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0YWdQYXRoLmVxdWFscygiL2RlZmluaXRpb25zL3BvcnRUeXBlIikpIHsKLSAgICAgICAgICAgIC8vIEdyYWIgZXhwbGljdGx5IGRlZmluZWQgY29tcG9uZW50cwotICAgICAgICAgICAgY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMobGlzdCwgZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCksIHRhZ1BhdGgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHcmFiIGRpcmVjdGx5IGltcG9ydGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydHNJdCA9IGdldFdTRExGaWxlSW1wb3J0cyhkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaW1wb3J0c0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0c0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGltcG9ydERlZmluaXRpb24gPSBpbXBvcnRJdGVtLmdldEVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgTGlzdCBpbXBvcnRlZENvbXBvbmVudHMgPSBpbXBvcnREZWZpbml0aW9uLmdldEVQb3J0VHlwZXMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjcmVhdGVXU0RMQ29tcG9uZW50T2JqZWN0cyhsaXN0LCBpbXBvcnRlZENvbXBvbmVudHMsIHRhZ1BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRhZ1BhdGguZXF1YWxzKCIvZGVmaW5pdGlvbnMvbWVzc2FnZSIpKSB7Ci0gICAgICAgICAgICAvLyBHcmFiIGV4cGxpY3RseSBkZWZpbmVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGNyZWF0ZVdTRExDb21wb25lbnRPYmplY3RzKGxpc3QsIGRlZmluaXRpb24uZ2V0RU1lc3NhZ2VzKCksIHRhZ1BhdGgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHcmFiIGRpcmVjdGx5IGltcG9ydGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydHNJdCA9IGdldFdTRExGaWxlSW1wb3J0cyhkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaW1wb3J0c0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0c0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGltcG9ydERlZmluaXRpb24gPSBpbXBvcnRJdGVtLmdldEVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgTGlzdCBpbXBvcnRlZENvbXBvbmVudHMgPSBpbXBvcnREZWZpbml0aW9uLmdldEVNZXNzYWdlcygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNyZWF0ZVdTRExDb21wb25lbnRPYmplY3RzKGxpc3QsIGltcG9ydGVkQ29tcG9uZW50cywgdGFnUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFnUGF0aC5lcXVhbHMoIi9kZWZpbml0aW9ucy90eXBlcy9zY2hlbWEvY29tcGxleFR5cGUiKSkgewotICAgICAgICAgICAgY3JlYXRlWFNESW5saW5lVHlwZXNPYmplY3RzKGxpc3QsIHRhZ1BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRhZ1BhdGguZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL3NpbXBsZVR5cGUiKSkgewotICAgICAgICAgICAgY3JlYXRlWFNESW5saW5lVHlwZXNPYmplY3RzKGxpc3QsIHRhZ1BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRhZ1BhdGguZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2VsZW1lbnQiKSkgewotICAgICAgICAgICAgY3JlYXRlWFNERWxlbWVudE9iamVjdHMobGlzdCwgdGFnUGF0aCk7Ci0gICAgICAgICAgICBjcmVhdGVSZWd1bGFySW1wb3J0WFNERWxlbWVudE9iamVjdHMobGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFnUGF0aC5lcXVhbHMoIi9zY2hlbWEvY29tcGxleFR5cGUiKSkgewotICAgICAgICAgICAgY3JlYXRlWFNESW5saW5lV3JhcHBlclR5cGVPYmplY3RzKGxpc3QsIHRhZ1BhdGgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjcmVhdGVYU0RCdWlsdEluVHlwZU9iamVjdHMobGlzdCk7Ci0gICAgICAgICAgICBjcmVhdGVSZWd1bGFySW1wb3J0WFNEVHlwZU9iamVjdHMobGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFnUGF0aC5lcXVhbHMoIi9zY2hlbWEvc2ltcGxlVHlwZSIpKSB7Ci0gICAgICAgICAgICBjcmVhdGVYU0RJbmxpbmVXcmFwcGVyVHlwZU9iamVjdHMobGlzdCwgdGFnUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFnUGF0aC5lcXVhbHMoIi9zY2hlbWEvZWxlbWVudCIpKSB7Ci0gICAgICAgICAgICBjcmVhdGVYU0RJbmxpbmVXcmFwcGVyRWxlbWVudE9iamVjdHMobGlzdCwgdGFnUGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0IGdldFdTRExGaWxlSW1wb3J0cyhMaXN0IHdzZGxJbXBvcnRzKSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSB3c2RsSW1wb3J0cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBJbXBvcnRJbXBsIGltcG9ydEl0ZW0gPSAoSW1wb3J0SW1wbCkgaXQubmV4dCgpOwotICAgICAgICAgICAgaW1wb3J0SXRlbS5pbXBvcnREZWZpbml0aW9uT3JTY2hlbWEoKTsgICAgICAgICAgLy8gTG9hZCBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgIGlmIChpbXBvcnRJdGVtLmdldEVTY2hlbWEoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoaW1wb3J0SXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlWFNEQnVpbHRJblR5cGVPYmplY3RzKElDb21wb25lbnRMaXN0IGxpc3QpIHsgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgWFNERE9NSGVscGVyLmRhdGFUeXBlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYnVpbHRJbiA9IFhTRERPTUhlbHBlci5kYXRhVHlwZVtpXVswXTsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG5ldyBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKEJVSUxUX0lOX1RZUEUpOyAKLSAgICAgICAgICAgIHNwZWMuYWRkQXR0cmlidXRlSW5mbygibmFtZSIsIGJ1aWx0SW4pOwotICAgICAgICAgICAgc3BlYy5zZXRUYXJnZXROYW1lc3BhY2UoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLQotLy8gICAgICAgICAgICBTdHJpbmcgbm9ybWFsaXplZEZpbGUgPSBnZXROb3JtYWxpemVkTG9jYXRpb24oZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpKTsKLS8vICAgICAgICAgICAgc3BlYy5zZXRGaWxlTG9jYXRpb24obm9ybWFsaXplZEZpbGUpOwotICAgICAgICAgICAgc3BlYy5zZXRGaWxlTG9jYXRpb24oIkJ1aWx0LWluIik7ICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGREYXRhSXRlbVRvVHJlZU5vZGUobGlzdCwgc3BlYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlZ3VsYXJJbXBvcnRYU0RUeXBlT2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0KSB7Ci0gICAgICAgIC8vIEhhbmRsZSByZWd1bGFyIGltcG9ydHMoeHNkIGFuZCB3c2RsKS4KLSAgICAgICAgSXRlcmF0b3IgaW1wb3J0cyA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW1wb3J0cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0cy5uZXh0KCk7Ci0gICAgICAgICAgICAoKEltcG9ydEltcGwpIGltcG9ydEl0ZW0pLmltcG9ydERlZmluaXRpb25PclNjaGVtYSgpOwotICAgICAgICAgICAgTGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgU3RyaW5nIGNvbXBsZXhQYXRoID0gIiI7Ci0gICAgICAgICAgICBTdHJpbmcgc2ltcGxlUGF0aCA9ICIiOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW1wb3J0SXRlbS5nZXRFU2NoZW1hKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEltcG9ydCBpcyBhIHhzZCBmaWxlCi0gICAgICAgICAgICAgICAgc2NoZW1hcy5hZGQoaW1wb3J0SXRlbS5nZXRFU2NoZW1hKCkpOwotICAgICAgICAgICAgICAgIGNvbXBsZXhQYXRoID0gIi9zY2hlbWEvY29tcGxleFR5cGUiOwotICAgICAgICAgICAgICAgIHNpbXBsZVBhdGggPSAiL3NjaGVtYS9zaW1wbGVUeXBlIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGltcG9ydEl0ZW0uZ2V0RURlZmluaXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW1wb3J0IGlzIGEgd3NkbCBmaWxlCi0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaW1wb3J0SXRlbS5nZXRFRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChkZWZpbml0aW9uLmdldEVUeXBlcygpICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgSXRlcmF0b3Igc2NoZW1hSXQgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCSAgICAgICAgICAgICAgICB3aGlsZSAoc2NoZW1hSXQuaGFzTmV4dCgpKSB7Ci0JICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlZUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHNjaGVtYUl0Lm5leHQoKTsKLQkgICAgICAgICAgICAgICAgICAgIHNjaGVtYXMuYWRkKGVlRWxlbWVudC5nZXRTY2hlbWEoKSk7Ci0JICAgICAgICAgICAgICAgICAgICBjb21wbGV4UGF0aCA9ICIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2NvbXBsZXhUeXBlIjsKLQkgICAgICAgICAgICAgICAgICAgIHNpbXBsZVBhdGggPSAiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9zaW1wbGVUeXBlIjsKLQkgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNjaGVtYXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHNjaGVtYUl0ID0gc2NoZW1hcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChzY2hlbWFJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgdHlwZXNJdCA9ICgoWFNEU2NoZW1hKSBzY2hlbWFJdC5uZXh0KCkpLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgY29tcGxleExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Qgc2ltcGxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHR5cGVzSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29tcG9uZW50ID0gdHlwZXNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleExpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZUxpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVhTRENvbXBvbmVudE9iamVjdHMobGlzdCwgY29tcGxleExpc3QsIGNvbXBsZXhQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlWFNEQ29tcG9uZW50T2JqZWN0cyhsaXN0LCBzaW1wbGVMaXN0LCBzaW1wbGVQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlZ3VsYXJJbXBvcnRYU0RFbGVtZW50T2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0KSB7Ci0gICAgICAgIC8vIEhhbmRsZSByZWd1bGFyIGltcG9ydHMoeHNkIGFuZCB3c2RsKS4KLSAgICAgICAgSXRlcmF0b3IgaW1wb3J0cyA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW1wb3J0cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0cy5uZXh0KCk7Ci0gICAgICAgICAgICAoKEltcG9ydEltcGwpIGltcG9ydEl0ZW0pLmltcG9ydERlZmluaXRpb25PclNjaGVtYSgpOwotICAgICAgICAgICAgTGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGltcG9ydEl0ZW0uZ2V0RVNjaGVtYSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBJbXBvcnQgaXMgYSB4c2QgZmlsZQotICAgICAgICAgICAgICAgIHNjaGVtYXMuYWRkKGltcG9ydEl0ZW0uZ2V0RVNjaGVtYSgpKTsKLSAgICAgICAgICAgICAgICBwYXRoID0gIi9zY2hlbWEvZWxlbWVudCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpbXBvcnRJdGVtLmdldEVEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEltcG9ydCBpcyBhIHdzZGwgZmlsZQotICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGltcG9ydEl0ZW0uZ2V0RURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHNjaGVtYUl0ID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkgICAgICAgICAgICAgICAgd2hpbGUgKHNjaGVtYUl0Lmhhc05leHQoKSkgewotCSAgICAgICAgICAgICAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWVFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBzY2hlbWFJdC5uZXh0KCk7Ci0JICAgICAgICAgICAgICAgICAgICBzY2hlbWFzLmFkZChlZUVsZW1lbnQuZ2V0U2NoZW1hKCkpOwotCSAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2VsZW1lbnQiOwotCSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc2NoZW1hcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3Igc2NoZW1hSXQgPSBzY2hlbWFzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNjaGVtYUl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBMaXN0IGVsZW1lbnRMaXN0ID0gKChYU0RTY2hlbWEpIHNjaGVtYUl0Lm5leHQoKSkuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBjcmVhdGVYU0RDb21wb25lbnRPYmplY3RzKGxpc3QsIGVsZW1lbnRMaXN0LCBwYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVhTRElubGluZVR5cGVzT2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0LCBTdHJpbmcgdGFnUGF0aCkgewotICAgICAgICAvLyBIYW5kbGUgaW5saW5lIHNjaGVtYXMKLSAgICAJaWYgKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkgPT0gbnVsbCkgewotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCQotICAgICAgICBJdGVyYXRvciBpbmxpbmVTY2hlbWFzSXQgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpLmdldFNjaGVtYXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW5saW5lU2NoZW1hc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGlubGluZVNjaGVtYXNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJiAhc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBrZWVwVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHR5cGVJdGVyYXRvciA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IHVud2FudGVkIFR5cGVzCi0gICAgICAgICAgICAgICAgICAgIGlmICh0YWdQYXRoLmVxdWFscygiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9jb21wbGV4VHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHlwZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB0eXBlID0gdHlwZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHR5cGUpLmdldFNjaGVtYSgpLmVxdWFscyhzY2hlbWEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBUeXBlcy5hZGQodHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhZ1BhdGguZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL3NpbXBsZVR5cGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHR5cGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdHlwZSA9IHR5cGVJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZSkuZ2V0U2NoZW1hKCkuZXF1YWxzKHNjaGVtYSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcFR5cGVzLmFkZCh0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVhTRENvbXBvbmVudE9iamVjdHMobGlzdCwga2VlcFR5cGVzLCB0YWdQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVYU0RFbGVtZW50T2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0LCBTdHJpbmcgdGFnUGF0aCkgewotICAgIAlpZiAoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJCi0gICAgICAgIEl0ZXJhdG9yIGlubGluZVNjaGVtYXNJdCA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbmxpbmVTY2hlbWFzSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgaW5saW5lU2NoZW1hc0l0Lm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdCBrZWVwRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwgJiYgIXNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgZWxlbWVudEl0ID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50SXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbG9vayBmb3IgZWxlbWVudHMgZXhwbGljaXRseSBkZWZpbmVkIGluIHRoZSBTY2hlbWEgKG5vdCB0aHJvdWdoIGltcG9ydHMpLgotICAgICAgICAgICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRJdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4c2RFbGVtZW50LmdldFNjaGVtYSgpLmVxdWFscyhzY2hlbWEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZWVwRWxlbWVudHMuYWRkKHhzZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNyZWF0ZVhTRENvbXBvbmVudE9iamVjdHMobGlzdCwga2VlcEVsZW1lbnRzLCB0YWdQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlWFNESW5saW5lV3JhcHBlclR5cGVPYmplY3RzKElDb21wb25lbnRMaXN0IGxpc3QsIFN0cmluZyB0YWdQYXRoKSB7Ci0gICAgICAgIC8vIEhhbmRsZSBpbmxpbmUgc2NoZW1hcwotICAgIAlpZiAoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJCi0gICAgICAgIEl0ZXJhdG9yIGlubGluZVNjaGVtYXNJdCA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbmxpbmVTY2hlbWFzSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgaW5saW5lU2NoZW1hc0l0Lm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsIHx8IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBrZWVwVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTGlzdCBpbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGNvbnRlbnRzID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoY29udGVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhTRFNjaGVtYUNvbnRlbnQgY29udGVudCA9IChYU0RTY2hlbWFDb250ZW50KSBjb250ZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZChjb250ZW50KTsgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaW1wb3J0SXRlcmF0b3IgPSBpbXBvcnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGltcG9ydEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBYU0RJbXBvcnQgaW1wb3J0T2JqZWN0ID0gKFhTREltcG9ydCkgaW1wb3J0SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWEgaW1wb3J0U2NoZW1hID0gKChYU0RJbXBvcnRJbXBsKSBpbXBvcnRPYmplY3QpLmltcG9ydFNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciB0eXBlc0l0ID0gaW1wb3J0U2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHR5cGVPYmplY3QgPSB0eXBlc0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdQYXRoLmVxdWFscygiL3NjaGVtYS9jb21wbGV4VHlwZSIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU9iamVjdCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBUeXBlcy5hZGQodHlwZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0YWdQYXRoLmVxdWFscygiL3NjaGVtYS9zaW1wbGVUeXBlIikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPYmplY3QgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBUeXBlcy5hZGQodHlwZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY3JlYXRlWFNEQ29tcG9uZW50T2JqZWN0cyhsaXN0LCBrZWVwVHlwZXMsIHRhZ1BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVYU0RJbmxpbmVXcmFwcGVyRWxlbWVudE9iamVjdHMoSUNvbXBvbmVudExpc3QgbGlzdCwgU3RyaW5nIHRhZ1BhdGgpIHsKLSAgICAJaWYgKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkgPT0gbnVsbCkgewotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCQotICAgICAgICBJdGVyYXRvciBpbmxpbmVTY2hlbWFzSXQgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpLmdldFNjaGVtYXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW5saW5lU2NoZW1hc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGlubGluZVNjaGVtYXNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCB8fCBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGNvbnRlbnRzID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBMaXN0IGltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgY29udGVudHMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREltcG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0cy5hZGQoY29udGVudCk7ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydEl0ZXJhdG9yID0gaW1wb3J0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpbXBvcnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgWFNESW1wb3J0IGltcG9ydE9iamVjdCA9IChYU0RJbXBvcnQpIGltcG9ydEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgWFNEU2NoZW1hIGltcG9ydFNjaGVtYSA9ICgoWFNESW1wb3J0SW1wbCkgaW1wb3J0T2JqZWN0KS5pbXBvcnRTY2hlbWEoKTsKLQotICAgICAgICAgICAgICAgICAgICBjcmVhdGVYU0RDb21wb25lbnRPYmplY3RzKGxpc3QsIGltcG9ydFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCksIHRhZ1BhdGgpOyAgICAKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgICBwcml2YXRlIElUeXBlU3lzdGVtUHJvdmlkZXIgZ2V0VHlwZVN5c3RlbVByb3ZpZGVyKCkgewotICAgICAgICAgICAgSVR5cGVTeXN0ZW1Qcm92aWRlciBwcm92aWRlciA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0VHlwZVN5c3RlbVByb3ZpZGVyKGRlZmluaXRpb24pOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlcikgewotICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gKEV4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXIpIHByb3ZpZGVyOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7Ci0gICAgICB9Ci0KLSAgICAKLSAgCi0gICAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBsYWJlbFByb3ZpZGVyOwotICAgIH0gICAgCi0gICAgCi0JcHVibGljIFN0cmluZyBnZXRMaXN0VGl0bGUoKSB7Ci0KLQkJc3dpdGNoIChraW5kKQotCQl7Ci0JCWNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HIDoKLQkJewotCQkJcmV0dXJuICJNYXRjaGluZyBCaW5kaW5nczoiOwotCQl9Ci0JCWNhc2UgV1NETENvbnN0YW50cy5QT1JUX1RZUEUgOgotCQl7Ci0JCQlyZXR1cm4gIk1hdGNoaW5nIFBvcnQgVHlwZXM6IjsKLQkJfQkKLQkJY2FzZSBXU0RMQ29uc3RhbnRzLk1FU1NBR0UgOgotCQl7Ci0JCQlyZXR1cm4gIk1hdGNoaW5nIE1lc3NhZ2VzOiI7Ci0JCX0gICAKLQkJY2FzZSBXU0RMQ29uc3RhbnRzLlRZUEUgOgotCQl7Ci0JCQlyZXR1cm4gIk1hdGNoaW5nIFR5cGVzOiI7Ci0JCX0KLQkJY2FzZSBXU0RMQ29uc3RhbnRzLkVMRU1FTlQgOgotCQl7Ci0JCQlyZXR1cm4gIk1hdGNoaW5nIEVsZW1lbnRzOiI7Ci0JCX0KLQkJfSAgICAJCi0JCXJldHVybiBudWxsOwkgICAKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVGaWVsZFRpdGxlKCkgewotCQkKLQkJc3dpdGNoIChraW5kKQotCQl7Ci0JCWNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HIDoKLQkJewotCQkJcmV0dXJuICJCaW5kaW5nIE5hbWU6IjsKLQkJfQotCQljYXNlIFdTRExDb25zdGFudHMuUE9SVF9UWVBFIDoKLQkJewotCQkJcmV0dXJuICJQb3J0IFR5cGUgTmFtZToiOwotCQl9CQotCQljYXNlIFdTRExDb25zdGFudHMuTUVTU0FHRSA6Ci0JCXsKLQkJCXJldHVybiAiTWVzc2FnZSBOYW1lOiI7Ci0JCX0gICAKLQkJY2FzZSBXU0RMQ29uc3RhbnRzLlRZUEUgOgotCQl7Ci0JCQlyZXR1cm4gIlR5cGUgTmFtZToiOwotCQl9Ci0JCWNhc2UgV1NETENvbnN0YW50cy5FTEVNRU5UIDoKLQkJewotCQkJcmV0dXJuICJFbGVtZW50IE5hbWU6IjsKLQkJfQotCQl9ICAgIAkKLQkJcmV0dXJuIG51bGw7CSAgIAotCX0KLSAgICBwdWJsaWMgY2xhc3MgV1NETENvbXBvbmVudExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBYTUxDb21wb25lbnRTZWxlY3Rpb25MYWJlbFByb3ZpZGVyIHsKLSAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICBYTUxDb21wb25lbnRUcmVlT2JqZWN0IHNwZWNpZmljYXRpb24gPSAoWE1MQ29tcG9uZW50VHJlZU9iamVjdCkgZWxlbWVudDsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IChYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBzcGVjaWZpY2F0aW9uLmdldFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24oKS5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAoc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvZGVmaW5pdGlvbnMvYmluZGluZyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvYmluZGluZ19vYmouZ2lmIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzcGVjLmdldFRhZ1BhdGgoKS5lcXVhbHMoIi9kZWZpbml0aW9ucy9wb3J0VHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvcG9ydF9vYmouZ2lmIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzcGVjLmdldFRhZ1BhdGgoKS5lcXVhbHMoIi9kZWZpbml0aW9ucy9tZXNzYWdlIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9tZXNzYWdlX29iai5naWYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNwZWMuZ2V0VGFnUGF0aCgpLmVxdWFscygiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9jb21wbGV4VHlwZSIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICBzcGVjLmdldFRhZ1BhdGgoKS5lcXVhbHMoIi9zY2hlbWEvY29tcGxleFR5cGUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRENvbXBsZXhUeXBlLmdpZiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL3NpbXBsZVR5cGUiKSB8fAotICAgICAgICAgICAgICAgICAgICAgc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvc2NoZW1hL3NpbXBsZVR5cGUiKSB8fAotICAgICAgICAgICAgICAgICAgICAgc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCJCVUlMVF9JTl9UWVBFIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2VsZW1lbnQiKSB8fAotICAgICAgICAgICAgICAgICAgICAgc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvc2NoZW1hL2VsZW1lbnQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREVsZW1lbnQuZ2lmIik7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETFNldENvbXBvbmVudEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMU2V0Q29tcG9uZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjgwNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMU2V0Q29tcG9uZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRJbXBvcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueG1sLlhNTENvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFDb250ZW50OwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMU2V0Q29tcG9uZW50SGVscGVyIHsKLSAgICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgICBwcml2YXRlIElGaWxlIGN1cnJlbnRJRmlsZTsKLSAgICAKLSAgICBwdWJsaWMgV1NETFNldENvbXBvbmVudEhlbHBlcihJRmlsZSBpRmlsZSwgRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgICAgIGN1cnJlbnRJRmlsZSA9IGlGaWxlOwotICAgICAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMQ29tcG9uZW50KFdTRExFbGVtZW50IGlucHV0RWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMpIHsKLSAgICAgICAgYWRkSW1wb3J0SWZOZWNlc3Nhcnkoc3BlYyk7Ci0gICAgICAgIFN0cmluZyBjb21wb25lbnRPYmplY3QgPSBnZXRQcmVmaXhlZENvbXBvbmVudE5hbWUoc3BlYyk7Ci0KLSAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCB3c2RsRWxlbWVudCA9IGlucHV0RWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBkZWZpbml0aW9uLmdldEVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIHdzZGxFbGVtZW50LnNldEF0dHJpYnV0ZShwcm9wZXJ0eSwgY29tcG9uZW50T2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0WFNEVHlwZUNvbXBvbmVudChQYXJ0IHBhcnQsIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykgewotICAgICAgICBpZiAoIXNwZWMuZ2V0VGFnUGF0aCgpLmVxdWFscyhXU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIuQlVJTFRfSU5fVFlQRSkpIHsKLSAgICAgICAgICAgIGFkZEltcG9ydElmTmVjZXNzYXJ5KHNwZWMpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjb21wb25lbnRPYmplY3QgPSBnZXRQcmVmaXhlZENvbXBvbmVudE5hbWUoc3BlYyk7Ci0gICAgICAgIAotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZSgoUGFydCkgcGFydCwgdHJ1ZSwgY29tcG9uZW50T2JqZWN0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0WFNERWxlbWVudENvbXBvbmVudChQYXJ0IHBhcnQsIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykgewotICAgICAgICBhZGRJbXBvcnRJZk5lY2Vzc2FyeShzcGVjKTsKLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudE9iamVjdCA9IGdldFByZWZpeGVkQ29tcG9uZW50TmFtZShzcGVjKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwuc2V0Q29tcG9uZW50UmVmZXJlbmNlKChQYXJ0KSBwYXJ0LCBmYWxzZSwgY29tcG9uZW50T2JqZWN0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBSZXR1cm4gdGhlIHByZWZpeGVkIGNvbXBvbmVudCBuYW1lIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4KLSAgICAgKiBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeGVkQ29tcG9uZW50TmFtZShYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBzcGVjLmdldEF0dHJpYnV0ZUluZm8oIm5hbWUiKTsKLSAgICAgICAgTGlzdCBwcmVmaXhlcyA9IGdldFByZWZpeGVzKGRlZmluaXRpb24sIHNwZWMuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBpZiAocHJlZml4ZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbmFtZSA9IHByZWZpeGVzLmdldCgwKSArICI6IiArIG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0gICAgICAgICAKLSAgICAgICAgICAKLSAgICBwcml2YXRlIExpc3QgZ2V0UHJlZml4ZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTWFwIG1hcCA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdGhlTmFtZXNwYWNlID0gKFN0cmluZykgbWFwLmdldChwcmVmaXgpOwotICAgICAgICAgICAgaWYgKHRoZU5hbWVzcGFjZSAhPSBudWxsICYmIHRoZU5hbWVzcGFjZS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKHByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEltcG9ydElmTmVjZXNzYXJ5KFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykgewotICAgICAgICBib29sZWFuIGZvdW5kTWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIGl0c2VsZgotICAgICAgICBTdHJpbmcgY3VycmVudEZpbGVMb2NhdGlvbiA9IGN1cnJlbnRJRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChjdXJyZW50RmlsZUxvY2F0aW9uLmVxdWFscyhzcGVjLmdldEZpbGVMb2NhdGlvbigpKSkgewotICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHJlZ3VsYXIgSW1wb3J0cwotICAgICAgICBpZiAoIWZvdW5kTWF0Y2gpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydHNJdCA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAoaW1wb3J0c0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpbXBvcnRMb2NhdGlvbiA9ICIiOwotICAgICAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0c0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1wb3J0SXRlbS5nZXRFU2NoZW1hKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gaW1wb3J0SXRlbS5nZXRFU2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydExvY2F0aW9uID0gZ2V0Tm9ybWFsaXplZExvY2F0aW9uKHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gaW1wb3J0RGVmaW5pdGlvbiA9IGltcG9ydEl0ZW0uZ2V0RURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0TG9jYXRpb24gPSBnZXROb3JtYWxpemVkTG9jYXRpb24oaW1wb3J0RGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpKTsgCi0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgIAotICAgICAgICAgICAgICAgIGlmIChpbXBvcnRMb2NhdGlvbi5lcXVhbHMoc3BlYy5nZXRGaWxlTG9jYXRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgaW5saW5lIFNjaGVtYXMKLSAgICAgICAgaWYgKCFmb3VuZE1hdGNoKSB7Ci0gICAgICAgICAgICBMaXN0IGltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9uLmdldEVUeXBlcygpICE9IG51bGwpIHsKLQkgICAgICAgICAgICBJdGVyYXRvciBpdCA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCkuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCSAgICAgICAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlZUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLQkgICAgICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGVlRWxlbWVudC5nZXRTY2hlbWEoKTsKLQkgICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsIHx8IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoIiIpKSB7ICAgICAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGNvbnRlbnRzID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLQkgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb250ZW50cy5oYXNOZXh0KCkpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgY29udGVudHMubmV4dCgpOwotCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0KSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydHMuYWRkKGNvbnRlbnQpOyAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydEl0ID0gaW1wb3J0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGltcG9ydEl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFhTREltcG9ydCBpbXBvcnRJdGVtID0gKFhTREltcG9ydCkgaW1wb3J0SXQubmV4dCgpOwotICAgICAgICAgICAgICAgIFhTRFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IGltcG9ydEl0ZW0uZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRTdHJpbmcgPSByZXNvbHZlZFNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpbXBvcnRMb2NhdGlvbiA9IGdldE5vcm1hbGl6ZWRMb2NhdGlvbihyZXNvbHZlZFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGltcG9ydExvY2F0aW9uLmVxdWFscyhzcGVjLmdldEZpbGVMb2NhdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZE1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIWZvdW5kTWF0Y2gpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gd3NpU3R5bGVJbXBvcnQgPSBpc1hTRFNjaGVtYUZpbGUoc3BlYyk7Ci0gICAgICAgICAgICBpZiAod3NpU3R5bGVJbXBvcnQpIHsKLSAgICAgICAgICAgICAgICBBZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb24gYWN0aW9uID0gbmV3IEFkZEVsZW1lbnREZWNsYXJhdGlvbkFjdGlvbihkZWZpbml0aW9uLCBzcGVjLmdldFRhcmdldE5hbWVzcGFjZSgpLCAieHNkIik7Ci0gICAgICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShuZXcgUGF0aChzcGVjLmdldEZpbGVMb2NhdGlvbigpKSwgY3VycmVudElGaWxlLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgIEFkZFdTSVNjaGVtYUltcG9ydEFjdGlvbiBhZGRJbXBvcnQgPSBuZXcgQWRkV1NJU2NoZW1hSW1wb3J0QWN0aW9uKGRlZmluaXRpb24sIHNwZWMuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBhZGRJbXBvcnQucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3U2VsZWN0ZWRGaWxlTG9jID0gc3BlYy5nZXRGaWxlTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudEZpbGVMb2MgPSBnZXROb3JtYWxpemVkTG9jYXRpb24oZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVsYXRpdmVMb2MgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVSZWxhdGl2ZVVSSShuZXdTZWxlY3RlZEZpbGVMb2MsIGN1cnJlbnRGaWxlTG9jLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHNwZWMuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQWRkSW1wb3J0QWN0aW9uIGFkZEltcG9ydEFjdGlvbiA9IG5ldyBBZGRJbXBvcnRBY3Rpb24obnVsbCwgZGVmaW5pdGlvbiwgZGVmaW5pdGlvbkVsZW1lbnQsIHByZWZpeCwgbmFtZXNwYWNlLCByZWxhdGl2ZUxvYyk7Ci0gICAgICAgICAgICAgICAgYWRkSW1wb3J0QWN0aW9uLnJ1bigpOyAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyB1bmlxdWVQcmVmaXggPSBnZXRVbmlxdWVQcmVmaXgoZGVmaW5pdGlvbiwgcHJlZml4KTsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyB1bmlxdWVQcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoKLSAgICAgKiBUcnkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwYXNzZWQgaW4gWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZWZlcnMgdG8KLSAgICAgKiBhbiBYU0Qgb3IgV1NETCBmaWxlLiAgSWYgaXQncyBhbiBYU0QsIHJldHVybiB0cnVlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1hTRFNjaGVtYUZpbGUoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlTG9jYXRpb24gPSBzcGVjLmdldEZpbGVMb2NhdGlvbigpOwotICAgICAgICBpbnQgcGVyaW9kSW5kZXggPSBmaWxlTG9jYXRpb24ubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChwZXJpb2RJbmRleCA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBmaWxlTG9jYXRpb24uc3Vic3RyaW5nKHBlcmlvZEluZGV4ICsgMSk7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInhzZCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZVByZWZpeChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBpbml0UHJlZml4KSB7Ci0gICAgICBTdHJpbmcgdW5pcXVlUHJlZml4OwotICAgICAgTWFwIG1hcCA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotCi0gICAgICBpZiAoZGVmaW5pdGlvbi5nZXROYW1lc3BhY2UoaW5pdFByZWZpeCkgPT0gbnVsbCkgewotICAgICAgICB1bmlxdWVQcmVmaXggPSBpbml0UHJlZml4OwotICAgICAgfQotICAgICAgZWxzZSB7Ly8gaWYgdXNlZCwgdGhlbiB0cnkgdG8gY3JlYXRlIGEgdW5pcXVlIG9uZQotICAgICAgICBTdHJpbmcgdGVtcFByZWZpeCA9IGluaXRQcmVmaXg7Ci0gICAgICAgIGludCBpID0gMTsKLSAgICAgICAgd2hpbGUobWFwLmNvbnRhaW5zS2V5KHRlbXBQcmVmaXggKyBpKSkgewotICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICB1bmlxdWVQcmVmaXggPSB0ZW1wUHJlZml4ICsgaTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB1bmlxdWVQcmVmaXg7ICAgIAotICAgIH0gCi0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9ybWFsaXplZExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotICAgICAgICAgICAgVVJMIHJlc29sdmVkVVJMID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpOwotICAgICAgICAgICAgbG9jYXRpb24gPSByZXNvbHZlZFVSTC5nZXRQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbG9jYXRpb247IAotICAgICAgfQotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNjQyOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnaW4gbWFuaWZlc3RzIGFuZCByZWdpc3RlcnMgZWFjaCBleHRlbnNpYmlsaXR5IGl0ZW0gdHJlZSBwcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeSBleHRlbmRzIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeQotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9QUk9WSURFUl9QUk9QRVJUWSA9ICJsYWJlbFByb3ZpZGVyQ2xhc3MiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BST1ZJREVSX1BST1BFUlRZID0gImNvbnRlbnRQcm92aWRlckNsYXNzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBVFRfTkFNRVMgPSB7ICJsYWJlbFByb3ZpZGVyQ2xhc3MiLCAiY29udGVudFByb3ZpZGVyQ2xhc3MiIH07Ci0KLSAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIHJldHVybiAoSUxhYmVsUHJvdmlkZXIpIGdldFByb3BlcnR5KG5hbWVzcGFjZSwgTEFCRUxfUFJPVklERVJfUFJPUEVSVFkpOwotICB9Ci0KLSAgcHVibGljIElUcmVlQ2hpbGRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIHJldHVybiAoSVRyZWVDaGlsZFByb3ZpZGVyKSBnZXRQcm9wZXJ0eShuYW1lc3BhY2UsIENPTlRFTlRfUFJPVklERVJfUFJPUEVSVFkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSURldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lEZXRhaWxzVmlld2VyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNDc0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSURldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURldGFpbHNWaWV3ZXJQcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0Vmlld2VyS2V5KE9iamVjdCBtb2RlbE9iamVjdCk7Ci0gIHB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKE9iamVjdCBtb2RlbE9iamVjdCwgQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lFZGl0UGFydFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSUVkaXRQYXJ0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjODIzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSUVkaXRQYXJ0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElFZGl0UGFydFByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZU1lbnVBY3Rpb25zKElNZW51TWFuYWdlciBtYW5hZ2VyLCBOb2RlIG5vZGUsIE9iamVjdCBvYmplY3QpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTWVudUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZmOTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTWVudUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBJTWVudUFjdGlvbkNvbnRyaWJ1dG9yCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZU1lbnVBY3Rpb25zKElNZW51TWFuYWdlciBtYW5hZ2VyLCBOb2RlIG5vZGUsIE9iamVjdCBvYmplY3QpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTW9kZWxRdWVyeUNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU1vZGVsUXVlcnlDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2EyYTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTW9kZWxRdWVyeUNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTW9kZWw7Ci0gICAgICAgICAgICAgICAgICAgCi0vLyBOb3RlIHRoaXMgY2xhc3Mgd2lsbCBsaWtlbHkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlIHdoZW4gdGhlIE1vZGVsUXVlcnkncyBleHRlbnNpb24gbWVjaGFuaXNtIGlzIHVwZGF0ZWQKLS8vCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFF1ZXJ5Q29udHJpYnV0b3IKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBzZXRNb2RlbChJRE9NTW9kZWwgeG1sTW9kZWwpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU5NTZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIKLXsgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KE9iamVjdCBwYXJlbnRNb2RlbE9iamVjdCwgRWxlbWVudFtdIGVsZW1lbnRDaGFpbiwgaW50IHN0YXJ0LCBpbnRbXSBlbmQpOwotICBwdWJsaWMgTm9kZSBnZXROb2RlKE9iamVjdCBtb2RlbE9iamVjdCk7IAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTm9kZVJlY29uY2lsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JTm9kZVJlY29uY2lsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjZmViYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU5vZGVSZWNvbmNpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBJTm9kZVJlY29uY2lsZXIKLXsKLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChPYmplY3QgbW9kZWxPYmplY3QsIEVsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lUcmVlQ2hpbGRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lUcmVlQ2hpbGRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWMzODBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JVHJlZUNoaWxkUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYWxsb3dzIGV4dGVuc2lvbiB3cml0ZXJzIHRvIHByb3ZpZGUgc3BlY2lhbGl6ZSB0cmVlIGNvbnRlbnQgYmVoYXZpb3VyLgotICogSXQgaXMgaW50ZW5kZWQgdG8gYmVoYXZlIHNpbWlsYXIgdG8gdGhlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIuCi0gKiBUaGUgbWFqb3IgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgY2xhc3MgaXMgc2ltcGxpZmllZCBzbyB0aGF0IG9ubHkgb25lIG1ldGhvZCBpcyBpbnZvbHZlZC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpICAJCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRyZWVDaGlsZFByb3ZpZGVyCi17Ci0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lUeXBlU3lzdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JVHlwZVN5c3RlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MDBlZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lUeXBlU3lzdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVR5cGVTeXN0ZW1Qcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOX1RZUEUgPSAweDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxUX0lOX1RZUEUgPSAweDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVJfREVGSU5FRF9TSU1QTEVfVFlQRSA9IDB4MjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFUl9ERUZJTkVEX0NPTVBMRVhfVFlQRSA9IDB4NDsKLQotICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUeXBlTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBpbnQgdHlwZU5hbWVDYXRlZ29yeSk7Ci0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUVsZW1lbnROYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24pOyAgCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVR5cGVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSwgaW50IHR5cGVOYW1lQ2F0ZWdvcnkpOwotICBwdWJsaWMgaW50IGdldENhdGVnb3J5Rm9yVHlwZU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUpOwotICBwdWJsaWMgTGlzdCBnZXRQcmVmaXhlZE5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL05TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL05TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2I3ZWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9OU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0gIHByb3RlY3RlZCBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fTE9BRElOR19FUlJPUiA9ICJQTFVHSU5fTE9BRElOR19FUlJPUiI7Ci0KLSAgcHVibGljIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgewotICAgIEV4dGVuc2lvbkluZm8gaW5mbyA9IChFeHRlbnNpb25JbmZvKSBtYXAuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgaWYgKGluZm8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbmZvID0gbmV3IFNpbmdsZVByb3BlcnR5RXh0ZW5zaW9uSW5mbyhjbGFzc05hbWUsIGNsYXNzTG9hZGVyKTsKLSAgICAgIG1hcC5wdXQobmFtZXNwYWNlVVJJLCBpbmZvKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgSGFzaE1hcCBwcm9wZXJ0eVRvQ2xhc3NOYW1lTWFwLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgewotICAgIEV4dGVuc2lvbkluZm8gaW5mbyA9IChFeHRlbnNpb25JbmZvKSBtYXAuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgaWYgKGluZm8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbmZvID0gbmV3IE11bHRpUHJvcGVydHlFeHRlbnNpb25JbmZvKHByb3BlcnR5VG9DbGFzc05hbWVNYXAsIGNsYXNzTG9hZGVyKTsKLSAgICAgIG1hcC5wdXQobmFtZXNwYWNlVVJJLCBpbmZvKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgRXh0ZW5zaW9uSW5mbyBpbmZvID0gKEV4dGVuc2lvbkluZm8pIG1hcC5nZXQobmFtZXNwYWNlVVJJKTsKLSAgICByZXR1cm4gaW5mbyAhPSBudWxsID8gaW5mby5nZXRPYmplY3QoIiIpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgRXh0ZW5zaW9uSW5mbyBpbmZvID0gKEV4dGVuc2lvbkluZm8pIG1hcC5nZXQobmFtZXNwYWNlVVJJKTsKLSAgICByZXR1cm4gaW5mbyAhPSBudWxsID8gaW5mby5nZXRPYmplY3QocHJvcGVydHkpIDogbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgRXh0ZW5zaW9uSW5mbwotICB7Ci0gICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotCi0gICAgcHVibGljIEV4dGVuc2lvbkluZm8oQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCi0gICAgewotICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBwcm9wZXJ0eSk7Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIFNpbmdsZVByb3BlcnR5RXh0ZW5zaW9uSW5mbyBleHRlbmRzIEV4dGVuc2lvbkluZm8KLSAgewotICAgIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOwotICAgIHByb3RlY3RlZCBPYmplY3Qgb2JqZWN0OwotICAgIHByb3RlY3RlZCBib29sZWFuIGVycm9yOwotCi0gICAgcHVibGljIFNpbmdsZVByb3BlcnR5RXh0ZW5zaW9uSW5mbyhTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgICB7Ci0gICAgICBzdXBlcihjbGFzc0xvYWRlcik7Ci0gICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIENsYXNzIHRoZUNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpIDogQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgIG9iamVjdCA9IHRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgb2JqZWN0ID0gUExVR0lOX0xPQURJTkdfRVJST1I7Ci0gICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG9iamVjdCAhPSBQTFVHSU5fTE9BRElOR19FUlJPUiA/IG9iamVjdCA6IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBNdWx0aVByb3BlcnR5RXh0ZW5zaW9uSW5mbyBleHRlbmRzIEV4dGVuc2lvbkluZm8KLSAgewotICAgIHByb3RlY3RlZCBIYXNoTWFwIHByb3BlcnR5VG9DbGFzc05hbWVUYWJsZTsKLSAgICBwcm90ZWN0ZWQgSGFzaE1hcCBwcm9wZXJ0eVRvT2JqZWN0VGFibGUgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIE11bHRpUHJvcGVydHlFeHRlbnNpb25JbmZvKEhhc2hNYXAgcHJvcGVydFRvQ2xhc3NOYW1lVGFibGUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICAgIHsKLSAgICAgIHN1cGVyKGNsYXNzTG9hZGVyKTsKLSAgICAgIHRoaXMucHJvcGVydHlUb0NsYXNzTmFtZVRhYmxlID0gcHJvcGVydFRvQ2xhc3NOYW1lVGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIHByb3BlcnR5VG9DbGFzc05hbWVUYWJsZS5nZXQocHJvcGVydHkpOwotICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBwcm9wZXJ0eVRvT2JqZWN0VGFibGUuZ2V0KHByb3BlcnR5KTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkgOiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICByZXN1bHQgPSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgcHJvcGVydHlUb09iamVjdFRhYmxlLnB1dChwcm9wZXJ0eSwgcmVzdWx0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByb3BlcnR5VG9PYmplY3RUYWJsZS5wdXQocHJvcGVydHksIFBMVUdJTl9MT0FESU5HX0VSUk9SKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IFBMVUdJTl9MT0FESU5HX0VSUk9SOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQkgIHJldHVybiByZXN1bHQgIT0gUExVR0lOX0xPQURJTkdfRVJST1IgPyByZXN1bHQgOiBudWxsOyAgICAgIAotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9XU0RMRWRpdG9yRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vV1NETEVkaXRvckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmJhZjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9XU0RMRWRpdG9yRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgV1NETEVkaXRvckV4dGVuc2lvbgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRMSU5FX1RSRUVfQ09OVEVOVF9QUk9WSURFUiA9IDE7ICAgIC8vIHJlcSdkIGZvciBtb2RlbCBiYXNlZCBleHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUTElORV9MQUJFTF9QUk9WSURFUiA9IDI7ICAgICAgICAgICAvLyByZXEnZCBmb3IgbW9kZWwgYmFzZWQgZXh0Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVOVV9BQ1RJT05fQ09OVFJJQlVUT1IgPSAzOyAgICAgICAgICAvLyBub2RlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVEFJTFNfVklFV0VSX1BST1ZJREVSID0gNDsgICAgICAgICAgLy8gbm9kZQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRfUEFSVF9GQUNUT1JZID0gNTsgICAgICAgICAgICAgICAgLy8gcmVxJ2QgZm9yIG1vZGVsIGJhc2VkIGV4dAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NZU1RFTV9QUk9WSURFUiA9IDY7ICAgICAgICAgICAgIC8vIHJlcSdkIGZvciB0eXBlIHN5c3RlbSBleHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ERV9SRUNPTkNJTEVSID0gNzsgICAgICAgICAgICAgICAgICAvLyByZXEnZCBmb3IgbW9kZWwgYmFzZWQgZXh0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PREVfQVNTT0NJQVRJT05fUFJPVklERVIgPSA4OyAgICAgICAgLy8gcmVxJ2QgZm9yIG1vZGVsIGJhc2VkIGV4dAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9RVUVSWV9DT05UUklCVVRPUiA9IDk7ICAgICAgICAgIC8vIHJlcSdkIGZvciBtb2RlbCBiYXNlZCBleHQKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TT1VSQ0VfUFJPVklERVIgPSAxMDsgICAgICAgIC8vIHJlcSdkIGZvciBtb2RlbCBiYXNlZCBleHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU0VDVElPTl9ERVNDUklQVE9SX1BST1ZJREVSID0gMTE7ICAvLyByZXEnZCBmb3IgbW9kZWwgYmFzZWQgZXh0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhTRF9ERUxFVEVfQUNUSU9OID0gMTI7Ci0gIAotICBib29sZWFuIGlzRXh0ZW5zaW9uVHlwZVN1cHBvcnRlZChpbnQgdHlwZSk7Ci0gIGJvb2xlYW4gaXNBcHBsaWNhYmxlKE9iamVjdCBtb2RlbE9iamVjdCk7Ci0gIE9iamVjdCBjcmVhdGVFeHRlbnNpb25PYmplY3QoaW50IHR5cGUsIFdTRExFZGl0b3Igd3NkbEVkaXRvcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL1dTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL1dTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGUyNDM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLSAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5Ci17ICAgICAgICAgICAgICAgICAgIAotICAvL3Byb3RlY3RlZCBMaXN0IGNsYXNzTmFtZUNsYXNzTG9hZGVyUGFpckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIC8vcHJvdGVjdGVkIEhhc2hNYXAgdHJlZVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsgCi0gIHByb3RlY3RlZCBMaXN0IHJlZ2lzdGVyZWRFeHRlbnNpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIHB1YmxpYyBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKQotICB7Ci0gICAgYWRkKG5ldyBXU0RMRWRpdG9yLkJ1aWx0SW5XU0RMRWRpdG9yRXh0ZW5zaW9uKCkpOwotICB9ICAgICAgICAgICAgCi0KLSAgLy9wdWJsaWMgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXIgZ2V0RXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXIoU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgLy97Ci0gIC8vICByZXR1cm4gKEV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyKXRyZWVQcm92aWRlck1hcC5nZXQobmFtZXNwYWNlVVJJKTsKLSAgLy99Ci0KLSAgLy9wdWJsaWMgdm9pZCBwdXRFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcihTdHJpbmcgbmFtZXNwYWNlVVJJLCBFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlciB0cmVlUHJvdmlkZXIpCi0gIC8vewotICAvLyAgdHJlZVByb3ZpZGVyTWFwLnB1dChuYW1lc3BhY2VVUkksIHRyZWVQcm92aWRlcik7Ci0gIC8vfQotICAKLSAgcHVibGljIExpc3QgZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZWdpc3RlcmVkRXh0ZW5zaW9uTGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgV1NETEVkaXRvckV4dGVuc2lvbiBnZXRBcHBsaWNhYmxlRXh0ZW5zaW9uKGludCB0eXBlLCBPYmplY3Qgb2JqZWN0KQotICB7IAotICAgIFdTRExFZGl0b3JFeHRlbnNpb24gcmVzdWx0ID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRSZWdpc3RlcmVkRXh0ZW5zaW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgV1NETEVkaXRvckV4dGVuc2lvbiBleHRlbnNpb24gPSAoV1NETEVkaXRvckV4dGVuc2lvbilpLm5leHQoKTsKLSAgICAgIGlmIChleHRlbnNpb24uaXNFeHRlbnNpb25UeXBlU3VwcG9ydGVkKHR5cGUpICYmIGV4dGVuc2lvbi5pc0FwcGxpY2FibGUob2JqZWN0KSkKLSAgICAgIHsgCi0gICAgICAgIHJlc3VsdCA9IGV4dGVuc2lvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotCi0gIHB1YmxpYyBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoaW50IHR5cGUpCi0gIHsgCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChXU0RMRWRpdG9yRXh0ZW5zaW9uKWkubmV4dCgpOwotICAgICAgaWYgKGV4dGVuc2lvbi5pc0V4dGVuc2lvblR5cGVTdXBwb3J0ZWQodHlwZSkpCi0gICAgICB7IAotICAgICAgICBsaXN0LmFkZChleHRlbnNpb24pOwotICAgICAgfQotICAgIH0gCi0KLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gcmVzdWx0ID0gbmV3IFdTRExFZGl0b3JFeHRlbnNpb25bbGlzdC5zaXplKCldOwotICAgIGludCBjb3VudCA9IDA7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsgCi0gICAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChXU0RMRWRpdG9yRXh0ZW5zaW9uKWkubmV4dCgpOwotICAgICAgcmVzdWx0W2NvdW50XSA9IGV4dGVuc2lvbjsKLSAgICAgIGNvdW50Kys7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBhZGRBc0ZpcnN0KFdTRExFZGl0b3JFeHRlbnNpb24gZXh0ZW5zaW9uKQotICB7ICAgICAgICAgICAgICAgCi0gICAgZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoKS5hZGQoMCwgZXh0ZW5zaW9uKTsKLSAgfSAgICAKLQotICBwdWJsaWMgdm9pZCBhZGQoV1NETEVkaXRvckV4dGVuc2lvbiBleHRlbnNpb24pCi0gIHsgICAgICAgICAgICAgICAKLSAgICBnZXRSZWdpc3RlcmVkRXh0ZW5zaW9ucygpLmFkZChleHRlbnNpb24pOwotICB9ICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIGFkZChDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgU3RyaW5nIGNsYXNzTmFtZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyBUT0RPLi4uIGNvbnNpZGVyIGRlZmVyZWQgaW5zdGFudGlhdGlvbiBvZiBXU0RMRWRpdG9yRXh0ZW5zaW9ucyAgICAgICAgIAotICAgIHRyeQotICAgIHsgICAgICAgCi0gICAgICBDbGFzcyB0aGVDbGFzcyA9IGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKSA6IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgIFdTRExFZGl0b3JFeHRlbnNpb24gZXh0ZW5zaW9uID0gKFdTRExFZGl0b3JFeHRlbnNpb24pdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgIHJlZ2lzdGVyZWRFeHRlbnNpb25MaXN0LmFkZChleHRlbnNpb24pOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9FeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWJmMGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9FeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciAKLXsKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbnRleHQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKTsgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL0h0dHBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvSHR0cEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5MjU5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvSHR0cEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgSHR0cEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIgaW1wbGVtZW50cyBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyCi17ICAKLSAgcHVibGljIEh0dHBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyKCkKLSAgewotICB9ICAJCi0JCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRDb250ZXh0KEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICBTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUgPSBwYXJlbnRFbGVtZW50LmdldExvY2FsTmFtZSgpOwotCWlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImJpbmRpbmciKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJiaW5kaW5nIik7IAkgIAotCX0JICAKLQllbHNlIGlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoIm9wZXJhdGlvbiIpKQotCXsKLQkgIHJlc3VsdCA9IGxvY2FsTmFtZS5lcXVhbHMoIm9wZXJhdGlvbiIpOyAKLQl9Ci0JZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJpbnB1dCIpIHx8IAotCSAgICAgICAgIHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygib3V0cHV0IikpCi0JewotCSAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiYm9keSIpIHx8IAotCSAgICAgICAgICAgbG9jYWxOYW1lLmVxdWFscygiaGVhZGVyIik7IAkgIAotCX0JCi0JZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJmYXVsdCIpKQotCXsKLQkgIHJlc3VsdCA9IGxvY2FsTmFtZS5lcXVhbHMoImZhdWx0Iik7IAkgIAotCX0KLQllbHNlIGlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoInBvcnQiKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJhZGRyZXNzIik7IAkgIAotCX0JCi0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvTWltZUV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9NaW1lRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWE3MDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9NaW1lRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgTWltZUV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIgaW1wbGVtZW50cyBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyCi17ICAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX05BTUVTUEFDRV9VUkk9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iOwotICBwdWJsaWMgTWltZUV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIoKQotICB7Ci0gIH0gIAkKLQkKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbnRleHQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gIAlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICBTdHJpbmcgcGFyZW50RWxlbWVudE5hbWVzcGFjZSA9IHBhcmVudEVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgCWlmIChXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSS5lcXVhbHMocGFyZW50RWxlbWVudE5hbWVzcGFjZSkpCi0gIAl7Ci0gICAgCWlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImlucHV0IikgfHwgcGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJvdXRwdXQiKSkKLSAgICAJewotICAgIAkgIAlyZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJjb250ZW50IikgfHwKLQkJCQkgICAgIGxvY2FsTmFtZS5lcXVhbHMoIm11bHRpcGFydFJlbGF0ZWQiKSB8fAotCQkJCSAgICAgbG9jYWxOYW1lLmVxdWFscygibWltZVhtbCIpOyAgICAJICAJCi0gICAgCX0KLSAgCX0KLSAgCWVsc2UgaWYgKE1JTUVfTkFNRVNQQUNFX1VSSS5lcXVhbHMocGFyZW50RWxlbWVudE5hbWVzcGFjZSkpCi0gIAl7Ci0JCXJlc3VsdCA9IHRydWU7CQkJCQotICAJfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL1NvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvU29hcEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmZTk1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvU29hcEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIGltcGxlbWVudHMgRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlcgoteyAgIAotICBwdWJsaWMgU29hcEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIoKQotICB7Ci0gIH0gIAkKLQkKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbnRleHQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gIAlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQlpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJiaW5kaW5nIikpCi0JewotCSAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiYmluZGluZyIpOyAJICAKLQl9CSAgCi0JZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJvcGVyYXRpb24iKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJvcGVyYXRpb24iKTsgCi0JfQotCWVsc2UgaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygiaW5wdXQiKSB8fCAKLQkgICAgICAgICBwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoIm91dHB1dCIpKQotCXsKLQkgIHJlc3VsdCA9IGxvY2FsTmFtZS5lcXVhbHMoImJvZHkiKSB8fCAKLQkgICAgICAgICAgIGxvY2FsTmFtZS5lcXVhbHMoImhlYWRlciIpOyAJICAKLQl9CQotCWVsc2UgaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygiZmF1bHQiKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJmYXVsdCIpOyAJICAKLQl9Ci0JZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJwb3J0IikpCi0JewotCSAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiYWRkcmVzcyIpOyAJICAKLQl9CQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvWFNERXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL1hTREV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkM2FlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvWFNERXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNERXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciBpbXBsZW1lbnRzIEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIKLXsgICAKLSAgcHVibGljIFhTREV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIoKQotICB7Ci0gIH0gIAkKLQkKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZENvbnRleHQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gIAlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZSA9IHBhcmVudEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygidHlwZXMiKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJzY2hlbWEiKTsgCSAgCi0JfQkgIAkKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2VkaXRwYXJ0cy9JbnRlcmFjdG9ySGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cGFydHMvSW50ZXJhY3RvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzYwNmM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2VkaXRwYXJ0cy9JbnRlcmFjdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLklFeHBhbmRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuSW50ZXJhY3RvcjsKLQotICAgICAgICAgICAgICAgICAKLS8vIGhvb2tzIHVwIGFuIGludGVyYWN0b3Igd2l0aCBhbiBlZGl0IHBhcnQgYW5kIHRoZSBmaWd1cmUgdGhhdCBuZWVkcyB0byBiZSBleHBhbmRlZCBhbmQgY29sbGFwc2VkCi0vLwotcHVibGljIGNsYXNzIEludGVyYWN0b3JIZWxwZXIgaW1wbGVtZW50cyBNb3VzZUxpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbmVlZFRvUGVyZm9ybURlZmF1bHRFeHBhbnNpb24gPSB0cnVlOwotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZWRpdFBhcnQ7ICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBJbnRlcmFjdG9yIGludGVyYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIElFeHBhbmRhYmxlIGV4cGFuZGFibGU7Ci0KLSAgcHVibGljIEludGVyYWN0b3JIZWxwZXIoRWRpdFBhcnQgZWRpdFBhcnQsIEludGVyYWN0b3IgaW50ZXJhY3RvciwgSUV4cGFuZGFibGUgZXhwYW5kYWJsZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5lZGl0UGFydCA9IGVkaXRQYXJ0OwotICAgIHRoaXMuaW50ZXJhY3RvciA9IGludGVyYWN0b3I7Ci0gICAgdGhpcy5leHBhbmRhYmxlID0gZXhwYW5kYWJsZTsKLSAgICBpbnRlcmFjdG9yLmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7Ci0gICAgZXhwYW5kYWJsZS5zZXRFeHBhbmRlZChpbnRlcmFjdG9yLmlzRXhwYW5kZWQoKSk7Ci0gIH0gICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGlzRXhwYW5kZWQpCi0gIHsKLSAgICBpbnRlcmFjdG9yLnNldEV4cGFuZGVkKGlzRXhwYW5kZWQpOwotICAgIGludGVyYWN0b3JFeHBhbnNpb25DaGFuZ2VkKGlzRXhwYW5kZWQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBpbnRlcmFjdG9yRXhwYW5zaW9uQ2hhbmdlZChib29sZWFuIGlzSW50ZXJhY3RvckV4cGFuZGVkKQotICB7IAotICAgIGV4cGFuZGFibGUuc2V0RXhwYW5kZWQoaXNJbnRlcmFjdG9yRXhwYW5kZWQpOwotICAgIGV4cGFuZGFibGUuc2V0VmlzaWJsZShpc0ludGVyYWN0b3JFeHBhbmRlZCk7Ci0KLSAgICBlZGl0UGFydC5yZWZyZXNoKCk7Ci0KLSAgICBFZGl0UGFydCByb290ID0gZWRpdFBhcnQuZ2V0Um9vdCgpOwotICAgIGlmIChyb290IGluc3RhbmNlb2YgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgSUZpZ3VyZSByb290RmlndXJlID0gKChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KXJvb3QpLmdldEZpZ3VyZSgpOwotICAgICAgaW52YWxpZGF0ZUFsbChyb290RmlndXJlKTsKLSAgICAgIHJvb3RGaWd1cmUudmFsaWRhdGUoKTsKLSAgICAgIHJvb3RGaWd1cmUucmVwYWludCgpOwotICAgIH0gICAgICAKLSAgfQotCi0gICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgaW52YWxpZGF0ZUFsbChJRmlndXJlIGZpZ3VyZSkKLSAgewotICAgIGZpZ3VyZS5pbnZhbGlkYXRlKCk7ICAgCi0gICAgTGF5b3V0TWFuYWdlciBtYW5hZ2VyID0gZmlndXJlLmdldExheW91dE1hbmFnZXIoKTsKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIG1hbmFnZXIuaW52YWxpZGF0ZSgpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSlpLm5leHQoKTsKLSAgICAgIGludmFsaWRhdGVBbGwoY2hpbGQpOwotICAgIH0KLSAgfSAKLSAgICAgCi0KLSAgLy8gaW1wbGVtZW50cyBNb3VzZUxpc3RlbmVyCi0gIC8vCi0gIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2tlZChNb3VzZUV2ZW50IG1lKSAKLSAgeyAgICAgIAotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IG1lKQotICB7ICAgICAgCi0gICAgYm9vbGVhbiBuZXdFeHBhbnNpb25TdGF0ZSA9ICFpbnRlcmFjdG9yLmlzRXhwYW5kZWQoKTsKLSAgICBpbnRlcmFjdG9yLnNldEV4cGFuZGVkKG5ld0V4cGFuc2lvblN0YXRlKTsKLSAgICBpbnRlcmFjdG9yRXhwYW5zaW9uQ2hhbmdlZChuZXdFeHBhbnNpb25TdGF0ZSk7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IG1lKSAgCi0gIHsgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cGFydHMvTXVsdGlDb250ZW50UGFuZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cGFydHMvTXVsdGlDb250ZW50UGFuZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NmEyMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZWRpdHBhcnRzL011bHRpQ29udGVudFBhbmVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC4qOyAKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLio7ICAgCi0gICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpQ29udGVudFBhbmVFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIElGaWd1cmVbXSBjb250ZW50UGFuZXM7Ci0gIHByb3RlY3RlZCBpbnRbXSBjb250ZW50UGFuZUluZGV4QWRqdXN0bWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIElGaWd1cmVbXSBpbml0Q29udGVudFBhbmVzKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0gICAgCi0KLSAgcHJvdGVjdGVkIGludCBnZXRDb250ZW50UGFuZShPYmplY3QgbW9kZWwpCi0gIHsgIAotICAgIHJldHVybiAwOwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCBMaXN0IHNvcnRCeUNvbnRlbnRQYW5lKExpc3QgbGlzdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0gIAotCi0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0RmlndXJlKElGaWd1cmUgZmlndXJlKQotICB7Ci0JICBzdXBlci5zZXRGaWd1cmUoZmlndXJlKTsKLSAgICBjb250ZW50UGFuZXMgPSBpbml0Q29udGVudFBhbmVzKCk7ICAgCi0gICAgaWYgKGNvbnRlbnRQYW5lcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbnRlbnRQYW5lSW5kZXhBZGp1c3RtZW50ID0gbmV3IGludFtjb250ZW50UGFuZXMubGVuZ3RoXTsKLSAgICB9Ci0gIH0gICAgICAgIAotICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250ZW50UGFuZUluZm9JbmRleEFkanVzdG1lbnQoTGlzdCBsaXN0KQotICB7IAotICAgIGludCBpbmRleCA9IDA7ICAKLSAgICBpbnQgbGlzdFNpemUgPSBsaXN0LnNpemUoKTsKLQotICAgIGZvciAoaW50ICBqID0gMDsgaiA8IGNvbnRlbnRQYW5lcy5sZW5ndGg7IGorKykKLSAgICB7IAotICAgICAgY29udGVudFBhbmVJbmRleEFkanVzdG1lbnRbal0gPSBpbmRleDsKLSAgICAgIHdoaWxlIChpbmRleCA8IGxpc3RTaXplKQotICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgIE9iamVjdCBtb2RlbCA9IGxpc3QuZ2V0KGluZGV4KTsKLSAgICAgICAgaWYgKGdldENvbnRlbnRQYW5lKG1vZGVsKSAhPSBqKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbmRleCsrOwotICAgICAgfQotICAgIH0KLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbigpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoY29udGVudFBhbmVzICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBzb3J0ZWRMaXN0ID0gc29ydEJ5Q29udGVudFBhbmUoZ2V0TW9kZWxDaGlsZHJlbigpKTsKLSAgICAgIHVwZGF0ZUNvbnRlbnRQYW5lSW5mb0luZGV4QWRqdXN0bWVudChzb3J0ZWRMaXN0KTsKLSAgICB9Ci0gICAgc3VwZXIucmVmcmVzaENoaWxkcmVuKCk7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgaWYgKGNvbnRlbnRQYW5lcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBqID0gZ2V0Q29udGVudFBhbmUoY2hpbGRFZGl0UGFydC5nZXRNb2RlbCgpKTsKLSAgICAgIGlmIChjb250ZW50UGFuZUluZGV4QWRqdXN0bWVudC5sZW5ndGggPiBqKQotICAgICAgewotICAgICAgICBpbnQgYWRqdXN0ZWRJbmRleCA9IGluZGV4IC0gY29udGVudFBhbmVJbmRleEFkanVzdG1lbnRbal07Ci0gICAgICAgIGlmIChhZGp1c3RlZEluZGV4ID49IDApCi0gICAgICAgIHsKLSAgCSAgICAgIElGaWd1cmUgY2hpbGQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KWNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpOwotICAJICAgICAgY29udGVudFBhbmVzW2pdLmFkZChjaGlsZCwgYWRqdXN0ZWRJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICBlbHNlCi0gICAgewotICAgICAgc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgaW5kZXgpOwotICAgIH0KLSAgfQotCi0gIAotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChjb250ZW50UGFuZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaiA9IGdldENvbnRlbnRQYW5lKGNoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKChHcmFwaGljYWxFZGl0UGFydCljaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKTsKLSAgICAgIGNvbnRlbnRQYW5lc1tqXS5yZW1vdmUoY2hpbGQpOyAgCi0gICAgfSAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVvcmRlckNoaWxkKEVkaXRQYXJ0IGVkaXRwYXJ0LCBpbnQgaW5kZXgpCi0gIHsKLSAgICByZW1vdmVDaGlsZFZpc3VhbChlZGl0cGFydCk7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0gICAgY2hpbGRyZW4ucmVtb3ZlKGVkaXRwYXJ0KTsKLSAgICBjaGlsZHJlbi5hZGQoaW5kZXgsIGVkaXRwYXJ0KTsKLSAgICBhZGRDaGlsZFZpc3VhbChlZGl0cGFydCwgaW5kZXgpOwotICB9Ci19ICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cG9saWNpZXMvSURpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZWRpdHBvbGljaWVzL0lEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhODRlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cG9saWNpZXMvSURpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5lZGl0cG9saWNpZXM7Ci0gICAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZQoteyAgICAgICAKLSAgcHVibGljIHZvaWQgcGVyZm9ybUVkaXQoQ2VsbEVkaXRvciBjZWxsRWRpdG9yKTsgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2VkaXRwb2xpY2llcy9UZXh0Q2VsbEVkaXRvck1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2VkaXRwb2xpY2llcy9UZXh0Q2VsbEVkaXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjNjgwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cG9saWNpZXMvVGV4dENlbGxFZGl0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmVkaXRwb2xpY2llczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRleHRDZWxsRWRpdG9yTWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIGltcGxlbWVudHMgSURpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZQotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIFRleHRDZWxsRWRpdG9yTWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsCUxhYmVsIGxhYmVsKQotICB7Ci0JICBzdXBlcihzb3VyY2UsIFRleHRDZWxsRWRpdG9yLmNsYXNzLCBuZXcgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvcihsYWJlbCkpOwotICAgIHRoaXMubGFiZWwgPSBsYWJlbDsgICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAJU3RyaW5nIGluaXRpYWxMYWJlbFRleHQgPSBsYWJlbC5nZXRUZXh0KCk7Ci0gIAlnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0gIAlUZXh0IHRleHQgPSAoVGV4dClnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotICAJdGV4dC5zZXRGb250KGxhYmVsLmdldEZvbnQoKSk7Ci0gICAgdGV4dC5zZXRGb3JlZ3JvdW5kKGxhYmVsLmdldEZvcmVncm91bmRDb2xvcigpKTsKLSAgICB0ZXh0LnNldEJhY2tncm91bmQobGFiZWwuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotICAJdGV4dC5zZWxlY3RBbGwoKTsKLSAgfQkgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcGVyZm9ybU1vZGlmeShTdHJpbmcgdmFsdWUpOwotICAgIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVybmFsQ2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvcgotICB7Ci0gICAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotCi0gICAgcHVibGljIEludGVybmFsQ2VsbEVkaXRvckxvY2F0b3IoTGFiZWwgbGFiZWwpCi0gICAgewotICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgIH0gICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIAotICAgIHsKLSAgICAgIFRleHQgdGV4dCA9IChUZXh0KWNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOyAgCi0JICAgIFBvaW50IHNlbCA9IHRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JICAgIFBvaW50IHByZWYgPSB0ZXh0LmNvbXB1dGVTaXplKC0xLCAtMSk7Ci0JICAgIFJlY3RhbmdsZSByZWN0ID0gbGFiZWwuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLQkgICAgbGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQkgICAgdGV4dC5zZXRCb3VuZHMocmVjdC54LTQsIHJlY3QueS0xLCBwcmVmLngrMSwgcHJlZi55KzEpOwkKLQkgICAgdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JICAgIHRleHQuc2V0U2VsZWN0aW9uKHNlbCk7IAotICAgIH0KLSAgfSAgICAKLQotICAvLyBpbXBsZW1lbnRzIERpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZQotICAvLyAKLSAgcHVibGljIHZvaWQgcGVyZm9ybUVkaXQoQ2VsbEVkaXRvciBjZWxsRWRpdG9yKQotICB7Ci0gICAgcGVyZm9ybU1vZGlmeSgoU3RyaW5nKWNlbGxFZGl0b3IuZ2V0VmFsdWUoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0NlbnRlckxheW91dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9DZW50ZXJMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3YzNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0NlbnRlckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC4qOyAKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuKjsgCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLQotLyoqCi0gKiBGaWd1cmVzIHVzaW5nIHRoZSBTdGFja0xheW91dCBhcyB0aGVpciBsYXlvdXQgbWFuYWdlciBoYXZlCi0gKiB0aGVpciBjaGlsZHJlbiBwbGFjZWQgb24gdG9wIG9mIG9uZSBhbm90aGVyLiBPcmRlciBvZiAKLSAqIHBsYWNlbWVudCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY2hpbGRyZW4KLSAqIHdlcmUgYWRkZWQsIGZpcnN0IGNoaWxkIGFkZGVkIHBsYWNlZCBvbiB0aGUgYm90dG9tLgotICovCi1wdWJsaWMgY2xhc3MgQ2VudGVyTGF5b3V0CWV4dGVuZHMgQWJzdHJhY3RMYXlvdXQKLXsgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMSUdOTUVOVF9UT1AgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTElHTk1FTlRfQ0VOVEVSID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxJR05NRU5UX0JPVFRPTSA9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGludCBzcGFjaW5nOwotICBwcm90ZWN0ZWQgaW50IHZlcnRpY2FsQWxpZ25tZW50ID0gQUxJR05NRU5UX0NFTlRFUjsKLSAgCi0gIHB1YmxpYyBDZW50ZXJMYXlvdXQoKXt9Ci0gIHB1YmxpYyBDZW50ZXJMYXlvdXQoaW50IHNwYWNpbmcpeyB0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOyB9Ci0gIAotIAotICAvKioKLSAgICogQ2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIGlucHV0IGNvbnRhaW5lci4KLSAgICogVGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZCBvZiB0aGUgY29udGFpbmVyLCBhcyBhbGwKLSAgICogb3RoZXIgY2hpbGRyZW4gZml0IGludG8gdGhpcyBzaXplLgotICAgKgotICAgKiBAcGFyYW0gZmlndXJlICBDb250YWluZXIgZmlndXJlIGZvciB3aGljaCBwcmVmZXJyZWQgc2l6ZSBpcyByZXF1aXJlZC4KLSAgICogQHJldHVybiAgVGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBpbnB1dCBmaWd1cmUuCi0gICAqIEBzaW5jZSAyLjAKLSAgICovCi0vLyAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgZmlndXJlKQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewotICAJRGltZW5zaW9uIGQgPSBjYWxjdWxhdGVQcmVmZXJyZWRDbGllbnRBcmVhU2l6ZShmaWd1cmUpOwotLy8gIAlkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwKLS8vICAJICAgICAgICAgZmlndXJlLmdldEluc2V0cygpLmdldEhlaWdodCgpKTsKLSAgICBkLmV4cGFuZCh3aWR0aCwgaGVpZ2h0KTsKLSAgCWQudW5pb24oZ2V0Qm9yZGVyUHJlZmVycmVkU2l6ZShmaWd1cmUpKTsKLSAgCXJldHVybiBkOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZENsaWVudEFyZWFTaXplKElGaWd1cmUgZmlndXJlKQotICB7Ci0gIAlEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oKTsKLSAgCUxpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLSAgCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAJCUlGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSlpLm5leHQoKTsKLSAgICAgIERpbWVuc2lvbiBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0gICAgICBkLmhlaWdodCArPSBjaGlsZFNpemUuaGVpZ2h0OwotICAgICAgZC53aWR0aCA9IE1hdGgubWF4KGNoaWxkU2l6ZS53aWR0aCwgZC53aWR0aCk7Ci0gIAl9CSAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IGNoaWxkcmVuU2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsgICAgICAgCi0gICAgaWYgKGNoaWxkcmVuU2l6ZSA+IDApCi0gICAgewotICAgICAgZC5oZWlnaHQgKz0gc3BhY2luZyAqIGNoaWxkcmVuLnNpemUoKSAtIDE7Ci0gICAgfQotICAJcmV0dXJuIGQ7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFJldHVybnMgdGhlIG1pbmltdW0gc2l6ZSByZXF1aXJlZCBieSB0aGUgaW5wdXQgY29udGFpbmVyLgotICAgKiBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkIG9mIHRoZSBjb250YWluZXIsIGFzIGFsbAotICAgKiBvdGhlciBjaGlsZHJlbiBmaXQgaW50byB0aGlzIHNpemUuCi0gICAqLwotICAvLyBUT0RPIEdFRiBQT1JUCi0gIHB1YmxpYyBEaW1lbnNpb24gZ2V0TWluaW11bVNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewotICAJRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKCk7Ci0gIAlMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0gIAlJRmlndXJlIGNoaWxkOwotICAJZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAJCWNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotICAJCWQudW5pb24oY2hpbGQuZ2V0TWluaW11bVNpemUoKSk7Ci0gIAl9Ci0gIAlkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwgZmlndXJlLmdldEluc2V0cygpLmdldEhlaWdodCgpKTsKLSAgCXJldHVybiBkOwotICB9Ci0gIC8vIFRPRE8gR0VGIFBPUlQKLSAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKElGaWd1cmUgZmlndXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsKLSAgCXJldHVybiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKGZpZ3VyZSwgZmlndXJlLmdldEluc2V0cygpLmdldFdpZHRoKCksIGZpZ3VyZS5nZXRJbnNldHMoKS5nZXRIZWlnaHQoKSk7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBmaWd1cmUpCi0gIHsKLSAgCVJlY3RhbmdsZSByID0gZmlndXJlLmdldENsaWVudEFyZWEoKTsKLSAgCUxpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAKLSAgICBEaW1lbnNpb24gcHJlZmVycmVkQ2xpZW50QXJlYVNpemUgPSBjYWxjdWxhdGVQcmVmZXJyZWRDbGllbnRBcmVhU2l6ZShmaWd1cmUpOwotICAKLSAgICBpbnQgeCA9IHIueCArIChyLndpZHRoIC0gcHJlZmVycmVkQ2xpZW50QXJlYVNpemUud2lkdGgpIC8gMjsKLSAgICBpbnQgeSA9IDA7Ci0gIAotICAgIHN3aXRjaCAoZ2V0VmVydGljYWxBbGlnbm1lbnQoKSkKLSAgICB7Ci0gICAgICBjYXNlIEFMSUdOTUVOVF9UT1AgOiAgCi0gICAgICB7Ci0gICAgICAgIHkgPSByLnk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBBTElHTk1FTlRfQ0VOVEVSIDoKLSAgICAgIHsKLSAgICAgICAgeSA9IHIueSArIChyLmhlaWdodCAtIHByZWZlcnJlZENsaWVudEFyZWFTaXplLmhlaWdodCkgLyAyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQUxJR05NRU5UX0JPVFRPTSA6Ci0gICAgICB7Ci0gICAgICAgIHkgPSByLnkgKyAoci5oZWlnaHQgLSBwcmVmZXJyZWRDbGllbnRBcmVhU2l6ZS5oZWlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAJZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gIAkJSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWkubmV4dCgpOwotICAgICAgRGltZW5zaW9uIGNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLSAgCQljaGlsZC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZSh4LCB5LCBjaGlsZFNpemUud2lkdGgsIGNoaWxkU2l6ZS5oZWlnaHQpKTsKLSAgICAgIHkgKz0gY2hpbGRTaXplLmhlaWdodCArIHNwYWNpbmc7Ci0gIAl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gdmVydGljYWxBbGlnbm1lbnQgVGhlIHZlcnRpY2FsQWxpZ25tZW50IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZlcnRpY2FsQWxpZ25tZW50KGludCB2ZXJ0aWNhbEFsaWdubWVudCkKLSAgewotICAgIHRoaXMudmVydGljYWxBbGlnbm1lbnQgPSB2ZXJ0aWNhbEFsaWdubWVudDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGludCBnZXRWZXJ0aWNhbEFsaWdubWVudCgpCi0gIHsKLSAgICByZXR1cm4gdmVydGljYWxBbGlnbm1lbnQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0lHcmFwaE5vZGVGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSUdyYXBoTm9kZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTUyOWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSUdyYXBoTm9kZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLio7IAotaW1wb3J0IGphdmEudXRpbC4qOyAKLQotcHVibGljIGludGVyZmFjZSBJR3JhcGhOb2RlRmlndXJlIGV4dGVuZHMgSUZpZ3VyZQoteyAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQX0NPTk5FQ1RJT04gPSAxOyAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9XTl9DT05ORUNUSU9OID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9DT05ORUNUSU9OID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfQ09OTkVDVElPTiA9IDQ7Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0U2VsZWN0aW9uRmlndXJlKCk7Ci0gIHB1YmxpYyBJRmlndXJlIGdldENvbm5lY3Rpb25GaWd1cmUoKTsKLSAgcHVibGljIExpc3QgZ2V0Q29ubmVjdGVkRmlndXJlcyhpbnQgdHlwZSk7Ci0gIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblR5cGUoKTsgICAgICAKLSAgcHVibGljIHZvaWQgYWRkQ29ubmVjdGVkRmlndXJlKElHcmFwaE5vZGVGaWd1cmUgZmlndXJlKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlQ29ubmVjdGVkRmlndXJlKElHcmFwaE5vZGVGaWd1cmUgZmlndXJlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0ludGVyYWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSW50ZXJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWYxOTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSW50ZXJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLio7IAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS4qOyAKLQotLyoqCi0gKiBJbnRlcmFjdG9yIHRoZSArLy0gY29udHJvbCBjb21tb25seSBmb3VuZCBpbiB0cmVlcwotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJhY3RvciBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZQotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cGFuZGVkOwotCi0gIHB1YmxpYyBJbnRlcmFjdG9yKCkKLSAgewotICAgIHN1cGVyKCk7IAotICAgIHNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig5LCA5KSk7ICAgICAgICAgICAgICAgCi0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKGJvb2xlYW4gaXNFeHBhbmRlZCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5pc0V4cGFuZGVkID0gaXNFeHBhbmRlZDsKLSAgICByZXBhaW50KCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZGVkKCkKLSAgewotICAgIHJldHVybiBpc0V4cGFuZGVkOwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCB2b2lkIGZpbGxTaGFwZShHcmFwaGljcyBnKQotICB7Ci0gICAgc3VwZXIuZmlsbFNoYXBlKGcpOwotICAgIFJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnQgbXggPSByLnggKyByLndpZHRoIC8gMjsKLSAgICBpbnQgbXkgPSByLnkgKyByLmhlaWdodCAvIDI7ICAgIAotICAgIGludCBzID0gMjsgICAgICAgCi0gICAgZy5kcmF3TGluZShyLnggKyBzLCBteSwgci54ICsgci53aWR0aCAtIHMgLSAxLCBteSk7IAotICAgIGlmICghaXNFeHBhbmRlZCkKLSAgICB7Ci0gICAgICBnLmRyYXdMaW5lKG14LCByLnkgKyBzLCBteCwgci55ICsgci5oZWlnaHQgLSBzIC0xKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL1JvdW5kZWRMaW5lQm9yZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL1JvdW5kZWRMaW5lQm9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYmNiMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9Sb3VuZGVkTGluZUJvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLio7IAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS4qOyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLXB1YmxpYyBjbGFzcyBSb3VuZGVkTGluZUJvcmRlciBleHRlbmRzIExpbmVCb3JkZXIKLXsgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGludCBhcmNMZW5ndGg7ICAgCi0gIHByb3RlY3RlZCBpbnQgbGluZVN0eWxlID0gR3JhcGhpY3MuTElORV9TT0xJRDsKLQotICBwdWJsaWMgUm91bmRlZExpbmVCb3JkZXIoQ29sb3IgYywgaW50IHdpZHRoLCBpbnQgYXJjTGVuZ3RoKQotICB7Ci0JICBzdXBlcihjLCB3aWR0aCk7ICAgICAKLSAgICB0aGlzLmFyY0xlbmd0aCA9IGFyY0xlbmd0aDsKLSAgfQotCi0gIHB1YmxpYyBSb3VuZGVkTGluZUJvcmRlcihpbnQgd2lkdGgsIGludCBhcmNMZW5ndGgpCi0gIHsKLQkgIHN1cGVyKHdpZHRoKTsgICAgIAotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICB9Ci0gIAotICBwdWJsaWMgUm91bmRlZExpbmVCb3JkZXIoQ29sb3IgYywgaW50IHdpZHRoLCBpbnQgYXJjTGVuZ3RoLCBpbnQgbGluZVN0eWxlKQotICB7Ci0gICAgc3VwZXIoYywgd2lkdGgpOwotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICAgIHRoaXMubGluZVN0eWxlID0gbGluZVN0eWxlOwotICB9Ci0KLSAgcHVibGljIFJvdW5kZWRMaW5lQm9yZGVyKGludCB3aWR0aCwgaW50IGFyY0xlbmd0aCwgaW50IGxpbmVTdHlsZSkKLSAgewotICAgIHN1cGVyKHdpZHRoKTsKLSAgICB0aGlzLmFyY0xlbmd0aCA9IGFyY0xlbmd0aDsKLSAgICB0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhaW50KElGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBncmFwaGljcywgSW5zZXRzIGluc2V0cykKLSAgewotCSAgdGVtcFJlY3Quc2V0Qm91bmRzKGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKSk7Ci0gICAgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLSAgICBDb2xvciBjb2xvciA9IGdldENvbG9yKCk7Ci0gIAlpZiAod2lkdGglMiA9PSAxKQotICAgIHsKLQkJICB0ZW1wUmVjdC53aWR0aC0tOwotCQkgIHRlbXBSZWN0LmhlaWdodC0tOwotCSAgfQotCSAgdGVtcFJlY3Quc2hyaW5rKHdpZHRoLzIsd2lkdGgvMik7Ci0JICBncmFwaGljcy5zZXRMaW5lV2lkdGgod2lkdGgpOwotICAgIGdyYXBoaWNzLnNldExpbmVTdHlsZShsaW5lU3R5bGUpOwotCSAgaWYgKGNvbG9yICE9IG51bGwpCi0JCSAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQkgIGdyYXBoaWNzLmRyYXdSb3VuZFJlY3RhbmdsZSh0ZW1wUmVjdCwgYXJjTGVuZ3RoLCBhcmNMZW5ndGgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9GaWd1cmVDYW52YXNLZXlib2FyZEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0ZpZ3VyZUNhbnZhc0tleWJvYXJkSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODYxZGRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0ZpZ3VyZUNhbnZhc0tleWJvYXJkSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SYW5nZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi1wdWJsaWMgY2xhc3MgRmlndXJlQ2FudmFzS2V5Ym9hcmRIYW5kbGVyIGV4dGVuZHMgS2V5QWRhcHRlcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIX1NDUk9MTF9JTkNSRU1FTlQgPSA1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWX1NDUk9MTF9JTkNSRU1FTlQgPSAzMDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEZpZ3VyZUNhbnZhc0tleWJvYXJkSGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyBGaWd1cmVDYW52YXNLZXlib2FyZEhhbmRsZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkKLSAgewotICAgIFdpZGdldCB3ID0gZS53aWRnZXQ7Ci0gICAgaWYgKHcgaW5zdGFuY2VvZiBGaWd1cmVDYW52YXMpCi0gICAgewotICAgICAgcHJvY2Vzc0tleShlLmtleUNvZGUsIChGaWd1cmVDYW52YXMpdyk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NLZXkoaW50IGtleUNvZGUsIEZpZ3VyZUNhbnZhcyBmaWd1cmVDYW52YXMpCi0gIHsKLSAgICBzd2l0Y2ggKGtleUNvZGUpCi0gICAgewotICAgICAgY2FzZSBTV1QuQVJST1dfRE9XTiA6Ci0gICAgICAgIHNjcm9sbFZlcnRpY2FsKGZpZ3VyZUNhbnZhcywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU1dULkFSUk9XX1VQIDoKLSAgICAgICAgc2Nyb2xsVmVydGljYWwoZmlndXJlQ2FudmFzLCB0cnVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNXVC5BUlJPV19MRUZUIDoKLSAgICAgICAgc2Nyb2xsSG9yaXpvbnRhbChmaWd1cmVDYW52YXMsIHRydWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU1dULkFSUk9XX1JJR0hUIDoKLSAgICAgICAgc2Nyb2xsSG9yaXpvbnRhbChmaWd1cmVDYW52YXMsIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNXVC5QQUdFX1VQIDoKLSAgICAgICAgc2Nyb2xsUGFnZShmaWd1cmVDYW52YXMsIHRydWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU1dULlBBR0VfRE9XTiA6Ci0gICAgICAgIHNjcm9sbFBhZ2UoZmlndXJlQ2FudmFzLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgaW50IHZlcmlmeVNjcm9sbEJhck9mZnNldChSYW5nZU1vZGVsIG1vZGVsLCBpbnQgdmFsdWUpCi0gIHsKLSAgICB2YWx1ZSA9IE1hdGgubWF4KG1vZGVsLmdldE1pbmltdW0oKSwgdmFsdWUpOwotICAgIHJldHVybiBNYXRoLm1pbihtb2RlbC5nZXRNYXhpbXVtKCkgLSBtb2RlbC5nZXRFeHRlbnQoKSwgdmFsdWUpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNjcm9sbFZlcnRpY2FsKEZpZ3VyZUNhbnZhcyBmaWd1cmVDYW52YXMsIGJvb2xlYW4gdXApCi0gIHsKLSAgICBQb2ludCBsb2NhdGlvbiA9IGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgIGludCB2T2Zmc2V0ID0gdXAgPyAtVl9TQ1JPTExfSU5DUkVNRU5UIDogVl9TQ1JPTExfSU5DUkVNRU5UOwotICAgIGludCB4ID0gdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldEhvcml6b250YWxSYW5nZU1vZGVsKCksIGxvY2F0aW9uLngpOwotICAgIGludCB5ID0gdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZlcnRpY2FsUmFuZ2VNb2RlbCgpLCBsb2NhdGlvbi55ICsgdk9mZnNldCk7Ci0gICAgZmlndXJlQ2FudmFzLnNjcm9sbFNtb290aFRvKHgsIHkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNjcm9sbEhvcml6b250YWwoRmlndXJlQ2FudmFzIGZpZ3VyZUNhbnZhcywgYm9vbGVhbiBsZWZ0KQotICB7Ci0gICAgUG9pbnQgbG9jYXRpb24gPSBmaWd1cmVDYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRWaWV3TG9jYXRpb24oKTsKLSAgICBpbnQgaE9mZnNldCA9IGxlZnQgPyAtSF9TQ1JPTExfSU5DUkVNRU5UIDogSF9TQ1JPTExfSU5DUkVNRU5UOwotICAgIGludCB4ID0gdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldEhvcml6b250YWxSYW5nZU1vZGVsKCksIGxvY2F0aW9uLnggKyBoT2Zmc2V0KTsKLSAgICBpbnQgeSA9IHZlcmlmeVNjcm9sbEJhck9mZnNldChmaWd1cmVDYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRWZXJ0aWNhbFJhbmdlTW9kZWwoKSwgbG9jYXRpb24ueSk7Ci0gICAgZmlndXJlQ2FudmFzLnNjcm9sbFNtb290aFRvKHgsIHkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNjcm9sbFBhZ2UoRmlndXJlQ2FudmFzIGZpZ3VyZUNhbnZhcywgYm9vbGVhbiB1cCkKLSAgewotICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gZmlndXJlQ2FudmFzLmdldENsaWVudEFyZWEoKTsKLSAgICBpbnQgaW5jcmVtZW50ID0gdXAgPyAtY2xpZW50QXJlYS5oZWlnaHQgOiBjbGllbnRBcmVhLmhlaWdodDsKLSAgICBQb2ludCBsb2NhdGlvbiA9IGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgIGludCB4ID0gdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldEhvcml6b250YWxSYW5nZU1vZGVsKCksIGxvY2F0aW9uLngpOwotICAgIGludCB5ID0gdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZlcnRpY2FsUmFuZ2VNb2RlbCgpLCBsb2NhdGlvbi55ICsgaW5jcmVtZW50KTsKLSAgICBmaWd1cmVDYW52YXMuc2Nyb2xsU21vb3RoVG8oeCwgeSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoVmlld1Rvb2xCYXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoVmlld1Rvb2xCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlYzJlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9HcmFwaFZpZXdUb29sQmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotCi0gCi1wdWJsaWMgY2xhc3MgR3JhcGhWaWV3VG9vbEJhciBleHRlbmRzIFZpZXdGb3JtCi17Ci0gICAgVG9vbEJhciBncmFwaFRvb2xCYXI7ICAvLyB0aGUgdG9vbGJhciBhdCB0aGUgdG9wIG9mIHRoZSBncmFwaCB2aWV3Ci0gICAgLy9Ub29sSXRlbSB0b29sSXRlbTsgICAvLyB0aGUgdmlldyB0b29sIGl0ZW0KLSAgICBDb21wb3NpdGUgZnJhbWVCYXI7ICAvLyBUaGUgY29tcG9zaXRlIHRoYXQgY29udGFpbnMgdGhlIHRvb2xiYXIKLSAgICBXU0RMRWRpdG9yIGVkaXRvcjsgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIFRvb2xJdGVtIHNob3dCaW5kaW5nc0J1dHRvbjsgICAvLyB0aGUgdmlldyB0b29sIGl0ZW0gICAKLSAgICBUb29sSXRlbSBiYWNrQnV0dG9uOwotCi0gICAgcHVibGljIEdyYXBoVmlld1Rvb2xCYXIoV1NETEVkaXRvciB3c2RsRWRpdG9yLCBDb21wb3NpdGUgYywgaW50IHN0eWxlKQotICAgIHsKLSAgICAgIHN1cGVyKGMsIHN0eWxlKTsKLSAgICAgIHRoaXMuZWRpdG9yID0gd3NkbEVkaXRvcjsKLSAgICAgIGZyYW1lQmFyID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAvKgotICAgICAgQ0xhYmVsIGxhYmVsID0gbmV3IENMYWJlbChmcmFtZUJhciwgU1dULk5PTkUpOwotICAgICAgbGFiZWwuc2V0VGV4dCgiVmlldyA6Iik7Ci0gICAgICAqLwotICAgICAgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0IGZyYW1lTGF5b3V0ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dCgpOwotICAgICAgZnJhbWVMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgICBmcmFtZUxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0gICAgICBmcmFtZUxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICBmcmFtZUxheW91dC5tYXJnaW5IZWlnaHQgPSAwOyAgICAgCi0KLSAgICAgIGZyYW1lQmFyLnNldExheW91dChmcmFtZUxheW91dCk7Ci0gICAgICAKLSAgICAgIGdyYXBoVG9vbEJhciA9IG5ldyBUb29sQmFyKGZyYW1lQmFyLCBTV1QuRkxBVCk7Ci0gICAgICBncmFwaFRvb2xCYXIuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX01ORU1PTklDKQotICAgICAgICAgICBlLmRvaXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICAgICAgICAgIAotCi0gICAgICBiYWNrQnV0dG9uID0gbmV3IFRvb2xJdGVtKGdyYXBoVG9vbEJhciwgU1dULlBVU0gpOwotICAgICAgYmFja0J1dHRvbi5zZXRJbWFnZShXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2JhY2suZ2lmIikpOwotICAgICAgLy8gYmFja0J1dHRvbi5zZXRUb29sVGlwVGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9CQUNLX1RPIiwgIkRlZmluaXRpb24iKSk7Ci0gICAgICBiYWNrQnV0dG9uLnNldFRvb2xUaXBUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JBQ0siKSk7Ci0gICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgYmFja0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBlZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5nZXRDb21wb25lbnRWaWV3ZXIoKS5nZXRJbnB1dCgpOwotICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRpdG9yLmdldEdyYXBoVmlld2VyKCkuc2V0SW5wdXQoZWRpdG9yLmdldERlZmluaXRpb24oKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gY29tbW9uIHRoaXMgdXAgd2l0aCB4c2RlZGl0b3IncyBCYWNrQWN0aW9uIGNvZGUKLSAgICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iamVjdCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICBib29sZWFuIGZsYWcgPSB0cnVlOwotICAgICAgICAgICAgd2hpbGUgKGZsYWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIExpc3QgbGlzdCA9IHhzZFNjaGVtYS5nZXRSZWZlcmVuY2luZ0RpcmVjdGl2ZXMoKTsKLSAgICAgICAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZSB4c2RTY2hlbWFEaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKWxpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgIGlmICh4c2RTY2hlbWFEaXJlY3RpdmUuZ2V0U2NoZW1hKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4c2RTY2hlbWEgPSB4c2RTY2hlbWFEaXJlY3RpdmUuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmbGFnID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRJbnB1dCh4c2RTY2hlbWEpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRpdG9yLmdldEdyYXBoVmlld2VyKCkuc2V0SW5wdXQoZWRpdG9yLmdldERlZmluaXRpb24oKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsgCi0KLSAgICAgIC8vIGhhY2sgdG8gbWFrZSB0aGUgYnV0dG9uIGxvb2sgbGlrZSBhIHRvZ2dsZSBidXR0b24uICBTV1QuVE9HR0xFIGlzIG5vdCBhbiBhbGxvd2VkIHN0eWxlCi0gICAgICAvLyBmb3IgYSBUb29sSXRlbSwgYnV0IFNXVC5SQURJTyBpcy4gIFNXVC5SQURJTyBtYWtlcyBpdCBsb29rIGxpa2UgYSB0b2dnbGUuLi4uLi4uCi0gICAgICBzaG93QmluZGluZ3NCdXR0b24gPSBuZXcgVG9vbEl0ZW0oZ3JhcGhUb29sQmFyLCBTV1QuUkFESU8pOwotICAgICAgc2hvd0JpbmRpbmdzQnV0dG9uLnNldEltYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvaGlkZWJpbmRpbmcuZ2lmIikpOwotICAgICAgc2hvd0JpbmRpbmdzQnV0dG9uLnNldFRvb2xUaXBUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0hJREVfQklORElOR1MiKSk7IAotICAgICAgc2hvd0JpbmRpbmdzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgewotICAgICAgCXByaXZhdGUgYm9vbGVhbiBjdXJyZW50bHlTZWxlY3RlZCA9IGZhbHNlOwotICAgICAgCQotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgVmlld01vZGUgdm0gPSBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRWaWV3TW9kZSgoRGVmaW5pdGlvbillZGl0b3IuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgICB2bS5zZXRCaW5kaW5nVmlzaWJsZSghdm0uaXNCaW5kaW5nVmlzaWJsZSgpKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBoYWNrIHRvIG1ha2UgdGhlIGJ1dHRvbiBsb29rIGxpa2UgYSB0b2dnbGUgYnV0dG9uCi0gICAgICAgICAgVG9vbEl0ZW0gaXRlbSA9IChUb29sSXRlbSkgZS53aWRnZXQ7Ci0gICAgICAgICAgaWYgKGN1cnJlbnRseVNlbGVjdGVkKSB7Ci0gICAgICAgICAgCWl0ZW0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAJY3VycmVudGx5U2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgCWN1cnJlbnRseVNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOyAKLQotICAgICAgc2V0VG9wTGVmdChmcmFtZUJhcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEJhY2tCdXR0b25FbmFibGVkKGJvb2xlYW4gc3RhdGUpCi0gICAgewotICAgICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKHN0YXRlKTsKLSAgICB9Ci0KLSAgICAKLS8vICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUhvdmVySGVscChPYmplY3Qgb2JqZWN0KQotLy8gICAgewotLy8gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotLy8gICAgICB7Ci0vLyAgICAgICAgYmFja0J1dHRvbi5zZXRUb29sVGlwVGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9CQUNLX1RPIiwgIkRlZmluaXRpb24iKSk7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0vLyAgICAgIHsKLS8vICAgICAgICBiYWNrQnV0dG9uLnNldFRvb2xUaXBUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JBQ0tfVE8iLCAiWE1MIFNjaGVtYSIpKTsKLS8vICAgICAgfQotLy8gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoaWNzQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9HcmFwaGljc0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTcwZWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoaWNzQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQSBjb2xsZWN0aW9uIG9mIGNvbG9yIGFuZCBmb250IHJlbGF0ZWQgY29uc3RhbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoaWNzQ29uc3RhbnRzIAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIGdyb3VwQm9yZGVyQ29sb3IgICAgICAgID0gbmV3IENvbG9yKG51bGwsIDExOCwgMTM0LCAxNjQpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIGdyb3VwSGVhZGVyQ29sb3IgICAgICAgID0gbmV3IENvbG9yKG51bGwsIDIzMiwgMjQwLCAyNDgpOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgZWxlbWVudEJvcmRlckNvbG9yICAgICAgPSBuZXcgQ29sb3IobnVsbCwgMTIwLCAxNTIsIDE4NCk7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgZWxlbWVudEJhY2tncm91bmRDb2xvciAgPSBuZXcgQ29sb3IobnVsbCwgMjMyLCAyNDAsIDI0OCk7ICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBlbGVtZW50TGFiZWxDb2xvciAgICAgICA9IG5ldyBDb2xvcihudWxsLCAgODAsIDEwMiwgMTQ0KTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciByZWFkT25seUJvcmRlckNvbG9yICAgICA9IG5ldyBDb2xvcihudWxsLCAxNjQsIDE2NCwgMTY0KTsgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgcmVkICAgICAgICAgICAgICAgICAgICAgPSBuZXcgQ29sb3IobnVsbCwgMjU1LCAgIDAsICAgMCk7IAotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgcmVhZE9ubHlCYWNrZ3JvdW5kQ29sb3IgPSBDb2xvckNvbnN0YW50cy53aGl0ZTsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIEZvbnQgIHNtYWxsQm9sZEZvbnQgICAgICAgICAgID0gbmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksICJUYWhvbWEiLCA4LCBTV1QuQk9MRCk7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgRm9udCAgbWVkaXVtRm9udCAgICAgICAgICAgICAgPSBuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgIlRhaG9tYSIsIDEwLCBTV1QuTk9ORSk7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgRm9udCAgbWVkaXVtQm9sZEZvbnQgICAgICAgICAgPSBuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgIlRhaG9tYSIsIDEwLCBTV1QuQk9MRCk7IAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL1ZpZXdNb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9WaWV3TW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc1ZGFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL1ZpZXdNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBWaWV3TW9kZSAKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklORElORyAgICAgPSAgIDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0UgICAgID0gICAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUX1RZUEUgICA9ICAgMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRSAgICAgPSAgIDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVTICAgICAgID0gICA1OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfREVTQ1JJUFRJT04gICAgID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQklORElORyIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0RFU0NSSVBUSU9OICAgICA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX01FU1NBR0UiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9UWVBFX0RFU0NSSVBUSU9OICAgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9QT1JUVFlQRSIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0RFU0NSSVBUSU9OICAgICA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1NFUlZJQ0UiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRVNfREVTQ1JJUFRJT04gICAgICAgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9UWVBFUyIpOwotCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCaW5kaW5nVmlzaWJsZSA9IHRydWU7Ci0gIHByb3RlY3RlZCBpbnQgbW9kZSA9IFNFUlZJQ0U7Ci0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICBwdWJsaWMgVmlld01vZGUoKQotICB7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nVmlzaWJsZShib29sZWFuIGlzVmlzaWJsZSkKLSAgewotICAgIGlmIChpc0JpbmRpbmdWaXNpYmxlICE9IGlzVmlzaWJsZSkKLSAgICB7Ci0gICAgICBpc0JpbmRpbmdWaXNpYmxlID0gaXNWaXNpYmxlOwotICAgICAgZmlyZUNoYW5nZU5vdGlmaWNhdGlvbigpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQmluZGluZ1Zpc2libGUoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGlzQmluZGluZ1Zpc2libGU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBnZXRNb2RlRm9yRGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7ICAgICAgICAgICAgICAgCi0gICAgaW50IHJlc3VsdCA9IFNFUlZJQ0U7Ci0gICAgaWYgKGRlc2NyaXB0aW9uLmVxdWFscyhCSU5ESU5HX0RFU0NSSVBUSU9OKSkKLSAgICB7ICAgICAgICAgICAgICAgCi0gICAgICByZXN1bHQgPSBCSU5ESU5HOyAKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVzY3JpcHRpb24uZXF1YWxzKE1FU1NBR0VfREVTQ1JJUFRJT04pKQotICAgIHsgICAgICAgIAotICAgICAgcmVzdWx0ID0gTUVTU0FHRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVzY3JpcHRpb24uZXF1YWxzKFBPUlRfVFlQRV9ERVNDUklQVElPTikpCi0gICAgeyAKLSAgICAgIHJlc3VsdCA9IFBPUlRfVFlQRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVzY3JpcHRpb24uZXF1YWxzKFNFUlZJQ0VfREVTQ1JJUFRJT04pKQotICAgIHsgICAgCi0gICAgICByZXN1bHQgPSBTRVJWSUNFOwotICAgIH0KLSAgICBlbHNlIGlmIChkZXNjcmlwdGlvbi5lcXVhbHMoVFlQRVNfREVTQ1JJUFRJT04pKQotICAgIHsgIAotICAgICAgcmVzdWx0ID0gVFlQRVM7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25Gb3JNb2RlKGludCBtb2RlKQotICB7ICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IFNFUlZJQ0VfREVTQ1JJUFRJT047Ci0gICAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICAgIGNhc2UgQklORElORyA6Ci0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBCSU5ESU5HX0RFU0NSSVBUSU9OOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTUVTU0FHRSA6IAotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gTUVTU0FHRV9ERVNDUklQVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFBPUlRfVFlQRSA6IAotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gUE9SVF9UWVBFX0RFU0NSSVBUSU9OOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgU0VSVklDRSA6IAotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gU0VSVklDRV9ERVNDUklQVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFRZUEVTIDogIAotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gVFlQRVNfREVTQ1JJUFRJT047Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGludGVyZmFjZSBMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgdmlld01vZGVDaGFuZ2VkKFZpZXdNb2RlIG1vZGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TW9kZShpbnQgbW9kZSkKLSAgewotICAgIHRoaXMubW9kZSA9IG1vZGU7Ci0gICAgZmlyZUNoYW5nZU5vdGlmaWNhdGlvbigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TW9kZShTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICB0aGlzLm1vZGUgPSBnZXRNb2RlRm9yRGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgIGZpcmVDaGFuZ2VOb3RpZmljYXRpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TW9kZSgpCi0gIHsKLSAgICByZXR1cm4gbW9kZTsKLSAgfSAKLQotICBwdWJsaWMgU3RyaW5nIGdldE1vZGVEZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVzY3JpcHRpb25Gb3JNb2RlKG1vZGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBpZiAoIWxpc3RlbmVyTGlzdC5jb250YWlucyhsaXN0ZW5lcikpCi0gICAgeyAKLSAgICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICAgIH0gIAotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgZmlyZUNoYW5nZU5vdGlmaWNhdGlvbigpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBMaXN0ZW5lciBsaXN0ZW5lciA9IChMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLnZpZXdNb2RlQ2hhbmdlZCh0aGlzKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9XU0RMQ29tcG9uZW50Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9XU0RMQ29tcG9uZW50Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjZkMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvV1NETENvbXBvbmVudFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLlNlbGVjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuRXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNlbnRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuQ29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuTXlDb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExHcm91cE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLklDb25uZWN0aW9uUmVuZGVyaW5nVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgV1NETENvbXBvbmVudFZpZXdlciBleHRlbmRzIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBpbXBsZW1lbnRzIElDb25uZWN0aW9uUmVuZGVyaW5nVmlld2VyCi17Ci0gIHByb3RlY3RlZCBFZGl0RG9tYWluIGVkaXREb21haW47Ci0gIHByb3RlY3RlZCBXU0RMRWRpdG9yIGVkaXRvcjsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBtZW51U2VsZWN0aW9uUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQgY29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0OwotICBwcm90ZWN0ZWQgQ29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZSBjb25uZWN0aW9uUmVuZGVyaW5nRmlndXJlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZDsKLQotICBwdWJsaWMgV1NETENvbXBvbmVudFZpZXdlcihXU0RMRWRpdG9yIGVkaXRvciwgSVNlbGVjdGlvblByb3ZpZGVyIG1lbnVTZWxlY3Rpb25Qcm92aWRlcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0gICAgdGhpcy5tZW51U2VsZWN0aW9uUHJvdmlkZXIgPSBtZW51U2VsZWN0aW9uUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZUV4cGFuc2lvbkVuYWJsZWQoYm9vbGVhbiBpc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZCkKLSAgewotICAgIHRoaXMuaXNQcmVzZXJ2ZUV4cGFuc2lvbkVuYWJsZWQgPSBpc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUHJlc2VydmVFeHBhbnNpb25FbmFibGVkKCkKLSAgewotICAgIHJldHVybiBpc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZDsKLSAgfQotCi0gIHB1YmxpYyBDb25uZWN0aW9uUmVuZGVyaW5nRmlndXJlIGdldENvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIHJldHVybiBjb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBjb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuc2V0SW5wdXQob2JqZWN0KTsKLSAgICAKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBlZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRCYWNrQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRCYWNrQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gdG9kby4uIHJldmlzaXQgdGhpcyB0byB1bmRlcnN0YW5kIHdoeSB3ZSBkb24ndCBnZXQgYSBzZXQgaW5wdXQKLSAgICAvLyB3aGVuIGRyaWxsaW5nIGRvd24gaW50byBhIHNjaGVtYSBlbGVtZW50IG9yIHR5cGUKLSAgICAvLwotICAgIGludCBsYXlvdXRBbGlnbm1lbnQgPSAob2JqZWN0IGluc3RhbmNlb2YgRGVmaW5pdGlvbikgPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VudGVyTGF5b3V0LkFMSUdOTUVOVF9UT1AgOgotICAgICAgICAgICAgICAgICAgICAgICAgICBDZW50ZXJMYXlvdXQuQUxJR05NRU5UX0NFTlRFUjsKLSAgICAKLSAgICBTY2FsYWJsZVJvb3RFZGl0UGFydCBncmFwaGljYWxSb290RWRpdFBhcnQgPSAoU2NhbGFibGVSb290RWRpdFBhcnQpZ2V0Um9vdEVkaXRQYXJ0KCk7Ci0gICAgQ2VudGVyTGF5b3V0IGNlbnRlckxheW91dCA9IChDZW50ZXJMYXlvdXQpZ3JhcGhpY2FsUm9vdEVkaXRQYXJ0LmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpLmdldExheW91dE1hbmFnZXIoKTsKLSAgICBjZW50ZXJMYXlvdXQuc2V0VmVydGljYWxBbGlnbm1lbnQobGF5b3V0QWxpZ25tZW50KTsKLSAgfQotCi0gIC8vcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKE9iamVjdCBvYmplY3QpCi0gIC8veyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8vfQotCi0gIHByb3RlY3RlZCB2b2lkIGhvb2tDb250cm9sKCkKLSAgewotICAgIHN1cGVyLmhvb2tDb250cm9sKCk7Ci0KLSAgICBnZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0KLSAgICBlZGl0RG9tYWluID0gbmV3IERlZmF1bHRFZGl0RG9tYWluKG51bGwpOwotICAgICgoRGVmYXVsdEVkaXREb21haW4pZWRpdERvbWFpbikuc2V0RGVmYXVsdFRvb2wobmV3IFNlbGVjdGlvblRvb2woKSk7Ci0gICAgZWRpdERvbWFpbi5sb2FkRGVmYXVsdFRvb2woKTsKLSAgICBlZGl0RG9tYWluLmFkZFZpZXdlcih0aGlzKTsKLQotICAgIGNvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCA9IG5ldyBDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQoKTsKLQotICAgIEtleUFkYXB0ZXIga2V5TGlzdGVuZXIgPSBuZXcgS2V5QWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkKLSAgICAgIHsgICAJCi0gICAgICAgIGlmIChlLmtleUNvZGUgPT0gU1dULkYzKQotICAgICAgICB7Ci0gICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgICAgICAgICB7Ci0JCQkgIE9wZW5PblNlbGVjdGlvbkhlbHBlciBoZWxwZXIgPSBuZXcgT3Blbk9uU2VsZWN0aW9uSGVscGVyKGVkaXRvci5nZXREZWZpbml0aW9uKCkpOwotICAgICAgICAgICAgICBoZWxwZXIub3BlbkVkaXRvcigoRU9iamVjdClvYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBnZXRDb250cm9sKCkuYWRkS2V5TGlzdGVuZXIoa2V5TGlzdGVuZXIpOwotCi0gICAgc2V0Q29udGVudHMoY29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0KTsKLSAgICAvL2dldEZpZ3VyZUNhbnZhcygpLmFkZEtleUxpc3RlbmVyKG5ldyBGaWd1cmVDYW52YXNLZXlib2FyZEhhbmRsZXIoZWRpdG9yKSk7Ci0gICAgZ2V0Um9vdEVkaXRQYXJ0KCkuYWN0aXZhdGUoKTsKLQotICAgIGNvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydC5zZXRJbnB1dChlZGl0b3IuZ2V0RGVmaW5pdGlvbigpKTsKLQotICAgIFNjYWxhYmxlUm9vdEVkaXRQYXJ0IGdyYXBoaWNhbFJvb3RFZGl0UGFydCA9IChTY2FsYWJsZVJvb3RFZGl0UGFydClnZXRSb290RWRpdFBhcnQoKTsKLQotICAgIC8vIHNldCB0aGUgbGF5b3V0IGZvciB0aGUgcHJpbWFyeSBsYXllciBzbyB0aGF0IHRoZSBjaGlsZHJlbiBhcmUgYWx3YXlzIGNlbnRlcmVkCi0gICAgLy8KLSAgICBDZW50ZXJMYXlvdXQgY2VudGVyTGF5b3V0ID0gbmV3IENlbnRlckxheW91dCgpOwotICAgIGNlbnRlckxheW91dC5zZXRWZXJ0aWNhbEFsaWdubWVudChDZW50ZXJMYXlvdXQuQUxJR05NRU5UX1RPUCk7Ci0gICAgZ3JhcGhpY2FsUm9vdEVkaXRQYXJ0LmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpLnNldExheW91dE1hbmFnZXIoY2VudGVyTGF5b3V0KTsgLy9uZXcgQ29udGFpbmVyTGF5b3V0KCkpOy8vCi0KLSAgICBzZXRDb250ZXh0TWVudShuZXcgSW50ZXJuYWxDb250ZXh0TWVudVByb3ZpZGVyKHRoaXMsIGVkaXRvcikpOwotCi0gICAgLy8gYWRkIHRoZSBDb25uZWN0aW9uRmlndXJlIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBkcmF3aW5nIGFsbCBvZiB0aGUgbGluZXMgaW4gdGhlIHZpZXcKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgSUZpZ3VyZSBmaWd1cmUgPSBncmFwaGljYWxSb290RWRpdFBhcnQuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUik7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCi0gICAgZmluYWwgTXlDb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyIGNvbm5lY3Rpb25SZW5kZXJpbmdIZWxwZXIgPSBuZXcgTXlDb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyKHRoaXMpOwotCi0gICAgY29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZSA9IG5ldyBDb25uZWN0aW9uUmVuZGVyaW5nRmlndXJlKGdyYXBoaWNhbFJvb3RFZGl0UGFydC5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKSkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLmZpbGxTaGFwZShncmFwaGljcyk7Ci0gICAgICAgIGNvbm5lY3Rpb25SZW5kZXJpbmdIZWxwZXIuZmlsbFNoYXBlSGVscGVyKGdyYXBoaWNzKTsKLSAgICAgIH0KLSAgICB9OwotICAgIGZpZ3VyZS5hZGQoY29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZSk7Ci0gICAgZmlndXJlLnZhbGlkYXRlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWRpdG9yIGdldFdTRExFZGl0b3IoKSB7Ci0gIAlyZXR1cm4gZWRpdG9yOwotICB9Ci0KLSAgcHVibGljIGNsYXNzIEludGVybmFsQ29udGV4dE1lbnVQcm92aWRlciBleHRlbmRzIENvbnRleHRNZW51UHJvdmlkZXIKLSAgewotICAgIHByb3RlY3RlZCBFZGl0UGFydFZpZXdlciB2aWV3ZXI7Ci0gICAgcHJvdGVjdGVkIEV4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3IgZXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvcjsKLQotICAgIHB1YmxpYyBJbnRlcm5hbENvbnRleHRNZW51UHJvdmlkZXIoRWRpdFBhcnRWaWV3ZXIgdmlld2VyLCBXU0RMRWRpdG9yIGVkaXRvcikKLSAgICB7Ci0gICAgICBzdXBlcih2aWV3ZXIpOwotICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICBleHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yID0gbmV3IEV4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3IoZWRpdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBidWlsZENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KQotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IGdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0gICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydClsaXN0LmdldCgwKTsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0KLSAgICAgICAgLy9pZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQcm9wZXJ0eUVkaXRQYXJ0KQotICAgICAgICAvL3sKLSAgICAgICAgLy8gIG9iamVjdCA9ICgoUHJvcGVydHlFZGl0UGFydCllZGl0UGFydCkuZ2V0T3duZXJNb2RlbCgpOwotICAgICAgICAvL30gICAgICAgICAgICAgICAKLQotICAgICAgICBpZiAob2JqZWN0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG5vZGUgPSBudWxsOwotICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vZGUgPSAoTm9kZSlvYmplY3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vZGUgPSAoKFdTRExFbGVtZW50KW9iamVjdCkuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgICAgICAgewotICAgICAgICAgICAgbm9kZSA9ICgoV1NETEdyb3VwT2JqZWN0KW9iamVjdCkuZ2V0RGVmaW5pdGlvbigpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvci5jb250cmlidXRlTWVudUFjdGlvbnMobWVudSwgbm9kZSwgb2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvV1NETEdyYXBoVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9XU0RMR3JhcGhWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzZjU0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9XU0RMR3JhcGhWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkNvcHlHbG9iYWxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5EZWxldGVXU0RMQW5kWFNEQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuUGFzdGVHbG9iYWxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkNvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuR3JvdXBFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuVHJlZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgV1NETEdyYXBoVmlld2VyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQ29udHJvbCBjb21wb25lbnRWaWV3ZXJDb250cm9sOyAKLSAgcHJvdGVjdGVkIFdTRExDb21wb25lbnRWaWV3ZXIgY29tcG9uZW50Vmlld2VyOwotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOyAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBXU0RMRWRpdG9yIGVkaXRvcjsgIAotICBwcm90ZWN0ZWQgSW50ZXJuYWxTZWxlY3Rpb25BZGFwdGVyIGludGVybmFsU2VsZWN0aW9uQWRhcHRlciA9IG5ldyBJbnRlcm5hbFNlbGVjdGlvbkFkYXB0ZXIoKTsKLQotICBHcmFwaFZpZXdUb29sQmFyIGZvcm07ICAvLyBUb29sIGJhciB2aWV3IGZvcm0KLSAgCi0gIHB1YmxpYyBXU0RMR3JhcGhWaWV3ZXIoV1NETEVkaXRvciBlZGl0b3IpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOyAgICAgICAgICAgICAgICAgCi0gIH0gICAgCi0KLSAgcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOyAgICAgICAgICAgICAgCi0gIH0KLQotICBwdWJsaWMgSVNlbGVjdGlvblByb3ZpZGVyIGdldFNlbGVjdGlvblByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBpbnRlcm5hbFNlbGVjdGlvbkFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb25lbnRWaWV3ZXIgPSBuZXcgV1NETENvbXBvbmVudFZpZXdlcihlZGl0b3IsIG51bGwpOwotCi0gICAgY29tcG9uZW50Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihpbnRlcm5hbFNlbGVjdGlvbkFkYXB0ZXIpOwotICAgIGludGVybmFsU2VsZWN0aW9uQWRhcHRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0KLSAgICBmb3JtID0gbmV3IEdyYXBoVmlld1Rvb2xCYXIoZWRpdG9yLCBwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgIGNvbXBvbmVudFZpZXdlckNvbnRyb2wgPSBjb21wb25lbnRWaWV3ZXIuY3JlYXRlQ29udHJvbChmb3JtKTsKLSAgICBmb3JtLnNldENvbnRlbnQoY29tcG9uZW50Vmlld2VyQ29udHJvbCk7Ci0KLSAgICBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBjb21wb25lbnRWaWV3ZXJDb250cm9sLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotICAgIAlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLSAgICAJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuREVMKSB7Ci0gICAgCQkJTGlzdCBzZWxlY3Rpb25zID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3Rpb24oKSkudG9MaXN0KCk7Ci0gICAgICAgCQkJRGVsZXRlV1NETEFuZFhTREFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgRGVsZXRlV1NETEFuZFhTREFjdGlvbihzZWxlY3Rpb25zLCBlZGl0b3IuZ2V0RGVmaW5pdGlvbigpLmdldEVsZW1lbnQoKSwgZWRpdG9yKTsKLSAgICAgICAJCQlkZWxldGVBY3Rpb24ucnVuKCk7Ci0gICAgCQl9Ci0gICAgCX0gICAgCQotICAgIH0pOwotICAgIAotICAgIHJldHVybiBjb21wb25lbnRWaWV3ZXJDb250cm9sOyAKLSAgfQotCi0gIHB1YmxpYyBXU0RMQ29tcG9uZW50Vmlld2VyIGdldENvbXBvbmVudFZpZXdlcigpCi0gIHsKLSAgICByZXR1cm4gY29tcG9uZW50Vmlld2VyOwotICB9Ci0KLQotICBOb2RlIGlucHV0Tm9kZTsgICAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBjb21wb25lbnRWaWV3ZXIuc2V0SW5wdXQob2JqZWN0KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QmFja0J1dHRvbkVuYWJsZWQoYm9vbGVhbiBzdGF0ZSkKLSAgewotICAgIGZvcm0uc2V0QmFja0J1dHRvbkVuYWJsZWQoc3RhdGUpOwotICB9Ci0KLSAgLy9wcm90ZWN0ZWQgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG9iamVjdCkKLSAgLy99ICAgICAgICAgICAgCi0KLSAgICAKLSAgLy8gdGhpcyBpcyBjYWxsZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcyBpbiB0aGUgc2VsZWN0aW9uIG1hbmFnZXIKLSAgLy8KLQotCi0gIAotICBwcm90ZWN0ZWQgT2JqZWN0IGdldElucHV0Q29tcG9uZW50Rm9yTm9kZShOb2RlIG5vZGUpICAgCi0gIHsKLSAgICAvLyBUT0RPLi4uIGxvZ2ljIHRvIGdldCBXU0RMRWxlbWVudCBvciBvdGhlciBvYmplY3QgKGUuZy4gWFNEIG9yIGV4dGVuc2lvbiBmb3IgdGhlIE5vZGUpCi0gICAgLy8gVE9ETy4uLiBjb25zaWRlciBjYXNlIHdoZXJlIHRoZSBtb2RlbCBpcyBzaW1wbHkgYSBjaHVuayBvZiBET00KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAgCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uQ29tcG9uZW50Rm9yTm9kZShOb2RlIG5vZGUpICAgCi0gIHsKLSAgICAvLyBUT0RPLi4uIGxvZ2ljIHRvIGdldCBXU0RMRWxlbWVudCBvciBvdGhlciBvYmplY3QgKGUuZy4gWFNEIG9yIGV4dGVuc2lvbiBmb3IgdGhlIE5vZGUpCi0gICAgLy8gVE9ETy4uLiBjb25zaWRlciBjYXNlIHdoZXJlIHRoZSBtb2RlbCBpcyBzaW1wbHkgYSBjaHVuayBvZiBET00KLSAgICByZXR1cm4gbnVsbDsKLSAgfSAKLQotICBwcm90ZWN0ZWQgY2xhc3MgSW50ZXJuYWxTZWxlY3Rpb25BZGFwdGVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChPYmplY3Qgb2JqZWN0KQotICAgIHsgICAgICAgICAgICAKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KQotICAgICAgeyAgICAgICAKLSAgICAgICAgLy8gZml4IGZvciBkZWZlY3QgNDI5NCAuLi4gdGhpcyB0ZXN0IHByZXZlbnRzIHNlbGVjdGlvbiBmcm9tIGNoYW5naW5nCi0gICAgICAgIC8vIHdoZW4gYSBjb21wb25lbnQgaXMgcmVuYW1lZCB3aGljaCBpbmRpcmVjdGx5IGNhdXNlcyBpdCB0byBiZSByZW1vdmVkIGFuZAotICAgICAgICAvLyByZS1hZGRlZCBmcm9tIHRoZSAnc29ydGVkJyBsaXN0Ci0gICAgICAgIC8vCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KW9iamVjdDsKLSAgICAgICAgICByZXN1bHQgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgCi0KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsgCi0gICAgfSAgCi0gIH0KLSAgICAKLSAgLy8gdGhpcyBnZXRzIGNhbGxlZCB3aGVuIHRoZSBzZWxlY3Rpb24gY2hhbmdlcyB3aXRoaW4gdGhlIHNlbGVjdGlvbiBtYW5hZ2VyCi0gIC8vCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSAKLSAgeyAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJXU0RMR3JhcGhWaWV3ZXIuc2VsZWN0aW9uQ2hhbmdlZCggIiArIGV2ZW50LmdldFNvdXJjZSgpICsgIikiKTsKLSAgCQotICAJIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbk9iamVjdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gc2VsZWN0aW9uT2JqZWN0LmdldEZpcnN0RWxlbWVudCgpOwotICAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkgewotICAgICAJRWxlbWVudCBub2RlID0gKChXU0RMRWxlbWVudCkgbW9kZWxPYmplY3QpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgIGJvb2xlYW4gaXNFZGl0YWJsZSA9IChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpOwotICAgICAgICAgCi0gICAgIAlBY3Rpb24gY29weUFjdGlvbiA9IG5ldyBDb3B5R2xvYmFsQWN0aW9uKChXU0RMRWxlbWVudCkgbW9kZWxPYmplY3QsIGVkaXRvcik7Ci0gICAgIAlBY3Rpb24gcGFzdGVBY3Rpb24gPSBuZXcgUGFzdGVHbG9iYWxBY3Rpb24oKFdTRExFbGVtZW50KSBtb2RlbE9iamVjdCwgZWRpdG9yKTsKLSAJCQotIAkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotIAkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLCBjb3B5QWN0aW9uKTsKLSAJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksIHBhc3RlQWN0aW9uKTsKLSAJCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotIAkJCi0gCQlpZiAoIWlzRWRpdGFibGUpIHsKLSAJCQljb3B5QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotIAkJCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotIAkJfQotICAgICB9Ci0KLSAgICBpZiAoZXZlbnQuZ2V0U291cmNlKCkgIT0gaW50ZXJuYWxTZWxlY3Rpb25BZGFwdGVyICYmIGV2ZW50LmdldFNvdXJjZSgpICE9ICgoV1NETFRleHRFZGl0b3IpZWRpdG9yLmdldFRleHRFZGl0b3IoKSkuZ2V0SW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcigpKQotICAgIHsgICAKLSAgICAgIGJvb2xlYW4gaXNFbXB0eVNlbGVjdGlvblJlcXVpcmVkID0gdHJ1ZTsKLSAgICAgIGlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIE9iamVjdCBtb2RlbCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnQoY29tcG9uZW50Vmlld2VyLmdldFJvb3RFZGl0UGFydCgpLCBtb2RlbCk7Ci0gICAgICAgICAgaWYgKGVkaXRQYXJ0ID09IG51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGVkaXRQYXJ0ID0gZXhwYW5kVG9SZXZlYWwoY29tcG9uZW50Vmlld2VyLmdldFJvb3RFZGl0UGFydCgpLCBtb2RlbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlZGl0UGFydCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAJaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpIHsKLSAgICAgICAgICAJCW1vZGVsID0gZ2V0VG9wTGV2ZWxDb21wb25lbnQoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBtb2RlbCk7Ci0gICAgICAgICAgCQkKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwKLQkJCQkJbW9kZWwgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gfHwKLQkJCQkJbW9kZWwgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB8fAotCQkJCQltb2RlbCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkgewotCQkJCQkJY29tcG9uZW50Vmlld2VyLnNldElucHV0KG1vZGVsKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgCWVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV1NETEVsZW1lbnQgfHwgbW9kZWwgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpIHsKLSAgICAgICAgICAJCS8vIFdlIG5lZWQgdG8gc3dpdGNoIHRoZSBvdXRwdXQgdG8gRGVmaW5pdGlvbgotICAgICAgICAgIAkJY29tcG9uZW50Vmlld2VyLnNldElucHV0KGVkaXRvci5nZXREZWZpbml0aW9uKCkpOwotICAgICAgICAgIAkJZWRpdFBhcnQgPSBnZXRFZGl0UGFydChjb21wb25lbnRWaWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCksIG1vZGVsKTsKLSAgICAgICAgICAJCWlmIChlZGl0UGFydCA9PSBudWxsKQotICAgICAgICAgIAkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAJCQllZGl0UGFydCA9IGV4cGFuZFRvUmV2ZWFsKGNvbXBvbmVudFZpZXdlci5nZXRSb290RWRpdFBhcnQoKSwgbW9kZWwpOwotICAgICAgICAgIAkJfQotICAgICAgICAgIAl9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGJhZCBoYWNrIHRvIGNvbnZlcnQgeHNkIGVkaXRvciBjYXRlZ29yeSB0byB4c2Qgb2JqZWN0Ci0gICAgICAgICAgICAgIC8vIHNlZSBhbHNvIFdTRExUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZQotICAgICAgICAgICAgICBOb2RlIG5vZGUgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldE5vZGVGb3JPYmplY3QobW9kZWwpOwotICAgICAgICAgICAgICBPYmplY3QgbyA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudChlZGl0b3IuZ2V0RGVmaW5pdGlvbigpLCAoRWxlbWVudClub2RlKTsKLSAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSAoKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KW8pLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAgIGNvbXBvbmVudFZpZXdlci5zZXRJbnB1dChvYmopOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzRW1wdHlTZWxlY3Rpb25SZXF1aXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgY29tcG9uZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0UGFydCkpOwotICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXcoZWRpdFBhcnQpOwotICAgICAgICAgIH0gICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGlzRW1wdHlTZWxlY3Rpb25SZXF1aXJlZCkKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRUb3BMZXZlbENvbXBvbmVudChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwcmV2ID0gY29tcG9uZW50OwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbnRhaW5lciA9IGNvbXBvbmVudDsKLSAgICB3aGlsZSAoIGNvbnRhaW5lciAhPSBudWxsICYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgWFNEU2NoZW1hKSkKLSAgICB7Ci0gICAgICBwcmV2ID0gY29udGFpbmVyOyAgICAgCi0gICAgICBjb250YWluZXIgPSBjb250YWluZXIuZ2V0Q29udGFpbmVyKCk7Ci0gICAgfQotICAgIHJldHVybiBjb250YWluZXIgIT0gbnVsbCA/IHByZXYgOiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGdldEVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBPYmplY3QgbW9kZWwpICAKLSAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgPT0gbW9kZWwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7ICAgICAgCi0gICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRFZGl0UGFydCgoRWRpdFBhcnQpaS5uZXh0KCksIG1vZGVsKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIEVkaXRQYXJ0IGV4cGFuZFRvUmV2ZWFsKEVkaXRQYXJ0IGVkaXRQYXJ0LCBPYmplY3QgbW9kZWwpCi0gIHsgICAKLSAgICAvLyBoZXJlIHdlIGNyZWF0ZSB0aGUgcGFyZW50IGxpc3QKLSAgICAvLwotICAgIExpc3QgcGFyZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKE9iamVjdCBvID0gbW9kZWw7IG8gIT0gbnVsbDsgbyA9IGdldFBhcmVudChvKSkKLSAgICB7Ci0gICAgICBwYXJlbnRMaXN0LmFkZCgwLCBvKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgRWRpdFBhcnQgcmVzdWx0ID0gZXhwYW5kVG9SZXZlYWxIZWxwZXIoZWRpdFBhcnQsIHBhcmVudExpc3QsIDApOyAgICAKLSAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgIAotCi0KLSAgcHVibGljIEVkaXRQYXJ0IGV4cGFuZFRvUmV2ZWFsSGVscGVyKEVkaXRQYXJ0IGVkaXRQYXJ0LCBMaXN0IHBhcmVudExpc3QsIGludCBpbmRleCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBpbnQgcGFyZW50TGlzdFNpemUgPSAgcGFyZW50TGlzdC5zaXplKCk7Ci0gICAgT2JqZWN0IG1vZGVsID0gaW5kZXggPCBwYXJlbnRMaXN0U2l6ZSA/IHBhcmVudExpc3QuZ2V0KGluZGV4KSA6IG51bGw7Ci0gICAgaWYgKG1vZGVsICE9IG51bGwgJiYgZWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7IAotICAgICAgLy8gc2VhcmNoIGVkaXRwYXJ0IGFuZCBpdHMgZGVzY2VuZGFudHMgdG8gZmluZCBhIG1hdGNoIGZvciB0aGlzIG1vZGVsIG9iamVjdAotICAgICAgLy8KLSAgICAgIHJlc3VsdCA9IGdldEVkaXRQYXJ0KGVkaXRQYXJ0LCBtb2RlbCk7ICAKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRFZGl0UGFydCgiICsgaW5kZXggKyAiLCAiICsgbW9kZWwgKyAiKSA9ICIgKyByZXN1bHQpOwotICAgIH0KLQotICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoaW5kZXggPCAocGFyZW50TGlzdFNpemUgLSAxKSkKLSAgICAgIHsKLSAgICAgICAgLy8gd2UndmUgZm91bmQgdGhlIGVkaXRQYXJ0IGZvciB0aGUgaXRlbSBpbiB0aGUgcGFyZW50TGlzdCAKLSAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBpdGVtIAotICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgVHJlZU5vZGVFZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgICgoVHJlZU5vZGVFZGl0UGFydClyZXN1bHQpLnNldEV4cGFuZGVkKHRydWUpOwotICAgICAgICB9ICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gZXhwYW5kVG9SZXZlYWxIZWxwZXIocmVzdWx0LCBwYXJlbnRMaXN0LCBpbmRleCArIDEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgCi0gICAgCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBtb2RlbCkKLSAgeyAKLSAgICBPYmplY3QgcGFyZW50ID0gbnVsbDsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgIHsKLSAgICAgIHBhcmVudCA9ICgoRU9iamVjdCltb2RlbCkuZUNvbnRhaW5lcigpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfSAgICAgCi0KLQotICBwdWJsaWMgdm9pZCBzY3JvbGxJbnRvVmlldyhFZGl0UGFydCBlZGl0UGFydCkKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBmb3IgKEVkaXRQYXJ0IHBhcmVudCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKQotICAgIHsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBHcm91cEVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQgPSAoR3JvdXBFZGl0UGFydClwYXJlbnQ7Ci0gICAgICAgIGdyb3VwRWRpdFBhcnQuc2Nyb2xsVG9SZXZlYWxFZGl0UGFydChlZGl0UGFydCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9BYnN0cmFjdENvbm5lY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQWJzdHJhY3RDb25uZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjg0YWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9BYnN0cmFjdENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFN3aXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIEFic3RyYWN0Q29ubmVjdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJQ29ubmVjdGlvbk1hbmFnZXIKLXsgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEFHQVRFX0ZPUldBUkQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QQUdBVEVfQkFDSyAgICA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVEVEICAgICAgICAgID0gMjsKLQotICBwcm90ZWN0ZWQgR3JvdXBFZGl0UGFydCBncm91cEVkaXRQYXJ0OwotCi0gIHB1YmxpYyBBYnN0cmFjdENvbm5lY3Rpb25NYW5hZ2VyKEdyb3VwRWRpdFBhcnQgZ3JvdXBFZGl0UGFydCkKLSAgewotICAgIHRoaXMuZ3JvdXBFZGl0UGFydCA9IGdyb3VwRWRpdFBhcnQ7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgV1NETFN3aXRjaCBjcmVhdGVTd2l0Y2goaW50IHNlbGVjdGlvblR5cGUpCi0gIHsKLSAgICByZXR1cm4gbmV3IFdTRExTd2l0Y2goKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BhZ2F0ZUZvcndhcmQoT2JqZWN0IG1vZGVsKQotICB7ICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICB7Ci0gICAgICBXU0RMU3dpdGNoIHRoZVN3aXRjaCA9IGNyZWF0ZVN3aXRjaChQUk9QQUdBVEVfRk9SV0FSRCk7Ci0gICAgICB0aGVTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpbW9kZWwpOyAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2Nyb2xsVG9SZXZlYWxJbnB1dENvbm5lY3Rpb24oKTsKLSAgICB9ICAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZW1vdmVDb25uZWN0aW9ucygpOwotICAgIH0KLSAgICBwcm9wYWdhdGVGb3J3YXJkVG9OZXh0KG1vZGVsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BhZ2F0ZUJhY2soT2JqZWN0IG1vZGVsKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFdTRExTd2l0Y2ggdGhlU3dpdGNoID0gY3JlYXRlU3dpdGNoKFBST1BBR0FURV9CQUNLKTsKLSAgICAgIHRoZVN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCltb2RlbCk7ICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNjcm9sbFRvUmV2ZWFsT3V0cHV0Q29ubmVjdGlvbigpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVtb3ZlQ29ubmVjdGlvbnMoKTsKLSAgICB9Ci0gICAgcHJvcGFnYXRlQmFja1RvUHJldmlvdXMobW9kZWwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRNb2RlbE9iamVjdChPYmplY3QgbW9kZWwpCi0gIHsgIAotCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5vZGUpCi0JewotICAgIAlOb2RlIG5vZGUgPSAoTm9kZSltb2RlbDsKLQkJLy9EZWZpbml0aW9uIGRlZmluaXRpb24gPSBncm91cEVkaXRQYXJ0LmdldERlZmluaXRpb24oKTsKLSAgICAgICAgd2hpbGUobm9kZSAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAKLSAgICAJICBpZiAoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkuZXF1YWxzKG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgIAkgIHsKLSAgICAJCWJyZWFrOwotICAgIAkgIH0gIAotICAgIAkgIGVsc2UKLSAgICAJICB7Ci0gICAgCSAgCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAJICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgIAltb2RlbCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudCggZ3JvdXBFZGl0UGFydC5nZXREZWZpbml0aW9uKCksIChFbGVtZW50KW5vZGUpOwotICAgICAgICB9ICAKLQl9Ci0JICAJCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgV1NETEVsZW1lbnQpCi0gICAgewotICAgICAgV1NETFN3aXRjaCB0aGVTd2l0Y2ggPSBjcmVhdGVTd2l0Y2goU0VMRUNURUQpOwotICAgICAgdGhlU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KW1vZGVsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgcmVtb3ZlQ29ubmVjdGlvbnMoKTsKLSAgICB9Ci0gICAgcHJvcGFnYXRlRm9yd2FyZFRvTmV4dChtb2RlbCk7Ci0gICAgcHJvcGFnYXRlQmFja1RvUHJldmlvdXMobW9kZWwpOwotICB9IAotCi0gCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbm5lY3Rpb25zKCkKLSAgewotICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KG51bGwpOwotICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gIH0KLSAgICAgCi0gIHByb3RlY3RlZCB2b2lkIHByb3BhZ2F0ZUZvcndhcmRUb05leHQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgR3JvdXBFZGl0UGFydCBncm91cCA9IGdyb3VwRWRpdFBhcnQuZ2V0TmV4dCgpOwotICAgIGlmIChncm91cCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25uZWN0aW9uTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlciA9IGdyb3VwLmdldENvbm5lY3Rpb25NYW5hZ2VyKCk7Ci0gICAgICBpZiAoY29ubmVjdGlvbk1hbmFnZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29ubmVjdGlvbk1hbmFnZXIucHJvcGFnYXRlRm9yd2FyZChtb2RlbCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJvcGFnYXRlQmFja1RvUHJldmlvdXMoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgR3JvdXBFZGl0UGFydCBncm91cCA9IGdyb3VwRWRpdFBhcnQuZ2V0UHJldmlvdXMoKTsKLSAgICBpZiAoZ3JvdXAgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29ubmVjdGlvbk1hbmFnZXIgY29ubmVjdGlvbk1hbmFnZXIgPSBncm91cC5nZXRDb25uZWN0aW9uTWFuYWdlcigpOwotICAgICAgaWYgKGNvbm5lY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25NYW5hZ2VyLnByb3BhZ2F0ZUJhY2sobW9kZWwpOwotICAgICAgfQotICAgIH0KLSAgfSAgCi0KLSAgcHJvdGVjdGVkIEJpbmRpbmcgZ2V0RW5jbG9zaW5nQmluZGluZyhFT2JqZWN0IG9iamVjdCkKLSAgeyAKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBudWxsOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nKQotICAgIHsgICAgIAotICAgICAgYmluZGluZyA9IChCaW5kaW5nKW9iamVjdDsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ09wZXJhdGlvbikKLSAgICB7ICAgICAKLSAgICAgIGJpbmRpbmcgPSAoQmluZGluZylvYmplY3QuZUNvbnRhaW5lcigpOwotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQgfHwKLSAgICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0IHx8Ci0gICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ0ZhdWx0KQotICAgIHsKLSAgICAgIGJpbmRpbmcgPSAoQmluZGluZylvYmplY3QuZUNvbnRhaW5lcigpLmVDb250YWluZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJpbmRpbmc7Ci0gIH0gICAKLQotICBwcm90ZWN0ZWQgUG9ydFR5cGUgZ2V0RW5jbG9zaW5nUG9ydFR5cGUoRU9iamVjdCBvYmplY3QpCi0gIHsgCi0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBudWxsOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0gICAgeyAgICAgCi0gICAgICBwb3J0VHlwZSA9IChQb3J0VHlwZSlvYmplY3QuZUNvbnRhaW5lcigpOwotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dCB8fAotICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIE91dHB1dCB8fAotICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAJCi0gICAgICBwb3J0VHlwZSA9IG9iamVjdC5lQ29udGFpbmVyKCkgIT0gbnVsbCA/IChQb3J0VHlwZSlvYmplY3QuZUNvbnRhaW5lcigpLmVDb250YWluZXIoKSA6IG51bGw7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQb3J0VHlwZSkKLSAgICB7Ci0gICAgICBwb3J0VHlwZSA9IChQb3J0VHlwZSlvYmplY3Q7CQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHBvcnRUeXBlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgT3BlcmF0aW9uIGdldEVuY2xvc2luZ09wZXJhdGlvbihFT2JqZWN0IG9iamVjdCkKLSAgeyAKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgT3BlcmF0aW9uKQotICAgIHsgICAgIAotICAgICAgb3BlcmF0aW9uID0gKE9wZXJhdGlvbilvYmplY3Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElucHV0IHx8Ci0gICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0IHx8Ci0gICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgRmF1bHQpCi0gICAgewotICAgICAgb3BlcmF0aW9uID0gKE9wZXJhdGlvbilvYmplY3QuZUNvbnRhaW5lcigpOwotICAgIH0gCSAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gb3BlcmF0aW9uOwotICB9IAotCQotICBwcm90ZWN0ZWQgRU9iamVjdCBnZXRNZXNzYWdlUmVmZXJlbmNlKEVPYmplY3Qgb2JqZWN0KQotICB7ICAgICAgCi0gICAgcmV0dXJuIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dCB8fAotICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0IHx8Ci0gICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBGYXVsdCkgPyBvYmplY3QgOiBudWxsOyAgCi0gIH0JCi19ICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQmluZGluZ3NHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQmluZGluZ3NHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMWY1MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0JpbmRpbmdzR3JvdXBDb25uZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMU3dpdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1wdWJsaWMgY2xhc3MgQmluZGluZ3NHcm91cENvbm5lY3Rpb25NYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uTWFuYWdlcgoteyAKLSAgcHVibGljIEJpbmRpbmdzR3JvdXBDb25uZWN0aW9uTWFuYWdlcihHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQpCi0gIHsKLSAgICBzdXBlcihncm91cEVkaXRQYXJ0KTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgCi0gIGNsYXNzIEludGVybmFsV1NETFN3aXRjaCBleHRlbmRzIFdTRExTd2l0Y2gKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGdyb3VwRWRpdFBhcnQuZ2V0RGVmaW5pdGlvbigpKTsKLQotICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChiaW5kaW5nKTsgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoYmluZGluZyk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChiaW5kaW5nKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgCi0gICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCkKLSAgICB7ICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nQmluZGluZyhiaW5kaW5nRmF1bHQpKTsgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEVuY2xvc2luZ0JpbmRpbmcoYmluZGluZ0ZhdWx0KSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChiaW5kaW5nRmF1bHQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChnZXRFbmNsb3NpbmdCaW5kaW5nKGJpbmRpbmdJbnB1dCkpOyAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nQmluZGluZyhiaW5kaW5nSW5wdXQpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGJpbmRpbmdJbnB1dCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0KLSAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nQmluZGluZyhiaW5kaW5nT3BlcmF0aW9uKSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEVuY2xvc2luZ0JpbmRpbmcoYmluZGluZ09wZXJhdGlvbikpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0KLSAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0KQotICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChnZXRFbmNsb3NpbmdCaW5kaW5nKGJpbmRpbmdPdXRwdXQpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nQmluZGluZyhiaW5kaW5nT3V0cHV0KSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChiaW5kaW5nT3V0cHV0KTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUZhdWx0KEZhdWx0IGZhdWx0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaGFuZGxlSW50ZXJmYWNlSGVscGVyKGZhdWx0KTsgCi0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gCi0gICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgaW5wdXQpCi0gICAgeyAKLSAgICAgICAgICAgICAgICAKLSAgICAgIGhhbmRsZUludGVyZmFjZUhlbHBlcihpbnB1dCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgIAotICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pIAotICAgIHsgICAgICAKLSAgICAgIGhhbmRsZUludGVyZmFjZUhlbHBlcihvcGVyYXRpb24pOyAgICAgCi0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0KLSAgICAgICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgICB7ICAKLSAgICAgIGhhbmRsZUludGVyZmFjZUhlbHBlcihvdXRwdXQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlUG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaGFuZGxlSW50ZXJmYWNlSGVscGVyKHBvcnRUeXBlKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgCi0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgcG9ydCkKLSAgICB7ICAgICAgICAgIAotICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRFQmluZGluZygpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoYmluZGluZyk7IAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChiaW5kaW5nKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGJpbmRpbmcpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChudWxsKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgIAotICAgIAotICAgIHByb3RlY3RlZCBCaW5kaW5nIGdldFByZXZpb3VzTWF0Y2hpbmdCaW5kaW5nKFBvcnRUeXBlIHBvcnRUeXBlKQotICAgIHsKLSAgICAgIEJpbmRpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgIE9iamVjdCBwcmV2aW91c0NvbnRleHQgPSBncm91cEVkaXRQYXJ0LmdldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdCgpOwotICAgICAgaWYgKHByZXZpb3VzQ29udGV4dCA9PSBudWxsKSAgICAgIAotICAgICAgewotICAgICAgICBwcmV2aW91c0NvbnRleHQgPSBncm91cEVkaXRQYXJ0LmdldEVtcGhhc2l6ZWRNb2RlbE9iamVjdCgpOwotICAgICAgfQotICAgICAgaWYgKHByZXZpb3VzQ29udGV4dCBpbnN0YW5jZW9mIEVPYmplY3QpIAotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBnZXRFbmNsb3NpbmdCaW5kaW5nKChFT2JqZWN0KXByZXZpb3VzQ29udGV4dCk7Ci0gICAgICAgIGlmIChiaW5kaW5nLmdldEVQb3J0VHlwZSgpID09IHBvcnRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gYmluZGluZzsgIAotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgICAgCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVJbnRlcmZhY2VIZWxwZXIoRU9iamVjdCBpbnRlcmZhY2VPYmplY3QpCi0gICAgeyAgIAotICAgICAgQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLSAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gZ2V0RW5jbG9zaW5nUG9ydFR5cGUoaW50ZXJmYWNlT2JqZWN0KTsKLSAgICAgIGlmIChwb3J0VHlwZSAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgIGJpbmRpbmcgPSBnZXRQcmV2aW91c01hdGNoaW5nQmluZGluZyhwb3J0VHlwZSk7ICAgICAKLSAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKLSAgICAgICAgeyAgICAgIAotICAgICAgICAgIExpc3QgbGlzdCA9IHV0aWwuZ2V0QmluZGluZ3MocG9ydFR5cGUpOwotICAgICAgICAgIGJpbmRpbmcgPSBsaXN0LnNpemUoKSA+IDAgPyAoQmluZGluZylsaXN0LmdldCgwKSA6IG51bGw7ICAKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoYmluZGluZyk7ICAgCi0gICAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChiaW5kaW5nKTsgICAgIAotICAgICAgICAgIEVPYmplY3QgYmluZGluZ09iamVjdCA9IHV0aWwuZ2V0QmluZGluZ09iamVjdChpbnRlcmZhY2VPYmplY3QsIGJpbmRpbmcpOwotICAgICAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGJpbmRpbmdPYmplY3QpOyAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoYmluZGluZyA9PSBudWxsKQotICAgICAgewotICAgICAgICBkZWZhdWx0Q2FzZShudWxsKTsKLSAgICAgIH0KLSAgICB9ICAgCi0gIH0gICAgCi0gICAgCi0gIHByb3RlY3RlZCBXU0RMU3dpdGNoIGNyZWF0ZVN3aXRjaChpbnQgc2VsZWN0aW9uVHlwZSkKLSAgewotICAgIHJldHVybiBuZXcgSW50ZXJuYWxXU0RMU3dpdGNoKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHByb3BhZ2F0ZUJhY2tUb1ByZXZpb3VzKE9iamVjdCBtb2RlbCkKLSAgeyAgIAotICAgIHN1cGVyLnByb3BhZ2F0ZUJhY2tUb1ByZXZpb3VzKGdyb3VwRWRpdFBhcnQuZ2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoKSk7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Db21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Db21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlMDg2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQ29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5QYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5lZGl0cGFydHMuQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNvbnRhaW5lckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci0gICAgICAgICAgICAgIAotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQKLXsgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBNRVNTQUdFX1BMQUNFX0hPTERFUiA9ICJNRVNTQUdFX1BMQUNFX0hPTERFUiI7Ci0gIHByb3RlY3RlZCBPYmplY3QgaW5wdXQ7IAotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBuZXdJbnB1dCkKLSAgewotICAgIGlucHV0ID0gbmV3SW5wdXQ7ICAKLSAgICBzZXRNb2RlbChpbnB1dCk7Ci0gICAgcmVmcmVzaENoaWxkcmVuKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgUGFuZWwgcGFuZWwgPSBuZXcgUGFuZWwoKTsKLSAgICBwYW5lbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzMCwgMzAsIDMwLCAzMCkpOwotICAgIC8vcGFuZWwuc2V0QmFja2dyb3VuZENvbG9yKEdyYXBoaWNzQ29uc3RhbnRzLnJlZCk7Ci0gICAgCi0gICAgQ29udGFpbmVyTGF5b3V0IGxheW91dCA9IG5ldyBDb250YWluZXJMYXlvdXQoKTsKLSAgICBsYXlvdXQuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgcGFuZWwuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotICAgIHJldHVybiBwYW5lbDsKLSAgfSAKLSAgIAotCi0gIHByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVDaGlsZChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsID09IE1FU1NBR0VfUExBQ0VfSE9MREVSKQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gbmV3IE5vdEF2YWlsYWJsZU1lc3NhZ2VFZGl0UGFydCgpOwotICAgICAgZWRpdFBhcnQuc2V0TW9kZWwobW9kZWwpOwotICAgIH0gCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUVkaXRQYXJ0KHRoaXMsIG1vZGVsKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9ICAKLSAgCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7ICAgCi0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdC5hZGQoaW5wdXQpOwotICAgIH0gICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQuYWRkKE1FU1NBR0VfUExBQ0VfSE9MREVSKTsKLSAgICB9ICAgICAgIAotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHByb3BlcnR5ID09IE1vZGVsQWRhcHRlci5DSElMRFJFTl9QUk9QRVJUWSkKLSAgICB7Ci0gICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHkgPT0gTW9kZWxBZGFwdGVyLkRFVEFJTF9QUk9QRVJUWSkKLSAgICB7IAotICAgICAgcmVmcmVzaFZpc3VhbHMoKTsgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgfQotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0RlZmluaXRpb25FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0RlZmluaXRpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRkODMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9EZWZpbml0aW9uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5Sb3VuZGVkTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5PcGVuT25TZWxlY3Rpb25IZWxwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29udGFpbmVyRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5Db250YWluZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkZpbGxMYXlvdXQ7Ci0KLXB1YmxpYyBjbGFzcyBEZWZpbml0aW9uRWRpdFBhcnQgZXh0ZW5kcyBXU0RMRWRpdFBhcnQgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIC8vLCBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0gIHByb3RlY3RlZCBDb250YWluZXJGaWd1cmUgb3V0bGluZWQ7Ci0KLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSByaWdodENvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIHRvcENvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIG1pZGRsZUNvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIGJvdHRvbUNvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RFRF9FRElUX1BBUlRfUkVGRVJFTkNFID0gIlNFTEVDVEVEX0VESVRfUEFSVF9SRUZFUkVOQ0UiOwotCi0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgZ2V0Vmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICB9Ci0gIC8qKiAKLSAgICogQXBhcnQgZnJvbSB0aGUgZGVhY3RpdmF0aW9uIGRvbmUgaW4gc3VwZXIsIHRoZSBzb3VyY2UKLSAgICogYW5kIHRhcmdldCBjb25uZWN0aW9ucyBhcmUgZGVhY3RpdmF0ZWQsIGFuZCB0aGUgdmlzdWFsCi0gICAqIHBhcnQgb2YgdGhlIHRoaXMgaXMgcmVtb3ZlZC4KLSAgICoKLSAgICogQHNlZSAjYWN0aXZhdGUoKSAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0gICAgZ2V0Vmlld2VyKCkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlW10gaW5pdENvbnRlbnRQYW5lcygpCi0gIHsKLSAgICBJRmlndXJlW10gY29udGVudFBhbmVzID0gbmV3IElGaWd1cmVbNF07Ci0gICAgY29udGVudFBhbmVzWzBdID0gcmlnaHRDb250ZW50UGFuZTsKLSAgICBjb250ZW50UGFuZXNbMV0gPSB0b3BDb250ZW50UGFuZTsKLSAgICBjb250ZW50UGFuZXNbMl0gPSBtaWRkbGVDb250ZW50UGFuZTsKLSAgICBjb250ZW50UGFuZXNbM10gPSBib3R0b21Db250ZW50UGFuZTsKLSAgICByZXR1cm4gY29udGVudFBhbmVzOwotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBnZXRDb250ZW50UGFuZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLQotICAgIGlmIChtb2RlbCA9PSBTRUxFQ1RFRF9FRElUX1BBUlRfUkVGRVJFTkNFKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgIHsKLSAgICAgIFdTRExHcm91cE9iamVjdCBncm91cE9iamVjdCA9IChXU0RMR3JvdXBPYmplY3QpbW9kZWw7Ci0gICAgICBzd2l0Y2ggKGdyb3VwT2JqZWN0LmdldFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuSU1QT1JUU19HUk9VUCA6Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LlRZUEVTX0dST1VQIDoKLSAgICAgICAgICAvL2Nhc2UgV1NETEdyb3VwT2JqZWN0LkVYVEVOU0lCSUxJVFlfRUxFTUVOVFNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LkJJTkRJTkdTX0dST1VQIDoKLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuTUVTU0FHRVNfR1JPVVAgOgotICAgICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5QT1JUX1RZUEVTX0dST1VQIDoKLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuU0VSVklDRVNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LkVYVEVOU0lCSUxJVFlfRUxFTUVOVFNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBudWxsOwotICAgIGlmIChtb2RlbCA9PSBTRUxFQ1RFRF9FRElUX1BBUlRfUkVGRVJFTkNFKQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gbmV3IFBhcnRSZWZlcmVuY2VTZWN0aW9uRWRpdFBhcnQoKTsKLSAgICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICAgIGVkaXRQYXJ0LnNldFBhcmVudCh0aGlzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gc3VwZXIuY3JlYXRlQ2hpbGQobW9kZWwpOwotICAgIH0KLSAgICByZXR1cm4gZWRpdFBhcnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgQ29udGFpbmVyRmlndXJlIG91dGVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIENvbnRhaW5lckxheW91dCBhbmNob3JlZExheW91dCA9IG5ldyBDb250YWluZXJMYXlvdXQoKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBpbnQgYWxpZ25GaWd1cmUoSUZpZ3VyZSBwYXJlbnQsIElGaWd1cmUgY2hpbGQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoY2hpbGQgPT0gb3V0bGluZWQpID8gMCA6IC0xOwotICAgICAgfQotICAgIH07Ci0gICAgb3V0ZXIuc2V0TGF5b3V0TWFuYWdlcihhbmNob3JlZExheW91dCk7Ci0gICAgLyoKLSAgICBDb250YWluZXJGaWd1cmUgb3V0ZXIgPSBuZXcgQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUodGhpcykKLSAgICB7Ci0gICAgICBwdWJsaWMgSUZpZ3VyZSBnZXRDb25uZWN0aW9uRmlndXJlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkUGFydEVkaXRQYXJ0ICE9IG51bGwgPyBzZWxlY3RlZFBhcnRFZGl0UGFydC5nZXRGaWd1cmUoKSA6IHRoaXM7Ci0gICAgICB9ICAgICAgICAgICAgICAgCi0gICAgfTsqLwotICAgIG91dGVyLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwodHJ1ZSk7Ci0gICAgLy9vdXRlci5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigwLCAyMCwgMCwgMCkpOwotCi0gICAgb3V0bGluZWQgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgb3V0ZXIuYWRkKG91dGxpbmVkKTsKLSAgICAvL291dGxpbmVkLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIG91dGxpbmVkLnNldExheW91dE1hbmFnZXIobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgb3V0bGluZWQuc2V0Qm9yZGVyKG5ldyBSb3VuZGVkTGluZUJvcmRlcigxLCA2KSk7Ci0gICAgb3V0bGluZWQuc2V0Rm9yZWdyb3VuZENvbG9yKGdyb3VwQm9yZGVyQ29sb3IpOwotCi0gICAgQ29udGFpbmVyRmlndXJlIHJpZ2h0UGFuZSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICByaWdodFBhbmUuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMCwgMCwgMCwgMzAwKSk7Ci0gICAgcmlnaHRQYW5lLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIG91dGVyLmFkZChyaWdodFBhbmUpOwotCi0gICAgLy9SZWN0YW5nbGVGaWd1cmUgc3BhY2VyID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotICAgIC8vcmlnaHRQYW5lLmFkZChzcGFjZXIpOwotICAgIC8vc3BhY2VyLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig0NTAsIDIwMCkpOwotCi0gICAgcmlnaHRDb250ZW50UGFuZSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICByaWdodFBhbmUuYWRkKHJpZ2h0Q29udGVudFBhbmUpOwotICAgIHJpZ2h0Q29udGVudFBhbmUuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMTUsIDIwLCAxNSwgMTUpKTsKLQotICAgIENvbnRhaW5lckZpZ3VyZSBsYWJlbEhvbGRlciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICBvdXRsaW5lZC5hZGQobGFiZWxIb2xkZXIpOwotCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoKTsKLSAgICBsYWJlbEhvbGRlci5hZGQobGFiZWwpOwotICAgIGxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDIsIDUsIDAsIDUpKTsKLSAgICBsYWJlbC5zZXRGb250KG1lZGl1bUZvbnQpOwotICAgIGxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfREVGSU5JVElPTiIpKTsKLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCi0gICAgdG9wQ29udGVudFBhbmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgb3V0bGluZWQuYWRkKHRvcENvbnRlbnRQYW5lKTsKLQotICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KDE1KTsKLSAgICBmaWxsTGF5b3V0LnNldEhvcml6b250YWwodHJ1ZSk7Ci0gICAgdG9wQ29udGVudFBhbmUuc2V0TGF5b3V0TWFuYWdlcihmaWxsTGF5b3V0KTsKLSAgICB0b3BDb250ZW50UGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigxMCwgMTAsIDEwLCAxMCkpOwotCi0gICAgbWlkZGxlQ29udGVudFBhbmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgb3V0bGluZWQuYWRkKG1pZGRsZUNvbnRlbnRQYW5lKTsKLSAgICBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoMTUpOwotICAgIGZpbGxMYXlvdXQuc2V0SG9yaXpvbnRhbCh0cnVlKTsKLSAgICBtaWRkbGVDb250ZW50UGFuZS5zZXRMYXlvdXRNYW5hZ2VyKGZpbGxMYXlvdXQpOwotICAgIG1pZGRsZUNvbnRlbnRQYW5lLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDAsIDEwLCAxMCwgMTApKTsKLQotICAgIGJvdHRvbUNvbnRlbnRQYW5lID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIG91dGxpbmVkLmFkZChib3R0b21Db250ZW50UGFuZSk7Ci0gICAgYm90dG9tQ29udGVudFBhbmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgRmlsbExheW91dCgpKTsKLSAgICBib3R0b21Db250ZW50UGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigwLCAxMCwgMTAsIDEwKSk7Ci0KLSAgICByZXR1cm4gb3V0ZXI7Ci0gIH0KLQotICAvL3B1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgLy97Ci0gIC8vICByZXR1cm4gY29udGVudFBhbmU7Ci0gIC8vfSAgIAotICBwdWJsaWMgUGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydCBnZXRQYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0KCkKLSAgewotICAgIFBhcnRSZWZlcmVuY2VTZWN0aW9uRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgIGlmIChlZGl0UGFydC5nZXRNb2RlbCgpID09IFNFTEVDVEVEX0VESVRfUEFSVF9SRUZFUkVOQ0UpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChQYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBHcm91cEVkaXRQYXJ0IGdldEdyb3VwRWRpdFBhcnQoaW50IHR5cGUpCi0gIHsKLSAgICBHcm91cEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgR3JvdXBFZGl0UGFydCBncm91cEVkaXRQYXJ0ID0gKEdyb3VwRWRpdFBhcnQpbzsKLSAgICAgICAgaWYgKGdyb3VwRWRpdFBhcnQuZ2V0VHlwZSgpID09IHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBncm91cEVkaXRQYXJ0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChTRUxFQ1RFRF9FRElUX1BBUlRfUkVGRVJFTkNFKTsKLSAgICBsaXN0LmFkZEFsbChzdXBlci5nZXRNb2RlbENoaWxkcmVuKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlT3BlblJlcXVlc3QoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICBHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQgPSBudWxsOwotICAgIGlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgSW1wb3J0KQotICAgIHsKLSAgICAgIEltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbilnZXRNb2RlbCgpOwotICAgICAgT3Blbk9uU2VsZWN0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBPcGVuT25TZWxlY3Rpb25IZWxwZXIoZGVmaW5pdGlvbik7Ci0gICAgICBoZWxwZXIub3BlbkVkaXRvcih0aGVJbXBvcnQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSAoRWRpdFBhcnQpZWRpdFBhcnQuZ2V0UGFyZW50KCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBHcm91cEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgZ3JvdXBFZGl0UGFydCA9IChHcm91cEVkaXRQYXJ0KXBhcmVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZ3JvdXBFZGl0UGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBHcm91cEVkaXRQYXJ0IG5leHRHcm91cEVkaXRQYXJ0ID0gZ3JvdXBFZGl0UGFydC5nZXROZXh0KCk7Ci0gICAgICAgIGlmIChuZXh0R3JvdXBFZGl0UGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG5leHRHcm91cEVkaXRQYXJ0LmlucHV0Q29ubmVjdGlvbiBpbnN0YW5jZW9mIFRyZWVOb2RlRWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgKChUcmVlTm9kZUVkaXRQYXJ0KSAobmV4dEdyb3VwRWRpdFBhcnQuaW5wdXRDb25uZWN0aW9uKSkuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEdyb3VwRWRpdFBhcnQgcHJldkdyb3VwRWRpdFBhcnQgPSBncm91cEVkaXRQYXJ0LmdldFByZXZpb3VzKCk7Ci0gICAgICAgIGlmIChwcmV2R3JvdXBFZGl0UGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHByZXZHcm91cEVkaXRQYXJ0Lm91dHB1dENvbm5lY3Rpb24gaW5zdGFuY2VvZiBUcmVlTm9kZUVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoVHJlZU5vZGVFZGl0UGFydCkgKHByZXZHcm91cEVkaXRQYXJ0Lm91dHB1dENvbm5lY3Rpb24pKS5zZXRFeHBhbmRlZCh0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHVwZGF0ZUNvbm5lY3Rpb25zKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICB1cGRhdGVDb25uZWN0aW9ucygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdXBkYXRlQ29ubmVjdGlvbnMoKQotICB7Ci0gICAgLy8gdG9kbyAgICAgICAgIAotICAgIGlmIChpc0FjdGl2ZSgpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBmaW5hbCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQgPSBnZXRTZWxlY3RlZEVkaXRQYXJ0KGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgR3JvdXBFZGl0UGFydCBncm91cCA9IGdldENvbnRhaW5pbmdHcm91cChzZWxlY3RlZEVkaXRQYXJ0KTsKLSAgICAgICAgaWYgKGdyb3VwICE9IG51bGwgJiYgZ3JvdXAuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ3JvdXAuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3RlZE1vZGVsT2JqZWN0KHNlbGVjdGVkRWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIWlzQW5jZXN0b3IoZ2V0UGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydCgpLCBzZWxlY3RlZEVkaXRQYXJ0KSkKLSAgICAgICAgewotICAgICAgICAgIGdyb3VwID0gZ2V0R3JvdXBFZGl0UGFydChXU0RMR3JvdXBPYmplY3QuUE9SVF9UWVBFU19HUk9VUCk7Ci0gICAgICAgICAgZ3JvdXAuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3RlZE1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEdyb3VwRWRpdFBhcnQgZ2V0Q29udGFpbmluZ0dyb3VwKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICBHcm91cEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICB7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEdyb3VwRWRpdFBhcnQpcGFyZW50OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBHcm91cEVkaXRQYXJ0IGdldE5leHRHcm91cEVkaXRQYXJ0KEdyb3VwRWRpdFBhcnQgZ3JvdXBFZGl0UGFydCkKLSAgewotICAgIEdyb3VwRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBHcm91cEVkaXRQYXJ0IHByZXYgPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIEdyb3VwRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIEdyb3VwRWRpdFBhcnQgZWRpdFBhcnQgPSAoR3JvdXBFZGl0UGFydClvOwotICAgICAgICBpZiAocHJldiA9PSBncm91cEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcHJldiA9IGVkaXRQYXJ0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIEdyb3VwRWRpdFBhcnQgZ2V0UHJldmlvdXNHcm91cEVkaXRQYXJ0KEdyb3VwRWRpdFBhcnQgZ3JvdXBFZGl0UGFydCkKLSAgewotICAgIEdyb3VwRWRpdFBhcnQgcHJldiA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgR3JvdXBFZGl0UGFydCBlZGl0UGFydCA9IChHcm91cEVkaXRQYXJ0KW87Ci0gICAgICAgIGlmIChlZGl0UGFydCA9PSBncm91cEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcHJldiA9IGVkaXRQYXJ0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJldjsKLSAgfQotCi0gIHByb3RlY3RlZCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGdldFNlbGVjdGVkRWRpdFBhcnQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBPYmplY3QgZmlyc3QgPSBzLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgZWRpdFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClmaXJzdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaENoaWxkcmVuKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICAgIHVwZGF0ZUNvbm5lY3Rpb25zKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0FuY2VzdG9yKEVkaXRQYXJ0IGFuY2VzdG9yLCBFZGl0UGFydCBjaGlsZCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKGFuY2VzdG9yICE9IG51bGwgJiYgY2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEVkaXRQYXJ0IGVkaXRQYXJ0ID0gY2hpbGQ7IGVkaXRQYXJ0ICE9IG51bGw7IGVkaXRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChlZGl0UGFydCA9PSBhbmNlc3RvcikKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9EcmlsbERvd25FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0RyaWxsRG93bkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjA3YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0RyaWxsRG93bkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguV1NETENvbXBvbmVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29udGFpbmVyRmlndXJlOwotCi1wdWJsaWMgY2xhc3MgRHJpbGxEb3duRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBMYWJlbCBkcmlsbERvd25CdXR0b25MYWJlbDsgCi0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENvbnRhaW5lckZpZ3VyZSBmaWd1cmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7ICAKLSAgICBkcmlsbERvd25CdXR0b25MYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIGRyaWxsRG93bkJ1dHRvbkxhYmVsLnNldEljb24oV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9mb3J3YXJkLmdpZiIpKTsKLSAgICBmaWd1cmUuYWRkKGRyaWxsRG93bkJ1dHRvbkxhYmVsKTsKLSAgICBsYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIGxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVU5LTk9XTiIpKTsKLSAgICAKLS8vICBldmlsIGhhY2sgdG8gcHJvdmlkZSB1bmRlcmxpbmVzCi0gICAgYm9vbGVhbiBpc0xpbnV4ID0gamF2YS5pby5GaWxlLnNlcGFyYXRvci5lcXVhbHMoIi8iKTsKLSAgICBpZiAoIWlzTGludXgpCi0gICAgewotICAgICAgRm9udCB1bmRlcmxpbmVGb250ID0gbmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksICJUYWhvbWEiLCA4LCBTV1QuTk9ORSk7IAotICAgICAgRm9udERhdGEgb2xkRGF0YSA9IHVuZGVybGluZUZvbnQuZ2V0Rm9udERhdGEoKVswXTsKLSAgICAgIEZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKG9sZERhdGEuZ2V0TmFtZSgpLCBvbGREYXRhLmdldEhlaWdodCgpLCBTV1QuTk9ORSk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETy4uLiBjbGVhbiB0aGlzIGF3ZnVsIGNvZGUgdXAuLi4gd2Ugc2VlbSB0byBiZSBsZWFraW5nIGhlcmUgdG9vCi0gICAgICAgIC8vIHdlIGNhbid0IGNhbGwgdGhpcyBkaXJlY3RseSBzaW5jZSB0aGUgbWV0aG9kcyBhcmUgT1MgZGVwZW5kYW50Ci0gICAgICAgIC8vIGZvbnREYXRhLmRhdGEubGZVbmRlcmxpbmUgPSAxCi0gICAgICAgIC8vIHNvIGluc3RlYWQgd2UgdXNlIHJlZmxlY3Rpb24KLSAgICAgICAgT2JqZWN0IGRhdGEgPSBmb250RGF0YS5nZXRDbGFzcygpLmdldEZpZWxkKCJkYXRhIikuZ2V0KGZvbnREYXRhKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkYXRhIiArIGRhdGEuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIGRhdGEuZ2V0Q2xhc3MoKS5nZXRGaWVsZCgibGZVbmRlcmxpbmUiKS5zZXRCeXRlKGRhdGEsIChieXRlKTEpOwotICAgICAgICBGb250IGZvbnQgPSBuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgZm9udERhdGEpOwotICAgICAgICBsYWJlbC5zZXRGb250KGZvbnQpOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7ICAgIAotICAgICAgfQotICAgIH0KLSAgICBmaWd1cmUuYWRkKGxhYmVsKTsKLSAgICAKLSAgICByZXR1cm4gZmlndXJlOwotICB9ICAgIAotCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgCi0gIHsKLSAgCURyaWxsRG93bkVkaXRQYXJ0U2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgcG9saWN5ID0gbmV3IERyaWxsRG93bkVkaXRQYXJ0U2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3koKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBwb2xpY3kpOyAgICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAKLQkgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCB8fAotICAgICAgICByZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICB7Ci0gICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0gICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChoaXRUZXN0KGRyaWxsRG93bkJ1dHRvbkxhYmVsLCBwKSB8fCBoaXRUZXN0KGxhYmVsLCBwKSkKLSAgICAgICAgewotICAJCSAgICBwZXJmb3JtRHJpbGxEb3duQWN0aW9uKCk7Ci0gICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfSAgCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkgCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7ICAgCi0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0gCi0KLSAgcHVibGljIGJvb2xlYW4gaGl0VGVzdChJRmlndXJlIHRhcmdldCwgUG9pbnQgbG9jYXRpb24pCi0gIHsKLSAgICBSZWN0YW5nbGUgYiA9IHRhcmdldC5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgdGFyZ2V0LnRyYW5zbGF0ZVRvQWJzb2x1dGUoYik7ICAKLSAgICByZXR1cm4gYi5jb250YWlucyhsb2NhdGlvbik7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EcmlsbERvd25BY3Rpb24oKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgICgoV1NETENvbXBvbmVudFZpZXdlcilnZXRWaWV3ZXIoKSkuc2V0SW5wdXQoZ2V0TW9kZWwoKSk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIERyaWxsRG93bkVkaXRQYXJ0U2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgZXh0ZW5kcyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSB7Ci0gIAkgcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpCi0gIAkgIHsgICAgICAgICAgICAgIAotICAJICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCSAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsgIAotICAJICAKLSAgCSAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkKLSAgCSAgICB7Ci0gIAkgICAgICBHcmFwaGljYWxFZGl0UGFydCBncmFwaGljYWxFZGl0UGFydCA9IChHcmFwaGljYWxFZGl0UGFydCllZGl0UGFydDsKLSAgCSAgICAgIElGaWd1cmUgZmlndXJlID0gZ3JhcGhpY2FsRWRpdFBhcnQuZ2V0RmlndXJlKCk7Ci0KLSAgCSAgICAgIE1vdmVIYW5kbGVMb2NhdG9yIGxvYyA9IG5ldyBNb3ZlSGFuZGxlTG9jYXRvcihmaWd1cmUpOyAgICAKLSAgCSAgICAgIE1vdmVIYW5kbGUgbW92ZUhhbmRsZSA9IG5ldyBNb3ZlSGFuZGxlKGdyYXBoaWNhbEVkaXRQYXJ0LCBsb2MpOyAgICAgCi0gIAkgICAgICBsaXN0LmFkZChtb3ZlSGFuZGxlKTsKLSAgCSAgICB9Ci0KLSAgCSAgICByZXR1cm4gbGlzdDsKLSAgCSAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0V4dGVuc2libGVFZGl0UGFydEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9FeHRlbnNpYmxlRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYWFmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0V4dGVuc2libGVFZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5OwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnlbXSBlZGl0UGFydEZhY3RvcmllczsKLQotICBwcm90ZWN0ZWQgc3RhdGljIEV4dGVuc2libGVFZGl0UGFydEZhY3RvcnkgaW5zdGFuY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgCi0gICAgICBpbnN0YW5jZSA9IG5ldyBFeHRlbnNpYmxlRWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeSgpCi0gIHsKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCi0gICAgZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uRURJVF9QQVJUX0ZBQ1RPUlkpOyAKLSAgICBlZGl0UGFydEZhY3RvcmllcyA9IG5ldyBFZGl0UGFydEZhY3RvcnlbZXh0ZW5zaW9ucy5sZW5ndGhdOyAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgZWRpdFBhcnRGYWN0b3JpZXNbaV0gPSAoRWRpdFBhcnRGYWN0b3J5KWV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uRURJVF9QQVJUX0ZBQ1RPUlksIG51bGwpOwotICAgIH0KLSAgfSAgICAgICAgCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBnZXRBcHBsaWNhYmxlRWRpdFBhcnRGYWN0b3J5KE9iamVjdCBvYmplY3QpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEVkaXRQYXJ0RmFjdG9yeSByZXN1bHQgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uc1tpXS5pc0FwcGxpY2FibGUob2JqZWN0KSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ICA9IGVkaXRQYXJ0RmFjdG9yaWVzW2ldOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAJYm9vbGVhbiBiID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0KLSAgcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IHBhcmVudCwgT2JqZWN0IG1vZGVsKQotICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBFZGl0UGFydEZhY3RvcnkgZmFjdG9yeSA9IGdldEFwcGxpY2FibGVFZGl0UGFydEZhY3RvcnkobW9kZWwpOwotICAgIGlmIChmYWN0b3J5ICE9IG51bGwpICAgCi0gICAgewotICAgICAgcmVzdWx0ID0gZmFjdG9yeS5jcmVhdGVFZGl0UGFydChwYXJlbnQsIG1vZGVsKTsKLSAgICB9ICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IFVua25vd25PYmplY3RFZGl0UGFydCgpOwotICAgICAgcmVzdWx0LnNldE1vZGVsKG1vZGVsKTsKLSAgICAgIHJlc3VsdC5zZXRQYXJlbnQocGFyZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Hcm91cEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvR3JvdXBFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI2ZWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Hcm91cEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TY3JvbGxQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5WaWV3cG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVmlld3BvcnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuUm91bmRlZExpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguV1NETENvbXBvbmVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNvbnRhaW5lckZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29udGFpbmVyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5GaWxsTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgR3JvdXBFZGl0UGFydCBleHRlbmRzIFdTRExFZGl0UGFydAotewotICBwcm90ZWN0ZWQgU2Nyb2xsUGFuZSBzY3JvbGxwYW5lOwotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgcHJvdGVjdGVkIE9iamVjdCBlbXBoYXNpemVkTW9kZWxPYmplY3Q7Ci0gIHByb3RlY3RlZCBPYmplY3QgaW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3Q7Ci0gIHByb3RlY3RlZCBPYmplY3Qgb3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0OwotCi0gIHB1YmxpYyBXU0RMVHJlZU5vZGVFZGl0UGFydCBlbXBoYXNpemVkRWRpdFBhcnQ7Ci0gIHB1YmxpYyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGlucHV0Q29ubmVjdGlvbjsKLSAgcHVibGljIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgb3V0cHV0Q29ubmVjdGlvbjsKLQotICBwdWJsaWMgR3JvdXBFZGl0UGFydCBuZXh0R3JvdXBFZGl0UGFydDsKLSAgcHVibGljIElDb25uZWN0aW9uTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlcjsKLQotICBwcm90ZWN0ZWQgSW50ZXJuYWxGaWd1cmVMaXN0ZW5lciBmaWd1cmVMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbEZpZ3VyZUxpc3RlbmVyKCk7Ci0KLSAgY2xhc3MgSW50ZXJuYWxGaWd1cmVMaXN0ZW5lciBpbXBsZW1lbnRzIEZpZ3VyZUxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBmaWd1cmVNb3ZlZChJRmlndXJlIHNvdXJjZSkKLSAgICB7Ci0gICAgICBTY2FsYWJsZVJvb3RFZGl0UGFydCByb290ID0gKFNjYWxhYmxlUm9vdEVkaXRQYXJ0KWdldFZpZXdlcigpLmdldFJvb3RFZGl0UGFydCgpOwotICAgICAgcm9vdC5nZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKS5yZXBhaW50KCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIGVtcGhhc2l6ZWRNb2RlbE9iamVjdDsKLSAgfQotCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldERlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuICgoV1NETEdyb3VwT2JqZWN0KWdldE1vZGVsKCkpLmdldERlZmluaXRpb24oKTsKLSAgfQotCi0gIC8vcHJvdGVjdGVkIHZvaWQgc2V0RW1waGFzaXplZE9iamVjdChFZGl0UGFydCBlZGl0UGFydCkKLSAgLy97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8vICBVbmtub3duT2JqZWN0RWRpdFBhcnQgZXAgPSBudWxsOwotICAvLyAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgVW5rbm93bk9iamVjdEVkaXRQYXJ0KQotICAvLyAgewotICAvLyAgIGVwID0gKFVua25vd25PYmplY3RFZGl0UGFydCllZGl0UGFydDsKLSAgLy8gIH0KLSAgLy8KLSAgLy8gIGlmIChlbXBoYXNpemVkRWRpdFBhcnQgIT0gbnVsbCkKLSAgLy8gIHsKLSAgLy8gICAgZW1waGFzaXplZEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWQoZmFsc2UpOwotICAvLyAgfQotICAvLyAgaWYgKGVwICE9IG51bGwpCi0gIC8vICB7Ci0gIC8vICAgIGVtcGhhc2l6ZWRFZGl0UGFydCA9IGVwOwotICAvLyAgICBlbXBoYXNpemVkRWRpdFBhcnQuc2V0RW1waGFzaXplZCh0cnVlKTsKLSAgLy8gIH0KLSAgLy99ICAKLQotICBwdWJsaWMgdm9pZCBzZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgZW1waGFzaXplZE1vZGVsT2JqZWN0ID0gbW9kZWw7Ci0KLSAgICBpZiAoZW1waGFzaXplZEVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgZW1waGFzaXplZEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWQoZmFsc2UpOwotICAgIH0KLQotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0TWF0Y2hpbmdDaGlsZEVkaXRQYXJ0KG1vZGVsKTsKLSAgICBlbXBoYXNpemVkRWRpdFBhcnQgPSAoZWRpdFBhcnQgaW5zdGFuY2VvZiBXU0RMVHJlZU5vZGVFZGl0UGFydCkgPyAoV1NETFRyZWVOb2RlRWRpdFBhcnQpZWRpdFBhcnQgOiBudWxsOwotCi0gICAgaWYgKGVtcGhhc2l6ZWRFZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIGVtcGhhc2l6ZWRFZGl0UGFydC5zZXRFbXBoYXNpemVkKHRydWUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNjcm9sbFRvUmV2ZWFsRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIHNjcm9sbFRvRWRpdFBhcnQoKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNjcm9sbFRvUmV2ZWFsSW5wdXRDb25uZWN0aW9uKCkKLSAgewotICAgIGlmIChpbnB1dENvbm5lY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzY3JvbGxUb0VkaXRQYXJ0KGlucHV0Q29ubmVjdGlvbik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2Nyb2xsVG9SZXZlYWxPdXRwdXRDb25uZWN0aW9uKCkKLSAgewotICAgIGlmIChvdXRwdXRDb25uZWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgc2Nyb2xsVG9FZGl0UGFydChvdXRwdXRDb25uZWN0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBpbnB1dENvbm5lY3Rpb24gPSBnZXRNYXRjaGluZ0NoaWxkRWRpdFBhcnQobW9kZWwpOwotICAgIGlucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0ID0gbW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KCkKLSAgewotICAgIHJldHVybiBpbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KCkKLSAgewotICAgIHJldHVybiBvdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgb3V0cHV0Q29ubmVjdGlvbiA9IGdldE1hdGNoaW5nQ2hpbGRFZGl0UGFydChtb2RlbCk7Ci0gICAgb3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0ID0gbW9kZWw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb25uZWN0aW9uTWFuYWdlcigpCi0gIHsKLSAgICBzd2l0Y2ggKGdldFR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5NRVNTQUdFU19HUk9VUCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBjb25uZWN0aW9uTWFuYWdlciA9IG5ldyBNZXNzYWdlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIodGhpcyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LlNFUlZJQ0VTX0dST1VQIDoKLSAgICAgICAgewotICAgICAgICAgIGNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IFNlcnZpY2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlcih0aGlzKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuQklORElOR1NfR1JPVVAgOgotICAgICAgICB7Ci0gICAgICAgICAgY29ubmVjdGlvbk1hbmFnZXIgPSBuZXcgQmluZGluZ3NHcm91cENvbm5lY3Rpb25NYW5hZ2VyKHRoaXMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5QT1JUX1RZUEVTX0dST1VQIDoKLSAgICAgICAgewotICAgICAgICAgIGNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IFBvcnRUeXBlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIodGhpcyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSUNvbm5lY3Rpb25NYW5hZ2VyIGdldENvbm5lY3Rpb25NYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiBjb25uZWN0aW9uTWFuYWdlcjsKLSAgfQotCi0gIHB1YmxpYyBDb250YWluZXJGaWd1cmUgb3V0ZXJQYW5lOwotCi0gIHB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBjcmVhdGVDb25uZWN0aW9uTWFuYWdlcigpOwotCi0gICAgb3V0ZXJQYW5lID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIG91dGVyUGFuZS5zZXRCb3JkZXIobmV3IFJvdW5kZWRMaW5lQm9yZGVyKDEsIDYpKTsKLSAgICBvdXRlclBhbmUuc2V0Rm9yZWdyb3VuZENvbG9yKGdyb3VwQm9yZGVyQ29sb3IpOwotCi0gICAgQ29udGFpbmVyRmlndXJlIHIgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgLy9yLnNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbig0LCA0KSk7ICAgCi0gICAgci5zZXRPdXRsaW5lKGZhbHNlKTsKLSAgICByLnNldE1pbmltdW1TaXplKG5ldyBEaW1lbnNpb24oMCwgMCkpOwotCi0gICAgci5zZXRGaWxsKHRydWUpOwotCi0gICAgci5zZXRCYWNrZ3JvdW5kQ29sb3IoZ3JvdXBIZWFkZXJDb2xvcik7Ci0gICAgb3V0ZXJQYW5lLmFkZChyKTsKLQotICAgIC8vQ29udGFpbmVyRmlndXJlIGxhYmVsSG9sZGVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy9sYWJlbEhvbGRlci5hZGQobGFiZWwpOwotICAgIGxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICBsYWJlbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigyLCA0LCAyLCA0KSk7Ci0gICAgci5hZGQobGFiZWwpOyAvL0hvbGRlcik7Ci0KLSAgICBSZWN0YW5nbGVGaWd1cmUgbGluZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLSAgICBsaW5lLnNldFByZWZlcnJlZFNpemUoMjAsIDEpOwotICAgIG91dGVyUGFuZS5hZGQobGluZSk7Ci0KLSAgICBpbnQgbWluSGVpZ2h0ID0gMjUwOwotICAgIHN3aXRjaCAoZ2V0VHlwZSgpKQotICAgIHsKLSAgICAJY2FzZSBXU0RMR3JvdXBPYmplY3QuSU1QT1JUU19HUk9VUCA6Ci0JCWNhc2UgV1NETEdyb3VwT2JqZWN0LlRZUEVTX0dST1VQIDoKLQkJewotCQkJbWluSGVpZ2h0ID0gNTA7Ci0JCQlicmVhazsJCi0JCX0KLQkJY2FzZSBXU0RMR3JvdXBPYmplY3QuRVhURU5TSUJJTElUWV9FTEVNRU5UU19HUk9VUCA6Ci0JCXsKLQkJCW1pbkhlaWdodCA9IDE1MDsKLQkJCWJyZWFrOwotCQl9Ci0gICAgfQotCi0JZmluYWwgaW50IHRoZU1pbkhlaWdodCA9IG1pbkhlaWdodDsKLSAgICBGaWxsTGF5b3V0IG91dGVyTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIHBhcmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICAgICAgewotICAgICAgICBEaW1lbnNpb24gZCA9IHN1cGVyLmNhbGN1bGF0ZVByZWZlcnJlZFNpemUocGFyZW50LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgZC51bmlvbihuZXcgRGltZW5zaW9uKDEwMCwgdGhlTWluSGVpZ2h0KSk7Ci0gICAgICAgIHJldHVybiBkOwotICAgICAgfQotICAgIH07Ci0gICAgb3V0ZXJMYXlvdXQuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgLy9sYXlvdXQuc2V0U3BhY2luZyg1KTsKLSAgICBvdXRlclBhbmUuc2V0TGF5b3V0TWFuYWdlcihvdXRlckxheW91dCk7Ci0KLSAgICBzY3JvbGxwYW5lID0gbmV3IFNjcm9sbFBhbmUoKTsKLSAgICBzY3JvbGxwYW5lLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgc2Nyb2xscGFuZS5zZXRWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkoU2Nyb2xsUGFuZS5BVVRPTUFUSUMpOyAvL1Njcm9sbFBhbmUuQUxXQVlTKTsKLSAgICBvdXRlclBhbmUuYWRkKHNjcm9sbHBhbmUpOwotCi0gICAgQ29udGFpbmVyRmlndXJlIHBhbmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgcGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig1LCA4LCA1LCA4KSk7Ci0gICAgQ29udGFpbmVyTGF5b3V0IGxheW91dCA9IG5ldyBDb250YWluZXJMYXlvdXQoKTsKLSAgICBsYXlvdXQuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgbGF5b3V0LnNldFNwYWNpbmcoMCk7Ci0gICAgcGFuZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0KLSAgICBWaWV3cG9ydCB2aWV3cG9ydCA9IG5ldyBWaWV3cG9ydCgpOwotICAgIHZpZXdwb3J0LnNldENvbnRlbnRzVHJhY2tzSGVpZ2h0KHRydWUpOwotICAgIFZpZXdwb3J0TGF5b3V0IHZpZXdwb3J0TGF5b3V0ID0gbmV3IFZpZXdwb3J0TGF5b3V0KCkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgICAgIHsKLSAgICAgICAgRGltZW5zaW9uIGQgPSBzdXBlci5jYWxjdWxhdGVQcmVmZXJyZWRTaXplKHBhcmVudCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGQuaGVpZ2h0ID0gTWF0aC5taW4oZC5oZWlnaHQsIHRoZU1pbkhlaWdodCAtIDI1KTsgLy9nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICB9Ci0gICAgfTsKLSAgICB2aWV3cG9ydC5zZXRMYXlvdXRNYW5hZ2VyKHZpZXdwb3J0TGF5b3V0KTsKLQotICAgIHNjcm9sbHBhbmUuc2V0Vmlld3BvcnQodmlld3BvcnQpOwotICAgIHNjcm9sbHBhbmUuc2V0Q29udGVudHMocGFuZSk7Ci0gICAgcGFuZS5hZGRGaWd1cmVMaXN0ZW5lcihmaWd1cmVMaXN0ZW5lcik7Ci0KLSAgICByZXR1cm4gb3V0ZXJQYW5lOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBnZXRNb2RlbEFkYXB0ZXIoZ2V0TW9kZWwoKSk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsYWJlbC5zZXRUZXh0KChTdHJpbmcpYWRhcHRlci5nZXRQcm9wZXJ0eShnZXRNb2RlbCgpLCBNb2RlbEFkYXB0ZXIuTEFCRUxfUFJPUEVSVFkpKTsKLSAgICAgIC8vbGFiZWwuc2V0SWNvbigoSW1hZ2UpYWRhcHRlci5nZXRQcm9wZXJ0eShnZXRNb2RlbCgpLCBNb2RlbEFkYXB0ZXIuSU1BR0VfUFJPUEVSVFkpKTsKLSAgICB9Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBzY3JvbGxwYW5lLmdldENvbnRlbnRzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzY3JvbGxUb0VkaXRQYXJ0KGZpbmFsIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQpCi0gIHsKLSAgICBSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBzY3JvbGxUb0VkaXRQYXJ0SGVscGVyKHRhcmdldEVkaXRQYXJ0KTsKLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhyKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNjcm9sbFRvRWRpdFBhcnRIZWxwZXIoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB0YXJnZXRFZGl0UGFydCkKLSAgewotICAgIGlmICh0YXJnZXRFZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIFJlY3RhbmdsZSByMSA9IHRhcmdldEVkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotICAgICAgUmVjdGFuZ2xlIHIyID0gZ2V0Q29udGVudFBhbmUoKS5nZXRCb3VuZHMoKTsKLSAgICAgIHNjcm9sbHBhbmUuc2Nyb2xsVmVydGljYWxUbygocjEueSAtIHIyLnkpIC0gc2Nyb2xscGFuZS5nZXRCb3VuZHMoKS5oZWlnaHQgLyAyKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRNYXRjaGluZ0NoaWxkRWRpdFBhcnQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldERlZmluaXRpb24oKTsKLSAgICBmb3IgKE9iamVjdCBvID0gbW9kZWw7IG8gIT0gbnVsbCAmJiAhKG8gaW5zdGFuY2VvZiBEZWZpbml0aW9uKTsgbyA9IGdldFBhcmVudChvKSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZCgwLCBvKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldE1hdGNoaW5nQ2hpbGRFZGl0UGFydCh0aGlzLCBsaXN0LCAwLCB0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBtb2RlbCkKLSAgewotICAgIE9iamVjdCBwYXJlbnQgPSBudWxsOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgewotICAgICAgcGFyZW50ID0gKChFT2JqZWN0KW1vZGVsKS5lQ29udGFpbmVyKCk7Ci0gICAgfQotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRNYXRjaGluZ0NoaWxkRWRpdFBhcnQoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCwgTGlzdCBsaXN0LCBpbnQgaW5kZXgsIGJvb2xlYW4gZ2V0VW5leHBhbmRlZFBhcmVudCkKLSAgewotICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmVzdWx0ID0gKGdldFVuZXhwYW5kZWRQYXJlbnQgJiYgZWRpdFBhcnQgIT0gdGhpcykgPyBlZGl0UGFydCA6IG51bGw7Ci0gICAgT2JqZWN0IG1vZGVsID0gbGlzdC5zaXplKCkgPiBpbmRleCA/IGxpc3QuZ2V0KGluZGV4KSA6IG51bGw7Ci0gICAgaWYgKG1vZGVsICE9IG51bGwgJiYgZWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlZGl0UGFydC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBjaGlsZCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgICBpZiAoY2hpbGQuZ2V0TW9kZWwoKSA9PSBtb2RlbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGNoaWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRleCsrOwotICAgICAgaWYgKGluZGV4IDwgbGlzdC5zaXplKCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldE1hdGNoaW5nQ2hpbGRFZGl0UGFydChyZXN1bHQsIGxpc3QsIGluZGV4LCBnZXRVbmV4cGFuZGVkUGFyZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gKChXU0RMR3JvdXBPYmplY3QpZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotICB9Ci0KLSAgcHVibGljIEdyb3VwRWRpdFBhcnQgZ2V0TmV4dCgpCi0gIHsKLSAgICByZXR1cm4gKChEZWZpbml0aW9uRWRpdFBhcnQpZ2V0UGFyZW50KCkpLmdldE5leHRHcm91cEVkaXRQYXJ0KHRoaXMpOwotICB9Ci0KLSAgcHVibGljIEdyb3VwRWRpdFBhcnQgZ2V0UHJldmlvdXMoKQotICB7Ci0gICAgcmV0dXJuICgoRGVmaW5pdGlvbkVkaXRQYXJ0KWdldFBhcmVudCgpKS5nZXRQcmV2aW91c0dyb3VwRWRpdFBhcnQodGhpcyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3JlZnJlc2hDaGlsZHJlbigpCi0gIHsKLSAgICBpbnQgaTsKLSAgICBFZGl0UGFydCBlZGl0UGFydDsKLSAgICBPYmplY3QgbW9kZWw7Ci0KLSAgICBNYXAgbW9kZWxUb0VkaXRQYXJ0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBlZGl0UGFydCA9IChFZGl0UGFydCljaGlsZHJlbi5nZXQoaSk7Ci0gICAgICBtb2RlbFRvRWRpdFBhcnQucHV0KGVkaXRQYXJ0LmdldE1vZGVsKCksIGVkaXRQYXJ0KTsKLSAgICB9Ci0KLSAgICBMaXN0IG1vZGVsT2JqZWN0cyA9IGdldE1vZGVsQ2hpbGRyZW4oKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBtb2RlbE9iamVjdHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgbW9kZWwgPSBtb2RlbE9iamVjdHMuZ2V0KGkpOwotCi0gICAgICAvL0RvIGEgcXVpY2sgY2hlY2sgdG8gc2VlIGlmIGVkaXRQYXJ0W2ldID09IG1vZGVsW2ldCi0gICAgICBpZiAoaSA8IGNoaWxkcmVuLnNpemUoKSkKLSAgICAgIHsKLSAgICAgICAgZWRpdFBhcnQgPSAoRWRpdFBhcnQpY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICBPYmplY3QgZWRpdFBhcnRNb2RlbCA9IGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gICAgICAgIGlmIChlZGl0UGFydE1vZGVsID09IG1vZGVsKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZWRpdFBhcnRNb2RlbC5nZXRDbGFzcygpID09IG1vZGVsLmdldENsYXNzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtb2RlbFRvRWRpdFBhcnQucmVtb3ZlKGVkaXRQYXJ0TW9kZWwpOwotCi0gICAgICAgICAgaWYgKGlzQWN0aXZlKCkpCi0gICAgICAgICAgICBlZGl0UGFydC5kZWFjdGl2YXRlKCk7Ci0KLSAgICAgICAgICBlZGl0UGFydC5zZXRNb2RlbChtb2RlbCk7Ci0KLSAgICAgICAgICBpZiAoaXNBY3RpdmUoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlZGl0UGFydC5hY3RpdmF0ZSgpOwotICAgICAgICAgICAgZWRpdFBhcnQucmVmcmVzaCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvL0xvb2sgdG8gc2VlIGlmIHRoZSBFZGl0UGFydCBpcyBhbHJlYWR5IGFyb3VuZCBidXQgaW4gdGhlIHdyb25nIGxvY2F0aW9uCi0gICAgICBlZGl0UGFydCA9IChFZGl0UGFydCltb2RlbFRvRWRpdFBhcnQuZ2V0KG1vZGVsKTsKLQotICAgICAgaWYgKGVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgIHJlb3JkZXJDaGlsZChlZGl0UGFydCwgaSk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vQW4gZWRpdHBhcnQgZm9yIHRoaXMgbW9kZWwgZG9lc24ndCBleGlzdCB5ZXQuICBDcmVhdGUgYW5kIGluc2VydCBvbmUuCi0gICAgICAgIGVkaXRQYXJ0ID0gY3JlYXRlQ2hpbGQobW9kZWwpOwotICAgICAgICBhZGRDaGlsZChlZGl0UGFydCwgaSk7Ci0gICAgICB9Ci0gICAgfQotICAgIExpc3QgdHJhc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yICg7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICAgIHRyYXNoLmFkZChjaGlsZHJlbi5nZXQoaSkpOwotICAgIGZvciAoaSA9IDA7IGkgPCB0cmFzaC5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBFZGl0UGFydCBlcCA9IChFZGl0UGFydCl0cmFzaC5nZXQoaSk7Ci0gICAgICByZW1vdmVDaGlsZChlcCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaENoaWxkcmVuKCkKLSAgewotICAgIGJvb2xlYW4gcmV1c2VDaGlsZHJlbiA9IGZhbHNlOwotICAgIGlmIChnZXRWaWV3ZXIoKSBpbnN0YW5jZW9mIFdTRExDb21wb25lbnRWaWV3ZXIpCi0gICAgewotICAgICAgV1NETENvbXBvbmVudFZpZXdlciB3c2RsQ29tcG9uZW50Vmlld2VyID0gKFdTRExDb21wb25lbnRWaWV3ZXIpZ2V0Vmlld2VyKCk7Ci0gICAgICByZXVzZUNoaWxkcmVuID0gd3NkbENvbXBvbmVudFZpZXdlci5pc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZCgpOwotICAgIH0KLQotICAgIGlmIChyZXVzZUNoaWxkcmVuKQotICAgIHsKLSAgICAgIF9yZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9JQ29ubmVjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9JQ29ubmVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQwZDBhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvSUNvbm5lY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLQotcHVibGljIGludGVyZmFjZSBJQ29ubmVjdGlvbk1hbmFnZXIKLXsgCi0gIHB1YmxpYyB2b2lkIHByb3BhZ2F0ZUZvcndhcmQoT2JqZWN0IG1vZGVsKTsKLSAgcHVibGljIHZvaWQgcHJvcGFnYXRlQmFjayhPYmplY3QgbW9kZWwpOwotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZE1vZGVsT2JqZWN0KE9iamVjdCBtb2RlbCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0lGZWVkYmFja0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9JRmVlZGJhY2tIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YWMyYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0lGZWVkYmFja0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGZWVkYmFja0hhbmRsZXIKLXsKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKTsKLX0gICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9NZXNzYWdlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9NZXNzYWdlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxNDU1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvTWVzc2FnZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFN3aXRjaDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uTWFuYWdlcgoteyAKLSAgcHVibGljIE1lc3NhZ2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlcihHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQpCi0gIHsKLSAgICBzdXBlcihncm91cEVkaXRQYXJ0KTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAKLSAgY2xhc3MgSW50ZXJuYWxXU0RMU3dpdGNoIGV4dGVuZHMgV1NETFN3aXRjaAotICB7ICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlRmF1bHQoRmF1bHQgZmF1bHQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGZhdWx0LmdldEVNZXNzYWdlKCkpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChmYXVsdC5nZXRFTWVzc2FnZSgpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEZpcnN0UGFydChmYXVsdC5nZXRFTWVzc2FnZSgpKSk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gCi0gICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgaW5wdXQpCi0gICAgeyAgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGlucHV0LmdldEVNZXNzYWdlKCkpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChpbnB1dC5nZXRFTWVzc2FnZSgpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEZpcnN0UGFydChpbnB1dC5nZXRFTWVzc2FnZSgpKSk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgIAotCi0gICAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpCi0gICAgeyAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChtZXNzYWdlKTsgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChtZXNzYWdlKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEZpcnN0UGFydChtZXNzYWdlKSk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gCi0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlT3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gICAgeyAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChvdXRwdXQuZ2V0RU1lc3NhZ2UoKSk7ICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3Qob3V0cHV0LmdldEVNZXNzYWdlKCkpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZ2V0Rmlyc3RQYXJ0KG91dHB1dC5nZXRFTWVzc2FnZSgpKSk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyBPYmplY3QgY2FzZVBhcnQoUGFydCBwYXJ0KQotICAgIHsgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QocGFydC5lQ29udGFpbmVyKCkpOyAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KHBhcnQuZUNvbnRhaW5lcigpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KHBhcnQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9IAotICAgICAgCi0gICAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAgCi0KLSAgICBwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkKLSAgICB7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gc3VwZXIuZG9Td2l0Y2godGhlRU9iamVjdCk7Ci0gICAgICAoKERlZmluaXRpb25FZGl0UGFydClncm91cEVkaXRQYXJ0LmdldFBhcmVudCgpKS5nZXRQYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0KCkuc2V0SW5wdXQoZ3JvdXBFZGl0UGFydC5nZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoKSk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBXU0RMU3dpdGNoIGNyZWF0ZVN3aXRjaChpbnQgc2VsZWN0aW9uVHlwZSkKLSAgewotICAgIHJldHVybiBuZXcgSW50ZXJuYWxXU0RMU3dpdGNoKCk7Ci0gIH0gICAKLQotICBwcm90ZWN0ZWQgUGFydCBnZXRGaXJzdFBhcnQoTWVzc2FnZSBtZXNzYWdlKQotICB7ICAgICAgICAgICAKLSAgICBQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICB7ICAgIAotICAgICAgTGlzdCBwYXJ0cyA9IG1lc3NhZ2UuZ2V0RVBhcnRzKCk7Ci0gICAgICByZXN1bHQgPSAocGFydHMuc2l6ZSgpID4gMCkgPyAoUGFydClwYXJ0cy5nZXQoMCkgOiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwcm9wYWdhdGVCYWNrVG9QcmV2aW91cyhPYmplY3QgbW9kZWwpCi0gIHsgIAkKLSAgCW1vZGVsID0gKG1vZGVsIGluc3RhbmNlb2YgUGFydCkgPygoUGFydCltb2RlbCkuZUNvbnRhaW5lcigpIDogbW9kZWw7IAotICAgIHN1cGVyLnByb3BhZ2F0ZUJhY2tUb1ByZXZpb3VzKG1vZGVsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Ob3RBdmFpbGFibGVNZXNzYWdlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Ob3RBdmFpbGFibGVNZXNzYWdlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0YTUwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvTm90QXZhaWxhYmxlTWVzc2FnZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIE5vdEF2YWlsYWJsZU1lc3NhZ2VFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgCi17ICAgICAgICAgICAgCi0gIHB1YmxpYyBOb3RBdmFpbGFibGVNZXNzYWdlRWRpdFBhcnQoKQotICB7Ci0gIH0gICAKLSAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVklFV19OT1RfQVZBSUxBQkxFIikpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfSAgICAKLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgCi0gIHsgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfSAgICAKLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgeyAgCi0gIH0gICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvUGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1BhcnRSZWZlcmVuY2VTZWN0aW9uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQwMjkzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvUGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5Db250YWluZXJGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi1wdWJsaWMgY2xhc3MgUGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydCBleHRlbmRzIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgoteyAKLSAgcHJvdGVjdGVkIE9iamVjdCBpbnB1dDsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENvbnRhaW5lckZpZ3VyZSBvdXRlciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsgCi0gICAgcmV0dXJuIG91dGVyOwotICB9IAotCi0gIHByb3RlY3RlZCB2b2lkIHNldElucHV0KE9iamVjdCBvYmplY3QpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGlucHV0LCB0aGlzKTsKLQkgIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGRlZmluaXRpb24sIHRoaXMpOwotICAgIH0KLSAgICBpbnB1dCA9IG9iamVjdDsKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRNb2RlbEFkYXB0ZXJMaXN0ZW5lcihpbnB1dCwgdGhpcyk7Ci0JICBkZWZpbml0aW9uID0gZ2V0UGFyZW50KCkgIT0gbnVsbCA/IChEZWZpbml0aW9uKWdldFBhcmVudCgpLmdldE1vZGVsKCkgOiBudWxsOwotICAgICAgYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoZGVmaW5pdGlvbiwgdGhpcyk7Ci0gICAgfQotICAgIHJlZnJlc2goKTsKLSAgICBnZXRGaWd1cmUoKS5yZXBhaW50KCk7Ci0gIH0KLSAgCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIAotCSAgeyAgICAgICAKLQkJICBpZiAoaW5wdXQgIT0gbnVsbCkKLQkJICB7IAkKLQkgICAgICAgIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGlucHV0LCB0aGlzKTsKLQkgICAgICAgIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGRlZmluaXRpb24sIHRoaXMpOwotCQkgIH0gIAotCQkJc3VwZXIuZGVhY3RpdmF0ZSgpOyAKLQkJfSAgCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7IAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYXJ0KQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KWlucHV0OwotICAgICAgT2JqZWN0IGNvbXBvbmVudCA9IHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE8uLi4gaSdtIHB1bGxpbmcgYSBmYXN0IG9uZSBoZXJlLi4uLiB3ZSBzaG91bGQgY2FsbCB0aGUgZXh0ZW5zaW9uCi0gICAgICAgIC8vIHRvIHNlZSBpZiBoZSB3YW50cyB0byBzaG93IGEgY2hpbGQgaGVyZQotICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gVGhpcyBpcyBiZWZvcmUgdGhlIG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbCBtb2RlbAotICAgICAgICAvLyB3aGVyZSBpdCBoYW5kbGVkIERPTSBub2RlcwotICAgICAgICAvLyBjb21wb25lbnQgPSBwYXJ0LmdldEVsZW1lbnQoKTsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gcGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgaWYgKGVkICE9IG51bGwgJiYgZWQuZ2V0Q29udGFpbmVyKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGVkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci0gICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIAotICB7Ci0gIH0gICAgICAgCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkgCi0gIHsKLSAgICByZXR1cm4gZ2V0RWRpdFBhcnRGYWN0b3J5KCkuY3JlYXRlRWRpdFBhcnQodGhpcywgbW9kZWwpOwotICB9IAotCi0gIHByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgZ2V0RWRpdFBhcnRGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBFeHRlbnNpYmxlRWRpdFBhcnRGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgIHJlZnJlc2hDaGlsZHJlbigpOwotICB9ICAKLQotICBwcm90ZWN0ZWQgTW9kZWxBZGFwdGVyIGdldE1vZGVsQWRhcHRlcihPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICByZXR1cm4gV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZ2V0QWRhcHRlcihtb2RlbE9iamVjdCk7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0TW9kZWxBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gIH0gIAotCi19ICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1BvcnRUeXBlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Qb3J0VHlwZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NTIwZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1BvcnRUeXBlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMU3dpdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExHcm91cE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIFBvcnRUeXBlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3Rpb25NYW5hZ2VyCi17IAotICBwdWJsaWMgUG9ydFR5cGVzR3JvdXBDb25uZWN0aW9uTWFuYWdlcihHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQpCi0gIHsKLSAgICBzdXBlcihncm91cEVkaXRQYXJ0KTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgCi0gIGNsYXNzIEludGVybmFsV1NETFN3aXRjaCBleHRlbmRzIFdTRExTd2l0Y2gKLSAgeyAgICAgICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNCaW5kaW5nR3JvdXBTaG93aW5nKCkKLSAgICB7Ci0gICAgICBHcm91cEVkaXRQYXJ0IHByZXZHcm91cEVkaXRQYXJ0ID0gZ3JvdXBFZGl0UGFydC5nZXRQcmV2aW91cygpOwotICAgICAgcmV0dXJuIHByZXZHcm91cEVkaXRQYXJ0ICAhPSBudWxsICYmIHByZXZHcm91cEVkaXRQYXJ0LmdldFR5cGUoKSA9PSBXU0RMR3JvdXBPYmplY3QuQklORElOR1NfR1JPVVA7Ci0gICAgfSAKLQotICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgT2JqZWN0IHBvcnRUeXBlID0gZ2V0UG9ydFR5cGVGb3JCaW5kaW5nT2JqZWN0KGJpbmRpbmcpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QocG9ydFR5cGUpOyAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChwb3J0VHlwZSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgCi0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0UG9ydFR5cGVGb3JCaW5kaW5nT2JqZWN0KGJpbmRpbmdGYXVsdCkpOwotICAgICAgRmF1bHQgZmF1bHQgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVGYXVsdChiaW5kaW5nRmF1bHQpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChmYXVsdCk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChmYXVsdCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gCi0gICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCkKLSAgICB7ICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0UG9ydFR5cGVGb3JCaW5kaW5nT2JqZWN0KGJpbmRpbmdJbnB1dCkpOyAKLSAgICAgIElucHV0IGlucHV0ID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlSW5wdXQoYmluZGluZ0lucHV0KTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoaW5wdXQpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoaW5wdXQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0gICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGdldFBvcnRUeXBlRm9yQmluZGluZ09iamVjdChiaW5kaW5nT3BlcmF0aW9uKSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KENvbXBvbmVudFJlZmVyZW5jZVV0aWwuY29tcHV0ZU9wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfQotICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGdldFBvcnRUeXBlRm9yQmluZGluZ09iamVjdChiaW5kaW5nT3V0cHV0KSk7Ci0gICAgICBPdXRwdXQgb3V0cHV0ID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlT3V0cHV0KGJpbmRpbmdPdXRwdXQpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChvdXRwdXQpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3Qob3V0cHV0KTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUZhdWx0KEZhdWx0IGZhdWx0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShmYXVsdCkpOyAgIAotICAgICAgaWYgKGlzQmluZGluZ0dyb3VwU2hvd2luZygpKQotICAgICAgewotICAgICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGZhdWx0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShmYXVsdCkpOwotICAgICAgfQotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZmF1bHQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9IAotICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUlucHV0KElucHV0IGlucHV0KQotICAgIHsgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShpbnB1dCkpOyAgIAotICAgICAgaWYgKGlzQmluZGluZ0dyb3VwU2hvd2luZygpKQotICAgICAgewotICAgICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGlucHV0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShpbnB1dCkpOwotICAgICAgfQotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoaW5wdXQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAKLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkKLSAgICB7Ci0gICAgICBPYmplY3QgcHJldmlvdXNDb250ZXh0ID0gZ3JvdXBFZGl0UGFydC5nZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoKTsKLSAgICAgIGlmIChwcmV2aW91c0NvbnRleHQgPT0gbnVsbCkgICAgICAKLSAgICAgIHsKLSAgICAgICAgcHJldmlvdXNDb250ZXh0ID0gZ3JvdXBFZGl0UGFydC5nZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgRU9iamVjdCBtZXNzYWdlUmVmZXJlbmNlID0gbnVsbDsgICAgICAKLSAgICAgIGlmIChwcmV2aW91c0NvbnRleHQgPT0gbnVsbCB8fCBwcmV2aW91c0NvbnRleHQgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgICAgewotICAgICAgbWVzc2FnZVJlZmVyZW5jZSA9IGdldE1lc3NhZ2VSZWZlcmVuY2UobWVzc2FnZSwgKEVPYmplY3QpcHJldmlvdXNDb250ZXh0KTsKLSAgICAgIH0KLQotICAgICAgaWYgKG1lc3NhZ2VSZWZlcmVuY2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZG9Td2l0Y2gobWVzc2FnZVJlZmVyZW5jZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICBkZWZhdWx0Q2FzZShudWxsKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgCi0gICAgICAgICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikgCi0gICAgeyAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nUG9ydFR5cGUob3BlcmF0aW9uKSk7Ci0gICAgICBpZiAoaXNCaW5kaW5nR3JvdXBTaG93aW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3Qob3BlcmF0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShvcGVyYXRpb24pKTsKLSAgICAgIH0KLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOyAgICAgIAotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0gICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlT3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gICAgeyAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShvdXRwdXQpKTsgICAKLSAgICAgIGlmIChpc0JpbmRpbmdHcm91cFNob3dpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChvdXRwdXQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEVuY2xvc2luZ1BvcnRUeXBlKG91dHB1dCkpOwotICAgICAgfQotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3Qob3V0cHV0KTsgIAotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlUG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gICAgeyAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KHBvcnRUeXBlKTsgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KHBvcnRUeXBlKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAKLQotICAgIHB1YmxpYyBPYmplY3QgY2FzZVBvcnQoUG9ydCBwb3J0KQotICAgIHsgICAgICAgICAgCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGJpbmRpbmcgIT0gbnVsbCA/IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCkgOiBudWxsOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QocG9ydFR5cGUpOyAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KHBvcnRUeXBlKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChudWxsKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBXU0RMU3dpdGNoIGNyZWF0ZVN3aXRjaChpbnQgc2VsZWN0aW9uVHlwZSkKLSAgewotICAgIHJldHVybiBuZXcgSW50ZXJuYWxXU0RMU3dpdGNoKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgUG9ydFR5cGUgZ2V0UG9ydFR5cGVGb3JCaW5kaW5nT2JqZWN0KEVPYmplY3Qgb2JqZWN0KQotICB7IAotICAgIEJpbmRpbmcgYmluZGluZyA9IGdldEVuY2xvc2luZ0JpbmRpbmcob2JqZWN0KTsKLSAgICByZXR1cm4gYmluZGluZy5nZXRFUG9ydFR5cGUoKTsKLSAgfSAgIAotICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHByb3BhZ2F0ZUZvcndhcmQoT2JqZWN0IG1vZGVsKQotICB7IAotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsKLSAgICAgIFdTRExTd2l0Y2ggdGhlU3dpdGNoID0gY3JlYXRlU3dpdGNoKFBST1BBR0FURV9GT1JXQVJEKTsKLSAgICAgIHRoZVN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCltb2RlbCk7ICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zY3JvbGxUb1JldmVhbElucHV0Q29ubmVjdGlvbigpOwotICAgIH0gICAgICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlbW92ZUNvbm5lY3Rpb25zKCk7Ci0gICAgfQotCi0gICAgT2JqZWN0IG8gPSBncm91cEVkaXRQYXJ0LmdldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdCgpOwotICAgIHByb3BhZ2F0ZUZvcndhcmRUb05leHQobyAhPSBudWxsID8gbyA6IG1vZGVsKTsgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHByb3BhZ2F0ZUJhY2tUb1ByZXZpb3VzKE9iamVjdCBtb2RlbCkKLSAgewotICAgIG1vZGVsID0gKG1vZGVsIGluc3RhbmNlb2YgTWVzc2FnZSkgPyBncm91cEVkaXRQYXJ0LmdldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KCkgOiBtb2RlbDsgCi0gICAgc3VwZXIucHJvcGFnYXRlQmFja1RvUHJldmlvdXMobW9kZWwpOwotICB9IAotICAKLQotICBwcm90ZWN0ZWQgTWVzc2FnZSBnZXRSZWZlcmVuY2VkTWVzc2FnZShFT2JqZWN0IG8pCi0gIHsgICAgICAKLSAgICBNZXNzYWdlIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBJbnB1dCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKElucHV0KW8pLmdldEVNZXNzYWdlKCk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIE91dHB1dCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKE91dHB1dClvKS5nZXRFTWVzc2FnZSgpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKEZhdWx0KW8pLmdldEVNZXNzYWdlKCk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzTWF0Y2hpbmdNZXNzYWdlUmVmZXJlbmNlKEVPYmplY3QgbWVzc2FnZVJlZmVyZW5jZSwgTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgTWVzc2FnZSBtID0gZ2V0UmVmZXJlbmNlZE1lc3NhZ2UobWVzc2FnZVJlZmVyZW5jZSk7Ci0gICAgcmV0dXJuIChtICE9IG51bGwpICYmIChtID09IG1lc3NhZ2VSZWZlcmVuY2UpOwotICB9Ci0gIAotICBwdWJsaWMgRU9iamVjdCBnZXRNZXNzYWdlUmVmZXJlbmNlKE1lc3NhZ2UgbWVzc2FnZSwgRU9iamVjdCBwcmV2Q29udGV4dCkKLSAgewotICAgIEVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgUG9ydFR5cGUgcHJldlBvcnRUeXBlID0gZ2V0RW5jbG9zaW5nUG9ydFR5cGUocHJldkNvbnRleHQpOwotICAgIE9wZXJhdGlvbiBwcmV2T3BlcmF0aW9uID0gZ2V0RW5jbG9zaW5nT3BlcmF0aW9uKHByZXZDb250ZXh0KTsgIAotICAgIEVPYmplY3QgcHJldk1lc3NhZ2VSZWZlcmVuY2UgPSBnZXRNZXNzYWdlUmVmZXJlbmNlKHByZXZDb250ZXh0KTsKLSAgICAKLSAgICBpZiAocHJldlBvcnRUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0TWVzc2FnZVJlZmVyZW5jZShtZXNzYWdlLCBwcmV2UG9ydFR5cGUsIHByZXZPcGVyYXRpb24sIHByZXZNZXNzYWdlUmVmZXJlbmNlKTsgIAotICAgIH0gICAKLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgeyAgICAKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdyb3VwRWRpdFBhcnQuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZGVmaW5pdGlvbik7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB1dGlsLmdldFBvcnRUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKWkubmV4dCgpOyAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IGdldE1lc3NhZ2VSZWZlcmVuY2UobWVzc2FnZSwgcG9ydFR5cGUsIG51bGwsIG51bGwpOyAgCi0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgRU9iamVjdCBnZXRNZXNzYWdlUmVmZXJlbmNlKE1lc3NhZ2UgbWVzc2FnZSwgUG9ydFR5cGUgcG9ydFR5cGUsIE9wZXJhdGlvbiBwcmV2T3BlcmF0aW9uLCBFT2JqZWN0IHByZXZNZXNzYWdlUmVmZXJlbmNlKQotICB7Ci0gICAgRU9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChwcmV2TWVzc2FnZVJlZmVyZW5jZSAhPSBudWxsICYmIGlzTWF0Y2hpbmdNZXNzYWdlUmVmZXJlbmNlKHByZXZNZXNzYWdlUmVmZXJlbmNlLCBtZXNzYWdlKSkgCi0gICAgewotICAgICAgcmVzdWx0ID0gcHJldk1lc3NhZ2VSZWZlcmVuY2U7Ci0gICAgfQotICAgICAgCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsICYmIHByZXZPcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBnZXRNZXNzYWdlUmVmZXJlbmNlKG1lc3NhZ2UsIHByZXZPcGVyYXRpb24pOyAgICAgICAKLSAgICB9Ci0gICAgICAgICAgICAKLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7IAotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbilpLm5leHQoKTsKLSAgICAgICAgcmVzdWx0ID0gZ2V0TWVzc2FnZVJlZmVyZW5jZShtZXNzYWdlLCBvcGVyYXRpb24pOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsgICAgCi0gIH0gCi0gIAotICBwdWJsaWMgRU9iamVjdCBnZXRNZXNzYWdlUmVmZXJlbmNlKE1lc3NhZ2UgbWVzc2FnZSwgT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIEVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBJbnB1dCBpbnB1dCA9IG9wZXJhdGlvbi5nZXRFSW5wdXQoKTsKLSAgICBPdXRwdXQgb3V0cHV0ID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKTsgCi0gICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZ2V0TWVzc2FnZSgpID09IG1lc3NhZ2UpCi0gICAgewotICAgICAgcmVzdWx0ID0gaW5wdXQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKG91dHB1dCAhPSBudWxsICYmIG91dHB1dC5nZXRNZXNzYWdlKCkgPT0gbWVzc2FnZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBvdXRwdXQ7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvcGVyYXRpb24uZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgRmF1bHQgZmF1bHQgPSAoRmF1bHQpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChmYXVsdC5nZXRNZXNzYWdlKCkgPT0gbWVzc2FnZSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGZhdWx0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsgICAgICAgIAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1NlcnZpY2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1NlcnZpY2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzk1NDNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9TZXJ2aWNlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFN3aXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIFNlcnZpY2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbk1hbmFnZXIKLXsgICAKLSAgcHVibGljIFNlcnZpY2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlcihHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQpCi0gIHsKLSAgICBzdXBlcihncm91cEVkaXRQYXJ0KTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIAotICBwcm90ZWN0ZWQgY2xhc3MgSW50ZXJuYWxXU0RMU3dpdGNoIGV4dGVuZHMgV1NETFN3aXRjaAotICB7Ci0gICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIGhhbmRsZUJpbmRpbmdIZWxwZXIoYmluZGluZyk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgICAgICAKLQotICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0KQotICAgIHsgICAgCi0gICAgICBoYW5kbGVCaW5kaW5nSGVscGVyKGdldEVuY2xvc2luZ0JpbmRpbmcoYmluZGluZ0ZhdWx0KSk7IAotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCkKLSAgICB7ICAgIAotICAgICAgaGFuZGxlQmluZGluZ0hlbHBlcihnZXRFbmNsb3NpbmdCaW5kaW5nKGJpbmRpbmdJbnB1dCkpOyAKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfQotICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBoYW5kbGVCaW5kaW5nSGVscGVyKGdldEVuY2xvc2luZ0JpbmRpbmcoYmluZGluZ09wZXJhdGlvbikpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0gICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgaGFuZGxlQmluZGluZ0hlbHBlcihnZXRFbmNsb3NpbmdCaW5kaW5nKGJpbmRpbmdPdXRwdXQpKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgIAotCi0gICAgcHVibGljIE9iamVjdCBjYXNlRmF1bHQoRmF1bHQgZmF1bHQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGhhbmRsZVBvcnRUeXBlSGVscGVyKGdldEVuY2xvc2luZ1BvcnRUeXBlKGZhdWx0KSk7ICAgCi0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gCi0gICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgaW5wdXQpCi0gICAgeyAgICAgICAKLSAgICAgIGhhbmRsZVBvcnRUeXBlSGVscGVyKGdldEVuY2xvc2luZ1BvcnRUeXBlKGlucHV0KSk7ICAgCi0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgIAotICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pIAotICAgIHsgICAgICAKLSAgICAgIGhhbmRsZVBvcnRUeXBlSGVscGVyKGdldEVuY2xvc2luZ1BvcnRUeXBlKG9wZXJhdGlvbikpOyAgICAKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfQotICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZU91dHB1dChPdXRwdXQgb3V0cHV0KQotICAgIHsgIAotICAgICAgaGFuZGxlUG9ydFR5cGVIZWxwZXIoZ2V0RW5jbG9zaW5nUG9ydFR5cGUob3V0cHV0KSk7ICAgCi0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gIAotCi0gICAJcHVibGljIE9iamVjdCBjYXNlUG9ydChQb3J0IHBvcnQpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChwb3J0KTsgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QocG9ydCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAKLQotICAgCXB1YmxpYyBPYmplY3QgY2FzZVBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICAgIHsgICAgICAgICAgIAotICAgICAgaGFuZGxlUG9ydFR5cGVIZWxwZXIocG9ydFR5cGUpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAgICAgIAotICAgICAgICAKLSAgIAlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgICAgICAgCi0KLSAgICAvLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVBvcnRUeXBlSGVscGVyKFBvcnRUeXBlIHBvcnRUeXBlKQotICAgIHsgICAgICAgCi0gICAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkKLSAgICAgIHsgCi0gICAgICAgIFBvcnQgcG9ydCA9IG51bGw7ICAgCi0gICAgICAgIE9iamVjdCBwcmV2aW91c0NvbnRleHQgPSBncm91cEVkaXRQYXJ0LmdldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdCgpOwotICAgICAgICBpZiAocHJldmlvdXNDb250ZXh0ID09IG51bGwpICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICBwcmV2aW91c0NvbnRleHQgPSBncm91cEVkaXRQYXJ0LmdldEVtcGhhc2l6ZWRNb2RlbE9iamVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmV2aW91c0NvbnRleHQgaW5zdGFuY2VvZiBQb3J0KQotICAgICAgICB7Ci0gICAgICAgICAgUG9ydCBwcmV2aW91c1BvcnQgPSAoUG9ydClwcmV2aW91c0NvbnRleHQ7Ci0gICAgICAgICAgaWYgKHByZXZpb3VzUG9ydC5nZXRFQmluZGluZygpICE9IG51bGwgJiYgcHJldmlvdXNQb3J0LmdldEVCaW5kaW5nKCkuZ2V0RVBvcnRUeXBlKCkgPT0gcG9ydFR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgcG9ydCA9IHByZXZpb3VzUG9ydDsKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgaWYgKHBvcnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGdyb3VwRWRpdFBhcnQuZ2V0RGVmaW5pdGlvbigpKTsgICAgICAgICAgIAotICAgICAgICAgIExpc3QgbGlzdCA9IHV0aWwuZ2V0UG9ydHNGb3JQb3J0VHlwZShwb3J0VHlwZSk7ICAgICAgICAgIAotICAgICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgcG9ydCA9IChQb3J0KWxpc3QuZ2V0KDApOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QocG9ydCk7ICAgICAKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QocG9ydCk7Ci0gICAgICB9IAotICAgIH0gICAKLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUJpbmRpbmdIZWxwZXIoQmluZGluZyBiaW5kaW5nKQotICAgIHsgICAgICAgCi0gICAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChncm91cEVkaXRQYXJ0LmdldERlZmluaXRpb24oKSk7Ci0gICAgICAgIExpc3QgbGlzdCA9IHV0aWwuZ2V0UG9ydHNGb3JCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICBQb3J0IHBvcnQgPSBudWxsOwotICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcG9ydCA9IChQb3J0KWxpc3QuZ2V0KDApOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QocG9ydCk7ICAgICAKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QocG9ydCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFdTRExTd2l0Y2ggY3JlYXRlU3dpdGNoKGludCBzZWxlY3Rpb25UeXBlKQotICB7Ci0gICAgcmV0dXJuIG5ldyBJbnRlcm5hbFdTRExTd2l0Y2goKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9UcmVlTm9kZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvVHJlZU5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTc5OWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9UcmVlTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZWRpdHBhcnRzLkludGVyYWN0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNvbnRhaW5lckZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5HcmFwaGljc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5XU0RMQ29tcG9uZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5XU0RMU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuVHJlZU5vZGVDb250ZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyZWVOb2RlRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGltcGxlbWVudHMgTW9kZWxBZGFwdGVyTGlzdGVuZXIsIEdyYXBoaWNzQ29uc3RhbnRzLCBJRmVlZGJhY2tIYW5kbGVyCi17Ci0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsMjsKLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSBsYWJlbEhvbGRlciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgcHJvdGVjdGVkIFRyZWVOb2RlQ29udGVudEZpZ3VyZSBjb250ZW50RmlndXJlOwotICBwcm90ZWN0ZWQgSW50ZXJhY3RvckhlbHBlciBpbnRlcmFjdG9ySGVscGVyOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGVkID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHkgPSBmYWxzZTsKLQotICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpCi0gIHsKLSAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgIGFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKGdldE1vZGVsKCksIHRoaXMpOwotICAgIC8vdmlld2VyID0gZ2V0Vmlld2VyKCk7Ci0gIH0KLQotICBpbnQgcmVtb3ZlTm90aWZ5Q291bnQgPSAwOwotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmeSgpCi0gIHsKLSAgICByZW1vdmVOb3RpZnlDb3VudCsrOwotICAgIGlmIChyZW1vdmVOb3RpZnlDb3VudCA9PSAxKQotICAgIHsKLSAgICAgIHN1cGVyLnJlbW92ZU5vdGlmeSgpOwotICAgIH0KLSAgfQotCi0gIC8qKiAKLSAgICogQXBhcnQgZnJvbSB0aGUgZGVhY3RpdmF0aW9uIGRvbmUgaW4gc3VwZXIsIHRoZSBzb3VyY2UKLSAgICogYW5kIHRhcmdldCBjb25uZWN0aW9ucyBhcmUgZGVhY3RpdmF0ZWQsIGFuZCB0aGUgdmlzdWFsCi0gICAqIHBhcnQgb2YgdGhlIHRoaXMgaXMgcmVtb3ZlZC4KLSAgICoKLSAgICogQHNlZSAjYWN0aXZhdGUoKSAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0gICAgcmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIoZ2V0TW9kZWwoKSwgdGhpcyk7Ci0gICAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIC8vU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHBvbGljeSA9IG5ldyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwoKTsKLSAgICAvL2luc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHBvbGljeSk7Ci0KLSAgICBTZWxlY3Rpb25FZGl0UG9saWN5IGZlZWRCYWNrU2VsZWN0aW9uRWRpdFBvbGljeSA9IG5ldyBXU0RMU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgZmVlZEJhY2tTZWxlY3Rpb25FZGl0UG9saWN5KTsKLSAgfQotCi0gIHByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVDaGlsZChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWRpdFBhcnRGYWN0b3J5KCkuY3JlYXRlRWRpdFBhcnQodGhpcywgbW9kZWwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGlmIChwcm9wZXJ0eSA9PSBNb2RlbEFkYXB0ZXIuQ0hJTERSRU5fUFJPUEVSVFkpCi0gICAgewotICAgICAgcmVmcmVzaENoaWxkcmVuKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5ID09IE1vZGVsQWRhcHRlci5ERVRBSUxfUFJPUEVSVFkpCi0gICAgewotICAgICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlZnJlc2hDaGlsZHJlbigpOwotICAgICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgY3JlYXRlQ29udGVudEZpZ3VyZSgpOwotICAgIGNyZWF0ZUZpZ3VyZUNvbnRlbnQoKTsKLSAgICByZXR1cm4gY29udGVudEZpZ3VyZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRGaWd1cmUoKQotICB7Ci0gICAgY29udGVudEZpZ3VyZSA9IG5ldyBUcmVlTm9kZUNvbnRlbnRGaWd1cmUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZ3VyZUNvbnRlbnQoKQotICB7Ci0gICAgLy8gYWRkIGEgYml0IG9mIHNwYWNlIGJldHdlZW4gdGhlIGludGVyYWN0b3IgYW5kIGljb24KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAKLSAgICBSZWN0YW5nbGVGaWd1cmUgc3BhY2UgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0gICAgc3BhY2Uuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgc3BhY2Uuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDMsIDMpKTsKLSAgICBjb250ZW50RmlndXJlLmdldEljb25BcmVhKCkuYWRkKHNwYWNlKTsKLQotICAgIGxhYmVsSG9sZGVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIGxhYmVsSG9sZGVyLnNldEZpbGwodHJ1ZSk7Ci0gICAgY29udGVudEZpZ3VyZS5nZXRJY29uQXJlYSgpLmFkZChsYWJlbEhvbGRlcik7Ci0KLSAgICBsYWJlbCA9IG5ldyBMYWJlbChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9VTktOT1dOX09CSkVDVCIpKTsKLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIGxhYmVsSG9sZGVyLmFkZChsYWJlbCk7Ci0KLSAgICBpbnRlcmFjdG9ySGVscGVyID0gbmV3IEludGVyYWN0b3JIZWxwZXIodGhpcywgY29udGVudEZpZ3VyZS5nZXRJbnRlcmFjdG9yKCksIGNvbnRlbnRGaWd1cmUuZ2V0SW5uZXJDb250ZW50QXJlYSgpKTsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBjb250ZW50RmlndXJlLmdldElubmVyQ29udGVudEFyZWEoKTsKLSAgfQotCi0gIHB1YmxpYyBDb2xvciBjb21wdXRlTGFiZWxDb2xvcigpCi0gIHsKLSAgICBDb2xvciBjb2xvciA9IENvbG9yQ29uc3RhbnRzLmJsYWNrOwotICAgIGlmIChpc1NlbGVjdGVkKQotICAgIHsKLSAgICAgIGNvbG9yID0gQ29sb3JDb25zdGFudHMud2hpdGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29sb3IgPSBDb2xvckNvbnN0YW50cy5ncmF5OwotICAgIH0KLSAgICByZXR1cm4gY29sb3I7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihnZXRNb2RlbCgpKTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGlzUmVhZE9ubHkgPSBCb29sZWFuLlRSVUUuZXF1YWxzKGFkYXB0ZXIuZ2V0UHJvcGVydHkoZ2V0TW9kZWwoKSwgImlzUmVhZE9ubHkiKSk7Ci0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoY29tcHV0ZUxhYmVsQ29sb3IoKSk7Ci0gICAgICBsYWJlbC5zZXRUZXh0KChTdHJpbmcpYWRhcHRlci5nZXRQcm9wZXJ0eShnZXRNb2RlbCgpLCBNb2RlbEFkYXB0ZXIuTEFCRUxfUFJPUEVSVFkpKTsKLSAgICAgIGxhYmVsLnNldEljb24oKEltYWdlKWFkYXB0ZXIuZ2V0UHJvcGVydHkoZ2V0TW9kZWwoKSwgTW9kZWxBZGFwdGVyLklNQUdFX1BST1BFUlRZKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1VOS05PV05fTk9ERSIpICsgZ2V0TW9kZWwoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9yZWZyZXNoQ2hpbGRyZW4oKQotICB7Ci0gICAgaW50IGk7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQ7Ci0gICAgT2JqZWN0IG1vZGVsOwotCi0gICAgTWFwIG1vZGVsVG9FZGl0UGFydCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgZWRpdFBhcnQgPSAoRWRpdFBhcnQpY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgbW9kZWxUb0VkaXRQYXJ0LnB1dChlZGl0UGFydC5nZXRNb2RlbCgpLCBlZGl0UGFydCk7Ci0gICAgfQotCi0gICAgTGlzdCBtb2RlbE9iamVjdHMgPSBnZXRNb2RlbENoaWxkcmVuKCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbW9kZWxPYmplY3RzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIG1vZGVsID0gbW9kZWxPYmplY3RzLmdldChpKTsKLQotICAgICAgLy9EbyBhIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiBlZGl0UGFydFtpXSA9PSBtb2RlbFtpXQotICAgICAgaWYgKGkgPCBjaGlsZHJlbi5zaXplKCkpCi0gICAgICB7Ci0gICAgICAgIGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWNoaWxkcmVuLmdldChpKTsKLSAgICAgICAgT2JqZWN0IGVkaXRQYXJ0TW9kZWwgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotICAgICAgICBpZiAoZWRpdFBhcnRNb2RlbCA9PSBtb2RlbCkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGVkaXRQYXJ0TW9kZWwuZ2V0Q2xhc3MoKSA9PSBtb2RlbC5nZXRDbGFzcygpKQotICAgICAgICB7Ci0gICAgICAgICAgbW9kZWxUb0VkaXRQYXJ0LnJlbW92ZShlZGl0UGFydE1vZGVsKTsKLQotICAgICAgICAgIGlmIChpc0FjdGl2ZSgpKQotICAgICAgICAgICAgZWRpdFBhcnQuZGVhY3RpdmF0ZSgpOwotCi0gICAgICAgICAgZWRpdFBhcnQuc2V0TW9kZWwobW9kZWwpOwotCi0gICAgICAgICAgaWYgKGlzQWN0aXZlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRpdFBhcnQuYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIGVkaXRQYXJ0LnJlZnJlc2goKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy9Mb29rIHRvIHNlZSBpZiB0aGUgRWRpdFBhcnQgaXMgYWxyZWFkeSBhcm91bmQgYnV0IGluIHRoZSB3cm9uZyBsb2NhdGlvbgotICAgICAgZWRpdFBhcnQgPSAoRWRpdFBhcnQpbW9kZWxUb0VkaXRQYXJ0LmdldChtb2RlbCk7Ci0KLSAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgICByZW9yZGVyQ2hpbGQoZWRpdFBhcnQsIGkpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL0FuIGVkaXRwYXJ0IGZvciB0aGlzIG1vZGVsIGRvZXNuJ3QgZXhpc3QgeWV0LiAgQ3JlYXRlIGFuZCBpbnNlcnQgb25lLgotICAgICAgICBlZGl0UGFydCA9IGNyZWF0ZUNoaWxkKG1vZGVsKTsKLSAgICAgICAgYWRkQ2hpbGQoZWRpdFBhcnQsIGkpOwotICAgICAgfQotICAgIH0KLSAgICBMaXN0IHRyYXNoID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgICB0cmFzaC5hZGQoY2hpbGRyZW4uZ2V0KGkpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgdHJhc2guc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgRWRpdFBhcnQgZXAgPSAoRWRpdFBhcnQpdHJhc2guZ2V0KGkpOwotICAgICAgcmVtb3ZlQ2hpbGQoZXApOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbigpCi0gIHsKLQotICAgIGJvb2xlYW4gcmV1c2VDaGlsZHJlbiA9IGZhbHNlOwotICAgIGlmIChnZXRWaWV3ZXIoKSBpbnN0YW5jZW9mIFdTRExDb21wb25lbnRWaWV3ZXIpCi0gICAgewotICAgICAgV1NETENvbXBvbmVudFZpZXdlciB3c2RsQ29tcG9uZW50Vmlld2VyID0gKFdTRExDb21wb25lbnRWaWV3ZXIpZ2V0Vmlld2VyKCk7Ci0gICAgICByZXVzZUNoaWxkcmVuID0gd3NkbENvbXBvbmVudFZpZXdlci5pc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZCgpOwotICAgIH0KLQotICAgIGlmIChyZXVzZUNoaWxkcmVuKQotICAgIHsKLSAgICAgIF9yZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICAgIH0KLQotICAgIGNvbnRlbnRGaWd1cmUuZ2V0SW50ZXJhY3RvcigpLnNldFZpc2libGUoaGFzQ2hpbGRyZW4oKSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiBjb250ZW50RmlndXJlLmdldEludGVyYWN0b3IoKS5pc0V4cGFuZGVkKCkgPyBnZXRNb2RlbENoaWxkcmVuSGVscGVyKCkgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbkhlbHBlcigpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihnZXRNb2RlbCgpKTsKLSAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gKExpc3QpbW9kZWxBZGFwdGVyLmdldFByb3BlcnR5KGdldE1vZGVsKCksIE1vZGVsQWRhcHRlci5DSElMRFJFTl9QUk9QRVJUWSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0TW9kZWxDaGlsZHJlbkhlbHBlcigpLnNpemUoKSA+IDA7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgTW9kZWxBZGFwdGVyIGdldE1vZGVsQWRhcHRlcihPYmplY3QgbW9kZWwpOwotCi0gIHByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgZ2V0RWRpdFBhcnRGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBFeHRlbnNpYmxlRWRpdFBhcnRGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRNb2RlbEFkYXB0ZXJMaXN0ZW5lcihPYmplY3QgbW9kZWxPYmplY3QsIE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBnZXRNb2RlbEFkYXB0ZXIobW9kZWxPYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0TW9kZWxBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIGlzU2VsZWN0ZWQgPSB0cnVlOwotICAgIGxhYmVsSG9sZGVyLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbXB1dGVMYWJlbENvbG9yKCkpOwotICAgIGxhYmVsSG9sZGVyLnNldEZpbGwodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBpc1NlbGVjdGVkID0gZmFsc2U7Ci0gICAgbGFiZWxIb2xkZXIuc2V0QmFja2dyb3VuZENvbG9yKG51bGwpOwotICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihjb21wdXRlTGFiZWxDb2xvcigpKTsKLSAgICBsYWJlbEhvbGRlci5zZXRGaWxsKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRXhwYW5kZWQoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRGaWd1cmUuZ2V0SW50ZXJhY3RvcigpLmlzRXhwYW5kZWQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKGJvb2xlYW4gYXJnKQotICB7Ci0gICAgaW50ZXJhY3RvckhlbHBlci5zZXRFeHBhbmRlZChhcmcpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1Vua25vd25PYmplY3RFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1Vua25vd25PYmplY3RFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzU0ZmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Vbmtub3duT2JqZWN0RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci0KLQotcHVibGljIGNsYXNzIFVua25vd25PYmplY3RFZGl0UGFydCBleHRlbmRzIFRyZWVOb2RlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlciBnZXRNb2RlbEFkYXB0ZXIoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODg3MmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9XU0RMRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZWRpdHBhcnRzLk11bHRpQ29udGVudFBhbmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5HcmFwaGljc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5XU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETEVkaXRQYXJ0IGV4dGVuZHMgTXVsdGlDb250ZW50UGFuZUVkaXRQYXJ0IGltcGxlbWVudHMgTW9kZWxBZGFwdGVyTGlzdGVuZXIsIEdyYXBoaWNzQ29uc3RhbnRzCi17Ci0JLyoqCi0JICogQWN0aXZhdGVzIHRoZSA8Y29kZT5FZGl0UGFydDwvY29kZT4gYnkgc2V0dGluZyB0aGUKLQkgKiBhcHByb3ByaWF0ZSBmbGFncywgYW5kIGFjdGl2YXRpbmcgaXRzIGNoaWxkcmVuLgotCSAqIGFjdGl2YXRpb24gc2lnbmFscyB0byB0aGUgRWRpdFBhcnQgdGhhdCBpcyBzaG91bGQgc3RhcnQgb2JzZXJ2aW5nCi0JICogaXQncyBtb2RlbCwgYW5kIHRoYXQgaXMgc2hvdWxkIHN1cHBvcnQgZWRpdGluZyBhdCB0aGlzIHRpbWUuCi0JICogQW4gRWRpdFBhcnQgd2lsbCBoYXZlIGEgcGFyZW50IHByaW9yIHRvIGFjdGl2aWF0aW9uLgotCSAqIEBzZWUgI2RlYWN0aXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgCi0gIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsgICAgICAgICAKLSAgICBhZGRNb2RlbEFkYXB0ZXJMaXN0ZW5lcihnZXRNb2RlbCgpLCB0aGlzKTsgICAKLQl9Ci0JLyoqIAotCSAqIEFwYXJ0IGZyb20gdGhlIGRlYWN0aXZhdGlvbiBkb25lIGluIHN1cGVyLCB0aGUgc291cmNlCi0JICogYW5kIHRhcmdldCBjb25uZWN0aW9ucyBhcmUgZGVhY3RpdmF0ZWQsIGFuZCB0aGUgdmlzdWFsCi0JICogcGFydCBvZiB0aGUgdGhpcyBpcyByZW1vdmVkLgotCSAqCi0JICogQHNlZSAjYWN0aXZhdGUoKSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGdldE1vZGVsKCksIHRoaXMpOyAKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOyAKLQl9ICAgCi0gICAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIAotICB7Ci0gICAgU2VsZWN0aW9uRWRpdFBvbGljeSBwb2xpY3kgPSBuZXcgU2VsZWN0aW9uRWRpdFBvbGljeSgpCi0gICAgeyAgICAgICAgCi0gICAgICBwcm90ZWN0ZWQgIHZvaWQgaGlkZVNlbGVjdGlvbigpIAotICAgICAgewotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsKLSAgICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUZlZWRiYWNrSGFuZGxlcikKLSAgICAgICAgewotICAgICAgICAgICgoSUZlZWRiYWNrSGFuZGxlcillZGl0UGFydCkucmVtb3ZlRmVlZGJhY2soKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwcm90ZWN0ZWQgIHZvaWQgc2hvd1NlbGVjdGlvbigpICAKLSAgICAgIHsgCi0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0SG9zdCgpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJRmVlZGJhY2tIYW5kbGVyKQotICAgICAgICB7Ci0gICAgICAgICAgKChJRmVlZGJhY2tIYW5kbGVyKWVkaXRQYXJ0KS5hZGRGZWVkYmFjaygpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgIAotICAgIH07Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgcG9saWN5KTsgICAgICAgICAgIAotICB9ICAKLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKSAKLSAgewotICAgIHJldHVybiBnZXRFZGl0UGFydEZhY3RvcnkoKS5jcmVhdGVFZGl0UGFydCh0aGlzLCBtb2RlbCk7Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHByb3BlcnR5ID09IE1vZGVsQWRhcHRlci5DSElMRFJFTl9QUk9QRVJUWSkKLSAgICB7Ci0gICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHkgPT0gTW9kZWxBZGFwdGVyLkRFVEFJTF9QUk9QRVJUWSkKLSAgICB7IAotICAgICAgcmVmcmVzaFZpc3VhbHMoKTsgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgfQotICB9ICAKLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgCi0gIHsgICAKLSAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihnZXRNb2RlbCgpKTsKLSAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gKExpc3QpbW9kZWxBZGFwdGVyLmdldFByb3BlcnR5KGdldE1vZGVsKCksIE1vZGVsQWRhcHRlci5DSElMRFJFTl9QUk9QRVJUWSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIEV4dGVuc2libGVFZGl0UGFydEZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLSAgfSAKLQotICBwcm90ZWN0ZWQgTW9kZWxBZGFwdGVyIGdldE1vZGVsQWRhcHRlcihPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICAvLyBUT0RPIDogcG9ydCBjaGVjawotICAgIHJldHVybiBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLS8vICAgIHJldHVybiBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LkVjb3JlVXRpbC5nZXRBZGFwdGVyKGdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5lQWRhcHRlcnMoKSxtb2RlbE9iamVjdCk7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0TW9kZWxBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gIH0gIAotCi0gIHB1YmxpYyBib29sZWFuIGhpdFRlc3QoSUZpZ3VyZSB0YXJnZXQsIFBvaW50IGxvY2F0aW9uKQotICB7Ci0gICAgUmVjdGFuZ2xlIGIgPSB0YXJnZXQuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgIHRhcmdldC50cmFuc2xhdGVUb0Fic29sdXRlKGIpOyAgCi0gICAgcmV0dXJuIGIuY29udGFpbnMobG9jYXRpb24pOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExFZGl0UGFydEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9XU0RMRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MTEzMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExFZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExTd2l0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5Ci17IAotICBwcm90ZWN0ZWQgc3RhdGljIFdTRExFZGl0UGFydEZhY3RvcnkgaW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBzdGF0aWMgV1NETEVkaXRQYXJ0RmFjdG9yeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBXU0RMRWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAgICAgICAgICAKLQotCi0gIHB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChmaW5hbCBFZGl0UGFydCBwYXJlbnQsIE9iamVjdCBtb2RlbCkKLSAgeyAgICAgICAgICAgICAKLSAgICAgIFdTRExTd2l0Y2ggd3NkbFN3aXRjaCA9IG5ldyBXU0RMU3dpdGNoKCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gbmV3IFdTRExUcmVlTm9kZUVkaXRQYXJ0KCk7Ci0JICAgICAgfSAgIAotICAgICAgIAotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZURlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIG5ldyBEZWZpbml0aW9uRWRpdFBhcnQoKTsKLQkgICAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgICAgfTsgICAKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KXdzZGxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpbW9kZWwpOyAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gbmV3IEdyb3VwRWRpdFBhcnQoKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIGlmIChlZGl0UGFydCAhPSBudWxsKSAgIAotICAgIHsKLSAgICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICAgIGVkaXRQYXJ0LnNldFBhcmVudChwYXJlbnQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgIAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYW4ndCBjcmVhdGUgZWRpdFBhcnQgZm9yICIgKyBtb2RlbCk7Ci0gICAgICBUaHJlYWQuZHVtcFN0YWNrKCk7Ci0gICAgfQotICAgIHJldHVybiBlZGl0UGFydDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9XU0RMVHJlZU5vZGVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExUcmVlTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YzkzMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExUcmVlTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRHJhZ1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5XU0RMRHJhZ0FuZERyb3BFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcy5XU0RMR3JhcGhOb2RlRHJhZ1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLldTRExTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5UcmVlTm9kZUNvbnRlbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotCi1wdWJsaWMgY2xhc3MgV1NETFRyZWVOb2RlRWRpdFBhcnQgZXh0ZW5kcyBUcmVlTm9kZUVkaXRQYXJ0Ci17IAotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWwyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFbXBoYXNpemVkID0gZmFsc2U7ICAKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yIGVtcGhhc2lzQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgMjM4LCAyMzgsIDIzOCk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29sb3IgbGFiZWwyRm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yKG51bGwsIDgyLCA4MiwgMTU4KTsgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yIGxhYmVsMkZvcmVncm91bmRDb2xvclNlbGVjdGVkID0gbmV3IENvbG9yKG51bGwsIDE4MiwgMTgyLCAyNTUpOwotCi0gIHByb3RlY3RlZCBNb2RlbEFkYXB0ZXIgZ2V0TW9kZWxBZGFwdGVyKE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIHJldHVybiBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRGaWd1cmUoKQotICB7Ci0JY29udGVudEZpZ3VyZSA9IG5ldyBUcmVlTm9kZUNvbnRlbnRGaWd1cmUoKQotCXsKLQkgIHB1YmxpYyBJRmlndXJlIGdldENvbm5lY3Rpb25GaWd1cmUoKQotCSAgeyAgCQotICAJICAgIHJldHVybiBpc1RvcExldmVsKCkgPyBvdXRsaW5lZEFyZWEgOiBpY29uQXJlYTsKLQkgIH0gICAJICAKLQl9OyAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1RvcExldmVsKCkKLSAgewotICAgIHJldHVybiBnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEdyb3VwRWRpdFBhcnQ7Ci0gIH0KLQkKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlndXJlQ29udGVudCgpCi0gIHsgICAgICAgICAgICAgICAgICAKLSAgICBzdXBlci5jcmVhdGVGaWd1cmVDb250ZW50KCk7Ci0gICAgICAKLSAgICBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFBhcnQpCi0gICAgewotICAgICAgbGFiZWwyID0gbmV3IExhYmVsKCk7Ci0gICAgICBsYWJlbEhvbGRlci5hZGQobGFiZWwyKTsKLSAgICAgIGxhYmVsMi5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigwLCA1LCAwLCAwKSk7Ci0gICAgICBsYWJlbDIuc2V0Rm9yZWdyb3VuZENvbG9yKGxhYmVsMkZvcmVncm91bmRDb2xvcik7Ci0gICAgfQotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgc2V0RW1waGFzaXplZChib29sZWFuIGlzRW1waGFzaXplZCkKLSAgewotICAgIHRoaXMuaXNFbXBoYXNpemVkID0gaXNFbXBoYXNpemVkOwotICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUVtcGhhc2lzKCkKLSAgewotICAgIGJvb2xlYW4gaXNFbXBoYXNpc1Nob3dpbmcgPSBpc0VtcGhhc2l6ZWQgJiYgKCFpc1NlbGVjdGVkIHx8IGdldE1vZGVsQ2hpbGRyZW4oKS5zaXplKCkgPiAwKTsKLSAgICBpZiAoaXNFbXBoYXNpc1Nob3dpbmcpCi0gICAgeyAgICAgICAgICAgICAgCi0gICAgICBjb250ZW50RmlndXJlLmdldE91dGxpbmVkQXJlYSgpLnNldEJhY2tncm91bmRDb2xvcihlbXBoYXNpc0NvbG9yKTsgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgY29udGVudEZpZ3VyZS5nZXRPdXRsaW5lZEFyZWEoKS5zZXRGaWxsKGlzRW1waGFzaXNTaG93aW5nKTsKLSAgICBjb250ZW50RmlndXJlLmdldE91dGxpbmVkQXJlYSgpLnNldE91dGxpbmVkKGlzRW1waGFzaXNTaG93aW5nKTsgICAgCi0gICAgY29udGVudEZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoZWxlbWVudEJvcmRlckNvbG9yKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgeyAgIAotICAgIHVwZGF0ZUVtcGhhc2lzKCk7Ci0KLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICAgCi0gICAgaWYgKGxhYmVsMiAhPSBudWxsKQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KWdldE1vZGVsKCk7Ci0JICAvL1N0cmluZyBsYWJlbCA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuaXNUeXBlKHBhcnQpID8gInR5cGUiIDogImVsZW1lbnQiOwotCSAgU3RyaW5nIHZhbHVlID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRQYXJ0UmVmZXJlbmNlVmFsdWUocGFydCk7ICAKLSAgICAgIGxhYmVsMi5zZXRUZXh0KCIoIiArIHZhbHVlICsgIikiKTsKLSAgICB9Ci0gIH0gICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgIAotICAgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBmb3IgKEVkaXRQYXJ0IHBhcmVudCA9IChFZGl0UGFydClnZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIERlZmluaXRpb25FZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgICgoRGVmaW5pdGlvbkVkaXRQYXJ0KXBhcmVudCkuaGFuZGxlT3BlblJlcXVlc3QodGhpcyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgIAotICAgIC8vZWxzZSBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQpCi0gICAgLy97ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vICBwZXJmb3JtRGlyZWN0RWRpdCgpOwotICAgIC8vfQotICB9ICAgICAKLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsgICAgCi0gICAgc3VwZXIuYWRkRmVlZGJhY2soKTsKLSAgICBpZiAobGFiZWwyICE9IG51bGwpICAgICAgICAKLSAgICB7Ci0gICAgICBsYWJlbDIuc2V0Rm9yZWdyb3VuZENvbG9yKGxhYmVsMkZvcmVncm91bmRDb2xvclNlbGVjdGVkKTsKLSAgICB9ICAgIAotICAgIHVwZGF0ZUVtcGhhc2lzKCk7Ci0gIH0gICAKLQotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsgCi0gICAgc3VwZXIucmVtb3ZlRmVlZGJhY2soKTsKLSAgICBpZiAobGFiZWwyICE9IG51bGwpICAgICAgICAKLSAgICB7Ci0gICAgICBsYWJlbDIuc2V0Rm9yZWdyb3VuZENvbG9yKGxhYmVsMkZvcmVncm91bmRDb2xvcik7Ci0gICAgfQotICAgIHVwZGF0ZUVtcGhhc2lzKCk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAKLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsgCi0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgPSBuZXcgV1NETFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsIG5ldyBXU0RMRHJhZ0FuZERyb3BFZGl0UG9saWN5KGdldFZpZXdlcigpLCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSkpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KTsKLSAgfSAgCi0gIAotICBXU0RMU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotCi0gIHB1YmxpYyBJRmlndXJlIGdldFNlbGVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RmlndXJlKCk7Ci0gIH0KLQotICBwdWJsaWMgRHJhZ1RyYWNrZXIgZ2V0RHJhZ1RyYWNrZXIoUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgcmV0dXJuIG5ldyBXU0RMR3JhcGhOb2RlRHJhZ1RyYWNrZXIoKEVkaXRQYXJ0KXRoaXMpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL0VkaXRVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvRWRpdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliY2IzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvRWRpdFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnJlY29uY2lsZXIuV1NETFRvRE9NRWxlbWVudFV0aWw7Ci0KLQotcHVibGljIGNsYXNzIEVkaXRVdGlsCi17Ci0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQb3NzaWJsZVByb3BlcnR5VmFsdWVzKE9iamVjdCBtb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgUG9ydCkKLSAgICB7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydCltb2RlbDsgICAKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKHBvcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgIGxpc3QgPSB1dGlsLmdldEJpbmRpbmdOYW1lcygpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0gICAgewotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpbW9kZWw7ICAgCi0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChiaW5kaW5nLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICBsaXN0ID0gdXRpbC5nZXRQb3J0VHlwZU5hbWVzKCk7Ci0gICAgfSAgICAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFBhcnQpCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpbW9kZWw7ICAgIAotICAgICAgYm9vbGVhbiBpc1R5cGUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmlzVHlwZShwYXJ0KTsKLSAgICAgIGxpc3QgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldENvbXBvbmVudE5hbWVMaXN0KHBhcnQsIGlzVHlwZSk7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElucHV0IHx8Ci0gICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2VvZiBPdXRwdXQgfHwKLSAgICAgICAgICAgICBtb2RlbCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsgCi0gICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCltb2RlbDsgICAKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKHdzZGxFbGVtZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICBsaXN0ID0gdXRpbC5nZXRNZXNzYWdlTmFtZXMoKTsKLSAgICB9IAotCi0gICAgaWYgKGxpc3QgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBsaXN0LmFkZCgiQSIpOwotICAgICAgbGlzdC5hZGQoIkIiKTsKLSAgICAgIGxpc3QuYWRkKCJDIik7Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUpCi0gIHsgCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgUGFydCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBQYXJ0IHBhcnQgPSAoUGFydCltb2RlbDsgCi0gICAgICBib29sZWFuIGlzVHlwZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuaXNUeXBlKHBhcnQpOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5zZXRDb21wb25lbnRSZWZlcmVuY2UocGFydCwgaXNUeXBlLCB2YWx1ZSk7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFBvcnQpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoImJpbmRpbmciLCB2YWx1ZSk7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0gICAgeyAKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoV1NETEVsZW1lbnQpbW9kZWwpLmdldEVsZW1lbnQoKTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgdmFsdWUpOwotICAgIH0gCi0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJbnB1dCB8fAotICAgICAgICAgICAgIG1vZGVsIGluc3RhbmNlb2YgT3V0cHV0IHx8Ci0gICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7IAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiLCB2YWx1ZSk7Ci0gICAgfSAKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IG1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7IAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgUGFydCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFdTRExFbGVtZW50KW1vZGVsKS5nZXRFbGVtZW50KCk7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShwcm9wZXJ0eU5hbWUpOwotICAgIH0gCi0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBQb3J0KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoV1NETEVsZW1lbnQpbW9kZWwpLmdldEVsZW1lbnQoKTsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJiaW5kaW5nIik7Ci0gICAgfSAgIAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgQmluZGluZykKLSAgICB7IAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKLSAgICB9ICAgCi0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJbnB1dCB8fAotICAgICAgICAgICAgIG1vZGVsIGluc3RhbmNlb2YgT3V0cHV0IHx8Ci0gICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7IAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiKTsKLSAgICB9ICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldE5hbWUoT2JqZWN0IG1vZGVsLCBTdHJpbmcgdmFsdWUpCi0gIHsgCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgV1NETEVsZW1lbnQpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCB2YWx1ZSk7Ci0gICAgfSAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvTmFtZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvTmFtZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTk5NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL05hbWVEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5TbWFydFJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5lZGl0cG9saWNpZXMuVGV4dENlbGxFZGl0b3JNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgTmFtZURpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgVGV4dENlbGxFZGl0b3JNYW5hZ2VyCi17Ci0gIHByb3RlY3RlZCBPYmplY3QgbW9kZWw7Ci0KLSAgcHVibGljIE5hbWVEaXJlY3RFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIExhYmVsIGxhYmVsLCBPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihzb3VyY2UsIGxhYmVsKTsgIAotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1Nb2RpZnkoZmluYWwgU3RyaW5nIHZhbHVlKQotICB7ICAgICAgICAgIAotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgU21hcnRSZW5hbWVBY3Rpb24obW9kZWwsIHZhbHVlKSk7Ci0gIH0gICAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETERyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1dTRExEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFmYjkzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETERyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuQ29weVdTRExFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuV1NETERyYWdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5XU0RMRHJhZ1Jlb3JkZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5XU0RMRHJhZ1NldE1lc3NhZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLldTRExUcmVlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgV1NETERyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgLy9BYnN0cmFjdENvbW1hbmQKLXsgCi0gIHByb3RlY3RlZCBFZGl0UGFydFZpZXdlciB2aWV3ZXI7ICAgIAotICBwcm90ZWN0ZWQgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0OwotICBwcm90ZWN0ZWQgUG9pbnQgbG9jYXRpb247Ci0gIHByb3RlY3RlZCBXU0RMRHJhZ0FjdGlvbiBkcmFnQWN0aW9uOyAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRXhlY3V0ZSA9IGZhbHNlOwotCi0gIHB1YmxpYyBXU0RMRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gIAlib29sZWFuIGNvbnN0cnVjdG9yID0gZmFsc2U7Ci0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7ICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotCi0gICAgbG9jYXRpb24gPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7ICAgCi0gICAgRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSB2aWV3ZXIuZmluZE9iamVjdEF0KGxvY2F0aW9uKTsgCi0KLSAgICAvLyBPbmx5IHN1cHBvcnQgZHJhZyBhbmQgZHJvcCBmb3IgV1NETFRyZWVOb2RlRWRpdFBhcnQKLSAgCWlmICh0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIFdTRExUcmVlTm9kZUVkaXRQYXJ0KSB7Ci0gIAkJV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIHRhcmdldEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gIAkJaWYgKHdzZGxFbGVtZW50LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0gIAkJCSgoR3JhcGhpY2FsRWRpdFBhcnQpdmlld2VyLmdldFJvb3RFZGl0UGFydCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvY2F0aW9uKTsKLSAgCQkJUmVjdGFuZ2xlIHRhcmdldFJlY3RhbmdsZTsgCi0gIAkJCVdTRExUcmVlTm9kZUVkaXRQYXJ0IHRhcmdldFBhcmVudEVkaXRQYXJ0OwotICAJCQlXU0RMVHJlZU5vZGVFZGl0UGFydCBtb3ZpbmdDaGlsZEVkaXRQYXJ0OwotICAJCQlWZWN0b3IgZHJhZ0FjdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgCQkJaWYgKHJlcXVlc3QuZ2V0VHlwZSgpLmVxdWFscyhSZXF1ZXN0Q29uc3RhbnRzLlJFUV9BREQpKSAgeyAvLyBUaGlzIHJlYWxseSBzaG91bGRuJ3QgYmUgUkVRX0FERC4uLi4KLSAgCQkJCUxpc3QgbGlzdCA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0gIAkJCQlpZiAobGlzdC5zaXplKCkgPD0gMCkgewotICAJCQkJCWNhbkV4ZWN1dGUgPSBmYWxzZTsKLSAgCQkJCQlyZXR1cm47Ci0gIAkJCQl9Ci0gICAgICAgICAgICAKLSAgCQkJCS8vIEdyYWJiaW5nIHRoZSBmaXN0IHNlbGVjdGlvbgotICAJCQkJbW92aW5nQ2hpbGRFZGl0UGFydCA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0gIAkJCQlPYmplY3QgbW9kZWwgPSBtb3ZpbmdDaGlsZEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gIAkJCQlFZGl0UGFydCBwb2ludGVyRWRpdFBhcnQgPSB2aWV3ZXIuZmluZE9iamVjdEF0KGxvY2F0aW9uKTsKLSAKLSAgCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElucHV0IHx8IG1vZGVsIGluc3RhbmNlb2YgT3V0cHV0KSB7Ci0gIAkJCQkJZHJhZ0FjdGlvbnMuYWRkKG5ldyBXU0RMRHJhZ1Jlb3JkZXJBY3Rpb24obW92aW5nQ2hpbGRFZGl0UGFydCwgcG9pbnRlckVkaXRQYXJ0LCBnZXRQb2ludGVyTG9jYXRpb24obG9jYXRpb24pKSk7Ci0gIAkJCQkJZHJhZ0FjdGlvbnMuYWRkKG5ldyBXU0RMRHJhZ1NldE1lc3NhZ2VBY3Rpb24obW92aW5nQ2hpbGRFZGl0UGFydCwgcG9pbnRlckVkaXRQYXJ0LCBsb2NhdGlvbikpOwotICAJCQkJfQotICAJCQkJZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0gIAkJCQkJZHJhZ0FjdGlvbnMuYWRkKG5ldyBXU0RMRHJhZ1Jlb3JkZXJBY3Rpb24obW92aW5nQ2hpbGRFZGl0UGFydCwgcG9pbnRlckVkaXRQYXJ0LCBnZXRQb2ludGVyTG9jYXRpb24obG9jYXRpb24pKSk7ICAgICAKLSAgCQkJCX0KLSAgCQkJCWVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgRmF1bHQpIHsKLSAgCQkJCQlkcmFnQWN0aW9ucy5hZGQobmV3IFdTRExEcmFnU2V0TWVzc2FnZUFjdGlvbihtb3ZpbmdDaGlsZEVkaXRQYXJ0LCBwb2ludGVyRWRpdFBhcnQsIGxvY2F0aW9uKSk7Ci0gIAkJCQl9ICAgICAgICAgICAgCi0gIAkJCX0KLSAgCQkJZWxzZSBpZiAocmVxdWVzdC5nZXRUeXBlKCkuZXF1YWxzKFJlcXVlc3RDb25zdGFudHMuUkVRX0NMT05FKSkgewotICAJCQkJTGlzdCBsaXN0ID0gcmVxdWVzdC5nZXRFZGl0UGFydHMoKTsKLSAgCQkJCWlmIChsaXN0LnNpemUoKSA+IDApCi0gIAkJCQl7Ci0gIAkJCQkJLy8gR3JhYmJpbmcgdGhlIGZpc3Qgc2VsZWN0aW9uCi0gIAkJCQkJbW92aW5nQ2hpbGRFZGl0UGFydCA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICAgCi0gIAkJCQkJZHJhZ0FjdGlvbnMuYWRkKG5ldyBDb3B5V1NETEVsZW1lbnRBY3Rpb24odmlld2VyLAotICAgICAgICAgICAgIAkJCQkJCQkJCQkJICAoV1NETEVsZW1lbnQpIG1vdmluZ0NoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKSwKLSAgICAgICAgICAgICAJCQkJCQkJCQkJICAgICAgKFdTRExFbGVtZW50KSB0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpLAotCQkJCQkJCQkJCQkJCQkgIG51bGwpKTsKLSAgCQkJCX0KLSAgCQkJfQotICAgICAgICAKLSAgCQkJSXRlcmF0b3IgaXQgPSBkcmFnQWN0aW9ucy5pdGVyYXRvcigpOwotICAJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gIAkJCQlkcmFnQWN0aW9uID0gKFdTRExEcmFnQWN0aW9uKSBpdC5uZXh0KCk7Ci0gIAkJCQljYW5FeGVjdXRlID0gZHJhZ0FjdGlvbi5jYW5FeGVjdXRlKCk7Ci0gIAkJCQlpZiAoY2FuRXhlY3V0ZSkKLSAgCQkJCQlicmVhazsKLSAgCQkJfQotICAJCX0KLSAgCX0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpCi0gIHsgCi0gICAgcmV0dXJuIGNhbkV4ZWN1dGU7Ci0gIH0gICAgIAotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICBpZiAoY2FuRXhlY3V0ZSkKLSAgICB7IAotICAgICAgZHJhZ0FjdGlvbi5ydW4oKTsgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRGZWVkYmFja0ZpZ3VyZSgpIHsKLSAgCWlmIChkcmFnQWN0aW9uICE9IG51bGwpIHsKLSAgCQlyZXR1cm4gZHJhZ0FjdGlvbi5nZXRGZWVkYmFja0ZpZ3VyZSgpOwotICAJfQotICAJZWxzZSB7Ci0gIAkJcmV0dXJuIG51bGw7Ci0gIAl9Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24KLSAgICovCi0gIHByaXZhdGUgUG9pbnQgZ2V0UG9pbnRlckxvY2F0aW9uKFBvaW50IG9yaWdQb2ludGVyTG9jYXRpb24pIHsKLSAgCSBQb2ludCBjb21wZW5zYXRlZExvY2F0aW9uID0gb3JpZ1BvaW50ZXJMb2NhdGlvbjsKLSAgCSBGaWd1cmVDYW52YXMgZmlndXJlQ2FudmFzID0gKEZpZ3VyZUNhbnZhcykgdmlld2VyLmdldENvbnRyb2woKTsKLSAgICAgaW50IHlPZmZzZXQgPSBmaWd1cmVDYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRWZXJ0aWNhbFJhbmdlTW9kZWwoKS5nZXRWYWx1ZSgpOwotICAgICBjb21wZW5zYXRlZExvY2F0aW9uLnkgPSBjb21wZW5zYXRlZExvY2F0aW9uLnkgKyB5T2Zmc2V0OwotICAgICAKLSAgICAgcmV0dXJuIGNvbXBlbnNhdGVkTG9jYXRpb247Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETERyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1dTRExEcmFnQW5kRHJvcEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkZGRiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETERyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRHJhZ0FuZERyb3BFZGl0UG9saWN5IGV4dGVuZHMgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5HcmFwaGljYWxFZGl0UG9saWN5Ci17IAotICBwcm90ZWN0ZWQgRWRpdFBhcnRWaWV3ZXIgdmlld2VyOyAgICAKLSAgcHJvdGVjdGVkIFdTRExTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3k7Ci0KLSAgcHVibGljIFdTRExEcmFnQW5kRHJvcEVkaXRQb2xpY3koRWRpdFBhcnRWaWV3ZXIgdmlld2VyLCBXU0RMU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KQotICB7Ci0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgdGhpcy5zZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSA9IHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxKQotICB7Ci0JICByZXR1cm4gdHJ1ZTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotICBwdWJsaWMgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBXU0RMRHJhZ0FuZERyb3BDb21tYW5kIGNvbW1hbmQgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENoYW5nZUJvdW5kc1JlcXVlc3QpCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBXU0RMRHJhZ0FuZERyb3BDb21tYW5kKHZpZXdlciwgKENoYW5nZUJvdW5kc1JlcXVlc3QpcmVxdWVzdCk7ICAKLSAgICAgIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5LnNldERyYWdBbmREcm9wQ29tbWFuZChjb21tYW5kKTsKLSAgICB9IAotICAgIHJldHVybiBjb21tYW5kOyAgICAgICAgICAgICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1dTRExHcmFwaE5vZGVEcmFnVHJhY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1dTRExHcmFwaE5vZGVEcmFnVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODJiOTM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9XU0RMR3JhcGhOb2RlRHJhZ1RyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EcmFnRWRpdFBhcnRzVHJhY2tlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1wdWJsaWMgY2xhc3MgV1NETEdyYXBoTm9kZURyYWdUcmFja2VyIGV4dGVuZHMgRHJhZ0VkaXRQYXJ0c1RyYWNrZXIgCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZWRpdFBhcnQ7IAotICAgICAgICAgICAKLSAgcHVibGljIFdTRExHcmFwaE5vZGVEcmFnVHJhY2tlcihFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIHN1cGVyKGVkaXRQYXJ0KTsKLSAgICB0aGlzLmVkaXRQYXJ0ID0gZWRpdFBhcnQ7Ci0gIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDb21tYW5kIGdldENvbW1hbmQoKSAKLSAgeyAKLQkgIFJlcXVlc3QgcmVxdWVzdCA9IGdldFRhcmdldFJlcXVlc3QoKTsKLSAgICByZXR1cm4gZWRpdFBhcnQuZ2V0Q29tbWFuZChyZXF1ZXN0KTsgCi0gIH0KLX0gCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1dTRExTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzOGQ5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLklGZWVkYmFja0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLldTRExUcmVlTm9kZUVkaXRQYXJ0OwotCi1wdWJsaWMgY2xhc3MgV1NETFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbAlleHRlbmRzIFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5Ci17Ci0gIHByb3RlY3RlZCBJRmlndXJlIGZlZWRiYWNrOwotICBwcm90ZWN0ZWQgUmVjdGFuZ2xlIG9yaWdpbmFsTG9jYXRpb247Ci0gIHByb3RlY3RlZCBXU0RMRHJhZ0FuZERyb3BDb21tYW5kIGRyYWdBbmREcm9wQ29tbWFuZDsKLQotICBwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkKLSAgeyAgICAgICAgICAgICAgCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0SG9zdCgpOyAgCi0KLSAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkKLSAgICB7Ci0gICAgICBHcmFwaGljYWxFZGl0UGFydCBncmFwaGljYWxFZGl0UGFydCA9IChHcmFwaGljYWxFZGl0UGFydCllZGl0UGFydDsKLSAgICAgIElGaWd1cmUgZmlndXJlID0gKGdyYXBoaWNhbEVkaXRQYXJ0IGluc3RhbmNlb2YgV1NETFRyZWVOb2RlRWRpdFBhcnQpID8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoV1NETFRyZWVOb2RlRWRpdFBhcnQpZ3JhcGhpY2FsRWRpdFBhcnQpLmdldFNlbGVjdGlvbkZpZ3VyZSgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY2FsRWRpdFBhcnQuZ2V0RmlndXJlKCk7Ci0gICAKLSAgICAgIE1vdmVIYW5kbGVMb2NhdG9yIGxvYyA9IG5ldyBNb3ZlSGFuZGxlTG9jYXRvcihmaWd1cmUpOyAgICAKLSAgICAgIE1vdmVIYW5kbGUgbW92ZUhhbmRsZSA9IG5ldyBNb3ZlSGFuZGxlKGdyYXBoaWNhbEVkaXRQYXJ0LCBsb2MpOyAgICAgCi0gICAgICBsaXN0LmFkZChtb3ZlSGFuZGxlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbGlzdDsKLSAgfSAgIAotICAKLQotICBwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkgIGlmIChSRVFfTU9WRS5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKQotICAgIHsgIAotCQkgIHJlc3VsdCA9IGZhbHNlOyAvLyByZXR1cm4gZmFsc2UgdG8gZGlzYWJsZSBtb3ZlIGZvciBub3cgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JICAgIHJlc3VsdCA9IHN1cGVyLnVuZGVyc3RhbmRzUmVxdWVzdChyZXF1ZXN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLQotICBwdWJsaWMgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIG51bGw7ICAKLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIHNldERyYWdBbmREcm9wQ29tbWFuZChXU0RMRHJhZ0FuZERyb3BDb21tYW5kIGRyYWdBbmREcm9wQ29tbWFuZCkKLSAgewotICAgIHRoaXMuZHJhZ0FuZERyb3BDb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kOwotICB9Ci0KLSAgcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGdldE1vdmVDb21tYW5kKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkgCi0gIHsKLQkgIENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxID0gbmV3IENoYW5nZUJvdW5kc1JlcXVlc3QoUkVRX01PVkVfQ0hJTERSRU4pOwotCSAgcmVxLnNldEVkaXRQYXJ0cyhnZXRIb3N0KCkpOwotCQotCSAgcmVxLnNldE1vdmVEZWx0YShyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkgIHJlcS5zZXRTaXplRGVsdGEocmVxdWVzdC5nZXRTaXplRGVsdGEoKSk7Ci0JICByZXEuc2V0TG9jYXRpb24ocmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQotCSAgcmV0dXJuIGdldEhvc3QoKS5nZXRQYXJlbnQoKS5nZXRDb21tYW5kKHJlcSk7Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgc2hvd1NvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAJZXJhc2VDaGFuZ2VCb3VuZHNGZWVkYmFjayhudWxsKTsKLSAgCQotICAJaWYgKGRyYWdBbmREcm9wQ29tbWFuZCAhPSBudWxsICYmIGRyYWdBbmREcm9wQ29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkgIGlmIChSRVFfTU9WRS5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpIHx8IFJFUV9BREQuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkgewotCQkgIHNob3dNb3ZlQ2hhbmdlQm91bmRzRmVlZGJhY2soKENoYW5nZUJvdW5kc1JlcXVlc3QpIHJlcXVlc3QpOwotCSAgfQotCSAgZWxzZSBpZiAoUkVRX0NMT05FLmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpIHsKLQkgIAkgIHNob3dDb3B5Q2hhbmdlQm91bmRzRmVlZGJhY2soKENoYW5nZUJvdW5kc1JlcXVlc3QpIHJlcXVlc3QpOwotCSAgfQotICAJfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2hvd01vdmVDaGFuZ2VCb3VuZHNGZWVkYmFjayhDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgCWlmIChkcmFnQW5kRHJvcENvbW1hbmQgIT0gbnVsbCAmJiBkcmFnQW5kRHJvcENvbW1hbmQuZ2V0RmVlZGJhY2tGaWd1cmUoKSAhPSBudWxsKSB7Ci0gIAkJZmVlZGJhY2sgPSBkcmFnQW5kRHJvcENvbW1hbmQuZ2V0RmVlZGJhY2tGaWd1cmUoKTsKLSAgCQlhZGRGZWVkYmFjayhmZWVkYmFjayk7Ci0gIAl9Ci0gIH0gICAgICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHNob3dDb3B5Q2hhbmdlQm91bmRzRmVlZGJhY2soQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gIAkvKgotICAJSUZpZ3VyZSBwID0gZ2V0RHJhZ1NvdXJjZUZlZWRiYWNrRmlndXJlKCk7Ci0gIAlSZWN0YW5nbGUgciA9IG9yaWdpbmFsTG9jYXRpb24uZ2V0VHJhbnNsYXRlZChyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLSAgCURpbWVuc2lvbiByZXNpemUgPSByZXF1ZXN0LmdldFNpemVEZWx0YSgpOwotICAJci53aWR0aCArPSByZXNpemUud2lkdGg7Ci0gIAlyLmhlaWdodCs9IHJlc2l6ZS5oZWlnaHQ7Ci0gIAotICAJKChHcmFwaGljYWxFZGl0UGFydClnZXRIb3N0KCkpLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0gIAlwLnRyYW5zbGF0ZVRvUmVsYXRpdmUocik7Ci0gICAgICAgICAgICAgICAgCi0gICAgUmVjdGFuZ2xlIHBCb3VuZHMgPSByLmdldENvcHkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBpZiAoZHJhZ0FuZERyb3BDb21tYW5kICE9IG51bGwgJiYgZHJhZ0FuZERyb3BDb21tYW5kLmNhbkV4ZWN1dGUoKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpbnQgc2l6ZSA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuc2l6ZSgpOwotICAgICAgaWYgKHNpemUgPiAwICYmIHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuZ2V0KHNpemUgLSAxKSA9PSBnZXRIb3N0KCkpCi0gICAgICB7ICAgICAgICAgCi0gICAgICAgIFBvaW50TGlzdCBwb2ludExpc3QgPSBkcmFnQW5kRHJvcENvbW1hbmQuZ2V0Q29ubmVjdGlvblBvaW50cyhyKTsKLSAgICAgICAgaWYgKHBvaW50TGlzdCAhPSBudWxsICYmIHBvaW50TGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcG9seUxpbmUuc2V0UG9pbnRzKHBvaW50TGlzdCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgUG9pbnQgZmlyc3RQb2ludCA9IHBvaW50TGlzdC5nZXRGaXJzdFBvaW50KCk7Ci0gICAgICAgICAgaWYgKGZpcnN0UG9pbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwQm91bmRzID0gcEJvdW5kcy5nZXRVbmlvbihuZXcgUmVjdGFuZ2xlKGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55LCAxLCAxKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHAuc2V0Qm91bmRzKHBCb3VuZHMpOwotICAgIGdob3N0U2hhcGUuc2V0Qm91bmRzKHIpOwotICAJcC52YWxpZGF0ZSgpOwotICAJKi8KLSAgfSAgICAgICAgCi0vKgotICBwcm90ZWN0ZWQgSUZpZ3VyZSBnZXREcmFnU291cmNlRmVlZGJhY2tGaWd1cmUoKSAKLSAgewotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0SG9zdCgpOyAKLSAgICBpZiAoZmVlZGJhY2sgPT0gbnVsbCAmJiBlZGl0UGFydCBpbnN0YW5jZW9mIFdTRExUcmVlTm9kZUVkaXRQYXJ0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFdTRExUcmVlTm9kZUVkaXRQYXJ0IGJhc2VFZGl0UGFydCA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCllZGl0UGFydDsKLSAgICAgIG9yaWdpbmFsTG9jYXRpb24gPSBuZXcgUmVjdGFuZ2xlKGJhc2VFZGl0UGFydC5nZXRTZWxlY3Rpb25GaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0gICAgICBmZWVkYmFjayA9IGNyZWF0ZURyYWdTb3VyY2VGZWVkYmFja0ZpZ3VyZShiYXNlRWRpdFBhcnQuZ2V0U2VsZWN0aW9uRmlndXJlKCkpOwotCX0KLQlyZXR1cm4gZmVlZGJhY2s7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVEcmFnU291cmNlRmVlZGJhY2tGaWd1cmUoSUZpZ3VyZSBkcmFnZ2VkRmlndXJlKQotICB7ICAJCi0gIAlQb2x5bGluZSBwb2x5TGluZSA9IG5ldyBQb2x5bGluZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vICAgIHBvbHlMaW5lLnNldExpbmVTdHlsZShHcmFwaGljcy5MSU5FX0RBU0hET1QpOyAgICAgIAotICAgIHBvbHlMaW5lLnNldExpbmVXaWR0aCgxKTsKLSAgICBhZGRGZWVkYmFjayhwb2x5TGluZSk7Ci0JCQkKLSAgCXJldHVybiBwb2x5TGluZTsKLQl9IAotCSovCi0KLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLQkgIGlmIChmZWVkYmFjayAhPSBudWxsKQotICAgIHsKLQkJICByZW1vdmVGZWVkYmFjayhmZWVkYmFjayk7Ci0JCSAgZmVlZGJhY2sgPSBudWxsOwotCSAgfQotCSAgaGlkZUZvY3VzKCk7Ci0JICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gIH0KLQotICAvKioKLSAgICogRXJhc2UgZmVlZGJhY2sgaW5kaWNhdGluZyB0aGF0IHRoZSByZWNlaXZlciBvYmplY3QgaXMgCi0gICAqIGJlaW5nIGRyYWdnZWQuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGRyYWcgaXMKLSAgICogY29tcGxldGVkIG9yIGNhbmNlbGxlZCBvbiB0aGUgcmVjZWl2ZXIgb2JqZWN0LgotICAgKiBAcGFyYW0gZHJhZ1RyYWNrZXIgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRyYWdUcmFja2VyIFRoZSBkcmFnIHRyYWNrZXIgb2YgdGhlIHRvb2wgcGVyZm9ybWluZyB0aGUgZHJhZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGVyYXNlQ2hhbmdlQm91bmRzRmVlZGJhY2soQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSAKLSAgewotCSAgaWYgKGZlZWRiYWNrICE9IG51bGwpIAotICAgIHsJCSAgICAgIAotCQkgIHJlbW92ZUZlZWRiYWNrKGZlZWRiYWNrKTsKLQkgIH0KLQkgIGZlZWRiYWNrID0gbnVsbDsKLQkgIG9yaWdpbmFsTG9jYXRpb24gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEVyYXNlIGZlZWRiYWNrIGluZGljYXRpbmcgdGhhdCB0aGUgcmVjZWl2ZXIgb2JqZWN0IGlzIAotICAgKiBiZWluZyBkcmFnZ2VkLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBkcmFnIGlzCi0gICAqIGNvbXBsZXRlZCBvciBjYW5jZWxsZWQgb24gdGhlIHJlY2VpdmVyIG9iamVjdC4KLSAgICogQHBhcmFtIGRyYWdUcmFja2VyIG9yZy5lY2xpcHNlLmdlZi50b29scy5EcmFnVHJhY2tlciBUaGUgZHJhZyB0cmFja2VyIG9mIHRoZSB0b29sIHBlcmZvcm1pbmcgdGhlIGRyYWcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgCi0gIHsKLSAgICBpZiAoUkVRX01PVkUuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSB8fCAgUkVRX0FERC5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKQotICAgIHsKLQkJICBlcmFzZUNoYW5nZUJvdW5kc0ZlZWRiYWNrKChDaGFuZ2VCb3VuZHNSZXF1ZXN0KXJlcXVlc3QpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKQotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRIb3N0KCk7Ci0gICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUZlZWRiYWNrSGFuZGxlcikKLSAgICB7Ci0gICAgICAoKElGZWVkYmFja0hhbmRsZXIpZWRpdFBhcnQpLnJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsKLSAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJRmVlZGJhY2tIYW5kbGVyKQotICAgIHsKLSAgICAgICgoSUZlZWRiYWNrSGFuZGxlcillZGl0UGFydCkuYWRkRmVlZGJhY2soKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0V4cGFuZGFibGVHcmFwaE5vZGVDb250ZW50RmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0V4cGFuZGFibGVHcmFwaE5vZGVDb250ZW50RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMjBkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9FeHBhbmRhYmxlR3JhcGhOb2RlQ29udGVudEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuSW50ZXJhY3RvcjsKLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgCi0KLS8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgRXhwYW5kYWJsZUdyYXBoTm9kZUNvbnRlbnRGaWd1cmUgICAgICAgICB8Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgfAotLy8gIHwgICB8IHZlcnRpY2FsR3JvdXAgICAgICAgICAgICAgICAgICB8ICAgICB8Ci0vLyAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwKLS8vICB8ICAgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgfCAgICAgfAotLy8gIHwgICB8IHwgaG9yaXpvbnRhbEdyb3VwICAgICAgICAgICB8ICB8ICAgICB8Ci0vLyAgfCAgIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgICAgIHwKLS8vICB8ICAgfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgfCAgfCAgICAgfAotLy8gIHwgICB8IHwgfCBvdXRsaW5lZEFyZWEgICAgICB8ICAgICB8ICB8ICAgICB8Ci0vLyAgfCAgIHwgfCB8IC0tLS0tLS0tLS0tLS0tLS0tIHwgICAgIHwgIHwgICAgIHwKLS8vICB8ICAgfCB8IHwgfFsrXWljb25BcmVhICAgIHwgfCAgICAgfCAgfCAgICAgfAotLy8gIHwgICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8ICAgICB8ICB8ICAgICB8Ci0vLyAgfCAgIHwgfCB8IC0tLS0tLS0tLS0tLS0tLS0tIHwgICAgIHwgIHwgICAgIHwKLS8vICB8ICAgfCB8IHwgfCBpbm5lckNvbnRlbnQgIHwgfCAgICAgfCAgfCAgICAgfAotLy8gIHwgICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8ICAgICB8ICB8ICAgICB8Ci0vLyAgfCAgIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIHwgIHwgICAgIHwKLS8vICB8ICAgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgfCAgICAgfAotLy8gIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8Ci0vLyAgfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIHwKLS8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUdyYXBoTm9kZUNvbnRlbnRGaWd1cmUgZXh0ZW5kcyBHcmFwaE5vZGVDb250ZW50RmlndXJlCi17ICAgCi0gIHByb3RlY3RlZCBJbnRlcmFjdG9yIGludGVyYWN0b3I7IAotICAvL3Byb3RlY3RlZCBDb250YWluZXJGaWd1cmUgb2NjdXJlbmNlQXJlYTsgIAotIAotICBwdWJsaWMgRXhwYW5kYWJsZUdyYXBoTm9kZUNvbnRlbnRGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsgICAgCi0gIH0gICAgICAKLSAgCi0gIHB1YmxpYyBJbnRlcmFjdG9yIGdldEludGVyYWN0b3IoKQotICB7Ci0gICAgcmV0dXJuIGludGVyYWN0b3I7Ci0gIH0gCi0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWd1cmUoKQotICB7ICAgCi0gICAgLy9jcmVhdGVQcmVjZWVkaW5nU3BhY2UodGhpcyk7ICAgICAgICAgICAKLSAgICBjcmVhdGVWZXJ0aWNhbEdyb3VwKHRoaXMpOwotICAgIGNyZWF0ZU91dGxpbmVkQXJlYSh2ZXJ0aWNhbEdyb3VwKTsgICAKLSAgICBjcmVhdGVJbnRlcmFjdG9yKGljb25BcmVhKTsKLSAgICBpbm5lckNvbnRlbnRBcmVhLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDAsIDEwLCAwLCAwKSk7Ci0gICAgLy9jcmVhdGVPY2N1cmVuY2VBcmVhKHZlcnRpY2FsR3JvdXApOyAgIAotICB9Ci0gIAotICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVJbnRlcmFjdG9yKElGaWd1cmUgcGFyZW50KQotICB7Ci0gICAgaW50ZXJhY3RvciA9IG5ldyBJbnRlcmFjdG9yKCk7Ci0gICAgaW50ZXJhY3Rvci5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigwLCAwLCAwLCA1KSk7Ci0gICAgaW50ZXJhY3Rvci5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIGludGVyYWN0b3Iuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsgCi0gICAgcGFyZW50LmFkZChpbnRlcmFjdG9yKTsKLSAgfSAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJlY2VlZGluZ1NwYWNlKElGaWd1cmUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIGEgc21hbGwgc3BhY2UKLSAgICBSZWN0YW5nbGVGaWd1cmUgc3BhY2UgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0gICAgc3BhY2Uuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgc3BhY2Uuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDEwLCAxMCkpOwotICAgIHBhcmVudC5hZGQoc3BhY2UpOyAgCi0gIH0gIAotICAKLQotICAvL3Byb3RlY3RlZCB2b2lkIGNyZWF0ZU9jY3VyZW5jZUFyZWEoSUZpZ3VyZSBwYXJlbnQpCi0gIC8vewotICAvLyAgb2NjdXJlbmNlQXJlYSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsgICAgICAgICAgICAgCi0gIC8vICBwYXJlbnQuYWRkKG9jY3VyZW5jZUFyZWEpOwotICAvL30gICAgICAgICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvR3JhcGhOb2RlQ29udGVudEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9HcmFwaE5vZGVDb250ZW50RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDAzYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9HcmFwaE5vZGVDb250ZW50RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5Db250YWluZXJGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLklDb25uZWN0ZWRGaWd1cmU7Ci0gICAgICAgICAgICAgIAotCi0vLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBHcmFwaE5vZGVDb250ZW50RmlndXJlICAgICB8Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyAgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICB8Ci0vLyAgfCB8IHZlcnRpY2FsIGdyb3VwICAgICAgICB8ICB8Ci0vLyAgfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8ICB8Ci0vLyAgfCB8IHwgb3V0bGluZWQgYXJlYSAgICAgfCB8ICB8Ci0vLyAgfCB8IHwgLS0tLS0tLS0tLS0tLS0tLS0gfCB8ICB8Ci0vLyAgfCB8IHwgfCBpY29uIGFyZWEgICAgIHwgfCB8ICB8Ci0vLyAgfCB8IHwgLS0tLS0tLS0tLS0tLS0tLS0gfCB8ICB8Ci0vLyAgfCB8IHwgLS0tLS0tLS0tLS0tLS0tLS0gfCB8ICB8Ci0vLyAgfCB8IHwgfCBpbm5lciBjb250ZW50IHwgfCB8ICB8Ci0vLyAgfCB8IHwgLS0tLS0tLS0tLS0tLS0tLS0gfCB8ICB8Ci0vLyAgfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8ICB8Ci0vLyAgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICB8Ci0vLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBjbGFzcyBHcmFwaE5vZGVDb250ZW50RmlndXJlIGV4dGVuZHMgQ29udGFpbmVyRmlndXJlIGltcGxlbWVudHMgSUNvbm5lY3RlZEZpZ3VyZQoteyAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIHZlcnRpY2FsR3JvdXA7IAotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIG91dGxpbmVkQXJlYTsKLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSBpY29uQXJlYTsKLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSBpbm5lckNvbnRlbnRBcmVhOyAKLSAgICAgICAgIAotICBwdWJsaWMgR3JhcGhOb2RlQ29udGVudEZpZ3VyZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBjcmVhdGVGaWd1cmUoKTsgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAgCi0gICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlndXJlKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0SG9yaXpvbnRhbCh0cnVlKTsKLSAgICAvL3NldExheW91dE1hbmFnZXIobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgY3JlYXRlVmVydGljYWxHcm91cCh0aGlzKTsKLSAgICBjcmVhdGVPdXRsaW5lZEFyZWEodmVydGljYWxHcm91cCk7IAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmVydGljYWxHcm91cChJRmlndXJlIHBhcmVudCkKLSAgewotICAgIHZlcnRpY2FsR3JvdXAgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgdmVydGljYWxHcm91cC5nZXRDb250YWluZXJMYXlvdXQoKS5zZXRIb3Jpem9udGFsKGZhbHNlKTsKLSAgICAvLy92ZXJ0aWNhbEdyb3VwLnNldExheW91dE1hbmFnZXIobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgcGFyZW50LmFkZCh2ZXJ0aWNhbEdyb3VwKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU91dGxpbmVkQXJlYShJRmlndXJlIHBhcmVudCkKLSAgeyAKLSAgICBvdXRsaW5lZEFyZWEgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgLy9vdXRsaW5lZEFyZWEuc2V0TGF5b3V0TWFuYWdlcihuZXcgRmlsbExheW91dCgpKTsKLSAgICBvdXRsaW5lZEFyZWEuZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgcGFyZW50LmFkZChvdXRsaW5lZEFyZWEpOyAgICAgIAotICAgICAKLSAgICBpY29uQXJlYSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICBpY29uQXJlYS5nZXRDb250YWluZXJMYXlvdXQoKS5zZXRIb3Jpem9udGFsKHRydWUpOwotICAgIG91dGxpbmVkQXJlYS5hZGQoaWNvbkFyZWEpOwotCi0gICAgaW5uZXJDb250ZW50QXJlYSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICAvL2lubmVyQ29udGVudEFyZWEuc2V0TGF5b3V0TWFuYWdlcihuZXcgRmlsbExheW91dCgpKTsKLSAgICBpbm5lckNvbnRlbnRBcmVhLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIG91dGxpbmVkQXJlYS5hZGQoaW5uZXJDb250ZW50QXJlYSk7ICAKLSAgfSAgIAotCi0gIHB1YmxpYyBDb250YWluZXJGaWd1cmUgZ2V0SWNvbkFyZWEoKQotICB7Ci0gICAgcmV0dXJuIGljb25BcmVhOwotICB9Ci0KLSAgcHVibGljIENvbnRhaW5lckZpZ3VyZSBnZXRPdXRsaW5lZEFyZWEoKQotICB7Ci0gICAgcmV0dXJuIG91dGxpbmVkQXJlYTsKLSAgfQotCi0gIHB1YmxpYyBDb250YWluZXJGaWd1cmUgZ2V0SW5uZXJDb250ZW50QXJlYSgpCi0gIHsKLSAgICByZXR1cm4gaW5uZXJDb250ZW50QXJlYTsKLSAgfSAKLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIHJldHVybiBvdXRsaW5lZEFyZWE7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL015Q29ubmVjdGlvblJlbmRlcmluZ0hlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9NeUNvbm5lY3Rpb25SZW5kZXJpbmdIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwMDc4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL015Q29ubmVjdGlvblJlbmRlcmluZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuRGVmaW5pdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5Hcm91cEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5QYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExHcm91cE9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5JQ29ubmVjdGVkRmlndXJlOwotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIE15Q29ubmVjdGlvblJlbmRlcmluZ0hlbHBlciAvL2ltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgoteyAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc091dGxpbmVkID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcjsKLQotICBwdWJsaWMgTXlDb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyKEVkaXRQYXJ0Vmlld2VyIHZpZXdlcikKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOyAgICAKLSAgICAvL3ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gICAgLy9zZXRGb2N1c1RyYXZlcnNhYmxlKGZhbHNlKTsgCi0gICAgLy9zZXRFbmFibGVkKGZhbHNlKTsgCi0gIH0gICAgICAKLSAgCi0gIC8vcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIAotICAvL3sKLSAgLy99Ci0gICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgZmlsbFNoYXBlSGVscGVyKEdyYXBoaWNzIGdyYXBoaWNzKQotICB7IAotICAgIGRyYXdMaW5lcyhncmFwaGljcywgdmlld2VyLmdldFJvb3RFZGl0UGFydCgpKTsgICAgCi0gIH0KLSAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0Q29ubmVjdGlvbkJvdW5kcyhJRmlndXJlIGZpZ3VyZSkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgUmVjdGFuZ2xlIHIgPSBudWxsOwotICAgIGlmIChmaWd1cmUgaW5zdGFuY2VvZiBJQ29ubmVjdGVkRmlndXJlKQotICAgIHsKLSAgICAgIElDb25uZWN0ZWRGaWd1cmUgY29ubmVjdGVkRmlndXJlID0gKElDb25uZWN0ZWRGaWd1cmUpZmlndXJlOwotICAgICAgciA9IGNvbm5lY3RlZEZpZ3VyZS5nZXRDb25uZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByID0gZmlndXJlLmdldEJvdW5kcygpOwotICAgIH0KLSAgICByZXR1cm4gcjsgCi0gIH0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgZmluYWwgc3RhdGljIGludCBET1RURURfTElORV9IRUlHSFQgPSAyMDsKLSAgcHJvdGVjdGVkIGludCBnZXRDbGlwcGVkWShpbnQgeSwgUmVjdGFuZ2xlIGJvdW5kcykKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChib3VuZHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoeSA8IGJvdW5kcy55KQotICAgICAgewotICAgICAgICB5ID0gYm91bmRzLnk7Ci0gICAgICB9ICAgICAKLSAgICAgIGlmICh5ICA+IChib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpKQotICAgICAgewotICAgICAgICB5ID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0OyAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHk7Ci0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIHZvaWQgZHJhd0xpbmUoR3JhcGhpY3MgZ3JhcGhpY3MsIElGaWd1cmUgYSwgSUZpZ3VyZSBiLCBpbnQgbXgsIFJlY3RhbmdsZSBib3VuZHMpCi0gIHsKLSAgICAgICAgUmVjdGFuZ2xlIHIxID0gZ2V0Q29ubmVjdGlvbkJvdW5kcyhhKTsKLSAgICAgICAgUmVjdGFuZ2xlIHIyID0gZ2V0Q29ubmVjdGlvbkJvdW5kcyhiKTsKLSAgICAgICAgaW50IHgxID0gcjEueCArIHIxLndpZHRoOwotICAgICAgICBpbnQgeTEgPSByMS55ICsgcjEuaGVpZ2h0IC8gMjsKLSAgICAgICAgaW50IHgyID0gcjIueCAtIDE7Ci0gICAgICAgIGludCB5MiA9IHIyLnkgKyByMi5oZWlnaHQgLyAyOwotICAgICAgICAgIAotICAgICAgICBpbnQgY2xpcHBlZFkxID0gZ2V0Q2xpcHBlZFkoeTEsIGJvdW5kcyk7Ci0gICAgICAgIGludCBjbGlwcGVkWTIgPSBnZXRDbGlwcGVkWSh5MiwgYm91bmRzKTsKLQotICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCi0gICAgICAgIGlmIChjbGlwcGVkWTEgPT0geTEgfHwgY2xpcHBlZFkyID09IHkyKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBpZiAoY2xpcHBlZFkxID09IHkxKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGRyYXcgaG9yaXpvbnRhbCBsaW5lCi0gICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIG14LCB5MSk7IAotICAgICAgICAgIH0KLSAgICAgICAKLSAgICAgICAgICBpZiAoY2xpcHBlZFkyID09IHkyKQotICAgICAgICAgIHsgICAgICAgIAotICAgICAgICAgICAgLy8gZHJhdyBob3Jpem9udGFsIGxpbmUKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKG14LCB5MiwgeDIgLSAxLCB5Mik7ICAgIAotCi0gICAgICAgICAgICAvLyBkcmF3IHRoZSBhcnJvdyBoZWFkCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUoeDIgLSAxLCB5MiwgeDIgLSA0LCB5MiAtIDMpOyAKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHgyIC0gMSwgeTIsIHgyIC0gNCwgeTIgKyAzKTsgCi0gICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgIC8vIGRyYXcgdGhlIHZlcnRpY2FsIGxpbmUgaW5jbHVkaW5nIGRvdHRlZCBlbmRzCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpbnQgbG93Q2xpcHBlZFkgPSBNYXRoLm1pbihjbGlwcGVkWTEsIGNsaXBwZWRZMik7Ci0gICAgICAgICAgaW50IGhpZ2hDbGlwcGVkWSA9IE1hdGgubWF4KGNsaXBwZWRZMSwgY2xpcHBlZFkyKTsKLSAgICAgICAgICBpbnQgbG93WSA9IE1hdGgubWluKHkxLCB5Mik7Ci0gICAgICAgICAgaW50IGhpZ2hZID0gTWF0aC5tYXgoeTEsIHkyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgIGlmIChsb3dZID09IGxvd0NsaXBwZWRZICYmIGhpZ2hZID09IGhpZ2hDbGlwcGVkWSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShteCwgbG93Q2xpcHBlZFksIG14LCBoaWdoQ2xpcHBlZFkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIGludCBkb3R0ZWRMaW5lTGVuZ3RoID0gTWF0aC5taW4oRE9UVEVEX0xJTkVfSEVJR0hULCAoaGlnaFkgLSBsb3dZKS8zKTsKLSAgICAgICAgICAgIGlmIChsb3dZICE9IGxvd0NsaXBwZWRZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9ET1QpOwotICAgICAgICAgICAgICBpbnQgZG90dGVkWSA9IGxvd0NsaXBwZWRZICsgZG90dGVkTGluZUxlbmd0aDsKLSAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUobXgsIGxvd0NsaXBwZWRZLCBteCwgZG90dGVkWSk7IAotICAgICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9TT0xJRCk7Ci0gICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKG14LCBkb3R0ZWRZLCBteCwgaGlnaENsaXBwZWRZKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8vaWYgKGhpZ2hZICE9IGhpZ2hDbGlwcGVkWSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZ3JhcGhpY3Muc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfRE9UKTsKLSAgICAgICAgICAgICAgaW50IGRvdHRlZFkgPSBoaWdoQ2xpcHBlZFkgLSBkb3R0ZWRMaW5lTGVuZ3RoOwotICAgICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShteCwgaGlnaENsaXBwZWRZLCBteCwgZG90dGVkWSk7IAotICAgICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9TT0xJRCk7Ci0gICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKG14LCBkb3R0ZWRZLCBteCwgbG93Q2xpcHBlZFkpOyAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRyYXdMaW5lcyhHcmFwaGljcyBncmFwaGljcywgRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsgCi0gICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICB7IAotICAgICAgR3JvdXBFZGl0UGFydCBsZWZ0R3JvdXBFZGl0UGFydCA9IChHcm91cEVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgR3JvdXBFZGl0UGFydCByaWdodEdyb3VwRWRpdFBhcnQgPSBsZWZ0R3JvdXBFZGl0UGFydC5nZXROZXh0KCk7Ci0KLSAgICAgIGlmIChsZWZ0R3JvdXBFZGl0UGFydCAhPSBudWxsICYmIHJpZ2h0R3JvdXBFZGl0UGFydCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChsZWZ0R3JvdXBFZGl0UGFydC5vdXRwdXRDb25uZWN0aW9uICE9IG51bGwgJiYgcmlnaHRHcm91cEVkaXRQYXJ0LmlucHV0Q29ubmVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG14ID0gcmlnaHRHcm91cEVkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnggLSA1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgUmVjdGFuZ2xlIGwgPSBsZWZ0R3JvdXBFZGl0UGFydC5vdXRlclBhbmUuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgUmVjdGFuZ2xlIHIgPSBsZWZ0R3JvdXBFZGl0UGFydC5vdXRlclBhbmUuZ2V0Qm91bmRzKCk7Ci0KLSAgICAgICAgICAvLyBoZXJlIHdlIGNvbXB1dGUgdGhlIHVuaW9uIG9mIHRoZSBncm91cCBib3VuZHMuLi4gcmVjdGFuZ2xlLnVuaW9uKCkgZG9lc24ndCBzZWVtIHRvIHdvcmsKLSAgICAgICAgICAvLwotICAgICAgICAgIGludCB1eDEgPSBNYXRoLm1pbihsLngsIHIueCk7IAotICAgICAgICAgIGludCB1eTEgPSBNYXRoLm1pbihsLnksIHIueSk7ICAgICAgIAotICAgICAgICAgIGludCB1eDIgPSBNYXRoLm1heChsLnggKyBsLndpZHRoLCByLnggKyByLndpZHRoKTsKLSAgICAgICAgICBpbnQgdXkyID0gTWF0aC5tYXgobC55ICsgbC5oZWlnaHQsIHIueSArIHIuaGVpZ2h0KTsKLSAgICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gbmV3IFJlY3RhbmdsZSh1eDEsIHV5MSwgdXgyIC0gdXgxLCB1eTIgLSB1eTEpOyAgICAgICAKLSAgICAgICAgICBkcmF3TGluZShncmFwaGljcywgbGVmdEdyb3VwRWRpdFBhcnQub3V0cHV0Q29ubmVjdGlvbi5nZXRGaWd1cmUoKSwgcmlnaHRHcm91cEVkaXRQYXJ0LmlucHV0Q29ubmVjdGlvbi5nZXRGaWd1cmUoKSwgbXgsIGJvdW5kcyk7ICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfSAgCi0gICAgZWxzZSBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0KQotICAgIHsKLSAgICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQgPSAoZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKSA/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KWVkaXRQYXJ0LmdldENoaWxkcmVuKCkuZ2V0KDApIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsOwotICAgICAgaWYgKGNoaWxkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIERlZmluaXRpb25FZGl0UGFydCBkZWYgPSAoRGVmaW5pdGlvbkVkaXRQYXJ0KWVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgICAgICBHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQgPSBkZWYuZ2V0R3JvdXBFZGl0UGFydChXU0RMR3JvdXBPYmplY3QuTUVTU0FHRVNfR1JPVVApOwotICAgICAgICBpZiAoZ3JvdXBFZGl0UGFydCAhPSBudWxsICYmIGdyb3VwRWRpdFBhcnQub3V0cHV0Q29ubmVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG14ID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueCAtIDEyOwotICAgICAgICAgIGRyYXdMaW5lKGdyYXBoaWNzLCBncm91cEVkaXRQYXJ0Lm91dHB1dENvbm5lY3Rpb24uZ2V0RmlndXJlKCksIGNoaWxkLmdldEZpZ3VyZSgpLCBteCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgIGRyYXdMaW5lcyhncmFwaGljcywgY2hpbGQpOwotICAgICAgfQotICAgIH0gCi0gIH0gICAgCi19ICAgICAKLQotLyoKLSAgICAvKgotICAgIExpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSlpLm5leHQoKTsKLSAgICAgIGRyYXdMaW5lcyhncmFwaGljcywgY2hpbGQpOyAgICAKLSAgICB9ICovIAotICAgICAgLyogIAotICAgICAgTGlzdCBjb25uZWN0ZWRGaWd1cmVzID0gZ3JhcGhOb2RlRmlndXJlLmdldENvbm5lY3RlZEZpZ3VyZXMoSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlLlJJR0hUX0NPTk5FQ1RJT04pOwotICAgICAgaW50IGNvbm5lY3RlZEZpZ3VyZXNTaXplID0gY29ubmVjdGVkRmlndXJlcy5zaXplKCk7ICAgICAgICAgICAgICAKLQotICAgICAgaWYgKGNvbm5lY3RlZEZpZ3VyZXNTaXplID4gMCkgCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGZpcnN0R3JhcGhOb2RlRmlndXJlID0gKElDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZSljb25uZWN0ZWRGaWd1cmVzLmdldCgwKTsKLSAgICAgICAgUmVjdGFuZ2xlIHIgPSBncmFwaE5vZGVGaWd1cmUuZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLmdldEJvdW5kcygpOyAgICAKLSAgICAgICAgICAKLSAgICAgICAgaW50IHgxID0gci54ICsgci53aWR0aDsKLSAgICAgICAgaW50IHkxID0gci55ICsgci5oZWlnaHQvMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGludCBzdGFydE9mQ2hpbGRCb3ggPSBmaXJzdEdyYXBoTm9kZUZpZ3VyZS5nZXRDb25uZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCkueDsKLSAgICAgICAgaW50IHgyID0geDEgKyAoc3RhcnRPZkNoaWxkQm94IC0geDEpIC8gMzsKLSAgICAgICAgaW50IHkyID0geTE7Ci0gICAgICAKLSAgICAgICAgaWYgKGNvbm5lY3RlZEZpZ3VyZXNTaXplID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIHN0YXJ0T2ZDaGlsZEJveCwgeTIpOyAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLy8gKGNvbm5lY3RlZEZpZ3VyZXMubGVuZ3RoID4gMSkKLSAgICAgICAgeyAKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIHgyLCB5Mik7Ci0KLSAgICAgICAgICBpbnQgbWluWSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgIGludCBtYXhZID0gLTE7Ci0KLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25uZWN0ZWRGaWd1cmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGNvbm5lY3RlZEZpZ3VyZSA9IChJQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgY2hpbGRDb25uZWN0aW9uUmVjdGFuZ2xlID0gY29ubmVjdGVkRmlndXJlLmdldENvbm5lY3Rpb25GaWd1cmUoKS5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgIGludCB5ID0gY2hpbGRDb25uZWN0aW9uUmVjdGFuZ2xlLnkgKyBjaGlsZENvbm5lY3Rpb25SZWN0YW5nbGUuaGVpZ2h0IC8gMjsKLSAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTsKLSAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTsKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHgyLCB5LCBjaGlsZENvbm5lY3Rpb25SZWN0YW5nbGUueCwgeSk7Ci0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MiwgbWluWSwgeDIsIG1heFkpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0gICAgICAgICAgICAKLQotICAgIC8vYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdHJ1ZTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICBkcmF3TGluZXMoZ3JhcGhpY3MsIGNoaWxkKTsKLSAgICB9Ci0qLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9UcmVlTm9kZUNvbnRlbnRGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvVHJlZU5vZGVDb250ZW50RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOGI3OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9UcmVlTm9kZUNvbnRlbnRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBUcmVlTm9kZUNvbnRlbnRGaWd1cmUgZXh0ZW5kcyBFeHBhbmRhYmxlR3JhcGhOb2RlQ29udGVudEZpZ3VyZQoteyAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPdXRsaW5lZEFyZWEoSUZpZ3VyZSBwYXJlbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgCi0gICAgc3VwZXIuY3JlYXRlT3V0bGluZWRBcmVhKHBhcmVudCk7Ci0gICAgb3V0bGluZWRBcmVhLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDAsMiwwLDIpKTsgCi0gIH0gICAgCi0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIHJldHVybiBvdXRsaW5lZEFyZWE7Ci0gIH0gICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL21vZGVsL1dTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL21vZGVsL1dTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzNmNlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9tb2RlbC9XU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguVmlld01vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETE1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkKLXsgICAgICAgICAgCi0gIHByb3RlY3RlZCBzdGF0aWMgV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSB3c2RsR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2U7Ci0KLSAgcHVibGljIHN0YXRpYyBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5IGdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKQotICB7ICAgICAgICAgICAgICAgIAotICAgIGlmICh3c2RsR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB3c2RsR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2UgPSBuZXcgV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gd3NkbEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeUluc3RhbmNlOwotICB9ICAKLSAgCi0gIHByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEdyYXBoQWRhcHRlckZhY3RvcnkoKTsKLSAgfSAgCi0KLSAgLy9wcm90ZWN0ZWQgYm9vbGVhbiBpc0V4dGVuc2liaWxpdHlFbGVtZW50Q29uc2lkZXJlZENoaWxkKCkKLSAgLy97Ci0gIC8vICByZXR1cm4gZmFsc2U7Ci0gIC8vfQotICAgICAgICAKLQotICAvLyBUaGVyZSBhcmUgbWFueSBhZGFwdGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmYWN0b3J5LiAgRWFjaCBET00gTm9kZSBoYXMgaXRzIG93biBhZGFwdGVyLgotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFdTRExBZGFwdGVyRmFjdG9yeUltcGwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlZmluaXRpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyYXBoRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLSAgICB9IAotICAgIAotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdBZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyYXBoQmluZGluZ0FkYXB0ZXIoKTsKLSAgICB9IAotCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFydEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgR3JhcGhQYXJ0QWRhcHRlcigpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgLy9wdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0QWRhcHRlcigpCi0gICAgLy97Ci0gICAgLy8gIHJldHVybiBuZXcgR3JhcGhQb3J0QWRhcHRlcigpOwotICAgIC8vfQotCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydFR5cGVBZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyYXBoUG9ydFR5cGVBZGFwdGVyKCk7Ci0gICAgfQotCi0gICAgLy9wdWJsaWMgQWRhcHRlciBjcmVhdGVJbnB1dEFkYXB0ZXIoKQotICAgIC8vewotICAgIC8vICByZXR1cm4gbmV3IEdyYXBoSW5wdXRBZGFwdGVyKCk7Ci0gICAgLy99IAotCi0gICAgLy9wdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRwdXRBZGFwdGVyKCkKLSAgICAvL3sKLSAgICAvLyAgcmV0dXJuIG5ldyBHcmFwaE91dHB1dEFkYXB0ZXIoKTsKLSAgICAvL30gICAKLQotICAgIC8vcHVibGljIEFkYXB0ZXIgY3JlYXRlRmF1bHRBZGFwdGVyKCkKLSAgICAvL3sKLSAgICAvLyAgcmV0dXJuIG5ldyBHcmFwaEZhdWx0QWRhcHRlcigpOwotICAgIC8vfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVUeXBlc0FkYXB0ZXIoKSAKLSAgICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJldHVybiBuZXcgR3JhcGhUeXBlc0FkYXB0ZXIoKTsKLSAgICB9Ci0gIH0gICAgICAKLQotICAgICAgICAKLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBHcmFwaERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgRGVmaW5pdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBWaWV3TW9kZS5MaXN0ZW5lcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBWaWV3TW9kZSB2aWV3TW9kZSA9IG5ldyBWaWV3TW9kZSgpOyAgCi0gCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7ICAgCi0gICAgICB2aWV3TW9kZS5hZGRMaXN0ZW5lcih0aGlzKTsgICAgICAgICAKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGxpc3QuYWRkKHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuZ2V0KDApKTsKLSAgICAgIGxpc3QuYWRkKHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuZ2V0KDEpKTsgIAotICAgICAgbGlzdC5hZGQocGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5nZXQoNSkpOwotICAgICAgaWYgKHZpZXdNb2RlLmlzQmluZGluZ1Zpc2libGUoKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQocGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5nZXQoNCkpOwotICAgICAgfSAKLSAgICAgIGxpc3QuYWRkKHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuZ2V0KDMpKTsgIAotICAgICAgbGlzdC5hZGQocGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5nZXQoMikpOyAgCi0gICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnRzR3JvdXAuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChleHRlbnNpYmlsaXR5RWxlbWVudHNHcm91cCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdDsgICAgICAKLSAgICB9Ci0KLSAgCi0gICAgcHVibGljIHZvaWQgdmlld01vZGVDaGFuZ2VkKFZpZXdNb2RlIG1vZGUpCi0gICAgewotICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlZEhlbHBlcigpOwotICAgIH0gICAgCi0KLSAgICBwdWJsaWMgVmlld01vZGUgZ2V0Vmlld01vZGUoKQotICAgIHsKLSAgICAgIHJldHVybiB2aWV3TW9kZTsKLSAgICB9ICAgIAotCi0gICAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlckZhY3RvcnkgZ2V0TW9kZWxBZGFwdGVyRmFjdG9yeSgpCi0gICAgewotICAgICAgcmV0dXJuIGdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKTsKLSAgICB9Ci0gIH0KLQotCi0KLQotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhCaW5kaW5nQWRhcHRlciBleHRlbmRzIEJpbmRpbmdBZGFwdGVyCi0gIHsgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgCi0gICAgICBpZiAoYmluZGluZy5nZXRQb3J0VHlwZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ki8gIAotICB9Ci0gICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhQYXJ0QWRhcHRlciBleHRlbmRzIFBhcnRBZGFwdGVyCi0gIHsgLyogIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgIE9iamVjdCBjb21wb25lbnQgPSBwYXJ0LmdldFR5cGUoKTsKLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE8uLi4gaSdtIHB1bGxpbmcgYSBmYXN0IG9uZSBoZXJlLi4uLiB3ZSBzaG91bGQgY2FsbCB0aGUgZXh0ZW5zaW9uCi0gICAgICAgIC8vIHRvIHNlZSBpZiBoZSB3YW50cyB0byBzaG93IGEgY2hpbGQgaGVyZQotICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50ID0gcGFydC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSovICAgCi0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIGNsYXNzIEdyYXBoUG9ydFR5cGVBZGFwdGVyIGV4dGVuZHMgUG9ydFR5cGVBZGFwdGVyCi0gIHsgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBtb2RlbE9iamVjdCwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImJpbmRpbmdzIikpCi0gICAgICB7ICAgIAotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChwb3J0VHlwZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICByZXN1bHQgPSB1dGlsLmdldEJpbmRpbmdzKHBvcnRUeXBlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkobW9kZWxPYmplY3QsIHByb3BlcnR5TmFtZSk7Ci0gICAgICB9ICAgCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gIAotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIEdyYXBoUG9ydEFkYXB0ZXIgZXh0ZW5kcyBQb3J0QWRhcHRlciBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgCi0gICAgCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZylwb3J0LmdldEJpbmRpbmcoKTsKLQotICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoYmluZGluZyk7Ci0gICAgICB9Ci0gICAgIAotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gcHJvcGFnYXRlIGNoYW5nZXMgdG8gdGhlIGJpbmRpbmcgb2JqZWN0Ci0gICAgLy8KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQocG9ydCwgbnVsbCk7Ci0gICAgfQotICB9ICAgCi0gICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhJbnB1dEFkYXB0ZXIgZXh0ZW5kcyBJbnB1dEFkYXB0ZXIKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGlmIChpbnB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoaW5wdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0gICAgICAgCi0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAgICAKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsgICAgICAgICAgIAotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiYmluZGluZ3MiKSkKLSAgICAgIHsgICAgCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGlucHV0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdCA9IHV0aWwuZ2V0QmluZGluZ0lucHV0cyhpbnB1dCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KG1vZGVsT2JqZWN0LCBwcm9wZXJ0eU5hbWUpOwotICAgICAgfSAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgCi0gIH0KLQotCi0gIHByb3RlY3RlZCBjbGFzcyBHcmFwaE91dHB1dEFkYXB0ZXIgZXh0ZW5kcyBPdXRwdXRBZGFwdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBpZiAob3V0cHV0LmdldE1lc3NhZ2UoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChvdXRwdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0gICAgICAgCi0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsgICAgICAgICAgIAotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiYmluZGluZ3MiKSkKLSAgICAgIHsgICAgCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKG91dHB1dC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICByZXN1bHQgPSB1dGlsLmdldEJpbmRpbmdPdXRwdXRzKG91dHB1dCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KG1vZGVsT2JqZWN0LCBwcm9wZXJ0eU5hbWUpOwotICAgICAgfSAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhGYXVsdEFkYXB0ZXIgZXh0ZW5kcyBGYXVsdEFkYXB0ZXIKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGlmIChmYXVsdC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoZmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0gICAgICAgCi0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsgICAgICAgICAgIAotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiYmluZGluZ3MiKSkKLSAgICAgIHsgICAgCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGZhdWx0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdCA9IHV0aWwuZ2V0QmluZGluZ0ZhdWx0cyhmYXVsdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KG1vZGVsT2JqZWN0LCBwcm9wZXJ0eU5hbWUpOwotICAgICAgfSAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAKLQotICBwdWJsaWMgY2xhc3MgR3JhcGhUeXBlc0FkYXB0ZXIgZXh0ZW5kcyBUeXBlc0FkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgcyA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudClvOwotICAgICAgICAgIE9iamVjdCBzY2hlbWEgPSBzLmdldFNjaGVtYSgpOwotICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZChzY2hlbWEpOwotICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQobyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotICAvKgotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhCaW5kaW5nQWRhcHRlciBleHRlbmRzIEJpbmRpbmdBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgIAotICAgICAgaWYgKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChiaW5kaW5nLmdldFBvcnRUeXBlKCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSAgCi0gIH0qLwotCi0gIC8vIGNvbnZlbmllbmNlIG1ldGhvZHMKLSAgLy8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLS8vICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gRWNvcmVVdGlsLmdldEFkYXB0ZXIoZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmVBZGFwdGVycygpLG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfSAgICAKLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmdldEFkYXB0ZXIobW9kZWxPYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotICB9IAotCi0gIHB1YmxpYyBzdGF0aWMgVmlld01vZGUgZ2V0Vmlld01vZGUoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgR3JhcGhEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKEdyYXBoRGVmaW5pdGlvbkFkYXB0ZXIpZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmdldEFkYXB0ZXIoZGVmaW5pdGlvbik7Ci0gICAgcmV0dXJuIGFkYXB0ZXIuZ2V0Vmlld01vZGUoKTsKLSAgfSAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYmFjay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkMWEyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2JpbmRpbmdfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2JpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2ZTJmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iaW5kaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iaW5kaW5naGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iaW5kaW5naGVhZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZmU1NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYmluZGluZ2hlYWRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDAyZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2NvbXBsZXh0eXBlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9jb21wbGV4dHlwZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDdmODUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2NvbXBsZXh0eXBlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9lbGVtZW50X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9lbGVtZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDVmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZWxlbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZXJyb3JfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZXJyb3JfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2Vycm9yX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ZhdWx0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9mYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjI4MTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9maWxlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9maWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTdhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZmxkcl9lbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9mbGRyX2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxYzEzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9mbGRyX2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ZvcndhcmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZm9yd2FyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjY5OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9oaWRlYmluZGluZy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9oaWRlYmluZGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDZjZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaGlkZWJpbmRpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cGFkZHJlc3Nfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHBhZGRyZXNzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjBjMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cGFkZHJlc3Nfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHBiaW5kaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwYmluZGluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDI4ZWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHBiaW5kaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwb3BlcmF0aW9uX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwb3BlcmF0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDA0MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cG9wZXJhdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybGVuY29kZWRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHB1cmxlbmNvZGVkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNTA1MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybGVuY29kZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHB1cmxyZXBsYWNlbWVudF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybHJlcGxhY2VtZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzU4N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybHJlcGxhY2VtZW50X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbXBvcnRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ltcG9ydF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzI3NWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ltcG9ydF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaW1wb3J0aGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbXBvcnRoZWFkZXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwMGNiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbXBvcnRoZWFkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2lucHV0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbnB1dF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTZiMzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2lucHV0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9tZXNzYWdlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9tZXNzYWdlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkY2U0ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbWVzc2FnZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbWVzc2FnZWhlYWRlcl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbWVzc2FnZWhlYWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmE3MTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL21lc3NhZ2VoZWFkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL25hbWVzcGFjZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlM2YyNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9uYW1lc3BhY2VkZWNsX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9uYW1lc3BhY2VkZWNsX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzlkMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlZGVjbF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmV3X3dzZGxfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL25ld193c2RsX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDg3YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmV3X3dzZGxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL29wZXJhdGlvbl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MThhMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9vcGVyYXRpb25iaW5kaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9vcGVyYXRpb25iaW5kaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzg2YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uYmluZGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X25vLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF9uby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YjlmOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X25vLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMDkxOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9vdXRwdXRfeWVzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF95ZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FjYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF95ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcGFnZV9iYW5uZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcGFnZV9iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJjMGIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BhZ2VfYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BhcnRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BhcnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxOWRmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wYXJ0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wb3J0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wb3J0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTQ5OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydHR5cGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BvcnR0eXBlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzI1Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydHR5cGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BvcnR0eXBlaGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wb3J0dHlwZWhlYWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZjYzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BvcnR0eXBlaGVhZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRjbXBseHBsdHlwX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRjbXBseHBsdHlwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiODY2NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0Y21wbHhwbHR5cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0ZWxlbXRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BydGVsZW10X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmQxMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0ZWxlbXRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BydHNtcGx0eXBfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BydHNtcGx0eXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmYzdjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRzbXBsdHlwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zZXJ2aWNlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zZXJ2aWNlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTZiM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc2VydmljZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc2VydmljZWhlYWRlcl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc2VydmljZWhlYWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQ4MTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NlcnZpY2VoZWFkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NpbXBsZXR5cGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NpbXBsZXR5cGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1ZGJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zaW1wbGV0eXBlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDI2ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGFkZHJlc3Nfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBhZGRyZXNzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODBiYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGFkZHJlc3Nfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBhdHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBhdHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiMzY2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwYXR0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwYmluZGluZ19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGJpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1ZjZiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwYmluZGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGJvZHlfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBib2R5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZDAxYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGJvZHlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBmYXVsdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGZhdWx0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NmIxZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MmVhM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGhlYWRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGhlYWRlcmZhdWx0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyZmF1bHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwZTE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyZmF1bHRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBvcGVyYXRpb25fb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBvcGVyYXRpb25fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjMTkxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2Fwb3BlcmF0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy90eXBlc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvdHlwZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNmY4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy90eXBlc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvdmFsaWRhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM0N2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3dzZGxfZmlsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvd3NkbF9maWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjFmOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvd3NkbF9maWxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2RfZmlsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMveHNkX2ZpbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkY2ZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2RfZmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMveHNkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkY2ZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL01vZGVsQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTNlN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsQWRhcHRlcgoteyAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRFJFTl9QUk9QRVJUWSA9ICJDSElMRFJFTl9QUk9QRVJUWSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX1BST1BFUlRZID0gIkxBQkVMX1BST1BFUlRZIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfUFJPUEVSVFkgPSAiSU1BR0VfUFJPUEVSVFkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfUFJPUEVSVFkgPSAiREVUQUlMX1BST1BFUlRZIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTW9kZWxBZGFwdGVyTGlzdGVuZXIgbCk7Ci0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKTsgCi0gIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGIwZGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxBZGFwdGVyRmFjdG9yeQotewotICBwdWJsaWMgTW9kZWxBZGFwdGVyIGdldEFkYXB0ZXIoT2JqZWN0IG8pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL01vZGVsQWRhcHRlckxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9tb2RlbC9Nb2RlbEFkYXB0ZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTNlODUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL01vZGVsQWRhcHRlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsQWRhcHRlckxpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9tb2RlbC9XU0RMR3JvdXBPYmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL1dTRExHcm91cE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM0M2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL1dTRExHcm91cE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotCi0KLSAgCi0vLyBOb3RlIHRoYXQgdGhlIFRZUEVTX0dST1VQIGdyb3VwIGlzIGp1c3QgYSBwbGFjZSBob2xkZXIuICBJZiB0aGUgVHlwZXMgb2JlamN0IGFjdHVhbGx5IGV4aXN0cyAKLS8vIGZvciB0aGUgcm9vdCBXU0RMIGRvY3VtZW50LCBpdCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGlzIG1vZGVsIGdyb3VwCi0vLwotcHVibGljIGNsYXNzIFdTRExHcm91cE9iamVjdCBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTVBPUlRTX0dST1VQID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRVNfR1JPVVAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFU19HUk9VUCA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUlRfVFlQRVNfR1JPVVAgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5ESU5HU19HUk9VUCA9IDU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVTX0dST1VQID0gNjsgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTlNJQklMSVRZX0VMRU1FTlRTX0dST1VQID0gNzsKLSAgICAgICAgIAotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcm90ZWN0ZWQgaW50IHR5cGU7ICAgICAgIAotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBNb2RlbEFkYXB0ZXJGYWN0b3J5IG1vZGVsQWRhcHRlckZhY3Rvcnk7Ci0KLSAgcHVibGljIFdTRExHcm91cE9iamVjdChEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCB0eXBlKQotICB7Ci0gICAgdGhpcyhkZWZpbml0aW9uLCB0eXBlLCBudWxsKTsKLSAgfSAgCi0KLSAgcHVibGljIFdTRExHcm91cE9iamVjdChEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCB0eXBlLCBNb2RlbEFkYXB0ZXJGYWN0b3J5IG1vZGVsQWRhcHRlckZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMudHlwZSA9IHR5cGU7ICAgICAgICAKLSAgICB0aGlzLm1vZGVsQWRhcHRlckZhY3RvcnkgPSBtb2RlbEFkYXB0ZXJGYWN0b3J5OwotICB9Ci0gICAgIAotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRQYXJlbnQoKQotICB7Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0gICAgICAgICAgICAgICAKLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9ICAgICAgICAgICAgICAgCi0KLQotICBwdWJsaWMgaW50IGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgeyAgICAgICAgICAgIAotICAgIFN0cmluZyBuYW1lID0gIiI7Ci0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgSU1QT1JUU19HUk9VUCA6Ci0gICAgICB7ICAgICAgICAgICAKLSAgICAgICAgbmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0ZPTERFUl9JTVBPUlRTIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBNRVNTQUdFU19HUk9VUCA6Ci0gICAgICB7ICAgIAotICAgICAgICBuYW1lID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRk9MREVSX01FU1NBR0VTIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFNFUlZJQ0VTX0dST1VQIDoKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0ZPTERFUl9TRVJWSUNFUyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBCSU5ESU5HU19HUk9VUCA6Ci0gICAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBuYW1lID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRk9MREVSX0JJTkRJTkdTIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgIAotICAgICAgY2FzZSBQT1JUX1RZUEVTX0dST1VQIDoKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIG5hbWUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9GT0xERVJfUE9SVFRZUEVTIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICAgIGNhc2UgVFlQRVNfR1JPVVAgOgotICAgICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgbmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0ZPTERFUl9UWVBFUyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfSAKLSAgICAgIGNhc2UgRVhURU5TSUJJTElUWV9FTEVNRU5UU19HUk9VUDoKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0ZPTERFUl9FWFRFTlNJQklMSVRZX0VMRU1FTlRTIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgcmV0dXJuIG5hbWU7Ci0gIH0gICAgCi0gICAgICAgICAKLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7ICAgICAgICAgICAgICAgIAotICAgIEltYWdlIGltYWdlID0gbnVsbDsKLSAgICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgICAgY2FzZSBJTVBPUlRTX0dST1VQIDoKLSAgICAgIHsgICAgCi0gICAgICAgIGltYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9pbXBvcnRoZWFkZXJfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBNRVNTQUdFU19HUk9VUCA6Ci0gICAgICB7ICAgIAotICAgICAgICBpbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvbWVzc2FnZWhlYWRlcl9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFNFUlZJQ0VTX0dST1VQIDoKLSAgICAgIHsKLSAgICAgICAgaW1hZ2UgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL3NlcnZpY2VoZWFkZXJfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBQT1JUX1RZUEVTX0dST1VQIDoKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGltYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9wb3J0dHlwZWhlYWRlcl9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEJJTkRJTkdTX0dST1VQIDoKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGltYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9iaW5kaW5naGVhZGVyX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0gICAgCi0gICAgICBjYXNlIFRZUEVTX0dST1VQIDoKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGltYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy90eXBlc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IAotICAgICAgY2FzZSBFWFRFTlNJQklMSVRZX0VMRU1FTlRTX0dST1VQOgotICAgICAgewotICAgICAgICBpbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvZmxkcl9lbC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAKLSAgICByZXR1cm4gaW1hZ2U7Ci0gIH0gICAKLQotCi0gIC8vIGltcGxlbWVudCBNb2RlbEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgaWYgKCFsaXN0ZW5lckxpc3QuY29udGFpbnMobGlzdGVuZXIpKQotICAgIHsKLSAgICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICAgIH0KLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0gCi0KLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBtb2RlbE9iamVjdCwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgeyAgICAgICAKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDSElMRFJFTl9QUk9QRVJUWSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0Q2hpbGRyZW4oKTsgICAgICAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExBQkVMX1BST1BFUlRZKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBnZXRMYWJlbCgpOyAgICAgIAotICAgIH0gICAgCi0gICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTUFHRV9QUk9QRVJUWSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0SW1hZ2UoKTsgICAgICAKLSAgICB9ICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyAgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKE9iamVjdCBub3RpZmllciwgU3RyaW5nIHByb3BlcnR5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0IC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyID0gKE1vZGVsQWRhcHRlckxpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKG5vdGlmaWVyLCBwcm9wZXJ0eSk7Ci0gICAgfQotICB9IAotICAgCi0KLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgICAgICAgCi0gICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZGVmaW5pdGlvbik7Ci0gICAgc3dpdGNoIChnZXRUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuSU1QT1JUU19HUk9VUCA6IAotICAgICAgeyAgIAotICAgICAgICBsaXN0ID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0Lk1FU1NBR0VTX0dST1VQIDogCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IHNvcnRNZXNzYWdlcyh1dGlsLmdldE1lc3NhZ2VzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IHV0aWwuZ2V0TWVzc2FnZXMoKTsKLSAgICAgICAgfSAgCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuU0VSVklDRVNfR1JPVVAgOiAKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IHV0aWwuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5QT1JUX1RZUEVTX0dST1VQIDogCi0gICAgICB7ICAgICAgIAotICAgICAgICBsaXN0ID0gdXRpbC5nZXRQb3J0VHlwZXMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5CSU5ESU5HU19HUk9VUCA6IAotICAgICAgewotICAgICAgICBsaXN0ID0gdXRpbC5nZXRCaW5kaW5ncygpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LlRZUEVTX0dST1VQIDogCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE9iamVjdCB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IChMaXN0KW1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcih0eXBlcykuZ2V0UHJvcGVydHkodHlwZXMsIE1vZGVsQWRhcHRlci5DSElMRFJFTl9QUk9QRVJUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgICAKLSAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LkVYVEVOU0lCSUxJVFlfRUxFTUVOVFNfR1JPVVA6Ci0gICAgICB7Ci0gICAgICAgIGxpc3QgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50Tm9kZXMoZGVmaW5pdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGluaXRpYWxTb3J0KExpc3QgaW5wdXRMaXN0KSB7Ci0gIAlMaXN0IG1lc3NhZ2VHcm91cHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAlJdGVyYXRvciBpdGVyYXRvciA9IGlucHV0TGlzdC5pdGVyYXRvcigpOwotICAJCi0gIAl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gIAkJTWVzc2FnZSBuZXdNZXNzYWdlID0gKE1lc3NhZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLSAgCQkKLSAgCQlib29sZWFuIG1lc3NhZ2VBZGRlZCA9IGZhbHNlOwotICAJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBtZXNzYWdlR3JvdXBzLnNpemUoKTsgaW5kZXgrKykgewotICAJCQlNZXNzYWdlR3JvdXAgbWVzc2FnZUl0ZW0gPSAoTWVzc2FnZUdyb3VwKSBtZXNzYWdlR3JvdXBzLmdldChpbmRleCk7Ci0gIAkJCQotICAJCQlpZihtZXNzYWdlSXRlbS5hZGRNZXNzYWdlKG5ld01lc3NhZ2UpKSB7Ci0gIAkJCQltZXNzYWdlQWRkZWQgPSB0cnVlOwotICAJCQkJYnJlYWs7Ci0gIAkJCX0KLSAgCQl9Ci0gIAkJCi0gIAkJLy8gRG8gd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgTWVzc2FnZUdyb3VwIG9iamVjdD8KLSAgCQlpZiAoIW1lc3NhZ2VBZGRlZCkgewotICAJCQlNZXNzYWdlR3JvdXAgbXNHcm91cCA9IG5ldyBNZXNzYWdlR3JvdXAobmV3TWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQkJCW1zR3JvdXAuYWRkTWVzc2FnZShuZXdNZXNzYWdlKTsKLSAgCQkJbWVzc2FnZUdyb3Vwcy5hZGQobXNHcm91cCk7Ci0gIAkJfQotICAJfQotCi0gIAlyZXR1cm4gbWVzc2FnZUdyb3VwczsKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGJ1aWxkTWVzc2FnZUxpc3QoTGlzdCBsaXN0KSB7Ci0gIAlMaXN0IHNvcnRlZE1lc3NhZ2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAJCi0gIAlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLSAgCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgCQlNZXNzYWdlR3JvdXAgbUdyb3VwID0gKE1lc3NhZ2VHcm91cCkgaXRlcmF0b3IubmV4dCgpOwotICAJCXNvcnRlZE1lc3NhZ2VMaXN0LmFkZEFsbChtR3JvdXAuZ2V0TWVzc2FnZXMoKSk7Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBzb3J0ZWRNZXNzYWdlTGlzdDsKLSAgfQotCi0gIHByaXZhdGUgTGlzdCBzb3J0TWVzc2FnZXMoTGlzdCBpbnB1dExpc3QpIHsKLSAgCUxpc3Qgc29ydGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCXNvcnRlZExpc3QuYWRkQWxsKGlucHV0TGlzdCk7Ci0gIAkKLSAgCS8vIEdldCBhIHNvcnRlZCBsaXN0IG9mIE1lc3NhZ2VHcm91cHMKLSAgCXNvcnRlZExpc3QgPSBpbml0aWFsU29ydChpbnB1dExpc3QpOwotCi0gIAlDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZExpc3QsIG5ldyBDb21wYXJhdG9yKCkgewotICAJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAJCQlTdHJpbmcgbmFtZTEgPSAoKE1lc3NhZ2VHcm91cCkgbzEpLmdldEJhc2VOYW1lKCk7Ci0gIAkJCVN0cmluZyBuYW1lMiA9ICgoTWVzc2FnZUdyb3VwKSBvMikuZ2V0QmFzZU5hbWUoKTsKLSAgCQkJCi0gIAkJCXJldHVybiBuYW1lMS5jb21wYXJlVG9JZ25vcmVDYXNlKG5hbWUyKTsKLSAgICAgIAl9ICAJCi0gIAl9KTsKLSAgCQotICAJc29ydGVkTGlzdCA9IGJ1aWxkTWVzc2FnZUxpc3Qoc29ydGVkTGlzdCk7Ci0gIAlyZXR1cm4gc29ydGVkTGlzdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBNZXNzYWdlR3JvdXAgewotICAJcHJpdmF0ZSBTdHJpbmcgYmFzZU5hbWU7Ci0gIAlwcml2YXRlIFZlY3RvciBtZXNzYWdlczsKLSAgCQotICAJcHVibGljIE1lc3NhZ2VHcm91cChTdHJpbmcgbmFtZSkgewotICAJCXRoaXMuYmFzZU5hbWUgPSBjb21wdXRlQmFzZU5hbWUobmFtZSk7Ci0gIAkJbWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyBib29sZWFuIGFkZE1lc3NhZ2UoTWVzc2FnZSBuZXdNZXNzYWdlKSB7Ci0gIAkJLy8gZG8gY2hlY2sgaWYgaXQgYmVsb25ncyBoZXJlPy4uLi4uLgotICAJCVN0cmluZyBuZXdNZXNzYWdlQmFzZU5hbWUgPSBjb21wdXRlQmFzZU5hbWUobmV3TWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgCQkKLSAgCQlpZiAobmV3TWVzc2FnZUJhc2VOYW1lLmVxdWFsc0lnbm9yZUNhc2UoZ2V0QmFzZU5hbWUoKSkpIHsKLSAgCQkJYWRkVG9Tb3J0ZWRMaXN0KG5ld01lc3NhZ2UpOwotICAJCQkKLSAgCQkJcmV0dXJuIHRydWU7Ci0gIAkJfQotICAJCQotICAJCXJldHVybiBmYWxzZTsKLSAgCX0KLSAgCQotICAJcHVibGljIFZlY3RvciBnZXRNZXNzYWdlcygpIHsKLSAgCQlyZXR1cm4gbWVzc2FnZXM7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7Ci0gIAkJcmV0dXJuIGJhc2VOYW1lOwotICAJfQotICAJCi0gIAlwcml2YXRlIGludCBnZXRGaXJzdEluc3RhbmNlKFN0cmluZyBzdWJTdHJpbmcpIHsKLSAgCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbWVzc2FnZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gIAkJCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBtZXNzYWdlcy5nZXQoaW5kZXgpOwotICAJCQlTdHJpbmcgbWVzc2FnZU5hbWUgPSBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gIAkJCQotICAJCQlpZiAobWVzc2FnZU5hbWUuaW5kZXhPZihzdWJTdHJpbmcsIDEpID4gMCkgewotICAJCQkJcmV0dXJuIGluZGV4OwotICAJCQl9Ci0gIAkJfQotICAJCSAgCQkKLSAgCQlyZXR1cm4gLTE7Ci0gIAl9Ci0gIAkKLSAgCXByaXZhdGUgdm9pZCBhZGRUb1NvcnRlZExpc3QoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gIAkJLy8gV2UgbmVlZCB0byBhZGQgdGhlIG5ldyBNZXNzYWdlIGluIHRoZSByaWdodCBwb3NpdGlvbgotICAJCWludCBpbmRleCA9IC0xOwotICAJCVN0cmluZyBuYW1lID0gbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAJCWlmIChuYW1lLmluZGV4T2YoIlJlcXVlc3QiLCAxKSA+IDApIHsKLSAgCQkJLy8gQWRkIGFmdGVyIGZpcnN0IGluc3RhbmNlIG9mICdSZXNwb25zZScKLSAgCQkJaW5kZXggPSBnZXRGaXJzdEluc3RhbmNlKCJSZXNwb25zZSIpOwotICAJCX0KLSAgCQllbHNlIGlmIChuYW1lLmluZGV4T2YoIlJlc3BvbnNlIiwgMSkgPiAwKSB7Ci0gIAkJCS8vIEFkZCBhZnRlciBmaXJzdCBpbnN0YW5jZSBvZiAnUmVxdWVzdCcKLSAgCQkJaW5kZXggPSBnZXRGaXJzdEluc3RhbmNlKCJSZXF1ZXN0Iik7Ci0gIAkJCWlmIChpbmRleCA+PSAwKQotICAJCQkJaW5kZXgrKzsKLSAgCQl9Ci0gIAkJCi0gIAkJaWYgKGluZGV4ID49IDApIHsKLSAgCQkJbWVzc2FnZXMuYWRkKGluZGV4LCBtZXNzYWdlKTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkJCW1lc3NhZ2VzLmFkZChtZXNzYWdlKTsKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVCYXNlTmFtZShTdHJpbmcgbmFtZSkgewotICAJCWludCByZXNSZXFJbmRleCA9IG5hbWUuaW5kZXhPZigiUmVxdWVzdCIsIDEpOwotICAJCWludCByZXNSZXFMZW5ndGg7Ci0gIAkJaWYgKHJlc1JlcUluZGV4ID09IC0xKSB7Ci0gIAkJCXJlc1JlcUluZGV4ID0gbmFtZS5pbmRleE9mKCJSZXNwb25zZSIsIDEpOwotICAJCQlyZXNSZXFMZW5ndGggPSAiUmVzcG9uc2UiLmxlbmd0aCgpOwotICAJCX0KLSAgCQllbHNlIHsKLSAgCQkJcmVzUmVxTGVuZ3RoID0gIlJlcXVlc3QiLmxlbmd0aCgpOwotICAJCX0KLSAgCQkJCQotICAJCS8vIERpZCB3ZSBldmVuIGZpbmQgYSBSZXF1ZXN0L1Jlc3BvbnNlIGluIGJvdGggc3RyaW5ncz8KLSAgCQlpZiAocmVzUmVxSW5kZXggIT0gLTEpIHsKLSAgCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIHJlc1JlcUluZGV4KSArIG5hbWUuc3Vic3RyaW5nKHJlc1JlcUluZGV4ICsgcmVzUmVxTGVuZ3RoLCBuYW1lLmxlbmd0aCgpKTsKLSAgCQl9Ci0gIAkJZWxzZSB7ICAJCQotICAJCQlyZXR1cm4gbmFtZTsKLSAgCQl9Ci0gIAl9Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL1dTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9tb2RlbC9XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTJiYTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL1dTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWw7Ci0gICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExTd2l0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSVRyZWVDaGlsZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJGYWN0b3J5Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSB3c2RsTW9kZWxBZGFwdGVyRmFjdG9yeUluc3RhbmNlOwotCi0gIHB1YmxpYyBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpCi0gIHsKLSAgICBhZGFwdGVyRmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0gIH0gICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlbnNpYmlsaXR5RWxlbWVudENvbnNpZGVyZWRDaGlsZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEV4dGVuc2libGl0eUVsZW1lbnRDaGlsZHJlbihMaXN0IGxpc3QsIEV4dGVuc2libGVFbGVtZW50IGV4dGVuc2libGVFbGVtZW50KQotICB7Ci0gICAgaWYgKGlzRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb25zaWRlcmVkQ2hpbGQoKSkKLSAgICB7Ci0gICAgICAvL2xpc3QuYWRkQWxsKFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnROb2RlcyhleHRlbnNpYmxlRWxlbWVudCkpOwotICAgICAgbGlzdC5hZGRBbGwoV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudE5vZGVzKGV4dGVuc2libGVFbGVtZW50KSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSBnZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgaWYgKHdzZGxNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB3c2RsTW9kZWxBZGFwdGVyRmFjdG9yeUluc3RhbmNlID0gbmV3IFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiB3c2RsTW9kZWxBZGFwdGVyRmFjdG9yeUluc3RhbmNlOwotICB9ICAKLSAgICAKLQotICBwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBXU0RMQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0gIH0gICAgICAgICAgICAKLQotCi0gIHB1YmxpYyBNb2RlbEFkYXB0ZXIgZ2V0QWRhcHRlcihPYmplY3QgbykKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotICAgIGlmIChvIGluc3RhbmNlb2YgV1NETEVsZW1lbnQpICAgICAgICAgICAgICAgICAgICAgCi0gICAgewotICAgICAgYWRhcHRlciA9IChNb2RlbEFkYXB0ZXIpYWRhcHRlckZhY3RvcnkuYWRhcHQoKFdTRExFbGVtZW50KW8sIGFkYXB0ZXJGYWN0b3J5KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIGFkYXB0ZXIgPSAoV1NETEdyb3VwT2JqZWN0KW87Ci0gICAgfQotICAgIHJldHVybiBhZGFwdGVyOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHVibGljIGNsYXNzIFdTRExBZGFwdGVyRmFjdG9yeUltcGwgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLSAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFdTRExTd2l0Y2ggd3NkbFN3aXRjaCA9IG5ldyBXU0RMU3dpdGNoKCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlV1NETEVsZW1lbnRBZGFwdGVyKCk7Ci0JICAgICAgfSAgIAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ0FkYXB0ZXIoKTsKLQkgICAgICB9IAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0ZhdWx0KEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ0ZhdWx0QWRhcHRlcigpOwotCSAgICAgIH0gCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nSW5wdXRBZGFwdGVyKCk7Ci0JICAgICAgfSAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0KQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdPdXRwdXRBZGFwdGVyKCk7Ci0JICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb25BZGFwdGVyKCk7Ci0JICAgICAgfSAKLSAKLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVEZWZpbml0aW9uQWRhcHRlcigpOwotCSAgICAgIH0gICAgICAgICAgIAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlRmF1bHQoRmF1bHQgZmF1bHQpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlRmF1bHRBZGFwdGVyKCk7Ci0JICAgICAgfSAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUltcG9ydChJbXBvcnQgaSkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVJbXBvcnRBZGFwdGVyKCk7Ci0JICAgICAgfSAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUlucHV0KElucHV0IGlucHV0KQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZUlucHV0QWRhcHRlcigpOwotCSAgICAgIH0gCQotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlT3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlT3V0cHV0QWRhcHRlcigpOwotCSAgICAgIH0gCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlQWRhcHRlcigpOwotCSAgICAgIH0gICAgICAgCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVPcGVyYXRpb25BZGFwdGVyKCk7Ci0JICAgICAgfSAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZVBhcnQoUGFydCBwYXJ0KQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZVBhcnRBZGFwdGVyKCk7Ci0JICAgICAgfSAgCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgcG9ydCkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVQb3J0QWRhcHRlcigpOwotCSAgICAgIH0gIAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlUG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlUG9ydFR5cGVBZGFwdGVyKCk7Ci0JICAgICAgfSAgCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVTZXJ2aWNlQWRhcHRlcigpOwotCSAgICAgIH0gIAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlVHlwZXMoVHlwZXMgdHlwZXMpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZXNBZGFwdGVyKCk7Ci0JICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdWVlKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgICAgfQotICAgICAgfTsgICAKLQotICAgICAgT2JqZWN0IG8gPSB3c2RsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0KLSAgICAgIEFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ICA9IChBZGFwdGVyKW87Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRpZCBub3QgY3JlYXRlIGFkYXB0ZXIgZm9yIHRhcmdldCA6ICIgKyB0YXJnZXQpOwotICAgICAgICBUaHJlYWQuZHVtcFN0YWNrKCk7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBXU0RMRWxlbWVudEFkYXB0ZXIoKTsKLSAgICB9Ci0KLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdBZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEJpbmRpbmdBZGFwdGVyKCk7Ci0gICAgfSAgIAotCi0gCSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ0ZhdWx0QWRhcHRlcigpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICByZXR1cm4gbmV3IEJpbmRpbmdGYXVsdEFkYXB0ZXIoKTsKLSAgICB9ICAgICAgICAgICAKLQotIAkgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdJbnB1dEFkYXB0ZXIoKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nSW5wdXRBZGFwdGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ091dHB1dEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQmluZGluZ091dHB1dEFkYXB0ZXIoKTsKLQkgIH0gCi0gICAgICAgICAgICAgICAgCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ09wZXJhdGlvbkFkYXB0ZXIoKQotICAgIHsgICAgIAotICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpOwotICAgIH0KLSAgICAgICAgICAKLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlZmluaXRpb25BZGFwdGVyKCkgCi0gICAgewotCQkgIHJldHVybiBuZXcgRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkgIH0KLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlRmF1bHRBZGFwdGVyKCkgCi0gICAgewotCQkgIHJldHVybiBuZXcgRmF1bHRBZGFwdGVyKCk7Ci0JICB9Ci0KLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUltcG9ydEFkYXB0ZXIoKSAKLSAgICB7Ci0JCSAgcmV0dXJuIG5ldyBJbXBvcnRBZGFwdGVyKCk7Ci0JICB9Ci0KLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlucHV0QWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IElucHV0QWRhcHRlcigpOwotCSAgfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlQWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IE1lc3NhZ2VBZGFwdGVyKCk7Ci0JICB9Ci0KLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlT3BlcmF0aW9uQWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IE9wZXJhdGlvbkFkYXB0ZXIoKTsKLQkgIH0KLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0cHV0QWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IE91dHB1dEFkYXB0ZXIoKTsKLQkgIH0KLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFydEFkYXB0ZXIoKSAKLSAgICB7Ci0JCSAgcmV0dXJuIG5ldyBQYXJ0QWRhcHRlcigpOwotCSAgfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0QWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IFBvcnRBZGFwdGVyKCk7Ci0JICB9Ci0KLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRUeXBlQWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IFBvcnRUeXBlQWRhcHRlcigpOwotCSAgfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlQWRhcHRlcigpIAotICAgIHsgICAgICAgICAgICAgICAgICAgIAotCQkgIHJldHVybiBuZXcgU2VydmljZUFkYXB0ZXIoKTsKLQkgIH0gCi0KLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVR5cGVzQWRhcHRlcigpIAotICAgIHsgICAgICAgICAgICAgICAgICAgIAotCQkgIHJldHVybiBuZXcgVHlwZXNBZGFwdGVyKCk7Ci0JICB9IAotICAgIAotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotICAgIH0KLSAgICAKLSAgICAvLyBjb252ZW5pZW5jZSBtZXRob2QKLSAgICAvLwotICAgIHB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCkKLSAgICB7Ci0gICAgICByZXR1cm4gYWRhcHQodGFyZ2V0LCB0aGlzKTsKLSAgICB9Ci0gIH0KLSAgICAKLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHJvdGVjdGVkIGNsYXNzIFdTRExFbGVtZW50QWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTW9kZWxBZGFwdGVyCi0gIHsgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQotICAgIHB1YmxpYyBXU0RMRWxlbWVudEFkYXB0ZXIoKQotICAgIHsKLSAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gYWRhcHRlckZhY3Rvcnk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgaWYgKCFsaXN0ZW5lckxpc3QuY29udGFpbnMobGlzdGVuZXIpKQotICAgICAgewotICAgICAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgICAgIH0gIAotICAgIH0gIAotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgaWYgKGxpc3RlbmVyTGlzdC5jb250YWlucyhsaXN0ZW5lcikpCi0gICAgICB7Ci0gICAgICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICAgICAgfQotICAgIH0gCi0KLSAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkKE9iamVjdCBub3RpZmllciwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGxpc3QuYWRkQWxsKGxpc3RlbmVyTGlzdCk7ICAgICAgICAgICAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyID0gKE1vZGVsQWRhcHRlckxpc3RlbmVyKWkubmV4dCgpOwotICAgICAgICBsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZ2V0VGFyZ2V0KCksIHByb3BlcnR5KTsKLSAgICAgIH0KLSAgICB9ICAgCi0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKG1zZy5nZXRFdmVudFR5cGUoKSAhPSBOb3RpZmljYXRpb24uUkVTT0xWRSkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VkKG1zZy5nZXROb3RpZmllcigpLCBudWxsKTsKLSAgICAgIH0KLSAgICB9ICAKLQotICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsgICAgICAgICAgIAotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDSElMRFJFTl9QUk9QRVJUWSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldENoaWxkcmVuKCk7ICAgICAgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTEFCRUxfUFJPUEVSVFkpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRMYWJlbCgpOyAgICAgIAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElNQUdFX1BST1BFUlRZKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0SW1hZ2UoKTsKLSAgICAgIH0gCi0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJleHRlbnNpYmlsaXR5RWxlbWVudHMiKSkKLSAgICAgIHsgCi0gICAgICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEV4dGVuc2libGVFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudE5vZGVzKChFeHRlbnNpYmxlRWxlbWVudCltb2RlbE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgIH0gCi0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJpc1JlYWRPbmx5IikpCi0gICAgICB7Ci0gICAgICAJRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KHRhcmdldCk7IAotICAgICAJICByZXN1bHQgPSAoZWxlbWVudCBpbnN0YW5jZW9mIElET01Ob2RlKSA/IEJvb2xlYW4uRkFMU0UgOiBCb29sZWFuLlRSVUU7ICAgIAotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9IAotCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuICJ0b2RvIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAgICAgICAgICAgICAgICAgCi0gIAotCi0gIHByb3RlY3RlZCBjbGFzcyBCaW5kaW5nQWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBCaW5kaW5nIGJpbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLmJpbmRpbmcgPSAoQmluZGluZyluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgICAgICAgICAgIAotICAgICAgYWRkRXh0ZW5zaWJsaXR5RWxlbWVudENoaWxkcmVuKGxpc3QsIGJpbmRpbmcpOwotICAgICAgTGlzdCBvcGVyYXRpb25zTGlzdCA9IGJpbmRpbmcuZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCk7Ci0gICAgICBMaXN0IHRlbXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgdGVtcExpc3QuYWRkQWxsKG9wZXJhdGlvbnNMaXN0KTsKLSAgICAgIAotICAgICAgQ29sbGVjdGlvbnMuc29ydCh0ZW1wTGlzdCwgbmV3IENvbXBhcmF0b3IoKSB7Ci0gICAgCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgIAkJU3RyaW5nIHMxID0gKChCaW5kaW5nT3BlcmF0aW9uKSBvMSkuZ2V0TmFtZSgpOwotICAgIAkJU3RyaW5nIHMyID0gKChCaW5kaW5nT3BlcmF0aW9uKSBvMikuZ2V0TmFtZSgpOwotICAgIAkJCi0gICAgCQlpZiAoczEgPT0gbnVsbCkgewotICAgIAkJCXMxID0gIiI7Ci0gICAgCQl9Ci0gICAgCQlpZiAoczIgPT0gbnVsbCkgewotICAgIAkJCXMyID0gIiI7Ci0gICAgCQl9Ci0gICAgCQkKLSAgICAJCWJvb2xlYW4gYm9vID0gdHJ1ZTsKLSAgICAgIAkJcmV0dXJuIHMxLmNvbXBhcmVUb0lnbm9yZUNhc2UoczIpOwotICAgICAgCX0KLSAgICAgIH0pOwotICAgICAgCi0gICAgICBsaXN0LmFkZEFsbCh0ZW1wTGlzdCk7Ci0gICAgICAKLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0gICAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvYmluZGluZ19vYmouZ2lmIik7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0gIAotICAgIAotCi0gIHByb3RlY3RlZCBjbGFzcyBCaW5kaW5nRmF1bHRBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLmJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgIAotICAgICAgYWRkRXh0ZW5zaWJsaXR5RWxlbWVudENoaWxkcmVuKGxpc3QsIGJpbmRpbmdGYXVsdCk7Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAgICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuIGJpbmRpbmdGYXVsdC5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9mYXVsdF9vYmouZ2lmIik7Ci0gICAgfSAgICAgICAgICAgICAgIAotICB9IAotCi0KLSAgcHJvdGVjdGVkIGNsYXNzIEJpbmRpbmdJbnB1dEFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMuYmluZGluZ0lucHV0ID0gKEJpbmRpbmdJbnB1dCluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgCi0gICAgICBhZGRFeHRlbnNpYmxpdHlFbGVtZW50Q2hpbGRyZW4obGlzdCwgYmluZGluZ0lucHV0KTsKLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0gICAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gImlucHV0IjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2lucHV0X29iai5naWYiKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfSAgCi0KLSAKLSAgcHJvdGVjdGVkIGNsYXNzIEJpbmRpbmdPdXRwdXRBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMuYmluZGluZ091dHB1dCA9IChCaW5kaW5nT3V0cHV0KW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAKLSAgICAgIGFkZEV4dGVuc2libGl0eUVsZW1lbnRDaGlsZHJlbihsaXN0LCBiaW5kaW5nT3V0cHV0KTsKLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0gICAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gIm91dHB1dCI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9vdXRwdXRfb2JqLmdpZiIpOwotICAgIH0gICAgCi0gIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIGNsYXNzIEJpbmRpbmdPcGVyYXRpb25BZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMuYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgIAotICAgICAgICAgICAgICAgICAgCi0gICAgICBhZGRFeHRlbnNpYmxpdHlFbGVtZW50Q2hpbGRyZW4obGlzdCwgYmluZGluZ09wZXJhdGlvbik7IAotCi0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSk7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGxpc3QuYWRkQWxsKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdGYXVsdHMoKSk7Ci0gICAgICAKLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0gICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9vcGVyYXRpb25iaW5kaW5nX29iai5naWYiKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0gIH0gIAotCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHByb3RlY3RlZCBjbGFzcyBEZWZpbml0aW9uQWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlciBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgcGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdDsKLSAgICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotCi0gICAgcHJvdGVjdGVkIFdTRExHcm91cE9iamVjdCB0eXBlc0dyb3VwOwotICAgIHByb3RlY3RlZCBXU0RMR3JvdXBPYmplY3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzR3JvdXA7Ci0gICAgcHJvdGVjdGVkIFR5cGVzIHR5cGVzOyAKLSAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLmRlZmluaXRpb24gPSAoRGVmaW5pdGlvbiluZXdUYXJnZXQ7Ci0gICAgIAotICAgICAgLy8gdGhpcyBncm91cCBpcyBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBjaGlsZCBsaXN0IGR5bmFtaWNhbGx5Ci0gICAgICAvLyBkZXBlbmRhbnQgb24gdGhlIHByZXNlbmNlIG9mIGFuICdhY3R1YWwnIHR5cGVzIGVsZW1lbnQKLSAgICAgIC8vCi0gICAgICB0eXBlc0dyb3VwID0gbmV3IFdTRExHcm91cE9iamVjdChkZWZpbml0aW9uLCBXU0RMR3JvdXBPYmplY3QuVFlQRVNfR1JPVVAsIGdldE1vZGVsQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvLyB0aGVzZSBncm91cHMgYWx3YXlzIGV4aXN0IGluIHRoZSBjaGlsZCBsaXN0ICAgICAgCi0gICAgICAvLwotICAgICAgcGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgCi0gICAgICBwZXJtYW5lbnRXU0RMR3JvdXBPYmplY3RMaXN0LmFkZChuZXcgV1NETEdyb3VwT2JqZWN0KGRlZmluaXRpb24sIFdTRExHcm91cE9iamVjdC5JTVBPUlRTX0dST1VQKSk7Ci0gICAgICBwZXJtYW5lbnRXU0RMR3JvdXBPYmplY3RMaXN0LmFkZCh0eXBlc0dyb3VwKTsgIAotICAgICAgcGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5hZGQobmV3IFdTRExHcm91cE9iamVjdChkZWZpbml0aW9uLCBXU0RMR3JvdXBPYmplY3QuTUVTU0FHRVNfR1JPVVApKTsKLSAgICAgIHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuYWRkKG5ldyBXU0RMR3JvdXBPYmplY3QoZGVmaW5pdGlvbiwgV1NETEdyb3VwT2JqZWN0LlBPUlRfVFlQRVNfR1JPVVApKTsKLSAgICAgIHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuYWRkKG5ldyBXU0RMR3JvdXBPYmplY3QoZGVmaW5pdGlvbiwgV1NETEdyb3VwT2JqZWN0LkJJTkRJTkdTX0dST1VQKSk7Ci0gICAgICBwZXJtYW5lbnRXU0RMR3JvdXBPYmplY3RMaXN0LmFkZChuZXcgV1NETEdyb3VwT2JqZWN0KGRlZmluaXRpb24sIFdTRExHcm91cE9iamVjdC5TRVJWSUNFU19HUk9VUCkpOwotICAgICAgLy8gd2Ugb25seSBhZGQgdGhpcyBncm91cCB3aGVuIGl0IGhhcyBjb250ZW50Ci0gICAgICAvLwotICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzR3JvdXAgPSBuZXcgV1NETEdyb3VwT2JqZWN0KGRlZmluaXRpb24sIFdTRExHcm91cE9iamVjdC5FWFRFTlNJQklMSVRZX0VMRU1FTlRTX0dST1VQKTsKLQotICAgICAgdXBkYXRlVHlwZXMoKTsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGxpc3QuYWRkQWxsKHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QpOyAgIAotICAgICAgLy9pZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnRzR3JvdXAuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKQotICAgICAgLy97Ci0gICAgICBsaXN0LmFkZChleHRlbnNpYmlsaXR5RWxlbWVudHNHcm91cCk7Ci0gICAgICAvL30KLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgICB7ICAgICAKLSAgICAgIGlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgIT0gTm90aWZpY2F0aW9uLlJFU09MVkUpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHVwZGF0ZVR5cGVzKCk7Ci0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWRIZWxwZXIoKTsgICAKLSAgICAgIH0KLSAgICB9ICAgICAgICAKLQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVR5cGVzKCkKLSAgICB7Ci0gICAgICBpZiAodHlwZXMgIT0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVNb2RlbEFkYXB0ZXJMaXN0ZW5lcih0eXBlcywgdGhpcyk7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIodHlwZXMsIHRoaXMpOwotICAgICAgICB9Ci0gICAgICB9ICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkSGVscGVyKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBmaXJlUHJvcGVydHlDaGFuZ2VkKGdldFRhcmdldCgpLCBudWxsKTsKLQotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoaS5uZXh0KCkpOwotICAgICAgICBhZGFwdGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWQoYWRhcHRlciwgbnVsbCk7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfSAKLQotICAgIC8vIHByb3BhZ2F0ZSBjaGFuZ2VzIHRvICd0eXBlcycgb2JqZWN0Ci0gICAgLy8KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIHR5cGVzR3JvdXAuZmlyZVByb3BlcnR5Q2hhbmdlZCh0eXBlc0dyb3VwLCBwcm9wZXJ0eSk7Ci0gICAgfSAKLQotICAgIHByb3RlY3RlZCBNb2RlbEFkYXB0ZXJGYWN0b3J5IGdldE1vZGVsQWRhcHRlckZhY3RvcnkoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBkZWZpbml0aW9uLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotCi0gCi0KLSAgcHJvdGVjdGVkIGNsYXNzIEZhdWx0QWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBGYXVsdCBmYXVsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5mYXVsdCA9IChGYXVsdCluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9mYXVsdF9vYmouZ2lmIik7Ci0gICAgfSAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gZmF1bHQuZ2V0TmFtZSgpOwotICAgIH0gICAgICAgICAgICAgICAKLSAgfSAgIAotICAgICAgCi0KLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHJvdGVjdGVkIGNsYXNzIEltcG9ydEFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgSW1wb3J0IHRoZUltcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMudGhlSW1wb3J0ID0gKEltcG9ydCluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvaW1wb3J0X29iai5naWYiKTsKLSAgICB9ICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIFN0cmluZyByZXN1bHQgPSB0aGVJbXBvcnQuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgIAlyZXN1bHQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9OT19JTVBPUlRfU1BFQ0lGSUVEIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgICAgICAgICAgICAKLSAgfSAKLQotCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHByb3RlY3RlZCBjbGFzcyBJbnB1dEFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgSW5wdXQgaW5wdXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLmlucHV0ID0gKElucHV0KW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9pbnB1dF9vYmouZ2lmIik7Ci0gICAgfSAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gImlucHV0IjsKLSAgICB9ICAgICAgICAgICAgICAgCi0gIH0gICAgCi0KLSAgIAotIAotICAvLwotICAvLwotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgTWVzc2FnZUFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZSBtZXNzYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5tZXNzYWdlID0gKE1lc3NhZ2UpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChtZXNzYWdlLmdldEVQYXJ0cygpKTsKLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgaWYgKG1lc3NhZ2UuZ2V0UU5hbWUoKSA9PSBudWxsKSByZXR1cm4gIiI7IC8vIHJldmlzaXQuLi5pdCBzaG91bGRuJ3QgYmUgbnVsbCAKLSAgICAgIHJldHVybiBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9tZXNzYWdlX29iai5naWYiKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHByb3RlY3RlZCBjbGFzcyBPdXRwdXRBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIE91dHB1dCBvdXRwdXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLm91dHB1dCA9IChPdXRwdXQpbmV3VGFyZ2V0OwotICAgIH0gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gIm91dHB1dCI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9vdXRwdXRfb2JqLmdpZiIpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAKLQotICAvLwotICAvLwotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgT3BlcmF0aW9uQWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBPcGVyYXRpb24gb3BlcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5vcGVyYXRpb24gPSAoT3BlcmF0aW9uKW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgICBPdXRwdXQgb3V0cHV0ID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKTsKLSAgICAgIAotICAgICAgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlID0gKChPcGVyYXRpb25JbXBsKSBvcGVyYXRpb24pLmdldFN0eWxlKCk7Ci0gICAgICBpZiAob3BlcmF0aW9uVHlwZSAhPSBudWxsKSB7Ci0gICAgICAJaWYgKG9wZXJhdGlvblR5cGUuZXF1YWxzKE9wZXJhdGlvblR5cGUuUkVRVUVTVF9SRVNQT05TRSkgJiYgaW5wdXQgIT0gbnVsbCAmJiBvdXRwdXQgIT0gbnVsbCkgewotICAgICAgCQkvLyBJbnB1dCwgT3V0cHV0Ci0gICAgICAJCWxpc3QuYWRkKGlucHV0KTsKLSAgICAgIAkJbGlzdC5hZGQob3V0cHV0KTsKLSAgICAgIAl9Ci0gICAgICAJZWxzZSBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFKSAmJiBpbnB1dCAhPSBudWxsICYmIG91dHB1dCAhPSBudWxsKSB7Ci0gICAgICAJCS8vIE91dHB1dCwgSW5wdXQKLSAgICAgIAkJbGlzdC5hZGQob3V0cHV0KTsKLSAgICAgIAkJbGlzdC5hZGQoaW5wdXQpOwotICAgICAgCX0KLSAgICAgIAllbHNlIGlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLk9ORV9XQVkpICYmIGlucHV0ICE9IG51bGwpIHsKLSAgICAgIAkJLy8gSW5wdXQKLSAgICAgIAkJbGlzdC5hZGQoaW5wdXQpOwotICAgICAgCX0KLSAgICAgIAllbHNlIGlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLk5PVElGSUNBVElPTikgJiYgb3V0cHV0ICE9IG51bGwpIHsKLSAgICAgIAkJLy9PdXRwdXQKLSAgICAgIAkJbGlzdC5hZGQob3V0cHV0KTsKLSAgICAgIAl9Ci0gICAgICB9Ci0gICAgICBsaXN0LmFkZEFsbChvcGVyYXRpb24uZ2V0RmF1bHRzKCkudmFsdWVzKCkpOwotICAgICAgCi0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0gICAgICAKLQlwcml2YXRlIGludCBnZXROb2RlSW5kZXgoTm9kZUxpc3Qgbm9kZUxpc3QsIE5vZGUgbm9kZSkgewotCQlpbnQgaW5kZXggPSAwOwotCQl3aGlsZSAoaW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSAmJiAhKG5vZGVMaXN0Lml0ZW0oaW5kZXgpLmVxdWFscyhub2RlKSkpIHsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJCi0JCWlmIChpbmRleCA+PSBub2RlTGlzdC5nZXRMZW5ndGgoKSkgewotCQkJaW5kZXggPSAtMTsKLQkJfQotCQkKLQkJcmV0dXJuIGluZGV4OwotCX0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuIG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9vcGVyYXRpb25fb2JqLmdpZiIpOwotICAgIH0gICAgICAgICAgICAgICAKLSAgfSAgCi0gICAKLQotICAvLwotICAvLwotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgUGFydEFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgUGFydCBwYXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5wYXJ0ID0gKFBhcnQpbmV3VGFyZ2V0OwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7Ci0gICAgICByZXR1cm4gcGFydC5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9wYXJ0X29iai5naWYiKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfSAgICAgCi0KLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHJvdGVjdGVkIGNsYXNzIFBvcnRBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyIGltcGxlbWVudHMgTW9kZWxBZGFwdGVyTGlzdGVuZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgUG9ydCBwb3J0OwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5wb3J0ID0gKFBvcnQpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gcG9ydC5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL3BvcnRfb2JqLmdpZiIpOwotICAgIH0gICAgCi0KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnROb2Rlcyhwb3J0KTsgIAotICAgIH0KLSAgICAvLyBwcm9wYWdhdGUgY2hhbmdlcyB0byB0aGUgYmluZGluZyBvYmplY3QKLSAgICAvLwotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlZChwb3J0LCBwcm9wZXJ0eSk7Ci0gICAgfQotICB9IAotICAgICAKLSAgcHJvdGVjdGVkIGNsYXNzIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdWVlOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy51ZWUgPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgdWVlLmdldEVsZW1lbnQoKTsKLQotICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IGdldEV4dGVuc2liaWxpdHlMYWJlbFByb3ZpZGVyKG5vZGUpOwotICAgICAgaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KG5vZGUpOwotICAgICAgfQotCi0gICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEltYWdlIGltYWdlID0gbnVsbDsKLSAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSB1ZWUuZ2V0RWxlbWVudCgpOwotCi0gICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gZ2V0RXh0ZW5zaWJpbGl0eUxhYmVsUHJvdmlkZXIobm9kZSk7Ci0gICAgICBpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbWFnZSA9IGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uobm9kZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbWFnZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBpbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvZWxlbWVudF9vYmouZ2lmIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfSAgICAKLQotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBudWxsOwotICAgICAgLy9Ob2RlIG5vZGUgPSAoTm9kZSkgdWVlLmdldEVsZW1lbnQoKTsKLSAgICAgIC8vSVRyZWVDaGlsZFByb3ZpZGVyIGNoaWxkUHJvdmlkZXIgPSBnZXRFeHRlbnNpYmlsaXR5Q29udGVudFByb3ZpZGVyKG5vZGUpOwotICAgICAgLy8gVEJEIC0gRGlzY3VzcyB3aXRoIENyYWlnIHdoeSB3ZSB3b3VsZCBuZWVkIGNoaWxkUHJvdmlkZXIKLSAgICAgIC8vaWYgKGNoaWxkUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgIC8vewotICAgICAgLy8gIE9iamVjdFtdIGFycmF5ID0gY2hpbGRQcm92aWRlci5nZXRDaGlsZHJlbihub2RlKTsKLSAgICAgIC8vICBsaXN0ID0gQXJyYXlzLmFzTGlzdChhcnJheSk7Ci0gICAgICAvL30KLSAgICAgIC8vZWxzZQotICAgICAgewotICAgICAgICBsaXN0ID0gdWVlLmdldENoaWxkcmVuKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdDsgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICBmaXJlUHJvcGVydHlDaGFuZ2VkKHVlZSwgcHJvcGVydHkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgZ2V0RXh0ZW5zaWJpbGl0eUxhYmVsUHJvdmlkZXIoTm9kZSBub2RlKQotICAgIHsKLSAgICAgIElMYWJlbFByb3ZpZGVyIHJlc3VsdCA9IG51bGw7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gbm9kZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnkoKS5nZXRMYWJlbFByb3ZpZGVyKG5hbWVzcGFjZVVSSSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSVRyZWVDaGlsZFByb3ZpZGVyIGdldEV4dGVuc2liaWxpdHlDb250ZW50UHJvdmlkZXIoTm9kZSBub2RlKQotICAgIHsKLSAgICAgIElUcmVlQ2hpbGRQcm92aWRlciByZXN1bHQgPSBudWxsOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5KCkuZ2V0Q29udGVudFByb3ZpZGVyKG5hbWVzcGFjZVVSSSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNSZWFkT25seSgpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9IAotCi0KLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHJvdGVjdGVkIGNsYXNzIFBvcnRUeXBlQWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBQb3J0VHlwZSBwb3J0VHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMucG9ydFR5cGUgPSAoUG9ydFR5cGUpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkpOwotICAgICAgCi0gICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIG5ldyBDb21wYXJhdG9yKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG8xTmFtZSA9ICgoT3BlcmF0aW9uKSBvMSkuZ2V0TmFtZSgpOwotICAgICAgICAgIFN0cmluZyBvMk5hbWUgPSAoKE9wZXJhdGlvbikgbzIpLmdldE5hbWUoKTsKLSAgICAgICAgICBpZiAobzFOYW1lID09IG51bGwpIG8xTmFtZSA9ICIiOwotICAgICAgICAgIGlmIChvMk5hbWUgPT0gbnVsbCkgbzJOYW1lID0gIiI7Ci0gICAgICAgICAgcmV0dXJuIChvMU5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShvMk5hbWUpKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICByZXR1cm4gbGlzdDsgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvcG9ydHR5cGVfb2JqLmdpZiIpOwotICAgIH0KLSAgfSAKLSAgICAgCi0KLSAgcHJvdGVjdGVkIGNsYXNzIFNlcnZpY2VBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIFNlcnZpY2Ugc2VydmljZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMuc2VydmljZSA9IChTZXJ2aWNlKW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgbGlzdC5hZGRBbGwoc2VydmljZS5nZXRFUG9ydHMoKSk7Ci0gICAgICByZXR1cm4gbGlzdDsgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9zZXJ2aWNlX29iai5naWYiKTsKLSAgICB9ICAgCi0gIH0gCi0gICAgIAotICAvLwotICAvLwotICAvLwotICBwdWJsaWMgY2xhc3MgVHlwZXNBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgVHlwZXMgdHlwZXM7IAotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy50eXBlcyA9IChUeXBlcyluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgIAotICAgICAgbGlzdC5hZGRBbGwoV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudE5vZGVzKHR5cGVzKSk7Ci0gICAgICByZXR1cm4gbGlzdDsgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiAiVHlwZXMiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvdHlwZXNfb2JqLmdpZiIpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZ2V0QWRhcHRlcihtb2RlbE9iamVjdCk7Ci0vLyAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IEVjb3JlVXRpbC5nZXRBZGFwdGVyKGdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZUFkYXB0ZXJzKCksbW9kZWxPYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotICB9ICAgIAotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVNb2RlbEFkYXB0ZXJMaXN0ZW5lcihPYmplY3QgbW9kZWxPYmplY3QsIE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLyBUT0RPOiBwb3J0IGNoZWNrCi0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBnZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmdldEFkYXB0ZXIobW9kZWxPYmplY3QpOwotLy8gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBFY29yZVV0aWwuZ2V0QWRhcHRlcihnZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmVBZGFwdGVycygpLG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfSAgICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL25zZWRpdC9FZGl0TmFtZXNwYWNlc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbnNlZGl0L0VkaXROYW1lc3BhY2VzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Y2M1MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbnNlZGl0L0VkaXROYW1lc3BhY2VzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5zZWRpdC5Db21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgRWRpdE5hbWVzcGFjZXNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cKLXsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLSAgcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLSAgcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0OwotICBwcm90ZWN0ZWQgQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyBlZGl0V1NETE5hbWVzcGFjZXNDb250cm9sOwotICBwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLSAgLy8gIHByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLSAgLy8gIHByb3RlY3RlZCBTdHJpbmcgZXJyb3JNZXNzYWdlOyAgCi0KLSAgLy9wcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0KLSAgcHVibGljIEVkaXROYW1lc3BhY2VzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgdGl0bGUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIExpc3QgbmFtZXNwYWNlTGlzdCkKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICB0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0gICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIHRoaXMubmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VMaXN0OwotICB9Ci0KLSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLSAgewotICAgIGNyZWF0ZSgpOwotICAgIGdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0gICAgc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgcmV0dXJuIG9wZW4oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICAgIHVwZGF0ZUVycm9yTWVzc2FnZSgpOwotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLSAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIGVkaXRXU0RMTmFtZXNwYWNlc0NvbnRyb2wgPSBuZXcgQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyhkaWFsb2dBcmVhLCByZXNvdXJjZUxvY2F0aW9uKTsKLSAgICBlZGl0V1NETE5hbWVzcGFjZXNDb250cm9sLnNldE5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICBlZGl0V1NETE5hbWVzcGFjZXNDb250cm9sLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotCi0gICAgcmV0dXJuIGRpYWxvZ0FyZWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gIHsKLSAgICB1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkKLSAgewotICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgIC8qCi0gICAgU3RyaW5nIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICBpZiAobmFtZS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgZXJyb3JNZXNzYWdlID0gY29tcHV0ZUVycm9yTWVzc2FnZShuYW1lKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yTWVzc2FnZSA9ICIiOwotICAgIH0qLwotCi0gICAgLy9lcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOwotICAgIG9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpCi0gIHsKLSAgICBpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLSAgICB7Ci0gICAgICB0YXJnZXROYW1lc3BhY2UgPSBlZGl0V1NETE5hbWVzcGFjZXNDb250cm9sLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KCkKLSAgewotICAgIHJldHVybiBuYW1lc3BhY2VJbmZvTGlzdDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvRXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9FeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxY2E2NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9FeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5vdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIEV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3JFeHRlbnNpb25bXSB0cmVlQ29udGVudFByb3ZpZGVyRXh0ZW5zaW9uczsKLSAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyW10gdHJlZUNvbnRlbnRQcm92aWRlcnM7Ci0KLSAgcHJvdGVjdGVkIFdTRExFZGl0b3JFeHRlbnNpb25bXSBsYWJlbFByb3ZpZGVyRXh0ZW5zaW9uczsKLSAgcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyW10gbGFiZWxQcm92aWRlcnM7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IHt9OwotCi0gIHB1YmxpYyBFeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyKFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgewotICAgIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKTsgCi0KLSAgICB0cmVlQ29udGVudFByb3ZpZGVyRXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uT1VUTElORV9UUkVFX0NPTlRFTlRfUFJPVklERVIpOyAKLSAgICB0cmVlQ29udGVudFByb3ZpZGVycyA9IG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlclt0cmVlQ29udGVudFByb3ZpZGVyRXh0ZW5zaW9ucy5sZW5ndGhdOyAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyZWVDb250ZW50UHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHRyZWVDb250ZW50UHJvdmlkZXJzW2ldID0gKElUcmVlQ29udGVudFByb3ZpZGVyKXRyZWVDb250ZW50UHJvdmlkZXJFeHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLk9VVExJTkVfVFJFRV9DT05URU5UX1BST1ZJREVSLCB3c2RsRWRpdG9yKTsKLSAgICB9Ci0KLSAgICBsYWJlbFByb3ZpZGVyRXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uT1VUTElORV9MQUJFTF9QUk9WSURFUik7IAotICAgIGxhYmVsUHJvdmlkZXJzID0gbmV3IElMYWJlbFByb3ZpZGVyW2xhYmVsUHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aF07IAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxQcm92aWRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgbGFiZWxQcm92aWRlcnNbaV0gPSAoSUxhYmVsUHJvdmlkZXIpbGFiZWxQcm92aWRlckV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uT1VUTElORV9MQUJFTF9QUk9WSURFUiwgd3NkbEVkaXRvcik7Ci0gICAgfQotICB9Ci0gICAgICAKLSAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGdldEFwcGxpY2FibGVUcmVlQ29udGVudFByb3ZpZGVyKE9iamVjdCBvYmplY3QpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIElUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyZWVDb250ZW50UHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICh0cmVlQ29udGVudFByb3ZpZGVyRXh0ZW5zaW9uc1tpXS5pc0FwcGxpY2FibGUob2JqZWN0KSkKLSAgICAgIHsKLSAgICAgICAgcHJvdmlkZXIgPSB0cmVlQ29udGVudFByb3ZpZGVyc1tpXTsKLSAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJvdmlkZXI7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBnZXRBcHBsaWNhYmxlTGFiZWxQcm92aWRlcihPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgSUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxQcm92aWRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGxhYmVsUHJvdmlkZXJFeHRlbnNpb25zW2ldLmlzQXBwbGljYWJsZShvYmplY3QpKQotICAgICAgewotICAgICAgICBwcm92aWRlciA9IGxhYmVsUHJvdmlkZXJzW2ldOwotICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm92aWRlcjsKLSAgfQotCi0gIC8vIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIKLSAgLy8KLSAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSAKLSAgeyAKLSAgICBJVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGdldEFwcGxpY2FibGVUcmVlQ29udGVudFByb3ZpZGVyKHBhcmVudEVsZW1lbnQpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRFbGVtZW50cyAiICsgcHJvdmlkZXIpOwotICAgIHJldHVybiBwcm92aWRlciAhPSBudWxsID8gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCkgOiBFTVBUWV9BUlJBWTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBcHBsaWNhYmxlVHJlZUNvbnRlbnRQcm92aWRlcihlbGVtZW50KTsKLSAgICByZXR1cm4gcHJvdmlkZXIgIT0gbnVsbCA/IHByb3ZpZGVyLmdldFBhcmVudChlbGVtZW50KSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkKLSAgewotICAgIElUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0QXBwbGljYWJsZVRyZWVDb250ZW50UHJvdmlkZXIoZWxlbWVudCk7Ci0gICAgcmV0dXJuIHByb3ZpZGVyICE9IG51bGwgPyBwcm92aWRlci5oYXNDaGlsZHJlbihlbGVtZW50KSA6IGZhbHNlOwotICB9Ci0KLSAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpICAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBcHBsaWNhYmxlVHJlZUNvbnRlbnRQcm92aWRlcihpbnB1dEVsZW1lbnQpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRFbGVtZW50cyAiICsgcHJvdmlkZXIpOwotICAgIHJldHVybiBwcm92aWRlciAhPSBudWxsID8gcHJvdmlkZXIuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KSA6IEVNUFRZX0FSUkFZOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpICAKLSAgewotICAgIC8vIFRPRE8uLi4gY2FsbCBkaXNwb3NlIGRpc3Bvc2UgdGhlIGNyZWF0ZWQgbGFiZWwgYW5kIGNvbnRlbnQgcHJvdmlkZXJzCi0gIH0KLQotICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyZWVDb250ZW50UHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHRyZWVDb250ZW50UHJvdmlkZXJzW2ldLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0gICAgfQotICB9ICAgICAgICAgICAgICAgICAKLQotICAvLyBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyICAKLSAgLy8KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSAKLSAgeyAKLSAgICBJTGFiZWxQcm92aWRlciBwcm92aWRlciA9IGdldEFwcGxpY2FibGVMYWJlbFByb3ZpZGVyKGVsZW1lbnQpOwotICAgIHJldHVybiBwcm92aWRlciAhPSBudWxsID8gcHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCkgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSAgCi0gIHsgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsgICAgICAgCi0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJTGFiZWxQcm92aWRlciBwcm92aWRlciA9IGdldEFwcGxpY2FibGVMYWJlbFByb3ZpZGVyKGVsZW1lbnQpOwotICAgICAgcmVzdWx0ID0gcHJvdmlkZXIgIT0gbnVsbCA/IHByb3ZpZGVyLmdldFRleHQoZWxlbWVudCkgOiAoZWxlbWVudC50b1N0cmluZygpICsgIm5vUHJvdmlkZXJGb3JDbGFzcz0iICsgZWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOwotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSAKLSAgeyAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvSFRUUExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvSFRUUExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlMThhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL0hUVFBMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEhUVFBMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBRERSRVNTICAgICAgICAgPSAiYWRkcmVzcyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEJJTkRJTkcgICAgICAgICA9ICJiaW5kaW5nIjsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1BFUkFUSU9OICAgICAgID0gIm9wZXJhdGlvbiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFVSTF9FTkNPREVEICAgICA9ICJ1cmxFbmNvZGVkIjsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMX1JFUExBQ0VNRU5UID0gInVybFJlcGxhY2VtZW50IjsKLQotICBwcm90ZWN0ZWQgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgSFRUUExhYmVsUHJvdmlkZXIoKQotICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICBtYXAucHV0KEFERFJFU1MsICJpY29ucy9odHRwYWRkcmVzc19vYmouZ2lmIik7Ci0gICAgbWFwLnB1dChCSU5ESU5HLCAiaWNvbnMvaHR0cGJpbmRpbmdfb2JqLmdpZiIpOwotICAgIG1hcC5wdXQoT1BFUkFUSU9OLCAiaWNvbnMvaHR0cG9wZXJhdGlvbl9vYmouZ2lmIik7ICAgIAotICAgIG1hcC5wdXQoVVJMX0VOQ09ERUQsICJpY29ucy9odHRwdXJsZW5jb2RlZF9vYmouZ2lmIik7Ci0gICAgbWFwLnB1dChVUkxfUkVQTEFDRU1FTlQsICJpY29ucy9odHRwdXJscmVwbGFjZW1lbnRfb2JqLmdpZiIpOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIAotICB7ICAgIAotICAgIE5vZGUgbm9kZSA9IChOb2RlKW9iamVjdDsKLSAgICBTdHJpbmcgaW1hZ2VOYW1lID0gKFN0cmluZyltYXAuZ2V0KG5vZGUuZ2V0TG9jYWxOYW1lKCkpOyAgICAgICAKLSAgICByZXR1cm4gaW1hZ2VOYW1lICE9IG51bGwgPyBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoaW1hZ2VOYW1lKSA6IG51bGw7IAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgIAotICB7Ci0gICAgTm9kZSBub2RlID0gKE5vZGUpb2JqZWN0OwotICAgIHJldHVybiBub2RlLmdldE5vZGVOYW1lKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL01vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9Nb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2OGFhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL01vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwub3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlckxpc3RlbmVyOwotCi0KLQotcHVibGljIGNsYXNzIE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgVmlld2VyIHZpZXdlcjsKLSAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLSAgcHVibGljIE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlcihNb2RlbEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7ICAKLSAgfQotICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgYXR0YWNoTGlzdGVuZXIoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihvYmplY3QpOwotLy8gVE9ETzogcG9ydCBjaGVjawotLy8gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBFY29yZVV0aWwuZ2V0QWRhcHRlcihhZGFwdGVyRmFjdG9yeS5lQWRhcHRlcnMoKSxvYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlci5hZGRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgeyAgICAgICAgICAgICAKLSAgICBpZiAodmlld2VyICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpCi0gICAgICB7Ci0gICAgICAgICgoU3RydWN0dXJlZFZpZXdlcil2aWV3ZXIpLnJlZnJlc2gob2JqZWN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgICAgIAotICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRPYmplY3QpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYXR0YWNoTGlzdGVuZXIocGFyZW50T2JqZWN0KTsKLQotICAgIExpc3QgbGlzdCA9IG51bGw7Ci0vLyBUT0RPOiBwb3J0IGNoZWNrICAgIAotICAgIE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKHBhcmVudE9iamVjdCk7Ci0vLyAgICBNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gRWNvcmVVdGlsLmdldEFkYXB0ZXIoYWRhcHRlckZhY3RvcnkuZUFkYXB0ZXJzKCkscGFyZW50T2JqZWN0KTsKLSAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdCA9IChMaXN0KW1vZGVsQWRhcHRlci5nZXRQcm9wZXJ0eShwYXJlbnRPYmplY3QsIE1vZGVsQWRhcHRlci5DSElMRFJFTl9QUk9QRVJUWSk7ICAgICAKLSAgICB9Ci0gICAgbGlzdCA9ICBsaXN0ICE9IG51bGwgPyBsaXN0IDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChPYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkKLSAgewotICAgIE9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgcmV0dXJuIGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMDsgICAKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7IAotICAgIHZpZXdlciA9IG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgeyAgICAgICAgICAgICAgIAotICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICB9ICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9Nb2RlbEFkYXB0ZXJMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL01vZGVsQWRhcHRlckxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwYzc0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL01vZGVsQWRhcHRlckxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwub3V0bGluZTsKLSAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyRmFjdG9yeTsKLQotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbEFkYXB0ZXJMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgTW9kZWxBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotICBwdWJsaWMgTW9kZWxBZGFwdGVyTGFiZWxQcm92aWRlcihNb2RlbEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0gIH0KLQotIAotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIEltYWdlIHJlc3VsdCA9IG51bGw7ICAgICAgICAgICAKLS8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICBNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihvYmplY3QpOwotLy8gICAgTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IEVjb3JlVXRpbC5nZXRBZGFwdGVyKGFkYXB0ZXJGYWN0b3J5LmVBZGFwdGVycygpLG9iamVjdCk7Ci0gICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChJbWFnZSltb2RlbEFkYXB0ZXIuZ2V0UHJvcGVydHkob2JqZWN0LCBNb2RlbEFkYXB0ZXIuSU1BR0VfUFJPUEVSVFkpOyAgICAgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLSAgICAKLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsgICAgICAgICAgICAgICAKLS8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICBNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihvYmplY3QpOwotLy8gICAgTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IEVjb3JlVXRpbC5nZXRBZGFwdGVyKGFkYXB0ZXJGYWN0b3J5LmVBZGFwdGVycygpLG9iamVjdCk7Ci0gICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0gKFN0cmluZyltb2RlbEFkYXB0ZXIuZ2V0UHJvcGVydHkob2JqZWN0LCBNb2RlbEFkYXB0ZXIuTEFCRUxfUFJPUEVSVFkpOyAgICAgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9TT0FQTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9TT0FQTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTUxYWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvU09BUExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwub3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFNPQVBMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERFJFU1MgICAgICA9ICJhZGRyZXNzIjsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQk9EWSAgICAgICAgID0gImJvZHkiOwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBCSU5ESU5HICAgICAgPSAiYmluZGluZyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEZBVUxUICAgICAgICA9ICJmYXVsdCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEhFQURFUiAgICAgICA9ICJoZWFkZXIiOyAKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgSEVBREVSX0ZBVUxUID0gImhlYWRlcmZhdWx0IjsgCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE9QRVJBVElPTiAgICA9ICJvcGVyYXRpb24iOwotCi0gIHByb3RlY3RlZCBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBTT0FQTGFiZWxQcm92aWRlcigpCi0gIHsKLSAgICBtYXAucHV0KEFERFJFU1MsICJpY29ucy9zb2FwYWRkcmVzc19vYmouZ2lmIik7Ci0gICAgbWFwLnB1dChCSU5ESU5HLCAiaWNvbnMvc29hcGJpbmRpbmdfb2JqLmdpZiIpOwotICAgIG1hcC5wdXQoQk9EWSwgImljb25zL3NvYXBib2R5X29iai5naWYiKTsKLSAgICBtYXAucHV0KEZBVUxULCAiaWNvbnMvc29hcGZhdWx0X29iai5naWYiKTsKLSAgICBtYXAucHV0KEhFQURFUiwgImljb25zL3NvYXBoZWFkZXJfb2JqLmdpZiIpOwotICAgIG1hcC5wdXQoSEVBREVSX0ZBVUxULCAiaWNvbnMvc29hcGhlYWRlcmZhdWx0X29iai5naWYiKTsKLSAgICBtYXAucHV0KE9QRVJBVElPTiwgImljb25zL3NvYXBvcGVyYXRpb25fb2JqLmdpZiIpOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIAotICB7ICAgIAotICAgIE5vZGUgbm9kZSA9IChOb2RlKW9iamVjdDsKLSAgICBTdHJpbmcgaW1hZ2VOYW1lID0gKFN0cmluZyltYXAuZ2V0KG5vZGUuZ2V0TG9jYWxOYW1lKCkpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICEobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKTsgIAotCSAgcmV0dXJuIGltYWdlTmFtZSAhPSBudWxsID8gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlTmFtZSkgOiBudWxsOyAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpICAKLSAgewotICAgIE5vZGUgbm9kZSA9IChOb2RlKW9iamVjdDsKLSAgICByZXR1cm4gbm9kZS5nZXROb2RlTmFtZSgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9XU0RMQ29udGVudE91dGxpbmVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL1dTRExDb250ZW50T3V0bGluZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkMmZiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL1dTRExDb250ZW50T3V0bGluZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETFNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5XU0RMTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuT3Blbk9uU2VsZWN0aW9uSGVscGVyOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMQ29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLQlwcm90ZWN0ZWQgaW50IGxldmVsID0gMDsgIAotICBwcm90ZWN0ZWQgT2JqZWN0IG1vZGVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotICBwcm90ZWN0ZWQgV1NETFNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlcjsKLSAgcHJvdGVjdGVkIFNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBzZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0gIHByb3RlY3RlZCBUcmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgdHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyID0gbmV3IFRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotICAgICAgICAKLSAgcHVibGljIFdTRExDb250ZW50T3V0bGluZVBhZ2UoV1NETEVkaXRvciB3c2RsRWRpdG9yKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy53c2RsRWRpdG9yID0gd3NkbEVkaXRvcjsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikKLSAgewotICAgIHRoaXMuY29udGVudFByb3ZpZGVyID0gY29udGVudFByb3ZpZGVyOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8vIGV4cG9zZQotICBwdWJsaWMgVHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkKLSAgewotICAgIHJldHVybiBzdXBlci5nZXRUcmVlVmlld2VyKCk7Ci0gIH0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsgICAgICAgICAgICAgICAgIAotCi0JCWdldFRyZWVWaWV3ZXIoKS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJZ2V0VHJlZVZpZXdlcigpLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLnNldElucHV0KG1vZGVsKTsKLSAgICBnZXRUcmVlVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIEtleUFkYXB0ZXIga2V5TGlzdGVuZXIgPSBuZXcgS2V5QWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkKLSAgICAgIHsgICAJCi0gICAgICAgIGlmIChlLmtleUNvZGUgPT0gU1dULkYzKQotICAgICAgICB7Ci0gICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25NYW5hZ2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgICAgICAgICB7Ci0JCQkgIE9wZW5PblNlbGVjdGlvbkhlbHBlciBoZWxwZXIgPSBuZXcgT3Blbk9uU2VsZWN0aW9uSGVscGVyKHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgICAgaGVscGVyLm9wZW5FZGl0b3IoKEVPYmplY3Qpb2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIGdldFRyZWVWaWV3ZXIoKS5nZXRUcmVlKCkuYWRkS2V5TGlzdGVuZXIoa2V5TGlzdGVuZXIpOwotCi0gICAgTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoIiNwb3B1cCIpOy8vJE5PTi1OTFMtMSQKLSAgICBtZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0gICAgTWVudSBtZW51ID0gbWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoZ2V0VHJlZVZpZXdlcigpLmdldENvbnRyb2woKSk7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotICAgIAotICAgIFdTRExNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyID0gbmV3IFdTRExNZW51TGlzdGVuZXIod3NkbEVkaXRvciwgd3NkbEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOy8vLCAoWFNEVGV4dEVkaXRvcilmVGV4dEVkaXRvcik7Ci0gICAgbWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKG1lbnVMaXN0ZW5lcik7Ci0KLSAgICBzZXRTZWxlY3Rpb25NYW5hZ2VyKHdzZGxFZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLQl9Ci0KLQotICBwdWJsaWMgdm9pZCBzZXRNb2RlbChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgbW9kZWwgPSBvYmplY3Q7Ci0gIH0KLQotCQotCXB1YmxpYyB2b2lkIHNldEV4cGFuZFRvTGV2ZWwoaW50IGkpIAotICB7Ci0JCWxldmVsID0gaTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgdmFsdWUpIAotICB7Ci0JCWdldFRyZWVWaWV3ZXIoKS5zZXRJbnB1dCh2YWx1ZSk7Ci0JIAlnZXRUcmVlVmlld2VyKCkuZXhwYW5kVG9MZXZlbChsZXZlbCk7Ci0JfSAgCi0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25NYW5hZ2VyKFdTRExTZWxlY3Rpb25NYW5hZ2VyIG5ld1NlbGVjdGlvbk1hbmFnZXIpCi0gIHsgCi0gICAgVHJlZVZpZXdlciB0cmVlVmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOwotCi0gICAgLy8gZGlzY29ubmVjdCBmcm9tIG9sZCBvbmUKLSAgICBpZiAoc2VsZWN0aW9uTWFuYWdlciAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgc2VsZWN0aW9uTWFuYWdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsgIAotICAgICAgdHJlZVZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBzZWxlY3Rpb25NYW5hZ2VyID0gbmV3U2VsZWN0aW9uTWFuYWdlcjsKLQotICAgIC8vIGNvbm5lY3QgdG8gbmV3IG9uZQotICAgIGlmIChzZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgc2VsZWN0aW9uTWFuYWdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsgIAotICAgICAgdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLSAgICB9Ci0gIH0gICAgCi0KLSAgY2xhc3MgU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpICAKLSAgICB7ICAgICAgICAgCi0gICAgICBpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSAhPSBnZXRUcmVlVmlld2VyKCkpCi0gICAgICB7Ci0gICAgICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCksIHRydWUpOwotICAgICAgfQotICAgIH0gICAgCi0gIH0KLQotICBjbGFzcyBUcmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgIAotICAgIHsgCi0gICAgICBpZiAoc2VsZWN0aW9uTWFuYWdlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgICAgICBPYmplY3QgbyA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIAotICAgICAgICAgIC8vIFRPRE8gLi4uIAotICAgICAgICAgIC8vIHdlIG5lZWQgdG8gaW1wbGVtZW50IGEgc2VsZWN0aW9uTWFuYWdlck1hcHBpbmcgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgLy8gc28gdGhhdCBleHRlbnNpb25zIGNhbiBzcGVjaWZ5IGhvdyB0aGV5J2QgbGlrZSB0byBtYXAgdmlldyBvYmplY3RzIAotICAgICAgICAgIC8vIHRvIHNlbGVjdGlvbiBvYmplY3RzCi0gICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLyAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEVsZW1lbnQpCi0vLyAgICAgICAgICB7ICAKLS8vICAgICAgICAgICAgdHJ5Ci0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCksIChFbGVtZW50KW8pOwotLy8gICAgICAgICAgICAgIGlmIChtb2RlbE9iamVjdCAhPSBudWxsICYmICEobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpKQotLy8gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIG8gPSBtb2RlbE9iamVjdDsKLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0aW9uTWFuYWdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obyksIGdldFRyZWVWaWV3ZXIoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWxlY3Rpb25NYW5hZ2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpLCBnZXRUcmVlVmlld2VyKCkpOwotICAgICAgICAgIH0gICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQWJzdHJhY3RTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQWJzdHJhY3RTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ODhlZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0U2VjdGlvbiBpbXBsZW1lbnRzIElTZWN0aW9uLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgTGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5OwotCXByaXZhdGUgV1NETEVsZW1lbnQgZWxlbWVudDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seSA9IGZhbHNlOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLSAgcHJvdGVjdGVkIGludCByaWdodE1hcmdpblNwYWNlOwotICBwcm90ZWN0ZWQgaW50IHRhYmxlTWluaW11bVdpZHRoID0gNTA7Ci0JCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotICB7Ci0gICAgY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5nZXRXaWRnZXRGYWN0b3J5KCkpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGFGYWN0b3J5KQotICB7Ci0JCXRoaXMuZmFjdG9yeSA9IGFGYWN0b3J5OwotICAgIEdDIGdjID0gbmV3IEdDKHBhcmVudCk7Ci0gICAgUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCgiICAuLi4gICIpOyAvLyROT04tTkxTLTEkCi0gICAgcmlnaHRNYXJnaW5TcGFjZSA9IGV4dGVudC54OwotICAgIGdjLmRpc3Bvc2UoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0JCUFzc2VydC5pc1RydWUoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQlPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLQkJewotCQkgIHRoaXMuZWxlbWVudCA9IChXU0RMRWxlbWVudClpbnB1dDsKLSAgICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZ2V0QWRhcHRlcihpbnB1dCk7Ci0gICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBpc1JlYWRPbmx5ID0gQm9vbGVhbi5UUlVFLmVxdWFscyhhZGFwdGVyLmdldFByb3BlcnR5KGlucHV0LCAiaXNSZWFkT25seSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCQl9Ci0JCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotCQl7Ci0JCSAgdGhpcy5lbGVtZW50ID0gKChXU0RMR3JvdXBPYmplY3QpaW5wdXQpLmdldERlZmluaXRpb24oKTsKLQkJfQotCQlyZWZyZXNoKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Fib3V0VG9CZVNob3duKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFib3V0VG9CZVNob3duKCkKLSAgewotCQlyZWZyZXNoKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Fib3V0VG9CZUhpZGRlbigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhYm91dFRvQmVIaWRkZW4oKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Rpc3Bvc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jZ2V0TWluaW11bUhlaWdodCgpCi0gICAqLwotICBwdWJsaWMgaW50IGdldE1pbmltdW1IZWlnaHQoKQotICB7Ci0gICAgcmV0dXJuIFNXVC5ERUZBVUxUOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLQkvKioKLQkgKiBHZXQgdGhlIHdpZGdldCBmYWN0b3J5LgotCSAqIEByZXR1cm4gdGhlIHdpZGdldCBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBnZXRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KQotCXsKLSAgICByZWZyZXNoKCk7Ci0JfQotCi0JCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHt9Ci0gIAotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHt9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYKLSAgICAgICAgZ2V0RWxlbWVudCgpICE9IG51bGwgJiYKLSAgICAgICAgIWlzSW5Eb0hhbmRsZSkgCi0gICAgewotICAgICAgaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLSAgICAgIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKGUpOwotICAgICAgaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJgotICAgICAgICBnZXRFbGVtZW50KCkgIT0gbnVsbCAmJgotICAgICAgICAhaXNJbkRvSGFuZGxlKSAKLSAgICB7Ci0gICAgICBpc0luRG9IYW5kbGUgPSB0cnVlOwotICAgICAgZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgYm9vbGVhbiBsaXN0ZW5lckVuYWJsZWQgPSB0cnVlOwotICAvKioKLSAgICogR2V0IHRoZSB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0gICAqIEByZXR1cm4gdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5lckVuYWJsZWQoKSAKLSAgewotICAgIHJldHVybiBsaXN0ZW5lckVuYWJsZWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLSAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byBsaXN0ZW5lckVuYWJsZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lckVuYWJsZWQoYm9vbGVhbiAgdikgCi0gIHsKLSAgICB0aGlzLmxpc3RlbmVyRW5hYmxlZCA9IHY7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmICFpc0luRG9IYW5kbGUpIAotICAgIHsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0gICAgICBzdGFydERlbGF5ZWRFdmVudChldmVudCk7Ci0gICAgICBpc0luRG9IYW5kbGUgPSBmYWxzZTsKLSAgICB9IC8vIGVuZCBvZiBpZiAoKQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBEZWxheWVkRXZlbnQgZGVsYXllZFRhc2s7Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzdGFydERlbGF5ZWRFdmVudChFdmVudCBlKQotICB7Ci0gICAgaWYgKGRlbGF5ZWRUYXNrID09IG51bGwgfHwKLSAgICAgIGRlbGF5ZWRUYXNrLmdldEV2ZW50KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLSAgICAgIGRlbGF5ZWRUYXNrLnNldEV2ZW50KGUpOwotICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwMCxkZWxheWVkVGFzayk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBFdmVudCBkZWxheWVkRXZlbnQgPSBkZWxheWVkVGFzay5nZXRFdmVudCgpOwotICAgICAgCi0gICAgICBpZiAoZS53aWRnZXQgPT0gZGVsYXllZEV2ZW50LndpZGdldCAmJgotICAgICAgICBlLnR5cGUgPT0gZGVsYXllZEV2ZW50LnR5cGUpCi0gICAgICB7Ci0gICAgICAgIC8vIHNhbWUgZXZlbnQsIGp1c3QgZGlmZmVyZW50IGRhdGEsIGRlbGF5IG5ldyBldmVudAotICAgICAgICBkZWxheWVkVGFzay5zZXRFdmVudChudWxsKTsKLSAgICAgIH0KLSAgICAgIGRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotICAgICAgZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0gICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLGRlbGF5ZWRUYXNrKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGNsYXNzIERlbGF5ZWRFdmVudCBpbXBsZW1lbnRzIFJ1bm5hYmxlCi0gIHsKLSAgICBwcm90ZWN0ZWQgRXZlbnQgZXZlbnQ7Ci0gICAgCi0gICAgLyoKLSAgICAgKiBAc2VlIFJ1bm5hYmxlI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBpZiAoZXZlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLSAgICAgICAgZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgICAgIGlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotICAgICAgICBldmVudCA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGV2ZW50LgotICAgICAqIEByZXR1cm4gUmV0dXJucyBhIEV2ZW50Ci0gICAgICovCi0gICAgcHVibGljIEV2ZW50IGdldEV2ZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gZXZlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZXZlbnQuCi0gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFdmVudChFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0gICAgfQotCi0gIH0KLQotICBib29sZWFuIGlzSW5Eb0hhbmRsZTsKLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotICAgKiBAcmV0dXJuIHZhbHVlIG9mIGlzSW5Eb0hhbmRsZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSW5Eb0hhbmRsZSgpIAotICB7Ci0gICAgcmV0dXJuIGlzSW5Eb0hhbmRsZTsKLSAgfQotCi0gIAotICBzdGF0aWMgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvcigpCi0gIHsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQotICAgIHJldHVybiBlZGl0b3JQYXJ0OwotICB9Ci0KLSAgc3RhdGljIHByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgZ2V0U3RhdHVzTGluZU1hbmFnZXIoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgeyAKLSAgICBJU3RhdHVzTGluZU1hbmFnZXIgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gKEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKWVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0gICAgICByZXN1bHQgPSBjb250cmlidXRvci5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIERvY3VtZW50SW1wbCBnZXREb2N1bWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gKERvY3VtZW50SW1wbCkgZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhTdHJpbmcgZGVzY3JpcHRpb24sIEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGdldERvY3VtZW50KGVsZW1lbnQpLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZGVzY3JpcHRpb24pOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpIGdldERvY3VtZW50KGVsZW1lbnQpOwotICAgIAotICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzI0NzM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRGaWx0ZXIoKQotICAgKi8KLSAgcHVibGljIElUeXBlTWFwcGVyIGdldEZpbHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW5wdXRUeXBlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoV1NETEVsZW1lbnQuY2xhc3MpOwotICAgIHJldHVybiBsaXN0OwotIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNhcHBsaWVzVG8ob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQgfHwgb2JqZWN0IGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RvY3VtZW50YXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmZTFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudGF0aW9uU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0KLQlUZXh0IGRvY1RleHQ7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCSAgc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJY29tcG9zaXRlID0JZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCQotCQlkb2NUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk1VTFRJIHwgU1dULk5PTkUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOyAvLyROT04tTkxTLTEkCi0gICAgZG9jVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsgIAotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZG9jVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgaWYgKGRvY1RleHQuaXNGb2N1c0NvbnRyb2woKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JICBkb2NUZXh0LnNldFRleHQoIiIpOwotCSAgaWYgKGdldEVsZW1lbnQoKSAhPSBudWxsKQotCSAgewotCSAgICBFbGVtZW50IGRvY05vZGUgPSBnZXRFbGVtZW50KCkuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkgICAgaWYgKGRvY05vZGUgIT0gbnVsbCkKLQkgICAgewotICAgICAgICBOb2RlIHRleHROb2RlID0gZG9jTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGlmICh0ZXh0Tm9kZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGRvY1ZhbHVlID0gdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgaWYgKGRvY1ZhbHVlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZG9jVGV4dC5zZXRUZXh0KGRvY1ZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQkgICAgfQotCSAgfQotCSAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotCXsKLQkgIGlmIChldmVudC53aWRnZXQgPT0gZG9jVGV4dCkKLQkgIHsKLQkgICAgU3RyaW5nIHZhbHVlID0gZG9jVGV4dC5nZXRUZXh0KCk7Ci0JICAgIGlmIChnZXRFbGVtZW50KCkgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIEVsZW1lbnQgZG9jTm9kZSA9IGdldEVsZW1lbnQoKS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCSAgICAgIGlmIChkb2NOb2RlICE9IG51bGwpCi0JICAgICAgewotICAgICAgICAgIE5vZGUgdGV4dE5vZGUgPSBkb2NOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICBpZiAodGV4dE5vZGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0ZXh0Tm9kZS5zZXROb2RlVmFsdWUodmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2NOb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgb3JnLnczYy5kb20uVGV4dCBuZXdUZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTsKLSAgICAgICAgICAgICAgZG9jTm9kZS5hcHBlbmRDaGlsZChuZXdUZXh0Tm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCSAgICAgIH0KLQkgICAgICBlbHNlCi0JICAgICAgewotCSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICBBZGRFbGVtZW50QWN0aW9uIGFjdGlvbiA9IG5ldyBBZGRFbGVtZW50QWN0aW9uKGVsZW1lbnQsIGVsZW1lbnQuZ2V0UHJlZml4KCksICJkb2N1bWVudGF0aW9uIiwgZWxlbWVudC5nZXRGaXJzdENoaWxkKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgIEVsZW1lbnQgbmV3RG9jdW1lbnRhdGlvbiA9IGFjdGlvbi5nZXROZXdFbGVtZW50KCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXdEb2N1bWVudGF0aW9uLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0IG5ld1RleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpOwotICAgICAgICAgIG5ld0RvY3VtZW50YXRpb24uYXBwZW5kQ2hpbGQobmV3VGV4dE5vZGUpOwotICAgICAgICAgIGdldEVsZW1lbnQoKS5zZXREb2N1bWVudGF0aW9uRWxlbWVudChuZXdEb2N1bWVudGF0aW9uKTsKLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RvY3VtZW50YXRpb25TZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RvY3VtZW50YXRpb25TZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDdhMzg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Eb2N1bWVudGF0aW9uU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRhdGlvblNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnRhdGlvblNlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VjdGlvbi5kb2N1bWVudGF0aW9uIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbmV3IERvY3VtZW50YXRpb25TZWN0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUYWIoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5kb2N1bWVudGF0aW9uIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldEFmdGVyU2VjdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFmdGVyU2VjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FeHRlbnNpYmlsaXR5RWxlbWVudFNlY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRXh0ZW5zaWJpbGl0eUVsZW1lbnRTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTJlZWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FeHRlbnNpYmlsaXR5RWxlbWVudFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmlsaXR5RWxlbWVudFNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VjdGlvbi5leHRlbnNpYmlsaXR5ZWxlbWVudCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG5ldyBFeHRlbnNpYmxpdHlFbGVtZW50U2VjdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNhcHBsaWVzVG8ob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRBZnRlclNlY3Rpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBZnRlclNlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FeHRlbnNpYmxpdHlFbGVtZW50U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0V4dGVuc2libGl0eUVsZW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNjQ2ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0V4dGVuc2libGl0eUVsZW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy5FeHRlbnNpYmlsaXR5RWxlbWVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHMuQXR0cmlidXRlc1RhYmxlOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsaXR5RWxlbWVudFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotewotICBFeHRlbnNpYmlsaXR5RWxlbWVudFZpZXdlciB2aWV3ZXI7Ci0gIHByb3RlY3RlZCBBdHRyaWJ1dGVzVGFibGUgYXR0cmlidXRlc1RhYmxlOwotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkKLQl7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0KLQkJY29tcG9zaXRlID0JZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCi0vLwkJdmlld2VyID0gbmV3IEV4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyKGNvbXBvc2l0ZSwgZ2V0QWN0aXZlRWRpdG9yKCksIHRydWUpOwotCQlhdHRyaWJ1dGVzVGFibGUgPSBuZXcgQXR0cmlidXRlc1RhYmxlKGdldEFjdGl2ZUVkaXRvcigpLCBjb21wb3NpdGUpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJYXR0cmlidXRlc1RhYmxlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotLy8JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0JCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSkKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgICAgcmVmcmVzaCgpOwotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICAgIH0KLSAgfSAgCi0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotICAgIGF0dHJpYnV0ZXNUYWJsZS5zZXRJbnB1dChnZXRFbGVtZW50KCkuZ2V0RWxlbWVudCgpKTsKLQotICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7IAotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsgICAgICAgICAgIAotICAgICAgICBpZiAoIWF0dHJpYnV0ZXNUYWJsZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgYXR0cmlidXRlc1RhYmxlLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07ICAgICAgICAgICAgICAgCi0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9JUHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9JUHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMWU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vSVByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlciAKLXsKLSAgLy9wdWJsaWMgdm9pZCBpbml0KElFZGl0b3JQYXJ0IGVkaXRvcik7ICAKLSAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKElFZGl0b3JQYXJ0IGVkaXRvciwgRWxlbWVudCBvd25lckVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9JbXBvcnRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vSW1wb3J0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzU1ZDk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9JbXBvcnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5kaWFsb2dzLlNlbGVjdFNpbmdsZUZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuWE1MUXVpY2tTY2FuOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVzcGFjZVRleHQsIHByZWZpeFRleHQsIGxvY2F0aW9uVGV4dDsKLSAgcHJpdmF0ZSBTdHJpbmcgb2xkUHJlZml4VmFsdWU7Ci0gIEJ1dHRvbiBidXR0b247Ci0gIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkKLQl7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YTsKLQotCQluYW1lc3BhY2VUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJbmFtZXNwYWNlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0vLwkJbmFtZXNwYWNlVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQluYW1lc3BhY2VUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ0xhYmVsIG5hbWVzcGFjZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05BTUVTUEFDRSIpKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lc3BhY2VUZXh0LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVzcGFjZVRleHQsIDAsIFNXVC5DRU5URVIpOwotCQluYW1lc3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXByZWZpeFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8JCXByZWZpeFRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlwcmVmaXhUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZXNwYWNlVGV4dCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlwcmVmaXhUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ0xhYmVsIHByZWZpeExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BSRUZJWCIpKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChwcmVmaXhUZXh0LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHByZWZpeFRleHQsIDAsIFNXVC5DRU5URVIpOwotCQlwcmVmaXhMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWxvY2F0aW9uVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWxvY2F0aW9uVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0vLwkJbG9jYXRpb25UZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCUNMYWJlbCBsb2NhdGlvbkxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0xPQ0FUSU9OIikpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGxvY2F0aW9uVGV4dCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChsb2NhdGlvblRleHQsIDAsIFNXVC5DRU5URVIpOwotCQlsb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotICAgIGJ1dHRvbi5zZXRJbWFnZShXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSArIDIpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobG9jYXRpb25UZXh0LCAwLCBTV1QuQ0VOVEVSKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYnV0dG9uLCAwKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwcmVmaXhUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0gICAgbG9jYXRpb25UZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotCSAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsgIAotCSAgT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoKTsKLSAgICBib29sZWFuIHJlZnJlc2hQcmVmaXhUZXh0ID0gdHJ1ZTsKLSAgICBib29sZWFuIHJlZnJlc2hMb2NhdGlvblRleHQgPSB0cnVlOwotICAgIGJvb2xlYW4gcmVmcmVzaE5hbWVzcGFjZVRleHQgPSB0cnVlOwotICAgIGlmIChwcmVmaXhUZXh0LmlzRm9jdXNDb250cm9sKCkpCi0gICAgewotICAgICAgcmVmcmVzaFByZWZpeFRleHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGxvY2F0aW9uVGV4dC5pc0ZvY3VzQ29udHJvbCgpKQotICAgIHsKLSAgICAgIHJlZnJlc2hMb2NhdGlvblRleHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG5hbWVzcGFjZVRleHQuaXNGb2N1c0NvbnRyb2woKSkKLSAgICB7Ci0gICAgICByZWZyZXNoTmFtZXNwYWNlVGV4dCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAocmVmcmVzaFByZWZpeFRleHQpCi0gICAgewotICAgICAgcHJlZml4VGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBpZiAocmVmcmVzaExvY2F0aW9uVGV4dCkKLSAgICB7Ci0gICAgICBsb2NhdGlvblRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgaWYgKHJlZnJlc2hOYW1lc3BhY2VUZXh0KQotICAgIHsKLSAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0JICBpZiAob2JqIGluc3RhbmNlb2YgSW1wb3J0KQotCSAgewotCSAgICBFbGVtZW50IGVsZW1lbnQgPSAoKEltcG9ydClvYmopLmdldEVsZW1lbnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChyZWZyZXNoTG9jYXRpb25UZXh0KQotICAgICAgewotICAgICAgICBTdHJpbmcgbG9jYXRpb25WYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJsb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gIAkgICAgbG9jYXRpb25UZXh0LnNldFRleHQobG9jYXRpb25WYWx1ZSAhPSBudWxsID8gbG9jYXRpb25WYWx1ZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICBTdHJpbmcgbmFtZXNwYWNlVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZXNwYWNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChyZWZyZXNoTmFtZXNwYWNlVGV4dCkKLSAgICAgIHsKLSAgICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KG5hbWVzcGFjZVZhbHVlICE9IG51bGwgPyBuYW1lc3BhY2VWYWx1ZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgCi0gICAgICBpZiAocmVmcmVzaFByZWZpeFRleHQpCi0gICAgICB7Ci0gIAkgICAgU3RyaW5nIHByZWZpeCA9ICgoSW1wb3J0KW9iaikuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldFByZWZpeChuYW1lc3BhY2VWYWx1ZSk7Ci0gIAkgICAgcHJlZml4VGV4dC5zZXRUZXh0KHByZWZpeCAhPSBudWxsID8gcHJlZml4IDogIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0JICB9Ci0Jb2xkUHJlZml4VmFsdWUgPSBwcmVmaXhUZXh0LmdldFRleHQoKTsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHByZWZpeFRleHQgJiYgbG9jYXRpb25UZXh0LmdldFRleHQoKS5sZW5ndGgoKSA+IDAgJiYgbmFtZXNwYWNlVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7ICAgIAkKLQkgICAgCU9iamVjdCBpbnB1dCA9IGdldEVsZW1lbnQoKTsKLQkgICAgICAgIEltcG9ydCBpbXBvcnRPYmogPSAoSW1wb3J0KWlucHV0OwotCSAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBpbXBvcnRFbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGltcG9ydE9iaik7Ci0JICAgICAgICBNYXAgbmFtZXNwYWNlc01hcCA9IGltcG9ydE9iai5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0TmFtZXNwYWNlcygpOwotCi0JICAgICAgICBpZiAobmFtZXNwYWNlc01hcC5jb250YWluc0tleShwcmVmaXhUZXh0LmdldFRleHQoKSkpIHsKLQkgICAgICAgIAkvLyBXZSBzaG91bGQgYWRkIGVycm9yIG1lc3NhZ2VzLi4uLi4uLi4uCi0JIC8vICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX0xBQkVMX1BSRUZJWF9FWElTVFMiKSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBlbHNlIHsKLQkgICAgICAgICAgICBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gaW1wb3J0T2JqLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRFbGVtZW50KCk7Ci0JICAgICAgICAgICAgZGVmaW5pdGlvbkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiK29sZFByZWZpeFZhbHVlKTsKLQkgICAgICAgICAgICBkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXhUZXh0LmdldFRleHQoKSwgbmFtZXNwYWNlVGV4dC5nZXRUZXh0KCkpOwotCi0vLwkgICAgICAgICAgICBjbGVhckVycm9yTWVzc2FnZSgpOwotCSAgICAgICAgICAgIG9sZFByZWZpeFZhbHVlID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0JICAgICAgICB9Ci0JICAgIH0KLQl9Ci0JCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYnV0dG9uKQotICAgIHsKLSAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgT2JqZWN0IGlucHV0ID0gZ2V0RWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgICAgcmVzb3VyY2VTZXQgPSAoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KWlucHV0KS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCi0gICAgICAgICAgIFdTRExFZGl0b3IgZWRpdG9yID0gKFdTRExFZGl0b3IpZWRpdG9yUGFydDsKLSAgICAgICAgICAgSUZpbGUgY3VycmVudFdTRExGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KWVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0gICAgICAgICAgIAotICAgICAgICAgICBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nKFdTRExFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgbnVsbCwgdHJ1ZSk7Ci0gICAgICAgICAgIFN0cmluZyBbXSBmaWx0ZXJzID0geyAieHNkIiwgIndzZGwiIH07IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgSUZpbGUgW10gZXhjbHVkZWRGaWxlcyA9IHsgY3VycmVudFdTRExGaWxlIH07Ci0gICAgICAgICAgIAotICAgICAgICAgICBkaWFsb2cuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJzLCBleGNsdWRlZEZpbGVzKTsKLSAgICAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX1NFTEVDVCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICBkaWFsb2cuc2V0VGl0bGUoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfU0VMRUNUX0ZJTEUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgZGlhbG9nLnNldE1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfREVTQ1JJUFRJT05fU0VMRUNUX1dTRExfT1JfWFNEIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGludCByYyA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgIGlmIChyYyA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgSUZpbGUgc2VsZWN0ZWRGaWxlID0gZGlhbG9nLmdldEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgIC8vaWYgKHNlbGVjdGVkRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKS5lcXVhbHMoY3VycmVudFdTRExGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKSkKLSAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAvLyAgU3lzdGVtLm91dC5wcmludGxuKCJTQU1FIEZJTEU6IiArIGN1cnJlbnRXU0RMRmlsZS5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAvL30KLQotICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuY29tcHV0ZVJlbGF0aXZlVVJJKHNlbGVjdGVkRmlsZSwgY3VycmVudFdTRExGaWxlLCB0cnVlKTsKLQotICAgICAgICAgICAgIEltcG9ydCBpbXBvcnRPYmogPSAoSW1wb3J0KWlucHV0OwotICAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgaW1wb3J0RWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChpbXBvcnRPYmopOwotICAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGltcG9ydE9iai5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAKLSAgICAgICAgICAgICBTdHJpbmcgaW1wb3J0VGFyZ2V0TmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZVByZWZpeCA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIAotICAgICAJCVVSSSB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShzZWxlY3RlZEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsgICAgICAKLQotICAgICAJCS8vIG5vdGUgdGhhdCB0aGUgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hIHdvcmtzIGZvciBib3RoIHNjaGVtYSBhbmQgd3NkbCBmaWxlcwotICAgICAJCS8vIEkgc2hvdWxkIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIGNvbnZlbmllbmNlIG1ldGhvZAotICAgICAgICAgICAgIGltcG9ydFRhcmdldE5hbWVzcGFjZSA9ICBYTUxRdWlja1NjYW4uZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKHVyaS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB1bmlxdWVQcmVmaXggPSBnZXRVbmlxdWVQcmVmaXgoZGVmaW5pdGlvbiwgdXJpLmZpbGVFeHRlbnNpb24oKSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB1bmlxdWVQcmVmaXggPSBwcmVmaXg7IAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgIAotICAgICAgICAgICAgIGlmIChpbXBvcnRUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIChpbXBvcnRUYXJnZXROYW1lc3BhY2UgIT0gbnVsbCAmJiBpbXBvcnRUYXJnZXROYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID09IDApKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybjsgIC8vIHdoYXQgdG8gZG8gd2l0aCBubyBuYW1lc3BhY2UgZG9jcz8KLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBpbXBvcnRFbGVtZW50LnNldEF0dHJpYnV0ZSgibG9jYXRpb24iLCBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICBpbXBvcnRFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIiwgaW1wb3J0VGFyZ2V0TmFtZXNwYWNlKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgZGVmaW5pdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgdW5pcXVlUHJlZml4LCBpbXBvcnRUYXJnZXROYW1lc3BhY2UpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQoaW1wb3J0VGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgICBsb2NhdGlvblRleHQuc2V0VGV4dChsb2NhdGlvbik7Ci0gICAgICAgICAgICAgcHJlZml4VGV4dC5zZXRUZXh0KHVuaXF1ZVByZWZpeCk7Ci0gICAgICAgICAgIH0KLQotICAgICAgICByZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0JCi0gIAotICBwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVQcmVmaXgoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgaW5pdFByZWZpeCkKLSAgewotICAgIFN0cmluZyB1bmlxdWVQcmVmaXg7Ci0gICAgTWFwIG1hcCA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotCi0gICAgaWYgKGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlKGluaXRQcmVmaXgpID09IG51bGwpCi0gICAgewotICAgICAgdW5pcXVlUHJlZml4ID0gaW5pdFByZWZpeDsKLSAgICB9Ci0gICAgZWxzZSAvLyBpZiB1c2VkLCB0aGVuIHRyeSB0byBjcmVhdGUgYSB1bmlxdWUgb25lCi0gICAgewotICAgICAgU3RyaW5nIHRlbXBQcmVmaXggPSBpbml0UHJlZml4OwotICAgICAgaW50IGkgPSAxOwotICAgICAgd2hpbGUobWFwLmNvbnRhaW5zS2V5KHRlbXBQcmVmaXggKyBpKSkKLSAgICAgIHsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgICAgdW5pcXVlUHJlZml4ID0gdGVtcFByZWZpeCArIGk7Ci0gICAgfQotICAgIHJldHVybiB1bmlxdWVQcmVmaXg7ICAgIAotICB9IAotICAKLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vSW1wb3J0U2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9JbXBvcnRTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZhNzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9JbXBvcnRTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRTZWN0aW9uRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IgaW1wbGVtZW50cyBJU2VjdGlvbkRlc2NyaXB0b3IKLXsKLSAgSW1wb3J0U2VjdGlvbiBpbXBvcnRTZWN0aW9uOwotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgSW1wb3J0U2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBpbXBvcnRTZWN0aW9uID0gbmV3IEltcG9ydFNlY3Rpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWN0aW9uLmltcG9ydCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKEltcG9ydC5jbGFzcyk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0U2VjdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNhcHBsaWVzVG8ob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGltcG9ydFNlY3Rpb24uc2V0RWRpdG9yUGFydChwYXJ0LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkpOwotICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW1wb3J0KQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEFmdGVyU2VjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlY3Rpb24ubmFtZSI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1MjNmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuU21hcnRSZW5hbWVBY3Rpb247Ci0KLQotcHVibGljIGNsYXNzIE5hbWVTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0KLQlUZXh0IG5hbWVUZXh0OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljb21wb3NpdGUgPQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YTsKLQkJCi0KLQkJbmFtZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9OQU1FIikgKyAiOiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVUZXh0LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVUZXh0LCAwLCBTV1QuQ0VOVEVSKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotICAgIGlmIChuYW1lVGV4dC5pc0ZvY3VzQ29udHJvbCgpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkgIG5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JICBpZiAoZ2V0RWxlbWVudCgpICE9IG51bGwpCi0JICB7Ci0JICAgIGlmIChnZXRFbGVtZW50KCkuZ2V0RWxlbWVudCgpIT0gbnVsbCkKLQkgICAgewotCSAgICAgIFN0cmluZyBuYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgIGlmIChuYW1lPT1udWxsKSBuYW1lPSIiOwotCSAgICAgIG5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0JICAgIH0KLQkgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0ICYmICFuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpOwotICAgICAgICBPYmplY3Qgd3NkbEVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKHdzZGxFbGVtZW50IGluc3RhbmNlb2YgRGVmaW5pdGlvbikgewotICAgICAgICAJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIHdzZGxFbGVtZW50OwotICAgICAgICAJU3RyaW5nIHVyaSA9IGRlZmluaXRpb24uZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgCWRlZmluaXRpb24uc2V0UU5hbWUobmV3IFFOYW1lKHVyaSwgbmV3VmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2UpIHsgICAgICAgIAotICAgICAgICAJU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHdzZGxFbGVtZW50OwotICAgICAgICAJU3RyaW5nIHVyaSA9IHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsgCi0gICAgICAgIAlzZXJ2aWNlLnNldFFOYW1lKG5ldyBRTmFtZSh1cmksIG5ld1ZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBQb3J0KSB7Ci0gICAgICAgIAluZXcgU21hcnRSZW5hbWVBY3Rpb24od3NkbEVsZW1lbnQsIG5ld1ZhbHVlKS5ydW4oKTsKLS8vICAgICAgICAJKChQb3J0KSB3c2RsRWxlbWVudCkuc2V0TmFtZShuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBCaW5kaW5nKSB7Ci0gICAgICAgIAlCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgd3NkbEVsZW1lbnQ7Ci0gICAgICAgIAlTdHJpbmcgdXJpID0gYmluZGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAJYmluZGluZy5zZXRRTmFtZShuZXcgUU5hbWUodXJpLCBuZXdWYWx1ZSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHdzZGxFbGVtZW50IGluc3RhbmNlb2YgQmluZGluZ09wZXJhdGlvbikgewotICAgICAgICAJCSgoQmluZGluZ09wZXJhdGlvbikgd3NkbEVsZW1lbnQpLnNldE5hbWUobmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHdzZGxFbGVtZW50IGluc3RhbmNlb2YgQmluZGluZ0lucHV0KSB7Ci0gICAgICAgIAlpZigoKEJpbmRpbmdJbnB1dCkgd3NkbEVsZW1lbnQpLmdldE5hbWUoKSA9PSBudWxsICYmIG5ld1ZhbHVlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCQlyZXR1cm47Ci0gICAgICAgIAkKLSAgICAgICAgCSgoQmluZGluZ0lucHV0KSB3c2RsRWxlbWVudCkuc2V0TmFtZShuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KSB7Ci0gICAgICAgIAlpZiAoKChCaW5kaW5nT3V0cHV0KSB3c2RsRWxlbWVudCkuZ2V0TmFtZSgpID09IG51bGwgJiYgbmV3VmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAJCXJldHVybjsKLSAgICAgICAgCQotICAgICAgICAJKChCaW5kaW5nT3V0cHV0KSB3c2RsRWxlbWVudCkuc2V0TmFtZShuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBCaW5kaW5nRmF1bHQpIHsKLSAgICAgICAgCSgoQmluZGluZ0ZhdWx0KSB3c2RsRWxlbWVudCkuc2V0TmFtZShuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBQb3J0VHlwZSkgewotICAgICAgICAJUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpIHdzZGxFbGVtZW50OwotICAgICAgICAJU3RyaW5nIHVyaSA9IHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIAlwb3J0VHlwZS5zZXRRTmFtZShuZXcgUU5hbWUodXJpLCBuZXdWYWx1ZSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHdzZGxFbGVtZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gICAgICAgIAluZXcgU21hcnRSZW5hbWVBY3Rpb24od3NkbEVsZW1lbnQsIG5ld1ZhbHVlKS5ydW4oKTsKLS8vICAgICAgICAJKChPcGVyYXRpb24pIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2VSZWZlcmVuY2UpIHsKLSAgICAgICAgCWlmICgoKE1lc3NhZ2VSZWZlcmVuY2UpIHdzZGxFbGVtZW50KS5nZXROYW1lKCkgPT0gbnVsbCAmJiBuZXdWYWx1ZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIAkJcmV0dXJuOwotICAgICAgICAJCi0gICAgICAgIAluZXcgU21hcnRSZW5hbWVBY3Rpb24od3NkbEVsZW1lbnQsIG5ld1ZhbHVlKS5ydW4oKTsKLS8vICAgICAgICAJKChNZXNzYWdlUmVmZXJlbmNlKSB3c2RsRWxlbWVudCkuc2V0TmFtZShuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlKSB7Ci0vKgotICAgICAgICAJTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIHdzZGxFbGVtZW50OwotICAgICAgICAJU3RyaW5nIHVyaSA9IG1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgCW1lc3NhZ2Uuc2V0UU5hbWUobmV3IFFOYW1lKHVyaSwgbmV3VmFsdWUpKTsKLSAgICAgICAgCSovCi0gICAgICAgIAluZXcgU21hcnRSZW5hbWVBY3Rpb24od3NkbEVsZW1lbnQsIG5ld1ZhbHVlKS5ydW4oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIFBhcnQpIHsKLS8vICAgICAgICAJKChQYXJ0KSB3c2RsRWxlbWVudCkuc2V0TmFtZShuZXdWYWx1ZSk7Ci0gICAgICAgIAluZXcgU21hcnRSZW5hbWVBY3Rpb24od3NkbEVsZW1lbnQsIG5ld1ZhbHVlKS5ydW4oKTsKLSAgICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjkwODQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBOYW1lU2VjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yIGltcGxlbWVudHMgSVNlY3Rpb25EZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBOYW1lU2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWN0aW9uLm5hbWUiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChXU0RMRWxlbWVudC5jbGFzcyk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0gIHsKLSAgICByZXR1cm4gbmV3IE5hbWVTZWN0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUYWIoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50ICYmIAotICAgICAgICAgICEob2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpICYmCi0gICAgICAgICAgIShvYmplY3QgaW5zdGFuY2VvZiBJbXBvcnQpKQotICAgICAgewotICAgICAgCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkgewotICAgICAgCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFdTRExFbGVtZW50KSBvYmplY3QpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIAkJaWYgKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgIShvYmplY3QgaW5zdGFuY2VvZiBEZWZpbml0aW9uKSkgewotICAgICAgCQkJcmV0dXJuIHRydWU7Ci0gICAgICAJCX0KLSAgICAgIAkJCi0gICAgICAJCXJldHVybiBmYWxzZTsKLSAgICAgIAl9Ci0gICAgICAJLyoKLSAgICAgIAllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpIHsKLSAgICAgIAkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKChXU0RMR3JvdXBPYmplY3QpIG9iamVjdCkuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgCQlpZiAoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgCQkJcmV0dXJuIHRydWU7Ci0gICAgICAJCX0KLSAgICAgIAkJCi0gICAgICAJCXJldHVybiBmYWxzZTsKLSAgICAgIAl9Ci0gICAgICAJKi8KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2Q0ODc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5FZGl0TmFtZXNwYWNlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQXR0ckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uc2VkaXQuQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5zZWRpdC5Db21tb25OYW1lc3BhY2VJbmZvVGFibGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0OwotICBwcm90ZWN0ZWQgQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyBlZGl0V1NETE5hbWVzcGFjZXNDb250cm9sOwotICBwcm90ZWN0ZWQgQnV0dG9uIGJ1dHRvbjsKLSAgCi0gIFRleHQgbmFtZVRleHQ7Ci0gIFRleHQgcHJlZml4VGV4dDsKLSAgVGV4dCB0YXJnZXROYW1lc3BhY2VUZXh0OwotICBwcm90ZWN0ZWQgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlIHRhYmxlVmlld2VyOwotICBwcml2YXRlIGJvb2xlYW4gaGFuZGxpbmdFdmVudDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkKLQl7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCWNvbXBvc2l0ZSA9CWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQkKLQkJLy8gbmFtZQotCQlDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05BTUUiKSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJbmFtZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gcHJlZml4Ci0JCUNMYWJlbCBwcmVmaXhMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9QUkVGSVgiKSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZml4VGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gdGFyZ2V0bmFtZXNwYWNlCi0JCUNMYWJlbCB0YXJnZXROYW1lc3BhY2VMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9UQVJHRVRfTkFNRVNQQUNFIikpOyAvLyROT04tTkxTLTEkCi0JCXRhcmdldE5hbWVzcGFjZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEFkdmFuY2VkIGJ1dHRvbgotCQlidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfU0VDVElPTl9BRFZBTkNFRF9BVFRSSUJVVEVTIikgKyAiLi4uIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCQotCQkKLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vIExhYmVscwotCQkvLyBuYW1lIGxheW91dAotCQlGb3JtRGF0YSBkYXRhTmFtZUxhYmVsID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGFOYW1lTGFiZWwudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVUZXh0LCAwLCBTV1QuQ0VOVEVSKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YU5hbWVMYWJlbCk7Ci0KLQkJLy8gcHJlZml4IGxheW91dAotCQlGb3JtRGF0YSBkYXRhUHJlZml4TGFiZWwgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YVByZWZpeExhYmVsLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGFQcmVmaXhMYWJlbC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJlZml4VGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCXByZWZpeExhYmVsLnNldExheW91dERhdGEoZGF0YVByZWZpeExhYmVsKTsKLQotCQkvLyB0YXJnZXROYW1lc3BhY2VMYWJlbCBsYXlvdXQKLQkJRm9ybURhdGEgZGF0YXRuc0xhYmVsID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGF0bnNMYWJlbC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIGRhdGF0bnNMYWJlbC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXJnZXROYW1lc3BhY2VUZXh0LCAwKTsKLQkJZGF0YXRuc0xhYmVsLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXJnZXROYW1lc3BhY2VUZXh0LCAwLCBTV1QuQ0VOVEVSKTsKLQkJdGFyZ2V0TmFtZXNwYWNlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhdG5zTGFiZWwpOwotCQkKLQotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8gVGV4dCBGaWVsZHMKLQkJLy8gbmFtZSB0ZXh0IGZpZWxkCi0JCUZvcm1EYXRhIGRhdGFOYW1lVGV4dCA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhTmFtZVRleHQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMTUpOwotCQlkYXRhTmFtZVRleHQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhTmFtZVRleHQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGFOYW1lVGV4dCk7Ci0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIHByZWZpeCB0ZXh0IGZpZWxkCi0JCUZvcm1EYXRhIGRhdGFQcmVmaXhUZXh0ID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGFQcmVmaXhUZXh0LmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTE1KTsKLQkJZGF0YVByZWZpeFRleHQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhUHJlZml4VGV4dC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZVRleHQsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJcHJlZml4VGV4dC5zZXRMYXlvdXREYXRhKGRhdGFQcmVmaXhUZXh0KTsKLQkJcHJlZml4VGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQkvLyB0YXJnZXRuYW1lc3BhY2UgdGV4dCBmaWVsZAotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMTUpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJlZml4VGV4dCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQl0YXJnZXROYW1lc3BhY2VUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhcmdldE5hbWVzcGFjZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JCQotCQkvLyBBZHZhbmNlZCBidXR0b24gbGF5b3V0Ci0JCUZvcm1EYXRhIGRhdGFCdXR0b24gPSBuZXcgRm9ybURhdGEoKTsKLS8vCQlkYXRhQnV0dG9uLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSArIDIpOwotCQlkYXRhQnV0dG9uLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YUJ1dHRvbi50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGFyZ2V0TmFtZXNwYWNlVGV4dCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotLy8JCWRhdGFCdXR0b24udG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRhcmdldE5hbWVzcGFjZVRleHQsIDAsIFNXVC5DRU5URVIpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhQnV0dG9uKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0JewotCQloYW5kbGluZ0V2ZW50ID0gdHJ1ZTsKLQkgIGlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQpIHsKLQkgIAlPYmplY3Qgb2JqID0gZ2V0RWxlbWVudCgpOwotCSAgCWlmIChvYmogaW5zdGFuY2VvZiBEZWZpbml0aW9uKSB7Ci0JICAJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBvYmo7Ci0JICAJCVN0cmluZyB1cmkgPSBkZWZpbml0aW9uLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JICAJCWRlZmluaXRpb24uc2V0UU5hbWUobmV3IFFOYW1lKHVyaSwgbmFtZVRleHQuZ2V0VGV4dCgpKSk7Ci0JICAJfQotCSAgfQotCSAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHByZWZpeFRleHQpIHsKLQkgIAlPYmplY3Qgb2JqID0gZ2V0RWxlbWVudCgpOwotCSAgCWlmIChvYmogaW5zdGFuY2VvZiBEZWZpbml0aW9uKSB7Ci0JICAJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBvYmo7Ci0JICAJCVN0cmluZyB1cmkgPSBkZWZpbml0aW9uLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLQkgIAkJRWxlbWVudCBlbGVtZW50ID0gZGVmaW5pdGlvbi5nZXRFbGVtZW50KCk7Ci0JICAJCQotCSAgCQkvLyBSZW1vdmUgdGhlIG9sZCBwcmVmaXgKLQkgIAkJU3RyaW5nIG9sZFByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCSAgCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgieG1sbnM6IitvbGRQcmVmaXgpOyAKLQkgIAkJCi0JICAJCS8vIFNldCB0aGUgbmV3IHByZWZpeAotCSAgCSAgCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4VGV4dC5nZXRUZXh0KCksIGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCSAgCX0KLQkgIH0KLQkgIGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSB0YXJnZXROYW1lc3BhY2VUZXh0KQotCSAgewotCQkgIE9iamVjdCBvYmogPSBnZXRFbGVtZW50KCk7Ci0JCSAgaWYgKG9iaiBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0JCSAgewotCQkgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pb2JqOwotCQkgICAgU3RyaW5nIG5ld1ZhbHVlID0gdGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCk7Ci0JCSAgICBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCSAgICBkZWZpbml0aW9uLnNldFRhcmdldE5hbWVzcGFjZShuZXdWYWx1ZSk7Ci0JCSAgICBkZWZpbml0aW9uLmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXgsIG5ld1ZhbHVlKTsKLQkJICB9Ci0JICB9Ci0JICBoYW5kbGluZ0V2ZW50ID0gZmFsc2U7CQkKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotICAgIHN1cGVyLnJlZnJlc2goKTsKLQotICAgIGlmICh0YXJnZXROYW1lc3BhY2VUZXh0LmlzRm9jdXNDb250cm9sKCkgfHwgaGFuZGxpbmdFdmVudCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCSAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsgIAotCSAgT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoKTsKLQkgIGlmIChvYmogaW5zdGFuY2VvZiBEZWZpbml0aW9uKQotCSAgewotCSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbilvYmo7Ci0JICAgIFN0cmluZyB0YXJnZXROUyA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JICAgIAotCQkvLyBzZXQgdGFyZ2V0bmFtZXNwYWNlIGZpZWxkIGFuZCBwcmVmaXggZmllbGQKLQkgICAgaWYgKHRhcmdldE5TICE9IG51bGwpCi0JICAgIHsKLQkgICAgCXRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dCh0YXJnZXROUyk7Ci0JICAgIAkKLQkgICAgCUVsZW1lbnQgZWxlbWVudCA9IGRlZmluaXRpb24uZ2V0RWxlbWVudCgpOwotCi0gICAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeCh0YXJnZXROUyk7Ci0gICAgICAgIGlmIChuZXdQcmVmaXggPT0gbnVsbCkgbmV3UHJlZml4ID0gIiI7Ci0gICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGNvZGUKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAJICAgIAlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TGVuZ3RoKCk7IGluZGV4KyspIHsKLSAgCSAgICAJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLml0ZW0oaW5kZXgpOwotICAJICAgIAkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLSAgCSAgICAJCVN0cmluZyBub2RlTmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKLSAgCSAgICAJCVN0cmluZyBuc1ZhbHVlID0gYXR0ci5nZXROb2RlVmFsdWUoKTsKLSAgCSAgICAJCWlmIChuc1ZhbHVlLmVxdWFscyh0YXJnZXROUykpIHsKLSAgCSAgICAJCQlpZiAobm9kZU5hbWUuaW5kZXhPZigiOiIpICE9IC0xKSB7Ci0gIAkgICAgCQkJCVN0cmluZyB4bWxuc1N0cmluZyA9IG5vZGVOYW1lLnN1YnN0cmluZygwLCBub2RlTmFtZS5pbmRleE9mKCI6IikpOwotICAJICAgIAkJCQkKLSAgCSAgICAJCQkJaWYgKHhtbG5zU3RyaW5nLmVxdWFscygieG1sbnMiKSkgewotICAJICAgIAkgICAgCQkJbmV3UHJlZml4ID0gYXR0ci5nZXRMb2NhbE5hbWUoKTsKLSAgCSAgICAJICAgIAkJCWJyZWFrOwotICAJICAgIAkJCQl9Ci0gIAkgICAgCQkJfQotICAJICAgIAkJfQotICAJICAgIAl9Ci0gICAgICAgIH0KLQkgICAgCXByZWZpeFRleHQuc2V0VGV4dChuZXdQcmVmaXgpOyAgICAgCi0JICAgIH0KLQkgIH0KLQkgIAotCSAgLy8gc2V0IG5hbWUgZmllbGQKLQkgIGlmIChnZXRFbGVtZW50KCkgIT0gbnVsbCkKLQkgIHsKLQkgICAgaWYgKGdldEVsZW1lbnQoKS5nZXRFbGVtZW50KCkhPSBudWxsKQotCSAgICB7Ci0JICAgICAgU3RyaW5nIG5hbWUgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JICAgICAgaWYgKG5hbWU9PW51bGwpIG5hbWU9IiI7Ci0JICAgICAgbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLQkgICAgfQotCSAgfQotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQkKLQkKLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBidXR0b24pCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbilvYmo7Ci0gICAgICAgIEVkaXROYW1lc3BhY2VzQWN0aW9uIGFjdGlvbiA9IG5ldyBFZGl0TmFtZXNwYWNlc0FjdGlvbihkZWZpbml0aW9uKTsKLSAgICAgIAlhY3Rpb24ucnVuKCk7Ci0gICAgICAgIHJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVzcGFjZVNlY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlU2VjdGlvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1OTM1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlU2VjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yIGltcGxlbWVudHMgSVNlY3Rpb25EZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBOYW1lc3BhY2VTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlY3Rpb24ubmFtZXNwYWNlIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW5wdXRUeXBlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoV1NETEdyb3VwT2JqZWN0LmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBuZXcgTmFtZXNwYWNlU2VjdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgICB7Ci0gICAgICAJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKChXU0RMR3JvdXBPYmplY3QpIG9iamVjdCkuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgCWlmIChkZWZpbml0aW9uLmdldEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAJCXJldHVybiB0cnVlOwotICAgICAgCX0KLSAgICAgIAkKLSAgICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uKSB7Ci0gICAgICAJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIG9iamVjdDsKLSAgICAgIAlpZiAoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgCQlyZXR1cm4gdHJ1ZTsKLSAgICAgIAl9Ci0gICAgICAJCi0gICAgICAJcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRBZnRlclNlY3Rpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBZnRlclNlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vUGFydFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9QYXJ0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzkzNmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9QYXJ0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLkludm9rZVNldERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci0KLQotcHVibGljIGNsYXNzIFBhcnRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIENDb21ibyBjb21wb25lbnROYW1lQ29tYm87Ci0JQ0NvbWJvIHJlZmVyZW5jZUtpbmRDb21ibzsKLSAgQ0xhYmVsIGNvbXBvbmVudE5hbWVMYWJlbDsKLSAgQnV0dG9uIGJ1dHRvbjsKLSAgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLQotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkKLQl7Ci0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkKLSAgICB7ICAKLSAgICAgIGlmIChldmVudC53aWRnZXQgPT0gcmVmZXJlbmNlS2luZENvbWJvKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzVHlwZSA9IHJlZmVyZW5jZUtpbmRDb21iby5nZXRUZXh0KCkuZXF1YWxzKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1RZUEUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5zZXRDb21wb25lbnRSZWZlcmVuY2UoKFBhcnQpZ2V0RWxlbWVudCgpLCBpc1R5cGUsIG51bGwpOwotICAgICAgICByZWZyZXNoKCk7Ci0gICAgICB9IAotICAgIH0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkKLQl7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCWNvbXBvc2l0ZSA9CWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCUZvcm1EYXRhIGRhdGE7Ci0KLQkJcmVmZXJlbmNlS2luZENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotCQlyZWZlcmVuY2VLaW5kQ29tYm8uc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLQkJcmVmZXJlbmNlS2luZENvbWJvLmFkZChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9FTEVNRU5UIikpOyAvLyROT04tTkxTLTEkCi0JCXJlZmVyZW5jZUtpbmRDb21iby5hZGQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUNMYWJlbCB2YWx1ZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1JFRkVSRU5DRV9LSU5EIikpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHJlZmVyZW5jZUtpbmRDb21ibywgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChyZWZlcmVuY2VLaW5kQ29tYm8sIDAsIFNXVC5DRU5URVIpOwotCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBjb21wb25lbnROYW1lQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIGNvbXBvbmVudE5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9FTEVNRU5UIikgKyAiOiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbXBvbmVudE5hbWVDb21ibywgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21wb25lbnROYW1lQ29tYm8sIDAsIFNXVC5DRU5URVIpOwotCQljb21wb25lbnROYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0gICAgYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICIiLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLSAgICBidXR0b24uc2V0SW1hZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9icm93c2VidXR0b24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgKyAyKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21wb25lbnROYW1lQ29tYm8sIDAsIFNXVC5DRU5URVIpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0gICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIHJlZmVyZW5jZUtpbmRDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGJ1dHRvbiwgMCk7Ci0gICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmVmZXJlbmNlS2luZENvbWJvLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICByZWZlcmVuY2VLaW5kQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotICAgIHN1cGVyLnJlZnJlc2goKTsKLQkgIHJlZmVyZW5jZUtpbmRDb21iby5yZW1vdmVMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJaWYgKCgoUGFydClnZXRFbGVtZW50KCkpLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLQkJewotCQkgIHJlZmVyZW5jZUtpbmRDb21iby5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1RZUEUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlCi0JCXsKLQkJICByZWZlcmVuY2VLaW5kQ29tYm8uc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9FTEVNRU5UIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0gICAgdHJ5Ci0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpZ2V0RWxlbWVudCgpOwotICAgICAgYm9vbGVhbiBpc1R5cGUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmlzVHlwZShwYXJ0KTsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0UGFydENvbXBvbmVudFJlZmVyZW5jZShwYXJ0KTsKLQotICAgICAgLy8gdXBkYXRlIHRoZSBjb21iby1ib3ggY29udGVudAotICAgICAgLy8KLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVBbGwoKTsgCi0gICAgICBMaXN0IGNvbXBMaXN0ID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRDb21wb25lbnROYW1lTGlzdChwYXJ0LCBpc1R5cGUpOwotICAgICAgaWYgKGNvbXBMaXN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAgY29tcExpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoKFN0cmluZylpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICB9IAotICAgICAgCi0gICAgICBpZiAoaXNUeXBlKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVmZXJlbmNlS2luZENvbWJvLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb21wb25lbnROYW1lTGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9UWVBFIikgKyAiOiIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dCh2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAiIik7IC8vJE5PTi1OTFMtMSQKLS8vICAgICAgICBidXR0b24uc2V0UmVmZXJlbmNlS2luZCgidHlwZSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZWZlcmVuY2VLaW5kQ29tYm8uc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9FTEVNRU5UIikpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb21wb25lbnROYW1lTGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9FTEVNRU5UIikgKyAiOiIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dCh2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0vLyAgICAgICAgYnV0dG9uLnNldFJlZmVyZW5jZUtpbmQoImVsZW1lbnQiKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gICAgICBidXR0b24uc2V0SW5wdXQoaW5wdXQpOwotLy8gICAgICBidXR0b24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotICAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAJCXJlZmVyZW5jZUtpbmRDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLSAgICB9Ci0JfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgUGFydCBwYXJ0ID0gKFBhcnQpZ2V0RWxlbWVudCgpOwotICAgIGJvb2xlYW4gaXNUeXBlID0gcmVmZXJlbmNlS2luZENvbWJvLmdldFRleHQoKS5lcXVhbHMoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChlLndpZGdldCA9PSBjb21wb25lbnROYW1lQ29tYm8pCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5zZXRDb21wb25lbnRSZWZlcmVuY2UocGFydCwgaXNUeXBlLCBjb21wb25lbnROYW1lQ29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gYnV0dG9uKQotICAgIHsKLSAgICAgICAgSW52b2tlU2V0RGlhbG9nIGRpYWxvZyA9IG5ldyBJbnZva2VTZXREaWFsb2coKTsKLSAgICAgICAgICAKLSAgICAgICAgaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpYWxvZy5zZXRSZWZlcmVuY2VLaW5kKHJlZmVyZW5jZUtpbmRDb21iby5nZXRUZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGRpYWxvZy5zZXRSZWZlcmVuY2VLaW5kKHJlZmVyZW5jZUtpbmRDb21iby5nZXRUZXh0KCkpOwotICAgICAgICBkaWFsb2cucnVuKGdldEVsZW1lbnQoKSwgZWRpdG9yUGFydCk7Ci0gICAgICAgIAotICAgICAgICBXU0RMRWRpdG9yIGVkaXRvciA9IChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0OwotICAgICAgICBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRFbGVtZW50KCkpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvclBhcnQoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9QYXJ0U2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9QYXJ0U2VjdGlvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiMTMxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vUGFydFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci0KLQotcHVibGljIGNsYXNzIFBhcnRTZWN0aW9uRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IgaW1wbGVtZW50cyBJU2VjdGlvbkRlc2NyaXB0b3IKLXsKLSAgUGFydFNlY3Rpb24gcGFydFNlY3Rpb247Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBQYXJ0U2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBwYXJ0U2VjdGlvbiA9IG5ldyBQYXJ0U2VjdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlY3Rpb24ucGFydCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFBhcnQuY2xhc3MpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0U2VjdGlvbkNsYXNzKCkKLSAgICovCi0gIHB1YmxpYyBJU2VjdGlvbiBnZXRTZWN0aW9uQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIHBhcnRTZWN0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgcGFydFNlY3Rpb24uc2V0RWRpdG9yUGFydChwYXJ0LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkpOwotICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUGFydCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRBZnRlclNlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWN0aW9uLm5hbWUiOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9SZWZlcmVuY2VTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vUmVmZXJlbmNlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTNlYjBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9SZWZlcmVuY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLkludm9rZVNldERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzLkNvbXBvbmVudE5hbWVDb21ib0hlbHBlcjsKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIENDb21ibyBjb21wb25lbnROYW1lQ29tYm87IAotICBwcm90ZWN0ZWQgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyIGNvbXBvbmVudE5hbWVDb21ib0hlbHBlcjsKLSAgQnV0dG9uIGJ1dHRvbjsKLSAgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLSAgQ0xhYmVsIG1lc3NhZ2VMYWJlbDsKLSAgCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGE7Ci0gICAgCi0gICAgbWVzc2FnZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX01FU1NBR0UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBjb21wb25lbnROYW1lQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0gICAgYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICIiLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLSAgICBidXR0b24uc2V0SW1hZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9icm93c2VidXR0b24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbXBvbmVudE5hbWVDb21ibywgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21wb25lbnROYW1lQ29tYm8sIDAsIFNXVC5DRU5URVIpOwotCQltZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgKyAyKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbXBvbmVudE5hbWVDb21ibywgMCwgU1dULkNFTlRFUik7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMTAwKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGJ1dHRvbiwgMCk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0JICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOyAgCi0JICBjb21wb25lbnROYW1lQ29tYm8ucmVtb3ZlTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JICBPYmplY3Qgb2JqID0gZ2V0RWxlbWVudCgpOwotCSAgaWYgKG9iaiBpbnN0YW5jZW9mIE1lc3NhZ2VSZWZlcmVuY2UpCi0JICB7Ci0JICAgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX01FU1NBR0UiKSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyID0gbmV3IENvbXBvbmVudE5hbWVDb21ib0hlbHBlcihjb21wb25lbnROYW1lQ29tYm8pCi0JICAgIHsKLQkgICAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDb21wb25lbnROYW1lTGlzdChDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwpCi0JICAgICAgewotCSAgICAgICAgcmV0dXJuIHV0aWwuZ2V0TWVzc2FnZU5hbWVzKCk7Ci0JICAgICAgfQotCi0JICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkKLQkgICAgICB7Ci0JICAgICAgICByZXR1cm4gV1NETENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURTsKLQkgICAgICB9Ci0JICAgIH07Ci0KLQkgIH0KLQkgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJpbmRpbmcpCi0JICB7Ci0JICAgIGNvbXBvbmVudE5hbWVDb21ib0hlbHBlciA9IG5ldyBDb21wb25lbnROYW1lQ29tYm9IZWxwZXIoY29tcG9uZW50TmFtZUNvbWJvKQotCSAgICB7Ci0JICAgICAgcHJvdGVjdGVkIExpc3QgZ2V0Q29tcG9uZW50TmFtZUxpc3QoQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsKQotCSAgICAgIHsKLQkgICAgICAgIHJldHVybiB1dGlsLmdldFBvcnRUeXBlTmFtZXMoKTsKLQkgICAgICB9Ci0KLQkgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKQotCSAgICAgIHsKLQkgICAgICAgIHJldHVybiBXU0RMQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFOwotCSAgICAgIH0KLQkgICAgfTsKLQotCSAgICBtZXNzYWdlTGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9QT1JUVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotCSAgfQotCSAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUG9ydCkKLQkgIHsKLQkgICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyID0gbmV3IENvbXBvbmVudE5hbWVDb21ib0hlbHBlcihjb21wb25lbnROYW1lQ29tYm8pCi0JICAgIHsKLQkgICAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDb21wb25lbnROYW1lTGlzdChDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwpCi0JICAgICAgewotCSAgICAgICAgcmV0dXJuIHV0aWwuZ2V0QmluZGluZ05hbWVzKCk7Ci0JICAgICAgfQotCi0JICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkKLQkgICAgICB7Ci0JICAgICAgICByZXR1cm4gV1NETENvbnN0YW50cy5CSU5ESU5HX0FUVFJJQlVURTsKLQkgICAgICB9Ci0JICAgIH07Ci0JICAgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0JJTkRJTkciKSk7IC8vJE5PTi1OTFMtMSQKLQkgIH0KLQkgIAotICAgIGNvbXBvbmVudE5hbWVDb21ib0hlbHBlci51cGRhdGUoZ2V0RWxlbWVudCgpKTsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCX0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJ1dHRvbikKLSAgICB7Ci0gICAgICAgIEludm9rZVNldERpYWxvZyBkaWFsb2cgPSBuZXcgSW52b2tlU2V0RGlhbG9nKCk7Ci0gICAgICAgIGRpYWxvZy5ydW4oZ2V0RWxlbWVudCgpLCBlZGl0b3JQYXJ0KTsKLSAgICAgICAgCi0gICAgICAgIFdTRExFZGl0b3IgZWRpdG9yID0gKFdTRExFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgICAgIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldEVsZW1lbnQoKSkpOwotICAgIH0KLSAgfQotCQotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGNvbXBvbmVudE5hbWVDb21ib0hlbHBlci5oYW5kbGVFdmVudEhlbHBlcihnZXRFbGVtZW50KCkuZ2V0RWxlbWVudCgpLCBldmVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvclBhcnQoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1JlZmVyZW5jZVNlY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vUmVmZXJlbmNlU2VjdGlvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliNmJmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vUmVmZXJlbmNlU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotCi0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VTZWN0aW9uRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IgaW1wbGVtZW50cyBJU2VjdGlvbkRlc2NyaXB0b3IKLXsKLSAgUmVmZXJlbmNlU2VjdGlvbiByZWZlcmVuY2VTZWN0aW9uOwotICAKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFJlZmVyZW5jZVNlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5yZWZlcmVuY2VTZWN0aW9uID0gbmV3IFJlZmVyZW5jZVNlY3Rpb24oKTsgCi0gIH0KLQotCi0gIC8qKgotICAgKiAKLSAgICovCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlY3Rpb24ucmVmZXJlbmNlIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW5wdXRUeXBlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoTWVzc2FnZVJlZmVyZW5jZS5jbGFzcyk7Ci0gICAgbGlzdC5hZGQoQmluZGluZy5jbGFzcyk7Ci0gICAgbGlzdC5hZGQoUG9ydC5jbGFzcyk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0gIHsKLSAgICByZXR1cm4gcmVmZXJlbmNlU2VjdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNhcHBsaWVzVG8ob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHJlZmVyZW5jZVNlY3Rpb24uc2V0RWRpdG9yUGFydChwYXJ0LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkpOwotICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWVzc2FnZVJlZmVyZW5jZSB8fCBvYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nIHx8IG9iamVjdCBpbnN0YW5jZW9mIFBvcnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEFmdGVyU2VjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlY3Rpb24ubmFtZSI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1RleHRDaGFuZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UZXh0Q2hhbmdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNGVkMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1RleHRDaGFuZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUZXh0Q2hhbmdlSGVscGVyIG5vdGlmaWVzIHRoZSBsaXN0bmVyIG9mIHRleHQgbGlmZWN5Y2xlIGV2ZW50cyAKLSAqIG9uIGJlaGFsZiBvZiB0aGUgd2lkZ2V0KHMpIGl0IGxpc3RlbnMgdG8uIAotICogCi0gKiBAYXV0aG9yIEFudGhvbnkgSHVudGVyIAotICogPGEgaHJlZj0ibWFpbHRvOmFudGhvbnloQGNhLmlibS5jb20iPmFudGhvbnloQGNhLmlibS5jb208L2E+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXh0Q2hhbmdlSGVscGVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQotCXByaXZhdGUgYm9vbGVhbiBub25Vc2VyQ2hhbmdlOwotCi0JLyoqCi0JICogTWFya3MgdGhlIHN0YXJ0IG9mIGEgcHJvZ3JhbW1hdGljIGNoYW5nZSB0byB0aGUgd2lkZ2V0IGNvbnRlbnRzLgotCSAqIENsaWVudHMgbXVzdCBjYWxsIHN0YXJ0Tm9uVXNlckNoYW5nZSgpIGJlZm9yZSBkaXJlY3RseSBzZXR0aW5nIAotCSAqIHRoZSB3aWRnZXQgY29udGVudHMgdG8gYXZvaWQgdW53YW50ZWQgbGlmZWN5Y2xlIGV2ZW50cy4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhIHByb2dyYW1tYXRpYyBjaGFuZ2UgaXMgCi0JICogYWxyZWFkeSBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydE5vblVzZXJDaGFuZ2UoKSB7Ci0JCWlmIChub25Vc2VyQ2hhbmdlKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigid2UgYWxyZWFkeSBzdGFydGVkIGEgbm9uIHVzZXIgY2hhbmdlIik7Ly8kTk9OLU5MUy0xJAotCQlub25Vc2VyQ2hhbmdlID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGllbnRzIHdobyBjYWxsIHN0YXJ0Tm9uVXNlckNoYW5nZSgpIHNob3VsZCBjYWxsIAotCSAqIGZpbmlzaE5vblVzZXJDaGFuZ2UoKSBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHRoZSBjaGFuZ2UgaXMgZG9uZS4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBubyBjaGFuZ2UgaXMgaW4gcHJvZ3Jlc3MuCi0JICovCi0JcHVibGljIHZvaWQgZmluaXNoTm9uVXNlckNoYW5nZSgpIHsKLQkJaWYgKCFub25Vc2VyQ2hhbmdlKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigid2UgYXJlIG5vdCBpbiBhIG5vbiB1c2VyIGNoYW5nZSIpOy8vJE5PTi1OTFMtMSQKLQkJbm9uVXNlckNoYW5nZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhIHByb2dyYW1tYXRpYyBjaGFuZ2UgaXMgaW4gcHJvZ3Jlc3MuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb25Vc2VyQ2hhbmdlKCkgewotCQlyZXR1cm4gbm9uVXNlckNoYW5nZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSBTV1QuS2V5RG93biA6Ci0JCQkJaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IpCi0JCQkJCXRleHRDaGFuZ2VkKChDb250cm9sKWV2ZW50LndpZGdldCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5Gb2N1c091dCA6Ci0JCQkJdGV4dENoYW5nZWQoKENvbnRyb2wpZXZlbnQud2lkZ2V0KTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFic3RyYWN0IG1ldGhvZCBub3RpZmllZCB3aGVuIGEgdGV4dCBmaWVsZCBoYXMgYmVlbiBjaGFuZ2VkLgotCSAqIEBwYXJhbSBjb250cm9sCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgdGV4dENoYW5nZWQoQ29udHJvbCBjb250cm9sKTsKLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGlzIGhlbHBlciB3aXRoIHRoZSBnaXZlbiBjb250cm9sIHRvIGxpc3RlbiBmb3IgZXZlbnRzCi0JICogd2hpY2ggaW5kaWNhdGUgdGhhdCBhIGNoYW5nZSBpcyBpbiBwcm9ncmVzcyAob3IgZG9uZSkuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5pbmdUbyhDb250cm9sIGNvbnRyb2wpIHsKLQkJY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIHRoaXMpOwotCQljb250cm9sLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGlzIGhlbHBlciB3aXRoIHRoZSBnaXZlbiBjb250cm9sIHRvIGxpc3RlbiBmb3IgdGhlCi0JICogRW50ZXIga2V5LiAgV2hlbiBFbnRlciBpcyBwcmVzc2VkLCB0aGUgY2hhbmdlIGlzIGNvbnNpZGVyZWQgZG9uZSAKLQkgKiAodGhpcyBpcyBvbmx5IGFwcHJvcHJpYXRlIGZvciBzaW5nbGUtbGluZSBUZXh0IHdpZGdldHMpLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nRm9yRW50ZXIoQ29udHJvbCBjb250cm9sKSB7Ci0JCS8vIE5PVEU6IEtleURvd24gcmF0aGVyIHRoYW4gS2V5VXAsIGJlY2F1c2Ugb2Ygc2ltaWxhciB1c2FnZSBpbiBDQ29tYm8uIAotCQljb250cm9sLmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBVbnJlZ2lzdGVycyB0aGlzIGhlbHBlciBmcm9tIGEgY29udHJvbCBwcmV2aW91c2x5IHBhc3NlZCB0bwotCSAqIHN0YXJ0TGlzdGVuaW5nVG8oKSBhbmQvb3Igc3RhcnRMaXN0ZW5pbmdGb3JFbnRlcigpLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb250cm9sIGNvbnRyb2wpIHsKLQkJY29udHJvbC5yZW1vdmVMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIHRoaXMpOwotCQljb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCQljb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5LZXlEb3duLCB0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vV1NETExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWJmZGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLm1vZGVsLldTRExHcmFwaE1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETE1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgV1NETExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBNb2RlbEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbmV3IFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCk7Ci0JcHJpdmF0ZSBXU0RMVHlwZU1hcHBlciB0eXBlTWFwcGVyOwotCQotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIGxhYmVsUHJvdmlkZXJFeHRlbnNpb25zOwotICBwcm90ZWN0ZWQgTGFiZWxQcm92aWRlcltdIGxhYmVsUHJvdmlkZXJzOwotICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBXU0RMTGFiZWxQcm92aWRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHR5cGVNYXBwZXIgPSBuZXcgV1NETFR5cGVNYXBwZXIoKTsKLSAgICBlZGl0b3JQYXJ0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotICAgIGxhYmVsUHJvdmlkZXJFeHRlbnNpb25zID0gcmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoV1NETEVkaXRvckV4dGVuc2lvbi5PVVRMSU5FX0xBQkVMX1BST1ZJREVSKTsgCi0gICAgbGFiZWxQcm92aWRlcnMgPSBuZXcgTGFiZWxQcm92aWRlcltsYWJlbFByb3ZpZGVyRXh0ZW5zaW9ucy5sZW5ndGhdOyAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhYmVsUHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGxhYmVsUHJvdmlkZXJzW2ldID0gKExhYmVsUHJvdmlkZXIpbGFiZWxQcm92aWRlckV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uT1VUTElORV9MQUJFTF9QUk9WSURFUiwgKFdTRExFZGl0b3IpZWRpdG9yUGFydCk7Ci0gICAgfQotICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkKLQl7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZXF1YWxzKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotICAgIEltYWdlIHJlc3VsdCA9IG51bGw7ICAgICAgICAgICAKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsZWN0ZWQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pb2JqZWN0KS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIHNlbGVjdGVkICA9IHR5cGVNYXBwZXIucmVtYXBPYmplY3Qoc2VsZWN0ZWQpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbFByb3ZpZGVycy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbGFiZWxQcm92aWRlcnNbaV0uZ2V0SW1hZ2Uoc2VsZWN0ZWQpOwotICAgICAgICBpZiAocmVzdWx0IT1udWxsKQotICAgICAgICBicmVhazsKLSAgICAgIH0KLS8vICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIoc2VsZWN0ZWQpOwotLy8gICAgICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICByZXN1bHQgPSAoSW1hZ2UpbW9kZWxBZGFwdGVyLmdldFByb3BlcnR5KHNlbGVjdGVkLCBNb2RlbEFkYXB0ZXIuSU1BR0VfUFJPUEVSVFkpOyAgICAgCi0vLyAgICAgICAgfQotLy8gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkKLQl7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZXF1YWxzKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpKSB7Ci0JCQlyZXR1cm4gIk5vIGl0ZW1zIHNlbGVjdGVkIjsvLyROT04tTkxTLTEkCi0JCX0KLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBPYmplY3Qgc2VsZWN0ZWQgPSBudWxsOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIHNlbGVjdGVkID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKW9iamVjdCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBzZWxlY3RlZCAgPSB0eXBlTWFwcGVyLnJlbWFwT2JqZWN0KHNlbGVjdGVkKTsKLSAgICAgIAotICAgICAgLy8gT3ZlcnJpZGUgb3V0bGluZSBwcm92aWRlcidzIGdldFRleHQgZm9yIFdTRExFbGVtZW50cwotICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgV1NETEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAJaWYgKCgoV1NETEVsZW1lbnQpc2VsZWN0ZWQpLmdldEVsZW1lbnQoKSA9PSBudWxsKSB7Ci0gICAgICAJCXJldHVybiAiIjsKLSAgICAgIAl9Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9IGZhbHNlOwotICAgICAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmdldEFkYXB0ZXIoc2VsZWN0ZWQpOwotICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaXNSZWFkT25seSA9IEJvb2xlYW4uVFJVRS5lcXVhbHMoYWRhcHRlci5nZXRQcm9wZXJ0eShzZWxlY3RlZCwgImlzUmVhZE9ubHkiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAoKFdTRExFbGVtZW50KXNlbGVjdGVkKS5nZXRFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCkgKyAiICgiICsgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUkVBRF9PTkxZIikgKyAiKSI7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9ICgoV1NETEVsZW1lbnQpc2VsZWN0ZWQpLmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgLy8gT3ZlcnJpZGUgZm9yIFhTRCBDb21wb25lbnRzCi0gICAgICAgCi0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWQpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWQpLmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoKFhTRENvbmNyZXRlQ29tcG9uZW50KXNlbGVjdGVkKS5nZXRFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCkgKyAiICgiICsgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUkVBRF9PTkxZIikgKyAiKSI7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gIigiICsgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUkVBRF9PTkxZIikgKyAiKSI7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgfQotICAgICAgLy8gb3RoZXJ3aXNlIGdldCBpdCBmcm9tIHRoZSBleHRlbnNpb25zCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhYmVsUHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBsYWJlbFByb3ZpZGVyc1tpXS5nZXRUZXh0KHNlbGVjdGVkKTsKLSAgICAgICAgaWYgKHJlc3VsdCE9bnVsbCkKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pCi0gICAgewotICAgIH0KLSAgICAKLQotICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIGEgbXVsdGlwbGUgb2JqZWN0IHNlbGVjdGlvbiBoYXMgYmVlbiBwYXNzZWQgdG8gdGhlIAotCSAqIGxhYmVsIHByb3ZpZGVyLiBJZiB0aGUgb2JqZWN0cyBpcyBhIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLCBzZWUgaWYgCi0JICogYWxsIHRoZSBvYmplY3RzIGluIHRoZSBzZWxlY3Rpb24gYXJlIHRoZSBzYW1lIGFuZCBpZiBzbywgd2Ugd2FudAotCSAqIHRvIHByb3ZpZGUgbGFiZWxzIGZvciB0aGUgY29tbW9uIHNlbGVjdGVkIGVsZW1lbnQuCi0JICogQHBhcmFtIG9iamVjdHMgYSBzaW5nbGUgb2JqZWN0IG9yIGEgSVN0cnVjdHVyZWRTZWxlY3Rpb24uCi0JICogQHBhcmFtIG11bHRpcGxlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5IGlzIHRydWUgaWYgdGhlcmUgaXMgbXVsdGlwbGUKLQkgKiB1bmVxdWFsIHNlbGVjdGVkIGVsZW1lbnRzIGluIGEgSVN0cnVjdHVyZWRTZWxlY3Rpb24uCi0JICogQHJldHVybiB0aGUgb2JqZWN0IHRvIGdldCBsYWJlbHMgZm9yLgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldE9iamVjdChPYmplY3Qgb2JqZWN0cywgYm9vbGVhbiBtdWx0aXBsZVtdKSB7Ci0JCUFzc2VydC5pc05vdE51bGwob2JqZWN0cyk7Ci0JCU9iamVjdCBvYmplY3QgPSBudWxsOwotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vV1NETFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkMTY1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vV1NETFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5OwotCi1wdWJsaWMgY2xhc3MgV1NETFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIgaW1wbGVtZW50cyBJU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcgotewotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlckV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBJU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcltdIHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcnM7Ci0KLSAgcHJvdGVjdGVkIFdTRExFZGl0b3JFeHRlbnNpb25bXSBsYWJlbFByb3ZpZGVyRXh0ZW5zaW9uczsKLQotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIE9iamVjdFtdIEVNUFRZX0FSUkFZID0ge307Ci0gIAotICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBXU0RMU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIC8vIFRPRE8gQ2hlY2sgdGhpcwotICAgIHRoaXMuZWRpdG9yUGFydCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyI2dldFNlY3Rpb25EZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb25EZXNjcmlwdG9yW10gZ2V0U2VjdGlvbkRlc2NyaXB0b3JzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICAKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCi0gICAgcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyRXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uUFJPUEVSVFlfU0VDVElPTl9ERVNDUklQVE9SX1BST1ZJREVSKTsgCi0gICAgcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVycyA9IG5ldyBJU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcltwcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aF07IAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXJzW2ldID0gKElTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyKXByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlckV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uUFJPUEVSVFlfU0VDVElPTl9ERVNDUklQVE9SX1BST1ZJREVSLCAoV1NETEVkaXRvcillZGl0b3JQYXJ0KTsKLSAgICAgIAotICAgICAgSVNlY3Rpb25EZXNjcmlwdG9yIFtdIGV4dGVuc2lvblNlY3Rpb25EZXNjcmlwdG9ycyA9IHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcnNbaV0uZ2V0U2VjdGlvbkRlc2NyaXB0b3JzKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV4dGVuc2lvblNlY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoZXh0ZW5zaW9uU2VjdGlvbkRlc2NyaXB0b3JzW2pdKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAKLSAgICBsaXN0LmFkZChuZXcgTmFtZVNlY3Rpb25EZXNjcmlwdG9yKCkpOwotICAgIGxpc3QuYWRkKG5ldyBQYXJ0U2VjdGlvbkRlc2NyaXB0b3IoKSk7Ci0gICAgbGlzdC5hZGQobmV3IERvY3VtZW50YXRpb25TZWN0aW9uRGVzY3JpcHRvcigpKTsKLSAgICBsaXN0LmFkZChuZXcgUmVmZXJlbmNlU2VjdGlvbkRlc2NyaXB0b3IoKSk7Ci0gICAgbGlzdC5hZGQobmV3IE5hbWVzcGFjZVNlY3Rpb25EZXNjcmlwdG9yKCkpOwotICAgIGxpc3QuYWRkKG5ldyBFeHRlbnNpYmlsaXR5RWxlbWVudFNlY3Rpb25EZXNjcmlwdG9yKCkpOwotICAgIGxpc3QuYWRkKG5ldyBJbXBvcnRTZWN0aW9uRGVzY3JpcHRvcigpKTsKLSAgICAKLQkJSVNlY3Rpb25EZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgSVNlY3Rpb25EZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkgIGxpc3QudG9BcnJheShkZXNjcmlwdG9ycyk7Ci0KLSAgICByZXR1cm4gZGVzY3JpcHRvcnM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2YjYxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vV1NETFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3LmV2ZW50cy5JTm9kZVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlldy5ldmVudHMuTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFdTRExUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBleHRlbmRzIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSU5vZGVTZWxlY3Rpb25MaXN0ZW5lciwgTW9kZWxBZGFwdGVyTGlzdGVuZXIKLXsKLSAgcHJpdmF0ZSBXU0RMU2VsZWN0aW9uTWFuYWdlciBmVmlld2VyU2VsZWN0aW9uTWFuYWdlcjsKLSAgcHJpdmF0ZSBXU0RMRWRpdG9yIHdzZGxFZGl0b3I7Ci0gIHByaXZhdGUgT2JqZWN0IGN1cnJlbnRPYmplY3Q7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yCi0gICAqLwotICBwdWJsaWMgV1NETFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IsIFdTRExFZGl0b3IgZWRpdG9yKQotICB7Ci0gICAgc3VwZXIodGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcik7Ci0gICAgdGhpcy53c2RsRWRpdG9yID0gZWRpdG9yOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgCXdzZGxFZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKSkpOwotICB9Ci0gIAotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbk1hbmFnZXIoV1NETFNlbGVjdGlvbk1hbmFnZXIgdmlld2VyU2VsZWN0aW9uTWFuYWdlcikgewotCQkvLyBkaXNjb25uZWN0IGZyb20gb2xkIG9uZQotCQlpZiAoZlZpZXdlclNlbGVjdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlZpZXdlclNlbGVjdGlvbk1hbmFnZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJZlZpZXdlclNlbGVjdGlvbk1hbmFnZXIgPSB2aWV3ZXJTZWxlY3Rpb25NYW5hZ2VyOwotCi0JCS8vIGNvbm5lY3QgdG8gbmV3IG9uZQotCQlpZiAoZlZpZXdlclNlbGVjdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlZpZXdlclNlbGVjdGlvbk1hbmFnZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotCXsKLQkJaWYgKCFldmVudC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCksIGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJICAgIC8vc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKSwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotICAKLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIC8vIG92ZXJyaWRlIGZvciBjYXRlZ29yeQotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgICBpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IG9iaiA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0Tm9kZUZvck9iamVjdChvYmopOwotICAgICAgICBPYmplY3QgbyA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudCh3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKSwgKEVsZW1lbnQpbm9kZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBiYWQgaGFjayB0byBnZXQgc2NoZW1hIGZyb20gY2F0ZWdvcnkKLSAgICAgICAgLy8gdW50aWwgd2UgcHJvdmlkZSBhIGJldHRlciBtZWNoYW5pc20gKHNlbGVjdGlvbiBtYW5hZ2VyIGV4dGVuc2lvbikKLSAgICAgICAgLy8gc2VlIGFsc28gV1NETEdyYXBoVmlld2VyCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBvYmogPSAoKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KW8pLmdldFNjaGVtYSgpOwotICAgICAgICAgIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgIH0gCi0gICAgICAJCi0gICAgICAgIGF0dGFjaExpc3RlbmVyKG8pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHdzZGxFZGl0b3IuZ2V0RWRpdG9yUGFydCgpLCBzZWxlY3Rpb24pOyAgIC8vIGV2ZW50LmdldFNlbGVjdGlvbigpKTsgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGF0dGFjaExpc3RlbmVyKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgCVdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gV1NETE1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0V1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKTsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIob2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAJLy8gcmVtb3ZlIGxpc3RlbmVyIGZyb20gdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgb2JqZWN0Ci0gICAgCXJlbW92ZUxpc3RlbmVyKGN1cnJlbnRPYmplY3QpOwotICAgIAkKLSAgICAJLy8gYWRkIGxpc3RlbmVyIHRvIHRoZSBuZXdseSBzZWxlY3RlZCBvYmplY3QKLSAgICAJYWRhcHRlci5hZGRMaXN0ZW5lcih0aGlzKTsKLSAgICAJY3VycmVudE9iamVjdCA9IG9iamVjdDsKLSAgICB9Ci0gIH0gCi0gIAotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVMaXN0ZW5lcihPYmplY3Qgb2JqZWN0KQotICB7Ci0gIAlXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKG9iamVjdCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotICAgICAgY3VycmVudE9iamVjdCA9IG51bGw7Ci0gICAgfQotICB9Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZGlzY29ubmVjdCBmcm9tIHRoZSBWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyCi0JCWlmIChmVmlld2VyU2VsZWN0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uTWFuYWdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJCi0JCS8vIGRpc2Nvbm5lY3QgbGlzdGVuZXIgZnJvbSB0aGUgY3VycmVudCBvYmplY3QKLQkJaWYgKGN1cnJlbnRPYmplY3QgIT0gbnVsbCkgewotCQkJcmVtb3ZlTGlzdGVuZXIoY3VycmVudE9iamVjdCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLnNzZS5lZGl0b3Iudmlldy5ldmVudHMuSU5vZGVTZWxlY3Rpb25MaXN0ZW5lciNub2RlU2VsZWN0aW9uQ2hhbmdlZChjb20uaWJtLnNzZS5lZGl0b3Iudmlldy5ldmVudHMuTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIG5vZGVTZWxlY3Rpb25DaGFuZ2VkKE5vZGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotICAJaWYgKGdldEN1cnJlbnRUYWIoKSAhPSBudWxsKSB7Ci0gIAkJcmVmcmVzaCgpOwotICAJfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vV1NETFR5cGVNYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMVHlwZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2VkMDU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMVHlwZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgV1NETFR5cGVNYXBwZXIgaW1wbGVtZW50cyBJVHlwZU1hcHBlcgotewotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUeXBlTWFwcGVyI3JlbWFwVHlwZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0gICAqLwotICBwdWJsaWMgQ2xhc3MgcmVtYXBUeXBlKE9iamVjdCBvYmplY3QsIENsYXNzIGVmZmVjdGl2ZVR5cGUpCi0gIHsKLQkJQ2xhc3MgdHlwZSA9IGVmZmVjdGl2ZVR5cGU7Ci0JCQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KSB7Ci0JCQl0eXBlID0gKChXU0RMR3JvdXBPYmplY3QpIG9iamVjdCkuZ2V0RGVmaW5pdGlvbigpLmdldENsYXNzKCk7Ci0JCX0KLQotCQlyZXR1cm4gdHlwZTsKLSAgfQotICAKLSAgcHVibGljIE9iamVjdCByZW1hcE9iamVjdChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgT2JqZWN0IHR5cGUgPSBvYmplY3Q7Ci0gICAgCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkKLSAgICB7Ci0gICAgICB0eXBlID0gKChXU0RMR3JvdXBPYmplY3QpIG9iamVjdCkuZ2V0RGVmaW5pdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4gdHlwZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcmVjb25jaWxlci9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yV1NETC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcmVjb25jaWxlci9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yV1NETC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmE2MzYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlY29uY2lsZXIvRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvcldTREwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucmVjb25jaWxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWNvbmNpbGUuRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JXU0RMIGV4dGVuZHMgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcgotewotCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBWQUxJREFUT1JfQ0xBU1MgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5lY2xpcHNlLlZhbGlkYXRvciI7IAotCi0gIHB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yV1NETCgpCi0gIHsgc3VwZXIoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElWYWxpZGF0b3IgZ2V0RGVsZWdhdGVWYWxpZGF0b3IoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciByZWdpc3RyeSA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLSAgICAgIHJldHVybiByZWdpc3RyeS5nZXRWYWxpZGF0b3IoVkFMSURBVE9SX0NMQVNTKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsgLy8KLSAgICB9IAotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL0V4dGVuc2libGVOb2RlUmVjb25jaWxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcmVjb25jaWxlci9FeHRlbnNpYmxlTm9kZVJlY29uY2lsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhMDc1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL0V4dGVuc2libGVOb2RlUmVjb25jaWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSU5vZGVSZWNvbmNpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLS8vIFRPRE8uLiB3ZSBzaG91bGQgcHJvYmFibHkgYmUga2V5aW5nIG9mZiBvZiB0aGUgbm9kZSdzIHFuYW1lIChwZXJoYXBzIHN1cHBvcnRpbmcgJ251bGwnIGFzIGEgd2lsZCBjYXJkIGZvciBsb2NhbCBuYW1lcykgCi0vLyBpbiBvcmRlciB0byBjb21wdXRlIGFuIGFwcGxpY2FibGUgcmVjb25jaWxlcgotLy8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlTm9kZVJlY29uY2lsZXIKLXsgIAotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBJTm9kZVJlY29uY2lsZXJbXSByZWNvbmNpbGVyczsKLQotICBwdWJsaWMgRXh0ZW5zaWJsZU5vZGVSZWNvbmNpbGVyKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uTk9ERV9SRUNPTkNJTEVSKTsgCi0gICAgcmVjb25jaWxlcnMgPSBuZXcgSU5vZGVSZWNvbmNpbGVyW2V4dGVuc2lvbnMubGVuZ3RoXTsgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHJlY29uY2lsZXJzW2ldID0gKElOb2RlUmVjb25jaWxlcilleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLk5PREVfUkVDT05DSUxFUiwgbnVsbCk7Ci0gICAgfQotICB9ICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIElOb2RlUmVjb25jaWxlciBnZXRBcHBsaWNhYmxlTm9kZVJlY29uY2lsZXIoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIElOb2RlUmVjb25jaWxlciByZWNvbmNpbGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbaV0uaXNBcHBsaWNhYmxlKG9iamVjdCkpCi0gICAgICB7Ci0gICAgICAgIHJlY29uY2lsZXIgPSByZWNvbmNpbGVyc1tpXTsKLSAgICAgICAgaWYgKHJlY29uY2lsZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWNvbmNpbGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChPYmplY3QgbW9kZWxPYmplY3QsIEVsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpICAgICAgICAgICAgIAotICB7Ci0gICAgSU5vZGVSZWNvbmNpbGVyIHJlY29uY2lsZXIgPSBnZXRBcHBsaWNhYmxlTm9kZVJlY29uY2lsZXIobW9kZWxPYmplY3QpOwotICAgIGlmIChyZWNvbmNpbGVyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJlY29uY2lsZXIubm90aWZ5Q2hhbmdlZChtb2RlbE9iamVjdCwgZWxlbWVudCwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlY29uY2lsZXIvU0VERG9jdW1lbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL1NFRERvY3VtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTAxM2U1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlY29uY2lsZXIvU0VERG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyOyAgICAKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBTRUREb2N1bWVudEFkYXB0ZXIKLXsKLSAgcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsgICAKLSAgcHJvdGVjdGVkIEV4dGVuc2libGVOb2RlUmVjb25jaWxlciBleHRlbnNpYmxlTm9kZVJlY29uY2lsZXI7Ci0gIAotICBwdWJsaWMgU0VERG9jdW1lbnRBZGFwdGVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgeyAgICAgICAgICAgCi0gICAgdGhpcy5kb2N1bWVudCA9IChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgPyAoKElET01Nb2RlbCltb2RlbCkuZ2V0RG9jdW1lbnQoKSA6IG51bGw7ICAgICAKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMuZXh0ZW5zaWJsZU5vZGVSZWNvbmNpbGVyID0gbmV3IEV4dGVuc2libGVOb2RlUmVjb25jaWxlcigpOwotICAgIG5ldyBNeURvY3VtZW50QWRhcHRlcihkb2N1bWVudCk7Ci0gIH0gIAotIAotCi0gIGNsYXNzIE15RG9jdW1lbnRBZGFwdGVyIGV4dGVuZHMgRG9jdW1lbnRBZGFwdGVyCi0gIHsKLS8vICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkRGVmaW5pdGlvbiA9IHRydWU7Ci0gICAgCi0gICAgTXlEb2N1bWVudEFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgewotICAgICAgc3VwZXIoZG9jdW1lbnQpOwotICAgIH0gICAKLSAgICAgICAgCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQpCi0gICAgICB7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBhZGFwdCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0KLSAgICAgICAgICAvLyBTZWUgQnVnIDUzNjYKLSAgICAgICAgICAvLyBXZSBuZWVkIHRvIHN5bmMgdXAgdGhlIE1vZGVsIGFuZCB0aGUgRE9NCi0gICAgICAgICAgRWxlbWVudCBuZXdEb2N1bWVudEVsZW1lbnQgPSAoRWxlbWVudCluZXdWYWx1ZTsKLSAgICAgICAgICBTdHJpbmcgd3NkbFByZWZpeCA9IG5ld0RvY3VtZW50RWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgICAgICBpZiAod3NkbFByZWZpeCA9PSBudWxsKSB3c2RsUHJlZml4ID0gIiI7Ci0gICAgICAgICAgU3RyaW5nIG5zID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2Uod3NkbFByZWZpeCk7Ci0gICAgICAgICAgaWYgKG5zICE9IG51bGwgJiYgbnMuZXF1YWxzKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKQotICAgICAgICAgICAgICYmIG5ld0RvY3VtZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5ERUZJTklUSU9OX0VMRU1FTlRfVEFHKSkgLy8gJiYKLSAgICAgICAgICAgICAvLyAhaXNWYWxpZERlZmluaXRpb24pCi0gICAgICAgICAgewotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKiBTZXR0aW5nIG5ldyBkZWZpbml0aW9uIik7Ci0gICAgICAgICAgICBkZWZpbml0aW9uLnNldEVsZW1lbnQobmV3RG9jdW1lbnRFbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgCi0gICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gd2UgbWFrZSB0aGUgYXNzdW1wdGlvbiB0aGF0IHJlY29uY2lsaW5nIHdpbGwgb25seSBiZSB0cmlnZ2VyZWQgYnkgb25lIG9mIHRoZXNlIG5vdGlmaWNhdGlvbnMgCi0gICAgICAgIC8vIChBREQgYW5kIFJFTU9WRSBub3RpZmljYXRpb25zIGFyZSBvbWl0dGVkKQotICAgICAgICAvLwotICAgICAgICBjYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFOiAKLSAgICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEOgotICAgICAgICBjYXNlIElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEOgotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChub3RpZmllciBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVjb25jaWxlTW9kZWxPYmplY3RGb3JFbGVtZW50KChFbGVtZW50KW5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChub3RpZmllciBpbnN0YW5jZW9mIERvY3VtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gKERvY3VtZW50KW5vdGlmaWVyOwotICAgICAgICAgICAgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IG51bGw7ICAgICAgICAgIAotCi0gICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLSAgICAgICAgICAgICAgICBpZiAoV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShlbGVtZW50KSA9PSBXU0RMQ29uc3RhbnRzLkRFRklOSVRJT04pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbkVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETy4uLiByZXZpc2l0IGRlZmluaXRpb24ucmVtb3ZlQWxsQ29udGVudCgpIGFuZCB3aG8gc2hvdWxkIGNhbGwgdGhpcz8KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbkVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBpc1ZhbGlkRGVmaW5pdGlvbiA9IHRydWU7Ci0vLyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWQUxJRCBERUZJTklUSU9OIEVMRU1FTlQiKTsKLSAgICAgICAgICAgICAgKChEZWZpbml0aW9uSW1wbClkZWZpbml0aW9uKS5lbGVtZW50Q2hhbmdlZChkZWZpbml0aW9uRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJTlZBTElEIERFRklOSVRJT04gRUxFTUVOVCIpOwotLy8gICAgICAgICAgICAgIGlzVmFsaWREZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbENvbnRlbnQoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCByZWNvbmNpbGVNb2RlbE9iamVjdEZvckVsZW1lbnQoRWxlbWVudCBlbGVtZW50LCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoZGVmaW5pdGlvbiwgZWxlbWVudCk7ICAKLSAgICAgIGlmIChtb2RlbE9iamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgZWUgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKW1vZGVsT2JqZWN0OwotICAgICAgICAgICgoWFNEU2NoZW1hSW1wbCllZS5nZXRTY2hlbWEoKSkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7Ci0gICAgICAgICAgZWUuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7ICAgICAgICAgICAgCi0gICAgICAgIH0JCQotICAgICAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgICgoV1NETEVsZW1lbnRJbXBsKW1vZGVsT2JqZWN0KS5lbGVtZW50Q2hhbmdlZChlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgKChYU0RDb25jcmV0ZUNvbXBvbmVudCltb2RlbE9iamVjdCkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7Ci0gICAgICAgICAgZXh0ZW5zaWJsZU5vZGVSZWNvbmNpbGVyLm5vdGlmeUNoYW5nZWQobW9kZWxPYmplY3QsIGVsZW1lbnQsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7ICAgICAKLSAgICAgICAgfQotICAgICAgfSAJICAKLSAgICB9ICAgCi0gIH0KLSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLy8gQW4gYWJzdHJhY3QgYWRhcHRlciB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgY2hpbGRyZW4gb2YgYSBuZXcgTm9kZSBhcmUgYWxzbyBhZGFwdGVkCi0gIC8vCi0gIGFic3RyYWN0IGNsYXNzIERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlcgotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBEb2N1bWVudEFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgewotICAgICAgKChJTm9kZU5vdGlmaWVyKWRvY3VtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotCi0gICAgICBmb3IgKE5vZGUgY2hpbGQgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICBhZGFwdCgoRWxlbWVudCljaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIAotICAgIHB1YmxpYyB2b2lkIGFkYXB0KEVsZW1lbnQgZWxlbWVudCkKLSAgICB7ICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKElOb2RlTm90aWZpZXIpZWxlbWVudCkuZ2V0RXhpc3RpbmdBZGFwdGVyKHRoaXMpID09IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgICgoSU5vZGVOb3RpZmllcillbGVtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotICAgICAgICAKLSAgICAgICAgICBmb3IgKE5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhZGFwdCgoRWxlbWVudCljaGlsZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSB0aGlzOwotICAgIH0KLSAgCi0gICAgYWJzdHJhY3QgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCk7ICAKLSAgfQotfSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC90eXBlc3lzdGVtL0V4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3R5cGVzeXN0ZW0vRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDZkZjc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3R5cGVzeXN0ZW0vRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC50eXBlc3lzdGVtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEV4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVHlwZVN5c3RlbVByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gZXh0ZW5zaW9uczsKLSAgcHJvdGVjdGVkIElUeXBlU3lzdGVtUHJvdmlkZXJbXSB0eXBlU3lzdGVtUHJvdmlkZXJzOwotCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSB7fTsKLQotICBwdWJsaWMgRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlcihXU0RMRWRpdG9yIHdzZGxFZGl0b3IpCi0gIHsKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCi0gICAgZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uVFlQRV9TWVNURU1fUFJPVklERVIpOyAKLSAgICB0eXBlU3lzdGVtUHJvdmlkZXJzID0gbmV3IElUeXBlU3lzdGVtUHJvdmlkZXJbZXh0ZW5zaW9ucy5sZW5ndGhdOyAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdHlwZVN5c3RlbVByb3ZpZGVyc1tpXSA9IChJVHlwZVN5c3RlbVByb3ZpZGVyKWV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uVFlQRV9TWVNURU1fUFJPVklERVIsIHdzZGxFZGl0b3IpOwotICAgIH0KLSAgfSAgICAgICAgICAKLSAgICAgICAgCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVR5cGVOYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCB0eXBlTmFtZUNhdGVnb3J5KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVN5c3RlbVByb3ZpZGVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBsaXN0LmFkZEFsbCh0eXBlU3lzdGVtUHJvdmlkZXJzW2ldLmdldEF2YWlsYWJsZVR5cGVOYW1lcyhkZWZpbml0aW9uLCB0eXBlTmFtZUNhdGVnb3J5KSk7Ci0gICAgfSAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUeXBlcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFhTRFNjaGVtYSBzY2hlbWEsIGludCB0eXBlTmFtZUNhdGVnb3J5KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVN5c3RlbVByb3ZpZGVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBsaXN0LmFkZEFsbCh0eXBlU3lzdGVtUHJvdmlkZXJzW2ldLmdldEF2YWlsYWJsZVR5cGVzKGRlZmluaXRpb24sIHNjaGVtYSwgdHlwZU5hbWVDYXRlZ29yeSkpOwotICAgIH0gICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUVsZW1lbnROYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlU3lzdGVtUHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGxpc3QuYWRkQWxsKHR5cGVTeXN0ZW1Qcm92aWRlcnNbaV0uZ2V0QXZhaWxhYmxlRWxlbWVudE5hbWVzKGRlZmluaXRpb24pKTsKLSAgICB9ICAgICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Q2F0ZWdvcnlGb3JUeXBlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB0eXBlTmFtZSkKLSAgewotICAgIGludCByZXN1bHQgPSBVTktOT1dOX1RZUEU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlU3lzdGVtUHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHR5cGVTeXN0ZW1Qcm92aWRlcnNbaV0uZ2V0Q2F0ZWdvcnlGb3JUeXBlTmFtZShkZWZpbml0aW9uLCB0eXBlTmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IFVOS05PV05fVFlQRSkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldFByZWZpeGVkTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gIAkgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVTeXN0ZW1Qcm92aWRlcnMubGVuZ3RoOyBpKyspCi0gICAgIHsKLSAgICAgICBsaXN0LmFkZEFsbCh0eXBlU3lzdGVtUHJvdmlkZXJzW2ldLmdldFByZWZpeGVkTmFtZXMoZGVmaW5pdGlvbiwgbmFtZXNwYWNlLCBsb2NhbE5hbWUpKTsKLSAgICAgfSAgICAgCi0gICAgIHJldHVybiBsaXN0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRSZWZlcmVuY2VVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudFJlZmVyZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkMzE5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudFJlZmVyZW5jZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuSW1wb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENvbXBvbmVudFJlZmVyZW5jZVV0aWwKLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gcm9vdERlZmluaXRpb247Ci0KLSAgcHVibGljIENvbXBvbmVudFJlZmVyZW5jZVV0aWwoRGVmaW5pdGlvbiByb290RGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMucm9vdERlZmluaXRpb24gPSByb290RGVmaW5pdGlvbjsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0VxdWFsKFN0cmluZyBhLCBTdHJpbmcgYikKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKGEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBhLmVxdWFscyhiKSB8fCAoYS5sZW5ndGgoKSA9PSAwICYmIGIgPT0gbnVsbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoYiA9PSBudWxsIHx8IGIubGVuZ3RoKCkgPT0gMCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNFcXVhbElucHV0TmFtZShPcGVyYXRpb24gb3BlcmF0aW9uLCBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIElucHV0IG9wZXJhdGlvbklucHV0ID0gb3BlcmF0aW9uLmdldEVJbnB1dCgpOwotICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nT3BlcmF0aW9uSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKTsKLQotICAgIGlmIChvcGVyYXRpb25JbnB1dCAhPSBudWxsICYmIGJpbmRpbmdPcGVyYXRpb25JbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGlzRXF1YWwob3BlcmF0aW9uSW5wdXQuZ2V0TmFtZSgpLCBiaW5kaW5nT3BlcmF0aW9uSW5wdXQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob3BlcmF0aW9uSW5wdXQgPT0gbnVsbCAmJiBiaW5kaW5nT3BlcmF0aW9uSW5wdXQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRXF1YWxPdXRwdXROYW1lKE9wZXJhdGlvbiBvcGVyYXRpb24sIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgT3V0cHV0IG9wZXJhdGlvbk91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0gICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3BlcmF0aW9uT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpOwotCi0gICAgaWYgKG9wZXJhdGlvbk91dHB1dCAhPSBudWxsICYmIGJpbmRpbmdPcGVyYXRpb25PdXRwdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpc0VxdWFsKG9wZXJhdGlvbk91dHB1dC5nZXROYW1lKCksIGJpbmRpbmdPcGVyYXRpb25PdXRwdXQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob3BlcmF0aW9uT3V0cHV0ID09IG51bGwgJiYgYmluZGluZ09wZXJhdGlvbk91dHB1dCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNNYXRjaGluZ0JpbmRpbmcoT3BlcmF0aW9uIG9wZXJhdGlvbiwgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgcmV0dXJuIGlzRXF1YWwob3BlcmF0aW9uLmdldE5hbWUoKSwgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpICYmIGlzRXF1YWxJbnB1dE5hbWUob3BlcmF0aW9uLCBiaW5kaW5nT3BlcmF0aW9uKSAmJiBpc0VxdWFsT3V0cHV0TmFtZShvcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb24pOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0UG9ydHNGb3JQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTZXJ2aWNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGoubmV4dCgpOwotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwgJiYgYmluZGluZy5nZXRFUG9ydFR5cGUoKSA9PSBwb3J0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHBvcnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0UG9ydHNGb3JCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTZXJ2aWNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGoubmV4dCgpOwotICAgICAgICBpZiAocG9ydC5nZXRFQmluZGluZygpID09IGJpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChwb3J0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdPcGVyYXRpb25zKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotCi0gICAgaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGdldEVuY2xvc2luZ1BvcnRUeXBlKG9wZXJhdGlvbik7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRCaW5kaW5ncyhwb3J0VHlwZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24ob3BlcmF0aW9uLCBiaW5kaW5nKTsKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGJpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gZ2V0QmluZGluZ09wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uLCBCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBqID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgai5uZXh0KCk7Ci0gICAgICBpZiAoaXNNYXRjaGluZ0JpbmRpbmcob3BlcmF0aW9uLCBiaW5kaW5nT3BlcmF0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gYmluZGluZ09wZXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ0lucHV0IGdldEJpbmRpbmdJbnB1dChJbnB1dCBpbnB1dCwgQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gZ2V0QmluZGluZ09wZXJhdGlvbigoT3BlcmF0aW9uKSBpbnB1dC5lQ29udGFpbmVyKCksIGJpbmRpbmcpOwotICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uICE9IG51bGwgPyBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ091dHB1dCBnZXRCaW5kaW5nT3V0cHV0KE91dHB1dCBvdXRwdXQsIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24oKE9wZXJhdGlvbikgb3V0cHV0LmVDb250YWluZXIoKSwgYmluZGluZyk7Ci0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCA/IGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ0ZhdWx0IGdldEJpbmRpbmdGYXVsdChGYXVsdCBmYXVsdCwgQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgQmluZGluZ0ZhdWx0IHJlc3VsdCA9IG51bGw7Ci0gICAgU3RyaW5nIGZhdWx0TmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLSAgICBpZiAoZmF1bHROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gZ2V0QmluZGluZ09wZXJhdGlvbigoT3BlcmF0aW9uKSBmYXVsdC5lQ29udGFpbmVyKCksIGJpbmRpbmcpOwotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEJpbmRpbmdGYXVsdCkgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHQoZmF1bHROYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBFT2JqZWN0IGdldEJpbmRpbmdPYmplY3QoRU9iamVjdCBpbnRlcmZhY2VPYmplY3QsIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIEVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgSW5wdXQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0QmluZGluZ0lucHV0KChJbnB1dCkgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEJpbmRpbmdPdXRwdXQoKE91dHB1dCkgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgRmF1bHQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0QmluZGluZ0ZhdWx0KChGYXVsdCkgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgT3BlcmF0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEJpbmRpbmdPcGVyYXRpb24oKE9wZXJhdGlvbikgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgUG9ydFR5cGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gYmluZGluZzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdJbnB1dHMoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgTGlzdCBvcGVyYXRpb25zID0gZ2V0QmluZGluZ09wZXJhdGlvbnMoKE9wZXJhdGlvbikgaW5wdXQuZUNvbnRhaW5lcigpKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvcGVyYXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgaS5uZXh0KCk7Ci0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5nT3V0cHV0cyhPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvdXRwdXQuZUNvbnRhaW5lcigpOwotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IG9wZXJhdGlvbnMgPSBnZXRCaW5kaW5nT3BlcmF0aW9ucyhvcGVyYXRpb24pOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3BlcmF0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5nRmF1bHRzKEZhdWx0IGZhdWx0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyBmYXVsdE5hbWUgPSBmYXVsdC5nZXROYW1lKCk7Ci0gICAgaWYgKGZhdWx0TmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBmYXVsdC5lQ29udGFpbmVyKCk7Ci0gICAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IGdldEJpbmRpbmdPcGVyYXRpb25zKG9wZXJhdGlvbik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdGYXVsdChmYXVsdE5hbWUpOwotICAgICAgICAgIGlmIChiaW5kaW5nRmF1bHQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZChiaW5kaW5nRmF1bHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHByb3RlY3RlZCBQb3J0VHlwZSBnZXRFbmNsb3NpbmdQb3J0VHlwZShPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgcmV0dXJuIChQb3J0VHlwZSkgb3BlcmF0aW9uLmVDb250YWluZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdzKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICByZXR1cm4gZ2V0QmluZGluZ3MoZ2V0RW5jbG9zaW5nUG9ydFR5cGUob3BlcmF0aW9uKSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5ncyhQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBkZWZpbml0aW9uLmdldEJpbmRpbmdzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgai5uZXh0KCk7Ci0gICAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsIHx8IGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSA9PSBwb3J0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QmluZGluZ3NXaXRob3V0T3BlcmF0aW9uKFBvcnRUeXBlIHBvcnRUeXBlLCBTdHJpbmcgb3BlcmF0aW9uTmFtZSkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBiaW5kaW5ncyA9IGdldEJpbmRpbmdzKHBvcnRUeXBlKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGJpbmRpbmdzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGkubmV4dCgpOwotICAgICAgICBib29sZWFuIGhhc05hbWUgPSBmYWxzZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBqID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBqLm5leHQoKTsKLSAgICAgICAgICBpZiAob3BlcmF0aW9uTmFtZS5lcXVhbHMoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhhc05hbWUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghaGFzTmFtZSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hZGQoYmluZGluZyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdzKCkKLSAgewotICAgIHJldHVybiBnZXRCaW5kaW5ncygoUG9ydFR5cGUpIG51bGwpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QmluZGluZ05hbWVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRCaW5kaW5ncygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKGJpbmRpbmcuZ2V0UU5hbWUoKSkpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFBvcnRUeXBlTmFtZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGRlZmluaXRpb24uZ2V0UG9ydFR5cGVzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgai5uZXh0KCk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKGdldFByZWZpeGVkTmFtZXMocG9ydFR5cGUuZ2V0UU5hbWUoKSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFNlcnZpY2VzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChkZWZpbml0aW9uLmdldEVTZXJ2aWNlcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRQb3J0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RVBvcnRUeXBlcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgbGlzdC5hZGRBbGwoZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKSk7Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmIChkZWZpbml0aW9uLmdldEVUeXBlcygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldE1lc3NhZ2VOYW1lcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgZm9yIChJdGVyYXRvciBqID0gZGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIGoubmV4dCgpOwotICAgICAgICBsaXN0LmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKG1lc3NhZ2UuZ2V0UU5hbWUoKSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldERlZmluaXRpb25zKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBhZGREZWZpbml0aW9uKHJvb3REZWZpbml0aW9uLCBsaXN0KTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAtLSB3ZSBzaG91bGQgYWx3YXlzIHVzZSBnZXRQcmVmaXhlZE5hbWVzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeGVkTmFtZShRTmFtZSBxbmFtZSkKLSAgewotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gcm9vdERlZmluaXRpb24uZ2V0UHJlZml4KHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IHByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFByZWZpeGVkTmFtZXMoUU5hbWUgcW5hbWUpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTWFwIG1hcCA9IHJvb3REZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpIG1hcC5nZXQocHJlZml4KTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsICYmIG5hbWVzcGFjZS5lcXVhbHMocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUgPSBwcmVmaXgubGVuZ3RoKCkgPiAwID8gcHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgIGxpc3QuYWRkKG5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkRGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIExpc3QgbGlzdCkKLSAgewotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQoZGVmaW5pdGlvbik7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBJbXBvcnRJbXBsIHRoZUltcG9ydCA9IChJbXBvcnRJbXBsKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKHRoZUltcG9ydC5nZXRMb2NhdGlvblVSSSgpICE9IG51bGwgJiYgIXRoZUltcG9ydC5nZXRMb2NhdGlvblVSSSgpLmVuZHNXaXRoKCJ4c2QiKSkKLSAgICAgICAgewotICAgICAgICAgIHRoZUltcG9ydC5pbXBvcnREZWZpbml0aW9uT3JTY2hlbWEoKTsJIAotICAgICAgICAgIERlZmluaXRpb24gaW1wb3J0ZWREZWZpbml0aW9uID0gKERlZmluaXRpb24pIHRoZUltcG9ydC5nZXRFRGVmaW5pdGlvbigpOwotICAgICAgICAgIGlmIChpbXBvcnRlZERlZmluaXRpb24gIT0gbnVsbCAmJiAhbGlzdC5jb250YWlucyhpbXBvcnRlZERlZmluaXRpb24pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZERlZmluaXRpb24oaW1wb3J0ZWREZWZpbml0aW9uLCBsaXN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQb3J0VHlwZVJlZmVyZW5jZShCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBvcnRUeXBlUmVmZXJlbmNlKEJpbmRpbmcgYmluZGluZywgU3RyaW5nIHBvcnRUeXBlKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGJpbmRpbmcpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBwb3J0VHlwZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmluZGluZ1JlZmVyZW5jZShQb3J0IHBvcnQpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocG9ydCk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiYmluZGluZyIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRQb3J0VHlwZVJlZmVyZW5jZVFOYW1lKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIFFOYW1lIHJlc3VsdCA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gYmluZGluZy5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgU3RyaW5nIHByZWZpeGVkTmFtZSA9IGdldFBvcnRUeXBlUmVmZXJlbmNlKGJpbmRpbmcpOwotICAgIGlmIChwcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yVXRpbC5jcmVhdGVRTmFtZShkZWZpbml0aW9uLCBwcmVmaXhlZE5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRCaW5kaW5nUmVmZXJlbmNlUU5hbWUoUG9ydCBwb3J0KQotICB7Ci0gICAgUU5hbWUgcmVzdWx0ID0gbnVsbDsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBwb3J0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gZ2V0QmluZGluZ1JlZmVyZW5jZShwb3J0KTsKLSAgICBpZiAocHJlZml4ZWROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gV1NETEVkaXRvclV0aWwuY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgcHJlZml4ZWROYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZWZlcmVuY2UoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZVJlZmVyZW5jZUhlbHBlcihpbnB1dCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVmZXJlbmNlKE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZVJlZmVyZW5jZUhlbHBlcihvdXRwdXQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlZmVyZW5jZShGYXVsdCBmYXVsdCkKLSAgewotICAgIHJldHVybiBnZXRNZXNzYWdlUmVmZXJlbmNlSGVscGVyKGZhdWx0KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lKElucHV0IGlucHV0KQotICB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZUhlbHBlcihpbnB1dCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZShPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZUhlbHBlcihvdXRwdXQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRNZXNzYWdlUmVmZXJlbmNlUU5hbWUoRmF1bHQgZmF1bHQpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lSGVscGVyKGZhdWx0KTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZWZlcmVuY2VIZWxwZXIoV1NETEVsZW1lbnQgbykKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChvKTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJtZXNzYWdlIik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZUhlbHBlcihXU0RMRWxlbWVudCBvKQotICB7Ci0gICAgUU5hbWUgcmVzdWx0ID0gbnVsbDsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBvLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gZ2V0TWVzc2FnZVJlZmVyZW5jZUhlbHBlcihvKTsKLSAgICBpZiAocHJlZml4ZWROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gV1NETEVkaXRvclV0aWwuY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgcHJlZml4ZWROYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVQb3J0VHlwZVJlZmVyZW5jZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICBRTmFtZSBxbmFtZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0UG9ydFR5cGVSZWZlcmVuY2VRTmFtZShiaW5kaW5nKTsKLQotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSAocW5hbWUgIT0gbnVsbCkgPyAoUG9ydFR5cGUpIGRlZmluaXRpb24uZ2V0UG9ydFR5cGUocW5hbWUpIDogbnVsbDsKLQotICAgICAgaWYgKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSAhPSBwb3J0VHlwZSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZy5zZXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUJpbmRpbmdSZWZlcmVuY2VzKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGkubmV4dCgpOwotICAgICAgZm9yIChJdGVyYXRvciBqID0gc2VydmljZS5nZXRFUG9ydHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBqLm5leHQoKTsKLSAgICAgICAgUU5hbWUgcW5hbWUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldEJpbmRpbmdSZWZlcmVuY2VRTmFtZShwb3J0KTsKLQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAocW5hbWUgIT0gbnVsbCkgPyAoQmluZGluZykgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKHFuYW1lKSA6IG51bGw7Ci0KLSAgICAgICAgaWYgKHBvcnQuZ2V0QmluZGluZygpICE9IGJpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBwb3J0LnNldEJpbmRpbmcoYmluZGluZyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlTWVzc2FnZVJlZmVyZW5jZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgLy8gZm9yIGVhY2ggcG9ydCB0eXBlCi0gICAgLy8KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldFBvcnRUeXBlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgaS5uZXh0KCk7Ci0KLSAgICAgIC8vIGZvciBlYWNoIG9wZXJhdGlvbgotICAgICAgLy8KLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgai5uZXh0KCk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIElucHV0Ci0gICAgICAgIC8vCi0gICAgICAgIElucHV0IGlucHV0ID0gKElucHV0KSBvcGVyYXRpb24uZ2V0SW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxbmFtZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lKGlucHV0KTsKLSAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAocW5hbWUgIT0gbnVsbCkgPyAoTWVzc2FnZSkgZGVmaW5pdGlvbi5nZXRNZXNzYWdlKHFuYW1lKSA6IG51bGw7Ci0gICAgICAgICAgaWYgKGlucHV0LmdldE1lc3NhZ2UoKSAhPSBtZXNzYWdlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIE91dHB1dAotICAgICAgICAvLwotICAgICAgICBPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCkgb3BlcmF0aW9uLmdldE91dHB1dCgpOwotICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxbmFtZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lKG91dHB1dCk7Ci0gICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKHFuYW1lICE9IG51bGwpID8gKE1lc3NhZ2UpIGRlZmluaXRpb24uZ2V0TWVzc2FnZShxbmFtZSkgOiBudWxsOwotICAgICAgICAgIGlmIChvdXRwdXQuZ2V0TWVzc2FnZSgpICE9IG1lc3NhZ2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIEZhdWx0cwotICAgICAgICAvLwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGsgPSBvcGVyYXRpb24uZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGsuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBrLm5leHQoKTsKLQotICAgICAgICAgIFFOYW1lIHFuYW1lID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRNZXNzYWdlUmVmZXJlbmNlUU5hbWUoZmF1bHQpOwotICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChxbmFtZSAhPSBudWxsKSA/IChNZXNzYWdlKSBkZWZpbml0aW9uLmdldE1lc3NhZ2UocW5hbWUpIDogbnVsbDsKLSAgICAgICAgICBpZiAoZmF1bHQuZ2V0TWVzc2FnZSgpICE9IG1lc3NhZ2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgZmF1bHQuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlU2NoZW1hUmVmZXJlbmNlcyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVNZXNzYWdlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBtZXNzYWdlLmdldEVQYXJ0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGoubmV4dCgpOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocGFydCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFdTRExFbGVtZW50SW1wbClwYXJ0KS5lbGVtZW50Q2hhbmdlZChlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uIGdldE9wZXJhdGlvbihQb3J0VHlwZSBwb3J0VHlwZSwgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgT3BlcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgaWYgKGlzTWF0Y2hpbmdCaW5kaW5nKG9wZXJhdGlvbiwgYmluZGluZ09wZXJhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG9wZXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlT3BlcmF0aW9uUmVmZXJlbmNlKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBjb21wdXRlT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOwotICAgIGlmIChvcGVyYXRpb24gIT0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKSkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldE9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KGJvb2xlYW4gaXNUeXBlKQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgIElUeXBlU3lzdGVtUHJvdmlkZXIgdHlwZVN5c3RlbVByb3ZpZGVyID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlU3lzdGVtUHJvdmlkZXIocm9vdERlZmluaXRpb24pOwotICAgIGlmICh0eXBlU3lzdGVtUHJvdmlkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpc1R5cGUgPyB0eXBlU3lzdGVtUHJvdmlkZXIuZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKHJvb3REZWZpbml0aW9uLCAwKSA6IHR5cGVTeXN0ZW1Qcm92aWRlci5nZXRBdmFpbGFibGVFbGVtZW50TmFtZXMocm9vdERlZmluaXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KFBhcnQgcGFydCwgYm9vbGVhbiBpc1R5cGUpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gcGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgSVR5cGVTeXN0ZW1Qcm92aWRlciB0eXBlU3lzdGVtUHJvdmlkZXIgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldFR5cGVTeXN0ZW1Qcm92aWRlcihkZWZpbml0aW9uKTsKLSAgICBpZiAodHlwZVN5c3RlbVByb3ZpZGVyICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gaXNUeXBlID8gdHlwZVN5c3RlbVByb3ZpZGVyLmdldEF2YWlsYWJsZVR5cGVOYW1lcyhkZWZpbml0aW9uLCAwKSA6IHR5cGVTeXN0ZW1Qcm92aWRlci5nZXRBdmFpbGFibGVFbGVtZW50TmFtZXMoZGVmaW5pdGlvbik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUeXBlKFBhcnQgcGFydCkKLSAgewotICAgIC8vRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KHBhcnQpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IHBhcnQuZ2V0RWxlbWVudCgpOwotICAgIHJldHVybiAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcnRDb21wb25lbnRSZWZlcmVuY2UoUGFydCBwYXJ0KQotICB7Ci0gICAgLy9FbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocGFydCk7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gcGFydC5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCJ0eXBlIikpCi0gICAgewotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZWxlbWVudCIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBvbmVudFJlZmVyZW5jZShQYXJ0IHBhcnQsIGJvb2xlYW4gaXNUeXBlLCBTdHJpbmcgY29tcG9uZW50TmFtZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChwYXJ0KTsKLSAgICBTdHJpbmcgbmV3QXR0cmlidXRlID0gaXNUeXBlID8gInR5cGUiIDogImVsZW1lbnQiOwotICAgIFN0cmluZyBvbGRBdHRyaWJ1dGUgPSBpc1R5cGUgPyAiZWxlbWVudCIgOiAidHlwZSI7Ci0gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUob2xkQXR0cmlidXRlKTsKLQotICAgIFN0cmluZyB2YWx1ZSA9IGNvbXBvbmVudE5hbWUgIT0gbnVsbCA/IGNvbXBvbmVudE5hbWUgOiBlbGVtZW50LmdldEF0dHJpYnV0ZShuZXdBdHRyaWJ1dGUpOwotCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGlzVHlwZSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHhzZFByZWZpeCA9IHBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldFByZWZpeChXU0RMQ29uc3RhbnRzLlhTRF9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgdmFsdWUgPSAic3RyaW5nIjsKLSAgICAgICAgaWYgKHhzZFByZWZpeCAhPSBudWxsICYmIHhzZFByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IHhzZFByZWZpeCArICI6IiArIHZhbHVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IGdldENvbXBvbmVudE5hbWVMaXN0KHBhcnQsIGlzVHlwZSk7Ci0gICAgICAgIHZhbHVlID0gbGlzdC5zaXplKCkgPiAwID8gKFN0cmluZykgbGlzdC5nZXQoMCkgOiAic29tZS1lbGVtZW50LW5hbWUiOwotICAgICAgfQotICAgIH0KLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuZXdBdHRyaWJ1dGUsIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uIGNvbXB1dGVPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgT3BlcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGJpbmRpbmdPcGVyYXRpb24uZUNvbnRhaW5lcigpOwotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBiaW5kaW5nLmdldFBvcnRUeXBlKCk7Ci0gICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0T3BlcmF0aW9uKHBvcnRUeXBlLCBiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSW5wdXQgY29tcHV0ZUlucHV0KEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQpCi0gIHsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gY29tcHV0ZU9wZXJhdGlvbigoQmluZGluZ09wZXJhdGlvbikgYmluZGluZ0lucHV0LmVDb250YWluZXIoKSk7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbiAhPSBudWxsID8gb3BlcmF0aW9uLmdldEVJbnB1dCgpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgT3V0cHV0IGNvbXB1dGVPdXRwdXQoQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0KQotICB7Ci0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGNvbXB1dGVPcGVyYXRpb24oKEJpbmRpbmdPcGVyYXRpb24pIGJpbmRpbmdPdXRwdXQuZUNvbnRhaW5lcigpKTsKLSAgICByZXR1cm4gb3BlcmF0aW9uICE9IG51bGwgPyBvcGVyYXRpb24uZ2V0RU91dHB1dCgpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgRmF1bHQgY29tcHV0ZUZhdWx0KEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQpCi0gIHsKLSAgICBGYXVsdCByZXN1bHQgPSBudWxsOwotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBjb21wdXRlT3BlcmF0aW9uKChCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nRmF1bHQuZUNvbnRhaW5lcigpKTsKLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIGZhdWx0TmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKGZhdWx0TmFtZSAhPSBudWxsICYmIGZhdWx0TmFtZS5lcXVhbHMoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBmYXVsdDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFydFJlZmVyZW5jZVZhbHVlKFBhcnQgcGFydCkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChwYXJ0KTsKLSAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCJ0eXBlIikpCi0gICAgICB7ICAgICAgCQkKLSAgICAgICAgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKSkKLSAgICAgIHsgIAotICAgICAgICB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJlbGVtZW50Iik7Ci0gICAgICB9ICAgICAgICAgCi0gICAgfSAgCi0gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICIiOwotICB9Ci0KLSAgcHVibGljIE9wZXJhdGlvbiBnZXRCaW5kaW5nT3BlcmF0aW9uKEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkNvbnRlbnQpCi0gIHsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKLSAgICBOb2RlIHBhcmVudCA9IGJpbmRpbmdPcGVyYXRpb25Db250ZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5maW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KHJvb3REZWZpbml0aW9uLCAoRWxlbWVudCkgcGFyZW50KTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3BlcmF0aW9uKQotICAgICAgewotICAgICAgICBvcGVyYXRpb24gPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVPcGVyYXRpb24oKEJpbmRpbmdPcGVyYXRpb24pIG9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvcGVyYXRpb247Ci0gIH0KLQotICBwdWJsaWMgTWVzc2FnZSBnZXRCaW5kaW5nT3BlcmF0aW9uSW5wdXRNZXNzYWdlKEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkNvbnRlbnQpCi0gIHsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBnZXRCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb25Db250ZW50KTsKLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZSA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgcHVibGljIE1lc3NhZ2UgZ2V0QmluZGluZ09wZXJhdGlvbk91dHB1dE1lc3NhZ2UoRWxlbWVudCBiaW5kaW5nT3BlcmF0aW9uQ29udGVudCkKLSAgewotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbkNvbnRlbnQpOwotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPdXRwdXQgb3V0cHV0ID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKTsKLSAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZSA9IG91dHB1dC5nZXRFTWVzc2FnZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVSZWxhdGl2ZVVSSShJRmlsZSByZWZlcmVuY2VkTG9jYXRpb24sIElGaWxlIGJhc2VMb2NhdGlvbiwgYm9vbGVhbiBlbmFibGVJRVN0eWxlUmVmZXJlbmNlcykKLSAgewotICAgIC8vIFRPRE8uLi4gd2UgbmVlZCBzb21lIGV4dGVuc2lvbiB0byBhbGxvdyBJRSBmb2xrcyB0byBwbHVnaW4gbG9naWMgdG8gY3JlYXRlIGFuICdJRScgc3R5bGUgcGF0aAotICAgIC8vIFRPRE8uLi4gY29uc2lkZXIgdXNpbmcgVVJJIGNsYXNzIGluIEVNRiAKLSAgICByZXR1cm4gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKHJlZmVyZW5jZWRMb2NhdGlvbi5nZXRMb2NhdGlvbigpLCBiYXNlTG9jYXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVSZWxhdGl2ZVVSSShTdHJpbmcgcmVmZXJlbmNlZExvY2F0aW9uLCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBib29sZWFuIGVuYWJsZUlFU3R5bGVSZWZlcmVuY2VzKQotICB7Ci0gICAgLy8gVE9ETy4uLiB3ZSBuZWVkIHNvbWUgZXh0ZW5zaW9uIHRvIGFsbG93IElFIGZvbGtzIHRvIHBsdWdpbiBsb2dpYyB0byBjcmVhdGUgYW4gJ0lFJyBzdHlsZSBwYXRoCi0gICAgLy8gVE9ETy4uLiBjb25zaWRlciB1c2luZyBVUkkgY2xhc3MgaW4gRU1GIAotICAgIHJldHVybiBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkocmVmZXJlbmNlZExvY2F0aW9uLCBiYXNlTG9jYXRpb24pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NyZWF0ZVdTRExFbGVtZW50SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NyZWF0ZVdTRExFbGVtZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjdiNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9DcmVhdGVXU0RMRWxlbWVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRCaW5kaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRGYXVsdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkSW5wdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZE1lc3NhZ2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZE9wZXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQYXJ0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQb3J0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQb3J0VHlwZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkU2VydmljZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuTWVzc2FnZVJlZmVyZW5jZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENyZWF0ZVdTRExFbGVtZW50SGVscGVyIHsKLQkvLyBDb25zdGFudHMgdXNlZCBmb3IgZ2V0dGluZyBQYXJ0IGluZm9ybWF0aW9uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9JTkZPX0VMRU1FTlRfREVDTEFSQVRJT04gPSAiRUxFTUVOVF9ERUNMQVJBVElPTiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9JTkZPX1RZUEVfREVGSU5JVElPTiAgICAgPSAiVFlQRV9ERUZJTklUSU9OIjsKLQotCS8vIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHNob3VsZCBiZSBzZXQgaWYgYSBuYW1lIG90aGVyIHRoYW4gdGhlIGNvbXB1dGVkIG5hbWUgaXMgdG8gYmUgdXNlZC4KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcG9ydE5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmRpbmdOYW1lID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwb3J0VHlwZU5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlucHV0TmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0cHV0TmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmF1bHROYW1lID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXNzYWdlTmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFydE5hbWUgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gUEFSVF9JTkZPX1RZUEVfREVGSU5JVElPTjsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQ1JFQVRFX0RPV05fVE9fUEFSVCA9IHRydWU7Ci0JCQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjcmVhdGVzIHRoZSAnc3BlY2lmaWVkJyAoYnkgY2FsbGluZyBhIGNlcnRhaW4gbWV0aG9kKSBXU0RMRWxlbWVudAotICogYW5kIGl0J3MgJ2NoaWxkcmVuJyBhbGwgdGhlIHdheSB0byB0aGUgUG9ydFR5cGUgbGV2ZWwuCi0gKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZpY2UgY3JlYXRlU2VydmljZShEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJaWYgKHNlcnZpY2VOYW1lID09IG51bGwgfHwgc2VydmljZU5hbWUudHJpbSgpLmVxdWFscygiIikpCi0JCQlzZXJ2aWNlTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlU2VydmljZU5hbWUoZGVmaW5pdGlvbik7CQkKLQkJCi0JCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLnBvcnRUeXBlTmFtZSA9IHNlcnZpY2VOYW1lOwotCQkKLQkgICAgQWRkU2VydmljZUNvbW1hbmQgYWRkU2VydmljZSA9IG5ldyBBZGRTZXJ2aWNlQ29tbWFuZChkZWZpbml0aW9uLCBzZXJ2aWNlTmFtZSwgZmFsc2UpOwotCSAgICBhZGRTZXJ2aWNlLnJ1bigpOwotCSAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgYWRkU2VydmljZS5nZXRXU0RMRWxlbWVudCgpOwotCSAgICBQb3J0IHBvcnQgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVQb3J0KHNlcnZpY2UpOwotICAJCQotCSAgICByZXR1cm4gc2VydmljZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBQb3J0IGNyZWF0ZVBvcnQoU2VydmljZSBzZXJ2aWNlKSB7Ci0JCWlmIChwb3J0TmFtZSA9PSBudWxsIHx8IHBvcnROYW1lLnRyaW0oKS5lcXVhbHMoIiIpKQotCQkJcG9ydE5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZVBvcnROYW1lKHNlcnZpY2UsIG51bGwpOwotCQkKLQkgICAgQWRkUG9ydENvbW1hbmQgYWRkUG9ydCA9IG5ldyBBZGRQb3J0Q29tbWFuZChzZXJ2aWNlLCBwb3J0TmFtZSk7Ci0JICAgIGFkZFBvcnQucnVuKCk7Ci0JICAgIFBvcnQgcG9ydCA9IChQb3J0KSBhZGRQb3J0LmdldFdTRExFbGVtZW50KCk7Ci0JCUJpbmRpbmcgYmluZGluZyA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZUJpbmRpbmcocG9ydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIHBvcnQpOwotCi0JCXBvcnQuc2V0QmluZGluZyhiaW5kaW5nKTsKLQkJCi0JICAgIHJldHVybiBwb3J0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJpbmRpbmcgY3JlYXRlQmluZGluZyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFBvcnQgcG9ydCkgewotCQliaW5kaW5nTmFtZSA9IHBvcnQuZ2V0TmFtZSgpOwotCQlpZiAoYmluZGluZ05hbWUgPT0gbnVsbCB8fCBiaW5kaW5nTmFtZS50cmltKCkuZXF1YWxzKCIiKSkKLQkJCWJpbmRpbmdOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVCaW5kaW5nTmFtZShkZWZpbml0aW9uLCBudWxsKTsKLQkJCi0JCUFkZEJpbmRpbmdDb21tYW5kIGFkZEJpbmRpbmcgPSBuZXcgQWRkQmluZGluZ0NvbW1hbmQoZGVmaW5pdGlvbiwgYmluZGluZ05hbWUpOwotCQlhZGRCaW5kaW5nLnJ1bigpOwotCQlCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYWRkQmluZGluZy5nZXRXU0RMRWxlbWVudCgpOwotCQlQb3J0VHlwZSBwb3J0VHlwZSA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZVBvcnRUeXBlKGJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLQotCQliaW5kaW5nLnNldFBvcnRUeXBlKHBvcnRUeXBlKTsKLQkJCi0JCXJldHVybiBiaW5kaW5nOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFBvcnRUeXBlIGNyZWF0ZVBvcnRUeXBlKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotCQlpZiAocG9ydFR5cGVOYW1lID09IG51bGwgfHwgcG9ydFR5cGVOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKQotCQkJcG9ydFR5cGVOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVQb3J0VHlwZU5hbWUoZGVmaW5pdGlvbiwgIlBvcnRUeXBlIik7Ci0JCQotCQlBZGRQb3J0VHlwZUNvbW1hbmQgYWRkUG9ydFR5cGVDb21tYW5kID0gbmV3IEFkZFBvcnRUeXBlQ29tbWFuZChkZWZpbml0aW9uLCBwb3J0VHlwZU5hbWUpOwotCQlhZGRQb3J0VHlwZUNvbW1hbmQucnVuKCk7Ci0JCVBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBhZGRQb3J0VHlwZUNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKTsKLQotCQlpZiAoQ1JFQVRFX0RPV05fVE9fUEFSVCkgewotCQkJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlT3BlcmF0aW9uKHBvcnRUeXBlKTsKLQkJfQotCQkKLQkJcmV0dXJuIHBvcnRUeXBlOwotCX0KLQotCQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjcmVhdGVzIHRoZSAnc3BlY2lmaWVkJyAoYnkgY2FsbGluZyBhIGNlcnRhaW4gbWV0aG9kKSBXU0RMRWxlbWVudAotICogYW5kIGl0J3MgJ2NoaWxkcmVuJyBhbGwgdGhlIHdheSB0byB0aGUgUGFydCBsZXZlbC4KLSAqLwkKLSAgCXB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbihQb3J0VHlwZSBwb3J0VHlwZSkgewotICAJCWlmIChvcGVyYXRpb25OYW1lID09IG51bGwgfHwgb3BlcmF0aW9uTmFtZS50cmltKCkuZXF1YWxzKCIiKSkKLSAgCQkJb3BlcmF0aW9uTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlT3BlcmF0aW9uTmFtZShwb3J0VHlwZSk7Ci0gIAkJCi0gIAkJRGVmaW5pdGlvbiBkZWYgPSBwb3J0VHlwZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7CQotCQlBZGRPcGVyYXRpb25Db21tYW5kIGFjdGlvbiA9IG5ldyBBZGRPcGVyYXRpb25Db21tYW5kKHBvcnRUeXBlLCBvcGVyYXRpb25OYW1lKTsKLQkJYWN0aW9uLnJ1bigpOwotCQlPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgYWN0aW9uLmdldFdTRExFbGVtZW50KCk7Ci0gIAkJT3V0cHV0IG91dHB1dCA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU91dHB1dChwb3J0VHlwZSwgb3BlcmF0aW9uKTsKLQkJSW5wdXQgaW5wdXQgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVJbnB1dChwb3J0VHlwZSwgb3BlcmF0aW9uLCBudWxsKTsKLQotLy8gIAkJKChQb3J0VHlwZUltcGwpIHBvcnRUeXBlKS51cGRhdGVFbGVtZW50KGZhbHNlKTsKLSAgIAkJcmV0dXJuIG9wZXJhdGlvbjsKLSAgCX0KLQotICAJcHVibGljIHN0YXRpYyBJbnB1dCBjcmVhdGVJbnB1dChQb3J0VHlwZSBwb3J0VHlwZSwgT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIGlucHV0TmFtZSkgewotICAJCWlmIChpbnB1dE5hbWUgPT0gbnVsbCB8fCBpbnB1dE5hbWUudHJpbSgpLmVxdWFscygiIikpCi0gIAkgIAkJaW5wdXROYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVJbnB1dE5hbWUocG9ydFR5cGUsIG9wZXJhdGlvbi5nZXROYW1lKCksICIiKTsKLSAgCQkKLSAgCQlEZWZpbml0aW9uIGRlZiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gIAkJQWRkSW5wdXRDb21tYW5kIGFjdGlvbiA9IG5ldyBBZGRJbnB1dENvbW1hbmQob3BlcmF0aW9uLCBpbnB1dE5hbWUpOwotICAJCWFjdGlvbi5ydW4oKTsKLSAgCQlJbnB1dCBpbnB1dCA9IChJbnB1dCkgYWN0aW9uLmdldFdTRExFbGVtZW50KCk7IAotICAJCU1lc3NhZ2UgbWVzcyA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU1lc3NhZ2UoaW5wdXQpOwotICAJCWlucHV0LnNldE1lc3NhZ2UobWVzcyk7Ci0gIAkJCSAgCQkKLSAgCQlyZXR1cm4gaW5wdXQ7Ci0gIAl9Ci0gIAkJCSAgCQotICAJcHVibGljIHN0YXRpYyBPdXRwdXQgY3JlYXRlT3V0cHV0KFBvcnRUeXBlIHBvcnRUeXBlLCBPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gIAkJaWYgKG91dHB1dE5hbWUgPT0gbnVsbCB8fCBvdXRwdXROYW1lLnRyaW0oKS5lcXVhbHMoIiIpKQotICAJICAJCW91dHB1dE5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU91dHB1dE5hbWUocG9ydFR5cGUsIG9wZXJhdGlvbi5nZXROYW1lKCksICIiKTsKLSAgCQkKLSAgCQlEZWZpbml0aW9uIGRlZiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gIAkJQWRkT3V0cHV0Q29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkT3V0cHV0Q29tbWFuZChvcGVyYXRpb24sIG91dHB1dE5hbWUpOwotICAJCWFjdGlvbi5ydW4oKTsKLSAgCQlPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCkgYWN0aW9uLmdldFdTRExFbGVtZW50KCk7Ci0gIAkJTWVzc2FnZSBtZXNzID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlTWVzc2FnZShvdXRwdXQpOwotICAJCW91dHB1dC5zZXRNZXNzYWdlKG1lc3MpOwkKLSAgCQkJICAJCQotICAJCXJldHVybiBvdXRwdXQ7Ci0gIAl9Ci0gIAkJCSAgCQotICAJcHVibGljIHN0YXRpYyBGYXVsdCBjcmVhdGVGYXVsdChPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gIAkJaWYgKGZhdWx0TmFtZSA9PSBudWxsIHx8IGZhdWx0TmFtZS50cmltKCkuZXF1YWxzKCIiKSkgCi0JICAJCWZhdWx0TmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlRmF1bHROYW1lKG9wZXJhdGlvbik7Ci0gIAkJCi0gIAkJRGVmaW5pdGlvbiBkZWYgPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAJCUFkZEZhdWx0Q29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkRmF1bHRDb21tYW5kKG9wZXJhdGlvbiwgZmF1bHROYW1lKTsKLSAgCQlhY3Rpb24ucnVuKCk7Ci0gIAkJRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGFjdGlvbi5nZXRXU0RMRWxlbWVudCgpOwotICAJCU1lc3NhZ2UgbWVzcyA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU1lc3NhZ2UoZmF1bHQpOwotICAJCWZhdWx0LnNldE1lc3NhZ2UobWVzcyk7Ci0gIAkJIAkJCi0gIAkJcmV0dXJuIGZhdWx0OwotICAJfQotICAJCQkgIAkKLSAgCXB1YmxpYyBzdGF0aWMgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKE1lc3NhZ2VSZWZlcmVuY2UgaW9mKSB7Ci0gIAkJaWYgKG1lc3NhZ2VOYW1lID09IG51bGwgfHwgbWVzc2FnZU5hbWUudHJpbSgpLmVxdWFscygiIikpCi0gIAkgIAkJbWVzc2FnZU5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKGlvZi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIGlvZik7Ci0vLwkgIAkJbWVzc2FnZU5hbWUgPSBOYW1lVXRpbC5idWlsZE1lc3NhZ2VOYW1lKGlvZi5nZXROYW1lKCkpOwotICAJCQotICAJCURlZmluaXRpb24gZGVmID0gaW9mLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgCQlBZGRNZXNzYWdlQ29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmLCBtZXNzYWdlTmFtZSk7Ci0gIAkJYWN0aW9uLnJ1bigpOwotICAJCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBhY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLSAgCQlQYXJ0IHBhcnQgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVQYXJ0KG1lc3NhZ2UpOwotICAJCUVsZW1lbnQgcGFyZW50Tm9kZSA9IG1lc3NhZ2UuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgCi0gICAgICB7Ci0JCSAgICAvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgRm9ybWF0UHJvY2Vzc29yWE1MIGZvcm1hdFByb2Nlc3NvclhNTCA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLSAgICAgICAgZm9ybWF0UHJvY2Vzc29yWE1MLmZvcm1hdE5vZGUoKElET01Ob2RlKXBhcmVudE5vZGUpOwotICAgICAgfQotICAJCQotICAJCW1lc3NhZ2VOYW1lID0gbnVsbDsKLSAgCQlyZXR1cm4gbWVzc2FnZTsKLSAgCX0KLSAgCQkJICAJCi0gIAlwdWJsaWMgc3RhdGljIFBhcnQgY3JlYXRlUGFydChNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgCQlEZWZpbml0aW9uIGRlZiA9IG1lc3NhZ2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAJCVN0cmluZyBuYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVQYXJ0TmFtZShtZXNzYWdlLCBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAJCUFkZFBhcnRDb21tYW5kIGFjdGlvbiA9IG51bGw7Ci0gIAkJCi0gIAkJaWYgKFBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID09IFBBUlRfSU5GT19UWVBFX0RFRklOSVRJT04pIHsKLSAgCQkJYWN0aW9uID0gbmV3IEFkZFBhcnRDb21tYW5kKG1lc3NhZ2UsIG5hbWUsIFdTRExDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciLCB0cnVlKTsKLSAgCQl9Ci0gIAkJZWxzZSBpZiAoUEFSVF9UWVBFX09SX0RFRklOSVRJT04gPT0gUEFSVF9JTkZPX0VMRU1FTlRfREVDTEFSQVRJT04pIHsgIAkJCQotICAJCQkvL2FjdGlvbiA9IG5ldyBBZGRQYXJ0Q29tbWFuZChtZXNzYWdlLCBuYW1lLCBXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAic3RyaW5nIiwgdHJ1ZSk7Ci0gIAkJCVN0cmluZyBlbGVtZW50TmFtZSA9IGdldE5ld05hbWVIZWxwZXIobmFtZSwgZGVmLCBmYWxzZSk7Ci0gIAkJCUFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQgZWxlbWVudEFjdGlvbiA9IG5ldyBBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKGRlZiwgZWxlbWVudE5hbWUpOwotICAJCQllbGVtZW50QWN0aW9uLnJ1bigpOwotICAJCQlhY3Rpb24gPSBuZXcgQWRkUGFydENvbW1hbmQobWVzc2FnZSwgbmFtZSwgZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpLCBlbGVtZW50TmFtZSwgZmFsc2UpOwotICAJCX0KLQotICAJCWFjdGlvbi5ydW4oKTsKLSAgCQkKLSAgCQlyZXR1cm4gKFBhcnQpIGFjdGlvbi5nZXRXU0RMRWxlbWVudCgpOwotICAJfQkKLQotICAJLyoKLSAgCSAqIFVzZWQgdG8gZGV0ZXJtaW5lIGEgbmFtZSBmb3IgYW4gRWxlbWVudAotICAJICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld05hbWVIZWxwZXIoU3RyaW5nIGJhc2UsIERlZmluaXRpb24gZGVmLCBib29sZWFuIGlzVHlwZSkKLSAgICB7IAotICAgICAgU3RyaW5nIG5hbWUgPSBiYXNlOyAgICAKLSAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgIC8vIFVnbHkuLi4uICBSZWRvIHRoaXMuLi4KLSAgICAgIC8vIEdldCBhIGxpc3Qgb2YgRWxlbWVudHMuLi4KLSAgICAgIExpc3QgZWxlbWVudExpc3QgPSBudWxsOwotICAgICAgaWYgKGRlZi5nZXRFVHlwZXMoKSAhPSBudWxsKSB7Ci0gICAgICAJTGlzdCB4c2RzTGlzdCA9IGRlZi5nZXRFVHlwZXMoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAJaWYgKHhzZHNMaXN0ICE9IG51bGwpIHsKLSAgICAgIAkJSXRlcmF0b3IgeHNkc0l0ZXJhdG9yID0geHNkc0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgIAkJWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNkRWxlbWVudCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgeHNkc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgIAkJWFNEU2NoZW1hIHNjaGVtYSA9IHhzZEVsZW1lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgICAJCWlmIChzY2hlbWEgIT0gbnVsbCkgewotICAgICAgCQkJZWxlbWVudExpc3QgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotICAgICAgCQl9Ci0gICAgICAJfQotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZWxlbWVudExpc3QgIT0gbnVsbCkgewotICAgICAgCWludCBpbmRleCA9IDA7Ci0gICAgICAJd2hpbGUgKGluZGV4IDwgZWxlbWVudExpc3Quc2l6ZSgpKSB7Ci0gICAgICAJCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50TGlzdC5nZXQoaW5kZXgpOwotICAgICAgCQkKLSAgICAgIAkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnREZWNsYXJhdGlvbi5nZXROYW1lKCkpKSB7Ci0gICAgICAJCQljb3VudCsrOwotICAgICAgCQkJbmFtZSA9IG5hbWUgKyBjb3VudDsKLSAgICAgIAkJCWluZGV4ID0gMDsKLSAgICAgIAkJfQotICAgICAgCQllbHNlIHsKLSAgICAgIAkJCWluZGV4Kys7Ci0gICAgICAJCX0KLSAgICAgIAl9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAJLyoKLSAgCSAqIFJldHVybiB0aGUgdHlwZSBvZiBQYXJ0IHRoaXMgV1NETEVsZW1lbnQgc2hvdWxkIGhhdmUgKEVsZW1lbnQgdnMgVHlwZSkuICBUbyBkZXRlcm1pbmUgdGhpcywgd2UgZmlsdGVyIHVwIHRvIHRoZSAncGFyZW50JyBQb3J0VHlwZQotICAJICogYW5kIGdvIGRvd24gdG8gdGhlIGZpcnN0IFBhcnQgd2UgZW5jb3VudGVyIGFuZCBjaGVjayB0aGUgdHlwZSBpdCBoYXMuICBJZiB0aGlzIGZhaWxzLCBkZWZhdWx0IHRvIFR5cGUuCi0gIAkgKi8KLSAgCSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFydEluZm8oV1NETEVsZW1lbnQgZWxlbWVudCkgewotICAJICAJU3RyaW5nIHBhcnRJbmZvID0gbnVsbDsKLSAgCSAgCQotICAJICAJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQb3J0VHlwZSkgewotICAJICAJCXBhcnRJbmZvID0gZ2V0UGFydEluZm8oKFBvcnRUeXBlKSBlbGVtZW50KTsKLSAgCSAgCX0KLSAgCSAgCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgCSAgCQlwYXJ0SW5mbyA9IGdldFBhcnRJbmZvKCgoV1NETEVsZW1lbnRJbXBsKSBlbGVtZW50KS5nZXRDb250YWluZXIoKSk7Ci0gIAkgIAl9Ci0gIAkgIAllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWVzc2FnZVJlZmVyZW5jZUltcGwpIHsKLSAgCSAgCQlwYXJ0SW5mbyA9IGdldFBhcnRJbmZvKCgoV1NETEVsZW1lbnRJbXBsKSBlbGVtZW50KS5nZXRDb250YWluZXIoKSk7Ci0gIAkgIAl9Ci0KLSAgCSAgCWlmIChwYXJ0SW5mbyA9PSBudWxsKSB7Ci0gIAkgIAkJcGFydEluZm8gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5QQVJUX0lORk9fVFlQRV9ERUZJTklUSU9OOwotICAJICAJfQotICAJICAJCi0gIAkgIAlyZXR1cm4gcGFydEluZm87ICAJCi0gIAkgIH0KLSAgCSAgCi0gIAkgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYXJ0SW5mbyhQb3J0VHlwZSBwb3J0VHlwZSkgewotICAJICAJU3RyaW5nIHBhcnRJbmZvID0gbnVsbDsKLSAgCSAgCQotICAJICAJaWYgKHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKSAhPSBudWxsKSB7Ci0gIAkgIAkJSXRlcmF0b3Igb3BlcmF0aW9uSXQgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgCSAgCQl3aGlsZSAob3BlcmF0aW9uSXQuaGFzTmV4dCgpKSB7Ci0gIAkgIAkJCU9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIG9wZXJhdGlvbkl0Lm5leHQoKTsKLQotICAJICAJCQlpZiAob3AuZ2V0RUlucHV0KCkgIT0gbnVsbCkgewotICAJICAJCQkJcGFydEluZm8gPSBnZXRNZXNzYWdlUmVmUGFydEluZm8oKE1lc3NhZ2VSZWZlcmVuY2VJbXBsKSBvcC5nZXRFSW5wdXQoKSk7Ci0gIAkgIAkJCX0KLSAgCSAgCQotICAJICAJCQlpZiAocGFydEluZm8gPT0gbnVsbCAmJiBvcC5nZXRFT3V0cHV0KCkgIT0gbnVsbCkgewotICAJICAJCQkJcGFydEluZm8gPSBnZXRNZXNzYWdlUmVmUGFydEluZm8oKE1lc3NhZ2VSZWZlcmVuY2VJbXBsKSBvcC5nZXRFT3V0cHV0KCkpOwotICAJICAJCQl9Ci0gIAkgIAkKLSAgCSAgCQkJaWYgKG9wLmdldEVGYXVsdHMoKSAhPSBudWxsKSB7Ci0gIAkgIAkJCQlJdGVyYXRvciBmYXVsdEl0ID0gb3AuZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7Ci0gIAkgIAkJCQl3aGlsZSAocGFydEluZm8gPT0gbnVsbCAmJiBmYXVsdEl0Lmhhc05leHQoKSkgewotICAJICAJCQkJCUZhdWx0IGZhdWx0ID0gKEZhdWx0KSBmYXVsdEl0Lm5leHQoKTsKLSAgCSAgCQkJCQlwYXJ0SW5mbyA9IGdldE1lc3NhZ2VSZWZQYXJ0SW5mbygoTWVzc2FnZVJlZmVyZW5jZUltcGwpIGZhdWx0KTsKLSAgCSAgCQkJCX0KLSAgCSAgCQkJfQotICAJICAJICAJICAJCi0gIAkgIAkJCWlmIChwYXJ0SW5mbyAhPSBudWxsKQotICAJICAJCQkJYnJlYWs7Ci0gIAkgIAkJfQotICAJICAJfQotCi0gIAkgIAlyZXR1cm4gcGFydEluZm87Ci0gIAkgIH0KLSAgCSAgCi0gIAkgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVmUGFydEluZm8oTWVzc2FnZVJlZmVyZW5jZUltcGwgaW9mKSB7Ci0gIAkgIAlTdHJpbmcgcGFydEluZm8gPSBudWxsOwotICAJICAJCi0gIAkgIAlpZiAoaW9mLmdldEVNZXNzYWdlKCkgIT0gbnVsbCAmJiBpb2YuZ2V0RU1lc3NhZ2UoKS5nZXRFUGFydHMoKSAhPSBudWxsKSB7Ci0gIAkgIAkJSXRlcmF0b3IgcGFydEl0ID0gaW9mLmdldEVNZXNzYWdlKCkuZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgCSAgCQotICAJICAJCXdoaWxlIChwYXJ0SW5mbyA9PSBudWxsICYmIHBhcnRJdC5oYXNOZXh0KCkpIHsKLSAgCSAgCQkJUGFydCBwYXJ0ID0gKFBhcnQpIHBhcnRJdC5uZXh0KCk7Ci0gIAkgIAkJCi0gIAkgIAkJCWlmIChwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotICAJICAJCQkJcGFydEluZm8gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5QQVJUX0lORk9fVFlQRV9ERUZJTklUSU9OOwotICAJICAJCQl9Ci0gIAkgIAkJCWVsc2UgaWYgKHBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkgIT0gbnVsbCkgewotICAJICAJCQkJcGFydEluZm8gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5QQVJUX0lORk9fRUxFTUVOVF9ERUNMQVJBVElPTjsKLSAgCSAgCQkJfQotICAJICAJCX0KLSAgCSAgCX0KLSAgCSAgCQotICAJICAJcmV0dXJuIHBhcnRJbmZvOwotICAJICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL05hbWVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL05hbWVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzhjOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9OYW1lVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgTmFtZVV0aWwKLXsKLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIGZhdWx0IGluIHRoZSBvcGVyYXRpb24uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZUZhdWx0TmFtZShPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gIAlyZXR1cm4gYnVpbGRVbmlxdWVGYXVsdE5hbWUob3BlcmF0aW9uLCAiTmV3RmF1bHQiKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVGYXVsdE5hbWUoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIGJhc2VOYW1lKSB7Ci0gIAlpZiAoYmFzZU5hbWUgPT0gbnVsbCkKLSAgCQliYXNlTmFtZSA9ICJOZXdGYXVsdCI7Ci0gIAkKLSAgCUxpc3QgbmFtZXMgPSBnZXRVc2VkRmF1bHROYW1lcyhvcGVyYXRpb24pOwotCi0gICAgLy8gTm93IHNlYXJjaCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIGFuIHVudXNlZCBuYW1lCi0gICAgcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoYmFzZU5hbWUsIG5hbWVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBpbnB1dCBpbiB0aGUgcG9ydFR5cGUuICBSZXR1cm5lZCBuYW1lIHdpbGwgYmUgb2YgdGhlIGZvcm06Ci0gICAqIDxvcGVyYXRpb25OYW1lPiArIDxlbmRpbmc+IFsrIHVuaXF1ZSBJbnRlZ2VyXQotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVJbnB1dE5hbWUoUG9ydFR5cGUgcG9ydFR5cGUsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBTdHJpbmcgZW5kaW5nKQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgIFN0cmluZyBjYW5kaWRhdGUgPSBvcGVyYXRpb25OYW1lICsgZW5kaW5nOwotCi0gICAgaW50IGkgPSAwOwotCi0gICAgLy8gbG9vcCB1bnRpbCB3ZSBmaW5kIGEgdW5pcXVlIG5hbWUgKHRoZSBuYW1lIHdpbGwgY29uc2lzdCBvZiB0aGUgb3BlcmF0aW9uTmFtZSArIGVuZGluZyArIGFuIGludGVnZXIpCi0gICAgd2hpbGUgKG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBib29sZWFuIHVuaXF1ZSA9IHRydWU7Ci0KLSAgICAgIC8vIGRldGVybWluZSBpZiB0aGlzIGNvbWJpbmF0aW9uIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGN1cnJlbnQgcG9ydHR5cGUKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKSAmJiB1bmlxdWU7KQotICAgICAgewotICAgICAgICBPcGVyYXRpb24gY3VycmVudCA9IChPcGVyYXRpb24pIGl0Lm5leHQoKTsKLSAgICAgICAgLy8gVE9ETyA6IHBvcnQgY2hlY2sKLSAgICAgICAgLy8gb2xkICBpZihjdXJyZW50LmlzU2V0RUlucHV0KCkgJiYgY3VycmVudC5nZXRFSW5wdXQoKS5pc1NldE5hbWUoKSkgewotICAgICAgICBpZiAoY3VycmVudC5nZXRFSW5wdXQoKSAhPSBudWxsICYmIGN1cnJlbnQuZ2V0RUlucHV0KCkuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY3VycmVudC5nZXRFSW5wdXQoKS5nZXROYW1lKCkuZXF1YWxzKGNhbmRpZGF0ZSkpCi0gICAgICAgICAgICB1bmlxdWUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHVuaXF1ZSkKLSAgICAgICAgbmFtZSA9IGNhbmRpZGF0ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgY2FuZGlkYXRlID0gb3BlcmF0aW9uTmFtZSArIGVuZGluZyArIGk7Ci0gICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIG1lc3NhZ2UgaW4gdGhlIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGJhc2VOYW1lKQotICB7Ci0gICAgaWYgKGJhc2VOYW1lID09IG51bGwpCi0gICAgewotICAgICAgYmFzZU5hbWUgPSAiTmV3TWVzc2FnZSI7Ci0gICAgfQotCi0gICAgTGlzdCBuYW1lcyA9IGdldFVzZWRNZXNzYWdlTmFtZXMoZGVmaW5pdGlvbik7Ci0KLSAgICAvLyBOb3cgc2VhcmNoIHRoZSBsaXN0IHVudGlsIHdlIGZpbmQgYW4gdW51c2VkIG5hbWUKLSAgICByZXR1cm4gZ2V0VW5pcXVlTmFtZUhlbHBlcihiYXNlTmFtZSwgbmFtZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIG9wZXJhdGlvbiBpbiB0aGUgcG9ydCB0eXBlLgotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVPcGVyYXRpb25OYW1lKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gIAlyZXR1cm4gYnVpbGRVbmlxdWVPcGVyYXRpb25OYW1lKHBvcnRUeXBlLCAiTmV3T3BlcmF0aW9uIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlT3BlcmF0aW9uTmFtZShQb3J0VHlwZSBwb3J0VHlwZSwgU3RyaW5nIGJhc2VOYW1lKQotICB7Ci0gIAlpZiAoYmFzZU5hbWUgPT0gbnVsbCkgewotICAJCWJhc2VOYW1lID0gIk5ld09wZXJhdGlvbiI7Ci0gIAl9Ci0KLSAgCUxpc3QgbmFtZXMgPSBnZXRVc2VkT3BlcmF0aW9uTmFtZXMocG9ydFR5cGUpOwotCi0gICAgLy8gTm93IHNlYXJjaCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIGFuIHVudXNlZCBuYW1lCi0gICAgcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoYmFzZU5hbWUsIG5hbWVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBvdXRwdXQgaW4gdGhlIHBvcnRUeXBlLiAgUmV0dXJuZWQgbmFtZSB3aWxsIGJlIG9mIHRoZSBmb3JtOgotICAgKiA8b3BlcmF0aW9uTmFtZT4gKyA8ZW5kaW5nPiBbKyB1bmlxdWUgSW50ZWdlcl0KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlT3V0cHV0TmFtZShQb3J0VHlwZSBwb3J0VHlwZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIFN0cmluZyBlbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgU3RyaW5nIGNhbmRpZGF0ZSA9IG9wZXJhdGlvbk5hbWUgKyBlbmRpbmc7Ci0KLSAgICBpbnQgaSA9IDA7Ci0KLSAgICAvLyBsb29wIHVudGlsIHdlIGZpbmQgYSB1bmlxdWUgbmFtZSAodGhlIG5hbWUgd2lsbCBjb25zaXN0IG9mIHRoZSBvcGVyYXRpb25OYW1lICsgZW5kaW5nICsgYW4gaW50ZWdlcikKLSAgICB3aGlsZSAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdW5pcXVlID0gdHJ1ZTsKLQotICAgICAgLy8gZGV0ZXJtaW5lIGlmIHRoaXMgY29tYmluYXRpb24gaXMgdW5pcXVlIHdpdGhpbiB0aGUgY3VycmVudCBwb3J0dHlwZQkJCQotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpICYmIHVuaXF1ZTspCi0gICAgICB7Ci0gICAgICAgIE9wZXJhdGlvbiBjdXJyZW50ID0gKE9wZXJhdGlvbikgaXQubmV4dCgpOwotICAgICAgICAvLyBUT0RPOiBwb3J0IGNoZWNrCi0gICAgICAgIC8vIG9sZAkJCQlpZihjdXJyZW50LmlzU2V0RU91dHB1dCgpICYmIGN1cnJlbnQuZ2V0RU91dHB1dCgpLmlzU2V0TmFtZSgpKSB7Ci0gICAgICAgIGlmIChjdXJyZW50LmdldEVPdXRwdXQoKSAhPSBudWxsICYmIGN1cnJlbnQuZ2V0RU91dHB1dCgpLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGN1cnJlbnQuZ2V0RU91dHB1dCgpLmdldE5hbWUoKS5lcXVhbHMoY2FuZGlkYXRlKSkKLSAgICAgICAgICAgIHVuaXF1ZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAodW5pcXVlKQotICAgICAgICBuYW1lID0gY2FuZGlkYXRlOwotICAgICAgZWxzZQotICAgICAgICBjYW5kaWRhdGUgPSBvcGVyYXRpb25OYW1lICsgZW5kaW5nICsgaTsKLSAgICAgIGkrKzsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgbmFtZSB3aGljaCBpcyBub3QgdXNlZCBieSBhbnkgb3RoZXIgcGFydCBpbiB0aGUgbWVzc2FnZS4KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlUGFydE5hbWUoTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gIAlMaXN0IG5hbWVzID0gZ2V0VXNlZFBhcnROYW1lcyhtZXNzYWdlKTsKLQotICAgIC8vIE5vdyBzZWFyY2ggdGhlIGxpc3QgdW50aWwgd2UgZmluZCBhbiB1bnVzZWQgbmFtZQotICAgIHJldHVybiBnZXRVbmlxdWVOYW1lSGVscGVyKCJOZXdQYXJ0IiwgbmFtZXMpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZVBhcnROYW1lKE1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIGJhc2VOYW1lKQotICB7Ci0gIAlpZiAoYmFzZU5hbWUgPT0gbnVsbCkKLSAgCXsKLSAgCQliYXNlTmFtZSA9ICJOZXdQYXJ0IjsKLSAgCX0KLSAgCQotICAJTGlzdCBuYW1lcyA9IGdldFVzZWRQYXJ0TmFtZXMobWVzc2FnZSk7Ci0KLSAgICAvLyBOb3cgc2VhcmNoIHRoZSBsaXN0IHVudGlsIHdlIGZpbmQgYW4gdW51c2VkIG5hbWUKLSAgICByZXR1cm4gZ2V0VW5pcXVlTmFtZUhlbHBlcihiYXNlTmFtZSwgbmFtZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIHBvcnQgdHlwZSBpbiB0aGUgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlUG9ydFR5cGVOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGJhc2VOYW1lKQotICB7Ci0gICAgaWYgKGJhc2VOYW1lID09IG51bGwpCi0gICAgewotICAgICAgYmFzZU5hbWUgPSAiTmV3UG9ydFR5cGUiOwotICAgIH0KLQotICAgIExpc3QgbmFtZXMgPSBnZXRVc2VkUG9ydFR5cGVOYW1lcyhkZWZpbml0aW9uKTsKLQotICAgIC8vIE5vdyBzZWFyY2ggdGhlIGxpc3QgdW50aWwgd2UgZmluZCBhbiB1bnVzZWQgbmFtZQotICAgIHJldHVybiBnZXRVbmlxdWVOYW1lSGVscGVyKGJhc2VOYW1lLCBuYW1lcyk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVOYW1lSGVscGVyKFN0cmluZyBiYXNlTmFtZSwgTGlzdCBuYW1lcykKLSAgewotICAgIGludCBpID0gMDsKLQotICAgIFN0cmluZyBuYW1lID0gYmFzZU5hbWU7Ci0gICAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgaWYgKCFuYW1lcy5jb250YWlucyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpKys7Ci0gICAgICBuYW1lID0gYmFzZU5hbWUgKyBpOwotICAgIH0KLQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIHNlcnZpY2UgaW4gdGhlIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZVNlcnZpY2VOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAJTGlzdCBuYW1lcyA9IGdldFVzZWRTZXJ2aWNlTmFtZXMoZGVmaW5pdGlvbik7Ci0KLSAgICAvLyBOb3cgc2VhcmNoIHRoZSBsaXN0IHVudGlsIHdlIGZpbmQgYW4gdW51c2VkIG5hbWUKLSAgICByZXR1cm4gZ2V0VW5pcXVlTmFtZUhlbHBlcigiTmV3U2VydmljZSIsIG5hbWVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBiaW5kaW5nIGluIHRoZSBkZWZpbml0aW9uLgotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVCaW5kaW5nTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBiYXNlTmFtZSkKLSAgewotICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGJhc2VOYW1lID0gIk5ld0JpbmRpbmciOwotICAgIH0KLQotICAgIExpc3QgbmFtZXMgPSBnZXRVc2VkQmluZGluZ05hbWVzKGRlZmluaXRpb24pOwotCi0gICAgcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoYmFzZU5hbWUsIG5hbWVzKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlUHJlZml4KERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGJhc2VQcmVmaXgpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gYmFzZVByZWZpeDsKLSAgICBmb3IgKGludCBpID0gMTsgZGVmaW5pdGlvbi5nZXROYW1lc3BhY2UocHJlZml4KSAhPSBudWxsOyBpKyspCi0gICAgewotICAgICAgcHJlZml4ID0gYmFzZVByZWZpeCArIGk7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZVBvcnROYW1lKFNlcnZpY2Ugc2VydmljZSwgU3RyaW5nIGJhc2VOYW1lKQotICB7Ci0gICAgaWYgKGJhc2VOYW1lID09IG51bGwpCi0gICAgewotICAgICAgYmFzZU5hbWUgPSAiTmV3UG9ydCI7Ci0gICAgfQotICAKLSAgICBMaXN0IG5hbWVzID0gZ2V0VXNlZFBvcnROYW1lcyhzZXJ2aWNlKTsKLSAgICAKLQlyZXR1cm4gZ2V0VW5pcXVlTmFtZUhlbHBlcihiYXNlTmFtZSwgbmFtZXMpOwotICB9Ci0JCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBNZXNzYWdlUmVmZXJlbmNlIG1lc3NSZWYpCi0gIHsgICAKLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgaWYgKG1lc3NSZWYgaW5zdGFuY2VvZiBJbnB1dCkKLSAgICB7Ci0gICAgICBuYW1lID0gY3JlYXRlT3BlcmF0aW9uTmFtZShtZXNzUmVmLCAiUmVxdWVzdCIpOyAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAobWVzc1JlZiBpbnN0YW5jZW9mIE91dHB1dCkKLSAgICB7Ci0gICAgICBuYW1lID0gY3JlYXRlT3BlcmF0aW9uTmFtZShtZXNzUmVmLCAiUmVzcG9uc2UiKTsgCi0gICAgfQotICAgIGVsc2UgaWYgKG1lc3NSZWYgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZyBmYXVsdE5hbWUgPSAoKEZhdWx0KSBtZXNzUmVmKS5nZXROYW1lKCk7Ci0gICAgICBpZiAoZmF1bHROYW1lID09IG51bGwgfHwgZmF1bHROYW1lLmxlbmd0aCgpID09IDApCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGZhdWx0TmFtZSA9ICJGYXVsdCI7Ci0gICAgICB9Ci0gICAgICBuYW1lID0gY3JlYXRlT3BlcmF0aW9uTmFtZShtZXNzUmVmLCBmYXVsdE5hbWUpOyAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICByZXR1cm4gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShkZWZpbml0aW9uLCBuYW1lKTsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkRmF1bHROYW1lcyhPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBpLm5leHQoKTsKLSAgICAgIG5hbWVzLmFkZChmYXVsdC5nZXROYW1lKCkpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0VXNlZE9wZXJhdGlvbk5hbWVzKFBvcnRUeXBlIHBvcnRUeXBlKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgbmFtZXMuYWRkKG9wLmdldE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuYW1lczsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRQYXJ0TmFtZXMoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG1lc3NhZ2UuZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBpLm5leHQoKTsKLSAgICAgIG5hbWVzLmFkZChwYXJ0LmdldE5hbWUoKSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkUG9ydFR5cGVOYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLSAgICBBcnJheUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBpLm5leHQoKTsKLSAgICAgIC8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICAgIC8vCQkJaWYgKHBvcnRUeXBlLmlzU2V0UU5hbWUoKSkKLSAgICAgIGlmIChwb3J0VHlwZS5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVzLmFkZChwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5hbWVzOwotICAgIAotICB9Ci0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkU2VydmljZU5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgIC8vIEZpcnN0IGJ1aWxkIGEgbGlzdCBvZiBuYW1lcyBhbHJlYWR5IHVzZWQKLSAgICBBcnJheUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFU2VydmljZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGkubmV4dCgpOwotICAgICAgLy8gVE9ETzogcG9ydCBjaGVjawotICAgICAgLy8gCQlpZihzZXJ2aWNlLmlzU2V0UU5hbWUoKSkKLSAgICAgIGlmIChzZXJ2aWNlLmdldFFOYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgbmFtZXMuYWRkKHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuYW1lczsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRNZXNzYWdlTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RU1lc3NhZ2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE1lc3NhZ2UgbXNnID0gKE1lc3NhZ2UpIGkubmV4dCgpOwotICAgICAgLy8gVE9ETzogcG9ydCBjaGVjawotICAgICAgaWYgKG1zZy5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgICAgIC8vCQkJaWYobXNnLmlzU2V0UU5hbWUoKSkKLSAgICAgICAgbmFtZXMuYWRkKG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5hbWVzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRCaW5kaW5nTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBpLm5leHQoKTsKLSAgICAgIC8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICAgIC8vCQkJaWYgKGJpbmRpbmcuaXNTZXRRTmFtZSgpKQotICAgICAgaWYgKGJpbmRpbmcuZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lcy5hZGQoYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5hbWVzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRQb3J0TmFtZXMoU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgLy8gRmlyc3QgYnVpbGQgYSBsaXN0IG9mIG5hbWVzIGFscmVhZHkgdXNlZAotICAgIEFycmF5TGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgaS5uZXh0KCk7Ci0KLSAgICAgIGlmIChwb3J0LmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lcy5hZGQocG9ydC5nZXROYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVPcGVyYXRpb25OYW1lKE9iamVjdCBvYmplY3QsIFN0cmluZyBzdWZmaXgpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICB7Ci0gICAgICBFT2JqZWN0IHBhcmVudCA9ICgoRU9iamVjdClvYmplY3QpLmVDb250YWluZXIoKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICgoT3BlcmF0aW9uKXBhcmVudCkuZ2V0TmFtZSgpOwotICAgICAgfQotICAgIH0gCi0gICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCArPSBzdWZmaXg7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvTm9kZUFzc29jaWF0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9Ob2RlQXNzb2NpYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNWU5NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9Ob2RlQXNzb2NpYXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgTm9kZUFzc29jaWF0aW9uTWFuYWdlcgoteyAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3JFeHRlbnNpb25bXSBleHRlbnNpb25zOwotICBwcm90ZWN0ZWQgSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyW10gcHJvdmlkZXJzOwotCi0gIHB1YmxpYyBOb2RlQXNzb2NpYXRpb25NYW5hZ2VyKCkKLSAgeyAgICAgICAgICAgICAKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uTk9ERV9BU1NPQ0lBVElPTl9QUk9WSURFUik7IAotICAgIHByb3ZpZGVycyA9IG5ldyBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXJbZXh0ZW5zaW9ucy5sZW5ndGhdOyAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcHJvdmlkZXJzW2ldID0gKElOb2RlQXNzb2NpYXRpb25Qcm92aWRlcilleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLk5PREVfQVNTT0NJQVRJT05fUFJPVklERVIsIG51bGwpOwotICAgIH0KLSAgfSAgICAgICAgCi0KLSAgcHJvdGVjdGVkIElOb2RlQXNzb2NpYXRpb25Qcm92aWRlciBnZXRBcHBpY2FibGVQcm92aWRlcihPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbaV0uaXNBcHBsaWNhYmxlKG9iamVjdCkpCi0gICAgICB7Ci0gICAgICAgIHByb3ZpZGVyID0gcHJvdmlkZXJzW2ldOwotICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm92aWRlcjsKLSAgfQotICAgICAgICAKLQotICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0Rm9yTm9kZShPYmplY3Qgcm9vdE9iamVjdCwgRWxlbWVudCB0YXJnZXROb2RlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnQgY3VycmVudEluZGV4ID0gMDsKLQotICAgIEVsZW1lbnRbXSBlbGVtZW50Q2hhaW4gPSBnZXRQYXJlbnRFbGVtZW50Q2hhaW4oKEVsZW1lbnQpdGFyZ2V0Tm9kZSk7Ci0KLSAgICBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIgcCA9IGdldEFwcGljYWJsZVByb3ZpZGVyKHJvb3RPYmplY3QpOwotICAgIGlmIChwICE9IG51bGwpCi0gICAgewotICAgICAgTm9kZSByb290T2JqZWN0Tm9kZSA9IHAuZ2V0Tm9kZShyb290T2JqZWN0KTsKLQotICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCA8IGVsZW1lbnRDaGFpbi5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZSA9IGVsZW1lbnRDaGFpbltjdXJyZW50SW5kZXhdOwotICAgICAgICBpZiAoZSA9PSByb290T2JqZWN0Tm9kZSkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICBjdXJyZW50SW5kZXgrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjdXJyZW50SW5kZXgrKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgICAgICAgICAgCi0gICAgT2JqZWN0IGN1cnJlbnRPYmplY3QgPSByb290T2JqZWN0OyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGludCBlbmRbXSA9IG5ldyBpbnRbMV07Ci0KLSAgICB3aGlsZSAoY3VycmVudEluZGV4IDwgZWxlbWVudENoYWluLmxlbmd0aCkKLSAgICB7ICAgICAgICAgICAgICAgCi0gICAgICBwID0gZ2V0QXBwaWNhYmxlUHJvdmlkZXIoY3VycmVudE9iamVjdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAocCAhPSBudWxsKQotICAgICAgewotICAgICAgICBlbmRbMF0gPSBlbGVtZW50Q2hhaW4ubGVuZ3RoOwotICAgICAgICBjdXJyZW50T2JqZWN0ID0gcC5nZXRNb2RlbE9iamVjdChjdXJyZW50T2JqZWN0LCBlbGVtZW50Q2hhaW4sIGN1cnJlbnRJbmRleCwgZW5kKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjdXJyZW50T2JqZWN0ID09IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgLy8gZmFpbHVyZQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGN1cnJlbnRJbmRleCA9IE1hdGgubWF4KGVuZFswXSwgY3VycmVudEluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgICAgCi0gICAgICAgIGJyZWFrOwotICAgICAgfSAKLSAgICB9ICAgICAKLQotICAgIHJldHVybiAoY3VycmVudEluZGV4ID09IGVsZW1lbnRDaGFpbi5sZW5ndGgpID8gY3VycmVudE9iamVjdCA6IG51bGw7Ci0gIH0gIAotICAgICAgICAgICAKLQotICBwdWJsaWMgTm9kZSBnZXROb2RlKE9iamVjdCBtb2RlbE9iamVjdCkKLSAgeyAgICAgICAgICAKLSAgICBOb2RlIHJlc3VsdCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChOb2RlKW1vZGVsT2JqZWN0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyIHAgPSBnZXRBcHBpY2FibGVQcm92aWRlcihtb2RlbE9iamVjdCk7ICAgICAgICAgICAgICAgCi0gICAgICBpZiAocCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBwLmdldE5vZGUobW9kZWxPYmplY3QpOwotICAgICAgfQotICAgIH0gICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgCi0KLSAgcHJvdGVjdGVkIEVsZW1lbnRbXSBnZXRQYXJlbnRFbGVtZW50Q2hhaW4oRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHdoaWxlIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQoMCwgZWxlbWVudCk7Ci0gICAgICBOb2RlIG5vZGUgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgIGVsZW1lbnQgPSAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgPyAoRWxlbWVudClub2RlIDogbnVsbDsgICAgCi0gICAgfSAgICAgICAgICAgICAgICAKLQotICAgIGludCBsaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgIEVsZW1lbnRbXSByZXN1bHQgPSBuZXcgRWxlbWVudFtsaXN0U2l6ZV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHJlc3VsdFtpXSA9IChFbGVtZW50KWxpc3QuZ2V0KGkpOwotICAgIH0gICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL09wZW5PblNlbGVjdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzA2MmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOYXZpZ2F0aW9uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuSW1wb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExTd2l0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIE9wZW5PblNlbGVjdGlvbkhlbHBlciBleHRlbmRzIFdTRExTd2l0Y2gKLXsKLSAgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBBdHRyIGF0dHIgPSBudWxsOwotICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0gIHB1YmxpYyBPcGVuT25TZWxlY3Rpb25IZWxwZXIoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG9wZW5FZGl0b3IoRU9iamVjdCBlT2JqZWN0KQotICB7Ci0gICAgU3RyaW5nW10gYXJyYXkgPSBjb21wdXRlU3BlY2lmaWNhdGlvbihlT2JqZWN0KTsKLSAgICBpZiAoYXJyYXkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcGVuRWRpdG9yKGFycmF5WzBdLCBhcnJheVsxXSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgb3BlbkVkaXRvcihOb2RlIG5vZGUpCi0gIHsKLSAgICBTdHJpbmdbXSBhcnJheSA9IGNvbXB1dGVTcGVjaWZpY2F0aW9uKG5vZGUpOwotICAgIGlmIChhcnJheSAhPSBudWxsKQotICAgIHsKLSAgICAgIG9wZW5FZGl0b3IoYXJyYXlbMF0sIGFycmF5WzFdKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBvcGVuRWRpdG9yKFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIHNwZWMpCi0gIHsKLSAgICBTdHJpbmcgcGF0dGVybiA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiOwotICAgIGlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLnN0YXJ0c1dpdGgocGF0dGVybikpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKHJlc291cmNlLnN1YnN0cmluZyhwYXR0ZXJuLmxlbmd0aCgpKSk7Ci0gICAgICAgIElGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0KLSAgICAgICAgSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQgJiYKLSAgICAgICAgICAgKChJRmlsZUVkaXRvcklucHV0KWVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpLmVxdWFscyhmaWxlKSkKLSAgICAgICAgeyAgCi0JCQkgICAgSU5hdmlnYXRpb25Mb2NhdGlvbiBjdXJyZW50ID0gd29ya2JlbmNoUGFnZS5nZXROYXZpZ2F0aW9uSGlzdG9yeSgpLmdldEN1cnJlbnRMb2NhdGlvbigpOwotICAgICAgICAJd29ya2JlbmNoUGFnZS5nZXROYXZpZ2F0aW9uSGlzdG9yeSgpLm1hcmtMb2NhdGlvbihlZGl0b3JQYXJ0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UuZW5kc1dpdGgoInhzZCIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoUGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSksIFdTRExFZGl0b3JQbHVnaW4uWFNEX0VESVRPUl9JRCk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgd3NkbGVkaXRvcgotCQkJICAgICAgICBlZGl0b3JQYXJ0ID0gIHdvcmtiZW5jaFBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBlZGl0b3JQYXJ0LmdldEVkaXRvclNpdGUoKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBpbml0RXgpCi0gCQkJCQl7Ci0gCQkJCQl9Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IGVkaXRvclBhcnQuZ2V0Q2xhc3MoKTsKLSAgICAgICAgQ2xhc3NbXSBtZXRob2RBcmdzID0geyBTdHJpbmcuY2xhc3MgfTsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHRoZUNsYXNzLmdldE1ldGhvZCgib3Blbk9uU2VsZWN0aW9uIiwgbWV0aG9kQXJncyk7Ci0gICAgICAgIE9iamVjdCBhcmdzW10gPSB7IHNwZWMgfTsKLSAgICAgICAgbWV0aG9kLmludm9rZShlZGl0b3JQYXJ0LCBhcmdzKTsKLSAgICAgICAgd29ya2JlbmNoUGFnZS5nZXROYXZpZ2F0aW9uSGlzdG9yeSgpLm1hcmtMb2NhdGlvbihlZGl0b3JQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gY29tcHV0ZVNwZWNpZmljYXRpb24oRU9iamVjdCBlT2JqZWN0KQotICB7Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbnVsbDsKLSAgICBPYmplY3QgcmVmZXJlbmNlZE9iamVjdCA9IGRvU3dpdGNoKGVPYmplY3QpOwotICAgIGlmIChyZWZlcmVuY2VkT2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICB7Ci0gICAgICBFT2JqZWN0IHJlZmVyZW5jZWRFT2JqZWN0ID0gKEVPYmplY3QpcmVmZXJlbmNlZE9iamVjdDsKLSAgICAgIGlmIChyZWZlcmVuY2VkRU9iamVjdCAhPSBlT2JqZWN0IHx8IAotICAgICAgICAgcmVmZXJlbmNlZEVPYmplY3QuZVJlc291cmNlKCkgIT0gZGVmaW5pdGlvbi5lUmVzb3VyY2UoKSkKLSAgICAgIHsgICAgICAgIAotICAgICAgCi0gICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IHJlZmVyZW5jZWRFT2JqZWN0LmVSZXNvdXJjZSgpOwotICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICAgIHJlc3VsdFswXSA9IHJlc291cmNlLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIHJlc3VsdFsxXSA9IHJlc291cmNlLmdldFVSSUZyYWdtZW50KHJlZmVyZW5jZWRFT2JqZWN0KTsKLSAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBjb21wdXRlU3BlY2lmaWNhdGlvbihOb2RlIG5vZGUpCi0gIHsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBudWxsOwotICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KW5vZGU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBhdHRyID0gKEF0dHIpbm9kZTsKLSAgICAgICAgICBlbGVtZW50ID0gYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgIGVsZW1lbnQgPSAocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkgPyAoRWxlbWVudClwYXJlbnQgOiBudWxsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudChkZWZpbml0aW9uLCBlbGVtZW50KTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgICAgewotICAgICAgICByZXN1bHQgPSBjb21wdXRlU3BlY2lmaWNhdGlvbigoRU9iamVjdClvYmplY3QpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gYmluZGluZzsKLSAgICBpZiAoaXNNYXRjaGluZ0F0dHJpYnV0ZShXU0RMQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBiaW5kaW5nLmdldEVQb3J0VHlwZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlRGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgY2FzZVBhcnQoUGFydCBwYXJ0KQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IHBhcnQ7Ci0gICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoaXNNYXRjaGluZ0F0dHJpYnV0ZShXU0RMQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcGFydC5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaXNNYXRjaGluZ0F0dHJpYnV0ZShXU0RMQ29uc3RhbnRzLkVMRU1FTlRfQVRUUklCVVRFKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcGFydC5nZXRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpID09IGRlZmluaXRpb24pCi0gICAgewotICAgICAgcmVzdWx0ID0gcGFydC5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwgPyAoT2JqZWN0KXBhcnQuZ2V0VHlwZURlZmluaXRpb24oKSA6IChPYmplY3QpcGFydC5nZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBwb3J0OwotICAgIGlmIChpc01hdGNoaW5nQXR0cmlidXRlKFdTRExDb25zdGFudHMuQklORElOR19BVFRSSUJVVEUpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHBvcnQuZ2V0RUJpbmRpbmcoKTsKLQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlRmF1bHQoRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gZmF1bHQ7Ci0gICAgaWYgKGlzTWF0Y2hpbmdBdHRyaWJ1dGUoV1NETENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gZmF1bHQuZ2V0TWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gaW5wdXQ7Ci0gICAgaWYgKGlzTWF0Y2hpbmdBdHRyaWJ1dGUoV1NETENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gaW5wdXQuZ2V0TWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlT3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gb3V0cHV0OwotCi0gICAgaWYgKGlzTWF0Y2hpbmdBdHRyaWJ1dGUoV1NETENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gb3V0cHV0LmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgY2FzZUltcG9ydChJbXBvcnQgdGhlSW1wb3J0KQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IHRoZUltcG9ydC5nZXRFRGVmaW5pdGlvbigpOwotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyBOZWVkIHRvIHJlc29sdmUgaW1wb3J0cyBiZWNhdXNlIHRoZSBtb2RlbCBkb2Vzbid0IGF1dG9tYXRpY2FsbHkKLSAgICAgICAgLy8gZG8gaXQgZm9yIHVzCi0gICAgICAgICgoSW1wb3J0SW1wbCl0aGVJbXBvcnQpLmltcG9ydERlZmluaXRpb25PclNjaGVtYSgpOwotICAgICAgICByZXN1bHQgPSB0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gd3NkbEVsZW1lbnQ7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaXNNYXRjaGluZ0F0dHJpYnV0ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gYXR0ciAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhhdHRyLmdldE5hbWUoKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9SZWZlcmVuY2VNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1JlZmVyZW5jZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2MDdlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1JlZmVyZW5jZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0gICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMU3dpdGNoOwotCi0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VNYW5hZ2VyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIEludGVybmFsQWRhcHRlckZhY3RvcnkgaW50ZXJuYWxBZGFwdGVyRmFjdG9yeSA9IG5ldyBJbnRlcm5hbEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIGludGVyZmFjZSBMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgYmluZGluZ3NDaGFuZ2VkKCBPcGVyYXRpb24gb3BlcmF0aW9uKTsKLSAgfSAgICAgCi0KLSAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIHZvaWQgYWRhcHREZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIGludGVybmFsQWRhcHRlckZhY3RvcnkuYWRhcHQoZGVmaW5pdGlvbik7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFQmluZGluZ3MoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKWkubmV4dCgpOwotICAgICAgaW50ZXJuYWxBZGFwdGVyRmFjdG9yeS5hZGFwdEJpbmRpbmcoYmluZGluZyk7Ci0gICAgfQotICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEJpbmRpbmdMaXN0ZW5lcihPcGVyYXRpb24gb3BlcmF0aW9uLCBMaXN0ZW5lciBsaXN0ZW5lcikKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgT3BlcmF0aW9uQWRhcHRlciBhZGFwdGVyID0gKE9wZXJhdGlvbkFkYXB0ZXIpaW50ZXJuYWxBZGFwdGVyRmFjdG9yeS5hZGFwdChvcGVyYXRpb24pOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7IAotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUJpbmRpbmdMaXN0ZW5lcihPcGVyYXRpb24gb3BlcmF0aW9uLCBMaXN0ZW5lciBsaXN0ZW5lcikKLSAgeyAKLSAgICBPcGVyYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoT3BlcmF0aW9uQWRhcHRlcilpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9wZXJhdGlvbik7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsgCi0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGZpcmVOb3RpZmljYXRpb25Gb3JQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIC8vIGdldCB0aGUgYWRhcHRlciBmb3IgZWFjaCBvcGVyYXRpb24gYW5kIG5vdGlmeSBsaXN0ZW5lcnMKLSAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7ICBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBmaXJlTm90aWZpY2F0aW9uRm9yT3BlcmF0aW9uKChPcGVyYXRpb24paS5uZXh0KCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGZpcmVOb3RpZmljYXRpb25Gb3JPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPcGVyYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoT3BlcmF0aW9uQWRhcHRlcilpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9wZXJhdGlvbik7Ci0gICAgICBhZGFwdGVyLmZpcmVCaW5kaW5nc0NoYW5nZWQoKTsKLSAgICB9Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW50ZXJuYWxBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgV1NETFN3aXRjaCB3c2RsU3dpdGNoID0gbmV3IFdTRExTd2l0Y2goKQotICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nQWRhcHRlcigpOwotCSAgICAgIH0KLQotIAkgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdGYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgfSAgIAotCi0JICAgICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ09wZXJhdGlvbkFkYXB0ZXIoKTsKLQkgICAgICB9IAotICAgCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlRGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkgICAgICB9ICAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZU9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZU9wZXJhdGlvbkFkYXB0ZXIoKTsKLQkgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgfTsgICAKLQotICAgICAgT2JqZWN0IG8gPSB3c2RsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0KLSAgICAgIEFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ICA9IChBZGFwdGVyKW87Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRpZCBub3QgY3JlYXRlIGFkYXB0ZXIgZm9yIHRhcmdldCA6ICIgKyB0YXJnZXQpOwotICAgICAgICBUaHJlYWQuZHVtcFN0YWNrKCk7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZUFkYXB0ZXIoIiArIHRhcmdldCArICIpICIgKyByZXN1bHQpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdBZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEJpbmRpbmdBZGFwdGVyKCk7Ci0gICAgfSAgICAgICAgCi0KLSAJICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nRmF1bHRBZGFwdGVyKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJldHVybiBuZXcgQmluZGluZ0ZhdWx0QWRhcHRlcigpOwotICAgIH0gICAgIAotCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ09wZXJhdGlvbkFkYXB0ZXIoKQotICAgIHsgICAgIAotICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpOwotICAgIH0gICAgICAKLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVmaW5pdGlvbkFkYXB0ZXIoKSAKLSAgICB7Ci0JCSAgcmV0dXJuIG5ldyBEZWZpbml0aW9uQWRhcHRlcigpOwotCSAgfSAKLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlT3BlcmF0aW9uQWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IE9wZXJhdGlvbkFkYXB0ZXIoKTsKLQkgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0KQotICAgIHsKLSAgICAgIHJldHVybiB0YXJnZXQgIT0gbnVsbCA/IGFkYXB0KHRhcmdldCwgaW50ZXJuYWxBZGFwdGVyRmFjdG9yeSkgOiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkYXB0QmluZGluZyhCaW5kaW5nIGJpbmRpbmcpICAgICAKLSAgICB7Ci0gICAgICBhZGFwdChiaW5kaW5nKTsgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKWkubmV4dCgpOwotICAgICAgICBhZGFwdChiaW5kaW5nT3BlcmF0aW9uKTsgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdGYXVsdHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpai5uZXh0KCk7Ci0gICAgICAgICAgYWRhcHQoYmluZGluZ0ZhdWx0KTsgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgCi0gIH0gIAotICAKLQotICBwcm90ZWN0ZWQgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJhc2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwKLSAgewotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gaW50ZXJuYWxBZGFwdGVyRmFjdG9yeTsKLSAgICB9ICAgCi0KLSAgICBwdWJsaWMgV1NETFBhY2thZ2UgZ2V0UGFja2FnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gIH0KLQotICAgIAotICAvLyBEZWZpbml0aW9uQWRhcHRlcgotICAvLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbilnZXRUYXJnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmICgoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkgPT0gZ2V0UGFja2FnZSgpLmdldERlZmluaXRpb25fRUJpbmRpbmdzKCkpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IG1zZy5nZXROZXdWYWx1ZSgpOwotICAgICAgICBzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERDoKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBoYW5kbGVBZGQoKEJpbmRpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbmV3VmFsdWVzID0gKChDb2xsZWN0aW9uKW5ld1ZhbHVlKS5pdGVyYXRvcigpOyAgbmV3VmFsdWVzLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBoYW5kbGVBZGQoKEJpbmRpbmcpbmV3VmFsdWVzLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgfSAgICAKLSAgICB9ICAgICAKLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZChCaW5kaW5nIGJpbmRpbmcpCi0gICAgeyAgCi0gICAgICBpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5LmFkYXB0QmluZGluZyhiaW5kaW5nKTsKLSAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gYmluZGluZy5nZXRFUG9ydFR5cGUoKTsKLSAgICAgIGlmIChwb3J0VHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmaXJlTm90aWZpY2F0aW9uRm9yUG9ydFR5cGUocG9ydFR5cGUpOwotICAgICAgfQotICAgIH0KLSAgfSAgICAgCi0gICAgICAgICAgCi0gIAotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJpbmRpbmdBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0gICAgeyAKLSAgICAgIGlmICgoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkgPT0gZ2V0UGFja2FnZSgpLmdldEJpbmRpbmdfRVBvcnRUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIGZpcmVOb3RpZmNhdGlvbiBmb3IgYWxsIG9mIHRoZSBvcGVyYXRpb24gb2YgdGhlIG9sZCBhbmQgbmV3IHBvcnRUeXBlCi0gICAgICAgIGZpcmVOb3RpZmljYXRpb25Gb3JQb3J0VHlwZSgoUG9ydFR5cGUpbXNnLmdldE5ld1ZhbHVlKCkpOwotICAgICAgICBmaXJlTm90aWZpY2F0aW9uRm9yUG9ydFR5cGUoKFBvcnRUeXBlKW1zZy5nZXRPbGRWYWx1ZSgpKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UgaWYgKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSA9PSBnZXRQYWNrYWdlKCkuZ2V0QmluZGluZ19FQmluZGluZ09wZXJhdGlvbnMoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gZmlyZU5vdGlmY2F0aW9uIGZvciBhbGwgb3BlcmF0aW9ucyB0aGF0IHdlcmUgYWRkZWQgb3IgcmVtb3ZlZAotICAgICAgICBPYmplY3QgbmV3VmFsdWUgPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLSAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0gICAgICAgIHN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREOgotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaGFuZGxlQWRkKChCaW5kaW5nT3BlcmF0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG5ld1ZhbHVlcyA9ICgoQ29sbGVjdGlvbiluZXdWYWx1ZSkuaXRlcmF0b3IoKTsgIG5ld1ZhbHVlcy5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaGFuZGxlQWRkKChCaW5kaW5nT3BlcmF0aW9uKW5ld1ZhbHVlcy5uZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSAgICAgICAKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBoYW5kbGVSZW1vdmUoKEJpbmRpbmdPcGVyYXRpb24pb2xkVmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3Igb2xkVmFsdWVzID0gKChDb2xsZWN0aW9uKW9sZFZhbHVlKS5pdGVyYXRvcigpOyAgb2xkVmFsdWVzLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBoYW5kbGVSZW1vdmUoKEJpbmRpbmdPcGVyYXRpb24pb2xkVmFsdWVzLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgIH0gICAgCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBZGQoQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICAgIHsKLSAgICAgIGludGVybmFsQWRhcHRlckZhY3RvcnkuYWRhcHQoYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZmlyZU5vdGlmaWNhdGlvbkZvck9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgIH0gICAgICAgICAgICAgICAKLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlbW92ZShCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gICAgeyAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBmaXJlTm90aWZpY2F0aW9uRm9yT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgICB9Ci0gICAgfSAgIAotICB9ICAgICAgIAotICAKLQotCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQmluZGluZ09wZXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlcgotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbilnZXRUYXJnZXQoKTsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBmaXJlTm90aWZpY2F0aW9uRm9yT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgfSAgICAgICAgICAgICAgICAKLSAgfQotICAKLQotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJpbmRpbmdGYXVsdEFkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlcgotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0ID0gKEJpbmRpbmdGYXVsdClnZXRUYXJnZXQoKTsKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKWJpbmRpbmdGYXVsdC5lQ29udGFpbmVyKCk7Ci0gICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZmlyZU5vdGlmaWNhdGlvbkZvck9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgIH0gICAgICAgICAgICAgICAgCi0gIH0gCi0gIAotCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgT3BlcmF0aW9uQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIAotICB7ICAgICAKLSAgICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICAgIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgIH0gICAKLQotICAgIHB1YmxpYyB2b2lkIGZpcmVCaW5kaW5nc0NoYW5nZWQoKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbilnZXRUYXJnZXQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIExpc3RlbmVyIGxpc3RlbmVyID0gKExpc3RlbmVyKWkubmV4dCgpOwotICAgICAgICBsaXN0ZW5lci5iaW5kaW5nc0NoYW5nZWQob3BlcmF0aW9uKTsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgCi0gIH0gICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjFmZGE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0vLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaGVscCBzeW5jcm9uaXplIHNlbGVjdGlvbnMgYmV0d2VlbiB0d28gbW9kZWxzLgotLy8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWxlY3Rpb25BZGFwdGVyIGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyCi17IAotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgZXZlbnRTb3VyY2U7Ci0KLSAgcHVibGljIHZvaWQgc2V0RXZlbnRTb3VyY2UoSVNlbGVjdGlvblByb3ZpZGVyIGV2ZW50U291cmNlKQotICB7Ci0gICAgdGhpcy5ldmVudFNvdXJjZSA9IGV2ZW50U291cmNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIAotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uOwotICB9ICAgIAotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBzcGVjaWFsaXplZCB0byByZXR1cm4gdGhlIGNvcnJlY3Qgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlICdvdGhlcicgbW9kZWwKLSAgICovCi0gIGFic3RyYWN0IHByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChPYmplY3Qgb2JqZWN0KTsKLQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBtb2RlbFNlbGVjdGlvbikgIAotICB7IAotICAgIExpc3Qgb3RoZXJNb2RlbE9iamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKG1vZGVsU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbiltb2RlbFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gaS5uZXh0KCk7IAotICAgICAgICBPYmplY3Qgb3RoZXJNb2RlbE9iamVjdCA9IGdldE9iamVjdEZvck90aGVyTW9kZWwobW9kZWxPYmplY3QpOyAgICAgICAKLSAgICAgICAgaWYgKG90aGVyTW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgeyAKLSAgICAgICAgICBvdGhlck1vZGVsT2JqZWN0TGlzdC5hZGQob3RoZXJNb2RlbE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgCi0gICAgU3RydWN0dXJlZFNlbGVjdGlvbiBub2RlU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob3RoZXJNb2RlbE9iamVjdExpc3QpOwotICAgIHNlbGVjdGlvbiA9IG5vZGVTZWxlY3Rpb247Ci0gICAgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChldmVudFNvdXJjZSAhPSBudWxsID8gZXZlbnRTb3VyY2UgOiB0aGlzLCBub2RlU2VsZWN0aW9uKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvVmFsaWRhdGVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvVmFsaWRhdGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4Yzc3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1ZhbGlkYXRlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVIZWxwZXIKLXsKLSAgLy8gWE1MIExhbmcgY2FuIGhhdmUgbWFueSBkaWZmZXJlbnQgdmFsaWQgZm9ybWF0cwotICAvLyAxKSB4eCAgICAgIGllLiBlbiwgZnIsIGRlCi0gIC8vIDIpIHh4LXh4ICAgaWUuIGVuLVVTLCBlbi1GUgotICAvLyAzKSBJLXh4ICAgIGllLiBJLWVuCi0gIC8vIDQpIFgteHggICAgaWUuIFgtZW4KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tYTUxMYW5nKFN0cmluZyBsYW5nKQotICB7Ci0gICAgaWYgKGxhbmcubGVuZ3RoKCkgPT0gMCkgCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBpZiAobGFuZy5sZW5ndGgoKSA9PSAxKSAKLSAgICB7Ci0gICAgICBjaGFyIGNoMCA9IGxhbmcuY2hhckF0KDApOwotICAgICAgaWYgKChjaDAgPj0gJ2EnICYmIGNoMCA8PSAneicpIHx8IChjaDAgPj0gJ0EnICYmIGNoMCA8PSAnWicpKQotICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX0xBTkdfVE9PX1NIT1JUIik7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fTkFNRV9JTlZBTElEX0NIQVIiKSArIGNoMCArIAotICAgICAgICBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX05BTUVfSU5WQUxJRF9DSEFSX0VORCIpOyAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgaW50IG9mZnNldDsKLQotICAgIGNoYXIgY2gwID0gbGFuZy5jaGFyQXQoMCk7Ci0gICAgaWYgKGxhbmcuY2hhckF0KDEpID09ICctJykgCi0gICAgewotICAgICAgaWYgKGNoMCA9PSAnaScgfHwgY2gwID09ICdJJyB8fCBjaDAgPT0gJ3gnIHx8IGNoMCA9PSAnWCcpIAotICAgICAgICBvZmZzZXQgPSAxOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9DSEFSIikgKyBjaDAgKyAKLSAgICAgICAgVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9OQU1FX0lOVkFMSURfQ0hBUl9FTkQiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgY2gxID0gbGFuZy5jaGFyQXQoMSk7Ci0gICAgICBpZiAoKGNoMCA+PSAnYScgJiYgY2gwIDw9ICd6JykgfHwgKGNoMCA+PSAnQScgJiYgY2gwIDw9ICdaJykpCi0gICAgICAgIGlmICgoY2gxID49ICdhJyAmJiBjaDEgPD0gJ3onKSB8fCAoY2gxID49ICdBJyAmJiBjaDEgPD0gJ1onKSkKLSAgICAgICAgICBvZmZzZXQgPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9OQU1FX0lOVkFMSURfQ0hBUiIpICsgY2gxICsgCi0gICAgICAgICAgVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9OQU1FX0lOVkFMSURfQ0hBUl9FTkQiKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9OQU1FX0lOVkFMSURfQ0hBUiIpICsgY2gwICsgCi0gICAgICAgIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfTkFNRV9JTlZBTElEX0NIQVJfRU5EIik7Ci0gICAgfQotCi0gICAgaWYgKGxhbmcubGVuZ3RoKCkgPiBvZmZzZXQpIAotICAgIHsKLSAgICAgIGNoYXIgY2ggPSBsYW5nLmNoYXJBdChvZmZzZXQrKyk7Ci0gICAgICBpZiAoY2ggIT0gJy0nKSAKLSAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9IWVBIRU5fTkVFREVEIikgKyBJbnRlZ2VyLnRvU3RyaW5nKG9mZnNldC0xKTsgICAgICAgIAotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNoID09ICctJykgCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxhbmcubGVuZ3RoKCkgPT0gb2Zmc2V0KSAKLSAgICAgICAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9IWVBIRU5fRU5ESU5HIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNoID0gbGFuZy5jaGFyQXQob2Zmc2V0KyspOwotICAgICAgICAgICAgaWYgKChjaCA8ICdhJyB8fCBjaCA+ICd6JykgJiYgKGNoIDwgJ0EnIHx8IGNoID4gJ1onKSkgCi0gICAgICAgICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fTkFNRV9JTlZBTElEX0NIQVIiKSArIGNoICsgCi0gICAgICAgICAgICAgIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfTkFNRV9JTlZBTElEX0NIQVJfRU5EIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsYW5nLmxlbmd0aCgpID09IG9mZnNldCkKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIGlmICgoY2ggPCAnYScgfHwgY2ggPiAneicpICYmIChjaCA8ICdBJyB8fCBjaCA+ICdaJykpIAotICAgICAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9OQU1FX0lOVkFMSURfQ0hBUiIpICsgY2ggKyAKLSAgICAgICAgICAgIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfTkFNRV9JTlZBTElEX0NIQVJfRU5EIik7ICAgICAgICAgICAgIAotICAgICAgICAgIGVsc2UgaWYgKGxhbmcubGVuZ3RoKCkgPT0gb2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgY2ggPSBsYW5nLmNoYXJBdChvZmZzZXQrKyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgbWluIHZhbHVlIGlzIGNvcnJlY3QuCi0gICAqIEEgbWluaW11bSB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgPCBtYXhWYWx1ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgaXNWYWxpZE1pblZhbHVlKFN0cmluZyBtaW5WYWx1ZSwgU3RyaW5nIG1heFZhbHVlKQotICB7Ci0gICAgaW50IG1pbjsKLQotICAgIGlmIChtaW5WYWx1ZSA9PSBudWxsIHx8IG1pblZhbHVlLmVxdWFscygiIikpCi0gICAgewotICAgICAgLy8gTm90aGluZyB0byBjaGVjawotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgbWluID0gSW50ZWdlci5wYXJzZUludChtaW5WYWx1ZSk7Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfRVJST1JfTUlOX05PVF9QT1NJVElWRSIpOwotICAgIH0KLQotICAgIGlmIChtaW4gPCAwKSAKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9FUlJPUl9NSU5fTk9UX1BPU0lUSVZFIik7Ci0gICAgfQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgaW50IG1heCA9IEludGVnZXIucGFyc2VJbnQobWF4VmFsdWUpOwotICAgICAgaWYgKG1pbiA+IG1heCkgCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX0VSUk9SX01JTl9WQUxVRSIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIC8vIE1heCBpcyBub3QgYWNjdXJhdGUuIERvbid0IGNvbXBhcmUgaXQuCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgbWF4IHZhbHVlIGlzIGNvcnJlY3QuCi0gICAqIEEgbWF4aW11bSB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgPiBtaW5WYWx1ZQotICAgKgotICAgKiBJdCBjYW4gYWxzbyBiZSBzZXQgdGhlIHN0cmluZyAidW5ib3VuZGVkIgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgaXNWYWxpZE1heFZhbHVlKFN0cmluZyBtYXhWYWx1ZSwgU3RyaW5nIG1pblZhbHVlKQotICB7Ci0gICAgaW50IG1heDsKLQotICAgIGlmIChtYXhWYWx1ZSA9PSBudWxsIHx8IG1heFZhbHVlLmVxdWFscygiIikpIAotICAgIHsKLSAgICAgIC8vIE5vdGhpbmcgdG8gY2hlY2sKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIGlmIChtYXhWYWx1ZS5lcXVhbHMoInVuYm91bmRlZCIpKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHRyeQotICAgIHsKLSAgICAgIG1heCA9IEludGVnZXIucGFyc2VJbnQobWF4VmFsdWUpOwotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX0VSUk9SX01BWF9OT1RfUE9TSVRJVkUiKTsKLSAgICB9Ci0KLSAgICBpZiAobWF4IDwgMCkgCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfRVJST1JfTUFYX05PVF9QT1NJVElWRSIpOwotICAgIH0KLQotICAgIHRyeQotICAgIHsKLSAgICAgIGludCBtaW4gPSBJbnRlZ2VyLnBhcnNlSW50KG1pblZhbHVlKTsKLSAgICAgIGlmIChtYXggPCBtaW4pIAotICAgICAgewotICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9FUlJPUl9NQVhfVkFMVUUiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkKLSAgICB7Ci0gICAgICAvLyBNaW4gaXMgbm90IGFjY3VyYXRlLiBEb24ndCBjb21wYXJlIGl0LgotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgbmFtZSBjb25mb3JtcyB0byB0aGUgWE1MIHNwZWMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrWE1MTmFtZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBhbGxvd0VudGl0eVJlZikKLSAgewotICAgIGludCBsZW5ndGggPSBuYW1lLmxlbmd0aCgpOwotICAgIGNoYXIgY2hhcmFjdGVyOwotCi0gICAgaWYgKGxlbmd0aCA9PSAwKSAKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfV0FSTl9OQU1FX01VU1RfQ09OVEFJTl9BVF9MRUFTVF9PTkVfQ0hBUiIpOwotICAgIH0KLSAgICAKLSAgICBpZiAobmFtZS5pbmRleE9mKCIgIikgPj0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4oV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfV0FSTl9OQU1FX0hBU19TUEFDRSIpKTsKLSAgICB9Ci0KLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGlmIChsZW5ndGggPiAwICYmCi0gICAgICAgIG5hbWUuY2hhckF0KDApID09ICclJykKLSAgICB7Ci0gICAgICBpZiAoYWxsb3dFbnRpdHlSZWYpIAotICAgICAgewotICAgICAgICAvLyBza2lwIG92ZXIgdGhlIGZpcnN0IGNoYXJhY3RlciAKLSAgICAgICAgaW5kZXgrKzsKLSAgICAgIH0gLy8gZW5kIG9mIGlmICgpCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9GSVJTVCIpOwotICAgICAgfSAvLyBlbmQgb2YgZWxzZQotICAgIH0KLSAgICAKLSAgICBmb3IoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBjaGFyYWN0ZXIgPSBuYW1lLmNoYXJBdChpbmRleCk7Ci0KLSAgICAgIGlmKGluZGV4ID09IDApCi0gICAgICB7Ci0gICAgICAgIGlmKCAhaXNYTUxOYW1lU3RhcnQoY2hhcmFjdGVyKSApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfV0FSTl9OQU1FX0lOVkFMSURfRklSU1QiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZighaXNYTUxOYW1lQ2hhcihjaGFyYWN0ZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChpbmRleCA9PSBsZW5ndGggLSAxKSAmJiAvL2NoZWNrIGlmIHRoZSBsYXN0IGNoYXJhY3RlciBpcyBhICc7JwotICAgICAgICAgICAgICBhbGxvd0VudGl0eVJlZiAmJgotICAgICAgICAgICAgICBjaGFyYWN0ZXIgPT0gJzsnKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHdlJ3JlIHN0aWxsIG9rIHRoZW4KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0gLy8gZW5kIG9mIGlmICgpCi0gICAgICAgICAgZWxzZSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfV0FSTl9OQU1FX0lOVkFMSURfQ0hBUiIpICsgY2hhcmFjdGVyICsgCi0gICAgICAgICAgICBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9OQU1FX0lOVkFMSURfQ0hBUl9FTkQiKTsKLSAgICAgICAgICB9IC8vIGVuZCBvZiBlbHNlCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIG5hbWUgY29uZm9ybXMgdG8gdGhlIFhNTCBzcGVjCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1hNTE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gY2hlY2tYTUxOYW1lKG5hbWUsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBpc1hNTE5hbWVTdGFydAotICAgKiovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxOYW1lU3RhcnQoY2hhciBjaCkKLSAgewotICAgIHJldHVybiAoY2ggPT0gJ18nIHx8IGNoID09ICc6JyB8fCBDaGFyYWN0ZXIuaXNMZXR0ZXIoY2gpICk7Ci0gIH0KLQotICAvKioKLSAgICogaXNYTUxOYW1lQ2hhcgotICAgKiovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxOYW1lQ2hhcihjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoKSB8fCBjaCA9PSAnLicgfHwgY2ggPT0gJy0nIHx8IGNoID09ICdfJyB8fCBjaCA9PSAnOicpOwotICB9Ci0KLSAgLyoqCi0gICAqIGlzWE1MUHJlZml4U3RhcnQKLSAgICoqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWE1MUHJlZml4U3RhcnQoY2hhciBjaCkKLSAgewotICAgIHJldHVybiAoY2ggPT0gJ18nIHx8IENoYXJhY3Rlci5pc0xldHRlcihjaCkgKTsKLSAgfQotCi0gIC8qKgotICAgKiBpc1hNTFByZWZpeENoYXIKLSAgICoqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWE1MUHJlZml4Q2hhcihjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoKSB8fCBjaCA9PSAnLicgfHwgY2ggPT0gJy0nIHx8IGNoID09ICdfJyk7Ci0gIH0KLQotICAvKioKLSAgICogcGFyc2VFbGVtZW50VGV4dAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VFbGVtZW50VGV4dChTdHJpbmcgdGV4dCkKLSAgewotICAgIGlmICh0ZXh0LmluZGV4T2YoJzwnKSAhPSAtMSB8fCB0ZXh0LmluZGV4T2YoJz4nKSAhPSAtMSkKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX0VMRU1FTlRfSU5WQUxJRF9DSEFSIik7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIHBhcnNlQXR0cmlidXRlVmFsdWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlQXR0cmlidXRlVmFsdWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLmluZGV4T2YoJyInKSAhPSAtMSB8fCB2YWx1ZS5pbmRleE9mKCc8JykgIT0gLTEgfHwgdmFsdWUuaW5kZXhPZignPicpICE9IC0xKQotICAgIHsKLSAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fQVRUUklCVVRFX0lOVkFMSURfQ0hBUiIpOwotCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIHBhcnNlQURBVEFTZWN0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZUNEQVRBU2VjdGlvbihTdHJpbmcgc2VjdGlvbikKLSAgewotICAgIGlmIChzZWN0aW9uLmluZGV4T2YoIl1dPiIpICE9IC0xKQotICAgIHsKLSAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fQ0RBVEFfSU5WQUxJRF9TVFJJTkciKTsKLQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBwYXJzZVByb2Nlc3NpaW5nSW5zdHJ1Y3Rpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uRGF0YShTdHJpbmcgZGF0YSkKLSAgewotICAgIGlmIChkYXRhLmluZGV4T2YoIj8+IikgIT0gLTEpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9QUk9DRVNTSU5HX0lOVkFMSURfU1RSSU5HIik7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25UYXJnZXQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uVGFyZ2V0KFN0cmluZyB0YXJnZXQpCi0gIHsKLSAgICBpZiAodGFyZ2V0Lmxlbmd0aCgpID09IDMgJiYgKHRhcmdldC5pbmRleE9mKCJYTUwiKSAhPSAtMSB8fCB0YXJnZXQuaW5kZXhPZigiWE1sIikgIT0gLTEgfHwgdGFyZ2V0LmluZGV4T2YoIlhtTCIpICE9IC0xIHx8Ci0gICAgICAgIHRhcmdldC5pbmRleE9mKCJ4TUwiKSAhPSAtMSB8fCB0YXJnZXQuaW5kZXhPZigiWG1sIikgIT0gLTEgfHwgdGFyZ2V0LmluZGV4T2YoInhNbCIpICE9IC0xIHx8Ci0gICAgICAgIHRhcmdldC5pbmRleE9mKCJ4bUwiKSAhPSAtMSB8fCB0YXJnZXQuaW5kZXhPZigieG1sIikgIT0gLTEpKQotICAgIHsKLSAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fUFJPQ0VTU0lOR19UQVJHRVRfSU5WQUxJRF9TVFJJTkciKTsKLQotICAgIH0KLSAgICByZXR1cm4gY2hlY2tYTUxOYW1lKHRhcmdldCk7Ci0gIH0KLQotICAvKioKLSAgICogcGFyc0NvbW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlQ29tbWVudChTdHJpbmcgY29tbWVudCkKLSAgewotICAgIGlmIChjb21tZW50LmluZGV4T2YoIi0tIikgIT0gLTEpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9DT01NRU5UX0lOVkFMSURfU1RSSU5HIik7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIHByZWZpeCBjb25mb3JtcyB0byB0aGUgWE1MIHNwZWMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrWE1MUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBpbnQgbGVuZ3RoID0gcHJlZml4Lmxlbmd0aCgpOwotICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgY2hhciBjaGFyYWN0ZXI7Ci0gICAgCi0gICAgaWYgKHByZWZpeC5pbmRleE9mKCIgIikgPj0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4oVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX1BSRUZJWF9IQVNfU1BBQ0UiKSk7Ci0gICAgfQotICAgIAotICAgIGZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBjaGFyYWN0ZXIgPSBwcmVmaXguY2hhckF0KGluZGV4KTsKLQotICAgICAgaWYoIWlzWE1MUHJlZml4Q2hhcihjaGFyYWN0ZXIpKQotICAgICAgewotICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZygiX1dBUk5fUFJFRklYX0lOVkFMSURfQ0hBUiIsIFN0cmluZy52YWx1ZU9mKGNoYXJhY3RlcikpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETEVkaXRvclV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETEVkaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyMWI5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExFZGl0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklUeXBlU3lzdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFdTRExFZGl0b3JVdGlsIGV4dGVuZHMgV1NETENvbnN0YW50cwotewotICBwcm90ZWN0ZWQgc3RhdGljIFdTRExFZGl0b3JVdGlsIGluc3RhbmNlOwotICBwcm90ZWN0ZWQgTm9kZUFzc29jaWF0aW9uTWFuYWdlciBub2RlQXNzb2NpYXRpb25NYW5hZ2VyID0gbmV3IE5vZGVBc3NvY2lhdGlvbk1hbmFnZXIoKTsKLQotICBwcm90ZWN0ZWQgSGFzaE1hcCBlbGVtZW50TmFtZVRvVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBXU0RMRWRpdG9yVXRpbCBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBXU0RMRWRpdG9yVXRpbCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICBwdWJsaWMgV1NETEVkaXRvclV0aWwoKQotICB7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KEJJTkRJTkdfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKEJJTkRJTkcpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoREVGSU5JVElPTl9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoREVGSU5JVElPTikpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihET0NVTUVOVEFUSU9OKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KEZBVUxUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihGQVVMVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChJTVBPUlRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKElNUE9SVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChJTlBVVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoSU5QVVQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoTUVTU0FHRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoTUVTU0FHRSkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChPUEVSQVRJT05fRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKE9QRVJBVElPTikpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChPVVRQVVRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKE9VVFBVVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChQQVJUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihQQVJUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFBPUlRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFBPUlQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoUE9SVF9UWVBFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihQT1JUX1RZUEUpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoU0VSVklDRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoU0VSVklDRSkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChUWVBFU19FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoVFlQRVMpKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0V1NETFR5cGUoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaW50IHJlc3VsdCA9IC0xOwotCi0gICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpZWxlbWVudE5hbWVUb1R5cGVNYXAuZ2V0KGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgIGlmIChpbnRlZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gaW50ZWdlci5pbnRWYWx1ZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0UGFyZW50RWxlbWVudENoYWluKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB3aGlsZSAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKDAsIGVsZW1lbnQpOwotICAgICAgTm9kZSBub2RlID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICBlbGVtZW50ID0gKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpID8gKEVsZW1lbnQpbm9kZSA6IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBmaW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KERlZmluaXRpb24gZGVmaW5pdGlvbiwgRWxlbWVudCB0YXJnZXRFbGVtZW50KQotICB7Ci0gICAgT2JqZWN0IG8gPSBub2RlQXNzb2NpYXRpb25NYW5hZ2VyLmdldE1vZGVsT2JqZWN0Rm9yTm9kZShkZWZpbml0aW9uLCB0YXJnZXRFbGVtZW50KTsKLSAgICByZXR1cm4gbzsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnRGb3JPYmplY3QoT2JqZWN0IG8pCi0gIHsKLSAgICByZXR1cm4gKChvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudClvKS5nZXRFbGVtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgTm9kZSBnZXROb2RlRm9yT2JqZWN0KE9iamVjdCBvKQotICB7Ci0gICAgcmV0dXJuIG5vZGVBc3NvY2lhdGlvbk1hbmFnZXIuZ2V0Tm9kZShvKTsKLSAgfQotCi0gIC8vIFByb3ZpZGUgYSBtYXBwaW5nIGJldHdlZW4gRGVmaW5pdGlvbnMgYW5kIElUeXBlU3lzdGVtUHJvdmlkZXJzCi0gIHByaXZhdGUgSGFzaHRhYmxlIHR5cGVTeXN0ZW1Qcm92aWRlcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIAotICBwdWJsaWMgSVR5cGVTeXN0ZW1Qcm92aWRlciBnZXRUeXBlU3lzdGVtUHJvdmlkZXIoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgcmV0dXJuIChJVHlwZVN5c3RlbVByb3ZpZGVyKXR5cGVTeXN0ZW1Qcm92aWRlcnMuZ2V0KGRlZmluaXRpb24pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VHlwZVN5c3RlbVByb3ZpZGVyKERlZmluaXRpb24gZGVmaW5pdGlvbiwgSVR5cGVTeXN0ZW1Qcm92aWRlciB0eXBlU3lzdGVtUHJvdmlkZXIpCi0gIHsKLSAgICB0eXBlU3lzdGVtUHJvdmlkZXJzLnB1dChkZWZpbml0aW9uLHR5cGVTeXN0ZW1Qcm92aWRlcik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFFOYW1lIGNyZWF0ZVFOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIHByZWZpeGVkTmFtZSkKLSAgewotICAgIFFOYW1lIHFuYW1lID0gbnVsbDsKLSAgICBpZiAocHJlZml4ZWROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gcHJlZml4ZWROYW1lLmluZGV4T2YoIjoiKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSAoaW5kZXggPT0gLTEpID8gbnVsbCA6IHByZWZpeGVkTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgaWYgKHByZWZpeCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHByZWZpeGVkTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICBxbmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHFuYW1lOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnROb2RlcyhFeHRlbnNpYmxlRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudCkKLSAgewotICAgIC8vIEZvciBUeXBlcywgSSBuZWVkIHRvIGdldCBhbGwgdGhlIHNjaGVtYXMKLSAgICBpZiAoZXh0ZW5zaWJsZUVsZW1lbnQgaW5zdGFuY2VvZiBUeXBlcykKLSAgICB7Ci0gICAgICBUeXBlcyB4c2RFRSA9IChUeXBlcylleHRlbnNpYmxlRWxlbWVudDsKLSAgICAgIHJldHVybiB4c2RFRS5nZXRTY2hlbWFzKCk7Ci0gICAgfQotICAgIC8qCi0gICAgTGlzdCBjaGlsZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBnZXRFbGVtZW50Rm9yT2JqZWN0KGV4dGVuc2libGVFbGVtZW50KTsKLSAgICBpZiAocGFyZW50RWxlbWVudCAhPSBudWxsKQotICAgIHsKLQotICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBjaGlsZExpc3QuYWRkKG5vZGVMaXN0Lml0ZW0oaSkpOwotICAgICAgfQotICAgICAgSGFzaE1hcCBleHRlbnNpYmxlRWxlbWVudFRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGV4dGVuc2libGVFbGVtZW50LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWkubmV4dCgpOwotICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnRGb3JPYmplY3QoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZXh0ZW5zaWJsZUVsZW1lbnRUYWJsZS5wdXQoZWxlbWVudCwgZWxlbWVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNoaWxkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgIGlmIChleHRlbnNpYmxlRWxlbWVudFRhYmxlLmdldChvKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2hpbGRMaXN0OwotICAgICovCi0gICAgcmV0dXJuIGV4dGVuc2libGVFbGVtZW50LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgfQotCi0gIC8qCi0gICAqIFJldHVybnMgYSBsaXN0IG9mICdjaGlsZHJlbicgb2YgdGhlIGdpdmVuIG9iamVjdCBtb2RlbCAoV1NETEVsZW1lbnQpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldE1vZGVsR3JhcGhWaWV3Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotICAJTGlzdCBjaGlsZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAkKLSAgCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQb3J0VHlwZSkgewotICAJCVBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBvYmplY3Q7Ci0gICAgICAgIGNoaWxkTGlzdC5hZGRBbGwocG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpKTsKLSAgCX0KLSAgCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAJCU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvYmplY3Q7Ci0gIAkJCi0gIAkJaWYgKG9wZXJhdGlvbi5nZXRFSW5wdXQoKSAhPSBudWxsKSB7Ci0gIAkJCWNoaWxkTGlzdC5hZGQob3BlcmF0aW9uLmdldEVJbnB1dCgpKTsKLSAgCQl9Ci0gIAkJaWYgKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkgIT0gbnVsbCkgewotICAJCQljaGlsZExpc3QuYWRkKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkpOwotICAJCX0KLSAgCQljaGlsZExpc3QuYWRkQWxsKG9wZXJhdGlvbi5nZXRGYXVsdHMoKS52YWx1ZXMoKSk7Ci0gIAl9Ci0gIAllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlUmVmZXJlbmNlKSB7Ci0gIAkJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmZXJlbmNlID0gKE1lc3NhZ2VSZWZlcmVuY2UpIG9iamVjdDsKLSAgCQljaGlsZExpc3QuYWRkKG1lc3NhZ2VSZWZlcmVuY2UuZ2V0RU1lc3NhZ2UoKSk7Ci0gIAl9ICAJCi0gIAkKLSAgCXJldHVybiBjaGlsZExpc3Q7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5NjMwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMTW9kZWxMb2NhdG9yOwotCi1wdWJsaWMgY2xhc3MgV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gIHByb3RlY3RlZCBDdXN0b21XU0RMTW9kZWxMb2NhdG9yIGN1c3RvbVdTRExNb2RlbExvY2F0b3IgPSBuZXcgQ3VzdG9tV1NETE1vZGVsTG9jYXRvcigpOwotICAKLSAgY2xhc3MgQ3VzdG9tV1NETE1vZGVsTG9jYXRvciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgV1NETE1vZGVsTG9jYXRvcgotICB7Ci0gICAgcHVibGljIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvbikKLSAgICB7Ci0gICAgICByZXR1cm4gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbmFtZXNwYWNlLCBsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGF0cGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBXU0RMTW9kZWxMb2NhdG9yLmNsYXNzOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gIHsKLSAgICByZXR1cm4gdHlwZSA9PSBXU0RMTW9kZWxMb2NhdG9yLmNsYXNzOwotICB9Ci0KLSAgcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiBjdXN0b21XU0RMTW9kZWxMb2NhdG9yOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETE5vZGVBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYmI1MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsgICAgICAKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JTm9kZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEQ29tcG9uZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIKLXsgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KE9iamVjdCBwYXJlbnRNb2RlbE9iamVjdCwgRWxlbWVudFtdIGVsZW1lbnRDaGFpbiwgaW50IHN0YXJ0LCBpbnRbXSBlbmQpCi0gIHsgICAgICAgICAgICAgICAgIAotICAgIE9iamVjdCBjdXJyZW50T2JqZWN0ID0gcGFyZW50TW9kZWxPYmplY3Q7Ci0gICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZWxlbWVudENoYWluLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gZ2V0TW9kZWxPYmplY3RIZWxwZXIoY3VycmVudE9iamVjdCwgZWxlbWVudENoYWluW2ldKTsKLSAgICAgIGlmIChvID09IG51bGwpCi0gICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgZW5kWzBdID0gaTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgICAgICAgICAgCi0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgY3VycmVudE9iamVjdCA9IG87Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBjdXJyZW50T2JqZWN0ICE9IHBhcmVudE1vZGVsT2JqZWN0ID8gY3VycmVudE9iamVjdCA6IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldE5vZGUoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQpCi0gICAgICByZXR1cm4gKChXU0RMRWxlbWVudEltcGwpbW9kZWxPYmplY3QpLmdldEVsZW1lbnQoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotICAgICAgCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0TW9kZWxPYmplY3RIZWxwZXIoT2JqZWN0IHBhcmVudE9iamVjdCwgRWxlbWVudCBlbGVtZW50Tm9kZSkKLSAgeyAgICAgICAgICAKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gY2hpbGRDb21wb25lbnRMaXN0ID0gKChXU0RMRWxlbWVudEltcGwpIHBhcmVudE9iamVjdCkuZ2V0TW9kZWxPYmplY3RzKHBhcmVudE9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkQ29tcG9uZW50TGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsKLQkJCU9iamVjdCBvID0gaS5uZXh0KCk7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0gICAgICBpZiAobyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQgPSAoKFdTRExFbGVtZW50SW1wbClvKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFhTRENvbXBvbmVudEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50ID0gKChYU0RDb21wb25lbnRJbXBsKW8pLmdldEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0JCQlpZiAoZWxlbWVudCA9PSBlbGVtZW50Tm9kZSkKLQkJCXsKLQkJCQlyZXN1bHQgPSBvOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0gIH0KLX0gICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlZjY0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuU3RyaW5nRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotcHVibGljIGNsYXNzIFdTRExQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0gIHB1YmxpYyBXU0RMUHJlZmVyZW5jZVBhZ2UoKQotICB7Ci0gICAgc3VwZXIoRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZS5GTEFUKTsKLSAgICBzZXRQcmVmZXJlbmNlU3RvcmUoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gZ2V0RmllbGRFZGl0b3JQYXJlbnQoKTsKLQlHcmlkTGF5b3V0IHBhcmVudExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JcGFyZW50TGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQlwYXJlbnQuc2V0TGF5b3V0KHBhcmVudExheW91dCk7Ci0JCi0vLyAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZ2V0Q29udHJvbCgpLCBzb21lIGNvbnRleHQgaWQgaGVyZSk7IAotCi0JR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgIGdyb3VwLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfUFJFRl9QQUdFX0NSRUFUSU5HX0ZJTEVTIikpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGdyb3VwLCBTV1QuTlVMTCk7Ci0gICAgR3JpZERhdGEgZGF0YTEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhMS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YTEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YTEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YTEpOwotCQotICAgIFN0cmluZ0ZpZWxkRWRpdG9yIHRhcmdldE5hbWVzcGFjZSA9IG5ldyBTdHJpbmdGaWVsZEVkaXRvcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QUkVGX1BBR0VfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFIiksIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UiKSwgY29tcG9zaXRlKTsgLy8gRXh0ZXJuYWxpemUKLSAgICBHcmlkTGF5b3V0IGNvbXBvc2l0ZUxheW91dCA9IChHcmlkTGF5b3V0KWNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLSAgICBjb21wb3NpdGVMYXlvdXQubWFyZ2luV2lkdGggPSA1OyAgIC8vIERlZmF1bHQgdmFsdWUKLSAgICBjb21wb3NpdGVMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgYWRkRmllbGQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICB0YXJnZXROYW1lc3BhY2Uuc2V0Rm9jdXMoKTsKLQotCi0gICAgLyogRG8gd2UgbmVlZCB0aGlzIHByZWZlcmVuY2UgYmVsb3c/ICBJZiBzbywgY2hhbmdlIFdTRExFZGl0b3JQbHVnaW4uamF2YSBhbmQgdXNlIHRoaXMgcHJlZmVyZW5jZSBpbjoKLSAgICAgICBIdHRwQ29udGVudEdlbmVyYXRvci5qYXZhCi0gICAgICAgU29hcENvbnRlbnRHZW5lcmF0b3IuamF2YQotICAgICAgIFNvYXBQb3J0T3B0aW9uc1BhZ2UuamF2YQotICAgICovCi0vLyAgICBIdHRwUG9ydE9wdGlvbnNQYWdlLmphdmEgICAgU3RyaW5nRmllbGRFZGl0b3IgbG9jYXRpb24gPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoIkRlZnVhbHQgTG9jYXRpb246IiwgIkRlZmF1bHQgTG9jYXRpb246IiwgZWRpdG9yR3JvdXAxKTsgLy8gRXh0ZXJuYWxpemUKLS8vICAgIGFkZEZpZWxkKGxvY2F0aW9uKTsgICAgCi0gICAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExSZXNvdXJjZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETFJlc291cmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTU2ZDE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETFJlc291cmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExNb2RlbExvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMUmVzb3VyY2VVdGlsCi17Ci0gIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlV1NETFJlc291cmNlKFJlc291cmNlU2V0IHJlc291cmNlU2V0LCBEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB1cmkpCi0gIHsKLSAgICBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCByZXNvdXJjZUZhY3RvcnkgPSBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKTsKLSAgICBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlRmFjdG9yeS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSkpOwotICAgIHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0gICAgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGVmaW5pdGlvbik7Ci0gICAgcmVzb3VyY2Uuc2V0TW9kaWZpZWQoZmFsc2UpOwotICAgIHJldHVybiByZXNvdXJjZTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBEZWZpbml0aW9uIGxvb2t1cEFuZExvYWREZWZpbml0aW9uKFJlc291cmNlU2V0IHJlc291cmNlU2V0LCBTdHJpbmcgdXJpKSB7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotICAJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotICAJdHJ5IHsKLSAgCSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkodXJpKSk7Ci0gICAgIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh1cmkpKTsKLSAgICAgcmVzb3VyY2UubG9hZChpbnB1dFN0cmVhbSwgcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0gIAl9Ci0gIAljYXRjaChFeGNlcHRpb24gZSkge30KLSAgICAKLSAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZGVmaW5pdGlvbiA9IHBhcnNlKHJlc291cmNlU2V0LCB1cmkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgT2JqZWN0IG8gPSByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKSA+IDAgPyByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKSA6IG51bGw7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgbzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci19Ci0KLSAgcHVibGljIHN0YXRpYyBEZWZpbml0aW9uIGxvb2t1cE9yQ3JlYXRlRGVmaW5pdGlvbihSZXNvdXJjZVNldCByZXNvdXJjZVNldCwgU3RyaW5nIHVyaSkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSksIGZhbHNlKTsKLSAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZGVmaW5pdGlvbiA9IHBhcnNlKHJlc291cmNlU2V0LCB1cmkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgT2JqZWN0IG8gPSByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKSA+IDAgPyByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKSA6IG51bGw7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgbzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIERlZmluaXRpb24gY3JlYXRlRGVmaW5pdGlvbihSZXNvdXJjZVNldCByZXNvdXJjZVNldCwgSUZpbGUgZmlsZSwgRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikuc2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzKGZhbHNlKTsKLSAgICBTdHJpbmcgYmFzZVVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS50b1N0cmluZygpOwotICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKGJhc2VVUkkpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZGVmaW5pdGlvbi5zZXRFbGVtZW50KGVsZW1lbnQpOyAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgV1NETFJlc291cmNlVXRpbC5jcmVhdGVXU0RMUmVzb3VyY2UocmVzb3VyY2VTZXQsIGRlZmluaXRpb24sIGJhc2VVUkkpOwotICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikucmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsgICAgCi0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIERlZmluaXRpb24gcGFyc2UoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQsIFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgIENsYXNzTG9hZGVyIHByZXZDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihXU0RMUmVzb3VyY2VVdGlsLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotLy8gICAgICBET01QYXJzZXIgYnVpbGRlciA9IG5ldyBET01QYXJzZXIoKTsKLS8vICAgICAgYnVpbGRlci5wYXJzZSh1cmkpOwotLy8gICAgICBkb2N1bWVudCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICAgIAotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKHVyaSk7Ci0gICAgICAKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHByZXZDbGFzc0xvYWRlcik7Ci0gICAgfQotCi0gICAgZGVmaW5pdGlvbiA9ICgob3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlLmVOU19VUkkpKS5nZXRXU0RMRmFjdG9yeSgpLmNyZWF0ZURlZmluaXRpb24oKTsKLSAgICBkZWZpbml0aW9uLnNldERvY3VtZW50QmFzZVVSSSh1cmkpOwotICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZGVmaW5pdGlvbi5zZXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBXU0RMUmVzb3VyY2VVdGlsLmNyZWF0ZVdTRExSZXNvdXJjZShyZXNvdXJjZVNldCwgZGVmaW5pdGlvbiwgdXJpKTsKLSAgICAoKERlZmluaXRpb25JbXBsKWRlZmluaXRpb24pLnJlY29uY2lsZVJlZmVyZW5jZXModHJ1ZSk7Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVsb2FkRGlyZWN0aXZlcyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBSZXNvdXJjZSByb290UmVzb3VyY2UgPSBkZWZpbml0aW9uLmVSZXNvdXJjZSgpOwotICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcm9vdFJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGkubmV4dCgpOwotICAgICAgaWYgKHJlc291cmNlICE9IHJvb3RSZXNvdXJjZSkKLSAgICAgIHsKLSAgICAgICAgLy8gIFRPRE8uLi4gY29uc2lkZXIgdW5sb2FkaW5nIHRoZSByZXNvdXJjZXMgIAkKLSAgICAgICAgLy8gIHJlc291cmNlLnVubG9hZCgpOwkJICAgICAgCi0gICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFJlbG9hZERpcmVjdGl2ZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZWxvYWREaXJlY3RpdmVWaXNpdG9yKCk7Ci0gICAgdmlzaXRvci52aXNpdERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgUmVsb2FkRGlyZWN0aXZlVmlzaXRvcgotICB7Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgdGhlSW1wb3J0KQotICAgIHsKLSAgICAgIC8vIGZvcmNlIHRoZSBpbXBvcnQgdG8gcmVsb2FkCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QodGhlSW1wb3J0KTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgICgoV1NETEVsZW1lbnRJbXBsKXRoZUltcG9ydCkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RTY2hlbWFEaXJlY3RpdmUoWFNEU2NoZW1hRGlyZWN0aXZlIGRpcmVjdGl2ZSkKLSAgICB7Ci0gICAgICAvLyBmb3JjZSB0aGUgc2NoZW1hIGRpcmVjdGl2ZSB0byByZWxvYWQKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRpcmVjdGl2ZS5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBkaXJlY3RpdmUuZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0SW1wb3J0KChJbXBvcnQpIGkubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgICB7Ci0KLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBvOwotICAgICAgICAgICAgICBpZiAoZS5nZXRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlzaXRTY2hlbWEoZS5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTRFNjaGVtYURpcmVjdGl2ZSgoWFNEU2NoZW1hRGlyZWN0aXZlKSBvKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcm5hbFVSSVJlc29sdmVyIGltcGxlbWVudHMgV1NETE1vZGVsTG9jYXRvcgotICB7Ci0gICAgLy9JZFJlc29sdmVyIGlkUmVzb2x2ZXIgPSBuZXcgSWRSZXNvbHZlckltcGwobnVsbCwgdHJ1ZSk7Ci0gICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5VUklSZXNvbHZlciByZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0KLSAgICBJbnRlcm5hbFVSSVJlc29sdmVyKCkKLSAgICB7ICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotICAgIHsKLSAgICAgIFN0cmluZyByZXNvbHZlZExvY2F0aW9uID0gcmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG5hbWVzcGFjZSwgbG9jYXRpb24pOwotCi0gICAgICAvLyBoZXJlJ3MgYW4gdWdseSBoYWNrLi4uIFBsYXRmb3JtLnJlc29sdmUoKSByZXR1cm5zIFdpbmRvd3MgZmlsZXMgd2l0aCB0aGUgcGF0dGVybiAiZmlsZTpEOi9oZWxsby54c2QiCi0gICAgICAvLyBidXQgRU1GJ3MgVVJJIGNsYXNzIGV4cGVjdHMgYSBwYXR0ZXJuIGxpa2UgdGhpcyAiZmlsZTovLy9EOi9oZWxsby54c2QiCi0gICAgICAvLyAgICAgICAgCi0gICAgICBpZiAocmVzb2x2ZWRMb2NhdGlvbiAhPSBudWxsKQotICAgICAgewotCQlTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGU6IjsgICAgICAJCi0gICAgICAgIGlmIChyZXNvbHZlZExvY2F0aW9uLnN0YXJ0c1dpdGgoZmlsZVByb3RvY29sKSAmJiAhcmVzb2x2ZWRMb2NhdGlvbi5zdGFydHNXaXRoKGZpbGVQcm90b2NvbCArICIvIikpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvbHZlZExvY2F0aW9uID0gcmVzb2x2ZWRMb2NhdGlvbi5zdWJzdHJpbmcoZmlsZVByb3RvY29sLmxlbmd0aCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXNvbHZlZExvY2F0aW9uID0gVVJJSGVscGVyLmFkZEltcGxpZWRGaWxlUHJvdG9jb2wocmVzb2x2ZWRMb2NhdGlvbik7Ci0gICAgICB9Ci0gICAgICAvLyBlbmQgdWdseSBoYWNrCi0gICAgICByZXR1cm4gcmVzb2x2ZWRMb2NhdGlvbjsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hNTFF1aWNrU2Nhbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9YTUxRdWlja1NjYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzMzhiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hNTFF1aWNrU2Nhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxRdWlja1NjYW4KLXsgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKLSAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgIHJlc3VsdCA9IFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEoaW5wdXRTdHJlYW0pOyAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsgICAgICAKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKElucHV0U3RyZWFtIGlucHV0KQotICB7ICAKLSAgICBUYXJnZXROYW1lc3BhY2VVUklDb250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFRhcmdldE5hbWVzcGFjZVVSSUNvbnRlbnRIYW5kbGVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihYTUxRdWlja1NjYW4uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgLy8gTGluZSBiZWxvdyBpcyBhIGhhY2sgdG8gZ2V0IFhNTFJlYWRlciB3b3JraW5nCi0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAJWE1MUmVhZGVyIHJlYWRlciA9IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKLSAgICAJcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotICAgIAlyZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0KSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7ICAgICAgCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihwcmV2Q2xhc3NMb2FkZXIpOwotICAgIH0KLSAgICByZXR1cm4gaGFuZGxlci50YXJnZXROYW1lc3BhY2VVUkk7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGFyZ2V0TmFtZXNwYWNlVVJJQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgotICB7ICAgICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlVVJJOwotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsgICAgICAgICAgICAKLSAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKCJzY2hlbWEiKSB8fCBsb2NhbE5hbWUuZXF1YWxzKCJkZWZpbml0aW9ucyIpKQotICAgICAgeyAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgbkF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyaWJ1dGVzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSkuZXF1YWxzKCJ0YXJnZXROYW1lc3BhY2UiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VVUkkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvLyB0b2RvIHRoZXJlJ3MgYSBpY2Ugd2F5IHRvIGRvIHRoaXMgSSdtIHN1cmUgICAgCi0gICAgICAvLyBoZXJlIEkgaW50ZW50aWFsbHkgY2F1c2UgYW4gZXhjZXB0aW9uLi4uIAotICAgICAgU3RyaW5nIHggPSBudWxsOwotICAgICAgeC5sZW5ndGgoKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiOWFlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsIHNjaGVtYUxvY2F0b3IgPSBuZXcgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlci5jbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiBzY2hlbWFMb2NhdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2NmM0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlcgotewotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVNjaGVtYUxvY2F0aW9uKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBzY2hlbWFMb2NhdGlvblVSSSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYmFzZUxvY2F0aW9uID0geHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7ICAgICAgCi0gICAgICBTdHJpbmcgcmVzdWx0ID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbmFtZXNwYWNlVVJJLCBzY2hlbWFMb2NhdGlvblVSSSk7Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgIAlyZXN1bHQgPSBuYW1lc3BhY2VVUkk7Ci0gICAgICB9Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgIAlyZXN1bHQgPSAiIjsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXRwZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFhTRFNjaGVtYUxvY2F0b3IuY2xhc3M7Ci0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9GbGF0UGFnZUhlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvRmxhdFBhZ2VIZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxYWRhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9GbGF0UGFnZUhlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotCi1wdWJsaWMgY2xhc3MgRmxhdFBhZ2VIZWFkZXIgZXh0ZW5kcyBDYW52YXMgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciAKLXsKLQlwcml2YXRlIEltYWdlIGJhY2tncm91bmRJbWFnZTsgIAotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0JcHJpdmF0ZSBJbWFnZSBidXR0b25JbWFnZTsKLQlwcml2YXRlIENvbG9yIGltYWdlQmFja2dyb3VuZENvbG9yOwotCXByaXZhdGUgQ29sb3IgdGV4dEZvcmVncm91bmRDb2xvcjsKLQlwcml2YXRlIGludCB0ZXh0SE1hcmdpbiA9IDEwOwotCXByaXZhdGUgaW50IHRleHRWTWFyZ2luID0gNTsKLQlwcml2YXRlIEZvbnQgaGVhZGVyRm9udDsKLQlwcml2YXRlIGludCB3aWR0aEhpbnQ7Ci0KLQlwcml2YXRlIExpc3QgbGlzdGVuZXJzOwotCXByaXZhdGUgaW50IGJ1dHRvbkltYWdlWDsKLQlwcml2YXRlIGludCBidXR0b25JbWFnZVk7Ci0JCi0gIC8vIFVzYWdlOiAKLSAgLy8gICAgU2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuRmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUZsYXRQYWdlSGVhZGVyKCkgCi0gIC8vICAgIG1ldGhvZHMuCi0gIC8vCi0gIC8vICBFeCkKLSAgLy8gIENvbXBvc2l0ZSBwYXJlbnQgPSAuLi4gOwotICAvLyAgSW1hZ2UgaW1hZ2UgPSAuLi4gOwotICAvLyAgTGF5b3V0IGxheW91dCA9IC4uLiA7Ci0gIC8vICBTdHJpbmcgdGl0bGUgPSAuLi4gOwotICAvLyAgV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gLi4uIDsKLSAgLy8KLSAgLy8gIGhlYWRlciA9IG5ldyBGbGF0UGFnZUhlYWRlcihwYXJlbnQsU1dULk5PTkUpOwotICAvLyAgaGVhZGVyLnNldExheW91dChsYXlvdXQpOwotICAvLyAgaGVhZGVyLnNldEJhY2tncm91bmRJbWFnZShpbWFnZSk7Ci0gIC8vICBoZWFkZXIuc2V0VGV4dCh0aXRsZSk7Ci0gIC8vICBDb21wb3NpdGUgZm9ybVBhcmVudCA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGhlYWRlcik7Ci0gIC8vICAKLSAgLy8gIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAvLyAgZ2wubnVtQ29sdW1ucyA9IDE7Ci0gIC8vICBmb3JtUGFyZW50LnNldExheW91dChnbCk7Ci0gIC8vICBmb3JtUGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAvLwotCXB1YmxpYyBGbGF0UGFnZUhlYWRlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIAotICB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQkKLQkJLy8gVGhlIGRlZmF1bHQgaW1hZ2UgYmFja2dyb3VuZCBjb2xvciBpcyB3aGl0ZQotCQkvLyBUaGUgZGVmYXVsdCB0ZXh0IGZvcmVrZ3JvdW5kIGNvbG9yIGlzIGJsYWNrCi0JCWltYWdlQmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMjU1LCAyNTUpOwotCQl0ZXh0Rm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yKG51bGwsIDAsIDAsIDApOwotCQlzZXRCYWNrZ3JvdW5kKGltYWdlQmFja2dyb3VuZENvbG9yKTsKLQkJCi0JCS8vIFRoZSBkZWZhdWx0IHRleHQgZm9udCBpcyBIZWFkZXIgZm9udAotCQloZWFkZXJGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpOwotCQkKLQkJLy8gTmVlZCB0byBkaXNwb3NlIHRoZSBDb2xvcgotCQlhZGREaXNwb3NlTGlzdGVuZXIKLSAgICAgIChuZXcgRGlzcG9zZUxpc3RlbmVyKCkgCi0gICAgICAgIHsKLQkJCSAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgCi0gICAgICAgICAgewotCQkJCSAgICBGbGF0UGFnZUhlYWRlci50aGlzLndpZGdldERpc3Bvc2VkKGUpOwotCQkJICAgIH0KLQkJICAgIH0gCi0gICAgICApOwotCQkgCi0JCS8vIG5lZWQgdG8gcGFpbnQKLQkJYWRkUGFpbnRMaXN0ZW5lcgotICAgICAgKG5ldyBQYWludExpc3RlbmVyKCkgCi0gICAgICAgIHsKLQkJCSAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSAKLSAgICAgICAgICB7Ci0JCQkgICAgICBGbGF0UGFnZUhlYWRlci50aGlzLnBhaW50Q29udHJvbChlKTsKLQkJCSAgICB9Ci0JCSAgICB9Ci0gICAgICApOwotCi0JCS8vIGNyZWF0ZSBhIGxpc3Qgb2YgbGlzdGVuZXJzCi0JCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBhZGQgYSBtb3VzZSBsaXN0ZW5lcgotCQl0aGlzLmFkZE1vdXNlTGlzdGVuZXIKLSAgICAgIChuZXcgTW91c2VBZGFwdGVyKCkgCi0gICAgICAgIHsKLQkJCSAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgCi0gICAgICAgICAgewotCQkJCSAgICBoYW5kbGVNb3VzZURvd24oZXZlbnQpOwotCQkJICAgIH0KLQkJICAgIH0KLSAgICAgICk7CQotCQkKLQkJSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JfSAgCi0KLQkvLyBDb21wdXRlIHNpemUgb2YgdGhlIHdpZGdldAotCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSAKLSAgewotCQl3aWR0aEhpbnQgPSB3SGludDsKLQkJaW50IHdpZHRoID0gZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotCQlpbnQgaGVpZ2h0ID0gMDsKLQkJaWYgKGJhY2tncm91bmRJbWFnZSAhPSBudWxsKSAKLSAgICB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gYmFja2dyb3VuZEltYWdlLmdldEJvdW5kcygpOwotCQkJaGVpZ2h0ID0gYm91bmRzLmhlaWdodDsKLQkJfQotCQlpZiAodGV4dCAhPSBudWxsKSAKLSAgICB7Ci0JCQlHQyBnYyA9IG5ldyBHQyh0aGlzKTsKLQkJCWludCB0ZXh0V2lkdGggPSBnZXRUZXh0V2lkdGgoZ2MpOwotCQkJaW50IHRleHRIZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KGdjKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCWhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgdGV4dEhlaWdodCk7Ci0JCX0KLQkJaWYgKGJ1dHRvbkltYWdlICE9IG51bGwpIAotICAgIHsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uSW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQlpZiAoaGVpZ2h0IDwgYm91bmRzLmhlaWdodCkKLQkJCQloZWlnaHQgPSBib3VuZHMuaGVpZ2h0OwotCQl9Ci0JCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkgd2lkdGggPSB3SGludDsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKSBoZWlnaHQgPSBoSGludDsgICAgICAgICAgCi0JCXJldHVybiBuZXcgUG9pbnQod2lkdGggKyAyLCBoZWlnaHQgKyAyKTsgICAgIAotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSAKLSAgewotCQlHQyBnYyA9IGUuZ2M7Ci0JCWludCBoZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KGdjKTsKLQkJaWYgKGJhY2tncm91bmRJbWFnZSAhPSBudWxsKSAKLSAgICB7Ci0JCQlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBiYWNrZ3JvdW5kSW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQlpbnQgeSA9IDA7Ci0JCQlpbnQgeCA9IDA7Ci0KLQkJCWlmIChpbWFnZUJhY2tncm91bmRDb2xvciAhPSBudWxsKSAKLSAgICAgIHsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGltYWdlQmFja2dyb3VuZENvbG9yKTsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGltYWdlQm91bmRzLndpZHRoLCBpbWFnZUJvdW5kcy5oZWlnaHQpOwotCQkJfQotCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpPT1mYWxzZSkgCi0gICAgICB7Ci0JCQkJZ2MuZHJhd0ltYWdlKGJhY2tncm91bmRJbWFnZSwgeCwgeSk7Ci0JCQl9Ci0JCQlpZiAodGV4dEZvcmVncm91bmRDb2xvciAhPSBudWxsKQotCQkJCWdjLnNldEZvcmVncm91bmQodGV4dEZvcmVncm91bmRDb2xvcik7Ci0JCQlnYy5zZXRGb250KGhlYWRlckZvbnQpOwotLy8JCQlnYy5zZXRGb250KGdldEZvbnQoKSk7CQotCQkJZ2MuZHJhd1RleHQodGV4dCwgdGV4dEhNYXJnaW4sIHRleHRWTWFyZ2luLCB0cnVlKTsKLQkJCWlmIChidXR0b25JbWFnZSAhPSBudWxsKSAKLSAgICAgIHsKLQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVJlY3RhbmdsZSBidXR0b25Cb3VuZHMgPSBidXR0b25JbWFnZS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgcCA9IHBhcmVudEJvdW5kcy54ICsgcGFyZW50Qm91bmRzLndpZHRoOwotCQkJCWJ1dHRvbkltYWdlWCA9IHAgLSBidXR0b25Cb3VuZHMud2lkdGggLSA0OwotCQkJCWJ1dHRvbkltYWdlWSA9IDQ7Ci0JCQkJZ2MuZHJhd0ltYWdlKGJ1dHRvbkltYWdlLCBidXR0b25JbWFnZVgsIGJ1dHRvbkltYWdlWSk7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotICAgICAgIAotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSAKLSAgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSAKLSAgewotCQlpZiAoYnV0dG9uSW1hZ2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gY2hla2MgaWYgdGhlIEJ1dHRvbiBpbWFnZSBpcyBjbGlja2VkCi0JCWludCB4ID0gZXZlbnQueDsKLQkJaW50IHkgPSBldmVudC55OwotCQlpZiAoeCA8IGJ1dHRvbkltYWdlWCB8fCB4ID4gYnV0dG9uSW1hZ2VYICsgYnV0dG9uSW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGgpIAotICAgIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoeSA8IGJ1dHRvbkltYWdlWSB8fCB5ID4gYnV0dG9uSW1hZ2VZICsgYnV0dG9uSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0KSAKLSAgICB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWludCBzaXplID0gbGlzdGVuZXJzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIAotICAgIHsKLQkJCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKFNlbGVjdGlvbkxpc3RlbmVyKWxpc3RlbmVycy5nZXQoaSk7Ci0JCQlsaXN0ZW5lci53aWRnZXRTZWxlY3RlZChudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgCi0gIHsKLQkJaWYgKGltYWdlQmFja2dyb3VuZENvbG9yICE9IG51bGwpIGltYWdlQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJaWYgKHRleHRGb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgdGV4dEZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCWlmIChiYWNrZ3JvdW5kSW1hZ2UgIT0gbnVsbCkgYmFja2dyb3VuZEltYWdlLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLy8gZ2V0dGVycyBhbmQgc2V0dGVycwotCXB1YmxpYyBJbWFnZSBnZXRCYWNrZ3JvdW5kSW1hZ2UoKSAKLSAgewotCQlyZXR1cm4gYmFja2dyb3VuZEltYWdlOwotCX0KLSAgICAgIAotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRJbWFnZShJbWFnZSBiYWNrZ3JvdW5kSW1hZ2UpIAotICB7Ci0JCXRoaXMuYmFja2dyb3VuZEltYWdlID0gYmFja2dyb3VuZEltYWdlOwotCQlyZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0QnV0dG9uSW1hZ2UoKSAKLSAgewotCQlyZXR1cm4gYnV0dG9uSW1hZ2U7Ci0JfQotICAgICAgCi0JcHVibGljIHZvaWQgc2V0QnV0dG9uSW1hZ2UoSW1hZ2UgYnV0dG9uSW1hZ2UpIAotICB7Ci0JCXRoaXMuYnV0dG9uSW1hZ2UgPSBidXR0b25JbWFnZTsKLQkJcmVkcmF3KCk7Ci0JfQotICAgICAgCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgCi0gIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotICAgICAgCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgCi0gIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJcmVkcmF3KCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0VGV4dEhNYXJnaW4oKSAKLSAgewotCQlyZXR1cm4gdGV4dEhNYXJnaW47Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRleHRITWFyZ2luKGludCB0ZXh0SE1hcmdpbikgCi0gIHsKLQkJdGhpcy50ZXh0SE1hcmdpbiA9IHRleHRITWFyZ2luOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFRleHRWTWFyZ2luKCkgCi0gIHsKLQkJcmV0dXJuIHRleHRWTWFyZ2luOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXh0Vk1hcmdpbihpbnQgdGV4dFZNYXJnaW4pIAotICB7Ci0JCXRoaXMudGV4dFZNYXJnaW4gPSB0ZXh0Vk1hcmdpbjsKLQl9Ci0JCi0JcHVibGljIENvbG9yIGdldEltYWdlQmFja2dyb3VuZENvbG9yKCkgCi0gIHsKLQkJcmV0dXJuIGltYWdlQmFja2dyb3VuZENvbG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbWFnZUJhY2tncm91bmRDb2xvcihDb2xvciBpbWFnZUJhY2tncm91bmRDb2xvcikgCi0gIHsKLQkJaWYgKGltYWdlQmFja2dyb3VuZENvbG9yID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuaW1hZ2VCYWNrZ3JvdW5kQ29sb3IgPSBpbWFnZUJhY2tncm91bmRDb2xvcjsKLQkJcmVkcmF3KCk7Ci0JfQotCQotCXB1YmxpYyBDb2xvciBnZXRUZXh0Rm9yZWdyb3VuZENvbG9yKCkgCi0gIHsKLQkJcmV0dXJuIHRleHRGb3JlZ3JvdW5kQ29sb3I7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRleHRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgdGV4dEZvcmVncm91bmRDb2xvcikgCi0gIHsKLQkJaWYgKHRleHRGb3JlZ3JvdW5kQ29sb3IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy50ZXh0Rm9yZWdyb3VuZENvbG9yID0gdGV4dEZvcmVncm91bmRDb2xvcjsKLQkJcmVkcmF3KCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0VGV4dEhlaWdodChHQyBnYykgCi0gIHsKLQkJaW50IGltYWdlSGVpZ2h0ID0gMDsKLQkJaWYgKGJhY2tncm91bmRJbWFnZSE9IG51bGwgJiYgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpPT1mYWxzZSkgCi0gICAgewotCQkJaW1hZ2VIZWlnaHQgPSBiYWNrZ3JvdW5kSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQl9Ci0JCWdjLnNldEZvbnQoaGVhZGVyRm9udCk7Ci0vLwkJZ2Muc2V0Rm9udChnZXRGb250KCkpOwotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWludCBmb250SGVpZ2h0ID0gZm0uZ2V0SGVpZ2h0KCk7Ci0JCWludCBoZWlnaHQgPSAgZm9udEhlaWdodCArIHRleHRWTWFyZ2luICsgdGV4dFZNYXJnaW47Ci0JCXJldHVybiBNYXRoLm1heChoZWlnaHQsIGltYWdlSGVpZ2h0KTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRUZXh0V2lkdGgoR0MgZ2MpIAotICB7Ci0JCWludCBpbWFnZVdpZHRoID0gMDsKLQkJaWYgKGJhY2tncm91bmRJbWFnZSE9IG51bGwgJiYgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpPT1mYWxzZSkgCi0gICAgewotCQkJaW1hZ2VXaWR0aCA9IGJhY2tncm91bmRJbWFnZS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJfQotCQlnYy5zZXRGb250KGhlYWRlckZvbnQpOwotLy8JCWdjLnNldEZvbnQoZ2V0Rm9udCgpKTsKLQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlpbnQgZm9udFdpZHRoID0gZm0uZ2V0QXZlcmFnZUNoYXJXaWR0aCgpICsgNTsKLQkJaW50IHdpZHRoID0gIGZvbnRXaWR0aCAqIHRleHQubGVuZ3RoKCkgKyB0ZXh0SE1hcmdpbiArIHRleHRITWFyZ2luOwotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGgsIGltYWdlV2lkdGgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSAKLSAgewotLy8JCVdpZGdldCBzb3VyY2UgPSBlLndpZGdldDsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIAotICB7Ci0JCWlmKGV2ZW50LmdldFByb3BlcnR5KCkgPT0gSkZhY2VSZXNvdXJjZXMuSEVBREVSX0ZPTlQgJiYgdGhpcy5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpCi0JCXsKLQkJCWhlYWRlckZvbnQgPSBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoSkZhY2VSZXNvdXJjZXMuSEVBREVSX0ZPTlQpOwotCQkJdGhpcy5sYXlvdXQodHJ1ZSk7Ci0JCQl0aGlzLnJlZHJhdygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvRmxhdFBhZ2VTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9GbGF0UGFnZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4YzMyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9GbGF0UGFnZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuZmxhdHVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8vcHVibGljIGFic3RyYWN0IGNsYXNzIEZvcm1TZWN0aW9uIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIElNb2RlbENoYW5nZWRMaXN0ZW5lciB7Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmxhdFBhZ2VTZWN0aW9uIGV4dGVuZHMgVmlld0Zvcm0gaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OID0gMTsKLS8vCXByaXZhdGUgUERFRm9ybVBhZ2UgZm9ybVBhZ2U7Ci0JcHJpdmF0ZSBTdHJpbmcgaGVhZGVyQ29sb3JLZXkgPSBXaWRnZXRGYWN0b3J5LkRFRkFVTFRfSEVBREVSX0NPTE9SOwotCXByaXZhdGUgU3RyaW5nIGhlYWRlclRleHQ7Ci0JcHJpdmF0ZSBDb250cm9sIGNsaWVudDsKLQlwcm90ZWN0ZWQgTGFiZWwgaGVhZGVyOwotCXByb3RlY3RlZCBDb250cm9sIHNlcGFyYXRvcjsKLS8vCXByaXZhdGUgU2VjdGlvbkNoYW5nZU1hbmFnZXIgc2VjdGlvbk1hbmFnZXI7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBkaXJ0eTsKLQlwcm90ZWN0ZWQgTGFiZWwgZGVzY3JpcHRpb25MYWJlbDsKLQlwcml2YXRlIFRvZ2dsZUNvbnRyb2wgdG9nZ2xlOwotCXByaXZhdGUgYm9vbGVhbiByZWFkT25seTsKLQlwcml2YXRlIGJvb2xlYW4gdGl0bGVBc0h5cGVybGluazsKLQlwcml2YXRlIGJvb2xlYW4gYWRkU2VwYXJhdG9yPXRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGRlc2NyaXB0aW9uUGFpbnRlZD10cnVlOwotCXByaXZhdGUgYm9vbGVhbiBoZWFkZXJQYWludGVkPXRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbGxhcHNhYmxlPWZhbHNlOwotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRyb2w7Ci0JCi0JCi0vKgotICogVGhpcyBpcyBhIHNwZWNpYWwgbGF5b3V0IGZvciB0aGUgc2VjdGlvbi4gQm90aCB0aGUKLSAqIGhlYWRlciBhbmQgdGhlIGRlc2NyaXB0aW9uIGxhYmVscyB3aWxsIHdyYXAgYW5kCi0gKiB0aGV5IHdpbGwgdXNlIGNsaWVudCdzIHNpemUgdG8gY2FsY3VsYXRlIG5lZWRlZAotICogaGVpZ2h0LiBUaGlzIGtpbmQgb2YgYmVoYXZpb3VyIGlzIG5vdCBwb3NzaWJsZQotICogd2l0aCBzdG9jayBncmlkIGxheW91dC4KLSAqLwotY2xhc3MgU2VjdGlvbkxheW91dCBleHRlbmRzIExheW91dCB7Ci0JaW50IHZzcGFjaW5nID0gMzsKLQlpbnQgc2VwSGVpZ2h0ID0gMjsKLQotCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoKSB7Ci0JCWludCB3aWR0aCA9IDA7Ci0JCWludCBoZWlnaHQgPSAwOwotCQlpbnQgY3dpZHRoID0gMDsKLQkJaW50IGNvbGxhcHNlZEhlaWdodCA9IDA7Ci0JCi0JCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkKLQkJICAgd2lkdGggPSB3SGludDsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJaGVpZ2h0ID0gaEhpbnQ7Ci0KLQkJY3dpZHRoID0gd2lkdGg7Ci0JCQkJCi0JCWlmIChjbGllbnQgIT0gbnVsbCkgewotCQkJUG9pbnQgY3NpemUgPSBjbGllbnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaCk7Ci0JCQlpZiAod2lkdGggPT0gMCkgewotCQkJCXdpZHRoID0gY3NpemUueDsKLQkJCQljd2lkdGggPSB3aWR0aDsKLQkJCX0KLQkJCWlmIChoZWlnaHQ9PTApIGhlaWdodCA9IGNzaXplLnk7Ci0JCX0KLQkJCi0JCVBvaW50IHRvZ2dsZVNpemUgPSBudWxsOwotCQkKLQkJaWYgKGNvbGxhcHNhYmxlICYmIHRvZ2dsZSE9bnVsbCkgCi0JCSAgICB0b2dnbGVTaXplID0gdG9nZ2xlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOwotCQkKLQkJaWYgKGhIaW50PT0gU1dULkRFRkFVTFQgJiYgaGVhZGVyUGFpbnRlZCAmJiBoZWFkZXIhPW51bGwpIHsKLQkJCWludCBod2lkdGggPSBjd2lkdGg7Ci0JCQlpZiAodG9nZ2xlU2l6ZSE9bnVsbCkKLQkJCSAgIGh3aWR0aCA9IGN3aWR0aCAtIHRvZ2dsZVNpemUueCAtIDU7Ci0JCQlQb2ludCBoc2l6ZSA9IGhlYWRlci5jb21wdXRlU2l6ZShod2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7Ci0JCQloZWlnaHQgKz0gaHNpemUueTsKLQkJCWNvbGxhcHNlZEhlaWdodCA9IGhzaXplLnk7Ci0JCQloZWlnaHQgKz0gdnNwYWNpbmc7Ci0JCX0KLQkJCi0JCWlmIChoSGludD09U1dULkRFRkFVTFQgJiYgYWRkU2VwYXJhdG9yKSB7Ci0JCQloZWlnaHQgKz0gc2VwSGVpZ2h0OwotCQkJaGVpZ2h0ICs9IHZzcGFjaW5nOwotCQkJY29sbGFwc2VkSGVpZ2h0ICs9IHZzcGFjaW5nICsgc2VwSGVpZ2h0OwotCQl9Ci0JCWlmIChoSGludCA9PSBTV1QuREVGQVVMVCAmJiBkZXNjcmlwdGlvblBhaW50ZWQgJiYgZGVzY3JpcHRpb25MYWJlbCE9bnVsbCkgewotCQkJUG9pbnQgZHNpemUgPSBkZXNjcmlwdGlvbkxhYmVsLmNvbXB1dGVTaXplKGN3aWR0aCwgU1dULkRFRkFVTFQsIGZsdXNoKTsKLQkJCWhlaWdodCArPSBkc2l6ZS55OwotCQkJaGVpZ2h0ICs9IHZzcGFjaW5nOwotCQl9Ci0JCWlmICh0b2dnbGUhPW51bGwgJiYgdG9nZ2xlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkvLyBjb2xsYXBzZWQgc3RhdGUKLQkJCWhlaWdodCA9IGNvbGxhcHNlZEhlaWdodDsKLQkJfQotCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBoZWlnaHQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBmbHVzaCkgewotCQlpbnQgd2lkdGggPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotCQlpbnQgaGVpZ2h0ID0gcGFyZW50LmdldENsaWVudEFyZWEoKS5oZWlnaHQ7Ci0JCWludCB5ID0gMDsKLQkJUG9pbnQgdG9nZ2xlU2l6ZT1udWxsOwotCQkKLQkJaWYgKGNvbGxhcHNhYmxlKSB7Ci0JCQl0b2dnbGVTaXplID0gdG9nZ2xlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOwotCQl9Ci0KLQkJaWYgKGhlYWRlclBhaW50ZWQgJiYgaGVhZGVyIT1udWxsKSB7Ci0JCQlQb2ludCBoc2l6ZTsKLQkJCQotCQkJaWYgKHRpdGxlQXNIeXBlcmxpbmspIHsKLQkJCQloc2l6ZSA9IGhlYWRlci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZsdXNoKTsKLQkJCQloZWFkZXIuc2V0Qm91bmRzKDAsIHksIGhzaXplLngsIGhzaXplLnkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IGF2YWlsYWJsZVdpZHRoID0gd2lkdGg7Ci0JCQkJaWYgKHRvZ2dsZVNpemUhPW51bGwpCi0JCQkJICAgYXZhaWxhYmxlV2lkdGggPSB3aWR0aCAtIHRvZ2dsZVNpemUueCAtIDU7Ci0JCQkJaHNpemUgPSBoZWFkZXIuY29tcHV0ZVNpemUoYXZhaWxhYmxlV2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7Ci0KLSAgICAgICAgaW50IGh4ID0gMDsKLQkJICAgCWlmICh0b2dnbGUhPW51bGwpIHsKLQkgICAJCQlpbnQgdHkgPSB5ICsgaHNpemUueSAtIHRvZ2dsZVNpemUueTsgLy8gKyB2c3BhY2luZzsKLQkJICAgCSAgdG9nZ2xlLnNldEJvdW5kcygwLCB0eSwgdG9nZ2xlU2l6ZS54LCB0b2dnbGVTaXplLnkpOwotICAgICAgICAgIGh4ID0gdG9nZ2xlU2l6ZS54OwotCQkgICAJfQotCQkJICBoZWFkZXIuc2V0Qm91bmRzKGh4LCB5LCBhdmFpbGFibGVXaWR0aCwgaHNpemUueSk7Ci0JCQl9Ci0JCQl5ICs9IGhzaXplLnkgKyB2c3BhY2luZzsKLQkJfQotCQlpZiAoYWRkU2VwYXJhdG9yICYmIHNlcGFyYXRvciE9bnVsbCkgewotCQkJc2VwYXJhdG9yLnNldEJvdW5kcygwLCB5LCB3aWR0aCwgMik7Ci0JCQl5ICs9IHNlcEhlaWdodCArIHZzcGFjaW5nOwotCQl9Ci0JCWlmICh0b2dnbGUhPW51bGwgJiYgdG9nZ2xlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGRlc2NyaXB0aW9uUGFpbnRlZCAmJiBkZXNjcmlwdGlvbkxhYmVsIT1udWxsKSB7Ci0JCQlQb2ludCBkc2l6ZSA9IGRlc2NyaXB0aW9uTGFiZWwuY29tcHV0ZVNpemUod2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7Ci0JCQlkZXNjcmlwdGlvbkxhYmVsLnNldEJvdW5kcygwLCB5LCB3aWR0aCwgZHNpemUueSk7Ci0JCQl5ICs9IGRzaXplLnkgKyB2c3BhY2luZzsKLQkJfQotCQlpZiAoY2xpZW50IT1udWxsKSB7Ci0JCQljbGllbnQuc2V0Qm91bmRzKDAsIHksIHdpZHRoLCBoZWlnaHQgLSB5KTsKLQkJfQotCX0KLX0KLQkKLQkKLXB1YmxpYyBGbGF0UGFnZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCS8vIERlc2NyaXB0aW9uIGNhdXNlcyBwcm9ibGVtcyByZSB3b3JkIHdyYXBwaW5nCi0JLy8gYW5kIGNhdXNlcyBiYWQgbGF5b3V0IGluIHNjaGVtYSBhbmQKLQkvLyBjb21wb25lbnQgZWRpdG9ycyB3aGVuIGluIE1vdGlmIC0gdHVybmluZyBvZmYKLQkKLQlzdXBlcihwYXJlbnQsIFNXVC5GTEFUKTsKLQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpKSB7Ci0JCWRlc2NyaXB0aW9uUGFpbnRlZCA9IGZhbHNlOwotCX0KLQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5hZGRMaXN0ZW5lcih0aGlzKTsKLX0KLXB1YmxpYyB2b2lkIGNvbW1pdENoYW5nZXMoYm9vbGVhbiBvblNhdmUpIHsKLX0KLXB1YmxpYyBhYnN0cmFjdCBDb21wb3NpdGUgY3JlYXRlQ2xpZW50KENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3RvcnkgZmFjdG9yeSk7Ci1wdWJsaWMgZmluYWwgQ29udHJvbCBjcmVhdGVDb250cm9sKAotCUNvbXBvc2l0ZSBwYXJlbnQsCi0JV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JQ29tcG9zaXRlIHNlY3Rpb24gPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCVNlY3Rpb25MYXlvdXQgc2xheW91dCA9IG5ldyBTZWN0aW9uTGF5b3V0KCk7Ci0Jc2VjdGlvbi5zZXRMYXlvdXQoc2xheW91dCk7Ci0Jc2VjdGlvbi5zZXREYXRhKHRoaXMpOwotCi0JR3JpZERhdGEgZ2Q7Ci0JaWYgKGhlYWRlclBhaW50ZWQpIHsKLQkJQ29sb3IgaGVhZGVyQ29sb3IgPSBmYWN0b3J5LmdldENvbG9yKGdldEhlYWRlckNvbG9yS2V5KCkpOwotCQloZWFkZXIgPSBmYWN0b3J5LmNyZWF0ZUhlYWRpbmdMYWJlbChzZWN0aW9uLCBnZXRIZWFkZXJUZXh0KCksIGhlYWRlckNvbG9yLCBTV1QuV1JBUCk7Ci0JCWlmICh0aXRsZUFzSHlwZXJsaW5rKSB7Ci0JCQlmYWN0b3J5LnR1cm5JbnRvSHlwZXJsaW5rKGhlYWRlciwgbmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChDb250cm9sIGxhYmVsKSB7Ci0JCQkJCXRpdGxlQWN0aXZhdGVkKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGNvbGxhcHNhYmxlKSB7Ci0JCQl0b2dnbGUgPSBuZXcgVG9nZ2xlQ29udHJvbChzZWN0aW9uLCBTV1QuTlVMTCk7Ci0JCQl0b2dnbGUuc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJCXRvZ2dsZS5zZXRBY3RpdmVEZWNvcmF0aW9uQ29sb3IoZmFjdG9yeS5nZXRIeXBlcmxpbmtDb2xvcigpKTsKLQkJCXRvZ2dsZS5zZXREZWNvcmF0aW9uQ29sb3IoZmFjdG9yeS5nZXRDb2xvcihXaWRnZXRGYWN0b3J5LkNPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IpKTsKLQkJCXRvZ2dsZS5zZXRBY3RpdmVDdXJzb3IoZmFjdG9yeS5nZXRIeXBlcmxpbmtDdXJzb3IoKSk7Ci0JCQl0b2dnbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkKLQkJCQkJYm9vbGVhbiBjb2xsYXBzZWQgPSB0b2dnbGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCXJlZmxvdygpOwotCQkJCQlpZiAoZGVzY3JpcHRpb25MYWJlbCE9bnVsbCkKLQkJCQkJCWRlc2NyaXB0aW9uTGFiZWwuc2V0VmlzaWJsZSghY29sbGFwc2VkKTsKLQkJCQkJaWYgKGNsaWVudCE9bnVsbCkKLQkJCQkJCWNsaWVudC5zZXRWaXNpYmxlKCFjb2xsYXBzZWQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0KLQlpZiAoYWRkU2VwYXJhdG9yKSB7Ci0gICAgICAgIC8vc2VwYXJhdG9yID0gZmFjdG9yeS5jcmVhdGVTZXBhcmF0b3Ioc2VjdGlvbiwgU1dULkhPUklaT05UQUwpOwotCQlzZXBhcmF0b3IgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihzZWN0aW9uKTsKLQl9Ci0JCi0JaWYgKGRlc2NyaXB0aW9uUGFpbnRlZCAmJiBkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCWRlc2NyaXB0aW9uTGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUxhYmVsKHNlY3Rpb24sIGRlc2NyaXB0aW9uLCBTV1QuV1JBUCk7Ci0JfQotCWNsaWVudCA9IGNyZWF0ZUNsaWVudChzZWN0aW9uLCBmYWN0b3J5KTsKLQlzZWN0aW9uLnNldERhdGEodGhpcyk7Ci0JY29udHJvbCA9IHNlY3Rpb247Ci0JcmV0dXJuIHNlY3Rpb247Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJlZmxvdygpIHsKLQljb250cm9sLmxheW91dCh0cnVlKTsKLQljb250cm9sLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQotICBXaWRnZXQgZ3JhbmRQYXJlbnQgPSBjb250cm9sLmdldFBhcmVudCgpLmdldFBhcmVudCgpOwotICBpZiAoZ3JhbmRQYXJlbnQgIT0gbnVsbCAmJiBncmFuZFBhcmVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkKLQkgICgoQ29tcG9zaXRlKWdyYW5kUGFyZW50KS5sYXlvdXQodHJ1ZSk7Ci0vKgotCVNlY3Rpb25Gb3JtIGZvcm0gPSBmb3JtUGFnZS5nZXRGb3JtKCk7Ci0JaWYgKGZvcm0gaW5zdGFuY2VvZiBTY3JvbGxhYmxlU2VjdGlvbkZvcm0pIHsKLQkJKChTY3JvbGxhYmxlU2VjdGlvbkZvcm0pZm9ybSkudXBkYXRlU2Nyb2xsQmFycygpOwotCX0KLSovCi19Ci0KLXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQlyZXR1cm4gY3JlYXRlVGV4dChwYXJlbnQsIGxhYmVsLCBmYWN0b3J5LCAxKTsKLX0KLXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBXaWRnZXRGYWN0b3J5IGZhY3RvcnksIGludCBzcGFuKSB7Ci0JZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIGxhYmVsKTsKLQlUZXh0IHRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQocGFyZW50LCAiIik7Ci0JR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlnZC5ob3Jpem9udGFsU3Bhbj1zcGFuOwotCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JcmV0dXJuIHRleHQ7Ci19Ci1wcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3RvcnkgZmFjdG9yeSwgaW50IHNwYW4pIHsKLQlUZXh0IHRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQocGFyZW50LCAiIik7Ci0JR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlnZC5ob3Jpem9udGFsU3Bhbj1zcGFuOwotCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JcmV0dXJuIHRleHQ7Ci19Ci1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCUpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCXN1cGVyLmRpc3Bvc2UoKTsKLX0KLXB1YmxpYyB2b2lkIGRvR2xvYmFsQWN0aW9uKFN0cmluZyBhY3Rpb25JZCkge30KLXB1YmxpYyB2b2lkIGV4cGFuZFRvKE9iamVjdCBvYmplY3QpIHt9Ci0vKgotcHVibGljIGZpbmFsIHZvaWQgZmlyZUNoYW5nZU5vdGlmaWNhdGlvbihpbnQgY2hhbmdlVHlwZSwgT2JqZWN0IGNoYW5nZU9iamVjdCkgewotCWlmIChzZWN0aW9uTWFuYWdlciA9PSBudWxsKQotCQlyZXR1cm47Ci0Jc2VjdGlvbk1hbmFnZXIuZGlzcGF0Y2hOb3RpZmljYXRpb24odGhpcywgY2hhbmdlVHlwZSwgY2hhbmdlT2JqZWN0KTsKLX0KLXB1YmxpYyBmaW5hbCB2b2lkIGZpcmVTZWxlY3Rpb25Ob3RpZmljYXRpb24oT2JqZWN0IGNoYW5nZU9iamVjdCkgewotCWZpcmVDaGFuZ2VOb3RpZmljYXRpb24oU0VMRUNUSU9OLCBjaGFuZ2VPYmplY3QpOwotfQotKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBkZXNjcmlwdGlvbjsKLX0KLS8qCi1wdWJsaWMgUERFRm9ybVBhZ2UgZ2V0Rm9ybVBhZ2UoKSB7Ci0JcmV0dXJuIGZvcm1QYWdlOwotfQotKi8KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGVhZGVyQ29sb3JLZXkoKSB7Ci0JcmV0dXJuIGhlYWRlckNvbG9yS2V5OwotfQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGVhZGVyVGV4dCgpIHsKLQlyZXR1cm4gaGVhZGVyVGV4dDsKLX0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IGlucHV0KSB7fQotCi1wdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCXJldHVybiBkaXJ0eTsKLX0KLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQlyZXR1cm4gcmVhZE9ubHk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc1RpdGxlQXNIeXBlcmxpbmsoKSB7Ci0JcmV0dXJuIHRpdGxlQXNIeXBlcmxpbms7Ci19Ci0vKgotcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElNb2RlbENoYW5nZWRFdmVudCBlKSB7Ci19Ci0qLwotcHVibGljIHZvaWQgc2VjdGlvbkNoYW5nZWQoRmxhdFBhZ2VTZWN0aW9uIHNvdXJjZSwgaW50IGNoYW5nZVR5cGUsIE9iamVjdCBjaGFuZ2VPYmplY3QpIHt9Ci1wdWJsaWMgdm9pZCBzZXRBZGRTZXBhcmF0b3IoYm9vbGVhbiBuZXdBZGRTZXBhcmF0b3IpIHsKLQlhZGRTZXBhcmF0b3IgPSBuZXdBZGRTZXBhcmF0b3I7Ci19Ci0KLQotcHJpdmF0ZSBTdHJpbmcgdHJpbU5ld0xpbmVzKFN0cmluZyB0ZXh0KSB7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaT0wOyBpPHRleHQubGVuZ3RoKCk7IGkrKykgewotCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsKLQkJaWYgKGM9PSdcbicpCi0JCSAgIGJ1ZmYuYXBwZW5kKCcgJyk7Ci0JCWVsc2UKLQkJICAgYnVmZi5hcHBlbmQoYyk7Ci0JfQotCXJldHVybiBidWZmLnRvU3RyaW5nKCk7Ci19Ci0JCi1wdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihqYXZhLmxhbmcuU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JLy8gd2Ugd2lsbCB0cmltIHRoZSBuZXcgbGluZXMgc28gdGhhdCB3ZSBjYW4KLQkvLyB1c2UgbGF5b3V0LWJhc2VkIHdvcmQgd3JhcHBpbmcgaW5zdGVhZAotCS8vIG9mIGhhcmQtY29kZWQgb25lCi0JZGVzY3JpcHRpb24gPSB0cmltTmV3TGluZXMobmV3RGVzY3JpcHRpb24pOwotCS8vZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQlpZiAoZGVzY3JpcHRpb25MYWJlbCE9bnVsbCkgZGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KG5ld0Rlc2NyaXB0aW9uKTsKLX0KLXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uUGFpbnRlZChib29sZWFuIG5ld0Rlc2NyaXB0aW9uUGFpbnRlZCkgewotCWRlc2NyaXB0aW9uUGFpbnRlZCA9IG5ld0Rlc2NyaXB0aW9uUGFpbnRlZDsKLX0KLXB1YmxpYyB2b2lkIHNldERpcnR5KGJvb2xlYW4gbmV3RGlydHkpIHsKLQlkaXJ0eSA9IG5ld0RpcnR5OwotfQotLyoKLXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotfQotKi8KLXB1YmxpYyB2b2lkIHNldEhlYWRlckNvbG9yS2V5KGphdmEubGFuZy5TdHJpbmcgbmV3SGVhZGVyQ29sb3JLZXkpIHsKLQloZWFkZXJDb2xvcktleSA9IG5ld0hlYWRlckNvbG9yS2V5OwotfQotcHVibGljIHZvaWQgc2V0SGVhZGVyUGFpbnRlZChib29sZWFuIG5ld0hlYWRlclBhaW50ZWQpIHsKLQloZWFkZXJQYWludGVkID0gbmV3SGVhZGVyUGFpbnRlZDsKLX0KLXB1YmxpYyB2b2lkIHNldEhlYWRlclRleHQoamF2YS5sYW5nLlN0cmluZyBuZXdIZWFkZXJUZXh0KSB7Ci0JaGVhZGVyVGV4dCA9IG5ld0hlYWRlclRleHQ7Ci0JaWYgKGhlYWRlciE9bnVsbCkgaGVhZGVyLnNldFRleHQoaGVhZGVyVGV4dCk7Ci19Ci0vKgotdm9pZCBzZXRNYW5hZ2VyKFNlY3Rpb25DaGFuZ2VNYW5hZ2VyIG1hbmFnZXIpIHsKLQl0aGlzLnNlY3Rpb25NYW5hZ2VyID0gbWFuYWdlcjsKLX0KLSovCi1wdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIG5ld1JlYWRPbmx5KSB7Ci0JcmVhZE9ubHkgPSBuZXdSZWFkT25seTsKLX0KLXB1YmxpYyB2b2lkIHNldFRpdGxlQXNIeXBlcmxpbmsoYm9vbGVhbiBuZXdUaXRsZUFzSHlwZXJsaW5rKSB7Ci0JdGl0bGVBc0h5cGVybGluayA9IG5ld1RpdGxlQXNIeXBlcmxpbms7Ci19Ci1wdWJsaWMgdm9pZCB0aXRsZUFjdGl2YXRlZCgpIHsKLX0KLS8qCi1wdWJsaWMgdm9pZCB1cGRhdGUoKSB7fQotKi8KLQotcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBhcmcwKSB7Ci0JaWYgKGNvbnRyb2whPW51bGwgJiYgaGVhZGVyIT1udWxsKSB7Ci0JICBpZiAoIWhlYWRlci5pc0Rpc3Bvc2VkKCkpCi0JCWhlYWRlci5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEJhbm5lckZvbnQoKSk7Ci0JICBpZiAoIWNvbnRyb2wuaXNEaXNwb3NlZCgpKQotCQljb250cm9sLmxheW91dCh0cnVlKTsKLQl9Ci19Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbGxhcHNhYmxlLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb2xsYXBzYWJsZSgpIHsKLQkJcmV0dXJuIGNvbGxhcHNhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbGxhcHNhYmxlLgotCSAqIEBwYXJhbSBjb2xsYXBzYWJsZSBUaGUgY29sbGFwc2FibGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sbGFwc2FibGUoYm9vbGVhbiBjb2xsYXBzYWJsZSkgewotCQl0aGlzLmNvbGxhcHNhYmxlID0gY29sbGFwc2FibGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9IeXBlcmxpbmtBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9IeXBlcmxpbmtBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNTJiYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvSHlwZXJsaW5rQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLmZsYXR1aTsKLQotcHVibGljIGNsYXNzIEh5cGVybGlua0FkYXB0ZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXJ7Ci0KLXB1YmxpYyBIeXBlcmxpbmtBZGFwdGVyKCkgewotICAgIHN1cGVyKCk7Ci19Ci1wdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgbGlua0xhYmVsKSB7fQotcHVibGljIHZvaWQgbGlua0VudGVyZWQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCBsaW5rTGFiZWwpIHt9Ci1wdWJsaWMgdm9pZCBsaW5rRXhpdGVkKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgbGlua0xhYmVsKSB7fQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9IeXBlcmxpbmtIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9IeXBlcmxpbmtIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZDNjMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvSHlwZXJsaW5rSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLXB1YmxpYyBjbGFzcyBIeXBlcmxpbmtIYW5kbGVyIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lciwgTW91c2VUcmFja0xpc3RlbmVyLCBQYWludExpc3RlbmVyIHsKLQotICAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMSU5FX05FVkVSID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFUkxJTkVfUk9MTE9WRVIgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVSTElORV9BTFdBWVMgPSAzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ3Vyc29yIGh5cGVybGlua0N1cnNvcjsKLSAgICBwcml2YXRlIHN0YXRpYyBDdXJzb3IgYnVzeUN1cnNvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaHlwZXJsaW5rQ3Vyc29yVXNlZD10cnVlOwotICAgIHByaXZhdGUgaW50IGh5cGVybGlua1VuZGVybGluZU1vZGU9VU5ERVJMSU5FX0FMV0FZUzsKLSAgICBwcml2YXRlIENvbG9yIGJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kOwotICAgIHByaXZhdGUgQ29sb3IgYWN0aXZlQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIENvbG9yIGFjdGl2ZUZvcmVncm91bmQ7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgaHlwZXJsaW5rTGlzdGVuZXJzOwotICAgIHByaXZhdGUgQ29udHJvbCBsYXN0TGluazsKLQotcHVibGljIEh5cGVybGlua0hhbmRsZXIoKSB7Ci0gICAgaHlwZXJsaW5rTGlzdGVuZXJzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGlmIChoeXBlcmxpbmtDdXJzb3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBoeXBlcmxpbmtDdXJzb3IgPSBuZXcgQ3Vyc29yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBTV1QuQ1VSU09SX0hBTkQpOwotICAgICAgYnVzeUN1cnNvciA9IG5ldyBDdXJzb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIFNXVC5DVVJTT1JfV0FJVCk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICBoeXBlcmxpbmtDdXJzb3IuZGlzcG9zZSgpOwotICAgIGJ1c3lDdXJzb3IuZGlzcG9zZSgpOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBnZXRBY3RpdmVCYWNrZ3JvdW5kKCkgewotICAgIHJldHVybiBhY3RpdmVCYWNrZ3JvdW5kOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBnZXRBY3RpdmVGb3JlZ3JvdW5kKCkgewotICAgIHJldHVybiBhY3RpdmVGb3JlZ3JvdW5kOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBnZXRCYWNrZ3JvdW5kKCkgewotICAgIHJldHVybiBiYWNrZ3JvdW5kOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3IgZ2V0QnVzeUN1cnNvcigpIHsKLSAgICByZXR1cm4gYnVzeUN1cnNvcjsKLX0KLXB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgZ2V0Rm9yZWdyb3VuZCgpIHsKLSAgICByZXR1cm4gZm9yZWdyb3VuZDsKLX0KLXB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yIGdldEh5cGVybGlua0N1cnNvcigpIHsKLSAgICByZXR1cm4gaHlwZXJsaW5rQ3Vyc29yOwotfQotcHVibGljIGludCBnZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCkgewotICAgIHJldHVybiBoeXBlcmxpbmtVbmRlcmxpbmVNb2RlOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgZ2V0TGFzdExpbmsoKSB7Ci0gICAgcmV0dXJuIGxhc3RMaW5rOwotfQotcHVibGljIGJvb2xlYW4gaXNIeXBlcmxpbmtDdXJzb3JVc2VkKCkgewotICAgIHJldHVybiBoeXBlcmxpbmtDdXJzb3JVc2VkOwotfQotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotICAgICAgICB9Ci1wdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0gICAgaWYgKGUuYnV0dG9uID09IDEpCi0gICAgICAgIHJldHVybjsKLSAgICBsYXN0TGluayA9IChDb250cm9sKWUud2lkZ2V0OwotfQotcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsKLSAgICBDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgZS53aWRnZXQ7Ci0gICAgaWYgKGlzSHlwZXJsaW5rQ3Vyc29yVXNlZCgpKQotICAgICAgICBjb250cm9sLnNldEN1cnNvcihoeXBlcmxpbmtDdXJzb3IpOwotICAgIGlmIChhY3RpdmVCYWNrZ3JvdW5kICE9IG51bGwpCi0gICAgICAgIGNvbnRyb2wuc2V0QmFja2dyb3VuZChhY3RpdmVCYWNrZ3JvdW5kKTsKLSAgICBpZiAoYWN0aXZlRm9yZWdyb3VuZCAhPSBudWxsKQotICAgICAgICBjb250cm9sLnNldEZvcmVncm91bmQoYWN0aXZlRm9yZWdyb3VuZCk7Ci0gICAgaWYgKGh5cGVybGlua1VuZGVybGluZU1vZGU9PVVOREVSTElORV9ST0xMT1ZFUikgdW5kZXJsaW5lKGNvbnRyb2wsIHRydWUpOyAgICAKLQotICAgIElIeXBlcmxpbmtMaXN0ZW5lciBhY3Rpb24gPQotICAgICAgICAoSUh5cGVybGlua0xpc3RlbmVyKSBoeXBlcmxpbmtMaXN0ZW5lcnMuZ2V0KGNvbnRyb2wpOwotICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgYWN0aW9uLmxpbmtFbnRlcmVkKGNvbnRyb2wpOwotfQotcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZSkgewotICAgIENvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBlLndpZGdldDsKLSAgICBpZiAoaXNIeXBlcmxpbmtDdXJzb3JVc2VkKCkpCi0gICAgICAgIGNvbnRyb2wuc2V0Q3Vyc29yKG51bGwpOwotICAgIGlmIChoeXBlcmxpbmtVbmRlcmxpbmVNb2RlPT1VTkRFUkxJTkVfUk9MTE9WRVIpCi0gICAgICAgIHVuZGVybGluZShjb250cm9sLCBmYWxzZSk7Ci0gICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkKLSAgICAgICAgY29udHJvbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotICAgIGlmIChmb3JlZ3JvdW5kICE9IG51bGwpCi0gICAgICAgIGNvbnRyb2wuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLSAgICBJSHlwZXJsaW5rTGlzdGVuZXIgYWN0aW9uID0KLSAgICAgICAgKElIeXBlcmxpbmtMaXN0ZW5lcikgaHlwZXJsaW5rTGlzdGVuZXJzLmdldChjb250cm9sKTsKLSAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICAgIGFjdGlvbi5saW5rRXhpdGVkKGNvbnRyb2wpOwotfQotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkgewotICAgICAgICB9Ci1wdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotICAgIGlmIChlLmJ1dHRvbiAhPSAxKQotICAgICAgICByZXR1cm47Ci0gICAgSUh5cGVybGlua0xpc3RlbmVyIGFjdGlvbiA9Ci0gICAgICAgIChJSHlwZXJsaW5rTGlzdGVuZXIpIGh5cGVybGlua0xpc3RlbmVycy5nZXQoZS53aWRnZXQpOwotICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgewotICAgICAgICBDb250cm9sIGMgPSAoQ29udHJvbCkgZS53aWRnZXQ7Ci0gICAgICAgIGMuc2V0Q3Vyc29yKGJ1c3lDdXJzb3IpOwotICAgICAgICBhY3Rpb24ubGlua0FjdGl2YXRlZChjKTsKLSAgICAgICAgaWYgKCFjLmlzRGlzcG9zZWQoKSkgCi0gICAgICAgICAgIGMuc2V0Q3Vyc29yKGlzSHlwZXJsaW5rQ3Vyc29yVXNlZCgpP2h5cGVybGlua0N1cnNvcjpudWxsKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0gICAgQ29udHJvbCBsYWJlbCA9IChDb250cm9sKSBlLndpZGdldDsKLSAgICBpZiAoaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9PSBVTkRFUkxJTkVfQUxXQVlTKQotICAgICAgICBIeXBlcmxpbmtIYW5kbGVyLnVuZGVybGluZShsYWJlbCwgdHJ1ZSk7Ci19Ci1wdWJsaWMgdm9pZCByZWdpc3Rlckh5cGVybGluayhDb250cm9sIGNvbnRyb2wsIElIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpCi0gICAgICAgIGNvbnRyb2wuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLSAgICBpZiAoZm9yZWdyb3VuZCAhPSBudWxsKQotICAgICAgICBjb250cm9sLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0gICAgY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOwotICAgIGNvbnRyb2wuYWRkTW91c2VUcmFja0xpc3RlbmVyKHRoaXMpOwotICAgIGlmIChoeXBlcmxpbmtVbmRlcmxpbmVNb2RlID09IFVOREVSTElORV9BTFdBWVMpCi0gICAgICAgIGNvbnRyb2wuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICBoeXBlcmxpbmtMaXN0ZW5lcnMucHV0KGNvbnRyb2wsIGxpc3RlbmVyKTsKLSAgICByZW1vdmVEaXNwb3NlZExpbmtzKCk7Ci19Ci1wcml2YXRlIHZvaWQgcmVtb3ZlRGlzcG9zZWRMaW5rcygpIHsKLSAgICBmb3IgKEVudW1lcmF0aW9uIGtleXMgPSBoeXBlcmxpbmtMaXN0ZW5lcnMua2V5cygpOyBrZXlzLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbClrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChjb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgaHlwZXJsaW5rTGlzdGVuZXJzLnJlbW92ZShjb250cm9sKTsKLSAgICAgICAgfQotICAgIH0KLX0KLXB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIGh5cGVybGlua0xpc3RlbmVycy5jbGVhcigpOwotfQotcHVibGljIHZvaWQgc2V0QWN0aXZlQmFja2dyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgbmV3QWN0aXZlQmFja2dyb3VuZCkgewotICAgIGFjdGl2ZUJhY2tncm91bmQgPSBuZXdBY3RpdmVCYWNrZ3JvdW5kOwotfQotcHVibGljIHZvaWQgc2V0QWN0aXZlRm9yZWdyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgbmV3QWN0aXZlRm9yZWdyb3VuZCkgewotICAgIGFjdGl2ZUZvcmVncm91bmQgPSBuZXdBY3RpdmVGb3JlZ3JvdW5kOwotfQotcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgbmV3QmFja2dyb3VuZCkgewotICAgIGJhY2tncm91bmQgPSBuZXdCYWNrZ3JvdW5kOwotfQotcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgbmV3Rm9yZWdyb3VuZCkgewotICAgIGZvcmVncm91bmQgPSBuZXdGb3JlZ3JvdW5kOwotfQotcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rQ3Vyc29yVXNlZChib29sZWFuIG5ld0h5cGVybGlua0N1cnNvclVzZWQpIHsKLSAgICBoeXBlcmxpbmtDdXJzb3JVc2VkID0gbmV3SHlwZXJsaW5rQ3Vyc29yVXNlZDsKLX0KLXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1VuZGVybGluZU1vZGUoaW50IG5ld0h5cGVybGlua1VuZGVybGluZU1vZGUpIHsKLSAgICBoeXBlcmxpbmtVbmRlcmxpbmVNb2RlID0gbmV3SHlwZXJsaW5rVW5kZXJsaW5lTW9kZTsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlcmxpbmUoQ29udHJvbCBjb250cm9sLCBib29sZWFuIGluc2lkZSkgewotICAgIGlmICghKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbCkpCi0gICAgICAgIHJldHVybjsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTsKLSAgICBSZWN0YW5nbGUgYm91bmRzID0gY29udHJvbC5nZXRCb3VuZHMoKTsKLSAgICBHQyBnYyA9IG5ldyBHQyhwYXJlbnQpOwotICAgIENvbG9yIGNvbG9yID0gaW5zaWRlPyBjb250cm9sLmdldEZvcmVncm91bmQoKSA6IGNvbnRyb2wuZ2V0QmFja2dyb3VuZCgpOwotICAgIGdjLnNldEZvcmVncm91bmQoY29sb3IpOwotICAgIGludCB5ID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0OwotICAgIGdjLmRyYXdMaW5lKGJvdW5kcy54LCB5LCBib3VuZHMueCtib3VuZHMud2lkdGgsIHkpOwotICAgIGdjLmRpc3Bvc2UoKTsKLX0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvZmxhdHVpL0lIeXBlcmxpbmtMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvSUh5cGVybGlua0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZGZiYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvSUh5cGVybGlua0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuZmxhdHVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotcHVibGljIGludGVyZmFjZSBJSHlwZXJsaW5rTGlzdGVuZXIgewotCi0gIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rTGFiZWwpOwotICBwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChDb250cm9sIGxpbmtMYWJlbCk7Ci0gIHB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoQ29udHJvbCBsaW5rTGFiZWwpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9Ub2dnbGVDb250cm9sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9Ub2dnbGVDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MmNmMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvVG9nZ2xlQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHlwZWRMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIFRvZ2dsZUNvbnRyb2wgZXh0ZW5kcyBDYW52YXMgewotICBwcml2YXRlIGJvb2xlYW4gZkNvbGxhcHNlZDsKLSAgcHJpdmF0ZSBDb2xvciBmRGVjb3JhdGlvbkNvbG9yOwotICBwcml2YXRlIENvbG9yIGZBY3RpdmVDb2xvcjsKLSAgcHJpdmF0ZSBDdXJzb3IgZkFjdGl2ZUN1cnNvcjsKLSAgcHJpdmF0ZSBib29sZWFuIGZIYXNGb2N1czsKLSAgcHJpdmF0ZSBib29sZWFuIGZIb3ZlciA9IGZhbHNlOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFSR0lOX1dJRFRIID0gMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BUkdJTl9IRUlHSFQgPSAyOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hFSUdIVCA9IDg7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEVYUEFOREVEX1BPSU5UUyA9IHsgMCwgMiwgOCwgMiwgNCwgNiB9OyAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ09MTEFQU0VEX1BPSU5UUyA9IHsgMiwgMCwgMiwgOCwgNiwgNCB9OyAKLSAgcHJpdmF0ZSBpbnQgZk11bHRpcGxpZXIgPSAyOwotICBwcml2YXRlIGludCBmSGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7ICAKLQotICAvKiBhY2Nlc3NpYmlsaXR5ICovCi0gIHByaXZhdGUgU3RyaW5nIGZOYW1lOwotICBwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb247Ci0KLSAgcHVibGljIFRvZ2dsZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgaW5pdEFjY2Vzc2libGUoKTsKLQotICAgIGFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0gICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0gICAgICAgIHBhaW50KGUpOwotICAgICAgfQotICAgIH0pOwotICAgIGFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24pOwotICAgICAgfQotICAgIH0pOwotICAgIGFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgIGlmIChlLmNoYXJhY3RlciA9PSAnXHInIHx8IGUuY2hhcmFjdGVyID09ICcgJykgewotICAgICAgICAgIC8vIEFjdGl2YXRpb24KLSAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBhZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgaWYgKGUuZGV0YWlsICE9IFNXVC5UUkFWRVJTRV9SRVRVUk4pCi0gICAgICAgICAgZS5kb2l0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBhZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0xpc3RlbmVyKCkgewotICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgIGlmICghZkhhc0ZvY3VzKSB7Ci0gICAgICAgICAgZkhhc0ZvY3VzID0gdHJ1ZTsKLSAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotICAgICAgICBpZiAoZkhhc0ZvY3VzKSB7Ci0gICAgICAgICAgZkhhc0ZvY3VzID0gZmFsc2U7Ci0gICAgICAgICAgcmVkcmF3KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICBmQ29sbGFwc2VkID0gIWZDb2xsYXBzZWQ7Ci0gICAgICAgIHJlZHJhdygpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgYWRkTW91c2VUcmFja0xpc3RlbmVyKG5ldyBNb3VzZVRyYWNrQWRhcHRlcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgIGZIb3ZlciA9IHRydWU7Ci0gICAgICAgIGlmIChmQWN0aXZlQ3Vyc29yICE9IG51bGwpCi0gICAgICAgICAgc2V0Q3Vyc29yKGZBY3RpdmVDdXJzb3IpOwotICAgICAgICByZWRyYXcoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgZkhvdmVyID0gZmFsc2U7Ci0gICAgICAgIGlmIChmQWN0aXZlQ3Vyc29yICE9IG51bGwpCi0gICAgICAgICAgc2V0Q3Vyc29yKG51bGwpOwotICAgICAgICByZWRyYXcoKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgY2hlY2tXaWRnZXQoKTsKLSAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgIGFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBUeXBlZExpc3RlbmVyKGxpc3RlbmVyKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZWNvcmF0aW9uQ29sb3IoQ29sb3IgZGVjb3JhdGlvbkNvbG9yKSB7Ci0gICAgdGhpcy5mRGVjb3JhdGlvbkNvbG9yID0gZGVjb3JhdGlvbkNvbG9yOwotICB9Ci0KLSAgcHVibGljIENvbG9yIGdldERlY29yYXRpb25Db2xvcigpIHsKLSAgICByZXR1cm4gZkRlY29yYXRpb25Db2xvcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZURlY29yYXRpb25Db2xvcihDb2xvciBhY3RpdmVDb2xvcikgewotICAgIHRoaXMuZkFjdGl2ZUNvbG9yID0gYWN0aXZlQ29sb3I7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCi0gICAgICByZW1vdmVMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVDdXJzb3IoQ3Vyc29yIGFjdGl2ZUN1cnNvcikgewotICAgIHRoaXMuZkFjdGl2ZUN1cnNvciA9IGFjdGl2ZUN1cnNvcjsKLSAgfQotCi0gIHB1YmxpYyBDb2xvciBnZXRBY3RpdmVEZWNvcmF0aW9uQ29sb3IoKSB7Ci0gICAgcmV0dXJuIGZBY3RpdmVDb2xvcjsKLSAgfQotCi0gIHB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0KLSAgICByZXR1cm4gbmV3IFBvaW50KCh3SGludCAhPSBTV1QuREVGQVVMVCA/IHdIaW50IDogZkhlaWdodCArIDIgKiBNQVJHSU5fV0lEVEgpLCAoaEhpbnQgIT0gU1dULkRFRkFVTFQgPyBoSGludCA6IGZIZWlnaHQgKyAyICogTUFSR0lOX0hFSUdIVCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7Ci0gICAgR0MgZ2MgPSBlLmdjOwotICAgIFBvaW50IHNpemUgPSBnZXRTaXplKCk7Ci0gICAgZ2Muc2V0Rm9udChnZXRGb250KCkpOwotICAgIHBhaW50KGdjKTsKLSAgICBpZiAoZkhhc0ZvY3VzKSB7Ci0gICAgICBnYy5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0gICAgICBnYy5kcmF3Rm9jdXMoMCwgMCwgc2l6ZS54LCBzaXplLnkpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgU2VsZWN0YWJsZUNvbnRyb2wjcGFpbnQoR0MpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwYWludChHQyBnYykgewotICAgIGlmIChmSG92ZXIgJiYgZkFjdGl2ZUNvbG9yICE9IG51bGwpCi0gICAgICBnYy5zZXRCYWNrZ3JvdW5kKGZBY3RpdmVDb2xvcik7Ci0gICAgZWxzZSBpZiAoZkRlY29yYXRpb25Db2xvciAhPSBudWxsKQotICAgICAgZ2Muc2V0QmFja2dyb3VuZChmRGVjb3JhdGlvbkNvbG9yKTsKLSAgICBlbHNlCi0gICAgICBnYy5zZXRCYWNrZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0gICAgUG9pbnQgc2l6ZSA9IGdldFNpemUoKTsKLSAgICBnYy5maWxsUG9seWdvbih0cmFuc2xhdGUoKGZDb2xsYXBzZWQgPyBDT0xMQVBTRURfUE9JTlRTIDogRVhQQU5ERURfUE9JTlRTKSwgKChzaXplLnggLSBmSGVpZ2h0KSAvIDIpLCAoKHNpemUueSAtIGZIZWlnaHQpIC8gMikpKTsKLSAgICBnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0gIH0KLQotICBwcml2YXRlIGludFtdIHRyYW5zbGF0ZShpbnRbXSBkYXRhLCBpbnQgeCwgaW50IHkpIHsKLSAgICBpbnRbXSB0YXJnZXQgPSBuZXcgaW50W2RhdGEubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgIHRhcmdldFtpXSA9IGRhdGFbaV0qZkhlaWdodC9ERUZBVUxUX0hFSUdIVCArIHg7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgdGFyZ2V0W2ldID0gZGF0YVtpXSpmSGVpZ2h0L0RFRkFVTFRfSEVJR0hUICsgeTsKLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCB5KSB7Ci0gICAgZkhlaWdodCA9IHk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBldmVudFR5cGUpIHsKLSAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotICAgIGV2ZW50LnR5cGUgPSBldmVudFR5cGU7Ci0gICAgZXZlbnQud2lkZ2V0ID0gdGhpczsKLSAgICBub3RpZnlMaXN0ZW5lcnMoZXZlbnRUeXBlLCBldmVudCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGZDb2xsYXBzZWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oYm9vbGVhbiBzZWxlY3Rpb24pIHsKLSAgICB0aGlzLmZDb2xsYXBzZWQgPSBzZWxlY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgZk5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdEFjY2Vzc2libGUoKSB7Ci0gICAgZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgICAgZS5yZXN1bHQgPSBmTmFtZTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZ2V0RGVzY3JpcHRpb24oQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgICAgZS5yZXN1bHQgPSBmRGVzY3JpcHRpb247Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBnZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCBnZXRMb2NhdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgUmVjdGFuZ2xlIGxvY2F0aW9uID0gZ2V0Qm91bmRzKCk7Ci0gICAgICAgIFBvaW50IHB0ID0gdG9EaXNwbGF5KG5ldyBQb2ludChsb2NhdGlvbi54LCBsb2NhdGlvbi55KSk7Ci0gICAgICAgIGUueCA9IHB0Lng7Ci0gICAgICAgIGUueSA9IHB0Lnk7Ci0gICAgICAgIGUud2lkdGggPSBsb2NhdGlvbi53aWR0aDsKLSAgICAgICAgZS5oZWlnaHQgPSBsb2NhdGlvbi5oZWlnaHQ7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgIGUuZGV0YWlsID0gMDsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgZS5kZXRhaWwgPSBBQ0MuUk9MRV9UUkVFOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBnZXRTdGF0ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgZS5kZXRhaWwgPSBmQ29sbGFwc2VkID8gQUNDLlNUQVRFX0NPTExBUFNFRCA6IEFDQy5TVEFURV9FWFBBTkRFRDsKLSAgICAgIH0KLQotICAgIH0pOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvZmxhdHVpL1dpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvZmxhdHVpL1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4ZmU2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9XaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLmZsYXR1aTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgV2lkZ2V0RmFjdG9yeSB7CQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0hFQURFUl9DT0xPUiA9ICJfX2RlZmF1bHRfX2hlYWRlcl9fIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfQkFDS0dST1VORCA9ICJfX2JnIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfQk9SREVSID0gIl9fYm9yZGVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfQ09NUE9TSVRFX1NFUEFSQVRPUiA9ICJfX2NvbXBTZXAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9IWVBFUkxJTks9Il9faHlwZXJsaW5rIjsKLSAgICAKLSAgcHJpdmF0ZSBIYXNodGFibGUgY29sb3JSZWdpc3RyeSA9IG5ldyBIYXNodGFibGUoKTsKLSAgcHJpdmF0ZSBDb2xvciBiYWNrZ3JvdW5kQ29sb3I7Ci0gIHByaXZhdGUgQ29sb3IgY2xpZW50QXJlYUNvbG9yOwotICBwcml2YXRlIEtleUxpc3RlbmVyIGRlbGV0ZUxpc3RlbmVyOwotICBwcml2YXRlIENvbG9yIGZvcmVncm91bmRDb2xvcjsKLSAgcHJpdmF0ZSBDb2xvciBmUmVhZE9ubHlDb2xvcjsKLSAgcHJpdmF0ZSBEaXNwbGF5IGZEaXNwbGF5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1JERVJfU1RZTEUgPSBTV1QuTk9ORTsKLSAgcHJpdmF0ZSBCb3JkZXJQYWludGVyIGJvcmRlclBhaW50ZXI7Ci0gIHByaXZhdGUgQ29sb3IgYm9yZGVyQ29sb3I7Ci0gIHByaXZhdGUgSHlwZXJsaW5rSGFuZGxlciBoeXBlcmxpbmtIYW5kbGVyOwotICBwcml2YXRlIHN0YXRpYyBJbWFnZSBmQmFubmVyOwotICAKLQotICBjbGFzcyBCb3JkZXJQYWludGVyIGltcGxlbWVudHMgUGFpbnRMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ29udHJvbCBjID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgLy9pZiAoYy5pc0VuYWJsZWQoKT09ZmFsc2UpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgVGV4dAotICAgICAgICAgICAgICAgICAgICB8fCBjIGluc3RhbmNlb2YgQ2FudmFzCi0gICAgICAgICAgICAgICAgICAgIHx8IGMgaW5zdGFuY2VvZiBDQ29tYm8pIHsKLSAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGIgPSBjLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgICAgICBHQyBnYyA9IGV2ZW50LmdjOwotICAgICAgICAgICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGMuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMSwgYi5oZWlnaHQgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDIsIGIueSAtIDIsIGIud2lkdGggKyAzLCBiLmhlaWdodCArIDMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjIGluc3RhbmNlb2YgVGFibGUKLSAgICAgICAgICAgICAgICAgICAgfHwgYyBpbnN0YW5jZW9mIFRyZWUKLSAgICAgICAgICAgICAgICAgICAgfHwgYyBpbnN0YW5jZW9mIFRhYmxlVHJlZSkgewotICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGUgYiA9IGMuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIEdDIGdjID0gZXZlbnQuZ2M7Ci0gICAgICAgICAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IpOwotICAgICAgICAgICAgICAgICAgICAvL2djLmRyYXdSZWN0YW5nbGUoYi54IC0gMiwgYi55IC0gMiwgYi53aWR0aCArIDMsIGIuaGVpZ2h0ICsgMyk7Ci0gICAgICAgICAgICAgICAgICAgIGdjLmRyYXdSZWN0YW5nbGUoYi54LTEsIGIueS0xLCBiLndpZHRoKzIsIGIuaGVpZ2h0KzIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi1wdWJsaWMgV2lkZ2V0RmFjdG9yeSgpIHsKLSAJZkRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLSAgICBpbml0aWFsaXplKCk7Ci19Ci0KLXB1YmxpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLSAgICBpbnQgZmxhdFN0eWxlID0gQk9SREVSX1NUWUxFID09IFNXVC5CT1JERVIgPyBTV1QuTlVMTCA6IFNXVC5GTEFUOwotICAgIC8vaW50IGZsYXRTdHlsZSA9IFNXVC5OVUxMOwotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgc3R5bGUgfCBmbGF0U3R5bGUpOwotICAgIGJ1dHRvbi5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0gICAgYnV0dG9uLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICBpZiAodGV4dCE9bnVsbCkgYnV0dG9uLnNldFRleHQodGV4dCk7Ci0gICAgcmV0dXJuIGJ1dHRvbjsKLX0KLXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotfQotcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBzdHlsZSk7Ci0gICAgY29tcG9zaXRlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotfQotcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGVTZXBhcmF0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKGdldENvbG9yKENPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IpKTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotfQotcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuU0hBRE9XX05PTkUpOwotCWdyb3VwLnNldFRleHQodGV4dCk7Ci0gICAgZ3JvdXAuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgIGdyb3VwLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLQlyZXR1cm4gZ3JvdXA7Ci19Ci1wdWJsaWMgTGFiZWwgY3JlYXRlSGVhZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBDb2xvciBiZykgewotICAgIHJldHVybiBjcmVhdGVIZWFkaW5nTGFiZWwocGFyZW50LCB0ZXh0LCBiZywgU1dULk5PTkUpOwotfQotcHVibGljIExhYmVsIGNyZWF0ZUhlYWRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgQ29sb3IgYmcsIGludCBzdHlsZSkgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgc3R5bGUpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgbGFiZWwuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgIGxhYmVsLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICBsYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChKRmFjZVJlc291cmNlcy5CQU5ORVJfRk9OVCkpOwotICAgIHJldHVybiBsYWJlbDsKLX0KLXB1YmxpYyBMYWJlbCBjcmVhdGVIeXBlcmxpbmtMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgSUh5cGVybGlua0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUh5cGVybGlua0xhYmVsKHBhcmVudCwgdGV4dCwgbGlzdGVuZXIsIFNXVC5OVUxMKTsKLX0KLXB1YmxpYyBMYWJlbCBjcmVhdGVIeXBlcmxpbmtMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgSUh5cGVybGlua0xpc3RlbmVyIGxpc3RlbmVyLCBpbnQgc3R5bGUpIHsKLSAgICBMYWJlbCBsYWJlbCA9IGNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCwgc3R5bGUpOwotICAgIHR1cm5JbnRvSHlwZXJsaW5rKGxhYmVsLCBsaXN0ZW5lcik7Ci0gICAgcmV0dXJuIGxhYmVsOwotfQotcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCwgU1dULk5PTkUpOwotfQotcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIHN0eWxlKTsKLSAgICBpZiAodGV4dCE9bnVsbCkgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgICBsYWJlbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotICAgIHJldHVybiBsYWJlbDsKLX0KLXB1YmxpYyBMYWJlbCBjcmVhdGVTZXBhcmF0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgc3R5bGUpOwotICAgIGxhYmVsLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kKGJvcmRlckNvbG9yKTsKLSAgICByZXR1cm4gbGFiZWw7Ci19Ci1wdWJsaWMgU2Nyb2xsZWRDb21wb3NpdGUgY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUgKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlTY3JvbGxlZENvbXBvc2l0ZSBzY3JvbGxlZGNvbXBvc2l0ZSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgc2Nyb2xsZWRjb21wb3NpdGUuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgIHNjcm9sbGVkY29tcG9zaXRlLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICByZXR1cm4gc2Nyb2xsZWRjb21wb3NpdGU7Ci19Ci1wdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBCT1JERVJfU1RZTEUgfCBzdHlsZSk7Ci0gICAgdGFibGUuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgIHRhYmxlLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICAvL2hvb2tEZWxldGVMaXN0ZW5lcih0YWJsZSk7Ci0gICAgcmV0dXJuIHRhYmxlOwotfQotcHVibGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gY3JlYXRlVGV4dChwYXJlbnQsIHZhbHVlLCBCT1JERVJfU1RZTEUgfCBTV1QuU0lOR0xFKTsKLX0KLXB1YmxpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHZhbHVlLCBpbnQgc3R5bGUpIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIHN0eWxlKTsKLSAgICB0ZXh0LnNldFRleHQodmFsdWUpOwotICAgIHRleHQuc2V0QmFja2dyb3VuZChjbGllbnRBcmVhQ29sb3IpOwotICAgIHRleHQuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotICAgIGlmICgoc3R5bGUgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKQotICAgIAl0ZXh0LnNldEZvcmVncm91bmQoZlJlYWRPbmx5Q29sb3IpOwotICAgIHJldHVybiB0ZXh0OwotfQotcHVibGljIFRyZWUgY3JlYXRlVHJlZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICBUcmVlIHRyZWUgPSBuZXcgVHJlZShwYXJlbnQsIEJPUkRFUl9TVFlMRSB8IHN0eWxlKTsKLSAgICB0cmVlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLSAgICB0cmVlLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICAvL2hvb2tEZWxldGVMaXN0ZW5lcih0cmVlKTsKLSAgICByZXR1cm4gdHJlZTsKLX0KLS8qIAotcHJpdmF0ZSB2b2lkIGRlbGV0ZUtleVByZXNzZWQoV2lkZ2V0IHdpZGdldCkgewotICAgIGlmICghKHdpZGdldCBpbnN0YW5jZW9mIENvbnRyb2wpKSByZXR1cm47Ci0gICAgQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpd2lkZ2V0OwotICAgIGZvciAoQ29udHJvbCBwYXJlbnQgPSBjb250cm9sLmdldFBhcmVudCgpOwotICAgICAgICBwYXJlbnQgIT0gbnVsbDsKLSAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKSB7Ci0gICAgICAgIGlmIChwYXJlbnQuZ2V0RGF0YSgpIGluc3RhbmNlb2YgRm9ybVNlY3Rpb24pIHsKLSAgICAgICAgICAgIEZvcm1TZWN0aW9uIHNlY3Rpb24gPSAoRm9ybVNlY3Rpb24pIHBhcmVudC5nZXREYXRhKCk7Ci0gICAgICAgICAgICBzZWN0aW9uLmRvR2xvYmFsQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuREVMRVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotKi8KLXB1YmxpYyBWaWV3Rm9ybSBjcmVhdGVWaWV3Rm9ybShDb21wb3NpdGUgcGFyZW50KSB7Ci0JVmlld0Zvcm0gdmlld0Zvcm0gPSBuZXcgVmlld0Zvcm0ocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgdmlld0Zvcm0uc2V0QmFja2dyb3VuZChjbGllbnRBcmVhQ29sb3IpOwotICAgIHZpZXdGb3JtLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICByZXR1cm4gdmlld0Zvcm07Ci19Ci1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIEVudW1lcmF0aW9uIGNvbG9ycz0gY29sb3JSZWdpc3RyeS5lbGVtZW50cygpOwotICAgIHdoaWxlIChjb2xvcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgQ29sb3IgYyA9IChDb2xvciljb2xvcnMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgYy5kaXNwb3NlKCk7Ci0gICAgfQotICAgIGh5cGVybGlua0hhbmRsZXIuZGlzcG9zZSgpOwotICAgIGNvbG9yUmVnaXN0cnk9bnVsbDsKLSAgICBpZiAoZkJhbm5lciAhPSBudWxsKQotICAgIHsKLSAgICAgIGZCYW5uZXIuZGlzcG9zZSgpOwotICAgICAgZkJhbm5lciA9IG51bGw7Ci0gICAgfQotfQotcHVibGljIENvbG9yIGdldEJhY2tncm91bmRDb2xvcigpIHsKLSAgICByZXR1cm4gYmFja2dyb3VuZENvbG9yOwotfQotcHVibGljIEltYWdlIGdldEJhbm5lcigpIHsKLSAgaWYgKGZCYW5uZXIgPT0gbnVsbCkKLSAgewotICAgIHRyeSB7Ci0gICAgICBmQmFubmVyID0gKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ldyBVUkwoKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpKSwgImljb25zXGZvcm1fYmFubmVyLmdpZiIpKSkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRlZCBJbWFnZSEhISEgIik7Ci0gICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uISEhISAiICsgZSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmQmFubmVyOwotfQotcHVibGljIENvbG9yIGdldEJvcmRlckNvbG9yKCkgewotICAgIHJldHVybiBib3JkZXJDb2xvcjsKLX0KLXB1YmxpYyBDdXJzb3IgZ2V0QnVzeUN1cnNvcigpIHsKLSAgICByZXR1cm4gaHlwZXJsaW5rSGFuZGxlci5nZXRCdXN5Q3Vyc29yKCk7Ci19Ci1wdWJsaWMgQ29sb3IgZ2V0Q2xpZW50QXJlYUNvbG9yKCkgewotICAgIHJldHVybiBjbGllbnRBcmVhQ29sb3I7Ci19Ci1wdWJsaWMgQ29sb3IgZ2V0Q29sb3IoU3RyaW5nIGtleSkgewotICAgIHJldHVybiAoQ29sb3IpY29sb3JSZWdpc3RyeS5nZXQoa2V5KTsKLX0KLXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kQ29sb3IoKSB7Ci0gICAgcmV0dXJuIGZvcmVncm91bmRDb2xvcjsKLX0KLXB1YmxpYyBDb2xvciBnZXRIeXBlcmxpbmtDb2xvcigpIHsKLSAgICByZXR1cm4gaHlwZXJsaW5rSGFuZGxlci5nZXRGb3JlZ3JvdW5kKCk7Ci19Ci1wdWJsaWMgQ3Vyc29yIGdldEh5cGVybGlua0N1cnNvcigpIHsKLSAgICByZXR1cm4gaHlwZXJsaW5rSGFuZGxlci5nZXRIeXBlcmxpbmtDdXJzb3IoKTsKLX0KLXB1YmxpYyBDb2xvciBnZXRIeXBlcmxpbmtIb3ZlckNvbG9yKCkgewotICAgIHJldHVybiBoeXBlcmxpbmtIYW5kbGVyLmdldEFjdGl2ZUZvcmVncm91bmQoKTsKLX0KLXB1YmxpYyBpbnQgZ2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSgpIHsKLSAgICByZXR1cm4gaHlwZXJsaW5rSGFuZGxlci5nZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCk7Ci19Ci0vKgotcHVibGljIHZvaWQgaG9va0RlbGV0ZUxpc3RlbmVyKENvbnRyb2wgY29udHJvbCkgewotICAgIGlmIChkZWxldGVMaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgIGRlbGV0ZUxpc3RlbmVyID0gbmV3IEtleUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuREVMICYmIGV2ZW50LnN0YXRlTWFzayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUtleVByZXNzZWQoZXZlbnQud2lkZ2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIGNvbnRyb2wuYWRkS2V5TGlzdGVuZXIoZGVsZXRlTGlzdGVuZXIpOwotfQotKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRTdGF0aWNDb2xvcnMoKQotICB7Ci0gICAgaWYgKGNvbG9yUmVnaXN0cnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb2xvclJlZ2lzdHJ5ID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgcmVnaXN0ZXJDb2xvcihDT0xPUl9CQUNLR1JPVU5ELCAweGZmLCAweGZlLCAweGY5KTsKLSAgICAgIHJlZ2lzdGVyQ29sb3IoQ09MT1JfQk9SREVSLCAxOTUsIDE5MSwgMTc5KTsKLSAgICAgIHJlZ2lzdGVyQ29sb3IoQ09MT1JfQ09NUE9TSVRFX1NFUEFSQVRPUiwgMTUyLCAxNzAsIDIwMyk7Ci0gICAgICByZWdpc3RlckNvbG9yKERFRkFVTFRfSEVBREVSX0NPTE9SLCAweDQ4LCAweDcwLCAweDk4KTsKLSAgICAgIHJlZ2lzdGVyQ29sb3IoQ09MT1JfSFlQRVJMSU5LLCAwLCAwLCAxNTMpOwotICAgIH0KLSAgfQotCi1wcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICBjbGllbnRBcmVhQ29sb3IgPSBmRGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLSAgICBmUmVhZE9ubHlDb2xvciA9IGZEaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9EQVJLX0dSQVkpOwotICAgIGluaXRTdGF0aWNDb2xvcnMoKTsKLSAgICBiYWNrZ3JvdW5kQ29sb3IgPSBjbGllbnRBcmVhQ29sb3I7Ci0gICAgYm9yZGVyQ29sb3IgPSBnZXRDb2xvcihDT0xPUl9CT1JERVIpOwotICAgIGZvcmVncm91bmRDb2xvciA9IGZEaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotICAgIGh5cGVybGlua0hhbmRsZXIgPSBuZXcgSHlwZXJsaW5rSGFuZGxlcigpOwotICAgIGh5cGVybGlua0hhbmRsZXIuc2V0Rm9yZWdyb3VuZChnZXRDb2xvcihDT0xPUl9IWVBFUkxJTkspKTsKLSAgICBoeXBlcmxpbmtIYW5kbGVyLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLX0KLXB1YmxpYyB2b2lkIHBhaW50Qm9yZGVyc0ZvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgaWYgKEJPUkRFUl9TVFlMRSA9PSBTV1QuQk9SREVSKSByZXR1cm47Ci0gICAgaWYgKGJvcmRlclBhaW50ZXI9PW51bGwpIGJvcmRlclBhaW50ZXIgPSBuZXcgQm9yZGVyUGFpbnRlcigpOwotICAgIHBhcmVudC5hZGRQYWludExpc3RlbmVyKGJvcmRlclBhaW50ZXIpOwotfQotcHVibGljIENvbG9yIHJlZ2lzdGVyQ29sb3IoU3RyaW5nIGtleSwgaW50IHIsIGludCBnLCBpbnQgYikgewotICAgIENvbG9yIGMgPSBuZXcgQ29sb3IoZkRpc3BsYXksIHIsIGcsIGIpOwotICAgIGNvbG9yUmVnaXN0cnkucHV0KGtleSwgYyk7Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldENsaWVudEFyZWFDb2xvcihDb2xvciBjb2xvcikKLXsKLSAgY2xpZW50QXJlYUNvbG9yID0gY29sb3I7Ci0gIGJhY2tncm91bmRDb2xvciA9IGNsaWVudEFyZWFDb2xvcjsKLX0KLQotcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rQ29sb3IoQ29sb3IgY29sb3IpIHsKLSAgICBoeXBlcmxpbmtIYW5kbGVyLnNldEZvcmVncm91bmQoY29sb3IpOwotfQotcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rSG92ZXJDb2xvcihvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgaG92ZXJDb2xvcikgewotICAgIGh5cGVybGlua0hhbmRsZXIuc2V0QWN0aXZlRm9yZWdyb3VuZChob3ZlckNvbG9yKTsKLX0KLXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1VuZGVybGluZU1vZGUoaW50IG5ld0h5cGVybGlua1VuZGVybGluZU1vZGUpIHsKLSAgICBoeXBlcmxpbmtIYW5kbGVyLnNldEh5cGVybGlua1VuZGVybGluZU1vZGUobmV3SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSk7Ci19Ci1wdWJsaWMgdm9pZCB0dXJuSW50b0h5cGVybGluayhDb250cm9sIGNvbnRyb2wsIElIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIGh5cGVybGlua0hhbmRsZXIucmVnaXN0ZXJIeXBlcmxpbmsoY29udHJvbCwgbGlzdGVuZXIpOwotfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC91aS9CYXNlRGVzaWduV2luZG93LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL3VpL0Jhc2VEZXNpZ25XaW5kb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3MTk4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL3VpL0Jhc2VEZXNpZ25XaW5kb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5VSVBsdWdpbjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEJhc2VEZXNpZ25XaW5kb3cgZXh0ZW5kcyBWaWV3ZXIKLXsKLSAgcHJpdmF0ZSBGb250IGZvbnQ7Ci0KLSAgcHJvdGVjdGVkIFNjcm9sbGVkQ29tcG9zaXRlIG1haW5VSUNvbXBvbmVudDsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sc0NvbnRhaW5lcjsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwYWdlQ29tcGxldGUgPSB0cnVlOwotICBwcm90ZWN0ZWQgT2JqZWN0IGlucHV0OwotCi0gIHByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmU7Ci0KLSAgcHVibGljIEJhc2VEZXNpZ25XaW5kb3coSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmUpCi0gIHsKLSAgICB0aGlzLnN0YXR1c0xpbmUgPSBzdGF0dXNMaW5lOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0U3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZSkKLSAgewotICAgIHRoaXMuc3RhdHVzTGluZSA9IHN0YXR1c0xpbmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSVN0YXR1c0xpbmVNYW5hZ2VyIGdldFN0YXR1c0xpbmUoKQotICB7Ci0gICAgaWYgKHN0YXR1c0xpbmUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL3N0YXR1c0xpbmUgPSBXb3JrYmVuY2hVdGlsaXR5LmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0KLSAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpZWRpdG9yUGFydC5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLSAgICAgICAgc3RhdHVzTGluZSA9IGNvbnRyaWJ1dG9yLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfSAgCi0gICAgfQotICAgIHJldHVybiBzdGF0dXNMaW5lOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gaW5wdXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpCi0gIHsKLSAgICBpZiAodGhpcy5pbnB1dCAhPSBpbnB1dCkgCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKCIiKTsKLSAgICB9Ci0gICAgCi0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICB9Ci0KLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIHJldmVhbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBBIGRlc2lnbiB2aWV3IHRoYXQgaGFzIGEgbWFpbiBhcmVhIGZvciBjb250cm9scywgYW5kIGEgbWVzc2FnZSBsaW5lIGF0Ci0gICAqIHRoZSBib3R0b20KLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURlc2lnblBhbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpCi0gIHsKLSAgICBHcmlkRGF0YSBnZDsKLQotICAgIC8vIENyZWF0ZSB0aGUgbWFpbiBVSSBjb250YWluZXIKLSAgICBtYWluVUlDb21wb25lbnQ9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkKLSAgICAgIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgaWYgKHZpc2libGUgPT0gZmFsc2UgJiYgIWN1cnJlbnRNZXNzYWdlLmVxdWFscygiIikpCi0gICAgICAgIHsKLSAgICAgICAgICBzaG93TWVzc2FnZUluU3RhdHVzTGluZSh2aXNpYmxlID09IHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLQotLy8gICAgbWFpblVJQ29tcG9uZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgY29udHJvbHNDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKG1haW5VSUNvbXBvbmVudCwgU1dULk5PTkUpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBjb250cm9sc0NvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGNvbnRyb2xzQ29udGFpbmVyLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgLy8gVE9ETzogUmVtb3ZlIGFib3ZlIGxpbmUgYW5kIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIHR3byB3aGVuIFhTREVkaXRvciB2aWV3cwotICAgIC8vIGFyZSByZXdyaXR0ZW4uICBBbHNvIHJlZmVyIGRvIHJlbGF0ZWQgVE9ETyBpbiBEVERFZGl0b3IncyBCYXNlV2luZG93LgotICAgIC8vIEZsYXRWaWV3VXRpbGl0eSBmbGF0Vmlld1V0aWxpdHkgPSBuZXcgRmxhdFZpZXdVdGlsaXR5KCk7Ci0gICAgLy8gY29udHJvbHNDb250YWluZXIgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKG1haW5VSUNvbXBvbmVudCwgbnVtQ29sdW1ucyk7Ci0KLSAgICBtYWluVUlDb21wb25lbnQuc2V0Q29udGVudChjb250cm9sc0NvbnRhaW5lcik7Ci0KLSAgICByZXR1cm4gbWFpblVJQ29tcG9uZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2Nyb2xsQ29tcG9zaXRlKCkKLSAgewotICAgIFBvaW50IHAgPSBjb250cm9sc0NvbnRhaW5lci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotICAgIG1haW5VSUNvbXBvbmVudC5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotICAgIG1haW5VSUNvbXBvbmVudC5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLSAgICBtYWluVUlDb21wb25lbnQuc2V0TWluU2l6ZShwKTsKLSAgfQotCi0gIHB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbHNDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xzQ29udGFpbmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbXBsZXRlIHN0YXRlIG9mIHRoZSBwYWdlLgotICAgKiBJZiBmYWxzZSwgdGhlbiBjbGllbnQgaXMgbm90IGFsbG93ZWQgdG8gbW92ZSB0byBuZXh0IHBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBhZ2VDb21wbGV0ZShib29sZWFuIGNvbXBsZXRlKQotICB7Ci0gICAgcGFnZUNvbXBsZXRlPSBjb21wbGV0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBhZ2UgaXMgY29tcGxldGUgb3Igbm90LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKQotICB7Ci0gICAgcmV0dXJuIHBhZ2VDb21wbGV0ZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRNZXNzYWdlID0gIiI7Ci0gIHByb3RlY3RlZCB2b2lkIHNob3dNZXNzYWdlSW5TdGF0dXNMaW5lKGJvb2xlYW4gc2hvdykKLSAgewotICAgIGlmIChnZXRTdGF0dXNMaW5lKCkgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICAKLSAgICBpZiAoc2hvdykgCi0gICAgewotICAgICAgZ2V0U3RhdHVzTGluZSgpLnNldEVycm9yTWVzc2FnZShjdXJyZW50TWVzc2FnZSk7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgZ2V0U3RhdHVzTGluZSgpLnNldEVycm9yTWVzc2FnZSgiIik7Ci0gICAgfQotICAgIAotICAgIAotICAgIGdldFN0YXR1c0xpbmUoKS51cGRhdGUoZmFsc2UpOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgbWVzc2FnZSBsaW5lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgY3VycmVudE1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIGlmIChnZXRTdGF0dXNMaW5lKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRTdGF0dXNMaW5lKCkuc2V0RXJyb3JNZXNzYWdlKGN1cnJlbnRNZXNzYWdlKTsKLSAgICAgIGdldFN0YXR1c0xpbmUoKS51cGRhdGUoZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDbGVhcnMgYSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXJNZXNzYWdlKCkKLSAgewotICAgIGN1cnJlbnRNZXNzYWdlID0gIiI7Ci0gICAgaWYgKGdldFN0YXR1c0xpbmUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGdldFN0YXR1c0xpbmUoKS5zZXRFcnJvck1lc3NhZ2UoY3VycmVudE1lc3NhZ2UpOwotICAgICAgZ2V0U3RhdHVzTGluZSgpLnVwZGF0ZShmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xlYXJFcnJvck1lc3NhZ2UoKQotICB7Ci0gICAgY2xlYXJNZXNzYWdlKCk7Ci0gICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRNZXNzYWdlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvdWkvQm9yZGVyUGFpbnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC91aS9Cb3JkZXJQYWludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YmRlYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC91aS9Cb3JkZXJQYWludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotCi1wdWJsaWMgY2xhc3MgQm9yZGVyUGFpbnRlciBpbXBsZW1lbnRzIFBhaW50TGlzdGVuZXIKLXsKLSAgQ29sb3IgYmFja2dyb3VuZENvbG9yLCBmb3JlZ3JvdW5kQ29sb3I7Ci0gIHN0YXRpYyBDb2xvciBib3JkZXJDb2xvcjsKLQotICBwdWJsaWMgQm9yZGVyUGFpbnRlcigpCi0gIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICBpZiAoYm9yZGVyQ29sb3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBib3JkZXJDb2xvciA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMTk1LCAxOTEsIDE3OSk7ICAJCi0gICAgfQotICAgIGJhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0gICAgZm9yZWdyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsJCi0gIH0KLQkKLSAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgZXZlbnQud2lkZ2V0OwotICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQ29udHJvbCBjID0gY2hpbGRyZW5baV07Ci0gICAgICBpZiAoYy5pc0VuYWJsZWQoKT09ZmFsc2UpCi0gICAgICB7Ci0gICAgICAgIGlmIChjIGluc3RhbmNlb2YgVGV4dAotICAgICAgICAgIHx8IGMgaW5zdGFuY2VvZiBDYW52YXMKLSAgICAgICAgICB8fCBjIGluc3RhbmNlb2YgTGlzdAotICAgICAgICAgIHx8IGMgaW5zdGFuY2VvZiBDQ29tYm8pCi0gICAgICAgIHsKLSAgICAgICAgICBSZWN0YW5nbGUgYiA9IGMuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgR0MgZ2MgPSBldmVudC5nYzsKLSAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0vLyAgICAgICAgZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMSwgYi5oZWlnaHQgKyAxKTsKLSAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGJvcmRlckNvbG9yKTsKLSAgICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDIsIGIueSAtIDIsIGIud2lkdGggKyAzLCBiLmhlaWdodCArIDMpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKGMgaW5zdGFuY2VvZiBUZXh0Ci0vLyAgICAgICAgfHwgYyBpbnN0YW5jZW9mIENhbnZhcwotICAgICAgICB8fCBjIGluc3RhbmNlb2YgTGlzdAotICAgICAgICB8fCBjIGluc3RhbmNlb2YgQ0NvbWJvKQotICAgICAgewotICAgICAgICBSZWN0YW5nbGUgYiA9IGMuZ2V0Qm91bmRzKCk7Ci0gICAgICAgIEdDIGdjID0gZXZlbnQuZ2M7Ci0gICAgICAgIGdjLnNldEZvcmVncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLSAgICAgICAgZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMSwgYi5oZWlnaHQgKyAxKTsKLSAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDIsIGIueSAtIDIsIGIud2lkdGggKyAzLCBiLmhlaWdodCArIDMpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYyBpbnN0YW5jZW9mIFRhYmxlCi0gICAgICAgIHx8IGMgaW5zdGFuY2VvZiBUcmVlCi0gICAgICAgIHx8IGMgaW5zdGFuY2VvZiBUYWJsZVRyZWUpIHsKLSAgICAgICAgUmVjdGFuZ2xlIGIgPSBjLmdldEJvdW5kcygpOwotICAgICAgICBHQyBnYyA9IGV2ZW50LmdjOwotICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0gICAgICAgIC8vZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAyLCBiLnkgLSAyLCBiLndpZHRoICsgMywgYi5oZWlnaHQgKyAzKTsKLSAgICAgICAgZ2MuZHJhd1JlY3RhbmdsZShiLngtMSwgYi55LTEsIGIud2lkdGgrMiwgYi5oZWlnaHQrMik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvdWkvRmxhdFZpZXdVdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL3VpL0ZsYXRWaWV3VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmI2NjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvdWkvRmxhdFZpZXdVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubWlzYy5Xb3JrYm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWkuRmxhdFBhZ2VIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWkuV2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEZsYXRWaWV3VXRpbGl0eSBpbXBsZW1lbnRzIFBhaW50TGlzdGVuZXIKLXsKLSAgQ29sb3IgYmFja2dyb3VuZENvbG9yLCBmb3JlZ3JvdW5kQ29sb3I7Ci0gIENvbG9yIGNvbWJvQmFja2dyb3VuZENvbG9yLCBjb21ib0Rpc2FibGVkQ29sb3I7Ci0gIHN0YXRpYyBDb2xvciBib3JkZXJDb2xvcjsKLQotICAvLyBBZGRlZCBmb3IgY3JlYXRlRmxhdFBhZ2VIZWFkZXIoKQotICBwcml2YXRlIGJvb2xlYW4gaGVhZGluZ1Zpc2libGU9dHJ1ZTsKLSAgcHJpdmF0ZSBJbWFnZSBoZWFkaW5nSW1hZ2UgPSBudWxsOwotICBwcml2YXRlIENvbXBvc2l0ZSBoZWFkZXJDb250cm9sID0gbnVsbDsKLSAgcHJpdmF0ZSBpbnQgVElUTEVfVk1BUkdJTiA9IDU7Ci0gIHByaXZhdGUgRmxhdFBhZ2VIZWFkZXIgZmxhdFBhZ2VIZWFkZXIgPSBudWxsOwotCi0gIHByaXZhdGUgS2V5Ym9hcmRIYW5kbGVyIGtleWJvYXJkSGFuZGxlcjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIX1NDUk9MTF9JTkNSRU1FTlQgPSA1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWX1NDUk9MTF9JTkNSRU1FTlQgPSA2NDsKLSAgCi0gIC8vIHRoaXMgZGVmYXVsdHMgdG8gdGhlIGZsYXQgc3R5bGUsIGJ1dCB1c2VycyBjYW4gY2hhbmdlIGl0IGlmIHRoZXkgd2lzaAotICBwcml2YXRlIGludCBmbGF0U3R5bGUgPSBTV1QuRkxBVDsKLSAgcHJpdmF0ZSBpbnQgYm9yZGVyID0gMDsKLQotICBwdWJsaWMgRmxhdFZpZXdVdGlsaXR5KCkKLSAgeyAKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICBpZiAoYm9yZGVyQ29sb3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBib3JkZXJDb2xvciA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMTk1LCAxOTEsIDE3OSk7ICAJCi0gICAgfQotICAgIGJhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0gICAgZm9yZWdyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsKLSAgICBjb21ib0JhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0gICAgY29tYm9EaXNhYmxlZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpOwotICAgIGtleWJvYXJkSGFuZGxlciA9IG5ldyBLZXlib2FyZEhhbmRsZXIoKTsKLSAgfQotICAKLSAgcHVibGljIEZsYXRWaWV3VXRpbGl0eShib29sZWFuIGlzRmxhdCkKLSAgewotICAgIHRoaXMoKTsKLSAgICAKLSAgICBzZXRGbGF0KGlzRmxhdCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEZsYXQoYm9vbGVhbiBmbGF0KQotICB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgaWYgKGZsYXQpCi0gICAgewotICAgICAgZmxhdFN0eWxlID0gU1dULkZMQVQ7Ci0gICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOwotICAgICAgZm9yZWdyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmxhdFN0eWxlID0gMDsKLSAgICAgIGJvcmRlciA9IFNXVC5CT1JERVI7Ci0gICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCk7Ci0gICAgICBmb3JlZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb2xvcihDb250cm9sIGMpCi0gIHsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIGMuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpCi0gIHsKLSAgICBDb250cm9sIGMgPSAoQ29udHJvbCkgZXZlbnQud2lkZ2V0OwotICAgIGlmIChjLmlzRW5hYmxlZCgpPT1mYWxzZSkKLSAgICB7Ci0gICAgICBpZiAoYyBpbnN0YW5jZW9mIFRleHQKLS8vICAgICAgfHwgYyBpbnN0YW5jZW9mIENhbnZhcwotICAgICAgICAgIHx8IGMgaW5zdGFuY2VvZiBMaXN0Ci0gICAgICAgICAgfHwgYyBpbnN0YW5jZW9mIENDb21ibykKLSAgICAgIHsKLSAgICAgICAgUmVjdGFuZ2xlIGIgPSBjLmdldFBhcmVudCgpLmdldEJvdW5kcygpOwotICAgICAgICBHQyBnYyA9IGV2ZW50LmdjOwotICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0vLyAgICAgIGdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMSwgYi55IC0gMSwgYi53aWR0aCArIDEsIGIuaGVpZ2h0ICsgMSk7Ci0gICAgICAgIGdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IpOwotLy8gICAgICAgIGdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMiwgYi55IC0gMiwgYi53aWR0aCArIDMsIGIuaGVpZ2h0ICsgMyk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgCi0KLSAgICAvLyBEZWZlY3QgMjUyODkxIDogdGhpcyBjYXVzZXMgc29tZSBtYWpvciBwcm9ibGVtcyBvbiBMaW51eCBHVEsKLSAgICAvLyBUaGlzIGxvb2tzIHJhdGhlciBkb2RneSBpbiBhbnkgY2FzZSBzaW5jZSBhbiBjeWNsaWMgcGFpbnRpbmcgYmVoYXZpb3VyCi0gICAgLy8gaXMgbGlrZWx5IG9jY3VyaW5nIGhlcmUKLSAgICAvL2lmIChjLmdldFBhcmVudCgpICE9IG51bGwpCi0gICAgLy97Ci0gICAgLy8gIGMuZ2V0UGFyZW50KCkucmVkcmF3KCk7Ci0gICAgLy99Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBGb250IGZvbnQ7Ci0KLSAgcHVibGljIHN0YXRpYyBGb250IGdldEZvbnQoKQotICB7Ci0gICAgaWYgKGZvbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb250ID0gbmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksICJtcyBzYW5zIHNlcmlmIiwgOCwgU1dULk5PUk1BTCk7Ci0gICAgfQotICAgIHJldHVybiBmb250OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbnQoRm9udCBuZXdGb250KQotICB7Ci0gICAgZm9udCA9IG5ld0ZvbnQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKQotICB7Ci0gICAgLy8gZGVwcmVjYXRlZC4gIFJlbW92ZSBsYXRlcgotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVTaW1wbGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBzdHlsZSB8IGZsYXRTdHlsZSk7Ci0gICAgY29tcG9zaXRlLnNldEZvbnQoZ2V0Rm9udCgpKTsKLSAgICBzZXRDb2xvcihjb21wb3NpdGUpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FIHwgZmxhdFN0eWxlKTsKLSAgICBjb21wb3NpdGUuc2V0Rm9udChnZXRGb250KCkpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgc2V0Q29sb3IoY29tcG9zaXRlKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5hZGRQYWludExpc3RlbmVyKG5ldyBCb3JkZXJQYWludGVyKCkpOwotICAgIH0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMsIGJvb2xlYW4gaG9yaXpvbnRhbEZpbGwpCi0gIHsKLSAgICBpZiAoIWhvcml6b250YWxGaWxsKQotICAgIHsKLSAgICAgIGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIG51bUNvbHVtbnMpOwotICAgIH0KLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUgfCBmbGF0U3R5bGUpOwotICAgIGNvbXBvc2l0ZS5zZXRGb250KGdldEZvbnQoKSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHNldENvbG9yKGNvbXBvc2l0ZSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuYWRkUGFpbnRMaXN0ZW5lcihuZXcgQm9yZGVyUGFpbnRlcigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zLCBib29sZWFuIGhvcml6b250YWxGaWxsLCBib29sZWFuIHZlcnRpY2FsRmlsbCkKLSAgewotICAgIGlmICghaG9yaXpvbnRhbEZpbGwgJiYgIXZlcnRpY2FsRmlsbCkKLSAgICB7Ci0gICAgICBjcmVhdGVDb21wb3NpdGUocGFyZW50LCBudW1Db2x1bW5zKTsKLSAgICB9Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FIHwgZmxhdFN0eWxlKTsKLSAgICBjb21wb3NpdGUuc2V0Rm9udChnZXRGb250KCkpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHNldENvbG9yKGNvbXBvc2l0ZSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuYWRkUGFpbnRMaXN0ZW5lcihuZXcgQm9yZGVyUGFpbnRlcigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIHB1YmxpYyBTYXNoRm9ybSBjcmVhdGVTYXNoRm9ybShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpCi0gIHsKLSAgICBTYXNoRm9ybSBzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIHN0eWxlIHwgZmxhdFN0eWxlKTsKLSAgICBzZXRDb2xvcihzYXNoRm9ybSk7Ci0gICAgcmV0dXJuIHNhc2hGb3JtOwotICB9Ci0KLSAgcHVibGljIFBhZ2VCb29rIGNyZWF0ZVBhZ2VCb29rKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkKLSAgewotICAgIFBhZ2VCb29rIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgc3R5bGUgfCBmbGF0U3R5bGUpOwotICAgIHNldENvbG9yKHBhZ2VCb29rKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIHBhZ2VCb29rLmFkZFBhaW50TGlzdGVuZXIobmV3IEJvcmRlclBhaW50ZXIoKSk7Ci0gICAgfQotICAgIHJldHVybiBwYWdlQm9vazsKLSAgfQotCi0gIHB1YmxpYyBXb3JrYm9vayBjcmVhdGVXb3JrYm9vayhDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpCi0gIHsKLSAgICBXb3JrYm9vayB3b3JrYm9vayA9IG5ldyBXb3JrYm9vayhwYXJlbnQsIHN0eWxlIHwgZmxhdFN0eWxlKTsKLSAgICBUYWJGb2xkZXIgdGFiRm9sZGVyID0gd29ya2Jvb2suZ2V0VGFiRm9sZGVyKCk7Ci0gICAgdGFiRm9sZGVyLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLS8vIFRPRE8gMy4wOiBQb3J0Ci0vLyAgICBQYWdlQm9vayBwYWdlQm9vayA9IHdvcmtib29rLmdldFBhZ2VCb29rKCk7Ci0vLyAgICBzZXRDb2xvcihwYWdlQm9vayk7Ci0vLyAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotLy8gICAgewotLy8gICAgICBwYWdlQm9vay5hZGRQYWludExpc3RlbmVyKG5ldyBCb3JkZXJQYWludGVyKCkpOwotLy8gICAgfQotICAgIHJldHVybiB3b3JrYm9vazsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBjcmVhdGVIZWFkaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIENvbG9yIGJnKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUhlYWRpbmdMYWJlbChwYXJlbnQsIHRleHQsIGJnLCBTV1QuTk9ORSk7Ci0gIH0KLSAgcHVibGljIExhYmVsIGNyZWF0ZUhlYWRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgQ29sb3IgYmcsIGludCBzdHlsZSkgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgc3R5bGUpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgc2V0Q29sb3IobGFiZWwpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOwotICAgIH0KLSAgICBsYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChKRmFjZVJlc291cmNlcy5CQU5ORVJfRk9OVCkpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBjcmVhdGVIb3Jpem9udGFsRmlsbGVyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQgfCBmbGF0U3R5bGUpOwotICAgIHNldENvbG9yKGxhYmVsKTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCBmb3IgY3JlYXRpbmcgbGFiZWxzLgotICAgKi8KLSAgcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIHRleHQpCi0gIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIHN0eWxlIHwgZmxhdFN0eWxlKTsKLSAgICBzZXRDb2xvcihsYWJlbCk7Ci0gICAgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0KLSAgcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KQotICB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCB8IGZsYXRTdHlsZSk7Ci0gICAgc2V0Q29sb3IobGFiZWwpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IGFsaWdubWVudCkKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQgfCBmbGF0U3R5bGUpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgc2V0Q29sb3IobGFiZWwpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCBmb3IgY3JlYXRpbmcgYnV0dG9ucy4KLSAgICovCi0gIHB1YmxpYyBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIIHwgZmxhdFN0eWxlKTsKLSAgICBidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0gICAgc2V0Q29sb3IoYnV0dG9uKTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBidXR0b24uYWRkS2V5TGlzdGVuZXIoa2V5Ym9hcmRIYW5kbGVyKTsKLQotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICBwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBmbGF0U3R5bGUpOwotICAgIHNldENvbG9yKHRhYmxlKTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIHRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIHRhYmxlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSByYWRpbyBidXR0b24KLSAgICovCi0gIHB1YmxpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8gfCBmbGF0U3R5bGUpOwotICAgIGJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRDb2xvcihidXR0b24pOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGJ1dHRvbi5hZGRLZXlMaXN0ZW5lcihrZXlib2FyZEhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBjaGVjayBib3gKLSAgICovCi0gIHB1YmxpYyBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0sgfCBmbGF0U3R5bGUpOwotICAgIGJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRDb2xvcihidXR0b24pOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICBwdWJsaWMgQ29tYm8gY3JlYXRlQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHJldHVybiBjcmVhdGVDb21ib0JveChwYXJlbnQsIHRydWUpOwotICB9Ci0KLSAgcHVibGljIENvbWJvIGNyZWF0ZUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gaXNSZWFkT25seSkKLSAgewotICAgIGludCBzdHlsZSA9IGlzUmVhZE9ubHkgPT0gdHJ1ZSA/IFNXVC5SRUFEX09OTFkgOiBTV1QuRFJPUF9ET1dOOwotCi0gICAgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSB8IGZsYXRTdHlsZSB8IGJvcmRlcik7Ci0gICAgc2V0Q29sb3IoY29tYm8pOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gY29tYm87Ci0gIH0KLQotICBwdWJsaWMgQ0NvbWJvIGNyZWF0ZUNDb21ib0JveChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNDb21ib0JveChwYXJlbnQsIHRydWUpOwotICB9Ci0KLSAgcHVibGljIENDb21ibyBjcmVhdGVDQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgaW50IHN0eWxlID0gaXNSZWFkT25seSA9PSB0cnVlID8gU1dULlJFQURfT05MWSA6IFNXVC5EUk9QX0RPV047Ci0KLSAgICBDQ29tYm8gY29tYm8gPSBuZXcgQ0NvbWJvKHBhcmVudCwgc3R5bGUgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIC8vIHNldENvbG9yKGNvbWJvKTsKLSAgICAvLyBBbHdheXMgdXNlIExpc3QgQmFja2dyb3VuZAotICAgIGNvbWJvLnNldEJhY2tncm91bmQoY29tYm9CYWNrZ3JvdW5kQ29sb3IpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgY29tYm8uYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8qICAgCi0gICAgICAgLy8gRGVmZWN0IDI1Mjg5MSA6IEknbSBub3Qgc3VyZSBpZiB0aGlzIGNvZGUgd2lsbCBhbHNvIGNhdXNlIHByb2JsZW1zIG9uIExpbnV4IEdUSwotICAgICAgIC8vIEJ1dCBzaW5jZSBpdHMgcG90ZW50aWFsbHkgY3ljbGljIC4uLiBJJ20gY29tbWVudGluZyBpdCBvdXQgZm9yIG5vdwotICAgICAgIGNvbWJvLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKQotICAgICAgIHsKLSAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkKLSAgICAgICB7Ci0gICAgICAgQ29udHJvbCBjID0gKENvbnRyb2wpIGV2ZW50LndpZGdldDsKLSAgICAgICBpZiAoYy5pc0VuYWJsZWQoKT09dHJ1ZSkKLSAgICAgICB7Ci0gICAgICAgYy5zZXRCYWNrZ3JvdW5kKGNvbWJvQmFja2dyb3VuZENvbG9yKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICBjLnNldEJhY2tncm91bmQoY29tYm9EaXNhYmxlZENvbG9yKTsgCi0gICAgICAgfQotICAgICAgIGZpbmFsIENvbnRyb2wgY29uID0gYzsKLSAgICAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICB7Ci0gICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICB7Ci0gICAgICAgaWYgKGNvbiAhPSBudWxsKQotICAgICAgIHsKLSAgICAgICBpZiAoIWNvbi5pc0Rpc3Bvc2VkKCkpICAvLyBpdCBnZXRzIGRpc3Bvc2VkCi0gICAgICAgewotICAgICAgIGNvbi5yZWRyYXcoKTsKLSAgICAgICB9Ci0gICAgICAgfQotICAgICAgIH0KLSAgICAgICB9OwotICAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLSAgICAgICB9Ci0gICAgICAgfSk7Ki8KLSAgICB9Ci0gICAgcmV0dXJuIGNvbWJvOwotICB9Ci0KLSAgcHVibGljIExpc3QgY3JlYXRlTGlzdEJveChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgsIGJvb2xlYW4gaXNNdWx0aVNlbGVjdCkKLSAgewotICAgIGludCBzdHlsZSA9IGlzTXVsdGlTZWxlY3QgPyBTV1QuTVVMVEkgOiBTV1QuU0lOR0xFOwotICAgIExpc3QgbGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgc3R5bGUgIHwgZmxhdFN0eWxlIHwgYm9yZGVyKTsKLSAgICBzZXRDb2xvcihsaXN0KTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0gICAgbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgbGlzdC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGNyZWF0ZUxpc3RCb3goQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoLCBib29sZWFuIGlzTXVsdGlTZWxlY3QsIGJvb2xlYW4gdmVydGljYWxGaWxsKQotICB7Ci0gICAgaW50IHN0eWxlID0gaXNNdWx0aVNlbGVjdCA/IFNXVC5NVUxUSSA6IFNXVC5TSU5HTEU7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBzdHlsZSAgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKGxpc3QpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHZlcnRpY2FsRmlsbDsKLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIGxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIGxpc3QuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBjcmVhdGVMaXN0Qm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgc3R5bGUgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKGxpc3QpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgbGlzdC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBUZXh0IGNyZWF0ZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgZmxhdFN0eWxlIHwgYm9yZGVyKTsKLSAgICBzZXRDb2xvcih0ZXh0KTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIHRleHQuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgdGV4dC5hZGRLZXlMaXN0ZW5lcihrZXlib2FyZEhhbmRsZXIpOwotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCkKLSAgewotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IGZsYXRTdHlsZSB8IGJvcmRlcik7Ci0gICAgc2V0Q29sb3IodGV4dCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIHRleHQuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgdGV4dC5hZGRLZXlMaXN0ZW5lcihrZXlib2FyZEhhbmRsZXIpOwotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IHN0eWxlKQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBzdHlsZSB8IFNXVC5TSU5HTEUgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKHRleHQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLSAgICB0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICB0ZXh0LmFkZFBhaW50TGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIDxjb2RlPmNyZWF0ZVdyYXBwZWRNdWx0aVRleHRGaWVsZDwvY29kZT4gY3JlYXRlcyBhIHdyYXBwZWQgbXVsdGl0ZXh0IGZpZWxkCi0gICAqCi0gICAqIEBwYXJhbSBwYXJlbnQgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHZhbHVlCi0gICAqIEBwYXJhbSB3aWR0aCBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCi0gICAqIEBwYXJhbSBudW1MaW5lcyBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHJlcHJlc2VudGluZyBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBoZWlnaHQKLSAgICogQHBhcmFtIHZlcnRpY2FsRmlsbCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0gICAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiB2YWx1ZQotICAgKi8KLSAgcHVibGljIFRleHQgY3JlYXRlV3JhcHBlZE11bHRpVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IG51bUxpbmVzLCBib29sZWFuIHZlcnRpY2FsRmlsbCkKLSAgewotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKHRleHQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgaWYgKHZlcnRpY2FsRmlsbCkKLSAgICB7Ci0gICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIH0KLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIEZvbnREYXRhW10gZm9udERhdGEgPSBnZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLSAgICAvLyBoYWNrIGZvciBub3cgd2hlcmUgb24gV2luZG93cywgb25seSAxIGZvbnRkYXRhIGV4aXN0cwotICAgIGRhdGEuaGVpZ2h0SGludCA9IG51bUxpbmVzICogZm9udERhdGFbMF0uZ2V0SGVpZ2h0KCk7Ci0gICAgdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgdGV4dC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gdGV4dDsKLSAgfQotCi0gIHB1YmxpYyBUZXh0IGNyZWF0ZU11bHRpVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8ICBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKHRleHQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgaWYgKHZlcnRpY2FsRmlsbCkKLSAgICB7Ci0gICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIH0KLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIGRhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLSAgICB0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICB0ZXh0LmFkZFBhaW50TGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIFRleHQgY3JlYXRlTXVsdGlUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8ICBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKHRleHQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgaWYgKHZlcnRpY2FsRmlsbCkKLSAgICB7Ci0gICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIH0KLSAgICB0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICB0ZXh0LmFkZFBhaW50TGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zLCBTdHJpbmcgdGV4dCwgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5TSEFET1dfRVRDSEVEX0lOICB8IGZsYXRTdHlsZSk7Ci0gICAgZ3JvdXAuc2V0VGV4dCh0ZXh0KTsKLSAgICBzZXRDb2xvcihncm91cCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGlmICh2ZXJ0aWNhbEZpbGwpCi0gICAgewotICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICB9Ci0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICBncm91cC5hZGRQYWludExpc3RlbmVyKG5ldyBCb3JkZXJQYWludGVyKCkpOwotICAgIH0KLSAgICByZXR1cm4gZ3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMsIFN0cmluZyB0ZXh0LCBib29sZWFuIHZlcnRpY2FsRmlsbCwgaW50IGFsaWdubWVudCkKLSAgewotICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULlNIQURPV19FVENIRURfSU4gfCBmbGF0U3R5bGUpOwotICAgIGdyb3VwLnNldFRleHQodGV4dCk7Ci0gICAgc2V0Q29sb3IoZ3JvdXApOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gYWxpZ25tZW50OwotICAgIGlmICh2ZXJ0aWNhbEZpbGwpCi0gICAgewotICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICB9Ci0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICBncm91cC5hZGRQYWludExpc3RlbmVyKG5ldyBCb3JkZXJQYWludGVyKCkpOwotICAgIH0KLSAgICByZXR1cm4gZ3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgTGFiZWwgY3JlYXRlVmVydGljYWxGaWxsZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZlcnRpY2FsU3BhbikKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQgfCBmbGF0U3R5bGUpOwotICAgIGxhYmVsLnNldEZvbnQoZ2V0Rm9udCgpKTsKLSAgICBzZXRDb2xvcihsYWJlbCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxTcGFuID0gdmVydGljYWxTcGFuOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLQotICAvLwotICAvLyBGbGF0UGFnZUhlYWRlcgotICAvLwotCi0gIC8vIFRoaXMgd2lsbCB1c2UgdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBpbWFnZS4KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVGbGF0UGFnZUhlYWRlcgotICAoQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgIFN0cmluZyB0aXRsZSkKLSAgewotICAgIEltYWdlIGJnSW1hZ2UgPSBjcmVhdGVEZWZhdWx0SW1hZ2UoKTsKLSAgICByZXR1cm4gY3JlYXRlRmxhdFBhZ2VIZWFkZXIocGFyZW50LGJnSW1hZ2UsdGl0bGUpOwotICB9Ci0KLSAgLy8gUHJvdmlkZSB5b3VyIG93biBiYWNrZ3JvdW5kIGltYWdlLgotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUZsYXRQYWdlSGVhZGVyCi0gIChDb21wb3NpdGUgcGFyZW50LAotICAgICAgSW1hZ2UgYmdJbWFnZSwKLSAgICAgIFN0cmluZyB0aXRsZSkKLSAgewotICAgIEZsYXRQYWdlSGVhZGVyIGhlYWRlciA9IG5ldyBGbGF0UGFnZUhlYWRlcihwYXJlbnQsU1dULk5PTkUpOwotICAgIGhlYWRlci5zZXRMYXlvdXQobmV3IFBhZ2VMYXlvdXQoKSk7Ci0gICAgaGVhZGVyLnNldEJhY2tncm91bmRJbWFnZShiZ0ltYWdlKTsKLSAgICBoZWFkZXIuc2V0VGV4dCh0aXRsZSk7Ci0gICAgV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IFdpZGdldEZhY3RvcnkoKTsKLSAgICBDb21wb3NpdGUgZm9ybVBhcmVudCA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGhlYWRlcik7Ci0gICAgLy9Db21wb3NpdGUgZm9ybVBhcmVudCA9IGNyZWF0ZUNvbXBvc2l0ZShoZWFkZXIsMSk7Ci0gICAgY3JlYXRlUGFnZUNvbnRlbnQoZm9ybVBhcmVudCk7Ci0gICAgaGVhZGVyQ29udHJvbCA9IGhlYWRlcjsgLy8gdGhpcyBpcyB1c2VkIGluIGdldFRpdGxlSGVpZ2h0KCkKLSAgICByZXR1cm4gZm9ybVBhcmVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZUZsYXRQYWdlSGVhZGVyVGl0bGUoU3RyaW5nIHRpdGxlKQotICB7Ci0gICAgKChGbGF0UGFnZUhlYWRlciloZWFkZXJDb250cm9sKS5zZXRUZXh0KHRpdGxlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVQYWdlQ29udGVudChDb21wb3NpdGUgcGFyZW50KSAKLSAgewotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dChsYXlvdXQpOwotICAgIHBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgfQotCi0gIGNsYXNzIFBhZ2VMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgCi0gIHsKLSAgICBwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgCi0gICAgewotICAgICAgaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUICYmIGhIaW50ICE9IFNXVC5ERUZBVUxUKQotICAgICAgICByZXR1cm4gbmV3IFBvaW50KHdIaW50LCBoSGludCk7Ci0gICAgICBpbnQgeCA9IDA7Ci0gICAgICBDb250cm9sIGNsaWVudCA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpWzBdOwotICAgICAgUG9pbnQgY3NpemUgPSBjbGllbnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKTsKLSAgICAgIGlmIChoZWFkaW5nVmlzaWJsZSkgY3NpemUueSArPSBnZXRUaXRsZUhlaWdodCgpOwotICAgICAgCi0gICAgICByZXR1cm4gY3NpemU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIAotICAgIHsKLSAgICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLSAgICAgIENvbnRyb2wgY2xpZW50ID0gY29tcG9zaXRlLmdldENoaWxkcmVuKClbMF07Ci0gICAgICBpbnQgdGhlaWdodCA9IGhlYWRpbmdWaXNpYmxlID8gZ2V0VGl0bGVIZWlnaHQoKSA6IDA7Ci0gICAgICBjbGllbnQuc2V0Qm91bmRzKGNsaWVudEFyZWEueCwgY2xpZW50QXJlYS55ICsgdGhlaWdodCwgY2xpZW50QXJlYS53aWR0aCwgY2xpZW50QXJlYS5oZWlnaHQgLSB0aGVpZ2h0KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGludCBnZXRUaXRsZUhlaWdodCgpIAotICB7Ci0gICAgaW50IGltYWdlSGVpZ2h0ID0gMDsKLSAgICAvLyBOb3RlIC0gRmluZCBvdXQgd2h5IGhlYWRpbmdJbWFnZSBpcyBhbHdheXMgbnVsbC4KLSAgICBpZiAoaGVhZGluZ0ltYWdlICE9IG51bGwgJiYgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpID09IGZhbHNlKSAKLSAgICAgIGltYWdlSGVpZ2h0ID0gaGVhZGluZ0ltYWdlLmdldEJvdW5kcygpLmhlaWdodDsKLQotICAgIEdDIGdjID0gbmV3IEdDKGhlYWRlckNvbnRyb2wpOwotICAgIGdjLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpKTsKLSAgICBGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0gICAgaW50IGZvbnRIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsKLSAgICBnYy5kaXNwb3NlKCk7Ci0KLSAgICBpbnQgaGVpZ2h0ID0gZm9udEhlaWdodCArIFRJVExFX1ZNQVJHSU4gKyBUSVRMRV9WTUFSR0lOOwotICAgIHJldHVybiBNYXRoLm1heChoZWlnaHQsaW1hZ2VIZWlnaHQpOwotICB9Ci0KLQotICBwcml2YXRlIEltYWdlIGNyZWF0ZURlZmF1bHRJbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlCi0gICAgKFdTRExFZGl0b3JQbHVnaW4uY2xhc3MsCi0gICAgICAgICJpY29ucy9wYWdlX2Jhbm5lci5naWYiKS5jcmVhdGVJbWFnZSgpOwotICB9Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBiYWNrZ3JvdW5kQ29sb3IuCi0gICAqIEByZXR1cm4gQ29sb3IKLSAgICovCi0gIHB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kQ29sb3IoKQotICB7Ci0gICAgcmV0dXJuIGJhY2tncm91bmRDb2xvcjsKLSAgfQotICAKLSAgcHVibGljIGNsYXNzIEtleWJvYXJkSGFuZGxlciBleHRlbmRzIEtleUFkYXB0ZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkKLSAgICB7Ci0gICAgICBXaWRnZXQgdyA9IGUud2lkZ2V0OwotICAgICAgaWYgKHcgaW5zdGFuY2VvZiBDb250cm9sKQotICAgICAgewotICAgICAgICBwcm9jZXNzS2V5KGUua2V5Q29kZSwgKENvbnRyb2wpIHcpOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzY3JvbGxWZXJ0aWNhbChTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgYm9vbGVhbiB1cCkKLSAgICB7Ci0gICAgICBzY3JvbGwoc2NvbXAsIDAsIHVwID8gLVZfU0NST0xMX0lOQ1JFTUVOVCA6IFZfU0NST0xMX0lOQ1JFTUVOVCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNjcm9sbEhvcml6b250YWwoU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAsIGJvb2xlYW4gbGVmdCkKLSAgICB7Ci0gICAgICBzY3JvbGwoc2NvbXAsIGxlZnQgPyAtSF9TQ1JPTExfSU5DUkVNRU5UIDogSF9TQ1JPTExfSU5DUkVNRU5ULCAwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2Nyb2xsUGFnZShTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgYm9vbGVhbiB1cCkKLSAgICB7Ci0gICAgICBQb2ludCBvcmlnaW4gPSBzY29tcC5nZXRPcmlnaW4oKTsKLSAgICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2NvbXAuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgaW50IGluY3JlbWVudCA9IHVwID8gLWNsaWVudEFyZWEuaGVpZ2h0IDogY2xpZW50QXJlYS5oZWlnaHQ7Ci0gICAgICBzY3JvbGwoc2NvbXAsIDAsIGluY3JlbWVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNjcm9sbChTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgaW50IHhvZmZzZXQsIGludCB5b2Zmc2V0KQotICAgIHsKLSAgICAgIFBvaW50IG9yaWdpbiA9IHNjb21wLmdldE9yaWdpbigpOwotICAgICAgUG9pbnQgY29udGVudFNpemUgPSBzY29tcC5nZXRDb250ZW50KCkuZ2V0U2l6ZSgpOwotICAgICAgaW50IHhvcmlnaW4gPSBvcmlnaW4ueCArIHhvZmZzZXQ7Ci0gICAgICBpbnQgeW9yaWdpbiA9IG9yaWdpbi55ICsgeW9mZnNldDsKLSAgICAgIHhvcmlnaW4gPSBNYXRoLm1heCh4b3JpZ2luLCAwKTsKLSAgICAgIHhvcmlnaW4gPSBNYXRoLm1pbih4b3JpZ2luLCBjb250ZW50U2l6ZS54IC0gMSk7Ci0gICAgICB5b3JpZ2luID0gTWF0aC5tYXgoeW9yaWdpbiwgMCk7Ci0gICAgICB5b3JpZ2luID0gTWF0aC5taW4oeW9yaWdpbiwgY29udGVudFNpemUueSAtIDEpOwotICAgICAgc2NvbXAuc2V0T3JpZ2luKHhvcmlnaW4sIHlvcmlnaW4pOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU2Nyb2xsZWRDb21wb3NpdGUgZ2V0U2Nyb2xsZWRDb21wb3NpdGUoQ29udHJvbCBjKQotICAgIHsKLSAgICAgIENvbXBvc2l0ZSBwYXJlbnQgPSBjLmdldFBhcmVudCgpOwotICAgICAgCi0gICAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoU2Nyb2xsZWRDb21wb3NpdGUpIHBhcmVudDsKLSAgICAgICAgfQotICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0tleShpbnQga2V5Q29kZSwgQ29udHJvbCBjKQotICAgIHsKLSAgICAgIFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wID0gZ2V0U2Nyb2xsZWRDb21wb3NpdGUoYyk7Ci0gICAgICBpZiAoc2NvbXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChrZXlDb2RlKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgU1dULkFSUk9XX0RPV04gOgotICAgICAgICAgIHNjcm9sbFZlcnRpY2FsKHNjb21wLCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1dULkFSUk9XX1VQIDoKLSAgICAgICAgICBzY3JvbGxWZXJ0aWNhbChzY29tcCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1dULkFSUk9XX0xFRlQgOgotICAgICAgICAgIHNjcm9sbEhvcml6b250YWwoc2NvbXAsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNXVC5BUlJPV19SSUdIVCA6Ci0gICAgICAgICAgc2Nyb2xsSG9yaXpvbnRhbChzY29tcCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNXVC5QQUdFX1VQIDoKLSAgICAgICAgICBzY3JvbGxQYWdlKHNjb21wLCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTV1QuUEFHRV9ET1dOIDoKLSAgICAgICAgICBzY3JvbGxQYWdlKHNjb21wLCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmFzZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYTZlMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC51aS5CYXNlRGVzaWduV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwudWkuQm9yZGVyUGFpbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLnVpLkZsYXRWaWV3VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVZpZXdlciBleHRlbmRzIEJhc2VEZXNpZ25XaW5kb3cgaW1wbGVtZW50cyBMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLS8vICBwcm90ZWN0ZWQgT2JqZWN0IGlucHV0OyAKLQotICAvLyBmb3IgdXNlIGluIHN1YmNsYXNzZXMKLSAgcHJvdGVjdGVkIEZsYXRWaWV3VXRpbGl0eSBmbGF0Vmlld1V0aWxpdHkgPSBuZXcgRmxhdFZpZXdVdGlsaXR5KHRydWUpOwotCi0gIHB1YmxpYyBCYXNlVmlld2VyKElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lKQotICB7Ci0gICAgc3VwZXIoc3RhdHVzTGluZSk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIHJldHVybiBpbnB1dDsKLSAgfQotCi0gIC8vIGdldHMgY2FsbGVkIG9ubHkgaWYgd2UgY3VycmVudGx5IGFyZSBub3QgaGFuZGxpbmcgYW4gZXZlbnQKLSAgYWJzdHJhY3QgcHVibGljIHZvaWQgZG9TZXRJbnB1dChPYmplY3QgaW5wdXQpOwotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIjc2V0SW5wdXQoT2JqZWN0KQotICAgKi8KLSAgc3RhdGljIE9iamVjdCBvbGRJbnB1dCA9IG51bGw7Ci0gIE1vZGVsQWRhcHRlckxpc3RlbmVyIG9sZE1vZGVsQWRhcHRlckxpc3RlbmVyID0gbnVsbDsKLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0KLSAgICBkb1NldElucHV0KGlucHV0KTsKLS8qCi0gICAgaWYgKCFpc0luRG9IYW5kbGUoKSAmJiAhZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBmaW5hbCBPYmplY3Qgb2JqID0gaW5wdXQ7Ci0gICAgICBnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgZG9TZXRJbnB1dChvYmopOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9Ci0qLwotICB9Ci0KLQotICBib29sZWFuIGxpc3RlbmVyRW5hYmxlZCA9IHRydWU7Ci0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLSAgICogQHJldHVybiB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyRW5hYmxlZCgpIAotICB7Ci0gICAgcmV0dXJuIGxpc3RlbmVyRW5hYmxlZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIGxpc3RlbmVyRW5hYmxlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExpc3RlbmVyRW5hYmxlZChib29sZWFuICB2KSAKLSAgewotICAgIHRoaXMubGlzdGVuZXJFbmFibGVkID0gdjsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJgotICAgICAgICBnZXRJbnB1dCgpICE9IG51bGwgJiYKLSAgICAgICAgIWlzSW5Eb0hhbmRsZSkgCi0gICAgewotICAgICAgaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLSAgICAgIHN0YXJ0RGVsYXllZEV2ZW50KGV2ZW50KTsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotICAgIH0gLy8gZW5kIG9mIGlmICgpCi0gIH0KLQotICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KTsKLSAgYWJzdHJhY3QgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLQotICBwcm90ZWN0ZWQgRGVsYXllZEV2ZW50IGRlbGF5ZWRUYXNrOwotICAKLSAgcHJvdGVjdGVkIHZvaWQgc3RhcnREZWxheWVkRXZlbnQoRXZlbnQgZSkKLSAgewotICAgIGlmIChkZWxheWVkVGFzayA9PSBudWxsIHx8Ci0gICAgICBkZWxheWVkVGFzay5nZXRFdmVudCgpID09IG51bGwpCi0gICAgewotICAgICAgZGVsYXllZFRhc2sgPSBuZXcgRGVsYXllZEV2ZW50KCk7Ci0gICAgICBkZWxheWVkVGFzay5zZXRFdmVudChlKTsKLSAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnRpbWVyRXhlYyg1MDAsZGVsYXllZFRhc2spOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRXZlbnQgZGVsYXllZEV2ZW50ID0gZGVsYXllZFRhc2suZ2V0RXZlbnQoKTsKLSAgICAgIAotICAgICAgaWYgKGUud2lkZ2V0ID09IGRlbGF5ZWRFdmVudC53aWRnZXQgJiYKLSAgICAgICAgZS50eXBlID09IGRlbGF5ZWRFdmVudC50eXBlKQotICAgICAgewotICAgICAgICAvLyBzYW1lIGV2ZW50LCBqdXN0IGRpZmZlcmVudCBkYXRhLCBkZWxheSBuZXcgZXZlbnQKLSAgICAgICAgZGVsYXllZFRhc2suc2V0RXZlbnQobnVsbCk7Ci0gICAgICB9Ci0gICAgICBkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLSAgICAgIGRlbGF5ZWRUYXNrLnNldEV2ZW50KGUpOwotICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwMCxkZWxheWVkVGFzayk7Ci0gICAgfQotICB9Ci0gIAotICBjbGFzcyBEZWxheWVkRXZlbnQgaW1wbGVtZW50cyBSdW5uYWJsZQotICB7Ci0gICAgcHJvdGVjdGVkIEV2ZW50IGV2ZW50OwotICAgIAotICAgIC8qCi0gICAgICogQHNlZSBSdW5uYWJsZSNydW4oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgaWYgKGV2ZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0gICAgICAgIGRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgICAgICBpc0luRG9IYW5kbGUgPSBmYWxzZTsKLSAgICAgICAgZXZlbnQgPSBudWxsOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBldmVudC4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBFdmVudAotICAgICAqLwotICAgIHB1YmxpYyBFdmVudCBnZXRFdmVudCgpCi0gICAgewotICAgICAgcmV0dXJuIGV2ZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV2ZW50LgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXZlbnQoRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgdGhpcy5ldmVudCA9IGV2ZW50OwotICAgIH0KLQotICB9Ci0KLQotICBib29sZWFuIGlzSW5Eb0hhbmRsZTsKLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotICAgKiBAcmV0dXJuIHZhbHVlIG9mIGlzSW5Eb0hhbmRsZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSW5Eb0hhbmRsZSgpIAotICB7Ci0gICAgcmV0dXJuIGlzSW5Eb0hhbmRsZTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgVmlld2VyI2dldENvbnRyb2woKQotICAgKi8KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gbWFpblVJQ29tcG9uZW50OwotICB9Ci0KLQotICAvKgotICAgKiBAc2VlIEJhc2VEZXNpZ25XaW5kb3cjY3JlYXRlRGVzaWduUGFuZShDb21wb3NpdGUsIGludCkKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURlc2lnblBhbmUoQ29tcG9zaXRlIGFyZzAsIGludCBhcmcxKQotICB7Ci0gICAgQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlRGVzaWduUGFuZShhcmcwLCBhcmcxKTsKLSAgICAKLSAgICBDb21wb3NpdGUgY2xpZW50ID0gc3VwZXIuZ2V0Q29udHJvbHNDb250YWluZXIoKTsKLSAgICAKLSAgICBjbGllbnQuYWRkUGFpbnRMaXN0ZW5lcihuZXcgQm9yZGVyUGFpbnRlcigpKTsKLSAgICAKLSAgICBjbGllbnQuc2V0QmFja2dyb3VuZChuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksMjU1LDI1NSwyNTUpKTsKLQotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0KLQotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gcmV2ZWFsKSAKLSAgewotICB9Ci0gICAKLSAgCi0vLyAgcHVibGljIGFic3RyYWN0IENvbnRyb2wgZ2V0Q29udHJvbCgpOwotCi0KLSAgcHVibGljIE5vZGUgZ2V0Tm9kZSgpCi0gIHsKLSAgICByZXR1cm4gKE5vZGUpIGdldElucHV0KCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHt9Ci0gIAotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHt9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYKLSAgICAgICAgZ2V0SW5wdXQoKSAhPSBudWxsICYmCi0gICAgICAgICFpc0luRG9IYW5kbGUpIAotICAgIHsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0gICAgICBkb1dpZGdldERlZmF1bHRTZWxlY3RlZChlKTsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYKLSAgICAgICAgZ2V0SW5wdXQoKSAhPSBudWxsICYmCi0gICAgICAgICFpc0luRG9IYW5kbGUpIAotICAgIHsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0gICAgICBkb1dpZGdldFNlbGVjdGVkKGUpOwotICAgICAgaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Q2hpbGROb2RlKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgY2hpbGROYW1lKQotICB7Ci0gICAgTm9kZUxpc3QgbGlzdCA9IG51bGw7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIH0KLSAgIAotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIFBlcmZvcm1hbmNlIGlzc3VlIHBlcmhhcHM/Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGxpc3QuaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobGlzdC5pdGVtKGkpLmdldExvY2FsTmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBwZXJmb3JtQWRkRWxlbWVudChOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2VOYW1lLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHBhcmVudE5vZGUsIG5hbWVzcGFjZU5hbWUsIGxvY2FsTmFtZSk7Ci0gICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOyAgICAgICAKLSAgICAgIGZvcm1hdChwYXJlbnROb2RlKTsKLSAgICAgIHJldHVybiBuZXdFbGVtZW50OwotICAgIH0gIAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2VOYW1lLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnROb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGxvY2FsTmFtZSk7Ci0gICAgcmV0dXJuIGVsZW1lbnQ7ICAgCi0gIH0gICAKLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCwgU3RyaW5nIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCB2YWx1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBmb3JtYXQoTm9kZSBwYXJlbnROb2RlKQotICB7Ci0gICAgaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgCi0gICAgewotICAgICAgLy8gZm9ybWF0IHNlbGVjdGVkIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBGb3JtYXRQcm9jZXNzb3JYTUwgZm9ybWF0UHJvY2Vzc29yWE1MID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotICAgICAgZm9ybWF0UHJvY2Vzc29yWE1MLmZvcm1hdE5vZGUoKElET01Ob2RlKXBhcmVudE5vZGUpOwotICAgIH0KLSAgfQotICAKLSAgc3RhdGljIHByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKQotICB7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0KLSAgICByZXR1cm4gZWRpdG9yUGFydDsKLSAgfQotICAKLSAgc3RhdGljIHByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgZ2V0U3RhdHVzTGluZU1hbmFnZXIoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgeyAKLSAgICBJU3RhdHVzTGluZU1hbmFnZXIgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gKEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKWVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0gICAgICByZXN1bHQgPSBjb250cmlidXRvci5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmluZGluZ0lucHV0T3V0cHV0RmF1bHRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmluZGluZ0lucHV0T3V0cHV0RmF1bHRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3ZDM5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0JpbmRpbmdJbnB1dE91dHB1dEZhdWx0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nSW5wdXRPdXRwdXRGYXVsdFZpZXdlciBleHRlbmRzIE5hbWVkQ29tcG9uZW50Vmlld2VyIAoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBCaW5kaW5nSW5wdXRPdXRwdXRGYXVsdFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgICAgCi0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpCi0gIHsgCi0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX0lOUFVUIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX09VVFBVVCIpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX0ZBVUxUIik7Ci0gICAgfSAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0JpbmRpbmdPcGVyYXRpb25WaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmluZGluZ09wZXJhdGlvblZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTAzMzdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmluZGluZ09wZXJhdGlvblZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nT3BlcmF0aW9uVmlld2VyIGV4dGVuZHMgTmFtZWRDb21wb25lbnRWaWV3ZXIgCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb25WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0JJTkRJTkdfT1BFUkFUSU9OIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmluZGluZ1ZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CaW5kaW5nVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ODUxMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CaW5kaW5nVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzLkNvbXBvbmVudE5hbWVDb21ib0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHMuSW52b2tlRGlhbG9nQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1ZpZXdlciBleHRlbmRzIE5hbWVkQ29tcG9uZW50Vmlld2VyIAoteyAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENDb21ibyBjb21wb25lbnROYW1lQ29tYm87ICAgICAgCi0gIHByb3RlY3RlZCBDb21wb25lbnROYW1lQ29tYm9IZWxwZXIgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyOwotICBJbnZva2VEaWFsb2dCdXR0b24gYnV0dG9uOwotCi0gIHB1YmxpYyBCaW5kaW5nVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIGVkaXRvclBhcnQpOyAgICAKLSAgfSAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCkKLSAgewotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HIik7ICAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIucG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24ocGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAKLSAgICBMYWJlbCBwb3J0VHlwZUxhYmVsID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUE9SVFRZUEUiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDQ29tYm9Cb3goY29tcG9zaXRlKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIgPSBuZXcgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyKGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDb21wb25lbnROYW1lTGlzdChDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB1dGlsLmdldFBvcnRUeXBlTmFtZXMoKTsKLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEU7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIGJ1dHRvbiA9IG5ldyBJbnZva2VEaWFsb2dCdXR0b24oY29tcG9zaXRlLCBnZXRJbnB1dCgpKTsKLSAgICBidXR0b24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkKLSAgewotICAgIHN1cGVyLnVwZGF0ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyLnVwZGF0ZShpbnB1dCk7Ci0gICAgYnV0dG9uLnNldElucHV0KGlucHV0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZUV2ZW50SGVscGVyKEVsZW1lbnQgZWxlbWVudCwgRXZlbnQgZXZlbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBzdXBlci5oYW5kbGVFdmVudEhlbHBlcihlbGVtZW50LCBldmVudCk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyLmhhbmRsZUV2ZW50SGVscGVyKGVsZW1lbnQsIGV2ZW50KTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRGVmaW5pdGlvblZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9EZWZpbml0aW9uVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2VjZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9EZWZpbml0aW9uVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5FZGl0TmFtZXNwYWNlc0FjdGlvbjsKLQotcHVibGljIGNsYXNzIERlZmluaXRpb25WaWV3ZXIgZXh0ZW5kcyBOYW1lZENvbXBvbmVudFZpZXdlciAKLXsgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIERlZmluaXRpb25WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7IAotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9ERUZJTklUSU9OIik7IC8vJE5PTi1OTFMtMSQKLSAgfSAgCi0gICAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgcG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLnBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKHBhcmVudCk7Ci0JICBMYWJlbCBsYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDAsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX05BTUVTUEFDRVMiKSk7IC8vJE5PTi1OTFMtMSQKLSAgCUJ1dHRvbiBidXR0b24gPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlUHVzaEJ1dHRvbihjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0VESVRfTkFNRVNQQUNFUyIpKTsKLQkgIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICB7Ci0gICAgCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAJeyAgICAJCQotICAgIAl9Ci0gICAgCQotICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAJewotCQkgIEVkaXROYW1lc3BhY2VzQWN0aW9uIGFjdGlvbiA9IG5ldyBFZGl0TmFtZXNwYWNlc0FjdGlvbigoRGVmaW5pdGlvbilnZXRJbnB1dCgpKTsJCQkJCQotCQkgIGFjdGlvbi5ydW4oKTsJCi0gICAgCX0JCi0gICAgfTsKLSAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAJcmV0dXJuIGNvbXBvc2l0ZTsJCi0gIH0JICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRW1wdHlWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRW1wdHlWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlMjU0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0VtcHR5Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotCi1wdWJsaWMgY2xhc3MgRW1wdHlWaWV3ZXIgZXh0ZW5kcyBCYXNlVmlld2VyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOwotCi0gIHB1YmxpYyBFbXB0eVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpCi0gIHsKLSAgICBzdXBlcihnZXRTdGF0dXNMaW5lTWFuYWdlcihnZXRBY3RpdmVFZGl0b3IoKSkpOwotICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBjb250cm9sLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgCi0gIH0KLQotICAvKgotICAgKiBAc2VlIEJhc2VXaW5kb3cjZG9IYW5kbGVFdmVudChFdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuTW9kaWZ5KQotICAgIHsKLSAgICB9Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaWJpbGl0eUVsZW1lbnRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaWJpbGl0eUVsZW1lbnRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzYTE3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHMuQXR0cmlidXRlc1RhYmxlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmlsaXR5RWxlbWVudFZpZXdlciBleHRlbmRzIEJhc2VWaWV3ZXIgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgoteyAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOyAgIAotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsgICAKLSAgcHJvdGVjdGVkIEF0dHJpYnV0ZXNUYWJsZSBhdHRyaWJ1dGVzVGFibGU7Ci0gIGJvb2xlYW4gaXNGb3JUYWJiZWRQcm9wZXJ0aWVzID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKGdldFN0YXR1c0xpbmVNYW5hZ2VyKGVkaXRvclBhcnQpKTsgICAgCi0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsgICAgICAgICAgICAgICAgICAKLQotICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsgICAKLSAgfQotICAKLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIGJvb2xlYW4gaXNGb3JUYWJiZWRQcm9wZXJ0aWVzKQotICB7Ci0gICAgc3VwZXIoZ2V0U3RhdHVzTGluZU1hbmFnZXIoZWRpdG9yUGFydCkpOyAgICAKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OyAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuaXNGb3JUYWJiZWRQcm9wZXJ0aWVzID0gaXNGb3JUYWJiZWRQcm9wZXJ0aWVzOwotICAgIGlmIChpc0ZvclRhYmJlZFByb3BlcnRpZXMpCi0gICAgewotICAgICAgY3JlYXRlQ29udHJvbEZvclRhYmJlZFByb3BlcnR5U2hlZXQocGFyZW50KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICB9Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpCi0gIHsgCi0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSAoKFdTRExFbGVtZW50KWlucHV0KS5nZXRFbGVtZW50KCk7Ci0gICAgICByZXN1bHQgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1VOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UIik7IC8vJE5PTi1OTFMtMSQgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAKLSAgCi0gIC8vIFRPRE8uLi4gbW92ZSB0aGlzIG1ldGhvZCBkb3duIHRvIEJhc2VWaWV3ZXIhCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xGb3JUYWJiZWRQcm9wZXJ0eVNoZWV0KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgCi0gICAgYXR0cmlidXRlc1RhYmxlID0gbmV3IEF0dHJpYnV0ZXNUYWJsZShlZGl0b3JQYXJ0LCBwYXJlbnQpOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgCi0gICAgY29udHJvbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxLCB0cnVlKTsgICAKLQkgIGNvbnRyb2wuc2V0QmFja2dyb3VuZCAobmV3IENvbG9yKG51bGwsMjU1LDAsMCkpOwotCSAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotCSAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLQkgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0JICBnZC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLQkgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotCSAgCi0gICAgY29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCljb250cm9sLmdldExheW91dCgpOwotICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVGbGF0UGFnZUhlYWRlcihjb250cm9sLCAiIik7Ci0KLSAgICBDb21wb3NpdGUgYyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUoY29udHJvbCwgMSwgdHJ1ZSk7Ci0gICAgR3JpZERhdGEgY0dEPSBuZXcgR3JpZERhdGEoKTsKLSAgICBjR0QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBjR0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBjR0QudmVydGljYWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgY0dELmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotICAgIAotICAgIGMuc2V0TGF5b3V0RGF0YShjR0QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGF0dHJpYnV0ZXNUYWJsZSA9IG5ldyBBdHRyaWJ1dGVzVGFibGUoZWRpdG9yUGFydCwgYyk7Ci0KLSAgICBHcmlkRGF0YSBhdHRyaWJ1dGVzVGFibGVHRD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgYXR0cmlidXRlc1RhYmxlR0QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBhdHRyaWJ1dGVzVGFibGVHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGF0dHJpYnV0ZXNUYWJsZUdELnZlcnRpY2FsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGF0dHJpYnV0ZXNUYWJsZUdELmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotCi0gICAgYXR0cmlidXRlc1RhYmxlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGF0dHJpYnV0ZXNUYWJsZUdEKTsKLSAgfSAgCi0KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfSAKLSAgIAotCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgaWYgKCFpc0ZvclRhYmJlZFByb3BlcnRpZXMpCi0gICAgewotICAgICAgZmxhdFZpZXdVdGlsaXR5LnVwZGF0ZUZsYXRQYWdlSGVhZGVyVGl0bGUoZ2V0SGVhZGluZ1RleHQoKSk7Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgIGF0dHJpYnV0ZXNUYWJsZS5zZXRJbnB1dCgoKFdTRExFbGVtZW50KWlucHV0KS5nZXRFbGVtZW50KCkpOwotIAotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQotICAgIGlmIChvbGRJbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LnJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKG9sZElucHV0LCB0aGlzKTsKLSAgICB9Ci0gICAgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkuYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoaW5wdXQsIHRoaXMpOwotCi0gICAgb2xkSW5wdXQgPSBpbnB1dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSkKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgICAgdXBkYXRlKCk7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgeyAKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7ICAgICAgICAgICAKLSAgICAgICAgaWYgKCFhdHRyaWJ1dGVzVGFibGUuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIGF0dHJpYnV0ZXNUYWJsZS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OyAgICAgICAgICAgICAgIAotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2libGVEZXRhaWxzVmlld2VyUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaWJsZURldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzYwNTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaWJsZURldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSURldGFpbHNWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5OwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZURldGFpbHNWaWV3ZXJQcm92aWRlciBpbXBsZW1lbnRzIElEZXRhaWxzVmlld2VyUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3JFeHRlbnNpb25bXSBleHRlbnNpb25zOwotICBwcm90ZWN0ZWQgSURldGFpbHNWaWV3ZXJQcm92aWRlcltdIGRldGFpbHNWaWV3ZXJQcm92aWRlcnM7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IHt9OwotCi0gIHB1YmxpYyBFeHRlbnNpYmxlRGV0YWlsc1ZpZXdlclByb3ZpZGVyKFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgeyAgCQotICAgIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKTsgCi0KLSAgICBleHRlbnNpb25zID0gcmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoV1NETEVkaXRvckV4dGVuc2lvbi5ERVRBSUxTX1ZJRVdFUl9QUk9WSURFUik7IAotICAgIGRldGFpbHNWaWV3ZXJQcm92aWRlcnMgPSBuZXcgSURldGFpbHNWaWV3ZXJQcm92aWRlcltleHRlbnNpb25zLmxlbmd0aF07IAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBkZXRhaWxzVmlld2VyUHJvdmlkZXJzW2ldID0gKElEZXRhaWxzVmlld2VyUHJvdmlkZXIpZXh0ZW5zaW9uc1tpXS5jcmVhdGVFeHRlbnNpb25PYmplY3QoV1NETEVkaXRvckV4dGVuc2lvbi5ERVRBSUxTX1ZJRVdFUl9QUk9WSURFUiwgd3NkbEVkaXRvcik7Ci0gICAgfQotICB9ICAgICAgICAgIAotICAgICAgCi0KLSAgcHJvdGVjdGVkIElEZXRhaWxzVmlld2VyUHJvdmlkZXIgZ2V0QXBwbGljYWJsZURldGFpbHNQcm92aWRlcihPYmplY3Qgb2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBJRGV0YWlsc1ZpZXdlclByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbaV0uaXNBcHBsaWNhYmxlKG9iamVjdCkpCi0gICAgICB7Ci0gICAgICAgIHByb3ZpZGVyID0gZGV0YWlsc1ZpZXdlclByb3ZpZGVyc1tpXTsKLSAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJvdmlkZXI7Ci0gIH0KLSAgIAotICAKLSAgcHVibGljIE9iamVjdCBnZXRWaWV3ZXJLZXkoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIElEZXRhaWxzVmlld2VyUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBcHBsaWNhYmxlRGV0YWlsc1Byb3ZpZGVyKG9iamVjdCk7Ci0gICAgcmV0dXJuIHByb3ZpZGVyICE9IG51bGwgPyBwcm92aWRlci5nZXRWaWV3ZXJLZXkob2JqZWN0KSA6IG51bGw7Ci0gIH0KLSAgCi0KLSAgcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoT2JqZWN0IG9iamVjdCwgQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIElEZXRhaWxzVmlld2VyUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBcHBsaWNhYmxlRGV0YWlsc1Byb3ZpZGVyKG9iamVjdCk7Ci0gICAgcmV0dXJuIHByb3ZpZGVyICE9IG51bGwgPyBwcm92aWRlci5jcmVhdGVWaWV3ZXIob2JqZWN0LCBwYXJlbnQsIGVkaXRvclBhcnQpIDogbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvSW1wb3J0Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0ltcG9ydFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTAyN2RhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvSW1wb3J0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZGlhbG9ncy5TZWxlY3RTaW5nbGVGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLlhNTFF1aWNrU2NhbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEltcG9ydFZpZXdlciBleHRlbmRzIEJhc2VWaWV3ZXIgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotICAKLSAgcHJvdGVjdGVkIFRleHQgbmFtZXNwYWNlVGV4dDsKLSAgcHJvdGVjdGVkIFRleHQgcHJlZml4VGV4dDsKLSAgcHJvdGVjdGVkIFRleHQgbG9jYXRpb25UZXh0OwotICBCdXR0b24gc2VsZWN0QnV0dG9uOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgSW1wb3J0Vmlld2VyLgotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqIEBwYXJhbSBlZGl0b3JQYXJ0Ci0gICAqLwotICBwdWJsaWMgSW1wb3J0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICBzdXBlcihnZXRTdGF0dXNMaW5lTWFuYWdlcihlZGl0b3JQYXJ0KSk7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLSAgICBjcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy5OYW1lZENvbXBvbmVudFZpZXdlciNnZXRIZWFkaW5nVGV4dCgpCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCkKLSAgewotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9JTVBPUlQiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7IAotICAgIGNvbnRyb2wgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSwgdHJ1ZSk7ICAgICAgICAgICAgICAgICAKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KWNvbnRyb2wuZ2V0TGF5b3V0KCk7Ci0gICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVGbGF0UGFnZUhlYWRlcihjb250cm9sLCBnZXRIZWFkaW5nVGV4dCgpKTsKLQotICAgIENvbXBvc2l0ZSBjID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShjb250cm9sLCAxLCB0cnVlKTsKLQotICAgIExhYmVsIGJvZ3VzID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGMsIDAsICIiKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIAotICAgIGJvZ3VzLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUoYywgMiwgdHJ1ZSk7IAotICAgIEdyaWRMYXlvdXQgbGF5b3V0MiA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Mi5tYWtlQ29sdW1uc0VxdWFsV2lkdGggID0gZmFsc2U7Ci0gICAgbGF5b3V0Mi5udW1Db2x1bW5zID0gMzsKLSAgICBsYXlvdXQyLm1hcmdpbkhlaWdodCA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQyKTsKLQotICAgIExhYmVsIG5hbWVzcGFjZUxhYmVsID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkFNRVNQQUNFIikpOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlVGV4dCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVUZXh0RmllbGQoY29tcG9zaXRlKTsKLSAgICBuYW1lc3BhY2VUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgLy8gcGxhY2UgaG9sZGVyCi0gICAgQ29udHJvbCBjb249IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDAsICIiKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBjb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBMYWJlbCBwcmVmaXhMYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDAsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BSRUZJWCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHByZWZpeFRleHQgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlVGV4dEZpZWxkKGNvbXBvc2l0ZSk7Ci0gICAgcHJlZml4VGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LHRoaXMpOwotICAgIHByZWZpeFRleHQuc2V0RW5hYmxlZChmYWxzZSk7ICAgIAotCi0gICAgLy8gcGxhY2UgaG9sZGVyCi0gICAgQ29udHJvbCBjb24yPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAwLCAiIik7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgY29uMi5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIGxvY2F0aW9uTGFiZWwgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAwLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9MT0NBVElPTiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGxvY2F0aW9uVGV4dCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVUZXh0RmllbGQoY29tcG9zaXRlKTsKLSAgICBsb2NhdGlvblRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICBzZWxlY3RCdXR0b24gPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlUHVzaEJ1dHRvbihjb21wb3NpdGUsICIuLi4iKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHNlbGVjdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBzZWxlY3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7ICAgIAotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0cnkKLSAgICB7ICAgICAgICAgIAotICAgICAgTm9kZSBub2RlID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXROb2RlRm9yT2JqZWN0KGlucHV0KTsKLSAgICAgIHVwZGF0ZSgpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIGlmIChvbGRJbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkucmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIob2xkSW5wdXQsIHRoaXMpOwotICAgIH0KLQotICAgIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoaW5wdXQsIHRoaXMpOwotICAgIG9sZElucHV0ID0gaW5wdXQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFdmVudEhlbHBlcihFbGVtZW50IGVsZW1lbnQsIEV2ZW50IGV2ZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkKLSAgICB7ICAKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudClpbnB1dCkuZ2V0RWxlbWVudCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZsYXRWaWV3VXRpbGl0eS51cGRhdGVGbGF0UGFnZUhlYWRlclRpdGxlKGdldEhlYWRpbmdUZXh0KCkpOwotICAgIHByZWZpeFRleHQuc2V0VGV4dCgiIik7Ci0gICAgbG9jYXRpb25UZXh0LnNldFRleHQoIiIpOwotICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Ci0gICAgbmFtZXNwYWNlVGV4dC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsgICAgCi0gICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsKLSAgICBTdHJpbmcgbG9jYXRpb25WYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJsb2NhdGlvbiIpOwotICAgIGxvY2F0aW9uVGV4dC5zZXRUZXh0KGxvY2F0aW9uVmFsdWUgIT0gbnVsbCA/IGxvY2F0aW9uVmFsdWUgOiAiIik7ICAKLQotICAgIFN0cmluZyBuYW1lc3BhY2VWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiKTsKLSAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQobmFtZXNwYWNlVmFsdWUgIT0gbnVsbCA/IG5hbWVzcGFjZVZhbHVlIDogIiIpOwotICAgIAotICAgIFN0cmluZyBwcmVmaXggPSAoKEltcG9ydClpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldFByZWZpeChuYW1lc3BhY2VWYWx1ZSk7Ci0gICAgcHJlZml4VGV4dC5zZXRUZXh0KHByZWZpeCAhPSBudWxsID8gcHJlZml4IDogIiIpOwotICB9Ci0KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgQmFzZVdpbmRvdyNkb0hhbmRsZUV2ZW50KEV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotLy8gICAgaWYgKGV2ZW50LndpZGdldCA9PSBwcmVmaXhUZXh0KQotLy8gICAgewotLy8gICAgICBTdHJpbmcgbmV3UHJlZml4ID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0vLyAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBWYWxpZGF0ZUhlbHBlci5jaGVja1hNTFByZWZpeChuZXdQcmVmaXgpOwotLy8gICAgCi0vLyAgICAgIGlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCB8fCBlcnJvck1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLS8vICAgICAgewotLy8gICAgICAgIEltcG9ydCBpbXBvcnRPYmogPSAoSW1wb3J0KWlucHV0OwotLy8gICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgaW1wb3J0RWxlbWVudCA9IFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChpbXBvcnRPYmopOwotLy8gICAgICAgIAotLy8gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGltcG9ydE9iai5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0vLyAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLS8vICAKLS8vICAgICAgICBTdHJpbmcgbnNGcm9tTW9kZWwgPSBpbXBvcnRPYmouZ2V0TmFtZXNwYWNlVVJJKCk7Ci0vLyAgICAgICAgU3RyaW5nIG5zRnJvbURPTSA9IGltcG9ydEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obnNGcm9tTW9kZWwpOwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuc0Zyb21ET00pOwotLy8gIAotLy8gICAgICAgIFN0cmluZyBvbGRQcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChuc0Zyb21Nb2RlbCk7Ci0vLyAgICAgICAgZGVmaW5pdGlvbkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiICsgb2xkUHJlZml4KTsKLS8vICAgICAgICBkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBuZXdQcmVmaXgsIG5zRnJvbU1vZGVsKTsKLS8vICAgICAgfQotLy8gICAgfQotICB9ICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSkKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgICAgdXBkYXRlKCk7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBzZWxlY3RCdXR0b24pCi0gICAgewotICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBudWxsOwotLy8gVE9ETzogcG9ydCBjaGVjawotICAgICAgcmVzb3VyY2VTZXQgPSAoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KWlucHV0KS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCi0gICAgICBXU0RMRWRpdG9yIGVkaXRvciA9IChXU0RMRWRpdG9yKWVkaXRvclBhcnQ7Ci0gICAgICBJRmlsZSBjdXJyZW50V1NETEZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9yLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLSAgICAgIAotICAgICAgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIG51bGwsIHRydWUpOwotICAgICAgU3RyaW5nIFtdIGZpbHRlcnMgPSB7ICJ4c2QiLCAid3NkbCIgfTsKLSAgICAgIElGaWxlIFtdIGV4Y2x1ZGVkRmlsZXMgPSB7IGN1cnJlbnRXU0RMRmlsZSB9OwotICAgICAgCi0gICAgICBkaWFsb2cuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJzLCBleGNsdWRlZEZpbGVzKTsKLSAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfU0VMRUNUIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBkaWFsb2cuc2V0VGl0bGUoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfU0VMRUNUX0ZJTEUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0RFU0NSSVBUSU9OX1NFTEVDVF9XU0RMX09SX1hTRCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaW50IHJjID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgIGlmIChyYyA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotICAgICAgewotICAgICAgICBJRmlsZSBzZWxlY3RlZEZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAvL2lmIChzZWxlY3RlZEZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkuZXF1YWxzKGN1cnJlbnRXU0RMRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSkpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgU3lzdGVtLm91dC5wcmludGxuKCJTQU1FIEZJTEU6IiArIGN1cnJlbnRXU0RMRmlsZS5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgLy99Ci0KLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlUmVsYXRpdmVVUkkoc2VsZWN0ZWRGaWxlLCBjdXJyZW50V1NETEZpbGUsIHRydWUpOwotCi0gICAgICAgIEltcG9ydCBpbXBvcnRPYmogPSAoSW1wb3J0KWlucHV0OwotICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGltcG9ydEVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoaW1wb3J0T2JqKTsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaW1wb3J0T2JqLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBpbXBvcnRUYXJnZXROYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHByZWZpeFRleHQuZ2V0VGV4dCgpOwotICAgICAgICBTdHJpbmcgdW5pcXVlUHJlZml4ID0gIiI7Ci0gICAgICAKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHNlbGVjdGVkRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOyAgICAgIAotCi0JCS8vIG5vdGUgdGhhdCB0aGUgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hIHdvcmtzIGZvciBib3RoIHNjaGVtYSBhbmQgd3NkbCBmaWxlcwotCQkvLyBJIHNob3VsZCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBjb252ZW5pZW5jZSBtZXRob2QKLSAgICAgICAgaW1wb3J0VGFyZ2V0TmFtZXNwYWNlID0gIFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEodXJpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmVxdWFscygiIikpCi0gICAgICAgIHsKLSAgICAgICAgICB1bmlxdWVQcmVmaXggPSBnZXRVbmlxdWVQcmVmaXgoZGVmaW5pdGlvbiwgdXJpLmZpbGVFeHRlbnNpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdW5pcXVlUHJlZml4ID0gcHJlZml4OyAKLSAgICAgICAgfQotICAgICAgIAotICAgICAgICAKLSAgICAgICAgaWYgKGltcG9ydFRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8Ci0gICAgICAgICAgIChpbXBvcnRUYXJnZXROYW1lc3BhY2UgIT0gbnVsbCAmJiBpbXBvcnRUYXJnZXROYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuOyAgLy8gd2hhdCB0byBkbyB3aXRoIG5vIG5hbWVzcGFjZSBkb2NzPwotICAgICAgICB9Ci0KLSAgICAgICAgaW1wb3J0RWxlbWVudC5zZXRBdHRyaWJ1dGUoImxvY2F0aW9uIiwgbG9jYXRpb24pOwotICAgICAgICBpbXBvcnRFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIiwgaW1wb3J0VGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICBkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyB1bmlxdWVQcmVmaXgsIGltcG9ydFRhcmdldE5hbWVzcGFjZSk7Ci0KLSAgICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KGltcG9ydFRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIGxvY2F0aW9uVGV4dC5zZXRUZXh0KGxvY2F0aW9uKTsKLSAgICAgICAgcHJlZml4VGV4dC5zZXRUZXh0KHVuaXF1ZVByZWZpeCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlUHJlZml4KERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIGluaXRQcmVmaXgpCi0gIHsKLSAgICBTdHJpbmcgdW5pcXVlUHJlZml4OwotICAgIE1hcCBtYXAgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLQotICAgIGlmIChkZWZpbml0aW9uLmdldE5hbWVzcGFjZShpbml0UHJlZml4KSA9PSBudWxsKQotICAgIHsKLSAgICAgIHVuaXF1ZVByZWZpeCA9IGluaXRQcmVmaXg7Ci0gICAgfQotICAgIGVsc2UgLy8gaWYgdXNlZCwgdGhlbiB0cnkgdG8gY3JlYXRlIGEgdW5pcXVlIG9uZQotICAgIHsKLSAgICAgIFN0cmluZyB0ZW1wUHJlZml4ID0gaW5pdFByZWZpeDsKLSAgICAgIGludCBpID0gMTsKLSAgICAgIHdoaWxlKG1hcC5jb250YWluc0tleSh0ZW1wUHJlZml4ICsgaSkpCi0gICAgICB7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICAgIHVuaXF1ZVByZWZpeCA9IHRlbXBQcmVmaXggKyBpOwotICAgIH0KLSAgICByZXR1cm4gdW5pcXVlUHJlZml4OyAgICAKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5wdXRPdXRwdXRGYXVsdFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9JbnB1dE91dHB1dEZhdWx0Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjE1OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9JbnB1dE91dHB1dEZhdWx0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHMuQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0cy5JbnZva2VEaWFsb2dCdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBJbnB1dE91dHB1dEZhdWx0Vmlld2VyIGV4dGVuZHMgTmFtZWRDb21wb25lbnRWaWV3ZXIgCi17ICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvOyAKLSAgcHJvdGVjdGVkIENvbXBvbmVudE5hbWVDb21ib0hlbHBlciBjb21wb25lbnROYW1lQ29tYm9IZWxwZXI7Ci0gIEludm9rZURpYWxvZ0J1dHRvbiBidXR0b247Ci0KLSAgcHVibGljIElucHV0T3V0cHV0RmF1bHRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7IAotICAgIFN0cmluZyByZXN1bHQgPSAiIjsKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElucHV0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0lOUFVUIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBPdXRwdXQpCi0gICAgewotICAgICAgcmVzdWx0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfT1VUUFVUIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9GQVVMVCIpOyAvLyROT04tTkxTLTEkCi0gICAgfSAgICAgICAgICAgICAgICAgCi0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAgCi0KLSAgcHVibGljIGJvb2xlYW4gaXNPYmplY3RFeHRlbnNpYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgcG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5wb3B1bGF0ZVByaW1hcnlEZXRhaWxzU2VjdGlvbihwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgIAotICAgIExhYmVsIG1lc3NhZ2VMYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDAsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX01FU1NBR0UiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDQ29tYm9Cb3goY29tcG9zaXRlKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7ICAgICAgCi0KLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIgPSBuZXcgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyKGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDb21wb25lbnROYW1lTGlzdChDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB1dGlsLmdldE1lc3NhZ2VOYW1lcygpOwotICAgICAgfQotCi0gICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKQotICAgICAgewotICAgICAgICByZXR1cm4gV1NETENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgYnV0dG9uID0gbmV3IEludm9rZURpYWxvZ0J1dHRvbihjb21wb3NpdGUsIGdldElucHV0KCkpOwotICAgIGJ1dHRvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKQotICB7Ci0gICAgc3VwZXIudXBkYXRlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIudXBkYXRlKGlucHV0KTsKLSAgICBidXR0b24uc2V0SW5wdXQoaW5wdXQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXZlbnRIZWxwZXIoRWxlbWVudCBlbGVtZW50LCBFdmVudCBldmVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHN1cGVyLmhhbmRsZUV2ZW50SGVscGVyKGVsZW1lbnQsIGV2ZW50KTsKLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIuaGFuZGxlRXZlbnRIZWxwZXIoZWxlbWVudCwgZXZlbnQpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9NZXNzYWdlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL01lc3NhZ2VWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4ZTBjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL01lc3NhZ2VWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlVmlld2VyIGV4dGVuZHMgTmFtZWRDb21wb25lbnRWaWV3ZXIgCi17ICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBNZXNzYWdlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIGVkaXRvclBhcnQpOyAgICAKLSAgfSAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCkKLSAgeyAKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTUVTU0FHRSIpOyAvLyROT04tTkxTLTEkCi0gIH0gICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvTmFtZWRDb21wb25lbnRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvTmFtZWRDb21wb25lbnRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczMDJkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL05hbWVkQ29tcG9uZW50Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlNtYXJ0UmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE5hbWVkQ29tcG9uZW50Vmlld2VyIGV4dGVuZHMgQmFzZVZpZXdlciBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29udHJvbDsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZUZpZWxkOyAgCi0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotCi0gIHB1YmxpYyBOYW1lZENvbXBvbmVudFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgc3VwZXIoZ2V0U3RhdHVzTGluZU1hbmFnZXIoZWRpdG9yUGFydCkpOyAgICAKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OyAgICAgICAgICAgICAgICAgIAotCi0gICAgY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICB9IAotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKTsgIAotCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgcG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAJQ29tcG9zaXRlIGdyb3VwID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIsIHRydWUpOwotIAkKLSAgCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIENvbXBvc2l0ZSBuYW1lRmllbGRDb21wb3NpdGUgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKGdyb3VwLCAyLCB0cnVlKTsKLQkoKEdyaWRMYXlvdXQpbmFtZUZpZWxkQ29tcG9zaXRlLmdldExheW91dCgpKS5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgKChHcmlkTGF5b3V0KW5hbWVGaWVsZENvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubWFyZ2luSGVpZ2h0ID0gMDsgCQotCSAKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCAgPSBmYWxzZTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDQ7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQotICAgIG5hbWVGaWVsZENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsgICAgICAKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMTsKLSAgICBnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLSAgICBuYW1lRmllbGRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQotICAgIExhYmVsIG5hbWVMYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChuYW1lRmllbGRDb21wb3NpdGUsIDAsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05BTUUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lRmllbGQgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlVGV4dEZpZWxkKG5hbWVGaWVsZENvbXBvc2l0ZSk7ICAKLSAgICBuYW1lRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7ICAKLSAgICAKLSAgICAvLyBwbGFjZSBob2xkZXIKLSAgICBDb250cm9sIGMgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwobmFtZUZpZWxkQ29tcG9zaXRlLCAwLCAiIik7Ci0gICAgYy5zZXRCYWNrZ3JvdW5kKG5ldyBDb2xvcihudWxsLCAwLCAyNTUsIDEwMCkpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdkLmhlaWdodEhpbnQgPSAwOwotICAgIGdkLndpZHRoSGludCA9IDA7Ci0gICAgYy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAJCi0gICAgcmV0dXJuIG5hbWVGaWVsZENvbXBvc2l0ZTsKLSAgfSAKLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgCi0JU2FzaEZvcm0gc2FzaEZvcm0gPSBuZXcgU2FzaEZvcm0ocGFyZW50LCBTV1QuQk9SREVSKTsKLQlzYXNoRm9ybS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQljb250cm9sID0gc2FzaEZvcm07Ci0Jc2FzaEZvcm0uc2V0T3JpZW50YXRpb24oU1dULkhPUklaT05UQUwpOwotCQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKHNhc2hGb3JtLCAxLCB0cnVlKTsgICAgICAgIAotCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KWNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLSAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlRmxhdFBhZ2VIZWFkZXIoY29tcG9zaXRlLCBnZXRIZWFkaW5nVGV4dCgpKTsKLSAgICAgICAKLSAgICBwb3B1bGF0ZVByaW1hcnlEZXRhaWxzU2VjdGlvbihjb21wb3NpdGUpOwotICAgIAotCVRhYmJlZFZpZXdlciB0YWJiZWRWaWV3ZXIgPSBuZXcgVGFiYmVkVmlld2VyKChXU0RMRWRpdG9yKWVkaXRvclBhcnQpOwotCi0JQ29udHJvbCBjID0gdGFiYmVkVmlld2VyLmNyZWF0ZUNvbnRyb2woc2FzaEZvcm0pOwotCWMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7ICAJICAgICAJCi0gIH0KLSAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7ICAgIAotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0cnkKLSAgICB7ICAgICAgICAgIAotICAgICAgTm9kZSBub2RlID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXROb2RlRm9yT2JqZWN0KGlucHV0KTsKLSAgICAgIHVwZGF0ZSgpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIGlmIChvbGRJbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkucmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIob2xkSW5wdXQsIHRoaXMpOwotICAgIH0KLQotICAgIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoaW5wdXQsIHRoaXMpOwotICAgIG9sZElucHV0ID0gaW5wdXQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudClpbnB1dCkuZ2V0RWxlbWVudCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZmxhdFZpZXdVdGlsaXR5LnVwZGF0ZUZsYXRQYWdlSGVhZGVyVGl0bGUoZ2V0SGVhZGluZ1RleHQoKSk7Ci0KLSAgICBuYW1lRmllbGQuc2V0VGV4dCgiIik7Ci0gICAgU3RyaW5nIG5hbWVWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotICAgIG5hbWVGaWVsZC5zZXRUZXh0KG5hbWVWYWx1ZSAhPSBudWxsID8gbmFtZVZhbHVlIDogIiIpOyAgCi0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkKLSAgewotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBCYXNlV2luZG93I2RvSGFuZGxlRXZlbnQoRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoaW5wdXQpOwotICAgIGhhbmRsZUV2ZW50SGVscGVyKGVsZW1lbnQsIGV2ZW50KTsgICAKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0gICAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXZlbnRIZWxwZXIoRWxlbWVudCBlbGVtZW50LCBFdmVudCBldmVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkKLSAgICB7ICAKLSAgICAgIGlmIChldmVudC53aWRnZXQgPT0gbmFtZUZpZWxkKQotICAgICAgeyAKLSAgICAgICAgbmV3IFNtYXJ0UmVuYW1lQWN0aW9uKGlucHV0LCBuYW1lRmllbGQuZ2V0VGV4dCgpKS5ydW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkpCi0gICAgewotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICAgIGlmICghY29udHJvbC5pc0Rpc3Bvc2VkKCkpCi0gICAgICB7ICAgICAgCi0gICAgICAgIHVwZGF0ZSgpOwotICAgICAgfSAgCi0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9PcGVyYXRpb25WaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvT3BlcmF0aW9uVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOWVhNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9PcGVyYXRpb25WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvblZpZXdlciBleHRlbmRzIE5hbWVkQ29tcG9uZW50Vmlld2VyIAoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBPcGVyYXRpb25WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX09QRVJBVElPTiIpOyAgLy8kTk9OLU5MUy0xJAotICB9ICAKLQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIucG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24ocGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAKLSAgICBMYWJlbCBwYXJhbWV0ZXJPcmRlckxhYmVsID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUEFSQU1FVEVSX09SREVSIikpOyAgLy8kTk9OLU5MUy0xJAotICAgIFRleHQgcGFyYW1ldGVyT3JkZXJGaWVsZCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVUZXh0RmllbGQoY29tcG9zaXRlKTsgIAotICAgIHBhcmFtZXRlck9yZGVyRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgLy9idXR0b24uc2V0VGV4dCgiLi4uIik7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1BhcnRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUGFydFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTk5N2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUGFydFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzLkludm9rZURpYWxvZ0J1dHRvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgUGFydFZpZXdlciBleHRlbmRzIE5hbWVkQ29tcG9uZW50Vmlld2VyCi17ICAgCi0gIHByb3RlY3RlZCBDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvOwotICBwcm90ZWN0ZWQgQ0NvbWJvIHJlZmVyZW5jZUtpbmRDb21ibzsgCi0gIHByb3RlY3RlZCBMYWJlbCBjb21wb25lbnROYW1lTGFiZWw7Ci0gIEludm9rZURpYWxvZ0J1dHRvbiBidXR0b247Ci0vLyAgQnV0dG9uIGltcG9ydEJ1dHRvbjsKLSAgCi0KLSAgcHVibGljIFBhcnRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BBUlQiKTsgIC8vJE5PTi1OTFMtMSQKLSAgfSAKLQotICBwdWJsaWMgYm9vbGVhbiBpc09iamVjdEV4dGVuc2libGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgcG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5wb3B1bGF0ZVByaW1hcnlEZXRhaWxzU2VjdGlvbihwYXJlbnQpOwotICAgICAKLSAgICBMYWJlbCBjb21wb25lbnRUeXBlTGFiZWwgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9SRUZFUkVOQ0VfS0lORCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHJlZmVyZW5jZUtpbmRDb21ibyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDQ29tYm9Cb3goY29tcG9zaXRlKTsKLSAgICByZWZlcmVuY2VLaW5kQ29tYm8uYWRkKCJlbGVtZW50Iik7Ci0gICAgcmVmZXJlbmNlS2luZENvbWJvLmFkZCgidHlwZSIpOwotICAgIHJlZmVyZW5jZUtpbmRDb21iby5zZXRUZXh0KCJ0eXBlIik7Ci0gICAgcmVmZXJlbmNlS2luZENvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0gICAgTGFiZWwgcGggPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiIik7IAotICAgIAotICAgIGNvbXBvbmVudE5hbWVMYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSk7ICAgLy8kTk9OLU5MUy0xJAotCi0gICAgY29tcG9uZW50TmFtZUNvbWJvID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNDb21ib0JveChjb21wb3NpdGUpOwotICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBidXR0b24gPSBuZXcgSW52b2tlRGlhbG9nQnV0dG9uKGNvbXBvc2l0ZSwgZ2V0SW5wdXQoKSk7Ci0gICAgCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfSAgCi0gICAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KWlucHV0OwotICAgICAgYm9vbGVhbiBpc1R5cGUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmlzVHlwZShwYXJ0KTsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0UGFydENvbXBvbmVudFJlZmVyZW5jZShwYXJ0KTsKLQotICAgICAgLy8gdXBkYXRlIHRoZSBjb21iby1ib3ggY29udGVudAotICAgICAgLy8KLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVBbGwoKTsgCi0gICAgICBMaXN0IGNvbXBMaXN0ID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRDb21wb25lbnROYW1lTGlzdChwYXJ0LCBpc1R5cGUpOwotICAgICAgaWYgKGNvbXBMaXN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAgY29tcExpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoKFN0cmluZylpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICB9IAotICAgICAgCi0gICAgICBpZiAoaXNUeXBlKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVmZXJlbmNlS2luZENvbWJvLnNldFRleHQoInR5cGUiKTsKLSAgICAgICAgY29tcG9uZW50TmFtZUxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVFlQRSIpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldFRleHQodmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIiIpOwotICAgICAgICBidXR0b24uc2V0UmVmZXJlbmNlS2luZCgidHlwZSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZWZlcmVuY2VLaW5kQ29tYm8uc2V0VGV4dCgiZWxlbWVudCIpOwotICAgICAgICBjb21wb25lbnROYW1lTGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9FTEVNRU5UIikpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dCh2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAiIik7Ci0gICAgICAgIGJ1dHRvbi5zZXRSZWZlcmVuY2VLaW5kKCJlbGVtZW50Iik7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGJ1dHRvbi5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICBidXR0b24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotICAgICAgc3VwZXIudXBkYXRlKCk7ICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9ICAgICAgIAotICAgICAgCi0gICAgIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFdmVudEhlbHBlcihFbGVtZW50IGVsZW1lbnQsIEV2ZW50IGV2ZW50KQotICB7ICAKLSAgICBzdXBlci5oYW5kbGVFdmVudEhlbHBlcihlbGVtZW50LCBldmVudCk7Ci0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkKLSAgICB7ICAKLSAgICAgIGlmIChldmVudC53aWRnZXQgPT0gcmVmZXJlbmNlS2luZENvbWJvKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBUT0RPLi4uIEkgaGF2ZSBubyBpZGVhIHdoeSB3ZSBuZWVkIHRvIHVzZSBhIGRlbGF5ZWQgcnVubmFibGUgdG8gZ2V0IAotICAgICAgICAvLyB1cGRhdGluZyB3b3JraW5nIHByb3Blcmx5IC4uLi4gdGhpcyBpcyBzb21ldGhpbmcgd2UgbmVlZCB0byByZXZpc2l0Ci0gICAgICAgIERlbGF5ZWRSZW5hbWVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBEZWxheWVkUmVuYW1lUnVubmFibGUoKFBhcnQpaW5wdXQpOwotICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOyAgCi0gICAgICB9IAotICAgIH0KLSAgfSAgICAgIAotCi0gIHByb3RlY3RlZCBjbGFzcyBEZWxheWVkUmVuYW1lUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZQotICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBQYXJ0IHBhcnQ7Ci0KLSAgICBEZWxheWVkUmVuYW1lUnVubmFibGUoUGFydCBwYXJ0KQotICAgIHsKLSAgICAgIHRoaXMucGFydCA9IHBhcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgICAgICAgICAgICAgICAgICAKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBib29sZWFuIGlzVHlwZSA9IHJlZmVyZW5jZUtpbmRDb21iby5nZXRUZXh0KCkuZXF1YWxzKCJ0eXBlIik7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZShwYXJ0LCBpc1R5cGUsIG51bGwpOyAgICAKLSAgICB9Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBjb21wb25lbnROYW1lQ29tYm8pCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpaW5wdXQ7Ci0gICAgICBib29sZWFuIGlzVHlwZSA9IHJlZmVyZW5jZUtpbmRDb21iby5nZXRUZXh0KCkuZXF1YWxzKCJ0eXBlIik7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZShwYXJ0LCBpc1R5cGUsIGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCkpOyAgICAgICAgICAKLSAgICB9Ci0gIH0gCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0VHlwZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0VHlwZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODVmZGZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydFR5cGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUG9ydFR5cGVWaWV3ZXIgZXh0ZW5kcyBOYW1lZENvbXBvbmVudFZpZXdlciAKLXsgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgUG9ydFR5cGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BPUlRUWVBFIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzT2JqZWN0RXh0ZW5zaWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1BvcnRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2VmY2Q1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0cy5Db21wb25lbnROYW1lQ29tYm9IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzLkludm9rZURpYWxvZ0J1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFBvcnRWaWV3ZXIgZXh0ZW5kcyBOYW1lZENvbXBvbmVudFZpZXdlciAKLXsgIAotICBwcm90ZWN0ZWQgQ0NvbWJvIGNvbXBvbmVudE5hbWVDb21ibzsgICAgIAotICBwcm90ZWN0ZWQgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyIGNvbXBvbmVudE5hbWVDb21ib0hlbHBlcjsKLSAgSW52b2tlRGlhbG9nQnV0dG9uIGJ1dHRvbjsKLQotICBwdWJsaWMgUG9ydFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgICAgCi0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUE9SVCIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIucG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24ocGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAKLSAgICBMYWJlbCBiaW5kaW5nTGFiZWwgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAwLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICBjb21wb25lbnROYW1lQ29tYm8gPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ0NvbWJvQm94KGNvbXBvc2l0ZSk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOyAgIAotCi0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyID0gbmV3IENvbXBvbmVudE5hbWVDb21ib0hlbHBlcihjb21wb25lbnROYW1lQ29tYm8pCi0gICAgewotICAgICAgcHJvdGVjdGVkIExpc3QgZ2V0Q29tcG9uZW50TmFtZUxpc3QoQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsKQotICAgICAgewotICAgICAgICByZXR1cm4gdXRpbC5nZXRCaW5kaW5nTmFtZXMoKTsKLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFdTRExDb25zdGFudHMuQklORElOR19BVFRSSUJVVEU7Ci0gICAgICB9Ci0gICAgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGJ1dHRvbiA9IG5ldyBJbnZva2VEaWFsb2dCdXR0b24oY29tcG9zaXRlLCBnZXRJbnB1dCgpKTsKLSAgICBidXR0b24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfSAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKQotICB7Ci0gICAgc3VwZXIudXBkYXRlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIudXBkYXRlKGlucHV0KTsKLSAgICBidXR0b24uc2V0SW5wdXQoaW5wdXQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXZlbnRIZWxwZXIoRWxlbWVudCBlbGVtZW50LCBFdmVudCBldmVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHN1cGVyLmhhbmRsZUV2ZW50SGVscGVyKGVsZW1lbnQsIGV2ZW50KTsKLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIuaGFuZGxlRXZlbnRIZWxwZXIoZWxlbWVudCwgZXZlbnQpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2aWNlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZpY2VWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiMjNjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZpY2VWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVZpZXdlciBleHRlbmRzIE5hbWVkQ29tcG9uZW50Vmlld2VyIAoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBTZXJ2aWNlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIGVkaXRvclBhcnQpOyAgICAKLSAgfSAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCkKLSAgewotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9TRVJWSUNFIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvVGFiYmVkVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1RhYmJlZFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGNmMzI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvVGFiYmVkVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIFRhYmJlZFZpZXdlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBXU0RMRWRpdG9yIGVkaXRvcjsKLSAgcHJvdGVjdGVkIENUYWJGb2xkZXIgdGFiRm9sZGVyOwotICBwcm90ZWN0ZWQgVGV4dCBkb2N1bWVudGF0aW9uRmllbGQ7Ci0gIHByb3RlY3RlZCBEb2N1bWVudGF0aW9uTGlzdGVuZXIgZG9jdW1lbnRhdGlvbkxpc3RlbmVyOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBsaXN0ZW5lckVuYWJsZWQ7Ci0KLSAgcHVibGljIFRhYmJlZFZpZXdlcihXU0RMRWRpdG9yIGVkaXRvcikKLSAgewotICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfSAgICAgCi0KLSAgcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7IAotICAgIHRhYkZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHBhcmVudCwgMCk7Ci0KLSAgICBDVGFiSXRlbSB0YWIgPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0gICAgdGFiLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfRE9DVU1FTlRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkb2N1bWVudGF0aW9uRmllbGQgPSBuZXcgVGV4dCh0YWJGb2xkZXIsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5XUkFQKTsKLSAgICB0YWIuc2V0Q29udHJvbChkb2N1bWVudGF0aW9uRmllbGQpOwotICAgIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24odGFiKTsKLSAgICAKLSAgICBkb2N1bWVudGF0aW9uTGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRhdGlvbkxpc3RlbmVyKCk7Ci0gICAgbGlzdGVuZXJFbmFibGVkID0gdHJ1ZTsKLSAgICBkb2N1bWVudGF0aW9uRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIoZG9jdW1lbnRhdGlvbkxpc3RlbmVyKTsKLSAgICAKLSAgICBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotICAgIHJldHVybiB0YWJGb2xkZXI7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBsaXN0ZW5lckVuYWJsZWQgPSBmYWxzZTsKLSAgICBkb2N1bWVudGF0aW9uTGlzdGVuZXIuc2V0SW5wdXQob2JqZWN0KTsKLSAgICBkb2N1bWVudGF0aW9uRmllbGQuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICBkb2N1bWVudGF0aW9uRmllbGQuc2V0VGV4dCgiIik7Ci0gICAgCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbXBvbmVudCB8fCAhKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KSkKLSAgICB7Ci0gICAgICBkb2N1bWVudGF0aW9uRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBsaXN0ZW5lckVuYWJsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChvYmplY3QpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJkb2N1bWVudGF0aW9uIikpCi0gICAgICB7Ci0gICAgICAgIGRvY3VtZW50YXRpb25GaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbGlzdGVuZXJFbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBOb2RlIGRvY05vZGUgPSBnZXRDaGlsZE5vZGUoZWxlbWVudCwgZWxlbWVudC5nZXRQcmVmaXgoKSwgImRvY3VtZW50YXRpb24iKTsKLSAgICAgIGlmIChkb2NOb2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgdGV4dE5vZGUgPSBkb2NOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgaWYgKHRleHROb2RlICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgU3RyaW5nIHRleHROb2RlVmFsdWUgPSB0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICBkb2N1bWVudGF0aW9uRmllbGQuc2V0VGV4dCh0ZXh0Tm9kZVZhbHVlICE9IG51bGwgPyB0ZXh0Tm9kZVZhbHVlIDogIiIpOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBsaXN0ZW5lckVuYWJsZWQgPSB0cnVlOwotLy8gVGhlcmUgYXBwZWFycyB0byBiZSBhIGRlZmVjdCBpbiB0aGUgbW9kZWwuLi5pdCBkb2Vzbid0IHJldHVybgotLy8gdGhlIGRvY3VtZW50YXRpb25FbGVtZW50IGV2ZW4gdGhvdWdoIGl0IGV4aXN0cwotLy8gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotLy8gICAgewotLy8gICAgICBXU0RMRWxlbWVudCBlbGVtID0gKFdTRExFbGVtZW50KW9iamVjdDsKLS8vICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlbGVtID0gIiArIGVsZW0pOwotLy8KLS8vICAgICAgaWYgKGVsZW0gIT0gbnVsbCkKLS8vICAgICAgewotLy8gICAgICAgIEVsZW1lbnQgZG9jID0gZWxlbS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9jTm9kZSA9ICIgKyBkb2MpOwotLy8gICAgICAgIGlmIChkb2MgIT0gbnVsbCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBOb2RlIHRleHROb2RlID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLS8vICAgICAgICAgIGlmICh0ZXh0Tm9kZSAhPSBudWxsKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBkb2N1bWVudGF0aW9uRmllbGQuc2V0VGV4dCh0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0gIH0KLSAgIAotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAobyAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXRJbnB1dChvKTsgCi0gICAgICB9Ci0gICAgfQotICB9ICAgCi0KLSAgcHVibGljIE5vZGUgZ2V0Q2hpbGROb2RlKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgY2hpbGROYW1lKQotICB7Ci0gICAgTm9kZUxpc3QgbGlzdCA9IG51bGw7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIH0KLSAgICBTdHJpbmcgdGFyZ2V0TmFtZTsKLSAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICB0YXJnZXROYW1lID0gcHJlZml4ICsgIjoiICsgY2hpbGROYW1lOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGFyZ2V0TmFtZSA9IGNoaWxkTmFtZTsKLSAgICB9ICAKLSAgIAotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIFBlcmZvcm1hbmNlIGlzc3VlIHBlcmhhcHM/Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGxpc3QuaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobGlzdC5pdGVtKGkpLmdldE5vZGVOYW1lKCkuZXF1YWxzKHRhcmdldE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLQotCi0gIGNsYXNzIERvY3VtZW50YXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0OwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQoTW9kaWZ5RXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICAgIHsKLSAgICAgIGlmIChsaXN0ZW5lckVuYWJsZWQpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChvYmplY3QpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBkb2NOb2RlID0gZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIGVsZW1lbnQuZ2V0UHJlZml4KCksICJkb2N1bWVudGF0aW9uIik7Ci0gICAgICAgICAgaWYgKGRvY05vZGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBOb2RlIHRleHROb2RlID0gZG9jTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBpZiAodGV4dE5vZGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGV4dE5vZGUuc2V0Tm9kZVZhbHVlKGRvY3VtZW50YXRpb25GaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZG9jdW1lbnRhdGlvbkZpZWxkLmdldFRleHQoKSAhPSBudWxsICYmIGRvY3VtZW50YXRpb25GaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2NOb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0IG5ld1RleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZG9jdW1lbnRhdGlvbkZpZWxkLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgZG9jTm9kZS5hcHBlbmRDaGlsZChuZXdUZXh0Tm9kZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFkZEVsZW1lbnRBY3Rpb24gYWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24oZWxlbWVudCwgZWxlbWVudC5nZXRQcmVmaXgoKSwgImRvY3VtZW50YXRpb24iLCBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICBFbGVtZW50IG5ld0RvY3VtZW50YXRpb24gPSBhY3Rpb24uZ2V0TmV3RWxlbWVudCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG5ld0RvY3VtZW50YXRpb24uZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgICAgb3JnLnczYy5kb20uVGV4dCBuZXdUZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRvY3VtZW50YXRpb25GaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgbmV3RG9jdW1lbnRhdGlvbi5hcHBlbmRDaGlsZChuZXdUZXh0Tm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0gICAgICAgICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9XU0RMRGV0YWlsc1ZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9XU0RMRGV0YWlsc1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjNhZWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvV1NETERldGFpbHNWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotcHVibGljIGNsYXNzIFdTRExEZXRhaWxzVmlld2VyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3IgZWRpdG9yOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNsaWVudDsgIAotICBwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUJvb2s7Ci0gIHByb3RlY3RlZCBFeHRlbnNpYmxlRGV0YWlsc1ZpZXdlclByb3ZpZGVyIGRldGFpbHNWaWV3ZXJQcm92aWRlcjsgIAotICBwcm90ZWN0ZWQgSGFzaE1hcCB2aWV3ZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEVNUFRZX1ZJRVdFUl9LRVkgPSAiRU1QVFlfVklFV0VSX0tFWSI7Ci0gIHByb3RlY3RlZCBWaWV3ZXIgZW1wdHlWaWV3ZXI7Ci0KLSAgcHVibGljIFdTRExEZXRhaWxzVmlld2VyKFdTRExFZGl0b3IgZWRpdG9yKQotICB7Ci0gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGRldGFpbHNWaWV3ZXJQcm92aWRlciA9IG5ldyBFeHRlbnNpYmxlRGV0YWlsc1ZpZXdlclByb3ZpZGVyKGVkaXRvcik7ICAgIAotICAgIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICB9Ci0gIAotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjbGllbnQgPSBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIDApOwotCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIGVtcHR5Vmlld2VyID0gbmV3IEVtcHR5Vmlld2VyKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0gICAgdmlld2VyTWFwLnB1dChFTVBUWV9WSUVXRVJfS0VZLCBlbXB0eVZpZXdlcik7Ci0gICAgcGFnZUJvb2suc2hvd1BhZ2UoZW1wdHlWaWV3ZXIuZ2V0Q29udHJvbCgpKTsKLSAgICByZXR1cm4gY2xpZW50OwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3Qgb2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgT2JqZWN0IGtleSA9IGRldGFpbHNWaWV3ZXJQcm92aWRlci5nZXRWaWV3ZXJLZXkob2JqZWN0KTsgIAotICAgICAgCi0gICAgICBpZiAoa2V5ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IEVNUFRZX1ZJRVdFUl9LRVk7Ci0gICAgICB9Ci0gICAgICBWaWV3ZXIgdmlld2VyID0gKFZpZXdlcil2aWV3ZXJNYXAuZ2V0KGtleSk7Ci0gICAgICBpZiAodmlld2VyID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IGRldGFpbHNWaWV3ZXJQcm92aWRlci5jcmVhdGVWaWV3ZXIob2JqZWN0LCBwYWdlQm9vaywgZWRpdG9yKTsKLSAgICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdmlld2VyTWFwLnB1dChrZXksIHZpZXdlcik7Ci0gICAgICAgICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIE9wZXJhdGlvblZpZXdlcikKLSAgICAgICAgICB7Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBzY2hlbWEgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpb2JqZWN0OwotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBzY2hlbWEuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZpZXdlci5zZXRJbnB1dCh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdmlld2VyLnNldElucHV0KG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFnZUJvb2suc2hvd1BhZ2Uodmlld2VyLmdldENvbnRyb2woKSk7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkKLSAgICAgIHsKLSAgICAgIAlvID0gKChXU0RMR3JvdXBPYmplY3QpbykuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgc2V0SW5wdXQobyk7ICAgICAgIAotICAgIH0KLSAgfSAgIAotfQotICAgICAgICAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvV1NETERldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9XU0RMRGV0YWlsc1ZpZXdlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNmFmMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9XU0RMRGV0YWlsc1ZpZXdlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JRGV0YWlsc1ZpZXdlclByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgV1NETERldGFpbHNWaWV3ZXJQcm92aWRlciBpbXBsZW1lbnRzIElEZXRhaWxzVmlld2VyUHJvdmlkZXIKLXsKLSAgcHVibGljIE9iamVjdCBnZXRWaWV3ZXJLZXkoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyB0b2RvLi4uLiB1c2UgYSBzd2l0Y2gKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJtZXNzYWdlIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJiaW5kaW5nIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3BlcmF0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJiaW5kaW5nT3BlcmF0aW9uIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0gICAgewotICAgICAgcmVzdWx0ID0gIm9wZXJhdGlvbiI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSAiZGVmaW5pdGlvbiI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgUGFydCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAicGFydCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgUG9ydCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAicG9ydCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgSW5wdXQgfHwgCi0gICAgICAgICAgICAgbW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPdXRwdXQgfHwKLSAgICAgICAgICAgICBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJpbnB1dE91dHB1dEZhdWx0IjsKLSAgICB9ICAgIAotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ0lucHV0IHx8IAotICAgICAgICAgICAgIG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCB8fCAKLSAgICAgICAgICAgICBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkgCi0gICAgewotICAgICAgcmVzdWx0ID0gImJpbmRpbmdJbnB1dE91dHB1dEZhdWx0IjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBQb3J0VHlwZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAicG9ydFR5cGUiOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2UpCi0gICAgewotICAgICAgcmVzdWx0ID0gInNlcnZpY2UiOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJleHRlbnNpYmlsaXR5RWxlbWVudCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgSW1wb3J0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJpbXBvcnQiOyAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJlbXB0eSI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotICBwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihPYmplY3QgbW9kZWxPYmplY3QsIENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBWaWV3ZXIgdmlld2VyID0gbnVsbDsKLSAgICBPYmplY3Qga2V5ID0gZ2V0Vmlld2VyS2V5KG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoa2V5ICE9IG51bGwpICAgICAKLSAgICB7Ci0gICAgICBpZiAoa2V5LmVxdWFscygibWVzc2FnZSIpKQotICAgICAgewotICAgICAgICB2aWV3ZXIgPSBuZXcgTWVzc2FnZVZpZXdlcihwYXJlbnQsIGVkaXRvclBhcnQpOyAKLSAgICAgIH0gCi0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJiaW5kaW5nIikpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBCaW5kaW5nVmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJkZWZpbml0aW9uIikpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBEZWZpbml0aW9uVmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7IAotICAgICAgfQotICAgICAgZWxzZSBpZiAoa2V5LmVxdWFscygiYmluZGluZ09wZXJhdGlvbiIpKQotICAgICAgewotICAgICAgICB2aWV3ZXIgPSBuZXcgQmluZGluZ09wZXJhdGlvblZpZXdlcihwYXJlbnQsIGVkaXRvclBhcnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoa2V5LmVxdWFscygib3BlcmF0aW9uIikpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBPcGVyYXRpb25WaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGtleS5lcXVhbHMoInBhcnQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IFBhcnRWaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGtleS5lcXVhbHMoInBvcnQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IFBvcnRWaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGtleS5lcXVhbHMoImlucHV0T3V0cHV0RmF1bHQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IElucHV0T3V0cHV0RmF1bHRWaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgCi0gICAgICB9ICAgIAotICAgICAgZWxzZSBpZiAoa2V5LmVxdWFscygiYmluZGluZ0lucHV0T3V0cHV0RmF1bHQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IEJpbmRpbmdJbnB1dE91dHB1dEZhdWx0Vmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7IAotICAgICAgfSAgICAgICAgCi0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJzZXJ2aWNlIikpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBTZXJ2aWNlVmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7IAotICAgICAgfQotICAgICAgZWxzZSBpZiAoa2V5LmVxdWFscygiZXh0ZW5zaWJpbGl0eUVsZW1lbnQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IEV4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7IAotICAgICAgfSAgCi0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJwb3J0VHlwZSIpKQotICAgICAgewotICAgICAgICB2aWV3ZXIgPSBuZXcgUG9ydFR5cGVWaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJpbXBvcnQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IEltcG9ydFZpZXdlcihwYXJlbnQsIGVkaXRvclBhcnQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2aWV3ZXIgPSBuZXcgRW1wdHlWaWV3ZXIocGFyZW50LCAwKTsgCi0gICAgICB9Ci0gICAgfSAgIAotICAgIHJldHVybiB2aWV3ZXI7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQXR0cmlidXRlc1RhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQXR0cmlidXRlc1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMjNmZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL0F0dHJpYnV0ZXNUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVzVGFibGUgZXh0ZW5kcyBUYWJsZVZpZXdlciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9QUk9QRVJUWSIpOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVkFMVUUiKTsgLy8kTk9OLU5MUy0xJAotCi0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotICBwcm90ZWN0ZWQgU3RyaW5nW10gY29sdW1uUHJvcGVydGllcyA9IHtQUk9QRVJUWSwgVkFMVUV9OwotICBwcm90ZWN0ZWQgUHJvcGVydHlUYWJsZVByb3ZpZGVyIHRhYmxlUHJvdmlkZXIgPSBuZXcgUHJvcGVydHlUYWJsZVByb3ZpZGVyKHRoaXMpOwotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciB0ZXh0Q2VsbEVkaXRvcjsKLSAgLy9wcm90ZWN0ZWQgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yIGNvbWJvQ2VsbEVkaXRvcjsKLSAgcHJvdGVjdGVkIElQcm9wZXJ0eVNvdXJjZSBwcm9wZXJ0eVNvdXJjZTsKLSAgCi0KLSAgcHVibGljIEF0dHJpYnV0ZXNUYWJsZShJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgc3VwZXIobmV3IFRhYmxlKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJIHwgU1dULkZMQVQpKTsgICAKLSAgCXRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7ICAgICAgICAgICAgICAgCi0gICAgZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOyAgCi0gICAgCi0gICAgc2V0Q29udGVudFByb3ZpZGVyKHRhYmxlUHJvdmlkZXIpOwotICAgIHNldExhYmVsUHJvdmlkZXIodGFibGVQcm92aWRlcik7Ci0gICAgc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvcGVydGllcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oZ2V0VGFibGUoKSwgU1dULk5PTkUsIGkpOwotICAgICAgY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc1tpXSk7Ci0gICAgICBjb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICB9ICAgICAgCi0KLSAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsgCi0gICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNDAsIDQwLCB0cnVlKTsKLSAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhKTsKLSAgICAKLSAgICBDb2x1bW5XZWlnaHREYXRhIGRhdGEyID0gbmV3IENvbHVtbldlaWdodERhdGEoODAsIDgwLCB0cnVlKTsKLSAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhMik7ICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIGdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgICAKLSAgICB0ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcihnZXRUYWJsZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gCXJlc2V0Q2VsbEVkaXRvcnMoKTsJICAgIAotCi0gICAgc2V0Q2VsbE1vZGlmaWVyKHRoaXMpOyAgICAKLSAgfSAgCi0gICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0gIAkvLyB3ZSBuZWVkIHRvIGhvb2sgdXAgb3VyIG93biBtb3VzZSBsaXN0ZW5lciBmaXJzdAotICAJLy8gc28gdGhhdCB3ZSBjYW4gdXBkYXRlIHRoZSBjZWxsRWRpdG9ycyBiZWZvcmUKLSAgCS8vIHRoZSAnaW50ZXJuYWwnIGxpc3RlbmVyIHRyaWVzIHRvIGdldCBob2xkIG9mIHRoZW0KLQlUYWJsZSB0YWJsZUNvbnRyb2wgPSAoVGFibGUpY29udHJvbDsKLQkgIHRhYmxlQ29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCSAgcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJdXBkYXRlQ2VsbEVkaXRvcnMoKTsKLQkJICB9Ci0JICB9KTsJICAJICAJCi0JICBzdXBlci5ob29rQ29udHJvbChjb250cm9sKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgLy8gSUNlbGxNb2RpZmllcgotICBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIHJldHVybiBwcm9wZXJ0eS5lcXVhbHMoVkFMVUUpOwotICB9ICAKLQotICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpbnQgY29sdW1uID0gMDsKLSAgICBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMF0pKQotICAgIHsKLSAgICAgIGNvbHVtbiA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhjb2x1bW5Qcm9wZXJ0aWVzWzFdKSkKLSAgICB7Ci0gICAgICBjb2x1bW4gPSAxOwotICAgIH0gICAgCi0gICAgcmV0dXJuIHRhYmxlUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChlbGVtZW50LCBjb2x1bW4pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgeyAgCi0gIAlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZWxlbWVudDsKLQlJUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IChJUHJvcGVydHlEZXNjcmlwdG9yKWl0ZW0uZ2V0RGF0YSgpOwotCQkKLQkvLyBpZiB0aGUgbmV3IHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbGQgdmFsdWUsIHRoZSB1c2VyIGhhcyBvbmx5IGNsaWNrZWQKLQkvLyBvbiB0aGUgY2VsbCBpbiB0aGUgY291cnNlIG9mICdicm93c2luZycgLi4uIHNvIGRvbid0IGVkaXQgdGhlIHZhbHVlCi0JT2JqZWN0IG9sZFZhbHVlID0gZ2V0VmFsdWUocHJvcGVydHlEZXNjcmlwdG9yLCBwcm9wZXJ0eSk7CQotCWlmICh2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5lcXVhbHMob2xkVmFsdWUpKSAKLQl7CQotCQkvLyB3ZSBhc3N1bWUgdGhlIHZhbHVlIGlzIGVtcHR5IHRoYXQgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgcmVtb3ZlZAotCQkvLyB0b2RvLi4uIHdlIHByb2JhYmx5IG5lZWQgdG8gbG9vayBhdCB0aGlzIGluIG1vcmUgZGV0YWlsCi0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyAmJiAoKFN0cmluZyl2YWx1ZSkubGVuZ3RoKCkgPT0gMCkKLQkJewotCQkJdmFsdWUgPSBudWxsOwotCQl9CQkgIAkKLQkJcHJvcGVydHlTb3VyY2Uuc2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0SWQoKSwgdmFsdWUpOyAgIAotCQlyZWZyZXNoKGl0ZW0uZ2V0RGF0YSgpKTsKLQl9CSAgCQkKLSAgfSAKLSAgIAotICAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNlbGxFZGl0b3JzKCkKLSAgeyAgICAgICAgICAgICAgICAKLQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvclsyXTsKLQljZWxsRWRpdG9yc1swXSA9IHRleHRDZWxsRWRpdG9yOwotCWNlbGxFZGl0b3JzWzFdID0gdGV4dENlbGxFZGl0b3I7Ci0KLQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClnZXRJbnB1dCgpOwotICAgICAgCSAKLQlJUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydHlEZXNjcmlwdG9ycyA9IHByb3BlcnR5U291cmNlLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQlpbnQgaW5kZXggPSBnZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aCkKLQl7Ci0JICBDZWxsRWRpdG9yW10gb2xkQ2VsbEVkaXRvcnMgPSBnZXRDZWxsRWRpdG9ycygpOwotCSAgQ2VsbEVkaXRvciBvbGRDZWxsRWRpdG9yID0gKG9sZENlbGxFZGl0b3JzLmxlbmd0aCA+IDEpID8gb2xkQ2VsbEVkaXRvcnNbMV0gOiBudWxsOwotCSAgaWYgKG9sZENlbGxFZGl0b3IgIT0gbnVsbCAmJiBvbGRDZWxsRWRpdG9yICE9IHRleHRDZWxsRWRpdG9yKQotCSAgewotCSAgIG9sZENlbGxFZGl0b3IuZGVhY3RpdmF0ZSgpOwotCSAgIG9sZENlbGxFZGl0b3IuZGlzcG9zZSgpOwotCSAgfQotCSAgY2VsbEVkaXRvcnNbMV0gPSBwcm9wZXJ0eURlc2NyaXB0b3JzW2luZGV4XS5jcmVhdGVQcm9wZXJ0eUVkaXRvcihnZXRUYWJsZSgpKTsgICAgIAotCX0gIAotCXNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsgICAgIAotICB9Ci0gICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJpbmdBcnJheShMaXN0IGxpc3QpCi0gIHsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICByZXN1bHRbaV0gPSAoU3RyaW5nKWxpc3QuZ2V0KGkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCByZXNldENlbGxFZGl0b3JzKCkKLSAgewotCUNlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yWzJdOwotCWNlbGxFZGl0b3JzWzBdID0gdGV4dENlbGxFZGl0b3I7Ci0JY2VsbEVkaXRvcnNbMV0gPSB0ZXh0Q2VsbEVkaXRvcjsKLQlzZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7ICAKLSAgfQotCi0KLSAgY2xhc3MgUHJvcGVydHlUYWJsZVByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIsIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdmlld2VyOwotCi0gICAgUHJvcGVydHlUYWJsZVByb3ZpZGVyKFRhYmxlVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpICAKLSAgICB7Ci0JICByZXNldENlbGxFZGl0b3JzKCk7CQkgICAgCQotICAgICAgaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgSURPTUVsZW1lbnQpCi0gICAgICB7ICAgICAgCi0JICAgICAgcHJvcGVydHlTb3VyY2UgPSBuZXcgRXh0ZW5zaWJsZVByb3BlcnR5U291cmNlKGVkaXRvclBhcnQsIChJRE9NRWxlbWVudCluZXdJbnB1dCk7Ci0gICAgICB9IAotICAgICAgZWxzZSBpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgCXByb3BlcnR5U291cmNlID0gbmV3IFJlYWRPbmx5UHJvcGVydHlTb3VyY2UoZWRpdG9yUGFydCwgKEVsZW1lbnQpbmV3SW5wdXQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCXByb3BlcnR5U291cmNlID0gbnVsbDsKLSAgICAgIH0gICAJCi0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9ICAgICAgCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG8sIGludCBjb2x1bW5JbmRleCkgIAotICAgIHsgCi0JICBJUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IChJUHJvcGVydHlEZXNjcmlwdG9yKW87CQotICAgICAgcmV0dXJuIChjb2x1bW5JbmRleCA9PSAwKSA/IHByb3BlcnR5RGVzY3JpcHRvci5nZXRJZCgpLnRvU3RyaW5nKCkgOiBwcm9wZXJ0eVNvdXJjZS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5RGVzY3JpcHRvci5nZXRJZCgpKS50b1N0cmluZygpOwotICAgIH0gIAotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvKQotICAgIHsgICAgICAgICAKLSAgIAkgIE9iamVjdFtdIHJlc3VsdCA9IHByb3BlcnR5U291cmNlLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgIAkgIC8vIEZvciBzb21lIHN0cmFuZ2UgcmVzb24gdGhlIFZpZXdlclNvcnRlciBkb2Vzbid0IHNlZW0gdG8gYmUgd29ya2luZyBmb3IgdGhpcyB0YWJsZQotICAgCSAgLy8gQXMgYSB3b3JrYXJvdW5kIHdlIHNvcnQgdGhlbSBpbiB0aGlzIG1ldGhvZCBiZWZvcmUgcmV0dXJuaW5nIHRoZW0gdG8gdGhlIHZpZXdlcgotICAgCSAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKQotICAgCSAgewotICAgCSAgCUFycmF5cy5zb3J0KHJlc3VsdCwgbmV3IEludGVybmFsQ29tcGFyYXRvcigpKTsKLSAgIAkgIH0KLSAgIAkgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0gIAotICBjbGFzcyBJbnRlcm5hbENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yCi0gIHsKLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGUxLCBPYmplY3QgZTIpIAotCXsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciBwMSA9IChJUHJvcGVydHlEZXNjcmlwdG9yKWUxOwotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHAyID0gKElQcm9wZXJ0eURlc2NyaXB0b3IpZTI7Ci0JCVN0cmluZyBwMU5hbWUgPSBwMS5nZXREaXNwbGF5TmFtZSgpOwotCQlTdHJpbmcgcDJOYW1lID0gcDIuZ2V0RGlzcGxheU5hbWUoKTsKLQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShwMS5nZXREaXNwbGF5TmFtZSgpLCBwMi5nZXREaXNwbGF5TmFtZSgpKTsKLQl9ICAJCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9Db21wb25lbnROYW1lQ29tYm9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9Db21wb25lbnROYW1lQ29tYm9IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0Y2U1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vLyBBIGNvbnZlbmllbmNlIGNsYXNzCi0vLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvbmVudE5hbWVDb21ib0hlbHBlcgoteyAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENDb21ibyBjb21wb25lbnROYW1lQ29tYm87Ci0KLSAgcHVibGljIENvbXBvbmVudE5hbWVDb21ib0hlbHBlcihDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvKQotICB7Ci0gICAgdGhpcy5jb21wb25lbnROYW1lQ29tYm8gPSBjb21wb25lbnROYW1lQ29tYm87Ci0gIH0gICAgICAgCi0KLSAgcHVibGljIHZvaWQgdXBkYXRlKE9iamVjdCBpbnB1dCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudClpbnB1dCkuZ2V0RWxlbWVudCgpOwotICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICBTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShnZXRBdHRyaWJ1dGVOYW1lKCkpOwotICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICIiKTsKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoV1NETEVsZW1lbnQpaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgY29tcG9uZW50UmVmZXJlbmNlVXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGRlZmluaXRpb24pOwotICAgICAgamF2YS51dGlsLkxpc3QgbGlzdCA9IGdldENvbXBvbmVudE5hbWVMaXN0KGNvbXBvbmVudFJlZmVyZW5jZVV0aWwpOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoKFN0cmluZylpdGVyLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9ICAKLQotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudEhlbHBlcihFbGVtZW50IGVsZW1lbnQsIEV2ZW50IGV2ZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkKLSAgICB7ICAKLSAgICAgIGlmIChldmVudC53aWRnZXQgPT0gY29tcG9uZW50TmFtZUNvbWJvKQotICAgICAgewotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShnZXRBdHRyaWJ1dGVOYW1lKCksIGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCk7Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL0NvbXBvbmVudHNTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQ29tcG9uZW50c1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyMjViZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQ29tcG9uZW50c1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWkuRmxhdFBhZ2VTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuZmxhdHVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC51aS5GbGF0Vmlld1V0aWxpdHk7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRzU2VjdGlvbiBleHRlbmRzIEZsYXRQYWdlU2VjdGlvbgotewotICBwcm90ZWN0ZWQgQ0NvbWJvIG5hbWVzQ29tYm87Ci0gIHByb3RlY3RlZCBCdXR0b24gbmV3QnV0dG9uOwotICBwcm90ZWN0ZWQgQnV0dG9uIGltcG9ydEJ1dHRvbjsKLSAgcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLSAgICAKLSAgcHVibGljIENvbXBvbmVudHNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIEZsYXRWaWV3VXRpbGl0eSBmbGF0Vmlld1V0aWxpdHksIFN0cmluZyB0aXRsZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzKHBhcmVudCwgdGl0bGUpOwotCi0gICAgV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IFdpZGdldEZhY3RvcnkoKTsKLSAgICBmYWN0b3J5LnNldENsaWVudEFyZWFDb2xvcihmbGF0Vmlld1V0aWxpdHkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCi0gICAgQ29udHJvbCBzZWN0aW9uID0gY3JlYXRlQ29udHJvbCh0aGlzLCBmYWN0b3J5KTsKLSAgICBzZXRDb250ZW50KHNlY3Rpb24pOwotCi0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7ICAgICAgICAKLSAgfQotCi0KLSAgcHVibGljIENvbXBvbmVudHNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0aXRsZSkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgc2V0Q29sbGFwc2FibGUodHJ1ZSk7Ci0gICAgc2V0SGVhZGVyVGV4dCh0aXRsZSk7Ci0gICAgc2V0QWRkU2VwYXJhdG9yKHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAgICAgCi0KLSAgcHVibGljIENDb21ibyBnZXROYW1lc0NvbWJvKCkKLSAgewotICAgIHJldHVybiBuYW1lc0NvbWJvOwotICB9Ci0gIAotICBwdWJsaWMgQnV0dG9uIGdldE5ld01lc3NhZ2VCdXR0b24oKQotICB7Ci0gICAgIHJldHVybiBuZXdCdXR0b247Ci0gIH0KLQotICBwdWJsaWMgQnV0dG9uIGdldEltcG9ydE1lc3NhZ2VCdXR0b24oKQotICB7Ci0gICAgIHJldHVybiBpbXBvcnRCdXR0b247Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIEZsYXRQYWdlU2VjdGlvbiNjcmVhdGVDbGllbnQoQ29tcG9zaXRlLCBXaWRnZXRGYWN0b3J5KQotICAgKi8KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDbGllbnQoQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotICB7Ci0gICAgRmxhdFZpZXdVdGlsaXR5IGZsYXRWaWV3VXRpbGl0eSA9IG5ldyBGbGF0Vmlld1V0aWxpdHkodHJ1ZSk7Ci0KLSAgICBDb21wb3NpdGUgY2xpZW50ID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0gICAgbmFtZXNDb21ibyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDQ29tYm9Cb3goY2xpZW50KTsKLSAgICAgICAgICAgICAgICAgIAotICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKGNsaWVudCwgMywgdHJ1ZSk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gKEdyaWRMYXlvdXQpYnV0dG9uQ29tcG9zaXRlLmdldExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAzOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMzsKLSAgICBncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgCi0gICAgTGFiZWwgZmlsbGVyID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsZXIoYnV0dG9uQ29tcG9zaXRlLCAxKTsKLSAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSlmaWxsZXIuZ2V0TGF5b3V0RGF0YSgpOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIG5ld0J1dHRvbiA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQlVUVE9OX05FVyIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGltcG9ydEJ1dHRvbiA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVQdXNoQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQlVUVE9OX0lNUE9SVCIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcmV0dXJuIGNsaWVudDsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvRXh0ZW5zaWJsZVByb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvRXh0ZW5zaWJsZVByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjY3MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL0V4dGVuc2libGVQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5JUHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXMuWE1MUHJvcGVydHlTb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlUHJvcGVydHlTb3VyY2UgZXh0ZW5kcyBYTUxQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIKLXsKLQlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLQlwcml2YXRlIElOb2RlTm90aWZpZXIgbm9kZU5vdGlmaWVyOwotCQkJCi0JcHVibGljIEV4dGVuc2libGVQcm9wZXJ0eVNvdXJjZShJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBJTm9kZU5vdGlmaWVyIHRhcmdldCkgCi0JewotCQlzdXBlcih0YXJnZXQpOwotCQl0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OwotCQl0aGlzLm5vZGVOb3RpZmllciA9IHRhcmdldDsKLSAgCX0KLSAgCQotICAJCi0gIAkgICAgCi0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wpIAotCXsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwkJCi0JCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWF0dHJEZWNsLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7Ci0JCWlmIChjbURvY3VtZW50ICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZyBuYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgICAKLQkJCWlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKLQkJCXsKLQkJCQlJUHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXIgcHJvdmlkZXIgPSAoSVByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyKVdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5KCkuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpCi0JCQkJewotCQkJCSAgcmVzdWx0ID0gcHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKGVkaXRvclBhcnQsIChFbGVtZW50KSBub2RlTm90aWZpZXIsIG5hbWVzcGFjZVVSSSwgYXR0ckRlY2wuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJewotCQkgIHJlc3VsdCA9IHN1cGVyLmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsJCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvSW52b2tlRGlhbG9nQnV0dG9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvSW52b2tlRGlhbG9nQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMTkwNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL0ludm9rZURpYWxvZ0J1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy5JbnZva2VTZXREaWFsb2c7Ci0KLS8vIGluc3RlYWQgb2YgdXNpbmcgYSBCdXR0b24gZGlyZWN0bHkgKHdoaWNoIGNhdXNlcyBzaXppbmcvbGF5b3V0IHByb2JsZW1zKQotLy8gd2UgdXNlIHRoaXMgY2xhc3MKLXB1YmxpYyBjbGFzcyBJbnZva2VEaWFsb2dCdXR0b24gZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgoteyAKLSAgcHJvdGVjdGVkIEJ1dHRvbiBidXR0b247Ci0gIHByb3RlY3RlZCBPYmplY3QgaW5wdXQ7Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLSAgcHJvdGVjdGVkIFN0cmluZyBraW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBJbnZva2VEaWFsb2dCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IGlucHV0KQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0gICAgc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBidXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5OT05FKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBnZC5oZWlnaHRIaW50ID0gMTc7Ci0gICAgZ2Qud2lkdGhIaW50ID0gMjQ7Ci0gICAgYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotICAgIGJ1dHRvbi5zZXRUZXh0KCIuLi4iKTsKLSAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIEJ1dHRvbiBnZXRCdXR0b24oKSAKLSAgewotICAgIHJldHVybiBidXR0b247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkKLSAgewotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZUtpbmQoU3RyaW5nIGtpbmQpCi0gIHsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJ1dHRvbikKLSAgICB7Ci0gICAgICBJbnZva2VTZXREaWFsb2cgZGlhbG9nID0gbmV3IEludm9rZVNldERpYWxvZygpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgUGFydCkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nLnNldFJlZmVyZW5jZUtpbmQoa2luZCk7Ci0gICAgICB9Ci0gICAgICBkaWFsb2cucnVuKGlucHV0LCBlZGl0b3JQYXJ0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL1JlYWRPbmx5UHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9SZWFkT25seVByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDhjOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL1JlYWRPbmx5UHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZQotewotICAgIHByb3RlY3RlZCBFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICBwdWJsaWMgUmVhZE9ubHlQcm9wZXJ0eVNvdXJjZShJRWRpdG9yUGFydCBlZGl0UGFydCwgRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLSAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTmFtZWROb2RlTWFwIG1hcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBpbnQgbWFwTGVuZ3RoID0gbWFwLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcExlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cikgbWFwLml0ZW0oaSk7Ci0gICAgICAgICAgICBsaXN0LmFkZChuZXcgUHJvcGVydHlEZXNjcmlwdG9yKGF0dHIuZ2V0TmFtZSgpLCBhdHRyLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIElQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHQgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0gICAgICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpCi0gICAgewotICAgICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgoU3RyaW5nKSBpZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgaWQpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQsIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9CYXNlUmVuYW1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9CYXNlUmVuYW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJkOTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvQmFzZVJlbmFtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUmVuYW1lciBleHRlbmRzIFdTRExWaXNpdG9yCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmV3TmFtZTsKLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IGdsb2JhbENvbXBvbmVudDsKLSAgCi0gIHB1YmxpYyBCYXNlUmVuYW1lcihXU0RMRWxlbWVudCBnbG9iYWxDb21wb25lbnQsIFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgc3VwZXIoZ2xvYmFsQ29tcG9uZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgdGhpcy5nbG9iYWxDb21wb25lbnQgPSBnbG9iYWxDb21wb25lbnQ7Ci0gICAgdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXROZXdRTmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgcU5hbWUgPSBudWxsOwotICAgIGlmIChuZXdOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2xvYmFsQ29tcG9uZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIHFOYW1lID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICBxTmFtZSArPSAiOiIgKyBuZXdOYW1lOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcU5hbWUgPSBuZXdOYW1lOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvQmluZGluZ1JlbmFtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvQmluZGluZ1JlbmFtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1Y2YwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL0JpbmRpbmdSZW5hbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1JlbmFtZXIgZXh0ZW5kcyBCYXNlUmVuYW1lcgotewotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEJpbmRpbmdSZW5hbWVyLgotICAgKiBAcGFyYW0gZ2xvYmFsQ29tcG9uZW50Ci0gICAqIEBwYXJhbSBuZXdOYW1lCi0gICAqLwotICBwdWJsaWMgQmluZGluZ1JlbmFtZXIoV1NETEVsZW1lbnQgZ2xvYmFsQ29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIHN1cGVyKGdsb2JhbENvbXBvbmVudCwgbmV3TmFtZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UG9ydChQb3J0IHBvcnQpCi0gIHsKLSAgICBzdXBlci52aXNpdFBvcnQocG9ydCk7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRFQmluZGluZygpOwotICAgIGlmIChnbG9iYWxDb21wb25lbnQuZXF1YWxzKGJpbmRpbmcpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChwb3J0KTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJiaW5kaW5nIiwgZ2V0TmV3UU5hbWUoKSk7Ci0gICAgfQotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9NZXNzYWdlUmVuYW1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9NZXNzYWdlUmVuYW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzBkMjJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvTWVzc2FnZVJlbmFtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VSZW5hbWVyIGV4dGVuZHMgQmFzZVJlbmFtZXIKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBNZXNzYWdlUmVuYW1lci4KLSAgICogQHBhcmFtIGdsb2JhbENvbXBvbmVudAotICAgKiBAcGFyYW0gbmV3TmFtZQotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VSZW5hbWVyKFdTRExFbGVtZW50IGdsb2JhbENvbXBvbmVudCwgU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBzdXBlcihnbG9iYWxDb21wb25lbnQsIG5ld05hbWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRJbnB1dChJbnB1dCBpbnB1dCkKLSAgewotICAgIHN1cGVyLnZpc2l0SW5wdXQoaW5wdXQpOwotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgaWYgKGdsb2JhbENvbXBvbmVudC5lcXVhbHMobWVzc2FnZSkpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGlucHV0KTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgZ2V0TmV3UU5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgewotICAgIHN1cGVyLnZpc2l0T3V0cHV0KG91dHB1dCk7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gb3V0cHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgaWYgKGdsb2JhbENvbXBvbmVudC5lcXVhbHMob3V0cHV0KSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3Qob3V0cHV0KTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgZ2V0TmV3UU5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRGYXVsdChGYXVsdCBmYXVsdCkKLSAgewotICAgIHN1cGVyLnZpc2l0RmF1bHQoZmF1bHQpOwotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGZhdWx0LmdldEVNZXNzYWdlKCk7Ci0gICAgaWYgKGdsb2JhbENvbXBvbmVudC5lcXVhbHMoZmF1bHQpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChmYXVsdCk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibWVzc2FnZSIsIGdldE5ld1FOYW1lKCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9Qb3J0VHlwZVJlbmFtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvUG9ydFR5cGVSZW5hbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNGQwMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9Qb3J0VHlwZVJlbmFtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgUG9ydFR5cGVSZW5hbWVyIGV4dGVuZHMgQmFzZVJlbmFtZXIKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBQb3J0VHlwZVJlbmFtZXIuCi0gICAqIEBwYXJhbSBnbG9iYWxDb21wb25lbnQKLSAgICogQHBhcmFtIG5ld05hbWUKLSAgICovCi0gIHB1YmxpYyBQb3J0VHlwZVJlbmFtZXIoV1NETEVsZW1lbnQgZ2xvYmFsQ29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIHN1cGVyKGdsb2JhbENvbXBvbmVudCwgbmV3TmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nKGJpbmRpbmcpOwotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gYmluZGluZy5nZXRFUG9ydFR5cGUoKTsKLQotICAgIGlmIChnbG9iYWxDb21wb25lbnQuZXF1YWxzKHBvcnRUeXBlKSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsIGdldE5ld1FOYW1lKCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9XU0RMVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9XU0RMVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjZkNzlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvV1NETFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgV1NETFZpc2l0b3IKLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQotCi0gIHB1YmxpYyBXU0RMVmlzaXRvcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgdmlzaXREZWZpbml0aW9uKCkKLSAgewotICAgIHZpc2l0QmluZGluZ3MoKTsKLSAgICB2aXNpdE1lc3NhZ2VzKCk7Ci0gICAgdmlzaXRQb3J0VHlwZXMoKTsKLSAgICB2aXNpdFNlcnZpY2VzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEJpbmRpbmdzKCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWZpbml0aW9uLmdldEVCaW5kaW5ncygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QmluZGluZyhiaW5kaW5nKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdE1lc3NhZ2VzKCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWZpbml0aW9uLmdldEVNZXNzYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0TWVzc2FnZShtZXNzYWdlKTsgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFBvcnRUeXBlcygpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNlcnZpY2VzKCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWZpbml0aW9uLmdldEVTZXJ2aWNlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nLmdldEVQb3J0VHlwZSgpOwotICAgIGlmIChwb3J0VHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0UG9ydFR5cGUocG9ydFR5cGUpOwotICAgIH0KLQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsgCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0T3BlcmF0aW9uKG9wZXJhdGlvbik7IAotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0QmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCk7Ci0gICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpOyAgICAgICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIElucHV0IGlucHV0ID0gb3BlcmF0aW9uLmdldEVJbnB1dCgpOwotICAgIE91dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0RU91dHB1dCgpOwotICAgIAotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0SW5wdXQoaW5wdXQpOwotICAgIH0KLSAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRPdXRwdXQob3V0cHV0KTsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRmF1bHQgZmF1bHQgPSAoRmF1bHQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKGZhdWx0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0RmF1bHQoZmF1bHQpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0KFBhcnQgcGFydCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSBwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdE1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2UuZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRQYXJ0KHBhcnQpOwotICAgIH0KLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXRJbnB1dChJbnB1dCBpbnB1dCkKLSAgewotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgewotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG91dHB1dC5nZXRFTWVzc2FnZSgpOwotICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0RmF1bHQoRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBmYXVsdC5nZXRFTWVzc2FnZSgpOwotICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0UG9ydChQb3J0IHBvcnQpCi0gIHsKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0gICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdEJpbmRpbmcoYmluZGluZyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFBvcnQgcG9ydCA9IChQb3J0KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0UG9ydChwb3J0KTsKLSAgICB9Ci0gICAgCi0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdDb21wb25lbnREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpZGdldHMvTmV3Q29tcG9uZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTk1YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdDb21wb25lbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIE5ld0NvbXBvbmVudERpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVGaWVsZDsgCi0gIHByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotICBwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0gIHByb3RlY3RlZCBMaXN0IHVzZWROYW1lczsKLQotICBwdWJsaWMgTmV3Q29tcG9uZW50RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSkgCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLSAgICBuYW1lID0gZGVmYXVsdE5hbWU7ICAgICAgCi0gICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICB9Ci0gIAotICBwdWJsaWMgTmV3Q29tcG9uZW50RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSwgTGlzdCB1c2VkTmFtZXMpIAotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0gICAgbmFtZSA9IGRlZmF1bHROYW1lOyAgICAgIAotICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB0aGlzLnVzZWROYW1lcyA9IHVzZWROYW1lczsKLSAgfQotCi0gIHB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpCi0gIHsKLSAgICBjcmVhdGUoKTsKLSAgICBnZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotICAgIHNldEJsb2NrT25PcGVuKHRydWUpOwotICAgIHJldHVybiBvcGVuKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAgCi0gIHsKLSAgICBDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICAgIG5hbWVGaWVsZC5mb3JjZUZvY3VzKCk7Ci0gICAgbmFtZUZpZWxkLnNlbGVjdEFsbCgpOyAgCi0gICAgdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICBva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgfSAgCi0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZ2RGaWxsPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZEZpbGwuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZEZpbGwuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBnZEZpbGwudmVydGljYWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2RGaWxsLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkRmlsbCk7Ci0KLSAgICBMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgbmFtZUxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkFNRSIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgbmFtZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBnZC53aWR0aEhpbnQgPSAyMDA7Ci0gICAgbmFtZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotICAgIG5hbWVGaWVsZC5zZXRUZXh0KG5hbWUpOwotICAgIG5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotICAgIGNyZWF0ZUV4dGVuZGVkQ29udGVudChkaWFsb2dBcmVhKTsKLQotICAgIC8vIGVycm9yIG1lc3NhZ2UKLSAgICBlcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0gICAgZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dCgiZXJyb3IgbWVzc2FnZSBnb2VzIGhlcmUiKTsgICAgICAgICAKLSAgICBHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZDIuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZDIuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBnZDIud2lkdGhIaW50ID0gMjAwOwotICAgIGVycm9yTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QyKTsgICAgICAgICAgCi0vLyAgICBDb2xvciBjb2xvciA9IG5ldyBDb2xvcihlcnJvck1lc3NhZ2VMYWJlbC5nZXREaXNwbGF5KCksIDIwMCwgMCwgMCk7Ci0vLyAgICBlcnJvck1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQotICAgIHJldHVybiBkaWFsb2dBcmVhOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0gIH0gICAgICAgIAotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZShTdHJpbmcgbmFtZSkKLSAgewotICAJaWYgKHVzZWROYW1lcyA9PSBudWxsKQotICAJCXJldHVybiBudWxsOwotICAJCi0gIAlJdGVyYXRvciBpdGVyYXRvciA9IHVzZWROYW1lcy5pdGVyYXRvcigpOwotICAJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykgaXRlcmF0b3IubmV4dCgpKSkgewotICAJCQlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfV0FSTklOR19EVVBMSUNBVEVfTkFNRV9FWElTVFMiKTsKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICBpZiAobmFtZS5sZW5ndGgoKSA+IDApCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKG5hbWUpOwotICAgIH0gICAKLSAgICBlbHNlCi0gICAgewotICAgICAgZXJyb3JNZXNzYWdlID0gIiI7Ci0gICAgfSAgCi0gICAgZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsKLS8vICAgIG9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSAKLSAgewotICAgIGlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotICAgIHsKLSAgICAgIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aWRnZXRzL05ld0NvbXBvbmVudFdpdGhDaGlsZERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdDb21wb25lbnRXaXRoQ2hpbGREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1MDkxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aWRnZXRzL05ld0NvbXBvbmVudFdpdGhDaGlsZERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi0KLS8qCi0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgTmV3Q29tcG9uZW50RGlhbG9nIHRvIGFsbG93IGFkZGl0aW9uYWwgd2lkZ2V0cy4gIE1vcmUKLSAqIHNwZWNpZmljYWxseSwgdGhlICdjcmVhdGUgc3ViLWNvbXBvbmVudHMnIGNoZWNrYm94Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb21wb25lbnRXaXRoQ2hpbGREaWFsb2cgZXh0ZW5kcyBOZXdDb21wb25lbnREaWFsb2cgewotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlTWVzc2FnZUNoZWNrQm94OwotCXByaXZhdGUgYm9vbGVhbiBjcmVhdGVNZXNzYWdlQm9vbGVhbjsKLQotCXB1YmxpYyBOZXdDb21wb25lbnRXaXRoQ2hpbGREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCB0aXRsZSwgZGVmYXVsdE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgTmV3Q29tcG9uZW50V2l0aENoaWxkRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZWZhdWx0TmFtZSwgTGlzdCB1c2VkTmFtZXMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIHRpdGxlLCBkZWZhdWx0TmFtZSwgdXNlZE5hbWVzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNoaWxkID0gbmV3IENvbXBvc2l0ZSAocGFyZW50LCBTV1QuTk9ORSk7Ci0JICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCSAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkgICAgY2hpbGQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCSAgICBjcmVhdGVNZXNzYWdlQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNoaWxkLCBTV1QuQ0hFQ0spOwotCSAgICBjcmVhdGVNZXNzYWdlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRydWUpOwotCSAgICBjcmVhdGVNZXNzYWdlQ2hlY2tCb3guc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9DUkVBVEVfTUVTU0FHRV9DSEVDS0JPWF9MQUJFTCIpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVTdWJDb21wb25lbnRzKCkgewotCQlyZXR1cm4gY3JlYXRlTWVzc2FnZUJvb2xlYW47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQljcmVhdGVNZXNzYWdlQm9vbGVhbiA9IGNyZWF0ZU1lc3NhZ2VDaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3RvY29sQ29tcG9uZW50Q29udHJvbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2lkZ2V0cy9Qcm90b2NvbENvbXBvbmVudENvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiOWEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3RvY29sQ29tcG9uZW50Q29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5BYnN0cmFjdEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLnVpLkNvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3RvY29sQ29tcG9uZW50Q29udHJvbCBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQWJzdHJhY3RHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCi0gIHByb3RlY3RlZCBUZXh0IGNvbXBvbmVudE5hbWVGaWVsZDsKLSAgcHJvdGVjdGVkIENvbWJvIHJlZk5hbWVDb21ibzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiByZWZCcm93c2VCdXR0b247Ci0gIHByb3RlY3RlZCBDb21ibyBwcm90b2NvbENvbWJvOwotICBwcm90ZWN0ZWQgQnV0dG9uIG92ZXJ3cml0ZUJ1dHRvbjsKLSAgcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VCb29rOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGVtcHR5U2V0dGluZ3NQYWdlOwotICBwcm90ZWN0ZWQgTWFwIHBhZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gIC8vcHJvdGVjdGVkIGJvb2xlYW4gaXNCaW5kaW5nQ29tcG9uZW50ID0gdHJ1ZTsKLSAgLy9wcm90ZWN0ZWQgYm9vbGVhbiBpc05ld0NvbXBvbmVudCA9IHRydWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyByZWZOYW1lOwotCi0gIHByb3RlY3RlZCBTdHJpbmcgVU5TUEVDSUZJRUQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9VTlNQRUNJRklFRCIpOwotICAvL3Byb3RlY3RlZCBCaW5kaW5nR2VuZXJhdG9yIGJpbmRpbmdHZW5lcmF0b3I7Ci0KLSAgcHVibGljIFByb3RvY29sQ29tcG9uZW50Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBBYnN0cmFjdEdlbmVyYXRvciBnZW5lcmF0b3IsIGJvb2xlYW4gc2hvd092ZXJ3cml0ZUJ1dHRvbikKLSAgewotICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotICAgIC8vdGhpcy5pc0JpbmRpbmdDb21wb25lbnQgPSBpc0JpbmRpbmdDb21wb25lbnQ7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBzZXRMYXlvdXQobGF5b3V0KTsKLSAgICBzZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKHRydWUsIDEpKTsKLQotICAgIENvbXBvc2l0ZSBsYWJlbFZhbHVlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgbGFiZWxWYWx1ZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLSAgICBsYWJlbFZhbHVlQ29tcG9zaXRlLnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEoZmFsc2UsIDEpKTsKLQotICAgIC8vIHJvdyAxCi0gICAgLy8KLSAgICBMYWJlbCBjb21wb25lbnROYW1lTGFiZWwgPSBuZXcgTGFiZWwobGFiZWxWYWx1ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGNvbXBvbmVudE5hbWVMYWJlbC5zZXRUZXh0KGdldENvbXBvbmVudE5hbWVMYWJlbFRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGNvbXBvbmVudE5hbWVGaWVsZCA9IG5ldyBUZXh0KGxhYmVsVmFsdWVDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgIEdyaWREYXRhIGdkTmFtZT0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2ROYW1lLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2ROYW1lLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgY29tcG9uZW50TmFtZUZpZWxkLnNldExheW91dERhdGEoZ2ROYW1lKTsKLSAgICBjb21wb25lbnROYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0gICAgLy9jcmVhdGVQbGFjZUhvbGRlcihsYWJlbFZhbHVlQ29tcG9zaXRlKTsKLQotICAgIC8vIHJvdyAyCi0gICAgLy8KLSAgICBMYWJlbCByZWZOYW1lTGFiZWwgPSBuZXcgTGFiZWwobGFiZWxWYWx1ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHJlZk5hbWVMYWJlbC5zZXRUZXh0KGdldFJlZk5hbWVMYWJlbFRleHQoKSk7IC8vJE5PTi1OTFMtMSQJCi0gICAgcmVmTmFtZUNvbWJvID0gbmV3IENvbWJvKGxhYmVsVmFsdWVDb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotICAgIEdyaWREYXRhIGdkUmVmTmFtZT0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2RSZWZOYW1lLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2RSZWZOYW1lLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgcmVmTmFtZUNvbWJvLnNldExheW91dERhdGEoZ2RSZWZOYW1lKTsKLSAgICByZWZOYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAvL3JlZkJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24obGFiZWxWYWx1ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIC8vcmVmQnJvd3NlQnV0dG9uLnNldFRleHQoIiAgLi4uICAiKTsKLSAgICAvL0dyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgLy9nZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgLy9nZC5oZWlnaHRIaW50ID0gMTc7Ci0gICAgLy9nZC53aWR0aEhpbnQgPSAyNDsKLSAgICAvL3JlZkJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAvL3JlZkJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAvL2NyZWF0ZVBsYWNlSG9sZGVyKGxhYmVsVmFsdWVDb21wb3NpdGUpOwotCi0gICAgLy8gcm93IDMKLSAgICAvLwotICAgIExhYmVsIHByb3RvY29sTGFiZWwgPSBuZXcgTGFiZWwobGFiZWxWYWx1ZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHByb3RvY29sTGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX1BST1RPQ09MIikpOyAvLyROT04tTkxTLTEkCi0gICAgcHJvdG9jb2xDb21ibyA9IG5ldyBDb21ibyhsYWJlbFZhbHVlQ29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLSAgICBHcmlkRGF0YSBnZFByb3RvY29sPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZFByb3RvY29sLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2RQcm90b2NvbC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIHByb3RvY29sQ29tYm8uc2V0TGF5b3V0RGF0YShnZFByb3RvY29sKTsKLSAgICBwcm90b2NvbENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIC8vY3JlYXRlUGxhY2VIb2xkZXIobGFiZWxWYWx1ZUNvbXBvc2l0ZSk7Ci0KLSAgICAvLyBvcHRpb25hbCBvdmVyd3JpdGUgYnV0dG9uCi0gICAgLy8KLSAgICBpZiAoc2hvd092ZXJ3cml0ZUJ1dHRvbikKLSAgICB7Ci0gICAgICBvdmVyd3JpdGVCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5DSEVDSyk7Ci0gICAgICBvdmVyd3JpdGVCdXR0b24uc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9DSEVDS0JPWF9PVkVSV1JJVEUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG92ZXJ3cml0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvLyBwcm90b2NvbCBzcGVjaWZpYyBzZXR0aW5ncwotICAgIC8vCi0gICAgcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2sodGhpcywgU1dULk5PTkUpOwotICAgIEdyaWREYXRhIGdkRmlsbD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2RGaWxsLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2RGaWxsLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgZ2RGaWxsLnZlcnRpY2FsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkRmlsbC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLSAgICBwYWdlQm9vay5zZXRMYXlvdXREYXRhKGdkRmlsbCk7Ci0KLSAgICBlbXB0eVNldHRpbmdzUGFnZSA9IG5ldyBDb21wb3NpdGUocGFnZUJvb2ssIFNXVC5OT05FKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykKLSAgICB7Ci0gICAgICBMYWJlbCBwbGFjZUhvbGRlciA9IG5ldyBMYWJlbChlbXB0eVNldHRpbmdzUGFnZSwgU1dULk5PTkUpOwotICAgIH0KLQotICAgIHVwZGF0ZVBhZ2VCb29rKGdlbmVyYXRvci5nZXRQcm90b2NvbCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXRGaWVsZHMoKQotICB7Ci0gICAgLy8gcHJpbWUgdGhlIGZpZWxkcwotICAgIC8vCi0gICAgY29tcG9uZW50TmFtZUZpZWxkLnNldFRleHQoZ2V0RGVmYXVsdE5hbWUoKSk7Ci0gICAgdXBkYXRlUmVmTmFtZUNvbWJvKCk7Ci0gICAgdXBkYXRlUHJvdG9jb2xDb21ibygpOwotICB9Ci0KLSAgcHVibGljIFRleHQgZ2V0Q29tcG9uZW50TmFtZUZpZWxkKCkKLSAgewotICAgIHJldHVybiBjb21wb25lbnROYW1lRmllbGQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWVMYWJlbFRleHQoKQotICB7Ci0gICAgcmV0dXJuICJOYW1lIjsKLSAgfQotCi0gIHByaXZhdGUgR3JpZERhdGEgY3JlYXRlR3JpZERhdGEoYm9vbGVhbiBib3RoLCBpbnQgc3BhbikKLSAgewotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKGJvdGggPyBHcmlkRGF0YS5GSUxMX0JPVEggOiBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLSAgICByZXR1cm4gZ2Q7Ci0gIH0KLQotICBwcml2YXRlIENvbnRyb2wgY3JlYXRlUGxhY2VIb2xkZXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotICBwdWJsaWMgQWJzdHJhY3RHZW5lcmF0b3IgZ2V0R2VuZXJhdG9yKCkKLSAgewotICAgIHJldHVybiBnZW5lcmF0b3I7Ci0gIH0KLQotICAvLyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIC8vCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG92ZXJ3cml0ZUJ1dHRvbiAmJiBvdmVyd3JpdGVCdXR0b24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRHZW5lcmF0b3IoKS5zZXRPdmVyd3JpdGUob3ZlcndyaXRlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHJlZk5hbWVDb21ibykKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSByZWZOYW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIFN0cmluZyByZWZOYW1lID0gcmVmTmFtZUNvbWJvLmdldEl0ZW0oaW5kZXgpOwotICAgICAgZ2V0R2VuZXJhdG9yKCkuc2V0UmVmTmFtZShyZWZOYW1lKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHByb3RvY29sQ29tYm8pCi0gICAgewotICAgICAgaW50IGluZGV4ID0gcHJvdG9jb2xDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgU3RyaW5nIHByb3RvY29sID0gKGluZGV4ICE9IC0xKSA/IHByb3RvY29sQ29tYm8uZ2V0SXRlbShpbmRleCkgOiBudWxsOwotICAgICAgZ2V0R2VuZXJhdG9yKCkuc2V0UHJvdG9jb2wocHJvdG9jb2wpOwotICAgICAgZ2V0R2VuZXJhdG9yKCkuc2V0T3B0aW9ucyhudWxsKTsKLSAgICAgIHVwZGF0ZVBhZ2VCb29rKHByb3RvY29sKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfT1ZFUldSSVRFX0FQUExJQ0FCTEUgPSAiSVNfT1ZFUldSSVRFX0FQUExJQ0FCTEUiOwotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlQm9vayhTdHJpbmcgcHJvdG9jb2wpCi0gIHsKLSAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgcGFnZU1hcC5nZXQocHJvdG9jb2wpOwotICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIG9wdGlvbnNQYWdlID0gY3JlYXRlQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlKHByb3RvY29sKTsKLQotICAgICAgICBpZiAob3B0aW9uc1BhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG9wdGlvbnNQYWdlLmluaXQoZ2V0R2VuZXJhdG9yKCkpOwotICAgICAgICAgIGNvbnRyb2wgPSBvcHRpb25zUGFnZS5jcmVhdGVDb250cm9sKHBhZ2VCb29rKTsKLSAgICAgICAgICBjb250cm9sLnNldERhdGEoSVNfT1ZFUldSSVRFX0FQUExJQ0FCTEUsIG5ldyBCb29sZWFuKG9wdGlvbnNQYWdlLmlzT3ZlcndyaXRlQXBwbGljYWJsZSgpKSk7Ci0gICAgICAgICAgcGFnZU1hcC5wdXQocHJvdG9jb2wsIGNvbnRyb2wpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBhZ2VNYXAucHV0KHByb3RvY29sLCBjb250cm9sKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBib29sZWFuIGVuYWJsZU92ZXJ3cml0ZUJ1dHRvbiA9IHRydWU7Ci0gICAgICBpZiAoY29udHJvbCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAob3ZlcndyaXRlQnV0dG9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBCb29sZWFuIGRhdGEgPSAoQm9vbGVhbikgY29udHJvbC5nZXREYXRhKElTX09WRVJXUklURV9BUFBMSUNBQkxFKTsKLSAgICAgICAgICBlbmFibGVPdmVyd3JpdGVCdXR0b24gPSBkYXRhID09IG51bGwgfHwgZGF0YS5lcXVhbHMoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotICAgICAgICBwYWdlQm9vay5zaG93UGFnZShjb250cm9sKTsKLSAgICAgICAgcGFnZUJvb2subGF5b3V0KCk7Ci0gICAgICAgIHBhZ2VCb29rLmdldFBhcmVudCgpLmxheW91dCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwYWdlQm9vay5zaG93UGFnZShlbXB0eVNldHRpbmdzUGFnZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvdmVyd3JpdGVCdXR0b24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVuYWJsZU92ZXJ3cml0ZUJ1dHRvbikKLSAgICAgICAgewotICAgICAgICAgIG92ZXJ3cml0ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIG92ZXJ3cml0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZ2VuZXJhdG9yLmdldE92ZXJ3cml0ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBvdmVyd3JpdGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgb3ZlcndyaXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb3RvY29sQ29tYm8oKQotICB7Ci0gICAgcHJvdG9jb2xDb21iby5yZW1vdmVBbGwoKTsKLQotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChVTlNQRUNJRklFRCk7Ci0gICAgbGlzdC5hZGRBbGwoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSgpLmdldEJpbmRpbmdFeHRlbnNpb25OYW1lcygpKTsKLQotICAgIFN0cmluZyBwcm90b2NvbFRleHQgPSBnZW5lcmF0b3IuZ2V0UHJvdG9jb2woKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyBwcm90b2NvbCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgcHJvdG9jb2xDb21iby5hZGQocHJvdG9jb2wpOwotICAgIH0KLQotICAgIGlmIChwcm90b2NvbFRleHQgPT0gbnVsbCAmJiBwcm90b2NvbENvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICB7Ci0gICAgICBwcm90b2NvbFRleHQgPSBwcm90b2NvbENvbWJvLmdldEl0ZW0oMCk7Ci0gICAgICBnZW5lcmF0b3Iuc2V0UHJvdG9jb2woIVVOU1BFQ0lGSUVELmVxdWFscyhwcm90b2NvbFRleHQpID8gcHJvdG9jb2xUZXh0IDogbnVsbCk7Ci0gICAgfQotICAgIHByb3RvY29sQ29tYm8uc2V0VGV4dChwcm90b2NvbFRleHQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVmTmFtZUNvbWJvKCkKLSAgewotICAgIHJlZk5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQotICAgIHJlZk5hbWVDb21iby5hZGQoVU5TUEVDSUZJRUQpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldFJlZk5hbWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHJlZk5hbWVDb21iby5hZGQoKFN0cmluZykgaS5uZXh0KCkpOwotICAgIH0KLQotICAgIGlmIChyZWZOYW1lQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKQotICAgIHsKLSAgICAgIFN0cmluZyByZWZUZXh0ID0gZ2VuZXJhdG9yLmdldFJlZk5hbWUoKTsKLSAgICAgIHJlZk5hbWVDb21iby5zZXRUZXh0KHJlZlRleHQgIT0gbnVsbCA/IHJlZlRleHQgOiBVTlNQRUNJRklFRCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICB7Ci0gICAgZ2VuZXJhdG9yLnNldE5hbWUoY29tcG9uZW50TmFtZUZpZWxkLmdldFRleHQoKSk7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgTGlzdCBnZXRSZWZOYW1lcygpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFJlZk5hbWVMYWJlbFRleHQoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0TmFtZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIGNyZWF0ZUNvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZShTdHJpbmcgcHJvdG9jb2wpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9CaW5kaW5nV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL0JpbmRpbmdXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyNDNlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL0JpbmRpbmdXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5BYnN0cmFjdEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLkJpbmRpbmdHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWkuQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0cy5Qcm90b2NvbENvbXBvbmVudENvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1dpemFyZCBleHRlbmRzIFdpemFyZAotewotICBwcm90ZWN0ZWQgQmluZGluZ0dlbmVyYXRvciBiaW5kaW5nR2VuZXJhdG9yOwotICBwcm90ZWN0ZWQgQmluZGluZ1dpemFyZE9wdGlvbnNQYWdlIHNwZWNpZnlCaW5kaW5nUGFnZTsKLQotICBwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gIHByb3RlY3RlZCBpbnQga2luZDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX05FV19CSU5ESU5HID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9SRUdFTkVSQVRFX0JJTkRJTkcgPSAyOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQmluZGluZ1dpemFyZC4KLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nV2l6YXJkKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMoZGVmaW5pdGlvbiwgS0lORF9ORVdfQklORElORyk7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ1dpemFyZChEZWZpbml0aW9uIGRlZmluaXRpb24sIERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgdGhpcyhkZWZpbml0aW9uLCBLSU5EX05FV19CSU5ESU5HKTsKLSAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCaW5kaW5nV2l6YXJkKERlZmluaXRpb24gZGVmaW5pdGlvbiwgaW50IGtpbmQpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgYmluZGluZ0dlbmVyYXRvciA9IG5ldyBCaW5kaW5nR2VuZXJhdG9yKGRlZmluaXRpb24pOwotICAgIHNldFdpbmRvd1RpdGxlKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JJTkRJTkdfV0laQVJEIikpOyAvLyROT04tTkxTLTEkCi0gICAgLy9zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoV1NETEVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL05ld1hNTC5naWYiKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nTmFtZShTdHJpbmcgYmluZGluZ05hbWUpCi0gIHsKLSAgICBiaW5kaW5nR2VuZXJhdG9yLnNldE5hbWUoYmluZGluZ05hbWUpOwotCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gYmluZGluZ0dlbmVyYXRvci5nZXREZWZpbml0aW9uKCk7Ci0gICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgYmluZGluZ05hbWUpOwotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBkZWZpbml0aW9uLmdldEJpbmRpbmcocW5hbWUpOwotICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBlZUxpc3QgPSBiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGlmIChlZUxpc3Quc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVlTGlzdC5nZXQoMCk7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChlZSk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Gb3JOYW1lc3BhY2UobmFtZXNwYWNlKTsKLQotICAgICAgICAgIGlmIChleHRlbnNpb24gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBiaW5kaW5nR2VuZXJhdG9yLnNldFByb3RvY29sKGV4dGVuc2lvbi5nZXROYW1lKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBvcnRUeXBlTmFtZShTdHJpbmcgcG9ydFR5cGVOYW1lKQotICB7Ci0gICAgYmluZGluZ0dlbmVyYXRvci5zZXRQb3J0VHlwZU5hbWUocG9ydFR5cGVOYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBCaW5kaW5nR2VuZXJhdG9yIGdldEJpbmRpbmdHZW5lcmF0b3IoKQotICB7Ci0gICAgcmV0dXJuIGJpbmRpbmdHZW5lcmF0b3I7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgd2l6YXJkIHNldHVwIGlzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0dXAoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpCi0gIHsKLSAgICBzcGVjaWZ5QmluZGluZ1BhZ2UgPSBuZXcgQmluZGluZ1dpemFyZE9wdGlvbnNQYWdlKCk7Ci0gICAgYWRkUGFnZShzcGVjaWZ5QmluZGluZ1BhZ2UpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IGJpbmRpbmdHZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpOwotICAJYm9vbGVhbiByZWNvcmRpbmdTdGFydGVkID0gZmFsc2U7Ci0gIAlpZiAoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkgPT0gbnVsbCB8fCAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkpIHsKLSAgCQlyZWNvcmRpbmdTdGFydGVkID0gdHJ1ZTsKLSAgCQliZWdpblJlY29yZGluZygpOwotICAJCQotICAJCS8vIENyZWF0ZSB0aGUgRGVmaW5pdGlvbnMgZWxlbWVudCB3aXRoIHByb3BlciBuYW1lc3BhY2UKLSAgCSAgICBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAgCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLSAgCSAgICBpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpCi0gIAkgICAgewotICAJICAgIAljaGFyU2V0ID0gIlVURi04IjsKLSAgCSAgICB9Ci0gIAkgICAgZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ4bWwiLCAidmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIGNoYXJTZXQgKyAiXCIiKSk7Ci0gIAkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgid3NkbDpkZWZpbml0aW9ucyIpOyAgCQkKLSAgCQlkb2N1bWVudC5hcHBlbmRDaGlsZChyb290KTsKLQotICAJCS8vIEFkZCB2YXJpb3VzIG5hbWVzcGFjZSBhdHRyaWJ1dGVzIGhlcmUuIAotICAJCXJvb3Quc2V0QXR0cmlidXRlKCJ4bWxuczpzb2FwIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iKTsKLSAgCQlyb290LnNldEF0dHJpYnV0ZSgieG1sbnM6dG5zIiwgZ2V0RGVmYXVsdE5hbWVzcGFjZShkZWZpbml0aW9uKSk7Ci0gIAkJcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOndzZGwiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iKTsKLSAgCQlyb290LnNldEF0dHJpYnV0ZSgieG1sbnM6eHNkIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gIAkJcm9vdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBnZXRGaWxlTmFtZShkZWZpbml0aW9uKSk7Ci0gIAkJcm9vdC5zZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsIGdldERlZmF1bHROYW1lc3BhY2UoZGVmaW5pdGlvbikpOwotCi0gIAkJZGVmaW5pdGlvbi5zZXRFbGVtZW50KHJvb3QpOwkKLSAgCX0KLSAgCQotICAgIGJpbmRpbmdHZW5lcmF0b3IuZ2VuZXJhdGUoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBiaW5kaW5nR2VuZXJhdG9yLmdldE5ld0NvbXBvbmVudCgpOwotICAgICAgaWYgKG9iamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgZWRpdG9yUGFydC5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iamVjdCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGZpbmFsbHkgewotICAgIAlpZiAocmVjb3JkaW5nU3RhcnRlZCkKLSAgICAJCWVuZFJlY29yZGluZygpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UiKSk7Ci0gICAgaWYgKCFuYW1lc3BhY2UuZW5kc1dpdGgoIi8iKSkgewotICAgIAluYW1lc3BhY2UgPSBuYW1lc3BhY2UuY29uY2F0KCIvIik7Ci0gICAgfQotICAgIAotICAgIG5hbWVzcGFjZSArPSBnZXRGaWxlTmFtZShkZWZpbml0aW9uKSArICIvIjsKLQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEZpbGVOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgIFN0cmluZyBmaWxlTG9jYXRpb24gPSBkZWZpbml0aW9uLmdldExvY2F0aW9uKCk7Ci0gIAlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGZpbGVMb2NhdGlvbik7Ci0gIAlyZXR1cm4gZmlsZVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCkudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGJlZ2luUmVjb3JkaW5nKCkgewotICAgIE5vZGUgbm9kZSA9IGRvY3VtZW50OwotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfQklORElORyIpKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGVuZFJlY29yZGluZygpIHsKLSAgICBOb2RlIG5vZGUgPSBkb2N1bWVudDsgCi0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICAoKElET01Ob2RlKW5vZGUpLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOyAgCi0gICAgfQotICB9Ci0KLSAgY2xhc3MgQmluZGluZ1dpemFyZE9wdGlvbnNQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZQotICB7Ci0gICAgcHJvdGVjdGVkIFByb3RvY29sQ29tcG9uZW50Q29udHJvbCBwcm90b2NvbENvbXBvbmVudENvbnRyb2w7Ci0KLSAgICBwdWJsaWMgQmluZGluZ1dpemFyZE9wdGlvbnNQYWdlKCkKLSAgICB7Ci0gICAgICBzdXBlcigiU3BlY2lmeUJpbmRpbmdQYWdlIik7Ci0gICAgICBzZXRUaXRsZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9TUEVDSUZZX0JJTkRJTkdfREVUQUlMUyIpKTsKLSAgICAgIHNldERlc2NyaXB0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1NQRUNJRllfQklORElOR19ERVRBSUxTX0xBQkVMIikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBCaW5kaW5nR2VuZXJhdG9yIGdldEJpbmRpbmdHZW5lcmF0b3IoKQotICAgIHsKLSAgICAgIHJldHVybiAoKEJpbmRpbmdXaXphcmQpIGdldFdpemFyZCgpKS5nZXRCaW5kaW5nR2VuZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIFByb3RvY29sQ29tcG9uZW50Q29udHJvbCBwcm90b2NvbENvbXBvbmVudENvbnRyb2wgPSBuZXcgQmluZGluZ1Byb3RvY29sQ29tcG9uZW50Q29udHJvbChwYXJlbnQsIGJpbmRpbmdHZW5lcmF0b3IsIGtpbmQgPT0gS0lORF9SRUdFTkVSQVRFX0JJTkRJTkcpOwotICAgICAgcHJvdG9jb2xDb21wb25lbnRDb250cm9sLmluaXRGaWVsZHMoKTsKLSAgICAgIHNldENvbnRyb2wocHJvdG9jb2xDb21wb25lbnRDb250cm9sKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIEJpbmRpbmdQcm90b2NvbENvbXBvbmVudENvbnRyb2wgZXh0ZW5kcyBQcm90b2NvbENvbXBvbmVudENvbnRyb2wKLSAgewotICAgIHB1YmxpYyBCaW5kaW5nUHJvdG9jb2xDb21wb25lbnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIEFic3RyYWN0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgICB7Ci0gICAgICB0aGlzKHBhcmVudCwgZ2VuZXJhdG9yLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJpbmRpbmdQcm90b2NvbENvbXBvbmVudENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgQWJzdHJhY3RHZW5lcmF0b3IgZ2VuZXJhdG9yLCBib29sZWFuIHNob3dPdmVyd3JpdGVCdXR0b24pCi0gICAgewotICAgICAgc3VwZXIocGFyZW50LCBnZW5lcmF0b3IsIHNob3dPdmVyd3JpdGVCdXR0b24pOwotCi0gICAgICBpZiAoZ2VuZXJhdG9yLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb21wb25lbnROYW1lRmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmTmFtZUxhYmVsVGV4dCgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BPUlRfVFlQRSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFJlZk5hbWVzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZ2VuZXJhdG9yLmdldERlZmluaXRpb24oKSkuZ2V0UG9ydFR5cGVOYW1lcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKQotICAgIHsKLSAgICAgIFN0cmluZyBiaW5kaW5nTmFtZSA9IGdlbmVyYXRvci5nZXROYW1lKCk7Ci0gICAgICByZXR1cm4gYmluZGluZ05hbWUgIT0gbnVsbCA/IGJpbmRpbmdOYW1lIDogTmFtZVV0aWwuYnVpbGRVbmlxdWVCaW5kaW5nTmFtZShnZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIGNyZWF0ZUNvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZShTdHJpbmcgcHJvdG9jb2wpCi0gICAgewotICAgICAgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIG9wdGlvbnNQYWdlID0gbnVsbDsKLSAgICAgIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24gZXh0ZW5zaW9uID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb24ocHJvdG9jb2wpOwotICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBvcHRpb25zUGFnZSA9IGV4dGVuc2lvbi5jcmVhdGVCaW5kaW5nQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gb3B0aW9uc1BhZ2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05hbWVzcGFjZVRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05hbWVzcGFjZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYTg0OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OYW1lc3BhY2VUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnZpZXdlcnMuTmF2aWdhYmxlVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRpYWxvZ3MuRWRpdE5hbWVzcGFjZUluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kaWFsb2dzLlVwZGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkudXRpbC5YTUxDb21tb25SZXNvdXJjZXM7Ci0gCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlVGFibGUgZXh0ZW5kcyBDb21wb3NpdGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSSA9IFhNTENvbW1vblJlc291cmNlcy5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FIik7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfTEFCRUxfUFJFRklYIik7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX1NFTEVDVCIpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gIHByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IFZlY3RvcigpOwotICBwcm90ZWN0ZWQgTGlzdCBjaGVja2VkTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJvdGVjdGVkIE5hbWVzcGFjZU5hdmlnYWJsZVRhYmxlVmlld2VyIHRhYmxlVmlld2VyOyAgICAKLSAgcHJvdGVjdGVkIEJ1dHRvbiBhZGRCdXR0b247Ci0KLSAgcHJvdGVjdGVkIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBVcGRhdGVMaXN0ZW5lciB1cGRhdGVMaXN0ZW5lcjsgICAKLSAgcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247ICAKLSAgcHJvdGVjdGVkIGludCB2aXNpYmxlUm93cyA9IC0xOyAgCi0gIHByb3RlY3RlZCBib29sZWFuIGR1bW15Um93c1JlbW92ZWQgPSBmYWxzZTsKLSAgVGFibGUgdGFibGU7Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgIAotICAgIHRoaXMocGFyZW50LCAtMSwgLTEsIC0xKTsKLSAgfSAgICAKLQotICBwdWJsaWMgTmFtZXNwYWNlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZpc2libGVSb3dzKQotICB7Ci0gICAgdGhpcyhwYXJlbnQsIC0xLCAtMSwgdmlzaWJsZVJvd3MpOwotICB9Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50KQotICB7Ci0gICAgdGhpcyhwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgLTEpOwotICB9Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgdmlzaWJsZVJvd3MpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBzZXRMYXlvdXQoY3JlYXRlR3JpZExheW91dCgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBHcmlkRGF0YSBmaWxsR0Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGZpbGxHRC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGZpbGxHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGZpbGxHRC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBmaWxsR0QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0gICAgCi0gICAgc2V0TGF5b3V0RGF0YShmaWxsR0QpOyAgICAgICAgICAgICAKLSAgICAKLSAgICBHcm91cCBuYW1lc3BhY2VJbmZvR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULk5PTkUpOwotICAgIG5hbWVzcGFjZUluZm9Hcm91cC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05BTUVTUEFDRV9VUklTX1RPX0JFX0lOQ0xVREVEIikpOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsgICAKLSAgICBHcmlkRGF0YSBnZCA9IGZpbGxHRDsKLSAgICBpZiAod2lkdGhIaW50ICE9IC0xKQotICAgIHsKLSAgICAgIGdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLSAgICB9ICAgCi0gICAgaWYgKGhlaWdodEhpbnQgIT0gLTEpCi0gICAgewotICAgICAgZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0gICAgfQotICAgIG5hbWVzcGFjZUluZm9Hcm91cC5zZXRMYXlvdXREYXRhKGdkKTsgCi0gICAgLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAobmFtZXNwYWNlSW5mb0dyb3VwLCBuZXcgQ29udHJvbENvbnRleHRDb21wdXRlcihuYW1lc3BhY2VJbmZvR3JvdXAsIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTENfTkFNRVNQQUNFX0dST1VQKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZ1tdIHRpdGxlQXJyYXkgPSB7SU5DTFVERSwgUFJFRklYLCBOQU1FU1BBQ0VfVVJJfTsKLQotICAgIHRhYmxlID0gbmV3IFRhYmxlKG5hbWVzcGFjZUluZm9Hcm91cCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgIAotICAgIHRhYmxlLnNldExheW91dERhdGEoZmlsbEdEKTsKLSAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgdGFibGUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKQotICAgICAgewotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0gICAgICAgIGlmIChpdGVtICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRhYmxlRWxlbWVudCBob2xkZXIgPSAoVGFibGVFbGVtZW50KW9iajsKLSAgICAgICAgICAgIFRhYmxlQ29sdW1uIGNvbCA9IHRhYmxlLmdldENvbHVtbigwKTsKLSAgICAgICAgICAgIGlmIChlLnggPCBjb2wuZ2V0V2lkdGgoKSkgLy8gaWYgdGhlIHBvaW50IGZhbGxzIHdpdGhpbiB0aGUgU2VsZWN0IGNvbHVtbiB0aGVuIHBlcmZvcm0gY2hlY2svdW5jaGVjawotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFN0YXRlID0gaG9sZGVyLmdldENoZWNrZWQoKTsKLSAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZS5lcXVhbHMoInRydWUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaG9sZGVyLnNldENoZWNrZWQoImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBjaGVja2VkTGlzdC5zZXQoaG9sZGVyLmdldEluZGV4KCksICJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50U3RhdGUuZXF1YWxzKCJmYWxzZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBob2xkZXIuc2V0Q2hlY2tlZCgidHJ1ZSIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGNoZWNrZWRMaXN0LnNldChob2xkZXIuZ2V0SW5kZXgoKSwgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHRhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgaWYgKHVwZGF0ZUxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0YWJsZVZpZXdlciA9IG5ldyBOYW1lc3BhY2VOYXZpZ2FibGVUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgcHJvdmlkZXIgPSBuZXcgTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcigpOwotICAgIHRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7ICAgCi0gICAgdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0gICAgdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyh0aXRsZUFycmF5KTsKLSAgICB0YWJsZVZpZXdlci5zZXRDZWxsTW9kaWZpZXIobmV3IE5hbWVzcGFjZUluZm9DZWxsTW9kaWZpZXIoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50W10gd2lkdGhBcnJheSA9IHsxMCwgMjAsIDUwfTsKLSAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsgIAotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aXRsZUFycmF5Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0gICAgICBjb2x1bW4uc2V0VGV4dCh0aXRsZUFycmF5W2ldKTsKLSAgICAgIGNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotICAgICAgbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEod2lkdGhBcnJheVtpXSwgdHJ1ZSkpOwotICAgIH0gICAgICAgICAKLSAgICB0aGlzLnZpc2libGVSb3dzID0gdmlzaWJsZVJvd3M7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpYmxlUm93czsgaSsrKQotICAgIHsKLSAgICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOyAKLSAgICAgIGl0ZW0uc2V0VGV4dCgiIyMjIyMjIyIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHRhYmxlLnNldExheW91dChsYXlvdXQpOyAgCi0gICAgCi0gICAgQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbdGl0bGVBcnJheS5sZW5ndGhdOwotICAgIGNlbGxFZGl0b3JzWzBdID0gbmV3IE5hbWVzcGFjZUluZm9DaGVja2JveENlbGxFZGl0b3IodGFibGUpOwotICAgIGNlbGxFZGl0b3JzWzFdID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLSAgICB0YWJsZVZpZXdlci5zZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0KLS8vICAgIGNyZWF0ZUJ1dHRvbnMobmFtZXNwYWNlSW5mb0dyb3VwKTsgICAgICAgICAgICAKLQotICAgIGluaXRpYWxpemUoKTsgICAgCi0gIH0gICAgCi0KLSAgcHVibGljIHZvaWQgc2V0VXBkYXRlTGlzdGVuZXIoVXBkYXRlTGlzdGVuZXIgdXBkYXRlTGlzdGVuZXIpCi0gIHsKLSAgICB0aGlzLnVwZGF0ZUxpc3RlbmVyID0gdXBkYXRlTGlzdGVuZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IG5hbWVzcGFjZUluZm9MaXN0KQotICB7ICAgIAotICAgIHRoaXMubmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTGlzdDsKLSAgICB1cGRhdGUoKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0OwotICB9ICAKLQotICBwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VDaGVja2VkTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gY2hlY2tlZExpc3Q7Ci0gIH0gIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETFByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gKChOYW1lc3BhY2VJbmZvKShuYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCkpKS5wcmVmaXg7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUxvY2F0aW9uKElQYXRoIHJlc291cmNlTG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIEdyaWRMYXlvdXQgY3JlYXRlR3JpZExheW91dCgpCi0gIHsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgIHJldHVybiBncmlkTGF5b3V0OwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKQotICB7Ci0gICAgLy8gYmV0dGVyIHdheSB0byBkbyB0aGlzLi4uLgotICAgIE5hbWVzcGFjZUluZm8gaW5mbzEgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm8xLnByZWZpeCA9ICJ3c2RsIjsgLy8kTk9OLU5MUy0xJAotICAgIGluZm8xLnVyaSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzEpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgTmFtZXNwYWNlSW5mbyBpbmZvMiA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgaW5mbzIucHJlZml4ID0gInNvYXAiOyAvLyROT04tTkxTLTEkCi0gICAgaW5mbzIudXJpID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm8yKTsKLSAgICBjaGVja2VkTGlzdC5hZGQoImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICBOYW1lc3BhY2VJbmZvIGluZm8zID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICBpbmZvMy5wcmVmaXggPSAiaHR0cCI7ICAvLyROT04tTkxTLTEkCi0gICAgaW5mbzMudXJpID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm8zKTsKLSAgICBjaGVja2VkTGlzdC5hZGQoImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICBOYW1lc3BhY2VJbmZvIGluZm80ID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICBpbmZvNC5wcmVmaXggPSAibWltZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbmZvNC51cmkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzQpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIE5hbWVzcGFjZUluZm8gaW5mbzUgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm81LnByZWZpeCA9ICJzb2FwZW5jIjsgLy8kTk9OLU5MUy0xJAotICAgIGluZm81LnVyaSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzUpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIE5hbWVzcGFjZUluZm8gaW5mbzYgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm82LnByZWZpeCA9ICJzb2FwZW52IjsgLy8kTk9OLU5MUy0xJAotICAgIGluZm82LnVyaSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzYpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIE5hbWVzcGFjZUluZm8gaW5mbzcgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm83LnByZWZpeCA9ICJ4c2kiOyAvLyROT04tTkxTLTEkCi0gICAgaW5mbzcudXJpID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotICAgIG5hbWVzcGFjZUluZm9MaXN0LmFkZChpbmZvNyk7Ci0gICAgY2hlY2tlZExpc3QuYWRkKCJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0gICAgTmFtZXNwYWNlSW5mbyBpbmZvOCA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgaW5mbzgucHJlZml4ID0gInhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbmZvOC51cmkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm84KTsKLSAgICBjaGVja2VkTGlzdC5hZGQoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgIHVwZGF0ZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZERhdGEgaEZpbGxHRCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGhGaWxsR0QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBoRmlsbEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgCi0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoaEZpbGxHRCk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIAotICAgIEJ1dHRvbiBoaWRkZW5CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGhpZGRlbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBoaWRkZW5CdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgaGlkZGVuQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsgIAotICAgICAgICBpZiAoZS53aWRnZXQgPT0gYWRkQnV0dG9uKQotICAgICAgICB7Ci0gICAgICAgICAgcGVyZm9ybU5ldygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsgICAKLSAgICAKLSAgICAvLyBjcmVhdGUgYSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgdGhyZWUgYnV0dG9ucwotICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoaEZpbGxHRCk7Ci0gICAgR3JpZExheW91dCBidXR0b25HcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBidXR0b25HcmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGJ1dHRvbkdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkdyaWRMYXlvdXQpOwotCi0gICAgLy8gYWRkIHRoZSBOZXcgYnV0dG9uCi0gICAgLy8KLSAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCi0gICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBhZGRCdXR0b24uc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREIikpOyAvLyROT04tTkxTLTEkCi0gICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZ2QpOy8vVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSk7Ci0gICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1OZXcoKQotICB7Ci0gICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBkaWFsb2cgPSBpbnZva2VEaWFsb2coWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTiIpLCBpbmZvKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IERpYWxvZy5PSykKLSAgICB7Ci0gICAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbyk7Ci0gICAgICBjaGVja2VkTGlzdC5hZGQoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKTsKLSAgICB9Ci0gIH0gCi0gICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGludm9rZURpYWxvZyhTdHJpbmcgdGl0bGUsIE5hbWVzcGFjZUluZm8gaW5mbykKLSAgewotICAgIFNoZWxsIHNoZWxsID0gWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLSAgICBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdE5hbWVzcGFjZUluZm9EaWFsb2coc2hlbGwsIGluZm8pOwotICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24ocmVzb3VyY2VMb2NhdGlvbik7Ci0gICAgZGlhbG9nLm9wZW4oKTsgICAgICAKLSAgICByZXR1cm4gZGlhbG9nOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKQotICB7Ci0gICAgUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0KLSAgICBpZiAodXBkYXRlTGlzdGVuZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICB9Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gZ2V0VGFyZ2V0TmFtZXNwYWNlSW5mbygpCi0gIHsKLSAgICByZXR1cm4gKG5hbWVzcGFjZUluZm9MaXN0ICE9IG51bGwgJiYgbmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpID4gMCkgPyAKLSAgICAgICAgICAgKE5hbWVzcGFjZUluZm8pbmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApIDoKLSAgICAgICAgICAgbnVsbDsKLSAgfSAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgdXBkYXRlKCkKLSAgewotICAgIHVwZGF0ZUhlbHBlcihuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCB1cGRhdGVIZWxwZXIoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHZpc2libGVSb3dzICE9IC0xICYmICFkdW1teVJvd3NSZW1vdmVkKQotICAgIHsKLS8vICAgICAgZHVtbXlSb3dzUmVtb3ZlZCA9IHRydWU7Ci0vLyAgICAgIHRhYmxlVmlld2VyLmdldFRhYmxlKCkucmVtb3ZlQWxsKCk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotICAgIGlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChuYW1lc3BhY2VJbmZvTGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICB0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTmFtZXNwYWNlSW5mb0NoZWNrYm94Q2VsbEVkaXRvciBleHRlbmRzIENoZWNrYm94Q2VsbEVkaXRvciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyBOYW1lc3BhY2VJbmZvQ2hlY2tib3hDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotICAgICAgc3VwZXIocGFyZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICAgIHsKLSAgICAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRGb2N1c0NvbnRyb2woKS5yZWRyYXcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSAgIAotICAgIHsgICAgICAKLSAgICAgIGlmICh0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9ICAgIAotICAgIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7fQotICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7fQotCi0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIGNsYXNzIE5hbWVzcGFjZUluZm9DZWxsTW9kaWZpZXIgaW1wbGVtZW50cyBJQ2VsbE1vZGlmaWVyCi0gIHsKLSAgICBwdWJsaWMgTmFtZXNwYWNlSW5mb0NlbGxNb2RpZmllcigpCi0gICAgewotICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSU5DTFVERSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKFBSRUZJWCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOyAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICBpbnQgY29sdW1uID0gMDsKLSAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSU5DTFVERSkpCi0gICAgICB7Ci0gICAgICAgIGNvbHVtbiA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoUFJFRklYKSkKLSAgICAgIHsKLSAgICAgICAgY29sdW1uID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhOQU1FU1BBQ0VfVVJJKSkKLSAgICAgIHsKLSAgICAgICAgY29sdW1uID0gMjsKLSAgICAgIH0KLQotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBwcm92aWRlci5nZXRDb2x1bW5UZXh0KGVsZW1lbnQsIGNvbHVtbik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWVsZW1lbnQ7Ci0gICAgICBpZiAoaXRlbSAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFRhYmxlRWxlbWVudCBob2xkZXIgPSAoVGFibGVFbGVtZW50KW9iajsKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBob2xkZXIuZ2V0TmFtZXNwYWNlSW5mbygpOwotICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSU5DTFVERSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCgoQm9vbGVhbil2YWx1ZSkuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBob2xkZXIuc2V0Q2hlY2tlZCgidHJ1ZSIpOwotICAgICAgICAgICAgICAgIGNoZWNrZWRMaXN0LnNldChob2xkZXIuZ2V0SW5kZXgoKSwgInRydWUiKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBob2xkZXIuc2V0Q2hlY2tlZCgiZmFsc2UiKTsKLSAgICAgICAgICAgICAgICBjaGVja2VkTGlzdC5zZXQoaG9sZGVyLmdldEluZGV4KCksICJmYWxzZSIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhQUkVGSVgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGluZm8ucHJlZml4ID0gKChTdHJpbmcpdmFsdWUpLnRyaW0oKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0gICAgICAgICAgaWYgKHVwZGF0ZUxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlTGlzdGVuZXIudXBkYXRlT2NjdXJlZCh0aGlzLCBuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gICAgICAgICAgfQotCi0vLyAgICAgICAgICBwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgICAgICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCBjbGFzcyBUYWJsZUVsZW1lbnQKLSAgewotICAgIE5hbWVzcGFjZUluZm8gaW5mbzsKLSAgICBpbnQgaW5kZXg7Ci0gICAgU3RyaW5nIGNoZWNrZWQgPSAidHJ1ZSI7Ci0gICAgCi0gICAgVGFibGVFbGVtZW50KE5hbWVzcGFjZUluZm8gaW5mbywgaW50IGluZGV4KQotICAgIHsKLSAgICAgIHRoaXMuaW5mbyA9IGluZm87Ci0gICAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBOYW1lc3BhY2VJbmZvIGdldE5hbWVzcGFjZUluZm8oKQotICAgIHsKLSAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldEluZGV4KCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hlY2tlZCgpCi0gICAgewotICAgICAgcmV0dXJuIGNoZWNrZWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoU3RyaW5nIGNoZWNrZWQpCi0gICAgewotICAgICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKW5hbWVzcGFjZUluZm9MaXN0LmdldChpKTsKLSAgICAgICAgVGFibGVFbGVtZW50IGhvbGRlciA9IG5ldyBUYWJsZUVsZW1lbnQoaW5mbywgaSk7Ci0gICAgICAgIGhvbGRlci5zZXRDaGVja2VkKChTdHJpbmcpY2hlY2tlZExpc3QuZ2V0KGkpKTsKLSAgICAgICAgdi5hZGQoaG9sZGVyKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB2LnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbikKLSAgICB7Ci0gICAgICBUYWJsZUVsZW1lbnQgaG9sZGVyID0gKFRhYmxlRWxlbWVudClvYmplY3Q7Ci0gICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBob2xkZXIuZ2V0TmFtZXNwYWNlSW5mbygpOwotICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBzd2l0Y2ggKGNvbHVtbikKLSAgICAgIHsKLSAgICAgICAgY2FzZSAxOiB7IHJlc3VsdCA9IGluZm8ucHJlZml4OyBicmVhazsgfQotICAgICAgICBjYXNlIDI6IHsgcmVzdWx0ID0gaW5mby51cmk7IGJyZWFrOyB9Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdC50cmltKCkgOiAiIjsKLSAgICAgIGlmIChyZXN1bHQuZXF1YWxzKCIiKSkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChjb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgCi0gICAgICAgICAgICByZXN1bHQgPSBYTUxDb21tb25SZXNvdXJjZXMuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9OT19OQU1FU1BBQ0VfTkFNRSIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgYnJlYWs7IAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLS8vICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRQcmVmaXgoKQotLy8gICAgewotLy8gICAgICBTdHJpbmcgZGVmYXVsdFByZWZpeCA9ICJwIjsKLS8vICAgICAgaWYgKG5hbWVzcGFjZUluZm9MaXN0ID09IG51bGwpCi0vLyAgICAgICAgcmV0dXJuIGRlZmF1bHRQcmVmaXg7Ci0vLwotLy8gICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLS8vICAgICAgZm9yIChpbnQgaT0wOyBpPG5hbWVzcGFjZUluZm9MaXN0LnNpemUoKTsgaSsrKQotLy8gICAgICB7Ci0vLyAgICAgICAgTmFtZXNwYWNlSW5mbyBuc2luZm8gPSAoTmFtZXNwYWNlSW5mbyluYW1lc3BhY2VJbmZvTGlzdC5nZXQoaSk7Ci0vLyAgICAgICAgaWYgKG5zaW5mby5wcmVmaXggIT0gbnVsbCkKLS8vICAgICAgICAgIHYuYWRkRWxlbWVudChuc2luZm8ucHJlZml4KTsKLS8vICAgICAgfQotLy8KLS8vICAgICAgaWYgKHYuY29udGFpbnMoZGVmYXVsdFByZWZpeCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBTdHJpbmcgcyA9IGRlZmF1bHRQcmVmaXg7Ci0vLyAgICAgICAgZm9yIChpbnQgaj0wOyB2LmNvbnRhaW5zKHMpOyBqKyspCi0vLyAgICAgICAgewotLy8gICAgICAgICAgcyA9IGRlZmF1bHRQcmVmaXggKyBJbnRlZ2VyLnRvU3RyaW5nKGopOwotLy8gICAgICAgIH0KLS8vICAgICAgICByZXR1cm4gczsKLS8vICAgICAgfQotLy8gICAgICBlbHNlCi0vLyAgICAgICAgcmV0dXJuIGRlZmF1bHRQcmVmaXg7Ci0vLyAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKSAgLy8gT3V0cHV0IENvbHVtbgotICAgICAgewotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFibGVFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgVGFibGVFbGVtZW50IGhvbGRlciA9IChUYWJsZUVsZW1lbnQpIG9iamVjdDsKLSAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gaG9sZGVyLmdldENoZWNrZWQoKTsKLSAgICAgICAgICBpZiAocmVzdWx0LmVxdWFscygidHJ1ZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvb3V0cHV0X3llcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvb3V0cHV0X25vLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgTmFtZXNwYWNlTmF2aWdhYmxlVGFibGVWaWV3ZXIgZXh0ZW5kcyBOYXZpZ2FibGVUYWJsZVZpZXdlcgotICB7Ci0gICAgcHVibGljIE5hbWVzcGFjZU5hdmlnYWJsZVRhYmxlVmlld2VyKFRhYmxlIHBhcmVudCkKLSAgICB7Ci0gICAgICBzdXBlcihwYXJlbnQpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdXU0RMV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1dTRExXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwMzNjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1dTRExXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci5CaW5kaW5nR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNyZWF0ZVdTRExFbGVtZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuRE9NVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIE5ld1dTRExXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQlwcml2YXRlIFdTRExOZXdGaWxlUGFnZSBuZXdGaWxlUGFnZTsKLQlwcml2YXRlIFdTRExOZXdGaWxlT3B0aW9uc1BhZ2Ugb3B0aW9uc1BhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBOZXdXU0RMV2l6YXJkLgotCSAqLwotCXB1YmxpYyBOZXdXU0RMV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSUZpbGUgZmlsZSA9IG5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JCWlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkgewotCQkJY2hhclNldCA9ICJVVEYtOCI7Ci0JCX0KLQotCQlTdHJpbmcgd3NkbFByZWZpeCA9ICJ3c2RsIjsKLQkJVmVjdG9yIG5hbWVzcGFjZXMgPSBvcHRpb25zUGFnZS5nZXROYW1lc3BhY2VJbmZvKCk7Ci0KLQkJU3RyaW5nIHByZWZpeCA9IG9wdGlvbnNQYWdlLmdldFByZWZpeCgpOwotCQlTdHJpbmcgZGVmaW5pdGlvbk5hbWUgPSBvcHRpb25zUGFnZS5nZXREZWZpbml0aW9uTmFtZSgpOwotCi0JCVdTRExGYWN0b3J5SW1wbCBmYWN0b3J5ID0gbmV3IFdTRExGYWN0b3J5SW1wbCgpOwotCQlEZWZpbml0aW9uSW1wbCBkZWZpbml0aW9uID0gKERlZmluaXRpb25JbXBsKSBmYWN0b3J5LmNyZWF0ZURlZmluaXRpb24oKTsKLQotCQlkZWZpbml0aW9uLnNldFRhcmdldE5hbWVzcGFjZShvcHRpb25zUGFnZS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCWRlZmluaXRpb24uc2V0TG9jYXRpb24oZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQlkZWZpbml0aW9uLnNldEVuY29kaW5nKGNoYXJTZXQpOwotCQlkZWZpbml0aW9uLnNldFFOYW1lKG5ldyBRTmFtZSh3c2RsUHJlZml4LCBkZWZpbml0aW9uTmFtZSkpOwotCQlkZWZpbml0aW9uLmFkZE5hbWVzcGFjZShwcmVmaXgsIG9wdGlvbnNQYWdlLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBuYW1lc3BhY2VzLmdldChpKTsKLQotCQkJaWYgKGluZm8ucHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmluaXRpb24uYWRkTmFtZXNwYWNlKGluZm8ucHJlZml4LCBpbmZvLnVyaSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlkZWZpbml0aW9uLmFkZE5hbWVzcGFjZShudWxsLCBpbmZvLnVyaSk7Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJaWYgKG9wdGlvbnNQYWdlLmdldENyZWF0ZVNrZWxldG9uQm9vbGVhbigpKSB7Ci0JCQkJaWYgKG9wdGlvbnNQYWdlLmlzU29hcERvY0xpdGVyYWxQcm90b2NvbCgpKSB7Ci0JCQkJCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9JTkZPX0VMRU1FTlRfREVDTEFSQVRJT047Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5QQVJUX1RZUEVfT1JfREVGSU5JVElPTiA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfSU5GT19UWVBFX0RFRklOSVRJT047Ci0JCQkJfQotCi0JCQkJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuc2VydmljZU5hbWUgPSBkZWZpbml0aW9uTmFtZTsKLQkJCQlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5wb3J0TmFtZSA9IGRlZmluaXRpb25OYW1lICsgb3B0aW9uc1BhZ2UuZ2V0UHJvdG9jb2woKTsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVTZXJ2aWNlKGRlZmluaXRpb24pOwotCQkJCWRlZmluaXRpb24udXBkYXRlRWxlbWVudCh0cnVlKTsKLQotCQkJCS8vIEdlbmVyYXRlIEJpbmRpbmcKLQkJCQlCaW5kaW5nR2VuZXJhdG9yIGJpbmRpbmdHZW5lcmF0b3IgPSBuZXcgQmluZGluZ0dlbmVyYXRvcihkZWZpbml0aW9uKTsKLQkJCQlQb3J0IHBvcnQgPSAoUG9ydCkgc2VydmljZS5nZXRFUG9ydHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQliaW5kaW5nR2VuZXJhdG9yLnNldE5hbWUoQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXROYW1lKHBvcnQuZ2V0RUJpbmRpbmcoKSkpOwotCQkJCWJpbmRpbmdHZW5lcmF0b3Iuc2V0UG9ydFR5cGVOYW1lKENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0UG9ydFR5cGVSZWZlcmVuY2UocG9ydC5nZXRFQmluZGluZygpKSk7Ci0JCQkJYmluZGluZ0dlbmVyYXRvci5zZXRQcm90b2NvbChvcHRpb25zUGFnZS5nZXRQcm90b2NvbCgpKTsKLQkJCQliaW5kaW5nR2VuZXJhdG9yLnNldE92ZXJ3cml0ZSh0cnVlKTsKLQkJCQliaW5kaW5nR2VuZXJhdG9yLnNldE9wdGlvbnMob3B0aW9uc1BhZ2UuZ2V0UHJvdG9jb2xPcHRpb25zKCkpOwotCQkJCWJpbmRpbmdHZW5lcmF0b3IuZ2VuZXJhdGUoKTsKLQotCQkJCS8vIEdlbmVyYXRlIGFkZHJlc3MKLQkJCQlTdHJpbmcgYWRkcmVzc05hbWUgPSBvcHRpb25zUGFnZS5nZXRQcm90b2NvbCgpLnRvTG93ZXJDYXNlKCkgKyAiOmFkZHJlc3MiOwotCQkJCU1hcCB0YWJsZSA9IG5ldyBIYXNodGFibGUoMSk7Ci0JCQkJU3RyaW5nIHVyaSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QUkVGX1BBR0VfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFIikpOwotCQkJCXRhYmxlLnB1dCgibG9jYXRpb24iLCB1cmkpOwotCQkJCUFkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQgYWRkRUVDb21tYW5kID0gbmV3IEFkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQocG9ydCwgIiIsIGFkZHJlc3NOYW1lLCB0YWJsZSk7Ci0JCQkJYWRkRUVDb21tYW5kLnJ1bigpOwotCi0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQlXU0RMUmVzb3VyY2VJbXBsLnNlcmlhbGl6ZShvdXRwdXRTdHJlYW0sIGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKSwgY2hhclNldCk7Ci0JCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJCWZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJCQlkZWZpbml0aW9uLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCQkJV1NETFJlc291cmNlSW1wbCByZXNvdXJjZSA9IChXU0RMUmVzb3VyY2VJbXBsKSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLndzZGwiKSk7Ci0JCQkJcmVzb3VyY2Uuc2V0VVJJKHVyaSk7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGVmaW5pdGlvbik7Ci0JCQkJcmVzb3VyY2Uuc2F2ZShudWxsKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5Db3VsZCBub3Qgd3JpdGUgbmV3IFdTREwgZmlsZSBpbiBXU0RMIFdpemFyZDogIiArIGUpOwotCQl9Ci0KLQkJLyoKLQkJICogaWYgKGZpbGUgIT0gbnVsbCkgeyBmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldwotCQkgKiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbGUpOyBpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsgSVdvcmtiZW5jaAotCQkgKiB3b3JrYmVuY2ggPSBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7IGZpbmFsCi0JCSAqIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0KLQkJICogd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOyBmaW5hbCBJV29ya2JlbmNoUGFydAotCQkgKiBmb2N1c1BhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsgaWYKLQkJICogKGZvY3VzUGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsKLQkJICogRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjIChuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJICogKChJU2V0U2VsZWN0aW9uVGFyZ2V0KWZvY3VzUGFydCkuc2VsZWN0UmV2ZWFsKHNlbGVjdGlvbik7IH0gfSk7IH0gfSB9Ci0JCSAqLwotCQlvcGVuRWRpdG9yKGZpbGUpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotCi0JCS8vIE5lZWQgbmV3IGljb24KLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoV1NETEVkaXRvci5jbGFzcywgImljb25zL25ld193c2RsX3dpei5naWYiKSk7Ci0JCXRoaXMuc2V0V2luZG93VGl0bGUoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfTkVXX1dTRExfRklMRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQluZXdGaWxlUGFnZSA9IG5ldyBXU0RMTmV3RmlsZVBhZ2Uoc2VsZWN0aW9uKTsKLQkJb3B0aW9uc1BhZ2UgPSBuZXcgV1NETE5ld0ZpbGVPcHRpb25zUGFnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9PUFRJT05TIiksIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX09QVElPTlMiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhZGRQYWdlKG5ld0ZpbGVQYWdlKTsKLQkJYWRkUGFnZShvcHRpb25zUGFnZSk7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldE5ld0ZpbGVQYXRoKCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBuZXdGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOwotCQlyZXR1cm4gZmlsZU5hbWUgIT0gbnVsbCA/IG5ldyBQYXRoKGZpbGVOYW1lKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAobmV3RmlsZVBhZ2UuaXNQYWdlQ29tcGxldGUoKSAmJiBvcHRpb25zUGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0KLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoaUZpbGUpLCAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvciIpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gQjJCR1VJUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKCJFeGNlcHRpb24KLQkJCQkJCS8vIGVuY291bnRlcmVkIHdoZW4gYXR0ZW1wdGluZyB0byBvcGVuIGZpbGU6ICIgKyBpRmlsZQotCQkJCQkJLy8gKyAiXG5cbiIgKyBleCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBBdmFpbGFibGVDb250ZW50Q01WaXNpdG9yIGV4dGVuZHMgQ01WaXNpdG9yIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9BVFRSSUJVVEVTID0gTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfQ0hJTERfTk9ERVMgPSBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfU0VRVUVOQ0VfR1JPVVBTID0gTW9kZWxRdWVyeS5JTkNMVURFX1NFUVVFTkNFX0dST1VQUzsKLQotCQlwdWJsaWMgSGFzaHRhYmxlIGNoaWxkTm9kZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwdWJsaWMgSGFzaHRhYmxlIGF0dHJpYnV0ZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwdWJsaWMgRWxlbWVudCByb290RWxlbWVudDsKLQkJcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RFbGVtZW50RGVjbGFyYXRpb247Ci0JCXB1YmxpYyBib29sZWFuIGlzUm9vdFZpc2l0ZWQ7Ci0JCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVTZXF1ZW5jZUdyb3VwczsKLQkJcHVibGljIERPTVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQkJcHVibGljIEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IoRWxlbWVudCByb290RWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJdGhpcy5yb290RWxlbWVudCA9IHJvb3RFbGVtZW50OwotCQkJdGhpcy5yb290RWxlbWVudERlY2xhcmF0aW9uID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbjsKLQkJCXZhbGlkYXRvciA9IG5ldyBET01WYWxpZGF0b3IoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5KENNTm9kZSBjbU5vZGUpIHsKLQkJCVN0cmluZyBrZXkgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KSBjbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsKLQkJCWlmIChjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZXNwYWNlVVJJID0gKFN0cmluZykgY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOwotCQkJCWlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotCQkJCQlrZXkgPSAiWyIgKyBuYW1lc3BhY2VVUkkgKyAiXSIgKyBrZXk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGtleTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGNvbXB1dGVBdmFpbGFibGVDb250ZW50KGludCBpbmNsdWRlT3B0aW9ucykgewotCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJCWludCBjb250ZW50VHlwZSA9IHJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCWluY2x1ZGVTZXF1ZW5jZUdyb3VwcyA9ICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX1NFUVVFTkNFX0dST1VQUykgIT0gMCk7Ci0JCQl2aXNpdENNTm9kZShyb290RWxlbWVudERlY2xhcmF0aW9uKTsKLQotCQkJaWYgKChpbmNsdWRlT3B0aW9ucyAmIElOQ0xVREVfQVRUUklCVVRFUykgIT0gMCkgewotCQkJCXYuYWRkQWxsKGF0dHJpYnV0ZVRhYmxlLnZhbHVlcygpKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIG5pbGxhYmxlQXR0cmlidXRlID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIHJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uaWxsYWJsZSIpOwotCQkJCWlmIChuaWxsYWJsZUF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCXYuYWRkKG5pbGxhYmxlQXR0cmlidXRlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX0NISUxEX05PREVTKSAhPSAwKSB7Ci0JCQkJaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8IGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpIHsKLQkJCQkJdi5hZGRBbGwoY2hpbGROb2RlVGFibGUudmFsdWVzKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpIHsKLQkJCQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpIHJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsKLQkJCQkJaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJCQl2LmFkZCgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgfHwgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKSB7Ci0JCQkJCUNNRGF0YVR5cGUgZGF0YVR5cGUgPSByb290RWxlbWVudERlY2xhcmF0aW9uLmdldERhdGFUeXBlKCk7Ci0JCQkJCWlmIChkYXRhVHlwZSAhPSBudWxsKSB7Ci0JCQkJCQl2LmFkZChkYXRhVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdjsKLQkJfQotCi0JCS8qCi0JCSAqIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KSB7IFN0cmluZyB1cmkgPQotCQkgKiBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOyBMaXN0IGxpc3QgPQotCQkgKiBnZXRDTURvY3VtZW50TGlzdChyb290RWxlbWVudCwgcm9vdEVsZW1lbnREZWNsYXJhdGlvbiwgdXJpKTsgZm9yCi0JCSAqIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJICogQ01Eb2N1bWVudCBjbWRvY3VtZW50ID0gKENNRG9jdW1lbnQpaXRlcmF0b3IubmV4dCgpOyBpZiAoY21kb2N1bWVudCAhPQotCQkgKiBudWxsKSB7IENNTmFtZWROb2RlTWFwIG1hcCA9IGNtZG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsgaW50IHNpemUgPQotCQkgKiBtYXAuZ2V0TGVuZ3RoKCk7IGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7IENNTm9kZSBlZCA9Ci0JCSAqIG1hcC5pdGVtKGkpOwotCQkgKiAKLQkJICogY2hpbGROb2RlVGFibGUucHV0KGdldEtleShlZCksIGVkKTsgfSB9IH0gfQotCQkgKi8KLQkJcHVibGljIHZvaWQgdmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpIHsKLQkJCXN1cGVyLnZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhZCk7Ci0JCQlhdHRyaWJ1dGVUYWJsZS5wdXQoYWQuZ2V0Tm9kZU5hbWUoKSwgYWQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCQkJaWYgKGVkID09IHJvb3RFbGVtZW50RGVjbGFyYXRpb24gJiYgIWlzUm9vdFZpc2l0ZWQpIHsKLQkJCQlpc1Jvb3RWaXNpdGVkID0gdHJ1ZTsKLQkJCQlzdXBlci52aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKGVkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghQm9vbGVhbi5UUlVFLmVxdWFscyhlZC5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKSkpIHsKLQkJCQkJY2hpbGROb2RlVGFibGUucHV0KGdldEtleShlZCksIGVkKTsKLQkJCQl9Ci0KLQkJCQlDTU5vZGVMaXN0IHN1YnN0aXR1dGlvbkdyb3VwID0gKENNTm9kZUxpc3QpIGVkLmdldFByb3BlcnR5KCJTdWJzdGl0dXRpb25Hcm91cCIpOwotCQkJCWlmIChzdWJzdGl0dXRpb25Hcm91cCAhPSBudWxsKSB7Ci0JCQkJCWhhbmRsZVN1YnN0aXR1dGlvbkdyb3VwKHN1YnN0aXR1dGlvbkdyb3VwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdWJzdGl0dXRpb25Hcm91cChDTU5vZGVMaXN0IHN1YnN0aXR1dGlvbkdyb3VwKSB7Ci0JCQlpbnQgc3Vic3RpdHV0aW9uR3JvdXBMZW5ndGggPSBzdWJzdGl0dXRpb25Hcm91cC5nZXRMZW5ndGgoKTsKLQkJCWlmIChzdWJzdGl0dXRpb25Hcm91cExlbmd0aCA+IDEpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YnN0aXR1dGlvbkdyb3VwTGVuZ3RoOyBpKyspIHsKLQkJCQkJQ01Ob2RlIGVkID0gc3Vic3RpdHV0aW9uR3JvdXAuaXRlbShpKTsKLQkJCQkJaWYgKCFCb29sZWFuLlRSVUUuZXF1YWxzKGVkLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpKSkgewotCQkJCQkJY2hpbGROb2RlVGFibGUucHV0KGdldEtleShlZCksIGVkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKSB7Ci0JCQlpZiAoaW5jbHVkZVNlcXVlbmNlR3JvdXBzKSB7Ci0JCQkJaWYgKGdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5TRVFVRU5DRSAmJiBncm91cC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPiAxICYmIGluY2x1ZGVzUmVxdWlyZWRDb250ZW50KGdyb3VwKSkgewotCQkJCQljaGlsZE5vZGVUYWJsZS5wdXQoZ3JvdXAsIGdyb3VwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci52aXNpdENNR3JvdXAoZ3JvdXApOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZXNSZXF1aXJlZENvbnRlbnQoQ01Hcm91cCBncm91cCkgewotCQkJTGlzdCBsaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGdyb3VwKTsKLQkJCXJldHVybiBsaXN0LnNpemUoKSA+IDE7Ci0JCX0KLQotCQlwdWJsaWMgRE9NVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJCXJldHVybiB2YWxpZGF0b3I7Ci0JCX0KLQl9IC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaGVyZQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9Qb3J0V2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1BvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlNjlkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1BvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLkFic3RyYWN0R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IuQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLlBvcnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aS5Db250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0cy5Qcm90b2NvbENvbXBvbmVudENvbnRyb2w7Ci0KLXB1YmxpYyBjbGFzcyBQb3J0V2l6YXJkIGV4dGVuZHMgV2l6YXJkCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFNUWUxFX05FV19CSU5ESU5HID0gMTsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU1RZTEVfRVhJU1RJTkdfQklORElORyA9IDEgPDwgMTsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU1RZTEVfREVGQVVMVCA9IFNUWUxFX05FV19CSU5ESU5HIHwgU1RZTEVfRVhJU1RJTkdfQklORElORzsKLQotICBwcm90ZWN0ZWQgUG9ydEdlbmVyYXRvciBwb3J0R2VuZXJhdG9yOwotICBwcm90ZWN0ZWQgUG9ydFdpemFyZE9wdGlvbnNQYWdlIHNwZWNpZnlCaW5kaW5nUGFnZTsKLSAgcHJvdGVjdGVkIGludCBzdHlsZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFBvcnRXaXphcmQuCi0gICAqLwotICBwdWJsaWMgUG9ydFdpemFyZChTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICB0aGlzKHNlcnZpY2UsIDApOwotICB9Ci0KLSAgcHVibGljIFBvcnRXaXphcmQoU2VydmljZSBzZXJ2aWNlLCBpbnQgc3R5bGUpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHBvcnRHZW5lcmF0b3IgPSBuZXcgUG9ydEdlbmVyYXRvcihzZXJ2aWNlKTsKLSAgICBzZXRXaW5kb3dUaXRsZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QT1JUX1dJWkFSRCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIC8vc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFdTRExFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9OZXdYTUwuZ2lmIikpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHdpemFyZCBzZXR1cCBpcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldHVwKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkUGFnZXMoKQotICB7Ci0gICAgc3BlY2lmeUJpbmRpbmdQYWdlID0gbmV3IFBvcnRXaXphcmRPcHRpb25zUGFnZShzdHlsZSk7Ci0gICAgYWRkUGFnZShzcGVjaWZ5QmluZGluZ1BhZ2UpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgICBwb3J0R2VuZXJhdG9yLmdlbmVyYXRlKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gcG9ydEdlbmVyYXRvci5nZXROZXdDb21wb25lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICBpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNsYXNzIFBvcnRXaXphcmRPcHRpb25zUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLSAgewotCi0gICAgcHJvdGVjdGVkIFByb3RvY29sQ29tcG9uZW50Q29udHJvbCBwcm90b2NvbENvbXBvbmVudENvbnRyb2w7Ci0KLSAgICBwdWJsaWMgUG9ydFdpemFyZE9wdGlvbnNQYWdlKGludCBzdHlsZSkKLSAgICB7Ci0gICAgICBzdXBlcigiU3BlY2lmeVBvcnRQYWdlIik7Ci0gICAgICBzZXRUaXRsZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9TUEVDSUZZX1BPUlRfREVUQUlMUyIpKTsKLSAgICAgIHNldERlc2NyaXB0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1NQRUNJRllfUE9SVF9ERVRBSUxTX1RPX0JFX0NSRUFURUQiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFic3RyYWN0R2VuZXJhdG9yIGdldEdlbmVyYXRvcigpCi0gICAgewotICAgICAgcmV0dXJuIHBvcnRHZW5lcmF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIFByb3RvY29sQ29tcG9uZW50Q29udHJvbCBwcm90b2NvbENvbXBvbmVudENvbnRyb2wgPSBuZXcgUG9ydFByb3RvY29sQ29tcG9uZW50Q29udHJvbChwYXJlbnQsIHBvcnRHZW5lcmF0b3IpOwotICAgICAgcHJvdG9jb2xDb21wb25lbnRDb250cm9sLmluaXRGaWVsZHMoKTsKLSAgICAgIHNldENvbnRyb2wocHJvdG9jb2xDb21wb25lbnRDb250cm9sKTsKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBQb3J0UHJvdG9jb2xDb21wb25lbnRDb250cm9sIGV4dGVuZHMgUHJvdG9jb2xDb21wb25lbnRDb250cm9sCi0gIHsKLQotICAgIHB1YmxpYyBQb3J0UHJvdG9jb2xDb21wb25lbnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIEFic3RyYWN0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgICB7Ci0gICAgICBzdXBlcihwYXJlbnQsIGdlbmVyYXRvciwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmTmFtZUxhYmVsVGV4dCgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JJTkRJTkciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRSZWZOYW1lcygpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKHBvcnRHZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpKS5nZXRCaW5kaW5nTmFtZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBwb3J0R2VuZXJhdG9yLmdldFNlcnZpY2UoKTsKLSAgICAgIHJldHVybiBOYW1lVXRpbC5idWlsZFVuaXF1ZVBvcnROYW1lKHNlcnZpY2UsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UgY3JlYXRlQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlKFN0cmluZyBwcm90b2NvbCkKLSAgICB7Ci0gICAgICBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2Ugb3B0aW9uc1BhZ2UgPSBudWxsOwotICAgICAgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbiBleHRlbnNpb24gPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0Q29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29udGVudEdlbmVyYXRvckV4dGVuc2lvbihwcm90b2NvbCk7Ci0gICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9wdGlvbnNQYWdlID0gZXh0ZW5zaW9uLmNyZWF0ZVBvcnRDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBvcHRpb25zUGFnZTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1dTRExOZXdGaWxlT3B0aW9uc1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvV1NETE5ld0ZpbGVPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODQxZmY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvV1NETE5ld0ZpbGVPcHRpb25zUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5WYWxpZGF0ZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRpYWxvZ3MuVXBkYXRlTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTmV3RmlsZU9wdGlvbnNQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLCBVcGRhdGVMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgdGFyZ2V0TmFtZXNwYWNlVGV4dDsKLSAgcHJvdGVjdGVkIFRleHQgcHJlZml4VGV4dDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlUG9ydE9wRmllbGRCb29sZWFuID0gdHJ1ZTsKLSAgCi0gIHByb3RlY3RlZCBQYWdlQm9vayBwcm90b2NvbFBhZ2VCb29rOwotICBwcm90ZWN0ZWQgQ29tYm8gcHJvdG9jb2xDb21ibzsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBzb2FwUGFnZTsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBodHRwUGFnZTsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBkb2NMaXRSYWRpbzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBycGNMaXRSYWRpbzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBycGNFbmNSYWRpbzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBodHRwR2V0UmFkaW87Ci0gIHByb3RlY3RlZCBCdXR0b24gaHR0cFBvc3RSYWRpbzsKLSAgCi0vLyAgcHJpdmF0ZSBCaW5kaW5nR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFdTRExOZXdGaWxlT3B0aW9uc1BhZ2UuCi0gICAqIEBwYXJhbSBwYWdlTmFtZQotICAgKi8KLSAgcHVibGljIFdTRExOZXdGaWxlT3B0aW9uc1BhZ2UoU3RyaW5nIHBhZ2VOYW1lKQotICB7Ci0gICAgc3VwZXIocGFnZU5hbWUpOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgV1NETE5ld0ZpbGVPcHRpb25zUGFnZS4KLSAgICogQHBhcmFtIHBhZ2VOYW1lCi0gICAqIEBwYXJhbSB0aXRsZQotICAgKiBAcGFyYW0gdGl0bGVJbWFnZQotICAgKi8KLSAgcHVibGljIFdTRExOZXdGaWxlT3B0aW9uc1BhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmcgdGl0bGUsIEltYWdlRGVzY3JpcHRvciB0aXRsZUltYWdlKQotICB7Ci0gICAgc3VwZXIocGFnZU5hbWUsIHRpdGxlLCB0aXRsZUltYWdlKTsKLSAgICBzZXREZXNjcmlwdGlvbihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9ERVNDUklQVElPTl9ORVdfV1NETF9GSUxFIikpOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBiYXNlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoYmFzZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfSEVMUCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGJhc2Uuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0gICAgLy8gIEdyb3VwIHdzZGxHcm91cCA9IFZpZXdVdGlsaXR5LmNyZWF0ZUdyb3VwKGJhc2UsIDIsICJXU0RMIiwgZmFsc2UpOwotICAgIENvbXBvc2l0ZSB3c2RsR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGJhc2UsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIHdzZGxHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHdzZGxHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIEdyaWREYXRhIGdkID0gKEdyaWREYXRhKXdzZGxHcm91cC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLSAgICBMYWJlbCB0YXJnZXROYW1lc3BhY2UgPSBuZXcgTGFiZWwod3NkbEdyb3VwLCBTV1QuTEVGVCk7Ci0gICAgdGFyZ2V0TmFtZXNwYWNlLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIEdyaWREYXRhIG5zRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIG5zRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB0YXJnZXROYW1lc3BhY2Uuc2V0TGF5b3V0RGF0YShuc0RhdGEpOwotICAgIAotICAgIHRhcmdldE5hbWVzcGFjZVRleHQgPSBuZXcgVGV4dCh3c2RsR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICBHcmlkRGF0YSB0ZXh0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIHRleHREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHRleHREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIHRleHREYXRhLndpZHRoSGludCA9IDEwOwotICAgIHRhcmdldE5hbWVzcGFjZVRleHQuc2V0TGF5b3V0RGF0YSh0ZXh0RGF0YSk7Ci0gICAgCi0gICAgdGFyZ2V0TmFtZXNwYWNlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotICAgIExhYmVsIHByZWZpeCA9IG5ldyBMYWJlbCh3c2RsR3JvdXAsIFNXVC5MRUZUKTsKLSAgICBwcmVmaXguc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9QUkVGSVhfV0lUSF9DT0xPTiIpKTsgLy8kTk9OLU5MUy0xJFwKLQotICAgIEdyaWREYXRhIHByZWZpeERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBwcmVmaXhEYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHByZWZpeC5zZXRMYXlvdXREYXRhKHByZWZpeERhdGEpOwotICAgIAotICAgIHByZWZpeFRleHQgPSBuZXcgVGV4dCh3c2RsR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICBHcmlkRGF0YSBwcmVmaXhUZXh0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIHByZWZpeFRleHREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHByZWZpeFRleHREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIHByZWZpeFRleHREYXRhLndpZHRoSGludCA9IDEwOwotICAgIHByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShwcmVmaXhUZXh0RGF0YSk7Ci0KLSAgICBwcmVmaXhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIC8vICAgIFhNTENhdGFsb2cgeG1sQ2F0YWxvZyA9IFhNTENhdGFsb2dSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmxvb2t1cE9yQ3JlYXRlWE1MQ2F0YWxvZygiZGVmYXVsdCIpOwotICAgIC8vICAgIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIGNhdGFsb2cgPSBuZXcgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwoYmFzZSwgeG1sQ2F0YWxvZyk7Ci0KLS8vICBEZXRlcm1pbmUgaWYgdGhlIHVzZXIgd2lzaGVzIHRvIGNyZWF0ZSBhIHNrZWxldG9uIFdTREwuICBJZiB5ZXMsIHByZXNlbnQgdGhlIHVzZXIgd2l0aCBpbnB1dCBmaWVsZHMuCi0gICAgY3JlYXRlU2tlbGV0b25DaGVja0JveCA9IG5ldyBCdXR0b24oYmFzZSwgU1dULkNIRUNLKTsKLSAgICBjcmVhdGVTa2VsZXRvbkNoZWNrQm94LnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQ1JFQVRFX1dTRExfU0tFTEVUT04iKSk7Ci0gICAgY3JlYXRlU2tlbGV0b25DaGVja0JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgCi0gICAgd3NkbFNrZWxldG9uR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGJhc2UsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dDIgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dDIubnVtQ29sdW1ucyA9IDI7Ci0gICAgd3NkbFNrZWxldG9uR3JvdXAuc2V0TGF5b3V0KGxheW91dDIpOwotCi0gICAgR3JpZERhdGEgZGF0YTIgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhMi52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YTIuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgd3NkbFNrZWxldG9uR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhMik7Ci0KLSAgIGNyZWF0ZUxhYmVsKHdzZGxTa2VsZXRvbkdyb3VwLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX1BST1RPQ09MIikpOwotICAgcHJvdG9jb2xDb21ibyA9IG5ldyBDb21ibyh3c2RsU2tlbGV0b25Hcm91cCwgU1dULlJFQURfT05MWSk7Ci0gICBHcmlkRGF0YSBkYXRhQyA9IG5ldyBHcmlkRGF0YSgpOwotICAgZGF0YUMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICBkYXRhQy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgIHByb3RvY29sQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhQyk7Ci0gICBwcm90b2NvbENvbWJvLmFkZChTT0FQX1BST1RPQ09MKTsKLSAgIHByb3RvY29sQ29tYm8uYWRkKEhUVFBfUFJPVE9DT0wpOwotICAgcHJvdG9jb2xDb21iby5zZWxlY3QoMCk7Ci0gICBwcm90b2NvbENvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotICAgCi0gICBzZXBMYWJlbCA9IG5ldyBMYWJlbChiYXNlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgR3JpZERhdGEgc2VwRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgc2VwRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgIHNlcERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICBzZXBMYWJlbC5zZXRMYXlvdXREYXRhKHNlcERhdGEpOwotICAgCi0gICAKLSAgIC8vIENyZWF0ZSBQYWdlQm9vayBhbmQgcGFnZXMvY29udHJvbHMgZm9yIHRoZSBQYWdlQm9vawotICAgcHJvdG9jb2xQYWdlQm9vayA9IG5ldyBQYWdlQm9vayhiYXNlLCBTV1QuTk9ORSk7Ci0KLSAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gU29hcCBQYWdlCi0gICBzb2FwUGFnZSA9IG5ldyBDb21wb3NpdGUocHJvdG9jb2xQYWdlQm9vaywgU1dULk5PTkUpOwotICAgR3JpZExheW91dCBwYkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICBzb2FwUGFnZS5zZXRMYXlvdXQocGJMYXlvdXQpOwotCi0gICBHcmlkRGF0YSBwYkRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgIHBiRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICBwYkRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICBzb2FwUGFnZS5zZXRMYXlvdXREYXRhKHBiRGF0YSk7Ci0KLSAgIGNyZWF0ZUxhYmVsKHNvYXBQYWdlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9TT0FQX0JJTkRJTkdfT1BUSU9OUyIpKTsKLSAgIGRvY0xpdFJhZGlvID0gbmV3IEJ1dHRvbihzb2FwUGFnZSwgU1dULlJBRElPKTsKLSAgIHJwY0xpdFJhZGlvID0gbmV3IEJ1dHRvbihzb2FwUGFnZSwgU1dULlJBRElPKTsKLSAgIHJwY0VuY1JhZGlvID0gbmV3IEJ1dHRvbihzb2FwUGFnZSwgU1dULlJBRElPKTsKLSAgIGRvY0xpdFJhZGlvLnNldFRleHQoU09BUF9ET0NVTUVOVF9MSVRFUkFMKTsKLSAgIHJwY0xpdFJhZGlvLnNldFRleHQoU09BUF9SUENfTElURVJBTCk7Ci0gICBycGNFbmNSYWRpby5zZXRUZXh0KFNPQVBfUlBDX0VOQ09ERUQpOwotICAgZG9jTGl0UmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgCi0gICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEh0dHAgUGFnZQotICAgaHR0cFBhZ2UgPSBuZXcgQ29tcG9zaXRlKHByb3RvY29sUGFnZUJvb2ssIFNXVC5OT05FKTsKLSAgIHBiTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgIGh0dHBQYWdlLnNldExheW91dChwYkxheW91dCk7Ci0KLSAgIHBiRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgcGJEYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgIHBiRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgIGh0dHBQYWdlLnNldExheW91dERhdGEocGJEYXRhKTsKLSAgIAotICAgY3JlYXRlTGFiZWwoaHR0cFBhZ2UsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0hUVFBfQklORElOR19PUFRJT05TIikpOyAvLyBBbHJlYWR5IEV4dGVybmFsaXplZAotICAgaHR0cEdldFJhZGlvID0gbmV3IEJ1dHRvbihodHRwUGFnZSwgU1dULlJBRElPKTsKLSAgIGh0dHBQb3N0UmFkaW8gPSBuZXcgQnV0dG9uKGh0dHBQYWdlLCBTV1QuUkFESU8pOwotICAgaHR0cEdldFJhZGlvLnNldFRleHQoSFRUUF9HRVQpOwotICAgaHR0cFBvc3RSYWRpby5zZXRUZXh0KEhUVFBfUE9TVCk7Ci0gICBodHRwR2V0UmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgCi0gICB3c2RsU2tlbGV0b25Hcm91cC5zZXRWaXNpYmxlKHRydWUpOwotICAgc2VwTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLSAgIHByb3RvY29sUGFnZUJvb2suc2hvd1BhZ2Uoc29hcFBhZ2UpOwotICAgcHJvdG9jb2xQYWdlQm9vay5zZXRWaXNpYmxlKHRydWUpOwotICAgCi0gICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBBZGQgU2VsZWN0aW9uIExpc3RlbmVycwotICAgY3JlYXRlU2tlbGV0b25DaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgIAotLy8gICBCaW5kaW5nUHJvdG9jb2xDb21wb25lbnRDb250cm9sIGNvbXBvbmVudCA9IG5ldyBCaW5kaW5nUHJvdG9jb2xDb21wb25lbnRDb250cm9sKGJhc2UsIGdlbmVyYXRvciwgZmFsc2UpOwotLy8gICBjb21wb25lbnQuaW5pdEZpZWxkcygpOwotICAgCi0gICAgc2V0Q29udHJvbChiYXNlKTsKLSAgfQotCi0gIHByaXZhdGUgTmV3V1NETFdpemFyZCBnZXROZXdXU0RMV2l6YXJkKCkKLSAgewotICAgIHJldHVybiAoTmV3V1NETFdpemFyZClnZXRXaXphcmQoKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGNvbXB1dGVEZWZhdWx0RGVmaW5pdGlvbk5hbWUoKQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSAiRGVmYXVsdE5hbWUiOwotICAgIElQYXRoIHBhdGggPSBnZXROZXdXU0RMV2l6YXJkKCkuZ2V0TmV3RmlsZVBhdGgoKTsKLSAgICBpZiAocGF0aCAhPSBudWxsKQotICAgIHsKLSAgICAgIG5hbWUgPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZURlZmF1bHROYW1lc3BhY2VOYW1lKCkKLSAgewotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UiKSk7Ci0gICAgaWYgKCFuYW1lc3BhY2UuZW5kc1dpdGgoIi8iKSkgewotICAgIAluYW1lc3BhY2UgPSBuYW1lc3BhY2UuY29uY2F0KCIvIik7Ci0gICAgfQotICAgIAotICAgIElQYXRoIHBhdGggPSBnZXROZXdXU0RMV2l6YXJkKCkuZ2V0TmV3RmlsZVBhdGgoKTsKLSAgICBpZiAocGF0aCAhPSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSArPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS50b1N0cmluZygpICsgIi8iOwotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpCi0gIHsKLSAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCi0gICAgaWYgKHZpc2libGUpCi0gICAgewotICAgICAgLy8gcHJpbWUgdGhlIGZpZWxkcyAgICAKLSAgICAgIHRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dChjb21wdXRlRGVmYXVsdE5hbWVzcGFjZU5hbWUoKSk7Ci0gICAgICBwcmVmaXhUZXh0LnNldFRleHQoInRucyIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2VUZXh0LmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkKLSAgewotICAgIHJldHVybiBwcmVmaXhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlZmluaXRpb25OYW1lKCkKLSAgewotICAJcmV0dXJuIGNvbXB1dGVEZWZhdWx0RGVmaW5pdGlvbk5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0YXJnZXROYW1lc3BhY2VUZXh0KQotICAgIHsKLSAgICAgIHN0YXJ0RGVsYXllZEV2ZW50KGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBwcmVmaXhUZXh0KQotICAgIHsKLSAgICAgIHNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLSAgICB9Ci0JZWxzZSBpZiAoZS53aWRnZXQgPT0gcHJvdG9jb2xDb21ibykgewotCQkvLyBVcGRhdGUgd2hhdCBwYWdlL2NvbnRyb2wgd2Ugc2hvdyBpbiB0aGUgUGFnZUJvb2sKLQkJaWYgKHByb3RvY29sQ29tYm8uZ2V0VGV4dCgpLmVxdWFscygiU09BUCIpKSB7Ci0JCQlwcm90b2NvbFBhZ2VCb29rLnNob3dQYWdlKHNvYXBQYWdlKTsKLQkJfQotCQllbHNlIGlmIChwcm90b2NvbENvbWJvLmdldFRleHQoKS5lcXVhbHMoIkhUVFAiKSkgewotCQkJcHJvdG9jb2xQYWdlQm9vay5zaG93UGFnZShodHRwUGFnZSk7Ci0JCX0KLQl9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1cGRhdGVPY2N1cmVkKE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikKLSAgewotICAgIHNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkKLSAgewotICAgIGJvb2xlYW4gcmVhZHkgPSB0cnVlOwotCi0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0gICAgLy8gc28gdGhhdCB0aGUgcGFnZSBkb2Vzbid0IGltbWVkaWF0ZWx5IHNob3cgdXAgd2l0aCBhbiBlcnJvcgotICAgIGlmICh0YXJnZXROYW1lc3BhY2VUZXh0LmdldFRleHQoKS50cmltKCkuZXF1YWxzKCIiKSkKLSAgICB7Ci0gICAgICBpZiAocmVhZHkpCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIXZhbGlkYXRlVGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZVRleHQuZ2V0VGV4dCgpKSkKLSAgICB7Ci0gICAgICByZWFkeSA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVhZHk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeChTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IFZhbGlkYXRlSGVscGVyLmNoZWNrWE1MUHJlZml4KHByZWZpeCk7Ci0KLSAgICBpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgfHwgZXJyb3JNZXNzYWdlLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlWE1MTmFtZShTdHJpbmcgeG1sTmFtZSkKLSAgewotICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBWYWxpZGF0ZUhlbHBlci5jaGVja1hNTE5hbWUoeG1sTmFtZSk7Ci0KLSAgICBpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgfHwgZXJyb3JNZXNzYWdlLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlVGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBucykKLSAgewotICAgIGJvb2xlYW4gdGVzdCA9IHRydWU7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJJIHRlc3RVUkkgPSBuZXcgVVJJKG5zKTsKLSAgICAgIC8vICAgICAgaWYgKCF0ZXN0VVJJLmlzR2VuZXJpY1VSSSgpKQotICAgICAgLy8gICAgICB7Ci0gICAgICAvLyAgICAgICAgc2V0RXJyb3JNZXNzYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfTkFNRVNQQUNFX0lOVkFMSUQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIC8vICAgICAgICB0ZXN0ID0gZmFsc2U7Ci0gICAgICAvLyAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFZhbGlkYXRlSGVscGVyLmNoZWNrWE1MTmFtZShucyk7Ci0gICAgICAvLwkJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCB8fCBlcnJvck1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLSAgICAgIC8vCQkJewotICAgICAgLy8JCQkJdGVzdCA9IHRydWU7Ci0gICAgICAvLwkJCX0KLSAgICAgIC8vCQkJZWxzZQotICAgICAgLy8JCQl7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfTkFNRVNQQUNFX0lOVkFMSUQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRlc3QgPSBmYWxzZTsKLSAgICAgIC8vCQkJfQotICAgIH0KLQotICAgIHJldHVybiB0ZXN0OwotICB9Ci0KLSAgLyoKLSAgcHJpdmF0ZSBib29sZWFuIGFyZVByZWZpeGVzVW5pcXVlQW5kVmFsaWQoKQotICB7Ci0gICAgamF2YS51dGlsLkxpc3QgaW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvLmdldE5hbWVzcGFjZUluZm9MaXN0KCk7Ci0gICAgamF2YS51dGlsLkxpc3QgY2hlY2tlZExpc3QgPSBuYW1lc3BhY2VJbmZvLmdldE5hbWVzcGFjZUNoZWNrZWRMaXN0KCk7Ci0KLSAgICBWZWN0b3IgcHJlZml4TGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBib29sZWFuIHRlc3QgPSB0cnVlOwotICAgIGJvb2xlYW4gaXNPbmVCbGFuayA9IGZhbHNlOwotCi0gICAgU3RyaW5nIGN1cnJlbnRQcmVmaXggPSBwcmVmaXhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgaWYgKGN1cnJlbnRQcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICBpc09uZUJsYW5rID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICh2YWxpZGF0ZVByZWZpeChjdXJyZW50UHJlZml4KSkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4TGlzdC5hZGQoY3VycmVudFByZWZpeCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9QUkVGSVhfSVNfSU5WQUxJRCIsIGN1cnJlbnRQcmVmaXgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvTGlzdC5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpbmZvTGlzdC5nZXQoaSk7Ci0gICAgICBpZiAoKChTdHJpbmcpY2hlY2tlZExpc3QuZ2V0KGkpKS5lcXVhbHMoInRydWUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBTdHJpbmcgYVByZWZpeCA9IGluZm8ucHJlZml4LnRyaW0oKTsKLSAgICAgICAgaWYgKGFQcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFwcmVmaXhMaXN0LmNvbnRhaW5zKGFQcmVmaXgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZVByZWZpeChhUHJlZml4KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJlZml4TGlzdC5hZGQoYVByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9QUkVGSVhfSVNfSU5WQUxJRCIsIGluZm8ucHJlZml4KSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgdGVzdCA9IGZhbHNlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9QUkVGSVhfSVNfQV9EVVBMSUNBVEUiLCBpbmZvLnByZWZpeCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0ZXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc09uZUJsYW5rKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzT25lQmxhbmsgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0VSUk9SX01PUkVfVEhBTl9PTkVfUFJFRklYX0lTX0JMQU5LIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0ZXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRlc3Q7Ci0gIH0KLSAgKi8KLQotICBwcm90ZWN0ZWQgRGVsYXllZEV2ZW50IGRlbGF5ZWRUYXNrOwotICBwcm90ZWN0ZWQgdm9pZCBzdGFydERlbGF5ZWRFdmVudChNb2RpZnlFdmVudCBlKQotICB7Ci0gICAgaWYgKGRlbGF5ZWRUYXNrID09IG51bGwgfHwgZGVsYXllZFRhc2suZ2V0RXZlbnQoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIGRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotICAgICAgZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0gICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLCBkZWxheWVkVGFzayk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBNb2RpZnlFdmVudCBkZWxheWVkRXZlbnQgPSBkZWxheWVkVGFzay5nZXRFdmVudCgpOwotCi0gICAgICBpZiAoZS53aWRnZXQgPT0gZGVsYXllZEV2ZW50LndpZGdldCkKLSAgICAgIHsKLSAgICAgICAgLy8gc2FtZSBldmVudCwganVzdCBkaWZmZXJlbnQgZGF0YSwgZGVsYXkgbmV3IGV2ZW50Ci0gICAgICAgIGRlbGF5ZWRUYXNrLnNldEV2ZW50KG51bGwpOwotICAgICAgfQotICAgICAgZGVsYXllZFRhc2sgPSBuZXcgRGVsYXllZEV2ZW50KCk7Ci0gICAgICBkZWxheWVkVGFzay5zZXRFdmVudChlKTsKLSAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnRpbWVyRXhlYyg1MDAsIGRlbGF5ZWRUYXNrKTsKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBEZWxheWVkRXZlbnQgaW1wbGVtZW50cyBSdW5uYWJsZQotICB7Ci0gICAgcHJvdGVjdGVkIE1vZGlmeUV2ZW50IGV2ZW50OwotCi0gICAgLyoKLSAgICAgKiBAc2VlIFJ1bm5hYmxlI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBpZiAoZXZlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotICAgICAgICBldmVudCA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1vZGlmeUV2ZW50IGdldEV2ZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gZXZlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXZlbnQoTW9kaWZ5RXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgdGhpcy5ldmVudCA9IGV2ZW50OwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gIAkgaWYgKGUud2lkZ2V0ID09IGNyZWF0ZVNrZWxldG9uQ2hlY2tCb3gpIHsKLSAgCSAJaWYgKGNyZWF0ZVNrZWxldG9uQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpIHsKLSAgCSAJCXdzZGxTa2VsZXRvbkdyb3VwLnNldFZpc2libGUodHJ1ZSk7Ci0gIAkgCQlzZXBMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotICAJIAkJcHJvdG9jb2xQYWdlQm9vay5zZXRWaXNpYmxlKHRydWUpOwotICAJIAl9Ci0gIAkgCWVsc2UgewotICAJIAkJd3NkbFNrZWxldG9uR3JvdXAuc2V0VmlzaWJsZShmYWxzZSk7Ci0gIAkgCQlzZXBMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgCSAJCXByb3RvY29sUGFnZUJvb2suc2V0VmlzaWJsZShmYWxzZSk7Ci0gIAkgCX0KLSAgCSB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX1BST1RPQ09MID0gIlNPQVAiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9UT0NPTCA9ICJIVFRQIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUlBDX0VOQ09ERUQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9SQURJT19SUENfRU5DT0RFRCIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9SUENfTElURVJBTCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1JBRElPX1JQQ19MSVRFUkFMIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0RPQ1VNRU5UX0xJVEVSQUwgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9SQURJT19ET0NVTUVOVF9MSVRFUkFMIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BPU1QgPSAiSFRUUCBQT1NUIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfR0VUID0gIkhUVFAgR0VUIjsKLQotICBDb21wb3NpdGUgd3NkbFNrZWxldG9uR3JvdXA7Ci0gIEJ1dHRvbiBjcmVhdGVTa2VsZXRvbkNoZWNrQm94OwotICAKLSAgTGFiZWwgc2VwTGFiZWw7Ci0gIAotICBwcml2YXRlIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBjb21wKSB7Ci0gICAgVGV4dCB0ZXh0RmllbGQgPSBuZXcgVGV4dChjb21wLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgR3JpZERhdGEgdGV4dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICB0ZXh0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB0ZXh0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICB0ZXh0RGF0YS53aWR0aEhpbnQgPSAxMDsKLSAgICB0ZXh0RmllbGQuc2V0TGF5b3V0RGF0YSh0ZXh0RGF0YSk7Ci0KLSAgCXJldHVybiB0ZXh0RmllbGQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbXAsIFN0cmluZyBsYWJlbFN0cmluZykgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRUZXh0KGxhYmVsU3RyaW5nKTsKLSAgICBHcmlkRGF0YSBuc0RhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBuc0RhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuc0RhdGEpOwotICAgIAotICAgIHJldHVybiBsYWJlbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICBjb21wb3NpdGUuc2V0Rm9udChuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgIm1zIHNhbnMgc2VyaWYiLCA4LCBTV1QuTk9STUFMKSk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBWZWN0b3IgZ2V0TmFtZXNwYWNlSW5mbygpIHsKLQkJVmVjdG9yIG5hbWVzcGFjZXMgPSBuZXcgVmVjdG9yKCk7Ci0gIAkJCi0gIAkJLy8gQWRkIERlZmF1bHQgTmFtZXNwYWNlcwotCQlOYW1lc3BhY2VJbmZvIGluZm8xID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLQkJaW5mbzEucHJlZml4ID0gIndzZGwiOwotCQlpbmZvMS51cmkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotCQluYW1lc3BhY2VzLmFkZEVsZW1lbnQoaW5mbzEpOwotCQkKLQkJTmFtZXNwYWNlSW5mbyBpbmZvOCA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0JCWluZm84LnByZWZpeCA9ICJ4c2QiOwotCQlpbmZvOC51cmkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCQluYW1lc3BhY2VzLmFkZEVsZW1lbnQoaW5mbzgpOwotCQkKLQkJcmV0dXJuIG5hbWVzcGFjZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldENyZWF0ZVNrZWxldG9uQm9vbGVhbigpIHsKLSAgCXJldHVybiBjcmVhdGVTa2VsZXRvbkNoZWNrQm94LmdldFNlbGVjdGlvbigpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotICAJcmV0dXJuIHByb3RvY29sQ29tYm8uZ2V0VGV4dCgpOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0UHJvdG9jb2xPcHRpb25zKCkgewotICAJT2JqZWN0IGJvb2xbXSA9IG5ldyBCb29sZWFuWzNdOwotICAJaWYgKHByb3RvY29sQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhTT0FQX1BST1RPQ09MKSkgewotICAJCWlmIChkb2NMaXRSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotICAJCQlib29sWzBdID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gIAkJfQotICAJCWVsc2UgewotICAJCQlib29sWzBdID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotICAJCX0KLSAgCQkKLSAgCQlpZiAocnBjTGl0UmFkaW8uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgCQkJYm9vbFsyXSA9IG5ldyBCb29sZWFuKHRydWUpOwotICAJCX0KLSAgCQllbHNlIHsKLSAgCQkJYm9vbFsyXSA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLSAgCQl9Ci0gIAl9Ci0gIAllbHNlIGlmIChwcm90b2NvbENvbWJvLmdldFRleHQoKS5lcXVhbHMoSFRUUF9QUk9UT0NPTCkpewotICAJCWlmIChodHRwR2V0UmFkaW8uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgCQkJYm9vbFswXSA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkJCWJvb2xbMF0gPSBuZXcgQm9vbGVhbih0cnVlKTsKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBib29sOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NvYXBEb2NMaXRlcmFsUHJvdG9jb2woKSB7Ci0gIAlpZiAoZ2V0UHJvdG9jb2woKS5lcXVhbHMoU09BUF9QUk9UT0NPTCkgJiYgZG9jTGl0UmFkaW8uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgCQlyZXR1cm4gdHJ1ZTsKLSAgCX0KLSAgCWVsc2UgewotICAJCXJldHVybiBmYWxzZTsKLSAgCX0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9XU0RMTmV3RmlsZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvV1NETE5ld0ZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDhlODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9XU0RMTmV3RmlsZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgV1NETE5ld0ZpbGVQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZQotewotICBwdWJsaWMgV1NETE5ld0ZpbGVQYWdlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9ORVdfV1NETF9GSUxFIiksIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXRUaXRsZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9ORVdfV1NETF9GSUxFIikpOyAvLyROT04tTkxTLTEkCi0gICAgc2V0RGVzY3JpcHRpb24oV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQ1JFQVRFX05FV19XU0RMX0ZJTEUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICAvLyBpbmhlcml0IGRlZmF1bHQgY29udGFpbmVyIGFuZCBuYW1lIHNwZWNpZmljYXRpb24gd2lkZ2V0cwotICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICB0aGlzLnNldEZpbGVOYW1lKGNvbXB1dGVEZWZhdWx0RmlsZU5hbWUoKSk7Ci0KLSAgICBzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKQotICB7Ci0gICAgUGF0aCBuZXdOYW1lID0gbmV3IFBhdGgoZ2V0RmlsZU5hbWUoKSk7Ci0gICAgU3RyaW5nIGZ1bGxGaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0gICAgU3RyaW5nIGV4dGVuc2lvbiA9IG5ld05hbWUuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCB8fCAhZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoIndzZGwiKSkgIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfRklMRV9NVVNUX0VORF9XSVRIX1dTREwiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgZm9yIGZpbGUgc2hvdWxkIGJlIGNhc2UgaW5zZW5zaXRpdmUKLSAgICBTdHJpbmcgc2FtZU5hbWUgPSBleGlzdHNGaWxlQW55Q2FzZShmdWxsRmlsZU5hbWUpOwotICAgIGlmIChzYW1lTmFtZSAhPSBudWxsKSAKLSAgICB7Ci0gICAgICAgU3RyaW5nIHF1YWxpZmllZEZpbGVOYW1lID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS50b1N0cmluZygpICsgJy8nICsgZnVsbEZpbGVOYW1lOwotICAgICAgIHNldEVycm9yTWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTIiwgIHNhbWVOYW1lKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgCi0gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlUGFnZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBkZWZhdWx0TmFtZSA9ICJOZXdXU0RMRmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyBkZWZhdWx0RmlsZUV4dGVuc2lvbiA9ICIud3NkbCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMgPSB7ICIqLndzZGwifTsgLy8kTk9OLU5MUy0xJAotCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlRGVmYXVsdEZpbGVOYW1lKCkKLSAgewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgU3RyaW5nIGZpbGVOYW1lID0gZGVmYXVsdE5hbWUgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLSAgICBJUGF0aCBjb250YWluZXJGdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0gICAgaWYgKGNvbnRhaW5lckZ1bGxQYXRoICE9IG51bGwpCi0gICAgewotICAgICAgd2hpbGUgKHRydWUpCi0gICAgICB7Ci0gICAgICAgIElQYXRoIHBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotICAgICAgICAvLyBpZiAoV29ya2JlbmNoVXRpbGl0eS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKHBhdGgpKQotICAgICAgICBpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMocGF0aCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgIGZpbGVOYW1lID0gZGVmYXVsdE5hbWUgKyBjb3VudCArIGRlZmF1bHRGaWxlRXh0ZW5zaW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaWxlTmFtZTsKLSAgfQotCi0gIC8vIHJldHVybnMgdHJ1ZSBpZiBmaWxlIG9mIHNwZWNpZmllZCBuYW1lIGV4aXN0cyBpbiBhbnkgY2FzZSBmb3Igc2VsZWN0ZWQgY29udGFpbmVyCi0gIHByb3RlY3RlZCBTdHJpbmcgZXhpc3RzRmlsZUFueUNhc2UoU3RyaW5nIGZpbGVOYW1lKQotICB7Ci0gICAgaWYgKCAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpCi0gICAgICAgICAgJiYgKGZpbGVOYW1lLmNvbXBhcmVUbygiIikgIT0gMCkpCi0gICAgewotICAgICAgLy9sb29rIHRocm91Z2ggYWxsIHJlc291cmNlcyBhdCB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciAtIGNvbXBhcmUgaW4gdXBwZXIgY2FzZQotICAgICAgSVJlc291cmNlIHBhcmVudCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihnZXRDb250YWluZXJGdWxsUGF0aCgpKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotICAgICAgewotICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBwYXJlbnQ7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgSVJlc291cmNlW10gbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0gICAgICAgICAgU3RyaW5nIGVudGVyZWRGaWxlVXBwZXIgPSBmaWxlTmFtZS50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtZW1iZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVVwcGVyTmFtZSA9IG1lbWJlcnNbaV0uZ2V0TmFtZSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VVcHBlck5hbWUuZXF1YWxzKGVudGVyZWRGaWxlVXBwZXIpKQotICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgIHJldHVybiBtZW1iZXJzW2ldLmdldE5hbWUoKTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNERGV0YWlsc1ZpZXdlclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNERGV0YWlsc1ZpZXdlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MzYwNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRERldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotCi0KLQotcHVibGljIGNsYXNzIFhTRERldGFpbHNWaWV3ZXJQcm92aWRlciAvLyBpbXBsZW1lbnRzIElEZXRhaWxzVmlld2VyUHJvdmlkZXIKLXsKLS8vICBwdWJsaWMgT2JqZWN0IGdldFZpZXdlcktleShPYmplY3QgbW9kZWxPYmplY3QpCi0vLyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7ICAgCi0vLwotLy8gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0vLyAgICB7Ci0vLyAgICAgIEVsZW1lbnQgaW5wdXQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW1vZGVsT2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0vLwotLy8gICAgICBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiZWxlbWVudCI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCB0cnVlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJlbGVtZW50UmVmIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLS8vICAgICAgICAgICAgICAgIGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQ0hPSUNFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLS8vICAgICAgICAgICAgICAgIGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAic2VxdWVuY2VDaG9pY2VBbGwiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiYXR0cmlidXRlIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiYXR0cmlidXRlUmVmIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiYXR0cmlidXRlR3JvdXAiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIHRydWUpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImF0dHJpYnV0ZUdyb3VwUmVmIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAibm90YXRpb24iOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJncm91cCI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiZ3JvdXBSZWYiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAic2NoZW1hIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiY29tcGxleFR5cGUiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImRvY3VtZW50YXRpb24iOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQVBQSU5GT19FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImFwcEluZm8iOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KWlucHV0OwotLy8gICAgICAgICAgWFNERE9NSGVscGVyIHhzZERPTUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLS8vICAgICAgICAgIEVsZW1lbnQgZGVyaXZlZEJ5Tm9kZSA9IHhzZERPTUhlbHBlci5nZXREZXJpdmVkQnlFbGVtZW50KHBhcmVudEVsZW1lbnQpOwotLy8gICAgICAgICAgaWYgKGRlcml2ZWRCeU5vZGUgIT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgaWYgKGlucHV0RXF1YWxzKGRlcml2ZWRCeU5vZGUsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgcmVzdWx0ID0gInNpbXBsZUNvbnRlbnQiOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGRlcml2ZWRCeU5vZGUsIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIHJlc3VsdCA9ICJzaW1wbGVDb250ZW50IjsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICByZXN1bHQgPSAieHNkIjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KWlucHV0OwotLy8gICAgICAgICAgWFNERE9NSGVscGVyIHhzZERPTUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLS8vICAgICAgICAgIEVsZW1lbnQgZGVyaXZlZEJ5Tm9kZSA9IHhzZERPTUhlbHBlci5nZXREZXJpdmVkQnlFbGVtZW50KHBhcmVudEVsZW1lbnQpOwotLy8gICAgICAgICAgaWYgKGRlcml2ZWRCeU5vZGUgIT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcmVzdWx0ID0gInNpbXBsZUNvbnRlbnQiOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICByZXN1bHQgPSAieHNkIjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5JTkNMVURFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiaW5jbHVkZVhTRCI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5JTVBPUlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJpbXBvcnRYU0QiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuUkVERUZJTkVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJyZWRlZmluZSI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAic2ltcGxlQmFzZSI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gInNpbXBsZUJhc2UiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9IGdldEtleUZvclJlc3RyaWN0V2luZG93KGlucHV0KTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaXNGYWNldChpbnB1dCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgTm9kZSBwYXJlbnRFbGVtZW50ID0gKChFbGVtZW50KWlucHV0KS5nZXRQYXJlbnROb2RlKCk7Ci0vLyAgICAgICAgICBpZiAoaW5wdXRFcXVhbHMocGFyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHJlc3VsdCA9IGdldEtleUZvclJlc3RyaWN0V2luZG93KGlucHV0KTsKLS8vICAgICAgICAgIH0gCi0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgTm9kZSBwYXJlbnRFbGVtZW50ID0gKChFbGVtZW50KWlucHV0KS5nZXRQYXJlbnROb2RlKCk7Ci0vLyAgICAgICAgICBpZiAoaW5wdXRFcXVhbHMocGFyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHJlc3VsdCA9ICJzaW1wbGVDb250ZW50IjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKHBhcmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHJlc3VsdCA9ICJzaW1wbGVDb250ZW50IjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcmVzdWx0ID0gInhzZCI7ICAgICAgICAgICAgCi0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuUEFUVEVSTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gInBhdHRlcm4iOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRU5VTUVSQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJlbnVtIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFOWV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImFueUVsZW1lbnQiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiYW55QXR0cmlidXRlIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlVOSVFVRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gInVuaXF1ZSI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5LRVlSRUZfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJrZXlSZWYiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0VMRUNUT1JfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJzZWxlY3RvciI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5GSUVMRF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImZpZWxkIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLktFWV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImtleSI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gInhzZCI7Ci0vLyAgICAgIH0gICAgICAKLS8vICAgIH0gIAotLy8gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLS8vICAgIHsKLS8vICAgICAgcmVzdWx0ID0gInNjaGVtYSI7Ci0vLyAgICB9Ci0vLwotLy8gICAgcmV0dXJuIHJlc3VsdDsKLS8vICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8KLS8vCi0vLyAgcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotLy8gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vICAgIFZpZXdlciB2aWV3ZXIgPSBudWxsOwotLy8KLS8vICAgIAotLy8gICAgRGVzaWduVmlld2VyIGRlc2lnblZpZXdlciA9IG5ldyBEZXNpZ25WaWV3ZXIoZWRpdG9yUGFydCk7Ci0vLyAgICBkZXNpZ25WaWV3ZXIuc2V0Q29udHJvbChwYXJlbnQpOyAgICAKLS8vICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotLy8gICAgewotLy8gICAgICBFbGVtZW50IGVsZW0gPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW1vZGVsT2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0vLyAgICAgIHZpZXdlciA9IGRlc2lnblZpZXdlci5jcmVhdGVWaWV3ZXIoZWxlbSk7Ci0vLy8vVE9ETyBwb3J0Ci0vLy8vICAgICAgKChCYXNlV2luZG93KXZpZXdlcikuc2V0TW9kZWxPYmplY3QobW9kZWxPYmplY3QpOwotLy8vLyAgICAgIHZpZXdlci5zZXRJbnB1dChlbGVtKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0vLyAgICB7Ci0vLyAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IHNjaGVtYSA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCltb2RlbE9iamVjdDsKLS8vICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IHNjaGVtYS5nZXRTY2hlbWEoKTsKLS8vICAgICAgRWxlbWVudCBlbGVtID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLS8vICAgICAgdmlld2VyID0gZGVzaWduVmlld2VyLmNyZWF0ZVZpZXdlcihlbGVtKTsKLS8vLy9UT0RPIHBvcnQKLS8vLy8gICAgICAoKEJhc2VXaW5kb3cpdmlld2VyKS5zZXRNb2RlbE9iamVjdChtb2RlbE9iamVjdCk7Ci0vLy8vICAgICAgdmlld2VyLnNldElucHV0KGVsZW0pOyAgICAgIAotLy8gICAgfQotLy8gICAgcmV0dXJuIHZpZXdlcjsKLS8vICB9Ci0vLwotLy8gIHByb3RlY3RlZCBib29sZWFuIGlucHV0RXF1YWxzKE9iamVjdCBpbnB1dCwgU3RyaW5nIHRhZ25hbWUsIGJvb2xlYW4gaXNSZWYpCi0vLyAgewotLy8gICAgcmV0dXJuIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhpbnB1dCwgdGFnbmFtZSwgaXNSZWYpOwotLy8gIH0KLS8vCi0vLyAgcHJvdGVjdGVkIFN0cmluZyBnZXRLZXlGb3JSZXN0cmljdFdpbmRvdyhPYmplY3QgaW5wdXQpCi0vLyAgewotLy8gICAgLy8gc3BlY2lhbCBjYXNlIHdoZXJlIFNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gaXMgZGlmZmVyZW50IHRoYW4gU2ltcGxlQ29udGVudCByZXN0cmljdGlvbgotLy8KLS8vICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLS8vICAgIHsKLS8vICAgICAgTm9kZSBwYXJlbnRFbGVtZW50ID0gKChFbGVtZW50KWlucHV0KS5nZXRQYXJlbnROb2RlKCk7Ci0vLyAgICAgIGlmIChpbnB1dEVxdWFscyhwYXJlbnRFbGVtZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmV0dXJuICJzaW1wbGVSZXN0cmljdCI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMocGFyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJldHVybiAic2ltcGxlUmVzdHJpY3QiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKHBhcmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmV0dXJuICJzaW1wbGVDb250ZW50IjsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgcmV0dXJuICJ4c2QiOwotLy8gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzMDlkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNERXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLS8vIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXI7Ci0vLyBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci0vLyBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5YU0RBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm92aWRlci5YU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLQotLy8KLS8vCi1wdWJsaWMgY2xhc3MgWFNERXh0ZW5zaW9uIGltcGxlbWVudHMgV1NETEVkaXRvckV4dGVuc2lvbgotewotICBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbCB4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5OwotICBYU0RBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgYWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotICAKLSAgcHVibGljIFhTREV4dGVuc2lvbigpCi0gIHsKLSAgICB4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5ID0gbmV3IFhTRE1vZGVsQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0gICAgYWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyID0gbmV3IFhTREFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcih4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb25UeXBlU3VwcG9ydGVkKGludCB0eXBlKQotICB7Ci0gICAgcmV0dXJuIAotICAgICAgICAgICAvL0NTIGNvbW1lbnQgdGhlc2Ugb3V0IHVudGlsIHRoZSBwb3J0IGlzIGNvbXBsZXRlCi0gICAgICAgICAgIHR5cGUgPT0gT1VUTElORV9UUkVFX0NPTlRFTlRfUFJPVklERVIgfHwgCi0gICAgICAgICAgIHR5cGUgPT0gT1VUTElORV9MQUJFTF9QUk9WSURFUiB8fAotICAgICAgICAgICB0eXBlID09IFBST1BFUlRZX1NPVVJDRV9QUk9WSURFUiB8fAotICAgICAgICAgICB0eXBlID09IFBST1BFUlRZX1NFQ1RJT05fREVTQ1JJUFRPUl9QUk9WSURFUiB8fAotICAgICAgICAgICB0eXBlID09IE1FTlVfQUNUSU9OX0NPTlRSSUJVVE9SIHx8Ci0gICAgICAgICAgIHR5cGUgPT0gREVUQUlMU19WSUVXRVJfUFJPVklERVIgfHwKLSAgICAgICAgICAgdHlwZSA9PSBFRElUX1BBUlRfRkFDVE9SWSB8fCAKLSAgICAgICAgICAgdHlwZSA9PSBUWVBFX1NZU1RFTV9QUk9WSURFUiB8fAotICAgICAgICAgICB0eXBlID09IE5PREVfUkVDT05DSUxFUiB8fAotICAgICAgICAgICB0eXBlID09IE5PREVfQVNTT0NJQVRJT05fUFJPVklERVIgfHwKLSAgICAgICAgICAgdHlwZSA9PSBNT0RFTF9RVUVSWV9DT05UUklCVVRPUjsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZShPYmplY3Qgb2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCB8fCAKLSAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50IHx8Ci0gICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeUFkYXB0ZXIgfHwKLSAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5KTsKLSAgICAgICAgICAgIC8vIHx8IG9iamVjdCBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlcik7Ci0gIH0gCi0KLSAgcHVibGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb25PYmplY3QoaW50IHR5cGUsIFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIE9VVExJTkVfVFJFRV9DT05URU5UX1BST1ZJREVSIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFhTRE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlcih4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KTsgCi0vLyAgICAgICAgcmVzdWx0ID0gbmV3IFhTRE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlcigpOwotICAgICAgICAvLyByZXN1bHQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoWFNERXh0ZW5zaW9uUGx1Z2luLmdldFhTRFNlbWFudGljSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBPVVRMSU5FX0xBQkVMX1BST1ZJREVSIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFhTRExhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKTsKLSAgICAgICAgLy8gcmVzdWx0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihYU0RFeHRlbnNpb25QbHVnaW4uZ2V0WFNEU2VtYW50aWNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIERFVEFJTFNfVklFV0VSX1BST1ZJREVSIDoKLSAgICAgIHsKLSAgICAgICAgLy8gcmVzdWx0ID0gbmV3IFhTRERldGFpbHNWaWV3ZXJQcm92aWRlcigpOwotICAgICAgICByZXN1bHQgPSBudWxsOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTUVOVV9BQ1RJT05fQ09OVFJJQlVUT1IgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNETWVudUFjdGlvbkNvbnRyaWJ1dG9yKHdzZGxFZGl0b3IpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgVFlQRV9TWVNURU1fUFJPVklERVIgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNEVHlwZVN5c3RlbVByb3ZpZGVyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgICAKLSAgICAgIGNhc2UgRURJVF9QQVJUX0ZBQ1RPUlkgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNERXh0ZW5zaW9uRWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOT0RFX1JFQ09OQ0lMRVIgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNETm9kZVJlY29uY2lsZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgCi0gICAgICBjYXNlIE5PREVfQVNTT0NJQVRJT05fUFJPVklERVIgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNETm9kZUFzc29jaWF0aW9uUHJvdmlkZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICAgIGNhc2UgTU9ERUxfUVVFUllfQ09OVFJJQlVUT1IgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNETW9kZWxRdWVyeUNvbnRyaWJ1dG9yKHdzZGxFZGl0b3IpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgUFJPUEVSVFlfU09VUkNFX1BST1ZJREVSOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNEUHJvcGVydHlTb3VyY2VQcm92aWRlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgUFJPUEVSVFlfU0VDVElPTl9ERVNDUklQVE9SX1BST1ZJREVSOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNEU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgWFNEX0RFTEVURV9BQ1RJT046Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBEZWxldGVBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RFeHRlbnNpb25FZGl0UGFydEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RFeHRlbnNpb25FZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNTBjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNERXh0ZW5zaW9uRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLmdyYXBoLmVkaXRwYXJ0cy5YU0RTY2hlbWFEcmlsbERvd25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5YU0RFZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREV4dGVuc2lvbkVkaXRQYXJ0RmFjdG9yeSBleHRlbmRzIFhTREVkaXRQYXJ0RmFjdG9yeQotewotICBwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgcGFyZW50LCBPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RTY2hlbWEgJiYgcGFyZW50LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgeyAgICAgICAgIAotICAgICAgZWRpdFBhcnQgPSBuZXcgWFNEU2NoZW1hRHJpbGxEb3duRWRpdFBhcnQoKTsKLSAgICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICAgIGVkaXRQYXJ0LnNldFBhcmVudChwYXJlbnQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZWRpdFBhcnQgPSBzdXBlci5jcmVhdGVFZGl0UGFydChwYXJlbnQsIG1vZGVsKTsKLSAgICB9Ci0gCi0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YjExMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotCi0vKioKLSAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgWFNETGFiZWxQcm92aWRlciBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9uZSBpbiBYU0RFZGl0b3IuCi0gKiBUaGlzIHByb3ZpZGVyIG9ubHkgbmVlZHMgdG8gaGFuZGxlIG5vZGVzIGluIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZS4KLSAqIE90aGVyIFhNTCBub2RlcyAoaW5jbHVkaW5nIGNvbW1lbnRzLCBQSXMgZXRjKSBnZXQgaGFuZGxlZCBieSB0aGUgJ21haW4nIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgWFNETGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLXsKLSAgWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSUxhYmVsUHJvdmlkZXJDbGFzcyA9IElMYWJlbFByb3ZpZGVyLmNsYXNzOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBYU0RMYWJlbFByb3ZpZGVyLgotICAgKi8KLSAgcHVibGljIFhTRExhYmVsUHJvdmlkZXIoWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5hZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgPSBhZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQotICAgKi8KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7Ci0gICAgICBlbGVtZW50ID0gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50KS5nZXRTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIHJldHVybiBhZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0gIH0KLSAgICAKLSAgLyoKLSAgICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIC8vIG92ZXJyaWRlIHRleHQgZm9yIHhzZCBzY2hlbWEKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICByZXR1cm4gKChYU0RTY2hlbWEpZWxlbWVudCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgCS8vIFdlIGRvbid0IGNhbGwgImFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpIiBiZWNhdXNlIGl0IHdpbGwgcmV0dXJuIGEgb2JqZWN0LnRvU3RyaW5nKCkgaWYKLSAgICAJLy8gdGhlcmUgaXMgbm8gbGFiZWxQcm92aWRlci4uLi4gIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGRpc3BsYXkgdGhpcyAnZ2FyYmFnZScgaW5mbyB0byB0aGUgdXNlci4gICAgCQotICAgIAlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5nZXRBZGFwdGVyRmFjdG9yeSgpOwotICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gKElMYWJlbFByb3ZpZGVyKWFkYXB0ZXJGYWN0b3J5LmFkYXB0KGVsZW1lbnQsIElMYWJlbFByb3ZpZGVyQ2xhc3MpOwotICAgICAgICBTdHJpbmcgdGV4dCA9ICIiOwotICAgICAgICBpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgIAl0ZXh0ID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0gIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA1MTI0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNETWVudUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguV1NETENvbXBvbmVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLmFjdGlvbnMuQWRkU2NoZW1hQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5hY3Rpb25zLkJhY2tBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNETWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuRE9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLlRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3ZpZGVyLkNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmVkaXRwYXJ0cy5BYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydDsKLQotcHVibGljIGNsYXNzIFhTRE1lbnVBY3Rpb25Db250cmlidXRvciBpbXBsZW1lbnRzIElNZW51QWN0aW9uQ29udHJpYnV0b3IKLXsKLSAgRWxlbWVudCBjdXJyRWxlbWVudDsKLSAgRG9jdW1lbnQgY3VyckRvY3VtZW50OwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotLy8gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgaVNlbGVjdGlvblByb3ZpZGVyOwotICBXU0RMRWRpdG9yIHdzZGxFZGl0b3I7Ci0KLSAgcHVibGljIFhTRE1lbnVBY3Rpb25Db250cmlidXRvcihXU0RMRWRpdG9yIHdzZGxFZGl0b3IpCi0gIHsKLSAgICB0aGlzLndzZGxFZGl0b3IgPSB3c2RsRWRpdG9yOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZU1lbnVBY3Rpb25zKElNZW51TWFuYWdlciBtYW5hZ2VyLCBOb2RlIG5vZGUsIE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RNZW51RXh0ZW5zaW9uTGlzdGVuZXIgeHNkTWVudUxpc3RlbmVyID0gbmV3IFhTRE1lbnVFeHRlbnNpb25MaXN0ZW5lcih3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgeHNkTWVudUxpc3RlbmVyLmNvbnRyaWJ1dGVNZW51QWN0aW9ucyhtYW5hZ2VyLCBub2RlLCBvYmplY3QpOwotICB9Ci0KLSAgY2xhc3MgWFNETWVudUV4dGVuc2lvbkxpc3RlbmVyIGV4dGVuZHMgWFNETWVudUxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgWFNETWVudUV4dGVuc2lvbkxpc3RlbmVyKElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikKLSAgICB7Ci0gICAgICBzdXBlcihzZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29udHJpYnV0ZU1lbnVBY3Rpb25zKElNZW51TWFuYWdlciBtYW5hZ2VyLCBOb2RlIG5vZGUsIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgdXBkYXRlWFNEU2NoZW1hKCk7Ci0gICAgICBBYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCBlZGl0UGFydCA9IChBYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCl3c2RsRWRpdG9yLmdldEdyYXBoVmlld2VyKCkuZ2V0Q29tcG9uZW50Vmlld2VyKCkuZ2V0Um9vdEVkaXRQYXJ0KCkuZ2V0Q29udGVudHMoKTsKLS8vICAgIGlTZWxlY3Rpb25Qcm92aWRlciA9ICgoV1NETENvbnRlbnRPdXRsaW5lUGFnZSkod3NkbEVkaXRvci5nZXRXU0RMVGV4dEVkaXRvcigpLmdldENvbnRlbnRPdXRsaW5lUGFnZSgpKSkuZ2V0VHJlZVZpZXdlcigpOwotICAgICAgRWRpdFBhcnQgZm9jdXNFZGl0UGFydCA9IHdzZGxFZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5nZXRDb21wb25lbnRWaWV3ZXIoKS5nZXRGb2N1c0VkaXRQYXJ0KCk7Ci0KLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIFdTRExHcm91cE9iamVjdCBncm91cCA9IChXU0RMR3JvdXBPYmplY3Qpb2JqZWN0OwotICAgICAgICBpZiAoZ3JvdXAuZ2V0VHlwZSgpID09IFdTRExHcm91cE9iamVjdC5UWVBFU19HUk9VUCkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gdHlwZXNFeGlzdCA9IGdyb3VwLmdldFBhcmVudCgpLmdldFR5cGVzKCkgIT0gbnVsbDsKLSAgICAgICAgICAKLSAgICAgICAgICBFbGVtZW50IHR5cGVzRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgaWYgKHR5cGVzRXhpc3QpCi0gICAgICAgICAgewotICAgICAgICAgICAgVHlwZXMgdHlwZXMgPSBncm91cC5nZXRQYXJlbnQoKS5nZXRFVHlwZXMoKTsKLSAgICAgICAgICAgIHR5cGVzRWxlbWVudCA9IHR5cGVzLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoZWRpdFBhcnQuZ2V0Vmlld2VyKCkgaW5zdGFuY2VvZiBXU0RMQ29tcG9uZW50Vmlld2VyKSB7Ci0gICAgICAgICAgICAgIFdTRExDb21wb25lbnRWaWV3ZXIgd3NkbENvbXBvbmVudFZpZXdlciA9IChXU0RMQ29tcG9uZW50Vmlld2VyKSBlZGl0UGFydC5nZXRWaWV3ZXIoKTsKLSAgICAgICAgICAgICAgZG9jdW1lbnQgPSB3c2RsQ29tcG9uZW50Vmlld2VyLmdldFdTRExFZGl0b3IoKS5nZXRYTUxEb2N1bWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgQWRkU2NoZW1hQWN0aW9uKGdyb3VwLmdldERlZmluaXRpb24oKSwgKEVsZW1lbnQpbm9kZSwgdHlwZXNFbGVtZW50LCBkb2N1bWVudCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAKLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFR5cGVzKQotICAgICAgewotICAgICAgICAvLyBJTWVudU1hbmFnZXIgbWVudSA9IG1hbmFnZXIuZmluZE1lbnVVc2luZ1BhdGgoImFkZGNoaWxkIik7Ci0KLSAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFR5cGVzIHR5cGVzID0gKFR5cGVzKW9iamVjdDsKLSAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgQWRkU2NoZW1hQWN0aW9uKHR5cGVzLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgKEVsZW1lbnQpbm9kZSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmICh4c2RTY2hlbWEgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgCi0gICAgICBBcnJheUxpc3QgYXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICBOb2RlIHJlbGF0aXZlTm9kZSA9IG51bGw7Ci0gICAgICAKLSAgICAgIEJhY2tBY3Rpb24gYmFja0FjdGlvbjsKLSAgICAgIAotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYSB8fCBmb2N1c0VkaXRQYXJ0IGluc3RhbmNlb2YgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCB8fCBvYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeSkKLSAgICAgIHsKLSAgICAgICAgYmFja0FjdGlvbiA9IG5ldyBCYWNrQWN0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JBQ0tfVE8iLCAiRGVmaW5pdGlvbiIpKTsKLSAgICAgICAgYmFja0FjdGlvbi5zZXREZWZpbml0aW9uKHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgYmFja0FjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihzZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgICAgIGJhY2tBY3Rpb24uc2V0Um9vdEVkaXRQYXJ0KGVkaXRQYXJ0KTsKLSAgICAgICAgYmFja0FjdGlvbi5zZXRHcmFwaFZpZXdlcih3c2RsRWRpdG9yLmdldEdyYXBoVmlld2VyKCkpOwotICAgICAgICBtYW5hZ2VyLmFkZChiYWNrQWN0aW9uKTsKLSAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBiYWNrQWN0aW9uID0gbmV3IEJhY2tBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9CQUNLX1RPX1NDSEVNQV9WSUVXIikpOwotICAgICAgICAvLyBiYWNrQWN0aW9uLnNldFhTRFNjaGVtYSgoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iamVjdCkuZ2V0U2NoZW1hKCkpOwotICAgICAgICBiYWNrQWN0aW9uLnNldFhTRFNjaGVtYSh4c2RTY2hlbWEpOwotICAgICAgICBiYWNrQWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLSAgICAgICAgYmFja0FjdGlvbi5zZXRSb290RWRpdFBhcnQoZWRpdFBhcnQpOwotICAgICAgICBiYWNrQWN0aW9uLnNldEdyYXBoVmlld2VyKHdzZGxFZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKSk7Ci0gICAgICAgIG1hbmFnZXIuYWRkKGJhY2tBY3Rpb24pOwotICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgfQotCi0gICAgICAvLyBDUzogSSdtIHJlbW92aW5nIHRoZSAnb2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudCcgY2FzZSBmcm9tIHRoaXMgdGVzdAotICAgICAgLy8gZm9yIG5vdyB0aGUgbWVudSBhY3Rpb25zIGFyZSBkcml2ZW4gZnJvbSAnbW9kZWwnIG9iamVjdHMKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCB8fCAob2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpKQotICAgICAgewotICAgICAgICBFbGVtZW50IHBhcmVudDsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmplY3QpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICB4c2RTY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iamVjdCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgcGFyZW50ID0gKEVsZW1lbnQpb2JqZWN0OyAKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IHNjaGVtYSA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudClvYmplY3Q7Ci0gICAgICAgICAgeHNkU2NoZW1hID0gc2NoZW1hLmdldFNjaGVtYSgpOwotICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgcGFyZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGN1cnJFbGVtZW50ID0gcGFyZW50OwotICAgICAgICBjdXJyRG9jdW1lbnQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAKLS8vICAgICAgICBpZiAoIShjdXJyRG9jdW1lbnQgaW5zdGFuY2VvZiBEb2N1bWVudEltcGwpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHJldHVybjsKLS8vICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhZGRDb250ZXh0SXRlbXMobWFuYWdlciwgY3VyckVsZW1lbnQsIG51bGwpOwotCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkgfHwKLSAgICAgICAgICAgCShvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWEgJiYgISh3c2RsRWRpdG9yLmdldEdyYXBoVmlld2VyKCkuZ2V0Q29tcG9uZW50Vmlld2VyKCkuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkpKSB7Ci0gICAgICAgICAgIAlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25zID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgIAlvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkRlbGV0ZVdTRExBbmRYU0RBY3Rpb24gZGVsZXRlV1NETEFuZFhTREFjdGlvbiA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkRlbGV0ZVdTRExBbmRYU0RBY3Rpb24oc2VsZWN0aW9ucy50b0xpc3QoKSwgY3VyckVsZW1lbnQsIHdzZGxFZGl0b3IpOwotICAgICAgICAgICAJZGVsZXRlV1NETEFuZFhTREFjdGlvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICAgCW1hbmFnZXIuYWRkKGRlbGV0ZVdTRExBbmRYU0RBY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeQotICAgICAgICAgICAgfHwgb2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKQotICAgICAgewotICAgICAgICBpbnQgZ3JvdXBUeXBlID0gLTE7Ci0KLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5KQotICAgICAgICB7Ci0gICAgICAgICAgQ2F0ZWdvcnkgY2cgPSAoQ2F0ZWdvcnkpb2JqZWN0OwotICAgICAgICAgIHhzZFNjaGVtYSA9IGNnLmdldFhTRFNjaGVtYSgpOwotICAgICAgICAgIGdyb3VwVHlwZSA9IGNnLmdldEdyb3VwVHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgIC8vIENhdGVnb3J5QWRhcHRlcgotICAgICAgICB7Ci0gICAgICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGNhdGVnb3J5ID0gKENhdGVnb3J5QWRhcHRlcilvYmplY3Q7Ci0gICAgICAgICAgZ3JvdXBUeXBlID0gY2F0ZWdvcnkuZ2V0R3JvdXBUeXBlKCk7Ci0gICAgICAgICAgeHNkU2NoZW1hID0gY2F0ZWdvcnkuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRWxlbWVudCBwYXJlbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgICBjdXJyRWxlbWVudCA9IHBhcmVudDsKLSAgICAgICAgY3VyckRvY3VtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgc3dpdGNoIChncm91cFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIENhdGVnb3J5LlRZUEVTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3R2xvYmFsVHlwZU5hbWUoIkNvbXBsZXhUeXBlIikpKTsKLSAgICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbilhY3Rpb24pLnNldElzR2xvYmFsKHRydWUpOwotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROZXdHbG9iYWxUeXBlTmFtZSgiU2ltcGxlVHlwZSIpKSk7Ci0gICAgICAgICAgICBBY3Rpb24gYWN0aW9uMiA9IGFkZENyZWF0ZVNpbXBsZVR5cGVBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NJTVBMRV9UWVBFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbilhY3Rpb24yKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIENhdGVnb3J5LkVMRU1FTlRTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3R2xvYmFsTmFtZShYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgIkdsb2JhbEVsZW1lbnQiKSkpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldEJ1aWx0SW5TdHJpbmdRTmFtZSgpKSk7Ci0gICAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfRUxFTUVOVCIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgICAoKENyZWF0ZUVsZW1lbnRBY3Rpb24pYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIENhdGVnb3J5LkdST1VQUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0dsb2JhbE5hbWUoWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCAiR3JvdXAiKSkpOwotICAgICAgICAgICAgQ3JlYXRlR3JvdXBBY3Rpb24gZ3JvdXBBY3Rpb24gPSBhZGRDcmVhdGVHcm91cEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0dST1VQIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAgICAgIGdyb3VwQWN0aW9uLnNldElzR2xvYmFsKHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgQ2F0ZWdvcnkuQVRUUklCVVRFUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0dsb2JhbE5hbWUoWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgIkdsb2JhbEF0dHJpYnV0ZSIpKSk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0QnVpbHRJblN0cmluZ1FOYW1lKCkpKTsKLSAgICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0dMT0JBTF9BVFRSSUJVVEUiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICAgKChDcmVhdGVFbGVtZW50QWN0aW9uKWFjdGlvbikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBDYXRlZ29yeS5BVFRSSUJVVEVfR1JPVVBTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3R2xvYmFsTmFtZShYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsICJBdHRyaWJ1dGVHcm91cCIpKSk7Ci0gICAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUCIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgICAoKENyZWF0ZUVsZW1lbnRBY3Rpb24pYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOyAKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBDYXRlZ29yeS5OT1RBVElPTlM6Ci0gICAgICAgICAgewotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0dsb2JhbE5hbWUoWFNEQ29uc3RhbnRzLk5PVEFUSU9OX0VMRU1FTlRfVEFHLCAiTm90YXRpb24iKSkpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuUFVCTElDX0FUVFJJQlVURSwgIiIpKTsKLSAgICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5OT1RBVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfTk9UQVRJT04iKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICAgKChDcmVhdGVFbGVtZW50QWN0aW9uKWFjdGlvbikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBDYXRlZ29yeS5ESVJFQ1RJVkVTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gYiA9IHRydWU7Ci0gICAgICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICBOb2RlIGVmZmVjdGl2ZVJlbGF0aXZlTm9kZSA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKSAmJiBiOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KWNoaWxkLCBYU0RDb25zdGFudHMuSU5DTFVERV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCljaGlsZCwgWFNEQ29uc3RhbnRzLklNUE9SVF9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCljaGlsZCwgWFNEQ29uc3RhbnRzLlJFREVGSU5FX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKChFbGVtZW50KWNoaWxkLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJlbGF0aXZlTm9kZSA9IGNoaWxkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVsYXRpdmVOb2RlID0gZWZmZWN0aXZlUmVsYXRpdmVOb2RlICE9IG51bGwgPyBlZmZlY3RpdmVSZWxhdGl2ZU5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA6IG51bGw7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuU0NIRU1BTE9DQVRJT05fQVRUUklCVVRFLCAiIikpOwotCi0gICAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5JTkNMVURFX0VMRU1FTlRfVEFHLFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0lOQ0xVREUiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuSU1QT1JUX0VMRU1FTlRfVEFHLFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0lNUE9SVCIpLCBudWxsLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5SRURFRklORV9FTEVNRU5UX1RBRyxYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9SRURFRklORSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAKLQotICAgIHByb3RlY3RlZCBJRmlsZSBnZXRGaWxlUmVzb3VyY2UoKQotICAgIHsKLSAgLy8vLy8gV1NETCBUT0RPCi0gIC8vICAgIGlmIChnZXRFZGl0b3IoKSAhPSBudWxsKQotICAvLyAgICAgIHJldHVybiBnZXRFZGl0b3IoKS5nZXRGaWxlUmVzb3VyY2UoKTsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotLy8gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3RlZEVsZW1lbnQoKQotLy8gICAgewotLy8gICAgICByZXR1cm4gY3VyckVsZW1lbnQ7Ci0vLyAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgWFNEU2NoZW1hIGdldFhTRFNjaGVtYSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgICB9Ci0gIAotICAgIHByb3RlY3RlZCBJRE9NTW9kZWwgZ2V0WE1MTW9kZWwoKQotICAgIHsKLSAgICAgIGlmIChjdXJyRWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gY3VyckVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRG9jdW1lbnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgRG9jdW1lbnRJbXBsIHhtbERvYyA9IChEb2N1bWVudEltcGwpIGN1cnJFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICByZXR1cm4geG1sRG9jLmdldE1vZGVsKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTMzMGI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNEQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi0KLXB1YmxpYyBjbGFzcyBYU0RNb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBYU0RDb250ZW50UHJvdmlkZXIKLXsgIAotICBwdWJsaWMgWFNETW9kZWxBZGFwdGVyQ29udGVudFByb3ZpZGVyKFhTRE1vZGVsQWRhcHRlckZhY3RvcnlJbXBsIHhzZE1vZGVsQWRhcHRlckZhY3RvcnkpCi0gIHsKLSAgICBzdXBlcih4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50T2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG51bGw7Ci0KLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wID0gbnVsbDsKLSAgICBpZiAocGFyZW50T2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpcGFyZW50T2JqZWN0OwotICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHhzZENvbXAgPSB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC5nZXRTY2hlbWEoKTsKLSAgICAgIHJldHVybiBzdXBlci5nZXRDaGlsZHJlbih4c2RDb21wKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudE9iamVjdCk7ICAgIAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNb2RlbFF1ZXJ5Q29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNb2RlbFF1ZXJ5Q29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4MWRkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNETW9kZWxRdWVyeUNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZDsgICAgICAKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSU1vZGVsUXVlcnlDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuQWJzdHJhY3RYU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuQWJzdHJhY3RYU0RNb2RlbFF1ZXJ5Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RNb2RlbFF1ZXJ5Q29udHJpYnV0b3IgZXh0ZW5kcyBBYnN0cmFjdFhTRE1vZGVsUXVlcnlDb250cmlidXRvciBpbXBsZW1lbnRzIElNb2RlbFF1ZXJ5Q29udHJpYnV0b3IKLXsgCi0gIHByb3RlY3RlZCBXU0RMRWRpdG9yIHdzZGxFZGl0b3I7Ci0KLSAgcHVibGljIFhTRE1vZGVsUXVlcnlDb250cmlidXRvcihXU0RMRWRpdG9yIHdzZGxFZGl0b3IpCi0gIHsKLSAgICB0aGlzLndzZGxFZGl0b3IgPSB3c2RsRWRpdG9yOwotICB9Ci0gIAotICBwdWJsaWMgQWJzdHJhY3RYU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uIGNyZWF0ZVhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24oTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICB7Ci0gICAgcmV0dXJuIG5ldyBYU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uKG1vZGVsUXVlcnkpOyAKLSAgfQotCi0gIGNsYXNzIFhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24gZXh0ZW5kcyBBYnN0cmFjdFhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24KLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIFhTRERhdGFUeXBlVmFsdWVFeHRlbnNpb24oTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICAgIHsKLSAgICAgIHN1cGVyKG1vZGVsUXVlcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICAgIHsKLSAgICAgIHJldHVybiAiV1NETC1YU0REYXRhVHlwZVZhbHVlRXh0ZW5zaW9uIjsKLSAgICB9Ci0gICAgIAotICAgIHByb3RlY3RlZCBYU0RTY2hlbWEgZ2V0RW5jbG9zaW5nWFNEU2NoZW1hKEVsZW1lbnQgZWxlbWVudCkKLSAgICB7ICAgICAgICAKLSAgICAgIFhTRFNjaGVtYSByZXN1bHQgPSBudWxsOwotICAgICAgT2JqZWN0IG8gPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCksIGVsZW1lbnQpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClvKS5nZXRTY2hlbWEoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgIAotCi0JICBwcm90ZWN0ZWQgVHlwZXNIZWxwZXIgY3JlYXRlVHlwZXNIZWxwZXIoWFNEU2NoZW1hIHNjaGVtYSkKLQkgIHsgCi0JCSAgcmV0dXJuIG5ldyBUeXBlc0hlbHBlcihzY2hlbWEpCi0JCSAgewotCQkJICBwcm90ZWN0ZWQgTGlzdCBnZXRQcmVmaXhlc0Zvck5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKQotCQkJICB7Ci0JCQkgIAlMaXN0IGxpc3QgPSBzdXBlci5nZXRQcmVmaXhlc0Zvck5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQkJICAJTWFwIG1hcCA9IHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpLmdldE5hbWVzcGFjZXMoKTsKLQkJCSAgCWZvciAoSXRlcmF0b3IgaSA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQkgIAl7Ci0JCQkgIAkJU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpaS5uZXh0KCk7Ci0JCQkgIAkJU3RyaW5nIG5zID0gKFN0cmluZyltYXAuZ2V0KHByZWZpeCk7Ci0JCQkgICAJCWlmIChucyAhPSBudWxsICYmIG5zLmVxdWFscyhuYW1lc3BhY2UpKQotCQkJCSAgCXsJCQkJCQotCQkJCSAgCSAgaWYgKCFsaXN0LmNvbnRhaW5zKHByZWZpeCkpCi0JCQkJICAJICB7Ci0JCQkJICAJCWxpc3QuYWRkKHByZWZpeCk7Ci0JCQkJICAJICB9Ci0JCQkJICAJfSAgCi0JICAJCQl9CQotCSAgCQkJcmV0dXJuIGxpc3Q7Ci0JICAJCX0JCQkJCi0JICAJfTsJCQotICAJfSAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNETm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWRlOTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklOb2RlQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLm1vZGVsLkNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuQ2F0ZWdvcnlBZGFwdGVyOwotCi1jbGFzcyBYU0ROb2RlQXNzb2NpYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElOb2RlQXNzb2NpYXRpb25Qcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoT2JqZWN0IHBhcmVudE1vZGVsT2JqZWN0LCBFbGVtZW50W10gZWxlbWVudENoYWluLCBpbnQgc3RhcnQsIGludFtdIGVuZCkKLSAgeyAgIAotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChwYXJlbnRNb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KXBhcmVudE1vZGVsT2JqZWN0OwotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGV4dGVuc2liaWxpdHlFbGVtZW50LmdldFNjaGVtYSgpOwotICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAKLSAgICAgICAgRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gZWxlbWVudENoYWluW2VsZW1lbnRDaGFpbi5sZW5ndGggLSAxXTsKLSAgICAgICAgcmVzdWx0ID0gc2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQodGFyZ2V0RWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudE1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQ2F0ZWdvcnlBZGFwdGVyKXBhcmVudE1vZGVsT2JqZWN0KS5nZXRYU0RTY2hlbWEoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50TW9kZWxPYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKENhdGVnb3J5KXBhcmVudE1vZGVsT2JqZWN0KS5nZXRYU0RTY2hlbWEoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Tm9kZShPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsgICAgICAgIAotICAgIE5vZGUgbm9kZSA9IG51bGw7Ci0gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCltb2RlbE9iamVjdDsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBleHRlbnNpYmlsaXR5RWxlbWVudC5nZXRTY2hlbWEoKTsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IHNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgCi0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBub2RlID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCltb2RlbE9iamVjdCkuZ2V0RWxlbWVudCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICB7Ci0gICAgICBub2RlID0gKChDYXRlZ29yeUFkYXB0ZXIpbW9kZWxPYmplY3QpLmdldFhTRFNjaGVtYSgpLmdldEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeSkKLSAgICB7Ci0gICAgICBub2RlID0gKChDYXRlZ29yeSltb2RlbE9iamVjdCkuZ2V0WFNEU2NoZW1hKCkuZ2V0RWxlbWVudCgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbm9kZTsKLSAgfSAgICAgIAotfSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNETm9kZVJlY29uY2lsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlUmVjb25jaWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjNhNWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlUmVjb25jaWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklOb2RlUmVjb25jaWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgWFNETm9kZVJlY29uY2lsZXIgaW1wbGVtZW50cyBJTm9kZVJlY29uY2lsZXIKLXsgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE9iamVjdCBtb2RlbE9iamVjdCwgRWxlbWVudCBlbGVtZW50LCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIGNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCltb2RlbE9iamVjdDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KW1vZGVsT2JqZWN0OwotICAgICAgY29tcG9uZW50ID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgfSAgIAotCi0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKQotICAgICAgewotICAgICAgICBjYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFOgotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgY29tcG9uZW50LmVsZW1lbnRBdHRyaWJ1dGVzQ2hhbmdlZChlbGVtZW50KTsgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEOgotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgY29tcG9uZW50LmVsZW1lbnRDb250ZW50c0NoYW5nZWQoZWxlbWVudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRDoKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50Q2hhbmdlZChlbGVtZW50KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gIH0KLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFByb3BlcnR5U291cmNlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZmYzNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFByb3BlcnR5U291cmNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuQW55QXR0cmlidXRlUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkFueUVsZW1lbnRQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuQXBwSW5mb1Byb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5BdHRyaWJ1dGVHcm91cFJlZlByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5BdHRyaWJ1dGVQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuQmFzZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5Db21wbGV4VHlwZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5Eb2N1bWVudGF0aW9uUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkVsZW1lbnRQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuRW51bWVyYXRpb25Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuR3JvdXBSZWZQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuSW1wb3J0UHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkluY2x1ZGVQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuS2V5cmVmUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLk1vZGVsR3JvdXBQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuTmFtZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5Ob3RhdGlvblByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5QYXR0ZXJuUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlNjaGVtYVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5TaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlNpbXBsZVJlc3RyaWN0UHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlNpbXBsZVR5cGVMaXN0UHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlNpbXBsZVR5cGVQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuU2ltcGxlVHlwZVVuaW9uUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlhQYXRoUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWFNEUHJvcGVydHlTb3VyY2VQcm92aWRlciBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyI2dldFByb3BlcnR5U291cmNlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgSVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpCi0gIHsKLS8vIFVzaW5nIFhTRCdzIGl0ZW0gcHJvdmlkZXJzCi0vLyAgICBYU0RJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFhTREV4dGVuc2lvblBsdWdpbi5nZXRYU0RJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotLy8gICAKLS8vICAgIElJdGVtUHJvcGVydHlTb3VyY2UgaXRlbVByb3BlcnR5U291cmNlID0KLS8vICAgICAgKElJdGVtUHJvcGVydHlTb3VyY2UpCi0vLyAgICAgICAgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QgJiYgKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkgPT0gbnVsbCA/Ci0vLyAgICAgICAgICBudWxsIDoKLS8vICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iamVjdCwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcykpOwotLy8gICAgcmV0dXJuIAotLy8gICAgaXRlbVByb3BlcnR5U291cmNlICE9IG51bGwgPyAgY3JlYXRlUHJvcGVydHlTb3VyY2Uob2JqZWN0LCBpdGVtUHJvcGVydHlTb3VyY2UpIDogbnVsbDsKLSAgICAKLSAgICBpZiAob2JqZWN0ID09IG51bGwpIHJldHVybiBudWxsOwotICAgIAotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7Ci0gICAgICBvYmplY3QgPSAoKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KW9iamVjdCkuZ2V0U2NoZW1hKCk7Ci0gICAgfQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBCYXNlUHJvcGVydHlTb3VyY2UgYnBzID0gKEJhc2VQcm9wZXJ0eVNvdXJjZSlnZXRYU0RQcm9wZXJ0eVNvdXJjZShvYmplY3QpOwotICAgICAgRWxlbWVudCBpbnB1dCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0gICAgICBicHMuc2V0SW5wdXQoaW5wdXQpOwotICAgICAgcmV0dXJuIGJwczsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSVByb3BlcnR5U291cmNlIGNyZWF0ZVByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QsIElJdGVtUHJvcGVydHlTb3VyY2UgaXRlbVByb3BlcnR5U291cmNlKQotICB7Ci0gICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVNvdXJjZShvYmplY3QsIGl0ZW1Qcm9wZXJ0eVNvdXJjZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlucHV0RXF1YWxzKE9iamVjdCBpbnB1dCwgU3RyaW5nIHRhZ25hbWUsIGJvb2xlYW4gaXNSZWYpCi0gIHsKLSAgICByZXR1cm4gWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGlucHV0LCB0YWduYW1lLCBpc1JlZik7Ci0gIH0KLQotICBib29sZWFuIHNob3dQYXJlbnQgPSBmYWxzZTsKLSAgCi0gIC8vIFRPRE86IFdlIHNob3VsZCB1c2UgYWRhcHRlcnMgdG8gZG8gdGhpcy4gIERvIGFzIHdlIGNvbXBsZXRlICdtb2RlbCctYmFzZWQgcG9ydAotICBwdWJsaWMgSVByb3BlcnR5U291cmNlIGdldFhTRFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmplY3QpLmdldFNjaGVtYSgpOwotICAgIEVsZW1lbnQgaW5wdXQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iamVjdCkuZ2V0RWxlbWVudCgpOwotCi0gICAgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgRWxlbWVudFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBHcm91cFJlZlByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgICBpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgIGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBNb2RlbEdyb3VwUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCB0cnVlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZUdyb3VwUmVmUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgTmFtZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlR3JvdXBSZWZQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLk5PVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBOb3RhdGlvblByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlVHlwZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IE5hbWVQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCB0cnVlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyb3VwUmVmUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNjaGVtYVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IENvbXBsZXhUeXBlUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5ET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudGF0aW9uUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BUFBJTkZPX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBBcHBJbmZvUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBFbGVtZW50IHBhcmVudCA9IChFbGVtZW50KWlucHV0OwotICAgICAgICBYU0RET01IZWxwZXIgeHNkRE9NSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgICBFbGVtZW50IGRlcml2ZWRCeU5vZGUgPSB4c2RET01IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudChwYXJlbnQpOwotICAgICAgICBpZiAoZGVyaXZlZEJ5Tm9kZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlucHV0RXF1YWxzKGRlcml2ZWRCeU5vZGUsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpIHx8IAotICAgICAgICAgICAgICBpbnB1dEVxdWFscyhkZXJpdmVkQnlOb2RlLCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudClpbnB1dDsKLSAgICAgICAgWFNERE9NSGVscGVyIHhzZERPTUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgICAgRWxlbWVudCBkZXJpdmVkQnlOb2RlID0geHNkRE9NSGVscGVyLmdldERlcml2ZWRCeUVsZW1lbnQocGFyZW50KTsKLSAgICAgICAgaWYgKGRlcml2ZWRCeU5vZGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlQ29udGVudFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5JTkNMVURFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotLy8gICAgICBpZiAoZWRpdG9yIGluc3RhbmNlb2YgWFNERWRpdG9yKQotLy8gICAgICB7Ci0vLyAgICAgICAgSUZpbGUgaW5wdXRGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KWVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0gICAgICAgIElGaWxlIGlucHV0RmlsZSA9IG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgSW5jbHVkZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSwgaW5wdXRGaWxlKTsKLS8vICAgICAgfQotLy8gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5JTVBPUlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0vLyAgICAgIGlmIChlZGl0b3IgaW5zdGFuY2VvZiBYU0RFZGl0b3IpCi0vLyAgICAgIHsKLS8vICAgICAgICBJRmlsZSBpbnB1dEZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9yLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLSAgICAgIElGaWxlIGlucHV0RmlsZSA9IG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgSW1wb3J0UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hLCBpbnB1dEZpbGUpOwotLy8gICAgICB9Ci0vLyAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlJFREVGSU5FX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotLy8gICAgICBpZiAoZWRpdG9yIGluc3RhbmNlb2YgWFNERWRpdG9yKQotLy8gICAgICAgewotLy8gICAgICAgIElGaWxlIGlucHV0RmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCllZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotICAgICAgSUZpbGUgaW5wdXRGaWxlID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ldyBJbmNsdWRlUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hLCBpbnB1dEZpbGUpOwotLy8gICAgICB9Ci0vLyAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkxJU1RfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVR5cGVMaXN0UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlVHlwZVVuaW9uUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBjcmVhdGVSZXN0cmljdFdpbmRvdyhpbnB1dCwgeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlzRmFjZXQoaW5wdXQpKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBwYXJlbnQgPSAoKEVsZW1lbnQpaW5wdXQpLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKGlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gY3JlYXRlUmVzdHJpY3RXaW5kb3coaW5wdXQsIHhzZFNjaGVtYSk7Ci0gICAgICAgIH0gCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBOb2RlIHBhcmVudCA9ICgoRWxlbWVudClpbnB1dCkuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAoaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuQ09NUExFWENPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKQotICAgICAgICAgICAgfHwgaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgICB7Ci0gICAgICAgICAgc2hvd1BhcmVudCA9IHRydWU7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlBBVFRFUk5fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFBhdHRlcm5Qcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkVOVU1FUkFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBFbnVtZXJhdGlvblByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQU5ZX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBBbnlFbGVtZW50UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEFueUF0dHJpYnV0ZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuVU5JUVVFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBOYW1lUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5LRVlSRUZfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEtleXJlZlByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuU0VMRUNUT1JfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFhQYXRoUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5GSUVMRF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgWFBhdGhQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLktFWV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgTmFtZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJUHJvcGVydHlTb3VyY2UgY3JlYXRlUmVzdHJpY3RXaW5kb3coT2JqZWN0IGlucHV0LCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgLy8gc3BlY2lhbCBjYXNlIHdoZXJlIFNpbXBsZVR5cGUgcmVzdHJpY3Rpb24gaXMgZGlmZmVyZW50IHRoYW4gU2ltcGxlQ29udGVudCByZXN0cmljdGlvbgotCi0gICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIE5vZGUgcGFyZW50ID0gKChFbGVtZW50KWlucHV0KS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICBpZiAoaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVJlc3RyaWN0UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVSZXN0cmljdFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBzaG93UGFyZW50ID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNWY1YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyIGltcGxlbWVudHMgSVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIKLXsKLSAgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uWFNEU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlciBkZXNjcmlwdG9yOwotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgWFNEU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGRlc2NyaXB0b3IgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uWFNEU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlciNnZXRTZWN0aW9uRGVzY3JpcHRvcnMoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uRGVzY3JpcHRvcltdIGdldFNlY3Rpb25EZXNjcmlwdG9ycygpCi0gIHsKLSAgICByZXR1cm4gZGVzY3JpcHRvci5nZXRTZWN0aW9uRGVzY3JpcHRvcnMoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFRlbXBEZXRhaWxzVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNEVGVtcERldGFpbHNWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwMWVmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNEVGVtcERldGFpbHNWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy5CYXNlVmlld2VyOwotICAgICAgIAotCi1wdWJsaWMgY2xhc3MgWFNEVGVtcERldGFpbHNWaWV3ZXIgZXh0ZW5kcyBCYXNlVmlld2VyCi17ICAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29udHJvbDsKLQotICBwdWJsaWMgWFNEVGVtcERldGFpbHNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAKLSAgICBzdXBlcihudWxsKTsKLSAgICBjcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gIH0KLSAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29udHJvbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxLCB0cnVlKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVGbGF0UGFnZUhlYWRlcihjb250cm9sLCAiWFNEVmlld2VyIik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RUeXBlU3lzdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RUeXBlU3lzdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyODI1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNEVHlwZVN5c3RlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREltcG9ydEltcGw7Ci0KLS8vCi0vLwotcHVibGljIGNsYXNzIFhTRFR5cGVTeXN0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUeXBlU3lzdGVtUHJvdmlkZXIKLXsKLSAgICBwdWJsaWMgTGlzdCBnZXRQcmVmaXhlcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lc3BhY2UpCi0gICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE1hcCBtYXAgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHRoZU5hbWVzcGFjZSA9IChTdHJpbmcpIG1hcC5nZXQocHJlZml4KTsKLSAgICAgICAgICAgIGlmICh0aGVOYW1lc3BhY2UgIT0gbnVsbCAmJiB0aGVOYW1lc3BhY2UuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQocHJlZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRQcmVmaXhlZE5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0UHJlZml4ZXMoZGVmaW5pdGlvbiwgbmFtZXNwYWNlKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOwotICAgICAgICAgICAgbGlzdC5hZGQobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkTmFtZWRDb21wb25lbnRzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgTGlzdCBsaXN0LCBMaXN0IG5hbWVkQ29tcG9uZW50cykKLSAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVkQ29tcG9uZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBsaXN0LmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKGRlZmluaXRpb24sIGNvbXBvbmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgY29tcG9uZW50LmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdFdTSVN0eWxlSW1wb3J0cyhYU0RTY2hlbWEgeHNkU2NoZW1hKQotICAgIHsKLSAgICAgICAgaWYgKHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0SW1wbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhTREltcG9ydEltcGwgeHNkSW1wb3J0ID0gKFhTREltcG9ydEltcGwpIGNvbnRlbnQ7Ci0JCQkJCVhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKXhzZEltcG9ydC5nZXRSZXNvbHZlZFNjaGVtYSgpOwkJCQkJCi0JCQkJCWlmIChzY2hlbWEgPT0gbnVsbCkKLQkJCQkJewotCQkJCQkJc2NoZW1hID0geHNkSW1wb3J0LmltcG9ydFNjaGVtYSgpOwotCQkJCQl9ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVR5cGVOYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCB0eXBlTmFtZUNhdGVnb3J5KQotICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGVOYW1lQ2F0ZWdvcnkgPT0gSVR5cGVTeXN0ZW1Qcm92aWRlci5CVUlMVF9JTl9UWVBFKSB7Ci0gICAgICAgIAlsaXN0ID0gZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoZGVmaW5pdGlvbik7ICAgICAgICAJCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgIAlUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgICAgIAlpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgICAgCXsKLSAgICAgICAgCQlmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAJCXsKLSAgICAgICAgCQkJT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgCQkJaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgCQkJewotICAgICAgICAJCQkJWFNEU2NoZW1hIHNjaGVtYSA9ICgoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIG8pLmdldFNjaGVtYSgpOwotICAgICAgICAJCQkJaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICAJCQkJewotICAgICAgICAJCQkJCWluaXRXU0lTdHlsZUltcG9ydHMoc2NoZW1hKTsKLSAgICAgICAgCQkJCQlhZGROYW1lZENvbXBvbmVudHMoZGVmaW5pdGlvbiwgbGlzdCwgc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpKTsKLSAgICAgICAgCQkJCX0KLSAgICAgICAgCQkJfQotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgCi0gICAgICAgIAlmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAJewotICAgICAgICAJCUltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KSBpLm5leHQoKTsKLSAgICAgICAgCQlYU0RTY2hlbWEgc2NoZW1hID0gdGhlSW1wb3J0LmdldEVTY2hlbWEoKTsKLSAgICAgICAgCQlpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgIAkJewotICAgICAgICAJCQlhZGROYW1lZENvbXBvbmVudHMoZGVmaW5pdGlvbiwgbGlzdCwgc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIAlsaXN0LmFkZEFsbChnZXRCdWlsdEluVHlwZU5hbWVzTGlzdChkZWZpbml0aW9uKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCXJldHVybiBsaXN0OyAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVR5cGVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSwgaW50IHR5cGVOYW1lQ2F0ZWdvcnkpCi0gICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIExpc3Qga2VlcFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciB0eXBlSXRlcmF0b3IgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgLy8gRmlsdGVyIG91dCB1bndhbnRlZCBUeXBlcwotICAgICAgICBpZiAodHlwZU5hbWVDYXRlZ29yeSA9PSBJVHlwZVN5c3RlbVByb3ZpZGVyLlVTRVJfREVGSU5FRF9DT01QTEVYX1RZUEUpIHsKLSAgICAgICAgCXdoaWxlICh0eXBlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAkJT2JqZWN0IHR5cGUgPSB0eXBlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAJCWlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgIAkJCWtlZXBUeXBlcy5hZGQodHlwZSk7Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lQ2F0ZWdvcnkgPT0gSVR5cGVTeXN0ZW1Qcm92aWRlci5VU0VSX0RFRklORURfU0lNUExFX1RZUEUpIHsKLSAgICAgICAgCXdoaWxlICh0eXBlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAkJT2JqZWN0IHR5cGUgPSB0eXBlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAJCWlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgCQkJa2VlcFR5cGVzLmFkZCh0eXBlKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vYWRkTmFtZWRDb21wb25lbnRzKGRlZmluaXRpb24sIGxpc3QsIGtlZXBUeXBlcyk7ICAgICAgICAKLSAgICAgICAgLy9yZXR1cm4gbGlzdDsKLSAgICAgICAgcmV0dXJuIGtlZXBUeXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgIHsKLSAgICAgICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdCBwcmVmaXhlcyA9IGdldFByZWZpeGVzKGRlZmluaXRpb24sIFdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcHJlZml4ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFhTRERPTUhlbHBlci5kYXRhVHlwZS5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBYU0RET01IZWxwZXIuZGF0YVR5cGVbal1bMF07Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOwotICAgICAgICAgICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVtczsKLSAgICB9Ci0gICAgcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlRWxlbWVudE5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgVHlwZXMgdHlwZXMgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpOwotICAgICAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotCQkJCQkJaW5pdFdTSVN0eWxlSW1wb3J0cyhzY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkTmFtZWRDb21wb25lbnRzKGRlZmluaXRpb24sIGxpc3QsIHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBJbXBvcnQgdGhlSW1wb3J0ID0gKEltcG9ydCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gdGhlSW1wb3J0LmdldEVTY2hlbWEoKTsKLSAgICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGROYW1lZENvbXBvbmVudHMoZGVmaW5pdGlvbiwgbGlzdCwgc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotICAgIHB1YmxpYyBpbnQgZ2V0Q2F0ZWdvcnlGb3JUeXBlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB0eXBlTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvYWN0aW9ucy9BZGRTY2hlbWFBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9hY3Rpb25zL0FkZFNjaGVtYUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDM3YjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9hY3Rpb25zL0FkZFNjaGVtYUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2QuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRTY2hlbWFBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVUeXBlc0VsZW1lbnQgPSBmYWxzZTsKLQotICBwdWJsaWMgQWRkU2NoZW1hQWN0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCkKLSAgewotICAgIHRoaXMoZGVmaW5pdGlvbiwgZGVmaW5pdGlvbkVsZW1lbnQsIGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBBZGRTY2hlbWFBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50LCBib29sZWFuIGNyZWF0ZVR5cGVzRWxlbWVudCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfU0NIRU1BIiksICJpY29ucy94c2Rfb2JqLmdpZiIsIGRlZmluaXRpb25FbGVtZW50LCAieHNkOnNjaGVtYSIpOyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jcmVhdGVUeXBlc0VsZW1lbnQgPSBjcmVhdGVUeXBlc0VsZW1lbnQ7Ci0gICAgdGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsgICAgCi0gIH0KLQotICBwdWJsaWMgQWRkU2NoZW1hQWN0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCwgRWxlbWVudCB0eXBlc0VsZW1lbnQpCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NDSEVNQSIpLCAiaWNvbnMveHNkX29iai5naWYiLCBkZWZpbml0aW9uRWxlbWVudCwgInhzZDpzY2hlbWEiKTsgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmICh0eXBlc0VsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYXJlbnROb2RlID0gIHR5cGVzRWxlbWVudDsKLSAgICAgIHRoaXMuY3JlYXRlVHlwZXNFbGVtZW50ID0gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aGlzLmNyZWF0ZVR5cGVzRWxlbWVudCA9IHRydWU7ICAgICAgCi0gICAgfQotICAgIHRhcmdldE5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7ICAgIAotICB9Ci0KLSAgcHVibGljIEFkZFNjaGVtYUFjdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQsIEVsZW1lbnQgdHlwZXNFbGVtZW50LCBEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAJdGhpcyhkZWZpbml0aW9uLCBkZWZpbml0aW9uRWxlbWVudCwgdHlwZXNFbGVtZW50KTsKLSAgCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gIAl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3dEaWFsb2coKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOnhzZCIsIFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoImVsZW1lbnRGb3JtRGVmYXVsdCIsICJxdWFsaWZpZWQiKTsKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgCWJlZ2luUmVjb3JkaW5nKCk7Ci0gIAlpZiAocGFyZW50Tm9kZSA9PSBudWxsIHx8IChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAwKSkgewotICAJCWNyZWF0ZURlZmluaXRpb25TdHViKCk7Ci0gIAkJcHJlZml4ID0gbnVsbDsKLSAgCQl0YXJnZXROYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAJfQotICAJCi0gICAgaWYgKGNyZWF0ZVR5cGVzRWxlbWVudCkKLSAgICB7Ci0gICAgICBBZGRFbGVtZW50QWN0aW9uIGFkZFR5cGVzQWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24oIiIsICJpY29ucy94c2Rfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHBhcmVudE5vZGUuZ2V0UHJlZml4KCksICJ0eXBlcyIpOwotICAgICAgYWRkVHlwZXNBY3Rpb24uc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQodHJ1ZSk7Ci0gICAgICBhZGRUeXBlc0FjdGlvbi5ydW4oKTsKLSAgICAgIHBhcmVudE5vZGUgPSAgYWRkVHlwZXNBY3Rpb24uZ2V0TmV3RWxlbWVudCgpOwotICAgIH0gCi0gICAgc3VwZXIucnVuKCk7Ci0gICAgZW5kUmVjb3JkaW5nKCk7Ci0gIH0gICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvQmFja0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvQmFja0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTJmNDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9hY3Rpb25zL0JhY2tBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguV1NETEdyYXBoVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmVkaXRwYXJ0cy5BYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydDsKLQotcHVibGljIGNsYXNzIEJhY2tBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIFdTRExHcmFwaFZpZXdlciBncmFwaFZpZXdlcjsKLSAgCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBCYWNrQWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRleHQKLSAgICovCi0gIHB1YmxpYyBCYWNrQWN0aW9uKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRleHQKLSAgICogQHBhcmFtIGltYWdlCi0gICAqLwotICBwdWJsaWMgQmFja0FjdGlvbihTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKQotICB7Ci0gICAgc3VwZXIodGV4dCwgaW1hZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqIEBwYXJhbSBzdHlsZQotICAgKi8KLSAgcHVibGljIEJhY2tBY3Rpb24oU3RyaW5nIHRleHQsIGludCBzdHlsZSkKLSAgewotICAgIHN1cGVyKHRleHQsIHN0eWxlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblByb3ZpZGVyKElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikKLSAgewotICAgIHRoaXMuc2VsZWN0aW9uUHJvdmlkZXIgPSBzZWxlY3Rpb25Qcm92aWRlcjsKLSAgfQotICAKLSAgQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQgZWRpdFBhcnQ7Ci0gIHB1YmxpYyB2b2lkIHNldFJvb3RFZGl0UGFydChBYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIHRoaXMuZWRpdFBhcnQgPSBlZGl0UGFydDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0WFNEU2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0R3JhcGhWaWV3ZXIoV1NETEdyYXBoVmlld2VyIGdyYXBoVmlld2VyKQotICB7Ci0gICAgdGhpcy5ncmFwaFZpZXdlciA9IGdyYXBoVmlld2VyOwotICB9Ci0gIAotICAvKgotICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih4c2RTY2hlbWEpOwotICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgICAvLyBlZGl0UGFydC5zZXRJbnB1dCh4c2RTY2hlbWEpOwotICAgICAgZ3JhcGhWaWV3ZXIuc2V0SW5wdXQoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmaW5pdGlvbik7Ci0gICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICAgIC8vIGVkaXRQYXJ0LnNldElucHV0KGRlZmluaXRpb24pOwotICAgICAgZ3JhcGhWaWV3ZXIuc2V0SW5wdXQoZGVmaW5pdGlvbik7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNGU0ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2QuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkRlbGV0ZUludGVyZmFjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5kZWxldGUuQmFzZUdsb2JhbENsZWFudXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLy8gU2hvdWxkIHRyeSB0byB1c2UgeHNkZWRpdG9yJ3MgZGVsZXRlIGFjdGlvbi4uLi4KLQotcHVibGljIGNsYXNzIERlbGV0ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIERlbGV0ZUludGVyZmFjZUFjdGlvbgotewotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIExpc3QgZGVsZXRlTGlzdDsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlQWN0aW9uLgotICAgKiBAcGFyYW0gdGV4dAotICAgKi8KLSAgcHVibGljIERlbGV0ZUFjdGlvbihTdHJpbmcgdGV4dCkKLSAgewotICAgIHN1cGVyKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFIikpOwotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRTY2hlbWEoKQotICB7Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZWxldGVMaXN0KExpc3QgbGlzdCkgewotICAJZGVsZXRlTGlzdCA9IGxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldERlbGV0ZUxpc3QoKSB7Ci0gIAlyZXR1cm4gZGVsZXRlTGlzdDsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSUFjdGlvbiNydW4oKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIExpc3Qgc2VsZWN0aW9ucyA9IGdldERlbGV0ZUxpc3QoKTsKLSAgICAKLSAgICBpZiAoc2VsZWN0aW9ucy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9ucy5pdGVyYXRvcigpOwotICAgIERvY3VtZW50SW1wbCBkb2MgPSBudWxsOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IG5vZGU7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IChFbGVtZW50KW9iajsKLSAgICAgICAgT2JqZWN0IGVsZW0gPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoZGVmaW5pdGlvbiwgbm9kZSk7Ci0gICAgICAgIGlmIChlbGVtIGluc3RhbmNlb2YgWFNEQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgeHNkU2NoZW1hID0gKChYU0RDb21wb25lbnQpZWxlbSkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWFNEQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBub2RlID0gKChYU0RDb21wb25lbnQpb2JqKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIHhzZFNjaGVtYSA9ICgoWFNEQ29tcG9uZW50KW9iaikuZ2V0U2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgewotICAgICAgCW5vZGUgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iaikuZ2V0RWxlbWVudCgpOwotICAgICAgCXhzZFNjaGVtYSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqKS5nZXRTY2hlbWEoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOyAKLSAgICAgIH0KLSAgICAgICAgCi0gICAgICBpZiAoIVhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhub2RlLCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBkb2MgPSAoRG9jdW1lbnRJbXBsKSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICBkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURV9OT0RFUyIpKTsKLSAgICAgICAgfQotICAKLSAgICAgICAgYm9vbGVhbiByZWZyZXNoID0gY2xlYW51cFJlZmVyZW5jZXMobm9kZSk7Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShub2RlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdvcmthcm91bmQgdG8gcmVzZXQgaW5jbHVkZWQgZWxlbWVudHMgaW4gWFNEIG1vZGVsCi0gICAgICAgIGlmIChyZWZyZXNoKQotICAgICAgICB7Ci0vLyBUT0RPCi0vLyAgICAgICAgICBnZXRFZGl0b3IoKS5yZXBhcnNlU2NoZW1hKCk7Ci0vLyAgICAgICAgICBnZXRFZGl0b3IoKS5nZXRHcmFwaFZpZXdlcigpLnNldFNjaGVtYShnZXRFZGl0b3IoKS5nZXRYU0RTY2hlbWEoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGRvYyAhPSBudWxsKQotICAgIHsKLSAgICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhbnVwUmVmZXJlbmNlcyhOb2RlIGRlbGV0ZWROb2RlKQotICB7Ci0gICAgYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IGdldFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoZGVsZXRlZE5vZGUpOwotICAgIAotICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNESW5jbHVkZSB8fAotICAgICAgICBjb21wIGluc3RhbmNlb2YgWFNESW1wb3J0IHx8Ci0gICAgICAgIGNvbXAgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSAoKFhTRFNjaGVtYURpcmVjdGl2ZSljb21wKS5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgWFNEU2NoZW1hIHJlZmVyZW5jZWRTY2hlbWEgPSBudWxsOwotICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RJbmNsdWRlKQotICAgICAgewotICAgICAgICByZWZlcmVuY2VkU2NoZW1hID0gKChYU0RJbmNsdWRlKWNvbXApLmdldEluY29ycG9yYXRlZFNjaGVtYSgpOwotICAgICAgICByZWZyZXNoID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgIHsKLSAgICAgICAgcmVmZXJlbmNlZFNjaGVtYSA9ICgoWFNEUmVkZWZpbmUpY29tcCkuZ2V0SW5jb3Jwb3JhdGVkU2NoZW1hKCk7Ci0gICAgICAgIHJlZnJlc2ggPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICAgIHsKLSAgICAgICAgIHJlZmVyZW5jZWRTY2hlbWEgPSAoKFhTREltcG9ydCljb21wKS5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgfQotCi0gICAgICBpZiAocmVmZXJlbmNlZFNjaGVtYSAhPSBudWxsKQotICAgICAgewotLy8gICAgICAgIFhTREV4dGVybmFsRmlsZUNsZWFudXAgY2xlYW5IZWxwZXIgPSBuZXcgWFNERXh0ZXJuYWxGaWxlQ2xlYW51cChyZWZlcmVuY2VkU2NoZW1hKTsKLS8vICAgICAgICBjbGVhbkhlbHBlci52aXNpdFNjaGVtYShnZXRTY2hlbWEoKSk7Ci0vLyAgICAgICAgLy8gcG9wdWxhdGUgbWVzc2FnZXMKLS8vLy8gVE9ETwotLy8vLyAgICAgICAgZ2V0RWRpdG9yKCkuY3JlYXRlVGFza3NJblRhc2tMaXN0KGNsZWFuSGVscGVyLmdldE1lc3NhZ2VzKCkpOwotICAgICAgfQotICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgICB7Ci0gICAgICAgIFR5cGVzSGVscGVyIHR5cGVzSGVscGVyID0gbmV3IFR5cGVzSGVscGVyKGdldFNjaGVtYSgpKTsKLSAgICAgICAgdHlwZXNIZWxwZXIudXBkYXRlTWFwQWZ0ZXJEZWxldGUoKFhTREltcG9ydCljb21wKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZ2V0U2NoZW1hKCkuZXF1YWxzKGNvbXAuZ2V0Q29udGFpbmVyKCkpKQotICAgIHsKLSAgICAgIEJhc2VHbG9iYWxDbGVhbnVwIGNsZWFuSGVscGVyID0gbnVsbDsKLSAgIC8vICAgT25seSBuZWVkIHRvIGNsZWFuIHVwIHJlZmVyZW5jZXMgaWYgdGhlIGNvbXBvbmVudCBiZWluZyBkZWxldGVkIGlzIGdsb2JhbCBzY29wZWQKLS8vICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBjbGVhbkhlbHBlciA9IG5ldyBHbG9iYWxFbGVtZW50Q2xlYW51cChjb21wKTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBjbGVhbkhlbHBlciA9IG5ldyBHbG9iYWxHcm91cENsZWFudXAoY29tcCk7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgY2xlYW5IZWxwZXIgPSBuZXcgR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZUNsZWFudXAoY29tcCk7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgY2xlYW5IZWxwZXIgPSBuZXcgR2xvYmFsQXR0cmlidXRlQ2xlYW51cChjb21wKTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgY2xlYW5IZWxwZXIgPSBuZXcgR2xvYmFsQXR0cmlidXRlR3JvdXBDbGVhbnVwKGNvbXApOwotLy8gICAgICB9Ci0vLyAgICAgIAotLy8gICAgICAKLS8vICAgICAgaWYgKGNsZWFuSGVscGVyICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBjbGVhbkhlbHBlci52aXNpdFNjaGVtYShnZXRTY2hlbWEoKSk7Ci0vLyAgICAgICAgLy8gcG9wdWxhdGUgbWVzc2FnZXMKLS8vLy8gVE9ETwotLy8vLyAgICAgICAgZ2V0RWRpdG9yKCkuY3JlYXRlVGFza3NJblRhc2tMaXN0KGNsZWFuSGVscGVyLmdldE1lc3NhZ2VzKCkpOwotLy8gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWZyZXNoOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvZ3JhcGgvZWRpdHBhcnRzL1hTRFNjaGVtYURyaWxsRG93bkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvZ3JhcGgvZWRpdHBhcnRzL1hTRFNjaGVtYURyaWxsRG93bkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliY2IxYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2dyYXBoL2VkaXRwYXJ0cy9YU0RTY2hlbWFEcmlsbERvd25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2QuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5EcmlsbERvd25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hRHJpbGxEb3duRWRpdFBhcnQgZXh0ZW5kcyBEcmlsbERvd25FZGl0UGFydCAKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBJRmlndXJlIGZpZ3VyZSA9IHN1cGVyLmNyZWF0ZUZpZ3VyZSgpOwotICAgIGxhYmVsLnNldEljb24oWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RGaWxlLmdpZiIpKTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9ICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpZ2V0TW9kZWwoKTsKLSAgICBTdHJpbmcgbnMgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCA/IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSA6ICIiOwotICAgIGxhYmVsLnNldFRleHQobnMpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2dyYXBoL2VkaXRwYXJ0cy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvZ3JhcGgvZWRpdHBhcnRzL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwOTMwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvZ3JhcGgvZWRpdHBhcnRzL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29udGFpbmVyRmlndXJlOwotCi0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCAKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5OwotCi0gIHB1YmxpYyBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVkaXRQYXJ0KEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5KQotICB7Ci0gICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ29udGFpbmVyRmlndXJlIGZpZ3VyZSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsgICAgCi0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfSAgICAKLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKSAKLSAgewotICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZUVkaXRQYXJ0KHRoaXMsIG1vZGVsKTsKLSAgfSAgICAgIAotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSAKLSAgeyAKLSAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KWdldE1vZGVsKCk7Ci0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcmVzdWx0LmFkZChlLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIAotICB7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWNhYzVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjL3dzZGx2YWxpZGF0ZXVpLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy93c2RsdmFsaWRhdGUvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi93c2RsNGouamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9xbmFtZS5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiMWNlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13c2RsdmFsaWRhdGUuamFyCi13c2RsdmFsaWRhdGV1aS5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE5MGMzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MjQwNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSB3c2RsdmFsaWRhdGUuamFyLFwKLSAgICAgICAgICAgICAgIHdzZGx2YWxpZGF0ZXVpLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLW91dHB1dC53c2RsdmFsaWRhdGUuamFyID0gYmluLwotc291cmNlLndzZGx2YWxpZGF0ZS5qYXIgPSBzcmMvd3NkbHZhbGlkYXRlLwotc291cmNlLndzZGx2YWxpZGF0ZXVpLmphciA9IHNyYy93c2RsdmFsaWRhdGV1aS8KLWphcnMuY29tcGlsZS5vcmRlciA9IHdzZGx2YWxpZGF0ZS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgd3NkbHZhbGlkYXRldWkuamFyCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyxcCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC9leHR2YWxpZGF0b3IuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL2V4dHZhbGlkYXRvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWRkMDQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL2V4dHZhbGlkYXRvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iIGlkPSJleHR2YWxpZGF0b3IiIG5hbWU9IldTREwgRXh0ZW5zaW9uIFZhbGlkYXRvciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBBbiBleHRlbnNpb24gcG9pbnQgdG8gYWxsb3cgcGx1Z2dpbiBpbiBleHRlbnNpb24gdmFsaWRhdG9ycyB0byBydW4gcG9zdCBXU0RMIHZhbGlkYXRpb24uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImV4dHZhbGlkYXRvciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0dmFsaWRhdG9yIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlc291cmNlYnVuZGxlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2QvdXJpcmVzb2x2ZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL3VyaXJlc29sdmVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViODY0ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2QvdXJpcmVzb2x2ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iIGlkPSJ1cmlyZXNvbHZlciIgbmFtZT0iV1NETCBVUkkgUmVzb2x2ZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idXJpcmVzb2x2ZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InVyaXJlc29sdmVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC93c2RsMTF2YWxpZGF0b3IuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL3dzZGwxMXZhbGlkYXRvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzdiYjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL3dzZGwxMXZhbGlkYXRvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iIGlkPSJ3c2RsMTF2YWxpZGF0b3IiIG5hbWU9IldTREwgMS4xIEV4dGVuc2lvbiBWYWxpZGF0b3IiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id3NkbDExdmFsaWRhdG9yIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3c2RsMTF2YWxpZGF0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzb3VyY2VidW5kbGUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC94bWxjYXRhbG9nLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC94bWxjYXRhbG9nLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZTQ5YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2QveG1sY2F0YWxvZy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iIGlkPSJ4bWxjYXRhbG9nIiBuYW1lPSJXU0RMIFhNTCBDYXRhbG9nIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbnRpdHkiLz4KLSAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2NoZW1hZGlyIi8+Ci0gICAgICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVudGl0eSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InB1YmxpY0lkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzY2hlbWFkaXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9saWIvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9saWIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5MmYwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vbGliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0qLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODNlZDhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hLS0gcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uCi0hLS0gVG9vbCBOYW1lCi0KLV9QTFVHSU5fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFdTREwgVmFsaWRhdG9yCi1fUFJPVklERVJfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFY2xpcHNlLm9yZwotCi0hLS0gVUkgTWVudSBJdGVtCi1fVUlfTUVOVV9WQUxJREFURV9XU0RMICAgICAgICAgICAgICAgICAgICAgPSBWYWxpZGF0ZSBXU0RMIEZpbGUKLV9VSV9XU0RMX1ZBTElEQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICA9IFdTREwgVmFsaWRhdG9yCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNzM0M2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIgotICAgbmFtZT0iJV9QTFVHSU5fTkFNRSIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iJV9QUk9WSURFUl9OQU1FIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZS5WYWxpZGF0ZVdTRExQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzZGx2YWxpZGF0ZXVpLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzZGx2YWxpZGF0ZS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJsaWIvd3NkbDRqLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxpYi9xbmFtZS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5kZXBlbmRlbmN5Y2hlY2tlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuYXBhY2hlLmFudCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uIiBleHBvcnQ9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZGVwZW5kZW5jeWNoZWNrZXIucmVxdWlyZWRGaWxlcyI+Ci0gICAgICA8cmVxdWlyZWRGaWxlCi0gICAgICAgICAgICBwbHVnaW5SZWxhdGl2ZVBhdGg9ImxpYi9xbmFtZS5qYXIiCi0gICAgICAgICAgICBsb2NhdGlvblVSTD0iaHR0cDovL3ByZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC93c2RsNGovd3NkbDRqLWJpbi0xLjQuemlwP2Rvd25sb2FkIi8+Ci0gICAgICA8cmVxdWlyZWRGaWxlCi0gICAgICAgICAgICBwbHVnaW5SZWxhdGl2ZVBhdGg9ImxpYi93c2RsNGouamFyIgotICAgICAgICAgICAgbG9jYXRpb25VUkw9Imh0dHA6Ly9wcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvd3NkbDRqL3dzZGw0ai1iaW4tMS40LnppcD9kb3dubG9hZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gV1NETCBleHRlbnNpb24gdmFsaWRhdG9yLiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0aGF0IHdpbGwgcnVuCi0gICAgICAgIGFmdGVyIFdTREwgdmFsaWRhdGlvbiBpZiBXU0RMIHZhbGlkYXRpb24gaXMgc3VjY2Vzc2Z1bC4gIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0dmFsaWRhdG9yIiBuYW1lPSJXU0RMIEV4dGVuc2lvbiBWYWxpZGF0b3IiIHNjaGVtYT0iZXhzZC9leHR2YWxpZGF0b3IuZXhzZCIvPgotICAgCi0gICA8IS0tIFdTREwgMS4xIHZhbGlkYXRvciBleHRlbnNpb24uIFRvIHByb3ZpZGUgYSBuYW1lc3BhY2Ugc3BlY2lmaWMgV1NETCAxLjEKLSAgICAgICAgdmFsaWRhdG9yLiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndzZGwxMXZhbGlkYXRvciIgbmFtZT0iV1NETCAxLjEgRXh0ZW5zaW9uIFZhbGlkYXRvciIgc2NoZW1hPSJleHNkL3dzZGwxMXZhbGlkYXRvci5leHNkIi8+Ci0gICAKLSAgIDwhLS0gQW4gZXh0ZW5zaW9uIHRvIGFkZCBYTUwgY2F0YWxvZyBlbnRyaWVzIHRvIHRoZSBXU0RMIHZhbGlkYXRvci4KLSAgICAgICAgTWFueSBlbnRpcmVzIGNhbiBiZSBhZGRlZCBhcyBzZWVuIGJlbG93LiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgbmFtZT0iV1NETCBYTUwgQ2F0YWxvZyIgaWQ9InhtbGNhdGFsb2ciIHNjaGVtYT0iZXhzZC94bWxjYXRhbG9nLmV4c2QiLz4KLQotICAgPCEtLSBBbiBleHRlbnNpb24gdG8gYWRkIGEgVVJJIHJlc29sdmVyIHRvIHRoZSBXU0RMIHZhbGlkYXRvci4gVVJJIHJlc29sdmVycwotICAgICAgICBhcmUgdXNlZCB0byByZXNvbHZlIHRoZSBsb2NhdGlvbiBvZiBpbXBvcnRlZCBkb2N1bWVudHMgc3VjaCBhcyBXU0RMIGFuZAotICAgICAgICBYU0QgdGhyb3VnaCB0aGUgV1NETCBhbmQgc2NoZW1hIGltcG9ydCBtZWNoYW5pc21zLiAKLSAgICAgICAgVGhpcyBpcyBob3cgdGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZC4KLSAgICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS51cmlyZXNvbHZlciI+Ci0gICAgICAgICAgPHVyaXJlc29sdmVyIGNsYXNzPSJmdWxsIG5hbWUgb2YgeW91ciBjbGFzcyIvPgotICAgICAgICA8L2V4dGVuc2lvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IldTREwgVVJJIFJlc29sdmVyIiBpZD0idXJpcmVzb2x2ZXIiIHNjaGVtYT0iZXhzZC91cmlyZXNvbHZlci5leHNkIi8+Ci0KLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPCEtLSBTZXQgdGhlIFZhbGlkYXRlIFdTREwgRmlsZSBjb250ZXh0IG1lbnUgaXRlbS4gVGhpcyAgICAgLS0+Ci0gICA8IS0tIG1lbnUgaXRlbSBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHRoZSB2YWxpZGF0aW9uICAgICAgICAtLT4KLSAgIDwhLS0gZnJhbWV3b3JrIGlzIG1vZGlmaWVkIHRvIGNyZWF0ZSB0aGUgaXRlbS4gICAgICAgICAgICAgIC0tPgotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzZGwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi53c2RsYWN0aW9uIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX01FTlVfVkFMSURBVEVfV1NETCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2UuVmFsaWRhdGVXU0RMQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZS5WYWxpZGF0ZVdTRExBY3Rpb25EZWxlZ2F0ZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPCEtLSBTZXQgdGhlIFhNTCBDYXRhbG9nIGVudHJpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICA8IS0tIFRoZXNlIGVudHJpZXMgYXJlIGNvbW1lbnRlZCBvdXQgdW50aWwgc3VjaCB0aW1lIGFzICAgICAtLT4KLSAgIDwhLS0gcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGluY2x1ZGUgdGhlbSBpbiB0aGlzIHBsdWdpbi4gIC0tPgotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8IS0tZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnhtbGNhdGFsb2ciLS0+Ci0gICAgIDwhLS1lbnRpdHkKLSAgICAgICBwdWJsaWNJZD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIAotICAgICAgIGxvY2F0aW9uPSJ4c2Qvd3NkbC54c2QiIC8tLT4KLSAgICAgPCEtLWVudGl0eQotICAgICAgIHB1YmxpY0lkPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiAKLSAgICAgICBsb2NhdGlvbj0ieHNkL2h0dHAueHNkIiAvLS0+Ci0gICAgIDwhLS1lbnRpdHkKLSAgICAgICBwdWJsaWNJZD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAgICAgbG9jYXRpb249InhzZC9zb2FwLnhzZCIgLy0tPgotICAgICA8IS0tZW50aXR5Ci0gICAgICAgcHVibGljSWQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgIGxvY2F0aW9uPSJ4c2Qvd3NkbC1taW1lLnhzZCIgLy0tPgotICAgICA8IS0tZW50aXR5IAotICAgICAgIHB1YmxpY0lkPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgbG9jYXRpb249InhzZC9zb2FwZW5jLnhzZCIgLy0tPgotICAgICA8IS0tIFRoZSB4bWwtc29hcCBkb2VzIG5vdCBleGlzdCBidXQgaXMgdXNlZCBpbiBjZXJ0YWluIGRvY3VtZW50cy4KLSAgICAgICAgICBJdCBpcyBpbmNsdWRlZCBoZXJlIHNvIHRoZSB2YWxpZGF0b3Igd2lsbCByZWNvZ25pemUgaXQuIC0tPgotICAgICA8IS0tZW50aXR5Ci0gICAgICAgcHVibGljSWQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgCi0gICAgICAgbG9jYXRpb249InhzZC94bWwtc29hcC54c2QiIC8tLT4KLSAgIDwhLS0vZXh0ZW5zaW9uLS0+Ci0gICAKLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPCEtLSBBbiBleHRlbnNpb24gZm9yIGFkZGluZyB0aGUgVVJJIHJlc29sdmVyIGZyb20gICAgICAgICAgLS0+Ci0gICA8IS0tIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIgdG8gdGhlIFdTREwgICAgICAgICAtLT4KLSAgIDwhLS0gdmFsaWRhdG9yLgkJCQkJCQkJCQkJICAgLS0+Ci0gICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udXJpcmVzb2x2ZXIiPgotICAgICA8dXJpcmVzb2x2ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZS5VUklSZXNvbHZlcldyYXBwZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDwhLS0gQW4gZXh0ZW5zaW9uIGZvciBhZGRpbmcgdGhlIFdTREwgdmFsaWRhdG9yIHRvIHRoZSAgICAgIC0tPgotICAgPCEtLSB2YWxpZGF0aW9uIGZyYW1ld29yay4gCQkJCQkJICAgICAgICAgICAtLT4JCQkJCQkJCQkJICAgLS0+Ci0gICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ3c2RsVmFsaWRhdG9yIgotICAgICAgICAgbmFtZT0iJV9VSV9XU0RMX1ZBTElEQVRPUiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotICAgICAgPHZhbGlkYXRvcj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2RsIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgPGhlbHBlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLkhlbHBlciI+Ci0gICAgICAgICA8L2hlbHBlcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2UuVmFsaWRhdG9yIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMmNhN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi0vKioKLSAqIFNldCBjb25zdGFudHMgdGhhdCB0aGUgdmFsaWRhdG9yIG1ha2VzIHVzZSBvZi4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdGFudHMKLXsKLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgcHJvcGVydGllcyBmaWxlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NETF9WQUxJREFUT1JfUFJPUEVSVElFU19GSUxFID0gInZhbGlkYXRld3NkbCI7Ci0KLSAgLyoqCi0gICAqIFRoZSBTT0FQIDEuMSBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19TT0FQMTEgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI7Ci0KLSAgLyoqCi0gICAqIFRoZSBIVFRQIG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX0hUVFAgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyI7Ci0KLSAgLyoqCi0gICAqIFRoZSBNSU1FIG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX01JTUUgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRyb2xsZXJWYWxpZGF0aW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db250cm9sbGVyVmFsaWRhdGlvbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmNGQ1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRyb2xsZXJWYWxpZGF0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIHRoZSB2YWxpZGF0aW9uIGluZm8gdGhhdCBhbGxvd3MgZm9yIHN0YXJ0aW5nIGFuZAotICogY29tcGxldGluZyBXU0RMIGFuZCBXUy1JIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udHJvbGxlclZhbGlkYXRpb25JbmZvIGV4dGVuZHMgSVZhbGlkYXRpb25JbmZvCi17Ci0gIAotICAvKioKLSAgICogUGVyZm9ybSB0aGUgbmVjZXNzYXJ5IHN0ZXBzIHRvIGNvbXBsZXRlIFdTREwgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbXBsZXRlV1NETFZhbGlkYXRpb24oKTsKLSAgCi0vLyAgLyoqCi0vLyAgICogUGVyZm9ybSB0aGUgbmVjZXNzYXJ5IHN0ZXBzIHRvIGNvbXBsZXRlIFdTLUkgV1NETCB2YWxpZGF0aW9uLgotLy8gICAqLwotLy8gIHB1YmxpYyB2b2lkIGNvbXBsZXRlV1NJVmFsaWRhdGlvbigpOwotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbGlkYXRpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmJmYjI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbGlkYXRpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyOwotCi0KLS8qKgotICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25JbmZvIGV4dGVuZHMgSVZhbGlkYXRpb25SZXBvcnQKLXsKLSAgCi0gIC8qKgotICAgKiBBZGQgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBmaWxlLiAoVXNlcyB0aGUgVVJJIGZyb20gdGhpcyB2YWxpZGF0aW9uIGluZm8gb2JqZWN0LikKLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBlcnJvciBpbiB0aGUgZmlsZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlcnJvciBpbiB0aGUgZmlsZS4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbik7Ci0gIAotICAvKioKLSAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIGVycm9yLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgaW4gdGhlIGZpbGUuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgaW4gdGhlIGZpbGUuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBlcnJvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSk7Ci0gIAotICAvKioKLSAgICogQWRkIGEgd2FybmluZyBtZXNzYWdlIGZvciB0aGlzIGZpbGUuIChVc2VzIHRoZSBVUkkgZnJvbSB0aGlzIHZhbGlkYXRpb24gaW5mbyBvYmplY3QuKQotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgZm9yIHRoZSB3YXJuaW5nLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgd2FybmluZyBpbiB0aGUgZmlsZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSB3YXJuaW5nIGluIHRoZSBmaWxlLgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4pOwotICAKLSAgLyoqCi0gICAqIEFkZCBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIHdhcm5pbmcgaW4gdGhlIGZpbGUuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgd2FybmluZyBpbiB0aGUgZmlsZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGVycm9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpOwotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgVVJJIHJlc29sdmVyIGluIHVzZSBmb3IgdGhpcyB2YWxpZGF0aW9uLiBUaGUgVVJJIHJlc29sdmVyCi0gICAqIHJldHVybmVkIGlzIGFjdHVhbGx5IGEgVVJJIHJlc29sdmVyIGhhbmRsZXIgdGhhdCB3aWxsIAotICAgKiBpdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSByZWdpc3RlcmVkIFVSSSByZXNvbHZlcnMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgcmVzb2x2ZXIgaGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyBJVVJJUmVzb2x2ZXIgZ2V0VVJJUmVzb2x2ZXIoKTsKLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZiB0aGUgYXR0cmlidXRlCi0gICAqIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLCByZXR1cm4gbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYmVpbmcgcmVxdWVzdGVkLgotICAgKiBAcmV0dXJuIFRoZSBhdHRyaWJ1dGUgdmFsdWUgaWYgdGhlIGF0dHJpYnV0ZSBoYXMgYmVlbiByZWdpc3RlcmVkLCBudWxsIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbGlkYXRpb25NZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjVhOWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbGlkYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhIHZhbGlkYXRpb24gbWVzc2FnZS4gQSB2YWxpZGF0aW9uIG1lc3NhZ2UgY29udGFpbnMgaW5mb3JtYXRpb24KLSAqIGZvciB0aGUgbWVzc2FnZSwgaXRzIHNldmVyaXR5IGFuZCB3aGVyZSBpdCdzIGxvY2F0ZWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25NZXNzYWdlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBFUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSA9IG5ldyBRdWFsaWZpZWROYW1lKCJvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlIiwgImVycm9yTWVzc2FnZU1hcCIpOwotICAvKioKLSAgICogU2V2ZXJpdHkgZXJyb3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZfRVJST1IgPSAwOwotICAvKioKLSAgICogU2V2ZXJpdHkgd2FybmluZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVl9XQVJOSU5HID0gMTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9yIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSSSBmb3IgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVUkkoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgZm9yIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSBmb3IgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHNldmVyaXR5IG9mIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgc2V2ZXJpdHkgb2YgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFNldmVyaXR5KCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsaW5lIHdoZXJlIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaW5lIHdoZXJlIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldExpbmUoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGNvbHVtbiB3aGVyZSB0aGlzIHZhbGlkYXRpb24gbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgY29sdW1uIHdoZXJlIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldENvbHVtbigpOwotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXROZXN0ZWRNZXNzYWdlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsaWRhdGlvblJlcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsaWRhdGlvblJlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQ0YmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbGlkYXRpb25SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhIFdTREwgdmFsaWRhdGlvbiByZXBvcnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25SZXBvcnQKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3IgdGhlIGZpbGUgdGhlIHJlcG9ydCByZWZlcnMgdG8uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgZm9yIHRoZSBmaWxlIHRoZSByZXBvcnQgcmVmZXJzIHRvLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGaWxlVVJJKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBmaWxlIGlzIHZhbGlkIGFjY29yZGluZyB0byB0aGUgV1NETCBzcGVjaWZpY2F0aW9uLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIGlzIFdTREwgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV1NETFZhbGlkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyBJVmFsaWRhdGlvbk1lc3NhZ2VbXSBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGVycm9ycywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGFyZSBlcnJvcnMsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpOwotICAKLSAgcHVibGljIEhhc2hNYXAgZ2V0TmVzdGVkTWVzc2FnZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JV1NETFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JV1NETFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjc4ZTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVdTRExWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5leGNlcHRpb24uVmFsaWRhdGVXU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYSBXU0RMIHZhbGlkYXRvci4gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhIHRvcCBsZXZlbCB2YWxpZGF0b3IgCi0gKiBjb21wb25lbnQgc3VjaCBhcyBhIFdTREwgMS4xIHZhbGlkYXRvciwgV1NETCAxLjIgdmFsaWRhdG9yIG9yIFdTLUkgQmFzaWMgUHJvZmlsZSB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdTRExWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBmaWxlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAqIAotICAgKiBAcGFyYW0gZG9tTW9kZWwgQSBET00gbW9kZWwgb2YgdGhlIGZpbGUgdG8gYmUgdmFsaWRhdGVkLgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSB2YWxpZGF0aW9uIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkLgotICAgKiBAdGhyb3dzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoRG9jdW1lbnQgZG9tTW9kZWwsIElWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKSB0aHJvd3MgVmFsaWRhdGVXU0RMRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBzZXRSZXNvdXJjZUJ1bmRsZQotICAgKiBTZXQgdGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIHZhbGlkYXRvci4gQWxsb3dzIHRoZSB1c2Ugb2YgZGlmZmVyZW5jZSAKLSAgICogUmVzb3VyY2VCdW5kbGVzIGZvciBkaWZmZXJlbnQgdmFsaWRhdG9ycy4KLSAgICogCi0gICAqIEBwYXJhbSByYiBUaGUgcmVzb3VyY2UgYnVuZGxlIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTgwYjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFcnJvclJlcG9ydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRE9NUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5leGNlcHRpb24uVmFsaWRhdGVXU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuQWJzdHJhY3RYTUxDb25mb3JtYW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuRGVmYXVsdFhNTFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5JWE1MVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLkxpbmVOdW1iZXJET01QYXJzZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5cG9pbnQgdG8gdGhlIFdTREwgVmFsaWRhdG9yLiBUaGUgY29udHJvbGxlciBpcwotICogcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhlIHJlYWRlciwgdGhlIFhNTCBjb25mb3JtYW5jZSBjaGVjaywgdGhlIFdTREwKLSAqIHZhbGlkYXRpb24gYW5kIHRoZSBXUy1JIHZhbGlkYXRpb24gaWYgc2VsZWN0ZWQuIFRoZSBjb250cm9sbGVyIGNvbnRhaW5zIGFueQotICogZXJyb3JzIGFuZCB3YXJuaW5ncyBnZW5lcmF0ZWQgYXMgd2VsbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25Db250cm9sbGVyCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgX0VSUk9SX1BST0JMRU1fV1NETF9WQUxJREFUT1IgPSAiX0VSUk9SX1BST0JMRU1fV1NETF9WQUxJREFUT1IiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9FUlJPUl9OT19XU0RMX1ZBTElEQVRPUiA9ICJfRVJST1JfTk9fV1NETF9WQUxJREFUT1IiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9FUlJPUl9QUk9CTEVNX0VYVF9WQUxJREFUT1IgPSAiX0VSUk9SX1BST0JMRU1fRVhUX1ZBTElEQVRPUiI7Ci0KLSAgcHJvdGVjdGVkIFZhbGlkYXRvclJlZ2lzdHJ5IHZlcjsKLSAgcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIHJlc291cmNlYnVuZGxlOwotICBwcm90ZWN0ZWQgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yOwotICBwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXI7Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgYXR0cmlidXRlcyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvL3Byb3RlY3RlZCBTdHJpbmcgd3NkbE5hbWVzcGFjZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBSZXNvdXJjZUJ1bmRsZSBuZWVkcyB0byBiZSBzZXQgc28gaXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgcmVhZGVyLgotICAgKiAKLSAgICogQHBhcmFtIHJiCi0gICAqICAgICAgICAgICAgVGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhpcyB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbkNvbnRyb2xsZXIoUmVzb3VyY2VCdW5kbGUgcmIsIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gICAgcmVzb3VyY2VidW5kbGUgPSByYjsKLSAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmVzb3VyY2VidW5kbGUpOwotICAgIHRoaXMudXJpUmVzb2x2ZXIgPSB1cmlSZXNvbHZlcjsKLQotICAgIHZlciA9IFZhbGlkYXRvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgdGhlIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIHRvIHRoZSB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIGF0dHJpYnV0ZXMgdG8gYWRkIHRvIHRoZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhIYXNodGFibGUgYXR0cmlidXRlcykKLSAgewotICAJdGhpcy5hdHRyaWJ1dGVzLnB1dEFsbChhdHRyaWJ1dGVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgV1NETCBmaWxlLiBDaGVjayB0aGUgZmlsZSBmb3IgWE1MIGNvbmZvcm1hbmNlLiBJZiBpdCBpcyBYTUwKLSAgICogY29uZm9ybWFudCwgcmVhZCB0aGUgZmlsZSBhbmQgY2hlY2sgaXQgZm9yIFdTREwgY29uZm9ybWFuY2UuIElmIGl0IGlzIFdTREwKLSAgICogY29uZm9ybWFudCBhbmQgV1MtSSBjb25mb3JtYW5jZSBpcyBzZXQgdG8gc3VnZ2VzdCBvciByZXF1aXJlLCBjaGVjayB0aGUKLSAgICogZmlsZSBmb3IgV1MtSSBjb25mb3JtYW5jZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogICAgICAgICAgICBUaGUgdXJpIHdoZXJlIHRoZSBXU0RMIGRvY3VtZW50IGlzIGxvY2F0ZWQuCi0gICAqIEBwYXJhbSB3c2lMZXZlbAotICAgKiAgICAgICAgICAgIFRoZSBsZXZlbCBvZiBXUy1JIGNvbmZvcm1hbmNlIHRvIHVzZSBmb3IgdmFsaWRhdGlvbi4KLSAgICogQHJldHVybiBBIHZhbGlkYXRpb24gcmVwb3J0IHdpdGggdGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhlIGZpbGUuCi0gICAqLwotLy8gIHB1YmxpYyBJVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpKQotLy8gIHsgcmV0dXJuIHZhbGlkYXRlKHVyaSwgbnVsbCk7Ci0vLyAgfQotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBXU0RMIGZpbGUgd2l0aCB0aGUgc3RyZWFtLiBUaGlzIG1ldGhvZCB3aWxsIHJ1biB0aGUgY2hlY2sgb2YgdGhlIAotICAgKiBXU0RMIGRvY3VtZW50LiBUaGUgdmFsaWRhdGlvbiBpcyBicm9rZW4gdXAgaW50byB0aHJlZSBzdGFnZXM6IFhNTCBjb25mb3JtYW5jZSwKLSAgICogV1NETCBzZW1hbnRpYywgYW5kIHBvc3QgdmFsaWRhdGlvbi4KLSAgICogCi0gKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIFdTREwgZG9jdW1lbnQgdG8gYmUgdmFsaWRhdGVkLgotICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSBjb250ZW50cyBvZiB0aGUgV1NETCBkb2N1bWVudCB0byBiZSB2YWxpZGF0ZWQuCi0gKiBAcmV0dXJuIEEgdmFsaWRhdGlvbiByZXBvcnQgd2l0aCB0aGUgdmFsaWRhdGlvbiBpbmZvIGZvciB0aGUgZmlsZS4KLSAqLwotICBwdWJsaWMgSVZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLSAgICAKLSAgICBJbnB1dFN0cmVhbSB4bWxWYWxpZGF0ZVN0cmVhbSA9IG51bGw7Ci0gICAgSW5wdXRTdHJlYW0gd3NkbFZhbGlkYXRlU3RyZWFtID0gbnVsbDsKLSAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLSAgICB7IC8vY29weSB0aGUgaW5wdXRTdHJlYW0gc28gd2UgY2FuIHVzZSBpdCBtb3JlIHRoYW4gb25jZQotICAgICAgU3RyaW5nIGNvbnRlbnRzID0gY3JlYXRlU3RyaW5nRm9ySW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgICAgeG1sVmFsaWRhdGVTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudHMuZ2V0Qnl0ZXMoKSk7Ci0gICAgICB3c2RsVmFsaWRhdGVTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudHMuZ2V0Qnl0ZXMoKSk7Ci0gICAgfQotICAgIAotICAgIENvbnRyb2xsZXJWYWxpZGF0aW9uSW5mbyB2YWxJbmZvID0gbmV3IFZhbGlkYXRpb25JbmZvSW1wbCh1cmksIG1lc3NhZ2VnZW5lcmF0b3IpOwotICAgICgoVmFsaWRhdGlvbkluZm9JbXBsKXZhbEluZm8pLnNldFVSSVJlc29sdmVyKHVyaVJlc29sdmVyKTsKLSAgICAoKFZhbGlkYXRpb25JbmZvSW1wbCl2YWxJbmZvKS5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCi0gICAgaWYgKHZhbGlkYXRlWE1MKHZhbEluZm8sIHhtbFZhbGlkYXRlU3RyZWFtKSkKLSAgICB7Ci0gICAgICBEb2N1bWVudCB3c2RsZG9jID0gZ2V0RG9jdW1lbnQodXJpLCB3c2RsVmFsaWRhdGVTdHJlYW0pOwotICAgICAgU3RyaW5nIHdzZGxucyA9IGdldFdTRExOYW1lc3BhY2Uod3NkbGRvYyk7Ci0gICAgICBpZiAodmFsaWRhdGVXU0RMKHdzZGxkb2MsIHZhbEluZm8sIHdzZGxucykpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlRXh0ZW5zaW9uVmFsaWRhdG9ycyh3c2RsZG9jLCB2YWxJbmZvLCB3c2RsbnMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKElWYWxpZGF0aW9uUmVwb3J0KXZhbEluZm87Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGZpbGUgZm9yIFhNTCBjb25mb3JtYW5jZS4KLQkgKiBAcGFyYW0gdmFsSW5mbyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFsaWRhdGlvbgotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gdGhlIGlucHV0U3RyZWFtIHRvIHZhbGlkYXRlCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBpcyBjb25mb3JtYW50LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVhNTChDb250cm9sbGVyVmFsaWRhdGlvbkluZm8gdmFsSW5mbywgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLSAgICBJWE1MVmFsaWRhdG9yIHhtbFZhbGlkYXRvciA9IEFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0WE1MVmFsaWRhdG9yKCk7Ci0gICAgeG1sVmFsaWRhdG9yLnNldFVSSVJlc29sdmVyKHVyaVJlc29sdmVyKTsKLSAgICB4bWxWYWxpZGF0b3Iuc2V0RmlsZSh2YWxJbmZvLmdldEZpbGVVUkkoKSk7Ci0gICAgaWYgKHhtbFZhbGlkYXRvciBpbnN0YW5jZW9mIERlZmF1bHRYTUxWYWxpZGF0b3IpCi0gICAgewotICAgICAgICAoKERlZmF1bHRYTUxWYWxpZGF0b3IpeG1sVmFsaWRhdG9yKS5zZXRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0gICAgfQotICAgIC8veG1sVmFsaWRhdG9yLnNldFZhbGlkYXRpb25JbmZvKHZhbEluZm8pOwotICAgIHhtbFZhbGlkYXRvci5ydW4oKTsKLSAgICAvLyBpZiB0aGVyZSBhcmUgbm8geG1sIGNvbmZvcm1hbmNlIHByb2JsZW1zIGdvIG9uIHRvIGNoZWNrIHRoZSB3c2RsIHN0dWZmCi0gICAgaWYgKHhtbFZhbGlkYXRvci5oYXNFcnJvcnMoKSkKLSAgICB7Ci0gICAgICAvLyB0ZW1wIGhhbmRsaW5nIG9mIFhNTCBlcnJvcnMgdW50aWwgdmFsaWRhdG9yIGlzIHVwZGF0ZWQuCi0gICAgICBMaXN0IGVycm9ycyA9IHhtbFZhbGlkYXRvci5nZXRFcnJvcnMoKTsKLSAgICAgIEl0ZXJhdG9yIGVycm9yc0l0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChlcnJvcnNJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgSVZhbGlkYXRpb25NZXNzYWdlIHZhbE1lcyA9IChJVmFsaWRhdGlvbk1lc3NhZ2UpZXJyb3JzSXRlci5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAodmFsTWVzIGluc3RhbmNlb2YgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsICYmIHZhbEluZm8gaW5zdGFuY2VvZiBWYWxpZGF0aW9uSW5mb0ltcGwpCi0gICAgICAgIHsgICBTdHJpbmcgZXJyb3JLZXkgPSAoKFZhbGlkYXRpb25NZXNzYWdlSW1wbCl2YWxNZXMpLmdldEVycm9yS2V5KCk7Ci0gICAgICAgICAgICBPYmplY3RbXSBtZXNzYWdlQXJncyA9ICgoVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKXZhbE1lcykuZ2V0TWVzc2FnZUFyZ3VtZW50cygpOwotICAgICAgICAgICAgKChWYWxpZGF0aW9uSW5mb0ltcGwpdmFsSW5mbykuYWRkRXJyb3IodmFsTWVzLmdldE1lc3NhZ2UoKSwgdmFsTWVzLmdldExpbmUoKSwgdmFsTWVzLmdldENvbHVtbigpLCB2YWxNZXMuZ2V0VVJJKCksIGVycm9yS2V5LCBtZXNzYWdlQXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKHZhbE1lcy5nZXRNZXNzYWdlKCksIHZhbE1lcy5nZXRMaW5lKCksIHZhbE1lcy5nZXRDb2x1bW4oKSwgdmFsTWVzLmdldFVSSSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvL3dzZGxOYW1lc3BhY2UgPSB4bWxWYWxpZGF0b3IuZ2V0V1NETE5hbWVzcGFjZSgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGZpbGUgZm9yIFhNTCBjb25mb3JtYW5jZS4KLQkgKiBAcGFyYW0gdmFsSW5mbyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFsaWRhdGlvbgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgY29uZm9ybWFudCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVYTUwoQ29udHJvbGxlclZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsgcmV0dXJuIHZhbGlkYXRlWE1MKHZhbEluZm8sIG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBXU0RMIGZpbGUuIFNldCB0aGUgZXJyb3JzIGFuZCB3YXJuaW5nIGFwcHJvcHJpYXRlbHkuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbGRvYyBBIFczQyBkb2N1bWVudCByZXByZXNlbnRhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIHdzZGxOYW1lc3BhY2UgVGhlIFdTREwgbmFtZXNwYWNlIHRvIHZhbGlkYXRlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlV1NETChEb2N1bWVudCB3c2RsZG9jLCBDb250cm9sbGVyVmFsaWRhdGlvbkluZm8gdmFsSW5mbywgU3RyaW5nIHdzZGxOYW1lc3BhY2UpCi0gIHsKLSAgICBXU0RMVmFsaWRhdG9yRGVsZWdhdGVbXSB3c2RsVmFscyA9IHZlci5xdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KHdzZGxOYW1lc3BhY2UsIFZhbGlkYXRvclJlZ2lzdHJ5LldTRExfVkFMSURBVE9SKTsKLSAgICBpZiAod3NkbFZhbHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGxWYWxzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBXU0RMVmFsaWRhdG9yRGVsZWdhdGUgd3NkbHZhbGRlbCA9IHdzZGxWYWxzW2ldOwotICAgICAgICBJV1NETFZhbGlkYXRvciB3c2RsVmFsID0gd3NkbHZhbGRlbC5nZXRWYWxpZGF0b3IoKTsKLQotICAgICAgICAvLyBJZiB0aGUgd3NkbCB2YWxpZGF0b3IgaXNuJ3QgbnVsbCwgdmFsaWRhdGUuCi0gICAgICAgIGlmICh3c2RsVmFsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3c2RsVmFsLnZhbGlkYXRlKHdzZGxkb2MsIHZhbEluZm8pOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVmFsaWRhdGVXU0RMRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfUFJPQkxFTV9XU0RMX1ZBTElEQVRPUiwgd3NkbE5hbWVzcGFjZSksIDEsIDEsIHZhbEluZm8uZ2V0RmlsZVVSSSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhlIHZhbGlkYXRvciBpcyBudWxsIGFuZCB0aGUgbmFtZXNwYWNlIGlzbid0IGNyZWF0ZSBhbiBlcnJvci4KLSAgICAgICAgLy8gSWYgdGhlIG5hbWVzcGFjZSBpcyBudWxsIHRoZSBmaWxlIGlzIGVtcHR5IChhbmQgdGhlIFhNTCB2YWxpZGF0b3IKLSAgICAgICAgLy8gaGFzIGxldCBpdCBnbykKLSAgICAgICAgLy8gc28gaXQgaXMgdmFsaWQgYnV0IGRvZXMgbm90IG5lZWQgdG8gYmUgdmFsaWRhdGVkLgotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PX1dTRExfVkFMSURBVE9SLCB3c2RsTmFtZXNwYWNlKSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgdmFsSW5mby5nZXRGaWxlVVJJKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIE5vIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZC4KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fV1NETF9WQUxJREFUT1IsIHdzZGxOYW1lc3BhY2UpLCAxLCAxLCB2YWxJbmZvLmdldEZpbGVVUkkoKSk7Ci0gICAgfQotICAgIHZhbEluZm8uY29tcGxldGVXU0RMVmFsaWRhdGlvbigpOwotCi0gICAgcmV0dXJuIHZhbEluZm8uaXNXU0RMVmFsaWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgV1NETCBmaWxlIHdpdGggdGhlIGV4dGVuc2lvbiB2YWxpZGF0b3IuIFNldCB0aGUgZXJyb3JzIGFuZCB3YXJuaW5nIGFwcHJvcHJpYXRlbHkuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbGRvYyBBIFczQyBkb2N1bWVudCByZXByZXNlbnRhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIHdzZGxOYW1lc3BhY2UgVGhlIFdTREwgbmFtZXNwYWNlIHRvIHZhbGlkYXRlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRXh0ZW5zaW9uVmFsaWRhdG9ycyhEb2N1bWVudCB3c2RsZG9jLCBDb250cm9sbGVyVmFsaWRhdGlvbkluZm8gdmFsSW5mbywgU3RyaW5nIHdzZGxOYW1lc3BhY2UpCi0gIHsKLSAgICBXU0RMVmFsaWRhdG9yRGVsZWdhdGVbXSBleHRWYWxzID0gdmVyLnF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkod3NkbE5hbWVzcGFjZSwgVmFsaWRhdG9yUmVnaXN0cnkuRVhUX1ZBTElEQVRPUik7Ci0gICAgaWYoZXh0VmFscyAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBudW12YWxzID0gZXh0VmFscy5sZW5ndGg7Ci0gICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtdmFsczsgaSsrKQotICAgICAgewotICAgICAgICBXU0RMVmFsaWRhdG9yRGVsZWdhdGUgZXh0dmFsZGVsID0gZXh0VmFsc1tpXTsKLSAgICAgICAgSVdTRExWYWxpZGF0b3IgZXh0dmFsID0gZXh0dmFsZGVsLmdldFZhbGlkYXRvcigpOwotICAgICAgICBpZihleHR2YWwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICBleHR2YWwudmFsaWRhdGUod3NkbGRvYywgdmFsSW5mbyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoKFRocm93YWJsZSAgdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZFdhcm5pbmcobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX1BST0JMRU1fRVhUX1ZBTElEQVRPUiwgIGV4dHZhbGRlbC5nZXRWYWxpZGF0b3JDbGFzc05hbWUoKSwgd3NkbE5hbWVzcGFjZSksIDEsIDEsIHZhbEluZm8uZ2V0RmlsZVVSSSgpKTsKLSAgICAgICAgICAgIC8vIFRoaXMgZXJyb3Igc2hvdWxkIGJlIGxvZ2dlZCBhbmQgbm90IGRpc3BsYXllZCB0byB0aGUgdXNlci4KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBSZXNvdXJjZUJ1bmRsZSBmb3IgdGhpcyBWYWxpZGF0b3JNYW5hZ2VyLgotICAgKiAKLSAgICogQHBhcmFtIHJiCi0gICAqICAgICAgICAgICAgVGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQuCi0gICAqIEBzZWUgI2dldFJlc291cmNlQnVuZGxlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIHJlc291cmNlYnVuZGxlID0gcmI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBSZXNvdXJjZUJ1bmRsZSBmb3IgdGhpcyBWYWxpZGF0aW9uQ29udHJvbGxlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHJlc291cmNlIGJ1bmRsZSBzZXQgZm9yIHRoaXMgVmFsaWRhdGlvbkNvbnRyb2xsZXIuCi0gICAqIEBzZWUgI3NldFJlc291cmNlQnVuZGxlCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlYnVuZGxlOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGEgRE9NIGRvY3VtZW50IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRvIHJlYWQKLSAgICogQHJldHVybiBUaGUgRE9NIG1vZGVsIG9mIHRoZSBXU0RMIGRvY3VtZW50IG9yIG51bGwgaWYgdGhlIGRvY3VtZW50IGNhbid0IGJlIHJlYWQuCi0gICAqLwotICBwcml2YXRlIERvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gQ2F0Y2ggYSBwcmVtYXR1cmUgRU9GIGVycm9yIHRvIGFsbG93IGVtcHR5IFdTREwgZmlsZXMgdG8gYmUgY29uc2lkZXJlZCB2YWxpZC4KLSAgICAgIFN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IFN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbigpCi0gICAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBYTUxFcnJvclJlcG9ydGVyIGNyZWF0ZUVycm9yUmVwb3J0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYTUxFcnJvclJlcG9ydGVyKCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmd1bWVudHMsIHNob3J0IHNldmVyaXR5KSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJvb2xlYW4gcmVwb3J0RXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscygiUHJlbWF0dXJlRU9GIikpCi0gICAgICAgICAgICAgIHsgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXBvcnRFcnJvciA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucmVwb3J0RXJyb3IoZG9tYWluLCBrZXksIGFyZ3VtZW50cywgc2V2ZXJpdHkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIAotICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBudWxsOwotICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0gICAgICB7IC8vdGhlbiB3ZSB3YW50IHRvIGNyZWF0ZSBhIERPTSBmcm9tIHRoZSBpbnB1dHN0cmVhbQotICAgICAgICBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbnB1dFN0cmVhbSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7IGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIERPTVBhcnNlciBidWlsZGVyID0gbmV3IExpbmVOdW1iZXJET01QYXJzZXIoY29uZmlndXJhdGlvbik7Ci0gICAgICBidWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLSAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnQoKTsKLQotICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHQpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0V1NETE5hbWVzcGFjZShEb2N1bWVudCBkb2MpCi0gIHsKLSAgICBTdHJpbmcgd3NkbG5zID0gbnVsbDsKLSAgICBpZihkb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGRlZmluaXRpb25zID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgaWYoZGVmaW5pdGlvbnMuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJkZWZpbml0aW9ucyIpKQotICAgICAgewotICAgICAgICB3c2RsbnMgPSBkZWZpbml0aW9ucy5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHdzZGxuczsKLSAgfQotICAKLSAgCi0gIAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBjcmVhdGVTdHJpbmdGb3JJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkKLSAgewotICAgIC8vIEhlcmUgd2UgYXJlIHJlYWRpbmcgdGhlIGZpbGUgYW5kIHN0b3JpbmcgdG8gYSBzdHJpbmdidWZmZXIuCi0gICAgU3RyaW5nQnVmZmVyIGZpbGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaW5wdXRSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pOwotICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlucHV0UmVhZGVyKTsKLSAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzEwMjRdOwotICAgICAgaW50IG51bWJlclJlYWQgPSByZWFkZXIucmVhZChjaGFycyk7Ci0gICAgICB3aGlsZSAobnVtYmVyUmVhZCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgZmlsZVN0cmluZy5hcHBlbmQoY2hhcnMsIDAsIG51bWJlclJlYWQpOwotICAgICAgICBudW1iZXJSZWFkID0gcmVhZGVyLnJlYWQoY2hhcnMpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9UT0RPOiBsb2cgZXJyb3IgbWVzc2FnZQotICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gZmlsZVN0cmluZy50b1N0cmluZygpOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uSW5mb0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkluZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTE5MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uSW5mb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiBpbmZvIGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25JbmZvSW1wbCBpbXBsZW1lbnRzIElWYWxpZGF0aW9uUmVwb3J0LCBDb250cm9sbGVyVmFsaWRhdGlvbkluZm8KLXsKLSAgcHJpdmF0ZSBib29sZWFuIFdSQVBQRVJfRVJST1JfU1VQUE9SVF9FTkFCTEVEID0gdHJ1ZTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1dBUk5fTk9fVkFMRElBVE9SID0gIl9XQVJOX05PX1ZBTERJQVRPUiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9SRUZfRklMRV9FUlJPUl9NRVNTQUdFID0gIl9SRUZfRklMRV9FUlJPUl9NRVNTQUdFIjsKLSAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGluZ19maWxlX3VyaSA9IG51bGw7Ci0gIHByaXZhdGUgVVJMIHZhbGlkYXRpbmdfZmlsZV91cmwgPSBudWxsOwotICBwcml2YXRlIGJvb2xlYW4gd3NkbFZhbGlkID0gZmFsc2U7Ci0gIHByaXZhdGUgTGlzdCBtZXNzYWdlcyA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBMaXN0IHNjaGVtYXMgPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgTGlzdCBuc05vVmFscyA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3IgPSBudWxsOwotICBwcml2YXRlIGJvb2xlYW4gaGFzZXJyb3JzID0gZmFsc2U7Ci0gIHByaXZhdGUgSGFzaE1hcCBuZXN0ZWRNZXNzYWdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gIHByaXZhdGUgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIgPSBudWxsOwotICBwcml2YXRlIEhhc2h0YWJsZSBhdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogICAgICAgICAgICBUaGUgVVJJIG9mIHRoZSBmaWxlIGZvciB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uSW5mb0ltcGwoU3RyaW5nIHVyaSwgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yKQotICB7Ci0gICAgdGhpcy52YWxpZGF0aW5nX2ZpbGVfdXJpID0gdXJpOwotICAgIGlmKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVyaSA9IHVyaS5yZXBsYWNlQWxsKCIlMjAiLCIgIik7Ci0gICAgICB0aGlzLnZhbGlkYXRpbmdfZmlsZV91cmkgPSB1cmk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgdGhpcy52YWxpZGF0aW5nX2ZpbGVfdXJsID0gbmV3IFVSTCh1cmkpOwotICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHRoaXMubWVzc2FnZWdlbmVyYXRvciA9IG1lc3NhZ2VnZW5lcmF0b3I7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvblJlcG9ydCNnZXRGaWxlVVJJKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdGluZ19maWxlX3VyaTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQjaXNXU0RMVmFsaWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXU0RMVmFsaWQoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxWYWxpZDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25JbmZvI2FkZEVycm9yKGphdmEubGFuZy5TdHJpbmcsCi0gICAqICAgICAgaW50LCBpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4pCi0gIHsKLSAgICBhZGRFcnJvcihtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHZhbGlkYXRpbmdfZmlsZV91cmkpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uSW5mbyNhZGRFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotICAgKiAgICAgIGludCwgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgaWYoYWRkTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsLlNFVl9FUlJPUikpCi0gICAgewotICAgICAgaGFzZXJyb3JzID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgewotICAgIGlmKGFkZE1lc3NhZ2UobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIFZhbGlkYXRpb25NZXNzYWdlSW1wbC5TRVZfRVJST1IsIGVycm9yS2V5LCBtZXNzYWdlQXJndW1lbnRzKSkKLSAgICB7Ci0gICAgICBoYXNlcnJvcnMgPSB0cnVlOwotICAgIH0KLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25JbmZvI2FkZFdhcm5pbmcoamF2YS5sYW5nLlN0cmluZywKLSAgICogICAgICBpbnQsIGludCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uKQotICB7Ci0gICAgYWRkV2FybmluZyhtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHZhbGlkYXRpbmdfZmlsZV91cmkpOwotICB9Ci0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25JbmZvI2FkZFdhcm5pbmcoamF2YS5sYW5nLlN0cmluZywKLSAgICogICAgICBpbnQsIGludCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgYWRkTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsLlNFVl9XQVJOSU5HKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIG1lc3NhZ2UgdG8gdGhlIGxpc3QuIEEgbWVzc2FnZSBtYXkgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0IGluIAotICAgKiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgc3VjaCBhcyB3aGVuIHRoZSBVUkkgaXMgaW52YWxpZCBvciB0aGUgbWVzc2FnZSAKLSAgICogaXMgbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbWVzc2FnZSB3YXMgYWJsZSB0byBiZSBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBpbnQgc2V2ZXJpdHkpCi0gIHsKLSAgICAgIHJldHVybiB0aGlzLmFkZE1lc3NhZ2UobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIHNldmVyaXR5LCBudWxsLCBudWxsKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIG1lc3NhZ2UgdG8gdGhlIGxpc3QuIEEgbWVzc2FnZSBtYXkgbm90IGJlIGFkZGVkIHRvIHRoZSBsaXN0IGluIAotICAgKiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgc3VjaCBhcyB3aGVuIHRoZSBVUkkgaXMgaW52YWxpZCBvciB0aGUgbWVzc2FnZSAKLSAgICogaXMgbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBlcnJvcktleSBUaGUgWGVyY2VzIEVycm9yIEtleQotICAgKiBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyBUaGUgWGVyY2VzIGFyZ3VtZW50cyB1c2VkIHRvIGNyZWF0ZSB0aGUgZXJyb3IgbWVzc2FnZQotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG1lc3NhZ2Ugd2FzIGFibGUgdG8gYmUgYWRkZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGRNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgaW50IHNldmVyaXR5LCBTdHJpbmcgZXJyb3JLZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsKLSAgICBib29sZWFuIHN1Y2Nlc3NmdWxseUFkZGVkID0gZmFsc2U7Ci0gICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgbnVsbCB0aGVyZSBpcyBub3RoaW5nIHRvIHJlcG9ydC4KLSAgICBpZihtZXNzYWdlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHN1Y2Nlc3NmdWxseUFkZGVkOwotICAgIH0KLSAgICBTdHJpbmcgZXJyb3JVUkkgPSB1cmk7Ci0gICAgVVJMIGVycm9yVVJMID0gbnVsbDsKLSAgICBpZiAoZXJyb3JVUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZXJyb3JVUkkgPSBlcnJvclVSSS5yZXBsYWNlQWxsKCIlMjAiLCAiICIpOwotICAgICAgICBlcnJvclVSTCA9IG5ldyBVUkwoZXJyb3JVUkkpOwotICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICAvL2Vycm9yVVJJID0gbm9ybWFsaXplVVJJKGVycm9yVVJJKTsKLSAgICB9Ci0vLyAgICBlbHNlCi0vLyAgICB7Ci0vLyAgICAgIGVycm9yVVJJID0gdmFsaWRhdGluZ19maWxlX3VyaTsKLS8vICAgICAgZXJyb3JVUkwgPSB2YWxpZGF0aW5nX2ZpbGVfdXJsOwotLy8gICAgfQotICAgIC8vYm9vbGVhbiBkb0RpYWxvZyA9IHRydWU7Ci0gICAgaWYgKGVycm9yVVJMICE9IG51bGwpCi0gICAgewotICAgICAgc3VjY2Vzc2Z1bGx5QWRkZWQgPSB0cnVlOwotICAgICAgLy8gQWRkIHRvIHRoZSBhcHByb3ByaWF0ZSBsaXN0IGlmIG5lc3RlZCBlcnJvciBzdXBwb3J0IGlzIG9mZiBvcgotICAgICAgLy8gdGhpcyBtZXNzYWdlIGlzIGZvciB0aGUgY3VycmVudCBmaWxlLgotICAgICAgaWYgKCFXUkFQUEVSX0VSUk9SX1NVUFBPUlRfRU5BQkxFRCB8fCB2YWxpZGF0aW5nX2ZpbGVfdXJsLnNhbWVGaWxlKGVycm9yVVJMKSkKLSAgICAgIHsKLQotICAgICAgICBWYWxpZGF0aW9uTWVzc2FnZUltcGwgdmFsbWVzID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlSW1wbChtZXNzYWdlLCBsaW5lLAotICAgICAgICAgICAgY29sdW1uLCBzZXZlcml0eSwgdXJpLCBlcnJvcktleSwgbWVzc2FnZUFyZ3VtZW50cyk7Ci0gICAgICAgIG1lc3NhZ2VzLmFkZCh2YWxtZXMpOwotICAgICAgfQotICAgICAgLy8gSWYgbmVzdGVkIGVycm9yIHN1cHBvcnQgaXMgZW5hYmxlZCBjcmVhdGUgYSBuZXN0ZWQgZXJyb3IuCi0gICAgICBlbHNlIGlmIChXUkFQUEVSX0VSUk9SX1NVUFBPUlRfRU5BQkxFRCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5lc3RlZHVyaSA9IGVycm9yVVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlSW1wbCBuZXN0ZWRtZXNzID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlSW1wbChtZXNzYWdlLCBsaW5lLAotICAgICAgICAgICAgY29sdW1uLCBzZXZlcml0eSwgbmVzdGVkdXJpKTsKLQotICAgICAgICBWYWxpZGF0aW9uTWVzc2FnZUltcGwgY29udGFpbmVyID0gKFZhbGlkYXRpb25NZXNzYWdlSW1wbCkgbmVzdGVkTWVzc2FnZXMuZ2V0KG5lc3RlZHVyaSk7Ci0gICAgICAgIGlmKGNvbnRhaW5lciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSW5pdGlhbGx5IHNldCB0aGUgbmVzdGVkIGVycm9yIHRvIGEgd2FybmluZy4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2hhbmdlZAotICAgICAgICAgIC8vIHRvIGFuIGVycm9yIGlmIGEgbmVzdGVkIG1lc3NhZ2UgaGFzIGEgc2V2ZXJpdHkgb2YgZXJyb3IuCi0gICAgICAgICAgY29udGFpbmVyID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlSW1wbChtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSwgbmVzdGVkdXJpKSwgMSwgMCwgSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9XQVJOSU5HLCBuZXN0ZWR1cmkpOwotICAgICAgICAgIG5lc3RlZE1lc3NhZ2VzLnB1dChuZXN0ZWR1cmksIGNvbnRhaW5lcik7Ci0gICAgICAgICAgbWVzc2FnZXMuYWRkKGNvbnRhaW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGFpbmVyLmFkZE5lc3RlZE1lc3NhZ2UobmVzdGVkbWVzcyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3NmdWxseUFkZGVkOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvblJlcG9ydCNnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKQotICAgKi8KLSAgcHVibGljIElWYWxpZGF0aW9uTWVzc2FnZVtdIGdldFZhbGlkYXRpb25NZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gKElWYWxpZGF0aW9uTWVzc2FnZVtdKW1lc3NhZ2VzLnRvQXJyYXkobmV3IElWYWxpZGF0aW9uTWVzc2FnZVttZXNzYWdlcy5zaXplKCldKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25JbmZvI2FkZE5hbWVzcGFjZVdpdGhOb1ZhbGlkYXRvcihqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlV2l0aE5vVmFsaWRhdG9yKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICAvLyBJZiB0aGUgbGlzdCBkb2Vzbid0IGFscmVhZHkgY29udGFpbiB0aGlzIG5hbWVzcGFjZSwgYWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgLy8gYW5kIGNyZWF0ZSBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICBpZiAoIW5zTm9WYWxzLmNvbnRhaW5zKG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgbnNOb1ZhbHMuYWRkKG5hbWVzcGFjZSk7Ci0gICAgICBhZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9XQVJOX05PX1ZBTERJQVRPUiwgbmFtZXNwYWNlKSwgMSwgMCk7Ci0KLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuQ29udHJvbGxlclZhbGlkYXRpb25JbmZvI2NvbXBsZXRlV1NETFZhbGlkYXRpb24oKQotICAgKi8KLSAgcHVibGljIHZvaWQgY29tcGxldGVXU0RMVmFsaWRhdGlvbigpCi0gIHsKLSAgICBpZiAoaGFzZXJyb3JzKQotICAgIHsKLSAgICAgIHdzZGxWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgd3NkbFZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uUmVwb3J0I2hhc0Vycm9ycygpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKQotICB7Ci0gICAgcmV0dXJuIGhhc2Vycm9yczsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydCNnZXROZXN0ZWRNZXNzYWdlcygpCi0gICAqLwotICBwdWJsaWMgSGFzaE1hcCBnZXROZXN0ZWRNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gbmVzdGVkTWVzc2FnZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gIAl0aGlzLnVyaVJlc29sdmVyID0gdXJpUmVzb2x2ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJVVJJUmVzb2x2ZXIgZ2V0VVJJUmVzb2x2ZXIoKQotICB7Ci0gIAlyZXR1cm4gdXJpUmVzb2x2ZXI7Ci0gIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuVmFsaWRhdGlvbkluZm8jZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIAotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKEhhc2h0YWJsZSBhdHRyaWJ1dGVzKQotCXsKLQkJdGhpcy5hdHRyaWJ1dGVzLnB1dEFsbChhdHRyaWJ1dGVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25NZXNzYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uTWVzc2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3ZmMxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25NZXNzYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBBIHZhbGlkYXRpb24gbWVzc2FnZSBpcyBjcmVhdGVkIHdoZW4gdGhlcmUgaXMgaW5mb3JtYXRpb24gdG8gcmVwb3J0IGZyb20KLSAqIHZhbGlkYXRpbmcgYSBXU0RMIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsIGltcGxlbWVudHMgSVZhbGlkYXRpb25NZXNzYWdlCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZTsKLSAgcHJvdGVjdGVkIGludCBsaW5lTnVtYmVyOwotICBwcm90ZWN0ZWQgaW50IGNvbHVtbk51bWJlcjsKLSAgcHJvdGVjdGVkIFN0cmluZyB1cmk7Ci0gIHByb3RlY3RlZCBpbnQgc2V2ZXJpdHkgPSBTRVZfRVJST1I7Ci0gIHByb3RlY3RlZCBMaXN0IG5lc3RlZEVycm9yczsKLSAgcHJvdGVjdGVkIFN0cmluZyBlcnJvcktleSA9IG51bGw7Ci0gIHByb3RlY3RlZCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gbGluZU51bWJlciBUaGUgbGluZSB3aGVyZSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgZGlzcGxheWVkLgotICAgKiBAcGFyYW0gY29sdW1uTnVtYmVyIFRoZSBjb2x1bW4gd2hlcmUgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGRpc3BsYXllZC4KLSAgICogQGRlcHJlY2F0ZWQgVXNlIGNvbnRydWN0b3Igd2l0aCBVUkkgcGFyYW1ldGVyLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlSW1wbChTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIsIGludCBzZXZlcml0eSkKLSAgewotICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCBzZXZlcml0eSwgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEFsbG93cyBzcGVjaWZ5aW5nIGEgdXJpIGZvciB0aGUgcmVmZXJlbmNlIHRoYXQgdGhlIG1lc3NhZ2UgcmVmZXJzIHRvLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGxpbmVOdW1iZXIgVGhlIGxpbmUgd2hlcmUgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGRpc3BsYXllZC4KLSAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIHdoZXJlIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0gICAqIEBwYXJhbSB1cmkgVGhlIHVyaSBvZiB0aGUgcmVmZXJlbmNlIGZpbGUgZm9yIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlSW1wbChTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIsIGludCBzZXZlcml0eSwgU3RyaW5nIHVyaSkKLSAgewotICAgICAgdGhpcyhtZXNzYWdlLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIHNldmVyaXR5LCB1cmksIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEFsbG93cyBzcGVjaWZ5aW5nIGEgdXJpIGZvciB0aGUgcmVmZXJlbmNlIHRoYXQgdGhlIG1lc3NhZ2UgcmVmZXJzIHRvLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGxpbmVOdW1iZXIgVGhlIGxpbmUgd2hlcmUgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGRpc3BsYXllZC4KLSAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIHdoZXJlIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0gICAqIEBwYXJhbSB1cmkgVGhlIHVyaSBvZiB0aGUgcmVmZXJlbmNlIGZpbGUgZm9yIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gZXJyb3JLZXkgVGhlIFhlcmNlcyBFcnJvciBrZXkKLSAgICogQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgVGhlIHZhbHVlcyB1c2VkIHRvICJmaWxsIGluIHRoZSBibGFua3MiIG9mIGEgWGVyY2VzIGVycm9yIE1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZUltcGwoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBpbnQgc2V2ZXJpdHksIFN0cmluZyB1cmksIFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgewotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLSAgICB0aGlzLmNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLSAgICB0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0gICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgdGhpcy5lcnJvcktleSA9IGVycm9yS2V5OwotICAgIHRoaXMubWVzc2FnZUFyZ3VtZW50cyA9IG1lc3NhZ2VBcmd1bWVudHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gbnVtYmVyIHdoZXJlIHRoZSBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldENvbHVtbigpCi0gIHsKLSAgICByZXR1cm4gY29sdW1uTnVtYmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGluZSBudW1iZXIgd2hlcmUgdGhlIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZSgpCi0gIHsKLSAgICByZXR1cm4gbGluZU51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiByZXR1cm5zIHRoZSB1cmkgb2YgdGhlIHJlZmVyZW5jZSBmaWxlIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgdXJpIG9mIHRoZSByZXNvdXJjZSB0aGF0IHRoZSBtZXNzYWdlIHJlZmVycyB0by4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLSAgewotICAgIHJldHVybiB1cmk7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbk1lc3NhZ2UjZ2V0U2V2ZXJpdHkoKQotICAgKi8KLSAgcHVibGljIGludCBnZXRTZXZlcml0eSgpCi0gIHsKLSAgICByZXR1cm4gc2V2ZXJpdHk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBzZXZlcml0eSkKLSAgewotICAgIGlmKHNldmVyaXR5ID09IFNFVl9FUlJPUiB8fCBzZXZlcml0eSA9PSBTRVZfV0FSTklORykKLSAgICB7Ci0gICAgICB0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZSB0byB0aGlzIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0aW9uTWVzc2FnZSBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlIHRvIGFkZCBhcyBhIG5lc3RlZCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTmVzdGVkTWVzc2FnZShJVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UpCi0gIHsKLSAgICBpZiAobmVzdGVkRXJyb3JzID09IG51bGwpCi0gICAgewotICAgICAgbmVzdGVkRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLSAgICBuZXN0ZWRFcnJvcnMuYWRkKHZhbGlkYXRpb25NZXNzYWdlKTsKLSAgICBpbnQgdmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0gICAgaWYodmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9PSBTRVZfRVJST1IpCi0gICAgewotICAgICAgc2V0U2V2ZXJpdHkoU0VWX0VSUk9SKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBsaXN0IG9mIG5lc3RlZCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGlzdCBvZiBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldE5lc3RlZE1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBuZXN0ZWRFcnJvcnMgIT0gbnVsbCA/IG5lc3RlZEVycm9ycyA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gdGhlIGVycm9yIGtleQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFcnJvcktleSgpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JLZXk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gZXJyb3JLZXkgdGhlIGVycm9yIGtleSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVycm9yS2V5KFN0cmluZyBlcnJvcktleSkKLSAgewotICAgIHRoaXMuZXJyb3JLZXkgPSBlcnJvcktleTsKLSAgfQotICAvKioKLSAgICogQHJldHVybiB0aGUgWGVyY2VzIG1lc3NhZ2UgYXJndW1lbnRzIHVzZWQgdG8gImZpbGwgaW4gdGhlIGJsYW5rcyIgb2YgdGhlIG1lc3NhZ2VzCi0gICAqLwotICBwdWJsaWMgT2JqZWN0W10gZ2V0TWVzc2FnZUFyZ3VtZW50cygpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZUFyZ3VtZW50czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODJjYTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotCi0vKioKLSAqIEEgcmVnaXN0cnkgb2YgSVdTRExWYWxpZGF0b3IgdmFsaWRhdG9ycy4gVGhpcyBob2xkcyB0aGUgdG9wIGxldmVsIFdTREwgYW5kIFdTLUkgdmFsaWRhdG9ycy4KLSAqIFZhbGlkYXRvcnMgYXJlIHJlZ2lzdGVyZWQgYnkgdGhlIG5hbWVzcGFjZSB0aGV5IHZhbGlkYXRlLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yUmVnaXN0cnkKLXsKLSAgLyoqCi0gICAqIFRoZSBXU0RMIHZhbGlkYXRvciB0eXBlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIFdTRExfVkFMSURBVE9SID0gbmV3IEludGVnZXIoMCk7Ci0gIC8qKgotICAgKiBUaGUgV1MtSSB2YWxpZGF0b3IgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZWdlciBFWFRfVkFMSURBVE9SID0gbmV3IEludGVnZXIoMSk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgVmFsaWRhdG9yUmVnaXN0cnkgdmVySW5zdGFuY2U7Ci0gIC8qCi0gICAgVGhpcyBpcyBhIE1hcCBvZiBNYXBzLiBUaGUgdG9wLWxldmVsIE1hcCBpcyBrZXllZCBieSAoQ2xhc3MpcGFyZW50VHlwZSwKLSAgICBhbmQgdGhlIGlubmVyIE1hcHMgYXJlIGtleWVkIGJ5IChRTmFtZSllbGVtZW50VHlwZS4KLSAgICBUaGlzIGlkZWEgaXMgdGhlIHNhbWUgYXMgaXMgZG9uZSBpbiBXU0RMNEoKLSAgKi8KLSAgcHJvdGVjdGVkIE1hcCB2YWxpZGF0b3JSZWcgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgcHJvdGVjdGVkIEl0ZXJhdG9yIGRlZmF1bHRWYWxpZGF0b3JJdGVyYXRvcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgVmFsaWRhdG9yUmVnaXN0cnkoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5zdGFuY2Ugb2YgdGhlIHJlZ2lzdHJ5LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgaW5zdGFuY2Ugb2YgdGhlIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBWYWxpZGF0b3JSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAodmVySW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB2ZXJJbnN0YW5jZSA9IG5ldyBWYWxpZGF0b3JSZWdpc3RyeSgpOwotICAgIH0KLSAgICByZXR1cm4gdmVySW5zdGFuY2U7Ci0gIH0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoaXMgdmFsaWRhdG9yIG9mIHRoZSBnaXZlbiB0eXBlIHdpdGggdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSB0aGUgdmFsaWRhdG9yIHZhbGlkYXRlcy4KLSAgICogQHBhcmFtIHZhbERlbGVnYXRlIFRoZSB2YWxpZGF0b3IgZGVsZWdhdGUgdG8gcmVnaXN0ZXIuCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdG9yKFN0cmluZyBuYW1lc3BhY2UsIFdTRExWYWxpZGF0b3JEZWxlZ2F0ZSB2YWxEZWxlZ2F0ZSwgSW50ZWdlciB0eXBlKQotICB7Ci0gICAgLy8gYWxsb3cgdGhlIG51bGwgbmFtZXNwYWNlIGJ1dCBtYWtlIGl0IHRoZSBlbXB0eSBzdHJpbmcKLSAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gIiI7Ci0gICAgfQotCi0gICAgLy8gZ2V0IHRoZSBoYXN0YWJsZSBmb3IgdGhlIHR5cGUgb2YgdmFsaWRhdG9yIHdlIHdhbnQKLSAgICBIYXNodGFibGUgdHlwZVZhbGlkYXRvclJlZyA9IChIYXNodGFibGUpdmFsaWRhdG9yUmVnLmdldCh0eXBlKTsKLSAgICAvLyBpZiBpdCdzIG51bGwgaWYgbWVhbnMgd2UgaGF2ZW4ndCBkZWZpbmVkIHRoaXMgdHlwZSBvZiB2YWxpZGF0b3IgeWV0Ci0gICAgaWYgKHR5cGVWYWxpZGF0b3JSZWcgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0eXBlVmFsaWRhdG9yUmVnID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgdmFsaWRhdG9yUmVnLnB1dCh0eXBlLCB0eXBlVmFsaWRhdG9yUmVnKTsKLSAgICB9Ci0gICAgCi0gICAgICBMaXN0IG5hbWVzcGFjZXZhbHMgPSAoTGlzdCl0eXBlVmFsaWRhdG9yUmVnLmdldChuYW1lc3BhY2UpOwotICAgICAgaWYobmFtZXNwYWNldmFscyA9PSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lc3BhY2V2YWxzID0gbmV3IFZlY3RvcigpOwotICAgICAgICB0eXBlVmFsaWRhdG9yUmVnLnB1dChuYW1lc3BhY2UsIG5hbWVzcGFjZXZhbHMpOwotICAgICAgfQotICAgICAgbmFtZXNwYWNldmFscy5hZGQodmFsRGVsZWdhdGUpOwotCi0gIH0KLSAgLyoqCi0gICAqIEFzayBmb3IgdGhlIHZhbGlkYXRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBuYW1lc3BhY2UuIElmIG5vbmUgaXMgZm91bmQKLSAgICogcmV0dXJuIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgZm9yIHRoZSB2YWxpZGF0b3IgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHZhbGlkYXRvciB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC4KLSAgICogQHJldHVybiBBbiBhcnJheSBvZiB2YWxpZGF0b3IgZGVsZWdhdGVzIGlmIGF0IGxlYXN0IG9uZSBpcyByZWdpc3RlcmVkLCBudWxsIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBXU0RMVmFsaWRhdG9yRGVsZWdhdGVbXSBxdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KFN0cmluZyBuYW1lc3BhY2UsIEludGVnZXIgdHlwZSkKLSAgewotICAgIElXU0RMVmFsaWRhdG9yIHdzZGx2YWwgPSBudWxsOwotICAgIC8vIGlmIHRoZSBuYW1lc3BhY2UgaXMgbnVsbCBhbGxvdyBpdCBhbmQgdHJlYXQgaXQgYXMgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0gICAgSGFzaHRhYmxlIHR5cGVWYWxpZGF0b3JSZWcgPSAoSGFzaHRhYmxlKXZhbGlkYXRvclJlZy5nZXQodHlwZSk7Ci0gICAgaWYgKHR5cGVWYWxpZGF0b3JSZWcgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotICAgIExpc3QgdmFsZGVscyA9IChMaXN0KXR5cGVWYWxpZGF0b3JSZWcuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgaWYodmFsZGVscyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiAoV1NETFZhbGlkYXRvckRlbGVnYXRlW10pdmFsZGVscy50b0FycmF5KG5ldyBXU0RMVmFsaWRhdG9yRGVsZWdhdGVbdmFsZGVscy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSB2YWxpZGF0b3IgcmVnaXN0ZXJlZCBvZiB0aGUgZ2l2ZW4gdHlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHZhbGlkYXRvci4KLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIHZhbGlkYXRvci4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGEgdmFsaWRhdG9yIHJlZ2lzdGVyZWQgZm9yIHRoZSBuYW1lc3BhY2UsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1JlZ2lzdGVyZWRWYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSwgSW50ZWdlciB0eXBlKQotICB7Ci0gICAgaWYgKHF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkobmFtZXNwYWNlLCB0eXBlKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvV1NETFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9XU0RMVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYTZlNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9XU0RMVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5VUklSZXNvbHZlcjsKLQotLyoqCi0gKiBBbiBtYWluIFdTREwgdmFsaWRhdG9yIGNsYXNzLiBUaGUgV1NETCB2YWxpZGF0b3IgdmFsaWRhdGVzIFdTREwgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRvcgotewotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURBVE9SX1JFU09VUkNFX0JVTkRMRSA9ICJ2YWxpZGF0ZXdzZGwiOwotICBwcml2YXRlIFZhbGlkYXRpb25Db250cm9sbGVyIHZhbGlkYXRpb25Db250cm9sbGVyOwotICBwcml2YXRlIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyOwotICBwcml2YXRlIEhhc2h0YWJsZSBhdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTRExWYWxpZGF0b3IoKQotICB7Ci0gICAgUmVzb3VyY2VCdW5kbGUgcmIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoVkFMSURBVE9SX1JFU09VUkNFX0JVTkRMRSk7Ci0gICAgdXJpUmVzb2x2ZXIgPSBuZXcgVVJJUmVzb2x2ZXIoKTsKLSAgICB2YWxpZGF0aW9uQ29udHJvbGxlciA9IG5ldyBWYWxpZGF0aW9uQ29udHJvbGxlcihyYiwgdXJpUmVzb2x2ZXIpOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIFdTREwgZmlsZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBsb2NhdGlvbiBvZiB0aGUgV1NETCBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcmV0dXJuIEEgdmFsaWRhdGlvbiByZXBvcnQgc3VtbWFyaXppbmcgdGhlIHJlc3VsdHMgb2YgdGhlIHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgSVZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSkKLSAgewotICAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogVmFsaWRhdGUgdGhlIGlucHV0U3RyZWFtCi0gICAqIEBwYXJhbSB1cmkgVGhlIGxvY2F0aW9uIG9mIHRoZSBXU0RMIGZpbGUgYmVpbmcgdmFsaWRhdGVkCi0gICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBUaGUgc3RyZWFtIHRvIHZhbGlkYXRlCi0gICAqIEByZXR1cm4gQSBWYWxpZGF0aW9uIHJlcG9ydCBzdW1tYXJpemluZyB0aGUgcmVzdWx0cyBvZiB0aGUgdmFsaWRhdGlvbgotICAgKi8KLSAgcHVibGljIElWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0gICAgaWYodXJpID09IG51bGwpIAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgdmFsaWRhdGlvbkNvbnRyb2xsZXIuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLSAgICByZXR1cm4gdmFsaWRhdGlvbkNvbnRyb2xsZXIudmFsaWRhdGUoZm9ybWF0VVJJKHVyaSksIGlucHV0U3RyZWFtKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIFVSSSByZXNvbHZlciB0byB0aGUgV1NETCB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpUmVzb2x2ZXIgVGhlIFVSSSByZXNvbHZlciB0byBhZGQgdG8gdGhlIFdTREwgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVVJJUmVzb2x2ZXIoSVVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gIAl0aGlzLnVyaVJlc29sdmVyLmFkZFVSSVJlc29sdmVyKHVyaVJlc29sdmVyKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCBhbiBhdHRyaWJ1dGUgb24gdGhlIHZhbGlkYXRvci4gQW4gYXR0cmlidXRlIGlzCi0gICAqIGRlZmluZWQgYnkgYSBuYW1lIGFuZCBhIHZhbHVlIHBhaXIuIEFuIGF0dHJpYnV0ZSBtYXkKLSAgICogYmUgZGVmaW5lZCBmb3IgYW55IHZhbGlkYXRvciwgYnVpbHQgaW4gb3IgYW4gZXh0ZW5zaW9uLgotICAgKiBFeHRlbnNpb24gdmFsaWRhdG9ycyBjYW4gcHJvYmUgdGhlIGF0dHJpYnV0ZXMgc2V0IG9uCi0gICAqIHRoZSBXU0RMIHZhbGlkYXRvciB0byBjdXN0b21pemUgdGhlIHdheSBpbiB3aGljaCB0aGV5Ci0gICAqIHZhbGlkYXRlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWUgVGhlIGF0dHJpYnV0ZSBpZGVudGlmaWVyLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIGF0dHJpYnV0ZSBpdHNlbGYuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgewotICAJYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOwotICB9Ci0gIHByb3RlY3RlZCBTdHJpbmcgZm9ybWF0VVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICB1cmkgPSB1cmkucmVwbGFjZSgnXFwnLCcvJyk7Ci0gICAgaWYodXJpLnN0YXJ0c1dpdGgoImZpbGU6IikpCi0gIAl7Ci0gIAkgIHVyaSA9IHVyaS5zdWJzdHJpbmcoNik7Ci0gIAkgIHdoaWxlKHVyaS5zdGFydHNXaXRoKCJcXCIpIHx8IHVyaS5zdGFydHNXaXRoKCIvIikpCi0gIAkgIHsKLSAgCSAgCXVyaSA9IHVyaS5zdWJzdHJpbmcoMSk7Ci0gIAkgIH0KLSAgCSAgdXJpID0gImZpbGU6Ly8vIiArIHVyaTsKLSAgCX0KLSAgICByZXR1cm4gdXJpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1dTRExWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9XU0RMVmFsaWRhdG9yRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0MDc1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1dTRExWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLQotLyoqCi0gKiBBIGRlbGVnYXRlIGhvbGRzIGEgdmFsaWRhdG9yJ3MgaW5mb3JtYXRpb24gYW5kIGNhbiBpbnN0YW50aWF0ZSBpdAotICogd2hlbiByZXF1ZXN0ZWQgdG8uCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMVmFsaWRhdG9yRGVsZWdhdGUKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKLSAgcHJpdmF0ZSBJV1NETFZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBkZWxlZ2F0ZSBmb3IgYSB2YWxpZGF0b3IgYnkgaXRzIGNsYXNzIG5hbWUgYW5kIHJlc291cmNlIGJ1bmRsZSBuYW1lLgotICAgKiAKLSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzLgotICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBiYXNlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBXU0RMVmFsaWRhdG9yRGVsZWdhdGUoU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSwgU3RyaW5nIHJlc291cmNlQnVuZGxlKQotICB7Ci0gICAgdGhpcy52YWxpZGF0b3JDbGFzc25hbWUgPSB2YWxpZGF0b3JDbGFzc25hbWU7Ci0gICAgdGhpcy5yZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIGRlbGVnYXRlIGZvciBhIHZhbGlkYXRvciBieSBpdHMgY2xhc3MgbmFtZSwgcmVzb3VyY2UgYnVuZGxlIG5hbWUgYW5kIAotICAgKiBhIGNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSB2YWxpZGF0b3IgYW5kIGJ1bmRsZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgY2xhc3MgbG9hZGVyIHRvIHVzZSB0byBsb2FkIHRoZSB2YWxpZGF0b3IgYW5kIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBXU0RMVmFsaWRhdG9yRGVsZWdhdGUoU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSwgU3RyaW5nIHJlc291cmNlQnVuZGxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgewotICAgIHRoaXModmFsaWRhdG9yQ2xhc3NuYW1lLCByZXNvdXJjZUJ1bmRsZSk7Ci0gICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsaWRhdG9yIHNwZWNpZmllZCBpbiB0aGlzIGRlbGVnYXRlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgV1NETCB2YWxpZGF0b3Igc3BlY2lmaWVkIGJ5IHRoaXMgZGVsZWdhdGUuCi0gICAqLwotICBwdWJsaWMgSVdTRExWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkKLSAgICAgewotICAgICAgaWYoY2xhc3NMb2FkZXIgPT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgIGNsYXNzTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgfQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIENsYXNzIHZhbGlkYXRvckNsYXNzID0KLSAgICAgICAgY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyh2YWxpZGF0b3JDbGFzc25hbWUpIDogQ2xhc3MuZm9yTmFtZSh2YWxpZGF0b3JDbGFzc25hbWUpOwotCi0gICAgICAgIHZhbGlkYXRvciA9IChJV1NETFZhbGlkYXRvcil2YWxpZGF0b3JDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgIFJlc291cmNlQnVuZGxlIHZhbGlkYXRvckJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZSwgTG9jYWxlLmdldERlZmF1bHQoKSwgY2xhc3NMb2FkZXIpOwotICAgICAgICAgdmFsaWRhdG9yLnNldFJlc291cmNlQnVuZGxlKHZhbGlkYXRvckJ1bmRsZSk7Ci0gICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUT0RPOiBhZGQgbG9nZ2luZwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdmFsaWRhdG9yOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSB2YWxpZGF0b3IgY2xhc3MgbmFtZS4KLSAgICogQHJldHVybiBUaGUgdmFsaWRhdG9yIGNsYXNzIG5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdG9yQ2xhc3NuYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2V4Y2VwdGlvbi9WYWxpZGF0ZVdTRExFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZXhjZXB0aW9uL1ZhbGlkYXRlV1NETEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGU5Y2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvZXhjZXB0aW9uL1ZhbGlkYXRlV1NETEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0vKioKLSAqIEN1c3RvbSBleGNlcHRpb24gZm9yIFdTREwgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotCSAgLy9wdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBleGNlcHRpb24gbWVzc2FnZQotICAgKi8KLSAgcHVibGljIFZhbGlkYXRlV1NETEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKLQl7Ci0JICBzdXBlcihtZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL0lVUklSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9JVVJJUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5Yjc1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL0lVUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXI7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciB0aGUgV1NETCB2YWxpZGF0b3IncyBVUkkgcmVzb2x2ZXIgbWVjaGFuaXNtLiBUaGUgVVJJIHJlc29sdmVyCi0gKiBpcyB1c2VkIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIGFuIGVudGl0eS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJUmVzb2x2ZXIKLXsKLSAvKioKLSAgKiBSZXNvbHZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZW50aXR5IGRlc2NyaWJlZCBieSB0aGUgcHVibGljSWQgYW5kIHN5c3RlbUlkLgotICAqIAotICAqIEBwYXJhbSBiYXNlTG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSB0aGF0IGNvbnRhaW5zIHRoZSB1cmkuCi0gICogQHBhcmFtIHB1YmxpY0lkIEFuIG9wdGlvbmFsIHB1YmxpYyBpZGVudGlmaWVyIChpLmUuIG5hbWVzcGFjZSBuYW1lKSwgb3IgbnVsbCBpZiBub25lLgotICAqIEBwYXJhbSBzeXN0ZW1JZCBBbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkksIG9yIG51bGwgaWYgbm9uZS4KLSAgKiBAcmV0dXJuIEFuIGFic29sdXRlIFVSSSBmb3IgdGhlIHJlc291cmNlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9VUklSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9VUklSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2Q2MDBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2c7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgbWFpbiBVUkkgcmVzb2x2ZXIgdGhhdCBjYWxscyBvdXQgdG8gYWxsIG9mIHRoZSByZWdpc3RlcmVkCi0gKiBleHRlcm5hbCBVUkkgcmVzb2x2ZXJzIHRvIGxvY2F0ZSBhbiBlbnRpdHkuIElmIG5vbmUgb2YgdGhlIGV4dGVybmFsIHJlc29sdmVycwotICogY2FuIGxvY2F0ZSB0aGUgZW50aXR5IHRoZSByZXNvbHZlciB3aWxsIGFzayB0aGUgaW50ZXJuYWwgV1NETCB2YWxpZGF0b3IgWE1MCi0gKiBjYXRhbG9nIHRvIHJlc29sdmUgdGhlIGxvY2F0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXIgaW1wbGVtZW50cyBJVVJJUmVzb2x2ZXIsIFhNTEVudGl0eVJlc29sdmVyCi17Ci0gIHByaXZhdGUgTGlzdCBleHRVUklSZXNvbHZlcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gCi0gICAqLwotICBwdWJsaWMgVVJJUmVzb2x2ZXIoKQotICB7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBBZGQgYW4gZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmlSZXNvbHZlcgotICAgKiAgICAgICAgICBUaGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFVSSVJlc29sdmVyKElVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAgIGV4dFVSSVJlc29sdmVyc0xpc3QuYWRkKHVyaVJlc29sdmVyKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x2ZXIjcmVzb2x2ZShqYXZhLmxhbmcuU3RyaW5nLAotICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBJdGVyYXRvciByZXNvbHZlckl0ZXIgPSBleHRVUklSZXNvbHZlcnNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUocmVzb2x2ZXJJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSAoSVVSSVJlc29sdmVyKXJlc29sdmVySXRlci5uZXh0KCk7Ci0gICAgICBpZiAocmVzb2x2ZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSByZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmVxdWFscyhzeXN0ZW1JZCkpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHdlIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIGxvY2F0ZSB0aGUgcmVzdWx0IHlldCBhc2sgdGhlIGludGVybmFsIFhNTAotICAgIC8vIGNhdGFsb2cuCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsICYmIChwdWJsaWNJZCAhPSBudWxsIHx8IHN5c3RlbUlkICE9IG51bGwpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IFhNTENhdGFsb2cuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlRW50aXR5TG9jYXRpb24ocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICB9Ci0gICAgaWYocmVzdWx0ID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gIG5vcm1hbGl6ZShiYXNlTG9jYXRpb24sIHN5c3RlbUlkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXIpCi0gICAqLwotICBwdWJsaWMgWE1MSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShYTUxSZXNvdXJjZUlkZW50aWZpZXIgcmVzb3VyY2VJZGVudGlmaWVyKSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHB1YmxpY0lkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldFB1YmxpY0lkKCk7Ci0gICAgU3RyaW5nIHN5c3RlbUlkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldExpdGVyYWxTeXN0ZW1JZCgpOwotICAgIGlmIChwdWJsaWNJZCA9PSBudWxsIHx8IHB1YmxpY0lkLmVxdWFscygiIikpCi0gICAgewotICAgICAgcHVibGljSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIFN0cmluZyByZXN1bHQgPSByZXNvbHZlKHJlc291cmNlSWRlbnRpZmllci5nZXRCYXNlU3lzdGVtSWQoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICBYTUxJbnB1dFNvdXJjZSB4bWxJbnB1dFNvdXJjZSA9IG51bGw7Ci0gICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChyZXN1bHQpOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgIHhtbElucHV0U291cmNlID0gbmV3IFhNTElucHV0U291cmNlKHB1YmxpY0lkLCByZXN1bHQsIHJlc3VsdCwgaXMsIG51bGwpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHhtbElucHV0U291cmNlOwotICB9Ci0gIAotICAvKioKLSAgICogTm9ybWFsaXplIHRoZSBzeXN0ZW1JZC4gTWFrZSBpdCBhYnNvbHV0ZSB3aXRoIHJlc3BlY3QgdG8gdGhlCi0gICAqIGJhc2VMb2NhdGlvbiBpZiBuZWNlc3NhcnkuCi0gICAqIAotICAgKiBAcGFyYW0gYmFzZUxvY2F0aW9uIFRoZSBiYXNlIGxvY2F0aW9uIG9mIHRoZSBmaWxlLgotICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIHN5c3RlbSBpZCBvZiB0aGUgZmlsZS4KLSAgICogQHJldHVybiBBIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgc3lzdGVtIGlkLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gIAlpZihzeXN0ZW1JZCA9PSBudWxsKQotICAJewotICAJICByZXR1cm4gc3lzdGVtSWQ7Ci0gIAl9Ci0gIAkvLyBUcnkgdG8gZmluZCBhIHNjaGVtZSBpbiB0aGUgc3lzdGVtSWQuCi0gIAlpbnQgc2NoZW1hTG9jID0gc3lzdGVtSWQuaW5kZXhPZignOicpOwotICAJaWYoc2NoZW1hTG9jICE9IC0xICYmIHN5c3RlbUlkLmNoYXJBdChzY2hlbWFMb2MrMSkgPT0gJy8nKQotICAJewotICAJICAvLyBBIHNjaGVtZSBoYXMgYmVlbiBmb3VuZC4gVGhlIHN5c3RlbUlkIGlzIGFuCi0gIAkgIC8vIGFic29sdXRlIGxvY2F0aW9uIHNvIHJldHVybiBpdC4KLSAgCSAgcmV0dXJuIHN5c3RlbUlkOwotICAJfQotICAJaWYoYmFzZUxvY2F0aW9uID09IG51bGwpCi0gIAl7Ci0gIAkgIHJldHVybiBiYXNlTG9jYXRpb247Ci0gIAl9Ci0gIAkKLSAgCVN0cmluZyByZXN1bHQgPSAiIjsKLSAgCQotICAJLy8gRW5zdXJlIGFsbCBzbGFzaGVzIGluIHRoZSBsb2NhdGlvbnMgYXJlIC8uCi0gIAliYXNlTG9jYXRpb24gPSBiYXNlTG9jYXRpb24ucmVwbGFjZSgnXFwnLCcvJyk7Ci0gIAlzeXN0ZW1JZCA9IHN5c3RlbUlkLnJlcGxhY2UoJ1xcJywnLycpOwotICAJCi0gIAkvLyBSZW1vdmUgdGhlIHRyYWlsaW5nIHNlY3Rpb24gb2YgdGhlIGJhc2VMb2NhdGlvbi4KLQlpbnQgbGFzdFNsYXNoID0gYmFzZUxvY2F0aW9uLmxhc3RJbmRleE9mKCcvJyk7Ci0gIAlTdHJpbmcgdGVtcHJlc3VsdCA9IGJhc2VMb2NhdGlvbi5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoKzEpOwotICAJCi0gIAlpZihzeXN0ZW1JZC5zdGFydHNXaXRoKCIvIikpCi0gIAl7Ci0gIAkgIHN5c3RlbUlkID0gc3lzdGVtSWQuc3Vic3RyaW5nKDEpOwotICAJfQotICAJCi0gIAkvLyBKb2luIHRoZSBiYXNlIGxvY2F0aW9uIHdpdGggdGhlIHN5c3RlbWlkCi0gIAl0ZW1wcmVzdWx0ID0gdGVtcHJlc3VsdCArIHN5c3RlbUlkOwotICAJCi0gIAkvLyBXaGlsZSB0aGUgcmVsYXRpdmUgbG9jYXRpb24gc3RhcnRzIHdpdGggYSAuLi8gb3IgLi8gY2hhbmdlCi0gIAkvLyB0aGUgcmVzdWx0IGFuZCB0aGUgcmVsYXRpdmUgbG9jYXRpb24uCi0gIAlpbnQgbG9jOwotICAJd2hpbGUoKGxvYyA9IHRlbXByZXN1bHQubGFzdEluZGV4T2YoIi4vIikpICE9IC0xKQotICAJewotICAJICByZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZyhsb2MgKyAyKSArIHJlc3VsdDsKLSAgCSAgaWYodGVtcHJlc3VsdC5jaGFyQXQobG9jIC0gMSkgPT0gJy4nKQotICAJICB7Ci0gIAkgIAlpZih0ZW1wcmVzdWx0LmNoYXJBdChsb2MgLSAyKSA9PSAnLycpCi0gIAkgIAl7Ci0gIAkgIAkgIFN0cmluZyB0ZW1wID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCwgbG9jIC0gMik7Ci0gIAkgIAkgIGludCBsb2MyID0gdGVtcC5sYXN0SW5kZXhPZignLycpOwotICAJICAJICBpZihsb2MyID09IC0xKQotICAJICAJICB7Ci0gIAkgIAkgIAkvLyBJZiB0aGVyZSBpcyBubyBvdGhlciAvIGJlZm9yZSB0aGlzIHRoZSBVUkwgbXVzdCBzdGFydCB3aXRoIHNjaGVtZTovLi4vCi0gIAkgIAkgIAlyZXN1bHQgPSAiLi4vIiArIHJlc3VsdDsKLSAgCSAgCSAgCXRlbXByZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLCBsb2MgLSAxKTsKLSAgCSAgCSAgfQotICAJICAJICBlbHNlCi0gIAkgIAkgIHsKLSAgCSAgCSAgCS8vIFJlbW92ZSB0aGUgc2VjdGlvbiB0aGF0IGNvbWVzIGJlZm9yZSB0aGlzIG9uZSBmcm9tIHRlbXByZXN1bHQgdW5sZXNzIGl0J3MgLi4vLgotICAJICAJICAgIHRlbXByZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLCBsb2MgLSAxKTsKLSAgCSAgCSAgICBpbnQgbnVtU2VjdHNUb1JlbW92ZSA9IDE7Ci0gIAkgIAkgICAgCi0gIAkgIAkgICAgd2hpbGUodGVtcHJlc3VsdC5lbmRzV2l0aCgiLi8iKSkKLSAgCSAgCSAgICB7Ci0gIAkgIAkgICAgICBpbnQgdGVtcHJlc2xlbiA9IHRlbXByZXN1bHQubGVuZ3RoKCk7Ci0gIAkgIAkgICAgICBpZih0ZW1wcmVzbGVuID4gMiAmJiB0ZW1wcmVzdWx0LmNoYXJBdCh0ZW1wcmVzbGVuIC0zKSA9PSAnLicpCi0gIAkgIAkgICAgICB7Ci0gIAkgIAkgICAgICAJaWYodGVtcHJlc2xlbiA+IDMgJiYgdGVtcHJlc3VsdC5jaGFyQXQodGVtcHJlc2xlbiAtIDQpID09ICcvJykKLSAgCSAgCSAgICAgIAl7Ci0gIAkgIAkgICAgICAJICBudW1TZWN0c1RvUmVtb3ZlKys7Ci0gIAkgIAkgICAgICAJICB0ZW1wcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCwgdGVtcHJlc3VsdC5sZW5ndGgoKSAtMyk7Ci0gIAkgIAkgICAgICAgIH0KLSAgCSAgCSAgICAgIAllbHNlCi0gIAkgIAkgICAgICAJewotICAJICAJICAgICAgCSAgYnJlYWs7Ci0gIAkgIAkgICAgICAJfQotICAJICAJICAgICAgfQotICAJICAJICAgICAgZWxzZQotICAJICAJICAgICAgewotICAJICAJICAgICAgCWlmKHRlbXByZXN1bHQuY2hhckF0KHRlbXByZXN1bHQubGVuZ3RoKCkgLTIpID09ICcvJykKLSAgCSAgCSAgICAgIAl7Ci0gIAkgIAkgICAgICAJICB0ZW1wcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCwgdGVtcHJlc3VsdC5sZW5ndGgoKSAtMik7Ci0gIAkgIAkgICAgICAJfQotICAJICAJICAgICAgCWVsc2UKLSAgCSAgCSAgICAgIAl7Ci0gIAkgIAkgICAgICAJICBicmVhazsKLSAgCSAgCSAgICAgIAl9Ci0gIAkgIAkgICAgICB9Ci0gIAkgIAkgICAgfQotICAJICAJICAgIC8vIFJlbW92ZSB0aGUgc2VjdGlvbnMuCi0gIAkgIAkgICAgZm9yKGludCBpID0gMDsgaSA8IG51bVNlY3RzVG9SZW1vdmU7IGkrKykKLSAgCSAgCSAgICB7Ci0gIAkgIAkgICAgICBTdHJpbmcgdGVtcDIgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLHRlbXByZXN1bHQubGVuZ3RoKCktMSk7Ci0gIAkgIAkgICAgICBpbnQgbG9jMyA9IHRlbXAyLmxhc3RJbmRleE9mKCcvJyk7Ci0gIAkgIAkgICAgICBpZihsb2MzID09IC0xKQotICAJICAJICAgICAgewotICAJICAJICAgICAgCWJyZWFrOwotICAJICAJICAgICAgfQotICAJICAJICAgICAgdGVtcHJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsIGxvYzMrMSk7Ci0gIAkgIAkgICAgfQotICAJICAJICB9IAotICAJICAJfQotICAJICAJZWxzZQotICAJICAJewotICAJICAJICAvLyBUaGUgVVJJIGlzIG9mIHRoZSBmb3JtIGZpbGU6Ly9zb21lZGlyLi4vIHNvIGNvcHkgaXQgYXMgaXMKLSAgCSAgCSAgU3RyaW5nIHRlbXAgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLCBsb2MgLSAxKTsKLQkgIAkgIGludCBsb2MyID0gdGVtcC5sYXN0SW5kZXhPZignLycpOwotCSAgCSAgaWYobG9jMiA9PSAtMSkKLQkgIAkgIHsKLQkgIAkgIAkvLyBUaGUgVVJJIG11c3QgbG9vayBsaWtlIGZpbGU6Li4vIG9yIC4uLyBzbyBjb3B5IG92ZXIgdGhlIHdob2xlIHRlbXByZXN1bHQuCi0JICAJICAJcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCxsb2MrMikgKyByZXN1bHQ7Ci0JICAJICAJdGVtcHJlc3VsdCA9ICIiOwotCSAgCSAgfQotCSAgCSAgZWxzZQotCSAgCSAgewotCSAgCSAgCS8vIENvcHkgb3ZlciB0aGUgd2hvbGUgc29tZWRpci4uLwotCSAgCSAgCXJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKGxvYzIgKyAxLCB0ZW1wcmVzdWx0Lmxlbmd0aCgpKTsKLQkgIAkgICAgdGVtcHJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsIGxvYzIrMSk7Ci0JICAJICB9Ci0gIAkgIAl9Ci0gIAkgIH0KLSAgCSAgZWxzZQotICAJICB7Ci0gIAkgICAgaWYodGVtcHJlc3VsdC5jaGFyQXQobG9jIC0xICkgPT0gJy8nKQotCSAgCXsKLSAgCSAgCSAgLy8gUmVzdWx0IGlzIG9mIHRoZSBmb3JtIGZpbGU6Ly9zb21ldGhpbmcvLi9zb21ldGhpbmcgc28gcmVtb3ZlIHRoZSAuLwotICAJICAgICAgdGVtcHJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsbG9jKTsKLQkgIAl9Ci0gIAkgICAgZWxzZQotICAJICAgIHsKLSAgCSAgICAgIC8vIFJlc3VsdCBVUkkgaXMgb2YgZm9ybSBmaWxlOi8vc29tZWRpci4vIHNvIGNvcHkgb3ZlciB0aGUgd2hvbGUgc2VjdGlvbi4KLSAgICAJICBTdHJpbmcgdGVtcCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsIGxvYyAtIDEpOwotICAJICAJICBpbnQgbG9jMiA9IHRlbXAubGFzdEluZGV4T2YoJy8nKTsKLSAgCSAgCSAgaWYobG9jMiA9PSAtMSkKLSAgCSAgCSAgewotICAJICAJICAJLy8gVGhlIFVSSSBtdXN0IGxvb2sgbGlrZSBmaWxlOi4vIG9yIC4vIHNvIGNvcHkgb3ZlciB0aGUgd2hvbGUgdGVtcHJlc3VsdC4KLSAgCSAgCSAgCXJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsIGxvYykgKyByZXN1bHQ7Ci0gIAkgIAkgIAl0ZW1wcmVzdWx0ID0gIiI7Ci0gIAkgIAkgIH0KLSAgCSAgCSAgZWxzZQotICAJICAJICB7Ci0gIAkgIAkgIAkvLyBDb3B5IG92ZXIgdGhlIHdob2xlIHNvbWVkaXIuLwotICAJICAJICAJcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcobG9jMiArIDEsIHRlbXByZXN1bHQubGVuZ3RoKCkpOwotICAJICAJICAgIHRlbXByZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLCBsb2MyKzEpOwotICAJICAJICB9Ci0gIAkgICAgfQotICAJICB9Ci0gIAl9Ci0gIAlyZXN1bHQgPSB0ZW1wcmVzdWx0ICsgcmVzdWx0OwotICAJcmV0dXJuIHJlc3VsdDsKLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9VUklSZXNvbHZlckRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL1VSSVJlc29sdmVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMyZTZjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL1VSSVJlc29sdmVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyOwotCi0KLS8qKgotICogQSBkZWxlZ2F0ZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGFuIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlckRlbGVnYXRlCi17Ci0gIHByaXZhdGUgU3RyaW5nIGNsYXNzbmFtZTsKLSAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcjsKLSAgcHJpdmF0ZSBJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotICAKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBjbGFzc25hbWUgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIFVSSSByZXNvbHZlci4KLSAgICogQHBhcmFtIGNsYXNzbG9hZGVyIFRoZSBjbGFzcyBsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIFVSSSByZXNvbHZlci4KLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHZlckRlbGVnYXRlKFN0cmluZyBjbGFzc25hbWUsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKQotICB7Ci0gICAgdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0gICAgdGhpcy5jbGFzc2xvYWRlciA9IGNsYXNzbG9hZGVyOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBVUkkgcmVzb2x2ZXIgZGVzY3JpYmVkIGJ5IHRoaXMgZGVsZWdhdGUuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgcmVzb2x2ZXIgZGVzY3JpYmVkIGJ5IHRoaXMgZGVsZWdhdGUuCi0gICAqLwotICBwdWJsaWMgSVVSSVJlc29sdmVyIGdldFVSSVJlc29sdmVyKCkKLSAgewotICAgIGlmKHJlc29sdmVyID09IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHJlc29sdmVyID0gKElVUklSZXNvbHZlciljbGFzc2xvYWRlci5sb2FkQ2xhc3MoY2xhc3NuYW1lKS5uZXdJbnN0YW5jZSgpOwotICAgICAgfQotICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb2x2ZXIgPSAoSVVSSVJlc29sdmVyKWdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoY2xhc3NuYW1lKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlMikKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXNvbHZlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91dGlsL0Vycm9yTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91dGlsL0Vycm9yTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWJkYzBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdXRpbC9FcnJvck1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsOwotCi0vKioKLSAqIEEgY2xhc3MgdG8gaG9sZCB2YWxpZGF0aW9uIG1lc3NhZ2VzLiBJbiB0aGlzIGNhc2UgYW4gZXJyb3IgbWVzc2FnZSBpcyBhIGdlbmVyaWMKLSAqIHRlcm0gZm9yIGFueSBraW5kIG9mIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAqLwotcHVibGljIGNsYXNzIEVycm9yTWVzc2FnZQotewotICBwcml2YXRlIGludCBlcnJvckxpbmUsIGVycm9yQ29sdW1uLCBzZXZlcml0eTsKLSAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JTdHJpbmcsIHVyaTsKLSAgcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQgPSAtMTsKLSAgcHJpdmF0ZSBpbnQgZW5kT2Zmc2V0ID0gLTE7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIEVycm9yTWVzc2FnZSgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIGVycm9yIFRoZSBtZXNzYWdlIHRvIHNldC4KLSAgICogQHNlZSAjZ2V0RXJyb3JNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yKQotICB7Ci0gICAgZXJyb3JTdHJpbmcgPSBlcnJvcjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBzZWUgI2dldFNldmVyaXR5Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2ZXJpdHkpCi0gIHsKLSAgICB0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UgdXNpbmcgc3RyaW5nIG5hbWVzIGZvciB0aGUgc2V2ZXJpdHkuCi0gICAqIAotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2V2ZXJpdHkuCi0gICAqIEBzZWUgI2dldFNldmVyaXR5Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShTdHJpbmcgc2V2ZXJpdHkpCi0gIHsKLSAgICBpZiAoc2V2ZXJpdHkuZXF1YWxzKCJ3YXJuaW5nIikpCi0gICAgewotICAgICAgdGhpcy5zZXZlcml0eSA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNldmVyaXR5LmVxdWFscygiZXJyb3IiKSkKLSAgICB7Ci0gICAgICB0aGlzLnNldmVyaXR5ID0gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2V2ZXJpdHkuZXF1YWxzKCJmYXRhbCIpKQotICAgIHsKLSAgICAgIHRoaXMuc2V2ZXJpdHkgPSAyOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBpcyBsb2NhdGVkLgotICAgKiAKLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgd2hlcmUgdGhlIGVycm9yIGlzIGxvY2F0ZWQuCi0gICAqIEBzZWUgI2dldEVycm9yTGluZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXJyb3JMaW5lKGludCBsaW5lKQotICB7Ci0gICAgZXJyb3JMaW5lID0gbGluZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb2x1bW4gd2hlcmUgdGhlIGVycm9yIGlzIGxvY2F0ZWQuCi0gICAqIAotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gd2hlcmUgdGhlIGVycm9yIGlzIGxvY2F0ZWQuCi0gICAqIEBzZWUgI2dldEVycm9yQ29sdW1uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFcnJvckNvbHVtbihpbnQgY29sdW1uKQotICB7Ci0gICAgZXJyb3JDb2x1bW4gPSBjb2x1bW47Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqIEBzZWUgI3NldEVycm9yTWVzc2FnZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGVycm9yU3RyaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNldmVyaXR5IG9mIHRoZSBlcnJvci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHNldmVyaXR5IG9mIHRoZSBlcnJvci4KLSAgICogQHNlZSAjc2V0U2V2ZXJpdHkKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKQotICB7Ci0gICAgcmV0dXJuIHNldmVyaXR5OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAqIEBzZWUgI3NldEVycm9yTGluZQotICAgKi8KLSAgcHVibGljIGludCBnZXRFcnJvckxpbmUoKQotICB7Ci0gICAgcmV0dXJuIGVycm9yTGluZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlcnJvci4KLSAgICogQHNlZSAjc2V0RXJyb3JDb2x1bW4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RXJyb3JDb2x1bW4oKQotICB7Ci0gICAgcmV0dXJuIGVycm9yQ29sdW1uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHN0YXJ0IG9mZnNldC4KLSAgICogCi0gICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgb2Zmc2V0LgotICAgKiBAc2VlICNnZXRFcnJvclN0YXJ0T2Zmc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFcnJvclN0YXJ0T2Zmc2V0KGludCBzdGFydCkKLSAgewotICAgIHN0YXJ0T2Zmc2V0ID0gc3RhcnQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXJyb3Igc3RhcnQgb2Zmc2V0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZXJyb3Igc3RhcnQgb2Zmc2V0LgotICAgKiBAc2VlICNzZXRFcnJvclN0YXJ0T2Zmc2V0Ci0gICAqLwotICBwdWJsaWMgaW50IGdldEVycm9yU3RhcnRPZmZzZXQoKQotICB7Ci0gICAgcmV0dXJuIHN0YXJ0T2Zmc2V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVuZCBvZmZzZXQuCi0gICAqIAotICAgKiBAcGFyYW0gZW5kIFRoZSBlbmQgb2Zmc2V0LgotICAgKiBAc2VlICNnZXRFcnJvckVuZE9mZnNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXJyb3JFbmRPZmZzZXQoaW50IGVuZCkKLSAgewotICAgIGVuZE9mZnNldCA9IGVuZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBlcnJvciBlbmQgb2Zmc2V0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZXJyb3IgZW5kIG9mZnNldC4KLSAgICogQHNlZSAjc2V0RXJyb3JFbmRPZmZzZXQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RXJyb3JFbmRPZmZzZXQoKQotICB7Ci0gICAgcmV0dXJuIGVuZE9mZnNldDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgbmV3IGxpbmUgb3QgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmV3TGluZSBUaGUgbmV3IGxpbmUgdG8gYWRkIHRvIHRoZSBlcnJvciBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTmV3RXJyb3JNZXNzYWdlTGluZShTdHJpbmcgbmV3TGluZSkKLSAgewotICAgIGVycm9yU3RyaW5nICs9ICJcbiIgKyBuZXdMaW5lOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBVUkkgb2YgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgdG8gc2V0LgotICAgKi8KLSAKLSAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICB0aGlzLnVyaSA9IHVyaTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgVVJJIG9mIHRoZSBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgVVJJIG9mIHRoZSBlcnJvciBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVUkkoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91dGlsL01lc3NhZ2VHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdXRpbC9NZXNzYWdlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNzhjYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91dGlsL01lc3NhZ2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLS8qKgotICogQSBjb252ZW5pZW5jZSBjbGFzcyBmb3Igd29ya2luZyB3aXRoIHJlc291cmNlcyBpbiBhIHJlc291cmNlIGJ1bmRsZS4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VHZW5lcmF0b3IKLXsKLSAgcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIHJlc291cmNlYnVuZGxlOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSByYiBUaGUgcmVzb3VyY2UgYnVuZGxlIHRvIHdvcmsgd2l0aC4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlR2VuZXJhdG9yKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgcmVzb3VyY2VidW5kbGUgPSByYjsKLSAgfQotCi0gIC8qKgotICAqIFNldCB0aGUgcmVzb3VyY2VidW5kbGUgdG8gdGhlIG9uZSBzcGVjaWZpZWQuCi0gICogCi0gICogQHBhcmFtIHJiIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0LgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIHJlc291cmNlYnVuZGxlID0gcmI7Ci0gIH0KLQotICAvKioKLSAgKiBHZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBrZXkuCi0gICogCi0gICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgcmVzb3VyY2UuCi0gICogQHJldHVybiBUaGUgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkKLSAgewotICAgIHJldHVybiByZXNvdXJjZWJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBrZXkgYW5kIGRvZXMgb25lIHN1YnN0aXR1dGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIHJlc291cmNlLgotICAgKiBAcGFyYW0gczEgVGhlIHN1YnN0aXR1dGlvbiB0byBwZXJmb3JtLgotICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W10geyBzMSB9KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBrZXkgYW5kIGRvZXMgdHdvIHN1YnN0aXR1dGlvbnMuCi0gICAqIAotICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSByZXNvdXJjZS4KLSAgICogQHBhcmFtIHMxIFRoZSBmaXJzdCBzdWJzdGl0dXRpb24gdG8gcGVyZm9ybS4KLSAgICogQHBhcmFtIHMyIFRoZSBzZWNvbmQgc3Vic3RpdHV0aW9uIHRvIHBlcmZvcm0uCi0gICAqIEByZXR1cm4gVGhlIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgbmV3IE9iamVjdFtdIHsgczEsIHMyIH0pOwotICB9Ci0KLSAgLyoqCi0gICAqICBHZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgZm9yIHRoZSBnaXZlbiBrZXkgYW5kIGRvZXMgdGhyZWUgc3Vic3RpdHV0aW9ucy4KLSAgICogCi0gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIHJlc291cmNlLgotICAgKiBAcGFyYW0gczEgVGhlIGZpcnN0IHN1YnN0aXR1dGlvbiB0byBwZXJmb3JtLgotICAgKiBAcGFyYW0gczIgVGhlIHNlY29uZCBzdWJzdGl0dXRpb24gdG8gcGVyZm9ybS4KLSAgICogQHBhcmFtIHMzIFRoZSB0aGlyZCBzdWJzdGl0dXRpb24gdG8gcGVyZm9ybS4KLSAgICogQHJldHVybiBUaGUgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSwgT2JqZWN0IHMyLCBPYmplY3QgczMpCi0gIHsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXSB7IHMxLCBzMiwgczMgfSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0lXU0RMMTFWYWxpZGF0aW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvSVdTREwxMVZhbGlkYXRpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MjQ0NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvSVdTREwxMVZhbGlkYXRpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x2ZXI7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBXU0RMIDEuMSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLiBVc2VzIGFuIGV4aXN0aW5nCi0gKiB2YWxpZGF0aW9uIGluZm8gb2JqZWN0IGFuZCBwcm92aWRlcyBtZXRob2RzIHRvIHNldCBhbmQgcmV0cmlldmUKLSAqIHNjaGVtYXMgYW5kIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIHNldHRpbmcgZXJyb3JzIHdpdGggb2JqZWN0cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJV1NETDExVmFsaWRhdGlvbkluZm8KLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBvZiB0aGUgZmlsZSBiZWluZyB2YWxpZGF0ZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgb2YgdGhlIGZpbGUgYmVpbmcgdmFsaWRhdGVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGaWxlVVJJKCk7Ci0gIAotICAvKioKLSAgICogQWRkIGEgc2NoZW1hIHRvIHRoZSBsaXN0IG9mIHNjaGVtYXMgYXZhaWxhYmxlIGZvciB0aGlzIFdTREwgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0geHNNb2RlbCBUaGUgc2NoZW1hIHRvIGFkZCB0byB0aGUgbGlzdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFNjaGVtYShYU01vZGVsIHhzTW9kZWwpOwotICAKLSAgLyoqCi0gICAqIEdldCBhbiBhcnJheSBvZiBhbGwgdGhlIHNjaGVtYXMgYXZhaWxhYmxlIGZvciB0aGlzIFdTREwgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGFsbCB0aGUgc2NoZW1hcyBhdmFpbGFibGUgZm9yIHRoaXMgV1NETCBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBYU01vZGVsW10gZ2V0U2NoZW1hcygpOwotICAKLSAgLyoqCi0gICAqIENsZWFyIGFsbCB0aGUgc3RvcmVkIHNjaGVtYXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhclNjaGVtYXMoKTsKLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIGVsZW1lbnQgbG9jYXRpb25zIGhhc2h0YWJsZS4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50TG9jYXRpb25zIFRoZSBoYXNodGFibGUgdG8gc2V0IHdpdGggdGhlIGVsZW1lbnQgbG9jYXRpb25zLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudExvY2F0aW9ucyhIYXNodGFibGUgZWxlbWVudExvY2F0aW9ucyk7Ci0gIAotICAvKioKLSAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBleHRlbnNpYmx5IHZhbGlkYXRvcnMgdG8gYWRkIGVycm9yIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGVycm9yIHRvIGFkZC4KLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIG9iamVjdCB0byBhZGQgdGhlIGVycm9yIGZvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZWxlbWVudCk7Ci0gIAotICAvKioKLSAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBleHRlbnNpYmx5IHZhbGlkYXRvcnMgdG8gYWRkIGVycm9yIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGVycm9yIHRvIGFkZC4KLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIG9iamVjdCB0byBhZGQgdGhlIGVycm9yIGZvci4KLSAgICogQHBhcmFtIGVycm9yS2V5IFRoZSBlcnJvciBrZXkgZm9yIHRoaXMgbWVzc2FnZQotICAgKiBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyBUaGUgc3RyaW5ncyB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZWxlbWVudCwgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKTsKLSAgCi0gIC8qKgotICAgKiBBZGQgYW4gZXJyb3IgbWVzc2FnZSBhdCB0aGUgZ2l2ZW4gbGluZSBhbmQgY29sdW1uLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGVycm9yIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZXJyb3IuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpOwotICAKLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHdhcm5pbmcgdG8gYWRkLgotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgd2FybmluZyBmb3IuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZWxlbWVudCk7Ci0gIAotICAvKioKLSAgICogQWRkIGEgd2FybmluZyBtZXNzYWdlIGF0IHRoZSBnaXZlbiBsaW5lIGFuZCBjb2x1bW4uCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgd2FybmluZyB0byBhZGQuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSB3YXJuaW5nLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIHdhcm5pbmcuCi0gICAqIEBwYXJhbSB1cmkgVGhlIHVyaSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSB3YXJuaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpOwotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgVVJJIHJlc29sdmVyIGluIHVzZSBmb3IgdGhpcyB2YWxpZGF0aW9uLiBUaGUgVVJJIHJlc29sdmVyCi0gICAqIHJldHVybmVkIGlzIGFjdHVhbGx5IGEgVVJJIHJlc29sdmVyIGhhbmRsZXIgdGhhdCB3aWxsIAotICAgKiBpdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSByZWdpc3RlcmVkIFVSSSByZXNvbHZlcnMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgcmVzb2x2ZXIgaGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyBJVVJJUmVzb2x2ZXIgZ2V0VVJJUmVzb2x2ZXIoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvSVdTREwxMVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvSVdTREwxMVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmJkMmUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0lXU0RMMTFWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGEgdmFsaWRhdG9yIHBsdWdnZWQgaW50byB0aGUgV1NETCAxLjEgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXU0RMMTFWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBwYXJlbnRzIEEgbGlzdCBvZiBwYXJlbnRzIG9mIHRoaXMgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKTsKLQotICAvKioKLSAgICogU2V0IHRoZSByZXNvdXJjZSBidW5kbGUgb2YgdGhlIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSByYiBUaGUgcmVzb3VyY2UgYnVuZGxlIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvSW1wb3J0SG9sZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9JbXBvcnRIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlYjUwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9JbXBvcnRIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuRXJyb3JNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZC5YU0RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuQWJzdHJhY3RYTUxDb25mb3JtYW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuSVhNTFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTVV0aWxzOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5RTmFtZVV0aWxzOwotCi0vKioKLSAqIEEgY2xhc3MgdG8gaG9sZCBhbmQgcGFyc2UgYW4gaW1wb3J0IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRIb2xkZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlCi17Ci0gIHByaXZhdGUgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yOwotICAKLSAgcHJpdmF0ZSBXU0RMRG9jdW1lbnQgaW1wb3J0aW5nV1NETERvYyA9IG51bGw7Ci0gIHByaXZhdGUgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCA9IG51bGw7Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBpbXBvcnRpbmdEZWYgPSBudWxsOwotICBwcml2YXRlIEVsZW1lbnQgaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dFVSSSA9IG51bGw7Ci0gIHByaXZhdGUgaW50IGRlcHRoOwotICBwcml2YXRlIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gIHByaXZhdGUgTGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIGJvb2xlYW4gaXNXU0RMRmlsZUltcG9ydCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBpbXBvcnRJbnZhbGlkID0gZmFsc2U7Ci0gIHByaXZhdGUgSW1wb3J0IGltcG9ydERlZiA9IG51bGw7Ci0gIHByaXZhdGUgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbGluZm87Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIGltcG9ydC4KLSAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgaW1wb3J0LgotICAgKiBAcGFyYW0gY29udGV4dFVSSSBUaGUgY29udGV4dCBVUkkgZm9yIHJlc29sdmluZyB0aGUgaW1wb3J0IGxvY2F0aW9uLgotICAgKiBAcGFyYW0gd3NkbERvYyBUaGUgV1NETERvY3VtZW50IHRoYXQgY29udGFpbnMgdGhlIGltcG9ydC4KLSAgICogQHBhcmFtIGRlcHRoIFRoZSBkZXB0aCBvZiB0aGUgaW1wb3J0LgotICAgKiBAcGFyYW0gaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCBUaGUgZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGltcG9ydCBpbiB0aGUgZW5jYXBzdWxhdGluZyBXU0RMRG9jdW1lbnQuCi0gICAqIEBwYXJhbSBtZXNzYWdlZ2VuZXJhdG9yIEEgbWVzc2FnZWdlbmVyYXRvciBmb3Igb2J0YWluaW5nIHN0cmluZ3MuCi0gICAqIEBwYXJhbSB2YWxpbmZvIFRoZSBXU0RMMTFWYWxpZGF0aW9uSW5mbyBmb3IgcmVwb3J0aW5nIG1lc3NhZ2VzLgotICAgKi8KLSAgcHVibGljIEltcG9ydEhvbGRlcihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBjb250ZXh0VVJJLCBXU0RMRG9jdW1lbnQgaW1wb3J0aW5nV1NETERvYywgaW50IGRlcHRoLCBFbGVtZW50IGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQsIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvciwgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbGluZm8pCi0gIHsKLSAgICB0aGlzLm1lc3NhZ2VnZW5lcmF0b3IgPSBtZXNzYWdlZ2VuZXJhdG9yOwotICAgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gICAgdGhpcy5pbXBvcnRpbmdXU0RMRG9jID0gaW1wb3J0aW5nV1NETERvYzsKLSAgICBpZihpbXBvcnRpbmdXU0RMRG9jICE9IG51bGwpCi0gICAgewotICAgICAgdGhpcy5pbXBvcnRpbmdEZWYgPSBpbXBvcnRpbmdXU0RMRG9jLmdldERlZmluaXRpb24oKTsKLSAgICB9Ci0gICAgdGhpcy5pbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50ID0gaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudDsKLSAgICB0aGlzLmRlcHRoID0gZGVwdGg7Ci0gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIAotICAgIC8vICBBbGxvdyBXU0RMIGltcG9ydHMgdG8gaGF2ZSBubyBsb2NhdGlvbiBhdHRyaWJ1dGUgZXZlbiB0aG91Z2ggaXQgaXMgcmVxdWlyZWQuCi0gICAgLy8gU2NoZW1hIHdpbGwgbm9ybWFsbHkgY2F0Y2ggdGhlIHByb2JsZW0gYnV0IHRoaXMgYWxsb3dzIHVzZXJzIHRvIG92ZXJyaWRlIHRoZQotICAgIC8vIHNjaGVtYSBhbmQgaGF2ZSB0aGUgdmFsaWRhdG9yIHJ1bi4KLSAgICBpZiAodGhpcy5sb2NhdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHRoaXMubG9jYXRpb24gPSBuYW1lc3BhY2U7Ci0gICAgfQotICAgIHRoaXMuY29udGV4dFVSSSA9IGNvbnRleHRVUkk7Ci0gICAgCi0gICAgdGhpcy5sb2NhdGlvbiA9IHRoaXMubG9jYXRpb24ucmVwbGFjZSgnXFwnLCcvJyk7Ci0gICAgU3RyaW5nIGNsYXNzcGF0aFVSSSA9IHZhbGluZm8uZ2V0VVJJUmVzb2x2ZXIoKS5yZXNvbHZlKHRoaXMuY29udGV4dFVSSSwgdGhpcy5uYW1lc3BhY2UsIHRoaXMubG9jYXRpb24pOwotICAgIGlmKGNsYXNzcGF0aFVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRoaXMubG9jYXRpb24gPSBjbGFzc3BhdGhVUkk7Ci0gICAgICB0aGlzLmNvbnRleHRVUkkgPSBudWxsOwotICAgIH0gCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKQotICB7Ci0gICAgRWxlbWVudCBkb2N1bWVudEVsZW1lbnQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIGRvY3VtZW50RWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgaWYoZG9jdW1lbnRFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAJICAvLyBIYW5kbGUgV1NETCBpbXBvcnRzLgotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RFRklOSVRJT05TLCBkb2N1bWVudEVsZW1lbnQpKQotICAgICAgewotICAgICAgICBpZihpc1hNTFZhbGlkKHRoaXMubG9jYXRpb24pKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgd3NkbERvY3VtZW50ID0gbmV3IFdTRExEb2N1bWVudCh0aGlzLmxvY2F0aW9uLCBkb2N1bWVudEVsZW1lbnQsIHRoaXMuZGVwdGgsIHRoaXMubWVzc2FnZWdlbmVyYXRvciwgdGhpcy52YWxpbmZvKTsKLSAgICAgICAgICAgIGNyZWF0ZVdTRExJbXBvcnQod3NkbERvY3VtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZhbGluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9VTkFCTEVfVE9fSU1QT1JUX0JBRF9MT0NBVElPTiIsICInIiArIGltcG9ydERlZi5nZXRMb2NhdGlvblVSSSgpICsgIiciKSwgaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBIYW5kbGUgc2NoZW1hIGltcG9ydHMuCi0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9YU0RfMjAwMSwgZG9jdW1lbnRFbGVtZW50KSkKLSAgICAgIHsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1hNTFZhbGlkKFN0cmluZyB1cmkpCi0gIHsKLSAgICBJWE1MVmFsaWRhdG9yIHhtbFZhbGlkYXRvciA9IEFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0WE1MVmFsaWRhdG9yKCk7Ci0gICAgeG1sVmFsaWRhdG9yLnNldEZpbGUodXJpKTsKLSAgICAvL3htbFZhbGlkYXRvci5zZXRWYWxpZGF0aW9uSW5mbyh2YWxJbmZvKTsKLSAgICB4bWxWYWxpZGF0b3IucnVuKCk7Ci0gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHhtbCBjb25mb3JtYW5jZSBwcm9ibGVtcyBnbyBvbiB0byBjaGVjayB0aGUgd3NkbCBzdHVmZgotICAgIGlmICh4bWxWYWxpZGF0b3IuaGFzRXJyb3JzKCkpCi0gICAgewotICAgICAgLy8gdGVtcCBoYW5kbGluZyBvZiBYTUwgZXJyb3JzIHVudGlsIHZhbGlkYXRvciBpcyB1cGRhdGVkLgotICAgICAgTGlzdCBlcnJvcnMgPSB4bWxWYWxpZGF0b3IuZ2V0RXJyb3JzKCk7Ci0gICAgICBJdGVyYXRvciBlcnJvcnNJdGVyID0gZXJyb3JzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoZXJyb3JzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIElWYWxpZGF0aW9uTWVzc2FnZSB2YWxNZXMgPSAoSVZhbGlkYXRpb25NZXNzYWdlKWVycm9yc0l0ZXIubmV4dCgpOwotICAgICAgICB2YWxpbmZvLmFkZEVycm9yKHZhbE1lcy5nZXRNZXNzYWdlKCksIHZhbE1lcy5nZXRMaW5lKCksIHZhbE1lcy5nZXRDb2x1bW4oKSwgdmFsTWVzLmdldFVSSSgpKTsKLSAgICAgIH0KLSAgICAgIGltcG9ydEludmFsaWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgaW1wb3J0aW5nIFdTRExEb2N1bWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGltcG9ydGluZyBXU0RMRG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50IGdldEltcG9ydGluZ0RvY3VtZW50KCkKLSAgewotICAgIHJldHVybiBpbXBvcnRpbmdXU0RMRG9jOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBXU0RMIGRvY3VtZW50IHRoaXMgaW1wb3J0IHJlcHJlc2VudHMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBXU0RMIGRvY3VtZW50IHRoaXMgaW1wb3J0IHJlcHJlc2VudHMuCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50IGdldFdTRExEb2N1bWVudCgpCi0gIHsKLSAgICByZXR1cm4gd3NkbERvY3VtZW50OwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsb2NhdGlvbi4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbG9jYXRpb247Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbnRleHQgVVJJLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgY29udGV4dCBVUkkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRVUkkoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRleHRVUkk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGRlcHRoIGluIHRoZSBXU0RMIHRyZWUuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBkZXB0aCBpbiB0aGUgV1NETCB0cmVlLgotICAgKi8KLSAgcHVibGljIGludCBnZXREZXB0aCgpCi0gIHsKLSAgICByZXR1cm4gZGVwdGg7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbnRhaW5pbmcgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgY29udGFpbmluZyBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0SW1wb3J0aW5nRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0aW5nRGVmOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBlbGVtZW50IGZvciB0aGlzIGltcG9ydC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVsZW1lbnQgZm9yIHRoaXMgaW1wb3J0LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgaWYoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgbG9jYXRpb25VUkkgPSBsb2NhdGlvbjsKLSAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlOwotICAgIC8vSW1wb3J0IGltcG9ydERlZiA9IGltcG9ydGluZ0RlZi5jcmVhdGVJbXBvcnQoKTsKLSAgICAKLSAgICAvLyAgQWxsb3cgbG9jYXRpbmcgV1NETCBkb2N1bWVudHMgdXNpbmcgYW55IHJlZ2lzdGVyZWQgVVJJIHJlc29sdmVyLgotICAgIC8vU3RyaW5nIGNsYXNzcGF0aFVSSSA9IFVSSVJlc29sdmVyLmdldEluc3RhbmNlKCkucmVzb2x2ZShjb250ZXh0VVJJLCBuYW1lc3BhY2VVUkksIGxvY2F0aW9uVVJJKTsKLS8vICAgIGlmICghY2xhc3NwYXRoVVJJLmVxdWFscyhsb2NhdGlvblVSSSkpCi0vLyAgICB7Ci0vLyAgICAgIGxvY2F0aW9uVVJJID0gY2xhc3NwYXRoVVJJOwotLy8gICAgICBjb250ZXh0VVJJID0gbnVsbDsKLS8vICAgIH0KLSAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICBpZiAobG9jYXRpb25VUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy9TdHJpbmcgY29udGV4dFVSSSA9IGRlZi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLSAgICAgICAgICAvL0RlZmluaXRpb24gaW1wb3J0ZWREZWYgPSBudWxsOwotICAgICAgICAgIAotICAgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbnVsbDsKLSAgICAgICAgICBVUkwgdXJsID0gbnVsbDsKLQotICAgICAgICAgIAotICAgICAgICAgICAgVVJMIGNvbnRleHRVUkwgPSAoY29udGV4dFVSSSAhPSBudWxsKSA/IFN0cmluZ1V0aWxzLmdldFVSTChudWxsLCBjb250ZXh0VVJJKSA6IG51bGw7Ci0KLSAgICAgICAgICAgIHVybCA9IFN0cmluZ1V0aWxzLmdldFVSTChjb250ZXh0VVJMLCBsb2NhdGlvblVSSSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEhhbmRsZSBmaWxlOi8vIHVybHMuIFRoZSBjb3JyZWN0IGZvcm1hdCBzaG91bGQgYmUgZmlsZTovLy8gb3IgZmlsZTovLgotICAgICAgICAgICAgU3RyaW5nIHVybEF1dGhvcml0eSA9IHVybC5nZXRBdXRob3JpdHkoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmxQcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOwotICAgICAgICAgICAgaWYodXJsQXV0aG9yaXR5ICE9bnVsbCAmJiB1cmxQcm90b2NvbC5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIikgJiYgIXVybEF1dGhvcml0eS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdXJsID0gbmV3IFVSTCh1cmxQcm90b2NvbCwiIiwiLyIgKyB1cmxBdXRob3JpdHkgKyB1cmwuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IHVybC50b1N0cmluZygpOwotCQkJLy8gVGVzdCBmb3IgY2FzZSBzZW5zaXRpdml0eSBvbiBsb2NhbCBmaWxlcy4KLQkJCWlmKHVybFN0cmluZy5zdGFydHNXaXRoKCJmaWxlOiIpKQotCQkJewotCQkJICBGaWxlIHRlc3RmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCQkgIFN0cmluZyB0ZXN0ZmlsZVN0cmluZyA9IHRlc3RmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJICBGaWxlIGNhbm9uaWNhbGZpbGUgPSB0ZXN0ZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCQkgIFN0cmluZyBjYW5vbmljYWxmaWxlU3RyaW5nID0gY2Fub25pY2FsZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotICAgICAgICAgICAgICBpZiAoIXRlc3RmaWxlU3RyaW5nLmVxdWFscyhjYW5vbmljYWxmaWxlU3RyaW5nKSkKLSAgICAgICAgICAgICAgewotCQkJCWlmICghU3RyaW5nLnZhbHVlT2YodGVzdGZpbGVTdHJpbmcuY2hhckF0KDApKS5lcXVhbHNJZ25vcmVDYXNlCi0JCQkJICAgIChTdHJpbmcudmFsdWVPZihjYW5vbmljYWxmaWxlU3RyaW5nLmNoYXJBdCgwKSkpCi0JCQkJICAgIHx8ICF0ZXN0ZmlsZVN0cmluZy5zdWJzdHJpbmcoMSx0ZXN0ZmlsZVN0cmluZy5sZW5ndGgoKSkuZXF1YWxzCi0JCQkJCShjYW5vbmljYWxmaWxlU3RyaW5nLnN1YnN0cmluZygxLGNhbm9uaWNhbGZpbGVTdHJpbmcubGVuZ3RoKCkpKSkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICB1cmxTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgICAgICAgIHVybCA9IG51bGw7Ci0JCQkJfQotICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCQkKLQkJCWlmKHVybCAhPSBudWxsKQotCQkJewotCQkJICB0cnkKLQkJCSAgewotICAgICAgICAgICAgICAgIHJlYWRlciA9IFN0cmluZ1V0aWxzLmdldENvbnRlbnRBc1JlYWRlcih1cmwpOwotCQkJICB9Ci0JCQkgIGNhdGNoKElPRXhjZXB0aW9uIGUpCi0JCQkgIHsKLQkJCSAgICAvLyBObyBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUuIFRoZSBlcnJvciB3aWxsIGJlIGhhbmRsZWQgYmVsb3cuCi0JCQkgIH0KLQkJCX0KLSAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UocmVhZGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlucHV0U291cmNlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIEdldCB0aGUgYWN0dWFsIGxvY2F0aW9uIGZyb20gdGhlIGVsZW1lbnQuCi0gICAgICAgICAgICAgIFN0cmluZyBhY3R1YWxMb2NhdGlvbiA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShpbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50LCBDb25zdGFudHMuQVRUUl9MT0NBVElPTik7Ci0gICAgICAgICAgICAgIGlmKGFjdHVhbExvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgCWFjdHVhbExvY2F0aW9uID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQsICJzY2hlbWFMb2NhdGlvbiIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmKGFjdHVhbExvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgCWFjdHVhbExvY2F0aW9uID0gbmFtZXNwYWNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGltcG9ydGluZ1dTRExEb2MuYWRkUmVhZGVyV2FybmluZygKLSAgICAgICAgICAgICAgICAgIGltcG9ydGluZ0RlZiwKLSAgICAgICAgICAgICAgICAgIGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX1VOQUJMRV9UT19JTVBPUlRfQkFEX0xPQ0FUSU9OIiwgIiciICsgYWN0dWFsTG9jYXRpb24gKyAiJyIpKTsKLSAgICAgICAgICAgICAgaW1wb3J0SW52YWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy8gVE9ETzogbW9kaWZ5IHRoZSByZWFkZXIgZXJyb3IgdG8gc2hvdyBpbiBhbGwgdGhlIGNvcnJlY3QgbG9jYXRpb25zLgotICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLAotICAgICAgICAgICAgICAgICJVbmFibGUgdG8gbG9jYXRlIGltcG9ydGVkIGRvY3VtZW50ICIKLSAgICAgICAgICAgICAgICAgICsgImF0ICciCi0gICAgICAgICAgICAgICAgICArIGxvY2F0aW9uVVJJCi0gICAgICAgICAgICAgICAgICArICInIgotICAgICAgICAgICAgICAgICAgKyAoY29udGV4dFVSSSA9PSBudWxsID8gIi4iIDogIiwgcmVsYXRpdmUgdG8gJyIgKyBjb250ZXh0VVJJICsgIicuIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkb2MgPSBXU0RMUmVhZGVySW1wbC5nZXREb2N1bWVudChpbnB1dFNvdXJjZSwgbG9jYXRpb25VUkkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBUaGUgRmlsZSBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgcmVhZC4gCi0gICAgICAgICAgICAgIC8vIFBlcmZvcm0gWE1MIHZhbGlkYXRpb24uCi0gICAgICAgICAgICAgIGlzWE1MVmFsaWQobG9jYXRpb25VUkkpOwotLy8gICAgICAgICAgICAgIGltcG9ydGluZ1dTRExEb2MuYWRkUmVhZGVyRXJyb3IoCi0vLyAgICAgICAgICAgICAgICAgIGltcG9ydGluZ0RlZiwKLS8vICAgICAgICAgICAgICAgICAgaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCwKLS8vICAgICAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9VTkFCTEVfVE9fSU1QT1JUX0lOVkFMSUQiLCAiJyIgKyBsb2NhdGlvbiArICInIikpOwotICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmKCFRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ERUZJTklUSU9OUywgZWxlbWVudCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzV1NETEZpbGVJbXBvcnQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBpbXBvcnRlZCBkb2N1bWVudCBoYXMgdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBpbXBvcnQgZWxlbWVudCBzdGF0ZXMuCi0gICAgICAgICAgICBTdHJpbmcgaW1wb3J0VGFyZ2V0TlMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgIGlmKCFpbXBvcnRUYXJnZXROUy5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW1wb3J0aW5nV1NETERvYy5hZGRSZWFkZXJXYXJuaW5nKAotICAgICAgICAgICAgICAgICAgaW1wb3J0aW5nRGVmLAotICAgICAgICAgICAgICAgICAgaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKCJfV0FSTl9XUk9OR19OU19PTl9JTVBPUlQiLCAiJyIgKyBuYW1lc3BhY2UgKyAiJyIsICInIiArIGltcG9ydFRhcmdldE5TICsgIiciKSk7Ci0gICAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICBpbXBvcnRJbnZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmKHJlYWRlciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7fQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgCi0gICAgfQotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGFuIGltcG9ydCBlbGVtZW50IGZvciBhIFdTREwgaW1wb3J0IG9mIGEgV1NETCBkb2N1bWVudC4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgVGhlIGRvY3VtZW50IG9mIHRoZSBpbXBvcnQuCi0gICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW1wb3J0IGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgSW1wb3J0IGNyZWF0ZVdTRExJbXBvcnQoV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgewotICAgIGlmKGltcG9ydERlZiAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBpbXBvcnREZWY7Ci0gICAgfQotICAgIGltcG9ydERlZiA9IGdldE5ld0ltcG9ydCgpOwotICAKLSAgICBpZiAoaW1wb3J0RGVmICE9IG51bGwpCi0gICAgewotICAgICAgaW1wb3J0RGVmLnNldERlZmluaXRpb24od3NkbERvY3VtZW50LmdldERlZmluaXRpb24oKSk7Ci0gICAgICBzY2hlbWFzLmFkZEFsbCh3c2RsRG9jdW1lbnQuZ2V0U2NoZW1hcygpKTsKLSAgICAgIGltcG9ydGluZ1dTRExEb2MuYWRkU2NoZW1hcyhzY2hlbWFzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaW1wb3J0RGVmOwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGFuIGltcG9ydCBlbGVtZW50IGZvciBhIFdTREwgaW1wb3J0IG9mIGEgc2NoZW1hIGltcG9ydCBvZiBhIHNjaGVtYSBkb2N1bWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW1wb3J0IGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgSW1wb3J0IGNyZWF0ZVhTREltcG9ydCgpCi0gIHsKLSAgICBpZihpbXBvcnREZWYgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW1wb3J0RGVmOwotICAgIH0KLSAgICBpbXBvcnREZWYgPSBnZXROZXdJbXBvcnQoKTsKLSAgICBYU0RWYWxpZGF0b3IgeHNkdmFsaWRhdG9yID0gbmV3IFhTRFZhbGlkYXRvcigpOwotCi0gICAgeHNkdmFsaWRhdG9yLnZhbGlkYXRlKGxvY2F0aW9uLCBYTUxDYXRhbG9nUmVzb2x2ZXIuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgaWYgKHhzZHZhbGlkYXRvci5pc1ZhbGlkKCkpCi0gICAgewotICAgICAgWFNNb2RlbCBzY2hlbWEgPSB4c2R2YWxpZGF0b3IuZ2V0WFNNb2RlbCgpOwotICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICBzY2hlbWFzLmFkZChzY2hlbWEpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAvLyBhZGRSZWFkZXJXYXJuaW5nKAotLy8gICAgICAgIGRlZiwKLS8vICAgICAgICBpbXBvcnREZWYsCi0vLyAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9VTkFCTEVfVE9fSU1QT1JUX0lOVkFMSUQiLCAiJyIgKyBpbXBvcnREZWYuZ2V0TG9jYXRpb25VUkkoKSArICInIikpOwotICAgICAgSXRlcmF0b3IgZXJyb3JzID0geHNkdmFsaWRhdG9yLmdldEVycm9ycygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoZXJyb3JzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgRXJyb3JNZXNzYWdlIGVyciA9IChFcnJvck1lc3NhZ2UpIGVycm9ycy5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBlcnIuZ2V0VVJJKCk7Ci0gICAgICAgIGludCBsaW5lID0gZXJyLmdldEVycm9yTGluZSgpOwotICAgICAgICBTdHJpbmcgZXJybWVzcyA9IGVyci5nZXRFcnJvck1lc3NhZ2UoKTsKLSAgICAgICAgdmFsaW5mby5hZGRFcnJvcihlcnJtZXNzLCBsaW5lLCBlcnIuZ2V0RXJyb3JDb2x1bW4oKSwgdXJpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW1wb3J0aW5nV1NETERvYy5hZGRTY2hlbWFzKHNjaGVtYXMpOwotICAgIHJldHVybiBpbXBvcnREZWY7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGltcG9ydCBlbGVtZW50IGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbXBvcnQgZWxlbWVudCBpZiBpdCBoYXMgYmVlbiBjcmVhdGVkIG9yIG51bGwuCi0gICAqLwotICBwdWJsaWMgSW1wb3J0IGdldEltcG9ydCgpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0RGVmOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGEgbmV3IGltcG9ydCBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybiBBIG5ldyBpbXBvcnQgZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgSW1wb3J0IGdldE5ld0ltcG9ydCgpCi0gIHsKLSAgICBpZihpbXBvcnRJbnZhbGlkKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBJbXBvcnQgaW1wb3J0RGVmID0gaW1wb3J0aW5nRGVmLmNyZWF0ZUltcG9ydCgpOyAKLSAgICAKLSAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgewotICAgICAgaW1wb3J0RGVmLnNldE5hbWVzcGFjZVVSSShuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGltcG9ydERlZi5zZXRMb2NhdGlvblVSSShsb2NhdGlvbik7Ci0gICAgfQotICAgIAotICAgIGlmKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGVsZW1lbnQpOwotCi0gICAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgICB7Ci0gICAgICAgICAgaW1wb3J0RGVmLnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaW1wb3J0RGVmOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzY2hlbWFzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpbXBvcnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzY2hlbWFzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpbXBvcnQuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRTY2hlbWFzKCkKLSAgewotICAgIHJldHVybiBzY2hlbWFzOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaW1wb3J0IGltcG9ydHMgYSBXU0RMIGRvY3VtZW50LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBpbXBvcnQgaW1wb3J0cyBhIFdTREwgZG9jdW1lbnQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV1NETEZpbGVJbXBvcnQoKQotICB7Ci0gICAgcmV0dXJuIGlzV1NETEZpbGVJbXBvcnQ7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCi0gIHsKLSAgICBpZihvYmouZ2V0Q2xhc3MoKSA9PSBJbXBvcnRIb2xkZXIuY2xhc3MpCi0gICAgewotICAgICAgSW1wb3J0SG9sZGVyIG90aGVySW1wb3J0ID0gKEltcG9ydEhvbGRlcilvYmo7Ci0gICAgICAKLSAgICAgIGlmKGdldE5hbWVzcGFjZSgpLmVxdWFscyhvdGhlckltcG9ydC5nZXROYW1lc3BhY2UoKSkgJiYgZ2V0TG9jYXRpb24oKS5lcXVhbHMob3RoZXJJbXBvcnQuZ2V0TG9jYXRpb24oKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvYmopCi0gIHsKLSAgICBpZihvYmogPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgSW1wb3J0SG9sZGVyIG90aGVySW1wb3J0ID0gKEltcG9ydEhvbGRlcilvYmo7Ci0gICAgICAKLSAgICByZXR1cm4gKGdldE5hbWVzcGFjZSgpK2dldExvY2F0aW9uKCkpLmNvbXBhcmVUbygob3RoZXJJbXBvcnQuZ2V0TmFtZXNwYWNlKCkrb3RoZXJJbXBvcnQuZ2V0TG9jYXRpb24oKSkpOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBtZXNzYWdlZ2VuZXJhdG9yIGZvciB0aGUgaW1wb3J0IGhvbGRlci4KLSAgICogCi0gICAqIEBwYXJhbSBtZyBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUdlbmVyYXRvcihNZXNzYWdlR2VuZXJhdG9yIG1nKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1nOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgdGhlIGltcG9ydCBpcyBpbnZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGltcG9ydCBpcyBpbnZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ltcG9ydEludmFsaWQoKQotICB7Ci0gICAgcmV0dXJuIGltcG9ydEludmFsaWQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9Mb2NhdGlvbkhvbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvTG9jYXRpb25Ib2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlZjMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9Mb2NhdGlvbkhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi0vKioKLSAqIEhvbGRzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYW4gZWxlbWVudCBpbiBhIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgTG9jYXRpb25Ib2xkZXIKLXsKLSAgcHJpdmF0ZSBpbnQgbGluZTsKLSAgcHJpdmF0ZSBpbnQgY29sdW1uOwotICBwcml2YXRlIFN0cmluZyB1cmk7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBudW1iZXIuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgTG9jYXRpb25Ib2xkZXIoaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpCi0gIHsKLSAgICB0aGlzLmxpbmUgPSBsaW5lOwotICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwotICAgIHRoaXMudXJpID0gdXJpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsaW5lIG51bWJlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpbmUgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGludCBnZXRMaW5lKCkKLSAgewotICAgIHJldHVybiBsaW5lOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBjb2x1bW4gbnVtYmVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgY29sdW1uIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkKLSAgewotICAgIHJldHVybiBjb2x1bW47Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGZpbGUgVVJJLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZmlsZSBVUkkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9SZWFkZXJFcnJvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvUmVhZGVyRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiNGU0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9SZWFkZXJFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi0vKioKLSAqIEhvbGRzIGFuIGVycm9yIGNyZWF0ZWQgd2hlbiByZWFkaW5nIGEgV1NETCBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRlckVycm9yCi17Ci0gIHByb3RlY3RlZCBPYmplY3QgcGFyZW50T2JqZWN0OyAvLyB0aGUgb2JqZWN0IG9mIHRoZSBwYXJlbnQgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvcgotICBwcm90ZWN0ZWQgT2JqZWN0IG9iamVjdDsgLy8gdGhlIG9iamVjdCB0aGUgZXJyb3IgaXMgYXNzb2NpYXRlZCB3aXRoCi0gIHByb3RlY3RlZCBTdHJpbmcgZXJyb3I7IC8vIHRoZSBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCAKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50T2JqZWN0IHRoZSBwYXJlbnQgb2JqZWN0IG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IKLSAgICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yCi0gICAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IKLSAgICovCi0gIHB1YmxpYyBSZWFkZXJFcnJvcihPYmplY3QgcGFyZW50T2JqZWN0LCBPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZXJyb3IpCi0gIHsKLSAgICB0aGlzLnBhcmVudE9iamVjdCA9IHBhcmVudE9iamVjdDsKLSAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICB0aGlzLmVycm9yID0gZXJyb3I7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcGFyZW50IG9iamVjdCBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgcGFyZW50IG9iamVjdCBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudE9iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gcGFyZW50T2JqZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvci4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvcgotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG9iamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFcnJvcigpCi0gIHsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDU2NGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogQSByZWdpc3RyeSB0byBob2xkIGFsbCB0aGUgV1NETCAxLjEgdmFsaWRhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5Ci17Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBWYWxpZGF0b3JSZWdpc3RyeSB2ZXJJbnN0YW5jZTsKLQotICBwcm90ZWN0ZWQgTWFwIHZhbGlkYXRvclJlZyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgVmFsaWRhdG9yUmVnaXN0cnkoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5zdGFuY2Ugb2YgdGhpcyByZWdpc3RyeS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHRoaXMgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmICh2ZXJJbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZlckluc3RhbmNlID0gbmV3IFZhbGlkYXRvclJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIHJldHVybiB2ZXJJbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0aGlzIHZhbGlkYXRvciBkZWxlZ2F0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdGhlIHZhbGlkYXRvciBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAqIEBwYXJhbSB2YWxEZWxlZ2F0ZSBUaGUgdmFsaWRhdG9yIGRlbGVnYXRlIHRvIHJlZ2lzdGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSwgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUgdmFsRGVsZWdhdGUpCi0gIHsKLSAgICAvLyBhbGxvdyB0aGUgbnVsbCBuYW1lc3BhY2UgYnV0IG1ha2UgaXQgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIHZhbGlkYXRvciB0byB0aGUgaGFzaHRhYmxlCi0gICAgdmFsaWRhdG9yUmVnLnB1dChuYW1lc3BhY2UsIHZhbERlbGVnYXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBc2sgZm9yIHRoZSB2YWxpZGF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlLiBJZiBub25lIGlzIGZvdW5kCi0gICAqIHJldHVybiBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIEByZXR1cm4gVGhlIFdTREwgMS4xIHZhbGlkYXRvciBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBJV1NETDExVmFsaWRhdG9yIHF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIC8vIGlmIHRoZSBuYW1lc3BhY2UgaXMgbnVsbCBhbGxvdyBpdCBhbmQgdHJlYXQgaXQgYXMgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0gICAgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUgZGVsZWdhdGUgPSAoV1NETDExVmFsaWRhdG9yRGVsZWdhdGUpdmFsaWRhdG9yUmVnLmdldChuYW1lc3BhY2UpOwotICAgIGlmKGRlbGVnYXRlICE9IG51bGwpCi0gICAgeyAgCi0gICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHRlbGxzIHdoZXRoZXIgYSB2YWxpZGF0b3IgZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlIGlzIHJlZ2lzdGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdG8gY2hlY2suCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbGlkYXRvciByZWdpc3RlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNSZWdpc3RlcmVkVmFsaWRhdG9yKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBpZiAocXVlcnlWYWxpZGF0b3JSZWdpc3RyeShuYW1lc3BhY2UpICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExQmFzaWNWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMUJhc2ljVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZmQ2NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExQmFzaWNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2QuU2NoZW1hQXR0cmlidXRlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkLlhTRFZhbGlkYXRvcjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0vKioKLSAqIFZhbGlkYXRlIHRoZSBlbGVtZW50cyBkZWZpbmVkIGluIGEgV1NETCAxLjEgRG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMTFCYXNpY1ZhbGlkYXRvciBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VTX0ZFQVRVUkVfSUQgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fRkVBVFVSRV9JRCA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BX1ZBTElEQVRJT05fRkVBVFVSRV9JRCA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNDSEVNQV9GVUxMX0NIRUNLSU5HX0ZFQVRVUkVfSUQgPQotICAgICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEtZnVsbC1jaGVja2luZyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQ09OVElOVUVfQUZURVJfRkFUQUxfRVJST1JfSUQgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2NvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTT0FQX0VOQ09ESU5HX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gIAotICAvLyBFcnJvciBhbmQgV2FybmluZyBLZXlzCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9QT1JUX05BTUVfTk9UX1VOSVFVRSA9ICJfUE9SVF9OQU1FX05PVF9VTklRVUUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfTk9fQklORElOR19GT1JfUE9SVCA9ICJfTk9fQklORElOR19GT1JfUE9SVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9OT19BRERSRVNTX1BPUlQgPSAiX05PX0FERFJFU1NfUE9SVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9NT1JFX1RIRU5fT05FX0FERFJFU1NfUE9SVCA9ICJfTU9SRV9USEVOX09ORV9BRERSRVNTX1BPUlQiOyAvL1RPRE8gc2hvdWxkIGJlIF9NT1JFX1RIQU5fT05FX0FERFJFU1NfUE9SVCwgbm90IFRIRU4KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1BPUlRUWVBFX1VOREVGSU5FRF9GT1JfQklORElORyA9ICJfUE9SVFRZUEVfVU5ERUZJTkVEX0ZPUl9CSU5ESU5HIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX09QRVJBVElPTl9VTkRFRklORURfRk9SX1BPUlRUWVBFID0gIl9PUEVSQVRJT05fVU5ERUZJTkVEX0ZPUl9QT1JUVFlQRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9PUEVSQVRJT05fTk9fSU5QVVRfT1JfT1VUUFVUID0gIl9PUEVSQVRJT05fTk9fSU5QVVRfT1JfT1VUUFVUIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0lOUFVUX05BTUVfTk9UX1VOSVFVRSA9ICJfSU5QVVRfTkFNRV9OT1RfVU5JUVVFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9JTlBVVCA9ICJfTUVTU0FHRV9VTkRFRklORURfRk9SX0lOUFVUIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX09VVFBVVF9OQU1FX05PVF9VTklRVUUgPSAiX09VVFBVVF9OQU1FX05PVF9VTklRVUUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfTUVTU0FHRV9VTkRFRklORURfRk9SX09VVFBVVCA9ICJfTUVTU0FHRV9VTkRFRklORURfRk9SX09VVFBVVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9NRVNTQUdFX1VOREVGSU5FRF9GT1JfRkFVTFQgPSAiX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9GQVVMVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9QQVJUX05PX0VMRU1FTlRfT1JfVFlQRSA9ICJfUEFSVF9OT19FTEVNRU5UX09SX1RZUEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfUEFSVF9CT1RIX0VMRU1FTlRfQU5EX1RZUEUgPSAiX1BBUlRfQk9USF9FTEVNRU5UX0FORF9UWVBFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1BBUlRfSU5WQUxJRF9FTEVNRU5UID0gIl9QQVJUX0lOVkFMSURfRUxFTUVOVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9QQVJUX0lOVkFMSURfVFlQRSA9ICJfUEFSVF9JTlZBTElEX1RZUEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1BBUlQgPSAiX1dBUk5fU09BUEVOQ19JTVBPUlRFRF9QQVJUIjsKLQotICBwcml2YXRlIGZpbmFsIGludCBFTEVNRU5UID0gMDsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgVFlQRSA9IDE7Ci0gIAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBSRVFVRVNUID0gIlJlcXVlc3QiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBSRVNQT05TRSA9ICJSZXNwb25zZSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFFVT1RFID0gIiciOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsKLSAgCi0KLSAgLy9wcm90ZWN0ZWQgV1NETDExVmFsaWRhdG9yQ29udHJvbGxlciB2YWxpZGF0b3Jjb250cm9sbGVyOwotICBwcm90ZWN0ZWQgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0b3IjdmFsaWRhdGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkxpc3QsIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgLy90aGlzLnZhbGlkYXRvcmNvbnRyb2xsZXIgPSB2YWxpZGF0b3Jjb250cm9sbGVyOwotICAgIC8vc2V0RGVmYXVsdFJlc291cmNlQnVuZGxlSWZOZWVkZWQodmFsaWRhdG9yY29udHJvbGxlcik7Ci0gICAgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKWVsZW1lbnQ7Ci0gICAgLy92YWxpZGF0ZVR5cGVzKHdzZGxEZWZpbml0aW9uLCB2YWxJbmZvKTsKLSAgICB2YWxpZGF0ZVNlcnZpY2VzKHdzZGxEZWZpbml0aW9uLCB2YWxJbmZvKTsKLSAgICB2YWxpZGF0ZUJpbmRpbmdzKHdzZGxEZWZpbml0aW9uLCB2YWxJbmZvKTsKLSAgICB2YWxpZGF0ZVBvcnRUeXBlcyh3c2RsRGVmaW5pdGlvbiwgdmFsSW5mbyk7Ci0gICAgdmFsaWRhdGVNZXNzYWdlcyh3c2RsRGVmaW5pdGlvbiwgdmFsSW5mbyk7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBUYWtlcyBhIGxpc3Qgb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIGFuZCBjaGVja3MgaWYgdGhlcmUncyBhIHZhbGlkYXRvciAKLSAgICogYXNzb2NpYXRlZCB3aXRoIGVhY2ggZWxlbWVudCBhbmQgaWYgc28gY2FsbHMgdGhlIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZXh0ZW5zaWJpbGl0eUVsZW1lbnRzIFRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIuCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgZGVmbmludGlvbnMgZWxlbWVudCBmb3IgdGhpcyBkb2N1bWVudC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRMaXN0KAotICAgIExpc3QgcGFyZW50cywKLSAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cywKLSAgICBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIFZhbGlkYXRvclJlZ2lzdHJ5IHZlciA9IFZhbGlkYXRvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgSXRlcmF0b3IgZXh0RWxlbXMgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZXh0RWxlbXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZXh0RWxlbXMubmV4dCgpOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIElXU0RMMTFWYWxpZGF0b3IgdmFsID0gdmVyLnF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkobmFtZXNwYWNlKTsKLSAgICAgIGlmICh2YWwgIT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgIHZhbC52YWxpZGF0ZShlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLS8vICAgICAgZWxzZQotLy8gICAgICAgewotLy8gICAgICAgIHZhbEluZm8uYWRkTmFtZXNwYWNlV2l0aE5vVmFsaWRhdG9yKG5hbWVzcGFjZSk7Ci0vLyAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSWYgdGhlIHJlc291cmNlYnVuZGxlIGhhc24ndCBiZWVuIHNldCwgc2V0IGl0IHRvIHRoZSBvbmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBWYWxpZGF0b3JDb250cm9sbGVyLgotICAgKiAKLSAgICogQHBhcmFtIHZhbGlkYXRvcmNvbnRyb2xsZXIgVGhlIHZhbGlkYXRvciBjb250cm9sbGVyIHRvIGdldCB0aGUgcmVzb3VyY2UgYnVuZGxlIGZyb20uCi0gICAqLwotICAvLyAgcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFJlc291cmNlQnVuZGxlSWZOZWVkZWQoV1NETDExVmFsaWRhdG9yQ29udHJvbGxlciB2YWxpZGF0b3Jjb250cm9sbGVyKQotICAvLyAgewotICAvLyAgICBpZiAobWVzc2FnZWdlbmVyYXRvciA9PSBudWxsKQotICAvLyAgICB7Ci0gIC8vICAgICAgc2V0UmVzb3VyY2VCdW5kbGUodmFsaWRhdG9yY29udHJvbGxlci5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKLSAgLy8gICAgfQotICAvLyAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIHJlc291cmNlYnVuZGxlIHRvIHRoZSBvbmUgc3BlY2lmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIHJiIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IHRoZSBUeXBlcyBlbGVtZW50IGlzIGNvcnJlY3QuIAotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50IGZyb20gdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0gICAqLwotCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVHlwZXMoRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBUeXBlcyB0eXBlcyA9IHdzZGxEZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgLy8gZW5zdXJlIHRoYXQgdHlwZXMgaXMgZGVmaW5lZAotICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgcGFyZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHBhcmVudHMuYWRkKHdzZGxEZWZpbml0aW9uKTsKLSAgICAgIE9iamVjdCBleHRlbnNpYmxlRWxlbWVudHNbXSA9IHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLnRvQXJyYXkoKTsKLSAgICAgIHBhcmVudHMuYWRkKDAsIHR5cGVzKTsKLSAgICAgIHZhbGlkYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRMaXN0KHBhcmVudHMsIHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLCB2YWxJbmZvKTsKLSAgICAgIHBhcmVudHMucmVtb3ZlKDApOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgYWxsIG9mIHRoZSBkZWNsYXJlZCBzZXJ2aWNlcyBmb3IgdGhlIGRlZmluaXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb24gVGhlIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU2VydmljZXMoRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBpZiAod3NkbERlZmluaXRpb24uZ2V0U2VydmljZXMoKSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIE9iamVjdCBzZXJ2aWNlc1tdID0gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS50b0FycmF5KCk7Ci0gICAgTGlzdCBwYXJlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIHBhcmVudHMuYWRkKHdzZGxEZWZpbml0aW9uKTsKLSAgICBIYXNodGFibGUgYWxsUG9ydHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICAvL1RPRE86IGNoZWNrIHRoYXQgcG9ydHMgaW4gb3RoZXIgaW1wb3J0ZWQgZmlsZXMgZG9uJ3QgY29uZmxpY3Qgd2l0aCBwb3J0cyBpbiB0aGlzIG9uZQotICAgIC8vICAgIC8vIHJlZ2lzdGVyIGFsbCBvZiB0aGUgaW1wb3J0ZWQgcG9ydHMKLSAgICAvLyAgICBJdGVyYXRvciBpbXBvcnRzID0gd3NkbERlZmluaXRpb24uZ2V0SW1wb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgLy8gICAgd2hpbGUoaW1wb3J0cy5oYXNOZXh0KCkpCi0gICAgLy8gICAgewotICAgIC8vICAgICAgSXRlcmF0b3IgaW1wc2VydmljZXMgPSAoKEltcG9ydClpbXBvcnRzLm5leHQoKSkuZ2V0RGVmaW5pdGlvbigpLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAvLyAgICAgIHdoaWxlKGltcHNlcnZpY2VzLmhhc05leHQoKSkKLSAgICAvLyAgICAgIHsKLSAgICAvLyAgICAgICAgSXRlcmF0b3IgaW1wcG9ydHMgPSAoKFNlcnZpY2UpaW1wc2VydmljZXMubmV4dCgpKS5nZXRQb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgLy8gICAgICAgIHdoaWxlKGltcHBvcnRzLmhhc05leHQoKSkKLSAgICAvLyAgICAgICAgewotICAgIC8vICAgICAgICAgIFBvcnQgdGVtcFAgPSAoUG9ydClpbXBwb3J0cy5uZXh0KCk7Ci0gICAgLy8gICAgICAgICAgYWxsUG9ydHMucHV0KHRlbXBQLmdldE5hbWUoKSx0ZW1wUCk7CQotICAgIC8vICAgICAgICB9Ci0gICAgLy8gICAgICB9Ci0gICAgLy8gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU2VydmljZSBzID0gKFNlcnZpY2Upc2VydmljZXNbaV07Ci0gICAgICBwYXJlbnRzLmFkZCgwLCBzKTsKLSAgICAgIE9iamVjdCBwb3J0c1tdID0gcy5nZXRQb3J0cygpLnZhbHVlcygpLnRvQXJyYXkoKTsKLSAgICAgIEhhc2hTZXQgcG9ydElucHV0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICBIYXNoU2V0IHBvcnRPdXRwdXRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcG9ydHMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIFBvcnQgcCA9IChQb3J0KXBvcnRzW2pdOwotICAgICAgICBwYXJlbnRzLmFkZCgwLCBwKTsKLSAgICAgICAgLy8gYSBQb3J0IG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgV0RTTCBkb2N1bWVudAotICAgICAgICBpZiAoYWxsUG9ydHMuY29udGFpbnMocC5nZXROYW1lKCkpKQotICAgICAgICB7ICBTdHJpbmdbXSBhcmdzID0ge3AuZ2V0TmFtZSgpfTsKLSAgICAgICAgICAKLSAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9QT1JUX05BTUVfTk9UX1VOSVFVRSwgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsIF9QT1JUX05BTUVfTk9UX1VOSVFVRSwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYWxsUG9ydHMucHV0KHAuZ2V0TmFtZSgpLCBwKTsKLQotICAgICAgICAgIC8vIGdldCB0aGUgYmluZGluZyBmb3IgdGhpcyBwb3J0IGFuZCBzZWUgaWYgdGhlIFBvcnRUeXBlIGZvciB0aGUgYmluZGluZwotICAgICAgICAgIC8vIGlzIGRlZmluZWQKLSAgICAgICAgICBpZiAocC5nZXRCaW5kaW5nKCkgPT0gbnVsbCB8fCBwLmdldEJpbmRpbmcoKS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nTmFtZSA9IEVNUFRZX1NUUklORzsKLSAgICAgICAgICAgIGlmIChwLmdldEJpbmRpbmcoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBiaW5kaW5nTmFtZSA9IHAuZ2V0QmluZGluZygpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgYXJnc1tdID0ge3AuZ2V0TmFtZSgpfTsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9OT19CSU5ESU5HX0ZPUl9QT1JULCBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSwgUVVPVEUgKyBiaW5kaW5nTmFtZSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgcCwgX05PX0JJTkRJTkdfRk9SX1BPUlQsIGFyZ3MpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgdGhhdCB0aGUgb3V0cHV0IG9mIG9uZSBwb3J0IGlzbid0IHRoZSBpbnB1dCBvZiBhbm90aGVyIGFuZCB2aWNlIHZlcnNhCi0gICAgICAgICAgICAvLyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHRoZSBwb3J0Ci0gICAgICAgICAgICAvLyB0aGVyZSBjYW4gb25seSBiZSBvbmUgYW5kIG11c3QgYmUgb25lIGV4dGVuc2liaWxpdHkgZWxlbWVudCBkZWZpbmVkIGZvciBhIHBvcnQKLSAgICAgICAgICAgIExpc3QgZXh0ZWxlbXMgPSBwLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgaWYgKGV4dGVsZW1zLnNpemUoKSA8IDEpCi0gICAgICAgICAgICB7IFN0cmluZyBhcmdzW109IHtwLmdldE5hbWUoKX07Ci0gICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX05PX0FERFJFU1NfUE9SVCwgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUpLAotICAgICAgICAgICAgICAgICAgcCwgX05PX0FERFJFU1NfUE9SVCwgYXJncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChleHRlbGVtcy5zaXplKCkgPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmb3IgKGludCBrID0gMTsgayA8IGV4dGVsZW1zLnNpemUoKTsgaysrKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gYXJncyA9IHtwLmdldE5hbWUoKX07Ci0gICAgICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9NT1JFX1RIRU5fT05FX0FERFJFU1NfUE9SVCwgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUpLAotICAgICAgICAgICAgICAgICAgZXh0ZWxlbXMuZ2V0KGspLCBfTU9SRV9USEVOX09ORV9BRERSRVNTX1BPUlQsIGFyZ3MpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdChwYXJlbnRzLCBwLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLCB2YWxJbmZvKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICAgIH0KLSAgICAgIC8vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIHRoZSBzZXJ2aWNlCi0gICAgICB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdChwYXJlbnRzLCBzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLCB2YWxJbmZvKTsKLSAgICAgIHBhcmVudHMucmVtb3ZlKDApOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgdGhhdCB0aGUgYmluZGluZ3MgcmVmZXIgdG8gdmFsaWQgUG9ydFR5cGVzIGFuZCBhbGwgb2YgdGhlIG9wZXJhdGlvbnMKLSAgLy8gaW4gYSBnaXZlbiBiaW5kaW5nIHJlZmVyIHRvIGEgZGVmaW5lZCBvcGVyYXRpb24gd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nCi0gIC8vIFBvcnRUeXBlLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUJpbmRpbmdzKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgaWYgKHdzZGxEZWZpbml0aW9uLmdldEJpbmRpbmdzKCkgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBPYmplY3QgYmluZGluZ3NbXSA9IHdzZGxEZWZpbml0aW9uLmdldEJpbmRpbmdzKCkudmFsdWVzKCkudG9BcnJheSgpOwotICAgIExpc3QgcGFyZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwYXJlbnRzLmFkZCh3c2RsRGVmaW5pdGlvbik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBCaW5kaW5nIGIgPSAoQmluZGluZyliaW5kaW5nc1tpXTsKLSAgICAgIHBhcmVudHMuYWRkKDAsIGIpOwotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiLmdldFBvcnRUeXBlKCk7Ci0KLSAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIC8vIHRoZSBQb3J0VHlwZSBpcyBub3QgZGVmaW5lZCBzbyBkb24ndCBib3RoZXIgY2hlY2tpbmcgdGhlIG9wZXJhdGlvbnMKLSAgICAgIGlmIChwb3J0VHlwZS5pc1VuZGVmaW5lZCgpKQotICAgICAgeyBTdHJpbmdbXSBhcmdzID0ge3BvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIGIuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKX07Ci0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICBfUE9SVFRZUEVfVU5ERUZJTkVEX0ZPUl9CSU5ESU5HLAotICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUsCi0gICAgICAgICAgICBRVU9URSArIGFyZ3NbMV0gKyBRVU9URSksCi0gICAgICAgICAgYiwgX1BPUlRUWVBFX1VOREVGSU5FRF9GT1JfQklORElORywgYXJncyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIHRoZSBQb3J0VHlwZSBpcyBkZWZpbmVkIHNvIG5vdyB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQKLSAgICAgICAgT2JqZWN0IGJpbmRpbmdPcGVyYXRpb25zW10gPSBiLmdldEJpbmRpbmdPcGVyYXRpb25zKCkudG9BcnJheSgpOwotCi0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBvcGVyYXRpb24gaXMgZGVmaW5lZCBmb3IgZWFjaCBCaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgYmluZGluZ09wZXJhdGlvbnMubGVuZ3RoOyBrKyspCi0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJvID0gKEJpbmRpbmdPcGVyYXRpb24pYmluZGluZ09wZXJhdGlvbnNba107Ci0gICAgICAgICAgcGFyZW50cy5hZGQoMCwgYm8pOwotICAgICAgICAgIGlmIChiby5nZXRPcGVyYXRpb24oKSA9PSBudWxsIHx8IGJvLmdldE9wZXJhdGlvbigpLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nW10gYXJncyA9IHtiLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCl9OwotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgX09QRVJBVElPTl9VTkRFRklORURfRk9SX1BPUlRUWVBFLAotICAgICAgICAgICAgICAgIFFVT1RFICsgYXJnc1swXSArIFFVT1RFLAotICAgICAgICAgICAgICAgIFFVT1RFICsgYXJnc1sxXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgYm8sIF9PUEVSQVRJT05fVU5ERUZJTkVEX0ZPUl9QT1JUVFlQRSwgYXJncyk7Ci0gICAgICAgICAgICAvLyBuaWNlIGlkZWEgdG8gYWRkIHN1Z2dlc3Rpb25zIHRvIG90aGVyIGVsZW1lbnRzIHRvIGZpeCB0aGUgZXJyb3IKLSAgICAgICAgICAgIC8vIGJ1dCBpdCBkb2Vzbid0IHdvcmsgd2l0aCBtdWx0aXBlIGZpbGVzIGxpa2UgdGhpcwotICAgICAgICAgICAgLy9hZGRWYWxpZGF0aW9uTWVzc2FnZSh3YXJuaW5nTGlzdCxwb3J0VHlwZSxwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgIkRlZmluZSBhbiBvcGVyYXRpb24gaGVyZSB0byBjb3JyZXNwb25kIHdpdGggdGhlIG9wZXJhdGlvbiBpbjogIiArIGJvLmdldE5hbWUoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIHRha2UgY2FyZSBvZiBhbGwgdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgb3BlcmF0aW9uLCBiaW5kaW5nIGlucHV0cywgb3V0cHV0cyBhbmQgZmF1bHRzCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEJpbmRpbmdJbnB1dCBiaW5wdXQgPSBiby5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChiaW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGFyZW50cy5hZGQoMCwgYmlucHV0KTsKLSAgICAgICAgICAgICAgLy8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBmb3IgYmluZGluZyBvcGVyYXRpb24gaW5wdXQKLSAgICAgICAgICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QoCi0gICAgICAgICAgICAgICAgcGFyZW50cywKLSAgICAgICAgICAgICAgICBiby5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgICB2YWxJbmZvKTsKLSAgICAgICAgICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCaW5kaW5nT3V0cHV0IGJvdXRwdXQgPSBiby5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICAgICAgICBpZiAoYm91dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJlbnRzLmFkZCgwLCBib3V0cHV0KTsKLSAgICAgICAgICAgICAgLy8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBmb3IgYmluZGluZyBvcGVyYXRpb24gb3V0cHV0Ci0gICAgICAgICAgICAgIHZhbGlkYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRMaXN0KAotICAgICAgICAgICAgICAgIHBhcmVudHMsCi0gICAgICAgICAgICAgICAgYm8uZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLAotICAgICAgICAgICAgICAgIHZhbEluZm8pOwotICAgICAgICAgICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG5vIGlucHV0IG9yIG91dHB1dCBoYXMgYmVlbiBkZWZpbmVkIGZvciB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgICBpZiAoYmlucHV0ID09IG51bGwgJiYgYm91dHB1dCA9PSBudWxsKQotICAgICAgICAgICAgeyBTdHJpbmdbXSBhcmdzID0geyBiby5nZXROYW1lKCkgfTsKLSAgICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfT1BFUkFUSU9OX05PX0lOUFVUX09SX09VVFBVVCwgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUpLAotICAgICAgICAgICAgICAgIGJvLCBfT1BFUkFUSU9OX05PX0lOUFVUX09SX09VVFBVVCwgYXJncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGZvciBlYWNoIGJpbmRpbmcgb3BlcmF0aW9uIGZhdWx0Ci0gICAgICAgICAgICBJdGVyYXRvciBmYXVsdHMgPSBiby5nZXRCaW5kaW5nRmF1bHRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChmYXVsdHMuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBCaW5kaW5nRmF1bHQgYmYgPSAoQmluZGluZ0ZhdWx0KWZhdWx0cy5uZXh0KCk7Ci0gICAgICAgICAgICAgIHBhcmVudHMuYWRkKDAsIGJmKTsKLSAgICAgICAgICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgYmYuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHZhbEluZm8pOwotICAgICAgICAgICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBmb3IgYmluZGluZyBvcGVyYXRpb24KLSAgICAgICAgICB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdChwYXJlbnRzLCBiby5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIHRoZSBiaW5kaW5nCi0gICAgICB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdChwYXJlbnRzLCBiLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLCB2YWxJbmZvKTsKLSAgICAgIHBhcmVudHMucmVtb3ZlKDApOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHRoYXQgYWxsIG9mIHRoZSBQb3J0VHlwZXMgaGF2ZSB2YWxpZCBtZXNzYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlaXIKLSAgLy8gb3BlcmF0aW9uIGlucHV0LCBvdXRwdXQgYW5kIGZhdWx0IHR5cGVzLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBvcnRUeXBlcyhEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIGlmICh3c2RsRGVmaW5pdGlvbi5nZXRQb3J0VHlwZXMoKSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIE9iamVjdCBwb3J0dHlwZXNbXSA9IHdzZGxEZWZpbml0aW9uLmdldFBvcnRUeXBlcygpLnZhbHVlcygpLnRvQXJyYXkoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9ydHR5cGVzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFBvcnRUeXBlIHAgPSAoUG9ydFR5cGUpcG9ydHR5cGVzW2ldOwotICAgICAgT2JqZWN0IG9wZXJhdGlvbnNbXSA9IHAuZ2V0T3BlcmF0aW9ucygpLnRvQXJyYXkoKTsKLSAgICAgIExpc3QgaW5BbmRPdXROYW1lcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgb3BlcmF0aW9ucy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgT3BlcmF0aW9uIG8gPSAoT3BlcmF0aW9uKW9wZXJhdGlvbnNbal07Ci0gICAgICAgIGlmIChvID09IG51bGwgfHwgby5pc1VuZGVmaW5lZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSBtZXNzYWdlcyBhcmUgZGVmaW5lZCBmb3IgdGhlIGlucHV0LCBvdXRwdXQgYW5kIGZhdWx0cwotICAgICAgICBNZXNzYWdlIG07Ci0gICAgICAgIElucHV0IGlucHV0ID0gby5nZXRJbnB1dCgpOwotICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBpbnB1dE5hbWUgPSBpbnB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgLy8gaWYgdGhlIG5hbWUgaXNuJ3QgZGVmaW5lZCBpdCBkZWZhdWx0cyB0byB0aGlzCi0gICAgICAgICAgaWYgKGlucHV0TmFtZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0TmFtZSA9IG8uZ2V0TmFtZSgpICsgUkVRVUVTVDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGluQW5kT3V0TmFtZXMuY29udGFpbnMoaW5wdXROYW1lKSkKLSAgICAgICAgICB7IFN0cmluZ1tdIGFyZ3MgPSB7aW5wdXROYW1lLCBwLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgfTsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIF9JTlBVVF9OQU1FX05PVF9VTklRVUUsCi0gICAgICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUsCi0gICAgICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzFdICsgUVVPVEUpLAotICAgICAgICAgICAgICBpbnB1dCwgX0lOUFVUX05BTUVfTk9UX1VOSVFVRSwgYXJncyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbkFuZE91dE5hbWVzLmFkZChpbnB1dE5hbWUpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIG0gPSBpbnB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NOYW1lID0gRU1QVFlfU1RSSU5HOwotICAgICAgICAgICAgUU5hbWUgbWVzc1FOYW1lID0gbS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKG1lc3NRTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtZXNzTmFtZSA9IG1lc3NRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7bWVzc05hbWV9OwotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfTUVTU0FHRV9VTkRFRklORURfRk9SX0lOUFVULCBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSksCi0gICAgICAgICAgICAgICAgaW5wdXQsIF9NRVNTQUdFX1VOREVGSU5FRF9GT1JfSU5QVVQsIGFyZ3MpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBPdXRwdXQgb3V0cHV0ID0gby5nZXRPdXRwdXQoKTsKLSAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG91dHB1dE5hbWUgPSBvdXRwdXQuZ2V0TmFtZSgpOwotICAgICAgICAgIC8vIGlmIHRoZSBuYW1lIGlzbid0IGRlZmluZWQgaXQgZGVmYXVsdHMgdG8gdGhpcwotICAgICAgICAgIGlmIChvdXRwdXROYW1lID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0TmFtZSA9IG8uZ2V0TmFtZSgpICsgUkVTUE9OU0U7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGluQW5kT3V0TmFtZXMuY29udGFpbnMob3V0cHV0TmFtZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nW10gYXJncyA9IHtvdXRwdXROYW1lLCBwLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCl9OwotICAgICAgICAgICAgCi0gICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBfT1VUUFVUX05BTUVfTk9UX1VOSVFVRSwKLSAgICAgICAgICAgICAgICBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSwKLSAgICAgICAgICAgICAgICBRVU9URSArIGFyZ3NbMV0gKyBRVU9URSksCi0gICAgICAgICAgICAgIG91dHB1dCwgX09VVFBVVF9OQU1FX05PVF9VTklRVUUsIGFyZ3MpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5BbmRPdXROYW1lcy5hZGQob3V0cHV0TmFtZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgbSA9IG91dHB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NOYW1lID0gRU1QVFlfU1RSSU5HOwotICAgICAgICAgICAgUU5hbWUgbWVzc1FOYW1lID0gbS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKG1lc3NRTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtZXNzTmFtZSA9IG1lc3NRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7bWVzc05hbWV9OwotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfTUVTU0FHRV9VTkRFRklORURfRk9SX09VVFBVVCwgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUpLAotICAgICAgICAgICAgICAgIG91dHB1dCwgX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9PVVRQVVQsIGFyZ3MpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBmYXVsdHNbXSA9IG8uZ2V0RmF1bHRzKCkudmFsdWVzKCkudG9BcnJheSgpOwotCi0gICAgICAgIC8vTGlzdCBmYXVsdE5hbWVzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGZhdWx0cy5sZW5ndGg7IGsrKykKLSAgICAgICAgewotICAgICAgICAgIEZhdWx0IGYgPSAoRmF1bHQpZmF1bHRzW2tdOwotICAgICAgICAgIG0gPSBmLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICBpZiAobSAhPSBudWxsICYmIG0uaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc05hbWUgPSBFTVBUWV9TVFJJTkc7Ci0gICAgICAgICAgICBRTmFtZSBtZXNzUU5hbWUgPSBtLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICBpZiAobWVzc1FOYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1lc3NOYW1lID0gbWVzc1FOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGFyZ3NbXSA9IHttZXNzTmFtZX07Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9NRVNTQUdFX1VOREVGSU5FRF9GT1JfRkFVTFQsIFFVT1RFICsgYXJnc1swXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICBmLCBfTUVTU0FHRV9VTkRFRklORURfRk9SX0ZBVUxULCBhcmdzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgdGhhdCBhbGwgdGhlIG1lc3NhZ2VzIGRlZmluZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQgYXJlIHZhbGlkLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1lc3NhZ2VzKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgaWYgKHdzZGxEZWZpbml0aW9uLmdldE1lc3NhZ2VzKCkgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBJdGVyYXRvciBtZXNzYWdlcyA9IHdzZGxEZWZpbml0aW9uLmdldE1lc3NhZ2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgIHdoaWxlIChtZXNzYWdlcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgTWVzc2FnZSBtID0gKE1lc3NhZ2UpbWVzc2FnZXMubmV4dCgpOwotICAgICAgaWYgKCFtLmlzVW5kZWZpbmVkKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIHRoZSBtZXNzYWdlIGhhcyBhIHBhcnQgKGFuZCBpdCBkb2Vzbid0IGhhdmUgdG8pCi0gICAgICAgIC8vIGVuc3VyZSBlYWNoIG1lc3NhZ2UgcGFydCBoYXMgZWl0aGVyIGFuIGVsZW1lbnQgb3IgYSB0eXBlCi0gICAgICAgIGlmICghbS5nZXRQYXJ0cygpLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIHBhcnRzID0gbS5nZXRQYXJ0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKHBhcnRzLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQYXJ0IHAgPSAoUGFydClwYXJ0cy5uZXh0KCk7Ci0gICAgICAgICAgICBRTmFtZSBlbGVtZW50TmFtZSA9IHAuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIFFOYW1lIHR5cGVOYW1lID0gcC5nZXRUeXBlTmFtZSgpOwotICAgICAgICAgICAgTWFwIGV4dEF0dHMgPSBwLmdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIC8vIFRPRE86VGhpcyB3aWxsIGhhdmUgdG8gYmUgZXh0ZW5kZWQgYXMgcGFydHMgY2FuIGhhdmUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgICAgICAgLy9lbnN1cmUgdGhlIHBhcnQgaGFzIGEgdHlwZSBvciBhbiBlbGVtZW50IGRlZmluZWQKLSAgICAgICAgICAgIGlmIChlbGVtZW50TmFtZSA9PSBudWxsICYmIHR5cGVOYW1lID09IG51bGwgJiYgKGV4dEF0dHMgPT0gbnVsbCB8fCBleHRBdHRzLmlzRW1wdHkoKSkpCi0gICAgICAgICAgICB7IFN0cmluZ1tdIGFyZ3MgPSB7IHAuZ2V0TmFtZSgpfTsKLSAgICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfUEFSVF9OT19FTEVNRU5UX09SX1RZUEUsIFFVT1RFICsgYXJnc1swXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICAgIHAsIF9QQVJUX05PX0VMRU1FTlRfT1JfVFlQRSwgYXJncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2hlcmUgdGhlIHBhcnQgaGFzIGJvdGggdGhlIGVsZW1lbnQgYW5kIHR5cGUgZGVmaW5lZCBhbmQgaXQgY2FuIG9ubHkgaGF2ZSBvbmUgZGVmaW5lZAkKLSAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnROYW1lICE9IG51bGwgJiYgdHlwZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsgU3RyaW5nW10gYXJncyA9IHtwLmdldE5hbWUoKX07Ci0gICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX1BBUlRfQk9USF9FTEVNRU5UX0FORF9UWVBFLCBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSksCi0gICAgICAgICAgICAgICAgICBwLCBfUEFSVF9CT1RIX0VMRU1FTlRfQU5EX1RZUEUsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudE5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFjaGVja1BhcnRDb25zdGl0dWVudChlbGVtZW50TmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICBlbGVtZW50TmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICBFTEVNRU5ULAotICAgICAgICAgICAgICAgIHAsCi0gICAgICAgICAgICAgICAgdmFsSW5mbykpCi0gICAgICAgICAgICAgIHsgU3RyaW5nW10gYXJncyA9IHtwLmdldE5hbWUoKSwgZWxlbWVudE5hbWUuZ2V0TG9jYWxQYXJ0KCl9OwotICAgICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgX1BBUlRfSU5WQUxJRF9FTEVNRU5ULAotICAgICAgICAgICAgICAgICAgICBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSwKLSAgICAgICAgICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzFdICsgUVVPVEUpLAotICAgICAgICAgICAgICAgICAgcCwgX1BBUlRfSU5WQUxJRF9FTEVNRU5ULCBhcmdzKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodHlwZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgdHlwZSBpdHNlbGYgaXMgZGVmaW5lZCBwcm9wZXJseQotICAgICAgICAgICAgICBpZiAoIWNoZWNrUGFydENvbnN0aXR1ZW50KHR5cGVOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCB0eXBlTmFtZS5nZXRMb2NhbFBhcnQoKSwgVFlQRSwgcCwgdmFsSW5mbykpCi0gICAgICAgICAgICAgIHsgU3RyaW5nW10gYXJncyA9IHtwLmdldE5hbWUoKSwgdHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCkgfTsgCi0gICAgICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBfUEFSVF9JTlZBTElEX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIFFVT1RFICsgYXJnc1swXSArIFFVT1RFLAotICAgICAgICAgICAgICAgICAgICBRVU9URSArIGFyZ3NbMV0gKyBRVU9URSksCi0gICAgICAgICAgICAgICAgICBwLCBfUEFSVF9JTlZBTElEX1RZUEUsIGFyZ3MpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBuYW1lIGlzIGRlZmluZWQgaW4gdGhlIG5hbWVzcGFjZSBmb3IgdGhlIHBhcnQuICBBIHBhcnQgaXMgYW4KLSAgICogRUxFTUVOVCBvciBhIFRZUEUuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdG8gY2hlY2suCi0gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGNoZWNrLgotICAgKiBAcGFyYW0gcGFydCBUaGUgcGFydCB0byBjaGVjaywgZWl0aGVyIEVMRU1FTlQgb3IgVFlQRS4KLSAgICogQHBhcmFtIHBhcnRPYmplY3QgVGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHBhcnQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGFydCBlbGVtZW50IG9mIHR5cGUgaXMgZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tQYXJ0Q29uc3RpdHVlbnQoCi0gICAgU3RyaW5nIG5hbWVzcGFjZSwKLSAgICBTdHJpbmcgbmFtZSwKLSAgICBpbnQgcGFydCwKLSAgICBQYXJ0IHBhcnRPYmplY3QsCi0gICAgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLQotICAgIGJvb2xlYW4gcGFydHZhbGlkID0gZmFsc2U7Ci0gICAgLy8gRmlyc3QgdGFrZSBjYXJlIG9mIHRoZSBzaXR1YXRpb24gd2hlcmUgaXQncyBmcm9tIHRoZSBzY2hlbWEgbmFtZXNwYWNlLgotICAgIC8vIFRoZSAxOTk5LCAyMDAwIGFuZCAyMDAxIHNjaGVtYSBuYW1lc3BhY2VzIGFyZSBhbGwgYWNjZXB0ZWQuCi0gICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMSkKLSAgICAgIHx8IG5hbWVzcGFjZS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSkKLSAgICAgIHx8IG5hbWVzcGFjZS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCkpCi0gICAgewotICAgICAgU2NoZW1hQXR0cmlidXRlVGFibGUgeHNkVGFibGUgPSBuZXcgU2NoZW1hQXR0cmlidXRlVGFibGUoKTsKLSAgICAgIGlmICh4c2RUYWJsZS5jb250YWluc1N5bWJvbChuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcGFydHZhbGlkID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gY2hlY2sgaW5saW5lIGFuZCBpbXBvcnRlZCBzY2hlbWEKLSAgICBlbHNlCi0gICAgewotICAgICAgWFNNb2RlbFtdIHNjaGVtYXMgPSB2YWxJbmZvLmdldFNjaGVtYXMoKTsKLSAgICAgIGludCBudW1TY2hlbWFzID0gc2NoZW1hcy5sZW5ndGg7Ci0gICAgICAvL0l0ZXJhdG9yIHNjaGVtYXNJdGVyID0gc2NoZW1hcy5pdGVyYXRvcigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TY2hlbWFzOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFhTTW9kZWwgc2NoZW1hID0gc2NoZW1hc1tpXTsKLSAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHBhcnQgPT0gRUxFTUVOVCAmJiBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9uKG5hbWUsIG5hbWVzcGFjZSkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHBhcnQgPT0gVFlQRSAmJiBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb24obmFtZSwgbmFtZXNwYWNlKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcnR2YWxpZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gSWYgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgaW1wb3J0ZWQgZG8gc28KLQkvLyBub3cuCi0gICAgLy8gQWxsb3cgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIHRvIGJlIGF1dG9tYXRpY2FsbHkgaW1wb3J0ZWQgYnV0IG1hcmsKLQkvLyBpdCBhcyBhIHdhcm5pbmcuCi0gICAgaWYgKCFwYXJ0dmFsaWQgJiYgbmFtZXNwYWNlLmVxdWFscyhTT0FQX0VOQ09ESU5HX1VSSSkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFhTRFZhbGlkYXRvciB4c2RWYWwgPSBuZXcgWFNEVmFsaWRhdG9yKCk7Ci0gICAgICAgIFN0cmluZyBzb2FwRW5jID0gdmFsSW5mby5nZXRVUklSZXNvbHZlcigpLnJlc29sdmUobnVsbCwgU09BUF9FTkNPRElOR19VUkksIG51bGwpOwotICAgICAgICBpZihzb2FwRW5jICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RWYWwudmFsaWRhdGUoc29hcEVuYywgbnVsbCk7Ci0gICAgICAgICAgLy8gc2FuaXR5IGNoZWNrIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgd3JvbmcKLSAgICAgICAgICBpZiAoeHNkVmFsLmlzVmFsaWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU01vZGVsIHhzTW9kZWwgPSB4c2RWYWwuZ2V0WFNNb2RlbCgpOwotCi0gICAgICAgICAgICBpZiAocGFydCA9PSBFTEVNRU5UICYmIHhzTW9kZWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKG5hbWUsIG5hbWVzcGFjZSkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGFydHZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcnQgPT0gVFlQRSAmJiB4c01vZGVsLmdldFR5cGVEZWZpbml0aW9uKG5hbWUsIG5hbWVzcGFjZSkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGFydHZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbEluZm8uYWRkV2FybmluZyhtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1BBUlQsIFFVT1RFICsgbmFtZSArIFFVT1RFKSwgcGFydE9iamVjdCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vVE9ETzogbG9nIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGFydHZhbGlkOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRpb25JbmZvSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExVmFsaWRhdGlvbkluZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzc3OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExVmFsaWRhdGlvbkluZm9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25JbmZvSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLklVUklSZXNvbHZlcjsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbmF0aW9uIG9mIFdTREwxMVZhbGlkYXRpb25JbmZvLgotICovCi1wdWJsaWMgY2xhc3MgV1NETDExVmFsaWRhdGlvbkluZm9JbXBsIGltcGxlbWVudHMgSVdTREwxMVZhbGlkYXRpb25JbmZvCi17Ci0gIHByaXZhdGUgSVZhbGlkYXRpb25JbmZvIHZhbGluZm8gPSBudWxsOwotICBwcml2YXRlIEhhc2h0YWJsZSBlbGVtZW50bG9jYXRpb25zID0gbnVsbDsKLSAgcHJpdmF0ZSBMaXN0IHNjaGVtYXMgPSBuZXcgVmVjdG9yKCk7Ci0gIAotICBwdWJsaWMgV1NETDExVmFsaWRhdGlvbkluZm9JbXBsKElWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKQotICB7Ci0gICAgdGhpcy52YWxpbmZvID0gdmFsaW5mbzsKLSAgfQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8jZ2V0RmlsZVVSSSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZpbGVVUkkoKQotICB7Ci0gICAgcmV0dXJuIHZhbGluZm8uZ2V0RmlsZVVSSSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvI2FkZFNjaGVtYShvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkU2NoZW1hKFhTTW9kZWwgeHNNb2RlbCkKLSAgewotICAgIGlmICh4c01vZGVsICE9IG51bGwpCi0gICAgewotICAgICAgc2NoZW1hcy5hZGQoeHNNb2RlbCk7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8jZ2V0U2NoZW1hcygpCi0gICAqLwotICBwdWJsaWMgWFNNb2RlbFtdIGdldFNjaGVtYXMoKQotICB7Ci0gICAgcmV0dXJuIChYU01vZGVsW10pc2NoZW1hcy50b0FycmF5KG5ldyBYU01vZGVsW3NjaGVtYXMuc2l6ZSgpXSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS53c2RsMTEuV1NETDExVmFsaWRhdGlvbkluZm8jY2xlYXJkU2NoZW1hcygpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhclNjaGVtYXMoKQotICB7Ci0gICAgc2NoZW1hcy5jbGVhcigpOwotICB9Ci0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbyNzZXRFbGVtZW50TG9jYXRpb25zKGphdmEudXRpbC5IYXNodGFibGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TG9jYXRpb25zKEhhc2h0YWJsZSBlbGVtZW50TG9jYXRpb25zKQotICB7Ci0gICAgdGhpcy5lbGVtZW50bG9jYXRpb25zID0gZWxlbWVudExvY2F0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbyNhZGRFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgYWRkRXJyb3IobWVzc2FnZSwgZWxlbWVudCwgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbyNhZGRFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgewotICAgIExvY2F0aW9uSG9sZGVyIGxvY2F0aW9uOwotICAgIGlmIChlbGVtZW50bG9jYXRpb25zLmNvbnRhaW5zS2V5KGVsZW1lbnQpKQotICAgIHsKLSAgICAgIGxvY2F0aW9uID0gKExvY2F0aW9uSG9sZGVyKWVsZW1lbnRsb2NhdGlvbnMuZ2V0KGVsZW1lbnQpOwotICAgICAgYWRkRXJyb3IobWVzc2FnZSwgbG9jYXRpb24uZ2V0TGluZSgpLCBsb2NhdGlvbi5nZXRDb2x1bW4oKSwgbG9jYXRpb24uZ2V0VVJJKCksIGVycm9yS2V5LCBtZXNzYWdlQXJndW1lbnRzKTsKLSAgICB9Ci0gICAgLy8gaWYgd2UgZ2l2ZSBpdCBhbiBlbGVtZW50IHRoYXQgaGFzbid0IGJlZW4gZGVmaW5lZCB3ZSdsbCBzZXQgdGhlIGxvY2F0aW9uCi0gICAgLy8gYXQgKDAsMCkgc28gdGhlIGVycm9yIHNob3dzIHVwIGJ1dCBubyBsaW5lIG1hcmtlciBpbiB0aGUgZWRpdG9yCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGFkZEVycm9yKG1lc3NhZ2UsIDAsIDEsIGdldEZpbGVVUkkoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvI2FkZFdhcm5pbmcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgTG9jYXRpb25Ib2xkZXIgbG9jYXRpb247Ci0gICAgaWYgKGVsZW1lbnRsb2NhdGlvbnMuY29udGFpbnNLZXkoZWxlbWVudCkpCi0gICAgewotICAgICAgbG9jYXRpb24gPSAoTG9jYXRpb25Ib2xkZXIpZWxlbWVudGxvY2F0aW9ucy5nZXQoZWxlbWVudCk7Ci0gICAgICBhZGRXYXJuaW5nKG1lc3NhZ2UsIGxvY2F0aW9uLmdldExpbmUoKSwgbG9jYXRpb24uZ2V0Q29sdW1uKCksIGxvY2F0aW9uLmdldFVSSSgpKTsKLSAgICB9Ci0gICAgLy8gaWYgd2UgZ2l2ZSBpdCBhbiBlbGVtZW50IHRoYXQgaGFzbid0IGJlZW4gZGVmaW5lZCB3ZSdsbCBzZXQgdGhlIGxvY2F0aW9uCi0gICAgLy8gYXQgKDAsMCkgc28gdGhlIGVycm9yIHNob3dzIHVwIGJ1dCBubyBsaW5lIG1hcmtlciBpbiB0aGUgZWRpdG9yCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGFkZFdhcm5pbmcobWVzc2FnZSwgMCwgMSwgZ2V0RmlsZVVSSSgpKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUud3NkbDExLldTREwxMVZhbGlkYXRpb25JbmZvI2FkZE5hbWVzcGFjZVdpdGhOb1ZhbGlkYXRvcihqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VXaXRoTm9WYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSkKLS8vICB7Ci0vLyAgICB2YWxpbmZvLmFkZE5hbWVzcGFjZVdpdGhOb1ZhbGlkYXRvcihuYW1lc3BhY2UpOwotLy8KLS8vICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvI2FkZEVycm9yKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgYWRkRXJyb3IobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIG51bGwsIG51bGwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBTdHJpbmcgZXJyb3JLZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsgCi0gICAgdHJ5Ci0gICAgeyAoKFZhbGlkYXRpb25JbmZvSW1wbCl2YWxpbmZvKS5hZGRFcnJvcihtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgZXJyb3JLZXksIG1lc3NhZ2VBcmd1bWVudHMpOwotICAgIH0KLSAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0gICAgeyBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB2YWxpbmZvLmFkZEVycm9yKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbyNhZGRXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpCi0gIHsKLSAgICB2YWxpbmZvLmFkZFdhcm5pbmcobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmkpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUud3NkbDExLldTREwxMVZhbGlkYXRpb25JbmZvI2dldFVSSVJlc29sdmVyKCkKLSAgICovCi0gIHB1YmxpYyBJVVJJUmVzb2x2ZXIgZ2V0VVJJUmVzb2x2ZXIoKSAKLSAgewotCXJldHVybiB2YWxpbmZvLmdldFVSSVJlc29sdmVyKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0NmU4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JV1NETFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmV4Y2VwdGlvbi5WYWxpZGF0ZVdTRExFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuQ29uc3RhbnRzOwotCi0vKioKLSAqIFRoZSB2YWxpZGF0b3IgY29udHJvbGxlciBpcyB0aGUgaGVhZCBvZiB2YWxpZGF0aW9uLiAKLSAqLwotcHVibGljIGNsYXNzIFdTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIgaW1wbGVtZW50cyBJV1NETFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9XQVJOX05PX1ZBTERJQVRPUiA9ICJfV0FSTl9OT19WQUxESUFUT1IiOwotLy8gIHByb3RlY3RlZCBmaW5hbCBpbnQgRVJST1JfTUVTU0FHRSA9IDA7Ci0vLyAgcHJvdGVjdGVkIGZpbmFsIGludCBXQVJOSU5HX01FU1NBR0UgPSAxOwotLy8gIHByb3RlY3RlZCBTdHJpbmcgZmlsZVVSSTsKLS8vICBwcm90ZWN0ZWQgTGlzdCBzY2hlbWFzID0gbmV3IFZlY3RvcigpOwotLy8gIHByb3RlY3RlZCBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uOwotICBwcm90ZWN0ZWQgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yID0gbnVsbDsKLSAgLy9wcm90ZWN0ZWQgVmFsaWRhdGlvbkNvbnRyb2xsZXIgdmFsaWRhdGlvbkNvbnRyb2xsZXI7Ci0gIHByb3RlY3RlZCBWYWxpZGF0b3JSZWdpc3RyeSB2ZXIgPSBWYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBXU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyKCkKLSAgewotICB9Ci0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5JV1NETFZhbGlkYXRvciN2YWxpZGF0ZShvcmcudzNjLmRvbS5Eb2N1bWVudCwgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5WYWxpZGF0aW9uSW5mbykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKERvY3VtZW50IGRvbU1vZGVsLCBJVmFsaWRhdGlvbkluZm8gdmFsSW5mbykgdGhyb3dzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgLy8gcmVzZXQgdGhlIHZhcmlhYmxlcwotLy8gICAgcmVzZXQoKTsKLS8vICAgIGZpbGVVUkkgPSB2YWxJbmZvLmdldEZpbGVVUkkoKTsKLSAgICAvL3RoaXMudmFsaWRhdGlvbkNvbnRyb2xsZXIgPSB2YWxpZGF0aW9uY29udHJvbGxlcjsKLQotICAgIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB3c2RsdmFsaW5mbyA9IG5ldyBXU0RMMTFWYWxpZGF0aW9uSW5mb0ltcGwodmFsSW5mbyk7Ci0gICAgV1NETERvY3VtZW50W10gd3NkbERvY3MgPSByZWFkV1NETERvY3VtZW50KGRvbU1vZGVsLCB2YWxJbmZvLmdldEZpbGVVUkkoKSwgZ2V0TWVzc2FnZUdlbmVyYXRvcigpLCB3c2RsdmFsaW5mbyk7Ci0gICAgLy8gRG9uJ3QgdmFsaWRhdGUgYW4gbnVsbCBkZWZpbml0aW9ucyBlbGVtZW50LiBFaXRoZXIgdGhlIGZpbGUgaXMgZW10cHkgYW5kIHZhbGlkIG9yCi0gICAgLy8gaGFkIGFuIGVycm9yIHdoZW4gcmVhZGluZy4KLSAgICBpZih3c2RsRG9jcyAhPSBudWxsKQotICAgIHsgIAotICAgICAgaW50IG51bVdTRExEb2NzID0gd3NkbERvY3MubGVuZ3RoOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bVdTRExEb2NzOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCB0ZW1wRG9jID0gd3NkbERvY3NbaV07Ci0gICAgICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSB0ZW1wRG9jLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIHNjaGVtYXMuCi0gICAgICAgIExpc3QgeHNkTGlzdCA9IHRlbXBEb2MuZ2V0U2NoZW1hcygpOwotICAgICAgICBJdGVyYXRvciB4c2RJdGVyID0geHNkTGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoeHNkSXRlci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICB3c2RsdmFsaW5mby5hZGRTY2hlbWEoKFhTTW9kZWwpeHNkSXRlci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFNldCB0aGUgZWxlbWVudCBsb2NhdGlvbnMgdGFibGUuCi0gICAgICAgIHdzZGx2YWxpbmZvLnNldEVsZW1lbnRMb2NhdGlvbnModGVtcERvYy5nZXRFbGVtZW50TG9jYXRpb25zKCkpOwotICAgICAgICAvLyBTZXQgYW55IHJlYWRlciBlcnJvcnMuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBhZnRlciB0aGUgZWxlbWVudCBsb2NhdGlvbnMgdGFibGUgaXMgc2V0LgotICAgICAgICBMaXN0IHJlYWRlckVycm9ycyA9IHRlbXBEb2MuZ2V0UmVhZGVyRXJyb3JzKCk7Ci0gICAgICAgIGlmIChyZWFkZXJFcnJvcnMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIHJlYWRlckVycm9yc0kgPSByZWFkZXJFcnJvcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAocmVhZGVyRXJyb3JzSS5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgUmVhZGVyRXJyb3IgcmUgPSAoUmVhZGVyRXJyb3IpcmVhZGVyRXJyb3JzSS5uZXh0KCk7Ci0gICAgICAgICAgICB3c2RsdmFsaW5mby5hZGRFcnJvcihyZS5nZXRFcnJvcigpLCByZS5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExpc3QgcmVhZGVyV2FybmluZ3MgPSB0ZW1wRG9jLmdldFJlYWRlcldhcm5pbmdzKCk7Ci0gICAgICAgIGlmIChyZWFkZXJXYXJuaW5ncyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSXRlcmF0b3IgcmVhZGVyV2FybmluZ3NJID0gcmVhZGVyV2FybmluZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAocmVhZGVyV2FybmluZ3NJLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBSZWFkZXJFcnJvciByZSA9IChSZWFkZXJFcnJvcilyZWFkZXJXYXJuaW5nc0kubmV4dCgpOwotICAgICAgICAgICAgd3NkbHZhbGluZm8uYWRkV2FybmluZyhyZS5nZXRFcnJvcigpLCByZS5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHZhbGlkYXRlV1NETEVsZW1lbnQoQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCB3c2RsRGVmaW5pdGlvbiwgbmV3IFZlY3RvcigpLCB3c2RsdmFsaW5mbyk7Ci0gICAgICAgIHdzZGx2YWxpbmZvLmNsZWFyU2NoZW1hcygpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIGFuIGltcG9ydGVkIFdTREwgZG9jdW1lbnQuIEFsbG93cyB0aGUgY2FsbGluZyBjbGFzcyB0byBoYXZlIGFjY2VzcyB0byB0aGUgaW50ZXJuYWwKLSAgICogY29tcG9uZW50cyBvZiB0aGUgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsdmFsaW5mbyBUaGUgV1NETCAxLjEgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byB1c2UuCi0gICAqIEByZXR1cm4gVGhlIGRlZmluaXRpb25zIGVsZW1lbnQgZm9yIHRoZSBpbXBvcnQuCi0gICAqIEB0aHJvd3MgVmFsaWRhdGVXU0RMRXhjZXB0aW9uCi0gICAqLwotLy8gIHByb3RlY3RlZCBEZWZpbml0aW9uIHZhbGlkYXRlSW1wb3J0KFdTREwxMVZhbGlkYXRpb25JbmZvIHdzZGx2YWxpbmZvKQotLy8gIHsKLS8vICAgIFdTRExEb2N1bWVudFtdIHdzZGxEb2NzID0gbnVsbDsKLS8vICAgIHRyeQotLy8gICAgewotLy8gICAgICB3c2RsRG9jcyA9IHJlYWRXU0RMRG9jdW1lbnQobnVsbCwgd3NkbHZhbGluZm8uZ2V0RmlsZVVSSSgpLCBnZXRNZXNzYWdlR2VuZXJhdG9yKCksIHdzZGx2YWxpbmZvKTsKLS8vICAgIH0KLS8vICAgIGNhdGNoKFZhbGlkYXRlV1NETEV4Y2VwdGlvbiBlKQotLy8gICAgewotLy8gICAgICAvLyBzdXByZXNzIGFueSB2YWxpZGF0aW9uIGlzc3VlcyB3aXRoIGltcG9ydGVkIGRvY3VtZW50cwotLy8gICAgfQotLy8gICAgLy8gRG9uJ3QgdmFsaWRhdGUgYW4gbnVsbCBkZWZpbml0aW9ucyBlbGVtZW50LiBFaXRoZXIgdGhlIGZpbGUgaXMgZW10cHkgYW5kIHZhbGlkIG9yCi0vLyAgICAvLyBoYWQgYW4gZXJyb3Igd2hlbiByZWFkaW5nLgotLy8gICAgaWYod3NkbERvY3MgIT0gbnVsbCkKLS8vICAgICB7ICAKLS8vICAgICAgdmFsaWRhdGVXU0RMRWxlbWVudChDb25zdGFudHMuTlNfVVJJX1dTREwsIHdzZGxEZWZpbml0aW9uLCBuZXcgVmVjdG9yKCksIHdzZGx2YWxpbmZvKTsKLS8vICAgIH0KLS8vICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbjsKLS8vICB9Ci0gIAotICAvKioKLSAgICogUmVhZCBpbiB0aGUgV1NETCBkb2N1bWVudCBhbmQgc2V0IHRoZSBtb2RlbCBhbmQgaW1wb3J0ZWQgc2NoZW1hcy4KLSAgICogCi0gICAqIEBwYXJhbSBkb21Nb2RlbCBBIERPTSBtb2RlbCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgcmVhZC4KLSAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gcmVhZC4KLSAgICogQHBhcmFtIG1lc3NhZ2VnZW5lcmF0b3IgVGhlIG1lc3NhZ2VnZW5lcmF0b3IgdGhlIHJlYWRlciBzaG91bGQgdXNlIGZvciBhbnkgbWVzc2FnZXMgcHJvZHVjZWQuCi0gICAqIEBwYXJhbSB3c2RsdmFsaW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICogQHJldHVybiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudCBmb3IgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgVmFsaWRhdGVXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETERvY3VtZW50W10gcmVhZFdTRExEb2N1bWVudChEb2N1bWVudCBkb21Nb2RlbCwgU3RyaW5nIGZpbGUsIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvciwgSVdTREwxMVZhbGlkYXRpb25JbmZvIHdzZGx2YWxpbmZvKSB0aHJvd3MgVmFsaWRhdGVXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBXU0RMRG9jdW1lbnRbXSB3c2RsRG9jcyA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotCi0gICAgICBXU0RMUmVhZGVySW1wbCB3c2RsUmVhZGVyID0gbmV3IFdTRExSZWFkZXJJbXBsKHdzZGx2YWxpbmZvKTsKLSAgICAgIHdzZGxSZWFkZXIuc2V0TWVzc2FnZUdlbmVyYXRvcihtZXNzYWdlZ2VuZXJhdG9yKTsKLSAgICAgIGlmKGRvbU1vZGVsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHdzZGxEb2NzID0gd3NkbFJlYWRlci5yZWFkV1NETChmaWxlLCBkb21Nb2RlbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7ICAKLSAgICAgICAgd3NkbERvY3MgPSB3c2RsUmVhZGVyLnJlYWRXU0RMKGZpbGUpOwotICAgICAgfQotICAgICAgLy93c2RsdmFsaW5mby5zZXRFbGVtZW50TG9jYXRpb25zKHdzZGxSZWFkZXIuZ2V0RWxlbWVudExvY2F0aW9uc0hhc2h0YWJsZSgpKTsKLS8vICAgICAgTGlzdCByZWFkZXJFcnJvcnMgPSB3c2RsUmVhZGVyLmdldFJlYWRlckVycm9ycygpOwotLy8gICAgICBpZiAocmVhZGVyRXJyb3JzICE9IG51bGwpCi0vLyAgICAgICB7Ci0vLyAgICAgICAgSXRlcmF0b3IgcmVhZGVyRXJyb3JzSSA9IHJlYWRlckVycm9ycy5pdGVyYXRvcigpOwotLy8gICAgICAgIHdoaWxlIChyZWFkZXJFcnJvcnNJLmhhc05leHQoKSkKLS8vICAgICAgICAgewotLy8gICAgICAgICAgUmVhZGVyRXJyb3IgcmUgPSAoUmVhZGVyRXJyb3IpcmVhZGVyRXJyb3JzSS5uZXh0KCk7Ci0vLyAgICAgICAgICB3c2RsdmFsaW5mby5hZGRFcnJvcihyZS5nZXRFcnJvcigpLCByZS5nZXRPYmplY3QoKSk7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIGlmICh3c2RsUmVhZGVyLmhhc0ltcG9ydFNjaGVtYXMoKSkKLS8vICAgICAgewotLy8gICAgICAgIExpc3QgeHNkTGlzdCA9IHdzZGxSZWFkZXIuZ2V0SW1wb3J0U2NoZW1hcygpOwotLy8gICAgICAgIEl0ZXJhdG9yIHhzZEl0ZXIgPSB4c2RMaXN0Lml0ZXJhdG9yKCk7Ci0vLyAgICAgICAgd2hpbGUgKHhzZEl0ZXIuaGFzTmV4dCgpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHdzZGx2YWxpbmZvLmFkZFNjaGVtYSgoWFNNb2RlbCl4c2RJdGVyLm5leHQoKSk7Ci0vLyAgICAgICAgfQotLy8KLS8vICAgICAgfQotCi0gICAgfQotICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFZhbGlkYXRlV1NETEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSArICIgIiArIGUuZ2V0RmF1bHRDb2RlKCkpOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVmFsaWRhdGVXU0RMRXhjZXB0aW9uKCJ1bmFibGUgdG8gcmVhZCBmaWxlIiArIGUuZ2V0TWVzc2FnZSgpICsgIiAiICsgZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdzZGxEb2NzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgV1NETCBlbGVtZW50LCBjYWxsIFZhbGlkYXRlRWxlbWVudCBmb3IgaXQuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gcGFyZW50cyBUaGUgbGlzdCBvZiBwYXJlbnRzIGZvciB0aGlzIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVdTRExFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB3c2RsdmFsaW5mbykKLSAgewotICAgIElXU0RMMTFWYWxpZGF0b3IgdmFsID0gdmVyLnF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkobmFtZXNwYWNlKTsKLSAgICBpZiAodmFsICE9IG51bGwpCi0gICAgewotICAgICAgdmFsLnZhbGlkYXRlKGVsZW1lbnQsIHBhcmVudHMsIHdzZGx2YWxpbmZvKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkgIC8vVE9ETzogQWRkIHRoaXMgYXMgYSBwcmVmZXJlbmNlLgotICAgICAgLy93c2RsdmFsaW5mby5hZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9XQVJOX05PX1ZBTERJQVRPUiwgbmFtZXNwYWNlKSwgZWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHNjaGVtYSB0byB0aGUgbGlzdCBvZiBzY2hlbWFzLgotICAgKiAKLSAgICogQHBhcmFtIHhzTW9kZWwgVGhlIHNjaGVtYSB0byBhZGQuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZFNjaGVtYShYU01vZGVsIHhzTW9kZWwpCi0vLyAgewotLy8gICAgaWYgKHhzTW9kZWwgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgc2NoZW1hcy5hZGQoeHNNb2RlbCk7Ci0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxpc3QgY29udGFpbmluZyB0aGUgc2NoZW1hcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2Ygc2NoZW1hcy4KLSAgICovCi0vLyAgcHVibGljIExpc3QgZ2V0U2NoZW1hcygpCi0vLyAgewotLy8gICAgcmV0dXJuIHNjaGVtYXM7Ci0vLyAgfQotCi0gIC8qKgotICAJKiBHZXQgdGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIFZhbGlkYXRvck1hbmFnZXIuCi0gIAkqIAotICAJKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBidW5kbGUgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAJKiBAc2VlICNzZXRSZXNvdXJjZUJ1bmRsZQotICAJKi8KLS8vICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKQotLy8gIHsKLS8vICAgIHJldHVybiByZXNvdXJjZWJ1bmRsZTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgUmVzb3VyY2VCdW5kbGUgZm9yIHRoaXMgVmFsaWRhdG9yTWFuYWdlci4KLSAgICogCi0gICAqIEBwYXJhbSByYiBUaGUgcmVzb3VyY2UgYnVuZGxlIHRvIHNldC4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VCdW5kbGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgaWYgKG1lc3NhZ2VnZW5lcmF0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICAgIH0KLQotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBtZXNzYWdlIGdlbmVyYXRvciBmb3IgdGhpcyBjb250cm9sbGVyLgotICAgKiAKLSAgICogQHBhcmFtIG1lc2dlbiBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgdG8gc2V0IGZvciB0aGlzIGNvbnRyb2xsZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlR2VuZXJhdG9yKE1lc3NhZ2VHZW5lcmF0b3IgbWVzZ2VuKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1lc2dlbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1lc3NhZ2UgZ2VuZXJhdG9yIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29udHJvbGxlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UgZ2VuZXJhdG9yIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29udHJvbGxlci4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlR2VuZXJhdG9yIGdldE1lc3NhZ2VHZW5lcmF0b3IoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VnZW5lcmF0b3I7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBmaWxlbmFtZSBmb3IgdGhlIGZpbGUgY3VycmVudGx5IGJlaW5nIHZhbGlkYXRlZC4gU29tZSB2YWxpZGF0b3JzIHJlcXVpcmUgdGhpcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGZpbGVuYW1lIGZvciB0aGUgZmlsZSBiZWluZyB2YWxpZGF0ZWQuCi0gICAqLwotLy8gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKQotLy8gIHsKLS8vICAgIHJldHVybiBmaWxlVVJJOwotLy8gIH0KLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBleHRlbnNpYmx5IHZhbGlkYXRvcnMgdG8gYWRkIGVycm9yIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgZXJyb3IgZm9yLgotICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIHRvIGFkZC4KLSAgICovCi0vLyAgcHVibGljIHZvaWQgYWRkRXJyb3JNZXNzYWdlKE9iamVjdCBvYmplY3QsIFN0cmluZyBlcnJvcikKLS8vICB7Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShFUlJPUl9NRVNTQUdFLCBvYmplY3QsIGVycm9yKTsKLS8vICAgIGVycm9ycyA9IHRydWU7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgZXJyb3IgbWVzc2FnZXMgd2hlbiB0aGV5IGtub3cKLSAgICogbGluZSBhbmQgY29sdW1uIG51bWJlcnMuCi0gICAqIAotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gd2hlcmUgdGhlIGVycm9yIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRFcnJvck1lc3NhZ2UoaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyBlcnJvcikKLS8vICB7Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShFUlJPUl9NRVNTQUdFLCBsaW5lLCBjb2x1bW4sIGVycm9yKTsKLS8vICAgIGVycm9ycyA9IHRydWU7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgd2FybmluZyBtZXNzYWdlcy4KLSAgICogCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBhZGQgdGhlIHdhcm5pbmcgbWVzc2FnZS4KLSAgICogQHBhcmFtIHdhcm5pbmcgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLSAgICovCi0vLyAgcHVibGljIHZvaWQgYWRkV2FybmluZ01lc3NhZ2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHdhcm5pbmcpCi0vLyAgewotLy8gICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoV0FSTklOR19NRVNTQUdFLCBvYmplY3QsIHdhcm5pbmcpOwotLy8gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGZvciBleHRlbnNpYmx5IHZhbGlkYXRvcnMgdG8gYWRkIHdhcm5pbmcgbWVzc2FnZXMgd2hlbiB0aGV5IGtub3cKLSAgICogbGluZSBhbmQgY29sdW1uIG51bWJlcnMuCi0gICAqIAotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gd2hlcmUgdGhlIGVycm9yIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICogQHBhcmFtIHdhcm5pbmcgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLSAgICovCi0vLyAgcHVibGljIHZvaWQgYWRkV2FybmluZ01lc3NhZ2UoaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB3YXJuaW5nKQotLy8gIHsKLS8vICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKFdBUk5JTkdfTUVTU0FHRSwgbGluZSwgY29sdW1uLCB3YXJuaW5nKTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIElmIHlvdSBoYXZlIGFuIG9iamVjdCByZWFkIGluIGJ5IHRoZSByZWFkZXIgZm9yIHRoaXMKLSAgICogdmFsaWRhdG9yY29udHJvbGxlciB0aGUgb2JqZWN0IGNhbiBiZSBwYXNzZWQgaW4gaGVyZSBhbmQgdGhlIGxpbmUgYW5kIGNvbHVtbgotICAgKiBpbmZvcm1hdGlvbiB3aWxsIGJlIGFic3RyYWN0ZWQgZnJvbSBpdC4KLSAgICogCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbyBUaGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBlcnJvciAodXNlZCB0byBnZXQgdGhlIGxvY2F0aW9uKS4KLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKi8KLS8vICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShpbnQgdHlwZSwgT2JqZWN0IG8sIFN0cmluZyBtZXNzYWdlKQotLy8gIHsKLS8vICAgIGludFtdIGxvY2F0aW9uOwotLy8gICAgaWYgKGVsZW1lbnRMb2NhdGlvbnMuY29udGFpbnNLZXkobykpCi0vLyAgICB7Ci0vLyAgICAgIGxvY2F0aW9uID0gKGludFtdKWVsZW1lbnRMb2NhdGlvbnMuZ2V0KG8pOwotLy8gICAgfQotLy8gICAgLy8gaWYgd2UgZ2l2ZSBpdCBhbiBlbGVtZW50IHRoYXQgaGFzbid0IGJlZW4gZGVmaW5lZCB3ZSdsbCBzZXQgdGhlIGxvY2F0aW9uCi0vLyAgICAvLyBhdCAoMCwwKSBzbyB0aGUgZXJyb3Igc2hvd3MgdXAgYnV0IG5vIGxpbmUgbWFya2VyIGluIHRoZSBlZGl0b3IKLS8vICAgIGVsc2UKLS8vICAgIHsKLS8vICAgICAgbG9jYXRpb24gPSBuZXcgaW50W10geyAwLCAwIH07Ci0vLyAgICB9Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZSh0eXBlLCBsb2NhdGlvblswXSwgbG9jYXRpb25bMV0sIG1lc3NhZ2UpOwotLy8gIH0KLQotICAvKioKLSAgICAqIENyZWF0ZXMgYSB2YWxpZGF0aW9uIG1lc3NhZ2Ugb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgICogCi0gIAkqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHZhbGlkYXRpb24gbWVzc2FnZSB0byBhZGQuCi0gIAkqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gIAkqIEBwYXJhbSBjb2x1bW4gVGhlIGxpbmUgd2hlcmUgdGhlIGNvbHVtbiBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gIAkqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC4KLSAgCSovCi0vLyAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoaW50IHR5cGUsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgbWVzc2FnZSkKLS8vICB7Ci0vLyAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotLy8gICAgewotLy8gICAgICBpZiAodHlwZSA9PSBFUlJPUl9NRVNTQUdFKQotLy8gICAgICB7Ci0vLyAgICAgICAgdmFsaWRhdGlvbkNvbnRyb2xsZXIuYWRkRXJyb3JNZXNzYWdlKGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAodHlwZSA9PSBXQVJOSU5HX01FU1NBR0UpCi0vLyAgICAgIHsKLS8vICAgICAgICB2YWxpZGF0aW9uQ29udHJvbGxlci5hZGRXYXJuaW5nTWVzc2FnZShsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuY29udHJvbGxlci5JV1NETFZhbGlkYXRvciNpc1ZhbGlkKCkKLSAgICovCi0vLyAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCi0vLyAgewotLy8gICAgcmV0dXJuICFlcnJvcnM7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBSZXNldCB0aGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIuCi0gICAqLwotLy8gIHByb3RlY3RlZCB2b2lkIHJlc2V0KCkKLS8vICB7Ci0vLyAgICBzY2hlbWFzID0gbmV3IFZlY3RvcigpOwotLy8gICAgZmlsZVVSSSA9ICIiOwotLy8gICAgd3NkbERlZmluaXRpb24gPSBudWxsOwotLy8gICAgZWxlbWVudExvY2F0aW9ucyA9IG51bGw7Ci0vLyAgICByZXNvdXJjZWJ1bmRsZSA9IG51bGw7Ci0vLyAgICAvL3ZhbGlkYXRpb25Db250cm9sbGVyID0gbnVsbDsKLS8vICAgIGVycm9ycyA9IGZhbHNlOwotLy8gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRvckRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjI3YTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRvckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotCi0vKioKLSAqIFRoZSBXU0RMIDEuMSB2YWxpZGF0b3IgZGVsZWdhdGUgaG9sZHMgYSByZWZlcmVuY2UgdG8gYSB2YWxpZGF0b3IgdG8gYmUgaW5zdGFudGlhdGVkIGF0Ci0gKiBhIGxhdGVyIHBvaW50LgotICovCi1wdWJsaWMgY2xhc3MgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKLSAgcHJpdmF0ZSBJV1NETDExVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIGRlbGVnYXRlIGZvciBhIHZhbGlkYXRvciBieSBpdHMgY2xhc3MgbmFtZSBhbmQgcmVzb3VyY2UgYnVuZGxlIG5hbWUuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NuYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGJhc2UgcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHVibGljIFdTREwxMVZhbGlkYXRvckRlbGVnYXRlKFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUsIFN0cmluZyByZXNvdXJjZUJ1bmRsZSkKLSAgewotICAgIHRoaXMudmFsaWRhdG9yQ2xhc3NuYW1lID0gdmFsaWRhdG9yQ2xhc3NuYW1lOwotICAgIHRoaXMucmVzb3VyY2VCdW5kbGUgPSByZXNvdXJjZUJ1bmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBkZWxlZ2F0ZSBmb3IgYSB2YWxpZGF0b3IgYnkgaXRzIGNsYXNzIG5hbWUsIHJlc291cmNlIGJ1bmRsZSBuYW1lIGFuZCAKLSAgICogYSBjbGFzcyBsb2FkZXIgdG8gbG9hZCB0aGUgdmFsaWRhdG9yIGFuZCBidW5kbGUuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NuYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGJhc2UgcmVzb3VyY2UgYnVuZGxlLgotICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgVGhlIGNsYXNzIGxvYWRlciB0byB1c2UgdG8gbG9hZCB0aGUgdmFsaWRhdG9yIGFuZCBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUoU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSwgU3RyaW5nIHJlc291cmNlQnVuZGxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgewotICAgIHRoaXModmFsaWRhdG9yQ2xhc3NuYW1lLCByZXNvdXJjZUJ1bmRsZSk7Ci0gICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsaWRhdG9yIHNwZWNpZmllZCBpbiB0aGlzIGRlbGVnYXRlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgV1NETCAxLjEgdmFsaWRhdG9yIHNwZWNpZmllZCBieSB0aGlzIGRlbGVnYXRlLgotICAgKi8KLSAgcHVibGljIElXU0RMMTFWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIGlmICh2YWxpZGF0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZihjbGFzc0xvYWRlciA9PSBudWxsKQotICAgICAgewotICAgICAgCWNsYXNzTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgfQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIENsYXNzIHZhbGlkYXRvckNsYXNzID0KLSAgICAgICAgICBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKHZhbGlkYXRvckNsYXNzbmFtZSkgOiBDbGFzcy5mb3JOYW1lKHZhbGlkYXRvckNsYXNzbmFtZSk7Ci0KLSAgICAgICAgdmFsaWRhdG9yID0gKElXU0RMMTFWYWxpZGF0b3IpdmFsaWRhdG9yQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBSZXNvdXJjZUJ1bmRsZSB2YWxpZGF0b3JCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocmVzb3VyY2VCdW5kbGUsIExvY2FsZS5nZXREZWZhdWx0KCksIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICB2YWxpZGF0b3Iuc2V0UmVzb3VyY2VCdW5kbGUodmFsaWRhdG9yQnVuZGxlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETzogYWRkIGxvZ2dpbmcKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgICAgfQotICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETzogYWRkIGxvZ2dpbmcKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETzogYWRkIGxvZ2dpbmcKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdmFsaWRhdG9yOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTRExEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjFjNWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTRExEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvbkRlc2VyaWFsaXplcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRWxlbWVudE5TSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZC5JbmxpbmVTY2hlbWFWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuRWxlbWVudExvY2F0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTVV0aWxzOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5RTmFtZVV0aWxzOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5YUGF0aFV0aWxzOwotCi0vKioKLSAqIEEgV1NETCBkb2N1bWVudCB0aGF0IGtub3dzIGhvdyB0byBwYXJzZSBpdHNlbGYuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRG9jdW1lbnQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBTVFlMRV9PTkVfV0FZID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyBDb25zdGFudHMuRUxFTV9JTlBVVCB9KTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBTVFlMRV9SRVFVRVNUX1JFU1BPTlNFID0KLSAgICBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5FTEVNX0lOUFVULCBDb25zdGFudHMuRUxFTV9PVVRQVVQgfSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgU1RZTEVfU09MSUNJVF9SRVNQT05TRSA9Ci0gICAgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyBDb25zdGFudHMuRUxFTV9PVVRQVVQsIENvbnN0YW50cy5FTEVNX0lOUFVUIH0pOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFNUWUxFX05PVElGSUNBVElPTiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkVMRU1fT1VUUFVUIH0pOwotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9FUlJPUl9NVUxUSVBMRV9UWVBFU19ERUZJTkVEID0gIl9FUlJPUl9NVUxUSVBMRV9UWVBFU19ERUZJTkVEIjsKLQotICBwcm90ZWN0ZWQgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0UmVnID0gbnVsbDsKLSAgcHJvdGVjdGVkIFN0cmluZyBmYWN0b3J5SW1wbE5hbWUgPSBudWxsOwotCi0gIC8vIHN0b3JlIHRoZSBlbGVtZW50IGxvY2F0aW9ucyB3aXRoaW4gdGhlIGZpbGUgLSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycwotICAvLyB0aGUgbG9jYXRpb24gaW5mbyBpcyBzdG9yZWQgYXMgYW4gaW50IGFycmF5IG9mIGxlbmd0aCAyIHtsaW5lbnVtYmVyLCBjb2xudW1iZXJ9Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgZWxlbWVudExvY2F0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLSAgCi0gIC8vIGhvbGQgdGhlIHJlYWRlciBlcnJvcnMKLSAgcHJvdGVjdGVkIExpc3QgcmVhZGVyRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgTGlzdCByZWFkZXJXYXJuaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLSAgCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWYgPSBudWxsOwotICBwcml2YXRlIFNldCBpbXBvcnRlZERlZnMgPSBuZXcgVHJlZVNldCgpOwotICBwcml2YXRlIEVsZW1lbnQgdHlwZXNFbCA9IG51bGw7Ci0gIHByaXZhdGUgTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBMaXN0IHBvcnR0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBMaXN0IGJpbmRpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIExpc3Qgc2VydmljZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgTGlzdCBleHRlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBpbnQgZGVwdGg7Ci0gIC8vIEhvbGQgdGhlIHNjaGVtYXMgdGhhdCBhcmUgaW1wb3J0ZWQgb3IgZGVjbGFyZWQgaW5saW5lIGluIHRoaXMgd3NkbCBkb2N1bWVudC4KLSAgcHJpdmF0ZSBMaXN0IHNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbGluZm87Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuIFBlcmZvcm1zIGEgcHJlcGFyc2Ugb2YgdGhlIGRvY3VtZW50IGFuZCBoYW5kbGVzIGltcG9ydHMgYW5kIHR5cGVzLgotICAgKiAKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSBUaGUgVVJJIG9mIHRoaXMgV1NETCBkb2N1bWVudC4KLSAgICogQHBhcmFtIGRlZkVsIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoaXMgZG9jdW1lbnQgaW4gYSBkb2N1bWVudCB0cmVlLgotICAgKiBAcGFyYW0gbWVzc2FnZWdlbmVyYXRvciBBIG1lc3NhZ2VnZW5lcmF0b3IgdXNlZCBmb3IgcmV0cmlldmluZyBzdHJpbmdzLgotICAgKiBAcGFyYW0gdmFsaW5mbyBBIFdTREwxMVZhbGlkYXRpb25JbmZvIG9iamVjdCBmb3IgcmVwb3J0aW5nIG1lc3NhZ2VzLgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBXU0RMRG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50QmFzZVVSSSwgRWxlbWVudCBkZWZFbCwgaW50IGRlcHRoLCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3IsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgdGhpcy5tZXNzYWdlZ2VuZXJhdG9yID0gbWVzc2FnZWdlbmVyYXRvcjsKLSAgICB0aGlzLnZhbGluZm8gPSB2YWxpbmZvOwotICAgIHRoaXMuZGVwdGggPSBkZXB0aDsKLSAgICAKLSAgICBjaGVja0VsZW1lbnROYW1lKGRlZkVsLCBDb25zdGFudHMuUV9FTEVNX0RFRklOSVRJT05TKTsKLSAgICAKLSAgICBXU0RMRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgIChmYWN0b3J5SW1wbE5hbWUgIT0gbnVsbCkgPyBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZShmYWN0b3J5SW1wbE5hbWUpIDogV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBkZWYgPSBmYWN0b3J5Lm5ld0RlZmluaXRpb24oKTsKLQotICAgIGlmIChleHRSZWcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWYuc2V0RXh0ZW5zaW9uUmVnaXN0cnkoZXh0UmVnKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShkZWZFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShkZWZFbCwgQ29uc3RhbnRzLkFUVFJfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgTmFtZWROb2RlTWFwIGF0dHJzID0gZGVmRWwuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgaWYgKGRvY3VtZW50QmFzZVVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIGRlZi5zZXREb2N1bWVudEJhc2VVUkkoZG9jdW1lbnRCYXNlVVJJKTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGRlZi5zZXRRTmFtZShuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBuYW1lKSk7Ci0gICAgfQotCi0gICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGRlZi5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBpbnQgc2l6ZSA9IGF0dHJzLmdldExlbmd0aCgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgQXR0ciBhdHRyID0gKEF0dHIpYXR0cnMuaXRlbShpKTsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBhdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IGF0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7Ci0KLSAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiBuYW1lc3BhY2VVUkkuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWE1MTlMpKQotICAgICAgewotICAgICAgICBpZiAobG9jYWxQYXJ0ICE9IG51bGwgJiYgIWxvY2FsUGFydC5lcXVhbHMoQ29uc3RhbnRzLkFUVFJfWE1MTlMpKQotICAgICAgICB7Ci0gICAgICAgICAgZGVmLmFkZE5hbWVzcGFjZShsb2NhbFBhcnQsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkZWYuYWRkTmFtZXNwYWNlKG51bGwsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZXJlIGFyZSBwcm9ibGVtcyB3aGVuIHRoZSBtb2RlbCBpcyBjcmVhdGVkIGFuZCB0aGUgb3JkZXIgb2YgZWxlbWVudHMgaXMgbm90Ci0gICAgLy8gSW1wb3J0IC0gVHlwZXMgLSBNZXNzYWdlIC0gUG9ydFR5cGUgLSBCaW5kaW5nIC0gU2VydmljZSBzbyB3ZSBuZWVkIHRvIHJlYWQgdGhlbQotICAgIC8vIGludG8gdGhlIG1vZGVsIGluIHRoYXQgb3JkZXIKLSAgICAvLyBQZXJmb3JtYW5jZSB3aXNlIHRoaXMgc2hvdWxkIGJlIG1vZGlmaWVkIGFzIHdlIGhhdmUgdG8gbWFrZSA1IGV4dHJhIGxvb3BzIHRocm91Z2gKLSAgICAvLyBhbGwgb2YgdGhlIGVsZW1lbnRzIGFzIGEgcmVzdWx0Ci0KLSAgICAvLyB0YWtlIGNhcmUgb2YgSW1wb3J0cywgVHlwZXMsIERvY3VtZW50YXRpb24gYW5kIGV4dGVuc2libGVlbGVtZW50cyB0b2dldGhlciAtIHNhdmVzIGEgcGFzcyBmb3IgRG9jdW1lbnRhdGlvbiAKLSAgICAvLyBsYXRlciBhbmQgRG9jcyBkb24ndCBlZmZlY3QgYW55dGhpbmcgZWxzZSAtIEltcG9ydHMgYW5kIFR5cGVzIGFyZSBlc3NlbnRpYWxseSB0aGUgc2FtZSB0aGluZwotICAgIC8vIG5vIHByZWNvbmNlaXZlZCBpZGVhcyBhYm91dCBleHRlbnNpYmxlIGVsZW1lbnRzCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChkZWZFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotCi0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fSU1QT1JULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHRlbXBFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRVNQQUNFKTsKLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uVVJJID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHRlbXBFbCwgQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04pOwotICAgICAgICBJbXBvcnRIb2xkZXIgaWggPSBuZXcgSW1wb3J0SG9sZGVyKG5hbWVzcGFjZVVSSSwgbG9jYXRpb25VUkksIGRlZi5nZXREb2N1bWVudEJhc2VVUkkoKSwgdGhpcywgZGVwdGgrMSwgdGVtcEVsLCBtZXNzYWdlZ2VuZXJhdG9yLCB2YWxpbmZvKTsKLSAgICAgICAgaW1wb3J0ZWREZWZzLmFkZChpaCk7Ci0gICAgICAgIHNldExvY2F0aW9uKHRlbXBFbCwgdGVtcEVsKTsKLS8vICAgICAgICBpZiAoaW1wb3J0ZWREZWZzID09IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgaW1wb3J0ZWREZWZzID0gbmV3IEhhc2h0YWJsZSgpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBpZiAoZG9jdW1lbnRCYXNlVVJJICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgaW1wb3J0ZWREZWZzLnB1dChkb2N1bWVudEJhc2VVUkksIGRlZik7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGRlZi5hZGRJbXBvcnQocGFyc2VJbXBvcnQodGVtcEVsLCBkZWYsIGltcG9ydGVkRGVmcykpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgZGVmLnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9UWVBFUywgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgaWYodHlwZXNFbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0TG9jYXRpb24odGVtcEVsLCB0ZW1wRWwpOwotICAgICAgICAgIGFkZFJlYWRlckVycm9yKGRlZiwgdGVtcEVsLCBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTVVMVElQTEVfVFlQRVNfREVGSU5FRCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHR5cGVzRWwgPSB0ZW1wRWw7Ci0gICAgICAgICAgcGFyc2VUeXBlcygpOwotICAgICAgICB9Ci0vLyAgICAgICAgZGVmLnNldFR5cGVzKHBhcnNlVHlwZXModGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX01FU1NBR0UsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2VzLmFkZCh0ZW1wRWwpOwotICAgICAgICAvL2RlZi5hZGRNZXNzYWdlKHBhcnNlTWVzc2FnZSh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fUE9SVF9UWVBFLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBwb3J0dHlwZXMuYWRkKHRlbXBFbCk7Ci0gICAgICAgIC8vICAgICAgICAgICAgIFBvcnRUeXBlIHB0ID0gcGFyc2VQb3J0VHlwZSh0ZW1wRWwsIGRlZik7Ci0gICAgICAgIC8vICAgICAgICAgICAgIGlmKHB0ICE9IG51bGwpCi0gICAgICAgIC8vICAgICAgICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgZGVmLmFkZFBvcnRUeXBlKHB0KTsKLSAgICAgICAgLy8gICAgICAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fQklORElORywgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ3MuYWRkKHRlbXBFbCk7Ci0gICAgICAgIC8vZGVmLmFkZEJpbmRpbmcocGFyc2VCaW5kaW5nKHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9TRVJWSUNFLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBzZXJ2aWNlcy5hZGQodGVtcEVsKTsKLSAgICAgICAgLy9kZWYuYWRkU2VydmljZShwYXJzZVNlcnZpY2UodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZXh0ZWxlbWVudHMuYWRkKHRlbXBFbCk7Ci0gICAgICAgIC8vICAgICAgICBkZWYuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoCi0gICAgICAgIC8vICAgICAgICAgIHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRGVmaW5pdGlvbi5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBkZWZpbml0aW9ucyBlbGVtZW50IGZvciB0aGlzIGRvY3VtZW50LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudCBmb3IgdGhpcyBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldERlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGRlZjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCBhIHNldCBvZiB0aGUgaW1wb3J0cyBpbiB0aGlzIGRvY3VtZW50LgotICAgKiAKLSAgICogQHJldHVybiBBIHNldCBvZiB0aGUgaW1wb3J0cyBpbiB0aGlzIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIFNldCBnZXRJbXBvcnRzKCkKLSAgewotICAgIHJldHVybiBpbXBvcnRlZERlZnM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGRlZgotICAgKiBAcGFyYW0gZG9jCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbXBvcnQoRGVmaW5pdGlvbiBkZWYsIEVsZW1lbnQgZG9jLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICBJbXBvcnQgaW1wID0gZGVmLmNyZWF0ZUltcG9ydCgpOwotICAgIGltcC5zZXREZWZpbml0aW9uKGRlZik7Ci0gICAgaW1wLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvYyk7Ci0gICAgaW1wLnNldE5hbWVzcGFjZVVSSShuYW1lc3BhY2UpOwotICAgIGltcC5zZXRMb2NhdGlvblVSSShsb2NhdGlvbik7Ci0gICAgZGVmLmFkZEltcG9ydChpbXApOwotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIHR5cGVzIGluIHRoZSBXU0RMIGRvY3VtZW50LiBIYW5kbGVzIGRvY3VtZW50YXRpb24sIGltcG9ydCBhbmQgc2NoZW1hCi0gICAqIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VUeXBlcygpCi0gIHsKLSAgICBUeXBlcyB0eXBlcyA9IGRlZi5jcmVhdGVUeXBlcygpOwotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudCh0eXBlc0VsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgdHlwZXMuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRlbXBFbC5nZXRMb2NhbE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJpbXBvcnQiKSkKLSAgICAgICAgLy9lbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9JTVBPUlQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIC8vIHRoaXMgc2hvdWxkbid0IHJlYWxseSBiZSB1c2VkIGhlcmUgYnV0IGEgbGl0dGxlIGhhY2sgd2lsbCBtYWtlCi0gICAgICAgIC8vIGxpZmUgZWFzaWVyCi0gICAgICAgIC8vcGFyc2VJbXBvcnQodGVtcEVsLCBkZWYsIChNYXApbmV3IEhhc2h0YWJsZSgpKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZSh0ZW1wRWwsIENvbnN0YW50cy5BVFRSX05BTUVTUEFDRSk7Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvblVSSSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZSh0ZW1wRWwsICJzY2hlbWFMb2NhdGlvbiIpOwotICAgICAgICBpbXBvcnRlZERlZnMuYWRkKG5ldyBJbXBvcnRIb2xkZXIobmFtZXNwYWNlVVJJLCBsb2NhdGlvblVSSSwgZGVmLmdldERvY3VtZW50QmFzZVVSSSgpLCB0aGlzLCBkZXB0aCsxLCB0ZW1wRWwsIG1lc3NhZ2VnZW5lcmF0b3IsIHZhbGluZm8pKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICB0eXBlcy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KFR5cGVzLmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoVHlwZXMuY2xhc3MsIHRlbXBFbCwgZGVmKTsKLSAgICAgICAgICB0eXBlcy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChleHRFbGVtKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0gICAgZGVmLnNldFR5cGVzKHR5cGVzKTsKLSAgICAKLSAgICB2YWxpbmZvLnNldEVsZW1lbnRMb2NhdGlvbnMoZWxlbWVudExvY2F0aW9ucyk7Ci0gICAgTGlzdCB0eXBlc0VsZW1zID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgaWYodHlwZXNFbGVtcyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIHR5cGVzRWxlbXNJdGVyID0gdHlwZXNFbGVtcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUodHlwZXNFbGVtc0l0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCB0eXBlRWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCl0eXBlc0VsZW1zSXRlci5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBJbmxpbmVTY2hlbWFWYWxpZGF0b3IgeHNkVmFsID0gbmV3IElubGluZVNjaGVtYVZhbGlkYXRvcigpOwotICAgICAgICB4c2RWYWwuc2V0TWVzc2FnZUdlbmVyYXRvcihtZXNzYWdlZ2VuZXJhdG9yKTsKLSAgICAKLSAgICAgICAgTGlzdCBwYXJlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwYXJlbnRzLmFkZChkZWYpOwotICAgICAgICBwYXJlbnRzLmFkZCgwLHR5cGVzKTsKLSAgICAgICAgeHNkVmFsLnZhbGlkYXRlKHR5cGVFbGVtZW50LCBwYXJlbnRzLHZhbGluZm8pOwotICAgICAgICBYU01vZGVsW10gdHlwZXNTY2hlbWFzID0gdmFsaW5mby5nZXRTY2hlbWFzKCk7Ci0gICAgICAgIExpc3QgdHlwZXNTY2hlbWFMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgdHlwZXNTY2hlbWFzLmxlbmd0aDsgaSsrKQotICAgICAgICB7ICAKLSAgICAgICAgICB0eXBlc1NjaGVtYUxpc3QuYWRkKHR5cGVzU2NoZW1hc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2NoZW1hcy5hZGRBbGwodHlwZXNTY2hlbWFMaXN0KTsKLSAgICAgICAgdmFsaW5mby5jbGVhclNjaGVtYXMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdmFsaW5mby5zZXRFbGVtZW50TG9jYXRpb25zKG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIG1lc3NhZ2VzIGluIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZU1lc3NhZ2VzKCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGRlZi5hZGRNZXNzYWdlKHBhcnNlTWVzc2FnZSgoRWxlbWVudCltZXNzYWdlcy5nZXQoaSksIGRlZikpOwotICAgICAgfQotICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAge30KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSB0aGUgcG9ydFR5cGVzIGluIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZVBvcnR0eXBlcygpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvcnR0eXBlcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUG9ydFR5cGUgcHQgPSBwYXJzZVBvcnRUeXBlKChFbGVtZW50KXBvcnR0eXBlcy5nZXQoaSksIGRlZik7Ci0gICAgICAgIGlmIChwdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZGVmLmFkZFBvcnRUeXBlKHB0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAge30KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSB0aGUgYmluZGluZ3MgaW4gdGhpcyBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlQmluZGluZ3MoKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5ncy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZGVmLmFkZEJpbmRpbmcocGFyc2VCaW5kaW5nKChFbGVtZW50KWJpbmRpbmdzLmdldChpKSwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICB7fQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBzZXJ2aWNlcyBpbiB0aGlzIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VTZXJ2aWNlcygpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBkZWYuYWRkU2VydmljZShwYXJzZVNlcnZpY2UoKEVsZW1lbnQpc2VydmljZXMuZ2V0KGkpLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgICAgIHt9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgaW4gdGhpcyBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZWxlbWVudHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGRlZi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KERlZmluaXRpb24uY2xhc3MsIChFbGVtZW50KWV4dGVsZW1lbnRzLmdldChpKSwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICB7fQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCB0aGUgZ2l2ZW4gbGlzdCBvZiBzY2hlbWFzIHRvIHRoZSBzY2hlbWFzIGZvciB0aGlzIGRvY3VtZW50LgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYXMgVGhlIGxpc3Qgb2Ygc2NoZW1hcyB0byBhZGQgdG8gdGhpcyBkb2N1bWVudCdzIHNjaGVtYXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRTY2hlbWFzKExpc3Qgc2NoZW1hcykKLSAgewotICAgIHRoaXMuc2NoZW1hcy5hZGRBbGwoc2NoZW1hcyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHNjaGVtYXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzY2hlbWFzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0U2NoZW1hcygpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hczsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBzcGVjaWZpZWQgYmluZGluZy4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nRWwgVGhlIGJpbmRpbmcgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgYmluZGluZyBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nIHBhcnNlQmluZGluZyhFbGVtZW50IGJpbmRpbmdFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBudWxsOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGJpbmRpbmdFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgcG9ydFR5cGVOYW1lOwotICAgIHRyeQotICAgIHsKLSAgICAgIHBvcnRUeXBlTmFtZSA9IERPTVV0aWxzLmdldFF1YWxpZmllZEF0dHJpYnV0ZVZhbHVlKGJpbmRpbmdFbCwgQ29uc3RhbnRzLkFUVFJfVFlQRSwgQ29uc3RhbnRzLkVMRU1fQklORElORywgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy90aGUgY2FsbCBhYm92ZSBmYWlscyBpZiB0aGVyZSBpcyBubyBxdWFsaWZpZWQgbmFtZXNwYWNlIGZvciB0aGUgbWVzc2FnZSBuYW1lCi0gICAgICBwb3J0VHlwZU5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGJpbmRpbmdFbCwgInR5cGUiKSk7Ci0gICAgfQotCi0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBudWxsOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBRTmFtZSBiaW5kaW5nTmFtZSA9IG5ldyBRTmFtZShkZWYuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG5hbWUpOwotCi0gICAgICBiaW5kaW5nID0gZGVmLmdldEJpbmRpbmcoYmluZGluZ05hbWUpOwotCi0gICAgICBpZiAoYmluZGluZyA9PSBudWxsKQotICAgICAgewotICAgICAgICBiaW5kaW5nID0gZGVmLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICAgICAgYmluZGluZy5zZXRRTmFtZShiaW5kaW5nTmFtZSk7Ci0gICAgICB9Ci0gICAgICAvLyByZXBvcnQgYW4gZXJyb3IgaWYgYSBiaW5kaW5nIHdpdGggdGhpcyBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZAotICAgICAgZWxzZSBpZiAoIWJpbmRpbmcuaXNVbmRlZmluZWQoKSkKLSAgICAgIHsKLSAgICAgICAgLy9hZGRSZWFkZXJFcnJvcihkZWYsYmluZGluZ0VsLCAiX0JJTkRJTkdfTkFNRV9BTFJFQURZX0RFRklORUQiKTsgICAgICAgCi0gICAgICAgIGFkZFJlYWRlckVycm9yKAotICAgICAgICAgIGRlZiwKLSAgICAgICAgICBiaW5kaW5nRWwsCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9CSU5ESU5HX05BTUVfQUxSRUFEWV9ERUZJTkVEIiwgIiciICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgIiciKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBiaW5kaW5nID0gZGVmLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBXaGV0aGVyIGl0IHdhcyByZXRyaWV2ZWQgb3IgY3JlYXRlZCwgdGhlIGRlZmluaXRpb24gaGFzIGJlZW4gZm91bmQuCi0gICAgYmluZGluZy5zZXRVbmRlZmluZWQoZmFsc2UpOwotCi0gICAgaWYgKHBvcnRUeXBlTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBvcnRUeXBlID0gZGVmLmdldFBvcnRUeXBlKHBvcnRUeXBlTmFtZSk7Ci0KLSAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBwb3J0VHlwZSA9IGRlZi5jcmVhdGVQb3J0VHlwZSgpOwotICAgICAgICBwb3J0VHlwZS5zZXRRTmFtZShwb3J0VHlwZU5hbWUpOwotICAgICAgICBkZWYuYWRkUG9ydFR5cGUocG9ydFR5cGUpOwotICAgICAgfQotCi0gICAgICBiaW5kaW5nLnNldFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGJpbmRpbmdFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX09QRVJBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZy5hZGRCaW5kaW5nT3BlcmF0aW9uKHBhcnNlQmluZGluZ09wZXJhdGlvbih0ZW1wRWwsIHBvcnRUeXBlLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmluZGluZy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KEJpbmRpbmcuY2xhc3MsIHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgc2V0TG9jYXRpb24oYmluZGluZywgYmluZGluZ0VsKTsKLQotICAgIHJldHVybiBiaW5kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgc3BlY2lmaWMgYmluZGluZyBvcGVyYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZ09wZXJhdGlvbkVsIFRoZSBiaW5kaW5nIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gcG9ydFR5cGUgVGhlIHBvcnRUeXBlIHRoZSBiaW5kaW5nIHJlZmVyZW5jZXMuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdPcGVyYXRpb24gcGFyc2VCaW5kaW5nT3BlcmF0aW9uKEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsLCBQb3J0VHlwZSBwb3J0VHlwZSwgRGVmaW5pdGlvbiBkZWYpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IGRlZi5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoYmluZGluZ09wZXJhdGlvbkVsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbkVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fSU5QVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ0lucHV0KHBhcnNlQmluZGluZ0lucHV0KHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9PVVRQVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dChwYXJzZUJpbmRpbmdPdXRwdXQodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0ZBVUxULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdChwYXJzZUJpbmRpbmdGYXVsdCh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoQmluZGluZ09wZXJhdGlvbi5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLSAgICAgIFN0cmluZyBpbnB1dE5hbWUgPSAoYmluZGluZ0lucHV0ICE9IG51bGwgPyBiaW5kaW5nSW5wdXQuZ2V0TmFtZSgpIDogbnVsbCk7Ci0gICAgICBTdHJpbmcgb3V0cHV0TmFtZSA9IChiaW5kaW5nT3V0cHV0ICE9IG51bGwgPyBiaW5kaW5nT3V0cHV0LmdldE5hbWUoKSA6IG51bGwpOwotCi0gICAgICAvLyBoYWNrIGNvZGUgdG8gZ2V0IGF0IG9wZXJhdGlvbnMgdGhhdCBhcmUgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRpZmZlcmVudAotICAgICAgLy8gaW5wdXRzIGFuZCBvdXRwdXRzIAotICAgICAgT3BlcmF0aW9uIG9wID0gbnVsbDsKLSAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgIC8vIGdldCBhIGxpc3Qgb2YgYWxsIG9wZXJhdGlvbnMgd2l0aCBtYXRjaGluZyBuYW1lcwotICAgICAgTGlzdCBtYXRjaGluZ09wZXJhdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBJdGVyYXRvciBpT3BlcmF0aW9ucyA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpT3BlcmF0aW9ucy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9wZXJhdGlvbiBvcGVyID0gKE9wZXJhdGlvbilpT3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgIGlmIChvcGVyLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIG1hdGNoaW5nT3BlcmF0aW9ucy5hZGQob3Blcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG1hdGNoaW5nT3BlcmF0aW9ucyAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIG1hdGNoaW5nIG9wZXJhdGlvbiB0aGlzIGlzIHdoYXQgd2UncmUgcmVmZXJyaW5nIHRvLgotICAgICAgICAvLyBPbmx5IG1hdGNoaW5nIGlmIGJpbmRpbmcgb3BlcmF0aW9uIGlucHV0IG5hbWUgYW5kIG91dHB1dCBuYW1lIGFyZQotICAgICAgICAvLyBib3RoIG51bGwgb3IgdGhlIHNhbWUgYXMgdGhlIHBvcnRUeXBlIG9wZXJhdGlvbiBpbnB1dCBhbmQgb3V0cHV0IG5hbWVzLgotICAgICAgICAvLyB0aGUgcG9ydFR5cGUgb3BlcmF0aW9uIG5hbWUKLSAgICAgICAgaWYgKG1hdGNoaW5nT3BlcmF0aW9ucy5zaXplKCkgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgIC8vIG9ubHkgc2F5IHRoZSBzaW5nbGUgb3BlcmF0aW9uIGlzIHRoZSBvbmUgd2UncmUgbG9va2luZyBmb3IgaWYgdGhlIG5hbWVzCi0gICAgICAgICAgLy8gb2YgdGhlIGJpbmRpbmcgaW5wdXQgYW5kIG91dHB1dCBhcmUgbm90IHNwZWNpZmllZAotICAgICAgICAgIE9wZXJhdGlvbiB0ZW1wT3AgPSAoT3BlcmF0aW9uKW1hdGNoaW5nT3BlcmF0aW9ucy5nZXQoMCk7Ci0gICAgICAgICAgYm9vbGVhbiBpbnB1dE9LID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBvdXRwdXRPSyA9IGZhbHNlOwotICAgICAgICAgIElucHV0IHRlbXBJbnB1dCA9IHRlbXBPcC5nZXRJbnB1dCgpOwotICAgICAgICAgIE91dHB1dCB0ZW1wT3V0cHV0ID0gdGVtcE9wLmdldE91dHB1dCgpOwotCi0gICAgICAgICAgLy8gb3JkZXIgaXMgaW1wb3J0YW50IGluIHRoZXNlIGNvbmRpdGlvbnMuIGNvbmRpdGlvbiAyIG11c3QgZmFpbCBmb3IgMyB0byB3b3JrCi0gICAgICAgICAgLy8gY2hlY2sgdGhlIGlucHV0Ci0gICAgICAgICAgaWYgKHRlbXBJbnB1dCA9PSBudWxsICYmIGJpbmRpbmdJbnB1dCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0T0sgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChiaW5kaW5nSW5wdXQgPT0gbnVsbCB8fCBiaW5kaW5nSW5wdXQuZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRPSyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHRlbXBJbnB1dCAhPSBudWxsICYmIGJpbmRpbmdJbnB1dC5nZXROYW1lKCkuZXF1YWxzKHRlbXBJbnB1dC5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0T0sgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBjaGVjayB0aGUgb3V0cHV0Ci0gICAgICAgICAgaWYgKHRlbXBPdXRwdXQgPT0gbnVsbCAmJiBiaW5kaW5nT3V0cHV0ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0T0sgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChiaW5kaW5nT3V0cHV0ID09IG51bGwgfHwgYmluZGluZ091dHB1dC5nZXROYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRPSyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHRlbXBPdXRwdXQgIT0gbnVsbCAmJiBiaW5kaW5nT3V0cHV0LmdldE5hbWUoKS5lcXVhbHModGVtcE91dHB1dC5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dE9LID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGlucHV0T0sgJiYgb3V0cHV0T0spCi0gICAgICAgICAgewotICAgICAgICAgICAgb3AgPSB0ZW1wT3A7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vICAgICAgICAgIG9wID0gKE9wZXJhdGlvbikgbWF0Y2hpbmdPcGVyYXRpb25zLmdldCgwKTsKLSAgICAgICAgfQotICAgICAgICAvLyBvdGhlcndpc2UgZmluZCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSwgaW5wdXRuYW1lLCBvdXRwdXRuYW1lIHNpZ25hdHVyZQotICAgICAgICBpZiAobWF0Y2hpbmdPcGVyYXRpb25zICE9IG51bGwgJiYgb3AgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIGlNYXRjaGluZ09wZXJhdGlvbnMgPSBtYXRjaGluZ09wZXJhdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAoaU1hdGNoaW5nT3BlcmF0aW9ucy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotCi0gICAgICAgICAgICBib29sZWFuIGlucHV0TmFtZXNFcXVhbCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBvdXRwdXROYW1lc0VxdWFsID0gZmFsc2U7Ci0gICAgICAgICAgICBPcGVyYXRpb24gb3BlciA9IChPcGVyYXRpb24paU1hdGNoaW5nT3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICAvLyAgICAgICAgICBpZiAob3Blci5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAvLyAgICAgICAgICB7Ci0gICAgICAgICAgICBJbnB1dCBvcElucHV0ID0gb3Blci5nZXRJbnB1dCgpOwotICAgICAgICAgICAgaWYgKG9wSW5wdXQgIT0gbnVsbCAmJiBiaW5kaW5nSW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIG9wSW5wdXROYW1lID0gb3BJbnB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSW5wdXROYW1lID0gYmluZGluZ0lucHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgaWYgKG9wSW5wdXROYW1lICE9IG51bGwgJiYgb3BJbnB1dE5hbWUuZXF1YWxzSWdub3JlQ2FzZShiaW5kaW5nSW5wdXROYW1lKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlucHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAob3BJbnB1dE5hbWUgPT0gbnVsbCAmJiBiaW5kaW5nSW5wdXROYW1lID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChvcElucHV0ID09IG51bGwgJiYgYmluZGluZ0lucHV0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlucHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPdXRwdXQgb3BPdXRwdXQgPSBvcGVyLmdldE91dHB1dCgpOwotICAgICAgICAgICAgaWYgKG9wT3V0cHV0ICE9IG51bGwgJiYgYmluZGluZ091dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgb3BPdXRwdXROYW1lID0gb3BPdXRwdXQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBTdHJpbmcgYmluZGluZ091dHB1dE5hbWUgPSBiaW5kaW5nT3V0cHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgaWYgKG9wT3V0cHV0TmFtZSAhPSBudWxsICYmIG9wT3V0cHV0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKGJpbmRpbmdPdXRwdXROYW1lKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKG9wT3V0cHV0TmFtZSA9PSBudWxsICYmIGJpbmRpbmdPdXRwdXROYW1lID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAob3BPdXRwdXQgPT0gbnVsbCAmJiBiaW5kaW5nT3V0cHV0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG91dHB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlucHV0TmFtZXNFcXVhbCAmJiBvdXRwdXROYW1lc0VxdWFsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcCA9IG9wZXI7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvL09wZXJhdGlvbiBvcCA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbihuYW1lLCBpbnB1dE5hbWUsIG91dHB1dE5hbWUpOwotCi0gICAgICBpZiAob3AgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3AgPSBkZWYuY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgICAgIG9wLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIHBvcnRUeXBlLmFkZE9wZXJhdGlvbihvcCk7Ci0gICAgICB9Ci0KLSAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0T3BlcmF0aW9uKG9wKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGJpbmRpbmdPcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb25FbCk7Ci0KLSAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIGEgc3BlY2lmaWMgYmluZGluZyBpbnB1dCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmdJbnB1dEVsIFRoZSBiaW5kaW5nIGlucHV0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIGJpbmRpbmcgaW5wdXQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ0lucHV0IHBhcnNlQmluZGluZ0lucHV0KEVsZW1lbnQgYmluZGluZ0lucHV0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGRlZi5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShiaW5kaW5nSW5wdXRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJpbmRpbmdJbnB1dC5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoYmluZGluZ0lucHV0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nSW5wdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0lucHV0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoQmluZGluZ0lucHV0LmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGJpbmRpbmdJbnB1dCwgYmluZGluZ0lucHV0RWwpOwotCi0gICAgcmV0dXJuIGJpbmRpbmdJbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGJpbmRpbmcgb3V0cHV0IGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZ091dHB1dEVsIFRoZSBiaW5kaW5nIG91dHB1dCBlbGVtZW50LgotICAgKiBAcGFyYW0gZGVmIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBiaW5kaW5nIG91dHB1dCBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nT3V0cHV0IHBhcnNlQmluZGluZ091dHB1dChFbGVtZW50IGJpbmRpbmdPdXRwdXRFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBkZWYuY3JlYXRlQmluZGluZ091dHB1dCgpOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGJpbmRpbmdPdXRwdXRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJpbmRpbmdPdXRwdXQuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGJpbmRpbmdPdXRwdXRFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPdXRwdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ091dHB1dC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KEJpbmRpbmdPdXRwdXQuY2xhc3MsIHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgc2V0TG9jYXRpb24oYmluZGluZ091dHB1dCwgYmluZGluZ091dHB1dEVsKTsKLQotICAgIHJldHVybiBiaW5kaW5nT3V0cHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgc3BlY2lmaWMgYmluZGluZyBmYXVsdCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmdGYXVsdEVsIFRoZSBiaW5kaW5nIGZhdWx0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIGJpbmRpbmcgZmF1bHQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ0ZhdWx0IHBhcnNlQmluZGluZ0ZhdWx0KEVsZW1lbnQgYmluZGluZ0ZhdWx0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IGRlZi5jcmVhdGVCaW5kaW5nRmF1bHQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShiaW5kaW5nRmF1bHRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJpbmRpbmdGYXVsdC5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoYmluZGluZ0ZhdWx0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nRmF1bHQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0ZhdWx0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoQmluZGluZ0ZhdWx0LmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGJpbmRpbmdGYXVsdCwgYmluZGluZ0ZhdWx0RWwpOwotCi0gICAgcmV0dXJuIGJpbmRpbmdGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIG1lc3NhZ2UgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBtc2dFbCBUaGUgbWVzc2FnZSBlbGVtZW50LgotICAgKiBAcGFyYW0gZGVmIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBtZXNzYWdlIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2UgcGFyc2VNZXNzYWdlKEVsZW1lbnQgbXNnRWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgTWVzc2FnZSBtc2cgPSBudWxsOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKG1zZ0VsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBuZXcgUU5hbWUoZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lKTsKLQotICAgICAgbXNnID0gZGVmLmdldE1lc3NhZ2UobWVzc2FnZU5hbWUpOwotCi0gICAgICBpZiAobXNnID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1zZyA9IGRlZi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIG1zZy5zZXRRTmFtZShtZXNzYWdlTmFtZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghbXNnLmlzVW5kZWZpbmVkKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZSBhcyBhIG1lc3NhZ2Ugd2l0aCB0aGlzIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkCi0gICAgICAgIGFkZFJlYWRlckVycm9yKAotICAgICAgICAgIGRlZiwKLSAgICAgICAgICBtc2dFbCwKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX01FU1NBR0VfTkFNRV9BTFJFQURZX0RFRklORUQiLCAiJyIgKyBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICInIikpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbXNnID0gZGVmLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICAvLyBXaGV0aGVyIGl0IHdhcyByZXRyaWV2ZWQgb3IgY3JlYXRlZCwgdGhlIGRlZmluaXRpb24gaGFzIGJlZW4gZm91bmQuCi0gICAgbXNnLnNldFVuZGVmaW5lZChmYWxzZSk7Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KG1zZ0VsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgbXNnLnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9QQVJULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBtc2cuYWRkUGFydChwYXJzZVBhcnQodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gWE1MIFZhbGlkYXRpb24gd2lsbCBjYXRjaCB0aGlzCi0gICAgICAgIERPTVV0aWxzLnRocm93V1NETEV4Y2VwdGlvbih0ZW1wRWwpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKG1zZywgbXNnRWwpOwotCi0gICAgcmV0dXJuIG1zZzsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIHBhcnQgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJ0RWwgVGhlIHBhcnQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgcGFydCBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBQYXJ0IHBhcnNlUGFydChFbGVtZW50IHBhcnRFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBQYXJ0IHBhcnQgPSBkZWYuY3JlYXRlUGFydCgpOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHBhcnRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBRTmFtZSBlbGVtZW50TmFtZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBlbGVtZW50TmFtZSA9IERPTVV0aWxzLmdldFF1YWxpZmllZEF0dHJpYnV0ZVZhbHVlKHBhcnRFbCwgQ29uc3RhbnRzLkFUVFJfRUxFTUVOVCwgQ29uc3RhbnRzLkVMRU1fTUVTU0FHRSwgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy90aGUgY2FsbCBhYm92ZSBmYWlscyBpZiB0aGVyZSBpcyBubyBxdWFsaWZpZWQgbmFtZXNwYWNlIGZvciB0aGUgZWxlbWVudCBuYW1lCi0gICAgICBlbGVtZW50TmFtZSA9IG5ldyBRTmFtZShudWxsLCBET01VdGlscy5nZXRBdHRyaWJ1dGUocGFydEVsLCAiZWxlbWVudCIpKTsKLSAgICB9Ci0KLSAgICBRTmFtZSB0eXBlTmFtZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICB0eXBlTmFtZSA9IERPTVV0aWxzLmdldFF1YWxpZmllZEF0dHJpYnV0ZVZhbHVlKHBhcnRFbCwgQ29uc3RhbnRzLkFUVFJfVFlQRSwKLSAgICAgICAgLy8gQ29ycmVjdGVkIC0gd2FzIEFUVFJfRUxFTUVOVAotICBDb25zdGFudHMuRUxFTV9NRVNTQUdFLCBmYWxzZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL3RoZSBjYWxsIGFib3ZlIGZhaWxzIGlmIHRoZXJlIGlzIG5vIHF1YWxpZmllZCBuYW1lc3BhY2UgZm9yIHRoZSBlbGVtZW50IGF0dHJpYnV0ZQotICAgICAgdHlwZU5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHBhcnRFbCwgIm5hbWUiKSk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYXJ0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKGVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcGFydC5zZXRFbGVtZW50TmFtZShlbGVtZW50TmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKHR5cGVOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcGFydC5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChwYXJ0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBwYXJ0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFhNTCBWYWxpZGF0aW9uIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgTWFwIGV4dGVuc2lvbkF0dHJpYnV0ZXMgPSBwYXJ0LmdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKTsKLQotICAgIGV4dGVuc2lvbkF0dHJpYnV0ZXMucHV0QWxsKGdldFBhcnRBdHRyaWJ1dGVzKHBhcnRFbCwgZGVmKSk7Ci0KLSAgICAvLyBOZWVkIHRvIGRvIHNvbWV0aGluZyBoZXJlIHRvIGxvY2F0ZSBwYXJ0IGRlZmluaXRpb24uCi0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKHBhcnQsIHBhcnRFbCk7Ci0KLSAgICByZXR1cm4gcGFydDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBtYXAgb2YgdGhlIHBhcnQgYXR0cmlidXRlcy4KLSAgICogCi0gICAqIEBwYXJhbSBlbCBUaGUgcGFydCBhdHRyaWJ1dGVzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmludGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIG1hcCBjb250YWluaW5nIHRoZSBwYXJ0IGF0dHJpYnV0ZXMuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIE1hcCBnZXRQYXJ0QXR0cmlidXRlcyhFbGVtZW50IGVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBOYW1lZE5vZGVNYXAgbm9kZU1hcCA9IGVsLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgYXR0cyA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0KLSAgICBmb3IgKGludCBhID0gMDsgYSA8IGF0dHM7IGErKykKLSAgICB7Ci0gICAgICBBdHRyIGF0dHJpYnV0ZSA9IChBdHRyKW5vZGVNYXAuaXRlbShhKTsKLSAgICAgIFN0cmluZyBsTmFtZSA9IGF0dHJpYnV0ZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgIFN0cmluZyBuU3BhY2UgPSBhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gYXR0cmlidXRlLmdldFByZWZpeCgpOwotICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZShuU3BhY2UsIGxOYW1lKTsKLQotICAgICAgaWYgKG5TcGFjZSAhPSBudWxsICYmICFuU3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfV1NETCkpCi0gICAgICB7Ci0gICAgICAgIGlmICghblNwYWNlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hNTE5TKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBzdHJWYWx1ZSA9IGF0dHJpYnV0ZS5nZXRWYWx1ZSgpOwotICAgICAgICAgIFFOYW1lIHFWYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBxVmFsdWUgPSBET01VdGlscy5nZXRRTmFtZShzdHJWYWx1ZSwgZWwpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHFWYWx1ZSA9IG5ldyBRTmFtZShzdHJWYWx1ZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgcVZhbHVlKTsKLQotICAgICAgICAgIFN0cmluZyB0ZW1wTlNVcmkgPSBkZWYuZ2V0TmFtZXNwYWNlKHByZWZpeCk7Ci0KLSAgICAgICAgICB3aGlsZSAodGVtcE5TVXJpICE9IG51bGwgJiYgIXRlbXBOU1VyaS5lcXVhbHMoblNwYWNlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmVmaXggKz0gIl8iOwotICAgICAgICAgICAgdGVtcE5TVXJpID0gZGVmLmdldE5hbWVzcGFjZShwcmVmaXgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGRlZi5hZGROYW1lc3BhY2UocHJlZml4LCBuU3BhY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgIWxOYW1lLmVxdWFscyhDb25zdGFudHMuQVRUUl9OQU1FKQotICAgICAgICAgICYmICFsTmFtZS5lcXVhbHMoQ29uc3RhbnRzLkFUVFJfRUxFTUVOVCkKLSAgICAgICAgICAmJiAhbE5hbWUuZXF1YWxzKENvbnN0YW50cy5BVFRSX1RZUEUpKQotICAgICAgewotICAgICAgICBXU0RMRXhjZXB0aW9uIHdzZGxFeGMgPQotICAgICAgICAgIG5ldyBXU0RMRXhjZXB0aW9uKAotICAgICAgICAgICAgV1NETEV4Y2VwdGlvbi5JTlZBTElEX1dTREwsCi0gICAgICAgICAgICAiRW5jb3VudGVyZWQgaWxsZWdhbCAiCi0gICAgICAgICAgICAgICsgInBhcnQgZXh0ZW5zaW9uICIKLSAgICAgICAgICAgICAgKyAiYXR0cmlidXRlICciCi0gICAgICAgICAgICAgICsgbmFtZQotICAgICAgICAgICAgICArICInLiBFeHRlbnNpb24gIgotICAgICAgICAgICAgICArICJhdHRyaWJ1dGVzIG11c3QgYmUgaW4gIgotICAgICAgICAgICAgICArICJhIG5hbWVzcGFjZSBvdGhlciB0aGFuICIKLSAgICAgICAgICAgICAgKyAiV1NETCdzLiIpOwotCi0gICAgICAgIHdzZGxFeGMuc2V0TG9jYXRpb24oWFBhdGhVdGlscy5nZXRYUGF0aEV4cHJGcm9tTm9kZShlbCkpOwotICAgICAgICAvL3Rocm93IHdzZGxFeGM7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihhdHRyaWJ1dGVzLCBlbCk7Ci0KLSAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIHBvcnRUeXBlIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gcG9ydFR5cGVFbCBUaGUgcG9ydFR5cGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBwb3J0VHlwZSBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBQb3J0VHlwZSBwYXJzZVBvcnRUeXBlKEVsZW1lbnQgcG9ydFR5cGVFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLQotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShwb3J0VHlwZUVsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgUU5hbWUgcG9ydFR5cGVOYW1lID0gbmV3IFFOYW1lKGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZSk7Ci0KLSAgICAgIHBvcnRUeXBlID0gZGVmLmdldFBvcnRUeXBlKHBvcnRUeXBlTmFtZSk7Ci0KLSAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBwb3J0VHlwZSA9IGRlZi5jcmVhdGVQb3J0VHlwZSgpOwotICAgICAgICBwb3J0VHlwZS5zZXRRTmFtZShwb3J0VHlwZU5hbWUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIXBvcnRUeXBlLmlzVW5kZWZpbmVkKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIHRoZSBQb3J0VHlwZSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgcHJvZHVjZSBhbiBlcnJvciBhbmQgcmV0dXJuIG51bGwKLSAgICAgICAgYWRkUmVhZGVyRXJyb3IoCi0gICAgICAgICAgZGVmLAotICAgICAgICAgIHBvcnRUeXBlRWwsCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9QT1JUVFlQRV9OQU1FX0FMUkVBRFlfREVGSU5FRCIsICInIiArIHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiJyIpKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwb3J0VHlwZSA9IGRlZi5jcmVhdGVQb3J0VHlwZSgpOwotICAgIH0KLQotICAgIC8vIFdoZXRoZXIgaXQgd2FzIHJldHJpZXZlZCBvciBjcmVhdGVkLCB0aGUgZGVmaW5pdGlvbiBoYXMgYmVlbiBmb3VuZC4KLSAgICBwb3J0VHlwZS5zZXRVbmRlZmluZWQoZmFsc2UpOwotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChwb3J0VHlwZUVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgcG9ydFR5cGUuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX09QRVJBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgLy8gbW9kaWZpZWQgc28gZHVwbGljYXRlIG9wZXJhdGlvbnMgd2lsbCBub3QgYmUgYWRkZWQgdG8gcG9ydHR5cGUgCi0gICAgICAgIE9wZXJhdGlvbiBvcCA9IHBhcnNlT3BlcmF0aW9uKHRlbXBFbCwgcG9ydFR5cGUsIGRlZik7Ci0gICAgICAgIGlmIChvcCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcG9ydFR5cGUuYWRkT3BlcmF0aW9uKG9wKTsKLSAgICAgICAgfQotICAgICAgICAvL3BvcnRUeXBlLmFkZE9wZXJhdGlvbihwYXJzZU9wZXJhdGlvbih0ZW1wRWwsIHBvcnRUeXBlLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gc29tZXRoaW5nIGVsc2UgdGhhdCBzaG91bGRuJ3QgYmUgaGVyZQotICAgICAgICAvLyBORUVEIFRPIEFERCBUTyBFUlJPUiBMSVNUCi0gICAgICAgIC8vRE9NVXRpbHMudGhyb3dXU0RMRXhjZXB0aW9uKHRlbXBFbCk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgc2V0TG9jYXRpb24ocG9ydFR5cGUsIHBvcnRUeXBlRWwpOwotCi0gICAgcmV0dXJuIHBvcnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgc3BlY2lmaWMgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gb3BFbCBUaGUgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwb3J0VHlwZSBUaGUgcG9ydFR5cGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIE9wZXJhdGlvbiBwYXJzZU9wZXJhdGlvbihFbGVtZW50IG9wRWwsIFBvcnRUeXBlIHBvcnRUeXBlLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIE9wZXJhdGlvbiBvcCA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUob3BFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgU3RyaW5nIHBhcmFtZXRlck9yZGVyU3RyID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKG9wRWwsIENvbnN0YW50cy5BVFRSX1BBUkFNRVRFUl9PUkRFUik7Ci0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChvcEVsKTsKLSAgICBMaXN0IG1lc3NhZ2VPcmRlciA9IG5ldyBWZWN0b3IoKTsKLSAgICBFbGVtZW50IGRvY0VsID0gbnVsbDsKLSAgICBJbnB1dCBpbnB1dCA9IG51bGw7Ci0gICAgT3V0cHV0IG91dHB1dCA9IG51bGw7Ci0gICAgTGlzdCBmYXVsdHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGRvY0VsID0gdGVtcEVsOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fSU5QVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGlucHV0ID0gcGFyc2VJbnB1dCh0ZW1wRWwsIGRlZik7Ci0gICAgICAgIG1lc3NhZ2VPcmRlci5hZGQoQ29uc3RhbnRzLkVMRU1fSU5QVVQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fT1VUUFVULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBvdXRwdXQgPSBwYXJzZU91dHB1dCh0ZW1wRWwsIGRlZik7Ci0gICAgICAgIG1lc3NhZ2VPcmRlci5hZGQoQ29uc3RhbnRzLkVMRU1fT1VUUFVUKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0ZBVUxULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBmYXVsdHMuYWRkKHBhcnNlRmF1bHQodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gaW52YWxpZCBlbGVtZW50IGluIHRoZSBvcGVyYXRpb24KLSAgICAgICAgLy8gWE1MIGNoZWNrIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgaW5wdXROYW1lID0gKGlucHV0ICE9IG51bGwgPyBpbnB1dC5nZXROYW1lKCkgOiBudWxsKTsKLSAgICAgIFN0cmluZyBvdXRwdXROYW1lID0gKG91dHB1dCAhPSBudWxsID8gb3V0cHV0LmdldE5hbWUoKSA6IG51bGwpOwotCi0gICAgICBib29sZWFuIG9wRGVmaW5lZCA9IGZhbHNlOwotCi0gICAgICB0cnkKLSAgICAgIHsKLQotICAgICAgICAvL29wID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9uKG5hbWUsIGlucHV0TmFtZSwgb3V0cHV0TmFtZSk7Ci0KLSAgICAgICAgLy9PcGVyYXRpb24gb3AgPSBudWxsOwotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIGlmIChvcGVyYXRpb25zICE9IG51bGwpCi0gICAgICAgIHsKLQotICAgICAgICAgIEl0ZXJhdG9yIGlPcGVyYXRpb25zID0gb3BlcmF0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChpT3BlcmF0aW9ucy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBpbnB1dE5hbWVzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gb3V0cHV0TmFtZXNFcXVhbCA9IGZhbHNlOwotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXIgPSAoT3BlcmF0aW9uKWlPcGVyYXRpb25zLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvcGVyLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJbnB1dCBvcElucHV0ID0gb3Blci5nZXRJbnB1dCgpOwotICAgICAgICAgICAgICBpZiAob3BJbnB1dCAhPSBudWxsICYmIGlucHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3BJbnB1dE5hbWUgPSBvcElucHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAob3BJbnB1dE5hbWUgIT0gbnVsbCAmJiBpbnB1dE5hbWUgIT0gbnVsbCAmJiBvcElucHV0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKGlucHV0TmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW5wdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAob3BJbnB1dE5hbWUgPT0gbnVsbCAmJiBpbnB1dE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpbnB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmIChvcElucHV0ID09IG51bGwgJiYgaW5wdXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlucHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgT3V0cHV0IG9wT3V0cHV0ID0gb3Blci5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAgICAgaWYgKG9wT3V0cHV0ICE9IG51bGwgJiYgb3V0cHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3BPdXRwdXROYW1lID0gb3BPdXRwdXQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChvcE91dHB1dE5hbWUgIT0gbnVsbCAmJiBvdXRwdXROYW1lICE9IG51bGwgJiYgb3BPdXRwdXROYW1lLmVxdWFsc0lnbm9yZUNhc2Uob3V0cHV0TmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb3V0cHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wT3V0cHV0TmFtZSA9PSBudWxsICYmIG91dHB1dE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBvdXRwdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAob3BPdXRwdXQgPT0gbnVsbCAmJiBvdXRwdXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChpbnB1dE5hbWVzRXF1YWwgJiYgb3V0cHV0TmFtZXNFcXVhbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9wID0gb3BlcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBvcERlZmluZWQgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCAvKiYmICFvcC5pc1VuZGVmaW5lZCgpKi8KLSAgICAgICAgKQotICAgICAgewotICAgICAgICAvL29wID0gbnVsbDsKLSAgICAgICAgb3BEZWZpbmVkID0gdHJ1ZTsKLQotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCAmJiAhb3BEZWZpbmVkKQotICAgICAgewotICAgICAgICBpZiAoaW5wdXROYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJbnB1dCB0ZW1wSW4gPSBvcC5nZXRJbnB1dCgpOwotCi0gICAgICAgICAgaWYgKHRlbXBJbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0ZW1wSW4uZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vb3AgPSBudWxsOwotICAgICAgICAgICAgICBvcERlZmluZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCAmJiAhb3BEZWZpbmVkKQotICAgICAgewotICAgICAgICBpZiAob3V0cHV0TmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgT3V0cHV0IHRlbXBPdXQgPSBvcC5nZXRPdXRwdXQoKTsKLQotICAgICAgICAgIGlmICh0ZW1wT3V0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHRlbXBPdXQuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vb3AgPSBudWxsOwotICAgICAgICAgICAgICBvcERlZmluZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAob3BEZWZpbmVkKQotICAgICAgewotICAgICAgICAvLyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZSB3aXRoIHRoZSBzYW1lIG5hbWUgd2UncmUgZ29pbmcgdG8gcmV0dXJuIG51bGwuCi0gICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgV1NETCAxLjIgd29ya2luZyBkcmFmdCBvcGVyYXRpb24gb3ZlcmxvYWRpbmcgaXMgbm8gbG9uZ2VyIGFsbG93ZWQuCi0gICAgICAgIC8vIEdvaW5nIHRvIHVzZSB0aGF0IGhlcmUgdG8gc2F2ZSBhIGxvdCBvZiB3b3JrCi0gICAgICAgIHNldExvY2F0aW9uKG9wLCBvcEVsKTsKLSAgICAgICAgYWRkUmVhZGVyRXJyb3IoCi0gICAgICAgICAgcG9ydFR5cGUsCi0gICAgICAgICAgb3AsCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAiX0RVUExJQ0FURV9PUEVSQVRJT05fRk9SX1BPUlRUWVBFIiwKLSAgICAgICAgICAgICInIiArIG9wLmdldE5hbWUoKSArICInIiwKLSAgICAgICAgICAgICInIiArIHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiJyIpKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICBpZiAob3AgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3AgPSBkZWYuY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgICAgIG9wLnNldE5hbWUobmFtZSk7Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG9wID0gZGVmLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIH0KLQotICAgIC8vIFdoZXRoZXIgaXQgd2FzIHJldHJpZXZlZCBvciBjcmVhdGVkLCB0aGUgZGVmaW5pdGlvbiBoYXMgYmVlbiBmb3VuZC4KLSAgICBvcC5zZXRVbmRlZmluZWQoZmFsc2UpOwotCi0gICAgaWYgKHBhcmFtZXRlck9yZGVyU3RyICE9IG51bGwpCi0gICAgewotICAgICAgb3Auc2V0UGFyYW1ldGVyT3JkZXJpbmcoU3RyaW5nVXRpbHMucGFyc2VOTVRva2VucyhwYXJhbWV0ZXJPcmRlclN0cikpOwotICAgIH0KLQotICAgIGlmIChkb2NFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIG9wLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvY0VsKTsKLSAgICB9Ci0KLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcC5zZXRJbnB1dChpbnB1dCk7Ci0gICAgfQotCi0gICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIG9wLnNldE91dHB1dChvdXRwdXQpOwotICAgIH0KLQotICAgIGlmIChmYXVsdHMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBmYXVsdEl0ZXJhdG9yID0gZmF1bHRzLml0ZXJhdG9yKCk7Ci0KLSAgICAgIHdoaWxlIChmYXVsdEl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgRmF1bHQgZiA9IChGYXVsdClmYXVsdEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgLy8gaWYgdGhlIGZhdWx0IGlzbid0IGRlZmluZWQgeWV0Ci0gICAgICAgIGlmIChvcC5nZXRGYXVsdChmLmdldE5hbWUoKSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG9wLmFkZEZhdWx0KGYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGFkZFJlYWRlckVycm9yKAotICAgICAgICAgICAgb3AsCi0gICAgICAgICAgICBmLAotICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9EVVBMSUNBVEVfRkFVTFRfTkFNRSIsICInIiArIGYuZ2V0TmFtZSgpICsgIiciLCAiJyIgKyBvcC5nZXROYW1lKCkgKyAiJyIpKTsKLSAgICAgICAgICAvL2ZhdWx0RXJyb3JzLmFkZChuZXcgT2JqZWN0W117ZiwiRHVwbGljYXRlIE5hbWUiLG9wfSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBPcGVyYXRpb25UeXBlIHN0eWxlID0gbnVsbDsKLQotICAgIGlmIChtZXNzYWdlT3JkZXIuZXF1YWxzKFNUWUxFX09ORV9XQVkpKQotICAgIHsKLSAgICAgIHN0eWxlID0gT3BlcmF0aW9uVHlwZS5PTkVfV0FZOwotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzYWdlT3JkZXIuZXF1YWxzKFNUWUxFX1JFUVVFU1RfUkVTUE9OU0UpKQotICAgIHsKLSAgICAgIHN0eWxlID0gT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFOwotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzYWdlT3JkZXIuZXF1YWxzKFNUWUxFX1NPTElDSVRfUkVTUE9OU0UpKQotICAgIHsKLSAgICAgIHN0eWxlID0gT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFOwotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzYWdlT3JkZXIuZXF1YWxzKFNUWUxFX05PVElGSUNBVElPTikpCi0gICAgewotICAgICAgc3R5bGUgPSBPcGVyYXRpb25UeXBlLk5PVElGSUNBVElPTjsKLSAgICB9Ci0KLSAgICBpZiAoc3R5bGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcC5zZXRTdHlsZShzdHlsZSk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihvcCwgb3BFbCk7Ci0KLSAgICAvLyBtb2RpZmllZCB0byByZW1vdmUgZHVwbGljYXRlIG9wZXJhdGlvbnMKLSAgICAvLyAgICBpZihvcERlZmluZWQpCi0gICAgLy8gICAgewotICAgIC8vICAgICAgYWRkUmVhZGVyRXJyb3IocG9ydFR5cGUsb3AsVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfRFVQTElDQVRFX09QRVJBVElPTl9GT1JfUE9SVFRZUEUiLCInIitvcC5nZXROYW1lKCkrIiciLCInIitwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKyInIikpOwotICAgIC8vICAgICAgcmV0dXJuIG51bGw7Ci0gICAgLy8gICAgfQotICAgIHJldHVybiBvcDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIHNlcnZpY2UgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBzZXJ2aWNlRWwgVGhlIHNlcnZpY2UgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBzZXJ2aWNlIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2UgcGFyc2VTZXJ2aWNlKEVsZW1lbnQgc2VydmljZUVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIFNlcnZpY2Ugc2VydmljZSA9IGRlZi5jcmVhdGVTZXJ2aWNlKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoc2VydmljZUVsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2VydmljZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lKSk7Ci0gICAgfQotICAgIFNlcnZpY2UgczsKLSAgICAvLyBhIHNlcnZpY2Ugd2l0aCB0aGlzIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkCi0gICAgaWYgKChzID0gZGVmLmdldFNlcnZpY2Uoc2VydmljZS5nZXRRTmFtZSgpKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRSZWFkZXJFcnJvcigKLSAgICAgICAgZGVmLAotICAgICAgICBzZXJ2aWNlRWwsCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKCJfU0VSVklDRV9OQU1FX0FMUkVBRFlfREVGSU5FRCIsICInIiArIHMuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICInIikpOwotICAgICAgcmV0dXJuIHM7Ci0gICAgfQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoc2VydmljZUVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgc2VydmljZS5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fUE9SVCwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgc2VydmljZS5hZGRQb3J0KHBhcnNlUG9ydCh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZXJ2aWNlLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoU2VydmljZS5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihzZXJ2aWNlLCBzZXJ2aWNlRWwpOwotCi0gICAgcmV0dXJuIHNlcnZpY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIHBvcnQgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBwb3J0RWwgVGhlIHBvcnQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgcG9ydCBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBQb3J0IHBhcnNlUG9ydChFbGVtZW50IHBvcnRFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBQb3J0IHBvcnQgPSBkZWYuY3JlYXRlUG9ydCgpOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHBvcnRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgYmluZGluZ1N0cjsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiaW5kaW5nU3RyID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUocG9ydEVsLCBDb25zdGFudHMuQVRUUl9CSU5ESU5HLCBDb25zdGFudHMuRUxFTV9QT1JULCBmYWxzZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL3RoZSBjYWxsIGFib3ZlIGZhaWxzIGlmIHRoZXJlIGlzIG5vIHF1YWxpZmllZCBuYW1lc3BhY2UgZm9yIHRoZSBtZXNzYWdlIG5hbWUKLSAgICAgIGJpbmRpbmdTdHIgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHBvcnRFbCwgImJpbmRpbmciKSk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwb3J0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKGJpbmRpbmdTdHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSBkZWYuZ2V0QmluZGluZyhiaW5kaW5nU3RyKTsKLQotICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZyA9IGRlZi5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgICAgIGJpbmRpbmcuc2V0UU5hbWUoYmluZGluZ1N0cik7Ci0gICAgICAgIGRlZi5hZGRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgfQotCi0gICAgICBwb3J0LnNldEJpbmRpbmcoYmluZGluZyk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChwb3J0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBwb3J0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHBvcnQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQocGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChQb3J0LmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKHBvcnQsIHBvcnRFbCk7Ci0KLSAgICByZXR1cm4gcG9ydDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGV4dGVuc2liaWxpdHkgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRUeXBlIFRoZSBwYXJlbnQgdHlwZSBvZiB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgotICAgKiBAcGFyYW0gZWwgVGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBFeHRlbnNpYmlsaXR5RWxlbWVudCBwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KENsYXNzIHBhcmVudFR5cGUsIEVsZW1lbnQgZWwsIERlZmluaXRpb24gZGVmKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBRTmFtZSBlbGVtZW50VHlwZSA9IFFOYW1lVXRpbHMubmV3UU5hbWUoZWwpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0UmVnID0gZGVmLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLSAgICAgIGlmIChleHRSZWcgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oCi0gICAgICAgICAgV1NETEV4Y2VwdGlvbi5DT05GSUdVUkFUSU9OX0VSUk9SLAotICAgICAgICAgICJObyBFeHRlbnNpb25SZWdpc3RyeSBzZXQgZm9yIHRoaXMgIgotICAgICAgICAgICAgKyAiRGVmaW5pdGlvbiwgc28gdW5hYmxlIHRvIGRlc2VyaWFsaXplICIKLSAgICAgICAgICAgICsgImEgJyIKLSAgICAgICAgICAgICsgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICsgIicgZWxlbWVudCBpbiB0aGUgIgotICAgICAgICAgICAgKyAiY29udGV4dCBvZiBhICciCi0gICAgICAgICAgICArIHBhcmVudFR5cGUuZ2V0TmFtZSgpCi0gICAgICAgICAgICArICInLiIpOwotICAgICAgfQotCi0gICAgICBFeHRlbnNpb25EZXNlcmlhbGl6ZXIgZXh0RFMgPSBleHRSZWcucXVlcnlEZXNlcmlhbGl6ZXIocGFyZW50VHlwZSwgZWxlbWVudFR5cGUpOwotCi0gICAgICAvLyBhc2lnbiB0aGUgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdG8gYSB2YXIgc28gd2UgY2FuIGFkZCBpdCB0byB0aGUgbG9jYXRpb25zCi0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gZXh0RFMudW5tYXJzaGFsbChwYXJlbnRUeXBlLCBlbGVtZW50VHlwZSwgZWwsIGRlZiwgZXh0UmVnKTsKLSAgICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgICAvLyB0aGlzIG1pZ2h0IG5vdCB3b3JrIHByb3Blcmx5Ci0gICAgICBzZXRMb2NhdGlvbihleHRFbGVtLCBlbCk7Ci0KLSAgICAgIC8vIHJlZ2lzdGVyIGFsbCBvZiB0aGUgY2hpbGQgRWxlbWVudHMgc28gd2UgY2FuIGZpbmQgdGhlbSBsYXRlcgotICAgICAgLy8gdXNlZCBmb3IgaW5saW5lIHNjaGVtYSB2YWxpZGF0aW9uCi0gICAgICByZWdpc3RlckNoaWxkRWxlbWVudHMoZXh0RWxlbSk7Ci0KLSAgICAgIHJldHVybiBleHRFbGVtOwotICAgIH0KLSAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGlmIChlLmdldExvY2F0aW9uKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZS5zZXRMb2NhdGlvbihYUGF0aFV0aWxzLmdldFhQYXRoRXhwckZyb21Ob2RlKGVsKSk7Ci0gICAgICB9Ci0gICAgICB0aHJvdyBlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGlucHV0IGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gaW5wdXRFbCBUaGUgaW5wdXQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBpbnB1dCBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBJbnB1dCBwYXJzZUlucHV0KEVsZW1lbnQgaW5wdXRFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLQotICAgIElucHV0IGlucHV0ID0gZGVmLmNyZWF0ZUlucHV0KCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoaW5wdXRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1lc3NhZ2VOYW1lID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUoaW5wdXRFbCwgQ29uc3RhbnRzLkFUVFJfTUVTU0FHRSwgQ29uc3RhbnRzLkVMRU1fSU5QVVQsIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vdGhlIGNhbGwgYWJvdmUgZmFpbHMgaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWVkIG5hbWVzcGFjZSBmb3IgdGhlIG1lc3NhZ2UgbmFtZQotICAgICAgbWVzc2FnZU5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGlucHV0RWwsICJtZXNzYWdlIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgaW5wdXQuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAobWVzc2FnZU5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBkZWYuZ2V0TWVzc2FnZShtZXNzYWdlTmFtZSk7Ci0KLSAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBkZWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBtZXNzYWdlLnNldFFOYW1lKG1lc3NhZ2VOYW1lKTsKLSAgICAgICAgZGVmLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlucHV0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChpbnB1dEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgaW5wdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gWE1MIFZhbGlkYXRpb24gd2lsbCBjYXRjaCB0aGlzCi0gICAgICAgIERPTVV0aWxzLnRocm93V1NETEV4Y2VwdGlvbih0ZW1wRWwpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGlucHV0LCBpbnB1dEVsKTsKLQotICAgIHJldHVybiBpbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIG91dHB1dCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIG91dHB1dEVsIFRoZSBvdXRwdXQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBvdXRwdXQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgT3V0cHV0IHBhcnNlT3V0cHV0KEVsZW1lbnQgb3V0cHV0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgT3V0cHV0IG91dHB1dCA9IGRlZi5jcmVhdGVPdXRwdXQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShvdXRwdXRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1lc3NhZ2VOYW1lID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUob3V0cHV0RWwsIENvbnN0YW50cy5BVFRSX01FU1NBR0UsIENvbnN0YW50cy5FTEVNX09VVFBVVCwgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy90aGUgY2FsbCBhYm92ZSBmYWlscyBpZiB0aGVyZSBpcyBubyBxdWFsaWZpZWQgbmFtZXNwYWNlIGZvciB0aGUgbWVzc2FnZSBuYW1lCi0gICAgICBtZXNzYWdlTmFtZSA9IG5ldyBRTmFtZShudWxsLCBET01VdGlscy5nZXRBdHRyaWJ1dGUob3V0cHV0RWwsICJtZXNzYWdlIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgb3V0cHV0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKG1lc3NhZ2VOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZGVmLmdldE1lc3NhZ2UobWVzc2FnZU5hbWUpOwotCi0gICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBtZXNzYWdlID0gZGVmLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgbWVzc2FnZS5zZXRRTmFtZShtZXNzYWdlTmFtZSk7Ci0gICAgICAgIGRlZi5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgfQotCi0gICAgICBvdXRwdXQuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KG91dHB1dEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgb3V0cHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFhNTCBWYWxpZGF0aW9uIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihvdXRwdXQsIG91dHB1dEVsKTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBmYXVsdCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGZhdWx0RWwgVGhlIGZhdWx0IGVsZW1lbnQgdG8gcGFyc2UuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIGZhdWx0IGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIEZhdWx0IHBhcnNlRmF1bHQoRWxlbWVudCBmYXVsdEVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEZhdWx0IGZhdWx0ID0gZGVmLmNyZWF0ZUZhdWx0KCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoZmF1bHRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1lc3NhZ2VOYW1lID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUoZmF1bHRFbCwgQ29uc3RhbnRzLkFUVFJfTUVTU0FHRSwgQ29uc3RhbnRzLkVMRU1fSU5QVVQsIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vdGhlIGNhbGwgYWJvdmUgZmFpbHMgaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWVkIG5hbWVzcGFjZSBmb3IgdGhlIG1lc3NhZ2UgbmFtZQotICAgICAgbWVzc2FnZU5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGZhdWx0RWwsICJtZXNzYWdlIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgZmF1bHQuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAobWVzc2FnZU5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBkZWYuZ2V0TWVzc2FnZShtZXNzYWdlTmFtZSk7Ci0KLSAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBkZWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBtZXNzYWdlLnNldFFOYW1lKG1lc3NhZ2VOYW1lKTsKLSAgICAgICAgZGVmLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZhdWx0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChmYXVsdEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgZmF1bHQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gWE1MIFZhbGlkYXRpb24gd2lsbCBjYXRjaCB0aGlzCi0gICAgICAgIERPTVV0aWxzLnRocm93V1NETEV4Y2VwdGlvbih0ZW1wRWwpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGZhdWx0LCBmYXVsdEVsKTsKLQotICAgIHJldHVybiBmYXVsdDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgbWVzc2FnZWdlbmVyYXRvciBmb3IgdGhlIHJlYWRlci4KLSAgICogCi0gICAqIEBwYXJhbSBtZyBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUdlbmVyYXRvcihNZXNzYWdlR2VuZXJhdG9yIG1nKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1nOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCB0aGUgcmVmT2JqZWN0IHRvIHRoZSBlbGVtZW50TG9jYXRpb24gaGFzaHRhYmxlIHdpdGggdGhlIGxvY2F0aW9uIGRlZmluZWQgaW4gZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSByZWZPYmplY3QgVGhlIG9iamVjdCB0byBhZGQuCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0TG9jYXRpb24oT2JqZWN0IHJlZk9iamVjdCwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRWxlbWVudEltcGwgZWxlbWVudEltcGwgPSAoRWxlbWVudEltcGwpZWxlbWVudDsKLSAgICAgIEVsZW1lbnRMb2NhdGlvbiBlbGVtZW50TG9jYXRpb24gPSAoRWxlbWVudExvY2F0aW9uKWVsZW1lbnRJbXBsLmdldFVzZXJEYXRhKEVsZW1lbnRMb2NhdGlvbi5JRCk7Ci0gICAgICBpZiAoZWxlbWVudExvY2F0aW9uICE9IG51bGwpCi0gICAgICB7Ci0KLSAgICAgICAgZWxlbWVudExvY2F0aW9ucy5wdXQoCi0gICAgICAgICAgcmVmT2JqZWN0LAotICAgICAgICAgIG5ldyBMb2NhdGlvbkhvbGRlcihlbGVtZW50TG9jYXRpb24uZ2V0TGluZU51bWJlcigpLCBlbGVtZW50TG9jYXRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIGRlZi5nZXREb2N1bWVudEJhc2VVUkkoKSkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgfQotICAvKioKLSAgICogQWRkIGEgcmVhZGVyIGVycm9yIHRvIHRoZSBsaXN0LgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IgbWVzc2FnZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFJlYWRlckVycm9yKE9iamVjdCBwYXJlbnRvYmplY3QsIE9iamVjdCBvYmplY3QsIFN0cmluZyBlcnJvcikKLSAgewotICAgIHJlYWRlckVycm9ycy5hZGQobmV3IFJlYWRlckVycm9yKHBhcmVudG9iamVjdCwgb2JqZWN0LCBlcnJvcikpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgcmVhZGVyIHdhcm5pbmcgdG8gdGhlIGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50b2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvci4KLSAgICogQHBhcmFtIHdhcm5pbmcgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFJlYWRlcldhcm5pbmcoT2JqZWN0IHBhcmVudG9iamVjdCwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIHdhcm5pbmcpCi0gIHsKLSAgICByZWFkZXJXYXJuaW5ncy5hZGQobmV3IFJlYWRlckVycm9yKHBhcmVudG9iamVjdCwgb2JqZWN0LCB3YXJuaW5nKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZWdpc3RlciBhbGwgb2YgdGhlIGxvY2F0aW9ucyBvZiB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGV4dGVuc2liaWxpdHkKLSAgICogZWxlbWVudCBnaXZlbi4KLSAgICogCi0gICAqIEBwYXJhbSBleHRFbGVtIFRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgd2hvc2UgY2hpbGQgZWxlbWVudHMgd2lsbCBiZSByZWdpc3RlcmVkLgotICAgKi8KLQotICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckNoaWxkRWxlbWVudHMoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSkKLSAgewotICAgIC8vIG9ubHkgYWRkIHRob3NlIHRoYXQgYXJlIG9mIHR5cGUgdW5rbm93bi4gaWYgdGhleSdyZSBrbm93biB0aGV5IAotICAgIC8vIHdpbGwgdGFrZSBjYXJlIG9mIHRoZW1zZWx2ZXMKLSAgICBpZiAoZXh0RWxlbSBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW0gPSAoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtKS5nZXRFbGVtZW50KCk7Ci0gICAgICByZWdpc3RlckNoaWxkRWxlbWVudHNSZWN1cnNpdmVseShlbGVtKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgdGhlIGxvY2F0aW9uIG9mIGFsbCBvZiB0aGUgY2hpbGQgZWxlbWVudHMgb2YgZWxlbS4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtIFRoZSBlbGVtZW50IHdob3NlIGNoaWxkIGVsZW1lbnRzIHdpbGwgYmUgcmVnaXN0ZXJlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQ2hpbGRFbGVtZW50c1JlY3Vyc2l2ZWx5KEVsZW1lbnQgZWxlbSkKLSAgewotICAgIGlmIChlbGVtIGluc3RhbmNlb2YgRWxlbWVudE5TSW1wbCkKLSAgICB7Ci0gICAgICBzZXRMb2NhdGlvbihlbGVtLCBlbGVtKTsKLQotICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBlbGVtLmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpIHx8IGkgPCA1OyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLSAgICAgICAgLy8gd2Ugb25seSB3YW50IG5vZGVzIHRoYXQgYXJlIEVsZW1lbnRzCi0gICAgICAgIGlmIChuIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCluOwotICAgICAgICAgIHJlZ2lzdGVyQ2hpbGRFbGVtZW50c1JlY3Vyc2l2ZWx5KGNoaWxkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAvKioKLSAgICogQ2hlY2sgdGhhdCBhbiBlbGVtZW50IG5hbWUgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSBlbCBUaGUgZWxlbWVudCB3aXRoIHRoZSBuYW1lIHRvIGNoZWNrLgotICAgKiBAcGFyYW0gcW5hbWUgVGhlIG5hbWUgdG8gY2hlY2sgYWdhaW5zdC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRWxlbWVudE5hbWUoRWxlbWVudCBlbCwgUU5hbWUgcW5hbWUpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoIVFOYW1lVXRpbHMubWF0Y2hlcyhxbmFtZSwgZWwpKQotICAgIHsKLSAgICAgIFdTRExFeGNlcHRpb24gd3NkbEV4YyA9IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uSU5WQUxJRF9XU0RMLCAiRXhwZWN0ZWQgZWxlbWVudCAnIiArIHFuYW1lICsgIicuIik7Ci0KLSAgICAgIHdzZGxFeGMuc2V0TG9jYXRpb24oWFBhdGhVdGlscy5nZXRYUGF0aEV4cHJGcm9tTm9kZShlbCkpOwotCi0gICAgICB0aHJvdyB3c2RsRXhjOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZWxlbWVudCBsb2NhdGlvbnMgaGFzaHRhYmxlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZWxlbWVudCBsb2NhdGlvbnMgaGFzaHRhYmxlLgotICAgKi8KLSAgcHVibGljIEhhc2h0YWJsZSBnZXRFbGVtZW50TG9jYXRpb25zKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50TG9jYXRpb25zOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSByZWFkZXIgZXJyb3JzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgcmVhZGVyIGVycm9ycy4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFJlYWRlckVycm9ycygpCi0gIHsKLSAgICByZXR1cm4gcmVhZGVyRXJyb3JzOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHJlYWRlciB3YXJuaW5ncy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHJlYWRlciB3YXJuaW5ncy4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFJlYWRlcldhcm5pbmdzKCkKLSAgewotICAgIHJldHVybiByZWFkZXJXYXJuaW5nczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTRExSZWFkZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMUmVhZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTZlY2Q2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTRExSZWFkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5ET01QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5MaW5lTnVtYmVyRE9NUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC5TdHJpbmdVdGlsczsKLQotLyoqCi0gKiBBIFdTREwgcmVhZGVyIHRoYXQgc3VwcG9ydHMgY3ljbGljIFdTREwgaW1wb3J0cywgc2NoZW1hIGltcG9ydHMgYW5kIGlubGluZSBzY2hlbWFzLgotICogVGhpcyByZWFkZXIgaXMgYmFzZWQgb24gdGhlIFdTRExSZWFkZXJJbXBsIGZyb20gV1NETDRKLiAKLSAqLwotcHVibGljIGNsYXNzIFdTRExSZWFkZXJJbXBsCi17Ci0gIHByb3RlY3RlZCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3I7Ci0gIHByb3RlY3RlZCBJV1NETDExVmFsaWRhdGlvbkluZm8gd3NkbHZhbGluZm87Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbHZhbGluZm8gVGhlIFdTREwgMS4xIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIFdTRExSZWFkZXJJbXBsKElXU0RMMTFWYWxpZGF0aW9uSW5mbyB3c2RsdmFsaW5mbykKLSAgewotICAgIHRoaXMud3NkbHZhbGluZm8gPSB3c2RsdmFsaW5mbzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSByb290IGRvY3VtZW50LiBUaGlzIG1ldGhvZCB3aWxsIGZpbmQgYWxsIGltcG9ydHMgYW5kIHBhcnNlIHRoZW0gYXMgCi0gICAqIHdlbGwgY3JlYXRpbmcgYSBXU0RMRG9jdW1lbnQgZm9yIGVhY2ggdW5pcXVlIFdTREwgZmlsZS4gVGhpcyBtZXRob2Qgc3VwcG9ydHMKLSAgICogY3ljbGljIFdTREwgaW1wb3J0IHN0YXRlbWVudHMgc3VjaCB0aGF0IGZpbGUgQSBjYW4gaW1wb3J0IGZpbGUgQiBhbmQgZmlsZSBCCi0gICAqIGNhbiBpbXBvcnQgZmlsZSBBLgotICAgKiAKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSBUaGUgYmFzZSBVUkkgb2YgdGhlIHJvb3QgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBkZWZFbCBUaGUgZGVmaW5pdGlvbiBlbGVtZW50IG9mIHRoZSByb290IGRvY3VtZW50LgotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdTRExEb2N1bWVudHMgY29udGFpbmluZyBhbGwgb2YgdGhlIHVuaXF1ZSBmaWxlcyBpbiB0aGUgZGVzY3JpcHRpb24uCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExEb2N1bWVudFtdIHBhcnNlRG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50QmFzZVVSSSwgRWxlbWVudCBkZWZFbCkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIGludCBpbml0aWFsSW1wb3J0QXJyYXlTaXplID0gMjA7Ci0gICAgTGlzdFtdIGZpbGVzQXREZXB0aCA9IG5ldyBBcnJheUxpc3RbaW5pdGlhbEltcG9ydEFycmF5U2l6ZV07Ci0gICAgTWFwIGZpbGVzSW1wb3J0aW5nID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIFNvcnRlZFNldCBwYXJzZWRJbXBvcnRzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBTb3J0ZWRTZXQgaW1wb3J0c1RvUGFyc2UgPSBuZXcgVHJlZVNldCgpOwotICAgIGludCBtYXhkZXB0aCA9IDA7Ci0KLSAgICBXU0RMRG9jdW1lbnQgcm9vdGRvYyA9IG5ldyBXU0RMRG9jdW1lbnQoZG9jdW1lbnRCYXNlVVJJLCBkZWZFbCwgMCwgbWVzc2FnZWdlbmVyYXRvciwgd3NkbHZhbGluZm8pOwotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSByb290ZG9jLmdldERlZmluaXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBJbXBvcnRIb2xkZXIgcm9vdEltcG9ydCA9IG5ldyBJbXBvcnRIb2xkZXIodGFyZ2V0TmFtZXNwYWNlLCBkb2N1bWVudEJhc2VVUkksIGRvY3VtZW50QmFzZVVSSSwgcm9vdGRvYywgMCwgbnVsbCwgbWVzc2FnZWdlbmVyYXRvciwgd3NkbHZhbGluZm8pOwotICAgIHJvb3RJbXBvcnQuY3JlYXRlV1NETEltcG9ydChyb290ZG9jKTsKLSAgICBwYXJzZWRJbXBvcnRzLmFkZChyb290SW1wb3J0KTsKLSAgICBMaXN0IHJvb3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZpbGVzSW1wb3J0aW5nLnB1dChyb290SW1wb3J0LmdldExvY2F0aW9uKCksIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgcm9vdExpc3QuYWRkKHJvb3Rkb2MpOwotICAgIGZpbGVzQXREZXB0aFswXSA9IHJvb3RMaXN0OwotICAgIGltcG9ydHNUb1BhcnNlLmFkZEFsbChyb290ZG9jLmdldEltcG9ydHMoKSk7Ci0gICAgU2V0IGltcHMgPSByb290ZG9jLmdldEltcG9ydHMoKTsKLSAgICBJdGVyYXRvciBpbXBJdGVyID0gaW1wcy5pdGVyYXRvcigpOwotICAgIHdoaWxlKGltcEl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEltcG9ydEhvbGRlciBpbXAgPSAoSW1wb3J0SG9sZGVyKWltcEl0ZXIubmV4dCgpOwotICAgICAgTGlzdCB0ZW1wTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHRlbXBMaXN0LmFkZChpbXAuZ2V0SW1wb3J0aW5nRG9jdW1lbnQoKSk7Ci0gICAgICBmaWxlc0ltcG9ydGluZy5wdXQoaW1wLmdldExvY2F0aW9uKCksIHRlbXBMaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgd2hpbGUoIWltcG9ydHNUb1BhcnNlLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBJbXBvcnRIb2xkZXIgaW1wID0gKEltcG9ydEhvbGRlcilpbXBvcnRzVG9QYXJzZS5maXJzdCgpOwotICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gaW5pdGlhbGl6ZSB0aGUgaW1wb3J0IGhlcmUgc28gZWFjaCBpbXBvcnQKLSAgICAgIC8vIGlzIG9ubHkgY3JlYXRlZCBvbmNlLiBJbiB0aGUgY2FzZSBvZiByZWNpcHJpY2FsIGltcG9ydHMgdGhpcwotICAgICAgLy8gYXZvaWRzIGFuIGluZmluaXRlIGxvb3AuCi0gICAgICBpbXAuaW5pdGlhbGl6ZSgpOwotICAgICAgV1NETERvY3VtZW50IGltcERvYyA9IGltcC5nZXRXU0RMRG9jdW1lbnQoKTsKLSAgICAgIAotICAgICAgaW1wb3J0c1RvUGFyc2UucmVtb3ZlKGltcCk7Ci0gICAgICAKLSAgICAgIHBhcnNlZEltcG9ydHMuYWRkKGltcCk7Ci0gICAgICAKLSAgICAgIC8vIEFkZCBuZXcgaW1wb3J0cyB0byB0aGUgbGlzdCBvZiBpbXBvcnRzIHRvIHBhcnNlLgotICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgaW1wb3J0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZC4KLSAgICAgIGlmKGltcERvYyAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBJbmNyZWF0ZSBpbXBvcnQgYXJyYXkgaWYgbmVjZXNzYXJ5LgotICAgICAgICBpZihpbXAuZ2V0RGVwdGgoKSA+PSBpbml0aWFsSW1wb3J0QXJyYXlTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdFtdIHRlbXBBcnJheSA9IG5ldyBMaXN0W2ZpbGVzQXREZXB0aC5sZW5ndGggKyBpbml0aWFsSW1wb3J0QXJyYXlTaXplXTsKLSAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZpbGVzQXREZXB0aCwgMCwgdGVtcEFycmF5LCAwLCBmaWxlc0F0RGVwdGgubGVuZ3RoKTsKLSAgICAgICAgICBmaWxlc0F0RGVwdGggPSB0ZW1wQXJyYXk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBsaXN0IGZvciB0aGUgZGVwdGggaWYgbmVjZXNzYXJ5LgotICAgICAgICBpbnQgaW1wRGVwdGggPSBpbXAuZ2V0RGVwdGgoKTsKLSAgICAgICAgaWYoZmlsZXNBdERlcHRoW2ltcERlcHRoXSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYobWF4ZGVwdGggPCBpbXBEZXB0aCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhkZXB0aCA9IGltcERlcHRoOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaWxlc0F0RGVwdGhbaW1wRGVwdGhdID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbGVzQXREZXB0aFtpbXAuZ2V0RGVwdGgoKV0uYWRkKGltcERvYyk7Ci0gICAgICAgIAotICAgICAgICBTZXQgaW1wb3J0cyA9IGltcERvYy5nZXRJbXBvcnRzKCk7Ci0gICAgICAgIEltcG9ydEhvbGRlcltdIGltcG9ydHNBcnJheSA9IChJbXBvcnRIb2xkZXJbXSlpbXBvcnRzLnRvQXJyYXkobmV3IEltcG9ydEhvbGRlcltpbXBvcnRzLnNpemUoKV0pOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgaW1wb3J0c0FycmF5Lmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgSW1wb3J0SG9sZGVyIGloID0gaW1wb3J0c0FycmF5W2ldOwotICAgICAgICAgIC8vIElmIGFscmVhZHkgcGFyc2VkLCBhZGQgdGhlIGRlZmluaXRpb24gaW1wb3J0aW5nIHRoaXMgZmlsZSB0byB0aGUgbGlzdC4KLSAgICAgICAgICBpZihmaWxlc0ltcG9ydGluZy5jb250YWluc0tleShpaC5nZXRMb2NhdGlvbigpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAoKExpc3QpZmlsZXNJbXBvcnRpbmcuZ2V0KGloLmdldExvY2F0aW9uKCkpKS5hZGQoaWguZ2V0SW1wb3J0aW5nRG9jdW1lbnQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIE90aGVyd2lzZSBhZGQgaXQgdG8gdGhlIGxpc3QgdG8gcGFyc2UuCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFkZCB0aGlzIGltcG9ydCB0byB0aGUgbGlzdCBvZiBmaWxlcyBpbXBvcnRpbmcgbGlzdC4KLSAgICAgICAgICAgIExpc3QgdGVtcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB0ZW1wTGlzdC5hZGQoaWguZ2V0SW1wb3J0aW5nRG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICBmaWxlc0ltcG9ydGluZy5wdXQoaWguZ2V0TG9jYXRpb24oKSwgdGVtcExpc3QpOwotICAgICAgICAgICAgaW1wb3J0c1RvUGFyc2UuYWRkKGloKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gQWRkIGFsbCBvZiB0aGUgaW1wb3J0cyB0byB0aGUgcmVzcGVjdGl2ZSBkb2N1bWVudHMuCi0gICAgSXRlcmF0b3IgaW1wb3J0RWxlbWVudHNJdGVyID0gcGFyc2VkSW1wb3J0cy5pdGVyYXRvcigpOwotICAgIHdoaWxlKGltcG9ydEVsZW1lbnRzSXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSW1wb3J0SG9sZGVyIGltcCA9IChJbXBvcnRIb2xkZXIpaW1wb3J0RWxlbWVudHNJdGVyLm5leHQoKTsKLSAgICAgIExpc3QgZmlsZXMgPSAoTGlzdClmaWxlc0ltcG9ydGluZy5nZXQoaW1wLmdldExvY2F0aW9uKCkpOwotICAgICAgSXRlcmF0b3IgZmlsZXNJdGVyID0gZmlsZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKGZpbGVzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWZpbGVzSXRlci5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBEZWZpbml0aW9uSW1wbCBkZWYgPSAoRGVmaW5pdGlvbkltcGwpZG9jLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgSW1wb3J0IGltcEVsZW0gPSBpbXAuZ2V0SW1wb3J0KCk7Ci0gICAgICAgIGlmKGltcEVsZW0gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGRlZi5hZGRJbXBvcnQoaW1wRWxlbSk7Ci0gICAgICAgICAgaWYoIWltcC5pc1dTRExGaWxlSW1wb3J0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZG9jLmFkZFNjaGVtYXMoaW1wLmdldFNjaGVtYXMoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBQYXJzZSB0aGUgV1NETCBkb2N1bWVudHMuCi0gICAgLy8gUGFyc2UgdGhlIE1lc3NhZ2VzLgotICAgIGZvcihpbnQgaSA9IG1heGRlcHRoOyBpID49MDsgaS0tKQotICAgIHsKLSAgICAgIExpc3QgZG9jcyA9IGZpbGVzQXREZXB0aFtpXTsKLSAgICAgIEl0ZXJhdG9yIGRvY3NJdGVyID0gZG9jcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUoZG9jc0l0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBXU0RMRG9jdW1lbnQgZG9jID0gKFdTRExEb2N1bWVudClkb2NzSXRlci5uZXh0KCk7Ci0gICAgICAgIGRvYy5wYXJzZU1lc3NhZ2VzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFBhcnNlIHRoZSBQb3J0dHlwZXMuCi0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgZG9jLnBhcnNlUG9ydHR5cGVzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFBhcnNlIHRoZSBCaW5kaW5ncy4KLSAgICBmb3IoaW50IGkgPSBtYXhkZXB0aDsgaSA+PTA7IGktLSkKLSAgICB7Ci0gICAgICBMaXN0IGRvY3MgPSBmaWxlc0F0RGVwdGhbaV07Ci0gICAgICBJdGVyYXRvciBkb2NzSXRlciA9IGRvY3MuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKGRvY3NJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgV1NETERvY3VtZW50IGRvYyA9IChXU0RMRG9jdW1lbnQpZG9jc0l0ZXIubmV4dCgpOwotICAgICAgICBkb2MucGFyc2VCaW5kaW5ncygpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBQYXJzZSB0aGUgU2VydmljZXMuCi0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgZG9jLnBhcnNlU2VydmljZXMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUGFyc2UgdGhlIEV4dGVuc2liaWxpdHkgRWxlbWVudHMuCi0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgZG9jLnBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIExpc3Qgd3NkbERvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgd3NkbERvY3MuYWRkKGRvYyk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiAoV1NETERvY3VtZW50W10pd3NkbERvY3MudG9BcnJheShuZXcgV1NETERvY3VtZW50W3dzZGxEb2NzLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGlucHV0U291cmNlIFRoZSBzb3VyY2Ugb2YgdGhlIGRvY3VtZW50IGJlaW5nIHJldHJpZXZlZC4KLSAgICogQHBhcmFtIGRlc2MgVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkb2N1bWVudCBiZWluZyByZXRyaWV2ZWQuCi0gICAqIEByZXR1cm4gVGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBnZXREb2N1bWVudChJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSwgU3RyaW5nIGRlc2MpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24oKQotICAgICAgewotICAgICAgICBwcm90ZWN0ZWQgWE1MRXJyb3JSZXBvcnRlciBjcmVhdGVFcnJvclJlcG9ydGVyKCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWE1MRXJyb3JSZXBvcnRlcigpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJndW1lbnRzLCBzaG9ydCBzZXZlcml0eSkgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBib29sZWFuIHJlcG9ydEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoIlByZW1hdHVyZUVPRiIpKQotICAgICAgICAgICAgICAgeyAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucmVwb3J0RXJyb3IoZG9tYWluLCBrZXksIGFyZ3VtZW50cywgc2V2ZXJpdHkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIAotICAgICAgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKQotICAgICAgewotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAgICAgICAqLwotICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgICAgICAgIH0KLSAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgICAgICAgIH0KLSAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgICAgICAgIH0KLSAgICAgIH07Ci0KLSAgICAgIERPTVBhcnNlciBidWlsZGVyID0gbmV3IExpbmVOdW1iZXJET01QYXJzZXIoY29uZmlndXJhdGlvbik7Ci0gICAgICBidWlsZGVyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotICAgICAgYnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLmdldERvY3VtZW50KCk7Ci0KLSAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLlBBUlNFUl9FUlJPUiwgIlByb2JsZW0gcGFyc2luZyAnIiArIGRlc2MgKyAiJy4iLCB0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIFdTREwgZG9jdW1lbnQgdXNpbmcgYSBjb250ZXh0IFVSSSBhbmQgZmlsZSBVUkkuCi0gICAqIAotICAgKiBAcGFyYW0gY29udGV4dFVSSSBUaGUgY29udGV4dCBVUkkgdG8gdXNlLgotICAgKiBAcGFyYW0gd3NkbFVSSSBUaGUgV1NETCBVUkkgdG8gdXNlLgotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdTRExEb2N1bWVudHMuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudFtdIHJlYWRXU0RMKFN0cmluZyBjb250ZXh0VVJJLCBTdHJpbmcgd3NkbFVSSSkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCBjb250ZXh0VVJMID0gKGNvbnRleHRVUkkgIT0gbnVsbCkgPyBTdHJpbmdVdGlscy5nZXRVUkwobnVsbCwgY29udGV4dFVSSSkgOiBudWxsOwotICAgICAgVVJMIHVybCA9IFN0cmluZ1V0aWxzLmdldFVSTChjb250ZXh0VVJMLCB3c2RsVVJJKTsKLSAgICAgIFJlYWRlciByZWFkZXIgPSBTdHJpbmdVdGlscy5nZXRDb250ZW50QXNSZWFkZXIodXJsKTsKLSAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChpbnB1dFNvdXJjZSwgd3NkbFVSSSk7Ci0gICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgIFdTRExEb2N1bWVudFtdIHdzZGxEb2NzID0gbnVsbDsKLSAgICAgIC8vIG9ubHkgcGFyc2UgdGhlIGRvY3VtZW50IGlmIGl0IGlzbid0IGVtcHR5Ci0gICAgICBpZihkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkKLSAgICAgICB7ICAgICAgCi0gICAgICAgIHdzZGxEb2NzID0gcmVhZFdTREwodXJsLnRvU3RyaW5nKCksIGRvYyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gd3NkbERvY3M7Ci0gICAgfQotICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKAotICAgICAgICBXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLAotICAgICAgICAiVW5hYmxlIHRvIHJlc29sdmUgaW1wb3J0ZWQgZG9jdW1lbnQgYXQgJyIgKyB3c2RsVVJJICsgIicuIiwKLSAgICAgICAgdCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWVzc2FnZWdlbmVyYXRvciBmb3IgdGhlIHJlYWRlci4KLSAgICogCi0gICAqIEBwYXJhbSBtZyBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUdlbmVyYXRvcihNZXNzYWdlR2VuZXJhdG9yIG1nKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1nOwotICB9Ci0gIAotICAvKioKLSAgICogUmVhZCB0aGUgV1NETCBkb2N1bWVudCBhY2Nlc3NpYmxlIHZpYSB0aGUgc3BlY2lmaWVkCi0gICAqIFVSSSBpbnRvIGEgV1NETCBkZWZpbml0aW9uLgotICAgKgotICAgKiBAcGFyYW0gd3NkbFVSSSBBIFVSSSBwb2ludGluZyB0byBhIFdTREwgZmlsZS4KLSAgICogQHJldHVybiBBbiBhcnJheSBvZiBXU0RMRG9jdW1lbnRzLgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudFtdIHJlYWRXU0RMKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHJlYWRXU0RMKG51bGwsIHdzZGxVUkkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIFdTREwgZG9jdW1lbnQgZGVzY3JpYmVkIGJ5IGEgVVJJIGFuZCBpdHMgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBkb2N1bWVudEJhc2VVUkkgVGhlIFVSSSBvZiB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHBhcmFtIGRlZmluaXRpb25zRWxlbWVudCBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudCBmb3IgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV1NETERvY3VtZW50cy4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETERvY3VtZW50W10gcmVhZFdTREwoU3RyaW5nIGRvY3VtZW50QmFzZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBkZWZpbml0aW9uc0VsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBwYXJzZURvY3VtZW50KGRvY3VtZW50QmFzZVVSSSwgZGVmaW5pdGlvbnNFbGVtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBzcGVjaWZpZWQgV1NETCBkb2N1bWVudC4KLSAgICoKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSBUaGUgZG9jdW1lbnQgYmFzZSBVUkkuCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgVGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV1NETERvY3VtZW50cy4KLSAgICovCi0gIHB1YmxpYyBXU0RMRG9jdW1lbnRbXSByZWFkV1NETChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLCBEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHJldHVybiByZWFkV1NETChkb2N1bWVudEJhc2VVUkksIHdzZGxEb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0gIH0KLSAgCi0gIAotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvaHR0cC9IVFRQVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9odHRwL0hUVFBWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc4MGU0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9odHRwL0hUVFBWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuaHR0cDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvOwotCi1pbXBvcnQgY29tLmlibS53c2RsLkJpbmRpbmdJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5CaW5kaW5nSW5wdXRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5CaW5kaW5nT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuUG9ydEltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzc0ltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudEltcGw7Ci0KLS8qKgotICogVGhlIEhUVFAgdmFsaWRhdG9yIGlzIGFuIGV4dGVuc2lvbiBXU0RMIHZhbGlkYXRvciB0aGF0IHZhbGlkYXRlcyBhbGwgZWxlbWVudHMgaW4gdGhlIEhUVFAKLSAqIG5hbWVzcGFjZS4KLSAqLwotcHVibGljIGNsYXNzIEhUVFBWYWxpZGF0b3IgaW1wbGVtZW50cyBJV1NETDExVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX1BPUlRfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9QT1JUX0VMRU1FTlQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQgPSAiX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19JTlBVVF9FTEVNRU5UID0gIl9FUlJPUl9JTlZBTElEX0JJTkRJTkdfSU5QVVRfRUxFTUVOVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0hUVFBfRUxFTUVOVF9GT1JfTE9DQVRJT04gPSAiX0VSUk9SX0lOVkFMSURfSFRUUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT19MT0NBVElPTl9GT1JfQUREUkVTUyA9ICJfRVJST1JfTk9fTE9DQVRJT05fRk9SX0FERFJFU1MiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX0FERFJFU1MgPSAiX0VSUk9SX05PX0hUVFBCSU5ESU5HX0ZPUl9BRERSRVNTIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19WRVJCID0gIl9FUlJPUl9JTlZBTElEX0JJTkRJTkdfVkVSQiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0xPQ0FUSU9OX1VSSSA9ICJfRVJST1JfSU5WQUxJRF9MT0NBVElPTl9VUkkiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX09QRVJBVElPTiA9ICJfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX09QRVJBVElPTiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT1RfT05MWV9FTEVNRU5UX0RFRklORUQgPSAiX0VSUk9SX05PVF9PTkxZX0VMRU1FTlRfREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT19IVFRQT1BFUkFUSU9OX0ZPUl9VUkwgPSAiX0VSUk9SX05PX0hUVFBPUEVSQVRJT05fRk9SX1VSTCI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VUID0gIkdFVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFBPU1QgPSAiUE9TVCI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUVVPVEUgPSAiJyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOwotCi0gIHByaXZhdGUgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0b3IjdmFsaWRhdGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkxpc3QsIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgLy8gUG9ydCBIVFRQIGRlZmluaXRpb24KLSAgICAvLyBtYWtlIHN1cmUgZXZlcnkgcG9ydCBoYXMgb25seSBvbmUgYWRkcmVzcyBlbGVtZW50IGRlZmluZWQKLSAgICAvLyBpZiBpdCBpcyBhbiBhZGRyZXNzIGVsZW1lbnQsIHZhbGlkYXRlIGl0Ci0gICAgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gUG9ydEltcGwuY2xhc3MpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBIVFRQQWRkcmVzc0ltcGwuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlQWRkcmVzcyhlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX1BPUlRfRUxFTUVOVCwgUVVPVEUgKyBlLmdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksCi0gICAgICAgICAgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQmluZGluZyBIVFRQIGRlZmluaXRpb24KLSAgICAvLyBBIEhUVFAgQmluZGluZyBtdXN0IGhhdmUgYSB2ZXJiIG9mIEdFVCBvciBQT1NUCi0gICAgZWxzZSBpZiAocGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBCaW5kaW5nSW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IEhUVFBCaW5kaW5nSW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVCaW5kaW5nKGVsZW1lbnQsIHBhcmVudHMsIHZhbEluZm8pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWVsZW1lbnQ7Ci0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5ULCBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwKLSAgICAgICAgICBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gQmluZGluZyBPcGVyYXRpb24gSFRUUCBkZWZpbml0aW9uCi0gICAgLy8gQSBIVFRQIE9wZXJhdGlvbiBoYXMgYSBsb2NhdGlvbiB1cmkgZGVmaW5lZAotICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ09wZXJhdGlvbkltcGwuY2xhc3MpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBIVFRQT3BlcmF0aW9uSW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVPcGVyYXRpb24oZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICAgIF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0VMRU1FTlQsCi0gICAgICAgICAgICBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwKLSAgICAgICAgICBlbGVtZW50KTsKLSAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnRzLmdldCgwKS5nZXRDbGFzcygpID09IEJpbmRpbmdJbnB1dEltcGwuY2xhc3MpCi0gICAgewotICAgICAgLy8gdmFsaWRhdGUgdGhlIEhUVFAgdXJsRW5jb2RlZCBhbmQgdXJsUmVwbGFjZW1lbnQKLSAgICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gSFRUUFVybEVuY29kZWRJbXBsLmNsYXNzIHx8IGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBIVFRQVXJsUmVwbGFjZW1lbnRJbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUh0dHBVcmwoZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CSU5ESU5HX0lOUFVUX0VMRU1FTlQsIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLAotICAgICAgICAgIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIGluIHRoaXMgY2FzZSB0aGVyZSBoYXMgYmVlbiBhIEhUVFAgZWxlbWVudCBkZWZpbmVkIHRoYXQgaXMgbm90IGRlZmluZWQgZm9yIHRoaXMgcG9pbnQgaW4gdGhlIEhUVFAgbmFtZXNwYWNlCi0gICAgZWxzZQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgIF9FUlJPUl9JTlZBTElEX0hUVFBfRUxFTUVOVF9GT1JfTE9DQVRJT04sCi0gICAgICAgICAgUVVPVEUgKyBlLmdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksCi0gICAgICAgIGVsZW1lbnQpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEudmFsaWRhdG9yLklXU0RMMTFWYWxpZGF0b3Ijc2V0UmVzb3VyY2VCdW5kbGUoamF2YS51dGlsLlJlc291cmNlQnVuZGxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICBpZiAobWVzc2FnZWdlbmVyYXRvciA9PSBudWxsKQotICAgIHsKLSAgICAgIG1lc3NhZ2VnZW5lcmF0b3IgPSBuZXcgTWVzc2FnZUdlbmVyYXRvcihyYik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IHRoZSBIVFRQIGFkZHJlc3MgaGFzIGEgdmFsdWUgc3BlY2lmaWVkIGZvciBpdCdzIHVyaSBhbmQgdGhhdCB0aGVyZSBpcyBhIEhUVFAgQmluZGluZyBkZWZpbmVkCi0gICAqIGZvciB0aGUgQmluZGluZyBzcGVjaWZpZWQgaW4gdGhlIHBvcnQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRUUCBhZGRyZXNzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIEhUVFAgYWRkcmVzcyBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaW4gY2hhcmdlIG9mIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFkZHJlc3MoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBIVFRQQWRkcmVzc0ltcGwgaGEgPSAoSFRUUEFkZHJlc3NJbXBsKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgdXJpID0gaGEuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICBpZiAodXJpID09IG51bGwgfHwgdXJpLmVxdWFsc0lnbm9yZUNhc2UoRU1QVFlfU1RSSU5HKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9OT19MT0NBVElPTl9GT1JfQUREUkVTUyksIGhhKTsKLSAgICB9Ci0KLSAgICBQb3J0IHBvcnQgPSAoUG9ydClwYXJlbnRzLmdldCgwKTsKLQotICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpOwotCi0gICAgaWYgKCFoYXNIdHRwQmluZGluZyhiaW5kaW5nKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICBfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX0FERFJFU1MsCi0gICAgICAgICAgUVVPVEUgKyBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSwKLSAgICAgICAgICBRVU9URSArIHBvcnQuZ2V0TmFtZSgpICsgUVVPVEUpLAotICAgICAgICBoYSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGUgSFRUUCBCaW5kaW5nIGRlZmluZWQgaXMgdmFsaWQuIEEgSFRUUCBCaW5kaW5nIG11c3QgaGF2ZSBhIHZlcmIgb2YgR0VUIG9yIFBPU1QuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRUUCBiaW5kaW5nIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIEhUVFAgYmluZGluZyBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaW4gY2hhcmdlIG9mIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUJpbmRpbmcoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBIVFRQQmluZGluZ0ltcGwgaGIgPSAoSFRUUEJpbmRpbmdJbXBsKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgdmVyYiA9IGhiLmdldFZlcmIoKTsKLQotICAgIGlmICh2ZXJiICE9IG51bGwgJiYgIXZlcmIuZXF1YWxzKEdFVCkgJiYgIXZlcmIuZXF1YWxzKFBPU1QpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfQklORElOR19WRVJCLCBRVU9URSArIHZlcmIgKyBRVU9URSksIGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBbiBvcGVyYXRpb24gbXVzdCBoYXZlIGEgbG9jYXRpb24gZGVmaW5lZC4gQSBIVFRQIEJpbmRpbmcgbXVzdCBiZSBzcGVjaWZpZWQgdG8gdXNlIGFuIG9wZXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVFRQIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBUaGUgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBIVFRQIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaW4gY2hhcmdlIG9mIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU9wZXJhdGlvbihPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIEhUVFBPcGVyYXRpb24gaG8gPSAoSFRUUE9wZXJhdGlvbillbGVtZW50OwotCi0gICAgU3RyaW5nIGxvY2F0aW9uVVJJID0gaG8uZ2V0TG9jYXRpb25VUkkoKTsKLQotICAgIGlmIChsb2NhdGlvblVSSSAhPSBudWxsICYmIGxvY2F0aW9uVVJJLmVxdWFsc0lnbm9yZUNhc2UoRU1QVFlfU1RSSU5HKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0xPQ0FUSU9OX1VSSSksIGVsZW1lbnQpOwotICAgIH0KLQotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKXBhcmVudHMuZ2V0KDEpOwotICAgIGlmICghaGFzSHR0cEJpbmRpbmcoYmluZGluZykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PX0hUVFBCSU5ESU5HX0ZPUl9PUEVSQVRJT04sIFFVT1RFICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLAotICAgICAgICBobyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBIVFRQIHVybFJlcGxhY2VtZW50IG9yIHVybEVuY29kZWQuIEVuc3VyZSB0aGUgSFRUUCBvcGVyYXRpb24gaGFzIGJlZW4gZGVmaW5lZC4gCi0gICAqIEVuc3VyZSB0aGF0IGVpdGhlciBlbGVtZW50IGlzIHRoZSBvbmx5IGVsZW1lbnQgc3BlY2lmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUVFAgYmluZGluZyBvcGVyYXRpb24gZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgVGhlIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgSFRUUCBiaW5kaW5nIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaW4gY2hhcmdlIG9mIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUh0dHBVcmwoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKXBhcmVudHMuZ2V0KDEpOwotCi0gICAgU3RyaW5nIGVsZW1lbnROYW1lOwotICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gSFRUUFVybEVuY29kZWRJbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIGVsZW1lbnROYW1lID0gInVybEVuY29kZWQiOwotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gSFRUUFVybFJlcGxhY2VtZW50SW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBlbGVtZW50TmFtZSA9ICJ1cmxSZXBsYWNlbWVudCI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlbGVtZW50TmFtZSA9IEVNUFRZX1NUUklORzsKLSAgICB9Ci0KLSAgICBCaW5kaW5nSW5wdXQgaW5wdXQgPSAoQmluZGluZ0lucHV0KXBhcmVudHMuZ2V0KDApOwotICAgIGlmIChpbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5zaXplKCkgIT0gMSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9OT1RfT05MWV9FTEVNRU5UX0RFRklORUQsIGVsZW1lbnROYW1lKSwgZWxlbWVudCk7Ci0gICAgfQotCi0gICAgaWYgKCFoYXNIdHRwT3BlcmF0aW9uKG9wZXJhdGlvbikpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PX0hUVFBPUEVSQVRJT05fRk9SX1VSTCwgUVVPVEUgKyBvcGVyYXRpb24uZ2V0TmFtZSgpICsgUVVPVEUsIGVsZW1lbnROYW1lKSwKLSAgICAgICAgZWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgQmluZGluZ09wZXJhdGlvbiB0ZWxscyB3aGV0aGVyIGl0IGhhcyBhIEhUVFAgb3BlcmF0aW9uIGRlZmluZWQgZm9yIGl0LgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmcgVGhlIEhUVFAgYmluZGluZyBvcGVyYXRpb24gZWxlbWVudC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGFuIEhUVFAgb3BlcmF0aW9uIGRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGhhc0h0dHBPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBleHRlbGVtcyA9IG9wZXJhdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGlmIChleHRlbGVtcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpZXh0ZWxlbXMgPSBleHRlbGVtcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaWV4dGVsZW1zLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpZXh0ZWxlbXMubmV4dCgpLmdldENsYXNzKCkgPT0gSFRUUE9wZXJhdGlvbkltcGwuY2xhc3MpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhIGJpbmRpbmcgcmV0dXJucyB0cnVlIGlmIGl0IGhhcyBhIEhUVFAgYmluZGluZyBkZWZpbmVkLgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmcgVGhlIGJpbmRpbmcgdG8gY2hlY2suCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhbiBIVFRQIGJpbmRpbmcgZGVmaW5lZC4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGhhc0h0dHBCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBleHRlbGVtcyA9IGJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBpZiAoZXh0ZWxlbXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaWV4dGVsZW1zID0gZXh0ZWxlbXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGlleHRlbGVtcy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaWV4dGVsZW1zLm5leHQoKS5nZXRDbGFzcygpID09IEhUVFBCaW5kaW5nSW1wbC5jbGFzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9taW1lL01JTUVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL21pbWUvTUlNRVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGZjZWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL21pbWUvTUlNRVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLm1pbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbzsKLQotLyoqCi0gKiBUaGUgTUlNRSB2YWxpZGF0b3IgcGx1Z3MgaW50byB0aGUgV1NETCB2YWxpZGF0b3IgdG8gcHJvdmlkZQotICogdmFsaWRhdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGluIGEgV1NETCBkb2N1bWVudCB3aXRoaW4gdGhlIE1JTUUgbmFtZXNwYWNlLgotICovCi1wdWJsaWMgY2xhc3MgTUlNRVZhbGlkYXRvciBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnZhbGlkYXRvci5JV1NETDExVmFsaWRhdG9yI3NldFJlc291cmNlQnVuZGxlKGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgaWYgKG1lc3NhZ2VnZW5lcmF0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvc29hcC9TT0FQVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9zb2FwL1NPQVBWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNhOTU0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9zb2FwL1NPQVBWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuc29hcDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbzsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5CaW5kaW5nRmF1bHRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5CaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuQmluZGluZ0lucHV0SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuQmluZGluZ09wZXJhdGlvbkltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLkJpbmRpbmdPdXRwdXRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5Qb3J0SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdEltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uSW1wbDsKLQotLyoqCi0gKiBUaGUgU09BUCB2YWxpZGF0b3IgcGx1Z3MgaW50byB0aGUgV1NETCB2YWxpZGF0b3IgdG8gcHJvdmlkZQotICogdmFsaWRhdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGluIGEgV1NETCBkb2N1bWVudCB3aXRoaW4gdGhlIFNPQVAgbmFtZXNwYWNlLgotICoKLSAqLwotcHVibGljIGNsYXNzIFNPQVBWYWxpZGF0b3IgaW1wbGVtZW50cyBJV1NETDExVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX1BPUlRfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9QT1JUX0VMRU1FTlQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQgPSAiX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfSEVBREVSX0JPRFlfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9IRUFERVJfQk9EWV9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfRkFVTFRfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9GQVVMVF9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfU09BUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiA9ICJfRVJST1JfSU5WQUxJRF9TT0FQX0VMRU1FTlRfRk9SX0xPQ0FUSU9OIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX0xPQ0FUSU9OX0ZPUl9BRERSRVNTID0gIl9FUlJPUl9OT19MT0NBVElPTl9GT1JfQUREUkVTUyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT19TT0FQQklORElOR19GT1JfQUREUkVTUyA9ICJfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX0FERFJFU1MiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1NUWUxFID0gIl9FUlJPUl9JTlZBTElEX0JJTkRJTkdfU1RZTEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1VSSSA9ICJfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1VSSSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX09QRVJBVElPTl9TVFlMRSA9ICJfRVJST1JfSU5WQUxJRF9PUEVSQVRJT05fU1RZTEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX09QRVJBVElPTiA9ICJfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX09QRVJBVElPTiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0JPRFlfRU5DT0RJTkdfU1RZTEUgPSAiX0VSUk9SX0lOVkFMSURfQk9EWV9FTkNPRElOR19TVFlMRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0JPRFlfTkFNRVNQQUNFX0ZPUl9FTkNPREVEID0gIl9FUlJPUl9JTlZBTElEX0JPRFlfTkFNRVNQQUNFX0ZPUl9FTkNPREVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQk9EWV9VU0UgPSAiX0VSUk9SX0lOVkFMSURfQk9EWV9VU0UiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfTk9UX1RZUEUgPSAiX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX05PVF9UWVBFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX1VOREVGSU5FRCA9ICJfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9CT0RZID0gIl9FUlJPUl9OT19TT0FQQklORElOR19GT1JfQk9EWSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJfTUVTU0FHRV9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUl9NRVNTQUdFX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJfUEFSVF9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUl9QQVJUX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJfVVNFX1VOREVGSU5FRCA9ICJfRVJST1JfSEVBREVSX1VTRV9VTkRFRklORUQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSEVBREVSX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJfRU5DT0RJTkdTVFlMRV9VTkRFRklORUQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSEVBREVSX05BTUVTUEFDRV9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUl9OQU1FU1BBQ0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9IRUFERVIgPSAiX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9IRUFERVIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSEVBREVSRkFVTFRfTUVTU0FHRV9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUkZBVUxUX01FU1NBR0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0hFQURFUkZBVUxUX1BBUlRfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9QQVJUX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJGQVVMVF9VU0VfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9VU0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0hFQURFUkZBVUxUX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9FTkNPRElOR1NUWUxFX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJGQVVMVF9OQU1FU1BBQ0VfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9OQU1FU1BBQ0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfRkFVTFRfTkFNRSA9ICJfRVJST1JfSU5WQUxJRF9GQVVMVF9OQU1FIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfRkFVTFRfRU5DT0RJTkdfU1RZTEUgPSAiX0VSUk9SX0lOVkFMSURfRkFVTFRfRU5DT0RJTkdfU1RZTEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9GQVVMVF9OQU1FU1BBQ0VfRk9SX0VOQ09ERUQgPSAiX0VSUk9SX0lOVkFMSURfRkFVTFRfTkFNRVNQQUNFX0ZPUl9FTkNPREVEIjsKLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVOQ09ERUQgPSAiZW5jb2RlZCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIExJVEVSQUwgPSAibGl0ZXJhbCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFJQQyA9ICJycGMiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBET0NVTUVOVCA9ICJkb2N1bWVudCI7Ci0gIAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBRVU9URSA9ICInIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7Ci0KLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLSAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvciN2YWxpZGF0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuTGlzdCwgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICAvLyBQb3J0IFNPQVAgZGVmaW5pdGlvbgotICAgIC8vIG1ha2Ugc3VyZSBldmVyeSBwb3J0IGhhcyBvbmx5IG9uZSBhZGRyZXNzIGVsZW1lbnQgZGVmaW5lZAotICAgIC8vIGlmIGl0IGlzIGFuIGFkZHJlc3MgZWxlbWVudCwgdmFsaWRhdGUgaXQKLSAgICBpZiAocGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBQb3J0SW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IFNPQVBBZGRyZXNzSW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVBZGRyZXNzKGVsZW1lbnQsIHBhcmVudHMsIHZhbEluZm8pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWVsZW1lbnQ7Ci0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfUE9SVF9FTEVNRU5ULCBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQmluZGluZyBTT0FQIGRlZmluaXRpb24KLSAgICAvLyBBIFNPQVAgQmluZGluZyBtdXN0IGhhdmUgYSBzdHlsZSBvciBycGMgb3IgZG9jdW1lbnQgb3Igbm8gc3R5bGUgZGVmaW5lZCAtIGRlZmF1bHRzIHRvIGRvY3VtZW50Ci0gICAgLy8gTXVzdCBoYXZlIGEgdHJhbnNwb3J0IHVyaSBkZWZpbmVkIC0gY2hlY2sgaWYgdGhlIHVyaSBpcyBlbXB0eQotICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ0ltcGwuY2xhc3MpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBTT0FQQmluZGluZ0ltcGwuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlQmluZGluZyhlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfRUxFTUVOVCwgUVVPVEUgKyBlLmdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBCaW5kaW5nIE9wZXJhdGlvbiBTT0FQIGRlZmluaXRpb24KLSAgICAvLyBBIFNPQVAgT3BlcmF0aW9uIG1heSBoYXZlIGEgc3R5bGUgZGVmaW5lZCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgZG9jdW1lbnQgb3IgcnBjCi0gICAgLy8gYW5kIG1heSBoYXZlIGEgc29hcEFjdGlvbiB1cmkgZGVmaW5lZAotICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ09wZXJhdGlvbkltcGwuY2xhc3MpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBTT0FQT3BlcmF0aW9uSW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVPcGVyYXRpb24oZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCwKLSAgICAgICAgICAgIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBlbGVtZW50KTsKLSAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlIGlmICgKLSAgICAgIHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ0lucHV0SW1wbC5jbGFzcyB8fCBwYXJlbnRzLmdldCgwKS5nZXRDbGFzcygpID09IEJpbmRpbmdPdXRwdXRJbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIC8vIHZhbGlkYXRlIHRoZSBTT0FQIGJvZHkKLSAgICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gU09BUEJvZHlJbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUJvZHkoZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICAvLyB2YWxpYXRlIHRoZSBTT0FQIGhlYWRlcgotICAgICAgZWxzZSBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IFNPQVBIZWFkZXJJbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUhlYWRlcihlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0hFQURFUl9CT0RZX0VMRU1FTlQsIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBCaW5kaW5nRmF1bHRJbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gU09BUEZhdWx0SW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVGYXVsdChlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0ZBVUxUX0VMRU1FTlQsIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gaW4gdGhpcyBjYXNlIHRoZXJlIGhhcyBiZWVuIGEgU09BUCBlbGVtZW50IGRlZmluZWQgdGhhdCBpcyBub3QgZGVmaW5lZCBmb3IgdGhpcyBwb2ludCBpbiB0aGUgU09BUCBuYW1lc3BhY2UKLSAgICBlbHNlCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgX0VSUk9SX0lOVkFMSURfU09BUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiwKLSAgICAgICAgICBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgZWxlbWVudCk7Ci0gICAgfQotCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnZhbGlkYXRvci5JV1NETDExVmFsaWRhdG9yI3NldFJlc291cmNlQnVuZGxlKGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgaWYgKG1lc3NhZ2VnZW5lcmF0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhhdCB0aGUgU09BUCBhZGRyZXNzIGhhcyBhIHZhbHVlIHNwZWNpZmllZCBmb3IgaXQncyB1cmkgYW5kIHRoYXQgdGhlIGJpbmRpbmcgaGFzIGEgU09BUAotICAgKiBCaW5kaW5nIGRlZmluZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgU09BUCBhZGRyZXNzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnRzIEEgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBTT0FQIGFkZHJlc3MgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhpcyB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBZGRyZXNzKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgU09BUEFkZHJlc3NJbXBsIHNhID0gKFNPQVBBZGRyZXNzSW1wbCllbGVtZW50OwotCi0gICAgU3RyaW5nIHVyaSA9IHNhLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5lcXVhbHNJZ25vcmVDYXNlKEVNUFRZX1NUUklORykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fTE9DQVRJT05fRk9SX0FERFJFU1MpLCBzYSk7Ci0gICAgfQotCi0gICAgUG9ydCBwb3J0ID0gKFBvcnQpcGFyZW50cy5nZXQoMCk7Ci0KLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLQotICAgIGlmICghaGFzU29hcEJpbmRpbmcoYmluZGluZykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9BRERSRVNTLAotICAgICAgICAgIFFVT1RFICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUsCi0gICAgICAgICAgUVVPVEUgKyBwb3J0LmdldE5hbWUoKSArIFFVT1RFKSwgc2EpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhlIFNPQVAgQmluZGluZyBkZWZpbmVkIGlzIHZhbGlkLiBBIFNPQVAgQmluZGluZyBtdXN0IGhhdmUgYSBzdHlsZSBvZiBycGMgb3IgZG9jdW1lbnQKLSAgICogb3Igbm8gc3R5bGUgZGVmaW5lZCAoZGVmYXVsdHMgdG8gZG9jdW1lbnQuKSAgQSB2YWxpZCAobm9uIGVtcHR5KSBVUkkgbXVzdCBhbHNvIGJlIHNwZWNpZmllZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBTT0FQIGJpbmRpbmcgZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgQSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIFNPQVAgYmluZGluZyBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIGZvciB0aGlzIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUJpbmRpbmcoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBTT0FQQmluZGluZ0ltcGwgc2IgPSAoU09BUEJpbmRpbmdJbXBsKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgc3R5bGUgPSBzYi5nZXRTdHlsZSgpOwotICAgIFN0cmluZyB1cmkgPSBzYi5nZXRUcmFuc3BvcnRVUkkoKTsKLQotICAgIGlmIChzdHlsZSAhPSBudWxsICYmICFzdHlsZS5lcXVhbHNJZ25vcmVDYXNlKFJQQykgJiYgIXN0eWxlLmVxdWFsc0lnbm9yZUNhc2UoRE9DVU1FTlQpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfU1RZTEUsIFFVT1RFICsgc2IuZ2V0U3R5bGUoKSArIFFVT1RFKSwgZWxlbWVudCk7Ci0gICAgfQotICAgIGlmICh1cmkuZXF1YWxzSWdub3JlQ2FzZShFTVBUWV9TVFJJTkcpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfQklORElOR19VUkkpLCBlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQW4gb3BlcmF0aW9uIG1heSBoYXZlIGEgc3R5bGUgZGVmaW5lZC4gSWYgaXQgaXMgZGVmaW5lZCBpdCBtdXN0IGJlIHJwYyBvciBkb2N1bWVudC4gSXQgbWF5IGFsc28gaGF2ZSBhCi0gICAqIHVyaSBkZWZpbmVkIHdoaWNoIG11c3QgYmUgbm9uIGVtcHR5LiAgSXQgbWF5IGhhdmUgYSBzb2FwQWN0aW9uIGRlZmluZWQgYXMgd2VsbC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBTT0FQIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgU09BUCBvcGVyYXRpb24gZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhpcyB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVPcGVyYXRpb24oT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBTT0FQT3BlcmF0aW9uIHNvID0gKFNPQVBPcGVyYXRpb24pZWxlbWVudDsKLQotICAgIFN0cmluZyBzb2FwU3R5bGUgPSBzby5nZXRTdHlsZSgpOwotCi0gICAgaWYgKHNvYXBTdHlsZSAhPSBudWxsICYmICFzb2FwU3R5bGUuZXF1YWxzSWdub3JlQ2FzZShSUEMpICYmICFzb2FwU3R5bGUuZXF1YWxzSWdub3JlQ2FzZShET0NVTUVOVCkpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9PUEVSQVRJT05fU1RZTEUpLCBlbGVtZW50KTsKLSAgICB9Ci0KLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZylwYXJlbnRzLmdldCgxKTsKLSAgICBpZiAoIWhhc1NvYXBCaW5kaW5nKGJpbmRpbmcpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9OT19TT0FQQklORElOR19GT1JfT1BFUkFUSU9OLCBRVU9URSArIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgc28pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgU09BUCBib2R5LiBJZiBlbmNvZGVkIGEgYm9keSBtdXN0IGhhdmUgYW4gZW5jb2RpbmdTdHlsZS4gQWxzbywKLSAgICogaWYgc3BlY2lmaWVkLCBhbGwgb2YgdGhlIHBhcnRzIGxpc3RlZCBtdXN0IGJlIGRlZmluZWQgcGFydHMgYW5kIGluIHRoZSBlbmNvZGluZyB1c2UgY2FzZSwgdGhlIHBhcnRzCi0gICAqIG11c3QgaGF2ZSB0eXBlcyBkZWZpbmVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIFNPQVAgYm9keSBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgU09BUCBib2R5IGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoaXMgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQm9keShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIFNPQVBCb2R5SW1wbCBzYiA9IChTT0FQQm9keUltcGwpZWxlbWVudDsKLQotICAgIFN0cmluZyB1c2UgPSBzYi5nZXRVc2UoKTsKLQotICAgIC8vIGlmIHRoZSB1c2UgPSBlbmNvZGVkIHRoZW4gdGhlcmUgbXVzdCBiZSBlbmNvZGluZ1N0eWxlcy4KLSAgICBpZiAodXNlICE9IG51bGwgJiYgdXNlLmVxdWFsc0lnbm9yZUNhc2UoRU5DT0RFRCkpCi0gICAgewotICAgICAgTGlzdCBlbmNvZGluZ1N0eWxlcyA9IHNiLmdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICBpZiAoZW5jb2RpbmdTdHlsZXMgPT0gbnVsbCB8fCBlbmNvZGluZ1N0eWxlcy5zaXplKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CT0RZX0VOQ09ESU5HX1NUWUxFKSwgc2IpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh1c2UgIT0gbnVsbCAmJiAhdXNlLmVxdWFsc0lnbm9yZUNhc2UoTElURVJBTCkpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CT0RZX1VTRSwgUVVPVEUgKyB1c2UgKyBRVU9URSksIHNiKTsKLSAgICB9Ci0KLSAgICAvL0NoZWNrIHRoYXQgdGhlIHBhcnRzIGFyZSB2YWxpZAotICAgIC8vIHBhcnRzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgbWVzc2FnZSBzcGVjaWZpZWQgZm9yIHRoZSBvcGVyYXRpb24KLSAgICBMaXN0IHBhcnRzID0gc2IuZ2V0UGFydHMoKTsKLQotICAgIGlmIChwYXJ0cyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIHBhcnRzSXRlcmF0b3IgPSBwYXJ0cy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKHBhcnRzSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcGFydCA9IChTdHJpbmcpcGFydHNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm8gPSAoQmluZGluZ09wZXJhdGlvbilwYXJlbnRzLmdldCgxKTsKLSAgICAgICAgT3BlcmF0aW9uIG8gPSBiby5nZXRPcGVyYXRpb24oKTsKLQotICAgICAgICBpZiAobyAhPSBudWxsICYmICFvLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBnZXQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgaW5wdXQgb3Igb3V0cHV0IGlmIGl0IGV4aXN0cwotICAgICAgICAgIE1lc3NhZ2UgbWVzcyA9IG51bGw7Ci0gICAgICAgICAgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ0lucHV0SW1wbC5jbGFzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJbnB1dCBpbnB1dCA9IG8uZ2V0SW5wdXQoKTsKLQotICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1lc3MgPSBpbnB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ091dHB1dEltcGwuY2xhc3MpCi0gICAgICAgICAgewotICAgICAgICAgICAgT3V0cHV0IG91dHB1dCA9IG8uZ2V0T3V0cHV0KCk7Ci0KLSAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVzcyA9IG91dHB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKG1lc3MgIT0gbnVsbCAmJiAhbWVzcy5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBhcnQgcCA9IG1lc3MuZ2V0UGFydChwYXJ0KTsKLQotICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gaWYgdGhlIHVzZSBpcyBlbmNvZGVkIHRoZSBwYXJ0cyBtdXN0IGFsbCBoYXZlIGEgdHlwZSBkZWZpbmVkCi0gICAgICAgICAgICAgIGlmICh1c2UgIT0gbnVsbCAmJiB1c2UuZXF1YWxzSWdub3JlQ2FzZShFTkNPREVEKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwLmdldFR5cGVOYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBwYXJ0IGVycm9yIC0gcGFydCBuZWVkcyB0byBiZSB0eXBlIGFuZCBpc24ndAkKLSAgICAgICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JPRFlfUEFSVF9OT1RfVFlQRSwgUVVPVEUgKyBwYXJ0ICsgUVVPVEUpLCBzYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vcGFydCBlcnJvciAtIHBhcnQgaXNuJ3QgZGVmaW5lZAkKLSAgICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfVU5ERUZJTkVELCBRVU9URSArIHBhcnQgKyBRVU9URSksIHNiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vcGFydCBlcnJvciAtIGlucHV0IGlzbid0IGRlZmluZWQKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JPRFlfUEFSVF9VTkRFRklORUQsIFFVT1RFICsgcGFydCArIFFVT1RFKSwgc2IpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBwYXJ0cyBlcnJvciAtIG9wZXJhdGlvbiBpc24ndCBkZWZpbmVkCi0gICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JPRFlfUEFSVF9VTkRFRklORUQsIFFVT1RFICsgcGFydCArIFFVT1RFKSwgc2IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpcGFyZW50cy5nZXQoMik7Ci0gICAgaWYgKCFoYXNTb2FwQmluZGluZyhiaW5kaW5nKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX0JPRFksIFFVT1RFICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBzYik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEEgU09BUCBoZWFkZXIgbXVzdCBoYXZlIGEgbWVzc2FnZSwgcGFydCBhbmQgdXNlIGRlZmluZWQuIElmIHRoZSB1c2UgaXMgZW5jb2RlZCwgbXVzdAotICAgKiBhbHNvIGhhdmUgYSBub24tZW1wdHkgZW5jb2RpbmdTdHlsZSBhbmQgbmFtZXNwYWNlIGRlZmluZWQuCi0gICAqIEEgU09BUCBoZWFkZXIgbWF5IGhhdmUgaGVhZGVyZmF1bHRzIGRlZmluZWQgYXMgd2VsbC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBTT0FQIGhlYWRlciBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgU09BUCBoZWFkZXIgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhpcyB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVIZWFkZXIoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBTT0FQSGVhZGVySW1wbCBzb2FwSGVhZGVyID0gKFNPQVBIZWFkZXJJbXBsKWVsZW1lbnQ7Ci0KLSAgICBRTmFtZSBtZXNzYWdlUU5hbWUgPSBzb2FwSGVhZGVyLmdldE1lc3NhZ2UoKTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoKERlZmluaXRpb24pcGFyZW50cy5nZXQocGFyZW50cy5zaXplKCkgLSAxKSkuZ2V0TWVzc2FnZShtZXNzYWdlUU5hbWUpOwotICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgewotICAgICAgLy8gbWVzc2FnZSB1bmRlZmluZWQKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9IRUFERVJfTUVTU0FHRV9VTkRFRklORUQsIFFVT1RFICsgbWVzc2FnZVFOYW1lLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBzb2FwSGVhZGVyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyBwYXJ0bmFtZSA9IHNvYXBIZWFkZXIuZ2V0UGFydCgpOwotICAgICAgUGFydCBwYXJ0ID0gbWVzc2FnZS5nZXRQYXJ0KHBhcnRuYW1lKTsKLSAgICAgIGlmIChwYXJ0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIHBhcnQgdW5kZWZpbmVkCi0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICBfRVJST1JfSEVBREVSX1BBUlRfVU5ERUZJTkVELAotICAgICAgICAgICAgUVVPVEUgKyBwYXJ0bmFtZSArIFFVT1RFLAotICAgICAgICAgICAgUVVPVEUgKyBtZXNzYWdlUU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIHNvYXBIZWFkZXIpOwotICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyB1c2UgPSBzb2FwSGVhZGVyLmdldFVzZSgpOwotICAgIGlmICh1c2UgIT0gbnVsbCAmJiAhdXNlLmVxdWFsc0lnbm9yZUNhc2UoTElURVJBTCkgJiYgIXVzZS5lcXVhbHNJZ25vcmVDYXNlKEVOQ09ERUQpKQotICAgIHsKLSAgICAgIC8vIHVzZSB1bmRlZmluZWQKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9IRUFERVJfVVNFX1VOREVGSU5FRCwgUVVPVEUgKyB1c2UgKyBRVU9URSksIHNvYXBIZWFkZXIpOwotICAgIH0KLQotICAgIGlmICh1c2UuZXF1YWxzSWdub3JlQ2FzZShFTkNPREVEKSkKLSAgICB7Ci0gICAgICBMaXN0IGVuY29kaW5nU3R5bGVzID0gc29hcEhlYWRlci5nZXRFbmNvZGluZ1N0eWxlcygpOwotICAgICAgaWYgKGVuY29kaW5nU3R5bGVzID09IG51bGwgfHwgZW5jb2RpbmdTdHlsZXMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICAvLyBubyBlbmNvZGluZ1N0eWxlIGRlZmluZWQKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSEVBREVSX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEKSwgc29hcEhlYWRlcik7Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsIHx8IG5hbWVzcGFjZS5lcXVhbHNJZ25vcmVDYXNlKEVNUFRZX1NUUklORykpCi0gICAgICB7Ci0gICAgICAgIC8vIG5vIG5hbWVzcGFjZSBkZWZpbmVkCi0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0hFQURFUl9OQU1FU1BBQ0VfVU5ERUZJTkVEKSwgc29hcEhlYWRlcik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTGlzdCBoZWFkZXJGYXVsdHMgPSBzb2FwSGVhZGVyLmdldFNPQVBIZWFkZXJGYXVsdHMoKTsKLSAgICBpZiAoaGVhZGVyRmF1bHRzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaWhlYWRlckZhdWx0cyA9IGhlYWRlckZhdWx0cy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGloZWFkZXJGYXVsdHMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUhlYWRlckZhdWx0KGloZWFkZXJGYXVsdHMubmV4dCgpLCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZylwYXJlbnRzLmdldCgyKTsKLSAgICBpZiAoIWhhc1NvYXBCaW5kaW5nKGJpbmRpbmcpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9OT19TT0FQQklORElOR19GT1JfSEVBREVSLCBRVU9URSArIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgc29hcEhlYWRlcik7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQSBTT0FQIGhlYWRlcmZhdWx0IG11c3QgaGF2ZSBhIG1lc3NhZ2UsIHBhcnQgYW5kIHVzZSBkZWZpbmVkLiBJZiB0aGUgdXNlIGlzIGVuY29kZWQsIG11c3QKLSAgICogYWxzbyBoYXZlIGEgbm9uLWVtcHR5IGVuY29kaW5nU3R5bGUgYW5kIG5hbWVzcGFjZSBkZWZpbmVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIFNPQVAgaGVhZGVyIGZhdWx0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnRzIEEgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBTT0FQIGhlYWRlciBmYXVsdCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIGZvciB0aGlzIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlckZhdWx0KE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgU09BUEhlYWRlckZhdWx0SW1wbCBzb2FwSGVhZGVyRmF1bHQgPSAoU09BUEhlYWRlckZhdWx0SW1wbCllbGVtZW50OwotCi0gICAgUU5hbWUgbWVzc2FnZVFOYW1lID0gc29hcEhlYWRlckZhdWx0LmdldE1lc3NhZ2UoKTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoKERlZmluaXRpb24pcGFyZW50cy5nZXQocGFyZW50cy5zaXplKCkgLSAxKSkuZ2V0TWVzc2FnZShtZXNzYWdlUU5hbWUpOwotICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgewotICAgICAgLy8gbWVzc2FnZSB1bmRlZmluZWQKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9IRUFERVJGQVVMVF9NRVNTQUdFX1VOREVGSU5FRCwgUVVPVEUgKyBtZXNzYWdlUU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIHNvYXBIZWFkZXJGYXVsdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFydG5hbWUgPSBzb2FwSGVhZGVyRmF1bHQuZ2V0UGFydCgpOwotICAgICAgUGFydCBwYXJ0ID0gbWVzc2FnZS5nZXRQYXJ0KHBhcnRuYW1lKTsKLSAgICAgIGlmIChwYXJ0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIHBhcnQgdW5kZWZpbmVkCi0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICBfRVJST1JfSEVBREVSRkFVTFRfUEFSVF9VTkRFRklORUQsCi0gICAgICAgICAgICBRVU9URSArIHBhcnRuYW1lICsgUVVPVEUsCi0gICAgICAgICAgICBRVU9URSArIG1lc3NhZ2VRTmFtZS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgc29hcEhlYWRlckZhdWx0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgdXNlID0gc29hcEhlYWRlckZhdWx0LmdldFVzZSgpOwotICAgIGlmICh1c2UgIT0gbnVsbCAmJiAhdXNlLmVxdWFsc0lnbm9yZUNhc2UoTElURVJBTCkgJiYgIXVzZS5lcXVhbHNJZ25vcmVDYXNlKEVOQ09ERUQpKQotICAgIHsKLSAgICAgIC8vIHVzZSB1bmRlZmluZWQKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9IRUFERVJGQVVMVF9VU0VfVU5ERUZJTkVELCBRVU9URSArIHVzZSArIFFVT1RFKSwgc29hcEhlYWRlckZhdWx0KTsKLSAgICB9Ci0KLSAgICBpZiAodXNlLmVxdWFsc0lnbm9yZUNhc2UoRU5DT0RFRCkpCi0gICAgewotICAgICAgTGlzdCBlbmNvZGluZ1N0eWxlcyA9IHNvYXBIZWFkZXJGYXVsdC5nZXRFbmNvZGluZ1N0eWxlcygpOwotICAgICAgaWYgKGVuY29kaW5nU3R5bGVzID09IG51bGwgfHwgZW5jb2RpbmdTdHlsZXMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICAvLyBubyBlbmNvZGluZ1N0eWxlIGRlZmluZWQKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSEVBREVSRkFVTFRfRU5DT0RJTkdTVFlMRV9VTkRFRklORUQpLCBzb2FwSGVhZGVyRmF1bHQpOwotICAgICAgfQotCi0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gc29hcEhlYWRlckZhdWx0LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsIHx8IG5hbWVzcGFjZS5lcXVhbHNJZ25vcmVDYXNlKEVNUFRZX1NUUklORykpCi0gICAgICB7Ci0gICAgICAgIC8vIG5vIG5hbWVzcGFjZSBkZWZpbmVkCi0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0hFQURFUkZBVUxUX05BTUVTUEFDRV9VTkRFRklORUQpLCBzb2FwSGVhZGVyRmF1bHQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFZhbGlkYXRlIHRoZSBTT0FQIGZhdWx0LiBBIFNPQVAgZmF1bHQgbXVzdCBoYXZlIGEgbmFtZSBkZWZpbmVkIHRoYXQgY29ycmVzcG9uZHMgd2l0aCB0aGUgbmFtZQotICAqIHNwZWNpZmllZCBpbiB0aGUgcG9ydFR5cGUuICBJZiBlbmNvZGVkIGEgZmF1bHQgbXVzdCBoYXZlIGFuIGVuY29kaW5nU3R5bGUgYW5kIGEgbmFtZXNwYWNlVVJJLiAKLSAgKiAKLSAgKiBAcGFyYW0gZWxlbWVudCBUaGUgU09BUCBmYXVsdCBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgU09BUCBmYXVsdCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsaWRhdGlvbkluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhpcyB2YWxpZGF0aW9uLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUZhdWx0KE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgU09BUEZhdWx0SW1wbCBmYXVsdCA9IChTT0FQRmF1bHRJbXBsKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLQotICAgIFN0cmluZyBwYXJlbnROYW1lID0gKChCaW5kaW5nRmF1bHQpcGFyZW50cy5nZXQoMCkpLmdldE5hbWUoKTsKLQotICAgIGlmICghbmFtZS5lcXVhbHMocGFyZW50TmFtZSkpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfRkFVTFRfTkFNRSwgUVVPVEUgKyBuYW1lICsgUVVPVEUsIFFVT1RFICsgcGFyZW50TmFtZSArIFFVT1RFKSwgZmF1bHQpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBoYXNTb2FwQmluZGluZy4gLSBoZWxwZXIgTWV0aG9kCi0gICAqIEdpdmVuIGEgYmluZGluZyByZXR1cm5zIHRydWUgaWYgaXQgaGFzIGEgU09BUCBiaW5kaW5nIGRlZmluZWQuCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZyAtIHRoZSBTT0FQIGJpbmRpbmcgdG8gY2hlY2sKLSAgICogQHJldHVybiB0cnVlIGlmIGEgYmluZGluZyBoYXMgYSBTT0FQIGJpbmRpbmcgZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNTb2FwQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgZXh0ZWxlbXMgPSBiaW5kaW5nLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgaWYgKGV4dGVsZW1zICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGlleHRlbGVtcyA9IGV4dGVsZW1zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpZXh0ZWxlbXMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlleHRlbGVtcy5uZXh0KCkuZ2V0Q2xhc3MoKSA9PSBTT0FQQmluZGluZ0ltcGwuY2xhc3MpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0ZpbGVFbnRpdHlSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0ZpbGVFbnRpdHlSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjFjMzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9GaWxlRW50aXR5UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBFbnRpdHkgcmVzb2x2ZSB0byByZXNvbHZlIGZpbGUgZW50aXRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlRW50aXR5UmVzb2x2ZXIgaW1wbGVtZW50cyBYTUxFbnRpdHlSZXNvbHZlcgotewotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJlc291cmNlKSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHB1YmxpY0lkID0gcmVzb3VyY2UuZ2V0UHVibGljSWQoKTsKLSAgICBTdHJpbmcgc3lzdGVtSWQgPSByZXNvdXJjZS5nZXRFeHBhbmRlZFN5c3RlbUlkKCk7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IHJlc291cmNlLmdldE5hbWVzcGFjZSgpOwotICAgIFVSTCB1cmwgPSBudWxsOwotICAgIGlmKHN5c3RlbUlkICE9IG51bGwpCi0gICAgewotICAgICAgdXJsID0gbmV3IFVSTChzeXN0ZW1JZCk7Ci0gICAgfQotICAgIGVsc2UgaWYocHVibGljSWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKHB1YmxpY0lkKTsKLSAgICB9Ci0gICAgZWxzZSBpZihuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKG5hbWVzcGFjZSk7Ci0gICAgfQotICAgIGlmKHVybCAhPSBudWxsKQotICAgIHsKLSAgICAgIElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgIHJldHVybiBuZXcgWE1MSW5wdXRTb3VyY2UocHVibGljSWQsIHJlc291cmNlLmdldEV4cGFuZGVkU3lzdGVtSWQoKSwgcmVzb3VyY2UuZ2V0RXhwYW5kZWRTeXN0ZW1JZCgpLCBpcywgbnVsbCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwMmJlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvSW5saW5lU2NoZW1hR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLQotLyoqCi0gKiBHZW5lcmF0ZSBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNjaGVtYSBmb3IgYW4gaW5saW5lIHNjaGVtYS4gV2lsbCBhZGQgaW1wb3J0cyBmb3IgdW5yZXNvbHZlZAotICogbmFtZXNwYWNlcy4KLSAqLwotcHVibGljIGNsYXNzIElubGluZVNjaGVtYUdlbmVyYXRvcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0VOQ09ESU5HX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJFRklYID0gImZpbGU6Ly8vIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVROQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVCA9ICJpbXBvcnQiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFID0gImluY2x1ZGUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUEgPSAic2NoZW1hIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BTE9DQVRJT04gPSAic2NoZW1hTG9jYXRpb24iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGlnbm9yZU5hbWVzcGFjZXMgPQotICAgIHsgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSwgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCwgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMSB9OwotCi0gIHByb3RlY3RlZCBzdGF0aWMgSW5saW5lU2NoZW1hR2VuZXJhdG9yIGluc3RhbmNlID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgSW5saW5lU2NoZW1hR2VuZXJhdG9yKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgaW5zdGFuY2Ugb2YgdGhlIElubGluZVNjaGVtYUdlbmVyYXRvci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHRoZSBpbmxpbmUgc2NoZW1hIGdlbmVyYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgSW5saW5lU2NoZW1hR2VuZXJhdG9yIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IElubGluZVNjaGVtYUdlbmVyYXRvcigpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzY2hlbWEgZnJvbSB0aGUgZWxlbWVudCBwcm92aWRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGVsZW1lbnRzIEEgbGlzdCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSBpbiBvcmRlci4KLSAgICogQHBhcmFtIGZpbGVsb2NhdGlvbiBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIHZhbGlkSW1wb3J0TlNzIEEgc2V0IG9mIG5hbWVzcGFjZXMgZm9yIHdoaWNoIGl0J3MgdmFsaWQgdG8gY3JlYXRlIGltcG9ydCBzdGF0ZW1lbnRzLgotICAgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2NoZW1hLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlWFNEU3RyaW5nKEVsZW1lbnQgZWxlbWVudCwgTGlzdCBlbGVtZW50cywgU3RyaW5nIGZpbGVsb2NhdGlvbiwgU2V0IHZhbGlkSW1wb3J0TlNzKQotICB7Ci0JICByZXR1cm4gSW5saW5lU2NoZW1hR2VuZXJhdG9yLmNyZWF0ZVhTRFN0cmluZyhlbGVtZW50LCBlbGVtZW50cywgZmlsZWxvY2F0aW9uLCBuZXcgSGFzaHRhYmxlKCksIHZhbGlkSW1wb3J0TlNzKTsKLSAgfQotICAKLSAgLyoqCi0gIAkqIENyZWF0ZXMgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzY2hlbWEgbW9kZWwgd2l0aCB0aGUgcm9vdCBlbGVtZW50IG9mCi0gIAkqIGV4dEVsZW0uIENhbGxzIGNyZWF0ZVhTRFN0cmluZ1JlY3Vyc2l2ZWx5IHRvIHRha2UgY2FyZSBvZiBidWlsZGluZyB0aGUgU3RyaW5nCi0gIAkqIGFmdGVyIGl0IG9idGFpbnMgdGhlIEVsZW1lbnQgZnJvbSB0aGUgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LgotICAJKiAKLSAgCSogQHBhcmFtIGVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAJKiBAcGFyYW0gZWxlbWVudHMgQSBsaXN0IHRvIGNvbnRhaW4gdGhlIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEgaW4gb3JkZXIuCi0gIAkqIEBwYXJhbSBmaWxlbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlIHRoZSBzY2hlbWEgaXMgbG9jYXRlZCBpbi4KLSAgCSogQHBhcmFtIHBhcmVudE5TcyBBIGhhc2h0YWJsZSBvZiBwYXJlbnQgbmFtZXNwYWNlcyB0byB1c2VkIHRvIHJlc29sdmUgcHJlZml4ZXMuCi0gIAkqIEBwYXJhbSB2YWxpZEltcG9ydE5TcyBBIHNldCBvZiBuYW1lc3BhY2VzIGZvciB3aGljaCBpdCdzIHZhbGlkIHRvIGNyZWF0ZSBpbXBvcnQgc3RhdGVtZW50cy4KLSAgCSogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2NoZW1hIHdpdGggdGhlIHJvb3QgZWxlbWVudCAnZWxlbWVudCcuCi0gIAkqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVYU0RTdHJpbmcoRWxlbWVudCBlbGVtZW50LCBMaXN0IGVsZW1lbnRzLCBTdHJpbmcgZmlsZWxvY2F0aW9uLCBIYXNodGFibGUgcGFyZW50TlNzLCBTZXQgdmFsaWRJbXBvcnROU3MpCi0gIHsKLQlTZXQgaW1wb3J0TlNzID0gbmV3IFRyZWVTZXQoKTsgCi0gICAgaW1wb3J0TlNzLmFkZEFsbCh2YWxpZEltcG9ydE5Tcyk7IAotICAgIGltcG9ydE5Tcy5hZGQoU09BUF9FTkNPRElOR19VUkkpOyAKLQotICAgIElubGluZVNjaGVtYUdlbmVyYXRvciBzY2hlbWFHZW5lcmF0b3IgPSBJbmxpbmVTY2hlbWFHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLSAgICBIYXNodGFibGUgbnNSZXNvbHZlciA9IHNjaGVtYUdlbmVyYXRvci5nZXROU1Jlc29sdmVyKGVsZW1lbnQpOwotICAgIExpc3QgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0UmVxdWlyZWROYW1lc3BhY2VzKGVsZW1lbnQpOwotICAgIEhhc2h0YWJsZSByZXFOU0RlY2wgPSBzY2hlbWFHZW5lcmF0b3IucmVzb2x2ZU5hbWVzcGFjZXMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgLy9IYXNodGFibGUgcmVxTlNEZWNsID0gc2NoZW1hR2VuZXJhdG9yLmdldFJlcXVpcmVkTlNEZWNsYXJhdGlvbnMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgTGlzdCBpbXBvcnROUyA9IHNjaGVtYUdlbmVyYXRvci5nZXRJbXBvcnROYW1lc3BhY2VzKGVsZW1lbnQpOwotICAgIHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLnJlbW92ZUltcG9ydHMocmVxbnMsIGltcG9ydE5TKTsKLSAgICByZXFucyA9IHNjaGVtYUdlbmVyYXRvci5yZW1vdmVMb2NhbE5hbWVzcGFjZXMocmVxbnMsIGVsZW1lbnQpOwotCXJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLnJlc3RyaWN0SW1wb3J0cyhyZXFucywgdmFsaWRJbXBvcnROU3MpOwotICAgIHJldHVybiBzY2hlbWFHZW5lcmF0b3IuY3JlYXRlWFNEU3RyaW5nUmVjdXJzaXZlbHkoZWxlbWVudCwgZWxlbWVudHMsIHJlcW5zLCByZXFOU0RlY2wsIGZpbGVsb2NhdGlvbik7Ci0gIH0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UgaXMgcmVxdWlyZWQgYnV0IG5vdCBpbXBvcnRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGZpbGVsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NoZW1hLgotICAgKiBAcGFyYW0gcGFyZW50TlNzIEEgaGFzaHRhYmxlIG9mIHRoZSBwYXJlbnQgbmFtZXNwYWNlcy4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzb2FwIGVuY29kaW5nIG5hbWVzcGFjZSBpcyByZXF1aXJlZCBidXQgbm90IGltcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc29hcEVuY29kaW5nUmVxdWlyZWROb3RJbXBvcnRlZChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBmaWxlbG9jYXRpb24sIEhhc2h0YWJsZSBwYXJlbnROU3MpCi0gIHsKLSAgICBJbmxpbmVTY2hlbWFHZW5lcmF0b3Igc2NoZW1hR2VuZXJhdG9yID0gSW5saW5lU2NoZW1hR2VuZXJhdG9yLmdldEluc3RhbmNlKCk7Ci0gICAgSGFzaHRhYmxlIG5zUmVzb2x2ZXIgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0TlNSZXNvbHZlcihlbGVtZW50KTsKLSAgICBMaXN0IHJlcW5zID0gbnVsbDsKLQotICAgIHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLmdldFJlcXVpcmVkTmFtZXNwYWNlcyhlbGVtZW50KTsKLSAgICBzY2hlbWFHZW5lcmF0b3IucmVzb2x2ZU5hbWVzcGFjZXMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgLy9zY2hlbWFHZW5lcmF0b3IucmVzb2x2ZVVuZGVjbGFyZWROYW1lc3BhY2VzKHJlcW5zLCBwYXJlbnROU3MpOwotICAgIExpc3QgaW1wb3J0TlMgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0SW1wb3J0TmFtZXNwYWNlcyhlbGVtZW50KTsKLSAgICByZXFucyA9IHNjaGVtYUdlbmVyYXRvci5yZW1vdmVJbXBvcnRzKHJlcW5zLCBpbXBvcnROUyk7Ci0gICAgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IucmVtb3ZlTG9jYWxOYW1lc3BhY2VzKHJlcW5zLCBlbGVtZW50KTsKLSAgICByZXR1cm4gc2NoZW1hR2VuZXJhdG9yLmNoZWNrU09BUEVuY29kaW5nUmVxdWlyZWQocmVxbnMpOwotICB9Ci0gIC8qKgotICAgKiBSZXNvbHZlIHRoZSB1bmRlY2xhcmVkIG5hbWVzcGFjZXMuCi0gICAqIAotICAgKiBAcGFyYW0gdW5yZXNvbHZlZE5TcyBBIGxpc3Qgb2YgdW5yZXNvbHZlZCBuYW1lc3BhY2VzLgotICAgKiBAcGFyYW0gbnNSZXNvbHZlciBUaGUgbmFtZXNwYWNlIHJlc29sdmVyIHRvIHVzZS4KLSAgICogQHJldHVybiBBIGhhc2h0YWJsZSBvZiBwcmVmaXhlcyBhbmQgbmFtZXNwYWNlcy4KLSAgICovCi0vLyAgcHJvdGVjdGVkIEhhc2h0YWJsZSByZXNvbHZlVW5kZWNsYXJlZE5hbWVzcGFjZXMoTGlzdCB1bnJlc29sdmVkTlNzLCBIYXNodGFibGUgbnNSZXNvbHZlcikKLS8vICB7Ci0vLyAgICBIYXNodGFibGUgbmFtZXNwYWNlcyA9IG5ldyBIYXNodGFibGUoKTsKLS8vICAgIGlmICh1bnJlc29sdmVkTlNzICE9IG51bGwgJiYgIXVucmVzb2x2ZWROU3MuaXNFbXB0eSgpICYmIG5zUmVzb2x2ZXIgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgZm9yIChpbnQgaSA9IHVucmVzb2x2ZWROU3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pCi0vLyAgICAgIHsKLS8vICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKXVucmVzb2x2ZWROU3MuZ2V0KGkpOwotLy8gICAgICAgIGlmIChucy5lcXVhbHMoIiIpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIG5zID0gWE1MTlM7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGVsc2UKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBucyA9IFhNTE5TICsgIjoiICsgbnM7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGlmIChuc1Jlc29sdmVyLmNvbnRhaW5zS2V5KG5zKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAvL25hbWVzcGFjZXMucmVtb3ZlKGkpOwotLy8gICAgICAgICAgLy9uYW1lc3BhY2VzLmFkZChpLCBuc1Jlc29sdmVyLmdldChucykpOwotLy8gICAgICAgICAgbmFtZXNwYWNlcy5wdXQobnMsIG5zUmVzb2x2ZXIuZ2V0KG5zKSk7Ci0vLyAgICAgICAgICB1bnJlc29sdmVkTlNzLnJlbW92ZShpKTsKLS8vICAgICAgICAgIHVucmVzb2x2ZWROU3MuYWRkKGksIG5zUmVzb2x2ZXIuZ2V0KG5zKSk7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gbmFtZXNwYWNlczsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmVjdXJzaXZlIG1ldGhvZCBjcmVhdGVzIHRoZSBzY2hlbWEgU3RyaW5nIGZyb20gdGhlIHJvb3QgRWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtIFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGVsZW1lbnRzIEEgbGlzdCB0byBiZSBjcmVhdGVkIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc2NoZW1hIGluIG9yZGVyLgotICAgKiBAcGFyYW0gcmVxdWlyZWROYW1lc3BhY2VzIEEgbGlzdCBvZiByZXF1aXJlZCBuYW1lc3BhY2VzLgotICAgKiBAcGFyYW0gcmVxTlNEZWNsIEEgaGFzaHRhYmxlIG9mIHJlcXVpcmVkIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMuCi0gICAqIEBwYXJhbSBmaWxlbG9jYXRpb24gVGhlIHVyaSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgc2NoZW1hLgotICAgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2NoZW1hLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVYU0RTdHJpbmdSZWN1cnNpdmVseSgKLSAgICBFbGVtZW50IGVsZW0sCi0gICAgTGlzdCBlbGVtZW50cywKLSAgICBMaXN0IHJlcXVpcmVkTmFtZXNwYWNlcywKLSAgICBIYXNodGFibGUgcmVxTlNEZWNsLAotICAgIFN0cmluZyBmaWxlbG9jYXRpb24pCi0gIHsKLSAgICBpZiAoZWxlbSA9PSBudWxsKQotICAgICAgcmV0dXJuICIiOyAvLyBqdXN0IGluIGNhc2UKLQotICAgIGVsZW1lbnRzLmFkZChlbGVtKTsKLQotICAgIFN0cmluZ0J1ZmZlciB4c2RTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgU3RyaW5nIGVsZW1lbnROYW1lID0gZWxlbS5nZXRUYWdOYW1lKCk7Ci0gICAgeHNkU3RyaW5nLmFwcGVuZCgiPCIpLmFwcGVuZChlbGVtZW50TmFtZSk7Ci0KLSAgICBib29sZWFuIGZvdW5kU2NoZW1hTG9jYXRpb24gPSBmYWxzZTsgLy8gZmxhZyBpZiBzY2hlbWFsb2NhdGlvbiBpcyBkZWZpbmVkCi0gICAgU3RyaW5nIG5hbWVzcGFjZSA9ICIiOyAvLyB0aGUgbmFtZXNwYWNlIGlmIHdlJ3JlIGNoZWNraW5nIGFuIGltcG9ydCBvciBpbmNsdWRlCi0gICAgU3RyaW5nIG5hbWVQcmVmaXggPSAiIjsgLy8gdGhlIHhtbG5zIHByZWZpeCB1c2VkIGZvciB0aGUgZWxlbWVudHMKLSAgICAvLyBHZXQgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFwcGVuZCB0aGVtIHRvIHRoZSB4c2RTdHJpbmcKLSAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW0uZ2V0QXR0cmlidXRlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cy5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbiA9IGF0dHMuaXRlbShpKTsKLSAgICAgIHhzZFN0cmluZy5hcHBlbmQoIiAiKS5hcHBlbmQobi5nZXROb2RlTmFtZSgpKS5hcHBlbmQoIj1cIiIpOwotICAgICAgU3RyaW5nIG5vZGVOYW1lID0gbi5nZXROb2RlTmFtZSgpOwotICAgICAgaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoU0NIRU1BTE9DQVRJT04pICYmIGZpbGVsb2NhdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3VuZFNjaGVtYUxvY2F0aW9uID0gdHJ1ZTsKLSAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IG4uZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIHhzZFN0cmluZy5hcHBlbmQocmVsYXRpdmVQYXRoKS5hcHBlbmQoIlwiIik7ICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBub2RlVmFsdWUgPSBuLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICBpZiAobm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShOQU1FU1BBQ0UpKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZXNwYWNlID0gbm9kZVZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGdldCB0aGUgbmFtZSBwcmVmaXggZm9yIHRoaXMgc2NoZW1hIHRvIHVzZSBpbiBnZW5lcmF0aW5nIGltcG9ydCBzdGF0ZW1lbnRzCi0gICAgICAgIGVsc2UgaWYgKG5vZGVOYW1lLmluZGV4T2YoWE1MTlMpICE9IC0xKQotICAgICAgICB7Ci0KLSAgICAgICAgICBpZiAobm9kZVZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoZWxlbS5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZVByZWZpeCA9IG5vZGVOYW1lOwotICAgICAgICAgICAgaWYgKG5hbWVQcmVmaXguZXF1YWxzSWdub3JlQ2FzZShYTUxOUykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5hbWVQcmVmaXggPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmFtZVByZWZpeCA9IG5hbWVQcmVmaXguc3Vic3RyaW5nKDYpICsgIjoiOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBSZXBsYWNlIG9sZCBzY2hlbWEgbmFtZXNwYWNlcyB3aXRoIHRoZSBuZXcgc2NoZW1hIG5hbWVzcGFjZS4KLSAgICAgICAgaWYobm9kZVZhbHVlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5KSB8fCBub2RlVmFsdWUuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApKQotICAgICAgICAgewotICAgICAgICAgIG5vZGVWYWx1ZSA9IENvbnN0YW50cy5OU19VUklfWFNEXzIwMDE7Ci0gICAgICAgIH0KLSAgICAgICAgeHNkU3RyaW5nLmFwcGVuZChub2RlVmFsdWUpLmFwcGVuZCgiXCIiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoImltcG9ydCIpICYmICFmb3VuZFNjaGVtYUxvY2F0aW9uKQotICAgIHsKLSAgICAgIHhzZFN0cmluZy5hcHBlbmQoIiAiKS5hcHBlbmQoU0NIRU1BTE9DQVRJT04pLmFwcGVuZCgiPVwiIikuYXBwZW5kKG5hbWVzcGFjZSkuYXBwZW5kKCJcIiIpOwotICAgIH0KLSAgICAvLyBhZGQgaW4gYW55IHJlcXVpcmVkIE5TIGRlY2xhcmF0aW9ucyBmcm9tIHBhcmVudCBlbGVtZW50cwotICAgIGlmIChyZXFOU0RlY2wgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbnVtZXJhdGlvbiBrZXlzID0gcmVxTlNEZWNsLmtleXMoKTsKLSAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyBkZWNsTlMgPSAoU3RyaW5nKXJlcU5TRGVjbC5nZXQoa2V5KTsKLSAgICAgICAgaWYoZGVjbE5TLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5KSB8fCBkZWNsTlMuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApKQotICAgICAgICAgewotICAgICAgICAgIGRlY2xOUyA9IENvbnN0YW50cy5OU19VUklfWFNEXzIwMDE7Ci0gICAgICAgIH0KLSAgICAgICAgeHNkU3RyaW5nLmFwcGVuZCgiICIpLmFwcGVuZChrZXkpLmFwcGVuZCgiPVwiIikuYXBwZW5kKGRlY2xOUykuYXBwZW5kKCJcIiIpOwotICAgICAgfQotCi0gICAgfQotICAgIHhzZFN0cmluZy5hcHBlbmQoIj4iKTsKLSAgICBpZiAocmVxdWlyZWROYW1lc3BhY2VzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaVJlcXVpcmVkTmFtZXNwYWNlcyA9IHJlcXVpcmVkTmFtZXNwYWNlcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGlSZXF1aXJlZE5hbWVzcGFjZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKWlSZXF1aXJlZE5hbWVzcGFjZXMubmV4dCgpOwotCi0gICAgICAgIHhzZFN0cmluZwotICAgICAgICAgIC5hcHBlbmQoIjwiKQotICAgICAgICAgIC5hcHBlbmQobmFtZVByZWZpeCkKLSAgICAgICAgICAuYXBwZW5kKElNUE9SVCkKLSAgICAgICAgICAuYXBwZW5kKCIgIikKLSAgICAgICAgICAuYXBwZW5kKE5BTUVTUEFDRSkKLSAgICAgICAgICAuYXBwZW5kKCI9XCIiKQotICAgICAgICAgIC5hcHBlbmQobnMpCi0gICAgICAgICAgLmFwcGVuZCgiXCIgIikKLSAgICAgICAgICAuYXBwZW5kKFNDSEVNQUxPQ0FUSU9OKQotICAgICAgICAgIC5hcHBlbmQoIj1cIiIpCi0gICAgICAgICAgLmFwcGVuZChucykKLSAgICAgICAgICAuYXBwZW5kKCJcIi8+Iik7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgeHNkU3RyaW5nLmFwcGVuZCgiXG4iKTsKLQotICAgIC8vIGNhbGwgdGhlIG1ldGhvZCByZWN1cnNpdmVseSBmb3IgZWFjaCBjaGlsZCBlbGVtZW50Ci0gICAgTm9kZUxpc3QgY2hpbGROb2RlcyA9IGVsZW0uZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpIHx8IGkgPCA1OyBpKyspCi0gICAgewotICAgICAgTm9kZSBuID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotICAgICAgLy8gd2Ugb25seSB3YW50IG5vZGVzIHRoYXQgYXJlIEVsZW1lbnRzCi0gICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCluOwotICAgICAgICB4c2RTdHJpbmcuYXBwZW5kKGNyZWF0ZVhTRFN0cmluZ1JlY3Vyc2l2ZWx5KGNoaWxkLCBlbGVtZW50cywgbnVsbCwgbnVsbCwgZmlsZWxvY2F0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgeHNkU3RyaW5nLmFwcGVuZCgiPC8iKS5hcHBlbmQoZWxlbS5nZXRUYWdOYW1lKCkpLmFwcGVuZCgiPiIpOwotCi0gICAgcmV0dXJuIHhzZFN0cmluZy50b1N0cmluZygpOwotCi0gIH0KLSAgLyoqCi0gICAqIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBuYW1lc3BhY2VzIHRoYXQgYXJlIHVzZWQgZm9yIGVsZW1lbnRzIG9yIHR5cGVzIGluIHRoZSBzY2hlbWEuCi0gICAqIFRoZXNlIGFyZSB0aGUgcmVxdWlyZWQgbmFtZXNwYWNlcyBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBhbGwgdGhlIGVsbWVudHMgYXJlIHZhbGlkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW0gVGhlIGVsZW1lbnQgdG8gY2hlY2sgZm9yIHJlcXVpcmVkIG5hbWVzcGFjZXMuCi0gICAqIEByZXR1cm4gQSBsaXN0IG9mIHJlcXVpcmVkIG5hbWVzcGFjZXMgZm9yIHRoZSBlbGVtZW50IGFuZCBhbGwgaXRzIGNoaWxkcmVuLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgZ2V0UmVxdWlyZWROYW1lc3BhY2VzKEVsZW1lbnQgZWxlbSkKLSAgewotICAgIExpc3QgbmFtZXNwYWNlID0gbmV3IFZlY3RvcigpOwotCi0gICAgLy8gY2FsbCB0aGUgbWV0aG9kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICAvLyByZWdpc3RlciBhbGwgdGhlIGNoaWxkIHR5cGVzIGZpcnN0Ci0gICAgTm9kZUxpc3QgY2hpbGROb2RlcyA9IGVsZW0uZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBudW1DaGlsZHJlbiA9IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgLy8gVE9ETzogd2h5IGlzIHRoZXJlIGEgPCA1IGNvbmRpdGlvbj8KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuIC8qfHwgaSA8IDUqLzsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLSAgICAgIC8vIHdlIG9ubHkgd2FudCBub2RlcyB0aGF0IGFyZSBFbGVtZW50cwotICAgICAgaWYgKG4gaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBFbGVtZW50IGNoaWxkID0gKEVsZW1lbnQpbjsKLSAgICAgICAgTGlzdCBjaGlsZG5zID0gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKGNoaWxkKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IGNoaWxkbnMuc2l6ZSgpIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKWNoaWxkbnMuZ2V0KGopOwotICAgICAgICAgIAotICAgICAgICAgIGlmICghbmFtZXNwYWNlLmNvbnRhaW5zKG5zKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lc3BhY2UuYWRkKG5zKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gQWRkIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGN1cnJlbnQgZWxlbWVudAotICAgIFN0cmluZyBlbGVtTlMgPSBlbGVtLmdldFByZWZpeCgpOwotICAgIC8vIGlmIHRoZXJlIGlzIG5vIG5hbWVzcGFjZSBwcmVmaXggc2V0IGl0IHRvIHRoZSBlbXB0eSBwcmVmaXguCi0gICAgaWYoZWxlbU5TID09IG51bGwpCi0gICAgewotICAgICAgZWxlbU5TID0gIiI7Ci0gICAgfQotICAgIGlmICghbmFtZXNwYWNlLmNvbnRhaW5zKGVsZW1OUykpCi0gICAgIHsKLSAgICAgIG5hbWVzcGFjZS5hZGQoZWxlbU5TKTsKLSAgICB9Ci0gICAgLy8gbm93IGFkZCBhbGwgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCdzIG5hbWVzcGFjZXMKLSAgICAvLyBkb24ndCBpbmNsdWRlIGltcG9ydCBhbmQgc2NoZW1hIGVsZW1lbnRzCi0gICAgU3RyaW5nIGxvY2FsbmFtZSA9IGVsZW0uZ2V0TG9jYWxOYW1lKCk7Ci0gICAgaWYgKCFsb2NhbG5hbWUuZXF1YWxzKElNUE9SVCkgJiYgIWxvY2FsbmFtZS5lcXVhbHMoSU5DTFVERSkgJiYgIWxvY2FsbmFtZS5lcXVhbHMoU0NIRU1BKSkKLSAgICB7Ci0gICAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW0uZ2V0QXR0cmlidXRlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbiA9IGF0dHMuaXRlbShpKTsKLQotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBuLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIC8vIHJlbW92ZWQgcmVzdHJpY3Rpb24gdGhhdCB3ZSdyZSBvbmx5IGxvb2tpbmcgYXQgdHlwZXMKLSAgICAgICAgLy8JCWlmIChub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRZUEUpKQotICAgICAgICAvLwkJewotICAgICAgICAvLyBkb24ndCB0YWtlIG5hbWVzcGFjZSBpbmZvIGZyb20gYXR0cmlidXRlcyBkZWZpbmluZyBuYW1lc3BhY2VzLgotICAgICAgICAvLyB0aGF0IGluY2x1ZGVzIHhtbG5zLCB0YXJnZXROYW1lc3BhY2UKLSAgICAgICAgLy8gZG9uJ3QgdGFrZSBuYW1lc3BhY2UgaW5mbyBmcm9tIG5hbWUgYXR0cmlidXRlcwotICAgICAgICBpZiAobm9kZU5hbWUuaW5kZXhPZihYTUxOUykgIT0gLTEgfHwgbm9kZU5hbWUuZXF1YWxzKFRBUkdFVE5BTUVTUEFDRSkgfHwgbm9kZU5hbWUuZXF1YWxzKE5BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG5vZGVWYWx1ZSA9IG4uZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgaW50IGNvbG9uSW5kZXggPSBub2RlVmFsdWUuaW5kZXhPZigiOiIpOwotICAgICAgICAvLyBEb24ndCB0YWtlIG5hbWVzcGFjZSBpbmZvIGZyb20gYXR0cmlidXRlcyB3aXRoIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSwgdGhhdCBpcyBhdHRyaWJ1dGVzCi0gICAgICAgIC8vIHRoYXQgYXJlIG5vdCBwcmVmaXhlZC4gKGNvbG9uSW5kZXggPT0gLTEpCi0gICAgICAgIC8vIElmIHRoZSBjb2xvbkluZGV4IGlzIGZvbGxvd2VkIGJ5IGEgLyB0aGVuIGl0IGlzIGEgVVJJIGFuZCBub3QKLSAgICAgICAgLy8gbmFtZXNwYWNlIHF1YWxpZmllZC4KLQkJaWYgKGNvbG9uSW5kZXggPT0gLTEgfHwgKGNvbG9uSW5kZXggKyAxIDwgbm9kZVZhbHVlLmxlbmd0aCgpICYmIG5vZGVWYWx1ZS5jaGFyQXQoY29sb25JbmRleCArIDEpID09ICcvJykpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBoZXJlIHdlIGhhdmUgZm91bmQgYSBjb2xvbiBkZWxpbWl0ZXIgc28gd2UgbmVlZCB0aGUgbmFtZXNwYWNlIGRlZmluZWQgaGVyZQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBub2RlVmFsdWUgPSBub2RlVmFsdWUuc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbmFtZXNwYWNlLmNvbnRhaW5zKG5vZGVWYWx1ZSkpCi0gICAgICAgIHsKLQotICAgICAgICAgIG5hbWVzcGFjZS5hZGQobm9kZVZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAvLwkJfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgbmFtZXNwYWNlcyB0aGF0IGhhdmUgYW4gaW1wb3J0IHN0YXRlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtIFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHJldHVybiBBIGxpc3Qgb2YgYWxsIHRoZSBuYW1lc3BhY2VzIHRoYXQgYXJlIGltcG9ydGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgZ2V0SW1wb3J0TmFtZXNwYWNlcyhFbGVtZW50IGVsZW0pCi0gIHsKLSAgICBMaXN0IG5hbWVzcGFjZSA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vIGNhbGwgdGhlIG1ldGhvZCByZWN1cnNpdmVseSBmb3IgZWFjaCBjaGlsZCBlbGVtZW50Ci0gICAgLy8gcmVnaXN0ZXIgYWxsIHRoZSBjaGlsZCB0eXBlcyBmaXJzdAotICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBlbGVtLmdldENoaWxkTm9kZXMoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSB8fCBpIDwgNTsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLSAgICAgIC8vIHdlIG9ubHkgd2FudCBub2RlcyB0aGF0IGFyZSBFbGVtZW50cwotICAgICAgaWYgKG4gaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBFbGVtZW50IGNoaWxkID0gKEVsZW1lbnQpbjsKLSAgICAgICAgTGlzdCBjaGlsZG5zID0gZ2V0SW1wb3J0TmFtZXNwYWNlcyhjaGlsZCk7Ci0gICAgICAgIGZvciAoaW50IGogPSBjaGlsZG5zLnNpemUoKSAtIDE7IGogPj0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZyljaGlsZG5zLmdldChqKTsKLSAgICAgICAgICBpZiAoIW5hbWVzcGFjZS5jb250YWlucyhucykpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZXNwYWNlLmFkZChucyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGlmIHRoaXMgaXMgYW4gaW1wb3J0IGVsZW1lbnQgZ2V0IHRoZSBuYW1lc3BhY2UgYW5kIGFkZCBpdCB0byB0aGUgbGlzdAotICAgIGlmIChlbGVtLmdldExvY2FsTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSU1QT1JUKSkKLSAgICB7Ci0gICAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW0uZ2V0QXR0cmlidXRlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbiA9IGF0dHMuaXRlbShpKTsKLQotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBuLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIGlmIChub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5BTUVTUEFDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbm9kZVZhbHVlID0gbi5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICBpZiAoIW5hbWVzcGFjZS5jb250YWlucyhub2RlVmFsdWUpKQotICAgICAgICAgIHsKLQotICAgICAgICAgICAgbmFtZXNwYWNlLmFkZChub2RlVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBIYXNodGFibGUgd2l0aCBuYW1lc3BhY2UgcHJlZml4ZXMgYXMga2V5cyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW0gVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIEEgaGFzaHRhYmxlIHdpdGggbmFtZXNwYWNlIHByZWZpeGVzIG1hcHBlZCB0byBuYW1lc3BhY2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBnZXROU1Jlc29sdmVyKEVsZW1lbnQgZWxlbSkKLSAgewotICAgIEhhc2h0YWJsZSBuc1Jlc29sdmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgTmFtZWROb2RlTWFwIGF0dHMgPSBlbGVtLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG4gPSBhdHRzLml0ZW0oaSk7Ci0KLSAgICAgIFN0cmluZyBub2RlTmFtZSA9IG4uZ2V0Tm9kZU5hbWUoKTsKLSAgICAgIGlmIChub2RlTmFtZS5pbmRleE9mKFhNTE5TKSAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5vZGVWYWx1ZSA9IG4uZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lUHJlZml4ID0gbm9kZU5hbWU7Ci0KLSAgICAgICAgaWYgKG5hbWVQcmVmaXguZXF1YWxzSWdub3JlQ2FzZShYTUxOUykpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lUHJlZml4ID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZVByZWZpeCA9IG5hbWVQcmVmaXguc3Vic3RyaW5nKDYpOwotICAgICAgICB9Ci0gICAgICAgIG5zUmVzb2x2ZXIucHV0KG5hbWVQcmVmaXgsIG5vZGVWYWx1ZSk7Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5zUmVzb2x2ZXI7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBSZXNvbHZlIHRoZSBuYW1lc3BhY2VzIGluIHRoZSBnaXZlbiBuYW1lc3BhY2VzIGxpc3Qgd2l0aCB0aGUgdHdvIG5hbWVzcGFjZQotICAgKiByZXNvbHZlciBoYXNodGFibGVzIHByb3ZpZGVkLiBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgbmFtZXNwYWNlIHRoYXQgbmVlZAotICAgKiB0byBiZSBkZWNsYXJlZC4KLSAgICogRmlyc3QgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBsb2NhbCBuYW1lc3BhY2VzIHdpdGggbnNSZXNvbHZlci4KLSAgICogTmV4dCByZXNvbHZlIGFnYWluc3QgdGhlIHBhcmVudCBuYW1lc3BhY2Ugd2l0aCBwYXJlbnROU1Jlc29sdmVyLgotICAgKiBBIHNpZGUgYWZmZWN0IG9mIHRoaXMgbWV0aG9kIGlzIHRoZSBuYW1lc3BhY2VzIGxpc3QgaXMgbGVmdCB3aXRoIG9ubHkgdGhvc2UgCi0gICAqIG5hbWVzcGFjZXMgdGhhdCBhcmUgcmVzb2x2ZWQgYW5kIHRoZSByZXNvbHZlZCBlbnRpdGllcyBhcmUgcGxhY2VkIGluIHRoZSAKLSAgICogbGlzdCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBlbnRyaWVzLgotICAgKiBGb3IgZXguIElmIHlvdSBwcm92aWRlIGEgbGlzdCBzdWNoIGFzIHt4c2QsIGludGZ9IGFuZCBvbmx5IHhzZCBjYW4gYmUgcmVzb2x2ZWQKLSAgICogeW91IHdpbGwgZW5kIHVwIHdpdGggdGhlIGxpc3Qge2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfQotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZXMgVGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyB0byByZXNvbHZlLgotICAgKiBAcGFyYW0gbnNSZXNvbHZlciBUaGUgaGFzaHRhYmxlIHRvIGJlIHVzZWQgYXMgdGhlIGxvY2FsIHJlc29sdmVyLgotICAgKiBAcGFyYW0gcGFyZW50TlNSZXNvbHZlciBUaGUgaGFzaHRhYmxlIHRvIGJlIHVzZWQgYXMgdGhlIHBhcmVudCBuYW1lc3BhY2UgcmVzb2x2ZXIuCi0gICAqIEByZXR1cm4gQSBIYXNodGFibGUgb2YgbmFtZXNwYWNlcyB0aGF0IG11c3QgYmUgZGVjbGFyZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHJlc29sdmVOYW1lc3BhY2VzKExpc3QgbmFtZXNwYWNlcywgSGFzaHRhYmxlIG5zUmVzb2x2ZXIsIEhhc2h0YWJsZSBwYXJlbnROU1Jlc29sdmVyKQotICB7Ci0gIAlIYXNodGFibGUgcmVxTlNEZWNsID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGlmIChuYW1lc3BhY2VzICE9IG51bGwgJiYgIW5hbWVzcGFjZXMuaXNFbXB0eSgpICYmIG5zUmVzb2x2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gbmFtZXNwYWNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZyluYW1lc3BhY2VzLmdldChpKTsKLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBuYW1lc3BhY2UgZnJvbSB0aGUgbGlzdC4KLSAgICAgICAgbmFtZXNwYWNlcy5yZW1vdmUoaSk7Ci0gICAgICAgIC8vIEZpcnN0IHRyeSB0byByZXNvbHZlIGFnYWluc3QgdGhlIGxvY2FsIG5hbWVzcGFjZSByZXNvbHZlci4KLSAgICAgICAgaWYgKG5zUmVzb2x2ZXIuY29udGFpbnNLZXkobnMpKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IHJlc29sdmVkTlMgPSBuc1Jlc29sdmVyLmdldChucyk7Ci0gICAgICAgICAgLy8gT25seSBhZGQgdGhlIG5hbWVzcGFjZSBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0LgotICAgICAgICAgIGlmKCFuYW1lc3BhY2VzLmNvbnRhaW5zKHJlc29sdmVkTlMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZXMuYWRkKGksIG5zUmVzb2x2ZXIuZ2V0KG5zKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5leHQgdHJ5IHRvIHJlc29sdmUgYWdhaW5zdCB0aGUgcGFyZW50IG5hbWVzcGFjZSByZXNvbHZlci4KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlpZiAobnMuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbnMgPSBYTUxOUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbnMgPSBYTUxOUyArICI6IiArIG5zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmVudE5TUmVzb2x2ZXIuY29udGFpbnNLZXkobnMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3QgcmVzb2x2ZWROUyA9IHBhcmVudE5TUmVzb2x2ZXIuZ2V0KG5zKTsKLSAgICAgICAgICAgICAgLy8gT25seSBhZGQgdGhlIG5hbWVzcGFjZSBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0LgotICAgICAgICAgICAgICBpZighbmFtZXNwYWNlcy5jb250YWlucyhyZXNvbHZlZE5TKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMuYWRkKGksIHJlc29sdmVkTlMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8vIFN0aWxsIG5lZWQgdG8gZGVjbGFyZSB0aGUgbmFtZXNwYWNlIHRob3VnaC4KLSAgICAgICAgICAgICAgcmVxTlNEZWNsLnB1dChucywgcmVzb2x2ZWROUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVxTlNEZWNsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhbnkgbmFtZXNwYWNlIGZyb20gdGhlIG5hbWVzcGFjZXMgbGlzdCBpZiBpdCBpcyBpbiB0aGUgaW1wb3J0IGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlcyBUaGUgbmFtZXNwYWNlcyBsaXN0LgotICAgKiBAcGFyYW0gaW1wb3J0ZWROYW1lc3BhY2VzIEEgbGlzdCBvZiBpbXBvcnRlZCBuYW1lc3BhY2VzLgotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIG5hbWVzcGFjZXMgd2l0aG91dCB0aGUgaW1wb3J0ZWQgbmFtZXNwYWNlcy4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IHJlbW92ZUltcG9ydHMoTGlzdCBuYW1lc3BhY2VzLCBMaXN0IGltcG9ydGVkTmFtZXNwYWNlcykKLSAgewotICAgIGlmIChuYW1lc3BhY2VzICE9IG51bGwgJiYgaW1wb3J0ZWROYW1lc3BhY2VzICE9IG51bGwgJiYgIWltcG9ydGVkTmFtZXNwYWNlcy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgSXRlcmF0b3IgaUltcG9ydGVkTlMgPSBpbXBvcnRlZE5hbWVzcGFjZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpSW1wb3J0ZWROUy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBpTlMgPSAoU3RyaW5nKWlJbXBvcnRlZE5TLm5leHQoKTsKLQotICAgICAgICBuYW1lc3BhY2VzLnJlbW92ZShpTlMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlczsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIHNjaGVtYSBhbmQgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoZSBpZ25vcmVOYW1lc3BhY2VzCi0gICAqIGxpc3QgZnJvbSB0aGUgbmFtZXNwYWNlcyBsaXN0IHByb3ZpZGVkLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZXMgVGhlIGxpc3Qgb2YgbG9jYWwgbmFtZXNwYWNlcy4KLSAgICogQHBhcmFtIGVsZW0gVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIG5hbWVzcGFjZXMgd2l0aCB0aGUgbG9jYWwgbmFtZXNwYWNlcyByZW1vdmVkLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgcmVtb3ZlTG9jYWxOYW1lc3BhY2VzKExpc3QgbmFtZXNwYWNlcywgRWxlbWVudCBlbGVtKQotICB7Ci0gICAgaWYgKG5hbWVzcGFjZXMgIT0gbnVsbCAmJiBlbGVtICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5zID0gZWxlbS5nZXRBdHRyaWJ1dGUoVEFSR0VUTkFNRVNQQUNFKTsKLSAgICAgIG5hbWVzcGFjZXMucmVtb3ZlKG5zKTsKLQotICAgICAgZm9yIChpbnQgaSA9IGlnbm9yZU5hbWVzcGFjZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIC8vIGtlZXAgcmVtb3ZpbmcgdGhlIG5hbWVzcGFjZSB1bnRpbCBpdCBpcyBub3QgaW4gdGhlIGxpc3QKLSAgICAgICAgaWYgKG5hbWVzcGFjZXMucmVtb3ZlKGlnbm9yZU5hbWVzcGFjZXNbaV0pKQotICAgICAgICB7Ci0gICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuYW1lc3BhY2VzOwotICB9Ci0gIAotICAvKiogCi0gICAqIFJlbW92ZSBhbGwgdGhlIG5hbWVzcGFjZXMgaW4gdGhlIG5hbWVzcGFjZXMgbGlzdCB0aGF0IGFyZW4ndCBjb250YWluZWQgaW4gdGhlIAotICAgKiB2YWxpZEltcG9ydE5TcyBzZXQuIAotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZXMgQSBsaXN0IG9mIG5hbWVzcGFjZXMuIAotICAgKiBAcGFyYW0gdmFsaWRJbXBvcnROU3MgQSBzZXQgb2YgdmFsaWQgbmFtZXNwYWNlcy4gCi0gICAqIEByZXR1cm4gQSBsaXN0IG9mIG5hbWVzcGFjZXMgdGhhdCBkb2VzIG5vdCBjb250YWluIGFueSBtZW1iZXJzIHdoaWNoIGFyZW4ndCBpbiB0aGUgdmFsaWRJbXBvcnROU3Mgc2V0LiAKLSAgICovIAotICBwcm90ZWN0ZWQgTGlzdCByZXN0cmljdEltcG9ydHMoTGlzdCBuYW1lc3BhY2VzLCBTZXQgdmFsaWRJbXBvcnROU3MpIAotICB7IAotICAgICAgICBJdGVyYXRvciBuc0l0ZXIgPSBuYW1lc3BhY2VzLml0ZXJhdG9yKCk7IAotICAgICAgICB3aGlsZShuc0l0ZXIuaGFzTmV4dCgpKSAKLSAgICAgICAgeyAKLSAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKW5zSXRlci5uZXh0KCk7IAotICAgICAgICAgIGlmKCF2YWxpZEltcG9ydE5Tcy5jb250YWlucyhucykpIAotICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5yZW1vdmUobnMpOyAKLQkJCQluc0l0ZXIgPSBuYW1lc3BhY2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgfSAKLSAgICAgICAgfSAKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZXM7IAotICB9IAotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIGlzIGluIHRoZSBsaXN0IG9mIHJlcXVpcmVkIG5hbWVzcGFjZXMsCi0gICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEBwYXJhbSByZXFucyBUaGUgbGlzdCBvZiBuYW1lc3BhY2VzIHRvIGNoZWNrIGZvciB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2VzIGlzIGluIHRoZSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1NPQVBFbmNvZGluZ1JlcXVpcmVkKExpc3QgcmVxbnMpCi0gIHsKLSAgICBpZiAocmVxbnMuY29udGFpbnMoU09BUF9FTkNPRElOR19VUkkpKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1OGYyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvSW5saW5lU2NoZW1hVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5FcnJvck1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogUGx1Z2luIHZhbGlkYXRvciBmb3IgdGhlIFdTREwgVmFsaWRhdGlvbiBmcmFtZXdvcmsuIFZhbGlkYXRlcyBpbmxpbmUgc2NoZW1hIGZvdW5kIGluIGEgV1NETCBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIElubGluZVNjaGVtYVZhbGlkYXRvciBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1dBUk5fT0xEX1NDSEVNQV9OQU1FU1BBQ0UgPSAiX1dBUk5fT0xEX1NDSEVNQV9OQU1FU1BBQ0UiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1NDSEVNQSA9ICJfV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1NDSEVNQSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBRVU9URSA9ICInIjsKLSAgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0b3IjdmFsaWRhdGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkxpc3QsIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUud3NkbDExLldTREwxMVZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGVsZW0gPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBlbGVtZW50OwotICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgcGFyZW50cy5nZXQocGFyZW50cy5zaXplKCkgLSAxKTsKLSAgICBTdHJpbmcgYmFzZUxvY2F0aW9uID0gd3NkbERlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0gICAgLy8gQWRkIGluIHRoZSBuYW1lc3BhY2VzIGRlZmluZWQgaW4gdGhlIGRvYyBhbHJlYWR5IHRoYXQgYXJlbid0IGRlZmluZWQgbG9jYWxseSBpbiB0aGlzIHNjaGVtYS4KLSAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGZvciBuYW1lc3BhY2VzIG90aGVyIHRoZW4gaW4gdGhlIGRlZmludGlvbnMgYW5kIHR5cGVzIGVsZW1lbnRzIGFzCi0gICAgLy8gaW5saW5lIHNjaGVtYSBjYW4gbm90IGhhdmUgYW55IG90aGVyIHBhcmVudHMgYW5kIG11c3QgaGF2ZSB0aGVyZSB0d28gcGFyZW50cy4KLSAgICAvLyBGaXJzdCB0YWtlIGNhcmUgb2YgdGhlIGRlZmluaXRpb25zIGVsZW1lbnQKLSAgICAKLSAgICAvLyBjcmVhdGUgdGhlIGlubGluZSBzY2hlbWEgc3RyaW5nCi0JRWxlbWVudCB3M2NlbGVtZW50ID0gZWxlbS5nZXRFbGVtZW50KCk7Ci0JSGFzaHRhYmxlIHBhcmVudG5hbWVzcGFjZXMgPSBnZXROYW1lc3BhY2VEZWNsYXJhdGlvbnNGcm9tUGFyZW50cyh3c2RsRGVmaW5pdGlvbix3M2NlbGVtZW50KTsKLQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gdzNjZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfVEFSR0VUX05BTUVTUEFDRSk7Ci0JLy8gaWYgdGhlIHRhcmdldE5hbWVzcGFjZSBoYXNuJ3QgYmVlbiBkZWZpbmVkIGZvciB0aGUgc2NoZW1hIHVzZSB0aGUgCi0JLy8gdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSBkZWZpbml0aW9ucyBlbGVtZW50Ci0JaWYodGFyZ2V0TmFtZXNwYWNlID09IG51bGwgfHwgdGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhFTVBUWV9TVFJJTkcpKQotCSB7Ci0JICB0YXJnZXROYW1lc3BhY2UgPSB3c2RsRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkgIHczY2VsZW1lbnQuc2V0QXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UsdGFyZ2V0TmFtZXNwYWNlKTsKLQl9Ci0JCi0gICAgLy8gSWYgdGhlIG5hbWVzcGFjZSBnaXZlbiBpcyBvbmUgb2YgdGhlIG9sZCBzY2hlbWEgbmFtZXNwYWNlcyBwcm9kdWNlIGEgd2FybmluZy4KLQlTdHJpbmcgbmFtZXNwYWNlID0gdzNjZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQlpZihuYW1lc3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpIHx8IG5hbWVzcGFjZS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCkpCi0JIHsKLQkgIHZhbEluZm8uYWRkV2FybmluZygKLQkgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfV0FSTl9PTERfU0NIRU1BX05BTUVTUEFDRSwgUVVPVEUgKyBDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxICsgUVVPVEUpLCBlbGVtZW50KTsKLQl9Ci0JCi0gICAgLy8gbm93IGNyZWF0ZSBhbmQgY2FsbCB0aGUgdmFsaWRhdG9yIGZvciB0aGUgaW5saW5lIHNjaGVtYQotICAgIFhTRFZhbGlkYXRvciBzY2hlbWF2ID0gbmV3IFhTRFZhbGlkYXRvcigpOwotICAgIAotICAgIC8vU3RyaW5nIGZpbGVMb2NhdGlvbiA9IG5ldyBVUkwodmFsaWRhdG9ybWFuYWdlci5nZXRGaWxlbmFtZSgpKS5nZXRQYXRoKCk7Ci0gICAgSW5saW5lWFNEUmVzb2x2ZXIgaW5saW5lRW50aXR5UmVzb2x2ZXIgPQotICAgICAgZ2V0RW50aXR5UmVzb2x2ZXIod3NkbERlZmluaXRpb24sIChUeXBlcykgcGFyZW50cy5nZXQoMCksIGJhc2VMb2NhdGlvbiwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAvLwlhZGQgaW4gdGhlIGV4dGVybmFsIFhTRCBDYXRhbG9nIHRvIHJlc29sdmUgc2NoZW1hcyBvZmZsaW5lCi0gICAgWE1MRW50aXR5UmVzb2x2ZXJDaGFpbiBlbnRpdHlSZXNvbHZlckNoYWluID0gbmV3IFhNTEVudGl0eVJlc29sdmVyQ2hhaW4oKTsKLSAgICBlbnRpdHlSZXNvbHZlckNoYWluLmFkZEVudGl0eVJlc29sdmVyKGlubGluZUVudGl0eVJlc29sdmVyKTsKLSAgICBlbnRpdHlSZXNvbHZlckNoYWluLmFkZEVudGl0eVJlc29sdmVyKChYTUxFbnRpdHlSZXNvbHZlcil2YWxJbmZvLmdldFVSSVJlc29sdmVyKCkpOwotICAgIC8vZW50aXR5UmVzb2x2ZXJDaGFpbi5hZGRFbnRpdHlSZXNvbHZlcihYTUxDYXRhbG9nUmVzb2x2ZXIuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgZW50aXR5UmVzb2x2ZXJDaGFpbi5hZGRFbnRpdHlSZXNvbHZlcihuZXcgRmlsZUVudGl0eVJlc29sdmVyKCkpOwotCQotICAgIC8vCSBDcmVhdGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5saW5lIHNjaGVtYS4gCi0gICAgU3RyaW5nIHhzZCA9IElubGluZVNjaGVtYUdlbmVyYXRvci5jcmVhdGVYU0RTdHJpbmcodzNjZWxlbWVudCwgZWxlbWVudHMsIGJhc2VMb2NhdGlvbiwgcGFyZW50bmFtZXNwYWNlcywgaW5saW5lRW50aXR5UmVzb2x2ZXIuZ2V0SW5saW5lU2NoZW1hTlNzKCkpOyAKLQotCQotICAgIHNjaGVtYXYudmFsaWRhdGVJbmxpbmVTY2hlbWEoeHNkLCB0YXJnZXROYW1lc3BhY2UsIGJhc2VMb2NhdGlvbiwgZW50aXR5UmVzb2x2ZXJDaGFpbiwgaW5saW5lRW50aXR5UmVzb2x2ZXIpOwotICAgIAotLy8JY2hlY2sgaWYgdGhlIFNPQVAgRW5jb2RpbmcgbmFtZXNwYWNlIGlzIHJlcXVpcmVkIGJ1dCBub3QgaW1wb3J0ZWQKLQkJIGlmIChJbmxpbmVTY2hlbWFHZW5lcmF0b3Iuc29hcEVuY29kaW5nUmVxdWlyZWROb3RJbXBvcnRlZChlbGVtLmdldEVsZW1lbnQoKSwgYmFzZUxvY2F0aW9uLCBwYXJlbnRuYW1lc3BhY2VzKSkKLQkJIHsKLQkJICAgdmFsSW5mby5hZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9XQVJOX1NPQVBFTkNfSU1QT1JURURfU0NIRU1BKSwgZWxlbWVudCk7Ci0JCSB9Ci0KLSAgICAvLyBJZiB0aGUgc2NoZW1hIGlzbid0IHZhbGlkIGFkZCB0aGUgZXJyb3IgbWVzc2FnZXMgcHJvZHVjZWQgdG8gdmFsaW5mby4KLSAgICAvLyBEb24ndCBhZGQgdGhlIGVycm9ycyBpZiB0aGV5IGFyZSBsb2NhdGVkIG9uIGFub3RoZXIgaW5saW5lIHNjaGVtYS4gVGhlc2UKLQkvLyB3aWxsIGJlIHJlcG9ydGVkIHdoZW4gdGhlIG90aGVyIHNjaGVtYSBpcyB2YWxpZGF0ZWQuCi0JCSAKLSAgICBpZiAoIXNjaGVtYXYuaXNWYWxpZCgpKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGVycm9ycyA9IHNjaGVtYXYuZ2V0RXJyb3JzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChlcnJvcnMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBFcnJvck1lc3NhZ2UgZXJyID0gKEVycm9yTWVzc2FnZSkgZXJyb3JzLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IGVyci5nZXRVUkkoKTsKLSAgICAgICAgaW50IGxpbmUgPSBlcnIuZ2V0RXJyb3JMaW5lKCk7Ci0gICAgICAgIFN0cmluZyBlcnJtZXNzID0gZXJyLmdldEVycm9yTWVzc2FnZSgpOwotICAgICAgICBlcnJtZXNzID0gcmVwbGFjZU5hbWVzcGFjZShlcnJtZXNzLCBuYW1lc3BhY2UpOwotICAgICAgICBpZihsaW5lID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmKHVyaSA9PSBudWxsIHx8IHVyaS5lcXVhbHModmFsSW5mby5nZXRGaWxlVVJJKCkpKQotICAgICAgICAgIHsKLQkJCXZhbEluZm8uYWRkRXJyb3IoZXJybWVzcywgZ2V0T2JqZWN0QXRMaW5lKGxpbmUgLSAxLCBlbGVtZW50cykpOwotICAgICAgICAgIH0KLQkJICBlbHNlIGlmKCFpbmxpbmVFbnRpdHlSZXNvbHZlci5pc0lubGluZVNjaGVtYSh1cmkpICYmICF1cmkuZXF1YWxzKHZhbEluZm8uZ2V0RmlsZVVSSSgpICsgSW5saW5lWFNEUmVzb2x2ZXIuSU5MSU5FX1NDSEVNQV9JRCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihlcnJtZXNzLCBsaW5lLCBlcnIuZ2V0RXJyb3JDb2x1bW4oKSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJZWxzZSBpZih1cmkgIT0gbnVsbCAmJiAhaW5saW5lRW50aXR5UmVzb2x2ZXIuaXNJbmxpbmVTY2hlbWEodXJpKSAmJiAhdXJpLmVxdWFscyh2YWxJbmZvLmdldEZpbGVVUkkoKSArIElubGluZVhTRFJlc29sdmVyLklOTElORV9TQ0hFTUFfSUQpKQotICAgICAgICB7Ci0JICAgICAgdmFsSW5mby5hZGRFcnJvcihlcnJtZXNzLCAwLDAsIHVyaSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gaWYgdGhlIHNjaGVtYSBpcyB2YWxpZCwgYXNzaWduIHRoZSBtb2RlbCB0byB0aGUgdmFsaWRhdG9ybWFuYWdlcgotICAgIGVsc2UKLSAgICB7Ci0gICAgICBYU01vZGVsIHhzTW9kZWwgPSBzY2hlbWF2LmdldFhTTW9kZWwoKTsKLSAgICAgIHZhbEluZm8uYWRkU2NoZW1hKHhzTW9kZWwpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYW4gZW50aXR5IHJlc29sdmVyIHRoYXQgd2lsbCByZXNvbHZlIGlubGluZSBzY2hlbWFzLiAgRXZlcnkgaW5saW5lIHNjaGVtYSBpcyBwcmVyZWdpc3RlcmVkIHdpdGgKLSAgICogdGhlIHJlc29sdmVyLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB0eXBlcyBUaGUgdHlwZXMgZWxlbWVudC4KLSAgICogQHBhcmFtIHJlZmVyZW5jZUxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgc2NoZW1hLgotICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXROYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYS4KLSAgICogQHJldHVybiBBbiBlbnRpdHkgcmVzb2x2ZXIgdGhhdCBjYW4gcmVzb2x2ZSBpbmxpbmUgc2NoZW1hcy4KLSAgICovCi0gIHByb3RlY3RlZCBJbmxpbmVYU0RSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcihEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBUeXBlcyB0eXBlcywgU3RyaW5nIHJlZmVyZW5jZUxvY2F0aW9uLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgSW5saW5lWFNEUmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIgPSBuZXcgSW5saW5lWFNEUmVzb2x2ZXIoKTsKLS8vICAgIGVudGl0eVJlc29sdmVyLnNldFJlZmVyZW5jZUxvY2F0aW9uKHJlZmVyZW5jZUxvY2F0aW9uKTsKLSAgICBMaXN0IHNjaGVtYXMgPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBpZiAoc2NoZW1hcyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGlTY2hlbWFzID0gc2NoZW1hcy5pdGVyYXRvcigpOwotCSAgU2V0IG5hbWVzcGFjZXMgPSBuZXcgVHJlZVNldCgpOyAKLSAgICAgIHdoaWxlIChpU2NoZW1hcy5oYXNOZXh0KCkpIAotICAgICAgeyAKLSAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBpU2NoZW1hcy5uZXh0KCk7IAotICAgICAgICBTdHJpbmcgdGhpc05hbWVzcGFjZSA9IGV4dEVsZW0uZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9UQVJHRVRfTkFNRVNQQUNFKTsgCi0gICAgICAgIGlmKHRoaXNOYW1lc3BhY2UgIT0gbnVsbCkgCi0gICAgICAgIHsgCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5hZGQodGhpc05hbWVzcGFjZSk7IAotICAgICAgICB9IAotICAgICAgfSAKLSAgICAgIGlTY2hlbWFzID0gc2NoZW1hcy5pdGVyYXRvcigpOyAKLQotICAgICAgd2hpbGUgKGlTY2hlbWFzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBpU2NoZW1hcy5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyB0aGlzTmFtZXNwYWNlID0gZXh0RWxlbS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgICBpZiAodGhpc05hbWVzcGFjZSAhPSBudWxsICYmICF0aGlzTmFtZXNwYWNlLmVxdWFsc0lnbm9yZUNhc2UodGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAJCi0gICAgICAgIAlFbGVtZW50IGVsZW1lbnQgPSBleHRFbGVtLmdldEVsZW1lbnQoKTsKLQkJCQotLy8JCQljcmVhdGUgdGhlIGlubGluZSBzY2hlbWEgc3RyaW5nCi0JCQkgLy9FbGVtZW50IHczY2VsZW1lbnQgPSBlbGVtLmdldEVsZW1lbnQoKTsKLQkJCSBIYXNodGFibGUgcGFyZW50bmFtZXNwYWNlcyA9IGdldE5hbWVzcGFjZURlY2xhcmF0aW9uc0Zyb21QYXJlbnRzKHdzZGxEZWZpbml0aW9uLGVsZW1lbnQpOwotCQkJIFN0cmluZyB4c2QgPSBJbmxpbmVTY2hlbWFHZW5lcmF0b3IuY3JlYXRlWFNEU3RyaW5nKGVsZW1lbnQsIG5ldyBBcnJheUxpc3QoKSwgcmVmZXJlbmNlTG9jYXRpb24sIHBhcmVudG5hbWVzcGFjZXMsIG5hbWVzcGFjZXMpOwotICAgICAgICAJLy9hZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNGcm9tUGFyZW50cyh3c2RsRGVmaW5pdGlvbixlbGVtZW50KTsKLSAgICAgICAgICBlbnRpdHlSZXNvbHZlci5hZGQodGhpc05hbWVzcGFjZSwgeHNkKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlbnRpdHlSZXNvbHZlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEudmFsaWRhdG9yLklXU0RMMTFWYWxpZGF0b3Ijc2V0UmVzb3VyY2VCdW5kbGUoamF2YS51dGlsLlJlc291cmNlQnVuZGxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgCW1lc3NhZ2VnZW5lcmF0b3IgPSBuZXcgTWVzc2FnZUdlbmVyYXRvcihyYik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VHZW5lcmF0b3IoTWVzc2FnZUdlbmVyYXRvciBtZXNzZ2VuKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1lc3NnZW47Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGFzIGluIHRoZSBmb3JtIAotICAgKiB4bWxucz0ic29tZW5hbWVzcGFjZSIKLSAgICogZnJvbSB0aGUgZGVmaW5pdGlvbnMgYW5kIHR5cGVzIGVsZW1lbnRzIGFuZCBhZGQgdGhlbSB0byB0aGUgc2NoZW1hIGVsZW1lbnQgc28gdGhlIHNjaGVtYSAKLSAgICogdmFsaWRhdG9yIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gdGhlbS4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgdHlwZXMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIGhhc2h0YWJsZSB3aXRoIHRoZSBuYW1lc3BhY2UgZWxlbWVudHMgZnJvbSB0aGUgZWxlbWVudHMgcHJvdmlkZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldE5hbWVzcGFjZURlY2xhcmF0aW9uc0Zyb21QYXJlbnRzKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAJSGFzaHRhYmxlIG5zcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBJdGVyYXRvciBuYW1lU3BhY2VzID0gd3NkbERlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICBTdHJpbmcgWE1MTlMgPSBDb25zdGFudHMuQVRUUl9YTUxOUzsKLSAgICAKLSAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSAiIjsKLSAgICB3aGlsZSAobmFtZVNwYWNlcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIG5zcHJlZml4ID0gWE1MTlM7Ci0gICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKSBuYW1lU3BhY2VzLm5leHQoKTsKLSAgICAgIGlmICghbnMuZXF1YWxzSWdub3JlQ2FzZSgiIikpCi0gICAgICB7Ci0gICAgICAgIG5zcHJlZml4ICs9ICI6IjsKLSAgICAgIH0KLSAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUobnNwcmVmaXggKyBucykpCi0gICAgICB7Ci0gICAgICAJbnNzLnB1dChuc3ByZWZpeCArIG5zLCB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2UobnMpKTsKLS8vICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuc3ByZWZpeCArIG5zLCB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2UobnMpKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICAvLyBOZXh0IGhhbmRsZSB0aGUgcGFyZW50IHR5cGVzIGVsZW1lbnQKLSAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgYXR0c2xlbmd0aCA9IGF0dHMuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTm9kZSB0ZW1wbm9kZSA9IGF0dHMuaXRlbShpKTsKLSAgICAgIFN0cmluZyBub2RlbmFtZSA9IHRlbXBub2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAvLyBpZiB0aGlzIGlzIGEgbmFtZXNwYWNlIGF0dHJpYnV0ZQotICAgICAgaWYgKG5vZGVuYW1lLmluZGV4T2YoWE1MTlMpICE9IC0xKQotICAgICAgewotCQluc3MucHV0KG5vZGVuYW1lLCAgdGVtcG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKG5vZGVuYW1lLCB0ZW1wbm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuc3M7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHaXZlbiBhIGxpbmUgbnVtYmVyIGZvciB0aGUgc2NoZW1hIHJldHVybnMgdGhlIGVsZW1lbnQgZm91bmQgb24gdGhhdCBsaW5lLiAKLSAgICogVXNlZnVsIGZvciBvYnRhaW5pbmcgZWxlbWVudHMgZnJvbSBzY2hlbWEgU3RyaW5ncy4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIG51bWJlciBmb3IgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGVsZW1lbnRzIFRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIGNoZWNrLgotICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgbG9jYXRlZCBhdCB0aGUgbGluZSBvciBhdCBsaW5lIDAgaWYgdGhlIGxpbmUgaXMgaW52YWxpZC4KLSAgICovCi0gICBwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdEF0TGluZShpbnQgbGluZSwgTGlzdCBlbGVtZW50cykKLSAgIHsKLSAgIAlpZihsaW5lIDwgMCB8fCBsaW5lID49IGVsZW1lbnRzLnNpemUoKSkKLSAgIAl7Ci0gICAJICBsaW5lID0gMDsKLSAgIAl9Ci0JcmV0dXJuIGVsZW1lbnRzLmdldChsaW5lKTsKLSAgIH0KLSAgIAotICAvKioKLSAgICogUmVwbGFjZSBhbnkgaW5zdGFuY2Ugb2YgdGhlIDIwMDEgc2NoZW1hIG5hbWVzcGFjZSBpbiB0aGUgZ2l2ZW4gbWVzc2FnZSB3aXRoCi0gICAqIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byByZXBsYWNlIHRoZSBuYW1lc3BhY2UgaW4uCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSB1c2VkIGZvciByZXBsYWNlbWVudC4KLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSB3aXRoIHRoZSAyMDAxIHNjaGVtYSBuYW1lc3BhY2UgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlcGxhY2VOYW1lc3BhY2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBuYW1lc3BhY2UpCi0gICB7Ci0gICAgIFN0cmluZyB4c2QyMDAxID0gQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMTsKLSAgICAgaW50IHN0YXJ0ID0gbWVzc2FnZS5pbmRleE9mKHhzZDIwMDEpOwotICAgICBpbnQgZW5kID0gc3RhcnQgKyB4c2QyMDAxLmxlbmd0aCgpOwotICAgICBpZihzdGFydCA8IDApCi0gICAgIHsKLSAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICAgfQotICAgICBTdHJpbmcgc3RhcnRTdHJpbmcgPSBtZXNzYWdlLnN1YnN0cmluZygwLHN0YXJ0KTsKLSAgICAgU3RyaW5nIGVuZFN0cmluZyA9IG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCxtZXNzYWdlLmxlbmd0aCgpKTsKLSAgICAgcmV0dXJuIHN0YXJ0U3RyaW5nICsgbmFtZXNwYWNlICsgZW5kU3RyaW5nOwotICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0lubGluZVhTRFJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvSW5saW5lWFNEUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4N2IzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvSW5saW5lWFNEUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEFuIFhNTEVudGl0eVJlc29sdmVyIHRoYXQgYWxsb3dzIGlubGluZSBzY2hlbWFzIHRvIHJlc29sdmUgZWFjaCBvdGhlciB0aHJvdWdoIGltcG9ydHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmxpbmVYU0RSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTElORV9TQ0hFTUFfSUQgPSAiI2lubGluZXNjaGVtYSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRklMRV9QUkVGSVggPSAiZmlsZToiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBlbnRpdGllcyA9IG5ldyBIYXNodGFibGUoKTsKLS8vICBwcm90ZWN0ZWQgU3RyaW5nIHJlZkxvY2F0aW9uID0gbnVsbDsKLSAgcHJvdGVjdGVkIFhNTEVudGl0eVJlc29sdmVyIGV4dGVybmFsUmVzb2x2ZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgWE1MSW5wdXRTb3VyY2UgcmVmZXJyaW5nU2NoZW1hSW5wdXRTb3VyY2UgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlZmVycmluZ1NjaGVtYU5hbWVzcGFjZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogQ29uc3R1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBJbmxpbmVYU0RSZXNvbHZlcigpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcikKLSAgICovCi0gIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByZXNvdXJjZUlkZW50aWZpZXIpCi0JCSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JU3RyaW5nIHN5c3RlbUlkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldEV4cGFuZGVkU3lzdGVtSWQoKTsJIAotCVN0cmluZyBwdWJsaWNJZCA9IHJlc291cmNlSWRlbnRpZmllci5nZXRQdWJsaWNJZCgpOwkKLQlTdHJpbmcgbmFtZXNwYWNlID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldE5hbWVzcGFjZSgpOwotCVhNTElucHV0U291cmNlIGlzID0gbnVsbDsKLQlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQlTdHJpbmcgc2NoZW1hID0gbnVsbDsKLQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkKLQl7Ci0JICBpZihwdWJsaWNJZCA9PSBudWxsKQotCSAgewotCSAgCWlmKG5hbWVzcGFjZSA9PSBudWxsKQotCSAgCXsJCi0JICAgICAgcmV0dXJuIG51bGw7Ci0JICAJfQotCSAgCWVsc2UKLQkgIAl7Ci0JICAJCXN5c3RlbUlkID0gbmFtZXNwYWNlOwotCSAgCX0KLQkgIH0KLQkgIGVsc2UKLQkgIHsJCi0JICAgIHN5c3RlbUlkID0gcHVibGljSWQ7Ci0JICB9Ci0JfQotCSAgCi0JaWYocmVmZXJyaW5nU2NoZW1hTmFtZXNwYWNlICE9IG51bGwgJiYgcmVmZXJyaW5nU2NoZW1hTmFtZXNwYWNlLmVxdWFscyhzeXN0ZW1JZCkpCi0JewotCQlpZihyZWZlcnJpbmdTY2hlbWFJbnB1dFNvdXJjZSE9bnVsbCkKLQkJewotCQkJcmV0dXJuIHJlZmVycmluZ1NjaGVtYUlucHV0U291cmNlOwotCQl9Ci0JfQotCWVsc2UgaWYgKChzY2hlbWEgPSAoU3RyaW5nKSBlbnRpdGllcy5nZXQoc3lzdGVtSWQpKSAhPSBudWxsICYmICFzY2hlbWEuZXF1YWxzKCIiKSkKLQl7Ci0JCWlzID0gbmV3IFhNTElucHV0U291cmNlKHB1YmxpY0lkLCByZWZlcnJpbmdTY2hlbWFJbnB1dFNvdXJjZS5nZXRTeXN0ZW1JZCgpICsgSU5MSU5FX1NDSEVNQV9JRCwgbnVsbCwgbmV3IFN0cmluZ1JlYWRlcihzY2hlbWEpLG51bGwpOwotCX0KLQkKLSAgICAvL2lmKGlzID09IG51bGwpCi0gICAgLy97Ci0gICAgLy8JdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0gICAgLy99Ci0JcmV0dXJuIGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBpbmxpbmUgc2NoZW1hLgotICAgKiAKLSAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSAtIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEKLSAgICogQHBhcmFtIHNjaGVtYSAtIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2hlbWEKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgc2NoZW1hKQotICB7Ci0gICAgZW50aXRpZXMucHV0KHRhcmdldE5hbWVzcGFjZSwgc2NoZW1hKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCB0aGUgcmVmZXJyaW5nIGlubGluZSBzY2hlbWEuIAotICAgKiAKLSAgICogQHBhcmFtIGlucHV0U291cmNlIC0gYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5saW5lIHNjaGVtYQotICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gdGhlIG5hbWVzcGFjZSBvZiB0aGUgaW5saW5lIHNjaGVtYQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUmVmZXJyaW5nU2NoZW1hKFhNTElucHV0U291cmNlIGlucHV0U291cmNlLCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgcmVmZXJyaW5nU2NoZW1hSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKLSAgICByZWZlcnJpbmdTY2hlbWFOYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZXNwYWNlIGNvcnJlc3BvbmRzIHRvIGFuIGlubGluZSBzY2hlbWEsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5hbWVzcGFjZSBjb3JyZXNwb25kcyB0byBhbiBpbmxpbmUgc2NoZW1hLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0lubGluZVNjaGVtYShTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgcmV0dXJuIGVudGl0aWVzLmNvbnRhaW5zS2V5KG5hbWVzcGFjZSk7Ci0gIH0KLSAgCi0gIC8qKiAKLSAgICogR2V0IHRoZSBzZXQgb2YgdGhlIGlubGluZSBzY2hlbWEgbmFtZXNwYWNlcy4gCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzZXQgb2YgdGhlIGlubGluZSBzY2hlbWEgbmFtZXNwYWNlcy4gCi0gICAqLyAKLSAgcHVibGljIFNldCBnZXRJbmxpbmVTY2hlbWFOU3MoKSAKLSAgeyAKLSAgICAgICAgcmV0dXJuIGVudGl0aWVzLmtleVNldCgpOyAKLSAgfSAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL1NjaGVtYUF0dHJpYnV0ZVRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvU2NoZW1hQXR0cmlidXRlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0M2UxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvU2NoZW1hQXR0cmlidXRlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cy5TY2hlbWFTeW1ib2xzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuU3ltYm9sVGFibGU7Ci0vKioKLSAqIFRoaXMgY2xhc3Mgd2lsbCBhbGxvdyB0aGUgY2FsbGluZyBjb2RlIHRvIHNlZSBpZiB0aGUgYXR0cmlidXRlIGlzIGRlZmluZWQgaW4gc2NoZW1hLgotICogVGhpcyBzZXJ2ZXMgYXMgc2NoZW1hIGZvciBzY2hlbWEuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFBdHRyaWJ1dGVUYWJsZSBleHRlbmRzIFN5bWJvbFRhYmxlCi17Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZVRhYmxlKCkKLSAgewotICAgIC8vIGFkZCBhbGwgb2YgdGhlIHN5Ym9scyB0byB0aGUgdGFibGUuIFNjaGVtYVN5bWJvbHMgcHJvYmFibHkgc2hvdWxkIGhhdmUKLSAgICAvLyBhIFN5bWJvbFRhYmxlIGZvciB0aGVzZSBidXQgaXQgZG9lc24ndAotCi0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RXT1BPVU5EQU5ZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVFdPUE9VTkRMT0NBTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RXT1BPVU5ET1RIRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UV09QT1VORFRBUkdFVE5TKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUE9VTkRBTEwpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9GQUxTRV8wKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVFJVRV8xKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfQU5ZU0lNUExFVFlQRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0FOWVRZUEUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9BTllVUkkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9CQVNFNjRCSU5BUlkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9CT09MRUFOKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfQllURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0NPTExBUFNFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREFURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RBVEVUSU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREFZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREVDSU1BTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RPVUJMRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RVUkFUSU9OKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRU5USVRZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRU5USVRJRVMpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9FWFRFTlNJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9GQUxTRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0ZMT0FUKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSEVYQklOQVJZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSUQpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9JRFJFRik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lEUkVGUyk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lOVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9MQU5HVUFHRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0xBWCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0xJU1QpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9MT05HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTkFNRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX05FR0FUSVZFSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX01PTlRIKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTU9OVEhEQVkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OQ05BTUUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OTVRPS0VOKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTk1UT0tFTlMpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT05ORUdBVElWRUlOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT05QT1NJVElWRUlOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT1JNQUxJWkVEU1RSSU5HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTk9UQVRJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9PUFRJT05BTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1BPU0lUSVZFSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1BSRVNFUlZFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUFJPSElCSVRFRCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1FOQU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUVVBTElGSUVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUkVQTEFDRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1JFUVVJUkVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUkVTVFJJQ1RJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TSE9SVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1NLSVApOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVFJJQ1QpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVFJJTkcpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVUJTVElUVVRJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9USU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVE9LRU4pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UUlVFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5CT1VOREVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5JT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9VTlFVQUxJRklFRCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1VOU0lHTkVEQllURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1VOU0lHTkVESU5UKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5TSUdORURMT05HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5TSUdORURTSE9SVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1lFQVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9ZRUFSTU9OVEgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvVmFsaWRhdGVFcnJvckhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9WYWxpZGF0ZUVycm9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzhmYzE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9WYWxpZGF0ZUVycm9ySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20zLkRPTUVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuRXJyb3JNZXNzYWdlOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFhNTEVycm9ySGFuZGxlciB0aGF0IGNhcHR1cmVzIGVycm9yIGZyb20gWGVyY2VzLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBYTUxFcnJvckhhbmRsZXIKLXsKLSAgQXJyYXlMaXN0IGVycm9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBlcnJvciBtZXNzYWdlcyBjcmVhdGVkIGJ5IFhlcmNlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVycm9ycyBsaXN0LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0RXJyb3JNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIHZhbGlkYXRpb24gbWVzc2FnZSBmcm9tIHRoZSBleGNlcHRpb24gYW5kIHNldmVyaXR5LgotICAgKiAKLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvci4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eS4KLSAgICogQHJldHVybiBBbiBlcnJvciBtZXNzYWdlLgotICAgKi8KLSAgcHJvdGVjdGVkIEVycm9yTWVzc2FnZSBjcmVhdGVWYWxpZGF0aW9uTWVzc2FnZUZvckV4Y2VwdGlvbihYTUxQYXJzZUV4Y2VwdGlvbiBlcnJvciwgaW50IHNldmVyaXR5KQotICB7Ci0gICAgU3RyaW5nIHVyaSA9IGVycm9yLmdldExpdGVyYWxTeXN0ZW1JZCgpOwotICAgIGlmKHVyaSA9PSBudWxsKQotICAgIHsKLSAgICAgIHVyaSA9IGVycm9yLmdldFB1YmxpY0lkKCk7Ci0gICAgfQotICAgIEVycm9yTWVzc2FnZSBlcnJvck1lc3NhZ2UgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0gICAgZXJyb3JNZXNzYWdlLnNldEVycm9yTGluZShlcnJvci5nZXRMaW5lTnVtYmVyKCkpOwotICAgIGVycm9yTWVzc2FnZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3IuZ2V0TWVzc2FnZSgpKTsKLSAgICBlcnJvck1lc3NhZ2Uuc2V0RXJyb3JDb2x1bW4oZXJyb3IuZ2V0Q29sdW1uTnVtYmVyKCkpOwotICAgIGVycm9yTWVzc2FnZS5zZXRVUkkodXJpKTsKLSAgICBlcnJvck1lc3NhZ2Uuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotICAgIHJldHVybiBlcnJvck1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciNlcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBYTklFeGNlcHRpb24KLSAgewotICAgIGVycm9yTGlzdC5hZGQoY3JlYXRlVmFsaWRhdGlvbk1lc3NhZ2VGb3JFeGNlcHRpb24oZXhjZXB0aW9uLCBET01FcnJvci5TRVZFUklUWV9FUlJPUikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXIjZmF0YWxFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICB7Ci0gICAgZXJyb3JMaXN0LmFkZChjcmVhdGVWYWxpZGF0aW9uTWVzc2FnZUZvckV4Y2VwdGlvbihleGNlcHRpb24sIERPTUVycm9yLlNFVkVSSVRZX0ZBVEFMX0VSUk9SKSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciN3YXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gIHsKLSAgICBlcnJvckxpc3QuYWRkKGNyZWF0ZVZhbGlkYXRpb25NZXNzYWdlRm9yRXhjZXB0aW9uKGV4Y2VwdGlvbiwgRE9NRXJyb3IuU0VWRVJJVFlfV0FSTklORykpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWE1MRW50aXR5UmVzb2x2ZXJDaGFpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL1hNTEVudGl0eVJlc29sdmVyQ2hhaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y5MzYxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWE1MRW50aXR5UmVzb2x2ZXJDaGFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEhhbmRsZSBhIGNoYWluIG9mIGVudGl0eSByZXNvbHZlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFbnRpdHlSZXNvbHZlckNoYWluIGltcGxlbWVudHMgWE1MRW50aXR5UmVzb2x2ZXIKLXsKLSAgcHJpdmF0ZSBMaXN0IGVudGl0eVJlc29sdmVycyA9IG5ldyBWZWN0b3IoKTsKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHhtbFJlc291cmNlSWRlbnRpZmllcikgdGhyb3dzIFhOSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFhNTElucHV0U291cmNlIGlzID0gbnVsbDsKLSAgICBJdGVyYXRvciBlbnRpdHlSZXNvbHZlckl0ZXIgPSBlbnRpdHlSZXNvbHZlcnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZW50aXR5UmVzb2x2ZXJJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IChYTUxFbnRpdHlSZXNvbHZlcillbnRpdHlSZXNvbHZlckl0ZXIubmV4dCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlzID0gZW50aXR5UmVzb2x2ZXIucmVzb2x2ZUVudGl0eSh4bWxSZXNvdXJjZUlkZW50aWZpZXIpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFhOSUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFRocm93IGFuZCBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSBpc24ndCBmb3VuZAotICAgIGlmIChpcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGxvY2F0ZSBmaWxlIik7Ci0gICAgfQotICAgIHJldHVybiBpczsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gZW50aXR5IHJlc29sdmVyIHRvIHRoaXMgY2hhaW4uCi0gICAqIAotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXIgVGhlIHJlc29sdmVyIHRvIGFkZCB0byB0aGUgY2hhaW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFbnRpdHlSZXNvbHZlcihYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikKLSAgewotICAgIGVudGl0eVJlc29sdmVycy5hZGQoZW50aXR5UmVzb2x2ZXIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWFNEVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWFNEVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDk3ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL1hTRFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2Q7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuWE1MR3JhbW1hclByZXBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTEdyYW1tYXJQb29sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWE1MR3JhbW1hckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyUG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWFNHcmFtbWFyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotCi0KLS8qKgotICogVmFsaWRhdGUgc2NoZW1hcyBmcm9tIGZpbGVzIG9yIFN0cmluZy4KLSAqLwotcHVibGljIGNsYXNzIFhTRFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIE5BTUVTUEFDRVNfRkVBVFVSRV9JRCA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTQ0hFTUFfVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BX0ZVTExfQ0hFQ0tJTkdfRkVBVFVSRV9JRCA9Ci0gICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYS1mdWxsLWNoZWNraW5nIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBDT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUl9JRCA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEZJTEVfUFJFRklYID0gImZpbGU6IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEFSR0VUTkFNRVNQQUNFID0gInRhcmdldE5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgSU1QT1JUID0gImltcG9ydCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BTE9DQVRJT04gPSAic2NoZW1hTG9jYXRpb24iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBpZ25vcmVOYW1lc3BhY2VzID0KLSAgICB7ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYSIgfTsKLQotICBwcm90ZWN0ZWQgWFNNb2RlbCB4c01vZGVsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkWFNEOwotICBwcm90ZWN0ZWQgTGlzdCBlcnJvcnM7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmlsZWxvY2F0aW9uOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBYU0RWYWxpZGF0b3IoKQotICB7Ci0gICAgeHNNb2RlbCA9IG51bGw7Ci0gICAgaXNWYWxpZFhTRCA9IGZhbHNlOwotICAgIGVycm9ycyA9IG51bGw7Ci0gIH0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIGFuIGlubGluZSBzY2hlbWEuCi0gICAqIAotICAgKiBAcGFyYW0gc2NoZW1hIEEgc2NoZW1hIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLgotICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBmaWxlbG9jIFRoZSB1cmkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgc2NoZW1hLgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGVJbmxpbmVTY2hlbWEoU3RyaW5nIHNjaGVtYSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU3RyaW5nIGZpbGVsb2MpCi0gIHsKLSAgICB2YWxpZGF0ZUlubGluZVNjaGVtYShzY2hlbWEsIHRhcmdldE5hbWVzcGFjZSwgZmlsZWxvYywgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSBhbiBpbmxpbmUgc2NoZW1hIGFuZCBzcGVjaWZ5IGFuIGVudGl0eSByZXNvbHZlci4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEgVGhpcyBzY2hlbWEgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuCi0gICAqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UgVGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGZpbGVsb2MgVGhlIHVyaSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgc2NoZW1hLgotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXJDaGFpbiBUaGUgZW50aXR5IHJlc29sdmVyIGNoYWluLgotICAgKiBAcGFyYW0gaW5saW5lU2NoZW1hRW50aXR5UmVzb2x2ZXIgQW4gaW5saW5lIHNjaGVtYSByZXNvbHZlciBmb3IgdGhpcyBzY2hlbWEuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUlubGluZVNjaGVtYSgKLSAgICBTdHJpbmcgc2NoZW1hLAotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgU3RyaW5nIGZpbGVsb2MsCi0gICAgWE1MRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXJDaGFpbiwKLSAgICBYTUxFbnRpdHlSZXNvbHZlciBpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlcikKLSAgewotICAgIGZpbGVsb2NhdGlvbiA9IGZpbGVsb2M7Ci0gICAgCi0gICAgdmFsaWRhdGVYU0Qoc2NoZW1hLCB0cnVlLCBlbnRpdHlSZXNvbHZlckNoYWluLHRhcmdldE5hbWVzcGFjZSwgaW5saW5lU2NoZW1hRW50aXR5UmVzb2x2ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBmaWxlIGxvY2F0ZWQgYXQgdGhlIHVyaSBzcGVjaWZpZWQgd2l0aCB0aGUgZ2l2ZW4gZW50aXR5IHJlc29sdmVyLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBBbiBhYnNvbHV0ZSB1cmkgZm9yIHRoZSBzY2hlbWEgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBlbnRpdHlSZXNvbHZlciBBbiBlbnRpdHkgcmVzb2x2ZXIgdG8gYmUgdXNlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKFN0cmluZyB1cmksIFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyKQotICB7Ci0gICAgdmFsaWRhdGVYU0QodXJpLCBmYWxzZSwgZW50aXR5UmVzb2x2ZXIsIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIHNjaGVtYS4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEgVGhlIHNjaGVtYSBvciBpdCdzIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gaW5saW5lWFNEIFRydWUgaWYgYW4gaW5saW5lIHNjaGVtYSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXIgQW4gZW50aXR5IHJlc29sdmVyIHRvIHVzZS4KLSAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hIGJlaW5nIHZhbGlkYXRlZC4KLSAgICogQHBhcmFtIGlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyIEFuIGlubGluZSBzY2hlbWEgZW50aXR5IHJlc29sdmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYU0QoU3RyaW5nIHNjaGVtYSwgYm9vbGVhbiBpbmxpbmVYU0QsIFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBYTUxFbnRpdHlSZXNvbHZlciBpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlcikKLSAgewotICAgIFZhbGlkYXRlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBWYWxpZGF0ZUVycm9ySGFuZGxlcigpOwotICAgIGVycm9ySGFuZGxlci5nZXRFcnJvck1lc3NhZ2VzKCkuY2xlYXIoKTsKLSAgICB0cnkKLSAgICB7Ci0JCVhNTEdyYW1tYXJQcmVwYXJzZXIgZ3JhbW1hclByZXBhcnNlciA9IG5ldyBYTUxHcmFtbWFyUHJlcGFyc2VyKCk7Ci0JCVhNTEdyYW1tYXJQb29sIGdyYW1tYXJQb29sID0gbmV3IFhNTEdyYW1tYXJQb29sSW1wbCgpOwotCQlncmFtbWFyUHJlcGFyc2VyLnNldEdyYW1tYXJQb29sKGdyYW1tYXJQb29sKTsKLQkgCi0gICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotICAgICAgaWYgKGVudGl0eVJlc29sdmVyICE9IG51bGwpCi0gICAgICB7Ci0JCWdyYW1tYXJQcmVwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIoZW50aXR5UmVzb2x2ZXIpOwotICAgICAgfQotCi0gICAgICB0cnkKLSAgICAgIHsKLQkJWE1MSW5wdXRTb3VyY2UgaXMgPSBudWxsOwotICAgICAgICAvLyB0aGlzIGFsbG93cyBzdXBwb3J0IGZvciB0aGUgaW5saW5lIHNjaGVtYSBpbiBXU0RMIGRvY3VtZW50cwotICAgICAgICBpZiAoaW5saW5lWFNEKQotICAgICAgICB7Ci0gICAgICAgIAkKLSAgICAgICAgCVJlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHNjaGVtYSk7Ci0JCQlpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShudWxsLGZpbGVsb2NhdGlvbixmaWxlbG9jYXRpb24scmVhZGVyLG51bGwpOwotCQkJCi0JCQkoKElubGluZVhTRFJlc29sdmVyKWlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyKS5hZGRSZWZlcnJpbmdTY2hlbWEoaXMsdGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICB9Ci0gICAgICAgIC8vIGdldCB0aGUgaW5wdXQgc291cmNlIGZvciBhbiBleHRlcm5hbCBzY2hlbWEgZmlsZQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShudWxsLHNjaGVtYSxzY2hlbWEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBncmFtbWFyUHJlcGFyc2VyLnJlZ2lzdGVyUHJlcGFyc2VyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BLG51bGwvKnNjaGVtYUxvYWRlciovKTsKLSAgICAgICAgWE1MR3JhbW1hckxvYWRlciBzY2hlbWFMb2FkZXIgPSBncmFtbWFyUHJlcGFyc2VyLmdldExvYWRlcihYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSk7Ci0KLQkJWFNHcmFtbWFyIGdyYW1tYXIgPSAoWFNHcmFtbWFyKWdyYW1tYXJQcmVwYXJzZXIucHJlcGFyc2VHcmFtbWFyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BLGlzKTsKLQkJeHNNb2RlbCA9IGdyYW1tYXIudG9YU01vZGVsKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vcGFyc2VyIHdpbGwgcmV0dXJuIG51bGwgcG9pbnRlciBleGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGlzIHN0cnVjdHVyYWxseSBpbnZhbGlkCi0gICAgICAgIC8vVE9ETzogbG9nIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgfQotCi0gICAgICBlcnJvcnMgPSBlcnJvckhhbmRsZXIuZ2V0RXJyb3JNZXNzYWdlcygpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICAgIGlmIChlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGlzVmFsaWRYU0QgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBYU01vZGVsIGNyZWF0ZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBYU01vZGVsIGNyZWF0ZWQuCi0gICAqLwotCi0gIHB1YmxpYyBYU01vZGVsIGdldFhTTW9kZWwoKQotICB7Ci0gIAlyZXR1cm4geHNNb2RlbDsKLSAgfQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzY2hlbWEgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2NoZW1hIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgewotICAgIHJldHVybiBpc1ZhbGlkWFNEOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZXJyb3IgbGlzdC4KLSAgICogCi0gICAqIEByZXR1cm4gQSBsaXN0IG9mIGVycm9yIGZyb20gdGhlIHNjaGVtYS4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEVycm9ycygpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9JV1NETDIwVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9JV1NETDIwVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzc5MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvSVdTREwyMFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDIwOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbkluZm87Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIHZhbGlkYXRvciBwbHVnZ2VkIGludG8gdGhlIFdTREwgMi4wIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGludGVyZmFjZSBJV1NETDIwVmFsaWRhdG9yCi17Ci0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGlzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJVmFsaWRhdGlvbkluZm8gdmFsSW5mbyk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcmVzb3VyY2UgYnVuZGxlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcmIgVGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDIwL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTgzYmQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDIwL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDIwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogQSByZWdpc3RyeSB0byBob2xkIGFsbCB0aGUgV1NETCAyLjAgdmFsaWRhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5Ci17Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBWYWxpZGF0b3JSZWdpc3RyeSB2ZXJJbnN0YW5jZTsKLQotICBwcm90ZWN0ZWQgTWFwIHZhbGlkYXRvclJlZyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgVmFsaWRhdG9yUmVnaXN0cnkoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5zdGFuY2Ugb2YgdGhpcyByZWdpc3RyeS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHRoaXMgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmICh2ZXJJbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZlckluc3RhbmNlID0gbmV3IFZhbGlkYXRvclJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIHJldHVybiB2ZXJJbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0aGlzIHZhbGlkYXRvciBkZWxlZ2F0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdGhlIHZhbGlkYXRvciBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAqIEBwYXJhbSB2YWxEZWxlZ2F0ZSBUaGUgdmFsaWRhdG9yIGRlbGVnYXRlIHRvIHJlZ2lzdGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSwgV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUgdmFsRGVsZWdhdGUpCi0gIHsKLSAgICAvLyBhbGxvdyB0aGUgbnVsbCBuYW1lc3BhY2UgYnV0IG1ha2UgaXQgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIHZhbGlkYXRvciB0byB0aGUgaGFzaHRhYmxlCi0gICAgdmFsaWRhdG9yUmVnLnB1dChuYW1lc3BhY2UsIHZhbERlbGVnYXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBc2sgZm9yIHRoZSB2YWxpZGF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlLiBJZiBub25lIGlzIGZvdW5kCi0gICAqIHJldHVybiBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIEByZXR1cm4gVGhlIFdTREwgMS4xIHZhbGlkYXRvciBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBJV1NETDIwVmFsaWRhdG9yIHF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIC8vIGlmIHRoZSBuYW1lc3BhY2UgaXMgbnVsbCBhbGxvdyBpdCBhbmQgdHJlYXQgaXQgYXMgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0gICAgV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUgZGVsZWdhdGUgPSAoV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUpdmFsaWRhdG9yUmVnLmdldChuYW1lc3BhY2UpOwotICAgIGlmKGRlbGVnYXRlICE9IG51bGwpCi0gICAgeyAgCi0gICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHRlbGxzIHdoZXRoZXIgYSB2YWxpZGF0b3IgZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlIGlzIHJlZ2lzdGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdG8gY2hlY2suCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbGlkYXRvciByZWdpc3RlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNSZWdpc3RlcmVkVmFsaWRhdG9yKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBpZiAocXVlcnlWYWxpZGF0b3JSZWdpc3RyeShuYW1lc3BhY2UpICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwQmFzaWNWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDIwL1dTREwyMEJhc2ljVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMzhjOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwQmFzaWNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMjA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLS8qKgotICogVmFsaWRhdGUgdGhlIGVsZW1lbnRzIGRlZmluZWQgaW4gYSBXU0RMIDEuMSBEb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIFdTREwyMEJhc2ljVmFsaWRhdG9yIGltcGxlbWVudHMgSVdTREwyMFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIE5BTUVTUEFDRVNfRkVBVFVSRV9JRCA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTQ0hFTUFfVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BX0ZVTExfQ0hFQ0tJTkdfRkVBVFVSRV9JRCA9Ci0gICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYS1mdWxsLWNoZWNraW5nIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBDT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUl9JRCA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNPQVBfRU5DT0RJTkdfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKLQotICBwcm90ZWN0ZWQgZmluYWwgaW50IEVMRU1FTlQgPSAwOwotICBwcm90ZWN0ZWQgZmluYWwgaW50IFRZUEUgPSAxOwotCi0gIC8vcHJvdGVjdGVkIFdTREwyMFZhbGlkYXRvckNvbnRyb2xsZXIgdmFsaWRhdG9yY29udHJvbGxlcjsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETDIwQmFzaWNWYWxpZGF0b3IoKQotICB7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnZhbGlkYXRvci5JV1NETDExVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLklWYWxpZGF0aW9uSW5mbykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgLy90aGlzLnZhbGlkYXRvcmNvbnRyb2xsZXIgPSB2YWxpZGF0b3Jjb250cm9sbGVyOwotICAgIC8vc2V0RGVmYXVsdFJlc291cmNlQnVuZGxlSWZOZWVkZWQodmFsaWRhdG9yY29udHJvbGxlcik7Ci0gIAkKLS8vICAgIERlZmluaXRpb25zIHdzZGxEZWZpbml0aW9ucyA9IChEZWZpbml0aW9ucyllbGVtZW50OwotLy8gICAgdmFsaWRhdGVUeXBlcyh3c2RsRGVmaW5pdGlvbnMsIHZhbEluZm8pOwotLy8gICAgdmFsaWRhdGVTZXJ2aWNlcyh3c2RsRGVmaW5pdGlvbnMsIHZhbEluZm8pOwotLy8gICAgdmFsaWRhdGVCaW5kaW5ncyh3c2RsRGVmaW5pdGlvbnMsIHZhbEluZm8pOwotLy8gICAgdmFsaWRhdGVJbnRlcmZhY2VzKHdzZGxEZWZpbml0aW9ucywgdmFsSW5mbyk7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBUYWtlcyBhIGxpc3Qgb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIGFuZCBjaGVja3MgaWYgdGhlcmUncyBhIHZhbGlkYXRvciAKLSAgICogYXNzb2NpYXRlZCB3aXRoIGVhY2ggZWxlbWVudCBhbmQgaWYgc28gY2FsbHMgdGhlIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZXh0ZW5zaWJpbGl0eUVsZW1lbnRzIFRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIuCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgZGVmbmludGlvbnMgZWxlbWVudCBmb3IgdGhpcyBkb2N1bWVudC4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QoCi0vLyAgICBMaXN0IHBhcmVudHMsCi0vLyAgICBFbGVtZW50SW5mb0l0ZW1bXSBleHRlbnNpYmlsaXR5RWxlbWVudHMsCi0vLyAgICBWYWxpZGF0aW9uSW5mbyB2YWxJbmZvLAotLy8gICAgRGVmaW5pdGlvbnMgd3NkbERlZmluaXRpb25zKQotLy8gIHsKLS8vICAgIC8vVE9ETzogZ2V0IHRoZSB2YWxpZGF0aW9uIGNvbnRyb2xsZXIgc3RhdGljYWxseSB0byBnZXQgdGhlIGV4dGVuc2liaWxpdHkgdmFsaWRhdG9yCi0vLy8vICAgIFZhbGlkYXRvclJlZ2lzdHJ5IHZlciA9IFZhbGlkYXRvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0vLy8vICAgIEl0ZXJhdG9yIGV4dEVsZW1zID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0vLy8vICAgIHdoaWxlIChleHRFbGVtcy5oYXNOZXh0KCkpCi0vLy8vICAgIHsKLS8vLy8gICAgICBFbGVtZW50SW5mb0l0ZW0gZWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtcy5uZXh0KCk7Ci0vLy8vICAgICAgLy8gICAgICBpZiAodmVyLmhhc1JlZ2lzdGVyZWRWYWxpZGF0b3IoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpLmdldE5hbWVzcGFjZVVSSSgpKSkKLS8vLy8gICAgICAvLyAgICAgIHsKLS8vLy8gICAgICB2YWxpZGF0b3Jjb250cm9sbGVyLnZhbGlkYXRlV1NETEVsZW1lbnQoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBlbGVtZW50LCBwYXJlbnRzKTsKLS8vLy8gICAgICAvL3Zlci5xdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKSkudmFsaWRhdGUoZWxlbWVudCwgcGFyZW50cywgdmFsaWRhdG9ybWFuYWdlcik7Ci0vLy8vICAgICAgLy8gICAgICB9Ci0vLy8vICAgIH0KLS8vICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoZSByZXNvdXJjZWJ1bmRsZSBoYXNuJ3QgYmVlbiBzZXQsIHNldCBpdCB0byB0aGUgb25lIHJlZ2lzdGVyZWQgd2l0aCB0aGUgVmFsaWRhdG9yQ29udHJvbGxlci4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3Jjb250cm9sbGVyIFRoZSB2YWxpZGF0b3IgY29udHJvbGxlciB0byBnZXQgdGhlIHJlc291cmNlIGJ1bmRsZSBmcm9tLgotICAgKi8KLS8vICBwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVzb3VyY2VCdW5kbGVJZk5lZWRlZChXU0RMMjBWYWxpZGF0b3JDb250cm9sbGVyIHZhbGlkYXRvcmNvbnRyb2xsZXIpCi0vLyAgewotLy8gICAgaWYgKG1lc3NhZ2VnZW5lcmF0b3IgPT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgc2V0UmVzb3VyY2VCdW5kbGUodmFsaWRhdG9yY29udHJvbGxlci5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKLS8vICAgIH0KLS8vICB9Ci0gIC8qKgotICAgKiBTZXQgdGhlIHJlc291cmNlYnVuZGxlIHRvIHRoZSBvbmUgc3BlY2lmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIHJiIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IHRoZSBUeXBlcyBlbGVtZW50IGlzIGNvcnJlY3QuIAotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50IGZyb20gdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0gICAqLwotCi0vLyAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUeXBlcyhEZWZpbml0aW9ucyB3c2RsRGVmaW5pdGlvbnMsIFZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0vLyAgewotLy8gICAgVHlwZXMgdHlwZXMgPSB3c2RsRGVmaW5pdGlvbnMuZ2V0VHlwZXMoKTsKLS8vICAgIC8vIGVuc3VyZSB0aGF0IHR5cGVzIGlzIGRlZmluZWQKLS8vICAgIGlmICh0eXBlcyAhPSBudWxsKQotLy8gICAgewotLy8gICAgICBMaXN0IHBhcmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0vLyAgICAgIHBhcmVudHMuYWRkKHdzZGxEZWZpbml0aW9ucyk7Ci0vLyAgICAgIEVsZW1lbnRJbmZvSXRlbSBlbGVtZW50SW5mb0l0ZW1zW10gPSB0eXBlcy5nZXRFbGVtZW50SW5mb0l0ZW1zKCk7Ci0vLyAgICAgIHBhcmVudHMuYWRkKDAsIHR5cGVzKTsKLS8vICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgZWxlbWVudEluZm9JdGVtcywgdmFsSW5mbywgd3NkbERlZmluaXRpb25zKTsKLS8vICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgYWxsIG9mIHRoZSBkZWNsYXJlZCBzZXJ2aWNlcyBmb3IgdGhlIGRlZmluaXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb25zIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFZhbGlkYXRpb24gaW5mbyBmb3IgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTZXJ2aWNlcyhEZWZpbml0aW9ucyB3c2RsRGVmaW5pdGlvbnMsIFZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0vLyAgewotLy8KLS8vICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB0aGF0IHRoZSBiaW5kaW5ncyByZWZlciB0byB2YWxpZCBpbnRlcmZhY2VzIGFuZCBhbGwgb2YgdGhlIG9wZXJhdGlvbnMKLSAgICogaW4gYSBnaXZlbiBiaW5kaW5nIHJlZmVyIHRvIGEgZGVmaW5lZCBvcGVyYXRpb24gd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nCi0gICAqIGludGVyZmFjZXMuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb25zIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFZhbGlkYXRpb24gaW5mbyBmb3IgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVCaW5kaW5ncyhEZWZpbml0aW9ucyB3c2RsRGVmaW5pdGlvbnMsIFZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0vLyAgewotLy8KLS8vICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHRoYXQgYWxsIG9mIHRoZSBJbnRlcmZhY2VzIGhhdmUgdmFsaWQgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZWlyCi0gICAqIG9wZXJhdGlvbiBpbnB1dCwgb3V0cHV0LCBpbmZhdWx0IGFuZCBvdXRmYXVsdCB0eXBlcy4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbnMgVGhlIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVmFsaWRhdGlvbiBpbmZvIGZvciB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotICAgKi8KLS8vICBwcml2YXRlIHZvaWQgdmFsaWRhdGVJbnRlcmZhY2VzKERlZmluaXRpb25zIHdzZGxEZWZpbml0aW9ucywgVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLS8vICB7Ci0vLyAgICAKLS8vICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBuYW1lIGlzIGRlZmluZWQgaW4gdGhlIG5hbWVzcGFjZSBmb3IgdGhlIHBhcnQuICBBIHBhcnQgaXMgYW4KLSAgICogRUxFTUVOVCBpbiBXU0RMIDIuMC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSB0byBjaGVjay4KLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gY2hlY2suCi0gICAqIEBwYXJhbSB2YWxJbmZvIFZhbGlkYXRpb24gaW5mbyBmb3IgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwYXJ0IGVsZW1lbnQgaXMgZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tNZXNzYWdlKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBJVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotCi0gICAgYm9vbGVhbiBwYXJ0dmFsaWQgPSBmYWxzZTsKLS8vICAgIC8vIGZpcnN0IHRha2UgY2FyZSBvZiB0aGUgc2l0dWF0aW9uIHdoZXJlIGl0J3Mgc2NoZW1hIGZvciBzY2hlbWEKLS8vICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzSWdub3JlQ2FzZShTY2hlbWFTeW1ib2xzLlVSSV9TQ0hFTUFGT1JTQ0hFTUEpKQotLy8gICAgewotLy8gICAgICBTY2hlbWFBdHRyaWJ1dGVUYWJsZSB4c2RUYWJsZSA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVUYWJsZSgpOwotLy8gICAgICBpZiAoeHNkVGFibGUuY29udGFpbnNTeW1ib2wobmFtZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICAvLyBjaGVjayBpbmxpbmUgYW5kIGltcG9ydGVkIHNjaGVtYQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICBMaXN0IHNjaGVtYXMgPSB2YWxpZGF0b3Jjb250cm9sbGVyLmdldFNjaGVtYXMoKTsKLS8vICAgICAgSXRlcmF0b3Igc2NoZW1hc0l0ZXIgPSBzY2hlbWFzLml0ZXJhdG9yKCk7Ci0vLyAgICAgIHdoaWxlIChzY2hlbWFzSXRlci5oYXNOZXh0KCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBYU01vZGVsIHNjaGVtYSA9IChYU01vZGVsKXNjaGVtYXNJdGVyLm5leHQoKTsKLS8vICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgaWYgKHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb24obmFtZSwgbmFtZXNwYWNlKSAhPSBudWxsKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotLy8gICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgCi0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgLy8gSWYgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgaW1wb3J0ZWQgZG8gc28gbm93LgotICAgIC8vIEFsbG93IHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSB0byBiZSBhdXRvbWF0aWNhbGx5IGltcG9ydGVkIGJ1dCBtYXJrIGl0IGFzIGEgd2FybmluZy4KLS8vICAgIGlmICghcGFydHZhbGlkICYmIG5hbWVzcGFjZS5lcXVhbHMoU09BUF9FTkNPRElOR19VUkkpKQotLy8gICAgewotLy8gICAgICB0cnkKLS8vICAgICAgewotLy8gICAgICAgIFhTRFZhbGlkYXRvciB4c2RWYWwgPSBuZXcgWFNEVmFsaWRhdG9yKCk7Ci0vLyAgICAgICAgeHNkVmFsLnZhbGlkYXRlKFhNTENhdGFsb2cuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlRW50aXR5TG9jYXRpb24oU09BUF9FTkNPRElOR19VUkksIG51bGwpLCBudWxsKTsKLS8vICAgICAgICAvLyBzYW5pdHkgY2hlY2sgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZwotLy8gICAgICAgIGlmICh4c2RWYWwuaXNWYWxpZCgpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFhTTW9kZWwgeHNNb2RlbCA9IHhzZFZhbC5nZXRYU01vZGVsKCk7Ci0vLwotLy8gICAgICAgICAgaWYgKHhzTW9kZWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKG5hbWUsIG5hbWVzcGFjZSkgIT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcGFydHZhbGlkID0gdHJ1ZTsKLS8vICAgICAgICAgIH0KLS8vCi0vLyAgICAgICAgICB2YWxpZGF0b3Jjb250cm9sbGVyLmFkZFdhcm5pbmdNZXNzYWdlKAotLy8gICAgICAgICAgICBwYXJ0T2JqZWN0LAotLy8gICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX1dBUk5fU09BUEVOQ19JTVBPUlRFRF9QQVJUIiwgIiciICsgbmFtZSArICInIikpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0vLyAgICAgIHsKLS8vICAgICAgICAvL1RPRE86IGxvZyB0aGUgZXJyb3IgbWVzc2FnZQotLy8gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgcmV0dXJuIHBhcnR2YWxpZDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9XU0RMMjBWYWxpZGF0b3JDb250cm9sbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9XU0RMMjBWYWxpZGF0b3JDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MTc1Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwVmFsaWRhdG9yQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwyMDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklXU0RMVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZXhjZXB0aW9uLlZhbGlkYXRlV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaXMgdGhlIGhlYWQgb2YgdmFsaWRhdGlvbi4gSGFzIG1ldGhvZHMgZm9yIGdldHRpbmcgCi0gKiBleHRlbnNpb24gdmFsaWRhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFdTREwyMFZhbGlkYXRvckNvbnRyb2xsZXIgaW1wbGVtZW50cyBJV1NETFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9XQVJOX05PX1ZBTERJQVRPUiA9ICJfV0FSTl9OT19WQUxESUFUT1IiOwotICBwcm90ZWN0ZWQgZmluYWwgaW50IEVSUk9SX01FU1NBR0UgPSAwOwotICBwcm90ZWN0ZWQgZmluYWwgaW50IFdBUk5JTkdfTUVTU0FHRSA9IDE7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmlsZVVSSTsKLSAgcHJvdGVjdGVkIExpc3Qgc2NoZW1hcyA9IG5ldyBWZWN0b3IoKTsKLS8vICBwcm90ZWN0ZWQgRGVmaW5pdGlvbnMgd3NkbERlZmluaXRpb247Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgZWxlbWVudExvY2F0aW9ucyA9IG51bGw7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZWJ1bmRsZTsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvciA9IG51bGw7Ci0gIC8vcHJvdGVjdGVkIFZhbGlkYXRpb25Db250cm9sbGVyIHZhbGlkYXRpb25Db250cm9sbGVyOwotICBwcm90ZWN0ZWQgVmFsaWRhdG9yUmVnaXN0cnkgdmVyID0gVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZXJyb3JzID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHJiIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0IGZvciB0aGlzIGNvbnRyb2xsZXIuCi0gICAqLwotICBwdWJsaWMgV1NETDIwVmFsaWRhdG9yQ29udHJvbGxlcihSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIHNldFJlc291cmNlQnVuZGxlKHJiKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLklXU0RMVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy53M2MuZG9tLkRvY3VtZW50LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLlZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoRG9jdW1lbnQgZG9tTW9kZWwsIElWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKSB0aHJvd3MgVmFsaWRhdGVXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICAvLyByZXNldCB0aGUgdmFyaWFibGVzCi0gICAgLy9yZXNldCgpOwotICAgIGZpbGVVUkkgPSB2YWxJbmZvLmdldEZpbGVVUkkoKTsKLSAgICAvL3RoaXMudmFsaWRhdGlvbkNvbnRyb2xsZXIgPSB2YWxpZGF0aW9uY29udHJvbGxlcjsKLQotICAgIAotLy8gICAgTGlzdCByZWFkZXJFcnJvcnMgPSByZWFkV1NETERvY3VtZW50KGRvbU1vZGVsLCBmaWxlVVJJLCBnZXRNZXNzYWdlR2VuZXJhdG9yKCkpOwotICAgIC8vCQloYW5kbGUgYW55IHJlYWRlciBlcnJvcnMKLS8vICAgIGlmIChyZWFkZXJFcnJvcnMgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgSXRlcmF0b3IgcmVhZGVyRXJyb3JzSSA9IHJlYWRlckVycm9ycy5pdGVyYXRvcigpOwotLy8gICAgICB3aGlsZSAocmVhZGVyRXJyb3JzSS5oYXNOZXh0KCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBSZWFkZXJFcnJvciByZSA9IChSZWFkZXJFcnJvcilyZWFkZXJFcnJvcnNJLm5leHQoKTsKLS8vICAgICAgICB2YWxJbmZvLmFkZEVycm9yKHJlLmdldE1lc3NhZ2UoKSwgcmUuZ2V0TGluZSgpLCByZS5nZXRDb2x1bW4oKSwgcmUuZ2V0RmlsZVVSSSgpKTsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgdmFsaWRhdGVXU0RMRWxlbWVudChDb25zdGFudHMuTlNfVVJJX1dTREwsIHdzZGxEZWZpbml0aW9uLCBuZXcgVmVjdG9yKCksIHZhbEluZm8pOwotICB9Ci0gIAotICAvKioKLSAgICogUmVhZCBpbiB0aGUgV1NETCBkb2N1bWVudCBhbmQgc2V0IHRoZSBtb2RlbCBhbmQgaW1wb3J0ZWQgc2NoZW1hcy4KLSAgICogCi0gICAqIEBwYXJhbSBkb21Nb2RlbCBBIERPTSBkb2N1bWVudCBtb2RlbCBvZiB0aGUgZmlsZSB0byBiZSByZWFkLgotICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byByZWFkLgotICAgKiBAcGFyYW0gbWVzc2FnZWdlbmVyYXRvciBUaGUgbWVzc2FnZWdlbmVyYXRvciB0aGUgcmVhZGVyIHNob3VsZCB1c2UgZm9yIGFueSBtZXNzYWdlcyBwcm9kdWNlZC4KLSAgICogQHRocm93cyBWYWxpZGF0ZVdTRExFeGNlcHRpb24KLSAgICogQHJldHVybiBBIGxpc3Qgb2YgcmVhZGVyIGVycm9ycy4KLSAgICovCi0vLyAgcHJvdGVjdGVkIExpc3QgcmVhZFdTRExEb2N1bWVudChEb2N1bWVudCBkb21Nb2RlbCwgU3RyaW5nIGZpbGUsIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcikgdGhyb3dzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbgotLy8gIHsKLS8vICAgIExpc3QgcmVhZGVyRXJyb3JzID0gbnVsbDsKLS8vICAgIHRyeQotLy8gICAgewotLy8KLS8vICAgICAgV1NETFJlYWRlckltcGwgd3NkbFJlYWRlciA9IG5ldyBXU0RMUmVhZGVySW1wbCgpOwotLy8gICAgICB3c2RsRGVmaW5pdGlvbiA9IHdzZGxSZWFkZXIucmVhZFdTREwoZmlsZSwgZG9tTW9kZWwpOwotLy8KLS8vICAgICAgcmVhZGVyRXJyb3JzID0gd3NkbFJlYWRlci5nZXRSZWFkZXJFcnJvcnMoKTsKLS8vCi0vLyAgICB9Ci0vLyAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotLy8gICAgewotLy8gICAgICB0aHJvdyBuZXcgVmFsaWRhdGVXU0RMRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpIC8qKyAiICIgKyBlLmdldEZhdWx0Q29kZSgpKi8pOwotLy8gICAgfQotLy8KLS8vICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLS8vICAgIHsKLS8vICAgICAgdGhyb3cgbmV3IFZhbGlkYXRlV1NETEV4Y2VwdGlvbigidW5hYmxlIHRvIHJlYWQgZmlsZSIgKyBlLmdldE1lc3NhZ2UoKSArICIgIiArIGUudG9TdHJpbmcoKSk7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gcmVhZGVyRXJyb3JzOwotLy8gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSBXU0RMIGVsZW1lbnQsIGNhbGwgVmFsaWRhdGVFbGVtZW50IGZvciBpdC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgZm9yIHRoaXMgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlV1NETEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBJV1NETDIwVmFsaWRhdG9yIHZhbCA9IHZlci5xdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KG5hbWVzcGFjZSk7Ci0gICAgaWYgKHZhbCAhPSBudWxsKQotICAgIHsKLSAgICAgIHZhbC52YWxpZGF0ZShlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vdmFsSW5mby5hZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9XQVJOX05PX1ZBTERJQVRPUiwgbmFtZXNwYWNlKSwgZWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHNjaGVtYSB0byB0aGUgbGlzdCBvZiBzY2hlbWFzLgotICAgKiAKLSAgICogQHBhcmFtIHhzTW9kZWwgVGhlIHNjaGVtYSB0byBhZGQuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZFNjaGVtYShYU01vZGVsIHhzTW9kZWwpCi0vLyAgewotLy8gICAgaWYgKHhzTW9kZWwgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgc2NoZW1hcy5hZGQoeHNNb2RlbCk7Ci0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxpc3QgY29udGFpbmluZyB0aGUgc2NoZW1hcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2Ygc2NoZW1hcy4KLSAgICovCi0vLyAgcHVibGljIExpc3QgZ2V0U2NoZW1hcygpCi0vLyAgewotLy8gICAgcmV0dXJuIHNjaGVtYXM7Ci0vLyAgfQotCi0gIC8qKgotICAJKiBHZXQgdGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIFZhbGlkYXRvck1hbmFnZXIuCi0gIAkqIAotICAJKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBidW5kbGUgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAJKiBAc2VlICNzZXRSZXNvdXJjZUJ1bmRsZQotICAJKi8KLSAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZWJ1bmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIFZhbGlkYXRvck1hbmFnZXIuCi0gICAqIAotICAgKiBAcGFyYW0gcmIgVGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQuCi0gICAqIEBzZWUgI2dldFJlc291cmNlQnVuZGxlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIGlmIChyYiAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc291cmNlYnVuZGxlID0gcmI7Ci0gICAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWVzc2FnZSBnZW5lcmF0b3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VHZW5lcmF0b3IgZ2V0TWVzc2FnZUdlbmVyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZWdlbmVyYXRvcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGZpbGVuYW1lIGZvciB0aGUgZmlsZSBjdXJyZW50bHkgYmVpbmcgdmFsaWRhdGVkLiBTb21lIHZhbGlkYXRvcnMgcmVxdWlyZSB0aGlzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZmlsZW5hbWUgZm9yIHRoZSBmaWxlIGJlaW5nIHZhbGlkYXRlZC4KLSAgICovCi0vLyAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpCi0vLyAgewotLy8gICAgcmV0dXJuIGZpbGVVUkk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgZXJyb3IgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYWRkIHRoZSBlcnJvciBmb3IuCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IgdG8gYWRkLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRFcnJvck1lc3NhZ2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGVycm9yKQotLy8gIHsKLS8vICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKEVSUk9SX01FU1NBR0UsIG9iamVjdCwgZXJyb3IpOwotLy8gICAgZXJyb3JzID0gdHJ1ZTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCBlcnJvciBtZXNzYWdlcyB3aGVuIHRoZXkga25vdwotICAgKiBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZEVycm9yTWVzc2FnZShpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIGVycm9yKQotLy8gIHsKLS8vICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKEVSUk9SX01FU1NBR0UsIGxpbmUsIGNvbHVtbiwgZXJyb3IpOwotLy8gICAgZXJyb3JzID0gdHJ1ZTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgd2FybmluZyBtZXNzYWdlLgotICAgKiBAcGFyYW0gd2FybmluZyBUaGUgd2FybmluZyBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nTWVzc2FnZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgd2FybmluZykKLS8vICB7Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShXQVJOSU5HX01FU1NBR0UsIG9iamVjdCwgd2FybmluZyk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgd2FybmluZyBtZXNzYWdlcyB3aGVuIHRoZXkga25vdwotICAgKiBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gd2FybmluZyBUaGUgd2FybmluZyBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nTWVzc2FnZShpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHdhcm5pbmcpCi0vLyAgewotLy8gICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoV0FSTklOR19NRVNTQUdFLCBsaW5lLCBjb2x1bW4sIHdhcm5pbmcpOwotLy8gIH0KLQotICAvKioKLSAgICogSWYgeW91IGhhdmUgYW4gb2JqZWN0IHJlYWQgaW4gYnkgdGhlIHJlYWRlciBmb3IgdGhpcwotICAgKiB2YWxpZGF0b3Jjb250cm9sbGVyIHRoZSBvYmplY3QgY2FuIGJlIHBhc3NlZCBpbiBoZXJlIGFuZCB0aGUgbGluZSBhbmQgY29sdW1uCi0gICAqIGluZm9ybWF0aW9uIHdpbGwgYmUgYWJzdHJhY3RlZCBmcm9tIGl0LgotICAgKiAKLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgbWVzc2FnZSB0byBhZGQuCi0gICAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGVycm9yICh1c2VkIHRvIGdldCB0aGUgbG9jYXRpb24pLgotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gICAqLwotLy8gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKGludCB0eXBlLCBPYmplY3QgbywgU3RyaW5nIG1lc3NhZ2UpCi0vLyAgewotLy8gICAgVmFsaWRhdGFibGVFbGVtZW50IHZlID0gKFZhbGlkYXRhYmxlRWxlbWVudClvOwotLy8vLyAgICBpbnRbXSBsb2NhdGlvbjsKLS8vLy8gICAgaWYgKGVsZW1lbnRMb2NhdGlvbnMuY29udGFpbnNLZXkobykpCi0vLy8vICAgIHsKLS8vLy8gICAgICBsb2NhdGlvbiA9IChpbnRbXSllbGVtZW50TG9jYXRpb25zLmdldChvKTsKLS8vLy8gICAgfQotLy8vLyAgICAvLyBpZiB3ZSBnaXZlIGl0IGFuIGVsZW1lbnQgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkIHdlJ2xsIHNldCB0aGUgbG9jYXRpb24KLS8vLy8gICAgLy8gYXQgKDAsMCkgc28gdGhlIGVycm9yIHNob3dzIHVwIGJ1dCBubyBsaW5lIG1hcmtlciBpbiB0aGUgZWRpdG9yCi0vLy8vICAgIGVsc2UKLS8vLy8gICAgewotLy8vLyAgICAgIGxvY2F0aW9uID0gbmV3IGludFtdIHsgMCwgMCB9OwotLy8vLyAgICB9Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZSh0eXBlLCB2ZS5nZXRMaW5lKCksIHZlLmdldENvbHVtbigpLCBtZXNzYWdlKTsKLS8vICB9Ci0KLSAgLyoqCi0gICAgKiBDcmVhdGVzIGEgdmFsaWRhdGlvbiBtZXNzYWdlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAqIAotICAJKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gYWRkLgotICAJKiBAcGFyYW0gbGluZSBUaGUgbGluZSB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAJKiBAcGFyYW0gY29sdW1uIFRoZSBsaW5lIHdoZXJlIHRoZSBjb2x1bW4gbWVzc2FnZSBpcyBsb2NhdGVkLgotICAJKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gIAkqLwotLy8gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKGludCB0eXBlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIG1lc3NhZ2UpCi0vLyAgewotLy8gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgaWYgKHR5cGUgPT0gRVJST1JfTUVTU0FHRSkKLS8vICAgICAgewotLy8gICAgICAgIHZhbGlkYXRpb25Db250cm9sbGVyLmFkZEVycm9yTWVzc2FnZShsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gV0FSTklOR19NRVNTQUdFKQotLy8gICAgICB7Ci0vLyAgICAgICAgdmFsaWRhdGlvbkNvbnRyb2xsZXIuYWRkV2FybmluZ01lc3NhZ2UobGluZSwgY29sdW1uLCBtZXNzYWdlKTsKLS8vICAgICAgfQotLy8gICAgfQotLy8gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmNvbnRyb2xsZXIuSVdTRExWYWxpZGF0b3IjaXNWYWxpZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgewotICAgIHJldHVybiAhZXJyb3JzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IHRoZSB2YWxpZGF0b3IgY29udHJvbGxlci4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoKQotLy8gIHsKLS8vICAgIHNjaGVtYXMgPSBuZXcgVmVjdG9yKCk7Ci0vLyAgICBmaWxlVVJJID0gIiI7Ci0vLyAgICB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0vLyAgICBlbGVtZW50TG9jYXRpb25zID0gbnVsbDsKLS8vICAgIHJlc291cmNlYnVuZGxlID0gbnVsbDsKLS8vICAgIC8vdmFsaWRhdGlvbkNvbnRyb2xsZXIgPSBudWxsOwotLy8gICAgZXJyb3JzID0gZmFsc2U7Ci0vLyAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDIwL1dTREwyMFZhbGlkYXRvckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NjFmN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwyMDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0KLS8qKgotICogVGhlIFdTREwgMS4xIHZhbGlkYXRvciBkZWxlZ2F0ZSBob2xkcyBhIHJlZmVyZW5jZSB0byBhIHZhbGlkYXRvciB0byBiZSBpbnN0YW50aWF0ZWQgYXQKLSAqIGEgbGF0ZXIgcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMjBWYWxpZGF0b3JEZWxlZ2F0ZQotewotICBwcml2YXRlIFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyByZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0gIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOwotICBwcml2YXRlIElXU0RMMjBWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgZGVsZWdhdGUgZm9yIGEgdmFsaWRhdG9yIGJ5IGl0cyBjbGFzcyBuYW1lIGFuZCByZXNvdXJjZSBidW5kbGUgbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUoU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSwgU3RyaW5nIHJlc291cmNlQnVuZGxlKQotICB7Ci0gICAgdGhpcy52YWxpZGF0b3JDbGFzc25hbWUgPSB2YWxpZGF0b3JDbGFzc25hbWU7Ci0gICAgdGhpcy5yZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIGRlbGVnYXRlIGZvciBhIHZhbGlkYXRvciBieSBpdHMgY2xhc3MgbmFtZSwgcmVzb3VyY2UgYnVuZGxlIG5hbWUgYW5kIAotICAgKiBhIGNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSB2YWxpZGF0b3IgYW5kIGJ1bmRsZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgY2xhc3MgbG9hZGVyIHRvIHVzZSB0byBsb2FkIHRoZSB2YWxpZGF0b3IgYW5kIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBXU0RMMjBWYWxpZGF0b3JEZWxlZ2F0ZShTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lLCBTdHJpbmcgcmVzb3VyY2VCdW5kbGUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICB7Ci0gICAgdGhpcyh2YWxpZGF0b3JDbGFzc25hbWUsIHJlc291cmNlQnVuZGxlKTsKLSAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGluIHRoaXMgZGVsZWdhdGUuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBXU0RMIDEuMSB2YWxpZGF0b3Igc3BlY2lmaWVkIGJ5IHRoaXMgZGVsZWdhdGUuCi0gICAqLwotICBwdWJsaWMgSVdTREwyMFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKQotICB7Ci0gICAgaWYgKHZhbGlkYXRvciA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmKGNsYXNzTG9hZGVyID09IG51bGwpCi0gICAgICB7Ci0gICAgICAJY2xhc3NMb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ2xhc3MgdmFsaWRhdG9yQ2xhc3MgPQotICAgICAgICAgIGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlci5sb2FkQ2xhc3ModmFsaWRhdG9yQ2xhc3NuYW1lKSA6IENsYXNzLmZvck5hbWUodmFsaWRhdG9yQ2xhc3NuYW1lKTsKLQotICAgICAgICB2YWxpZGF0b3IgPSAoSVdTREwyMFZhbGlkYXRvcil2YWxpZGF0b3JDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFJlc291cmNlQnVuZGxlIHZhbGlkYXRvckJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZSwgTG9jYWxlLmdldERlZmF1bHQoKSwgY2xhc3NMb2FkZXIpOwotICAgICAgICAgIHZhbGlkYXRvci5zZXRSZXNvdXJjZUJ1bmRsZSh2YWxpZGF0b3JCdW5kbGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUT0RPOiBhZGQgbG9nZ2luZwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUT0RPOiBhZGQgbG9nZ2luZwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUT0RPOiBhZGQgbG9nZ2luZwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0Fic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9BYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2NiNTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0Fic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZ2VuZXJhdGluZyBvYmplY3RzIG5lZWRlZCBmb3IgWE1MIENvbmZvcm1hbmNlIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeQotewotICBwcm90ZWN0ZWQgc3RhdGljIEFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5IGluc3RhbmNlOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoaXMgZmFjdG9yeS4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoaXMgZmFjdG9yeQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBEZWZhdWx0WE1MQ29uZm9ybWFuY2VGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgZmFjdG9yeSB0byB1c2UuCi0gICAqIAotICAgKiBAcGFyYW0gZmFjdG9yeSAtIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGlzIGZhY3Rvcnkgd2lsbCB1c2UKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvbihBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeSBmYWN0b3J5KQotICB7Ci0gICAgaW5zdGFuY2UgPSBmYWN0b3J5OwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIGFuIFhNTCB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcmV0dXJuIGFuIFhNTCB2YWxpZGF0b3IKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBJWE1MVmFsaWRhdG9yIGdldFhNTFZhbGlkYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvRGVmYXVsdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvRGVmYXVsdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTRlMTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0RlZmF1bHRYTUxDb25mb3JtYW5jZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFhNTENvbmZvcm1hbmNlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5Ci17Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIERlZmF1bHRYTUxDb25mb3JtYW5jZUZhY3RvcnkoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5BYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeSNnZXRYTUxWYWxpZGF0b3IoKQotICAgKi8KLSAgcHVibGljIElYTUxWYWxpZGF0b3IgZ2V0WE1MVmFsaWRhdG9yKCkKLSAgewotICAgIHJldHVybiBuZXcgRGVmYXVsdFhNTFZhbGlkYXRvcigpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0RlZmF1bHRYTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0RlZmF1bHRYTUxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0OGQxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9EZWZhdWx0WE1MVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRXJyb3JSZXBvcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5qYXhwLlNBWFBhcnNlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uTWVzc2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBJWE1MVmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFhNTFZhbGlkYXRvciBpbXBsZW1lbnRzIElYTUxWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0FQQUNIRV9GRUFUVVJFX0NPTlRJTlVFX0FGVEVSX0ZBVEFMX0VSUk9SID0KLSAgICAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2NvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0FQQUNIRV9GRUFUVVJFX05BTUVTUEFDRV9QUkVGSVhFUyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0FQQUNIRV9GRUFUVVJFX05BTUVTUEFDRVMgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfQVBBQ0hFX0ZFQVRVUkVfVkFMSURBVElPTiA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9WQUxJREFUSU9OX1NDSEVNQSA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfQVBBQ0hFX1BST1BFUlRZX0VYVEVSTkFMX1NDSEVNQUxPQ0FUSU9OID0KLSAgICAiaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvc2NoZW1hL2V4dGVybmFsLXNjaGVtYUxvY2F0aW9uIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGSU5JVElPTlMgPSAiZGVmaW5pdGlvbnMiOwotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFX0FMV0FZUyA9ICJJR05PUkVfQUxXQVlTIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFTUFUVVJFX0VPRiA9ICJQcmVtYXR1cmVFT0YiOwotICAKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBpbmdvcmVkRXJyb3JLZXlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIHVyaTsKLSAgcHJvdGVjdGVkIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHNjaGVtYUxvY2F0aW9uU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICBwcm90ZWN0ZWQgTGlzdCBpZ25vcmVkTmFtZXNwYWNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRFcnJvcktleSA9IG51bGw7Ci0gIHByb3RlY3RlZCBPYmplY3RbXSBjdXJyZW50TWVzc2FnZUFyZ3VtZW50cyA9IG51bGw7Ci0vLyAgcHJvdGVjdGVkIFN0cmluZyB3c2RsTmFtZXNwYWNlID0gbnVsbDsKLQotCi0KLQotLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIERlZmF1bHRYTUxWYWxpZGF0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICAKLSAgICBpZ25vcmVkTmFtZXNwYWNlTGlzdC5hZGQoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSk7Ci0gICAgaWdub3JlZE5hbWVzcGFjZUxpc3QuYWRkKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApOwotICAgIGlnbm9yZWROYW1lc3BhY2VMaXN0LmFkZChDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxKTsKLSAgICAKLSAgICBpbmdvcmVkRXJyb3JLZXlUYWJsZS5wdXQoUFJFTUFUVVJFX0VPRiwgSUdOT1JFX0FMV0FZUyk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLnhtbGNvbmZvcm1hbmNlLklYTUxWYWxpZGF0b3JBY3Rpb24jc2V0RmlsZShJRmlsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIHVyaSkKLSAgewotICAgIHRoaXMudXJpID0gdXJpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAJdGhpcy51cmlSZXNvbHZlciA9IHVyaVJlc29sdmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudmFsaWRhdGUud3NkbC54bWxjb25mb3JtYW5jZS5JWE1MVmFsaWRhdG9yQWN0aW9uI3J1bigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgLy8gVmFsaWRhdGUgdGhlIFhNTCBmaWxlLgotICAgIHRyeQotICAgIHsKLSAgICAgIFJlYWRlciByZWFkZXIxID0gbnVsbDsgLy8gVXNlZCBmb3IgdGhlIHByZXBhcnNlLgotICAgICAgUmVhZGVyIHJlYWRlcjIgPSBudWxsOyAvLyBVc2VkIGZvciB2YWxpZGF0aW9uIHBhcnNlLgotICAgICAgCi0gICAgICBJbnB1dFNvdXJjZSB2YWxpZGF0ZUlucHV0U291cmNlOyAKLSAgICAgCi0gICAgICAKLSAgICAgIGlmICh0aGlzLmlucHV0U3RyZWFtICE9IG51bGwpCi0gICAgICB7ICAgIAotICAgICAgCi0KLSAgICAgICAgU3RyaW5nIHN0cmluZyA9IGNyZWF0ZVN0cmluZ0ZvcklucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICAgICAgcmVhZGVyMSA9IG5ldyBTdHJpbmdSZWFkZXIoc3RyaW5nKTsKLSAgICAgICAgcmVhZGVyMiA9IG5ldyBTdHJpbmdSZWFkZXIoc3RyaW5nKTsgCi0gICAgICAgICAgCi0gICAgICAgIHZhbGlkYXRlSW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW5wdXRTdHJlYW0pOwotICAgICAgICB2YWxpZGF0ZUlucHV0U291cmNlLnNldENoYXJhY3RlclN0cmVhbShyZWFkZXIyKTsKLSAgICAgIH0gZWxzZQotICAgICAgeyB2YWxpZGF0ZUlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHByZXBhcnNlKHVyaSwgcmVhZGVyMSk7Ci0gICAgICAKLSAgICAgIFNBWFBhcnNlciBzYXhwYXJzZXIgPSBjcmVhdGVTQVhQYXJzZXIoKTsKLSAgICAgIFhNTENvbmZvcm1hbmNlRGVmYXVsdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYTUxDb25mb3JtYW5jZURlZmF1bHRIYW5kbGVyKCk7Ci0KLSAgICAgIHNheHBhcnNlci5zZXRFcnJvckhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICAKLSAgICAgIHNheHBhcnNlci5wYXJzZSh2YWxpZGF0ZUlucHV0U291cmNlKTsKLS8vICAgICAgd3NkbE5hbWVzcGFjZSA9IGhhbmRsZXIuZ2V0V1NETE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSwgZS5nZXRMaW5lTnVtYmVyKCksIGUuZ2V0Q29sdW1uTnVtYmVyKCksIHVyaSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIFNBWCBwYXJzZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuZXcgU0FYIHBhcnNlci4KLSAgICovCi0gIHByb3RlY3RlZCBTQVhQYXJzZXIgY3JlYXRlU0FYUGFyc2VyKCkKLSAgewotICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJmYWN0b3J5ID0gbmV3IFNBWFBhcnNlckZhY3RvcnlJbXBsKCk7Ci0gICAgICB0cnkKLSAgICAgIHsgTXlTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBNeVN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbigpOwotICAgICAgICBzYXhQYXJzZXIgPSBuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoY29uZmlndXJhdGlvbik7Ci0gICAgICAgIHNheFBhcnNlci5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9DT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUiwgdHJ1ZSk7Ci0gICAgICAgIHNheFBhcnNlci5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VfUFJFRklYRVMsIHRydWUpOwotICAgICAgICBzYXhQYXJzZXIuc2V0RmVhdHVyZShfQVBBQ0hFX0ZFQVRVUkVfTkFNRVNQQUNFUywgdHJ1ZSk7Ci0gICAgICAgIHNheFBhcnNlci5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9WQUxJREFUSU9OLCB0cnVlKTsKLSAgICAgICAgc2F4UGFyc2VyLnNldEZlYXR1cmUoX0FQQUNIRV9GRUFUVVJFX1ZBTElEQVRJT05fU0NIRU1BLCB0cnVlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBpZiAoc2NoZW1hTG9jYXRpb25TdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBzYXhQYXJzZXIuc2V0UHJvcGVydHkoX0FQQUNIRV9QUk9QRVJUWV9FWFRFUk5BTF9TQ0hFTUFMT0NBVElPTiwgc2NoZW1hTG9jYXRpb25TdHJpbmcudG9TdHJpbmcoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0vLyAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0vLyAgICB7Ci0vLyAgICB9Ci0gICAgcmV0dXJuIHNheFBhcnNlcjsKLSAgfQotCi0gIAotICBmaW5hbCBTdHJpbmcgY3JlYXRlU3RyaW5nRm9ySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLSAgICAvLyBIZXJlIHdlIGFyZSByZWFkaW5nIHRoZSBmaWxlIGFuZCBzdG9yaW5nIHRvIGEgc3RyaW5nYnVmZmVyLgotICAgIFN0cmluZ0J1ZmZlciBmaWxlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlucHV0UmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKTsKLSAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpbnB1dFJlYWRlcik7Ci0gICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhclsxMDI0XTsKLSAgICAgIGludCBudW1iZXJSZWFkID0gcmVhZGVyLnJlYWQoY2hhcnMpOwotICAgICAgd2hpbGUgKG51bWJlclJlYWQgIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGZpbGVTdHJpbmcuYXBwZW5kKGNoYXJzLCAwLCBudW1iZXJSZWFkKTsKLSAgICAgICAgbnVtYmVyUmVhZCA9IHJlYWRlci5yZWFkKGNoYXJzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vVE9ETzogbG9nIGVycm9yIG1lc3NhZ2UKLSAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbGVTdHJpbmcudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFByZXBhcnNlIHRoZSBmaWxlIHRvIGZpbmQgYWxsIG9mIHRoZSBuYW1lc3BhY2VzIHRoYXQgYXJlIGRlZmluZWQgaW4gb3JkZXIKLSAgICogdG8gc3BlY2lmeSB0aGUgc2NoZW1hbG9jYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIGZpbGUgdG8gcGFyc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcmVwYXJzZShTdHJpbmcgdXJpLCBSZWFkZXIgY2hhcmFjdGVyU3RyZWFtKQotICB7Ci0gICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIgc2F4UGFyc2VyID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAgIAotICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2U7IAotICAgICAgCi0gICAgICBpZiAoY2hhcmFjdGVyU3RyZWFtICE9IG51bGwpCi0gICAgICB7ICAgCi0gICAgICAgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UodXJpKTsKLSAgICAgICAgICBpbnB1dFNvdXJjZS5zZXRDaGFyYWN0ZXJTdHJlYW0oY2hhcmFjdGVyU3RyZWFtKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgICBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSh1cmkpOwotICAgICAgfQotICAgICAgCi0gICAgICBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlcmZhY3RvcnkgPSBuZXcgU0FYUGFyc2VyRmFjdG9yeUltcGwoKTsKLQotICAgICAgcGFyc2VyZmFjdG9yeS5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VfUFJFRklYRVMsIHRydWUpOwotICAgICAgcGFyc2VyZmFjdG9yeS5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VTLCB0cnVlKTsKLQotICAgICAgc2F4UGFyc2VyID0gcGFyc2VyZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgIFNjaGVtYVN0cmluZ0hhbmRsZXIgaGFuZGxlciA9IG5ldyBTY2hlbWFTdHJpbmdIYW5kbGVyKHVyaSk7Ci0gICAgICAKLSAgICAgIHNheFBhcnNlci5wYXJzZShpbnB1dFNvdXJjZSwgaGFuZGxlcik7Ci0gICAgfQotICAgIGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLnhtbGNvbmZvcm1hbmNlLklYTUxWYWxpZGF0b3JBY3Rpb24jaGFzRXJyb3JzKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpCi0gIHsKLSAgICByZXR1cm4gIWVycm9ycy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLnhtbGNvbmZvcm1hbmNlLklYTUxWYWxpZGF0b3JBY3Rpb24jZ2V0RXJyb3JMaXN0KCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEVycm9ycygpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBtZXNzYWdlIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZXJyb3IuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvcihTdHJpbmcgZXJyb3IsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKGVycm9yLCBsaW5lLCBjb2x1bW4sIFZhbGlkYXRpb25NZXNzYWdlSW1wbC5TRVZfRVJST1IsIHVyaSwgY3VycmVudEVycm9yS2V5LCBjdXJyZW50TWVzc2FnZUFyZ3VtZW50cykpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBoYW5kbGVyIGZvciB0aGUgU0FYIHBhcnNlci4gVGhpcyBoYW5kbGVyIHdpbGwgb2J0YWluIHRoZSBXU0RMCi0gICAqIG5hbWVzcGFjZSwgaGFuZGxlIGVycm9ycyBhbmQgcmVzb2x2ZSBlbnRpdGllcy4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYTUxDb25mb3JtYW5jZURlZmF1bHRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLSAgewotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKFNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgIFN0cmluZyB0ZW1wVVJJID0gYXJnMC5nZXRTeXN0ZW1JZCgpOwotICAgICBpZiAoaW5wdXRTdHJlYW0hPSBudWxsICYmIGFyZzAuZ2V0U3lzdGVtSWQoKSA9PSBudWxsKQotICAgICB7Ci0gICAgICAgLy9taDogSW4gdGhpcyBjYXNlIHdlIGFyZSB2YWxpZGF0aW5nIGEgc3RyZWFtIHNvIHRoZSBVUkkgbWF5IGJlIG51bGwgaW4gdGhpcyBleGNlcHRpb24KLSAgICAgICB0ZW1wVVJJID0gdXJpOyAgICAgICAKLSAgICAgfQotICAgICBhZGRFcnJvcihhcmcwLmdldE1lc3NhZ2UoKSwgYXJnMC5nZXRMaW5lTnVtYmVyKCksIGFyZzAuZ2V0Q29sdW1uTnVtYmVyKCksIHRlbXBVUkkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgYWRkRXJyb3IoYXJnMC5nZXRNZXNzYWdlKCksIGFyZzAuZ2V0TGluZU51bWJlcigpLCBhcmcwLmdldENvbHVtbk51bWJlcigpLCBhcmcwLmdldFN5c3RlbUlkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI3dhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgYWRkRXJyb3IoYXJnMC5nZXRNZXNzYWdlKCksIGFyZzAuZ2V0TGluZU51bWJlcigpLCBhcmcwLmdldENvbHVtbk51bWJlcigpLCBhcmcwLmdldFN5c3RlbUlkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIFN0cmluZyB1cmkgPSB1cmlSZXNvbHZlci5yZXNvbHZlKG51bGwsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgICBpZiAodXJpICE9IG51bGwgJiYgIXVyaS5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICBJbnB1dFNvdXJjZSBpcyA9IG5ldyBJbnB1dFNvdXJjZSh1cmkpOwotICAgICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBpczsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gVGhpcyB0cnkvY2F0Y2ggYmxvY2sgd2l0aCB0aGUgSU9FeGNlcHRpb24gaXMgaGVyZSB0byBoYW5kbGUgYSBkaWZmZXJlbmNlCi0gICAgICAvLyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgRW50aXR5UmVzb2x2ZXIgaW50ZXJmYWNlLgotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElucHV0U291cmNlIGlzID0gc3VwZXIucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgICBpZihpcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzOwotICAgICAgfQotICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotLy8gICAgLyoqCi0vLyAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLAotLy8gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotLy8gICAgICovCi0vLyAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsbmFtZSwgU3RyaW5nIGFyZzIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotLy8gICAgewotLy8gICAgICBpZiAobG9jYWxuYW1lLmVxdWFscyhERUZJTklUSU9OUykpCi0vLyAgICAgIHsKLS8vICAgICAgICB3c2RsVVJJID0gdXJpOwotLy8gICAgICB9Ci0vLyAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsbmFtZSwgYXJnMiwgYXR0cmlidXRlcyk7Ci0vLwotLy8gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLnhtbGNvbmZvcm1hbmNlLklYTUxWYWxpZGF0b3Ijc2V0U2NoZW1hTG9jYXRpb24oU3RyaW5nLAotICAgKiAgICAgIFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYUxvY2F0aW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCAmJiBsb2NhdGlvbiAhPSBudWxsICYmICFuYW1lc3BhY2UuZXF1YWxzSWdub3JlQ2FzZSgiIikgJiYgIWxvY2F0aW9uLmVxdWFsc0lnbm9yZUNhc2UoIiIpKQotICAgIHsKLSAgICAgIHNjaGVtYUxvY2F0aW9uU3RyaW5nLmFwcGVuZCgiICIpLmFwcGVuZChuYW1lc3BhY2UpLmFwcGVuZCgiICIpLmFwcGVuZChmb3JtYXRVUkkobG9jYXRpb24pKTsKLSAgICB9Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogQHBhcmFtIGlucHV0U3RyZWFtIC0gc2V0IHRoZSBpbnB1dFN0cmVhbSB0byB2YWxpZGF0ZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLSAgICAgIHRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgc3BhY2UgY2hhcmFjdGVycyBmcm9tIGEgU3RyaW5nIGFuZCByZXBsYWNlIHRoZW0gd2l0aCAlMjAuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIC0KLSAgICogICAgICAgICAgICB0aGUgdXJpIHRvIGZvcm1hdAotICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdFVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgU3RyaW5nIHNwYWNlID0gIiUyMCI7Ci0gICAgU3RyaW5nQnVmZmVyIG5ld1VyaSA9IG5ldyBTdHJpbmdCdWZmZXIodXJpKTsKLSAgICBpbnQgbmV3VXJpTGVuZ3RoID0gbmV3VXJpLmxlbmd0aCgpOwotCi0gICAgLy8gd29yayBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgc3RyaW5nYnVmZmVyIGluIGNhc2UgaXQgZ3Jvd3MgdG8gdGhlCi0gICAgLy8gcG9pbnQKLSAgICAvLyB3aGVyZSB0aGUgbGFzdCBzcGFjZSB3b3VsZCBiZSBtaXNzZWQuCi0gICAgZm9yIChpbnQgaSA9IG5ld1VyaUxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGlmIChuZXdVcmkuY2hhckF0KGkpID09ICcgJykKLSAgICAgIHsKLSAgICAgICAgbmV3VXJpLnJlcGxhY2UoaSwgaSArIDEsIHNwYWNlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3VXJpLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogQSBoYW5kbGVyIHVzZWQgaW4gcHJlcGFyc2luZyB0byBnZXQgdGhlIHNjaGVtYUxvY2F0aW9uIHN0cmluZy4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBTY2hlbWFTdHJpbmdIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLSAgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsKLSAgICBwcml2YXRlIFN0cmluZyBiYXNlbG9jYXRpb24gPSBudWxsOwotCi0gICAgcHVibGljIFNjaGVtYVN0cmluZ0hhbmRsZXIoU3RyaW5nIGJhc2Vsb2NhdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLmJhc2Vsb2NhdGlvbiA9IGJhc2Vsb2NhdGlvbjsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbG5hbWUsIFN0cmluZyBhcmcyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAobG9jYWxuYW1lLmVxdWFscyhERUZJTklUSU9OUykpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgICBpbnQgbnVtQXR0cyA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXR0czsgaSsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICBTdHJpbmcgYXR0bmFtZSA9IGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSk7Ci0gICAgICAgICAgaWYgKGF0dG5hbWUuc3RhcnRzV2l0aChYTUxOUykpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICBpZighaWdub3JlZE5hbWVzcGFjZUxpc3QuY29udGFpbnMobmFtZXNwYWNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkVVJJID0gdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlbG9jYXRpb24sIG5hbWVzcGFjZSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgaWYocmVzb2x2ZWRVUkkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldFNjaGVtYUxvY2F0aW9uKG5hbWVzcGFjZSwgcmVzb2x2ZWRVUkkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsbmFtZSwgYXJnMiwgYXR0cmlidXRlcyk7Ci0KLSAgICB9Ci0gIH0KLQotLy8gIC8qKgotLy8gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5pbnRlcm5hbC54bWwuSVhNTFZhbGlkYXRvciNnZXRXU0RMTmFtZXNwYWNlKCkKLS8vICAgKi8KLS8vICBwdWJsaWMgU3RyaW5nIGdldFdTRExOYW1lc3BhY2UoKQotLy8gIHsKLS8vICAgIHJldHVybiB3c2RsTmFtZXNwYWNlOwotLy8gIH0KLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBNeVN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbiBleHRlbmRzIFN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbgotICB7Ci0gICAgcHVibGljIE15U3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5EVERDb25maWd1cmF0aW9uI2NyZWF0ZUVycm9yUmVwb3J0ZXIoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBYTUxFcnJvclJlcG9ydGVyIGNyZWF0ZUVycm9yUmVwb3J0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgWE1MRXJyb3JSZXBvcnRlcigpCi0gICAgICB7Ci0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXIjcmVwb3J0RXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdLCBzaG9ydCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBkb21haW4sIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3VtZW50cywKLSAgICAgICAgICAgIHNob3J0IHNldmVyaXR5KSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICBjdXJyZW50RXJyb3JLZXkgPSBrZXk7Ci0gICAgICAgICAgY3VycmVudE1lc3NhZ2VBcmd1bWVudHMgPSBhcmd1bWVudHM7Ci0gICAgICAgICAgc3VwZXIucmVwb3J0RXJyb3IoZG9tYWluLCBrZXksIGFyZ3VtZW50cywgc2V2ZXJpdHkpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLSAgfQotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9FbGVtZW50TG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0VsZW1lbnRMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Q5YTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0VsZW1lbnRMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi0vKioKLSAqIEhvbGRzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYW4gZWxlbWVudCBpbiB0aGUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50TG9jYXRpb24KLXsgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJsb2NhdGlvbiI7Ci0gIHByb3RlY3RlZCBpbnQgbGluZTsKLSAgcHJvdGVjdGVkIGludCBjb2x1bW47Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIC0gdGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQKLSAgICogQHBhcmFtIGNvbHVtbiAtIHRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50TG9jYXRpb24oaW50IGxpbmUsIGludCBjb2x1bW4pCi0gIHsKLSAgICB0aGlzLmxpbmUgPSBsaW5lOwotICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsaW5lIG51bWJlciBmb3IgdGhpcyBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybiB0aGUgbGluZSBudW1iZXIgZm9yIHRoaXMgZWxlbWVudAotICAgKi8KLSAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLSAgewotICAJcmV0dXJuIGxpbmU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIgZm9yIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIgZm9yIHRoaXMgZWxlbWVudAotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotICB7Ci0gIAlyZXR1cm4gY29sdW1uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9JWE1MQ2F0YWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvSVhNTENhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmNDU2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9JWE1MQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYW4gWE1MIGNhdGFsb2cuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTENhdGFsb2cKLXsKLQotICAvKioKLSAgICogQWRkIGEgcHVibGljIGlkIGFuZCBhIGxvY2F0aW9uIHRvIHRoZSBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIHB1YmxpY0lkIC0KLSAgICogICAgICAgICAgdGhlIHB1YmxpYyBpZCBvZiB0aGUgZW50cnkKLSAgICogQHBhcmFtIHN5c3RlbUlkIC0KLSAgICogICAgICAgICAgdGhlIHN5c3RlbSBpZCBvZiB0aGUgZW50cnkKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZEVudHJ5VG9DYXRhbG9nKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLQotICAvKioKLSAgICogUmVzb2x2ZSB0aGUgbG9jYXRpb24gb2YgYW4gZW50aXR5IGdpdmVuIHB1YmxpYyBhbmQgc3lzdGVtIGlkcy4KLSAgICogCi0gICAqIEBwYXJhbSBwdWJsaWNJZCAtCi0gICAqICAgICAgICAgIHRoZSBwdWJsaWMgaWQgb2YgdGhlIGVudGl0eSB0byBiZSByZXNvbHZlZAotICAgKiBAcGFyYW0gc3lzdGVtSWQgLQotICAgKiAgICAgICAgICB0aGUgc3lzdGVtIGlkIG9mIHRoZSBlbnRpdHkgdG8gYmUgcmVzb2x2ZWQKLSAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGVudGl0eQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyByZXNvbHZlRW50aXR5TG9jYXRpb24oU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0lYTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0lYTUxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRjYWRmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9JWE1MVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhbiBYTUwgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIFNldCB0aGUgZmlsZSB0byBiZSB2YWxpZGF0ZWQuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIC0gdGhlIHVyaSBvZiB0aGUgZmlsZSB0byBiZSB2YWxpZGF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIHVyaSk7Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGZpbGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdlcmUgdmFsaWRhdGlvbiBlcnJvcnMsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSB3ZXJlIHZhbGlkYXRpb24gZXJyb3JzLCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZXJyb3JzLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBlcnJvcnMKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEVycm9ycygpOwotICAKLSAgLyoqCi0gICAqIEFkZCBhIHNjaGVtYSBsb2NhdGlvbiB0byBiZSBzY2hlbWEgbG9jYXRpbm8gc3RyaW5nIHVzZWQgYnkgdGhlIFhNTCBwYXJzZXIuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gdGhlIG5hbWVzcGFjZXMgb2YgdGhlIHNjaGVtYQotICAgKiBAcGFyYW0gbG9jYXRpb24gLSB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hTG9jYXRpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKTsKLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIFVSSSByZXNvbHZlciB0byB1c2UuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpUmVzb2x2ZXIgVGhlIFVSSSByZXNvbHZlciB0byB1c2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciB1cmlSZXNvbHZlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9MaW5lTnVtYmVyRE9NUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9MaW5lTnVtYmVyRE9NUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGRiMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvTGluZU51bWJlckRPTVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkRPTVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlN5bWJvbFRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MQXR0cmlidXRlczsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyUG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogQSBET00gcGFyc2VyIHRoYXQgd2lsbCByZWdpc3RlciBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3aXRoIHRoZSBlbGVtZW50cyBpbiB0aGUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lTnVtYmVyRE9NUGFyc2VyIGV4dGVuZHMgRE9NUGFyc2VyCi17Ci0gIFhNTExvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIExpbmVOdW1iZXJET01QYXJzZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzZXRGZWF0dXJlKERFRkVSX05PREVfRVhQQU5TSU9OLCBmYWxzZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGFyZzAgVGhlIHBhcnNlciBjb25maWd1cmF0aW9uLgotICAgKi8KLSAgcHVibGljIExpbmVOdW1iZXJET01QYXJzZXIoWE1MUGFyc2VyQ29uZmlndXJhdGlvbiBhcmcwKQotICB7Ci0gICAgc3VwZXIoYXJnMCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgc2V0RmVhdHVyZShERUZFUl9OT0RFX0VYUEFOU0lPTiwgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gYXJnMCBBIHN5bWJvbCB0YWJsZSBmb3IgdGhlIHBhcnNlci4KLSAgICovCi0gIHB1YmxpYyBMaW5lTnVtYmVyRE9NUGFyc2VyKFN5bWJvbFRhYmxlIGFyZzApCi0gIHsKLSAgICBzdXBlcihhcmcwKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBhcmcwIEEgc3ltYm9sIHRhYmxlIGZvciB0aGUgcGFyc2VyLgotICAgKiBAcGFyYW0gYXJnMSBBIGdyYW1tYXIgcG9vbCBmb3IgdGhlIHBhcnNlci4KLSAgICovCi0gIHB1YmxpYyBMaW5lTnVtYmVyRE9NUGFyc2VyKFN5bWJvbFRhYmxlIGFyZzAsIFhNTEdyYW1tYXJQb29sIGFyZzEpCi0gIHsKLSAgICBzdXBlcihhcmcwLCBhcmcxKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxEb2N1bWVudEhhbmRsZXIjc3RhcnRFbGVtZW50KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5RTmFtZSwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTEF0dHJpYnV0ZXMsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFFOYW1lIGFyZzAsIFhNTEF0dHJpYnV0ZXMgYXJnMSwgQXVnbWVudGF0aW9ucyBhcmcyKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQ7Ci0gICAgLy8gRm9yIGVsZW1lbnRzIGZyb20gdGhlIFNjaGVtYSBuYW1lc3BhY2Ugd2Ugd2FudCB0byBwcmVzZXJ2ZSB0aGVtCi0gICAgLy8gdGhlIHdheSB0aGV5IHdlcmUgZW50ZXJlZC4gUmV2ZXJ0IHRoZSB2YWx1ZXMgdG8gdGhlIG5vbi1ub3JtYWxpemVkIHZhbHVlcy4KLSAgICBTdHJpbmcgbnMgPSBhcmcwLnVyaTsKLSAgICBpZihucyAhPSBudWxsICYmIChucy5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMSkgfHwgbnMuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpIHx8IG5zLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAwKSkpCi0gICAgewotICAgICAgaW50IG51bWF0dHMgPSBhcmcxLmdldExlbmd0aCgpOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bWF0dHM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5vbk5vcm1hbGl6ZWRWYWx1ZSA9IGFyZzEuZ2V0Tm9uTm9ybWFsaXplZFZhbHVlKGkpOwotICAgICAgICBhcmcxLnNldFZhbHVlKGksIG5vbk5vcm1hbGl6ZWRWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnN0YXJ0RWxlbWVudChhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBlbGVtZW50ID0gKEVsZW1lbnQpZ2V0UHJvcGVydHkoQ1VSUkVOVF9FTEVNRU5UX05PREUpOwotICAgICAgRWxlbWVudEltcGwgZWxlbWVudEltcGwgPSAoRWxlbWVudEltcGwpZWxlbWVudDsKLSAgICAgIGVsZW1lbnRJbXBsLnNldFVzZXJEYXRhKAotICAgICAgICBFbGVtZW50TG9jYXRpb24uSUQsCi0gICAgICAgIG5ldyBFbGVtZW50TG9jYXRpb24obG9jYXRvci5nZXRMaW5lTnVtYmVyKCksIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpLAotICAgICAgICBudWxsKTsKLSAgICB9Ci0gICAgLy8gY2F0Y2ggU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBhbmQgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIGNhbid0IGdldCBlbGVtZW50Ci0gICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTERvY3VtZW50SGFuZGxlciNzdGFydERvY3VtZW50KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxMb2NhdG9yLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuTmFtZXNwYWNlQ29udGV4dCwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnMpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KFhNTExvY2F0b3IgYXJnMCwgU3RyaW5nIGFyZzEsIE5hbWVzcGFjZUNvbnRleHQgYXJnMiwgQXVnbWVudGF0aW9ucyBhcmczKQotICAgIHRocm93cyBYTklFeGNlcHRpb24KLSAgewotICAgIGxvY2F0b3IgPSBhcmcwOwotICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL1hNTENhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL1hNTENhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2N2JmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuamF4cC5TQVhQYXJzZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFhNTENhdGFsb2cgVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byByZWdpc3Rlciwgb2J0YWluIGFuZCBkZWxldGUgYW4gaW5zdGFuY2UKLSAqIG9mIGFuIFhNTCBjYXRhbG9nLiBNZXRob2QgZGVmaW5pdGlvbnMgYXJlIHByb3ZpZGVkIGZvciB0aGUgY2F0YWxvZyB0byBzZXQgYQotICogbG9jYXRpb24gaW4gdGhlIGNhdGFsb2cgYW5kIHJlc29sdmUgYW4gZW50aXR5IGZyb20gdGhlIGNhdGFsb2cuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nIGltcGxlbWVudHMgSVhNTENhdGFsb2cKLXsKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9DT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUiA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiOwotCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfQVBBQ0hFX0ZFQVRVUkVfTkFNRVNQQUNFX1BSRUZJWEVTID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiOwotCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfQVBBQ0hFX0ZFQVRVUkVfTkFNRVNQQUNFUyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9WQUxJREFUSU9OID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIjsKLQotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX0FQQUNIRV9GRUFUVVJFX1ZBTElEQVRJT05fU0NIRU1BID0gImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgSVhNTENhdGFsb2cgaW5zdGFuY2UgPSBudWxsOwotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBleHR4bWxjYXRhbG9nY2xhc3MgPSBudWxsOwotCi0gIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGV4dGNsYXNzTG9hZGVyID0gbnVsbDsKLQotICBwcml2YXRlIHN0YXRpYyBJWE1MQ2F0YWxvZyBleHRYTUxDYXRhbG9nSW5zdGFuY2UgPSBudWxsOwotCi0gIHByaXZhdGUgc3RhdGljIExpc3Qgc2NoZW1hZGlycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICBwcml2YXRlIHN0YXRpYyBMaXN0IGVudGl0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIC8qKgotICAgKiBBIGhhc2h0YWJsZSB0byBob2xkIHRoZSBYTUwgY2F0YWxvZyBlbnRyaWVzLgotICAgKi8KLSAgcHJvdGVjdGVkIE1hcCBjYXRhbG9nID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIFhNTCBjYXRhbG9nLiBBc3NpZ25zIGFsbCByZWdpc3RlcmVkIHNjaGVtYXMgdG8KLSAgICogdGhlIFhNTCBjYXRhbG9nLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgaW5zdGFuY2Ugb2YgdGhlIFhNTCBjYXRhbG9nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJWE1MQ2F0YWxvZyBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBYTUxDYXRhbG9nKCk7Ci0KLSAgICAgIC8vIEFkZCB0aGUgcmVnaXN0ZXJlZCBlbnRpdGllcyB0byB0aGUgY2F0YWxvZy4KLSAgICAgIEl0ZXJhdG9yIGVudGl0eUl0ZXIgPSBlbnRpdGllcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGVudGl0eUl0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBYTUxDYXRhbG9nRW50aXR5SG9sZGVyIGVudGl0eSA9IChYTUxDYXRhbG9nRW50aXR5SG9sZGVyKSBlbnRpdHlJdGVyLm5leHQoKTsKLSAgICAgICAgaW5zdGFuY2UuYWRkRW50cnlUb0NhdGFsb2coZW50aXR5LmdldFB1YmxpY0lkKCksIGVudGl0eS5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gQWRkIHRoZSBzY2hlbWFzIGluIHRoZSBzY2hlbWEgZGlyZWN0b3JpZXMgdG8gdGhlIGNhdGFsb2cuCi0gICAgICBpZiAoc2NoZW1hZGlycy5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlcmZhY3RvcnkgPSBuZXcgU0FYUGFyc2VyRmFjdG9yeUltcGwoKTsKLSAgICAgICAgICBwYXJzZXJmYWN0b3J5LnNldEZlYXR1cmUoX0FQQUNIRV9GRUFUVVJFX05BTUVTUEFDRV9QUkVGSVhFUywgdHJ1ZSk7Ci0gICAgICAgICAgcGFyc2VyZmFjdG9yeS5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VTLCB0cnVlKTsKLSAgICAgICAgICBzYXhQYXJzZXIgPSBwYXJzZXJmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIEl0ZXJhdG9yIHNjaGVtYWRpckl0ZXIgPSBzY2hlbWFkaXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIFNjaGVtYU5hbWVzcGFjZUhhbmRsZXIgaGFuZGxlciA9ICgoWE1MQ2F0YWxvZykgaW5zdGFuY2UpLm5ldyBTY2hlbWFOYW1lc3BhY2VIYW5kbGVyKCk7Ci0gICAgICAgIHdoaWxlIChzY2hlbWFkaXJJdGVyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBzY2hlbWFkaXIgPSAoU3RyaW5nKSBzY2hlbWFkaXJJdGVyLm5leHQoKTsKLSAgICAgICAgICByZWdpc3RlclNjaGVtYXNGb3JEaXIoaW5zdGFuY2UsIHNjaGVtYWRpciwgc2F4UGFyc2VyLCBoYW5kbGVyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgdGhlIHNjaGVtYXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSBhbmQgYWxsIHN1YmRpcmVjdG9yaWVzIHdpdGggdGhlCi0gICAqIFhNTCBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIGNhdGFsb2cKLSAgICogICAgICAgICAgVGhlIGNhdGFsb2cgdG8gcmVnaXN0ZXIgdGhlIHNjaGVtYXMgd2l0aC4KLSAgICogQHBhcmFtIHNjaGVtYWRpcgotICAgKiAgICAgICAgICBUaGUgc2NoZW1hIGRpcmVjdG9yeSB0byBzZWFyY2ggZm9yIHNjaGVtYSBmaWxlcy4KLSAgICogQHBhcmFtIHBhcnNlcgotICAgKiAgICAgICAgICBUaGUgU0FYUGFyc2VyIHRvIHVzZSB0byBwYXJzZSB0aGUgc2NoZW1hcyBmb3IgdGhlaXIKLSAgICogICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlLgotICAgKiBAcGFyYW0gaGFuZGxlcgotICAgKiAgICAgICAgICBUaGUgaGFuZGxlciB0byB1c2UgdG8gZ2V0IHRoZSB0YXJnZXROYW1lc3BhY2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVyU2NoZW1hc0ZvckRpcihJWE1MQ2F0YWxvZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hZGlyLCBTQVhQYXJzZXIgcGFyc2VyLAotICAgICAgU2NoZW1hTmFtZXNwYWNlSGFuZGxlciBoYW5kbGVyKQotICB7Ci0gICAgLy8gUmVtb3ZlIGZpbGU6IGFuZCBmaWxlOi8gZnJvbSBiZWdpbm5pbmcgb2YgZmlsZSBsb2NhdGlvbiBpZiB0aGV5IGFyZSBwcmVzZW50LgotICAgIGlmKHNjaGVtYWRpci5zdGFydHNXaXRoKCJmaWxlOi8iKSkKLSAgICB7Ci0gICAgICBzY2hlbWFkaXIgPSBzY2hlbWFkaXIuc3Vic3RyaW5nKDYpOwotICAgIH0KLSAgICBlbHNlIGlmKHNjaGVtYWRpci5zdGFydHNXaXRoKCJmaWxlOiIpKQotICAgIHsKLSAgICAgIHNjaGVtYWRpciA9IHNjaGVtYWRpci5zdWJzdHJpbmcoNSk7Ci0gICAgfQotICAgIAotICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoc2NoZW1hZGlyKTsKLSAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpCi0gICAgewotICAgICAgRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOwotICAgICAgaW50IG51bWZpbGVzID0gZmlsZXMubGVuZ3RoOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1maWxlczsgaSsrKQotICAgICAgewotICAgICAgICBGaWxlIHRlbXBmaWxlID0gZmlsZXNbaV07Ci0gICAgICAgIFN0cmluZyB0ZW1wZmlsZXBhdGggPSB0ZW1wZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgaWYgKHRlbXBmaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZWdpc3RlclNjaGVtYXNGb3JEaXIoY2F0YWxvZywgdGVtcGZpbGVwYXRoLCBwYXJzZXIsIGhhbmRsZXIpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZXIucmVzZXQoKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UodGVtcGZpbGVwYXRoLCBoYW5kbGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGxvZyBlcnJvci4KLSAgICAgICAgICB9Ci0gICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGhhbmRsZXIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhdGFsb2cuYWRkRW50cnlUb0NhdGFsb2codGFyZ2V0TmFtZXNwYWNlLCB0ZW1wZmlsZXBhdGgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGluc3RhbmNlIG9mIHRoZSBleHRlbnNpb24gWE1MIGNhdGFsb2cuIFJldHVybnMgdGhlIGluc3RhbmNlIGlmIG9uZQotICAgKiBpcyByZWdpc3RlcmVkIGFuZCBjYW4gYmUgY3JlYXRlZCwgbnVsbCBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5zaW9uIFhNTCBjYXRhbG9nIGlmIG9uZSBpcyByZWdpc3RlcmVkLAotICAgKiAgICAgICAgIG51bGwgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgSVhNTENhdGFsb2cgZ2V0RXh0ZW5zaW9uQ2F0YWxvZ0luc3RhbmNlKCkKLSAgewotICAgIGlmIChleHRYTUxDYXRhbG9nSW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZXh0eG1sY2F0YWxvZ2NsYXNzICE9IG51bGwgJiYgZXh0Y2xhc3NMb2FkZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDbGFzcyBjYXRhbG9nQ2xhc3MgPSBleHRjbGFzc0xvYWRlciAhPSBudWxsID8gZXh0Y2xhc3NMb2FkZXIubG9hZENsYXNzKGV4dHhtbGNhdGFsb2djbGFzcykgOiBDbGFzcwotICAgICAgICAgICAgICAuZm9yTmFtZShleHR4bWxjYXRhbG9nY2xhc3MpOwotICAgICAgICAgIGV4dFhNTENhdGFsb2dJbnN0YW5jZSA9IChJWE1MQ2F0YWxvZykgY2F0YWxvZ0NsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGV4dFhNTENhdGFsb2dJbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGNsYXNzIG9mIHRoZSBYTUwgY2F0YWxvZyB0byBiZSB1c2VkLgotICAgKiAKLSAgICogQHBhcmFtIHhtbGNhdGFsb2cKLSAgICogICAgICAgICAgVGhlIGNsYXNzIG9mIHRoZSBYTUwgY2F0YWxvZyB0byBiZSB1c2VkLgotICAgKiBAcGFyYW0gY2xhc3Nsb2FkZXIKLSAgICogICAgICAgICAgVGhlIGNsYXNzbG9hZGVyIHRvIHVzZSB0byBsb2FkIHRoZSBjYXRhbG9nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEV4dGVuc2lvblhNTENhdGFsb2coU3RyaW5nIHhtbGNhdGFsb2csIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKQotICB7Ci0gICAgZXh0eG1sY2F0YWxvZ2NsYXNzID0geG1sY2F0YWxvZzsKLSAgICBleHRjbGFzc0xvYWRlciA9IGNsYXNzbG9hZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgaW5zdGFuY2Ugb2YgdGhlIFhNTCBjYXRhbG9nIHRvIG51bGwuIEZvciBkZWxldGluZyB0aGUgY2F0YWxvZyBpZgotICAgKiBuZWNlc3NhcnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKQotICB7Ci0gICAgaW5zdGFuY2UgPSBudWxsOwotICAgIGV4dHhtbGNhdGFsb2djbGFzcyA9IG51bGw7Ci0gICAgZXh0Y2xhc3NMb2FkZXIgPSBudWxsOwotICAgIGV4dFhNTENhdGFsb2dJbnN0YW5jZSA9IG51bGw7Ci0gICAgZW50aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgc2NoZW1hZGlycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBzY2hlbWEgZGlyZWN0b3J5IHRvIGJlIGNoZWNrZWQgZm9yIHNjaGVtYXMgdG8gcmVnaXN0ZXIgaW4gdGhlCi0gICAqIGNhdGFsb2cuCi0gICAqIAotICAgKiBAcGFyYW0gc2NoZW1hZGlyCi0gICAqICAgICAgICAgIFRoZSBkaXJlY3RvcnkgdG8gY2hlY2sgZm9yIHNjaGVtYXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkU2NoZW1hRGlyKFN0cmluZyBzY2hlbWFkaXIpCi0gIHsKLSAgICBzY2hlbWFkaXJzLmFkZChzY2hlbWFkaXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBlbnRpdHkgdG8gdGhlIGNhdGFsb2cuCi0gICAqIAotICAgKiBAcGFyYW0gZW50aXR5Ci0gICAqICAgICAgICAgIFRoZSBlbnRpdHkgdG8gYWRkIHRvIHRoZSBjYXRhbG9nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEVudGl0eShYTUxDYXRhbG9nRW50aXR5SG9sZGVyIGVudGl0eSkKLSAgewotICAgIGVudGl0aWVzLmFkZChlbnRpdHkpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLmludGVybmFsLnhtbC5JWE1MQ2F0YWxvZyNhZGRFbnRyeVRvQ2F0YWxvZyhqYXZhLmxhbmcuU3RyaW5nLAotICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFbnRyeVRvQ2F0YWxvZyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAgIGNhdGFsb2cucHV0KHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuaW50ZXJuYWwueG1sLklYTUxDYXRhbG9nI3Jlc29sdmVFbnRpdHlMb2NhdGlvbihqYXZhLmxhbmcuU3RyaW5nLAotICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHJlc29sdmVFbnRpdHlMb2NhdGlvbihTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAgIFN0cmluZyByZXNvbHZlZGxvY2F0aW9uID0gbnVsbDsKLSAgICAvLyBGaXJzdCB0cnkgdG8gcmVzb2x2ZSB1c2luZyB0aGUgZXh0IGNhdGFsb2cuCi0gICAgSVhNTENhdGFsb2cgZXh0Y2F0YWxvZyA9IGdldEV4dGVuc2lvbkNhdGFsb2dJbnN0YW5jZSgpOwotICAgIGlmIChleHRjYXRhbG9nICE9IG51bGwpCi0gICAgewotICAgICAgcmVzb2x2ZWRsb2NhdGlvbiA9IGV4dGNhdGFsb2cucmVzb2x2ZUVudGl0eUxvY2F0aW9uKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgfQotICAgIGlmIChyZXNvbHZlZGxvY2F0aW9uID09IG51bGwpCi0gICAgewotICAgICAgLy8gaWYgdGhlcmUncyBubyBzeXN0ZW0gaWQgdXNlIHRoZSBwdWJsaWMgaWQKLSAgICAgIGlmIChzeXN0ZW1JZCA9PSBudWxsIHx8IHN5c3RlbUlkLmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIHN5c3RlbUlkID0gcHVibGljSWQ7Ci0gICAgICB9Ci0gICAgICByZXNvbHZlZGxvY2F0aW9uID0gKFN0cmluZykgY2F0YWxvZy5nZXQoc3lzdGVtSWQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzb2x2ZWRsb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBBIGhhbmRsZXIgdXNlZCBpbiBwYXJzaW5nIHRvIGdldCB0aGUgdGFyZ2V0TmFtZXNwYWNlIHN0cmluZyBvZiBhIHNjaGVtYS4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBTY2hlbWFOYW1lc3BhY2VIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLSAgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFNDSEVNQSA9ICJzY2hlbWEiOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxuYW1lLCBTdHJpbmcgYXJnMiwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKGxvY2FsbmFtZS5lcXVhbHMoU0NIRU1BKSkKLSAgICAgIHsKLQotICAgICAgICBpbnQgbnVtQXR0cyA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXR0czsgaSsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICBTdHJpbmcgYXR0bmFtZSA9IGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSk7Ci0gICAgICAgICAgaWYgKGF0dG5hbWUuZXF1YWxzKFRBUkdFVF9OQU1FU1BBQ0UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsbmFtZSwgYXJnMiwgYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB0YXJnZXROYW1lc3BhY2UgZm91bmQgYnkgcGFyc2luZyB0aGUgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSB0YXJnZXROYW1lc3BhY2UgZm91bmQgYnkgcGFyc2luZyB0aGUgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpCi0gICAgewotICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldCB0aGUgc3RhdGUgb2YgdGhlIGhhbmRsZXIgc28gaXQgY2FuIGJlIHJldXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gbnVsbDsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nRW50aXR5SG9sZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nRW50aXR5SG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlY2E2YWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MQ2F0YWxvZ0VudGl0eUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi0vKioKLSAqIEEgY29udGFpbmVyIHRvIGhvbGQgdGhlIGVudGl0eSBpbmZvcm1hdGlvbiB1bnRpbCBhbiBYTUwgY2F0YWxvZyBpcwotICogdG8gYmUgaW5pdGlhbGl6ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nRW50aXR5SG9sZGVyCi17Ci0gIHByaXZhdGUgU3RyaW5nIHB1YmxpY0lkOwotICBwcml2YXRlIFN0cmluZyBzeXN0ZW1JZDsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBwdWJsaWNJZCBUaGUgcHVibGljIGlkIG9mIHRoZSBlbnRpdHkuCi0gICAqIEBwYXJhbSBzeXN0ZW1JZCBUaGUgc3lzdGVtIGlkIG9mIHRoZSBlbnRpdHkuCi0gICAqLwotICBwdWJsaWMgWE1MQ2F0YWxvZ0VudGl0eUhvbGRlcihTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAgIHRoaXMucHVibGljSWQgPSBwdWJsaWNJZDsKLSAgICB0aGlzLnN5c3RlbUlkID0gc3lzdGVtSWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwdWJsaWMgaWQgb2YgdGhlIGVudGl0eS4KLSAgICogQHJldHVybiBUaGUgcHVibGljIGlkIG9mIHRoZSBlbnRpdHkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkKLSAgewotICAgIHJldHVybiBwdWJsaWNJZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN5c3RlbSBpZCBvZiB0aGUgZW50aXR5LgotICAgKiBAcmV0dXJuIFRoZSBzeXN0ZW0gaWQgb2YgdGhlIGVudGl0eS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKQotICB7Ci0gICAgcmV0dXJuIHN5c3RlbUlkOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL1hNTENhdGFsb2dSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODI3Nzg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL1hNTENhdGFsb2dSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogQSByZXNvbHZlciB0byByZXNvbHZlciBlbnRpdGllcyBmcm9tIHRoZSBYTUwgY2F0YWxvZy4KLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2dSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgWE1MQ2F0YWxvZ1Jlc29sdmVyIHhtbENhdGFsb2c7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFhNTENhdGFsb2dSZXNvbHZlcigpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGluc3RhbmNlIG9mIHRoaXMgcmVzb2x2ZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGlzIHJlc29sdmVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFhNTENhdGFsb2dSZXNvbHZlciBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoeG1sQ2F0YWxvZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHhtbENhdGFsb2cgPSBuZXcgWE1MQ2F0YWxvZ1Jlc29sdmVyKCk7Ci0gICAgfQotICAgIHJldHVybiB4bWxDYXRhbG9nOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJlc291cmNlSWRlbnRpZmllcikgdGhyb3dzIFhOSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwdWJsaWNJZCA9IHJlc291cmNlSWRlbnRpZmllci5nZXRQdWJsaWNJZCgpOwotICAgIGlmKHB1YmxpY0lkID09IG51bGwpCi0gICAgewotICAgICAgcHVibGljSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIFN0cmluZyBzeXN0ZW1JZCA9IHJlc291cmNlSWRlbnRpZmllci5nZXRMaXRlcmFsU3lzdGVtSWQoKTsKLSAgICBTdHJpbmcgbG9jYXRpb24gPSBYTUxDYXRhbG9nLmdldEluc3RhbmNlKCkucmVzb2x2ZUVudGl0eUxvY2F0aW9uKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICBYTUxJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBYTUxJbnB1dFNvdXJjZShwdWJsaWNJZCwgc3lzdGVtSWQsIHN5c3RlbUlkLCBpcywgbnVsbCk7Ci0gICAgICAgIHJldHVybiBpbnB1dFNvdXJjZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIG90aGVyd2lzZSByZXR1cm4gbnVsbCB0byB0ZWxsIHRoZSBwYXJzZXIgdG8gbG9jYXRlIHRoZSBzeXN0ZW1JZCBhcyBhIFVSSQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxNZXNzYWdlSW5mb0hlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzYWI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxNZXNzYWdlSW5mb0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotcHVibGljIGNsYXNzIFhNTE1lc3NhZ2VJbmZvSGVscGVyCi17Ci0gIAotICAvL3NlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnJlY29uY2lsZS5EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9BVFRSSUJVVEVTID0gIkFMTF9BVFRSSUJVVEVTIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSJBVFRSSUJVVEVfTkFNRSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRSA9ICJBVFRSSUJVVEVfVkFMVUUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UQUcgPSAiU1RBUlRfVEFHIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJURVhUIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklSU1RfTk9OX1dISVRFU1BBQ0VfVEVYVCA9ICJGSVJTVF9OT05fV0hJVEVTUEFDRV9URVhUIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FTlRJVFlfUkVGRVJFTkNFID0gIlRFWFRfRU5USVRZX1JFRkVSRU5DRSI7IAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9PRl9BVFRSSUJVVEVfV0lUSF9HSVZFTl9WQUxVRSA9ICJWQUxVRV9PRl9BVFRSSUJVVEVfV0lUSF9HSVZFTl9WQUxVRSI7Ci0gIAotICAKLSAgcHVibGljIFhNTE1lc3NhZ2VJbmZvSGVscGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogIHJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHNob3VsZCBiZSB1bmRlcmxpbmVkIHdpdGggdGhlIHJlZCAic3F1aWdnbGVzIgotICAgKiAgdXNpbmcgdGhlIGVycm9yS2V5LCBhbmQgdGhlIG1lc3NhZ2VBcmd1bWVudHMKLSAgICogIDxicj5Qb3NpdGlvbiAwIG9mIHRoZSBhcnJheSByZXR1cm5lZCBjb250YWlucyB0aGUgc2VsZWN0aW9uIFN0cmF0ZWd5LG9yIHdoYXQgRE9NIEVsZW1lbnQgdG8gdW5kZXJsaW5lLiAgCi0gICAqICBGb3IgZXhhbXBsZSAiQVRUUklCVVRFX05BTUUiICAKLSAgICogIDxicj5Qb3NpdGlvbiAxIGNvbnRhaW5zIHRoZSBuYW1lIG9yIHZhbHVlIHRvIHNxdWlnZ2xlLgotICAgKiAgPHA+Rm9yIGV4YW1wbGUsIGlmIHdlIHdhbnRlZCB0byBzcXVpZ2dsZSB0aGUgYXR0cmlidXRlIG5hbWUgb2YgYW4gYXR0cmlidXRlIG5hbWUKLSAgICogIGZvbyB0aGlzIG1ldGhvZCB3b3VsZCByZXR1cm4geyJBVFRSSUJVVEVfTkFNRSIsICJmb28ifQotICAgKiAgPC9wPgotICAgKiAgQHBhcmFtIGVycm9yS2V5IHRoZSBlcnJvciBrZXkgZ2l2ZW4gYnkgdGhlIFhlcmNlcyBwYXJzZXIKLSAgICogIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIHRoZSBhcmd1bWVudHMgdXNlZCBieSBYZXJjZXMgdG8gImZpbGwgaW4gdGhlIGJsYW5rcyIgb2YgdGhlaXIgbWVzc2FnZXMKLSAgICogIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgc3F1aWdnbGUgaW5mb3JtYXRpb24KLSAgICogIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWNvbmNpbGUuRGVsZWdhdGluZ1JlY29uY2lsZVZhbGlkYXRvcgotICAgKiAgCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gY3JlYXRlTWVzc2FnZUluZm8oU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICB7IAotICAgIFN0cmluZyBzZWxlY3Rpb25TdHJhdGVneSA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWVPclZhbHVlID0gbnVsbDsKLQotICAgIC8vWE1MIEVycm9ycwotICAgIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi40LmEiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi40LmQiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi40LmIiKSB8fCBlcnJvcktleS5lcXVhbHMoIk1TR19DT05URU5UX0lOVkFMSUQiKQotICAgICAgICB8IGVycm9yS2V5LmVxdWFscygiTVNHX0NPTlRFTlRfSU5DT01QTEVURSIpIHx8IGVycm9yS2V5LmVxdWFscygiTVNHX1JFUVVJUkVEX0FUVFJJQlVURV9OT1RfU1BFQ0lGSUVEIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjQiKSkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25TdHJhdGVneSA9IFNUQVJUX1RBRzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtdHlwZS4zLjEuMyIpKQotICAgIHsKLSAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gVEVYVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuMyIpKQotICAgIHsKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSBGSVJTVF9OT05fV0hJVEVTUEFDRV9URVhUOwotICAgIH0KLSAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy10eXBlLjMuMS4xIikpCi0gICAgewotICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSBBTExfQVRUUklCVVRFUzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjMuMi4yIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQVRUUklCVVRFX05PVF9ERUNMQVJFRCIpKQotICAgIHsKLSAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gQVRUUklCVVRFX05BTUU7Ci0JICAvL2luIHRoaXMgY2FzZSB3ZSBuZWVkIG5hbWVPclZhbHVlIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdW5kZXJsaW5lCi0JICBuYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1sxXTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtYXR0cmlidXRlLjMiKSB8fCBlcnJvcktleS5lcXVhbHMoIk1TR19BVFRSSUJVVEVfVkFMVUVfTk9UX0lOX0xJU1QiKSkKLSAgICB7CQotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9IEFUVFJJQlVURV9WQUxVRTsgIAotCQkvL2luIHRoaXMgY2FzZSB3ZSBuZWVkIG5hbWVPclZhbHVlIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBBdHRyaWJ1dGUKLSAgICAJaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWF0dHJpYnV0ZS4zIikpCi0gICAgCXsgbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMV07Ci0gICAgCX0KLSAgICAJZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJNU0dfQVRUUklCVVRFX1ZBTFVFX05PVF9JTl9MSVNUIikpCi0gICAgCXsJbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMF07Ci0gICAgCX0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtZWx0LjQuMiIpKQotICAgIHsJc2VsZWN0aW9uU3RyYXRlZ3k9VkFMVUVfT0ZfQVRUUklCVVRFX1dJVEhfR0lWRU5fVkFMVUU7Ci0JCS8vaW4gdGhpcyBjYXNlIHdlIG5lZWQgbmFtZU9yVmFsdWUgdG8gYmUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgd2Ugd2FudCB0byB1bmVybGluZQotICAgIAluYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1sxXTsJCi0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiRW50aXR5Tm90RGVjbGFyZWQiKSkKLSAgICB7ICAJc2VsZWN0aW9uU3RyYXRlZ3k9VEVYVF9FTlRJVFlfUkVGRVJFTkNFOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvL1dTREwgRXJyb3JzCi0gICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJfTUVTU0FHRV9VTkRFRklORURfRk9SX09VVFBVVCIpIHx8Ci0gICAgICAgICAgICAgICBlcnJvcktleS5lcXVhbHMoIl9NRVNTQUdFX1VOREVGSU5FRF9GT1JfSU5QVVQiKSB8fAotICAgICAgICAgICAgICAgZXJyb3JLZXkuZXF1YWxzKCJfTUVTU0FHRV9VTkRFRklORURfRk9SX0ZBVUxUIikpCi0gICAgewotICAgICAgc2VsZWN0aW9uU3RyYXRlZ3k9QVRUUklCVVRFX1ZBTFVFOwotICAgICAgbmFtZU9yVmFsdWU9ICJtZXNzYWdlIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJfUE9SVFRZUEVfVU5ERUZJTkVEX0ZPUl9CSU5ESU5HIikpCi0gICAgewotICAgICAgc2VsZWN0aW9uU3RyYXRlZ3k9QVRUUklCVVRFX1ZBTFVFOwotICAgICAgbmFtZU9yVmFsdWU9InR5cGUiOwotICAgIH0KLSAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIl9PUEVSQVRJT05fVU5ERUZJTkVEX0ZPUl9QT1JUVFlQRSIpKQotICAgIHsKLSAgICAgIHNlbGVjdGlvblN0cmF0ZWd5PUFUVFJJQlVURV9WQUxVRTsKLSAgICAgIG5hbWVPclZhbHVlPSJuYW1lIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJfUEFSVF9JTlZBTElEX0VMRU1FTlQiKSkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25TdHJhdGVneT1BVFRSSUJVVEVfVkFMVUU7Ci0gICAgICBuYW1lT3JWYWx1ZT0iZWxlbWVudCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiX05PX0JJTkRJTkdfRk9SX1BPUlQiKSkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25TdHJhdGVneT1BVFRSSUJVVEVfVkFMVUU7Ci0gICAgICBuYW1lT3JWYWx1ZT0iYmluZGluZyI7Ci0gICAgfQotICAgIAotICAgIFN0cmluZyBtZXNzYWdlSW5mb1tdID0gbmV3IFN0cmluZ1syXTsKLSAgICBtZXNzYWdlSW5mb1swXSA9IHNlbGVjdGlvblN0cmF0ZWd5OwotICAgIG1lc3NhZ2VJbmZvWzFdID0gbmFtZU9yVmFsdWU7Ci0gICAgcmV0dXJuIG1lc3NhZ2VJbmZvOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGwucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL3ZhbGlkYXRld3NkbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmRlZWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL3ZhbGlkYXRld3NkbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLSBDb25zdGFudHMgZm9yIHN0cmluZ3MgIAotCi0hLS0gV2FybmluZyBNZXNzYWdlcwotX1dBUk5fTk9fVkFMRElBVE9SICAgICAgICAgICAgICAgICAgICAgICAgID0gVGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCB2YWxpZGF0b3IgZm9yIHRoZSBuYW1lc3BhY2UgezB9LgotCi1fRVJST1JfUFJPQkxFTV9XU0RMX1ZBTElEQVRPUiAgICAgICAgICAgICAgPSBBIHByb2JsZW0gb2NjdXJyZWQgd2hpbGUgcnVubmluZyB0aGUgV1NETCB2YWxpZGF0b3IgZm9yIG5hbWVzcGFjZSB7MH0uCi1fRVJST1JfTk9fV1NETF9WQUxJREFUT1IgICAgICAgICAgICAgICAgICAgPSBUaGUgbmFtZXNwYWNlIHswfSBzcGVjaWZpZWQgaXMgbm90IGEgdmFsaWQgV1NETCBuYW1lc3BhY2UuCi1fRVJST1JfUFJPQkxFTV9FWFRfVkFMSURBVE9SICAgICAgICAgICAgICAgPSBBIHByb2JlbG0gb2NjdXJyZWQgd2hpbGUgcnVubmluZyB0aGUgRXh0ZW5zaW9uIHZhbGlkYXRvciB7MH0gZm9yIG5hbWVzcGFjZSB7MX0uCi0KLSEtLSBTdHJpbmdzIGZvciBXU0RMIDEuMSB2YWxpZGF0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLV9VTkFCTEVfVE9fSU1QT1JUX0JBRF9MT0NBVElPTiAgICAgICAgICAgICA9IFRoZSB7MH0gZG9jdW1lbnQgY291bGQgbm90IGJlIGltcG9ydGVkLiBDaGVjayB0aGF0IHRoZSBkb2N1bWVudCBleGlzdHMgYW5kIHRoYXQgdGhlIGxvY2F0aW9uIGlzIGNvcnJlY3QuCi1fVU5BQkxFX1RPX0lNUE9SVF9JTlZBTElEICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IGRvY3VtZW50IGNvdWxkIG5vdCBiZSBpbXBvcnRlZCBiZWNhdXNlIGl0IGlzIG5vdCB2YWxpZC4gVGhlIGRvY3VtZW50IG11c3QgYmUgY29ycmVjdGVkIGJlZm9yZSBpdCBjYW4gYmUgaW1wb3J0ZWQuCi1fTk9fQklORElOR19GT1JfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IHBvcnQgaGFzIGFuIGludmFsaWQgYmluZGluZyAtIHsxfS4gQ2hlY2sgdGhhdCB0aGUgezF9IGJpbmRpbmcgaXMgZGVmaW5lZC4KLV9QT1JUVFlQRV9VTkRFRklORURfRk9SX0JJTkRJTkcgICAgICAgICAgICA9IFRoZSB7MH0gcG9ydCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHsxfSBiaW5kaW5nIGlzIHVuZGVmaW5lZC4gQ2hlY2sgdGhlIHswfSBwb3J0IHR5cGUgbmFtZSBhbmQgZW5zdXJlIGl0IGlzIGRlZmluZWQuCi1fT1BFUkFUSU9OX1VOREVGSU5FRF9GT1JfUE9SVFRZUEUgICAgICAgICAgPSBUaGUgb3BlcmF0aW9uIHNwZWNpZmllZCBmb3IgdGhlIHswfSBiaW5kaW5nIGlzIG5vdCBkZWZpbmVkIGZvciBwb3J0IHR5cGUgezF9LiBBbGwgb3BlcmF0aW9ucyBzcGVjaWZpZWQgaW4gdGhpcyBiaW5kaW5nIG11c3QgYmUgZGVmaW5lZCBpbiBwb3J0IHR5cGUgezF9LgotX0lOUFVUX05BTUVfTk9UX1VOSVFVRSAgICAgICAgICAgICAgICAgICAgID0gVGhlIG5hbWUgezB9IHNwZWNpZmllZCBmb3IgdGhpcyBpbnB1dCBlbGVtZW50IGlzIG5vdCB1bmlxdWUuIFRoZSBuYW1lIG9mIGFuIGlucHV0IGVsZW1lbnQgbXVzdCBiZSB1bmlxdWUgZnJvbSB0aGUgbmFtZXMgb2YgYWxsIG90aGVyIGlucHV0IGFuZCBvdXRwdXQgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgezF9IHBvcnQgdHlwZS4KLV9PVVRQVVRfTkFNRV9OT1RfVU5JUVVFICAgICAgICAgICAgICAgICAgICA9IFRoZSBuYW1lIHswfSBzcGVjaWZpZWQgZm9yIHRoaXMgb3V0cHV0IGVsZW1lbnQgaXMgbm90IHVuaXF1ZS4gVGhlIG5hbWUgb2YgYW4gb3V0cHV0IGVsZW1lbnQgbXVzdCBiZSB1bmlxdWUgZnJvbSB0aGUgbmFtZXMgb2YgYWxsIG90aGVyIGlucHV0cyBhbmQgb3V0cHV0IGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIHsxfSBwb3J0IHR5cGUuCi1fTUVTU0FHRV9VTkRFRklORURfRk9SX0lOUFVUICAgICAgICAgICAgICAgPSBUaGUgaW5wdXQgZWxlbWVudCBpcyByZWZlcmVuY2luZyBhbiB1bmRlZmluZWQgbWVzc2FnZSB7MH0uIENoZWNrIHRoYXQgdGhlIG1lc3NhZ2UgbmFtZSBhbmQgbmFtZXNwYWNlIGFyZSBjb3JyZWN0IGFuZCB0aGF0IHRoZSBtZXNzYWdlIGhhcyBiZWVuIGRlZmluZWQuCi1fTUVTU0FHRV9VTkRFRklORURfRk9SX09VVFBVVCAgICAgICAgICAgICAgPSBUaGUgb3V0cHV0IGVsZW1lbnQgaXMgcmVmZXJlbmNpbmcgYW4gdW5kZWZpbmVkIG1lc3NhZ2UgezB9LiBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIG5hbWUgYW5kIG5hbWVzcGFjZSBhcmUgY29ycmVjdCBhbmQgdGhhdCB0aGUgbWVzc2FnZSBoYXMgYmVlbiBkZWZpbmVkLgotX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9GQVVMVCAgICAgICAgICAgICAgID0gVGhlIGZhdWx0IGVsZW1lbnQgaXMgcmVmZXJlbmNpbmcgYW4gdW5kZWZpbmVkIG1lc3NhZ2UgezB9LiBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIG5hbWUgYW5kIG5hbWVzcGFjZSBhcmUgY29ycmVjdCBhbmQgdGhhdCB0aGUgbWVzc2FnZSBoYXMgYmVlbiBkZWZpbmVkLgotX0RVUExJQ0FURV9GQVVMVF9OQU1FICAgICAgICAgICAgICAgICAgICAgID0gQSBmYXVsdCB3aXRoIHRoZSBuYW1lIHswfSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgZm9yIHRoZSB7MX0gMHBlcmF0aW9uLiBDaGVjayB0aGF0IGV2ZXJ5IGZhdWx0IGRlZmluZWQgZm9yIHRoaXMgb3BlcmF0aW9uIGhhcyBhIHVuaXF1ZSBuYW1lLgotX1BBUlRfTk9fRUxFTUVOVF9PUl9UWVBFICAgICAgICAgICAgICAgICAgID0gVGhlIHBhcnQgezB9IGRvZXMgbm90IGhhdmUgYSB0eXBlIGRlZmluZWQuIEV2ZXJ5IHBhcnQgbXVzdCBzcGVjaWZ5IGEgdHlwZSBmcm9tIHNvbWUgdHlwZSBzeXN0ZW0uIFRoZSB0eXBlIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIGJ1aWx0IGluICdlbGVtZW50JyBvciAndHlwZScgYXR0cmlidXRlcyBvciBtYXkgYmUgc3BlY2lmaWVkIHVzaW5nIGFuIGV4dGVuc2lvbiBhdHRyaWJ1dGUuCi1fUEFSVF9CT1RIX0VMRU1FTlRfQU5EX1RZUEUgICAgICAgICAgICAgICAgPSBUaGUgcGFydCB7MH0gaGFzIGJvdGggYW4gZWxlbWVudCBhbmQgYSB0eXBlIGRlZmluZWQuIEV2ZXJ5IHBhcnQgbXVzdCBvbmx5IGhhdmUgYW4gZWxlbWVudCBvciBhIHR5cGUgZGVmaW5lZC4KLV9QQVJUX0lOVkFMSURfRUxFTUVOVCAgICAgICAgICAgICAgICAgICAgICA9IFRoZSBwYXJ0IHswfSBoYXMgYW4gaW52YWxpZCB2YWx1ZSB7MX0gZGVmaW5lZCBmb3IgaXRzIGVsZW1lbnQuIEVsZW1lbnQgZGVjbGFyYXRpb25zIG11c3QgcmVmZXIgdG8gdmFsaWQgdmFsdWVzIGRlZmluZWQgaW4gYSBzY2hlbWEuCi1fUEFSVF9JTlZBTElEX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgcGFydCB7MH0gaGFzIGFuIGludmFsaWQgdmFsdWUgezF9IGRlZmluZWQgZm9yIGl0cyB0eXBlLiBUeXBlIGRlY2xhcmF0aW9ucyBtdXN0IHJlZmVyIHRvIHZhbGlkIHZhbHVlcyBkZWZpbmVkIGluIGEgc2NoZW1hLgotX0RVUExJQ0FURV9PUEVSQVRJT05fRk9SX1BPUlRUWVBFICAgICAgICAgID0gQW4gb3BlcmF0aW9uIHdpdGggdGhlIG5hbWUgezB9IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBmb3IgdGhlIHsxfSBwb3J0IHR5cGUuIEV2ZXJ5IG9wZXJhdGlvbiBkZWZpbmVkIGZvciBhIHBvcnQgdHlwZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4gCi1fU0VSVklDRV9OQU1FX0FMUkVBRFlfREVGSU5FRCAgICAgICAgICAgICAgPSBBIFNlcnZpY2Ugd2l0aCB0aGUgbmFtZSB7MH0gaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiBFdmVyeSBzZXJ2aWNlIGluIHRoZSBXU0RMIGRvY3VtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLgotX0JJTkRJTkdfTkFNRV9BTFJFQURZX0RFRklORUQgICAgICAgICAgICAgID0gQSBiaW5kaW5nIHdpdGggdGhlIG5hbWUgezB9IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gRXZlcnkgYmluZGluZyBpbiB0aGUgV1NETCBkb2N1bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4KLV9NRVNTQUdFX05BTUVfQUxSRUFEWV9ERUZJTkVEICAgICAgICAgICAgICA9IEEgbWVzc2FnZSB3aXRoIHRoZSBuYW1lIHswfSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIEV2ZXJ5IG1lc3NhZ2UgaW4gdGhlIFdTREwgZG9jdW1lbnQgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuCi1fUE9SVFRZUEVfTkFNRV9BTFJFQURZX0RFRklORUQgICAgICAgICAgICAgPSBBIHBvcnQgdHlwZSB3aXRoIHRoZSBuYW1lIHswfSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIEV2ZXJ5IHBvcnQgdHlwZSBpbiB0aGUgV1NETCBkb2N1bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4KLV9NT1JFX1RIRU5fT05FX0FERFJFU1NfUE9SVCAgICAgICAgICAgICAgICA9IEFuIGFkZHJlc3MgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGZvciBwb3J0IHswfS4gRWFjaCBwb3J0IGNhbiBoYXZlIG9ubHkgb25lIGFkZHJlc3MgZGVmaW5lZC4KLV9OT19BRERSRVNTX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFRoZSBwb3J0IHswfSBoYXMgbm8gYWRkcmVzcyBkZWZpbmVkLiBFYWNoIHBvcnQgbXVzdCBkZWZpbmUgb25lIGFkZHJlc3MuCi1fUE9SVF9OQU1FX05PVF9VTklRVUUgICAgICAgICAgICAgICAgICAgICAgPSBBIHBvcnQgd2l0aCB0aGUgbmFtZSB7MH0gaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiBFdmVyeSBwb3J0IGluIHRoZSBXU0RMIGRvY3VtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLgotX09QRVJBVElPTl9OT19JTlBVVF9PUl9PVVRQVVQgICAgICAgICAgICAgID0gTm8gaW5wdXQgb3Igb3V0cHV0IGVsZW1lbnQgaGFzIGJlZW4gZGVmaW5lZCBmb3IgdGhlIHswfSBvcGVyYXRpb24uIEFuIGlucHV0IGVsZW1lbnQsIGFuIG91dHB1dCBlbGVtZW50LCBvciBib3RoIG11c3QgYmUgZGVmaW5lZCBmb3IgZXZlcnkgb3BlcmF0aW9uLgotX1dBUk5fU09BUEVOQ19JTVBPUlRFRF9QQVJUICAgICAgICAgICAgICAgID0gVGhlIHBhcnQgezB9IHVzZXMgYW4gZWxlbWVudCBvciB0eXBlIGZyb20gdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIGJ1dCB0aGUgbmFtZXNwYWNlIGhhcyBub3QgYmVlbiBpbXBvcnRlZC4gVGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIHNob3VsZCBiZSBpbXBvcnRlZCB3aXRoIGFuIGltcG9ydCBzdGF0ZW1lbnQgYmVmb3JlIGl0IGlzIHVzZWQuCi1fV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1NDSEVNQSAgICAgICAgICAgICAgPSBUaGUgaW5saW5lIHNjaGVtYSB1c2VzIGFuIGVsZW1lbnQgb3IgdHlwZSBmcm9tIHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBidXQgdGhlIG5hbWVzcGFjZSBoYXMgbm90IGJlZW4gaW1wb3J0ZWQuIFRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBzaG91bGQgYmUgaW1wb3J0ZWQgd2l0aCBhbiBpbXBvcnQgc3RhdGVtZW50IGJlZm9yZSBpdCBpcyB1c2VkLgotX1JFRkVSRU5DRURfRklMRV9DT05UQUlOU19FUlJPUlMgICAgICAgICAgID0gUmVmZXJlbmNlZCBmaWxlIGNvbnRhaW5zIGVycm9ycyAoezB9KS4KLV9XQVJOX09MRF9TQ0hFTUFfTkFNRVNQQUNFICAgICAgICAgICAgICAgICA9IEFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgbmFtZXNwYWNlIGhhcyBiZWVuIHNwZWNpZmllZC4gezB9IGlzIHRoZSBzY2hlbWEgbmFtZXNwYWNlIHRoYXQgc2hvdWxkIGJlIHVzZWQuCi1fRVJST1JfTVVMVElQTEVfVFlQRVNfREVGSU5FRCAgICAgICAgICAgICAgPSBBIHR5cGVzIHNlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiBPbmx5IG9uZSB0eXBlcyBlbGVtZW50IGlzIGFsbG93ZWQuCi1fV0FSTl9XUk9OR19OU19PTl9JTVBPUlQgICAgICAgICAgICAgICAgICAgPSBUaGUgZmlsZSBjYW5ub3QgYmUgaW1wb3J0ZWQgYmVjYXVzZSB0aGUgbmFtZXNwYWNlIHswfSBkb2VzIG5vdCBtYXRjaCB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQnJ3MgdGFyZ2V0IG5hbWVzcGFjZSB7MX0uCi0hLS0gUmVmZXJlbmNlZCBmaWxlIGVycm9yCi0hLS0gTm90ZSB0byB0cmFuc2xhdG9yIC0gX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UgbmVlZHMgYSB0cmFpbGluZyBzcGFjZSBhcyBhbm90aGVyIG1lc3NhZ2UgbWF5IGZvbGxvdy4KLV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFICAgICAgICAgID0gUmVmZXJlbmNlZCBmaWxlIGNvbnRhaW5zIGVycm9ycyAoezB9KS4gCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGxodHRwLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGxodHRwLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzN2ZjMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2RsaHR0cC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotX0VSUk9SX05PX0xPQ0FUSU9OX0ZPUl9BRERSRVNTICAgICAgICAgICAgICAgICAgID0gTm8gbG9jYXRpb24gaGFzIGJlZW4gc3BlY2lmaWVkIGZvciB0aGlzIGFkZHJlc3MuIEV2ZXJ5IGFkZHJlc3MgbXVzdCBoYXZlIGEgdmFsaWQgbG9jYXRpb24gc3BlY2lmaWVkLgotX0VSUk9SX0lOVkFMSURfUE9SVF9FTEVNRU5UICAgICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBlbGVtZW50IGRlZmluZWQgaGVyZSBpcyB1bmRlZmluZWQgZm9yIHRoZSBIVFRQIG5hbWVzcGFjZS4gVGhlIG9ubHkgdmFsaWQgZWxlbWVudCBpcyAnYWRkcmVzcycuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIEhUVFAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50IGlzICdiaW5kaW5nJy4KLV9FUlJPUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0VMRU1FTlQgICAgICAgICA9IFRoZSB7MH0gZWxlbWVudCBkZWZpbmVkIGhlcmUgaXMgdW5kZWZpbmVkIGZvciB0aGUgSFRUUCBuYW1lc3BhY2UuIFRoZSBvbmx5IHZhbGlkIGVsZW1lbnQgaXMgJ29wZXJhdGlvbicuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX0lOUFVUX0VMRU1FTlQgICAgICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIEhUVFAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50cyBhcmUgJ3VybFJlcGxhY2VtZW50JyBhbmQgJ3VybEVuY29kZWQnLgotX0VSUk9SX0lOVkFMSURfSFRUUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiAgICAgICAgID0gVGhlIHswfSBlbGVtZW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgaGVyZS4gVGhpcyBlbGVtZW50IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBIVFRQIG5hbWVzcGFjZSBmb3IgdXNlIGF0IHRoaXMgcG9pbnQuCi1fRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX0FERFJFU1MgICAgICAgICAgICAgICAgPSBBbiBIVFRQIGFkZHJlc3MgY2Fubm90IGJlIHNwZWNpZmllZCBoZXJlIGFzIHRoZSB7MH0gYmluZGluZyB0aGF0IHRoZSB7MX0gcG9ydCByZWZlcnMgdG8gZG9lcyBub3QgaGF2ZSBhbiBIVFRQIGJpbmRpbmcgZWxlbWVudCBkZWZpbmVkLiBUaGVyZSBtdXN0IGJlIGFuIEhUVFAgYmluZGluZyBlbGVtZW50IGRlZmluZWQgaW4gb3JkZXIgdG8gc3BlY2lmeSBhbiBIVFRQIGFkZHJlc3MgZm9yIGEgYmluZGluZy4KLV9FUlJPUl9JTlZBTElEX0JJTkRJTkdfVkVSQiAgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gdmVyYiBkZWZpbmVkIGZvciB0aGUgSFRUUCBiaW5kaW5nIGlzIGludmFsaWQuIFRoZSBIVFRQIGJpbmRpbmcgdmVyYiBtdXN0IGJlICdHRVQnIG9yICdQT1NUJyBhbmQgaXMgY2FzZSBzZW5zaXRpdmUuCi1fRVJST1JfSU5WQUxJRF9MT0NBVElPTl9VUkkgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgbG9jYXRpb24gVVJJIGlzIGludmFsaWQgZm9yIHRoZSBIVFRQIG9wZXJhdGlvbi4gWW91IG11c3Qgc3BlY2lmeSBhIHZhbGlkIGxvY2F0aW9uIFVSSSBmb3IgZXZlcnkgSFRUUCBPcGVyYXRpb24uCi1fRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX09QRVJBVElPTiAgICAgICAgICAgICAgPSBUaGUgezB9IGJpbmRpbmcgdGhhdCB0aGUgSFRUUCBvcGVyYXRpb24gaXMgc3BlY2lmaWVkIGZvciBkb2VzIG5vdCBoYXZlIGFuIEhUVFAgYmluZGluZyBkZWZpbmVkLiBBbiBIVFRQIGJpbmRpbmcgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvIGRlZmluZSBhbiBIVFRQIG9wZXJhdGlvbiBoZXJlLgotX0VSUk9SX05PX0hUVFBPUEVSQVRJT05fRk9SX1VSTCAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBvcGVyYXRpb24gdGhhdCB0aGUgezF9IEhUVFAgZWxlbWVudCBpcyBzcGVjaWZpZWQgZm9yIGRvZXMgbm90IGhhdmUgYW4gSFRUUCBvcGVyYXRpb24gZGVmaW5lZC4gQSBIVFRQIG9wZXJhdGlvbiBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gZGVmaW5lIGEgezF9IEhUVFAgZWxlbWVudCBoZXJlLgotX0VSUk9SX05PVF9PTkxZX0VMRU1FTlRfREVGSU5FRCAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBIVFRQIGVsZW1lbnQgZGVmaW5lZCBpcyBub3QgdGhlIG9ubHkgZWxlbWVudCBkZWZpbmVkIGZvciB0aGUgaW5wdXQgZWxlbWVudC4gV2hlbiB7MH0gaXMgZGVmaW5lZCBpdCBtdXN0IGJlIHRoZSBvbmx5IGNoaWxkIGVsZW1lbnQgZGVmaW5lZCBmb3IgdGhlIGlucHV0IGVsZW1lbnQuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGxtaW1lLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGxtaW1lLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzM2U3YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2RsbWltZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGxzb2FwLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGxzb2FwLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZWQ5NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2Rsc29hcC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1fRVJST1JfTk9fTE9DQVRJT05fRk9SX0FERFJFU1MgICAgICAgICAgICAgICAgICAgPSBObyBsb2NhdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIHRoaXMgYWRkcmVzcy4gRXZlcnkgYWRkcmVzcyBtdXN0IGhhdmUgYSB2YWxpZCBsb2NhdGlvbiBzcGVjaWZpZWQuCi1fRVJST1JfSU5WQUxJRF9QT1JUX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgIHswfSBlbGVtZW50IGRlZmluZWQgaGVyZSBpcyB1bmRlZmluZWQgZm9yIHRoZSBTT0FQIG5hbWVzcGFjZS4gVGhlIG9ubHkgdmFsaWQgZWxlbWVudCBpcyAnYWRkcmVzcycuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX1NUWUxFICAgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IHN0eWxlIGRlZmluZWQgZm9yIHRoZSBTT0FQIGJpbmRpbmcgaW4gaW52YWxpZC4gVGhlIFNPQVAgYmluZGluZyBzdHlsZSBtdXN0IGJlICdycGMnIG9yICdkb2N1bWVudCcuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX1VSSSAgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgdHJhbnNwb3J0IFVSSSBoYXMgbm90IGJlZW4gZGVmaW5lZCBmb3IgdGhlIFNPQVAgYmluZGluZy4gWW91IG11c3Qgc3BlY2lmeSBhIHRyYW5zcG9ydCBVUkkgZm9yIGV2ZXJ5IFNPQVAgYmluZGluZy4KLV9FUlJPUl9JTlZBTElEX09QRVJBVElPTl9TVFlMRSAgICAgICAgICAgICAgICAgICA9IFRoZSBzdHlsZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIG9wZXJhdGlvbiBpcyBpbnZhbGlkLiBUaGUgU09BUCBvcGVyYXRpb24gc3R5bGUgbXVzdCBiZSAncnBjJyBvciAnZG9jdW1lbnQnLgotX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5UICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBlbGVtZW50IGRlZmluZWQgaGVyZSBpcyB1bmRlZmluZWQgZm9yIHRoZSBTT0FQIG5hbWVzcGFjZS4gVGhlIG9ubHkgdmFsaWQgZWxlbWVudCBpcyAnYmluZGluZycuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9FTEVNRU5UICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIFNPQVAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50IGlzICdvcGVyYXRpb24nLgotX0VSUk9SX0lOVkFMSURfSEVBREVSX0JPRFlfRUxFTUVOVCAgICAgICAgICAgICAgID0gVGhlIHswfSBlbGVtZW50IGRlZmluZWQgaGVyZSBpcyB1bmRlZmluZWQgZm9yIHRoZSBTT0FQIG5hbWVzcGFjZS4gVGhlIG9ubHkgdmFsaWQgZWxlbWVudHMgYXJlICdib2R5JywgJ2hlYWRlcicgYW5kICdoZWFkZXJmYXVsdCcuCi1fRVJST1JfSU5WQUxJRF9GQVVMVF9FTEVNRU5UICAgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIFNPQVAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50IGlzICdmYXVsdCcuCi0KLSEtLSBBIFNPQVAgYm9keSBlbGVtZW50IGluIGEgV1NETCBkb2N1bWVudCBjYW4gaGF2ZSBhbiBhdHRyaWJ1dGUgInVzZSIgZGVmaW5lZCB0byBiZSBlaXRoZXIgbGl0ZXJhbCBvciBlbmNvZGVkLiAtLQotIS0tIFRoaXMgc3RyaW5nIGlzIHVzZWQgaW4gYW4gZXJyb3IgdGFzayBpbiBXU0FEIGlmIHRoZSBkb2N1bWVudCBzcGVjaWZpZXMgYSB1c2Ugb3RoZXIgdGhlbiBsaXRlcmFsIG9yIGVuY29kZWQuIC0tIAotIS0tIEZvciBleGFtcGxlLCBpZiB0aGUgZG9jdW1lbnQgc3BlY2lmaWVzIHRoZSB1c2Ugb2YgdGhlIFNPQVAgYm9keSBhcyAic2ltcGxlIiB0aGUgb3V0cHV0IHN0cmluZyBzaG91bGQgYmU6ICAgIC0tCi0hLS0gVGhlICdzaW1wbGUnIHVzZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIGJvZHkgaXMgaW52YWxpZC4gVGhlIHVzZSBtdXN0IGJlIGxpdGVyYWwgb3IgZW5jb2RlZC4gICAgICAgICAgICAgICAgLS0KLV9FUlJPUl9JTlZBTElEX0JPRFlfVVNFICAgICAgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gdXNlIHNwZWNpZmllZCBmb3IgdGhlIFNPQVAgYm9keSBpcyBpbnZhbGlkLiBUaGUgdXNlIG11c3QgYmUgbGl0ZXJhbCBvciBlbmNvZGVkLgotX0VSUk9SX0lOVkFMSURfQk9EWV9FTkNPRElOR19TVFlMRSAgICAgICAgICAgICAgID0gVGhlcmUgaXMgbm8gZW5jb2Rpbmcgc3R5bGUgVVJJIGRlZmluZWQgZm9yIHRoZSBTT0FQIGJvZHkuIFlvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIFVSSSBmb3IgdGhlIGVuY29kaW5nIHN0eWxlIHdoZW4gdGhlIHVzZSBpcyBlbmNvZGVkLgotX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX1VOREVGSU5FRCAgICAgICAgICAgICAgID0gVGhlIHswfSBwYXJ0IHNwZWNpZmllZCBhcyBhIHBhcnQgZm9yIHRoZSBTT0FQIGJvZHkgaXMgdW5kZWZpbmVkLiAgWW91IGNhbiBvbmx5IHNwZWNpZnkgZGVmaW5lZCBwYXJ0cy4KLV9FUlJPUl9JTlZBTElEX0JPRFlfUEFSVF9OT1RfVFlQRSAgICAgICAgICAgICAgICA9IFRoZSB7MH0gcGFydCBkb2VzIG5vdCBoYXZlIGEgdHlwZSBkZWZpbmVkIGFuZCBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIGEgU09BUCBib2R5IHdpdGggaXRzIHVzZSBlbmNvZGVkLiBXaGVuIHVzZSBpcyBlbmNvZGVkIG9uIGEgU09BUCBib2R5LCBhbGwgcGFydHMgZGVmaW5lZCBtdXN0IG9ubHkgY29udGFpbiBhIHZhbGlkIHR5cGUuCi1fRVJST1JfSU5WQUxJRF9TT0FQX0VMRU1FTlRfRk9SX0xPQ0FUSU9OICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgY2Fubm90IGJlIHNwZWNpZmllZCBoZXJlLiBUaGlzIGVsZW1lbnQgaXMgbm90IGRlZmluZWQgaW4gdGhlIFNPQVAgbmFtZXNwYWNlIGZvciB1c2UgYXQgdGhpcyBwb2ludC4KLV9FUlJPUl9OT19TT0FQQklORElOR19GT1JfQUREUkVTUyAgICAgICAgICAgICAgICA9IEEgU09BUCBhZGRyZXNzIGNhbm5vdCBiZSBzcGVjaWZpZWQgaGVyZSBhcyB0aGUgezB9IGJpbmRpbmcgdGhhdCB0aGUgezF9IHBvcnQgcmVmZXJzIHRvIGRvZXMgbm90IGhhdmUgYSBTT0FQIGJpbmRpbmcgZWxlbWVudCBkZWZpbmVkLiBUaGVyZSBtdXN0IGJlIGEgU09BUCBiaW5kaW5nIGVsZW1lbnQgZGVmaW5lZCBpbiBvcmRlciB0byBzcGVjaWZ5IGEgU09BUCBhZGRyZXNzIGZvciBhIGJpbmRpbmcuCi1fRVJST1JfSEVBREVSX01FU1NBR0VfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IG1lc3NhZ2Ugc3BlY2lmaWVkIGZvciB0aGUgU09BUCBoZWFkZXIgaXMgdW5kZWZpbmVkLiBUaGUgbWVzc2FnZSBzcGVjaWZpZWQgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LgotX0VSUk9SX0hFQURFUl9QQVJUX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBwYXJ0IHNwZWNpZmllZCBpbiBtZXNzYWdlIHsxfSBmb3IgdGhlIFNPQVAgaGVhZGVyIGlzIHVuZGVmaW5lZC4gRW5zdXJlIHRoZSBwYXJ0IGlzIGRlZmluZWQgaW4gdGhlIHsxfSBtZXNzYWdlLgotX0VSUk9SX0hFQURFUl9VU0VfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSB1c2Ugc3BlY2lmaWVkIGZvciB0aGUgU09BUCBoZWFkZXIgaXMgaW52YWxpZC4gVGhlIHVzZSBtdXN0IGJlIHNwZWNpZmllZCBhcyBsaXRlcmFsIG9yIGVuY29kZWQuCi1fRVJST1JfSEVBREVSX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEICAgICAgICAgICAgPSBUaGUgZW5jb2Rpbmcgc3R5bGUgZm9yIHRoZSBTT0FQIGhlYWRlciBpcyBub3Qgc3BlY2lmaWVkLiBXaGVuIHRoZSB1c2UgaXMgZW5jb2RlZCB0aGUgZW5jb2Rpbmcgc3R5bGUgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBVUkkuCi1fRVJST1JfSEVBREVSX05BTUVTUEFDRV9VTkRFRklORUQgICAgICAgICAgICAgICAgPSBUaGUgbmFtZXNwYWNlIGZvciB0aGUgU09BUCBoZWFkZXIgaXMgbm90IHNwZWNpZmllZC4gV2hlbiB0aGUgdXNlIGlzIGVuY29kZWQgYSBuYW1lc3BhY2UgVVJJIG11c3QgYmUgZGVmaW5lZC4KLV9FUlJPUl9IRUFERVJGQVVMVF9NRVNTQUdFX1VOREVGSU5FRCAgICAgICAgICAgICA9IFRoZSB7MH0gbWVzc2FnZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIGhlYWRlciBmYXVsdCBpcyB1bmRlZmluZWQuIFRoZSBtZXNzYWdlIHNwZWNpZmllZCBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuCi1fRVJST1JfSEVBREVSRkFVTFRfUEFSVF9VTkRFRklORUQgICAgICAgICAgICAgICAgPSBUaGUgezB9IHBhcnQgc3BlY2lmaWVkIGluIG1lc3NhZ2UgezF9IGZvciB0aGUgU09BUCBoZWFkZXIgZmF1bHQgaXMgdW5kZWZpbmVkLiBFbnN1cmUgdGhlIHBhcnQgaXMgZGVmaW5lZCBpbiB0aGUgezF9IG1lc3NhZ2UuIAotX0VSUk9SX0hFQURFUkZBVUxUX1VTRV9VTkRFRklORUQgICAgICAgICAgICAgICAgID0gVGhlIHswfSB1c2Ugc3BlY2lmaWVkIGZvciB0aGUgU09BUCBoZWFkZXIgZmF1bHQgaXMgaW52YWxpZC4gVGhlIHVzZSBtdXN0IGJlIHNwZWNpZmllZCBhcyBsaXRlcmFsIG9yIGVuY29kZWQuCi1fRVJST1JfSEVBREVSRkFVTFRfRU5DT0RJTkdTVFlMRV9VTkRFRklORUQgICAgICAgPSBUaGUgZW5jb2Rpbmcgc3R5bGUgZm9yIHRoZSBTT0FQIGhlYWRlciBmYXVsdCBpcyBub3Qgc3BlY2lmaWVkLiBXaGVuIHRoZSB1c2UgaXMgZW5jb2RlZCB0aGUgZW5jb2Rpbmcgc3R5bGUgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBVUkkuCi1fRVJST1JfSEVBREVSRkFVTFRfTkFNRVNQQUNFX1VOREVGSU5FRCAgICAgICAgICAgPSBUaGUgbmFtZXNwYWNlIGZvciB0aGUgU09BUCBoZWFkZXIgZmF1bHQgaXMgbm90IHNwZWNpZmllZC4gV2hlbiB0aGUgdXNlIGlzIGVuY29kZWQgYSBuYW1lc3BhY2UgVVJJIG11c3QgYmUgZGVmaW5lZC4KLV9FUlJPUl9JTlZBTElEX0ZBVUxUX05BTUUgICAgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gbmFtZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIGZhdWx0IGlzIGludmFsaWQuIFRoZSBuYW1lIHNwZWNpZmllZCBtdXN0IGJlIHsxfSwgdGhlIG5hbWUgZnJvbSB0aGUgZmF1bHQgcGFyZW50IGVsZW1lbnQuCi1fRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX09QRVJBVElPTiAgICAgICAgICAgICAgPSBUaGUgezB9IGJpbmRpbmcgdGhhdCB0aGUgU09BUCBvcGVyYXRpb24gaXMgc3BlY2lmaWVkIGZvciBkb2VzIG5vdCBoYXZlIGEgU09BUCBiaW5kaW5nIGRlZmluZWQuIEEgU09BUCBiaW5kaW5nIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byBkZWZpbmUgYSBTT0FQIG9wZXJhdGlvbiBoZXJlLgotX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9CT0RZICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBiaW5kaW5nIHRoYXQgdGhlIFNPQVAgYm9keSBpcyBzcGVjaWZpZWQgZm9yIGRvZXMgbm90IGhhdmUgYSBTT0FQIGJpbmRpbmcgZGVmaW5lZC4gQSBTT0FQIGJpbmRpbmcgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvIGRlZmluZSBhIFNPQVAgYm9keSBoZXJlLgotX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9IRUFERVIgICAgICAgICAgICAgICAgID0gVGhlIHswfSBiaW5kaW5nIHRoYXQgdGhlIFNPQVAgaGVhZGVyIGlzIHNwZWNpZmllZCBmb3IgZG9lcyBub3QgaGF2ZSBhIFNPQVAgYmluZGluZyBkZWZpbmVkLiBBIFNPQVAgYmluZGluZyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gZGVmaW5lIGEgU09BUCBoZWFkZXIgaGVyZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvV1NETENvbmZpZ3VyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1dTRExDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4ZWMyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvV1NETENvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLldTRExWYWxpZGF0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwyMC5XU0RMMjBWYWxpZGF0b3JEZWxlZ2F0ZTsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgdG8gc2V0IHZhbGlkYXRvcnMgYW5kIHNjaGVtYXMgdGhhdCBjYW4gYmUgdXNlZAotICogYnkgYWxsIGludGVyZmFjZXMgdG8gdGhlIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIFdTRExDb25maWd1cmF0b3IKLXsKLSAgLyoqCi0gICAqIFJlZ2lzdGVyIGEgV1NETCB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcyB0byByZWdpc3Rlci4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBjbGFzc2xvYWRlciBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldTRExWYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSwgU3RyaW5nIHJlc291cmNlQnVuZGxlLCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikKLSAgewotICAgIFdTRExWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBXU0RMVmFsaWRhdG9yRGVsZWdhdGUodmFsaWRhdG9yQ2xhc3NuYW1lLCByZXNvdXJjZUJ1bmRsZSwgY2xhc3Nsb2FkZXIpOwotICAgIFZhbGlkYXRvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVnaXN0ZXJWYWxpZGF0b3IobmFtZXNwYWNlLCBkZWxlZ2F0ZSwgVmFsaWRhdG9yUmVnaXN0cnkuV1NETF9WQUxJREFUT1IpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIGFuIGV4dGVuc2lvbiB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcyB0byByZWdpc3Rlci4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBjbGFzc2xvYWRlciBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckV4dGVuc2lvblZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lLCBTdHJpbmcgcmVzb3VyY2VCdW5kbGUsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKQotICB7Ci0gICAgV1NETFZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlID0gbmV3IFdTRExWYWxpZGF0b3JEZWxlZ2F0ZSh2YWxpZGF0b3JDbGFzc25hbWUsIHJlc291cmNlQnVuZGxlLCBjbGFzc2xvYWRlcik7Ci0gICAgVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlclZhbGlkYXRvcihuYW1lc3BhY2UsIGRlbGVnYXRlLCBWYWxpZGF0b3JSZWdpc3RyeS5FWFRfVkFMSURBVE9SKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciBhIFdTREwgMS4xIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHZhbGlkYXRvcgotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NuYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MgdG8gcmVnaXN0ZXIKLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBjbGFzc2xvYWRlciBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldTREwxMVZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lLCBTdHJpbmcgcmVzb3VyY2VCdW5kbGUsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKQotICB7Ci0gIAlXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSh2YWxpZGF0b3JDbGFzc25hbWUsIHJlc291cmNlQnVuZGxlLCBjbGFzc2xvYWRlcik7Ci0gICAgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlclZhbGlkYXRvcihuYW1lc3BhY2UsIGRlbGVnYXRlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJlZ2lzdGVyIGEgV1NETCAyLjAgdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgdmFsaWRhdG9yCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcyB0byByZWdpc3RlcgotICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBiYXNlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcldTREwyMFZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lLCBTdHJpbmcgcmVzb3VyY2VCdW5kbGUpCi0gIHsKLSAgICBXU0RMMjBWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBXU0RMMjBWYWxpZGF0b3JEZWxlZ2F0ZSh2YWxpZGF0b3JDbGFzc25hbWUsIHJlc291cmNlQnVuZGxlKTsKLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwyMC5WYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyVmFsaWRhdG9yKG5hbWVzcGFjZSwgZGVsZWdhdGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoZSBkZWZhdWx0IHZhbGlkYXRvcnMuIFJlZ2lzdGVycyB2YWxpZGF0b3JzIGZvcjoKLSAgICogV1NETCAxLjEKLSAgICogV1NETCAxLjEgU09BUAotICAgKiBXU0RMIDEuMSBIVFRQCi0gICAqIFdTREwgMS4xIE1JTUUKLSAgICogCi0gICAqIEBwYXJhbSByYiAtIHRoZSByZXNvdXJjZSBidW5kbGUgb2YgdGhlIFdTREwgMS4xIHZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRGVmYXVsdFZhbGlkYXRvcnMoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICAvLyBSZWdpc3RlciB0aGUgV1NETCAxLjEgdmFsaWRhdG9yIGNvbnRyb2xsZXIgYW5kIHZhbGlkYXRvcnMuCi0gICAgcmVnaXN0ZXJXU0RMVmFsaWRhdG9yKENvbnN0YW50cy5OU19VUklfV1NETCwgIm9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLldTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIiLCAidmFsaWRhdGV3c2RsIiwgbnVsbCk7Ci0gICAgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IoQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuV1NETDExQmFzaWNWYWxpZGF0b3IiLCAidmFsaWRhdGV3c2RsIiwgbnVsbCk7Ci0gICAgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IoCi0gICAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnN0YW50cy5OU19IVFRQLCAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuaHR0cC5IVFRQVmFsaWRhdG9yIiwidmFsaWRhdGV3c2RsaHR0cCIsIG51bGwpOwotICAgIHJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKAotICAgICAgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25zdGFudHMuTlNfU09BUDExLCJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5zb2FwLlNPQVBWYWxpZGF0b3IiLCJ2YWxpZGF0ZXdzZGxzb2FwIiwgbnVsbCk7Ci0gICAgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IoCi0gICAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnN0YW50cy5OU19NSU1FLCJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5taW1lLk1JTUVWYWxpZGF0b3IiLCJ2YWxpZGF0ZXdzZGxtaW1lIiwgbnVsbCk7Ci0gICAgCi0gICAgLy8gVGhlIFdTREwgMS4xIHNjaGVtYSB2YWxpZGF0b3IgaXMgYSBzcGVjaWFsIGNhc2UgYXMgaXQgaXMgcmVnaXN0ZXJlZCBmb3IgdGhyZWUgbmFtZXNwYWNlcy4KLSAgICAvLyBXZSB3aWxsIGNhbGwgZGlyZWN0bHkgaGVyZSBzbyB3ZSBjYW4gdXNlIHRoZSBzYW1lIGRlbGVnYXRlIGZvciBhbGwgdGhyZWUgbmFtZXNwYWNlcy4KLSAgICBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSgib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkLklubGluZVNjaGVtYVZhbGlkYXRvciIsICJ2YWxpZGF0ZXdzZGwiKTsKLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5WYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyVmFsaWRhdG9yKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTksIGRlbGVnYXRlKTsKLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5WYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyVmFsaWRhdG9yKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDAsIGRlbGVnYXRlKTsKLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5WYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyVmFsaWRhdG9yKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDEsIGRlbGVnYXRlKTsKLSAgICAKLSAgICAvLyBSZWdpc3RlciB0aGUgV1NETCAyLjAgdmFsaWRhdG9yIGNvbnRyb2xsZXIgYW5kIHZhbGlkYXRvcnMuCi0vLyAgICByZWdpc3RlcldTRExWYWxpZGF0b3Iob3JnLmVjbGlwc2Uud3NkbDIwLm1vZGVsLmltcGwuQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMjAuV1NETDIwVmFsaWRhdG9yQ29udHJvbGxlciIsICJ2YWxpZGF0ZXdzZGwiLCBudWxsKTsKLS8vICAgIAotLy8gICAgcmVnaXN0ZXJXU0RMMjBWYWxpZGF0b3Iob3JnLmVjbGlwc2Uud3NkbDIwLm1vZGVsLmltcGwuQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMjAuV1NETDIwQmFzaWNWYWxpZGF0b3IiLCAidmFsaWRhdGV3c2RsIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvRXh0ZW5zaW9uVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L0V4dGVuc2lvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjlhYTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvRXh0ZW5zaW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5hbnQ7Ci0KLS8qKgotICogQW4gZXh0ZW5zaW9uIEFudCBXU0RMIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2lvblZhbGlkYXRvcgotewotICBwcml2YXRlIFN0cmluZyBjbGFzc25hbWUgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyByZXNvdXJjZWJ1bmRsZSA9IG51bGw7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGFzcyhTdHJpbmcgY2xhc3NuYW1lKQotICB7Ci0gICAgdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkKLSAgewotICAgIHJldHVybiB0aGlzLmNsYXNzbmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VidW5kbGUpCi0gIHsKLSAgICB0aGlzLnJlc291cmNlYnVuZGxlID0gcmVzb3VyY2VidW5kbGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VidW5kbGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvVVJJUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvVVJJUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2NjIzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1VSSVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5hbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotCi0vKioKLSAqIFRoZSBVUklSZXNvbHZlciB0YXNrIGFsbG93cyBzcGVjaWZ5aW5nIGFuIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIgd2l0aAotICogdGhlIFdTRExWYWxpZGF0ZSBBbnQgdGFzay4KLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyIGV4dGVuZHMgVGFzawotewotICBwcml2YXRlIFN0cmluZyBjbGF6eiA9IG51bGw7Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotICAgKiAKLSAgICogQHBhcmFtIGNsYXp6IFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGF6eikKLSAgewotICAgIHRoaXMuY2xhenogPSBjbGF6ejsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGNsYXNzIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gY2xheno7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvV1NETFZhbGlkYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1dTRExWYWxpZGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmQ1YjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvV1NETFZhbGlkYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRFRETG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvblJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLldTRExWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5VUklSZXNvbHZlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuV1NETENvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLQotLyoqCi0gKiBBbiBBbnQgdGFzayB0byBydW4gV1NETCB2YWxpZGF0aW9uIG9uIGEgZmlsZSBvciBhIHNldCBvZiBmaWxlcy4KLSAqIAotICogT3B0aW9ucwotICogLSBmaWxlIC0gdGhlIGZpbGUgdG8gcnVuIHZhbGlkYXRpb24gb24gKG9wdGlvbmFsIGlmIGZpbGVzZXQgaXMgdXNlZCkKLSAqIC0gZmFpbG9uZXJyb3IgLSBmYWlsIHRoZSBidWlsZCBwcm9jZXNzIG9uIHRoZSBmaXJzdCBmaWxlIHdpdGggYW4gZXJyb3IKLSAqIC0gd3NpY29tcGxpYW5jZSAtIGhvdyB0byByZXBvcnQgV1MtSSBlcnJvcnMgLSBSRVFVSVJFLCBTVUdHRVNULCBJR05PUkUgKGRlZmF1bHRzIHRvIFJFUVVJUkUpCi0gKiAKLSAqIFN1cHBvcnRlZCBOZXN0ZWQgRWxlbWVudHMKLSAqIC0geG1sY2F0YWxvZyAtIGFuIHhtbCBjYXRhbG9nCi0gKiAtIGR0ZCAgICAgICAgLSBhIGR0ZCBzcGVjaWZpY2F0aW9uIGFzIHdvdWxkIGFwcGVhciBpbiBhbiB4bWxjYXRhbG9nCi0gKiAtIHNjaGVtYSAgICAgLSBhIHNjaGVtYSBzcGVjaWZpY2F0aW9uIGFzIHdvdWxkIGFwcGVhciBpbiBhbiB4bWxjYXRhbG9nCi0gKiAtIGVudGl0eSAgICAgLSBhbiBlbnRpdHkgc3BlY2lmaWNhdGlvbiBhcyB3b3VsZCBhcHBlYXIgaW4gYW4geG1sY2F0YWxvZwotICogLSBmaWxlc2V0ICAgIC0gYSBzZXQgb2YgZmlsZXMgdG8gdmFsaWRhdGUKLSAqIC0gd3NkbDExdmFsaWRhdG9yIC0gYW4gZXh0ZW5zaW9uIFdTREwgMS4xIHZhbGlkYXRvcgotICogLSB1cmlyZXNvbHZlciAtIGFuIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRlIGV4dGVuZHMgVGFzawotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFVJX1BST1BFUlRJRVMgPSAidmFsaWRhdGV3c2RsdWkiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9QUk9QRVJUSUVTID0gb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25zdGFudHMuV1NETF9WQUxJREFUT1JfUFJPUEVSVElFU19GSUxFOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9FUlJPUl9OT19GSUxFX1NQRUNJRklFRCA9ICJfRVJST1JfTk9fRklMRV9TUEVDSUZJRUQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9JTkZPUk1BVElPTl9ERUxJTUlURVIgPSAiX1VJX0lORk9STUFUSU9OX0RFTElNSVRFUiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgX1VJX0FDVElPTl9WQUxJREFUSU5HX0ZJTEUgPSAiX1VJX0FDVElPTl9WQUxJREFUSU5HX0ZJTEUiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9FUlJPUl9NQVJLRVIgPSAiX1VJX0VSUk9SX01BUktFUiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgX1VJX1dBUk5JTkdfTUFSS0VSID0gIl9VSV9XQVJOSU5HX01BUktFUiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgX1VJX1ZBTElEID0gIl9VSV9WQUxJRCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgX1VJX0lOVkFMSUQgPSAiX1VJX0lOVkFMSUQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9FWENfVU5BQkxFX1RPX1ZBTElEQVRFX0ZJTEUgPSAiX0VYQ19VTkFCTEVfVE9fVkFMSURBVEVfRklMRSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgX0VYQ19XU0RMX0ZBSUxfT05fRVJST1IgPSAiX0VYQ19XU0RMX0ZBSUxfT05fRVJST1IiOwotICAKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBXU0lfUkVRVUlSRSA9ICJyZXF1aXJlIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBXU0lfU1VHR0VTVCA9ICJzdWdnZXN0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBXU0lfSUdOT1JFID0gImlnbm9yZSI7Ci0KLSAgLy8gR2xvYmFsIFZhcnMKLSAgcHJvdGVjdGVkIExpc3QgZmlsZXNldHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmlsZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBQYXRoIGNsYXNzcGF0aDsKLSAgcHJvdGVjdGVkIFN0cmluZyB4c2REaXJlY3RvcnkgPSBudWxsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBmYWlsT25FcnJvciA9IGZhbHNlOwotICBwcm90ZWN0ZWQgWE1MQ2F0YWxvZyBnbG9iYWxYTUxDYXRhbG9nID0gbmV3IFhNTENhdGFsb2coKTsKLSAgcHJvdGVjdGVkIFN0cmluZyB3c2lMZXZlbCA9IFdTSV9SRVFVSVJFOwotICBwcm90ZWN0ZWQgTGlzdCB3c2RsMTF2YWxpZGF0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgTGlzdCBleHRVUklSZXNvbHZlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0dWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETFZhbGlkYXRlKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFRlbGxzIHRoZSBXU0RMIHZhbGlkYXRlIHRhc2sgdG8gZmFpbCB0aGUgYnVpbGQgaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZmFpbE9uRXJyb3IgV2hldGhlciB0byBmYWlsIG9uIGVycm9yIG9yIG5vdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGJvb2xlYW4gZmFpbE9uRXJyb3IpCi0gIHsKLSAgICB0aGlzLmZhaWxPbkVycm9yID0gZmFpbE9uRXJyb3I7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBXUy1JIGNvbXBsaWFuY2UgbGV2ZWwgb2YgdGhlIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBjb21wbGlhbmNlbGV2ZWwgLSB0aGUgY29tcGxpYW5jZSBsZXZlbCB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdTSUNvbXBsaWFuY2UoU3RyaW5nIGNvbXBsaWFuY2VsZXZlbCkKLSAgewotICAgIGlmIChjb21wbGlhbmNlbGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShXU0lfU1VHR0VTVCkpCi0gICAgewotICAgICAgd3NpTGV2ZWwgPSBXU0lfU1VHR0VTVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcGxpYW5jZWxldmVsLmVxdWFsc0lnbm9yZUNhc2UoV1NJX0lHTk9SRSkpCi0gICAgewotICAgICAgd3NpTGV2ZWwgPSBXU0lfSUdOT1JFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgd3NpTGV2ZWwgPSBXU0lfUkVRVUlSRTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGJhc2Ugc2NoZW1hIGZpbGVzIGZvciB0aGUgY2F0YWxvZyBhcmUgbG9jYXRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBkaXIgLSB0aGUgZGlyZWN0b3J5IG9mIHRoZSBiYXNlIHNjaGVtYSBmaWxlcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hRGlyKFN0cmluZyBkaXIpCi0gIHsKLSAgICB4c2REaXJlY3RvcnkgPSBkaXI7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGEgZmlsZSB0byBydW4gV1NETCB2YWxpZGF0aW9uIG9uLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUgLSBhIGZpbGUgdG8gcnVuIHZhbGlkYXRpb24gb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIGZpbGUpCi0gIHsKLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIHNldCBvZiBmaWxlcyB0byBydW4gV1NETCB2YWxpZGF0aW9uIG9uLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgRmlsZVNldCBvZiBmaWxlcyB0byBydW4gV1NETCB2YWxpZGF0aW9uIG9uCi0gICAqLwotICBwdWJsaWMgRmlsZVNldCBjcmVhdGVGaWxlc2V0KCkKLSAgewotICAgIEZpbGVTZXQgZmlsZXNldCA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgZmlsZXNldHMuYWRkKGZpbGVzZXQpOwotICAgIHJldHVybiBmaWxlc2V0OwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBYTUwgY2F0YWxvZyB0byB0aGUgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGNhdGFsb2cgLSB0aGUgY2F0YWxvZyB0byBhZGQgdG8gdGhlIHZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFhNTENhdGFsb2coWE1MQ2F0YWxvZyBjYXRhbG9nKQotICB7Ci0gICAgZ2xvYmFsWE1MQ2F0YWxvZy5hZGRDb25maWd1cmVkWE1MQ2F0YWxvZyhjYXRhbG9nKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFdTREwxMVZhbGlkYXRvcihFeHRlbnNpb25WYWxpZGF0b3IgZXh0VmFsKQotICB7Ci0gICAgd3NkbDExdmFsaWRhdG9ycy5hZGQoZXh0VmFsKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbGxvdyBzcGVjaWZpY2F0aW9uIG9mIGFuIGVudGl0eSBvdXRzaWRlIG9mIGFuIFhNTENhdGFsb2cuCi0gICAqIAotICAgKiBAcmV0dXJuIGEgRFRETG9jYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGVudGl0eQotICAgKiovCi0gIHB1YmxpYyBEVERMb2NhdGlvbiBjcmVhdGVFbnRpdHkoKQotICB7Ci0gICAgRFRETG9jYXRpb24gZHRkTG9jID0gbmV3IERURExvY2F0aW9uKCk7Ci0gICAgZ2xvYmFsWE1MQ2F0YWxvZy5hZGRFbnRpdHkoZHRkTG9jKTsKLSAgICByZXR1cm4gZHRkTG9jOwotICB9Ci0KLSAgLyoqCi0gICAqIEFsbG93IHNwZWNpZmljYXRpb24gb2YgYSBEVEQgb3V0c2lkZSBvZiBhbiBYTUxDYXRhbG9nLgotICAgKiAKLSAgICogQHJldHVybiBhIERURExvY2F0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBEVEQKLSAgICoqLwotICBwdWJsaWMgRFRETG9jYXRpb24gY3JlYXRlRFREKCkKLSAgewotICAgIERURExvY2F0aW9uIGR0ZExvYyA9IG5ldyBEVERMb2NhdGlvbigpOwotICAgIGdsb2JhbFhNTENhdGFsb2cuYWRkRW50aXR5KGR0ZExvYyk7Ci0gICAgcmV0dXJuIGR0ZExvYzsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIFVSSVJlc29sdmVyIGV4dGVuc2lvbi4KLSAgICogCi0gICAqIEByZXR1cm4gQSBVUklSZXNvbHZlci4KLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHZlciBjcmVhdGVVUklSZXNvbHZlcigpCi0gIHsKLSAgICBVUklSZXNvbHZlciB1cmlyZXMgPSBuZXcgVVJJUmVzb2x2ZXIoKTsKLSAgICBleHRVUklSZXNvbHZlcnMuYWRkKHVyaXJlcy5nZXRDbGFzc05hbWUoKSk7Ci0gICAgcmV0dXJuIHVyaXJlczsKLSAgICAKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgZmlsZXMgdG8gcnVuIFdTREwgdmFsaWRhdGlvbiBvbi4gVGFrZXMgdGhlIGZpbGUgYW5kIGZpbGVzZXQKLSAgICogYW5kIGNyZWF0ZXMgdGhlIGxpc3QuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHZhbGlkYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgZ2V0RmlsZUxpc3QoKQotICB7Ci0gICAgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8vIGlmIGEgc3BlY2lmaWMgZmlsZSB3YXMgc3BlY2lmaWVkIGFkZCBpdCB0byB0aGUgbGlzdAotICAgIGlmIChmaWxlICE9IG51bGwpCi0gICAgewotICAgICAgZmlsZXMuYWRkKGZpbGUpOwotICAgIH0KLQotICAgIC8vIGdvIHRocm91Z2ggYWxsIGZpbGVzZXRzIHNwZWNpZmllZCBhbmQgYWRkIGFsbCB0aGUgZmlsZXMgdG8gdGhlIGxpc3QKLSAgICBJdGVyYXRvciBmc0l0ZXIgPSBmaWxlc2V0cy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChmc0l0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEZpbGVTZXQgZmlsZXNldCA9IChGaWxlU2V0KWZzSXRlci5uZXh0KCk7Ci0gICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZmlsZXNldC5nZXREaXJlY3RvcnlTY2FubmVyKGZpbGVzZXQuZ2V0UHJvamVjdCgpKTsKLQotICAgICAgU3RyaW5nW10gZmlsZWxpc3QgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICBpbnQgbnVtRmlsZXMgPSBmaWxlbGlzdC5sZW5ndGg7Ci0gICAgICBpZiAoZmlsZXMgIT0gbnVsbCAmJiBudW1GaWxlcyA+IDApCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRmlsZXM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGZpbGVzLmFkZChmaWxlbGlzdFtpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZpbGVzOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCi0gIHsKLSAgICAvLyB0aGUgcmVzb3VyY2UgYnVuZGxlcyBmb3IgdGhlIHVpIGFuZCB2YWxpZGF0b3IgYXJlIG5lZWRlZAotICAgIFJlc291cmNlQnVuZGxlIHZhbGlkYXRvclJCID0gbnVsbDsKLSAgICBNZXNzYWdlR2VuZXJhdG9yIG1lc3NHZW4gPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFJlc291cmNlQnVuZGxlIHVpUkIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoVUlfUFJPUEVSVElFUyk7Ci0gICAgICBtZXNzR2VuID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IodWlSQik7Ci0gICAgICB2YWxpZGF0b3JSQiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShWQUxJREFUT1JfUFJPUEVSVElFUyk7Ci0gICAgfQotICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBpZiB0aGUgcmVzb3VyY2UgYnVuZGxlcyBjYW4ndCBiZSBvcGVuZWQgd2UgY2FuJ3QgcmVwb3J0IGVycm9yIHNvIHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gb3BlbiByZXNvdXJjZSBidW5kbGUuICIgKyBlKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIFhNTCBjYXRhbG9nLgotICAgIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2cuc2V0RXh0ZW5zaW9uWE1MQ2F0YWxvZygib3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS51aS5hbnQuWE1MQ2F0YWxvZ0ltcGwiLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotICAgIFhNTENhdGFsb2dJbXBsIHhtbENhdGFsb2cgPSAoWE1MQ2F0YWxvZ0ltcGwpb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuWE1MQ2F0YWxvZy5nZXRJbnN0YW5jZSgpOwotICAgIHhtbENhdGFsb2cuYWRkWE1MQ2F0YWxvZyhnbG9iYWxYTUxDYXRhbG9nKTsKLSAgICAKLSAgICBXU0RMVmFsaWRhdG9yIHdzZGxWYWxpZGF0b3IgPSBuZXcgV1NETFZhbGlkYXRvcigpOwotICAgIAotICAgIC8vIFNldCB0aGUgZXh0ZW5zaW9uIFVSSVJlc29sdmVycy4KLSAgICBJdGVyYXRvciByZXNvbHZlcnNJdGVyID0gZXh0VVJJUmVzb2x2ZXJzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUocmVzb2x2ZXJzSXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIHJlc29sdmVyQ2xhc3MgPSAoU3RyaW5nKXJlc29sdmVyc0l0ZXIubmV4dCgpOwotICAgICAgd3NkbFZhbGlkYXRvci5hZGRVUklSZXNvbHZlcihuZXcgVVJJUmVzb2x2ZXJEZWxlZ2F0ZShyZXNvbHZlckNsYXNzLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpLmdldFVSSVJlc29sdmVyKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gdmFsaWRhdGUuCi0gICAgTGlzdCBmaWxlcyA9IGdldEZpbGVMaXN0KCk7Ci0gICAgCi0gICAgLy8gUmVnaXN0ZXIgdGhlIFdTREwgMS4xIGV4dGVuc2lvbiB2YWxpZGF0b3JzLgotICAgIEl0ZXJhdG9yIHdzZGwxMWV4dEl0ZXIgPSB3c2RsMTF2YWxpZGF0b3JzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUod3NkbDExZXh0SXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaW9uVmFsaWRhdG9yIGV4dFZhbCA9IChFeHRlbnNpb25WYWxpZGF0b3Ipd3NkbDExZXh0SXRlci5uZXh0KCk7Ci0gICAgICBXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKGV4dFZhbC5nZXROYW1lc3BhY2UoKSwgZXh0VmFsLmdldENsYXNzTmFtZSgpLCBleHRWYWwuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLy8gVGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYW55IGZpbGVzIHRvIHZhbGlkYXRlLgotICAgIGlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4obWVzc0dlbi5nZXRTdHJpbmcoX0VSUk9SX05PX0ZJTEVfU1BFQ0lGSUVEKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gUmVnaXN0ZXIgdGhlIGRlZmF1bHQgdmFsaWRhdG9ycyBhbmQgc2NoZW1hcy4KLSAgICBXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyRGVmYXVsdFZhbGlkYXRvcnModmFsaWRhdG9yUkIpOwotICAgIGlmICh4c2REaXJlY3RvcnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nLmFkZFNjaGVtYURpcih4c2REaXJlY3RvcnkpOwotICAgIH0KLQotICAgIC8vIFZhbGlkYXRlIGFsbCB0aGUgZmlsZXMgc3BlY2lmaWVkLgotICAgIEl0ZXJhdG9yIGlGaWxlcyA9IGZpbGVzLml0ZXJhdG9yKCk7Ci0KLSAgICAvLyBDb21tb24gc3RyaW5ncyBuZWVkZWQgaW4gdmFsaWRhdGlvbiBvdXRwdXQuCi0gICAgU3RyaW5nIGluZm9EZWxpbSA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9JTkZPUk1BVElPTl9ERUxJTUlURVIpOwotICAgIFN0cmluZyB2YWxpZCA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9WQUxJRCk7Ci0gICAgU3RyaW5nIGludmFsaWQgPSBtZXNzR2VuLmdldFN0cmluZyhfVUlfSU5WQUxJRCk7Ci0gICAgU3RyaW5nIGVycm9ybWFya2VyID0gbWVzc0dlbi5nZXRTdHJpbmcoX1VJX0VSUk9SX01BUktFUik7Ci0gICAgU3RyaW5nIHdhcm5pbmdtYXJrZXIgPSBtZXNzR2VuLmdldFN0cmluZyhfVUlfV0FSTklOR19NQVJLRVIpOwotCi0gICAgaW50IHdzaUNvbmZvcm1hbmNlTGV2ZWw7Ci0gICAgCi0gICAgLy8gU2V0IHRoZSBXUy1JIGNvbXBsaWFuY2UgbGV2ZWwuCi0gICAgaWYgKHdzaUxldmVsLmVxdWFscyhXU0lfU1VHR0VTVCkpCi0gICAgewotICAgICAgLy93c2lDb25mb3JtYW5jZUxldmVsID0gVmFsaWRhdGlvbkNvbnRyb2xsZXIuV1NJX1NVR0dFU1Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKHdzaUxldmVsLmVxdWFscyhXU0lfSUdOT1JFKSkKLSAgICB7Ci0gICAgICAvL3dzaUNvbmZvcm1hbmNlTGV2ZWwgPSBWYWxpZGF0aW9uQ29udHJvbGxlci5XU0lfSUdOT1JFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy93c2lDb25mb3JtYW5jZUxldmVsID0gVmFsaWRhdGlvbkNvbnRyb2xsZXIuV1NJX1JFUVVJUkU7Ci0gICAgfQotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG51bGw7Ci0gICAgYm9vbGVhbiBub3R2YWxpZCA9IHRydWU7Ci0gICAgd2hpbGUgKGlGaWxlcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgbm90dmFsaWQgPSBmYWxzZTsKLSAgICAgIFN0cmluZyBmaWxlbmFtZSA9IChTdHJpbmcpaUZpbGVzLm5leHQoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKGluZm9EZWxpbSkuYXBwZW5kKCJcbiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9BQ1RJT05fVkFMSURBVElOR19GSUxFLCBmaWxlbmFtZSkpLmFwcGVuZCgiIC0gIik7Ci0KLSAgICAgICAgSVZhbGlkYXRpb25SZXBvcnQgdmFsUmVwb3J0ID0gd3NkbFZhbGlkYXRvci52YWxpZGF0ZShmaWxlbmFtZSk7Ci0KLSAgICAgICAgSVZhbGlkYXRpb25NZXNzYWdlW10gbWVzc2FnZXMgPSB2YWxSZXBvcnQuZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0KLSAgICAgICAgaWYgKCF2YWxSZXBvcnQuaGFzRXJyb3JzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKHZhbGlkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKGludmFsaWQpOwotICAgICAgICAgIG5vdHZhbGlkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpLmFwcGVuZChpbmZvRGVsaW0pLmFwcGVuZCgiXG4iKTsKLQotICAgICAgICByZXN1bHQuYXBwZW5kKHJlcG9ydE1lc3NhZ2VzKG1lc3NhZ2VzLCBlcnJvcm1hcmtlciwgd2FybmluZ21hcmtlcikpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmIChub3R2YWxpZCAmJiBmYWlsT25FcnJvcikKLSAgICAgICAgewotICAgICAgICAgIC8vIHdlIGZhaWwgb24gZXJyb3IgYnkgdGhyb3dpbmcgYSBidWlsZCBleGNlcHRpb24KLSAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc0dlbi5nZXRTdHJpbmcoX0VYQ19XU0RMX0ZBSUxfT05fRVJST1IpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4obWVzc0dlbi5nZXRTdHJpbmcoX0VYQ19VTkFCTEVfVE9fVkFMSURBVEVfRklMRSwgZmlsZW5hbWUsIGUpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nLnJlc2V0KCk7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBzdHJpbmcgd2l0aCBmb3JtYXR0ZWQgb3V0cHV0IGZvciB0aGUgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZXMgVGhlIG1lc3NhZ2VzIHRvIHJlcG9ydC4KLSAgICogQHBhcmFtIGVycm9ybWFya2VyIFRoZSBtYXJrZXIgdG8gdXNlIGZvciBlcnJvciBtZXNzYWdlcy4KLSAgICogQHBhcmFtIHdhcm5pbmdtYXJrZXIgVGhlIG1hcmtlciB0byB1c2UgZm9yIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqIEByZXR1cm4gQSBzdHJpbmcgd2l0aCB0aGUgZm9ybWF0dGVkIG91dHB1dC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVwb3J0TWVzc2FnZXMoSVZhbGlkYXRpb25NZXNzYWdlW10gbWVzc2FnZXMsIFN0cmluZyBlcnJvcm1hcmtlciwgU3RyaW5nIHdhcm5pbmdtYXJrZXIpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgcmV0dXJuQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgaWYgKG1lc3NhZ2VzID09IG51bGwpCi0gICAgICByZXR1cm4gcmV0dXJuQnVmZmVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICBpbnQgbnVtTWVzc2FnZXMgPSBtZXNzYWdlcy5sZW5ndGg7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IG51bU1lc3NhZ2VzOyBpKyspCi0gICAgewotICAgICAgSVZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTsKLQotICAgICAgaWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfRVJST1IpCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSBlcnJvcm1hcmtlcjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfV0FSTklORykKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IHdhcm5pbmdtYXJrZXI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgIH1pZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9FUlJPUikKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IGVycm9ybWFya2VyOwotICAgICAgfQotICAgICAgZWxzZSBpZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9XQVJOSU5HKQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gd2FybmluZ21hcmtlcjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgfWlmKG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0VSUk9SKQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gZXJyb3JtYXJrZXI7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSB3YXJuaW5nbWFya2VyOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICB9aWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfRVJST1IpCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSBlcnJvcm1hcmtlcjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfV0FSTklORykKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IHdhcm5pbmdtYXJrZXI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgIH0KLSAgICAgIHJldHVybkJ1ZmZlcgotICAgICAgICAuYXBwZW5kKHByZWZpeCkKLSAgICAgICAgLmFwcGVuZCgiICIpCi0gICAgICAgIC5hcHBlbmQobWVzc2FnZS5nZXRMaW5lKCkpCi0gICAgICAgIC5hcHBlbmQoIjoiKQotICAgICAgICAuYXBwZW5kKG1lc3NhZ2UuZ2V0Q29sdW1uKCkpCi0gICAgICAgIC5hcHBlbmQoIjoiKQotICAgICAgICAuYXBwZW5kKG1lc3NhZ2UuZ2V0TWVzc2FnZSgpKQotICAgICAgICAuYXBwZW5kKCJcbiIpOwotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuQnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1hNTENhdGFsb2dJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1hNTENhdGFsb2dJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MGY4ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9YTUxDYXRhbG9nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuYW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRURExvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2c7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXU0RMIFZhbGlkYXRvcidzIFhNTCBDYXRhbG9nIHRoYXQgdXNlcyB0aGUgWE1MIENhdGFsb2cKLSAqIGZyb20gYW50LgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ0ltcGwgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nCi17Ci0gIHByb3RlY3RlZCBYTUxDYXRhbG9nIHhtbENhdGFsb2cgPSBuZXcgWE1MQ2F0YWxvZygpOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2cjYWRkRW50cnlUb0NhdGFsb2coamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVudHJ5VG9DYXRhbG9nKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgRFRETG9jYXRpb24gcmVzTG9jID0gbmV3IERURExvY2F0aW9uKCk7Ci0gICAgcmVzTG9jLnNldExvY2F0aW9uKHN5c3RlbUlkKTsKLSAgICByZXNMb2Muc2V0UHVibGljSWQocHVibGljSWQpOwotICAgIHhtbENhdGFsb2cuYWRkRW50aXR5KHJlc0xvYyk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nI3Jlc29sdmVFbnRpdHlMb2NhdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyByZXNvbHZlRW50aXR5TG9jYXRpb24oU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBTdHJpbmcgcmVzb2x2ZWRJZCA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnB1dFNvdXJjZSBpcyA9IHhtbENhdGFsb2cucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgaWYgKGlzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc29sdmVkSWQgPSBpcy5nZXRTeXN0ZW1JZCgpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIC8vIG5lZWRzIHRvIHJldHVybiBudWxsIGlmIGl0IGNhbid0IHJlc29sdmUgdGhlIGlkCi0gICAgaWYgKHJlc29sdmVkSWQgIT0gbnVsbCAmJiByZXNvbHZlZElkLmVxdWFscygiIikpCi0gICAgewotICAgICAgcmVzb2x2ZWRJZCA9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiByZXNvbHZlZElkOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGNvbmZpZ3VyZWQgWE1MIENhdGFsb2cgdG8gdGhpcyBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIGNhdGFsb2cgQSBjb25maWd1cmVkIFhNTCBjYXRhbG9nIHRvIGFkZCB0byB0aGlzIGNhdGFsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRYTUxDYXRhbG9nKFhNTENhdGFsb2cgY2F0YWxvZykKLSAgewotICAgIHhtbENhdGFsb2cuYWRkQ29uZmlndXJlZFhNTENhdGFsb2coY2F0YWxvZyk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVVJJUmVzb2x2ZXJSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVVJJUmVzb2x2ZXJSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTY1ODYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1VSSVJlc29sdmVyUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXJEZWxlZ2F0ZTsKLQotLyoqCi0gKiBSZWFkIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXJzLgotICogCi0gKiAgPGV4dGVuc2lvbgotICogICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnVyaXJlc29sdmVyIj4KLSAqICAgIDx1cmlyZXNvbHZlcgotICogICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uc29tZWNsYXNzIi8+Ci0gKiAgIDwvZXh0ZW5zaW9uPgotICogIAotICovCi1jbGFzcyBVUklSZXNvbHZlclJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInVyaXJlc29sdmVyIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgcHJvdGVjdGVkIFN0cmluZyB0YWdOYW1lOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHZlclJlZ2lzdHJ5UmVhZGVyKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIGhhbmRsZSB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cyB0aGF0IG1hdGNoCi0gICAqIHRoZSBzcGVkaWZpZWQgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgTGlzdCByZWFkUmVnaXN0cnkoKQotICB7Ci0gIAlMaXN0IHJlc29sdmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgSVVSSVJlc29sdmVyIHJlc29sdmVyID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgICBpZihyZXNvbHZlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb2x2ZXJMaXN0LmFkZChyZXNvbHZlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc29sdmVyTGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhbmQgZGVhbCB3aXRoIHRoZSBleHRlbnNpb24gcG9pbnRzLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGV4dGVuc2lvbiBwb2ludCBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIElVUklSZXNvbHZlciByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRVhURU5TSU9OX1BPSU5UX0lEKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzb2x2ZXJDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0KLSAgICAgIGlmIChyZXNvbHZlckNsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyID0KLSAgICAgICAgICAgIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbkNsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICByZXR1cm4gbmV3IFVSSVJlc29sdmVyRGVsZWdhdGUocmVzb2x2ZXJDbGFzcywgcGx1Z2luTG9hZGVyKS5nZXRVUklSZXNvbHZlcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9VUklSZXNvbHZlcldyYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1VSSVJlc29sdmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2M4ZjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1VSSVJlc29sdmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x2ZXI7Ci0KLS8qKgotICogQW4gd3JhcHBlciBVUkkgcmVzb2x2ZXIgdGhhdCB3cmFwcyB0aGUgV2ViIFN0YW5kYXJkIFRvb2xzIFVSSSByZXNvbHZlcgotICogaW4gYSBXU0RMIHZhbGlkYXRvciBVUkkgcmVzb2x2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlcldyYXBwZXIgaW1wbGVtZW50cyBJVVJJUmVzb2x2ZXIKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFVSSVJlc29sdmVyV3JhcHBlcigpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLmludGVybmFsLnJlc29sdmVyLklVUklSZXNvbHZlciNyZXNvbHZlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBVUklSZXNvbHZlciByZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCB0ZW1wVVJMID0gbmV3IFVSTChyZXN1bHQpOwotICAgICAgdGVtcFVSTCA9IFBsYXRmb3JtLnJlc29sdmUodGVtcFVSTCk7Ci0gICAgICByZXN1bHQgPSB0ZW1wVVJMLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgfQotICAgIC8vIElmIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3QgcmV0dXJuIG51bGwuCi0gICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIChyZXN1bHQuZXF1YWxzKHN5c3RlbUlkKSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdGVXU0RMQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9WYWxpZGF0ZVdTRExBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzNWIxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9WYWxpZGF0ZVdTRExBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbkluZm9JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbk1lc3NhZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuWE1MTWVzc2FnZUluZm9IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGVBY3Rpb247Ci0KLS8qKgotICogRWNsaXBzZSBhY3Rpb24gZm9yIHJ1bm5pbmcgdGhlIFdTREwgdmFsaWRhdG9yLiAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlV1NETEFjdGlvbiBleHRlbmRzIFZhbGlkYXRlQWN0aW9uCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfT1BFTiA9ICJyZWZlcmVuY2VkRmlsZUVycm9yKCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfRklMRV9FUlJPUl9DTE9TRSA9ICIpIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8vLyI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9VSV9TQVZFX0RJUlRZX0ZJTEVfTUVTU0FHRSA9ICJfVUlfU0FWRV9ESVJUWV9GSUxFX01FU1NBR0UiOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVUlfU0FWRV9ESVJUWV9GSUxFX1RJVExFID0gIl9VSV9TQVZFX0RJUlRZX0ZJTEVfVElUTEUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UgPSAiX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVTVEVEX0VSUk9SUyA9ICJORVNURURfRVJST1JTIjsKLQotICBwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBzaG93RGlhbG9nIFdoZXRoZXIgdG8gc2hvdyBhIGRpYWxvZyB3aXRoIHRoZSBzdGF0dXMgdXBvbiBjb21wbGV0aW9uLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRlV1NETEFjdGlvbihJRmlsZSBmaWxlLCBib29sZWFuIHNob3dEaWFsb2cpCi0gIHsKLSAgCXN1cGVyKGZpbGUsIHNob3dEaWFsb2cpOwotICB9Ci0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGdpdmVuIGZpbGUgYW5kIGFzc2lnbiBtYXJrZXJzIGNvcnJlc3BvbmRpbmdseSB0byB0aGUgZmlsZS4gSWYKLSAgICogcmVxdWlyZWQsIHNob3cgYSBkaWFsb2cgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoZmluYWwgSUZpbGUgZmlsZSkKLSAgewotICAgIGZpbmFsIFZhbGlkYXRpb25PdXRjb21lIHZhbGlkYXRpb25PdXRjb21lID0gbmV3IFZhbGlkYXRpb25PdXRjb21lKCk7Ci0gICAgSVdvcmtzcGFjZVJ1bm5hYmxlIG9wID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgewotICAgICAgICBXU0RMVmFsaWRhdG9yIHdzZGxWYWxpZGF0b3IgPSBXU0RMVmFsaWRhdG9yLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGNsZWFyTWFya2VycyhmaWxlKTsKLSAgICAgICAgSVZhbGlkYXRpb25SZXBvcnQgdmFsUmVwb3J0ID0gbnVsbDsKLQotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldENhbm9uaWNhbEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIGxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSkKLSAgICAgICAgewotICAgICAgICAgIHZhbFJlcG9ydCA9IHdzZGxWYWxpZGF0b3IudmFsaWRhdGUobG9jYXRpb24sIGlucHV0U3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxSZXBvcnQgPSB3c2RsVmFsaWRhdG9yLnZhbGlkYXRlKEZJTEVfUFJPVE9DT0wgKyBsb2NhdGlvbiwgaW5wdXRTdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIHZhbGlkYXRpb25PdXRjb21lLmlzV1NETFZhbGlkID0gdmFsUmVwb3J0LmlzV1NETFZhbGlkKCk7Ci0gICAgICAgIHZhbGlkYXRpb25PdXRjb21lLmlzVmFsaWQgPSAhdmFsUmVwb3J0Lmhhc0Vycm9ycygpOwotICAgICAgICBpZiAodmFsUmVwb3J0LmdldFZhbGlkYXRpb25NZXNzYWdlcygpLmxlbmd0aCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsaWRhdGlvbk91dGNvbWUuaGFzTWVzc2FnZXMgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpZGF0aW9uT3V0Y29tZS5oYXNNZXNzYWdlcyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBjcmVhdGVNYXJrZXJzKGZpbGUsIGNvbnZlcnRWYWxpZGF0aW9uTWVzc2FnZXModmFsUmVwb3J0LmdldFZhbGlkYXRpb25NZXNzYWdlcygpKSk7Ci0gICAgICAgIC8vY3JlYXRlTWFya2VycyhmaWxlLCB2YWxpZGF0b3JtYW5hZ2VyLmdldFdhcm5pbmdMaXN0KCksIFdBUk5JTkdfTUFSS0VSKTsKLSAgICAgICAgCi0gICAgICAgIC8vZmlsZS5zZXRTZXNzaW9uUHJvcGVydHkoVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1JfTUVTU0FHRV9NQVBfUVVBTElGSUVEX05BTUUsIHZhbFJlcG9ydC5nZXROZXN0ZWRNZXNzYWdlcygpKTsKLSAgICAgICAgZmlsZS5zZXRTZXNzaW9uUHJvcGVydHkob3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1JfTUVTU0FHRV9NQVBfUVVBTElGSUVEX05BTUUsIGNvbnZlcnROZXN0ZWRWYWxpZGF0aW9uTWVzc2FnZXModmFsUmVwb3J0LmdldE5lc3RlZE1lc3NhZ2VzKCkpKTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihvcCwgbnVsbCk7Ci0KLSAgICAgIGlmIChzaG93RGlhbG9nKQotICAgICAgewotICAgICAgICBzaG93RGlhbG9nKHZhbGlkYXRpb25PdXRjb21lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQ29udmVydCBXU0RMIHZhbGlkYXRpb24gbWVzc2FnZXMgdG8gdmFsaWRhdGlvbiBmcmFtZXdvcmsgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZXMgVGhlIFdTREwgdmFsaWRhdGlvbiBtZXNzYWdlcyB0byBjb252ZXJ0LgotICAgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2VbXSBjb252ZXJ0VmFsaWRhdGlvbk1lc3NhZ2VzKElWYWxpZGF0aW9uTWVzc2FnZVtdIG1lc3NhZ2VzKQotICB7Ci0gIAlpbnQgbnVtTWVzc2FnZXMgPSBtZXNzYWdlcy5sZW5ndGg7Ci0gIAlvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZVtdIGNvbnZlcnRlZE1lc3NhZ2VzID0gbmV3IG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25NZXNzYWdlW251bU1lc3NhZ2VzXTsKLSAgCQotICAJZm9yKGludCBpID0gMDsgaSA8IG51bU1lc3NhZ2VzOyBpKyspCi0gIAl7Ci0gIAkgIElWYWxpZGF0aW9uTWVzc2FnZSBtZXNzID0gbWVzc2FnZXNbaV07Ci0gICAgICAKLSAgICAgIG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25NZXNzYWdlIGNvbnZlcnRNZXNzID0gbnVsbDsKLSAgICAgIGlmIChtZXNzIGluc3RhbmNlb2YgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKQotICAgICAgeyAgIFN0cmluZyBlcnJvcktleSA9ICgoVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKW1lc3MpLmdldEVycm9yS2V5KCk7Ci0gICAgICAgICAgT2JqZWN0W10gbWVzc2FnZUFyZ3MgPSAoKFZhbGlkYXRpb25NZXNzYWdlSW1wbCltZXNzKS5nZXRNZXNzYWdlQXJndW1lbnRzKCk7Ci0gICAgICAgICAgY29udmVydE1lc3MgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UobWVzcy5nZXRNZXNzYWdlKCksIG1lc3MuZ2V0TGluZSgpLCBtZXNzLmdldENvbHVtbigpLCBtZXNzLmdldFVSSSgpLCBlcnJvcktleSwgbWVzc2FnZUFyZ3MpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgY29udmVydE1lc3MgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UobWVzcy5nZXRNZXNzYWdlKCksbWVzcy5nZXRMaW5lKCksbWVzcy5nZXRDb2x1bW4oKSwgbWVzcy5nZXRVUkkoKSk7Ci0gICAgICB9Ci0gIAkgIGlmKG1lc3MuZ2V0U2V2ZXJpdHkoKSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0JICB7Ci0JICAJY29udmVydE1lc3Muc2V0U2V2ZXJpdHkob3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0JICAJY29udmVydE1lc3Muc2V0U2V2ZXJpdHkob3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0hJR0gpOwotCSAgfQotICAJICAKLSAgCSAgLy8gQ29udmVydCBhbnkgbmVzdGVkIG1lc3NhZ2VzLgotICAJICBMaXN0IG5lc3RlZE1lc3NhZ2VzID0gbWVzcy5nZXROZXN0ZWRNZXNzYWdlcygpOwotICAJICBpZihuZXN0ZWRNZXNzYWdlcyAhPSBudWxsICYmICFuZXN0ZWRNZXNzYWdlcy5pc0VtcHR5KCkpCi0gIAkgIHsKLSAgCSAgCUl0ZXJhdG9yIG5lc3RlZEl0ZXIgPSBuZXN0ZWRNZXNzYWdlcy5pdGVyYXRvcigpOwotICAJICAgIHdoaWxlKG5lc3RlZEl0ZXIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgSVZhbGlkYXRpb25NZXNzYWdlIG5lc3RlZE1lc3MgPSAoSVZhbGlkYXRpb25NZXNzYWdlKW5lc3RlZEl0ZXIubmV4dCgpOwotICAgIAkgIG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25NZXNzYWdlIGNvbnZlcnROZXN0ZWRNZXNzID0gbmV3IG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25NZXNzYWdlKG5lc3RlZE1lc3MuZ2V0TWVzc2FnZSgpLG5lc3RlZE1lc3MuZ2V0TGluZSgpLG5lc3RlZE1lc3MuZ2V0Q29sdW1uKCksIG5lc3RlZE1lc3MuZ2V0VVJJKCkpOwotICAgIAkgIGlmKG5lc3RlZE1lc3MuZ2V0U2V2ZXJpdHkoKSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0gICAgCSAgewotICAgIAkgIAljb252ZXJ0TmVzdGVkTWVzcy5zZXRTZXZlcml0eShvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLSAgICAJICB9Ci0gICAgCSAgZWxzZQotICAgIAkgIHsKLSAgICAJICAJY29udmVydE5lc3RlZE1lc3Muc2V0U2V2ZXJpdHkob3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0hJR0gpOwotICAgIAkgIH0KLSAgICAJICBjb252ZXJ0TWVzcy5hZGROZXN0ZWRNZXNzYWdlKGNvbnZlcnROZXN0ZWRNZXNzKTsKLSAgICAgICAgfQotICAJICB9Ci0gIAkgIGNvbnZlcnRlZE1lc3NhZ2VzW2ldID0gY29udmVydE1lc3M7Ci0gIAl9Ci0gIAlyZXR1cm4gY29udmVydGVkTWVzc2FnZXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb252ZXJ0IHRoZSBuZXN0ZWQgbWVzc2FnZXMgaGFzaG1hcC4KLSAgICogCi0gICAqIEBwYXJhbSBuZXN0ZWRNZXNzYWdlcyBUaGUgbmVzdGVkIG1lc3NhZ2VzIGhhc2htYXAgdG8gY29udmVydC4KLSAgICogQHJldHVybiBBIGhhc2htYXAgd2l0aCB0aGUgY29udmVydGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwcml2YXRlIEhhc2hNYXAgY29udmVydE5lc3RlZFZhbGlkYXRpb25NZXNzYWdlcyhIYXNoTWFwIG5lc3RlZE1lc3NhZ2VzKQotICB7Ci0gIAlIYXNoTWFwIGNvbnZlcnRlZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIAkKLSAgCVNldCBrZXlTZXQgPSBuZXN0ZWRNZXNzYWdlcy5rZXlTZXQoKTsKLSAgCUl0ZXJhdG9yIGtleXNJdGVyID0ga2V5U2V0Lml0ZXJhdG9yKCk7Ci0gIAl3aGlsZShrZXlzSXRlci5oYXNOZXh0KCkpCi0gIAl7Ci0gIAkgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXNJdGVyLm5leHQoKTsKLSAgCSAgSVZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UgPSAoSVZhbGlkYXRpb25NZXNzYWdlKW5lc3RlZE1lc3NhZ2VzLmdldChrZXkpOwotICAJICBvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZVtdIGNvbnZlcnRlZE1lc3NhZ2UgPSBjb252ZXJ0VmFsaWRhdGlvbk1lc3NhZ2VzKG5ldyBJVmFsaWRhdGlvbk1lc3NhZ2VbXXttZXNzYWdlfSk7Ci0gIAkgIAotICAJICBjb252ZXJ0ZWRNYXAucHV0KGtleSwgY29udmVydGVkTWVzc2FnZVswXSk7Ci0gIAl9Ci0gIAlyZXR1cm4gY29udmVydGVkTWFwOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBydW4oKQotLy8gIHsKLS8vICAgIC8vIE9ubHkgcnVuIHRoZSB2YWxpZGF0aW9uIGlmIHRoZSBmaWxlIGV4aXN0cyBhbmQgaXMgYXZhaWxhYmxlLgotLy8gICAgaWYgKGZpbGVJc09LKGZpbGUpKQotLy8gICAgewotLy8gICAgICBpZiAoc2hvd0RpYWxvZykKLS8vICAgICAgewotLy8gICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGlzIGRpcnR5IC0gcHJvbXB0cyB1c2VyIHRvIHNhdmUuCi0vLyAgICAgICAgY2hlY2tJZkZpbGVEaXJ0eShmaWxlKTsKLS8vICAgICAgfQotLy8gICAgICBzdXBlci5ydW4oKTsKLS8vICAgIH0KLS8vICB9Ci0KLSAgLyoqCi0gICAqIFRlc3Qgd2hldGhlciB0aGUgZmlsZSBnaXZlbiBpcyBPSyB0byB1c2UuIEEgZmlsZSBpcyBPSyB0byB1c2UgaWYgMS4gSXQgaXMKLSAgICogbm90IG51bGwgMi4gSXQgZXhpc3RzLiAzLiBUaGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBmaWxlIGlzIGFjY2Vzc2libGUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBjaGVjayB0byBzZWUgaWYgaXQgaXMgT0sgdG8gdmFsaWRhdGUuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBpcyBPSyB0byB2YWxpZGF0ZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLS8vICBwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlSXNPSyhJRmlsZSBmaWxlKQotLy8gIHsKLS8vICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSAmJiBmaWxlLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkKLS8vICAgIHsKLS8vICAgICAgcmV0dXJuIHRydWU7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gZmFsc2U7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBkaXJ0eS4gQSBmaWxlIGlzIGRpcnR5IGlmIHRoZXJlIGlzIGFuIG9wZW4gZWRpdG9yIGZvcgotICAgKiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIGNoYW5nZXMgdGhhdCBoYXZlbid0IGJlZW4gc2F2ZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBjaGVjayB0byBzZWUgaWYgaXQgaXMgZGlydHkuCi0gICAqLwotLy8gIHByb3RlY3RlZCB2b2lkIGNoZWNrSWZGaWxlRGlydHkoSUZpbGUgZmlsZSkKLS8vICB7Ci0vLyAgICBJRWRpdG9yUGFydFtdIGRpcnR5RWRpdG9ycyA9IFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXREaXJ0eUVkaXRvcnMoKTsKLS8vCi0vLyAgICBpbnQgbnVtZWRpdG9ycyA9IGRpcnR5RWRpdG9ycy5sZW5ndGg7Ci0vLyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWVkaXRvcnM7IGkrKykKLS8vICAgIHsKLS8vICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZGlydHlFZGl0b3JzW2ldLmdldEVkaXRvcklucHV0KCk7Ci0vLyAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkKLS8vICAgICAgewotLy8gICAgICAgIEZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dDsKLS8vICAgICAgICBpZiAoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKS5lcXVhbHMoZmlsZSkpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoX1VJX1NBVkVfRElSVFlfRklMRV9NRVNTQUdFKTsKLS8vICAgICAgICAgIFN0cmluZyB0aXRsZSA9IFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZyhfVUlfU0FWRV9ESVJUWV9GSUxFX1RJVExFKTsKLS8vICAgICAgICAgIGlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIGRpcnR5RWRpdG9yc1tpXS5kb1NhdmUobnVsbCk7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICAvLyBUaGVyZSBjYW4gb25seSBiZSBvbmUgb3BlbiBlZGl0b3IvZmlsZSBzbyB3ZSBjYW4gYnJlYWsuCi0vLyAgICAgICAgICBicmVhazsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vCi0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBtYXJrZXIgb24gdGhlIGZpbGUgb2YgdGhlIGluZGljYXRlZCB0eXBlIGZvciBlYWNoCi0gICAqIFZhbGlkYXRpb25NZXNzYWdlIGluIHRoZSBhcnJheS4KLSAgICogCi0gICAqIEBwYXJhbSBpRmlsZQotICAgKiAgICAgICAgICBUaGUgZmlsZSB0byBhZGQgdGhlIG1hcmtlcnMgdG8uCi0gICAqIEBwYXJhbSB2YWxNZXNzYWdlcwotICAgKiAgICAgICAgICBUaGUgYXJyYXkgb2YgbWVzc2FnZXMgdG8gYWRkIGFzIG1hcmtlcnMuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGNyZWF0ZU1hcmtlcnMoSUZpbGUgaUZpbGUsIFZhbGlkYXRpb25NZXNzYWdlW10gdmFsTWVzc2FnZXMpCi0vLyAgewotLy8gICAgaWYgKCFmaWxlSXNPSyhpRmlsZSkpCi0vLyAgICB7Ci0vLyAgICAgIHJldHVybjsKLS8vICAgIH0KLS8vICAgIGludCBudW1WYWxNZXNzYWdlcyA9IHZhbE1lc3NhZ2VzLmxlbmd0aDsKLS8vICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsTWVzc2FnZXM7IGkrKykKLS8vICAgIHsKLS8vICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UgPSB2YWxNZXNzYWdlc1tpXTsKLS8vCi0vLyAgICAgIGludCBsaW5lID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TGluZSgpOwotLy8gICAgICBpbnQgY29sdW1uID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0Q29sdW1uKCk7Ci0vLyAgICAgIFN0cmluZyBtZXNzYWdlID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TWVzc2FnZSgpOwotLy8gICAgICBpbnQgc2V2ZXJpdHkgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRTZXZlcml0eSgpOwotLy8gICAgICBJTWFya2VyIG1hcmtlciA9IG51bGw7Ci0vLyAgICAgIAotLy8gICAgICBib29sZWFuIGhhc05lc3RlZEVycm9ycyA9IGZhbHNlOwotLy8gICAgICBMaXN0IG5lc3RlZGVycm9ycyA9IHZhbGlkYXRpb25NZXNzYWdlLmdldE5lc3RlZE1lc3NhZ2VzKCk7Ci0vLyAgICAgIGlmKG5lc3RlZGVycm9ycyAhPSBudWxsICYmICFuZXN0ZWRlcnJvcnMuaXNFbXB0eSgpKQotLy8gICAgICB7Ci0vLyAgICAgICAgaGFzTmVzdGVkRXJyb3JzID0gdHJ1ZTsKLS8vICAgICAgICBtZXNzYWdlICs9IFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZyhfVUlfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSk7IAotLy8gICAgICB9Ci0vLyAgICAgIGlmIChzZXZlcml0eSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5TRVZfRVJST1IpCi0vLyAgICAgIHsKLS8vICAgICAgICBtYXJrZXIgPSBnZXRPckNyZWF0ZVJlcG9ydGVyKCkuYWRkRXJyb3JNZXNzYWdlKGlGaWxlLCBtZXNzYWdlLCBsaW5lLCBjb2x1bW4pOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKHNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9XQVJOSU5HKQotLy8gICAgICB7Ci0vLyAgICAgICAgbWFya2VyID0gZ2V0T3JDcmVhdGVSZXBvcnRlcigpLmFkZFdhcm5pbmdNZXNzYWdlKGlGaWxlLCBtZXNzYWdlLCBsaW5lLCBjb2x1bW4pOwotLy8gICAgICB9Ci0vLyAgICAgIAotLy8gICAgICBpZiAoaGFzTmVzdGVkRXJyb3JzICYmIG1hcmtlciAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgdHJ5Ci0vLyAgICAgICAgewotLy8gICAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZSgiZ3JvdXBOYW1lIiwgUkVGRVJFTkNFRF9GSUxFX0VSUk9SX09QRU4gKyB2YWxpZGF0aW9uTWVzc2FnZS5nZXRVUkkoKSArIFJFRkVSRU5DRURfRklMRV9FUlJPUl9DTE9TRSk7Ci0vLyAgICAgICAgICBtYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuRE9ORSwgdHJ1ZSk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIAotLy8gICAgfQotLy8gIH0KLQotICAvKioKLSAgICogU2hvdyBhIGRpYWxvZyBjb250YWluaW5nIHRoZSBzdGF0dXMgb2YgdGhlIHZhbGlkYXRpb24uIFdpbGwgZGlzcGxheSB2YWxpZAotICAgKiBvciBpbnZhbGlkIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZXJlIGFyZSBlcnJvcnMgb3Igbm90LgotICAgKiAKLSAgICogQHBhcmFtIHZhbGlkYXRpb25PdXRjb21lCi0gICAqICAgICAgICAgIFRoZSBvdXRjb21lIG9mIHRoZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2hvd0RpYWxvZyhWYWxpZGF0aW9uT3V0Y29tZSB2YWxpZGF0aW9uT3V0Y29tZSkKLSAgewotICAgIFN0cmluZyB0aXRsZSwgbWVzc2FnZTsKLSAgICBpZiAodmFsaWRhdGlvbk91dGNvbWUuaXNWYWxpZCkKLSAgICB7Ci0gICAgICBpZiAodmFsaWRhdGlvbk91dGNvbWUuaGFzTWVzc2FnZXMpCi0gICAgICB7Ci0gICAgICAgIHNob3dQcm9ibGVtc1ZpZXcoKTsKLSAgICAgICAgdGl0bGUgPSBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9WQUxJREFUSU9OX1NVQ0NFRURFRCIpOwotICAgICAgICBtZXNzYWdlID0gVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfVEhFX1dTRExfRklMRV9JU19WQUxJRF9XSVRIX1dBUk5JTkdTIik7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aXRsZSA9IFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1ZBTElEQVRJT05fU1VDQ0VFREVEIik7Ci0gICAgICAgIG1lc3NhZ2UgPSBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9USEVfV1NETF9GSUxFX0lTX1ZBTElEIik7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKHZhbGlkYXRpb25PdXRjb21lLmlzV1NETFZhbGlkKQotICAgICAgewotICAgICAgICB0aXRsZSA9IFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1ZBTElEQVRJT05fRkFJTEVEIik7Ci0gICAgICAgIG1lc3NhZ2UgPSBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9USEVfV1NETF9GSUxFX0lTX1ZBTElEX1dTREwxMSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aXRsZSA9IFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1ZBTElEQVRJT05fRkFJTEVEIik7Ci0gICAgICAgIG1lc3NhZ2UgPSBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9USEVfV1NETF9GSUxFX0lTX05PVF9WQUxJRCIpOwotICAgICAgfQotICAgICAgc2hvd1Byb2JsZW1zVmlldygpOwotICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotICAgIH0KLQotICB9Ci0gIAotICAvKioKLSAgICogU2hvdyB0aGUgcHJvYmxlbXMgdmlldyBpZiBpdCBpcyBub3QgYWxyZWFkeSB2aXNpYmxlLgotICAgKi8KLS8vICBwcm90ZWN0ZWQgdm9pZCBzaG93UHJvYmxlbXNWaWV3KCkKLS8vICB7Ci0vLyAgICBJV29ya2JlbmNoV2luZG93IGR3ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLS8vICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBkdy5nZXRBY3RpdmVQYWdlKCk7Ci0vLyAgICBJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gcGFnZS5nZXRBY3RpdmVQYXJ0KCk7Ci0vLyAgICB0cnkKLS8vICAgIHsKLS8vICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLS8vICAgICAgewotLy8gICAgICAgIHBhZ2Uuc2hvd1ZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3Iik7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKQotLy8gICAgewotLy8gICAgfQotLy8gICAgcGFnZS5hY3RpdmF0ZShhY3RpdmVQYXJ0KTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIElmIGEgcmVwb3J0ZXIgZG9lc24ndCBleGlzdCBjcmVhdGVzIGl0IG9yIHVzZXMgdGhlIHJlcG9ydGVyIGFscmVhZHkKLSAgICogY3JlYXRlZC4KLSAgICogCi0gICAqIEByZXR1cm4gYSByZXBvcnRlcgotICAgKi8KLS8vICBwcm90ZWN0ZWQgSVJlcG9ydGVyIGdldE9yQ3JlYXRlUmVwb3J0ZXIoKQotLy8gIHsKLS8vICAgIGlmIChyZXBvcnRlciA9PSBudWxsKQotLy8gICAgewotLy8gICAgICByZXBvcnRlciA9IG5ldyBXb3JrYmVuY2hSZXBvcnRlcihmaWxlLmdldFByb2plY3QoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gcmVwb3J0ZXI7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBDbGVhciBhbGwgdGhlIG1hcmtlcnMgb24gdGhlIGdpdmVuIHJlc291cmNlIGdlbmVyYXRlZCBieSB0aGlzIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSByZXNvdXJjZSAtCi0gICAqICAgICAgICAgIHRoZSByZXNyb3VjZSB0byBjbGVhciBhbGwgdGhlIG1hcmtlcnMgZnJvbQotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBjbGVhck1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlKQotLy8gIHsKLS8vICAgIGdldE9yQ3JlYXRlUmVwb3J0ZXIoKS5yZW1vdmVBbGxNZXNzYWdlcyhyZXNvdXJjZSk7Ci0vLyAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBWYWxpZGF0aW9uT3V0Y29tZQotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dTRExWYWxpZCA9IHRydWU7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZXNzYWdlcyA9IGZhbHNlOwotCi0gICAgcHVibGljIFZhbGlkYXRpb25PdXRjb21lKCkKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsgIHRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCBleHRyYSBhdHRyaWJ1dGVzIGluIHRoZSBJTWVzc2FnZSB0byBwcm92aWRlIGluZm9ybWF0aW9uIG9uIHdoYXQgc2hvdWxkIGJlICJzcXVpZ2dsZWQiCi0gICAqIEBwYXJhbSB2YWxNZXNzIHRoZSBWYWxpZGF0aW9uTWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZXJyb3IKLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIElNZXNzYWdlIHRvIHNldCB0aGUgYXR0cmlidXRlcyBmb3IKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZEluZm9Ub01lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UgdmFsTWVzcywgSU1lc3NhZ2UgbWVzc2FnZSkKLSAgeyAgIGlmICh2YWxNZXNzLmdldEtleSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgICAgWE1MTWVzc2FnZUluZm9IZWxwZXIgaGVscGVyID0gbmV3IFhNTE1lc3NhZ2VJbmZvSGVscGVyKCk7Ci0gICAgICAgICAgU3RyaW5nW10gc3F1aWdnbGVJbmZvID0gaGVscGVyLmNyZWF0ZU1lc3NhZ2VJbmZvKHZhbE1lc3MuZ2V0S2V5KCksIHZhbE1lc3MuZ2V0TWVzc2FnZUFyZ3VtZW50cygpKTsKLSAgICAgIAotICAgICAgICAgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKENPTFVNTl9OVU1CRVJfQVRUUklCVVRFLCBuZXcgSW50ZWdlcih2YWxNZXNzLmdldENvbHVtbk51bWJlcigpKSk7Ci0gICAgICAgICAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSwgc3F1aWdnbGVJbmZvWzBdKTsKLSAgICAgICAgICBtZXNzYWdlLnNldEF0dHJpYnV0ZShTUVVJR0dMRV9OQU1FX09SX1ZBTFVFX0FUVFJJQlVURSwgc3F1aWdnbGVJbmZvWzFdKTsKLSAgICAgIH0KLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdGVXU0RMQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRlV1NETEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMTk5ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdGVXU0RMQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogQW4gYWN0aW9uIGRlbGVnYXRlIGZvciB0aGUgV1NETCB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVdTRExBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZQotewotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKElGaWxlIGZpbGUpCi0gIHsKLSAgICBWYWxpZGF0ZVdTRExBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVXU0RMQWN0aW9uKGZpbGUsIHRydWUpOwotICAgIHZhbGlkYXRlQWN0aW9uLnNldFZhbGlkYXRvcihuZXcgVmFsaWRhdG9yKCkpOwotICAgIHZhbGlkYXRlQWN0aW9uLnJ1bigpOwkKLSAgfQotIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKElBY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgCUlGaWxlIGZpbGUgPSBudWxsOwotICAgIGlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICBPYmplY3QgZWxlbWVudCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICB7Ci0gICAgICAgIGZpbGUgPSAoSUZpbGUpIGVsZW1lbnQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgICAgICAgCi0gICAgaWYgKGZpbGUgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgIAotICAgICAgdmFsaWRhdGUoZmlsZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiwgSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gIAl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9WYWxpZGF0ZVdTRExQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRlV1NETFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Q4ZjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRlV1NETFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuV1NETENvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2dFbnRpdHlIb2xkZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgcmVxdWlyZWQgZm9yIGVjbGlwc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVdTRExQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19GSUxFID0gInZhbGlkYXRld3NkbHVpIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBWYWxpZGF0ZVdTRExQbHVnaW4gaW5zdGFuY2U7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZWJ1bmRsZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSB3c2RsVmFsaWRhdG9yUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0ZVdTRExQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikKLSAgewotICAgIHN1cGVyKGRlc2NyaXB0b3IpOwotLy8gICAgaW5zdGFuY2UgPSB0aGlzOwotLy8gICAgd3NkbFZhbGlkYXRvclJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKENvbnN0YW50cy5XU0RMX1ZBTElEQVRPUl9QUk9QRVJUSUVTX0ZJTEUpOwotLy8gICAgcmVzb3VyY2VidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoUFJPUEVSVElFU19GSUxFKTsKLS8vCi0vLyAgICAvLyBDb25maWd1cmUgdGhlIFhNTCBjYXRhbG9nLgotLy8gICAgbmV3IEV4dFhNTENhdGFsb2dQbHVnaW5SZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotLy8gICAgbmV3IFdTRExWYWxpZGF0b3JQbHVnaW5SZWdpc3RyeVJlYWRlcigKLS8vICAgICAgImV4dHZhbGlkYXRvciIsCi0vLyAgICAgICJleHR2YWxpZGF0b3IiLAotLy8gICAgICBXU0RMVmFsaWRhdG9yUGx1Z2luUmVnaXN0cnlSZWFkZXIuRVhUX1ZBTElEQVRPUikKLS8vICAgICAgLnJlYWRSZWdpc3RyeSgpOwotLy8KLS8vICAgIC8vIHJlZ2lzdGVyIGFueSBXU0RMIDEuMSB2YWxpZGF0b3JzIGRlZmluZWQKLS8vICAgIG5ldyBXU0RMMTFWYWxpZGF0b3JQbHVnaW5SZWdpc3RyeVJlYWRlcigid3NkbDExdmFsaWRhdG9yIiwgInZhbGlkYXRvciIpLnJlYWRSZWdpc3RyeSgpOwotLy8KLS8vICAgIFdTRExDb25maWd1cmF0b3IucmVnaXN0ZXJEZWZhdWx0VmFsaWRhdG9ycyh3c2RsVmFsaWRhdG9yUmVzb3VyY2VCdW5kbGUpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgIGluc3RhbmNlID0gdGhpczsKLSAgICB3c2RsVmFsaWRhdG9yUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQ29uc3RhbnRzLldTRExfVkFMSURBVE9SX1BST1BFUlRJRVNfRklMRSk7Ci0gICAgcmVzb3VyY2VidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoUFJPUEVSVElFU19GSUxFKTsKLQotICAgIC8vIENvbmZpZ3VyZSB0aGUgWE1MIGNhdGFsb2cuCi0gICAgbmV3IEV4dFhNTENhdGFsb2dQbHVnaW5SZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotICAgIG5ldyBXU0RMVmFsaWRhdG9yUGx1Z2luUmVnaXN0cnlSZWFkZXIoCi0gICAgICAiZXh0dmFsaWRhdG9yIiwKLSAgICAgICJleHR2YWxpZGF0b3IiLAotICAgICAgV1NETFZhbGlkYXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyLkVYVF9WQUxJREFUT1IpCi0gICAgICAucmVhZFJlZ2lzdHJ5KCk7Ci0KLSAgICAvLyByZWdpc3RlciBhbnkgV1NETCAxLjEgdmFsaWRhdG9ycyBkZWZpbmVkCi0gICAgbmV3IFdTREwxMVZhbGlkYXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyKCJ3c2RsMTF2YWxpZGF0b3IiLCAidmFsaWRhdG9yIikucmVhZFJlZ2lzdHJ5KCk7Ci0KLSAgICBXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyRGVmYXVsdFZhbGlkYXRvcnMod3NkbFZhbGlkYXRvclJlc291cmNlQnVuZGxlKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgWE1MQ2F0YWxvZy5yZXNldCgpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbiBvYmplY3QuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbiBvYmplY3QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVmFsaWRhdGVXU0RMUGx1Z2luIGdldEluc3RhbmNlKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGluc3RhbGwgVVJMIG9mIHRoaXMgcGx1Z2luLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgaW5zdGFsbCB1cmwgb2YgdGhpcyBwbHVnaW4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFsbFVSTCgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gUGxhdGZvcm0ucmVzb2x2ZShnZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpKS5nZXRGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqIFJlc291cmNlQnVuZGxlIGhlbHBlciBtZXRob2RzCi0gICAqIAotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnaW4uCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgcGx1Z2luCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlYnVuZGxlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIFdTREwgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgV1NETCB2YWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRXU0RMVmFsaWRhdG9yUmVzb3VyY2VCdW5kbGUoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxWYWxpZGF0b3JSZXNvdXJjZUJ1bmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBpZC4KLSAgICogCi0gICAqIEBwYXJhbSBzdHJpbmdJRCAtIHRoZSBpZCBmb3IgdGhlIHN0cmluZwotICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBpZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIHN0cmluZ0lEKQotICB7Ci0gICAgcmV0dXJuIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKHN0cmluZ0lEKTsKLSAgfQotfQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgdGhlIHBsdWdpbiBtYW5pZmVzdHMgYW5kIHJlZ2lzdGVycyBlYWNoIFdTRExFeHRlbnNpb25WYWxpZGF0b3IKLSAqLwotY2xhc3MgV1NETFZhbGlkYXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUkVTT1VSQ0VCVU5ETEUgPSAicmVzb3VyY2VidW5kbGUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBXU0RMX1ZBTElEQVRPUiA9IDA7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVYVF9WQUxJREFUT1IgPSAxOwotICBwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvblBvaW50SWQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGFnTmFtZTsKLSAgcHJvdGVjdGVkIGludCB2YWxpZGF0b3JUeXBlOwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBXU0RMVmFsaWRhdG9yUGx1Z2luUmVnaXN0cnlSZWFkZXIoU3RyaW5nIGV4dGVuc2lvblBvaW50SWQsIFN0cmluZyB0YWdOYW1lLCBpbnQgdmFsaWRhdG9yVHlwZSkKLSAgewotICAgIHRoaXMuZXh0ZW5zaW9uUG9pbnRJZCA9IGV4dGVuc2lvblBvaW50SWQ7Ci0gICAgdGhpcy50YWdOYW1lID0gdGFnTmFtZTsKLSAgICB0aGlzLnZhbGlkYXRvclR5cGUgPSB2YWxpZGF0b3JUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLSAgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBleHRlbnNpb25Qb2ludElkKTsKLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgd2l0aCBhbiBleHRlbnNpb24gbGlrZToKLSAgICoKLSAgICogPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudmFsaWRhdGUud3NkbC5XU0RMRXh0ZW5zaW9uVmFsaWRhdG9yIgotICAgKiAgICAgICAgICAgIGlkPSJzb2FwVmFsaWRhdG9yIgotICAgKiAgICAgICAgICAgIG5hbWU9IlNPQVAgVmFsaWRhdG9yIj4+Ci0gICAqICAgPHZhbGlkYXRvcj4KLSAgICogICAgICAgIDxydW4gY2xhc3M9IiBvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLnNvYXAuU09BUFZhbGlkYXRvciIvPgotICAgKiAgIDwvdmFsaWRhdG9yPgotICAgKiAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB2YWx1ZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgKiA8L2V4dGVuc2lvbj4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyh0YWdOYW1lKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FU1BBQ0UpOwotICAgICAgU3RyaW5nIHJlc291cmNlQnVuZGxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1JFU09VUkNFQlVORExFKTsKLQotICAgICAgaWYgKHZhbGlkYXRvckNsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy8gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyID0KLSAgICAgICAgICAvLyAgICAgICAgICAgIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbigpLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAvLwkJCQltb2RpZmllZCB0byByZXNvbHZlIGNlcnRhaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGUgcGx1Z2luIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZAotCi0gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyID0KLSAgICAgICAgICAgIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbkNsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKHZhbGlkYXRvclR5cGUgPT0gV1NETF9WQUxJREFUT1IpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgIFdTRExDb25maWd1cmF0b3IucmVnaXN0ZXJXU0RMVmFsaWRhdG9yKG5hbWVzcGFjZSwgdmFsaWRhdG9yQ2xhc3MsIHJlc291cmNlQnVuZGxlLCBwbHVnaW5Mb2FkZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh2YWxpZGF0b3JUeXBlID09IEVYVF9WQUxJREFUT1IpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgIFdTRExDb25maWd1cmF0b3IucmVnaXN0ZXJFeHRlbnNpb25WYWxpZGF0b3IobmFtZXNwYWNlLCB2YWxpZGF0b3JDbGFzcywgcmVzb3VyY2VCdW5kbGUsIHBsdWdpbkxvYWRlcik7Ci0gICAgICAgICAgfQotLy8gICAgICAgICAgcmVnaXN0ZXJXU0RMVmFsaWRhdG9yUGx1Z2luRXh0ZW5zaW9uV2l0aENsYXNzTmFtZSgKLS8vICAgICAgICAgICAgcGx1Z2luTG9hZGVyLAotLy8gICAgICAgICAgICBXU0RMVmFsaWRhdG9yRXh0ZW5zaW9uQ2xhc3MsCi0vLyAgICAgICAgICAgIFdTRExWYWxpZGF0b3JFeHRlbnNpb25OYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoZSBleHRlbnNpb24gdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIGNsYXNzIG5hbWUgYW5kIG5hbWVzcGFjZXMuCi0gICAqIAotICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgLSB0aGUgY2xhc3MgbG9hZGVyIHRvIGNyZWF0ZSB0aGUgdmFsaWRhdG9yCi0gICAqIEBwYXJhbSBjbGFzc05hbWUgLSB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHZhbGlkYXRvcgotICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gdGhlIG5hbWVzcGFjZSBvZiB0aGUgZXh0ZW5zaW9uIHZhbGlkYXRvcgotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLS8vICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcldTRExWYWxpZGF0b3JQbHVnaW5FeHRlbnNpb25XaXRoQ2xhc3NOYW1lKAotLy8gICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsCi0vLyAgICBTdHJpbmcgY2xhc3NOYW1lLAotLy8gICAgU3RyaW5nIG5hbWVzcGFjZSkKLS8vICAgIHRocm93cyBFeGNlcHRpb24KLS8vICB7Ci0vLyAgICB0cnkKLS8vICAgIHsKLS8vICAgICAgQ2xhc3MgdmFsaWRhdG9yRXh0ZW5zaW9uQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkgOiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0vLwotLy8gICAgICAKLS8vICAgICAgLy9JVmFsaWRhdG9yRXh0ZW5zaW9uUGx1Z2luIHZhbGlkYXRvckhhbmRsZXIgPSAoSVZhbGlkYXRvckV4dGVuc2lvblBsdWdpbil2YWxpZGF0b3JFeHRlbnNpb25DbGFzcy5uZXdJbnN0YW5jZSgpOwotLy8gICAgICAvL2FkZChuYW1lc3BhY2UsIHZhbGlkYXRvckhhbmRsZXIuZ2V0VmFsaWRhdG9yKCkpOwotLy8gICAgfQotLy8gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotLy8gICAgewotLy8gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0vLyAgICAgIC8vVE9ETzogd3JpdGUgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGxvZyBmaWxlIC0gdXNlIGN1c3RvbSBsb2cgd3JpdGVyIGNsYXNzCi0vLyAgICAgIC8vVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoIldTREwgVmFsaWRhdG9yIGNvdWxkIG5vdCByZWdpc3RlciB0aGUgZXh0ZW5zaW9uIHZhbGlkYXRvci4iICsgZS5nZXRNZXNzYWdlKCkpOwkKLS8vICAgIH0KLS8vICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIHRoZSBsb2FkZWQgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSAtIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHZhbGlkYXRvcgotICAgKiBAcGFyYW0gdmFsaWRhdG9yRXh0ZW5zaW9uIC0gdGhlIGV4dGVuc2lvbiB2YWxpZGF0b3IKLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgYWRkKFN0cmluZyBuYW1lc3BhY2UsIElXU0RMVmFsaWRhdG9yIHZhbGlkYXRvckV4dGVuc2lvbikKLS8vICB7Ci0vLyAgICBpZiAodmFsaWRhdG9yVHlwZSA9PSBXU0RMX1ZBTElEQVRPUikKLS8vICAgIHsKLS8vICAgICAgV1NETENvbmZpZ3VyYXRvci5yZWdpc3RlcldTRExWYWxpZGF0b3IobmFtZXNwYWNlLCB2YWxpZGF0b3JFeHRlbnNpb24pOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAodmFsaWRhdG9yVHlwZSA9PSBXU0lfVkFMSURBVE9SKQotLy8gICAgewotLy8gICAgICBXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyV1NJVmFsaWRhdG9yKG5hbWVzcGFjZSwgdmFsaWRhdG9yRXh0ZW5zaW9uKTsKLS8vICAgIH0KLS8vICB9Ci19Ci0KLS8qKgotICogUmVhZCBXU0RsIDEuMSBleHRlbnNpb24gdmFsaWRhdG9ycy4KLSAqIAotICogIDxleHRlbnNpb24KLSAqICAgICBwb2ludD0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi52YWxpZGF0b3IiCi0gKiAgICAgaWQ9IndzZGxWYWxpZGF0b3IiCi0gKiAgICAgbmFtZT0iJV9VSV9XU0RMX1ZBTElEQVRPUiI+Ci0gKiAgICA8d3NkbDExdmFsaWRhdG9yCi0gKiAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gKiAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5zb2FwLndzZGwxMS5TT0FQVmFsaWRhdG9yIgotICogICAgICAgcmVzb3VyY2VidW5kbGU9InZhbGlkYXRld3NkbHNvYXAiLz4KLSAqICAgPC9leHRlbnNpb24+Ci0gKiAgCi0gKi8KLWNsYXNzIFdTREwxMVZhbGlkYXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUkVTT1VSQ0VCVU5ETEUgPSAicmVzb3VyY2VidW5kbGUiOwotICBwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvblBvaW50SWQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGFnTmFtZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnRJZCAtIHRoZSBpZCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0gICAqIEBwYXJhbSB0YWdOYW1lIC0gdGhlIHRhZyBuYW1lIG9mIHRoZSBleHRlbnNpb24gcG9pbnQKLSAgICovCi0gIHB1YmxpYyBXU0RMMTFWYWxpZGF0b3JQbHVnaW5SZWdpc3RyeVJlYWRlcihTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCwgU3RyaW5nIHRhZ05hbWUpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2lvblBvaW50SWQgPSBleHRlbnNpb25Qb2ludElkOwotICAgIHRoaXMudGFnTmFtZSA9IHRhZ05hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgaGFuZGxlIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnRzIHRoYXQgbWF0Y2gKLSAgICogdGhlIHNwZWRpZmllZCBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgZXh0ZW5zaW9uUG9pbnRJZCk7Ci0gICAgaWYgKHBvaW50ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYW5kIGRlYWwgd2l0aCB0aGUgZXh0ZW5zaW9uIHBvaW50cy4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBleHRlbnNpb24gcG9pbnQgZWxlbWVudC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyh0YWdOYW1lKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FU1BBQ0UpOwotICAgICAgU3RyaW5nIHJlc291cmNlQnVuZGxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1JFU09VUkNFQlVORExFKTsKLQotICAgICAgaWYgKHZhbGlkYXRvckNsYXNzICE9IG51bGwgJiYgbmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyID0KLSAgICAgICAgICAgIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbkNsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICBXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKG5hbWVzcGFjZSwgdmFsaWRhdG9yQ2xhc3MsIHJlc291cmNlQnVuZGxlLCBwbHVnaW5Mb2FkZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcGx1Z2luIG1hbmlmZXN0cyBhbmQgcmVnaXN0ZXJzIGVhY2ggV1NETEV4dGVuc2lvblZhbGlkYXRvcgotICovCi1jbGFzcyBFeHRYTUxDYXRhbG9nUGx1Z2luUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAieG1sY2F0YWxvZyI7Ci0gIAotICAvKioKLSAgICogVGhlIHhtbGNhdGFsb2cgZWxlbWVudCBhbGxvdyBhZGRpbmcgYW4gZXh0ZW5zaW9uIFhNTCBDYXRhbG9nIHN1Y2ggYXMKLSAgICogPHhtbGNhdGFsb2cgY2xhc3M9Im9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuRXh0WE1MQ2F0YWxvZyI+Ci0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRfQ0FUQUxPR19UQUdfTkFNRSA9ICJ4bWxjYXRhbG9nIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgCi0gIC8qKgotICAgKiBUaGUgZW50aXR5IGVsZW1lbnQgYWxsb3dzIGFkZGluZyBzcGVjaWZpYyBYTUwgY2F0YWxvZyBlbnRpdGllcyBzdWNoIGFzCi0gICAqIDxlbnRpdHkKLSAgICogICBwdWJsaWNpZD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIAotICAgKiAgIHN5c3RlbWlkPSJ4c2Qvd3NkbC54c2QiIC8+Ci0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEFHX05BTUUgPSAiZW50aXR5IjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BVQkxJQ19JRCA9ICJwdWJsaWNJZCI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TWVNURU1fSUQgPSAibG9jYXRpb24iOwotICAKLSAgLyoqCi0gICAqIFRoZSBzY2hlbWFkaXIgZWxlbWVudCBhbGxvd3MgYWRkaW5nIGEgZGlyZWN0b3Igb2Ygc2NoZW1hcyB0byB0aGUgWE1MIGNhdGFsb2cgc3VjaCBhcwotICAgKiA8c2NoZW1hZGlyIGxvY2F0aW9uPSJjOlxteXNjaGVtYWRpciIgLz4KLSAgICogTm90ZTogSXQgaXMgbW9yZSBleHBlbnNpdmUgdG8gdXNlIHRoaXMgbWV0aG9kIHRoZW4gdGhlIGVudGl0eSBtZXRob2QKLSAgICogb2YgYWRkaW5nIHNjaGVtYXMgdG8gdGhlIGNhdGFsb2cgYXMgdGhpcyBtZXRob2QgcmVxdWlyZXMgdGhhdCBhbGwgb2YKLSAgICogdGhlIHNjaGVtYXMgYmUgcmVhZC4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9ESVJfVEFHX05BTUUgPSAic2NoZW1hZGlyIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnRJZDsKLQotICAvKioKLSAgICogcmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gICAgaWYgKHBvaW50ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogcmVhZEVsZW1lbnQoKSAtIHBhcnNlIGFuZCBkZWFsIHdpdGggYW4gZXh0ZW5zaW9uIGxpa2U6Ci0gICAqCi0gICAqIDxleHRlbnNpb24gcG9pbnQ9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRlLndzZGwuV1NETEV4dGVuc2lvblZhbGlkYXRvciIKLSAgICogICAgICAgICAgICBpZD0ic29hcFZhbGlkYXRvciIKLSAgICogICAgICAgICAgICBuYW1lPSJTT0FQIFZhbGlkYXRvciI+PgotICAgKiAgIDx2YWxpZGF0b3I+Ci0gICAqICAgICAgICA8cnVuIGNsYXNzPSIgY29tLmlibS5ldG9vbHMudmFsaWRhdGUud3NkbC5zb2FwLlNPQVBWYWxpZGF0b3IiLz4KLSAgICogICA8L3ZhbGlkYXRvcj4KLSAgICogICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdmFsdWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICogPC9leHRlbnNpb24+Ci0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFN0cmluZyBlbGVtZW50bmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotICAgIC8vIEV4dGVuc2lvbiBYTUwgQ2F0YWxvZ3MuCi0gICAgaWYgKGVsZW1lbnRuYW1lLmVxdWFscyhFWFRfQ0FUQUxPR19UQUdfTkFNRSkpCi0gICAgewotICAgICAgU3RyaW5nIHhtbENhdGFsb2dDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0KLSAgICAgIGlmICh4bWxDYXRhbG9nQ2xhc3MgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBtb2RpZmllZCB0byByZXNvbHZlIGNlcnRhaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGUgcGx1Z2luIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZAotICAgICAgICAgIENsYXNzTG9hZGVyIHBsdWdpbkxvYWRlciA9Ci0gICAgICAgICAgICBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpOwotICAgICAgICAgIC8vCQkJCQlDbGFzc0xvYWRlciBwbHVnaW5Mb2FkZXIgPQotICAgICAgICAgIC8vCQkJCQkJZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCkuZ2V0UGx1Z2luKCkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgIFhNTENhdGFsb2cuc2V0RXh0ZW5zaW9uWE1MQ2F0YWxvZyh4bWxDYXRhbG9nQ2xhc3MsIHBsdWdpbkxvYWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFhNTCBDYXRhbG9nIGVudGl0ZXMuCi0gICAgZWxzZSBpZihlbGVtZW50bmFtZS5lcXVhbHMoRU5USVRZX1RBR19OQU1FKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHVibGljaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFVCTElDX0lEKTsKLSAgICAgIFN0cmluZyBzeXN0ZW1pZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TWVNURU1fSUQpOwotICAgICAgaWYocHVibGljaWQgPT0gbnVsbCB8fCBzeXN0ZW1pZCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgc3lzdGVtaWQgPSBnZXRBYnNvbHV0ZUxvY2F0aW9uKHN5c3RlbWlkLCBidW5kbGUpOwotICAgICAgCi0gICAgICBYTUxDYXRhbG9nLmFkZEVudGl0eShuZXcgWE1MQ2F0YWxvZ0VudGl0eUhvbGRlcihwdWJsaWNpZCwgc3lzdGVtaWQpKTsKLSAgICB9Ci0gICAgLy8gU2NoZW1hIGRpcmVjdG9yaWVzIGZvciB0aGUgWE1MIENhdGFsb2cuCi0gICAgZWxzZSBpZihlbGVtZW50bmFtZS5lcXVhbHMoU0NIRU1BX0RJUl9UQUdfTkFNRSkpCi0gICAgewotICAgICAgU3RyaW5nIGxvY2F0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xPQ0FUSU9OKTsKLSAgICAgIGlmKGxvY2F0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGxvY2F0aW9uID0gZ2V0QWJzb2x1dGVMb2NhdGlvbihsb2NhdGlvbiwgYnVuZGxlKTsKLSAgICAgICAgWE1MQ2F0YWxvZy5hZGRTY2hlbWFEaXIobG9jYXRpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldEFic29sdXRlTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uLCBCdW5kbGUgYnVuZGxlKQotICB7Ci0gICAgVVJMIHVybCA9IG51bGw7Ci0gICAgaWYoYnVuZGxlICE9IG51bGwpCi0gICAgewotICAgICAgdXJsID0gYnVuZGxlLmdldEVudHJ5KGxvY2F0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgaWYodXJsICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHVybCA9IFBsYXRmb3JtLnJlc29sdmUodXJsKTsKLSAgICAgICAgcmV0dXJuIHVybC50b0V4dGVybmFsRm9ybSgpOwotICAgICAgfQotICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy9VbmFibGUgdG8gcmVnaXN0ZXIgdGhlIHNjaGVtYS4KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxvY2F0aW9uOwotICB9Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzYjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVJ1bGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXNwZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci0KLQotLyoqCi0gKiBBIHZhbGlkYXRvciB0byBwbHVnIHRoZSBXU0RMIHZhbGlkYXRvciBpbnRvIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IKLXsKLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGdpdmVuIElGaWxlLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUKLSAgICogICAgICAgICAgVGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKElGaWxlIGZpbGUpCi0vLyAgewotLy8gICAgVmFsaWRhdGVXU0RMQWN0aW9uIHZhbGlkYXRlQWN0aW9uID0gbmV3IFZhbGlkYXRlV1NETEFjdGlvbihmaWxlLCBmYWxzZSk7Ci0vLyAgICB2YWxpZGF0ZUFjdGlvbi5zZXRWYWxpZGF0b3IodGhpcyk7Ci0vLyAgICB2YWxpZGF0ZUFjdGlvbi5ydW4oKTsKLS8vICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZShJRmlsZSBmaWxlLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVJlcG9ydGVyIHJlcG9ydGVyKQotICB7Ci0gICAgVmFsaWRhdGVXU0RMQWN0aW9uIHZhbGlkYXRlQWN0aW9uID0gbmV3IFZhbGlkYXRlV1NETEFjdGlvbihmaWxlLCBmYWxzZSk7Ci0gICAgdmFsaWRhdGVBY3Rpb24uc2V0VmFsaWRhdG9yKHRoaXMpOwotICAgIHZhbGlkYXRlQWN0aW9uLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLSAgICB2YWxpZGF0ZUFjdGlvbi5zZXRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0gICAgdmFsaWRhdGVBY3Rpb24ucnVuKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5JVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmNvcmUuSUhlbHBlciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5JUmVwb3J0ZXIsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmNvcmUuSUZpbGVEZWx0YVtdKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotICB7Ci0JU3RyaW5nW10gY2hhbmdlZEZpbGVzID0gaGVscGVyLmdldFVSSXMoKTsKLSAgICBpZiAoY2hhbmdlZEZpbGVzICE9IG51bGwgJiYgY2hhbmdlZEZpbGVzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtVG9WYWxpZGF0ZSA9IChJbnB1dFN0cmVhbSkgaGVscGVyLmxvYWRNb2RlbCgiaW5wdXRTdHJlYW0iKTsKLSAgICAgIGlmIChzdHJlYW1Ub1ZhbGlkYXRlICE9IG51bGwpCi0gICAgICB7ICAgCi0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGNoYW5nZWRGaWxlc1swXTsKLSAgICAgICAgT2JqZWN0W10gcGFybXMgPSB7IGZpbGVOYW1lIH07Ci0gICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIGhlbHBlci5sb2FkTW9kZWwoSGVscGVyLkdFVF9GSUxFLCBwYXJtcyk7Ci0gICAgICAgIAotICAgICAgICB2YWxpZGF0ZShmaWxlLCBzdHJlYW1Ub1ZhbGlkYXRlLCByZXBvcnRlcik7Ci0gICAgICAgIAotICAgICAgfSBlbHNlCi0gICAgICB7IGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlZEZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gY2hhbmdlZEZpbGVzW2ldOwotICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdFtdIHBhcm1zID0ge2ZpbGVOYW1lfTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgaGVscGVyLmxvYWRNb2RlbChIZWxwZXIuR0VUX0ZJTEUsIHBhcm1zKTsKLSAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICgoKEhlbHBlcikgaGVscGVyKS5pc0luSmF2YUJ1aWxkUGF0aChmaWxlKSAgJiYgISgoSGVscGVyKSBoZWxwZXIpLmlzSW5KYXZhU291cmNlUGF0aChmaWxlKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHZhbGlkYXRlSWZOZWVkZWQoZmlsZSwgaGVscGVyLCByZXBvcnRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgT2JqZWN0W10gcGFybXMgPSB7dGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKX07Ci0gICAgICBDb2xsZWN0aW9uIGZpbGVzID0gKENvbGxlY3Rpb24pIGhlbHBlci5sb2FkTW9kZWwoSGVscGVyLkdFVF9QUk9KRUNUX0ZJTEVTLCBwYXJtcyk7Ci0gICAgICBJdGVyYXRvciBpdGVyID0gZmlsZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgIHZhbGlkYXRlSWZOZWVkZWQoZmlsZSwgaGVscGVyLCByZXBvcnRlcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBmaWxlCi0gICAqIEBwYXJhbSByZXBvcnRlcgotICAgKiBAcGFyYW0gcnVsZUdyb3VwCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZShJRmlsZSBmaWxlLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIGludCBydWxlR3JvdXApCi0gIHsKLSAgICBWYWxpZGF0ZVdTRExBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVXU0RMQWN0aW9uKGZpbGUsIGZhbHNlKTsKLSAgICB2YWxpZGF0ZUFjdGlvbi5zZXRWYWxpZGF0b3IodGhpcyk7Ci0gICAgdmFsaWRhdGVBY3Rpb24ucnVuKCk7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGdpdmVuIGZpbGUgaWYgdmFsaWRhdGlvbiBpcyByZXF1aXJlZC4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlCi0gICAqIEBwYXJhbSBtb2RlbAotICAgKiBAcGFyYW0gaGVscGVyCi0gICAqIEBwYXJhbSByZXBvcnRlcgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJZk5lZWRlZChJRmlsZSBmaWxlLCBPYmplY3QgbW9kZWwsIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikKLSAgewotICAgIGlmIChtb2RlbCA9PSBudWxsKQotICAgIHsKLSAgICAgIHZhbGlkYXRlSWZOZWVkZWQoZmlsZSwgaGVscGVyLCByZXBvcnRlcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFVucGFja3MgdGhlIGZpbGVNb2RlbFBhaXIgYW5kIHJldHVybnMgYW4gSUZpbGUgb2JqZWN0LgotICAgKi8KLSAgcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIElGaWxlIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0gICAgewotICAgICAgTGlzdCBmaWxlTW9kZWxQYWlyID0gKExpc3QpIG9iamVjdDsKLSAgICAgIGlmIChmaWxlTW9kZWxQYWlyLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBmaWxlID0gZmlsZU1vZGVsUGFpci5nZXQoMCk7Ci0gICAgICAgIGlmIChmaWxlIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAoSUZpbGUpIGZpbGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gZmlsZSBpZiB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUKLSAgICogICAgICAgICAgVGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBoZWxwZXIKLSAgICogICAgICAgICAgQW4gYWlkIGZvciB0aGUgdmFsaWRhdGlvbi4KLSAgICogQHBhcmFtIHJlcG9ydGVyCi0gICAqICAgICAgICAgIFRoZSByZXBvcnRlciB0byByZXBvcnQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlmTmVlZGVkKElGaWxlIGZpbGUsIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikKLSAgewotICAgIFZhbGlkYXRvck1hbmFnZXIgbWdyID0gVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCk7Ci0gICAgLy8gUGFzcyBpbiBhICJudWxsIiBzbyB0aGF0IGxvYWRNb2RlbCBkb2Vzbid0IGF0dGVtcHQgdG8gY2FzdCB0aGUgcmVzdWx0IGludG8gYSBSZWZPYmplY3QuCi0gICAgSW50ZWdlciBydWxlR3JvdXBJbnQgPSAoSW50ZWdlcikgaGVscGVyLmxvYWRNb2RlbChJUnVsZUdyb3VwLlBBU1NfTEVWRUwsIG51bGwpOyAKLSAgICBpbnQgcnVsZUdyb3VwID0gKHJ1bGVHcm91cEludCA9PSBudWxsKSA/IElSdWxlR3JvdXAuUEFTU19GVUxMIDogcnVsZUdyb3VwSW50LmludFZhbHVlKCk7Ci0KLSAgICB2YWxpZGF0ZShmaWxlLCByZXBvcnRlciwgcnVsZUdyb3VwKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2NsZWFudXAoY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikKLSAgewotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvV1NETFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvV1NETFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmFkOTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1dTRExWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x2ZXI7Ci0KLS8qKgotICogQW4gRWNsaXBzZSBXU0RMIHZhbGlkYXRvci4gVGhpcyB2YWxpZGF0b3IgaXMgdGhlIGRlZmF1bHQgdmFsaWRhdG9yCi0gKiB1c2VkIGluIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4gVGhlcmUgaXMgb25seSBhIHNpbmdsZSBpbnN0YW5jZSBvZgotICogdGhpcyB2YWxpZGF0b3IuIFdoZW4gY3JlYXRlZCwgdGhpcyB2YWxpZGF0b3IgcmVnaXN0ZXJzIGFsbCBleHRlbnNpb24KLSAqIFVSSSByZXNvbHZlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMVmFsaWRhdG9yIAotewotCXByaXZhdGUgc3RhdGljIFdTRExWYWxpZGF0b3IgaW5zdGFuY2UgPSBudWxsOwotCQotCXByaXZhdGUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5XU0RMVmFsaWRhdG9yIHdzZGxWYWxpZGF0b3I7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yIHJlZ2lzdGVycyBhbGwgb2YgdGhlIFVSSSByZXNvbHZlcnMgZGVmaW5lZCB2aWEgdGhlCi0JICogV1NETCBVUkkgcmVzb2x2ZXIgZXh0ZW5zaW9uIHBvaW50IHdpdGggdGhlIFdTREwgdmFsaWRhdG9yLiAKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFdTRExWYWxpZGF0b3IoKQotCXsKLQkgIHRoaXMud3NkbFZhbGlkYXRvciA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLldTRExWYWxpZGF0b3IoKTsKLQkgIFVSSVJlc29sdmVyUmVnaXN0cnlSZWFkZXIgdXJpUlIgPSBuZXcgVVJJUmVzb2x2ZXJSZWdpc3RyeVJlYWRlcigpOwotCSAgTGlzdCByZXNvbHZlcnMgPSB1cmlSUi5yZWFkUmVnaXN0cnkoKTsKLQkgIEl0ZXJhdG9yIHJlc29sdmVySXRlciA9IHJlc29sdmVycy5pdGVyYXRvcigpOwotCSAgd2hpbGUocmVzb2x2ZXJJdGVyLmhhc05leHQoKSkKLQkgIHsKLQkgIAlJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSAoSVVSSVJlc29sdmVyKXJlc29sdmVySXRlci5uZXh0KCk7Ci0JICAJd3NkbFZhbGlkYXRvci5hZGRVUklSZXNvbHZlcihyZXNvbHZlcik7Ci0JICB9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoaXMgRWNsaXBzZSBXU0RMIHZhbGlkYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBFY2xpcHNlIFdTREwgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NETFZhbGlkYXRvciBnZXRJbnN0YW5jZSgpCi0JewotCQlpZihpbnN0YW5jZSA9PSBudWxsKQotCQl7Ci0JCQlpbnN0YW5jZSA9IG5ldyBXU0RMVmFsaWRhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgc3BlY2lmaWVkIFdTREwgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVVSSSBUaGUgVVJJIG9mIHRoZSBXU0RMIGZpbGUuCi0JICogQHJldHVybiBBIHZhbGlkYXRpb24gcmVwb3J0IHdpdGggdGhlIHZhbGlkYXRpb24gcmVzdWx0cy4KLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIGZpbGVVUkkpCi0JewotCQlyZXR1cm4gd3NkbFZhbGlkYXRvci52YWxpZGF0ZShmaWxlVVJJKTsKLQl9Ci0gIC8qKgotCSAqIFZhbGlkYXRlIHRoZSBnaXZlbiBXU0RMIElucHV0U3RyZWFtCi0JICogCi0JICogQHBhcmFtIGZpbGVVUkkgVGhlIFVSSSBvZiB0aGUgV1NETCBmaWxlLgotCSAqIEBwYXJhbSBpbnB1dFN0cmVhbSB0aGUgSW5wdXRTdHJlYW0gdG8gdmFsaWRhdGUKLQkgKiBAcmV0dXJuIEEgdmFsaWRhdGlvbiByZXBvcnQgd2l0aCB0aGUgdmFsaWRhdGlvbiByZXN1bHRzLgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgZmlsZVVSSSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLSAgICByZXR1cm4gd3NkbFZhbGlkYXRvci52YWxpZGF0ZShmaWxlVVJJLCBpbnB1dFN0cmVhbSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3RleHQvV1NETFZhbGlkYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdGV4dC9XU0RMVmFsaWRhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjYmZhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdGV4dC9XU0RMVmFsaWRhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS50ZXh0OwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5XU0RMVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLldTRExDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuWE1MQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nRW50aXR5SG9sZGVyOwotCi1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwuU3RyaW5nVXRpbHM7Ci0KLS8qKgotICogQSBjb21tYW5kZSBsaW5lIHRvb2wgdG8gcnVuIFdTREwgVmFsaWRhdGlvbiBvbiBhIHNpbmdsZSBvciBtdWx0aXBsZSBmaWxlcy4KLSAqIAotICogT3B0aW9ucwotICogLXNjaGVtYURpciBkaXJlY3RvcnkgICAgICAgOiBhIGRpcmVjdG9yeSBvZiBzY2hlbWFzIHRvIGxvYWQgaW50byB0aGUgY2F0YWxvZwotICogLXNjaGVtYSBuYW1lc3BhY2UgbG9jYXRpb24gOiBhIHNjaGVtYSB0byBsb2FkIGludG8gdGhlIHJlZ2lzdHJ5Ci0gKiAtd3NkbDExdiBjbGFzc25hbWUgbmFtZXNwYWNlIHJlc291cmNlYnVuZGxlIDogcmVnaXN0ZXIgYSBXU0RMIDEuMSBleHRlbnNpb24gdmFsaWRhdG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGxvYWQgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Ugd2l0aCB0aGUgZ2l2ZW4gcmVzb3VyY2VidW5kbGUKLSAqIC13c2l2IHZhbGlkYXRvckNsYXNzIG5hbWVzcGFjZSBwcm9wZXJ0aWVzZmlsZSA6IHJlZ2lzdGVyIGEgV1MtSSB2YWxpZGF0b3IKLSAqIC11cmlyZXNvbHZlciBVUklSZXNvbHZlckNsYXNzIDogcmVnaXN0ZXIgYW4gZXh0ZW5zaW9uIFVSSSByZXNvbHZlcgotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRlCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEZJTEVfUFJFRklYID0gImZpbGU6Ly8vIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9QUk9QRVJUSUVTID0KLSAgICBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnN0YW50cy5XU0RMX1ZBTElEQVRPUl9QUk9QRVJUSUVTX0ZJTEU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9QUk9QRVJUSUVTID0gInZhbGlkYXRld3NkbHVpIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9FUlJPUl9XUk9OR19BUkdVTUVOVFMgPSAiX0VSUk9SX1dST05HX0FSR1VNRU5UUyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVUlfSU5GT1JNQVRJT05fREVMSU1JVEVSID0gIl9VSV9JTkZPUk1BVElPTl9ERUxJTUlURVIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1VJX0FDVElPTl9WQUxJREFUSU5HX0ZJTEUgPSAiX1VJX0FDVElPTl9WQUxJREFUSU5HX0ZJTEUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1VJX1ZBTElEID0gIl9VSV9WQUxJRCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVUlfSU5WQUxJRCA9ICJfVUlfSU5WQUxJRCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVUlfRVJST1JfTUFSS0VSID0gIl9VSV9FUlJPUl9NQVJLRVIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1VJX1dBUk5JTkdfTUFSS0VSID0gIl9VSV9XQVJOSU5HX01BUktFUiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfRVJST1JfVU5BQkxFX1RPX0xPQURfRVhUX1ZBTElEQVRPUiA9ICJfRVJST1JfVU5BQkxFX1RPX0xPQURfRVhUX1ZBTElEQVRPUiI7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fV1NETDExVkFMID0gIi13c2RsMTF2IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VYVFZBTCA9ICItZXh0diI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TQ0hFTUFESVIgPSAiLXNjaGVtYURpciI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TQ0hFTUEgPSAiLXNjaGVtYSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9VUklSRVNPTFZFUiA9ICItdXJpcmVzb2x2ZXIiOwotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19FTVBUWSA9ICIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1NQQUNFID0gIiAiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0RBU0ggPSAiLSI7Ci0gIAotICAKLSAgcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotICBwcm90ZWN0ZWQgTGlzdCBlcnJvcnMgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCB3YXJuaW5ncyA9IG51bGw7Ci0gIHByb3RlY3RlZCBXU0RMVmFsaWRhdG9yIHdzZGxWYWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIENvbnN0dWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETFZhbGlkYXRlKCkKLSAgewotICAJd3NkbFZhbGlkYXRvciA9IG5ldyBXU0RMVmFsaWRhdG9yKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZFVSSVJlc29sdmVyKElVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAJd3NkbFZhbGlkYXRvci5hZGRVUklSZXNvbHZlcih1cmlSZXNvbHZlcik7Ci0gIH0KLQotICAvKioKLSAgICogUnVuIFdTREwgdmFsaWRhdGlvbiBvbiBhIGdpdmVuIGZpbGUuCi0gICAqIAotICAgKiBAcGFyYW0gZGlyZWN0b3J5IC0gdGhlIGN1cnJlbnQgZGlyIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgZmlsZSBuYW1lcwotICAgKiBAcGFyYW0gZmlsZW5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZQotICAgKiBAcGFyYW0gdmFsaWRhdG9yUkIgLSB0aGUgV1NETCB2YWxpZGF0b3IgcmVzb3VyY2UgYnVuZGxlCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgSVZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGVGaWxlKFN0cmluZyBkaXJlY3RvcnksIFN0cmluZyBmaWxlbmFtZSwgUmVzb3VyY2VCdW5kbGUgdmFsaWRhdG9yUkIpCi0gICAgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgLy8JcmVzb2x2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUKLSAgICBTdHJpbmcgZmlsZWxvY2F0aW9uID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkwgdGVzdCA9IFN0cmluZ1V0aWxzLmdldFVSTChuZXcgVVJMKEZJTEVfUFJFRklYICsgZGlyZWN0b3J5ICsgIi8iKSwgZmlsZW5hbWUpOwotICAgICAgZmlsZWxvY2F0aW9uID0gdGVzdC50b0V4dGVybmFsRm9ybSgpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlc29sdmUgV1NETCBmaWxlIGxvY2F0aW9uIik7Ci0gICAgfQotICAgIC8vIHJ1biB2YWxpZGF0aW9uIG9uIHRoZSBmaWxlIGFuZCByZWNvcmQgdGhlIGVycm9ycyBhbmQgd2FybmluZ3MKLSAgICBJVmFsaWRhdGlvblJlcG9ydCB2YWxSZXBvcnQgPSB3c2RsVmFsaWRhdG9yLnZhbGlkYXRlKGZpbGVsb2NhdGlvbik7Ci0gICAgcmV0dXJuIHZhbFJlcG9ydDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgU3RyaW5nIHdpdGggZm9ybWF0dGVkIG91dHB1dCBmb3IgYSBsaXN0IG9mIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2VzIFRoZSBtZXNzYWdlcyB0byBnZXQuCi0gICAqIEBwYXJhbSBlcnJvcm1hcmtlciBUaGUgbWFya2VyIHRvIHVzZSB0byBsYWJlbCBlcnJvciBtZXNzYWdlcy4KLSAgICogQHBhcmFtIHdhcm5pbmdtYXJrZXIgVGhlIG1hcmtlciB0byB1c2UgdG8gbGFiZWwgd2FybmluZyBtZXNzYWdlcy4KLSAgICogQHJldHVybiBBIHN0cmluZyB3aXRoIGEgZm9ybWF0dGVkIGxpc3Qgb2YgdGhlIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlcyhJVmFsaWRhdGlvbk1lc3NhZ2VbXSBtZXNzYWdlcywgU3RyaW5nIGVycm9ybWFya2VyLCBTdHJpbmcgd2FybmluZ21hcmtlcikKLSAgewotICAgIFN0cmluZ0J1ZmZlciBvdXRwdXRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgaWYgKG1lc3NhZ2VzICE9IG51bGwpCi0gICAgewotICAgICAgLy8gY3JlYXRlIGEgbGlzdCBvZiBtZXNzYWdlcyB0aGF0IGxvb2tzIGxpa2UKLSAgICAgIC8vIEVSUk9SIDE6MSBFcnJvciBtZXNzYWdlIGNvbnRlbnQKLSAgICAgIGludCBudW1NZXNzYWdlcyA9IG1lc3NhZ2VzLmxlbmd0aDsKLSAgICAgIFN0cmluZyBtYXJrZXIgPSBudWxsOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1NZXNzYWdlczsgaSsrKQotICAgICAgewotICAgICAgICBJVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldOwotICAgICAgICBpbnQgc2V2ZXJpdHkgPSBtZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0gICAgICAgIGlmIChzZXZlcml0eSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgbWFya2VyID0gZXJyb3JtYXJrZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2V2ZXJpdHkgPT0gSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9XQVJOSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgbWFya2VyID0gd2FybmluZ21hcmtlcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtYXJrZXIgPSBTVFJJTkdfRU1QVFk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0cHV0QnVmZmVyCi0gICAgICAgICAgLmFwcGVuZChtYXJrZXIpCi0gICAgICAgICAgLmFwcGVuZChTVFJJTkdfU1BBQ0UpCi0gICAgICAgICAgLmFwcGVuZChtZXNzYWdlLmdldExpbmUoKSkKLSAgICAgICAgICAuYXBwZW5kKCI6IikKLSAgICAgICAgICAuYXBwZW5kKG1lc3NhZ2UuZ2V0Q29sdW1uKCkpCi0gICAgICAgICAgLmFwcGVuZChTVFJJTkdfU1BBQ0UpCi0gICAgICAgICAgLmFwcGVuZChtZXNzYWdlLmdldE1lc3NhZ2UoKSkKLSAgICAgICAgICAuYXBwZW5kKCJcbiIpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3V0cHV0QnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1haW4gZW50cnkgcG9pbnQgaW50byB0aGUgY29tbWFuZCBsaW5lIHRvb2wuIAotICAgKiBDaGVja3MgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsIHJlZ2lzdGVycyB0aGUgZGVmYXVsdCB2YWxpZGF0b3JzIGFuZCBydW5zIHZhbGlkYXRpb24gb24gdGhlCi0gICAqIGxpc3Qgb2YgZmlsZXMuCi0gICAqIAotICAgKiBAcGFyYW0gYXJncyAtIHRoZSBhcmd1bWVudHMgdG8gdGhlIHZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIExpc3Qgd3NkbEZpbGVzID0gbmV3IFZlY3RvcigpOwotICAgIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc0dlbiA9IG51bGw7Ci0gICAgUmVzb3VyY2VCdW5kbGUgdmFsaWRhdG9yUkIgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFJlc291cmNlQnVuZGxlIHVpUkIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoVUlfUFJPUEVSVElFUyk7Ci0gICAgICBtZXNzR2VuID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IodWlSQik7Ci0gICAgICB2YWxpZGF0b3JSQiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShWQUxJREFUT1JfUFJPUEVSVElFUyk7Ci0gICAgfQotICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlZhbGlkYXRpb24gZmFpbGVkOiBVbmFibGUgdG8gbG9hZCB0aGUgcHJvcGVydGllcyBmaWxlLiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBubyBhcmd1bWVudHMgc3BlY2lmaWVkLiBQcmludCB1c2FnZS4KLSAgICBpZiAoYXJncy5sZW5ndGggPCAxKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzR2VuLmdldFN0cmluZyhfRVJST1JfV1JPTkdfQVJHVU1FTlRTKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IGFyZ3NsZW5ndGggPSBhcmdzLmxlbmd0aDsKLQotICAgIC8vIHJlZ2lzdGVyIHRoZSBkZWZhdWx0IHZhbGlkYXRvcnMKLSAgICBXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyRGVmYXVsdFZhbGlkYXRvcnModmFsaWRhdG9yUkIpOwotCi0gICAgV1NETFZhbGlkYXRlIHdzZGxWYWxpZGF0b3IgPSBuZXcgV1NETFZhbGlkYXRlKCk7Ci0gICAgLy8gZ28gdGhyb3VnaCB0aGUgcGFyYW1ldGVycwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnc2xlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBwYXJhbSA9IGFyZ3NbaV07Ci0KLSAgICAgIC8vIHJlZ2lzdGVyaW5nIGEgdmFsaWRhdG9yCi0gICAgICBpZiAocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShXU0RMVmFsaWRhdGUuUEFSQU1fV1NETDExVkFMKSB8fCBwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKFdTRExWYWxpZGF0ZS5QQVJBTV9FWFRWQUwpKQotICAgICAgewotCi0gICAgICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzcyA9IGFyZ3NbKytpXTsKLSAgICAgICAgaWYgKCF2YWxpZGF0b3JDbGFzcy5zdGFydHNXaXRoKFdTRExWYWxpZGF0ZS5TVFJJTkdfREFTSCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gYXJnc1srK2ldOwotCi0gICAgICAgICAgaWYgKCFuYW1lc3BhY2Uuc3RhcnRzV2l0aChXU0RMVmFsaWRhdGUuU1RSSU5HX0RBU0gpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0aWVzRmlsZSA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzRmlsZS5zdGFydHNXaXRoKFdTRExWYWxpZGF0ZS5TVFJJTkdfREFTSCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByb3BlcnRpZXNGaWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShXU0RMVmFsaWRhdGUuUEFSQU1fV1NETDExVkFMKSkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICBXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKG5hbWVzcGFjZSwgdmFsaWRhdG9yQ2xhc3MsIHByb3BlcnRpZXNGaWxlLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShXU0RMVmFsaWRhdGUuUEFSQU1fRVhUVkFMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgV1NETENvbmZpZ3VyYXRvci5yZWdpc3RlckV4dGVuc2lvblZhbGlkYXRvcihuYW1lc3BhY2UsIHZhbGlkYXRvckNsYXNzLCBwcm9wZXJ0aWVzRmlsZSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgaS0tOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpZGF0b3JDbGFzcyA9IG51bGw7Ci0gICAgICAgICAgaS0tOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIC8vIHJlZ2lzdGVyaW5nIGEgZGlyZWN0b3J5IHdpdGggc2NoZW1hcwotICAgICAgZWxzZSBpZiAocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShXU0RMVmFsaWRhdGUuUEFSQU1fU0NIRU1BRElSKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHhzZERpciA9IGFyZ3NbKytpXTsKLSAgICAgICAgWE1MQ2F0YWxvZy5hZGRTY2hlbWFEaXIoeHNkRGlyKTsKLSAgICAgIH0KLSAgICAgIC8vIHJlZ2lzdGVyaW5nIGEgc2NoZW1hCi0gICAgICBlbHNlIGlmIChwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKFdTRExWYWxpZGF0ZS5QQVJBTV9TQ0hFTUEpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcHVibGljaWQgPSBhcmdzWysraV07Ci0gICAgICAgIFN0cmluZyBzeXN0ZW1pZCA9IGFyZ3NbKytpXTsKLSAgICAgICAgWE1MQ2F0YWxvZy5hZGRFbnRpdHkobmV3IFhNTENhdGFsb2dFbnRpdHlIb2xkZXIocHVibGljaWQsIHN5c3RlbWlkKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoUEFSQU1fVVJJUkVTT0xWRVIpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVzb2x2ZXJDbGFzcyA9IGFyZ3NbKytpXTsKLSAgICAgICAgd3NkbFZhbGlkYXRvci5hZGRVUklSZXNvbHZlcihuZXcgVVJJUmVzb2x2ZXJEZWxlZ2F0ZShyZXNvbHZlckNsYXNzLCBudWxsKS5nZXRVUklSZXNvbHZlcigpKTsKLSAgICAgIH0KLSAgICAgIC8vIGEgZmlsZSB0byB2YWxpZGF0ZQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZighcGFyYW0uc3RhcnRzV2l0aChXU0RMVmFsaWRhdGUuU1RSSU5HX0RBU0gpKQotICAgICAgICB7ICAKLSAgICAgICAgICB3c2RsRmlsZXMuYWRkKHBhcmFtKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotICAgIC8vIHZhbGlkYXRlIHRoZSBmaWxlCi0gICAgU3RyaW5nQnVmZmVyIG91dHB1dEJ1ZmZlciA9IG51bGw7Ci0gICAgU3RyaW5nIGluZm9EZWxpbSA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9JTkZPUk1BVElPTl9ERUxJTUlURVIpOwotICAgIFN0cmluZyB2YWxpZCA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9WQUxJRCk7Ci0gICAgU3RyaW5nIGludmFsaWQgPSBtZXNzR2VuLmdldFN0cmluZyhfVUlfSU5WQUxJRCk7Ci0gICAgU3RyaW5nIGVycm9ybWFya2VyID0gbWVzc0dlbi5nZXRTdHJpbmcoX1VJX0VSUk9SX01BUktFUik7Ci0gICAgU3RyaW5nIHdhcm5pbmdtYXJrZXIgPSBtZXNzR2VuLmdldFN0cmluZyhfVUlfV0FSTklOR19NQVJLRVIpOwotCi0gICAgSXRlcmF0b3IgZmlsZXNJdGVyID0gd3NkbEZpbGVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGZpbGVzSXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgb3V0cHV0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgU3RyaW5nIHdzZGxGaWxlID0gKFN0cmluZylmaWxlc0l0ZXIubmV4dCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElWYWxpZGF0aW9uUmVwb3J0IHZhbFJlcG9ydCA9IHdzZGxWYWxpZGF0b3IudmFsaWRhdGVGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgd3NkbEZpbGUsIHZhbGlkYXRvclJCKTsKLQotICAgICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKGluZm9EZWxpbSkuYXBwZW5kKCJcbiIpOwotICAgICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9BQ1RJT05fVkFMSURBVElOR19GSUxFLCB3c2RsRmlsZSkpLmFwcGVuZCgiIC0gIik7Ci0gICAgICAgIGlmICghdmFsUmVwb3J0Lmhhc0Vycm9ycygpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0cHV0QnVmZmVyLmFwcGVuZCh2YWxpZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgb3V0cHV0QnVmZmVyLmFwcGVuZChpbnZhbGlkKTsKLSAgICAgICAgfQotICAgICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKCJcbiIpLmFwcGVuZChpbmZvRGVsaW0pLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgb3V0cHV0QnVmZmVyLmFwcGVuZCh3c2RsVmFsaWRhdG9yLmdldE1lc3NhZ2VzKHZhbFJlcG9ydC5nZXRWYWxpZGF0aW9uTWVzc2FnZXMoKSwgZXJyb3JtYXJrZXIsIHdhcm5pbmdtYXJrZXIpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG91dHB1dEJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTG9hZCBhIHZhbGlkYXRvciBpbnRvIHRoZSB3c2RsIHZhbGlkYXRpb24gZnJhbWV3b3JrIHJlZ2lzdHJ5LgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSAtIHRoZSBuYW1lc3BhY2UgdGhlIHZhbGlkYXRvciBjaGVja3MKLSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzIC0gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoZSBpbXBsZW1lbnRzIElXU0RMVmFsaWRhdG9yCi0gICAqIEBwYXJhbSBwcm9wZXJ0aWVzRmlsZSAtIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSB2YWxpZGF0b3IKLSAgICogQHBhcmFtIHR5cGUgICAgICAgICAgIC0gdGhlIHR5cGUgb2YgdmFsaWRhdG9yIC0gV1NETCBvciBXUy1JCi0gICAqIEBwYXJhbSBtZXNzR2VuICAgICAgICAtIGEgTWVzc2FnZUdlbmVyYXRvciBmb3IgcHJvZHVjaW5nIGVycm9yIG1lc3NhZ2VzCi0gICAqLwotLy8gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2FkRXh0ZW5zaW9uVmFsaWRhdG9yKAotLy8gICAgU3RyaW5nIG5hbWVzcGFjZSwKLS8vICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzcywKLS8vICAgIFN0cmluZyBwcm9wZXJ0aWVzRmlsZSwKLS8vICAgIEludGVnZXIgdHlwZSwKLS8vICAgIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc0dlbikKLS8vICB7Ci0vLyAgICB0cnkKLS8vICAgIHsKLS8vICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotLy8gICAgICBJV1NETFZhbGlkYXRvciB2YWxpZGF0b3IgPSAoSVdTRExWYWxpZGF0b3IpY2xhc3NMb2FkZXIubG9hZENsYXNzKHZhbGlkYXRvckNsYXNzKS5uZXdJbnN0YW5jZSgpOwotLy8gICAgICAvLyBpZiBubyBwcm9wZXJ0aWVzIGZpbGUgaXMgc3BlY2lmaWVkIHdlIGNhbiBzdGlsbCBsb2FkIHRoZSB2YWxpZGF0b3IKLS8vICAgICAgaWYgKHByb3BlcnRpZXNGaWxlICE9IG51bGwgJiYgIXByb3BlcnRpZXNGaWxlLmVxdWFscygiIikpCi0vLyAgICAgIHsKLS8vICAgICAgICBSZXNvdXJjZUJ1bmRsZSByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwcm9wZXJ0aWVzRmlsZSk7Ci0vLyAgICAgICAgdmFsaWRhdG9yLnNldFJlc291cmNlQnVuZGxlKHJiKTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlCi0vLyAgICAgIHsKLS8vICAgICAgICBwcm9wZXJ0aWVzRmlsZSA9IG51bGw7Ci0vLyAgICAgIH0KLS8vCi0vLyAgICAgIFZhbGlkYXRvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVnaXN0ZXJWYWxpZGF0b3IobmFtZXNwYWNlLCB2YWxpZGF0b3IsIHR5cGUpOwotLy8gICAgfQotLy8gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotLy8gICAgewotLy8gICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc0dlbi5nZXRTdHJpbmcoX0VSUk9SX1VOQUJMRV9UT19MT0FEX0VYVF9WQUxJREFUT1IsIG5hbWVzcGFjZSwgZSkpOwotLy8gICAgfQotLy8KLS8vICB9Ci0gIC8vCS8qKgotICAvLwkgKiBsb2FkV1NETDExRXh0ZW5zaW9uVmFsaWRhdG9yCi0gIC8vCSAqIExvYWQgYW4gZXh0ZW5zaW9uIHZhbGlkYXRvciBpbnRvIHRoZSBXU0RMIDEuMSB2YWxpZGF0b3IKLSAgLy8gICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgLy8gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzcwotICAvLyAgICogQHBhcmFtIHByb3BlcnRpZXNGaWxlCi0gIC8vICAgKiBAcGFyYW0gdHlwZQotICAvLyAgICogQHBhcmFtIGNsYXNzTG9hZGVyCi0gIC8vICAgKi8KLSAgLy8gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2FkV1NETDExRXh0ZW5zaW9uVmFsaWRhdG9yKAotICAvLwkJCVN0cmluZyBuYW1lc3BhY2UsCi0gIC8vCQkJU3RyaW5nIHZhbGlkYXRvckNsYXNzLAotICAvLwkJCVN0cmluZyByZXNvdXJjZUJ1bmRsZSwKLSAgLy8JCQlDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgLy8JCXsKLSAgLy8JCQl0cnkKLSAgLy8gewotICAvLyAJQ2xhc3MgdmFsY2xhc3MgPSBjbGFzc0xvYWRlci5sb2FkQ2xhc3ModmFsaWRhdG9yQ2xhc3MpOwotICAvLyAJSVdTREwxMVZhbGlkYXRvciB2YWxpZGF0b3IgPSAoSVdTREwxMVZhbGlkYXRvcil2YWxjbGFzcy5uZXdJbnN0YW5jZSgpOwotICAvLyAJdmFsaWRhdG9yLnNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZSkpOwotICAvLyAJV1NETENvbmZpZ3VyYXRvci5yZWdpc3RlcldTREwxMVZhbGlkYXRvcihuYW1lc3BhY2UsdmFsaWRhdG9yKTsKLSAgLy8gfQotICAvLyBjYXRjaChFeGNlcHRpb24gZSkKLSAgLy8gewotICAvLwkgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gbG9hZCB0aGUgV1NETCAxLjEgdmFsaWRhdG9yIGZvciBuYW1lc3BhY2UgIgotICAvLyArIG5hbWVzcGFjZSArIGUpOwotICAvLyB9Ci0gIC8vCi0gIC8vCQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL3ZhbGlkYXRld3NkbHVpLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL3ZhbGlkYXRld3NkbHVpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOWU4MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS92YWxpZGF0ZXdzZGx1aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLSBFY2xpcHNlIFVJIE1lc3NhZ2UgRGlhbG9nCi1fVkFMSURBVElPTl9TVUNDRUVERUQgICAgICAgICAgICAgICAgICAgICAgPSBWYWxpZGF0aW9uIFN1Y2NlZWRlZAotX1ZBTElEQVRJT05fRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgID0gVmFsaWRhdGlvbiBGYWlsZWQKLV9VSV9USEVfV1NETF9GSUxFX0lTX1ZBTElEICAgICAgICAgICAgICAgICA9IFRoZSBXU0RMIGZpbGUgaXMgdmFsaWQuCi1fVUlfVEhFX1dTRExfRklMRV9JU19OT1RfVkFMSUQgICAgICAgICAgICAgPSBUaGUgV1NETCBmaWxlIGlzIG5vdCB2YWxpZC4gU2VlIHRoZSBQcm9ibGVtcyB2aWV3IGZvciBhIGxpc3Qgb2YgdGhlIHZhbGlkYXRpb24gZXJyb3JzLgotX1VJX1RIRV9XU0RMX0ZJTEVfSVNfVkFMSURfV1NETDExICAgICAgICAgID0gVGhlIFdTREwgZmlsZSBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIFdTREwgc3BlY2lmaWNhdGlvbiBob3dldmVyIGFuIGV4dGVuc2lvbiB2YWxpZGF0b3IgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgZmlsZSBpcyBub3QgdmFsaWQuIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgYSBsaXN0IG9mIHRoZSB2YWxpZGF0aW9uIGVycm9ycy4KLV9VSV9USEVfV1NETF9GSUxFX0lTX1ZBTElEX1dJVEhfV0FSTklOR1MgICA9IFRoZSBXU0RMIGZpbGUgaXMgdmFsaWQgaG93ZXZlciB3YXJuaW5ncyBoYXZlIGJlZW4gaXNzdWVkLiBTZWUgdGhlIFByb2JsZW1zIHZpZXcgZm9yIGEgbGlzdCBvZiB0aGUgdmFsaWRhdGlvbiB3YXJuaW5ncy4KLQotIS0tIEFudCBVSQotX1VJX0lORk9STUFUSU9OX0RFTElNSVRFUiAgICAgICAgICAgICAgICAgID0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1fVUlfRVJST1JfTUFSS0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFUlJPUiAgCi1fVUlfV0FSTklOR19NQVJLRVIgICAgICAgICAgICAgICAgICAgICAgICAgPSBXQVJOSU5HCi1fVUlfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBWQUxJRAotX1VJX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSU5WQUxJRAotX1VJX0FDVElPTl9WQUxJREFUSU5HX0ZJTEUgICAgICAgICAgICAgICAgID0gVmFsaWRhdGluZyB7MH0KLQotX0VSUk9SX05PX0ZJTEVfU1BFQ0lGSUVEICAgICAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIHJ1biBXU0RMIFZhbGlkYXRpb24uIFlvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIGZpbGUuCi0KLV9FWENfVU5BQkxFX1RPX1ZBTElEQVRFX0ZJTEUgICAgICAgICAgICAgICA9IFVuYWJsZSB0byB2YWxpZGF0ZSB0aGUgV1NETCBmaWxlIHswfS4gezF9Ci1fRVhDX1dTRExfRkFJTF9PTl9FUlJPUiAgICAgICAgICAgICAgICAgICAgPSBUaGUgV1NETCBmaWxlIGlzIG5vdCB2YWxpZC4gKEZhaWwgT24gRXJyb3IgaXMgZW5hYmxlZC4pCi0KLSEtLSBUZXh0IFVJCi1fRVJST1JfV1JPTkdfQVJHVU1FTlRTICAgICAgICAgICAgICAgICAgICAgPSBVc2FnZTogV1NETFZhbGlkYXRlIGZpbGVuYW1lIgotX0VSUk9SX1VOQUJMRV9UT19MT0FEX0VYVF9WQUxJREFUT1IgICAgICAgID0gVW5hYmxlIHRvIGxvYWQgdGhlIHZhbGlkYXRvciBmb3IgbmFtZXNwYWNlIHswfS4gezF9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkY2QwMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGV4cG9ydGVkPSJ0cnVlIiBraW5kPSJsaWIiIHBhdGg9ImxpYi9xbmFtZS5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL3dzZGw0ai5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQyNjUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi13c2RsLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LndzZGxfMS4wLjAuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjNTNiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzZGw8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVjZGY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSB3c2RsLmphcixcCi0gICAgICAgICAgICAgICBsaWIvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgZ3JhYmphcnMueG1sLFwKLSAgICAgICAgICAgICAgIHhzZC8KLWphcnMuY29tcGlsZS5vcmRlciA9IHdzZGwuamFyCi1zb3VyY2Uud3NkbC5qYXIgPSBzcmMvCi1vdXRwdXQud3NkbC5qYXIgPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBsaWIvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgZ3JhYmphcnMueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB4c2QvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTdhMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIKLQluYW1lPSJvcmcuZWNsaXBzZS53c3Qud3NkbCI+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC53c2RsIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iQmluZGluZ0ZhdWx0IiAvPgotCQk8dHlwZSBuYW1lPSJCaW5kaW5nT3V0cHV0IiAvPgotCQk8dHlwZSBuYW1lPSJUeXBlcyIgLz4KLQkJPHR5cGUgbmFtZT0iT3BlcmF0aW9uIiAvPgotCQk8dHlwZSBuYW1lPSJGYXVsdCIgLz4KLQkJPHR5cGUgbmFtZT0iRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIC8+Ci0JCTx0eXBlIG5hbWU9Ik1lc3NhZ2UiIC8+Ci0JCTx0eXBlIG5hbWU9IkV4dGVuc2libGVFbGVtZW50IiAvPgotCQk8dHlwZSBuYW1lPSJCaW5kaW5nSW5wdXQiIC8+Ci0JCTx0eXBlIG5hbWU9IlBvcnRUeXBlIiAvPgotCQk8dHlwZSBuYW1lPSJTZXJ2aWNlIiAvPgotCQk8dHlwZSBuYW1lPSJJbnB1dCIgLz4KLQkJPHR5cGUgbmFtZT0iV1NETEVsZW1lbnQiIC8+Ci0JCTx0eXBlIG5hbWU9IlBvcnQiIC8+Ci0JCTx0eXBlIG5hbWU9Ik5hbWVzcGFjZSIgLz4KLQkJPHR5cGUgbmFtZT0iUGFydCIgLz4KLQkJPHR5cGUgbmFtZT0iRGVmaW5pdGlvbiIgLz4KLQkJPHR5cGUgbmFtZT0iSW1wb3J0IiAvPgotCQk8dHlwZSBuYW1lPSJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIgLz4KLQkJPHR5cGUgbmFtZT0iV1NETFBsdWdpbiIgLz4KLQkJPHR5cGUgbmFtZT0iV1NETEZhY3RvcnkiIC8+Ci0JCTx0eXBlIG5hbWU9Ik1lc3NhZ2VSZWZlcmVuY2UiIC8+Ci0JCTx0eXBlIG5hbWU9IlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgLz4KLQkJPHR5cGUgbmFtZT0iT3V0cHV0IiAvPgotCQk8dHlwZSBuYW1lPSJCaW5kaW5nIiAvPgotCQk8dHlwZSBuYW1lPSJCaW5kaW5nT3BlcmF0aW9uIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iV1NETENvbnN0YW50cyIgLz4KLQkJPHR5cGUgbmFtZT0iRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkiIC8+Ci0JCTx0eXBlIG5hbWU9IldTRExSZXNvdXJjZUZhY3RvcnlJbXBsIiAvPgotCQk8dHlwZSBuYW1lPSJFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkiIC8+Ci0JCTx0eXBlIG5hbWU9IldTRExSZXNvdXJjZUltcGwiIHN1YmNsYXNzPSJmYWxzZSIvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTT0FQQm9keSIgLz4KLQkJPHR5cGUgbmFtZT0iU09BUEhlYWRlckZhdWx0IiAvPgotCQk8dHlwZSBuYW1lPSJTT0FQQWRkcmVzcyIgLz4KLQkJPHR5cGUgbmFtZT0iU09BUEZhY3RvcnkiIC8+Ci0JCTx0eXBlIG5hbWU9IlNPQVBIZWFkZXIiIC8+Ci0JCTx0eXBlIG5hbWU9IlNPQVBCaW5kaW5nIiAvPgotCQk8dHlwZSBuYW1lPSJTT0FQSGVhZGVyQmFzZSIgLz4KLQkJPHR5cGUgbmFtZT0iU09BUEZhdWx0IiAvPgotCQk8dHlwZSBuYW1lPSJTT0FQT3BlcmF0aW9uIiAvPgotCTwvcGFja2FnZT4KLTwhLS0gcHJvdmlzaW9uYWwgQVBJcyAtLT4KLTwhLS0KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUiPgotCQk8dHlwZSBuYW1lPSJNSU1FQ29udGVudCIgLz4KLQkJPHR5cGUgbmFtZT0iTUlNRVBhY2thZ2UiIC8+Ci0JCTx0eXBlIG5hbWU9Ik1JTUVNdWx0aXBhcnRSZWxhdGVkIiAvPgotCQk8dHlwZSBuYW1lPSJNSU1FUGFydCIgLz4KLQkJPHR5cGUgbmFtZT0iTUlNRU1pbWVYbWwiIC8+Ci0JCTx0eXBlIG5hbWU9Ik1JTUVGYWN0b3J5IiAvPgotCTwvcGFja2FnZT4KLS0tPgotPCEtLQotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cCI+Ci0JCTx0eXBlIG5hbWU9IkhUVFBGYWN0b3J5IiAvPgotCQk8dHlwZSBuYW1lPSJIVFRQT3BlcmF0aW9uIiAvPgotCQk8dHlwZSBuYW1lPSJIVFRQVXJsRW5jb2RlZCIgLz4KLQkJPHR5cGUgbmFtZT0iSFRUUFBhY2thZ2UiIC8+Ci0JCTx0eXBlIG5hbWU9IkhUVFBBZGRyZXNzIiAvPgotCQk8dHlwZSBuYW1lPSJIVFRQVXJsUmVwbGFjZW1lbnQiIC8+Ci0JCTx0eXBlIG5hbWU9IkhUVFBCaW5kaW5nIiAvPgotCTwvcGFja2FnZT4KLS0tPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2dyYWJqYXJzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvZ3JhYmphcnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDZlZGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvZ3JhYmphcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0iY29weUphcnMiIGJhc2VkaXI9Ii4iPgotCi0JPHByb3BlcnR5IG5hbWU9InBsdWdpbk5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIvPgotCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iIi8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNvcHlKYXJzIiBpZj0iZG93bmxvYWRQYXRoIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjb3B5SmFyczIiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNvcHlKYXJzMiIgaWY9InBsdWdpbnNQYXRoIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjb3B5SmFyczMiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY29weUphcnMzIiBpZj0icGx1Z2luTmFtZSI+Ci0JCTxjb3B5IHRvZGlyPSIke3BsdWdpbnNQYXRofS8ke3BsdWdpbk5hbWV9JHt2ZXJzaW9ufS9saWIiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7ZG93bmxvYWRQYXRofS8ke3BsdWdpbk5hbWV9JHt2ZXJzaW9ufSI+Ci0JCQkJPGZpbGVuYW1lIG5hbWU9IiouamFyIi8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvY29weT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNsZWFudXBKYXJzIiBpZj0icGx1Z2luc1BhdGgiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImNsZWFudXBKYXJzMiIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbnVwSmFyczIiIGlmPSJwbHVnaW5OYW1lIj4KLQkJPGRlbGV0ZT4KLQkJCTxmaWxlc2V0IGRpcj0iJHtwbHVnaW5zUGF0aH0vJHtwbHVnaW5OYW1lfSR7dmVyc2lvbn0vbGliIj4KLQkJCQk8ZmlsZW5hbWUgbmFtZT0iKi5qYXIiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvbGliLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2xpYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzkyZjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvbGliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0qLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDZjNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IFdTREwgTW9kZWwKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KLV9FUlJPUl9JTlZBTElEX1dTREwgPSBUaGUgaW5wdXQgc291cmNlIGlzIG5vdCBhIHZhbGlkIFdTREwgZG9jdW1lbnQuCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwZjJhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW4kSW1wbGVtZW50YXRpb24iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzZGwuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGliL3FuYW1lLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxpYi93c2RsNGouamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5kZXBlbmRlbmN5Y2hlY2tlciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UueHNkIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZGVwZW5kZW5jeWNoZWNrZXIucmVxdWlyZWRGaWxlcyI+Ci0gICAgICA8cmVxdWlyZWRGaWxlCi0gICAgICAgICAgICBwbHVnaW5SZWxhdGl2ZVBhdGg9ImxpYi9xbmFtZS5qYXIiCi0gICAgICAgICAgICBsb2NhdGlvblVSTD0iaHR0cDovL3ByZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC93c2RsNGovd3NkbDRqLWJpbi0xLjQuemlwP2Rvd25sb2FkIi8+Ci0gICAgICA8cmVxdWlyZWRGaWxlCi0gICAgICAgICAgICBwbHVnaW5SZWxhdGl2ZVBhdGg9ImxpYi93c2RsNGouamFyIgotICAgICAgICAgICAgbG9jYXRpb25VUkw9Imh0dHA6Ly9wcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvd3NkbDRqL3dzZGw0ai1iaW4tMS40LnppcD9kb3dubG9hZCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzIiBuYW1lPSJXU0RMIEV4dGVuc2liaWxpdHkgRWxlbWVudCBGYWN0b3JpZXMiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmlibS5jb20vd3NkbC8yMDAzL1dTREwiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgICAgPHBhcnNlcgotICAgICAgICAgICAgdHlwZT0id3NkbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsIj4KLSAgICAgIDwvcGFyc2VyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93c2RsLzIwMDMvSFRUUCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzZGwuZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3JpZXMiPgotICAgICA8ZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5Ci0gICAgIAluYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCi0gICAgIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWwuSFRUUEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSIvPiAgCi0gIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd3NkbC8yMDAzL01JTUUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLmV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzIj4KLSAgICAgPGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeQotICAgICAJbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIgotICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsLk1JTUVFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkiLz4gIAotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dzZGwvMjAwMy9TT0FQIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC5leHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcmllcyI+Ci0gICAgIDxleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkKLSAgICAgCW5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5Ii8+ICAKLSAgPC9leHRlbnNpb24+Ci08IS0tCi0gIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51cmlyZXNvbHZlci5jYXRhbG9nQ29udHJpYnV0b3IiPgotICAgICA8Y2F0YWxvZ0NvbnRyaWJ1dG9yIGNhdGFsb2dJZD0iZGVmYXVsdCI+Ci0gICAgICAgPG1hcHBpbmdJbmZvIGtleT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHVyaT0ieHNkL3dzZGwueHNkIi8+Ci0gICAgICAgPG1hcHBpbmdJbmZvIGtleT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgdXJpPSJ4c2Qvc29hcC54c2QiLz4KLSAgICAgICA8bWFwcGluZ0luZm8ga2V5PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB1cmk9InhzZC9odHRwLnhzZCIvPiAgICAgICAKLSAgICAgICA8bWFwcGluZ0luZm8ga2V5PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiB1cmk9InhzZC93c2RsLW1pbWUueHNkIi8+ICAgICAgCi0gICAgICAgPG1hcHBpbmdJbmZvIGtleT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHVyaT0ieHNkL3NvYXBlbmMueHNkIi8+Ci0gICAgIDwvY2F0YWxvZ0NvbnRyaWJ1dG9yPgotICA8L2V4dGVuc2lvbj4KLSAgLS0+Ci0KLSAgPCEtLSBkZWZpbmUgYSB3c2RsIGNvbnRlbnQgdHlwZSAtLT4KLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotICAgICAgICAgPGNvbnRlbnQtdHlwZQotICAgICAgICAgICAgICAgcHJpb3JpdHk9ImhpZ2giCi0gICAgICAgICAgICAgICBuYW1lPSJXU0RMIENvbnRlbnQgVHlwZSIKLSAgICAgICAgICAgICAgIGlkPSJ3c2Rsc291cmNlIgotICAgICAgICAgICAgICAgYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJICAgZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCIKLQkJCSAgIGZpbGUtZXh0ZW5zaW9ucz0id3NkbCIvPgotICAgPC9leHRlbnNpb24+Ci0gIAotICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvSFRUUC5nZW5tb2RlbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL0hUVFAuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDVmZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvSFRUUC5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/Pg0KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIg0KLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIg0KLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmcuaHR0cC9zcmMiDQotICAgIGVkaXREaXJlY3Rvcnk9Ii9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmcuaHR0cC5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLmh0dHAuZWRpdG9yL3NyYyINCi0gICAgbW9kZWxQbHVnaW5JRD0iY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLmh0dHAiIG1vZGVsTmFtZT0iSFRUUCIgZWRpdFBsdWdpbkNsYXNzPSIiDQotICAgIGVkaXRvclBsdWdpbkNsYXNzPSIiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vLi4vb3JnLmVjbGlwc2UueHNkL3NyYy9tb2RlbC9YU0QuZ2VubW9kZWwjLy94c2QiPg0KLSAgPGZvcmVpZ25Nb2RlbD4uLlxyb3NlXGh0dHAubWRsPC9mb3JlaWduTW9kZWw+DQotICA8Zm9yZWlnbk1vZGVsPlZBQkFTRV9QTFVHSU5TX1BBVEg8L2ZvcmVpZ25Nb2RlbD4NCi0gIDxmb3JlaWduTW9kZWw+Li4vLi4vLi48L2ZvcmVpZ25Nb2RlbD4NCi0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IldTREwiIGJhc2VQYWNrYWdlPSJjb20uaWJtLmV0b29scyIgZWNvcmVQYWNrYWdlPSJ3c2RsLmVjb3JlIy8iPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9RTmFtZSIvPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9PcGVyYXRpb25UeXBlIi8+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL0RPTUVsZW1lbnQiLz4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vV1NETEV4Y2VwdGlvbiIvPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9ET01Eb2N1bWVudCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZG9jdW1lbnRhdGlvbkVsZW1lbnQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1dTRExFbGVtZW50L2VsZW1lbnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L2dldEVuY2xvc2luZ0RlZmluaXRpb24iLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L3NldEVuY2xvc2luZ0RlZmluaXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9zZXRFbmNsb3NpbmdEZWZpbml0aW9uL2RlZmluaXRpb24iLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1BvcnRUeXBlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3FOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9yZXNvdXJjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BvcnRUeXBlL2VPcGVyYXRpb25zIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL09wZXJhdGlvbiI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vc3R5bGUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9yZXNvdXJjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lSW5wdXQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZU91dHB1dCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lRmF1bHRzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZVBhcmFtZXRlck9yZGVyaW5nIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL01lc3NhZ2UiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL2VQYXJ0cyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9QYXJ0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC9lbGVtZW50TmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC90eXBlTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUGFydC90eXBlRGVmaW5pdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUGFydC9lbGVtZW50RGVjbGFyYXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZU1lc3NhZ2UiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZyI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3FOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3VuZGVmaW5lZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy9wcm94eSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy9yZXNvdXJjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZy9lUG9ydFR5cGUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL2VCaW5kaW5nT3BlcmF0aW9ucyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lT3BlcmF0aW9uIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ0lucHV0Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ091dHB1dCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdGYXVsdHMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vU2VydmljZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3FOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3VuZGVmaW5lZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS9wcm94eSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS9yZXNvdXJjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1NlcnZpY2UvZVBvcnRzIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1BvcnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Qb3J0L2VCaW5kaW5nIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50L3JlcXVpcmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudC9lbGVtZW50VHlwZSIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vdGFyZ2V0TmFtZXNwYWNlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2xvY2F0aW9uIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3FOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VuY29kaW5nIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lTWVzc2FnZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VQb3J0VHlwZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VCaW5kaW5ncyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVNlcnZpY2VzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lTmFtZXNwYWNlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVR5cGVzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lSW1wb3J0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9nZXREb2N1bWVudCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9zZXREb2N1bWVudCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vc2V0RG9jdW1lbnQvZG9jdW1lbnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0ltcG9ydCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9JbXBvcnQvbmFtZXNwYWNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9JbXBvcnQvbG9jYXRpb25VUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lRGVmaW5pdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2VTY2hlbWEiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0ltcG9ydC9nZXRTY2hlbWEiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0ltcG9ydC9zZXRTY2hlbWEiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JbXBvcnQvc2V0U2NoZW1hL3NjaGVtYSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2dldEV4dGVuc2liaWxpdHlFbGVtZW50cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9hZGRFeHRlbnNpYmlsaXR5RWxlbWVudC9leHRFbGVtZW50Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JbnB1dCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vT3V0cHV0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9GYXVsdCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvZUlucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvZ2V0SW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9zZXRJbnB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9zZXRJbnB1dC9pbnB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZU91dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9nZXRPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvc2V0T3V0cHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9zZXRPdXRwdXQvb3V0cHV0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9lRmF1bHQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9nZXRGYXVsdCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L3NldEZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L3NldEZhdWx0L2ZhdWx0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9OYW1lc3BhY2UiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTmFtZXNwYWNlL1VSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTmFtZXNwYWNlL3ByZWZpeCIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2FkZE9wZXJhdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9hZGRPcGVyYXRpb24vb3BlcmF0aW9uIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vbmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL2lucHV0TmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL291dHB1dE5hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9ucyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vYWRkRmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2FkZEZhdWx0L2ZhdWx0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0RmF1bHQvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0RmF1bHRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldFBhcmFtZXRlck9yZGVyaW5nIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldFBhcmFtZXRlck9yZGVyaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZy9wYXJhbWV0ZXJPcmRlciIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0SW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0SW5wdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldElucHV0L2lucHV0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0T3V0cHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRPdXRwdXQvb3V0cHV0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSW5wdXQiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUlucHV0L2dldE1lc3NhZ2UiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lJbnB1dC9zZXRNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUlucHV0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU91dHB1dCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3V0cHV0L2dldE1lc3NhZ2UiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPdXRwdXQvc2V0TWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPdXRwdXQvc2V0TWVzc2FnZS9tZXNzYWdlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRmF1bHQiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L2dldE1lc3NhZ2UiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lGYXVsdC9zZXRNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvYWRkUGFydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2FkZFBhcnQvcGFydCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRQYXJ0L25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRQYXJ0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0T3JkZXJlZFBhcnRzIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0T3JkZXJlZFBhcnRzL3BhcnRPcmRlciIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBhcnQiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBhcnQvc2V0RXh0ZW5zaW9uQXR0cmlidXRlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBhcnQvc2V0RXh0ZW5zaW9uQXR0cmlidXRlL25hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBhcnQvc2V0RXh0ZW5zaW9uQXR0cmlidXRlL3ZhbHVlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBhcnQvZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JU2VydmljZSI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9hZGRQb3J0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvYWRkUG9ydC9wb3J0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvZ2V0UG9ydHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0L25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQb3J0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0L2dldEJpbmRpbmciLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0L3NldEJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nL2JpbmRpbmciLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2FkZEJpbmRpbmdPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9hZGRCaW5kaW5nT3BlcmF0aW9uL2JpbmRpbmdPcGVyYXRpb24iLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9uYW1lIi8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vaW5wdXROYW1lIi8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vb3V0cHV0TmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb25zIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRQb3J0VHlwZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvc2V0UG9ydFR5cGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9zZXRQb3J0VHlwZS9wb3J0VHlwZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24iPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vYWRkQmluZGluZ0ZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vYWRkQmluZGluZ0ZhdWx0L2JpbmRpbmdGYXVsdCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdC9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0T3BlcmF0aW9uIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRPcGVyYXRpb24vb3BlcmF0aW9uIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0lucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nSW5wdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nSW5wdXQvYmluZGluZ0lucHV0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ091dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ091dHB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQvYmluZGluZ091dHB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdJbnB1dCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPdXRwdXQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nRmF1bHQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lFeHRlbnNpYmlsaXR5RWxlbWVudCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24iPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkQmluZGluZyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmcvYmluZGluZyIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEltcG9ydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEltcG9ydC9pbXBvcnREZWYiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZS9tZXNzYWdlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlL3ByZWZpeCIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGROYW1lc3BhY2UvbmFtZXNwYWNlVVJJIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkUG9ydFR5cGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRQb3J0VHlwZS9wb3J0VHlwZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFNlcnZpY2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRTZXJ2aWNlL3NlcnZpY2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nRmF1bHQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ091dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ09wZXJhdGlvbiIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlRmF1bHQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUltcG9ydCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlSW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU1lc3NhZ2UiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU9wZXJhdGlvbiIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlT3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVQYXJ0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVQb3J0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVQb3J0VHlwZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlU2VydmljZSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEJpbmRpbmcvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEJpbmRpbmdzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRJbXBvcnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRJbXBvcnRzLjEiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRJbXBvcnRzLjEvbmFtZXNwYWNlVVJJIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2VzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2UvcHJlZml4Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UG9ydFR5cGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UG9ydFR5cGVzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQcmVmaXgiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQcmVmaXgvbmFtZXNwYWNlVVJJIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2VzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRFeHRlbnNpb25SZWdpc3RyeSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RXh0ZW5zaW9uUmVnaXN0cnkiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRFeHRlbnNpb25SZWdpc3RyeS9leHRlbnNpb25SZWdpc3RyeSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldERvY3VtZW50QmFzZVVSSSIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RG9jdW1lbnRCYXNlVVJJIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RG9jdW1lbnRCYXNlVVJJL2RvY3VtZW50QmFzZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVR5cGVzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVTZXJ2aWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlU2VydmljZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlQmluZGluZyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZUJpbmRpbmcvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlUG9ydFR5cGUvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZU1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVNZXNzYWdlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRUeXBlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0VHlwZXMiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRUeXBlcy90eXBlcyIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUltcG9ydCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUxpc3QiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lNYXAiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lVUkwiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lFeHRlbnNpb25SZWdpc3RyeSIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vVHlwZXMiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vVHlwZXMvZ2V0U2NoZW1hcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vVHlwZXMvZ2V0U2NoZW1hcy4xIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vVHlwZXMvZ2V0U2NoZW1hcy4xL25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUl0ZXJhdG9yIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JVHlwZXMiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQvcGFyZW50Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQvY2hpbGRyZW4iLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50L3NjaGVtYSIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZS9lTWVzc2FnZSIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICA8L2dlblBhY2thZ2VzPg0KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iSFRUUCIgYmFzZVBhY2thZ2U9ImNvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZyIgZWNvcmVQYWNrYWdlPSJodHRwLmVjb3JlIy8iPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSFRUUEJpbmRpbmciPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBodHRwLmVjb3JlIy8vSFRUUEJpbmRpbmcvdmVyYiIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9IVFRQT3BlcmF0aW9uIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaHR0cC5lY29yZSMvL0hUVFBPcGVyYXRpb24vbG9jYXRpb25VUkkiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSFRUUFVybFJlcGxhY2VtZW50Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9IVFRQVXJsRW5jb2RlZCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSFRUUEFkZHJlc3MiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBodHRwLmVjb3JlIy8vSFRUUEFkZHJlc3MvbG9jYXRpb25VUkkiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSUhUVFBBZGRyZXNzIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9JSFRUUEJpbmRpbmciLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaHR0cC5lY29yZSMvL0lIVFRQT3BlcmF0aW9uIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9JSFRUUFVybEVuY29kZWQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaHR0cC5lY29yZSMvL0lIVFRQVXJsUmVwbGFjZW1lbnQiLz4NCi0gIDwvZ2VuUGFja2FnZXM+DQotPC9nZW5tb2RlbDpHZW5Nb2RlbD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9NSU1FLmdlbm1vZGVsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvTUlNRS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmNmM4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9NSU1FLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+DQotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiDQotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiDQotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5taW1lL3NyYyINCi0gICAgZWRpdERpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5taW1lLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmcubWltZS5lZGl0b3Ivc3JjIg0KLSAgICBtb2RlbFBsdWdpbklEPSJjb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmcubWltZSIgbW9kZWxOYW1lPSJNSU1FIiBlZGl0UGx1Z2luQ2xhc3M9IiINCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9IiIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjL21vZGVsL1hTRC5nZW5tb2RlbCMvL3hzZCI+DQotICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2VcbWltZS5tZGw8L2ZvcmVpZ25Nb2RlbD4NCi0gIDxmb3JlaWduTW9kZWw+VkFCQVNFX1BMVUdJTlNfUEFUSDwvZm9yZWlnbk1vZGVsPg0KLSAgPGZvcmVpZ25Nb2RlbD4uLi8uLi8uLjwvZm9yZWlnbk1vZGVsPg0KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iTUlNRSIgYmFzZVBhY2thZ2U9ImNvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZyIgZWNvcmVQYWNrYWdlPSJtaW1lLmVjb3JlIy8iPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1pbWUuZWNvcmUjLy9MaXN0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1pbWUuZWNvcmUjLy9NSU1FQ29udGVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1pbWUuZWNvcmUjLy9NSU1FQ29udGVudC90eXBlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1pbWUuZWNvcmUjLy9NSU1FQ29udGVudC9lUGFydCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRUNvbnRlbnQvc2V0UGFydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ibWltZS5lY29yZSMvL01JTUVDb250ZW50L3NldFBhcnQvcGFydCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibWltZS5lY29yZSMvL01JTUVDb250ZW50L2dldFBhcnQiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtaW1lLmVjb3JlIy8vTUlNRVBhcnQiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRVBhcnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9Im1pbWUuZWNvcmUjLy9NSU1FUGFydC9hZGRFeHRlbnNpYmlsaXR5RWxlbWVudC9leHRlbnNpYmlsaXR5RWxlbWVudCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibWltZS5lY29yZSMvL01JTUVQYXJ0L2dldEV4dGVuc2liaWxpdHlFbGVtZW50cyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1pbWUuZWNvcmUjLy9NSU1FTXVsdGlwYXJ0UmVsYXRlZCI+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtaW1lLmVjb3JlIy8vTUlNRU11bHRpcGFydFJlbGF0ZWQvZU1JTUVQYXJ0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im1pbWUuZWNvcmUjLy9NSU1FTXVsdGlwYXJ0UmVsYXRlZC9hZGRNSU1FUGFydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ibWltZS5lY29yZSMvL01JTUVNdWx0aXBhcnRSZWxhdGVkL2FkZE1JTUVQYXJ0L21pbWVQYXJ0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRU11bHRpcGFydFJlbGF0ZWQvZ2V0TUlNRVBhcnRzIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibWltZS5lY29yZSMvL01JTUVNaW1lWG1sIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbWltZS5lY29yZSMvL01JTUVNaW1lWG1sL2VQYXJ0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im1pbWUuZWNvcmUjLy9NSU1FTWltZVhtbC9zZXRQYXJ0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJtaW1lLmVjb3JlIy8vTUlNRU1pbWVYbWwvc2V0UGFydC9wYXJ0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRU1pbWVYbWwvZ2V0UGFydCIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1pbWUuZWNvcmUjLy9JTUlNRVBhcnQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibWltZS5lY29yZSMvL0lNSU1FTXVsdGlwYXJ0UmVsYXRlZCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtaW1lLmVjb3JlIy8vSU1JTUVDb250ZW50Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1pbWUuZWNvcmUjLy9JTUlNRU1pbWVYbWwiLz4NCi0gIDwvZ2VuUGFja2FnZXM+DQotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJXU0RMIiBiYXNlUGFja2FnZT0iY29tLmlibS5ldG9vbHMiIGVjb3JlUGFja2FnZT0id3NkbC5lY29yZSMvIj4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vUU5hbWUiLz4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vT3BlcmF0aW9uVHlwZSIvPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9ET01FbGVtZW50Ii8+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL1dTRExFeGNlcHRpb24iLz4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vRE9NRG9jdW1lbnQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1dTRExFbGVtZW50L2RvY3VtZW50YXRpb25FbGVtZW50Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9lbGVtZW50Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9nZXRFbmNsb3NpbmdEZWZpbml0aW9uIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9zZXRFbmNsb3NpbmdEZWZpbml0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbi9kZWZpbml0aW9uIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0VHlwZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9wcm94eSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9lT3BlcmF0aW9ucyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PcGVyYXRpb24iPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3N0eWxlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3VuZGVmaW5lZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUlucHV0Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VPdXRwdXQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUZhdWx0cyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VQYXJhbWV0ZXJPcmRlcmluZyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9lUGFydHMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUGFydCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudE5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvdHlwZU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvdHlwZURlZmluaXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudERlY2xhcmF0aW9uIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L2VNZXNzYWdlIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmciPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmcvZVBvcnRUeXBlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZy9lQmluZGluZ09wZXJhdGlvbnMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZU9wZXJhdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nRmF1bHRzIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1NlcnZpY2UiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL2VQb3J0cyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydC9lQmluZGluZyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudC9yZXF1aXJlZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQvZWxlbWVudFR5cGUiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbiI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3RhcmdldE5hbWVzcGFjZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9sb2NhdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lbmNvZGluZyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZU1lc3NhZ2VzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lUG9ydFR5cGVzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lQmluZGluZ3MiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VTZXJ2aWNlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZU5hbWVzcGFjZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VUeXBlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZUltcG9ydHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vZ2V0RG9jdW1lbnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vc2V0RG9jdW1lbnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3NldERvY3VtZW50L2RvY3VtZW50Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JbXBvcnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2xvY2F0aW9uVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9JbXBvcnQvZURlZmluaXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lU2NoZW1hIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JbXBvcnQvZ2V0U2NoZW1hIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JbXBvcnQvc2V0U2NoZW1hIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYS9zY2hlbWEiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9lRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQvZXh0RWxlbWVudCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSW5wdXQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL091dHB1dCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRmF1bHQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2VJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2dldElucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvc2V0SW5wdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvc2V0SW5wdXQvaW5wdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L2VPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZ2V0T3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvc2V0T3V0cHV0L291dHB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvZUZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvZ2V0RmF1bHQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9zZXRGYXVsdCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9zZXRGYXVsdC9mYXVsdCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTmFtZXNwYWNlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL05hbWVzcGFjZS9VUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL05hbWVzcGFjZS9wcmVmaXgiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9hZGRPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uL29wZXJhdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9pbnB1dE5hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9vdXRwdXROYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbnMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbiI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2FkZEZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdC9mYXVsdCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0RmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0L25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRQYXJhbWV0ZXJPcmRlcmluZyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0UGFyYW1ldGVyT3JkZXJpbmcvcGFyYW1ldGVyT3JkZXIiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldElucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldElucHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dC9pbnB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0T3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldE91dHB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0T3V0cHV0L291dHB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUlucHV0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lJbnB1dC9nZXRNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvc2V0TWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lJbnB1dC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lPdXRwdXQiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9nZXRNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUZhdWx0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lGYXVsdC9nZXRNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvc2V0TWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lGYXVsdC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lNZXNzYWdlIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2FkZFBhcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0L3BhcnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRQYXJ0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydC9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cy9wYXJ0T3JkZXIiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQYXJ0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS9uYW1lIi8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS92YWx1ZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvYWRkUG9ydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQvcG9ydCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvZ2V0UG9ydC9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUG9ydCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9nZXRCaW5kaW5nIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnQvc2V0QmluZGluZy9iaW5kaW5nIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZyI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9hZGRCaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbi9iaW5kaW5nT3BlcmF0aW9uIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vbmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL2lucHV0TmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL291dHB1dE5hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9ucyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0UG9ydFR5cGUiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvc2V0UG9ydFR5cGUvcG9ydFR5cGUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdC9iaW5kaW5nRmF1bHQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldE9wZXJhdGlvbiIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0T3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0T3BlcmF0aW9uL29wZXJhdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0L2JpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nT3V0cHV0L2JpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nSW5wdXQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3V0cHV0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0ZhdWx0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRCaW5kaW5nL2JpbmRpbmciLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQvaW1wb3J0RGVmIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE1lc3NhZ2UvbWVzc2FnZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZS9wcmVmaXgiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlL25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkUG9ydFR5cGUvcG9ydFR5cGUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRTZXJ2aWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZS9zZXJ2aWNlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ0ZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nSW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmciLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVJbXBvcnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUlucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU91dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUGFydCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUG9ydCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUG9ydFR5cGUiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVNlcnZpY2UiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5ncyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xL25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlL3ByZWZpeCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UG9ydFR5cGUvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4L25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldEV4dGVuc2lvblJlZ2lzdHJ5Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RXh0ZW5zaW9uUmVnaXN0cnkvZXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXREb2N1bWVudEJhc2VVUkkiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSS9kb2N1bWVudEJhc2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVUeXBlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlU2VydmljZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZUJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVBvcnRUeXBlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0VHlwZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldFR5cGVzIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0VHlwZXMvdHlwZXMiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJbXBvcnQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lMaXN0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTWFwIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JVVJMIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1R5cGVzIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMuMSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMuMS9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJdGVyYXRvciIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVR5cGVzIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50L3BhcmVudCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50L2NoaWxkcmVuIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC9zY2hlbWEiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlL25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UvZU1lc3NhZ2UiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgPC9nZW5QYWNrYWdlcz4NCi08L2dlbm1vZGVsOkdlbk1vZGVsPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL1NPQVAuZ2VubW9kZWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9TT0FQLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODY0ZGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL1NPQVAuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4NCi08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCINCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSINCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLnNvYXAvc3JjIg0KLSAgICBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLnNvYXAuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5zb2FwLmVkaXRvci9zcmMiDQotICAgIG1vZGVsUGx1Z2luSUQ9ImNvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5zb2FwIiBtb2RlbE5hbWU9IlNPQVAiIGVkaXRQbHVnaW5DbGFzcz0iIg0KLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0iIiB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMvbW9kZWwvWFNELmdlbm1vZGVsIy8veHNkIj4NCi0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxzb2FwLm1kbDwvZm9yZWlnbk1vZGVsPg0KLSAgPGZvcmVpZ25Nb2RlbD5WQUJBU0VfUExVR0lOU19QQVRIPC9mb3JlaWduTW9kZWw+DQotICA8Zm9yZWlnbk1vZGVsPi4uLy4uLy4uPC9mb3JlaWduTW9kZWw+DQotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJTT0FQIiBiYXNlUGFja2FnZT0iY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nIiBlY29yZVBhY2thZ2U9InNvYXAuZWNvcmUjLyI+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ic29hcC5lY29yZSMvL0lTdHJpbmciLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic29hcC5lY29yZSMvL1NPQVBCaW5kaW5nIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQQmluZGluZy90cmFuc3BvcnRVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQQmluZGluZy9zdHlsZSIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQQm9keSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEJvZHkvdXNlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEJvZHkvbmFtZXNwYWNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEJvZHkvZW5jb2RpbmdTdHlsZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNvYXAuZWNvcmUjLy9TT0FQQm9keS9wYXJ0cyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQSGVhZGVyQmFzZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEhlYWRlckJhc2UvdXNlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEhlYWRlckJhc2UvbmFtZXNwYWNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEhlYWRlckJhc2UvZW5jb2RpbmdTdHlsZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNvYXAuZWNvcmUjLy9TT0FQSGVhZGVyQmFzZS9tZXNzYWdlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBzb2FwLmVjb3JlIy8vU09BUEhlYWRlckJhc2UvcGFydCIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQRmF1bHQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBGYXVsdC91c2UiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQRmF1bHQvbmFtZXNwYWNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEZhdWx0L2VuY29kaW5nU3R5bGVzIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic29hcC5lY29yZSMvL1NPQVBPcGVyYXRpb24iPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBPcGVyYXRpb24vc29hcEFjdGlvblVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBPcGVyYXRpb24vc3R5bGUiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzb2FwLmVjb3JlIy8vU09BUEFkZHJlc3MiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBBZGRyZXNzL2xvY2F0aW9uVVJJIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic29hcC5lY29yZSMvL1NPQVBIZWFkZXJGYXVsdCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzb2FwLmVjb3JlIy8vU09BUEhlYWRlciI+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNvYXAuZWNvcmUjLy9TT0FQSGVhZGVyL2hlYWRlckZhdWx0cyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICA8L2dlblBhY2thZ2VzPg0KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iV1NETCIgYmFzZVBhY2thZ2U9ImNvbS5pYm0uZXRvb2xzIiBlY29yZVBhY2thZ2U9IndzZGwuZWNvcmUjLyI+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL1FOYW1lIi8+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL09wZXJhdGlvblR5cGUiLz4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vRE9NRWxlbWVudCIvPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9XU0RMRXhjZXB0aW9uIi8+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL0RPTURvY3VtZW50Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZG9jdW1lbnRhdGlvbkVsZW1lbnQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9lbGVtZW50Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9nZXRFbmNsb3NpbmdEZWZpbml0aW9uIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9zZXRFbmNsb3NpbmdEZWZpbml0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbi9kZWZpbml0aW9uIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0VHlwZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9wcm94eSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9lT3BlcmF0aW9ucyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PcGVyYXRpb24iPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9zdHlsZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3VuZGVmaW5lZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9wcm94eSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9yZXNvdXJjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VJbnB1dCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VPdXRwdXQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lRmF1bHRzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VQYXJhbWV0ZXJPcmRlcmluZyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3FOYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9yZXNvdXJjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9lUGFydHMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUGFydCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC9lbGVtZW50TmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvdHlwZU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L3R5cGVEZWZpbml0aW9uIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUGFydC9lbGVtZW50RGVjbGFyYXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L2VNZXNzYWdlIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmciPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3VuZGVmaW5lZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZy9lUG9ydFR5cGUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmcvZUJpbmRpbmdPcGVyYXRpb25zIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24iPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZU9wZXJhdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ0lucHV0Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nT3V0cHV0Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nRmF1bHRzIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1NlcnZpY2UiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3VuZGVmaW5lZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL2VQb3J0cyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0L25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Qb3J0L2VCaW5kaW5nIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudC9yZXF1aXJlZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50L2VsZW1lbnRUeXBlIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0RlZmluaXRpb24iPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vdGFyZ2V0TmFtZXNwYWNlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9sb2NhdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VuY29kaW5nIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VNZXNzYWdlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lUG9ydFR5cGVzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VCaW5kaW5ncyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lU2VydmljZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZU5hbWVzcGFjZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVR5cGVzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VJbXBvcnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2dldERvY3VtZW50Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3NldERvY3VtZW50Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9zZXREb2N1bWVudC9kb2N1bWVudCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSW1wb3J0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9JbXBvcnQvbmFtZXNwYWNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2xvY2F0aW9uVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2VEZWZpbml0aW9uIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2VTY2hlbWEiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0ltcG9ydC9nZXRTY2hlbWEiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0ltcG9ydC9zZXRTY2hlbWEiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JbXBvcnQvc2V0U2NoZW1hL3NjaGVtYSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvZUV4dGVuc2liaWxpdHlFbGVtZW50cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50L2V4dEVsZW1lbnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lucHV0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PdXRwdXQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0ZhdWx0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2VJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2dldElucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvc2V0SW5wdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvc2V0SW5wdXQvaW5wdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZU91dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9nZXRPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvc2V0T3V0cHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9zZXRPdXRwdXQvb3V0cHV0Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L2VGYXVsdCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L2dldEZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvc2V0RmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvc2V0RmF1bHQvZmF1bHQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL05hbWVzcGFjZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTmFtZXNwYWNlL1VSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL05hbWVzcGFjZS9wcmVmaXgiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9hZGRPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uL29wZXJhdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9pbnB1dE5hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9vdXRwdXROYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbnMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbiI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2FkZEZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdC9mYXVsdCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0RmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0L25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRQYXJhbWV0ZXJPcmRlcmluZyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0UGFyYW1ldGVyT3JkZXJpbmcvcGFyYW1ldGVyT3JkZXIiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldElucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldElucHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dC9pbnB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0T3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldE91dHB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0T3V0cHV0L291dHB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUlucHV0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lJbnB1dC9nZXRNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvc2V0TWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lJbnB1dC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lPdXRwdXQiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9nZXRNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUZhdWx0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lGYXVsdC9nZXRNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvc2V0TWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lGYXVsdC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lNZXNzYWdlIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2FkZFBhcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0L3BhcnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRQYXJ0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydC9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cy9wYXJ0T3JkZXIiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQYXJ0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS9uYW1lIi8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS92YWx1ZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvYWRkUG9ydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQvcG9ydCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvZ2V0UG9ydC9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUG9ydCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9nZXRCaW5kaW5nIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnQvc2V0QmluZGluZy9iaW5kaW5nIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZyI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9hZGRCaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbi9iaW5kaW5nT3BlcmF0aW9uIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vbmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL2lucHV0TmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL291dHB1dE5hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9ucyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0UG9ydFR5cGUiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvc2V0UG9ydFR5cGUvcG9ydFR5cGUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdC9iaW5kaW5nRmF1bHQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldE9wZXJhdGlvbiIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0T3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0T3BlcmF0aW9uL29wZXJhdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0L2JpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nT3V0cHV0L2JpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nSW5wdXQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3V0cHV0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0ZhdWx0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRCaW5kaW5nL2JpbmRpbmciLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQvaW1wb3J0RGVmIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE1lc3NhZ2UvbWVzc2FnZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZS9wcmVmaXgiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlL25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkUG9ydFR5cGUvcG9ydFR5cGUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRTZXJ2aWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZS9zZXJ2aWNlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ0ZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nSW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmciLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVJbXBvcnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUlucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU91dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUGFydCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUG9ydCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUG9ydFR5cGUiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVNlcnZpY2UiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5ncyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xL25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlL3ByZWZpeCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UG9ydFR5cGUvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4L25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldEV4dGVuc2lvblJlZ2lzdHJ5Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RXh0ZW5zaW9uUmVnaXN0cnkvZXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXREb2N1bWVudEJhc2VVUkkiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSS9kb2N1bWVudEJhc2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVUeXBlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlU2VydmljZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZUJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVBvcnRUeXBlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0VHlwZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldFR5cGVzIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0VHlwZXMvdHlwZXMiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJbXBvcnQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lMaXN0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTWFwIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JVVJMIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1R5cGVzIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMuMSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMuMS9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJdGVyYXRvciIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVR5cGVzIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC9wYXJlbnQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQvY2hpbGRyZW4iLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQvc2NoZW1hIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UvZU1lc3NhZ2UiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgPC9nZW5QYWNrYWdlcz4NCi08L2dlbm1vZGVsOkdlbk1vZGVsPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL2h0dHAuZWNvcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9odHRwLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWE4NzkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL2h0dHAuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/Pg0KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIg0KLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJodHRwIg0KLSAgICBuc1VSST0iaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9IVFRQIiBuc1ByZWZpeD0iaHR0cCI+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkhUVFBCaW5kaW5nIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50ICMvL0lIVFRQQmluZGluZyI+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJiIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSFRUUE9wZXJhdGlvbiIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JSFRUUE9wZXJhdGlvbiI+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvblVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkhUVFBVcmxSZXBsYWNlbWVudCIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JSFRUUFVybFJlcGxhY2VtZW50Ii8+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkhUVFBVcmxFbmNvZGVkIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50ICMvL0lIVFRQVXJsRW5jb2RlZCIvPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJIVFRQQWRkcmVzcyIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JSFRUUEFkZHJlc3MiPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb25VUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSFRUUEFkZHJlc3MiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklIVFRQQmluZGluZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nIg0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUhUVFBPcGVyYXRpb24iIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uIg0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUhUVFBVcmxFbmNvZGVkIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSFRUUFVybFJlcGxhY2VtZW50IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50Ig0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4NCi08L2Vjb3JlOkVQYWNrYWdlPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL21pbWUuZWNvcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9taW1lLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWZhYTQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL21pbWUuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/Pg0KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIg0KLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtaW1lIg0KLSAgICBuc1VSST0iaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9NSU1FIiBuc1ByZWZpeD0ibWltZSI+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1JTUVDb250ZW50IiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50ICMvL0lNSU1FQ29udGVudCI+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRQYXJ0Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFydCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UGFydCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVBhcnQiIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3NkbC5lY29yZSMvL1BhcnQiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNSU1FUGFydCIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JTUlNRVBhcnQiPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJleHRlbnNpYmlsaXR5RWxlbWVudCIgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2RsLmVjb3JlIy8vSUV4dGVuc2liaWxpdHlFbGVtZW50Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiIGVUeXBlPSIjLy9MaXN0Ii8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTUlNRU11bHRpcGFydFJlbGF0ZWQiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQgIy8vSU1JTUVNdWx0aXBhcnRSZWxhdGVkIj4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZE1JTUVQYXJ0Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWltZVBhcnQiIGVUeXBlPSIjLy9JTUlNRVBhcnQiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1JTUVQYXJ0cyIgZVR5cGU9IiMvL0xpc3QiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVNSU1FUGFydCIgdXBwZXJCb3VuZD0iLTEiDQotICAgICAgICBlVHlwZT0iIy8vTUlNRVBhcnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTUlNRU1pbWVYbWwiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQgIy8vSU1JTUVNaW1lWG1sIj4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldFBhcnQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJ0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQYXJ0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlUGFydCIgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2RsLmVjb3JlIy8vUGFydCIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklNSU1FUGFydCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0Ig0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU1JTUVNdWx0aXBhcnRSZWxhdGVkIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJTUlNRUNvbnRlbnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklNSU1FTWltZVhtbCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIg0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTGlzdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0Ii8+DQotPC9lY29yZTpFUGFja2FnZT4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9zb2FwLmVjb3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvc29hcC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyODNlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC9zb2FwLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4NCi08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCINCi0gIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJzb2FwIg0KLSAgICBuc1VSST0iaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9TT0FQIiBuc1ByZWZpeD0ic29hcCI+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBCaW5kaW5nIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRyYW5zcG9ydFVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3R5bGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQQm9keSIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5jb2RpbmdTdHlsZXMiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL0lTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcnRzIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3NkbC5lY29yZSMvL1BhcnQiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQSGVhZGVyQmFzZSIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5jb2RpbmdTdHlsZXMiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL0lTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1lc3NhZ2UiIGxvd2VyQm91bmQ9IjEiDQotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzZGwuZWNvcmUjLy9NZXNzYWdlIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJ0IiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzZGwuZWNvcmUjLy9QYXJ0Ii8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU09BUEZhdWx0IiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZXNwYWNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmNvZGluZ1N0eWxlcyIgdXBwZXJCb3VuZD0iLTEiDQotICAgICAgICBlVHlwZT0iIy8vSVN0cmluZyIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBPcGVyYXRpb24iIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcEFjdGlvblVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3R5bGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQQWRkcmVzcyIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvblVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBIZWFkZXJGYXVsdCIgZVN1cGVyVHlwZXM9IiMvL1NPQVBIZWFkZXJCYXNlIi8+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBIZWFkZXIiIGVTdXBlclR5cGVzPSIjLy9TT0FQSGVhZGVyQmFzZSI+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJoZWFkZXJGYXVsdHMiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL1NPQVBIZWFkZXJGYXVsdCIgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJU3RyaW5nIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIvPg0KLTwvZWNvcmU6RVBhY2thZ2U+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvd3NkbC5lY29yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL3dzZGwuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YWQ2YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvbW9kZWwvd3NkbC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDYwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIg0KLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ3c2RsIg0KLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93c2RsLzIwMDMvV1NETCIgbnNQcmVmaXg9IndzZGwiPg0KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgV1NETCBtb2RlbCBjb250YWlucyBjbGFzc2VzIGZvciB0aGUgV2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIExhbmd1YWdlIChXU0RMKS4mI3hEOyYjeEE7JiN4RDsmI3hBO1dTREwgZGVzY3JpYmVzIG5ldHdvcmsgc2VydmljZXMgYXMgc2V0cyBvZiBlbmRwb2ludHMgb3BlcmF0aW5nIG9uIG1lc3NhZ2VzLiBUaGUgb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgYXJlIGRlc2NyaWJlZCBhYnN0cmFjdGx5LCBhbmQgdGhlbiBib3VuZCB0byBhIGNvbmNyZXRlIG5ldHdvcmsgcHJvdG9jb2wgYW5kIG1lc3NhZ2UgZm9ybWF0IHRvIGRlZmluZSBhbiBlbmRwb2ludC4mI3hEOyYjeEE7JiN4RDsmI3hBO1dTREwgZGVzY3JpYmVzIHRoZSBmb3JtYXRzIG9mIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYnkgdGhlIHNlcnZpY2VzLCBhbmQgc3VwcG9ydHMgdGhlIFhNTCBTY2hlbWFzIHNwZWNpZmljYXRpb24gYXMgaXRzIGNhbm9uaWNhbCB0eXBlIHN5c3RlbS4gVGhpcyBwYWNrYWdlIHVzZXMgYW4gWE1MIFNjaGVtYSBJbmZvc2V0IG1vZGVsIHBhY2thZ2UgKHNlZSB0aGUgWFNEIHBhY2thZ2UpIHRvIGRlc2NyaWJlIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdHMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgbW9kZWwgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkaWFncmFtcywgbmFtZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcHRlcnMgaW4gdGhlIFdTREwgMS4xIHNwZWNpZmljYXRpb24gKGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvTk9URS13c2RsLTIwMDEwMzE1KSYjeEQ7JiN4QTstIDIuMSBEZWZpbml0aW9uLCBzaG93cyB0aGUgV1NETCBkZWZpbml0aW9uIGVsZW1lbnQgYW5kIHRoZSBXU0RMIGRvY3VtZW50IHN0cnVjdHVyZSYjeEQ7JiN4QTstIDIuMS4xIE5hbWluZyBhbmQgTGlua2luZywgc2hvd3MgdGhlIG5hbWVzcGFjZSBhbmQgaW1wb3J0IG1lY2hhbmlzbSYjeEQ7JiN4QTstIDIuMS4zIEV4dGVuc2liaWxpdHksIHNob3dzIHRoZSBXU0RMIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtJiN4RDsmI3hBOy0gMi4yIFR5cGVzLCBzaG93cyB0aGUgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gV1NETCYjeEQ7JiN4QTstIDIuMyBNZXNzYWdlcywgMi40IFBvcnRUeXBlcywgMi41IEJpbmRpbmdzIGFuZCAyLjcgU2VydmljZXMsIHNob3cgdGhlIG1ham9yIFdTREwgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9ucy4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBXU0RMIGNsYXNzZXMgZXh0ZW5kIHRoZSBqYXZheC53c2RsIGludGVyZmFjZXMgZGVmaW5lZCBieSBKU1IgMTEwLiBDbGFzc2VzIHdpdGggaW50ZXJmYWNlIGFuZCBkYXRhdHlwZSBzdGVyZW90eXBlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlc2Ugbm9uLU1PRiBpbnRlcmZhY2VzLiIvPg0KLSAgPC9lQW5ub3RhdGlvbnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldTRExFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGxhbmd1YWdlIGVsZW1lbnQuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbiIgZVR5cGU9IiMvL0RlZmluaXRpb24iLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldEVuY2xvc2luZ0RlZmluaXRpb24iPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJkZWZpbml0aW9uIiBlVHlwZT0iIy8vRGVmaW5pdGlvbiIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZG9jdW1lbnRhdGlvbkVsZW1lbnQiIGVUeXBlPSIjLy9ET01FbGVtZW50Ii8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbGVtZW50IiBlVHlwZT0iIy8vRE9NRWxlbWVudCIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvcnRUeXBlIiBlU3VwZXJUeXBlcz0iIy8vV1NETEVsZW1lbnQgIy8vSVBvcnRUeXBlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydFR5cGUgZWxlbWVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4xIGFuZCBhbiBJbnRlcmZhY2UgY29tcG9uZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjIuIEEgcG9ydCB0eXBlIG9yIEludGVyZmFjZSBpcyBhIG5hbWVkIHNldCBvZiBhYnN0cmFjdCBvcGVyYXRpb25zIGFuZCB0aGUgYWJzdHJhY3QgbWVzc2FnZXMgaW52b2x2ZWQuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icU5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5kZWZpbmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJveHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU9wZXJhdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL09wZXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPcGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCAjLy9JT3BlcmF0aW9uIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuIEEgV1NETCBvcGVyYXRpb24gaXMgYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYW4gYWN0aW9uIHN1cHBvcnRlZCBieSBhIHNlcnZpY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3R5bGUiIGVUeXBlPSIjLy9PcGVyYXRpb25UeXBlIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bmRlZmluZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm94eSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlSW5wdXQiIGVUeXBlPSIjLy9JbnB1dCINCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlT3V0cHV0IiBlVHlwZT0iIy8vT3V0cHV0Ig0KLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVGYXVsdHMiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL0ZhdWx0IiBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVBhcmFtZXRlck9yZGVyaW5nIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9QYXJ0Ii8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWVzc2FnZSIgZVN1cGVyVHlwZXM9IiMvL1dTRExFbGVtZW50ICMvL0lNZXNzYWdlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbWVzc2FnZSBlbGVtZW50LiBBIFdTREwgbWVzc2FnZSBpcyBhbiBhYnN0cmFjdCwgdHlwZWQgZGVmaW5pdGlvbiBvZiB0aGUgZGF0YSBiZWluZyBjb21tdW5pY2F0ZWQuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icU5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5kZWZpbmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJveHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVBhcnRzIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9QYXJ0IiBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhcnQiIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCAjLy9JUGFydCI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWxlbWVudE5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZU5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHlwZURlZmluaXRpb24iIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vLi4vb3JnLmVjbGlwc2UueHNkL3NyYy14c2QvbW9kZWwvWFNELmVjb3JlIy8vWFNEVHlwZURlZmluaXRpb24iLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnREZWNsYXJhdGlvbiIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjLXhzZC9tb2RlbC9YU0QuZWNvcmUjLy9YU0RFbGVtZW50RGVjbGFyYXRpb24iLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVNZXNzYWdlIiBlVHlwZT0iIy8vTWVzc2FnZSIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJpbmRpbmciIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JQmluZGluZyI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGJpbmRpbmcgZWxlbWVudC4gQSBiaW5kaW5nIGRlZmluZXMgbWVzc2FnZSBmb3JtYXQgYW5kIHByb3RvY29sIGRldGFpbHMgZm9yIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGRlZmluZWQgYnkgYSBwYXJ0aWN1bGFyIHBvcnRUeXBlLiBUaGVyZSBtYXkgYmUgYW55IG51bWJlciBvZiBiaW5kaW5ncyBmb3IgYSBnaXZlbiBwb3J0VHlwZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJxTmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bmRlZmluZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm94eSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlUG9ydFR5cGUiIGxvd2VyQm91bmQ9IjEiDQotICAgICAgICBlVHlwZT0iIy8vUG9ydFR5cGUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVCaW5kaW5nT3BlcmF0aW9ucyIgdXBwZXJCb3VuZD0iLTEiDQotICAgICAgICBlVHlwZT0iIy8vQmluZGluZ09wZXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCaW5kaW5nT3BlcmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vRXh0ZW5zaWJsZUVsZW1lbnQgIy8vSUJpbmRpbmdPcGVyYXRpb24iPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoaW4gdGhlIGJpbmRpbmcncyBwb3J0VHlwZS4gIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU9wZXJhdGlvbiIgbG93ZXJCb3VuZD0iMSINCi0gICAgICAgIGVUeXBlPSIjLy9PcGVyYXRpb24iLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVCaW5kaW5nSW5wdXQiIGVUeXBlPSIjLy9CaW5kaW5nSW5wdXQiDQotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUJpbmRpbmdPdXRwdXQiIGVUeXBlPSIjLy9CaW5kaW5nT3V0cHV0Ig0KLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVCaW5kaW5nRmF1bHRzIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9CaW5kaW5nRmF1bHQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VydmljZSIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2libGVFbGVtZW50ICMvL0lTZXJ2aWNlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgc2VydmljZSBlbGVtZW50LiBBIHNlcnZpY2UgZ3JvdXBzIGEgc2V0IG9mIHJlbGF0ZWQgcG9ydHMgdG9nZXRoZXIuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icU5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5kZWZpbmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJveHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVBvcnRzIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9Qb3J0IiBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvcnQiIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JUG9ydCI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnQgZWxlbWVudC4gQSBwb3J0IGRlZmluZXMgYW4gaW5kaXZpZHVhbCBlbmRwb2ludCBieSBzcGVjaWZ5aW5nIGEgc2luZ2xlIGFkZHJlc3MgZm9yIGEgYmluZGluZyIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVCaW5kaW5nIiBsb3dlckJvdW5kPSIxIg0KLSAgICAgICAgZVR5cGU9IiMvL0JpbmRpbmciLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbnNpYmlsaXR5RWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL1dTRExFbGVtZW50ICMvL0lFeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gV1NETCBhbGxvd3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcXVpcmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWxlbWVudFR5cGUiIGVUeXBlPSIjLy9RTmFtZSINCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JRGVmaW5pdGlvbiI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIFdTREwgZG9jdW1lbnQuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RG9jdW1lbnQiIGVUeXBlPSIjLy9ET01Eb2N1bWVudCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0RG9jdW1lbnQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJkb2N1bWVudCIgZVR5cGU9IiMvL0RPTURvY3VtZW50Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2F0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJxTmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmNvZGluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU1lc3NhZ2VzIiB1cHBlckJvdW5kPSItMSINCi0gICAgICAgIGVUeXBlPSIjLy9NZXNzYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVBvcnRUeXBlcyIgdXBwZXJCb3VuZD0iLTEiDQotICAgICAgICBlVHlwZT0iIy8vUG9ydFR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlQmluZGluZ3MiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL0JpbmRpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlU2VydmljZXMiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL1NlcnZpY2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlTmFtZXNwYWNlcyIgdXBwZXJCb3VuZD0iLTEiDQotICAgICAgICBlVHlwZT0iIy8vTmFtZXNwYWNlIiBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVR5cGVzIiBlVHlwZT0iIy8vVHlwZXMiDQotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUltcG9ydHMiIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL0ltcG9ydCIgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbXBvcnQiIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCAjLy9JSW1wb3J0Ij4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBXU0RMIGltcG9ydCBlbGVtZW50LiBXU0RMIGFsbG93cyBhc3NvY2lhdGluZyBhIG5hbWVzcGFjZSB3aXRoIGEgZG9jdW1lbnQgbG9jYXRpb24gdXNpbmcgYW4gaW1wb3J0IGVsZW1lbnQuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0U2NoZW1hIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMteHNkL21vZGVsL1hTRC5lY29yZSMvL1hTRFNjaGVtYSIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0U2NoZW1hIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ic2NoZW1hIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMteHNkL21vZGVsL1hTRC5lY29yZSMvL1hTRFNjaGVtYSIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZXNwYWNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvblVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZURlZmluaXRpb24iIGVUeXBlPSIjLy9EZWZpbml0aW9uIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlU2NoZW1hIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMteHNkL21vZGVsL1hTRC5lY29yZSMvL1hTRFNjaGVtYSIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuc2libGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1dTRExFbGVtZW50Ij4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiBXU0RMIGFsbG93cyBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IChyZWZlcnJlZCB0byBoZXJlIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMpIHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvaW50IG9mIGV4dGVuc2liaWxpdHkuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBlVHlwZT0iIy8vSUxpc3QiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZEV4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZXh0RWxlbWVudCIgZVR5cGU9IiMvL0lFeHRlbnNpYmlsaXR5RWxlbWVudCIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW5wdXQiIGVTdXBlclR5cGVzPSIjLy9NZXNzYWdlUmVmZXJlbmNlICMvL1dTRExFbGVtZW50ICMvL0lJbnB1dCI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQuIEFuIGlucHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dHB1dCIgZVN1cGVyVHlwZXM9IiMvL01lc3NhZ2VSZWZlcmVuY2UgIy8vV1NETEVsZW1lbnQgIy8vSU91dHB1dCI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50LiBBbiBvdXRwdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZhdWx0IiBlU3VwZXJUeXBlcz0iIy8vTWVzc2FnZVJlZmVyZW5jZSAjLy9XU0RMRWxlbWVudCAjLy9JRmF1bHQiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50LiBGYXVsdCBlbGVtZW50cyBzcGVjaWZ5IHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgYW55IGVycm9yIG1lc3NhZ2VzIHRoYXQgbWF5IGJlIG91dHB1dCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJpbmRpbmdJbnB1dCIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2libGVFbGVtZW50ICMvL0lCaW5kaW5nSW5wdXQiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uICIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldElucHV0IiBlVHlwZT0iIy8vSUlucHV0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRJbnB1dCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImlucHV0IiBlVHlwZT0iIy8vSUlucHV0Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlSW5wdXQiIGxvd2VyQm91bmQ9IjEiDQotICAgICAgICBlVHlwZT0iIy8vSW5wdXQiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCaW5kaW5nT3V0cHV0IiBlU3VwZXJUeXBlcz0iIy8vRXh0ZW5zaWJsZUVsZW1lbnQgIy8vSUJpbmRpbmdPdXRwdXQiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gb3V0cHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uICIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE91dHB1dCIgZVR5cGU9IiMvL0lPdXRwdXQiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldE91dHB1dCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im91dHB1dCIgZVR5cGU9IiMvL0lPdXRwdXQiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVPdXRwdXQiIGxvd2VyQm91bmQ9IjEiDQotICAgICAgICBlVHlwZT0iIy8vT3V0cHV0Ii8+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmluZGluZ0ZhdWx0IiBlU3VwZXJUeXBlcz0iIy8vRXh0ZW5zaWJsZUVsZW1lbnQgIy8vSUJpbmRpbmdGYXVsdCI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEEgZmF1bHQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBmYXVsdCB3aXRoIHRoZSBzYW1lIG5hbWUuICIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZhdWx0IiBlVHlwZT0iIy8vSUZhdWx0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRGYXVsdCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImZhdWx0IiBlVHlwZT0iIy8vSUZhdWx0Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlRmF1bHQiIGxvd2VyQm91bmQ9IjEiDQotICAgICAgICBlVHlwZT0iIy8vRmF1bHQiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJRTmFtZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlFOYW1lIGNsYXNzLiBBIFFOYW1lIGlzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVzcGFjZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBuYW1lc3BhY2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzcGFjZSBwcmVmaXggdXNlZCBpbiBhIFdTREwgZG9jdW1lbnQuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPcGVyYXRpb25UeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik9ORV9XQVk9MSYjeEQ7JiN4QTtSRVFVRVNUX1JFU1BPTlNFPTImI3hEOyYjeEE7U09MSUNJVF9SRVNQT05TRT0zJiN4RDsmI3hBO05PVElGSUNBVElPTj00Ii8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklQb3J0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuUG9ydFR5cGUiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydFR5cGUgbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkT3BlcmF0aW9uIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ib3BlcmF0aW9uIiBlVHlwZT0iIy8vSU9wZXJhdGlvbiIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0T3BlcmF0aW9uIiBlVHlwZT0iIy8vSU9wZXJhdGlvbiI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iaW5wdXROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im91dHB1dE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE9wZXJhdGlvbnMiIGVUeXBlPSIjLy9JTGlzdCIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklPcGVyYXRpb24iIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLk9wZXJhdGlvbiINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkRmF1bHQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJmYXVsdCIgZVR5cGU9IiMvL0lGYXVsdCIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RmF1bHQiIGVUeXBlPSIjLy9JRmF1bHQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGYXVsdHMiIGVUeXBlPSIjLy9JTWFwIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQYXJhbWV0ZXJPcmRlcmluZyIgZVR5cGU9IiMvL0lMaXN0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRQYXJhbWV0ZXJPcmRlcmluZyI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcmFtZXRlck9yZGVyIiBlVHlwZT0iIy8vSUxpc3QiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldElucHV0IiBlVHlwZT0iIy8vSUlucHV0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRJbnB1dCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImlucHV0IiBlVHlwZT0iIy8vSUlucHV0Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRPdXRwdXQiIGVUeXBlPSIjLy9JT3V0cHV0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRPdXRwdXQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJvdXRwdXQiIGVUeXBlPSIjLy9JT3V0cHV0Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUlucHV0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5JbnB1dCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbnB1dCBub24tTU9GIGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldE1lc3NhZ2UiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJtZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJT3V0cHV0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5PdXRwdXQiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0TWVzc2FnZSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklGYXVsdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuRmF1bHQiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWVzc2FnZSIgZVR5cGU9IiMvL0lNZXNzYWdlIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRNZXNzYWdlIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWVzc2FnZSIgZVR5cGU9IiMvL0lNZXNzYWdlIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU1lc3NhZ2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLk1lc3NhZ2UiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuTWVzc2FnZSBub24tTU9GIGludGVyZmFjZSIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZFBhcnQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJ0IiBlVHlwZT0iIy8vSVBhcnQiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBhcnQiIGVUeXBlPSIjLy9JUGFydCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBhcnRzIiBlVHlwZT0iIy8vSU1hcCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0T3JkZXJlZFBhcnRzIiBlVHlwZT0iIy8vSUxpc3QiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJ0T3JkZXIiIGVUeXBlPSIjLy9JTGlzdCIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklQYXJ0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5QYXJ0Ig0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBhcnQgbm9uLU1PRiBpbnRlcmZhY2UiLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRFeHRlbnNpb25BdHRyaWJ1dGUiIGVFeGNlcHRpb25zPSIjLy9XU0RMRXhjZXB0aW9uIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vUU5hbWUiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIiBlVHlwZT0iIy8vSUl0ZXJhdG9yIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRFeHRlbnNpb25BdHRyaWJ1dGUiIGVUeXBlPSIjLy9RTmFtZSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklTZXJ2aWNlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5TZXJ2aWNlIg0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlNlcnZpY2Ugbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkUG9ydCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBvcnQiIGVUeXBlPSIjLy9JUG9ydCIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UG9ydHMiIGVUeXBlPSIjLy9JTWFwIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQb3J0IiBlVHlwZT0iIy8vSVBvcnQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVBvcnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLlBvcnQiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydCBub24tTU9GIGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5nIiBlVHlwZT0iIy8vSUJpbmRpbmciLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldEJpbmRpbmciPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJiaW5kaW5nIiBlVHlwZT0iIy8vSUJpbmRpbmciLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQmluZGluZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuQmluZGluZyINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nIG5vbi1NT0YgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZEJpbmRpbmdPcGVyYXRpb24iPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJiaW5kaW5nT3BlcmF0aW9uIiBlVHlwZT0iIy8vSUJpbmRpbmdPcGVyYXRpb24iLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEJpbmRpbmdPcGVyYXRpb24iIGVUeXBlPSIjLy9JQmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iaW5wdXROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im91dHB1dE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEJpbmRpbmdPcGVyYXRpb25zIiBlVHlwZT0iIy8vSUxpc3QiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBvcnRUeXBlIiBlVHlwZT0iIy8vSVBvcnRUeXBlIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRQb3J0VHlwZSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBvcnRUeXBlIiBlVHlwZT0iIy8vSVBvcnRUeXBlIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUJpbmRpbmdPcGVyYXRpb24iIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRCaW5kaW5nRmF1bHQiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJiaW5kaW5nRmF1bHQiIGVUeXBlPSIjLy9JQmluZGluZ0ZhdWx0Ii8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5nRmF1bHQiIGVUeXBlPSIjLy9JQmluZGluZ0ZhdWx0Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QmluZGluZ0ZhdWx0cyIgZVR5cGU9IiMvL0lNYXAiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE9wZXJhdGlvbiIgZVR5cGU9IiMvL0lPcGVyYXRpb24iLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldE9wZXJhdGlvbiI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im9wZXJhdGlvbiIgZVR5cGU9IiMvL0lPcGVyYXRpb24iLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEJpbmRpbmdJbnB1dCIgZVR5cGU9IiMvL0lCaW5kaW5nSW5wdXQiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldEJpbmRpbmdJbnB1dCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImJpbmRpbmdJbnB1dCIgZVR5cGU9IiMvL0lCaW5kaW5nSW5wdXQiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEJpbmRpbmdPdXRwdXQiIGVUeXBlPSIjLy9JQmluZGluZ091dHB1dCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0QmluZGluZ091dHB1dCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImJpbmRpbmdPdXRwdXQiIGVUeXBlPSIjLy9JQmluZGluZ091dHB1dCIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklCaW5kaW5nSW5wdXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkJpbmRpbmdJbnB1dCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklCaW5kaW5nT3V0cHV0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0Ig0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklCaW5kaW5nRmF1bHQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLkJpbmRpbmdGYXVsdCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRPTUVsZW1lbnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcudzNjLmRvbS5FbGVtZW50Ij4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUV4dGVuc2liaWxpdHlFbGVtZW50IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJRGVmaW5pdGlvbiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuRGVmaW5pdGlvbiINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5EZWZpbml0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZEJpbmRpbmciPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJiaW5kaW5nIiBlVHlwZT0iIy8vSUJpbmRpbmciLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZEltcG9ydCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImltcG9ydERlZiIgZVR5cGU9IiMvL0lJbXBvcnQiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZE1lc3NhZ2UiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJtZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZE5hbWVzcGFjZSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InByZWZpeCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lc3BhY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZFBvcnRUeXBlIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icG9ydFR5cGUiIGVUeXBlPSIjLy9JUG9ydFR5cGUiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZFNlcnZpY2UiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJzZXJ2aWNlIiBlVHlwZT0iIy8vSVNlcnZpY2UiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZUJpbmRpbmdGYXVsdCIgZVR5cGU9IiMvL0lCaW5kaW5nRmF1bHQiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZUJpbmRpbmdJbnB1dCIgZVR5cGU9IiMvL0lCaW5kaW5nSW5wdXQiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZUJpbmRpbmdPdXRwdXQiIGVUeXBlPSIjLy9JQmluZGluZ091dHB1dCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlQmluZGluZ09wZXJhdGlvbiIgZVR5cGU9IiMvL0lCaW5kaW5nT3BlcmF0aW9uIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVCaW5kaW5nIiBlVHlwZT0iIy8vSUJpbmRpbmciLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZUZhdWx0IiBlVHlwZT0iIy8vSUZhdWx0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVJbXBvcnQiIGVUeXBlPSIjLy9JSW1wb3J0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVJbnB1dCIgZVR5cGU9IiMvL0lJbnB1dCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlTWVzc2FnZSIgZVR5cGU9IiMvL0lNZXNzYWdlIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVPcGVyYXRpb24iIGVUeXBlPSIjLy9JT3BlcmF0aW9uIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVPdXRwdXQiIGVUeXBlPSIjLy9JT3V0cHV0Ii8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVQYXJ0IiBlVHlwZT0iIy8vSVBhcnQiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZVBvcnQiIGVUeXBlPSIjLy9JUG9ydCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlUG9ydFR5cGUiIGVUeXBlPSIjLy9JUG9ydFR5cGUiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZVNlcnZpY2UiIGVUeXBlPSIjLy9JU2VydmljZSIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QmluZGluZyIgZVR5cGU9IiMvL0lCaW5kaW5nIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5ncyIgZVR5cGU9IiMvL0lNYXAiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEltcG9ydHMiIGVUeXBlPSIjLy9JTWFwIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRJbXBvcnRzIiBlVHlwZT0iIy8vSUxpc3QiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lc3BhY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWVzc2FnZXMiIGVUeXBlPSIjLy9JTWFwIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXROYW1lc3BhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwcmVmaXgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE5hbWVzcGFjZXMiIGVUeXBlPSIjLy9JTWFwIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQb3J0VHlwZSIgZVR5cGU9IiMvL0lQb3J0VHlwZSI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UG9ydFR5cGVzIiBlVHlwZT0iIy8vSU1hcCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UHJlZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZXNwYWNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTZXJ2aWNlIiBlVHlwZT0iIy8vSVNlcnZpY2UiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFNlcnZpY2VzIiBlVHlwZT0iIy8vSU1hcCIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiIGVUeXBlPSIjLy9JRXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldEV4dGVuc2lvblJlZ2lzdHJ5Ij4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZXh0ZW5zaW9uUmVnaXN0cnkiIGVUeXBlPSIjLy9JRXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldERvY3VtZW50QmFzZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0RG9jdW1lbnRCYXNlVVJJIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZG9jdW1lbnRCYXNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVUeXBlcyIgZVR5cGU9IiMvL0lUeXBlcyIvPg0KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0icmVtb3ZlU2VydmljZSIgZVR5cGU9IiMvL0lTZXJ2aWNlIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJyZW1vdmVCaW5kaW5nIiBlVHlwZT0iIy8vSUJpbmRpbmciPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9InJlbW92ZVBvcnRUeXBlIiBlVHlwZT0iIy8vSVBvcnRUeXBlIj4NCi0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJyZW1vdmVNZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiPg0KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4NCi0gICAgPC9lT3BlcmF0aW9ucz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFR5cGVzIiBlVHlwZT0iIy8vSVR5cGVzIi8+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRUeXBlcyI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InR5cGVzIiBlVHlwZT0iIy8vSVR5cGVzIi8+DQotICAgIDwvZU9wZXJhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUltcG9ydCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuSW1wb3J0Ig0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkltcG9ydCBub24tTU9GIGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUxpc3QiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTGlzdCBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklNYXAiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTWFwIg0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5NYXAgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJVVJMIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJMIg0KLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEubmV0LlVSTCBpbnRlcmZhY2UuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklFeHRlbnNpb25SZWdpc3RyeSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlcyIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2libGVFbGVtZW50ICMvL0lUeXBlcyI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHR5cGVzIGVsZW1lbnQuIFRoZSB0eXBlcyBlbGVtZW50IGVuY2xvc2VzIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlIGV4Y2hhbmdlZCBtZXNzYWdlcy4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTY2hlbWFzIiBlVHlwZT0iIy8vSUxpc3QiLz4NCi0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFNjaGVtYXMiIGVUeXBlPSIjLy9JTGlzdCI+DQotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPg0KLSAgICA8L2VPcGVyYXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklJdGVyYXRvciIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5JdGVyYXRvciINCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiIvPg0KLSAgICA8L2VBbm5vdGF0aW9ucz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXU0RMRXhjZXB0aW9uIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uIj4NCi0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPg0KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeGNlcHRpb24gY2xhc3MuIi8+DQotICAgIDwvZUFubm90YXRpb25zPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklUeXBlcyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuVHlwZXMiDQotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+DQotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4NCi0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuVHlwZXMgbm9uLU1PRiBpbnRlcmZhY2UiLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hpbGRyZW4iIHVwcGVyQm91bmQ9Ii0xIg0KLSAgICAgICAgZVR5cGU9IiMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4NCi0gIDwvZUNsYXNzaWZpZXJzPg0KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNjaGVtYSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjLXhzZC9tb2RlbC9YU0QuZWNvcmUjLy9YU0RTY2hlbWEiDQotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPg0KLSAgPC9lQ2xhc3NpZmllcnM+DQotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRPTURvY3VtZW50IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLnczYy5kb20uRG9jdW1lbnQiPg0KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+DQotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBub24tTU9GIGludGVyZmFjZS4iLz4NCi0gICAgPC9lQW5ub3RhdGlvbnM+DQotICA8L2VDbGFzc2lmaWVycz4NCi0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWVzc2FnZVJlZmVyZW5jZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCI+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+DQotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlTWVzc2FnZSIgbG93ZXJCb3VuZD0iMSINCi0gICAgICAgIGVUeXBlPSIjLy9NZXNzYWdlIi8+DQotICA8L2VDbGFzc2lmaWVycz4NCi08L2Vjb3JlOkVQYWNrYWdlPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL3dzZGwuZ2VubW9kZWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9tb2RlbC93c2RsLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjQ0NWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL21vZGVsL3dzZGwuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCINCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSINCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjIg0KLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uud3N0LndzZGwuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuZWRpdG9yL3NyYyINCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2Uud3N0LndzZGwiIG1vZGVsTmFtZT0iV1NETCIgZWRpdFBsdWdpbkNsYXNzPSIiIGVkaXRvclBsdWdpbkNsYXNzPSIiDQotICAgIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vLi4vb3JnLmVjbGlwc2UueHNkL3NyYy14c2QvbW9kZWwvWFNELmdlbm1vZGVsIy8veHNkIj4NCi0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxXU0RMLm1kbDwvZm9yZWlnbk1vZGVsPg0KLSAgPGZvcmVpZ25Nb2RlbD5WQUJBU0VfUExVR0lOU19QQVRIPC9mb3JlaWduTW9kZWw+DQotICA8Zm9yZWlnbk1vZGVsPi4uLy4uLy4uPC9mb3JlaWduTW9kZWw+DQotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJXU0RMIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2Uud3N0IiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIg0KLSAgICAgIGVjb3JlUGFja2FnZT0id3NkbC5lY29yZSMvIj4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vUU5hbWUiLz4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vT3BlcmF0aW9uVHlwZSIvPg0KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9ET01FbGVtZW50Ii8+DQotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL1dTRExFeGNlcHRpb24iLz4NCi0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vRE9NRG9jdW1lbnQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1dTRExFbGVtZW50L2RvY3VtZW50YXRpb25FbGVtZW50Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9lbGVtZW50Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9nZXRFbmNsb3NpbmdEZWZpbml0aW9uIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9zZXRFbmNsb3NpbmdEZWZpbml0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbi9kZWZpbml0aW9uIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0VHlwZSI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9wcm94eSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9lT3BlcmF0aW9ucyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PcGVyYXRpb24iPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3N0eWxlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3VuZGVmaW5lZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUlucHV0Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VPdXRwdXQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUZhdWx0cyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VQYXJhbWV0ZXJPcmRlcmluZyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvcU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvdW5kZWZpbmVkIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3Byb3h5Ii8+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3Jlc291cmNlVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9lUGFydHMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUGFydCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudE5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvdHlwZU5hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvdHlwZURlZmluaXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudERlY2xhcmF0aW9uIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L2VNZXNzYWdlIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmciPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmcvZVBvcnRUeXBlIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZy9lQmluZGluZ09wZXJhdGlvbnMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZU9wZXJhdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nRmF1bHRzIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1NlcnZpY2UiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS91bmRlZmluZWQiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcHJveHkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcmVzb3VyY2VVUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL2VQb3J0cyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydC9lQmluZGluZyIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudC9yZXF1aXJlZCIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQvZWxlbWVudFR5cGUiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbiI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3RhcmdldE5hbWVzcGFjZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9sb2NhdGlvbiIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9xTmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lbmNvZGluZyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZU1lc3NhZ2VzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lUG9ydFR5cGVzIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lQmluZGluZ3MiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VTZXJ2aWNlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZU5hbWVzcGFjZXMiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VUeXBlcyIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZUltcG9ydHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vZ2V0RG9jdW1lbnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vc2V0RG9jdW1lbnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3NldERvY3VtZW50L2RvY3VtZW50Ii8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JbXBvcnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2xvY2F0aW9uVVJJIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9JbXBvcnQvZURlZmluaXRpb24iLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lU2NoZW1hIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JbXBvcnQvZ2V0U2NoZW1hIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JbXBvcnQvc2V0U2NoZW1hIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYS9zY2hlbWEiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9lRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQvZXh0RWxlbWVudCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSW5wdXQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL091dHB1dCIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRmF1bHQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dCI+DQotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvbmFtZSIvPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2VJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2dldElucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvc2V0SW5wdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvc2V0SW5wdXQvaW5wdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L2VPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZ2V0T3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvc2V0T3V0cHV0L291dHB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0Ij4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvZUZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvZ2V0RmF1bHQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9zZXRGYXVsdCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9zZXRGYXVsdC9mYXVsdCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTmFtZXNwYWNlIj4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL05hbWVzcGFjZS9VUkkiLz4NCi0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL05hbWVzcGFjZS9wcmVmaXgiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9hZGRPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uL29wZXJhdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24iPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL25hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9pbnB1dE5hbWUiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9vdXRwdXROYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbnMiLz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbiI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2FkZEZhdWx0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdC9mYXVsdCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0RmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0L25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRQYXJhbWV0ZXJPcmRlcmluZyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0UGFyYW1ldGVyT3JkZXJpbmcvcGFyYW1ldGVyT3JkZXIiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldElucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldElucHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dC9pbnB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0T3V0cHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldE91dHB1dCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0T3V0cHV0L291dHB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUlucHV0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lJbnB1dC9nZXRNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvc2V0TWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lJbnB1dC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lPdXRwdXQiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9nZXRNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUZhdWx0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lGYXVsdC9nZXRNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvc2V0TWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lGYXVsdC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lNZXNzYWdlIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2FkZFBhcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0L3BhcnQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRQYXJ0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydC9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cyI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cy9wYXJ0T3JkZXIiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQYXJ0Ij4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS9uYW1lIi8+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS92YWx1ZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgPC9nZW5DbGFzc2VzPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UiPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvYWRkUG9ydCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQvcG9ydCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnRzIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvZ2V0UG9ydC9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUG9ydCI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9nZXRCaW5kaW5nIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnQvc2V0QmluZGluZy9iaW5kaW5nIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZyI+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9hZGRCaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbi9iaW5kaW5nT3BlcmF0aW9uIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbiI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vbmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL2lucHV0TmFtZSIvPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL291dHB1dE5hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9ucyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0UG9ydFR5cGUiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvc2V0UG9ydFR5cGUvcG9ydFR5cGUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdCI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdC9iaW5kaW5nRmF1bHQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdHMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldE9wZXJhdGlvbiIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0T3BlcmF0aW9uIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0T3BlcmF0aW9uL29wZXJhdGlvbiIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0L2JpbmRpbmdJbnB1dCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nT3V0cHV0L2JpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nSW5wdXQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3V0cHV0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0ZhdWx0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRCaW5kaW5nL2JpbmRpbmciLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQvaW1wb3J0RGVmIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE1lc3NhZ2UvbWVzc2FnZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZS9wcmVmaXgiLz4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlL25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkUG9ydFR5cGUvcG9ydFR5cGUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRTZXJ2aWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZS9zZXJ2aWNlIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ0ZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nSW5wdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPdXRwdXQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmciLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUZhdWx0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVJbXBvcnQiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUlucHV0Ii8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVNZXNzYWdlIi8+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVPcGVyYXRpb24iLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU91dHB1dCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUGFydCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUG9ydCIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUG9ydFR5cGUiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVNlcnZpY2UiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5ncyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xL25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlL3ByZWZpeCIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UG9ydFR5cGUvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4L25hbWVzcGFjZVVSSSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UiPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldEV4dGVuc2lvblJlZ2lzdHJ5Ij4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RXh0ZW5zaW9uUmVnaXN0cnkvZXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXREb2N1bWVudEJhc2VVUkkiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSS9kb2N1bWVudEJhc2UiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVUeXBlcyIvPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlU2VydmljZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UvbmFtZSIvPg0KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZUJpbmRpbmciPg0KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVQb3J0VHlwZSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVBvcnRUeXBlL25hbWUiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVNZXNzYWdlIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZS9uYW1lIi8+DQotICAgICAgPC9nZW5PcGVyYXRpb25zPg0KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0VHlwZXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldFR5cGVzIj4NCi0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0VHlwZXMvdHlwZXMiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJbXBvcnQiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lMaXN0Ii8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTWFwIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JVVJMIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRXh0ZW5zaW9uUmVnaXN0cnkiLz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1R5cGVzIj4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMiLz4NCi0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMuMSI+DQotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMuMS9uYW1lc3BhY2VVUkkiLz4NCi0gICAgICA8L2dlbk9wZXJhdGlvbnM+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJdGVyYXRvciIvPg0KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVR5cGVzIi8+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC9jaGlsZHJlbiIvPg0KLSAgICA8L2dlbkNsYXNzZXM+DQotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCI+DQotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQvc2NoZW1hIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UiPg0KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZS9uYW1lIi8+DQotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlL2VNZXNzYWdlIi8+DQotICAgIDwvZ2VuQ2xhc3Nlcz4NCi0gIDwvZ2VuUGFja2FnZXM+DQotPC9nZW5tb2RlbDpHZW5Nb2RlbD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YzE2ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBiaW5kaW5nIGVsZW1lbnQuIEEgYmluZGluZyBkZWZpbmVzIG1lc3NhZ2UgZm9ybWF0IGFuZCBwcm90b2NvbCBkZXRhaWxzIGZvciBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBkZWZpbmVkIGJ5IGEgcGFydGljdWxhciBwb3J0VHlwZS4gVGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgYmluZGluZ3MgZm9yIGEgZ2l2ZW4gcG9ydFR5cGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNnZXRFUG9ydFR5cGUgPGVtPkVQb3J0IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNnZXRFQmluZGluZ09wZXJhdGlvbnMgPGVtPkVCaW5kaW5nIE9wZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmluZGluZyBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLkJpbmRpbmd7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFFOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ19RTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ19VbmRlZmluZWQoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVQb3J0IFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FUG9ydCBUeXBlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUG9ydCBUeXBlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RVBvcnRUeXBlKFBvcnRUeXBlKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ19FUG9ydFR5cGUoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUG9ydFR5cGUgZ2V0RVBvcnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNnZXRFUG9ydFR5cGUgPGVtPkVQb3J0IFR5cGU8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVBvcnQgVHlwZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFUG9ydFR5cGUoUG9ydFR5cGUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FQmluZGluZyBPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbn0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUJpbmRpbmcgT3BlcmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FQmluZGluZyBPcGVyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ19FQmluZGluZ09wZXJhdGlvbnMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFQmluZGluZ09wZXJhdGlvbnMoKTsKLQotfSAvLyBCaW5kaW5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nRmF1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGU5NTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZyBGYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQSBmYXVsdCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZhdWx0IHdpdGggdGhlIHNhbWUgbmFtZS4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQjZ2V0RUZhdWx0IDxlbT5FRmF1bHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ0ZhdWx0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCaW5kaW5nRmF1bHQgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudCwgamF2YXgud3NkbC5CaW5kaW5nRmF1bHR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ0ZhdWx0X05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVGYXVsdDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVGYXVsdDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUZhdWx0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RUZhdWx0KEZhdWx0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpCi0gICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlGYXVsdCBnZXRFRmF1bHQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQjZ2V0RUZhdWx0IDxlbT5FRmF1bHQ8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RUZhdWx0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RUZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVGYXVsdChGYXVsdCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JamF2YXgud3NkbC5GYXVsdCBnZXRGYXVsdCgpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRGYXVsdChqYXZheC53c2RsLkZhdWx0IGZhdWx0KTsKLQotfSAvLyBCaW5kaW5nRmF1bHQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ0lucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMGY0YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ0lucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIElucHV0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0I2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdJbnB1dCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmluZGluZ0lucHV0IGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnQsIGphdmF4LndzZGwuQmluZGluZ0lucHV0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdJbnB1dF9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVJbnB1dChJbnB1dCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdJbnB1dF9FSW5wdXQoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JSW5wdXQgZ2V0RUlucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0I2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFSW5wdXQoSW5wdXQgdmFsdWUpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWphdmF4LndzZGwuSW5wdXQgZ2V0SW5wdXQoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0SW5wdXQoamF2YXgud3NkbC5JbnB1dCBpbnB1dCk7Ci0KLX0gLy8gQmluZGluZ0lucHV0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NGUzYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmcgT3BlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoaW4gdGhlIGJpbmRpbmcncyBwb3J0VHlwZS4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFT3BlcmF0aW9uIDxlbT5FT3BlcmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdJbnB1dCA8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ091dHB1dCA8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdGYXVsdHMgPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3BlcmF0aW9uKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCaW5kaW5nT3BlcmF0aW9uIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnQsIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbnsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3BlcmF0aW9uX05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU9wZXJhdGlvbjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU9wZXJhdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVPcGVyYXRpb24oT3BlcmF0aW9uKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ09wZXJhdGlvbl9FT3BlcmF0aW9uKCkKLSAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCU9wZXJhdGlvbiBnZXRFT3BlcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFT3BlcmF0aW9uIDxlbT5FT3BlcmF0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVPcGVyYXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVPcGVyYXRpb24oT3BlcmF0aW9uIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUJpbmRpbmcgSW5wdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FQmluZGluZyBJbnB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFQmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdJbnB1dCgpCi0gICAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nSW5wdXQgZ2V0RUJpbmRpbmdJbnB1dCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdJbnB1dCA8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFQmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUJpbmRpbmcgT3V0cHV0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FQmluZGluZyBPdXRwdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ09wZXJhdGlvbl9FQmluZGluZ091dHB1dCgpCi0gICAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nT3V0cHV0IGdldEVCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ091dHB1dCA8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVCaW5kaW5nIE91dHB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVCaW5kaW5nT3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FQmluZGluZyBGYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FQmluZGluZyBGYXVsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nRmF1bHRzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0ZhdWx0IiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFQmluZGluZ0ZhdWx0cygpOwotCi19IC8vIEJpbmRpbmdPcGVyYXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdPdXRwdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdPdXRwdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0ZGY1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nT3V0cHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIE91dHB1dDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3V0cHV0I2dldEVPdXRwdXQgPGVtPkVPdXRwdXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ091dHB1dCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmluZGluZ091dHB1dCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ091dHB1dF9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ091dHB1dCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RU91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVPdXRwdXQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVPdXRwdXQ8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFT3V0cHV0KE91dHB1dCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdPdXRwdXRfRU91dHB1dCgpCi0gICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlPdXRwdXQgZ2V0RU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FT3V0cHV0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFT3V0cHV0KE91dHB1dCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JamF2YXgud3NkbC5PdXRwdXQgZ2V0T3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE91dHB1dChqYXZheC53c2RsLk91dHB1dCBvdXRwdXQpOwotCi19IC8vIEJpbmRpbmdPdXRwdXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0RlZmluaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjZjdjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIFdTREwgZG9jdW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVNZXNzYWdlcyA8ZW0+RU1lc3NhZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0RVBvcnRUeXBlcyA8ZW0+RVBvcnQgVHlwZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFQmluZGluZ3MgPGVtPkVCaW5kaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVTZXJ2aWNlcyA8ZW0+RVNlcnZpY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0RU5hbWVzcGFjZXMgPGVtPkVOYW1lc3BhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0RVR5cGVzIDxlbT5FVHlwZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFSW1wb3J0cyA8ZW0+RUltcG9ydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbigpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVmaW5pdGlvbiBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb257Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFRhcmdldE5hbWVzcGFjZShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXREZWZpbml0aW9uX1RhcmdldE5hbWVzcGFjZSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldExvY2F0aW9uKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fTG9jYXRpb24oKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFN0cmluZyBnZXRMb2NhdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldExvY2F0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFFOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9RTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldEVuY29kaW5nKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fRW5jb2RpbmcoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldEVuY29kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5jb2Rpbmc8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRFbmNvZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FTWVzc2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FTWVzc2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU1lc3NhZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FTWVzc2FnZXMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFTWVzc2FnZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVBvcnQgVHlwZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZX0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBvcnQgVHlwZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVBvcnQgVHlwZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXREZWZpbml0aW9uX0VQb3J0VHlwZXMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVBvcnRUeXBlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FQmluZGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FQmluZGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FQmluZGluZ3MoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFQmluZGluZ3MoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVNlcnZpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZX0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVNlcnZpY2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVTZXJ2aWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fRVNlcnZpY2VzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuU2VydmljZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVNlcnZpY2VzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVOYW1lc3BhY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTmFtZXNwYWNlfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FTmFtZXNwYWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FTmFtZXNwYWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fRU5hbWVzcGFjZXMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5OYW1lc3BhY2UiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVOYW1lc3BhY2VzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVUeXBlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVR5cGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RVR5cGVzKFR5cGVzKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FVHlwZXMoKQotICAgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JVHlwZXMgZ2V0RVR5cGVzKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFVHlwZXMgPGVtPkVUeXBlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FVHlwZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFVHlwZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RVR5cGVzKFR5cGVzIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUltcG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVJbXBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVJbXBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FSW1wb3J0cygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLkltcG9ydCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RUltcG9ydHMoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLkRPTURvY3VtZW50IiBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIHBhcmFtZXRlcnM9Im9yZy5lY2xpcHNlLndzZGwuRE9NRG9jdW1lbnQiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCk7Ci0KLX0gLy8gRGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRXh0ZW5zaWJpbGl0eUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0V4dGVuc2liaWxpdHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzhjZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRXh0ZW5zaWJpbGl0eUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gV1NETCBhbGxvd3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0RWxlbWVudFR5cGUgPGVtPkVsZW1lbnQgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5kcyBXU0RMRWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRSZXF1aXJlZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfUmVxdWlyZWQoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1JlcXVpcmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldEVsZW1lbnRUeXBlKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUU5hbWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRFbGVtZW50VHlwZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50I2dldEVsZW1lbnRUeXBlIDxlbT5FbGVtZW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0RWxlbWVudFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RWxlbWVudFR5cGUoUU5hbWUgdmFsdWUpOwotCi19IC8vIEV4dGVuc2liaWxpdHlFbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9FeHRlbnNpYmxlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRXh0ZW5zaWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzYWYzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9FeHRlbnNpYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbnNpYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAgV1NETCBhbGxvd3MgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSAocmVmZXJyZWQgdG8gaGVyZSBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb2ludCBvZiBleHRlbnNpYmlsaXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQjZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cyA8ZW0+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2libGVFbGVtZW50IGV4dGVuZHMgV1NETEVsZW1lbnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50fS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEV4dGVuc2libGVFbGVtZW50X0VFeHRlbnNpYmlsaXR5RWxlbWVudHMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUxpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIGFkZEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpOwotCi19IC8vIEV4dGVuc2libGVFbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9GYXVsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3ODY2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9GYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudC4gRmF1bHQgZWxlbWVudHMgc3BlY2lmeSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIGFueSBlcnJvciBtZXNzYWdlcyB0aGF0IG1heSBiZSBvdXRwdXQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RmF1bHQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZhdWx0IGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZSwgV1NETEVsZW1lbnQsIGphdmF4LndzZGwuRmF1bHR7Ci19IC8vIEZhdWx0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9JbXBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0ltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzE0NTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0ltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgV1NETCBpbXBvcnQgZWxlbWVudC4gV1NETCBhbGxvd3MgYXNzb2NpYXRpbmcgYSBuYW1lc3BhY2Ugd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uIHVzaW5nIGFuIGltcG9ydCBlbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW1wb3J0I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQjZ2V0RURlZmluaXRpb24gPGVtPkVEZWZpbml0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkltcG9ydCNnZXRFU2NoZW1hIDxlbT5FU2NoZW1hPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEltcG9ydCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW1wb3J0IGV4dGVuZHMgV1NETEVsZW1lbnQsIGphdmF4LndzZGwuSW1wb3J0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lc3BhY2VVUkkoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0SW1wb3J0X05hbWVzcGFjZVVSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW1wb3J0I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldExvY2F0aW9uVVJJKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEltcG9ydF9Mb2NhdGlvblVSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRMb2NhdGlvblVSSShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FRGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVEZWZpbml0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FRGVmaW5pdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVEZWZpbml0aW9uKERlZmluaXRpb24pCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRJbXBvcnRfRURlZmluaXRpb24oKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRGVmaW5pdGlvbiBnZXRFRGVmaW5pdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkltcG9ydCNnZXRFRGVmaW5pdGlvbiA8ZW0+RURlZmluaXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RURlZmluaXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFRGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFRGVmaW5pdGlvbihEZWZpbml0aW9uIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVNjaGVtYTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVTY2hlbWE8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVTY2hlbWE8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFU2NoZW1hKFhTRFNjaGVtYSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEltcG9ydF9FU2NoZW1hKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVhTRFNjaGVtYSBnZXRFU2NoZW1hKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW1wb3J0I2dldEVTY2hlbWEgPGVtPkVTY2hlbWE8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVNjaGVtYTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVTY2hlbWEoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RVNjaGVtYShYU0RTY2hlbWEgdmFsdWUpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVhTRFNjaGVtYSBnZXRTY2hlbWEoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpOwotCi19IC8vIEltcG9ydApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvSW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL0lucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MjgxZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvSW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5wdXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQuIEFuIGlucHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRJbnB1dCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5wdXQgZXh0ZW5kcyBNZXNzYWdlUmVmZXJlbmNlLCBXU0RMRWxlbWVudCwgamF2YXgud3NkbC5JbnB1dHsKLX0gLy8gSW5wdXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL01lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL01lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5NGQ1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG1lc3NhZ2UgZWxlbWVudC4gQSBXU0RMIG1lc3NhZ2UgaXMgYW4gYWJzdHJhY3QsIHR5cGVkIGRlZmluaXRpb24gb2YgdGhlIGRhdGEgYmVpbmcgY29tbXVuaWNhdGVkLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UjZ2V0RVBhcnRzIDxlbT5FUGFydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TWVzc2FnZSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZSBleHRlbmRzIFdTRExFbGVtZW50LCBqYXZheC53c2RsLk1lc3NhZ2V7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFFOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TWVzc2FnZV9RTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TWVzc2FnZV9VbmRlZmluZWQoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVQYXJ0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVQYXJ0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUGFydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRNZXNzYWdlX0VQYXJ0cygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLlBhcnQiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVQYXJ0cygpOwotCi19IC8vIE1lc3NhZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL01lc3NhZ2VSZWZlcmVuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL01lc3NhZ2VSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjNDFlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9NZXNzYWdlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIFJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2VSZWZlcmVuY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlUmVmZXJlbmNlI2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRNZXNzYWdlUmVmZXJlbmNlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlUmVmZXJlbmNlIGV4dGVuZHMgV1NETEVsZW1lbnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TWVzc2FnZVJlZmVyZW5jZV9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZVJlZmVyZW5jZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RU1lc3NhZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVNZXNzYWdlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FTWVzc2FnZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVNZXNzYWdlKE1lc3NhZ2UpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRNZXNzYWdlUmVmZXJlbmNlX0VNZXNzYWdlKCkKLSAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBNZXNzYWdlIGdldEVNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZVJlZmVyZW5jZSNnZXRFTWVzc2FnZSA8ZW0+RU1lc3NhZ2U8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVNZXNzYWdlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RU1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICB2b2lkIHNldEVNZXNzYWdlKE1lc3NhZ2UgdmFsdWUpOwotCi19IC8vIE1lc3NhZ2VSZWZlcmVuY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL05hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMzAwNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5hbWVzcGFjZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGluIGEgV1NETCBkb2N1bWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk5hbWVzcGFjZSNnZXRVUkkgPGVtPlVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5OYW1lc3BhY2UjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TmFtZXNwYWNlKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lc3BhY2UgZXh0ZW5kcyBFT2JqZWN0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VVJJPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRVUkkoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TmFtZXNwYWNlX1VSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTmFtZXNwYWNlI2dldFVSSSA8ZW0+VVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVUkkoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRQcmVmaXgoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TmFtZXNwYWNlX1ByZWZpeCgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0UHJlZml4KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTmFtZXNwYWNlI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFByZWZpeCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBOYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL09wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3M2UwYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3BlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudC4gQSBXU0RMIG9wZXJhdGlvbiBpcyBhbiBhYnN0cmFjdCBkZXNjcmlwdGlvbiBvZiBhbiBhY3Rpb24gc3VwcG9ydGVkIGJ5IGEgc2VydmljZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2lzUHJveHkgPGVtPlByb3h5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRFSW5wdXQgPGVtPkVJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0RUZhdWx0cyA8ZW0+RUZhdWx0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0RVBhcmFtZXRlck9yZGVyaW5nIDxlbT5FUGFyYW1ldGVyIE9yZGVyaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE9wZXJhdGlvbigpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3BlcmF0aW9uIGV4dGVuZHMgV1NETEVsZW1lbnQsIGphdmF4LndzZGwuT3BlcmF0aW9uewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3R5bGU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRTdHlsZShPcGVyYXRpb25UeXBlKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX1N0eWxlKCkKLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvblR5cGUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JT3BlcmF0aW9uVHlwZSBnZXRTdHlsZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3R5bGU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRTdHlsZShPcGVyYXRpb25UeXBlIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE9wZXJhdGlvbl9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX1VuZGVmaW5lZCgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlib29sZWFuIGlzVW5kZWZpbmVkKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5kZWZpbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FSW5wdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FSW5wdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVJbnB1dChJbnB1dCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE9wZXJhdGlvbl9FSW5wdXQoKQotICAgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JSW5wdXQgZ2V0RUlucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFSW5wdXQoSW5wdXQgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FT3V0cHV0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU91dHB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU91dHB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVPdXRwdXQoT3V0cHV0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX0VPdXRwdXQoKQotICAgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JT3V0cHV0IGdldEVPdXRwdXQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FT3V0cHV0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFT3V0cHV0KE91dHB1dCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVGYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5GYXVsdH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUZhdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FRmF1bHRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX0VGYXVsdHMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5GYXVsdCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RUZhdWx0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FUGFyYW1ldGVyIE9yZGVyaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBhcmFtZXRlciBPcmRlcmluZzwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUGFyYW1ldGVyIE9yZGVyaW5nPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLlBhcnQiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCk7Ci0KLX0gLy8gT3BlcmF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9PdXRwdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL091dHB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA5ZGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL091dHB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50LiBBbiBvdXRwdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRPdXRwdXQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dHB1dCBleHRlbmRzIE1lc3NhZ2VSZWZlcmVuY2UsIFdTRExFbGVtZW50LCBqYXZheC53c2RsLk91dHB1dHsKLX0gLy8gT3V0cHV0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9QYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9QYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NWIwOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRFbGVtZW50TmFtZSA8ZW0+RWxlbWVudCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnQjZ2V0VHlwZU5hbWUgPGVtPlR5cGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldFR5cGVEZWZpbml0aW9uIDxlbT5UeXBlIERlZmluaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRFbGVtZW50RGVjbGFyYXRpb24gPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRFTWVzc2FnZSA8ZW0+RU1lc3NhZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UGFydCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFydCBleHRlbmRzIFdTRExFbGVtZW50LCBqYXZheC53c2RsLlBhcnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UGFydF9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRFbGVtZW50TmFtZShRTmFtZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBhcnRfRWxlbWVudE5hbWUoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUU5hbWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUU5hbWUgZ2V0RWxlbWVudE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldEVsZW1lbnROYW1lIDxlbT5FbGVtZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0RWxlbWVudE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RWxlbWVudE5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFR5cGVOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UGFydF9UeXBlTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRUeXBlTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnQjZ2V0VHlwZU5hbWUgPGVtPlR5cGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRUeXBlTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRUeXBlTmFtZShRTmFtZSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgRGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIERlZmluaXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBhcnRfVHlwZURlZmluaXRpb24oKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFhTRFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRUeXBlRGVmaW5pdGlvbiA8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIERlZmluaXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRUeXBlRGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHZvaWQgc2V0VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IERlY2xhcmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IERlY2xhcmF0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IERlY2xhcmF0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRFbGVtZW50RGVjbGFyYXRpb24gPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFbGVtZW50RGVjbGFyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICB2b2lkIHNldEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FTWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVNZXNzYWdlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FTWVzc2FnZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVNZXNzYWdlKE1lc3NhZ2UpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRQYXJ0X0VNZXNzYWdlKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCU1lc3NhZ2UgZ2V0RU1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FTWVzc2FnZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVNZXNzYWdlKE1lc3NhZ2UgdmFsdWUpOwotCi19IC8vIFBhcnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1BvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhNjFmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9Qb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnQgZWxlbWVudC4gQSBwb3J0IGRlZmluZXMgYW4gaW5kaXZpZHVhbCBlbmRwb2ludCBieSBzcGVjaWZ5aW5nIGEgc2luZ2xlIGFkZHJlc3MgZm9yIGEgYmluZGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnQjZ2V0RUJpbmRpbmcgPGVtPkVCaW5kaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvcnQgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudCwgamF2YXgud3NkbC5Qb3J0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRfTmFtZSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVCaW5kaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUJpbmRpbmc8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVCaW5kaW5nPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RUJpbmRpbmcoQmluZGluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRfRUJpbmRpbmcoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JQmluZGluZyBnZXRFQmluZGluZygpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnQjZ2V0RUJpbmRpbmcgPGVtPkVCaW5kaW5nPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVCaW5kaW5nPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RUJpbmRpbmcoQmluZGluZyB2YWx1ZSk7Ci0KLX0gLy8gUG9ydApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvUG9ydFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1BvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MzdjZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0VHlwZSBlbGVtZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjEgYW5kIGFuIEludGVyZmFjZSBjb21wb25lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMi4gQSBwb3J0IHR5cGUgb3IgSW50ZXJmYWNlIGlzIGEgbmFtZWQgc2V0IG9mIGFic3RyYWN0IG9wZXJhdGlvbnMgYW5kIHRoZSBhYnN0cmFjdCBtZXNzYWdlcyBpbnZvbHZlZC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlI2lzUHJveHkgPGVtPlByb3h5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydFR5cGUjZ2V0RU9wZXJhdGlvbnMgPGVtPkVPcGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRUeXBlKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQb3J0VHlwZSBleHRlbmRzIFdTRExFbGVtZW50LCBqYXZheC53c2RsLlBvcnRUeXBlewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UU5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRRTmFtZShRTmFtZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRUeXBlX1FOYW1lKCkKLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLlFOYW1lIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVFOYW1lIGdldFFOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydFR5cGUjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UG9ydFR5cGVfVW5kZWZpbmVkKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWJvb2xlYW4gaXNVbmRlZmluZWQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb259LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVPcGVyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVPcGVyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UG9ydFR5cGVfRU9wZXJhdGlvbnMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVPcGVyYXRpb25zKCk7Ci0KLX0gLy8gUG9ydFR5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1NlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxNGM3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UjZ2V0RVBvcnRzIDxlbT5FUG9ydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0U2VydmljZSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZSBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLlNlcnZpY2V7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFFOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0U2VydmljZV9RTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0U2VydmljZV9VbmRlZmluZWQoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVQb3J0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUG9ydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRTZXJ2aWNlX0VQb3J0cygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLlBvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVQb3J0cygpOwotCi19IC8vIFNlcnZpY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1R5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTkxMDYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1R5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCB0eXBlcyBlbGVtZW50LiBUaGUgdHlwZXMgZWxlbWVudCBlbmNsb3NlcyBkYXRhIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZSBleGNoYW5nZWQgbWVzc2FnZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRUeXBlcygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZXMgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudCwgamF2YXgud3NkbC5UeXBlc3sKLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JTGlzdCBnZXRTY2hlbWFzKCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlMaXN0IGdldFNjaGVtYXMoU3RyaW5nIG5hbWVzcGFjZVVSSSk7Ci0KLX0gLy8gVHlwZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNmY5Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCNnZXRQYXJlbnQgPGVtPlBhcmVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0Q2hpbGRyZW4gPGVtPkNoaWxkcmVuPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGlsZHJlbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudH0uCi0gICAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50I2dldFBhcmVudCA8ZW0+UGFyZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoaWxkcmVuPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoaWxkcmVuPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50X0NoaWxkcmVuKCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCNnZXRQYXJlbnQKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiBvcHBvc2l0ZT0icGFyZW50IgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFTGlzdCBnZXRDaGlsZHJlbigpOwotCi19IC8vIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDViYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbGFuZ3VhZ2UgZWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLldTRExFbGVtZW50I2dldERvY3VtZW50YXRpb25FbGVtZW50IDxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuV1NETEVsZW1lbnQjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRXU0RMRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETEVsZW1lbnQgZXh0ZW5kcyBFT2JqZWN0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXREb2N1bWVudGF0aW9uRWxlbWVudChFbGVtZW50KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0V1NETEVsZW1lbnRfRG9jdW1lbnRhdGlvbkVsZW1lbnQoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuRE9NRWxlbWVudCIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFbGVtZW50IGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuV1NETEVsZW1lbnQjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQgPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXREb2N1bWVudGF0aW9uRWxlbWVudChFbGVtZW50IHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogVGhpcyBpcyB0aGUgdW5kZXJseWluZyBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21wb25lbnQsIAotICAgKiBpLmUuLCB0aGUge0BsaW5rICN1cGRhdGVFbGVtZW50KCkgc2VyaWFsaXphdGlvbn0gb2YgdGhpcyBjb21wb25lbnQuCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRFbGVtZW50KEVsZW1lbnQpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRXU0RMRWxlbWVudF9FbGVtZW50KCkKLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLkRPTUVsZW1lbnQiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLldTRExFbGVtZW50I2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgdmFsdWUpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCURlZmluaXRpb24gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFbmNsb3NpbmdEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbik7Ci0KLSAgLyoqCi0gICAqIEVuc3VyZXMgdGhhdCB0aGUgdW5kZXJseWluZyBET00ge0BsaW5rICNnZXRFbGVtZW50IGVsZW1lbnR9IGJvdGggZXhpc3RzIGFuZCBpcyB1cC10by1kYXRlIHdpdGggcmVzcGVjdCB0byB0aGUgbW9kZWwsCi0gICAqIGkuZS4sIGl0IHNlcmlhbGl6ZXMgdGhlIGNvbXBvbmVudCBhbmQgbWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIHdpdGggdGhhdCBzZXJpYWxpemF0aW9uLgotICAgKiBAc2VlICN1cGRhdGVFbGVtZW50KGJvb2xlYW4pCi0gICAqIEBzZWUgI2dldEVsZW1lbnQKLSAgICovCi0gIHZvaWQgdXBkYXRlRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBFbnN1cmVzIHRoYXQgdGhlIHVuZGVybHlpbmcgRE9NIHtAbGluayAjZ2V0RWxlbWVudCBlbGVtZW50fSBib3RoIGV4aXN0cyBhbmQgaXMgdXAtdG8tZGF0ZSB3aXRoIHJlc3BlY3QgdG8gdGhlIG1vZGVsLAotICAgKiBpLmUuLCBpdCBzZXJpYWxpemVzIHRoZSBjb21wb25lbnQgYW5kIG1haW50YWlucyBhbiBhc3NvY2lhdGlvbiB3aXRoIHRoYXQgc2VyaWFsaXphdGlvbi4KLSAgICogRm9yIDxjb2RlPmRlZXAgPT0gdHJ1ZTwvY29kZT4sIAotICAgKiBvciB3aGVuIDxjb2RlPntAbGluayAjZ2V0RWxlbWVudCBnZXRFbGVtZW50KCl9ID09IG51bGw8L2NvZGU+LCAKLSAgICogdGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIHtAbGluayAjdXBkYXRlRWxlbWVudCgpfTsKLSAgICogb3RoZXJ3aXNlLCBpdCB1cGRhdGVzIGp1c3QgdGhlIERPTSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBvbmVudCB0byByZWZsZWN0IHRoZSBjdXJyZW50IHN0YXRlLgotICAgKiBAc2VlICN1cGRhdGVFbGVtZW50KCkKLSAgICogQHNlZSAjZ2V0RWxlbWVudAotICAgKi8KLSAgdm9pZCB1cGRhdGVFbGVtZW50KGJvb2xlYW4gZGVlcCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIFRoaXMgcmVwcmVzZW50cyB0aGUgY29uY3JldGUgY29udGFpbmVyIG9mIHRoaXMgY29tcG9uZW50LCAKLSAgICogaS5lLiwgdGhlIGludmVyc2Ugb2YgdGhlIGJsYWNrIGRpYW1vbmQgcmVsYXRpb25zIGluIHRoZSBVTUwgbW9kZWwuCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lcjwvZW0+JyByZWZlcmVuY2UuCi0gICAqLwotICBXU0RMRWxlbWVudCBnZXRDb250YWluZXIoKTsKLSAgCi0gIC8qKgotICAgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudCBoYXMgY2hhbmdlZDsKLSAgICogdGhlIGVsZW1lbnQgc2hvdWxkIHR5cGljYWxseSBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIHJldHVybmVkIHtAbGluayAjZ2V0RWxlbWVudH0uCi0gICAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgY2xpZW50cyB3aWxsIG5vdCBjYWxsIHRoaXMgdGhlbXNlbHZlcyAKLSAgICogc2luY2UgdGhlIERPTSBldmVudCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhlIHVuZGVybHlpbmcgRE9NIHdpbGwgaW52b2tlIHRoZXNlIGF1dG9tYXRpY2FsbHkuCi0gICAqLwotICB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpOwotCi19IC8vIFdTRExFbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJjNjg2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0gIC8qKgotICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVdTRExGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExGYWN0b3J5SW1wbCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgVHlwZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0IFR5cGU8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUG9ydFR5cGUgY3JlYXRlUG9ydFR5cGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCU9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2U8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJ0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVBhcnQgY3JlYXRlUGFydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nT3BlcmF0aW9uIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2U8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU2VydmljZSBjcmVhdGVTZXJ2aWNlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVBvcnQgY3JlYXRlUG9ydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlZmluaXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlEZWZpbml0aW9uIGNyZWF0ZURlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbXBvcnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1wb3J0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUltcG9ydCBjcmVhdGVJbXBvcnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnB1dDwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlJbnB1dCBjcmVhdGVJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dHB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRwdXQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JT3V0cHV0IGNyZWF0ZU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUZhdWx0IGNyZWF0ZUZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmluZGluZyBJbnB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUJpbmRpbmdJbnB1dCBjcmVhdGVCaW5kaW5nSW5wdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nT3V0cHV0IGNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIEZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JQmluZGluZ0ZhdWx0IGNyZWF0ZUJpbmRpbmdGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JTmFtZXNwYWNlIGNyZWF0ZU5hbWVzcGFjZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlR5cGVzPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlR5cGVzPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVR5cGVzIGNyZWF0ZVR5cGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVdTRExQYWNrYWdlIGdldFdTRExQYWNrYWdlKCk7Ci0KLX0gLy9XU0RMRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETFBhY2thZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjY4Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuCi0gKiAKLSAqIFdTREwgZGVzY3JpYmVzIG5ldHdvcmsgc2VydmljZXMgYXMgc2V0cyBvZiBlbmRwb2ludHMgb3BlcmF0aW5nIG9uIG1lc3NhZ2VzLiBUaGUgb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgYXJlIGRlc2NyaWJlZCBhYnN0cmFjdGx5LCBhbmQgdGhlbiBib3VuZCB0byBhIGNvbmNyZXRlIG5ldHdvcmsgcHJvdG9jb2wgYW5kIG1lc3NhZ2UgZm9ybWF0IHRvIGRlZmluZSBhbiBlbmRwb2ludC4KLSAqIAotICogV1NETCBkZXNjcmliZXMgdGhlIGZvcm1hdHMgb2YgdGhlIG1lc3NhZ2VzIGV4Y2hhbmdlZCBieSB0aGUgc2VydmljZXMsIGFuZCBzdXBwb3J0cyB0aGUgWE1MIFNjaGVtYXMgc3BlY2lmaWNhdGlvbiBhcyBpdHMgY2Fub25pY2FsIHR5cGUgc3lzdGVtLiBUaGlzIHBhY2thZ2UgdXNlcyBhbiBYTUwgU2NoZW1hIEluZm9zZXQgbW9kZWwgcGFja2FnZSAoc2VlIHRoZSBYU0QgcGFja2FnZSkgdG8gZGVzY3JpYmUgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0cy4KLSAqIAotICogVGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkKLSAqIC0gMi4xIERlZmluaXRpb24sIHNob3dzIHRoZSBXU0RMIGRlZmluaXRpb24gZWxlbWVudCBhbmQgdGhlIFdTREwgZG9jdW1lbnQgc3RydWN0dXJlCi0gKiAtIDIuMS4xIE5hbWluZyBhbmQgTGlua2luZywgc2hvd3MgdGhlIG5hbWVzcGFjZSBhbmQgaW1wb3J0IG1lY2hhbmlzbQotICogLSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbQotICogLSAyLjIgVHlwZXMsIHNob3dzIHRoZSB1c2Ugb2YgWE1MIFNjaGVtYSB0eXBlcyBpbiBXU0RMCi0gKiAtIDIuMyBNZXNzYWdlcywgMi40IFBvcnRUeXBlcywgMi41IEJpbmRpbmdzIGFuZCAyLjcgU2VydmljZXMsIHNob3cgdGhlIG1ham9yIFdTREwgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9ucy4KLSAqIAotICogVGhlIFdTREwgY2xhc3NlcyBleHRlbmQgdGhlIGphdmF4LndzZGwgaW50ZXJmYWNlcyBkZWZpbmVkIGJ5IEpTUiAxMTAuIENsYXNzZXMgd2l0aCBpbnRlcmZhY2UgYW5kIGRhdGF0eXBlIHN0ZXJlb3R5cGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVzZSBub24tTU9GIGludGVyZmFjZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETEZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlCi17Ci0gIC8qKgotICAgKiBUaGUgcGFja2FnZSBuYW1lLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgU3RyaW5nIGVOQU1FID0gIndzZGwiOwotCi0gIC8qKgotICAgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9XU0RMIjsKLQotICAvKioKLSAgICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJ3c2RsIjsKLQotICAvKioKLSAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFdTRExQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETFBhY2thZ2VJbXBsLmluaXQoKTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuV1NETEVsZW1lbnRJbXBsIDxlbT5FbGVtZW50PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMRWxlbWVudEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRXU0RMRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBXU0RMX0VMRU1FTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFdTRExfRUxFTUVOVF9fRUxFTUVOVCA9IDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5Qb3J0VHlwZUltcGwgPGVtPlBvcnQgVHlwZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuUG9ydFR5cGVJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0UG9ydFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgUE9SVF9UWVBFID0gMTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfVFlQRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9UWVBFX19FTEVNRU5UID0gV1NETF9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEVfX1FOQU1FID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5kZWZpbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9UWVBFX19VTkRFRklORUQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm94eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfVFlQRV9fUFJPWFkgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEVfX1JFU09VUkNFX1VSSSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEVfX0VPUEVSQVRJT05TID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBvcnQgVHlwZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEVfRkVBVFVSRV9DT1VOVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwgPGVtPk9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuT3BlcmF0aW9uSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBPUEVSQVRJT04gPSAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPUEVSQVRJT05fX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fU1RZTEUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19OQU1FID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5kZWZpbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19VTkRFRklORUQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm94eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fUFJPWFkgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPUEVSQVRJT05fX1JFU09VUkNFX1VSSSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJbnB1dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fRUlOUFVUID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU91dHB1dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fRU9VVFBVVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVGYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fRUZBVUxUUyA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYXJhbWV0ZXIgT3JkZXJpbmc8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fRVBBUkFNRVRFUl9PUkRFUklORyA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PcGVyYXRpb248L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5NZXNzYWdlSW1wbCA8ZW0+TWVzc2FnZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuTWVzc2FnZUltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IE1FU1NBR0UgPSAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9fUU5BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX19VTkRFRklORUQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm94eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfX1BST1hZID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9fUkVTT1VSQ0VfVVJJID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX19FUEFSVFMgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TWVzc2FnZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX0ZFQVRVUkVfQ09VTlQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5QYXJ0SW1wbCA8ZW0+UGFydDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuUGFydEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFBBUlQgPSA0OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX19OQU1FID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fRUxFTUVOVF9OQU1FID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fVFlQRV9OQU1FID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBEZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fVFlQRV9ERUZJTklUSU9OID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBEZWNsYXJhdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT04gPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBBUlRfX0VNRVNTQUdFID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBhcnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9GRUFUVVJFX0NPVU5UID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIDxlbT5FeHRlbnNpYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkV4dGVuc2libGVFbGVtZW50SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldEV4dGVuc2libGVFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCTEVfRUxFTUVOVCA9IDEyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbnNpYmxlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5CaW5kaW5nSW1wbCA8ZW0+QmluZGluZzwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuQmluZGluZ0ltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEJJTkRJTkcgPSA1OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfX1FOQU1FID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5kZWZpbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19fVU5ERUZJTkVEID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJveHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19QUk9YWSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfX1JFU09VUkNFX1VSSSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQb3J0IFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19FUE9SVF9UWVBFID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUJpbmRpbmcgT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19fRUJJTkRJTkdfT1BFUkFUSU9OUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CaW5kaW5nPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdPcGVyYXRpb25JbXBsIDxlbT5CaW5kaW5nIE9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRCaW5kaW5nT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OID0gNjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09QRVJBVElPTl9fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09QRVJBVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19OQU1FID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUJpbmRpbmcgSW5wdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfSU5QVVQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQmluZGluZyBPdXRwdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfT1VUUFVUID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUJpbmRpbmcgRmF1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJpbmRpbmcgT3BlcmF0aW9uPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5TZXJ2aWNlSW1wbCA8ZW0+U2VydmljZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuU2VydmljZUltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFNFUlZJQ0UgPSA3OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFNFUlZJQ0VfX1FOQU1FID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5kZWZpbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9fVU5ERUZJTkVEID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJveHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX19QUk9YWSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFNFUlZJQ0VfX1JFU09VUkNFX1VSSSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9fRVBPUlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlNlcnZpY2U8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuUG9ydEltcGwgPGVtPlBvcnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlBvcnRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0UG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBQT1JUID0gODsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfX05BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQmluZGluZzwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfX0VCSU5ESU5HID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBvcnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIDxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldEV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCSUxJVFlfRUxFTUVOVCA9IDk7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsIDxlbT5EZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5EZWZpbml0aW9uSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTiA9IDEwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fVEFSR0VUX05BTUVTUEFDRSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fTE9DQVRJT04gPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX1FOQU1FID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2Rpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FTkNPRElORyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNZXNzYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRU1FU1NBR0VTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBvcnQgVHlwZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VQT1JUX1RZUEVTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUJpbmRpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FQklORElOR1MgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU2VydmljZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VTRVJWSUNFUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVOYW1lc3BhY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FTkFNRVNQQUNFUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VUWVBFUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJbXBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FSU1QT1JUUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDExOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuSW1wb3J0SW1wbCA8ZW0+SW1wb3J0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5JbXBvcnRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SW1wb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElNUE9SVCA9IDExOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTVBPUlRfX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1QT1JUX19OQU1FU1BBQ0VfVVJJID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb24gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1QT1JUX19MT0NBVElPTl9VUkkgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElNUE9SVF9fRURFRklOSVRJT04gPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU2NoZW1hPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1QT1JUX19FU0NIRU1BID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkltcG9ydDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTVBPUlRfRkVBVFVSRV9DT1VOVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLk1lc3NhZ2VSZWZlcmVuY2VJbXBsIDxlbT5NZXNzYWdlIFJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuTWVzc2FnZVJlZmVyZW5jZUltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRNZXNzYWdlUmVmZXJlbmNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfUkVGRVJFTkNFID0gNDY7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9SRUZFUkVOQ0VfX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9SRUZFUkVOQ0VfX05BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5NZXNzYWdlIFJlZmVyZW5jZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuSW5wdXRJbXBsIDxlbT5JbnB1dDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuSW5wdXRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SW5wdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSU5QVVQgPSAxMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElOUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElOUFVUX19FTEVNRU5UID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU5QVVRfX05BTUUgPSBNRVNTQUdFX1JFRkVSRU5DRV9fTkFNRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU5QVVRfX0VNRVNTQUdFID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklucHV0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElOUFVUX0ZFQVRVUkVfQ09VTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLk91dHB1dEltcGwgPGVtPk91dHB1dDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuT3V0cHV0SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldE91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBPVVRQVVQgPSAxNDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPVVRQVVRfX0VMRU1FTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPVVRQVVRfX05BTUUgPSBNRVNTQUdFX1JFRkVSRU5DRV9fTkFNRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1VUUFVUX19FTUVTU0FHRSA9IE1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1VUUFVUX0ZFQVRVUkVfQ09VTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkZhdWx0SW1wbCA8ZW0+RmF1bHQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkZhdWx0SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldEZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEZBVUxUID0gMTU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBGQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBGQVVMVF9fRUxFTUVOVCA9IE1FU1NBR0VfUkVGRVJFTkNFX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEZBVUxUX19OQU1FID0gTUVTU0FHRV9SRUZFUkVOQ0VfX05BTUU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEZBVUxUX19FTUVTU0FHRSA9IE1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5GYXVsdDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBGQVVMVF9GRUFUVVJFX0NPVU5UID0gTUVTU0FHRV9SRUZFUkVOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5CaW5kaW5nSW5wdXRJbXBsIDxlbT5CaW5kaW5nIElucHV0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5CaW5kaW5nSW5wdXRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0QmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfSU5QVVQgPSAxNjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfSU5QVVRfX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19JTlBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfSU5QVVRfX05BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0lOUFVUX19FSU5QVVQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmluZGluZyBJbnB1dDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0lOUFVUX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5CaW5kaW5nT3V0cHV0SW1wbCA8ZW0+QmluZGluZyBPdXRwdXQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdPdXRwdXRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0QmluZGluZ091dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09VVFBVVCA9IDE3OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PVVRQVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1VUUFVUX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1VUUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PVVRQVVRfX05BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3V0cHV0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PVVRQVVRfX0VPVVRQVVQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmluZGluZyBPdXRwdXQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PVVRQVVRfRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdGYXVsdEltcGwgPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdGYXVsdEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRCaW5kaW5nRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgQklORElOR19GQVVMVCA9IDE4OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19GQVVMVF9fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0ZBVUxUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19GQVVMVF9fTkFNRSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVGYXVsdDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfRkFVTFRfX0VGQVVMVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CaW5kaW5nIEZhdWx0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfRkFVTFRfRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLk5hbWVzcGFjZUltcGwgPGVtPk5hbWVzcGFjZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuTmFtZXNwYWNlSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldE5hbWVzcGFjZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBOQU1FU1BBQ0UgPSAxOTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE5BTUVTUEFDRV9fVVJJID0gMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE5BTUVTUEFDRV9fUFJFRklYID0gMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTkFNRVNQQUNFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuUG9ydFR5cGUgPGVtPklQb3J0IFR5cGU8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLlBvcnRUeXBlCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SVBvcnRUeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElQT1JUX1RZUEUgPSAyMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JUG9ydCBUeXBlPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElQT1JUX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5PcGVyYXRpb24gPGVtPklPcGVyYXRpb248L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLk9wZXJhdGlvbgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSU9QRVJBVElPTiA9IDIxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklPcGVyYXRpb248L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLklucHV0IDxlbT5JSW5wdXQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLklucHV0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUlucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElJTlBVVCA9IDIyOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklJbnB1dDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJSU5QVVRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5PdXRwdXQgPGVtPklPdXRwdXQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLk91dHB1dAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElPdXRwdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSU9VVFBVVCA9IDIzOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklPdXRwdXQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU9VVFBVVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLkZhdWx0IDxlbT5JRmF1bHQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLkZhdWx0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElGQVVMVCA9IDI0OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklGYXVsdDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJRkFVTFRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5NZXNzYWdlIDxlbT5JTWVzc2FnZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuTWVzc2FnZQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElNRVNTQUdFID0gMjU7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU1lc3NhZ2U8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1FU1NBR0VfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5QYXJ0IDxlbT5JUGFydDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuUGFydAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElQQVJUID0gMjY7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SVBhcnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSVBBUlRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5TZXJ2aWNlIDxlbT5JU2VydmljZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuU2VydmljZQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElTRVJWSUNFID0gMjc7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SVNlcnZpY2U8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSVNFUlZJQ0VfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5Qb3J0IDxlbT5JUG9ydDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuUG9ydAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElQb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElQT1JUID0gMjg7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SVBvcnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSVBPUlRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nIDxlbT5JQmluZGluZzwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZwotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElCSU5ESU5HID0gMjk7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUJpbmRpbmc8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUJJTkRJTkdfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIDxlbT5JQmluZGluZyBPcGVyYXRpb248L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJQmluZGluZ09wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJQklORElOR19PUEVSQVRJT04gPSAzMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JQmluZGluZyBPcGVyYXRpb248L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUJJTkRJTkdfT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ0lucHV0IDxlbT5JQmluZGluZyBJbnB1dDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ0lucHV0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUJpbmRpbmdJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJQklORElOR19JTlBVVCA9IDMxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklCaW5kaW5nIElucHV0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElCSU5ESU5HX0lOUFVUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ091dHB1dCA8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUJpbmRpbmdPdXRwdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUJJTkRJTkdfT1VUUFVUID0gMzI7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElCSU5ESU5HX09VVFBVVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCA8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdGYXVsdAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElCaW5kaW5nRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUJJTkRJTkdfRkFVTFQgPSAzMzsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JQmluZGluZyBGYXVsdDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJQklORElOR19GQVVMVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUVYVEVOU0lCSUxJVFlfRUxFTUVOVCA9IDM0OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLkRlZmluaXRpb24gPGVtPklEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5EZWZpbml0aW9uCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SURlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSURFRklOSVRJT04gPSAzNTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLkltcG9ydCA8ZW0+SUltcG9ydDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuSW1wb3J0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUltcG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJSU1QT1JUID0gMzY7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUltcG9ydDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJSU1QT1JUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmEudXRpbC5MaXN0IDxlbT5JTGlzdDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUxpc3QoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUxJU1QgPSAzNzsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JTGlzdDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTElTVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZhLnV0aWwuTWFwIDxlbT5JTWFwPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YS51dGlsLk1hcAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElNYXAoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSU1BUCA9IDM4OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklNYXA8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1BUF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZhLm5ldC5VUkwgPGVtPklVUkw8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZhLm5ldC5VUkwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJVVJMKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElVUkwgPSAzOTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JVVJMPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElVUkxfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IDxlbT5JRXh0ZW5zaW9uIFJlZ2lzdHJ5PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUV4dGVuc2lvblJlZ2lzdHJ5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElFWFRFTlNJT05fUkVHSVNUUlkgPSA0MDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JRXh0ZW5zaW9uIFJlZ2lzdHJ5PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElFWFRFTlNJT05fUkVHSVNUUllfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5UeXBlc0ltcGwgPGVtPlR5cGVzPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5UeXBlc0ltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRUeXBlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBUWVBFUyA9IDQxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVFlQRVNfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFRZUEVTX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFRZUEVTX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VHlwZXM8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVFlQRVNfRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZhLnV0aWwuSXRlcmF0b3IgPGVtPklJdGVyYXRvcjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmEudXRpbC5JdGVyYXRvcgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElJdGVyYXRvcigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJSVRFUkFUT1IgPSA0MjsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSXRlcmF0b3I8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUlURVJBVE9SX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuVHlwZXMgPGVtPklUeXBlczwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuVHlwZXMKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJVHlwZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSVRZUEVTID0gNDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SVR5cGVzPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElUWVBFU19GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgPGVtPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UID0gNDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBVTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRCA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBVTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZHJlbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVCA9IDQ1OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRSA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQSA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5YU0QgU2NoZW1hIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGRhdGEgdHlwZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFFOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFFOQU1FID0gNDc7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+T3BlcmF0aW9uIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLk9wZXJhdGlvblR5cGUKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRPcGVyYXRpb25UeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9UWVBFID0gNDg7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RE9NIEVsZW1lbnQ8L2VtPicgZGF0YSB0eXBlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0RE9NRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBET01fRUxFTUVOVCA9IDQ5OwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkV4Y2VwdGlvbjwvZW0+JyBkYXRhIHR5cGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFdTRExFeGNlcHRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgV1NETF9FWENFUFRJT04gPSA1MDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5ET00gRG9jdW1lbnQ8L2VtPicgZGF0YSB0eXBlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcudzNjLmRvbS5Eb2N1bWVudAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldERPTURvY3VtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IERPTV9ET0NVTUVOVCA9IDUxOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRXU0RMRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50I2dldERvY3VtZW50YXRpb25FbGVtZW50IDxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKQotICAgKiBAc2VlICNnZXRXU0RMRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0V1NETEVsZW1lbnRfRG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCNnZXRFbGVtZW50KCkKLSAgICogQHNlZSAjZ2V0V1NETEVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFdTRExFbGVtZW50X0VsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUgPGVtPlBvcnQgVHlwZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb3J0IFR5cGU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldFBvcnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UU5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjZ2V0UU5hbWUoKQotICAgKiBAc2VlICNnZXRQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfUU5hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5kZWZpbmVkPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlI2lzVW5kZWZpbmVkKCkKLSAgICogQHNlZSAjZ2V0UG9ydFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFBvcnRUeXBlX1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlI2lzUHJveHkgPGVtPlByb3h5PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJveHk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjaXNQcm94eSgpCi0gICAqIEBzZWUgI2dldFBvcnRUeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9Qcm94eSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAc2VlICNnZXRQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfUmVzb3VyY2VVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlI2dldEVPcGVyYXRpb25zIDxlbT5FT3BlcmF0aW9uczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RU9wZXJhdGlvbnM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjZ2V0RU9wZXJhdGlvbnMoKQotICAgKiBAc2VlICNnZXRQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0UG9ydFR5cGVfRU9wZXJhdGlvbnMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uIDxlbT5PcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0eWxlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRTdHlsZSgpCi0gICAqIEBzZWUgI2dldE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0T3BlcmF0aW9uX1N0eWxlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRPcGVyYXRpb25fTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5kZWZpbmVkPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNpc1VuZGVmaW5lZCgpCi0gICAqIEBzZWUgI2dldE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0T3BlcmF0aW9uX1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb3h5PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNpc1Byb3h5KCkKLSAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRPcGVyYXRpb25fUHJveHkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9SZXNvdXJjZVVSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRFSW5wdXQgPGVtPkVJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVJbnB1dDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0RUlucHV0KCkKLSAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRPcGVyYXRpb25fRUlucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldEVPdXRwdXQgPGVtPkVPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRFT3V0cHV0KCkKLSAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRPcGVyYXRpb25fRU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldEVGYXVsdHMgPGVtPkVGYXVsdHM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVGYXVsdHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldEVGYXVsdHMoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FRmF1bHRzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0RVBhcmFtZXRlck9yZGVyaW5nIDxlbT5FUGFyYW1ldGVyIE9yZGVyaW5nPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FUGFyYW1ldGVyIE9yZGVyaW5nPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FUGFyYW1ldGVyT3JkZXJpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXNzYWdlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldE1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlFOYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjZ2V0UU5hbWUoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlX1FOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5kZWZpbmVkPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjaXNVbmRlZmluZWQoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlX1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm94eTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlI2lzUHJveHkoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlX1Byb3h5KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlX1Jlc291cmNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlI2dldEVQYXJ0cyA8ZW0+RVBhcnRzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FUGFydHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNnZXRFUGFydHMoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRNZXNzYWdlX0VQYXJ0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0IDxlbT5QYXJ0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhcnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0UGFydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0UGFydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0UGFydF9OYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRFbGVtZW50TmFtZSA8ZW0+RWxlbWVudCBOYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWxlbWVudCBOYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0RWxlbWVudE5hbWUoKQotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQYXJ0X0VsZW1lbnROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRUeXBlTmFtZSA8ZW0+VHlwZSBOYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZSBOYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0VHlwZU5hbWUoKQotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQYXJ0X1R5cGVOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRUeXBlRGVmaW5pdGlvbiA8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0VHlwZURlZmluaXRpb24oKQotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRQYXJ0X1R5cGVEZWZpbml0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRFbGVtZW50RGVjbGFyYXRpb24gPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbGVtZW50IERlY2xhcmF0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICogQHNlZSAjZ2V0UGFydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0UGFydF9FbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0I2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVNZXNzYWdlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0RU1lc3NhZ2UoKQotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRQYXJ0X0VNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcgPGVtPkJpbmRpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRCaW5kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZyNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5RTmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2dldFFOYW1lKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19RTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVuZGVmaW5lZDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2lzVW5kZWZpbmVkKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19VbmRlZmluZWQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2lzUHJveHkgPGVtPlByb3h5PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJveHk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZyNpc1Byb3h5KCkKLSAgICogQHNlZSAjZ2V0QmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19Qcm94eSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2dldFJlc291cmNlVVJJKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19SZXNvdXJjZVVSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0RVBvcnRUeXBlIDxlbT5FUG9ydCBUeXBlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RVBvcnQgVHlwZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2dldEVQb3J0VHlwZSgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEJpbmRpbmdfRVBvcnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2dldEVCaW5kaW5nT3BlcmF0aW9ucyA8ZW0+RUJpbmRpbmcgT3BlcmF0aW9uczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RUJpbmRpbmcgT3BlcmF0aW9uczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2dldEVCaW5kaW5nT3BlcmF0aW9ucygpCi0gICAqIEBzZWUgI2dldEJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEJpbmRpbmdfRUJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24gPGVtPkJpbmRpbmcgT3BlcmF0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJpbmRpbmcgT3BlcmF0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldEJpbmRpbmdPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0TmFtZSgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldEJpbmRpbmdPcGVyYXRpb25fTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RU9wZXJhdGlvbiA8ZW0+RU9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFT3BlcmF0aW9uKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ09wZXJhdGlvbl9FT3BlcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ0lucHV0IDxlbT5FQmluZGluZyBJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVCaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdJbnB1dCgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdPdXRwdXQgPGVtPkVCaW5kaW5nIE91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVCaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVCaW5kaW5nT3V0cHV0KCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ09wZXJhdGlvbl9FQmluZGluZ091dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ0ZhdWx0cyA8ZW0+RUJpbmRpbmcgRmF1bHRzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FQmluZGluZyBGYXVsdHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ0ZhdWx0cygpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdGYXVsdHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSA8ZW0+U2VydmljZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZXJ2aWNlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldFNlcnZpY2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlFOYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjZ2V0UU5hbWUoKQotICAgKiBAc2VlICNnZXRTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlX1FOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5kZWZpbmVkPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjaXNVbmRlZmluZWQoKQotICAgKiBAc2VlICNnZXRTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlX1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm94eTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlI2lzUHJveHkoKQotICAgKiBAc2VlICNnZXRTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlX1Byb3h5KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAc2VlICNnZXRTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlX1Jlc291cmNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlI2dldEVQb3J0cyA8ZW0+RVBvcnRzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FUG9ydHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNnZXRFUG9ydHMoKQotICAgKiBAc2VlICNnZXRTZXJ2aWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRTZXJ2aWNlX0VQb3J0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0IDxlbT5Qb3J0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0UG9ydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydCNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0UG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydF9OYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydCNnZXRFQmluZGluZyA8ZW0+RUJpbmRpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FQmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0I2dldEVCaW5kaW5nKCkKLSAgICogQHNlZSAjZ2V0UG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0UG9ydF9FQmluZGluZygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcXVpcmVkPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50I2lzUmVxdWlyZWQoKQotICAgKiBAc2VlICNnZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfUmVxdWlyZWQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCNnZXRFbGVtZW50VHlwZSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWxlbWVudCBUeXBlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50I2dldEVsZW1lbnRUeXBlKCkKLSAgICogQHNlZSAjZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldEV4dGVuc2liaWxpdHlFbGVtZW50X0VsZW1lbnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24gPGVtPkRlZmluaXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXREZWZpbml0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0RGVmaW5pdGlvbl9UYXJnZXROYW1lc3BhY2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2F0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0TG9jYXRpb24oKQotICAgKiBAc2VlICNnZXREZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX0xvY2F0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5RTmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldFFOYW1lKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0RGVmaW5pdGlvbl9RTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RW5jb2RpbmcgPGVtPkVuY29kaW5nPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5jb2Rpbmc8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFbmNvZGluZygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldERlZmluaXRpb25fRW5jb2RpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RU1lc3NhZ2VzIDxlbT5FTWVzc2FnZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVNZXNzYWdlczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVNZXNzYWdlcygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRU1lc3NhZ2VzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVQb3J0VHlwZXMgPGVtPkVQb3J0IFR5cGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FUG9ydCBUeXBlczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVQb3J0VHlwZXMoKQotICAgKiBAc2VlICNnZXREZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VQb3J0VHlwZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RUJpbmRpbmdzIDxlbT5FQmluZGluZ3M8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVCaW5kaW5nczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVCaW5kaW5ncygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRUJpbmRpbmdzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVTZXJ2aWNlcyA8ZW0+RVNlcnZpY2VzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FU2VydmljZXM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFU2VydmljZXMoKQotICAgKiBAc2VlICNnZXREZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VTZXJ2aWNlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFTmFtZXNwYWNlcyA8ZW0+RU5hbWVzcGFjZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVOYW1lc3BhY2VzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RU5hbWVzcGFjZXMoKQotICAgKiBAc2VlICNnZXREZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VOYW1lc3BhY2VzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFVHlwZXMgPGVtPkVUeXBlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVUeXBlczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVUeXBlcygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRVR5cGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVJbXBvcnRzIDxlbT5FSW1wb3J0czwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RUltcG9ydHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFSW1wb3J0cygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRUltcG9ydHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0IDxlbT5JbXBvcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW1wb3J0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SW1wb3J0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBzZWUgI2dldEltcG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0SW1wb3J0X05hbWVzcGFjZVVSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydCNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydCNnZXRMb2NhdGlvblVSSSgpCi0gICAqIEBzZWUgI2dldEltcG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0SW1wb3J0X0xvY2F0aW9uVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldEVEZWZpbml0aW9uIDxlbT5FRGVmaW5pdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVEZWZpbml0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydCNnZXRFRGVmaW5pdGlvbigpCi0gICAqIEBzZWUgI2dldEltcG9ydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0SW1wb3J0X0VEZWZpbml0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldEVTY2hlbWEgPGVtPkVTY2hlbWE8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FU2NoZW1hPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydCNnZXRFU2NoZW1hKCkKLSAgICogQHNlZSAjZ2V0SW1wb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRJbXBvcnRfRVNjaGVtYSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudCA8ZW0+RXh0ZW5zaWJsZSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuc2libGUgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50I2dldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMgPGVtPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudCNnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkKLSAgICogQHNlZSAjZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEV4dGVuc2libGVFbGVtZW50X0VFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQgPGVtPklucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklucHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQgPGVtPk91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PdXRwdXQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRPdXRwdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQgPGVtPkZhdWx0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQgPGVtPkJpbmRpbmcgSW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmluZGluZyBJbnB1dDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldEJpbmRpbmdJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQjZ2V0TmFtZSgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ0lucHV0X05hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQjZ2V0RUlucHV0IDxlbT5FSW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FSW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0I2dldEVJbnB1dCgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ0lucHV0X0VJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0IDxlbT5CaW5kaW5nIE91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0I2dldE5hbWUoKQotICAgKiBAc2VlICNnZXRCaW5kaW5nT3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nT3V0cHV0X05hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0I2dldEVPdXRwdXQgPGVtPkVPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0RU91dHB1dCgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdPdXRwdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEJpbmRpbmdPdXRwdXRfRU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQgPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmluZGluZyBGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldEJpbmRpbmdGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQjZ2V0TmFtZSgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ0ZhdWx0X05hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQjZ2V0RUZhdWx0IDxlbT5FRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FRmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0I2dldEVGYXVsdCgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXROYW1lc3BhY2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2UjZ2V0VVJJIDxlbT5VUkk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlI2dldFVSSSgpCi0gICAqIEBzZWUgI2dldE5hbWVzcGFjZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0TmFtZXNwYWNlX1VSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZSNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZWZpeDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2UjZ2V0UHJlZml4KCkKLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXROYW1lc3BhY2VfUHJlZml4KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuUG9ydFR5cGUgPGVtPklQb3J0IFR5cGU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVBvcnQgVHlwZTwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLlBvcnRUeXBlCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLlBvcnRUeXBlIiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElQb3J0VHlwZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLk9wZXJhdGlvbiA8ZW0+SU9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JT3BlcmF0aW9uPC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuT3BlcmF0aW9uCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLk9wZXJhdGlvbiIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJT3BlcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuSW5wdXQgPGVtPklJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5JbnB1dAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5JbnB1dCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJSW5wdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5PdXRwdXQgPGVtPklPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SU91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLk91dHB1dAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5PdXRwdXQiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkZhdWx0IDxlbT5JRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUZhdWx0PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuRmF1bHQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuRmF1bHQiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuTWVzc2FnZSA8ZW0+SU1lc3NhZ2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SU1lc3NhZ2U8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5NZXNzYWdlCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLk1lc3NhZ2UiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SU1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5QYXJ0IDxlbT5JUGFydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JUGFydDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLlBhcnQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuUGFydCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJUGFydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLlNlcnZpY2UgPGVtPklTZXJ2aWNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklTZXJ2aWNlPC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuU2VydmljZQotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5TZXJ2aWNlIiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElTZXJ2aWNlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuUG9ydCA8ZW0+SVBvcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVBvcnQ8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5Qb3J0Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLlBvcnQiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SVBvcnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nIDxlbT5JQmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JQmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmcKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuQmluZGluZyIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJQmluZGluZygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JQmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUJpbmRpbmdPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgPGVtPklCaW5kaW5nIElucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklCaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ0lucHV0Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLkJpbmRpbmdJbnB1dCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJQmluZGluZ0lucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ091dHB1dCA8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklCaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuQmluZGluZ091dHB1dCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJQmluZGluZ091dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCA8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuQmluZGluZ0ZhdWx0IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElCaW5kaW5nRmF1bHQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuRGVmaW5pdGlvbiA8ZW0+SURlZmluaXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SURlZmluaXRpb248L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5EZWZpbml0aW9uCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLkRlZmluaXRpb24iIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SURlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5JbXBvcnQgPGVtPklJbXBvcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUltcG9ydDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLkltcG9ydAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5JbXBvcnQiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUltcG9ydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZhLnV0aWwuTGlzdCA8ZW0+SUxpc3Q8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUxpc3Q8L2VtPicuCi0gICAqIEBzZWUgamF2YS51dGlsLkxpc3QKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5MaXN0IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5NYXAgPGVtPklNYXA8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SU1hcDwvZW0+Jy4KLSAgICogQHNlZSBqYXZhLnV0aWwuTWFwCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuTWFwIiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElNYXAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YS5uZXQuVVJMIDxlbT5JVVJMPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklVUkw8L2VtPicuCi0gICAqIEBzZWUgamF2YS5uZXQuVVJMCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm5ldC5VUkwiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SVVSTCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgPGVtPklFeHRlbnNpb24gUmVnaXN0cnk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUV4dGVuc2lvbiBSZWdpc3RyeTwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXMgPGVtPlR5cGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlR5cGVzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRUeXBlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZhLnV0aWwuSXRlcmF0b3IgPGVtPklJdGVyYXRvcjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSXRlcmF0b3I8L2VtPicuCi0gICAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuSXRlcmF0b3IiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUl0ZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuVHlwZXMgPGVtPklUeXBlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JVHlwZXM8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5UeXBlcwotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5UeXBlcyIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJVHlwZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50I2dldENoaWxkcmVuIDxlbT5DaGlsZHJlbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2hpbGRyZW48L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50I2dldENoaWxkcmVuKCkKLSAgICogQHNlZSAjZ2V0VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRfQ2hpbGRyZW4oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50I2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2NoZW1hPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50I2dldFNjaGVtYSgpCi0gICAqIEBzZWUgI2dldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudF9TY2hlbWEoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZSA8ZW0+TWVzc2FnZSBSZWZlcmVuY2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWVzc2FnZSBSZWZlcmVuY2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0TWVzc2FnZVJlZmVyZW5jZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZSNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0TWVzc2FnZVJlZmVyZW5jZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZVJlZmVyZW5jZV9OYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZSNnZXRFTWVzc2FnZSA8ZW0+RU1lc3NhZ2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FTWVzc2FnZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlI2dldEVNZXNzYWdlKCkKLSAgICogQHNlZSAjZ2V0TWVzc2FnZVJlZmVyZW5jZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZVJlZmVyZW5jZV9FTWVzc2FnZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlFOYW1lPC9lbT4nLgotICAgKiBAc2VlIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVEYXRhVHlwZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIDxlbT5PcGVyYXRpb24gVHlwZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+T3BlcmF0aW9uIFR5cGU8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLk9wZXJhdGlvblR5cGUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVEYXRhVHlwZSBnZXRPcGVyYXRpb25UeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcudzNjLmRvbS5FbGVtZW50IDxlbT5ET00gRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RE9NIEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLnczYy5kb20uRWxlbWVudCIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRURhdGFUeXBlIGdldERPTUVsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbiA8ZW0+RXhjZXB0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5FeGNlcHRpb248L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLldTRExFeGNlcHRpb24iCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVEYXRhVHlwZSBnZXRXU0RMRXhjZXB0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcudzNjLmRvbS5Eb2N1bWVudCA8ZW0+RE9NIERvY3VtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5ET00gRG9jdW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLnczYy5kb20uRG9jdW1lbnQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy53M2MuZG9tLkRvY3VtZW50IgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFRGF0YVR5cGUgZ2V0RE9NRG9jdW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgV1NETEZhY3RvcnkgZ2V0V1NETEZhY3RvcnkoKTsKLQotfSAvL1dTRExQYWNrYWdlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZmY2YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmV4dGVuc2liaWxpdHkuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmV4dGVuc2liaWxpdHkuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGouV1NETEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5OwotCi0KLS8qKgotICogVGhlIDxiPlBsdWdpbjwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIFRoZSBXU0RMIG1vZGVsIG5lZWRzIHRvIGJlIGFibGUgdG8gcnVuIHdpdGhpbiBhbiBFY2xpcHNlIHdvcmtiZW5jaCwKLSAqIHdpdGhpbiBhIGhlYWRsZXNzIEVjbGlwc2Ugd29ya3NwYWNlLCBvciBqdXN0IHN0YW5kLWFsb25lIGFzIHBhcnQgCi0gKiBvZiBzb21lIG90aGVyIGFwcGxpY2F0aW9uLgotICogVG8gc3VwcG9ydCB0aGlzLCBhbGwgYWNjZXNzIGlzIGRpcmVjdGVkIHRvIHRoZSBzdGF0aWMgbWV0aG9kcywKLSAqIHdoaWNoIGNhbiByZWRpcmVjdCB0aGUgc2VydmljZSBhcyBhcHBvcHJpYXRlIHRvIHRoZSBydW50aW1lLgotICogRHVyaW5nIHN0YW5kLWFsb25lIGludm9jYXRpb24gbm8gcGx1Z2luIGluaXRpYWxpemF0aW9uIHRha2VzIHBsYWNlLgotICogSW4gdGhpcyBjYXNlIHlvdSB3aWxsIG5lZWQgdGhlIHJlc291cmNlcyBqYXIgb24gdGhlIGNsYXNzIHBhdGguCi0gKiBAc2VlICNnZXRCYXNlVVJMCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXU0RMUGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIAotewotICAvKioKLSAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGx1Z2luLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXU0RMUGx1Z2luIElOU1RBTkNFID0gbmV3IFdTRExQbHVnaW4oKTsKLQotICAvKioKLSAgICogVGhlIG9uZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgKi8KLSAgc3RhdGljIHByaXZhdGUgSW1wbGVtZW50YXRpb24gcGx1Z2luOwotICAKLSAgcHJpdmF0ZSBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGwgZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICovCi0gIHByaXZhdGUgV1NETFBsdWdpbigpCi0gIHsKLSAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICB9Ci0KLSAgLyoKLSAgICogSmF2YWRvYyBjb3BpZWQgZnJvbSBiYXNlIGNsYXNzLgotICAgKi8KLSAgcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKQotICB7Ci0gICAgcmV0dXJuIHBsdWdpbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgotICAgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpCi0gIHsKLSAgICByZXR1cm4gcGx1Z2luOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luCi0gIHsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGx1Z2luLgotICAgICAqLwotICAgIHB1YmxpYyBJbXBsZW1lbnRhdGlvbihJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yKQotICAgIHsKLSAgICAgIHN1cGVyKGRlc2NyaXB0b3IpOwotCi0gICAgICAvLyBSZW1lbWJlciB0aGUgc3RhdGljIGluc3RhbmNlLgotICAgICAgLy8KLSAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5SW1wbCBpbnRlcm5hbEdldEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5KCkKLSAgewotICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSA9PSBudWxsKQotICAgIHsKLSAgICAgIGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5ID0gbmV3IEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5SW1wbCgpOwotICAgICAgaWYgKHBsdWdpbiAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIG5ldyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlcihleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSkucmVhZFJlZ2lzdHJ5KCk7Ci0gICAgICB9ICAKLSAgICB9Ci0gICAgcmV0dXJuIGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5OwotICB9Ci0gIAotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGdldEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeShTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgcmV0dXJuIGludGVybmFsR2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkobmFtZXNwYWNlKTsKLSAgfQotICAKLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5IGdldEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5KCkKLSAgeyAgIAotICAgIHJldHVybiBpbnRlcm5hbEdldEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRmFjdG9yeSBjcmVhdGVXU0RMNEpGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBuZXcgV1NETEZhY3RvcnlJbXBsKCk7ICAgCQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiYjY2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0U2NoZW1hKFhTRFNjaGVtYSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50X1NjaGVtYSgpCi0gICAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgWFNEU2NoZW1hIGdldFNjaGVtYSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50I2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRTY2hlbWEoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICB2b2lkIHNldFNjaGVtYShYU0RTY2hlbWEgdmFsdWUpOwotCi19IC8vIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEFkZHJlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQQWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWFiNTg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWRkcmVzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlI2dldEhUVFBBZGRyZXNzKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIVFRQQWRkcmVzcyBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYXRpb24gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2NhdGlvblVSSShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UjZ2V0SFRUUEFkZHJlc3NfTG9jYXRpb25VUkkoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uVVJJKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBIVFRQQWRkcmVzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczMjU0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nI2dldFZlcmIgPGVtPlZlcmI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSNnZXRIVFRQQmluZGluZygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRUUEJpbmRpbmcgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcmI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcmI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyYjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmVyYihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UjZ2V0SFRUUEJpbmRpbmdfVmVyYigpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmVyYigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nI2dldFZlcmIgPGVtPlZlcmI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcmI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZlcmIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcmIoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBIVFRQQmluZGluZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1ODJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUVFBGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUEZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsLkhUVFBGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlIVFRQQmluZGluZyBjcmVhdGVIVFRQQmluZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUE9wZXJhdGlvbiBjcmVhdGVIVFRQT3BlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVybCBSZXBsYWNlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VXJsIFJlcGxhY2VtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlIVFRQVXJsUmVwbGFjZW1lbnQgY3JlYXRlSFRUUFVybFJlcGxhY2VtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVybCBFbmNvZGVkPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5VcmwgRW5jb2RlZDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUFVybEVuY29kZWQgY3JlYXRlSFRUUFVybEVuY29kZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWRkcmVzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWRkcmVzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUEFkZHJlc3MgY3JlYXRlSFRUUEFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUFBhY2thZ2UgZ2V0SFRUUFBhY2thZ2UoKTsKLQotfSAvL0hUVFBGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUE9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwYTlhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3BlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uI2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSNnZXRIVFRQT3BlcmF0aW9uKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIVFRQT3BlcmF0aW9uIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2F0aW9uIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9jYXRpb25VUkkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlI2dldEhUVFBPcGVyYXRpb25fTG9jYXRpb25VUkkoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uVVJJKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbiNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhdGlvblVSSShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEhUVFBPcGVyYXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQUGFja2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MWMzMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQRmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUVFBQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiaHR0cCI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly93d3cuaWJtLmNvbS93c2RsLzIwMDMvSFRUUCI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJodHRwIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGwuSFRUUFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUEJpbmRpbmdJbXBsIDxlbT5CaW5kaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUEJpbmRpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SFRUUEJpbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFRUUF9CSU5ESU5HID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0JJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0JJTkRJTkdfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0JJTkRJTkdfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0JJTkRJTkdfX1ZFUkIgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJpbmRpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9CSU5ESU5HX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBPcGVyYXRpb25JbXBsIDxlbT5PcGVyYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQT3BlcmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFBhY2thZ2VJbXBsI2dldEhUVFBPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFRUUF9PUEVSQVRJT04gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9PUEVSQVRJT05fX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX09QRVJBVElPTl9fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfT1BFUkFUSU9OX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX09QRVJBVElPTl9fTE9DQVRJT05fVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PcGVyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9PUEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFVybFJlcGxhY2VtZW50SW1wbCA8ZW0+VXJsIFJlcGxhY2VtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFVybFJlcGxhY2VtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFBhY2thZ2VJbXBsI2dldEhUVFBVcmxSZXBsYWNlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIVFRQX1VSTF9SRVBMQUNFTUVOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9SRVBMQUNFTUVOVF9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX1JFUExBQ0VNRU5UX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfUkVQTEFDRU1FTlRfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFVybEVuY29kZWRJbXBsIDxlbT5VcmwgRW5jb2RlZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBVcmxFbmNvZGVkSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFBhY2thZ2VJbXBsI2dldEhUVFBVcmxFbmNvZGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhUVFBfVVJMX0VOQ09ERUQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX0VOQ09ERURfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfRU5DT0RFRF9fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX0VOQ09ERURfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5VcmwgRW5jb2RlZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9FTkNPREVEX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBBZGRyZXNzSW1wbCA8ZW0+QWRkcmVzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBBZGRyZXNzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFBhY2thZ2VJbXBsI2dldEhUVFBBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhUVFBfQUREUkVTUyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9BRERSRVNTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9BRERSRVNTX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9BRERSRVNTX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9BRERSRVNTX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QWRkcmVzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX0FERFJFU1NfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyA8ZW0+SUhUVFAgQWRkcmVzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SUhUVFBBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElIVFRQX0FERFJFU1MgPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSFRUUCBBZGRyZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElIVFRQX0FERFJFU1NfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcgPGVtPklIVFRQIEJpbmRpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFBhY2thZ2VJbXBsI2dldElIVFRQQmluZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSFRUUF9CSU5ESU5HID0gNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUhUVFAgQmluZGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJSFRUUF9CSU5ESU5HX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uIDxlbT5JSFRUUCBPcGVyYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SUhUVFBPcGVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUhUVFBfT1BFUkFUSU9OID0gNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUhUVFAgT3BlcmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElIVFRQX09QRVJBVElPTl9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQgPGVtPklIVFRQIFVybCBFbmNvZGVkPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRJSFRUUFVybEVuY29kZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUhUVFBfVVJMX0VOQ09ERUQgPSA4OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSFRUUCBVcmwgRW5jb2RlZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJSFRUUF9VUkxfRU5DT0RFRF9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IDxlbT5JSFRUUCBVcmwgUmVwbGFjZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRJSFRUUFVybFJlcGxhY2VtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElIVFRQX1VSTF9SRVBMQUNFTUVOVCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklIVFRQIFVybCBSZXBsYWNlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJSFRUUF9VUkxfUkVQTEFDRU1FTlRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZyA8ZW0+QmluZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CaW5kaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRIVFRQQmluZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmcjZ2V0VmVyYiA8ZW0+VmVyYjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcmI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmcjZ2V0VmVyYigpCi0JICogQHNlZSAjZ2V0SFRUUEJpbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEhUVFBCaW5kaW5nX1ZlcmIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uIDxlbT5PcGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEhUVFBPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb24jZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uI2dldExvY2F0aW9uVVJJKCkKLQkgKiBAc2VlICNnZXRIVFRQT3BlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRIVFRQT3BlcmF0aW9uX0xvY2F0aW9uVVJJKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IDxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VXJsIFJlcGxhY2VtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SFRUUFVybFJlcGxhY2VtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybEVuY29kZWQgPGVtPlVybCBFbmNvZGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVybCBFbmNvZGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxFbmNvZGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRIVFRQVXJsRW5jb2RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzIDxlbT5BZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEhUVFBBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzcyNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzI2dldExvY2F0aW9uVVJJKCkKLQkgKiBAc2VlICNnZXRIVFRQQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SFRUUEFkZHJlc3NfTG9jYXRpb25VUkkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzIDxlbT5JSFRUUCBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklIVFRQIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJSFRUUEFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nIDxlbT5JSFRUUCBCaW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklIVFRQIEJpbmRpbmc8L2VtPicuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJSFRUUEJpbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24gPGVtPklIVFRQIE9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSFRUUCBPcGVyYXRpb248L2VtPicuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24iIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SUhUVFBPcGVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkIDxlbT5JSFRUUCBVcmwgRW5jb2RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSFRUUCBVcmwgRW5jb2RlZDwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElIVFRQVXJsRW5jb2RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IDxlbT5JSFRUUCBVcmwgUmVwbGFjZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUhUVFAgVXJsIFJlcGxhY2VtZW50PC9lbT4nLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50Ci0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJSFRUUFVybFJlcGxhY2VtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlIVFRQRmFjdG9yeSBnZXRIVFRQRmFjdG9yeSgpOwotCi19IC8vSFRUUFBhY2thZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQVXJsRW5jb2RlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBVcmxFbmNvZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNmMwMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBVcmxFbmNvZGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VcmwgRW5jb2RlZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UjZ2V0SFRUUFVybEVuY29kZWQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUVFBVcmxFbmNvZGVkIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkIHsKLX0gLy8gSFRUUFVybEVuY29kZWQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQVXJsUmVwbGFjZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQVXJsUmVwbGFjZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkMWRkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUFVybFJlcGxhY2VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VcmwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlI2dldEhUVFBVcmxSZXBsYWNlbWVudCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRUUFVybFJlcGxhY2VtZW50IGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCB7Ci19IC8vIEhUVFBVcmxSZXBsYWNlbWVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUEFkZHJlc3NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQQWRkcmVzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxNzRlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQQWRkcmVzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsLkhUVFBDb25zdGFudHM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZGRyZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQQWRkcmVzc0ltcGwjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBBZGRyZXNzSW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEhUVFBBZGRyZXNzIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb25VUkkoKSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb25VUkkgPSBMT0NBVElPTl9VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSFRUUEFkZHJlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBBZGRyZXNzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSSSgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uVVJJOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uVVJJKFN0cmluZyBuZXdMb2NhdGlvblVSSSkgewotCQlTdHJpbmcgb2xkTG9jYXRpb25VUkkgPSBsb2NhdGlvblVSSTsKLQkJbG9jYXRpb25VUkkgPSBuZXdMb2NhdGlvblVSSTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkksIG9sZExvY2F0aW9uVVJJLCBsb2NhdGlvblVSSSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkk6Ci0JCQkJcmV0dXJuIGdldExvY2F0aW9uVVJJKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fTE9DQVRJT05fVVJJOgotCQkJCXNldExvY2F0aW9uVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fTE9DQVRJT05fVVJJOgotCQkJCXNldExvY2F0aW9uVVJJKExPQ0FUSU9OX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkk6Ci0JCQkJcmV0dXJuIExPQ0FUSU9OX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb25VUkkgIT0gbnVsbCA6ICFMT0NBVElPTl9VUklfRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uVVJJKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxvY2F0aW9uVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsb2NhdGlvblVSSSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gIAlzZXRMb2NhdGlvblVSSQotICAgICAgKEhUVFBDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBIVFRQQ29uc3RhbnRzLkxPQ0FUSU9OX1VSSV9BVFRSSUJVVEUpKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IEhUVFBQYWNrYWdlLmVJTlNUQU5DRS5nZXRIVFRQQWRkcmVzc19Mb2NhdGlvblVSSSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsSFRUUENvbnN0YW50cy5MT0NBVElPTl9VUklfQVRUUklCVVRFLGdldExvY2F0aW9uVVJJKCkpOwotICAgIH0KLSAgfQotfSAvL0hUVFBBZGRyZXNzSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUEJpbmRpbmdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQQmluZGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRkNmYzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQQmluZGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsLkhUVFBDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUEJpbmRpbmdJbXBsI2dldFZlcmIgPGVtPlZlcmI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQQmluZGluZ0ltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBIVFRQQmluZGluZyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcmIoKSA8ZW0+VmVyYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyYigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSQl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJiKCkgPGVtPlZlcmI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcmIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyYiA9IFZFUkJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSFRUUEJpbmRpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBCaW5kaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJiKCkgewotCQlyZXR1cm4gdmVyYjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJiKFN0cmluZyBuZXdWZXJiKSB7Ci0JCVN0cmluZyBvbGRWZXJiID0gdmVyYjsKLQkJdmVyYiA9IG5ld1ZlcmI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fVkVSQiwgb2xkVmVyYiwgdmVyYikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19WRVJCOgotCQkJCXJldHVybiBnZXRWZXJiKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fVkVSQjoKLQkJCQlzZXRWZXJiKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fVkVSQjoKLQkJCQlzZXRWZXJiKFZFUkJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fVkVSQjoKLQkJCQlyZXR1cm4gVkVSQl9FREVGQVVMVCA9PSBudWxsID8gdmVyYiAhPSBudWxsIDogIVZFUkJfRURFRkFVTFQuZXF1YWxzKHZlcmIpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmVyYjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyYik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gIAlzZXRWZXJiCi0gICAgICAoSFRUUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIEhUVFBDb25zdGFudHMuVkVSQl9BVFRSSUJVVEUpKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IEhUVFBQYWNrYWdlLmVJTlNUQU5DRS5nZXRIVFRQQmluZGluZ19WZXJiKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxIVFRQQ29uc3RhbnRzLlZFUkJfQVRUUklCVVRFLGdldFZlcmIoKSk7Ci0gICAgfQotICB9Ci0KLX0gLy9IVFRQQmluZGluZ0ltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZWE2MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBIVFRQRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkc6IHJldHVybiBjcmVhdGVIVFRQQmluZGluZygpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTjogcmV0dXJuIGNyZWF0ZUhUVFBPcGVyYXRpb24oKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlQ6IHJldHVybiBjcmVhdGVIVFRQVXJsUmVwbGFjZW1lbnQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRDogcmV0dXJuIGNyZWF0ZUhUVFBVcmxFbmNvZGVkKCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTUzogcmV0dXJuIGNyZWF0ZUhUVFBBZGRyZXNzKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUEJpbmRpbmcgY3JlYXRlSFRUUEJpbmRpbmcoKSB7Ci0JCUhUVFBCaW5kaW5nSW1wbCBodHRwQmluZGluZyA9IG5ldyBIVFRQQmluZGluZ0ltcGwoKTsKLQkJcmV0dXJuIGh0dHBCaW5kaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQT3BlcmF0aW9uIGNyZWF0ZUhUVFBPcGVyYXRpb24oKSB7Ci0JCUhUVFBPcGVyYXRpb25JbXBsIGh0dHBPcGVyYXRpb24gPSBuZXcgSFRUUE9wZXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGh0dHBPcGVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBVcmxSZXBsYWNlbWVudCBjcmVhdGVIVFRQVXJsUmVwbGFjZW1lbnQoKSB7Ci0JCUhUVFBVcmxSZXBsYWNlbWVudEltcGwgaHR0cFVybFJlcGxhY2VtZW50ID0gbmV3IEhUVFBVcmxSZXBsYWNlbWVudEltcGwoKTsKLQkJcmV0dXJuIGh0dHBVcmxSZXBsYWNlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUFVybEVuY29kZWQgY3JlYXRlSFRUUFVybEVuY29kZWQoKSB7Ci0JCUhUVFBVcmxFbmNvZGVkSW1wbCBodHRwVXJsRW5jb2RlZCA9IG5ldyBIVFRQVXJsRW5jb2RlZEltcGwoKTsKLQkJcmV0dXJuIGh0dHBVcmxFbmNvZGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQQWRkcmVzcyBjcmVhdGVIVFRQQWRkcmVzcygpIHsKLQkJSFRUUEFkZHJlc3NJbXBsIGh0dHBBZGRyZXNzID0gbmV3IEhUVFBBZGRyZXNzSW1wbCgpOwotCQlyZXR1cm4gaHR0cEFkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBQYWNrYWdlIGdldEhUVFBQYWNrYWdlKCkgewotCQlyZXR1cm4gKEhUVFBQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhUVFBQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBIVFRQUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotfSAvL0hUVFBGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUE9wZXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBPcGVyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MmQ0MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUE9wZXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWwuSFRUUENvbnN0YW50czsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBPcGVyYXRpb25JbXBsI2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQT3BlcmF0aW9uSW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEhUVFBPcGVyYXRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvblVSSSgpIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb25VUkkoKSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvblVSSSA9IExPQ0FUSU9OX1VSSV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIVFRQT3BlcmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEhUVFBQYWNrYWdlLmVJTlNUQU5DRS5nZXRIVFRQT3BlcmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSSSgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uVVJJOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uVVJJKFN0cmluZyBuZXdMb2NhdGlvblVSSSkgewotCQlTdHJpbmcgb2xkTG9jYXRpb25VUkkgPSBsb2NhdGlvblVSSTsKLQkJbG9jYXRpb25VUkkgPSBuZXdMb2NhdGlvblVSSTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0xPQ0FUSU9OX1VSSSwgb2xkTG9jYXRpb25VUkksIGxvY2F0aW9uVVJJKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19MT0NBVElPTl9VUkk6Ci0JCQkJcmV0dXJuIGdldExvY2F0aW9uVVJJKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0xPQ0FUSU9OX1VSSToKLQkJCQlzZXRMb2NhdGlvblVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19MT0NBVElPTl9VUkk6Ci0JCQkJc2V0TG9jYXRpb25VUkkoTE9DQVRJT05fVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19MT0NBVElPTl9VUkk6Ci0JCQkJcmV0dXJuIExPQ0FUSU9OX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb25VUkkgIT0gbnVsbCA6ICFMT0NBVElPTl9VUklfRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uVVJJKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxvY2F0aW9uVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsb2NhdGlvblVSSSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gIAlzZXRMb2NhdGlvblVSSQotICAgICAgKEhUVFBDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBIVFRQQ29uc3RhbnRzLkxPQ0FUSU9OX1VSSV9BVFRSSUJVVEUpKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IEhUVFBQYWNrYWdlLmVJTlNUQU5DRS5nZXRIVFRQT3BlcmF0aW9uX0xvY2F0aW9uVVJJKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxIVFRQQ29uc3RhbnRzLkxPQ0FUSU9OX1VSSV9BVFRSSUJVVEUsZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgfQotICB9Ci0KLX0gLy9IVFRQT3BlcmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUFBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiYmEzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETFBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxFbmNvZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEUGFja2FnZUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSFRUUFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGh0dHBCaW5kaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGh0dHBPcGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGh0dHBVcmxFbmNvZGVkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGh0dHBBZGRyZXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGlodHRwQWRkcmVzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpaHR0cEJpbmRpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaWh0dHBPcGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaWh0dHBVcmxFbmNvZGVkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGlodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBIVFRQUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIEhUVFBGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhUVFBQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChIVFRQUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoSFRUUFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZS4KLQkJSFRUUFBhY2thZ2VJbXBsIHRoZUhUVFBQYWNrYWdlID0gKEhUVFBQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgSFRUUFBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJWFNEUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVdTRExQYWNrYWdlSW1wbCB0aGVXU0RMUGFja2FnZSA9IChXU0RMUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChXU0RMUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KFdTRExQYWNrYWdlLmVOU19VUkkpIDogV1NETFBhY2thZ2VJbXBsLmVJTlNUQU5DRSk7Ci0KLQkJLy8gU3RlcCAxOiBjcmVhdGUgbWV0YS1tb2RlbCBvYmplY3RzCi0JCXRoZUhUVFBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXU0RMUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBTdGVwIDI6IGNvbXBsZXRlIGluaXRpYWxpemF0aW9uCi0JCXRoZUhUVFBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV1NETFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCXJldHVybiB0aGVIVFRQUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEhUVFBCaW5kaW5nKCkgewotCQlyZXR1cm4gaHR0cEJpbmRpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SFRUUEJpbmRpbmdfVmVyYigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWh0dHBCaW5kaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRIVFRQT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gaHR0cE9wZXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIVFRQT3BlcmF0aW9uX0xvY2F0aW9uVVJJKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaHR0cE9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SFRUUFVybFJlcGxhY2VtZW50KCkgewotCQlyZXR1cm4gaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SFRUUFVybEVuY29kZWQoKSB7Ci0JCXJldHVybiBodHRwVXJsRW5jb2RlZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEhUVFBBZGRyZXNzKCkgewotCQlyZXR1cm4gaHR0cEFkZHJlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SFRUUEFkZHJlc3NfTG9jYXRpb25VUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlodHRwQWRkcmVzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUhUVFBBZGRyZXNzKCkgewotCQlyZXR1cm4gaWh0dHBBZGRyZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUhUVFBCaW5kaW5nKCkgewotCQlyZXR1cm4gaWh0dHBCaW5kaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUhUVFBPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBpaHR0cE9wZXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElIVFRQVXJsRW5jb2RlZCgpIHsKLQkJcmV0dXJuIGlodHRwVXJsRW5jb2RlZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElIVFRQVXJsUmVwbGFjZW1lbnQoKSB7Ci0JCXJldHVybiBpaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQRmFjdG9yeSBnZXRIVFRQRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChIVFRQRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlodHRwQmluZGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIVFRQX0JJTkRJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGh0dHBCaW5kaW5nRUNsYXNzLCBIVFRQX0JJTkRJTkdfX1ZFUkIpOwotCi0JCWh0dHBPcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSFRUUF9PUEVSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGh0dHBPcGVyYXRpb25FQ2xhc3MsIEhUVFBfT1BFUkFUSU9OX19MT0NBVElPTl9VUkkpOwotCi0JCWh0dHBVcmxSZXBsYWNlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIVFRQX1VSTF9SRVBMQUNFTUVOVCk7Ci0KLQkJaHR0cFVybEVuY29kZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSFRUUF9VUkxfRU5DT0RFRCk7Ci0KLQkJaHR0cEFkZHJlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSFRUUF9BRERSRVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShodHRwQWRkcmVzc0VDbGFzcywgSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkkpOwotCi0JCWlodHRwQWRkcmVzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSFRUUF9BRERSRVNTKTsKLQotCQlpaHR0cEJpbmRpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUhUVFBfQklORElORyk7Ci0KLQkJaWh0dHBPcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUhUVFBfT1BFUkFUSU9OKTsKLQotCQlpaHR0cFVybEVuY29kZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUhUVFBfVVJMX0VOQ09ERUQpOwotCi0JCWlodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUhUVFBfVVJMX1JFUExBQ0VNRU5UKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJV1NETFBhY2thZ2VJbXBsIHRoZVdTRExQYWNrYWdlID0gKFdTRExQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXU0RMUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWh0dHBCaW5kaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotCQlodHRwQmluZGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElIVFRQQmluZGluZygpKTsKLQkJaHR0cE9wZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLQkJaHR0cE9wZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElIVFRQT3BlcmF0aW9uKCkpOwotCQlodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0JCWh0dHBVcmxSZXBsYWNlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElIVFRQVXJsUmVwbGFjZW1lbnQoKSk7Ci0JCWh0dHBVcmxFbmNvZGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotCQlodHRwVXJsRW5jb2RlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElIVFRQVXJsRW5jb2RlZCgpKTsKLQkJaHR0cEFkZHJlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0JCWh0dHBBZGRyZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUhUVFBBZGRyZXNzKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoaHR0cEJpbmRpbmdFQ2xhc3MsIEhUVFBCaW5kaW5nLmNsYXNzLCAiSFRUUEJpbmRpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIVFRQQmluZGluZ19WZXJiKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJiIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotCQlpbml0RUNsYXNzKGh0dHBPcGVyYXRpb25FQ2xhc3MsIEhUVFBPcGVyYXRpb24uY2xhc3MsICJIVFRQT3BlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SFRUUE9wZXJhdGlvbl9Mb2NhdGlvblVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYXRpb25VUkkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0JCWluaXRFQ2xhc3MoaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzLCBIVFRQVXJsUmVwbGFjZW1lbnQuY2xhc3MsICJIVFRQVXJsUmVwbGFjZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaHR0cFVybEVuY29kZWRFQ2xhc3MsIEhUVFBVcmxFbmNvZGVkLmNsYXNzLCAiSFRUUFVybEVuY29kZWQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaHR0cEFkZHJlc3NFQ2xhc3MsIEhUVFBBZGRyZXNzLmNsYXNzLCAiSFRUUEFkZHJlc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIVFRQQWRkcmVzc19Mb2NhdGlvblVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYXRpb25VUkkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0JCWluaXRFQ2xhc3MoaWh0dHBBZGRyZXNzRUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcy5jbGFzcywgIklIVFRQQWRkcmVzcyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaWh0dHBCaW5kaW5nRUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZy5jbGFzcywgIklIVFRQQmluZGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaWh0dHBPcGVyYXRpb25FQ2xhc3MsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24uY2xhc3MsICJJSFRUUE9wZXJhdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaWh0dHBVcmxFbmNvZGVkRUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZC5jbGFzcywgIklIVFRQVXJsRW5jb2RlZCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaWh0dHBVcmxSZXBsYWNlbWVudEVDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50LmNsYXNzLCAiSUhUVFBVcmxSZXBsYWNlbWVudCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci19IC8vSFRUUFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQVXJsRW5jb2RlZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBVcmxFbmNvZGVkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2UwZjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBVcmxFbmNvZGVkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxFbmNvZGVkOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVybCBFbmNvZGVkPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUFVybEVuY29kZWRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSFRUUFVybEVuY29kZWQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIVFRQVXJsRW5jb2RlZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBIVFRQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SFRUUFVybEVuY29kZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UOgotCQkJCXJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0hUVFBVcmxFbmNvZGVkSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUFVybFJlcGxhY2VtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUFVybFJlcGxhY2VtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGU4NWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBVcmxSZXBsYWNlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VXJsIFJlcGxhY2VtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUFVybFJlcGxhY2VtZW50SW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEhUVFBVcmxSZXBsYWNlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhUVFBVcmxSZXBsYWNlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBIVFRQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SFRUUFVybFJlcGxhY2VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UOgotCQkJCXJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vSFRUUFVybFJlcGxhY2VtZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL3V0aWwvSFRUUEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4NmE0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci0KLQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEhUVFBQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEhUVFBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIVFRQU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEhUVFBTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQQmluZGluZyhIVFRQQmluZGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSFRUUEJpbmRpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQT3BlcmF0aW9uKEhUVFBPcGVyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUhUVFBPcGVyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQVXJsUmVwbGFjZW1lbnQoSFRUUFVybFJlcGxhY2VtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVIVFRQVXJsUmVwbGFjZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQVXJsRW5jb2RlZChIVFRQVXJsRW5jb2RlZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSFRUUFVybEVuY29kZWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQQWRkcmVzcyhIVFRQQWRkcmVzcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSFRUUEFkZHJlc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUEFkZHJlc3MoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlIVFRQQWRkcmVzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQQmluZGluZyhqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSUhUVFBCaW5kaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSUhUVFBPcGVyYXRpb24oamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSUhUVFBPcGVyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUFVybEVuY29kZWQoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlIVFRQVXJsRW5jb2RlZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQVXJsUmVwbGFjZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJSFRUUFVybFJlcGxhY2VtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nIDxlbT5CaW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIVFRQQmluZGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb24gPGVtPk9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIVFRQT3BlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IDxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIVFRQVXJsUmVwbGFjZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsRW5jb2RlZCA8ZW0+VXJsIEVuY29kZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxFbmNvZGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhUVFBVcmxFbmNvZGVkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MgPGVtPkFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhUVFBBZGRyZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyA8ZW0+SUhUVFAgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSFRUUEFkZHJlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nIDxlbT5JSFRUUCBCaW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlIVFRQQmluZGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiA8ZW0+SUhUVFAgT3BlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSUhUVFBPcGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkIDxlbT5JSFRUUCBVcmwgRW5jb2RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSFRUUFVybEVuY29kZWRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCA8ZW0+SUhUVFAgVXJsIFJlcGxhY2VtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSFRUUFVybFJlcGxhY2VtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSFRUUEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDZhMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL3V0aWwvSFRUUENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBIVFRQQ29uc3RhbnRzIAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTX0VMRU1FTlRfVEFHID0gImFkZHJlc3MiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX0VMRU1FTlRfVEFHID0gImJpbmRpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJT05fRUxFTUVOVF9UQUcgPSAib3BlcmF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VOQ09ERURfRUxFTUVOVF9UQUcgPSAidXJsRW5jb2RlZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9SRVBMQUNFTUVOVF9FTEVNRU5UX1RBRyA9ICJ1cmxSZXBsYWNlbWVudCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fVVJJX0FUVFJJQlVURSA9ImxvY2F0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSQl9BVFRSSUJVVEUgPSJ2ZXJiIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgOiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDVhNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL3V0aWwvSFRUUEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSFRUUEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSBpbXBsZW1lbnRzIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeQotewotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIGlmIChIVFRQQ29uc3RhbnRzLkhUVFBfTkFNRVNQQUNFX1VSSS5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICBpZiAoSFRUUENvbnN0YW50cy5BRERSRVNTX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gSFRUUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhUVFBBZGRyZXNzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChIVFRQQ29uc3RhbnRzLkJJTkRJTkdfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBIVFRQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSFRUUEJpbmRpbmcoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEhUVFBDb25zdGFudHMuT1BFUkFUSU9OX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gSFRUUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhUVFBPcGVyYXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEhUVFBDb25zdGFudHMuVVJMX0VOQ09ERURfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAJcmV0dXJuIEhUVFBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIVFRQVXJsRW5jb2RlZCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoSFRUUENvbnN0YW50cy5VUkxfUkVQTEFDRU1FTlRfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAJcmV0dXJuIEhUVFBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIVFRQVXJsUmVwbGFjZW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVuaGFuZGxlZCBsb2NhbE5hbWU6ICIgKyBsb2NhbE5hbWUpOwotICAgICAgICByZXR1cm4gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVuaGFuZGxlZCBuYW1lc3BhY2U6ICIgKyBuYW1lc3BhY2UpOwotICAgICAgcmV0dXJuIFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyODRlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotCi0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBIVFRQUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSFRUUFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlFQ2xhc3MgdGhlRUNsYXNzID0gdGhlRU9iamVjdC5lQ2xhc3MoKTsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlzd2l0Y2ggKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HOiB7Ci0JCQkJCUhUVFBCaW5kaW5nIGh0dHBCaW5kaW5nID0gKEhUVFBCaW5kaW5nKXRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSFRUUEJpbmRpbmcoaHR0cEJpbmRpbmcpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwQmluZGluZyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlIVFRQQmluZGluZyhodHRwQmluZGluZyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGh0dHBCaW5kaW5nKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBCaW5kaW5nKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTjogewotCQkJCQlIVFRQT3BlcmF0aW9uIGh0dHBPcGVyYXRpb24gPSAoSFRUUE9wZXJhdGlvbil0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhUVFBPcGVyYXRpb24oaHR0cE9wZXJhdGlvbik7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBPcGVyYXRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSFRUUE9wZXJhdGlvbihodHRwT3BlcmF0aW9uKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoaHR0cE9wZXJhdGlvbik7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwT3BlcmF0aW9uKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVDogewotCQkJCQlIVFRQVXJsUmVwbGFjZW1lbnQgaHR0cFVybFJlcGxhY2VtZW50ID0gKEhUVFBVcmxSZXBsYWNlbWVudCl0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhUVFBVcmxSZXBsYWNlbWVudChodHRwVXJsUmVwbGFjZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwVXJsUmVwbGFjZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSFRUUFVybFJlcGxhY2VtZW50KGh0dHBVcmxSZXBsYWNlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGh0dHBVcmxSZXBsYWNlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwVXJsUmVwbGFjZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERUQ6IHsKLQkJCQkJSFRUUFVybEVuY29kZWQgaHR0cFVybEVuY29kZWQgPSAoSFRUUFVybEVuY29kZWQpdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VIVFRQVXJsRW5jb2RlZChodHRwVXJsRW5jb2RlZCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBVcmxFbmNvZGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUhUVFBVcmxFbmNvZGVkKGh0dHBVcmxFbmNvZGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoaHR0cFVybEVuY29kZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cFVybEVuY29kZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTUzogewotCQkJCQlIVFRQQWRkcmVzcyBodHRwQWRkcmVzcyA9IChIVFRQQWRkcmVzcyl0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhUVFBBZGRyZXNzKGh0dHBBZGRyZXNzKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cEFkZHJlc3MpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSFRUUEFkZHJlc3MoaHR0cEFkZHJlc3MpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChodHRwQWRkcmVzcyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwQWRkcmVzcyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSFRUUEJpbmRpbmcoSFRUUEJpbmRpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQT3BlcmF0aW9uKEhUVFBPcGVyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXJsIFJlcGxhY2VtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQVXJsUmVwbGFjZW1lbnQoSFRUUFVybFJlcGxhY2VtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXJsIEVuY29kZWQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXJsIEVuY29kZWQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBVcmxFbmNvZGVkKEhUVFBVcmxFbmNvZGVkIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWRkcmVzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQQWRkcmVzcyhIVFRQQWRkcmVzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklIVFRQIEFkZHJlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSUhUVFBBZGRyZXNzKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgQmluZGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBCaW5kaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUEJpbmRpbmcoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBPcGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgT3BlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUE9wZXJhdGlvbihqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgVXJsIEVuY29kZWQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgVXJsIEVuY29kZWQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQVXJsRW5jb2RlZChqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklIVFRQIFVybCBSZXBsYWNlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBVcmwgUmVwbGFjZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQVXJsUmVwbGFjZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXU0RMRWxlbWVudChXU0RMRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0hUVFBTd2l0Y2gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NjZmODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQjZ2V0RVBhcnQgPGVtPkVQYXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRUNvbnRlbnQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1JTUVDb250ZW50IGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlI2dldE1JTUVDb250ZW50X1R5cGUoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FUGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBhcnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVBhcnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVQYXJ0KFBhcnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRUNvbnRlbnRfRVBhcnQoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGFydCBnZXRFUGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50I2dldEVQYXJ0IDxlbT5FUGFydDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVBhcnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFUGFydChQYXJ0IHZhbHVlKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcnQoU3RyaW5nIHBhcnQpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYXJ0KCk7Ci0KLX0gLy8gTUlNRUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NWUxMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNSU1FRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCU1JTUVGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbC5NSU1FRmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRUNvbnRlbnQgY3JlYXRlTUlNRUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFydDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRVBhcnQgY3JlYXRlTUlNRVBhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk11bHRpcGFydCBSZWxhdGVkPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNSU1FTXVsdGlwYXJ0UmVsYXRlZCBjcmVhdGVNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaW1lIFhtbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWltZSBYbWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1JTUVNaW1lWG1sIGNyZWF0ZU1JTUVNaW1lWG1sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1JTUVQYWNrYWdlIGdldE1JTUVQYWNrYWdlKCk7Ci0KLX0gLy9NSU1FRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVNaW1lWG1sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRU1pbWVYbWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3OTRjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRU1pbWVYbWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWltZSBYbWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sI2dldEVQYXJ0IDxlbT5FUGFydDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlI2dldE1JTUVNaW1lWG1sKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNSU1FTWltZVhtbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVBhcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVQYXJ0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVQYXJ0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFUGFydChQYXJ0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlI2dldE1JTUVNaW1lWG1sX0VQYXJ0KCkKLQkgKiBAbW9kZWwgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBhcnQgZ2V0RVBhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbCNnZXRFUGFydCA8ZW0+RVBhcnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVQYXJ0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFUGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RVBhcnQoUGFydCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJ0KFN0cmluZyBwYXJ0KTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFydCgpOwotCi19IC8vIE1JTUVNaW1lWG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRU11bHRpcGFydFJlbGF0ZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FTXVsdGlwYXJ0UmVsYXRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjU0ZmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FTXVsdGlwYXJ0UmVsYXRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpcGFydCBSZWxhdGVkPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCNnZXRFTUlNRVBhcnQgPGVtPkVNSU1FIFBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZSNnZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTUlNRU11bHRpcGFydFJlbGF0ZWQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVNSU1FIFBhcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU1JTUUgUGFydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVNSU1FIFBhcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWRfRU1JTUVQYXJ0KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0IiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RU1JTUVQYXJ0KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBhZGRNSU1FUGFydChNSU1FUGFydCBtaW1lUGFydCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLkxpc3QiIHBhcmFtZXRlcnM9IiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNSU1FUGFydHMoKTsKLQotfSAvLyBNSU1FTXVsdGlwYXJ0UmVsYXRlZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyOTAzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNSU1FUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gIm1pbWUiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmlibS5jb20vd3NkbC8yMDAzL01JTUUiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAibWltZSI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCU1JTUVQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC5pbXBsLk1JTUVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVDb250ZW50SW1wbCA8ZW0+Q29udGVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhY2thZ2VJbXBsI2dldE1JTUVDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1JTUVfQ09OVEVOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9DT05URU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9DT05URU5UX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9DT05URU5UX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9DT05URU5UX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9DT05URU5UX19UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYXJ0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9DT05URU5UX19FUEFSVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhcnRJbXBsIDxlbT5QYXJ0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhcnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFja2FnZUltcGwjZ2V0TUlNRVBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUlNRV9QQVJUID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX1BBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX1BBUlRfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX1BBUlRfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX1BBUlRfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QYXJ0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfUEFSVF9GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwgPGVtPk11bHRpcGFydCBSZWxhdGVkPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFja2FnZUltcGwjZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUlNRV9NVUxUSVBBUlRfUkVMQVRFRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU1JTUUgUGFydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRU1JTUVfUEFSVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FTWltZVhtbEltcGwgPGVtPk1pbWUgWG1sPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRU1pbWVYbWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFja2FnZUltcGwjZ2V0TUlNRU1pbWVYbWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUlNRV9NSU1FX1hNTCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NSU1FX1hNTF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTUlNRV9YTUxfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01JTUVfWE1MX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NSU1FX1hNTF9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01JTUVfWE1MX19FUEFSVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TWltZSBYbWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NSU1FX1hNTF9GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0IDxlbT5JTUlNRSBQYXJ0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYWNrYWdlSW1wbCNnZXRJTUlNRVBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU1JTUVfUEFSVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklNSU1FIFBhcnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1JTUVfUEFSVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQgPGVtPklNSU1FIE11bHRpcGFydCBSZWxhdGVkPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYWNrYWdlSW1wbCNnZXRJTUlNRU11bHRpcGFydFJlbGF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU1JTUVfTVVMVElQQVJUX1JFTEFURUQgPSA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JTUlNRSBNdWx0aXBhcnQgUmVsYXRlZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQgPGVtPklNSU1FIENvbnRlbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhY2thZ2VJbXBsI2dldElNSU1FQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTUlNRV9DT05URU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU1JTUUgQ29udGVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUlNRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbCA8ZW0+SU1JTUUgTWltZSBYbWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhY2thZ2VJbXBsI2dldElNSU1FTWltZVhtbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTUlNRV9NSU1FX1hNTCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklNSU1FIE1pbWUgWG1sPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNSU1FX01JTUVfWE1MX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5MaXN0PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYWNrYWdlSW1wbCNnZXRMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExJU1QgPSA4OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TUlNRUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50I2dldFR5cGUoKQotCSAqIEBzZWUgI2dldE1JTUVDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNSU1FQ29udGVudF9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCNnZXRFUGFydCA8ZW0+RVBhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FUGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCNnZXRFUGFydCgpCi0JICogQHNlZSAjZ2V0TUlNRUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1JTUVDb250ZW50X0VQYXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQgPGVtPlBhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TUlNRVBhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCA8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1JTUVNdWx0aXBhcnRSZWxhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkI2dldEVNSU1FUGFydCA8ZW0+RU1JTUUgUGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RU1JTUUgUGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCNnZXRFTUlNRVBhcnQoKQotCSAqIEBzZWUgI2dldE1JTUVNdWx0aXBhcnRSZWxhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZF9FTUlNRVBhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbCA8ZW0+TWltZSBYbWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWltZSBYbWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1JTUVNaW1lWG1sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbCNnZXRFUGFydCA8ZW0+RVBhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FUGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbCNnZXRFUGFydCgpCi0JICogQHNlZSAjZ2V0TUlNRU1pbWVYbWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1JTUVNaW1lWG1sX0VQYXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCA8ZW0+SU1JTUUgUGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JTUlNRSBQYXJ0PC9lbT4nLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQiIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SU1JTUVQYXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCA8ZW0+SU1JTUUgTXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SU1JTUUgTXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJTUlNRU11bHRpcGFydFJlbGF0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IDxlbT5JTUlNRSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklNSU1FIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudCIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJTUlNRUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIDxlbT5JTUlNRSBNaW1lIFhtbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JTUlNRSBNaW1lIFhtbDwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElNSU1FTWltZVhtbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEudXRpbC5MaXN0IDxlbT5MaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5MaXN0PC9lbT4nLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS51dGlsLkxpc3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRMaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNSU1FRmFjdG9yeSBnZXRNSU1FRmFjdG9yeSgpOwotCi19IC8vTUlNRVBhY2thZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FUGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2I4MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlI2dldE1JTUVQYXJ0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNSU1FUGFydCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAbW9kZWwgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTGlzdCIgcGFyYW1ldGVycz0iIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotCi19IC8vIE1JTUVQYXJ0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWE2YTM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLnV0aWwuTUlNRUNvbnN0YW50czsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVDb250ZW50SW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FQ29udGVudEltcGwjZ2V0RVBhcnQgPGVtPkVQYXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTUlNRUNvbnRlbnRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgTUlNRUNvbnRlbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RVBhcnQoKSA8ZW0+RVBhcnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFydCBlUGFydCA9IG51bGw7Ci0JCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFydDsgLy8gVEJECi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTUlNRUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTUlNRVBhY2thZ2UuZUlOU1RBTkNFLmdldE1JTUVDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJ0IGdldEVQYXJ0KCkgewotCQlpZiAoZVBhcnQgIT0gbnVsbCAmJiBlUGFydC5lSXNQcm94eSgpKSB7Ci0JCQlQYXJ0IG9sZEVQYXJ0ID0gZVBhcnQ7Ci0JCQllUGFydCA9IChQYXJ0KWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllUGFydCk7Ci0JCQlpZiAoZVBhcnQgIT0gb2xkRVBhcnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VQQVJULCBvbGRFUGFydCwgZVBhcnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZVBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnQgYmFzaWNHZXRFUGFydCgpIHsKLQkJcmV0dXJuIGVQYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVQYXJ0KFBhcnQgbmV3RVBhcnQpIHsKLQkJUGFydCBvbGRFUGFydCA9IGVQYXJ0OwotCQllUGFydCA9IG5ld0VQYXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VQQVJULCBvbGRFUGFydCwgZVBhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydChTdHJpbmcgcGFydCkgewotICAgICAgdGhpcy5wYXJ0ID0gcGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0KCkgewotICAgICAgcmV0dXJuIHBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FUEFSVDoKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVQYXJ0KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RVBhcnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VQQVJUOgotCQkJCXNldEVQYXJ0KChQYXJ0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRVBBUlQ6Ci0JCQkJc2V0RVBhcnQoKFBhcnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRVBBUlQ6Ci0JCQkJcmV0dXJuIGVQYXJ0ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgCXNldFBhcnQKLSAgICAgIChNSU1FQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgTUlNRUNvbnN0YW50cy5QQVJUX0FUVFJJQlVURSkpOwotICAJc2V0VHlwZQotICAgICAgKE1JTUVDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBNSU1FQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBNSU1FUGFja2FnZS5lSU5TVEFOQ0UuIGdldE1JTUVDb250ZW50X0VQYXJ0KCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxNSU1FQ29uc3RhbnRzLlBBUlRfQVRUUklCVVRFLGdldFBhcnQoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gTUlNRVBhY2thZ2UuZUlOU1RBTkNFLiBnZXRNSU1FQ29udGVudF9UeXBlKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxNSU1FQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLGdldFR5cGUoKSk7Ci0gICAgfQotICB9Ci0KLX0gLy9NSU1FQ29udGVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzhhNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTUlNRUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgTUlNRUZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgYW5kIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UOiByZXR1cm4gY3JlYXRlTUlNRUNvbnRlbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUOiByZXR1cm4gY3JlYXRlTUlNRVBhcnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRDogcmV0dXJuIGNyZWF0ZU1JTUVNdWx0aXBhcnRSZWxhdGVkKCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUw6IHJldHVybiBjcmVhdGVNSU1FTWltZVhtbCgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTElTVDoKLQkJCQlyZXR1cm4gY3JlYXRlTGlzdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTElTVDoKLQkJCQlyZXR1cm4gY29udmVydExpc3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1JTUVDb250ZW50IGNyZWF0ZU1JTUVDb250ZW50KCkgewotCQlNSU1FQ29udGVudEltcGwgbWltZUNvbnRlbnQgPSBuZXcgTUlNRUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBtaW1lQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTUlNRVBhcnQgY3JlYXRlTUlNRVBhcnQoKSB7Ci0JCU1JTUVQYXJ0SW1wbCBtaW1lUGFydCA9IG5ldyBNSU1FUGFydEltcGwoKTsKLQkJcmV0dXJuIG1pbWVQYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FTXVsdGlwYXJ0UmVsYXRlZCBjcmVhdGVNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpIHsKLQkJTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsIG1pbWVNdWx0aXBhcnRSZWxhdGVkID0gbmV3IE1JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbCgpOwotCQlyZXR1cm4gbWltZU11bHRpcGFydFJlbGF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1JTUVNaW1lWG1sIGNyZWF0ZU1JTUVNaW1lWG1sKCkgewotCQlNSU1FTWltZVhtbEltcGwgbWltZU1pbWVYbWwgPSBuZXcgTUlNRU1pbWVYbWxJbXBsKCk7Ci0JCXJldHVybiBtaW1lTWltZVhtbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBjcmVhdGVMaXN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoTGlzdClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRMaXN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FUGFja2FnZSBnZXRNSU1FUGFja2FnZSgpIHsKLQkJcmV0dXJuIChNSU1FUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNSU1FUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTUlNRVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLX0gLy9NSU1FRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVNaW1lWG1sSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRU1pbWVYbWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTRiNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRU1pbWVYbWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwudXRpbC5NSU1FQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbWUgWG1sPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FTWltZVhtbEltcGwjZ2V0RVBhcnQgPGVtPkVQYXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTUlNRU1pbWVYbWxJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgTUlNRU1pbWVYbWwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVQYXJ0KCkgPGVtPkVQYXJ0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFUGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBhcnQgZVBhcnQgPSBudWxsOwotCQotICAgIHByaXZhdGUgU3RyaW5nIHBhcnQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTUlNRU1pbWVYbWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTUlNRVBhY2thZ2UuZUlOU1RBTkNFLmdldE1JTUVNaW1lWG1sKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnQgZ2V0RVBhcnQoKSB7Ci0JCWlmIChlUGFydCAhPSBudWxsICYmIGVQYXJ0LmVJc1Byb3h5KCkpIHsKLQkJCVBhcnQgb2xkRVBhcnQgPSBlUGFydDsKLQkJCWVQYXJ0ID0gKFBhcnQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVQYXJ0KTsKLQkJCWlmIChlUGFydCAhPSBvbGRFUGFydCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VQQVJULCBvbGRFUGFydCwgZVBhcnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZVBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnQgYmFzaWNHZXRFUGFydCgpIHsKLQkJcmV0dXJuIGVQYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVQYXJ0KFBhcnQgbmV3RVBhcnQpIHsKLQkJUGFydCBvbGRFUGFydCA9IGVQYXJ0OwotCQllUGFydCA9IG5ld0VQYXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FUEFSVCwgb2xkRVBhcnQsIGVQYXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnQoU3RyaW5nIHBhcnQpIHsKLSAgICAgIHRoaXMucGFydCA9IHBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydCgpIHsKLSAgICAgIHJldHVybiBwYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VQQVJUOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RVBhcnQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFUGFydCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRVBBUlQ6Ci0JCQkJc2V0RVBhcnQoKFBhcnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FUEFSVDoKLQkJCQlzZXRFUGFydCgoUGFydCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRVBBUlQ6Ci0JCQkJcmV0dXJuIGVQYXJ0ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gIAlzZXRQYXJ0Ci0gICAgICAoTUlNRUNvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIE1JTUVDb25zdGFudHMuUEFSVF9BVFRSSUJVVEUpKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IE1JTUVQYWNrYWdlLmVJTlNUQU5DRS4gZ2V0TUlNRUNvbnRlbnRfRVBhcnQoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LE1JTUVDb25zdGFudHMuUEFSVF9BVFRSSUJVVEUsZ2V0UGFydCgpKTsKLSAgICB9Ci0gIH0KLQotfSAvL01JTUVNaW1lWG1sSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwNjE4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbCNnZXRFTUlNRVBhcnQgPGVtPkVNSU1FIFBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBNSU1FTXVsdGlwYXJ0UmVsYXRlZCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RU1JTUVQYXJ0KCkgPGVtPkVNSU1FIFBhcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RU1JTUVQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZU1JTUVQYXJ0ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNSU1FUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RU1JTUVQYXJ0KCkgewotCQlpZiAoZU1JTUVQYXJ0ID09IG51bGwpIHsKLQkJCWVNSU1FUGFydCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNSU1FUGFydC5jbGFzcywgdGhpcywgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRU1JTUVfUEFSVCk7Ci0JCX0KLQkJcmV0dXJuIGVNSU1FUGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNSU1FUGFydChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCBtaW1lUGFydCkgewotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0TUlNRVBhcnRzKCkgewotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTUlNRV9QQVJUOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVNSU1FUGFydCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTUlNRV9QQVJUOgotCQkJCXJldHVybiBnZXRFTUlNRVBhcnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VNSU1FX1BBUlQ6Ci0JCQkJZ2V0RU1JTUVQYXJ0KCkuY2xlYXIoKTsKLQkJCQlnZXRFTUlNRVBhcnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTUlNRV9QQVJUOgotCQkJCWdldEVNSU1FUGFydCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UOgotCQkJCXJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VNSU1FX1BBUlQ6Ci0JCQkJcmV0dXJuIGVNSU1FUGFydCAhPSBudWxsICYmICFlTUlNRVBhcnQuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0JCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgfQotICAKLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gIH0KLQotfSAvL01JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRVBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxNmRiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETFBhY2thZ2VJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEUGFja2FnZUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTUlNRVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgTUlNRVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbWVDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbWVQYXJ0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbWVNaW1lWG1sRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGltaW1lUGFydEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW1pbWVDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGltaW1lTWltZVhtbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBsaXN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTUlNRVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBNSU1FRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNSU1FUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoTUlNRVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KE1JTUVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UuCi0JCU1JTUVQYWNrYWdlSW1wbCB0aGVNSU1FUGFja2FnZSA9IChNSU1FUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IE1JTUVQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhTRFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlXU0RMUGFja2FnZUltcGwgdGhlV1NETFBhY2thZ2UgPSAoV1NETFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoV1NETFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChXU0RMUGFja2FnZS5lTlNfVVJJKSA6IFdTRExQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOwotCi0JCS8vIFN0ZXAgMTogY3JlYXRlIG1ldGEtbW9kZWwgb2JqZWN0cwotCQl0aGVNSU1FUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV1NETFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gU3RlcCAyOiBjb21wbGV0ZSBpbml0aWFsaXphdGlvbgotCQl0aGVNSU1FUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdTRExQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQlyZXR1cm4gdGhlTUlNRVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNSU1FQ29udGVudCgpIHsKLQkJcmV0dXJuIG1pbWVDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1JTUVDb250ZW50X1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltaW1lQ29udGVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1JTUVDb250ZW50X0VQYXJ0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWltZUNvbnRlbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1JTUVQYXJ0KCkgewotCQlyZXR1cm4gbWltZVBhcnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpIHsKLQkJcmV0dXJuIG1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1JTUVNdWx0aXBhcnRSZWxhdGVkX0VNSU1FUGFydCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNSU1FTWltZVhtbCgpIHsKLQkJcmV0dXJuIG1pbWVNaW1lWG1sRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1JTUVNaW1lWG1sX0VQYXJ0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWltZU1pbWVYbWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElNSU1FUGFydCgpIHsKLQkJcmV0dXJuIGltaW1lUGFydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpIHsKLQkJcmV0dXJuIGltaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElNSU1FQ29udGVudCgpIHsKLQkJcmV0dXJuIGltaW1lQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElNSU1FTWltZVhtbCgpIHsKLQkJcmV0dXJuIGltaW1lTWltZVhtbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExpc3QoKSB7Ci0JCXJldHVybiBsaXN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FRmFjdG9yeSBnZXRNSU1FRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChNSU1FRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQltaW1lQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSU1FX0NPTlRFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1pbWVDb250ZW50RUNsYXNzLCBNSU1FX0NPTlRFTlRfX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1pbWVDb250ZW50RUNsYXNzLCBNSU1FX0NPTlRFTlRfX0VQQVJUKTsKLQotCQltaW1lUGFydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSU1FX1BBUlQpOwotCi0JCW1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JTUVfTVVMVElQQVJUX1JFTEFURUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzLCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTUlNRV9QQVJUKTsKLQotCQltaW1lTWltZVhtbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSU1FX01JTUVfWE1MKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtaW1lTWltZVhtbEVDbGFzcywgTUlNRV9NSU1FX1hNTF9fRVBBUlQpOwotCi0JCWltaW1lUGFydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTUlNRV9QQVJUKTsKLQotCQlpbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1JTUVfTVVMVElQQVJUX1JFTEFURUQpOwotCi0JCWltaW1lQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTUlNRV9DT05URU5UKTsKLQotCQlpbWltZU1pbWVYbWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1JTUVfTUlNRV9YTUwpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCWxpc3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTElTVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVdTRExQYWNrYWdlSW1wbCB0aGVXU0RMUGFja2FnZSA9IChXU0RMUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQltaW1lQ29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLQkJbWltZUNvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJTUlNRUNvbnRlbnQoKSk7Ci0JCW1pbWVQYXJ0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotCQltaW1lUGFydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElNSU1FUGFydCgpKTsKLQkJbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0JCW1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SU1JTUVNdWx0aXBhcnRSZWxhdGVkKCkpOwotCQltaW1lTWltZVhtbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLQkJbWltZU1pbWVYbWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJTUlNRU1pbWVYbWwoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhtaW1lQ29udGVudEVDbGFzcywgTUlNRUNvbnRlbnQuY2xhc3MsICJNSU1FQ29udGVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1JTUVDb250ZW50X1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNSU1FQ29udGVudF9FUGFydCgpLCB0aGVXU0RMUGFja2FnZS5nZXRQYXJ0KCksIG51bGwsICJlUGFydCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLQkJRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24obWltZUNvbnRlbnRFQ2xhc3MsIG51bGwsICJzZXRQYXJ0Iik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJ0Iik7Ci0KLQkJYWRkRU9wZXJhdGlvbihtaW1lQ29udGVudEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldFBhcnQiKTsKLQotCQlpbml0RUNsYXNzKG1pbWVQYXJ0RUNsYXNzLCBNSU1FUGFydC5jbGFzcywgIk1JTUVQYXJ0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWltZVBhcnRFQ2xhc3MsIG51bGwsICJhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGVXU0RMUGFja2FnZS5nZXRJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSwgImV4dGVuc2liaWxpdHlFbGVtZW50Iik7Ci0KLQkJYWRkRU9wZXJhdGlvbihtaW1lUGFydEVDbGFzcywgdGhpcy5nZXRMaXN0KCksICJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiKTsKLQotCQlpbml0RUNsYXNzKG1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzLCBNSU1FTXVsdGlwYXJ0UmVsYXRlZC5jbGFzcywgIk1JTUVNdWx0aXBhcnRSZWxhdGVkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWRfRU1JTUVQYXJ0KCksIHRoaXMuZ2V0TUlNRVBhcnQoKSwgbnVsbCwgImVNSU1FUGFydCIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcywgbnVsbCwgImFkZE1JTUVQYXJ0Iik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SU1JTUVQYXJ0KCksICJtaW1lUGFydCIpOwotCi0JCWFkZEVPcGVyYXRpb24obWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MsIHRoaXMuZ2V0TGlzdCgpLCAiZ2V0TUlNRVBhcnRzIik7Ci0KLQkJaW5pdEVDbGFzcyhtaW1lTWltZVhtbEVDbGFzcywgTUlNRU1pbWVYbWwuY2xhc3MsICJNSU1FTWltZVhtbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1JTUVNaW1lWG1sX0VQYXJ0KCksIHRoZVdTRExQYWNrYWdlLmdldFBhcnQoKSwgbnVsbCwgImVQYXJ0IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWltZU1pbWVYbWxFQ2xhc3MsIG51bGwsICJzZXRQYXJ0Iik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJ0Iik7Ci0KLQkJYWRkRU9wZXJhdGlvbihtaW1lTWltZVhtbEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldFBhcnQiKTsKLQotCQlpbml0RUNsYXNzKGltaW1lUGFydEVDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQuY2xhc3MsICJJTUlNRVBhcnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQlpbml0RUNsYXNzKGltaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQuY2xhc3MsICJJTUlNRU11bHRpcGFydFJlbGF0ZWQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQlpbml0RUNsYXNzKGltaW1lQ29udGVudEVDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQuY2xhc3MsICJJTUlNRUNvbnRlbnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQlpbml0RUNsYXNzKGltaW1lTWltZVhtbEVDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwuY2xhc3MsICJJTUlNRU1pbWVYbWwiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLQkJaW5pdEVEYXRhVHlwZShsaXN0RURhdGFUeXBlLCBMaXN0LmNsYXNzLCAiTGlzdCIsIElTX1NFUklBTElaQUJMRSk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLX0gLy9NSU1FUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVQYXJ0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRVBhcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NDQ4NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRVBhcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJ0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTUlNRVBhcnRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgTUlNRVBhcnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNSU1FUGFydEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNSU1FUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TUlNRVBhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkgewotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgewotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL01JTUVQYXJ0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4ODdlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1JTUVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTUlNRUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1JTUVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNSU1FU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IE1JTUVTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FQ29udGVudChNSU1FQ29udGVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTUlNRUNvbnRlbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FUGFydChNSU1FUGFydCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTUlNRVBhcnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FTXVsdGlwYXJ0UmVsYXRlZChNSU1FTXVsdGlwYXJ0UmVsYXRlZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTUlNRU11bHRpcGFydFJlbGF0ZWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FTWltZVhtbChNSU1FTWltZVhtbCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTUlNRU1pbWVYbWxBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJTUlNRVBhcnQoamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlNSU1FUGFydEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlNSU1FTXVsdGlwYXJ0UmVsYXRlZChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSU1JTUVNdWx0aXBhcnRSZWxhdGVkQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSU1JTUVDb250ZW50KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJTUlNRUNvbnRlbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJTUlNRU1pbWVYbWwoamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlNSU1FTWltZVhtbEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXU0RMRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTUlNRUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydCA8ZW0+UGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTUlNRVBhcnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCA8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1JTUVNdWx0aXBhcnRSZWxhdGVkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWwgPGVtPk1pbWUgWG1sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNSU1FTWltZVhtbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQgPGVtPklNSU1FIFBhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSU1JTUVQYXJ0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCA8ZW0+SU1JTUUgTXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSU1JTUVNdWx0aXBhcnRSZWxhdGVkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudCA8ZW0+SU1JTUUgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJTUlNRUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIDxlbT5JTUlNRSBNaW1lIFhtbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJTUlNRU1pbWVYbWxBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9NSU1FQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTg5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1JTUVDb25zdGFudHMgCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRUxFTUVOVF9UQUcgPSAiY29udGVudCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfWE1MX0VMRU1FTlRfVEFHID0gIm1pbWVYTUwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBBUlRfUkVMQVRFRF9FTEVNRU5UX1RBRyA9ICJtdWx0aXBhcnRSZWxhdGVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9FTEVNRU5UX1RBRyA9ICJwYXJ0IjsKLQkgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9BVFRSSUJVVEUgPSJwYXJ0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9BVFRSSUJVVEUgPSJ0eXBlIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgOiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOGEwZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRUV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTUlNRUV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSBpbXBsZW1lbnRzIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeQotewotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIGlmIChNSU1FQ29uc3RhbnRzLk1JTUVfTkFNRVNQQUNFX1VSSS5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICBpZiAoTUlNRUNvbnN0YW50cy5DT05URU5UX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gTUlNRUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1JTUVDb250ZW50KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChNSU1FQ29uc3RhbnRzLk1JTUVfWE1MX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gTUlNRUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1JTUVNaW1lWG1sKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChNSU1FQ29uc3RhbnRzLk1VTFRJUEFSVF9SRUxBVEVEX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gTUlNRUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1JTUVNdWx0aXBhcnRSZWxhdGVkKCk7Ci0gICAgICB9Ci0gICAgICAvKiBUT0RPIC0gZml4IHRoZSByb3NlIG1vZGVsCi0gICAgICBlbHNlIGlmICgicGFydCIuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBNSU1FRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTUlNRVBhcnQoKTsKLSAgICAgIH0KLSAgICAgICovCi0JICBlbHNlCi0JICB7Ci0JICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJVbmhhbmRsZWQgbG9jYWxOYW1lOiAiICsgbG9jYWxOYW1lKTsKLQkgICAgcmV0dXJuIFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJVbmhhbmRsZWQgbmFtZXNwYWNlOiAiICsgbmFtZXNwYWNlKTsKLSAgICAgIHJldHVybiBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FU3dpdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYTU2ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1JTUVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTUlNRVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNSU1FUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCUVDbGFzcyB0aGVFQ2xhc3MgPSB0aGVFT2JqZWN0LmVDbGFzcygpOwotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlQ6IHsKLQkJCQkJTUlNRUNvbnRlbnQgbWltZUNvbnRlbnQgPSAoTUlNRUNvbnRlbnQpdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNSU1FQ29udGVudChtaW1lQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KG1pbWVDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU1JTUVDb250ZW50KG1pbWVDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQobWltZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQobWltZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVDogewotCQkJCQlNSU1FUGFydCBtaW1lUGFydCA9IChNSU1FUGFydCl0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1JTUVQYXJ0KG1pbWVQYXJ0KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQobWltZVBhcnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJTUlNRVBhcnQobWltZVBhcnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChtaW1lUGFydCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChtaW1lUGFydCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRDogewotCQkJCQlNSU1FTXVsdGlwYXJ0UmVsYXRlZCBtaW1lTXVsdGlwYXJ0UmVsYXRlZCA9IChNSU1FTXVsdGlwYXJ0UmVsYXRlZCl0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1JTUVNdWx0aXBhcnRSZWxhdGVkKG1pbWVNdWx0aXBhcnRSZWxhdGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQobWltZU11bHRpcGFydFJlbGF0ZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJTUlNRU11bHRpcGFydFJlbGF0ZWQobWltZU11bHRpcGFydFJlbGF0ZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChtaW1lTXVsdGlwYXJ0UmVsYXRlZCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChtaW1lTXVsdGlwYXJ0UmVsYXRlZCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTDogewotCQkJCQlNSU1FTWltZVhtbCBtaW1lTWltZVhtbCA9IChNSU1FTWltZVhtbCl0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1JTUVNaW1lWG1sKG1pbWVNaW1lWG1sKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQobWltZU1pbWVYbWwpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJTUlNRU1pbWVYbWwobWltZU1pbWVYbWwpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChtaW1lTWltZVhtbCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChtaW1lTWltZVhtbCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTUlNRUNvbnRlbnQoTUlNRUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJ0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1JTUVQYXJ0KE1JTUVQYXJ0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1JTUVNdWx0aXBhcnRSZWxhdGVkKE1JTUVNdWx0aXBhcnRSZWxhdGVkIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWltZSBYbWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWltZSBYbWw8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1JTUVNaW1lWG1sKE1JTUVNaW1lWG1sIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgUGFydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTUlNRSBQYXJ0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJTUlNRVBhcnQoamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTUlNRSBNdWx0aXBhcnQgUmVsYXRlZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTUlNRSBNdWx0aXBhcnQgUmVsYXRlZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSU1JTUVNdWx0aXBhcnRSZWxhdGVkKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgQ29udGVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTUlNRSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJTUlNRUNvbnRlbnQoamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTUlNRSBNaW1lIFhtbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTUlNRSBNaW1lIFhtbDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSU1JTUVNaW1lWG1sKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXU0RMRWxlbWVudChXU0RMRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL01JTUVTd2l0Y2gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQQWRkcmVzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBBZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZWZlYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZGRyZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzcyNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEFkZHJlc3MoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBBZGRyZXNzIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzIHsKLQotCi19IC8vIFNPQVBBZGRyZXNzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzU0MTRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcjZ2V0VHJhbnNwb3J0VVJJIDxlbT5UcmFuc3BvcnQgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEJpbmRpbmcoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBCaW5kaW5nIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nIHsKLX0gLy8gU09BUEJpbmRpbmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQQm9keS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBCb2R5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDE2YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBCb2R5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Cb2R5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXRVc2UgPGVtPlVzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldEVuY29kaW5nU3R5bGVzIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXRQYXJ0cyA8ZW0+UGFydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQQm9keSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEJvZHkgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHkgewotfSAvLyBTT0FQQm9keQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3YzI0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5ewotICAvKioKLSAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEZhY3RvcnlJbXBsKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBCaW5kaW5nIGNyZWF0ZVNPQVBCaW5kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Qm9keTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Cb2R5PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBCb2R5IGNyZWF0ZVNPQVBCb2R5KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGVhZGVyIEJhc2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGVhZGVyIEJhc2U8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUEhlYWRlckJhc2UgY3JlYXRlU09BUEhlYWRlckJhc2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GYXVsdDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GYXVsdDwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQRmF1bHQgY3JlYXRlU09BUEZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQT3BlcmF0aW9uIGNyZWF0ZVNPQVBPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZGRyZXNzPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFkZHJlc3M8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUEFkZHJlc3MgY3JlYXRlU09BUEFkZHJlc3MoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IZWFkZXIgRmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGVhZGVyIEZhdWx0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBIZWFkZXJGYXVsdCBjcmVhdGVTT0FQSGVhZGVyRmF1bHQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IZWFkZXI8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SGVhZGVyPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBIZWFkZXIgY3JlYXRlU09BUEhlYWRlcigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQUGFja2FnZSBnZXRTT0FQUGFja2FnZSgpOwotCi19IC8vU09BUEZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQRmF1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQRmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1NmJmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0I2dldFVzZSA8ZW0+VXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdCNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEZhdWx0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQRmF1bHQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0IHsKLQotfSAvLyBTT0FQRmF1bHQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEhlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjkzMTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyI2dldEhlYWRlckZhdWx0cyA8ZW0+SGVhZGVyIEZhdWx0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBIZWFkZXIoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBIZWFkZXIgZXh0ZW5kcyBTT0FQSGVhZGVyQmFzZSB7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IZWFkZXIgRmF1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhlYWRlciBGYXVsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVhZGVyIEZhdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEhlYWRlcl9IZWFkZXJGYXVsdHMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0SGVhZGVyRmF1bHRzKCk7Ci0KLX0gLy8gU09BUEhlYWRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBIZWFkZXJCYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEhlYWRlckJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViYjllNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEhlYWRlckJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhlYWRlciBCYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRVc2UgPGVtPlVzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldEVuY29kaW5nU3R5bGVzIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRNZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0UGFydCA8ZW0+UGFydDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBIZWFkZXJCYXNlKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQSGVhZGVyQmFzZSBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2U8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRVc2UoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyQmFzZV9Vc2UoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldFVzZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0VXNlIDxlbT5Vc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0VXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFVzZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWVzcGFjZVVSSShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBIZWFkZXJCYXNlX05hbWVzcGFjZVVSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW5jb2RpbmcgU3R5bGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBIZWFkZXJCYXNlX0VuY29kaW5nU3R5bGVzKCkKLSAgICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuSVN0cmluZyIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFbmNvZGluZ1N0eWxlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldE1lc3NhZ2UoTWVzc2FnZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEhlYWRlckJhc2VfTWVzc2FnZSgpCi0gICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlNZXNzYWdlIGdldE1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldE1lc3NhZ2UgPGVtPk1lc3NhZ2U8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TWVzc2FnZShNZXNzYWdlIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcnQ8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRQYXJ0KFBhcnQpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBIZWFkZXJCYXNlX1BhcnQoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUGFydCBnZXRQYXJ0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRQYXJ0IDxlbT5QYXJ0PC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnQ8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFBhcnQoUGFydCB2YWx1ZSk7Ci0KLX0gLy8gU09BUEhlYWRlckJhc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyRmF1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyRmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ODg1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEhlYWRlckZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IZWFkZXIgRmF1bHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZ3Muc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyRmF1bHQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBIZWFkZXJGYXVsdCBleHRlbmRzIFNPQVBIZWFkZXJCYXNlIHsKLX0gLy8gU09BUEhlYWRlckZhdWx0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUE9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUzOGRkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3BlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uI2dldFNvYXBBY3Rpb25VUkkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24jZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUE9wZXJhdGlvbigpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUE9wZXJhdGlvbiBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uIHsKLX0gLy8gU09BUE9wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmYWU1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0gIC8qKgotICAgKiBUaGUgcGFja2FnZSBuYW1lLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBlTkFNRSA9ICJzb2FwIjsKLQotICAvKioKLSAgICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmlibS5jb20vd3NkbC8yMDAzL1NPQVAiOwotCi0gIC8qKgotICAgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJzb2FwIjsKLQotICAvKioKLSAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwuaW5pdCgpOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCaW5kaW5nSW1wbCA8ZW0+QmluZGluZzwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEJpbmRpbmdJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUFBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HID0gMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfX1RSQU5TUE9SVF9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfX1NUWUxFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJpbmRpbmc8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQklORElOR19GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCb2R5SW1wbCA8ZW0+Qm9keTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEJvZHlJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUFBhY2thZ2VJbXBsI2dldFNPQVBCb2R5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZID0gMTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQk9EWV9fVVNFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX05BTUVTUEFDRV9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmNvZGluZyBTdHlsZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX0VOQ09ESU5HX1NUWUxFUyA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19QQVJUUyA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Cb2R5PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyQmFzZUltcGwgPGVtPkhlYWRlciBCYXNlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyQmFzZUltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0U09BUEhlYWRlckJhc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFID0gMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19VU0UgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0JBU0VfX05BTUVTUEFDRV9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmNvZGluZyBTdHlsZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVMgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0UgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0JBU0VfX1BBUlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SGVhZGVyIEJhc2U8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0JBU0VfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQRmF1bHRJbXBsIDxlbT5GYXVsdDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEZhdWx0SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRTT0FQRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUID0gMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9GQVVMVF9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfRkFVTFRfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX19VU0UgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfRkFVTFRfX05BTUVTUEFDRV9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmNvZGluZyBTdHlsZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX19FTkNPRElOR19TVFlMRVMgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RmF1bHQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfRkFVTFRfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQT3BlcmF0aW9uSW1wbCA8ZW0+T3BlcmF0aW9uPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQT3BlcmF0aW9uSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRTT0FQT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9PUEVSQVRJT04gPSA0OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9PUEVSQVRJT05fX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX09QRVJBVElPTl9fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfT1BFUkFUSU9OX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQWN0aW9uIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX09QRVJBVElPTl9fU09BUF9BQ1RJT05fVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9PUEVSQVRJT05fX1NUWUxFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk9wZXJhdGlvbjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9PUEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQWRkcmVzc0ltcGwgPGVtPkFkZHJlc3M8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBBZGRyZXNzSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRTT0FQQWRkcmVzcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IFNPQVBfQUREUkVTUyA9IDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9BRERSRVNTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9BRERSRVNTX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9BRERSRVNTX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9BRERSRVNTX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BZGRyZXNzPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0FERFJFU1NfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyRmF1bHRJbXBsIDxlbT5IZWFkZXIgRmF1bHQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJGYXVsdEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0U09BUEhlYWRlckZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFQgPSA2OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBTT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19FTEVNRU5UID0gU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19SRVFVSVJFRCA9IFNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19FTEVNRU5UX1RZUEUgPSBTT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFRfX1VTRSA9IFNPQVBfSEVBREVSX0JBU0VfX1VTRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFRfX05BTUVTUEFDRV9VUkkgPSBTT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2RpbmcgU3R5bGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUyA9IFNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFRfX01FU1NBR0UgPSBTT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9GQVVMVF9fUEFSVCA9IFNPQVBfSEVBREVSX0JBU0VfX1BBUlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SGVhZGVyIEZhdWx0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9GQVVMVF9GRUFUVVJFX0NPVU5UID0gU09BUF9IRUFERVJfQkFTRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVySW1wbCA8ZW0+SGVhZGVyPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVySW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRTT0FQSGVhZGVyKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVIgPSA3OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBTT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19FTEVNRU5UID0gU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19SRVFVSVJFRCA9IFNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19FTEVNRU5UX1RZUEUgPSBTT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfX1VTRSA9IFNPQVBfSEVBREVSX0JBU0VfX1VTRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfX05BTUVTUEFDRV9VUkkgPSBTT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2RpbmcgU3R5bGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfX0VOQ09ESU5HX1NUWUxFUyA9IFNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfX01FU1NBR0UgPSBTT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9fUEFSVCA9IFNPQVBfSEVBREVSX0JBU0VfX1BBUlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWFkZXIgRmF1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfX0hFQURFUl9GQVVMVFMgPSBTT0FQX0hFQURFUl9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkhlYWRlcjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkVBVFVSRV9DT1VOVCA9IFNPQVBfSEVBREVSX0JBU0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SVN0cmluZzwvZW0+JyBkYXRhIHR5cGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRJU3RyaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgSVNUUklORyA9IDg7Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nIDxlbT5CaW5kaW5nPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUEJpbmRpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcjZ2V0VHJhbnNwb3J0VVJJIDxlbT5UcmFuc3BvcnQgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFuc3BvcnQgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyNnZXRUcmFuc3BvcnRVUkkoKQotICAgKiBAc2VlICNnZXRTT0FQQmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQQmluZGluZ19UcmFuc3BvcnRVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdHlsZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcjZ2V0U3R5bGUoKQotICAgKiBAc2VlICNnZXRTT0FQQmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQQmluZGluZ19TdHlsZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkgPGVtPkJvZHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Cb2R5PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVDbGFzcyBnZXRTT0FQQm9keSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXRVc2UgPGVtPlVzZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXRVc2UoKQotICAgKiBAc2VlICNnZXRTT0FQQm9keSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQQm9keV9Vc2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAc2VlICNnZXRTT0FQQm9keSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQQm9keV9OYW1lc3BhY2VVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0RW5jb2RpbmdTdHlsZXMoKQotICAgKiBAc2VlICNnZXRTT0FQQm9keSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQQm9keV9FbmNvZGluZ1N0eWxlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldFBhcnRzIDxlbT5QYXJ0czwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5QYXJ0czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0UGFydHMoKQotICAgKiBAc2VlICNnZXRTT0FQQm9keSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRVJlZmVyZW5jZSBnZXRTT0FQQm9keV9QYXJ0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UgPGVtPkhlYWRlciBCYXNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SGVhZGVyIEJhc2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUNsYXNzIGdldFNPQVBIZWFkZXJCYXNlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFVzZSA8ZW0+VXNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFVzZSgpCi0gICAqIEBzZWUgI2dldFNPQVBIZWFkZXJCYXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBIZWFkZXJCYXNlX1VzZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBzZWUgI2dldFNPQVBIZWFkZXJCYXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBIZWFkZXJCYXNlX05hbWVzcGFjZVVSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldEVuY29kaW5nU3R5bGVzIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRFbmNvZGluZ1N0eWxlcygpCi0gICAqIEBzZWUgI2dldFNPQVBIZWFkZXJCYXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBIZWFkZXJCYXNlX0VuY29kaW5nU3R5bGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldE1lc3NhZ2UgPGVtPk1lc3NhZ2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk1lc3NhZ2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldE1lc3NhZ2UoKQotICAgKiBAc2VlICNnZXRTT0FQSGVhZGVyQmFzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRVJlZmVyZW5jZSBnZXRTT0FQSGVhZGVyQmFzZV9NZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFBhcnQgPGVtPlBhcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlBhcnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFBhcnQoKQotICAgKiBAc2VlICNnZXRTT0FQSGVhZGVyQmFzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRVJlZmVyZW5jZSBnZXRTT0FQSGVhZGVyQmFzZV9QYXJ0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQgPGVtPkZhdWx0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVDbGFzcyBnZXRTT0FQRmF1bHQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0I2dldFVzZSA8ZW0+VXNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdCNnZXRVc2UoKQotICAgKiBAc2VlICNnZXRTT0FQRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEZhdWx0X1VzZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQHNlZSAjZ2V0U09BUEZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBGYXVsdF9OYW1lc3BhY2VVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQjZ2V0RW5jb2RpbmdTdHlsZXMgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdCNnZXRFbmNvZGluZ1N0eWxlcygpCi0gICAqIEBzZWUgI2dldFNPQVBGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQRmF1bHRfRW5jb2RpbmdTdHlsZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24gPGVtPk9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVDbGFzcyBnZXRTT0FQT3BlcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24jZ2V0U29hcEFjdGlvblVSSSA8ZW0+U29hcCBBY3Rpb24gVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb2FwIEFjdGlvbiBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24jZ2V0U29hcEFjdGlvblVSSSgpCi0gICAqIEBzZWUgI2dldFNPQVBPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUE9wZXJhdGlvbl9Tb2FwQWN0aW9uVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24jZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdHlsZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbiNnZXRTdHlsZSgpCi0gICAqIEBzZWUgI2dldFNPQVBPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUE9wZXJhdGlvbl9TdHlsZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3MgPGVtPkFkZHJlc3M8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BZGRyZXNzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzcwotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVDbGFzcyBnZXRTT0FQQWRkcmVzcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzcyNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzI2dldExvY2F0aW9uVVJJKCkKLSAgICogQHNlZSAjZ2V0U09BUEFkZHJlc3MoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEFkZHJlc3NfTG9jYXRpb25VUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdCA8ZW0+SGVhZGVyIEZhdWx0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SGVhZGVyIEZhdWx0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUEhlYWRlckZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyIDxlbT5IZWFkZXI8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5IZWFkZXI8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUEhlYWRlcigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXIjZ2V0SGVhZGVyRmF1bHRzIDxlbT5IZWFkZXIgRmF1bHRzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhlYWRlciBGYXVsdHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXIjZ2V0SGVhZGVyRmF1bHRzKCkKLSAgICogQHNlZSAjZ2V0U09BUEhlYWRlcigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRVJlZmVyZW5jZSBnZXRTT0FQSGVhZGVyX0hlYWRlckZhdWx0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SVN0cmluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5JU3RyaW5nPC9lbT4nLgotICAgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRURhdGFUeXBlIGdldElTdHJpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBGYWN0b3J5IGdldFNPQVBGYWN0b3J5KCk7Ci0KLX0gLy9TT0FQUGFja2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEFkZHJlc3NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQWRkcmVzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwN2Q0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQWRkcmVzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkZHJlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBBZGRyZXNzSW1wbCNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEFkZHJlc3NJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEFkZHJlc3MgewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb25VUkkoKSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uVVJJID0gTE9DQVRJT05fVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQQWRkcmVzc0ltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEFkZHJlc3MoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIG5ld0xvY2F0aW9uVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZExvY2F0aW9uVVJJID0gbG9jYXRpb25VUkk7Ci0gICAgbG9jYXRpb25VUkkgPSBuZXdMb2NhdGlvblVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSSwgb2xkTG9jYXRpb25VUkksIGxvY2F0aW9uVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19MT0NBVElPTl9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRMb2NhdGlvblVSSSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgc2V0TG9jYXRpb25VUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fTE9DQVRJT05fVVJJOgotICAgICAgICBzZXRMb2NhdGlvblVSSShMT0NBVElPTl9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fTE9DQVRJT05fVVJJOgotICAgICAgICByZXR1cm4gTE9DQVRJT05fVVJJX0VERUZBVUxUID09IG51bGwgPyBsb2NhdGlvblVSSSAhPSBudWxsIDogIUxPQ0FUSU9OX1VSSV9FREVGQVVMVC5lcXVhbHMobG9jYXRpb25VUkkpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobG9jYXRpb25VUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQobG9jYXRpb25VUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQkKLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHNldExvY2F0aW9uVVJJCi0gICAgICAoU09BUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFNPQVBDb25zdGFudHMuTE9DQVRJT05fQVRUUklCVVRFKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEFkZHJlc3NfTG9jYXRpb25VUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuTE9DQVRJT05fQVRUUklCVVRFLGdldExvY2F0aW9uVVJJKCkpOwotICAgIH0KLSAgfQotfSAvL1NPQVBBZGRyZXNzSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEJpbmRpbmdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQmluZGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmZTc3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQmluZGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCaW5kaW5nSW1wbCNnZXRUcmFuc3BvcnRVUkkgPGVtPlRyYW5zcG9ydCBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCaW5kaW5nSW1wbCNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ0ltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBTT0FQQmluZGluZyB7Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNwb3J0VVJJKCkgPGVtPlRyYW5zcG9ydCBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VHJhbnNwb3J0VVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNwb3J0VVJJKCkgPGVtPlRyYW5zcG9ydCBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VHJhbnNwb3J0VVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zcG9ydFVSSSA9IFRSQU5TUE9SVF9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdHlsZSA9IFNUWUxFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQQmluZGluZ0ltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNwb3J0VVJJKCkKLSAgewotICAgIHJldHVybiB0cmFuc3BvcnRVUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc3BvcnRVUkkoU3RyaW5nIG5ld1RyYW5zcG9ydFVSSSkKLSAgewotICAgIFN0cmluZyBvbGRUcmFuc3BvcnRVUkkgPSB0cmFuc3BvcnRVUkk7Ci0gICAgdHJhbnNwb3J0VVJJID0gbmV3VHJhbnNwb3J0VVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fVFJBTlNQT1JUX1VSSSwgb2xkVHJhbnNwb3J0VVJJLCB0cmFuc3BvcnRVUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKQotICB7Ci0gICAgcmV0dXJuIHN0eWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIG5ld1N0eWxlKQotICB7Ci0gICAgU3RyaW5nIG9sZFN0eWxlID0gc3R5bGU7Ci0gICAgc3R5bGUgPSBuZXdTdHlsZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1NUWUxFLCBvbGRTdHlsZSwgc3R5bGUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1RSQU5TUE9SVF9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRUcmFuc3BvcnRVUkkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19TVFlMRToKLSAgICAgICAgcmV0dXJuIGdldFN0eWxlKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fVFJBTlNQT1JUX1VSSToKLSAgICAgICAgc2V0VHJhbnNwb3J0VVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fU1RZTEU6Ci0gICAgICAgIHNldFN0eWxlKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1RSQU5TUE9SVF9VUkk6Ci0gICAgICAgIHNldFRyYW5zcG9ydFVSSShUUkFOU1BPUlRfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1NUWUxFOgotICAgICAgICBzZXRTdHlsZShTVFlMRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19UUkFOU1BPUlRfVVJJOgotICAgICAgICByZXR1cm4gVFJBTlNQT1JUX1VSSV9FREVGQVVMVCA9PSBudWxsID8gdHJhbnNwb3J0VVJJICE9IG51bGwgOiAhVFJBTlNQT1JUX1VSSV9FREVGQVVMVC5lcXVhbHModHJhbnNwb3J0VVJJKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19TVFlMRToKLSAgICAgICAgcmV0dXJuIFNUWUxFX0VERUZBVUxUID09IG51bGwgPyBzdHlsZSAhPSBudWxsIDogIVNUWUxFX0VERUZBVUxULmVxdWFscyhzdHlsZSk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh0cmFuc3BvcnRVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodHJhbnNwb3J0VVJJKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHN0eWxlOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHN0eWxlKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0JCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc2V0U3R5bGUKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5TVFlMRV9BVFRSSUJVVEUpKTsKLSAgICBzZXRUcmFuc3BvcnRVUkkKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5UUkFOU1BPUlRfQVRUUklCVVRFKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmdfU3R5bGUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuU1RZTEVfQVRUUklCVVRFLGdldFN0eWxlKCkpOwotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQQmluZGluZ19UcmFuc3BvcnRVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuVFJBTlNQT1JUX0FUVFJJQlVURSxnZXRUcmFuc3BvcnRVUkkoKSk7Ci0gICAgfQotICB9Ci19IC8vU09BUEJpbmRpbmdJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQm9keUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBCb2R5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWNkYzhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBCb2R5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Cb2R5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQm9keUltcGwjZ2V0VXNlIDxlbT5Vc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCb2R5SW1wbCNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCb2R5SW1wbCNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQm9keUltcGwjZ2V0UGFydHMgPGVtPlBhcnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEJvZHlJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEJvZHkgewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZSgpIDxlbT5Vc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2UoKSA8ZW0+VXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2UgPSBVU0VfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lc3BhY2VVUkkoKSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gTkFNRVNQQUNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5jb2RpbmdTdHlsZXMoKSA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RW5jb2RpbmdTdHlsZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBFTGlzdCBlbmNvZGluZ1N0eWxlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRzKCkgPGVtPlBhcnRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UGFydHMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBFTGlzdCBwYXJ0cyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIFNPQVBCb2R5SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQQm9keSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXRVc2UoKQotICB7Ci0gICAgcmV0dXJuIHVzZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgbmV3VXNlKQotICB7Ci0gICAgU3RyaW5nIG9sZFVzZSA9IHVzZTsKLSAgICB1c2UgPSBuZXdVc2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9CT0RZX19VU0UsIG9sZFVzZSwgdXNlKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuZXdOYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIG5hbWVzcGFjZVVSSSA9IG5ld05hbWVzcGFjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX05BTUVTUEFDRV9VUkksIG9sZE5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSk7Ci0gIH0KLQotcHVibGljIHZvaWQgc2V0RW5jb2RpbmdTdHlsZXMoTGlzdCBsaXN0KQotewotICBlbmNvZGluZ1N0eWxlcyA9IChFTGlzdClsaXN0OwotfQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgTGlzdCBnZXRFbmNvZGluZ1N0eWxlcygpCi0gIHsKLSAgICBpZiAoZW5jb2RpbmdTdHlsZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbmNvZGluZ1N0eWxlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRU5DT0RJTkdfU1RZTEVTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVuY29kaW5nU3R5bGVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UGFydHMoTGlzdCBsaXN0KQotICB7Ci0gICAgcGFydHMgPSAoRUxpc3QpbGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFBhcnRzKCkKLSAgewotICAgIGlmIChwYXJ0cyA9PSBudWxsKQotICAgIHsKLSAgICAgIHBhcnRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChQYXJ0LmNsYXNzLCB0aGlzLCBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1BBUlRTKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHBhcnRzLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIExpc3QgaW1wbGljaXRQYXJ0cyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAKLSAgICAgIC8vIFRyeSB0byBmaW5kIGFuIGltcGxpY2l0IG9uZS4KLSAgICAgIGlmKGVDb250YWluZXIoKSBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkKLSAgICAgIHsKLSAgICAgIAlNZXNzYWdlIG1lc3NhZ2UgPSAoKEJpbmRpbmdJbnB1dCllQ29udGFpbmVyKCkpLmdldEVJbnB1dCgpLmdldEVNZXNzYWdlKCk7Ci0gICAgICAJaWYobWVzc2FnZS5nZXRFUGFydHMoKS5zaXplKCkgPiAwKQotICAgICAgCXsKLSAgICAgIAkgIGltcGxpY2l0UGFydHMuYWRkQWxsKG1lc3NhZ2UuZ2V0RVBhcnRzKCkpOwotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIGlmKGVDb250YWluZXIoKSBpbnN0YW5jZW9mIEJpbmRpbmdPdXRwdXQpCi0gICAgICB7Ci0gICAgICAJTWVzc2FnZSBtZXNzYWdlID0gKChCaW5kaW5nT3V0cHV0KWVDb250YWluZXIoKSkuZ2V0RU91dHB1dCgpLmdldEVNZXNzYWdlKCk7Ci0gICAgICAJaWYobWVzc2FnZS5nZXRFUGFydHMoKS5zaXplKCkgPiAwKQotICAgICAgCXsKLSAgICAgIAkgIGltcGxpY2l0UGFydHMuYWRkQWxsKG1lc3NhZ2UuZ2V0RVBhcnRzKCkpOwotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIGlmKGVDb250YWluZXIoKSBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkKLSAgICAgIHsKLSAgICAgIAlNZXNzYWdlIG1lc3NhZ2UgPSAoKEJpbmRpbmdGYXVsdCllQ29udGFpbmVyKCkpLmdldEVGYXVsdCgpLmdldEVNZXNzYWdlKCk7Ci0gICAgICAJaWYobWVzc2FnZS5nZXRFUGFydHMoKS5zaXplKCkgPiAwKQotICAgICAgCXsKLSAgICAgIAkgIGltcGxpY2l0UGFydHMuYWRkQWxsKG1lc3NhZ2UuZ2V0RVBhcnRzKCkpOwotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIHJldHVybiBpbXBsaWNpdFBhcnRzOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcGFydHM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19VU0U6Ci0gICAgICAgIHJldHVybiBnZXRVc2UoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICByZXR1cm4gZ2V0RW5jb2RpbmdTdHlsZXMoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19QQVJUUzoKLSAgICAgICAgcmV0dXJuIGdldFBhcnRzKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fVVNFOgotICAgICAgICBzZXRVc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUEFSVFM6Ci0gICAgICAgIGdldFBhcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0UGFydHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1VTRToKLSAgICAgICAgc2V0VXNlKFVTRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1BBUlRTOgotICAgICAgICBnZXRQYXJ0cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19VU0U6Ci0gICAgICAgIHJldHVybiBVU0VfRURFRkFVTFQgPT0gbnVsbCA/IHVzZSAhPSBudWxsIDogIVVTRV9FREVGQVVMVC5lcXVhbHModXNlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlVVJJICE9IG51bGwgOiAhTkFNRVNQQUNFX1VSSV9FREVGQVVMVC5lcXVhbHMobmFtZXNwYWNlVVJJKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBlbmNvZGluZ1N0eWxlcyAhPSBudWxsICYmICFlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUEFSVFM6Ci0gICAgICAgIHJldHVybiBwYXJ0cyAhPSBudWxsICYmICFwYXJ0cy5pc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh1c2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodXNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIG5hbWVzcGFjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgZW5jb2RpbmdTdHlsZXM6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RpbmdTdHlsZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQkKLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBpZiAoY2hhbmdlZEVsZW1lbnQuaGFzQXR0cmlidXRlKFNPQVBDb25zdGFudHMuVVNFX0FUVFJJQlVURSkpCi0gICAgICBzZXRVc2UoY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuVVNFX0FUVFJJQlVURSkpOwotICAgIGlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKSkKLSAgICAgIHNldE5hbWVzcGFjZVVSSShjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKSk7Ci0gICAgaWYgKGNoYW5nZWRFbGVtZW50Lmhhc0F0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLkVOQ09ESU5HX1NUWUxFX0FUVFJJQlVURSkpIAotICAgIHsKLSAgICAgIFN0cmluZyBlbmNvZGluZ1N0eWxlcyA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLkVOQ09ESU5HX1NUWUxFX0FUVFJJQlVURSk7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbmNvZGluZ1N0eWxlcyk7Ci0gICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgIAlnZXRFbmNvZGluZ1N0eWxlcygpLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotICAgIH0gICAKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICAvLyBUQkQgLSByZXNvbHZlIFBhcnRzIHJlZmVyZW5jZSBoZXJlLgotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBCb2R5X1VzZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5VU0VfQVRUUklCVVRFLGdldFVzZSgpKTsKLSAgICAgIGlmKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQQm9keV9OYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSxnZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBCb2R5X0VuY29kaW5nU3R5bGVzKCkpCi0gICAgICB7Ci0gICAgICAgIExpc3QgZW5jb2RpbmdTdHlsZUxpc3QgPSBnZXRFbmNvZGluZ1N0eWxlcygpOwotICAgICAgICBTdHJpbmcgZW5jb2RpbmdTdHlsZXMgPSAiIjsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBlbmNvZGluZ1N0eWxlTGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVuY29kaW5nU3R5bGVzLmVxdWFscygiIikpIC8vIGZpcnN0IGl0ZXJhdGlvbgotICAgICAgICAgICAgZW5jb2RpbmdTdHlsZXMgKz0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIAllbmNvZGluZ1N0eWxlcyArPSAiICIgKyAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWVuY29kaW5nU3R5bGVzLmVxdWFscygiIikpCi0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuRU5DT0RJTkdfU1RZTEVfQVRUUklCVVRFLGVuY29kaW5nU3R5bGVzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBzd2l0Y2ggKFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoY2hpbGQpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5QQVJUIDoKLSAgICAgICAgUGFydCBwYXJ0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcnQoKTsKLSAgICAgICAgcGFydC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIHBhcnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIGdldFBhcnRzKCkuYWRkKHBhcnQpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgKi8KLX0gLy9TT0FQQm9keUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmY2RhZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgU09BUEZhY3RvcnkgewotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBGYWN0b3J5SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0gIHsKLSAgICBzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElORzogcmV0dXJuIGNyZWF0ZVNPQVBCaW5kaW5nKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWTogcmV0dXJuIGNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0U6IHJldHVybiBjcmVhdGVTT0FQSGVhZGVyQmFzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUOiByZXR1cm4gY3JlYXRlU09BUEZhdWx0KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OOiByZXR1cm4gY3JlYXRlU09BUE9wZXJhdGlvbigpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1M6IHJldHVybiBjcmVhdGVTT0FQQWRkcmVzcygpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVDogcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXJGYXVsdCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUjogcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXIoKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLklTVFJJTkc6Ci0gICAgICAgIHJldHVybiBjcmVhdGVJU3RyaW5nRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5JU1RSSU5HOgotICAgICAgICByZXR1cm4gY29udmVydElTdHJpbmdUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEJpbmRpbmcgY3JlYXRlU09BUEJpbmRpbmcoKQotICB7Ci0gICAgU09BUEJpbmRpbmdJbXBsIHNvYXBCaW5kaW5nID0gbmV3IFNPQVBCaW5kaW5nSW1wbCgpOwotICAgIHJldHVybiBzb2FwQmluZGluZzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQQm9keSBjcmVhdGVTT0FQQm9keSgpCi0gIHsKLSAgICBTT0FQQm9keUltcGwgc29hcEJvZHkgPSBuZXcgU09BUEJvZHlJbXBsKCk7Ci0gICAgcmV0dXJuIHNvYXBCb2R5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBIZWFkZXJCYXNlIGNyZWF0ZVNPQVBIZWFkZXJCYXNlKCkKLSAgewotICAgIFNPQVBIZWFkZXJCYXNlSW1wbCBzb2FwSGVhZGVyQmFzZSA9IG5ldyBTT0FQSGVhZGVyQmFzZUltcGwoKTsKLSAgICByZXR1cm4gc29hcEhlYWRlckJhc2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEZhdWx0IGNyZWF0ZVNPQVBGYXVsdCgpCi0gIHsKLSAgICBTT0FQRmF1bHRJbXBsIHNvYXBGYXVsdCA9IG5ldyBTT0FQRmF1bHRJbXBsKCk7Ci0gICAgcmV0dXJuIHNvYXBGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQT3BlcmF0aW9uIGNyZWF0ZVNPQVBPcGVyYXRpb24oKQotICB7Ci0gICAgU09BUE9wZXJhdGlvbkltcGwgc29hcE9wZXJhdGlvbiA9IG5ldyBTT0FQT3BlcmF0aW9uSW1wbCgpOwotICAgIHJldHVybiBzb2FwT3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBBZGRyZXNzIGNyZWF0ZVNPQVBBZGRyZXNzKCkKLSAgewotICAgIFNPQVBBZGRyZXNzSW1wbCBzb2FwQWRkcmVzcyA9IG5ldyBTT0FQQWRkcmVzc0ltcGwoKTsKLSAgICByZXR1cm4gc29hcEFkZHJlc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEhlYWRlckZhdWx0IGNyZWF0ZVNPQVBIZWFkZXJGYXVsdCgpCi0gIHsKLSAgICBTT0FQSGVhZGVyRmF1bHRJbXBsIHNvYXBIZWFkZXJGYXVsdCA9IG5ldyBTT0FQSGVhZGVyRmF1bHRJbXBsKCk7Ci0gICAgcmV0dXJuIHNvYXBIZWFkZXJGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQSGVhZGVyIGNyZWF0ZVNPQVBIZWFkZXIoKQotICB7Ci0gICAgU09BUEhlYWRlckltcGwgc29hcEhlYWRlciA9IG5ldyBTT0FQSGVhZGVySW1wbCgpOwotICAgIHJldHVybiBzb2FwSGVhZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVJU3RyaW5nRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJU3RyaW5nVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUFBhY2thZ2UgZ2V0U09BUFBhY2thZ2UoKQotICB7Ci0gICAgcmV0dXJuIChTT0FQUGFja2FnZSlnZXRFUGFja2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBkZXByZWNhdGVkCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHN0YXRpYyBTT0FQUGFja2FnZSBnZXRQYWNrYWdlKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLX0gLy9TT0FQRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBGYXVsdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBGYXVsdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyODE4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQRmF1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWwuU09BUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmF1bHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBGYXVsdEltcGwjZ2V0VXNlIDxlbT5Vc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBGYXVsdEltcGwjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQRmF1bHRJbXBsI2dldEVuY29kaW5nU3R5bGVzIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQRmF1bHRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEZhdWx0IHsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2UoKSA8ZW0+VXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlKCkgPGVtPlVzZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRVc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXNlID0gVVNFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IE5BTUVTUEFDRV9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuY29kaW5nU3R5bGVzKCkgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVuY29kaW5nU3R5bGVzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW5jb2RpbmdTdHlsZXMgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQRmF1bHRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBGYXVsdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXRVc2UoKQotICB7Ci0gICAgcmV0dXJuIHVzZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgbmV3VXNlKQotICB7Ci0gICAgU3RyaW5nIG9sZFVzZSA9IHVzZTsKLSAgICB1c2UgPSBuZXdVc2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fVVNFLCBvbGRVc2UsIHVzZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmV3TmFtZXNwYWNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICBuYW1lc3BhY2VVUkkgPSBuZXdOYW1lc3BhY2VVUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fTkFNRVNQQUNFX1VSSSwgb2xkTmFtZXNwYWNlVVJJLCBuYW1lc3BhY2VVUkkpKTsKLSAgfQotCi1wcml2YXRlIFN0cmluZyBuYW1lOwotcHVibGljIFN0cmluZyBnZXROYW1lKCkKLXsKLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi17Ci0gIHRoaXMubmFtZSA9IG5hbWU7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEVuY29kaW5nU3R5bGVzKExpc3QgbGlzdCkKLXsKLSAgZW5jb2RpbmdTdHlsZXMgPSAoRUxpc3QpbGlzdDsKLX0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIExpc3QgZ2V0RW5jb2RpbmdTdHlsZXMoKQotICB7Ci0gICAgaWYgKGVuY29kaW5nU3R5bGVzID09IG51bGwpCi0gICAgewotICAgICAgZW5jb2RpbmdTdHlsZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTkNPRElOR19TVFlMRVMpOwotICAgIH0KLSAgICByZXR1cm4gZW5jb2RpbmdTdHlsZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX1VTRToKLSAgICAgICAgcmV0dXJuIGdldFVzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19VU0U6Ci0gICAgICAgIHNldFVzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX1VTRToKLSAgICAgICAgc2V0VXNlKFVTRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKE5BTUVTUEFDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19VU0U6Ci0gICAgICAgIHJldHVybiBVU0VfRURFRkFVTFQgPT0gbnVsbCA/IHVzZSAhPSBudWxsIDogIVVTRV9FREVGQVVMVC5lcXVhbHModXNlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVzcGFjZVVSSSAhPSBudWxsIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVSSSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGVuY29kaW5nU3R5bGVzICE9IG51bGwgJiYgIWVuY29kaW5nU3R5bGVzLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHVzZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1c2UpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZXNwYWNlVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBlbmNvZGluZ1N0eWxlczogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChlbmNvZGluZ1N0eWxlcyk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc2V0TmFtZQotICAgICAgKFNPQVBDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBTT0FQQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKSk7Ci0gICAgc2V0TmFtZXNwYWNlVVJJCi0gICAgICAoU09BUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX1VSSV9BVFRSSUJVVEUpKTsKLSAgICBzZXRVc2UKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5VU0VfQVRUUklCVVRFKSk7Ci0gICAgCi0gICAgLy8gVEJEIC0gaGFuZGxlIGVuY29kaW5nU3R5bGVzCi0gICAgCi0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEZhdWx0X05hbWVzcGFjZVVSSSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5OQU1FU1BBQ0VfVVJJX0FUVFJJQlVURSxnZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBGYXVsdF9Vc2UoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuVVNFX0FUVFJJQlVURSxnZXRVc2UoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBGYXVsdF9FbmNvZGluZ1N0eWxlcygpKQotICAgICAgICA7IC8vIFRCRCAtIGhhbmRsZSBlbmNvZGluZ1N0eWxlcwotICAgICAgaWYgKGdldE5hbWUoKSAhPSBudWxsKQotICAgICAgCW5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLGdldE5hbWUoKSk7IC8vIFJldmlzaXQgUm9zZSBtb2RlbAotICAgIH0KLSAgfQotCi19IC8vU09BUEZhdWx0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckJhc2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVyQmFzZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyYjA1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVyQmFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhlYWRlciBCYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyQmFzZUltcGwjZ2V0VXNlIDxlbT5Vc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJCYXNlSW1wbCNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJCYXNlSW1wbCNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyQmFzZUltcGwjZ2V0TWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckJhc2VJbXBsI2dldFBhcnQgPGVtPlBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQSGVhZGVyQmFzZUltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBTT0FQSGVhZGVyQmFzZSB7Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlKCkgPGVtPlVzZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRVc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZSgpIDxlbT5Vc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZSA9IFVTRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmNvZGluZ1N0eWxlcygpIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbmNvZGluZ1N0eWxlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIEVMaXN0IGVuY29kaW5nU3R5bGVzID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZSgpIDxlbT5NZXNzYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0KCkgPGVtPlBhcnQ8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UGFydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFBhcnQgcGFydCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIFNPQVBIZWFkZXJCYXNlSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQSGVhZGVyQmFzZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXRVc2UoKQotICB7Ci0gICAgcmV0dXJuIHVzZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgbmV3VXNlKQotICB7Ci0gICAgU3RyaW5nIG9sZFVzZSA9IHVzZTsKLSAgICB1c2UgPSBuZXdVc2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fVVNFLCBvbGRVc2UsIHVzZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmV3TmFtZXNwYWNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICBuYW1lc3BhY2VVUkkgPSBuZXdOYW1lc3BhY2VVUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSSwgb2xkTmFtZXNwYWNlVVJJLCBuYW1lc3BhY2VVUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFTGlzdCBnZXRFbmNvZGluZ1N0eWxlcygpCi0gIHsKLSAgICBpZiAoZW5jb2RpbmdTdHlsZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbmNvZGluZ1N0eWxlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUyk7Ci0gICAgfQotICAgIHJldHVybiBlbmNvZGluZ1N0eWxlczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgTWVzc2FnZSBvbGRNZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgIG1lc3NhZ2UgPSAoTWVzc2FnZSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpbWVzc2FnZSk7Ci0gICAgICBpZiAobWVzc2FnZSAhPSBvbGRNZXNzYWdlKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0UsIG9sZE1lc3NhZ2UsIG1lc3NhZ2UpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgTWVzc2FnZSBiYXNpY0dldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKE1lc3NhZ2UgbmV3TWVzc2FnZSkKLSAgewotICAgIE1lc3NhZ2Ugb2xkTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgbWVzc2FnZSA9IG5ld01lc3NhZ2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fTUVTU0FHRSwgb2xkTWVzc2FnZSwgbWVzc2FnZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFBhcnQgZ2V0UGFydCgpCi0gIHsKLSAgICBpZiAocGFydCAhPSBudWxsICYmIHBhcnQuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBQYXJ0IG9sZFBhcnQgPSBwYXJ0OwotICAgICAgcGFydCA9IChQYXJ0KWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClwYXJ0KTsKLSAgICAgIGlmIChwYXJ0ICE9IG9sZFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fUEFSVCwgb2xkUGFydCwgcGFydCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGFydDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBQYXJ0IGJhc2ljR2V0UGFydCgpCi0gIHsKLSAgICByZXR1cm4gcGFydDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnQoUGFydCBuZXdQYXJ0KQotICB7Ci0gICAgUGFydCBvbGRQYXJ0ID0gcGFydDsKLSAgICBwYXJ0ID0gbmV3UGFydDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19QQVJULCBvbGRQYXJ0LCBwYXJ0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1VTRToKLSAgICAgICAgcmV0dXJuIGdldFVzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0U6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRNZXNzYWdlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1BBUlQ6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UGFydCgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRQYXJ0KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19VU0U6Ci0gICAgICAgIHNldFVzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFOgotICAgICAgICBzZXRNZXNzYWdlKChNZXNzYWdlKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19QQVJUOgotICAgICAgICBzZXRQYXJ0KChQYXJ0KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1VTRToKLSAgICAgICAgc2V0VXNlKFVTRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKE5BTUVTUEFDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0U6Ci0gICAgICAgIHNldE1lc3NhZ2UoKE1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fUEFSVDoKLSAgICAgICAgc2V0UGFydCgoUGFydCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fVVNFOgotICAgICAgICByZXR1cm4gVVNFX0VERUZBVUxUID09IG51bGwgPyB1c2UgIT0gbnVsbCA6ICFVU0VfRURFRkFVTFQuZXF1YWxzKHVzZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBlbmNvZGluZ1N0eWxlcyAhPSBudWxsICYmICFlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0U6Ci0gICAgICAgIHJldHVybiBtZXNzYWdlICE9IG51bGw7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1BBUlQ6Ci0gICAgICAgIHJldHVybiBwYXJ0ICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh1c2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodXNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIG5hbWVzcGFjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgZW5jb2RpbmdTdHlsZXM6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RpbmdTdHlsZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgaWYgKGNoYW5nZWRFbGVtZW50Lmhhc0F0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUpKQotICAgICAgc2V0VXNlKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUpKTsKLSAgICBpZiAoY2hhbmdlZEVsZW1lbnQuaGFzQXR0cmlidXRlKFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpCi0gICAgICBzZXROYW1lc3BhY2VVUkkoY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpOwotICAgIGlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5FTkNPRElOR19TVFlMRV9BVFRSSUJVVEUpKSAKLSAgICB7Ci0gICAgICBTdHJpbmcgZW5jb2RpbmdTdHlsZXMgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5FTkNPRElOR19TVFlMRV9BVFRSSUJVVEUpOwotICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZW5jb2RpbmdTdHlsZXMpOwotICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAJZ2V0RW5jb2RpbmdTdHlsZXMoKS5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICB9IAotICAgIAotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSkpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgUU5hbWUgbWVzc2FnZVFOYW1lID0gY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSkpOwotICAgICAgTWVzc2FnZSBuZXdNZXNzYWdlID0gKG1lc3NhZ2VRTmFtZSAhPSBudWxsKSA/IChNZXNzYWdlKSBkZWZpbml0aW9uLmdldE1lc3NhZ2UobWVzc2FnZVFOYW1lKSA6IG51bGw7Ci0gICAgICBpZiAobmV3TWVzc2FnZSAhPSBudWxsICYmIG5ld01lc3NhZ2UgIT0gZ2V0TWVzc2FnZSgpKQotICAgICAgICBzZXRNZXNzYWdlKG5ld01lc3NhZ2UpOwotICAgICAgCi0gICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5QQVJUX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuUEFSVF9BVFRSSUJVVEUpOwotICAgICAgICBQYXJ0IG5ld1BhcnQgPSAobmV3TWVzc2FnZSAhPSBudWxsKSA/IChQYXJ0KSBuZXdNZXNzYWdlLmdldFBhcnQocGFydE5hbWUpIDogbnVsbDsKLSAgICAgICAgaWYgKG5ld1BhcnQgIT0gbnVsbCAmJiBuZXdQYXJ0ICE9IGdldFBhcnQoKSkKLSAgICAgICAgICBzZXRQYXJ0KG5ld1BhcnQpOwotICAgICAgfSAgIAotICAgIH0KLSAgICBzdXBlci5yZWNvbmNpbGVSZWZlcmVuY2VzKGRlZXApOwotICB9CSAgCi0gCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlckJhc2VfVXNlKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUsZ2V0VXNlKCkpOwotICAgICAgaWYoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBIZWFkZXJCYXNlX05hbWVzcGFjZVVSSSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFLGdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlckJhc2VfRW5jb2RpbmdTdHlsZXMoKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBlbmNvZGluZ1N0eWxlTGlzdCA9IGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICAgIFN0cmluZyBlbmNvZGluZ1N0eWxlcyA9ICIiOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVuY29kaW5nU3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZW5jb2RpbmdTdHlsZXMuZXF1YWxzKCIiKSkgLy8gZmlyc3QgaXRlcmF0aW9uCi0gICAgICAgICAgICBlbmNvZGluZ1N0eWxlcyArPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICBlbHNlCi0gIAkgICAgICAgIGVuY29kaW5nU3R5bGVzICs9ICIgIiArIChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZW5jb2RpbmdTdHlsZXMuZXF1YWxzKCIiKSkKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5FTkNPRElOR19TVFlMRV9BVFRSSUJVVEUsZW5jb2RpbmdTdHlsZXMpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlUmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlUmVmZXJlbmNlKGVSZWZlcmVuY2UpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlUmVmZXJlbmNlID09IG51bGwgfHwgZVJlZmVyZW5jZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlckJhc2VfTWVzc2FnZSgpKQotICAgICAgewotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxTmFtZSA9IG1lc3NhZ2UuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgU09BUENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQSGVhZGVyQmFzZV9QYXJ0KCkpCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IGdldFBhcnQoKTsKLSAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IHBhcnQuZ2V0TmFtZSgpOwotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgU09BUENvbnN0YW50cy5QQVJUX0FUVFJJQlVURSxwYXJ0TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0gLy9TT0FQSGVhZGVyQmFzZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBIZWFkZXJGYXVsdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBIZWFkZXJGYXVsdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyMzlmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVyRmF1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhlYWRlciBGYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNPQVBIZWFkZXJGYXVsdEltcGwgZXh0ZW5kcyBTT0FQSGVhZGVyQmFzZUltcGwgaW1wbGVtZW50cyBTT0FQSGVhZGVyRmF1bHQgewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgU09BUEhlYWRlckZhdWx0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQSGVhZGVyRmF1bHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19VU0U6Ci0gICAgICAgIHJldHVybiBnZXRVc2UoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19NRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0TWVzc2FnZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUEFSVDoKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRQYXJ0KCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldFBhcnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fVVNFOgotICAgICAgICBzZXRVc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHNldE5hbWVzcGFjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fTUVTU0FHRToKLSAgICAgICAgc2V0TWVzc2FnZSgoTWVzc2FnZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1BBUlQ6Ci0gICAgICAgIHNldFBhcnQoKFBhcnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19VU0U6Ci0gICAgICAgIHNldFVzZShVU0VfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19NRVNTQUdFOgotICAgICAgICBzZXRNZXNzYWdlKChNZXNzYWdlKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19QQVJUOgotICAgICAgICBzZXRQYXJ0KChQYXJ0KW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1VTRToKLSAgICAgICAgcmV0dXJuIFVTRV9FREVGQVVMVCA9PSBudWxsID8gdXNlICE9IG51bGwgOiAhVVNFX0VERUZBVUxULmVxdWFscyh1c2UpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVzcGFjZVVSSSAhPSBudWxsIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVSSSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBlbmNvZGluZ1N0eWxlcyAhPSBudWxsICYmICFlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19NRVNTQUdFOgotICAgICAgICByZXR1cm4gbWVzc2FnZSAhPSBudWxsOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUEFSVDoKLSAgICAgICAgcmV0dXJuIHBhcnQgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLX0gLy9TT0FQSGVhZGVyRmF1bHRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZTUxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IZWFkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJJbXBsI2dldEhlYWRlckZhdWx0cyA8ZW0+SGVhZGVyIEZhdWx0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNPQVBIZWFkZXJJbXBsIGV4dGVuZHMgU09BUEhlYWRlckJhc2VJbXBsIGltcGxlbWVudHMgU09BUEhlYWRlciB7Ci0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWFkZXJGYXVsdHMoKSA8ZW0+SGVhZGVyIEZhdWx0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEhlYWRlckZhdWx0cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIEVMaXN0IGhlYWRlckZhdWx0cyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIFNPQVBIZWFkZXJJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBIZWFkZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFTGlzdCBnZXRIZWFkZXJGYXVsdHMoKQotICB7Ci0gICAgaWYgKGhlYWRlckZhdWx0cyA9PSBudWxsKQotICAgIHsKLSAgICAgIGhlYWRlckZhdWx0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTT0FQSGVhZGVyRmF1bHQuY2xhc3MsIHRoaXMsIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19IRUFERVJfRkFVTFRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhlYWRlckZhdWx0czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0hFQURFUl9GQVVMVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRIZWFkZXJGYXVsdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1VTRToKLSAgICAgICAgcmV0dXJuIGdldFVzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICByZXR1cm4gZ2V0RW5jb2RpbmdTdHlsZXMoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX01FU1NBR0U6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRNZXNzYWdlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19QQVJUOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFBhcnQoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0UGFydCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fSEVBREVSX0ZBVUxUUzoKLSAgICAgICAgcmV0dXJuIGdldEhlYWRlckZhdWx0cygpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19VU0U6Ci0gICAgICAgIHNldFVzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19NRVNTQUdFOgotICAgICAgICBzZXRNZXNzYWdlKChNZXNzYWdlKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fUEFSVDoKLSAgICAgICAgc2V0UGFydCgoUGFydCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0hFQURFUl9GQVVMVFM6Ci0gICAgICAgIGdldEhlYWRlckZhdWx0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEhlYWRlckZhdWx0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1VTRToKLSAgICAgICAgc2V0VXNlKFVTRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHNldE5hbWVzcGFjZVVSSShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX01FU1NBR0U6Ci0gICAgICAgIHNldE1lc3NhZ2UoKE1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1BBUlQ6Ci0gICAgICAgIHNldFBhcnQoKFBhcnQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0hFQURFUl9GQVVMVFM6Ci0gICAgICAgIGdldEhlYWRlckZhdWx0cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fVVNFOgotICAgICAgICByZXR1cm4gVVNFX0VERUZBVUxUID09IG51bGwgPyB1c2UgIT0gbnVsbCA6ICFVU0VfRURFRkFVTFQuZXF1YWxzKHVzZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlVVJJICE9IG51bGwgOiAhTkFNRVNQQUNFX1VSSV9FREVGQVVMVC5lcXVhbHMobmFtZXNwYWNlVVJJKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGVuY29kaW5nU3R5bGVzICE9IG51bGwgJiYgIWVuY29kaW5nU3R5bGVzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX01FU1NBR0U6Ci0gICAgICAgIHJldHVybiBtZXNzYWdlICE9IG51bGw7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19QQVJUOgotICAgICAgICByZXR1cm4gcGFydCAhPSBudWxsOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fSEVBREVSX0ZBVUxUUzoKLSAgICAgICAgcmV0dXJuIGhlYWRlckZhdWx0cyAhPSBudWxsICYmICFoZWFkZXJGYXVsdHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgaWYgKFNPQVBDb25zdGFudHMuSEVBREVSX0ZBVUxUX0VMRU1FTlRfVEFHLmVxdWFscyhlbGVtZW50LmdldExvY2FsTmFtZSgpKSkKLSAgICB7Ci0gICAgICBTT0FQSGVhZGVyRmF1bHQgZmF1bHQgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlckZhdWx0KCk7Ci0gICAgICBmYXVsdC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICBmYXVsdC5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgIGdldEhlYWRlckZhdWx0cygpLmFkZChmYXVsdCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgU09BUEhlYWRlciBoZWFkZXIgPSAoU09BUEhlYWRlcikgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFNPQVBIZWFkZXJGYXVsdCkKLSAgICB7Ci0gICAgICBoZWFkZXIuZ2V0SGVhZGVyRmF1bHRzKCkucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotfSAvL1NPQVBIZWFkZXJJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQT3BlcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUE9wZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3NTRjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQT3BlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBPcGVyYXRpb25JbXBsI2dldFNvYXBBY3Rpb25VUkkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUE9wZXJhdGlvbkltcGwjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUE9wZXJhdGlvbkltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBTT0FQT3BlcmF0aW9uIHsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQWN0aW9uVVJJKCkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTb2FwQWN0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0FDVElPTl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQWN0aW9uVVJJKCkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTb2FwQWN0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNvYXBBY3Rpb25VUkkgPSBTT0FQX0FDVElPTl9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdHlsZSA9IFNUWUxFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQT3BlcmF0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQT3BlcmF0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvYXBBY3Rpb25VUkkoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBBY3Rpb25VUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb2FwQWN0aW9uVVJJKFN0cmluZyBuZXdTb2FwQWN0aW9uVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZFNvYXBBY3Rpb25VUkkgPSBzb2FwQWN0aW9uVVJJOwotICAgIHNvYXBBY3Rpb25VUkkgPSBuZXdTb2FwQWN0aW9uVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TT0FQX0FDVElPTl9VUkksIG9sZFNvYXBBY3Rpb25VUkksIHNvYXBBY3Rpb25VUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKQotICB7Ci0gICAgcmV0dXJuIHN0eWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIG5ld1N0eWxlKQotICB7Ci0gICAgU3RyaW5nIG9sZFN0eWxlID0gc3R5bGU7Ci0gICAgc3R5bGUgPSBuZXdTdHlsZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fU1RZTEUsIG9sZFN0eWxlLCBzdHlsZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIGdldFNvYXBBY3Rpb25VUkkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NUWUxFOgotICAgICAgICByZXR1cm4gZ2V0U3R5bGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fU09BUF9BQ1RJT05fVVJJOgotICAgICAgICBzZXRTb2FwQWN0aW9uVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgc2V0U3R5bGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSToKLSAgICAgICAgc2V0U29hcEFjdGlvblVSSShTT0FQX0FDVElPTl9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgc2V0U3R5bGUoU1RZTEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIFNPQVBfQUNUSU9OX1VSSV9FREVGQVVMVCA9PSBudWxsID8gc29hcEFjdGlvblVSSSAhPSBudWxsIDogIVNPQVBfQUNUSU9OX1VSSV9FREVGQVVMVC5lcXVhbHMoc29hcEFjdGlvblVSSSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgcmV0dXJuIFNUWUxFX0VERUZBVUxUID09IG51bGwgPyBzdHlsZSAhPSBudWxsIDogIVNUWUxFX0VERUZBVUxULmVxdWFscyhzdHlsZSk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChzb2FwQWN0aW9uVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHNvYXBBY3Rpb25VUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgc3R5bGU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoc3R5bGUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQkKLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHNldFNvYXBBY3Rpb25VUkkKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5TT0FQX0FDVElPTl9BVFRSSUJVVEUpKTsKLSAgICBzZXRTdHlsZQotICAgICAgKFNPQVBDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBTT0FQQ29uc3RhbnRzLlNUWUxFX0FUVFJJQlVURSkpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBPcGVyYXRpb25fU29hcEFjdGlvblVSSSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5TT0FQX0FDVElPTl9BVFRSSUJVVEUsZ2V0U29hcEFjdGlvblVSSSgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUE9wZXJhdGlvbl9TdHlsZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5TVFlMRV9BVFRSSUJVVEUsZ2V0U3R5bGUoKSk7Ci0gICAgfQotICB9Ci0KLX0gLy9TT0FQT3BlcmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUFBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyNTQ1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFBhY2thZ2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNPQVBQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFNPQVBQYWNrYWdlIHsKLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc29hcEJpbmRpbmdFQ2xhc3MgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgRUNsYXNzIHNvYXBCb2R5RUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVDbGFzcyBzb2FwSGVhZGVyQmFzZUVDbGFzcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc29hcEZhdWx0RUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVDbGFzcyBzb2FwT3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVDbGFzcyBzb2FwQWRkcmVzc0VDbGFzcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc29hcEhlYWRlckZhdWx0RUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVDbGFzcyBzb2FwSGVhZGVyRUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBpU3RyaW5nRURhdGFUeXBlID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotICAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotICAgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLSAgICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotICAgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotICAgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotICAgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2VOU19VUkkKLSAgICogQHNlZSAjaW5pdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBTT0FQUGFja2FnZUltcGwoKQotICB7Ci0gICAgc3VwZXIoZU5TX1VSSSwgU09BUEZhY3RvcnkuZUlOU1RBTkNFKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0gICAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0gICAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0gICAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotICAgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0gICAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0gICAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLSAgICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0gICAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLSAgICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLSAgICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLSAgICogdGhvc2Ugb2YgYW5vdGhlci4KLSAgICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotICAgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2VOU19VUkkKLSAgICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLSAgICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHN0YXRpYyBTT0FQUGFja2FnZSBpbml0KCkKLSAgewotICAgIGlmIChpc0luaXRlZCkgcmV0dXJuIChTT0FQUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoU09BUFBhY2thZ2UuZU5TX1VSSSk7Ci0KLSAgICAvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlLgotICAgIFNPQVBQYWNrYWdlSW1wbCB0aGVTT0FQUGFja2FnZSA9IChTT0FQUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IFNPQVBQYWNrYWdlSW1wbCgpKTsKLQotICAgIGlzSW5pdGVkID0gdHJ1ZTsKLQotICAgIC8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotICAgIFhTRFBhY2thZ2VJbXBsLmluaXQoKTsKLQotICAgIC8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0gICAgV1NETFBhY2thZ2VJbXBsIHRoZVdTRExQYWNrYWdlID0gKFdTRExQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KFdTRExQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoV1NETFBhY2thZ2UuZU5TX1VSSSkgOiBXU0RMUGFja2FnZUltcGwuZUlOU1RBTkNFKTsKLQotICAgIC8vIFN0ZXAgMTogY3JlYXRlIG1ldGEtbW9kZWwgb2JqZWN0cwotICAgIHRoZVNPQVBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotICAgIHRoZVdTRExQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0gICAgLy8gU3RlcCAyOiBjb21wbGV0ZSBpbml0aWFsaXphdGlvbgotICAgIHRoZVNPQVBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLSAgICB0aGVXU0RMUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLSAgICByZXR1cm4gdGhlU09BUFBhY2thZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNPQVBCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBzb2FwQmluZGluZ0VDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBCaW5kaW5nX1RyYW5zcG9ydFVSSSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEJpbmRpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBCaW5kaW5nX1N0eWxlKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwQmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQQm9keSgpCi0gIHsKLSAgICByZXR1cm4gc29hcEJvZHlFQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQQm9keV9Vc2UoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBCb2R5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQQm9keV9OYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBCb2R5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQQm9keV9FbmNvZGluZ1N0eWxlcygpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEJvZHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNPQVBCb2R5X1BhcnRzKCkKLSAgewotICAgIHJldHVybiAoRVJlZmVyZW5jZSlzb2FwQm9keUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQSGVhZGVyQmFzZSgpCi0gIHsKLSAgICByZXR1cm4gc29hcEhlYWRlckJhc2VFQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQSGVhZGVyQmFzZV9Vc2UoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBIZWFkZXJCYXNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQSGVhZGVyQmFzZV9OYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBIZWFkZXJCYXNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQSGVhZGVyQmFzZV9FbmNvZGluZ1N0eWxlcygpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEhlYWRlckJhc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNPQVBIZWFkZXJCYXNlX01lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIChFUmVmZXJlbmNlKXNvYXBIZWFkZXJCYXNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTT0FQSGVhZGVyQmFzZV9QYXJ0KCkKLSAgewotICAgIHJldHVybiAoRVJlZmVyZW5jZSlzb2FwSGVhZGVyQmFzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQRmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBGYXVsdEVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBGYXVsdF9Vc2UoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBGYXVsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEZhdWx0X05hbWVzcGFjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEZhdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQRmF1bHRfRW5jb2RpbmdTdHlsZXMoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBGYXVsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQT3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBzb2FwT3BlcmF0aW9uRUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUE9wZXJhdGlvbl9Tb2FwQWN0aW9uVVJJKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQT3BlcmF0aW9uX1N0eWxlKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNPQVBBZGRyZXNzKCkKLSAgewotICAgIHJldHVybiBzb2FwQWRkcmVzc0VDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBBZGRyZXNzX0xvY2F0aW9uVVJJKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwQWRkcmVzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQSGVhZGVyRmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBIZWFkZXJGYXVsdEVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U09BUEhlYWRlcigpCi0gIHsKLSAgICByZXR1cm4gc29hcEhlYWRlckVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNPQVBIZWFkZXJfSGVhZGVyRmF1bHRzKCkKLSAgewotICAgIHJldHVybiAoRVJlZmVyZW5jZSlzb2FwSGVhZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldElTdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIGlTdHJpbmdFRGF0YVR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEZhY3RvcnkgZ2V0U09BUEZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIChTT0FQRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotICAgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLSAgewotICAgIGlmIChpc0NyZWF0ZWQpIHJldHVybjsKLSAgICBpc0NyZWF0ZWQgPSB0cnVlOwotCi0gICAgLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0gICAgc29hcEJpbmRpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9CSU5ESU5HKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBCaW5kaW5nRUNsYXNzLCBTT0FQX0JJTkRJTkdfX1RSQU5TUE9SVF9VUkkpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEJpbmRpbmdFQ2xhc3MsIFNPQVBfQklORElOR19fU1RZTEUpOwotCi0gICAgc29hcEJvZHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9CT0RZKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBCb2R5RUNsYXNzLCBTT0FQX0JPRFlfX1VTRSk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwQm9keUVDbGFzcywgU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBCb2R5RUNsYXNzLCBTT0FQX0JPRFlfX0VOQ09ESU5HX1NUWUxFUyk7Ci0gICAgY3JlYXRlRVJlZmVyZW5jZShzb2FwQm9keUVDbGFzcywgU09BUF9CT0RZX19QQVJUUyk7Ci0KLSAgICBzb2FwSGVhZGVyQmFzZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX0hFQURFUl9CQVNFKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBIZWFkZXJCYXNlRUNsYXNzLCBTT0FQX0hFQURFUl9CQVNFX19VU0UpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEhlYWRlckJhc2VFQ2xhc3MsIFNPQVBfSEVBREVSX0JBU0VfX05BTUVTUEFDRV9VUkkpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEhlYWRlckJhc2VFQ2xhc3MsIFNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUyk7Ci0gICAgY3JlYXRlRVJlZmVyZW5jZShzb2FwSGVhZGVyQmFzZUVDbGFzcywgU09BUF9IRUFERVJfQkFTRV9fTUVTU0FHRSk7Ci0gICAgY3JlYXRlRVJlZmVyZW5jZShzb2FwSGVhZGVyQmFzZUVDbGFzcywgU09BUF9IRUFERVJfQkFTRV9fUEFSVCk7Ci0KLSAgICBzb2FwRmF1bHRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9GQVVMVCk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwRmF1bHRFQ2xhc3MsIFNPQVBfRkFVTFRfX1VTRSk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwRmF1bHRFQ2xhc3MsIFNPQVBfRkFVTFRfX05BTUVTUEFDRV9VUkkpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEZhdWx0RUNsYXNzLCBTT0FQX0ZBVUxUX19FTkNPRElOR19TVFlMRVMpOwotCi0gICAgc29hcE9wZXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX09QRVJBVElPTik7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwT3BlcmF0aW9uRUNsYXNzLCBTT0FQX09QRVJBVElPTl9fU09BUF9BQ1RJT05fVVJJKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBPcGVyYXRpb25FQ2xhc3MsIFNPQVBfT1BFUkFUSU9OX19TVFlMRSk7Ci0KLSAgICBzb2FwQWRkcmVzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX0FERFJFU1MpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEFkZHJlc3NFQ2xhc3MsIFNPQVBfQUREUkVTU19fTE9DQVRJT05fVVJJKTsKLQotICAgIHNvYXBIZWFkZXJGYXVsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX0hFQURFUl9GQVVMVCk7Ci0KLSAgICBzb2FwSGVhZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNPQVBfSEVBREVSKTsKLSAgICBjcmVhdGVFUmVmZXJlbmNlKHNvYXBIZWFkZXJFQ2xhc3MsIFNPQVBfSEVBREVSX19IRUFERVJfRkFVTFRTKTsKLQotICAgIC8vIENyZWF0ZSBkYXRhIHR5cGVzCi0gICAgaVN0cmluZ0VEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShJU1RSSU5HKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0gICAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0gIHsKLSAgICBpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0gICAgc2V0TmFtZShlTkFNRSk7Ci0gICAgc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0gICAgc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLSAgICAvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0gICAgV1NETFBhY2thZ2VJbXBsIHRoZVdTRExQYWNrYWdlID0gKFdTRExQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXU0RMUGFja2FnZS5lTlNfVVJJKTsKLQotICAgIC8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLSAgICBzb2FwQmluZGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICBzb2FwQm9keUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICBzb2FwSGVhZGVyQmFzZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICBzb2FwRmF1bHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0gICAgc29hcE9wZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICBzb2FwQWRkcmVzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICBzb2FwSGVhZGVyRmF1bHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTT0FQSGVhZGVyQmFzZSgpKTsKLSAgICBzb2FwSGVhZGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U09BUEhlYWRlckJhc2UoKSk7Ci0KLSAgICAvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotICAgIGluaXRFQ2xhc3Moc29hcEJpbmRpbmdFQ2xhc3MsIFNPQVBCaW5kaW5nLmNsYXNzLCAiU09BUEJpbmRpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBCaW5kaW5nX1RyYW5zcG9ydFVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHJhbnNwb3J0VVJJIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQQmluZGluZ19TdHlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3R5bGUiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0gICAgaW5pdEVDbGFzcyhzb2FwQm9keUVDbGFzcywgU09BUEJvZHkuY2xhc3MsICJTT0FQQm9keSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEJvZHlfVXNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1c2UiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBCb2R5X05hbWVzcGFjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQQm9keV9FbmNvZGluZ1N0eWxlcygpLCB0aGlzLmdldElTdHJpbmcoKSwgImVuY29kaW5nU3R5bGVzIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVSZWZlcmVuY2UoZ2V0U09BUEJvZHlfUGFydHMoKSwgdGhlV1NETFBhY2thZ2UuZ2V0UGFydCgpLCBudWxsLCAicGFydHMiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotICAgIGluaXRFQ2xhc3Moc29hcEhlYWRlckJhc2VFQ2xhc3MsIFNPQVBIZWFkZXJCYXNlLmNsYXNzLCAiU09BUEhlYWRlckJhc2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBIZWFkZXJCYXNlX1VzZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXNlIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQSGVhZGVyQmFzZV9OYW1lc3BhY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVzcGFjZVVSSSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEhlYWRlckJhc2VfRW5jb2RpbmdTdHlsZXMoKSwgdGhpcy5nZXRJU3RyaW5nKCksICJlbmNvZGluZ1N0eWxlcyIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFUmVmZXJlbmNlKGdldFNPQVBIZWFkZXJCYXNlX01lc3NhZ2UoKSwgdGhlV1NETFBhY2thZ2UuZ2V0TWVzc2FnZSgpLCBudWxsLCAibWVzc2FnZSIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVSZWZlcmVuY2UoZ2V0U09BUEhlYWRlckJhc2VfUGFydCgpLCB0aGVXU0RMUGFja2FnZS5nZXRQYXJ0KCksIG51bGwsICJwYXJ0IiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotICAgIGluaXRFQ2xhc3Moc29hcEZhdWx0RUNsYXNzLCBTT0FQRmF1bHQuY2xhc3MsICJTT0FQRmF1bHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBGYXVsdF9Vc2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVzZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEZhdWx0X05hbWVzcGFjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQRmF1bHRfRW5jb2RpbmdTdHlsZXMoKSwgdGhpcy5nZXRJU3RyaW5nKCksICJlbmNvZGluZ1N0eWxlcyIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0gICAgaW5pdEVDbGFzcyhzb2FwT3BlcmF0aW9uRUNsYXNzLCBTT0FQT3BlcmF0aW9uLmNsYXNzLCAiU09BUE9wZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUE9wZXJhdGlvbl9Tb2FwQWN0aW9uVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzb2FwQWN0aW9uVVJJIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQT3BlcmF0aW9uX1N0eWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzdHlsZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLSAgICBpbml0RUNsYXNzKHNvYXBBZGRyZXNzRUNsYXNzLCBTT0FQQWRkcmVzcy5jbGFzcywgIlNPQVBBZGRyZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQQWRkcmVzc19Mb2NhdGlvblVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYXRpb25VUkkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0gICAgaW5pdEVDbGFzcyhzb2FwSGVhZGVyRmF1bHRFQ2xhc3MsIFNPQVBIZWFkZXJGYXVsdC5jbGFzcywgIlNPQVBIZWFkZXJGYXVsdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0KLSAgICBpbml0RUNsYXNzKHNvYXBIZWFkZXJFQ2xhc3MsIFNPQVBIZWFkZXIuY2xhc3MsICJTT0FQSGVhZGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLSAgICBpbml0RVJlZmVyZW5jZShnZXRTT0FQSGVhZGVyX0hlYWRlckZhdWx0cygpLCB0aGlzLmdldFNPQVBIZWFkZXJGYXVsdCgpLCBudWxsLCAiaGVhZGVyRmF1bHRzIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLSAgICAvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLSAgICBpbml0RURhdGFUeXBlKGlTdHJpbmdFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIklTdHJpbmciLCBJU19TRVJJQUxJWkFCTEUpOwotCi0gICAgLy8gQ3JlYXRlIHJlc291cmNlCi0gICAgY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0gIH0KLX0gLy9TT0FQUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWQyZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLio7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFNPQVBQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQQWRhcHRlckZhY3RvcnkoKQotICB7Ci0gICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG1vZGVsUGFja2FnZSA9IFNPQVBQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgewotICAgICAgcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIFNPQVBTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotICAgIG5ldyBTT0FQU3dpdGNoKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VTT0FQQmluZGluZyhTT0FQQmluZGluZyBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTT0FQQmluZGluZ0FkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBCb2R5KFNPQVBCb2R5IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBCb2R5QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlckJhc2UoU09BUEhlYWRlckJhc2Ugb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlU09BUEhlYWRlckJhc2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VTT0FQRmF1bHQoU09BUEZhdWx0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBGYXVsdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBPcGVyYXRpb24oU09BUE9wZXJhdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTT0FQT3BlcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlU09BUEFkZHJlc3MoU09BUEFkZHJlc3Mgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlU09BUEFkZHJlc3NBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VTT0FQSGVhZGVyRmF1bHQoU09BUEhlYWRlckZhdWx0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXJGYXVsdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBIZWFkZXIoU09BUEhlYWRlciBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTT0FQSGVhZGVyQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlV1NETEVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICB9OwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0gICAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KQotICB7Ci0gICAgcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyA8ZW0+QmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQQmluZGluZ0FkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkgPGVtPkJvZHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEJvZHlBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlIDxlbT5IZWFkZXIgQmFzZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQSGVhZGVyQmFzZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0IDxlbT5GYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEZhdWx0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uIDxlbT5PcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQT3BlcmF0aW9uQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzcyA8ZW0+QWRkcmVzczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3MKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQQWRkcmVzc0FkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0IDxlbT5IZWFkZXIgRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJGYXVsdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlciA8ZW0+SGVhZGVyPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEhlYWRlckFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotfSAvL1NPQVBBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzkwYzMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU09BUENvbnN0YW50cyAKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREUkVTU19FTEVNRU5UX1RBRyA9ICJhZGRyZXNzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19FTEVNRU5UX1RBRyA9ICJiaW5kaW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWV9FTEVNRU5UX1RBRyA9ICJib2R5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfRUxFTUVOVF9UQUcgPSAiZmF1bHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRUxFTUVOVF9UQUcgPSAiaGVhZGVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0ZBVUxUX0VMRU1FTlRfVEFHID0gImhlYWRlcmZhdWx0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUSU9OX0VMRU1FTlRfVEFHID0gIm9wZXJhdGlvbiI7Ci0JICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOwotIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0FDVElPTl9BVFRSSUJVVEUgPSJzb2FwQWN0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfQVRUUklCVVRFID0ic3R5bGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9BVFRSSUJVVEUgPSJsb2NhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9BVFRSSUJVVEUgPSJ0cmFuc3BvcnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQVRUUklCVVRFID0idXNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0FUVFJJQlVURSA9Im5hbWVzcGFjZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUklfQVRUUklCVVRFID0ibmFtZXNwYWNlVVJJIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEUgPSJuYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfU1RZTEVfQVRUUklCVVRFID0iZW5jb2RpbmdTdHlsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfQVRUUklCVVRFID0ibWVzc2FnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfQVRUUklCVVRFID0icGFydCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgewotICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA/IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIDogbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTJkYWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5Ci17Ci0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgaWYgKFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIGlmIChTT0FQQ29uc3RhbnRzLkFERFJFU1NfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEFkZHJlc3MoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFNPQVBDb25zdGFudHMuQklORElOR19FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQmluZGluZygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoU09BUENvbnN0YW50cy5CT0RZX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChTT0FQQ29uc3RhbnRzLkZBVUxUX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgCXJldHVybiBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEZhdWx0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChTT0FQQ29uc3RhbnRzLk9QRVJBVElPTl9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBPcGVyYXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFNPQVBDb25zdGFudHMuSEVBREVSX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgCXJldHVybiBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlcigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoU09BUENvbnN0YW50cy5IRUFERVJfRkFVTFRfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAJcmV0dXJuIFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQSGVhZGVyRmF1bHQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVuaGFuZGxlZCBsb2NhbE5hbWU6ICIgKyBsb2NhbE5hbWUpOwotICAgICAgICByZXR1cm4gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVuaGFuZGxlZCBuYW1lc3BhY2U6ICIgKyBuYW1lc3BhY2UpOwotICAgICAgcmV0dXJuIFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmMzQwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvdXRpbC9TT0FQU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLio7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUFN3aXRjaCB7Ci0gIC8qKgotICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFNPQVBQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQU3dpdGNoKCkKLSAgewotICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtb2RlbFBhY2thZ2UgPSBTT0FQUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KQotICB7Ci0gICAgRUNsYXNzIHRoZUVDbGFzcyA9IHRoZUVPYmplY3QuZUNsYXNzKCk7Ci0gICAgaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQotICAgICAgewotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElORzoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gKFNPQVBCaW5kaW5nKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQQmluZGluZyhzb2FwQmluZGluZyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBCaW5kaW5nKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWToKLSAgICAgICAgewotICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gKFNPQVBCb2R5KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQQm9keShzb2FwQm9keSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJvZHkpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBCb2R5KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJvZHkpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0U6Ci0gICAgICAgIHsKLSAgICAgICAgICBTT0FQSGVhZGVyQmFzZSBzb2FwSGVhZGVyQmFzZSA9IChTT0FQSGVhZGVyQmFzZSl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlU09BUEhlYWRlckJhc2Uoc29hcEhlYWRlckJhc2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXJCYXNlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChzb2FwSGVhZGVyQmFzZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXJCYXNlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUOgotICAgICAgICB7Ci0gICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IChTT0FQRmF1bHQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVNPQVBGYXVsdChzb2FwRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoc29hcEZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTjoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IChTT0FQT3BlcmF0aW9uKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQT3BlcmF0aW9uKHNvYXBPcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBPcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBPcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwT3BlcmF0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1M6Ci0gICAgICAgIHsKLSAgICAgICAgICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcyA9IChTT0FQQWRkcmVzcyl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlU09BUEFkZHJlc3Moc29hcEFkZHJlc3MpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBBZGRyZXNzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChzb2FwQWRkcmVzcyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBBZGRyZXNzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVDoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBIZWFkZXJGYXVsdCBzb2FwSGVhZGVyRmF1bHQgPSAoU09BUEhlYWRlckZhdWx0KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQSGVhZGVyRmF1bHQoc29hcEhlYWRlckZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VTT0FQSGVhZGVyQmFzZShzb2FwSGVhZGVyRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXJGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoc29hcEhlYWRlckZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEhlYWRlckZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUjoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBIZWFkZXIgc29hcEhlYWRlciA9IChTT0FQSGVhZGVyKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQSGVhZGVyKHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNPQVBIZWFkZXJCYXNlKHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwSGVhZGVyKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEJpbmRpbmcoU09BUEJpbmRpbmcgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJvZHk8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Qm9keTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEJvZHkoU09BUEJvZHkgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhlYWRlciBCYXNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhlYWRlciBCYXNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTT0FQSGVhZGVyQmFzZShTT0FQSGVhZGVyQmFzZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNPQVBGYXVsdChTT0FQRmF1bHQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNPQVBPcGVyYXRpb24oU09BUE9wZXJhdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWRkcmVzczwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZGRyZXNzPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTT0FQQWRkcmVzcyhTT0FQQWRkcmVzcyBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVhZGVyIEZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhlYWRlciBGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlckZhdWx0KFNPQVBIZWFkZXJGYXVsdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVhZGVyPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkhlYWRlcjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlcihTT0FQSGVhZGVyIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19IC8vU09BUFN3aXRjaApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9leHRlbnNpYmlsaXR5L0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwYjc5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9leHRlbnNpYmlsaXR5L0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvcgotewotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfTE9BRElOR19FUlJPUiA9ICJDTEFTU19MT0FESU5HX0VSUk9SIjsKLSAgCi0gIHByb3RlY3RlZCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOyAgCi0gIHByb3RlY3RlZCBPYmplY3QgZmFjdG9yeTsKLQotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvcihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgewotICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgfQotCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZ2V0RXh0ZW5zaWJsaXR5RWxlbWVudEZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkgOiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgIGZhY3RvcnkgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KXRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGZhY3RvcnkgPSBDTEFTU19MT0FESU5HX0VSUk9SOwotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFjdG9yeSAhPSBDTEFTU19MT0FESU5HX0VSUk9SID8gKEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSlmYWN0b3J5IDogbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaWJsaXR5RWxlbWVudEZhY3RvcnkoRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYmMwMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkKLXsKLSAgcHJvdGVjdGVkIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHB1dChTdHJpbmcgbmFtZXNwYWNlLCBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCi0gIHsKLSAgICBtYXAucHV0KG5hbWVzcGFjZSwgZGVzY3JpcHRvcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgcmVzdWx0ID0gbnVsbDsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvciltYXAuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBkZXNjcmlwdG9yLmdldEV4dGVuc2libGl0eUVsZW1lbnRGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRmFjdG9yeShTdHJpbmcgbmFtZXNwYWNlLCBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZmFjdG9yeSkKLSAgewotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yKG51bGwsbmFtZXNwYWNlLG51bGwpOwotICAgIGRlc2NyaXB0b3Iuc2V0RXh0ZW5zaWJsaXR5RWxlbWVudEZhY3RvcnkoZmFjdG9yeSk7Ci0gICAgbWFwLnB1dChuYW1lc3BhY2UsZGVzY3JpcHRvcik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjNTQwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9leHRlbnNpYmlsaXR5L0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmV4dGVuc2liaWxpdHk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IFdTRExQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OQU1FID0gImV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgcHJvdGVjdGVkIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5SW1wbCBleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeTsKLQotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIoRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsIGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5leHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSA9IGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLSAgewotICAgIElQbHVnaW5SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0gICAgSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcGx1Z2luUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyByZXNvbHZlKFVSTCBwbGF0Zm9ybVVSTCwgU3RyaW5nIHJlbGF0aXZlUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgVVJMIHJlc29sdmVkVVJMID0gUGxhdGZvcm0ucmVzb2x2ZShwbGF0Zm9ybVVSTCk7Ci0gICAgcmV0dXJuIHJlc29sdmVkVVJMLnRvU3RyaW5nKCkgKyByZWxhdGl2ZVBhdGg7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRUxFTUVOVF9OQU1FKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkRWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FU1BBQ0UpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDbGFzc0xvYWRlciBwbHVnaW5DbGFzc3NMb2FkZXIgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpOwotICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IoY2xhc3NOYW1lLG5hbWVzcGFjZSxwbHVnaW5DbGFzc3NMb2FkZXIpOwotICAgICAgICAgIGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5LnB1dChuYW1lc3BhY2UsIGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nRmF1bHRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdGYXVsdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkNDhkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdGYXVsdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIEZhdWx0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ZhdWx0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ZhdWx0SW1wbCNnZXRFRmF1bHQgPGVtPkVGYXVsdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdGYXVsdEltcGwgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBCaW5kaW5nRmF1bHQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUZhdWx0KCkgPGVtPkVGYXVsdDwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEZhdWx0IGVGYXVsdCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ0ZhdWx0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdGYXVsdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0gICAgbmFtZSA9IG5ld05hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRmF1bHQgZ2V0RUZhdWx0KCkKLSAgewotICAgIGlmIChlRmF1bHQgIT0gbnVsbCAmJiBlRmF1bHQuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBGYXVsdCBvbGRFRmF1bHQgPSBlRmF1bHQ7Ci0gICAgICBlRmF1bHQgPSAoRmF1bHQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVGYXVsdCk7Ci0gICAgICBpZiAoZUZhdWx0ICE9IG9sZEVGYXVsdCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRkFVTFQsIG9sZEVGYXVsdCwgZUZhdWx0KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlRmF1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBGYXVsdCBiYXNpY0dldEVGYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZUZhdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFRmF1bHQoRmF1bHQgbmV3RUZhdWx0KQotICB7Ci0gICAgRmF1bHQgb2xkRUZhdWx0ID0gZUZhdWx0OwotICAgIGVGYXVsdCA9IG5ld0VGYXVsdDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRkFVTFQsIG9sZEVGYXVsdCwgZUZhdWx0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5GYXVsdCBnZXRGYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUZhdWx0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYXVsdChqYXZheC53c2RsLkZhdWx0IGZhdWx0KQotICB7Ci0gICAgc2V0RUZhdWx0KChGYXVsdCkgZmF1bHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19OQU1FOgotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRkFVTFQ6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RUZhdWx0KCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVGYXVsdCgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VGQVVMVDoKLSAgICAgICAgc2V0RUZhdWx0KChGYXVsdCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VGQVVMVDoKLSAgICAgICAgc2V0RUZhdWx0KChGYXVsdCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRkFVTFQ6Ci0gICAgICAgIHJldHVybiBlRmF1bHQgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3VwZXIuaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChjaGlsZCxyZW1haW5pbmdNb2RlbE9iamVjdHMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5yZW1vdmUoaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpIGNvbXBvbmVudDsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGRBbGwoYmluZGluZ0ZhdWx0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdGYXVsdF9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5GQVVMVCk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotICAKLSAgLy8gUmVzb2x2ZSB0aGUgcmVmZXJlbmNlIHRvIEZhdWx0Ci0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZVJlZmVyZW5jZXMoYm9vbGVhbiBkZWVwKQotICB7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJvcCA9IChCaW5kaW5nT3BlcmF0aW9uKWdldENvbnRhaW5lcigpOwotICAgICAgT3BlcmF0aW9uIG9wID0gYm9wLmdldEVPcGVyYXRpb24oKTsKLSAgICAgIGlmIChvcCAhPSBudWxsKQotICAgICAgewotICAgICAgCS8vIFRCRCAtIFJldmlzaXQgQVBJLiBHZXQgdGhlIGZpcnN0IEZhdWx0LgotICAgICAgICBzZXRGYXVsdCgoRmF1bHQpb3AuZ2V0RUZhdWx0cygpLmdldCgwKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLX0gLy9CaW5kaW5nRmF1bHRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjY3NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ltcGwjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ltcGwjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdJbXBsI2lzUHJveHkgPGVtPlByb3h5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ltcGwjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdJbXBsI2dldEVQb3J0VHlwZSA8ZW0+RVBvcnQgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdJbXBsI2dldEVCaW5kaW5nT3BlcmF0aW9ucyA8ZW0+RUJpbmRpbmcgT3BlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdJbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQmluZGluZwotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWUgPSBRTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVU5ERUZJTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlZmluZWQgPSBVTkRFRklORURfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST1hZX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm94eSA9IFBST1hZX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlVVJJID0gUkVTT1VSQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUG9ydFR5cGUoKSA8ZW0+RVBvcnQgVHlwZTwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RVBvcnRUeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFBvcnRUeXBlIGVQb3J0VHlwZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVCaW5kaW5nT3BlcmF0aW9ucygpIDxlbT5FQmluZGluZyBPcGVyYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVCaW5kaW5nT3BlcmF0aW9ucygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlQmluZGluZ09wZXJhdGlvbnMgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHFOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRRTmFtZShRTmFtZSBuZXdRTmFtZSkKLSAgewotICAgIFFOYW1lIG9sZFFOYW1lID0gcU5hbWU7Ci0gICAgcU5hbWUgPSBuZXdRTmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX19RTkFNRSwgb2xkUU5hbWUsIHFOYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kZWZpbmVkKCkKLSAgewotICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIG5ld1VuZGVmaW5lZCkKLSAgewotICAgIGJvb2xlYW4gb2xkVW5kZWZpbmVkID0gdW5kZWZpbmVkOwotICAgIHVuZGVmaW5lZCA9IG5ld1VuZGVmaW5lZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX19VTkRFRklORUQsIG9sZFVuZGVmaW5lZCwgdW5kZWZpbmVkKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIHByb3h5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eShib29sZWFuIG5ld1Byb3h5KQotICB7Ci0gICAgYm9vbGVhbiBvbGRQcm94eSA9IHByb3h5OwotICAgIHByb3h5ID0gbmV3UHJveHk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19fUFJPWFksIG9sZFByb3h5LCBwcm94eSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVVJJKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVUkkoU3RyaW5nIG5ld1Jlc291cmNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZFJlc291cmNlVVJJID0gcmVzb3VyY2VVUkk7Ci0gICAgcmVzb3VyY2VVUkkgPSBuZXdSZXNvdXJjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX19SRVNPVVJDRV9VUkksIG9sZFJlc291cmNlVVJJLCByZXNvdXJjZVVSSSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUG9ydFR5cGUgZ2V0RVBvcnRUeXBlKCkKLSAgewotICAgIGlmIChlUG9ydFR5cGUgIT0gbnVsbCAmJiBlUG9ydFR5cGUuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBvbGRFUG9ydFR5cGUgPSBlUG9ydFR5cGU7Ci0gICAgICBlUG9ydFR5cGUgPSAoUG9ydFR5cGUpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVQb3J0VHlwZSk7Ci0gICAgICBpZiAoZVBvcnRUeXBlICE9IG9sZEVQb3J0VHlwZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5CSU5ESU5HX19FUE9SVF9UWVBFLCBvbGRFUG9ydFR5cGUsIGVQb3J0VHlwZSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZVBvcnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUG9ydFR5cGUgYmFzaWNHZXRFUG9ydFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGVQb3J0VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RVBvcnRUeXBlKFBvcnRUeXBlIG5ld0VQb3J0VHlwZSkKLSAgewotICAgIFBvcnRUeXBlIG9sZEVQb3J0VHlwZSA9IGVQb3J0VHlwZTsKLSAgICBlUG9ydFR5cGUgPSBuZXdFUG9ydFR5cGU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19fRVBPUlRfVFlQRSwgb2xkRVBvcnRUeXBlLCBlUG9ydFR5cGUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVCaW5kaW5nT3BlcmF0aW9ucygpCi0gIHsKLSAgICBpZiAoZUJpbmRpbmdPcGVyYXRpb25zID09IG51bGwpCi0gICAgewotICAgICAgZUJpbmRpbmdPcGVyYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEJpbmRpbmdPcGVyYXRpb24uY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VCSU5ESU5HX09QRVJBVElPTlMpOwotICAgIH0KLSAgICByZXR1cm4gZUJpbmRpbmdPcGVyYXRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhbiBvcGVyYXRpb24gYmluZGluZyB0byBiaW5kaW5nLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEJpbmRpbmdPcGVyYXRpb24oamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBnZXRCaW5kaW5nT3BlcmF0aW9ucygpLmFkZChiaW5kaW5nT3BlcmF0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gYmluZGluZy4gTm90ZSB0aGF0IG9wZXJhdGlvbiBuYW1lcyBjYW4KLSAgICogYmUgb3ZlcmxvYWRlZCB3aXRoaW4gYSBQb3J0VHlwZS4gSW4gY2FzZSBvZiBvdmVybG9hZGluZywgdGhlCi0gICAqIG5hbWVzIG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1lc3NhZ2VzIGNhbiBiZSB1c2VkIHRvIGZ1cnRoZXIKLSAgICogcmVmaW5lIHRoZSBzZWFyY2guCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIG9wZXJhdGlvbiBiaW5kaW5nLgotICAgKiBAcGFyYW0gaW5wdXROYW1lIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBtZXNzYWdlOyBpZiB0aGlzIGlzIG51bGwKLSAgICogaXQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcGFyYW0gb3V0cHV0TmFtZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IG1lc3NhZ2U7IGlmIHRoaXMgaXMgbnVsbAotICAgKiBpdCB3aWxsIGJlIGlnbm9yZWQuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGJpbmRpbmcsIG9yIG51bGwgaWYgdGhlcmUgd2Fzbid0Ci0gICAqIGFueSBtYXRjaGluZyBvcGVyYXRpb24gYmluZGluZwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gZ2V0QmluZGluZ09wZXJhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGlucHV0TmFtZSwgU3RyaW5nIG91dHB1dE5hbWUpCi0gIHsKLSAgICBJdGVyYXRvciBvcEJpbmRpbmdJdGVyYXRvciA9IGdldEJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAob3BCaW5kaW5nSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBvcCA9IChqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24pIG9wQmluZGluZ0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChvcCA9PSBudWxsKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgU3RyaW5nIG9wTmFtZSA9IG9wLmdldE5hbWUoKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgb3BOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICghbmFtZS5lcXVhbHMob3BOYW1lKSkKLSAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuYW1lICE9IG51bGwgfHwgb3BOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9wID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgaWYgKG9wICE9IG51bGwgJiYgaW5wdXROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGphdmF4LndzZGwuQmluZGluZ0lucHV0IGlucHV0ID0gb3AuZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG9wSW5wdXROYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotICAgICAgICAgIGlmIChvcElucHV0TmFtZSA9PSBudWxsIHx8ICFvcElucHV0TmFtZS5lcXVhbHMoaW5wdXROYW1lKSkKLSAgICAgICAgICAgIG9wID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgb3AgPSBudWxsOwotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCAmJiBvdXRwdXROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGphdmF4LndzZGwuQmluZGluZ091dHB1dCBvdXRwdXQgPSBvcC5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBvcE91dHB1dE5hbWUgPSBvdXRwdXQuZ2V0TmFtZSgpOwotICAgICAgICAgIGlmIChvcE91dHB1dE5hbWUgPT0gbnVsbCB8fCAhb3BPdXRwdXROYW1lLmVxdWFscyhvdXRwdXROYW1lKSkKLSAgICAgICAgICAgIG9wID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgb3AgPSBudWxsOwotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIG9wOwotICAgIH0gLy8gZW5kIHdoaWxlCi0gICAgcmV0dXJuIG51bGw7IC8vIGJpbmRpbmcgb3BlcmF0aW9uIG5vdCBmb3VuZAotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIG9wZXJhdGlvbiBiaW5kaW5ncyBkZWZpbmVkIGhlcmUuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0QmluZGluZ09wZXJhdGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIGdldEVCaW5kaW5nT3BlcmF0aW9ucygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuUG9ydFR5cGUgZ2V0UG9ydFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGdldEVQb3J0VHlwZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UG9ydFR5cGUoamF2YXgud3NkbC5Qb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIHNldEVQb3J0VHlwZSgoUG9ydFR5cGUpIHBvcnRUeXBlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VCSU5ESU5HX09QRVJBVElPTlM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQmluZGluZ09wZXJhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUU5BTUU6Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiBpc1VuZGVmaW5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUFJPWFk6Ci0gICAgICAgIHJldHVybiBpc1Byb3h5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FUE9SVF9UWVBFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVQb3J0VHlwZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFUG9ydFR5cGUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUJJTkRJTkdfT1BFUkFUSU9OUzoKLSAgICAgICAgcmV0dXJuIGdldEVCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19RTkFNRToKLSAgICAgICAgc2V0UU5hbWUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19QUk9YWToKLSAgICAgICAgc2V0UHJveHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FUE9SVF9UWVBFOgotICAgICAgICBzZXRFUG9ydFR5cGUoKFBvcnRUeXBlKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FQklORElOR19PUEVSQVRJT05TOgotICAgICAgICBnZXRFQmluZGluZ09wZXJhdGlvbnMoKS5jbGVhcigpOwotICAgICAgICBnZXRFQmluZGluZ09wZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKFFOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZChVTkRFRklORURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1BST1hZOgotICAgICAgICBzZXRQcm94eShQUk9YWV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSShSRVNPVVJDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VQT1JUX1RZUEU6Ci0gICAgICAgIHNldEVQb3J0VHlwZSgoUG9ydFR5cGUpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUJJTkRJTkdfT1BFUkFUSU9OUzoKLSAgICAgICAgZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19RTkFNRToKLSAgICAgICAgcmV0dXJuIFFOQU1FX0VERUZBVUxUID09IG51bGwgPyBxTmFtZSAhPSBudWxsIDogIVFOQU1FX0VERUZBVUxULmVxdWFscyhxTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCAhPSBVTkRFRklORURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1BST1hZOgotICAgICAgICByZXR1cm4gcHJveHkgIT0gUFJPWFlfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVUkkgIT0gbnVsbCA6ICFSRVNPVVJDRV9VUklfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRVBPUlRfVFlQRToKLSAgICAgICAgcmV0dXJuIGVQb3J0VHlwZSAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FQklORElOR19PUEVSQVRJT05TOgotICAgICAgICByZXR1cm4gZUJpbmRpbmdPcGVyYXRpb25zICE9IG51bGwgJiYgIWVCaW5kaW5nT3BlcmF0aW9ucy5pc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHFOYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHFOYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHVuZGVmaW5lZDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1bmRlZmluZWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJveHk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJveHkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLQotICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICBzZXRRTmFtZShxbmFtZSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBjb21wb25lbnQ7Ci0KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGRBbGwoYmluZGluZy5nZXRFQmluZGluZ09wZXJhdGlvbnMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN3aXRjaCAoV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShjaGlsZCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLk9QRVJBVElPTiA6Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldEVuY2xvc2luZ0RlZmluaXRpb24oZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICBhZGRCaW5kaW5nT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQscmVtYWluaW5nTW9kZWxPYmplY3RzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHJlbW92ZSh0aGlzLCBpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKE9iamVjdCBjb21wb25lbnQsIE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IGdldExpc3QoY29tcG9uZW50LCBtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LnJlbW92ZShtb2RlbE9iamVjdCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBMaXN0IGdldExpc3QoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBudWxsOwotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBjb21wb25lbnQ7Ci0gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ09wZXJhdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGJpbmRpbmcuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nX1FOYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlUmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlUmVmZXJlbmNlKGVSZWZlcmVuY2UpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlUmVmZXJlbmNlID09IG51bGwgfHwgZVJlZmVyZW5jZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZ19FUG9ydFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBnZXRFUG9ydFR5cGUoKTsKLSAgICAgICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxTmFtZSA9IHBvcnRUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZVVSSVZhbHVlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpICsgIiMiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuQklORElORyk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEJpbmRpbmdPcGVyYXRpb25JbXBsKSBvcGVyYXRpb24pLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIGl0ZXJhdG9yID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIFFOYW1lIHBvcnRUeXBlUU5hbWUgPSBjcmVhdGVRTmFtZShkZWZpbml0aW9uLCBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpKTsKLSAgICAgIFBvcnRUeXBlIG5ld1BvcnRUeXBlID0gcG9ydFR5cGVRTmFtZSAhPSBudWxsID8gKFBvcnRUeXBlKSBkZWZpbml0aW9uLmdldFBvcnRUeXBlKHBvcnRUeXBlUU5hbWUpIDogbnVsbDsKLSAgICAgIGlmIChuZXdQb3J0VHlwZSAhPSBnZXRFUG9ydFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgc2V0RVBvcnRUeXBlKG5ld1BvcnRUeXBlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotfSAvL0JpbmRpbmdJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdJbnB1dEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0lucHV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDZhYmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0lucHV0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIElucHV0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0lucHV0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0lucHV0SW1wbCNnZXRFSW5wdXQgPGVtPkVJbnB1dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdJbnB1dEltcGwgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBCaW5kaW5nSW5wdXQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUlucHV0KCkgPGVtPkVJbnB1dDwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUlucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIElucHV0IGVJbnB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ0lucHV0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdJbnB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0gICAgbmFtZSA9IG5ld05hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgSW5wdXQgZ2V0RUlucHV0KCkKLSAgewotICAgIGlmIChlSW5wdXQgIT0gbnVsbCAmJiBlSW5wdXQuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBJbnB1dCBvbGRFSW5wdXQgPSBlSW5wdXQ7Ci0gICAgICBlSW5wdXQgPSAoSW5wdXQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVJbnB1dCk7Ci0gICAgICBpZiAoZUlucHV0ICE9IG9sZEVJbnB1dCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FSU5QVVQsIG9sZEVJbnB1dCwgZUlucHV0KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlSW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBJbnB1dCBiYXNpY0dldEVJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZUlucHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFSW5wdXQoSW5wdXQgbmV3RUlucHV0KQotICB7Ci0gICAgSW5wdXQgb2xkRUlucHV0ID0gZUlucHV0OwotICAgIGVJbnB1dCA9IG5ld0VJbnB1dDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FSU5QVVQsIG9sZEVJbnB1dCwgZUlucHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5JbnB1dCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUlucHV0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChqYXZheC53c2RsLklucHV0IGlucHV0KQotICB7Ci0gICAgc2V0RUlucHV0KChJbnB1dCkgaW5wdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19OQU1FOgotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FSU5QVVQ6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RUlucHV0KCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVJbnB1dCgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VJTlBVVDoKLSAgICAgICAgc2V0RUlucHV0KChJbnB1dCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VJTlBVVDoKLSAgICAgICAgc2V0RUlucHV0KChJbnB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FSU5QVVQ6Ci0gICAgICAgIHJldHVybiBlSW5wdXQgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxpYXRpb24gbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXROYW1lKG5hbWUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnJlbW92ZShpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gKEJpbmRpbmdJbnB1dCkgY29tcG9uZW50OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZEFsbChiaW5kaW5nSW5wdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZ0lucHV0X05hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROYW1lKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLklOUFVUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCkgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0gIAotICAvLyBSZXNvbHZlIHRoZSByZWZlcmVuY2UgdG8gSW5wdXQKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm9wID0gKEJpbmRpbmdPcGVyYXRpb24pZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBPcGVyYXRpb24gb3AgPSBib3AuZ2V0RU9wZXJhdGlvbigpOwotICAgICAgaWYgKG9wICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNldElucHV0KG9wLmdldEVJbnB1dCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotfSAvL0JpbmRpbmdJbnB1dEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ09wZXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ09wZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4N2Y1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdPcGVyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZyBPcGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nT3BlcmF0aW9uSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwjZ2V0RU9wZXJhdGlvbiA8ZW0+RU9wZXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdPcGVyYXRpb25JbXBsI2dldEVCaW5kaW5nSW5wdXQgPGVtPkVCaW5kaW5nIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwjZ2V0RUJpbmRpbmdPdXRwdXQgPGVtPkVCaW5kaW5nIE91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdPcGVyYXRpb25JbXBsI2dldEVCaW5kaW5nRmF1bHRzIDxlbT5FQmluZGluZyBGYXVsdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nT3BlcmF0aW9uSW1wbCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJpbmRpbmdPcGVyYXRpb24KLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RU9wZXJhdGlvbigpIDxlbT5FT3BlcmF0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIE9wZXJhdGlvbiBlT3BlcmF0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUJpbmRpbmdJbnB1dCgpIDxlbT5FQmluZGluZyBJbnB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmdJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nSW5wdXQgZUJpbmRpbmdJbnB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVCaW5kaW5nT3V0cHV0KCkgPGVtPkVCaW5kaW5nIE91dHB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmdPdXRwdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ091dHB1dCBlQmluZGluZ091dHB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVCaW5kaW5nRmF1bHRzKCkgPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFQmluZGluZ0ZhdWx0cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlQmluZGluZ0ZhdWx0cyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBNYXAgYmluZGluZ0ZhdWx0czsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nT3BlcmF0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdPcGVyYXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPcGVyYXRpb24gZ2V0RU9wZXJhdGlvbigpCi0gIHsKLSAgICBpZiAoZU9wZXJhdGlvbiAhPSBudWxsICYmIGVPcGVyYXRpb24uZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBPcGVyYXRpb24gb2xkRU9wZXJhdGlvbiA9IGVPcGVyYXRpb247Ci0gICAgICBlT3BlcmF0aW9uID0gKE9wZXJhdGlvbillUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZU9wZXJhdGlvbik7Ci0gICAgICBpZiAoZU9wZXJhdGlvbiAhPSBvbGRFT3BlcmF0aW9uKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OLCBvbGRFT3BlcmF0aW9uLCBlT3BlcmF0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlT3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uIGJhc2ljR2V0RU9wZXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZU9wZXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RU9wZXJhdGlvbihPcGVyYXRpb24gbmV3RU9wZXJhdGlvbikKLSAgewotICAgIE9wZXJhdGlvbiBvbGRFT3BlcmF0aW9uID0gZU9wZXJhdGlvbjsKLSAgICBlT3BlcmF0aW9uID0gbmV3RU9wZXJhdGlvbjsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRU9QRVJBVElPTiwgb2xkRU9wZXJhdGlvbiwgZU9wZXJhdGlvbikpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZ0lucHV0IGdldEVCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGVCaW5kaW5nSW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IG5ld0VCaW5kaW5nSW5wdXQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBCaW5kaW5nSW5wdXQgb2xkRUJpbmRpbmdJbnB1dCA9IGVCaW5kaW5nSW5wdXQ7Ci0gICAgZUJpbmRpbmdJbnB1dCA9IG5ld0VCaW5kaW5nSW5wdXQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgIHsKLSAgICAgIEVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfSU5QVVQsIG9sZEVCaW5kaW5nSW5wdXQsIG5ld0VCaW5kaW5nSW5wdXQpOwotICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gbXNnczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RUJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgbmV3RUJpbmRpbmdJbnB1dCkKLSAgewotICAgIGlmIChuZXdFQmluZGluZ0lucHV0ICE9IGVCaW5kaW5nSW5wdXQpCi0gICAgewotICAgICAgTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0gICAgICBpZiAoZUJpbmRpbmdJbnB1dCAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZUJpbmRpbmdJbnB1dCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVCwgbnVsbCwgbXNncyk7Ci0gICAgICBpZiAobmV3RUJpbmRpbmdJbnB1dCAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RUJpbmRpbmdJbnB1dCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVCwgbnVsbCwgbXNncyk7Ci0gICAgICBtc2dzID0gYmFzaWNTZXRFQmluZGluZ0lucHV0KG5ld0VCaW5kaW5nSW5wdXQsIG1zZ3MpOwotICAgICAgaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVCwgbmV3RUJpbmRpbmdJbnB1dCwgbmV3RUJpbmRpbmdJbnB1dCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZ091dHB1dCBnZXRFQmluZGluZ091dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZUJpbmRpbmdPdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgbmV3RUJpbmRpbmdPdXRwdXQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBCaW5kaW5nT3V0cHV0IG9sZEVCaW5kaW5nT3V0cHV0ID0gZUJpbmRpbmdPdXRwdXQ7Ci0gICAgZUJpbmRpbmdPdXRwdXQgPSBuZXdFQmluZGluZ091dHB1dDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgewotICAgICAgRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQsIG9sZEVCaW5kaW5nT3V0cHV0LCBuZXdFQmluZGluZ091dHB1dCk7Ci0gICAgICBpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBtc2dzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IG5ld0VCaW5kaW5nT3V0cHV0KQotICB7Ci0gICAgaWYgKG5ld0VCaW5kaW5nT3V0cHV0ICE9IGVCaW5kaW5nT3V0cHV0KQotICAgIHsKLSAgICAgIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotICAgICAgaWYgKGVCaW5kaW5nT3V0cHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllQmluZGluZ091dHB1dCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld0VCaW5kaW5nT3V0cHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFQmluZGluZ091dHB1dCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQsIG51bGwsIG1zZ3MpOwotICAgICAgbXNncyA9IGJhc2ljU2V0RUJpbmRpbmdPdXRwdXQobmV3RUJpbmRpbmdPdXRwdXQsIG1zZ3MpOwotICAgICAgaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQsIG5ld0VCaW5kaW5nT3V0cHV0LCBuZXdFQmluZGluZ091dHB1dCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RUJpbmRpbmdGYXVsdHMoKQotICB7Ci0gICAgaWYgKGVCaW5kaW5nRmF1bHRzID09IG51bGwpCi0gICAgewotICAgICAgZUJpbmRpbmdGYXVsdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmluZGluZ0ZhdWx0LmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVCaW5kaW5nRmF1bHRzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIGZhdWx0IGJpbmRpbmcuCi0gICAqIEBwYXJhbSBmYXVsdCB0aGUgbmV3IGZhdWx0IGJpbmRpbmcKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nRmF1bHQoamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0KQotICB7Ci0gICAgZ2V0RUJpbmRpbmdGYXVsdHMoKS5hZGQoKEJpbmRpbmdGYXVsdCliaW5kaW5nRmF1bHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIGZhdWx0IGJpbmRpbmcuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGZhdWx0IGJpbmRpbmcuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZmF1bHQgYmluZGluZywgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIGZhdWx0IGJpbmRpbmcKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgZ2V0QmluZGluZ0ZhdWx0KFN0cmluZyBuYW1lKQotICB7Ci0gICAgQmluZGluZ0ZhdWx0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUJpbmRpbmdGYXVsdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgQmluZGluZ0ZhdWx0IGZhdWx0ID0gKEJpbmRpbmdGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICBpZiAobmFtZS5lcXVhbHMoZmF1bHQuZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZmF1bHQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIGZhdWx0IGJpbmRpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhdGlvbiBiaW5kaW5nLgotICAgKiBAcmV0dXJuIG5hbWVzIG9mIGZhdWx0IGJpbmRpbmdzCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRCaW5kaW5nRmF1bHRzKCkKLSAgewotICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUJpbmRpbmdGYXVsdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpIGkubmV4dCgpOwotICAgICAgaGFzaE1hcC5wdXQoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSwgYmluZGluZ0ZhdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc2hNYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5PcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRFT3BlcmF0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb24oamF2YXgud3NkbC5PcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgc2V0RU9wZXJhdGlvbigoT3BlcmF0aW9uKSBvcGVyYXRpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuQmluZGluZ0lucHV0IGdldEJpbmRpbmdJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUJpbmRpbmdJbnB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFNldCB0aGUgaW5wdXQgb2YgdGhpcyBvcGVyYXRpb24gYmluZGluZy4KLSAgICogQHBhcmFtIGlucHV0IHRoZSBkZXNpcmVkIGlucHV0Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QmluZGluZ0lucHV0KGphdmF4LndzZGwuQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCkKLSAgewotICAgIHNldEVCaW5kaW5nSW5wdXQoKEJpbmRpbmdJbnB1dCkgYmluZGluZ0lucHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgZ2V0QmluZGluZ091dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUJpbmRpbmdPdXRwdXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBTZXQgdGhlIG91dHB1dCBvZiB0aGlzIG9wZXJhdGlvbiBiaW5kaW5nLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdPdXRwdXQoamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQpCi0gIHsKLSAgICBzZXRFQmluZGluZ091dHB1dCgoQmluZGluZ091dHB1dCkgYmluZGluZ091dHB1dCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUOgotICAgICAgICAgIHJldHVybiBiYXNpY1NldEVCaW5kaW5nSW5wdXQobnVsbCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX09VVFBVVDoKLSAgICAgICAgICByZXR1cm4gYmFzaWNTZXRFQmluZGluZ091dHB1dChudWxsLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUJpbmRpbmdGYXVsdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVPcGVyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RU9wZXJhdGlvbigpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfSU5QVVQ6Ci0gICAgICAgIHJldHVybiBnZXRFQmluZGluZ0lucHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQ6Ci0gICAgICAgIHJldHVybiBnZXRFQmluZGluZ091dHB1dCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTOgotICAgICAgICByZXR1cm4gZ2V0RUJpbmRpbmdGYXVsdHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VPUEVSQVRJT046Ci0gICAgICAgIHNldEVPcGVyYXRpb24oKE9wZXJhdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUOgotICAgICAgICBzZXRFQmluZGluZ0lucHV0KChCaW5kaW5nSW5wdXQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQ6Ci0gICAgICAgIHNldEVCaW5kaW5nT3V0cHV0KChCaW5kaW5nT3V0cHV0KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTOgotICAgICAgICBnZXRFQmluZGluZ0ZhdWx0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVCaW5kaW5nRmF1bHRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OOgotICAgICAgICBzZXRFT3BlcmF0aW9uKChPcGVyYXRpb24pbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUOgotICAgICAgICBzZXRFQmluZGluZ0lucHV0KChCaW5kaW5nSW5wdXQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX09VVFBVVDoKLSAgICAgICAgc2V0RUJpbmRpbmdPdXRwdXQoKEJpbmRpbmdPdXRwdXQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0ZBVUxUUzoKLSAgICAgICAgZ2V0RUJpbmRpbmdGYXVsdHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGVFeHRlbnNpYmlsaXR5RWxlbWVudHMgIT0gbnVsbCAmJiAhZUV4dGVuc2liaWxpdHlFbGVtZW50cy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRU9QRVJBVElPTjoKLSAgICAgICAgcmV0dXJuIGVPcGVyYXRpb24gIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUOgotICAgICAgICByZXR1cm4gZUJpbmRpbmdJbnB1dCAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfT1VUUFVUOgotICAgICAgICByZXR1cm4gZUJpbmRpbmdPdXRwdXQgIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0ZBVUxUUzoKLSAgICAgICAgcmV0dXJuIGVCaW5kaW5nRmF1bHRzICE9IG51bGwgJiYgIWVCaW5kaW5nRmF1bHRzLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCi0gICAgc3dpdGNoIChXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGNoaWxkKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuSU5QVVQgOgotICAgICAgewotICAgICAgICBCaW5kaW5nSW5wdXQgaW5wdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0lucHV0KCk7Ci0gICAgICAgIGlucHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgIGlucHV0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICBzZXRCaW5kaW5nSW5wdXQoaW5wdXQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5PVVRQVVQgOgotICAgICAgewotICAgICAgICBCaW5kaW5nT3V0cHV0IG91dHB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICAgIG91dHB1dC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICBvdXRwdXQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIHNldEJpbmRpbmdPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRkFVTFQgOgotICAgICAgewotICAgICAgICBCaW5kaW5nRmF1bHQgZmF1bHQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgICAgIGZhdWx0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgIGZhdWx0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICBhZGRCaW5kaW5nRmF1bHQoZmF1bHQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgewotICAgICAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUodGhpcywgaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEVCaW5kaW5nSW5wdXQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEVCaW5kaW5nT3V0cHV0KG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nRmF1bHRzKCkucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnJlbW92ZShtb2RlbE9iamVjdCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgY29tcG9uZW50OwotCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQoYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCkpOwotICAgIH0KLQotICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCkpOwotICAgIH0KLQotICAgIGxpc3QuYWRkQWxsKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdGYXVsdHMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoYmluZGluZ09wZXJhdGlvbi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdPcGVyYXRpb25fTmFtZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuT1BFUkFUSU9OKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgQmluZGluZ0lucHV0IGlucHV0ID0gZ2V0RUJpbmRpbmdJbnB1dCgpOwotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEJpbmRpbmdJbnB1dEltcGwpIGlucHV0KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICBCaW5kaW5nT3V0cHV0IG91dHB1dCA9IGdldEVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEJpbmRpbmdPdXRwdXRJbXBsKSBvdXRwdXQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RUJpbmRpbmdGYXVsdHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgQmluZGluZ0ZhdWx0IGZhdWx0ID0gKEJpbmRpbmdGYXVsdCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoQmluZGluZ0ZhdWx0SW1wbCkgZmF1bHQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIGl0ZXJhdG9yID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotICAKLSAgLy8gUmVzb2x2ZSB0aGUgcmVmZXJlbmNlIHRvIE9wZXJhdGlvbgotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0gICAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0T3BlcmF0aW9uKHBvcnRUeXBlLmdldE9wZXJhdGlvbihnZXROYW1lKCksbnVsbCxudWxsKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLX0gLy9CaW5kaW5nT3BlcmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nT3V0cHV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nT3V0cHV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWJmYTRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ091dHB1dEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIE91dHB1dDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdPdXRwdXRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nT3V0cHV0SW1wbCNnZXRFT3V0cHV0IDxlbT5FT3V0cHV0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmluZGluZ091dHB1dEltcGwgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBCaW5kaW5nT3V0cHV0Ci17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVPdXRwdXQoKSA8ZW0+RU91dHB1dDwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBPdXRwdXQgZU91dHB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ091dHB1dEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIFN0cmluZyBvbGROYW1lID0gbmFtZTsKLSAgICBuYW1lID0gbmV3TmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT3V0cHV0IGdldEVPdXRwdXQoKQotICB7Ci0gICAgaWYgKGVPdXRwdXQgIT0gbnVsbCAmJiBlT3V0cHV0LmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgT3V0cHV0IG9sZEVPdXRwdXQgPSBlT3V0cHV0OwotICAgICAgZU91dHB1dCA9IChPdXRwdXQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVPdXRwdXQpOwotICAgICAgaWYgKGVPdXRwdXQgIT0gb2xkRU91dHB1dCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRU9VVFBVVCwgb2xkRU91dHB1dCwgZU91dHB1dCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZU91dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE91dHB1dCBiYXNpY0dldEVPdXRwdXQoKQotICB7Ci0gICAgcmV0dXJuIGVPdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVPdXRwdXQoT3V0cHV0IG5ld0VPdXRwdXQpCi0gIHsKLSAgICBPdXRwdXQgb2xkRU91dHB1dCA9IGVPdXRwdXQ7Ci0gICAgZU91dHB1dCA9IG5ld0VPdXRwdXQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VPVVRQVVQsIG9sZEVPdXRwdXQsIGVPdXRwdXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk91dHB1dCBnZXRPdXRwdXQoKQotICB7Ci0gICAgcmV0dXJuIGdldEVPdXRwdXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dChqYXZheC53c2RsLk91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBzZXRFT3V0cHV0KChPdXRwdXQpIG91dHB1dCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VPVVRQVVQ6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RU91dHB1dCgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFT3V0cHV0KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FT1VUUFVUOgotICAgICAgICBzZXRFT3V0cHV0KChPdXRwdXQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VPVVRQVVQ6Ci0gICAgICAgIHNldEVPdXRwdXQoKE91dHB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VPVVRQVVQ6Ci0gICAgICAgIHJldHVybiBlT3V0cHV0ICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQobmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQscmVtYWluaW5nTW9kZWxPYmplY3RzKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkucmVtb3ZlKGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9IChCaW5kaW5nT3V0cHV0KSBjb21wb25lbnQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKGJpbmRpbmdPdXRwdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZ091dHB1dF9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5PVVRQVVQpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLSAgCi0gIC8vIFJlc29sdmUgdGhlIHJlZmVyZW5jZSB0byBPdXRwdXQKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm9wID0gKEJpbmRpbmdPcGVyYXRpb24pZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBPcGVyYXRpb24gb3AgPSBib3AuZ2V0RU9wZXJhdGlvbigpOwotICAgICAgaWYgKG9wICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNldE91dHB1dChvcC5nZXRFT3V0cHV0KCkpOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5yZWNvbmNpbGVSZWZlcmVuY2VzKGRlZXApOwotICB9Ci19IC8vQmluZGluZ091dHB1dEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRGVmaW5pdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjNzI1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0RlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ldmVudHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uZXZlbnRzLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uZXZlbnRzLkV2ZW50VGFyZ2V0OwotaW1wb3J0IG9yZy53M2MuZG9tLmV2ZW50cy5NdXRhdGlvbkV2ZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldEVNZXNzYWdlcyA8ZW0+RU1lc3NhZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0RVBvcnRUeXBlcyA8ZW0+RVBvcnQgVHlwZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5EZWZpbml0aW9uSW1wbCNnZXRFQmluZGluZ3MgPGVtPkVCaW5kaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldEVTZXJ2aWNlcyA8ZW0+RVNlcnZpY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0RU5hbWVzcGFjZXMgPGVtPkVOYW1lc3BhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0RVR5cGVzIDxlbT5FVHlwZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5EZWZpbml0aW9uSW1wbCNnZXRFSW1wb3J0cyA8ZW0+RUltcG9ydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZpbml0aW9uSW1wbCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIERlZmluaXRpb24KLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TG9jYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb24gPSBMT0NBVElPTl9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWUgPSBRTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuY29kaW5nKCkgPGVtPkVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbmNvZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5jb2RpbmcoKSA8ZW0+RW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVuY29kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBlbmNvZGluZyA9IEVOQ09ESU5HX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFTWVzc2FnZXMoKSA8ZW0+RU1lc3NhZ2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVNZXNzYWdlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlTWVzc2FnZXMgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUG9ydFR5cGVzKCkgPGVtPkVQb3J0IFR5cGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVQb3J0VHlwZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZVBvcnRUeXBlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVCaW5kaW5ncygpIDxlbT5FQmluZGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmdzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVCaW5kaW5ncyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVTZXJ2aWNlcygpIDxlbT5FU2VydmljZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RVNlcnZpY2VzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVTZXJ2aWNlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVOYW1lc3BhY2VzKCkgPGVtPkVOYW1lc3BhY2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVOYW1lc3BhY2VzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVOYW1lc3BhY2VzID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RVR5cGVzKCkgPGVtPkVUeXBlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RVR5cGVzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFR5cGVzIGVUeXBlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVJbXBvcnRzKCkgPGVtPkVJbXBvcnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVJbXBvcnRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVJbXBvcnRzID0gbnVsbDsKLQotICBwcml2YXRlIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5OwotICBwcml2YXRlIFN0cmluZyBkb2N1bWVudEJhc2VVUkk7Ci0gIHByaXZhdGUgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gIHByaXZhdGUgSGFzaE1hcCBuYW1lc3BhY2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBEZWZpbml0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBuZXdUYXJnZXROYW1lc3BhY2UpCi0gIHsKLSAgICBTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIHRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19UQVJHRVRfTkFNRVNQQUNFLCBvbGRUYXJnZXROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBsb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKQotICB7Ci0gICAgU3RyaW5nIG9sZExvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgbG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19MT0NBVElPTiwgb2xkTG9jYXRpb24sIGxvY2F0aW9uKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFFOYW1lKFFOYW1lIG5ld1FOYW1lKQotICB7Ci0gICAgUU5hbWUgb2xkUU5hbWUgPSBxTmFtZTsKLSAgICBxTmFtZSA9IG5ld1FOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1FOQU1FLCBvbGRRTmFtZSwgcU5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpCi0gIHsKLSAgICByZXR1cm4gZW5jb2Rpbmc7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBuZXdFbmNvZGluZykKLSAgewotICAgIFN0cmluZyBvbGRFbmNvZGluZyA9IGVuY29kaW5nOwotICAgIGVuY29kaW5nID0gbmV3RW5jb2Rpbmc7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5DT0RJTkcsIG9sZEVuY29kaW5nLCBlbmNvZGluZykpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RU1lc3NhZ2VzKCkKLSAgewotICAgIGlmIChlTWVzc2FnZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlTWVzc2FnZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZS5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU1FU1NBR0VTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVNZXNzYWdlczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVQb3J0VHlwZXMoKQotICB7Ci0gICAgaWYgKGVQb3J0VHlwZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlUG9ydFR5cGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBvcnRUeXBlLmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FUE9SVF9UWVBFUyk7Ci0gICAgfQotICAgIHJldHVybiBlUG9ydFR5cGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RUJpbmRpbmdzKCkKLSAgewotICAgIGlmIChlQmluZGluZ3MgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlQmluZGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmluZGluZy5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUJJTkRJTkdTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVCaW5kaW5nczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVTZXJ2aWNlcygpCi0gIHsKLSAgICBpZiAoZVNlcnZpY2VzID09IG51bGwpCi0gICAgewotICAgICAgZVNlcnZpY2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2UuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VTRVJWSUNFUyk7Ci0gICAgfQotICAgIHJldHVybiBlU2VydmljZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFTmFtZXNwYWNlcygpCi0gIHsKLSAgICBpZiAoZU5hbWVzcGFjZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlTmFtZXNwYWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChOYW1lc3BhY2UuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQU1FU1BBQ0VTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVOYW1lc3BhY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgVHlwZXMgZ2V0RVR5cGVzKCkKLSAgewotICAgIHJldHVybiBlVHlwZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVUeXBlcyhUeXBlcyBuZXdFVHlwZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBUeXBlcyBvbGRFVHlwZXMgPSBlVHlwZXM7Ci0gICAgZVR5cGVzID0gbmV3RVR5cGVzOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTLCBvbGRFVHlwZXMsIG5ld0VUeXBlcyk7Ci0gICAgICBpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBtc2dzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFVHlwZXMoVHlwZXMgbmV3RVR5cGVzKQotICB7Ci0gICAgaWYgKG5ld0VUeXBlcyAhPSBlVHlwZXMpCi0gICAgewotICAgICAgTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0gICAgICBpZiAoZVR5cGVzICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllVHlwZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVMsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld0VUeXBlcyAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RVR5cGVzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTLCBudWxsLCBtc2dzKTsKLSAgICAgIG1zZ3MgPSBiYXNpY1NldEVUeXBlcyhuZXdFVHlwZXMsIG1zZ3MpOwotICAgICAgaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VUWVBFUywgbmV3RVR5cGVzLCBuZXdFVHlwZXMpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbXNnKQotICB7Ci0gICAgc3VwZXIuZU5vdGlmeShtc2cpOwotICAgIAotICAgIC8vIGNzLi4gaWYgd2UndmUgYWRkZWQgYSBUeXBlcyBlbGVtZW50LCBhbmQgdGhpcyBkZWZpbml0aW9uIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSByZXNvdXJjZQotICAgIC8vIHdlIG5lZWQgdG8gc2V0IHRoZSBzY2hlbWFMb2NhdGlvbnMgZm9yIGFueSBpbmxpbmUgc2NoZW1hTG9jYXRpb25zLgotICAgIC8vIElmIG5vdCB5ZXQgYXR0YWNoZWQgdG8gYSByZXNvdXJjZSwgdGhlIHNjaGVtYUxvY2F0aW9uJ3Mgd2lsbCBiZSBzZXQgdmlhIFdTRExSZXNvdXJjZUltcGwuYXR0YWNoZWQoRU9iamVjdCBvKQotICAgIC8vCi0gICAgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fRVR5cGVzKCkgJiYKLSAgICAgICAgbXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQpCi0gICAgewotICAgICAgaWYgKGVSZXNvdXJjZSgpIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCAmJiBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0SW5saW5lU2NoZW1hTG9jYXRpb25zKGVSZXNvdXJjZSgpKTsKLSAgICAgIH0gICAgCi0gICAgfSAgICAgICAgCi0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFSW1wb3J0cygpCi0gIHsKLSAgICBpZiAoZUltcG9ydHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlSW1wb3J0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbXBvcnQuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVJbXBvcnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIGJpbmRpbmcgdG8gdGhpcyBXU0RMIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gYmluZGluZyB0aGUgYmluZGluZyB0byBiZSBhZGRlZAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEJpbmRpbmcoamF2YXgud3NkbC5CaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBnZXRFQmluZGluZ3MoKS5hZGQoKEJpbmRpbmcpIGJpbmRpbmcpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhbiBpbXBvcnQgdG8gdGhpcyBXU0RMIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gaW1wb3J0RGVmIHRoZSBpbXBvcnQgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRJbXBvcnQoamF2YXgud3NkbC5JbXBvcnQgaW1wb3J0RGVmKQotICB7Ci0gICAgZ2V0RUltcG9ydHMoKS5hZGQoKEltcG9ydCkgaW1wb3J0RGVmKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBtZXNzYWdlIHRvIHRoaXMgV1NETCBkZXNjcmlwdGlvbi4KLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGphdmF4LndzZGwuTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgZ2V0RU1lc3NhZ2VzKCkuYWRkKChNZXNzYWdlKW1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaXMgYSB3YXkgdG8gYWRkIGEgbmFtZXNwYWNlIGFzc29jaWF0aW9uIHRvIGEgZGVmaW5pdGlvbi4KLSAgICogSXQgaXMgc2ltaWxhciB0byBhZGRpbmcgYSBuYW1lc3BhY2UgcHJlZml4IGRlY2xhcmF0aW9uIHRvIHRoZQotICAgKiB0b3Agb2YgYSAmbHQ7d3NkbDpkZWZpbml0aW9uJmd0OyBlbGVtZW50LiBUaGlzIGhhcyBub3RoaW5nIHRvIGRvCi0gICAqIHdpdGggdGhlICZsdDt3c2RsOmltcG9ydCZndDsgZWxlbWVudDsgdGhlcmUgYXJlIHNlcGFyYXRlIG1ldGhvZHMgZm9yCi0gICAqIGRlYWxpbmcgd2l0aCBpbmZvcm1hdGlvbiBkZXNjcmliZWQgYnkgJmx0O3dzZGw6aW1wb3J0Jmd0OyBlbGVtZW50cy4KLSAgICogVGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZSBhc3NvY2lhdGlvbiAod2hpY2ggY2FuIGJlCi0gICAqIG92ZXJyaWRkZW4pIGJldHdlZW4gdGhlIG51bGwgcHJlZml4IGFuZAotICAgKiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLy4KLSAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IHRvIHVzZSBmb3IgdGhpcyBuYW1lc3BhY2UgKHdoZW4KLSAgICogcmVuZGVyaW5nIHRoaXMgaW5mb3JtYXRpb24gYXMgWE1MKS4gVXNlIG51bGwgb3IgYW4gZW1wdHkgc3RyaW5nCi0gICAqIHRvIGRlc2NyaWJlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSAoaS5lLiB4bWxucz0iLi4uIikuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgdGhlIG5hbWVzcGFjZSBVUkkgdG8gYXNzb2NpYXRlIHRoZSBwcmVmaXgKLSAgICogd2l0aC4gSWYgeW91IHVzZSBudWxsLCB0aGUgbmFtZXNwYWNlIGFzc29jaWF0aW9uIHdpbGwgYmUgcmVtb3ZlZC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgIHByZWZpeCA9ICIiOwotCi0gICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEZpcnN0LCBjaGVjayBpZiB0aGVyZSBpcyB0aGlzIG5hbWVzcGFjZSBhbHJlYWR5LgotICAgICAgU3RyaW5nIGV4aXN0aW5nUHJlZml4ID0gZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICBpZiAoZXhpc3RpbmdQcmVmaXggIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICAvLyBNYWtlIHN1cmUgdGhlIHByZWZpeCBpcyBub3QgYWxyZWFkeSB1c2VkIGZvciBhIGRpZmZlcmVudCBuYW1lc3BhY2UKLSAgICAgIE1hcCBuYW1lc3BhY2VzID0gZ2V0TmFtZXNwYWNlcygpOwotICAgICAgU3RyaW5nIGV4aXN0aW5nTmFtZXNwYWNlID0gKFN0cmluZykgbmFtZXNwYWNlcy5nZXQocHJlZml4KTsKLSAgICAgIGlmIChleGlzdGluZ05hbWVzcGFjZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lc3BhY2VzLnB1dChwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgIAotICAgICAgICAvLyBTdXBwb3J0IGZvciBOYW1lc3BhY2UKLSAgICAgICAgTmFtZXNwYWNlIGVucyA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOYW1lc3BhY2UoKTsKLSAgICAgICAgZW5zLnNldFByZWZpeChwcmVmaXgpOwotICAgICAgICBlbnMuc2V0VVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgIGdldEVOYW1lc3BhY2VzKCkuYWRkKGVucyk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIFRoZSBwcmVmaXggaXMgdGFrZW4gYWxyZWFkeS4gTWFrZSBhIHVuaXF1ZSBwcmVmaXgKLSAgICAgIGlmIChwcmVmaXguZW5kc1dpdGgoIjEiKSkKLSAgICAgICAgcHJlZml4ID0gcHJlZml4LnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKCkgLSAxKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDI7OyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBwcmVmaXggKyBpOwotICAgICAgICBpZiAoIW5hbWVzcGFjZXMuY29udGFpbnNLZXkobmV3UHJlZml4KSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVzcGFjZXMucHV0KG5ld1ByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBTdXBwb3J0IGZvciBOYW1lc3BhY2UKLSAgICAgICAgICBOYW1lc3BhY2UgZW5zID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5hbWVzcGFjZSgpOwotICAgICAgICAgIGVucy5zZXRQcmVmaXgocHJlZml4KTsKLSAgICAgICAgICBlbnMuc2V0VVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgZ2V0RU5hbWVzcGFjZXMoKS5hZGQoZW5zKTsKLSAgICAgICAgICAKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IC8vIGVuZCBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGdldE5hbWVzcGFjZXMoKS5yZW1vdmUocHJlZml4KTsKLSAgICAgIAotICAgICAgLy8gU3VwcG9ydCBmb3IgTmFtZXNwYWNlCi0gICAgICBnZXRFTmFtZXNwYWNlcygpLnJlbW92ZShwcmVmaXgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBwb3J0VHlwZSB0byB0aGlzIFdTREwgZGVzY3JpcHRpb24uCi0gICAqIEBwYXJhbSBwb3J0VHlwZSB0aGUgcG9ydFR5cGUgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQb3J0VHlwZShqYXZheC53c2RsLlBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgZ2V0RVBvcnRUeXBlcygpLmFkZCgoUG9ydFR5cGUpcG9ydFR5cGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIHNlcnZpY2UgdG8gdGhpcyBXU0RMIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gc2VydmljZSB0aGUgc2VydmljZSB0byBiZSBhZGRlZAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoamF2YXgud3NkbC5TZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBnZXRFU2VydmljZXMoKS5hZGQoKFNlcnZpY2Upc2VydmljZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IGJpbmRpbmcgZmF1bHQuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYmluZGluZyBmYXVsdAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nRmF1bHQgY3JlYXRlQmluZGluZ0ZhdWx0KCkKLSAgewotICAgIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgYmluZGluZyBpbnB1dC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBiaW5kaW5nIGlucHV0Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIEJpbmRpbmdJbnB1dCBjcmVhdGVCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICByZXR1cm4gYmluZGluZ0lucHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBiaW5kaW5nIG91dHB1dC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBiaW5kaW5nIG91dHB1dAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nT3V0cHV0IGNyZWF0ZUJpbmRpbmdPdXRwdXQoKQotICB7Ci0gICAgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICByZXR1cm4gYmluZGluZ091dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgYmluZGluZyBvcGVyYXRpb24uCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYmluZGluZyBvcGVyYXRpb24KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCkKLSAgewotICAgIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IGJpbmRpbmcuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYmluZGluZwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmcgY3JlYXRlQmluZGluZygpCi0gIHsKLSAgICBqYXZheC53c2RsLkJpbmRpbmcgYmluZGluZyA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZygpOwotICAgIGJpbmRpbmcuc2V0VW5kZWZpbmVkKHRydWUpOwotICAgIHJldHVybiBiaW5kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBmYXVsdC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBmYXVsdAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBGYXVsdCBjcmVhdGVGYXVsdCgpCi0gIHsKLSAgICBqYXZheC53c2RsLkZhdWx0IGZhdWx0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVGYXVsdCgpOwotICAgIHJldHVybiBmYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgaW1wb3J0LgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGltcG9ydAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkltcG9ydCBjcmVhdGVJbXBvcnQoKQotICB7Ci0gICAgamF2YXgud3NkbC5JbXBvcnQgaW1wb3J0RGVmID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVJbXBvcnQoKTsKLSAgICByZXR1cm4gaW1wb3J0RGVmOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBpbnB1dC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBpbnB1dAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBJbnB1dCBjcmVhdGVJbnB1dCgpCi0gIHsKLSAgICBqYXZheC53c2RsLklucHV0IGlucHV0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVJbnB1dCgpOwotICAgIHJldHVybiBpbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgbWVzc2FnZS4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBtZXNzYWdlCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkKLSAgewotICAgIGphdmF4LndzZGwuTWVzc2FnZSBtZXNzYWdlID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgbWVzc2FnZS5zZXRVbmRlZmluZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IG9wZXJhdGlvbi4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBvcGVyYXRpb24KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbigpCi0gIHsKLSAgICBqYXZheC53c2RsLk9wZXJhdGlvbiBvcGVyYXRpb24gPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIG9wZXJhdGlvbi5zZXRVbmRlZmluZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgb3V0cHV0LgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIG91dHB1dAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBPdXRwdXQgY3JlYXRlT3V0cHV0KCkKLSAgewotICAgIGphdmF4LndzZGwuT3V0cHV0IG91dHB1dCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlT3V0cHV0KCk7Ci0gICAgcmV0dXJuIG91dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgcGFydC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBwYXJ0Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIFBhcnQgY3JlYXRlUGFydCgpCi0gIHsKLSAgICBqYXZheC53c2RsLlBhcnQgcGFydCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlUGFydCgpOwotICAgIHJldHVybiBwYXJ0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBwb3J0LgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHBvcnQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgUG9ydCBjcmVhdGVQb3J0KCkKLSAgewotICAgIGphdmF4LndzZGwuUG9ydCBwb3J0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVQb3J0KCk7Ci0gICAgcmV0dXJuIHBvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IHBvcnQgdHlwZS4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBwb3J0IHR5cGUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5Qb3J0VHlwZSBjcmVhdGVQb3J0VHlwZSgpCi0gIHsKLSAgICBqYXZheC53c2RsLlBvcnRUeXBlIHBvcnRUeXBlID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVQb3J0VHlwZSgpOwotICAgIHBvcnRUeXBlLnNldFVuZGVmaW5lZCh0cnVlKTsKLSAgICByZXR1cm4gcG9ydFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IHNlcnZpY2UuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgc2VydmljZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlNlcnZpY2UgY3JlYXRlU2VydmljZSgpCi0gIHsKLSAgICBqYXZheC53c2RsLlNlcnZpY2Ugc2VydmljZSA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZSgpOwotICAgIHJldHVybiBzZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIGJpbmRpbmcuIEFsc28gY2hlY2tzIGltcG9ydGVkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgYmluZGluZy4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBiaW5kaW5nLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgYmluZGluZwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmcgZ2V0QmluZGluZyhRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLkJpbmRpbmcpIHJlc29sdmVXU0RMRWxlbWVudChXU0RMQ29uc3RhbnRzLkJJTkRJTkcsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIGJpbmRpbmdzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldEJpbmRpbmdzKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVNYXAoV1NETENvbnN0YW50cy5CSU5ESU5HLCBnZXRFQmluZGluZ3MoKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAqIEdldCBhIG1hcCBvZiBsaXN0cyBjb250YWluaW5nIGFsbCB0aGUgaW1wb3J0cyBkZWZpbmVkIGhlcmUuCi0gICAgKiBUaGUgbWFwJ3Mga2V5cyBhcmUgdGhlIG5hbWVzcGFjZVVSSXMsIGFuZCB0aGUgbWFwJ3MgdmFsdWVzCi0gICAgKiBhcmUgbGlzdHMuIFRoZXJlIGlzIG9uZSBsaXN0IGZvciBlYWNoIG5hbWVzcGFjZVVSSSBmb3Igd2hpY2gKLSAgICAqIGltcG9ydHMgaGF2ZSBiZWVuIGRlZmluZWQuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRJbXBvcnRzKCkKLSAgewotICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBJbXBvcnQgdGhlSW1wb3J0ID0gKEltcG9ydCkgaS5uZXh0KCk7Ci0gICAgICBTdHJpbmcga2V5ID0gdGhlSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKGtleSA9PSBudWxsKQotICAgICAgewotICAgICAgICBrZXkgPSAiIjsKLSAgICAgIH0KLSAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbnVsbDsKLSAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoa2V5KSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IChMaXN0KW1hcC5nZXQoa2V5KTsKLSAgICAgICAgbGlzdC5hZGQodGhlSW1wb3J0KTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGxpc3QuYWRkKHRoZUltcG9ydCk7ICAgICAgIAotICAgICAgfQotICAgICAgbWFwLnB1dChrZXksbGlzdCk7ICAgICAgCi0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBsaXN0IG9mIGltcG9ydHMgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlVVJJLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIHRoZSBuYW1lc3BhY2VVUkkgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgKiBkZXNpcmVkIGltcG9ydHMuCi0gICAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGltcG9ydHMKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbXBvcnRzKFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgSW1wb3J0IHRoZUltcG9ydCA9IChJbXBvcnQpIGkubmV4dCgpOwotICAgICAgaWYgKFdTRExDb25zdGFudHMuaXNNYXRjaGluZ05hbWVzcGFjZShuYW1lc3BhY2VVUkksIHRoZUltcG9ydC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHRoZUltcG9ydCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuIEFsc28gY2hlY2tzIGltcG9ydGVkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgbWVzc2FnZS4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBtZXNzYWdlLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgbWVzc2FnZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk1lc3NhZ2UgZ2V0TWVzc2FnZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLk1lc3NhZ2UpIHJlc29sdmVXU0RMRWxlbWVudChXU0RMQ29uc3RhbnRzLk1FU1NBR0UsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIG1lc3NhZ2VzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldE1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVNYXAoV1NETENvbnN0YW50cy5NRVNTQUdFLCBnZXRFTWVzc2FnZXMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBuYW1lc3BhY2UgVVJJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByZWZpeC4gT3IgbnVsbCBpZgotICAgKiB0aGVyZSBpcyBubyBuYW1lc3BhY2UgVVJJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByZWZpeC4gVGhpcyBpcwotICAgKiB1bnJlbGF0ZWQgdG8gdGhlICZsdDt3c2RsOmltcG9ydCZndDsgZWxlbWVudC4KLSAgICogQHNlZSAjYWRkTmFtZXNwYWNlKFN0cmluZywgU3RyaW5nKQotICAgKiBAc2VlICNnZXRQcmVmaXgoU3RyaW5nKQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZykgZ2V0TmFtZXNwYWNlcygpLmdldChwcmVmaXgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgbmFtZXNwYWNlIGFzc29jaWF0aW9ucyBpbiB0aGlzIGRlZmluaXRpb24uIFRoZSBrZXlzIGFyZQotICAgKiB0aGUgcHJlZml4ZXMsIGFuZCB0aGUgbmFtZXNwYWNlIFVSSXMgYXJlIHRoZSB2YWx1ZXMuIFRoaXMgaXMKLSAgICogdW5yZWxhdGVkIHRvIHRoZSAmbHQ7d3NkbDppbXBvcnQmZ3Q7IGVsZW1lbnQuCi0gICAqIEBzZWUgI2FkZE5hbWVzcGFjZShTdHJpbmcsIFN0cmluZykKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldE5hbWVzcGFjZXMoKQotICB7ICAgIAotICAgIHJldHVybiBuYW1lc3BhY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIHBvcnRUeXBlLiBBbHNvIGNoZWNrcyBpbXBvcnRlZCBkb2N1bWVudHMuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHBvcnRUeXBlLgotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHBvcnRUeXBlLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgcG9ydFR5cGUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5Qb3J0VHlwZSBnZXRQb3J0VHlwZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLlBvcnRUeXBlKSByZXNvbHZlV1NETEVsZW1lbnQoV1NETENvbnN0YW50cy5QT1JUX1RZUEUsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIHBvcnRUeXBlcyBkZWZpbmVkIGhlcmUuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRQb3J0VHlwZXMoKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZU1hcChXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSwgZ2V0RVBvcnRUeXBlcygpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYSBwcmVmaXggYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlIFVSSS4gT3IgbnVsbCBpZgotICAgKiB0aGVyZSBhcmUgbm8gcHJlZml4ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlIFVSSS4gVGhpcyBpcwotICAgKiB1bnJlbGF0ZWQgdG8gdGhlICZsdDt3c2RsOmltcG9ydCZndDsgZWxlbWVudC4KLSAgICogQHNlZSAjYWRkTmFtZXNwYWNlKFN0cmluZywgU3RyaW5nKQotICAgKiBAc2VlICNnZXROYW1lc3BhY2UoU3RyaW5nKQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBpZiAobmFtZXNwYWNlVVJJID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIEl0ZXJhdG9yIGVudHJ5SXRlcmF0b3IgPSBnZXROYW1lc3BhY2VzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChlbnRyeUl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBlbnRyeUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgIFN0cmluZyBhc3NvY05hbWVzcGFjZVVSSSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgIGlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKGFzc29jTmFtZXNwYWNlVVJJKSAmJiBwcmVmaXggIT0gIiIpIC8vIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIHNlcnZpY2UuIEFsc28gY2hlY2tzIGltcG9ydGVkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgc2VydmljZS4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBzZXJ2aWNlLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgc2VydmljZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlNlcnZpY2UgZ2V0U2VydmljZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLlNlcnZpY2UpIHJlc29sdmVXU0RMRWxlbWVudChXU0RMQ29uc3RhbnRzLlNFUlZJQ0UsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIHNlcnZpY2VzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldFNlcnZpY2VzKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVNYXAoV1NETENvbnN0YW50cy5TRVJWSUNFLCBnZXRFU2VydmljZXMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBFeHRlbnNpb25SZWdpc3RyeSBmb3IgdGhpcyBEZWZpbml0aW9uLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeSBnZXRFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5zaW9uUmVnaXN0cnk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogU2V0IHRoZSBFeHRlbnNpb25SZWdpc3RyeSBmb3IgdGhpcyBEZWZpbml0aW9uLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvblJlZ2lzdHJ5KEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25SZWdpc3RyeSA9IGV4dGVuc2lvblJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudEJhc2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIGdldExvY2F0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudEJhc2VVUkkoU3RyaW5nIGRvY3VtZW50QmFzZSkKLSAgewotICAgIHNldExvY2F0aW9uKGRvY3VtZW50QmFzZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5UeXBlcyBjcmVhdGVUeXBlcygpCi0gIHsKLSAgICBqYXZheC53c2RsLlR5cGVzIHR5cGVzID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVUeXBlcygpOwotICAgIHJldHVybiB0eXBlczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlNlcnZpY2UgcmVtb3ZlU2VydmljZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLlNlcnZpY2UpIGdldFNlcnZpY2VzKCkucmVtb3ZlKG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuQmluZGluZyByZW1vdmVCaW5kaW5nKFFOYW1lIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gKGphdmF4LndzZGwuQmluZGluZykgZ2V0QmluZGluZ3MoKS5yZW1vdmUobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5Qb3J0VHlwZSByZW1vdmVQb3J0VHlwZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLlBvcnRUeXBlKSBnZXRQb3J0VHlwZXMoKS5yZW1vdmUobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5NZXNzYWdlIHJlbW92ZU1lc3NhZ2UoUU5hbWUgbmFtZSkKLSAgewotICAgIHJldHVybiAoamF2YXgud3NkbC5NZXNzYWdlKSBnZXRNZXNzYWdlcygpLnJlbW92ZShuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlR5cGVzIGdldFR5cGVzKCkKLSAgewotICAgIHJldHVybiBnZXRFVHlwZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVzKGphdmF4LndzZGwuVHlwZXMgdHlwZXMpCi0gIHsKLSAgICBzZXRFVHlwZXMoKFR5cGVzKSB0eXBlcyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFNldHMgdGhlIG93bmVyIGRvY3VtZW50LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU1FU1NBR0VTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RU1lc3NhZ2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FUE9SVF9UWVBFUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVQb3J0VHlwZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VCSU5ESU5HUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVCaW5kaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVNFUlZJQ0VTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVNlcnZpY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTkFNRVNQQUNFUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVOYW1lc3BhY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVM6Ci0gICAgICAgICAgcmV0dXJuIGJhc2ljU2V0RVR5cGVzKG51bGwsIG1zZ3MpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUltcG9ydHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fVEFSR0VUX05BTUVTUEFDRToKLSAgICAgICAgcmV0dXJuIGdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19MT0NBVElPTjoKLSAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1FOQU1FOgotICAgICAgICByZXR1cm4gZ2V0UU5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5DT0RJTkc6Ci0gICAgICAgIHJldHVybiBnZXRFbmNvZGluZygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTUVTU0FHRVM6Ci0gICAgICAgIHJldHVybiBnZXRFTWVzc2FnZXMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVBPUlRfVFlQRVM6Ci0gICAgICAgIHJldHVybiBnZXRFUG9ydFR5cGVzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VCSU5ESU5HUzoKLSAgICAgICAgcmV0dXJuIGdldEVCaW5kaW5ncygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FU0VSVklDRVM6Ci0gICAgICAgIHJldHVybiBnZXRFU2VydmljZXMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5BTUVTUEFDRVM6Ci0gICAgICAgIHJldHVybiBnZXRFTmFtZXNwYWNlcygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVM6Ci0gICAgICAgIHJldHVybiBnZXRFVHlwZXMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUlNUE9SVFM6Ci0gICAgICAgIHJldHVybiBnZXRFSW1wb3J0cygpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICBzZXRUYXJnZXROYW1lc3BhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fTE9DQVRJT046Ci0gICAgICAgIHNldExvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1FOQU1FOgotICAgICAgICBzZXRRTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQ09ESU5HOgotICAgICAgICBzZXRFbmNvZGluZygoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTUVTU0FHRVM6Ci0gICAgICAgIGdldEVNZXNzYWdlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVNZXNzYWdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVBPUlRfVFlQRVM6Ci0gICAgICAgIGdldEVQb3J0VHlwZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFUG9ydFR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FQklORElOR1M6Ci0gICAgICAgIGdldEVCaW5kaW5ncygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVCaW5kaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVNFUlZJQ0VTOgotICAgICAgICBnZXRFU2VydmljZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFU2VydmljZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQU1FU1BBQ0VTOgotICAgICAgICBnZXRFTmFtZXNwYWNlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVOYW1lc3BhY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVM6Ci0gICAgICAgIHNldEVUeXBlcygoVHlwZXMpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTOgotICAgICAgICBnZXRFSW1wb3J0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVJbXBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1RBUkdFVF9OQU1FU1BBQ0U6Ci0gICAgICAgIHNldFRhcmdldE5hbWVzcGFjZShUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19MT0NBVElPTjoKLSAgICAgICAgc2V0TG9jYXRpb24oTE9DQVRJT05fRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1FOQU1FOgotICAgICAgICBzZXRRTmFtZShRTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5DT0RJTkc6Ci0gICAgICAgIHNldEVuY29kaW5nKEVOQ09ESU5HX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTUVTU0FHRVM6Ci0gICAgICAgIGdldEVNZXNzYWdlcygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVBPUlRfVFlQRVM6Ci0gICAgICAgIGdldEVQb3J0VHlwZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VCSU5ESU5HUzoKLSAgICAgICAgZ2V0RUJpbmRpbmdzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FU0VSVklDRVM6Ci0gICAgICAgIGdldEVTZXJ2aWNlcygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5BTUVTUEFDRVM6Ci0gICAgICAgIGdldEVOYW1lc3BhY2VzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVM6Ci0gICAgICAgIHNldEVUeXBlcygoVHlwZXMpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUlNUE9SVFM6Ci0gICAgICAgIGdldEVJbXBvcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICByZXR1cm4gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgOiAhVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVC5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fTE9DQVRJT046Ci0gICAgICAgIHJldHVybiBMT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb24gIT0gbnVsbCA6ICFMT0NBVElPTl9FREVGQVVMVC5lcXVhbHMobG9jYXRpb24pOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19RTkFNRToKLSAgICAgICAgcmV0dXJuIFFOQU1FX0VERUZBVUxUID09IG51bGwgPyBxTmFtZSAhPSBudWxsIDogIVFOQU1FX0VERUZBVUxULmVxdWFscyhxTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQ09ESU5HOgotICAgICAgICByZXR1cm4gRU5DT0RJTkdfRURFRkFVTFQgPT0gbnVsbCA/IGVuY29kaW5nICE9IG51bGwgOiAhRU5DT0RJTkdfRURFRkFVTFQuZXF1YWxzKGVuY29kaW5nKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU1FU1NBR0VTOgotICAgICAgICByZXR1cm4gZU1lc3NhZ2VzICE9IG51bGwgJiYgIWVNZXNzYWdlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VQT1JUX1RZUEVTOgotICAgICAgICByZXR1cm4gZVBvcnRUeXBlcyAhPSBudWxsICYmICFlUG9ydFR5cGVzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUJJTkRJTkdTOgotICAgICAgICByZXR1cm4gZUJpbmRpbmdzICE9IG51bGwgJiYgIWVCaW5kaW5ncy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VTRVJWSUNFUzoKLSAgICAgICAgcmV0dXJuIGVTZXJ2aWNlcyAhPSBudWxsICYmICFlU2VydmljZXMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTkFNRVNQQUNFUzoKLSAgICAgICAgcmV0dXJuIGVOYW1lc3BhY2VzICE9IG51bGwgJiYgIWVOYW1lc3BhY2VzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTOgotICAgICAgICByZXR1cm4gZVR5cGVzICE9IG51bGw7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTOgotICAgICAgICByZXR1cm4gZUltcG9ydHMgIT0gbnVsbCAmJiAhZUltcG9ydHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh0YXJnZXROYW1lc3BhY2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGxvY2F0aW9uOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGxvY2F0aW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHFOYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHFOYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGVuY29kaW5nOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGVuY29kaW5nKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gSGFuZC1jb2RlZCBtZXRob2RzCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZVNldCBnbG9iYWxSZXNvdXJjZVNldDsKLQotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBSZXNvdXJjZVNldCBnZXRHbG9iYWxSZXNvdXJjZVNldCgpCi0gIHsKLSAgICBpZiAoZ2xvYmFsUmVzb3VyY2VTZXQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBnbG9iYWxSZXNvdXJjZVNldCA9IGNyZWF0ZVJlc291cmNlU2V0KCk7Ci0gICAgICAvL1N0cmluZyBiYXNlVVJMID0gV1NETFBsdWdpbi5JTlNUQU5DRS5nZXRCYXNlVVJMKCkudG9TdHJpbmcoKTsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJCYXNlIFVSTCBpczogIiArIGJhc2VVUkwpOwotICAgIH0KLQotICAgIHJldHVybiBnbG9iYWxSZXNvdXJjZVNldDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlUmVzb3VyY2VTZXQoKQotICB7Ci0gICAgUmVzb3VyY2VTZXQgcmVzdWx0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotICAgIHJlc3VsdC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBEZWZpbml0aW9uIGNyZWF0ZURlZmluaXRpb24oTm9kZSBub2RlKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZURlZmluaXRpb24obm9kZSwgbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIERlZmluaXRpb24gY3JlYXRlRGVmaW5pdGlvbihOb2RlIG5vZGUsIFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHJldHVybiBjcmVhdGVEZWZpbml0aW9uKG5vZGUsbG9jYXRpb24sdHJ1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgRGVmaW5pdGlvbiBjcmVhdGVEZWZpbml0aW9uKE5vZGUgbm9kZSwgU3RyaW5nIGxvY2F0aW9uLCBib29sZWFuIHVzZUV4dGVuc2lvbkZhY3RvcmllcykKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWZpbml0aW9uKCk7Ci0gICAgKChEZWZpbml0aW9uSW1wbClkZWZpbml0aW9uKS5zZXRVc2VFeHRlbnNpb25GYWN0b3JpZXModXNlRXh0ZW5zaW9uRmFjdG9yaWVzKTsKLSAgICBkZWZpbml0aW9uLnNldEVsZW1lbnQoKEVsZW1lbnQpIG5vZGUpOwotICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKGxvY2F0aW9uKTsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotICAKLSAgcHJpdmF0ZSBXU0RMRWxlbWVudCByZXNvbHZlV1NETEVsZW1lbnQoaW50IHR5cGUsIExpc3QgbGlzdCwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSkKLSAgewotICAgIFdTRExFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgICAgUU5hbWUgdGhlUU5hbWUgPSBnZXRRTmFtZUZvcldTRExFbGVtZW50KHR5cGUsIHdzZGxFbGVtZW50KTsKLSAgICAgICAgaWYgKHFuYW1lLmVxdWFscyh0aGVRTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB3c2RsRWxlbWVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBIYXNoTWFwIGNyZWF0ZU1hcChpbnQgdHlwZSwgTGlzdCBsaXN0KQotICB7Ci0gICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgIFFOYW1lIHRoZVFOYW1lID0gZ2V0UU5hbWVGb3JXU0RMRWxlbWVudCh0eXBlLCB3c2RsRWxlbWVudCk7Ci0gICAgICBpZiAodGhlUU5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWFwLnB1dCh0aGVRTmFtZSwgd3NkbEVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLSAgcHJpdmF0ZSBRTmFtZSBnZXRRTmFtZUZvcldTRExFbGVtZW50KGludCB0eXBlLCBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgewotICAgIFFOYW1lIHJlc3VsdCA9IG51bGw7Ci0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVNTQUdFIDoKLSAgICAgICAgcmVzdWx0ID0gKChNZXNzYWdlKSB3c2RsRWxlbWVudCkuZ2V0UU5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuUE9SVF9UWVBFIDoKLSAgICAgICAgcmVzdWx0ID0gKChQb3J0VHlwZSkgd3NkbEVsZW1lbnQpLmdldFFOYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLkJJTkRJTkcgOgotICAgICAgICByZXN1bHQgPSAoKEJpbmRpbmcpIHdzZGxFbGVtZW50KS5nZXRRTmFtZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5TRVJWSUNFIDoKLSAgICAgICAgcmVzdWx0ID0gKChTZXJ2aWNlKSB3c2RsRWxlbWVudCkuZ2V0UU5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKgotICAgKiBUQkQgLSBSZXZpc2l0Ci0gICAqIExvb2sgZm9yIGFuIG9iamVjdCBpbiB0aGUgaW1wb3J0ZWQgZGVmaW5pdGlvbnMuCi0gICAqLwotICBwcml2YXRlIFdTRExFbGVtZW50IHJlc29sdmVXU0RMRWxlbWVudChpbnQgdHlwZSwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSkKLSAgewotICAgIFdTRExFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RGVmaW5pdGlvbnMocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBzd2l0Y2ggKHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIFdTRExDb25zdGFudHMuTUVTU0FHRSA6Ci0gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlV1NETEVsZW1lbnQodHlwZSwgZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKSwgcW5hbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSA6Ci0gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlV1NETEVsZW1lbnQodHlwZSwgZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCksIHFuYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HIDoKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc29sdmVXU0RMRWxlbWVudCh0eXBlLCBkZWZpbml0aW9uLmdldEVCaW5kaW5ncygpLCBxbmFtZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFdTRExDb25zdGFudHMuU0VSVklDRSA6Ci0gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlV1NETEVsZW1lbnQodHlwZSwgZGVmaW5pdGlvbi5nZXRFU2VydmljZXMoKSwgcW5hbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0KLSAgLy8KLSAgLy8gUmVjb25jaWxpYXRpb24gbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRWxlbWVudCBvbGRFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmIChvbGRFbGVtZW50IGluc3RhbmNlb2YgRXZlbnRUYXJnZXQpCi0gICAgewotICAgICAgRXZlbnRUYXJnZXQgb2xkRXZlbnRUYXJnZXQgPSAoKEV2ZW50VGFyZ2V0KW9sZEVsZW1lbnQpOwotICAgICAgb2xkRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NTm9kZUluc2VydGVkIiwgZ2V0RXZlbnRMaXN0ZW5lcigpLCB0cnVlKTsKLSAgICAgIG9sZEV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTU5vZGVSZW1vdmVkIiwgZ2V0RXZlbnRMaXN0ZW5lcigpLCB0cnVlKTsKLSAgICAgIG9sZEV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUF0dHJNb2RpZmllZCIsIGdldEV2ZW50TGlzdGVuZXIoKSwgdHJ1ZSk7Ci0gICAgfQotICAgIHN1cGVyLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFdmVudFRhcmdldCkKLSAgICB7Ci0gICAgICBFdmVudFRhcmdldCBldmVudFRhcmdldCA9ICgoRXZlbnRUYXJnZXQpZWxlbWVudCk7Ci0gICAgICBldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJET01Ob2RlSW5zZXJ0ZWQiLCBnZXRFdmVudExpc3RlbmVyKCksIHRydWUpOwotICAgICAgZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTm9kZVJlbW92ZWQiLCBnZXRFdmVudExpc3RlbmVyKCksIHRydWUpOwotICAgICAgZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQXR0ck1vZGlmaWVkIiwgZ2V0RXZlbnRMaXN0ZW5lcigpLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlY29uY2lsZUF0dHJpYnV0ZXMoY2hhbmdlZEVsZW1lbnQpOwotCi0gICAgaWYgKGNoYW5nZWRFbGVtZW50ID09IGdldEVsZW1lbnQoKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgc2V0VGFyZ2V0TmFtZXNwYWNlKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIikpOwotICAgICAgc2V0UU5hbWUobmV3IFFOYW1lKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJLCBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkpOwotICAgICAgZ2V0RU5hbWVzcGFjZXMoKS5jbGVhcigpOwotICAgICAgZ2V0TmFtZXNwYWNlcygpLmNsZWFyKCk7Ci0gICAgICAvL2dldE5hbWVzcGFjZXMoKS5wdXQoIiIsIG51bGwpOwotCi0gICAgICBOYW1lZE5vZGVNYXAgbWFwID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBtYXAuaXRlbShpKTsKLSAgICAgICAgU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgaWYgKCJ4bWxucyIuZXF1YWxzKGF0dHIuZ2V0UHJlZml4KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgbnNQcmVmaXggPSBhdHRyLmdldExvY2FsTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJ4bWxucyIuZXF1YWxzKGF0dHIuZ2V0Tm9kZU5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBuc1ByZWZpeCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5zUHJlZml4ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXROYW1lc3BhY2VzKCkucHV0KG5zUHJlZml4LCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN3aXRjaCAoV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShjaGlsZCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLkJJTkRJTkcgOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICAgICAgICBiaW5kaW5nLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgYmluZGluZy5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBhZGRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRE9DVU1FTlRBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBDUzogd2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byB1bnNldCB0aGlzIGVsZW1lbnQgd2hlbiBpdHMgcmVtb3ZlZAotICAgICAgICAgIC8vZGVmaW5pdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChjaGlsZCk7ICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLklNUE9SVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBJbXBvcnQgaSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbXBvcnQoKTsKLSAgICAgICAgICBpLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgaS5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBhZGRJbXBvcnQoaSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVNTQUdFIDoKLSAgICAgICAgewotICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgbWVzc2FnZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKHRoaXMpOwotICAgICAgICAgIG1lc3NhZ2Uuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgYWRkTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0VHlwZSgpOwotICAgICAgICAgIHBvcnRUeXBlLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgcG9ydFR5cGUuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgYWRkUG9ydFR5cGUocG9ydFR5cGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuU0VSVklDRSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICBzZXJ2aWNlLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgc2VydmljZS5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBhZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuVFlQRVMgOgotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGdldEVUeXBlcygpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgVHlwZXMgdHlwZXMgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZVR5cGVzKCk7Ci0gICAgICAgICAgICB0eXBlcy5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKHRoaXMpOwotICAgICAgICAgICAgdHlwZXMuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgICBzZXRFVHlwZXModHlwZXMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgZGVmYXVsdCA6Ci0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gZ2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkgPyAKLSAgICAgICAgICAoKFdTRExGYWN0b3J5SW1wbClXU0RMRmFjdG9yeS5lSU5TVEFOQ0UpLmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KGdldE5hbWVzcGFjZShjaGlsZCksZ2V0TG9jYWxOYW1lKGNoaWxkKSkgOgotICAgICAgICAgICgoV1NETEZhY3RvcnlJbXBsKVdTRExGYWN0b3J5LmVJTlNUQU5DRSkuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICAgIAkgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbih0aGlzKTsKLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBUeXBlcykKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgY29tcG9uZW50OwotICAgICAgaWYgKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkgPT0gbW9kZWxPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIGRlZmluaXRpb24uc2V0RVR5cGVzKG51bGwpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gZ2V0TGlzdChjb21wb25lbnQsIG1vZGVsT2JqZWN0KTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIExpc3QgZ2V0TGlzdChPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGNvbXBvbmVudDsKLQotICAgIC8vIHRvZG8uLi4gdXNlIFdTRExTd2l0Y2gKLSAgICAvLwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFQmluZGluZ3MoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBJbXBvcnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIE1lc3NhZ2UpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBQb3J0VHlwZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBkZWZpbml0aW9uLmdldEVQb3J0VHlwZXMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgY29tcG9uZW50OwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKSk7Ci0gICAgbGlzdC5hZGQoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCkpOwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCkpOwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCkpOwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHVibGljIERvY3VtZW50IHVwZGF0ZURvY3VtZW50KCkKLSAgewotICAgIGRvY3VtZW50ID0gY3JlYXRlRG9jdW1lbnQoKTsKLSAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gIH0KLQotICBwcml2YXRlIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBXU0RMUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuREVGSU5JVElPTik7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIE9iamVjdCBvYmogPSBudWxsOwotCi0gICAgVHlwZXMgdHlwZXMgPSBnZXRFVHlwZXMoKTsKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChUeXBlc0ltcGwpIHR5cGVzKS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFSW1wb3J0cygpKTsKLSAgICBhZGRDaGlsZEVsZW1lbnRzKG5ld0VsZW1lbnQsIGdldEVNZXNzYWdlcygpKTsKLSAgICBhZGRDaGlsZEVsZW1lbnRzKG5ld0VsZW1lbnQsIGdldEVQb3J0VHlwZXMoKSk7Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFQmluZGluZ3MoKSk7Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFU2VydmljZXMoKSk7Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZEVsZW1lbnRzKEVsZW1lbnQgcGFyZW50LCBMaXN0IGMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFdTRExFbGVtZW50SW1wbCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudEltcGwpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSB3c2RsRWxlbWVudC5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZVJlZmVyZW5jZShFUmVmZXJlbmNlIGVSZWZlcmVuY2UpCi0gIHsKLSAgICAvLyBBZGQgbmFtZXNwYWNlIHByZWZpeCBpbmZvCi0gICAgLy8gVEJEIC0gTmVlZCB0byByZXZpc2l0LgotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAoZVJlZmVyZW5jZSA9PSBudWxsICYmIHRoZUVsZW1lbnQgIT0gbnVsbCkgCi0gICAgLy8gV2UgYXJlIHVwZGF0aW5nIHRoZSBEZWZpbml0aW9uIGVsZW1lbnQuCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXROYW1lc3BhY2VzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgTmFtZXNwYWNlIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgIFN0cmluZyB1cmkgPSBudWxsOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBwcmVmaXggPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgdXJpID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKHByZWZpeCAhPSAiIikKLSAgICAgICAgICB0aGVFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFhTRENvbnN0YW50cy5YTUxOU19VUklfMjAwMCwgInhtbG5zOiIgKyBwcmVmaXgsIHVyaSk7Ci0gICAgICAgIGVsc2UgaWYgKHVyaSAhPSBudWxsKQotICAgICAgICAgIC8vIEhhbmRsZSBkZWZhdWx0IG5hbWVzcGFjZSwgZS5nLiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgdGhlRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYU0RDb25zdGFudHMuWE1MTlNfVVJJXzIwMDAsICJ4bWxucyIsIHVyaSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7ICAgIAotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOyAKLSAgICAKLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgLy9pZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fRW5jb2RpbmcoKSkKLSAgICAgIC8vICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuRU5DT0RJTkdfQVRUUklCVVRFLCBnZXRFbmNvZGluZygpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVmaW5pdGlvbl9RTmFtZSgpKQotICAgICAgICBpZiAoZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fVGFyZ2V0TmFtZXNwYWNlKCkpCi0gICAgICAgIGlmIChnZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFLCBnZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0RGVmaW5pdGlvbnMoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKG5hbWVzcGFjZSwgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKHRoaXMpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRJbXBvcnRzKG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KSBpLm5leHQoKTsKLSAgICAgICgoSW1wb3J0SW1wbCkgdGhlSW1wb3J0KS5pbXBvcnREZWZpbml0aW9uT3JTY2hlbWEoKTsKLSAgICAgIERlZmluaXRpb24gaW1wb3J0ZWREZWZpbml0aW9uID0gdGhlSW1wb3J0LmdldEVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoaW1wb3J0ZWREZWZpbml0aW9uICE9IG51bGwgJiYgV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKG5hbWVzcGFjZSwgaW1wb3J0ZWREZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoaW1wb3J0ZWREZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc29sdmVFbGVtZW50RGVjbGFyYXRpb25VUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIGludCBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZigiIyIpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSByZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKHVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpLCB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlU2NoZW1hKG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKSBpLm5leHQoKTsKLSAgICAgIHJlc3VsdCA9IHNjaGVtYS5yZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLy8gQ291bGQgbm90IHJlc29sdmUuIFRyeSBhZ2FpbnN0IGFsbCA8aW1wb3J0PmVkIGFuZCBpbmxpbmVkIHNjaGVtYXMuCi0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0SW1wb3J0ZWRPcklubGluZWRTY2hlbWFzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWkubmV4dCgpOwotICAgICAgcmVzdWx0ID0gc2NoZW1hLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24obmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIHJlc29sdmVUeXBlRGVmaW5pdGlvblVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoIiMiKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcmVzdWx0ID0gcmVzb2x2ZVR5cGVEZWZpbml0aW9uKHVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpLCB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIHJlc29sdmVUeXBlRGVmaW5pdGlvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlU2NoZW1hKG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWkubmV4dCgpOwotICAgICAgcmVzdWx0ID0gc2NoZW1hLnJlc29sdmVUeXBlRGVmaW5pdGlvbihuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8vIENvdWxkIG5vdCByZXNvbHZlLiBUcnkgYWdhaW5zdCBhbGwgPGltcG9ydD5lZCBhbmQgaW5saW5lZCBzY2hlbWFzLgotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEltcG9ydGVkT3JJbmxpbmVkU2NoZW1hcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSlpLm5leHQoKTsKLSAgICAgIHJlc3VsdCA9IHNjaGVtYS5yZXNvbHZlVHlwZURlZmluaXRpb24obmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OyAvLyBGYWlsZWQgdG8gcmVzb2x2ZS4KLSAgfQotCi0gIC8qKgotICAJKiBUaGlzIHJldHVybnMgc2V0IG9mIHNjaGVtYXMgd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlIGFzIGl0J3MgdGFyZ2V0IG5hbWVzcGFjZS4KLSAgCSovCi0gIHB1YmxpYyBDb2xsZWN0aW9uIHJlc29sdmVTY2hlbWEoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIGlmICgiIi5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSBudWxsOwotICAgIH0KLQotICAgIGlmIChYU0RDb25zdGFudHMuaXNTY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UobmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKG5hbWVzcGFjZSkpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RDb25zdGFudHMuaXNTY2hlbWFJbnN0YW5jZU5hbWVzcGFjZShuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFJbnN0YW5jZShuYW1lc3BhY2UpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBnZXRJbXBvcnRlZE9ySW5saW5lZFNjaGVtYXMobmFtZXNwYWNlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldEltcG9ydGVkT3JJbmxpbmVkU2NoZW1hcyhTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KSBpLm5leHQoKTsKLSAgICAgIGlmIChXU0RMQ29uc3RhbnRzLmlzTWF0Y2hpbmdOYW1lc3BhY2UodGhlSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lc3BhY2UpKQotICAgICAgewotICAgICAgICAoKEltcG9ydEltcGwpIHRoZUltcG9ydCkuaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7Ci0gICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwgJiYgV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGdldEVUeXBlcygpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGkubmV4dCgpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKQotICAgICAgICB7ICAKLSAgICAgICAgICBsaXN0LmFkZChzY2hlbWEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IGNvbXBvbmVudCA9IGoubmV4dCgpOwotICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNESW1wb3J0IHRoZUltcG9ydCA9IChYU0RJbXBvcnQpY29tcG9uZW50OwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHModGhlSW1wb3J0LmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKChYU0RJbXBvcnRJbXBsKXRoZUltcG9ydCkuaW1wb3J0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBpbXBvcnRlZFNjaGVtYSA9IHRoZUltcG9ydC5nZXRSZXNvbHZlZFNjaGVtYSgpOyAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKGltcG9ydGVkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGltcG9ydGVkU2NoZW1hKTsKLSAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICAgIAotICAgICAgfSAgICAgCi0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0SW1wb3J0ZWRPcklubGluZWRTY2hlbWFzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBJbXBvcnQgdGhlSW1wb3J0ID0gKEltcG9ydCkgaS5uZXh0KCk7Ci0gICAgICAoKEltcG9ydEltcGwpIHRoZUltcG9ydCkuaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gdGhlSW1wb3J0LmdldEVTY2hlbWEoKTsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgbGlzdC5hZGQoc2NoZW1hKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGdldEVUeXBlcygpICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGRBbGwoZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBFdmVudExpc3RlbmVyIGV2ZW50TGlzdGVuZXI7Ci0gIHByb3RlY3RlZCBOb2RlIGRlbGV0aW9uTm9kZTsKLQotICBwdWJsaWMgTm9kZSBnZXREZWxldGlvbk5vZGUoKQotICB7Ci0gICAgcmV0dXJuIGRlbGV0aW9uTm9kZTsKLSAgfQotCi0gIHByb3RlY3RlZCBFdmVudExpc3RlbmVyIGdldEV2ZW50TGlzdGVuZXIoKQotICB7Ci0gICAgaWYgKGV2ZW50TGlzdGVuZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBldmVudExpc3RlbmVyID0gCi0gICAgICAgIG5ldyBFdmVudExpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNdXRhdGlvbkV2ZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBNdXRhdGlvbkV2ZW50IG11dGF0aW9uRXZlbnQgPSAoTXV0YXRpb25FdmVudClldmVudDsKLSAgICAgICAgICAgICAgaWYgKG11dGF0aW9uRXZlbnQuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpbXV0YXRpb25FdmVudC5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uRXZlbnQuZ2V0QXR0ckNoYW5nZSgpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgV1NETEVsZW1lbnRJbXBsIGxpc3RlbmVyID0gKFdTRExFbGVtZW50SW1wbClnZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLSAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscygiRE9NTm9kZVJlbW92ZWQiKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9uTm9kZSA9IChOb2RlKWV2ZW50LmdldFRhcmdldCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVsZW1lbnRDb250ZW50c0NoYW5nZWQoKEVsZW1lbnQpbm9kZS5nZXRQYXJlbnROb2RlKCkpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGlvbk5vZGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgV1NETEVsZW1lbnRJbXBsIGxpc3RlbmVyID0gKFdTRExFbGVtZW50SW1wbClnZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVsZW1lbnRBdHRyaWJ1dGVzQ2hhbmdlZCgoRWxlbWVudClub2RlKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIHJldHVybiBldmVudExpc3RlbmVyOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChOb2RlIG5vZGUpCi0gIHsKLSAgICAvLyBXZSBjb25zaWRlciBhbGwgcGFyZW50cyBzbyB0aGF0IHRoZXkgY2FuIGhhbmRsZSBvdGhlciBjb250YWluZWQgbm9kZXMgdGhhdCBvdGhlcndpc2UgZG9uJ3QgY29ycmVzcG9uZCB0byBhIGNvbXBvbmVudC4KLSAgICAvLwotICAgIExpc3QgcGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgIHsKLSAgICAgIG5vZGUgPSAoKEF0dHIpbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTa2lwIGFoZWFkIHRvIGFuIGVsZW1lbnQuCi0gICAgICAvLwotICAgICAgZm9yIChOb2RlIHNjYW5Ob2RlID0gbm9kZTsgc2Nhbk5vZGUgIT0gbnVsbDsgc2Nhbk5vZGUgPSBzY2FuTm9kZS5nZXROZXh0U2libGluZygpKQotICAgICAgewotICAgICAgICBpZiAoc2Nhbk5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIG5vZGUgPSBzY2FuTm9kZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAKLSAgICAgIC8vIFNraXAgYmFjayB0byBhbiBlbGVtZW50LgotICAgICAgLy8KLSAgICAgIGZvciAoTm9kZSBzY2FuTm9kZSA9IG5vZGU7IHNjYW5Ob2RlICE9IG51bGw7IHNjYW5Ob2RlID0gc2Nhbk5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChzY2FuTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZSA9IHNjYW5Ob2RlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAKLSAgICAvLyBOYXZpZ2F0ZSBvdXQgdGhyb3VnaCB0aGUgZWxlbWVudHMuCi0gICAgLy8KLSAgICBmb3IgKE5vZGUgcGFyZW50ID0gbm9kZTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpCi0gICAgewotICAgICAgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICBwYXJlbnRzLmFkZChwYXJlbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIFdTRExFbGVtZW50IGJlc3RXU0RMRWxlbWVudCA9IGdldEJlc3RXU0RMRWxlbWVudChwYXJlbnRzKTsKLSAgICByZXR1cm4gYmVzdFdTRExFbGVtZW50OwotICB9Ci0gIAotICAvLwotICAvLwotICAvLwotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gdHJ1ZTsgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRVc2VFeHRlbnNpb25GYWN0b3JpZXMoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAJdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gdmFsdWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFVzZUV4dGVuc2lvbkZhY3RvcmllcygpCi0gIHsKLSAgCXJldHVybiB1c2VFeHRlbnNpb25GYWN0b3JpZXM7Ci0gIH0KLSAgCi0gIC8vIFNlZSBCdWcgNTM2NgotICBwdWJsaWMgdm9pZCByZW1vdmVBbGwoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICBpc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgZG9jdW1lbnQgPSBudWxsOwotICAgICBlbGVtZW50ID0gbnVsbDsKLSAgICAgZ2V0RVNlcnZpY2VzKCkuY2xlYXIoKTsKLSAgICAgZ2V0RUJpbmRpbmdzKCkuY2xlYXIoKTsKLSAgICAgZ2V0RVBvcnRUeXBlcygpLmNsZWFyKCk7Ci0gICAgIGdldEVNZXNzYWdlcygpLmNsZWFyKCk7Ci0gICAgIHNldEVUeXBlcyhudWxsKTsKLSAgICAgZ2V0RUltcG9ydHMoKS5jbGVhcigpOwotICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICB9IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbmxpbmVTY2hlbWFMb2NhdGlvbnMoUmVzb3VyY2UgcmVzb3VyY2UpCi0gIHsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBpbmxpbmUgc2NoZW1hcyBsb2NhdGlvbiAKLSAgICBUeXBlcyB0eXBlcyA9IHRoaXMuZ2V0RVR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBqID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGoubmV4dCgpOwotICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZWwuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgIAkvLyBXZSBuZWVkIHRoaXMgdHJ5LWNhdGNoIGJsb2NrIGluIGNhc2Ugd2UgZW5jb3VudGVyIGFuIGV4Y2VwdGlvbiB3aGlsZSBhdHRlbXB0aW5nCi0gICAgICAgIAkvLyB0byByZXNvbHZlIHRoZSBzY2hlbWEuICBJbiB0aGUgY2FzZSBvZiB0aGUgV1NETCBFZGl0b3IsIHdlIGdldCBhCi0gICAgICAgIAkvLyAnY2Fubm90IGNyZWF0ZSBwYXJ0IGV4Y2VwdGlvbicuLi4uLi5TZWUgZWNsaXBzZSBidWd6aWxsYSBidWcgODk4NTUKLSAgICAgICAgCXRyeQotICAgICAgICAJewotICAgICAgICAJCXNjaGVtYS5zZXRTY2hlbWFMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgIAl9Ci0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAgCi0gICAgfSAgICAgIAotICB9ICAKLSAgCi19IC8vRGVmaW5pdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0V4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4NDI0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0V4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCNnZXRFbGVtZW50VHlwZSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGV4dGVuZHMgV1NETEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlcXVpcmVkKCkgPGVtPlJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1JlcXVpcmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFUVVJUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVxdWlyZWQoKSA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUmVxdWlyZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZCA9IFJFUVVJUkVEX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudFR5cGUoKSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgRUxFTUVOVF9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudFR5cGUoKSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBRTmFtZSBlbGVtZW50VHlwZSA9IEVMRU1FTlRfVFlQRV9FREVGQVVMVDsKLQotICBwcml2YXRlIEhhc2hNYXAgYmVhblByb3BlcnR5RGVzY3JpcHRvcnM7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gcmVxdWlyZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gbmV3UmVxdWlyZWQpCi0gIHsKLSAgICBib29sZWFuIG9sZFJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0gICAgcmVxdWlyZWQgPSBuZXdSZXF1aXJlZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVELCBvbGRSZXF1aXJlZCwgcmVxdWlyZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKGVDbGFzcygpLmdldEVQYWNrYWdlKCkuZ2V0TnNVUkkoKSwgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudFR5cGUoUU5hbWUgbmV3RWxlbWVudFR5cGUpCi0gIHsKLSAgICBRTmFtZSBvbGRFbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwotICAgIGVsZW1lbnRUeXBlID0gbmV3RWxlbWVudFR5cGU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEUsIG9sZEVsZW1lbnRUeXBlLCBlbGVtZW50VHlwZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHJlcXVpcmVkOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHJlcXVpcmVkKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGVsZW1lbnRUeXBlOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGVsZW1lbnRUeXBlKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50I2dldFJlcXVpcmVkKCkKLSAgICovCi0gIHB1YmxpYyBCb29sZWFuIGdldFJlcXVpcmVkKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbihpc1JlcXVpcmVkKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50I3NldFJlcXVpcmVkKEJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChCb29sZWFuIHJlcXVpcmVkKQotICB7Ci0gICAgc2V0UmVxdWlyZWQocmVxdWlyZWQuYm9vbGVhblZhbHVlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciBhIGdpdmVuIGNsYXNzLgotICAgKi8KLSAgcHVibGljIGphdmEudXRpbC5NYXAgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuQ2xhc3MgY2xhenopCi0gIHsKLSAgICAvLyBMb29rdXAgcHJvcGVydGllcyBjYWNoZQotICAgIE1hcCBwcm9wZXJ0aWVzID0gbnVsbDsKLSAgICBpZiAoYmVhblByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkKLSAgICAgIGJlYW5Qcm9wZXJ0eURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBlbHNlCi0gICAgICBwcm9wZXJ0aWVzID0gKE1hcCkgYmVhblByb3BlcnR5RGVzY3JpcHRvcnMuZ2V0KGNsYXp6KTsKLQotICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0gICAgewotICAgICAgLy8gSW50cm9zcGVjdCB0aGUgYmVhbgotICAgICAgQXJyYXlMaXN0IGJpbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBCZWFuSW5mbyBiaW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhjbGF6eik7Ci0gICAgICAgIGlmIChiaW5mbyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYmluZm9zLmFkZChiaW5mbyk7Ci0gICAgICAgICAgQmVhbkluZm9bXSBhYmluZm8gPSBiaW5mby5nZXRBZGRpdGlvbmFsQmVhbkluZm8oKTsKLSAgICAgICAgICBpZiAoYWJpbmZvICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBhYmluZm8ubGVuZ3RoOyBiKyspCi0gICAgICAgICAgICAgIGJpbmZvcy5hZGQoYWJpbmZvW2JdKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIFRCRCAtIGhhbmRsZSBleGNlcHRpb24KLSAgICAgIH0KLQotICAgICAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGIgPSBiaW5mb3MuaXRlcmF0b3IoKTsgYi5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCZWFuSW5mbyBiaW5mbyA9IChCZWFuSW5mbykgYi5uZXh0KCk7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHBkZXNjID0gYmluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBpZiAocGRlc2MgPT0gbnVsbCkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBwZGVzYy5sZW5ndGg7IHArKykKLSAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChwZGVzY1twXS5nZXROYW1lKCksIHBkZXNjW3BdKTsKLSAgICAgIH0KLSAgICAgIGJlYW5Qcm9wZXJ0eURlc2NyaXB0b3JzLnB1dChjbGF6eiwgcHJvcGVydGllcyk7Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50ID09IG51bGwgJiYgIWlzUmVjb25jaWxpbmcpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVsZW1lbnQoKTogUHJlc2VydmluZyBvbGQgZWxlbWVudCIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0RWxlbWVudEdlbihlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBzdXBlci5yZWNvbmNpbGVBdHRyaWJ1dGVzKGNoYW5nZWRFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN1cGVyLmhhbmRsZVJlY29uY2lsaWF0aW9uKHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IEVNRiAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLQotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IG51bGw7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgLy8gVGhpcyBpcyBhbiBvbGQgZWxlbWVudC4KLSAgICB7Ci0gICAgICBuZXdFbGVtZW50ID0gKEVsZW1lbnQpIGRvY3VtZW50LmltcG9ydE5vZGUoZWxlbWVudCwgdHJ1ZSk7IAotICAgICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIFN0cmluZyBxdWFsaWZpZXIgPSBkZWZpbml0aW9uLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIChxdWFsaWZpZXIgPT0gbnVsbCA/ICIiIDogcXVhbGlmaWVyICsgIjoiKSArIGdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLX0gLy9FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJsZUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0V4dGVuc2libGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2NlNjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5zaWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRXh0ZW5zaWJsZUVsZW1lbnRJbXBsI2dldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMgPGVtPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgV1NETEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJsZUVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSA8ZW0+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFeHRlbnNpYmxlRWxlbWVudEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbnNpYmxlRWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gIHsKLSAgICBpZiAoZUV4dGVuc2liaWxpdHlFbGVtZW50cyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVFeHRlbnNpYmlsaXR5RWxlbWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRXh0ZW5zaWJpbGl0eUVsZW1lbnQuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMpOwotICAgIH0KLSAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpCi0gIHsKLSAgICBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGQoZXh0RWxlbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvLwotICAvLwotICAvLwotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgaWYgKCFXU0RMQ29uc3RhbnRzLmlzTWF0Y2hpbmdOYW1lc3BhY2UoY2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCksIFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKSkKLSAgICB7ICAKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkgPyAKLSAgICAgICAgICAoKFdTRExGYWN0b3J5SW1wbClXU0RMRmFjdG9yeS5lSU5TVEFOQ0UpLmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KGdldE5hbWVzcGFjZShjaGlsZCksZ2V0TG9jYWxOYW1lKGNoaWxkKSkgOgotICAgICAgICAgICAgKChXU0RMRmFjdG9yeUltcGwpV1NETEZhY3RvcnkuZUlOU1RBTkNFKS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZChleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkKLSAgewotICAJLy8gVXNlIGV4dGVuc2lvbiBmYWN0b3JpZXMgYnkgZGVmYXVsdC4KLSAgICByZXR1cm4gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpID09IG51bGwgPyAKLSAgICAgIHRydWUgOiAKLSAgICAgICgoRGVmaW5pdGlvbkltcGwpZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKS5nZXRVc2VFeHRlbnNpb25GYWN0b3JpZXMoKTsKLSAgfQotICAKLX0gLy9FeHRlbnNpYmxlRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRmF1bHRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0ZhdWx0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRhMjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRmF1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZhdWx0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRmF1bHRJbXBsIGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBGYXVsdAotewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBGYXVsdEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRGYXVsdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKSBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX0VNRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVNZXNzYWdlKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIGVNZXNzYWdlICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLkZBVUxUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vRmF1bHRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0ltcG9ydEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW1wb3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTg1NGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW1wb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETE1vZGVsTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5JbXBvcnRJbXBsI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkltcG9ydEltcGwjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkltcG9ydEltcGwjZ2V0RURlZmluaXRpb24gPGVtPkVEZWZpbml0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuSW1wb3J0SW1wbCNnZXRFU2NoZW1hIDxlbT5FU2NoZW1hPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0SW1wbCBleHRlbmRzIFdTRExFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEltcG9ydAotewotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXNvbHZlZDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gTkFNRVNQQUNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvblVSSSgpIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvblVSSSA9IExPQ0FUSU9OX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RURlZmluaXRpb24oKSA8ZW0+RURlZmluaXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVEZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZURlZmluaXRpb24gPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFU2NoZW1hKCkgPGVtPkVTY2hlbWE8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVTY2hlbWEoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIGVTY2hlbWEgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEltcG9ydEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbXBvcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuZXdOYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIG5hbWVzcGFjZVVSSSA9IG5ld05hbWVzcGFjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5JTVBPUlRfX05BTUVTUEFDRV9VUkksIG9sZE5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvblVSSShTdHJpbmcgbmV3TG9jYXRpb25VUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkTG9jYXRpb25VUkkgPSBsb2NhdGlvblVSSTsKLSAgICBsb2NhdGlvblVSSSA9IG5ld0xvY2F0aW9uVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLklNUE9SVF9fTE9DQVRJT05fVVJJLCBvbGRMb2NhdGlvblVSSSwgbG9jYXRpb25VUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RURlZmluaXRpb24oKQotICB7Ci0gICAgaWYgKGVEZWZpbml0aW9uICE9IG51bGwgJiYgZURlZmluaXRpb24uZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIG9sZEVEZWZpbml0aW9uID0gZURlZmluaXRpb247Ci0gICAgICBlRGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllRGVmaW5pdGlvbik7Ci0gICAgICBpZiAoZURlZmluaXRpb24gIT0gb2xkRURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuSU1QT1JUX19FREVGSU5JVElPTiwgb2xkRURlZmluaXRpb24sIGVEZWZpbml0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlRGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gYmFzaWNHZXRFRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZURlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVEZWZpbml0aW9uKERlZmluaXRpb24gbmV3RURlZmluaXRpb24pCi0gIHsKLSAgICBEZWZpbml0aW9uIG9sZEVEZWZpbml0aW9uID0gZURlZmluaXRpb247Ci0gICAgZURlZmluaXRpb24gPSBuZXdFRGVmaW5pdGlvbjsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5JTVBPUlRfX0VERUZJTklUSU9OLCBvbGRFRGVmaW5pdGlvbiwgZURlZmluaXRpb24pKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRFU2NoZW1hKCkKLSAgewotICAgIGlmIChlU2NoZW1hICE9IG51bGwgJiYgZVNjaGVtYS5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBvbGRFU2NoZW1hID0gZVNjaGVtYTsKLSAgICAgIGVTY2hlbWEgPSAoWFNEU2NoZW1hKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllU2NoZW1hKTsKLSAgICAgIGlmIChlU2NoZW1hICE9IG9sZEVTY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BLCBvbGRFU2NoZW1hLCBlU2NoZW1hKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlU2NoZW1hOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGJhc2ljR2V0RVNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gZVNjaGVtYTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RVNjaGVtYShYU0RTY2hlbWEgbmV3RVNjaGVtYSkKLSAgewotICAgIFhTRFNjaGVtYSBvbGRFU2NoZW1hID0gZVNjaGVtYTsKLSAgICBlU2NoZW1hID0gbmV3RVNjaGVtYTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5JTVBPUlRfX0VTQ0hFTUEsIG9sZEVTY2hlbWEsIGVTY2hlbWEpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgewotICAgIHJldHVybiBnZXRFU2NoZW1hKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHNldEVTY2hlbWEoc2NoZW1hKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uVVJJKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fRURFRklOSVRJT046Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RURlZmluaXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RURlZmluaXRpb24oKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVTY2hlbWEoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RVNjaGVtYSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fTE9DQVRJT05fVVJJOgotICAgICAgICBzZXRMb2NhdGlvblVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VERUZJTklUSU9OOgotICAgICAgICBzZXRFRGVmaW5pdGlvbigoRGVmaW5pdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BOgotICAgICAgICBzZXRFU2NoZW1hKChYU0RTY2hlbWEpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19MT0NBVElPTl9VUkk6Ci0gICAgICAgIHNldExvY2F0aW9uVVJJKExPQ0FUSU9OX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FREVGSU5JVElPTjoKLSAgICAgICAgc2V0RURlZmluaXRpb24oKERlZmluaXRpb24pbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BOgotICAgICAgICBzZXRFU2NoZW1hKChYU0RTY2hlbWEpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIExPQ0FUSU9OX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb25VUkkgIT0gbnVsbCA6ICFMT0NBVElPTl9VUklfRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FREVGSU5JVElPTjoKLSAgICAgICAgcmV0dXJuIGVEZWZpbml0aW9uICE9IG51bGw7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fRVNDSEVNQToKLSAgICAgICAgcmV0dXJuIGVTY2hlbWEgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZXNwYWNlVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBsb2NhdGlvblVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChsb2NhdGlvblVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIEltcG9ydCNnZXREZWZpbml0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkRlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0RURlZmluaXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIEltcG9ydCNzZXREZWZpbml0aW9uKERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uKGphdmF4LndzZGwuRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc2V0RURlZmluaXRpb24oKG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24pIGRlZmluaXRpb24pOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc2V0TmFtZXNwYWNlVVJJKFdTRExDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUpKTsKLSAgICBzZXRMb2NhdGlvblVSSShXU0RMQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgV1NETENvbnN0YW50cy5MT0NBVElPTl9BVFRSSUJVVEUpKTsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGlzIGJvb2xlYW4gdG8gZmFsc2UgYmVjYXVzZSB0aGUgSW1wb3J0IG1heSBwb2ludCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbi4KLSAgICAvLyBTbyB3ZSBuZWVkIHdlIHNob3VsZCB2aWV3IHRoaXMgaW1wb3J0IGFzIHVucmVzb2x2ZWQuCi0gICAgcmVzb2x2ZWQgPSBmYWxzZTsKLSAgICAKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEltcG9ydF9OYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUsIGdldE5hbWVzcGFjZVVSSSgpKTsKLQotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbXBvcnRfTG9jYXRpb25VUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLkxPQ0FUSU9OX0FUVFJJQlVURSwgZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuSU1QT1JUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCkKLSAgewotICAgIHJlc29sdmUoZ2V0TmFtZXNwYWNlVVJJKCksIGdldExvY2F0aW9uVVJJKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICBpZiAoIXJlc29sdmVkKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwgJiYgZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IGRlZmluaXRpb24uZVJlc291cmNlKCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotICAgICAgICAgIGlmIChyZXNvdXJjZVNldCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkTG9jYXRpb24gPSByZXNvbHZlTG9jYXRpb24oZGVmaW5pdGlvbiwgbmFtZXNwYWNlLCBsb2NhdGlvbik7Ci0KLSAgICAgICAgICAgIFVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHJlc29sdmVkTG9jYXRpb24pOwotICAgICAgICAgICAgUmVzb3VyY2UgcmVzb2x2ZWRSZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVzb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKHVyaSk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZS5sb2FkKGlucHV0U3RyZWFtLCByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbiBlcnJvciB0byBmYWlsIHRvIHJlc29sdmUuCi0gICAgICAgICAgICAgICAgLy8gSWYgYSByZXNvdXJjZSBpcyBhY3R1YWxseSBjcmVhdGVkLCAKLSAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXBwZW5zIG9ubHkgd2hlbiB3ZSBjYW4gY3JlYXRlIGFuIGlucHV0IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAvLyB0aGVuIGl0J3MgYW4gZXJyb3IgaWYgaXQncyBub3QgYSBnb29kIHdzZGwgb3Igc2NoZW1hCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVzb3VyY2UgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZURlZmluaXRpb24gPSAoKFdTRExSZXNvdXJjZUltcGwpIHJlc29sdmVkUmVzb3VyY2UpLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmIChyZXNvbHZlZFJlc291cmNlIGluc3RhbmNlb2YgWFNEUmVzb3VyY2VJbXBsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZVNjaGVtYSA9ICgoWFNEUmVzb3VyY2VJbXBsKSByZXNvbHZlZFJlc291cmNlKS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlRGVmaW5pdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVMb2NhdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBzY2hlbWFMb2NhdGlvbikKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIFdTRExNb2RlbExvY2F0b3IgbG9jYXRvciA9IChXU0RMTW9kZWxMb2NhdG9yKUVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihkZWZpbml0aW9uLmVSZXNvdXJjZSgpLCBXU0RMTW9kZWxMb2NhdG9yLmNsYXNzKTsKLSAgICBpZiAobG9jYXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGxvY2F0b3IucmVzb2x2ZVVSSShkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpLCBuYW1lc3BhY2UsIHNjaGVtYUxvY2F0aW9uKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFRPRE8uLi4gdGhlcmUncyBzb21lIGRlZmF1bHQgcmVzb2x2aW5nIHdlJ2xsIG5lZWQgdG8gZG8gaGVyZQotICAgICAgLy8gc2VlIFhTRFNjaGVtYURpcmVjdGl2ZQotICAgICAgVVJJIGJhc2VMb2NhdGlvblVSSSA9IGNyZWF0ZVVSSShkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICAgIFVSSSBsb2NhdGlvblVSSSA9IFVSSS5jcmVhdGVVUkkoc2NoZW1hTG9jYXRpb24pOwotICAgICAgcmV0dXJuIGxvY2F0aW9uVVJJLnJlc29sdmUoYmFzZUxvY2F0aW9uVVJJKS50b1N0cmluZygpOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIC8vVE9ETy4uLiBwdXNoIGRvd24gdG8gRU1GCi0gIHByaXZhdGUgc3RhdGljIFVSSSBjcmVhdGVVUkkoU3RyaW5nIHVyaVN0cmluZykKLSAgewotICAgIGlmIChoYXNQcm90b2NvbCh1cmlTdHJpbmcpKQotICAgICAgIHJldHVybiBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7Ci0gICAgZWxzZQotICAgICAgIHJldHVybiBVUkkuY3JlYXRlRmlsZVVSSSh1cmlTdHJpbmcpOwotICB9Ci0KLSAgLy9UT0RPLi4uIHB1c2ggZG93biB0byBFTUYgIAotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1Byb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOyAgICAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKCI6Iik7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggPiAyKSAvLyBhc3N1bWUgcHJvdG9jb2wgd2l0aCBiZSBsZW5ndGggMyBzbyB0aGF0IHRoZSdDJyBpbiAnQzovJyBpcyBub3QgaW50ZXJwcmV0ZWQgYXMgYSBwcm90b2NvbAotICAgICAgewotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotfSAvL0ltcG9ydEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW5wdXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0lucHV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTdlZTA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW5wdXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklucHV0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5wdXRJbXBsIGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBJbnB1dAotewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBJbnB1dEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKSBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0VNRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVNZXNzYWdlKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIGVNZXNzYWdlICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLklOUFVUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vSW5wdXRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MTUxZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9NZXNzYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTWVzc2FnZUltcGwjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTWVzc2FnZUltcGwjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk1lc3NhZ2VJbXBsI2lzUHJveHkgPGVtPlByb3h5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTWVzc2FnZUltcGwjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk1lc3NhZ2VJbXBsI2dldEVQYXJ0cyA8ZW0+RVBhcnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBNZXNzYWdlCi17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UU5hbWUoKSA8ZW0+UU5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFFOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBRTmFtZSBxTmFtZSA9IFFOQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVbmRlZmluZWQoKSA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVTkRFRklORURfRURFRkFVTFQgPSBmYWxzZTsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVbmRlZmluZWQoKSA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHVuZGVmaW5lZCA9IFVOREVGSU5FRF9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJPWFlfRURFRkFVTFQgPSBmYWxzZTsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm94eSgpIDxlbT5Qcm94eTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNQcm94eSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHByb3h5ID0gUFJPWFlfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVSSSgpIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFJlc291cmNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VVUkkgPSBSRVNPVVJDRV9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVQYXJ0cygpIDxlbT5FUGFydHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RVBhcnRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVQYXJ0cyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBNYXAgcGFydHM7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgTWVzc2FnZUltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFFOYW1lKFFOYW1lIG5ld1FOYW1lKQotICB7Ci0gICAgUU5hbWUgb2xkUU5hbWUgPSBxTmFtZTsKLSAgICBxTmFtZSA9IG5ld1FOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk1FU1NBR0VfX1FOQU1FLCBvbGRRTmFtZSwgcU5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRlZmluZWQoKQotICB7Ci0gICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gbmV3VW5kZWZpbmVkKQotICB7Ci0gICAgYm9vbGVhbiBvbGRVbmRlZmluZWQgPSB1bmRlZmluZWQ7Ci0gICAgdW5kZWZpbmVkID0gbmV3VW5kZWZpbmVkOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk1FU1NBR0VfX1VOREVGSU5FRCwgb2xkVW5kZWZpbmVkLCB1bmRlZmluZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gcHJveHk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5KGJvb2xlYW4gbmV3UHJveHkpCi0gIHsKLSAgICBib29sZWFuIG9sZFByb3h5ID0gcHJveHk7Ci0gICAgcHJveHkgPSBuZXdQcm94eTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5NRVNTQUdFX19QUk9YWSwgb2xkUHJveHksIHByb3h5KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVVSSShTdHJpbmcgbmV3UmVzb3VyY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkUmVzb3VyY2VVUkkgPSByZXNvdXJjZVVSSTsKLSAgICByZXNvdXJjZVVSSSA9IG5ld1Jlc291cmNlVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk1FU1NBR0VfX1JFU09VUkNFX1VSSSwgb2xkUmVzb3VyY2VVUkksIHJlc291cmNlVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFUGFydHMoKQotICB7Ci0gICAgaWYgKGVQYXJ0cyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVQYXJ0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQYXJ0LmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5NRVNTQUdFX19FUEFSVFMpOwotICAgIH0KLSAgICByZXR1cm4gZVBhcnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIHBhcnQgdG8gdGhpcyBtZXNzYWdlLgotICAgKiBAcGFyYW0gcGFydCB0aGUgcGFydCB0byBiZSBhZGRlZAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFBhcnQoamF2YXgud3NkbC5QYXJ0IHBhcnQpCi0gIHsKLSAgICBnZXRFUGFydHMoKS5hZGQoKFBhcnQpcGFydCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBzcGVjaWZpZWQgcGFydC4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgcGFydC4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBwYXJ0LCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgcGFydAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlBhcnQgZ2V0UGFydChTdHJpbmcgbmFtZSkKLSAgewotICAgIFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFUGFydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGkubmV4dCgpOwotICAgICAgaWYgKG5hbWUuZXF1YWxzKHBhcnQuZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcGFydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IGFsbCB0aGUgcGFydHMgZGVmaW5lZCBoZXJlLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBNYXAgZ2V0UGFydHMoKQotICB7Ci0gICAgSGFzaE1hcCBoYXNoTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFUGFydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGkubmV4dCgpOwotICAgICAgaGFzaE1hcC5wdXQocGFydC5nZXROYW1lKCksIHBhcnQpOwotICAgIH0KLSAgICByZXR1cm4gaGFzaE1hcDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldE9yZGVyZWRQYXJ0cyhMaXN0IHBhcnRPcmRlcikKLSAgewotICAgIExpc3Qgb3JkZXJlZFBhcnRzID0gbmV3IFZlY3RvcigpOwotICAgIGlmIChwYXJ0T3JkZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcmRlcmVkUGFydHMuYWRkQWxsKGdldEVQYXJ0cygpKTsKLSAgICAgIHJldHVybiBvcmRlcmVkUGFydHM7Ci0gICAgfQotCi0gICAgSXRlcmF0b3IgcGFydE5hbWVJdGVyYXRvciA9IHBhcnRPcmRlci5pdGVyYXRvcigpOwotICAgIHdoaWxlIChwYXJ0TmFtZUl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFydE5hbWUgPSAoU3RyaW5nKSBwYXJ0TmFtZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGphdmF4LndzZGwuUGFydCBwYXJ0ID0gZ2V0UGFydChwYXJ0TmFtZSk7Ci0gICAgICBpZiAocGFydCAhPSBudWxsKQotICAgICAgICBvcmRlcmVkUGFydHMuYWRkKHBhcnQpOwotICAgIH0KLQotICAgIHJldHVybiBvcmRlcmVkUGFydHM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRVBBUlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVBhcnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiBpc1VuZGVmaW5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUFJPWFk6Ci0gICAgICAgIHJldHVybiBpc1Byb3h5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19FUEFSVFM6Ci0gICAgICAgIHJldHVybiBnZXRFUGFydHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1FOQU1FOgotICAgICAgICBzZXRRTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1VOREVGSU5FRDoKLSAgICAgICAgc2V0VW5kZWZpbmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1BST1hZOgotICAgICAgICBzZXRQcm94eSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHNldFJlc291cmNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VQQVJUUzoKLSAgICAgICAgZ2V0RVBhcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RVBhcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKFFOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZChVTkRFRklORURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1BST1hZOgotICAgICAgICBzZXRQcm94eShQUk9YWV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSShSRVNPVVJDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VQQVJUUzoKLSAgICAgICAgZ2V0RVBhcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBRTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcU5hbWUgIT0gbnVsbCA6ICFRTkFNRV9FREVGQVVMVC5lcXVhbHMocU5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiB1bmRlZmluZWQgIT0gVU5ERUZJTkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19QUk9YWToKLSAgICAgICAgcmV0dXJuIHByb3h5ICE9IFBST1hZX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBSRVNPVVJDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlVVJJICE9IG51bGwgOiAhUkVTT1VSQ0VfVVJJX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZVVSSSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VQQVJUUzoKLSAgICAgICAgcmV0dXJuIGVQYXJ0cyAhPSBudWxsICYmICFlUGFydHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChxTmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChxTmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCB1bmRlZmluZWQ6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodW5kZWZpbmVkKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHByb3h5OiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHByb3h5KTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHJlc291cmNlVVJJKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgU3RyaW5nIG5ld05hbWUgPSBudWxsOwotICAgIGlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICB7Ci0gICAgICBuZXdOYW1lID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0gICAgfQotICAgIGlmIChuZXdOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmV3TmFtZSk7Ci0gICAgICBzZXRRTmFtZShxbmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN3aXRjaCAoV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShjaGlsZCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBBUlQgOgotICAgICAgICB7Ci0gICAgICAgICAgUGFydCBwYXJ0ID0gKChXU0RMUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSkpLmdldFdTRExGYWN0b3J5KCkuY3JlYXRlUGFydCgpOwotICAgICAgICAgIHBhcnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICAgIHBhcnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgZ2V0RVBhcnRzKCkuYWRkKHBhcnQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZV9RTmFtZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLk1FU1NBR0UpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEVQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFBhcnQpCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBvYmo7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKFBhcnRJbXBsKSBwYXJ0KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotfSAvL01lc3NhZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VSZWZlcmVuY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VSZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTdiOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9NZXNzYWdlUmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5NZXNzYWdlUmVmZXJlbmNlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTWVzc2FnZVJlZmVyZW5jZUltcGwjZ2V0RU1lc3NhZ2UgPGVtPkVNZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVzc2FnZVJlZmVyZW5jZUltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBNZXNzYWdlUmVmZXJlbmNlCi17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVNZXNzYWdlKCkgPGVtPkVNZXNzYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFTWVzc2FnZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlIGVNZXNzYWdlID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlUmVmZXJlbmNlSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VSZWZlcmVuY2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlIGdldEVNZXNzYWdlKCkKLSAgewotICAgIGlmIChlTWVzc2FnZSAhPSBudWxsICYmIGVNZXNzYWdlLmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgTWVzc2FnZSBvbGRFTWVzc2FnZSA9IGVNZXNzYWdlOwotICAgICAgZU1lc3NhZ2UgPSAoTWVzc2FnZSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZU1lc3NhZ2UpOwotICAgICAgaWYgKGVNZXNzYWdlICE9IG9sZEVNZXNzYWdlKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRSwgb2xkRU1lc3NhZ2UsIGVNZXNzYWdlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlTWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE1lc3NhZ2UgYmFzaWNHZXRFTWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZU1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVNZXNzYWdlKE1lc3NhZ2UgbmV3RU1lc3NhZ2UpCi0gIHsKLSAgICBNZXNzYWdlIG9sZEVNZXNzYWdlID0gZU1lc3NhZ2U7Ci0gICAgZU1lc3NhZ2UgPSBuZXdFTWVzc2FnZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0UsIG9sZEVNZXNzYWdlLCBlTWVzc2FnZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19OQU1FOgotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0U6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RU1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RU1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOgotICAgICAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOgotICAgICAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fTkFNRToKLSAgICAgICAgcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOgotICAgICAgICByZXR1cm4gZU1lc3NhZ2UgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxpYXRpb24gbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHNldE5hbWUoV1NETENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsICJuYW1lIikpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZVJlZmVyZW5jZV9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlUmVmZXJlbmNlX0VNZXNzYWdlKCkpCi0gICAgICB7Ci0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEVNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxTmFtZSA9IG1lc3NhZ2UuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOyAgICAgIAotICAgICAgUU5hbWUgbWVzc2FnZVFOYW1lID0gY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiKSk7Ci0gICAgICBNZXNzYWdlIG5ld01lc3NhZ2UgPSBtZXNzYWdlUU5hbWUgIT0gbnVsbCA/IChNZXNzYWdlKSBkZWZpbml0aW9uLmdldE1lc3NhZ2UobWVzc2FnZVFOYW1lKSA6IG51bGw7Ci0gICAgICBpZiAobmV3TWVzc2FnZSAhPSBnZXRFTWVzc2FnZSgpKQotICAgICAgewotICAgICAgICBzZXRFTWVzc2FnZShuZXdNZXNzYWdlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotfSAvL01lc3NhZ2VSZWZlcmVuY2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL05hbWVzcGFjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvTmFtZXNwYWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGMyOGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvTmFtZXNwYWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5OYW1lc3BhY2VJbXBsI2dldFVSSSA8ZW0+VVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTmFtZXNwYWNlSW1wbCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVzcGFjZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE5hbWVzcGFjZQotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVSSSgpIDxlbT5VUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVSSSgpIDxlbT5VUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UHJlZml4KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UHJlZml4KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBQUkVGSVhfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgTmFtZXNwYWNlSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVzcGFjZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIG5ld1VSSSkKLSAgewotICAgIFN0cmluZyBvbGRVUkkgPSB1cmk7Ci0gICAgdXJpID0gbmV3VVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk5BTUVTUEFDRV9fVVJJLCBvbGRVUkksIHVyaSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIG5ld1ByZWZpeCkKLSAgewotICAgIFN0cmluZyBvbGRQcmVmaXggPSBwcmVmaXg7Ci0gICAgcHJlZml4ID0gbmV3UHJlZml4OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk5BTUVTUEFDRV9fUFJFRklYLCBvbGRQcmVmaXgsIHByZWZpeCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1VSSToKLSAgICAgICAgcmV0dXJuIGdldFVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1BSRUZJWDoKLSAgICAgICAgcmV0dXJuIGdldFByZWZpeCgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19VUkk6Ci0gICAgICAgIHNldFVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1BSRUZJWDoKLSAgICAgICAgc2V0UHJlZml4KChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1VSSToKLSAgICAgICAgc2V0VVJJKFVSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19QUkVGSVg6Ci0gICAgICAgIHNldFByZWZpeChQUkVGSVhfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19VUkk6Ci0gICAgICAgIHJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19QUkVGSVg6Ci0gICAgICAgIHJldHVybiBQUkVGSVhfRURFRkFVTFQgPT0gbnVsbCA/IHByZWZpeCAhPSBudWxsIDogIVBSRUZJWF9FREVGQVVMVC5lcXVhbHMocHJlZml4KTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAoVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHVyaSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBwcmVmaXg6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLX0gLy9OYW1lc3BhY2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL09wZXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3BlcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzNiOGQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3BlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwjZ2V0RUlucHV0IDxlbT5FSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5PcGVyYXRpb25JbXBsI2dldEVPdXRwdXQgPGVtPkVPdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5PcGVyYXRpb25JbXBsI2dldEVGYXVsdHMgPGVtPkVGYXVsdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5PcGVyYXRpb25JbXBsI2dldEVQYXJhbWV0ZXJPcmRlcmluZyA8ZW0+RVBhcmFtZXRlciBPcmRlcmluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvbkltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBPcGVyYXRpb24KLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0U3R5bGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9wZXJhdGlvblR5cGUgU1RZTEVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0U3R5bGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgT3BlcmF0aW9uVHlwZSBzdHlsZSA9IFNUWUxFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuZGVmaW5lZCgpIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVOREVGSU5FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuZGVmaW5lZCgpIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdW5kZWZpbmVkID0gVU5ERUZJTkVEX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm94eSgpIDxlbT5Qcm94eTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNQcm94eSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9YWV9FREVGQVVMVCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJveHkgPSBQUk9YWV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVSSSgpIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFJlc291cmNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZVVSSSA9IFJFU09VUkNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUlucHV0KCkgPGVtPkVJbnB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUlucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIElucHV0IGVJbnB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVPdXRwdXQoKSA8ZW0+RU91dHB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBPdXRwdXQgZU91dHB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVGYXVsdHMoKSA8ZW0+RUZhdWx0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFRmF1bHRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVGYXVsdHMgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKSA8ZW0+RVBhcmFtZXRlciBPcmRlcmluZzwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZVBhcmFtZXRlck9yZGVyaW5nID0gbnVsbDsKLQotICBwcml2YXRlIE1hcCBmYXVsdHM7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgT3BlcmF0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE9wZXJhdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE9wZXJhdGlvblR5cGUgZ2V0U3R5bGUoKQotICB7Ci0gICAgaWYgKHN0eWxlID09IG51bGwpCi0gICAgICBzdHlsZSA9IGRlZHVjZU9wZXJhdGlvblR5cGUoZ2V0RWxlbWVudCgpKTsKLSAgICAKLSAgICAvLyBUaGUgdmFsdWUgb2Ygc3R5bGUgaXMgdXBkYXRlZCB3aGVuCi0gICAgLy8gMSkgdGhlIFdTREwgaXMgbG9hZGVkIGZvciB0aGUgZmlyc3QgdGltZSwKLSAgICAvLyAyKSB0aGUgc2V0U3R5bGUoKSBtZXRob2QgaXMgY2FsbGVkLCBhbmQKLSAgICAvLyAzKSB0aGUgY2hpbGRyZW4gb2YgdGhlIE9wZXJhdGlvbiAoRE9NKSBlbGVtZW50IGFyZSBtYW5pcHVsYXRlZC4KLSAgICByZXR1cm4gc3R5bGU7Ci0gIH0KLQotICBwcml2YXRlIE9wZXJhdGlvblR5cGUgZGVkdWNlT3BlcmF0aW9uVHlwZShFbGVtZW50IG9wZXJhdGlvbikKLSAgewotICAgIGlmIChvcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgICAgIAotICAJaW50IHN0YXRlID0gMDsKLSAgCWludCBtZXNzYWdlUmVmVHlwZSA9IC0xOwotICAJTm9kZSBjaGlsZCA9IG51bGw7Ci0gIAlOb2RlTGlzdCBjaGlsZHJlbiA9IG9wZXJhdGlvbi5nZXRDaGlsZE5vZGVzKCk7Ci0gIAkKLSAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgY29udGludWU7Ci0gICAgICAKLSAgICAgIG1lc3NhZ2VSZWZUeXBlID0gV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZSgoRWxlbWVudCljaGlsZCk7Ci0gICAgICBzd2l0Y2ggKHN0YXRlKQotCSAgewotICAgICAgICBjYXNlIDA6IC8vIGluaXRpYWwgc3RhdGUgICAgIAotICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLklOUFVUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAxOyAKLSAgICAgICAgICBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLk9VVFBVVCA9PSBtZXNzYWdlUmVmVHlwZSkKLSAgICAgICAgICAgIHN0YXRlID0gMjsgCi0gICAgICAgICAgZWxzZSBpZiAoV1NETENvbnN0YW50cy5ET0NVTUVOVEFUSU9OID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgIAlzdGF0ZSA9IDA7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6IC8vIG9uZS13YXkgb3IgcmVxdWVzdC1yZXNwb25zZQotICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLkZBVUxUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAxMTsgLy8gb25lLXdheQotICAgICAgICAgIGVsc2UgaWYgKFdTRExDb25zdGFudHMuT1VUUFVUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAzOyAvLyByZXF1ZXN0LXJlc3BvbnNlCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOiAvLyBvbmUtd2F5Ci0gICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuRkFVTFQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDExOyAvLyBvbmUtd2F5Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6IC8vIHNvbGljaXQtcmVzcG9uc2Ugb3Igbm90aWZpY2F0aW9uCi0gICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuSU5QVVQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDQ7IC8vIHNvbGljaXQtcmVzcG9uc2UKLSAgICAgICAgICBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLkZBVUxUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAyMTsgLy8gbm90aWZpY2F0aW9uCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIxOiAvLyBub3RpZmljYXRpb24KLSAgICAgICAgICBpZiAoV1NETENvbnN0YW50cy5GQVVMVCA9PSBtZXNzYWdlUmVmVHlwZSkKLSAgICAgICAgICAgIHN0YXRlID0gMjE7IC8vIG5vdGlmaWNhdGlvbgotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRlID0gLTE7IC8vIGNhbm5vdCBoYXBwZW4KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOiAvLyByZXF1ZXN0LXJlc3BvbnNlIAotICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLkZBVUxUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAzOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRlID0gLTE7IC8vIGNhbm5vdCBoYXBwZW4KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OiAvLyBzb2xpY2l0LXJlc3BvbnNlCi0gICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuRkFVTFQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDQ7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvLyBjYW5ub3QgaGFwcGVuICgtMSkKLSAgICAgICAgICBicmVhazsKLQkgIH0KLSAgICB9Ci0gICAgCi0gICAgT3BlcmF0aW9uVHlwZSBvcFR5cGUgPSBudWxsOwotICAgIHN3aXRjaCAoc3RhdGUpCi0JewotICAgICAgY2FzZSAxOgotICAgICAgY2FzZSAxMToKLSAgICAgIAlvcFR5cGUgPSBPcGVyYXRpb25UeXBlLk9ORV9XQVk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgY2FzZSAyMToKLSAgICAgIAlvcFR5cGUgPSBPcGVyYXRpb25UeXBlLk5PVElGSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAJb3BUeXBlID0gT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDoKLSAgICAgIAlvcFR5cGUgPSBPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogLy8gaW52YWxpZAotICAgICAgICBicmVhazsKLQl9Ci0gICAgcmV0dXJuIG9wVHlwZTsgICAgCi0gIH0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdHlsZShPcGVyYXRpb25UeXBlIG5ld1N0eWxlKQotICB7Ci0gICAgT3BlcmF0aW9uVHlwZSBvbGRTdHlsZSA9IHN0eWxlOwotICAgIHN0eWxlID0gbmV3U3R5bGU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIFN0cmluZyBvbGROYW1lID0gbmFtZTsKLSAgICBuYW1lID0gbmV3TmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRlZmluZWQoKQotICB7Ci0gICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gbmV3VW5kZWZpbmVkKQotICB7Ci0gICAgYm9vbGVhbiBvbGRVbmRlZmluZWQgPSB1bmRlZmluZWQ7Ci0gICAgdW5kZWZpbmVkID0gbmV3VW5kZWZpbmVkOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fVU5ERUZJTkVELCBvbGRVbmRlZmluZWQsIHVuZGVmaW5lZCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb3h5KCkKLSAgewotICAgIHJldHVybiBwcm94eTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJveHkoYm9vbGVhbiBuZXdQcm94eSkKLSAgewotICAgIGJvb2xlYW4gb2xkUHJveHkgPSBwcm94eTsKLSAgICBwcm94eSA9IG5ld1Byb3h5OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUFJPWFksIG9sZFByb3h5LCBwcm94eSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVVJJKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVUkkoU3RyaW5nIG5ld1Jlc291cmNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZFJlc291cmNlVVJJID0gcmVzb3VyY2VVUkk7Ci0gICAgcmVzb3VyY2VVUkkgPSBuZXdSZXNvdXJjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1JFU09VUkNFX1VSSSwgb2xkUmVzb3VyY2VVUkksIHJlc291cmNlVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBJbnB1dCBnZXRFSW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGVJbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RUlucHV0KElucHV0IG5ld0VJbnB1dCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIElucHV0IG9sZEVJbnB1dCA9IGVJbnB1dDsKLSAgICBlSW5wdXQgPSBuZXdFSW5wdXQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgIHsKLSAgICAgIEVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVCwgb2xkRUlucHV0LCBuZXdFSW5wdXQpOwotICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gbXNnczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RUlucHV0KElucHV0IG5ld0VJbnB1dCkKLSAgewotICAgIGlmIChuZXdFSW5wdXQgIT0gZUlucHV0KQotICAgIHsKLSAgICAgIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotICAgICAgaWYgKGVJbnB1dCAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZUlucHV0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld0VJbnB1dCAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RUlucHV0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQsIG51bGwsIG1zZ3MpOwotICAgICAgbXNncyA9IGJhc2ljU2V0RUlucHV0KG5ld0VJbnB1dCwgbXNncyk7Ci0gICAgICBpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQsIG5ld0VJbnB1dCwgbmV3RUlucHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPdXRwdXQgZ2V0RU91dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZU91dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RU91dHB1dChPdXRwdXQgbmV3RU91dHB1dCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIE91dHB1dCBvbGRFT3V0cHV0ID0gZU91dHB1dDsKLSAgICBlT3V0cHV0ID0gbmV3RU91dHB1dDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgewotICAgICAgRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRU9VVFBVVCwgb2xkRU91dHB1dCwgbmV3RU91dHB1dCk7Ci0gICAgICBpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBtc2dzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFT3V0cHV0KE91dHB1dCBuZXdFT3V0cHV0KQotICB7Ci0gICAgaWYgKG5ld0VPdXRwdXQgIT0gZU91dHB1dCkKLSAgICB7Ci0gICAgICBOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLSAgICAgIGlmIChlT3V0cHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllT3V0cHV0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVULCBudWxsLCBtc2dzKTsKLSAgICAgIGlmIChuZXdFT3V0cHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFT3V0cHV0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVULCBudWxsLCBtc2dzKTsKLSAgICAgIG1zZ3MgPSBiYXNpY1NldEVPdXRwdXQobmV3RU91dHB1dCwgbXNncyk7Ci0gICAgICBpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVULCBuZXdFT3V0cHV0LCBuZXdFT3V0cHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFRmF1bHRzKCkKLSAgewotICAgIGlmIChlRmF1bHRzID09IG51bGwpCi0gICAgewotICAgICAgZUZhdWx0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChGYXVsdC5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FRkFVTFRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVGYXVsdHM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKQotICB7Ci0gICAgaWYgKGVQYXJhbWV0ZXJPcmRlcmluZyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVQYXJhbWV0ZXJPcmRlcmluZyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoUGFydC5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FUEFSQU1FVEVSX09SREVSSU5HKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVQYXJhbWV0ZXJPcmRlcmluZzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBmYXVsdCBtZXNzYWdlIHRoYXQgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgKiBvcGVyYXRpb24uCi0gICAqIEBwYXJhbSBmYXVsdCB0aGUgbmV3IGZhdWx0IG1lc3NhZ2UKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRGYXVsdChqYXZheC53c2RsLkZhdWx0IGZhdWx0KQotICB7Ci0gICAgZ2V0RUZhdWx0cygpLmFkZCgoRmF1bHQpZmF1bHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIGZhdWx0IG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGZhdWx0IG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZmF1bHQgbWVzc2FnZSwgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIG1lc3NhZ2UKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5GYXVsdCBnZXRGYXVsdChTdHJpbmcgbmFtZSkKLSAgewotICAgIEZhdWx0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICBpZiAobmFtZS5lcXVhbHMoZmF1bHQuZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZmF1bHQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIGZhdWx0IG1lc3NhZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhdGlvbi4KLSAgICogQHJldHVybiBuYW1lcyBvZiBmYXVsdCBtZXNzYWdlcwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBNYXAgZ2V0RmF1bHRzKCkKLSAgewotICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICBoYXNoTWFwLnB1dChmYXVsdC5nZXROYW1lKCksIGZhdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc2hNYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgUGFydCBuYW1lcy4gTm90ZSB0aGF0IAotICAgKiBnZXRQYXJhbWV0ZXJFT3JkZXJpbmcoKSByZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBQYXJ0cy4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRQYXJhbWV0ZXJPcmRlcmluZygpCi0gIHsKLSAgICBMaXN0IG9yZGVyaW5nID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVQYXJhbWV0ZXJPcmRlcmluZygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGkubmV4dCgpOwotICAgICAgICBvcmRlcmluZy5hZGQocGFydC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUQkQgLSBoYW5kbGUgZXhjZXB0aW9uCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvcmRlcmluZy5pc0VtcHR5KCkgPyBudWxsIDogb3JkZXJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJPcmRlcmluZyhMaXN0IHBhcmFtZXRlck9yZGVyKQotICB7Ci0gICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuY2xlYXIoKTsKLSAgICBpZiAocGFyYW1ldGVyT3JkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJhbWV0ZXJPcmRlci5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJ0KCk7Ci0gICAgICAgIHBhcnQuc2V0TmFtZSgoU3RyaW5nKSBpLm5leHQoKSk7Ci0gICAgICAgIGdldEVQYXJhbWV0ZXJPcmRlcmluZygpLmFkZChwYXJ0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5JbnB1dCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUlucHV0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChqYXZheC53c2RsLklucHV0IGlucHV0KQotICB7Ci0gICAgc2V0RUlucHV0KChJbnB1dCkgaW5wdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuT3V0cHV0IGdldE91dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RU91dHB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T3V0cHV0KGphdmF4LndzZGwuT3V0cHV0IG91dHB1dCkKLSAgewotICAgIHNldEVPdXRwdXQoKE91dHB1dCkgb3V0cHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgICByZXR1cm4gYmFzaWNTZXRFSW5wdXQobnVsbCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVUOgotICAgICAgICAgIHJldHVybiBiYXNpY1NldEVPdXRwdXQobnVsbCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FRkFVTFRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUZhdWx0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1NUWUxFOgotICAgICAgICByZXR1cm4gZ2V0U3R5bGUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19OQU1FOgotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIGlzVW5kZWZpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1BST1hZOgotICAgICAgICByZXR1cm4gaXNQcm94eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgcmV0dXJuIGdldEVJbnB1dCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VPVVRQVVQ6Ci0gICAgICAgIHJldHVybiBnZXRFT3V0cHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUZBVUxUUzoKLSAgICAgICAgcmV0dXJuIGdldEVGYXVsdHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FUEFSQU1FVEVSX09SREVSSU5HOgotICAgICAgICByZXR1cm4gZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgc2V0U3R5bGUoKE9wZXJhdGlvblR5cGUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1VOREVGSU5FRDoKLSAgICAgICAgc2V0VW5kZWZpbmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgc2V0RUlucHV0KChJbnB1dCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVUOgotICAgICAgICBzZXRFT3V0cHV0KChPdXRwdXQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUZBVUxUUzoKLSAgICAgICAgZ2V0RUZhdWx0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVGYXVsdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRVBBUkFNRVRFUl9PUkRFUklORzoKLSAgICAgICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fU1RZTEU6Ci0gICAgICAgIHNldFN0eWxlKFNUWUxFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZChVTkRFRklORURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KFBST1hZX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1JFU09VUkNFX1VSSToKLSAgICAgICAgc2V0UmVzb3VyY2VVUkkoUkVTT1VSQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgc2V0RUlucHV0KChJbnB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VPVVRQVVQ6Ci0gICAgICAgIHNldEVPdXRwdXQoKE91dHB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VGQVVMVFM6Ci0gICAgICAgIGdldEVGYXVsdHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRVBBUkFNRVRFUl9PUkRFUklORzoKLSAgICAgICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fU1RZTEU6Ci0gICAgICAgIHJldHVybiBTVFlMRV9FREVGQVVMVCA9PSBudWxsID8gc3R5bGUgIT0gbnVsbCA6ICFTVFlMRV9FREVGQVVMVC5lcXVhbHMoc3R5bGUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fVU5ERUZJTkVEOgotICAgICAgICByZXR1cm4gdW5kZWZpbmVkICE9IFVOREVGSU5FRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19QUk9YWToKLSAgICAgICAgcmV0dXJuIHByb3h5ICE9IFBST1hZX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVUkkgIT0gbnVsbCA6ICFSRVNPVVJDRV9VUklfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQ6Ci0gICAgICAgIHJldHVybiBlSW5wdXQgIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVUOgotICAgICAgICByZXR1cm4gZU91dHB1dCAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VGQVVMVFM6Ci0gICAgICAgIHJldHVybiBlRmF1bHRzICE9IG51bGwgJiYgIWVGYXVsdHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VQQVJBTUVURVJfT1JERVJJTkc6Ci0gICAgICAgIHJldHVybiBlUGFyYW1ldGVyT3JkZXJpbmcgIT0gbnVsbCAmJiAhZVBhcmFtZXRlck9yZGVyaW5nLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAoc3R5bGU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoc3R5bGUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHVuZGVmaW5lZDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1bmRlZmluZWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJveHk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJveHkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyAKLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc3R5bGUgPSBkZWR1Y2VPcGVyYXRpb25UeXBlKGNoYW5nZWRFbGVtZW50KTsKLSAgICBzdXBlci5lbGVtZW50Q2hhbmdlZChjaGFuZ2VkRWxlbWVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0KLSAgICBzd2l0Y2ggKFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoY2hpbGQpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5JTlBVVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBJbnB1dCBpbnB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbnB1dCgpOwotICAgICAgICAgIGlucHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgaW5wdXQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgc2V0SW5wdXQoaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuT1VUUFVUIDoKLSAgICAgICAgewotICAgICAgICAgIE91dHB1dCBvdXRwdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0cHV0KCk7Ci0gICAgICAgICAgb3V0cHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgb3V0cHV0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIHNldE91dHB1dChvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRkFVTFQgOgotICAgICAgICB7Ci0gICAgICAgICAgRmF1bHQgZmF1bHQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmF1bHQoKTsKLSAgICAgICAgICBmYXVsdC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgIGZhdWx0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIGFkZEZhdWx0KGZhdWx0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUodGhpcywgaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIElucHV0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbi5zZXRFSW5wdXQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbi5zZXRFT3V0cHV0KG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBjb21wb25lbnQ7Ci0KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAob3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQob3BlcmF0aW9uLmdldEVJbnB1dCgpKTsKLSAgICB9Ci0KLSAgICBpZiAob3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkpOwotICAgIH0KLQotICAgIGxpc3QuYWRkQWxsKG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkpOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE9wZXJhdGlvbl9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRPcGVyYXRpb25fU3R5bGUoKSkKLSAgICAgIHsKLSAgICAgICAgT3BlcmF0aW9uVHlwZSB0YXJnZXRUeXBlID0gZ2V0U3R5bGUoKTsKLSAgICAgICAgT3BlcmF0aW9uVHlwZSBjdXJyZW50VHlwZSA9IGRlZHVjZU9wZXJhdGlvblR5cGUodGhlRWxlbWVudCk7Ci0gICAgICAgIGlmICh0YXJnZXRUeXBlLmVxdWFscyhjdXJyZW50VHlwZSkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICBlbHNlIGlmICgodGFyZ2V0VHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFKSB8fCB0YXJnZXRUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpKQotICAgICAgICAgICAgICAgICAgJiYgKGN1cnJlbnRUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpIHx8IGN1cnJlbnRUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpKSkKLSAgICAgICAgCXJlb3JkZXJDaGlsZHJlbigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgc3R5bGUgPSBkZWR1Y2VPcGVyYXRpb25UeXBlKHRoZUVsZW1lbnQpOyAvLyBzd2l0Y2ggYmFjay4gbm8gc3VwcG9ydCBmb3IgdGhlIG90aGVyIHR5cGVzCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBTd2l0Y2ggPGlucHV0PiBhbmQgPG91dHB1dD4KLSAgcHJpdmF0ZSB2b2lkIHJlb3JkZXJDaGlsZHJlbigpCi0gIHsKLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGdldEVsZW1lbnQoKS5nZXRDaGlsZE5vZGVzKCk7IC8vIFRoZXJlIGFyZSBjaGlsZHJlbi4KLSAgICAKLSAgICAvLyBGaW5kIG91dCB0aGUgcG9zaXRpb25zIG9mIDxpbnB1dD4gYW5kIDxvdXRwdXQ+Ci0gICAgTm9kZSBjdXJyZW50ID0gbnVsbDsKLSAgICBOb2RlIGlucHV0ID0gbnVsbDsKLSAgICBOb2RlIG91dHB1dCA9IG51bGw7Ci0gICAgTm9kZSByZWZlcmVuY2UgPSBudWxsOwotICAgIGZvciAoaW50IGk9MDsgaTxub2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIGN1cnJlbnQgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgaWYgKGN1cnJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgIAlpZiAoV1NETENvbnN0YW50cy5JTlBVVCA9PSBXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKChFbGVtZW50KWN1cnJlbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXQgPSBjdXJyZW50OwotICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlZmVyZW5jZSA9IG5vZGVMaXN0Lml0ZW0oaSsxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLk9VVFBVVCA9PSBXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKChFbGVtZW50KWN1cnJlbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0cHV0ID0gY3VycmVudDsKLSAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlZmVyZW5jZSA9IG5vZGVMaXN0Lml0ZW0oaSsxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gLy8gZW5kIGZvcgotICAgIAotICAgIGlmIChpbnB1dCAhPSBudWxsICYmIG91dHB1dCAhPSBudWxsICYmIHJlZmVyZW5jZSAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcGFyZW50ID0gZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGdldFN0eWxlKCkuZXF1YWxzKE9wZXJhdGlvblR5cGUuUkVRVUVTVF9SRVNQT05TRSkpCi0gICAgICB7Ci0gICAgICAJLy8gY3VycmVudCBvcmRlcjogPG91dHB1dD4gPGlucHV0PgotICAgICAgICBzd2l0Y2hDaGlsZHJlbihwYXJlbnQsb3V0cHV0LGlucHV0LHJlZmVyZW5jZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChnZXRTdHlsZSgpLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpKQotICAgICAgewotICAgICAgICAvLyBjdXJyZW50IG9yZGVyOiA8aW5wdXQ+IDxvdXRwdXQ+Ci0gICAgICAgIHN3aXRjaENoaWxkcmVuKHBhcmVudCxpbnB1dCxvdXRwdXQscmVmZXJlbmNlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzd2l0Y2hDaGlsZHJlbihOb2RlIHBhcmVudCwgTm9kZSBjaGlsZDEsIE5vZGUgY2hpbGQyLCBOb2RlIG5leHRPZkNoaWxkMikKLSAgewotICAgIC8vIGN1cnJlbnQgbm9kZSBzZXF1ZW5jZTogPGNoaWxkMT4gPGNoaWxkMj4gPG5leHRPZkNoaWxkMj4KLSAgICBuaWNlUmVtb3ZlQ2hpbGQocGFyZW50LGNoaWxkMik7Ci0gICAgbmljZUluc2VydEJlZm9yZShwYXJlbnQsY2hpbGQyLGNoaWxkMSk7Ci0gICAgbmljZVJlbW92ZUNoaWxkKHBhcmVudCxjaGlsZDEpOwotICAgIG5pY2VJbnNlcnRCZWZvcmUocGFyZW50LGNoaWxkMSxuZXh0T2ZDaGlsZDIpOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuT1BFUkFUSU9OKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgSW5wdXQgaW5wdXQgPSBnZXRFSW5wdXQoKTsKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChJbnB1dEltcGwpIGlucHV0KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICBPdXRwdXQgb3V0cHV0ID0gZ2V0RU91dHB1dCgpOwotICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChPdXRwdXRJbXBsKSBvdXRwdXQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoRmF1bHRJbXBsKSBmYXVsdCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0gCi0gIAotfSAvL09wZXJhdGlvbkltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3V0cHV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9PdXRwdXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYzc2MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9PdXRwdXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRwdXRJbXBsIGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBPdXRwdXQKLXsKLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgT3V0cHV0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dHB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKSBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19FTUVTU0FHRToKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFTWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0VNRVNTQUdFOgotICAgICAgICBzZXRFTWVzc2FnZSgob3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRU1FU1NBR0U6Ci0gICAgICAgIHJldHVybiBlTWVzc2FnZSAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5PVVRQVVQpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLX0gLy9PdXRwdXRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BhcnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BhcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNTliMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9QYXJ0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlBhcnRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5QYXJ0SW1wbCNnZXRFbGVtZW50TmFtZSA8ZW0+RWxlbWVudCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUGFydEltcGwjZ2V0VHlwZU5hbWUgPGVtPlR5cGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlBhcnRJbXBsI2dldFR5cGVEZWZpbml0aW9uIDxlbT5UeXBlIERlZmluaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5QYXJ0SW1wbCNnZXRFbGVtZW50RGVjbGFyYXRpb24gPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5QYXJ0SW1wbCNnZXRFTWVzc2FnZSA8ZW0+RU1lc3NhZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJ0SW1wbCBleHRlbmRzIFdTRExFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFBhcnQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnROYW1lKCkgPGVtPkVsZW1lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RWxlbWVudE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFFOYW1lIEVMRU1FTlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnROYW1lKCkgPGVtPkVsZW1lbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RWxlbWVudE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgZWxlbWVudE5hbWUgPSBFTEVNRU5UX05BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlTmFtZSgpIDxlbT5UeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFR5cGVOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBRTmFtZSBUWVBFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlTmFtZSgpIDxlbT5UeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFR5cGVOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFFOYW1lIHR5cGVOYW1lID0gVFlQRV9OQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlRGVmaW5pdGlvbigpIDxlbT5UeXBlIERlZmluaXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFR5cGVEZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkgPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RU1lc3NhZ2UoKSA8ZW0+RU1lc3NhZ2U8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2UgZU1lc3NhZ2UgPSBudWxsOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9QQVJUX0VYVEVOU0lPTlMgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9wYXJ0LWV4dGVuc2lvbnMvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRVNTQUdFID0gIm1lc3NhZ2UiOwotICBwcml2YXRlIE1hcCBleHRlbnNpb25BdHRyaWJ1dGVzID0gbmV3IEV4dGVuc2lvbkF0dHJpYnV0ZU1hcCgpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFBhcnRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFydCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0gICAgbmFtZSA9IG5ld05hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUEFSVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZShRTmFtZSBuZXdFbGVtZW50TmFtZSkKLSAgewotICAgIFFOYW1lIG9sZEVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gICAgZWxlbWVudE5hbWUgPSBuZXdFbGVtZW50TmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX05BTUUsIG9sZEVsZW1lbnROYW1lLCBlbGVtZW50TmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlTmFtZShRTmFtZSBuZXdUeXBlTmFtZSkKLSAgewotICAgIFFOYW1lIG9sZFR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gICAgdHlwZU5hbWUgPSBuZXdUeXBlTmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QQVJUX19UWVBFX05BTUUsIG9sZFR5cGVOYW1lLCB0eXBlTmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oKQotICB7Ci0gICAgaWYgKHR5cGVEZWZpbml0aW9uICE9IG51bGwgJiYgdHlwZURlZmluaXRpb24uZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiBvbGRUeXBlRGVmaW5pdGlvbiA9IHR5cGVEZWZpbml0aW9uOwotICAgICAgdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KXR5cGVEZWZpbml0aW9uKTsKLSAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiAhPSBvbGRUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5QQVJUX19UWVBFX0RFRklOSVRJT04sIG9sZFR5cGVEZWZpbml0aW9uLCB0eXBlRGVmaW5pdGlvbikpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHlwZURlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBYU0RUeXBlRGVmaW5pdGlvbiBiYXNpY0dldFR5cGVEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiB0eXBlRGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gbmV3VHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiBvbGRUeXBlRGVmaW5pdGlvbiA9IHR5cGVEZWZpbml0aW9uOwotICAgIHR5cGVEZWZpbml0aW9uID0gbmV3VHlwZURlZmluaXRpb247Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9ERUZJTklUSU9OLCBvbGRUeXBlRGVmaW5pdGlvbiwgdHlwZURlZmluaXRpb24pKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oKQotICB7Ci0gICAgaWYgKGVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsICYmIGVsZW1lbnREZWNsYXJhdGlvbi5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBvbGRFbGVtZW50RGVjbGFyYXRpb24gPSBlbGVtZW50RGVjbGFyYXRpb247Ci0gICAgICBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllbGVtZW50RGVjbGFyYXRpb24pOwotICAgICAgaWYgKGVsZW1lbnREZWNsYXJhdGlvbiAhPSBvbGRFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9ERUNMQVJBVElPTiwgb2xkRWxlbWVudERlY2xhcmF0aW9uLCBlbGVtZW50RGVjbGFyYXRpb24pKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVsZW1lbnREZWNsYXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbiBiYXNpY0dldEVsZW1lbnREZWNsYXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudERlY2xhcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG5ld0VsZW1lbnREZWNsYXJhdGlvbikKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBvbGRFbGVtZW50RGVjbGFyYXRpb24gPSBlbGVtZW50RGVjbGFyYXRpb247Ci0gICAgZWxlbWVudERlY2xhcmF0aW9uID0gbmV3RWxlbWVudERlY2xhcmF0aW9uOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT04sIG9sZEVsZW1lbnREZWNsYXJhdGlvbiwgZWxlbWVudERlY2xhcmF0aW9uKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlIGdldEVNZXNzYWdlKCkKLSAgewotICAgIGlmIChlTWVzc2FnZSAhPSBudWxsICYmIGVNZXNzYWdlLmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgTWVzc2FnZSBvbGRFTWVzc2FnZSA9IGVNZXNzYWdlOwotICAgICAgZU1lc3NhZ2UgPSAoTWVzc2FnZSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZU1lc3NhZ2UpOwotICAgICAgaWYgKGVNZXNzYWdlICE9IG9sZEVNZXNzYWdlKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLlBBUlRfX0VNRVNTQUdFLCBvbGRFTWVzc2FnZSwgZU1lc3NhZ2UpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVNZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZSBiYXNpY0dldEVNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBlTWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RU1lc3NhZ2UoTWVzc2FnZSBuZXdFTWVzc2FnZSkKLSAgewotICAgIE1lc3NhZ2Ugb2xkRU1lc3NhZ2UgPSBlTWVzc2FnZTsKLSAgICBlTWVzc2FnZSA9IG5ld0VNZXNzYWdlOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBBUlRfX0VNRVNTQUdFLCBvbGRFTWVzc2FnZSwgZU1lc3NhZ2UpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbkF0dHJpYnV0ZShRTmFtZSBuYW1lLCBRTmFtZSB2YWx1ZSkKLSAgewotICAgIFN0cmluZyBsb2NhbE5hbWUgPSBuYW1lLmdldExvY2FsUGFydCgpOwotICAgIFN0cmluZyBuc1VSSSA9IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgaWYgKGxvY2FsTmFtZSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICBleHRlbnNpb25BdHRyaWJ1dGVzLnJlbW92ZShuYW1lKTsKLSAgICBlbHNlCi0gICAgICBleHRlbnNpb25BdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMoKQotICB7Ci0gICAgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKGV4dGVuc2lvbkF0dHJpYnV0ZXMpOwotCi0gICAgLy8gQWRqdXN0IG1lc3NhZ2VOYW1lIGF0dHJpYnV0ZQotICAgIFFOYW1lIG1lc3NhZ2VOYW1lID0gZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBnZXRNZXNzYWdlKCkuZ2V0UU5hbWUoKSA6IG51bGw7Ci0gICAgaWYgKG1lc3NhZ2VOYW1lICE9IG51bGwpCi0gICAgICBtYXAucHV0KG5ldyBRTmFtZShOU19VUklfUEFSVF9FWFRFTlNJT05TLCBBVFRSX01FU1NBR0UpLCBtZXNzYWdlTmFtZSk7Ci0gICAgZWxzZQotICAgICAgbWFwLnJlbW92ZShuZXcgUU5hbWUoTlNfVVJJX1BBUlRfRVhURU5TSU9OUywgQVRUUl9NRVNTQUdFKSk7Ci0KLSAgICByZXR1cm4gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKFFOYW1lIG5hbWUpCi0gIHsKLSAgICBpZiAobmFtZS5lcXVhbHMobmV3IFFOYW1lKE5TX1VSSV9QQVJUX0VYVEVOU0lPTlMsIEFUVFJfTUVTU0FHRSkpKQotICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoKSAhPSBudWxsID8gZ2V0TWVzc2FnZSgpLmdldFFOYW1lKCkgOiBudWxsOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAoUU5hbWUpIGV4dGVuc2lvbkF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKSBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk1lc3NhZ2UgZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RU1lc3NhZ2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9OQU1FOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9OQU1FOgotICAgICAgICByZXR1cm4gZ2V0VHlwZU5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9ERUZJTklUSU9OOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT046Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTUVTU0FHRToKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFTWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX05BTUU6Ci0gICAgICAgIHNldEVsZW1lbnROYW1lKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9OQU1FOgotICAgICAgICBzZXRUeXBlTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfREVGSU5JVElPTjoKLSAgICAgICAgc2V0VHlwZURlZmluaXRpb24oKFhTRFR5cGVEZWZpbml0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX0RFQ0xBUkFUSU9OOgotICAgICAgICBzZXRFbGVtZW50RGVjbGFyYXRpb24oKFhTREVsZW1lbnREZWNsYXJhdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRU1FU1NBR0U6Ci0gICAgICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX05BTUU6Ci0gICAgICAgIHNldEVsZW1lbnROYW1lKEVMRU1FTlRfTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9OQU1FOgotICAgICAgICBzZXRUeXBlTmFtZShUWVBFX05BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfREVGSU5JVElPTjoKLSAgICAgICAgc2V0VHlwZURlZmluaXRpb24oKFhTRFR5cGVEZWZpbml0aW9uKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT046Ci0gICAgICAgIHNldEVsZW1lbnREZWNsYXJhdGlvbigoWFNERWxlbWVudERlY2xhcmF0aW9uKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VNRVNTQUdFOgotICAgICAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9OQU1FOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50TmFtZSAhPSBudWxsIDogIUVMRU1FTlRfTkFNRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudE5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19UWVBFX05BTUU6Ci0gICAgICAgIHJldHVybiBUWVBFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGVOYW1lICE9IG51bGwgOiAhVFlQRV9OQU1FX0VERUZBVUxULmVxdWFscyh0eXBlTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfREVGSU5JVElPTjoKLSAgICAgICAgcmV0dXJuIHR5cGVEZWZpbml0aW9uICE9IG51bGw7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT046Ci0gICAgICAgIHJldHVybiBlbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRU1FU1NBR0U6Ci0gICAgICAgIHJldHVybiBlTWVzc2FnZSAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgZWxlbWVudE5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZWxlbWVudE5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgdHlwZU5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodHlwZU5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgTWFwIGdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKQotICB7Ci0gICAgcmV0dXJuIGV4dGVuc2lvbkF0dHJpYnV0ZXM7Ci0gIH0KLQotICBjbGFzcyBFeHRlbnNpb25BdHRyaWJ1dGVNYXAgZXh0ZW5kcyBIYXNoTWFwCi0gIHsKLSAgICBFeHRlbnNpb25BdHRyaWJ1dGVNYXAoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbCkKLSAgICB7Ci0gICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKSBrZXk7Ci0gICAgICBRTmFtZSB2YWx1ZSA9IChRTmFtZSkgdmFsOwotICAgICAgU3RyaW5nIGxOYW1lID0gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgIFN0cmluZyBuU3BhY2UgPSBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICBpZiAoTlNfVVJJX1BBUlRfRVhURU5TSU9OUy5lcXVhbHMoblNwYWNlKSAmJiBBVFRSX01FU1NBR0UuZXF1YWxzKGxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgamF2YXgud3NkbC5NZXNzYWdlIG1lc3NhZ2VQcm94eSA9IG5ldyBNZXNzYWdlSW1wbCgpOwotICAgICAgICBtZXNzYWdlUHJveHkuc2V0UU5hbWUodmFsdWUpOwotICAgICAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSkgbWVzc2FnZVByb3h5KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCi0gICAgU3RyaW5nIG5hbWUgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGVOUyhudWxsLCAibmFtZSIpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZWxlbWVudEF0dHIgPSBXU0RMQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgV1NETENvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURSk7Ci0gICAgc2V0RWxlbWVudE5hbWUoZWxlbWVudEF0dHIgIT0gbnVsbCA/IGNyZWF0ZVFOYW1lKGRlZmluaXRpb24sIGVsZW1lbnRBdHRyKSA6IG51bGwpOwotCQkgICAgCi0gICAgU3RyaW5nIHR5cGVBdHRyID0gV1NETENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpOwotICAgIHNldFR5cGVOYW1lKHR5cGVBdHRyICE9IG51bGwgPyBjcmVhdGVRTmFtZShkZWZpbml0aW9uLCB0eXBlQXR0cikgOiBudWxsKTsKLQotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIC8vc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFydF9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLQotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJ0X1R5cGVOYW1lKCkpCi0gICAgICAgIGlmIChnZXRUeXBlTmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZVVSSVZhbHVlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldFR5cGVOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBnZXRUeXBlTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgCi0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcnRfRWxlbWVudE5hbWUoKSkKLSAgICAgICAgaWYgKGdldEVsZW1lbnROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURSwgZ2V0RWxlbWVudE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSArICIjIiArIGdldEVsZW1lbnROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJ0X1R5cGVEZWZpbml0aW9uKCkpCi0gICAgICB7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKHR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgdHlwZURlZmluaXRpb24uZ2V0VVJJKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZVJlZmVyZW5jZSA9PSBudWxsIHx8IGVSZWZlcmVuY2UgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCkpCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgICBpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGVVUklWYWx1ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLkVMRU1FTlRfQVRUUklCVVRFLCBlbGVtZW50RGVjbC5nZXRVUkkoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5QQVJUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gbmV3RWxlbWVudERlY2xhcmF0aW9uID0gcmVzb2x2ZUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50TmFtZSk7Ci0gICAgaWYgKG5ld0VsZW1lbnREZWNsYXJhdGlvbiAhPSBlbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgc2V0RWxlbWVudERlY2xhcmF0aW9uKG5ld0VsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgfQotCi0gICAgWFNEVHlwZURlZmluaXRpb24gbmV3VHlwZURlZmluaXRpb24gPSByZXNvbHZlVHlwZURlZmluaXRpb24odHlwZU5hbWUpOwotICAgIGlmIChuZXdUeXBlRGVmaW5pdGlvbiAhPSB0eXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBzZXRUeXBlRGVmaW5pdGlvbihuZXdUeXBlRGVmaW5pdGlvbik7Ci0gICAgfQotCi0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotCi0gIHByaXZhdGUgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24oUU5hbWUgcW5hbWUpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uSW1wbCBkZWZpbml0aW9uID0gKERlZmluaXRpb25JbXBsKSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBkZWZpbml0aW9uLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24ocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgWFNEVHlwZURlZmluaXRpb24gcmVzb2x2ZVR5cGVEZWZpbml0aW9uKFFOYW1lIHFuYW1lKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uSW1wbCBkZWZpbml0aW9uID0gKERlZmluaXRpb25JbXBsKSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBkZWZpbml0aW9uLnJlc29sdmVUeXBlRGVmaW5pdGlvbihxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19IC8vUGFydEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUG9ydEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzMDk0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUG9ydEltcGwjZ2V0RUJpbmRpbmcgPGVtPkVCaW5kaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydEltcGwgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBQb3J0Ci17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVCaW5kaW5nKCkgPGVtPkVCaW5kaW5nPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFQmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nIGVCaW5kaW5nID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBQb3J0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBPUlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEJpbmRpbmcgZ2V0RUJpbmRpbmcoKQotICB7Ci0gICAgaWYgKGVCaW5kaW5nICE9IG51bGwgJiYgZUJpbmRpbmcuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBCaW5kaW5nIG9sZEVCaW5kaW5nID0gZUJpbmRpbmc7Ci0gICAgICBlQmluZGluZyA9IChCaW5kaW5nKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllQmluZGluZyk7Ci0gICAgICBpZiAoZUJpbmRpbmcgIT0gb2xkRUJpbmRpbmcpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkcsIG9sZEVCaW5kaW5nLCBlQmluZGluZykpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJpbmRpbmc7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nIGJhc2ljR2V0RUJpbmRpbmcoKQotICB7Ci0gICAgcmV0dXJuIGVCaW5kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFQmluZGluZyhCaW5kaW5nIG5ld0VCaW5kaW5nKQotICB7Ci0gICAgQmluZGluZyBvbGRFQmluZGluZyA9IGVCaW5kaW5nOwotICAgIGVCaW5kaW5nID0gbmV3RUJpbmRpbmc7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkcsIG9sZEVCaW5kaW5nLCBlQmluZGluZykpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuQmluZGluZyBnZXRCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBnZXRFQmluZGluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QmluZGluZyhqYXZheC53c2RsLkJpbmRpbmcgYmluZGluZykKLSAgewotICAgIHNldEVCaW5kaW5nKChCaW5kaW5nKSBiaW5kaW5nKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkc6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RUJpbmRpbmcoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RUJpbmRpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FQklORElORzoKLSAgICAgICAgc2V0RUJpbmRpbmcoKEJpbmRpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FQklORElORzoKLSAgICAgICAgc2V0RUJpbmRpbmcoKEJpbmRpbmcpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsICYmICFlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkc6Ci0gICAgICAgIHJldHVybiBlQmluZGluZyAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBzZXROYW1lKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQscmVtYWluaW5nTW9kZWxPYmplY3RzKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkucmVtb3ZlKGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIFBvcnQgcG9ydCA9IChQb3J0KSBjb21wb25lbnQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKHBvcnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0X0VCaW5kaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IGdldEVCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxTmFtZSA9IGJpbmRpbmcuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5CSU5ESU5HX0FUVFJJQlVURSwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5QT1JUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCkgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZVJlZmVyZW5jZXMoYm9vbGVhbiBkZWVwKQotICB7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBRTmFtZSBiaW5kaW5nUU5hbWUgPSBjcmVhdGVRTmFtZShkZWZpbml0aW9uLCBlbGVtZW50LmdldEF0dHJpYnV0ZSgiYmluZGluZyIpKTsKLSAgICAgIEJpbmRpbmcgbmV3QmluZGluZyA9IChiaW5kaW5nUU5hbWUgIT0gbnVsbCkgPyAoQmluZGluZykgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKGJpbmRpbmdRTmFtZSkgOiBudWxsOwotICAgICAgaWYgKG5ld0JpbmRpbmcgIT0gZ2V0RUJpbmRpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgc2V0RUJpbmRpbmcobmV3QmluZGluZyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLQotfSAvL1BvcnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Qb3J0VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM2Y2E5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0VHlwZUltcGwjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUG9ydFR5cGVJbXBsI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0VHlwZUltcGwjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0VHlwZUltcGwjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlBvcnRUeXBlSW1wbCNnZXRFT3BlcmF0aW9ucyA8ZW0+RU9wZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0VHlwZUltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBQb3J0VHlwZQotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWUgPSBRTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVU5ERUZJTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlZmluZWQgPSBVTkRFRklORURfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST1hZX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm94eSA9IFBST1hZX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlVVJJID0gUkVTT1VSQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFT3BlcmF0aW9ucygpIDxlbT5FT3BlcmF0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFT3BlcmF0aW9ucygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlT3BlcmF0aW9ucyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgUG9ydFR5cGVJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydFR5cGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkKLSAgewotICAgIHJldHVybiBxTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UU5hbWUoUU5hbWUgbmV3UU5hbWUpCi0gIHsKLSAgICBRTmFtZSBvbGRRTmFtZSA9IHFOYW1lOwotICAgIHFOYW1lID0gbmV3UU5hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19RTkFNRSwgb2xkUU5hbWUsIHFOYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kZWZpbmVkKCkKLSAgewotICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIG5ld1VuZGVmaW5lZCkKLSAgewotICAgIGJvb2xlYW4gb2xkVW5kZWZpbmVkID0gdW5kZWZpbmVkOwotICAgIHVuZGVmaW5lZCA9IG5ld1VuZGVmaW5lZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1VOREVGSU5FRCwgb2xkVW5kZWZpbmVkLCB1bmRlZmluZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gcHJveHk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5KGJvb2xlYW4gbmV3UHJveHkpCi0gIHsKLSAgICBib29sZWFuIG9sZFByb3h5ID0gcHJveHk7Ci0gICAgcHJveHkgPSBuZXdQcm94eTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1BST1hZLCBvbGRQcm94eSwgcHJveHkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlVVJJKFN0cmluZyBuZXdSZXNvdXJjZVVSSSkKLSAgewotICAgIFN0cmluZyBvbGRSZXNvdXJjZVVSSSA9IHJlc291cmNlVVJJOwotICAgIHJlc291cmNlVVJJID0gbmV3UmVzb3VyY2VVUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkksIG9sZFJlc291cmNlVVJJLCByZXNvdXJjZVVSSSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnMoKQotICB7Ci0gICAgaWYgKGVPcGVyYXRpb25zID09IG51bGwpCi0gICAgewotICAgICAgZU9wZXJhdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoT3BlcmF0aW9uLmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VPUEVSQVRJT05TKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVPcGVyYXRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhbiBvcGVyYXRpb24gdG8gdGhpcyBwb3J0IHR5cGUuCi0gICAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIG9wZXJhdGlvbiB0byBiZSBhZGRlZAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvbihqYXZheC53c2RsLk9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBpZiAoIW9wZXJhdGlvbi5pc1VuZGVmaW5lZCgpKQotICAgICAgZ2V0RU9wZXJhdGlvbnMoKS5hZGQob3BlcmF0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24uIE5vdGUgdGhhdCBvcGVyYXRpb24gbmFtZXMgY2FuCi0gICAqIGJlIG92ZXJsb2FkZWQgd2l0aGluIGEgUG9ydFR5cGUuIEluIGNhc2Ugb2Ygb3ZlcmxvYWRpbmcsIHRoZQotICAgKiBuYW1lcyBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBtZXNzYWdlcyBjYW4gYmUgdXNlZCB0byBmdXJ0aGVyCi0gICAqIHJlZmluZSB0aGUgc2VhcmNoLgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBvcGVyYXRpb24uCi0gICAqIEBwYXJhbSBpbnB1dE5hbWUgdGhlIG5hbWUgb2YgdGhlIGlucHV0IG1lc3NhZ2U7IGlmIHRoaXMgaXMgbnVsbAotICAgKiAgICAgICAgaXQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcGFyYW0gb3V0cHV0TmFtZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IG1lc3NhZ2U7IGlmIHRoaXMgaXMgbnVsbAotICAgKiAgICAgICAgaXQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiwgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogICAgICAgICBhbnkgbWF0Y2hpbmcgb3BlcmF0aW9uCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuT3BlcmF0aW9uIGdldE9wZXJhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGlucHV0TmFtZSwgU3RyaW5nIG91dHB1dE5hbWUpCi0gIHsKLSAgICBJdGVyYXRvciBvcEl0ZXJhdG9yID0gZ2V0T3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKG9wSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGphdmF4LndzZGwuT3BlcmF0aW9uIG9wID0gKGphdmF4LndzZGwuT3BlcmF0aW9uKSBvcEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChvcCA9PSBudWxsKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgU3RyaW5nIG9wTmFtZSA9IG9wLmdldE5hbWUoKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgb3BOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICghbmFtZS5lcXVhbHMob3BOYW1lKSkKLSAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuYW1lICE9IG51bGwgfHwgb3BOYW1lICE9IG51bGwpCi0gICAgICAgIG9wID0gbnVsbDsKLQotICAgICAgaWYgKG9wICE9IG51bGwgJiYgaW5wdXROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGphdmF4LndzZGwuSW5wdXQgaW5wdXQgPSBvcC5nZXRJbnB1dCgpOwotICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBvcElucHV0TmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICAgICAgICBpZiAob3BJbnB1dE5hbWUgPT0gbnVsbCB8fCAhb3BJbnB1dE5hbWUuZXF1YWxzKGlucHV0TmFtZSkpCi0gICAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIG9wID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgaWYgKG9wICE9IG51bGwgJiYgb3V0cHV0TmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBqYXZheC53c2RsLk91dHB1dCBvdXRwdXQgPSBvcC5nZXRPdXRwdXQoKTsKLSAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG9wT3V0cHV0TmFtZSA9IG91dHB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKG9wT3V0cHV0TmFtZSA9PSBudWxsIHx8ICFvcE91dHB1dE5hbWUuZXF1YWxzKG91dHB1dE5hbWUpKQotICAgICAgICAgICAgb3AgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvcCAhPSBudWxsKQotICAgICAgICByZXR1cm4gb3A7Ci0gICAgfSAvLyBlbmQgd2hpbGUKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYWxsIHRoZSBvcGVyYXRpb25zIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRPcGVyYXRpb25zKCkKLSAgewotICAgIGlmICghaXNVbmRlZmluZWQoKSkKLSAgICAgIHJldHVybiBnZXRFT3BlcmF0aW9ucygpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FT1BFUkFUSU9OUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVPcGVyYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIGlzVW5kZWZpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1BST1hZOgotICAgICAgICByZXR1cm4gaXNQcm94eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VPUEVSQVRJT05TOgotICAgICAgICByZXR1cm4gZ2V0RU9wZXJhdGlvbnMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1FOQU1FOgotICAgICAgICBzZXRRTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19QUk9YWToKLSAgICAgICAgc2V0UHJveHkoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHNldFJlc291cmNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRU9QRVJBVElPTlM6Ci0gICAgICAgIGdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RU9wZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19RTkFNRToKLSAgICAgICAgc2V0UU5hbWUoUU5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoVU5ERUZJTkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1BST1hZOgotICAgICAgICBzZXRQcm94eShQUk9YWV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHNldFJlc291cmNlVVJJKFJFU09VUkNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FT1BFUkFUSU9OUzoKLSAgICAgICAgZ2V0RU9wZXJhdGlvbnMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19RTkFNRToKLSAgICAgICAgcmV0dXJuIFFOQU1FX0VERUZBVUxUID09IG51bGwgPyBxTmFtZSAhPSBudWxsIDogIVFOQU1FX0VERUZBVUxULmVxdWFscyhxTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fVU5ERUZJTkVEOgotICAgICAgICByZXR1cm4gdW5kZWZpbmVkICE9IFVOREVGSU5FRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19QUk9YWToKLSAgICAgICAgcmV0dXJuIHByb3h5ICE9IFBST1hZX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVUkkgIT0gbnVsbCA6ICFSRVNPVVJDRV9VUklfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FT1BFUkFUSU9OUzoKLSAgICAgICAgcmV0dXJuIGVPcGVyYXRpb25zICE9IG51bGwgJiYgIWVPcGVyYXRpb25zLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAocU5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocU5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgdW5kZWZpbmVkOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHVuZGVmaW5lZCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBwcm94eTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChwcm94eSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCByZXNvdXJjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChyZXNvdXJjZVVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICBzZXRRTmFtZShxbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3dpdGNoIChXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGNoaWxkKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuT1BFUkFUSU9OIDoKLSAgICAgICAgewotICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgb3BlcmF0aW9uLnNldEVuY2xvc2luZ0RlZmluaXRpb24oZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICBvcGVyYXRpb24uc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgZ2V0RU9wZXJhdGlvbnMoKS5hZGQob3BlcmF0aW9uKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUodGhpcywgaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBnZXRMaXN0KGNvbXBvbmVudCwgbW9kZWxPYmplY3QpOwotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5yZW1vdmUobW9kZWxPYmplY3QpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgTGlzdCBnZXRMaXN0KE9iamVjdCBjb21wb25lbnQsIE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbnVsbDsKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIE9wZXJhdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgY29tcG9uZW50OwotCi0gICAgTGlzdCBsaXN0ID0gcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydFR5cGVfUU5hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5QT1JUX1RZUEUpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChPcGVyYXRpb25JbXBsKSBvcGVyYXRpb24pLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vUG9ydFR5cGVJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YmU4ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VydmljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlNlcnZpY2VJbXBsI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlNlcnZpY2VJbXBsI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5TZXJ2aWNlSW1wbCNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlNlcnZpY2VJbXBsI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5TZXJ2aWNlSW1wbCNnZXRFUG9ydHMgPGVtPkVQb3J0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VJbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU2VydmljZQotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWUgPSBRTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVU5ERUZJTkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVW5kZWZpbmVkKCkgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlZmluZWQgPSBVTkRFRklORURfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST1hZX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm94eSA9IFBST1hZX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlVVJJID0gUkVTT1VSQ0VfVVJJX0VERUZBVUxUOwotCi0gIHByaXZhdGUgTWFwIHBvcnRzOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUG9ydHMoKSA8ZW0+RVBvcnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVQb3J0cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlUG9ydHMgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2VJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHFOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRRTmFtZShRTmFtZSBuZXdRTmFtZSkKLSAgewotICAgIFFOYW1lIG9sZFFOYW1lID0gcU5hbWU7Ci0gICAgcU5hbWUgPSBuZXdRTmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5TRVJWSUNFX19RTkFNRSwgb2xkUU5hbWUsIHFOYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kZWZpbmVkKCkKLSAgewotICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIG5ld1VuZGVmaW5lZCkKLSAgewotICAgIGJvb2xlYW4gb2xkVW5kZWZpbmVkID0gdW5kZWZpbmVkOwotICAgIHVuZGVmaW5lZCA9IG5ld1VuZGVmaW5lZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5TRVJWSUNFX19VTkRFRklORUQsIG9sZFVuZGVmaW5lZCwgdW5kZWZpbmVkKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIHByb3h5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eShib29sZWFuIG5ld1Byb3h5KQotICB7Ci0gICAgYm9vbGVhbiBvbGRQcm94eSA9IHByb3h5OwotICAgIHByb3h5ID0gbmV3UHJveHk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuU0VSVklDRV9fUFJPWFksIG9sZFByb3h5LCBwcm94eSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVVJJKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVUkkoU3RyaW5nIG5ld1Jlc291cmNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZFJlc291cmNlVVJJID0gcmVzb3VyY2VVUkk7Ci0gICAgcmVzb3VyY2VVUkkgPSBuZXdSZXNvdXJjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5TRVJWSUNFX19SRVNPVVJDRV9VUkksIG9sZFJlc291cmNlVVJJLCByZXNvdXJjZVVSSSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RVBvcnRzKCkKLSAgewotICAgIGlmIChlUG9ydHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlUG9ydHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUG9ydC5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuU0VSVklDRV9fRVBPUlRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVQb3J0czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBwb3J0IHRvIHRoaXMgc2VydmljZS4KLSAgICogQHBhcmFtIHBvcnQgdGhlIHBvcnQgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQb3J0KGphdmF4LndzZGwuUG9ydCBwb3J0KQotICB7Ci0gICAgZ2V0RVBvcnRzKCkuYWRkKChQb3J0KXBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIHBvcnRzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldFBvcnRzKCkKLSAgewotICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RVBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBpLm5leHQoKTsKLSAgICAgIGhhc2hNYXAucHV0KHBvcnQuZ2V0TmFtZSgpLCBwb3J0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc2hNYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBzcGVjaWZpZWQgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgcG9ydC4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBwb3J0LCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgcG9ydAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlBvcnQgZ2V0UG9ydChTdHJpbmcgbmFtZSkKLSAgewotICAgIFBvcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFUG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGkubmV4dCgpOwotICAgICAgaWYgKG5hbWUuZXF1YWxzKHBvcnQuZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcG9ydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FUE9SVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFUG9ydHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiBpc1VuZGVmaW5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUFJPWFk6Ci0gICAgICAgIHJldHVybiBpc1Byb3h5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FUE9SVFM6Ci0gICAgICAgIHJldHVybiBnZXRFUG9ydHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1JFU09VUkNFX1VSSToKLSAgICAgICAgc2V0UmVzb3VyY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRVBPUlRTOgotICAgICAgICBnZXRFUG9ydHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFUG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKFFOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZChVTkRFRklORURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1BST1hZOgotICAgICAgICBzZXRQcm94eShQUk9YWV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSShSRVNPVVJDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VQT1JUUzoKLSAgICAgICAgZ2V0RVBvcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19RTkFNRToKLSAgICAgICAgcmV0dXJuIFFOQU1FX0VERUZBVUxUID09IG51bGwgPyBxTmFtZSAhPSBudWxsIDogIVFOQU1FX0VERUZBVUxULmVxdWFscyhxTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCAhPSBVTkRFRklORURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1BST1hZOgotICAgICAgICByZXR1cm4gcHJveHkgIT0gUFJPWFlfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVUkkgIT0gbnVsbCA6ICFSRVNPVVJDRV9VUklfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRVBPUlRTOgotICAgICAgICByZXR1cm4gZVBvcnRzICE9IG51bGwgJiYgIWVQb3J0cy5pc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHFOYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHFOYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHVuZGVmaW5lZDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1bmRlZmluZWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJveHk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJveHkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLQotICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICBzZXRRTmFtZShxbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3dpdGNoIChXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGNoaWxkKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuUE9SVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgKChXU0RMUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSkpLmdldFdTRExGYWN0b3J5KCkuY3JlYXRlUG9ydCgpOwotICAgICAgICAgIHBvcnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICAgIGdldEVQb3J0cygpLmFkZChwb3J0KTsKLSAgICAgICAgICBwb3J0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRE9DVU1FTlRBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgewotICAgICAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUoaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZW1vdmUoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gZ2V0TGlzdChtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LnJlbW92ZShtb2RlbE9iamVjdCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBMaXN0IGdldExpc3QoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBudWxsOwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFBvcnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0RVBvcnRzKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VfUU5hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5TRVJWSUNFKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFUG9ydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKFBvcnRJbXBsKSBwb3J0KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICBpdGVyYXRvciA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotfSAvL1NlcnZpY2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1R5cGVzSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9UeXBlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkOGIzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1R5cGVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLy9pbXBvcnQgY29tLmlibS53c2RsLmZhY3RvcnkuV1NETEZhY3RvcnlJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHlwZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlc0ltcGwgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBUeXBlcwotewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBUeXBlc0ltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0U2NoZW1hcygpCi0gIHsKLSAgICBMaXN0IGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IHhzZGVlID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgIGlmICh4c2RlZS5nZXRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBhcnJheUxpc3QuYWRkKHhzZGVlLmdldFNjaGVtYSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5TGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFNjaGVtYXMoU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIExpc3Qgc2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTY2hlbWFzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKSBpLm5leHQoKTsKLSAgICAgIGlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgIHNjaGVtYXMuYWRkKHNjaGVtYSk7Ci0gICAgfQotICAgIHJldHVybiBzY2hlbWFzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIHN1cGVyLmVOb3RpZnkobXNnKTsKLSAgICAKLSAgICAvLyBjcy4uIGlmIHdlJ3ZlIGFkZGVkIGFuIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBhbmQgdGhlIFR5cGVzIG9iamVjdCBpcyBhbHJlYWR5IGF0dGFjaGVkIAotICAgIC8vIHRvIGEgcmVzb3VyY2Ugd2UgbmVlZCB0byBzZXQgdGhlIHNjaGVtYUxvY2F0aW9uIGZvciB0aGUgaW5saW5lIHNjaGVtYS4KLSAgICAvLyBJZiBub3QgeWV0IGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UsIHRoZSBzY2hlbWFMb2NhdGlvbidzIHdpbGwgYmUgc2V0IHZpYSBXU0RMUmVzb3VyY2VJbXBsLmF0dGFjaGVkKEVPYmplY3QgbykKLSAgICAvLyAgICAgCi0gICAgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVuc2libGVFbGVtZW50X0VFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAmJgotICAgICAgICBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCkKLSAgICB7Ci0gICAgICBpZiAobXNnLmdldE5ld1ZhbHVlKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBlZSA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpbXNnLmdldE5ld1ZhbHVlKCk7Ci0gICAgICAgIGlmIChlZS5nZXRTY2hlbWEoKSAhPSBudWxsICYmIGVlLmdldFNjaGVtYSgpLmVSZXNvdXJjZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgZWUuZ2V0U2NoZW1hKCkuc2V0U2NoZW1hTG9jYXRpb24oZWUuZ2V0U2NoZW1hKCkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgfSAgCi0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGlmICgic2NoZW1hIi5lcXVhbHMoY2hpbGQuZ2V0TG9jYWxOYW1lKCkpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCB4c2RlZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgICB4c2RlZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIHhzZGVlLnNldEVsZW1lbnQoY2hpbGQpOyAvLyBjcyA6IHRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjcmVhdGluZyB0aGUgaW5saW5lIHNjaGVtYSAgICAgICAgICAgICAgIAotICAgICAgICBhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCh4c2RlZSk7ICAgICAgIAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUodGhpcywgaS5uZXh0KCkpOwotICAgIH0KLSAgICAoKERlZmluaXRpb25JbXBsKWdldEVuY2xvc2luZ0RlZmluaXRpb24oKSkucmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcykgY29tcG9uZW50OwotICAgIExpc3QgbGlzdCA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBsaXN0LnJlbW92ZShtb2RlbE9iamVjdCk7Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIFR5cGVzIHR5cGVzID0gKFR5cGVzKSBjb21wb25lbnQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5UWVBFUyk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIC8vIEFkZCBjaGlsZHJlbgotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0KLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLQotICAgIEl0ZXJhdG9yIGl0ZXIgPSBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICBFbGVtZW50IGVsID0gbnVsbDsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0gICAgICBlbCA9IGV4dGVuc2liaWxpdHkuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGVsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCByZVBhcmVudGVkID0gKEVsZW1lbnQpIGRvY3VtZW50LmltcG9ydE5vZGUoZWwsIHRydWUpOwotICAgICAgICAgIGV4dGVuc2liaWxpdHkuc2V0RWxlbWVudChyZVBhcmVudGVkKTsgLy8gcmVwbGFjZSB3aXRoIHRoZSBuZXcgb25lCi0gICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChyZVBhcmVudGVkKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRE9NRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAJRWxlbWVudCBjaGlsZCA9ICgoRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKWV4dGVuc2liaWxpdHkpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIAluZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotfSAvL1R5cGVzSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkZGQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwjZ2V0Q2hpbGRyZW4gPGVtPkNoaWxkcmVuPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudAotewotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoaWxkcmVuKCkgPGVtPkNoaWxkcmVuPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENoaWxkcmVuKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRUxpc3QgY2hpbGRyZW4gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwoKQotICAgIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gICAgewotICAgICAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgewotICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY2hpbGRyZW4gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fQ0hJTERSRU4pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gICAgewotICAgICAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOOgotICAgICAgICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpIGdldENoaWxkcmVuKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgICAgIHJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fQ0hJTERSRU46Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgICAgIHNldEVsZW1lbnRUeXBlKChRTmFtZSkgbmV3VmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19DSElMRFJFTjoKLSAgICAgICAgICAgIGdldENoaWxkcmVuKCkuY2xlYXIoKTsKLSAgICAgICAgICAgIGdldENoaWxkcmVuKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fQ0hJTERSRU46Ci0gICAgICAgICAgICBnZXRDaGlsZHJlbigpLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgICAgIHJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOOgotICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuICE9IG51bGwgJiYgIWNoaWxkcmVuLmlzRW1wdHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gICAgfQotCi0gICAgLy8gCi0gICAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgICAvLwotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gICAgewotICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsICYmICFpc1JlY29uY2lsaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RWxlbWVudCgpOiBQcmVzZXJ2aW5nIG9sZCBlbGVtZW50Iik7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc2V0RWxlbWVudEdlbihlbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLnJlY29uY2lsZUF0dHJpYnV0ZXMoKSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KCkiKTsKLSAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIGV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETy4uICB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIGNoaWxkIHNob3VsZCBnbyBpbiB0aGUgaW4gY3VycmVudCBsaXN0Ci0gICAgICAgIC8vIHNvIHRoYXQgaXQgZG9lc24ndCBhbHdheXMgZW5kIHVwIGdvaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgCi0gICAgICAgIC8vIChzaW5jZSBhIG5ldyBlbGVtZW50IG1pZ2h0IGJlIGFkZGVkIGF0IHRoZSBzdGFydCkKLSAgICAgICAgZ2V0Q2hpbGRyZW4oKS5hZGQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOyAgICAgICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gICAgewotICAgICAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdWVlID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgY29tcG9uZW50OwotICAgICAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVlZS5nZXRDaGlsZHJlbigpLnJlbW92ZShtb2RlbE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudCgpOwotICAgICAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLQotICAgICAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSAvLyBUaGlzIGlzIGFuIG9sZCBlbGVtZW50LgotICAgICAgICB7Ci0gICAgICAgICAgICBuZXdFbGVtZW50ID0gKEVsZW1lbnQpIGRvY3VtZW50LmltcG9ydE5vZGUoZWxlbWVudCwgdHJ1ZSk7Ci0gICAgICAgICAgICBlbGVtZW50ID0gbmV3RWxlbWVudDsKLSAgICAgICAgfSAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIFN0cmluZyBxdWFsaWZpZXIgPSBkZWZpbml0aW9uLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIChxdWFsaWZpZXIgPT0gbnVsbCA/ICIiIDogcXVhbGlmaWVyICsgIjoiKSArIGdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgcHJvcGVydGllcyA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gICAgewotICAgICAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGphdmEudXRpbC5NYXAuRW50cnkgZW50cnkgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IChqYXZhLnV0aWwuTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0gLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9XU0RMRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhN2FlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuV1NETEVsZW1lbnRJbXBsI2dldERvY3VtZW50YXRpb25FbGVtZW50IDxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5XU0RMRWxlbWVudEltcGwjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTRExFbGVtZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV1NETEVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIDxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldERvY3VtZW50YXRpb25FbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbGVtZW50IERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERvY3VtZW50YXRpb25FbGVtZW50KCkgPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRWxlbWVudCBkb2N1bWVudGF0aW9uRWxlbWVudCA9IERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnQoKSA8ZW0+RWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgRWxlbWVudCBFTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudCgpIDxlbT5FbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudCA9IEVMRU1FTlRfRURFRkFVTFQ7Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZ0RPTSA9IGZhbHNlOwotICBwcm90ZWN0ZWQgRUxpc3Qgd3NkbENvbnRlbnRzOwotCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBlbmNsb3NpbmdEZWZpbml0aW9uOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExFbGVtZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGdldERvY3VtZW50YXRpb25FbGVtZW50KCkKLSAgewotICAgIHJldHVybiBkb2N1bWVudGF0aW9uRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRWxlbWVudCBuZXdEb2N1bWVudGF0aW9uRWxlbWVudCkKLSAgewotICAgIEVsZW1lbnQgb2xkRG9jdW1lbnRhdGlvbkVsZW1lbnQgPSBkb2N1bWVudGF0aW9uRWxlbWVudDsKLSAgICBkb2N1bWVudGF0aW9uRWxlbWVudCA9IG5ld0RvY3VtZW50YXRpb25FbGVtZW50OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5ULCBvbGREb2N1bWVudGF0aW9uRWxlbWVudCwgZG9jdW1lbnRhdGlvbkVsZW1lbnQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudEdlbihFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBFbGVtZW50IG9sZEVsZW1lbnQgPSBlbGVtZW50OwotICAgIGVsZW1lbnQgPSBuZXdFbGVtZW50OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRUxFTUVOVCwgb2xkRWxlbWVudCwgZWxlbWVudCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBlbmNsb3NpbmdEZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5XU0RMX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5XU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5XU0RMX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKGRvY3VtZW50YXRpb25FbGVtZW50OiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGVsZW1lbnQ6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZWxlbWVudCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsYXRpb24gbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBXU0RMQ29udGVudHNFTGlzdCBleHRlbmRzIEVDb250ZW50c0VMaXN0Ci0gIHsKLSAgICBXU0RMQ29udGVudHNFTGlzdChFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGVTdHJ1Y3R1cmFsRmVhdHVyZXMpCi0gICAgewotICAgICAgc3VwZXIoZU9iamVjdCwgZVN0cnVjdHVyYWxGZWF0dXJlcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3RJdGVyYXRvciBuZXdMaXN0SXRlcmF0b3IoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgRmVhdHVyZUl0ZXJhdG9ySW1wbChlT2JqZWN0LCBlU3RydWN0dXJhbEZlYXR1cmVzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luY2x1ZGVkKEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUpCi0gICAgewotICAgICAgRVJlZmVyZW5jZSBlUmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGVTdHJ1Y3R1cmFsRmVhdHVyZTsKLSAgICAgIHJldHVybiAhZVJlZmVyZW5jZS5pc1RyYW5zaWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGJhc2ljTGlzdCgpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBXU0RMQ29udGVudHNFTGlzdChlT2JqZWN0LCBlU3RydWN0dXJhbEZlYXR1cmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgYmFzaWNJdGVyYXRvcigpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBGZWF0dXJlSXRlcmF0b3JJbXBsKGVPYmplY3QsIGVTdHJ1Y3R1cmFsRmVhdHVyZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmVhdHVyZUl0ZXJhdG9ySW1wbCBleHRlbmRzIEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvckltcGwKLSAgICB7Ci0gICAgICBwdWJsaWMgRmVhdHVyZUl0ZXJhdG9ySW1wbChFT2JqZWN0IGVPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyKGVPYmplY3QsIChFU3RydWN0dXJhbEZlYXR1cmVbXSkgKChCYXNpY0VMaXN0KSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkpLmRhdGEoKSk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBGZWF0dXJlSXRlcmF0b3JJbXBsKEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlW10gZVN0cnVjdHVyYWxGZWF0dXJlcykKLSAgICAgIHsKLSAgICAgICAgc3VwZXIoZU9iamVjdCwgZVN0cnVjdHVyYWxGZWF0dXJlcyk7Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW5jbHVkZWQoRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSkKLSAgICAgIHsKLSAgICAgICAgRVJlZmVyZW5jZSBlUmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGVTdHJ1Y3R1cmFsRmVhdHVyZTsKLSAgICAgICAgcmV0dXJuICFlUmVmZXJlbmNlLmlzVHJhbnNpZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVMaXN0IGdldFdTRExDb250ZW50cygpCi0gIHsKLSAgICBpZiAod3NkbENvbnRlbnRzID09IG51bGwpCi0gICAgewotICAgICAgd3NkbENvbnRlbnRzID0gbmV3IFdTRExDb250ZW50c0VMaXN0KHRoaXMsIChFU3RydWN0dXJhbEZlYXR1cmVbXSkgKChCYXNpY0VMaXN0KSBlQ2xhc3MoKS5nZXRFQWxsQ29udGFpbm1lbnRzKCkpLmRhdGEoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHdzZGxDb250ZW50czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgIHNldEVsZW1lbnRHZW4obnVsbCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGNvbnRlbnRzID0gZ2V0V1NETENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgY29udGVudHMuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgIFdTRExFbGVtZW50SW1wbCBjb250ZW50ID0gKFdTRExFbGVtZW50SW1wbCkgb2JqOwotICAgICAgICAgIGNvbnRlbnQuc2V0RWxlbWVudChudWxsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0RWxlbWVudEdlbihlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBlTm90aWZpY2F0aW9uUmVxdWlyZWQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBtc2cpCi0gIHsKLSAgICBpbnQgZXZlbnRUeXBlID0gbXNnLmdldEV2ZW50VHlwZSgpOwotICAgIE9iamVjdCBmZWF0dXJlID0gbXNnLmdldEZlYXR1cmUoKTsKLSAgICBPYmplY3Qgb2xkVmFsdWUgPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLSAgICBPYmplY3QgbmV3VmFsdWUgPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQotICAgIGlmIChlQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpLmNvbnRhaW5zKGZlYXR1cmUpKQotICAgIHsKLSAgICAgIEVSZWZlcmVuY2UgZVJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBmZWF0dXJlOwotICAgICAgaWYgKGZlYXR1cmUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fRU5hbWVzcGFjZXMoKSkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVOb3RpZnk6IG5hbWVzcGFjZXMiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVSZWZlcmVuY2UuaXNDb250YWlubWVudCgpICYmICFlUmVmZXJlbmNlLmlzVHJhbnNpZW50KCkpCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICAgICAgICAgICAgYWRvcHRDb250ZW50KGVSZWZlcmVuY2UsIChXU0RMRWxlbWVudCkgbmV3VmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG5ld1ZhbHVlcyA9ICgoQ29sbGVjdGlvbikgbmV3VmFsdWUpLml0ZXJhdG9yKCk7IG5ld1ZhbHVlcy5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCkgbmV3VmFsdWVzLm5leHQoKTsKLSAgICAgICAgICAgICAgYWRvcHRDb250ZW50KGVSZWZlcmVuY2UsIHdzZGxFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcnBoYW5Db250ZW50KGVSZWZlcmVuY2UsIChXU0RMRWxlbWVudCkgb2xkVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9sZFZhbHVlcyA9ICgoQ29sbGVjdGlvbikgb2xkVmFsdWUpLml0ZXJhdG9yKCk7IG9sZFZhbHVlcy5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KSBvbGRWYWx1ZXMubmV4dCgpOwotICAgICAgICAgICAgICBvcnBoYW5Db250ZW50KGVSZWZlcmVuY2UsIG9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uTU9WRSA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgbW92ZUNvbnRlbnQoZVJlZmVyZW5jZSwgKFdTRExFbGVtZW50KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uU0VUIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5VTlNFVCA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9ycGhhbkNvbnRlbnQoZVJlZmVyZW5jZSwgb2xkVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFkb3B0Q29udGVudChlUmVmZXJlbmNlLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChldmVudFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5NT1ZFIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5TRVQgOgotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlVOU0VUIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5jb250YWlucyhmZWF0dXJlKSkKLSAgICB7Ci0gICAgICBFQXR0cmlidXRlIGVBdHRyaWJ1dGUgPSAoRUF0dHJpYnV0ZSkgZmVhdHVyZTsKLSAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKQotICAgICAgewotICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLSAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uTU9WRSA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlNFVCA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlVOU0VUIDoKLSAgICAgICAgewotICAgICAgICAgIGNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5lTm90aWZ5KG1zZyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBvcnBoYW5Db250ZW50KEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwgT2JqZWN0IG9iaikKLSAgewotICAgIGlmICghaXNSZWNvbmNpbGluZykKLSAgICB7Ci0gICAgICBFbGVtZW50IHBhcmVudCA9IGdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICAgIHsKLSAgICAgIAlXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudClvYmo7Ci0gICAgICAgIEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSB3c2RsRWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIG5pY2VSZW1vdmVDaGlsZChjb250ZW50RWxlbWVudC5nZXRQYXJlbnROb2RlKCksIGNvbnRlbnRFbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIAk7Ly9TeXN0ZW0ub3V0LnByaW50bG4oIldTRExFbGVtZW50Lm9ycGhhbkNvbnRlbnQoKSwgT2JqZWN0IGlzOiAiICsgb2JqKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIG5pY2VSZW1vdmVDaGlsZChOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgZG9tIHdyaXRlYmFjayBhdm9pZGVkICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3JjZU5pY2VSZW1vdmVDaGlsZChwYXJlbnQsIGNoaWxkKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZm9yY2VOaWNlUmVtb3ZlQ2hpbGQoTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpCi0gIHsKLSAgICB1cGRhdGluZ0RPTSA9IHRydWU7Ci0KLSAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLQotLy8gU3lzdGVtLm91dC5wcmludGxuKCI/KiIpOwotICAgIE5vZGUgcHJldmlvdXMgPSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICBpZiAocHJldmlvdXMgIT0gbnVsbCAmJiBwcmV2aW91cy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotICAgIHsKLSAgICAgIFRleHQgdGV4dCA9IChUZXh0KXByZXZpb3VzOwotICAgICAgU3RyaW5nIGRhdGEgPSB0ZXh0LmdldERhdGEoKTsKLSAgICAgIGludCBpbmRleCA9IGRhdGEubGFzdEluZGV4T2YoJ1xuJyk7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGlmIChpbmRleCAtIDEgPiAwICYmIGRhdGEuY2hhckF0KGluZGV4IC0gMSkgPT0gJ1xyJykKLSAgICAgICAgewotLy9TeXN0ZW0ub3V0LnByaW50bG4oIjEqIik7Ci0gICAgICAgICAgdGV4dC5kZWxldGVEYXRhKGluZGV4IC0gMSwgZGF0YS5sZW5ndGgoKSAtIGluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0vL1N5c3RlbS5vdXQucHJpbnRsbigiMioiKTsKLSAgICAgICAgICB0ZXh0LmRlbGV0ZURhdGEoaW5kZXgsIGRhdGEubGVuZ3RoKCkgLSBpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJObyByZXR1cm4gYmVmb3JlISIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJObyB0ZXh0IG5vZGUgYmVmb3JlISIpOwotICAgIH0KLQotCi0gICAgaWYgKCFkb25lKQotICAgIHsKLSAgICAgIGZvciAoTm9kZSBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsgbmV4dCAhPSBudWxsOyBuZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpKQotICAgICAgewotICAgICAgICBpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgVGV4dCB0ZXh0ID0gKFRleHQpbmV4dDsKLSAgICAgICAgICBTdHJpbmcgZGF0YSA9IHRleHQuZ2V0RGF0YSgpOwotLyoKLSAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieHggIiArIGRhdGEubGVuZ3RoKCkgKyAiOjogIik7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aCgpOyArK2kpCi0gICAgICAgICAgewotICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiICsgSW50ZWdlci50b0hleFN0cmluZygoaW50KWRhdGEuY2hhckF0KGkpKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotKi8KLQotICAgICAgICAgIGludCBpbmRleCA9IGRhdGEuaW5kZXhPZignXG4nKTsKLSAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA8IGRhdGEubGVuZ3RoKCkgJiYgZGF0YS5jaGFyQXQoaW5kZXggKyAxKSA9PSAnXHInKQotICAgICAgICAgICAgewotICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiMyoiKTsKLSAgICAgICAgICAgICAgdGV4dC5kZWxldGVEYXRhKDAsIGluZGV4ICsgMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIjQqIik7Ci0gICAgICAgICAgICAgIHRleHQuZGVsZXRlRGF0YSgwLCBpbmRleCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHJldHVybiBhZnRlciEiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVtb3ZpbmcgZnJvbS0tLS0tLS0tXG4gICAgICIgKyBwYXJlbnQpOwotLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZW1vdmluZy0tLS0tLS0tXG4gICAgICIgKyBjaGlsZCk7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIAlwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCi0gICAgdXBkYXRpbmdET009ZmFsc2U7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgbW92ZUNvbnRlbnQoRVJlZmVyZW5jZSBlUmVmZXJlbmNlLCBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgZG9tIHdyaXRlYmFjayBhdm9pZGVkICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigibW92aW5nICIgKyB4c2RDb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgTm9kZSBwYXJlbnQgPSBnZXRBZG9wdGlvblBhcmVudE5vZGUoZVJlZmVyZW5jZSk7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSB3c2RsRWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoY2hpbGQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBjb250ZW50cyA9IGdldFdTRExDb250ZW50cygpOwotICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50cy5pbmRleE9mKHdzZGxFbGVtZW50KTsKLSAgICAgICAgbmljZVJlbW92ZUNoaWxkKHBhcmVudCwgY2hpbGQpOwotICAgICAgICBuaWNlSW5zZXJ0QmVmb3JlCi0gICAgICAgICAgKHBhcmVudCwgCi0gICAgICAgICAgICBjaGlsZCwgCi0gICAgICAgICAgICArK2luZGV4ID09IGNvbnRlbnRzLnNpemUoKSA/ICAKLSAgICAgICAgICAgICAgbnVsbCA6IAotICAgICAgICAgICAgICAoKFdTRExFbGVtZW50KWNvbnRlbnRzLmdldChpbmRleCkpLmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJtb3ZlZCAiICsgeHNkQ29uY3JldGVDb21wb25lbnQpOwotCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZG9wdENvbnRlbnQoRVJlZmVyZW5jZSBlUmVmZXJlbmNlLCBPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsKLSAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KSBvYmplY3Q7Ci0gICAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHsKLSAgICAgICAgaWYgKHdzZGxFbGVtZW50LmdldEVsZW1lbnQoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIHdzZGxFbGVtZW50KS5lbGVtZW50Q2hhbmdlZCh3c2RsRWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gd3NkbEVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgKGNoaWxkRWxlbWVudCA9PSBudWxsIHx8IGNoaWxkRWxlbWVudC5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwgJiYgY2hpbGRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSAhPSBnZXRFbGVtZW50KCkuZ2V0T3duZXJEb2N1bWVudCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdzZGxFbGVtZW50LnNldEVsZW1lbnQobnVsbCk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGhhbmRsZUVsZW1lbnRGb3JBZG9wdChlUmVmZXJlbmNlLCB3c2RsRWxlbWVudCk7Ci0gICAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIHdzZGxFbGVtZW50KS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIHdzZGxFbGVtZW50KS5hZG9wdEJ5KGRlZmluaXRpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBOb2RlIGdldEFkb3B0aW9uUGFyZW50Tm9kZShFUmVmZXJlbmNlIGVSZWZlcmVuY2UpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50Rm9yQWRvcHQoRVJlZmVyZW5jZSBlUmVmZXJlbmNlLCBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgeyAKLSAgICAvLyBFc3RhYmxpc2ggRE9NIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAKLSAgICAKLSAgICBOb2RlIGFkb3B0aW9uUGFyZW50ID0gZ2V0QWRvcHRpb25QYXJlbnROb2RlKGVSZWZlcmVuY2UpOwotICAgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gd3NkbEVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgIEVsZW1lbnQgcmVmZXJlbmNlZEVsZW1lbnQgPSBudWxsOwotICAgIAotICAgIGZvciAoSXRlcmF0b3IgY29udGVudHMgPSBnZXRXU0RMQ29udGVudHMoKS5pdGVyYXRvcigpOyBjb250ZW50cy5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBpZiAoY29udGVudHMubmV4dCgpID09IHdzZGxFbGVtZW50KQotICAgICAgewotICAgICAgICBpZiAoY29udGVudHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSAoKFdTRExFbGVtZW50KWNvbnRlbnRzLm5leHQoKSkuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIHdoaWxlIChyZWZlcmVuY2VkRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgcGFyZW50ID0gcmVmZXJlbmNlZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOyAKLSAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJlbnQgPT0gYWRvcHRpb25QYXJlbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50ID0gKEVsZW1lbnQpcGFyZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgCi0gICAgYm9vbGVhbiBpc05ldyA9IGZhbHNlOwotICAgIGlmIChjaGlsZEVsZW1lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAoKFdTRExFbGVtZW50SW1wbCl3c2RsRWxlbWVudCkuaXNSZWNvbmNpbGluZyA9IHRydWU7Ci0gICAgICBjaGlsZEVsZW1lbnQgPSAoKFdTRExFbGVtZW50SW1wbCl3c2RsRWxlbWVudCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgKChXU0RMRWxlbWVudEltcGwpd3NkbEVsZW1lbnQpLmlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgIGlzTmV3ID0gdHJ1ZTsKLSAgICAgIGlmIChjaGlsZEVsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJub3QgY3JlYXRlZCEgIiArIHdzZGxFbGVtZW50KTsKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIGlzQXR0YWNoZWQgPSBmYWxzZTsKLSAgICBmb3IgKE5vZGUgcm9vdERvY3VtZW50ID0gY2hpbGRFbGVtZW50OyByb290RG9jdW1lbnQgIT0gbnVsbDsgcm9vdERvY3VtZW50ID0gcm9vdERvY3VtZW50LmdldFBhcmVudE5vZGUoKSkKLSAgICB7Ci0gICAgICBpZiAoV1NETENvbnN0YW50cy5ub2RlVHlwZShyb290RG9jdW1lbnQpID09IFdTRExDb25zdGFudHMuREVGSU5JVElPTikKLSAgICAgIHsKLSAgICAgICAgaXNBdHRhY2hlZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoIWlzQXR0YWNoZWQpCi0gICAgewotICAgICAgaWYgKHJlZmVyZW5jZWRFbGVtZW50ID09IG51bGwgJiYgCi0gICAgICAgICAgIWVSZWZlcmVuY2UuaXNNYW55KCkpCi0gICAgewotICAgICAgZm9yIChOb2RlIGNoaWxkID0gYWRvcHRpb25QYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSAoRWxlbWVudCljaGlsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAgIC8vcmVmZXJlbmNlZEVsZW1lbnQgPSBjb21wdXRlVG9wTGV2ZWxSZWZDaGlsZChhZG9wdGlvblBhcmVudCxjaGlsZEVsZW1lbnQpOyAgICAgCi0gICAgICBuaWNlSW5zZXJ0QmVmb3JlKGFkb3B0aW9uUGFyZW50LCBjaGlsZEVsZW1lbnQsIHJlZmVyZW5jZWRFbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBuaWNlSW5zZXJ0QmVmb3JlKE5vZGUgcGFyZW50LCBOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZmVyZW5jZUNoaWxkKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGN5Y2xpYyBkb20gd3JpdGViYWNrIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yY2VOaWNlSW5zZXJ0QmVmb3JlKHBhcmVudCwgbmV3Q2hpbGQsIHJlZmVyZW5jZUNoaWxkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGZvcmNlTmljZUluc2VydEJlZm9yZShOb2RlIHBhcmVudCwgTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZlcmVuY2VDaGlsZCkKLSAgewotICAgIHVwZGF0aW5nRE9NID0gdHJ1ZTsKLQotICAgIExPT1A6Ci0gICAgZm9yIChOb2RlIGNoaWxkID0gcmVmZXJlbmNlQ2hpbGQgPT0gbnVsbCA/IHBhcmVudC5nZXRMYXN0Q2hpbGQoKSA6IHJlZmVyZW5jZUNoaWxkLmdldFByZXZpb3VzU2libGluZygpOyAKLSAgICAgICAgIGNoaWxkICE9IG51bGw7IAotICAgICAgICAgY2hpbGQgPSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGNoaWxkLmdldE5vZGVUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6Ci0gICAgICAgIHsKLSAgICAgICAgICBUZXh0IHRleHQgPSAoVGV4dCljaGlsZDsKLSAgICAgICAgICBTdHJpbmcgZGF0YSA9IHRleHQuZ2V0RGF0YSgpOwotCi0vKgotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInh4ICIgKyBkYXRhLmxlbmd0aCgpICsgIjo6ICIpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGgoKTsgKytpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiICsgSW50ZWdlci50b0hleFN0cmluZygoaW50KWRhdGEuY2hhckF0KGkpKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotKi8KLQotICAgICAgICAgIGludCBpbmRleCA9IGRhdGEubGFzdEluZGV4T2YoJ1xuJyk7Ci0gICAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICAgIHsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW4gaGVyZSIpOwotCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgZm9yIChOb2RlIGFuY2VzdG9yID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsgCi0gICAgICAgICAgICAgICAgIGFuY2VzdG9yICE9IG51bGwgJiYgYW5jZXN0b3IuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREU7IAotICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLmdldFBhcmVudE5vZGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW5kZW50LmFwcGVuZCgiICAgICIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaW5kZXggKyAxIDwgZGF0YS5sZW5ndGgoKSAmJiBkYXRhLmNoYXJBdChpbmRleCArIDEpID09ICdccicpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZXh0LnJlcGxhY2VEYXRhKGluZGV4ICsgMSwgZGF0YS5sZW5ndGgoKSAtIGluZGV4IC0gMSwgaW5kZW50ICsgIiAgICAiKTsKLQotICAgICAgICAgICAgLy8gc2V0Q29ycmVjdEluZGVudGF0aW9uKGluZGVudCwgbmV3VGV4dCk7Ci0gICAgICAgICAgICBpZiAocmVmZXJlbmNlQ2hpbGQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW5kZW50LmFwcGVuZCgiICAgICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGV4dCBuZXdUZXh0ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG4iICsgaW5kZW50KTsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zZXJ0ZWQuLi4iICsgbmV3VGV4dCk7Ci0gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1RleHQsIHJlZmVyZW5jZUNoaWxkKTsKLSAgICAgICAgICAgIHJlZmVyZW5jZUNoaWxkID0gbmV3VGV4dDsKLSAgICAgICAgICAgIGJyZWFrIExPT1A7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gCi0gICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0gICAgICAgIHsKLSAgICAgICAgICBicmVhayBMT09QOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIkluc2VydGVkLi4uIiArIG5ld0NoaWxkKTsKLSAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCByZWZlcmVuY2VDaGlsZCk7Ci0KLSAgICB1cGRhdGluZ0RPTSA9IGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY29tcHV0ZVRvcExldmVsUmVmQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5vZGVUb0FkZCkKLSAgewotICAJRWxlbWVudCByZXN1bHQgPSBudWxsOwotICAgIGludCBhID0gZ2V0UHJlY2VkZW5jZShub2RlVG9BZGQpOwotICAgICAgCQotICAgIGZvciAoTm9kZSBub2RlID0gcGFyZW50Tm9kZS5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICB7Ci0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotCQkgICAgaW50IGIgPSBnZXRQcmVjZWRlbmNlKG5vZGUpOwotCQkgICAgaWYgKGIgPj0gYSkKLQkJICAgIHsKLQkJICAgICAgcmVzdWx0ID0gKEVsZW1lbnQpbm9kZTsJCi0JICAgICAgICBicmVhazsJICAgIAotCQkgICAgfSAgICAgICAgCi0gICAgICB9IAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwcml2YXRlIEhhc2hNYXAgcHJlY2VkZW5jZU1hcCA9IGNyZWF0ZVByZWNlZGVuY2VNYXAoKTsKLQotICBwcml2YXRlIGludCBnZXRQcmVjZWRlbmNlKE5vZGUgbm9kZSkKLSAgewotICAJaW50IHJlc3VsdCA9IDI7Ci0gIAlTdHJpbmcgbG9jYWxOYW1lID0gbm9kZS5nZXRMb2NhbE5hbWUoKTsKLSAgCWlmIChsb2NhbE5hbWUgIT0gbnVsbCkKLSAgCXsgIAkKLSAgICAgIEludGVnZXIgaW50ZWdlciA9IChJbnRlZ2VyKXByZWNlZGVuY2VNYXAuZ2V0KGxvY2FsTmFtZSk7Ci0gICAgICBpZiAoaW50ZWdlciAhPSBudWxsKQotICAgICAgeyAgICAgIAotICAgICAgICByZXN1bHQgPSBpbnRlZ2VyLmludFZhbHVlKCk7Ci0gICAgICB9Ci0gIAl9Ci0gIAlyZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgCi0gIHByaXZhdGUgSGFzaE1hcCBjcmVhdGVQcmVjZWRlbmNlTWFwKCkKLQl7Ci0JCUhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoMSkpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLklNUE9SVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoMykpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLlRZUEVTX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig0KSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuTUVTU0FHRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoNSkpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoNikpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLkJJTkRJTkdfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDcpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5TRVJWSUNFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig4KSk7Ci0JCXJldHVybiBoYXNoTWFwOwotCX0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZG9wdEJ5KERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIGZvciAoSXRlcmF0b3IgY29tcG9uZW50cyA9IGdldFdTRExDb250ZW50cygpLml0ZXJhdG9yKCk7IGNvbXBvbmVudHMuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3QgY2hpbGQgPSBjb21wb25lbnRzLm5leHQoKTsKLSAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkKLSAgICAgIHsKLSAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIGNoaWxkKS5hZG9wdEJ5KGRlZmluaXRpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRpbmdET00oKQotICB7Ci0gICAgcmV0dXJuIHVwZGF0aW5nRE9NOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIGlmICghaXNVcGRhdGluZ0RPTSgpKQotICAgIHsKLSAgICAgIGlmICghaXNSZWNvbmNpbGluZykKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY2hhbmdlRm9yICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICBpc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgICAgcmVjb25jaWxlKGNoYW5nZWRFbGVtZW50KTsKLQotICAgICAgICBXU0RMRWxlbWVudCB0aGVDb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKHRoZUNvbnRhaW5lciAhPSBudWxsICYmIHRoZUNvbnRhaW5lci5nZXRFbGVtZW50KCkgPT0gY2hhbmdlZEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFdTRExFbGVtZW50SW1wbCkgdGhlQ29udGFpbmVyKS5lbGVtZW50Q2hhbmdlZChjaGFuZ2VkRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpc1JlY29uY2lsaW5nID0gZmFsc2U7Ci0gICAgICAgIHRyYXZlcnNlVG9Sb290Rm9yUGF0Y2hpbmcoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgOyAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgaW50ZXJuYWwgcmVjb25jaWxlIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICA7IC8vU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGN5Y2xpYyBET00gcmVjb25jaWxlIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKiBUT0RPLi4uIHJlbW92ZSB0aGlzIG1ldGhvZCEKLSAgICovCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgcmV0dXJuIGdldFdTRExDb250ZW50cygpOwotICB9Ci0KLSAgLyoKLSAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0RWxlbWVudEZvck1vZGVsT2JqZWN0KE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIEVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChFbGVtZW50KSBtb2RlbE9iamVjdDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKFdTRExFbGVtZW50KSBtb2RlbE9iamVjdCkuZ2V0RWxlbWVudCgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICovCi0KLSAgcHJpdmF0ZSBDb2xsZWN0aW9uIGdldENvbnRlbnROb2RlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChOb2RlIGNoaWxkID0gY2hhbmdlZEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0gICAgewotICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hZGQoY2hpbGQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gU29tZSBzdWJjbGFzc2VzIHVzZSB0aGlzIG1ldGhvZAotICBwcm90ZWN0ZWQgUU5hbWUgY3JlYXRlUU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgcHJlZml4ZWROYW1lKQotICB7Ci0gICAgUU5hbWUgcW5hbWUgPSBudWxsOwotICAgIGlmIChwcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSBwcmVmaXhlZE5hbWUuaW5kZXhPZigiOiIpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IChpbmRleCA9PSAtMSkgPyAiIiA6IHByZWZpeGVkTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlKHByZWZpeCk7Ci0gICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBwcmVmaXhlZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgIHFuYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxQYXJ0KTsgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBxbmFtZTsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudChib29sZWFuIGRlZXApCi0gIHsKLSAgICBpZiAoZGVlcCB8fCBnZXRFbGVtZW50KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFbGVtZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjaGFuZ2VBdHRyaWJ1dGUobnVsbCk7Ci0gICAgICBjaGFuZ2VSZWZlcmVuY2UobnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudCgpCi0gIHsKLSAgICBpZiAoZ2V0RWxlbWVudCgpID09IG51bGwpCi0gICAgewotICAgICAgaXNSZWNvbmNpbGluZyA9IHRydWU7Ci0gICAgICBjcmVhdGVFbGVtZW50KCk7Ci0gICAgICBpc1JlY29uY2lsaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgY2hhbmdlQXR0cmlidXRlKG51bGwpOwotICAgIGNoYW5nZVJlZmVyZW5jZShudWxsKTsKLQotICAgIE9iamVjdCBvYmogPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgY29udGFpbm1lbnRzID0gZUNsYXNzKCkuZ2V0RUFsbENvbnRhaW5tZW50cygpLml0ZXJhdG9yKCk7IGNvbnRhaW5tZW50cy5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEVSZWZlcmVuY2UgZVJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBjb250YWlubWVudHMubmV4dCgpOwotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50X1NjaGVtYSgpKQotICAgICAgewotICAgICAgICAvLyBUQkQgLSBUaGlzIGlzIGFuIGluc3RhbmNlIG9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGFuZAotICAgICAgICAvLyBlUmVmZXJuY2UgaXMgWFNEU2NoZW1hLiBXaGF0IGRvIHdlIHdhbnQgdG8gZG8gZm9yIHVwZGF0ZT8KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCFlUmVmZXJlbmNlLmlzVHJhbnNpZW50KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChlUmVmZXJlbmNlLmlzTWFueSgpKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBvYmplY3RzID0gKChDb2xsZWN0aW9uKSBlR2V0KGVSZWZlcmVuY2UpKS5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgb2JqID0gb2JqZWN0cy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkgfHwgb2JqID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFNraXAgaXQuIFByb2JhYmx5IHRoaXMgaXMgTmFtZXNwYWNlLgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCkgb2JqOwotICAgICAgICAgICAgICAvL2hhbmRsZUVsZW1lbnRGb3JBZG9wdChlUmVmZXJlbmNlLCB3c2RsRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAoKFdTRExFbGVtZW50SW1wbCkgd3NkbEVsZW1lbnQpLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIGVHZXQoZVJlZmVyZW5jZSk7Ci0gICAgICAgICAgaWYgKHdzZGxFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy9oYW5kbGVFbGVtZW50Rm9yQWRvcHQoZVJlZmVyZW5jZSwgIHdzZGxFbGVtZW50KTsKLSAgICAgICAgICAgICAoKFdTRExFbGVtZW50SW1wbCkgd3NkbEVsZW1lbnQpLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gLy8gZW5kIGVsc2UgaWYKLSAgICB9IC8vIGVuZCBmb3IKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETEVsZW1lbnRfRWxlbWVudCgpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwgJiYgIWlzUmVjb25jaWxpbmcpCi0gICAgICB7Ci0gICAgICAgIGZvciAoTm9kZSByb290RG9jdW1lbnQgPSB0aGVFbGVtZW50LmdldFBhcmVudE5vZGUoKTsgcm9vdERvY3VtZW50ICE9IG51bGw7IHJvb3REb2N1bWVudCA9IHJvb3REb2N1bWVudC5nZXRQYXJlbnROb2RlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocm9vdERvY3VtZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgICAgICAgaWYgKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZWNvbmNpbGVBdHRyaWJ1dGVzKGdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVjb25jaWxlKGdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgdHJhdmVyc2VUb1Jvb3RGb3JQYXRjaGluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB0cmF2ZXJzZVRvUm9vdEZvclBhdGNoaW5nKCkKLSAgewotICAgIGlmICghaXNSZWNvbmNpbGluZykKLSAgICB7Ci0gICAgICBXU0RMRWxlbWVudEltcGwgY29udGFpbmVyID0gKFdTRExFbGVtZW50SW1wbClnZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29udGFpbmVyLnRyYXZlcnNlVG9Sb290Rm9yUGF0Y2hpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWNvbmNpbGUoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHJlY29uY2lsZUF0dHJpYnV0ZXMoY2hhbmdlZEVsZW1lbnQpOwotICAgIHJlY29uY2lsZUNvbnRlbnRzKGNoYW5nZWRFbGVtZW50KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVjb25jaWxlQ29udGVudHMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIExpc3QgcmVtYWluaW5nTW9kZWxPYmplY3RzID0gbmV3IEFycmF5TGlzdChnZXRXU0RMQ29udGVudHMoKSk7Ci0KLSAgICBDb2xsZWN0aW9uIGNvbnRlbnROb2RlcyA9IGdldENvbnRlbnROb2RlcyhjaGFuZ2VkRWxlbWVudCk7Ci0KLSAgICBFbGVtZW50IHRoZURvY3VtZW50YXRpb25FbGVtZW50ID0gbnVsbDsKLSAgICAKLSAgICAvLyBmb3IgZWFjaCBhcHBsaWNhYmxlIGNoaWxkIG5vZGUgb2YgY2hhbmdlZEVsZW1lbnQKLSAgICBMT09QIDogZm9yIChJdGVyYXRvciBpID0gY29udGVudE5vZGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKEVsZW1lbnQpIGkubmV4dCgpOwotICAgICAgLy8gU2V0IERvY3VtZW50YXRpb24gZWxlbWVudCBpZiBleGlzdHMKLSAgICAgIGlmIChXU0RMQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcuZXF1YWxzKGNoaWxkLmdldExvY2FsTmFtZSgpKSAmJgotICAgICAgICAgIFdTRExDb25zdGFudHMuaXNNYXRjaGluZ05hbWVzcGFjZShjaGlsZC5nZXROYW1lc3BhY2VVUkkoKSwgV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpKQotICAgICAgewotICAgICAgICAvLyBhc3N1bWUgdGhlIGZpcnN0ICdkb2N1bWVudGF0aW9uJyBlbGVtZW50IGlzICd0aGUnIGRvY3VtZW50YXRpb24gZWxlbWVudAotICAgICAgICAvLyAndGhlcmUgY2FuIGJlIG9ubHkgb25lIScKLSAgICAgICAgaWYgKHRoZURvY3VtZW50YXRpb25FbGVtZW50ID09IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIHRoZURvY3VtZW50YXRpb25FbGVtZW50ID0gY2hpbGQ7Ci0gICAgICAgIH0gICAKLSAgICAgIH0gCi0gICAgICAvLyBnbyB0aHJ1IHRoZSBtb2RlbCBvYmplY3RzIHRvIGNvbGxlY3QgbWF0Y2hpbmcgb2JqZWN0IGZvciByZXVzZQotICAgICAgZm9yIChJdGVyYXRvciBjb250ZW50cyA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBjb250ZW50cy5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSAoT2JqZWN0KSBjb250ZW50cy5uZXh0KCk7Ci0gICAgICAgIGlmICgoKFdTRExFbGVtZW50KSBtb2RlbE9iamVjdCkuZ2V0RWxlbWVudCgpID09IGNoaWxkKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGVudHMucmVtb3ZlKCk7IC8vIHJlbW92ZXMgdGhlICdjaGlsZCcgTm9kZSBmcm9tIHRoZSByZW1haW5pbmdNb2RlbE9iamVjdHMgbGlzdAotICAgICAgICAgIGNvbnRpbnVlIExPT1A7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gaWYgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudCBoYXMgY2hhbmdlZC4uLiB1cGRhdGUgaXQKLSAgICAgIC8vCi0gICAgICBpZiAodGhlRG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSkKLSAgICAgIHsKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGhlRG9jdW1lbnRhdGlvbkVsZW1lbnQpOyAgCi0gICAgICB9ICAKLSAgICAgIAotICAgICAgLy8gd2UgaGF2ZW4ndCBmb3VuZCBhIG1hdGNoaW5nIG1vZGVsIG9iamVjdCBmb3IgdGhlIE5vZGUsIHNlIHdlIG1heSBuZWVkIHRvCi0gICAgICAvLyBjcmVhdGUgYSBuZXcgbW9kZWwgb2JqZWN0Ci0gICAgICBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLCByZW1haW5pbmdNb2RlbE9iamVjdHMpOwotICAgIH0KLQotICAgIC8vIG5vdyB3ZSBjYW4gcmVtb3ZlIHRoZSByZW1haW5pbmcgbW9kZWwgb2JqZWN0cwotICAgIGhhbmRsZVJlY29uY2lsaWF0aW9uKHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldEVuY2xvc2luZ0RlZmluaXRpb24oKQotICB7Ci0gICAgaWYgKGVuY2xvc2luZ0RlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHJldHVybiBlbmNsb3NpbmdEZWZpbml0aW9uOwotCi0gICAgLy8gVEJEIC0gUmV2aXNpdAotICAgIC8vRU9iamVjdCBjID0gZUNvbnRhaWVyKCk7IGMgIT0gbnVsbDsgYyA9IGMuZUNvbnRhaW50ZXIoKSkKLSAgICAvL3sKLQotICAgIGZvciAoV1NETEVsZW1lbnQgY29udGFpbmVyID0gdGhpczsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9ICgoV1NETEVsZW1lbnRJbXBsKSBjb250YWluZXIpLmdldENvbnRhaW5lcigpKQotICAgIHsKLSAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBlbmNsb3NpbmdEZWZpbml0aW9uID0gKERlZmluaXRpb24pIGNvbnRhaW5lcjsKLSAgICAgICAgcmV0dXJuIGVuY2xvc2luZ0RlZmluaXRpb247Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKgotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRSb290RW5jbG9zaW5nRGVmaW5pdGlvbigpCi0gIHsKLSAgICBpZiAoZW5jbG9zaW5nRGVmaW5pdGlvbiA9PSBudWxsKQotICAgICB7Ci0gICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IGVSZXNvdXJjZSgpOwotICAgICAgTGlzdCBjb250ZW50cyA9IHJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0gICAgICBpZiAoY29udGVudHMuc2l6ZSgpID09IDEgCi0gICAgICAgICAgJiYgY29udGVudHMuZ2V0KDApIGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLSAgICAgICAgZW5jbG9zaW5nRGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKWNvbnRlbnRzLmdldCgwKTsKLSAgICB9IAotICAgIHJldHVybiBlbmNsb3NpbmdEZWZpbml0aW9uOwotICB9Ci0gICovCi0KLSAgcHVibGljIFdTRExFbGVtZW50IGdldENvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgV1NETEVsZW1lbnQgPyAoV1NETEVsZW1lbnQpIGVDb250YWluZXIoKSA6IG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBuaWNlU2V0QXR0cmlidXRlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIGRvbSBhdHRyaWJ1dGUgd3JpdGViYWNrIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlTlMobnVsbCwgYXR0cmlidXRlKSkKLSAgICAgIHsKLSAgICAgICAgdXBkYXRpbmdET00gPSB0cnVlOwotICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotICAgICAgICB1cGRhdGluZ0RPTSA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGVOUyhudWxsLCBhdHRyaWJ1dGUpIHx8ICFlbGVtZW50LmdldEF0dHJpYnV0ZU5TKG51bGwsIGF0dHJpYnV0ZSkuZXF1YWxzKHZhbHVlKSkKLSAgICB7Ci0gICAgICB1cGRhdGluZ0RPTSA9IHRydWU7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIGF0dHJpYnV0ZSwgdmFsdWUpOwotICAgICAgdXBkYXRpbmdET00gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIG5pY2VDcmVhdGVOYW1lc3BhY2VBdHRyaWJ1dGUoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgdW5pcXVlIHByZWZpeCBmb3IgIm5hbWVzcGFjZS4iCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdXJpTGlzdCkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgZG9tIGF0dHJpYnV0ZSB3cml0ZWJhY2sgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAodXJpTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0aW5nRE9NID0gdHJ1ZTsKLSAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0gICAgICB1cGRhdGluZ0RPTSA9IGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih1cmlMaXN0LCAiICIpOyBzdHJpbmdUb2tlbml6ZXIuaGFzTW9yZUVsZW1lbnRzKCk7KQotICAgICAgewotICAgICAgICBTdHJpbmcgdXJpID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHVyaTsKLSAgICAgICAgaW50IGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCIjIik7Ci0gICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpbmRleCA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZXNwYWNlID0gdXJpLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGxvY2FsTmFtZSA9IHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcXVhbGlmaWVyID0gWFNEQ29uc3RhbnRzLmxvb2t1cFF1YWxpZmllcihlbGVtZW50LCBuYW1lc3BhY2UpOwotICAgICAgICBpZiAocXVhbGlmaWVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBxdWFsaWZpZXIgPSBuaWNlQ3JlYXRlTmFtZXNwYWNlQXR0cmlidXRlKG5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcU5hbWUgPSBxdWFsaWZpZXIgPT0gbnVsbCB8fCBxdWFsaWZpZXIubGVuZ3RoKCkgPT0gMCA/IGxvY2FsTmFtZSA6IHF1YWxpZmllciArICI6IiArIGxvY2FsTmFtZTsKLQotICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlLmFwcGVuZCgnICcpOwotICAgICAgICB9Ci0gICAgICAgIHZhbHVlLmFwcGVuZChxTmFtZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGVOUyhudWxsLCBhdHRyaWJ1dGUpIHx8ICFlbGVtZW50LmdldEF0dHJpYnV0ZU5TKG51bGwsIGF0dHJpYnV0ZSkuZXF1YWxzKHZhbHVlLnRvU3RyaW5nKCkpKQotICAgICAgewotICAgICAgICB1cGRhdGluZ0RPTSA9IHRydWU7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgYXR0cmlidXRlLCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgdXBkYXRpbmdET00gPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkgLy8gU2hvdWxkIEkgbWFrZSB0aGlzIGFic3RyYWN0PwotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgRWxlbWVudCBjcmVhdGVFbGVtZW50KGludCBub2RlVHlwZSkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBEZWZpbml0aW9uKQotICAgICAgZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSB0aGlzOwotICAgIGVsc2UKLSAgICAgIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0KLSAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLQotICAgIC8vIFJldHJpZXZlIHRoZSBuYW1lc3BhY2UgcHJlZml4IGZvciB0aGUgV1NETCBuYW1lc3BhY2UKLSAgICBTdHJpbmcgd3NkbE5hbWVzcGFjZSA9IFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJOwotICAgIFN0cmluZyBxdWFsaWZpZXIgPSBkZWZpbml0aW9uLmdldFByZWZpeCh3c2RsTmFtZXNwYWNlKTsKLQotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh3c2RsTmFtZXNwYWNlLCAocXVhbGlmaWVyID09IG51bGwgPyAiIiA6IHF1YWxpZmllciArICI6IikgKyBXU0RMQ29uc3RhbnRzLkVMRU1FTlRfVEFHU1tub2RlVHlwZV0pOwotCi0gICAgaWYgKGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpID09IG51bGwpCi0gICAgICBkb2N1bWVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTsKLQotICAgIGlmIChnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpICE9IG51bGwpCi0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmltcG9ydE5vZGUoZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgdHJ1ZSkpOwotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChkZWVwKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgY29udGVudHMgPSBnZXRXU0RMQ29udGVudHMoKS5pdGVyYXRvcigpOyBjb250ZW50cy5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgY29udGVudCA9IGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBXU0RMRWxlbWVudEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBXU0RMRWxlbWVudEltcGwgZWxlbWVudCA9IChXU0RMRWxlbWVudEltcGwpIGNvbnRlbnQ7Ci0gICAgICAgICAgZWxlbWVudC5pc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgICAgICBlbGVtZW50LnJlY29uY2lsZVJlZmVyZW5jZXModHJ1ZSk7Ci0gICAgICAgICAgZWxlbWVudC5pc1JlY29uY2lsaW5nID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRCZXN0V1NETEVsZW1lbnQoTGlzdCBlbGVtZW50UGF0aCkKLSAgewotICAgIFdTRExFbGVtZW50IHJlc3VsdCA9IHRoaXM7Ci0gICAgZm9yIChJdGVyYXRvciBjb21wb25lbnRzID0gZ2V0V1NETENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgY29tcG9uZW50cy5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBXU0RMRWxlbWVudEltcGwgY2hpbGRXU0RMRWxlbWVudCA9IChXU0RMRWxlbWVudEltcGwpY29tcG9uZW50cy5uZXh0KCk7Ci0gICAgICBpZiAoZWxlbWVudFBhdGguY29udGFpbnMoY2hpbGRXU0RMRWxlbWVudC5nZXRFbGVtZW50KCkpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBjaGlsZFdTRExFbGVtZW50OwotICAgICAgICBXU0RMRWxlbWVudCBiZXR0ZXJXU0RMRWxlbWVudCA9IGNoaWxkV1NETEVsZW1lbnQuZ2V0QmVzdFdTRExFbGVtZW50KGVsZW1lbnRQYXRoKTsKLSAgICAgICAgaWYgKGJldHRlcldTRExFbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBiZXR0ZXJXU0RMRWxlbWVudDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY29uc2lkZXJBbGxDb250YWluc0ZvckJlc3RXU0RMRWxlbWVudCgpKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY29uc2lkZXJBbGxDb250YWluc0ZvckJlc3RXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gICAgcHVibGljIHZvaWQgZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBpZiAoIWlzVXBkYXRpbmdET00oKSkKLSAgICB7Ci0gICAgICBpZiAoIWlzUmVjb25jaWxpbmcpCi0gICAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjaGFuZ2VGb3IgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgCi0gICAgICAgIGlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgICByZWNvbmNpbGVBdHRyaWJ1dGVzKGNoYW5nZWRFbGVtZW50KTsKLQotICAgICAgICBXU0RMRWxlbWVudEltcGwgdGhlQ29udGFpbmVyID0gKFdTRExFbGVtZW50SW1wbClnZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKHRoZUNvbnRhaW5lciAhPSBudWxsICYmIHRoZUNvbnRhaW5lci5nZXRFbGVtZW50KCkgPT0gY2hhbmdlZEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICB0aGVDb250YWluZXIuZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKGNoYW5nZWRFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgdHJhdmVyc2VUb1Jvb3RGb3JQYXRjaGluZygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIGludGVybmFsIHJlY29uY2lsZSBhdm9pZGVkICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGN5Y2xpYyBET00gcmVjb25jaWxlIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZWxlbWVudENvbnRlbnRzQ2hhbmdlZChFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgaWYgKCFpc1VwZGF0aW5nRE9NKCkpCi0gICAgewotICAgICAgaWYgKCFpc1JlY29uY2lsaW5nKQotICAgICAgewotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY2hhbmdlRm9yICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgIAotICAgICAgICBpc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgICAgcmVjb25jaWxlQ29udGVudHMoY2hhbmdlZEVsZW1lbnQpOwotCi0gICAgICAgIFdTRExFbGVtZW50SW1wbCB0aGVDb250YWluZXIgPSAoV1NETEVsZW1lbnRJbXBsKWdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAodGhlQ29udGFpbmVyICE9IG51bGwgJiYgdGhlQ29udGFpbmVyLmdldEVsZW1lbnQoKSA9PSBjaGFuZ2VkRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIHRoZUNvbnRhaW5lci5lbGVtZW50Q29udGVudHNDaGFuZ2VkKGNoYW5nZWRFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgdHJhdmVyc2VUb1Jvb3RGb3JQYXRjaGluZygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIGludGVybmFsIHJlY29uY2lsZSBhdm9pZGVkICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGN5Y2xpYyBET00gcmVjb25jaWxlIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcmVmaXgoTm9kZSBub2RlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgb2xkUHJlZml4LCBTdHJpbmcgbmV3UHJlZml4KQotICB7Ci0gICAgaWYgKChuYW1lc3BhY2UgPT0gbnVsbCA/IG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCA6IG5hbWVzcGFjZS5lcXVhbHMobm9kZS5nZXROYW1lc3BhY2VVUkkoKSkpICYmCi0gICAgICAgICAgKG9sZFByZWZpeCA9PSBudWxsID8gbm9kZS5nZXRQcmVmaXgoKSA9PSBudWxsIDogb2xkUHJlZml4LmVxdWFscyhub2RlLmdldFByZWZpeCgpKSkpCi0gICAgewotICAgICAgbm9kZS5zZXRQcmVmaXgobmV3UHJlZml4KTsKLSAgICB9Ci0KLSAgICBmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKQotICAgIHsKLSAgICAgIHVwZGF0ZVByZWZpeChjaGlsZCwgbmFtZXNwYWNlLCBvbGRQcmVmaXgsIG5ld1ByZWZpeCk7Ci0gICAgfQotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZXNwYWNlKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0gICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7Ci0gICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgZWxzZSBpZiAoZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICByZXR1cm4gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldE5hbWVzcGFjZShuYW1lLnN1YnN0cmluZygwLGluZGV4KSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TG9jYWxOYW1lKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0gICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7Ci0gICAgaWYgKCBpbmRleCA9PSAtMSkKLSAgICAgIHJldHVybiBuYW1lOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZyhpbmRleCsxKTsKLSAgfQotCi19IC8vV1NETEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9XU0RMRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjZGZkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBXU0RMRmFjdG9yeQotewotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgV1NETEZhY3RvcnlJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQotICB7Ci0gICAgc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEU6IHJldHVybiBjcmVhdGVQb3J0VHlwZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT046IHJldHVybiBjcmVhdGVPcGVyYXRpb24oKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRTogcmV0dXJuIGNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVDogcmV0dXJuIGNyZWF0ZVBhcnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElORzogcmV0dXJuIGNyZWF0ZUJpbmRpbmcoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT046IHJldHVybiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0U6IHJldHVybiBjcmVhdGVTZXJ2aWNlKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlQ6IHJldHVybiBjcmVhdGVQb3J0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVDogcmV0dXJuIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT046IHJldHVybiBjcmVhdGVEZWZpbml0aW9uKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVDogcmV0dXJuIGNyZWF0ZUltcG9ydCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVDogcmV0dXJuIGNyZWF0ZUlucHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVDogcmV0dXJuIGNyZWF0ZU91dHB1dCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVDogcmV0dXJuIGNyZWF0ZUZhdWx0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVQ6IHJldHVybiBjcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVQ6IHJldHVybiBjcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFQ6IHJldHVybiBjcmVhdGVCaW5kaW5nRmF1bHQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFOiByZXR1cm4gY3JlYXRlTmFtZXNwYWNlKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTOiByZXR1cm4gY3JlYXRlVHlwZXMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlQ6IHJldHVybiBjcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlQ6IHJldHVybiBjcmVhdGVYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5RTkFNRToKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVFOYW1lRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9UWVBFOgotICAgICAgICByZXR1cm4gY3JlYXRlT3BlcmF0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ET01fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGNyZWF0ZURPTUVsZW1lbnRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuV1NETF9FWENFUFRJT046Ci0gICAgICAgIHJldHVybiBjcmVhdGVXU0RMRXhjZXB0aW9uRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRPTV9ET0NVTUVOVDoKLSAgICAgICAgcmV0dXJuIGNyZWF0ZURPTURvY3VtZW50RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlFOQU1FOgotICAgICAgICByZXR1cm4gY29udmVydFFOYW1lVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX1RZUEU6Ci0gICAgICAgIHJldHVybiBjb252ZXJ0T3BlcmF0aW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRPTV9FTEVNRU5UOgotICAgICAgICByZXR1cm4gY29udmVydERPTUVsZW1lbnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5XU0RMX0VYQ0VQVElPTjoKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRXU0RMRXhjZXB0aW9uVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRE9NX0RPQ1VNRU5UOgotICAgICAgICByZXR1cm4gY29udmVydERPTURvY3VtZW50VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUG9ydFR5cGUgY3JlYXRlUG9ydFR5cGUoKQotICB7Ci0gICAgUG9ydFR5cGVJbXBsIHBvcnRUeXBlID0gbmV3IFBvcnRUeXBlSW1wbCgpOwotICAgIHJldHVybiBwb3J0VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKQotICB7Ci0gICAgT3BlcmF0aW9uSW1wbCBvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uSW1wbCgpOwotICAgIHJldHVybiBvcGVyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoKQotICB7Ci0gICAgTWVzc2FnZUltcGwgbWVzc2FnZSA9IG5ldyBNZXNzYWdlSW1wbCgpOwotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUGFydCBjcmVhdGVQYXJ0KCkKLSAgewotICAgIFBhcnRJbXBsIHBhcnQgPSBuZXcgUGFydEltcGwoKTsKLSAgICByZXR1cm4gcGFydDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEJpbmRpbmcgY3JlYXRlQmluZGluZygpCi0gIHsKLSAgICBCaW5kaW5nSW1wbCBiaW5kaW5nID0gbmV3IEJpbmRpbmdJbXBsKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmc7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKQotICB7Ci0gICAgQmluZGluZ09wZXJhdGlvbkltcGwgYmluZGluZ09wZXJhdGlvbiA9IG5ldyBCaW5kaW5nT3BlcmF0aW9uSW1wbCgpOwotICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU2VydmljZSBjcmVhdGVTZXJ2aWNlKCkKLSAgewotICAgIFNlcnZpY2VJbXBsIHNlcnZpY2UgPSBuZXcgU2VydmljZUltcGwoKTsKLSAgICByZXR1cm4gc2VydmljZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFBvcnQgY3JlYXRlUG9ydCgpCi0gIHsKLSAgICBQb3J0SW1wbCBwb3J0ID0gbmV3IFBvcnRJbXBsKCk7Ci0gICAgcmV0dXJuIHBvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBuZXcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKCk7Ci0gICAgcmV0dXJuIGV4dGVuc2liaWxpdHlFbGVtZW50OwotICB9ICAgCi0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiBjcmVhdGVEZWZpbml0aW9uKCkKLSAgewotICAgIERlZmluaXRpb25JbXBsIGRlZmluaXRpb24gPSBuZXcgRGVmaW5pdGlvbkltcGwoKTsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEltcG9ydCBjcmVhdGVJbXBvcnQoKQotICB7Ci0gICAgSW1wb3J0SW1wbCBpbXBvcnRfID0gbmV3IEltcG9ydEltcGwoKTsKLSAgICByZXR1cm4gaW1wb3J0XzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIElucHV0IGNyZWF0ZUlucHV0KCkKLSAgewotICAgIElucHV0SW1wbCBpbnB1dCA9IG5ldyBJbnB1dEltcGwoKTsKLSAgICByZXR1cm4gaW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPdXRwdXQgY3JlYXRlT3V0cHV0KCkKLSAgewotICAgIE91dHB1dEltcGwgb3V0cHV0ID0gbmV3IE91dHB1dEltcGwoKTsKLSAgICByZXR1cm4gb3V0cHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRmF1bHQgY3JlYXRlRmF1bHQoKQotICB7Ci0gICAgRmF1bHRJbXBsIGZhdWx0ID0gbmV3IEZhdWx0SW1wbCgpOwotICAgIHJldHVybiBmYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEJpbmRpbmdJbnB1dCBjcmVhdGVCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgQmluZGluZ0lucHV0SW1wbCBiaW5kaW5nSW5wdXQgPSBuZXcgQmluZGluZ0lucHV0SW1wbCgpOwotICAgIHJldHVybiBiaW5kaW5nSW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nT3V0cHV0IGNyZWF0ZUJpbmRpbmdPdXRwdXQoKQotICB7Ci0gICAgQmluZGluZ091dHB1dEltcGwgYmluZGluZ091dHB1dCA9IG5ldyBCaW5kaW5nT3V0cHV0SW1wbCgpOwotICAgIHJldHVybiBiaW5kaW5nT3V0cHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZ0ZhdWx0IGNyZWF0ZUJpbmRpbmdGYXVsdCgpCi0gIHsKLSAgICBCaW5kaW5nRmF1bHRJbXBsIGJpbmRpbmdGYXVsdCA9IG5ldyBCaW5kaW5nRmF1bHRJbXBsKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5hbWVzcGFjZSBjcmVhdGVOYW1lc3BhY2UoKQotICB7Ci0gICAgTmFtZXNwYWNlSW1wbCBuYW1lc3BhY2UgPSBuZXcgTmFtZXNwYWNlSW1wbCgpOwotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBUeXBlcyBjcmVhdGVUeXBlcygpCi0gIHsKLSAgICBUeXBlc0ltcGwgdHlwZXMgPSBuZXcgVHlwZXNJbXBsKCk7Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCA9IG5ldyBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKCk7Ci0gICAgcmV0dXJuIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCA9IG5ldyBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwoKTsKLSAgICByZXR1cm4geHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUU5hbWUgY3JlYXRlUU5hbWVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gKFFOYW1lKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRRTmFtZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uVHlwZSBjcmVhdGVPcGVyYXRpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotICB7Ci0gICAgcmV0dXJuIChPcGVyYXRpb25UeXBlKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRPcGVyYXRpb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZURPTUVsZW1lbnRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gKEVsZW1lbnQpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY29udmVydERPTUVsZW1lbnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLSAgewotICAgIHJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFdTRExFeGNlcHRpb24gY3JlYXRlV1NETEV4Y2VwdGlvbkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLSAgewotICAgIHJldHVybiAoV1NETEV4Y2VwdGlvbilzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBjb252ZXJ0V1NETEV4Y2VwdGlvblRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gKERvY3VtZW50KXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRET01Eb2N1bWVudFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgV1NETFBhY2thZ2UgZ2V0V1NETFBhY2thZ2UoKQotICB7Ci0gICAgcmV0dXJuIChXU0RMUGFja2FnZSlnZXRFUGFja2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZGVwcmVjYXRlZAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdTRExQYWNrYWdlIGdldFBhY2thZ2UoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgfQotICAKLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZmFjdG9yeSA9IFdTRExQbHVnaW4uSU5TVEFOQ0UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KG5hbWVzcGFjZSk7Ci0gICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gIH0KLSAgCi0gIC8qCi0gIHB1YmxpYyB2b2lkIHNldEFsd2F5c1VzZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJEZXByZWNhdGVkOiBXU0RMRmFjdG9yeUltcGwuc2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzIik7Ci0gIH0KLSAgKi8KLX0gLy9XU0RMRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvV1NETFBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2VjNGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvV1NETFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFdTRExQYWNrYWdlCi17Ci0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcG9ydFR5cGVFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgb3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIG1lc3NhZ2VFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcGFydEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBiaW5kaW5nRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgc2VydmljZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBwb3J0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGRlZmluaXRpb25FQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaW1wb3J0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGV4dGVuc2libGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlucHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIG91dHB1dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBmYXVsdEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBiaW5kaW5nSW5wdXRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgYmluZGluZ091dHB1dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBiaW5kaW5nRmF1bHRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgbmFtZXNwYWNlRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlQb3J0VHlwZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpT3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlJbnB1dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpT3V0cHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlGYXVsdEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpTWVzc2FnZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpUGFydEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpU2VydmljZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpUG9ydEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpQmluZGluZ0VDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpQmluZGluZ09wZXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpQmluZGluZ0lucHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlCaW5kaW5nT3V0cHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlCaW5kaW5nRmF1bHRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlEZWZpbml0aW9uRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlJbXBvcnRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaUxpc3RFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaU1hcEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpdXJsRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlFeHRlbnNpb25SZWdpc3RyeUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyB0eXBlc0VDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpSXRlcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaVR5cGVzRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBtZXNzYWdlUmVmZXJlbmNlRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIHFOYW1lRURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIG9wZXJhdGlvblR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRGF0YVR5cGUgZG9tRWxlbWVudEVEYXRhVHlwZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVEYXRhVHlwZSB3c2RsRXhjZXB0aW9uRURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIGRvbURvY3VtZW50RURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLSAgICAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotICAgICAqIHBhY2thZ2UgVVJJIHZhbHVlLgotICAgICAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLSAgICAgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotICAgICAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0gICAgICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlI2VOU19VUkkKLSAgICAgKiBAc2VlICNpbml0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBXU0RMUGFja2FnZUltcGwoKQotICAgIHsKLSAgICAgICAgc3VwZXIoZU5TX1VSSSwgV1NETEZhY3RvcnkuZUlOU1RBTkNFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLSAgICAgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotICAgICAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0gICAgICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0gICAgICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotICAgICAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0gICAgICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotICAgICAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotICAgICAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLSAgICAgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotICAgICAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0gICAgICogdGhvc2Ugb2YgYW5vdGhlci4KLSAgICAgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0gICAgICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZU5TX1VSSQotICAgICAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV1NETFBhY2thZ2UgaW5pdCgpCi0gICAgewotICAgICAgICBpZiAoaXNJbml0ZWQpIHJldHVybiAoV1NETFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSk7Ci0KLSAgICAgICAgLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotICAgICAgICBXU0RMUGFja2FnZUltcGwgdGhlV1NETFBhY2thZ2UgPSAoV1NETFBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBXU0RMUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXU0RMUGFja2FnZUltcGwoKSk7Ci0KLSAgICAgICAgaXNJbml0ZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotICAgICAgICBYU0RQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLSAgICAgICAgdGhlV1NETFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLSAgICAgICAgdGhlV1NETFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0gICAgICAgIC8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLSAgICAgICAgdGhlV1NETFBhY2thZ2UuZnJlZXplKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRoZVdTRExQYWNrYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0V1NETEVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdzZGxFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTRExFbGVtZW50X0RvY3VtZW50YXRpb25FbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgd3NkbEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMRWxlbWVudF9FbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgd3NkbEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFBvcnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwb3J0VHlwZUVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9RTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHBvcnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfVW5kZWZpbmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHBvcnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfUmVzb3VyY2VVUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBwb3J0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBvcnRUeXBlX0VPcGVyYXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldE9wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9TdHlsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgb3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3BlcmF0aW9uX1VuZGVmaW5lZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9SZXNvdXJjZVVSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FSW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBvcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRPcGVyYXRpb25fRU91dHB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FRmF1bHRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgb3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbWVzc2FnZUVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlX1FOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgbWVzc2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VfVW5kZWZpbmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgbWVzc2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VfUHJveHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBtZXNzYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZV9SZXNvdXJjZVVSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG1lc3NhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlX0VQYXJ0cygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIG1lc3NhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFBhcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhcnRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFydF9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgcGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFBhcnRfRWxlbWVudE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBwYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFydF9UeXBlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHBhcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYXJ0X1R5cGVEZWZpbml0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgcGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgcGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcnRfRU1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBwYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRCaW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEJpbmRpbmdfUU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBiaW5kaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19VbmRlZmluZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBiaW5kaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGJpbmRpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nX1Jlc291cmNlVVJJKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgYmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdfRVBvcnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdfRUJpbmRpbmdPcGVyYXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nT3BlcmF0aW9uX05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0QmluZGluZ09wZXJhdGlvbl9FT3BlcmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ09wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nT3V0cHV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ09wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdGYXVsdHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRTZXJ2aWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VfUU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBzZXJ2aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZV9VbmRlZmluZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBzZXJ2aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZV9Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlX1Jlc291cmNlVVJJKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgc2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VfRVBvcnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0UG9ydCgpCi0gICAgewotICAgICAgICByZXR1cm4gcG9ydEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0X05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydF9FQmluZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudF9SZXF1aXJlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0RGVmaW5pdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gZGVmaW5pdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX1RhcmdldE5hbWVzcGFjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX0xvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgZGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldERlZmluaXRpb25fUU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVmaW5pdGlvbl9FbmNvZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VNZXNzYWdlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VQb3J0VHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FQmluZGluZ3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FU2VydmljZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FTmFtZXNwYWNlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VUeXBlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VJbXBvcnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgZGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEltcG9ydCgpCi0gICAgewotICAgICAgICByZXR1cm4gaW1wb3J0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEltcG9ydF9OYW1lc3BhY2VVUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBpbXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbXBvcnRfTG9jYXRpb25VUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBpbXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbXBvcnRfRURlZmluaXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBpbXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbXBvcnRfRVNjaGVtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGltcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2libGVFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEV4dGVuc2libGVFbGVtZW50X0VFeHRlbnNpYmlsaXR5RWxlbWVudHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBleHRlbnNpYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlucHV0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0T3V0cHV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmF1bHRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRCaW5kaW5nSW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdJbnB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nSW5wdXRfTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGJpbmRpbmdJbnB1dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdJbnB1dF9FSW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBiaW5kaW5nSW5wdXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEJpbmRpbmdPdXRwdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdPdXRwdXRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ091dHB1dF9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgYmluZGluZ091dHB1dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdPdXRwdXRfRU91dHB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGJpbmRpbmdPdXRwdXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEJpbmRpbmdGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmluZGluZ0ZhdWx0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEJpbmRpbmdGYXVsdF9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgYmluZGluZ0ZhdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGJpbmRpbmdGYXVsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0TmFtZXNwYWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0TmFtZXNwYWNlX1VSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG5hbWVzcGFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE5hbWVzcGFjZV9QcmVmaXgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBuYW1lc3BhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElQb3J0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gaVBvcnRUeXBlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SU9wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaU9wZXJhdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUlucHV0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SU91dHB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gaU91dHB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUZhdWx0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SU1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlNZXNzYWdlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVBhcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlQYXJ0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVNlcnZpY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlTZXJ2aWNlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVBvcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlQb3J0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUJpbmRpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlCaW5kaW5nRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUJpbmRpbmdPcGVyYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUJpbmRpbmdJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUJpbmRpbmdJbnB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElCaW5kaW5nT3V0cHV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpQmluZGluZ091dHB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElCaW5kaW5nRmF1bHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlCaW5kaW5nRmF1bHRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElEZWZpbml0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpRGVmaW5pdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElJbXBvcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlJbXBvcnRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUxpc3RFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJTWFwKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpTWFwRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVVSTCgpCi0gICAgewotICAgICAgICByZXR1cm4gaXVybEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElFeHRlbnNpb25SZWdpc3RyeSgpCi0gICAgewotICAgICAgICByZXR1cm4gaUV4dGVuc2lvblJlZ2lzdHJ5RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0VHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHR5cGVzRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUl0ZXJhdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpSXRlcmF0b3JFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJVHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlUeXBlc0VDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudF9DaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50X1NjaGVtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRNZXNzYWdlUmVmZXJlbmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlUmVmZXJlbmNlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VSZWZlcmVuY2VfTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG1lc3NhZ2VSZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlUmVmZXJlbmNlX0VNZXNzYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgbWVzc2FnZVJlZmVyZW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0UU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHFOYW1lRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0T3BlcmF0aW9uVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uVHlwZUVEYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRURhdGFUeXBlIGdldERPTUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvbUVsZW1lbnRFRGF0YVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVEYXRhVHlwZSBnZXRXU0RMRXhjZXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3c2RsRXhjZXB0aW9uRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0RE9NRG9jdW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvbURvY3VtZW50RURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBXU0RMRmFjdG9yeSBnZXRXU0RMRmFjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gKFdTRExGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0gICAgICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAgewotICAgICAgICBpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0gICAgICAgIGlzQ3JlYXRlZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0gICAgICAgIHdzZGxFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdTRExfRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbEVsZW1lbnRFQ2xhc3MsIFdTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsRWxlbWVudEVDbGFzcywgV1NETF9FTEVNRU5UX19FTEVNRU5UKTsKLQotICAgICAgICBwb3J0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUX1RZUEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBvcnRUeXBlRUNsYXNzLCBQT1JUX1RZUEVfX1FOQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwb3J0VHlwZUVDbGFzcywgUE9SVF9UWVBFX19VTkRFRklORUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBvcnRUeXBlRUNsYXNzLCBQT1JUX1RZUEVfX1BST1hZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwb3J0VHlwZUVDbGFzcywgUE9SVF9UWVBFX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHBvcnRUeXBlRUNsYXNzLCBQT1JUX1RZUEVfX0VPUEVSQVRJT05TKTsKLQotICAgICAgICBvcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1BFUkFUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fU1RZTEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fVU5ERUZJTkVEKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fUFJPWFkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19FSU5QVVQpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19FT1VUUFVUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fRUZBVUxUUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uob3BlcmF0aW9uRUNsYXNzLCBPUEVSQVRJT05fX0VQQVJBTUVURVJfT1JERVJJTkcpOwotCi0gICAgICAgIG1lc3NhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZUVDbGFzcywgTUVTU0FHRV9fUU5BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VFQ2xhc3MsIE1FU1NBR0VfX1VOREVGSU5FRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZUVDbGFzcywgTUVTU0FHRV9fUFJPWFkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VFQ2xhc3MsIE1FU1NBR0VfX1JFU09VUkNFX1VSSSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZUVDbGFzcywgTUVTU0FHRV9fRVBBUlRTKTsKLQotICAgICAgICBwYXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBUlQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBhcnRFQ2xhc3MsIFBBUlRfX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBhcnRFQ2xhc3MsIFBBUlRfX0VMRU1FTlRfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUocGFydEVDbGFzcywgUEFSVF9fVFlQRV9OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShwYXJ0RUNsYXNzLCBQQVJUX19UWVBFX0RFRklOSVRJT04pOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHBhcnRFQ2xhc3MsIFBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT04pOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHBhcnRFQ2xhc3MsIFBBUlRfX0VNRVNTQUdFKTsKLQotICAgICAgICBiaW5kaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJJTkRJTkcpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX1FOQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShiaW5kaW5nRUNsYXNzLCBCSU5ESU5HX19VTkRFRklORUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX1BST1hZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShiaW5kaW5nRUNsYXNzLCBCSU5ESU5HX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX0VQT1JUX1RZUEUpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX0VCSU5ESU5HX09QRVJBVElPTlMpOwotCi0gICAgICAgIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQklORElOR19PUEVSQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MsIEJJTkRJTkdfT1BFUkFUSU9OX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBCSU5ESU5HX09QRVJBVElPTl9fRU9QRVJBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYmluZGluZ09wZXJhdGlvbkVDbGFzcywgQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfT1VUUFVUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTKTsKLQotICAgICAgICBzZXJ2aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VFQ2xhc3MsIFNFUlZJQ0VfX1FOQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRUNsYXNzLCBTRVJWSUNFX19VTkRFRklORUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VFQ2xhc3MsIFNFUlZJQ0VfX1BST1hZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRUNsYXNzLCBTRVJWSUNFX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VFQ2xhc3MsIFNFUlZJQ0VfX0VQT1JUUyk7Ci0KLSAgICAgICAgcG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwb3J0RUNsYXNzLCBQT1JUX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShwb3J0RUNsYXNzLCBQT1JUX19FQklORElORyk7Ci0KLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVhURU5TSUJJTElUWV9FTEVNRU5UKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcywgRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoZXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MsIEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFKTsKLQotICAgICAgICBkZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFRklOSVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0xPQ0FUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShkZWZpbml0aW9uRUNsYXNzLCBERUZJTklUSU9OX19RTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRU5DT0RJTkcpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0VNRVNTQUdFUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRVBPUlRfVFlQRVMpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0VCSU5ESU5HUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRVNFUlZJQ0VTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShkZWZpbml0aW9uRUNsYXNzLCBERUZJTklUSU9OX19FTkFNRVNQQUNFUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRVRZUEVTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShkZWZpbml0aW9uRUNsYXNzLCBERUZJTklUSU9OX19FSU1QT1JUUyk7Ci0KLSAgICAgICAgaW1wb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElNUE9SVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoaW1wb3J0RUNsYXNzLCBJTVBPUlRfX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGltcG9ydEVDbGFzcywgSU1QT1JUX19MT0NBVElPTl9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGltcG9ydEVDbGFzcywgSU1QT1JUX19FREVGSU5JVElPTik7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoaW1wb3J0RUNsYXNzLCBJTVBPUlRfX0VTQ0hFTUEpOwotCi0gICAgICAgIGV4dGVuc2libGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYVEVOU0lCTEVfRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZXh0ZW5zaWJsZUVsZW1lbnRFQ2xhc3MsIEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMpOwotCi0gICAgICAgIGlucHV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElOUFVUKTsKLQotICAgICAgICBvdXRwdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1VUUFVUKTsKLQotICAgICAgICBmYXVsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGQVVMVCk7Ci0KLSAgICAgICAgYmluZGluZ0lucHV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJJTkRJTkdfSU5QVVQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdJbnB1dEVDbGFzcywgQklORElOR19JTlBVVF9fTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYmluZGluZ0lucHV0RUNsYXNzLCBCSU5ESU5HX0lOUFVUX19FSU5QVVQpOwotCi0gICAgICAgIGJpbmRpbmdPdXRwdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQklORElOR19PVVRQVVQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdPdXRwdXRFQ2xhc3MsIEJJTkRJTkdfT1VUUFVUX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3V0cHV0RUNsYXNzLCBCSU5ESU5HX09VVFBVVF9fRU9VVFBVVCk7Ci0KLSAgICAgICAgYmluZGluZ0ZhdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJJTkRJTkdfRkFVTFQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdGYXVsdEVDbGFzcywgQklORElOR19GQVVMVF9fTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYmluZGluZ0ZhdWx0RUNsYXNzLCBCSU5ESU5HX0ZBVUxUX19FRkFVTFQpOwotCi0gICAgICAgIG5hbWVzcGFjZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FU1BBQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG5hbWVzcGFjZUVDbGFzcywgTkFNRVNQQUNFX19VUkkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG5hbWVzcGFjZUVDbGFzcywgTkFNRVNQQUNFX19QUkVGSVgpOwotCi0gICAgICAgIGlQb3J0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJUE9SVF9UWVBFKTsKLQotICAgICAgICBpT3BlcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElPUEVSQVRJT04pOwotCi0gICAgICAgIGlJbnB1dEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSU5QVVQpOwotCi0gICAgICAgIGlPdXRwdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU9VVFBVVCk7Ci0KLSAgICAgICAgaUZhdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElGQVVMVCk7Ci0KLSAgICAgICAgaU1lc3NhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1FU1NBR0UpOwotCi0gICAgICAgIGlQYXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElQQVJUKTsKLQotICAgICAgICBpU2VydmljZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJU0VSVklDRSk7Ci0KLSAgICAgICAgaVBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVBPUlQpOwotCi0gICAgICAgIGlCaW5kaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKElCSU5ESU5HKTsKLQotICAgICAgICBpQmluZGluZ09wZXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJQklORElOR19PUEVSQVRJT04pOwotCi0gICAgICAgIGlCaW5kaW5nSW5wdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUJJTkRJTkdfSU5QVVQpOwotCi0gICAgICAgIGlCaW5kaW5nT3V0cHV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElCSU5ESU5HX09VVFBVVCk7Ci0KLSAgICAgICAgaUJpbmRpbmdGYXVsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJQklORElOR19GQVVMVCk7Ci0KLSAgICAgICAgaUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKElFWFRFTlNJQklMSVRZX0VMRU1FTlQpOwotCi0gICAgICAgIGlEZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElERUZJTklUSU9OKTsKLQotICAgICAgICBpSW1wb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElJTVBPUlQpOwotCi0gICAgICAgIGlMaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElMSVNUKTsKLQotICAgICAgICBpTWFwRUNsYXNzID0gY3JlYXRlRUNsYXNzKElNQVApOwotCi0gICAgICAgIGl1cmxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVVSTCk7Ci0KLSAgICAgICAgaUV4dGVuc2lvblJlZ2lzdHJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKElFWFRFTlNJT05fUkVHSVNUUlkpOwotCi0gICAgICAgIHR5cGVzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRZUEVTKTsKLQotICAgICAgICBpSXRlcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUlURVJBVE9SKTsKLQotICAgICAgICBpVHlwZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVRZUEVTKTsKLQotICAgICAgICB1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlQpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcywgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOKTsKLQotICAgICAgICB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MsIFhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19TQ0hFTUEpOwotCi0gICAgICAgIG1lc3NhZ2VSZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9SRUZFUkVOQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VSZWZlcmVuY2VFQ2xhc3MsIE1FU1NBR0VfUkVGRVJFTkNFX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlUmVmZXJlbmNlRUNsYXNzLCBNRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0UpOwotCi0gICAgICAgIC8vIENyZWF0ZSBkYXRhIHR5cGVzCi0gICAgICAgIHFOYW1lRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFFOQU1FKTsKLSAgICAgICAgb3BlcmF0aW9uVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShPUEVSQVRJT05fVFlQRSk7Ci0gICAgICAgIGRvbUVsZW1lbnRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRE9NX0VMRU1FTlQpOwotICAgICAgICB3c2RsRXhjZXB0aW9uRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFdTRExfRVhDRVBUSU9OKTsKLSAgICAgICAgZG9tRG9jdW1lbnRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRE9NX0RPQ1VNRU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLSAgICAgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotICAgIHsKLSAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLSAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0gICAgICAgIHNldE5hbWUoZU5BTUUpOwotICAgICAgICBzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLSAgICAgICAgc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLSAgICAgICAgLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotICAgICAgICBYU0RQYWNrYWdlSW1wbCB0aGVYU0RQYWNrYWdlID0gKFhTRFBhY2thZ2VJbXBsKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYU0RQYWNrYWdlLmVOU19VUkkpOwotCi0gICAgICAgIC8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLSAgICAgICAgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXU0RMRWxlbWVudCgpKTsKLSAgICAgICAgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJUG9ydFR5cGUoKSk7Ci0gICAgICAgIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBvcGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJT3BlcmF0aW9uKCkpOwotICAgICAgICBtZXNzYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETEVsZW1lbnQoKSk7Ci0gICAgICAgIG1lc3NhZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJTWVzc2FnZSgpKTsKLSAgICAgICAgcGFydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBwYXJ0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SVBhcnQoKSk7Ci0gICAgICAgIGJpbmRpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgYmluZGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElCaW5kaW5nKCkpOwotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKSk7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJQmluZGluZ09wZXJhdGlvbigpKTsKLSAgICAgICAgc2VydmljZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2libGVFbGVtZW50KCkpOwotICAgICAgICBzZXJ2aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SVNlcnZpY2UoKSk7Ci0gICAgICAgIHBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElQb3J0KCkpOwotICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICAgICAgZGVmaW5pdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2libGVFbGVtZW50KCkpOwotICAgICAgICBkZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SURlZmluaXRpb24oKSk7Ci0gICAgICAgIGltcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBpbXBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSW1wb3J0KCkpOwotICAgICAgICBleHRlbnNpYmxlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBpbnB1dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1lc3NhZ2VSZWZlcmVuY2UoKSk7Ci0gICAgICAgIGlucHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETEVsZW1lbnQoKSk7Ci0gICAgICAgIGlucHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUlucHV0KCkpOwotICAgICAgICBvdXRwdXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXNzYWdlUmVmZXJlbmNlKCkpOwotICAgICAgICBvdXRwdXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXU0RMRWxlbWVudCgpKTsKLSAgICAgICAgb3V0cHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SU91dHB1dCgpKTsKLSAgICAgICAgZmF1bHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXNzYWdlUmVmZXJlbmNlKCkpOwotICAgICAgICBmYXVsdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBmYXVsdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElGYXVsdCgpKTsKLSAgICAgICAgYmluZGluZ0lucHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKSk7Ci0gICAgICAgIGJpbmRpbmdJbnB1dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElCaW5kaW5nSW5wdXQoKSk7Ci0gICAgICAgIGJpbmRpbmdPdXRwdXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgYmluZGluZ091dHB1dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElCaW5kaW5nT3V0cHV0KCkpOwotICAgICAgICBiaW5kaW5nRmF1bHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgYmluZGluZ0ZhdWx0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUJpbmRpbmdGYXVsdCgpKTsKLSAgICAgICAgdHlwZXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgdHlwZXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJVHlwZXMoKSk7Ci0gICAgICAgIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgICAgICB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgICAgICBtZXNzYWdlUmVmZXJlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETEVsZW1lbnQoKSk7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLSAgICAgICAgaW5pdEVDbGFzcyh3c2RsRWxlbWVudEVDbGFzcywgV1NETEVsZW1lbnQuY2xhc3MsICJXU0RMRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMRWxlbWVudF9Eb2N1bWVudGF0aW9uRWxlbWVudCgpLCB0aGlzLmdldERPTUVsZW1lbnQoKSwgImRvY3VtZW50YXRpb25FbGVtZW50IiwgbnVsbCwgMCwgMSwgV1NETEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTRExFbGVtZW50X0VsZW1lbnQoKSwgdGhpcy5nZXRET01FbGVtZW50KCksICJlbGVtZW50IiwgbnVsbCwgMCwgMSwgV1NETEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbih3c2RsRWxlbWVudEVDbGFzcywgdGhpcy5nZXREZWZpbml0aW9uKCksICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIik7Ci0KLSAgICAgICAgRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24od3NkbEVsZW1lbnRFQ2xhc3MsIG51bGwsICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0RGVmaW5pdGlvbigpLCAiZGVmaW5pdGlvbiIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MocG9ydFR5cGVFQ2xhc3MsIFBvcnRUeXBlLmNsYXNzLCAiUG9ydFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBvcnRUeXBlX1FOYW1lKCksIHRoaXMuZ2V0UU5hbWUoKSwgInFOYW1lIiwgbnVsbCwgMCwgMSwgUG9ydFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBvcnRUeXBlX1VuZGVmaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuZGVmaW5lZCIsIG51bGwsIDAsIDEsIFBvcnRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQb3J0VHlwZV9Qcm94eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInByb3h5IiwgbnVsbCwgMCwgMSwgUG9ydFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBvcnRUeXBlX1Jlc291cmNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZXNvdXJjZVVSSSIsIG51bGwsIDAsIDEsIFBvcnRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRQb3J0VHlwZV9FT3BlcmF0aW9ucygpLCB0aGlzLmdldE9wZXJhdGlvbigpLCBudWxsLCAiZU9wZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgUG9ydFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhvcGVyYXRpb25FQ2xhc3MsIE9wZXJhdGlvbi5jbGFzcywgIk9wZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0T3BlcmF0aW9uX1N0eWxlKCksIHRoaXMuZ2V0T3BlcmF0aW9uVHlwZSgpLCAic3R5bGUiLCBudWxsLCAwLCAxLCBPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldE9wZXJhdGlvbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRPcGVyYXRpb25fVW5kZWZpbmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidW5kZWZpbmVkIiwgbnVsbCwgMCwgMSwgT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRPcGVyYXRpb25fUHJveHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm94eSIsIG51bGwsIDAsIDEsIE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0T3BlcmF0aW9uX1Jlc291cmNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZXNvdXJjZVVSSSIsIG51bGwsIDAsIDEsIE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0T3BlcmF0aW9uX0VJbnB1dCgpLCB0aGlzLmdldElucHV0KCksIG51bGwsICJlSW5wdXQiLCBudWxsLCAwLCAxLCBPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldE9wZXJhdGlvbl9FT3V0cHV0KCksIHRoaXMuZ2V0T3V0cHV0KCksIG51bGwsICJlT3V0cHV0IiwgbnVsbCwgMCwgMSwgT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRPcGVyYXRpb25fRUZhdWx0cygpLCB0aGlzLmdldEZhdWx0KCksIG51bGwsICJlRmF1bHRzIiwgbnVsbCwgMCwgLTEsIE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpLCB0aGlzLmdldFBhcnQoKSwgbnVsbCwgImVQYXJhbWV0ZXJPcmRlcmluZyIsIG51bGwsIDAsIC0xLCBPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhtZXNzYWdlRUNsYXNzLCBNZXNzYWdlLmNsYXNzLCAiTWVzc2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZV9RTmFtZSgpLCB0aGlzLmdldFFOYW1lKCksICJxTmFtZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VfVW5kZWZpbmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidW5kZWZpbmVkIiwgbnVsbCwgMCwgMSwgTWVzc2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZV9Qcm94eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInByb3h5IiwgbnVsbCwgMCwgMSwgTWVzc2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZV9SZXNvdXJjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVzb3VyY2VVUkkiLCBudWxsLCAwLCAxLCBNZXNzYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlX0VQYXJ0cygpLCB0aGlzLmdldFBhcnQoKSwgbnVsbCwgImVQYXJ0cyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MocGFydEVDbGFzcywgUGFydC5jbGFzcywgIlBhcnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBhcnRfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFBhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBhcnRfRWxlbWVudE5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAiZWxlbWVudE5hbWUiLCBudWxsLCAwLCAxLCBQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQYXJ0X1R5cGVOYW1lKCksIHRoaXMuZ2V0UU5hbWUoKSwgInR5cGVOYW1lIiwgbnVsbCwgMCwgMSwgUGFydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0UGFydF9UeXBlRGVmaW5pdGlvbigpLCB0aGVYU0RQYWNrYWdlLmdldFhTRFR5cGVEZWZpbml0aW9uKCksIG51bGwsICJ0eXBlRGVmaW5pdGlvbiIsIG51bGwsIDAsIDEsIFBhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCksIHRoZVhTRFBhY2thZ2UuZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCksIG51bGwsICJlbGVtZW50RGVjbGFyYXRpb24iLCBudWxsLCAwLCAxLCBQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRQYXJ0X0VNZXNzYWdlKCksIHRoaXMuZ2V0TWVzc2FnZSgpLCBudWxsLCAiZU1lc3NhZ2UiLCBudWxsLCAwLCAxLCBQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoYmluZGluZ0VDbGFzcywgQmluZGluZy5jbGFzcywgIkJpbmRpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEJpbmRpbmdfUU5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAicU5hbWUiLCBudWxsLCAwLCAxLCBCaW5kaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRCaW5kaW5nX1VuZGVmaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuZGVmaW5lZCIsIG51bGwsIDAsIDEsIEJpbmRpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEJpbmRpbmdfUHJveHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm94eSIsIG51bGwsIDAsIDEsIEJpbmRpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEJpbmRpbmdfUmVzb3VyY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlVVJJIiwgbnVsbCwgMCwgMSwgQmluZGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ19FUG9ydFR5cGUoKSwgdGhpcy5nZXRQb3J0VHlwZSgpLCBudWxsLCAiZVBvcnRUeXBlIiwgbnVsbCwgMSwgMSwgQmluZGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ19FQmluZGluZ09wZXJhdGlvbnMoKSwgdGhpcy5nZXRCaW5kaW5nT3BlcmF0aW9uKCksIG51bGwsICJlQmluZGluZ09wZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgQmluZGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MsIEJpbmRpbmdPcGVyYXRpb24uY2xhc3MsICJCaW5kaW5nT3BlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRCaW5kaW5nT3BlcmF0aW9uX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VPcGVyYXRpb24oKSwgdGhpcy5nZXRPcGVyYXRpb24oKSwgbnVsbCwgImVPcGVyYXRpb24iLCBudWxsLCAxLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nSW5wdXQoKSwgdGhpcy5nZXRCaW5kaW5nSW5wdXQoKSwgbnVsbCwgImVCaW5kaW5nSW5wdXQiLCBudWxsLCAwLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nT3V0cHV0KCksIHRoaXMuZ2V0QmluZGluZ091dHB1dCgpLCBudWxsLCAiZUJpbmRpbmdPdXRwdXQiLCBudWxsLCAwLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nRmF1bHRzKCksIHRoaXMuZ2V0QmluZGluZ0ZhdWx0KCksIG51bGwsICJlQmluZGluZ0ZhdWx0cyIsIG51bGwsIDAsIC0xLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3Moc2VydmljZUVDbGFzcywgU2VydmljZS5jbGFzcywgIlNlcnZpY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VfUU5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAicU5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlX1VuZGVmaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuZGVmaW5lZCIsIG51bGwsIDAsIDEsIFNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VfUHJveHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm94eSIsIG51bGwsIDAsIDEsIFNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VfUmVzb3VyY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlVVJJIiwgbnVsbCwgMCwgMSwgU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZV9FUG9ydHMoKSwgdGhpcy5nZXRQb3J0KCksIG51bGwsICJlUG9ydHMiLCBudWxsLCAwLCAtMSwgU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKHBvcnRFQ2xhc3MsIFBvcnQuY2xhc3MsICJQb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQb3J0X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRQb3J0X0VCaW5kaW5nKCksIHRoaXMuZ2V0QmluZGluZygpLCBudWxsLCAiZUJpbmRpbmciLCBudWxsLCAxLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MsIEV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCAiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEV4dGVuc2liaWxpdHlFbGVtZW50X1JlcXVpcmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVxdWlyZWQiLCBudWxsLCAwLCAxLCBFeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKSwgdGhpcy5nZXRRTmFtZSgpLCAiZWxlbWVudFR5cGUiLCBudWxsLCAwLCAxLCBFeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZGVmaW5pdGlvbkVDbGFzcywgRGVmaW5pdGlvbi5jbGFzcywgIkRlZmluaXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldERlZmluaXRpb25fVGFyZ2V0TmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YXJnZXROYW1lc3BhY2UiLCBudWxsLCAwLCAxLCBEZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXREZWZpbml0aW9uX0xvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhdGlvbiIsIG51bGwsIDAsIDEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldERlZmluaXRpb25fUU5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAicU5hbWUiLCBudWxsLCAwLCAxLCBEZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXREZWZpbml0aW9uX0VuY29kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlbmNvZGluZyIsIG51bGwsIDAsIDEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRU1lc3NhZ2VzKCksIHRoaXMuZ2V0TWVzc2FnZSgpLCBudWxsLCAiZU1lc3NhZ2VzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRVBvcnRUeXBlcygpLCB0aGlzLmdldFBvcnRUeXBlKCksIG51bGwsICJlUG9ydFR5cGVzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRUJpbmRpbmdzKCksIHRoaXMuZ2V0QmluZGluZygpLCBudWxsLCAiZUJpbmRpbmdzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRVNlcnZpY2VzKCksIHRoaXMuZ2V0U2VydmljZSgpLCBudWxsLCAiZVNlcnZpY2VzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRU5hbWVzcGFjZXMoKSwgdGhpcy5nZXROYW1lc3BhY2UoKSwgbnVsbCwgImVOYW1lc3BhY2VzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRVR5cGVzKCksIHRoaXMuZ2V0VHlwZXMoKSwgbnVsbCwgImVUeXBlcyIsIG51bGwsIDAsIDEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRUltcG9ydHMoKSwgdGhpcy5nZXRJbXBvcnQoKSwgbnVsbCwgImVJbXBvcnRzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihkZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldERPTURvY3VtZW50KCksICJnZXREb2N1bWVudCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihkZWZpbml0aW9uRUNsYXNzLCBudWxsLCAic2V0RG9jdW1lbnQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRET01Eb2N1bWVudCgpLCAiZG9jdW1lbnQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGltcG9ydEVDbGFzcywgSW1wb3J0LmNsYXNzLCAiSW1wb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRJbXBvcnRfTmFtZXNwYWNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiLCBudWxsLCAwLCAxLCBJbXBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEltcG9ydF9Mb2NhdGlvblVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYXRpb25VUkkiLCBudWxsLCAwLCAxLCBJbXBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldEltcG9ydF9FRGVmaW5pdGlvbigpLCB0aGlzLmdldERlZmluaXRpb24oKSwgbnVsbCwgImVEZWZpbml0aW9uIiwgbnVsbCwgMCwgMSwgSW1wb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRJbXBvcnRfRVNjaGVtYSgpLCB0aGVYU0RQYWNrYWdlLmdldFhTRFNjaGVtYSgpLCBudWxsLCAiZVNjaGVtYSIsIG51bGwsIDAsIDEsIEltcG9ydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGltcG9ydEVDbGFzcywgdGhlWFNEUGFja2FnZS5nZXRYU0RTY2hlbWEoKSwgImdldFNjaGVtYSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpbXBvcnRFQ2xhc3MsIG51bGwsICJzZXRTY2hlbWEiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhlWFNEUGFja2FnZS5nZXRYU0RTY2hlbWEoKSwgInNjaGVtYSIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZXh0ZW5zaWJsZUVsZW1lbnRFQ2xhc3MsIEV4dGVuc2libGVFbGVtZW50LmNsYXNzLCAiRXh0ZW5zaWJsZUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0RXh0ZW5zaWJsZUVsZW1lbnRfRUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCB0aGlzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCksIG51bGwsICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIEV4dGVuc2libGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oZXh0ZW5zaWJsZUVsZW1lbnRFQ2xhc3MsIHRoaXMuZ2V0SUxpc3QoKSwgImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihleHRlbnNpYmxlRWxlbWVudEVDbGFzcywgbnVsbCwgImFkZEV4dGVuc2liaWxpdHlFbGVtZW50Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUV4dGVuc2liaWxpdHlFbGVtZW50KCksICJleHRFbGVtZW50Iik7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpbnB1dEVDbGFzcywgSW5wdXQuY2xhc3MsICJJbnB1dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKG91dHB1dEVDbGFzcywgT3V0cHV0LmNsYXNzLCAiT3V0cHV0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZmF1bHRFQ2xhc3MsIEZhdWx0LmNsYXNzLCAiRmF1bHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhiaW5kaW5nSW5wdXRFQ2xhc3MsIEJpbmRpbmdJbnB1dC5jbGFzcywgIkJpbmRpbmdJbnB1dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0QmluZGluZ0lucHV0X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBCaW5kaW5nSW5wdXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldEJpbmRpbmdJbnB1dF9FSW5wdXQoKSwgdGhpcy5nZXRJbnB1dCgpLCBudWxsLCAiZUlucHV0IiwgbnVsbCwgMSwgMSwgQmluZGluZ0lucHV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oYmluZGluZ0lucHV0RUNsYXNzLCB0aGlzLmdldElJbnB1dCgpLCAiZ2V0SW5wdXQiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oYmluZGluZ0lucHV0RUNsYXNzLCBudWxsLCAic2V0SW5wdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJSW5wdXQoKSwgImlucHV0Iik7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhiaW5kaW5nT3V0cHV0RUNsYXNzLCBCaW5kaW5nT3V0cHV0LmNsYXNzLCAiQmluZGluZ091dHB1dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0QmluZGluZ091dHB1dF9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgQmluZGluZ091dHB1dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ091dHB1dF9FT3V0cHV0KCksIHRoaXMuZ2V0T3V0cHV0KCksIG51bGwsICJlT3V0cHV0IiwgbnVsbCwgMSwgMSwgQmluZGluZ091dHB1dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGJpbmRpbmdPdXRwdXRFQ2xhc3MsIHRoaXMuZ2V0SU91dHB1dCgpLCAiZ2V0T3V0cHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGJpbmRpbmdPdXRwdXRFQ2xhc3MsIG51bGwsICJzZXRPdXRwdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJT3V0cHV0KCksICJvdXRwdXQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGJpbmRpbmdGYXVsdEVDbGFzcywgQmluZGluZ0ZhdWx0LmNsYXNzLCAiQmluZGluZ0ZhdWx0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRCaW5kaW5nRmF1bHRfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEJpbmRpbmdGYXVsdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpLCB0aGlzLmdldEZhdWx0KCksIG51bGwsICJlRmF1bHQiLCBudWxsLCAxLCAxLCBCaW5kaW5nRmF1bHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihiaW5kaW5nRmF1bHRFQ2xhc3MsIHRoaXMuZ2V0SUZhdWx0KCksICJnZXRGYXVsdCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihiaW5kaW5nRmF1bHRFQ2xhc3MsIG51bGwsICJzZXRGYXVsdCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElGYXVsdCgpLCAiZmF1bHQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKG5hbWVzcGFjZUVDbGFzcywgTmFtZXNwYWNlLmNsYXNzLCAiTmFtZXNwYWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXROYW1lc3BhY2VfVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJVUkkiLCBudWxsLCAwLCAxLCBOYW1lc3BhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldE5hbWVzcGFjZV9QcmVmaXgoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInByZWZpeCIsIG51bGwsIDAsIDEsIE5hbWVzcGFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlQb3J0VHlwZUVDbGFzcywgamF2YXgud3NkbC5Qb3J0VHlwZS5jbGFzcywgIklQb3J0VHlwZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpUG9ydFR5cGVFQ2xhc3MsIG51bGwsICJhZGRPcGVyYXRpb24iKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJT3BlcmF0aW9uKCksICJvcGVyYXRpb24iKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaVBvcnRUeXBlRUNsYXNzLCB0aGlzLmdldElPcGVyYXRpb24oKSwgImdldE9wZXJhdGlvbiIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5wdXROYW1lIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJvdXRwdXROYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpUG9ydFR5cGVFQ2xhc3MsIHRoaXMuZ2V0SUxpc3QoKSwgImdldE9wZXJhdGlvbnMiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlPcGVyYXRpb25FQ2xhc3MsIGphdmF4LndzZGwuT3BlcmF0aW9uLmNsYXNzLCAiSU9wZXJhdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpT3BlcmF0aW9uRUNsYXNzLCBudWxsLCAiYWRkRmF1bHQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJRmF1bHQoKSwgImZhdWx0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUZhdWx0KCksICJnZXRGYXVsdCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaU9wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRGYXVsdHMiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUxpc3QoKSwgImdldFBhcmFtZXRlck9yZGVyaW5nIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIG51bGwsICJzZXRQYXJhbWV0ZXJPcmRlcmluZyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElMaXN0KCksICJwYXJhbWV0ZXJPcmRlciIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaU9wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJSW5wdXQoKSwgImdldElucHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIG51bGwsICJzZXRJbnB1dCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElJbnB1dCgpLCAiaW5wdXQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SU91dHB1dCgpLCAiZ2V0T3V0cHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIG51bGwsICJzZXRPdXRwdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJT3V0cHV0KCksICJvdXRwdXQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlJbnB1dEVDbGFzcywgamF2YXgud3NkbC5JbnB1dC5jbGFzcywgIklJbnB1dCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaUlucHV0RUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlJbnB1dEVDbGFzcywgbnVsbCwgInNldE1lc3NhZ2UiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTWVzc2FnZSgpLCAibWVzc2FnZSIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaU91dHB1dEVDbGFzcywgamF2YXgud3NkbC5PdXRwdXQuY2xhc3MsICJJT3V0cHV0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpT3V0cHV0RUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPdXRwdXRFQ2xhc3MsIG51bGwsICJzZXRNZXNzYWdlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SU1lc3NhZ2UoKSwgIm1lc3NhZ2UiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlGYXVsdEVDbGFzcywgamF2YXgud3NkbC5GYXVsdC5jbGFzcywgIklGYXVsdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaUZhdWx0RUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlGYXVsdEVDbGFzcywgbnVsbCwgInNldE1lc3NhZ2UiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTWVzc2FnZSgpLCAibWVzc2FnZSIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaU1lc3NhZ2VFQ2xhc3MsIGphdmF4LndzZGwuTWVzc2FnZS5jbGFzcywgIklNZXNzYWdlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlNZXNzYWdlRUNsYXNzLCBudWxsLCAiYWRkUGFydCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElQYXJ0KCksICJwYXJ0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlNZXNzYWdlRUNsYXNzLCB0aGlzLmdldElQYXJ0KCksICJnZXRQYXJ0Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpTWVzc2FnZUVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRQYXJ0cyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpTWVzc2FnZUVDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0T3JkZXJlZFBhcnRzIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUxpc3QoKSwgInBhcnRPcmRlciIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaVBhcnRFQ2xhc3MsIGphdmF4LndzZGwuUGFydC5jbGFzcywgIklQYXJ0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlQYXJ0RUNsYXNzLCBudWxsLCAic2V0RXh0ZW5zaW9uQXR0cmlidXRlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRRTmFtZSgpLCAidmFsdWUiKTsKLSAgICAgICAgYWRkRUV4Y2VwdGlvbihvcCwgdGhpcy5nZXRXU0RMRXhjZXB0aW9uKCkpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaVBhcnRFQ2xhc3MsIHRoaXMuZ2V0SUl0ZXJhdG9yKCksICJnZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpUGFydEVDbGFzcywgdGhpcy5nZXRRTmFtZSgpLCAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlTZXJ2aWNlRUNsYXNzLCBqYXZheC53c2RsLlNlcnZpY2UuY2xhc3MsICJJU2VydmljZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpU2VydmljZUVDbGFzcywgbnVsbCwgImFkZFBvcnQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJUG9ydCgpLCAicG9ydCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaVNlcnZpY2VFQ2xhc3MsIHRoaXMuZ2V0SU1hcCgpLCAiZ2V0UG9ydHMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaVNlcnZpY2VFQ2xhc3MsIHRoaXMuZ2V0SVBvcnQoKSwgImdldFBvcnQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlQb3J0RUNsYXNzLCBqYXZheC53c2RsLlBvcnQuY2xhc3MsICJJUG9ydCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaVBvcnRFQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmcoKSwgImdldEJpbmRpbmciKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaVBvcnRFQ2xhc3MsIG51bGwsICJzZXRCaW5kaW5nIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUJpbmRpbmcoKSwgImJpbmRpbmciKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlCaW5kaW5nRUNsYXNzLCBqYXZheC53c2RsLkJpbmRpbmcuY2xhc3MsICJJQmluZGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ0VDbGFzcywgbnVsbCwgImFkZEJpbmRpbmdPcGVyYXRpb24iKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJQmluZGluZ09wZXJhdGlvbigpLCAiYmluZGluZ09wZXJhdGlvbiIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ0VDbGFzcywgdGhpcy5nZXRJQmluZGluZ09wZXJhdGlvbigpLCAiZ2V0QmluZGluZ09wZXJhdGlvbiIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5wdXROYW1lIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJvdXRwdXROYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpQmluZGluZ0VDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0QmluZGluZ09wZXJhdGlvbnMiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nRUNsYXNzLCB0aGlzLmdldElQb3J0VHlwZSgpLCAiZ2V0UG9ydFR5cGUiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaUJpbmRpbmdFQ2xhc3MsIG51bGwsICJzZXRQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElQb3J0VHlwZSgpLCAicG9ydFR5cGUiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24uY2xhc3MsICJJQmluZGluZ09wZXJhdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgbnVsbCwgImFkZEJpbmRpbmdGYXVsdCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElCaW5kaW5nRmF1bHQoKSwgImJpbmRpbmdGYXVsdCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZ0ZhdWx0KCksICJnZXRCaW5kaW5nRmF1bHQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCB0aGlzLmdldElNYXAoKSwgImdldEJpbmRpbmdGYXVsdHMiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCB0aGlzLmdldElPcGVyYXRpb24oKSwgImdldE9wZXJhdGlvbiIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgbnVsbCwgInNldE9wZXJhdGlvbiIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElPcGVyYXRpb24oKSwgIm9wZXJhdGlvbiIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaUJpbmRpbmdPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmdJbnB1dCgpLCAiZ2V0QmluZGluZ0lucHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBudWxsLCAic2V0QmluZGluZ0lucHV0Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUJpbmRpbmdJbnB1dCgpLCAiYmluZGluZ0lucHV0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZ091dHB1dCgpLCAiZ2V0QmluZGluZ091dHB1dCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgbnVsbCwgInNldEJpbmRpbmdPdXRwdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJQmluZGluZ091dHB1dCgpLCAiYmluZGluZ091dHB1dCIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUJpbmRpbmdJbnB1dEVDbGFzcywgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQuY2xhc3MsICJJQmluZGluZ0lucHV0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpQmluZGluZ091dHB1dEVDbGFzcywgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0LmNsYXNzLCAiSUJpbmRpbmdPdXRwdXQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlCaW5kaW5nRmF1bHRFQ2xhc3MsIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0LmNsYXNzLCAiSUJpbmRpbmdGYXVsdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQuY2xhc3MsICJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlEZWZpbml0aW9uRUNsYXNzLCBqYXZheC53c2RsLkRlZmluaXRpb24uY2xhc3MsICJJRGVmaW5pdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZEJpbmRpbmciKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJQmluZGluZygpLCAiYmluZGluZyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZEltcG9ydCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElJbXBvcnQoKSwgImltcG9ydERlZiIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZE1lc3NhZ2UiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTWVzc2FnZSgpLCAibWVzc2FnZSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZE5hbWVzcGFjZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJlZml4Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJhZGRQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElQb3J0VHlwZSgpLCAicG9ydFR5cGUiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJhZGRTZXJ2aWNlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SVNlcnZpY2UoKSwgInNlcnZpY2UiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElCaW5kaW5nRmF1bHQoKSwgImNyZWF0ZUJpbmRpbmdGYXVsdCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmdJbnB1dCgpLCAiY3JlYXRlQmluZGluZ0lucHV0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZ091dHB1dCgpLCAiY3JlYXRlQmluZGluZ091dHB1dCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmdPcGVyYXRpb24oKSwgImNyZWF0ZUJpbmRpbmdPcGVyYXRpb24iKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElCaW5kaW5nKCksICJjcmVhdGVCaW5kaW5nIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJRmF1bHQoKSwgImNyZWF0ZUZhdWx0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJSW1wb3J0KCksICJjcmVhdGVJbXBvcnQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElJbnB1dCgpLCAiY3JlYXRlSW5wdXQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJjcmVhdGVNZXNzYWdlIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJT3BlcmF0aW9uKCksICJjcmVhdGVPcGVyYXRpb24iKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElPdXRwdXQoKSwgImNyZWF0ZU91dHB1dCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVBhcnQoKSwgImNyZWF0ZVBhcnQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElQb3J0KCksICJjcmVhdGVQb3J0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJUG9ydFR5cGUoKSwgImNyZWF0ZVBvcnRUeXBlIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJU2VydmljZSgpLCAiY3JlYXRlU2VydmljZSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZygpLCAiZ2V0QmluZGluZyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRCaW5kaW5ncyIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SU1hcCgpLCAiZ2V0SW1wb3J0cyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0SW1wb3J0cyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNYXAoKSwgImdldE1lc3NhZ2VzIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0TmFtZXNwYWNlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwcmVmaXgiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNYXAoKSwgImdldE5hbWVzcGFjZXMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVBvcnRUeXBlKCksICJnZXRQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRQb3J0VHlwZXMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXRQcmVmaXgiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVzcGFjZVVSSSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJU2VydmljZSgpLCAiZ2V0U2VydmljZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRTZXJ2aWNlcyIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUV4dGVuc2lvblJlZ2lzdHJ5KCksICJnZXRFeHRlbnNpb25SZWdpc3RyeSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgInNldEV4dGVuc2lvblJlZ2lzdHJ5Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUV4dGVuc2lvblJlZ2lzdHJ5KCksICJleHRlbnNpb25SZWdpc3RyeSIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXREb2N1bWVudEJhc2VVUkkiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJzZXREb2N1bWVudEJhc2VVUkkiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRvY3VtZW50QmFzZSIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVR5cGVzKCksICJjcmVhdGVUeXBlcyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJU2VydmljZSgpLCAicmVtb3ZlU2VydmljZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElCaW5kaW5nKCksICJyZW1vdmVCaW5kaW5nIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVBvcnRUeXBlKCksICJyZW1vdmVQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJyZW1vdmVNZXNzYWdlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElUeXBlcygpLCAiZ2V0VHlwZXMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJzZXRUeXBlcyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElUeXBlcygpLCAidHlwZXMiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlJbXBvcnRFQ2xhc3MsIGphdmF4LndzZGwuSW1wb3J0LmNsYXNzLCAiSUltcG9ydCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUxpc3RFQ2xhc3MsIExpc3QuY2xhc3MsICJJTGlzdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaU1hcEVDbGFzcywgTWFwLmNsYXNzLCAiSU1hcCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaXVybEVDbGFzcywgVVJMLmNsYXNzLCAiSVVSTCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUV4dGVuc2lvblJlZ2lzdHJ5RUNsYXNzLCBFeHRlbnNpb25SZWdpc3RyeS5jbGFzcywgIklFeHRlbnNpb25SZWdpc3RyeSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3ModHlwZXNFQ2xhc3MsIFR5cGVzLmNsYXNzLCAiVHlwZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbih0eXBlc0VDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0U2NoZW1hcyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbih0eXBlc0VDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0U2NoZW1hcyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIik7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpSXRlcmF0b3JFQ2xhc3MsIEl0ZXJhdG9yLmNsYXNzLCAiSUl0ZXJhdG9yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpVHlwZXNFQ2xhc3MsIGphdmF4LndzZGwuVHlwZXMuY2xhc3MsICJJVHlwZXMiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcywgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCAiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRfQ2hpbGRyZW4oKSwgdGhpcy5nZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSwgbnVsbCwgImNoaWxkcmVuIiwgbnVsbCwgMCwgLTEsIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLCBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudF9TY2hlbWEoKSwgdGhlWFNEUGFja2FnZS5nZXRYU0RTY2hlbWEoKSwgbnVsbCwgInNjaGVtYSIsIG51bGwsIDAsIDEsIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MobWVzc2FnZVJlZmVyZW5jZUVDbGFzcywgTWVzc2FnZVJlZmVyZW5jZS5jbGFzcywgIk1lc3NhZ2VSZWZlcmVuY2UiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZVJlZmVyZW5jZV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZVJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZVJlZmVyZW5jZV9FTWVzc2FnZSgpLCB0aGlzLmdldE1lc3NhZ2UoKSwgbnVsbCwgImVNZXNzYWdlIiwgbnVsbCwgMSwgMSwgTWVzc2FnZVJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLSAgICAgICAgaW5pdEVEYXRhVHlwZShxTmFtZUVEYXRhVHlwZSwgUU5hbWUuY2xhc3MsICJRTmFtZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFRGF0YVR5cGUob3BlcmF0aW9uVHlwZUVEYXRhVHlwZSwgT3BlcmF0aW9uVHlwZS5jbGFzcywgIk9wZXJhdGlvblR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RURhdGFUeXBlKGRvbUVsZW1lbnRFRGF0YVR5cGUsIEVsZW1lbnQuY2xhc3MsICJET01FbGVtZW50IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVEYXRhVHlwZSh3c2RsRXhjZXB0aW9uRURhdGFUeXBlLCBXU0RMRXhjZXB0aW9uLmNsYXNzLCAiV1NETEV4Y2VwdGlvbiIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFRGF0YVR5cGUoZG9tRG9jdW1lbnRFRGF0YVR5cGUsIERvY3VtZW50LmNsYXNzLCAiRE9NRG9jdW1lbnQiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIC8vIENyZWF0ZSByZXNvdXJjZQotICAgICAgICBjcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLSAgICB9Ci0KLX0gLy9XU0RMUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzUxY2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFNjaGVtYSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTY2hlbWEoWFNEU2NoZW1hIG5ld1NjaGVtYSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIFhTRFNjaGVtYSBvbGRTY2hlbWEgPSBzY2hlbWE7Ci0gICAgc2NoZW1hID0gbmV3U2NoZW1hOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQSwgb2xkU2NoZW1hLCBuZXdTY2hlbWEpOwotICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gbXNnczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSBuZXdTY2hlbWEpCi0gIHsKLSAgICBpZiAobmV3U2NoZW1hICE9IHNjaGVtYSkKLSAgICB7Ci0gICAgICBOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNjaGVtYSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19TQ0hFTUEsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld1NjaGVtYSAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2NoZW1hKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQSwgbnVsbCwgbXNncyk7Ci0gICAgICBtc2dzID0gYmFzaWNTZXRTY2hlbWEobmV3U2NoZW1hLCBtc2dzKTsKLSAgICAgIGlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BLCBuZXdTY2hlbWEsIG5ld1NjaGVtYSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19TQ0hFTUE6Ci0gICAgICAgICAgcmV0dXJuIGJhc2ljU2V0U2NoZW1hKG51bGwsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BOgotICAgICAgICByZXR1cm4gZ2V0U2NoZW1hKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BOgotICAgICAgICBzZXRTY2hlbWEoKFhTRFNjaGVtYSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BOgotICAgICAgICBzZXRTY2hlbWEoKFhTRFNjaGVtYSludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQToKLSAgICAgICAgcmV0dXJuIHNjaGVtYSAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLldTRExFbGVtZW50SW1wbCNyZWNvbmNpbGUob3JnLnczYy5kb20uRWxlbWVudCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZShFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgZWxlbWVudCA9IGNoYW5nZWRFbGVtZW50OyAvLyBUaGlzIGxpbmUgbWF5IG5vdCBuZWVkZWQuICAgIAotICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgbmV3U2NoZW1hID0gWFNEU2NoZW1hSW1wbC5jcmVhdGVTY2hlbWEoY2hhbmdlZEVsZW1lbnQpOwotICAgICAgc2V0U2NoZW1hKG5ld1NjaGVtYSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBjcmVhdGVTY2hlbWEoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJzY2hlbWEiKSAmJiBYU0RDb25zdGFudHMuaXNTY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UoZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgeyAgICAgCi0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2NoZW1hKCk7IAotICAgICAgeHNkU2NoZW1hLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICByZXR1cm4geHNkU2NoZW1hOyAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgZWxzZSBpZiAoZ2V0U2NoZW1hKCkgIT0gbnVsbCkKLSAgICAgIGVsZW1lbnQgPSBnZXRTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0KLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBpZiAobmV3RWxlbWVudCA9PSBudWxsICYmICFpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIGVsZW1lbnQgPSBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0RWxlbWVudEdlbihuZXdFbGVtZW50KTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSxYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHKTsKLQotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudFR5cGUoUU5hbWUgbmV3RWxlbWVudFR5cGUpCi0gIHsKLSAgICAvLyBTaG91bGQgbm90IGRvIGFueXRoaW5nLgotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlY29uY2lsZUF0dHJpYnV0ZXMoY2hhbmdlZEVsZW1lbnQpOwotICAgIGlmIChnZXRTY2hlbWEoKSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIGNzLi4uIHdoeSBkbyB3ZSBuZWVkIHRvIGRvIHRoaXM/IGlzbid0IHRoZSBzY2hlbWEgdGFraW5nIGNhcmUgb2YgdGhpcyBpdHNlbGY/Ci0gICAgLy8KLSAgICBpZiAoY2hhbmdlZEVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5TQ0hFTUFMT0NBVElPTl9BVFRSSUJVVEUpKQotICAgICAgCWdldFNjaGVtYSgpLnNldFNjaGVtYUxvY2F0aW9uKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuU0NIRU1BTE9DQVRJT05fQVRUUklCVVRFKSk7Ci0gICAgaWYgKGNoYW5nZWRFbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpCi0gICAgCWdldFNjaGVtYSgpLnNldFNjaGVtYUxvY2F0aW9uKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpOwotICB9Ci0gIAotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAJaWYgKHNjaGVtYSA9PSBudWxsKSAvLyBrYiBOb3RlOiBUaGlzIGNhc2UgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlbi4KLSAgCXsgICAgIAotICAJICAvLyBjcyAuLi4gd2h5IGRvIHdlIGRvIHRoaXMgaWYgaXRzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW4/Ci0gIAkgIC8vIElzIHRoZXJlIGEgc2NlbmFyaW8gd2hlcmUgdGhpcyBpcyBhIHVzZWZ1bGwgZmFsbGJhY2s/Ci0gIAkgIC8vIFVuZGVyIHdoYXQgY29uZGl0aW9ucyBkb2VzIHRoaXMgY29kZSBnZXQgZXhlY3V0ZWQgKGkuZS4gd2h5IHdvdWxkIHNjaGVtYSA9PSBudWxsKT8KLSAgICAgIHNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotICAgICAgc2NoZW1hLnNldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCJ4c2QiKTsKLSAgICAgIHNjaGVtYS5zZXRUYXJnZXROYW1lc3BhY2UoImh0dHA6Ly90ZW1wdXJpLm9yZy8iKTsKLSAgICAgIGphdmEudXRpbC5NYXAgcU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCA9IHNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwLnB1dCgiIiwgc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0Ci0gICAgICAgIChzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKSxvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwotICAgICAgYWRvcHQoc2NoZW1hKTsKLSAgICAgIHNjaGVtYS51cGRhdGVFbGVtZW50KHRydWUpOwotICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlbGVtZW50ID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAJYWRvcHQoc2NoZW1hKTsKLSAgICAgICAgc2NoZW1hLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBlbGVtZW50ID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLSAgfQotIAotICBwcml2YXRlIHZvaWQgYWRvcHQoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgaWYgKGRvY3VtZW50ID09IG51bGwpCi0gICAgICBkb2N1bWVudCA9ICgoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb24pLnVwZGF0ZURvY3VtZW50KCk7Ci0gICAgCi0gICAgaWYgKHhzZFNjaGVtYS5nZXREb2N1bWVudCgpICE9IG51bGwpCi0gICAgCXhzZFNjaGVtYS5zZXREb2N1bWVudChudWxsKTsKLSAgICAKLSAgICB4c2RTY2hlbWEuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotICB9Ci0gIAotICAvKgotICBwcml2YXRlIEVsZW1lbnQgYWRvcHQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpCi0gICAgICByZXR1cm4gZWxlbWVudDsKLQotICAgIERvY3VtZW50IGRvY3VtZW50ID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudCgpOwotICAgIGlmIChkb2N1bWVudCA9PSBudWxsKQotICAgICAgZG9jdW1lbnQgPSAoKERlZmluaXRpb25JbXBsKSBkZWZpbml0aW9uKS51cGRhdGVEb2N1bWVudCgpOwotICAgIAotICAgIHJldHVybiAoRWxlbWVudClkb2N1bWVudC5pbXBvcnROb2RlKGVsZW1lbnQsdHJ1ZSk7Ci0gIH0KLSAgKi8KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRfU2NoZW1hKCkpCi0gICAgewotICAgICAgLy8gV2UgZ290IGEgbmV3IHNjaGVtYSBzbyByZS1wYXJlbnQgaXQuCi0gICAgICBzY2hlbWEuc2V0RG9jdW1lbnQobnVsbCk7Ci0gICAgICBzY2hlbWEuc2V0RWxlbWVudChudWxsKTsKLSAgICAgIGFkb3B0KHNjaGVtYSk7Ci0gICAgICBzY2hlbWEudXBkYXRlRWxlbWVudCgpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExFbGVtZW50X0VsZW1lbnQoKSkKLSAgICB7Ci0gICAgICAvLyBBcmUgd2UgY3JlYXRpbmcgYSBzY2hlbWEgdG9vIG1hbnkgdGltZXM/Ci0gICAgICBzZXRTY2hlbWEoY3JlYXRlU2NoZW1hKGVsZW1lbnQpKTsgLy8gZWxlbWVudCBpcyBub3QgbnVsbAotICAgIH0gICAgCi0gIH0KLX0gLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvd3NkbDRqL1dTRExGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYmIxODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMV3JpdGVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETEZhY3RvcnlJbXBsIGV4dGVuZHMgV1NETEZhY3RvcnkKLXsKLSAgCi0gIC8vcHVibGljIHN0YXRpYyBXU0RMRmFjdG9yeSBuZXdJbnN0YW5jZSgpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIC8vewotICAvLyAgcmV0dXJuIG5ldyBXU0RMRmFjdG9yeUltcGwoKTsKLSAgLy99Ci0gIAotICBwdWJsaWMgV1NETEZhY3RvcnlJbXBsKCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgRGVmaW5pdGlvbiBuZXdEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICB9Ci0gIAotICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnkgbmV3UG9wdWxhdGVkRXh0ZW5zaW9uUmVnaXN0cnkoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMUmVhZGVyIG5ld1dTRExSZWFkZXIoKQotICB7Ci0gICAgV1NETFJlYWRlciByZWFkZXIgPSBuZXcgV1NETFJlYWRlckltcGwoKTsKLSAgICByZWFkZXIuc2V0RmFjdG9yeUltcGxOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICByZXR1cm4gcmVhZGVyOwotICB9Ci0gIAotICBwdWJsaWMgV1NETFdyaXRlciBuZXdXU0RMV3JpdGVyKCkKLSAgewotICAgIHJldHVybiBuZXcgV1NETFdyaXRlckltcGwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETFJlYWRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvd3NkbDRqL1dTRExSZWFkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MzhkNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETFJlYWRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETExvY2F0b3I7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXU0RMUmVhZGVySW1wbCBpbXBsZW1lbnRzIFdTRExSZWFkZXIKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgZmFjdG9yeUltcGxOYW1lOwotICBwcml2YXRlIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dFJlZzsKLSAgCi0gIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeSBnZXRFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gZXh0UmVnOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBleHRSZWcpCi0gIHsKLSAgICB0aGlzLmV4dFJlZyA9IGV4dFJlZzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SW1wbE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZhY3RvcnlJbXBsTmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RmFjdG9yeUltcGxOYW1lKFN0cmluZyBmYWN0b3J5SW1wbE5hbWUpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdGhpcy5mYWN0b3J5SW1wbE5hbWUgPSBmYWN0b3J5SW1wbE5hbWU7Ci0gIH0KLQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICB7IAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZWFkIHRoZSBXU0RMIGRvY3VtZW50IGFjY2Vzc2libGUgdmlhIHRoZSBzcGVjaWZpZWQKLSAgICogVVJJIGludG8gYSBXU0RMIGRlZmluaXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB3c2RsVVJJIGEgVVJJIChjYW4gYmUgYSBmaWxlbmFtZSBvciBVUkwpIHBvaW50aW5nIHRvIGEKLSAgICogV1NETCBYTUwgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbi4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRXU0RMKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgVVJJIHVyaTsgICAgCi0gICAgaWYgKGhhc1Byb3RvY29sKHdzZGxVUkkpKQotICAgICAgIHVyaSA9IFVSSS5jcmVhdGVVUkkod3NkbFVSSSk7Ci0gICAgZWxzZQotICAgICAgIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHdzZGxVUkkpOwotICAKLSAgICAvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQsIGNyZWF0ZSBhIHdzZGwgcmVzb3VyY2UsIGFuZCBsb2FkIHRoZSBtYWluIHdzZGwgZmlsZSBpbnRvIGl0LgotICAgIAotICAJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7ICAJCi0gIAlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQotICAJV1NETFJlc291cmNlSW1wbCB3c2RsTWFpblJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi53c2RsIikpOwotICAJd3NkbE1haW5SZXNvdXJjZS5zZXRVUkkodXJpKTsKLSAgCQotICAgIHRyeQotICAgIHsKLSAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0odXJpKTsKLSAgICAgIHdzZGxNYWluUmVzb3VyY2UubG9hZChpbnB1dFN0cmVhbSwgcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0gICAgICAvL3dzZGxNYWluUmVzb3VyY2UubG9hZChyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5JTlZBTElEX1dTREwsIldTREwgVVJJOiAiK3dzZGxVUkksZSk7Ci0gICAgfQotICAgIAotICAgIC8vIFJldHVybiB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIG1haW4gcmVzb3VyY2UuCi0gICAgcmV0dXJuIHdzZGxNYWluUmVzb3VyY2UuZ2V0RGVmaW5pdGlvbigpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGhhc1Byb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsgICAgIAotCQlpZiAodXJpICE9IG51bGwpCi0JCXsKLQkJICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZigiOiIpOwotCQkgIGlmIChpbmRleCAhPSAtMSAmJiBpbmRleCA+IDIpIC8vIGFzc3VtZSBwcm90b2NvbCB3aXRoIGJlIGxlbmd0aCAzIHNvIHRoYXQgdGhlJ0MnIGluICdDOi8nIGlzIG5vdCBpbnRlcnByZXRlZCBhcyBhIHByb3RvY29sCi0JCSAgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCSAgfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0gIH0gCi0gIAotICAvKioKLSAgICogUmVhZCB0aGUgV1NETCBkb2N1bWVudCBhY2Nlc3NpYmxlIHZpYSB0aGUgc3BlY2lmaWVkCi0gICAqIFVSSSBpbnRvIGEgV1NETCBkZWZpbml0aW9uLgotICAgKgotICAgKiBAcGFyYW0gY29udGV4dFVSSSB0aGUgY29udGV4dCBpbiB3aGljaCB0byByZXNvbHZlIHRoZQotICAgKiB3c2RsVVJJLCBpZiB0aGUgd3NkbFVSSSBpcyByZWxhdGl2ZS4gQ2FuIGJlIG51bGwsIGluIHdoaWNoCi0gICAqIGNhc2UgaXQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcGFyYW0gd3NkbFVSSSBhIFVSSSAoY2FuIGJlIGEgZmlsZW5hbWUgb3IgVVJMKSBwb2ludGluZyB0byBhCi0gICAqIFdTREwgWE1MIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24uCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiByZWFkV1NETChTdHJpbmcgY29udGV4dFVSSSwgU3RyaW5nIHdzZGxVUkkpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLCJOb3QgSW1wbGVtZW50ZWQiKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBzcGVjaWZpZWQgJmx0O3dzZGw6ZGVmaW5pdGlvbnMmZ3Q7IGVsZW1lbnQgaW50byBhIFdTREwKLSAgICogZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgb2YgdGhlIFdTREwgZGVmaW5pdGlvbgotICAgKiBkZXNjcmliZWQgYnkgdGhlIGVsZW1lbnQuIFdpbGwgYmUgc2V0IGFzIHRoZSBkb2N1bWVudEJhc2VVUkkKLSAgICogb2YgdGhlIHJldHVybmVkIERlZmluaXRpb24uIENhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIGl0Ci0gICAqIHdpbGwgYmUgaWdub3JlZC4KLSAgICogQHBhcmFtIGRlZmluaXRpb25zRWxlbWVudCB0aGUgJmx0O3dzZGw6ZGVmaW5pdGlvbnMmZ3Q7IGVsZW1lbnQKLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbiBkZXNjcmliZWQgYnkgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiByZWFkV1NETChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLCBFbGVtZW50IGRlZmluaXRpb25zRWxlbWVudCkKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5PVEhFUl9FUlJPUiwiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgc3BlY2lmaWVkIFdTREwgZG9jdW1lbnQgaW50byBhIFdTREwgZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgb2YgdGhlIFdTREwgZGVmaW5pdGlvbgotICAgKiBkZXNjcmliZWQgYnkgdGhlIGRvY3VtZW50LiBXaWxsIGJlIHNldCBhcyB0aGUgZG9jdW1lbnRCYXNlVVJJCi0gICAqIG9mIHRoZSByZXR1cm5lZCBEZWZpbml0aW9uLiBDYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBpdAotICAgKiB3aWxsIGJlIGlnbm9yZWQuCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgdGhlIFdTREwgZG9jdW1lbnQsIGFuIFhNTCAKLSAgICogZG9jdW1lbnQgb2JleWluZyB0aGUgV1NETCBzY2hlbWEuCi0gICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24gZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRXU0RMKFN0cmluZyBkb2N1bWVudEJhc2VVUkksIERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5PVEhFUl9FUlJPUiwiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIFdTREwgZG9jdW1lbnQgaW50byBhIFdTREwgZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgb2YgdGhlIFdTREwgZGVmaW5pdGlvbgotICAgKiBkZXNjcmliZWQgYnkgdGhlIGRvY3VtZW50LiBXaWxsIGJlIHNldCBhcyB0aGUgZG9jdW1lbnRCYXNlVVJJCi0gICAqIG9mIHRoZSByZXR1cm5lZCBEZWZpbml0aW9uLiBDYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBpdAotICAgKiB3aWxsIGJlIGlnbm9yZWQuCi0gICAqIEBwYXJhbSBpbnB1dFNvdXJjZSBhbiBJbnB1dFNvdXJjZSBwb2ludGluZyB0byB0aGUKLSAgICogV1NETCBkb2N1bWVudCwgYW4gWE1MIGRvY3VtZW50IG9iZXlpbmcgdGhlIFdTREwgc2NoZW1hLgotICAgKiBAcmV0dXJuIHRoZSBkZWZpbml0aW9uIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnQgcG9pbnRlZCB0bwotICAgKiBieSB0aGUgSW5wdXRTb3VyY2UuCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiByZWFkV1NETChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLCBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSkKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gIAlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExSZXNvdXJjZUltcGwgd3NkbE1haW5SZXNvdXJjZSA9IChXU0RMUmVzb3VyY2VJbXBsKXJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIioud3NkbCIpKTsKLQotICAJdHJ5Ci0gICAgewotICAgICAgaWYgKGRvY3VtZW50QmFzZVVSSSAhPSBudWxsKQotICAgICAgICB3c2RsTWFpblJlc291cmNlLnNldFVSSShjcmVhdGVVUkkoZG9jdW1lbnRCYXNlVVJJKSk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dChXU0RMUmVzb3VyY2VJbXBsLkNPTlRJTlVFX09OX0xPQURfRVJST1IsbmV3IEJvb2xlYW4oZmFsc2UpKTsKLSAgICAgIHdzZGxNYWluUmVzb3VyY2UubG9hZChpbnB1dFNvdXJjZS5nZXRCeXRlU3RyZWFtKCksIHJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uSU5WQUxJRF9XU0RMLCAiIiwgaW9lKTsKLSAgICB9Ci0gICAgCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd3NkbE1haW5SZXNvdXJjZS5nZXREZWZpbml0aW9uKCk7Ci0gICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKGRvY3VtZW50QmFzZVVSSSk7Ci0gICAgCi0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIFdTREwgZG9jdW1lbnQgaW50byBhIFdTREwgZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGxvY2F0b3IgQSBXU0RMTG9jYXRvciBvYmplY3QgdXNlZCB0byBwcm92aWRlIElucHV0U291cmNlcwotICAgKiBwb2ludGluZyB0byB0aGUgd3NkbCBmaWxlLgotICAgKiBAcmV0dXJuIHRoZSBkZWZpbml0aW9uIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnQKLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRXU0RMKFdTRExMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLCJOb3QgSW1wbGVtZW50ZWQiKTsKLSAgfQotCi0gIHByaXZhdGUgVVJJIGNyZWF0ZVVSSShTdHJpbmcgdXJpU3RyaW5nKQotICB7Ci0gICAgaWYgKGhhc1Byb3RvY29sKHVyaVN0cmluZykpCi0gICAgICAgcmV0dXJuIFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKLSAgICBlbHNlCi0gICAgICAgcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKHVyaVN0cmluZyk7Ci0gIH0gCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvd3NkbDRqL1dTRExXcml0ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL3dzZGw0ai9XU0RMV3JpdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmFmMTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvd3NkbDRqL1dTRExXcml0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLndzZGw0ajsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExXcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIFdTRExXcml0ZXJJbXBsIGltcGxlbWVudHMgV1NETFdyaXRlcgotewotICAvKioKLSAgICogU2V0cyB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgICogPHA+Ci0gICAqIFRoZXJlIGFyZSBubyBtaW5pbXVtIGZlYXR1cmVzIHRoYXQgbXVzdCBiZSBzdXBwb3J0ZWQuCi0gICAqIDxwPgotICAgKiBBbGwgZmVhdHVyZSBuYW1lcyBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCwgSmF2YSBwYWNrYWdlIHN0eWxlLiBBbGwKLSAgICogbmFtZXMgc3RhcnRpbmcgd2l0aCBqYXZheC53c2RsLiBhcmUgcmVzZXJ2ZWQgZm9yIGZlYXR1cmVzIGRlZmluZWQKLSAgICogYnkgdGhlIEpXU0RMIHNwZWNpZmljYXRpb24uIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgaW1wbGVtZW50YXRpb24tCi0gICAqIHNwZWNpZmljIGZlYXR1cmVzIGJlIGZ1bGx5LXF1YWxpZmllZCB0byBtYXRjaCB0aGUgcGFja2FnZSBuYW1lCi0gICAqIG9mIHRoYXQgaW1wbGVtZW50YXRpb24uIEZvciBleGFtcGxlOiBjb20uYWJjLmZlYXR1cmVOYW1lCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHRvIGJlIHNldC4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQgdGhlIGZlYXR1cmUgdG8uCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmZWF0dXJlIG5hbWUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqIEBzZWUgI2dldEZlYXR1cmUoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmZWF0dXJlLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byBnZXQgdGhlIHZhbHVlIG9mLgotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmVhdHVyZSBuYW1lIGlzIG5vdCByZWNvZ25pemVkLgotICAgKiBAc2VlICNzZXRGZWF0dXJlKFN0cmluZywgYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEZlYXR1cmUoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgewotICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vdCBJbXBsZW1lbnRlZCIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIGRvY3VtZW50IGdlbmVyYXRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgV1NETCBtb2RlbC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudChEZWZpbml0aW9uIHdzZGxEZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gKChEZWZpbml0aW9uSW1wbCl3c2RsRGVmKS5nZXREb2N1bWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIHRoZSBzcGVjaWZpZWQgV1NETCBkZWZpbml0aW9uIHRvIHRoZSBzcGVjaWZpZWQgV3JpdGVyLgotICAgKgotICAgKiBAcGFyYW0gd3NkbERlZiB0aGUgV1NETCBkZWZpbml0aW9uIHRvIGJlIHdyaXR0ZW4uCi0gICAqIEBwYXJhbSBzaW5rIHRoZSBXcml0ZXIgdG8gd3JpdGUgdGhlIHhtbCB0by4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlV1NETChEZWZpbml0aW9uIHdzZGxEZWYsIFdyaXRlciBzaW5rKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotCi0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLSAgICAgIAotICAgICAgLy8gVW5sZXNzIGEgd2lkdGggaXMgc2V0LCB0aGVyZSB3aWxsIGJlIG9ubHkgbGluZSBicmVha3MgYnV0IG5vIGluZGVudGF0aW9uLgotICAgICAgLy8gVGhlIElCTSBKREsgYW5kIHRoZSBTdW4gSkRLIGRvbid0IGFncmVlIG9uIHRoZSBwcm9wZXJ0eSBuYW1lLAotICAgICAgLy8gc28gd2Ugc2V0IHRoZW0gYm90aC4KLSAgICAgIC8vCi0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbn1pbmRlbnQtYW1vdW50IiwgIjIiKTsKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICIyIik7Ci0gICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZW5jb2RpbmcpOwotICAgICAgfQotICAgICAgCi0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9ICgoRGVmaW5pdGlvbkltcGwpd3NkbERlZikuZ2V0RG9jdW1lbnQoKTsKLSAgICAgIGlmIChkb2N1bWVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICAoKERlZmluaXRpb25JbXBsKXdzZGxEZWYpLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCl3c2RsRGVmKS5nZXREb2N1bWVudCgpOwotICAgICAgfQotICAgICAgCi0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoc2luaykpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uT1RIRVJfRVJST1IsIkZhaWxlZCB0byBzYXZlIERlZmluaXRpb25zLiIsZXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSB0aGUgc3BlY2lmaWVkIFdTREwgZGVmaW5pdGlvbiB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIHdzZGxEZWYgdGhlIFdTREwgZGVmaW5pdGlvbiB0byBiZSB3cml0dGVuLgotICAgKiBAcGFyYW0gc2luayB0aGUgT3V0cHV0U3RyZWFtIHRvIHdyaXRlIHRoZSB4bWwgdG8uCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVdTREwoRGVmaW5pdGlvbiB3c2RsRGVmLCBPdXRwdXRTdHJlYW0gc2luaykgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotCi0gICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoKERlZmluaXRpb25JbXBsKXdzZGxEZWYpLmVSZXNvdXJjZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHJlc291cmNlLnNhdmUoc2luayxudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5PVEhFUl9FUlJPUiwiRmFpbGVkIHRvIHNhdmUgRGVmaW5pdGlvbnMuIixlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvUmVjb25jaWxhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1JlY29uY2lsYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQyYTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvUmVjb25jaWxhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vLyBUT0RPLi4uIHdoeSBkbyB3ZSBuZWVkIHRoaXM/Ci0vLyAKLXB1YmxpYyBpbnRlcmZhY2UgUmVjb25jaWxhYmxlIAotewotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCk7Ci0gIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKTsKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KTsKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzYyMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotICAvKioKLSAgICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBXU0RMUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBXU0RMQWRhcHRlckZhY3RvcnkoKQotICB7Ci0gICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG1vZGVsUGFja2FnZSA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgewotICAgICAgcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0gICAgbmV3IFdTRExTd2l0Y2goKQotICAgIHsKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlUG9ydFR5cGUoUG9ydFR5cGUgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlUG9ydFR5cGVBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VPcGVyYXRpb24oT3BlcmF0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU9wZXJhdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2UoTWVzc2FnZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlUGFydChQYXJ0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVBhcnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nKEJpbmRpbmcgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ0FkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlU2VydmljZShTZXJ2aWNlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNlcnZpY2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlUG9ydEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlRGVmaW5pdGlvbihEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZURlZmluaXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJbXBvcnQoSW1wb3J0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUltcG9ydEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUV4dGVuc2libGVFbGVtZW50KEV4dGVuc2libGVFbGVtZW50IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUV4dGVuc2libGVFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSW5wdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VPdXRwdXQoT3V0cHV0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU91dHB1dEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUZhdWx0KEZhdWx0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUZhdWx0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nSW5wdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ091dHB1dEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ0ZhdWx0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlTmFtZXNwYWNlKE5hbWVzcGFjZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVOYW1lc3BhY2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJUG9ydFR5cGUoamF2YXgud3NkbC5Qb3J0VHlwZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJUG9ydFR5cGVBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJT3BlcmF0aW9uKGphdmF4LndzZGwuT3BlcmF0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlPcGVyYXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJSW5wdXQoamF2YXgud3NkbC5JbnB1dCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJSW5wdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJT3V0cHV0KGphdmF4LndzZGwuT3V0cHV0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlPdXRwdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJRmF1bHQoamF2YXgud3NkbC5GYXVsdCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJRmF1bHRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJTWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2Ugb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSU1lc3NhZ2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJUGFydChqYXZheC53c2RsLlBhcnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSVBhcnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJU2VydmljZShqYXZheC53c2RsLlNlcnZpY2Ugb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSVNlcnZpY2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJUG9ydChqYXZheC53c2RsLlBvcnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSVBvcnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZyhqYXZheC53c2RsLkJpbmRpbmcgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUJpbmRpbmdBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ09wZXJhdGlvbihqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUJpbmRpbmdPcGVyYXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ0lucHV0KGphdmF4LndzZGwuQmluZGluZ0lucHV0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlCaW5kaW5nSW5wdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ091dHB1dChqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUJpbmRpbmdPdXRwdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ0ZhdWx0KGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlCaW5kaW5nRmF1bHRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlEZWZpbml0aW9uKGphdmF4LndzZGwuRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlJbXBvcnQoamF2YXgud3NkbC5JbXBvcnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUltcG9ydEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlMaXN0KExpc3Qgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUxpc3RBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJTWFwKE1hcCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJTWFwQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSVVSTChVUkwgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSVVSTEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJRXh0ZW5zaW9uUmVnaXN0cnlBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VUeXBlcyhUeXBlcyBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUeXBlc0FkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlJdGVyYXRvcihJdGVyYXRvciBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJSXRlcmF0b3JBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJVHlwZXMoamF2YXgud3NkbC5UeXBlcyBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJVHlwZXNBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZVJlZmVyZW5jZShNZXNzYWdlUmVmZXJlbmNlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VSZWZlcmVuY2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICB9OwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotICAgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpCi0gIHsKLSAgICByZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5XU0RMRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMRWxlbWVudEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlIDxlbT5Qb3J0IFR5cGU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydFR5cGVBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24gPGVtPk9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlT3BlcmF0aW9uQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0IDxlbT5QYXJ0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFydEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcgPGVtPkJpbmRpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZwotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiA8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSA8ZW0+U2VydmljZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0IDxlbT5Qb3J0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uIDxlbT5EZWZpbml0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVmaW5pdGlvbkFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkltcG9ydCA8ZW0+SW1wb3J0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJbXBvcnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5FeHRlbnNpYmxlRWxlbWVudCA8ZW0+RXh0ZW5zaWJsZSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuc2libGVFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW5wdXQgPGVtPklucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlucHV0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dHB1dEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkZhdWx0IDxlbT5GYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVGYXVsdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdJbnB1dCA8ZW0+QmluZGluZyBJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ0lucHV0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ091dHB1dCA8ZW0+QmluZGluZyBPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nT3V0cHV0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0ZhdWx0IDxlbT5CaW5kaW5nIEZhdWx0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nRmF1bHRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5OYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlTmFtZXNwYWNlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuUG9ydFR5cGUgPGVtPklQb3J0IFR5cGU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5Qb3J0VHlwZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJUG9ydFR5cGVBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5PcGVyYXRpb24gPGVtPklPcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5PcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSU9wZXJhdGlvbkFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLklucHV0IDxlbT5JSW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5JbnB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJSW5wdXRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5PdXRwdXQgPGVtPklPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5PdXRwdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSU91dHB1dEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkZhdWx0IDxlbT5JRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5GYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJRmF1bHRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5NZXNzYWdlIDxlbT5JTWVzc2FnZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLk1lc3NhZ2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSU1lc3NhZ2VBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5QYXJ0IDxlbT5JUGFydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLlBhcnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSVBhcnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5TZXJ2aWNlIDxlbT5JU2VydmljZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLlNlcnZpY2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSVNlcnZpY2VBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5Qb3J0IDxlbT5JUG9ydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLlBvcnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSVBvcnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nIDxlbT5JQmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmcKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUJpbmRpbmdBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIDxlbT5JQmluZGluZyBPcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ0lucHV0IDxlbT5JQmluZGluZyBJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdJbnB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJQmluZGluZ0lucHV0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ091dHB1dCA8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ091dHB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJQmluZGluZ091dHB1dEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCA8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUJpbmRpbmdGYXVsdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkRlZmluaXRpb24gPGVtPklEZWZpbml0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuRGVmaW5pdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJRGVmaW5pdGlvbkFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkltcG9ydCA8ZW0+SUltcG9ydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLkltcG9ydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJSW1wb3J0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5MaXN0IDxlbT5JTGlzdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZhLnV0aWwuTGlzdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJTGlzdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLnV0aWwuTWFwIDxlbT5JTWFwPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmEudXRpbC5NYXAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSU1hcEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLm5ldC5VUkwgPGVtPklVUkw8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YS5uZXQuVVJMCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlVUkxBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IDxlbT5JRXh0ZW5zaW9uIFJlZ2lzdHJ5PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJRXh0ZW5zaW9uUmVnaXN0cnlBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5UeXBlcyA8ZW0+VHlwZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXMKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlVHlwZXNBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YS51dGlsLkl0ZXJhdG9yIDxlbT5JSXRlcmF0b3I8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlJdGVyYXRvckFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLlR5cGVzIDxlbT5JVHlwZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5UeXBlcwotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJVHlwZXNBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlUmVmZXJlbmNlIDxlbT5NZXNzYWdlIFJlZmVyZW5jZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VSZWZlcmVuY2VBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19IC8vV1NETEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExEZWZpbml0aW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMRGVmaW5pdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDllZjUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExEZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExQYWNrYWdlSW1wbDsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGw7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRGVmaW5pdGlvbkZhY3RvcnkgZXh0ZW5kcyBjb20uaWJtLndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeUltcGwKLXsKLQotICBwcml2YXRlIHN0YXRpYyBXU0RMRGVmaW5pdGlvbkZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0gIHB1YmxpYyBXU0RMRGVmaW5pdGlvbkZhY3RvcnkoKQotICB7Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBXU0RMIHBhY2thZ2UgaXMgaW5pdGlhbGl6ZWQuCi0gICAgV1NETFBhY2thZ2VJbXBsLmluaXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgRGVmaW5pdGlvbi4KLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkRlZmluaXRpb24gbmV3RGVmaW5pdGlvbigpCi0gIHsKLSAgICBqYXZheC53c2RsLkRlZmluaXRpb24gZGVmaW5pdGlvbiA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBmYWN0b3J5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgIGluc3RhbmNlID0gbmV3IFdTRExEZWZpbml0aW9uRmFjdG9yeSgpOwotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgV1NETFJlYWRlci4KLSAgICovCi0gIHB1YmxpYyBXU0RMUmVhZGVyIG5ld1dTRExSZWFkZXIoKQotICB7Ci0gICAgV1NETFJlYWRlciByZWFkZXIgPSBuZXcgV1NETFJlYWRlckltcGwoKTsKLSAgICByZWFkZXIuc2V0RmFjdG9yeUltcGxOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICByZXR1cm4gcmVhZGVyOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETE1vZGVsTG9jYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMTW9kZWxMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOWIwYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMTW9kZWxMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciBpbnRlcmZhY2UgdXNlZCBieSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0SW1wbCB0byBmaW5kIHJlZmVyZW5jZWQgcmVzb3VyY2VzLgotICogV2hlbiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlZCBieSBhIHdzZGwgaW1wb3J0IG5lZWRzIHRvIGJlIGRldGVybWluZWQsIAotICogdGhlIGNvbnRhaW5pbmcge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZX0KLSAqIHdpbGwgYmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbCNnZXRSZWdpc3RlcmVkQWRhcHRlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UsT2JqZWN0KSBpbnNwZWN0ZWR9IAotICogZm9yIGFuIGFkYXB0ZXIgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLgotICogQXMgc3VjaCwgeW91IGNhbiByZWdpc3RlciBhbiBhZGFwdGVyIGZhY3RvcnkgbGlrZSB0aGlzIHRvIHRhaWxvciB0aGUgYWxnb3JpdGhtIHVzZWQgdG8gbG9jYXRlIHRoZSByZXNvdXJjZSA6Ci0gKjxwcmU+Ci0gKiAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0gKiAgcmVzb3VyY2VTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZAotICogICAgKG5ldyBBZGFwdGVyRmFjdG9yeUltcGwoKQotICogICAgIHsKLSAqICAgICAgIGNsYXNzIEN1c3RvbVVSSVJlc29sdmVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBXU0RMTW9kZWxMb2NhdG9yCi0gKiAgICAgICB7Ci0gKiAgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVVSSShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pOwotICogICAgICAgICB7Ci0gKiAgICAgICAgICAgcmV0dXJuIG51bGw7ICAvLyBBZGRpdGlvbmFsIGxvZ2ljLi4uCi0gKiAgICAgICAgIH0KLSAqCi0gKiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWRhdHBlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gKiAgICAgICAgIHsKLSAqICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBXU0RMTW9kZWxMb2NhdG9yLmNsYXNzOwotICogICAgICAgICB9Ci0gKiAgICAgICB9Ci0gKgotICogICAgICAgcHJvdGVjdGVkIEN1c3RvbVVSSVJlc29sdmVyIGN1c3RvbVVSSVJlc29sdmVyID0gbmV3IEN1c3RvbVVSSVJlc29sdmVyKCk7Ci0gKgotICogICAgICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAqICAgICAgIHsKLSAqICAgICAgICAgcmV0dXJuIHR5cGUgPT0gV1NETE1vZGVsTG9jYXRvci5jbGFzczsKLSAqICAgICAgIH0KLSAqCi0gKiAgICAgICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICogICAgICAgewotICogICAgICAgICByZXR1cm4gY3VzdG9tVVJJUmVzb2x2ZXI7Ci0gKiAgICAgICB9Ci0gKiAgICAgfSk7Ci0gKjwvcHJlPgotICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWwjZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLE9iamVjdCkKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMTW9kZWxMb2NhdG9yCi17Ci0JcHVibGljIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTg2YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwKLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKQotICB7Ci0gICAgUmVzb3VyY2UgcmVzdWx0ID0gbmV3IFdTRExSZXNvdXJjZUltcGwodXJpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19IC8vV1NETFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETFN3aXRjaC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjA2NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFN3aXRjaCB7Ci0gIC8qKgotICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgV1NETFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgV1NETFN3aXRjaCgpCi0gIHsKLSAgICBpZiAobW9kZWxQYWNrYWdlID09IG51bGwpCi0gICAgewotICAgICAgbW9kZWxQYWNrYWdlID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KQotICB7Ci0gICAgRUNsYXNzIHRoZUVDbGFzcyA9IHRoZUVPYmplY3QuZUNsYXNzKCk7Ci0gICAgaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRToKLSAgICAgICAgewotICAgICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQocG9ydFR5cGUpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OOgotICAgICAgICB7Ci0gICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZU9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KG9wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0U6Ci0gICAgICAgIHsKLSAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChtZXNzYWdlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUOgotICAgICAgICB7Ci0gICAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVBhcnQocGFydCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQocGFydCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSVBhcnQocGFydCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElORzoKLSAgICAgICAgewotICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KGJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJsZUVsZW1lbnQoYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRToKLSAgICAgICAgewotICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KHNlcnZpY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNlcnZpY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlUG9ydChwb3J0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudChwb3J0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJUG9ydChwb3J0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChwb3J0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT046Ci0gICAgICAgIHsKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbil0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudChkZWZpbml0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChkZWZpbml0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBJbXBvcnQgaW1wb3J0XyA9IChJbXBvcnQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUltcG9ydChpbXBvcnRfKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChpbXBvcnRfKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSW1wb3J0KGltcG9ydF8pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUOgotICAgICAgICB7Ci0gICAgICAgICAgSW5wdXQgaW5wdXQgPSAoSW5wdXQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUlucHV0KGlucHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXNzYWdlUmVmZXJlbmNlKGlucHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChpbnB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUlucHV0KGlucHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWVzc2FnZVJlZmVyZW5jZShvdXRwdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KG91dHB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU91dHB1dChvdXRwdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUOgotICAgICAgICB7Ci0gICAgICAgICAgRmF1bHQgZmF1bHQgPSAoRmF1bHQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUZhdWx0KGZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXNzYWdlUmVmZXJlbmNlKGZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChmYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUZhdWx0KGZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IChCaW5kaW5nSW5wdXQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUJpbmRpbmdJbnB1dChiaW5kaW5nSW5wdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KGJpbmRpbmdJbnB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUJpbmRpbmdJbnB1dChiaW5kaW5nSW5wdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGJpbmRpbmdJbnB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSAoQmluZGluZ091dHB1dCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlQmluZGluZ091dHB1dChiaW5kaW5nT3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudChiaW5kaW5nT3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJQmluZGluZ091dHB1dChiaW5kaW5nT3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChiaW5kaW5nT3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUJpbmRpbmdGYXVsdChiaW5kaW5nRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KGJpbmRpbmdGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUJpbmRpbmdGYXVsdChiaW5kaW5nRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGJpbmRpbmdGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFOgotICAgICAgICB7Ci0gICAgICAgICAgTmFtZXNwYWNlIG5hbWVzcGFjZSA9IChOYW1lc3BhY2UpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTOgotICAgICAgICB7Ci0gICAgICAgICAgVHlwZXMgdHlwZXMgPSAoVHlwZXMpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVR5cGVzKHR5cGVzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudCh0eXBlcyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSVR5cGVzKHR5cGVzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudCh0eXBlcyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50ID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQodW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudCh1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudCh1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UOgotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudCh4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudCh4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMRWxlbWVudChXU0RMRWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBUeXBlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgVHlwZTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVBvcnRUeXBlKFBvcnRUeXBlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZShNZXNzYWdlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJ0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VQYXJ0KFBhcnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2UoU2VydmljZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlUG9ydChQb3J0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlZmluaXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZURlZmluaXRpb24oRGVmaW5pdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW1wb3J0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkltcG9ydDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUltcG9ydChJbXBvcnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2libGUgRWxlbWVudDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmxlIEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmxlRWxlbWVudChFeHRlbnNpYmxlRWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5wdXQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJbnB1dChJbnB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0cHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZU91dHB1dChPdXRwdXQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRmF1bHQoRmF1bHQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgSW5wdXQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBJbnB1dDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CaW5kaW5nIEZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZXNwYWNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlTmFtZXNwYWNlKE5hbWVzcGFjZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVBvcnQgVHlwZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JUG9ydCBUeXBlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSVBvcnRUeXBlKGphdmF4LndzZGwuUG9ydFR5cGUgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklPcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlPcGVyYXRpb24oamF2YXgud3NkbC5PcGVyYXRpb24gb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklJbnB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJSW5wdXQoamF2YXgud3NkbC5JbnB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU91dHB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSU91dHB1dChqYXZheC53c2RsLk91dHB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlGYXVsdChqYXZheC53c2RsLkZhdWx0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTWVzc2FnZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTWVzc2FnZTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlNZXNzYWdlKGphdmF4LndzZGwuTWVzc2FnZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVBhcnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVBhcnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJUGFydChqYXZheC53c2RsLlBhcnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklTZXJ2aWNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklTZXJ2aWNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSVNlcnZpY2UoamF2YXgud3NkbC5TZXJ2aWNlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JUG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JUG9ydDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlQb3J0KGphdmF4LndzZGwuUG9ydCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmc8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmc8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZyhqYXZheC53c2RsLkJpbmRpbmcgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JQmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ09wZXJhdGlvbihqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSUJpbmRpbmdJbnB1dChqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlCaW5kaW5nT3V0cHV0KGphdmF4LndzZGwuQmluZGluZ091dHB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ0ZhdWx0KGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlEZWZpbml0aW9uKGphdmF4LndzZGwuRGVmaW5pdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUltcG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSW1wb3J0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSUltcG9ydChqYXZheC53c2RsLkltcG9ydCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUxpc3Q8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUxpc3Q8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJTGlzdChMaXN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTWFwPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNYXA8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJTWFwKE1hcCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVVSTDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JVVJMPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSVVSTChVUkwgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpb24gUmVnaXN0cnk8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUV4dGVuc2lvbiBSZWdpc3RyeTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZXM8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZXM8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VUeXBlcyhUeXBlcyBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUl0ZXJhdG9yPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklJdGVyYXRvcjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlJdGVyYXRvcihJdGVyYXRvciBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVR5cGVzPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklUeXBlczwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlUeXBlcyhqYXZheC53c2RsLlR5cGVzIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgUmVmZXJlbmNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgUmVmZXJlbmNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZVJlZmVyZW5jZShNZXNzYWdlUmVmZXJlbmNlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0gLy9XU0RMU3dpdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNzliMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgV1NETFV0aWwgZXh0ZW5kcyBXU0RMQ29uc3RhbnRzCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgV1NETFV0aWwgaW5zdGFuY2U7Ci0gIC8vICBwcm90ZWN0ZWQgTm9kZUFzc29jaWF0aW9uTWFuYWdlciBub2RlQXNzb2NpYXRpb25NYW5hZ2VyID0gbmV3IE5vZGVBc3NvY2lhdGlvbk1hbmFnZXIoKTsKLQotICBwcm90ZWN0ZWQgSGFzaE1hcCBlbGVtZW50TmFtZVRvVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBXU0RMVXRpbCBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBXU0RMVXRpbCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICBwdWJsaWMgV1NETFV0aWwoKQotICB7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KEJJTkRJTkdfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKEJJTkRJTkcpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoREVGSU5JVElPTl9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoREVGSU5JVElPTikpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihET0NVTUVOVEFUSU9OKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KEZBVUxUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihGQVVMVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChJTVBPUlRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKElNUE9SVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChJTlBVVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoSU5QVVQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoTUVTU0FHRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoTUVTU0FHRSkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChPUEVSQVRJT05fRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKE9QRVJBVElPTikpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChPVVRQVVRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKE9VVFBVVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChQQVJUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihQQVJUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFBPUlRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFBPUlQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoUE9SVF9UWVBFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihQT1JUX1RZUEUpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoU0VSVklDRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoU0VSVklDRSkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChUWVBFU19FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoVFlQRVMpKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0V1NETFR5cGUoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaW50IHJlc3VsdCA9IC0xOwotCi0gICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIGVsZW1lbnROYW1lVG9UeXBlTWFwLmdldChlbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLSAgICBpZiAoaW50ZWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGludGVnZXIuaW50VmFsdWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldFBhcmVudEVsZW1lbnRDaGFpbihFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZCgwLCBlbGVtZW50KTsKLSAgICAgIE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgZWxlbWVudCA9IChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSA/IChFbGVtZW50KSBub2RlIDogbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKgotICAgIHB1YmxpYyBPYmplY3QgZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudChEZWZpbml0aW9uIGRlZmluaXRpb24sIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCkKLSAgICB7ICAgCi0gICAgICBPYmplY3QgbyA9IG5vZGVBc3NvY2lhdGlvbk1hbmFnZXIuZ2V0TW9kZWxPYmplY3RGb3JOb2RlKGRlZmluaXRpb24sIHRhcmdldEVsZW1lbnQpOwotICAgICAgcmV0dXJuIG87Ci0gICAgfQotICAKLSAgICAgICAgICAgICAgCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEZvck9iamVjdChPYmplY3QgbykKLSAgICB7ICAgICAgCi0gICAgICBOb2RlIG5vZGUgPSBub2RlQXNzb2NpYXRpb25NYW5hZ2VyLmdldE5vZGUobyk7ICAKLSAgICAgIHJldHVybiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgPyAoRWxlbWVudClub2RlIDogbnVsbDsgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE5vZGUgZ2V0Tm9kZUZvck9iamVjdChPYmplY3QgbykKLSAgICB7ICAgICAgCi0gICAgICByZXR1cm4gbm9kZUFzc29jaWF0aW9uTWFuYWdlci5nZXROb2RlKG8pOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gIAotICAgIHB1YmxpYyBJVHlwZVN5c3RlbVByb3ZpZGVyIGdldFR5cGVTeXN0ZW1Qcm92aWRlcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgeyAgICAgIAotICAgICAgcmV0dXJuIFdTRExUb0RPTUVsZW1lbnRVdGlsLmdldFR5cGVTeXN0ZW1Qcm92aWRlcihkZWZpbml0aW9uKTsgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgCi0gIAotICAgIHB1YmxpYyB2b2lkIHNldFR5cGVTeXN0ZW1Qcm92aWRlcihEZWZpbml0aW9uIGRlZmluaXRpb24sIElUeXBlU3lzdGVtUHJvdmlkZXIgdHlwZVN5c3RlbVByb3ZpZGVyKQotICAgIHsgICAgICAKLSAgICAgIFdTRExUb0RPTUVsZW1lbnRVdGlsLnNldFR5cGVTeXN0ZW1Qcm92aWRlcihkZWZpbml0aW9uLCB0eXBlU3lzdGVtUHJvdmlkZXIpOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9ICAgCi0gICovCi0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBjcmVhdGVRTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBwcmVmaXhlZE5hbWUpCi0gIHsKLSAgICBRTmFtZSBxbmFtZSA9IG51bGw7Ci0gICAgaWYgKHByZWZpeGVkTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHByZWZpeGVkTmFtZS5pbmRleE9mKCI6Iik7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gKGluZGV4ID09IC0xKSA/IG51bGwgOiBwcmVmaXhlZE5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlKHByZWZpeCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBwcmVmaXhlZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgcW5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBxbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEV4dGVuc2liaWxpdHlFbGVtZW50Tm9kZXMoRXh0ZW5zaWJsZUVsZW1lbnQgZXh0ZW5zaWJsZUVsZW1lbnQpCi0gIHsKLSAgICBMaXN0IGNoaWxkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleHRlbnNpYmxlRWxlbWVudC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBleHRlbnNpYmlsaXR5RWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZExpc3QuYWRkKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaGlsZExpc3Q7Ci0gICAgLy9yZXR1cm4gZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNGVlODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvcjsKLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotICAgIHByb3RlY3RlZCBYU0RTY2hlbWFMb2NhdG9ySW1wbCBzY2hlbWFMb2NhdG9yID0gbmV3IFhTRFNjaGVtYUxvY2F0b3JJbXBsKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFhTRFNjaGVtYUxvY2F0b3IuY2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gc2NoZW1hTG9jYXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MzM1OTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvcjsKLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUxvY2F0b3JJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBYU0RTY2hlbWFMb2NhdG9yCi17Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yI2xvY2F0ZVNjaGVtYShvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgWFNEU2NoZW1hIGxvY2F0ZVNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcmF3U2NoZW1hTG9jYXRpb25VUkksIFN0cmluZyByZXNvbHZlZFNjaGVtYUxvY2F0aW9uVVJJKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IG51bGw7Ci0KLSAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQotICAgICAgICBmb3IgKEVPYmplY3QgcGFyZW50ID0geHNkU2NoZW1hLmVDb250YWluZXIoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5lQ29udGFpbmVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIHBhcmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwgJiYgZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCAmJiBuYW1lc3BhY2VVUkkuZXF1YWxzKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlZFNjaGVtYSA9IHNjaGVtYTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc29sdmVkU2NoZW1hOyAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhdHBlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRvci5jbGFzczsKLSAgICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTdjNjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeQotewotICBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1MjhjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkKLXsKLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJGYWN0b3J5KFN0cmluZyBuYW1lc3BhY2UsIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSBmYWN0b3J5KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYjk0ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgV1NETENvbnN0YW50cwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5ESU5HID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGSU5JVElPTiA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPQ1VNRU5UQVRJT04gPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQVVMVCA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUE9SVCA9IDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUID0gNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRSA9IDY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVElPTiA9IDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVFBVVCA9IDg7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlQgPSA5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUID0gMTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUlRfVFlQRSA9IDExOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFID0gMTI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVTID0gMTM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSAxNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRSA9IDE1OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVOU0lCSUxJVFlfRUxFTUVOVCA9IDI0OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfRUxFTUVOVF9UQUcgPSAiYmluZGluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRklOSVRJT05fRUxFTUVOVF9UQUcgPSAiZGVmaW5pdGlvbnMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHID0gImRvY3VtZW50YXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9FTEVNRU5UX1RBRyA9ICJmYXVsdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9FTEVNRU5UX1RBRyA9ICJpbXBvcnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9FTEVNRU5UX1RBRyA9ICJpbnB1dCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfRUxFTUVOVF9UQUcgPSAibWVzc2FnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElPTl9FTEVNRU5UX1RBRyA9ICJvcGVyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfRUxFTUVOVF9UQUcgPSAib3V0cHV0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9FTEVNRU5UX1RBRyA9ICJwYXJ0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9FTEVNRU5UX1RBRyA9ICJwb3J0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9UWVBFX0VMRU1FTlRfVEFHID0gInBvcnRUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9FTEVNRU5UX1RBRyA9ICJzZXJ2aWNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRVNfRUxFTUVOVF9UQUcgPSAidHlwZXMiOwotCi0gIC8vIGNvbW1vbgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FUVFJJQlVURSA9ICJuYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9BVFRSSUJVVEUgPSAibWVzc2FnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfQVRUUklCVVRFID0gImJpbmRpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0FUVFJJQlVURSA9ICJ0eXBlIjsKLQotICAvLyBkZWZpbml0aW9ucwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTkNPRElOR19BVFRSSUJVVEUgPSAiZW5jb2RpbmciOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFID0gInRhcmdldE5hbWVzcGFjZSI7Ci0KLSAgLy8gYmluZGluZwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9VUklfQVRUUklCVVRFID0gInJlc291cmNlVVJJIjsKLQotICAvLyBwYXJ0Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVMRU1FTlRfQVRUUklCVVRFID0gImVsZW1lbnQiOwotICAKLSAgLy8gaW1wb3J0Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExPQ0FUSU9OX0FUVFJJQlVURSA9ICJsb2NhdGlvbiI7IAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfQVRUUklCVVRFID0gIm5hbWVzcGFjZSI7ICAKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RfTkFNRVNQQUNFX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0KLSAgLyoqCi0gICAqIFRoZSB2YWx1ZSA8Y29kZT5odHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYSI8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzE5OTkgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEiOwotCi0gIC8qKgotICAgKiBUaGUgdmFsdWUgPGNvZGU+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvWE1MU2NoZW1hIjwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMF8xMCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL1hNTFNjaGVtYSI7Ci0KLSAgLyoqCi0gICAqIFRoZSB2YWx1ZSA8Y29kZT4iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVMRU1FTlRfVEFHUyA9Ci0gICAgbmV3IFN0cmluZ1tdIHsKLSAgICAgIEJJTkRJTkdfRUxFTUVOVF9UQUcsCi0gICAgICBERUZJTklUSU9OX0VMRU1FTlRfVEFHLAotICAgICAgRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRywKLSAgICAgIEZBVUxUX0VMRU1FTlRfVEFHLAotICAgICAgSU1QT1JUX0VMRU1FTlRfVEFHLAotICAgICAgSU5QVVRfRUxFTUVOVF9UQUcsCi0gICAgICBNRVNTQUdFX0VMRU1FTlRfVEFHLAotICAgICAgT1BFUkFUSU9OX0VMRU1FTlRfVEFHLAotICAgICAgT1VUUFVUX0VMRU1FTlRfVEFHLAotICAgICAgUEFSVF9FTEVNRU5UX1RBRywKLSAgICAgIFBPUlRfRUxFTUVOVF9UQUcsCi0gICAgICBQT1JUX1RZUEVfRUxFTUVOVF9UQUcsCi0gICAgICBTRVJWSUNFX0VMRU1FTlRfVEFHLAotICAgICAgVFlQRVNfRUxFTUVOVF9UQUcgfTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBub2RlVHlwZShTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFTEVNRU5UX1RBR1MubGVuZ3RoOyArK2kpCi0gICAgewotICAgICAgaWYgKGxvY2FsTmFtZS5lcXVhbHMoRUxFTUVOVF9UQUdTW2ldKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vZGVUeXBlKE5vZGUgbm9kZSkKLSAgewotICAgIHJldHVybiBpc1dTRExOYW1lc3BhY2Uobm9kZS5nZXROYW1lc3BhY2VVUkkoKSkgPyBub2RlVHlwZShub2RlLmdldExvY2FsTmFtZSgpKSA6IC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbmFtZXNwYWNlIGlzIHRoZSBXU0RMIG5hbWVzcGFjZSBvciBub3QuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgYSBuYW1lc3BhY2UuCi0gICAqIEByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gbmFtZXNwYWNlIGlzIHRoZSBXU0RMIG5hbWVzcGFjZSBvciBub3QuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXU0RMTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICByZXR1cm4gV1NETF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuYW1lc3BhY2UpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWF0Y2hpbmdOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZTEsIFN0cmluZyBuYW1lc3BhY2UyKQotICB7Ci0gICAgcmV0dXJuIChuYW1lc3BhY2UxID09IG51bGwgPyBuYW1lc3BhY2UyID09IG51bGwgOiBuYW1lc3BhY2UxLmVxdWFscyhuYW1lc3BhY2UyKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgewotICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA/IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIDogbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMUmVzb3VyY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL1dTRExSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkODU1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL1dTRExSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZTwvYj4gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtb2RlbC4KLSAqIFRoaXMgc3BlY2lhbGl6ZWQgcmVzb3VyY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgaXQncyBvd24gd2F5IG9mIG1ha2luZyBrZXlzIGFuZCAKLSAqIGhyZWZzLCBhbmQgaXQncyBvd24gc2VyaWFsaXphdGlvbi4gVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgZm9yIHN1YmNsYXNzaW5nIAotICogb3V0c2lkZSBvZiB0aGUgbW9kZWwgaW1wbGVtZW50YXRpb247IGl0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgaXMgd2l0aCB0aGUgCi0gKiBSZXNvdXJjZSBmcmFtZXdvcmsuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFJlc291cmNlSW1wbCBleHRlbmRzIFJlc291cmNlSW1wbCAKLXsKLQotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRpbnVlT25Mb2FkRXJyb3IgPSB0cnVlOwotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRV9FWFRFTlNJT05fRkFDVE9SSUVTID0gIlVTRV9FWFRFTlNJT05fRkFDVE9SSUVTIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVElOVUVfT05fTE9BRF9FUlJPUiA9ICJDT05USU5VRV9PTl9MT0FEX0VSUk9SIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9FTkNPRElORyA9ICJXU0RMX0VOQ09ESU5HIjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuIAotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIAotICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4gCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBXU0RMUmVzb3VyY2VJbXBsKFVSSSB1cmkpCi0gIHsKLSAgICBzdXBlcih1cmkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvcywgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RGVmaW5pdGlvbigpOwotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLSAgICAgICAgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWZpbml0aW9uLmdldEVsZW1lbnQoKSA9PSBudWxsKQotICAgICAgewotICAgICAgICAoKERlZmluaXRpb25JbXBsKSBkZWZpbml0aW9uKS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICB9Ci0KLSAgICAgIGRvU2VyaWFsaXplKG9zLCBkb2N1bWVudCwgb3B0aW9ucyA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIG9wdGlvbnMuZ2V0KFdTRExfRU5DT0RJTkcpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UncyBEZWZpbml0aW9uLgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29udGVudHMoKS5zaXplKCkgPT0gMSAmJiBnZXRDb250ZW50cygpLmdldCgwKSBpbnN0YW5jZW9mIERlZmluaXRpb24gPyAoRGVmaW5pdGlvbikgZ2V0Q29udGVudHMoKS5nZXQoMCkgOiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1NlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBkb1NlcmlhbGl6ZShvdXRwdXRTdHJlYW0sIGRvY3VtZW50LCBudWxsKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgZG9TZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBlbmNvZGluZykKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc2Zvcm1lckZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0KLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOwotICAgICAgCi0gICAgICAvLyBVbmxlc3MgYSB3aWR0aCBpcyBzZXQsIHRoZXJlIHdpbGwgYmUgb25seSBsaW5lIGJyZWFrcyBidXQgbm8gaW5kZW50YXRpb24uCi0gICAgICAvLyBUaGUgSUJNIEpESyBhbmQgdGhlIFN1biBKREsgZG9uJ3QgYWdyZWUgb24gdGhlIHByb3BlcnR5IG5hbWUsCi0gICAgICAvLyBzbyB3ZSBzZXQgdGhlbSBib3RoLgotICAgICAgLy8KLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQiLCAiMiIpOwotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjIiKTsKLSAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBlbmNvZGluZyk7Ci0gICAgICB9Ci0KLSAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBXU0RMUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBMb2FkcyBhIG5ldyB7QGxpbmsgV1NETFJlc291cmNlSW1wbH0gaW50byB0aGUgcmVzb3VyY2Ugc2V0LgotICAgKiBAcGFyYW0gcmVzb3VyY2VTZXQgdGhlIHJlc291cmNlIHNldCB0byBob2xkIHRoZSBuZXcgcmVzb3VyY2UuCi0gICAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gdGhlIGNvbnRlbnRzIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0gICAqIEBwYXJhbSBvcHRpb25zIGFueSBvcHRpb25zIHRvIGluZmx1ZW5jZSBsb2FkaW5nIGJlaGF2aW9yLgotICAgKiBAcmV0dXJuIGEgbmV3IFdTRExSZXNvdXJjZUltcGwuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkb0xvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIFRoaXMgcGF0dGVybiBhdm9pZHMgbG9hZGluZyB0aGUgSVByb2dyZXNzTW9uaXRvciBjbGFzcyB3aGVuIHRoZXJlIGlzIG5vIHByb2dyZXNzIG1vbml0b3IuCi0gICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHN0YW5kLWFsb25lIGV4ZWN1dGlvbiB0byB3b3JrIGNvcnJlY3RseS4KLSAgICAvLwotICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLSAgICBPYmplY3QgbW9uaXRvciA9IG9wdGlvbnMgPT0gbnVsbCA/IG51bGwgOiBvcHRpb25zLmdldCgiV1NETF9QUk9HUkVTU19NT05JVE9SIik7Ci0gICAgaWYgKG1vbml0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9ncmVzc01vbml0b3IgPSAoSVByb2dyZXNzTW9uaXRvcikgbW9uaXRvcjsKLSAgICAgIHByb2dyZXNzTW9uaXRvci5zZXRUYXNrTmFtZShXU0RMUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Jlc291cmNlTG9hZF9wcm9ncmVzcyIpKTsKLSAgICAgIHByb2dyZXNzTW9uaXRvci5zdWJUYXNrKGdldFVSSSgpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIE9iamVjdCBiaW5kaW5ncyA9IG9wdGlvbnMgPT0gbnVsbCA/IG51bGwgOiBvcHRpb25zLmdldChVU0VfRVhURU5TSU9OX0ZBQ1RPUklFUyk7Ci0gICAgaWYgKGJpbmRpbmdzICE9IG51bGwgJiYgYmluZGluZ3MgaW5zdGFuY2VvZiBCb29sZWFuKSAKLSAgICAgIC8vIHRydWUgYnkgZGVmYXVsdAotICAgICAgdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gKChCb29sZWFuKWJpbmRpbmdzKS5ib29sZWFuVmFsdWUoKTsKLSAKLSAgICBPYmplY3QgY29udGludWVPbkVycm9yID0gb3B0aW9ucyA9PSBudWxsID8gbnVsbCA6IG9wdGlvbnMuZ2V0KENPTlRJTlVFX09OX0xPQURfRVJST1IpOwotICAgIGlmIChjb250aW51ZU9uRXJyb3IgIT0gbnVsbCAmJiBjb250aW51ZU9uRXJyb3IgaW5zdGFuY2VvZiBCb29sZWFuKSAKLSAgICAgIC8vIHRydWUgYnkgZGVmYXVsdAotICAgIAljb250aW51ZU9uTG9hZEVycm9yID0gKChCb29sZWFuKWNvbnRpbnVlT25FcnJvcikuYm9vbGVhblZhbHVlKCk7Ci0gICAgCi0gICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBDcmVhdGUgYSBET00gZG9jdW1lbnQKLSAgICAgIGRvYyA9IGdldERvY3VtZW50KGlucHV0U3RyZWFtLCBuZXcgSW50ZXJuYWxFcnJvckhhbmRsZXIoKSk7Ci0KLSAgICAgIGlmIChkb2MgIT0gbnVsbCAmJiBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFmaW5kRGVmaW5pdGlvbihkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNvbnRpbnVlT25Mb2FkRXJyb3IpCi0gICAgICAgICAgICBoYW5kbGVEZWZpbml0aW9uRWxlbWVudChkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihXU0RMUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX0VSUk9SX0lOVkFMSURfV1NETCIpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBoYW5kbGVEZWZpbml0aW9uRWxlbWVudChudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBpZiAoY29udGludWVPbkxvYWRFcnJvcikKLSAgICAgIHsKLSAgICAgICAgV1NETFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLSAgICAgICAgaGFuZGxlRGVmaW5pdGlvbkVsZW1lbnQobnVsbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAJdGhyb3cgZXhjZXB0aW9uOwotICAgIH0KLQotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotCi0gICAgICAvLyBJbml0aWFsaXplIHRoZSBpbmxpbmUgc2NoZW1hcyBsb2NhdGlvbiAKLSAgICAgIFR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKTsKLSAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlbCA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBlbCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgai5uZXh0KCk7Ci0gICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGVsLmdldFNjaGVtYSgpOwotICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgIHNjaGVtYS5zZXRTY2hlbWFMb2NhdGlvbihnZXRVUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBCdWlsZHMgYSBkb2N1bWVudCB1c2luZyBYZXJjZXMuCi0gICAqIEBwYXJhbSBpbnB1dFN0cmVhbSB0aGUgY29udGVudHMgdG8gcGFyc2UuCi0gICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgdGhlIGhhbmRsZWQgdXNlZCBieSB0aGUgcGFyc2VyLgotICAgKiBAcmV0dXJuIGEgZG9jdW1lbnQuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBEb2N1bWVudCBnZXREb2N1bWVudChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBDbGFzc0xvYWRlciBwcmV2aW91c0NsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0KLSAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCi0gICAgICAvLyBUQkQgLSBSZXZpc2l0Ci0gICAgICAvL0VudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyID0gY3JlYXRlRW50aXR5UmVzb2x2ZXIoKTsKLSAgICAgIC8vZG9jdW1lbnRCdWlsZGVyLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKLQotICAgICAgZG9jdW1lbnRCdWlsZGVyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotCi0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZShpbnB1dFN0cmVhbSk7Ci0gICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSU9XcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJT1dyYXBwZWRFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHByZXZpb3VzQ2xhc3NMb2FkZXIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBmaW5kRGVmaW5pdGlvbihFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoV1NETENvbnN0YW50cy5ub2RlVHlwZShlbGVtZW50KSA9PSBXU0RMQ29uc3RhbnRzLkRFRklOSVRJT04pCi0gICAgewotICAgICAgaGFuZGxlRGVmaW5pdGlvbkVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAvKgotICAgICAgZm9yIChOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChmaW5kRGVmaW5pdGlvbigoRWxlbWVudCkgY2hpbGQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAqLwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlRGVmaW5pdGlvbkVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICBpZiAoZWxlbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgICAgKChEZWZpbml0aW9uSW1wbClkZWZpbml0aW9uKS5zZXRVc2VFeHRlbnNpb25GYWN0b3JpZXModXNlRXh0ZW5zaW9uRmFjdG9yaWVzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBEZWZpbml0aW9uSW1wbC5jcmVhdGVEZWZpbml0aW9uCi0JICAgIChlbGVtZW50LGdldFVSSSgpLnRvU3RyaW5nKCksdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKTsKLSAgICB9Ci0gICAgZ2V0Q29udGVudHMoKS5hZGQoZGVmaW5pdGlvbik7Ci0gICAgLy8gRG8gd2UgbmVlZCB0aGUgbmV4dCBsaW5lPwotICAgICgoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb24pLnJlY29uY2lsZVJlZmVyZW5jZXModHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgc2VyaWFsaXplKG91dHB1dFN0cmVhbSwgZG9jdW1lbnQsIG51bGwpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGVuY29kaW5nKQotICB7Ci0gICAgZG9TZXJpYWxpemUob3V0cHV0U3RyZWFtLCBkb2N1bWVudCwgZW5jb2RpbmcpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBzZXJpYWxpemUob3V0cHV0U3RyZWFtLCBlbGVtZW50LCBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZW5jb2RpbmcpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBkb1NlcmlhbGl6ZShvdXRwdXRTdHJlYW0sIGVsZW1lbnQsIGVuY29kaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgewotICAgICAgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgZG9TZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLQotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7Ci0gICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZW5jb2RpbmcpOwotICAgICAgfQotCi0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShlbGVtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBXU0RMUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotICAgIH0KLSAgfQotIAotICBwcml2YXRlIGNsYXNzIEludGVybmFsRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV1NETCBQQVJTRSBFUlJPUjogIiArIGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXU0RMIFBBUlNFIEZBVEFMIEVSUk9SOiAiICsgZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldTREwgUEFSU0UgV0FSTklORzogIiArIGUpOwotICAgIH0KLSAgfSAKLSAgCi0gIAotICBwdWJsaWMgdm9pZCBhdHRhY2hlZChFT2JqZWN0IGVPYmplY3QpCi0gIHsKLSAgICBzdXBlci5hdHRhY2hlZChlT2JqZWN0KTsKLSAgICAgCi0gICAgLy8gd2UgbmVlZCB0byBhdHRhY2ggYSBYU0RTY2hlbWFMb2NhdG9yIGluIG9yZGVyIHRvIHJlc29sdmUgaW5saW5lIHNjaGVtYSBsb2NhdGlvbnMKLSAgICAvLyBpZiB0aGVyZSdzIG5vdCBhbHJlYWR5IG9uZSBhdHRhY2hlZAotICAgIFhTRFNjaGVtYUxvY2F0b3IgeHNkU2NoZW1hTG9jYXRvciA9IChYU0RTY2hlbWFMb2NhdG9yKUVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcih0aGlzLCBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzKTsKLSAgICBpZiAoeHNkU2NoZW1hTG9jYXRvciA9PSBudWxsKQotICAgIHsKLSAgICAgIGdldFJlc291cmNlU2V0KCkuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5KCkpOyAgCi0gICAgfSAKLSAgICAKLSAgICBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIERlZmluaXRpb25JbXBsKQotICAgIHsKLSAgICAgIERlZmluaXRpb25JbXBsIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbkltcGwpIGVPYmplY3Q7Ci0gICAgICBkZWZpbml0aW9uLnNldElubGluZVNjaGVtYUxvY2F0aW9ucyh0aGlzKTsgICAgCi0gICAgfQotICB9Ci0gIC8qCi0gIHB1YmxpYyB2b2lkIHNldElubGluZVNjaGVtYUxvY2F0aW9ucyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBpbmxpbmUgc2NoZW1hcyBsb2NhdGlvbiAKLSAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBqID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGoubmV4dCgpOwotICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZWwuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgc2NoZW1hLnNldFNjaGVtYUxvY2F0aW9uKGdldFVSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgIAotICAgIH0gICAgICAKLSAgfSovCi19IC8vV1NETFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2UvV1NETC5tZGwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL1dTREwubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTI1ODE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2UvV1NETC5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDc0OCArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTQyDQotICAgIF93cml0dGVuICAgCSJSb3NlIDQuNS44MDU0YSINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3Ig0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cw0KLQlyaWdodE1hcmdpbiAJMC4yNTAwMDANCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDANCi0JdG9wTWFyZ2luICAJMC4yNTAwMDANCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMA0KLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDANCi0JY2xpcEljb25MYWJlbHMgCVRSVUUNCi0JYXV0b1Jlc2l6ZSAJVFJVRQ0KLQlzbmFwVG9HcmlkIAlUUlVFDQotCWdyaWRYICAgICAgCTE2DQotCWdyaWRZICAgICAgCTE2DQotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQNCi0JICAgIHNpemUgICAgICAgCTEwDQotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JICAgIHVuZGVybGluZSAgCUZBTFNFDQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkgICAgY29sb3IgICAgICAJMA0KLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0Jc2hvd01lc3NhZ2VOdW0gCTENCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUNCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQ0KLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyINCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NCINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA3OCINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciDQotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjMiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkdSAgICAgIAkiMzlFMjdGMDgwMDY1Ig0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkbCINCi0JCXF1aWQgICAgICAgCSIzQURGQjhFNTAyMUUiDQotCQlkb2N1bWVudGF0aW9uIAkNCi18VGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuDQotfA0KLXxXU0RMIGRlc2NyaWJlcyBuZXR3b3JrIHNlcnZpY2VzIGFzIHNldHMgb2YgZW5kcG9pbnRzIG9wZXJhdGluZyBvbiBtZXNzYWdlcy4gVGhlIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGFyZSBkZXNjcmliZWQgYWJzdHJhY3RseSwgYW5kIHRoZW4gYm91bmQgdG8gYSBjb25jcmV0ZSBuZXR3b3JrIHByb3RvY29sIGFuZCBtZXNzYWdlIGZvcm1hdCB0byBkZWZpbmUgYW4gZW5kcG9pbnQuDQotfA0KLXxXU0RMIGRlc2NyaWJlcyB0aGUgZm9ybWF0cyBvZiB0aGUgbWVzc2FnZXMgZXhjaGFuZ2VkIGJ5IHRoZSBzZXJ2aWNlcywgYW5kIHN1cHBvcnRzIHRoZSBYTUwgU2NoZW1hcyBzcGVjaWZpY2F0aW9uIGFzIGl0cyBjYW5vbmljYWwgdHlwZSBzeXN0ZW0uIFRoaXMgcGFja2FnZSB1c2VzIGFuIFhNTCBTY2hlbWEgSW5mb3NldCBtb2RlbCBwYWNrYWdlIChzZWUgdGhlIFhTRCBwYWNrYWdlKSB0byBkZXNjcmliZSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXRzLg0KLXwNCi18VGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkNCi18LSAyLjEgRGVmaW5pdGlvbiwgc2hvd3MgdGhlIFdTREwgZGVmaW5pdGlvbiBlbGVtZW50IGFuZCB0aGUgV1NETCBkb2N1bWVudCBzdHJ1Y3R1cmUNCi18LSAyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmcsIHNob3dzIHRoZSBuYW1lc3BhY2UgYW5kIGltcG9ydCBtZWNoYW5pc20NCi18LSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbQ0KLXwtIDIuMiBUeXBlcywgc2hvd3MgdGhlIHVzZSBvZiBYTUwgU2NoZW1hIHR5cGVzIGluIFdTREwNCi18LSAyLjMgTWVzc2FnZXMsIDIuNCBQb3J0VHlwZXMsIDIuNSBCaW5kaW5ncyBhbmQgMi43IFNlcnZpY2VzLCBzaG93IHRoZSBtYWpvciBXU0RMIGVsZW1lbnRzIGFuZCB0aGVpciByZWxhdGlvbnMuDQotfA0KLXxUaGUgV1NETCBjbGFzc2VzIGV4dGVuZCB0aGUgamF2YXgud3NkbCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgSlNSIDExMC4gQ2xhc3NlcyB3aXRoIGludGVyZmFjZSBhbmQgZGF0YXR5cGUgc3RlcmVvdHlwZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZXNlIG5vbi1NT0YgaW50ZXJmYWNlcy4NCi0JCQ0KLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzcyAiV1NETEVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDNkEzMDJERCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBsYW5ndWFnZSBlbGVtZW50LiINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUyOTYwMEM4Ig0KLQkJCQlyZXN1bHQgICAgIAkiRGVmaW5pdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUyQjgwMzQ3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZGVmaW5pdGlvbiINCi0JCQkJCXR5cGUgICAgICAgCSJEZWZpbml0aW9uIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudGF0aW9uRWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDQ0U0NDM2MDJBMyINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Y5N0RCRDMwMjA3Ig0KLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIg0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiUG9ydFR5cGUiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0VHlwZSBlbGVtZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjEgYW5kIGFuIEludGVyZmFjZSBjb21wb25lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMi4gQSBwb3J0IHR5cGUgb3IgSW50ZXJmYWNlIGlzIGEgbmFtZWQgc2V0IG9mIGFic3RyYWN0IG9wZXJhdGlvbnMgYW5kIHRoZSBhYnN0cmFjdCBtZXNzYWdlcyBpbnZvbHZlZC4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENUM5QjcwMTUwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZEODAxOUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNUJFMDMzMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4OEUwMDIzIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjFFMzAxRTUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0RFQjAzMTYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRGRDAxQkEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuIEEgV1NETCBvcGVyYXRpb24gaXMgYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYW4gYWN0aW9uIHN1cHBvcnRlZCBieSBhIHNlcnZpY2UuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRTlERTk4MDAzQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRTIwMTcxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3R5bGUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDcyNjAxQUMiDQotCQkJCXR5cGUgICAgICAgCSJPcGVyYXRpb25UeXBlIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCREQ5NjQzMDA0QyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMjM1MDAzRSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTIyMDFBRCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTIwMDExQiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJNZXNzYWdlIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbWVzc2FnZSBlbGVtZW50LiBBIFdTREwgbWVzc2FnZSBpcyBhbiBhYnN0cmFjdCwgdHlwZWQgZGVmaW5pdGlvbiBvZiB0aGUgZGF0YSBiZWluZyBjb21tdW5pY2F0ZWQuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMDU1MDFDNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4RDEwMkJBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJTWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4N0MwMUZFIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjFEMjAyMjYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0U0QjAyQjAiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDU0MjAwRjEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiUGFydCINCi0JCQlxdWlkICAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOTZEMDJGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTdFMjMwMjM3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQkNFNzBCNzAzQzgiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50TmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMDg3MDNEQiINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQkNFNzBDMzAzQzUiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEwRjAyRjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODk5MDE0QiINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRjQwMUEzIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNkQwMTUxIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0REYwMzVDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPcGVyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoaW4gdGhlIGJpbmRpbmcncyBwb3J0VHlwZS4gIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDYwMDkyMDJGNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERTQwMURDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREMwMDA3MiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5QzRDQjAxOTkiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiU2VydmljZSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEyMDAyNUUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTRFMDFCNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0OEE0MDE1MSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYyMEQwMjAzIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0ODEwMjIwIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0QzUwMUUyIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOTE3MDI4NiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0IGVsZW1lbnQuIEEgcG9ydCBkZWZpbmVzIGFuIGluZGl2aWR1YWwgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyBhIHNpbmdsZSBhZGRyZXNzIGZvciBhIGJpbmRpbmciDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENjAwQ0IwMEFBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0NTAyQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUEwMDM5MSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gV1NETCBhbGxvd3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjE0OTAzRDAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjUzNTAyQzMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQUY5NTQzQzAwNzMiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCODVCMjFBMDI3MSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBXU0RMIGRvY3VtZW50LiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkRCODAzRDQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMUY4MDM4MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDRDE0RkMyMDEyQiINCi0JCQkJcmVzdWx0ICAgICAJIkRPTURvY3VtZW50Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwREUwMUU3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnQiDQotCQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNDc0MDA0RSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiNDAzNTJCN0MwMzk2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg1NzAyRjUiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwMEQwMDBEIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkltcG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgV1NETCBpbXBvcnQgZWxlbWVudC4gV1NETCBhbGxvd3MgYXNzb2NpYXRpbmcgYSBuYW1lc3BhY2Ugd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uIHVzaW5nIGFuIGltcG9ydCBlbGVtZW50LiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RUU1ODAzN0EiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDBEMDM0MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMjAyMDExOSIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MkMxMDM3OSINCi0JCQkJcmVzdWx0ICAgICAJIlhTRFNjaGVtYSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRTY2hlbWEiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NzJDMTAzOTciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzY2hlbWEiDQotCQkJCQl0eXBlICAgICAgIAkiWFNEU2NoZW1hIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTUwQTAwMzYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNTE0MDIxMSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmxlRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJCWRvY3VtZW50YXRpb24gCSIgV1NETCBhbGxvd3MgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSAocmVmZXJyZWQgdG8gaGVyZSBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb2ludCBvZiBleHRlbnNpYmlsaXR5LiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkUzQzAzRDQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxMkMwM0NEIg0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzE0NzAyOTUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJleHRFbGVtZW50Ig0KLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQuIEFuIGlucHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVDNTA0MDI1RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMjgwMkU3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkVFMDMxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUlucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1IikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk91dHB1dCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50LiBBbiBvdXRwdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVDNTBDMDM1QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMzUwMEREIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkY4MDFDRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU91dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJGYXVsdCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQuIEZhdWx0IGVsZW1lbnRzIHNwZWNpZnkgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciBhbnkgZXJyb3IgbWVzc2FnZXMgdGhhdCBtYXkgYmUgb3V0cHV0IGFzIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFMUM4MjAwMkYyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzRDAzMTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjIwMDIwMDJEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTg2MTAzMUQiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ0lucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gaW5wdXQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFMUIwMTEzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNTlCMDA3MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0E0MDIwMyINCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0I1MDNBMiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklJbnB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMUVBMDIwRSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nT3V0cHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFNDMwMkFCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QjVBNDAyN0UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzRDkwMEYxIg0KLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNGMTAzMjYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMjAyMDBCRSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nRmF1bHQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBIGZhdWx0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmF1bHQgd2l0aCB0aGUgc2FtZSBuYW1lLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFMDkzODYwMkM5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU3MTAzMzMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDEzMDM3RiINCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDIxMDEwOSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImZhdWx0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODVCRjlFMDE0QSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJRTmFtZSINCi0JCQlxdWlkICAgICAgIAkiM0FFOEVEMjIwMTQwIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUU5hbWUgY2xhc3MuIEEgUU5hbWUgaXMgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0OURBOTAwM0QiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiTmFtZXNwYWNlIg0KLQkJCXF1aWQgICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5hbWVzcGFjZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGluIGEgV1NETCBkb2N1bWVudC4iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNEMjkwMUIxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlZml4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNEMzIwMjM2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk9wZXJhdGlvblR5cGUiDQotCQkJcXVpZCAgICAgICAJIjNBRUI0NzgyMDI0RiINCi0JCQlkb2N1bWVudGF0aW9uIAkNCi18T05FX1dBWT0xDQotfFJFUVVFU1RfUkVTUE9OU0U9Mg0KLXxTT0xJQ0lUX1JFU1BPTlNFPTMNCi18Tk9USUZJQ0FUSU9OPTQNCi0JCQkNCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMzNTMwM0UzIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklQb3J0VHlwZSINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE1QkUwMzMxIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydFR5cGUgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZBQzEwMUNBIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkJBRjAxQTQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QkY3MDMxQSINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBNjMyMDAwRCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTc3NjAwRDEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM0MjAwNjUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCINCi0JCQkJCXR5cGUgICAgICAgCSJJRmF1bHQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzU5MDI4RiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNzEwMkIxIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJhbWV0ZXJPcmRlcmluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzgxMDFCMCINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDOTkwMzFEIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyT3JkZXIiDQotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NEU1MDE4RCINCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkM0MDEwNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklJbnB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkU0MDA5NCINCi0JCQkJcmVzdWx0ICAgICAJIklPdXRwdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRjAwMUQyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklPdXRwdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE3OTkwMTJCIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE3RUUwMDE1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MzMxMDBFRiINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjM0NzAyNzciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLklucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MDAwMDM5Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklPdXRwdXQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBODI5MDI3RCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk91dHB1dCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0M0EwMzVEIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDQ1MDFDOCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MzkwMUQ1Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklGYXVsdCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE4NjEwMzFEIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDZBMDBCRCINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ3NTAxMzEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4NzEwMjA4Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklNZXNzYWdlIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QThBRjAwNEYiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5NZXNzYWdlIG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUGFydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjI0MDI3MyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnQiDQotCQkJCQl0eXBlICAgICAgIAkiSVBhcnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyM0QwMjMzIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklQYXJ0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyNTQwMjVFIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcmRlcmVkUGFydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NzI2MTAyMEQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0T3JkZXIiDQotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5NZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4QkMwMjYwIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklQYXJ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTkzRjAxQkUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5QYXJ0IG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uQXR0cmlidXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0Njg4NDUwMDUyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAidmFsdWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJZXhjZXB0aW9ucyAJIldTRExFeGNlcHRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEwMTAxQzMiDQotCQkJCXJlc3VsdCAgICAgCSJJSXRlcmF0b3IiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0NjhBMkQwMkQ1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiUU5hbWUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTk1MDAyMzEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVNlcnZpY2UiDQotCQkJcXVpZCAgICAgICAJIjNCODRBQjQ5MDI4NyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlNlcnZpY2Ugbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RDU2MDFEMSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnQiDQotCQkJCQl0eXBlICAgICAgIAkiSVBvcnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REEyMDAzNiINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REIwMDFCQyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuU2VydmljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjVCMDAzRSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJUG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCODAwMzI2Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUxRjMwMkI1Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MjYzMDJGMiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjhDMDAxNiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZyINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZyBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVGMTYwMTUzIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ09wZXJhdGlvbiINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NUY1MDAwNjYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVGQTQwMUM1Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTJBOTAyODQiDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTJCRTAxQTgiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0VHlwZSINCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQkNGMDMwMiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ09wZXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFEQzAwMDcyIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBCQzAwNDEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nRmF1bHQiDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdGYXVsdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEQ5MDA5RCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBGQzAwNjEiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MzJEMDAxNyINCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzM0YwMzdCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTUwOTAwREEiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTFEMDA3RiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdJbnB1dCINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ0lucHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTM0MDM0OSINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTU0NzAyQTYiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3V0cHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3V0cHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QURDQjAyMUMiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdJbnB1dCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFERUIwMTAwIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0lucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERkUwMDBEIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3V0cHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUUyMTAxMTEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTJEMDA1MCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ0ZhdWx0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUU0RjAwQkQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU1RjAwMkEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFGMzIwM0RCIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFGNTYwMjkyIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxMjQwMkFCIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxMzUwM0QxIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QjFEOTAxNDIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5EZWZpbml0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODhGMTAzOUQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIg0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkSW1wb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NDkwMjU5Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW1wb3J0RGVmIg0KLQkJCQkJdHlwZSAgICAgICAJIklJbXBvcnQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NkUwMDVFIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTg0MDA0QiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUM1MDA0NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIg0KLQkJCQkJdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlFNDAxRUUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzZXJ2aWNlIg0KLQkJCQkJdHlwZSAgICAgICAJIklTZXJ2aWNlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBMTcwMzhDIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEEzMjAyODYiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE0NjAxM0IiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNUMwMEIwIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUZFMDM3QyINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNzUwMkU3Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUltcG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTgzMDE0QyINCi0JCQkJcmVzdWx0ICAgICAJIklJbXBvcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE5RDAzM0UiDQotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUFGMDI1NCINCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUMyMDNDNCINCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRTgwMEVEIg0KLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRjgwMjZEIg0KLQkJCQlyZXN1bHQgICAgIAkiSVBhcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjA4MDFEQSINCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMTUwMzlCIg0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIzMjAxM0EiDQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCNDIwMDc1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ3MiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEI5MjAzNDEiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJDRDAwNjAiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJFNzAxNDQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDMTcwMTA3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEMzRTAwMUQiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzYyMDE0QiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lc3BhY2VzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDNzQwMTE1Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0JFMDA3MSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OENEQTAxQzYiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFByZWZpeCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0ZEMDAxNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThEMjMwMEE4Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEQzQjAzQ0UiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1QjgwMTJCIg0KLQkJCQlyZXN1bHQgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RDcwM0JCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnRCYXNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RkUwMjA4Ig0KLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50QmFzZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENjE4MDMyOCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50QmFzZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDU2MDA4MCINCi0JCQkJcmVzdWx0ICAgICAJIklUeXBlcyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVTZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwN0UwMDRDIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEJBMDM1NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwRDgwMjlBIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZU1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBGQTAzMDciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDZGMDMxQiINCi0JCQkJcmVzdWx0ICAgICAJIklUeXBlcyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDk1MDBFRSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInR5cGVzIg0KLQkJCQkJdHlwZSAgICAgICAJIklUeXBlcyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5EZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRTcwMkExIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbXBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNCODRCMjAyMDExOSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkltcG9ydCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkltcG9ydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMjBDMDJFQSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJTGlzdCINCi0JCQlxdWlkICAgICAgIAkiM0I4NUMwQTIwM0M1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkxpc3QgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5MaXN0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMwQUYwMjk3Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklNYXAiDQotCQkJcXVpZCAgICAgICAJIjNCODk2QjAzMDBENCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5NYXAgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5NYXAiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkIxMTAyQjUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVVSTCINCi0JCQlxdWlkICAgICAgIAkiM0I4OUQ1NjMwMjc0Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS5uZXQuVVJMIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLm5ldC5VUkwiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU2RTAzRTIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg5RDU5MzAyQTUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENTlGMDJFOCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJUeXBlcyINCi0JCQlxdWlkICAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHR5cGVzIGVsZW1lbnQuIFRoZSB0eXBlcyBlbGVtZW50IGVuY2xvc2VzIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlIGV4Y2hhbmdlZCBtZXNzYWdlcy4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0QzQjAzODAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyINCi0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0YzODAzRTYiDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWFzIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBRENGN0UwMzAxIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUl0ZXJhdG9yIg0KLQkJCXF1aWQgICAgICAgCSIzQzQ2ODdEQTAxNjciDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5JdGVyYXRvciINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4ODA4MDBCOSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJXU0RMRXhjZXB0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQzQ2ODk2NTAzMTMiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeGNlcHRpb24gY2xhc3MuIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLldTRExFeGNlcHRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODk3NDAzMTUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JCMjAwNTAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5UeXBlcyBub24tTU9GIGludGVyZmFjZSINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuVHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JGMTAxNzMiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQ0IyNEFDMDAyQUUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0NCMjRBRUMwMUNCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0NDMzYwRDcwMzlDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDQzM2MjdGMDBCNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNDRDE1MDJDMDIzQiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkRvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwNjAwMTgyIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJcXVpZCAgICAgICAJIjNGNjc3MURCMDJEQyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjc2MkE2QTAzMDgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNGNjc4MEEwMDFBQiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlByb3RlY3RlZCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIg0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MjQwMThDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUMzIg0KLQkJCQlsYWJlbCAgICAgIAkicG9ydFR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDODI3MDFDRCINCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRTAwRTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDRUJGMDA1NyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUNFQkYwMDYxIg0KLQkJCQlsYWJlbCAgICAgIAkiZVBhcnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyINCi0JCQlxdWlkICAgICAgIAkiM0FENUQzNTIwMTBGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMzU0MDE3NiINCi0JCQkJbGFiZWwgICAgICAJImVQb3J0VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1NDAxODAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQzRTEwMTc5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMjAyMjUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3BlcmF0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIzOSINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nT3BlcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciDQotCQkJcXVpZCAgICAgICAJIjNBRDVENDI1MDM4QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ0MjYwMkY1Ig0KLQkJCQlsYWJlbCAgICAgIAkiZU9wZXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ0MjYwMkZGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOTQwMDM5MyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUMiDQotCQkJCWxhYmVsICAgICAgCSJlUG9ydHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEOUI4MDExRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI0RCINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI2MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMyINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2MDMwMUUyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2MDQwMEI3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQzEiDQotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2NzEwMTA0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzIwMzRBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydFR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzIwMzU0Ig0KLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRUeXBlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNyINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2NzcwMDk1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzgwMzcxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ3MiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3ODAzN0IiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ3MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOSINCi0JCQlxdWlkICAgICAgIAkiM0FENUU2N0IwMzExIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU2N0QwMDdGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlU2VydmljZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3RDAwODkiDQotCQkJCWxhYmVsICAgICAgCSJlU2VydmljZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMSINCi0JCQlxdWlkICAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxNDAxOUQiDQotCQkJCWxhYmVsICAgICAgCSJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMiDQotCQkJcXVpZCAgICAgICAJIjNBREYyRTY0MDFGNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFNjUwMjUxIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdJbnB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNSINCi0JCQlxdWlkICAgICAgIAkiM0FERjJFQjMwMTYzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNDIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdPdXRwdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3Ig0KLQkJCXF1aWQgICAgICAgCSIzQURGMkY5NDAyNEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUlucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTkwIg0KLQkJCQlsYWJlbCAgICAgIAkiZUlucHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkY5NTAxOUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOSINCi0JCQlxdWlkICAgICAgIAkiM0FERjJGQjgwMkY5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkZCOTAyMEEiDQotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJGQjkwMjBCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEiDQotCQkJcXVpZCAgICAgICAJIjNBREYzMzE2MDFBNCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlRmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjMzMTgwMzg3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZUZhdWx0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzIiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMyINCi0JCQlxdWlkICAgICAgIAkiM0FERjM0MDAwM0U1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nRmF1bHRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FBIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdGYXVsdHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYzNDAxMDNBQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNSINCi0JCQlxdWlkICAgICAgIAkiM0FFMDkxRjQwMkYzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRSINCi0JCQkJbGFiZWwgICAgICAJImVGYXVsdCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzciDQotCQkJcXVpZCAgICAgICAJIjNBRUEzRDU1MDAyRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzOCINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDU2MDMyOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZU5hbWVzcGFjZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMzIiDQotCQkJCWxhYmVsICAgICAgCSJlTmFtZXNwYWNlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzkiDQotCQkJcXVpZCAgICAgICAJIjNBRUEzRTNBMDAyRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFFOCINCi0JCQkJbGFiZWwgICAgICAJImVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MCINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFGMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQxIg0KLQkJCXF1aWQgICAgICAgCSIzQUVBNDEyRjAwMzUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTQxMzEwMjU1Ig0KLQkJCQlsYWJlbCAgICAgIAkiZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTQxMzEwMjVGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDMiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRDI0MDBCRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNTAwODMiDQotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3OTAwRjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RCINCi0JCQkJbGFiZWwgICAgICAJImVPdXRwdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDYiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3QTAxNEUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDciDQotCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDBDNCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMyNyINCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0OCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMzMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0OSINCi0JCQlxdWlkICAgICAgIAkiM0I4QjFDMTIwM0IyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQzE0MDAxQyINCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDI2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUxIg0KLQkJCXF1aWQgICAgICAgCSIzQjhCMURDQzAyRTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVNjaGVtYSINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxRENFMDI3MCINCi0JCQkJbGFiZWwgICAgICAJImVTY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxRENFMDI3QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUzIg0KLQkJCXF1aWQgICAgICAgCSIzQjhCRUEyNzAyOUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTQiDQotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCQkJbGFiZWwgICAgICAJImVUeXBlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiDQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTUiDQotCQkJcXVpZCAgICAgICAJIjNDNDY4MjkzMDNFNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDEwRSINCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NiINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDExOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NyINCi0JCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbXBvcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJCQlsYWJlbCAgICAgIAkiZUltcG9ydHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1OCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY0REZGMDJFRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1OSINCi0JCQlxdWlkICAgICAgIAkiM0NDMzYxNDUwMEYyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYwIg0KLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIg0KLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNFIg0KLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MSINCi0JCQlxdWlkICAgICAgIAkiM0Y3NEU3ODQwMUIxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDBGIg0KLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYyIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDIzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYzIg0KLQkJCXF1aWQgICAgICAgCSIzRjc4OTZBMjAyNkUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjQiDQotCQkJCXF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY2hpbGRyZW4iDQotCQkJCXF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkMiDQotCQkJCWxhYmVsICAgICAgCSJjaGlsZHJlbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkNCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjcgU2VydmljZXMiDQotCQkJcXVpZCAgICAgICAJIjM5QUQzRUY2MDEyNyINCi0JCQl0aXRsZSAgICAgIAkiMi43IFNlcnZpY2VzIg0KLQkJCXpvb20gICAgICAgCTkwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgODAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MywgNjYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDYxMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJCQl3aWR0aCAgICAgIAk1MjANCi0JCQkJaGVpZ2h0ICAgICAJNDA0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydCIgQDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODE2LCA1MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDQ4MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUG9ydCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDQzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzgNCi0JCQkJaGVpZ2h0ICAgICAJMjE4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJU2VydmljZSIgQDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgOTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVNlcnZpY2UiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCA0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCNDkwMjg3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMjY0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBANA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgNTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDM4OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJd2lkdGggICAgICAJNDEwDQotCQkJCWhlaWdodCAgICAgCTMwMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0RTAxQjQiDQotCQkJCWNsaWVudCAgICAgCUA0DQotCQkJCXN1cHBsaWVyICAgCUAzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDAsIDM3NykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MCwgMjkyKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBANg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0NDAsIDEyNjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQ0LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQl3aWR0aCAgICAgIAk0MTANCi0JCQkJaGVpZ2h0ICAgICAJMzAyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCQkJY2xpZW50ICAgICAJQDYNCi0JCQkJc3VwcGxpZXIgICAJQDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzAsIDExMTMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDMwLCAxMDAyKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IiBAOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgOTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjc1LCA4NDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCQloZWlnaHQgICAgIAkxNjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDUwMkM5Ig0KLQkJCQljbGllbnQgICAgIAlAOA0KLQkJCQlzdXBwbGllciAgIAlAMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODA5LCA4MjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDksIDYzNykpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5IiBAMTANCi0JCQkJbG9jYXRpb24gICAJKDM0MywgOTE2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTQwMDM5MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydHMiIEAxMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjEsIDY0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MTMsIDk0NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTg5NzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxQyINCi0JCQkJCWNsaWVudCAgICAgCUAxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY2LCA5MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM5LCA4ODApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA4MDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDk5MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODQ2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTc0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAiIEAxNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjEsIDY0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTYsIDc0NCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5NDEwMzFEIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwDQotCQkJCQlzdXBwbGllciAgIAlANA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDM0MywgOTE2KQ0KLQkJCQkJICAgICgyNTcsIDkxNikNCi0JCQkJCSAgICAoMjU3LCA2NzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTcsIDY3OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDEsIDc5NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNzA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMSIgQDE4DQotCQkJCWxvY2F0aW9uICAgCSg4ODYsIDEyNzApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjgwMTFGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nIiBAMTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTIsIDEyMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmciDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDg1NzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI0RCINCi0JCQkJCWNsaWVudCAgICAgCUAxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzUsIDEyNzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MCwgMTMxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNDI4Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIiIEAyMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxOA0KLQkJCQkJbG9jYXRpb24gICAJKDM4LCA0MjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODUyLCAxMTA2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4Nzk0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjYxIg0KLQkJCQkJY2xpZW50ICAgICAJQDE4DQotCQkJCQlzdXBwbGllciAgIAlAOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDg4NiwgMTI3MCkNCi0JCQkJCSAgICAoODEyLCAxMjcwKQ0KLQkJCQkJICAgICg4MTIsIDk5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTIsIDk5NikpKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjUgQmluZGluZ3MiDQotCQkJcXVpZCAgICAgICAJIjM5QUQ1MTI3MDI1MiINCi0JCQl0aXRsZSAgICAgIAkiMi41IEJpbmRpbmdzIg0KLQkJCXpvb20gICAgICAgCTg1DQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAyNDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDExNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDY0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkzNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIiBAMjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDM1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3ODAsIDEzMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCA4MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIg0KLQkJCQl3aWR0aCAgICAgIAk0MTANCi0JCQkJaGVpZ2h0ICAgICAJNTY4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0IiBAMjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAxMzM0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nSW5wdXQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAxMjg0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiDQotCQkJCXdpZHRoICAgICAgCTI3OA0KLQkJCQloZWlnaHQgICAgIAkxNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IiBAMjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxLCAxNjM4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nT3V0cHV0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTU4OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFMjEwMTExIg0KLQkJCQl3aWR0aCAgICAgIAkzMTINCi0JCQkJaGVpZ2h0ICAgICAJMTc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0IiBAMjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE5ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIsIDE5NTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdGYXVsdCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIsIDE5MDgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCINCi0JCQkJd2lkdGggICAgICAJMjkwDQotCQkJCWhlaWdodCAgICAgCTE3Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAyOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDYyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCA0ODYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjczDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCQl3aWR0aCAgICAgIAk2OTENCi0JCQkJaGVpZ2h0ICAgICAJMzAxDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDMwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxMjgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklucHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTE3OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCAxNjY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDE1ODcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiT3V0cHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTE3OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDMyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCA2ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTcsIDUzOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJd2lkdGggICAgICAJNDMyDQotCQkJCWhlaWdodCAgICAgCTMyMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5Ig0KLQkJCQljbGllbnQgICAgIAlAMzINCi0JCQkJc3VwcGxpZXIgICAJQDI0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzksIDUyNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3OSwgNDI4KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMiIEAzNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTAzOSwgNzQyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMzUyMDEwRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGUiIEAzNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNA0KLQkJCQkJbG9jYXRpb24gICAJKDU3NSwgNTk4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDksIDc4MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydFR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODkyOTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEMzU0MDE3NiINCi0JCQkJCWNsaWVudCAgICAgCUAzNA0KLQkJCQkJc3VwcGxpZXIgICAJQDI5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzksIDc0MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU5LCA3NDIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MiwgNzE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyMTkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0IiBAMzgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzQNCi0JCQkJCWxvY2F0aW9uICAgCSg1NzUsIDU5OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzYsIDY5NykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDk0NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEMzU0MDE4MCINCi0JCQkJCWNsaWVudCAgICAgCUAzNA0KLQkJCQkJc3VwcGxpZXIgICAJQDMyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzksIDc0MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MjAsIDc0MikpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEA0MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDEwMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MiwgODUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCXdpZHRoICAgICAgCTQ1MA0KLQkJCQloZWlnaHQgICAgIAkzNzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIgQDQxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjI0LCAxNDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3NiwgMTI4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0Ig0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMjc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQzIiBANDINCi0JCQkJbG9jYXRpb24gICAJKDEyNjQsIDEzNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjQwMEJEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbnB1dCIgQDQzDQotCQkJCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjM3LCAxMzE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbnB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3NTE0OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjUwMDgzIg0KLQkJCQkJY2xpZW50ICAgICAJQDQyDQotCQkJCQlzdXBwbGllciAgIAlAMzANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NCwgMTM1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxMzU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTQsIDEzOTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODk1NDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ0IiBANDYNCi0JCQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQkJCWxvY2F0aW9uICAgCSg5NiwgMjg3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDI1MDA4NCINCi0JCQkJCWNsaWVudCAgICAgCUA0Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDQxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzgxLCAxMzU5KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEA0Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk2MCwgMTY2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTIsIDE1MzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkyNzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDUiIEA0OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQzMiwgMTY1NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQ3OTAwRjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDQ5DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDUsIDE2MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU91dHB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY3NDc3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEN0EwMTREIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ4DQotCQkJCQlzdXBwbGllciAgIAlAMzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxNjU0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODEsIDE2OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTAyNzQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ2IiBANTINCi0JCQkJCVBhcmVudF9WaWV3IAlANDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwLCAzNzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEN0EwMTRFIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ4DQotCQkJCQlzdXBwbGllciAgIAlANDcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxNjU0KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iIEA1Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk5MiwgMTAwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTksIDkzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3BlcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJd2lkdGggICAgICAJMzY0DQotCQkJCWhlaWdodCAgICAgCTE3OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERTQwMURDIg0KLQkJCQljbGllbnQgICAgIAlANTMNCi0JCQkJc3VwcGxpZXIgICAJQDI1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjYsIDkxOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2NiwgNjM2KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEA1NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDU3LCAxMDIyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0UxMDE3OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2IiBANTYNCi0JCQkJCVBhcmVudF9WaWV3IAlANTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMxOSwgNDk0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNSwgOTIwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMjUiDQotCQkJCQljbGllbnQgICAgIAlANTUNCi0JCQkJCXN1cHBsaWVyICAgCUAzMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ1NywgMTAyMikNCi0JCQkJCSAgICAoMjc2LCAxMDIyKQ0KLQkJCQkJICAgICgyNzYsIDg0OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzYsIDg0OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMzAsIDg4NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdPcGVyYXRpb25zIiBANTkNCi0JCQkJCVBhcmVudF9WaWV3IAlANTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMxOSwgNDk0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzMSwgOTc3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM4NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3BlcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIxMTY5OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTIwMjM5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU1DQotCQkJCQlzdXBwbGllciAgIAlANTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDU3LCAxMDIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxMCwgMTAyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjksIDk4MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4NDk1Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzE0LCAxMDY3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzI3NTY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDciIEA2Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQxOCwgMTA0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDQyNTAzOEEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbiIgQDY0DQotCQkJCQlQYXJlbnRfVmlldyAJQDYzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTM1OCwgNDY0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDEwNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU9wZXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDYwMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDYzDQotCQkJCQlzdXBwbGllciAgIAlANDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjYzLCAxMDQwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODksIDEwMDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTY3MjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgiIEA2Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjczLCAxMDcwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NTQyMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkZGIg0KLQkJCQkJY2xpZW50ICAgICAJQDYzDQotCQkJCQlzdXBwbGllciAgIAlANTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTc0LCAxMDQwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMiIEA2OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzg3LCAxMTkwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYyRTY0MDFGNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0lucHV0IiBANzANCi0JCQkJCVBhcmVudF9WaWV3IAlANjkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzgxLCA0NTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY5LCAxMTUyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nSW5wdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTE5MDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MSINCi0JCQkJCWNsaWVudCAgICAgCUA2OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzg3LCAxMTkwKQ0KLQkJCQkJICAgICg2MzYsIDExOTApDQotCQkJCQkgICAgKDYzNiwgMTI3MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzYsIDEyNzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg1LCAxMjIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQwNDc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNCIgQDczDQotCQkJCQlQYXJlbnRfVmlldyAJQDY5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4NSwgMTE0NCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUyIg0KLQkJCQkJY2xpZW50ICAgICAJQDY5DQotCQkJCQlzdXBwbGllciAgIAlANTMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3ODcsIDExOTApDQotCQkJCQkgICAgKDkyNiwgMTE5MCkNCi0JCQkJCSAgICAoOTI2LCAxMDk3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg3LCAxMTkwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNiwgMTA5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzEsIDExMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3NTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUiIEA3Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgMTMxMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkVCMzAxNjMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdPdXRwdXQiIEA3Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEyLCAxNDI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMwNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3V0cHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTQ1MDgyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkVCNDAxM0MiDQotCQkJCQljbGllbnQgICAgIAlANzYNCi0JCQkJCXN1cHBsaWVyICAgCUA0Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjQsIDE1MjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxNDc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc0NTkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNiIgQDgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDc2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgNTc4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4MywgMTE0MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNEIg0KLQkJCQkJY2xpZW50ICAgICAJQDc2DQotCQkJCQlzdXBwbGllciAgIAlANTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgMTMxMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxMDk3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzEsIDExODYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTAxNjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEA4Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MjAsIDE5ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3MiwgMTkwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDg0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgMTk4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjEyLCAxODU5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdGYXVsdCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkyNzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTcxMDMzMyINCi0JCQkJY2xpZW50ICAgICAJQDg0DQotCQkJCXN1cHBsaWVyICAgCUAyOA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwMywgMjAwNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1MywgMjAwNykpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMyIgQDg2DQotCQkJCWxvY2F0aW9uICAgCSgxMzU2LCAxMzUyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYzNDAwMDNFNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0ZhdWx0cyIgQDg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDg2DQotCQkJCQlsb2NhdGlvbiAgIAkoMTg4LCA2MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MiwgMTc1MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ0ZhdWx0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMzE1MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FBIg0KLQkJCQkJY2xpZW50ICAgICAJQDg2DQotCQkJCQlzdXBwbGllciAgIAlAODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1NiwgMTM1MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU2LCAxODQ3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDksIDE3OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkxOTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTYsIDE4MDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTkyOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNCIgQDkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDg2DQotCQkJCQlsb2NhdGlvbiAgIAkoMTg4LCA2MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgMTE5NykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FCIg0KLQkJCQkJY2xpZW50ICAgICAJQDg2DQotCQkJCQlzdXBwbGllciAgIAlANTMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzU2LCAxMzUyKQ0KLQkJCQkJICAgICgxMzU2LCAxMjE3KQ0KLQkJCQkJICAgICgxMTE3LCAxMjE3KQ0KLQkJCQkJICAgICgxMTE3LCAxMDk3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1NiwgMTM1MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxMDk3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTIsIDExNjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODcwMDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzUiIEA5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTY0MCwgMTk3MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGNDAyRjMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0IiBAOTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NCwgMTkxNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzY0MjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRSINCi0JCQkJCWNsaWVudCAgICAgCUA5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDgzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2MywgMTk3MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzE4LCAyMDEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQyMjc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNiIgQDk4DQotCQkJCQlQYXJlbnRfVmlldyAJQDk0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRiINCi0JCQkJCWNsaWVudCAgICAgCUA5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUxNywgMTk3MCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0MzAyQUIiDQotCQkJCWNsaWVudCAgICAgCUA0Nw0KLQkJCQlzdXBwbGllciAgIAlAMjcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwMywgMTY1NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM2NCwgMTY1NikpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTFCMDExMyINCi0JCQkJY2xpZW50ICAgICAJQDQxDQotCQkJCXN1cHBsaWVyICAgCUAyNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDY3LCAxMzg1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzMxLCAxMzg1KSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjQgUG9ydFR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDFDNDAzNjYiDQotCQkJdGl0bGUgICAgICAJIjIuNCBQb3J0VHlwZXMiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiINCi0JCQl6b29tICAgICAgIAk4MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIiBAMTAxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAyMDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMTcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklQb3J0VHlwZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMTIyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiDQotCQkJCXdpZHRoICAgICAgCTcxOA0KLQkJCQloZWlnaHQgICAgIAkxOTYNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3BlcmF0aW9uIiBAMTAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxNzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODczDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSU9wZXJhdGlvbiIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDEyNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODczDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIg0KLQkJCQl3aWR0aCAgICAgIAk4OTENCi0JCQkJaGVpZ2h0ICAgICAJMTg4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiIEAxMDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDE0NzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxNDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklJbnB1dCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxMzg3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiDQotCQkJCXdpZHRoICAgICAgCTY0NA0KLQkJCQloZWlnaHQgICAgIAkxOTQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPdXRwdXQiIEAxMDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDE3OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU2LCAxNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklPdXRwdXQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTcwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIg0KLQkJCQl3aWR0aCAgICAgIAk2NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTk0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiIEAxMDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDIxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklGYXVsdCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDI2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTg2MTAzMUQiDQotCQkJCXdpZHRoICAgICAgCTY0NA0KLQkJCQloZWlnaHQgICAgIAkxOTYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMTA2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OCwgNjcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJd2lkdGggICAgICAJNjk1DQotCQkJCWhlaWdodCAgICAgCTI4MQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAxMDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTc2LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMjUsIDY5MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJd2lkdGggICAgICAJNTIwDQotCQkJCWhlaWdodCAgICAgCTI0MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEAxMDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAyMDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkZhdWx0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDEwOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDE0NzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MCwgMTQyMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiIEAxMTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxNzkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAxNzQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk91dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCXdpZHRoICAgICAgCTI3NA0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIgQDExMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDc4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxNCwgNjIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCXdpZHRoICAgICAgCTY5NQ0KLQkJCQloZWlnaHQgICAgIAkzNTINCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxMTINCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDc5NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNDAxOEMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbnMiIEAxMTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyDQotCQkJCQlsb2NhdGlvbiAgIAkoNTkyLCAyNjkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA3NDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQ5DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU9wZXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNTk2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDODI3MDFDRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMTINCi0JCQkJCXN1cHBsaWVyICAgCUAxMTENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDUsIDc5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzYsIDg2MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MDM5MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA5MjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzYyNDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwb3J0VHlwZSIgQDExNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTINCi0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQzMiDQotCQkJCQljbGllbnQgICAgIAlAMTEyDQotCQkJCQlzdXBwbGllciAgIAlAMTA2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDc5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4OCwgNzU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUzNDg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQxIiBAMTE5DQotCQkJCWxvY2F0aW9uICAgCSgyMTA3LCA3NzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMkYwMDM1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJhbWV0ZXJPcmRlcmluZyIgQDEyMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkNCi0JCQkJCWxvY2F0aW9uICAgCSgxODE5LCAxMDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ1LCA2NDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgzMzMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMzEwMjU1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjMxNiwgNzczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3MiwgODIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk2NjEwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNzEsIDg4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMwNjIyMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQyIiBAMTI0DQotCQkJCQlQYXJlbnRfVmlldyAJQDExOQ0KLQkJCQkJbG9jYXRpb24gICAJKDE4MTksIDEwMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEzMTAyNUYiDQotCQkJCQljbGllbnQgICAgIAlAMTE5DQotCQkJCQlzdXBwbGllciAgIAlAMTExDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMDcsIDc3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk5LCA3NzMpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMSIgQDEyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcwMiwgMTUwNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxNjAxQTQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0cyIgQDEyNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjUNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE1LCAxOTgyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VGYXVsdHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Nzg5OTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxODAzODciDQotCQkJCQljbGllbnQgICAgIAlAMTI1DQotCQkJCQlzdXBwbGllciAgIAlAMTA4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDIsIDE1MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgMjA0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDQsIDIwMjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDk1ODANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MywgMTk2MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NTM3OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMyIiBAMTMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNQ0KLQkJCQkJbG9jYXRpb24gICAJKDE0MTQsIDgzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NjEsIDEwNjkpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYzMzE4MDM4OCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAyLCA5NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMDM5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU3MzYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNyIgQDEzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3OCwgMTIzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NDAyNEQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBAMTM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMw0KLQkJCQkJbG9jYXRpb24gICAJKDg5MCwgNTYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAxMzQzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbnB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxOTgyMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRjk1MDE5MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTc4LCAxMjM0KQ0KLQkJCQkJICAgICg5ODAsIDEyMzQpDQotCQkJCQkgICAgKDk4MCwgMTQxMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAxNDEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0NiwgMTM2NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3NzY2MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgiIEAxMzcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzDQotCQkJCQlsb2NhdGlvbiAgIAkoODkwLCA1NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjM2LCAxMDM2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOUEiDQotCQkJCQljbGllbnQgICAgIAlAMTMzDQotCQkJCQlzdXBwbGllciAgIAlAMTExDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3OCwgMTIzNCkNCi0JCQkJCSAgICAoMTI3NywgMTIzNCkNCi0JCQkJCSAgICAoMTI3NywgOTYwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc3LCA5NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTk3LCAxMDU4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2NDEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5IiBAMTQwDQotCQkJCWxvY2F0aW9uICAgCSgxNDY4LCAxMzQ1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYyRkI4MDJGOSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3V0cHV0IiBAMTQxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MA0KLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjIsIDE2NjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU91dHB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MDkwOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDANCi0JCQkJCXN1cHBsaWVyICAgCUAxMTANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OCwgMTM0NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAxNzMwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU0NiwgMTY3NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MzYzNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTc4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAiIEAxNDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwDQotCQkJCQlsb2NhdGlvbiAgIAkoMTE4MCwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNywgMTAzNykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBCIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MA0KLQkJCQkJc3VwcGxpZXIgICAJQDExMQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDk2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjMsIDEwODApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTAzNDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZEODAxOUYiDQotCQkJCWNsaWVudCAgICAgCUAxMDYNCi0JCQkJc3VwcGxpZXIgICAJQDEwMQ0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZFMjAxNzEiDQotCQkJCWNsaWVudCAgICAgCUAxMTENCi0JCQkJc3VwcGxpZXIgICAJQDEwMg0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZFRTAzMUQiDQotCQkJCWNsaWVudCAgICAgCUAxMDkNCi0JCQkJc3VwcGxpZXIgICAJQDEwMw0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZGODAxQ0QiDQotCQkJCWNsaWVudCAgICAgCUAxMTANCi0JCQkJc3VwcGxpZXIgICAJQDEwNA0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMjAwMjAwMkQiDQotCQkJCWNsaWVudCAgICAgCUAxMDgNCi0JCQkJc3VwcGxpZXIgICAJQDEwNQ0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAxNTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjI0LCAxNDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM3LCAxMzEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU3NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQl3aWR0aCAgICAgIAk1OTMNCi0JCQkJaGVpZ2h0ICAgICAJMzEyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIgQDE1Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1MjAsIDI1NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5MywgMjQ2NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlUmVmZXJlbmNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyINCi0JCQkJd2lkdGggICAgICAJNjcyDQotCQkJCWhlaWdodCAgICAgCTE4MA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTU0DQotCQkJCWxvY2F0aW9uICAgCSgxNTI0LCAyMjc1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxNTMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTUyNCwgMjI3NSkNCi0JCQkJICAgICgxNTI0LCAyNDU0KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjNEMDMxOSINCi0JCQkJY2xpZW50ICAgICAJQDEwOA0KLQkJCQlzdXBwbGllciAgIAlAMTUzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc2LCAyMTc2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3NiwgMjI3NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTU0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIzNTAwREQiDQotCQkJCWNsaWVudCAgICAgCUAxMTANCi0JCQkJc3VwcGxpZXIgICAJQDE1Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM3MSwgMTg1NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNzEsIDIyNzUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE1NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyMjgwMkU3Ig0KLQkJCQljbGllbnQgICAgIAlAMTA5DQotCQkJCXN1cHBsaWVyICAgCUAxNTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MCwgMTUzNCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMjI3NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTU0KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjEiIEAxNTgNCi0JCQkJbG9jYXRpb24gICAJKDIyMDYsIDIyNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODQwMUIxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMTU5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE1OA0KLQkJCQkJbG9jYXRpb24gICAJKDczNCwgLTI4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNjgsIDE2NzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2UiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTIyMzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NjAwMEYiDQotCQkJCQljbGllbnQgICAgIAlAMTU4DQotCQkJCQlzdXBwbGllciAgIAlAMTUyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIwNiwgMTYxMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNjAsIDE2NzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYyIiBAMTYyDQotCQkJCQlQYXJlbnRfVmlldyAJQDE1OA0KLQkJCQkJbG9jYXRpb24gICAJKDczNCwgLTI4NSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NjAwMjMiDQotCQkJCQljbGllbnQgICAgIAlAMTU4DQotCQkJCQlzdXBwbGllciAgIAlAMTUzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjIwNiwgMjI1OSkNCi0JCQkJCSAgICAoMjIwNiwgMjU1NikNCi0JCQkJCSAgICAoMTg1NiwgMjU1NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg1NiwgMjU1NikpKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEgRGVmaW5pdGlvbnMiDQotCQkJcXVpZCAgICAgICAJIjNBRDVFNDhBMDI2MiINCi0JCQl0aXRsZSAgICAgIAkiMi4xIERlZmluaXRpb25zIg0KLQkJCXpvb20gICAgICAgCTgzDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiIgQDE2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgMTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMTYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklEZWZpbml0aW9uIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDExMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRDkwMTQyIg0KLQkJCQl3aWR0aCAgICAgIAk3MDYNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDE2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NiwgODk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQkJd2lkdGggICAgICAJMjk0DQotCQkJCWhlaWdodCAgICAgCTEyMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMTY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgNjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTEwLCA1NDUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTE4Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTEyLCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTAwLCAxMDU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjgwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDE2Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODA4LCAxNDg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk2LCAxMzYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDE2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTI0LCAxNjAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjgwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMTY5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCAzOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJd2lkdGggICAgICAJNTI4DQotCQkJCWhlaWdodCAgICAgCTQyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDE3MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1OCwgODYwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NCIgQDE3MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzANCi0JCQkJCWxvY2F0aW9uICAgCSg2MiwgLTM2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxNywgNTM1KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkJCQljbGllbnQgICAgIAlAMTcwDQotCQkJCQlzdXBwbGllciAgIAlAMTY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU4LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAzLCA1MTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTY2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDE3NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzANCi0JCQkJCWxvY2F0aW9uICAgCSg2MiwgLTM2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4NiwgOTA5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VUeXBlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3OTA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzZBIg0KLQkJCQkJY2xpZW50ICAgICAJQDE3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDE2NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNTgsIDg2MCkNCi0JCQkJCSAgICAoMTM1OCwgOTQ4KQ0KLQkJCQkJICAgICgxNjc3LCA5NDgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU4LCA4NjApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NywgOTQ4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgOTg3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkyNjU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMTc3DQotCQkJCWxvY2F0aW9uICAgCSgxNjEyLCA1OTUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMTc4DQotCQkJCQlQYXJlbnRfVmlldyAJQDE3Nw0KLQkJCQkJbG9jYXRpb24gICAJKDEyLCAyMjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIzLCA1MTIpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSINCi0JCQkJCWNsaWVudCAgICAgCUAxNzcNCi0JCQkJCXN1cHBsaWVyICAgCUAxNjkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjEyLCA1OTUpDQotCQkJCQkgICAgKDE0NjQsIDU5NSkNCi0JCQkJCSAgICAoMTQ2NCwgNDUzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjQsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjQsIDQ5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1ODY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAxODENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTc3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTIsIDIyNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTIsIDU1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4MDMzNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE3Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDE2NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjEyLCA1OTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkwMSwgNTk1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NCwgNjUyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQxMDA0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzYsIDY0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIyNTk0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDE4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI3OSwgMTEzNykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwMzAxRTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAxODYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTg1DQotCQkJCQlsb2NhdGlvbiAgIAkoMjcxLCAyNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjM4LCA1OTEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjA0MDBCNyINCi0JCQkJCWNsaWVudCAgICAgCUAxODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc5LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzIwLCA1ODYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDQ5NzQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlcyIgQDE4OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxODUNCi0JCQkJCWxvY2F0aW9uICAgCSgyNzEsIDI3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDcsIDExNzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTM3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwNDAwQzEiDQotCQkJCQljbGllbnQgICAgIAlAMTg1DQotCQkJCQlzdXBwbGllciAgIAlAMTY2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI3OSwgMTEzNykNCi0JCQkJCSAgICAoMTI3OSwgMTIwOCkNCi0JCQkJCSAgICAoMTg5MSwgMTIwOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5MSwgMTIwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDExNzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzNDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc5NywgMTI0NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NDQwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDE5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIxMiwgMTE1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MTAxMDQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYiIEAxOTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTkzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNCwgMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgNTk0KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNEEiDQotCQkJCQljbGllbnQgICAgIAlAMTkzDQotCQkJCQlzdXBwbGllciAgIAlAMTY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxMiwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MSwgNjI0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU3OTYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGVzIiBAMTk3DQotCQkJCQlQYXJlbnRfVmlldyAJQDE5Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjQsIDIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTEsIDE0NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRUeXBlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyMzY5OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzIwMzU0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDE2Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMTIsIDExNTkpDQotCQkJCQkgICAgKDEyMTIsIDE0OTApDQotCQkJCQkgICAgKDE1ODcsIDE0OTApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEyLCAxMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODcsIDE0OTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTMzLCAxNDUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI1NjExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDE1NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU4NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTciIEAyMDENCi0JCQkJbG9jYXRpb24gICAJKDExMTQsIDE1ODUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzcwMDk1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4IiBAMjAyDQotCQkJCQlQYXJlbnRfVmlldyAJQDIwMQ0KLQkJCQkJbG9jYXRpb24gICAJKC00MDYsIDI0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDY4MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzcxIg0KLQkJCQkJY2xpZW50ICAgICAJQDIwMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTQsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTUsIDc1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjcwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdzIiBAMjA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDIwMQ0KLQkJCQkJbG9jYXRpb24gICAJKC00MDYsIDI0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTEsIDE2NzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY2MzQ3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzN0IiDQotCQkJCQljbGllbnQgICAgIAlAMjAxDQotCQkJCQlzdXBwbGllciAgIAlAMTY4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTExNCwgMTU4NSkNCi0JCQkJCSAgICAoMTExNCwgMTcxNikNCi0JCQkJCSAgICAoMjExNSwgMTcxNikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTQsIDE1ODUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgMTcxNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTMsIDE2NzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDUwNzQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAxNCwgMTc1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMTA3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDIwOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI4LCAxOTIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjgwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5IiBAMjEwDQotCQkJCWxvY2F0aW9uICAgCSgxMDY2LCAxNTMzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjdCMDMxMSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMCIgQDIxMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNTIxLCAtMTExKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyNSwgNjY5KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwN0YiDQotCQkJCQljbGllbnQgICAgIAlAMjEwDQotCQkJCQlzdXBwbGllciAgIAlAMTY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjYsIDE1MzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NiwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOSwgNzU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzE5Njk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2VydmljZXMiIEAyMTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTMsIDIwMjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVNlcnZpY2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkxODI0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwODkiDQotCQkJCQljbGllbnQgICAgIAlAMjEwDQotCQkJCQlzdXBwbGllciAgIAlAMjA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTA2NiwgMTUzMykNCi0JCQkJCSAgICAoMTA2NiwgMjA1OSkNCi0JCQkJCSAgICAoMTYxOSwgMjA1OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjYsIDE1MzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxOSwgMjA1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTQsIDIwMzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDAxOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMiwgMjExMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyMDUxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIxOA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMUY4MDM4MiINCi0JCQkJY2xpZW50ICAgICAJQDE2OQ0KLQkJCQlzdXBwbGllciAgIAlAMTYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY0LCAyNjMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODUsIDI2MykpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjMgRXh0ZW5zaWJpbGl0eSINCi0JCQlxdWlkICAgICAgIAkiM0FENjBDNTEwMTkyIg0KLQkJCXRpdGxlICAgICAgCSIyLjEuMyBFeHRlbnNpYmlsaXR5Ig0KLQkJCXpvb20gICAgICAgCTgwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMjE5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg1NzYsIDE1ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5NCwgMTUzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJd2lkdGggICAgICAJMTgyDQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDIyMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMTg4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4NywgMTgzNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBAMjIxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzQyLCAxNjc1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCQl3aWR0aCAgICAgIAkxODINCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiIEAyMjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDIzMzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDIyODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQkJd2lkdGggICAgICAJMjc0DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDIyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzM2LCAxNzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjMsIDE3MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCXdpZHRoICAgICAgCTM2NA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyMjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDEzNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3ODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCA4NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIg0KLQkJCQl3aWR0aCAgICAgIAk4MDQNCi0JCQkJaGVpZ2h0ICAgICAJMTcyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEAyMjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMTk1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAxODk5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkJCXdpZHRoICAgICAgCTI3NA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEAyMjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDIxNDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg2MywgMjA5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3V0cHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCQkJd2lkdGggICAgICAJMzA4DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDIyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTIzNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJd2lkdGggICAgICAJMjIyDQotCQkJCWhlaWdodCAgICAgCTE0Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAyMjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxNDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMzUsIDEzNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMjI5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCA2ODgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5LCA1ODApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDksIDY0MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMSkNCi0JCQkJd2lkdGggICAgICAJNTYwDQotCQkJCWhlaWdodCAgICAgCTI0MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyMzANCi0JCQkJbG9jYXRpb24gICAJKDQ4MCwgMTAzOSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQ4MCwgMTAzOSkNCi0JCQkJICAgICg0ODAsIDgwOCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MDBDQjAwQUEiDQotCQkJCWNsaWVudCAgICAgCUAyMjANCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2NiwgMTgyNCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjYsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1QTQwMjdFIg0KLQkJCQljbGllbnQgICAgIAlAMjI2DQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTcsIDIwNzkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk3LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA5Mzg2MDJDOSINCi0JCQkJY2xpZW50ICAgICAJQDIyMg0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE5LCAyMjcxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxOSwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1QjU5QjAwNzIiDQotCQkJCWNsaWVudCAgICAgCUAyMjUNCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTg4LCAxODg3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg4LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDYwMDkyMDJGNyINCi0JCQkJY2xpZW50ICAgICAJQDIyMw0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3OTcsIDE2OTUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3OTcsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZBMEYwMkYwIg0KLQkJCQljbGllbnQgICAgIAlAMjE5DQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYwMSwgMTUxOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwMSwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkRCODAzRDQiDQotCQkJCWNsaWVudCAgICAgCUAyMjcNCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExLCAxMjIzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExLCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzOA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFQjAxMDMxMSINCi0JCQkJY2xpZW50ICAgICAJQDIyOA0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0MTQsIDEzNDQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZBMjAwMjVFIg0KLQkJCQljbGllbnQgICAgIAlAMjIxDQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE2NjMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDI5LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA2ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDU4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDY0NCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NSkNCi0JCQkJd2lkdGggICAgICAJNTYzDQotCQkJCWhlaWdodCAgICAgCTIzNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDI0MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5MSwgNjcyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMiIgQDI0Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNDENCi0JCQkJCWxvY2F0aW9uICAgCSgyMywgNTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODQ3LCA2MzEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCQkJCWNsaWVudCAgICAgCUAyNDENCi0JCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2MCwgNjcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODMwLCA2MjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzk2OTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAyNDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjQxDQotCQkJCQlsb2NhdGlvbiAgIAkoMjMsIDU2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTUsIDUyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzc5MDcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIg0KLQkJCQkJY2xpZW50ICAgICAJQDI0MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDI0MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkxLCA2NzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyMywgNjcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NiwgNjI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA5NDAyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjMsIDc2NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzMjQ3OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTkyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiIEAyNDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYzMCwgODQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiV1NETEVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDE0NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTc1MykNCi0JCQkJd2lkdGggICAgICAJNzc0DQotCQkJCWhlaWdodCAgICAgCTI0MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyNTANCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDQwMikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMjQ5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEwMDgsIDQwMikNCi0JCQkJICAgICgxMDA4LCAzMTIpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZFM0MwM0Q0Ig0KLQkJCQljbGllbnQgICAgIAlAMjI5DQotCQkJCXN1cHBsaWVyICAgCUAyNDkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5MiwgNTY4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDkyLCA0MDIpDQotCQkJCWRyYXdTdXBwbGllciAJQDI1MCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxNDkwM0QwIg0KLQkJCQljbGllbnQgICAgIAlAMjQwDQotCQkJCXN1cHBsaWVyICAgCUAyMjQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMTUsIDU3MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTUsIDI0NikpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRERGNTM1MDJDMyINCi0JCQkJY2xpZW50ICAgICAJQDI0MA0KLQkJCQlzdXBwbGllciAgIAlAMjQ5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzYyLCA1NzEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzYyLCA0MDIpDQotCQkJCWRyYXdTdXBwbGllciAJQDI1MCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAxNDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzI5LCAxMzAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTkyNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiDQotCQkJCXdpZHRoICAgICAgCTk0NQ0KLQkJCQloZWlnaHQgICAgIAkyMzUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFFQzAxQ0IiDQotCQkJCWNsaWVudCAgICAgCUAyNTQNCi0JCQkJc3VwcGxpZXIgICAJQDI0MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc5NiwgMTI5MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3OTYsIDgwNSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MyIgQDI1Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjYzOSwgMTczNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBMjAyNkUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjQiIEAyNTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjU2DQotCQkJCQlsb2NhdGlvbiAgIAkoNjA3LCAzNDIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNzk3LCAxMzgwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkIiDQotCQkJCQljbGllbnQgICAgIAlAMjU2DQotCQkJCQlzdXBwbGllciAgIAlAMjU0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjYzOSwgMTczNCkNCi0JCQkJCSAgICAoMjgyNCwgMTczNCkNCi0JCQkJCSAgICAoMjgyNCwgMTQyMSkNCi0JCQkJCSAgICAoMjY2NCwgMTQyMSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzksIDE3MzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY2NCwgMTQyMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI3MzEsIDE0NzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNoaWxkcmVuIiBAMjYwDQotCQkJCQlQYXJlbnRfVmlldyAJQDI1Ng0KLQkJCQkJbG9jYXRpb24gICAJKDYwNywgMzQyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NCwgMTY1OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjaGlsZHJlbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5ODU2MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNGNzg5NkE3MDEyQyINCi0JCQkJCWNsaWVudCAgICAgCUAyNTYNCi0JCQkJCXN1cHBsaWVyICAgCUAyNTQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyNjM5LCAxNzM0KQ0KLQkJCQkJICAgICgyMTkxLCAxNzM0KQ0KLQkJCQkJICAgICgyMTkxLCAxNTI1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzOSwgMTczNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTkxLCAxNTI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI0NSwgMTU5MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIg0KLQkJCXF1aWQgICAgICAgCSIzQUU4RUQ3MjAxQkQiDQotCQkJdGl0bGUgICAgICAJIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyINCi0JCQl6b29tICAgICAgIAk5MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCIgQDI2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3MTIsIDIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklJbXBvcnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDIyLCAxMjcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMjAyMDExOSINCi0JCQkJd2lkdGggICAgICAJNTk4DQotCQkJCWhlaWdodCAgICAgCTIxOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIiBAMjY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCAxMTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDIsIDEwNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTmFtZXNwYWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzQ0QzMDAzMCINCi0JCQkJd2lkdGggICAgICAJNDc5DQotCQkJCWhlaWdodCAgICAgCTIxNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAyNjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTIxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5NCwgMTE0MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAk2OTQNCi0JCQkJaGVpZ2h0ICAgICAJMTczDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjY2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQsIDIzNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJd2lkdGggICAgICAJNDkwDQotCQkJCWhlaWdodCAgICAgCTMyMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNyIgQDI2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMzA5LCA3ODYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTUwMDJEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVOYW1lc3BhY2VzIiBAMjY4DQotCQkJCQlQYXJlbnRfVmlldyAJQDI2Nw0KLQkJCQkJbG9jYXRpb24gICAJKC05MSwgMjU4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjY5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYxLCA5NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU5hbWVzcGFjZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTg4NDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NjAzMzIiDQotCQkJCQljbGllbnQgICAgIAlAMjY3DQotCQkJCQlzdXBwbGllciAgIAlAMjY0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMwOSwgNzg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwOSwgMTAyOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0OCwgOTczKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY4NzA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOCwgOTEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTI1MDk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzOCIgQDI3Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNjcNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTEsIDI1OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OCwgNTkyKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTYwMzI4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDI2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDI2Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDU0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzOSwgNTgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ0OTYxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiIEAyNzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDcyLCA3MjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTUsIDU4MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbXBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJCQl3aWR0aCAgICAgIAk0NTINCi0JCQkJaGVpZ2h0ICAgICAJMzA0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUxIiBAMjc2DQotCQkJCWxvY2F0aW9uICAgCSgxNDg2LCAxMDAxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEIxRENDMDJFNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2NoZW1hIiBAMjc3DQotCQkJCQlQYXJlbnRfVmlldyAJQDI3Ng0KLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzcsIDEwMTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MjU5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxRENFMDI3MCINCi0JCQkJCWNsaWVudCAgICAgCUAyNzYNCi0JCQkJCXN1cHBsaWVyICAgCUAyNjUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDg2LCAxMDAxKQ0KLQkJCQkJICAgICgxNjMyLCAxMDAxKQ0KLQkJCQkJICAgICgxNjMyLCAxMTMwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgMTAwMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMyLCAxMTMwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2MywgMTAxOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MjU5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTIiIEAyODANCi0JCQkJCVBhcmVudF9WaWV3IAlAMjc2DQotCQkJCQlsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxRENFMDI3QSINCi0JCQkJCWNsaWVudCAgICAgCUAyNzYNCi0JCQkJCXN1cHBsaWVyICAgCUAyNzUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgMTAwMCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg2LCA4NzIpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzOSIgQDI4MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4NywgNDAzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzRTNBMDAyRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MCIgQDI4Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyODENCi0JCQkJCWxvY2F0aW9uICAgCSg2ODcsIC0xMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA2LCA0ODApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRjIiDQotCQkJCQljbGllbnQgICAgIAlAMjgxDQotCQkJCQlzdXBwbGllciAgIAlAMjc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTA4NywgNDAzKQ0KLQkJCQkJICAgICgxMzY0LCA0MDMpDQotCQkJCQkgICAgKDEzNjQsIDU2OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY0LCA1NjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZURlZmluaXRpb24iIEAyODQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjgxDQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA1LCAzNjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42Mzc1MzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRTNDMDFFOCINCi0JCQkJCWNsaWVudCAgICAgCUAyODENCi0JCQkJCXN1cHBsaWVyICAgCUAyNjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgNDAzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY0NSwgNDAzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzI3LCA0NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQ5MTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTciIEAyODcNCi0JCQkJbG9jYXRpb24gICAJKDczNywgODI2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1OCIgQDI4OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyODcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjcxLCAxMDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTIsIDY0NykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSINCi0JCQkJCWNsaWVudCAgICAgCUAyODcNCi0JCQkJCXN1cHBsaWVyICAgCUAyNjYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3MzcsIDgyNikNCi0JCQkJCSAgICAoNTEwLCA4MjYpDQotCQkJCQkgICAgKDUxMCwgNTQ0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA1NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NTcsIDU5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAyOTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMjg3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0NCwgNzczKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbXBvcnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk5MTg5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiDQotCQkJCQljbGllbnQgICAgIAlAMjg3DQotCQkJCQlzdXBwbGllciAgIAlAMjc1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDYsIDgyNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExODAsIDg3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjIxMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTYyLCA5MzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjk1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjIwMEQwMzQwIg0KLQkJCQljbGllbnQgICAgIAlAMjc1DQotCQkJCXN1cHBsaWVyICAgCUAyNjMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTUsIDU2OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTUsIDMzMykpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4yIFR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQjg1QUU1OTAzN0UiDQotCQkJdGl0bGUgICAgICAJIjIuMiBUeXBlcyINCi0JCQl6b29tICAgICAgIAk5MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJODENCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAyOTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxMjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg5NSwgMTE1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTUwMA0KLQkJCQloZWlnaHQgICAgIAkxNzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMjk3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMzYsIDE2MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkwNiwgMTUzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzgNCi0JCQkJaGVpZ2h0ICAgICAJMTYyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMjk4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTk2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjk4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgMTgyOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJd2lkdGggICAgICAJNTM1DQotCQkJCWhlaWdodCAgICAgCTMwNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDI5OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjk5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4LCAxMDY3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQl3aWR0aCAgICAgIAk0NjYNCi0JCQkJaGVpZ2h0ICAgICAJMjU4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ3IiBAMzAwDQotCQkJCWxvY2F0aW9uICAgCSg3MzUsIDExNzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMEM0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBAMzAxDQotCQkJCQlQYXJlbnRfVmlldyAJQDMwMA0KLQkJCQkJbG9jYXRpb24gICAJKDE0MywgNjc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc1LCAxMTMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjY5MDA2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMjciDQotCQkJCQljbGllbnQgICAgIAlAMzAwDQotCQkJCQlzdXBwbGllciAgIAlAMjk2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4ODYsIDExNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzksIDEyMDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODg3MDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ4IiBAMzA0DQotCQkJCQlQYXJlbnRfVmlldyAJQDMwMA0KLQkJCQkJbG9jYXRpb24gICAJKDE0MywgNjc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDMzMSINCi0JCQkJCWNsaWVudCAgICAgCUAzMDANCi0JCQkJCXN1cHBsaWVyICAgCUAyOTkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4NSwgMTE3MikpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ5IiBAMzA1DQotCQkJCWxvY2F0aW9uICAgCSg1MjcsIDE1OTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTIwM0IyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVsZW1lbnREZWNsYXJhdGlvbiIgQDMwNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjUsIDEwOTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjYsIDE1NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzc1Mzk0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMUMiDQotCQkJCQljbGllbnQgICAgIAlAMzA1DQotCQkJCQlzdXBwbGllciAgIAlAMjk3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUyNywgMTU5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTcsIDE1OTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDcsIDE2NDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTU4NzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUwIiBAMzA5DQotCQkJCQlQYXJlbnRfVmlldyAJQDMwNQ0KLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMjYiDQotCQkJCQljbGllbnQgICAgIAlAMzA1DQotCQkJCQlzdXBwbGllciAgIAlAMjk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNTI3LCAxNTkyKQ0KLQkJCQkJICAgICg0MzcsIDE1OTIpDQotCQkJCQkgICAgKDQzNywgMTMxMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUyNywgMTU5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDEzMTMpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NSIgQDMxMA0KLQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAxOTExKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDNDY4MjkzMDNFNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDMxMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzgsIDE4NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2UiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDg1NjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNDY4Mjk2MDEwRSINCi0JCQkJCWNsaWVudCAgICAgCUAzMTANCi0JCQkJCXN1cHBsaWVyICAgCUAyOTgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDE5MTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NDMsIDE5NjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU2IiBAMzE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDMxMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xNCwgMTE5MSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMTgiDQotCQkJCQljbGllbnQgICAgIAlAMzEwDQotCQkJCQlzdXBwbGllciAgIAlAMjk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzIyLCAxOTExKQ0KLQkJCQkJICAgICgyMjksIDE5MTEpDQotCQkJCQkgICAgKDIyOSwgMTMxMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMyMiwgMTkxMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjksIDEzMTMpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAzMTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDYwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE1LCA1MTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCQl3aWR0aCAgICAgIAkzODkNCi0JCQkJaGVpZ2h0ICAgICAJMjE2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMzE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJd2lkdGggICAgICAJMjIyDQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDMxNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCA2MDQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDMxOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCAzOTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDY0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDcNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NjEwMTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCQkJCWNsaWVudCAgICAgCUAzMTcNCi0JCQkJCXN1cHBsaWVyICAgCUAzMTUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjA2LCA2MDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjYsIDU2OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4Mzg4Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTQiIEAzMjENCi0JCQkJCVBhcmVudF9WaWV3IAlAMzE3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMzLCAzMTMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiINCi0JCQkJCWNsaWVudCAgICAgCUAzMTcNCi0JCQkJCXN1cHBsaWVyICAgCUAzMTYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQsIDYwNCkNCi0JCQkJCSAgICAoMTc0LCA2MDQpDQotCQkJCQkgICAgKDE3NCwgMjI1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAyMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDI3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NzcyOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIiBAMzI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjUsIDIwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJVHlwZXMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjUsIDE1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NBRENCQjIwMDUwIg0KLQkJCQl3aWR0aCAgICAgIAkyNDgNCi0JCQkJaGVpZ2h0ICAgICAJMTY2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDMyNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3MjgsIDgwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1OSwgNzUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTczOQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyINCi0JCQkJd2lkdGggICAgICAJNzU3DQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAzMjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgMTIxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyOSwgMTEwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAk2NzMNCi0JCQkJaGVpZ2h0ICAgICAJMjUwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU5IiBAMzI3DQotCQkJCWxvY2F0aW9uICAgCSgxODI2LCA5NzUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDUwMEYyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYwIiBAMzI4DQotCQkJCQlQYXJlbnRfVmlldyAJQDMyNw0KLQkJCQkJbG9jYXRpb24gICAJKDMwNiwgNDQ3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ2MDIzRCINCi0JCQkJCWNsaWVudCAgICAgCUAzMjcNCi0JCQkJCXN1cHBsaWVyICAgCUAzMjUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjYsIDg1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzI4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzQsIDkwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY1NjQ4OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hIiBAMzMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDMyNw0KLQkJCQkJbG9jYXRpb24gICAJKDMwNiwgNDQ3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwNiwgMTAzMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDc1NzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0UiDQotCQkJCQljbGllbnQgICAgIAlAMzI3DQotCQkJCQlzdXBwbGllciAgIAlAMzI2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCAxMDkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4OCwgMTA1MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY1MTUxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQURDRDNCMDM4MCINCi0JCQkJY2xpZW50ICAgICAJQDMxNQ0KLQkJCQlzdXBwbGllciAgIAlAMzI0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDUsIDUwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwNSwgMzA3KSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDMzNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDIyNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTUsIDEzMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmxlRWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkJCXdpZHRoICAgICAgCTUwMA0KLQkJCQloZWlnaHQgICAgIAkyMTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMzUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiDQotCQkJCWNsaWVudCAgICAgCUAzMTUNCi0JCQkJc3VwcGxpZXIgICAJQDMzNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU0LCA1MDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTQsIDMzMCkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzMzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgNDY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDkwLCAzNjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY5DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAk2ODcNCi0JCQkJaGVpZ2h0ICAgICAJMjE2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxIiBAMzM3DQotCQkJCWxvY2F0aW9uICAgCSgxMjA2LCA0OTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMzM4DQotCQkJCQlQYXJlbnRfVmlldyAJQDMzNw0KLQkJCQkJbG9jYXRpb24gICAJKC01ODYsIDIzNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzM4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzYsIDM4NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCQkJCWNsaWVudCAgICAgCUAzMzcNCi0JCQkJCXN1cHBsaWVyICAgCUAzMzQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjA2LCA0OTMpDQotCQkJCQkgICAgKDEwOTQsIDQ5MykNCi0JCQkJCSAgICAoMTA5NCwgMzMwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTQsIDMzMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzM4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDM3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyODMyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDM0MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTg2LCAyMzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTk2LCA0NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMzk3MTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCINCi0JCQkJCWNsaWVudCAgICAgCUAzMzcNCi0JCQkJCXN1cHBsaWVyICAgCUAzMzYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODEsIDQ5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTUsIDU0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2NDk1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzk2LCAzOTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTQ5MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzQ1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYyN0YwMEI3Ig0KLQkJCQljbGllbnQgICAgIAlAMzI1DQotCQkJCXN1cHBsaWVyICAgCUAzMzYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MTIsIDc0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTIsIDU3MikpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4zIE1lc3NhZ2VzIg0KLQkJCXF1aWQgICAgICAgCSIzQkNFODUzRDAyQzgiDQotCQkJdGl0bGUgICAgICAJIjIuMyBNZXNzYWdlcyINCi0JCQl6b29tICAgICAgIAk4NQ0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU1lc3NhZ2UiIEAzNDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgMTIyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklNZXNzYWdlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCA3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4QUYwMDRGIg0KLQkJCQl3aWR0aCAgICAgIAkzODANCi0JCQkJaGVpZ2h0ICAgICAJMzI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUGFydCIgQDM0Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyOSwgMTI0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU5OQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklQYXJ0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyOSwgNzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU5OQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOTNGMDFCRSINCi0JCQkJd2lkdGggICAgICAJNjE3DQotCQkJCWhlaWdodCAgICAgCTMyNA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAzNDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA4MTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDY5MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJd2lkdGggICAgICAJNDkyDQotCQkJCWhlaWdodCAgICAgCTI3Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM0OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOTZEMDJGMSINCi0JCQkJY2xpZW50ICAgICAJQDM0OA0KLQkJCQlzdXBwbGllciAgIAlAMzQ3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzA0LCA2NzgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzA0LCAzODYpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAzNTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDY1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCA1MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCXdpZHRoICAgICAgCTQzMg0KLQkJCQloZWlnaHQgICAgIAkzMjINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThEMTAyQkEiDQotCQkJCWNsaWVudCAgICAgCUAzNTANCi0JCQkJc3VwcGxpZXIgICAJQDM0Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDQ1LCA0OTUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDM4OCkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxIiBAMzUyDQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDk1MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRTAwRTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBhcnRzIiBAMzUzDQotCQkJCQlQYXJlbnRfVmlldyAJQDM1Mg0KLQkJCQkJbG9jYXRpb24gICAJKDE3NiwgMzI4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUyLCA4OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk3NDUyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNjEiDQotCQkJCQljbGllbnQgICAgIAlAMzUyDQotCQkJCQlzdXBwbGllciAgIAlAMzQ4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDk1MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4NywgMTAwNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTgwOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NjcsIDEwNjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDIwMzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyIiBAMzU3DQotCQkJCQlQYXJlbnRfVmlldyAJQDM1Mg0KLQkJCQkJbG9jYXRpb24gICAJKDE3NiwgMzI4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA0LCA4OTMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDRUJGMDA1NyINCi0JCQkJCWNsaWVudCAgICAgCUAzNTINCi0JCQkJCXN1cHBsaWVyICAgCUAzNTANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2ODgsIDk1MikNCi0JCQkJCSAgICAoNDQ1LCA5NTIpDQotCQkJCQkgICAgKDQ0NSwgODE3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCA4MTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzOTMsIDkxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0NzYwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkpKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAieHNkIg0KLQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlhTRCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSJvcmcuZWNsaXBzZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJ4c2QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy94c2QvMjAwMi9YU0QiKSkNCi0JCXF1aWQgICAgICAgCSIzOUFCREM2RjAxQUEiDQotCQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBbm5vdGF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUUxNzcwMTE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGRDRFMjAzNjYiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcHBsaWNhdGlvbkluZm9ybWF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFQkYwMkM4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2VySW5mb3JtYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQkJGN0VFQTAxNTciDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQkJGN0YwNTAxRTIiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NQXR0ciINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCN0RDMDE5MyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTYxMDNCRSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODdGNTIwMkI0Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjcyRDhFMjAwRUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDNBMDIyMSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJFQjAyQTgiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzgwMEQyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4N0Y3QjAzODYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZVVzZSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNzJENzM3MDM4RiINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjcyRDdCQjAzNDkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0NGMzAyN0QiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0REQjAzQjciDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cmFpbnQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0RFMDAyRDgiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb25zdHJhaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IwMjIwMzgyIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3MTlEOTAzNDEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQm91bmRlZEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzUxRDAzNDQiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2M0MwMjI0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NTJBMDBDQyINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ2FyZGluYWxpdHlGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1NUQwM0QyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjRGMDEzMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzU2QzAxNTMiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDYXJkaW5hbGl0eSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhCODAyODYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkFBMjAzMTAiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXJpdmF0aW9uTWV0aG9kIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM2RTQwMjBFIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGVyaXZhdGlvbk1ldGhvZCINCi0JCQkJaW5pdHYgICAgICAJInJlc3RyaWN0aW9uIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzcxRDAyNkEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzczODAwQzUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29udGVudFR5cGVDYXRlZ29yeSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQTQyMDJCOCINCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQjhBMDNFNiINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNjE4MDE0RCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wbGV4RmluYWwiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9jayINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGQjk3MDA2RSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1peGVkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MzMUFGNUUwM0E2Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wb25lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBOTAzRDIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEREI1MDFBNSINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbmluZ0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDODAwMzk0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaWFnbm9zdGljIg0KLQkJCXF1aWQgICAgICAgCSIzQkZFNUY5MTAwNDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QzBGNEMwMUExIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2V2ZXJpdHkiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjkxQzAwNUQiDQotCQkJCXR5cGUgICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTVGREQwMjgwIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQzA2Mzc0MzAxNkIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaW5lIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYwN0UwMjEzIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlpbml0diAgICAgIAkiMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbHVtbiINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MTFFMDI5NiINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJaW5pdHYgICAgICAJIjEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJub2RlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwMTZCNkIwMjAwIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NTm9kZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFubm90YXRpb25VUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQzA2Mzc0RjAxODYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODVGMTcwMDJFIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2NjAzMzkiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmlsbGFibGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkZCNDAyOUYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzQ2ODAzNjgiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzRBMDAzQjkiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzRFMDAwMEUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEQxNEMwMEIyIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2siDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDE2ODAxQzEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg5RjYyMDNDRiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaXJjdWxhciINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MzNERDQjAwMDE4Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDOUQwM0M3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdDNjQwMDU0Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDI1NjgwMjU5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Mzc0MDI1MyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhY2V0TmFtZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODlGQjQwMUVDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWZmZWN0aXZlVmFsdWUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBQUUzMDNCNiINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGZWF0dXJlIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTBBMkMwMzA3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkY4MTAyMEYiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cmFpbnQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkY4ODAwQzUiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb25zdHJhaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZm9ybSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDJCMDMzRSINCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3MUExQjAxNkYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJnbG9iYWwiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMDA3MDM3MiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmZWF0dXJlUmVmZXJlbmNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTA0NDAxODUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGaXhlZEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNjk5RTAwQzEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDODgwMUI0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZml4ZWQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkE2MDAyMDEiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOTkwMDE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3OUQyMDA4QSINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNjlFODAxRDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDN0IwMzk2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBQTMwMjQyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDFDNzAxNDMiDQotCQkJCXR5cGUgICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJbXBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4QzkzMDE3RiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhEOTAwM0UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURCMTUwMzZDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREluY2x1ZGUiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4QzdEMDI1MCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhEQzAzODEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciINCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RMZW5ndGhGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3NjIwMEU3Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NzgwMDJERiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc2QzAwNEIiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3ODk2MDBDMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I4RTAzMDkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4RmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQzMTAzQUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRTIwMUY3Ig0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMTc0MDI3RCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMTkzMDM1NCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzg3RDAwREEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCODMwM0I4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heExlbmd0aEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCN0QwMEZDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3N0RBMDBGMyINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5FeGNsdXNpdmVGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5MkQwMDBBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjU5MDI4MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5GYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRDI0MDA5OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQzBBMUVEMTAzOTgiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluY2x1c2l2ZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEExQTIwMDhFIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2x1c2l2ZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEExQkUwM0UyIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluSW5jbHVzaXZlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3ODg3MDJDOSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1MjAzNTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluTGVuZ3RoRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzdDNDAwQzAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3OTkwMTVFIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1vZGVsR3JvdXAiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NEE2NDAyNzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbXBvc2l0b3IiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0YxRDAxQ0YiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wb3NpdG9yIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRTIwMzgxIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjU1MDM4NSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FDNDAwOTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEExRjYwMkU4Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROYW1lZENvbXBvbmVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCQTBDRUEyMDE5NyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ3MDAwMTQyIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ3MDQwMzFFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxpYXNOYW1lIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTU3RjAxMjciDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1UkkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNTg3MDBFMiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzVVJJIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTVBQTAyQUYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTA5NjMwMjVFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ5NDMwMkYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTRGMDIzQyINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzeXN0ZW1JZGVudGlmaWVyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQzMkUwMEYwIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHVibGljSWRlbnRpZmllciINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzM0MDM5NyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROdW1lcmljRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY0MjAwNzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1QTMwMDEyIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RPcmRlcmVkRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NEREMDI0OCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY1OTAxMkMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc0RjYwMkRBIg0KLQkJCQl0eXBlICAgICAgIAkiWFNET3JkZXJlZCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXJ0aWNsZSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEZDMDFFNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaW5PY2N1cnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0Y4RTAzQjIiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWluaXR2ICAgICAgCSIxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWF4T2NjdXJzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOTkwM0FFIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlpbml0diAgICAgIAkiMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXJ0aWNsZUNvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjc4MEJEOTAwNTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhdHRlcm5GYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2Q0E1MDM4RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qzc5MDMxMSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGRDRCQTAyM0MiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTBBMjYwMzZEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNjgwMDIxNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2QUUyMDYwMTcyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkIzMDFENSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQjY0MDI0MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIg0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlcGVhdGFibGVGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBQTYwMzFBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzhGMDAyRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hIg0KLQkJCXF1aWQgICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNDNEEwMTgyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODRFNTAzREQiDQotCQkJCXR5cGUgICAgICAgCSJET01Eb2N1bWVudCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjaGVtYUxvY2F0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODY4RUMwMjI2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjlCRkYwMTgwIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlRm9ybURlZmF1bHQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTA0QjAxMDIiDQotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIg0KLQkJCQlpbml0diAgICAgIAkidW5xdWFsaWZpZWQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50Rm9ybURlZmF1bHQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTA3ODAwQUMiDQotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIg0KLQkJCQlpbml0diAgICAgIAkidW5xdWFsaWZpZWQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbERlZmF1bHQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwQzRBNzAwMzgiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9ja0RlZmF1bHQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjU5RDAyRDgiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJzaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0QyMkQ2RDgwMzU2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUNvbXBvc2l0b3IiDQotCQkJcXVpZCAgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREI1NjAwOTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4OENCODAwQkEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4RTYwMzcyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFEaXJlY3RpdmUiDQotCQkJcXVpZCAgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTMyMTAyQUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjaGVtYUxvY2F0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ5QjMwMzMwIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY29wZSINCi0JCQlxdWlkICAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDRDY0MDIzMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1RjU1MDMyQiINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhcmlldHkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzE1ODAwQTkiDQotCQkJCXR5cGUgICAgICAgCSJYU0RWYXJpZXR5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTQ0RjAxNDYiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEU2ltcGxlRmluYWwiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjY1RTAzNUEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEU2ltcGxlRmluYWwiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWxpZEZhY2V0cyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBQjBGMDBCNiINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVGVybSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEFBMDFEMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QkQyNDQwMDY5Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzlBMDAyMEUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNjEwMzM3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3OUFCMDIzMiINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkY1MDEzQSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdoaXRlU3BhY2VGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4NDYwMUI3Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3ODYyMDA0NSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzg1MDAyMDEiDQotCQkJCXR5cGUgICAgICAgCSJYU0RXaGl0ZVNwYWNlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdpbGRjYXJkIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDBFOTAxOUUiDQotCQkJCXR5cGUgICAgICAgCSJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VDb25zdHJhaW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0NGODYwMjIzIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2Nlc3NDb250ZW50cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMTJFMDFFNCINCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2Nlc3NDb250ZW50cyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0JEQjcwMUY5Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RYUGF0aERlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZEODRGNzAwOTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFyaWV0eSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ5MDE1MDNERSINCi0JCQkJdHlwZSAgICAgICAJIlhTRFhQYXRoVmFyaWV0eSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I3QkJCRTEwMUIxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUF0dHIiDQotCQkJcXVpZCAgICAgICAJIjNCQkY4Qzg5MDFCNiINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uQXR0ciINCi0JCQkJcXVpZCAgICAgICAJIjNCQkY4Q0IwMDBENSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCINCi0JCQlxdWlkICAgICAgIAkiM0MyNzg1MEUwMzgxIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Eb2N1bWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NTFCMDNDNiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01FbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjgxODk3OTAyMDAiDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjgxODlEQjAzNzQiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NTm9kZSINCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0QTUwMTE3Ig0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Ob2RlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY1QkYwMDJEIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlZhbHVlIg0KLQkJCXF1aWQgICAgICAgCSIzQzA0MEI1QjAzMUYiDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubGFuZy5PYmplY3QiDQotCQkJCXF1aWQgICAgICAgCSIzQzA0MEI4RDAzRDUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiDQotCQkJcXVpZCAgICAgICAJIjNCQTdCMEU4MDFBOCINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3B0aW9uYWwiDQotCQkJCXF1aWQgICAgICAgCSIzQkE3QjExNTAyQjciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9oaWJpdGVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjIwMkQzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkE3QjEyOTAyRjAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ2FyZGluYWxpdHkiDQotCQkJcXVpZCAgICAgICAJIjNCQzc3MTVEMDA5QiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluaXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxREMwMkVEIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY291bnRhYmx5SW5maW5pdGUiDQotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFFQzAxNDEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleEZpbmFsIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzJDQTAxQ0IiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMkU3MDBEQSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyRUEwMTZBIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2RDIwMTEyIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBvc2l0b3IiDQotCQkJcXVpZCAgICAgICAJIjNCODY5QjYyMDAzNyINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlCRDAwMDAzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2hvaWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDQjgwMTFFIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VxdWVuY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2OUNFNTAwNTciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29uc3RyYWludCINCi0JCQlxdWlkICAgICAgIAkiM0I4NjlFMjYwMUFFIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZWZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlFOEUwMjU4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZml4ZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2OUU5OTAyNzEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29udGVudFR5cGVDYXRlZ29yeSINCi0JCQlxdWlkICAgICAgIAkiM0I4NkE3OUYwM0EyIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbXB0eSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0NEMDJGMCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNpbXBsZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0QxMDBDRSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1peGVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDMwMUI3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudE9ubHkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdENzAyRTkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGVyaXZhdGlvbk1ldGhvZCINCi0JCQlxdWlkICAgICAgIAkiM0I4NkEwQjAwMENFIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDODAzMjkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMENDMDE2MiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaWFnbm9zdGljU2V2ZXJpdHkiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2OEE3MDMyRiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmF0YWwiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhDMzAzRDAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlcnJvciINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEU3MDBFMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIndhcm5pbmciDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhFQTAxRkYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmZvcm1hdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU3RkMyMDE5QSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1QTQwM0RGIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdWJzdGl0dXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY3OTAwNDUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY3RjAxQUMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjgzMDIwQiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGMjQ1MDA2OSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGb3JtIg0KLQkJCXF1aWQgICAgICAgCSIzQjlGOTEzQjAxRUIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInF1YWxpZmllZCINCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MTZGMDAyMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVucXVhbGlmaWVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkxOEMwMDdGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg2QTFFMDAyNzIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjEyMDA4NSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleXJlZiINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjEzMDE0RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaXF1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjE2MDM2NSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDNUVBMDAyMyINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYW55Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjAwMDM0Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm90Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjIwMDVGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2V0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjUwMTE3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE9yZGVyZWQiDQotCQkJcXVpZCAgICAgICAJIjNCQzc3MTUyMDJFNCINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmFsc2UiDQotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFBOTAyNzEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJ0aWFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQkIwMUZGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidG90YWwiDQotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFDNDAxQjIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUHJvY2Vzc0NvbnRlbnRzIg0KLQkJCXF1aWQgICAgICAgCSIzQjhGRjhDNzAyODQiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0cmljdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEY4MDA0NSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxheCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEY2MDM4QiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNraXAiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhFODAyQkEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDNUJFMDI3MiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2OEIwMEI4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY5NDAyOTEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjI1MDAyOTUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2ltcGxlRmluYWwiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDMjVEMDI5NSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgxMDIzMCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODMwMTM4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4ODAyNEUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjZFMDAzNzQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzU5MTAwQUUiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjY0MDIzMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NkQwMjE2Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFZhcmlldHkiDQotCQkJcXVpZCAgICAgICAJIjNCOEZGNzczMDI0OSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXRvbWljIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QTcwMkRGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0FEMDEzOSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QUYwMzlGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdoaXRlU3BhY2UiDQotCQkJcXVpZCAgICAgICAJIjNCRUVEMEY2MDM0MiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlc2VydmUiDQotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEwRjAxMTciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXBsYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjcwMzREIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29sbGFwc2UiDQotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEyOTAzOTYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEWFBhdGhWYXJpZXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhGRkI4OTAzM0EiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlbGVjdG9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkZCQUMwMTkyIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmllbGQiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRkJCMzAyNzgiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjUiDQotCQkJcXVpZCAgICAgICAJIjNDNjI2RUE3MDEwMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NiINCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQTkwMTkyIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NyINCi0JCQlxdWlkICAgICAgIAkiM0I2OURBREMwMkY1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURBREQwMjM4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQUREMDI0MiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2OSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMDZGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDcwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzBFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAzMTgiDQotCQkJCWxhYmVsICAgICAgCSJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1NkIwMkNCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDcyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1NkQwMEE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNyINCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MyINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNkIwMTk0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNkQwMzA5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNkQwMzEzIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3NSINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMDYwMjkxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwNzAxNzIiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzciDQotCQkJcXVpZCAgICAgICAJIjNCNjk0MDRFMDA2NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3OCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDUwMDI5QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDUwMDJBNSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3OSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1OUYwMDg2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1QTAwMDY5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVVzZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2QSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVVzZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgxIg0KLQkJCXF1aWQgICAgICAgCSIzQzI3NUQzMjAyMjAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODIiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3NUQzQzAxMEMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBEIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgzIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4ODdCRjAxNTAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODQiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4ODdDMDAwQTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4N0MwMDBBOCINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NSINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNUUwMUY5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNjIwMDQ2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2MjAwNTAiDQotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODciDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTg1MDEwRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4OCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTg2MDBGQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1ODYwMEZCIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZGMURFOTAxOEEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTAiDQotCQkJCXF1aWQgICAgICAgCSIzQjZGMURFQTAzNkMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkYxREVBMDM4MCINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTEiDQotCQkJcXVpZCAgICAgICAJIjNCOTAwNjg4MDFDMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5MiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNjhBMDExMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50QW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNjhBMDExQiINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRBbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTMiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzMzM1MDM0MCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5NCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RSINCi0JCQkJbGFiZWwgICAgICAJImJhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTUiDQotCQkJcXVpZCAgICAgICAJIjNCNkZEREQ3MDExMyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5NiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI2QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RkREREEwMjc1Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTciDQotCQkJcXVpZCAgICAgICAJIjNCNjgzN0RGMDI0RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5OCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0UxMDBGRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50VHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3RTEwMEZFIg0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudFR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAwNkUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzQ5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVVzZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzOTU5MDM0QSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVVzZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDEiDQotCQkJcXVpZCAgICAgICAJIjNCNjk4RTM2MDM4NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDIiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwNzIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlQ29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwN0MiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVDb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAzIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQTAxMjYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODUxQkIwMTUwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTEiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjc1MUIwODAzQzciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGFpbmVyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNFIg0KLQkJCQlsYWJlbCAgICAgIAkiY29udGFpbmVyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDYiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUIwQzAxQ0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA3Ig0KLQkJCXF1aWQgICAgICAgCSIzQjc1MUI0ODAyNjEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdENvbnRhaW5lciINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjRDMDI4NSINCi0JCQkJbGFiZWwgICAgICAJInJvb3RDb250YWluZXIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwOCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjRDMDI4NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDkiDQotCQkJcXVpZCAgICAgICAJIjNCNzUxQzMxMDM1NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTAiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMzAzMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzQiINCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTExIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIwQTAwNjYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEIwMjNGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyNDkiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEzIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4OTExNDAxQUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkxMTUwMDE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkxMTUwMDE3Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAwNTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0JGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAzQzAiDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE3Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzNFRjAxNjAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk5Ig0KLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTkiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MUU2MDI1MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjAiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDFFQTAyRjciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDMwQiINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjEiDQotCQkJcXVpZCAgICAgICAJIjNCNjlDMDU5MDE5OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjIiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRUQiDQotCQkJCWxhYmVsICAgICAgCSJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjMiDQotCQkJcXVpZCAgICAgICAJIjNDNDJEQkREMDI5NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjQiDQotCQkJCXF1aWQgICAgICAgCSIzQzQyREJFMDAxMUUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3Vic3RpdHV0aW9uR3JvdXAiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDEyOCINCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjUiDQotCQkJcXVpZCAgICAgICAJIjNCNkQyM0I5MDFDRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjYiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMjNCQTAxQzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDIzQkEwMUNFIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyNyINCi0JCQlxdWlkICAgICAgIAkiM0I2RDU5NzEwMkVBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDEwNSINCi0JCQkJbGFiZWwgICAgICAJInNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjgiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTk3NTAxMTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5QjY1MzAxN0EiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAic2NvcGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjY1NDAwNkQiDQotCQkJCWxhYmVsICAgICAgCSJzY29wZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMwIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMxIg0KLQkJCXF1aWQgICAgICAgCSIzQzI5MDEwNjAyRDciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRGZWF0dXJlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTAxMEIwMDBFIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRGZWF0dXJlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzMiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwMTBCMDAxOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzMyINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMTgzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDMzQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDM0NiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzUiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEMjlFMDE0RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2VkS2V5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNjUiDQotCQkJCWxhYmVsICAgICAgCSJyZWZlcmVuY2VkS2V5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMkE4MDE2RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzNyINCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEM0QwMDNFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzOCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNFMDIyQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic2VsZWN0b3IiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRTAyMzQiDQotCQkJCWxhYmVsICAgICAgCSJzZWxlY3RvciINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAwMjUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEMzMwMzY1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmaWVsZHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNzkiDQotCQkJCWxhYmVsICAgICAgCSJmaWVsZHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0MSINCi0JCQlxdWlkICAgICAgIAkiM0I2QURDRDgwMkZDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q5MDE4QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURDRDkwMThDIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0MyINCi0JCQlxdWlkICAgICAgIAkiM0I2QURDQzUwMDdFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0NCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbmNsdWRlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDN0QwMjUwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QyINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDUiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjE3MDJDOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDYiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxODAzRTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxOTAwMDQiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ3Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCMTAyRjgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDFCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkJDRUI2MDAyNSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0OSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM2MDYwMjZGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1MCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicGFydGljbGVzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzYwNzAyMjIiDQotCQkJCWxhYmVsICAgICAgCSJwYXJ0aWNsZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUxIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIxNTAwOEEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTUyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMDk2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE2MDBBMCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTMiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzN0FDMDI1QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTQiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdBRDAzMzgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3QUQwMzM5Ig0KLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1NSINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNDUwMzk4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1NiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ5MDM4QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ5MDM5RSINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU3Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRjAyMTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEM5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEQzIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1OSINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQ3MTUwMTE5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2MCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0NzFBMDNBQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQjUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjEiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzQzg5MDEyMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjIiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0ZXJtIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTEiDQotCQkJCWxhYmVsICAgICAgCSJ0ZXJtIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYzIg0KLQkJCXF1aWQgICAgICAgCSIzQjZBREU0MjAwOUEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURFNDMwMkZFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkFERTQzMDMwOCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNDAwNTEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkFEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNjAyQjciDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY3Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QjAwM0QiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTA3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTExIg0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjkiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRThEMDFCRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzAiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RTAxOTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk5Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWxlbWVudERlY2xhcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3MSINCi0JCQlxdWlkICAgICAgIAkiM0I2NkZERkEwMEMzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3MiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZURlY2xhcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTczIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUU5MjAyMTYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOTMwMThCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QyINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzUiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDA0OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzYiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzNzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzN0UiDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3NyINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFRkYwMjRGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3OCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI1QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI2NCINCi0JCQkJbGFiZWwgICAgICAJIm1vZGVsR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkZDMkExNzAxRUQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgwIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGQzJBMUEwMjczIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkZDMkExQTAyN0QiDQotCQkJCWxhYmVsICAgICAgCSJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4MSINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFQTcwMjNFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRUE4MDM4QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJub3RhdGlvbkRlY2xhcmF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhCIg0KLQkJCQlsYWJlbCAgICAgIAkibm90YXRpb25EZWNsYXJhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgzIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NjAyOTAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUU0NTcwMTY1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNkYiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4NSINCi0JCQlxdWlkICAgICAgIAkiM0I2RDVDQTUwMTEyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4NiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNCNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDVDQTcwM0M4Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg3Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRDAzNzQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM1QUYwMDA2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRDb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAxMCINCi0JCQkJbGFiZWwgICAgICAJImZhY2V0Q29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkM4QUUwMjAzQTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkwIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDOEFFMDYwMDUxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkM4QUUwNjAwNjUiDQotCQkJCWxhYmVsICAgICAgCSJmYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkxIg0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzRCNzAyMDgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM0QkUwMjU4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWVtYmVyVHlwZURlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTkiDQotCQkJCWxhYmVsICAgICAgCSJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkzIg0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzYzMjAxREIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDU5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZnVuZGFtZW50YWxGYWNldHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNjM1MDA2MyINCi0JCQkJbGFiZWwgICAgICAJImZ1bmRhbWVudGFsRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZEMzVBQjAyNzMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMjkxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMzVCMjAyQTUiDQotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk3Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZENTU3MjAxNkMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU1NzUwMjJGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDI0MyINCi0JCQkJbGFiZWwgICAgICAJInByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5OSINCi0JCQlxdWlkICAgICAgIAkiM0I2OUUyOTEwMTU4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMjkyMDE5RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxQTkiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAxIg0KLQkJCXF1aWQgICAgICAgCSIzQjkwMDZDRjAwODgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2RDEwMTVEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZGVyaXZhdGlvbkFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDZEMTAxNjciDQotCQkJCWxhYmVsICAgICAgCSJkZXJpdmF0aW9uQW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMyINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMzMwMjY0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwNCINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIzNDAyOEUiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwNSINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTEwMjZGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwNiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDFGOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMjAyMDMiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA3Ig0KLQkJCXF1aWQgICAgICAgCSIzQzYyNkVCMzAwMDUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzI3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUI0MDMzMiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkVCREM4NzAyNDciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEwIg0KLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMkY5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCRUJEQzhDMDMwMyINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTEiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2MjI3MDNDRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjIyQjAwNjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyINCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcG9uZW50cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyMkIwMDZDIg0KLQkJCQlsYWJlbCAgICAgIAkiY29tcG9uZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTMiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2MjY5MDE2NSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTQiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjI2QTAwMjYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJkaWFnbm9zdGljcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjI2QTAwMjciDQotCQkJCWxhYmVsICAgICAgCSJkaWFnbm9zdGljcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIg0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxNSINCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0MzEwMzVGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxNiINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbGxEaWFnbm9zdGljcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY0MzIwMUM3Ig0KLQkJCQlsYWJlbCAgICAgIAkiYWxsRGlhZ25vc3RpY3MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyINCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTciDQotCQkJcXVpZCAgICAgICAJIjNDMjFEQ0M3MDBFQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTgiDQotCQkJCXF1aWQgICAgICAgCSIzQzIxRENDRTAwNDIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRTY2hlbWEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQ0NFMDA0MyINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkU2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTkiDQotCQkJcXVpZCAgICAgICAJIjNDMjFERDBDMDNEQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjAiDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREQxMDAzMDQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciINCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyMUREMTAwMzA1Ig0KLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkU2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjEiDQotCQkJcXVpZCAgICAgICAJIjNDMjM5MTM0MDA0RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjIiDQotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwQ0EiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjM5MTM2MDBENCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjMiDQotCQkJcXVpZCAgICAgICAJIjNDMjVEM0E2MDEzMSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RDNBOTAzNzAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjVEM0E5MDM3MSINCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jaW5nRGlyZWN0aXZlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI1Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUNGMDAwNUUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDFFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFZlcnNpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUNGNDAwMjgiDQotCQkJCWxhYmVsICAgICAgCSJyb290VmVyc2lvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI3Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUQwQjAxMUIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTIxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAib3JpZ2luYWxWZXJzaW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTJCIg0KLQkJCQlsYWJlbCAgICAgIAkib3JpZ2luYWxWZXJzaW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjkiDQotCQkJcXVpZCAgICAgICAJIjNDMjVFRUFCMDAxRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzAiDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUVBRjAxMEIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTE1Ig0KLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzMSINCi0JCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMERFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzMiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIml0ZW1UeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMEUwIg0KLQkJCQlsYWJlbCAgICAgIAkiaXRlbVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzMyINCi0JCQlxdWlkICAgICAgIAkiM0MyNzg0NzMwMTk0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NDc1MDFGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYUZvclNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NDc1MDFGQiINCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYUZvclNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM1Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4ODBGNTAzRDkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODgwRjkwMDNDIg0KLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzYiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwNDYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNyINCi0JCQlxdWlkICAgICAgIAkiM0MyODgyQzUwMTM3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzOCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIg0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwcmltYXJ5Q29tcG9uZW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNzAxMTMiDQotCQkJCWxhYmVsICAgICAgCSJwcmltYXJ5Q29tcG9uZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzOSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEEwRjIwMUE0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRTUiDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDAiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDEiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBNkRCMDFFNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNkREMDNERCINCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTZERDAzREUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQzIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTcxMjAxMDgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNTEiDQotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3MTQwMTVCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0NSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3NEIwMTc4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxN0IiDQotCQkJCWxhYmVsICAgICAgCSJzaW1wbGVUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDYiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxODUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ3Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTdFRDAzQzAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcGxleFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTdGNDAxMTciDQotCQkJCWxhYmVsICAgICAgCSJjb21wbGV4VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ4Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3RjQwMTIxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0OSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE5OTQwMzBBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBOTk3MDBERCINCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUwIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE5OTcwMEU3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1MSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwODUwMjVCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1MiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDg2MDI3MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwODYwMjdBIg0KLQkJCQlsYWJlbCAgICAgIAkibWluRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUzIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RDAyNTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwOEUwMDkxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4RmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOUIiDQotCQkJCWxhYmVsICAgICAgCSJtYXhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTUiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFCMDM5NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTYiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhJbmNsdXNpdmVGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEFDMDNENCINCi0JCQkJbGFiZWwgICAgICAJIm1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4N0QwMERBIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1NyINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQUYwMzM4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1OCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEIwMDFGOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjAwMjAzIg0KLQkJCQlsYWJlbCAgICAgIAkibWluSW5jbHVzaXZlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU5Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMzAyMDciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYwIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjQwMTkwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWluRXhjbHVzaXZlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOUEiDQotCQkJCWxhYmVsICAgICAgCSJtaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjEiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEI2MDI4RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjIiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhFeGNsdXNpdmVGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI3MDIyMSINCi0JCQkJbGFiZWwgICAgICAJIm1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2MyINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMDUxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2NCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDI0NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMjUwIg0KLQkJCQlsYWJlbCAgICAgIAkibGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY1Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBCRjAxOEMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzAwMDZCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAid2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzAwMDc1Ig0KLQkJCQlsYWJlbCAgICAgIAkid2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjciDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEMyMDIxRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjgiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlbnVtZXJhdGlvbkZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMzMDBBQyINCi0JCQkJbGFiZWwgICAgICAJImVudW1lcmF0aW9uRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY5Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDNTAxNTkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjcwIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzYwMEIwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicGF0dGVybkZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCQSINCi0JCQkJbGFiZWwgICAgICAJInBhdHRlcm5GYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3MSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzgwMkE3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3MiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM5MDFFQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNhcmRpbmFsaXR5RmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDOTAxRjUiDQotCQkJCWxhYmVsICAgICAgCSJjYXJkaW5hbGl0eUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjczIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQjAzOUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibnVtZXJpY0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QxIg0KLQkJCQlsYWJlbCAgICAgIAkibnVtZXJpY0ZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzUiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMENGMDE5OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzYiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEMjAwODUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhMZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQyMDA4RiINCi0JCQkJbGFiZWwgICAgICAJIm1heExlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3NyINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwRDUwMEM1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3OCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ2MDAxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDI3Ig0KLQkJCQlsYWJlbCAgICAgIAkibWluTGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc5Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAwREUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgwIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0NEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidG90YWxEaWdpdHNGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ4MDNENyINCi0JCQkJbGFiZWwgICAgICAJInRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODEiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMERCMDM3NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODIiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQzAzNUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzY0Ig0KLQkJCQlsYWJlbCAgICAgIAkiZnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MyINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwREYwMDQ4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDNCOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm9yZGVyZWRGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDNDMyINCi0JCQkJbGFiZWwgICAgICAJIm9yZGVyZWRGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg1Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBFMzAwRDkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzhFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYm91bmRlZEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzk4Ig0KLQkJCQlsYWJlbCAgICAgIAkiYm91bmRlZEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTFEMDM0NCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODciDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ0MDFFQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODgiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NTAzNjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ1MDM2QSINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZU1heEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4OSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI1NEYwMTQ1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNTUwMDM4QyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNTUwMDM5NiINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkxIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNDAxMUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkyIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjBEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNTAyMTciDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M3MDE0NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTMiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNjJBMDBBQSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQjAxMzgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTQyIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI2QjAwM0E2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNkIxMDMxMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVBhdHRlcm5GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNkIxMDMxMiINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVBhdHRlcm5GYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk3Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQTAyNkIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTg2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCN0NCMDE5MCINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTkiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCODQwMDA2MiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDAiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MTAwMUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDI3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMSINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI4OTgwMTZEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODk5MDA1NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDYwIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAzIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAwNTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0I5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAzQzMiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVMZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDUiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCOTcwMDFEQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDYiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MTAwQ0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOTcxMDBEOSINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZU1pbkZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNyINCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0QUUwMUNDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwOCINCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEFGMDEwRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY0ZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTFBIg0KLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwOSINCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0RDMwMjhFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMCINCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEQ0MDJGMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNQYXJ0aWNsZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkZEIg0KLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljUGFydGljbGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzExIg0KLQkJCXF1aWQgICAgICAgCSIzRDRCQjREOTAxRjYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzEyIg0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0REEwMjg0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyOEUiDQotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTMiDQotCQkJcXVpZCAgICAgICAJIjNENEM2OEZGMDFCRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTQiDQotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljV2lsZGNhcmQiDQotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTgiDQotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMS4gQ29tcG9uZW50IEhpZXJhcmNoeSAoUGFydCAxOiBTdHJ1Y3R1cmVzKSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ3NjgwMTM4Ig0KLQkJCXRpdGxlICAgICAgCSIxLiBDb21wb25lbnQgSGllcmFyY2h5IChQYXJ0IDE6IFN0cnVjdHVyZXMpIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEAzNjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc2NiwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEAzNjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCA1NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQwLCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNjINCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMjI1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzNjANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoOTI4LCAyMjUpDQotCQkJCSAgICAoOTI4LCAxMzUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEAzNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAzMjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MCwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQl3aWR0aCAgICAgIAkyMzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNjQNCi0JCQkJbG9jYXRpb24gICAJKDEyMDMsIDcwNikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzYxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEyMDMsIDcwNikNCi0JCQkJICAgICgxMjAzLCA2MTUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDM2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2MjQsIDU2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNzIsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQl3aWR0aCAgICAgIAk1MjINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNjYNCi0JCQkJbG9jYXRpb24gICAJKDQ0NCwgNzA5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzNjUNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDQ0LCA3MDkpDQotCQkJCSAgICAoNDQ0LCA2MTUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTU3MiwgNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzNjMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTU3MiwgNDY1KQ0KLQkJCQkgICAgKDE1NzIsIDM3NSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAzNjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI5MCwgNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAzNjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAxMDU2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2MiwgMTAxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDM3MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTA0LCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkzNiwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCXdpZHRoICAgICAgCTM1NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDUzLCAxMjAzKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzNjkNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDUzLCAxMjAzKQ0KLQkJCQkgICAgKDQ1MywgMTExMSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEAzNzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDM3Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDgwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQ2LCA3NTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgOTUwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzNzMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTg3MiwgOTUwKQ0KLQkJCQkgICAgKDE4NzIsIDg1NSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzc1DQotCQkJCWxvY2F0aW9uICAgCSgxODEsIDQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzcyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE4MSwgNDY1KQ0KLQkJCQkgICAgKDE4MSwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDM3Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTM2LCAxMjgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjcwLCAxMjMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNTUwDQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMzc3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDEwNTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzQsIDEwMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDM3OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNDg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTY5LCAxNDQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTEyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBAMzc5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExODQsIDE0ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkwMywgMTQ0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NjMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNTgxDQotCQkJCWhlaWdodCAgICAgCTExMg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEAzODANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgNTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYyLCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDM4MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NzgsIDEwMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBAMzgyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDU2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzgyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNiwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDM4Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDEyOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNiwgMTI1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDM4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDU2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjAsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAzODUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3MiwgMTI4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAyLCAxMjM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDM4Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDE0ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDMwLCAxNDQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTY5NA0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDM4Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjYsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJd2lkdGggICAgICAJMzE4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBAMzg4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA4LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNDAyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM4OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSINCi0JCQkJY2xpZW50ICAgICAJQDM3MA0KLQkJCQlzdXBwbGllciAgIAlAMzYwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDk0LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAMzkwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTYwLCA4MDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjkwLCA3NTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTYyLCA5NDcpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDM5MA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg5NjIsIDk0NykNCi0JCQkJICAgICg5NjIsIDg1NSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTINCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMzkzDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxOCwgMTE1NCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjE2MzUzNA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjkNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiDQotCQkJCWNsaWVudCAgICAgCUAzODMNCi0JCQkJc3VwcGxpZXIgICAJQDM2NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5LCAxMjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5LCA3MDkpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlAMzgzDQotCQkJCXN1cHBsaWVyICAgCUAzNjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI1NiwgMTI0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NiwgMTIwMykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzcxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiDQotCQkJCWNsaWVudCAgICAgCUAzODQNCi0JCQkJc3VwcGxpZXIgICAJQDM3Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg0LCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzc1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEE2NDAyNzkiDQotCQkJCWNsaWVudCAgICAgCUAzODINCi0JCQkJc3VwcGxpZXIgICAJQDM2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAwMiwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAwMiwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyINCi0JCQkJY2xpZW50ICAgICAJQDM2Mw0KLQkJCQlzdXBwbGllciAgIAlAMzYwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY5LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY5LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQljbGllbnQgICAgIAlAMzgwDQotCQkJCXN1cHBsaWVyICAgCUAzNjMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTAsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTAsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhGQzAxRTciDQotCQkJCWNsaWVudCAgICAgCUAzNjgNCi0JCQkJc3VwcGxpZXIgICAJQDM2NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTEwLCA3NDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTAsIDcwOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiDQotCQkJCWNsaWVudCAgICAgCUAzODUNCi0JCQkJc3VwcGxpZXIgICAJQDM5MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyMSwgMTIyNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjEsIDk0NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDENCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDAyDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzcsIDg4NikNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjIxNTgxMg0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjQNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiDQotCQkJCWNsaWVudCAgICAgCUAzNzcNCi0JCQkJc3VwcGxpZXIgICAJQDM2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwMCwgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMDAsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiDQotCQkJCWNsaWVudCAgICAgCUAzNzcNCi0JCQkJc3VwcGxpZXIgICAJQDM3Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5MywgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDk1MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzc0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCWNsaWVudCAgICAgCUAzNjkNCi0JCQkJc3VwcGxpZXIgICAJQDM5MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDUwLCAxMDAxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCA5NDcpDQotCQkJCWRyYXdTdXBwbGllciAJQDM5MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIg0KLQkJCQljbGllbnQgICAgIAlAMzcyDQotCQkJCXN1cHBsaWVyICAgCUAzNjANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDg0RjcwMDkyIg0KLQkJCQljbGllbnQgICAgIAlAMzg4DQotCQkJCXN1cHBsaWVyICAgCUAzNjANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMTIsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTIsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhCODAyODYiDQotCQkJCWNsaWVudCAgICAgCUAzNjUNCi0JCQkJc3VwcGxpZXIgICAJQDM2MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM0LCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MzQsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCWNsaWVudCAgICAgCUAzNjENCi0JCQkJc3VwcGxpZXIgICAJQDM2MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MCwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1MCwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJY2xpZW50ICAgICAJQDM4Nw0KLQkJCQlzdXBwbGllciAgIAlAMzYwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzIsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3MiwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCN0RDMDE5MyINCi0JCQkJY2xpZW50ICAgICAJQDM3Ng0KLQkJCQlzdXBwbGllciAgIAlAMzczDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkzLCAxMjIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5MywgOTUwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNzQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiINCi0JCQkJY2xpZW50ICAgICAJQDM3OA0KLQkJCQlzdXBwbGllciAgIAlAMzYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTkwLCAxNDMyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU5MCwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OTQzMDJGMSINCi0JCQkJY2xpZW50ICAgICAJQDM3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMxLCAxNDMyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMSwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDM5MA0KLQkJCQlzdXBwbGllciAgIAlAMzYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTksIDc0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxNA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDM3Mw0KLQkJCQlzdXBwbGllciAgIAlAMzYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODcyLCA3NDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODcyLCA3MDYpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDE1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQljbGllbnQgICAgIAlAMzgxDQotCQkJCXN1cHBsaWVyICAgCUAzOTANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MiwgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2MiwgOTQ3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxNg0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA0MTcNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUsIDEzODgpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDI1MzENCi0JCQkJICAgIGhlaWdodCAgICAgCTY3DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUJBQTIwMzEwIg0KLQkJCQljbGllbnQgICAgIAlAMzg2DQotCQkJCXN1cHBsaWVyICAgCUAzNzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4LCAxNDI5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzc1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUAzODYNCi0JCQkJc3VwcGxpZXIgICAJQDM2OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjU2LCAxNDI5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU2LCAxMjAzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNzEpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJcXVpZCAgICAgICAJIjM3NEIxODE5MDAyOCINCi0JCQl0aXRsZSAgICAgIAkiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJem9vbSAgICAgICAJOTYNCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA0MTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3ODQsIDE2MzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcwLCAxNTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDQyMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTYzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgMTU5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI5IiBANDIxDQotCQkJCWxvY2F0aW9uICAgCSg0OTQsIDE2MjcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTMwMTdBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjb3BlIiBANDIyDQotCQkJCQlQYXJlbnRfVmlldyAJQDQyMQ0KLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1NSwgMTU4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY29wZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3MTI1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTQwMDZEIg0KLQkJCQkJY2xpZW50ICAgICAJQDQyMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQxOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDE2MjcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYxLCAxNjI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDI0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxNjY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxMDE4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzAiIEA0MjUNCi0JCQkJCVBhcmVudF9WaWV3IAlANDIxDQotCQkJCQlsb2NhdGlvbiAgIAkoMjg2LCAtNDg1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlCNjU0MDA2RSINCi0JCQkJCWNsaWVudCAgICAgCUA0MjENCi0JCQkJCXN1cHBsaWVyICAgCUA0MjANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMyNywgMTYyNykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA0MjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE5MiwgMTIzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDg0LCAxMTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQl3aWR0aCAgICAgIAkyMzQNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDQyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTc2LCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTEsIDk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI2OA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2MSIgQDQyOA0KLQkJCQlsb2NhdGlvbiAgIAkoMjIyOSwgMTExMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4OTAxMjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYyIiBANDI5DQotCQkJCQlQYXJlbnRfVmlldyAJQDQyOA0KLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4QTAxMTAiDQotCQkJCQljbGllbnQgICAgIAlANDI4DQotCQkJCQlzdXBwbGllciAgIAlANDI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMjksIDExMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTA0NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0ZXJtIiBANDMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDQyOA0KLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNTcsIDExMjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdGVybSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzNDMyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDOEEwMTExIg0KLQkJCQkJY2xpZW50ICAgICAJQDQyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDQyNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjksIDExNzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjc0LCAxMTE5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTE5NDAzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDQzMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAxMjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJd2lkdGggICAgICAJNTIyDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDQzNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzcsIDcyNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJMzUyDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ5IiBANDM1DQotCQkJCWxvY2F0aW9uICAgCSgyMjE5LCA4ODApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDYwMjZGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1MCIgQDQzNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0MzUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU3LCAtMjQwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNjA3MDIyMSINCi0JCQkJCWNsaWVudCAgICAgCUA0MzUNCi0JCQkJCXN1cHBsaWVyICAgCUA0MzQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxOSwgODgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDgyMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJ0aWNsZXMiIEA0MzcNCi0JCQkJCVBhcmVudF9WaWV3IAlANDM1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM1NywgLTI0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDM3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDUsIDg4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJ0aWNsZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzYwNzAyMjIiDQotCQkJCQljbGllbnQgICAgIAlANDM1DQotCQkJCQlzdXBwbGllciAgIAlANDI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE5LCA5MzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgxLCA4ODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA0NDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc3NiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjM5LCA5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTINCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA0NDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3MiwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTA1LCAxMzgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCXdpZHRoICAgICAgCTM1Mg0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANDQyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUwOA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NSIgQDQ0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNTkwLCAxMTQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTYiIEA0NDQNCi0JCQkJCVBhcmVudF9WaWV3IAlANDQzDQotCQkJCQlsb2NhdGlvbiAgIAkoMzAyLCAxNDgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMjkxIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ0Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDU5MCwgMTE0MCkNCi0JCQkJCSAgICAoNTQwLCAxMTQwKQ0KLQkJCQkJICAgICg1NDAsIDEwNDUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTQwLCAxMDQ1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDQ0NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NDMNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDIsIDE0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0MywgMTE3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4wNTM1NzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDJBNSINCi0JCQkJCWNsaWVudCAgICAgCUA0NDMNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg1OTAsIDExNDApDQotCQkJCQkgICAgKDY0MSwgMTE0MCkNCi0JCQkJCSAgICAoNjQxLCAxMDQ1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkwLCAxMTQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY0MSwgMTA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4NCwgMTA5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xMjI0NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANDQ4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQ4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ1LCA5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNTQ0DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTciIEA0NDkNCi0JCQkJbG9jYXRpb24gICAJKDExMTksIDExMTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3REYwMjRGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk4IiBANDUwDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ0OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTY5LCAtOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdFMTAwRkQiDQotCQkJCQljbGllbnQgICAgIAlANDQ5DQotCQkJCQlzdXBwbGllciAgIAlANDQ4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDExMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExOSwgMTA0NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50VHlwZSIgQDQ1MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NDkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU5LCAxMTI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA4OTU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZFIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ0OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQzMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDExNzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYzLCAxMTI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA4OTU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMyIgQDQ1NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NSwgOTgyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1MUJBMDEyNiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDQiIEA0NTUNCi0JCQkJCVBhcmVudF9WaWV3IAlANDU0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg1MUJCMDE1MCINCi0JCQkJCWNsaWVudCAgICAgCUA0NTQNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1NSwgOTgyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODAsIDk4MikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDQ1Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NTQNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTksIC01NzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ1LCA5MjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDYyODU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQjAxNTEiDQotCQkJCQljbGllbnQgICAgIAlANDU0DQotCQkJCQlzdXBwbGllciAgIAlANDQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTUsIDk4MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMwLCA5ODIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTUwLCAxMDIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTQyODU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk5IiBANDU5DQotCQkJCWxvY2F0aW9uICAgCSg5MjEsIDEyMDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMDZFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwMCIgQDQ2MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0OSINCi0JCQkJCWNsaWVudCAgICAgCUA0NTkNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTIxLCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyMSwgMTA0NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANDYxDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ1OQ0KLQkJCQkJbG9jYXRpb24gICAJKC04NzEsIC0zNzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzgsIDEyNTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI2OTkzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0QSINCi0JCQkJCWNsaWVudCAgICAgCUA0NTkNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTIxLCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyMSwgMTM3MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDYxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3OSwgMTI1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4ODM0NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA0NjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA3NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMjIsIDcyNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA0NjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgMTYzMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyMywgMTU5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNDg0DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA0NjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgNDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODAzLCA0MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTMiIEA0NjcNCi0JCQkJbG9jYXRpb24gICAJKDIyMTYsIDYwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBQzAyNUEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU0IiBANDY4DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ2Nw0KLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE2LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxNiwgNTAxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEA0NjkNCi0JCQkJCVBhcmVudF9WaWV3IAlANDY3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU1MiwgLTgxNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDY5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDYyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyNjA5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDQzNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE2LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxNiwgNzE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1NiwgNjMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjMzNjQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDQ3Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjE5LCAxMzgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1Ng0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgzIiBANDczDQotCQkJCWxvY2F0aW9uICAgCSgxNjc2LCAxMjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4N0JGMDE1MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4NCIgQDQ3NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzMNCi0JCQkJCWxvY2F0aW9uICAgCSg0MTIsIC0zNDQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QzAwMEE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ3Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzYsIDEzNzEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmQiIEA0NzUNCi0JCQkJCVBhcmVudF9WaWV3IAlANDczDQotCQkJCQlsb2NhdGlvbiAgIAkoNDEyLCAtMzQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NywgMTEwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYyNTc2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4N0MwMDBBOCINCi0JCQkJCWNsaWVudCAgICAgCUA0NzMNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY3NiwgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc2LCAxMDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYxOCwgMTEwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYxOTYzMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3OSIgQDQ3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyOSwgMTQzOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU5RjAwODYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODAiIEA0NzkNCi0JCQkJCVBhcmVudF9WaWV3IAlANDc4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzVBMDAwNjkiDQotCQkJCQljbGllbnQgICAgIAlANDc4DQotCQkJCQlzdXBwbGllciAgIAlANDcyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMCwgMTQzOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANDgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ3OA0KLQkJCQkJbG9jYXRpb24gICAJKC0zNjMsIC0xNDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA1LCAxNTA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVVzZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzI1OTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNUEwMDA2QSINCi0JCQkJCWNsaWVudCAgICAgCUA0NzgNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ4LCAxNDM4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNywgMTM5MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU2MzUzNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDQ4Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDE0MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MywgMTM4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTQ4NA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg3IiBANDg0DQotCQkJCWxvY2F0aW9uICAgCSg3NzcsIDE0MjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODUwMTBEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDg4IiBANDg1DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4NA0KLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZBIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ4NA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzcsIDE0MjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk2LCAxNDI1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANDg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4NA0KLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3ODQsIDE1MDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU5MjU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NjAwRkIiDQotCQkJCQljbGllbnQgICAgIAlANDg0DQotCQkJCQlzdXBwbGllciAgIAlANDgzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTgsIDE0MjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjEsIDEzODUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzI0NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzEiIEA0ODkNCi0JCQkJbG9jYXRpb24gICAJKDIzNywgMTIwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2QjAyQ0IiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzIiIEA0OTANCi0JCQkJCVBhcmVudF9WaWV3IAlANDg5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNDMsIDcyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTZEMDBBNiINCi0JCQkJCWNsaWVudCAgICAgCUA0ODkNCi0JCQkJCXN1cHBsaWVyICAgCUA0ODMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM3LCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTM3MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDQ5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzODgsIDEyNDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjM5MjY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ4OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzcsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3LCAxMDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1LCAxMjQ3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIzOTI2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDQ5NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDc4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgsIDc0MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkzIiBANDk1DQotCQkJCWxvY2F0aW9uICAgCSg3MjgsIDc3NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNTAzNDAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTQiIEA0OTYNCi0JCQkJCVBhcmVudF9WaWV3IAlANDk1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1NiwgLTU3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzM2MDI4RCINCi0JCQkJCWNsaWVudCAgICAgCUA0OTUNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3MjgsIDc3NSkNCi0JCQkJCSAgICAoNzg4LCA3NzUpDQotCQkJCQkgICAgKDc4OCwgOTM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg4LCA5MzkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANDk3DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ5NQ0KLQkJCQkJbG9jYXRpb24gICAJKC04NTYsIC01NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1OCwgODgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjE0MDk0MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzM2MDI4RSINCi0JCQkJCWNsaWVudCAgICAgCUA0OTUNCi0JCQkJCXN1cHBsaWVyICAgCUA0OTQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc5LCA3NzUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTAsIDgxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xNTI0MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDUwMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA0NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTcsIDQwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJd2lkdGggICAgICAJNjA4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM1IiBANTAxDQotCQkJCWxvY2F0aW9uICAgCSgxNjI5LCA1NzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyOUUwMTREIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlZmVyZW5jZWRLZXkiIEA1MDINCi0JCQkJCVBhcmVudF9WaWV3IAlANTAxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzLCA5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NjEsIDYwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZWZlcmVuY2VkS2V5Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjc5NzI5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyQTgwMTY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUwMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUwMA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MjksIDU3NCkNCi0JCQkJCSAgICAoMTU1NSwgNTc0KQ0KLQkJCQkJICAgICgxNTU1LCA1MDEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1NSwgNTAxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTA0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyMiwgNTM5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQ3NjE5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzYiIEA1MDUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTAxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzLCA5NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNkYiDQotCQkJCQljbGllbnQgICAgIAlANTAxDQotCQkJCQlzdXBwbGllciAgIAlANTAwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYyOSwgNTc0KQ0KLQkJCQkJICAgICgxNjg5LCA1NzQpDQotCQkJCQkgICAgKDE2ODksIDQ0NCkNCi0JCQkJCSAgICAoMTYxNiwgNDQ0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyOSwgNTc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTYsIDQ0NCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzOSIgQDUwNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgNjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDAyNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDAiIEA1MDcNCi0JCQkJCVBhcmVudF9WaWV3IAlANTA2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNSwgMzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUwNg0KLQkJCQkJc3VwcGxpZXIgICAJQDUwMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNTAxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZpZWxkcyIgQDUwOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE1LCAzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTA4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTksIDY1NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmaWVsZHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzkyNTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM3OSINCi0JCQkJCWNsaWVudCAgICAgCUA1MDYNCi0JCQkJCXN1cHBsaWVyICAgCUA0NjQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDcxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTA4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTMsIDY1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyOTkwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzciIEA1MTENCi0JCQkJbG9jYXRpb24gICAJKDE0MTUsIDYwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRDAwM0UiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM4IiBANTEyDQotCQkJCQlQYXJlbnRfVmlldyAJQDUxMQ0KLQkJCQkJbG9jYXRpb24gICAJKDEwMywgMzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjJBIg0KLQkJCQkJY2xpZW50ICAgICAJQDUxMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUwMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE1LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNSwgNTAxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNlbGVjdG9yIiBANTEzDQotCQkJCQlQYXJlbnRfVmlldyAJQDUxMQ0KLQkJCQkJbG9jYXRpb24gICAJKDEwMywgMzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTEzLCA2NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2VsZWN0b3IiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MTEyMTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIzNCINCi0JCQkJCWNsaWVudCAgICAgCUA1MTENCi0JCQkJCXN1cHBsaWVyICAgCUA0NjQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNSwgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTUsIDcxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzODEsIDY1MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5MjUyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA1MTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgNjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTgxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNTk5DQotCQkJCWhlaWdodCAgICAgCTIwOQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgxIiBANTE3DQotCQkJCWxvY2F0aW9uICAgCSgyMzk1LCA2MDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTcwMjNFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4MiIgQDUxOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAxNzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTgwMzhBIg0KLQkJCQkJY2xpZW50ICAgICAJQDUxNw0KLQkJCQkJc3VwcGxpZXIgICAJQDUxNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzOTUsIDYwNikNCi0JCQkJCSAgICAoMjM5NSwgNjUpDQotCQkJCQkgICAgKDE2MTEsIDY1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM5NSwgNjA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDY1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm5vdGF0aW9uRGVjbGFyYXRpb25zIiBANTE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDUxNw0KLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIDE3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODksIDEwNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitub3RhdGlvbkRlY2xhcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODk3NzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBODAzOEIiDQotCQkJCQljbGllbnQgICAgIAlANTE3DQotCQkJCQlzdXBwbGllciAgIAlANDY1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM5NSwgNjA2KQ0KLQkJCQkJICAgICgyMzk1LCAxNjMzKQ0KLQkJCQkJICAgICgyMDk4LCAxNjMzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM5NSwgNjA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTgsIDE2MzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzQ0LCAxMDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDg3ODI5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3NyIgQDUyMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTc3MiwgMjQ5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRUZGMDI0RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzgiIEA1MjMNCi0JCQkJCVBhcmVudF9WaWV3IAlANTIyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNUEiDQotCQkJCQljbGllbnQgICAgIAlANTIyDQotCQkJCQlzdXBwbGllciAgIAlANTE2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCAyNDkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cERlZmluaXRpb25zIiBANTI0DQotCQkJCQlQYXJlbnRfVmlldyAJQDUyMg0KLQkJCQkJbG9jYXRpb24gICAJKC05NDgsIC0zMjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc2LCAzMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbW9kZWxHcm91cERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzEzNTkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVGMDAwMjY0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUyMg0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3NzIsIDI0OSkNCi0JCQkJCSAgICAoMTgzMiwgMjQ5KQ0KLQkJCQkJICAgICgxODMyLCAzOTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzcyLCAyNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgzMiwgMzk1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMzQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM3ODY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3MyIgQDUyNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjM0NiwgNTE4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRTkyMDIxNiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzQiIEA1MjgNCi0JCQkJCVBhcmVudF9WaWV3IAlANTI3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU0LCA4NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NzIsIDE4NTcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuNjMwMDcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDc1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTMwMThCIg0KLQkJCQkJY2xpZW50ICAgICAJQDUyNw0KLQkJCQkJc3VwcGxpZXIgICAJQDUxNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzNDYsIDUxOCkNCi0JCQkJCSAgICAoMjM0NiwgMTQ5KQ0KLQkJCQkJICAgICgxNjExLCAxNDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1MTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMTQ5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiIEA1MzANCi0JCQkJCVBhcmVudF9WaWV3IAlANTI3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU0LCA4NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDgsIDE5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0OTk0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTkzMDE4QyINCi0JCQkJCWNsaWVudCAgICAgCUA1MjcNCi0JCQkJCXN1cHBsaWVyICAgCUA0NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQ2LCA1MTgpDQotCQkJCQkgICAgKDIzNDYsIDE0NDEpDQotCQkJCQkgICAgKDIxNjYsIDE0NDEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1MTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2NiwgMTQ0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOTksIDE5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zNDg4NjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc1IiBANTMzDQotCQkJCWxvY2F0aW9uICAgCSgyMDMsIDE1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU3NjAwNDkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc2IiBANTM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDUzMw0KLQkJCQkJbG9jYXRpb24gICAJKC00ODUsIC0yNzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzc0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDUxNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDMsIDE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAxNTkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb25zIiBANTM1DQotCQkJCQlQYXJlbnRfVmlldyAJQDUzMw0KLQkJCQkJbG9jYXRpb24gICAJKC00ODUsIC0yNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNDksIDE5NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDc1NzI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU3NjAzN0UiDQotCQkJCQljbGllbnQgICAgIAlANTMzDQotCQkJCQlzdXBwbGllciAgIAlANDk0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjAzLCAxNTkpDQotCQkJCQkgICAgKDEwNCwgMTU5KQ0KLQkJCQkJICAgICgxMDQsIDc4NCkNCi0JCQkJCSAgICAoMTg5LCA3ODQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDMsIDE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODksIDc4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NSwgMjAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU5NzAxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3OSIgQDUzOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4NywgMzI5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkMyQTE3MDFFRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODAiIEA1MzkNCi0JCQkJCVBhcmVudF9WaWV3IAlANTM4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3MyINCi0JCQkJCWNsaWVudCAgICAgCUA1MzgNCi0JCQkJCXN1cHBsaWVyICAgCUA1MTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgMzI5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDI2NCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDU0MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTc3LCAtMjMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzc1LCAzMzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA5NTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExQTAyN0QiDQotCQkJCQljbGllbnQgICAgIAlANTM4DQotCQkJCQlzdXBwbGllciAgIAlANTAwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDMyOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCAzOTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDE4LCAzMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMDcxNDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTcxIiBANTQzDQotCQkJCWxvY2F0aW9uICAgCSg0OCwgMzIwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZGREZBMDBDMyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzIiIEA1NDQNCi0JCQkJCVBhcmVudF9WaWV3IAlANTQzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC0yODgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkZERkIwMjdEIg0KLQkJCQkJY2xpZW50ICAgICAJQDU0Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDUxNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ5LCAzMjIpDQotCQkJCQkgICAgKDQ5LCA2OCkNCi0JCQkJCSAgICAoMTAxMywgNjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OSwgMzIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDY4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZURlY2xhcmF0aW9ucyIgQDU0NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzOCwgMTA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZURlY2xhcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xOTg1MzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0UiDQotCQkJCQljbGllbnQgICAgIAlANTQzDQotCQkJCQlzdXBwbGllciAgIAlANDgzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNDksIDMyMikNCi0JCQkJCSAgICAoNDksIDE0MTUpDQotCQkJCQkgICAgKDE3NCwgMTQxNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5LCAzMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAxNDE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTEsIDEwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xOTY3MDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANTQ4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgNDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzUsIDQxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDENCi0JCQkJaGVpZ2h0ICAgICAJOTcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMSIgQDU0OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk5LCA1ODkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNTkwMTk4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyMiIgQDU1MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QzA1RDAxRTMiDQotCQkJCQljbGllbnQgICAgIAlANTQ5DQotCQkJCQlzdXBwbGllciAgIAlANTQ4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNDk5LCA1ODkpDQotCQkJCQkgICAgKDQ1MiwgNTg5KQ0KLQkJCQkJICAgICg0NTIsIDQ5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5OSwgNTg5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MiwgNDk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iIEA1NTENCi0JCQkJCVBhcmVudF9WaWV3IAlANTQ5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzLCAxMDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MTEsIDU4NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTYuNTIwODMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFRCINCi0JCQkJCWNsaWVudCAgICAgCUA1NDkNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0OTksIDU4OSkNCi0JCQkJCSAgICAoNTQ3LCA1ODkpDQotCQkJCQkgICAgKDU0NywgNDk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk5LCA1ODkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTQ3LCA0OTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0OTksIDU1OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTUiIEA1NTQNCi0JCQkJbG9jYXRpb24gICAJKDI0MSwgNjEzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDA1OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTYiIEA1NTUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTU0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzNDMsIC0yMTkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0JGIg0KLQkJCQkJY2xpZW50ICAgICAJQDU1NA0KLQkJCQkJc3VwcGxpZXIgICAJQDU0OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDEsIDYxMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDEsIDQ5NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDU1Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTU2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwOCwgNjk0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg2NDQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0MwIg0KLQkJCQkJY2xpZW50ICAgICAJQDU1NA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ5NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDEsIDYxMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDEsIDczMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTU2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMiwgNjg1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjEwMTY5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNyIgQDU1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoODM3LCA0NjApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRUYwMTYwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExOCIgQDU2MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgxOSwgLTY4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OCINCi0JCQkJCWNsaWVudCAgICAgCUA1NTkNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY2LCA0NjApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEA1NjENCi0JCQkJCVBhcmVudF9WaWV3IAlANTU5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MTksIC02OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTYxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4MCwgNTI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjUxNDYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTkiDQotCQkJCQljbGllbnQgICAgIAlANTU5DQotCQkJCQlzdXBwbGllciAgIAlANTAwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNywgNDYwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDgsIDQ2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTYxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgNDA3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMwNDM1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2OSIgQDU2NA0KLQkJCQlsb2NhdGlvbiAgIAkoNTQxLCAyNDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOEQwMUJGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MCIgQDU2NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTgiDQotCQkJCQljbGllbnQgICAgIAlANTY0DQotCQkJCQlzdXBwbGllciAgIAlANTE2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDI0NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb25zIiBANTY2DQotCQkJCQlQYXJlbnRfVmlldyAJQDU2NA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTIzLCAtMTg2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQzLCAzMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWxlbWVudERlY2xhcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwOTMwMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOEUwMTk5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU2NA0KLQkJCQkJc3VwcGxpZXIgICAJQDU0OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDU0MSwgMjQ2KQ0KLQkJCQkJICAgICgyMjQsIDI0NikNCi0JCQkJCSAgICAoMjI0LCA0MDApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NDEsIDI0NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjQsIDQwMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NiwgMzM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY0NjkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMyIgQDU2OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUzLCA2MjEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCREQwMjk3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyNCIgQDU3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjkNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMsIDE3MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzQyREJFMDAxMUUiDQotCQkJCQljbGllbnQgICAgIAlANTY5DQotCQkJCQlzdXBwbGllciAgIAlANTQ4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzUzLCA2MjEpDQotCQkJCQkgICAgKDMwNiwgNjIxKQ0KLQkJCQkJICAgICgzMDYsIDQ5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM1MywgNjIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwNiwgNDk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN1YnN0aXR1dGlvbkdyb3VwIiBANTcxDQotCQkJCQlQYXJlbnRfVmlldyAJQDU2OQ0KLQkJCQkJbG9jYXRpb24gICAJKC02MywgMTczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc5LCA2MzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3Vic3RpdHV0aW9uR3JvdXAiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJNC44MDg1MTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNDJEQkUwMDEyOCINCi0JCQkJCWNsaWVudCAgICAgCUA1NjkNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzNTMsIDYyMSkNCi0JCQkJCSAgICAoNDAwLCA2MjEpDQotCQkJCQkgICAgKDQwMCwgNDk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDAwLCA0OTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNTAsIDU4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjk3NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJcXVpZCAgICAgICAJIjNCNjlFNzg2MDJDNSINCi0JCQl0aXRsZSAgICAgIAkiMy4gQ29tcG9uZW50IEF0dHJpYnV0ZXMgIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA1NzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxMjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDEwNykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4Mg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIG5hbWUgOiBTdHJpbmciDQotCQkJCQkiKyB0YXJnZXROYW1lc3BhY2UgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNTM0DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDU3NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTY0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE1NjcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDU3Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzY4LCAxNjgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAxNTI0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTExNzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAxNTg0KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTEzOQ0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGRlcml2YXRpb25NZXRob2QgOiBYU0REZXJpdmF0aW9uTWV0aG9kID0gcmVzdHJpY3Rpb24iDQotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRENvbXBsZXhGaW5hbCINCi0JCQkJCSIrIGFic3RyYWN0IDogYm9vbGVhbiINCi0JCQkJCSIrIGNvbnRlbnRUeXBlQ2F0ZWdvcnkgOiBYU0RDb250ZW50VHlwZUNhdGVnb3J5Ig0KLQkJCQkJIjw8MC4uKj4+ICsgcHJvaGliaXRlZFN1YnN0aXR1dGlvbnMgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpKQ0KLQkJCQl3aWR0aCAgICAgIAkxMTkyDQotCQkJCWhlaWdodCAgICAgCTMzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1NzcNCi0JCQkJbG9jYXRpb24gICAJKDQ2MywgMzYyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA1NzQNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDYzLCAzNjIpDQotCQkJCSAgICAoNDYzLCAyMjEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANTc4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDE2MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDE1MTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAxNTc5KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTkyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFyaWV0eSA6IFhTRFZhcmlldHkiDQotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRFNpbXBsZUZpbmFsIikpDQotCQkJCXdpZHRoICAgICAgCTY0Ng0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANTc5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkxMiwgMTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDM4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY0NywgOTgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyByZXF1aXJlZCA6IGJvb2xlYW4iDQotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIg0KLQkJCQkJIisgY29uc3RyYWludCA6IFhTRENvbnN0cmFpbnQiKSkNCi0JCQkJd2lkdGggICAgICAJNTQ4DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDU4MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDE5MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODMwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEyODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODkwKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTI2MA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIG5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSA6IFhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQkJCSI8PDAuLio+PiArIG5hbWVzcGFjZUNvbnN0cmFpbnQgOiBTdHJpbmciDQotCQkJCQkiKyBwcm9jZXNzQ29udGVudHMgOiBYU0RQcm9jZXNzQ29udGVudHMiKSkNCi0JCQkJd2lkdGggICAgICAJMTMwNA0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDU4MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMzNiwgMTQ0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDEzODQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTc4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTU5Ng0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDU4Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDUxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgNDMxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgNDkxKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA2DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSINCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpDQotCQkJCXdpZHRoICAgICAgCTU1NA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANTgzDQotCQkJCWxvY2F0aW9uICAgCSgyOTQsIDY5NykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANTgyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI5NCwgNjk3KQ0KLQkJCQkgICAgKDI5NCwgNjA1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA1ODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjU2LCAxMjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OTUsIDQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTU0MA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA1ODUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY4OCwgNTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MTgsIDQ2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANTg2DQotCQkJCWxvY2F0aW9uICAgCSgyNjg0LCA5NjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDU4NQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyNjg0LCA5NjIpDQotCQkJCSAgICAoMjY4NCwgNTc2KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb3NpdG9yIiBANTg3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTExNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb3NpdG9yIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDEwNjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODY5QjYyMDAzNyINCi0JCQkJd2lkdGggICAgICAJMzQ0DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW50IiBANTg4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA1MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDY5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzgsIDQxOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlFMjYwMUFFIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERlcml2YXRpb25NZXRob2QiIEA1ODkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAyMjcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMjEzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMTYzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTBCMDAwQ0UiDQotCQkJCXdpZHRoICAgICAgCTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiIEA1OTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTg0LCAxNzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyODEsIDg4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYwNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4MSwgMzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYwNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODZBMUUwMDI3MiINCi0JCQkJd2lkdGggICAgICAJNjI1DQotCQkJCWhlaWdodCAgICAgCTMwMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb250ZW50VHlwZUNhdGVnb3J5IiBANTkxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcwNCwgMjIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ1NiwgMjExNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb250ZW50VHlwZUNhdGVnb3J5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ1NiwgMjA2NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NkE3OUYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk1MTQNCi0JCQkJaGVpZ2h0ICAgICAJMzQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFZhcmlldHkiIEA1OTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDE2MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcwOCwgMTUxNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNDY2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjc3MzAyNDkiDQotCQkJCXdpZHRoICAgICAgCTM2Mg0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvY2Vzc0NvbnRlbnRzIiBANTkzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTc2LCAyMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDIxNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvY2Vzc0NvbnRlbnRzIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAyMTA2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjhDNzAyODQiDQotCQkJCXdpZHRoICAgICAgCTQzOA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhWYXJpZXR5IiBANTk0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjc2OCwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNTg3LCA5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aFZhcmlldHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNTg3LCA0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4RkZCODkwMzNBIg0KLQkJCQl3aWR0aCAgICAgIAkzODENCi0JCQkJaGVpZ2h0ICAgICAJMjUwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBANTk1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDE4NzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3ODgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzg5LCAxNzM4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE4NDgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkxOTkNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBsaXN0Ig0KLQkJCQkJIisgcmVzdHJpY3Rpb24iDQotCQkJCQkiKyB1bmlvbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhGaW5hbCIgQDU5Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAyMDAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxOTQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDE4OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMjAwMSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTIwMg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpDQotCQkJCXdpZHRoICAgICAgCTM4Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIiBANTk3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDg1LCAxMDc1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzU5MTAwQUUiDQotCQkJCXdpZHRoICAgICAgCTY0OA0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiIEA1OTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTExNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDEwNjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUE0MDNERiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTE3NikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTIzNg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHN1YnN0aXR1dGlvbiINCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpDQotCQkJCXdpZHRoICAgICAgCTU1Ng0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiIEA1OTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY2NCwgMjI3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjIxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTgsIDIxNjMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjI3MykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTIwMg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpDQotCQkJCXdpZHRoICAgICAgCTU1MA0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IiBANjAwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAyMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMjE1NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMjEwNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1RUEwMDIzIg0KLQkJCQl3aWR0aCAgICAgIAk2OTYNCi0JCQkJaGVpZ2h0ICAgICAJMjk2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDYwMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCA4ODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgNzQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEzODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDgwOSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTEzNTcNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBuaWxsYWJsZSA6IGJvb2xlYW4iDQotCQkJCQkiPDwwLi4qPj4gKyBkaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyA6IFhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQkJIjw8MC4uKj4+ICsgc3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIDogWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCQkJIisgYWJzdHJhY3QgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTE0MDQNCi0JCQkJaGVpZ2h0ICAgICAJMjg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjAyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQljbGllbnQgICAgIAlANjAxDQotCQkJCXN1cHBsaWVyICAgCUA1ODINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4MSwgNzM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjgxLCA2OTcpDQotCQkJCWRyYXdTdXBwbGllciAJQDU4MykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANjAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgODY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgODEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDkyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA2MDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY4OCwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQyMCwgMTEwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjA1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzgwMEQyIg0KLQkJCQljbGllbnQgICAgIAlANjA0DQotCQkJCXN1cHBsaWVyICAgCUA1ODUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NjIsIDEwODgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODYyLCA5NjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDU4NikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANjA2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEzMTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2OCwgMTI2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM4Ng0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjA3DQotCQkJCWxvY2F0aW9uICAgCSgyMzc1LCAxNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2MDYNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjM3NSwgMTQ2NSkNCi0JCQkJICAgICgyMzc1LCAxMzc1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwOA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCINCi0JCQkJY2xpZW50ICAgICAJQDYwNg0KLQkJCQlzdXBwbGllciAgIAlANTg1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzY4LCAxMjQ5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM2OCwgOTYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA1ODYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDU3Ng0KLQkJCQlzdXBwbGllciAgIAlANjA2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODE4LCAxNTEyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxOCwgMTQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjA3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUA1NzgNCi0JCQkJc3VwcGxpZXIgICAJQDYwNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQwNiwgMTUwNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDYsIDE0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDYwNykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANjExDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDExNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTgsIDExMDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjEyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQljbGllbnQgICAgIAlANjExDQotCQkJCXN1cHBsaWVyICAgCUA1ODUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMTUsIDEwODkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTE1LCA5NjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDU4NikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA2MTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzQsIDQ2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTExNTANCi0JCQkJaGVpZ2h0ICAgICAJMTQ0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjE0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBQTMwMjQyIg0KLQkJCQljbGllbnQgICAgIAlANjEzDQotCQkJCXN1cHBsaWVyICAgCUA1NzQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjgsIDQ1NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjgsIDM2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTc3KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDYxNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDc4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3OCwgNzAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQl3aWR0aCAgICAgIAk1MDINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDYxNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMsIDI2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjE3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ5NDMwMkYxIg0KLQkJCQljbGllbnQgICAgIAlANjE1DQotCQkJCXN1cHBsaWVyICAgCUA1NzQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOTAsIDY5MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOTAsIDM2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTc3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCWNsaWVudCAgICAgCUA2MDMNCi0JCQkJc3VwcGxpZXIgICAJQDU4Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxLCA4MDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDEsIDY5NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTgzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciDQotCQkJCWNsaWVudCAgICAgCUA1ODINCi0JCQkJc3VwcGxpZXIgICAJQDU3NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzcyLCA0MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNzIsIDM2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTc3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiDQotCQkJCWNsaWVudCAgICAgCUA1ODUNCi0JCQkJc3VwcGxpZXIgICAJQDU3NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjY4NywgNDQ4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY4NywgMzYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA1NzcpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNC4gQ29tcG9uZW50IEhpZXJhcmNoeSwgUmVsYXRpb25zIGFuZCBBdHRyaWJ1dGVzIChQYXJ0IDI6IERhdGF0eXBlcykiDQotCQkJcXVpZCAgICAgICAJIjNCNkMzMjY1MDA1RiINCi0JCQl0aXRsZSAgICAgIAkiNC4gQ29tcG9uZW50IEhpZXJhcmNoeSwgUmVsYXRpb25zIGFuZCBBdHRyaWJ1dGVzIChQYXJ0IDI6IERhdGF0eXBlcykiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiIEA2MjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDg5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMiwgODQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZpeGVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIg0KLQkJCQl3aWR0aCAgICAgIAkzMzgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIgQDYyMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDcyMCwgODk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNCwgODQ1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlcGVhdGFibGVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTQ1MA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIgQDYyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY2LCAxMTEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCQl3aWR0aCAgICAgIAk0NzgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIgQDYyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc3NywgMTExMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXR0ZXJuRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzE4LCAxMDQ5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2MjINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNzE4LCAxMDQ5KQ0KLQkJCQkgICAgKDcxOCwgOTU5KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEA2MjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCA5MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3OTksIDg3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4Ig0KLQkJCQl3aWR0aCAgICAgIAk0MjANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIgQDYyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDkyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MywgODcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREJvdW5kZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiDQotCQkJCXdpZHRoICAgICAgCTM4OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIgQDYyOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMzIsIDExMDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDcsIDEwNDgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHlGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiDQotCQkJCXdpZHRoICAgICAgCTQ2OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBANjI5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUwNCwgMTEwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxOSwgMTA0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROdW1lcmljRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2Ig0KLQkJCQl3aWR0aCAgICAgIAkzODgNCi0JCQkJaGVpZ2h0ICAgICAJMTM0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IiBANjMwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjU2LCAxMzc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTEsIDEzMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IiBANjMxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjA4LCAxNTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MDUsIDE0OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1Ig0KLQkJCQl3aWR0aCAgICAgIAk0MjQNCi0JCQkJaGVpZ2h0ICAgICAJMTM0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYzMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0LCAxMjYyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTQ0LCAxMjYyKQ0KLQkJCQkgICAgKDE0NCwgOTY0KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIgQDYzMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDE1NTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDcsIDE0OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4TGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCQl3aWR0aCAgICAgIAk0MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTM0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDYzNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDEzNzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg4MCwgMTMyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3Ig0KLQkJCQl3aWR0aCAgICAgIAk0OTgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IiBANjM1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgMTY3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhJbmNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiDQotCQkJCXdpZHRoICAgICAgCTQ2Mg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiIEA2MzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAxOTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAxODUyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiINCi0JCQkJd2lkdGggICAgICAJNDgwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDYzNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgyLCAxNjc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkluY2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSINCi0JCQkJd2lkdGggICAgICAJNDQ2DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCIgQDYzOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTkwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0LCAxODUyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQkJd2lkdGggICAgICAJNDc0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IiBANjM5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MiwgMjA1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJd2lkdGggICAgICAJNDI2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBANjQwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxOCwgMjA1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUJFMDJFRSINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzlEMDNDNyINCi0JCQkJY2xpZW50ICAgICAJQDYyMw0KLQkJCQlzdXBwbGllciAgIAlANjIyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzOTQsIDExMDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzOTQsIDEwNDkpDQotCQkJCWRyYXdTdXBwbGllciAJQDYyNSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NjIwMDQ1Ig0KLQkJCQljbGllbnQgICAgIAlANjM0DQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDEzMDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA2NDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMzYsIDE2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQsIDExNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDQTUwMzhEIg0KLQkJCQljbGllbnQgICAgIAlANjI0DQotCQkJCXN1cHBsaWVyICAgCUA2MjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNDQsIDExMDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMDQ5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MjUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzgwMDJERiINCi0JCQkJY2xpZW50ICAgICAJQDYzMA0KLQkJCQlzdXBwbGllciAgIAlANjIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjMsIDEzMDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjMsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWQiIEA2NDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAxNDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxMzI0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxMjc0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkM3NzE1MjAyRTQiDQotCQkJCXdpZHRoICAgICAgCTQ0NA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHkiIEA2NDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjY5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTYxOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNUQwMDlCIg0KLQkJCQl3aWR0aCAgICAgIAk0NDQNCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2UiIEA2NDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCAyMDMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2UiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkVFRDBGNjAzNDIiDQotCQkJCXdpZHRoICAgICAgCTQyNA0KLQkJCQloZWlnaHQgICAgIAkyODcNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6VmFsdWUiIEA2NDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDIwOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgMjA2MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJWYWx1ZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgMjAxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNDMDQwQjVCMDMxRiINCi0JCQkJd2lkdGggICAgICAJNjM2DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjYxMDMzNyINCi0JCQkJY2xpZW50ICAgICAJQDYzOQ0KLQkJCQlzdXBwbGllciAgIAlANjIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMjA0NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIgQDY1MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDEzNzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzLCAxMzIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzLCAxMzgwKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjU0DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSIpKQ0KLQkJCQl3aWR0aCAgICAgIAkzMDQNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IiBANjUyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1ODQsIDEzNzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTMyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDEzODApDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIikpDQotCQkJCXdpZHRoICAgICAgCTMwNg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUQyNDAwOTgiDQotCQkJCWNsaWVudCAgICAgCUA2NTENCi0JCQkJc3VwcGxpZXIgICAJQDYyMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM1LCAxMzA4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM1LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExRDMxMDNBRCINCi0JCQkJY2xpZW50ICAgICAJQDY1Mg0KLQkJCQlzdXBwbGllciAgIAlANjIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTgxLCAxMzA4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I1MjAzNTMiDQotCQkJCWNsaWVudCAgICAgCUA2MzcNCi0JCQkJc3VwcGxpZXIgICAJQDY1MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg1LCAxNjY0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg1LCAxNDQ0KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCODMwM0I4Ig0KLQkJCQljbGllbnQgICAgIAlANjM1DQotCQkJCXN1cHBsaWVyICAgCUA2NTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDAsIDE2NjQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAwLCAxNDQ0KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCOEUwMzA5Ig0KLQkJCQljbGllbnQgICAgIAlANjM2DQotCQkJCXN1cHBsaWVyICAgCUA2NTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjIsIDE4NDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjIyLCAxNDQ0KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzQwMEMwIg0KLQkJCQljbGllbnQgICAgIAlANjMxDQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NywgMTQ4NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NywgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I3RDAwRkMiDQotCQkJCWNsaWVudCAgICAgCUA2MzMNCi0JCQkJc3VwcGxpZXIgICAJQDYyMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM5NywgMTQ4NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzOTcsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjYwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCOTkwMDE2Ig0KLQkJCQljbGllbnQgICAgIAlANjQwDQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzUsIDIwNDQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc1LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDY2MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDM2OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQsIDMxOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCXdpZHRoICAgICAgCTQwNg0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjYyDQotCQkJCWxvY2F0aW9uICAgCSgzNjYsIDUyMikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjYxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDM2NiwgNTIyKQ0KLQkJCQkgICAgKDM2NiwgNDMwKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDY2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgNjI0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM0LCA1NzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQl3aWR0aCAgICAgIAk0NjINCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY2NA0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA3ODEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDY2Mw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyNzIsIDc4MSkNCi0JCQkJICAgICgyNzIsIDY4NykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4RjAwMkUiDQotCQkJCWNsaWVudCAgICAgCUA2MjINCi0JCQkJc3VwcGxpZXIgICAJQDY2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTk0LCA4MzMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTQsIDc4MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY0KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIgQDY2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDc1MiwgNjI0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNiwgNTczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZ1bmRhbWVudGFsRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNzY4LCA3ODkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDY2Ng0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg3NjgsIDc4OSkNCi0JCQkJICAgICg3NjgsIDY4NykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY1OTAxMkMiDQotCQkJCWNsaWVudCAgICAgCUA2MjYNCi0JCQkJc3VwcGxpZXIgICAJQDY2Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA1MCwgODYwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1MCwgNzg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjNDMDIyNCINCi0JCQkJY2xpZW50ICAgICAJQDYyNw0KLQkJCQlzdXBwbGllciAgIAlANjY2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTI1LCA4NjApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI1LCA3ODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjcwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NEYwMTMxIg0KLQkJCQljbGllbnQgICAgIAlANjI4DQotCQkJCXN1cHBsaWVyICAgCUA2NjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMzcsIDEwMzYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjM3LCA3ODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjcxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NDIwMDc0Ig0KLQkJCQljbGllbnQgICAgIAlANjI5DQotCQkJCXN1cHBsaWVyICAgCUA2NjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDEwMzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCA3ODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2NykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANjcyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0NTYsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCAxMDcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YXJpZXR5IDogWFNEVmFyaWV0eSINCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkNCi0JCQkJd2lkdGggICAgICAJNjU2DQotCQkJCWhlaWdodCAgICAgCTI1MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjciIEA2NzMNCi0JCQkJbG9jYXRpb24gICAJKDc3NSwgMTc4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ1OTcxMDJFQSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjgiIEA2NzQNCi0JCQkJCVBhcmVudF9WaWV3IAlANjczDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMDksIC00NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY3NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjc0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUwOSwgMjM1KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzUwMTE5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDY3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc3NSwgMTc4KQ0KLQkJCQkJICAgICg1NTAsIDE3OCkNCi0JCQkJCSAgICAoNTUwLCAzMDYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzUsIDE3OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NTAsIDMwNikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDY3Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2NzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwOSwgLTQ2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc1LCAxMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODMxMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1OTc1MDEwNSINCi0JCQkJCWNsaWVudCAgICAgCUA2NzMNCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc1LCAxNzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOCwgMTc4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjc4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2MSwgMjE1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODEyNTAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4OSIgQDY3OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY5LCA3MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwMjAzQTgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmFjZXRzIiBANjgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDY3OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xNjE1LCAtMTUyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3LCA0OTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzODYzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwNjAwNjUiDQotCQkJCQljbGllbnQgICAgIAlANjc5DQotCQkJCQlzdXBwbGllciAgIAlANjYzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzY5LCA3MikNCi0JCQkJCSAgICAoMTAwLCA3MikNCi0JCQkJCSAgICAoMTAwLCA1NjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjksIDcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMCwgNTYxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjAsIDQ5OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNzkwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkwIiBANjgzDQotCQkJCQlQYXJlbnRfVmlldyAJQDY3OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xNjE1LCAtMTUyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjg0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc2LCAzMSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCQzhBRTA2MDA1MSINCi0JCQkJCWNsaWVudCAgICAgCUA2NzkNCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY5LCA3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCA3MikpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzMSIgQDY4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzOCwgNTA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2ODYNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOCwgNDQ5KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjANCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzIiIEA2ODcNCi0JCQkJCVBhcmVudF9WaWV3IAlANjg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ0NiwgMjg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NiwgMzQwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzZEQTAwMERGIg0KLQkJCQkJY2xpZW50ICAgICAJQDY4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDUwOCkNCi0JCQkJCSAgICAoMTQ4NywgNTA4KQ0KLQkJCQkJICAgICgxNDg3LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA1MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMjg1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIml0ZW1UeXBlRGVmaW5pdGlvbiIgQDY4OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2ODUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDQ2LCAyODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIzLCA1NzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraXRlbVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjIxMTUzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzZEQTAwMEUwIg0KLQkJCQkJY2xpZW50ICAgICAJQDY4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDUwOCkNCi0JCQkJCSAgICAoMTU5MCwgNTA4KQ0KLQkJCQkJICAgICgxNTkwLCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA1MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU5MCwgMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjkxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOSwgNDY4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAzOTg0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5MSIgQDY5Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTcyOSwgNTc0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNEI3MDIwOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTIiIEA2OTMNCi0JCQkJCVBhcmVudF9WaWV3IAlANjkyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgMzUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzNywgMzUzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDY5Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3MjksIDU3NCkNCi0JCQkJCSAgICAoMTY3OCwgNTc0KQ0KLQkJCQkJICAgICgxNjc4LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzI5LCA1NzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3OCwgMjg1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1lbWJlclR5cGVEZWZpbml0aW9ucyIgQDY5NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2OTINCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA2NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWVtYmVyVHlwZURlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjI2OTIzMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDY5Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3MjksIDU3NCkNCi0JCQkJCSAgICAoMTc4MSwgNTc0KQ0KLQkJCQkJICAgICgxNzgxLCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzI5LCA1NzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4MSwgMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMCwgNTIwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzEyMTIxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5MyIgQDY5OA0KLQkJCQlsb2NhdGlvbiAgIAkoNzQ4LCAyNjkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzIwMURCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZ1bmRhbWVudGFsRmFjZXRzIiBANjk5DQotCQkJCQlQYXJlbnRfVmlldyAJQDY5OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjM2LCA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjk5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgMzEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Z1bmRhbWVudGFsRmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjQwOTA5MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDYzIg0KLQkJCQkJY2xpZW50ICAgICAJQDY5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDY2Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc0OCwgMjY5KQ0KLQkJCQkJICAgICg2NTksIDI2OSkNCi0JCQkJCSAgICAoNjU5LCA1NjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NDgsIDI2OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTksIDU2MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjk5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyOCwgMzg1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM4MDI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTQiIEA3MDINCi0JCQkJCVBhcmVudF9WaWV3IAlANjk4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMzYsIDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1MiwgMjI4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDU5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDY5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NDgsIDI2OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAyNjkpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTUiIEA3MDQNCi0JCQkJbG9jYXRpb24gICAJKDExNzUsIDM5NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVBQjAyNzMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk2IiBANzA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDcwNA0KLQkJCQkJbG9jYXRpb24gICAJKC04MDksIDE3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDMxNikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDI5MSINCi0JCQkJCWNsaWVudCAgICAgCUA3MDQNCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTc1LCAzOTYpDQotCQkJCQkgICAgKDExMzUsIDM5NikNCi0JCQkJCSAgICAoMTEzNSwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMzUsIDI4NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA3MDcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzA0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTgwOSwgMTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NCwgNDQzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi41MzMzMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDJBNSINCi0JCQkJCWNsaWVudCAgICAgCUA3MDQNCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTc1LCAzOTYpDQotCQkJCQkgICAgKDEyMTUsIDM5NikNCi0JCQkJCSAgICAoMTIxNSwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTUsIDI4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzIsIDM1OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wOTYxNTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk3IiBANzEwDQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0NDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzIwMTZDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5OCIgQDcxMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNjI0LCAyMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjY4LCAzMjcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3NTAyMkYiDQotCQkJCQljbGllbnQgICAgIAlANzEwDQotCQkJCQlzdXBwbGllciAgIAlANjcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM2MCwgNDQ2KQ0KLQkJCQkJICAgICgxMzA5LCA0NDYpDQotCQkJCQkgICAgKDEzMDksIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzA5LCAyODUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iIEA3MTMNCi0JCQkJCVBhcmVudF9WaWV3IAlANzEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTYyNCwgMjIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIwNCwgNTA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3ByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjAwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzUwMjQzIg0KLQkJCQkJY2xpZW50ICAgICAJQDcxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNjAsIDQ0NikNCi0JCQkJCSAgICAoMTQxMiwgNDQ2KQ0KLQkJCQkJICAgICgxNDEyLCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYwLCA0NDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxMiwgMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM3MywgNDA5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYyMTQ3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBANzE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDUxMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDI4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgMzc4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDQ4OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTIwMg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGxpc3QiDQotCQkJCQkiKyByZXN0cmljdGlvbiINCi0JCQkJCSIrIHVuaW9uIikpDQotCQkJCXdpZHRoICAgICAgCTM0NA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDcxNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDE3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzE3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgOTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVmFyaWV0eSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjc3MzAyNDkiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM3QjAzOTYiDQotCQkJCWNsaWVudCAgICAgCUA2NjYNCi0JCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkxLCA1NjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTEsIDUyMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4MDAzOTQiDQotCQkJCWNsaWVudCAgICAgCUA2NjMNCi0JCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjcyLCA1NjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzIsIDUyMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjU2ODAyNTkiDQotCQkJCWNsaWVudCAgICAgCUA2NjENCi0JCQkJc3VwcGxpZXIgICAJQDY0Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY2LCAzMDYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjYsIDIxNSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcyMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2Qzg4MDFCNCINCi0JCQkJY2xpZW50ICAgICAJQDYyMQ0KLQkJCQlzdXBwbGllciAgIAlANjYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcsIDgyOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NywgNzgxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcyMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjU5MDI4MSINCi0JCQkJY2xpZW50ICAgICAJQDYzOA0KLQkJCQlzdXBwbGllciAgIAlANjUxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAsIDE4NDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAsIDE0NDQpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjUuIENvbXBvbmVudCBBbm5vdGF0aW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0I2OUQ2OEQwMEQyIg0KLQkJCXRpdGxlICAgICAgCSI1LiBDb21wb25lbnQgQW5ub3RhdGlvbnMiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDcyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAkzNTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANzI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MiwgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA3MjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODcyLCAxNTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI2LCAxNDYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJd2lkdGggICAgICAJNTEwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDcyNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDMwNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjYzLCAyNjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCQl3aWR0aCAgICAgIAk0NjgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA3MjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMzE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2MDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANzI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA3MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA2NjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANzI5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTE0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDczMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgNTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgNTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDczMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMDAsIDgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDY4LCAzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDczMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyMTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MCwgMTE3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANzMzDQotCQkJCWxvY2F0aW9uICAgCSgxOTk0LCAxNDEyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA3MzINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTk5NCwgMTQxMikNCi0JCQkJICAgICgxOTk0LCAxMjcxKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDczNA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDcyNQ0KLQkJCQlzdXBwbGllciAgIAlANzMyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDg0LCAxNDQ5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA4NCwgMTQxMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANzMzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANzM1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA4NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgwLCA4MjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNDAyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDczNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTIsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJd2lkdGggICAgICAJMjM0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA3MzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzM3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODQsIDM0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDczOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgMTgxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANzM5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc5MiwgMTcxMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2NywgMTY3NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk2NjkNCi0JCQkJaGVpZ2h0ICAgICAJMTAwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc0MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDczOQ0KLQkJCQlzdXBwbGllciAgIAlANzMyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTcyLCAxNjYyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU3MiwgMTQxMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANzMzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDc0MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTAyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgsIDk4MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IiBANzQyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODgsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZXBlYXRhYmxlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk0NTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANzQzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MSwgMTQ5MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA3NDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MiwgNjg1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQl3aWR0aCAgICAgIAk3MzgNCi0JCQkJaGVpZ2h0ICAgICAJNTQzDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzMiIEA3NDUNCi0JCQkJbG9jYXRpb24gICAJKDg2NSwgMTM1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAxODMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM0IiBANzQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDc0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzM0MiDQotCQkJCQljbGllbnQgICAgIAlANzQ1DQotCQkJCQlzdXBwbGllciAgIAlANzI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg2NSwgMTM1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NzEsIDEzNTkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc0Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCA1NTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTgsIDEzMjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS4xMTY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDM0NiINCi0JCQkJCWNsaWVudCAgICAgCUA3NDUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg4NjUsIDEzNTkpDQotCQkJCQkgICAgKDkyNSwgMTM1OSkNCi0JCQkJCSAgICAoOTI1LCAxMjE1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgMTIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4NywgMTI3NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjQyMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTciIEA3NTANCi0JCQkJbG9jYXRpb24gICAJKDcxMywgNzA5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBGMDIxMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTgiIEA3NTENCi0JCQkJCVBhcmVudF9WaWV3IAlANzUwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNywgLTkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEwMDBDOSINCi0JCQkJCWNsaWVudCAgICAgCUA3NTANCi0JCQkJCXN1cHBsaWVyICAgCUA3MjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCA3MDkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc1Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA3LCAtOTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjcsIDY2NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDk1MjM4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMDAwRDMiDQotCQkJCQljbGllbnQgICAgIAlANzUwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxMywgNzA5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgNzA5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk2LCA3NTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTM1NzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUxIiBANzU1DQotCQkJCWxvY2F0aW9uICAgCSg3MTksIDExOTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTUwMDhBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1MiIgQDc1Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMDk2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDcyOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTksIDExOTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCAxMTkzKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NTcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwMSwgMzkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIwLCAxMTQ3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDY5OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE2MDBBMCINCi0JCQkJCWNsaWVudCAgICAgCUA3NTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgMTE5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNiwgMTI0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwNDE2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTEiIEA3NjANCi0JCQkJbG9jYXRpb24gICAJKDc4NSwgNTUwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBBMDA2NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTIiIEA3NjENCi0JCQkJCVBhcmVudF9WaWV3IAlANzYwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyM0YiDQotCQkJCQljbGllbnQgICAgIAlANzYwDQotCQkJCQlzdXBwbGllciAgIAlANzMwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NSwgNTUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgNTUwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NjINCi0JCQkJCVBhcmVudF9WaWV3IAlANzYwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzYyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3OSwgNTE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDcwNzA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyNDkiDQotCQkJCQljbGllbnQgICAgIAlANzYwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzg1LCA1NTApDQotCQkJCQkgICAgKDg4NCwgNTUwKQ0KLQkJCQkJICAgICg4ODQsIDY3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NSwgNTUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NCwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzY0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM1LCA2MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mjk3MzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgzIiBANzY1DQotCQkJCWxvY2F0aW9uICAgCSgxMTg0LCA0MDQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTYwMjkwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NCIgQDc2Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDczMQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTg0LCA0MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4NCwgMTM1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBANzY3DQotCQkJCQlQYXJlbnRfVmlldyAJQDc2NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMiwgLTQxMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzY3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjQsIDIyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDkNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC42NjU0MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NzAxNkYiDQotCQkJCQljbGllbnQgICAgIAlANzY1DQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg0LCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUxLCA2MTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODQzODcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk5IiBANzcwDQotCQkJCWxvY2F0aW9uICAgCSgxNzUyLCAxMDM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFMjkxMDE1OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDAiIEA3NzENCi0JCQkJCVBhcmVudF9WaWV3IAlANzcwDQotCQkJCQlsb2NhdGlvbiAgIAkoNTM2LCAyMTgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUUyOTIwMTlGIg0KLQkJCQkJY2xpZW50ICAgICAJQDc3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDczMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3NTIsIDEwMzQpDQotCQkJCQkgICAgKDE4MTIsIDEwMzQpDQotCQkJCQkgICAgKDE4MTIsIDExNjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTIsIDExNjEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc3Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzANCi0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NDMsIDk5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU5NjAzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxQTkiDQotCQkJCQljbGllbnQgICAgIAlANzcwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTIsIDEwMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgMTAzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODQsIDEwNjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTAzMzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAxIiBANzc1DQotCQkJCWxvY2F0aW9uICAgCSgxODk2LCA4ODEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2Q0YwMDg4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwMiIgQDc3Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzUNCi0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIDQwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE1RCINCi0JCQkJCWNsaWVudCAgICAgCUA3NzUNCi0JCQkJCXN1cHBsaWVyICAgCUA3MzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxODk2LCA4ODEpDQotCQkJCQkgICAgKDE5NTYsIDg4MSkNCi0JCQkJCSAgICAoMTk1NiwgMTE2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4OTYsIDg4MSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTU2LCAxMTYxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImRlcml2YXRpb25Bbm5vdGF0aW9uIiBANzc3DQotCQkJCQlQYXJlbnRfVmlldyAJQDc3NQ0KLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgNDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCA4NDIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzkwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGVyaXZhdGlvbkFubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNTQyMzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE2NyINCi0JCQkJCWNsaWVudCAgICAgCUA3NzUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg5NiwgODgxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDg4MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODksIDkxNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNTA4NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDMiIEA3ODANCi0JCQkJbG9jYXRpb24gICAJKDIwNDAsIDcxNSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzMzAyNjQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA0IiBANzgxDQotCQkJCQlQYXJlbnRfVmlldyAJQDc4MA0KLQkJCQkJbG9jYXRpb24gICAJKDkyMCwgLTg1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjM0MDI4NCINCi0JCQkJCWNsaWVudCAgICAgCUA3ODANCi0JCQkJCXN1cHBsaWVyICAgCUA3MzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMDQwLCA3MTUpDQotCQkJCQkgICAgKDIxMDAsIDcxNSkNCi0JCQkJCSAgICAoMjEwMCwgMTE2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAwLCAxMTYxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBANzgyDQotCQkJCQlQYXJlbnRfVmlldyAJQDc4MA0KLQkJCQkJbG9jYXRpb24gICAJKDkyMCwgLTg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1OCwgNjgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzNDAyOEUiDQotCQkJCQljbGllbnQgICAgIAlANzgwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCA3MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg1LCA3NDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDkzMTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIxIiBANzg1DQotCQkJCWxvY2F0aW9uICAgCSg2NjgsIDg2NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNDAwNEYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIyIiBANzg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDc4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC02MTIsIDMzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBDQSINCi0JCQkJCWNsaWVudCAgICAgCUA3ODUNCi0JCQkJCXN1cHBsaWVyICAgCUA3MzUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjY4LCA4NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDczLCA4NjUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc4Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjEyLCAzMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgODI1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMzQxNDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBENCINCi0JCQkJCWNsaWVudCAgICAgCUA3ODUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjY4LCA4NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCA4NjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDEsIDkwMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4MjA1MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjUiIEA3OTANCi0JCQkJbG9jYXRpb24gICAJKDE0NzIsIDE2NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCOTAxQ0QiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI2IiBANzkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDc5MA0KLQkJCQkJbG9jYXRpb24gICAJKDI1NiwgLTY0OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCQTAxQzQiDQotCQkJCQljbGllbnQgICAgIAlANzkwDQotCQkJCQlzdXBwbGllciAgIAlANzM2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ3MiwgMTY3KQ0KLQkJCQkJICAgICgxNDcyLCA3MikNCi0JCQkJCSAgICAoMTg4MywgNzIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCAxNjcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg4MywgNzIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc5Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTANCi0JCQkJCWxvY2F0aW9uICAgCSgyNTYsIC02NDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA0LCAxMjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzYzMDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCQTAxQ0UiDQotCQkJCQljbGllbnQgICAgIAlANzkwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcyLCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDE5LCA2MTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTM1NzQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzUiIEA3OTUNCi0JCQkJbG9jYXRpb24gICAJKDkyNywgMzUwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjA2MDI5MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3NiIgQDc5Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MSINCi0JCQkJCWNsaWVudCAgICAgCUA3OTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3MzcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI3LCAzNTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjI5LCAzNTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc5Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAzMTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC44MTY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MiINCi0JCQkJCWNsaWVudCAgICAgCUA3OTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5MjcsIDM1MCkNCi0JCQkJCSAgICAoOTg3LCAzNTApDQotCQkJCQkgICAgKDk4NywgNjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI3LCAzNTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg3LCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM3LCA2MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDMzNDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjciIEA4MDANCi0JCQkJbG9jYXRpb24gICAJKDEwMjcsIDIyMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REFEQzAyRjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjgiIEA4MDENCi0JCQkJCVBhcmVudF9WaWV3IAlAODAwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTkzLCAtNTc4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDIzOCINCi0JCQkJCWNsaWVudCAgICAgCUA4MDANCi0JCQkJCXN1cHBsaWVyICAgCUA3MzgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgMjIyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MDINCi0JCQkJCVBhcmVudF9WaWV3IAlAODAwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTkzLCAtNTc4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwMywgMTg4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDA2MjUwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REFERDAyNDIiDQotCQkJCQljbGllbnQgICAgIAlAODAwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTAyNywgMjIyKQ0KLQkJCQkJICAgICgxMDg3LCAyMjIpDQotCQkJCQkgICAgKDEwODcsIDY3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjcsIDIyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCA2MTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTAwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgyNTgzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkxIiBAODA1DQotCQkJCWxvY2F0aW9uICAgCSgxNDk0LCAxNDM4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOTAwNjg4MDFDMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5MiIgQDgwNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDUNCi0JCQkJCWxvY2F0aW9uICAgCSgyMTQsIDU5MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDY4QTAxMTEiDQotCQkJCQljbGllbnQgICAgIAlAODA1DQotCQkJCQlzdXBwbGllciAgIAlANzM5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTQsIDE0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTY2MikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50QW5ub3RhdGlvbiIgQDgwNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDUNCi0JCQkJCWxvY2F0aW9uICAgCSgyMTQsIDU5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTYsIDEzNTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudEFubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNjc3MTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDY4QTAxMUIiDQotCQkJCQljbGllbnQgICAgIAlAODA1DQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTQsIDE0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDMsIDEyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTMwMDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ1IiBAODEwDQotCQkJCWxvY2F0aW9uICAgCSg2MzcsIDEwMjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTcwMkM4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0NiIgQDgxMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTgwM0UyIg0KLQkJCQkJY2xpZW50ICAgICAJQDgxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDc0MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDExLCAxMDIyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MTINCi0JCQkJCVBhcmVudF9WaWV3IAlAODEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4MywgMjIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODEzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzEwLCA5NzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODg4OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTkwMDA0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAyLCAxMDYyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzMwMDg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY1IiBAODE1DQotCQkJCWxvY2F0aW9uICAgCSgxNTgxLCA2MDcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTcwMTAyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY2IiBAODE2DQotCQkJCQlQYXJlbnRfVmlldyAJQDgxNQ0KLQkJCQkJbG9jYXRpb24gICAJKDMwMSwgLTIyNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTEiDQotCQkJCQljbGllbnQgICAgIAlAODE1DQotCQkJCQlzdXBwbGllciAgIAlANzQyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU4MSwgNjA3KQ0KLQkJCQkJICAgICgxNTgxLCA1NDcpDQotCQkJCQkgICAgKDE2NzksIDU0NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc5LCA1NDcpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4MTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAODE1DQotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2OSwgNDYyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjE5Njk3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTkwMTkyIg0KLQkJCQkJY2xpZW50ICAgICAJQDgxNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTgxLCA2MDcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOSwgNjIwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTk2OTcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwNSIgQDgyMA0KLQkJCQlsb2NhdGlvbiAgIAkoODQ5LCAxNDk2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjExMDI2RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDYiIEA4MjENCi0JCQkJCVBhcmVudF9WaWV3IAlAODIwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDFGOSINCi0JCQkJCWNsaWVudCAgICAgCUA4MjANCi0JCQkJCXN1cHBsaWVyICAgCUA3NDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODQ5LCAxNDk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1NCwgMTQ5NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODIyDQotCQkJCQlQYXJlbnRfVmlldyAJQDgyMA0KLQkJCQkJbG9jYXRpb24gICAJKC0yNzEsIDY5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk0MiwgMTQ2NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTg4MjU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMjAyMDMiDQotCQkJCQljbGllbnQgICAgIAlAODIwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoODQ5LCAxNDk2KQ0KLQkJCQkJICAgICgxMDYyLCAxNDk2KQ0KLQkJCQkJICAgICgxMDYyLCAxMjE1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODQ5LCAxNDk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjIsIDEyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTE1LCAxMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyNjkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwNyIgQDgyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTUyLCAxNTY1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDNjI2RUIzMDAwNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDgiIEA4MjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAODI1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyOCwgNzMzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUI0MDMyNyINCi0JCQkJCWNsaWVudCAgICAgCUA4MjUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1NCwgMTU2NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDgyNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI4LCA3MzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCAxNTM4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA0OTU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCNDAzMzIiDQotCQkJCQljbGllbnQgICAgIAlAODI1DQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTUyLCAxNTY1KQ0KLQkJCQkJICAgICgxMjAwLCAxNTY1KQ0KLQkJCQkJICAgICgxMjAwLCAxMjE1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDAsIDEyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU0LCAxMjc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODMwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODAwMzk0Ig0KLQkJCQljbGllbnQgICAgIAlANzI2DQotCQkJCXN1cHBsaWVyICAgCUA3MzYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5ODQsIDI0OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5ODQsIDEzNSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgzMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzhGMDAyRSINCi0JCQkJY2xpZW50ICAgICAJQDc0Mg0KLQkJCQlzdXBwbGllciAgIAlANzI2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTk3LCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTk3LCAzNTkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjYuIENvbmNyZXRlIENvbXBvbmVudHMiDQotCQkJcXVpZCAgICAgICAJIjNCNkFENzREMDNDNCINCi0JCQl0aXRsZSAgICAgIAkiNi4gQ29uY3JldGUgQ29tcG9uZW50cyINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBAODMyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IiBAODMzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODMyLCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODMzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTY4LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQkJd2lkdGggICAgICAJNTQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiIEA4MzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjAwLCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODM0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTkxLCA2MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiINCi0JCQkJd2lkdGggICAgICAJNDM2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAODM1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNTYsIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQkJd2lkdGggICAgICAJNDI2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4MzYNCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDU2MSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODM1DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEzNjAsIDU2MSkNCi0JCQkJICAgICgxMzYwLCA0NzEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREluY2x1ZGUiIEA4MzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTEyLCAxMTU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREluY2x1ZGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDN0QwMjUwIg0KLQkJCQl3aWR0aCAgICAgIAkyNTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiIEA4MzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgOTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjk0LCA5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiIEA4MzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTM2LCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA1LCAxMTU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQkJd2lkdGggICAgICAJMjgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDg0MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM3NSwgMTE1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4NTENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJd2lkdGggICAgICAJODY5DQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQzIiBAODQxDQotCQkJCWxvY2F0aW9uICAgCSgxMzY4LCAxMjA2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M1MDA3RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDQiIEA4NDINCi0JCQkJCVBhcmVudF9WaWV3IAlAODQxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTE2MCwgNDA2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M2MDA2QiINCi0JCQkJCWNsaWVudCAgICAgCUA4NDENCi0JCQkJCXN1cHBsaWVyICAgCUA4MzcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMjA2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NDMNCi0JCQkJCVBhcmVudF9WaWV3IAlAODQxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTE2MCwgNDA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM0NywgMTE1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU0NDEyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNjAwNkMiDQotCQkJCQljbGllbnQgICAgIAlAODQxDQotCQkJCQlzdXBwbGllciAgIAlAODQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjgsIDEyMDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzNCwgMTIwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDAsIDEyNTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA3DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE0NzA2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MSIgQDg0Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTE2OCwgMTAyMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEODAyRkMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQyIiBAODQ3DQotCQkJCQlQYXJlbnRfVmlldyAJQDg0Ng0KLQkJCQkJbG9jYXRpb24gICAJKDk2MCwgMjIyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q5MDE4QiINCi0JCQkJCWNsaWVudCAgICAgCUA4NDYNCi0JCQkJCXN1cHBsaWVyICAgCUA4MzgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTY4LCAxMDIyKQ0KLQkJCQkJICAgICgxMTY4LCA5NjIpDQotCQkJCQkgICAgKDEyODUsIDk2MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNjgsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4NSwgOTYyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NDgNCi0JCQkJCVBhcmVudF9WaWV3IAlAODQ2DQotCQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAyMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjkwLCAxMDc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDUzNzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEOTAxOEMiDQotCQkJCQljbGllbnQgICAgIAlAODQ2DQotCQkJCQlzdXBwbGllciAgIAlAODQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNjgsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE2OCwgMTE0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMjcsIDEwNzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzY5NzUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYzIiBAODUxDQotCQkJCWxvY2F0aW9uICAgCSgxNTYzLCAxMzUzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFERTQyMDA5QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjQiIEA4NTINCi0JCQkJCVBhcmVudF9WaWV3IAlAODUxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTM1NSwgNTUzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFERTQzMDJGRSINCi0JCQkJCWNsaWVudCAgICAgCUA4NTENCi0JCQkJCXN1cHBsaWVyICAgCUA4MzkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTYzLCAxMzUzKQ0KLQkJCQkJICAgICgxOTQwLCAxMzUzKQ0KLQkJCQkJICAgICgxOTQwLCAxMjU1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2MywgMTM1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTQwLCAxMjU1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODUzDQotCQkJCQlQYXJlbnRfVmlldyAJQDg1MQ0KLQkJCQkJbG9jYXRpb24gICAJKDEzNTUsIDU1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTcsIDEzMjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTY4MDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFERTQzMDMwOCINCi0JCQkJCWNsaWVudCAgICAgCUA4NTENCi0JCQkJCXN1cHBsaWVyICAgCUA4NDANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTYzLCAxMzUzKQ0KLQkJCQkJICAgICgxMTgxLCAxMzUzKQ0KLQkJCQkJICAgICgxMTgxLCAxMjU5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2MywgMTM1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTgxLCAxMjU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzMCwgMTMyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MTM0NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4NTYNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNTYxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4MzINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjg4LCA1NjEpDQotCQkJCSAgICAoMjg4LCA0NzEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAODU3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYwLCA2MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDg1OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjU4LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQkJd2lkdGggICAgICAJNDE0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDg1OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDcyMCwgOTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1MCwgOTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTU4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDg2MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNCwgNjcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMCwgNjI5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSINCi0JCQkJY2xpZW50ICAgICAJQDg2MA0KLQkJCQlzdXBwbGllciAgIAlAODMyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjEsIDYxNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMSwgNTYxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NTYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUEyMDE5NyINCi0JCQkJY2xpZW50ICAgICAJQDg1Nw0KLQkJCQlzdXBwbGllciAgIAlAODMyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1ODksIDYxNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OSwgNTYxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NTYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkIzMDFENSINCi0JCQkJY2xpZW50ICAgICAJQDgzNA0KLQkJCQlzdXBwbGllciAgIAlAODM1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDE2LCA2MTcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDE2LCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDgzNikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEA4NjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA5NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MCwgOTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIg0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg2NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgMTA4OSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODY0DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE4MjQsIDEwODkpDQotCQkJCSAgICAoMTgyNCwgOTk5KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOERDMDM4MSINCi0JCQkJY2xpZW50ICAgICAJQDgzNw0KLQkJCQlzdXBwbGllciAgIAlAODY0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY2LCAxMTQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2NiwgMTA4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODY1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NjcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiDQotCQkJCWNsaWVudCAgICAgCUA4MzkNCi0JCQkJc3VwcGxpZXIgICAJQDg2NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkzNCwgMTE0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MzQsIDEwODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDg2NSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDg2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgNjI5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTQzOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg2OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2MiwgODE5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4NjgNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTc2MiwgODE5KQ0KLQkJCQkgICAgKDE3NjIsIDcyNykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NzANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEOTAwM0UiDQotCQkJCWNsaWVudCAgICAgCUA4MzgNCi0JCQkJc3VwcGxpZXIgICAJQDg2OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNiwgODg5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNiwgODE5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NjkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg3MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiINCi0JCQkJY2xpZW50ICAgICAJQDg2OA0KLQkJCQlzdXBwbGllciAgIAlAODM1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU2LCA2MTcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU2LCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDgzNikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAODcyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxNDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODc1LCAxMDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4NzMNCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDI4OSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDExMjAsIDI4OSkNCi0JCQkJICAgICgxMTIwLCAxOTkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwNSIgQDg3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NSwgMjE1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjA4MDNDNyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250YWluZXIiIEA4NzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAODc0DQotCQkJCQlsb2NhdGlvbiAgIAkoOTg5LCAxMDMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA0LCAyMTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGFpbmVyIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDMzMTEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMEMwMUNFIg0KLQkJCQkJY2xpZW50ICAgICAJQDg3NA0KLQkJCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0ODUsIDIxNSkNCi0JCQkJCSAgICAoMTQ4NSwgMTc2KQ0KLQkJCQkJICAgICgxMzc0LCAxNzYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg1LCAyMTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3NCwgMTc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzNSwgMjI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTY5DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjAyNjQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDYiIEA4NzgNCi0JCQkJCVBhcmVudF9WaWV3IAlAODc0DQotCQkJCQlsb2NhdGlvbiAgIAkoOTg5LCAxMDMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMEMwMUNGIg0KLQkJCQkJY2xpZW50ICAgICAJQDg3NA0KLQkJCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0ODUsIDIxNSkNCi0JCQkJCSAgICAoMTQ4NSwgMjU0KQ0KLQkJCQkJICAgICgxMzQ1LCAyNTQpDQotCQkJCQkgICAgKDEzNDUsIDE5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODUsIDIxNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzQ1LCAxOTkpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDciIEA4NzkNCi0JCQkJbG9jYXRpb24gICAJKDc3MywgMjE2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjQ4MDI2MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290Q29udGFpbmVyIiBAODgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDg3OQ0KLQkJCQkJbG9jYXRpb24gICAJKDUzLCAxMDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDIxNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290Q29udGFpbmVyIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNTAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE2MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjRDMDI4NSINCi0JCQkJCWNsaWVudCAgICAgCUA4NzkNCi0JCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NzMsIDIxNikNCi0JCQkJCSAgICAoNzczLCAxNzYpDQotCQkJCQkgICAgKDg2NiwgMTc2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAyMTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxNzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDIyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zMDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwOCIgQDg4Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzkNCi0JCQkJCWxvY2F0aW9uICAgCSg1MywgMTA0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjRDMDI4NiINCi0JCQkJCWNsaWVudCAgICAgCUA4NzkNCi0JCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NzMsIDIxNikNCi0JCQkJCSAgICAoNzczLCAyNTcpDQotCQkJCQkgICAgKDg5NSwgMjU3KQ0KLQkJCQkJICAgICg4OTUsIDE5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMjE2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NSwgMTk5KSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhFNjAzNzIiDQotCQkJCWNsaWVudCAgICAgCUA4MzUNCi0JCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2NywgMzYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NywgMjg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NzMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzJEOEUyMDBFQSINCi0JCQkJY2xpZW50ICAgICAJQDgzMw0KLQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTIsIDM2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1MiwgMjg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NzMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiINCi0JCQkJY2xpZW50ICAgICAJQDgzMg0KLQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTksIDM2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5OSwgMjg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NzMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA4ODcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTE1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODg4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNDNEEwMTgyIg0KLQkJCQljbGllbnQgICAgIAlAODg3DQotCQkJCXN1cHBsaWVyICAgCUA4NjANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNiwgMTE0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNiwgNzI3KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxOSIgQDg4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM4MiwgMTQyNSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREQwQzAzREIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIwIiBAODkwDQotCQkJCQlQYXJlbnRfVmlldyAJQDg4OQ0KLQkJCQkJbG9jYXRpb24gICAJKDExOTAsIDIyNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDQiDQotCQkJCQljbGllbnQgICAgIAlAODg5DQotCQkJCQlzdXBwbGllciAgIAlAODY0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM4MiwgMTQyNSkNCi0JCQkJCSAgICAoMjE0NywgMTQyNSkNCi0JCQkJCSAgICAoMjE0NywgOTQzKQ0KLQkJCQkJICAgICgyMDY3LCA5NDMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjcsIDk0MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRTY2hlbWEiIEA4OTENCi0JCQkJCVBhcmVudF9WaWV3IAlAODg5DQotCQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMjI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ1LCAxMzg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjU0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg4OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg4Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzODIsIDE0MjUpDQotCQkJCQkgICAgKDIyNSwgMTQyNSkNCi0JCQkJCSAgICAoMjI1LCAxMjU1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgMTQyNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjUsIDEyNTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODMsIDEzOTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTY5MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE3IiBAODk0DQotCQkJCWxvY2F0aW9uICAgCSgxNTA1LCAxNTAzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQ0M3MDBFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTgiIEA4OTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAODk0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTMxMywgMzAzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MiINCi0JCQkJCWNsaWVudCAgICAgCUA4OTQNCi0JCQkJCXN1cHBsaWVyICAgCUA4NjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTA1LCAxNTAzKQ0KLQkJCQkJICAgICgyMTg4LCAxNTAzKQ0KLQkJCQkJICAgICgyMTg4LCA2NzUpDQotCQkJCQkgICAgKDIwNTksIDY3NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDUsIDE1MDMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1OSwgNjc1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkU2NoZW1hIiBAODk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDg5NA0KLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODk2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMywgMTQ3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZFNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczMzMzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQzIg0KLQkJCQkJY2xpZW50ICAgICAJQDg5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDg4Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MDUsIDE1MDMpDQotCQkJCQkgICAgKDExMywgMTUwMykNCi0JCQkJCSAgICAoMTEzLCAxMjU1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNSwgMTUwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMsIDEyNTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTQ3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NzY4Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDkiIEA4OTkNCi0JCQkJbG9jYXRpb24gICAJKDY2LCAyNDQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzEwMzU2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExMCIgQDkwMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQsIC00NDQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzMwMzMxIg0KLQkJCQkJY2xpZW50ICAgICAJQDg5OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDY2LCAyNDQpDQotCQkJCQkgICAgKDY2LCAxNDQpDQotCQkJCQkgICAgKDg2NiwgMTQ0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYsIDI0NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE0NCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWEiIEA5MDENCi0JCQkJCVBhcmVudF9WaWV3IAlAODk5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0LCAtNDQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1LCA5MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTY4MTEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMzAzM0IiDQotCQkJCQljbGllbnQgICAgIAlAODk5DQotCQkJCQlzdXBwbGllciAgIAlAODg3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2LCAyNDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYsIDExNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYsIDE4NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMTMNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDY2NTkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTA0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3ODBCRDkwMDU5Ig0KLQkJCQljbGllbnQgICAgIAlAODU4DQotCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTksIDM2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTksIDI4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODczKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiDQotCQkJCWNsaWVudCAgICAgCUA4NDANCi0JCQkJc3VwcGxpZXIgICAJQDgzMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDAwLCAxMTQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDAwLCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDg1NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkwNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTAxMiwgODM3KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4MzQNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTAxMiwgODM3KQ0KLQkJCQkgICAgKDEwMTIsIDcyNykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDcNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAOTA4DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzEsIDg3MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4ODE1OA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGRDRFMjAzNjYiDQotCQkJCWNsaWVudCAgICAgCUA4NDANCi0JCQkJc3VwcGxpZXIgICAJQDgzNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzNywgMTE0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMzcsIDgzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTA2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDkNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAOTEwDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg5MCwgODY1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTgxNjMzDQotCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZENEJBMDIzQyINCi0JCQkJY2xpZW50ICAgICAJQDg1OQ0KLQkJCQlzdXBwbGllciAgIAlAODM0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjUsIDkwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgODM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDg2NA0KLQkJCQlzdXBwbGllciAgIAlAODY4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI4LCA4ODkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI4LCA4MTkpDQotCQkJCWRyYXdTdXBwbGllciAJQDg2OSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQjlGOEY3NjAyQzciDQotCQkJdGl0bGUgICAgICAJIjcuIENvbmNyZXRlIEF0dHJpYnV0ZXMiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA5MTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgMTQ0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxMzU5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxNDE5KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzgyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZm9ybSA6IFhTREZvcm0iDQotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNDMwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGb3JtIiBAOTEzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2MCwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTEzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5OCwgMTM2NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGb3JtIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTEzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5OCwgMTMxNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5RjkxM0IwMUVCIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAOTE0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgOTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDk3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ2DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZWxlbWVudCA6IERPTUVsZW1lbnQiKSkNCi0JCQkJd2lkdGggICAgICAJNjc1DQotCQkJCWhlaWdodCAgICAgCTE0Mw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBAOTE1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAzODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg3LCAzMzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQkJd2lkdGggICAgICAJMzQwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA5MTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA5NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3OCwgODkyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQkJd2lkdGggICAgICAJNDcwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDkxNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCAxNDA4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDEzNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAOTE4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODY0LCA2MjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ1LCA1NzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCQl3aWR0aCAgICAgIAkyNTYNCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkxOQ0KLQkJCQlsb2NhdGlvbiAgIAkoODUwLCA1MzcpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDkxNQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg4NTAsIDUzNykNCi0JCQkJICAgICg4NTAsIDQ0NykpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NRWxlbWVudCIgQDkyMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyNDgsIDEyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTIwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA5MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01FbGVtZW50IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTIwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzUxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODE4OTc5MDIwMCINCi0JCQkJd2lkdGggICAgICAJNzY5DQotCQkJCWhlaWdodCAgICAgCTIwMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA5MjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDY0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNTg0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTUxMg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEA5MjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDM4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMzMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCQl3aWR0aCAgICAgIAk0MjINCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkyMw0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAyNjMpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDkxNA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgzNjgsIDI2MykNCi0JCQkJICAgICgzNjgsIDE2NykpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiIEA5MjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTkyLCAxNDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDEzNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDEyOTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUE0MDNERiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIzLCAxNDA3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgc3Vic3RpdHV0aW9uIg0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iDQotCQkJCQkiKyBhbGwiKSkNCi0JCQkJd2lkdGggICAgICAJNTU2DQotCQkJCWhlaWdodCAgICAgCTM0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIgQDkyNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDE3OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTcwOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTY1OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QkUwMjcyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE3NjgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkxOTgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBleHRlbnNpb24iDQotCQkJCQkiKyByZXN0cmljdGlvbiINCi0JCQkJCSIrIGFsbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTANCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAOTI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkxMiwgMjA5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMyLCAyMDQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMyLCAyMTAwKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzIzDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkNCi0JCQkJd2lkdGggICAgICAJNzc4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDkyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTk4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4NzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyNUQwMjk1Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMzQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhGaW5hbCIgQDkyOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NDQsIDIwMTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjIsIDE5MzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleEZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM2MiwgMTg4MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyQ0EwMUNCIg0KLQkJCQl3aWR0aCAgICAgIAkzODINCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDkyOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxMjc5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxMzM5KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTg4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdXNlIDogWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiDQotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNjQwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIgQDkzMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTYzMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE1NDgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTQ5OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0JBN0IwRTgwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTINCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA5MzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjA4LCA5MjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ5OCwgODgxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQl3aWR0aCAgICAgIAkyMzgNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA5MzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI0MCwgMTcxMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NywgMTYzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk5NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU3LCAxNjkxKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJOTM0DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikpDQotCQkJCXdpZHRoICAgICAgCTk4NA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA5MzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTA5NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4ODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDExNTYpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4NTINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk5MDYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDkzNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDEwMDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYyMiwgNzc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTk5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTEwMTQNCi0JCQkJaGVpZ2h0ICAgICAJNDg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCIgQDkzNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgOTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNywgOTA0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREltcG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJCXdpZHRoICAgICAgCTQyNA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAOTM2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzNDQsIDY1NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM4LCA2MDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDEyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM4LCA2NjApDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNDMwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA5MzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg0MCwgMjA0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxMCwgMTk0MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4NjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDEwLCAyMDAyKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJODIyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEQ29tcGxleEZpbmFsIg0KLQkJCQkJIjw8MC4uKj4+ICsgYmxvY2sgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJCSIrIG1peGVkIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk4NzgNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAOTM4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4OCwgMTY5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzA0LCAxNjQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzg2DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCINCi0JCQkJY2xpZW50ICAgICAJQDkzOA0KLQkJCQlzdXBwbGllciAgIAlAOTE3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA2LCAxNjMyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwNiwgMTQ3MikpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBAOTQwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjIwOCwgNzA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU4LCA1OTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJOTAwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCXdpZHRoICAgICAgCTkxOA0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhBQTAxRDMiDQotCQkJCWNsaWVudCAgICAgCUA5MzENCi0JCQkJc3VwcGxpZXIgICAJQDkxNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjY5NiwgODY5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY5NiwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJY2xpZW50ICAgICAJQDkzMg0KLQkJCQlzdXBwbGllciAgIAlAOTEyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDk0LCAxNjE5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5NCwgMTUzMykpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NDMNCi0JCQkJbG9jYXRpb24gICAJKDE0ODcsIDE4NTYpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDkzOA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNDg3LCAxODU2KQ0KLQkJCQkgICAgKDE0ODcsIDE3NjApKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTUF0dHIiIEA5NDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAwLCAzODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDM1MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01BdHRyIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMzAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JCRjhDODkwMUI2Ig0KLQkJCQl3aWR0aCAgICAgIAk2NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlAOTM3DQotCQkJCXN1cHBsaWVyICAgCUA5MzgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzQsIDE5MzApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzM0LCAxODU2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQyNTY4MDI1OSINCi0JCQkJY2xpZW50ICAgICAJQDkzNg0KLQkJCQlzdXBwbGllciAgIAlAOTE1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCA1ODgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDkxOSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUxNzcwMTE2Ig0KLQkJCQljbGllbnQgICAgIAlAOTQwDQotCQkJCXN1cHBsaWVyICAgCUA5MTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxOTAsIDU4NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxOTAsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiDQotCQkJCWNsaWVudCAgICAgCUA5MjENCi0JCQkJc3VwcGxpZXIgICAJQDkyMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyLCA1NzIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjIsIDQ0NykpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiINCi0JCQkJY2xpZW50ICAgICAJQDkyMg0KLQkJCQlzdXBwbGllciAgIAlAOTE0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjAsIDMyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MCwgMjYzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MjMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEQ5MDAzRSINCi0JCQkJY2xpZW50ICAgICAJQDkzNQ0KLQkJCQlzdXBwbGllciAgIAlAOTIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjMsIDg5MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMywgNzA4KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTUxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQljbGllbnQgICAgIAlAOTMzDQotCQkJCXN1cHBsaWVyICAgCUA5MzENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MDAsIDEwODQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAwLCA5ODcpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NRG9jdW1lbnQiIEA5NTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxMjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDk0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTURvY3VtZW50IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1NywgNDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI3ODUwRTAzODEiDQotCQkJCXdpZHRoICAgICAgCTc3Ng0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBOTAzRDIiDQotCQkJCWNsaWVudCAgICAgCUA5MTUNCi0JCQkJc3VwcGxpZXIgICAJQDkxNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU2LCAzMjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDI2MykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTIzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NTm9kZSIgQDk1NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNCwgMzUwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjM0LCAzMDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjRBNTAxMTciDQotCQkJCXdpZHRoICAgICAgCTY4Ng0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0Q2NDAyMzEiDQotCQkJCWNsaWVudCAgICAgCUA5MTgNCi0JCQkJc3VwcGxpZXIgICAJQDkxNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODUwLCA1NjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTAsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDdCQjAzNDkiDQotCQkJCWNsaWVudCAgICAgCUA5MjkNCi0JCQkJc3VwcGxpZXIgICAJQDkxNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAxMjY3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDkxOSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTU3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3Ig0KLQkJCQljbGllbnQgICAgIAlAOTE2DQotCQkJCXN1cHBsaWVyICAgCUA5MTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTQsIDg4MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2OTQsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiDQotCQkJCWNsaWVudCAgICAgCUA5MzQNCi0JCQkJc3VwcGxpZXIgICAJQDkxOA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU2LCA3NjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDY4NykpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NTkNCi0JCQkJbG9jYXRpb24gICAJKDE3MDMsIDEyOTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDkxNg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNzAzLCAxMjkwKQ0KLQkJCQkgICAgKDE3MDMsIDEwMDgpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTYwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIg0KLQkJCQljbGllbnQgICAgIAlAOTE3DQotCQkJCXN1cHBsaWVyICAgCUA5MTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDMsIDEzNDQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMjkwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk2MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDkxMg0KLQkJCQlzdXBwbGllciAgIAlAOTE2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDkzLCAxMzQ3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgMTI5MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NjINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUA5MjYNCi0JCQkJc3VwcGxpZXIgICAJQDkzOA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MywgMjAyOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNTMsIDE4NTYpDQotCQkJCWRyYXdTdXBwbGllciAJQDk0MykpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI4LiBDb25jcmV0ZSBDb250YWlubWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2QTgwOTcwMjdBIg0KLQkJCXRpdGxlICAgICAgCSI4LiBDb25jcmV0ZSBDb250YWlubWVudCINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDk2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NzIsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQzOSwgOTQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQl3aWR0aCAgICAgIAk0ODQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA5NjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjQwLCA1NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQzMSwgNTMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTQzNg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiIEA5NjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMTMsIDc0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiDQotCQkJCXdpZHRoICAgICAgCTI4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIgQDk2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDU3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODU0LCA1MzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiINCi0JCQkJd2lkdGggICAgICAJNDM4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NjcNCi0JCQkJbG9jYXRpb24gICAJKDE5NDMsIDg2OCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTY2DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE5NDMsIDg2OCkNCi0JCQkJICAgICgxOTQzLCA2MzEpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2NSIgQDk2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjEyNSwgNjgwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFODI0MDA1MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjYiIEA5NjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTY4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU3LCAzNDQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjYwMkFEIg0KLQkJCQkJY2xpZW50ICAgICAJQDk2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDk2NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTI1LCA2ODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNzI5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAOTcwDQotCQkJCQlQYXJlbnRfVmlldyAJQDk2OA0KLQkJCQkJbG9jYXRpb24gICAJKDE1NywgMzQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1NSwgNjcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTc1NDM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjYwMkI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDk2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDk2Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTI1LCA2ODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNjMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA2NywgNjcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTc1NDM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA5NzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDgsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQkJd2lkdGggICAgICAJMjM0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTc0DQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTczDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI3MiwgNDY1KQ0KLQkJCQkgICAgKDI3MiwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDk3NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NTYsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNzIsIDExMjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTY5DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1ODcNCi0JCQkJaGVpZ2h0ICAgICAJMTE4DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBAOTc2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA1NzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg5LCA1MzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTM1Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1MyIgQDk3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3MCwgMTM1NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBQzAyNUEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cCIgQDk3OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5NzcNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTc4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OSwgMTM4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM0MDQ0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzkiDQotCQkJCQljbGllbnQgICAgIAlAOTc3DQotCQkJCQlzdXBwbGllciAgIAlAOTc2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3MCwgMTM1NikNCi0JCQkJCSAgICAoMjA2LCAxMzU2KQ0KLQkJCQkJICAgICgyMDYsIDYzMSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2LCA2MzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5ODANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYsIDEzMjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTkxNDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NCIgQDk4MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5NzcNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTgxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI1MjEsIDEzOTgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzgiDQotCQkJCQljbGllbnQgICAgIAlAOTc3DQotCQkJCQlzdXBwbGllciAgIAlAOTc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3MCwgMTM1NikNCi0JCQkJCSAgICAoMjczMSwgMTM1NikNCi0JCQkJCSAgICAoMjczMSwgMTIyNykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjczMSwgMTIyNykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAOTgzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYwLCAxNjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI2OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NyIgQDk4NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyLCAxMTM2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJDRUIxMDJGOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDgiIEA5ODUNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTg0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMUIiDQotCQkJCQljbGllbnQgICAgIAlAOTg0DQotCQkJCQlzdXBwbGllciAgIAlAOTc2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMiwgMTEzNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIsIDYzMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDk4Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5ODQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMwLCAtMjU2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjIzLCAxNTE1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUwNDk1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjYwMDI1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDk4NA0KLQkJCQkJc3VwcGxpZXIgICAJQDk4Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIsIDExMzYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyLCAxNjQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwLCAxNTgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgxMTg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDk4OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgODApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTg5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiDQotCQkJCXdpZHRoICAgICAgCTUxMw0KLQkJCQloZWlnaHQgICAgIAkxMDANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1OSIgQDk5MA0KLQkJCQlsb2NhdGlvbiAgIAkoNDcsIDg4NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxNTAxMTkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYwIiBAOTkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDk5MA0KLQkJCQkJbG9jYXRpb24gICAJKC0yODksIDgyMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQUIiDQotCQkJCQljbGllbnQgICAgIAlAOTkwDQotCQkJCQlzdXBwbGllciAgIAlAOTgzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ3LCA4ODUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDcsIDE2NDEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDk5Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5OTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMjg5LCA4MjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIsIDE4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTIxODU0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQjUiDQotCQkJCQljbGllbnQgICAgIAlAOTkwDQotCQkJCQlzdXBwbGllciAgIAlAOTg5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ3LCA4ODUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDcsIDEzMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTkyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI4LCAxOTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTc4ODENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAOTk1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgODk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjUyLCA4NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJd2lkdGggICAgICAJMzYzDQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDk5Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzUsIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0ODQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4OSIgQDk5Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxOSwgMTAzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFOTAxOEEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTAiIEA5OTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTk3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3LCAtMTAyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkYxREVBMDM2QyINCi0JCQkJCWNsaWVudCAgICAgCUA5OTcNCi0JCQkJCXN1cHBsaWVyICAgCUA5OTUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMxOSwgMTAzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCA5NTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDk5OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5OTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTcsIC0xMDIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDAwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTAzOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDczMTcxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTIwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzgwIg0KLQkJCQkJY2xpZW50ICAgICAJQDk5Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDk5Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzE5LCAxMDM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMTksIDExMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI3OSwgMTAzMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNDA4MTYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEAxMDAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTY5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NSwgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCXdpZHRoICAgICAgCTQ2OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMDAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTY5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzUsIDE2NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODUiIEAxMDA0DQotCQkJCWxvY2F0aW9uICAgCSgxMzUxLCAxODQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E1MDExMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODYiIEAxMDA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMDQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjk3LCAyMjQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTcwM0I0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMDQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDAzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM1MSwgMTg0MCkNCi0JCQkJCSAgICAoMTI5NCwgMTg0MCkNCi0JCQkJCSAgICAoMTI5NCwgMTc1MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTEsIDE4NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NCwgMTc1MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwMDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAwNA0KLQkJCQkJbG9jYXRpb24gICAJKC0yOTcsIDIyNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNywgMTgwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzMjY1Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E3MDNDOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDA0DQotCQkJCQlzdXBwbGllciAgIAlAMTAwMw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNTEsIDE4NDApDQotCQkJCQkgICAgKDE0MDksIDE4NDApDQotCQkJCQkgICAgKDE0MDksIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDksIDE3NTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjEsIDE4MDEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzI4NDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjkiIEAxMDA5DQotCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAxNDMyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDA2RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIgQDEwMTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAwOQ0KLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDE1MjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDQ5NzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAzMTgiDQotCQkJCQljbGllbnQgICAgIAlAMTAwOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MCwgMTQzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxNjQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAxNTI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDU0NTQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MCIgQDEwMTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAwOQ0KLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDksIDEyNjYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAzMEUiDQotCQkJCQljbGllbnQgICAgIAlAMTAwOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDk5Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkwLCAxNDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTAsIDEyMjMpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODciIEAxMDE1DQotCQkJCWxvY2F0aW9uICAgCSgxNjkwLCAxNjg0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNUFEMDM3NCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmYWNldENvbnRlbnRzIiBAMTAxNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNiwgLTEyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk1LCAxNzMxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZhY2V0Q29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMzIwNTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNUFGMDAxMCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDE1DQotCQkJCQlzdXBwbGllciAgIAlAMTAwMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxNjg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NDYsIDE2ODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDE4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDE2NDQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJOTQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA3MzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4OCIgQDEwMTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAxNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjYsIC0xMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2NiwgMTY0MykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNUFGMDAwNiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDE1DQotCQkJCQlzdXBwbGllciAgIAlAMTAwMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxNjg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MzQsIDE2ODQpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAMTAyMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2MjQsIDc4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM4OCwgNzQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIg0KLQkJCQl3aWR0aCAgICAgIAk0OTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEAxMDIyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMzIwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTA4LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiDQotCQkJCXdpZHRoICAgICAgCTQyNg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDEwMjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDMyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1NywgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2NyIgQDEwMjQNCi0JCQkJbG9jYXRpb24gICAJKDk2MywgMzE5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTZCMDAzRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwMjUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAyNA0KLQkJCQkJbG9jYXRpb24gICAJKDU5NSwgLTE3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzQsIDM2MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4MTA4MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkMwMTExIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwMjQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MywgMzE5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTksIDMxOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxNiwgMjkwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk2Mzk2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjgiIEAxMDI4DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjQNCi0JCQkJCWxvY2F0aW9uICAgCSg1OTUsIC0xNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU1LCAzNjEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QzAxMDciDQotCQkJCQljbGllbnQgICAgIAlAMTAyNA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMjMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYzLCAzMTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODI4LCAzMTkpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDEwMzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA5OTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzQsIDk0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwMzENCi0JCQkJbG9jYXRpb24gICAJKDIzMjIsIDE1OTMpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEwMzANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjMyMiwgMTU5MykNCi0JCQkJICAgICgyMzIyLCAxMDQ3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMzINCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTAzMw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NiwgOTA1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDYwMDAwDQotCQkJCSAgICBoZWlnaHQgICAgIAk1DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRjUwMTNBIg0KLQkJCQljbGllbnQgICAgIAlAMTAzMA0KLQkJCQlzdXBwbGllciAgIAlAOTY2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTUwLCA5MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTUwLCA4NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDk2NykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDEwMzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MzIsIDU3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgNTMyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTY2Mg0KLQkJCQloZWlnaHQgICAgIAkxMTINCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExMyIgQDEwMzUNCi0JCQkJbG9jYXRpb24gICAJKDE0OTgsIDE0MzEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTQwMUFGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFub255bW91c1R5cGVEZWZpbml0aW9uIiBAMTAzNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDM1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzOCwgLTE4MTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMjcsIDE0NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQzODkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MTE1MDAxNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMDM1DQotCQkJCQlzdXBwbGllciAgIAlAMTAzMA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0OTgsIDE0MzEpDQotCQkJCQkgICAgKDIyODEsIDE0MzEpDQotCQkJCQkgICAgKDIyODEsIDEwNDcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCAxNDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyODEsIDEwNDcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDM4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyMDQsIDEzOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDU0MTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNCIgQDEwMzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAzNQ0KLQkJCQkJbG9jYXRpb24gICAJKDEwMzgsIC0xODEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDkwLCA4NjYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTYiDQotCQkJCQljbGllbnQgICAgIAlAMTAzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMzQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDk4LCAxNDMxKQ0KLQkJCQkJICAgICgxMTMxLCAxNDMxKQ0KLQkJCQkJICAgICgxMTMxLCA2MzIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCAxNDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMzEsIDYzMikpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDEwNDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4NDgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NTUsIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNDA0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBAMTA0Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgODk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA1LCA4NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTYwOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNyIgQDEwNDMNCi0JCQkJbG9jYXRpb24gICAJKDUzNCwgNzM2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzM0VGMDE2MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDEwNDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0Mw0KLQkJCQkJbG9jYXRpb24gICAJKDg2LCAtMjE0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIwLCA3NDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMTExMTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTkiDQotCQkJCQljbGllbnQgICAgIAlAMTA0Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNDINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTM0LCA3MzYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTM0LCA4NDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU5NSwgODA3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjc1OTI2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTgiIEAxMDQ3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDMNCi0JCQkJCWxvY2F0aW9uICAgCSg4NiwgLTIxNDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgNjUzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDM0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUzNCwgNzM2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNCwgNjMyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM3IiBAMTA0OQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTAwLCAxMDMyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNEMDAzRSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzZWxlY3RvciIgQDEwNTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0OQ0KLQkJCQkJbG9jYXRpb24gICAJKDg0LCAxMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTMsIDEwNDIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2VsZWN0b3IiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMjMyODgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMzQiDQotCQkJCQljbGllbnQgICAgIAlAMTA0OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNDENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTAwLCAxMDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMCwgMTExMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAxMDQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDk1ODkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzgiIEAxMDUzDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDkNCi0JCQkJCWxvY2F0aW9uICAgCSg4NCwgMTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDk2OCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIyQSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDQ5DQotCQkJCQlzdXBwbGllciAgIAlAMTA0Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDAsIDEwMzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAwLCA5NTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzkiIEAxMDU1DQotCQkJCWxvY2F0aW9uICAgCSg3MDAsIDEwMzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZpZWxkcyIgQDEwNTYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA1NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTYsIDEyMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE2LCAxMDM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1NDc5NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcwMCwgMTAzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDAsIDExMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3MSwgMTA0MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEyMzA3Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQwIiBAMTA1OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTksIDk2OCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM2NSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDU1DQotCQkJCQlzdXBwbGllciAgIAlAMTA0Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDAsIDEwMzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAwLCA5NTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEAxMDYxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzUyLCAxNDQwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDAsIDEzOTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJd2lkdGggICAgICAJNTIyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTA2Mg0KLQkJCQlsb2NhdGlvbiAgIAkoNTUwLCAxNTkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDYxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDU1MCwgMTU5MCkNCi0JCQkJICAgICg1NTAsIDE0OTUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDEwNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCA1NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNDAsIDUzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5Ig0KLQkJCQl3aWR0aCAgICAgIAk1NDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMDY0DQotCQkJCWxvY2F0aW9uICAgCSgxNDA2LCA3NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEwNjMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTQwNiwgNzY1KQ0KLQkJCQkgICAgKDE0MDYsIDYzMSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAMTA2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NTYsIDE2OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzkzLCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTU0NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk1IiBAMTA2Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTYxNCwgMTg2OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZGRERENzAxMTMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTYiIEAxMDY3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjYNCi0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZGREREQTAyNkIiDQotCQkJCQljbGllbnQgICAgIAlAMTA2Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjE0LCAxODY4KQ0KLQkJCQkJICAgICgyNTAwLCAxODY4KQ0KLQkJCQkJICAgICgyNTAwLCAxNzUxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxNCwgMTg2OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAwLCAxNzUxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDY4DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjYNCi0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODk2LCAxNzg3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk4NzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkZERERBMDI3NSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDY2DQotCQkJCQlzdXBwbGllciAgIAlAMTA2MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MTQsIDE4NjgpDQotCQkJCQkgICAgKDk4NCwgMTg2OCkNCi0JCQkJCSAgICAoOTg0LCAxNDk1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxNCwgMTg2OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODQsIDE0OTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDE4MjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzEyODYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAxIiBAMTA3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjkyNywgMzg3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk4RTM2MDM4NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVDb250ZW50cyIgQDEwNzINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3MQ0KLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTE1LCAzNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlQ29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzMwNjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjk4RTM4MDA3QyINCi0JCQkJCWNsaWVudCAgICAgCUAxMDcxDQotCQkJCQlzdXBwbGllciAgIAlAMTA2Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDI5MjcsIDM4NykNCi0JCQkJCSAgICAoMTc1MCwgMzg3KQ0KLQkJCQkJICAgICgxNzUwLCA1MjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTI3LCAzODcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNTIxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODA0LCA0MjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTcyNDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwMiIgQDEwNzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3MQ0KLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyOTQ2LCAxNDQ4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzgwMDcyIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwNzENCi0JCQkJCXN1cHBsaWVyICAgCUAxMDY1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjkyNywgMzg3KQ0KLQkJCQkJICAgICgyOTg3LCAzODcpDQotCQkJCQkgICAgKDI5ODcsIDE2NzEpDQotCQkJCQkgICAgKDI5MjgsIDE2NzEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTI3LCAzODcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjkyOCwgMTY3MSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEwNzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5OSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3NyIgQDEwNzgNCi0JCQkJbG9jYXRpb24gICAJKDE3NTAsIDg3MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDA0RTAwNjciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAtMjM5MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgNjkxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUxMDM3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNTAwMkE1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDYzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCA2MzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTQsIDY5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNDQ0MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzgiIEAxMDgyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAtMjM5MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcwOSwgMTA2NSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjk0MDUwMDI5QiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDc4DQotCQkJCQlzdXBwbGllciAgIAlAMTA3Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCA4NzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgMTExMykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTA4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI3OSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwOSIgQDEwODUNCi0JCQkJbG9jYXRpb24gICAJKDEyNTIsIDE4OTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDODcwMjQ3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMCIgQDEwODYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA4NQ0KLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4QzAyRjkiDQotCQkJCQljbGllbnQgICAgIAlAMTA4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjUyLCAxODk2KQ0KLQkJCQkJICAgICgyNjAzLCAxODk2KQ0KLQkJCQkJICAgICgyNjAzLCAxNzUxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MiwgMTg5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAzLCAxNzUxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIgQDEwODcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA4NQ0KLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjgyLCAxODU4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM4MTE0Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDOEMwMzAzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI1MiwgMTg5NikNCi0JCQkJCSAgICAoNDI4LCAxODk2KQ0KLQkJCQkJICAgICg0MjgsIDEyMjMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUyLCAxODk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQyOCwgMTIyMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgyLCAxODYwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTc1MDMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgxIiBAMTA5MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5OSwgMTMyMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzMjAyMjAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODIiIEAxMDkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTANCi0JCQkJCWxvY2F0aW9uICAgCSg2NTUsIDcxMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEMiDQotCQkJCQljbGllbnQgICAgIAlAMTA5MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNzcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTk5LCAxMzIxKQ0KLQkJCQkJICAgICgxODk3LCAxMzIxKQ0KLQkJCQkJICAgICgxODk3LCAxMjIzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5OSwgMTMyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk3LCAxMjIzKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIgQDEwOTINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA5MA0KLQkJCQkJbG9jYXRpb24gICAJKDY1NSwgNzEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTcsIDEyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5NTY5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEQiDQotCQkJCQljbGllbnQgICAgIAlAMTA5MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTk5LCAxMzIxKQ0KLQkJCQkJICAgICg1MDAsIDEzMjEpDQotCQkJCQkgICAgKDUwMCwgMTIyMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTksIDEzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTAwLCAxMjIzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDEyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODIzMDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDk1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlAMTA2NQ0KLQkJCQlzdXBwbGllciAgIAlAMTAzMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwNiwgMTY0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDYsIDE1OTMpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwMzEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwOTYNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTA5Nw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU5LCA0OTUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjQzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDY0MjkNCi0JCQkJICAgIGhlaWdodCAgICAgCTYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiDQotCQkJCWNsaWVudCAgICAgCUAxMDM0DQotCQkJCXN1cHBsaWVyICAgCUA5NzMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MywgNTIwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUzLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDk3NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA5OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDEwMDMNCi0JCQkJc3VwcGxpZXIgICAJQDEwMzANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MDksIDE2NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA5LCAxNTkzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDMxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDk5DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMDANCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgMTU5MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk4MDM5Mg0KLQkJCQkgICAgaGVpZ2h0ICAgICAJMzg1DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGNTUwMzJCIg0KLQkJCQljbGllbnQgICAgIAlAMTAwMw0KLQkJCQlzdXBwbGllciAgIAlAMTA2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE0NCwgMTY0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDQsIDE1OTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEwNjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMDENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEE2NDAyNzkiDQotCQkJCWNsaWVudCAgICAgCUA5NzYNCi0JCQkJc3VwcGxpZXIgICAJQDk3Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2LCA1MjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjYsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTc0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTEwMg0KLQkJCQlsb2NhdGlvbiAgIAkoNDMxLCAyMjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDk4OQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0MzEsIDIyMikNCi0JCQkJICAgICg0MzEsIDEzMCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTAzDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMDQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2MSwgMjI0KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzNw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTc2NzQ0DQotCQkJCSAgICBoZWlnaHQgICAgIAk4Ng0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjQ0MDA2OSINCi0JCQkJY2xpZW50ICAgICAJQDk3Mw0KLQkJCQlzdXBwbGllciAgIAlAOTg5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzUsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3NSwgMjIyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTAyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTEwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMwOSwgNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDIyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEzMDksIDQ2NSkNCi0JCQkJICAgICgxMzA5LCAzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEwNg0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTA3DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDEsIDQ5NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NDI4Ng0KLQkJCQkgICAgaGVpZ2h0ICAgICAJMTANCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2NjAzMzkiDQotCQkJCWNsaWVudCAgICAgCUAxMDM0DQotCQkJCXN1cHBsaWVyICAgCUAxMDIyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzEsIDUyMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzMSwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTA4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4RkMwMUU3Ig0KLQkJCQljbGllbnQgICAgIAlAOTgzDQotCQkJCXN1cHBsaWVyICAgCUAxMDYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTAsIDE2NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAsIDE1OTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEwNjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMDkNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTExMA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIwNSwgNDkzKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTU4MzMzDQotCQkJCSAgICBoZWlnaHQgICAgIAk4DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjEwM0JFIg0KLQkJCQljbGllbnQgICAgIAlAOTk2DQotCQkJCXN1cHBsaWVyICAgCUAxMDIyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTExDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMTINCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTEsIDkwNSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0ODk4MA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNzMNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJFQjAyQTgiDQotCQkJCWNsaWVudCAgICAgCUAxMDc3DQotCQkJCXN1cHBsaWVyICAgCUA5NjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NzgsIDExMTMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODc4LCA4NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDk2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExMw0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE0DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQyLCA4MDcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkzMTANCi0JCQkJICAgIGhlaWdodCAgICAgCTYxDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwM0EwMjIxIg0KLQkJCQljbGllbnQgICAgIAlAMTA3Nw0KLQkJCQlzdXBwbGllciAgIAlAMTA2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMywgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDMsIDc2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA2NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExNQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE2DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzU0LCA4MDEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDANCi0JCQkJICAgIGhlaWdodCAgICAgCTcwDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3MzcwMzhGIg0KLQkJCQljbGllbnQgICAgIAlAOTk1DQotCQkJCXN1cHBsaWVyICAgCUAxMDYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjg0LCA4MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjg0LCA3NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwNjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiDQotCQkJCWNsaWVudCAgICAgCUA5NjUNCi0JCQkJc3VwcGxpZXIgICAJQDEwMjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyODQsIDc2MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNzksIDc2MikpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiDQotCQkJCWNsaWVudCAgICAgCUA5NjQNCi0JCQkJc3VwcGxpZXIgICAJQDEwMjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDUyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDEwMjENCi0JCQkJc3VwcGxpZXIgICAJQDk2NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzNywgNzI5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgNjMxKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkIzMDFENSINCi0JCQkJY2xpZW50ICAgICAJQDk2Ng0KLQkJCQlzdXBwbGllciAgIAlAMTAyMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk1MCwgNTIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk1MCwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTIxDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMjINCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI4MjEsIDg5NykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxODENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4NzcxOQ0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNzYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU0RjAyM0MiDQotCQkJCWNsaWVudCAgICAgCUA5NjMNCi0JCQkJc3VwcGxpZXIgICAJQDEwMjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4OTYsIDkzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4OTYsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyMw0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI0DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzEzLCA5MDQpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTA2MjINCi0JCQkJICAgIGhlaWdodCAgICAgCTY4DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRTIwMzgxIg0KLQkJCQljbGllbnQgICAgIAlAOTc1DQotCQkJCXN1cHBsaWVyICAgCUA5NjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzODEsIDExMDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzgxLCA4NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDk2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyNQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI2DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyODc4LCAyNjkpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDY2NjcNCi0JCQkJICAgIGhlaWdodCAgICAgCTY2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyNTUwMzg1Ig0KLQkJCQljbGllbnQgICAgIAlAOTc1DQotCQkJCXN1cHBsaWVyICAgCUA5ODkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5NDMsIDExMDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTQzLCAyMjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiDQotCQkJCWNsaWVudCAgICAgCUAxMDg0DQotCQkJCXN1cHBsaWVyICAgCUA5NzMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ2MiwgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ2MiwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzQpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOS4gQ29uY3JldGUgU2NoZW1hIENvbXBvc2l0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUI3QTAzOEMiDQotCQkJdGl0bGUgICAgICAJIjkuIENvbmNyZXRlIFNjaGVtYSBDb21wb3NpdGlvbiINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTEyOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTUzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDkzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE5IiBAMTEyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI4LCAxNjk1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0MUU2MDI1MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjAiIEAxMTMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDExMjkNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDc2LCAtMzg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcsIDE2MjMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDFFQTAyRjciDQotCQkJCQljbGllbnQgICAgIAlAMTEyOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExMjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMjgsIDE2OTUpDQotCQkJCQkgICAgKDE3NSwgMTY5NSkNCi0JCQkJCSAgICAoMTc1LCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4LCAxNjk1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NSwgMTU5MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiIgQDExMzINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyOQ0KLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTMzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMyOSwgMTc0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjkyNDUyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMzBCIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMjkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTI4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjI4LCAxNjk1KQ0KLQkJCQkJICAgICgyODEsIDE2OTUpDQotCQkJCQkgICAgKDI4MSwgMTU5MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOCwgMTY5NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODEsIDE1OTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTM0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOSwgMTY0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNTcxNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDExMzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxNTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzkwLCAxNDkzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTE4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTUiIEAxMTM2DQotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE2OTgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDUwMzk4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NiIgQDExMzcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEzNg0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjg4LCAtMzE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NjAsIDE2MjMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0OTAzOEEiDQotCQkJCQljbGllbnQgICAgIAlAMTEzNg0KLQkJCQkJc3VwcGxpZXIgICAJQDExMzUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5NTIsIDE2OTgpDQotCQkJCQkgICAgKDkwMSwgMTY5OCkNCi0JCQkJCSAgICAoOTAxLCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNjk4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMSwgMTU5MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTEzOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTM2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjAsIDE3MzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjMyNjkyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzlFIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMzYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTM1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTUyLCAxNjk4KQ0KLQkJCQkJICAgICgxMDA0LCAxNjk4KQ0KLQkJCQkJICAgICgxMDA0LCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNjk4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDQsIDE1OTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgMTY0OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAMTE0Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgOTkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjAsIDk0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJd2lkdGggICAgICAJNDkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEAxMTQzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCA3ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxMiwgNzM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTQ3NQ0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTE0NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgNDE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ2LCAyODUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNDA2DQotCQkJCWhlaWdodCAgICAgCTI4Nw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTkiIEAxMTQ1DQotCQkJCWxvY2F0aW9uICAgCSgxMzAzLCA2NzkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMEMwM0RCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFNjaGVtYSIgQDExNDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC00MSwgLTg1NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1OSwgMzgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwMDM4NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExNDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTMwMywgNjc5KQ0KLQkJCQkJICAgICgxMzAzLCA0MTkpDQotCQkJCQkgICAgKDg0MywgNDE5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwMywgNjc5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNDE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjIsIDQ1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MDc0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIwIiBAMTE0OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTQ1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ1LCA5NTYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDQiDQotCQkJCQljbGllbnQgICAgIAlAMTE0NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzAzLCA2NzkpDQotCQkJCQkgICAgKDEzMDMsIDk5NykNCi0JCQkJCSAgICAoOTAxLCA5OTcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzAzLCA2NzkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAxLCA5OTcpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTciIEAxMTUxDQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCA2NDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkU2NoZW1hIiBAMTE1Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTUxDQotCQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAtMTM5OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzOCwgNTAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjAxOTIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDMiDQotCQkJCQljbGllbnQgICAgIAlAMTE1MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjE2LCA2NDkpDQotCQkJCQkgICAgKDEyMTYsIDUzNCkNCi0JCQkJCSAgICAoODQzLCA1MzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA1MzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTUyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkyNiwgNTc3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODMxNjQzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTgiIEAxMTU1DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNTENCi0JCQkJCWxvY2F0aW9uICAgCSgzMzYsIC0xMzk5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzQsIDc1NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTUxDQotCQkJCQlzdXBwbGllciAgIAlAMTE0Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMTYsIDY0OSkNCi0JCQkJCSAgICAoMTIxNiwgNzk3KQ0KLQkJCQkJICAgICg4NzcsIDc5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTYsIDY0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDc5NykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyMyIgQDExNTcNCi0JCQkJbG9jYXRpb24gICAJKDY2MiwgNjQyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVEM0E2MDEzMSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiIEAxMTU4DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjM0LCAxMTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTU4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgNjc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jaW5nRGlyZWN0aXZlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQwODc1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIxNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVEM0E5MDM3MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTU3DQotCQkJCQlzdXBwbGllciAgIAlAMTE0Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjIsIDcyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE1LCA2NzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzA2NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyNCIgQDExNjENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE1Nw0KLQkJCQkJbG9jYXRpb24gICAJKC0yMzQsIDExNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIxLCA1NzYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzAiDQotCQkJCQljbGllbnQgICAgIAlAMTE1Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYyLCA2NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYyLCA1NTkpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjUiIEAxMTYzDQotCQkJCWxvY2F0aW9uICAgCSg3NSwgMTg4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVFQ0YwMDA1RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjYiIEAxMTY0DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAtMzA4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFQ0Y0MDAxRSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTYzDQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc1LCAxODgpDQotCQkJCQkgICAgKDc1LCAxMjgpDQotCQkJCQkgICAgKDUxMCwgMTI4KQ0KLQkJCQkJICAgICg1MTAsIDI3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAxODgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCAyNzMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFZlcnNpb24iIEAxMTY1DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAtMzA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDc0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RWZXJzaW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjU5Mzc1MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFQ0Y0MDAyOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMTYzDQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc1LCAxODgpDQotCQkJCQkgICAgKDc1LCAzODApDQotCQkJCQkgICAgKDQzNywgMzgwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDE4OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDM4MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzY4LCAzMjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzQ3NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI3IiBAMTE2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMTM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVFRDBCMDExQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjgiIEAxMTY5DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNjgNCi0JCQkJCWxvY2F0aW9uICAgCSgzMzQsIC0zNjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTIxIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2MiwgMTM0KQ0KLQkJCQkJICAgICg3NjYsIDEzNCkNCi0JCQkJCSAgICAoNzY2LCAyNzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAxMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzY2LCAyNzMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JpZ2luYWxWZXJzaW9uIiBAMTE3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTY4DQotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTY0LCA5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitvcmlnaW5hbFZlcnNpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNjUwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwRjAxMkIiDQotCQkJCQljbGllbnQgICAgIAlAMTE2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYyLCAxMzQpDQotCQkJCQkgICAgKDEzMjIsIDEzNCkNCi0JCQkJCSAgICAoMTMyMiwgMzM0KQ0KLQkJCQkJICAgICg4NDMsIDMzNCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDMzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTgxMDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI5IiBAMTE3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2LCA2NTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVFQUIwMDFGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzMCIgQDExNzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3Mw0KLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMEIiDQotCQkJCQljbGllbnQgICAgIAlAMTE3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYsIDY1NikNCi0JCQkJCSAgICAoNTEzLCA2NTYpDQotCQkJCQkgICAgKDUxMywgNTU5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2LCA2NTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEzLCA1NTkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiIEAxMTc1DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtODM0LCAxNjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgNDMxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFZlcnNpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzOTAyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMTUiDQotCQkJCQljbGllbnQgICAgIAlAMTE3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYsIDY1NikNCi0JCQkJCSAgICAoNjYsIDY1NikNCi0JCQkJCSAgICAoNjYsIDQ3MikNCi0JCQkJCSAgICAoNDM3LCA0NzIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYsIDY1NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDQ3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzU2LCA1MjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Njg0NjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMzIiBAMTE3OA0KLQkJCQlsb2NhdGlvbiAgIAkoNjQyLCAxMjYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzMwMTk0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzNCIgQDExNzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3OA0KLQkJCQkJbG9jYXRpb24gICAJKDgyLCAtNDE4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc4NDc1MDFGMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTc4DQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDY0MiwgMTI2KQ0KLQkJCQkJICAgICg1ODgsIDEyNikNCi0JCQkJCSAgICAoNTg4LCAyNzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODgsIDI3MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWFGb3JTY2hlbWEiIEAxMTgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzgNCi0JCQkJCWxvY2F0aW9uICAgCSg4MiwgLTQxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM5LCA3NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWFGb3JTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU1NTU2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3NTAxRkIiDQotCQkJCQljbGllbnQgICAgIAlAMTE3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2NDIsIDEyNikNCi0JCQkJCSAgICAoNjk3LCAxMjYpDQotCQkJCQkgICAgKDY5NywgMjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjQyLCAxMjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjk3LCAyNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0MywgMjEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAxODYzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE4Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDExNDINCi0JCQkJc3VwcGxpZXIgICAJQDExNDMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzOCwgOTM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM4LCA4NDMpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMTg0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcsIDExNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0OTINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDczIiBAMTE4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCAxMzQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0MjZCMDE5NCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3NCIgQDExODYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAsIDEyNzEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2RDAzMDkiDQotCQkJCQljbGllbnQgICAgIAlAMTE4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQsIDEzNDApDQotCQkJCQkgICAgKDE4MSwgMTM0MCkNCi0JCQkJCSAgICAoMTgxLCAxMjM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MSwgMTIzOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTE4OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxMCwgLTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzMywgMTM4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuODY3OTI1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2RDAzMTMiDQotCQkJCQljbGllbnQgICAgIAlAMTE4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQsIDEzNDApDQotCQkJCQkgICAgKDI4NywgMTM0MCkNCi0JCQkJCSAgICAoMjg3LCAxMjM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NywgMTIzOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCAxMjk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQyOTQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTE5MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NjAsIDE0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTcsIDEwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUwNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEAxMTkyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcxMiwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk5LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAkyNDQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNyIgQDExOTMNCi0JCQkJbG9jYXRpb24gICAJKDE2NjgsIDI4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRTAxQ0MiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA4IiBAMTE5NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkzDQotCQkJCQlsb2NhdGlvbiAgIAkoOCwgLTE1MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRjAxMEYiDQotCQkJCQljbGllbnQgICAgIAlAMTE5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDExOTENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjgsIDE5OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNGYWNldHMiIEAxMTk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTMNCi0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUyLCAzMDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljRmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjQ2MTU0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTFBIg0KLQkJCQkJY2xpZW50ICAgICAJQDExOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTkyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjgsIDI4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY4LCAzNjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjUsIDMwMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjkyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDExOTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDI2LCA5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDExOTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA2NDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE1LCA1OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNTQwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDkiIEAxMjAwDQotCQkJCWxvY2F0aW9uICAgCSgxNTA4LCA3OTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDMwMjhFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxMCIgQDEyMDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRjMiDQotCQkJCQljbGllbnQgICAgIAlAMTIwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDExOTkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwOCwgNzkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDgsIDY5NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNQYXJ0aWNsZSIgQDEyMDINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgNzY3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY1BhcnRpY2xlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI1OTI1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE4Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEQ0MDJGRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjAwDQotCQkJCQlzdXBwbGllciAgIAlAMTE5OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwOCwgODg5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDU0LCA4MjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTUwNjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTIwNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTYsIDExNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4NSIgQDEyMDYNCi0JCQkJbG9jYXRpb24gICAJKDkxOSwgMTM0OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI1RTAxRjkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODYiIEAxMjA3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyNSwgMTI3MykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjYyMDA0NiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjA2DQotCQkJCQlzdXBwbGllciAgIAlAMTIwNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkxOSwgMTM0OSkNCi0JCQkJCSAgICAoODY2LCAxMzQ5KQ0KLQkJCQkJICAgICg4NjYsIDEyMzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxMjM5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTIwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjA2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTIzMywgLTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5OTMsIDEzOTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4zNzczNTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjYyMDA1MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjA2DQotCQkJCQlzdXBwbGllciAgIAlAMTIwNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkxOSwgMTM0OSkNCi0JCQkJCSAgICAoOTczLCAxMzQ5KQ0KLQkJCQkJICAgICg5NzMsIDEyMzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTczLCAxMjM5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MTksIDEyOTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDE0OTI1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTIxMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NTIsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTYsIDkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzExIiBAMTIxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMjAyNSwgNzkyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQ5MDFGNiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTIiIEAxMjE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTMNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0REEwMjg0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTk5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMjUsIDc5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA2OTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjE1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTMNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjYsIDgzOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4ODA5NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIwMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNERBMDI4RSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjEzDQotCQkJCQlzdXBwbGllciAgIAlAMTIxMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyNSwgODg5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDk4LCA4NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYxNzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEzIiBAMTIxOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTc1NCwgMTE3OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRDNjhGRjAxQkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzE0IiBAMTIxOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjE4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE5OCwgMjM0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjE4DQotCQkJCQlzdXBwbGllciAgIAlAMTIwNQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDEsIDExNzgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjIwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEyNjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNjMzNTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjE4DQotCQkJCQlzdXBwbGllciAgIAlAMTIxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3NTQsIDExNzgpDQotCQkJCQkgICAgKDIwMjgsIDExNzgpDQotCQkJCQkgICAgKDIwMjgsIDk5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTQsIDExNzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyOCwgOTk5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgyLCAxMDk4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzgzNjY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIxMC4gRGlhZ25vc3RpY3MiDQotCQkJcXVpZCAgICAgICAJIjNCRkU1RjA4MDNFMiINCi0JCQl0aXRsZSAgICAgIAkiMTAuIERpYWdub3N0aWNzIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Ob2RlIiBAMTIyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMTAyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCA5OTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NTm9kZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgOTQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3Ig0KLQkJCQl3aWR0aCAgICAgIAk2ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWNTZXZlcml0eSIgQDEyMjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCA2NTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTgsIDU0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA0OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2OEE3MDMyRiINCi0JCQkJd2lkdGggICAgICAJNDYyDQotCQkJCWhlaWdodCAgICAgCTM0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMjI1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTksIDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg5NiwgMTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NDAsIDYyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcxMw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJd2lkdGggICAgICAJNzMxDQotCQkJCWhlaWdodCAgICAgCTEyNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIiBAMTIyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgNjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQsIDQwMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJd2lkdGggICAgICAJNjU4DQotCQkJCWhlaWdodCAgICAgCTQzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTUiIEAxMjI4DQotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDI4MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMTAzNUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE2IiBAMTIyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwODgsIC02NjEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzIwMUM2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMTc2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFsbERpYWdub3N0aWNzIiBAMTIzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwODgsIC02NjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwOSwgMzMwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2FsbERpYWdub3N0aWNzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ4NTk4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzIwMUM3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMzkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgMzI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNTYxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxMSIgQDEyMzMNCi0JCQkJbG9jYXRpb24gICAJKDEwMjgsIDQ0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyNzAzQ0QiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjEyIiBAMTIzNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjMzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTM5NiwgLTcyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjMzDQotCQkJCQlzdXBwbGllciAgIAlAMTIyNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI4LCA0NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzEzLCA0NDApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcG9uZW50cyIgQDEyMzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIzMw0KLQkJCQkJbG9jYXRpb24gICAJKC0zOTYsIC03MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM4LCAyMzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29tcG9uZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyOTE4MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2QyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjMzDQotCQkJCQlzdXBwbGllciAgIAlAMTIyNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwMjgsIDQ0MCkNCi0JCQkJCSAgICAoMTA4OCwgNDQwKQ0KLQkJCQkJICAgICgxMDg4LCAxNzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI4LCA0NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4OCwgMTc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAyMzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjM4NDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEzIiBAMTIzOA0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAyODIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNjkwMTY1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxNCIgQDEyMzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIzOA0KLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjYiDQotCQkJCQljbGllbnQgICAgIAlAMTIzOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCAyODIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjg4LCAxNzQpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGlhZ25vc3RpY3MiIEAxMjQwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNjAsIC0yNzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMiwgMzMwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2RpYWdub3N0aWNzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDUyNjMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNkEwMDI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgMjgyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMzkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDUsIDMzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5NDczNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNDMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRDMEY0QzAxQTEiDQotCQkJCWNsaWVudCAgICAgCUAxMjI3DQotCQkJCXN1cHBsaWVyICAgCUAxMjI2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzUsIDM5MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTc0KSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIxMS4gU3VwcGxlbWVudGFsIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4N0U0OTAxOUIiDQotCQkJdGl0bGUgICAgICAJIjExLiBTdXBwbGVtZW50YWwiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyNDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NjQsIDgxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA3NjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJODUyDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyNDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTEyLCA4ODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzMxLCA4MjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk3ODANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAMTI0Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDExMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJd2lkdGggICAgICAJNDk4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIiBAMTI0Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzg0LCAxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMjM2LCA2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzciIEAxMjQ4DQotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCA4NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNTAxMzciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWFyeUNvbXBvbmVudCIgQDEyNDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI0OA0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTAsIC01MDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1NiwgMTE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3ByaW1hcnlDb21wb25lbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDA4MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MkM3MDExMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjQ4DQotCQkJCQlzdXBwbGllciAgIAlAMTI0Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCA4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzcsIDg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjQsIDU1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk3MjYwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzgiIEAxMjUyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDU4LCAxMjYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNzAxMTIiDQotCQkJCQljbGllbnQgICAgIAlAMTI0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNDcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyNywgODQpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMjU0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNjAsIDY4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDYwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3OCwgNjY3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzIyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIDogYm9vbGVhbiINCi0JCQkJCSIrIGNpcmN1bGFyIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk3ODINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTI1NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAxMDcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCA5OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgMTA1MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMw0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGZhY2V0TmFtZSA6IFN0cmluZyINCi0JCQkJCSIrIGVmZmVjdGl2ZVZhbHVlIDogVmFsdWUiKSkNCi0JCQkJd2lkdGggICAgICAJNDU4DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEyNTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCA2MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgNTY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTgwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA2MjgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjkNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBtb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJODIwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDEyNTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgMjg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCAxNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNSwgMjE3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzU2DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgYWxpYXNOYW1lIDogU3RyaW5nIg0KLQkJCQkJIisgdVJJIDogU3RyaW5nIg0KLQkJCQkJIisgYWxpYXNVUkkgOiBTdHJpbmciDQotCQkJCQkiKyBxTmFtZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0NzINCi0JCQkJaGVpZ2h0ICAgICAJMjg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAMTI1OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMzUyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgMjk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTYyDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMjU5DQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDUxMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTI1OA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgzMjAsIDUxMCkNCi0JCQkJICAgICgzMjAsIDQyMCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjYwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQljbGllbnQgICAgIAlAMTI1Ng0KLQkJCQlzdXBwbGllciAgIAlAMTI1OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODEsIDU1NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxLCA1MTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEyNTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNjENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiDQotCQkJCWNsaWVudCAgICAgCUAxMjQ0DQotCQkJCXN1cHBsaWVyICAgCUAxMjU4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NzcsIDc0OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg3NywgNTEwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjU5KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEAxMjYyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDE4MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAxLCAxNzYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEluY2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSINCi0JCQkJd2lkdGggICAgICAJNDU2DQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDEyNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxNzc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE3MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5Ig0KLQkJCQl3aWR0aCAgICAgIAk0OTMNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBAMTI2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDE5MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTg4OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5FeGNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiDQotCQkJCXdpZHRoICAgICAgCTQ5Mw0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiIEAxMjY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDE5NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDczLCAxOTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiINCi0JCQkJd2lkdGggICAgICAJNDgwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IiBAMTI2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNCwgMTM3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQkJd2lkdGggICAgICAJNDIyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RCb3VuZGVkRmFjZXQiIEAxMjY3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEyNjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTYzLCAxMjEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREJvdW5kZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiDQotCQkJCXdpZHRoICAgICAgCTM5Ng0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0IiBAMTI2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDEzOTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MywgMTM0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4Ig0KLQkJCQl3aWR0aCAgICAgIAkzODANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIgQDEyNjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxMjMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDksIDExNzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETnVtZXJpY0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQkJd2lkdGggICAgICAJNDAwDQotCQkJCWhlaWdodCAgICAgCTEzMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIgQDEyNzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTYxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNSwgMTUzNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM1LCAxNTk1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgaW5jbHVzaXZlIDogYm9vbGVhbiINCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJNDIwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiIEAxMjcxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDIyODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMjM2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCXdpZHRoICAgICAgCTQ1NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIgQDEyNzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMwNCwgMjYyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzQsIDI1NzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERnJhY3Rpb25EaWdpdHNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJCXdpZHRoICAgICAgCTQ3OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IiBAMTI3Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzY4LCAyMTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE5NiwgMjA3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXR0ZXJuRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQl3aWR0aCAgICAgIAkzNjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiIEAxMjc0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMjA5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCAyMDQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCQl3aWR0aCAgICAgIAk0NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IiBAMTI3NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDIyNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMjIyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCXdpZHRoICAgICAgCTM1OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiIEAxMjc2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTU4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDE1MDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDE1NjMpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBpbmNsdXNpdmUgOiBib29sZWFuIg0KLQkJCQkJIisgZXhjbHVzaXZlIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0MjINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IiBAMTI3Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyNDY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjExMSwgMjQxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJCXdpZHRoICAgICAgCTQzNg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiIEAxMjc4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMjQ0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM5LCAyMzk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkxlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQkJd2lkdGggICAgICAJNDIwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IiBAMTI3OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI2MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMjU1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJd2lkdGggICAgICAJNDIyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMjgwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY2NywgMTEwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk1NDANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMTI4MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDEwNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MCwgMTAyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMjgyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDEzMDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzY0KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgdmFsaWRGYWNldHMgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNTk0DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDkiIEAxMjgzDQotCQkJCWxvY2F0aW9uICAgCSgxNDQ2LCAxMjE4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBOTk0MDMwQSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxMjg0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODMNCi0JCQkJCWxvY2F0aW9uICAgCSg1ODIsIC03OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyODUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4MCwgMTE3MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMy4yNjgyOTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBOTk3MDBERCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjgzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0NDYsIDEyMTgpDQotCQkJCQkgICAgKDE0ODcsIDEyMTgpDQotCQkJCQkgICAgKDE0ODcsIDEyOTIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDEyOTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzksIDEyNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTg0MjExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTAiIEAxMjg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODMNCi0JCQkJCWxvY2F0aW9uICAgCSg1ODIsIC03OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTk5NzAwRTciDQotCQkJCQljbGllbnQgICAgIAlAMTI4Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDQ2LCAxMjE4KQ0KLQkJCQkJICAgICgxNDA1LCAxMjE4KQ0KLQkJCQkJICAgICgxNDA1LCAxMjkyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0NiwgMTIxOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA1LCAxMjkyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUzIiBAMTI4OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTczMywgMTU3NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RDAyNTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU0IiBAMTI4OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjg4DQotCQkJCQlsb2NhdGlvbiAgIAkoOTE3LCA3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDhFMDA5MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjg4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3MzMsIDE1NzUpDQotCQkJCQkgICAgKDE0ODcsIDE1NzUpDQotCQkJCQkgICAgKDE0ODcsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RmFjZXQiIEAxMjkwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODgNCi0JCQkJCWxvY2F0aW9uICAgCSg5MTcsIDcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTEsIDE1NDEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDYyNDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDhFMDA5QiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjg4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE1NzUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDIsIDE1MzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODkxNTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU1IiBAMTI5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4NywgMTc5MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQjAzOTYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU2IiBAMTI5NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjkzDQotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUMwM0M5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU4NywgMTc5MykNCi0JCQkJCSAgICAoMTQ0NywgMTc5MykNCi0JCQkJCSAgICAoMTQ0NywgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODcsIDE3OTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhJbmNsdXNpdmVGYWNldCIgQDEyOTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI5Mw0KLQkJCQkJbG9jYXRpb24gICAJKDcwNywgLTMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxNzUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjk4NDQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzRDQiDQotCQkJCQljbGllbnQgICAgIAlAMTI5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4NywgMTc5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkyLCAxNzkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIwLCAxNzU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU5MTU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1NyIgQDEyOTgNCi0JCQkJbG9jYXRpb24gICAJKDkzNywgMTc4NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBRjAzMzgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU4IiBAMTI5OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjk4DQotCQkJCQlsb2NhdGlvbiAgIAkoNjE3LCAtNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMDAxRjkiDQotCQkJCQljbGllbnQgICAgIAlAMTI5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5MzcsIDE3ODcpDQotCQkJCQkgICAgKDk5NywgMTc4NykNCi0JCQkJCSAgICAoOTk3LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTM3LCAxNzg3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5JbmNsdXNpdmVGYWNldCIgQDEzMDANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI5OA0KLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5MiwgMTc0NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5JbmNsdXNpdmVGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0NjA2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMjAzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyOTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjYzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE3ODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NSwgMTc0MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2Mzk2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTkiIEAxMzAzDQotCQkJCWxvY2F0aW9uICAgCSg5ODEsIDE5MzcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjMwMjA3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2MCIgQDEzMDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMwMw0KLQkJCQkJbG9jYXRpb24gICAJKDY3NywgLTc5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI0MDE5MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzAzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDk4MSwgMTkzNykNCi0JCQkJCSAgICAoMTA0MSwgMTkzNykNCi0JCQkJCSAgICAoMTA0MSwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQxLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkV4Y2x1c2l2ZUZhY2V0IiBAMTMwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzAzDQotCQkJCQlsb2NhdGlvbiAgIAkoNjc3LCAtNzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzA2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMywgMTkwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0MTI1Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjQwMTlBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE5MzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4OSwgMTg5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NjY1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjEiIEAxMzA4DQotCQkJCWxvY2F0aW9uICAgCSgxNDY5LCAxOTUzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEI2MDI4RCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjIiIEAxMzA5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMDgNCi0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNzAyMTciDQotCQkJCQljbGllbnQgICAgIAlAMTMwOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDY5LCAxOTUzKQ0KLQkJCQkJICAgICgxNDAwLCAxOTUzKQ0KLQkJCQkJICAgICgxNDAwLCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OSwgMTk1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDAwLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEV4Y2x1c2l2ZUZhY2V0IiBAMTMxMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzA4DQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCAtOTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDYsIDE5MTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yOTgwOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIyMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzA4DQotCQkJCQlzdXBwbGllciAgIAlAMTI2NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY5LCAxOTUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjQsIDE5NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NjEsIDE5MTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjcyMzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYzIiBAMTMxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjE4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAwNTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY0IiBAMTMxNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzEzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxOCwgNjI4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDI0NiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzEzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibGVuZ3RoRmFjZXQiIEAxMzE1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzE4LCA2MjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNCwgMjIwNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitsZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3NTQ3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkMwMjUwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTEyMiwgMjE4MCkNCi0JCQkJCSAgICAoMTEyMiwgMjI0MCkNCi0JCQkJCSAgICAoMzg3LCAyMjQwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjE4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIyNDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MSwgMjIwNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NTU5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjciIEAxMzE4DQotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAxOTg5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEMyMDIxRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjgiIEAxMzE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzE4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZW51bWVyYXRpb25GYWNldHMiIEAxMzIwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzcsIDIwMTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZW51bWVyYXRpb25GYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjU4NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzE4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwODQsIDE5ODkpDQotCQkJCQkgICAgKDEwODQsIDIwNDkpDQotCQkJCQkgICAgKDQ4NSwgMjA0OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDE5ODkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMDQ5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODMsIDIwMjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTEyOTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY5IiBAMTMyMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1MSwgMjA3NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNTAxNTkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjcwIiBAMTMyNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzIzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MjUsIDUzOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNjAwQjAiDQotCQkJCQljbGllbnQgICAgIAlAMTMyMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDUxLCAyMDc0KQ0KLQkJCQkJICAgICgxMzYyLCAyMDc0KQ0KLQkJCQkJICAgICgxMzYyLCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1MSwgMjA3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhdHRlcm5GYWNldHMiIEAxMzI1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzIwLCAyMDM4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhdHRlcm5GYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNjcyMjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCQSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzIzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDUxLCAyMDc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxODcsIDIwNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzIsIDIwMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDg2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcxIiBAMTMyOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNywgMTQwMCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDODAyQTciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjcyIiBAMTMyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzI4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNDksIC00NzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzkwMUVBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyOSwgMTQwMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjYXJkaW5hbGl0eUZhY2V0IiBAMTMzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzI4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNDksIC00NzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NDcsIDEzNTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY2FyZGluYWxpdHlGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3MTczMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzkwMUY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzMjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgMTQwMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MywgMTM1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MzQyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODEiIEAxMzMzDQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDEzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMERCMDM3NyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODIiIEAxMzM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzg2LCAzMDEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREMwMzVBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0MTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2MiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTMzNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTc4NiwgMzAxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA4LCAyNTU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzczOTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERDMDM2NCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzMzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNjIsIDI0MTMpDQotCQkJCQkgICAgKDEyNjIsIDI1OTYpDQotCQkJCQkgICAgKDIwNjUsIDI1OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDEzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjUsIDI1OTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzksIDI1NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4ODYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg1IiBAMTMzOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTg0MSwgMTMwNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFMzAwRDkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg2IiBAMTMzOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzM4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMzUsIC03OTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTQwMzhFIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyOSwgMTMwNikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJib3VuZGVkRmFjZXQiIEAxMzQwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEzNSwgLTc5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzMiwgMTI3MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitib3VuZGVkRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDMxNzQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFNDAzOTgiDQotCQkJCQljbGllbnQgICAgIAlAMTMzOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg0MSwgMTMwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTU0LCAxMzA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc3LCAxMjc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU0NzE3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2NSIgQDEzNDMNCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIxODYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkYwMThDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2NiIgQDEzNDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0Mw0KLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNkIiDQotCQkJCQljbGllbnQgICAgIAlAMTM0Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjE4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIndoaXRlU3BhY2VGYWNldCIgQDEzNDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0Mw0KLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MywgMjIwNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit3aGl0ZVNwYWNlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTA5MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMwMDA3NSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzMjgsIDIxODYpDQotCQkJCQkgICAgKDEzMjgsIDIyNDYpDQotCQkJCQkgICAgKDIwOTMsIDIyNDYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMTg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDIyNDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMzMsIDIyMDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY3NjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgzIiBAMTM0OA0KLQkJCQlsb2NhdGlvbiAgIAkoNjc0LCAxMzkwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMERGMDA0OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODQiIEAxMzQ5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTg1NCwgLTcwNikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQjkiDQotCQkJCQljbGllbnQgICAgIAlAMTM0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjc0LCAxMzkwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzNSwgMTM5MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJvcmRlcmVkRmFjZXQiIEAxMzUwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTg1NCwgLTcwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU4LCAxMzUzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK29yZGVyZWRGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MTUzOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwM0MzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY3NCwgMTM5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEzOTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgMTM1NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNDYxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzMiIEAxMzUzDQotCQkJCWxvY2F0aW9uICAgCSg2ODcsIDEyOTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0IwMzlDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3NCIgQDEzNTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMENDMDNEMCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzUzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODcsIDEyOTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMjk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm51bWVyaWNGYWNldCIgQDEzNTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjgsIDEyNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbnVtZXJpY0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgwOTcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDQzAzRDEiDQotCQkJCQljbGllbnQgICAgIAlAMTM1Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0MCwgMTI5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA2LCAxMjYwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2ODQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4NyIgQDEzNTgNCi0JCQkJbG9jYXRpb24gICAJKDE2ODksIDE2NjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDQwMUVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4OCIgQDEzNTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xODMsIC0zNTQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDUwMzYwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTY4OSwgMTY2MikNCi0JCQkJCSAgICAoMTQ4NywgMTY2MikNCi0JCQkJCSAgICAoMTQ4NywgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2ODksIDE2NjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhGYWNldCIgQDEzNjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xODMsIC0zNTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NjksIDE2MjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWF4RmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODIwNTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNDQ1MDM2QSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzU4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjg5LCAxNjYyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE2NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDQsIDE2MjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTUzODUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg5IiBAMTM2Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjI1OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU0RjAxNDUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkwIiBAMTM2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzYzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NTAwMzhDIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIyNTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiIEAxMzY1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTQ2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NSwgMjI4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDg1NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNTUwMDM5NiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzYzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzMjgsIDIyNTgpDQotCQkJCQkgICAgKDEzMjgsIDIzMjQpDQotCQkJCQkgICAgKDIwOTMsIDIzMjQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMjU4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDIzMjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzY3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzY1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDksIDIyOTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg4MTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkxIiBAMTM2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI5NywgMjM2NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNDAxMUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkyIiBAMTM2OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzY4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYwNywgLTcyMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMEQiDQotCQkJCQljbGllbnQgICAgIAlAMTM2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0IiBAMTM3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzY4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYwNywgLTcyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1NywgMjQ2MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUyNjkwNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzUwMjE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI5NywgMjM2NikNCi0JCQkJCSAgICAoMTI5NywgMjQ5OSkNCi0JCQkJCSAgICAoMjEwMiwgMjQ5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzNjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQ5OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwNywgMjQ3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTMwOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTMiIEAxMzczDQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDQ5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCNjJBMDBBQSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTQiIEAxMzc0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxMzgiDQotCQkJCQljbGllbnQgICAgIAlAMTM3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQ0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxMzc1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgMjYzNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTg1MzE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxNDIiDQotCQkJCQljbGllbnQgICAgIAlAMTM3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYyLCAyNDQ5KQ0KLQkJCQkJICAgICgxMjYyLCAyNjY4KQ0KLQkJCQkJICAgICgyMDY1LCAyNjY4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQ0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNjY4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTg5LCAyNjI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI2NDg1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5NSIgQDEzNzgNCi0JCQkJbG9jYXRpb24gICAJKDE0MjIsIDIxNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjAwM0E2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5NiIgQDEzNzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3OA0KLQkJCQkJbG9jYXRpb24gICAJKC03NzAsIC0xMzEzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzc4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0MjIsIDIxNTkpDQotCQkJCQkgICAgKDEzNjIsIDIxNTkpDQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlUGF0dGVybkZhY2V0IiBAMTM4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjcsIDIxMjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlUGF0dGVybkZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk5MDkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMTAzMTIiDQotCQkJCQljbGllbnQgICAgIAlAMTM3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyMiwgMjE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMTE5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5MjI2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5NyIgQDEzODMNCi0JCQkJbG9jYXRpb24gICAJKDEwODQsIDIwODMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0EwMjZCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5OCIgQDEzODQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM4Mw0KLQkJCQkJbG9jYXRpb24gICAJKDgyOCwgLTEzNzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTg2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzODMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IiBAMTM4NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzgzDQotCQkJCQlsb2NhdGlvbiAgIAkoODI4LCAtMTM3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAyMTAxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40ODg2MTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCN0NCMDE5MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzgzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwODQsIDIwODMpDQotCQkJCQkgICAgKDEwODQsIDIxNDMpDQotCQkJCQkgICAgKDQ4NSwgMjE0MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMTQzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzEsIDIxMDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MzE3MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAzIiBAMTM4OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjI0MSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAwNTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA0IiBAMTM4OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg4DQotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtNDc5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOERDMDNCOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzg4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMjQxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiIEAxMzkwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODgNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVMZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5MTczMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0MzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzODgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTEyMiwgMjI0MSkNCi0JCQkJCSAgICAoMTEyMiwgMjMxOCkNCi0JCQkJCSAgICAoMzg3LCAyMzE4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIzMTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MCwgMjI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODU2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTEiIEAxMzkzDQotCQkJCWxvY2F0aW9uICAgCSg3NzMsIDE1NjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODUwMjVCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1MiIgQDEzOTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5Mw0KLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjcwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzczLCAxNTY1KQ0KLQkJCQkJICAgICg5NTksIDE1NjUpDQotCQkJCQkgICAgKDk1OSwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluRmFjZXQiIEAxMzk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTMNCi0JCQkJCWxvY2F0aW9uICAgCSg0NjksIDEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTMsIDE1MzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjMwOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDg2MDI3QSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzkzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDE1NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAxNTY1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDE1MjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzA1IiBAMTM5OA0KLQkJCQlsb2NhdGlvbiAgIAkoODE2LCAxNjUwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCOTcwMDFEQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDYiIEAxMzk5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTgNCi0JCQkJCWxvY2F0aW9uICAgCSg0OTYsIC0zMzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzEwMENGIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzOTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoODE2LCAxNjUwKQ0KLQkJCQkJICAgICg5NTksIDE2NTApDQotCQkJCQkgICAgKDk1OSwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWluRmFjZXQiIEAxNDAwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTgNCi0JCQkJCWxvY2F0aW9uICAgCSg0OTYsIC0zMzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc2NCwgMTYxNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5GYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE0MTYxOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzEwMEQ5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzOTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDE2NTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyMywgMTYwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMjc0MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzUiIEAxNDAzDQotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzIxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENGMDE5OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzYiIEAxNDA0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzE5LCA0OTcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDg1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhMZW5ndGhGYWNldCIgQDE0MDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwMw0KLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgMjM4MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhMZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3MjI1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDhGIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI5NywgMjMyMSkNCi0JCQkJCSAgICAoMTI5NywgMjQwOSkNCi0JCQkJCSAgICAoMjEwMiwgMjQwOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NCwgMjM2NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3OTIwOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzciIEAxNDA4DQotCQkJCWxvY2F0aW9uICAgCSgxMTU5LCAyMjczKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ1MDBDNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzgiIEAxNDA5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDFEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNTksIDIyNzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE1OSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5MZW5ndGhGYWNldCIgQDE0MTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwOA0KLQkJCQkJbG9jYXRpb24gICAJKC0yODEsIDQ0OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU3LCAyMzcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkxlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE5NTI3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENjAwMjciDQotCQkJCQljbGllbnQgICAgIAlAMTQwOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTU5LCAyMjczKQ0KLQkJCQkJICAgICgxMTU5LCAyNDA5KQ0KLQkJCQkJICAgICg0NTAsIDI0MDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTU5LCAyMjczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MCwgMjQwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAyMzY5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzNjEwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwMSIgQDE0MTMNCi0JCQkJbG9jYXRpb24gICAJKDExOTcsIDIzMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTgwMTZEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwMiIgQDE0MTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQxMw0KLQkJCQkJbG9jYXRpb24gICAJKDk0MSwgLTYxMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5OTAwNTYiDQotCQkJCQljbGllbnQgICAgIAlAMTQxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0IiBAMTQxNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEzDQotCQkJCQlsb2NhdGlvbiAgIAkoOTQxLCAtNjEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTYsIDI0NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTI2MDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODk5MDA2MCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDEzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExOTcsIDIzMzQpDQotCQkJCQkgICAgKDExOTcsIDI0OTMpDQotCQkJCQkgICAgKDQ1MCwgMjQ5MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDIzMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCAyNDkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjcsIDI0NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTYwNDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk5IiBAMTQxOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjQzOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MDAwNjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAwIiBAMTQxOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDE4DQotCQkJCQlsb2NhdGlvbiAgIAkoODYzLCAtNzQ2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAxRCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDE4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCIgQDE0MjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQxOA0KLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAyNjMyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTcwMzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAyNyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDE4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMzEsIDI0MzgpDQotCQkJCQkgICAgKDEyMzEsIDI2NjgpDQotCQkJCQkgICAgKDQ1MSwgMjY2OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDI0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNjY4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDI2MzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTg4MTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc5IiBAMTQyMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjM5NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAwREUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgwIiBAMTQyNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDIzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTIwOSwgMjUzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNDRCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDIzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyMzk3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidG90YWxEaWdpdHNGYWNldCIgQDE0MjUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyMw0KLQkJCQkJbG9jYXRpb24gICAJKC0yMDksIDI1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODUzLCAyNTUwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3RvdGFsRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODU1NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNENyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDIzDQotCQkJCQlzdXBwbGllciAgIAlAMTI3OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMzEsIDIzOTcpDQotCQkJCQkgICAgKDEyMzEsIDI1ODcpDQotCQkJCQkgICAgKDQ1MSwgMjU4NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDIzOTcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNTg3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzUsIDI1NjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTQ2NDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxNDI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgNzY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDE5LCA1NzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDQNCi0JCQkJaGVpZ2h0ICAgICAJNDEzDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0MjkNCi0JCQkJbG9jYXRpb24gICAJKDEyMDksIDEwNjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTIwOSwgMTA2NSkNCi0JCQkJICAgICgxMjA5LCA5NzQpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzNSIgQDE0MzANCi0JCQkJbG9jYXRpb24gICAJKDEwOTAsIDEwMzEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjUwM0Q5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlRGVmaW5pdGlvbiIgQDE0MzENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzMA0KLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4OTcsIDEwMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA5ODc2NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE5NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDAzQyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDMwDQotCQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDk3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMSwgMTAzNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjE3MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzNiIgQDE0MzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzMA0KLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDA0NiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDMwDQotCQkJCQlzdXBwbGllciAgIAlAMTI4MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDEwODgpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDEiIEAxNDM1DQotCQkJCWxvY2F0aW9uICAgCSgxNTM4LCA4NzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE2REIwMUU1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlIiBAMTQzNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTc4LCAxMDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDM2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTgsIDc5MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43NjA4NzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNkREMDNERCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDM1DQotCQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDg3MykNCi0JCQkJCSAgICAoMTUzOCwgOTE5KQ0KLQkJCQkJICAgICgxNDU0LCA5MTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA4NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgOTE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTA5LCA4NzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMTY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0MiIgQDE0MzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzNQ0KLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNkREMDNERSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDM1DQotCQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDg3MykNCi0JCQkJCSAgICAoMTUzOCwgODI4KQ0KLQkJCQkJICAgICgxNDU0LCA4MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA4NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgODI4KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQzIiBAMTQ0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzNSwgNjg0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBNzEyMDEwOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZSIgQDE0NDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0MA0KLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA1OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuOTc3MjczDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxNDAxNTEiDQotCQkJCQljbGllbnQgICAgIAlAMTQ0MA0KLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM1LCA2ODQpDQotCQkJCQkgICAgKDE1MzUsIDcyOCkNCi0JCQkJCSAgICAoMTQ1NCwgNzI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzNSwgNjg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDcyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwNiwgNjgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNzc3OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQ0IiBAMTQ0NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQwDQotCQkJCQlsb2NhdGlvbiAgIAkoMTc1LCAtODQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTVCIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NDANCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzNSwgNjg0KQ0KLQkJCQkJICAgICgxNTM1LCA2NDEpDQotCQkJCQkgICAgKDE0NTQsIDY0MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzUsIDY4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA2NDEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDciIEAxNDQ1DQotCQkJCWxvY2F0aW9uICAgCSg2MTMsIDk0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdFRDAzQzAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcGxleFR5cGUiIEAxNDQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ2NSwgOTgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBsZXhUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzczMDU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdGNDAxMTciDQotCQkJCQljbGllbnQgICAgIAlAMTQ0NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2MTMsIDk0MCkNCi0JCQkJCSAgICAoMjg0LCA5NDApDQotCQkJCQkgICAgKDI4NCwgMTAwOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYxMywgOTQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NCwgMTAwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI0LCA5NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDkzMjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0OCIgQDE0NDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC03NDcsIDE3MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdGNDAxMjEiDQotCQkJCQljbGllbnQgICAgIAlAMTQ0NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMCwgOTQwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDUwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQljbGllbnQgICAgIAlAMTQyOA0KLQkJCQlzdXBwbGllciAgIAlAMTI1OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExMiwgNTYyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExMiwgNTEwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDUxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlAMTI4MA0KLQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE0NiwgMTA4OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDYsIDEwNjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE0MjkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDUiIEAxNDUyDQotCQkJCWxvY2F0aW9uICAgCSgxMzYyLCAxMTMzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBNzRCMDE3OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlIiBAMTQ1Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDUyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5OSwgMTA5NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI0Njc1Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE3QiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDUyDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDEyOTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDU1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjEsIDEwOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjI3MjczDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDYiIEAxNDU2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTINCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU4LCAtMTYzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE4NSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDUyDQotCQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDk3NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEAxNDU3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNzIsIDM4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwMiwgMzAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwMiwgMzYzKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZ2xvYmFsIDogYm9vbGVhbiINCi0JCQkJCSIrIGZlYXR1cmVSZWZlcmVuY2UgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTQ1OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjI2MiwgNTY4KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxNDU3DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDIyNjIsIDU2OCkNCi0JCQkJICAgICgyMjYyLCA0NzcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ1OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJY2xpZW50ICAgICAJQDEyNTQNCi0JCQkJc3VwcGxpZXIgICAJQDE0NTcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDU5NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNDYsIDU2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ1OCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzOSIgQDE0NjANCi0JCQkJbG9jYXRpb24gICAJKDE1NTMsIDQ1MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMjAxQTQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZSIgQDE0NjENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2MA0KLQkJCQkJbG9jYXRpb24gICAJKDgwMSwgMjkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzMxLCA0OTkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwNjI2Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjMwMkU1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0NjANCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU1MywgNDUzKQ0KLQkJCQkJICAgICgxMjIyLCA0NTMpDQotCQkJCQkgICAgKDEyMjIsIDU2MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIyLCA1NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExODUsIDQ3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjAzMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQwIiBAMTQ2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDYwDQotCQkJCQlsb2NhdGlvbiAgIAkoODAxLCAyOTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjMwMkYwIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NjANCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCA0NTMpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzEiIEAxNDY1DQotCQkJCWxvY2F0aW9uICAgCSgxOTA4LCAzNTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMDYwMkQ3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkRmVhdHVyZSIgQDE0NjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNjgsIC0xNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDY3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjksIDM1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEZlYXR1cmUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI5NDEyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMEIwMDBFIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTkwOCwgMzUzKQ0KLQkJCQkJICAgICgxOTA4LCAzODcpDQotCQkJCQkgICAgKDE5OTMsIDM4NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCAzODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDY4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NDUsIDM1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NjYzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMyIiBAMTQ2OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMTgiDQotCQkJCQljbGllbnQgICAgIAlAMTQ2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NTcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxOTA4LCAzNTMpDQotCQkJCQkgICAgKDE5MDgsIDMxOSkNCi0JCQkJCSAgICAoMTk5MywgMzE5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkwOCwgMzUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDMxOSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDEyNTgNCi0JCQkJc3VwcGxpZXIgICAJQDEyNTcNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDk0LCAyODQpDQotCQkJCSAgICAoNDk0LCAyNDQpDQotCQkJCSAgICAoOTk2LCAyNDQpKQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAyODQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTYsIDI0NCkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCWNsaWVudCAgICAgCUAxMjQ1DQotCQkJCXN1cHBsaWVyICAgCUAxNDU3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzE4LCA4MTIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzE4LCA1NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDE0NTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUAxMjgyDQotCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY1LCAxMjkyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2NSwgMTA2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQyOSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDE0NTcNCi0JCQkJc3VwcGxpZXIgICAJQDEyNTcNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjE0NywgMjkxKQ0KLQkJCQkgICAgKDIxNDcsIDI0NCkNCi0JCQkJICAgICgxNDY4LCAyNDQpKQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE0NywgMjkxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMjQ0KSkpKSkpKQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA3NiINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d3NkbCIgQDE0NzQNCi0JCQlsb2NhdGlvbiAgIAkoMjcyLCAyNTYpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDc0DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjgsIDE3MikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkid3NkbCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNBREZCOEU1MDIxRSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6eHNkIiBAMTQ3NQ0KLQkJCWxvY2F0aW9uICAgCSgyNzIsIDU3NikNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzUNCi0JCQkgICAgbG9jYXRpb24gICAJKDEyOCwgNDkyKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJ4c2QiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzOUFCREM2RjAxQUEiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkNCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyINCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NSINCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA3NyINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMNCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NiINCi0JUHJvY3NORGV2cyAJKGxpc3QNCi0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciDQotCQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDY4Ig0KLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzDQotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2UiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhQmFzZVNldCIgODAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIkFOU0kiDQotCQkJCXZhbHVlICAgICAgCTgwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIk9yYWNsZSINCi0JCQkJdmFsdWUgICAgICAJODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiU1FMU2VydmVyIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJTeWJhc2UiDQotCQkJCXZhbHVlICAgICAgCTgwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIldhdGNvbSINCi0JCQkJdmFsdWUgICAgICAJODA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVl8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJJbmhlcml0U3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSJfViIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQmFzZVZpZXdzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiVkFSQ0hBUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJOdWxsc09LIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImZyYW1ld29yayINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExFbGVtZW50Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExTcGVjaWZpY2F0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIklETFNwZWNTZXQiIDIyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETFNwZWNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlR5cGVkZWYiDQotCQkJCXZhbHVlICAgICAgCTU0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiRW51bWVyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJFeGNlcHRpb24iDQotCQkJCXZhbHVlICAgICAgCTYxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiU3RydWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAk1MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlVuaW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5zZXJ2aWNlcy9zcmMvcm9zZS93c2RsTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUlETE1vZHVsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuc2VydmljZXMvc3JjL3Jvc2Uvd3NkbE1kbC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIlJhaXNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJtXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkic18iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW1wb3J0cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEltcG9ydHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemVkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIl9JRCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIg0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTkwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTE5MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiDQotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQUZURVIiDQotCQkJCXZhbHVlICAgICAgCTE4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiDQotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUk9XIg0KLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCINCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIjYiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJlcG9zaXRvcnkiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5Ig0KLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLnNlcnZpY2VzL3NyYy9yb3NlL3dzZGxNZGwubWRsLCBjdGMsIGlibWN0YyIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuc2VydmljZXMvc3JjL3Jvc2Uvd3NkbE1kbC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgDQotfC8vICRwYWNrYWdlDQotfCNpbmNsdWRlICIkZmlsZSINCi18DQotCQkJKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk9wZXJhdGlvbktpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNFeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmFpc2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkSGFzUmVsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkhhc1JlbFR5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnlJc09uU2VhcmNoTGlzdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiDQotCQkJdmFsdWUgICAgICAJMikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIjUuMCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDbGFzc19GYWN0b3J5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2VyaWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9EQVRBX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJMaWNlbnNlZCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYklEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BJZEVudW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSU5URVJGQUNFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaGVyaXRhbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDT01NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX1BPSU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcGVydHlNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsX092ZXJyaWRlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X0ZpcmluZ19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbWFuZF9QYXJzZXIiDQotCQkJCXZhbHVlICAgICAgCTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9Ob3RpZnlfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTEwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlJbWFnZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiU0NDIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVHlwZUxpYkltcG9ydGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRhYmxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMjEzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjIwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25CYXNlIg0KLQkJCXZhbHVlICAgICAgCSIwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkV4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiQ29tcGFyZVNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkNyZWF0YWJsZVNldCIgMjIxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5pdGlhbGl6YXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVRlcm1pbmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbkNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSJDb2xsZWN0aW9uIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiQmluYXJ5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJUZXh0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJG9wZXJhdGlvbiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5ldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZSRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUxldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5ldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZSRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUxldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjciKSkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL2NvbS5pYm0uZXRvb2xzLldTREwuY2F0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9jb20uaWJtLmV0b29scy5XU0RMLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmYjQ2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL2NvbS5pYm0uZXRvb2xzLldTREwuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsNjk5NyArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTQyDQotICAgIF93cml0dGVuICAgCSJSb3NlIDQuNS44MDU0YSINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3c2RsIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgcXVpZCAgICAgICAJIjNBREZCOEU1MDIxRSINCi0gICAgZG9jdW1lbnRhdGlvbiAJDQotfFRoZSBXU0RMIG1vZGVsIGNvbnRhaW5zIGNsYXNzZXMgZm9yIHRoZSBXZWIgU2VydmljZXMgRGVzY3JpcHRpb24gTGFuZ3VhZ2UgKFdTREwpLg0KLXwNCi18V1NETCBkZXNjcmliZXMgbmV0d29yayBzZXJ2aWNlcyBhcyBzZXRzIG9mIGVuZHBvaW50cyBvcGVyYXRpbmcgb24gbWVzc2FnZXMuIFRoZSBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBhcmUgZGVzY3JpYmVkIGFic3RyYWN0bHksIGFuZCB0aGVuIGJvdW5kIHRvIGEgY29uY3JldGUgbmV0d29yayBwcm90b2NvbCBhbmQgbWVzc2FnZSBmb3JtYXQgdG8gZGVmaW5lIGFuIGVuZHBvaW50Lg0KLXwNCi18V1NETCBkZXNjcmliZXMgdGhlIGZvcm1hdHMgb2YgdGhlIG1lc3NhZ2VzIGV4Y2hhbmdlZCBieSB0aGUgc2VydmljZXMsIGFuZCBzdXBwb3J0cyB0aGUgWE1MIFNjaGVtYXMgc3BlY2lmaWNhdGlvbiBhcyBpdHMgY2Fub25pY2FsIHR5cGUgc3lzdGVtLiBUaGlzIHBhY2thZ2UgdXNlcyBhbiBYTUwgU2NoZW1hIEluZm9zZXQgbW9kZWwgcGFja2FnZSAoc2VlIHRoZSBYU0QgcGFja2FnZSkgdG8gZGVzY3JpYmUgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0cy4NCi18DQotfFRoZSBtb2RlbCBjb250YWlucyB0aGUgZm9sbG93aW5nIGRpYWdyYW1zLCBuYW1lZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBjaGFwdGVycyBpbiB0aGUgV1NETCAxLjEgc3BlY2lmaWNhdGlvbiAoaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9OT1RFLXdzZGwtMjAwMTAzMTUpDQotfC0gMi4xIERlZmluaXRpb24sIHNob3dzIHRoZSBXU0RMIGRlZmluaXRpb24gZWxlbWVudCBhbmQgdGhlIFdTREwgZG9jdW1lbnQgc3RydWN0dXJlDQotfC0gMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nLCBzaG93cyB0aGUgbmFtZXNwYWNlIGFuZCBpbXBvcnQgbWVjaGFuaXNtDQotfC0gMi4xLjMgRXh0ZW5zaWJpbGl0eSwgc2hvd3MgdGhlIFdTREwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc20NCi18LSAyLjIgVHlwZXMsIHNob3dzIHRoZSB1c2Ugb2YgWE1MIFNjaGVtYSB0eXBlcyBpbiBXU0RMDQotfC0gMi4zIE1lc3NhZ2VzLCAyLjQgUG9ydFR5cGVzLCAyLjUgQmluZGluZ3MgYW5kIDIuNyBTZXJ2aWNlcywgc2hvdyB0aGUgbWFqb3IgV1NETCBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zLg0KLXwNCi18VGhlIFdTREwgY2xhc3NlcyBleHRlbmQgdGhlIGphdmF4LndzZGwgaW50ZXJmYWNlcyBkZWZpbmVkIGJ5IEpTUiAxMTAuIENsYXNzZXMgd2l0aCBpbnRlcmZhY2UgYW5kIGRhdGF0eXBlIHN0ZXJlb3R5cGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVzZSBub24tTU9GIGludGVyZmFjZXMuDQotICAgIA0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJXU0RMRWxlbWVudCINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1QzZBMzAyREQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBsYW5ndWFnZSBlbGVtZW50LiINCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQ0QxNTI5NjAwQzgiDQotCQkgICAgcmVzdWx0ICAgICAJIkRlZmluaXRpb24iDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldEVuY2xvc2luZ0RlZmluaXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNDRDE1MkI4MDM0NyINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImRlZmluaXRpb24iDQotCQkJICAgIHR5cGUgICAgICAgCSJEZWZpbml0aW9uIikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudGF0aW9uRWxlbWVudCINCi0JCSAgICBxdWlkICAgICAgIAkiM0NDRTQ0MzYwMkEzIg0KLQkJICAgIHR5cGUgICAgICAgCSJET01FbGVtZW50IikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNGOTdEQkQzMDIwNyINCi0JCSAgICB0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJQb3J0VHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0VHlwZSBlbGVtZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjEgYW5kIGFuIEludGVyZmFjZSBjb21wb25lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMi4gQSBwb3J0IHR5cGUgb3IgSW50ZXJmYWNlIGlzIGEgbmFtZWQgc2V0IG9mIGFic3RyYWN0IG9wZXJhdGlvbnMgYW5kIHRoZSBhYnN0cmFjdCBtZXNzYWdlcyBpbnZvbHZlZC4iDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1QzlCNzAxNTAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRjZGMUZEODAxOUYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQjQ4OEUwMDIzIg0KLQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCRERGMUUzMDFFNSINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOENERUIwMzE2Ig0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRDE4RDRGRDAxQkEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJPcGVyYXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuIEEgV1NETCBvcGVyYXRpb24gaXMgYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYW4gYWN0aW9uIHN1cHBvcnRlZCBieSBhIHNlcnZpY2UuIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFOURFOTgwMDNDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2RjFGRTIwMTcxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVCNDcyNjAxQUMiDQotCQkgICAgdHlwZSAgICAgICAJIk9wZXJhdGlvblR5cGUiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0JERDk2NDMwMDRDIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQkRERjIzNTAwM0UiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkgICAgcXVpZCAgICAgICAJIjNEMThDRTIyMDFBRCINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOEQ1MjAwMTFCIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiTWVzc2FnZSINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBtZXNzYWdlIGVsZW1lbnQuIEEgV1NETCBtZXNzYWdlIGlzIGFuIGFic3RyYWN0LCB0eXBlZCBkZWZpbml0aW9uIG9mIHRoZSBkYXRhIGJlaW5nIGNvbW11bmljYXRlZC4iDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDA1NTAxQzQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QThEMTAyQkEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU1lc3NhZ2UiDQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVCNDg3QzAxRkUiDQotCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCSAgICBxdWlkICAgICAgIAkiM0JEREYxRDIwMjI2Ig0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzRDE4Q0U0QjAyQjAiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNEMThENTQyMDBGMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlBhcnQiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcGFydCBlbGVtZW50LiBQYXJ0cyBkZXNjcmliZSB0aGUgbG9naWNhbCBhYnN0cmFjdCBjb250ZW50IG9mIGEgbWVzc2FnZS4gRWFjaCBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUgZnJvbSBzb21lIHR5cGUgc3lzdGVtLiAiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QTk2RDAyRjEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBOTNGMDFCRSIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5N0UyMzAyMzciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNCQ0U3MEI3MDNDOCINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnROYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QjA4NzAzREIiDQotCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGVOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQkNFNzBDMzAzQzUiDQotCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkJpbmRpbmciDQotCSAgICBxdWlkICAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVGQTBGMDJGMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUI0ODk5MDE0QiINCi0JCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQkRERjFGNDAxQTMiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkgICAgcXVpZCAgICAgICAJIjNEMThDRTZEMDE1MSINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOEQ0REYwMzVDIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiQmluZGluZ09wZXJhdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoaW4gdGhlIGJpbmRpbmcncyBwb3J0VHlwZS4gIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjAwOTIwMkY3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFERTQwMURDIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5QzRDQjAxOTkiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTZXJ2aWNlIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVGQTIwMDI1RSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNCODU5NTRFMDFCNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJU2VydmljZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFCNDkwMjg3IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUI0OEE0MDE1MSINCi0JCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQkRERjIwRDAyMDMiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkgICAgcXVpZCAgICAgICAJIjNEMThENDgxMDIyMCINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOEQ0QzUwMUUyIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiUG9ydCINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0IGVsZW1lbnQuIEEgcG9ydCBkZWZpbmVzIGFuIGluZGl2aWR1YWwgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyBhIHNpbmdsZSBhZGRyZXNzIGZvciBhIGJpbmRpbmciDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MDBDQjAwQUEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg1OTU0NTAyQzkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVEOUEwMDM5MSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gV1NETCBhbGxvd3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRCMTQ5MDNEMCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQkRERjUzNTAyQzMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUY5NTQzQzAwNzMiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudFR5cGUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUIyMUEwMjcxIg0KLQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJEZWZpbml0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIFdTREwgZG9jdW1lbnQuIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUZEQjgwM0Q0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEIxRjgwMzgyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklEZWZpbml0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiKSkNCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudCINCi0JCSAgICBxdWlkICAgICAgIAkiM0NEMTRGQzIwMTJCIg0KLQkJICAgIHJlc3VsdCAgICAgCSJET01Eb2N1bWVudCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDRDE1MERFMDFFNyINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUU0NzQwMDRFIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjQwMzUyQjdDMDM5NiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVCNDg1NzAyRjUiDQotCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQ0FERDAwRDAwMEQiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJJbXBvcnQiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBXU0RMIGltcG9ydCBlbGVtZW50LiBXU0RMIGFsbG93cyBhc3NvY2lhdGluZyBhIG5hbWVzcGFjZSB3aXRoIGEgZG9jdW1lbnQgbG9jYXRpb24gdXNpbmcgYW4gaW1wb3J0IGVsZW1lbnQuIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUVFNTgwMzdBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2RjIwMEQwMzQwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklJbXBvcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNCODRCMjAyMDExOSIpKQ0KLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjcyQzEwMzc5Ig0KLQkJICAgIHJlc3VsdCAgICAgCSJYU0RTY2hlbWEiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldFNjaGVtYSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjcyQzEwMzk3Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAic2NoZW1hIg0KLQkJCSAgICB0eXBlICAgICAgIAkiWFNEU2NoZW1hIikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNTBBMDAzNiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTUxNDAyMTEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJFeHRlbnNpYmxlRWxlbWVudCINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiIFdTREwgYWxsb3dzIGVsZW1lbnRzIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHRlY2hub2xvZ3kgKHJlZmVycmVkIHRvIGhlcmUgYXMgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cykgdW5kZXIgdmFyaW91cyBlbGVtZW50cyBkZWZpbmVkIGJ5IFdTREwuIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9pbnQgb2YgZXh0ZW5zaWJpbGl0eS4iDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RkUzQzAzRDQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQ0KLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUMxMkMwM0NEIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODVDMTQ3MDI5NSINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImV4dEVsZW1lbnQiDQotCQkJICAgIHR5cGUgICAgICAgCSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJJbnB1dCINCi0JICAgIHF1aWQgICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50LiBBbiBpbnB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNCODVDNTA0MDI1RiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNGNjc3MjI4MDJFNyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2RjFGRUUwMzFEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1IikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIk91dHB1dCINCi0JICAgIHF1aWQgICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudC4gQW4gb3V0cHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNCODVDNTBDMDM1QiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNGNjc3MjM1MDBERCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2RjFGRjgwMUNEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklPdXRwdXQiDQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJGYXVsdCINCi0JICAgIHF1aWQgICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50LiBGYXVsdCBlbGVtZW50cyBzcGVjaWZ5IHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgYW55IGVycm9yIG1lc3NhZ2VzIHRoYXQgbWF5IGJlIG91dHB1dCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMUM4MjAwMkYyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2NzcyM0QwMzE5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkgICAgcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzRjZGMjAwMjAwMkQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTg2MTAzMUQiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiQmluZGluZ0lucHV0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBRTA4QTgyMDJENCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIGlucHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4gIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFFMUIwMTEzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nSW5wdXQiDQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBREVCMDEwMCIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QjU5QjAwNzIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpKQ0KLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTNBNDAyMDMiDQotCQkgICAgcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0SW5wdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY1M0I1MDNBMiINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiSUlucHV0IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QzFFQTAyMEUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJCaW5kaW5nT3V0cHV0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBRTA4QThGMDI4QyINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4gIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFFNDMwMkFCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUUyMTAxMTEiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUI1QTQwMjdFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkNCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRPdXRwdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY1M0Q5MDBGMSINCi0JCSAgICByZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTNGMTAzMjYiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiDQotCQkJICAgIHR5cGUgICAgICAgCSJJT3V0cHV0IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QzIwMjAwQkUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJCaW5kaW5nRmF1bHQiDQotCSAgICBxdWlkICAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQSBmYXVsdCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZhdWx0IHdpdGggdGhlIHNhbWUgbmFtZS4gIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDkzODYwMkM5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFFNzEwMzMzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nRmF1bHQiDQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCIpKQ0KLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTQxMzAzN0YiDQotCQkgICAgcmVzdWx0ICAgICAJIklGYXVsdCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0RmF1bHQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY1NDIxMDEwOSINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImZhdWx0Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiSUZhdWx0IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QkY5RTAxNEEiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJRTmFtZSINCi0JICAgIHF1aWQgICAgICAgCSIzQUU4RUQyMjAxNDAiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlFOYW1lIGNsYXNzLiBBIFFOYW1lIGlzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIg0KLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODQ5REE5MDAzRCINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIk5hbWVzcGFjZSINCi0JICAgIHF1aWQgICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmFtZXNwYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gYSBXU0RMIGRvY3VtZW50LiINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUEzRDI5MDFCMSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByZWZpeCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQTNEMzIwMjM2Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uVHlwZSINCi0JICAgIHF1aWQgICAgICAgCSIzQUVCNDc4MjAyNEYiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18T05FX1dBWT0xDQotfFJFUVVFU1RfUkVTUE9OU0U9Mg0KLXxTT0xJQ0lUX1JFU1BPTlNFPTMNCi18Tk9USUZJQ0FUSU9OPTQNCi0JICAgIA0KLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uVHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUMzNTMwM0UzIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiSVBvcnRUeXBlIg0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBNUJFMDMzMSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydFR5cGUgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRPcGVyYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk2QUMxMDFDQSINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm9wZXJhdGlvbiINCi0JCQkgICAgdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkJBRjAxQTQiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkJGNzAzMUEiDQotCQkgICAgcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0VHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE2MzIwMDBEIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklPcGVyYXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiM0I4NEE3NzYwMEQxIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRGYXVsdCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTZDNDIwMDY1Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZmF1bHQiDQotCQkJICAgIHR5cGUgICAgICAgCSJJRmF1bHQiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk2QzU5MDI4RiINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCSAgICByZXN1bHQgICAgIAkiSUZhdWx0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdHMiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk2QzcxMDJCMSINCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFyYW1ldGVyT3JkZXJpbmciDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk2QzgxMDFCMCINCi0JCSAgICByZXN1bHQgICAgIAkiSUxpc3QiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldFBhcmFtZXRlck9yZGVyaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkM5OTAzMUQiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJPcmRlciINCi0JCQkgICAgdHlwZSAgICAgICAJIklMaXN0IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTRFNTAxOEQiDQotCQkgICAgcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0SW5wdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY2MkM0MDEwNyINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiSUlucHV0IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjYyRTQwMDk0Ig0KLQkJICAgIHJlc3VsdCAgICAgCSJJT3V0cHV0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY2MkYwMDFEMiINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dCINCi0JCQkgICAgdHlwZSAgICAgICAJIklPdXRwdXQiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QTc5OTAxMkIiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSUlucHV0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBN0VFMDAxNSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NjMzMTAwRUYiDQotCQkgICAgcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NjM0NzAyNzciDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCSAgICB0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW5wdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBODAwMDAzOSINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJT3V0cHV0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBODI5MDI3RCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjY0M0EwMzVEIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjY0NDUwMUM4Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkgICAgdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk91dHB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE4MzkwMUQ1Ig0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklGYXVsdCINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QTg2MTAzMUQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjY0NkEwMEJEIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjY0NzUwMTMxIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkgICAgdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkZhdWx0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QTg3MTAyMDgiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSU1lc3NhZ2UiDQotCSAgICBxdWlkICAgICAgIAkiM0I4NEE4QUYwMDRGIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5NZXNzYWdlIG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRQYXJ0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NzIyNDAyNzMiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJwYXJ0Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiSVBhcnQiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTcyM0QwMjMzIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJUGFydCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydHMiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk3MjU0MDI1RSINCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3JkZXJlZFBhcnRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NzI2MTAyMEQiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJwYXJ0T3JkZXIiDQotCQkJICAgIHR5cGUgICAgICAgCSJJTGlzdCIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuTWVzc2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE4QkMwMjYwIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklQYXJ0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBOTNGMDFCRSINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUGFydCBub24tTU9GIGludGVyZmFjZSINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uQXR0cmlidXRlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzQ2ODg0NTAwNTIiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJ2YWx1ZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkgICAgZXhjZXB0aW9ucyAJIldTRExFeGNlcHRpb24iDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzQ2OEEwMTAxQzMiDQotCQkgICAgcmVzdWx0ICAgICAJIklJdGVyYXRvciINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzQ2OEEyRDAyRDUiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCSAgICByZXN1bHQgICAgIAkiUU5hbWUiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBhcnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBOTUwMDIzMSINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJU2VydmljZSINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QUI0OTAyODciDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlNlcnZpY2Ugbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NUQ1NjAxRDEiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJwb3J0Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiSVBvcnQiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydHMiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk1REEyMDAzNiINCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTVEQjAwMUJDIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJUG9ydCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuU2VydmljZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFCNUIwMDNFIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklQb3J0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBQjgwMDMyNiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydCBub24tTU9GIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY1MUYzMDJCNSINCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmciDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY1MjYzMDJGMiINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciDQotCQkJICAgIHR5cGUgICAgICAgCSJJQmluZGluZyIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUI4QzAwMTYiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSUJpbmRpbmciDQotCSAgICBxdWlkICAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZ09wZXJhdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTVGMTYwMTUzIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ09wZXJhdGlvbiINCi0JCQkgICAgdHlwZSAgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk1RjUwMDA2NiINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3BlcmF0aW9ucyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTVGQTQwMUM1Ig0KLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY1MkE5MDI4NCINCi0JCSAgICByZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRQb3J0VHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjUyQkUwMUE4Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicG9ydFR5cGUiDQotCQkJICAgIHR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFCQ0YwMzAyIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3BlcmF0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBREMwMDA3MiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdGYXVsdCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTYwQkMwMDQxIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0ZhdWx0Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiSUJpbmRpbmdGYXVsdCIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nRmF1bHQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk2MEQ5MDA5RCINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmdGYXVsdCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTYwRkMwMDYxIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY1MzJEMDAxNyINCi0JCSAgICByZXN1bHQgICAgIAkiSU9wZXJhdGlvbiINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0T3BlcmF0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTMzRjAzN0IiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iDQotCQkJICAgIHR5cGUgICAgICAgCSJJT3BlcmF0aW9uIikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdJbnB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjU1MDkwMERBIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nSW5wdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDODY1NTFEMDA3RiINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdJbnB1dCINCi0JCQkgICAgdHlwZSAgICAgICAJIklCaW5kaW5nSW5wdXQiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ091dHB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjU1MzQwMzQ5Ig0KLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ091dHB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjU1NDcwMkE2Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ091dHB1dCINCi0JCQkgICAgdHlwZSAgICAgICAJIklCaW5kaW5nT3V0cHV0IikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRENCMDIxQyINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJQmluZGluZ0lucHV0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBREVCMDEwMCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0lucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nSW5wdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBREZFMDAwRCINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJQmluZGluZ091dHB1dCINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QUUyMTAxMTEiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRTJEMDA1MCINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJQmluZGluZ0ZhdWx0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBRTRGMDBCRCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRTVGMDAyQSINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJET01FbGVtZW50Ig0KLQkgICAgcXVpZCAgICAgICAJIjNCODRBRjMyMDNEQiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRjU2MDI5MiINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCSAgICBxdWlkICAgICAgIAkiM0I4NEIxMjQwMkFCIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEIxMzUwM0QxIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklEZWZpbml0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNCODRCMUQ5MDE0MiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRGVmaW5pdGlvbiBub24tTU9GIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmciDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4OEYxMDM5RCINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciDQotCQkJICAgIHR5cGUgICAgICAgCSJJQmluZGluZyIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRJbXBvcnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4OTQ5MDI1OSINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImltcG9ydERlZiINCi0JCQkgICAgdHlwZSAgICAgICAJIklJbXBvcnQiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkTWVzc2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTg5NkUwMDVFIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkgICAgdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZE5hbWVzcGFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTg5ODQwMDRCIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicHJlZml4Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnRUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5ODlDNTAwNDUiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJwb3J0VHlwZSINCi0JCQkgICAgdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRTZXJ2aWNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5ODlFNDAxRUUiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJzZXJ2aWNlIg0KLQkJCSAgICB0eXBlICAgICAgIAkiSVNlcnZpY2UiKSkNCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ0ZhdWx0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEExNzAzOEMiDQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nRmF1bHQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdJbnB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBMzIwMjg2Ig0KLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3V0cHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEE0NjAxM0IiDQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3BlcmF0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEE1QzAwQjAiDQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5ODlGRTAzN0MiDQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVGYXVsdCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBNzUwMkU3Ig0KLQkJICAgIHJlc3VsdCAgICAgCSJJRmF1bHQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUltcG9ydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBODMwMTRDIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJSW1wb3J0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbnB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBOUQwMzNFIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJSW5wdXQiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU1lc3NhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QUFGMDI1NCINCi0JCSAgICByZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU9wZXJhdGlvbiINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBQzIwM0M0Ig0KLQkJICAgIHJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPdXRwdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QUU4MDBFRCINCi0JCSAgICByZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUGFydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBRjgwMjZEIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJUGFydCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThCMDgwMURBIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJUG9ydCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydFR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QjE1MDM5QiINCi0JCSAgICByZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVTZXJ2aWNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEIzMjAxM0EiDQotCQkgICAgcmVzdWx0ICAgICAJIklTZXJ2aWNlIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEI0MjAwNzUiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEI5MjAzNDEiDQotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QkNEMDA2MCINCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThCRTcwMTQ0Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkgICAgcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEMxNzAxMDciDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCSAgICByZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2VzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEMzRTAwMUQiDQotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThDNjIwMTRCIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicHJlZml4Ig0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThDNzQwMTE1Ig0KLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThDQkUwMDcxIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkgICAgcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OENEQTAxQzYiDQotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFByZWZpeCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThDRkQwMDE3Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThEMjMwMEE4Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkgICAgcmVzdWx0ICAgICAJIklTZXJ2aWNlIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThEM0IwM0NFIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25SZWdpc3RyeSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OUQ1QjgwMTJCIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldEV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg5RDVENzAzQkIiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJleHRlbnNpb25SZWdpc3RyeSINCi0JCQkgICAgdHlwZSAgICAgICAJIklFeHRlbnNpb25SZWdpc3RyeSIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudEJhc2VVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODlENUZFMDIwOCINCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXREb2N1bWVudEJhc2VVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODlENjE4MDMyOCINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50QmFzZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVUeXBlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0NBREQwNTYwMDgwIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJVHlwZXMiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVNlcnZpY2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNDQUREMDdFMDA0QyINCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJICAgIHJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlQmluZGluZyINCi0JCSAgICBxdWlkICAgICAgIAkiM0NBREQwQkEwMzU1Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVQb3J0VHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0NBREQwRDgwMjlBIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkgICAgcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlTWVzc2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0NBREQwRkEwMzA3Ig0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkgICAgcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkNCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRUeXBlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjcwNkYwMzFCIg0KLQkJICAgIHJlc3VsdCAgICAgCSJJVHlwZXMiDQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCSAgICB1aWQgICAgICAgIAkwKQ0KLQkJKG9iamVjdCBPcGVyYXRpb24gInNldFR5cGVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NzA5NTAwRUUiDQotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCShvYmplY3QgUGFyYW1ldGVyICJ0eXBlcyINCi0JCQkgICAgdHlwZSAgICAgICAJIklUeXBlcyIpKQ0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5EZWZpbml0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QjFFNzAyQTEiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSUltcG9ydCINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QjIwMjAxMTkiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkltcG9ydCBub24tTU9GIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW1wb3J0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QjIwQzAyRUEiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSUxpc3QiDQotCSAgICBxdWlkICAgICAgIAkiM0I4NUMwQTIwM0M1Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTGlzdCBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuTGlzdCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUMwQUYwMjk3Ig0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklNYXAiDQotCSAgICBxdWlkICAgICAgIAkiM0I4OTZCMDMwMEQ0Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTWFwIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5NYXAiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODk2QjExMDJCNSINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJJVVJMIg0KLQkgICAgcXVpZCAgICAgICAJIjNCODlENTYzMDI3NCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS5uZXQuVVJMIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubmV0LlVSTCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OUQ1NkUwM0UyIg0KLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCShvYmplY3QgQ2xhc3MgIklFeHRlbnNpb25SZWdpc3RyeSINCi0JICAgIHF1aWQgICAgICAgCSIzQjg5RDU5MzAyQTUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSBpbnRlcmZhY2UuIg0KLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkgICAgcXVpZCAgICAgICAJIjNCODlENTlGMDJFOCINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJUeXBlcyINCi0JICAgIHF1aWQgICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCB0eXBlcyBlbGVtZW50LiBUaGUgdHlwZXMgZWxlbWVudCBlbmNsb3NlcyBkYXRhIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZSBleGNoYW5nZWQgbWVzc2FnZXMuIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0NBRENEM0IwMzgwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0NBRENCQjIwMDUwIikpDQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0NBRENGMzgwM0U2Ig0KLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCINCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJICAgIHVpZCAgICAgICAgCTApDQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0NBRENGN0UwMzAxIg0KLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkgICAgcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkgICAgdWlkICAgICAgICAJMCkpKQ0KLQkob2JqZWN0IENsYXNzICJJSXRlcmF0b3IiDQotCSAgICBxdWlkICAgICAgIAkiM0M0Njg3REEwMTY3Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiINCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkl0ZXJhdG9yIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzQ2ODgwODAwQjkiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiV1NETEV4Y2VwdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzQzQ2ODk2NTAzMTMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkV4Y2VwdGlvbiBjbGFzcy4iDQotCSAgICBzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzQ2ODk3NDAzMTUiDQotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiSVR5cGVzIg0KLQkgICAgcXVpZCAgICAgICAJIjNDQURDQkIyMDA1MCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuVHlwZXMgbm9uLU1PRiBpbnRlcmZhY2UiDQotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuVHlwZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNDQURDQkYxMDE3MyINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCSAgICBxdWlkICAgICAgIAkiM0NCMjRBQzAwMkFFIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0NCMjRBRUMwMUNCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpDQotCShvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkgICAgcXVpZCAgICAgICAJIjNDQzM2MEQ3MDM5QyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNDQzM2MjdGMDBCNyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQ0KLQkob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCINCi0JICAgIHF1aWQgICAgICAgCSIzQ0QxNTAyQzAyM0IiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBub24tTU9GIGludGVyZmFjZS4iDQotCSAgICBzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNDRDE1MDYwMDE4MiINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IENsYXNzICJNZXNzYWdlUmVmZXJlbmNlIg0KLQkgICAgcXVpZCAgICAgICAJIjNGNjc3MURCMDJEQyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNGNzYyQTZBMDMwOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2NzgwQTAwMUFCIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlByb3RlY3RlZCIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRDVDODI0MDE4QyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJwb3J0VHlwZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUM4MjcwMUMzIg0KLQkJICAgIGxhYmVsICAgICAgCSJwb3J0VHlwZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZU9wZXJhdGlvbnMiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVDODI3MDFDRCINCi0JCSAgICBsYWJlbCAgICAgIAkiZU9wZXJhdGlvbnMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRDVDRUJFMDBFMiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNTciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVQYXJ0cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUNFQkYwMDYxIg0KLQkJICAgIGxhYmVsICAgICAgCSJlUGFydHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDM1MjAxMEYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZVBvcnRUeXBlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDM1NDAxNzYiDQotCQkgICAgbGFiZWwgICAgICAJImVQb3J0VHlwZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVEMzU0MDE4MCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUQzRTEwMTc5Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVEM0UyMDIyNSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZUJpbmRpbmdPcGVyYXRpb25zIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDNFMjAyMzkiDQotCQkgICAgbGFiZWwgICAgICAJImVCaW5kaW5nT3BlcmF0aW9ucyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBRDVENDI1MDM4QSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlT3BlcmF0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDQyNjAyRjUiDQotCQkgICAgbGFiZWwgICAgICAJImVPcGVyYXRpb24iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkOCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQ0MjYwMkZGIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOSINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDk0MDAzOTMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZVBvcnRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUMiDQotCQkgICAgbGFiZWwgICAgICAJImVQb3J0cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVEOTQxMDMxRCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMSINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDlCODAxMUYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZUJpbmRpbmciDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVEOUI5MDI0RCINCi0JCSAgICBsYWJlbCAgICAgIAkiZUJpbmRpbmciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDlCOTAyNjEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMyINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RTYwMzAxRTIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNjA0MDBCNyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZU1lc3NhZ2VzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQzEiDQotCQkgICAgbGFiZWwgICAgICAJImVNZXNzYWdlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3MTAxMDQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNjcyMDM0QSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZVBvcnRUeXBlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUU2NzIwMzU0Ig0KLQkJICAgIGxhYmVsICAgICAgCSJlUG9ydFR5cGVzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNyINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3NzAwOTUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3MSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZUJpbmRpbmdzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3ODAzN0IiDQotCQkgICAgbGFiZWwgICAgICAJImVCaW5kaW5ncyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOSINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3QjAzMTEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNjdEMDA3RiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZVNlcnZpY2VzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3RDAwODkiDQotCQkgICAgbGFiZWwgICAgICAJImVTZXJ2aWNlcyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMSINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RkQxMzAwNzkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUZEMTQwMTlEIg0KLQkJICAgIGxhYmVsICAgICAgCSJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMiDQotCSAgICBxdWlkICAgICAgIAkiM0FERjJFNjQwMUY1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVCaW5kaW5nSW5wdXQiDQotCQkgICAgcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MSINCi0JCSAgICBsYWJlbCAgICAgIAkiZUJpbmRpbmdJbnB1dCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQURGMkU2NTAyNTIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUiDQotCSAgICBxdWlkICAgICAgIAkiM0FERjJFQjMwMTYzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVCaW5kaW5nT3V0cHV0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQURGMkVCNDAxM0MiDQotCQkgICAgbGFiZWwgICAgICAJImVCaW5kaW5nT3V0cHV0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQURGMkVCNDAxM0QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjciDQotCSAgICBxdWlkICAgICAgIAkiM0FERjJGOTQwMjREIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVJbnB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjJGOTUwMTkwIg0KLQkJICAgIGxhYmVsICAgICAgCSJlSW5wdXQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQURGMkY5NTAxOUEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOSINCi0JICAgIHF1aWQgICAgICAgCSIzQURGMkZCODAyRjkiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZU91dHB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjJGQjkwMjBBIg0KLQkJICAgIGxhYmVsICAgICAgCSJlT3V0cHV0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAiDQotCQkgICAgcXVpZCAgICAgICAJIjNBREYyRkI5MDIwQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxIg0KLQkgICAgcXVpZCAgICAgICAJIjNBREYzMzE2MDFBNCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlRmF1bHRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQURGMzMxODAzODciDQotCQkgICAgbGFiZWwgICAgICAJImVGYXVsdHMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMiINCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjMzMTgwMzg4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzMiDQotCSAgICBxdWlkICAgICAgIAkiM0FERjM0MDAwM0U1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVCaW5kaW5nRmF1bHRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQURGMzQwMTAzQUEiDQotCQkgICAgbGFiZWwgICAgICAJImVCaW5kaW5nRmF1bHRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQURGMzQwMTAzQUIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzUiDQotCSAgICBxdWlkICAgICAgIAkiM0FFMDkxRjQwMkYzIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVGYXVsdCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZFIg0KLQkJICAgIGxhYmVsICAgICAgCSJlRmF1bHQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNiINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZGIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNyINCi0JICAgIHF1aWQgICAgICAgCSIzQUVBM0Q1NTAwMkQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzgiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUEzRDU2MDMyOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZU5hbWVzcGFjZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUEzRDU2MDMzMiINCi0JCSAgICBsYWJlbCAgICAgIAkiZU5hbWVzcGFjZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzOSINCi0JICAgIHF1aWQgICAgICAgCSIzQUVBM0UzQTAwMkQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZURlZmluaXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUEzRTNDMDFFOCINCi0JCSAgICBsYWJlbCAgICAgIAkiZURlZmluaXRpb24iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVBM0UzQzAxRjIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQxIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRUE0MTJGMDAzNSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlUGFyYW1ldGVyT3JkZXJpbmciDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUE0MTMxMDI1NSINCi0JCSAgICBsYWJlbCAgICAgIAkiZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDIiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUE0MTMxMDI1RiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDMiDQotCSAgICBxdWlkICAgICAgIAkiM0I4NEFEMjQwMEJEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVJbnB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFEMjUwMDgzIg0KLQkJICAgIGxhYmVsICAgICAgCSJlSW5wdXQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFEMjUwMDg0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NSINCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QUQ3OTAwRjIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZU91dHB1dCINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFEN0EwMTREIg0KLQkJICAgIGxhYmVsICAgICAgCSJlT3V0cHV0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ2Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUQ3QTAxNEUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NyINCi0JICAgIHF1aWQgICAgICAgCSIzQjhCMUJFOTAwQzQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iDQotCQkgICAgcXVpZCAgICAgICAJIjNCOEIxQkU5MDMyNyINCi0JCSAgICBsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ4Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjhCMUJFOTAzMzEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0OSINCi0JICAgIHF1aWQgICAgICAgCSIzQjhCMUMxMjAzQjIiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9uIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjhCMUMxNDAwMUMiDQotCQkgICAgbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQjhCMUMxNDAwMjYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MSINCi0JICAgIHF1aWQgICAgICAgCSIzQjhCMURDQzAyRTUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZVNjaGVtYSINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjcwIg0KLQkJICAgIGxhYmVsICAgICAgCSJlU2NoZW1hIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTIiDQotCQkgICAgcXVpZCAgICAgICAJIjNCOEIxRENFMDI3QSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTMiDQotCSAgICBxdWlkICAgICAgIAkiM0I4QkVBMjcwMjlGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImVUeXBlcyINCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QkVBMjkwMzZBIg0KLQkJICAgIGxhYmVsICAgICAgCSJlVHlwZXMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiDQotCQkgICAgcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTUiDQotCSAgICBxdWlkICAgICAgIAkiM0M0NjgyOTMwM0U1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVNZXNzYWdlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzQ2ODI5NjAxMEUiDQotCQkgICAgbGFiZWwgICAgICAJImVNZXNzYWdlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NiINCi0JCSAgICBxdWlkICAgICAgIAkiM0M0NjgyOTYwMTE4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTciDQotCSAgICBxdWlkICAgICAgIAkiM0M4NjRERkYwMkVDIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVJbXBvcnRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NERGRjAyRUQiDQotCQkgICAgbGFiZWwgICAgICAJImVJbXBvcnRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU4Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NERGRjAyRUUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTkiDQotCSAgICBxdWlkICAgICAgIAkiM0NDMzYxNDUwMEYyIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYwIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0QiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJzY2hlbWEiDQotCQkgICAgcXVpZCAgICAgICAJIjNDQzM2MTQ2MDIzRSINCi0JCSAgICBsYWJlbCAgICAgIAkic2NoZW1hIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYxIg0KLQkgICAgcXVpZCAgICAgICAJIjNGNzRFNzg0MDFCMSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlTWVzc2FnZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDBGIg0KLQkJICAgIGxhYmVsICAgICAgCSJlTWVzc2FnZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjIiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNzRFNzg2MDAyMyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYzIg0KLQkgICAgcXVpZCAgICAgICAJIjNGNzg5NkEyMDI2RSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJwYXJlbnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNGNzg5NkE3MDEyQiINCi0JCSAgICBsYWJlbCAgICAgIAkicGFyZW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImNoaWxkcmVuIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkMiDQotCQkgICAgbGFiZWwgICAgICAJImNoaWxkcmVuIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi43IFNlcnZpY2VzIg0KLQkgICAgcXVpZCAgICAgICAJIjM5QUQzRUY2MDEyNyINCi0JICAgIHRpdGxlICAgICAgCSIyLjcgU2VydmljZXMiDQotCSAgICB6b29tICAgICAgIAk5MA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCA4MDApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMTE3MywgNjYwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSUJpbmRpbmciKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxDQotCQkJbG9jYXRpb24gICAJKDExNzMsIDYxMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUwMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSINCi0JCSAgICB3aWR0aCAgICAgIAk1MjANCi0JCSAgICBoZWlnaHQgICAgIAk0MDQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiIEAyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODE2LCA1MjgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoNjg2LCA0ODEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjYwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJUG9ydCIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoNjg2LCA0MzEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUI4MDAzMjYiDQotCQkgICAgd2lkdGggICAgICAJMjc4DQotCQkgICAgaGVpZ2h0ICAgICAJMjE4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklTZXJ2aWNlIiBAMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDAsIDE2MCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgxMjYsIDkwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIyOA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSVNlcnZpY2UiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDEyNiwgNDApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciDQotCQkgICAgd2lkdGggICAgICAJMjQ2DQotCQkgICAgaGVpZ2h0ICAgICAJMjY0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDAsIDUyOCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSg0NCwgMzg5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM5Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCSAgICB3aWR0aCAgICAgIAk0MTANCi0JCSAgICBoZWlnaHQgICAgIAkzMDINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg1OTU0RTAxQjQiDQotCQkgICAgY2xpZW50ICAgICAJQDQNCi0JCSAgICBzdXBwbGllciAgIAlAMw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI0MCwgMzc3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDAsIDI5MikpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEA2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMjY0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2DQotCQkJbG9jYXRpb24gICAJKDEyNDQsIDExMjUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzkyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJICAgIHdpZHRoICAgICAgCTQxMA0KLQkJICAgIGhlaWdodCAgICAgCTMwMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCSAgICBjbGllbnQgICAgIAlANg0KLQkJICAgIHN1cHBsaWVyICAgCUAxDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQzMCwgMTExMykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMCwgMTAwMikpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEA4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4MTYsIDkxMikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAOA0KLQkJCWxvY2F0aW9uICAgCSg2NzUsIDg0MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyODINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlBvcnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkgICAgd2lkdGggICAgICAJMzAwDQotCQkgICAgaGVpZ2h0ICAgICAJMTY4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NTk1NDUwMkM5Ig0KLQkJICAgIGNsaWVudCAgICAgCUA4DQotCQkgICAgc3VwcGxpZXIgICAJQDINCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4MDksIDgyOCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODA5LCA2MzcpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEAxMA0KLQkJICAgIGxvY2F0aW9uICAgCSgzNDMsIDkxNikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDk0MDAzOTMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZVBvcnRzIiBAMTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyMSwgNjQ0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMg0KLQkJCQlQYXJlbnRfVmlldyAJQDExDQotCQkJCWxvY2F0aW9uICAgCSg0MTMsIDk0NSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlUG9ydHMiDQotCQkJCXBjdERpc3QgICAgCTAuMjE4OTc4DQotCQkJCWhlaWdodCAgICAgCTI5DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwDQotCQkJICAgIHN1cHBsaWVyICAgCUA4DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY2NiwgOTE2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMw0KLQkJCQlQYXJlbnRfVmlldyAJQDExDQotCQkJCWxvY2F0aW9uICAgCSg1MzksIDg4MCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNjA4MDAwDQotCQkJCWhlaWdodCAgICAgCTM3DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNA0KLQkJCQlQYXJlbnRfVmlldyAJQDExDQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDk5MCkNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQ2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC4zMjg0NjcNCi0JCQkJaGVpZ2h0ICAgICAJNzQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwIiBAMTUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyMSwgNjQ0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNg0KLQkJCQlQYXJlbnRfVmlldyAJQDE1DQotCQkJCWxvY2F0aW9uICAgCSgyMTYsIDc0NCkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwDQotCQkJICAgIHN1cHBsaWVyICAgCUA0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzQzLCA5MTYpDQotCQkJCSgyNTcsIDkxNikNCi0JCQkJKDI1NywgNjc5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM0MywgOTE2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjU3LCA2NzkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3DQotCQkJCVBhcmVudF9WaWV3IAlAMTUNCi0JCQkJbG9jYXRpb24gICAJKDMwMSwgNzk2KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjYzNzA5Nw0KLQkJCQloZWlnaHQgICAgIAk0NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMSIgQDE4DQotCQkgICAgbG9jYXRpb24gICAJKDg4NiwgMTI3MCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDlCODAxMUYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmciIEAxOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE4DQotCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgNDIyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMA0KLQkJCQlQYXJlbnRfVmlldyAJQDE5DQotCQkJCWxvY2F0aW9uICAgCSgxMTEyLCAxMjM1KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VCaW5kaW5nIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY0ODU3MQ0KLQkJCQloZWlnaHQgICAgIAkzNg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDlCOTAyNEQiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOA0KLQkJCSAgICBzdXBwbGllciAgIAlANg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzNSwgMTI3MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjENCi0JCQkJUGFyZW50X1ZpZXcgCUAxOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3MCwgMTMxMykNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44MTQyODYNCi0JCQkJaGVpZ2h0ICAgICAJNDMNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyIiBAMjINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDQyMikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCQlsb2NhdGlvbiAgIAkoODUyLCAxMTA2KQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuNjg3OTQzDQotCQkJCWhlaWdodCAgICAgCTQwDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOUI5MDI2MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE4DQotCQkJICAgIHN1cHBsaWVyICAgCUA4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoODg2LCAxMjcwKQ0KLQkJCQkoODEyLCAxMjcwKQ0KLQkJCQkoODEyLCA5OTYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEyLCA5OTYpKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNSBCaW5kaW5ncyINCi0JICAgIHF1aWQgICAgICAgCSIzOUFENTEyNzAyNTIiDQotCSAgICB0aXRsZSAgICAgIAkiMi41IEJpbmRpbmdzIg0KLQkgICAgem9vbSAgICAgICAJODUNCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEAyNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMDQsIDI0MCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjQNCi0JCQlsb2NhdGlvbiAgIAkoNzMsIDExNCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklCaW5kaW5nIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjQNCi0JCQlsb2NhdGlvbiAgIAkoNzMsIDY0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJICAgIHdpZHRoICAgICAgCTQ4MA0KLQkJICAgIGhlaWdodCAgICAgCTM3Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiIgQDI1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk3NiwgMzUyKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNQ0KLQkJCWxvY2F0aW9uICAgCSg3ODAsIDEzMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzOTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjUNCi0JCQlsb2NhdGlvbiAgIAkoNzgwLCA4MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM5Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBREMwMDA3MiINCi0JCSAgICB3aWR0aCAgICAgIAk0MTANCi0JCSAgICBoZWlnaHQgICAgIAk1NjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIgQDI2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkyLCAxMzYwKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNg0KLQkJCWxvY2F0aW9uICAgCSg2MiwgMTMzNCkNCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklCaW5kaW5nSW5wdXQiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNg0KLQkJCWxvY2F0aW9uICAgCSg2MiwgMTI4NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI2MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBREVCMDEwMCINCi0JCSAgICB3aWR0aCAgICAgIAkyNzgNCi0JCSAgICBoZWlnaHQgICAgIAkxNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPdXRwdXQiIEAyNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIwOCwgMTY2NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjcNCi0JCQlsb2NhdGlvbiAgIAkoNjEsIDE2MzgpDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjk0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJQmluZGluZ091dHB1dCIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJbG9jYXRpb24gICAJKDYxLCAxNTg4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjk0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFFMjEwMTExIg0KLQkJICAgIHdpZHRoICAgICAgCTMxMg0KLQkJICAgIGhlaWdodCAgICAgCTE3Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0IiBAMjgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOA0KLQkJCWxvY2F0aW9uICAgCSg3MiwgMTk1OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklCaW5kaW5nRmF1bHQiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOA0KLQkJCWxvY2F0aW9uICAgCSg3MiwgMTkwOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCINCi0JCSAgICB3aWR0aCAgICAgIAkyOTANCi0JCSAgICBoZWlnaHQgICAgIAkxNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAyOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgNjI0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCWxvY2F0aW9uICAgCSgxNTY4LCA0ODYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjczDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQb3J0VHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCSAgICB3aWR0aCAgICAgIAk2OTENCi0JCSAgICBoZWlnaHQgICAgIAkzMDENCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEAzMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgMTM2MCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzANCi0JCQlsb2NhdGlvbiAgIAkoMTc1NiwgMTI4MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyOTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklucHV0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJICAgIHdpZHRoICAgICAgCTMxNA0KLQkJICAgIGhlaWdodCAgICAgCTE3OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiIEAzMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgMTY2NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzENCi0JCQlsb2NhdGlvbiAgIAkoMTc1NiwgMTU4NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyOTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk91dHB1dCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCSAgICB3aWR0aCAgICAgIAkzMTQNCi0JCSAgICBoZWlnaHQgICAgIAkxNzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDMyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMDQsIDY4OCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzINCi0JCQlsb2NhdGlvbiAgIAkoOTcsIDUzOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkgICAgd2lkdGggICAgICAJNDMyDQotCQkgICAgaGVpZ2h0ICAgICAJMzIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCSAgICBjbGllbnQgICAgIAlAMzINCi0JCSAgICBzdXBwbGllciAgIAlAMjQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzksIDUyNykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc5LCA0MjgpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMiIEAzNA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDM5LCA3NDIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzNTIwMTBGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVQb3J0VHlwZSIgQDM1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDU3NSwgNTk4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNg0KLQkJCQlQYXJlbnRfVmlldyAJQDM1DQotCQkJCWxvY2F0aW9uICAgCSgxNDQ5LCA3ODEpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIxNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZVBvcnRUeXBlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc4OTI5Mg0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxNzYiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMzksIDc0MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTksIDc0MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ5MiwgNzE2KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3MjE5Mw0KLQkJCQloZWlnaHQgICAgIAkyNw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDM4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDU3NSwgNTk4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM4DQotCQkJCWxvY2F0aW9uICAgCSg3NzYsIDY5NykNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMDgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjUwOTQ0OQ0KLQkJCQloZWlnaHQgICAgIAk0Ng0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxODAiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNA0KLQkJCSAgICBzdXBwbGllciAgIAlAMzINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMzksIDc0MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUyMCwgNzQyKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEA0MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg4OCwgMTAyNCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDANCi0JCQlsb2NhdGlvbiAgIAkoMTY3MiwgODUxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQzMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiT3BlcmF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJICAgIHdpZHRoICAgICAgCTQ1MA0KLQkJICAgIGhlaWdodCAgICAgCTM3MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEA0MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjI0LCAxNDA4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MQ0KLQkJCWxvY2F0aW9uICAgCSg0NzYsIDEyODMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjk2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkgICAgd2lkdGggICAgICAJMzE0DQotCQkgICAgaGVpZ2h0ICAgICAJMjc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDMiIEA0Mg0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjY0LCAxMzU5KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBRDI0MDBCRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEA0Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQyDQotCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgMjg3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NA0KLQkJCQlQYXJlbnRfVmlldyAJQDQzDQotCQkJCWxvY2F0aW9uICAgCSgxNjM3LCAxMzE2KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VJbnB1dCINCi0JCQkJcGN0RGlzdCAgICAJMC43NzUxNDgNCi0JCQkJaGVpZ2h0ICAgICAJNDQNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4NEFEMjUwMDgzIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDINCi0JCQkgICAgc3VwcGxpZXIgICAJQDMwDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTM1OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUNCi0JCQkJUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTY5NCwgMTM5OCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44ODk1NDYNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ0IiBANDYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoOTYsIDI4NykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODQiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Mg0KLQkJCSAgICBzdXBwbGllciAgIAlANDENCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODEsIDEzNTkpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEA0Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTYwLCAxNjY0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0Nw0KLQkJCWxvY2F0aW9uICAgCSg4MTIsIDE1MzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjk2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nT3V0cHV0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIg0KLQkJICAgIHdpZHRoICAgICAgCTMxNA0KLQkJICAgIGhlaWdodCAgICAgCTI3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ1IiBANDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQzMiwgMTY1NCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUQ3OTAwRjIiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDQ5DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDgNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMjAsIDM3NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTANCi0JCQkJUGFyZW50X1ZpZXcgCUA0OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY0NSwgMTYxMikNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlT3V0cHV0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjY3NDc3Mg0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUQ3QTAxNEQiDQotCQkJICAgIGNsaWVudCAgICAgCUA0OA0KLQkJCSAgICBzdXBwbGllciAgIAlAMzENCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxNjU0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDQ5DQotCQkJCWxvY2F0aW9uICAgCSgxNjgxLCAxNjk3KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5MDI3NA0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDYiIEA1Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTIwLCAzNzQpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4NEFEN0EwMTRFIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMyLCAxNjU0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTY1NCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDUzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5OTIsIDEwMDgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDUzDQotCQkJbG9jYXRpb24gICAJKDgxOSwgOTMxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM0Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCSAgICB3aWR0aCAgICAgIAkzNjQNCi0JCSAgICBoZWlnaHQgICAgIAkxNzgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU0DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFERTQwMURDIg0KLQkJICAgIGNsaWVudCAgICAgCUA1Mw0KLQkJICAgIHN1cHBsaWVyICAgCUAyNQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk2NiwgOTE5KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjYsIDYzNikpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNSIgQDU1DQotCQkgICAgbG9jYXRpb24gICAJKDQ1NywgMTAyMikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDNFMTAxNzkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNiIgQDU2DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTUNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMzE5LCA0OTQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3DQotCQkJCVBhcmVudF9WaWV3IAlANTYNCi0JCQkJbG9jYXRpb24gICAJKDIzNSwgOTIwKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQzRTIwMjI1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANTUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNDU3LCAxMDIyKQ0KLQkJCQkoMjc2LCAxMDIyKQ0KLQkJCQkoMjc2LCA4NDkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDU3LCAxMDIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc2LCA4NDkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4DQotCQkJCVBhcmVudF9WaWV3IAlANTYNCi0JCQkJbG9jYXRpb24gICAJKDMzMCwgODg0KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdPcGVyYXRpb25zIiBANTkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjANCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTMxLCA5NzcpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM4NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZUJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQlwY3REaXN0ICAgIAkwLjIxMTY5OQ0KLQkJCQloZWlnaHQgICAgIAk0Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMzkiDQotCQkJICAgIGNsaWVudCAgICAgCUA1NQ0KLQkJCSAgICBzdXBwbGllciAgIAlANTMNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxMCwgMTAyMikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjENCi0JCQkJUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzY5LCA5ODApDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuODg0OTU2DQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDU5DQotCQkJCWxvY2F0aW9uICAgCSg3MTQsIDEwNjcpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuNzI3NTY0DQotCQkJCWhlaWdodCAgICAgCTQ1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDciIEA2Mw0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDE4LCAxMDQwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVENDI1MDM4QSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlT3BlcmF0aW9uIiBANjQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM1OCwgNDY0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDY0DQotCQkJCWxvY2F0aW9uICAgCSgxNTIwLCAxMDc5KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VPcGVyYXRpb24iDQotCQkJCXBjdERpc3QgICAgCTAuNDIwNjAxDQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVENDI2MDJGNSINCi0JCQkgICAgY2xpZW50ICAgICAJQDYzDQotCQkJICAgIHN1cHBsaWVyICAgCUA0MA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjMsIDEwNDApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY2DQotCQkJCVBhcmVudF9WaWV3IAlANjQNCi0JCQkJbG9jYXRpb24gICAJKDE1ODksIDEwMDUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNjk2NzIxDQotCQkJCWhlaWdodCAgICAgCTM2DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4IiBANjcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM1OCwgNDY0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OA0KLQkJCQlQYXJlbnRfVmlldyAJQDY3DQotCQkJCWxvY2F0aW9uICAgCSgxMjczLCAxMDcwKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE5Mg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuNTk1NDIwDQotCQkJCWhlaWdodCAgICAgCTMwDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVENDI2MDJGRiINCi0JCQkgICAgY2xpZW50ICAgICAJQDYzDQotCQkJICAgIHN1cHBsaWVyICAgCUA1Mw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExNzQsIDEwNDApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMiIEA2OQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3ODcsIDExOTApDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FERjJFNjQwMUY1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nSW5wdXQiIEA3MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDY5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzgxLCA0NTQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxDQotCQkJCVBhcmVudF9WaWV3IAlANzANCi0JCQkJbG9jYXRpb24gICAJKDY2OSwgMTE1MikNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjc2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlQmluZGluZ0lucHV0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjUxMTkwNQ0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkU2NTAyNTEiDQotCQkJICAgIGNsaWVudCAgICAgCUA2OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANDENCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg3ODcsIDExOTApDQotCQkJCSg2MzYsIDExOTApDQotCQkJCSg2MzYsIDEyNzEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzg3LCAxMTkwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM2LCAxMjcxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDcwDQotCQkJCWxvY2F0aW9uICAgCSg2ODUsIDEyMjIpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNDQwNDc2DQotCQkJCWhlaWdodCAgICAgCTMyDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNCIgQDczDQotCQkJICAgIFBhcmVudF9WaWV3IAlANjkNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zODEsIDQ1NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQNCi0JCQkJUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoODg1LCAxMTQ0KQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUyIg0KLQkJCSAgICBjbGllbnQgICAgIAlANjkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDUzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoNzg3LCAxMTkwKQ0KLQkJCQkoOTI2LCAxMTkwKQ0KLQkJCQkoOTI2LCAxMDk3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDkyNiwgMTA5NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUNCi0JCQkJUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoODcxLCAxMTM2KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgzNzc1OA0KLQkJCQloZWlnaHQgICAgIAk1Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNSIgQDc2DQotCQkgICAgbG9jYXRpb24gICAJKDEwMjQsIDEzMTIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FERjJFQjMwMTYzIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3V0cHV0IiBANzcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE1MCwgNTc4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OA0KLQkJCQlQYXJlbnRfVmlldyAJQDc3DQotCQkJCWxvY2F0aW9uICAgCSgxMDEyLCAxNDI5KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMDYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3V0cHV0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjU0NTA4Mg0KLQkJCQloZWlnaHQgICAgIAkxMw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkVCNDAxM0MiDQotCQkJICAgIGNsaWVudCAgICAgCUA3Ng0KLQkJCSAgICBzdXBwbGllciAgIAlANDcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDEzMTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxNTI3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDc3DQotCQkJCWxvY2F0aW9uICAgCSg5NjcsIDE0NzkpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzc0NTkwDQotCQkJCWhlaWdodCAgICAgCTU4DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNiIgQDgwDQotCQkJICAgIFBhcmVudF9WaWV3IAlANzYNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNTAsIDU3OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODENCi0JCQkJUGFyZW50X1ZpZXcgCUA4MA0KLQkJCQlsb2NhdGlvbiAgIAkoOTgzLCAxMTQwKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNEIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDUzDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTA5NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODINCi0JCQkJUGFyZW50X1ZpZXcgCUA4MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTAzMSwgMTE4NikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC41OTAxNjQNCi0JCQkJaGVpZ2h0ICAgICAJNw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEA4Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkyMCwgMTk4NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAODMNCi0JCQlsb2NhdGlvbiAgIAkoMTc3MiwgMTkwNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyOTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkZhdWx0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkJICAgIHdpZHRoICAgICAgCTMxNA0KLQkJICAgIGhlaWdodCAgICAgCTE3OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiIEA4NA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM2MCwgMTk4NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAODQNCi0JCQlsb2NhdGlvbiAgIAkoMTIxMiwgMTg1OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyOTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkJpbmRpbmdGYXVsdCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCSAgICB3aWR0aCAgICAgIAkzMTQNCi0JCSAgICBoZWlnaHQgICAgIAkyNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFFNzEwMzMzIg0KLQkJICAgIGNsaWVudCAgICAgCUA4NA0KLQkJICAgIHN1cHBsaWVyICAgCUAyOA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMDMsIDIwMDcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM1MywgMjAwNykpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzMiIEA4Ng0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzU2LCAxMzUyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBREYzNDAwMDNFNSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0ZhdWx0cyIgQDg3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAODYNCi0JCQkgICAgbG9jYXRpb24gICAJKDE4OCwgNjE2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OA0KLQkJCQlQYXJlbnRfVmlldyAJQDg3DQotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCAxNzUwKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzMDANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VCaW5kaW5nRmF1bHRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMzE1MA0KLQkJCQloZWlnaHQgICAgIAkyNg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMzQwMTAzQUEiDQotCQkJICAgIGNsaWVudCAgICAgCUA4Ng0KLQkJCSAgICBzdXBwbGllciAgIAlAODQNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU2LCAxODQ3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDg3DQotCQkJCWxvY2F0aW9uICAgCSgxNDA5LCAxNzk3KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg5OTE5NA0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTANCi0JCQkJUGFyZW50X1ZpZXcgCUA4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI1NiwgMTgwNikNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTU0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC45MTkyOTENCi0JCQkJaGVpZ2h0ICAgICAJMTAxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNCIgQDkxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODYNCi0JCQkgICAgbG9jYXRpb24gICAJKDE4OCwgNjE2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDkxDQotCQkJCWxvY2F0aW9uICAgCSgxMDc2LCAxMTk3KQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODYNCi0JCQkgICAgc3VwcGxpZXIgICAJQDUzDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTM1NiwgMTM1MikNCi0JCQkJKDEzNTYsIDEyMTcpDQotCQkJCSgxMTE3LCAxMjE3KQ0KLQkJCQkoMTExNywgMTA5NykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTA5NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMNCi0JCQkJUGFyZW50X1ZpZXcgCUA5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE1MiwgMTE2NCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42ODcwMDgNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzUiIEA5NA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNjQwLCAxOTcwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA5MUY0MDJGMyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHQiIEA5NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk2DQotCQkJCVBhcmVudF9WaWV3IAlAOTUNCi0JCQkJbG9jYXRpb24gICAJKDE2NzQsIDE5MTUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZUZhdWx0Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjI3NjQyMw0KLQkJCQloZWlnaHQgICAgIAk1Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOTFGODAxRkUiDQotCQkJICAgIGNsaWVudCAgICAgCUA5NA0KLQkJCSAgICBzdXBwbGllciAgIAlAODMNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzYzLCAxOTcwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDk1DQotCQkJCWxvY2F0aW9uICAgCSgxNzE4LCAyMDEyKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY0MjI3Ng0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzYiIEA5OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFMDkxRjgwMUZGIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDg0DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUxNywgMTk3MCkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFFNDMwMkFCIg0KLQkJICAgIGNsaWVudCAgICAgCUA0Nw0KLQkJICAgIHN1cHBsaWVyICAgCUAyNw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDgwMywgMTY1NikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY0LCAxNjU2KSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBRTFCMDExMyINCi0JCSAgICBjbGllbnQgICAgIAlANDENCi0JCSAgICBzdXBwbGllciAgIAlAMjYNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NjcsIDEzODUpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMzMSwgMTM4NSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNCBQb3J0VHlwZXMiDQotCSAgICBxdWlkICAgICAgIAkiM0FENUQxQzQwMzY2Ig0KLQkgICAgdGl0bGUgICAgICAJIjIuNCBQb3J0VHlwZXMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIg0KLQkgICAgem9vbSAgICAgICAJODANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIiBAMTAxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ5NiwgMjA4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDENCi0JCQlsb2NhdGlvbiAgIAkoMTQ2LCAxNzIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNzAwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJUG9ydFR5cGUiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDENCi0JCQlsb2NhdGlvbiAgIAkoMTQ2LCAxMjIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk3MDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiDQotCQkgICAgd2lkdGggICAgICAJNzE4DQotCQkgICAgaGVpZ2h0ICAgICAJMTk2DQotCQkgICAgYW5ub3RhdGlvbiAJOCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIgQDEwMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTUyLCAyMDgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwMg0KLQkJCWxvY2F0aW9uICAgCSgxMTE2LCAxNzYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJODczDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJT3BlcmF0aW9uIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTAyDQotCQkJbG9jYXRpb24gICAJKDExMTYsIDEyNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTg3Mw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSINCi0JCSAgICB3aWR0aCAgICAgIAk4OTENCi0JCSAgICBoZWlnaHQgICAgIAkxODgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUlucHV0IiBAMTAzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM2OCwgMTQ3MikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTAzDQotCQkJbG9jYXRpb24gICAJKDU1LCAxNDM3KQ0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSUlucHV0IikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTAzDQotCQkJbG9jYXRpb24gICAJKDU1LCAxMzg3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjI2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1Ig0KLQkJICAgIHdpZHRoICAgICAgCTY0NA0KLQkJICAgIGhlaWdodCAgICAgCTE5NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IiBAMTA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM4NCwgMTc5MikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA0DQotCQkJbG9jYXRpb24gICAJKDU2LCAxNzU3KQ0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSU91dHB1dCIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNA0KLQkJCWxvY2F0aW9uICAgCSg1NiwgMTcwNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCINCi0JCSAgICB3aWR0aCAgICAgIAk2NzQNCi0JCSAgICBoZWlnaHQgICAgIAkxOTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0IiBAMTA1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM2OCwgMjExMikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA1DQotCQkJbG9jYXRpb24gICAJKDU1LCAyMDc2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYyNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSUZhdWx0IikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA1DQotCQkJbG9jYXRpb24gICAJKDU1LCAyMDI2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjI2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE4NjEwMzFEIg0KLQkJICAgIHdpZHRoICAgICAgCTY0NA0KLQkJICAgIGhlaWdodCAgICAgCTE5Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDEwNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0OTYsIDgwMCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTA2DQotCQkJbG9jYXRpb24gICAJKDE1OCwgNjcyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY3Nw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkgICAgd2lkdGggICAgICAJNjk1DQotCQkgICAgaGVpZ2h0ICAgICAJMjgxDQotCQkgICAgYW5ub3RhdGlvbiAJOCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDEwNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNTc2LCA4MDApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEwNw0KLQkJCWxvY2F0aW9uICAgCSgyMzI1LCA2OTIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTAyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQYXJ0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJICAgIHdpZHRoICAgICAgCTUyMA0KLQkJICAgIGhlaWdodCAgICAgCTI0MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIgQDEwOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzI4LCAyMTEyKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQlsb2NhdGlvbiAgIAkoMTY0NywgMjA2MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkZhdWx0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkJICAgIGhlaWdodCAgICAgCTEyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDEwOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDU2LCAxNDcyKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMDkNCi0JCQlsb2NhdGlvbiAgIAkoODcwLCAxNDIyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSW5wdXQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkgICAgd2lkdGggICAgICAJMzkwDQotCQkgICAgaGVpZ2h0ICAgICAJMTI1DQotCQkgICAgYW5ub3RhdGlvbiAJOCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMTEwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEzNjAsIDE3OTIpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDExMA0KLQkJCWxvY2F0aW9uICAgCSgxMjMyLCAxNzQyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiT3V0cHV0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJICAgIHdpZHRoICAgICAgCTI3NA0KLQkJICAgIGhlaWdodCAgICAgCTEyNQ0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEAxMTENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU1MiwgNzg0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMTENCi0JCQlsb2NhdGlvbiAgIAkoMTIxNCwgNjIwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY3Nw0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiT3BlcmF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJICAgIHdpZHRoICAgICAgCTY5NQ0KLQkJICAgIGhlaWdodCAgICAgCTM1Mg0KLQkJICAgIGFubm90YXRpb24gCTgpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDExMg0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDI0LCA3OTcpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MjQwMThDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb25zIiBAMTEzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyDQotCQkJICAgIGxvY2F0aW9uICAgCSg1OTIsIDI2OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0DQotCQkJCVBhcmVudF9WaWV3IAlAMTEzDQotCQkJCWxvY2F0aW9uICAgCSgxMDg4LCA3NDgpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI0OQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZU9wZXJhdGlvbnMiDQotCQkJCXBjdERpc3QgICAgCTAuMzU5NjQ5DQotCQkJCWhlaWdodCAgICAgCTUwDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODI3MDFDRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDExMg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTExDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjA1LCA3OTcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDExMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3NiwgODYxKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg0MDM5MQ0KLQkJCQloZWlnaHQgICAgIAk2NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2DQotCQkJCVBhcmVudF9WaWV3IAlAMTEzDQotCQkJCWxvY2F0aW9uICAgCSgxMDc0LCA5MjMpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuMjc2MjQzDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAicG9ydFR5cGUiIEAxMTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTINCi0JCQkgICAgbG9jYXRpb24gICAJKDU5MiwgMjY5KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODI3MDFDMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDExMg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTA2DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDc5NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4DQotCQkJCVBhcmVudF9WaWV3IAlAMTE3DQotCQkJCWxvY2F0aW9uICAgCSg4ODgsIDc1NykNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NTM0ODgNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDEiIEAxMTkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjEwNywgNzczKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRUE0MTJGMDAzNSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlUGFyYW1ldGVyT3JkZXJpbmciIEAxMjANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkNCi0JCQkgICAgbG9jYXRpb24gICAJKDE4MTksIDEwMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxDQotCQkJCVBhcmVudF9WaWV3IAlAMTIwDQotCQkJCWxvY2F0aW9uICAgCSgyMTQ1LCA2NDcpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM5Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlwY3REaXN0ICAgIAkwLjE4MzMzMw0KLQkJCQloZWlnaHQgICAgIAkxMjcNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFQTQxMzEwMjU1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTE5DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIxMDcsIDc3MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTYsIDc3MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyDQotCQkJCVBhcmVudF9WaWV3IAlAMTIwDQotCQkJCWxvY2F0aW9uICAgCSgyMjcyLCA4MjIpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNzk2NjEwDQotCQkJCWhlaWdodCAgICAgCTQ5DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjANCi0JCQkJbG9jYXRpb24gICAJKDIxNzEsIDg4OCkNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC4zMDYyMjANCi0JCQkJaGVpZ2h0ICAgICAJMTE1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MiIgQDEyNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDExOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTExDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk5LCA3NzMpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEiIEAxMjUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTcwMiwgMTUwNCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQURGMzMxNjAxQTQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0cyIgQDEyNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxNCwgODMyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjYNCi0JCQkJbG9jYXRpb24gICAJKDE4MTUsIDE5ODIpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZUZhdWx0cyINCi0JCQkJcGN0RGlzdCAgICAJMC44Nzg5OTINCi0JCQkJaGVpZ2h0ICAgICAJMTEzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBREYzMzE4MDM4NyINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTA4DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgMjA0OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4DQotCQkJCVBhcmVudF9WaWV3IAlAMTI2DQotCQkJCWxvY2F0aW9uICAgCSgxNjQ0LCAyMDIwKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk0OTU4MA0KLQkJCQloZWlnaHQgICAgIAk1OQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5DQotCQkJCVBhcmVudF9WaWV3IAlAMTI2DQotCQkJCWxvY2F0aW9uICAgCSgxNTkzLCAxOTYzKQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjg0NTM3OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMyIiBAMTMwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1DQotCQkJICAgIGxvY2F0aW9uICAgCSgxNDE0LCA4MzIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTY2MSwgMTA2OSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBREYzMzE4MDM4OCINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTExDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgOTYwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzANCi0JCQkJbG9jYXRpb24gICAJKDE4MjEsIDEwMzkpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODU3MzYyDQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNyIgQDEzMw0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTc4LCAxMjM0KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBREYyRjk0MDI0RCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEAxMzQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMNCi0JCQkgICAgbG9jYXRpb24gICAJKDg5MCwgNTYyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQkJbG9jYXRpb24gICAJKDg3OCwgMTM0MykNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTMyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlSW5wdXQiDQotCQkJCXBjdERpc3QgICAgCTAuODE5ODIwDQotCQkJCWhlaWdodCAgICAgCTEwMw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkY5NTAxOTAiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwOQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExNzgsIDEyMzQpDQotCQkJCSg5ODAsIDEyMzQpDQotCQkJCSg5ODAsIDE0MTApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMTQxMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2DQotCQkJCVBhcmVudF9WaWV3IAlAMTM0DQotCQkJCWxvY2F0aW9uICAgCSgxMDQ2LCAxMzY0KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg3NzY2MA0KLQkJCQloZWlnaHQgICAgIAk2Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgiIEAxMzcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMNCi0JCQkgICAgbG9jYXRpb24gICAJKDg5MCwgNTYyKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzcNCi0JCQkJbG9jYXRpb24gICAJKDEyMzYsIDEwMzYpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkY5NTAxOUEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMzMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExNzgsIDEyMzQpDQotCQkJCSgxMjc3LCAxMjM0KQ0KLQkJCQkoMTI3NywgOTYwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc3LCA5NjApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEzNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgMTA1OCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43MzY0MTMNCi0JCQkJaGVpZ2h0ICAgICAJODENCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkiIEAxNDANCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ2OCwgMTM0NSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkZCODAyRjkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDE0MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTE4MCwgNjczKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDINCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDENCi0JCQkJbG9jYXRpb24gICAJKDEzNjIsIDE2NjkpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZU91dHB1dCINCi0JCQkJcGN0RGlzdCAgICAJMC44NDA5MDkNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE0MA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTEwDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMTczMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzDQotCQkJCVBhcmVudF9WaWV3IAlAMTQxDQotCQkJCWxvY2F0aW9uICAgCSgxNTQ2LCAxNjc2KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg2MzYzNg0KLQkJCQloZWlnaHQgICAgIAk3OA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAiIEAxNDQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDANCi0JCQkgICAgbG9jYXRpb24gICAJKDExODAsIDY3MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1DQotCQkJCVBhcmVudF9WaWV3IAlAMTQ0DQotCQkJCWxvY2F0aW9uICAgCSgxNDI3LCAxMDM3KQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTQwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTENCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCA5NjApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDE0NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyMywgMTA4MCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42OTAzNDENCi0JCQkJaGVpZ2h0ICAgICAJNTUNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjZGMUZEODAxOUYiDQotCQkgICAgY2xpZW50ICAgICAJQDEwNg0KLQkJICAgIHN1cHBsaWVyICAgCUAxMDENCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ4DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2RjFGRTIwMTcxIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMTENCi0JCSAgICBzdXBwbGllciAgIAlAMTAyDQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNkYxRkVFMDMxRCINCi0JCSAgICBjbGllbnQgICAgIAlAMTA5DQotCQkgICAgc3VwcGxpZXIgICAJQDEwMw0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjZGMUZGODAxQ0QiDQotCQkgICAgY2xpZW50ICAgICAJQDExMA0KLQkJICAgIHN1cHBsaWVyICAgCUAxMDQNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2RjIwMDIwMDJEIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMDgNCi0JCSAgICBzdXBwbGllciAgIAlAMTA1DQotCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE1Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjI0LCAxNDU2KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNTINCi0JCQlsb2NhdGlvbiAgIAkoMTkzNywgMTMxMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NzUNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkgICAgd2lkdGggICAgICAJNTkzDQotCQkgICAgaGVpZ2h0ICAgICAJMzEyDQotCQkgICAgYW5ub3RhdGlvbiAJOCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIgQDE1Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAyNTQ0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE1Mw0KLQkJCWxvY2F0aW9uICAgCSgxMTkzLCAyNDY2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY1NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTWVzc2FnZVJlZmVyZW5jZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyINCi0JCSAgICB3aWR0aCAgICAgIAk2NzINCi0JCSAgICBoZWlnaHQgICAgIAkxODANCi0JCSAgICBhbm5vdGF0aW9uIAk4KQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE1NA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTI0LCAyMjc1KQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAxNTMNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTUyNCwgMjI3NSkNCi0JCQkoMTUyNCwgMjQ1NCkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2NzcyM0QwMzE5Ig0KLQkJICAgIGNsaWVudCAgICAgCUAxMDgNCi0JCSAgICBzdXBwbGllciAgIAlAMTUzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc3NiwgMjE3NikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3NiwgMjI3NSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxNTQpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjY3NzIzNTAwREQiDQotCQkgICAgY2xpZW50ICAgICAJQDExMA0KLQkJICAgIHN1cHBsaWVyICAgCUAxNTMNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzcxLCAxODU0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzcxLCAyMjc1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE1NCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1Nw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNjc3MjI4MDJFNyINCi0JCSAgICBjbGllbnQgICAgIAlAMTA5DQotCQkgICAgc3VwcGxpZXIgICAJQDE1Mw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk4MCwgMTUzNCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAyMjc1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDE1NCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MSIgQDE1OA0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjA2LCAyMjU5KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNGNzRFNzg0MDFCMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDE1OQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1OA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjANCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTkNCi0JCQkJbG9jYXRpb24gICAJKDIwNjgsIDE2NzApDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIxNg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZU1lc3NhZ2UiDQotCQkJCXBjdERpc3QgICAgCTAuOTEyMjMwDQotCQkJCWhlaWdodCAgICAgCTEzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzRjc0RTc4NjAwMEYiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNTgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE1Mg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjIwNiwgMjI1OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyMDYsIDE2MTIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI2MCwgMTY3OCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYyIiBAMTYyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTU4DQotCQkJICAgIGxvY2F0aW9uICAgCSg3MzQsIC0yODUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDIzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTU4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNTMNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjA2LCAyMjU5KQ0KLQkJCQkoMjIwNiwgMjU1NikNCi0JCQkJKDE4NTYsIDI1NTYpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjIwNiwgMjI1OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4NTYsIDI1NTYpKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMSBEZWZpbml0aW9ucyINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RTQ4QTAyNjIiDQotCSAgICB0aXRsZSAgICAgIAkiMi4xIERlZmluaXRpb25zIg0KLQkgICAgem9vbSAgICAgICAJODMNCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iIEAxNjMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDMyLCAxOTIpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2Mw0KLQkJCWxvY2F0aW9uICAgCSg4OCwgMTYxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSURlZmluaXRpb24iKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjMNCi0JCQlsb2NhdGlvbiAgIAkoODgsIDExMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTY4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiINCi0JCSAgICB3aWR0aCAgICAgIAk3MDYNCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAxNjQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgOTQ0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjQNCi0JCQlsb2NhdGlvbiAgIAkoMTY4NiwgODk2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVHlwZXMiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkgICAgd2lkdGggICAgICAJMjk0DQotCQkgICAgaGVpZ2h0ICAgICAJMTIwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDE2NQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMTQ0LCA2MjQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2NQ0KLQkJCWxvY2F0aW9uICAgCSgxOTEwLCA1NDUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDY4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJbXBvcnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiDQotCQkgICAgd2lkdGggICAgICAJNDg2DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAxNjYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMTEyLCAxMTg0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjYNCi0JCQlsb2NhdGlvbiAgIAkoMTkwMCwgMTA1NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MjQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkgICAgd2lkdGggICAgICAJNDQyDQotCQkgICAgaGVpZ2h0ICAgICAJMjgwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMTY3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgwOCwgMTQ4OCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTY3DQotCQkJbG9jYXRpb24gICAJKDE1OTYsIDEzNjApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDI0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQb3J0VHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCSAgICB3aWR0aCAgICAgIAk0NDINCi0JCSAgICBoZWlnaHQgICAgIAkyODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDE2OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDIzMzYsIDE3MjgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE2OA0KLQkJCWxvY2F0aW9uICAgCSgyMTI0LCAxNjAwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQyNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCSAgICB3aWR0aCAgICAgIAk0NDINCi0JCSAgICBoZWlnaHQgICAgIAkyODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDE2OQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMjQwKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNjkNCi0JCQlsb2NhdGlvbiAgIAkoMTA3MywgMzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTEwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJICAgIHdpZHRoICAgICAgCTUyOA0KLQkJICAgIGhlaWdodCAgICAgCTQyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUzIiBAMTcwDQotCQkgICAgbG9jYXRpb24gICAJKDEzNTgsIDg2MCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRUEyNzAyOUYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTQiIEAxNzENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzANCi0JCQkgICAgbG9jYXRpb24gICAJKDYyLCAtMzYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDE3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxNywgNTM1KQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzU2Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTcwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTgsIDQ1MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTczDQotCQkJCVBhcmVudF9WaWV3IAlAMTcxDQotCQkJCWxvY2F0aW9uICAgCSgxNDAzLCA1MTEpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODU2NjQ5DQotCQkJCWhlaWdodCAgICAgCTQ1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAxNzQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzANCi0JCQkgICAgbG9jYXRpb24gICAJKDYyLCAtMzYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4NiwgOTA5KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VUeXBlcyINCi0JCQkJcGN0RGlzdCAgICAJMC43NzkwOTcNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzZBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTcwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMzU4LCA4NjApDQotCQkJCSgxMzU4LCA5NDgpDQotCQkJCSgxNjc3LCA5NDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NywgOTQ4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNzQNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDk4NykNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44OTI2NTUNCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTciIEAxNzcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTYxMiwgNTk1KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDODY0REZGMDJFQyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1OCIgQDE3OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE3Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTIsIDIyNykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc5DQotCQkJCVBhcmVudF9WaWV3IAlAMTc4DQotCQkJCWxvY2F0aW9uICAgCSgxNDIzLCA1MTIpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNzcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE2MTIsIDU5NSkNCi0JCQkJKDE0NjQsIDU5NSkNCi0JCQkJKDE0NjQsIDQ1MykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjEyLCA1OTUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY0LCA0NTMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MA0KLQkJCQlQYXJlbnRfVmlldyAJQDE3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyNCwgNDk1KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg1ODY2Nw0KLQkJCQloZWlnaHQgICAgIAk2MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAxODENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzcNCi0JCQkgICAgbG9jYXRpb24gICAJKDEyLCAyMjcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDE4MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY5MiwgNTU3KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyMDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VJbXBvcnRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjI4MDMzNQ0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiDQotCQkJICAgIGNsaWVudCAgICAgCUAxNzcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2NQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkwMSwgNTk1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxODENCi0JCQkJbG9jYXRpb24gICAJKDE4NTQsIDY1MikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC44NDEwMDQNCi0JCQkJaGVpZ2h0ICAgICAJNTcNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NA0KLQkJCQlQYXJlbnRfVmlldyAJQDE4MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY3NiwgNjQ2KQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjIyNTk0MQ0KLQkJCQloZWlnaHQgICAgIAk1MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDE4NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjc5LCAxMTM3KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjAzMDFFMiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNCIgQDE4Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE4NQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjcxLCAyNzMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDE4Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzOCwgNTkxKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTYwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUU2MDQwMEI3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTg1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzcpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc5LCA0NTMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4OA0KLQkJCQlQYXJlbnRfVmlldyAJQDE4Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyMCwgNTg2KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwNDk3NA0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2VzIiBAMTg5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTg1DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzEsIDI3MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkwDQotCQkJCVBhcmVudF9WaWV3IAlAMTg5DQotCQkJCWxvY2F0aW9uICAgCSgxNjQ3LCAxMTcxKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkyNDANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VNZXNzYWdlcyINCi0JCQkJcGN0RGlzdCAgICAJMC42NDMxMzcNCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUU2MDQwMEMxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTg1DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjc5LCAxMTM3KQ0KLQkJCQkoMTI3OSwgMTIwOCkNCi0JCQkJKDE4OTEsIDEyMDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTEsIDEyMDgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyMSwgMTE3MSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC44OTkzNDYNCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDE4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc5NywgMTI0NCkNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTU4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC44NjQ0MDcNCi0JCQkJaGVpZ2h0ICAgICAJMzYNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUiIEAxOTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIxMiwgMTE1OSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3MTAxMDQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYiIEAxOTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOTMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMjQsIDIxNSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk1DQotCQkJCVBhcmVudF9WaWV3IAlAMTk0DQotCQkJCWxvY2F0aW9uICAgCSgxMTcxLCA1OTQpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNEEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2OQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTIsIDQ1MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk2DQotCQkJCVBhcmVudF9WaWV3IAlAMTk0DQotCQkJCWxvY2F0aW9uICAgCSgxMjUxLCA2MjQpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzU3OTYyDQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGVzIiBAMTk3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTkzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMzI0LCAyMTUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5OA0KLQkJCQlQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTM5MSwgMTQ1MSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjQwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlUG9ydFR5cGVzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjcyMzY5OA0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNTQiDQotCQkJICAgIGNsaWVudCAgICAgCUAxOTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2Nw0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMTIsIDExNTkpDQotCQkJCSgxMjEyLCAxNDkwKQ0KLQkJCQkoMTU4NywgMTQ5MCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEyLCAxMTU5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4NywgMTQ5MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk5DQotCQkJCVBhcmVudF9WaWV3IAlAMTk3DQotCQkJCWxvY2F0aW9uICAgCSgxNTMzLCAxNDUxKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkyNTYxMQ0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAwDQotCQkJCVBhcmVudF9WaWV3IAlAMTk3DQotCQkJCWxvY2F0aW9uICAgCSgxNTEyLCAxNTQwKQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjg5NTg1NQ0KLQkJCQloZWlnaHQgICAgIAk1MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNyIgQDIwMQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTE0LCAxNTg1KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjc3MDA5NSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOCIgQDIwMg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQwNiwgMjQxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMDINCi0JCQkJbG9jYXRpb24gICAJKDEwNzMsIDY4MCkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjc4MDM3MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIwMQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTY5DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNCwgNDUzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDQNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMDINCi0JCQkJbG9jYXRpb24gICAJKDExNTUsIDc1MikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC43MzY3MDQNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5ncyIgQDIwNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQwNiwgMjQxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMDUNCi0JCQkJbG9jYXRpb24gICAJKDE4NTEsIDE2NzQpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIwNA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZUJpbmRpbmdzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc2NjM0Nw0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzN0IiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMDENCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDExMTQsIDE1ODUpDQotCQkJCSgxMTE0LCAxNzE2KQ0KLQkJCQkoMjExNSwgMTcxNikpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgMTcxNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA3DQotCQkJCVBhcmVudF9WaWV3IAlAMjA1DQotCQkJCWxvY2F0aW9uICAgCSgyMDUzLCAxNjc3KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk0NTA3NA0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA4DQotCQkJCVBhcmVudF9WaWV3IAlAMjA1DQotCQkJCWxvY2F0aW9uICAgCSgyMDE0LCAxNzU0KQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjkxMTA3Mg0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDIwOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIwOQ0KLQkJCWxvY2F0aW9uICAgCSgxNjI4LCAxOTIwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQyNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCSAgICB3aWR0aCAgICAgIAk0NDINCi0JCSAgICBoZWlnaHQgICAgIAkyODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOSIgQDIxMA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDY2LCAxNTMzKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjdCMDMxMSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMCIgQDIxMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEyDQotCQkJCVBhcmVudF9WaWV3IAlAMjExDQotCQkJCWxvY2F0aW9uICAgCSgxMDI1LCA2NjkpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwN0YiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2OQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDQ1MykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEzDQotCQkJCVBhcmVudF9WaWV3IAlAMjExDQotCQkJCWxvY2F0aW9uICAgCSgxMTA5LCA3NTYpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzE5Njk3DQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlU2VydmljZXMiIEAyMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTANCi0JCQkgICAgbG9jYXRpb24gICAJKC01MjEsIC0xMTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDIxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM5MywgMjAyOCkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjA0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlU2VydmljZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNzkxODI0DQotCQkJCWhlaWdodCAgICAgCTMyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjdEMDA4OSINCi0JCQkgICAgY2xpZW50ICAgICAJQDIxMA0KLQkJCSAgICBzdXBwbGllciAgIAlAMjA5DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTA2NiwgMTUzMykNCi0JCQkJKDEwNjYsIDIwNTkpDQotCQkJCSgxNjE5LCAyMDU5KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNjYsIDE1MzMpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE5LCAyMDU5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMTQNCi0JCQkJbG9jYXRpb24gICAJKDE1NTQsIDIwMzEpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTQwMTk3DQotCQkJCWhlaWdodCAgICAgCTI5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTcNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMTQNCi0JCQkJbG9jYXRpb24gICAJKDE1MzIsIDIxMTMpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuOTIwNTE1DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjE4DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEIxRjgwMzgyIg0KLQkJICAgIGNsaWVudCAgICAgCUAxNjkNCi0JCSAgICBzdXBwbGllciAgIAlAMTYzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA2NCwgMjYzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODUsIDI2MykpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4zIEV4dGVuc2liaWxpdHkiDQotCSAgICBxdWlkICAgICAgIAkiM0FENjBDNTEwMTkyIg0KLQkgICAgdGl0bGUgICAgICAJIjIuMS4zIEV4dGVuc2liaWxpdHkiDQotCSAgICB6b29tICAgICAgIAk4MA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMjE5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxNTg0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMTkNCi0JCQlsb2NhdGlvbiAgIAkoNDk0LCAxNTMxKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTE2NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCSAgICB3aWR0aCAgICAgIAkxODINCi0JCSAgICBoZWlnaHQgICAgIAkxMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDIyMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1NjgsIDE4ODgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyMA0KLQkJCWxvY2F0aW9uICAgCSgxNDg3LCAxODM2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUG9ydCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiINCi0JCSAgICBoZWlnaHQgICAgIAkxMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDIyMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0MjQsIDE3MjgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyMQ0KLQkJCWxvY2F0aW9uICAgCSgxMzQyLCAxNjc1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTE2NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCSAgICB3aWR0aCAgICAgIAkxODINCi0JCSAgICBoZWlnaHQgICAgIAkxMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMjIyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIxNiwgMjMzNikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjIyDQotCQkJbG9jYXRpb24gICAJKDEwODgsIDIyODMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjU2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iIEAyMjMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg3MzYsIDE3NjApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyMw0KLQkJCWxvY2F0aW9uICAgCSg1NjMsIDE3MDcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzQ2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nT3BlcmF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJICAgIHdpZHRoICAgICAgCTM2NA0KLQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDIyNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODg4LCAxNjApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyNA0KLQkJCWxvY2F0aW9uICAgCSgxNDk1LCAxMzYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNzg2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMjQNCi0JCQlsb2NhdGlvbiAgIAkoMTQ5NSwgODYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk3ODYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QjEyNDAyQUIiDQotCQkgICAgd2lkdGggICAgICAJODA0DQotCQkgICAgaGVpZ2h0ICAgICAJMTcyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIgQDIyNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkyOCwgMTk1MikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjI1DQotCQkJbG9jYXRpb24gICAJKDgwMCwgMTg5OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCINCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkxMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIgQDIyNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEwMDgsIDIxNDQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyNg0KLQkJCWxvY2F0aW9uICAgCSg4NjMsIDIwOTEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjkwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nT3V0cHV0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIg0KLQkJICAgIHdpZHRoICAgICAgCTMwOA0KLQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjI3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAxMjk2KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMjcNCi0JCQlsb2NhdGlvbiAgIAkoNzQsIDEyMzUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjA0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJICAgIHdpZHRoICAgICAgCTIyMg0KLQkJICAgIGhlaWdodCAgICAgCTE0Ng0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDIyOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0MTYsIDE0MDgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyOA0KLQkJCWxvY2F0aW9uICAgCSgzMzUsIDEzNTYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJUeXBlcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCSAgICBoZWlnaHQgICAgIAkxMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAyMjkNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgNjg4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIyOQ0KLQkJCWxvY2F0aW9uICAgCSgyMDksIDU4MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJICAgIHdpZHRoICAgICAgCTU2MA0KLQkJICAgIGhlaWdodCAgICAgCTI0MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDIzMA0KLQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDEwMzkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDIyOQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg0ODAsIDEwMzkpDQotCQkJKDQ4MCwgODA4KSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MDBDQjAwQUEiDQotCQkgICAgY2xpZW50ICAgICAJQDIyMA0KLQkJICAgIHN1cHBsaWVyICAgCUAyMjkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY2LCAxODI0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY2LCAxMDM5KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDIzMCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzMg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODVCNUE0MDI3RSINCi0JCSAgICBjbGllbnQgICAgIAlAMjI2DQotCQkgICAgc3VwcGxpZXIgICAJQDIyOQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwOTcsIDIwNzkpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTcsIDEwMzkpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMzDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDkzODYwMkM5Ig0KLQkJICAgIGNsaWVudCAgICAgCUAyMjINCi0JCSAgICBzdXBwbGllciAgIAlAMjI5DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIxOSwgMjI3MSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxOSwgMTAzOSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg1QjU5QjAwNzIiDQotCQkgICAgY2xpZW50ICAgICAJQDIyNQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyMjkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODgsIDE4ODcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk4OCwgMTAzOSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MDA5MjAyRjciDQotCQkgICAgY2xpZW50ICAgICAJQDIyMw0KLQkJICAgIHN1cHBsaWVyICAgCUAyMjkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3OTcsIDE2OTUpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc5NywgMTAzOSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkEwRjAyRjAiDQotCQkgICAgY2xpZW50ICAgICAJQDIxOQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyMjkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDEsIDE1MTkpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYwMSwgMTAzOSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkRCODAzRDQiDQotCQkgICAgY2xpZW50ICAgICAJQDIyNw0KLQkJICAgIHN1cHBsaWVyICAgCUAyMjkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTEsIDEyMjMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxMSwgMTAzOSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiDQotCQkgICAgY2xpZW50ICAgICAJQDIyOA0KLQkJICAgIHN1cHBsaWVyICAgCUAyMjkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0MTQsIDEzNDQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQxNCwgMTAzOSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkEyMDAyNUUiDQotCQkgICAgY2xpZW50ICAgICAJQDIyMQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyMjkNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNjYzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDI5LCAxMDM5KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDIzMCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNDANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDY4OCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjQwDQotCQkJbG9jYXRpb24gICAJKDE2MzIsIDU4MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NDUNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJICAgIHdpZHRoICAgICAgCTU2Mw0KLQkJICAgIGhlaWdodCAgICAgCTIzNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxIiBAMjQxDQotCQkgICAgbG9jYXRpb24gICAJKDExOTEsIDY3MikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIiIEAyNDINCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNDENCi0JCQkgICAgbG9jYXRpb24gICAJKDIzLCA1NjApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDI0Mg0KLQkJCQlsb2NhdGlvbiAgIAkoODQ3LCA2MzEpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyNDENCi0JCQkgICAgc3VwcGxpZXIgICAJQDIyOQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzYwLCA2NzIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0NA0KLQkJCQlQYXJlbnRfVmlldyAJQDI0Mg0KLQkJCQlsb2NhdGlvbiAgIAkoODMwLCA2MjgpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODM5Njk1DQotCQkJCWhlaWdodCAgICAgCTQ1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBAMjQ1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQxDQotCQkJICAgIGxvY2F0aW9uICAgCSgyMywgNTYwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNDUNCi0JCQkJbG9jYXRpb24gICAJKDEzNTUsIDUyMikNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjM3OTA3MA0KLQkJCQloZWlnaHQgICAgIAkxNTENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjQxDQotCQkJICAgIHN1cHBsaWVyICAgCUAyNDANCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjMsIDY3MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ3DQotCQkJCVBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCWxvY2F0aW9uICAgCSgxNDk2LCA2MjcpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNzA5NDAyDQotCQkJCWhlaWdodCAgICAgCTQ2DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDgNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNDUNCi0JCQkJbG9jYXRpb24gICAJKDE0NjMsIDc2NCkNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC42MzI0NzkNCi0JCQkJaGVpZ2h0ICAgICAJOTINCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IiBAMjQ5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEwMDgsIDE5MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNDkNCi0JCQlsb2NhdGlvbiAgIAkoNjMwLCA4NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk3NTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIldTRExFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIg0KLQkJICAgIHdpZHRoICAgICAgCTc3NA0KLQkJICAgIGhlaWdodCAgICAgCTI0MA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI1MA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDA4LCA0MDIpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDI0OQ0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxMDA4LCA0MDIpDQotCQkJKDEwMDgsIDMxMikpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZFM0MwM0Q0Ig0KLQkJICAgIGNsaWVudCAgICAgCUAyMjkNCi0JCSAgICBzdXBwbGllciAgIAlAMjQ5DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDkyLCA1NjgpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ5MiwgNDAyKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI1MCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1Mg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRCMTQ5MDNEMCINCi0JCSAgICBjbGllbnQgICAgIAlAMjQwDQotCQkgICAgc3VwcGxpZXIgICAJQDIyNA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwMTUsIDU3MSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNSwgMjQ2KSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1Mw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCRERGNTM1MDJDMyINCi0JCSAgICBjbGllbnQgICAgIAlAMjQwDQotCQkgICAgc3VwcGxpZXIgICAJQDI0OQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NjIsIDU3MSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2MiwgNDAyKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI1MCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjU0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMDE2LCAxMzYwKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNTQNCi0JCQlsb2NhdGlvbiAgIAkoMTczMSwgMTMwNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCSAgICB3aWR0aCAgICAgIAk1ODgNCi0JCSAgICBoZWlnaHQgICAgIAkxMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1NQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDQjI0QUVDMDFDQiINCi0JCSAgICBjbGllbnQgICAgIAlAMjU0DQotCQkgICAgc3VwcGxpZXIgICAJQDI0MA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3OTYsIDEyOTUpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3OTYsIDgwNSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjMiIEAyNTYNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMxMSwgMTY4NikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzRjc4OTZBMjAyNkUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicGFyZW50IiBAMjU3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjU2DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzksIDI5NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU4DQotCQkJCVBhcmVudF9WaWV3IAlAMjU3DQotCQkJCWxvY2F0aW9uICAgCSgyNDIyLCAxMzMzKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3BhcmVudCINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjU2DQotCQkJICAgIHN1cHBsaWVyICAgCUAyNTQNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMzExLCAxNjg2KQ0KLQkJCQkoMjQzMiwgMTY4NikNCi0JCQkJKDI0MzIsIDEzNzQpDQotCQkJCSgyMzEwLCAxMzc0KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzEwLCAxMzc0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAyNTcNCi0JCQkJbG9jYXRpb24gICAJKDIzNjYsIDE0MjgpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjaGlsZHJlbiIgQDI2MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Ng0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc5LCAyOTQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI2MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTg5OSwgMTUzNykNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjaGlsZHJlbiINCi0JCQkJcGN0RGlzdCAgICAJMC43OTg1NjENCi0JCQkJaGVpZ2h0ICAgICAJMTE4DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNGNzg5NkE3MDEyQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDI1Ng0KLQkJCSAgICBzdXBwbGllciAgIAlAMjU0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjMxMSwgMTY4NikNCi0JCQkJKDIwMTYsIDE2ODYpDQotCQkJCSgyMDE2LCAxNDI1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDE2LCAxNDI1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjINCi0JCQkJUGFyZW50X1ZpZXcgCUAyNjANCi0JCQkJbG9jYXRpb24gICAJKDIwNzAsIDE0ODEpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmciDQotCSAgICBxdWlkICAgICAgIAkiM0FFOEVENzIwMUJEIg0KLQkgICAgdGl0bGUgICAgICAJIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyINCi0JICAgIHpvb20gICAgICAgCTkwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbXBvcnQiIEAyNjMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3MTIsIDIyNCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjYzDQotCQkJbG9jYXRpb24gICAJKDE0MjIsIDE3NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1ODANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklJbXBvcnQiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNjMNCi0JCQlsb2NhdGlvbiAgIAkoMTQyMiwgMTI3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJYW5jaG9yICAgICAJMTANCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTgwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5Ig0KLQkJICAgIHdpZHRoICAgICAgCTU5OA0KLQkJICAgIGhlaWdodCAgICAgCTIxOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpOYW1lc3BhY2UiIEAyNjQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQzMiwgMTEzNikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjY0DQotCQkJbG9jYXRpb24gICAJKDIwMiwgMTA0MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NjENCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk5hbWVzcGFjZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRUEzQ0QzMDAzMCINCi0JCSAgICB3aWR0aCAgICAgIAk0NzkNCi0JCSAgICBoZWlnaHQgICAgIAkyMTUNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAyNjUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgMTIxNikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjY1DQotCQkJbG9jYXRpb24gICAJKDEyOTQsIDExNDIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjc2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkgICAgd2lkdGggICAgICAJNjk0DQotCQkgICAgaGVpZ2h0ICAgICAJMTczDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAyNjYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDAwLCAzODQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI2Ng0KLQkJCWxvY2F0aW9uICAgCSgxNjQsIDIzNikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkgICAgd2lkdGggICAgICAJNDkwDQotCQkgICAgaGVpZ2h0ICAgICAJMzIwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzciIEAyNjcNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzA5LCA3ODYpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFQTNENTUwMDJEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVOYW1lc3BhY2VzIiBAMjY4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjY3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtOTEsIDI1OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjY5DQotCQkJCVBhcmVudF9WaWV3IAlAMjY4DQotCQkJCWxvY2F0aW9uICAgCSg0NjEsIDk1NikNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjg4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlTmFtZXNwYWNlcyINCi0JCQkJcGN0RGlzdCAgICAJMC42OTg4NDINCi0JCQkJaGVpZ2h0ICAgICAJMTUyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRUEzRDU2MDMzMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI2Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjY0DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMwOSwgMTAyOSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjcwDQotCQkJCVBhcmVudF9WaWV3IAlAMjY4DQotCQkJCWxvY2F0aW9uICAgCSgyNDgsIDk3MykNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC43Njg3MDcNCi0JCQkJaGVpZ2h0ICAgICAJNjINCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjI4LCA5MTMpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuNTI1MDk3DQotCQkJCWhlaWdodCAgICAgCTgyDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzOCIgQDI3Mg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTkxLCAyNTgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDI3Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMjY4LCA1OTIpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTkyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIiINCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFQTNENTYwMzI4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjY3DQotCQkJICAgIHN1cHBsaWVyICAgCUAyNjYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDMwOSwgNzg2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA5LCA1NDQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3NA0KLQkJCQlQYXJlbnRfVmlldyAJQDI3Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMjM5LCA1ODMpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODQ0OTYxDQotCQkJCWhlaWdodCAgICAgCTcxDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiIEAyNzUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0NzIsIDcyMCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjc1DQotCQkJbG9jYXRpb24gICAJKDEyNTUsIDU4MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MzQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkltcG9ydCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCSAgICB3aWR0aCAgICAgIAk0NTINCi0JCSAgICBoZWlnaHQgICAgIAkzMDQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MSIgQDI3Ng0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg2LCAxMDAxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCOEIxRENDMDJFNSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlU2NoZW1hIiBAMjc3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjc2DQotCQkJICAgIGxvY2F0aW9uICAgCSg1MTAsIC0xMDMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3OA0KLQkJCQlQYXJlbnRfVmlldyAJQDI3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTczNywgMTAxOCkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjA0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlU2NoZW1hIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU5MjU5Mw0KLQkJCQloZWlnaHQgICAgIAkxMDUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4QjFEQ0UwMjcwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjc2DQotCQkJICAgIHN1cHBsaWVyICAgCUAyNjUNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNDg2LCAxMDAxKQ0KLQkJCQkoMTYzMiwgMTAwMSkNCi0JCQkJKDE2MzIsIDExMzApKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgMTAwMSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzIsIDExMzApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDI3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2MywgMTAxOCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC41OTI1OTMNCi0JCQkJaGVpZ2h0ICAgICAJNzANCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUyIiBAMjgwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjc2DQotCQkJICAgIGxvY2F0aW9uICAgCSg1MTAsIC0xMDMpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4QjFEQ0UwMjdBIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMjc2DQotCQkJICAgIHN1cHBsaWVyICAgCUAyNzUNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDg3MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODYsIDg3MikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzOSIgQDI4MQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDg3LCA0MDMpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFQTNFM0EwMDJEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQwIiBAMjgyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjgxDQotCQkJICAgIGxvY2F0aW9uICAgCSg2ODcsIC0xMjUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4Mw0KLQkJCQlQYXJlbnRfVmlldyAJQDI4Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwNiwgNDgwKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRUEzRTNDMDFGMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDI4MQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjc1DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTA4NywgNDAzKQ0KLQkJCQkoMTM2NCwgNDAzKQ0KLQkJCQkoMTM2NCwgNTY4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjQsIDU2OCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZURlZmluaXRpb24iIEAyODQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODENCi0JCQkgICAgbG9jYXRpb24gICAJKDY4NywgLTEyNSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg1DQotCQkJCVBhcmVudF9WaWV3IAlAMjg0DQotCQkJCWxvY2F0aW9uICAgCSg4MDUsIDM2MykNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjE2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlRGVmaW5pdGlvbiINCi0JCQkJcGN0RGlzdCAgICAJMC42Mzc1MzINCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFQTNFM0MwMUU4Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjgxDQotCQkJICAgIHN1cHBsaWVyICAgCUAyNjYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY0NSwgNDAzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODYNCi0JCQkJUGFyZW50X1ZpZXcgCUAyODQNCi0JCQkJbG9jYXRpb24gICAJKDcyNywgNDU2KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgxNDkxMA0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NyIgQDI4Nw0KLQkJICAgIGxvY2F0aW9uICAgCSg3MzcsIDgyNikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTgiIEAyODgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODcNCi0JCQkgICAgbG9jYXRpb24gICAJKC02NzEsIDEwNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg5DQotCQkJCVBhcmVudF9WaWV3IAlAMjg4DQotCQkJCWxvY2F0aW9uICAgCSg1NTIsIDY0NykNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiDQotCQkJICAgIGNsaWVudCAgICAgCUAyODcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI2Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDczNywgODI2KQ0KLQkJCQkoNTEwLCA4MjYpDQotCQkJCSg1MTAsIDU0NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNTQ0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTANCi0JCQkJUGFyZW50X1ZpZXcgCUAyODgNCi0JCQkJbG9jYXRpb24gICAJKDQ1NywgNTk1KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAyOTENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODcNCi0JCQkgICAgbG9jYXRpb24gICAJKC02NzEsIDEwNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjkyDQotCQkJCVBhcmVudF9WaWV3IAlAMjkxDQotCQkJCWxvY2F0aW9uICAgCSgxMTQ0LCA3NzMpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZUltcG9ydHMiDQotCQkJCXBjdERpc3QgICAgCTAuNzk5MTg5DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNDODY0REZGMDJFRCINCi0JCQkgICAgY2xpZW50ICAgICAJQDI4Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjc1DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDYsIDgyNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjkzDQotCQkJCVBhcmVudF9WaWV3IAlAMjkxDQotCQkJCWxvY2F0aW9uICAgCSgxMTgwLCA4NzkpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuODcyMjExDQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTQNCi0JCQkJUGFyZW50X1ZpZXcgCUAyOTENCi0JCQkJbG9jYXRpb24gICAJKDExNjIsIDkzMykNCi0JCQkJYW5jaG9yICAgICAJMw0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQ2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJcGN0RGlzdCAgICAJMC44Mzc3MjgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjk1DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2RjIwMEQwMzQwIg0KLQkJICAgIGNsaWVudCAgICAgCUAyNzUNCi0JCSAgICBzdXBwbGllciAgIAlAMjYzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU1NSwgNTY4KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCAzMzMpKSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICIyLjIgVHlwZXMiDQotCSAgICBxdWlkICAgICAgIAkiM0I4NUFFNTkwMzdFIg0KLQkgICAgdGl0bGUgICAgICAJIjIuMiBUeXBlcyINCi0JICAgIHpvb20gICAgICAgCTkwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTgxDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMjk2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMTM2LCAxMjMyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI5Ng0KLQkJCWxvY2F0aW9uICAgCSg4OTUsIDExNTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDgyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCSAgICB3aWR0aCAgICAgIAk1MDANCi0JCSAgICBoZWlnaHQgICAgIAkxNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAyOTcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTEzNiwgMTYwMCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjk3DQotCQkJbG9jYXRpb24gICAJKDkwNiwgMTUzMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0NjANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCSAgICB3aWR0aCAgICAgIAk0NzgNCi0JCSAgICBoZWlnaHQgICAgIAkxNjINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDI5OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI4MCwgMTk2OCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjk4DQotCQkJbG9jYXRpb24gICAJKDEwMjIsIDE4MjgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTE3DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJICAgIHdpZHRoICAgICAgCTUzNQ0KLQkJICAgIGhlaWdodCAgICAgCTMwNQ0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMjk5DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNTIsIDExODQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDI5OQ0KLQkJCWxvY2F0aW9uICAgCSgxMjgsIDEwNjcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDQ4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJQYXJ0IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJICAgIHdpZHRoICAgICAgCTQ2Ng0KLQkJICAgIGhlaWdodCAgICAgCTI1OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ3IiBAMzAwDQotCQkgICAgbG9jYXRpb24gICAJKDczNSwgMTE3MikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCMUJFOTAwQzQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEAzMDENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMDANCi0JCQkgICAgbG9jYXRpb24gICAJKDE0MywgNjc2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDINCi0JCQkJUGFyZW50X1ZpZXcgCUAzMDENCi0JCQkJbG9jYXRpb24gICAJKDc3NSwgMTEzMykNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjc2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiINCi0JCQkJcGN0RGlzdCAgICAJMC4yNjkwMDYNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzI3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMzAwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyOTYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg4NiwgMTE3MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAzDQotCQkJCVBhcmVudF9WaWV3IAlAMzAxDQotCQkJCWxvY2F0aW9uICAgCSg4MzksIDEyMDcpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNjg4NzA1DQotCQkJCWhlaWdodCAgICAgCTM1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0OCIgQDMwNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMwMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzLCA2NzYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzMxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzAwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyOTkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU4NSwgMTE3MikpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0OSIgQDMwNQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MjcsIDE1OTIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4QjFDMTIwM0IyIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVsZW1lbnREZWNsYXJhdGlvbiIgQDMwNg0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY1LCAxMDk2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDcNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMDYNCi0JCQkJbG9jYXRpb24gICAJKDY2NiwgMTU1NCkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXBjdERpc3QgICAgCTAuMzc1Mzk0DQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNCOEIxQzE0MDAxQyINCi0JCQkgICAgY2xpZW50ICAgICAJQDMwNQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjk3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTcsIDE1OTIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwOA0KLQkJCQlQYXJlbnRfVmlldyAJQDMwNg0KLQkJCQlsb2NhdGlvbiAgIAkoODA3LCAxNjQ1KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc1NTg3Nw0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTAiIEAzMDkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMDUNCi0JCQkgICAgbG9jYXRpb24gICAJKC02NSwgMTA5NikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMjYiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMDUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDI5OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDUyNywgMTU5MikNCi0JCQkJKDQzNywgMTU5MikNCi0JCQkJKDQzNywgMTMxMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDEzMTMpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTUiIEAzMTANCi0JCSAgICBsb2NhdGlvbiAgIAkoMzIyLCAxOTExKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDNDY4MjkzMDNFNSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDMxMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMxMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTINCi0JCQkJUGFyZW50X1ZpZXcgCUAzMTENCi0JCQkJbG9jYXRpb24gICAJKDgzOCwgMTg3MikNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjE2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlTWVzc2FnZSINCi0JCQkJcGN0RGlzdCAgICAJMC43NDg1NjANCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0M0NjgyOTYwMTBFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMzEwDQotCQkJICAgIHN1cHBsaWVyICAgCUAyOTgNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDMyMiwgMTkxMSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDE5MTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMw0KLQkJCQlQYXJlbnRfVmlldyAJQDMxMQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTQzLCAxOTY1KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTYiIEAzMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMTANCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNCwgMTE5MSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMTgiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMTANCi0JCQkgICAgc3VwcGxpZXIgICAJQDI5OQ0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDMyMiwgMTkxMSkNCi0JCQkJKDIyOSwgMTkxMSkNCi0JCQkJKDIyOSwgMTMxMykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjksIDEzMTMpKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMzE1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDYwOCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzE1DQotCQkJbG9jYXRpb24gICAJKDYxNSwgNTEyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3MQ0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiVHlwZXMiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkgICAgd2lkdGggICAgICAJMzg5DQotCQkgICAgaGVpZ2h0ICAgICAJMjE2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAzMTYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDE2MCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzE2DQotCQkJbG9jYXRpb24gICAJKDc0LCAxMDcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjA0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJICAgIHdpZHRoICAgICAgCTIyMg0KLQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUzIiBAMzE3DQotCQkgICAgbG9jYXRpb24gICAJKDIzNCwgNjA0KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAzMTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMTcNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNTAsIDM5NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE5DQotCQkJCVBhcmVudF9WaWV3IAlAMzE4DQotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDY0MCkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjA3DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlVHlwZXMiDQotCQkJCXBjdERpc3QgICAgCTAuNjYxMDE3DQotCQkJCWhlaWdodCAgICAgCTM2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCQkgICAgY2xpZW50ICAgICAJQDMxNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzE1DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDYwNCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYwNiwgNjA0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjANCi0JCQkJUGFyZW50X1ZpZXcgCUAzMTgNCi0JCQkJbG9jYXRpb24gICAJKDUyNiwgNTY5KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc4Mzg4Mw0KLQkJCQloZWlnaHQgICAgIAkzNg0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTQiIEAzMjENCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMTcNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNTAsIDM5NikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIyDQotCQkJCVBhcmVudF9WaWV3IAlAMzIxDQotCQkJCWxvY2F0aW9uICAgCSgxMzMsIDMxMykNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiINCi0JCQkgICAgY2xpZW50ICAgICAJQDMxNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzE2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjM0LCA2MDQpDQotCQkJCSgxNzQsIDYwNCkNCi0JCQkJKDE3NCwgMjI1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAyMjUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMw0KLQkJCQlQYXJlbnRfVmlldyAJQDMyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI4LCAyNzEpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODk3NzI5DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiIEAzMjQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjQwLCAyMjQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMyNA0KLQkJCWxvY2F0aW9uICAgCSg1MjUsIDIwMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyMzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIklUeXBlcyIpDQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMyNA0KLQkJCWxvY2F0aW9uICAgCSg1MjUsIDE1MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCINCi0JCSAgICB3aWR0aCAgICAgIAkyNDgNCi0JCSAgICBoZWlnaHQgICAgIAkxNjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzMjUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3MjgsIDgwMCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzI1DQotCQkJbG9jYXRpb24gICAJKDEzNTksIDc1MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk3MzkNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0NDMzYwRDcwMzlDIg0KLQkJICAgIHdpZHRoICAgICAgCTc1Nw0KLQkJICAgIGhlaWdodCAgICAgCTExOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDMyNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODU2LCAxMjE2KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMjYNCi0JCQlsb2NhdGlvbiAgIAkoMTUyOSwgMTEwMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk2NTUNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCSAgICB3aWR0aCAgICAgIAk2NzMNCi0JCSAgICBoZWlnaHQgICAgIAkyNTANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1OSIgQDMyNw0KLQkJICAgIGxvY2F0aW9uICAgCSgxODI2LCA5NzUpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0NDMzYxNDUwMEYyIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYwIiBAMzI4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzI3DQotCQkJICAgIGxvY2F0aW9uICAgCSgzMDYsIDQ0NykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0QiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMjcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMyNQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgODU5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjkNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMjgNCi0JCQkJbG9jYXRpb24gICAJKDE3NzQsIDkwMCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42NTY0ODkNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDMzMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA2LCA0NDcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMjAwNiwgMTAzMykNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitzY2hlbWEiDQotCQkJCXBjdERpc3QgICAgCTAuNTA3NTc2DQotCQkJCWhlaWdodCAgICAgCTE4MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0UiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMjcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMyNg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgMTA5MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMyDQotCQkJCVBhcmVudF9WaWV3IAlAMzMwDQotCQkJCWxvY2F0aW9uICAgCSgxNzg4LCAxMDUwKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY1MTUxNQ0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzMw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNDQURDRDNCMDM4MCINCi0JCSAgICBjbGllbnQgICAgIAlAMzE1DQotCQkgICAgc3VwcGxpZXIgICAJQDMyNA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDcwNSwgNTAwKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDUsIDMwNykpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMzM0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDU2LCAyMjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzM0DQotCQkJbG9jYXRpb24gICAJKDgxNSwgMTMwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ4Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkgICAgd2lkdGggICAgICAJNTAwDQotCQkgICAgaGVpZ2h0ICAgICAJMjEyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMzUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiDQotCQkgICAgY2xpZW50ICAgICAJQDMxNQ0KLQkJICAgIHN1cHBsaWVyICAgCUAzMzQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTQsIDUwMCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU0LCAzMzApKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDMzNg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODI0LCA0NjQpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMzNg0KLQkJCWxvY2F0aW9uICAgCSgxNDkwLCAzNjgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjY5DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCSAgICB3aWR0aCAgICAgIAk2ODcNCi0JCSAgICBoZWlnaHQgICAgIAkyMTYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDMzNw0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjA2LCA0OTMpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMzM4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzM3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTg2LCAyMzcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDMzOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTEzNiwgMzg2KQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDMzNw0KLQkJCSAgICBzdXBwbGllciAgIAlAMzM0DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIwNiwgNDkzKQ0KLQkJCQkoMTA5NCwgNDkzKQ0KLQkJCQkoMTA5NCwgMzMwKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTQsIDMzMCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQwDQotCQkJCVBhcmVudF9WaWV3IAlAMzM4DQotCQkJCWxvY2F0aW9uICAgCSgxMDQyLCAzNzcpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODI4MzI2DQotCQkJCWhlaWdodCAgICAgCTUzDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBAMzQxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzM3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTg2LCAyMzcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDM0MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5NiwgNDU0KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXBjdERpc3QgICAgCS0wLjAzOTcxMQ0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiDQotCQkJICAgIGNsaWVudCAgICAgCUAzMzcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMzNg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4MSwgNDkzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNDENCi0JCQkJbG9jYXRpb24gICAJKDE0MTUsIDU0NikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC43NjQ5NTcNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0NA0KLQkJCQlQYXJlbnRfVmlldyAJQDM0MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM5NiwgMzkyKQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNDYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjY5NDkxNQ0KLQkJCQloZWlnaHQgICAgIAkxMDINCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNDUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQ0MzNjI3RjAwQjciDQotCQkgICAgY2xpZW50ICAgICAJQDMyNQ0KLQkJICAgIHN1cHBsaWVyICAgCUAzMzYNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxODEyLCA3NDEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTIsIDU3MikpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMyBNZXNzYWdlcyINCi0JICAgIHF1aWQgICAgICAgCSIzQkNFODUzRDAyQzgiDQotCSAgICB0aXRsZSAgICAgIAkiMi4zIE1lc3NhZ2VzIg0KLQkgICAgem9vbSAgICAgICAJODUNCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU1lc3NhZ2UiIEAzNDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDIyNCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzQ2DQotCQkJbG9jYXRpb24gICAJKDI2NywgMTIyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSU1lc3NhZ2UiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNDYNCi0JCQlsb2NhdGlvbiAgIAkoMjY3LCA3MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCWFuY2hvciAgICAgCTEwDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiINCi0JCSAgICB3aWR0aCAgICAgIAkzODANCi0JCSAgICBoZWlnaHQgICAgIAkzMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiIEAzNDcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMjI0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNDcNCi0JCQlsb2NhdGlvbiAgIAkoMTAyOSwgMTI0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU5OQ0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSVBhcnQiKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNDcNCi0JCQlsb2NhdGlvbiAgIAkoMTAyOSwgNzQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1OTkNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiDQotCQkgICAgd2lkdGggICAgICAJNjE3DQotCQkgICAgaGVpZ2h0ICAgICAJMzI0DQotCQkgICAgYW5ub3RhdGlvbiAJOCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDM0OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMxMiwgODE2KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzNDgNCi0JCQlsb2NhdGlvbiAgIAkoMTA3NSwgNjkwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ3NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiUGFydCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCSAgICB3aWR0aCAgICAgIAk0OTINCi0JCSAgICBoZWlnaHQgICAgIAkyNzYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM0OQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBOTZEMDJGMSINCi0JCSAgICBjbGllbnQgICAgIAlAMzQ4DQotCQkgICAgc3VwcGxpZXIgICAJQDM0Nw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzMDQsIDY3OCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwNCwgMzg2KSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDM1MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDQ4LCA2NTYpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM1MA0KLQkJCWxvY2F0aW9uICAgCSgyNDEsIDUwNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkgICAgd2lkdGggICAgICAJNDMyDQotCQkgICAgaGVpZ2h0ICAgICAJMzIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNTENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QThEMTAyQkEiDQotCQkgICAgY2xpZW50ICAgICAJQDM1MA0KLQkJICAgIHN1cHBsaWVyICAgCUAzNDYNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NDUsIDQ5NSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCAzODgpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEAzNTINCi0JCSAgICBsb2NhdGlvbiAgIAkoNjg4LCA5NTIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFQkUwMEUyIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVQYXJ0cyIgQDM1Mw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAzMjgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NA0KLQkJCQlQYXJlbnRfVmlldyAJQDM1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoOTUyLCA4OTcpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE0NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZVBhcnRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5NzQ1Mg0KLQkJCQloZWlnaHQgICAgIAk1Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNjEiDQotCQkJICAgIGNsaWVudCAgICAgCUAzNTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDM0OA0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA5NTIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDM1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoOTg3LCAxMDA1KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc4OTgwOQ0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU2DQotCQkJCVBhcmVudF9WaWV3IAlAMzUzDQotCQkJCWxvY2F0aW9uICAgCSg5NjcsIDEwNjEpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuNzQyMDM4DQotCQkJCWhlaWdodCAgICAgCTEwOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMiIgQDM1Nw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Mg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAzMjgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OA0KLQkJCQlQYXJlbnRfVmlldyAJQDM1Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNDA0LCA4OTMpDQotCQkJCWhpZGRlbiAgICAgCVRSVUUNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNTciDQotCQkJICAgIGNsaWVudCAgICAgCUAzNTINCi0JCQkgICAgc3VwcGxpZXIgICAJQDM1MA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDY4OCwgOTUyKQ0KLQkJCQkoNDQ1LCA5NTIpDQotCQkJCSg0NDUsIDgxNykpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDk1MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NSwgODE3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAzNTcNCi0JCQkJbG9jYXRpb24gICAJKDM5MywgOTEyKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc0NzYwNA0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkpKSkpDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLkhUVFAuY2F0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLkhUVFAuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjAyODgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2UvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5ncy5IVFRQLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTQyDQotICAgIF93cml0dGVuICAgCSJSb3NlIDQuNS44MDU0YSINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJodHRwIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgcXVpZCAgICAgICAJIjNBQkZEOUFEMDFGOCINCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzcyAiSFRUUEJpbmRpbmciDQotCSAgICBxdWlkICAgICAgIAkiM0FCRkU1N0MwMTM2Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNUZGMUQwMDE5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJiIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUJGRTYwRDAwREIiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJIVFRQT3BlcmF0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNBQkZFNkFFMDA1MCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTVGRjRCMDM3QyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNBQkZFNzBEMDE0NyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIkhUVFBVcmxSZXBsYWNlbWVudCINCi0JICAgIHF1aWQgICAgICAgCSIzQUJGRUExQTAxN0MiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUU3MjhCODAyQzMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJIVFRQVXJsRW5jb2RlZCINCi0JICAgIHF1aWQgICAgICAgCSIzQUJGRUE2RDAyOTQiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUU3MjhENTAwOTQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJIVFRQQWRkcmVzcyINCi0JICAgIHF1aWQgICAgICAgCSIzQUMzQkYyNTAwRjUiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUU1RkVBOTAxQjciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUMzQkZBNzAxMkUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJQb3J0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBQzExRTUyMDFGQiINCi0JICAgIHRpdGxlICAgICAgCSJQb3J0Ig0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBBZGRyZXNzIiBAMQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzM2LCA0MzIpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMTM1LCAzNTEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDAyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIVFRQQWRkcmVzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBQzNCRjI1MDBGNSINCi0JCSAgICB3aWR0aCAgICAgIAk0MjANCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRXh0ZW5zaWJpbGl0eSINCi0JICAgIHF1aWQgICAgICAgCSIzQUU1RkUzQjAzN0IiDQotCSAgICB0aXRsZSAgICAgIAkiRXh0ZW5zaWJpbGl0eSINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgMTI4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoNzAsIDUzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQwNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkgICAgd2lkdGggICAgICAJNDIyDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBBZGRyZXNzIiBAMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzIsIDQ4MCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgxMjgsIDQyOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkhUVFBBZGRyZXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDM0JGMjUwMEY1Ig0KLQkJICAgIHdpZHRoICAgICAgCTMwNg0KLQkJICAgIGhlaWdodCAgICAgCTEyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQQmluZGluZyIgQDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDgwLCA2NDApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQNCi0JCQlsb2NhdGlvbiAgIAkoMzQ0LCA1ODgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIVFRQQmluZGluZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBQkZFNTdDMDEzNiINCi0JCSAgICB3aWR0aCAgICAgIAkyOTANCi0JCSAgICBoZWlnaHQgICAgIAkxMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1DQotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgMzA1KQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDI3MiwgMzA1KQ0KLQkJCSgyNzIsIDIxNSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTVGRUE5MDFCNyINCi0JCSAgICBjbGllbnQgICAgIAlAMw0KLQkJICAgIHN1cHBsaWVyICAgCUAyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjcyLCA0MTYpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3MiwgMzA1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFNUZGMUQwMDE5Ig0KLQkJICAgIGNsaWVudCAgICAgCUA0DQotCQkgICAgc3VwcGxpZXIgICAJQDINCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NzUsIDU3NikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDc1LCAzMDUpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUE9wZXJhdGlvbiIgQDgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjcyLCA4MTYpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDgNCi0JCQlsb2NhdGlvbiAgIAkoNTE4LCA3NjQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzA4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIVFRQT3BlcmF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FCRkU2QUUwMDUwIg0KLQkJICAgIHdpZHRoICAgICAgCTMyNg0KLQkJICAgIGhlaWdodCAgICAgCTEyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTVGRjRCMDM3QyINCi0JCSAgICBjbGllbnQgICAgIAlAOA0KLQkJICAgIHN1cHBsaWVyICAgCUAyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjU2LCA3NTIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY1NiwgMzA1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxSZXBsYWNlbWVudCIgQDEwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDgxNiwgOTkyKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCWxvY2F0aW9uICAgCSg2MDUsIDk0MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkhUVFBVcmxSZXBsYWNlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBQkZFQTFBMDE3QyINCi0JCSAgICB3aWR0aCAgICAgIAk0NDANCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFNzI4QjgwMkMzIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMA0KLQkJICAgIHN1cHBsaWVyICAgCUAyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODY5LCA5MjkpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg2OSwgMzA1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxFbmNvZGVkIiBAMTINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3MiwgMTE2OCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTINCi0JCQlsb2NhdGlvbiAgIAkoOTAwLCAxMTE3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM0NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiSFRUUFVybEVuY29kZWQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUJGRUE2RDAyOTQiDQotCQkgICAgd2lkdGggICAgICAJMzYyDQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTcyOEQ1MDA5NCINCi0JCSAgICBjbGllbnQgICAgIAlAMTINCi0JCSAgICBzdXBwbGllciAgIAlAMg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExMDMsIDExMDUpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMDMsIDMwNSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1KSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJCaW5kaW5nIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRTcyQTcwMDBBOSINCi0JICAgIHRpdGxlICAgICAgCSJCaW5kaW5nIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBCaW5kaW5nIiBAMTQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDMzNiwgMjcyKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNA0KLQkJCWxvY2F0aW9uICAgCSgyMDAsIDIyMCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkhUVFBCaW5kaW5nIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FCRkU1N0MwMTM2Ig0KLQkJICAgIHdpZHRoICAgICAgCTI5MA0KLQkJICAgIGhlaWdodCAgICAgCTEyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQT3BlcmF0aW9uIiBAMTUNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDcyMCwgMjcyKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCWxvY2F0aW9uICAgCSg1MTksIDE5MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MDINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkhUVFBPcGVyYXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUJGRTZBRTAwNTAiDQotCQkgICAgd2lkdGggICAgICAJNDIwDQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxSZXBsYWNlbWVudCIgQDE2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4NDgsIDU5MikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTYNCi0JCQlsb2NhdGlvbiAgIAkoNjM3LCA1NDEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDIyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJIVFRQVXJsUmVwbGFjZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUJGRUExQTAxN0MiDQotCQkgICAgd2lkdGggICAgICAJNDQwDQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxFbmNvZGVkIiBAMTcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDM4NCwgNTkyKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxNw0KLQkJCWxvY2F0aW9uICAgCSgyMTIsIDU0MSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNDQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkhUVFBVcmxFbmNvZGVkIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FCRkVBNkQwMjk0Ig0KLQkJICAgIHdpZHRoICAgICAgCTM2Mg0KLQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKSkpKSkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuTUlNRS5jYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuTUlNRS5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NDVhMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLk1JTUUuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsNjMwICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNDINCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNC41LjgwNTRhIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm1pbWUiDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBxdWlkICAgICAgIAkiM0FDOTEyN0MwMjY2Ig0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJNSU1FQ29udGVudCINCi0JICAgIHF1aWQgICAgICAgCSIzQUM5MTM1QjAzQTciDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUVGMTFDQTAzOEUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNBQzkxOTcxMDM2QiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIk1JTUVQYXJ0Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBQzkxM0VFMDBFQiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRUYxMTQwMDI1OSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFOEIxQUIwMTVEIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiTUlNRU11bHRpcGFydFJlbGF0ZWQiDQotCSAgICBxdWlkICAgICAgIAkiM0FDOTEzRkEwMjVCIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFRjExRDUwMzMwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiTUlNRU1pbWVYbWwiDQotCSAgICBxdWlkICAgICAgIAkiM0FDOTE0NUEwMUZGIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFRjExREQwMzhCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JICAgIHF1aWQgICAgICAgCSIzQUU3M0IzQzAzNTYiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNzNCM0QwMDkwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTM1QjAzQTciKQ0KLQkJKG9iamVjdCBSb2xlICJwYXJ0Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzQUU3M0IzRDAwOUEiDQotCQkgICAgbGFiZWwgICAgICAJInBhcnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiINCi0JICAgIHF1aWQgICAgICAgCSIzQUU3M0JCOTAwRDUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAicGFydCINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNzNCQjkwM0NFIg0KLQkJICAgIGxhYmVsICAgICAgCSJwYXJ0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQUU3M0JCOTAzRTIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU1pbWVYbWwiDQotCQkgICAgcXVpZHUgICAgICAJIjNBQzkxNDVBMDFGRiIpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCINCi0JICAgIHF1aWQgICAgICAgCSIzQUVGMTJGRTAzODciDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFRjEzMDAwMEQ3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNdWx0aXBhcnRSZWxhdGVkIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTNGQTAyNUIiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlbGVtZW50cyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FFRjEzMDAwMEUxIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbGVtZW50cyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FUGFydCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzRUUwMEVCIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQmluZGluZ3MiDQotCSAgICBxdWlkICAgICAgIAkiM0FDOTEyOEIwMUY5Ig0KLQkgICAgdGl0bGUgICAgICAJIkJpbmRpbmdzIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTU2DQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FQ29udGVudCIgQDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4NTYsIDMzNikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSgxNzE0LCAyNTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNSU1FQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBQzkxMzVCMDNBNyINCi0JCSAgICB3aWR0aCAgICAgIAkzMDINCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUwNCwgNzg0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDEzNTQsIDU1NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlBhcnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkgICAgd2lkdGggICAgICAJMzE4DQotCQkgICAgaGVpZ2h0ICAgICAJNDgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTcyMiwgNTA1KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRTczQjNDMDM1NiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBANA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMjYsIC03MjcpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFNzNCM0QwMDkwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcnQiIEA1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMyNiwgLTcyNykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANg0KLQkJCQlQYXJlbnRfVmlldyAJQDUNCi0JCQkJbG9jYXRpb24gICAJKDE3NDAsIDUwOCkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJOTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3BhcnQiDQotCQkJCXBjdERpc3QgICAgCS0wLjA5NzkzNA0KLQkJCQloZWlnaHQgICAgIAkxNg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUU3M0IzRDAwOUEiDQotCQkJICAgIGNsaWVudCAgICAgCUAzDQotCQkJICAgIHN1cHBsaWVyICAgCUAyDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANw0KLQkJCQlQYXJlbnRfVmlldyAJQDUNCi0JCQkJbG9jYXRpb24gICAJKDE3MzQsIDU2OSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC40NDkxMDMNCi0JCQkJaGVpZ2h0ICAgICAJNDkNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNaW1lWG1sIiBAOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIxNiwgMzIwKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4DQotCQkJbG9jYXRpb24gICAJKDEwNjEsIDI2OCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIk1JTUVNaW1lWG1sIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTE0NUEwMUZGIg0KLQkJICAgIHdpZHRoICAgICAgCTMyOA0KLQkJICAgIGhlaWdodCAgICAgCTEyOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEA5DQotCQkgICAgbG9jYXRpb24gICAJKDEzMDQsIDQ2MykNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUU3M0JCOTAwRDUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicGFydCIgQDEwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE4NCwgLTExODUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExDQotCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJbG9jYXRpb24gICAJKDEzMTEsIDQ3OSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJOTYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3BhcnQiDQotCQkJCXBjdERpc3QgICAgCTAuMTc3OTQxDQotCQkJCWhlaWdodCAgICAgCTQNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFNzNCQjkwM0NFIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMg0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyDQotCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJbG9jYXRpb24gICAJKDEyNzIsIDU1NCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42NTIyNzANCi0JCQkJaGVpZ2h0ICAgICAJNzYNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEAxMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDkNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xODQsIC0xMTg1KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRTczQkI5MDNFMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDgNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTXVsdGlwYXJ0UmVsYXRlZCIgQDE0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDMyMCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQlsb2NhdGlvbiAgIAkoMzEyLCAyNjkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDMyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNSU1FTXVsdGlwYXJ0UmVsYXRlZCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBQzkxM0ZBMDI1QiINCi0JCSAgICB3aWR0aCAgICAgIAk0NTANCi0JCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRVBhcnQiIEAxNQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTI4LCA4NDgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE1DQotCQkJbG9jYXRpb24gICAJKDM4MCwgNzY3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI5Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTUlNRVBhcnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTNFRTAwRUIiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDE1DQotCQkJbG9jYXRpb24gICAJKDM4MCwgODI3KQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkzMDMpDQotCQkgICAgd2lkdGggICAgICAJMzE0DQotCQkgICAgaGVpZ2h0ICAgICAJMTg2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDE2DQotCQkgICAgbG9jYXRpb24gICAJKDUyOCwgNTY4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRUYxMkZFMDM4NyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1IiBAMTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNg0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMCwgLTEzNikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUVGMTMwMDAwRDciDQotCQkJICAgIGNsaWVudCAgICAgCUAxNg0KLQkJCSAgICBzdXBwbGllciAgIAlAMTQNCi0JCQkgICAgbGluZV9zdHlsZSAJMCkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50cyIgQDE4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTYNCi0JCQkgICAgbG9jYXRpb24gICAJKDAsIC0xMzYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5DQotCQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQkJbG9jYXRpb24gICAJKDUzNSwgNjI3KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxOTINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VsZW1lbnRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjMyMDAwMA0KLQkJCQloZWlnaHQgICAgIAk3DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRUYxMzAwMDBFMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDE2DQotCQkJICAgIHN1cHBsaWVyICAgCUAxNQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwDQotCQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQkJbG9jYXRpb24gICAJKDQ3MSwgNzE2KQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc5NDExOA0KLQkJCQloZWlnaHQgICAgIAk1OA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjENCi0JCQkJUGFyZW50X1ZpZXcgCUAxOA0KLQkJCQlsb2NhdGlvbiAgIAkoNjM2LCA3MzQpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1OQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTEwOA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRXh0ZW5zaWJpbGl0eSINCi0JICAgIHF1aWQgICAgICAgCSIzQUU3M0FBMzAzMkUiDQotCSAgICB0aXRsZSAgICAgIAkiRXh0ZW5zaWJpbGl0eSINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDIyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0MDAsIDE3NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCWxvY2F0aW9uICAgCSgxMzgsIDQyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUyNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkgICAgd2lkdGggICAgICAJNTQyDQotCQkgICAgaGVpZ2h0ICAgICAJMjkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEzNDQsIDE5MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMw0KLQkJCWxvY2F0aW9uICAgCSgxMTE1LCA4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ1OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkgICAgd2lkdGggICAgICAJNDc2DQotCQkgICAgaGVpZ2h0ICAgICAJMzkyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiIiBAMjQNCi0JCSAgICBsb2NhdGlvbiAgIAkoODg4LCAxODMpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiIgQDI1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQNCi0JCQkgICAgbG9jYXRpb24gICAJKDUzNiwgMjMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2DQotCQkJCVBhcmVudF9WaWV3IAlAMjUNCi0JCQkJbG9jYXRpb24gICAJKDcxNCwgMjIyKQ0KLQkJCQloaWRkZW4gICAgIAlUUlVFDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI0DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMg0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3DQotCQkJCVBhcmVudF9WaWV3IAlAMjUNCi0JCQkJbG9jYXRpb24gICAJKDY5NCwgMjMzKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDI4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQNCi0JCQkgICAgbG9jYXRpb24gICAJKDUzNiwgMjMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5DQotCQkJCVBhcmVudF9WaWV3IAlAMjgNCi0JCQkJbG9jYXRpb24gICAJKDk5NiwgMjI1KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NTcNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXBjdERpc3QgICAgCTAuNTAxNTM4DQotCQkJCWhlaWdodCAgICAgCTQxDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCINCi0JCQkgICAgY2xpZW50ICAgICAJQDI0DQotCQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwDQotCQkJCVBhcmVudF9WaWV3IAlAMjgNCi0JCQkJbG9jYXRpb24gICAJKDEwNjksIDEzMikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC44Mjk2MzANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNaW1lWG1sIiBAMzENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1MDQsIDc4NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzENCi0JCQlsb2NhdGlvbiAgIAkoMTM0OSwgNzMzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMxMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTUlNRU1pbWVYbWwiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTQ1QTAxRkYiDQotCQkgICAgd2lkdGggICAgICAJMzI4DQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNdWx0aXBhcnRSZWxhdGVkIiBAMzINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyNDgsIDYwOCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzINCi0JCQlsb2NhdGlvbiAgIAkoMTAzMiwgNTU3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQzMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTUlNRU11bHRpcGFydFJlbGF0ZWQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTNGQTAyNUIiDQotCQkgICAgd2lkdGggICAgICAJNDUwDQotCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVQYXJ0IiBAMzMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNDAwLCA3NTIpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJbG9jYXRpb24gICAJKDI5NSwgNzAwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTIxMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTUlNRVBhcnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTNFRTAwRUIiDQotCQkgICAgd2lkdGggICAgICAJMjI4DQotCQkgICAgaGVpZ2h0ICAgICAJMTI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRUYxMTQwMDI1OSINCi0JCSAgICBjbGllbnQgICAgIAlAMzMNCi0JCSAgICBzdXBwbGllciAgIAlAMjINCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FQ29udGVudCIgQDM1DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE3MjgsIDk3NikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzUNCi0JCQlsb2NhdGlvbiAgIAkoMTU4NywgOTI0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI4Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiTUlNRUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTM1QjAzQTciDQotCQkgICAgd2lkdGggICAgICAJMzAwDQotCQkgICAgaGVpZ2h0ICAgICAJMTI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzYNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM0NCwgNTQ5KQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxMzQ0LCA1NDkpDQotCQkJKDEzNDQsIDM4OCkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUVGMTFERDAzOEIiDQotCQkgICAgY2xpZW50ICAgICAJQDMxDQotCQkgICAgc3VwcGxpZXIgICAJQDIzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU0MSwgNzIxKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTQxLCA1NDkpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzYpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRUYxMUQ1MDMzMCINCi0JCSAgICBjbGllbnQgICAgIAlAMzINCi0JCSAgICBzdXBwbGllciAgIAlAMjMNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzQ3LCA1NDUpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzNDcsIDU0OSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzNikNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFRjExQ0EwMzhFIg0KLQkJICAgIGNsaWVudCAgICAgCUAzNQ0KLQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3MjIsIDkxMikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcyMiwgNTQ5KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDM2KSkpKSkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuU09BUC5jYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuU09BUC5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNmViZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLlNPQVAuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsOTQ1ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNDINCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNC41LjgwNTRhIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInNvYXAiDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBxdWlkICAgICAgIAkiM0EwMUNGMEMwMUEyIg0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJTT0FQQmluZGluZyINCi0JICAgIHF1aWQgICAgICAgCSIzQTAxRDNCOTAxQUQiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUUwOUEzODAxQUIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRyYW5zcG9ydFVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0EwMUQzREYwMUU0Ig0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3R5bGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNBMDFEM0YxMDI5RSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNPQVBCb2R5Ig0KLQkgICAgcXVpZCAgICAgICAJIjNBMDFERUQ1MDMxRiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5QTQ1MDA0MSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQTAxRTJENTAxQTUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNBOTM0NzdDMDFCMiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nU3R5bGVzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzRUU0QTREQjAwNzIiDQotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiDQotCQkgICAgdHlwZSAgICAgICAJIklTdHJpbmciKSkNCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikNCi0JKG9iamVjdCBDbGFzcyAiU09BUEhlYWRlckJhc2UiDQotCSAgICBxdWlkICAgICAgIAkiM0EwMURFRTcwMzREIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDlBM0UwMzI2Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDYyRTlDMDA1NiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjJFQTIwMjVEIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW5jb2RpbmdTdHlsZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFRTRBNThGMDFBRSINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiINCi0JCSAgICB0eXBlICAgICAgIAkiSVN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTT0FQRmF1bHQiDQotCSAgICBxdWlkICAgICAgIAkiM0EwNkQ5RkEwMEY3Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDlBNEEwMDIwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNBMDk4MjFBMDEyQiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjIwNDgwM0FFIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW5jb2RpbmdTdHlsZXMiDQotCQkgICAgcXVpZCAgICAgICAJIjNFRTRBNTYzMDNBRiINCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiINCi0JCSAgICB0eXBlICAgICAgIAkiSVN0cmluZyIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTT0FQT3BlcmF0aW9uIg0KLQkgICAgcXVpZCAgICAgICAJIjNBMEFENDU1MDBFOCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5QTRFMDMxRiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic29hcEFjdGlvblVSSSINCi0JCSAgICBxdWlkICAgICAgIAkiM0EwQUQ0NjQwMDRBIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3R5bGUiDQotCQkgICAgcXVpZCAgICAgICAJIjNBMEFENDZDMDE4QyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNPQVBBZGRyZXNzIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRDFGRjc1MDI4NyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5NTM1MDA5OCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDIxMUM5MDI1QyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIlNPQVBIZWFkZXJGYXVsdCINCi0JICAgIHF1aWQgICAgICAgCSIzQUQ2MzJCODAzREQiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MzMzNDAwMzgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEhlYWRlckJhc2UiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMDFERUU3MDM0RCIpKQ0KLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkob2JqZWN0IENsYXNzICJTT0FQSGVhZGVyIg0KLQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzA5MDE2RCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzMwMDE3RCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSINCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIikpDQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpDQotCShvYmplY3QgQ2xhc3MgIklTdHJpbmciDQotCSAgICBxdWlkICAgICAgIAkiM0I4REQ5MEMwMjIwIg0KLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubGFuZy5TdHJpbmciDQotCQkgICAgcXVpZCAgICAgICAJIjNCOEREOTMyMDM4MyINCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkgICAgcXVpZCAgICAgICAJIjNBMDZFMEI1MDAzNiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQTA2RTBCNjAwQzQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJvZHkiDQotCQkgICAgcXVpZHUgICAgICAJIjNBMDFERUQ1MDMxRiIpDQotCQkob2JqZWN0IFJvbGUgInBhcnRzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzQTA2RTBCNjAwQzUiDQotCQkgICAgbGFiZWwgICAgICAJInBhcnRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCSAgICBxdWlkICAgICAgIAkiM0FENjJERTYwMTMwIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIm1lc3NhZ2UiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDYyREU3MDA0QiINCi0JCSAgICBsYWJlbCAgICAgIAkibWVzc2FnZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjJERTcwMDU1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVFNzAzNEQiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiDQotCSAgICBxdWlkICAgICAgIAkiM0FENjJERjgwMkQxIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInBhcnQiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDYyREZBMDAwMiINCi0JCSAgICBsYWJlbCAgICAgIAkicGFydCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSINCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjJERkEwMDAzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVFNzAzNEQiKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiDQotCSAgICBxdWlkICAgICAgIAkiM0FENjMzMzcwMUNEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDciDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzM3MDM3MiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMwOTAxNkQiDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJoZWFkZXJGYXVsdHMiDQotCQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzM3MDM3MyINCi0JCSAgICBsYWJlbCAgICAgIAkiaGVhZGVyRmF1bHRzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJGYXVsdCINCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENjMyQjgwM0REIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQmluZGluZyINCi0JICAgIHF1aWQgICAgICAgCSIzQTAxQ0YyMzAyOUYiDQotCSAgICB0aXRsZSAgICAgIAkiQmluZGluZyINCi0JICAgIHpvb20gICAgICAgCTg3DQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTMyNA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJpbmRpbmciIEAxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNzIsIDIwOCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSg1NSwgMTAwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQzNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUEJpbmRpbmciKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxRDNCOTAxQUQiDQotCQkgICAgd2lkdGggICAgICAJNDUyDQotCQkgICAgaGVpZ2h0ICAgICAJMjQwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBPcGVyYXRpb24iIEAyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDQwLCAyMDgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoODAzLCAxMDApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDc0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTT0FQT3BlcmF0aW9uIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwQUQ0NTUwMEU4Ig0KLQkJICAgIHdpZHRoICAgICAgCTQ5Mg0KLQkJICAgIGhlaWdodCAgICAgCTI0MA0KLQkJICAgIGFubm90YXRpb24gCTgpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXIiIEAzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1NjAsIDk2MCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSgzOTUsIDkwNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMzANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNPQVBIZWFkZXIiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMwOTAxNkQiDQotCQkgICAgd2lkdGggICAgICAJMzQ4DQotCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJGYXVsdCIgQDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEzNjAsIDk2MCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgxMTQyLCA5MDcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDM2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTT0FQSGVhZGVyRmF1bHQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzJCODAzREQiDQotCQkgICAgd2lkdGggICAgICAJNDU0DQotCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTMzLCA5NjEpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENjMzMzcwMUNEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDciIEA2DQotCQkJICAgIFBhcmVudF9WaWV3IAlANQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc3LCAtNTQzKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDYzMzM3MDM3MiINCi0JCQkgICAgY2xpZW50ICAgICAJQDUNCi0JCQkgICAgc3VwcGxpZXIgICAJQDMNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkzMywgOTYxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzM0LCA5NjEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImhlYWRlckZhdWx0cyIgQDcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzcsIC01NDMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgNCi0JCQkJUGFyZW50X1ZpZXcgCUA3DQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDkyMSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzQ2DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitoZWFkZXJGYXVsdHMiDQotCQkJCXBjdERpc3QgICAgCS0wLjAzMDcwMg0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMzNzAzNzMiDQotCQkJICAgIGNsaWVudCAgICAgCUA1DQotCQkJICAgIHN1cHBsaWVyICAgCUA0DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzMsIDk2MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMzMsIDk2MSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDcNCi0JCQkJbG9jYXRpb24gICAJKDEwODAsIDkyNCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC43MzY4NDINCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwDQotCQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCQlsb2NhdGlvbiAgIAkoMTA1NiwgOTk5KQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTENCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjYxNDAzNQ0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDExDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgNDk2KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCWxvY2F0aW9uICAgCSgxNzAxLCA0MTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjQ2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJICAgIHdpZHRoICAgICAgCTI2NA0KLQkJICAgIGhlaWdodCAgICAgCTE3OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSIgQDEyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDQwLCA1MjgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEyDQotCQkJbG9jYXRpb24gICAJKDc5NCwgNDIwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ5Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUEhlYWRlckJhc2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVFNzAzNEQiDQotCQkgICAgd2lkdGggICAgICAJNTEwDQotCQkgICAgaGVpZ2h0ICAgICAJMjQwDQotCQkgICAgYW5ub3RhdGlvbiAJOCkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ5MywgNDg1KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDYyREU2MDEzMCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXNzYWdlIiBAMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzQxLCAtNjgzKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJCWxvY2F0aW9uICAgCSgxNTc0LCA1MTUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTI1Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbWVzc2FnZSINCi0JCQkJcGN0RGlzdCAgICAJMC40MTIzMjINCi0JCQkJaGVpZ2h0ICAgICAJMzANCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENjJERTcwMDRCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDExDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkzLCA0ODUpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjkyLCA0ODUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2DQotCQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQkJbG9jYXRpb24gICAJKDE2MzAsIDQ0OCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC42ODcyMDQNCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEAxNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzDQotCQkJICAgIGxvY2F0aW9uICAgCSgzNDEsIC02ODMpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4DQotCQkJCVBhcmVudF9WaWV3IAlAMTcNCi0JCQkJbG9jYXRpb24gICAJKDE0MjAsIDUyNSkNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxOTINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjM3MjI1NA0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MkRFNzAwNTUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0OTMsIDQ4NSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTUsIDQ4NSkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJvZHkiIEAxOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA0MCwgMTM0NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTkNCi0JCQlsb2NhdGlvbiAgIAkoNzk0LCAxMjM2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ5Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUEJvZHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVENTAzMUYiDQotCQkgICAgd2lkdGggICAgICAJNTEwDQotCQkgICAgaGVpZ2h0ICAgICAJMjQwDQotCQkgICAgYW5ub3RhdGlvbiAJOCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDIwDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDEyMDApDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIwDQotCQkJbG9jYXRpb24gICAJKDE2MjgsIDk1NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzOTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlBhcnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkgICAgd2lkdGggICAgICAJNDEwDQotCQkgICAgaGVpZ2h0ICAgICAJNTEyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDIxDQotCQkgICAgbG9jYXRpb24gICAJKDE1OTAsIDcwNCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MkRGODAyRDEiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAicGFydCIgQDIyDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjENCi0JCQkgICAgbG9jYXRpb24gICAJKDQzOCwgLTQ2NCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMNCi0JCQkJUGFyZW50X1ZpZXcgCUAyMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTkxNywgODg2KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3BhcnQiDQotCQkJCXBjdERpc3QgICAgCTAuODgxNDY1DQotCQkJCWhlaWdodCAgICAgCTkwDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBRDYyREZBMDAwMiINCi0JCQkgICAgY2xpZW50ICAgICAJQDIxDQotCQkJICAgIHN1cHBsaWVyICAgCUAyMA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDE1OTAsIDcwNCkNCi0JCQkJKDE4MjcsIDcwNCkNCi0JCQkJKDE4MjcsIDk0NCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTkwLCA3MDQpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI3LCA5NDQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0DQotCQkJCVBhcmVudF9WaWV3IAlAMjINCi0JCQkJbG9jYXRpb24gICAJKDE3NzQsIDg4NikNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44ODE0NjUNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEAyNQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxDQotCQkJICAgIGxvY2F0aW9uICAgCSg0MzgsIC00NjQpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2DQotCQkJCVBhcmVudF9WaWV3IAlAMjUNCi0JCQkJbG9jYXRpb24gICAJKDEyMDksIDc0NikNCi0JCQkJaGlkZGVuICAgICAJVFJVRQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxMjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MkRGQTAwMDMiDQotCQkJICAgIGNsaWVudCAgICAgCUAyMQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxNTkwLCA3MDQpDQotCQkJCSgxMTcwLCA3MDQpDQotCQkJCSgxMTcwLCA2NDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU5MCwgNzA0KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3MCwgNjQ4KSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAyNw0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDU3LCAxMzkwKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMDZFMEI1MDAzNiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBAMjgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1LCAtOTE0KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjNBMDZFMEI2MDBDNCINCi0JCQkgICAgY2xpZW50ICAgICAJQDI3DQotCQkJICAgIHN1cHBsaWVyICAgCUAxOQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ1NywgMTM5MCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTUsIDEzOTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcnRzIiBAMjkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1LCAtOTE0KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMA0KLQkJCQlQYXJlbnRfVmlldyAJQDI5DQotCQkJCWxvY2F0aW9uICAgCSgxNTkxLCAxNDk0KQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3BhcnRzIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgzMzg1Ng0KLQkJCQloZWlnaHQgICAgIAkxMDQNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiM0EwNkUwQjYwMEM1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMjcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU3LCAxMzkwKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxOSwgMTM5MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU5MSwgMTM0NCkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC44MzM4NTYNCi0JCQkJaGVpZ2h0ICAgICAJNDcNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBGYXVsdCIgQDMyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDQwLCAxNjQ4KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzMg0KLQkJCWxvY2F0aW9uICAgCSg3OTQsIDE1NDApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDkyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTT0FQRmF1bHQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTA2RDlGQTAwRjciDQotCQkgICAgd2lkdGggICAgICAJNTEwDQotCQkgICAgaGVpZ2h0ICAgICAJMjQwDQotCQkgICAgYW5ub3RhdGlvbiAJOCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6SVN0cmluZyIgQDMzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI0MCwgMTM2MCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzMNCi0JCQlsb2NhdGlvbiAgIAkoNjYsIDEzMzIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzQ4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJJU3RyaW5nIikNCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzMNCi0JCQlsb2NhdGlvbiAgIAkoNjYsIDEyODIpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlhbmNob3IgICAgIAkxMA0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNDgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNCOEREOTBDMDIyMCINCi0JCSAgICB3aWR0aCAgICAgIAkzNjYNCi0JCSAgICBoZWlnaHQgICAgIAkxODANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDQwLCA3NTApDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDEyDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDEwNDAsIDc1MCkNCi0JCQkoMTA0MCwgNjQ4KSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDYzMzMwMDE3RCINCi0JCSAgICBjbGllbnQgICAgIAlAMw0KLQkJICAgIHN1cHBsaWVyICAgCUAxMg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0NSwgODk1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDUsIDc1MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzNCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENjMzMzQwMDM4Ig0KLQkJICAgIGNsaWVudCAgICAgCUA0DQotCQkgICAgc3VwcGxpZXIgICAJQDEyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTMxNiwgODk1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE2LCA3NTApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzQpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIlBvcnQiDQotCSAgICBxdWlkICAgICAgIAkiM0EwODVFMzAwMzVDIg0KLQkgICAgdGl0bGUgICAgICAJIlBvcnQiDQotCSAgICB6b29tICAgICAgIAk5MA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQQWRkcmVzcyIgQDM3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzNTIsIDMyMCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzcNCi0JCQlsb2NhdGlvbiAgIAkoMTUxLCAyMzkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDAyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTT0FQQWRkcmVzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDFGRjc1MDI4NyINCi0JCSAgICB3aWR0aCAgICAgIAk0MjANCi0JCSAgICBoZWlnaHQgICAgIAkxODYNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRXh0ZW5zaWJpbGl0eSINCi0JICAgIHF1aWQgICAgICAgCSIzQUUwOTlCMTAxNjEiDQotCSAgICB0aXRsZSAgICAgIAkiRXh0ZW5zaWJpbGl0eSINCi0JICAgIHpvb20gICAgICAgCTkwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTANCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBBZGRyZXNzIiBAMzgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgNTc2KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzOA0KLQkJCWxvY2F0aW9uICAgCSgxMzcxLCA1MjcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjk4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTT0FQQWRkcmVzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBRDFGRjc1MDI4NyINCi0JCSAgICB3aWR0aCAgICAgIAkzMTYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJpbmRpbmciIEAzOQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMDQsIDU5MikNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzkNCi0JCQlsb2NhdGlvbiAgIAkoMTYyLCA1NDMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTT0FQQmluZGluZyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMDFEM0I5MDFBRCINCi0JCSAgICB3aWR0aCAgICAgIAkzMDINCi0JCSAgICBoZWlnaHQgICAgIAkxMjINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJvZHkiIEA0MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMDcyLCAxMTA0KQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0MA0KLQkJCWxvY2F0aW9uICAgCSg5NTAsIDEwNTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjQ0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJTT0FQQm9keSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMDFERUQ1MDMxRiINCi0JCSAgICB3aWR0aCAgICAgIAkyNjINCi0JCSAgICBoZWlnaHQgICAgIAkxMjINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEZhdWx0IiBANDENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzMiwgMTI2NCkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDENCi0JCQlsb2NhdGlvbiAgIAkoMTExMiwgMTIxNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNPQVBGYXVsdCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjNBMDZEOUZBMDBGNyINCi0JCSAgICB3aWR0aCAgICAgIAkyNTgNCi0JCSAgICBoZWlnaHQgICAgIAkxMjINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUE9wZXJhdGlvbiIgQDQyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDUxMiwgNzUyKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0Mg0KLQkJCWxvY2F0aW9uICAgCSgzNDQsIDcwMykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIlNPQVBPcGVyYXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTBBRDQ1NTAwRTgiDQotCQkgICAgd2lkdGggICAgICAJMzU0DQotCQkgICAgaGVpZ2h0ICAgICAJMTIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIiBANDMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoODE2LCA5MjgpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQzDQotCQkJbG9jYXRpb24gICAJKDYyNywgODc5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiU09BUEhlYWRlckJhc2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVFNzAzNEQiDQotCQkgICAgd2lkdGggICAgICAJMzk2DQotCQkgICAgaGVpZ2h0ICAgICAJMTIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBANDQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg2MDgsIDEyOCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0NA0KLQkJCWxvY2F0aW9uICAgCSg0MDgsIDUzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQwMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkgICAgd2lkdGggICAgICAJNDE4DQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNjA4LCAzMDUpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDQ0DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDYwOCwgMzA1KQ0KLQkJCSg2MDgsIDIxNSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOUEzODAxQUIiDQotCQkgICAgY2xpZW50ICAgICAJQDM5DQotCQkgICAgc3VwcGxpZXIgICAJQDQ0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzQ0LCA1MzEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM0NCwgMzA1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDQ1KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOUEzRTAzMjYiDQotCQkgICAgY2xpZW50ICAgICAJQDQzDQotCQkgICAgc3VwcGxpZXIgICAJQDQ0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODE1LCA4NjcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxNSwgMzA1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDQ1KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOUE0NTAwNDEiDQotCQkgICAgY2xpZW50ICAgICAJQDQwDQotCQkgICAgc3VwcGxpZXIgICAJQDQ0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA2OCwgMTA0MykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2OCwgMzA1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDQ1KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOUE0RTAzMUYiDQotCQkgICAgY2xpZW50ICAgICAJQDQyDQotCQkgICAgc3VwcGxpZXIgICAJQDQ0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTA2LCA2OTEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUwNiwgMzA1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDQ1KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOUE0QTAwMjAiDQotCQkgICAgY2xpZW50ICAgICAJQDQxDQotCQkgICAgc3VwcGxpZXIgICAJQDQ0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMTIwMykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMSwgMzA1KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDQ1KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOTUzNTAwOTgiDQotCQkgICAgY2xpZW50ICAgICAJQDM4DQotCQkgICAgc3VwcGxpZXIgICAJQDQ0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTUyMCwgNTE1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTIwLCAzMDUpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDUpKSkpKQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2UvaHR0cC5tZGwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL2h0dHAubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmNlNzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2UvaHR0cC5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjM4MyArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTQyDQotICAgIF93cml0dGVuICAgCSJSb3NlIDQuNS44MDU0YSINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3Ig0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cw0KLQlyaWdodE1hcmdpbiAJMC4yNTAwMDANCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDANCi0JdG9wTWFyZ2luICAJMC4yNTAwMDANCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMA0KLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDANCi0JY2xpcEljb25MYWJlbHMgCVRSVUUNCi0JYXV0b1Jlc2l6ZSAJVFJVRQ0KLQlzbmFwVG9HcmlkIAlUUlVFDQotCWdyaWRYICAgICAgCTE2DQotCWdyaWRZICAgICAgCTE2DQotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQNCi0JICAgIHNpemUgICAgICAgCTEwDQotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JICAgIHVuZGVybGluZSAgCUZBTFNFDQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkgICAgY29sb3IgICAgICAJMA0KLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0Jc2hvd01lc3NhZ2VOdW0gCTENCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUNCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQ0KLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyINCi0JcXVpZCAgICAgICAJIjNBQkZEOUE3MDE1MSINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBQkZEOUE3MDE4QyINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciDQotCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxNTAiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkdSAgICAgIAkiM0FCRkQ5QTcwMTUyIg0KLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiaHR0cCINCi0JCXF1aWQgICAgICAgCSIzQUJGRDlBRDAxRjgiDQotCQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzICJIVFRQQmluZGluZyINCi0JCQlxdWlkICAgICAgIAkiM0FCRkU1N0MwMTM2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRTVGRjFEMDAxOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiNDA5ODQzRjEwM0MwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUEJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDNBNzAyRUIiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJiIg0KLQkJCQlxdWlkICAgICAgIAkiM0FCRkU2MEQwMERCIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkhUVFBPcGVyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNBQkZFNkFFMDA1MCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUU1RkY0QjAzN0MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0NDQ2MDJDQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDNGRjAyQkIiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNBQkZFNzBEMDE0NyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJIVFRQVXJsUmVwbGFjZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNBQkZFQTFBMDE3QyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUU3MjhCODAyQzMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0NEQyMDJDNSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBVcmxSZXBsYWNlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0NDk2MDBEOCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJIVFRQVXJsRW5jb2RlZCINCi0JCQlxdWlkICAgICAgIAkiM0FCRkVBNkQwMjk0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRTcyOEQ1MDA5NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiNDA5ODQ0OTEwMDA5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUFVybEVuY29kZWQiDQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDQ1NzAwNjMiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSFRUUEFkZHJlc3MiDQotCQkJcXVpZCAgICAgICAJIjNBQzNCRjI1MDBGNSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUU1RkVBOTAxQjciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0MEQ4MDBDNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBBZGRyZXNzIg0KLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQwODkwMUExIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQUMzQkZBNzAxMkUiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUhUVFBBZGRyZXNzIg0KLQkJCXF1aWQgICAgICAgCSI0MDk4NDA4OTAxQTEiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyINCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0MEE0MDEzQSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJJSFRUUEJpbmRpbmciDQotCQkJcXVpZCAgICAgICAJIjQwOTg0M0E3MDJFQiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiNDA5ODQzQ0EwMTc3Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklIVFRQT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSI0MDk4NDNGRjAyQkIiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiNDA5ODQ0MTMwMjA0Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklIVFRQVXJsRW5jb2RlZCINCi0JCQlxdWlkICAgICAgIAkiNDA5ODQ0NTcwMDYzIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQiDQotCQkJCXF1aWQgICAgICAgCSI0MDk4NDQ2RDAyMUMiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUhUVFBVcmxSZXBsYWNlbWVudCINCi0JCQlxdWlkICAgICAgIAkiNDA5ODQ0OTYwMEQ4Ig0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiNDA5ODQ0QUMwMUFCIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKSkNCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJQb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUMxMUU1MjAxRkIiDQotCQkJdGl0bGUgICAgICAJIlBvcnQiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQQWRkcmVzcyIgQDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NzIsIDc4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MSwgNzAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBBZGRyZXNzIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQzNCRjI1MDBGNSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MSwgNzYzKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA5KQ0KLQkJCQl3aWR0aCAgICAgIAk0MjANCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUEFkZHJlc3MiIEAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjcyLCAyODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzgsIDIyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUhUVFBBZGRyZXNzIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOCwgMTc5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQwODkwMUExIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4LCAyODkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDY1KQ0KLQkJCQl3aWR0aCAgICAgIAkxMDg2DQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDBEODAwQzQiDQotCQkJCWNsaWVudCAgICAgCUAxDQotCQkJCXN1cHBsaWVyICAgCUAyDQotCQkJCWxpbmVfc3R5bGUgCTApKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiRXh0ZW5zaWJpbGl0eSINCi0JCQlxdWlkICAgICAgIAkiM0FFNUZFM0IwMzdCIg0KLQkJCXRpdGxlICAgICAgCSJFeHRlbnNpYmlsaXR5Ig0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEA0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxMjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcwLCA1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkJCXdpZHRoICAgICAgCTQyMg0KLQkJCQloZWlnaHQgICAgIAkxNzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBBZGRyZXNzIiBANQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDQ4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOCwgNDI4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBBZGRyZXNzIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQzNCRjI1MDBGNSINCi0JCQkJd2lkdGggICAgICAJMzA2DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUEJpbmRpbmciIEA2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ4MCwgNjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQ0LCA1ODgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSFRUUEJpbmRpbmciKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FCRkU1N0MwMTM2Ig0KLQkJCQl3aWR0aCAgICAgIAkyOTANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDcNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMzA1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA0DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI3MiwgMzA1KQ0KLQkJCQkgICAgKDI3MiwgMjE1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUU1RkVBOTAxQjciDQotCQkJCWNsaWVudCAgICAgCUA1DQotCQkJCXN1cHBsaWVyICAgCUA0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzIsIDQxNikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MiwgMzA1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFNUZGMUQwMDE5Ig0KLQkJCQljbGllbnQgICAgIAlANg0KLQkJCQlzdXBwbGllciAgIAlANA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDc1LCA1NzYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NzUsIDMwNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQT3BlcmF0aW9uIiBAMTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjcyLCA4MTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTE4LCA3NjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzA4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSFRUUE9wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUJGRTZBRTAwNTAiDQotCQkJCXdpZHRoICAgICAgCTMyNg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTVGRjRCMDM3QyINCi0JCQkJY2xpZW50ICAgICAJQDEwDQotCQkJCXN1cHBsaWVyICAgCUA0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NTYsIDc1MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1NiwgMzA1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxSZXBsYWNlbWVudCIgQDEyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYwNSwgOTQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBVcmxSZXBsYWNlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUJGRUExQTAxN0MiDQotCQkJCXdpZHRoICAgICAgCTQ0MA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTcyOEI4MDJDMyINCi0JCQkJY2xpZW50ICAgICAJQDEyDQotCQkJCXN1cHBsaWVyICAgCUA0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjksIDkyOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2OSwgMzA1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxFbmNvZGVkIiBAMTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3MiwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDAsIDExMTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSFRUUFVybEVuY29kZWQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FCRkVBNkQwMjk0Ig0KLQkJCQl3aWR0aCAgICAgIAkzNjINCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUU3MjhENTAwOTQiDQotCQkJCWNsaWVudCAgICAgCUAxNA0KLQkJCQlzdXBwbGllciAgIAlANA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEwMywgMTEwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMDMsIDMwNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANykpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJCaW5kaW5nIg0KLQkJCXF1aWQgICAgICAgCSIzQUU3MkE3MDAwQTkiDQotCQkJdGl0bGUgICAgICAJIkJpbmRpbmciDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQQmluZGluZyIgQDE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCA1OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQwLCA1NDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSFRUUEJpbmRpbmciKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FCRkU1N0MwMTM2Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0MCwgNjAwKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc1KQ0KLQkJCQl3aWR0aCAgICAgIAkyOTANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQT3BlcmF0aW9uIiBAMTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjk2LCA2MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NSwgNTI3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FCRkU2QUUwMDUwIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDU4NykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOSkNCi0JCQkJd2lkdGggICAgICAJNDIwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUFVybFJlcGxhY2VtZW50IiBAMTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjE2LCAxODA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDUsIDE3NTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSFRUUFVybFJlcGxhY2VtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQkZFQTFBMDE3QyINCi0JCQkJd2lkdGggICAgICAJNDQwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUFVybEVuY29kZWQiIEAxOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDYwOCwgMTUyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MzYsIDE0NjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSFRUUFVybEVuY29kZWQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FCRkVBNkQwMjk0Ig0KLQkJCQl3aWR0aCAgICAgIAkzNjINCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUEJpbmRpbmciIEAyMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwLCAxMDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTA1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklIVFRQQmluZGluZyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAsIDUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQzQTcwMkVCIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwLCAxNjEpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDUwKQ0KLQkJCQl3aWR0aCAgICAgIAkxMDcwDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQzRjEwM0MwIg0KLQkJCQljbGllbnQgICAgIAlAMTYNCi0JCQkJc3VwcGxpZXIgICAJQDIwDQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBPcGVyYXRpb24iIEAyMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2OTYsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTUwLCAxMDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTA5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklIVFRQT3BlcmF0aW9uIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTUwLCA1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTA5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0M0ZGMDJCQiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTUwLCAxNjEpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDkwKQ0KLQkJCQl3aWR0aCAgICAgIAkxMTEwDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQ0NDYwMkNDIg0KLQkJCQljbGllbnQgICAgIAlAMTcNCi0JCQkJc3VwcGxpZXIgICAJQDIyDQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBVcmxFbmNvZGVkIiBAMjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDExMDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDEwNDUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTEyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklIVFRQVXJsRW5jb2RlZCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDk5NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTEyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0NDU3MDA2MyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NCwgMTEwNSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTExMjUpDQotCQkJCXdpZHRoICAgICAgCTExNDYNCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDQ5MTAwMDkiDQotCQkJCWNsaWVudCAgICAgCUAxOQ0KLQkJCQlzdXBwbGllciAgIAlAMjQNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUFVybFJlcGxhY2VtZW50IiBAMjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTg0LCAxMzc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk4MSwgMTMxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUhUVFBVcmxSZXBsYWNlbWVudCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTgxLCAxMjY3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQ0OTYwMEQ4Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk4MSwgMTM3NykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTEyMDMpDQotCQkJCXdpZHRoICAgICAgCTEyMjQNCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDREMjAyQzUiDQotCQkJCWNsaWVudCAgICAgCUAxOA0KLQkJCQlzdXBwbGllciAgIAlAMjYNCi0JCQkJbGluZV9zdHlsZSAJMCkpKSkpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3c2RsIg0KLQkJcXVpZCAgICAgICAJIjNBREZCOEU1MDIxRSINCi0JCWRvY3VtZW50YXRpb24gCQ0KLXxUaGUgV1NETCBtb2RlbCBjb250YWlucyBjbGFzc2VzIGZvciB0aGUgV2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIExhbmd1YWdlIChXU0RMKS4NCi18DQotfFdTREwgZGVzY3JpYmVzIG5ldHdvcmsgc2VydmljZXMgYXMgc2V0cyBvZiBlbmRwb2ludHMgb3BlcmF0aW5nIG9uIG1lc3NhZ2VzLiBUaGUgb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgYXJlIGRlc2NyaWJlZCBhYnN0cmFjdGx5LCBhbmQgdGhlbiBib3VuZCB0byBhIGNvbmNyZXRlIG5ldHdvcmsgcHJvdG9jb2wgYW5kIG1lc3NhZ2UgZm9ybWF0IHRvIGRlZmluZSBhbiBlbmRwb2ludC4NCi18DQotfFdTREwgZGVzY3JpYmVzIHRoZSBmb3JtYXRzIG9mIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYnkgdGhlIHNlcnZpY2VzLCBhbmQgc3VwcG9ydHMgdGhlIFhNTCBTY2hlbWFzIHNwZWNpZmljYXRpb24gYXMgaXRzIGNhbm9uaWNhbCB0eXBlIHN5c3RlbS4gVGhpcyBwYWNrYWdlIHVzZXMgYW4gWE1MIFNjaGVtYSBJbmZvc2V0IG1vZGVsIHBhY2thZ2UgKHNlZSB0aGUgWFNEIHBhY2thZ2UpIHRvIGRlc2NyaWJlIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdHMuDQotfA0KLXxUaGUgbW9kZWwgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkaWFncmFtcywgbmFtZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcHRlcnMgaW4gdGhlIFdTREwgMS4xIHNwZWNpZmljYXRpb24gKGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvTk9URS13c2RsLTIwMDEwMzE1KQ0KLXwtIDIuMSBEZWZpbml0aW9uLCBzaG93cyB0aGUgV1NETCBkZWZpbml0aW9uIGVsZW1lbnQgYW5kIHRoZSBXU0RMIGRvY3VtZW50IHN0cnVjdHVyZQ0KLXwtIDIuMS4xIE5hbWluZyBhbmQgTGlua2luZywgc2hvd3MgdGhlIG5hbWVzcGFjZSBhbmQgaW1wb3J0IG1lY2hhbmlzbQ0KLXwtIDIuMS4zIEV4dGVuc2liaWxpdHksIHNob3dzIHRoZSBXU0RMIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtDQotfC0gMi4yIFR5cGVzLCBzaG93cyB0aGUgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gV1NETA0KLXwtIDIuMyBNZXNzYWdlcywgMi40IFBvcnRUeXBlcywgMi41IEJpbmRpbmdzIGFuZCAyLjcgU2VydmljZXMsIHNob3cgdGhlIG1ham9yIFdTREwgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9ucy4NCi18DQotfFRoZSBXU0RMIGNsYXNzZXMgZXh0ZW5kIHRoZSBqYXZheC53c2RsIGludGVyZmFjZXMgZGVmaW5lZCBieSBKU1IgMTEwLiBDbGFzc2VzIHdpdGggaW50ZXJmYWNlIGFuZCBkYXRhdHlwZSBzdGVyZW90eXBlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlc2Ugbm9uLU1PRiBpbnRlcmZhY2VzLg0KLQkJDQotCQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzICJXU0RMRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0FENUM2QTMwMkREIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGxhbmd1YWdlIGVsZW1lbnQuIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEVuY2xvc2luZ0RlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTI5NjAwQzgiDQotCQkJCXJlc3VsdCAgICAgCSJEZWZpbml0aW9uIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEVuY2xvc2luZ0RlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTJCODAzNDciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJkZWZpbml0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIkRlZmluaXRpb24iKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvY3VtZW50YXRpb25FbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NDRTQ0MzYwMkEzIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzRjk3REJEMzAyMDciDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJQb3J0VHlwZSINCi0JCQlxdWlkICAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnRUeXBlIGVsZW1lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMSBhbmQgYW4gSW50ZXJmYWNlIGNvbXBvbmVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLiBBIHBvcnQgdHlwZSBvciBJbnRlcmZhY2UgaXMgYSBuYW1lZCBzZXQgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBhbmQgdGhlIGFic3RyYWN0IG1lc3NhZ2VzIGludm9sdmVkLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzlCNzAxNTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkQ4MDE5RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg4RTAwMjMiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUUzMDFFNSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThDREVCMDMxNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENEZEMDFCQSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudC4gQSBXU0RMIG9wZXJhdGlvbiBpcyBhbiBhYnN0cmFjdCBkZXNjcmlwdGlvbiBvZiBhbiBhY3Rpb24gc3VwcG9ydGVkIGJ5IGEgc2VydmljZS4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFOURFOTgwMDNDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZFMjAxNzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTc3NjAwRDEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHlsZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0NzI2MDFBQyINCi0JCQkJdHlwZSAgICAgICAJIk9wZXJhdGlvblR5cGUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0JERDk2NDMwMDRDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYyMzUwMDNFIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOENFMjIwMUFEIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ1MjAwMTFCIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk1lc3NhZ2UiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBtZXNzYWdlIGVsZW1lbnQuIEEgV1NETCBtZXNzYWdlIGlzIGFuIGFic3RyYWN0LCB0eXBlZCBkZWZpbml0aW9uIG9mIHRoZSBkYXRhIGJlaW5nIGNvbW11bmljYXRlZC4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQwNTUwMUM0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QThEMTAyQkEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4QUYwMDRGIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg3QzAxRkUiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUQyMDIyNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTRCMDJCMCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTQyMDBGMSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJQYXJ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcGFydCBlbGVtZW50LiBQYXJ0cyBkZXNjcmliZSB0aGUgbG9naWNhbCBhYnN0cmFjdCBjb250ZW50IG9mIGEgbWVzc2FnZS4gRWFjaCBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUgZnJvbSBzb21lIHR5cGUgc3lzdGVtLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NkQwMkYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOTNGMDFCRSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg5N0UyMzAyMzciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEI3MDNDOCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnROYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIwODcwM0RCIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEMzMDNDNSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmciDQotCQkJcXVpZCAgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBiaW5kaW5nIGVsZW1lbnQuIEEgYmluZGluZyBkZWZpbmVzIG1lc3NhZ2UgZm9ybWF0IGFuZCBwcm90b2NvbCBkZXRhaWxzIGZvciBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBkZWZpbmVkIGJ5IGEgcGFydGljdWxhciBwb3J0VHlwZS4gVGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgYmluZGluZ3MgZm9yIGEgZ2l2ZW4gcG9ydFR5cGUuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGQTBGMDJGMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NDEwMTI5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4OTkwMTRCIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjFGNDAxQTMiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0U2RDAxNTEiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRERjAzNUMiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ09wZXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcuIEFuIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBvcGVyYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIHdpdGhpbiB0aGUgYmluZGluZydzIHBvcnRUeXBlLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENjAwOTIwMkY3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QURFNDAxREMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlDNENCMDE5OSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJTZXJ2aWNlIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgc2VydmljZSBlbGVtZW50LiBBIHNlcnZpY2UgZ3JvdXBzIGEgc2V0IG9mIHJlbGF0ZWQgcG9ydHMgdG9nZXRoZXIuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGQTIwMDI1RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NEUwMUI0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJU2VydmljZSINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4QTQwMTUxIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjIwRDAyMDMiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDQ4MTAyMjAiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRDNTAxRTIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiUG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5MTcwMjg2Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnQgZWxlbWVudC4gQSBwb3J0IGRlZmluZXMgYW4gaW5kaXZpZHVhbCBlbmRwb2ludCBieSBzcGVjaWZ5aW5nIGEgc2luZ2xlIGFkZHJlc3MgZm9yIGEgYmluZGluZyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ2MDBDQjAwQUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQ1MDJDOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI4MDAzMjYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QTAwMzkxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LiBXU0RMIGFsbG93cyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHRlY2hub2xvZ3kgdW5kZXIgdmFyaW91cyBlbGVtZW50cyBkZWZpbmVkIGJ5IFdTREwuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMTQ5MDNEMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCRERGNTM1MDJDMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCINCi0JCQkJcXVpZCAgICAgICAJIjNBRjk1NDNDMDA3MyINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50VHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUIyMUEwMjcxIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIFdTREwgZG9jdW1lbnQuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGREI4MDNENCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRjgwMzgyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldERvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTRGQzIwMTJCIg0KLQkJCQlyZXN1bHQgICAgIAkiRE9NRG9jdW1lbnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTBERTAxRTciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJkb2N1bWVudCINCi0JCQkJCXR5cGUgICAgICAgCSJET01Eb2N1bWVudCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU0NzQwMDRFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSI0MDM1MkI3QzAzOTYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODU3MDJGNSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW5jb2RpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDAwRDAwMEQiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSW1wb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTRGOTAzREUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBXU0RMIGltcG9ydCBlbGVtZW50LiBXU0RMIGFsbG93cyBhc3NvY2lhdGluZyBhIG5hbWVzcGFjZSB3aXRoIGEgZG9jdW1lbnQgbG9jYXRpb24gdXNpbmcgYW4gaW1wb3J0IGVsZW1lbnQuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFRTU4MDM3QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjIwMEQwMzQwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5IikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjcyQzEwMzc5Ig0KLQkJCQlyZXN1bHQgICAgIAkiWFNEU2NoZW1hIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFNjaGVtYSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MkMxMDM5NyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInNjaGVtYSINCi0JCQkJCXR5cGUgICAgICAgCSJYU0RTY2hlbWEiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNTBBMDAzNiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU1MTQwMjExIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkJZG9jdW1lbnRhdGlvbiAJIiBXU0RMIGFsbG93cyBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IChyZWZlcnJlZCB0byBoZXJlIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMpIHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvaW50IG9mIGV4dGVuc2liaWxpdHkuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRTNDMDNENCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzEyQzAzQ0QiDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMTQ3MDI5NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dEVsZW1lbnQiDQotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSINCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudC4gQW4gaW5wdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MDQwMjVGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIyODAyRTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRUUwMzFEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3V0cHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQuIEFuIG91dHB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MEMwMzVCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzNTAwREQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRjgwMUNEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkZhdWx0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudC4gRmF1bHQgZWxlbWVudHMgc3BlY2lmeSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIGFueSBlcnJvciBtZXNzYWdlcyB0aGF0IG1heSBiZSBvdXRwdXQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUUxQzgyMDAyRjIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjNEMDMxOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSINCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMjAwMjAwMkQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nSW5wdXQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA4QTgyMDJENCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUUxQjAxMTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUI1OUIwMDcyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzQTQwMjAzIg0KLQkJCQlyZXN1bHQgICAgIAkiSUlucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzQjUwM0EyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSUlucHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxRUEwMjBFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPdXRwdXQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gb3V0cHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU0MzAyQUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFMjEwMTExIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNUE0MDI3RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNEOTAwRjEiDQotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0YxMDMyNiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dCINCi0JCQkJCXR5cGUgICAgICAgCSJJT3V0cHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMyMDIwMEJFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdGYXVsdCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEEgZmF1bHQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBmYXVsdCB3aXRoIHRoZSBzYW1lIG5hbWUuICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUUwOTM4NjAyQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTcxMDMzMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0MTMwMzdGIg0KLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0MjEwMTA5Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZmF1bHQiDQotCQkJCQl0eXBlICAgICAgIAkiSUZhdWx0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUJGOUUwMTRBIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlFOYW1lIg0KLQkJCXF1aWQgICAgICAgCSIzQUU4RUQyMjAxNDAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5RTmFtZSBjbGFzcy4gQSBRTmFtZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODQ5REE5MDAzRCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJOYW1lc3BhY2UiDQotCQkJcXVpZCAgICAgICAJIjNBRUEzQ0QzMDAzMCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmFtZXNwYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gYSBXU0RMIGRvY3VtZW50LiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0QyOTAxQjEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVmaXgiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0QzMjAyMzYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uVHlwZSINCi0JCQlxdWlkICAgICAgIAkiM0FFQjQ3ODIwMjRGIg0KLQkJCWRvY3VtZW50YXRpb24gCQ0KLXxPTkVfV0FZPTENCi18UkVRVUVTVF9SRVNQT05TRT0yDQotfFNPTElDSVRfUkVTUE9OU0U9Mw0KLXxOT1RJRklDQVRJT049NA0KLQkJCQ0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk9wZXJhdGlvblR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzM1MzAzRTMiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBvcnRUeXBlIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTVCRTAzMzEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5Qb3J0VHlwZSBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkFDMTAxQ0EiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iDQotCQkJCQl0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QkFGMDFBNCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCRjcwMzFBIg0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE2MzIwMDBEIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklPcGVyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCODRBNzc2MDBEMSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk9wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzQyMDA2NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImZhdWx0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNTkwMjhGIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM3MTAyQjEiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDODEwMUIwIg0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UGFyYW1ldGVyT3JkZXJpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM5OTAzMUQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJPcmRlciINCi0JCQkJCXR5cGUgICAgICAgCSJJTGlzdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0RTUwMThEIg0KLQkJCQlyZXN1bHQgICAgIAkiSUlucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyQzQwMTA3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSUlucHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRTQwMDk0Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJGMDAxRDIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTc5OTAxMkIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUlucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTdFRTAwMTUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbnB1dCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYzMzEwMEVGIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MzQ3MDI3NyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTgwMDAwMzkiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU91dHB1dCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE4MjkwMjdEIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQzQTAzNUQiDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NDUwMUM4Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTgzOTAxRDUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUZhdWx0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTg2MTAzMUQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5GYXVsdCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NkEwMEJEIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDc1MDEzMSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTg3MTAyMDgiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1lc3NhZ2UiDQotCQkJcXVpZCAgICAgICAJIjNCODRBOEFGMDA0RiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk1lc3NhZ2Ugbm9uLU1PRiBpbnRlcmZhY2UiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyMjQwMjczIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFydCINCi0JCQkJCXR5cGUgICAgICAgCSJJUGFydCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NzIzRDAyMzMiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVBhcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NzI1NDAyNUUiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9yZGVyZWRQYXJ0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjYxMDIwRCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnRPcmRlciINCi0JCQkJCXR5cGUgICAgICAgCSJJTGlzdCIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QThCQzAyNjAiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBhcnQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBOTNGMDFCRSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBhcnQgbm9uLU1PRiBpbnRlcmZhY2UiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25BdHRyaWJ1dGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODg0NTAwNTIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJ2YWx1ZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlleGNlcHRpb25zIAkiV1NETEV4Y2VwdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4QTAxMDFDMyINCi0JCQkJcmVzdWx0ICAgICAJIklJdGVyYXRvciINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25BdHRyaWJ1dGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEyRDAyRDUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJRTmFtZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUGFydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOTUwMDIzMSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJU2VydmljZSINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCNDkwMjg3Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuU2VydmljZSBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVENTYwMUQxIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydCINCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVEQTIwMDM2Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVEQjAwMUJDIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5TZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCNUIwMDNFIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklQb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUI4MDAzMjYiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5Qb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTFGMzAyQjUiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyNjMwMkYyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZyINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCOEMwMDE2Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUJDNjAyMTkiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NUYxNjAxNTMiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RjUwMDA2NiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NUZBNDAxQzUiDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MkE5MDI4NCINCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MkJFMDFBOCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIg0KLQkJCQkJdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCQ0YwMzAyIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QURDMDAwNzIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEJDMDA0MSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdGYXVsdCINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ0ZhdWx0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTYwRDkwMDlEIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nRmF1bHQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEZDMDA2MSINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzMkQwMDE3Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTMzRjAzN0IiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iDQotCQkJCQl0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTA5MDBEQSINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MUQwMDdGIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0lucHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nSW5wdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MzQwMzQ5Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPdXRwdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTQ3MDJBNiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdPdXRwdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRENCMDIxQyINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ0lucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QURFQjAxMDAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QURGRTAwMEQiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdPdXRwdXQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRTIxMDExMSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFMkQwMDUwIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nRmF1bHQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRTRGMDBCRCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTVGMDAyQSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01FbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUYzMjAzREIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUY1NjAyOTIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QjEyNDAyQUIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjEzNTAzRDEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSURlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCODRCMUQ5MDE0MiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkRlZmluaXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OEYxMDM5RCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRJbXBvcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODk0OTAyNTkiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbXBvcnREZWYiDQotCQkJCQl0eXBlICAgICAgIAkiSUltcG9ydCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODk2RTAwNUUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkTmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5ODQwMDRCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicHJlZml4Ig0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5QzUwMDQ1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydFR5cGUiDQotCQkJCQl0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkU2VydmljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUU0MDFFRSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInNlcnZpY2UiDQotCQkJCQl0eXBlICAgICAgIAkiSVNlcnZpY2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEExNzAzOEMiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTMyMDI4NiINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTQ2MDEzQiINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE1QzAwQjAiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5RkUwMzdDIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE3NTAyRTciDQotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW1wb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBODMwMTRDIg0KLQkJCQlyZXN1bHQgICAgIAkiSUltcG9ydCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTlEMDMzRSINCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBQUYwMjU0Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBQzIwM0M0Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFFODAwRUQiDQotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFGODAyNkQiDQotCQkJCXJlc3VsdCAgICAgCSJJUGFydCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMDgwMURBIg0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIxNTAzOUIiDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlU2VydmljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjMyMDEzQSINCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEI0MjAwNzUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5ncyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjkyMDM0MSINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QkNEMDA2MCINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QkU3MDE0NCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEMxNzAxMDciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzNFMDAxRCINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDNjIwMTRCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicHJlZml4Ig0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEM3NDAxMTUiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDQkUwMDcxIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0RBMDFDNiINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHJlZml4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDRkQwMDE3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEQyMzAwQTgiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4RDNCMDNDRSINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVCODAxMkIiDQotCQkJCXJlc3VsdCAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVENzAzQkIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJleHRlbnNpb25SZWdpc3RyeSINCi0JCQkJCXR5cGUgICAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudEJhc2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVGRTAyMDgiDQotCQkJCXJlc3VsdCAgICAgCSJTdHJpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnRCYXNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ2MTgwMzI4Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnRCYXNlIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwNTYwMDgwIg0KLQkJCQlyZXN1bHQgICAgIAkiSVR5cGVzIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDA3RTAwNEMiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwQkEwMzU1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlUG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBEODAyOUEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEZBMDMwNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwNkYwMzFCIg0KLQkJCQlyZXN1bHQgICAgIAkiSVR5cGVzIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwOTUwMEVFIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAidHlwZXMiDQotCQkJCQl0eXBlICAgICAgIAkiSVR5cGVzIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkRlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjFFNzAyQTEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUltcG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEIyMDIwMTE5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW1wb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW1wb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIyMEMwMkVBIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklMaXN0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg1QzBBMjAzQzUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTGlzdCBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkxpc3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzBBRjAyOTciDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1hcCINCi0JCQlxdWlkICAgICAgIAkiM0I4OTZCMDMwMEQ0Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLk1hcCBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLk1hcCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QjExMDJCNSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJVVJMIg0KLQkJCXF1aWQgICAgICAgCSIzQjg5RDU2MzAyNzQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLm5ldC5VUkwgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubmV0LlVSTCINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENTZFMDNFMiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJRXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJcXVpZCAgICAgICAJIjNCODlENTkzMDJBNSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1OUYwMkU4Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgdHlwZXMgZWxlbWVudC4gVGhlIHR5cGVzIGVsZW1lbnQgZW5jbG9zZXMgZGF0YSB0eXBlIGRlZmluaXRpb25zIHRoYXQgYXJlIHJlbGV2YW50IGZvciB0aGUgZXhjaGFuZ2VkIG1lc3NhZ2VzLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjhCRUIwMTAzMTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRDNCMDM4MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIg0KLQkJCQlxdWlkdSAgICAgIAkiM0NBRENCQjIwMDUwIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyINCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRjM4MDNFNiINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0Y3RTAzMDEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJSXRlcmF0b3IiDQotCQkJcXVpZCAgICAgICAJIjNDNDY4N0RBMDE2NyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkl0ZXJhdG9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0Njg4MDgwMEI5Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFeGNlcHRpb24iDQotCQkJcXVpZCAgICAgICAJIjNDNDY4OTY1MDMxMyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkV4Y2VwdGlvbiBjbGFzcy4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuV1NETEV4Y2VwdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4OTc0MDMxNSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJVHlwZXMiDQotCQkJcXVpZCAgICAgICAJIjNDQURDQkIyMDA1MCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlR5cGVzIG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5UeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDQURDQkYxMDE3MyINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQ0IyNEFFQzAxQ0IiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQ0MzNjBENzAzOUMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0NDMzYyN0YwMEI3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCINCi0JCQlxdWlkICAgICAgIAkiM0NEMTUwMkMwMjNCIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkRvY3VtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTA2MDAxODIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiTWVzc2FnZVJlZmVyZW5jZSINCi0JCQlxdWlkICAgICAgIAkiM0Y2NzcxREIwMkRDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNzYyQTZBMDMwOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y2NzgwQTAwMUFCIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHJvdGVjdGVkIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNDAxOEMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNzAxQzMiDQotCQkJCWxhYmVsICAgICAgCSJwb3J0VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUNEIg0KLQkJCQlsYWJlbCAgICAgIAkiZU9wZXJhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDRUJFMDBFMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUNFQkYwMDU3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNjEiDQotCQkJCWxhYmVsICAgICAgCSJlUGFydHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1MjAxMEYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQzNTQwMTc2Ig0KLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNCINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMzU0MDE4MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMTAxNzkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIyNSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQzRTIwMjM5Ig0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNyINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ0MjUwMzhBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNjAyRjUiDQotCQkJCWxhYmVsICAgICAgCSJlT3BlcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNjAyRkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5NDAwMzkzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOTQxMDMxQyINCi0JCQkJbGFiZWwgICAgICAJImVQb3J0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMCINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOTQxMDMxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5QjgwMTFGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QjkwMjREIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QjkwMjYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwMzAxRTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQjciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlcyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjA0MDBDMSINCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MTAxMDQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNEEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNTQiDQotCQkJCWxhYmVsICAgICAgCSJlUG9ydFR5cGVzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3NzAwOTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3ODAzNzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5ncyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3QiINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5ncyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3QjAzMTEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3RDAwN0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVTZXJ2aWNlcyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjdEMDA4OSINCi0JCQkJbGFiZWwgICAgICAJImVTZXJ2aWNlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxMzAwNzkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RCINCi0JCQkJbGFiZWwgICAgICAJImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUZEMTQwMTlFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMyINCi0JCQlxdWlkICAgICAgIAkiM0FERjJFNjQwMUY1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkU2NTAyNTEiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ0lucHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFNjUwMjUyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1Ig0KLQkJCXF1aWQgICAgICAgCSIzQURGMkVCMzAxNjMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkVCNDAxM0MiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ091dHB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkVCNDAxM0QiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjciDQotCQkJcXVpZCAgICAgICAJIjNBREYyRjk0MDI0RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkY5NTAxOTAiDQotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRjk1MDE5QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5Ig0KLQkJCXF1aWQgICAgICAgCSIzQURGMkZCODAyRjkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRkI5MDIwQSINCi0JCQkJbGFiZWwgICAgICAJImVPdXRwdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkZCOTAyMEIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMSINCi0JCQlxdWlkICAgICAgIAkiM0FERjMzMTYwMUE0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODciDQotCQkJCWxhYmVsICAgICAgCSJlRmF1bHRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMiINCi0JCQkJcXVpZCAgICAgICAJIjNBREYzMzE4MDM4OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMzIg0KLQkJCXF1aWQgICAgICAgCSIzQURGMzQwMDAzRTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMzQwMTAzQUEiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ0ZhdWx0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM1Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwOTFGNDAyRjMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZFIg0KLQkJCQlsYWJlbCAgICAgIAkiZUZhdWx0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzYiDQotCQkJCXF1aWQgICAgICAgCSIzQUUwOTFGODAxRkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNyINCi0JCQlxdWlkICAgICAgIAkiM0FFQTNENTUwMDJEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNENTYwMzI4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTmFtZXNwYWNlcyINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDU2MDMzMiINCi0JCQkJbGFiZWwgICAgICAJImVOYW1lc3BhY2VzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpOYW1lc3BhY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzOSINCi0JCQlxdWlkICAgICAgIAkiM0FFQTNFM0EwMDJEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNFM0MwMUU4Ig0KLQkJCQlsYWJlbCAgICAgIAkiZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNFM0MwMUYyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDEiDQotCQkJcXVpZCAgICAgICAJIjNBRUE0MTJGMDAzNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFyYW1ldGVyT3JkZXJpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNTUiDQotCQkJCWxhYmVsICAgICAgCSJlUGFyYW1ldGVyT3JkZXJpbmciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDIiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MyINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFEMjQwMEJEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4MyINCi0JCQkJbGFiZWwgICAgICAJImVJbnB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEMjUwMDg0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDUiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRDc5MDBGMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEN0EwMTREIg0KLQkJCQlsYWJlbCAgICAgIAkiZU91dHB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NiINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NyINCi0JCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMEM0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMzI3Ig0KLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMzMxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhCMUMxMjAzQjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDFDIg0KLQkJCQlsYWJlbCAgICAgIAkiZWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTAiDQotCQkJCXF1aWQgICAgICAgCSIzQjhCMUMxNDAwMjYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTEiDQotCQkJcXVpZCAgICAgICAJIjNCOEIxRENDMDJFNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlU2NoZW1hIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjcwIg0KLQkJCQlsYWJlbCAgICAgIAkiZVNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjdBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTMiDQotCQkJcXVpZCAgICAgICAJIjNCOEJFQTI3MDI5RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQTI5MDM1NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZVR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QkVBMjkwMzZBIg0KLQkJCQlsYWJlbCAgICAgIAkiZVR5cGVzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyINCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NSINCi0JCQlxdWlkICAgICAgIAkiM0M0NjgyOTMwM0U1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0NjgyOTYwMTBFIg0KLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M0NjgyOTYwMTE4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU3Ig0KLQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUltcG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUQiDQotCQkJCWxhYmVsICAgICAgCSJlSW1wb3J0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU5Ig0KLQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NTAwRjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjAiDQotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0QiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYwRDcwMzlDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY2hlbWEiDQotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0UiDQotCQkJCWxhYmVsICAgICAgCSJzY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYxIg0KLQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NDAxQjEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NjAwMEYiDQotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjIiDQotCQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NjAwMjMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjMiDQotCQkJcXVpZCAgICAgICAJIjNGNzg5NkEyMDI2RSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkIiDQotCQkJCWxhYmVsICAgICAgCSJwYXJlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY2hpbGRyZW4iDQotCQkJCXF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkMiDQotCQkJCWxhYmVsICAgICAgCSJjaGlsZHJlbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkNCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjcgU2VydmljZXMiDQotCQkJcXVpZCAgICAgICAJIjM5QUQzRUY2MDEyNyINCi0JCQl0aXRsZSAgICAgIAkiMi43IFNlcnZpY2VzIg0KLQkJCXpvb20gICAgICAgCTkwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDgwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2NjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmciKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDYxMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJCQl3aWR0aCAgICAgIAk1MjANCi0JCQkJaGVpZ2h0ICAgICAJNDA0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydCIgQDI5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgNTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NiwgNDgxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklQb3J0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDQzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzgNCi0JCQkJaGVpZ2h0ICAgICAJMjE4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJU2VydmljZSIgQDMwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCA5MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJU2VydmljZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCA0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCNDkwMjg3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMjY0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBAMzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDUyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NCwgMzg5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCQl3aWR0aCAgICAgIAk0MTANCi0JCQkJaGVpZ2h0ICAgICAJMzAyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0RTAxQjQiDQotCQkJCWNsaWVudCAgICAgCUAzMQ0KLQkJCQlzdXBwbGllciAgIAlAMzANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MCwgMzc3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQwLCAyOTIpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAzMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0NDAsIDEyNjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0NCwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJd2lkdGggICAgICAJNDEwDQotCQkJCWhlaWdodCAgICAgCTMwMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5Ig0KLQkJCQljbGllbnQgICAgIAlAMzMNCi0JCQkJc3VwcGxpZXIgICAJQDI4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMwLCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMCwgMTAwMikpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDM1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODE2LCA5MTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjc1LCA4NDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCQloZWlnaHQgICAgIAkxNjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQ1MDJDOSINCi0JCQkJY2xpZW50ICAgICAJQDM1DQotCQkJCXN1cHBsaWVyICAgCUAyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODA5LCA4MjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDksIDYzNykpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5IiBAMzcNCi0JCQkJbG9jYXRpb24gICAJKDM0MywgOTE2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTQwMDM5MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydHMiIEAzOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjEsIDY0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MTMsIDk0NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTg5NzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxQyINCi0JCQkJCWNsaWVudCAgICAgCUAzNw0KLQkJCQkJc3VwcGxpZXIgICAJQDM1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM0MywgOTE2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2NiwgOTE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzOSwgODgwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwODAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ4LCA5OTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMjg0NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwIiBANDINCi0JCQkJCVBhcmVudF9WaWV3IAlAMzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIxLCA2NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2LCA3NDQpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxRCINCi0JCQkJCWNsaWVudCAgICAgCUAzNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzQzLCA5MTYpDQotCQkJCQkgICAgKDI1NywgOTE2KQ0KLQkJCQkJICAgICgyNTcsIDY3OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM0MywgOTE2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NywgNjc5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMSwgNzk2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3MDk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExIiBANDUNCi0JCQkJbG9jYXRpb24gICAJKDg4NiwgMTI3MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDlCODAxMUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmciIEA0Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NQ0KLQkJCQkJbG9jYXRpb24gICAJKDM4LCA0MjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExMiwgMTIzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0ODU3MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjREIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ1DQotCQkJCQlzdXBwbGllciAgIAlAMzMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzUsIDEyNzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MCwgMTMxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNDI4Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIiIEA0OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NQ0KLQkJCQkJbG9jYXRpb24gICAJKDM4LCA0MjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODUyLCAxMTA2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4Nzk0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjYxIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ1DQotCQkJCQlzdXBwbGllciAgIAlAMzUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg4ODYsIDEyNzApDQotCQkJCQkgICAgKDgxMiwgMTI3MCkNCi0JCQkJCSAgICAoODEyLCA5OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEyLCA5OTYpKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi41IEJpbmRpbmdzIg0KLQkJCXF1aWQgICAgICAgCSIzOUFENTEyNzAyNTIiDQotCQkJdGl0bGUgICAgICAJIjIuNSBCaW5kaW5ncyINCi0JCQl6b29tICAgICAgIAk4NQ0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEA1MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxMTQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmciKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCA2NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMzc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiIgQDUyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTc2LCAzNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCAxMzApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgODApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREMwMDA3MiINCi0JCQkJd2lkdGggICAgICAJNDEwDQotCQkJCWhlaWdodCAgICAgCTU2OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIgQDUzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTMzNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ0lucHV0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTI4NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIg0KLQkJCQl3aWR0aCAgICAgIAkyNzgNCi0JCQkJaGVpZ2h0ICAgICAJMTc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCIgQDU0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTY2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTYzOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ091dHB1dCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDE1ODgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSINCi0JCQkJd2lkdGggICAgICAJMzEyDQotCQkJCWhlaWdodCAgICAgCTE3Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCIgQDU1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTU4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nRmF1bHQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTA4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiDQotCQkJCXdpZHRoICAgICAgCTI5MA0KLQkJCQloZWlnaHQgICAgIAkxNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBANTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA2MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OCwgNDg2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJd2lkdGggICAgICAJNjkxDQotCQkJCWhlaWdodCAgICAgCTMwMQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEA1Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTI4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDU4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgMTY2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxNTg3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk91dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEA1OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNjg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk3LCA1MzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCXdpZHRoICAgICAgCTQzMg0KLQkJCQloZWlnaHQgICAgIAkzMjINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCQkJY2xpZW50ICAgICAJQDU5DQotCQkJCXN1cHBsaWVyICAgCUA1MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjc5LCA1MjcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzksIDQyOCkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBANjENCi0JCQkJbG9jYXRpb24gICAJKDEwMzksIDc0MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1MjAxMEYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlIiBANjINCi0JCQkJCVBhcmVudF9WaWV3IAlANjENCi0JCQkJCWxvY2F0aW9uICAgCSg1NzUsIDU5OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ5LCA3ODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg5MjkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxNzYiDQotCQkJCQljbGllbnQgICAgIAlANjENCi0JCQkJCXN1cHBsaWVyICAgCUA1Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1OSwgNzQyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTIsIDcxNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjE5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDY1DQotCQkJCQlQYXJlbnRfVmlldyAJQDYxDQotCQkJCQlsb2NhdGlvbiAgIAkoNTc1LCA1OTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc2LCA2OTcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA5NDQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxODAiDQotCQkJCQljbGllbnQgICAgIAlANjENCi0JCQkJCXN1cHBsaWVyICAgCUA1OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTIwLCA3NDIpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBANjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxMDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzIsIDg1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQl3aWR0aCAgICAgIAk0NTANCi0JCQkJaGVpZ2h0ICAgICAJMzcwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEA2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDYyNCwgMTQwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NzYsIDEyODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0lucHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTI3NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MyIgQDY5DQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCAxMzU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRDI0MDBCRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEA3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2OQ0KLQkJCQkJbG9jYXRpb24gICAJKDk2LCAyODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzNywgMTMxNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW5wdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzUxNDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDI1MDA4MyINCi0JCQkJCWNsaWVudCAgICAgCUA2OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTM1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk0LCAxMzk4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5NTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NCIgQDczDQotCQkJCQlQYXJlbnRfVmlldyAJQDY5DQotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODQiDQotCQkJCQljbGllbnQgICAgIAlANjkNCi0JCQkJCXN1cHBsaWVyICAgCUA2OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4MSwgMTM1OSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBANzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDE2NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODEyLCAxNTM5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIg0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMjc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ1IiBANzUNCi0JCQkJbG9jYXRpb24gICAJKDE0MzIsIDE2NTQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFENzkwMEYyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEA3Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ1LCAxNjEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NzQ3NzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RCINCi0JCQkJCWNsaWVudCAgICAgCUA3NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTY1NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjgxLCAxNjk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkwMjc0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NiIgQDc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDc1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RSINCi0JCQkJCWNsaWVudCAgICAgCUA3NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTY1NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBAODANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDEwMDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE5LCA5MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCXdpZHRoICAgICAgCTM2NA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREU0MDFEQyINCi0JCQkJY2xpZW50ICAgICAJQDgwDQotCQkJCXN1cHBsaWVyICAgCUA1Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTY2LCA5MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjYsIDYzNikpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1IiBAODINCi0JCQkJbG9jYXRpb24gICAJKDQ1NywgMTAyMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMTAxNzkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNiIgQDgzDQotCQkJCQlQYXJlbnRfVmlldyAJQDgyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzUsIDkyMCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTIwMjI1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgyDQotCQkJCQlzdXBwbGllciAgIAlANTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0NTcsIDEwMjIpDQotCQkJCQkgICAgKDI3NiwgMTAyMikNCi0JCQkJCSAgICAoMjc2LCA4NDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTcsIDEwMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc2LCA4NDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMwLCA4ODQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3BlcmF0aW9ucyIgQDg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDgyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzEsIDk3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ09wZXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTE2OTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEM0UyMDIzOSINCi0JCQkJCWNsaWVudCAgICAgCUA4Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDgwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTAsIDEwMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY5LCA5ODApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODQ5NTYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgMTA2NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyNzU2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3IiBAOTANCi0JCQkJbG9jYXRpb24gICAJKDE0MTgsIDEwNDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjUwMzhBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb24iIEA5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MA0KLQkJCQkJbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxMDc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPcGVyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA2MDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVENDI2MDJGNSINCi0JCQkJCWNsaWVudCAgICAgCUA5MA0KLQkJCQkJc3VwcGxpZXIgICAJQDY3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2MywgMTA0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTg5LCAxMDA1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk2NzIxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4IiBAOTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU4LCA0NjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI3MywgMTA3MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTU0MjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVENDI2MDJGRiINCi0JCQkJCWNsaWVudCAgICAgCUA5MA0KLQkJCQkJc3VwcGxpZXIgICAJQDgwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3NCwgMTA0MCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzIiBAOTYNCi0JCQkJbG9jYXRpb24gICAJKDc4NywgMTE5MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NDAxRjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdJbnB1dCIgQDk3DQotCQkJCQlQYXJlbnRfVmlldyAJQDk2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2OSwgMTE1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ0lucHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTExOTA1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NTAyNTEiDQotCQkJCQljbGllbnQgICAgIAlAOTYNCi0JCQkJCXN1cHBsaWVyICAgCUA2OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc4NywgMTE5MCkNCi0JCQkJCSAgICAoNjM2LCAxMTkwKQ0KLQkJCQkJICAgICg2MzYsIDEyNzEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDExOTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM2LCAxMjcxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY4NSwgMTIyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0MDQ3Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQiIEAxMDANCi0JCQkJCVBhcmVudF9WaWV3IAlAOTYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzgxLCA0NTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODUsIDExNDQpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MiINCi0JCQkJCWNsaWVudCAgICAgCUA5Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDgwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzg3LCAxMTkwKQ0KLQkJCQkJICAgICg5MjYsIDExOTApDQotCQkJCQkgICAgKDkyNiwgMTA5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjYsIDEwOTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzEsIDExMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3NTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUiIEAxMDMNCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEzMTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjMwMTYzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3V0cHV0IiBAMTA0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMw0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTIsIDE0MjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzA2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdPdXRwdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NDUwODINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRUI0MDEzQyINCi0JCQkJCWNsaWVudCAgICAgCUAxMDMNCi0JCQkJCXN1cHBsaWVyICAgCUA3NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjQsIDE1MjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NjcsIDE0NzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzQ1OTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2IiBAMTA3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMw0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4MywgMTE0MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNEIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwMw0KLQkJCQkJc3VwcGxpZXIgICAJQDgwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDEzMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTA5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzEsIDExODYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTAxNjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEAxMTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIwLCAxOTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzcyLCAxOTA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkZhdWx0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTE3OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMTExDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgMTk4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxMiwgMTg1OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMjc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNzEwMzMzIg0KLQkJCQljbGllbnQgICAgIAlAMTExDQotCQkJCXN1cHBsaWVyICAgCUA1NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwMywgMjAwNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1MywgMjAwNykpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMyIgQDExMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1NiwgMTM1MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMzQwMDAzRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdGYXVsdHMiIEAxMTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEzDQotCQkJCQlsb2NhdGlvbiAgIAkoMTg4LCA2MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzgyLCAxNzUwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMwMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nRmF1bHRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAzMTUwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzQwMTAzQUEiDQotCQkJCQljbGllbnQgICAgIAlAMTEzDQotCQkJCQlzdXBwbGllciAgIAlAMTExDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1NiwgMTg0NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDksIDE3OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkxOTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NiwgMTgwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxOTI5MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM0IiBAMTE4DQotCQkJCQlQYXJlbnRfVmlldyAJQDExMw0KLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgMTE5NykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FCIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMw0KLQkJCQkJc3VwcGxpZXIgICAJQDgwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM1NiwgMTM1MikNCi0JCQkJCSAgICAoMTM1NiwgMTIxNykNCi0JCQkJCSAgICAoMTExNywgMTIxNykNCi0JCQkJCSAgICAoMTExNywgMTA5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTA5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTIsIDExNjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODcwMDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzUiIEAxMjENCi0JCQkJbG9jYXRpb24gICAJKDE2NDAsIDE5NzApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjQwMkYzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVGYXVsdCIgQDEyMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjENCi0JCQkJCWxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjc0LCAxOTE1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VGYXVsdCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjQyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjgwMUZFIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjMsIDE5NzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzE4LCAyMDEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQyMjc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNiIgQDEyNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjENCi0JCQkJCWxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjgwMUZGIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExMQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MTcsIDE5NzApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTQzMDJBQiINCi0JCQkJY2xpZW50ICAgICAJQDc0DQotCQkJCXN1cHBsaWVyICAgCUA1NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODAzLCAxNjU2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY0LCAxNjU2KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFMUIwMTEzIg0KLQkJCQljbGllbnQgICAgIAlANjgNCi0JCQkJc3VwcGxpZXIgICAJQDUzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NjcsIDEzODUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMzEsIDEzODUpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNCBQb3J0VHlwZXMiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEMUM0MDM2NiINCi0JCQl0aXRsZSAgICAgIAkiMi40IFBvcnRUeXBlcyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIg0KLQkJCXpvb20gICAgICAgCTgwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydFR5cGUiIEAxMjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDIwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2LCAxNzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzAwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnRUeXBlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2LCAxMjIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNUJFMDMzMSINCi0JCQkJd2lkdGggICAgICAJNzE4DQotCQkJCWhlaWdodCAgICAgCTE5Ng0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iIEAxMjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAyMDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDE3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4NzMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJT3BlcmF0aW9uIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNiwgMTI2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4NzMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTc3NjAwRDEiDQotCQkJCXdpZHRoICAgICAgCTg5MQ0KLQkJCQloZWlnaHQgICAgIAkxODgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCIgQDEzMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTQ3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDE0MzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUlucHV0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDEzODcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBN0VFMDAxNSINCi0JCQkJd2lkdGggICAgICAJNjQ0DQotCQkJCWhlaWdodCAgICAgCTE5NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU91dHB1dCIgQDEzMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgMTc5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDE3NTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSU91dHB1dCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU2LCAxNzA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTgyOTAyN0QiDQotCQkJCXdpZHRoICAgICAgCTY3NA0KLQkJCQloZWlnaHQgICAgIAkxOTQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCIgQDEzMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMjExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDIwNzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUZhdWx0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDIwMjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCINCi0JCQkJd2lkdGggICAgICAJNjQ0DQotCQkJCWhlaWdodCAgICAgCTE5Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAxMzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDgwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4LCA2NzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCQl3aWR0aCAgICAgIAk2OTUNCi0JCQkJaGVpZ2h0ICAgICAJMjgxDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDEzNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NzYsIDgwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjMyNSwgNjkyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQl3aWR0aCAgICAgIAk1MjANCi0JCQkJaGVpZ2h0ICAgICAJMjQwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIgQDEzNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3MjgsIDIxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDcsIDIwNjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRmF1bHQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBAMTM2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA1NiwgMTQ3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODcwLCAxNDIyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklucHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTEyNQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDEzNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDE3OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzIsIDE3NDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiT3V0cHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCQkJd2lkdGggICAgICAJMjc0DQotCQkJCWhlaWdodCAgICAgCTEyNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBAMTM4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgNzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjE0LCA2MjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiT3BlcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJd2lkdGggICAgICAJNjk1DQotCQkJCWhlaWdodCAgICAgCTM1Mg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDEzOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgNzk3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODI0MDE4QyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3BlcmF0aW9ucyIgQDE0MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzkNCi0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDc0OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDkNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3BlcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM1OTY0OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjcwMUNEIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwNSwgNzk3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3NiwgODYxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQwMzkxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzQsIDkyMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjI0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEyNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBvcnRUeXBlIiBAMTQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOQ0KLQkJCQkJbG9jYXRpb24gICAJKDU5MiwgMjY5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDODI3MDFDMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNzk3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODg4LCA3NTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTM0ODgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDEiIEAxNDYNCi0JCQkJbG9jYXRpb24gICAJKDIxMDcsIDc3MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEyRjAwMzUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBhcmFtZXRlck9yZGVyaW5nIiBAMTQ3DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0Ng0KLQkJCQkJbG9jYXRpb24gICAJKDE4MTksIDEwMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNDUsIDY0NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUGFyYW1ldGVyT3JkZXJpbmciDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODMzMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEzMTAyNTUiDQotCQkJCQljbGllbnQgICAgIAlAMTQ2DQotCQkJCQlzdXBwbGllciAgIAlAMTM0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMDcsIDc3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzE2LCA3NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjcyLCA4MjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTY2MTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3MSwgODg4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzA2MjIwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDIiIEAxNTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2DQotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1RiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEwNywgNzczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTksIDc3MykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxIiBAMTUyDQotCQkJCWxvY2F0aW9uICAgCSgxNzAyLCAxNTA0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYzMzE2MDFBNCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHRzIiBAMTUzDQotCQkJCQlQYXJlbnRfVmlldyAJQDE1Mg0KLQkJCQkJbG9jYXRpb24gICAJKDE0MTQsIDgzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTUsIDE5ODIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUZhdWx0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3ODk5Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYzMzE4MDM4NyINCi0JCQkJCWNsaWVudCAgICAgCUAxNTINCi0JCQkJCXN1cHBsaWVyICAgCUAxMzUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAyLCAyMDQ4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NCwgMjAyMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0OTU4MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTkzLCAxOTYzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ1Mzc4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzIiIEAxNTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUyDQotCQkJCQlsb2NhdGlvbiAgIAkoMTQxNCwgODMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2MSwgMTA2OSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTgwMzg4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE1Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDEzOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDk2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDEwMzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTczNjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3IiBAMTYwDQotCQkJCWxvY2F0aW9uICAgCSgxMTc4LCAxMjM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYyRjk0MDI0RCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEAxNjENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTYwDQotCQkJCQlsb2NhdGlvbiAgIAkoODkwLCA1NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDEzNDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUlucHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE5ODIwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTUwMTkwIg0KLQkJCQkJY2xpZW50ICAgICAJQDE2MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzgsIDEyMzQpDQotCQkJCQkgICAgKDk4MCwgMTIzNCkNCi0JCQkJCSAgICAoOTgwLCAxNDEwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODAsIDE0MTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ2LCAxMzY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc3NjYwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOCIgQDE2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNjANCi0JCQkJCWxvY2F0aW9uICAgCSg4OTAsIDU2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTY0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzYsIDEwMzYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRjk1MDE5QSINCi0JCQkJCWNsaWVudCAgICAgCUAxNjANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTc4LCAxMjM0KQ0KLQkJCQkJICAgICgxMjc3LCAxMjM0KQ0KLQkJCQkJICAgICgxMjc3LCA5NjApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc4LCAxMjM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzcsIDk2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTY0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExOTcsIDEwNTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY0MTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkiIEAxNjcNCi0JCQkJbG9jYXRpb24gICAJKDE0NjgsIDEzNDUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjgwMkY5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEAxNjgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTY3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTE4MCwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTY5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2MiwgMTY2OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3V0cHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQwOTA5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBBIg0KLQkJCQkJY2xpZW50ICAgICAJQDE2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDE3MzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTQ2LCAxNjc2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzNjM2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMCIgQDE3MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNjcNCi0JCQkJCWxvY2F0aW9uICAgCSgxMTgwLCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDI3LCAxMDM3KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCOTAyMEIiDQotCQkJCQljbGllbnQgICAgIAlAMTY3DQotCQkJCQlzdXBwbGllciAgIAlAMTM4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgOTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTczDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyMywgMTA4MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5MDM0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkQ4MDE5RiINCi0JCQkJY2xpZW50ICAgICAJQDEzMw0KLQkJCQlzdXBwbGllciAgIAlAMTI4DQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkUyMDE3MSINCi0JCQkJY2xpZW50ICAgICAJQDEzOA0KLQkJCQlzdXBwbGllciAgIAlAMTI5DQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkVFMDMxRCINCi0JCQkJY2xpZW50ICAgICAJQDEzNg0KLQkJCQlzdXBwbGllciAgIAlAMTMwDQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkY4MDFDRCINCi0JCQkJY2xpZW50ICAgICAJQDEzNw0KLQkJCQlzdXBwbGllciAgIAlAMTMxDQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYyMDAyMDAyRCINCi0JCQkJY2xpZW50ICAgICAJQDEzNQ0KLQkJCQlzdXBwbGllciAgIAlAMTMyDQotCQkJCWxpbmVfc3R5bGUgCTApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE3OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyMjQsIDE0NTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzcsIDEzMTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTc1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCXdpZHRoICAgICAgCTU5Mw0KLQkJCQloZWlnaHQgICAgIAkzMTINCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIiBAMTgwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyMCwgMjU0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAyNDY2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2VSZWZlcmVuY2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIg0KLQkJCQl3aWR0aCAgICAgIAk2NzINCi0JCQkJaGVpZ2h0ICAgICAJMTgwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxODENCi0JCQkJbG9jYXRpb24gICAJKDE1MjQsIDIyNzUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDE4MA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNTI0LCAyMjc1KQ0KLQkJCQkgICAgKDE1MjQsIDI0NTQpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTgyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyM0QwMzE5Ig0KLQkJCQljbGllbnQgICAgIAlAMTM1DQotCQkJCXN1cHBsaWVyICAgCUAxODANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzYsIDIxNzYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc2LCAyMjc1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxODEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjM1MDBERCINCi0JCQkJY2xpZW50ICAgICAJQDEzNw0KLQkJCQlzdXBwbGllciAgIAlAMTgwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzcxLCAxODU0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3MSwgMjI3NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTgxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxODQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIyODAyRTciDQotCQkJCWNsaWVudCAgICAgCUAxMzYNCi0JCQkJc3VwcGxpZXIgICAJQDE4MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTgwLCAxNTM0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAyMjc1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxODEpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MSIgQDE4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjIwNiwgMjI1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NDAxQjEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2UiIEAxODYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTg1DQotCQkJCQlsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA2OCwgMTY3MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTWVzc2FnZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMjIzMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNGNzRFNzg2MDAwRiINCi0JCQkJCWNsaWVudCAgICAgCUAxODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNzkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwNiwgMjI1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjA2LCAxNjEyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI2MCwgMTY3OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjIiIEAxODkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTg1DQotCQkJCQlsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNGNzRFNzg2MDAyMyINCi0JCQkJCWNsaWVudCAgICAgCUAxODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxODANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMjA2LCAyMjU5KQ0KLQkJCQkJICAgICgyMjA2LCAyNTU2KQ0KLQkJCQkJICAgICgxODU2LCAyNTU2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwNiwgMjI1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODU2LCAyNTU2KSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMSBEZWZpbml0aW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0FENUU0OEEwMjYyIg0KLQkJCXRpdGxlICAgICAgCSIyLjEgRGVmaW5pdGlvbnMiDQotCQkJem9vbSAgICAgICAJODMNCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklEZWZpbml0aW9uIiBAMTkwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCAxOTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAxNjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSURlZmluaXRpb24iKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMTExKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2ODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiDQotCQkJCXdpZHRoICAgICAgCTcwNg0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMTkxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgOTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjg2LCA4OTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCQl3aWR0aCAgICAgIAkyOTQNCi0JCQkJaGVpZ2h0ICAgICAJMTIwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiIEAxOTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA2MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTAsIDU0NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbXBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTgyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTkzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxMTIsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MDAsIDEwNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCXdpZHRoICAgICAgCTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkyODANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMTk0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4MDgsIDE0ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTYsIDEzNjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjgwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMTk1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE3MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMjQsIDE2MDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCXdpZHRoICAgICAgCTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkyODANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAxOTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyNDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDM5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUxMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQl3aWR0aCAgICAgIAk1MjgNCi0JCQkJaGVpZ2h0ICAgICAJNDI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUzIiBAMTk3DQotCQkJCWxvY2F0aW9uICAgCSgxMzU4LCA4NjApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMTk4DQotCQkJCQlQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCQkJbG9jYXRpb24gICAJKDYyLCAtMzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzE3LCA1MzUpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiINCi0JCQkJCWNsaWVudCAgICAgCUAxOTcNCi0JCQkJCXN1cHBsaWVyICAgCUAxOTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTgsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDMsIDUxMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NjY0OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMjAxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCQkJbG9jYXRpb24gICAJKDYyLCAtMzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTg2LCA5MDkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVR5cGVzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc5MDk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiDQotCQkJCQljbGllbnQgICAgIAlAMTk3DQotCQkJCQlzdXBwbGllciAgIAlAMTkxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM1OCwgODYwKQ0KLQkJCQkJICAgICgxMzU4LCA5NDgpDQotCQkJCQkgICAgKDE2NzcsIDk0OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc3LCA5NDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjMyLCA5ODcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTI2NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTciIEAyMDQNCi0JCQkJbG9jYXRpb24gICAJKDE2MTIsIDU5NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTgiIEAyMDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjA0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTIsIDIyNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjMsIDUxMikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVFIg0KLQkJCQkJY2xpZW50ICAgICAJQDIwNA0KLQkJCQkJc3VwcGxpZXIgICAJQDE5Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MTIsIDU5NSkNCi0JCQkJCSAgICAoMTQ2NCwgNTk1KQ0KLQkJCQkJICAgICgxNDY0LCA0NTMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjEyLCA1OTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2NCwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyNCwgNDk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU4NjY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW1wb3J0cyIgQDIwOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMDQNCi0JCQkJCWxvY2F0aW9uICAgCSgxMiwgMjI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5MiwgNTU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbXBvcnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjgwMzM1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiDQotCQkJCQljbGllbnQgICAgIAlAMjA0DQotCQkJCQlzdXBwbGllciAgIAlAMTkyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTAxLCA1OTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODU0LCA2NTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDEwMDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NiwgNjQ2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjI1OTQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzIiBAMjEyDQotCQkJCWxvY2F0aW9uICAgCSgxMjc5LCAxMTM3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjAzMDFFMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNCIgQDIxMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTINCi0JCQkJCWxvY2F0aW9uICAgCSgyNzEsIDI3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzgsIDU5MSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDQwMEI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDIxMg0KLQkJCQkJc3VwcGxpZXIgICAJQDE5Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzksIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjAsIDU4NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwNDk3NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2VzIiBAMjE2DQotCQkJCQlQYXJlbnRfVmlldyAJQDIxMg0KLQkJCQkJbG9jYXRpb24gICAJKDI3MSwgMjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NywgMTE3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTWVzc2FnZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDMxMzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjA0MDBDMSINCi0JCQkJCWNsaWVudCAgICAgCUAyMTINCi0JCQkJCXN1cHBsaWVyICAgCUAxOTMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjc5LCAxMTM3KQ0KLQkJCQkJICAgICgxMjc5LCAxMjA4KQ0KLQkJCQkJICAgICgxODkxLCAxMjA4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODkxLCAxMjA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgMTE3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTM0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzk3LCAxMjQ0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY0NDA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1IiBAMjIwDQotCQkJCWxvY2F0aW9uICAgCSgxMjEyLCAxMTU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjcxMDEwNCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNiIgQDIyMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMjANCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI0LCAyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCA1OTQpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjcyMDM0QSINCi0JCQkJCWNsaWVudCAgICAgCUAyMjANCi0JCQkJCXN1cHBsaWVyICAgCUAxOTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjEyLCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUxLCA2MjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTc5NjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0VHlwZXMiIEAyMjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjIwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNCwgMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5MSwgMTQ1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydFR5cGVzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzIzNjk4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNTQiDQotCQkJCQljbGllbnQgICAgIAlAMjIwDQotCQkJCQlzdXBwbGllciAgIAlAMTk0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIxMiwgMTE1OSkNCi0JCQkJCSAgICAoMTIxMiwgMTQ5MCkNCi0JCQkJCSAgICAoMTU4NywgMTQ5MCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4NywgMTQ5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzMsIDE0NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjU2MTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMiwgMTU0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NTg1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNyIgQDIyOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTExNCwgMTU4NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3NzAwOTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgiIEAyMjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjI4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNiwgMjQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgNjgwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzNzEiDQotCQkJCQljbGllbnQgICAgIAlAMjI4DQotCQkJCQlzdXBwbGllciAgIAlAMTk2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTQsIDE1ODUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNCwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1NSwgNzUyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2NzA0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ3MiIEAyMzINCi0JCQkJCVBhcmVudF9WaWV3IAlAMjI4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNiwgMjQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1MSwgMTY3NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ3MiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NjYzNDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjc4MDM3QiINCi0JCQkJCWNsaWVudCAgICAgCUAyMjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxOTUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTE0LCAxNTg1KQ0KLQkJCQkJICAgICgxMTE0LCAxNzE2KQ0KLQkJCQkJICAgICgyMTE1LCAxNzE2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTE1LCAxNzE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1MywgMTY3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0NTA3NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDE0LCAxNzU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTExMDcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBAMjM2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjgsIDE5MjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiU2VydmljZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCXdpZHRoICAgICAgCTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkyODANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkiIEAyMzcNCi0JCQkJbG9jYXRpb24gICAJKDEwNjYsIDE1MzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0IwMzExIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwIiBAMjM4DQotCQkJCQlQYXJlbnRfVmlldyAJQDIzNw0KLQkJCQkJbG9jYXRpb24gICAJKC01MjEsIC0xMTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDI1LCA2NjkpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjdEMDA3RiINCi0JCQkJCWNsaWVudCAgICAgCUAyMzcNCi0JCQkJCXN1cHBsaWVyICAgCUAxOTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTA5LCA3NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTk2OTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVTZXJ2aWNlcyIgQDI0MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTIxLCAtMTExKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5MywgMjAyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlU2VydmljZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTE4MjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjdEMDA4OSINCi0JCQkJCWNsaWVudCAgICAgCUAyMzcNCi0JCQkJCXN1cHBsaWVyICAgCUAyMzYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMDY2LCAxNTMzKQ0KLQkJCQkJICAgICgxMDY2LCAyMDU5KQ0KLQkJCQkJICAgICgxNjE5LCAyMDU5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE5LCAyMDU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1NCwgMjAzMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0MDE5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTMyLCAyMTEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTIwNTE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjQ1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRjgwMzgyIg0KLQkJCQljbGllbnQgICAgIAlAMTk2DQotCQkJCXN1cHBsaWVyICAgCUAxOTANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjQsIDI2MykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4NSwgMjYzKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEuMyBFeHRlbnNpYmlsaXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ2MEM1MTAxOTIiDQotCQkJdGl0bGUgICAgICAJIjIuMS4zIEV4dGVuc2liaWxpdHkiDQotCQkJem9vbSAgICAgICAJODANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAyNDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMTU4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDk0LCAxNTMxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQl3aWR0aCAgICAgIAkxODINCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IiBAMjQ3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAxODg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDg3LCAxODM2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2Ig0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyNDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE3MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNDIsIDE2NzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiU2VydmljZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJCXdpZHRoICAgICAgCTE4Mg0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDI0OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMjMzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgMjI4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzQNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBAMjUwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3MzYsIDE3NjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU2MywgMTcwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3BlcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJd2lkdGggICAgICAJMzY0DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI1MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NSwgMTM2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDg2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3ODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjEyNDAyQUIiDQotCQkJCXdpZHRoICAgICAgCTgwNA0KLQkJCQloZWlnaHQgICAgIAkxNzINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIgQDI1Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAxOTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDE4OTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0lucHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCINCi0JCQkJd2lkdGggICAgICAJMjc0DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIgQDI1Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMjE0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYzLCAyMDkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIg0KLQkJCQl3aWR0aCAgICAgIAkzMDgNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjU0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDEyOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMjM1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQl3aWR0aCAgICAgIAkyMjINCi0JCQkJaGVpZ2h0ICAgICAJMTQ2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDI1NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDE0MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDMzNSwgMTM1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAyNTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDY4OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDksIDU4MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmxlRWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkJCXdpZHRoICAgICAgCTU2MA0KLQkJCQloZWlnaHQgICAgIAkyNDANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjU3DQotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDEwMzkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDI1Ng0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0ODAsIDEwMzkpDQotCQkJCSAgICAoNDgwLCA4MDgpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjU4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwQ0IwMEFBIg0KLQkJCQljbGllbnQgICAgIAlAMjQ3DQotCQkJCXN1cHBsaWVyICAgCUAyNTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjYsIDE4MjQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY2LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODVCNUE0MDI3RSINCi0JCQkJY2xpZW50ICAgICAJQDI1Mw0KLQkJCQlzdXBwbGllciAgIAlAMjU2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDk3LCAyMDc5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NywgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjU3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOTM4NjAyQzkiDQotCQkJCWNsaWVudCAgICAgCUAyNDkNCi0JCQkJc3VwcGxpZXIgICAJQDI1Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxOSwgMjI3MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTksIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjYxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1OUIwMDcyIg0KLQkJCQljbGllbnQgICAgIAlAMjUyDQotCQkJCXN1cHBsaWVyICAgCUAyNTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4OCwgMTg4NykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4OCwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjU3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNjINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MDA5MjAyRjciDQotCQkJCWNsaWVudCAgICAgCUAyNTANCi0JCQkJc3VwcGxpZXIgICAJQDI1Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzk3LCAxNjk1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzk3LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQTBGMDJGMCINCi0JCQkJY2xpZW50ICAgICAJQDI0Ng0KLQkJCQlzdXBwbGllciAgIAlAMjU2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDEsIDE1MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDEsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjY0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEQjgwM0Q0Ig0KLQkJCQljbGllbnQgICAgIAlAMjU0DQotCQkJCXN1cHBsaWVyICAgCUAyNTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMSwgMTIyMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMSwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjU3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNjUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiDQotCQkJCWNsaWVudCAgICAgCUAyNTUNCi0JCQkJc3VwcGxpZXIgICAJQDI1Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDE0LCAxMzQ0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE0LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQTIwMDI1RSINCi0JCQkJY2xpZW50ICAgICAJQDI0OA0KLQkJCQlzdXBwbGllciAgIAlAMjU2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNjYzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQyOSwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjU3KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjY3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNjg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjMyLCA1ODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAk1NjMNCi0JCQkJaGVpZ2h0ICAgICAJMjM0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxIiBAMjY4DQotCQkJCWxvY2F0aW9uICAgCSgxMTkxLCA2NzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMjY5DQotCQkJCQlQYXJlbnRfVmlldyAJQDI2OA0KLQkJCQkJbG9jYXRpb24gICAJKDIzLCA1NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NDcsIDYzMSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIg0KLQkJCQkJY2xpZW50ICAgICAJQDI2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDI1Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkxLCA2NzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzYwLCA2NzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzAsIDYyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzOTY5NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDI3Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNjgNCi0JCQkJCWxvY2F0aW9uICAgCSgyMywgNTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjczDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1NSwgNTIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzkwNzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiDQotCQkJCQljbGllbnQgICAgIAlAMjY4DQotCQkJCQlzdXBwbGllciAgIAlAMjY3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjIzLCA2NzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDk2LCA2MjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk0MDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MywgNzY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjMyNDc5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIgQDI3Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxOTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjMwLCA4NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJXU0RMRWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiDQotCQkJCXdpZHRoICAgICAgCTc3NA0KLQkJCQloZWlnaHQgICAgIAkyNDANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjc3DQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCA0MDIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDI3Ng0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMDA4LCA0MDIpDQotCQkJCSAgICAoMTAwOCwgMzEyKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGRTNDMDNENCINCi0JCQkJY2xpZW50ICAgICAJQDI1Ng0KLQkJCQlzdXBwbGllciAgIAlAMjc2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTIsIDU2OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ5MiwgNDAyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTQ5MDNEMCINCi0JCQkJY2xpZW50ICAgICAJQDI2Nw0KLQkJCQlzdXBwbGllciAgIAlAMjUxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDE1LCA1NzEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDE1LCAyNDYpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyODANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkRERjUzNTAyQzMiDQotCQkJCWNsaWVudCAgICAgCUAyNjcNCi0JCQkJc3VwcGxpZXIgICAJQDI3Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc2MiwgNTcxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2MiwgNDAyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzcpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjgxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAxNiwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMSwgMTMwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIg0KLQkJCQl3aWR0aCAgICAgIAk1ODgNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjgyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBRUMwMUNCIg0KLQkJCQljbGllbnQgICAgIAlAMjgxDQotCQkJCXN1cHBsaWVyICAgCUAyNjcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3OTYsIDEyOTUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzk2LCA4MDUpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjMiIEAyODMNCi0JCQkJbG9jYXRpb24gICAJKDIzMTEsIDE2ODYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTIwMjZFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhcmVudCIgQDI4NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyODMNCi0JCQkJCWxvY2F0aW9uICAgCSgyNzksIDI5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0MjIsIDEzMzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGFyZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkIiDQotCQkJCQljbGllbnQgICAgIAlAMjgzDQotCQkJCQlzdXBwbGllciAgIAlAMjgxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjMxMSwgMTY4NikNCi0JCQkJCSAgICAoMjQzMiwgMTY4NikNCi0JCQkJCSAgICAoMjQzMiwgMTM3NCkNCi0JCQkJCSAgICAoMjMxMCwgMTM3NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjMxMCwgMTM3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjYsIDE0MjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNoaWxkcmVuIiBAMjg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDI4Mw0KLQkJCQkJbG9jYXRpb24gICAJKDI3OSwgMjk0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg5OSwgMTUzNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjaGlsZHJlbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5ODU2MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNGNzg5NkE3MDEyQyINCi0JCQkJCWNsaWVudCAgICAgCUAyODMNCi0JCQkJCXN1cHBsaWVyICAgCUAyODENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzExLCAxNjg2KQ0KLQkJCQkJICAgICgyMDE2LCAxNjg2KQ0KLQkJCQkJICAgICgyMDE2LCAxNDI1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjMxMSwgMTY4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDE2LCAxNDI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3MCwgMTQ4MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIg0KLQkJCXF1aWQgICAgICAgCSIzQUU4RUQ3MjAxQkQiDQotCQkJdGl0bGUgICAgICAJIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyINCi0JCQl6b29tICAgICAgIAk5MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCIgQDI5MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3MTIsIDIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklJbXBvcnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDIyLCAxMjcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMjAyMDExOSINCi0JCQkJd2lkdGggICAgICAJNTk4DQotCQkJCWhlaWdodCAgICAgCTIxOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIiBAMjkxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCAxMTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDIsIDEwNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTmFtZXNwYWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzQ0QzMDAzMCINCi0JCQkJd2lkdGggICAgICAJNDc5DQotCQkJCWhlaWdodCAgICAgCTIxNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAyOTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTIxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5NCwgMTE0MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAk2OTQNCi0JCQkJaGVpZ2h0ICAgICAJMTczDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjkzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQsIDIzNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJd2lkdGggICAgICAJNDkwDQotCQkJCWhlaWdodCAgICAgCTMyMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNyIgQDI5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMzA5LCA3ODYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTUwMDJEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVOYW1lc3BhY2VzIiBAMjk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDI5NA0KLQkJCQkJbG9jYXRpb24gICAJKC05MSwgMjU4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjk2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYxLCA5NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU5hbWVzcGFjZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTg4NDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NjAzMzIiDQotCQkJCQljbGllbnQgICAgIAlAMjk0DQotCQkJCQlzdXBwbGllciAgIAlAMjkxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMwOSwgNzg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwOSwgMTAyOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0OCwgOTczKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY4NzA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOCwgOTEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTI1MDk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzOCIgQDI5OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyOTQNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTEsIDI1OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjk5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OCwgNTkyKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTYwMzI4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDI5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDI5Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDU0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjk5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzOSwgNTgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ0OTYxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiIEAzMDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDcyLCA3MjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTUsIDU4MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbXBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJCQl3aWR0aCAgICAgIAk0NTINCi0JCQkJaGVpZ2h0ICAgICAJMzA0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUxIiBAMzAzDQotCQkJCWxvY2F0aW9uICAgCSgxNDg2LCAxMDAxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEIxRENDMDJFNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2NoZW1hIiBAMzA0DQotCQkJCQlQYXJlbnRfVmlldyAJQDMwMw0KLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzcsIDEwMTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MjU5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxRENFMDI3MCINCi0JCQkJCWNsaWVudCAgICAgCUAzMDMNCi0JCQkJCXN1cHBsaWVyICAgCUAyOTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDg2LCAxMDAxKQ0KLQkJCQkJICAgICgxNjMyLCAxMDAxKQ0KLQkJCQkJICAgICgxNjMyLCAxMTMwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgMTAwMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMyLCAxMTMwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2MywgMTAxOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MjU5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTIiIEAzMDcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzAzDQotCQkJCQlsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxRENFMDI3QSINCi0JCQkJCWNsaWVudCAgICAgCUAzMDMNCi0JCQkJCXN1cHBsaWVyICAgCUAzMDINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgMTAwMCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg2LCA4NzIpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzOSIgQDMwOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4NywgNDAzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzRTNBMDAyRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MCIgQDMwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDgNCi0JCQkJCWxvY2F0aW9uICAgCSg2ODcsIC0xMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA2LCA0ODApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRjIiDQotCQkJCQljbGllbnQgICAgIAlAMzA4DQotCQkJCQlzdXBwbGllciAgIAlAMzAyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTA4NywgNDAzKQ0KLQkJCQkJICAgICgxMzY0LCA0MDMpDQotCQkJCQkgICAgKDEzNjQsIDU2OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY0LCA1NjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZURlZmluaXRpb24iIEAzMTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMzA4DQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA1LCAzNjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42Mzc1MzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRTNDMDFFOCINCi0JCQkJCWNsaWVudCAgICAgCUAzMDgNCi0JCQkJCXN1cHBsaWVyICAgCUAyOTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgNDAzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY0NSwgNDAzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzI3LCA0NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQ5MTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTciIEAzMTQNCi0JCQkJbG9jYXRpb24gICAJKDczNywgODI2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1OCIgQDMxNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjcxLCAxMDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTIsIDY0NykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSINCi0JCQkJCWNsaWVudCAgICAgCUAzMTQNCi0JCQkJCXN1cHBsaWVyICAgCUAyOTMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3MzcsIDgyNikNCi0JCQkJCSAgICAoNTEwLCA4MjYpDQotCQkJCQkgICAgKDUxMCwgNTQ0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA1NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NTcsIDU5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAzMTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzE0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0NCwgNzczKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbXBvcnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk5MTg5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiDQotCQkJCQljbGllbnQgICAgIAlAMzE0DQotCQkJCQlzdXBwbGllciAgIAlAMzAyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDYsIDgyNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExODAsIDg3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjIxMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTYyLCA5MzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzIyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjIwMEQwMzQwIg0KLQkJCQljbGllbnQgICAgIAlAMzAyDQotCQkJCXN1cHBsaWVyICAgCUAyOTANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTUsIDU2OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTUsIDMzMykpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4yIFR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQjg1QUU1OTAzN0UiDQotCQkJdGl0bGUgICAgICAJIjIuMiBUeXBlcyINCi0JCQl6b29tICAgICAgIAk5MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJODENCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAzMjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxMjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg5NSwgMTE1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTUwMA0KLQkJCQloZWlnaHQgICAgIAkxNzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMzI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMzYsIDE2MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkwNiwgMTUzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzgNCi0JCQkJaGVpZ2h0ICAgICAJMTYyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMzI1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTk2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgMTgyOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJd2lkdGggICAgICAJNTM1DQotCQkJCWhlaWdodCAgICAgCTMwNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDMyNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4LCAxMDY3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQl3aWR0aCAgICAgIAk0NjYNCi0JCQkJaGVpZ2h0ICAgICAJMjU4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ3IiBAMzI3DQotCQkJCWxvY2F0aW9uICAgCSg3MzUsIDExNzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMEM0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBAMzI4DQotCQkJCQlQYXJlbnRfVmlldyAJQDMyNw0KLQkJCQkJbG9jYXRpb24gICAJKDE0MywgNjc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc1LCAxMTMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjY5MDA2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMjciDQotCQkJCQljbGllbnQgICAgIAlAMzI3DQotCQkJCQlzdXBwbGllciAgIAlAMzIzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4ODYsIDExNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzksIDEyMDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODg3MDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ4IiBAMzMxDQotCQkJCQlQYXJlbnRfVmlldyAJQDMyNw0KLQkJCQkJbG9jYXRpb24gICAJKDE0MywgNjc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDMzMSINCi0JCQkJCWNsaWVudCAgICAgCUAzMjcNCi0JCQkJCXN1cHBsaWVyICAgCUAzMjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4NSwgMTE3MikpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ5IiBAMzMyDQotCQkJCWxvY2F0aW9uICAgCSg1MjcsIDE1OTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTIwM0IyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVsZW1lbnREZWNsYXJhdGlvbiIgQDMzMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMzINCi0JCQkJCWxvY2F0aW9uICAgCSgtNjUsIDEwOTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjYsIDE1NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzc1Mzk0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMUMiDQotCQkJCQljbGllbnQgICAgIAlAMzMyDQotCQkJCQlzdXBwbGllciAgIAlAMzI0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUyNywgMTU5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTcsIDE1OTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDcsIDE2NDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTU4NzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUwIiBAMzM2DQotCQkJCQlQYXJlbnRfVmlldyAJQDMzMg0KLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMjYiDQotCQkJCQljbGllbnQgICAgIAlAMzMyDQotCQkJCQlzdXBwbGllciAgIAlAMzI2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNTI3LCAxNTkyKQ0KLQkJCQkJICAgICg0MzcsIDE1OTIpDQotCQkJCQkgICAgKDQzNywgMTMxMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUyNywgMTU5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDEzMTMpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NSIgQDMzNw0KLQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAxOTExKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDNDY4MjkzMDNFNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDMzOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzgsIDE4NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2UiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDg1NjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNDY4Mjk2MDEwRSINCi0JCQkJCWNsaWVudCAgICAgCUAzMzcNCi0JCQkJCXN1cHBsaWVyICAgCUAzMjUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDE5MTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NDMsIDE5NjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU2IiBAMzQxDQotCQkJCQlQYXJlbnRfVmlldyAJQDMzNw0KLQkJCQkJbG9jYXRpb24gICAJKC0xNCwgMTE5MSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMTgiDQotCQkJCQljbGllbnQgICAgIAlAMzM3DQotCQkJCQlzdXBwbGllciAgIAlAMzI2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzIyLCAxOTExKQ0KLQkJCQkJICAgICgyMjksIDE5MTEpDQotCQkJCQkgICAgKDIyOSwgMTMxMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMyMiwgMTkxMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjksIDEzMTMpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAzNDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDYwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE1LCA1MTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCQl3aWR0aCAgICAgIAkzODkNCi0JCQkJaGVpZ2h0ICAgICAJMjE2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMzQzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJd2lkdGggICAgICAJMjIyDQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDM0NA0KLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCA2MDQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDM0NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNDQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCAzOTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDY0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDcNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NjEwMTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCQkJCWNsaWVudCAgICAgCUAzNDQNCi0JCQkJCXN1cHBsaWVyICAgCUAzNDINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjA2LCA2MDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjYsIDU2OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4Mzg4Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTQiIEAzNDgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzQ0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMzLCAzMTMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiINCi0JCQkJCWNsaWVudCAgICAgCUAzNDQNCi0JCQkJCXN1cHBsaWVyICAgCUAzNDMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQsIDYwNCkNCi0JCQkJCSAgICAoMTc0LCA2MDQpDQotCQkJCQkgICAgKDE3NCwgMjI1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAyMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDI3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NzcyOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIiBAMzUxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjUsIDIwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJVHlwZXMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjUsIDE1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NBRENCQjIwMDUwIg0KLQkJCQl3aWR0aCAgICAgIAkyNDgNCi0JCQkJaGVpZ2h0ICAgICAJMTY2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDM1Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3MjgsIDgwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1OSwgNzUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTczOQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyINCi0JCQkJd2lkdGggICAgICAJNzU3DQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAzNTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgMTIxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyOSwgMTEwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAk2NzMNCi0JCQkJaGVpZ2h0ICAgICAJMjUwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU5IiBAMzU0DQotCQkJCWxvY2F0aW9uICAgCSgxODI2LCA5NzUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDUwMEYyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYwIiBAMzU1DQotCQkJCQlQYXJlbnRfVmlldyAJQDM1NA0KLQkJCQkJbG9jYXRpb24gICAJKDMwNiwgNDQ3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ2MDIzRCINCi0JCQkJCWNsaWVudCAgICAgCUAzNTQNCi0JCQkJCXN1cHBsaWVyICAgCUAzNTINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjYsIDg1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzU1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzQsIDkwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY1NjQ4OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hIiBAMzU3DQotCQkJCQlQYXJlbnRfVmlldyAJQDM1NA0KLQkJCQkJbG9jYXRpb24gICAJKDMwNiwgNDQ3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwNiwgMTAzMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDc1NzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0UiDQotCQkJCQljbGllbnQgICAgIAlAMzU0DQotCQkJCQlzdXBwbGllciAgIAlAMzUzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCAxMDkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4OCwgMTA1MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY1MTUxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM2MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQURDRDNCMDM4MCINCi0JCQkJY2xpZW50ICAgICAJQDM0Mg0KLQkJCQlzdXBwbGllciAgIAlAMzUxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDUsIDUwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwNSwgMzA3KSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDM2MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDIyNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTUsIDEzMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmxlRWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkJCXdpZHRoICAgICAgCTUwMA0KLQkJCQloZWlnaHQgICAgIAkyMTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNjINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiDQotCQkJCWNsaWVudCAgICAgCUAzNDINCi0JCQkJc3VwcGxpZXIgICAJQDM2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU0LCA1MDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTQsIDMzMCkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgNDY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDkwLCAzNjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY5DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAk2ODcNCi0JCQkJaGVpZ2h0ICAgICAJMjE2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxIiBAMzY0DQotCQkJCWxvY2F0aW9uICAgCSgxMjA2LCA0OTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMzY1DQotCQkJCQlQYXJlbnRfVmlldyAJQDM2NA0KLQkJCQkJbG9jYXRpb24gICAJKC01ODYsIDIzNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzY1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzYsIDM4NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCQkJCWNsaWVudCAgICAgCUAzNjQNCi0JCQkJCXN1cHBsaWVyICAgCUAzNjENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjA2LCA0OTMpDQotCQkJCQkgICAgKDEwOTQsIDQ5MykNCi0JCQkJCSAgICAoMTA5NCwgMzMwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTQsIDMzMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzY1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDM3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyODMyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDM2OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNjQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTg2LCAyMzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTk2LCA0NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMzk3MTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCINCi0JCQkJCWNsaWVudCAgICAgCUAzNjQNCi0JCQkJCXN1cHBsaWVyICAgCUAzNjMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODEsIDQ5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTUsIDU0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2NDk1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzk2LCAzOTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTQ5MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzcyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYyN0YwMEI3Ig0KLQkJCQljbGllbnQgICAgIAlAMzUyDQotCQkJCXN1cHBsaWVyICAgCUAzNjMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MTIsIDc0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTIsIDU3MikpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4zIE1lc3NhZ2VzIg0KLQkJCXF1aWQgICAgICAgCSIzQkNFODUzRDAyQzgiDQotCQkJdGl0bGUgICAgICAJIjIuMyBNZXNzYWdlcyINCi0JCQl6b29tICAgICAgIAk4NQ0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU1lc3NhZ2UiIEAzNzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgMTIyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklNZXNzYWdlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCA3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4QUYwMDRGIg0KLQkJCQl3aWR0aCAgICAgIAkzODANCi0JCQkJaGVpZ2h0ICAgICAJMzI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUGFydCIgQDM3NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyOSwgMTI0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU5OQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklQYXJ0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyOSwgNzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU5OQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOTNGMDFCRSINCi0JCQkJd2lkdGggICAgICAJNjE3DQotCQkJCWhlaWdodCAgICAgCTMyNA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAzNzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA4MTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDY5MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJd2lkdGggICAgICAJNDkyDQotCQkJCWhlaWdodCAgICAgCTI3Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM3Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOTZEMDJGMSINCi0JCQkJY2xpZW50ICAgICAJQDM3NQ0KLQkJCQlzdXBwbGllciAgIAlAMzc0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzA0LCA2NzgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzA0LCAzODYpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAzNzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDY1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCA1MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCXdpZHRoICAgICAgCTQzMg0KLQkJCQloZWlnaHQgICAgIAkzMjINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNzgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThEMTAyQkEiDQotCQkJCWNsaWVudCAgICAgCUAzNzcNCi0JCQkJc3VwcGxpZXIgICAJQDM3Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDQ1LCA0OTUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDM4OCkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxIiBAMzc5DQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDk1MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRTAwRTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBhcnRzIiBAMzgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDM3OQ0KLQkJCQkJbG9jYXRpb24gICAJKDE3NiwgMzI4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUyLCA4OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk3NDUyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNjEiDQotCQkJCQljbGllbnQgICAgIAlAMzc5DQotCQkJCQlzdXBwbGllciAgIAlAMzc1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDk1MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4NywgMTAwNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTgwOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NjcsIDEwNjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDIwMzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyIiBAMzg0DQotCQkJCQlQYXJlbnRfVmlldyAJQDM3OQ0KLQkJCQkJbG9jYXRpb24gICAJKDE3NiwgMzI4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzg1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA0LCA4OTMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDRUJGMDA1NyINCi0JCQkJCWNsaWVudCAgICAgCUAzNzkNCi0JCQkJCXN1cHBsaWVyICAgCUAzNzcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2ODgsIDk1MikNCi0JCQkJCSAgICAoNDQ1LCA5NTIpDQotCQkJCQkgICAgKDQ0NSwgODE3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCA4MTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzOTMsIDkxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0NzYwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkpKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAieHNkIg0KLQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlhTRCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSJvcmcuZWNsaXBzZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJ4c2QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy94c2QvMjAwMi9YU0QiKSkNCi0JCXF1aWQgICAgICAgCSIzOUFCREM2RjAxQUEiDQotCQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBbm5vdGF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUUxNzcwMTE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGRDRFMjAzNjYiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcHBsaWNhdGlvbkluZm9ybWF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFQkYwMkM4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2VySW5mb3JtYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQkJGN0VFQTAxNTciDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQkJGN0YwNTAxRTIiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NQXR0ciINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCN0RDMDE5MyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTYxMDNCRSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODdGNTIwMkI0Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjcyRDhFMjAwRUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDNBMDIyMSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJFQjAyQTgiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzgwMEQyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4N0Y3QjAzODYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZVVzZSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNzJENzM3MDM4RiINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjcyRDdCQjAzNDkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0NGMzAyN0QiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0REQjAzQjciDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cmFpbnQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0RFMDAyRDgiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb25zdHJhaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IwMjIwMzgyIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3MTlEOTAzNDEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQm91bmRlZEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzUxRDAzNDQiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2M0MwMjI0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NTJBMDBDQyINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ2FyZGluYWxpdHlGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1NUQwM0QyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjRGMDEzMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzU2QzAxNTMiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDYXJkaW5hbGl0eSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhCODAyODYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkFBMjAzMTAiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXJpdmF0aW9uTWV0aG9kIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM2RTQwMjBFIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGVyaXZhdGlvbk1ldGhvZCINCi0JCQkJaW5pdHYgICAgICAJInJlc3RyaWN0aW9uIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzcxRDAyNkEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzczODAwQzUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29udGVudFR5cGVDYXRlZ29yeSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQTQyMDJCOCINCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQjhBMDNFNiINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNjE4MDE0RCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wbGV4RmluYWwiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9jayINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGQjk3MDA2RSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1peGVkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MzMUFGNUUwM0E2Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wb25lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBOTAzRDIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEREI1MDFBNSINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbmluZ0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDODAwMzk0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaWFnbm9zdGljIg0KLQkJCXF1aWQgICAgICAgCSIzQkZFNUY5MTAwNDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QzBGNEMwMUExIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2V2ZXJpdHkiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjkxQzAwNUQiDQotCQkJCXR5cGUgICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTVGREQwMjgwIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQzA2Mzc0MzAxNkIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaW5lIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYwN0UwMjEzIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlpbml0diAgICAgIAkiMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbHVtbiINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MTFFMDI5NiINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJaW5pdHYgICAgICAJIjEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJub2RlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwMTZCNkIwMjAwIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NTm9kZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFubm90YXRpb25VUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQzA2Mzc0RjAxODYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODVGMTcwMDJFIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2NjAzMzkiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmlsbGFibGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkZCNDAyOUYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzQ2ODAzNjgiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzRBMDAzQjkiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzRFMDAwMEUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEQxNEMwMEIyIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2siDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDE2ODAxQzEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg5RjYyMDNDRiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaXJjdWxhciINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MzNERDQjAwMDE4Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDOUQwM0M3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdDNjQwMDU0Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDI1NjgwMjU5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Mzc0MDI1MyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhY2V0TmFtZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODlGQjQwMUVDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWZmZWN0aXZlVmFsdWUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBQUUzMDNCNiINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGZWF0dXJlIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTBBMkMwMzA3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkY4MTAyMEYiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cmFpbnQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkY4ODAwQzUiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb25zdHJhaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZm9ybSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDJCMDMzRSINCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3MUExQjAxNkYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJnbG9iYWwiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMDA3MDM3MiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmZWF0dXJlUmVmZXJlbmNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTA0NDAxODUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGaXhlZEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNjk5RTAwQzEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDODgwMUI0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZml4ZWQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkE2MDAyMDEiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOTkwMDE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3OUQyMDA4QSINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNjlFODAxRDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDN0IwMzk2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBQTMwMjQyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDFDNzAxNDMiDQotCQkJCXR5cGUgICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJbXBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4QzkzMDE3RiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhEOTAwM0UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURCMTUwMzZDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREluY2x1ZGUiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4QzdEMDI1MCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhEQzAzODEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciINCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RMZW5ndGhGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3NjIwMEU3Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NzgwMDJERiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc2QzAwNEIiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3ODk2MDBDMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I4RTAzMDkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4RmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQzMTAzQUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRTIwMUY3Ig0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMTc0MDI3RCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMTkzMDM1NCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzg3RDAwREEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCODMwM0I4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heExlbmd0aEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCN0QwMEZDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3N0RBMDBGMyINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5FeGNsdXNpdmVGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5MkQwMDBBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjU5MDI4MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5GYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRDI0MDA5OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQzBBMUVEMTAzOTgiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluY2x1c2l2ZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEExQTIwMDhFIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2x1c2l2ZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEExQkUwM0UyIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluSW5jbHVzaXZlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3ODg3MDJDOSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1MjAzNTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluTGVuZ3RoRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzdDNDAwQzAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3OTkwMTVFIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1vZGVsR3JvdXAiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NEE2NDAyNzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbXBvc2l0b3IiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0YxRDAxQ0YiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wb3NpdG9yIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRTIwMzgxIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjU1MDM4NSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FDNDAwOTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEExRjYwMkU4Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROYW1lZENvbXBvbmVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCQTBDRUEyMDE5NyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ3MDAwMTQyIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ3MDQwMzFFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxpYXNOYW1lIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTU3RjAxMjciDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1UkkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNTg3MDBFMiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzVVJJIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTVBQTAyQUYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTA5NjMwMjVFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ5NDMwMkYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTRGMDIzQyINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzeXN0ZW1JZGVudGlmaWVyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQzMkUwMEYwIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHVibGljSWRlbnRpZmllciINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzM0MDM5NyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROdW1lcmljRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY0MjAwNzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1QTMwMDEyIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RPcmRlcmVkRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NEREMDI0OCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY1OTAxMkMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc0RjYwMkRBIg0KLQkJCQl0eXBlICAgICAgIAkiWFNET3JkZXJlZCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXJ0aWNsZSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEZDMDFFNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaW5PY2N1cnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0Y4RTAzQjIiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWluaXR2ICAgICAgCSIxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWF4T2NjdXJzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOTkwM0FFIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlpbml0diAgICAgIAkiMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXJ0aWNsZUNvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjc4MEJEOTAwNTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhdHRlcm5GYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2Q0E1MDM4RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qzc5MDMxMSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGRDRCQTAyM0MiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTBBMjYwMzZEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNjgwMDIxNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2QUUyMDYwMTcyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkIzMDFENSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQjY0MDI0MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIg0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlcGVhdGFibGVGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBQTYwMzFBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzhGMDAyRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hIg0KLQkJCXF1aWQgICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNDNEEwMTgyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODRFNTAzREQiDQotCQkJCXR5cGUgICAgICAgCSJET01Eb2N1bWVudCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjaGVtYUxvY2F0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODY4RUMwMjI2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjlCRkYwMTgwIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlRm9ybURlZmF1bHQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTA0QjAxMDIiDQotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIg0KLQkJCQlpbml0diAgICAgIAkidW5xdWFsaWZpZWQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50Rm9ybURlZmF1bHQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTA3ODAwQUMiDQotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIg0KLQkJCQlpbml0diAgICAgIAkidW5xdWFsaWZpZWQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbERlZmF1bHQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwQzRBNzAwMzgiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9ja0RlZmF1bHQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjU5RDAyRDgiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJzaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0QyMkQ2RDgwMzU2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUNvbXBvc2l0b3IiDQotCQkJcXVpZCAgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREI1NjAwOTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4OENCODAwQkEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4RTYwMzcyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFEaXJlY3RpdmUiDQotCQkJcXVpZCAgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTMyMTAyQUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjaGVtYUxvY2F0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ5QjMwMzMwIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY29wZSINCi0JCQlxdWlkICAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDRDY0MDIzMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1RjU1MDMyQiINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhcmlldHkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzE1ODAwQTkiDQotCQkJCXR5cGUgICAgICAgCSJYU0RWYXJpZXR5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTQ0RjAxNDYiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEU2ltcGxlRmluYWwiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjY1RTAzNUEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEU2ltcGxlRmluYWwiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWxpZEZhY2V0cyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBQjBGMDBCNiINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVGVybSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEFBMDFEMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QkQyNDQwMDY5Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzlBMDAyMEUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNjEwMzM3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3OUFCMDIzMiINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkY1MDEzQSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdoaXRlU3BhY2VGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4NDYwMUI3Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3ODYyMDA0NSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzg1MDAyMDEiDQotCQkJCXR5cGUgICAgICAgCSJYU0RXaGl0ZVNwYWNlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdpbGRjYXJkIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDBFOTAxOUUiDQotCQkJCXR5cGUgICAgICAgCSJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VDb25zdHJhaW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0NGODYwMjIzIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2Nlc3NDb250ZW50cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMTJFMDFFNCINCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2Nlc3NDb250ZW50cyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0JEQjcwMUY5Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RYUGF0aERlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZEODRGNzAwOTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFyaWV0eSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ5MDE1MDNERSINCi0JCQkJdHlwZSAgICAgICAJIlhTRFhQYXRoVmFyaWV0eSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I3QkJCRTEwMUIxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUF0dHIiDQotCQkJcXVpZCAgICAgICAJIjNCQkY4Qzg5MDFCNiINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uQXR0ciINCi0JCQkJcXVpZCAgICAgICAJIjNCQkY4Q0IwMDBENSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCINCi0JCQlxdWlkICAgICAgIAkiM0MyNzg1MEUwMzgxIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Eb2N1bWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NTFCMDNDNiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01FbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjgxODk3OTAyMDAiDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjgxODlEQjAzNzQiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NTm9kZSINCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0QTUwMTE3Ig0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Ob2RlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY1QkYwMDJEIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlZhbHVlIg0KLQkJCXF1aWQgICAgICAgCSIzQzA0MEI1QjAzMUYiDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubGFuZy5PYmplY3QiDQotCQkJCXF1aWQgICAgICAgCSIzQzA0MEI4RDAzRDUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiDQotCQkJcXVpZCAgICAgICAJIjNCQTdCMEU4MDFBOCINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3B0aW9uYWwiDQotCQkJCXF1aWQgICAgICAgCSIzQkE3QjExNTAyQjciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9oaWJpdGVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjIwMkQzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkE3QjEyOTAyRjAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ2FyZGluYWxpdHkiDQotCQkJcXVpZCAgICAgICAJIjNCQzc3MTVEMDA5QiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluaXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxREMwMkVEIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY291bnRhYmx5SW5maW5pdGUiDQotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFFQzAxNDEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleEZpbmFsIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzJDQTAxQ0IiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMkU3MDBEQSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyRUEwMTZBIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2RDIwMTEyIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBvc2l0b3IiDQotCQkJcXVpZCAgICAgICAJIjNCODY5QjYyMDAzNyINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlCRDAwMDAzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2hvaWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDQjgwMTFFIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VxdWVuY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2OUNFNTAwNTciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29uc3RyYWludCINCi0JCQlxdWlkICAgICAgIAkiM0I4NjlFMjYwMUFFIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZWZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlFOEUwMjU4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZml4ZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2OUU5OTAyNzEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29udGVudFR5cGVDYXRlZ29yeSINCi0JCQlxdWlkICAgICAgIAkiM0I4NkE3OUYwM0EyIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbXB0eSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0NEMDJGMCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNpbXBsZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0QxMDBDRSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1peGVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDMwMUI3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudE9ubHkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdENzAyRTkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGVyaXZhdGlvbk1ldGhvZCINCi0JCQlxdWlkICAgICAgIAkiM0I4NkEwQjAwMENFIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDODAzMjkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMENDMDE2MiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaWFnbm9zdGljU2V2ZXJpdHkiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2OEE3MDMyRiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmF0YWwiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhDMzAzRDAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlcnJvciINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEU3MDBFMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIndhcm5pbmciDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhFQTAxRkYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmZvcm1hdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU3RkMyMDE5QSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1QTQwM0RGIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdWJzdGl0dXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY3OTAwNDUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY3RjAxQUMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjgzMDIwQiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGMjQ1MDA2OSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGb3JtIg0KLQkJCXF1aWQgICAgICAgCSIzQjlGOTEzQjAxRUIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInF1YWxpZmllZCINCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MTZGMDAyMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVucXVhbGlmaWVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkxOEMwMDdGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg2QTFFMDAyNzIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjEyMDA4NSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleXJlZiINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjEzMDE0RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaXF1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjE2MDM2NSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDNUVBMDAyMyINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYW55Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjAwMDM0Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm90Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjIwMDVGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2V0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjUwMTE3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE9yZGVyZWQiDQotCQkJcXVpZCAgICAgICAJIjNCQzc3MTUyMDJFNCINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmFsc2UiDQotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFBOTAyNzEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJ0aWFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQkIwMUZGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidG90YWwiDQotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFDNDAxQjIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUHJvY2Vzc0NvbnRlbnRzIg0KLQkJCXF1aWQgICAgICAgCSIzQjhGRjhDNzAyODQiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0cmljdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEY4MDA0NSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxheCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEY2MDM4QiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNraXAiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhFODAyQkEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDNUJFMDI3MiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2OEIwMEI4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY5NDAyOTEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjI1MDAyOTUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2ltcGxlRmluYWwiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDMjVEMDI5NSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgxMDIzMCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODMwMTM4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4ODAyNEUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjZFMDAzNzQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzU5MTAwQUUiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjY0MDIzMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NkQwMjE2Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFZhcmlldHkiDQotCQkJcXVpZCAgICAgICAJIjNCOEZGNzczMDI0OSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXRvbWljIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QTcwMkRGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0FEMDEzOSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QUYwMzlGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdoaXRlU3BhY2UiDQotCQkJcXVpZCAgICAgICAJIjNCRUVEMEY2MDM0MiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlc2VydmUiDQotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEwRjAxMTciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXBsYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjcwMzREIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29sbGFwc2UiDQotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEyOTAzOTYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEWFBhdGhWYXJpZXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhGRkI4OTAzM0EiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlbGVjdG9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkZCQUMwMTkyIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmllbGQiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRkJCMzAyNzgiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjQiDQotCQkJcXVpZCAgICAgICAJIjNDNjI2RUE3MDEwMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NSINCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQTkwMTkyIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NiINCi0JCQlxdWlkICAgICAgIAkiM0I2OURBREMwMkY1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURBREQwMjM4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQUREMDI0MiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2OCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMDZGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzBFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAzMTgiDQotCQkJCWxhYmVsICAgICAgCSJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1NkIwMkNCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDcxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1NkQwMEE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNyINCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MiINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNkIwMTk0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDczIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNkQwMzA5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNkQwMzEzIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3NCINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMDYwMjkxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwNzAxNzIiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzYiDQotCQkJcXVpZCAgICAgICAJIjNCNjk0MDRFMDA2NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDUwMDI5QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDUwMDJBNSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3OCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1OUYwMDg2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1QTAwMDY5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVVzZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2QSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVVzZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI3NUQzMjAyMjAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3NUQzQzAxMEMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBEIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4ODdCRjAxNTAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4ODdDMDAwQTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4N0MwMDBBOCINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NCINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNUUwMUY5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNjIwMDQ2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2MjAwNTAiDQotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODYiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTg1MDEwRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTg2MDBGQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1ODYwMEZCIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZGMURFOTAxOEEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODkiDQotCQkJCXF1aWQgICAgICAgCSIzQjZGMURFQTAzNkMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkYxREVBMDM4MCINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTAiDQotCQkJcXVpZCAgICAgICAJIjNCOTAwNjg4MDFDMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5MSINCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNjhBMDExMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50QW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNjhBMDExQiINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRBbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTIiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzMzM1MDM0MCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RSINCi0JCQkJbGFiZWwgICAgICAJImJhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTQiDQotCQkJcXVpZCAgICAgICAJIjNCNkZEREQ3MDExMyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI2QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RkREREEwMjc1Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTYiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzN0RGMDI0RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0UxMDBGRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50VHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3RTEwMEZFIg0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudFR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAwNkUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAzNDkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlVXNlcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzRBIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlVXNlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwMCINCi0JCQlxdWlkICAgICAgIAkiM0I2OThFMzYwMzg2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwMSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjk4RTM4MDA3MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVDb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjk4RTM4MDA3QyINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZUNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDIiDQotCQkJcXVpZCAgICAgICAJIjNCNjg1MUJBMDEyNiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1MUJCMDE1MSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDQiDQotCQkJcXVpZCAgICAgICAJIjNCNzUxQjA4MDNDNyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250YWluZXIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUIwQzAxQ0UiDQotCQkJCWxhYmVsICAgICAgCSJjb250YWluZXIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwNSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjBDMDFDRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDYiDQotCQkJcXVpZCAgICAgICAJIjNCNzUxQjQ4MDI2MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyb290Q29udGFpbmVyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCNEMwMjg1Ig0KLQkJCQlsYWJlbCAgICAgIAkicm9vdENvbnRhaW5lciINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA3Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCNEMwMjg2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwOCINCi0JCQlxdWlkICAgICAgIAkiM0I3NTFDMzEwMzU2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwOSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpDQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFDMzMwMzNCIg0KLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTAiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBBMDA2NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyM0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBCMDI0OSINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTIiDQotCQkJcXVpZCAgICAgICAJIjNCNjg5MTE0MDFBRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OTExNTAwMTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OTExNTAwMTciDQotCQkJCWxhYmVsICAgICAgCSJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTQiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDA1OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAzQkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDNDMCINCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTYiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzM0VGMDE2MCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTciDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzNGMDAyOTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzNGMDAyOTkiDQotCQkJCWxhYmVsICAgICAgCSJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExOCINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQxRTYwMjUxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExOSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDJGNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQxRUEwMzBCIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyMCINCi0JCQlxdWlkICAgICAgIAkiM0I2OUMwNTkwMTk4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyMSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDMDVEMDFFMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDMDVEMDFFRCINCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyMiINCi0JCQlxdWlkICAgICAgIAkiM0M0MkRCREQwMjk3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyMyINCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDExRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzdWJzdGl0dXRpb25Hcm91cCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0M0MkRCRTAwMTI4Ig0KLQkJCQlsYWJlbCAgICAgIAkic3Vic3RpdHV0aW9uR3JvdXAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyNCINCi0JCQlxdWlkICAgICAgIAkiM0I2RDIzQjkwMUNEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyNSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyM0JBMDFDNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMjNCQTAxQ0UiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZENTk3MTAyRUEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAic2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU5NzUwMTA1Ig0KLQkJCQlsYWJlbCAgICAgIAkic2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyNyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDExOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjgiDQotCQkJcXVpZCAgICAgICAJIjNCNjlCNjUzMDE3QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY29wZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCNjU0MDA2RCINCi0JCQkJbGFiZWwgICAgICAJInNjb3BlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjY1NDAwNkUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzAiDQotCQkJcXVpZCAgICAgICAJIjNDMjkwMTA2MDJENyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEZlYXR1cmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDEwQjAwMEUiDQotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEZlYXR1cmUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMxIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTAxMEIwMDE4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAxODMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMzNDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMzQ2Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzNCINCi0JCQlxdWlkICAgICAgIAkiM0I2OUQyOUUwMTREIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlZmVyZW5jZWRLZXkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMkE4MDE2NSINCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jZWRLZXkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM1Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQyQTgwMTZGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRDAwM0UiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEM0UwMjJBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzZWxlY3RvciINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNFMDIzNCINCi0JCQkJbGFiZWwgICAgICAJInNlbGVjdG9yIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzgiDQotCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDAyNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzkiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNjUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImZpZWxkcyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDM3OSINCi0JCQkJbGFiZWwgICAgICAJImZpZWxkcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQwIg0KLQkJCXF1aWQgICAgICAgCSIzQjZBRENEODAyRkMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURDRDkwMThCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEMiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQyIg0KLQkJCXF1aWQgICAgICAgCSIzQjZBRENDNTAwN0UiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURDQzYwMDZCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREluY2x1ZGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM3RDAyNTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURDQzYwMDZDIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0NCINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTcwMkM4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE4MDNFMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE5MDAwNCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDYiDQotCQkJcXVpZCAgICAgICAJIjNCNkJDRUIxMDJGOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDciDQotCQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCNjAwMUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDI1Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzYwNjAyNkYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM2MDcwMjIxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJ0aWNsZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMiINCi0JCQkJbGFiZWwgICAgICAJInBhcnRpY2xlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTAiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjE1MDA4QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxNjAwOTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMEEwIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1MiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM3QUMwMjVBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0FEMDMzOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1vZGVsR3JvdXAiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdBRDAzMzkiDQotCQkJCWxhYmVsICAgICAgCSJtb2RlbEdyb3VwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCNDI0NTAzOTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNDkwMzhBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNDkwMzlFIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTYiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBGMDIxMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTciDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMDAwQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMDAwRDMiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCNDcxNTAxMTkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQ3MUEwM0FCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0NzFBMDNCNSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2MCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODNDODkwMTIyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzQzhBMDExMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInRlcm0iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzQzhBMDExMSINCi0JCQkJbGFiZWwgICAgICAJInRlcm0iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjIiDQotCQkJcXVpZCAgICAgICAJIjNCNkFERTQyMDA5QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAyRkUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURFNDMwMzA4Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjQiDQotCQkJcXVpZCAgICAgICAJIjNCNkFFODI0MDA1MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNjAyQUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFODI2MDJCNyINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjYiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4RTZCMDAzRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjciDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QzAxMDciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QzAxMTEiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2OCINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFOEQwMUJGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRThFMDE5OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlbGVtZW50RGVjbGFyYXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RTAxOTkiDQotCQkJCWxhYmVsICAgICAgCSJlbGVtZW50RGVjbGFyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTcwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RkRGQTAwQzMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTcxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkZERkIwMjdEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZURlY2xhcmF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkZERkIwMjdFIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzIiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRTkyMDIxNiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU5MzAxOEIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOTMwMThDIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3NCINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFNzYwMDQ5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDM3NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDM3RSINCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUVGRjAyNEYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVGMDAwMjVBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1vZGVsR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVGMDAwMjY0Ig0KLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cERlZmluaXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzgiDQotCQkJcXVpZCAgICAgICAJIjNCRkMyQTE3MDFFRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzkiDQotCQkJCXF1aWQgICAgICAgCSIzQkZDMkExQTAyNzMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCRkMyQTFBMDI3RCINCi0JCQkJbGFiZWwgICAgICAJImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUVBNzAyM0UiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm5vdGF0aW9uRGVjbGFyYXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUVBODAzOEIiDQotCQkJCWxhYmVsICAgICAgCSJub3RhdGlvbkRlY2xhcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODIiDQotCQkJcXVpZCAgICAgICAJIjNCNjlFNDU2MDI5MCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNjUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFNDU3MDE2RiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZENUNBNTAxMTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDVDQTcwM0I0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZENUNBNzAzQzgiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODYiDQotCQkJcXVpZCAgICAgICAJIjNCNkMzNUFEMDM3NCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODciDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRjAwMDYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmYWNldENvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM1QUYwMDEwIg0KLQkJCQlsYWJlbCAgICAgIAkiZmFjZXRDb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODgiDQotCQkJcXVpZCAgICAgICAJIjNCQzhBRTAyMDNBOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODkiDQotCQkJCXF1aWQgICAgICAgCSIzQkM4QUUwNjAwNTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmYWNldHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQzhBRTA2MDA2NSINCi0JCQkJbGFiZWwgICAgICAJImZhY2V0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTAiDQotCQkJcXVpZCAgICAgICAJIjNCNkMzNEI3MDIwOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTEiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNEJFMDI1OSINCi0JCQkJbGFiZWwgICAgICAJIm1lbWJlclR5cGVEZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTIiDQotCQkJcXVpZCAgICAgICAJIjNCNkMzNjMyMDFEQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzYzNTAwNTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmdW5kYW1lbnRhbEZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDYzIg0KLQkJCQlsYWJlbCAgICAgIAkiZnVuZGFtZW50YWxGYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTQiDQotCQkJcXVpZCAgICAgICAJIjNCNkQzNUFCMDI3MyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMzVCMjAyOTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkQzNUIyMDJBNSINCi0JCQkJbGFiZWwgICAgICAJImJhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTYiDQotCQkJcXVpZCAgICAgICAJIjNCNkQ1NTcyMDE2QyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTciDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTU3NTAyMkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU1NzUwMjQzIg0KLQkJCQlsYWJlbCAgICAgIAkicHJpbWl0aXZlVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MTAxNTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUUyOTIwMTlGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMjkyMDFBOSINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDAiDQotCQkJcXVpZCAgICAgICAJIjNCOTAwNkNGMDA4OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDEiDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDZEMTAxNUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJkZXJpdmF0aW9uQW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE2NyINCi0JCQkJbGFiZWwgICAgICAJImRlcml2YXRpb25Bbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIzMzAyNjQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMzQwMjg0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4RSINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIxMTAyNkYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTIwMUY5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDIwMyINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDYiDQotCQkJcXVpZCAgICAgICAJIjNDNjI2RUIzMDAwNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDciDQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVCNDAzMjciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzMyIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDgiDQotCQkJcXVpZCAgICAgICAJIjNCRUJEQzg3MDI0NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDkiDQotCQkJCXF1aWQgICAgICAgCSIzQkVCREM4QzAyRjkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMzAzIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxMCINCi0JCQlxdWlkICAgICAgIAkiM0JGRTYyMjcwM0NEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxMSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjJCMDA2MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIg0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb21wb25lbnRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjIyQjAwNkMiDQotCQkJCWxhYmVsICAgICAgCSJjb21wb25lbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxMiINCi0JCQlxdWlkICAgICAgIAkiM0JGRTYyNjkwMTY1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxMyINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjZBMDAyNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImRpYWdub3N0aWNzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjZBMDAyNyINCi0JCQkJbGFiZWwgICAgICAJImRpYWdub3N0aWNzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiDQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjE0Ig0KLQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMTAzNUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY0MzIwMUM2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFsbERpYWdub3N0aWNzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMjAxQzciDQotCQkJCWxhYmVsICAgICAgCSJhbGxEaWFnbm9zdGljcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIg0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxNiINCi0JCQlxdWlkICAgICAgIAkiM0MyMURDQzcwMEVDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxNyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQ0NFMDA0MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZFNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyMURDQ0UwMDQzIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRTY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxOCINCi0JCQlxdWlkICAgICAgIAkiM0MyMUREMEMwM0RCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxOSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIg0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiaW5jb3Jwb3JhdGVkU2NoZW1hIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREQxMDAzMDUiDQotCQkJCWxhYmVsICAgICAgCSJpbmNvcnBvcmF0ZWRTY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyMCINCi0JCQlxdWlkICAgICAgIAkiM0MyMzkxMzQwMDRGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyMSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjM5MTM2MDBDQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyMzkxMzYwMEQ0Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyMiINCi0JCQlxdWlkICAgICAgIAkiM0MyNUQzQTYwMTMxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyMyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjVEM0E5MDM3MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlZmVyZW5jaW5nRGlyZWN0aXZlcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUQzQTkwMzcxIg0KLQkJCQlsYWJlbCAgICAgIAkicmVmZXJlbmNpbmdEaXJlY3RpdmVzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjQiDQotCQkJcXVpZCAgICAgICAJIjNDMjVFQ0YwMDA1RSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUNGNDAwMUUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VmVyc2lvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFQ0Y0MDAyOCINCi0JCQkJbGFiZWwgICAgICAJInJvb3RWZXJzaW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjYiDQotCQkJcXVpZCAgICAgICAJIjNDMjVFRDBCMDExQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjciDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUQwRjAxMjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJvcmlnaW5hbFZlcnNpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUQwRjAxMkIiDQotCQkJCWxhYmVsICAgICAgCSJvcmlnaW5hbFZlcnNpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyOCINCi0JCQlxdWlkICAgICAgIAkiM0MyNUVFQUIwMDFGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyOSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRUFGMDEwQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJpbmNvcnBvcmF0ZWRWZXJzaW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUVBRjAxMTUiDQotCQkJCWxhYmVsICAgICAgCSJpbmNvcnBvcmF0ZWRWZXJzaW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwREUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjMxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMERGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiaXRlbVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwRTAiDQotCQkJCWxhYmVsICAgICAgCSJpdGVtVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3MzAxOTQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjMzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hRm9yU2NoZW1hIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUZCIg0KLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hRm9yU2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzQiDQotCQkJcXVpZCAgICAgICAJIjNDMjg4MEY1MDNEOSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwM0MiDQotCQkJCWxhYmVsICAgICAgCSJyb290VHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MEY5MDA0NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNTAxMzciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM3Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODgyQzcwMTEyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiDQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInByaW1hcnlDb21wb25lbnQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMyINCi0JCQkJbGFiZWwgICAgICAJInByaW1hcnlDb21wb25lbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMjAxQTQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMEYzMDJFNSINCi0JCQkJbGFiZWwgICAgICAJInR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzOSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMEYzMDJGMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0MCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE2REIwMUU1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2REQwM0REIg0KLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNkREMDNERSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDIiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBNzEyMDEwOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzE0MDE1MSINCi0JCQkJbGFiZWwgICAgICAJImJhc2VUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTc0QjAxNzgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAic2ltcGxlVHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzREMDE3QiINCi0JCQkJbGFiZWwgICAgICAJInNpbXBsZVR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzREMDE4NSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDYiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBN0VEMDNDMCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb21wbGV4VHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBN0Y0MDExNyINCi0JCQkJbGFiZWwgICAgICAJImNvbXBsZXhUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDciDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTdGNDAxMjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NDAzMEEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE5OTcwMEREIg0KLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwRTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NTAyNUIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwODYwMjcwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWluRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NjAyN0EiDQotCQkJCWxhYmVsICAgICAgCSJtaW5GYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTIiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMDhEMDI1MiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDhFMDA5QiINCi0JCQkJbGFiZWwgICAgICAJIm1heEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1NCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQUIwMzk2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1NSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEFDMDNDOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQUMwM0Q0Ig0KLQkJCQlsYWJlbCAgICAgIAkibWF4SW5jbHVzaXZlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBBRjAzMzgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjAwMUY5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWluSW5jbHVzaXZlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMDAyMDMiDQotCQkJCWxhYmVsICAgICAgCSJtaW5JbmNsdXNpdmVGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEIzMDIwNyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI0MDE5QSINCi0JCQkJbGFiZWwgICAgICAJIm1pbkV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2MCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQjYwMjhEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2MSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI3MDIxNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjcwMjIxIg0KLQkJCQlsYWJlbCAgICAgIAkibWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAwNTEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMjQ2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAyNTAiDQotCQkJCWxhYmVsICAgICAgCSJsZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJGMDE4QyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMDAwNkIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ3aGl0ZVNwYWNlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMDAwNzUiDQotCQkJCWxhYmVsICAgICAgCSJ3aGl0ZVNwYWNlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzIwMjFEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2NyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMzMDBBQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVudW1lcmF0aW9uRmFjZXRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzMwMEFDIg0KLQkJCQlsYWJlbCAgICAgIAkiZW51bWVyYXRpb25GYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEM1MDE1OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDNjAwQjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXR0ZXJuRmFjZXRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzYwMEJBIg0KLQkJCQlsYWJlbCAgICAgIAkicGF0dGVybkZhY2V0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDODAyQTciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjcxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUVBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY2FyZGluYWxpdHlGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM5MDFGNSINCi0JCQkJbGFiZWwgICAgICAJImNhcmRpbmFsaXR5RmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzIiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMENCMDM5QyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQzAzRDAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJudW1lcmljRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQzAzRDEiDQotCQkJCWxhYmVsICAgICAgCSJudW1lcmljRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3NCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQ0YwMTk5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3NSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQyMDA4NSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heExlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDIwMDhGIg0KLQkJCQlsYWJlbCAgICAgIAkibWF4TGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBENTAwQzUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDFEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWluTGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBENjAwMjciDQotCQkJCWxhYmVsICAgICAgCSJtaW5MZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ4MDBERSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAzQ0QiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0b3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0Q3Ig0KLQkJCQlsYWJlbCAgICAgIAkidG90YWxEaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwREIwMzc3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERDMDM1QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQzAzNjQiDQotCQkJCWxhYmVsICAgICAgCSJmcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAwNDgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREYwM0I5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAib3JkZXJlZEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREYwM0MzIg0KLQkJCQlsYWJlbCAgICAgIAkib3JkZXJlZEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEUzMDBEOSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBFNDAzOEUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJib3VuZGVkRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBFNDAzOTgiDQotCQkJCWxhYmVsICAgICAgCSJib3VuZGVkRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI0NDQwMUVDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ1MDM2MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1heEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI0NDUwMzZBIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4RmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjU0RjAxNDUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1NTAwMzhDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1NTAwMzk2Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNUM0MDExQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNTAyMEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNUM1MDIxNyINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI2MkEwMEFBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNjJCMDEzOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQjAxNDIiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMDAzQTYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2QjEwMzExIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlUGF0dGVybkZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2QjEwMzEyIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlUGF0dGVybkZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTYiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCN0NBMDI2QiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTciDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQjAxODYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTkwIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5OCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI4NDAwMDYyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5OSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODQxMDAxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MTAwMjciDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5ODAxNkQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDU2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5OTAwNjAiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDIiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDA1MiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAzQjkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVMZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDNDMyINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUxlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI5NzAwMURCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOTcxMDBDRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1pbkZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI5NzEwMEQ5Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA2Ig0KLQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRTAxQ0MiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTBGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljRmFjZXRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRjAxMUEiDQotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNGYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA4Ig0KLQkJCXF1aWQgICAgICAgCSIzRDRCQjREMzAyOEUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkYzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1BhcnRpY2xlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRENDAyRkQiDQotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNQYXJ0aWNsZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTAiDQotCQkJcXVpZCAgICAgICAJIjNENEJCNEQ5MDFGNiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTEiDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyODQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljV2lsZGNhcmQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNERBMDI4RSINCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMiINCi0JCQlxdWlkICAgICAgIAkiM0Q0QzY4RkYwMUJGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMyINCi0JCQkJcXVpZCAgICAgICAJIjNENEM2OTAyMDMxNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJcXVpZCAgICAgICAJIjNENEM2OTAyMDMxOCINCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkNCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIxLiBDb21wb25lbnQgSGllcmFyY2h5IChQYXJ0IDE6IFN0cnVjdHVyZXMpIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4NDc2ODAxMzgiDQotCQkJdGl0bGUgICAgICAJIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDM4Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgODApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDM4OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExNjgsIDU2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDAsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiDQotCQkJCXdpZHRoICAgICAgCTQ3NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAyMjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDM4Nw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg5MjgsIDIyNSkNCi0JCQkJICAgICg5MjgsIDEzNSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDM5MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYwLCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCXdpZHRoICAgICAgCTIzNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwMywgNzA2KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzODgNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTIwMywgNzA2KQ0KLQkJCQkgICAgKDEyMDMsIDYxNSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IiBAMzkyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDYyNCwgNTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM3MiwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJCXdpZHRoICAgICAgCTUyMg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ0LCA3MDkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDM5Mg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0NDQsIDcwOSkNCi0JCQkJICAgICg0NDQsIDYxNSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzk0DQotCQkJCWxvY2F0aW9uICAgCSgxNTcyLCA0NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDM5MA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNTcyLCA0NjUpDQotCQkJCSAgICAoMTU3MiwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDM5NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDgwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzk1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjkwLCA3NTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDM5Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDEwNTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzk2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjYyLCAxMDEzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAMzk3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMDQsIDMyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzk3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM2LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJd2lkdGggICAgICAJMzU0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzk4DQotCQkJCWxvY2F0aW9uICAgCSg0NTMsIDEyMDMpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDM5Ng0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0NTMsIDEyMDMpDQotCQkJCSAgICAoNDUzLCAxMTExKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDM5OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMzIwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDAwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgODAwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NDYsIDc1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDAxDQotCQkJCWxvY2F0aW9uICAgCSgxODcyLCA5NTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDQwMA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxODcyLCA5NTApDQotCQkJCSAgICAoMTg3MiwgODU1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MDINCi0JCQkJbG9jYXRpb24gICAJKDE4MSwgNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzOTkNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTgxLCA0NjUpDQotCQkJCSAgICAoMTgxLCAzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANDAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzAsIDEyMzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk1NTANCi0JCQkJaGVpZ2h0ICAgICAJMTE4DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA0MDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMTA1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNCwgMTAxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANDA1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjksIDE0NDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTY1Ng0KLQkJCQloZWlnaHQgICAgIAkxMTINCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA0MDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgMTQ4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTAzLCAxNDQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU2Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQl3aWR0aCAgICAgIAk1ODENCi0JCQkJaGVpZ2h0ICAgICAJMTEyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDQwNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1NjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANDA4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEwNTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc3OCwgMTAxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA0MDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgNTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA2LCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANDEwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTI5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2LCAxMjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJd2lkdGggICAgICAJNTEwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANDExDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgNTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDQxMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxMjgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEyMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANDEzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTQ4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAsIDE0NDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNjk0DQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBANDE0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQyNiwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQl3aWR0aCAgICAgIAkzMTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA0MTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDgsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQl3aWR0aCAgICAgIAk0MDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDE2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3QkIwMzQ5Ig0KLQkJCQljbGllbnQgICAgIAlAMzk3DQotCQkJCXN1cHBsaWVyICAgCUAzODcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTQsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTQsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzg5KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA0MTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDgwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2OTAsIDc1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDE4DQotCQkJCWxvY2F0aW9uICAgCSg5NjIsIDk0NykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANDE3DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDk2MiwgOTQ3KQ0KLQkJCQkgICAgKDk2MiwgODU1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxOQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA0MjANCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE4LCAxMTU0KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMTYzNTM0DQotCQkJCSAgICBoZWlnaHQgICAgIAk2OQ0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjU1MDMyQiINCi0JCQkJY2xpZW50ICAgICAJQDQxMA0KLQkJCQlzdXBwbGllciAgIAlAMzkyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDksIDEyNDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDksIDcwOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MjENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUA0MTANCi0JCQkJc3VwcGxpZXIgICAJQDM5Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjU2LCAxMjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjU2LCAxMjAzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiINCi0JCQkJY2xpZW50ICAgICAJQDQxMQ0KLQkJCQlzdXBwbGllciAgIAlAMzk5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODQsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NCwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTY0MDI3OSINCi0JCQkJY2xpZW50ICAgICAJQDQwOQ0KLQkJCQlzdXBwbGllciAgIAlAMzkwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDAyLCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDAyLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM5NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDI0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QUEwMUQzIg0KLQkJCQljbGllbnQgICAgIAlAMzkwDQotCQkJCXN1cHBsaWVyICAgCUAzODcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjksIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjksIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzg5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MjUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiDQotCQkJCWNsaWVudCAgICAgCUA0MDcNCi0JCQkJc3VwcGxpZXIgICAJQDM5MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5MCwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5MCwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyNg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEZDMDFFNyINCi0JCQkJY2xpZW50ICAgICAJQDM5NQ0KLQkJCQlzdXBwbGllciAgIAlAMzkyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MTAsIDc0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNzA5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyNw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM4MDBEMiINCi0JCQkJY2xpZW50ICAgICAJQDQxMg0KLQkJCQlzdXBwbGllciAgIAlANDE3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzIxLCAxMjI1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyMSwgOTQ3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyOA0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA0MjkNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNywgODg2KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMjE1ODEyDQotCQkJCSAgICBoZWlnaHQgICAgIAk2NA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjE3MDAyRSINCi0JCQkJY2xpZW50ICAgICAJQDQwNA0KLQkJCQlzdXBwbGllciAgIAlAMzkwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjAwLCAxMDAxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIwMCwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJY2xpZW50ICAgICAJQDQwNA0KLQkJCQlzdXBwbGllciAgIAlANDAwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDkzLCAxMDAxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgOTUwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCINCi0JCQkJY2xpZW50ICAgICAJQDM5Ng0KLQkJCQlzdXBwbGllciAgIAlANDE3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTAsIDEwMDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDk0NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0Q2NDAyMzEiDQotCQkJCWNsaWVudCAgICAgCUAzOTkNCi0JCQkJc3VwcGxpZXIgICAJQDM4Nw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzg5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODRGNzAwOTIiDQotCQkJCWNsaWVudCAgICAgCUA0MTUNCi0JCQkJc3VwcGxpZXIgICAJQDM4Nw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxMiwgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxMiwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzODkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzNA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEI4MDI4NiINCi0JCQkJY2xpZW50ICAgICAJQDM5Mg0KLQkJCQlzdXBwbGllciAgIAlAMzg3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzQsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgzNCwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzODkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUEyMDE5NyINCi0JCQkJY2xpZW50ICAgICAJQDM4OA0KLQkJCQlzdXBwbGllciAgIAlAMzg3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUwLCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzUwLCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM4OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUxNzcwMTE2Ig0KLQkJCQljbGllbnQgICAgIAlANDE0DQotCQkJCXN1cHBsaWVyICAgCUAzODcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3MiwgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTcyLCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM4OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIg0KLQkJCQljbGllbnQgICAgIAlANDAzDQotCQkJCXN1cHBsaWVyICAgCUA0MDANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTMsIDEyMjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjkzLCA5NTApDQotCQkJCWRyYXdTdXBwbGllciAJQDQwMSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBQTMwMjQyIg0KLQkJCQljbGllbnQgICAgIAlANDA1DQotCQkJCXN1cHBsaWVyICAgCUAzODgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1OTAsIDE0MzIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTkwLCA3MDYpDQotCQkJCWRyYXdTdXBwbGllciAJQDM5MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ5NDMwMkYxIg0KLQkJCQljbGllbnQgICAgIAlANDA2DQotCQkJCXN1cHBsaWVyICAgCUAzODgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzEsIDE0MzIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDMxLCA3MDYpDQotCQkJCWRyYXdTdXBwbGllciAJQDM5MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIg0KLQkJCQljbGllbnQgICAgIAlANDE3DQotCQkJCXN1cHBsaWVyICAgCUAzODgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1OSwgNzQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCA3MDYpDQotCQkJCWRyYXdTdXBwbGllciAJQDM5MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3Ig0KLQkJCQljbGllbnQgICAgIAlANDAwDQotCQkJCXN1cHBsaWVyICAgCUAzODgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NzIsIDc0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzIsIDcwNikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDNDAwOTAiDQotCQkJCWNsaWVudCAgICAgCUA0MDgNCi0JCQkJc3VwcGxpZXIgICAJQDQxNw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYyLCAxMDAxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTYyLCA5NDcpDQotCQkJCWRyYXdTdXBwbGllciAJQDQxOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQzDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQ0NA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NSwgMTM4OCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxODcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0MjUzMQ0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjcNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QkFBMjAzMTAiDQotCQkJCWNsaWVudCAgICAgCUA0MTMNCi0JCQkJc3VwcGxpZXIgICAJQDM5OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjgsIDE0MjkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOCwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDQxMw0KLQkJCQlzdXBwbGllciAgIAlAMzk2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NTYsIDE0MjkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTYsIDEyMDMpDQotCQkJCWRyYXdTdXBwbGllciAJQDM5OCkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLiBDb21wb25lbnQgUmVsYXRpb25zIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSINCi0JCQlxdWlkICAgICAgIAkiMzc0QjE4MTkwMDI4Ig0KLQkJCXRpdGxlICAgICAgCSIyLiBDb21wb25lbnQgUmVsYXRpb25zIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSINCi0JCQl6b29tICAgICAgIAk5Ng0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDQ0Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDc4NCwgMTYzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NzAsIDE1OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDQ3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxNjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCAxNTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjgiIEA0NDgNCi0JCQkJbG9jYXRpb24gICAJKDQ5NCwgMTYyNykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1MzAxN0EiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NvcGUiIEA0NDkNCi0JCQkJCVBhcmVudF9WaWV3IAlANDQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoMjg2LCAtNDg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU1LCAxNTg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Njb3BlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzcxMjU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1NDAwNkQiDQotCQkJCQljbGllbnQgICAgIAlANDQ4DQotCQkJCQlzdXBwbGllciAgIAlANDQ2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMTYyNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjEsIDE2MjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDE2NjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTEwMTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyOSIgQDQ1Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NDgNCi0JCQkJCWxvY2F0aW9uICAgCSgyODYsIC00ODUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTQwMDZFIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDE2MjcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzI3LCAxNjI3KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDQ1Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAxMjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODQsIDExOTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCXdpZHRoICAgICAgCTIzNA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANDU0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNzYsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1MSwgOTUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjY4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYwIiBANDU1DQotCQkJCWxvY2F0aW9uICAgCSgyMjI5LCAxMTEyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzg5MDEyMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjEiIEA0NTYNCi0JCQkJCVBhcmVudF9WaWV3IAlANDU1DQotCQkJCQlsb2NhdGlvbiAgIAkoNTQ5LCAtMjQ4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzQzhBMDExMCINCi0JCQkJCWNsaWVudCAgICAgCUA0NTUNCi0JCQkJCXN1cHBsaWVyICAgCUA0NTQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyOSwgMTExMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjI5LCAxMDQ1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInRlcm0iIEA0NTcNCi0JCQkJCVBhcmVudF9WaWV3IAlANDU1DQotCQkJCQlsb2NhdGlvbiAgIAkoNTQ5LCAtMjQ4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE1NywgMTEyMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0ZXJtIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTM0MzI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4QTAxMTEiDQotCQkJCQljbGllbnQgICAgIAlANDU1DQotCQkJCQlzdXBwbGllciAgIAlANDUzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMjksIDExMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTE3OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNzQsIDExMTkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMTk0MDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IiBANDYwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDEyMzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDYwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgMTE5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQl3aWR0aCAgICAgIAk1MjINCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANDYxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDc2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDYxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3NywgNzI3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAkzNTINCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDgiIEA0NjINCi0JCQkJbG9jYXRpb24gICAJKDIyMTksIDg4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzYwNjAyNkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ5IiBANDYzDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ2Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0zNTcsIC0yNDApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDcwMjIxIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ2Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE5LCA4ODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxOSwgODIxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhcnRpY2xlcyIgQDQ2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjINCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU3LCAtMjQwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDY1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwNSwgODg4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhcnRpY2xlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NjYyNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNjA3MDIyMiINCi0JCQkJCWNsaWVudCAgICAgCUA0NjINCi0JCQkJCXN1cHBsaWVyICAgCUA0NTQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxOSwgODgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDkzOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDY0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyODEsIDg4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NjYyNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDQ2Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzksIDk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5Mg0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDQ2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDUsIDEzODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJd2lkdGggICAgICAJMzUyDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA0NjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NywgOTUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJd2lkdGggICAgICAJNTA4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk0IiBANDcwDQotCQkJCWxvY2F0aW9uICAgCSg1OTAsIDExNDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QUIwMjczIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5NSIgQDQ3MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzANCi0JCQkJCWxvY2F0aW9uICAgCSgzMDIsIDE0OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyOTEiDQotCQkJCQljbGllbnQgICAgIAlANDcwDQotCQkJCQlzdXBwbGllciAgIAlANDY5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNTkwLCAxMTQwKQ0KLQkJCQkJICAgICg1NDAsIDExNDApDQotCQkJCQkgICAgKDU0MCwgMTA0NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MCwgMTE0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDAsIDEwNDUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANDcyDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ3MA0KLQkJCQkJbG9jYXRpb24gICAJKDMwMiwgMTQ4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDczDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAxMTcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjA1MzU3MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDU5MCwgMTE0MCkNCi0JCQkJCSAgICAoNjQxLCAxMTQwKQ0KLQkJCQkJICAgICg2NDEsIDEwNDUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQxLCAxMDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTg0LCAxMDk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjEyMjQ0OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA0NzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk1NDQNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5NiIgQDQ3Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTExOSwgMTExMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdERjAyNEYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTciIEA0NzcNCi0JCQkJCVBhcmVudF9WaWV3IAlANDc2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1NjksIC04KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0UxMDBGRCINCi0JCQkJCWNsaWVudCAgICAgCUA0NzYNCi0JCQkJCXN1cHBsaWVyICAgCUA0NzUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTExMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMDQ1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRUeXBlIiBANDc4DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ3Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTY5LCAtOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDc4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTksIDExMjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudFR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDg5NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdFMTAwRkUiDQotCQkJCQljbGllbnQgICAgIAlANDc2DQotCQkJCQlzdXBwbGllciAgIAlANDYwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDExMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExOSwgMTE3OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDc4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNjMsIDExMjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDg5NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAyIiBANDgxDQotCQkJCWxvY2F0aW9uICAgCSgxNDU1LCA5ODIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkEwMTI2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwMyIgQDQ4Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODENCi0JCQkJCWxvY2F0aW9uICAgCSgxNTksIC01NzApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkIwMTUwIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ4MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ3NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU1LCA5ODIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4MCwgOTgyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkIiBANDgzDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4MQ0KLQkJCQkJbG9jYXRpb24gICAJKDE1OSwgLTU3MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDgzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDUsIDkyOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjI4NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg1MUJCMDE1MSINCi0JCQkJCWNsaWVudCAgICAgCUA0ODENCi0JCQkJCXN1cHBsaWVyICAgCUA0NjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1NSwgOTgyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzAsIDk4MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDgzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTAsIDEwMjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NDI4NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTgiIEA0ODYNCi0JCQkJbG9jYXRpb24gICAJKDkyMSwgMTIwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4Mzk1OTAwNkUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTkiIEA0ODcNCi0JCQkJCVBhcmVudF9WaWV3IAlANDg2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg3MSwgLTM3NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4Mzk1OTAzNDkiDQotCQkJCQljbGllbnQgICAgIAlANDg2DQotCQkJCQlzdXBwbGllciAgIAlANDc1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyMSwgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjEsIDEwNDUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVXNlcyIgQDQ4OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODYNCi0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc4LCAxMjUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVVzZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNjk5MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4Mzk1OTAzNEEiDQotCQkJCQljbGllbnQgICAgIAlANDg2DQotCQkJCQlzdXBwbGllciAgIAlANDY4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyMSwgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjEsIDEzNzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzksIDEyNTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODgzNDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANDkxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgNzY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTIyLCA3MjcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzgwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJMzk4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANDkyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDE2MzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjMsIDE1OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTQ4NA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANDkzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNDgsIDQ0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDkzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwMywgNDA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTA4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUyIiBANDk0DQotCQkJCWxvY2F0aW9uICAgCSgyMjE2LCA2MDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUMwMjVBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1MyIgQDQ5NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0OTQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTUyLCAtODE2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOCINCi0JCQkJCWNsaWVudCAgICAgCUA0OTQNCi0JCQkJCXN1cHBsaWVyICAgCUA0OTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxNiwgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTYsIDUwMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtb2RlbEdyb3VwIiBANDk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ5NA0KLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCA2MjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbW9kZWxHcm91cCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4MjYwOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSINCi0JCQkJCWNsaWVudCAgICAgCUA0OTQNCi0JCQkJCXN1cHBsaWVyICAgCUA0NjENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxNiwgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTYsIDcxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNTYsIDYzMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzMzY0NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA0OTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDk5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYxOSwgMTM4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4MiIgQDUwMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTY3NiwgMTIwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdCRjAxNTAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODMiIEA1MDENCi0JCQkJCVBhcmVudF9WaWV3IAlANTAwDQotCQkJCQlsb2NhdGlvbiAgIAkoNDEyLCAtMzQ0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4N0MwMDBBNyINCi0JCQkJCWNsaWVudCAgICAgCUA1MDANCi0JCQkJCXN1cHBsaWVyICAgCUA0OTkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY3NiwgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc2LCAxMzcxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkIiBANTAyDQotCQkJCQlQYXJlbnRfVmlldyAJQDUwMA0KLQkJCQkJbG9jYXRpb24gICAJKDQxMiwgLTM0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTcsIDExMDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MjU3NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdDMDAwQTgiDQotCQkJCQljbGllbnQgICAgIAlANTAwDQotCQkJCQlzdXBwbGllciAgIAlANDY3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NzYsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NiwgMTA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTgsIDExMDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MTk2MzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzgiIEA1MDUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjksIDE0MzgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1OUYwMDg2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc5IiBANTA2DQotCQkJCQlQYXJlbnRfVmlldyAJQDUwNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zNjMsIC0xNDYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDY5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ5OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTAsIDE0MzgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVXNlcyIgQDUwNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzYzLCAtMTQ2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNSwgMTUwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVVc2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMyNTk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzVBMDAwNkEiDQotCQkJCQljbGllbnQgICAgIAlANTA1DQotCQkJCQlzdXBwbGllciAgIAlANDY4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI0OCwgMTQzOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjcsIDEzOTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NjM1MzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA1MTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODMsIDEzODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0ODQNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4NiIgQDUxMQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzc3LCAxNDI1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTg1MDEwRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4NyIgQDUxMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTENCi0JCQkJCWxvY2F0aW9uICAgCSgtNTE5LCAtMzY3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTg2MDBGQSINCi0JCQkJCWNsaWVudCAgICAgCUA1MTENCi0JCQkJCXN1cHBsaWVyICAgCUA0NjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc3LCAxNDI1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NiwgMTQyNSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDUxMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTENCi0JCQkJCWxvY2F0aW9uICAgCSgtNTE5LCAtMzY3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzg0LCAxNTA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA1OTI1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZCIg0KLQkJCQkJY2xpZW50ICAgICAJQDUxMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUxMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzcsIDE0MjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU4LCAxNDI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTE1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIxLCAxMzg1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyNDQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDcwIiBANTE2DQotCQkJCWxvY2F0aW9uICAgCSgyMzcsIDEyMDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkIwMkNCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDcxIiBANTE3DQotCQkJCQlQYXJlbnRfVmlldyAJQDUxNg0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDQzLCA3MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2RDAwQTYiDQotCQkJCQljbGllbnQgICAgIAlANTE2DQotCQkJCQlzdXBwbGllciAgIAlANTEwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzcsIDEzNzEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEA1MTgNCi0JCQkJCVBhcmVudF9WaWV3IAlANTE2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNDMsIDcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzg4LCAxMjQ3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIzOTI2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTZEMDBBNyINCi0JCQkJCWNsaWVudCAgICAgCUA1MTYNCi0JCQkJCXN1cHBsaWVyICAgCUA0NjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM3LCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NSwgMTI0NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMzkyNjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA1MjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA3ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTIxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4LCA3NDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTANCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5MiIgQDUyMg0KLQkJCQlsb2NhdGlvbiAgIAkoNzI4LCA3NzUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzUwMzQwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkzIiBANTIzDQotCQkJCQlQYXJlbnRfVmlldyAJQDUyMg0KLQkJCQkJbG9jYXRpb24gICAJKC04NTYsIC01NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEQiDQotCQkJCQljbGllbnQgICAgIAlANTIyDQotCQkJCQlzdXBwbGllciAgIAlANDc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzI4LCA3NzUpDQotCQkJCQkgICAgKDc4OCwgNzc1KQ0KLQkJCQkJICAgICg3ODgsIDkzOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcyOCwgNzc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4OCwgOTM5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDUyNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjINCi0JCQkJCWxvY2F0aW9uICAgCSgtODU2LCAtNTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTgsIDg4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4xNDA5NDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEUiDQotCQkJCQljbGllbnQgICAgIAlANTIyDQotCQkJCQlzdXBwbGllciAgIAlANTIxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcyOCwgNzc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3OSwgNzc1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzUwLCA4MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTUyNDM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA1MjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgNDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDE3LCA0MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTYwOA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNCIgQDUyOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTYyOSwgNTc0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEMjlFMDE0RCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2VkS2V5IiBANTI5DQotCQkJCQlQYXJlbnRfVmlldyAJQDUyOA0KLQkJCQkJbG9jYXRpb24gICAJKC04MywgOTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzYxLCA2MDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVmZXJlbmNlZEtleSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43OTcyOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEMkE4MDE2NSINCi0JCQkJCWNsaWVudCAgICAgCUA1MjgNCi0JCQkJCXN1cHBsaWVyICAgCUA1MjcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjI5LCA1NzQpDQotCQkJCQkgICAgKDE1NTUsIDU3NCkNCi0JCQkJCSAgICAoMTU1NSwgNTAxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyOSwgNTc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTUsIDUwMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjIsIDUzOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0NzYxOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM1IiBANTMyDQotCQkJCQlQYXJlbnRfVmlldyAJQDUyOA0KLQkJCQkJbG9jYXRpb24gICAJKC04MywgOTQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyQTgwMTZGIg0KLQkJCQkJY2xpZW50ICAgICAJQDUyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDUyNw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MjksIDU3NCkNCi0JCQkJCSAgICAoMTY4OSwgNTc0KQ0KLQkJCQkJICAgICgxNjg5LCA0NDQpDQotCQkJCQkgICAgKDE2MTYsIDQ0NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjksIDU3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE2LCA0NDQpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzgiIEA1MzMNCi0JCQkJbG9jYXRpb24gICAJKDExOTcsIDYwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAwMjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM5IiBANTM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDUzMw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM2NSINCi0JCQkJCWNsaWVudCAgICAgCUA1MzMNCi0JCQkJCXN1cHBsaWVyICAgCUA1MjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDUwMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEA1MzUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTMzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNSwgMzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTE5LCA2NTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTIwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmllbGRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDM5MjUyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNzkiDQotCQkJCQljbGllbnQgICAgIAlANTMzDQotCQkJCQlzdXBwbGllciAgIAlANDkxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA3MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUzLCA2NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40Mjk5MDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM2IiBANTM4DQotCQkJCWxvY2F0aW9uICAgCSgxNDE1LCA2MDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzNyIgQDUzOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxMDMsIDMyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIyQSINCi0JCQkJCWNsaWVudCAgICAgCUA1MzgNCi0JCQkJCXN1cHBsaWVyICAgCUA1MjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNSwgNjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTUsIDUwMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzZWxlY3RvciIgQDU0MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxMDMsIDMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMywgNjUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDExMjE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMzQiDQotCQkJCQljbGllbnQgICAgIAlANTM4DQotCQkJCQlzdXBwbGllciAgIAlANDkxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTUsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE1LCA3MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzgxLCA2NTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTI1MjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANTQzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTU5OQ0KLQkJCQloZWlnaHQgICAgIAkyMDkNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4MCIgQDU0NA0KLQkJCQlsb2NhdGlvbiAgIAkoMjM5NSwgNjA2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRUE3MDIzRSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODEiIEA1NDUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTQ0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgMTc0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRUE4MDM4QSINCi0JCQkJCWNsaWVudCAgICAgCUA1NDQNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzk1LCA2MDYpDQotCQkJCQkgICAgKDIzOTUsIDY1KQ0KLQkJCQkJICAgICgxNjExLCA2NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCA2NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJub3RhdGlvbkRlY2xhcmF0aW9ucyIgQDU0Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDQNCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAxNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDg5LCAxMDQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbm90YXRpb25EZWNsYXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDg5Nzc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzA3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTgwMzhCIg0KLQkJCQkJY2xpZW50ICAgICAJQDU0NA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ5Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzOTUsIDYwNikNCi0JCQkJCSAgICAoMjM5NSwgMTYzMykNCi0JCQkJCSAgICAoMjA5OCwgMTYzMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDk4LCAxNjMzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM0NCwgMTA1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQ4NzgyOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzYiIEA1NDkNCi0JCQkJbG9jYXRpb24gICAJKDE3NzIsIDI0OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVGRjAyNEYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc3IiBANTUwDQotCQkJCQlQYXJlbnRfVmlldyAJQDU0OQ0KLQkJCQkJbG9jYXRpb24gICAJKC05NDgsIC0zMjcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVGMDAwMjVBIg0KLQkJCQkJY2xpZW50ICAgICAJQDU0OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU0Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzcyLCAyNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMjQ5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXBEZWZpbml0aW9ucyIgQDU1MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDkNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQ4LCAtMzI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NiwgMzM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxMzU5Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRjAwMDI2NCINCi0JCQkJCWNsaWVudCAgICAgCUA1NDkNCi0JCQkJCXN1cHBsaWVyICAgCUA0OTMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNzcyLCAyNDkpDQotCQkJCQkgICAgKDE4MzIsIDI0OSkNCi0JCQkJCSAgICAoMTgzMiwgMzk1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMjQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MzIsIDM5NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDM0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNzg2NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzIiIEA1NTQNCi0JCQkJbG9jYXRpb24gICAJKDIzNDYsIDUxOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU5MjAyMTYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTczIiBANTU1DQotCQkJCQlQYXJlbnRfVmlldyAJQDU1NA0KLQkJCQkJbG9jYXRpb24gICAJKDE1NCwgODYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcyLCAxODU3KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjYzMDA3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTkzMDE4QiINCi0JCQkJCWNsaWVudCAgICAgCUA1NTQNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQ2LCA1MTgpDQotCQkJCQkgICAgKDIzNDYsIDE0OSkNCi0JCQkJCSAgICAoMTYxMSwgMTQ5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDE0OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIiBANTU3DQotCQkJCQlQYXJlbnRfVmlldyAJQDU1NA0KLQkJCQkJbG9jYXRpb24gICAJKDE1NCwgODYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA4LCAxOTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zNDk5NDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU5MzAxOEMiDQotCQkJCQljbGllbnQgICAgIAlANTU0DQotCQkJCQlzdXBwbGllciAgIAlANDk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0NiwgNTE4KQ0KLQkJCQkJICAgICgyMzQ2LCAxNDQxKQ0KLQkJCQkJICAgICgyMTY2LCAxNDQxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNjYsIDE0NDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjk5LCAxOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzQ4ODYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3NCIgQDU2MA0KLQkJCQlsb2NhdGlvbiAgIAkoMjAzLCAxNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMDQ5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3NSIgQDU2MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjANCi0JCQkJCWxvY2F0aW9uICAgCSgtNDg1LCAtMjczKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDM3NCINCi0JCQkJCWNsaWVudCAgICAgCUA1NjANCi0JCQkJCXN1cHBsaWVyICAgCUA1NDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAzLCAxNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTU5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9ucyIgQDU2Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjANCi0JCQkJCWxvY2F0aW9uICAgCSgtNDg1LCAtMjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQ5LCAxOTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjQ3NTcyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzdFIg0KLQkJCQkJY2xpZW50ICAgICAJQDU2MA0KLQkJCQkJc3VwcGxpZXIgICAJQDUyMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIwMywgMTU5KQ0KLQkJCQkJICAgICgxMDQsIDE1OSkNCi0JCQkJCSAgICAoMTA0LCA3ODQpDQotCQkJCQkgICAgKDE4OSwgNzg0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAzLCAxNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5LCA3ODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTUsIDIwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1OTcwMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzgiIEA1NjUNCi0JCQkJbG9jYXRpb24gICAJKDEwODcsIDMyOSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExNzAxRUQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc5IiBANTY2DQotCQkJCQlQYXJlbnRfVmlldyAJQDU2NQ0KLQkJCQkJbG9jYXRpb24gICAJKC01NzcsIC0yMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExQTAyNzMiDQotCQkJCQljbGllbnQgICAgIAlANTY1DQotCQkJCQlzdXBwbGllciAgIAlANTQzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDMyOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCAyNjQpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEA1NjcNCi0JCQkJCVBhcmVudF9WaWV3IAlANTY1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM3NSwgMzM4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMwOTUyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMUEwMjdEIg0KLQkJCQkJY2xpZW50ICAgICAJQDU2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUyNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCAzMjkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgMzk1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxOCwgMzM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTA3MTQzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3MCIgQDU3MA0KLQkJCQlsb2NhdGlvbiAgIAkoNDgsIDMyMCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQTAwQzMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTcxIiBANTcxDQotCQkJCQlQYXJlbnRfVmlldyAJQDU3MA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtMjg4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZGREZCMDI3RCINCi0JCQkJCWNsaWVudCAgICAgCUA1NzANCi0JCQkJCXN1cHBsaWVyICAgCUA1NDMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0OSwgMzIyKQ0KLQkJCQkJICAgICg0OSwgNjgpDQotCQkJCQkgICAgKDEwMTMsIDY4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDksIDMyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCA2OCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiIEA1NzINCi0JCQkJCVBhcmVudF9WaWV3IAlANTcwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC0yODgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMzgsIDEwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVEZWNsYXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk4NTM2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkZERkIwMjdFIg0KLQkJCQkJY2xpZW50ICAgICAJQDU3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDUxMA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ5LCAzMjIpDQotCQkJCQkgICAgKDQ5LCAxNDE1KQ0KLQkJCQkJICAgICgxNzQsIDE0MTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OSwgMzIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NCwgMTQxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxLCAxMDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk2NzA2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDU3NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDQ0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1LCA0MTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNTAxDQotCQkJCWhlaWdodCAgICAgCTk3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjAiIEA1NzYNCi0JCQkJbG9jYXRpb24gICAJKDQ5OSwgNTg5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlDMDU5MDE5OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjEiIEA1NzcNCi0JCQkJCVBhcmVudF9WaWV3IAlANTc2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzLCAxMDkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNUQwMUUzIg0KLQkJCQkJY2xpZW50ICAgICAJQDU3Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDU3NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ5OSwgNTg5KQ0KLQkJCQkJICAgICg0NTIsIDU4OSkNCi0JCQkJCSAgICAoNDUyLCA0OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTksIDU4OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTIsIDQ5NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIiBANTc4DQotCQkJCQlQYXJlbnRfVmlldyAJQDU3Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xMywgMTA5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTc5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODExLCA1ODUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAk2LjUyMDgzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QzA1RDAxRUQiDQotCQkJCQljbGllbnQgICAgIAlANTc2DQotCQkJCQlzdXBwbGllciAgIAlANTc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNDk5LCA1ODkpDQotCQkJCQkgICAgKDU0NywgNTg5KQ0KLQkJCQkJICAgICg1NDcsIDQ5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5OSwgNTg5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU0NywgNDk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDk5LCA1NTkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE0IiBANTgxDQotCQkJCWxvY2F0aW9uICAgCSgyNDEsIDYxMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAwNTgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE1IiBANTgyDQotCQkJCQlQYXJlbnRfVmlldyAJQDU4MQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMzQzLCAtMjE5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDNCRiINCi0JCQkJCWNsaWVudCAgICAgCUA1ODENCi0JCQkJCXN1cHBsaWVyICAgCUA1NzUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQxLCA2MTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQxLCA0OTYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEA1ODMNCi0JCQkJCVBhcmVudF9WaWV3IAlANTgxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzNDMsIC0yMTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MDgsIDY5NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4NjQ0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE2Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDNDMCINCi0JCQkJCWNsaWVudCAgICAgCUA1ODENCi0JCQkJCXN1cHBsaWVyICAgCUA1MjENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQxLCA2MTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQxLCA3MzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIsIDY4NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYxMDE2OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTYiIEA1ODYNCi0JCQkJbG9jYXRpb24gICAJKDgzNywgNDYwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzM0VGMDE2MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTciIEA1ODcNCi0JCQkJCVBhcmVudF9WaWV3IAlANTg2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MTksIC02OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTgiDQotCQkJCQljbGllbnQgICAgIAlANTg2DQotCQkJCQlzdXBwbGllciAgIAlANTc1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNywgNDYwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2NiwgNDYwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBANTg4DQotCQkJCQlQYXJlbnRfVmlldyAJQDU4Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xODE5LCAtNjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODAsIDUyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1MTQ2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU4Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDUyNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzcsIDQ2MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA4LCA0NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDQwNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzMDQzNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjgiIEA1OTENCi0JCQkJbG9jYXRpb24gICAJKDU0MSwgMjQ2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRThEMDFCRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjkiIEA1OTINCi0JCQkJCVBhcmVudF9WaWV3IAlANTkxDQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMjMsIC0xODYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOEUwMTk4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU5MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU0Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NDEsIDI0NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAyNDYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudERlY2xhcmF0aW9ucyIgQDU5Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1OTENCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0MywgMzM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VsZW1lbnREZWNsYXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDkzMDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRThFMDE5OSINCi0JCQkJCWNsaWVudCAgICAgCUA1OTENCi0JCQkJCXN1cHBsaWVyICAgCUA1NzUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg1NDEsIDI0NikNCi0JCQkJCSAgICAoMjI0LCAyNDYpDQotCQkJCQkgICAgKDIyNCwgNDAwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTQxLCAyNDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI0LCA0MDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODYsIDMzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NDY5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjIiIEA1OTYNCi0JCQkJbG9jYXRpb24gICAJKDM1MywgNjIxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDNDJEQkREMDI5NyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjMiIEA1OTcNCi0JCQkJCVBhcmVudF9WaWV3IAlANTk2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzLCAxNzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCRTAwMTFFIg0KLQkJCQkJY2xpZW50ICAgICAJQDU5Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDU3NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDM1MywgNjIxKQ0KLQkJCQkJICAgICgzMDYsIDYyMSkNCi0JCQkJCSAgICAoMzA2LCA0OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTMsIDYyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDYsIDQ5NikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzdWJzdGl0dXRpb25Hcm91cCIgQDU5OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1OTYNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMsIDE3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTk4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3OSwgNjM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTQuODA4NTExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzQyREJFMDAxMjgiDQotCQkJCQljbGllbnQgICAgIAlANTk2DQotCQkJCQlzdXBwbGllciAgIAlANTc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzUzLCA2MjEpDQotCQkJCQkgICAgKDQwMCwgNjIxKQ0KLQkJCQkJICAgICg0MDAsIDQ5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM1MywgNjIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQwMCwgNDk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjAwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUwLCA1ODMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDY5NzY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIzLiBDb21wb25lbnQgQXR0cmlidXRlcyAgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5RTc4NjAyQzUiDQotCQkJdGl0bGUgICAgICAJIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBANjAxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ2LCA0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ2LCAxMDcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBuYW1lIDogU3RyaW5nIg0KLQkJCQkJIisgdGFyZ2V0TmFtZXNwYWNlIDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTUzNA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA2MDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTY3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJNTEyDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA2MDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMTY4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTUyNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTU4NCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTUNCi0JCQkJICAgIG1heF93aWR0aCAgCTExMzkNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBkZXJpdmF0aW9uTWV0aG9kIDogWFNERGVyaXZhdGlvbk1ldGhvZCA9IHJlc3RyaWN0aW9uIg0KLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RDb21wbGV4RmluYWwiDQotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iDQotCQkJCQkiKyBjb250ZW50VHlwZUNhdGVnb3J5IDogWFNEQ29udGVudFR5cGVDYXRlZ29yeSINCi0JCQkJCSI8PDAuLio+PiArIHByb2hpYml0ZWRTdWJzdGl0dXRpb25zIDogWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKSkNCi0JCQkJd2lkdGggICAgICAJMTE5Mg0KLQkJCQloZWlnaHQgICAgIAkzMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjA0DQotCQkJCWxvY2F0aW9uICAgCSg0NjMsIDM2MikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjAxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQ2MywgMzYyKQ0KLQkJCQkgICAgKDQ2MywgMjIxKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDYwNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCAxNjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAxNTE5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5NCwgMTU3OSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTU5Mg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHZhcmlldHkgOiBYU0RWYXJpZXR5Ig0KLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk2NDYNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDYwNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDE0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCAzOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDk4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgcmVxdWlyZWQgOiBib29sZWFuIg0KLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSINCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpDQotCQkJCXdpZHRoICAgICAgCTU0OA0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA2MDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAxOTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgzMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg5MCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTEyNjANCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBuYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkgOiBYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCQkiPDwwLi4qPj4gKyBuYW1lc3BhY2VDb25zdHJhaW50IDogU3RyaW5nIg0KLQkJCQkJIisgcHJvY2Vzc0NvbnRlbnRzIDogWFNEUHJvY2Vzc0NvbnRlbnRzIikpDQotCQkJCXdpZHRoICAgICAgCTEzMDQNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA2MDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMzYsIDE0NDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCAxMzg0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU3OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAk1OTYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA2MDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCA1MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQ5MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiDQotCQkJCQkiKyBjb25zdHJhaW50IDogWFNEQ29uc3RyYWludCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYxMA0KLQkJCQlsb2NhdGlvbiAgIAkoMjk0LCA2OTcpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDYwOQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyOTQsIDY5NykNCi0JCQkJICAgICgyOTQsIDYwNSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANjExDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI1NiwgMTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTk1LCA0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQl3aWR0aCAgICAgIAk1NDANCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBANjEyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2ODgsIDUxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDE4LCA0NjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMjY4NCwgOTYyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2MTINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjY4NCwgOTYyKQ0KLQkJCQkgICAgKDI2ODQsIDU3NikpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9zaXRvciIgQDYxNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDExMTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9zaXRvciIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxMDY2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2OUI2MjAwMzciDQotCQkJCXdpZHRoICAgICAgCTM0NA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWludCIgQDYxNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgNTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzgsIDQ2OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW50IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM4LCA0MTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODY5RTI2MDFBRSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REZXJpdmF0aW9uTWV0aG9kIiBANjE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE5MiwgMjI3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4MCwgMjIxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REZXJpdmF0aW9uTWV0aG9kIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4MCwgMjE2MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NkEwQjAwMENFIg0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IiBANjE3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCA4OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyODEsIDM4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTFFMDAyNzIiDQotCQkJCXdpZHRoICAgICAgCTYyNQ0KLQkJCQloZWlnaHQgICAgIAkzMDANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29udGVudFR5cGVDYXRlZ29yeSIgQDYxOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3MDQsIDIyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0NTYsIDIxMTUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0NTYsIDIwNjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODZBNzlGMDNBMiINCi0JCQkJd2lkdGggICAgICAJNTE0DQotCQkJCWhlaWdodCAgICAgCTM0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RWYXJpZXR5IiBANjE5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAxNjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MDgsIDE1MTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVmFyaWV0eSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcwOCwgMTQ2NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY3NzMwMjQ5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNjINCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2Nlc3NDb250ZW50cyIgQDYyMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgMjI0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAyMTU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2Nlc3NDb250ZW50cyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc2NiwgMjEwNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY4QzcwMjg0Ig0KLQkJCQl3aWR0aCAgICAgIAk0MzgNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoVmFyaWV0eSIgQDYyMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3NjgsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjU4NywgOTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhWYXJpZXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjU4NywgNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOEZGQjg5MDMzQSINCi0JCQkJd2lkdGggICAgICAJMzgxDQotCQkJCWhlaWdodCAgICAgCTI1MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDYyMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAxODcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzg5LCAxNzg4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTczOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyNUQwMjk1Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzg5LCAxODQ4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTk5DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbGlzdCINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIg0KLQkJCQkJIisgdW5pb24iKSkNCi0JCQkJd2lkdGggICAgICAJMzQ0DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4RmluYWwiIEA2MjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMjAwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMTk0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxODkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzJDQTAxQ0IiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDIwMDEpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBleHRlbnNpb24iDQotCQkJCQkiKyByZXN0cmljdGlvbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAkzODINCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIgQDYyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDg1LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4NSwgMTA3NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1OTEwMEFFIg0KLQkJCQl3aWR0aCAgICAgIAk2NDgNCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIiBANjI1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0NDAsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDExMTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMDY2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVBNDAzREYiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDExNzYpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzYNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBzdWJzdGl0dXRpb24iDQotCQkJCQkiKyBleHRlbnNpb24iDQotCQkJCQkiKyByZXN0cmljdGlvbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTYNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBANjI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2NjQsIDIyNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTgsIDIyMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMTYzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVCRTAyNzIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTgsIDIyNzMpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBleHRlbnNpb24iDQotCQkJCQkiKyByZXN0cmljdGlvbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTANCi0JCQkJaGVpZ2h0ICAgICAJMjQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIgQDYyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgMjI0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDIxNTQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDIxMDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUVBMDAyMyINCi0JCQkJd2lkdGggICAgICAJNjk2DQotCQkJCWhlaWdodCAgICAgCTI5Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA2MjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2NCwgODgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDc0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMzg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCA4MDkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAkxMzU3DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbmlsbGFibGUgOiBib29sZWFuIg0KLQkJCQkJIjw8MC4uKj4+ICsgZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMgOiBYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyINCi0JCQkJCSI8PDAuLio+PiArIHN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyA6IFhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyINCi0JCQkJCSIrIGFic3RyYWN0IDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAkxNDA0DQotCQkJCWhlaWdodCAgICAgCTI4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYyOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJY2xpZW50ICAgICAJQDYyOA0KLQkJCQlzdXBwbGllciAgIAlANjA5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODEsIDczNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4MSwgNjk3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDYzMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDg2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDgxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTQ5Mg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANjMxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2ODgsIDExNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MjAsIDExMDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYzMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM4MDBEMiINCi0JCQkJY2xpZW50ICAgICAJQDYzMQ0KLQkJCQlzdXBwbGllciAgIAlANjEyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODYyLCAxMDg4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg2MiwgOTYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDYzMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzUyLCAxMzEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNjgsIDEyNjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzODYNCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYzNA0KLQkJCQlsb2NhdGlvbiAgIAkoMjM3NSwgMTQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjMzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDIzNzUsIDE0NjUpDQotCQkJCSAgICAoMjM3NSwgMTM3NSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MzUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCWNsaWVudCAgICAgCUA2MzMNCi0JCQkJc3VwcGxpZXIgICAJQDYxMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM2OCwgMTI0OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNjgsIDk2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjEzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MzYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUA2MDMNCi0JCQkJc3VwcGxpZXIgICAJQDYzMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjgxOCwgMTUxMikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4MTgsIDE0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDYzNCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjM3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlANjA1DQotCQkJCXN1cHBsaWVyICAgCUA2MzMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MDYsIDE1MDcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA2LCAxNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzQpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDYzOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCAxMTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODE4LCAxMTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTEwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYzOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCINCi0JCQkJY2xpZW50ICAgICAJQDYzOA0KLQkJCQlzdXBwbGllciAgIAlANjEyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTE1LCAxMDg5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgOTYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANjQwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgNTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDM0LCA0NjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTEzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAkxMTUwDQotCQkJCWhlaWdodCAgICAgCTE0NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiINCi0JCQkJY2xpZW50ICAgICAJQDY0MA0KLQkJCQlzdXBwbGllciAgIAlANjAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY4LCA0NTYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY4LCAzNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYwNCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA2NDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCA3ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzgsIDcwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNTAyDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA2NDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQzLCAyNjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjg0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OTQzMDJGMSINCi0JCQkJY2xpZW50ICAgICAJQDY0Mg0KLQkJCQlzdXBwbGllciAgIAlANjAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjkwLCA2OTEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjkwLCAzNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYwNCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIg0KLQkJCQljbGllbnQgICAgIAlANjMwDQotCQkJCXN1cHBsaWVyICAgCUA2MDkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MSwgODAwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxLCA2OTcpDQotCQkJCWRyYXdTdXBwbGllciAJQDYxMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3Ig0KLQkJCQljbGllbnQgICAgIAlANjA5DQotCQkJCXN1cHBsaWVyICAgCUA2MDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM3MiwgNDE5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzcyLCAzNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYwNCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIg0KLQkJCQljbGllbnQgICAgIAlANjEyDQotCQkJCXN1cHBsaWVyICAgCUA2MDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2ODcsIDQ0OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2ODcsIDM2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjA0KSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjQuIENvbXBvbmVudCBIaWVyYXJjaHksIFJlbGF0aW9ucyBhbmQgQXR0cmlidXRlcyAoUGFydCAyOiBEYXRhdHlwZXMpIg0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzI2NTAwNUYiDQotCQkJdGl0bGUgICAgICAJIjQuIENvbXBvbmVudCBIaWVyYXJjaHksIFJlbGF0aW9ucyBhbmQgQXR0cmlidXRlcyAoUGFydCAyOiBEYXRhdHlwZXMpIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IiBANjQ4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCA4OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzIsIDg0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGaXhlZEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSINCi0JCQkJd2lkdGggICAgICAJMzM4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA2NDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3MjAsIDg5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDQsIDg0NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZXBlYXRhYmxlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk0NTANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiIEA2NTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NiwgMTExMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbnVtZXJhdGlvbkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSINCi0JCQkJd2lkdGggICAgICAJNDc4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiIEA2NTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NzcsIDExMTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGF0dGVybkZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyINCi0JCQkJd2lkdGggICAgICAJNDgwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NTINCi0JCQkJbG9jYXRpb24gICAJKDcxOCwgMTA0OSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjQ5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDcxOCwgMTA0OSkNCi0JCQkJICAgICg3MTgsIDk1OSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0IiBANjUzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgOTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzk5LCA4NzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCINCi0JCQkJd2lkdGggICAgICAJNDIwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RCb3VuZGVkRmFjZXQiIEA2NTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCA5MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODMsIDg3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RCb3VuZGVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0Ig0KLQkJCQl3aWR0aCAgICAgIAkzODgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEA2NTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDMyLCAxMTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA3LCAxMDQ4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5RmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAk0NjgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIgQDY1Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1MDQsIDExMDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTksIDEwNDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETnVtZXJpY0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQkJd2lkdGggICAgICAJMzg4DQotCQkJCWhlaWdodCAgICAgCTEzNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCIgQDY1Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgMTM3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDkxLCAxMzIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQkJd2lkdGggICAgICAJMzQ4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDY1OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDYwOCwgMTU1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjU4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA1LCAxNDk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkxlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQkJd2lkdGggICAgICAJNDI0DQotCQkJCWhlaWdodCAgICAgCTEzNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NTkNCi0JCQkJbG9jYXRpb24gICAJKDE0NCwgMTI2MikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjQ4DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE0NCwgMTI2MikNCi0JCQkJICAgICgxNDQsIDk2NCkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEA2NjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCAxNTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA3LCAxNDk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heExlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M3MDE0NiINCi0JCQkJd2lkdGggICAgICAJNDM2DQotCQkJCWhlaWdodCAgICAgCTEzNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiIEA2NjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMzc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4ODAsIDEzMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQkJd2lkdGggICAgICAJNDk4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhJbmNsdXNpdmVGYWNldCIgQDY2Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDE3MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTAsIDE2NzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4N0QwMERBIg0KLQkJCQl3aWR0aCAgICAgIAk0NjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IiBANjYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgMTkwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5MywgMTg1MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhFeGNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiIEA2NjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDE3MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI4MiwgMTY3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5JbmNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiDQotCQkJCXdpZHRoICAgICAgCTQ0Ng0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiIEA2NjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDE5MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNCwgMTg1MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5FeGNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiDQotCQkJCXdpZHRoICAgICAgCTQ3NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIgQDY2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMjExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIsIDIwNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVG90YWxEaWdpdHNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiDQotCQkJCXdpZHRoICAgICAgCTQyNg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIgQDY2Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDIxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTgsIDIwNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERnJhY3Rpb25EaWdpdHNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM5RDAzQzciDQotCQkJCWNsaWVudCAgICAgCUA2NTANCi0JCQkJc3VwcGxpZXIgICAJQDY0OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzk0LCAxMTAwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzk0LCAxMDQ5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODYyMDA0NSINCi0JCQkJY2xpZW50ICAgICAJQDY2MQ0KLQkJCQlzdXBwbGllciAgIAlANjQ4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMzA4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExOSwgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjU5KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBANjcwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAxNjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAxMTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY3MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2Q0E1MDM4RCINCi0JCQkJY2xpZW50ICAgICAJQDY1MQ0KLQkJCQlzdXBwbGllciAgIAlANjQ5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMTAwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA0NCwgMTA0OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjUyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NzINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4MDAyREYiDQotCQkJCWNsaWVudCAgICAgCUA2NTcNCi0JCQkJc3VwcGxpZXIgICAJQDY0OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYzLCAxMzA4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYzLCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkIiBANjczDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgMTQwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTMyNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTI3NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNTIwMkU0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDQNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5IiBANjc0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTY2OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDE2MTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCQzc3MTVEMDA5QiINCi0JCQkJd2lkdGggICAgICAJNDQ0DQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlIiBANjc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMjAzMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2MSwgMTk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2MSwgMTkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0JFRUQwRjYwMzQyIg0KLQkJCQl3aWR0aCAgICAgIAk0MjQNCi0JCQkJaGVpZ2h0ICAgICAJMjg3DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlZhbHVlIiBANjc2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAyMDk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDIwNjIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVmFsdWUiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDIwMTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQzA0MEI1QjAzMUYiDQotCQkJCXdpZHRoICAgICAgCTYzNg0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NzcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I2MTAzMzciDQotCQkJCWNsaWVudCAgICAgCUA2NjYNCi0JCQkJc3VwcGxpZXIgICAJQDY0OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDIwNDQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NSwgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjU5KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiIEA2NzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAxMzc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTMyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTM4MCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1NA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkNCi0JCQkJd2lkdGggICAgICAJMzA0DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIgQDY3OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTg0LCAxMzc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDEzMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMzgwKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjU4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSIpKQ0KLQkJCQl3aWR0aCAgICAgIAkzMDYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjgwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFEMjQwMDk4Ig0KLQkJCQljbGllbnQgICAgIAlANjc4DQotCQkJCXN1cHBsaWVyICAgCUA2NDgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNSwgMTMwOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNSwgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUQzMTAzQUQiDQotCQkJCWNsaWVudCAgICAgCUA2NzkNCi0JCQkJc3VwcGxpZXIgICAJQDY0OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgMTMwOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODEsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjgyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTIwMzUzIg0KLQkJCQljbGllbnQgICAgIAlANjY0DQotCQkJCXN1cHBsaWVyICAgCUA2NzgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NSwgMTY2NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NSwgMTQ0NCkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjgzMDNCOCINCi0JCQkJY2xpZW50ICAgICAJQDY2Mg0KLQkJCQlzdXBwbGllciAgIAlANjc5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAwLCAxNjY0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwMCwgMTQ0NCkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjhFMDMwOSINCi0JCQkJY2xpZW50ICAgICAJQDY2Mw0KLQkJCQlzdXBwbGllciAgIAlANjc5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjIyLCAxODQwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyMiwgMTQ0NCkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M0MDBDMCINCi0JCQkJY2xpZW50ICAgICAJQDY1OA0KLQkJCQlzdXBwbGllciAgIAlANjQ4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NDcsIDE0ODUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDcsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjg2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCN0QwMEZDIg0KLQkJCQljbGllbnQgICAgIAlANjYwDQotCQkJCXN1cHBsaWVyICAgCUA2NDgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzOTcsIDE0ODUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzk3LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3Qjk5MDAxNiINCi0JCQkJY2xpZW50ICAgICAJQDY2Nw0KLQkJCQlzdXBwbGllciAgIAlANjQ4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc1LCAyMDQ0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3NSwgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjU5KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA2ODgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAzNjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAzMTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAk0MDYNCi0JCQkJaGVpZ2h0ICAgICAJMTI1DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY2LCA1MjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDY4OA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgzNjYsIDUyMikNCi0JCQkJICAgICgzNjYsIDQzMCkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEA2OTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDYyNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNCwgNTczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyINCi0JCQkJd2lkdGggICAgICAJNDYyDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2OTENCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgNzgxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2OTANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjcyLCA3ODEpDQotCQkJCSAgICAoMjcyLCA2ODcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjkyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOEYwMDJFIg0KLQkJCQljbGllbnQgICAgIAlANjQ5DQotCQkJCXN1cHBsaWVyICAgCUA2OTANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5NCwgODMzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTk0LCA3ODEpDQotCQkJCWRyYXdTdXBwbGllciAJQDY5MSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiIEA2OTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDYyNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjYsIDU3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGdW5kYW1lbnRhbEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiINCi0JCQkJd2lkdGggICAgICAJNDcwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2OTQNCi0JCQkJbG9jYXRpb24gICAJKDc2OCwgNzg5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2OTMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNzY4LCA3ODkpDQotCQkJCSAgICAoNzY4LCA2ODcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjk1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NTkwMTJDIg0KLQkJCQljbGllbnQgICAgIAlANjUzDQotCQkJCXN1cHBsaWVyICAgCUA2OTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNTAsIDg2MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNTAsIDc4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjk0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzYzQzAyMjQiDQotCQkJCWNsaWVudCAgICAgCUA2NTQNCi0JCQkJc3VwcGxpZXIgICAJQDY5Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUyNSwgODYwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyNSwgNzg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2OTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjRGMDEzMSINCi0JCQkJY2xpZW50ICAgICAJQDY1NQ0KLQkJCQlzdXBwbGllciAgIAlANjkzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjM3LCAxMDM2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIzNywgNzg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2OTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjQyMDA3NCINCi0JCQkJY2xpZW50ICAgICAJQDY1Ng0KLQkJCQlzdXBwbGllciAgIAlANjkzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAxMDM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgNzg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2OTQpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDY5OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDU2LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjk5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgMTA3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTk4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgdmFyaWV0eSA6IFhTRFZhcmlldHkiDQotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRFNpbXBsZUZpbmFsIikpDQotCQkJCXdpZHRoICAgICAgCTY1Ng0KLQkJCQloZWlnaHQgICAgIAkyNTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI2IiBANzAwDQotCQkJCWxvY2F0aW9uICAgCSg3NzUsIDE3OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3MTAyRUEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI3IiBANzAxDQotCQkJCQlQYXJlbnRfVmlldyAJQDcwMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjA5LCAtNDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MDksIDIzNSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1OTc1MDExOSINCi0JCQkJCWNsaWVudCAgICAgCUA3MDANCi0JCQkJCXN1cHBsaWVyICAgCUA2ODgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NzUsIDE3OCkNCi0JCQkJCSAgICAoNTUwLCAxNzgpDQotCQkJCQkgICAgKDU1MCwgMzA2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc1LCAxNzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTUwLCAzMDYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2ltcGxlVHlwZURlZmluaXRpb24iIEA3MDMNCi0JCQkJCVBhcmVudF9WaWV3IAlANzAwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMDksIC00NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzAzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjgzMTMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3NTAxMDUiDQotCQkJCQljbGllbnQgICAgIAlANzAwDQotCQkJCQlzdXBwbGllciAgIAlANjk5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NSwgMTc4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDE3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzAzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNjEsIDIxNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjUwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODgiIEA3MDYNCi0JCQkJbG9jYXRpb24gICAJKDM2OSwgNzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JDOEFFMDIwM0E4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZhY2V0cyIgQDcwNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MDYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTYxNSwgLTE1MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NywgNDk2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZhY2V0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzg2Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JDOEFFMDYwMDY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDcwNg0KLQkJCQkJc3VwcGxpZXIgICAJQDY5MA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDM2OSwgNzIpDQotCQkJCQkgICAgKDEwMCwgNzIpDQotCQkJCQkgICAgKDEwMCwgNTYxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY5LCA3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDAsIDU2MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYwLCA0OTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTc5MDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4OSIgQDcxMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MDYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTYxNSwgLTE1MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NiwgMzEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwNjAwNTEiDQotCQkJCQljbGllbnQgICAgIAlANzA2DQotCQkJCQlzdXBwbGllciAgIAlANjk5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM2OSwgNzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOCwgNzIpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzAiIEA3MTINCi0JCQkJbG9jYXRpb24gICAJKDE1MzgsIDUwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzEzDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzgsIDQ0OSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDANCi0JCQkJICAgIGhlaWdodCAgICAgCTYwDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwREUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMxIiBANzE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDcxMg0KLQkJCQkJbG9jYXRpb24gICAJKC00NDYsIDI4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDYsIDM0MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERiINCi0JCQkJCWNsaWVudCAgICAgCUA3MTINCi0JCQkJCXN1cHBsaWVyICAgCUA2OTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM4LCA1MDgpDQotCQkJCQkgICAgKDE0ODcsIDUwOCkNCi0JCQkJCSAgICAoMTQ4NywgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgNTA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDI4NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpdGVtVHlwZURlZmluaXRpb24iIEA3MTYNCi0JCQkJCVBhcmVudF9WaWV3IAlANzEyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ0NiwgMjg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTc3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2l0ZW1UeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi4yMTE1MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBFMCINCi0JCQkJCWNsaWVudCAgICAgCUA3MTINCi0JCQkJCXN1cHBsaWVyICAgCUA2OTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM4LCA1MDgpDQotCQkJCQkgICAgKDE1OTAsIDUwOCkNCi0JCQkJCSAgICAoMTU5MCwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgNTA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTAsIDI4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzE2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzksIDQ2OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMzk4NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTAiIEA3MTkNCi0JCQkJbG9jYXRpb24gICAJKDE3MjksIDU3NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzRCNzAyMDgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkxIiBANzIwDQotCQkJCQlQYXJlbnRfVmlldyAJQDcxOQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDM1MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzcsIDM1MykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNEJFMDI1OCINCi0JCQkJCWNsaWVudCAgICAgCUA3MTkNCi0JCQkJCXN1cHBsaWVyICAgCUA2OTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNzI5LCA1NzQpDQotCQkJCQkgICAgKDE2NzgsIDU3NCkNCi0JCQkJCSAgICAoMTY3OCwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzgsIDI4NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiIEA3MjINCi0JCQkJCVBhcmVudF9WaWV3IAlANzE5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgMzUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzIzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OSwgNjU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21lbWJlclR5cGVEZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy4yNjkyMzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNEJFMDI1OSINCi0JCQkJCWNsaWVudCAgICAgCUA3MTkNCi0JCQkJCXN1cHBsaWVyICAgCUA2OTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNzI5LCA1NzQpDQotCQkJCQkgICAgKDE3ODEsIDU3NCkNCi0JCQkJCSAgICAoMTc4MSwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3ODEsIDI4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzAsIDUyMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMxMjEyMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTIiIEA3MjUNCi0JCQkJbG9jYXRpb24gICAJKDc0OCwgMjY5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNjMyMDFEQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmdW5kYW1lbnRhbEZhY2V0cyIgQDcyNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIzNiwgNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDMxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmdW5kYW1lbnRhbEZhY2V0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS40MDkwOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNjM1MDA2MyINCi0JCQkJCWNsaWVudCAgICAgCUA3MjUNCi0JCQkJCXN1cHBsaWVyICAgCUA2OTMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NDgsIDI2OSkNCi0JCQkJCSAgICAoNjU5LCAyNjkpDQotCQkJCQkgICAgKDY1OSwgNTYxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU5LCA1NjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjgsIDM4NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzODAyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkzIiBANzI5DQotCQkJCQlQYXJlbnRfVmlldyAJQDcyNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjM2LCA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzI5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNTIsIDIyOCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNjM1MDA1OSINCi0JCQkJCWNsaWVudCAgICAgCUA3MjUNCi0JCQkJCXN1cHBsaWVyICAgCUA2OTkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOCwgMjY5KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk0IiBANzMxDQotCQkJCWxvY2F0aW9uICAgCSgxMTc1LCAzOTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QUIwMjczIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5NSIgQDczMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzENCi0JCQkJCWxvY2F0aW9uICAgCSgtODA5LCAxNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAzMTYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyOTEiDQotCQkJCQljbGllbnQgICAgIAlANzMxDQotCQkJCQlzdXBwbGllciAgIAlANjk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3NSwgMzk2KQ0KLQkJCQkJICAgICgxMTM1LCAzOTYpDQotCQkJCQkgICAgKDExMzUsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzUsIDM5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTM1LCAyODUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANzM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDczMQ0KLQkJCQkJbG9jYXRpb24gICAJKC04MDksIDE3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzM0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzQsIDQ0MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuNTMzMzMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyQTUiDQotCQkJCQljbGllbnQgICAgIAlANzMxDQotCQkJCQlzdXBwbGllciAgIAlANjk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3NSwgMzk2KQ0KLQkJCQkJICAgICgxMjE1LCAzOTYpDQotCQkJCQkgICAgKDEyMTUsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzUsIDM5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjE1LCAyODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTcyLCAzNTkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDk2MTU0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NiIgQDczNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNDQ2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ1NTcyMDE2QyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTciIEA3MzgNCi0JCQkJCVBhcmVudF9WaWV3IAlANzM3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYyNCwgMjIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2OCwgMzI3KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzUwMjJGIg0KLQkJCQkJY2xpZW50ICAgICAJQDczNw0KLQkJCQkJc3VwcGxpZXIgICAJQDY5OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNjAsIDQ0NikNCi0JCQkJCSAgICAoMTMwOSwgNDQ2KQ0KLQkJCQkJICAgICgxMzA5LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYwLCA0NDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwOSwgMjg1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIiBANzQwDQotCQkJCQlQYXJlbnRfVmlldyAJQDczNw0KLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDQsIDUwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy4wMDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1NTc1MDI0MyINCi0JCQkJCWNsaWVudCAgICAgCUA3MzcNCi0JCQkJCXN1cHBsaWVyICAgCUA2OTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzYwLCA0NDYpDQotCQkJCQkgICAgKDE0MTIsIDQ0NikNCi0JCQkJCSAgICAoMTQxMiwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MCwgNDQ2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTIsIDI4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzMsIDQwOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MjE0Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDc0Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgwLCA1MTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDQyOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDM3OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyNUQwMjk1Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCA0ODgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBsaXN0Ig0KLQkJCQkJIisgcmVzdHJpY3Rpb24iDQotCQkJCQkiKyB1bmlvbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFZhcmlldHkiIEA3NDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgwLCAxNzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDkyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFZhcmlldHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE4LCA0MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY3NzMwMjQ5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQ1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDN0IwMzk2Ig0KLQkJCQljbGllbnQgICAgIAlANjkzDQotCQkJCXN1cHBsaWVyICAgCUA2ODgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MSwgNTYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTkxLCA1MjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY4OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQ2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODAwMzk0Ig0KLQkJCQljbGllbnQgICAgIAlANjkwDQotCQkJCXN1cHBsaWVyICAgCUA2ODgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3MiwgNTYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjcyLCA1MjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY4OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQ3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDI1NjgwMjU5Ig0KLQkJCQljbGllbnQgICAgIAlANjg4DQotCQkJCXN1cHBsaWVyICAgCUA2NzANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM2NiwgMzA2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY2LCAyMTUpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4ODAxQjQiDQotCQkJCWNsaWVudCAgICAgCUA2NDgNCi0JCQkJc3VwcGxpZXIgICAJQDY5MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3LCA4MjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDc4MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjkxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NDkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I1OTAyODEiDQotCQkJCWNsaWVudCAgICAgCUA2NjUNCi0JCQkJc3VwcGxpZXIgICAJQDY3OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwLCAxODQwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwLCAxNDQ0KSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI1LiBDb21wb25lbnQgQW5ub3RhdGlvbnMiDQotCQkJcXVpZCAgICAgICAJIjNCNjlENjhEMDBEMiINCi0JCQl0aXRsZSAgICAgIAkiNS4gQ29tcG9uZW50IEFubm90YXRpb25zIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA3NTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJd2lkdGggICAgICAJMzU0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDc1MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTY5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODIsIDE2NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzUyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgMTUwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyNiwgMTQ2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEA3NTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAzMDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2MywgMjYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyINCi0JCQkJd2lkdGggICAgICAJNDY4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANzU0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxMzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTMxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJd2lkdGggICAgICAJNjA2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDc1NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgNzA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgNjYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDc1Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDExNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA3NTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDU0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDUwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA3NTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjAwLCA4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2OCwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjgyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA3NTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTM2LCAxMjE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTAsIDExNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDc2MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTk5NCwgMTQxMikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANzU5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE5OTQsIDE0MTIpDQotCQkJCSAgICAoMTk5NCwgMTI3MSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NjENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUA3NTINCi0JCQkJc3VwcGxpZXIgICAJQDc1OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA4NCwgMTQ0OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwODQsIDE0MTIpDQotCQkJCWRyYXdTdXBwbGllciAJQDc2MCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDc2Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgODY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MCwgODIxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTQwMg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA3NjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCA4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODkyLCAzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCXdpZHRoICAgICAgCTIzNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANzY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAzODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg0LCAzNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA3NjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDE4MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDc2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3OTIsIDE3MTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjcsIDE2NzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjUxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNjY5DQotCQkJCWhlaWdodCAgICAgCTEwMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NjcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUA3NjYNCi0JCQkJc3VwcGxpZXIgICAJQDc1OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU3MiwgMTY2MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NzIsIDE0MTIpDQotCQkJCWRyYXdTdXBwbGllciAJQDc2MCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA3NjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDEwMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc4LCA5ODEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIgQDc2OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDU2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjg4LCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVwZWF0YWJsZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSINCi0JCQkJd2lkdGggICAgICAJNDUwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDc3MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTUzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzcwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzEsIDE0OTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBANzcxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgOTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzIsIDY4NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJd2lkdGggICAgICAJNzM4DQotCQkJCWhlaWdodCAgICAgCTU0Mw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMyIiBANzcyDQotCQkJCWxvY2F0aW9uICAgCSg4NjUsIDEzNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMTgzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzMyIgQDc3Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzINCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCA1NTkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMzNDIg0KLQkJCQkJY2xpZW50ICAgICAJQDc3Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDc1NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjUsIDEzNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjcxLCAxMzU5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NzQNCi0JCQkJCVBhcmVudF9WaWV3IAlANzcyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgNTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzc1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk4LCAxMzIxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuMTE2NjY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzNDYiDQotCQkJCQljbGllbnQgICAgIAlANzcyDQotCQkJCQlzdXBwbGllciAgIAlANzcxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoODY1LCAxMzU5KQ0KLQkJCQkJICAgICg5MjUsIDEzNTkpDQotCQkJCQkgICAgKDkyNSwgMTIxNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg2NSwgMTM1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjUsIDEyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEyNzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDY0MjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU2IiBANzc3DQotCQkJCWxvY2F0aW9uICAgCSg3MTMsIDcwOSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRjAyMTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU3IiBANzc4DQotCQkJCQlQYXJlbnRfVmlldyAJQDc3Nw0KLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMDAwQzkiDQotCQkJCQljbGllbnQgICAgIAlANzc3DQotCQkJCQlzdXBwbGllciAgIAlANzU1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxMywgNzA5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgNzA5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NzkNCi0JCQkJCVBhcmVudF9WaWV3IAlANzc3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNywgLTkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzI3LCA2NjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTIzOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTAwMEQzIg0KLQkJCQkJY2xpZW50ICAgICAJQDc3Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTMsIDcwOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDcwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzc5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5NiwgNzUzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTUzNTcxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1MCIgQDc4Mg0KLQkJCQlsb2NhdGlvbiAgIAkoNzE5LCAxMTkzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE1MDA4QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTEiIEA3ODMNCi0JCQkJCVBhcmVudF9WaWV3IAlANzgyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwMSwgMzkzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE2MDA5NiINCi0JCQkJCWNsaWVudCAgICAgCUA3ODINCi0JCQkJCXN1cHBsaWVyICAgCUA3NTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTE5MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzg0DQotCQkJCQlQYXJlbnRfVmlldyAJQDc4Mg0KLQkJCQkJbG9jYXRpb24gICAJKC00MDEsIDM5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMCwgMTE0NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDA2OTkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNjAwQTAiDQotCQkJCQljbGllbnQgICAgIAlANzgyDQotCQkJCQlzdXBwbGllciAgIAlANzcxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTE5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDExOTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDYsIDEyNDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDQxNjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEwIiBANzg3DQotCQkJCWxvY2F0aW9uICAgCSg3ODUsIDU1MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQTAwNjYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTExIiBANzg4DQotCQkJCQlQYXJlbnRfVmlldyAJQDc4Nw0KLQkJCQkJbG9jYXRpb24gICAJKC0zMzUsIC0yNTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEIwMjNGIg0KLQkJCQkJY2xpZW50ICAgICAJQDc4Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDc1Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDU1MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzg5DQotCQkJCQlQYXJlbnRfVmlldyAJQDc4Nw0KLQkJCQkJbG9jYXRpb24gICAJKC0zMzUsIC0yNTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzksIDUxNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA3MDcwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEIwMjQ5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc4Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc4NSwgNTUwKQ0KLQkJCQkJICAgICg4ODQsIDU1MCkNCi0JCQkJCSAgICAoODg0LCA2NzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4ODQsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkzNSwgNjEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzI5NzMwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4MiIgQDc5Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgNDA0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFNDU2MDI5MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODMiIEA3OTMNCi0JCQkJCVBhcmVudF9WaWV3IAlANzkyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyLCAtNDEyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFNDU3MDE2NSINCi0JCQkJCWNsaWVudCAgICAgCUA3OTINCi0JCQkJCXN1cHBsaWVyICAgCUA3NTgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE4NCwgNDA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDEzNSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDc5NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTINCi0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI0LCAyMjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQ5DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNjY1NDI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTZGIg0KLQkJCQkJY2xpZW50ICAgICAJQDc5Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTg0LCA0MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4NCwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MSwgNjE1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg0Mzg3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5OCIgQDc5Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTc1MiwgMTAzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MTAxNTgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk5IiBANzk4DQotCQkJCQlQYXJlbnRfVmlldyAJQDc5Nw0KLQkJCQkJbG9jYXRpb24gICAJKDUzNiwgMjE4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFMjkyMDE5RiINCi0JCQkJCWNsaWVudCAgICAgCUA3OTcNCi0JCQkJCXN1cHBsaWVyICAgCUA3NTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNzUyLCAxMDM0KQ0KLQkJCQkJICAgICgxODEyLCAxMDM0KQ0KLQkJCQkJICAgICgxODEyLCAxMTYxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MiwgMTAzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEyLCAxMTYxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3OTkNCi0JCQkJCVBhcmVudF9WaWV3IAlANzk3DQotCQkJCQlsb2NhdGlvbiAgIAkoNTM2LCAyMTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzQzLCA5OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1OTYwMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUUyOTIwMUE5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc5Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDEwMzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg0LCAxMDY2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDUwMzMxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMCIgQDgwMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTg5NiwgODgxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOTAwNkNGMDA4OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDEiIEA4MDMNCi0JCQkJCVBhcmVudF9WaWV3IAlAODAyDQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCA0MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZEMTAxNUQiDQotCQkJCQljbGllbnQgICAgIAlAODAyDQotCQkJCQlzdXBwbGllciAgIAlANzU5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTg5NiwgODgxKQ0KLQkJCQkJICAgICgxOTU2LCA4ODEpDQotCQkJCQkgICAgKDE5NTYsIDExNjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk1NiwgMTE2MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJkZXJpdmF0aW9uQW5ub3RhdGlvbiIgQDgwNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDINCi0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIDQwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgODQyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Rlcml2YXRpb25Bbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjU0MjM3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZEMTAxNjciDQotCQkJCQljbGllbnQgICAgIAlAODAyDQotCQkJCQlzdXBwbGllciAgIAlANzcxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4OTYsIDg4MSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCA4ODEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg5LCA5MTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDUwODUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAyIiBAODA3DQotCQkJCWxvY2F0aW9uICAgCSgyMDQwLCA3MTUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzMwMjY0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwMyIgQDgwOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDcNCi0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzNDAyODQiDQotCQkJCQljbGllbnQgICAgIAlAODA3DQotCQkJCQlzdXBwbGllciAgIAlANzU5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjA0MCwgNzE1KQ0KLQkJCQkJICAgICgyMTAwLCA3MTUpDQotCQkJCQkgICAgKDIxMDAsIDExNjEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDQwLCA3MTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMCwgMTE2MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDgwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDcNCi0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTgsIDY4MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzE5Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzQwMjhFIg0KLQkJCQkJY2xpZW50ICAgICAJQDgwNw0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDQwLCA3MTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgNzE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NSwgNzQ2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODA5MzEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyMCIgQDgxMg0KLQkJCQlsb2NhdGlvbiAgIAkoNjY4LCA4NjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzQwMDRGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMSIgQDgxMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTINCi0JCQkJCWxvY2F0aW9uICAgCSgtNjEyLCAzMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNjAwQ0EiDQotCQkJCQljbGllbnQgICAgIAlAODEyDQotCQkJCQlzdXBwbGllciAgIAlANzYyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2OCwgODY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3MywgODY1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAODEyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTYxMiwgMzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MTQsIDgyNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjM0MTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNjAwRDQiDQotCQkJCQljbGllbnQgICAgIAlAODEyDQotCQkJCQlzdXBwbGllciAgIAlANzcxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2OCwgODY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgODY1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAxLCA5MDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODIwNTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI0IiBAODE3DQotCQkJCWxvY2F0aW9uICAgCSgxNDcyLCAxNjcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQjkwMUNEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyNSIgQDgxOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTcNCi0JCQkJCWxvY2F0aW9uICAgCSgyNTYsIC02NDkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUM0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgxNw0KLQkJCQkJc3VwcGxpZXIgICAJQDc2Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0NzIsIDE2NykNCi0JCQkJCSAgICAoMTQ3MiwgNzIpDQotCQkJCQkgICAgKDE4ODMsIDcyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3MiwgMTY3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4ODMsIDcyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAODE3DQotCQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAtNjQ5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODIwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwNCwgMTI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDc2MzA1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUNFIg0KLQkJCQkJY2xpZW50ICAgICAJQDgxNw0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCAxNjcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3MiwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxOSwgNjE4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkzNTc0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc0IiBAODIyDQotCQkJCWxvY2F0aW9uICAgCSg5MjcsIDM1MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwNjAyOTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzUiIEA4MjMNCi0JCQkJCVBhcmVudF9WaWV3IAlAODIyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE5MywgLTQ1MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwNzAxNzEiDQotCQkJCQljbGllbnQgICAgIAlAODIyDQotCQkJCQlzdXBwbGllciAgIAlANzY0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYyOSwgMzUwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAODIyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE5MywgLTQ1MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODI0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgMzEwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuODE2NjY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwNzAxNzIiDQotCQkJCQljbGllbnQgICAgIAlAODIyDQotCQkJCQlzdXBwbGllciAgIAlANzcxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTI3LCAzNTApDQotCQkJCQkgICAgKDk4NywgMzUwKQ0KLQkJCQkJICAgICg5ODcsIDY3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4NywgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNywgNjEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQzMzQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY2IiBAODI3DQotCQkJCWxvY2F0aW9uICAgCSgxMDI3LCAyMjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREMwMkY1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY3IiBAODI4DQotCQkJCQlQYXJlbnRfVmlldyAJQDgyNw0KLQkJCQkJbG9jYXRpb24gICAJKC05MywgLTU3OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REFERDAyMzgiDQotCQkJCQljbGllbnQgICAgIAlAODI3DQotCQkJCQlzdXBwbGllciAgIAlANzY1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjcsIDIyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDIyMikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODI5DQotCQkJCQlQYXJlbnRfVmlldyAJQDgyNw0KLQkJCQkJbG9jYXRpb24gICAJKC05MywgLTU3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgzMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODI5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDMsIDE4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQwNjI1MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREQwMjQyIg0KLQkJCQkJY2xpZW50ICAgICAJQDgyNw0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwMjcsIDIyMikNCi0JCQkJCSAgICAoMTA4NywgMjIyKQ0KLQkJCQkJICAgICgxMDg3LCA2NzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI3LCAyMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgNjEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEwMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4MjU4Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5MCIgQDgzMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ5NCwgMTQzOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjkwMDY4ODAxQzIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTEiIEA4MzMNCi0JCQkJCVBhcmVudF9WaWV3IAlAODMyDQotCQkJCQlsb2NhdGlvbiAgIAkoMjE0LCA1OTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2OEEwMTExIg0KLQkJCQkJY2xpZW50ICAgICAJQDgzMg0KLQkJCQkJc3VwcGxpZXIgICAJQDc2Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk0LCAxNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTQsIDE2NjIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudEFubm90YXRpb24iIEA4MzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAODMyDQotCQkJCQlsb2NhdGlvbiAgIAkoMjE0LCA1OTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk2LCAxMzU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRBbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzY3NzEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2OEEwMTFCIg0KLQkJCQkJY2xpZW50ICAgICAJQDgzMg0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk0LCAxNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTQsIDEyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQzLCAxMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzEzMDA0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NCIgQDgzNw0KLQkJCQlsb2NhdGlvbiAgIAkoNjM3LCAxMDIyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE3MDJDOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDUiIEA4MzgNCi0JCQkJCVBhcmVudF9WaWV3IAlAODM3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4MywgMjIyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE4MDNFMiINCi0JCQkJCWNsaWVudCAgICAgCUA4MzcNCi0JCQkJCXN1cHBsaWVyICAgCUA3NjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjM3LCAxMDIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxMSwgMTAyMikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODM5DQotCQkJCQlQYXJlbnRfVmlldyAJQDgzNw0KLQkJCQkJbG9jYXRpb24gICAJKC00ODMsIDIyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODM5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxMCwgOTc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMjg4ODkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE5MDAwNCINCi0JCQkJCWNsaWVudCAgICAgCUA4MzcNCi0JCQkJCXN1cHBsaWVyICAgCUA3NzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjM3LCAxMDIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgMTAyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODM5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMiwgMTA2MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczMDA4OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NCIgQDg0Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4MSwgNjA3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDNjI2RUE3MDEwMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NSIgQDg0Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDINCi0JCQkJCWxvY2F0aW9uICAgCSgzMDEsIC0yMjUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTkwMTkxIg0KLQkJCQkJY2xpZW50ICAgICAJQDg0Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDc2OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1ODEsIDYwNykNCi0JCQkJCSAgICAoMTU4MSwgNTQ3KQ0KLQkJCQkJICAgICgxNjc5LCA1NDcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTgxLCA2MDcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3OSwgNTQ3KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDg0Mg0KLQkJCQkJbG9jYXRpb24gICAJKDMwMSwgLTIyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NjksIDQ2MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi4xOTY5NzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUE5MDE5MiINCi0JCQkJCWNsaWVudCAgICAgCUA4NDINCi0JCQkJCXN1cHBsaWVyICAgCUA3NzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgNjA3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODEsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzksIDYyMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE5Njk3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDQiIEA4NDcNCi0JCQkJbG9jYXRpb24gICAJKDg0OSwgMTQ5NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMTAyNkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA1IiBAODQ4DQotCQkJCQlQYXJlbnRfVmlldyAJQDg0Nw0KLQkJCQkJbG9jYXRpb24gICAJKC0yNzEsIDY5NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMjAxRjkiDQotCQkJCQljbGllbnQgICAgIAlAODQ3DQotCQkJCQlzdXBwbGllciAgIAlANzcwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg0OSwgMTQ5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTQsIDE0OTYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg0OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjcxLCA2OTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NDIsIDE0NjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4ODI1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTIwMjAzIg0KLQkJCQkJY2xpZW50ICAgICAJQDg0Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDg0OSwgMTQ5NikNCi0JCQkJCSAgICAoMTA2MiwgMTQ5NikNCi0JCQkJCSAgICAoMTA2MiwgMTIxNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg0OSwgMTQ5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDYyLCAxMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNSwgMTI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjY5MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDYiIEA4NTINCi0JCQkJbG9jYXRpb24gICAJKDk1MiwgMTU2NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCMzAwMDUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA3IiBAODUzDQotCQkJCQlQYXJlbnRfVmlldyAJQDg1Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCNDAzMjciDQotCQkJCQljbGllbnQgICAgIAlAODUyDQotCQkJCQlzdXBwbGllciAgIAlANzcwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTU2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTQsIDE1NjUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4NTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAODUyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyOCwgNzMzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NSwgMTUzOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwNDk1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjQwMzMyIg0KLQkJCQkJY2xpZW50ICAgICAJQDg1Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDc3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDk1MiwgMTU2NSkNCi0JCQkJCSAgICAoMTIwMCwgMTU2NSkNCi0JCQkJCSAgICAoMTIwMCwgMTIxNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTU2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjAwLCAxMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NCwgMTI3NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg1Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzgwMDM5NCINCi0JCQkJY2xpZW50ICAgICAJQDc1Mw0KLQkJCQlzdXBwbGllciAgIAlANzYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTg0LCAyNDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTg0LCAxMzUpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4RjAwMkUiDQotCQkJCWNsaWVudCAgICAgCUA3NjkNCi0JCQkJc3VwcGxpZXIgICAJQDc1Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk5NywgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5NywgMzU5KSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI2LiBDb25jcmV0ZSBDb21wb25lbnRzIg0KLQkJCXF1aWQgICAgICAgCSIzQjZBRDc0RDAzQzQiDQotCQkJdGl0bGUgICAgICAJIjYuIENvbmNyZXRlIENvbXBvbmVudHMiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDg1OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgMzczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDg2MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgzMiwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU2OCwgMzczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJCXdpZHRoICAgICAgCTU0Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IiBAODYxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwMCwgNjcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk5MSwgNjI5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiDQotCQkJCXdpZHRoICAgICAgCTQzNg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDg2Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTU2LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiDQotCQkJCXdpZHRoICAgICAgCTQyNg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODYzDQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA1NjEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDg2Mg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMzYwLCA1NjEpDQotCQkJCSAgICAoMTM2MCwgNDcxKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbmNsdWRlIiBAODY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMiwgMTE1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbmNsdWRlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzdEMDI1MCINCi0JCQkJd2lkdGggICAgICAJMjU4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAODY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5NCwgOTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREltcG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJCXdpZHRoICAgICAgCTI0Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIiBAODY2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNSwgMTE1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiDQotCQkJCXdpZHRoICAgICAgCTI4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA4NjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNzUsIDExNTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODUxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCXdpZHRoICAgICAgCTg2OQ0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MiIgQDg2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2OCwgMTIwNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNTAwN0UiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQzIiBAODY5DQotCQkJCQlQYXJlbnRfVmlldyAJQDg2OA0KLQkJCQkJbG9jYXRpb24gICAJKDExNjAsIDQwNikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNjAwNkIiDQotCQkJCQljbGllbnQgICAgIAlAODY4DQotCQkJCQlzdXBwbGllciAgIAlAODY0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjgsIDEyMDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwMywgMTIwNikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODcwDQotCQkJCQlQYXJlbnRfVmlldyAJQDg2OA0KLQkJCQkJbG9jYXRpb24gICAJKDExNjAsIDQwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNDcsIDExNTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NDQxMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzYwMDZDIg0KLQkJCQkJY2xpZW50ICAgICAJQDg2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDg2Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY4LCAxMjA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzQsIDEyMDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzAwLCAxMjUzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEwNw0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxNDcwNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDAiIEA4NzMNCi0JCQkJbG9jYXRpb24gICAJKDExNjgsIDEwMjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDgwMkZDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0MSIgQDg3NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzMNCi0JCQkJCWxvY2F0aW9uICAgCSg5NjAsIDIyMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEOTAxOEIiDQotCQkJCQljbGllbnQgICAgIAlAODczDQotCQkJCQlzdXBwbGllciAgIAlAODY1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE2OCwgMTAyMikNCi0JCQkJCSAgICAoMTE2OCwgOTYyKQ0KLQkJCQkJICAgICgxMjg1LCA5NjIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTY4LCAxMDIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODUsIDk2MikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODc1DQotCQkJCQlQYXJlbnRfVmlldyAJQDg3Mw0KLQkJCQkJbG9jYXRpb24gICAJKDk2MCwgMjIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5MCwgMTA3NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ1Mzc4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTIyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDkwMThDIg0KLQkJCQkJY2xpZW50ICAgICAJQDg3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDg2Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTY4LCAxMDIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNjgsIDExNDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTI3LCAxMDc0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDM2OTc1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2MiIgQDg3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2MywgMTM1MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MjAwOUEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYzIiBAODc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDg3OA0KLQkJCQkJbG9jYXRpb24gICAJKDEzNTUsIDU1MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAyRkUiDQotCQkJCQljbGllbnQgICAgIAlAODc4DQotCQkJCQlzdXBwbGllciAgIAlAODY2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU2MywgMTM1MykNCi0JCQkJCSAgICAoMTk0MCwgMTM1MykNCi0JCQkJCSAgICAoMTk0MCwgMTI1NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjMsIDEzNTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk0MCwgMTI1NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDg4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzE3LCAxMzIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE2ODA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAzMDgiDQotCQkJCQljbGllbnQgICAgIAlAODc4DQotCQkJCQlzdXBwbGllciAgIAlAODY3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU2MywgMTM1MykNCi0JCQkJCSAgICAoMTE4MSwgMTM1MykNCi0JCQkJCSAgICAoMTE4MSwgMTI1OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjMsIDEzNTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4MSwgMTI1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzAsIDEzMjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjEzNDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODgzDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDU2MSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODU5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI4OCwgNTYxKQ0KLQkJCQkgICAgKDI4OCwgNDcxKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDg4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgNjcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ2MCwgNjI5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQkJd2lkdGggICAgICAJNDc0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiIEA4ODUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODg1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1OCwgMzczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiDQotCQkJCXdpZHRoICAgICAgCTQxNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA4ODYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3MjAsIDk2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NTAsIDkxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA4ODcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDY3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTAsIDYyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiDQotCQkJCXdpZHRoICAgICAgCTI0Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0Q2NDAyMzEiDQotCQkJCWNsaWVudCAgICAgCUA4ODcNCi0JCQkJc3VwcGxpZXIgICAJQDg1OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxLCA2MTcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjEsIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODgzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCWNsaWVudCAgICAgCUA4ODQNCi0JCQkJc3VwcGxpZXIgICAJQDg1OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTg5LCA2MTcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODksIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODgzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4OTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJCMzAxRDUiDQotCQkJCWNsaWVudCAgICAgCUA4NjENCi0JCQkJc3VwcGxpZXIgICAJQDg2Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAxNiwgNjE3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxNiwgNTYxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NjMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAODkxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgOTQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTAsIDkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4OTINCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDEwODkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDg5MQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxODI0LCAxMDg5KQ0KLQkJCQkgICAgKDE4MjQsIDk5OSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4OTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEQzAzODEiDQotCQkJCWNsaWVudCAgICAgCUA4NjQNCi0JCQkJc3VwcGxpZXIgICAJQDg5MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2NiwgMTE0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjYsIDEwODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDg5MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODk0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNjQwMjQwIg0KLQkJCQljbGllbnQgICAgIAlAODY2DQotCQkJCXN1cHBsaWVyICAgCUA4OTENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MzQsIDExNDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTM0LCAxMDg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4OTIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA4OTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg0MCwgNjcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzAsIDYyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQl3aWR0aCAgICAgIAk0MzgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4OTYNCi0JCQkJbG9jYXRpb24gICAJKDE3NjIsIDgxOSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODk1DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE3NjIsIDgxOSkNCi0JCQkJICAgICgxNzYyLCA3MjcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODk3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RDkwMDNFIg0KLQkJCQljbGllbnQgICAgIAlAODY1DQotCQkJCXN1cHBsaWVyICAgCUA4OTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTYsIDg4OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTYsIDgxOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODk2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4OTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiDQotCQkJCWNsaWVudCAgICAgCUA4OTUNCi0JCQkJc3VwcGxpZXIgICAJQDg2Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NiwgNjE3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1NiwgNTYxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NjMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDg5OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJd2lkdGggICAgICAJNTA4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTAwDQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAyODkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDg5OQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMTIwLCAyODkpDQotCQkJCSAgICAoMTEyMCwgMTk5KSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDQiIEA5MDENCi0JCQkJbG9jYXRpb24gICAJKDE0ODUsIDIxNSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwODAzQzciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGFpbmVyIiBAOTAyDQotCQkJCQlQYXJlbnRfVmlldyAJQDkwMQ0KLQkJCQkJbG9jYXRpb24gICAJKDk4OSwgMTAzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwNCwgMjEwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRhaW5lciINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAzMzExMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjBDMDFDRSINCi0JCQkJCWNsaWVudCAgICAgCUA5MDENCi0JCQkJCXN1cHBsaWVyICAgCUA4OTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDg1LCAyMTUpDQotCQkJCQkgICAgKDE0ODUsIDE3NikNCi0JCQkJCSAgICAoMTM3NCwgMTc2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NSwgMjE1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNzQsIDE3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzUsIDIyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2OQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMjY0OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA1IiBAOTA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDkwMQ0KLQkJCQkJbG9jYXRpb24gICAJKDk4OSwgMTAzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjBDMDFDRiINCi0JCQkJCWNsaWVudCAgICAgCUA5MDENCi0JCQkJCXN1cHBsaWVyICAgCUA4OTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDg1LCAyMTUpDQotCQkJCQkgICAgKDE0ODUsIDI1NCkNCi0JCQkJCSAgICAoMTM0NSwgMjU0KQ0KLQkJCQkJICAgICgxMzQ1LCAxOTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg1LCAyMTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM0NSwgMTk5KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA2IiBAOTA2DQotCQkJCWxvY2F0aW9uICAgCSg3NzMsIDIxNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0ODAyNjEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdENvbnRhaW5lciIgQDkwNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MDYNCi0JCQkJCWxvY2F0aW9uICAgCSg1MywgMTA0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAyMTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdENvbnRhaW5lciINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjUwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNjANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODUiDQotCQkJCQljbGllbnQgICAgIAlAOTA2DQotCQkJCQlzdXBwbGllciAgIAlAODk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzczLCAyMTYpDQotCQkJCQkgICAgKDc3MywgMTc2KQ0KLQkJCQkJICAgICg4NjYsIDE3NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMjE2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTA5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAyMjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDciIEA5MTANCi0JCQkJCVBhcmVudF9WaWV3IAlAOTA2DQotCQkJCQlsb2NhdGlvbiAgIAkoNTMsIDEwNCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODYiDQotCQkJCQljbGllbnQgICAgIAlAOTA2DQotCQkJCQlzdXBwbGllciAgIAlAODk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzczLCAyMTYpDQotCQkJCQkgICAgKDc3MywgMjU3KQ0KLQkJCQkJICAgICg4OTUsIDI1NykNCi0JCQkJCSAgICAoODk1LCAxOTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTUsIDE5OSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTExDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RTYwMzcyIg0KLQkJCQljbGllbnQgICAgIAlAODYyDQotCQkJCXN1cHBsaWVyICAgCUA4OTkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjcsIDM2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjcsIDI4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTAwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MTINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDhFMjAwRUEiDQotCQkJCWNsaWVudCAgICAgCUA4NjANCi0JCQkJc3VwcGxpZXIgICAJQDg5OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUyLCAzNjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTIsIDI4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTAwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBOTAzRDIiDQotCQkJCWNsaWVudCAgICAgCUA4NTkNCi0JCQkJc3VwcGxpZXIgICAJQDg5OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjk5LCAzNjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTksIDI4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTAwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAOTE0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDExNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiINCi0JCQkJY2xpZW50ICAgICAJQDkxNA0KLQkJCQlzdXBwbGllciAgIAlAODg3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTYsIDExNDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTYsIDcyNykpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTgiIEA5MTYNCi0JCQkJbG9jYXRpb24gICAJKDEzODIsIDE0MjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMEMwM0RCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxOSIgQDkxNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MTYNCi0JCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAyMjUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDkxNg0KLQkJCQkJc3VwcGxpZXIgICAJQDg5MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzODIsIDE0MjUpDQotCQkJCQkgICAgKDIxNDcsIDE0MjUpDQotCQkJCQkgICAgKDIxNDcsIDk0MykNCi0JCQkJCSAgICAoMjA2NywgOTQzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgMTQyNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY3LCA5NDMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkU2NoZW1hIiBAOTE4DQotCQkJCQlQYXJlbnRfVmlldyAJQDkxNg0KLQkJCQkJbG9jYXRpb24gICAJKDExOTAsIDIyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkxOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NSwgMTM4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDY1NDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNSINCi0JCQkJCWNsaWVudCAgICAgCUA5MTYNCi0JCQkJCXN1cHBsaWVyICAgCUA5MTQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzgyLCAxNDI1KQ0KLQkJCQkJICAgICgyMjUsIDE0MjUpDQotCQkJCQkgICAgKDIyNSwgMTI1NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDE0MjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI1LCAxMjU1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTIwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzkyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk2OTE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNiIgQDkyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUwNSwgMTUwMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDNzAwRUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE3IiBAOTIyDQotCQkJCQlQYXJlbnRfVmlldyAJQDkyMQ0KLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiDQotCQkJCQljbGllbnQgICAgIAlAOTIxDQotCQkJCQlzdXBwbGllciAgIAlAODk1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUwNSwgMTUwMykNCi0JCQkJCSAgICAoMjE4OCwgMTUwMykNCi0JCQkJCSAgICAoMjE4OCwgNjc1KQ0KLQkJCQkJICAgICgyMDU5LCA2NzUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA1LCAxNTAzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNTksIDY3NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZFNjaGVtYSIgQDkyMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MjENCi0JCQkJCWxvY2F0aW9uICAgCSgxMzEzLCAzMDMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDMsIDE0NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzMzMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MyINCi0JCQkJCWNsaWVudCAgICAgCUA5MjENCi0JCQkJCXN1cHBsaWVyICAgCUA5MTQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTA1LCAxNTAzKQ0KLQkJCQkJICAgICgxMTMsIDE1MDMpDQotCQkJCQkgICAgKDExMywgMTI1NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDUsIDE1MDMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzLCAxMjU1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTI1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDE0NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Njc2ODMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA4IiBAOTI2DQotCQkJCWxvY2F0aW9uICAgCSg2NiwgMjQ0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzUxQzMxMDM1NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDkiIEA5MjcNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTI2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0LCAtNDQ0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQzMzMDMzMSINCi0JCQkJCWNsaWVudCAgICAgCUA5MjYNCi0JCQkJCXN1cHBsaWVyICAgCUA4OTkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2NiwgMjQ0KQ0KLQkJCQkJICAgICg2NiwgMTQ0KQ0KLQkJCQkJICAgICg4NjYsIDE0NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2LCAyNDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxNDQpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hIiBAOTI4DQotCQkJCQlQYXJlbnRfVmlldyAJQDkyNg0KLQkJCQkJbG9jYXRpb24gICAJKC05NCwgLTQ0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTI4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NSwgOTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE2ODExMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTk5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzMwMzNCIg0KLQkJCQkJY2xpZW50ICAgICAJQDkyNg0KLQkJCQkJc3VwcGxpZXIgICAJQDkxNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NiwgMjQ0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2LCAxMTQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2LCAxODQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTEzDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2NjU5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzgwQkQ5MDA1OSINCi0JCQkJY2xpZW50ICAgICAJQDg4NQ0KLQkJCQlzdXBwbGllciAgIAlAODk5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU5LCAzNjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU5LCAyODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDkwMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTMyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUxNzcwMTE2Ig0KLQkJCQljbGllbnQgICAgIAlAODY3DQotCQkJCXN1cHBsaWVyICAgCUA4NTkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQwMCwgMTE0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQwMCwgNTYxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4ODMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MzMNCi0JCQkJbG9jYXRpb24gICAJKDEwMTIsIDgzNykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAODYxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEwMTIsIDgzNykNCi0JCQkJICAgICgxMDEyLCA3MjcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTM0DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDkzNQ0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDcxLCA4NzEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjQzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODgxNTgNCi0JCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0RTIwMzY2Ig0KLQkJCQljbGllbnQgICAgIAlAODY3DQotCQkJCXN1cHBsaWVyICAgCUA4NjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzcsIDExNDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDM3LCA4MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDkzMykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTM2DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDkzNw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OTAsIDg2NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4MTYzMw0KLQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGRDRCQTAyM0MiDQotCQkJCWNsaWVudCAgICAgCUA4ODYNCi0JCQkJc3VwcGxpZXIgICAJQDg2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI1LCA5MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjUsIDgzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTMzKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MzgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiDQotCQkJCWNsaWVudCAgICAgCUA4OTENCi0JCQkJc3VwcGxpZXIgICAJQDg5NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyOCwgODg5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyOCwgODE5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4OTYpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNy4gQ29uY3JldGUgQXR0cmlidXRlcyINCi0JCQlxdWlkICAgICAgIAkiM0I5RjhGNzYwMkM3Ig0KLQkJCXRpdGxlICAgICAgCSI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBAOTM5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDE0NDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzOCwgMTM1OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzOCwgMTQxOSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTM4Mg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGZvcm0gOiBYU0RGb3JtIg0KLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTQzMA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERm9ybSIgQDk0MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NjAsIDE0MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTgsIDEzNjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERm9ybSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTgsIDEzMTUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOUY5MTNCMDFFQiINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDk0MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQwLCAzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQwLCA5NykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0Ng0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGVsZW1lbnQgOiBET01FbGVtZW50IikpDQotCQkJCXdpZHRoICAgICAgCTY3NQ0KLQkJCQloZWlnaHQgICAgIAkxNDMNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDk0Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg0OCwgMzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NywgMzMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJCXdpZHRoICAgICAgCTM0MA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAOTQzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgOTQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzgsIDg5MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiDQotCQkJCXdpZHRoICAgICAgCTQ3MA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA5NDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgMTQwOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzI4LCAxMzU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTYyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDk0NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg2NCwgNjI0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0NSwgNTczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjU2DQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NDYNCi0JCQkJbG9jYXRpb24gICAJKDg1MCwgNTM3KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5NDINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoODUwLCA1MzcpDQotCQkJCSAgICAoODUwLCA0NDcpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTUVsZW1lbnQiIEA5NDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjQ4LCAxMjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgOTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzUxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NRWxlbWVudCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgNDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQjgxODk3OTAyMDAiDQotCQkJCXdpZHRoICAgICAgCTc2OQ0KLQkJCQloZWlnaHQgICAgIAkyMDANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAOTQ4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA2NDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDU4NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQl3aWR0aCAgICAgIAk1MTINCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAOTQ5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAzODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDMzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQkJd2lkdGggICAgICAJNDIyDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NTANCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMjYzKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5NDENCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMzY4LCAyNjMpDQotCQkJCSAgICAoMzY4LCAxNjcpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIiBAOTUxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk5MiwgMTQ1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIzLCAxMzQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIzLCAxMjk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVBNDAzREYiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTQwNykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQ0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHN1YnN0aXR1dGlvbiINCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIg0KLQkJCQkJIisgYWxsIikpDQotCQkJCXdpZHRoICAgICAgCTU1Ng0KLQkJCQloZWlnaHQgICAgIAkzNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiIEA5NTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAxNzkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE3MDgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE2NTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNzY4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTk4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iDQotCQkJCQkiKyBhbGwiKSkNCi0JCQkJd2lkdGggICAgICAJNTUwDQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDk1Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDIwOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMiwgMjA0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMiwgMjEwMCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMw0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRFNpbXBsZUZpbmFsIikpDQotCQkJCXdpZHRoICAgICAgCTc3OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA5NTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE5ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODc1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4MjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSINCi0JCQkJd2lkdGggICAgICAJMzQ0DQotCQkJCWhlaWdodCAgICAgCTM0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4RmluYWwiIEA5NTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTQ0LCAyMDE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxOTMyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjIsIDE4ODIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiINCi0JCQkJd2lkdGggICAgICAJMzgyDQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA5NTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTI3OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTMzOSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTU4OA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHVzZSA6IFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Ig0KLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTY0MA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiIEA5NTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2MzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTQ4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE0OTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCQTdCMEU4MDFBOCINCi0JCQkJd2lkdGggICAgICAJNTEyDQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAOTU4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjYwOCwgOTI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0OTgsIDg4MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQkJd2lkdGggICAgICAJMjM4DQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAOTU5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNDAsIDE3MTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTcsIDE2MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJOTY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NywgMTY5MSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTkzNA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQkJIjw8MC4uKj4+ICsgYmxvY2sgOiBYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk5ODQNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAOTYwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNzIsIDExNTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEwOTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMTU2KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODUyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbE5hbWVzcGFjZUNvbnN0cmFpbnQgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJOTA2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA5NjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MjIsIDc3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk5OTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkxMDE0DQotCQkJCWhlaWdodCAgICAgCTQ4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiIEA5NjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDk2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzcsIDkwNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbXBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIg0KLQkJCQl3aWR0aCAgICAgIAk0MjQNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDk2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzQ0LCA2NTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzOCwgNjAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzOCwgNjYwKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzc4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTQzMA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAOTY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTAsIDE5NDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxMCwgMjAwMikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTgyMg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRENvbXBsZXhGaW5hbCINCi0JCQkJCSI8PDAuLio+PiArIGJsb2NrIDogWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCQkiKyBtaXhlZCA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJODc4DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDk2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0ODgsIDE2OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMwNCwgMTY0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM4Ng0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NjYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCWNsaWVudCAgICAgCUA5NjUNCi0JCQkJc3VwcGxpZXIgICAJQDk0NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNiwgMTYzMikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDYsIDE0NzIpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDk2Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyMDgsIDcwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1OCwgNTk4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTkwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQl3aWR0aCAgICAgIAk5MTgNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTY4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QUEwMUQzIg0KLQkJCQljbGllbnQgICAgIAlAOTU4DQotCQkJCXN1cHBsaWVyICAgCUA5NDINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2OTYsIDg2OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2OTYsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTQ2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NjkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiDQotCQkJCWNsaWVudCAgICAgCUA5NTkNCi0JCQkJc3VwcGxpZXIgICAJQDkzOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5NCwgMTYxOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTQsIDE1MzMpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTcwDQotCQkJCWxvY2F0aW9uICAgCSgxNDg3LCAxODU2KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5NjUNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTQ4NywgMTg1NikNCi0JCQkJICAgICgxNDg3LCAxNzYwKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01BdHRyIiBAOTcxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwMCwgMzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCAzNTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NQXR0ciIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDMwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNCQkY4Qzg5MDFCNiINCi0JCQkJd2lkdGggICAgICAJNjU4DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk3Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDk2NA0KLQkJCQlzdXBwbGllciAgIAlAOTY1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzM0LCAxOTMwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTczNCwgMTg1NikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTcwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NzMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjU2ODAyNTkiDQotCQkJCWNsaWVudCAgICAgCUA5NjMNCi0JCQkJc3VwcGxpZXIgICAJQDk0Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgNTg4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk3NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJY2xpZW50ICAgICAJQDk2Nw0KLQkJCQlzdXBwbGllciAgIAlAOTQyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTkwLCA1ODYpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTkwLCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDk0NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTc1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIg0KLQkJCQljbGllbnQgICAgIAlAOTQ4DQotCQkJCXN1cHBsaWVyICAgCUA5NDkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMiwgNTcyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyLCA0NDcpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NzYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhFNjAzNzIiDQotCQkJCWNsaWVudCAgICAgCUA5NDkNCi0JCQkJc3VwcGxpZXIgICAJQDk0MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwLCAzMjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAsIDI2MykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTUwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NzcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEOTAwM0UiDQotCQkJCWNsaWVudCAgICAgCUA5NjINCi0JCQkJc3VwcGxpZXIgICAJQDk0OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIzLCA4OTIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjMsIDcwOCkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk3OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSINCi0JCQkJY2xpZW50ICAgICAJQDk2MA0KLQkJCQlzdXBwbGllciAgIAlAOTU4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjAwLCAxMDg0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwMCwgOTg3KSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTURvY3VtZW50IiBAOTc5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTU3LCA5NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Eb2N1bWVudCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg1MEUwMzgxIg0KLQkJCQl3aWR0aCAgICAgIAk3NzYNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTgwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTkwM0QyIg0KLQkJCQljbGllbnQgICAgIAlAOTQyDQotCQkJCXN1cHBsaWVyICAgCUA5NDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NiwgMzIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU2LCAyNjMpDQotCQkJCWRyYXdTdXBwbGllciAJQDk1MCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTU5vZGUiIEA5ODENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAzODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzQsIDM1MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Ob2RlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNCwgMzAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3Ig0KLQkJCQl3aWR0aCAgICAgIAk2ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTgyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIg0KLQkJCQljbGllbnQgICAgIAlAOTQ1DQotCQkJCXN1cHBsaWVyICAgCUA5NDINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1MCwgNTYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODUwLCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDk0NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTgzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3QkIwMzQ5Ig0KLQkJCQljbGllbnQgICAgIAlAOTU2DQotCQkJCXN1cHBsaWVyICAgCUA5NDINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3NSwgMTI2NykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUEyMDE5NyINCi0JCQkJY2xpZW50ICAgICAJQDk0Mw0KLQkJCQlzdXBwbGllciAgIAlAOTQyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjk0LCA4ODApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjk0LCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDk0NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNDNEEwMTgyIg0KLQkJCQljbGllbnQgICAgIAlAOTYxDQotCQkJCXN1cHBsaWVyICAgCUA5NDUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NiwgNzY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU2LCA2ODcpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTg2DQotCQkJCWxvY2F0aW9uICAgCSgxNzAzLCAxMjkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5NDMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTcwMywgMTI5MCkNCi0JCQkJICAgICgxNzAzLCAxMDA4KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDk0NA0KLQkJCQlzdXBwbGllciAgIAlAOTQzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAzLCAxMzQ0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwMywgMTI5MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTg2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciDQotCQkJCWNsaWVudCAgICAgCUA5MzkNCi0JCQkJc3VwcGxpZXIgICAJQDk0Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5MywgMTM0NykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDEyOTApDQotCQkJCWRyYXdTdXBwbGllciAJQDk4NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlAOTUzDQotCQkJCXN1cHBsaWVyICAgCUA5NjUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTMsIDIwMjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjUzLCAxODU2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzApKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOC4gQ29uY3JldGUgQ29udGFpbm1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNkE4MDk3MDI3QSINCi0JCQl0aXRsZSAgICAgIAkiOC4gQ29uY3JldGUgQ29udGFpbm1lbnQiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA5OTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjcyLCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MzksIDk0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNDg0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAOTkxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY0MCwgNTc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MzEsIDUzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQl3aWR0aCAgICAgIAk0MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIiBAOTkyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgNzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDEzLCA3NDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQl3aWR0aCAgICAgIAkyODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiIEA5OTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCA1NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTkzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NCwgNTMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiDQotCQkJCXdpZHRoICAgICAgCTQzOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTk0DQotCQkJCWxvY2F0aW9uICAgCSgxOTQzLCA4NjgpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDk5Mw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxOTQzLCA4NjgpDQotCQkJCSAgICAoMTk0MywgNjMxKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjQiIEA5OTUNCi0JCQkJbG9jYXRpb24gICAJKDIxMjUsIDY4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNDAwNTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY1IiBAOTk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDk5NQ0KLQkJCQkJbG9jYXRpb24gICAJKDE1NywgMzQ0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFFODI2MDJBRCINCi0JCQkJCWNsaWVudCAgICAgCUA5OTUNCi0JCQkJCXN1cHBsaWVyICAgCUA5OTINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEyNSwgNjgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjUsIDcyOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDk5Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5OTUNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNTUsIDY3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE3NTQzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFFODI2MDJCNyINCi0JCQkJCWNsaWVudCAgICAgCUA5OTUNCi0JCQkJCXN1cHBsaWVyICAgCUA5OTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEyNSwgNjgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjUsIDYzMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNjcsIDY3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE3NTQzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAMTAwMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMzIwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDgsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQkJd2lkdGggICAgICAJMjM0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTAwMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA0NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEwMDANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjcyLCA0NjUpDQotCQkJCSAgICAoMjcyLCAzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTAwMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NTYsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzcyLCAxMTIxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU2OQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTg3DQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDEwMDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDU3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg5LCA1MzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTM1Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1MiIgQDEwMDQNCi0JCQkJbG9jYXRpb24gICAJKDExNzAsIDEzNTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUMwMjVBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEAxMDA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMDQNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY5LCAxMzg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXAiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzQwNDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDA0DQotCQkJCQlzdXBwbGllciAgIAlAMTAwMw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzAsIDEzNTYpDQotCQkJCQkgICAgKDIwNiwgMTM1NikNCi0JCQkJCSAgICAoMjA2LCA2MzEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTcwLCAxMzU2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNiwgNjMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYsIDEzMjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTkxNDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1MyIgQDEwMDgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAwNA0KLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNTIxLCAxMzk4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMDQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDAyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3MCwgMTM1NikNCi0JCQkJCSAgICAoMjczMSwgMTM1NikNCi0JCQkJCSAgICAoMjczMSwgMTIyNykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjczMSwgMTIyNykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMTAxMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MCwgMTY5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjY4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ2IiBAMTAxMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyLCAxMTM2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJDRUIxMDJGOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDciIEAxMDEyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTENCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMwLCAtMjU2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkJDRUI2MDAxQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDExDQotCQkJCQlzdXBwbGllciAgIAlAMTAwMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIsIDExMzYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyLCA2MzEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDEzDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTENCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMwLCAtMjU2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjMsIDE1MTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTA0OTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMjUiDQotCQkJCQljbGllbnQgICAgIAlAMTAxMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMTANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIyLCAxMTM2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMiwgMTY0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwLCAxNTgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgxMTg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDEwMTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQkJd2lkdGggICAgICAJNTEzDQotCQkJCWhlaWdodCAgICAgCTEwMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU4IiBAMTAxNw0KLQkJCQlsb2NhdGlvbiAgIAkoNDcsIDg4NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxNTAxMTkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU5IiBAMTAxOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0NzFBMDNBQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDE3DQotCQkJCQlzdXBwbGllciAgIAlAMTAxMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3LCAxNjQxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjg5LCA4MjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MiwgMTg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjE4NTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0NzFBMDNCNSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDE3DQotCQkJCQlzdXBwbGllciAgIAlAMTAxNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3LCAxMzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI4LCAxOTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTc4ODENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAMTAyMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDg5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTIsIDg0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAkzNjMNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTAyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTc1LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDg0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODgiIEAxMDI0DQotCQkJCWxvY2F0aW9uICAgCSgxMzE5LCAxMDM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkYxREU5MDE4QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4OSIgQDEwMjUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAyNA0KLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFQTAzNkMiDQotCQkJCQljbGllbnQgICAgIAlAMTAyNA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMxOSwgMTAzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCA5NTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDEwMjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAyNA0KLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTAzOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDczMTcxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTIwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzgwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwMjQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDIzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxOSwgMTExMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI3OSwgMTAzMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNDA4MTYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEAxMDI5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTY5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NSwgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCXdpZHRoICAgICAgCTQ2OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMDMwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTY5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzUsIDE2NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODQiIEAxMDMxDQotCQkJCWxvY2F0aW9uICAgCSgxMzUxLCAxODQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E1MDExMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODUiIEAxMDMyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzENCi0JCQkJCWxvY2F0aW9uICAgCSgtMjk3LCAyMjQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTcwM0I0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMzENCi0JCQkJCXN1cHBsaWVyICAgCUAxMDMwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM1MSwgMTg0MCkNCi0JCQkJCSAgICAoMTI5NCwgMTg0MCkNCi0JCQkJCSAgICAoMTI5NCwgMTc1MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTEsIDE4NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NCwgMTc1MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwMzMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAzMQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yOTcsIDIyNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNywgMTgwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzMjY1Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E3MDNDOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDMxDQotCQkJCQlzdXBwbGllciAgIAlAMTAzMA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNTEsIDE4NDApDQotCQkJCQkgICAgKDE0MDksIDE4NDApDQotCQkJCQkgICAgKDE0MDksIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDksIDE3NTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDM1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjEsIDE4MDEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzI4NDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjgiIEAxMDM2DQotCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAxNDMyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDA2RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIgQDEwMzcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAzNg0KLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDM4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDE1MjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDQ5NzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAzMTgiDQotCQkJCQljbGllbnQgICAgIAlAMTAzNg0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMzANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MCwgMTQzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxNjQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAxNTI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDU0NTQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2OSIgQDEwNDANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAzNg0KLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDksIDEyNjYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAzMEUiDQotCQkJCQljbGllbnQgICAgIAlAMTAzNg0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMjMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MCwgMTQzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxMjIzKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg2IiBAMTA0Mg0KLQkJCQlsb2NhdGlvbiAgIAkoMTY5MCwgMTY4NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRDAzNzQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmFjZXRDb250ZW50cyIgQDEwNDMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjYsIC0xMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgMTczMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldENvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDMyMDUxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMTAiDQotCQkJCQljbGllbnQgICAgIAlAMTA0Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMTY4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODQ2LCAxNjg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxNjQ0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTk0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNzMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODciIEAxMDQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDINCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI2LCAtMTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjYsIDE2NDMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMDYiDQotCQkJCQljbGllbnQgICAgIAlAMTA0Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMzANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMTY4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTM0LCAxNjg0KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDEwNDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjI0LCA3ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzODgsIDc0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJd2lkdGggICAgICAJNDkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAMTA0OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOCwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCQl3aWR0aCAgICAgIAk0MjYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMDUwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NTcsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjYiIEAxMDUxDQotCQkJCWxvY2F0aW9uICAgCSg5NjMsIDMxOSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QjAwM0QiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDUyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNTENCi0JCQkJCWxvY2F0aW9uICAgCSg1OTUsIC0xNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc0LCAzNjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODEwODENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4RTZDMDExMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDUxDQotCQkJCQlzdXBwbGllciAgIAlAMTA0OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjMsIDMxOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk5LCAzMTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTYsIDI5MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5NjM5Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY3IiBAMTA1NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDUxDQotCQkJCQlsb2NhdGlvbiAgIAkoNTk1LCAtMTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NSwgMzYxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkMwMTA3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNTENCi0JCQkJCXN1cHBsaWVyICAgCUAxMDUwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MywgMzE5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgyOCwgMzE5KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxMDU3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE2MCwgOTkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTc0LCA5NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMDU4DQotCQkJCWxvY2F0aW9uICAgCSgyMzIyLCAxNTkzKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDU3DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDIzMjIsIDE1OTMpDQotCQkJCSAgICAoMjMyMiwgMTA0NykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDU5DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDEwNjANCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNDYsIDkwNSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2MDAwMA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNQ0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkY1MDEzQSINCi0JCQkJY2xpZW50ICAgICAJQDEwNTcNCi0JCQkJc3VwcGxpZXIgICAJQDk5Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE1MCwgOTM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE1MCwgODY4KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5OTQpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMDYxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODMyLCA1NzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MTAsIDUzMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk2NjINCi0JCQkJaGVpZ2h0ICAgICAJMTEyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTIiIEAxMDYyDQotCQkJCWxvY2F0aW9uICAgCSgxNDk4LCAxNDMxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg5MTE0MDFBRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIgQDEwNjMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA2Mg0KLQkJCQkJbG9jYXRpb24gICAJKDEwMzgsIC0xODEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDI3LCAxNDcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDU0Mzg5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTciDQotCQkJCQljbGllbnQgICAgIAlAMTA2Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNTcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDk4LCAxNDMxKQ0KLQkJCQkJICAgICgyMjgxLCAxNDMxKQ0KLQkJCQkJICAgICgyMjgxLCAxMDQ3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgMTQzMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjgxLCAxMDQ3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjA0LCAxMzk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA1NDE5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTMiIEAxMDY2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjINCi0JCQkJCWxvY2F0aW9uICAgCSgxMDM4LCAtMTgxMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgODY2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTUwMDE2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNjINCi0JCQkJCXN1cHBsaWVyICAgCUAxMDYxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ5OCwgMTQzMSkNCi0JCQkJCSAgICAoMTEzMSwgMTQzMSkNCi0JCQkJCSAgICAoMTEzMSwgNjMyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgMTQzMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMxLCA2MzIpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEAxMDY4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU1LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTQwNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDEwNjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDg5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNSwgODUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTYiIEAxMDcwDQotCQkJCWxvY2F0aW9uICAgCSg1MzQsIDczNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEAxMDcxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzANCi0JCQkJCWxvY2F0aW9uICAgCSg4NiwgLTIxNDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMCwgNzQ4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTU1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTExMTExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNzANCi0JCQkJCXN1cHBsaWVyICAgCUAxMDY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUzNCwgNzM2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNCwgODQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1OTUsIDgwNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY3NTkyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE3IiBAMTA3NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDcwDQotCQkJCQlsb2NhdGlvbiAgIAkoODYsIC0yMTQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDY1MykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDcwDQotCQkJCQlzdXBwbGllciAgIAlAMTA2MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MzQsIDczNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzQsIDYzMikpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNiIgQDEwNzYNCi0JCQkJbG9jYXRpb24gICAJKDkwMCwgMTAzMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRDAwM0UiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2VsZWN0b3IiIEAxMDc3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzYNCi0JCQkJCWxvY2F0aW9uICAgCSg4NCwgMTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEzLCAxMDQyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTIzMjg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjM0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNzYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDY4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkwMCwgMTAzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDAsIDExMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDc5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgMTA0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTg5MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM3IiBAMTA4MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDc2DQotCQkJCQlsb2NhdGlvbiAgIAkoODQsIDEyMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCA5NjgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMkEiDQotCQkJCQljbGllbnQgICAgIAlAMTA3Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTAwLCAxMDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMCwgOTUxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM4IiBAMTA4Mg0KLQkJCQlsb2NhdGlvbiAgIAkoNzAwLCAxMDMyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDAyNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEAxMDgzDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwODINCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE2LCAxMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNiwgMTAzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmaWVsZHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTQ3OTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM3OSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDgyDQotCQkJCQlzdXBwbGllciAgIAlAMTA2OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDAsIDEwMzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAwLCAxMTEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzEsIDEwNDIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMjMwNzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzOSIgQDEwODYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA4Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTYsIDEyMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU5LCA5NjgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNjUiDQotCQkJCQljbGllbnQgICAgIAlAMTA4Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzAwLCAxMDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwMCwgOTUxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IiBAMTA4OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDc1MiwgMTQ0MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAwLCAxMzk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJCXdpZHRoICAgICAgCTUyMg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwODkNCi0JCQkJbG9jYXRpb24gICAJKDU1MCwgMTU5MCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTA4OA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg1NTAsIDE1OTApDQotCQkJCSAgICAoNTUwLCAxNDk1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiIEAxMDkwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUwNCwgNTc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQwLCA1MzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQkJd2lkdGggICAgICAJNTQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTA5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwNiwgNzY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDkwDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE0MDYsIDc2NSkNCi0JCQkJICAgICgxNDA2LCA2MzEpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEwOTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxNjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5MywgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk1NDQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5NCIgQDEwOTMNCi0JCQkJbG9jYXRpb24gICAJKDE2MTQsIDE4NjgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RkRERDcwMTEzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk1IiBAMTA5NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDkzDQotCQkJCQlsb2NhdGlvbiAgIAkoNTI2LCA0NzYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RkREREEwMjZCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDkyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYxNCwgMTg2OCkNCi0JCQkJCSAgICAoMjUwMCwgMTg2OCkNCi0JCQkJCSAgICAoMjUwMCwgMTc1MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjUwMCwgMTc1MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTA5NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDkzDQotCQkJCQlsb2NhdGlvbiAgIAkoNTI2LCA0NzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg5NiwgMTc4NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA5ODcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZGREREQTAyNzUiDQotCQkJCQljbGllbnQgICAgIAlAMTA5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEwODgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjE0LCAxODY4KQ0KLQkJCQkJICAgICg5ODQsIDE4NjgpDQotCQkJCQkgICAgKDk4NCwgMTQ5NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg0LCAxNDk1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCAxODI0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTcxMjg2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMCIgQDEwOTgNCi0JCQkJbG9jYXRpb24gICAJKDI5MjcsIDM4NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzNjAzODYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlQ29udGVudHMiIEAxMDk5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTgNCi0JCQkJCWxvY2F0aW9uICAgCSgyNDYzLCAtMzc1NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNSwgMzU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZUNvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzczMDYwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzODAwN0MiDQotCQkJCQljbGllbnQgICAgIAlAMTA5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwOTANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyOTI3LCAzODcpDQotCQkJCQkgICAgKDE3NTAsIDM4NykNCi0JCQkJCSAgICAoMTc1MCwgNTIxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjkyNywgMzg3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDUyMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNCwgNDI1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU3MjQ3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDEiIEAxMTAyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTgNCi0JCQkJCWxvY2F0aW9uICAgCSgyNDYzLCAtMzc1NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjk0NiwgMTQ0OCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjk4RTM4MDA3MiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDk4DQotCQkJCQlzdXBwbGllciAgIAlAMTA5Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDI5MjcsIDM4NykNCi0JCQkJCSAgICAoMjk4NywgMzg3KQ0KLQkJCQkJICAgICgyOTg3LCAxNjcxKQ0KLQkJCQkJICAgICgyOTI4LCAxNjcxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjkyNywgMzg3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5MjgsIDE2NzEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMTA0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTksIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzYiIEAxMTA1DQotCQkJCWxvY2F0aW9uICAgCSgxNzUwLCA4NzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNEUwMDY3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTEwNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTA1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgLTIzOTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTA2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDAsIDY5MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1MTAzNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjk0MDUwMDJBNSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTA1DQotCQkJCQlzdXBwbGllciAgIAlAMTA5MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCA4NzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNjMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE0LCA2OTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzQ0NDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc3IiBAMTEwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTA1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgLTIzOTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTEwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTA5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MDksIDEwNjUpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5NDA1MDAyOUIiDQotCQkJCQljbGllbnQgICAgIAlAMTEwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExMDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgODcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDExMTMpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDExMTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNzksIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDgiIEAxMTEyDQotCQkJCWxvY2F0aW9uICAgCSgxMjUyLCAxODk2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRUJEQzg3MDI0NyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDkiIEAxMTEzDQotCQkJCQlQYXJlbnRfVmlldyAJQDExMTINCi0JCQkJCWxvY2F0aW9uICAgCSg3MDgsIDEyODgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDOEMwMkY5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExMTINCi0JCQkJCXN1cHBsaWVyICAgCUAxMDkyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI1MiwgMTg5NikNCi0JCQkJCSAgICAoMjYwMywgMTg5NikNCi0JCQkJCSAgICAoMjYwMywgMTc1MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTIsIDE4OTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwMywgMTc1MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiIEAxMTE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDExMTINCi0JCQkJCWxvY2F0aW9uICAgCSg3MDgsIDEyODgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY4MiwgMTg1OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zODExNDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRUJEQzhDMDMwMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMTEyDQotCQkJCQlzdXBwbGllciAgIAlAMTExMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNTIsIDE4OTYpDQotCQkJCQkgICAgKDQyOCwgMTg5NikNCi0JCQkJCSAgICAoNDI4LCAxMjIzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MiwgMTg5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MjgsIDEyMjMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM4MiwgMTg2MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU3NTAzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4MCIgQDExMTcNCi0JCQkJbG9jYXRpb24gICAJKDExOTksIDEzMjEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEMzIwMjIwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgxIiBAMTExOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTE3DQotCQkJCQlsb2NhdGlvbiAgIAkoNjU1LCA3MTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEM0MwMTBDIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMTcNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTA0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE5OSwgMTMyMSkNCi0JCQkJCSAgICAoMTg5NywgMTMyMSkNCi0JCQkJCSAgICAoMTg5NywgMTIyMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTksIDEzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5NywgMTIyMykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiIEAxMTE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDExMTcNCi0JCQkJCWxvY2F0aW9uICAgCSg2NTUsIDcxMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU3LCAxMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyOTU2OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEM0MwMTBEIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMTcNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTExDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE5OSwgMTMyMSkNCi0JCQkJCSAgICAoNTAwLCAxMzIxKQ0KLQkJCQkJICAgICg1MDAsIDEyMjMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk5LCAxMzIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUwMCwgMTIyMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzgyMzA1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDEwOTINCi0JCQkJc3VwcGxpZXIgICAJQDEwNTcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MDYsIDE2NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjA2LCAxNTkzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDU4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTIzDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMjQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgNDk1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI0Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDQ2NDI5DQotCQkJCSAgICBoZWlnaHQgICAgIAk2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGMTcwMDJFIg0KLQkJCQljbGllbnQgICAgIAlAMTA2MQ0KLQkJCQlzdXBwbGllciAgIAlAMTAwMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUzLCA1MjApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTMsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAwMSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDEwMzANCi0JCQkJc3VwcGxpZXIgICAJQDEwNTcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MDksIDE2NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA5LCAxNTkzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDU4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTI2DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMjcNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgMTU5MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk4MDM5Mg0KLQkJCQkgICAgaGVpZ2h0ICAgICAJMzg1DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGNTUwMzJCIg0KLQkJCQljbGllbnQgICAgIAlAMTAzMA0KLQkJCQlzdXBwbGllciAgIAlAMTA4OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE0NCwgMTY0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDQsIDE1OTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEwODkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEE2NDAyNzkiDQotCQkJCWNsaWVudCAgICAgCUAxMDAzDQotCQkJCXN1cHBsaWVyICAgCUAxMDAwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjYsIDUyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NiwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDAxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTEyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDMxLCAyMjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEwMTYNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDMxLCAyMjIpDQotCQkJCSAgICAoNDMxLCAxMzApKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEzMA0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTMxDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNjEsIDIyNCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk3Njc0NA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJODYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDI0NDAwNjkiDQotCQkJCWNsaWVudCAgICAgCUAxMDAwDQotCQkJCXN1cHBsaWVyICAgCUAxMDE2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzUsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3NSwgMjIyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTI5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTEzMg0KLQkJCQlsb2NhdGlvbiAgIAkoMTMwOSwgNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDQ5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEzMDksIDQ2NSkNCi0JCQkJICAgICgxMzA5LCAzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEzMw0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTM0DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDEsIDQ5NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NDI4Ng0KLQkJCQkgICAgaGVpZ2h0ICAgICAJMTANCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2NjAzMzkiDQotCQkJCWNsaWVudCAgICAgCUAxMDYxDQotCQkJCXN1cHBsaWVyICAgCUAxMDQ5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzEsIDUyMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzMSwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTMyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTM1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4RkMwMUU3Ig0KLQkJCQljbGllbnQgICAgIAlAMTAxMA0KLQkJCQlzdXBwbGllciAgIAlAMTA4OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjUwLCAxNjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjUwLCAxNTkwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDg5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTM2DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMzcNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDUsIDQ5MykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk1ODMzMw0KLQkJCQkgICAgaGVpZ2h0ICAgICAJOA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTYxMDNCRSINCi0JCQkJY2xpZW50ICAgICAJQDEwMjMNCi0JCQkJc3VwcGxpZXIgICAJQDEwNDkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDExMTMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMzIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMzgNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEzOQ0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1MSwgOTA1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODQ4OTgwDQotCQkJCSAgICBoZWlnaHQgICAgIAk3Mw0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkVCMDJBOCINCi0JCQkJY2xpZW50ICAgICAJQDExMDQNCi0JCQkJc3VwcGxpZXIgICAJQDk5Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg3OCwgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzgsIDg2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTk0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQwDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNDENCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDIsIDgwNykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxODcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3OTMxMA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjENCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAzQTAyMjEiDQotCQkJCWNsaWVudCAgICAgCUAxMTA0DQotCQkJCXN1cHBsaWVyICAgCUAxMDkwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAzLCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMywgNzY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDkxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQyDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNDMNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTQsIDgwMSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNzANCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDczNzAzOEYiDQotCQkJCWNsaWVudCAgICAgCUAxMDIyDQotCQkJCXN1cHBsaWVyICAgCUAxMDkwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjg0LCA4MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjg0LCA3NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwOTEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiDQotCQkJCWNsaWVudCAgICAgCUA5OTINCi0JCQkJc3VwcGxpZXIgICAJQDEwNDgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyODQsIDc2MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNzksIDc2MikpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiDQotCQkJCWNsaWVudCAgICAgCUA5OTENCi0JCQkJc3VwcGxpZXIgICAJQDEwNDkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDUyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEzMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDEwNDgNCi0JCQkJc3VwcGxpZXIgICAJQDk5MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzNywgNzI5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgNjMxKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkIzMDFENSINCi0JCQkJY2xpZW50ICAgICAJQDk5Mw0KLQkJCQlzdXBwbGllciAgIAlAMTA0OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk1MCwgNTIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk1MCwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTMyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQ4DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNDkNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI4MjEsIDg5NykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxODENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4NzcxOQ0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNzYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU0RjAyM0MiDQotCQkJCWNsaWVudCAgICAgCUA5OTANCi0JCQkJc3VwcGxpZXIgICAJQDEwNDkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4OTYsIDkzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4OTYsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEzMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1MA0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUxDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzEzLCA5MDQpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTA2MjINCi0JCQkJICAgIGhlaWdodCAgICAgCTY4DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRTIwMzgxIg0KLQkJCQljbGllbnQgICAgIAlAMTAwMg0KLQkJCQlzdXBwbGllciAgIAlAOTkzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzgxLCAxMTA5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM4MSwgODY4KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5OTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNTINCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Mw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjg3OCwgMjY5KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTQ2NjY3DQotCQkJCSAgICBoZWlnaHQgICAgIAk2Ng0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjU1MDM4NSINCi0JCQkJY2xpZW50ICAgICAJQDEwMDINCi0JCQkJc3VwcGxpZXIgICAJQDEwMTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5NDMsIDExMDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTQzLCAyMjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMjkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNTQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiDQotCQkJCWNsaWVudCAgICAgCUAxMTExDQotCQkJCXN1cHBsaWVyICAgCUAxMDAwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NjIsIDExMTMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjIsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAwMSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI5LiBDb25jcmV0ZSBTY2hlbWEgQ29tcG9zaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNDMjVFQjdBMDM4QyINCi0JCQl0aXRsZSAgICAgIAkiOS4gQ29uY3JldGUgU2NoZW1hIENvbXBvc2l0aW9uIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMTU1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxNTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTU1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDE0OTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTgiIEAxMTU2DQotCQkJCWxvY2F0aW9uICAgCSgyMjgsIDE2OTUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRTYwMjUxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExOSIgQDExNTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE1Ng0KLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgMTYyMykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MUVBMDJGNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMTU2DQotCQkJCQlzdXBwbGllciAgIAlAMTE1NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIyOCwgMTY5NSkNCi0JCQkJCSAgICAoMTc1LCAxNjk1KQ0KLQkJCQkJICAgICgxNzUsIDE1OTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjgsIDE2OTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1LCAxNTkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIiBAMTE1OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTU2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ3NiwgLTM4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzI5LCAxNzQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuOTI0NTI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDFFQTAzMEIiDQotCQkJCQljbGllbnQgICAgIAlAMTE1Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDExNTUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMjgsIDE2OTUpDQotCQkJCQkgICAgKDI4MSwgMTY5NSkNCi0JCQkJCSAgICAoMjgxLCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4LCAxNjk1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4MSwgMTU5MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI5LCAxNjQ2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDA1NzE0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTE2Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDE1MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3OTAsIDE0OTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1NCIgQDExNjMNCi0JCQkJbG9jYXRpb24gICAJKDk1MiwgMTY5OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0NTAzOTgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU1IiBAMTE2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTYzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg2MCwgMTYyMykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ5MDM4QSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTYzDQotCQkJCQlzdXBwbGllciAgIAlAMTE2Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDk1MiwgMTY5OCkNCi0JCQkJCSAgICAoOTAxLCAxNjk4KQ0KLQkJCQkJICAgICg5MDEsIDE1OTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAxLCAxNTkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iIEAxMTY2DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTI4OCwgLTMxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMCwgMTczOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1NjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMzI2OTIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0OTAzOUUiDQotCQkJCQljbGllbnQgICAgIAlAMTE2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDExNjINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5NTIsIDE2OTgpDQotCQkJCQkgICAgKDEwMDQsIDE2OTgpDQotCQkJCQkgICAgKDEwMDQsIDE1OTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwNCwgMTU5MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUyLCAxNjQ5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEAxMTY5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjU2LCA5OTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQyMCwgOTQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIg0KLQkJCQl3aWR0aCAgICAgIAk0OTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDExNzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDc4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEyLCA3MzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJd2lkdGggICAgICAJNDc1DQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMTcxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCA0MTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NDYsIDI4NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAk0MDYNCi0JCQkJaGVpZ2h0ICAgICAJMjg3DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxOCIgQDExNzINCi0JCQkJbG9jYXRpb24gICAJKDEzMDMsIDY3OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREQwQzAzREIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkU2NoZW1hIiBAMTE3Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTcyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDU5LCAzODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAwMzg0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDUiDQotCQkJCQljbGllbnQgICAgIAlAMTE3Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDExNzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzAzLCA2NzkpDQotCQkJCQkgICAgKDEzMDMsIDQxOSkNCi0JCQkJCSAgICAoODQzLCA0MTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzAzLCA2NzkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA0MTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTczDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkyMiwgNDU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkwNzQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTkiIEAxMTc2DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzINCi0JCQkJCWxvY2F0aW9uICAgCSgtNDEsIC04NTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTc2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDUsIDk1NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCINCi0JCQkJCWNsaWVudCAgICAgCUAxMTcyDQotCQkJCQlzdXBwbGllciAgIAlAMTE2OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzMDMsIDY3OSkNCi0JCQkJCSAgICAoMTMwMywgOTk3KQ0KLQkJCQkJICAgICg5MDEsIDk5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDMsIDY3OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDk5NykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNiIgQDExNzgNCi0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDY0OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDNzAwRUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRTY2hlbWEiIEAxMTc5DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzgNCi0JCQkJCWxvY2F0aW9uICAgCSgzMzYsIC0xMzk5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM4LCA1MDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDE5MjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MyINCi0JCQkJCWNsaWVudCAgICAgCUAxMTc4DQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMTYsIDY0OSkNCi0JCQkJCSAgICAoMTIxNiwgNTM0KQ0KLQkJCQkJICAgICg4NDMsIDUzNCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTYsIDY0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDUzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTI2LCA1NzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MzE2NDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxNyIgQDExODINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3OA0KLQkJCQkJbG9jYXRpb24gICAJKDMzNiwgLTEzOTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NCwgNzU2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQyIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTcwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIxNiwgNjQ5KQ0KLQkJCQkJICAgICgxMjE2LCA3OTcpDQotCQkJCQkgICAgKDg3NywgNzk3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxNiwgNjQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg3NywgNzk3KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIyIiBAMTE4NA0KLQkJCQlsb2NhdGlvbiAgIAkoNjYyLCA2NDIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTYwMTMxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlZmVyZW5jaW5nRGlyZWN0aXZlcyIgQDExODUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NA0KLQkJCQkJbG9jYXRpb24gICAJKC0yMzQsIDExNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCA2NzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVmZXJlbmNpbmdEaXJlY3RpdmVzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDA4NzU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjE2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTkwMzcxIg0KLQkJCQkJY2xpZW50ICAgICAJQDExODQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTcwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2MiwgNjQyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MiwgNzI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDY3OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQzMDY1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIzIiBAMTE4OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTg0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjEsIDU3NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVEM0E5MDM3MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMTg0DQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjIsIDU1OSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyNCIgQDExOTANCi0JCQkJbG9jYXRpb24gICAJKDc1LCAxODgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjAwMDVFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyNSIgQDExOTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5MA0KLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIC0zMDgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjQwMDFFIg0KLQkJCQkJY2xpZW50ICAgICAJQDExOTANCi0JCQkJCXN1cHBsaWVyICAgCUAxMTcxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzUsIDE4OCkNCi0JCQkJCSAgICAoNzUsIDEyOCkNCi0JCQkJCSAgICAoNTEwLCAxMjgpDQotCQkJCQkgICAgKDUxMCwgMjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDE4OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTAsIDI3MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VmVyc2lvbiIgQDExOTINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5MA0KLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIC0zMDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgNzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFZlcnNpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNTkzNzUwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjQwMDI4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExOTANCi0JCQkJCXN1cHBsaWVyICAgCUAxMTcxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzUsIDE4OCkNCi0JCQkJCSAgICAoNzUsIDM4MCkNCi0JCQkJCSAgICAoNDM3LCAzODApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMTg4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgMzgwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNjgsIDMyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3NDc1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjYiIEAxMTk1DQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAxMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEIwMTFCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyNyIgQDExOTYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5NQ0KLQkJCQkJbG9jYXRpb24gICAJKDMzNCwgLTM2MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwRjAxMjEiDQotCQkJCQljbGllbnQgICAgIAlAMTE5NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExNzENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYyLCAxMzQpDQotCQkJCQkgICAgKDc2NiwgMTM0KQ0KLQkJCQkJICAgICg3NjYsIDI3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NjYsIDI3MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJvcmlnaW5hbFZlcnNpb24iIEAxMTk3DQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTUNCi0JCQkJCWxvY2F0aW9uICAgCSgzMzQsIC0zNjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNjQsIDk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK29yaWdpbmFsVmVyc2lvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS42NTAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRDBGMDEyQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTk1DQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNjIsIDEzNCkNCi0JCQkJCSAgICAoMTMyMiwgMTM0KQ0KLQkJCQkJICAgICgxMzIyLCAzMzQpDQotCQkJCQkgICAgKDg0MywgMzM0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMTM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgMzM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MTksIDI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODEwOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjgiIEAxMjAwDQotCQkJCWxvY2F0aW9uICAgCSgxMjYsIDY1NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBQjAwMUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI5IiBAMTIwMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjAwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzNCwgMTYwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRUFGMDEwQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjAwDQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNiwgNjU2KQ0KLQkJCQkJICAgICg1MTMsIDY1NikNCi0JCQkJCSAgICAoNTEzLCA1NTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYsIDY1NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTMsIDU1OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRWZXJzaW9ucyIgQDEyMDINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwMA0KLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3LCA0MzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkVmVyc2lvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDM5MDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRUFGMDExNSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjAwDQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNiwgNjU2KQ0KLQkJCQkJICAgICg2NiwgNjU2KQ0KLQkJCQkJICAgICg2NiwgNDcyKQ0KLQkJCQkJICAgICg0MzcsIDQ3MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNiwgNjU2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgNDcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNTYsIDUyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2ODQ2OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzIiIEAxMjA1DQotCQkJCWxvY2F0aW9uICAgCSg2NDIsIDEyNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3MzAxOTQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMzIiBAMTIwNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjA1DQotCQkJCQlsb2NhdGlvbiAgIAkoODIsIC00MTgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzUwMUYxIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTcxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjQyLCAxMjYpDQotCQkJCQkgICAgKDU4OCwgMTI2KQ0KLQkJCQkJICAgICg1ODgsIDI3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY0MiwgMTI2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OCwgMjczKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYUZvclNjaGVtYSIgQDEyMDcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwNQ0KLQkJCQkJbG9jYXRpb24gICAJKDgyLCAtNDE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MzksIDc0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM4NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYUZvclNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNTU1NTYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc4NDc1MDFGQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjA1DQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDY0MiwgMTI2KQ0KLQkJCQkJICAgICg2OTcsIDEyNikNCi0JCQkJCSAgICAoNjk3LCAyNzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2OTcsIDI3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAyMTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDE4NjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjEwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIg0KLQkJCQljbGllbnQgICAgIAlAMTE2OQ0KLQkJCQlzdXBwbGllciAgIAlAMTE3MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjM4LCA5MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzgsIDg0MykpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyMTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NywgMTE0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTQ5Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzIiIEAxMjEyDQotCQkJCWxvY2F0aW9uICAgCSgyMzQsIDEzNDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNkIwMTk0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDczIiBAMTIxMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjEyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxMCwgLTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MCwgMTI3MSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMwOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjEyDQotCQkJCQlzdXBwbGllciAgIAlAMTIxMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzNCwgMTM0MCkNCi0JCQkJCSAgICAoMTgxLCAxMzQwKQ0KLQkJCQkJICAgICgxODEsIDEyMzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDEzNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxLCAxMjM5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMjE1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTINCi0JCQkJCWxvY2F0aW9uICAgCSgtMzEwLCAtNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMzLCAxMzg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS44Njc5MjUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMxMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjEyDQotCQkJCQlzdXBwbGllciAgIAlAMTIxMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzNCwgMTM0MCkNCi0JCQkJCSAgICAoMjg3LCAxMzQwKQ0KLQkJCQkJICAgICgyODcsIDEyMzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDEzNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg3LCAxMjM5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDEyOTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDI5NDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMjE4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2MCwgMTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNywgMTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJd2lkdGggICAgICAJNTA0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDEyMTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTksIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCXdpZHRoICAgICAgCTI0NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzA2IiBAMTIyMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTY2OCwgMjgwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNENEJCNEFFMDFDQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDciIEAxMjIxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjANCi0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEFGMDEwRiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjIwDQotCQkJCQlzdXBwbGllciAgIAlAMTIxOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY4LCAyODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OCwgMTk5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY0ZhY2V0cyIgQDEyMjINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIyMA0KLQkJCQkJbG9jYXRpb24gICAJKDgsIC0xNTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTIsIDMwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNGYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNDYxNTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRjAxMUEiDQotCQkJCQljbGllbnQgICAgIAlAMTIyMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMTkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjgsIDM2MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyNSwgMzAxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2OTIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMTIyNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjYsIDkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAMTIyNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NzYsIDY0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTUsIDU5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk1NDANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwOCIgQDEyMjcNCi0JCQkJbG9jYXRpb24gICAJKDE1MDgsIDc5MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREMzAyOEUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA5IiBAMTIyOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyLCAtMjgwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEQ0MDJGMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjI3DQotCQkJCQlzdXBwbGllciAgIAlAMTIyNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwOCwgNjk1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY1BhcnRpY2xlIiBAMTIyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyLCAtMjgwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk1LCA3NjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljUGFydGljbGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjU5MjU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDQwMkZEIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMjcNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDgsIDc5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA4ODkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NTQsIDgyOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5NTA2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMjMyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc1NiwgMTE0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg0IiBAMTIzMw0KLQkJCQlsb2NhdGlvbiAgIAkoOTE5LCAxMzQ5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0MjVFMDFGOSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4NSIgQDEyMzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIzMw0KLQkJCQkJbG9jYXRpb24gICAJKC0yMzMsIC01OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODI1LCAxMjczKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDQ2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjMyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTE5LCAxMzQ5KQ0KLQkJCQkJICAgICg4NjYsIDEzNDkpDQotCQkJCQkgICAgKDg2NiwgMTIzOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkxOSwgMTM0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDEyMzkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMjM2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk5MywgMTM5MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjM3NzM1OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDUwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjMyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTE5LCAxMzQ5KQ0KLQkJCQkJICAgICg5NzMsIDEzNDkpDQotCQkJCQkgICAgKDk3MywgMTIzOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkxOSwgMTM0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NzMsIDEyMzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjM4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxOSwgMTI5NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMTQ5MjUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEAxMjM5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTk1MiwgOTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNiwgOTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJd2lkdGggICAgICAJMjkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTAiIEAxMjQwDQotCQkJCWxvY2F0aW9uICAgCSgyMDI1LCA3OTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDkwMUY2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxMSIgQDEyNDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI0MA0KLQkJCQkJbG9jYXRpb24gICAJKDE1MywgLTI4MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREQTAyODQiDQotCQkJCQljbGllbnQgICAgIAlAMTI0MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAyNSwgNzkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMjUsIDY5NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNXaWxkY2FyZCIgQDEyNDINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI0MA0KLQkJCQkJbG9jYXRpb24gICAJKDE1MywgLTI4MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyNiwgODM4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDg4MDk1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0REEwMjhFIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyNDANCi0JCQkJCXN1cHBsaWVyICAgCUAxMjM5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMjUsIDc5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA4ODkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwOTgsIDg0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwNjE3Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTczDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTIiIEAxMjQ1DQotCQkJCWxvY2F0aW9uICAgCSgxNzU0LCAxMTc4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNENEM2OEZGMDFCRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTMiIEAxMjQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY5MDIwMzE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjMyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTQsIDExNzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwMSwgMTE3OCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNXaWxkY2FyZCIgQDEyNDcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xOTgsIDIzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTI2MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE2MzM1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY5MDIwMzE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjM5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTc1NCwgMTE3OCkNCi0JCQkJCSAgICAoMjAyOCwgMTE3OCkNCi0JCQkJCSAgICAoMjAyOCwgOTk5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NCwgMTE3OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI4LCA5OTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQ5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODIsIDEwOTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM2NjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEwLiBEaWFnbm9zdGljcyINCi0JCQlxdWlkICAgICAgIAkiM0JGRTVGMDgwM0UyIg0KLQkJCXRpdGxlICAgICAgCSIxMC4gRGlhZ25vc3RpY3MiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTU5vZGUiIEAxMjUwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDAwLCAxMDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjUwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDk5MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Ob2RlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCA5NDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjRBNTAxMTciDQotCQkJCXdpZHRoICAgICAgCTY4Ng0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpY1NldmVyaXR5IiBAMTI1MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDY1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOCwgNTQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpYWdub3N0aWNTZXZlcml0eSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTgsIDQ5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY4QTcwMzJGIg0KLQkJCQl3aWR0aCAgICAgIAk0NjINCi0JCQkJaGVpZ2h0ICAgICAJMzQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDEyNTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1OSwgNjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjg0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDEyNTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODk2LCAxMTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU0MCwgNjIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzEzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQl3aWR0aCAgICAgIAk3MzENCi0JCQkJaGVpZ2h0ICAgICAJMTI1DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiIEAxMjU0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA2MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NCwgNDAyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpYWdub3N0aWMiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCQl3aWR0aCAgICAgIAk2NTgNCi0JCQkJaGVpZ2h0ICAgICAJNDM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNCIgQDEyNTUNCi0JCQkJbG9jYXRpb24gICAJKDE0NCwgMjgzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2NDMxMDM1RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTUiIEAxMjU2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA4OCwgLTY2MSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMjAxQzYiDQotCQkJCQljbGllbnQgICAgIAlAMTI1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNTINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0LCAyODMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0LCAxNzYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYWxsRGlhZ25vc3RpY3MiIEAxMjU3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA4OCwgLTY2MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzA5LCAzMzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYWxsRGlhZ25vc3RpY3MiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDg1OTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNjUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMjAxQzciDQotCQkJCQljbGllbnQgICAgIAlAMTI1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNTQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0LCAyODMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0LCAzOTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjU5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2LCAzMjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA1NjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEwIiBAMTI2MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyOCwgNDQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2MjI3MDNDRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTEiIEAxMjYxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNjANCi0JCQkJCWxvY2F0aW9uICAgCSgtMzk2LCAtNzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMkIwMDYxIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyNjANCi0JCQkJCXN1cHBsaWVyICAgCUAxMjU0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MTMsIDQ0MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb21wb25lbnRzIiBAMTI2Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjYwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTM5NiwgLTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MzgsIDIzMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb21wb25lbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODI5MTgxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMkIwMDZDIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyNjANCi0JCQkJCXN1cHBsaWVyICAgCUAxMjUzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTAyOCwgNDQwKQ0KLQkJCQkJICAgICgxMDg4LCA0NDApDQotCQkJCQkgICAgKDEwODgsIDE3NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg4LCAxNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjY0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDMsIDIzMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyMzg0OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTIiIEAxMjY1DQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDI4MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2OTAxNjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjEzIiBAMTI2Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjY1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTYwLCAtMjc4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjZBMDAyNiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjY1DQotCQkJCQlzdXBwbGllciAgIAlAMTI1Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDI4MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODgsIDE3NCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJkaWFnbm9zdGljcyIgQDEyNjcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI2NQ0KLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAzMzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGlhZ25vc3RpY3MiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTI2MzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjciDQotCQkJCQljbGllbnQgICAgIAlAMTI2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNTQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCAyODIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjg4LCAzOTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjY5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0NSwgMzM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDk0NzM3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI3MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNENEMwRjRDMDFBMSINCi0JCQkJY2xpZW50ICAgICAJQDEyNTQNCi0JCQkJc3VwcGxpZXIgICAJQDEyNTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3NSwgMzkwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCAxNzQpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjExLiBTdXBwbGVtZW50YWwiDQotCQkJcXVpZCAgICAgICAJIjNDMjg3RTQ5MDE5QiINCi0JCQl0aXRsZSAgICAgIAkiMTEuIFN1cHBsZW1lbnRhbCINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTI3MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ2NCwgODE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDc2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4MzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk4NTINCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTI3Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxMTIsIDg4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDgyNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTc4MA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjczDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgNjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQl3aWR0aCAgICAgIAk0OTgNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiIEAxMjc0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzODQsIDExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIyMzYsIDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpYWdub3N0aWMiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzNiIgQDEyNzUNCi0JCQkJbG9jYXRpb24gICAJKDEzODIsIDg0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjg4MkM1MDEzNyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwcmltYXJ5Q29tcG9uZW50IiBAMTI3Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjc1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1MCwgLTUwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcHJpbWFyeUNvbXBvbmVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0MDgyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzcwMTEzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyNzUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjczDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNywgODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjc4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYyNCwgNTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTcyNjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzNyIgQDEyNzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI3NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTAsIC01MDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTgsIDEyNikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MkM3MDExMiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjc1DQotCQkJCQlzdXBwbGllciAgIAlAMTI3NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCA4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjI3LCA4NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDEyODENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE2MCwgNjg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3OCwgNjA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzc4LCA2NjcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MjINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBlbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UgOiBib29sZWFuIg0KLQkJCQkJIisgY2lyY3VsYXIgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTc4Mg0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEAxMjgyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDEwNzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDAsIDk5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCAxMDUxKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIzDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZmFjZXROYW1lIDogU3RyaW5nIg0KLQkJCQkJIisgZWZmZWN0aXZlVmFsdWUgOiBWYWx1ZSIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTI4Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDYyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA1NjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDYyOCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc2OQ0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIG1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk4MjANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAMTI4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCAyODgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDUsIDE1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCAyMTcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAkzNTYNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBhbGlhc05hbWUgOiBTdHJpbmciDQotCQkJCQkiKyB1UkkgOiBTdHJpbmciDQotCQkJCQkiKyBhbGlhc1VSSSA6IFN0cmluZyINCi0JCQkJCSIrIHFOYW1lIDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTQ3Mg0KLQkJCQloZWlnaHQgICAgIAkyODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEAxMjg1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCAzNTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4LCAyOTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NjINCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEyODYNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgNTEwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMjg1DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDMyMCwgNTEwKQ0KLQkJCQkgICAgKDMyMCwgNDIwKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyODcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDNDAwOTAiDQotCQkJCWNsaWVudCAgICAgCUAxMjgzDQotCQkJCXN1cHBsaWVyICAgCUAxMjg1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MSwgNTU2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEsIDUxMCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTI4NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI4OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM4MDBEMiINCi0JCQkJY2xpZW50ICAgICAJQDEyNzENCi0JCQkJc3VwcGxpZXIgICAJQDEyODUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg3NywgNzQ4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODc3LCA1MTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEyODYpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhJbmNsdXNpdmVGYWNldCIgQDEyODkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMTgwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDEsIDE3NjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4N0QwMERBIg0KLQkJCQl3aWR0aCAgICAgIAk0NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IiBAMTI5MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDE3NzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTcyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5JbmNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiDQotCQkJCXdpZHRoICAgICAgCTQ5Mw0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiIEAxMjkxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMTkzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxODg5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQkJd2lkdGggICAgICAJNDkzDQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCIgQDEyOTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMwNCwgMTk2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzMsIDE5MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RXhjbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIg0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEAxMjkzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE0MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM0LCAxMzcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5RmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAk0MjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIgQDEyOTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM1MiwgMTI2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNjMsIDEyMTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzc4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQm91bmRlZEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTFEMDM0NCINCi0JCQkJd2lkdGggICAgICAJMzk2DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEAxMjk1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNCwgMTM5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQzLCAxMzQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJCXdpZHRoICAgICAgCTM4MA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBAMTI5Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDEyMzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OSwgMTE3OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROdW1lcmljRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2Ig0KLQkJCQl3aWR0aCAgICAgIAk0MDANCi0JCQkJaGVpZ2h0ICAgICAJMTMyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IiBAMTI5Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNjE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM1LCAxNTM1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzUsIDE1OTUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBpbmNsdXNpdmUgOiBib29sZWFuIg0KLQkJCQkJIisgZXhjbHVzaXZlIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0MjANCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDEyOTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMjI4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDIsIDIyMzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQkJd2lkdGggICAgICAJNDU0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTI5OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzA0LCAyNjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NCwgMjU3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUJFMDJFRSINCi0JCQkJd2lkdGggICAgICAJNDc4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiIEAxMzAwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzNjgsIDIxMjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTk2LCAyMDc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiDQotCQkJCXdpZHRoICAgICAgCTM2Mg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIgQDEzMDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAyMDk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDIwNDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERW51bWVyYXRpb25GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJCXdpZHRoICAgICAgCTQ1OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEAxMzAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMjI3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAyMjIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQkJd2lkdGggICAgICAJMzU4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIgQDEzMDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxNTg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTUwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTU2MykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mw0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGluY2x1c2l2ZSA6IGJvb2xlYW4iDQotCQkJCQkiKyBleGNsdXNpdmUgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTQyMg0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEAxMzA0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDI0NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTExLCAyNDEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heExlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M3MDE0NiINCi0JCQkJd2lkdGggICAgICAJNDM2DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDEzMDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAyNDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzksIDIzOTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1Ig0KLQkJCQl3aWR0aCAgICAgIAk0MjANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiIEAxMzA2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMjYwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAyNTU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRvdGFsRGlnaXRzRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCQl3aWR0aCAgICAgIAk0MjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEzMDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAxMTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY3LCAxMTAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTU0MA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAxMzA4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMTA3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwLCAxMDIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEzMDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMTMwNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDEzNjQpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyB2YWxpZEZhY2V0cyA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1OTQNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0OCIgQDEzMTANCi0JCQkJbG9jYXRpb24gICAJKDE0NDYsIDEyMTgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTQwMzBBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlRGVmaW5pdGlvbiIgQDEzMTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMxMA0KLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTgwLCAxMTczKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkzLjI2ODI5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTcwMEREIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMTANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ0NiwgMTIxOCkNCi0JCQkJCSAgICAoMTQ4NywgMTIxOCkNCi0JCQkJCSAgICAoMTQ4NywgMTI5MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NDYsIDEyMTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTI5MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTI1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xODQyMTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0OSIgQDEzMTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMxMA0KLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBOTk3MDBFNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzEwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0NDYsIDEyMTgpDQotCQkJCQkgICAgKDE0MDUsIDEyMTgpDQotCQkJCQkgICAgKDE0MDUsIDEyOTIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDUsIDEyOTIpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTIiIEAxMzE1DQotCQkJCWxvY2F0aW9uICAgCSgxNzMzLCAxNTc1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMDhEMDI1MiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTMiIEAxMzE2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTUNCi0JCQkJCWxvY2F0aW9uICAgCSg5MTcsIDcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDkxIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTczMywgMTU3NSkNCi0JCQkJCSAgICAoMTQ4NywgMTU3NSkNCi0JCQkJCSAgICAoMTQ4NywgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzMsIDE1NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhGYWNldCIgQDEzMTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMxNQ0KLQkJCQkJbG9jYXRpb24gICAJKDkxNywgNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MSwgMTU0MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0NjI0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDlCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjk3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzMsIDE1NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNiwgMTU3NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA0MiwgMTUzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTE1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTQiIEAxMzIwDQotCQkJCWxvY2F0aW9uICAgCSgxNTg3LCAxNzkzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEFCMDM5NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTUiIEAxMzIxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjANCi0JCQkJCWxvY2F0aW9uICAgCSg3MDcsIC0zMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzQzkiDQotCQkJCQljbGllbnQgICAgIAlAMTMyMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTg3LCAxNzkzKQ0KLQkJCQkJICAgICgxNDQ3LCAxNzkzKQ0KLQkJCQkJICAgICgxNDQ3LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4NywgMTc5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQ3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEluY2x1c2l2ZUZhY2V0IiBAMTMyMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzIwDQotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzIzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzcsIDE3NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4SW5jbHVzaXZlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yOTg0NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEFDMDNENCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzIwDQotCQkJCQlzdXBwbGllciAgIAlAMTI4OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTIsIDE3OTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMjAsIDE3NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTkxNTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU2IiBAMTMyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTM3LCAxNzg3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEFGMDMzOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTciIEAxMzI2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjUNCi0JCQkJCWxvY2F0aW9uICAgCSg2MTcsIC01KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEIwMDFGOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzI1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkzNywgMTc4NykNCi0JCQkJCSAgICAoOTk3LCAxNzg3KQ0KLQkJCQkJICAgICg5OTcsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzcsIDE3ODcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTk3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkluY2x1c2l2ZUZhY2V0IiBAMTMyNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzI1DQotCQkJCQlsb2NhdGlvbiAgIAkoNjE3LCAtNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzkyLCAxNzQ1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzQ2MDYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMDAyMDMiDQotCQkJCQljbGllbnQgICAgIAlAMTMyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyOTANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTM3LCAxNzg3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxOCwgMTc4NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc1LCAxNzQzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzOTYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1OCIgQDEzMzANCi0JCQkJbG9jYXRpb24gICAJKDk4MSwgMTkzNykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMzAyMDciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU5IiBAMTMzMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMwDQotCQkJCQlsb2NhdGlvbiAgIAkoNjc3LCAtNzkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjQwMTkwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTgxLCAxOTM3KQ0KLQkJCQkJICAgICgxMDQxLCAxOTM3KQ0KLQkJCQkJICAgICgxMDQxLCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTgxLCAxOTM3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNDEsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluRXhjbHVzaXZlRmFjZXQiIEAxMzMyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzANCi0JCQkJCWxvY2F0aW9uICAgCSg2NzcsIC03OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIzLCAxOTAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzQxMjUzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNDAxOUEiDQotCQkJCQljbGllbnQgICAgIAlAMTMzMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyOTENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTgxLCAxOTM3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxOCwgMTkzNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTg5LCAxODk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ2NjUyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2MCIgQDEzMzUNCi0JCQkJbG9jYXRpb24gICAJKDE0NjksIDE5NTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjYwMjhEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2MSIgQDEzMzYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzNQ0KLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgLTk1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIxNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzM1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0NjksIDE5NTMpDQotCQkJCQkgICAgKDE0MDAsIDE5NTMpDQotCQkJCQkgICAgKDE0MDAsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY5LCAxOTUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDAsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RXhjbHVzaXZlRmFjZXQiIEAxMzM3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzUNCi0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NiwgMTkxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhFeGNsdXNpdmVGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI5ODA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjcwMjIxIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjkyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NCwgMTk1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk2MSwgMTkxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyNzIzNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjIiIEAxMzQwDQotCQkJCWxvY2F0aW9uICAgCSgxMTIyLCAyMTgwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDA1MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjMiIEAxMzQxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDANCi0JCQkJCWxvY2F0aW9uICAgCSgtMzE4LCA2MjgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkMwMjQ2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNDANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIxODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJsZW5ndGhGYWNldCIgQDEzNDINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0MA0KLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA0LCAyMjA0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2xlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDc1NDcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNTAiDQotCQkJCQljbGllbnQgICAgIAlAMTM0MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTIyLCAyMTgwKQ0KLQkJCQkJICAgICgxMTIyLCAyMjQwKQ0KLQkJCQkJICAgICgzODcsIDIyNDApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM4NywgMjI0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcxLCAyMjA0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk1NTk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2NiIgQDEzNDUNCi0JCQkJbG9jYXRpb24gICAJKDEwODQsIDE5ODkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzIwMjFEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2NyIgQDEzNDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMzgwLCA0MzcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzMwMEFCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDE5ODkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbnVtZXJhdGlvbkZhY2V0cyIgQDEzNDcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMzgwLCA0MzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzNywgMjAxNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbnVtZXJhdGlvbkZhY2V0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NTg1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzMwMEFDIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzAxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTA4NCwgMTk4OSkNCi0JCQkJCSAgICAoMTA4NCwgMjA0OSkNCi0JCQkJCSAgICAoNDg1LCAyMDQ5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMTk4OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODUsIDIwNDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4MywgMjAyMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1MTI5MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjgiIEAxMzUwDQotCQkJCWxvY2F0aW9uICAgCSgxNDUxLCAyMDc0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEM1MDE1OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjkiIEAxMzUxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCMCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzUwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0NTEsIDIwNzQpDQotCQkJCQkgICAgKDEzNjIsIDIwNzQpDQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDUxLCAyMDc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGF0dGVybkZhY2V0cyIgQDEzNTINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1MA0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTI1LCA1MzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjAsIDIwMzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGF0dGVybkZhY2V0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM2NzIyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzYwMEJBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNTANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzAwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE4NywgMjA3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3MiwgMjAzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwODY0OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzAiIEAxMzU1DQotCQkJCWxvY2F0aW9uICAgCSgxODI3LCAxNDAwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEM4MDJBNyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzEiIEAxMzU2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE0OSwgLTQ3MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDOTAxRUEiDQotCQkJCQljbGllbnQgICAgIAlAMTM1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNywgMTQwMCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxNDAwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNhcmRpbmFsaXR5RmFjZXQiIEAxMzU3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE0OSwgLTQ3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg0NywgMTM1OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjYXJkaW5hbGl0eUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDcxNzMwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDOTAxRjUiDQotCQkJCQljbGllbnQgICAgIAlAMTM1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyOTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNywgMTQwMCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCAxNDAwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgzLCAxMzU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzNDI2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4MCIgQDEzNjANCi0JCQkJbG9jYXRpb24gICAJKDEyNjIsIDI0MTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREIwMzc3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4MSIgQDEzNjENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM2MA0KLQkJCQkJbG9jYXRpb24gICAJKC03ODYsIDMwMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQzAzNUEiDQotCQkJCQljbGllbnQgICAgIAlAMTM2MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQxMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxMzYyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjANCi0JCQkJCWxvY2F0aW9uICAgCSgtNzg2LCAzMDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDgsIDI1NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzNzM5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREMwMzY0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNjANCi0JCQkJCXN1cHBsaWVyICAgCUAxMjk5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2MiwgMjQxMykNCi0JCQkJCSAgICAoMTI2MiwgMjU5NikNCi0JCQkJCSAgICAoMjA2NSwgMjU5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0MTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NSwgMjU5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3OSwgMjU1NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzg4Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODQiIEAxMzY1DQotCQkJCWxvY2F0aW9uICAgCSgxODQxLCAxMzA2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEUzMDBEOSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODUiIEAxMzY2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEzNSwgLTc5MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFNDAzOEUiDQotCQkJCQljbGllbnQgICAgIAlAMTM2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg0MSwgMTMwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxMzA2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJvdW5kZWRGYWNldCIgQDEzNjcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM2NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODMyLCAxMjcwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2JvdW5kZWRGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMzE3NDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM5OCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzY1DQotCQkJCQlzdXBwbGllciAgIAlAMTI5NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODQxLCAxMzA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTQsIDEzMDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzY5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzY3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzcsIDEyNzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTQ3MTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY0IiBAMTM3MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjE4NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCRjAxOEMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY1IiBAMTM3MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzcwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTY0MCwgNjM0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMwMDA2QiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzcwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMTg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAid2hpdGVTcGFjZUZhY2V0IiBAMTM3Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzcwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTY0MCwgNjM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjczLCAyMjA3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3doaXRlU3BhY2VGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5MDkwOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzAwMDc1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNzANCi0JCQkJCXN1cHBsaWVyICAgCUAxMjk4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTMyOCwgMjE4NikNCi0JCQkJCSAgICAoMTMyOCwgMjI0NikNCi0JCQkJCSAgICAoMjA5MywgMjI0NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIxODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgMjI0NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAzMywgMjIwMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNjc2Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODIiIEAxMzc1DQotCQkJCWxvY2F0aW9uICAgCSg2NzQsIDEzOTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwMDQ4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4MyIgQDEzNzYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xODU0LCAtNzA2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERGMDNCOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzc1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzQsIDEzOTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMzkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm9yZGVyZWRGYWNldCIgQDEzNzcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xODU0LCAtNzA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTgsIDEzNTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JkZXJlZEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYxNTM4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQzMiDQotCQkJCQljbGllbnQgICAgIAlAMTM3NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyOTUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjc0LCAxMzkwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxNCwgMTM5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTEwLCAxMzU1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM0NjE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3MiIgQDEzODANCi0JCQkJbG9jYXRpb24gICAJKDY4NywgMTI5NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDQjAzOUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjczIiBAMTM4MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzgwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MDksIC01NzYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0MwM0QwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzODANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4NywgMTI5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzUsIDEyOTYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibnVtZXJpY0ZhY2V0IiBAMTM4Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzgwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MDksIC01NzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2OCwgMTI1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitudW1lcmljRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODA5NzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMENDMDNEMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzgwDQotCQkJCQlzdXBwbGllciAgIAlAMTI5Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODcsIDEyOTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQwLCAxMjk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MDYsIDEyNjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY4NDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg2IiBAMTM4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY4OSwgMTY2MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NDAxRUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg3IiBAMTM4Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NTAzNjAiDQotCQkJCQljbGllbnQgICAgIAlAMTM4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjg5LCAxNjYyKQ0KLQkJCQkJICAgICgxNDg3LCAxNjYyKQ0KLQkJCQkJICAgICgxNDg3LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY4OSwgMTY2MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1heEZhY2V0IiBAMTM4Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2OSwgMTYyMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNYXhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4MjA1MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDUwMzZBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjk3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2ODksIDE2NjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNiwgMTY2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA0NCwgMTYyNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNTM4NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODgiIEAxMzkwDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMjU4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCNTRGMDE0NSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODkiIEAxMzkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTQ2MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU1MDAzOEMiDQotCQkJCQljbGllbnQgICAgIAlAMTM5MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjI1OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIgQDEzOTINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5MA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtNDYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg1LCAyMjg4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwODU0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NTAwMzk2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzOTANCi0JCQkJCXN1cHBsaWVyICAgCUAxMjk4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTMyOCwgMjI1OCkNCi0JCQkJCSAgICAoMTMyOCwgMjMyNCkNCi0JCQkJCSAgICAoMjA5MywgMjMyNCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIyNTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgMjMyNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwOSwgMjI5MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODgxNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTAiIEAxMzk1DQotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzY2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCNUM0MDExQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTEiIEAxMzk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjA3LCAtNzIyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNUM1MDIwRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzk1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzY2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiIEAxMzk3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjA3LCAtNzIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjU3LCAyNDYzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1heExlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTI2OTA2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMTciDQotCQkJCQljbGllbnQgICAgIAlAMTM5NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjk3LCAyMzY2KQ0KLQkJCQkJICAgICgxMjk3LCAyNDk5KQ0KLQkJCQkJICAgICgyMTAyLCAyNDk5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAyLCAyNDk5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA3LCAyNDcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MzA4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5MiIgQDE0MDANCi0JCQkJbG9jYXRpb24gICAJKDEyNjIsIDI0NDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2MkEwMEFBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5MyIgQDE0MDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTcwLCAtODE1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNjJCMDEzOCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDAwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCIgQDE0MDINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTcwLCAtODE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQwLCAyNjM0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODUzMTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNjJCMDE0MiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDAwDQotCQkJCQlzdXBwbGllciAgIAlAMTI5OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNjIsIDI0NDkpDQotCQkJCQkgICAgKDEyNjIsIDI2NjgpDQotCQkJCQkgICAgKDIwNjUsIDI2NjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjUsIDI2NjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODksIDI2MjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY0ODUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk0IiBAMTQwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyMiwgMjE1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMDAzQTYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk1IiBAMTQwNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjEwMzExIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQyMiwgMjE1OSkNCi0JCQkJCSAgICAoMTM2MiwgMjE1OSkNCi0JCQkJCSAgICAoMTM2MiwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjIsIDIxNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiIEAxNDA3DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzcwLCAtMTMxMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyNywgMjEyNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTkwOTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDA1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxODcsIDIxNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDIsIDIxMTkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODkyMjYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk2IiBAMTQxMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4NCwgMjA4MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQTAyNkIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk3IiBAMTQxMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEwDQotCQkJCQlsb2NhdGlvbiAgIAkoODI4LCAtMTM3MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQjAxODYiDQotCQkJCQljbGllbnQgICAgIAlAMTQxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMjA4MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg0LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiIEAxNDEyDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTANCi0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDIxMDEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4ODYxOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTkwIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MTANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzAxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTA4NCwgMjA4MykNCi0JCQkJCSAgICAoMTA4NCwgMjE0MykNCi0JCQkJCSAgICAoNDg1LCAyMTQzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMjA4MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODUsIDIxNDMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzMSwgMjEwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkzMTcxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDIiIEAxNDE1DQotCQkJCWxvY2F0aW9uICAgCSgxMTIyLCAyMjQxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCOERDMDA1MiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDMiIEAxNDE2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTUNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0I5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIyNDEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVMZW5ndGhGYWNldCIgQDE0MTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQxNQ0KLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTQ3OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAyMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUxlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxNzMxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAzQzMiDQotCQkJCQljbGllbnQgICAgIAlAMTQxNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTIyLCAyMjQxKQ0KLQkJCQkJICAgICgxMTIyLCAyMzE4KQ0KLQkJCQkJICAgICgzODcsIDIzMTgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMjQxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM4NywgMjMxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcwLCAyMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4NTY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1MCIgQDE0MjANCi0JCQkJbG9jYXRpb24gICAJKDc3MywgMTU2NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4NTAyNUIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUxIiBAMTQyMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDIwDQotCQkJCQlsb2NhdGlvbiAgIAkoNDY5LCAxMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4NjAyNzAiDQotCQkJCQljbGllbnQgICAgIAlAMTQyMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NzMsIDE1NjUpDQotCQkJCQkgICAgKDk1OSwgMTU2NSkNCi0JCQkJCSAgICAoOTU5LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAxNTY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5GYWNldCIgQDE0MjINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyMA0KLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1MywgMTUzMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5GYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MzA5MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjdBIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MjANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzAzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDE1NjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzNCwgMTUyMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0NjY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDQiIEAxNDI1DQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDE2NTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzAwMURCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNSIgQDE0MjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyNQ0KLQkJCQkJbG9jYXRpb24gICAJKDQ5NiwgLTMzNCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjk3MTAwQ0YiDQotCQkJCQljbGllbnQgICAgIAlAMTQyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg4MTYsIDE2NTApDQotCQkJCQkgICAgKDk1OSwgMTY1MCkNCi0JCQkJCSAgICAoOTU5LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODE2LCAxNjUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNaW5GYWNldCIgQDE0MjcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyNQ0KLQkJCQkJbG9jYXRpb24gICAJKDQ5NiwgLTMzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY0LCAxNjE0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1pbkZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTQxNjE4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjk3MTAwRDkiDQotCQkJCQljbGllbnQgICAgIAlAMTQyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODE2LCAxNjUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTY1MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAxNjA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAyNzQwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3NCIgQDE0MzANCi0JCQkJbG9jYXRpb24gICAJKDEyOTcsIDIzMjEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0YwMTk5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3NSIgQDE0MzENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzMA0KLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEMjAwODUiDQotCQkJCQljbGllbnQgICAgIAlAMTQzMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjMyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heExlbmd0aEZhY2V0IiBAMTQzMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDMwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTcxOSwgNDk3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjMwLCAyMzgwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heExlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyMjU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEMjAwOEYiDQotCQkJCQljbGllbnQgICAgIAlAMTQzMA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjk3LCAyMzIxKQ0KLQkJCQkJICAgICgxMjk3LCAyNDA5KQ0KLQkJCQkJICAgICgyMTAyLCAyNDA5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjMyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAyLCAyNDA5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTk0LCAyMzY2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc5MjA4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3NiIgQDE0MzUNCi0JCQkJbG9jYXRpb24gICAJKDExNTksIDIyNzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDUwMEM1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3NyIgQDE0MzYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yODEsIDQ0OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENjAwMUQiDQotCQkJCQljbGllbnQgICAgIAlAMTQzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE1OSwgMjI3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTU5LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkxlbmd0aEZhY2V0IiBAMTQzNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4MSwgNDQ5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTcsIDIzNzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluTGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTk1MjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ2MDAyNyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDM1DQotCQkJCQlzdXBwbGllciAgIAlAMTMwNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNTksIDIyNzMpDQotCQkJCQkgICAgKDExNTksIDI0MDkpDQotCQkJCQkgICAgKDQ1MCwgMjQwOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNTksIDIyNzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCAyNDA5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjMsIDIzNjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM2MTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAwIiBAMTQ0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgMjMzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5ODAxNkQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAxIiBAMTQ0MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQwDQotCQkJCQlsb2NhdGlvbiAgIAkoOTQxLCAtNjEwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODk5MDA1NiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDQwDQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAyMzM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiIEAxNDQyDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDANCi0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NiwgMjQ1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1MjYwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDYwIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NDANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE5NywgMjMzNCkNCi0JCQkJCSAgICAoMTE5NywgMjQ5MykNCi0JCQkJCSAgICAoNDUwLCAyNDkzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0OTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyNywgMjQ1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNjA0Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTgiIEAxNDQ1DQotCQkJCWxvY2F0aW9uICAgCSgxMjMxLCAyNDM4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCODQwMDA2MiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTkiIEAxNDQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDUNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjMsIC03NDYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDEwMDFEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDI0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IiBAMTQ0Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQ1DQotCQkJCQlsb2NhdGlvbiAgIAkoODYzLCAtNzQ2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDI2MzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NzAzMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDEwMDI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0NDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIzMSwgMjQzOCkNCi0JCQkJCSAgICAoMTIzMSwgMjY2OCkNCi0JCQkJCSAgICAoNDUxLCAyNjY4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDI2NjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQ5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzNCwgMjYzMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxODgxMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzgiIEAxNDUwDQotCQkJCWxvY2F0aW9uICAgCSgxMjMxLCAyMzk3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDBERSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzkiIEAxNDUxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMjA5LCAyNTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwM0NEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NTANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDIzOTcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0b3RhbERpZ2l0c0ZhY2V0IiBAMTQ1Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDUwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTIwOSwgMjUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTMsIDI1NTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdG90YWxEaWdpdHNGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4NTU2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwM0Q3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0NTANCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIzMSwgMjM5NykNCi0JCQkJCSAgICAoMTIzMSwgMjU4NykNCi0JCQkJCSAgICAoNDUxLCAyNTg3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjM5NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDI1ODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzNSwgMjU2MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNDY0Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDE0NTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCA3NjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTksIDU3NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTQ0NA0KLQkJCQloZWlnaHQgICAgIAk0MTMNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTQ1Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwOSwgMTA2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTQ1NQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMjA5LCAxMDY1KQ0KLQkJCQkgICAgKDEyMDksIDk3NCkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM0IiBAMTQ1Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTA5MCwgMTAzMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODBGNTAzRDkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGVEZWZpbml0aW9uIiBAMTQ1OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDU3DQotCQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAtMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDU5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDU4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg5NywgMTAzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDk4NzY1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTk0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjkwMDNDIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NTcNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTAsIDEwMzEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5MCwgOTc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTIxLCAxMDM0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2MTcyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM1IiBAMTQ2MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDU3DQotCQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAtMjUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjkwMDQ2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0NTcNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTAsIDEwMzEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5MCwgMTA4OCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0MCIgQDE0NjINCi0JCQkJbG9jYXRpb24gICAJKDE1MzgsIDg3MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZEQjAxRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGUiIEAxNDYzDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjINCi0JCQkJCWxvY2F0aW9uICAgCSgxNzgsIDEwNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OCwgNzkyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjc2MDg3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE2REQwM0REIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NjINCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzOCwgODczKQ0KLQkJCQkJICAgICgxNTM4LCA5MTkpDQotCQkJCQkgICAgKDE0NTQsIDkxOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA5MTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDY1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MDksIDg3NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAxNjY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQxIiBAMTQ2Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDYyDQotCQkJCQlsb2NhdGlvbiAgIAkoMTc4LCAxMDUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE2REQwM0RFIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NjINCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzOCwgODczKQ0KLQkJCQkJICAgICgxNTM4LCA4MjgpDQotCQkJCQkgICAgKDE0NTQsIDgyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA4MjgpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDIiIEAxNDY3DQotCQkJCWxvY2F0aW9uICAgCSgxNTM1LCA2ODQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTIwMTA4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlIiBAMTQ2OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTc1LCAtODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDY5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTksIDU5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS45NzcyNzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzE0MDE1MSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDY3DQotCQkJCQlzdXBwbGllciAgIAlAMTQ1NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzUsIDY4NCkNCi0JCQkJCSAgICAoMTUzNSwgNzI4KQ0KLQkJCQkJICAgICgxNDU0LCA3MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM1LCA2ODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgNzI4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTA2LCA2ODMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI3Nzc4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDMiIEAxNDcxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjcNCi0JCQkJCWxvY2F0aW9uICAgCSgxNzUsIC04NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxNDAxNUIiDQotCQkJCQljbGllbnQgICAgIAlAMTQ2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NTUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM1LCA2ODQpDQotCQkJCQkgICAgKDE1MzUsIDY0MSkNCi0JCQkJCSAgICAoMTQ1NCwgNjQxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzNSwgNjg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDY0MSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0NiIgQDE0NzINCi0JCQkJbG9jYXRpb24gICAJKDYxMywgOTQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBN0VEMDNDMCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb21wbGV4VHlwZSIgQDE0NzMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3Mg0KLQkJCQkJbG9jYXRpb24gICAJKC03NDcsIDE3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDY1LCA5ODMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29tcGxleFR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzMwNTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBN0Y0MDExNyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDcyDQotCQkJCQlzdXBwbGllciAgIAlAMTMwOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDYxMywgOTQwKQ0KLQkJCQkJICAgICgyODQsIDk0MCkNCi0JCQkJCSAgICAoMjg0LCAxMDA4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg0LCAxMDA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDk3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwOTMyMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQ3IiBAMTQ3Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDcyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTc0NywgMTcyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBN0Y0MDEyMSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDcyDQotCQkJCQlzdXBwbGllciAgIAlAMTQ1NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MTMsIDk0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEwLCA5NDApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCWNsaWVudCAgICAgCUAxNDU1DQotCQkJCXN1cHBsaWVyICAgCUAxMjg1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTEyLCA1NjIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTEyLCA1MTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEyODYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUAxMzA3DQotCQkJCXN1cHBsaWVyICAgCUAxNDU1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDg4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE0NiwgMTA2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ1NikNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0NCIgQDE0NzkNCi0JCQkJbG9jYXRpb24gICAJKDEzNjIsIDExMzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3NEIwMTc4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNpbXBsZVR5cGUiIEAxNDgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NzkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU4LCAtMTYzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDk5LCAxMDk0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NpbXBsZVR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjQ2NzUzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3NEQwMTdCIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NzkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjIsIDExMzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgMTI5MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0ODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyMSwgMTA5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMjcyNzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NSIgQDE0ODMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTgsIC0xNjMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3NEQwMTg1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0NzkNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjIsIDExMzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgOTc0KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDE0ODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgMzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDAyLCAzMDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDAyLCAzNjMpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBnbG9iYWwgOiBib29sZWFuIg0KLQkJCQkJIisgZmVhdHVyZVJlZmVyZW5jZSA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJNTU4DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNDg1DQotCQkJCWxvY2F0aW9uICAgCSgyMjYyLCA1NjgpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDE0ODQNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjI2MiwgNTY4KQ0KLQkJCQkgICAgKDIyNjIsIDQ3NykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDg2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQljbGllbnQgICAgIAlAMTI4MQ0KLQkJCQlzdXBwbGllciAgIAlAMTQ4NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTk1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM0NiwgNTY4KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDg1KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM4IiBAMTQ4Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MywgNDUzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBMEYyMDFBNCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlIiBAMTQ4OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDg3DQotCQkJCQlsb2NhdGlvbiAgIAkoODAxLCAyOTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDg4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMzEsIDQ5OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA2MjY2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRTUiDQotCQkJCQljbGllbnQgICAgIAlAMTQ4Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NTUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTUzLCA0NTMpDQotCQkJCQkgICAgKDEyMjIsIDQ1MykNCi0JCQkJCSAgICAoMTIyMiwgNTYyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU1MywgNDUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMjIsIDU2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE4NSwgNDc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODEyMDMwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzkiIEAxNDkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0ODcNCi0JCQkJCWxvY2F0aW9uICAgCSg4MDEsIDI5MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRjAiDQotCQkJCQljbGllbnQgICAgIAlAMTQ4Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDE0ODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU1MywgNDUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDQ1MykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMCIgQDE0OTINCi0JCQkJbG9jYXRpb24gICAJKDE5MDgsIDM1MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwNjAyRDciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRGZWF0dXJlIiBAMTQ5Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDkyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyOSwgMzUyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkRmVhdHVyZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjk0MTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMEUiDQotCQkJCQljbGllbnQgICAgIAlAMTQ5Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDE0ODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxOTA4LCAzNTMpDQotCQkJCQkgICAgKDE5MDgsIDM4NykNCi0JCQkJCSAgICAoMTk5MywgMzg3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkwOCwgMzUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDM4NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk0NSwgMzU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk2NjM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzEiIEAxNDk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0OTINCi0JCQkJCWxvY2F0aW9uICAgCSgtMjY4LCAtMTU5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjkwMTBCMDAxOCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDkyDQotCQkJCQlzdXBwbGllciAgIAlAMTQ4NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE5MDgsIDM1MykNCi0JCQkJCSAgICAoMTkwOCwgMzE5KQ0KLQkJCQkJICAgICgxOTkzLCAzMTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTA4LCAzNTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5MywgMzE5KSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDk3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIg0KLQkJCQljbGllbnQgICAgIAlAMTI4NQ0KLQkJCQlzdXBwbGllciAgIAlAMTI4NA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0OTQsIDI4NCkNCi0JCQkJICAgICg0OTQsIDI0NCkNCi0JCQkJICAgICg5OTYsIDI0NCkpDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDI4NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NiwgMjQ0KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCN0RDMDE5MyINCi0JCQkJY2xpZW50ICAgICAJQDEyNzINCi0JCQkJc3VwcGxpZXIgICAJQDE0ODQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MTgsIDgxMikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MTgsIDU2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ4NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDEzMDkNCi0JCQkJc3VwcGxpZXIgICAJQDE0NTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjUsIDEyOTIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjY1LCAxMDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDU2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTAwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3Ig0KLQkJCQljbGllbnQgICAgIAlAMTQ4NA0KLQkJCQlzdXBwbGllciAgIAlAMTI4NA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyMTQ3LCAyOTEpDQotCQkJCSAgICAoMjE0NywgMjQ0KQ0KLQkJCQkgICAgKDE0NjgsIDI0NCkpDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTQ3LCAyOTEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAyNDQpKSkpKSkpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMTYzIg0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpodHRwIiBAMTUwMQ0KLQkJCWxvY2F0aW9uICAgCSgzMzYsIDIyNCkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDENCi0JCQkgICAgbG9jYXRpb24gICAJKDE5MiwgMTQwKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJodHRwIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiM0FCRkQ5QUQwMUY4Ig0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp3c2RsIiBAMTUwMg0KLQkJCWxvY2F0aW9uICAgCSg3ODQsIDIyNCkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDINCi0JCQkgICAgbG9jYXRpb24gICAJKDY0MCwgMTQwKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJ3c2RsIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiM0FERkI4RTUwMjFFIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp4c2QiIEAxNTAzDQotCQkJbG9jYXRpb24gICAJKDEyMzIsIDIyNCkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDMNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDE0MCkNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkieHNkIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzlBQkRDNkYwMUFBIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpDQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciDQotCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxNTIiDQotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxOEIiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzDQotCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxNTMiDQotCVByb2NzTkRldnMgCShsaXN0DQotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3Ig0KLQkJcXVpZCAgICAgICAJIjNBQkZEOUE3MDE1NSINCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcw0KLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlIg0KLQkJCXZhbHVlICAgICAgCSgiRGF0YUJhc2VTZXQiIDgwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJBTlNJIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJPcmFjbGUiDQotCQkJCXZhbHVlICAgICAgCTgwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIlNRTFNlcnZlciINCi0JCQkJdmFsdWUgICAgICAJODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiU3liYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJXYXRjb20iDQotCQkJCXZhbHVlICAgICAgCTgwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIklkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWUiDQotCQkJdmFsdWUgICAgICAJIlZfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVF8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdFN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiX1YiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkJhc2VWaWV3cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIlZBUkNIQVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNPSyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMRWxlbWVudCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMU3BlY2lmaWNhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJJRExTcGVjU2V0IiAyMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExTcGVjU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJUeXBlZGVmIg0KLQkJCQl2YWx1ZSAgICAgIAk1NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTcxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiRXhjZXB0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk2MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlN0cnVjdCINCi0JCQkJdmFsdWUgICAgICAJNTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJVbmlvbiINCi0JCQkJdmFsdWUgICAgICAJODEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuYmluZGluZy5odHRwL3NyYy9yb3NlL2h0dHBiaW5kaW5nTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUlETE1vZHVsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuYmluZGluZy5odHRwL3NyYy9yb3NlL2h0dHBiaW5kaW5nTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiUmFpc2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkSGFzUmVsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkhhc1JlbFR5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVByZWZpeGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIm1fIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJzXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJ2b2lkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSb290RGlyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkF1dG9TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNob3dDb2RlZ2VuRGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0VmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFNpbmNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNYXhOdW1DaGFycyINCi0JCQl2YWx1ZSAgICAgIAk4MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZNIg0KLQkJCXZhbHVlICAgICAgCSgiVk1UeXBlIiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTVR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN1biINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk1pY3Jvc29mdCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIklCTSINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHbG9iYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VDbGFzc1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVNwYWNlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyINCi0JCQl2YWx1ZSAgICAgIAkzKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXN0ZXJpc2tDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jQXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEltcG9ydHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIl9JRCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIg0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTkwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTE5MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiDQotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQUZURVIiDQotCQkJCXZhbHVlICAgICAgCTE4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiDQotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUk9XIg0KLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCINCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIjYiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcmVzZXJ2ZVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiDQotCQkJdmFsdWUgICAgICAJImNsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQdXRCb2RpZXNJblNwZWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJlbGF0aW9uYWxPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlcmVmZXJlbmNlT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VSZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25WaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RyZWFtT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiDQotCQkJCXZhbHVlICAgICAgCTIwNikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuYmluZGluZy5odHRwL3NyYy9yb3NlL2h0dHBiaW5kaW5nTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgDQotfC8vICRwYWNrYWdlDQotfCNpbmNsdWRlICIkZmlsZSINCi18DQotCQkJKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuaHR0cC9zcmMvcm9zZS9odHRwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgDQotfC8vICRwYWNrYWdlDQotfCNpbmNsdWRlICIkZmlsZSINCi18DQotCQkJKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk9wZXJhdGlvbktpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNFeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmFpc2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkSGFzUmVsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkhhc1JlbFR5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnlJc09uU2VhcmNoTGlzdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiDQotCQkJdmFsdWUgICAgICAJMikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIjUuMCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDbGFzc19GYWN0b3J5Ig0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2VyaWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9EQVRBX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJMaWNlbnNlZCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYklEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BJZEVudW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSU5URVJGQUNFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaGVyaXRhbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDT01NYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX1BPSU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcGVydHlNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsX092ZXJyaWRlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X0ZpcmluZ19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbWFuZF9QYXJzZXIiDQotCQkJCXZhbHVlICAgICAgCTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9Ob3RpZnlfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTEwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlJbWFnZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiU0NDIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVHlwZUxpYkltcG9ydGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRhYmxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMjEzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjIwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25CYXNlIg0KLQkJCXZhbHVlICAgICAgCSIwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkV4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIg0KLQkJCXZhbHVlICAgICAgCSgiQ29tcGFyZVNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAkoIkNyZWF0YWJsZVNldCIgMjIxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5pdGlhbGl6YXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVRlcm1pbmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbkNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSJDb2xsZWN0aW9uIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiQmluYXJ5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJUZXh0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJG9wZXJhdGlvbiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5ldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZSRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUxldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk5ldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZSRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUxldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk2MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTYzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTY0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk2MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTYzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTY0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlIyRWRpdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmVyc2lvbiBDb250cm9sIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxNTQiKSkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL21pbWUubWRsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9taW1lLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzYzIyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy9yb3NlL21pbWUubWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzI5OTggKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk0Mg0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA0LjUuODA1NGEiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMNCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwDQotCWxlZnRNYXJnaW4gCTAuMjUwMDAwDQotCXRvcE1hcmdpbiAgCTAuMjUwMDAwDQotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDANCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwDQotCWNsaXBJY29uTGFiZWxzIAlUUlVFDQotCWF1dG9SZXNpemUgCVRSVUUNCi0Jc25hcFRvR3JpZCAJVFJVRQ0KLQlncmlkWCAgICAgIAkxNg0KLQlncmlkWSAgICAgIAkxNg0KLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250DQotCSAgICBzaXplICAgICAgIAkxMA0KLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JICAgIGNvbG9yICAgICAgCTANCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCXNob3dNZXNzYWdlTnVtIAkxDQotCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFDQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikNCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciDQotCXF1aWQgICAgICAgCSIzQUM5MTA1MTAzMUUiDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzQUM5MTA1MjAwMUIiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0FDOTEwNTEwMzFEIg0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyINCi0JcXVpZHUgICAgICAJIjNBQzkxMDUxMDMxRiINCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm1pbWUiDQotCQlxdWlkICAgICAgIAkiM0FDOTEyN0MwMjY2Ig0KLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzcyAiTUlNRUNvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNBQzkxMzVCMDNBNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUVGMTFDQTAzOEUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNkEzMDE2OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6SU1JTUVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiNDBBMTA1RTAwMUNDIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UGFydCINCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNjZGMDAyMyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnQiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJ2b2lkIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnQiDQotCQkJCXF1aWQgICAgICAgCSI0MEExMDY3RDAyQ0MiDQotCQkJCXJlc3VsdCAgICAgCSJTdHJpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0FDOTE5NzEwMzZCIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk1JTUVQYXJ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUM5MTNFRTAwRUIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiNDBBMEZERUYwMzIyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSI0MEExMDJDRDAxNzUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6OklNSU1FUGFydCINCi0JCQkJcXVpZHUgICAgICAJIjQwQTEwMjVEMDFBNiIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiNDBBMTA0NjQwMUEyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikpDQotCQkJCXJlc3VsdCAgICAgCSJ2b2lkIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNDg0MDI3QiINCi0JCQkJcmVzdWx0ICAgICAJIkxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiTUlNRU11bHRpcGFydFJlbGF0ZWQiDQotCQkJcXVpZCAgICAgICAJIjNBQzkxM0ZBMDI1QiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUVGMTFENTAzMzAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwM0FEMDMxQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6SU1JTUVNdWx0aXBhcnRSZWxhdGVkIg0KLQkJCQlxdWlkdSAgICAgIAkiNDBBMTAzM0IwMEREIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkTUlNRVBhcnQiDQotCQkJCXF1aWQgICAgICAgCSI0MEExMDNGNjAxNzIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtaW1lUGFydCINCi0JCQkJCXR5cGUgICAgICAgCSJJTUlNRVBhcnQiKSkNCi0JCQkJcmVzdWx0ICAgICAJInZvaWQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TUlNRVBhcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiNDBBMTA0MDMwMzhEIg0KLQkJCQlyZXN1bHQgICAgIAkiTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJNSU1FTWltZVhtbCINCi0JCQlxdWlkICAgICAgIAkiM0FDOTE0NUEwMUZGIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRUYxMUREMDM4QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiNDBBMTA3NDcwMzRFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpJTUlNRU1pbWVYbWwiDQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDZFRjAwOEIiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiNDBBMTA2RDQwMUVCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFydCINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJInZvaWQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydCINCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNkUxMDA5NSINCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJJTUlNRVBhcnQiDQotCQkJcXVpZCAgICAgICAJIjQwQTEwMjVEMDFBNiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiNDBBMTAyOUQwM0Q5Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklNSU1FTXVsdGlwYXJ0UmVsYXRlZCINCi0JCQlxdWlkICAgICAgIAkiNDBBMTAzM0IwMEREIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQiDQotCQkJCXF1aWQgICAgICAgCSI0MEExMDM3ODAxOEYiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1JTUVDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSI0MEExMDVFMDAxQ0MiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNUY1MDIyNiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJJTUlNRU1pbWVYbWwiDQotCQkJcXVpZCAgICAgICAJIjQwQTEwNkVGMDA4QiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIg0KLQkJCQlxdWlkICAgICAgIAkiNDBBMTA3MUUwM0I0Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkxpc3QiDQotCQkJcXVpZCAgICAgICAJIjQwQTEwQkZBMDEwOSINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkxpc3QiDQotCQkJCXF1aWQgICAgICAgCSI0MEExMEMwOTAyQTYiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JCQlxdWlkICAgICAgIAkiM0FFNzNCM0MwMzU2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEiDQotCQkJCXF1aWQgICAgICAgCSIzQUU3M0IzRDAwOTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FDOTEzNUIwM0E3IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFydCINCi0JCQkJcXVpZCAgICAgICAJIjNBRTczQjNEMDA5QSINCi0JCQkJbGFiZWwgICAgICAJImVQYXJ0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCQkJcXVpZCAgICAgICAJIjNBRTczQkI5MDBENSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFydCINCi0JCQkJcXVpZCAgICAgICAJIjNBRTczQkI5MDNDRSINCi0JCQkJbGFiZWwgICAgICAJImVQYXJ0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFNzNCQjkwM0UyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTWltZVhtbCINCi0JCQkJcXVpZHUgICAgICAJIjNBQzkxNDVBMDFGRiIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUVGMTJGRTAzODciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUYxMzAwMDBENyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU11bHRpcGFydFJlbGF0ZWQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTNGQTAyNUIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTUlNRVBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQUVGMTMwMDAwRTEiDQotCQkJCWxhYmVsICAgICAgCSJlTUlNRVBhcnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FDOTEzRUUwMEVCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQ0KLQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIkJpbmRpbmdzIg0KLQkJCXF1aWQgICAgICAgCSIzQUM5MTI4QjAxRjkiDQotCQkJdGl0bGUgICAgICAJIkJpbmRpbmdzIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRUNvbnRlbnQiIEAxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgODQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MCwgNzE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI4NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1JTUVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQzkxMzVCMDNBNyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTAsIDc3NykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTI3MikNCi0JCQkJd2lkdGggICAgICAJMzAyDQotCQkJCWhlaWdodCAgICAgCTI4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTEsIDExNTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCWhlaWdodCAgICAgCTEyNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTA2NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUU3M0IzQzAzNTYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCQkJbG9jYXRpb24gICAJKC00MTYsIC0xNjgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFNzNCM0QwMDkwIg0KLQkJCQkJY2xpZW50ICAgICAJQDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxDQotCQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBhcnQiIEA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDE2LCAtMTY4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTE1LCAxMTAyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJ0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM5MzI2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFNzNCM0QwMDlBIg0KLQkJCQkJY2xpZW50ICAgICAJQDMNCi0JCQkJCXN1cHBsaWVyICAgCUAyDQotCQkJCQlsaW5lX3N0eWxlIAkwDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODEsIDEwOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDkxMDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNaW1lWG1sIiBAOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDE1MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDc4LCAxMzk4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMwOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1JTUVNaW1lWG1sIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQzkxNDVBMDFGRiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NzgsIDE0NTgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDYpDQotCQkJCXdpZHRoICAgICAgCTMyNg0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMiIgQDkNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEzMjMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFNzNCQjkwMEQ1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJ0IiBAMTANCi0JCQkJCVBhcmVudF9WaWV3IAlAOQ0KLQkJCQkJbG9jYXRpb24gICAJKDE0NCwgLTMyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTA2LCAxMjkzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJ0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDg5NTgzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFNzNCQjkwM0NFIg0KLQkJCQkJY2xpZW50ICAgICAJQDkNCi0JCQkJCXN1cHBsaWVyICAgCUAyDQotCQkJCQlsaW5lX3N0eWxlIAkwDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcwOCwgMTI4NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY1MjI3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTc2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMyIgQDEzDQotCQkJCQlQYXJlbnRfVmlldyAJQDkNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDQsIC0zMjUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFNzNCQjkwM0UyIg0KLQkJCQkJY2xpZW50ICAgICAJQDkNCi0JCQkJCXN1cHBsaWVyICAgCUA4DQotCQkJCQlsaW5lX3N0eWxlIAkwKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU11bHRpcGFydFJlbGF0ZWQiIEAxNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDU2MCwgNTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM0MSwgNDg2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1JTUVNdWx0aXBhcnRSZWxhdGVkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQzkxM0ZBMDI1QiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNDEsIDU0NikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNCkNCi0JCQkJd2lkdGggICAgICAJNDU2DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRVBhcnQiIEAxNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDU2MCwgMTA0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyOTYsIDkzNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FUGFydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTNFRTAwRUIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjk2LCA5OTQpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjUpDQotCQkJCXdpZHRoICAgICAgCTU0Ng0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDE2DQotCQkJCWxvY2F0aW9uICAgCSg1NjAsIDgxNSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVGMTJGRTAzODciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDE3DQotCQkJCQlQYXJlbnRfVmlldyAJQDE2DQotCQkJCQlsb2NhdGlvbiAgIAkoMzIsIDExMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVGMTMwMDAwRDciDQotCQkJCQljbGllbnQgICAgIAlAMTYNCi0JCQkJCXN1cHBsaWVyICAgCUAxNA0KLQkJCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNSU1FUGFydCIgQDE4DQotCQkJCQlQYXJlbnRfVmlldyAJQDE2DQotCQkJCQlsb2NhdGlvbiAgIAkoMzIsIDExMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NDQsIDg5MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTUlNRVBhcnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk0MDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVGMTMwMDAwRTEiDQotCQkJCQljbGllbnQgICAgIAlAMTYNCi0JCQkJCXN1cHBsaWVyICAgCUAxNQ0KLQkJCQkJbGluZV9zdHlsZSAJMA0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUwMywgODk4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk0MTE4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNjQsIDg5MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTkNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTQwMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE5Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6OklNSU1FUGFydCIgQDIyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCAxNDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNSwgMTQyMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSU1JTUVQYXJ0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDUsIDEzNzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEwMzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDI1RDAxQTYiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1LCAxNDgyKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTAyOCkNCi0JCQkJd2lkdGggICAgICAJMTA0OA0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjQwQTEwMkNEMDE3NSINCi0JCQkJY2xpZW50ICAgICAJQDE1DQotCQkJCXN1cHBsaWVyICAgCUAyMg0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6OklNSU1FTXVsdGlwYXJ0UmVsYXRlZCIgQDI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzY4LCAxNzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzLCAxNDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTI1MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklNSU1FTXVsdGlwYXJ0UmVsYXRlZCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzLCA5MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTI1MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjQwQTEwMzNCMDBERCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDMsIDIwMikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEyNDcpDQotCQkJCXdpZHRoICAgICAgCTEyNjgNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDNBRDAzMUMiDQotCQkJCWNsaWVudCAgICAgCUAxNA0KLQkJCQlzdXBwbGllciAgIAlAMjQNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpJTUlNRUNvbnRlbnQiIEAyNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDQzMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDg0LCAzOTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTA5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklNSU1FQ29udGVudCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4NCwgMzQ4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDBBMTA1RTAwMUNDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwODQsIDQ1OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTEwOTQpDQotCQkJCXdpZHRoICAgICAgCTExMTQNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDZBMzAxNjgiDQotCQkJCWNsaWVudCAgICAgCUAxDQotCQkJCXN1cHBsaWVyICAgCUAyNg0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6OklNSU1FTWltZVhtbCIgQDI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYxNiwgMTkwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDU1LCAxODcwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTExMjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTUlNRU1pbWVYbWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNTUsIDE4MjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTExMjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDZFRjAwOEIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1NSwgMTkzMCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTExMTkpDQotCQkJCXdpZHRoICAgICAgCTExNDANCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDc0NzAzNEUiDQotCQkJCWNsaWVudCAgICAgCUA4DQotCQkJCXN1cHBsaWVyICAgCUAyOA0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Okxpc3QiIEAzMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMTc2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDE3MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTGlzdCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAxNjUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDBBMTBCRkEwMTA5Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMTc2MSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MSkNCi0JCQkJd2lkdGggICAgICAJNTYyDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiRXh0ZW5zaWJpbGl0eSINCi0JCQlxdWlkICAgICAgIAkiM0FFNzNBQTMwMzJFIg0KLQkJCXRpdGxlICAgICAgCSJFeHRlbnNpYmlsaXR5Ig0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgMTkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ3LCA4NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ3LCAxOTUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYpDQotCQkJCXdpZHRoICAgICAgCTQ3Ng0KLQkJCQloZWlnaHQgICAgIAkyMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNaW1lWG1sIiBAMzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCA3NTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3NCwgNjQ2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMwOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1JTUVNaW1lWG1sIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQzkxNDVBMDFGRiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTc0LCA3MDYpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDYpDQotCQkJCXdpZHRoICAgICAgCTMyNg0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNdWx0aXBhcnRSZWxhdGVkIiBAMzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDExMzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMzLCAxMDMwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1JTUVNdWx0aXBhcnRSZWxhdGVkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQzkxM0ZBMDI1QiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MzMsIDEwOTApDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQpDQotCQkJCXdpZHRoICAgICAgCTQ1Ng0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVQYXJ0IiBAMzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCA3NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDY2MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FUGFydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTNFRTAwRUIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDcyMikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNSkNCi0JCQkJd2lkdGggICAgICAJNTQ2DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRUNvbnRlbnQiIEAzNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzkyLCA3NTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1MCwgNjQ2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI4NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1JTUVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBQzkxMzVCMDNBNyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjUwLCA3MDYpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDYpDQotCQkJCXdpZHRoICAgICAgCTMwMg0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzYNCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgNTI2KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzMQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg5NzYsIDUyNikNCi0JCQkJICAgICg5NzYsIDMwOSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUYxMUREMDM4QiINCi0JCQkJY2xpZW50ICAgICAJQDMyDQotCQkJCXN1cHBsaWVyICAgCUAzMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1NiwgNjM0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1NiwgNTI2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVGMTFENTAzMzAiDQotCQkJCWNsaWVudCAgICAgCUAzMw0KLQkJCQlzdXBwbGllciAgIAlAMzENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg0NCwgMTAxOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0NCwgNTI2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVGMTFDQTAzOEUiDQotCQkJCWNsaWVudCAgICAgCUAzNQ0KLQkJCQlzdXBwbGllciAgIAlAMzENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzgsIDYzNCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzgsIDUyNikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiNDBBMEZERUYwMzIyIg0KLQkJCQljbGllbnQgICAgIAlAMzQNCi0JCQkJc3VwcGxpZXIgICAJQDMxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTYsIDY1MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NiwgNTI2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNikpKSkpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3c2RsIg0KLQkJcXVpZCAgICAgICAJIjNBREZCOEU1MDIxRSINCi0JCWRvY3VtZW50YXRpb24gCQ0KLXxUaGUgV1NETCBtb2RlbCBjb250YWlucyBjbGFzc2VzIGZvciB0aGUgV2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIExhbmd1YWdlIChXU0RMKS4NCi18DQotfFdTREwgZGVzY3JpYmVzIG5ldHdvcmsgc2VydmljZXMgYXMgc2V0cyBvZiBlbmRwb2ludHMgb3BlcmF0aW5nIG9uIG1lc3NhZ2VzLiBUaGUgb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgYXJlIGRlc2NyaWJlZCBhYnN0cmFjdGx5LCBhbmQgdGhlbiBib3VuZCB0byBhIGNvbmNyZXRlIG5ldHdvcmsgcHJvdG9jb2wgYW5kIG1lc3NhZ2UgZm9ybWF0IHRvIGRlZmluZSBhbiBlbmRwb2ludC4NCi18DQotfFdTREwgZGVzY3JpYmVzIHRoZSBmb3JtYXRzIG9mIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYnkgdGhlIHNlcnZpY2VzLCBhbmQgc3VwcG9ydHMgdGhlIFhNTCBTY2hlbWFzIHNwZWNpZmljYXRpb24gYXMgaXRzIGNhbm9uaWNhbCB0eXBlIHN5c3RlbS4gVGhpcyBwYWNrYWdlIHVzZXMgYW4gWE1MIFNjaGVtYSBJbmZvc2V0IG1vZGVsIHBhY2thZ2UgKHNlZSB0aGUgWFNEIHBhY2thZ2UpIHRvIGRlc2NyaWJlIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdHMuDQotfA0KLXxUaGUgbW9kZWwgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkaWFncmFtcywgbmFtZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcHRlcnMgaW4gdGhlIFdTREwgMS4xIHNwZWNpZmljYXRpb24gKGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvTk9URS13c2RsLTIwMDEwMzE1KQ0KLXwtIDIuMSBEZWZpbml0aW9uLCBzaG93cyB0aGUgV1NETCBkZWZpbml0aW9uIGVsZW1lbnQgYW5kIHRoZSBXU0RMIGRvY3VtZW50IHN0cnVjdHVyZQ0KLXwtIDIuMS4xIE5hbWluZyBhbmQgTGlua2luZywgc2hvd3MgdGhlIG5hbWVzcGFjZSBhbmQgaW1wb3J0IG1lY2hhbmlzbQ0KLXwtIDIuMS4zIEV4dGVuc2liaWxpdHksIHNob3dzIHRoZSBXU0RMIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtDQotfC0gMi4yIFR5cGVzLCBzaG93cyB0aGUgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gV1NETA0KLXwtIDIuMyBNZXNzYWdlcywgMi40IFBvcnRUeXBlcywgMi41IEJpbmRpbmdzIGFuZCAyLjcgU2VydmljZXMsIHNob3cgdGhlIG1ham9yIFdTREwgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9ucy4NCi18DQotfFRoZSBXU0RMIGNsYXNzZXMgZXh0ZW5kIHRoZSBqYXZheC53c2RsIGludGVyZmFjZXMgZGVmaW5lZCBieSBKU1IgMTEwLiBDbGFzc2VzIHdpdGggaW50ZXJmYWNlIGFuZCBkYXRhdHlwZSBzdGVyZW90eXBlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlc2Ugbm9uLU1PRiBpbnRlcmZhY2VzLg0KLQkJDQotCQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzICJXU0RMRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0FENUM2QTMwMkREIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGxhbmd1YWdlIGVsZW1lbnQuIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEVuY2xvc2luZ0RlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTI5NjAwQzgiDQotCQkJCXJlc3VsdCAgICAgCSJEZWZpbml0aW9uIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEVuY2xvc2luZ0RlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTJCODAzNDciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJkZWZpbml0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIkRlZmluaXRpb24iKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvY3VtZW50YXRpb25FbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NDRTQ0MzYwMkEzIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzRjk3REJEMzAyMDciDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJQb3J0VHlwZSINCi0JCQlxdWlkICAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnRUeXBlIGVsZW1lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMSBhbmQgYW4gSW50ZXJmYWNlIGNvbXBvbmVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLiBBIHBvcnQgdHlwZSBvciBJbnRlcmZhY2UgaXMgYSBuYW1lZCBzZXQgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBhbmQgdGhlIGFic3RyYWN0IG1lc3NhZ2VzIGludm9sdmVkLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzlCNzAxNTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkQ4MDE5RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg4RTAwMjMiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUUzMDFFNSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThDREVCMDMxNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENEZEMDFCQSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudC4gQSBXU0RMIG9wZXJhdGlvbiBpcyBhbiBhYnN0cmFjdCBkZXNjcmlwdGlvbiBvZiBhbiBhY3Rpb24gc3VwcG9ydGVkIGJ5IGEgc2VydmljZS4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFOURFOTgwMDNDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZFMjAxNzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTc3NjAwRDEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHlsZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0NzI2MDFBQyINCi0JCQkJdHlwZSAgICAgICAJIk9wZXJhdGlvblR5cGUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0JERDk2NDMwMDRDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYyMzUwMDNFIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOENFMjIwMUFEIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ1MjAwMTFCIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk1lc3NhZ2UiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBtZXNzYWdlIGVsZW1lbnQuIEEgV1NETCBtZXNzYWdlIGlzIGFuIGFic3RyYWN0LCB0eXBlZCBkZWZpbml0aW9uIG9mIHRoZSBkYXRhIGJlaW5nIGNvbW11bmljYXRlZC4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQwNTUwMUM0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QThEMTAyQkEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4QUYwMDRGIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg3QzAxRkUiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUQyMDIyNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTRCMDJCMCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTQyMDBGMSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJQYXJ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcGFydCBlbGVtZW50LiBQYXJ0cyBkZXNjcmliZSB0aGUgbG9naWNhbCBhYnN0cmFjdCBjb250ZW50IG9mIGEgbWVzc2FnZS4gRWFjaCBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUgZnJvbSBzb21lIHR5cGUgc3lzdGVtLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NkQwMkYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOTNGMDFCRSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg5N0UyMzAyMzciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEI3MDNDOCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnROYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIwODcwM0RCIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEMzMDNDNSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmciDQotCQkJcXVpZCAgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBiaW5kaW5nIGVsZW1lbnQuIEEgYmluZGluZyBkZWZpbmVzIG1lc3NhZ2UgZm9ybWF0IGFuZCBwcm90b2NvbCBkZXRhaWxzIGZvciBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBkZWZpbmVkIGJ5IGEgcGFydGljdWxhciBwb3J0VHlwZS4gVGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgYmluZGluZ3MgZm9yIGEgZ2l2ZW4gcG9ydFR5cGUuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGQTBGMDJGMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NDEwMTI5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4OTkwMTRCIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjFGNDAxQTMiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0U2RDAxNTEiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRERjAzNUMiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ09wZXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcuIEFuIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBvcGVyYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIHdpdGhpbiB0aGUgYmluZGluZydzIHBvcnRUeXBlLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENjAwOTIwMkY3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QURFNDAxREMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlDNENCMDE5OSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJTZXJ2aWNlIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgc2VydmljZSBlbGVtZW50LiBBIHNlcnZpY2UgZ3JvdXBzIGEgc2V0IG9mIHJlbGF0ZWQgcG9ydHMgdG9nZXRoZXIuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGQTIwMDI1RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NEUwMUI0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJU2VydmljZSINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4QTQwMTUxIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjIwRDAyMDMiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDQ4MTAyMjAiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRDNTAxRTIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiUG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5MTcwMjg2Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnQgZWxlbWVudC4gQSBwb3J0IGRlZmluZXMgYW4gaW5kaXZpZHVhbCBlbmRwb2ludCBieSBzcGVjaWZ5aW5nIGEgc2luZ2xlIGFkZHJlc3MgZm9yIGEgYmluZGluZyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ2MDBDQjAwQUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQ1MDJDOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI4MDAzMjYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QTAwMzkxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LiBXU0RMIGFsbG93cyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHRlY2hub2xvZ3kgdW5kZXIgdmFyaW91cyBlbGVtZW50cyBkZWZpbmVkIGJ5IFdTREwuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMTQ5MDNEMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCRERGNTM1MDJDMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCINCi0JCQkJcXVpZCAgICAgICAJIjNBRjk1NDNDMDA3MyINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50VHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUIyMUEwMjcxIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIFdTREwgZG9jdW1lbnQuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGREI4MDNENCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRjgwMzgyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldERvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTRGQzIwMTJCIg0KLQkJCQlyZXN1bHQgICAgIAkiRE9NRG9jdW1lbnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTBERTAxRTciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJkb2N1bWVudCINCi0JCQkJCXR5cGUgICAgICAgCSJET01Eb2N1bWVudCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU0NzQwMDRFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSI0MDM1MkI3QzAzOTYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODU3MDJGNSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW5jb2RpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDAwRDAwMEQiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSW1wb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTRGOTAzREUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBXU0RMIGltcG9ydCBlbGVtZW50LiBXU0RMIGFsbG93cyBhc3NvY2lhdGluZyBhIG5hbWVzcGFjZSB3aXRoIGEgZG9jdW1lbnQgbG9jYXRpb24gdXNpbmcgYW4gaW1wb3J0IGVsZW1lbnQuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFRTU4MDM3QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjIwMEQwMzQwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5IikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjcyQzEwMzc5Ig0KLQkJCQlyZXN1bHQgICAgIAkiWFNEU2NoZW1hIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFNjaGVtYSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MkMxMDM5NyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInNjaGVtYSINCi0JCQkJCXR5cGUgICAgICAgCSJYU0RTY2hlbWEiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNTBBMDAzNiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU1MTQwMjExIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkJZG9jdW1lbnRhdGlvbiAJIiBXU0RMIGFsbG93cyBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IChyZWZlcnJlZCB0byBoZXJlIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMpIHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvaW50IG9mIGV4dGVuc2liaWxpdHkuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRTNDMDNENCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzEyQzAzQ0QiDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMTQ3MDI5NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dEVsZW1lbnQiDQotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSINCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudC4gQW4gaW5wdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MDQwMjVGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIyODAyRTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRUUwMzFEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3V0cHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQuIEFuIG91dHB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MEMwMzVCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzNTAwREQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRjgwMUNEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkZhdWx0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudC4gRmF1bHQgZWxlbWVudHMgc3BlY2lmeSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIGFueSBlcnJvciBtZXNzYWdlcyB0aGF0IG1heSBiZSBvdXRwdXQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUUxQzgyMDAyRjIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjNEMDMxOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSINCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMjAwMjAwMkQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nSW5wdXQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA4QTgyMDJENCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUUxQjAxMTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUI1OUIwMDcyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzQTQwMjAzIg0KLQkJCQlyZXN1bHQgICAgIAkiSUlucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzQjUwM0EyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSUlucHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxRUEwMjBFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPdXRwdXQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gb3V0cHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU0MzAyQUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFMjEwMTExIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNUE0MDI3RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNEOTAwRjEiDQotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0YxMDMyNiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dCINCi0JCQkJCXR5cGUgICAgICAgCSJJT3V0cHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMyMDIwMEJFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdGYXVsdCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEEgZmF1bHQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBmYXVsdCB3aXRoIHRoZSBzYW1lIG5hbWUuICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUUwOTM4NjAyQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTcxMDMzMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0MTMwMzdGIg0KLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0MjEwMTA5Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZmF1bHQiDQotCQkJCQl0eXBlICAgICAgIAkiSUZhdWx0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUJGOUUwMTRBIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlFOYW1lIg0KLQkJCXF1aWQgICAgICAgCSIzQUU4RUQyMjAxNDAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5RTmFtZSBjbGFzcy4gQSBRTmFtZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODQ5REE5MDAzRCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJOYW1lc3BhY2UiDQotCQkJcXVpZCAgICAgICAJIjNBRUEzQ0QzMDAzMCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmFtZXNwYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gYSBXU0RMIGRvY3VtZW50LiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0QyOTAxQjEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVmaXgiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0QzMjAyMzYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uVHlwZSINCi0JCQlxdWlkICAgICAgIAkiM0FFQjQ3ODIwMjRGIg0KLQkJCWRvY3VtZW50YXRpb24gCQ0KLXxPTkVfV0FZPTENCi18UkVRVUVTVF9SRVNQT05TRT0yDQotfFNPTElDSVRfUkVTUE9OU0U9Mw0KLXxOT1RJRklDQVRJT049NA0KLQkJCQ0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk9wZXJhdGlvblR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzM1MzAzRTMiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBvcnRUeXBlIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTVCRTAzMzEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5Qb3J0VHlwZSBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkFDMTAxQ0EiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iDQotCQkJCQl0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QkFGMDFBNCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCRjcwMzFBIg0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE2MzIwMDBEIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklPcGVyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCODRBNzc2MDBEMSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk9wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzQyMDA2NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImZhdWx0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNTkwMjhGIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM3MTAyQjEiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDODEwMUIwIg0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UGFyYW1ldGVyT3JkZXJpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM5OTAzMUQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJPcmRlciINCi0JCQkJCXR5cGUgICAgICAgCSJJTGlzdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0RTUwMThEIg0KLQkJCQlyZXN1bHQgICAgIAkiSUlucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyQzQwMTA3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSUlucHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRTQwMDk0Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJGMDAxRDIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTc5OTAxMkIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUlucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTdFRTAwMTUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbnB1dCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYzMzEwMEVGIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MzQ3MDI3NyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTgwMDAwMzkiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU91dHB1dCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE4MjkwMjdEIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQzQTAzNUQiDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NDUwMUM4Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTgzOTAxRDUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUZhdWx0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTg2MTAzMUQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5GYXVsdCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NkEwMEJEIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDc1MDEzMSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTg3MTAyMDgiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1lc3NhZ2UiDQotCQkJcXVpZCAgICAgICAJIjNCODRBOEFGMDA0RiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk1lc3NhZ2Ugbm9uLU1PRiBpbnRlcmZhY2UiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyMjQwMjczIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFydCINCi0JCQkJCXR5cGUgICAgICAgCSJJUGFydCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NzIzRDAyMzMiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVBhcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NzI1NDAyNUUiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9yZGVyZWRQYXJ0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjYxMDIwRCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnRPcmRlciINCi0JCQkJCXR5cGUgICAgICAgCSJJTGlzdCIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QThCQzAyNjAiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBhcnQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBOTNGMDFCRSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBhcnQgbm9uLU1PRiBpbnRlcmZhY2UiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25BdHRyaWJ1dGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODg0NTAwNTIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJ2YWx1ZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlleGNlcHRpb25zIAkiV1NETEV4Y2VwdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4QTAxMDFDMyINCi0JCQkJcmVzdWx0ICAgICAJIklJdGVyYXRvciINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25BdHRyaWJ1dGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEyRDAyRDUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJRTmFtZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUGFydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOTUwMDIzMSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJU2VydmljZSINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCNDkwMjg3Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuU2VydmljZSBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVENTYwMUQxIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydCINCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVEQTIwMDM2Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVEQjAwMUJDIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5TZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCNUIwMDNFIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklQb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUI4MDAzMjYiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5Qb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTFGMzAyQjUiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyNjMwMkYyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZyINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCOEMwMDE2Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUJDNjAyMTkiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NUYxNjAxNTMiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RjUwMDA2NiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NUZBNDAxQzUiDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MkE5MDI4NCINCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MkJFMDFBOCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIg0KLQkJCQkJdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCQ0YwMzAyIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QURDMDAwNzIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEJDMDA0MSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdGYXVsdCINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ0ZhdWx0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTYwRDkwMDlEIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nRmF1bHQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEZDMDA2MSINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzMkQwMDE3Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTMzRjAzN0IiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iDQotCQkJCQl0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTA5MDBEQSINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MUQwMDdGIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0lucHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nSW5wdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MzQwMzQ5Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPdXRwdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTQ3MDJBNiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdPdXRwdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRENCMDIxQyINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ0lucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QURFQjAxMDAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QURGRTAwMEQiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdPdXRwdXQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRTIxMDExMSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFMkQwMDUwIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nRmF1bHQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRTRGMDBCRCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTVGMDAyQSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01FbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUYzMjAzREIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUY1NjAyOTIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QjEyNDAyQUIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjEzNTAzRDEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSURlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCODRCMUQ5MDE0MiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkRlZmluaXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OEYxMDM5RCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRJbXBvcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODk0OTAyNTkiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbXBvcnREZWYiDQotCQkJCQl0eXBlICAgICAgIAkiSUltcG9ydCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODk2RTAwNUUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkTmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5ODQwMDRCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicHJlZml4Ig0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5QzUwMDQ1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydFR5cGUiDQotCQkJCQl0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkU2VydmljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUU0MDFFRSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInNlcnZpY2UiDQotCQkJCQl0eXBlICAgICAgIAkiSVNlcnZpY2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEExNzAzOEMiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTMyMDI4NiINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTQ2MDEzQiINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE1QzAwQjAiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5RkUwMzdDIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE3NTAyRTciDQotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW1wb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBODMwMTRDIg0KLQkJCQlyZXN1bHQgICAgIAkiSUltcG9ydCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTlEMDMzRSINCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBQUYwMjU0Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBQzIwM0M0Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFFODAwRUQiDQotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFGODAyNkQiDQotCQkJCXJlc3VsdCAgICAgCSJJUGFydCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMDgwMURBIg0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIxNTAzOUIiDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlU2VydmljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjMyMDEzQSINCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEI0MjAwNzUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5ncyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjkyMDM0MSINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QkNEMDA2MCINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QkU3MDE0NCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEMxNzAxMDciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzNFMDAxRCINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDNjIwMTRCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicHJlZml4Ig0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEM3NDAxMTUiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDQkUwMDcxIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0RBMDFDNiINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHJlZml4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDRkQwMDE3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEQyMzAwQTgiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4RDNCMDNDRSINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVCODAxMkIiDQotCQkJCXJlc3VsdCAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVENzAzQkIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJleHRlbnNpb25SZWdpc3RyeSINCi0JCQkJCXR5cGUgICAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudEJhc2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVGRTAyMDgiDQotCQkJCXJlc3VsdCAgICAgCSJTdHJpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnRCYXNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ2MTgwMzI4Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnRCYXNlIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwNTYwMDgwIg0KLQkJCQlyZXN1bHQgICAgIAkiSVR5cGVzIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDA3RTAwNEMiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwQkEwMzU1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlUG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBEODAyOUEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEZBMDMwNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwNkYwMzFCIg0KLQkJCQlyZXN1bHQgICAgIAkiSVR5cGVzIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwOTUwMEVFIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAidHlwZXMiDQotCQkJCQl0eXBlICAgICAgIAkiSVR5cGVzIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkRlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjFFNzAyQTEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUltcG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEIyMDIwMTE5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW1wb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW1wb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIyMEMwMkVBIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklMaXN0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg1QzBBMjAzQzUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTGlzdCBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkxpc3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzBBRjAyOTciDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1hcCINCi0JCQlxdWlkICAgICAgIAkiM0I4OTZCMDMwMEQ0Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLk1hcCBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLk1hcCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QjExMDJCNSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJVVJMIg0KLQkJCXF1aWQgICAgICAgCSIzQjg5RDU2MzAyNzQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLm5ldC5VUkwgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubmV0LlVSTCINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENTZFMDNFMiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJRXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJcXVpZCAgICAgICAJIjNCODlENTkzMDJBNSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1OUYwMkU4Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgdHlwZXMgZWxlbWVudC4gVGhlIHR5cGVzIGVsZW1lbnQgZW5jbG9zZXMgZGF0YSB0eXBlIGRlZmluaXRpb25zIHRoYXQgYXJlIHJlbGV2YW50IGZvciB0aGUgZXhjaGFuZ2VkIG1lc3NhZ2VzLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjhCRUIwMTAzMTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRDNCMDM4MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIg0KLQkJCQlxdWlkdSAgICAgIAkiM0NBRENCQjIwMDUwIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyINCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRjM4MDNFNiINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0Y3RTAzMDEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJSXRlcmF0b3IiDQotCQkJcXVpZCAgICAgICAJIjNDNDY4N0RBMDE2NyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkl0ZXJhdG9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0Njg4MDgwMEI5Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFeGNlcHRpb24iDQotCQkJcXVpZCAgICAgICAJIjNDNDY4OTY1MDMxMyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkV4Y2VwdGlvbiBjbGFzcy4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuV1NETEV4Y2VwdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4OTc0MDMxNSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJVHlwZXMiDQotCQkJcXVpZCAgICAgICAJIjNDQURDQkIyMDA1MCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlR5cGVzIG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5UeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDQURDQkYxMDE3MyINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQ0IyNEFFQzAxQ0IiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQ0MzNjBENzAzOUMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0NDMzYyN0YwMEI3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCINCi0JCQlxdWlkICAgICAgIAkiM0NEMTUwMkMwMjNCIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkRvY3VtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTA2MDAxODIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiTWVzc2FnZVJlZmVyZW5jZSINCi0JCQlxdWlkICAgICAgIAkiM0Y2NzcxREIwMkRDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNzYyQTZBMDMwOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y2NzgwQTAwMUFCIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHJvdGVjdGVkIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNDAxOEMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNzAxQzMiDQotCQkJCWxhYmVsICAgICAgCSJwb3J0VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUNEIg0KLQkJCQlsYWJlbCAgICAgIAkiZU9wZXJhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciDQotCQkJcXVpZCAgICAgICAJIjNBRDVDRUJFMDBFMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUNFQkYwMDU3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNjEiDQotCQkJCWxhYmVsICAgICAgCSJlUGFydHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1MjAxMEYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQzNTQwMTc2Ig0KLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1NDAxODAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEM0UxMDE3OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIyNSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQzRTIwMjM5Ig0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMiDQotCQkJcXVpZCAgICAgICAJIjNBRDVENDI1MDM4QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ0MjYwMkY1Ig0KLQkJCQlsYWJlbCAgICAgIAkiZU9wZXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNCINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVENDI2MDJGRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5NDAwMzkzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOTQxMDMxQyINCi0JCQkJbGFiZWwgICAgICAJImVQb3J0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOTQxMDMxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNyINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5QjgwMTFGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QjkwMjREIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QjkwMjYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwMzAxRTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQjciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlcyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjA0MDBDMSINCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MTAxMDQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNEEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNTQiDQotCQkJCWxhYmVsICAgICAgCSJlUG9ydFR5cGVzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3NzAwOTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3ODAzNzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5ncyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3QiINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5ncyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3QjAzMTEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3RDAwN0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVTZXJ2aWNlcyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjdEMDA4OSINCi0JCQkJbGFiZWwgICAgICAJImVTZXJ2aWNlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxMzAwNzkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RCINCi0JCQkJbGFiZWwgICAgICAJImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FENUZEMTQwMTlFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOSINCi0JCQlxdWlkICAgICAgIAkiM0FERjJFNjQwMUY1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkU2NTAyNTEiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ0lucHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFNjUwMjUyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxIg0KLQkJCXF1aWQgICAgICAgCSIzQURGMkVCMzAxNjMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkVCNDAxM0MiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ091dHB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzIiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkVCNDAxM0QiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzMiDQotCQkJcXVpZCAgICAgICAJIjNBREYyRjk0MDI0RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkY5NTAxOTAiDQotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRjk1MDE5QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM1Ig0KLQkJCXF1aWQgICAgICAgCSIzQURGMkZCODAyRjkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRkI5MDIwQSINCi0JCQkJbGFiZWwgICAgICAJImVPdXRwdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzYiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkZCOTAyMEIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNyINCi0JCQlxdWlkICAgICAgIAkiM0FERjMzMTYwMUE0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODciDQotCQkJCWxhYmVsICAgICAgCSJlRmF1bHRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzOCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYzMzE4MDM4OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM5Ig0KLQkJCXF1aWQgICAgICAgCSIzQURGMzQwMDAzRTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMzQwMTAzQUEiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ0ZhdWx0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQxIg0KLQkJCXF1aWQgICAgICAgCSIzQUUwOTFGNDAyRjMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZFIg0KLQkJCQlsYWJlbCAgICAgIAkiZUZhdWx0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDIiDQotCQkJCXF1aWQgICAgICAgCSIzQUUwOTFGODAxRkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MyINCi0JCQlxdWlkICAgICAgIAkiM0FFQTNENTUwMDJEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNENTYwMzI4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTmFtZXNwYWNlcyINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDU2MDMzMiINCi0JCQkJbGFiZWwgICAgICAJImVOYW1lc3BhY2VzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpOYW1lc3BhY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NSINCi0JCQlxdWlkICAgICAgIAkiM0FFQTNFM0EwMDJEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNFM0MwMUU4Ig0KLQkJCQlsYWJlbCAgICAgIAkiZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNFM0MwMUYyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDciDQotCQkJcXVpZCAgICAgICAJIjNBRUE0MTJGMDAzNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFyYW1ldGVyT3JkZXJpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNTUiDQotCQkJCWxhYmVsICAgICAgCSJlUGFyYW1ldGVyT3JkZXJpbmciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDgiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0OSINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFEMjQwMEJEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4MyINCi0JCQkJbGFiZWwgICAgICAJImVJbnB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEMjUwMDg0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTEiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRDc5MDBGMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEN0EwMTREIg0KLQkJCQlsYWJlbCAgICAgIAkiZU91dHB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MiINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MyINCi0JCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMEM0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMzI3Ig0KLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMzMxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU1Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhCMUMxMjAzQjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDFDIg0KLQkJCQlsYWJlbCAgICAgIAkiZWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTYiDQotCQkJCXF1aWQgICAgICAgCSIzQjhCMUMxNDAwMjYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTciDQotCQkJcXVpZCAgICAgICAJIjNCOEIxRENDMDJFNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlU2NoZW1hIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjcwIg0KLQkJCQlsYWJlbCAgICAgIAkiZVNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjdBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTkiDQotCQkJcXVpZCAgICAgICAJIjNCOEJFQTI3MDI5RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQTI5MDM1NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZVR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QkVBMjkwMzZBIg0KLQkJCQlsYWJlbCAgICAgIAkiZVR5cGVzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyINCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MSINCi0JCQlxdWlkICAgICAgIAkiM0M0NjgyOTMwM0U1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0NjgyOTYwMTBFIg0KLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYyIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0NjgyOTYwMTE4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYzIg0KLQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUltcG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUQiDQotCQkJCWxhYmVsICAgICAgCSJlSW1wb3J0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY1Ig0KLQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NTAwRjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjYiDQotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0QiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYwRDcwMzlDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY2hlbWEiDQotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0UiDQotCQkJCWxhYmVsICAgICAgCSJzY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY3Ig0KLQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NDAxQjEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NjAwMEYiDQotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjgiDQotCQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NjAwMjMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjkiDQotCQkJcXVpZCAgICAgICAJIjNGNzg5NkEyMDI2RSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkIiDQotCQkJCWxhYmVsICAgICAgCSJwYXJlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY2hpbGRyZW4iDQotCQkJCXF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkMiDQotCQkJCWxhYmVsICAgICAgCSJjaGlsZHJlbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkNCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjcgU2VydmljZXMiDQotCQkJcXVpZCAgICAgICAJIjM5QUQzRUY2MDEyNyINCi0JCQl0aXRsZSAgICAgIAkiMi43IFNlcnZpY2VzIg0KLQkJCXpvb20gICAgICAgCTkwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDQxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDgwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2NjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmciKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDYxMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDcxNSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTUNCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3MSkNCi0JCQkJd2lkdGggICAgICAJNTIwDQotCQkJCWhlaWdodCAgICAgCTQwNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiIEA0Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDUyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDQ4MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUG9ydCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA0MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDUzNikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NSkNCi0JCQkJd2lkdGggICAgICAJMjc4DQotCQkJCWhlaWdodCAgICAgCTIxOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiIEA0Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgOTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVNlcnZpY2UiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgNDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDE0NSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTIzNykNCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTI2NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDQ0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCA1MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDM4OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NCwgNDQ0KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQ0KLQkJCQl3aWR0aCAgICAgIAk0MTANCi0JCQkJaGVpZ2h0ICAgICAJMzAyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0RTAxQjQiDQotCQkJCWNsaWVudCAgICAgCUA0NA0KLQkJCQlzdXBwbGllciAgIAlANDMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MCwgMzc3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQwLCAyOTIpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEA0Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0NDAsIDEyNjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0NCwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQ0LCAxMTgwKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQ0KLQkJCQl3aWR0aCAgICAgIAk0MTANCi0JCQkJaGVpZ2h0ICAgICAJMzAyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiDQotCQkJCWNsaWVudCAgICAgCUA0Ng0KLQkJCQlzdXBwbGllciAgIAlANDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzAsIDExMTMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDMwLCAxMDAyKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IiBANDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDkxMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NzUsIDg0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyODINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NzUsIDg5NSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTMwMykNCi0JCQkJd2lkdGggICAgICAJMzAwDQotCQkJCWhlaWdodCAgICAgCTE2OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDUwMkM5Ig0KLQkJCQljbGllbnQgICAgIAlANDgNCi0JCQkJc3VwcGxpZXIgICAJQDQyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MDksIDgyOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgwOSwgNjM3KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1IiBANTANCi0JCQkJbG9jYXRpb24gICAJKDM0MywgOTE2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTQwMDM5MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydHMiIEA1MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjEsIDY0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MTMsIDk0NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTg5NzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxQyINCi0JCQkJCWNsaWVudCAgICAgCUA1MA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM0MywgOTE2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2NiwgOTE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzOSwgODgwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwODAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ4LCA5OTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMjg0NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2IiBANTUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIxLCA2NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2LCA3NDQpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxRCINCi0JCQkJCWNsaWVudCAgICAgCUA1MA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMzQzLCA5MTYpDQotCQkJCQkgICAgKDI1NywgOTE2KQ0KLQkJCQkJICAgICgyNTcsIDY3OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM0MywgOTE2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NywgNjc5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMSwgNzk2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3MDk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3IiBANTgNCi0JCQkJbG9jYXRpb24gICAJKDg4NiwgMTI3MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDlCODAxMUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmciIEA1OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1OA0KLQkJCQkJbG9jYXRpb24gICAJKDM4LCA0MjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExMiwgMTIzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0ODU3MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjREIg0KLQkJCQkJY2xpZW50ICAgICAJQDU4DQotCQkJCQlzdXBwbGllciAgIAlANDYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzUsIDEyNzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MCwgMTMxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNDI4Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgiIEA2Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1OA0KLQkJCQkJbG9jYXRpb24gICAJKDM4LCA0MjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODUyLCAxMTA2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4Nzk0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjYxIg0KLQkJCQkJY2xpZW50ICAgICAJQDU4DQotCQkJCQlzdXBwbGllciAgIAlANDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg4ODYsIDEyNzApDQotCQkJCQkgICAgKDgxMiwgMTI3MCkNCi0JCQkJCSAgICAoODEyLCA5OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEyLCA5OTYpKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi41IEJpbmRpbmdzIg0KLQkJCXF1aWQgICAgICAgCSIzOUFENTEyNzAyNTIiDQotCQkJdGl0bGUgICAgICAJIjIuNSBCaW5kaW5ncyINCi0JCQl6b29tICAgICAgIAk4NQ0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEA2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxMTQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmciKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCA2NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNzIpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk1DQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzEpDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkzNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIiBANjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDM1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3ODAsIDEzMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCA4MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgMTg4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJOQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzk2KQ0KLQkJCQl3aWR0aCAgICAgIAk0MTANCi0JCQkJaGVpZ2h0ICAgICAJNTY4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0IiBANjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAxMzM0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nSW5wdXQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAxMjg0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiDQotCQkJCXdpZHRoICAgICAgCTI3OA0KLQkJCQloZWlnaHQgICAgIAkxNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IiBANjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxLCAxNjM4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nT3V0cHV0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTU4OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFMjEwMTExIg0KLQkJCQl3aWR0aCAgICAgIAkzMTINCi0JCQkJaGVpZ2h0ICAgICAJMTc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0IiBANjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE5ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIsIDE5NTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdGYXVsdCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIsIDE5MDgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCINCi0JCQkJd2lkdGggICAgICAJMjkwDQotCQkJCWhlaWdodCAgICAgCTE3Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEA2OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDYyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCA0ODYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjczDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjgsIDU0NCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTUNCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkNCi0JCQkJd2lkdGggICAgICAJNjkxDQotCQkJCWhlaWdodCAgICAgCTMwMQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEA3MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTI4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDcxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgMTY2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxNTg3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk91dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEA3Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNjg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk3LCA1MzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTcsIDU5NykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTUNCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkNCi0JCQkJd2lkdGggICAgICAJNDMyDQotCQkJCWhlaWdodCAgICAgCTMyMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDczDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5Ig0KLQkJCQljbGllbnQgICAgIAlANzINCi0JCQkJc3VwcGxpZXIgICAJQDY0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzksIDUyNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3OSwgNDI4KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEA3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTAzOSwgNzQyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMzUyMDEwRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGUiIEA3NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NA0KLQkJCQkJbG9jYXRpb24gICAJKDU3NSwgNTk4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDksIDc4MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydFR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODkyOTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEMzU0MDE3NiINCi0JCQkJCWNsaWVudCAgICAgCUA3NA0KLQkJCQkJc3VwcGxpZXIgICAJQDY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzksIDc0MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU5LCA3NDIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MiwgNzE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyMTkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMCIgQDc4DQotCQkJCQlQYXJlbnRfVmlldyAJQDc0DQotCQkJCQlsb2NhdGlvbiAgIAkoNTc1LCA1OTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc2LCA2OTcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA5NDQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxODAiDQotCQkJCQljbGllbnQgICAgIAlANzQNCi0JCQkJCXN1cHBsaWVyICAgCUA3Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTIwLCA3NDIpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBAODANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxMDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzIsIDg1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzIsIDkwOSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTYNCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NikNCi0JCQkJd2lkdGggICAgICAJNDUwDQotCQkJCWhlaWdodCAgICAgCTM3MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBAODENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2MjQsIDE0MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDc2LCAxMjgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDc2LCAxMzQxKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQ0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMjc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ5IiBAODINCi0JCQkJbG9jYXRpb24gICAJKDEyNjQsIDEzNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjQwMEJEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbnB1dCIgQDgzDQotCQkJCQlQYXJlbnRfVmlldyAJQDgyDQotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjM3LCAxMzE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbnB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3NTE0OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjUwMDgzIg0KLQkJCQkJY2xpZW50ICAgICAJQDgyDQotCQkJCQlzdXBwbGllciAgIAlANzANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NCwgMTM1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxMzU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTQsIDEzOTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODk1NDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUwIiBAODYNCi0JCQkJCVBhcmVudF9WaWV3IAlAODINCi0JCQkJCWxvY2F0aW9uICAgCSg5NiwgMjg3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDI1MDA4NCINCi0JCQkJCWNsaWVudCAgICAgCUA4Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDgxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzgxLCAxMzU5KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEA4Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk2MCwgMTY2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTIsIDE1MzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODEyLCAxNTk3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQ0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMjc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUxIiBAODgNCi0JCQkJbG9jYXRpb24gICAJKDE0MzIsIDE2NTQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFENzkwMEYyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEA4OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ1LCAxNjEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NzQ3NzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RCINCi0JCQkJCWNsaWVudCAgICAgCUA4OA0KLQkJCQkJc3VwcGxpZXIgICAJQDcxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTY1NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjgxLCAxNjk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkwMjc0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MiIgQDkyDQotCQkJCQlQYXJlbnRfVmlldyAJQDg4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RSINCi0JCQkJCWNsaWVudCAgICAgCUA4OA0KLQkJCQkJc3VwcGxpZXIgICAJQDg3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTY1NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBAOTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDEwMDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE5LCA5MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE5LCA5ODkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDMpDQotCQkJCXdpZHRoICAgICAgCTM2NA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBREU0MDFEQyINCi0JCQkJY2xpZW50ICAgICAJQDkzDQotCQkJCXN1cHBsaWVyICAgCUA2NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTY2LCA5MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjYsIDYzNikpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMSIgQDk1DQotCQkJCWxvY2F0aW9uICAgCSg0NTcsIDEwMjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTEwMTc5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyIiBAOTYNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMxOSwgNDk0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNSwgOTIwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMjUiDQotCQkJCQljbGllbnQgICAgIAlAOTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ1NywgMTAyMikNCi0JCQkJCSAgICAoMjc2LCAxMDIyKQ0KLQkJCQkJICAgICgyNzYsIDg0OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzYsIDg0OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMzAsIDg4NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdPcGVyYXRpb25zIiBAOTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMxOSwgNDk0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzEsIDk3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ09wZXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTE2OTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEM0UyMDIzOSINCi0JCQkJCWNsaWVudCAgICAgCUA5NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDkzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTAsIDEwMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc2OSwgOTgwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg0OTU2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzE0LCAxMDY3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzI3NTY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzIiBAMTAzDQotCQkJCWxvY2F0aW9uICAgCSgxNDE4LCAxMDQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVENDI1MDM4QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3BlcmF0aW9uIiBAMTA0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMw0KLQkJCQkJbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDEwNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU9wZXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDYwMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMw0KLQkJCQkJc3VwcGxpZXIgICAJQDgwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2MywgMTA0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODksIDEwMDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTY3MjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0IiBAMTA3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMw0KLQkJCQkJbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzMsIDEwNzApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk1NDIwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDQyNjAyRkYiDQotCQkJCQljbGllbnQgICAgIAlAMTAzDQotCQkJCQlzdXBwbGllciAgIAlAOTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTc0LCAxMDQwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkiIEAxMDkNCi0JCQkJbG9jYXRpb24gICAJKDc4NywgMTE5MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NDAxRjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdJbnB1dCIgQDExMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzgxLCA0NTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjksIDExNTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdJbnB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxMTkwNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUxIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDgxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzg3LCAxMTkwKQ0KLQkJCQkJICAgICg2MzYsIDExOTApDQotCQkJCQkgICAgKDYzNiwgMTI3MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzYsIDEyNzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2ODUsIDEyMjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDA0NzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwIiBAMTEzDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwOQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zODEsIDQ1NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4NSwgMTE0NCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUyIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDkzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzg3LCAxMTkwKQ0KLQkJCQkJICAgICg5MjYsIDExOTApDQotCQkJCQkgICAgKDkyNiwgMTA5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjYsIDEwOTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzEsIDExMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3NTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEiIEAxMTYNCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEzMTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjMwMTYzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3V0cHV0IiBAMTE3DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNg0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTIsIDE0MjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzA2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdPdXRwdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NDUwODINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRUI0MDEzQyINCi0JCQkJCWNsaWVudCAgICAgCUAxMTYNCi0JCQkJCXN1cHBsaWVyICAgCUA4Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjQsIDE1MjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NjcsIDE0NzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzQ1OTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMyIiBAMTIwDQotCQkJCQlQYXJlbnRfVmlldyAJQDExNg0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4MywgMTE0MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNEIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNg0KLQkJCQkJc3VwcGxpZXIgICAJQDkzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDEzMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTA5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzEsIDExODYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTAxNjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEAxMjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIwLCAxOTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzcyLCAxOTA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkZhdWx0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTE3OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMTI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgMTk4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxMiwgMTg1OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjEyLCAxOTE3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQ0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMjc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNzEwMzMzIg0KLQkJCQljbGllbnQgICAgIAlAMTI0DQotCQkJCXN1cHBsaWVyICAgCUA2OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwMywgMjAwNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1MywgMjAwNykpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzOSIgQDEyNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1NiwgMTM1MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMzQwMDAzRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdGYXVsdHMiIEAxMjcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI2DQotCQkJCQlsb2NhdGlvbiAgIAkoMTg4LCA2MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzgyLCAxNzUwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMwMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nRmF1bHRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAzMTUwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzQwMTAzQUEiDQotCQkJCQljbGllbnQgICAgIAlAMTI2DQotCQkJCQlzdXBwbGllciAgIAlAMTI0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1NiwgMTg0NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDksIDE3OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkxOTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NiwgMTgwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxOTI5MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQwIiBAMTMxDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNg0KLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgMTE5NykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyNg0KLQkJCQkJc3VwcGxpZXIgICAJQDkzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM1NiwgMTM1MikNCi0JCQkJCSAgICAoMTM1NiwgMTIxNykNCi0JCQkJCSAgICAoMTExNywgMTIxNykNCi0JCQkJCSAgICAoMTExNywgMTA5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTA5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTIsIDExNjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODcwMDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDEiIEAxMzQNCi0JCQkJbG9jYXRpb24gICAJKDE2NDAsIDE5NzApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjQwMkYzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVGYXVsdCIgQDEzNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjc0LCAxOTE1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VGYXVsdCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjQyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjgwMUZFIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjMsIDE5NzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzE4LCAyMDEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQyMjc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MiIgQDEzOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjgwMUZGIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MTcsIDE5NzApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEzOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTQzMDJBQiINCi0JCQkJY2xpZW50ICAgICAJQDg3DQotCQkJCXN1cHBsaWVyICAgCUA2Nw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODAzLCAxNjU2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY0LCAxNjU2KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFMUIwMTEzIg0KLQkJCQljbGllbnQgICAgIAlAODENCi0JCQkJc3VwcGxpZXIgICAJQDY2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NjcsIDEzODUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMzEsIDEzODUpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNCBQb3J0VHlwZXMiDQotCQkJcXVpZCAgICAgICAJIjNBRDVEMUM0MDM2NiINCi0JCQl0aXRsZSAgICAgIAkiMi40IFBvcnRUeXBlcyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIg0KLQkJCXpvb20gICAgICAgCTgwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydFR5cGUiIEAxNDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDIwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2LCAxNzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzAwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnRUeXBlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2LCAxMjIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBNUJFMDMzMSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2LCAyMzMpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2OTYpDQotCQkJCXdpZHRoICAgICAgCTcxOA0KLQkJCQloZWlnaHQgICAgIAkxOTYNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3BlcmF0aW9uIiBAMTQyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxNzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODczDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSU9wZXJhdGlvbiIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDEyNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODczDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAyMzcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDkpDQotCQkJCXdpZHRoICAgICAgCTg5MQ0KLQkJCQloZWlnaHQgICAgIAkxODgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCIgQDE0Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTQ3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDE0MzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUlucHV0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDEzODcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBN0VFMDAxNSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDE0OTgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjEpDQotCQkJCXdpZHRoICAgICAgCTY0NA0KLQkJCQloZWlnaHQgICAgIAkxOTQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPdXRwdXQiIEAxNDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDE3OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU2LCAxNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklPdXRwdXQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTcwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTgxOCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NikNCi0JCQkJd2lkdGggICAgICAJNjc0DQotCQkJCWhlaWdodCAgICAgCTE5NA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0IiBAMTQ1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjA3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRmF1bHQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjAyNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4NjEwMzFEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjEzNykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNSkNCi0JCQkJd2lkdGggICAgICAJNjQ0DQotCQkJCWhlaWdodCAgICAgCTE5Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAxNDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDgwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4LCA2NzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTgsIDczMykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkNCi0JCQkJd2lkdGggICAgICAJNjk1DQotCQkJCWhlaWdodCAgICAgCTI4MQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAxNDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTc2LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMjUsIDY5MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjMyNSwgNzUzKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDg0KQ0KLQkJCQl3aWR0aCAgICAgIAk1MjANCi0JCQkJaGVpZ2h0ICAgICAJMjQwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIgQDE0OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3MjgsIDIxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDcsIDIwNjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRmF1bHQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4Ig0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBAMTQ5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA1NiwgMTQ3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODcwLCAxNDIyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklucHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTEyNQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDE1MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDE3OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzIsIDE3NDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiT3V0cHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCQkJd2lkdGggICAgICAJMjc0DQotCQkJCWhlaWdodCAgICAgCTEyNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBAMTUxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgNzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjE0LCA2MjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiT3BlcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxNCwgNjgxKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ2KQ0KLQkJCQl3aWR0aCAgICAgIAk2OTUNCi0JCQkJaGVpZ2h0ICAgICAJMzUyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBAMTUyDQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCA3OTcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjQwMThDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb25zIiBAMTUzDQotCQkJCQlQYXJlbnRfVmlldyAJQDE1Mg0KLQkJCQkJbG9jYXRpb24gICAJKDU5MiwgMjY5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgNzQ4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0OQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPcGVyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzU5NjQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQ0QiDQotCQkJCQljbGllbnQgICAgIAlAMTUyDQotCQkJCQlzdXBwbGllciAgIAlAMTUxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjA1LCA3OTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTc2LCA4NjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDAzOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NCwgOTIzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2MjQzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicG9ydFR5cGUiIEAxNTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUyDQotCQkJCQlsb2NhdGlvbiAgIAkoNTkyLCAyNjkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjcwMUMzIg0KLQkJCQkJY2xpZW50ICAgICAJQDE1Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDE0Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA3OTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODgsIDc1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1MzQ4OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NyIgQDE1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjEwNywgNzczKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUE0MTJGMDAzNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFyYW1ldGVyT3JkZXJpbmciIEAxNjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTU5DQotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NSwgNjQ3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJhbWV0ZXJPcmRlcmluZyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4MzMzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEyNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1NSINCi0JCQkJCWNsaWVudCAgICAgCUAxNTkNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEwNywgNzczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTYsIDc3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTYwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNzIsIDgyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5NjYxMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcxLCA4ODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMDYyMjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0OCIgQDE2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTkNCi0JCQkJCWxvY2F0aW9uICAgCSgxODE5LCAxMDEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMzEwMjVGIg0KLQkJCQkJY2xpZW50ICAgICAJQDE1OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE1MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5OSwgNzczKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzciIEAxNjUNCi0JCQkJbG9jYXRpb24gICAJKDE3MDIsIDE1MDQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTYwMUE0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVGYXVsdHMiIEAxNjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTY1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTQxNCwgODMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTY3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNSwgMTk4MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc4OTkyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTgwMzg3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE0OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDIwNDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ0LCAyMDIwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQ5NTgwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTY2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTMsIDE5NjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDUzNzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzOCIgQDE3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNjUNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjYxLCAxMDY5KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxODAzODgiDQotCQkJCQljbGllbnQgICAgIAlAMTY1DQotCQkJCQlzdXBwbGllciAgIAlAMTUxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDIsIDE1MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgOTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgMTAzOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzM2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzMiIEAxNzMNCi0JCQkJbG9jYXRpb24gICAJKDExNzgsIDEyMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTQwMjREIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbnB1dCIgQDE3NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzMNCi0JCQkJCWxvY2F0aW9uICAgCSg4OTAsIDU2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgMTM0MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW5wdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTk4MjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOTAiDQotCQkJCQljbGllbnQgICAgIAlAMTczDQotCQkJCQlzdXBwbGllciAgIAlAMTQ5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3OCwgMTIzNCkNCi0JCQkJCSAgICAoOTgwLCAxMjM0KQ0KLQkJCQkJICAgICg5ODAsIDE0MTApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc4LCAxMjM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMTQxMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDYsIDEzNjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Nzc2NjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM0IiBAMTc3DQotCQkJCQlQYXJlbnRfVmlldyAJQDE3Mw0KLQkJCQkJbG9jYXRpb24gICAJKDg5MCwgNTYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNiwgMTAzNikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTUwMTlBIg0KLQkJCQkJY2xpZW50ICAgICAJQDE3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDE1MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzgsIDEyMzQpDQotCQkJCQkgICAgKDEyNzcsIDEyMzQpDQotCQkJCQkgICAgKDEyNzcsIDk2MCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3NywgOTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NywgMTA1OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjQxMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNSIgQDE4MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OCwgMTM0NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCODAyRjkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDE4MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxODANCi0JCQkJCWxvY2F0aW9uICAgCSgxMTgwLCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYyLCAxNjY5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDA5MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCOTAyMEEiDQotCQkJCQljbGllbnQgICAgIAlAMTgwDQotCQkJCQlzdXBwbGllciAgIAlAMTUwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMTczMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NDYsIDE2NzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM2MzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM2IiBAMTg0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE4MA0KLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjcsIDEwMzcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQiINCi0JCQkJCWNsaWVudCAgICAgCUAxODANCi0JCQkJCXN1cHBsaWVyICAgCUAxNTENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OCwgMTM0NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCA5NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIzLCAxMDgwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjkwMzQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTg3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRDgwMTlGIg0KLQkJCQljbGllbnQgICAgIAlAMTQ2DQotCQkJCXN1cHBsaWVyICAgCUAxNDENCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTg4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRTIwMTcxIg0KLQkJCQljbGllbnQgICAgIAlAMTUxDQotCQkJCXN1cHBsaWVyICAgCUAxNDINCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTg5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRUUwMzFEIg0KLQkJCQljbGllbnQgICAgIAlAMTQ5DQotCQkJCXN1cHBsaWVyICAgCUAxNDMNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTkwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRjgwMUNEIg0KLQkJCQljbGllbnQgICAgIAlAMTUwDQotCQkJCXN1cHBsaWVyICAgCUAxNDQNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTkxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjIwMDIwMDJEIg0KLQkJCQljbGllbnQgICAgIAlAMTQ4DQotCQkJCXN1cHBsaWVyICAgCUAxNDUNCi0JCQkJbGluZV9zdHlsZSAJMCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTkyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjIyNCwgMTQ1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzNywgMTMxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzNywgMTM3MykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkNCi0JCQkJd2lkdGggICAgICAJNTkzDQotCQkJCWhlaWdodCAgICAgCTMxMg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiIEAxOTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTIwLCAyNTQ0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDI0NjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZVJlZmVyZW5jZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDI1MjcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDMpDQotCQkJCXdpZHRoICAgICAgCTY3Mg0KLQkJCQloZWlnaHQgICAgIAkxODANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyNCwgMjI3NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTkzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE1MjQsIDIyNzUpDQotCQkJCSAgICAoMTUyNCwgMjQ1NCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIzRDAzMTkiDQotCQkJCWNsaWVudCAgICAgCUAxNDgNCi0JCQkJc3VwcGxpZXIgICAJQDE5Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3NiwgMjE3NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzYsIDIyNzUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE5NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTk2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyMzUwMEREIg0KLQkJCQljbGllbnQgICAgIAlAMTUwDQotCQkJCXN1cHBsaWVyICAgCUAxOTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNzEsIDE4NTQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzcxLCAyMjc1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxOTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE5Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjI4MDJFNyINCi0JCQkJY2xpZW50ICAgICAJQDE0OQ0KLQkJCQlzdXBwbGllciAgIAlAMTkzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODAsIDE1MzQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODAsIDIyNzUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE5NCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY3IiBAMTk4DQotCQkJCWxvY2F0aW9uICAgCSgyMjA2LCAyMjU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNzRFNzg0MDFCMSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDE5OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxOTgNCi0JCQkJCWxvY2F0aW9uICAgCSg3MzQsIC0yODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY4LCAxNjcwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEyMjMwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDBGIg0KLQkJCQkJY2xpZW50ICAgICAJQDE5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDE5Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAyMjU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMDYsIDE2MTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYwLCAxNjc4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2OCIgQDIwMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxOTgNCi0JCQkJCWxvY2F0aW9uICAgCSg3MzQsIC0yODUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDIzIg0KLQkJCQkJY2xpZW50ICAgICAJQDE5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDE5Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIyMDYsIDIyNTkpDQotCQkJCQkgICAgKDIyMDYsIDI1NTYpDQotCQkJCQkgICAgKDE4NTYsIDI1NTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAyMjU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NTYsIDI1NTYpKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xIERlZmluaXRpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTQ4QTAyNjIiDQotCQkJdGl0bGUgICAgICAJIjIuMSBEZWZpbml0aW9ucyINCi0JCQl6b29tICAgICAgIAk4Mw0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iIEAyMDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDE5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDE2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2ODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRGVmaW5pdGlvbiIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAxMTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDIyMCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcwMCkNCi0JCQkJd2lkdGggICAgICAJNzA2DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAyMDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODYsIDg5NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJCXdpZHRoICAgICAgCTI5NA0KLQkJCQloZWlnaHQgICAgIAkxMjANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDIwNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDYyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxMCwgNTQ1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkltcG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTAsIDYwNCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3OCkNCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTE4Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDIwNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTEyLCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTAwLCAxMDU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTAwLCAxMTE1KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQ0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjgwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDIwNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODA4LCAxNDg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk2LCAxMzYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5NiwgMTQxOSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkNCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDIwOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTI0LCAxNjAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTI0LCAxNjU5KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQ0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjgwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjA5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCAzOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgOTgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk3DQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjEpDQotCQkJCXdpZHRoICAgICAgCTUyOA0KLQkJCQloZWlnaHQgICAgIAk0MjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTkiIEAyMTANCi0JCQkJbG9jYXRpb24gICAJKDEzNTgsIDg2MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyNzAyOUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjAiIEAyMTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMjEwDQotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTcsIDUzNSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzU2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDIxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDIwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU4LCA4NjApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1OCwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwMywgNTExKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU2NjQ5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAyMTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjEwDQotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODYsIDkwOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzkwOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCQkJCWNsaWVudCAgICAgCUAyMTANCi0JCQkJCXN1cHBsaWVyICAgCUAyMDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzU4LCA4NjApDQotCQkJCQkgICAgKDEzNTgsIDk0OCkNCi0JCQkJCSAgICAoMTY3NywgOTQ4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzcsIDk0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDk4NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MjY1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MyIgQDIxNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTYxMiwgNTk1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NCIgQDIxOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTcNCi0JCQkJCWxvY2F0aW9uICAgCSgxMiwgMjI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTEyKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiDQotCQkJCQljbGllbnQgICAgIAlAMjE3DQotCQkJCQlzdXBwbGllciAgIAlAMjA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYxMiwgNTk1KQ0KLQkJCQkJICAgICgxNDY0LCA1OTUpDQotCQkJCQkgICAgKDE0NjQsIDQ1MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY0LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTI0LCA0OTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTg2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMjIxDQotCQkJCQlQYXJlbnRfVmlldyAJQDIxNw0KLQkJCQkJbG9jYXRpb24gICAJKDEyLCAyMjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjkyLCA1NTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUltcG9ydHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODAzMzUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRCINCi0JCQkJCWNsaWVudCAgICAgCUAyMTcNCi0JCQkJCXN1cHBsaWVyICAgCUAyMDUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDEsIDU5NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjIxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTQsIDY1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MTAwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjc2LCA2NDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMjU5NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkiIEAyMjUNCi0JCQkJbG9jYXRpb24gICAJKDEyNzksIDExMzcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDMwMUUyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwIiBAMjI2DQotCQkJCQlQYXJlbnRfVmlldyAJQDIyNQ0KLQkJCQkJbG9jYXRpb24gICAJKDI3MSwgMjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzOCwgNTkxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwNDAwQjciDQotCQkJCQljbGllbnQgICAgIAlAMjI1DQotCQkJCQlzdXBwbGllciAgIAlAMjA5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3OSwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyMCwgNTg2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODA0OTc0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZXMiIEAyMjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjI1DQotCQkJCQlsb2NhdGlvbiAgIAkoMjcxLCAyNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAxMTcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzEzNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDQwMEMxIg0KLQkJCQkJY2xpZW50ICAgICAJQDIyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDIwNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNzksIDExMzcpDQotCQkJCQkgICAgKDEyNzksIDEyMDgpDQotCQkJCQkgICAgKDE4OTEsIDEyMDgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTEsIDEyMDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMTcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MzQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3OTcsIDEyNDQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjQ0MDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEiIEAyMzMNCi0JCQkJbG9jYXRpb24gICAJKDEyMTIsIDExNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzEwMTA0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMjM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDIzMw0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjQsIDIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjM0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDU5NCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzIwMzRBIg0KLQkJCQkJY2xpZW50ICAgICAJQDIzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDIwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEyLCAxMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTIsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjM0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYyNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1Nzk2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlcyIgQDIzNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI0LCAyMTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkxLCAxNDUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQb3J0VHlwZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MjM2OTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjcyMDM1NCINCi0JCQkJCWNsaWVudCAgICAgCUAyMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAyMDcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjEyLCAxMTU5KQ0KLQkJCQkJICAgICgxMjEyLCAxNDkwKQ0KLQkJCQkJICAgICgxNTg3LCAxNDkwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTg3LCAxNDkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMywgMTQ1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNTYxMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTEyLCAxNTQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk1ODU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzIiBAMjQxDQotCQkJCWxvY2F0aW9uICAgCSgxMTE0LCAxNTg1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjc3MDA5NSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNCIgQDI0Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNDENCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCA2ODApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjc4MDM3MSINCi0JCQkJCWNsaWVudCAgICAgCUAyNDENCi0JCQkJCXN1cHBsaWVyICAgCUAyMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE0LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTU1LCA3NTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY3MDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5ncyIgQDI0NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNDENCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUxLCAxNjc0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5ncyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2NjM0Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzdCIg0KLQkJCQkJY2xpZW50ICAgICAJQDI0MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDIwOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExMTQsIDE1ODUpDQotCQkJCQkgICAgKDExMTQsIDE3MTYpDQotCQkJCQkgICAgKDIxMTUsIDE3MTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDE3MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDUzLCAxNjc3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQ1MDc0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMTQsIDE3NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTEwNzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyNDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg0MCwgMjA0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyOCwgMTkyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyOCwgMTk3OSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkNCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNSIgQDI1MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA2NiwgMTUzMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3QjAzMTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYiIEAyNTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMjUwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjUxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDY2OSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0QwMDdGIg0KLQkJCQkJY2xpZW50ICAgICAJQDI1MA0KLQkJCQkJc3VwcGxpZXIgICAJQDIwOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjUxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMDksIDc1NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxOTY5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVNlcnZpY2VzIiBAMjU0DQotCQkJCQlQYXJlbnRfVmlldyAJQDI1MA0KLQkJCQkJbG9jYXRpb24gICAJKC01MjEsIC0xMTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkzLCAyMDI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTZXJ2aWNlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5MTgyNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0QwMDg5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDI1MA0KLQkJCQkJc3VwcGxpZXIgICAJQDI0OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwNjYsIDE1MzMpDQotCQkJCQkgICAgKDEwNjYsIDIwNTkpDQotCQkJCQkgICAgKDE2MTksIDIwNTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTksIDIwNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU0LCAyMDMxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQwMTk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjU0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzIsIDIxMTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjA1MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFGODAzODIiDQotCQkJCWNsaWVudCAgICAgCUAyMDkNCi0JCQkJc3VwcGxpZXIgICAJQDIwMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NCwgMjYzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg1LCAyNjMpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4zIEV4dGVuc2liaWxpdHkiDQotCQkJcXVpZCAgICAgICAJIjNBRDYwQzUxMDE5MiINCi0JCQl0aXRsZSAgICAgIAkiMi4xLjMgRXh0ZW5zaWJpbGl0eSINCi0JCQl6b29tICAgICAgIAk4MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDI1OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAxNTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTQsIDE1MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCXdpZHRoICAgICAgCTE4Mg0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEAyNjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDE4ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0ODcsIDE4MzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDI2MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgMTcyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM0MiwgMTY3NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJd2lkdGggICAgICAJMTgyDQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMjYyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCAyMzM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAyMjgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdGYXVsdCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiDQotCQkJCXdpZHRoICAgICAgCTI3NA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iIEAyNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDczNiwgMTc2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYzLCAxNzA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQl3aWR0aCAgICAgIAkzNjQNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCAxMzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NSwgODYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiINCi0JCQkJd2lkdGggICAgICAJODA0DQotCQkJCWhlaWdodCAgICAgCTE3Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBAMjY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDE5NTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMTg5OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzQNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBAMjY2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAyMTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NjMsIDIwOTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJCXdpZHRoICAgICAgCTMwOA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAyNjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMTI5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEyMzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTIyMg0KLQkJCQloZWlnaHQgICAgIAkxNDYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMjY4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM1LCAxMzU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDI2OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ4MCwgNjg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwOSwgNTgwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5LCA2NDEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzEpDQotCQkJCXdpZHRoICAgICAgCTU2MA0KLQkJCQloZWlnaHQgICAgIAkyNDANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjcwDQotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDEwMzkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDI2OQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0ODAsIDEwMzkpDQotCQkJCSAgICAoNDgwLCA4MDgpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjcxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwQ0IwMEFBIg0KLQkJCQljbGllbnQgICAgIAlAMjYwDQotCQkJCXN1cHBsaWVyICAgCUAyNjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjYsIDE4MjQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY2LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODVCNUE0MDI3RSINCi0JCQkJY2xpZW50ICAgICAJQDI2Ng0KLQkJCQlzdXBwbGllciAgIAlAMjY5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDk3LCAyMDc5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NywgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOTM4NjAyQzkiDQotCQkJCWNsaWVudCAgICAgCUAyNjINCi0JCQkJc3VwcGxpZXIgICAJQDI2OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxOSwgMjI3MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTksIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDI3MCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjc0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1OUIwMDcyIg0KLQkJCQljbGllbnQgICAgIAlAMjY1DQotCQkJCXN1cHBsaWVyICAgCUAyNjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4OCwgMTg4NykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4OCwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MDA5MjAyRjciDQotCQkJCWNsaWVudCAgICAgCUAyNjMNCi0JCQkJc3VwcGxpZXIgICAJQDI2OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzk3LCAxNjk1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzk3LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQTBGMDJGMCINCi0JCQkJY2xpZW50ICAgICAJQDI1OQ0KLQkJCQlzdXBwbGllciAgIAlAMjY5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDEsIDE1MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDEsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDI3MCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjc3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEQjgwM0Q0Ig0KLQkJCQljbGllbnQgICAgIAlAMjY3DQotCQkJCXN1cHBsaWVyICAgCUAyNjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMSwgMTIyMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMSwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiDQotCQkJCWNsaWVudCAgICAgCUAyNjgNCi0JCQkJc3VwcGxpZXIgICAJQDI2OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDE0LCAxMzQ0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE0LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQTIwMDI1RSINCi0JCQkJY2xpZW50ICAgICAJQDI2MQ0KLQkJCQlzdXBwbGllciAgIAlAMjY5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNjYzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQyOSwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjgwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNjg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjMyLCA1ODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjMyLCA2NDQpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjUpDQotCQkJCXdpZHRoICAgICAgCTU2Mw0KLQkJCQloZWlnaHQgICAgIAkyMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjciIEAyODENCi0JCQkJbG9jYXRpb24gICAJKDExOTEsIDY3MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgiIEAyODINCi0JCQkJCVBhcmVudF9WaWV3IAlAMjgxDQotCQkJCQlsb2NhdGlvbiAgIAkoMjMsIDU2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjgyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg0NywgNjMxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiDQotCQkJCQljbGllbnQgICAgIAlAMjgxDQotCQkJCQlzdXBwbGllciAgIAlAMjY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NjAsIDY3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjgyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzMCwgNjI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM5Njk1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBAMjg1DQotCQkJCQlQYXJlbnRfVmlldyAJQDI4MQ0KLQkJCQkJbG9jYXRpb24gICAJKDIzLCA1NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzU1LCA1MjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3OTA3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCINCi0JCQkJCWNsaWVudCAgICAgCUAyODENCi0JCQkJCXN1cHBsaWVyICAgCUAyODANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjMsIDY3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTYsIDYyNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTQwMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDYzLCA3NjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzI0NzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IiBAMjg5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDE5MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDg0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIldTRExFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjg5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjMwLCAxNDUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTMpDQotCQkJCXdpZHRoICAgICAgCTc3NA0KLQkJCQloZWlnaHQgICAgIAkyNDANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjkwDQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCA0MDIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDI4OQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMDA4LCA0MDIpDQotCQkJCSAgICAoMTAwOCwgMzEyKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGRTNDMDNENCINCi0JCQkJY2xpZW50ICAgICAJQDI2OQ0KLQkJCQlzdXBwbGllciAgIAlAMjg5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTIsIDU2OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ5MiwgNDAyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyOTApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTQ5MDNEMCINCi0JCQkJY2xpZW50ICAgICAJQDI4MA0KLQkJCQlzdXBwbGllciAgIAlAMjY0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDE1LCA1NzEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDE1LCAyNDYpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyOTMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkRERjUzNTAyQzMiDQotCQkJCWNsaWVudCAgICAgCUAyODANCi0JCQkJc3VwcGxpZXIgICAJQDI4OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc2MiwgNTcxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2MiwgNDAyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyOTApDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjk0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAxNiwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjk0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMSwgMTMwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIg0KLQkJCQl3aWR0aCAgICAgIAk1ODgNCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjk1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBRUMwMUNCIg0KLQkJCQljbGllbnQgICAgIAlAMjk0DQotCQkJCXN1cHBsaWVyICAgCUAyODANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3OTYsIDEyOTUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzk2LCA4MDUpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjkiIEAyOTYNCi0JCQkJbG9jYXRpb24gICAJKDIzMTEsIDE2ODYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTIwMjZFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhcmVudCIgQDI5Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyOTYNCi0JCQkJCWxvY2F0aW9uICAgCSgyNzksIDI5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0MjIsIDEzMzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGFyZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkIiDQotCQkJCQljbGllbnQgICAgIAlAMjk2DQotCQkJCQlzdXBwbGllciAgIAlAMjk0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjMxMSwgMTY4NikNCi0JCQkJCSAgICAoMjQzMiwgMTY4NikNCi0JCQkJCSAgICAoMjQzMiwgMTM3NCkNCi0JCQkJCSAgICAoMjMxMCwgMTM3NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjMxMCwgMTM3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjYsIDE0MjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNoaWxkcmVuIiBAMzAwDQotCQkJCQlQYXJlbnRfVmlldyAJQDI5Ng0KLQkJCQkJbG9jYXRpb24gICAJKDI3OSwgMjk0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg5OSwgMTUzNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjaGlsZHJlbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5ODU2MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNGNzg5NkE3MDEyQyINCi0JCQkJCWNsaWVudCAgICAgCUAyOTYNCi0JCQkJCXN1cHBsaWVyICAgCUAyOTQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzExLCAxNjg2KQ0KLQkJCQkJICAgICgyMDE2LCAxNjg2KQ0KLQkJCQkJICAgICgyMDE2LCAxNDI1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjMxMSwgMTY4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDE2LCAxNDI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3MCwgMTQ4MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIg0KLQkJCXF1aWQgICAgICAgCSIzQUU4RUQ3MjAxQkQiDQotCQkJdGl0bGUgICAgICAJIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyINCi0JCQl6b29tICAgICAgIAk5MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCIgQDMwMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3MTIsIDIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklJbXBvcnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDIyLCAxMjcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMjAyMDExOSINCi0JCQkJd2lkdGggICAgICAJNTk4DQotCQkJCWhlaWdodCAgICAgCTIxOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIiBAMzA0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCAxMTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDIsIDEwNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTmFtZXNwYWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzQ0QzMDAzMCINCi0JCQkJd2lkdGggICAgICAJNDc5DQotCQkJCWhlaWdodCAgICAgCTIxNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAzMDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTIxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzA1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5NCwgMTE0MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAk2OTQNCi0JCQkJaGVpZ2h0ICAgICAJMTczDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMzA2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQsIDIzNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJd2lkdGggICAgICAJNDkwDQotCQkJCWhlaWdodCAgICAgCTMyMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MyIgQDMwNw0KLQkJCQlsb2NhdGlvbiAgIAkoMzA5LCA3ODYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTUwMDJEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVOYW1lc3BhY2VzIiBAMzA4DQotCQkJCQlQYXJlbnRfVmlldyAJQDMwNw0KLQkJCQkJbG9jYXRpb24gICAJKC05MSwgMjU4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYxLCA5NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU5hbWVzcGFjZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTg4NDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NjAzMzIiDQotCQkJCQljbGllbnQgICAgIAlAMzA3DQotCQkJCQlzdXBwbGllciAgIAlAMzA0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMwOSwgNzg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwOSwgMTAyOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0OCwgOTczKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY4NzA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOCwgOTEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTI1MDk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NCIgQDMxMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDcNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTEsIDI1OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzEyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OCwgNTkyKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTYwMzI4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDMwNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMwNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDU0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzEyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzOSwgNTgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ0OTYxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiIEAzMTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDcyLCA3MjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTUsIDU4MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbXBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJCQl3aWR0aCAgICAgIAk0NTINCi0JCQkJaGVpZ2h0ICAgICAJMzA0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMzE2DQotCQkJCWxvY2F0aW9uICAgCSgxNDg2LCAxMDAxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEIxRENDMDJFNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2NoZW1hIiBAMzE3DQotCQkJCQlQYXJlbnRfVmlldyAJQDMxNg0KLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzcsIDEwMTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MjU5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxRENFMDI3MCINCi0JCQkJCWNsaWVudCAgICAgCUAzMTYNCi0JCQkJCXN1cHBsaWVyICAgCUAzMDUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDg2LCAxMDAxKQ0KLQkJCQkJICAgICgxNjMyLCAxMDAxKQ0KLQkJCQkJICAgICgxNjMyLCAxMTMwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgMTAwMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMyLCAxMTMwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2MywgMTAxOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MjU5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTgiIEAzMjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMzE2DQotCQkJCQlsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxRENFMDI3QSINCi0JCQkJCWNsaWVudCAgICAgCUAzMTYNCi0JCQkJCXN1cHBsaWVyICAgCUAzMTUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgMTAwMCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg2LCA4NzIpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NSIgQDMyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4NywgNDAzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzRTNBMDAyRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NiIgQDMyMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMjENCi0JCQkJCWxvY2F0aW9uICAgCSg2ODcsIC0xMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA2LCA0ODApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRjIiDQotCQkJCQljbGllbnQgICAgIAlAMzIxDQotCQkJCQlzdXBwbGllciAgIAlAMzE1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTA4NywgNDAzKQ0KLQkJCQkJICAgICgxMzY0LCA0MDMpDQotCQkJCQkgICAgKDEzNjQsIDU2OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY0LCA1NjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZURlZmluaXRpb24iIEAzMjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzIxDQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA1LCAzNjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42Mzc1MzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRTNDMDFFOCINCi0JCQkJCWNsaWVudCAgICAgCUAzMjENCi0JCQkJCXN1cHBsaWVyICAgCUAzMDYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgNDAzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY0NSwgNDAzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzI3LCA0NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQ5MTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjMiIEAzMjcNCi0JCQkJbG9jYXRpb24gICAJKDczNywgODI2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NCIgQDMyOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMjcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjcxLCAxMDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTIsIDY0NykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSINCi0JCQkJCWNsaWVudCAgICAgCUAzMjcNCi0JCQkJCXN1cHBsaWVyICAgCUAzMDYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3MzcsIDgyNikNCi0JCQkJCSAgICAoNTEwLCA4MjYpDQotCQkJCQkgICAgKDUxMCwgNTQ0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA1NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NTcsIDU5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAzMzENCi0JCQkJCVBhcmVudF9WaWV3IAlAMzI3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0NCwgNzczKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbXBvcnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk5MTg5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiDQotCQkJCQljbGllbnQgICAgIAlAMzI3DQotCQkJCQlzdXBwbGllciAgIAlAMzE1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDYsIDgyNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzMxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExODAsIDg3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjIxMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTYyLCA5MzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzM1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjIwMEQwMzQwIg0KLQkJCQljbGllbnQgICAgIAlAMzE1DQotCQkJCXN1cHBsaWVyICAgCUAzMDMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTUsIDU2OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTUsIDMzMykpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4yIFR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQjg1QUU1OTAzN0UiDQotCQkJdGl0bGUgICAgICAJIjIuMiBUeXBlcyINCi0JCQl6b29tICAgICAgIAk5MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJODENCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAzMzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxMjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg5NSwgMTE1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTUwMA0KLQkJCQloZWlnaHQgICAgIAkxNzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMzM3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMzYsIDE2MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkwNiwgMTUzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzgNCi0JCQkJaGVpZ2h0ICAgICAJMTYyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMzM4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTk2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgMTgyOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgMTg4MykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTUNCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkNCi0JCQkJd2lkdGggICAgICAJNTM1DQotCQkJCWhlaWdodCAgICAgCTMwNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDMzOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4LCAxMDY3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgsIDExMjIpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODQpDQotCQkJCXdpZHRoICAgICAgCTQ2Ng0KLQkJCQloZWlnaHQgICAgIAkyNTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTMiIEAzNDANCi0JCQkJbG9jYXRpb24gICAJKDczNSwgMTE3MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAwQzQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEAzNDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMzQwDQotCQkJCQlsb2NhdGlvbiAgIAkoMTQzLCA2NzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzUsIDExMzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNjkwMDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDMyNyINCi0JCQkJCWNsaWVudCAgICAgCUAzNDANCi0JCQkJCXN1cHBsaWVyICAgCUAzMzYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NiwgMTE3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzOSwgMTIwNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4ODcwNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTQiIEAzNDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzQwDQotCQkJCQlsb2NhdGlvbiAgIAkoMTQzLCA2NzYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzMxIg0KLQkJCQkJY2xpZW50ICAgICAJQDM0MA0KLQkJCQkJc3VwcGxpZXIgICAJQDMzOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzUsIDExNzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg1LCAxMTcyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTUiIEAzNDUNCi0JCQkJbG9jYXRpb24gICAJKDUyNywgMTU5MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxMjAzQjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudERlY2xhcmF0aW9uIiBAMzQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDM0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2NiwgMTU1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzUzOTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQzE0MDAxQyINCi0JCQkJCWNsaWVudCAgICAgCUAzNDUNCi0JCQkJCXN1cHBsaWVyICAgCUAzMzcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTI3LCAxNTkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NywgMTU5MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNywgMTY0NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1NTg3Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTYiIEAzNDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzQ1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTY1LCAxMDk2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQzE0MDAyNiINCi0JCQkJCWNsaWVudCAgICAgCUAzNDUNCi0JCQkJCXN1cHBsaWVyICAgCUAzMzkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg1MjcsIDE1OTIpDQotCQkJCQkgICAgKDQzNywgMTU5MikNCi0JCQkJCSAgICAoNDM3LCAxMzEzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTI3LCAxNTkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgMTMxMykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYxIiBAMzUwDQotCQkJCWxvY2F0aW9uICAgCSgzMjIsIDE5MTEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTMwM0U1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMzUxDQotCQkJCQlQYXJlbnRfVmlldyAJQDM1MA0KLQkJCQkJbG9jYXRpb24gICAJKC0xNCwgMTE5MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzOCwgMTg3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTWVzc2FnZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0ODU2MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTYwMTBFIg0KLQkJCQkJY2xpZW50ICAgICAJQDM1MA0KLQkJCQkJc3VwcGxpZXIgICAJQDMzOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTkxMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk0MywgMTk2NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjIiIEAzNTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzUwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNDY4Mjk2MDExOCINCi0JCQkJCWNsaWVudCAgICAgCUAzNTANCi0JCQkJCXN1cHBsaWVyICAgCUAzMzkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzMjIsIDE5MTEpDQotCQkJCQkgICAgKDIyOSwgMTkxMSkNCi0JCQkJCSAgICAoMjI5LCAxMzEzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOSwgMTMxMykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDM1NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgNjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDUxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNSwgNTY3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzEyKQ0KLQkJCQl3aWR0aCAgICAgIAkzODkNCi0JCQkJaGVpZ2h0ICAgICAJMjE2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMzU2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJd2lkdGggICAgICAJMjIyDQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1OSIgQDM1Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCA2MDQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDM1OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCAzOTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDY0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDcNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NjEwMTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSINCi0JCQkJCWNsaWVudCAgICAgCUAzNTcNCi0JCQkJCXN1cHBsaWVyICAgCUAzNTUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjA2LCA2MDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjYsIDU2OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4Mzg4Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjAiIEAzNjENCi0JCQkJCVBhcmVudF9WaWV3IAlAMzU3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMzLCAzMTMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiINCi0JCQkJCWNsaWVudCAgICAgCUAzNTcNCi0JCQkJCXN1cHBsaWVyICAgCUAzNTYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQsIDYwNCkNCi0JCQkJCSAgICAoMTc0LCA2MDQpDQotCQkJCQkgICAgKDE3NCwgMjI1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAyMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDI3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NzcyOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIiBAMzY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjUsIDIwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJVHlwZXMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjUsIDE1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NBRENCQjIwMDUwIg0KLQkJCQl3aWR0aCAgICAgIAkyNDgNCi0JCQkJaGVpZ2h0ICAgICAJMTY2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDM2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3MjgsIDgwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1OSwgNzUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTczOQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyINCi0JCQkJd2lkdGggICAgICAJNzU3DQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAzNjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgMTIxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyOSwgMTEwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAk2NzMNCi0JCQkJaGVpZ2h0ICAgICAJMjUwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY1IiBAMzY3DQotCQkJCWxvY2F0aW9uICAgCSgxODI2LCA5NzUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDUwMEYyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY2IiBAMzY4DQotCQkJCQlQYXJlbnRfVmlldyAJQDM2Nw0KLQkJCQkJbG9jYXRpb24gICAJKDMwNiwgNDQ3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ2MDIzRCINCi0JCQkJCWNsaWVudCAgICAgCUAzNjcNCi0JCQkJCXN1cHBsaWVyICAgCUAzNjUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjYsIDg1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzQsIDkwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY1NjQ4OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hIiBAMzcwDQotCQkJCQlQYXJlbnRfVmlldyAJQDM2Nw0KLQkJCQkJbG9jYXRpb24gICAJKDMwNiwgNDQ3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwNiwgMTAzMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDc1NzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0UiDQotCQkJCQljbGllbnQgICAgIAlAMzY3DQotCQkJCQlzdXBwbGllciAgIAlAMzY2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCAxMDkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4OCwgMTA1MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY1MTUxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM3Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQURDRDNCMDM4MCINCi0JCQkJY2xpZW50ICAgICAJQDM1NQ0KLQkJCQlzdXBwbGllciAgIAlAMzY0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDUsIDUwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwNSwgMzA3KSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDM3NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDIyNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTUsIDEzMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmxlRWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgxNSwgMTg1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMxKQ0KLQkJCQl3aWR0aCAgICAgIAk1MDANCi0JCQkJaGVpZ2h0ICAgICAJMjEyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzc1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJCQljbGllbnQgICAgIAlAMzU1DQotCQkJCXN1cHBsaWVyICAgCUAzNzQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NCwgNTAwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU0LCAzMzApKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzc2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDQ2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MCwgMzY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MCwgNDIzKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY1KQ0KLQkJCQl3aWR0aCAgICAgIAk2ODcNCi0JCQkJaGVpZ2h0ICAgICAJMjE2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3IiBAMzc3DQotCQkJCWxvY2F0aW9uICAgCSgxMjA2LCA0OTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4IiBAMzc4DQotCQkJCQlQYXJlbnRfVmlldyAJQDM3Nw0KLQkJCQkJbG9jYXRpb24gICAJKC01ODYsIDIzNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzc4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzYsIDM4NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCQkJCWNsaWVudCAgICAgCUAzNzcNCi0JCQkJCXN1cHBsaWVyICAgCUAzNzQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjA2LCA0OTMpDQotCQkJCQkgICAgKDEwOTQsIDQ5MykNCi0JCQkJCSAgICAoMTA5NCwgMzMwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTQsIDMzMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzc4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDM3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyODMyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDM4MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTg2LCAyMzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTk2LCA0NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMzk3MTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCINCi0JCQkJCWNsaWVudCAgICAgCUAzNzcNCi0JCQkJCXN1cHBsaWVyICAgCUAzNzYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODEsIDQ5MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTUsIDU0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2NDk1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzk2LCAzOTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTQ5MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzg1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYyN0YwMEI3Ig0KLQkJCQljbGllbnQgICAgIAlAMzY1DQotCQkJCXN1cHBsaWVyICAgCUAzNzYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MTIsIDc0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTIsIDU3MikpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4zIE1lc3NhZ2VzIg0KLQkJCXF1aWQgICAgICAgCSIzQkNFODUzRDAyQzgiDQotCQkJdGl0bGUgICAgICAJIjIuMyBNZXNzYWdlcyINCi0JCQl6b29tICAgICAgIAk4NQ0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU1lc3NhZ2UiIEAzODYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgMTIyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklNZXNzYWdlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCA3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4QUYwMDRGIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDE4MCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTQNCi0JCQkJICAgIG1heF93aWR0aCAgCTM4MSkNCi0JCQkJd2lkdGggICAgICAJMzgwDQotCQkJCWhlaWdodCAgICAgCTMyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiIEAzODcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDEyNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUGFydCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDc0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDE4MikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTYwMykNCi0JCQkJd2lkdGggICAgICAJNjE3DQotCQkJCWhlaWdodCAgICAgCTMyNA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAzODgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA4MTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDY5MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NSwgNzQ4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDg0KQ0KLQkJCQl3aWR0aCAgICAgIAk0OTINCi0JCQkJaGVpZ2h0ICAgICAJMjc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzg5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE5NkQwMkYxIg0KLQkJCQljbGllbnQgICAgIAlAMzg4DQotCQkJCXN1cHBsaWVyICAgCUAzODcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDQsIDY3OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDQsIDM4NikpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDM5MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgNjU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDUwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCA1NjUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk1DQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpDQotCQkJCXdpZHRoICAgICAgCTQzMg0KLQkJCQloZWlnaHQgICAgIAkzMjINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThEMTAyQkEiDQotCQkJCWNsaWVudCAgICAgCUAzOTANCi0JCQkJc3VwcGxpZXIgICAJQDM4Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDQ1LCA0OTUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDM4OCkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3IiBAMzkyDQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDk1MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRTAwRTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBhcnRzIiBAMzkzDQotCQkJCQlQYXJlbnRfVmlldyAJQDM5Mg0KLQkJCQkJbG9jYXRpb24gICAJKDE3NiwgMzI4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUyLCA4OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk3NDUyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNjEiDQotCQkJCQljbGllbnQgICAgIAlAMzkyDQotCQkJCQlzdXBwbGllciAgIAlAMzg4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDk1MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzkzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4NywgMTAwNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTgwOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NjcsIDEwNjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDIwMzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4IiBAMzk3DQotCQkJCQlQYXJlbnRfVmlldyAJQDM5Mg0KLQkJCQkJbG9jYXRpb24gICAJKDE3NiwgMzI4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzk4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA0LCA4OTMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDRUJGMDA1NyINCi0JCQkJCWNsaWVudCAgICAgCUAzOTINCi0JCQkJCXN1cHBsaWVyICAgCUAzOTANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2ODgsIDk1MikNCi0JCQkJCSAgICAoNDQ1LCA5NTIpDQotCQkJCQkgICAgKDQ0NSwgODE3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCA4MTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzOTMsIDkxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0NzYwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkpKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAieHNkIg0KLQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlhTRCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSJvcmcuZWNsaXBzZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJ4c2QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy94c2QvMjAwMi9YU0QiKSkNCi0JCXF1aWQgICAgICAgCSIzOUFCREM2RjAxQUEiDQotCQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBbm5vdGF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUUxNzcwMTE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGRDRFMjAzNjYiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcHBsaWNhdGlvbkluZm9ybWF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFQkYwMkM4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2VySW5mb3JtYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQkJGN0VFQTAxNTciDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQkJGN0YwNTAxRTIiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NQXR0ciINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCN0RDMDE5MyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTYxMDNCRSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODdGNTIwMkI0Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjcyRDhFMjAwRUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDNBMDIyMSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJFQjAyQTgiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzgwMEQyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4N0Y3QjAzODYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZVVzZSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNzJENzM3MDM4RiINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjcyRDdCQjAzNDkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0NGMzAyN0QiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0REQjAzQjciDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cmFpbnQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0RFMDAyRDgiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb25zdHJhaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IwMjIwMzgyIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3MTlEOTAzNDEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQm91bmRlZEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzUxRDAzNDQiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2M0MwMjI0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NTJBMDBDQyINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ2FyZGluYWxpdHlGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1NUQwM0QyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjRGMDEzMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzU2QzAxNTMiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDYXJkaW5hbGl0eSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhCODAyODYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkFBMjAzMTAiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXJpdmF0aW9uTWV0aG9kIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM2RTQwMjBFIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGVyaXZhdGlvbk1ldGhvZCINCi0JCQkJaW5pdHYgICAgICAJInJlc3RyaWN0aW9uIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzcxRDAyNkEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzczODAwQzUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29udGVudFR5cGVDYXRlZ29yeSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQTQyMDJCOCINCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQjhBMDNFNiINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNjE4MDE0RCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wbGV4RmluYWwiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9jayINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGQjk3MDA2RSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1peGVkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MzMUFGNUUwM0E2Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wb25lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBOTAzRDIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEREI1MDFBNSINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbmluZ0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDODAwMzk0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaWFnbm9zdGljIg0KLQkJCXF1aWQgICAgICAgCSIzQkZFNUY5MTAwNDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QzBGNEMwMUExIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2V2ZXJpdHkiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjkxQzAwNUQiDQotCQkJCXR5cGUgICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTVGREQwMjgwIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQzA2Mzc0MzAxNkIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaW5lIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYwN0UwMjEzIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlpbml0diAgICAgIAkiMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbHVtbiINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MTFFMDI5NiINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJaW5pdHYgICAgICAJIjEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJub2RlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwMTZCNkIwMjAwIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NTm9kZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFubm90YXRpb25VUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQzA2Mzc0RjAxODYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODVGMTcwMDJFIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2NjAzMzkiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmlsbGFibGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkZCNDAyOUYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzQ2ODAzNjgiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzRBMDAzQjkiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzRFMDAwMEUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEQxNEMwMEIyIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2siDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDE2ODAxQzEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg5RjYyMDNDRiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaXJjdWxhciINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MzNERDQjAwMDE4Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDOUQwM0M3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdDNjQwMDU0Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDI1NjgwMjU5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Mzc0MDI1MyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhY2V0TmFtZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODlGQjQwMUVDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWZmZWN0aXZlVmFsdWUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBQUUzMDNCNiINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGZWF0dXJlIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTBBMkMwMzA3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkY4MTAyMEYiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cmFpbnQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkY4ODAwQzUiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb25zdHJhaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZm9ybSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDJCMDMzRSINCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3MUExQjAxNkYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJnbG9iYWwiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMDA3MDM3MiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmZWF0dXJlUmVmZXJlbmNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTA0NDAxODUiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGaXhlZEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNjk5RTAwQzEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDODgwMUI0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZml4ZWQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkE2MDAyMDEiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOTkwMDE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3OUQyMDA4QSINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNjlFODAxRDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDN0IwMzk2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBQTMwMjQyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDFDNzAxNDMiDQotCQkJCXR5cGUgICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJbXBvcnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4QzkzMDE3RiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhEOTAwM0UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURCMTUwMzZDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREluY2x1ZGUiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4QzdEMDI1MCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhEQzAzODEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciINCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RMZW5ndGhGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3NjIwMEU3Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NzgwMDJERiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc2QzAwNEIiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3ODk2MDBDMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I4RTAzMDkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4RmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQzMTAzQUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRTIwMUY3Ig0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMTc0MDI3RCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMTkzMDM1NCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzg3RDAwREEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCODMwM0I4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heExlbmd0aEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCN0QwMEZDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3N0RBMDBGMyINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5FeGNsdXNpdmVGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5MkQwMDBBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjU5MDI4MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5GYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRDI0MDA5OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQzBBMUVEMTAzOTgiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImluY2x1c2l2ZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEExQTIwMDhFIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2x1c2l2ZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEExQkUwM0UyIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluSW5jbHVzaXZlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3ODg3MDJDOSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1MjAzNTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluTGVuZ3RoRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzdDNDAwQzAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3OTkwMTVFIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1vZGVsR3JvdXAiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NEE2NDAyNzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbXBvc2l0b3IiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0YxRDAxQ0YiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wb3NpdG9yIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRTIwMzgxIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjU1MDM4NSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FDNDAwOTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEExRjYwMkU4Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROYW1lZENvbXBvbmVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCQTBDRUEyMDE5NyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ3MDAwMTQyIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ3MDQwMzFFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxpYXNOYW1lIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTU3RjAxMjciDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1UkkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNTg3MDBFMiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzVVJJIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTVBQTAyQUYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTA5NjMwMjVFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ5NDMwMkYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTRGMDIzQyINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzeXN0ZW1JZGVudGlmaWVyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQzMkUwMEYwIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHVibGljSWRlbnRpZmllciINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzM0MDM5NyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROdW1lcmljRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY0MjAwNzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1QTMwMDEyIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RPcmRlcmVkRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NEREMDI0OCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY1OTAxMkMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc0RjYwMkRBIg0KLQkJCQl0eXBlICAgICAgIAkiWFNET3JkZXJlZCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXJ0aWNsZSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEZDMDFFNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaW5PY2N1cnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0Y4RTAzQjIiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWluaXR2ICAgICAgCSIxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWF4T2NjdXJzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOTkwM0FFIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlpbml0diAgICAgIAkiMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXJ0aWNsZUNvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjc4MEJEOTAwNTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhdHRlcm5GYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2Q0E1MDM4RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qzc5MDMxMSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGRDRCQTAyM0MiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTBBMjYwMzZEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNjgwMDIxNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2QUUyMDYwMTcyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkIzMDFENSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQjY0MDI0MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIg0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlcGVhdGFibGVGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBQTYwMzFBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzhGMDAyRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hIg0KLQkJCXF1aWQgICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNDNEEwMTgyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODRFNTAzREQiDQotCQkJCXR5cGUgICAgICAgCSJET01Eb2N1bWVudCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjaGVtYUxvY2F0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODY4RUMwMjI2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjlCRkYwMTgwIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlRm9ybURlZmF1bHQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTA0QjAxMDIiDQotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIg0KLQkJCQlpbml0diAgICAgIAkidW5xdWFsaWZpZWQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50Rm9ybURlZmF1bHQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTA3ODAwQUMiDQotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIg0KLQkJCQlpbml0diAgICAgIAkidW5xdWFsaWZpZWQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbERlZmF1bHQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwQzRBNzAwMzgiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9ja0RlZmF1bHQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjU5RDAyRDgiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJzaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0QyMkQ2RDgwMzU2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUNvbXBvc2l0b3IiDQotCQkJcXVpZCAgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREI1NjAwOTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4OENCODAwQkEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4RTYwMzcyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFEaXJlY3RpdmUiDQotCQkJcXVpZCAgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTMyMTAyQUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjaGVtYUxvY2F0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ5QjMwMzMwIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY29wZSINCi0JCQlxdWlkICAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDRDY0MDIzMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1RjU1MDMyQiINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhcmlldHkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzE1ODAwQTkiDQotCQkJCXR5cGUgICAgICAgCSJYU0RWYXJpZXR5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTQ0RjAxNDYiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEU2ltcGxlRmluYWwiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjY1RTAzNUEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEU2ltcGxlRmluYWwiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWxpZEZhY2V0cyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBQjBGMDBCNiINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVGVybSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEFBMDFEMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QkQyNDQwMDY5Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzlBMDAyMEUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNjEwMzM3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3OUFCMDIzMiINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkY1MDEzQSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdoaXRlU3BhY2VGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4NDYwMUI3Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3ODYyMDA0NSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzg1MDAyMDEiDQotCQkJCXR5cGUgICAgICAgCSJYU0RXaGl0ZVNwYWNlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdpbGRjYXJkIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDBFOTAxOUUiDQotCQkJCXR5cGUgICAgICAgCSJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VDb25zdHJhaW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0NGODYwMjIzIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2Nlc3NDb250ZW50cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMTJFMDFFNCINCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2Nlc3NDb250ZW50cyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0JEQjcwMUY5Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RYUGF0aERlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZEODRGNzAwOTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFyaWV0eSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ5MDE1MDNERSINCi0JCQkJdHlwZSAgICAgICAJIlhTRFhQYXRoVmFyaWV0eSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I3QkJCRTEwMUIxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUF0dHIiDQotCQkJcXVpZCAgICAgICAJIjNCQkY4Qzg5MDFCNiINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uQXR0ciINCi0JCQkJcXVpZCAgICAgICAJIjNCQkY4Q0IwMDBENSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCINCi0JCQlxdWlkICAgICAgIAkiM0MyNzg1MEUwMzgxIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Eb2N1bWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NTFCMDNDNiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01FbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjgxODk3OTAyMDAiDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjgxODlEQjAzNzQiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NTm9kZSINCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0QTUwMTE3Ig0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Ob2RlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY1QkYwMDJEIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlZhbHVlIg0KLQkJCXF1aWQgICAgICAgCSIzQzA0MEI1QjAzMUYiDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubGFuZy5PYmplY3QiDQotCQkJCXF1aWQgICAgICAgCSIzQzA0MEI4RDAzRDUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiDQotCQkJcXVpZCAgICAgICAJIjNCQTdCMEU4MDFBOCINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3B0aW9uYWwiDQotCQkJCXF1aWQgICAgICAgCSIzQkE3QjExNTAyQjciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9oaWJpdGVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjIwMkQzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkE3QjEyOTAyRjAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ2FyZGluYWxpdHkiDQotCQkJcXVpZCAgICAgICAJIjNCQzc3MTVEMDA5QiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluaXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxREMwMkVEIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY291bnRhYmx5SW5maW5pdGUiDQotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFFQzAxNDEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleEZpbmFsIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzJDQTAxQ0IiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMkU3MDBEQSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyRUEwMTZBIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2RDIwMTEyIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBvc2l0b3IiDQotCQkJcXVpZCAgICAgICAJIjNCODY5QjYyMDAzNyINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlCRDAwMDAzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2hvaWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDQjgwMTFFIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2VxdWVuY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2OUNFNTAwNTciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29uc3RyYWludCINCi0JCQlxdWlkICAgICAgIAkiM0I4NjlFMjYwMUFFIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZWZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlFOEUwMjU4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZml4ZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2OUU5OTAyNzEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29udGVudFR5cGVDYXRlZ29yeSINCi0JCQlxdWlkICAgICAgIAkiM0I4NkE3OUYwM0EyIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbXB0eSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0NEMDJGMCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNpbXBsZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0QxMDBDRSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1peGVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDMwMUI3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudE9ubHkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdENzAyRTkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGVyaXZhdGlvbk1ldGhvZCINCi0JCQlxdWlkICAgICAgIAkiM0I4NkEwQjAwMENFIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDODAzMjkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMENDMDE2MiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaWFnbm9zdGljU2V2ZXJpdHkiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2OEE3MDMyRiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmF0YWwiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhDMzAzRDAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlcnJvciINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEU3MDBFMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIndhcm5pbmciDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhFQTAxRkYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmZvcm1hdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU3RkMyMDE5QSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1QTQwM0RGIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdWJzdGl0dXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY3OTAwNDUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY3RjAxQUMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjgzMDIwQiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGMjQ1MDA2OSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGb3JtIg0KLQkJCXF1aWQgICAgICAgCSIzQjlGOTEzQjAxRUIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInF1YWxpZmllZCINCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MTZGMDAyMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVucXVhbGlmaWVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkxOEMwMDdGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg2QTFFMDAyNzIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjEyMDA4NSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleXJlZiINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjEzMDE0RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaXF1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjE2MDM2NSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDNUVBMDAyMyINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYW55Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjAwMDM0Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm90Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjIwMDVGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2V0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0QwNjUwMTE3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE9yZGVyZWQiDQotCQkJcXVpZCAgICAgICAJIjNCQzc3MTUyMDJFNCINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmFsc2UiDQotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFBOTAyNzEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJ0aWFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQkIwMUZGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidG90YWwiDQotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFDNDAxQjIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUHJvY2Vzc0NvbnRlbnRzIg0KLQkJCXF1aWQgICAgICAgCSIzQjhGRjhDNzAyODQiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0cmljdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEY4MDA0NSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxheCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEY2MDM4QiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNraXAiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhFODAyQkEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDNUJFMDI3MiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2OEIwMEI4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY5NDAyOTEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjI1MDAyOTUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2ltcGxlRmluYWwiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDMjVEMDI5NSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgxMDIzMCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODMwMTM4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4ODAyNEUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjZFMDAzNzQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzU5MTAwQUUiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjY0MDIzMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NkQwMjE2Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFZhcmlldHkiDQotCQkJcXVpZCAgICAgICAJIjNCOEZGNzczMDI0OSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXRvbWljIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QTcwMkRGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0FEMDEzOSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QUYwMzlGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdoaXRlU3BhY2UiDQotCQkJcXVpZCAgICAgICAJIjNCRUVEMEY2MDM0MiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlc2VydmUiDQotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEwRjAxMTciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXBsYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjcwMzREIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29sbGFwc2UiDQotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEyOTAzOTYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEWFBhdGhWYXJpZXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhGRkI4OTAzM0EiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlbGVjdG9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkZCQUMwMTkyIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmllbGQiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRkJCMzAyNzgiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzAiDQotCQkJcXVpZCAgICAgICAJIjNDNjI2RUE3MDEwMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MSINCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQTkwMTkyIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MiINCi0JCQlxdWlkICAgICAgIAkiM0I2OURBREMwMkY1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDczIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURBREQwMjM4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQUREMDI0MiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3NCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMDZGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzBFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAzMTgiDQotCQkJCWxhYmVsICAgICAgCSJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3NiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1NkIwMkNCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1NkQwMEE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNyINCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3OCINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNkIwMTk0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNkQwMzA5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNkQwMzEzIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4MCINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMDYwMjkxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwNzAxNzIiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODIiDQotCQkJcXVpZCAgICAgICAJIjNCNjk0MDRFMDA2NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDUwMDI5QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDUwMDJBNSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1OUYwMDg2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1QTAwMDY5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVVzZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2QSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVVzZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI3NUQzMjAyMjAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODciDQotCQkJCXF1aWQgICAgICAgCSIzQzI3NUQzQzAxMEMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBEIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4ODdCRjAxNTAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4ODdDMDAwQTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4N0MwMDBBOCINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5MCINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNUUwMUY5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNjIwMDQ2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2MjAwNTAiDQotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTIiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTg1MDEwRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTg2MDBGQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1ODYwMEZCIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZGMURFOTAxOEEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZGMURFQTAzNkMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkYxREVBMDM4MCINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTYiDQotCQkJcXVpZCAgICAgICAJIjNCOTAwNjg4MDFDMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5NyINCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNjhBMDExMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50QW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNjhBMDExQiINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRBbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTgiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzMzM1MDM0MCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RSINCi0JCQkJbGFiZWwgICAgICAJImJhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAwIg0KLQkJCXF1aWQgICAgICAgCSIzQjZGRERENzAxMTMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RkREREEwMjZCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZGREREQTAyNzUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDIiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzN0RGMDI0RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdFMTAwRkQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0UxMDBGRSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDQiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzOTU5MDA2RSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAzNDkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlVXNlcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzRBIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlVXNlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwNiINCi0JCQlxdWlkICAgICAgIAkiM0I2OThFMzYwMzg2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwNyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjk4RTM4MDA3MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVDb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjk4RTM4MDA3QyINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZUNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDgiDQotCQkJcXVpZCAgICAgICAJIjNCNjg1MUJBMDEyNiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1MUJCMDE1MSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTAiDQotCQkJcXVpZCAgICAgICAJIjNCNzUxQjA4MDNDNyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250YWluZXIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUIwQzAxQ0UiDQotCQkJCWxhYmVsICAgICAgCSJjb250YWluZXIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExMSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjBDMDFDRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTIiDQotCQkJcXVpZCAgICAgICAJIjNCNzUxQjQ4MDI2MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyb290Q29udGFpbmVyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCNEMwMjg1Ig0KLQkJCQlsYWJlbCAgICAgIAkicm9vdENvbnRhaW5lciINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCNEMwMjg2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNCINCi0JCQlxdWlkICAgICAgIAkiM0I3NTFDMzEwMzU2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExNSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpDQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFDMzMwMzNCIg0KLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTYiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBBMDA2NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTciDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyM0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBCMDI0OSINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTgiDQotCQkJcXVpZCAgICAgICAJIjNCNjg5MTE0MDFBRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OTExNTAwMTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OTExNTAwMTciDQotCQkJCWxhYmVsICAgICAgCSJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjAiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDA1OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAzQkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDNDMCINCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjIiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzM0VGMDE2MCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzNGMDAyOTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzNGMDAyOTkiDQotCQkJCWxhYmVsICAgICAgCSJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyNCINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQxRTYwMjUxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyNSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDJGNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQxRUEwMzBCIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyNiINCi0JCQlxdWlkICAgICAgIAkiM0I2OUMwNTkwMTk4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyNyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDMDVEMDFFMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDMDVEMDFFRCINCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyOCINCi0JCQlxdWlkICAgICAgIAkiM0M0MkRCREQwMjk3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyOSINCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDExRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzdWJzdGl0dXRpb25Hcm91cCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0M0MkRCRTAwMTI4Ig0KLQkJCQlsYWJlbCAgICAgIAkic3Vic3RpdHV0aW9uR3JvdXAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzMCINCi0JCQlxdWlkICAgICAgIAkiM0I2RDIzQjkwMUNEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzMSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyM0JBMDFDNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMjNCQTAxQ0UiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMyIg0KLQkJCXF1aWQgICAgICAgCSIzQjZENTk3MTAyRUEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAic2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU5NzUwMTA1Ig0KLQkJCQlsYWJlbCAgICAgIAkic2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzMyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDExOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzQiDQotCQkJcXVpZCAgICAgICAJIjNCNjlCNjUzMDE3QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY29wZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCNjU0MDA2RCINCi0JCQkJbGFiZWwgICAgICAJInNjb3BlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjY1NDAwNkUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzYiDQotCQkJcXVpZCAgICAgICAJIjNDMjkwMTA2MDJENyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEZlYXR1cmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDEwQjAwMEUiDQotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEZlYXR1cmUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM3Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTAxMEIwMDE4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAxODMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMzNDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMzQ2Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0MCINCi0JCQlxdWlkICAgICAgIAkiM0I2OUQyOUUwMTREIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlZmVyZW5jZWRLZXkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMkE4MDE2NSINCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jZWRLZXkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQxIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQyQTgwMTZGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQyIg0KLQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRDAwM0UiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEM0UwMjJBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzZWxlY3RvciINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNFMDIzNCINCi0JCQkJbGFiZWwgICAgICAJInNlbGVjdG9yIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDQiDQotCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDAyNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNjUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImZpZWxkcyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDM3OSINCi0JCQkJbGFiZWwgICAgICAJImZpZWxkcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBRENEODAyRkMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURDRDkwMThCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEMiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBRENDNTAwN0UiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURDQzYwMDZCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREluY2x1ZGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM3RDAyNTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURDQzYwMDZDIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1MCINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTcwMkM4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE4MDNFMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE5MDAwNCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTIiDQotCQkJcXVpZCAgICAgICAJIjNCNkJDRUIxMDJGOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCNjAwMUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDI1Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzYwNjAyNkYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM2MDcwMjIxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJ0aWNsZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMiINCi0JCQkJbGFiZWwgICAgICAJInBhcnRpY2xlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTYiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjE1MDA4QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTciDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxNjAwOTYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMEEwIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1OCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM3QUMwMjVBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0FEMDMzOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1vZGVsR3JvdXAiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdBRDAzMzkiDQotCQkJCWxhYmVsICAgICAgCSJtb2RlbEdyb3VwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYwIg0KLQkJCXF1aWQgICAgICAgCSIzQjZCNDI0NTAzOTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNDkwMzhBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNDkwMzlFIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjIiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBGMDIxMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMDAwQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMDAwRDMiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCNDcxNTAxMTkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQ3MUEwM0FCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0NzFBMDNCNSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODNDODkwMTIyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzQzhBMDExMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInRlcm0iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzQzhBMDExMSINCi0JCQkJbGFiZWwgICAgICAJInRlcm0iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjgiDQotCQkJcXVpZCAgICAgICAJIjNCNkFERTQyMDA5QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjkiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAyRkUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURFNDMwMzA4Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzAiDQotCQkJcXVpZCAgICAgICAJIjNCNkFFODI0MDA1MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzEiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNjAyQUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFODI2MDJCNyINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzIiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4RTZCMDAzRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QzAxMDciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QzAxMTEiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3NCINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFOEQwMUJGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRThFMDE5OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlbGVtZW50RGVjbGFyYXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RTAxOTkiDQotCQkJCWxhYmVsICAgICAgCSJlbGVtZW50RGVjbGFyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY2RkRGQTAwQzMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkZERkIwMjdEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZURlY2xhcmF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkZERkIwMjdFIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzgiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRTkyMDIxNiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU5MzAxOEIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOTMwMThDIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4MCINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFNzYwMDQ5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDM3NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDM3RSINCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUVGRjAyNEYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVGMDAwMjVBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1vZGVsR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVGMDAwMjY0Ig0KLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cERlZmluaXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODQiDQotCQkJcXVpZCAgICAgICAJIjNCRkMyQTE3MDFFRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODUiDQotCQkJCXF1aWQgICAgICAgCSIzQkZDMkExQTAyNzMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCRkMyQTFBMDI3RCINCi0JCQkJbGFiZWwgICAgICAJImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUVBNzAyM0UiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm5vdGF0aW9uRGVjbGFyYXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUVBODAzOEIiDQotCQkJCWxhYmVsICAgICAgCSJub3RhdGlvbkRlY2xhcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODgiDQotCQkJcXVpZCAgICAgICAJIjNCNjlFNDU2MDI5MCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNjUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFNDU3MDE2RiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkwIg0KLQkJCXF1aWQgICAgICAgCSIzQjZENUNBNTAxMTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDVDQTcwM0I0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZENUNBNzAzQzgiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTIiDQotCQkJcXVpZCAgICAgICAJIjNCNkMzNUFEMDM3NCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRjAwMDYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmYWNldENvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM1QUYwMDEwIg0KLQkJCQlsYWJlbCAgICAgIAkiZmFjZXRDb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTQiDQotCQkJcXVpZCAgICAgICAJIjNCQzhBRTAyMDNBOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTUiDQotCQkJCXF1aWQgICAgICAgCSIzQkM4QUUwNjAwNTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmYWNldHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQzhBRTA2MDA2NSINCi0JCQkJbGFiZWwgICAgICAJImZhY2V0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTYiDQotCQkJcXVpZCAgICAgICAJIjNCNkMzNEI3MDIwOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTciDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNEJFMDI1OSINCi0JCQkJbGFiZWwgICAgICAJIm1lbWJlclR5cGVEZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTgiDQotCQkJcXVpZCAgICAgICAJIjNCNkMzNjMyMDFEQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTkiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzYzNTAwNTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmdW5kYW1lbnRhbEZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDYzIg0KLQkJCQlsYWJlbCAgICAgIAkiZnVuZGFtZW50YWxGYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDAiDQotCQkJcXVpZCAgICAgICAJIjNCNkQzNUFCMDI3MyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDEiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMzVCMjAyOTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkQzNUIyMDJBNSINCi0JCQkJbGFiZWwgICAgICAJImJhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDIiDQotCQkJcXVpZCAgICAgICAJIjNCNkQ1NTcyMDE2QyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTU3NTAyMkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU1NzUwMjQzIg0KLQkJCQlsYWJlbCAgICAgIAkicHJpbWl0aXZlVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MTAxNTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUUyOTIwMTlGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMjkyMDFBOSINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDYiDQotCQkJcXVpZCAgICAgICAJIjNCOTAwNkNGMDA4OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDciDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDZEMTAxNUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJkZXJpdmF0aW9uQW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE2NyINCi0JCQkJbGFiZWwgICAgICAJImRlcml2YXRpb25Bbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIzMzAyNjQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMzQwMjg0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4RSINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIxMTAyNkYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjExIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTIwMUY5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDIwMyINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTIiDQotCQkJcXVpZCAgICAgICAJIjNDNjI2RUIzMDAwNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTMiDQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVCNDAzMjciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzMyIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTQiDQotCQkJcXVpZCAgICAgICAJIjNCRUJEQzg3MDI0NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTUiDQotCQkJCXF1aWQgICAgICAgCSIzQkVCREM4QzAyRjkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMzAzIg0KLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxNiINCi0JCQlxdWlkICAgICAgIAkiM0JGRTYyMjcwM0NEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxNyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjJCMDA2MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIg0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb21wb25lbnRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjIyQjAwNkMiDQotCQkJCWxhYmVsICAgICAgCSJjb21wb25lbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxOCINCi0JCQlxdWlkICAgICAgIAkiM0JGRTYyNjkwMTY1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxOSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjZBMDAyNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImRpYWdub3N0aWNzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjZBMDAyNyINCi0JCQkJbGFiZWwgICAgICAJImRpYWdub3N0aWNzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiDQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjIwIg0KLQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMTAzNUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIxIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY0MzIwMUM2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFsbERpYWdub3N0aWNzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMjAxQzciDQotCQkJCWxhYmVsICAgICAgCSJhbGxEaWFnbm9zdGljcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIg0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyMiINCi0JCQlxdWlkICAgICAgIAkiM0MyMURDQzcwMEVDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyMyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQ0NFMDA0MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZFNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyMURDQ0UwMDQzIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRTY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNCINCi0JCQlxdWlkICAgICAgIAkiM0MyMUREMEMwM0RCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyNSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIg0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiaW5jb3Jwb3JhdGVkU2NoZW1hIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREQxMDAzMDUiDQotCQkJCWxhYmVsICAgICAgCSJpbmNvcnBvcmF0ZWRTY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNiINCi0JCQlxdWlkICAgICAgIAkiM0MyMzkxMzQwMDRGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyNyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjM5MTM2MDBDQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyMzkxMzYwMEQ0Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyOCINCi0JCQlxdWlkICAgICAgIAkiM0MyNUQzQTYwMTMxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyOSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjVEM0E5MDM3MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlZmVyZW5jaW5nRGlyZWN0aXZlcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUQzQTkwMzcxIg0KLQkJCQlsYWJlbCAgICAgIAkicmVmZXJlbmNpbmdEaXJlY3RpdmVzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzAiDQotCQkJcXVpZCAgICAgICAJIjNDMjVFQ0YwMDA1RSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUNGNDAwMUUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VmVyc2lvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFQ0Y0MDAyOCINCi0JCQkJbGFiZWwgICAgICAJInJvb3RWZXJzaW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzIiDQotCQkJcXVpZCAgICAgICAJIjNDMjVFRDBCMDExQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUQwRjAxMjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJvcmlnaW5hbFZlcnNpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUQwRjAxMkIiDQotCQkJCWxhYmVsICAgICAgCSJvcmlnaW5hbFZlcnNpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNCINCi0JCQlxdWlkICAgICAgIAkiM0MyNUVFQUIwMDFGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRUFGMDEwQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJpbmNvcnBvcmF0ZWRWZXJzaW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUVBRjAxMTUiDQotCQkJCWxhYmVsICAgICAgCSJpbmNvcnBvcmF0ZWRWZXJzaW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwREUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMERGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiaXRlbVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwRTAiDQotCQkJCWxhYmVsICAgICAgCSJpdGVtVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3MzAxOTQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hRm9yU2NoZW1hIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUZCIg0KLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hRm9yU2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDAiDQotCQkJcXVpZCAgICAgICAJIjNDMjg4MEY1MDNEOSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwM0MiDQotCQkJCWxhYmVsICAgICAgCSJyb290VHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MEY5MDA0NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNTAxMzciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODgyQzcwMTEyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiDQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInByaW1hcnlDb21wb25lbnQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMyINCi0JCQkJbGFiZWwgICAgICAJInByaW1hcnlDb21wb25lbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMjAxQTQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMEYzMDJFNSINCi0JCQkJbGFiZWwgICAgICAJInR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMEYzMDJGMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE2REIwMUU1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2REQwM0REIg0KLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNkREMDNERSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBNzEyMDEwOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzE0MDE1MSINCi0JCQkJbGFiZWwgICAgICAJImJhc2VUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTc0QjAxNzgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAic2ltcGxlVHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzREMDE3QiINCi0JCQkJbGFiZWwgICAgICAJInNpbXBsZVR5cGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1MSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzREMDE4NSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTIiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBN0VEMDNDMCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb21wbGV4VHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBN0Y0MDExNyINCi0JCQkJbGFiZWwgICAgICAJImNvbXBsZXhUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTdGNDAxMjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NDAzMEEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE5OTcwMEREIg0KLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwRTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NTAyNUIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwODYwMjcwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWluRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NjAyN0EiDQotCQkJCWxhYmVsICAgICAgCSJtaW5GYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMDhEMDI1MiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDhFMDA5QiINCi0JCQkJbGFiZWwgICAgICAJIm1heEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2MCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQUIwMzk2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2MSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEFDMDNDOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQUMwM0Q0Ig0KLQkJCQlsYWJlbCAgICAgIAkibWF4SW5jbHVzaXZlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBBRjAzMzgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjAwMUY5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWluSW5jbHVzaXZlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMDAyMDMiDQotCQkJCWxhYmVsICAgICAgCSJtaW5JbmNsdXNpdmVGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEIzMDIwNyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI0MDE5QSINCi0JCQkJbGFiZWwgICAgICAJIm1pbkV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQjYwMjhEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2NyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI3MDIxNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjcwMjIxIg0KLQkJCQlsYWJlbCAgICAgIAkibWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAwNTEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMjQ2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAyNTAiDQotCQkJCWxhYmVsICAgICAgCSJsZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJGMDE4QyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMDAwNkIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ3aGl0ZVNwYWNlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMDAwNzUiDQotCQkJCWxhYmVsICAgICAgCSJ3aGl0ZVNwYWNlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3MiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzIwMjFEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3MyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMzMDBBQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVudW1lcmF0aW9uRmFjZXRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzMwMEFDIg0KLQkJCQlsYWJlbCAgICAgIAkiZW51bWVyYXRpb25GYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEM1MDE1OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDNjAwQjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXR0ZXJuRmFjZXRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzYwMEJBIg0KLQkJCQlsYWJlbCAgICAgIAkicGF0dGVybkZhY2V0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDODAyQTciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUVBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY2FyZGluYWxpdHlGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM5MDFGNSINCi0JCQkJbGFiZWwgICAgICAJImNhcmRpbmFsaXR5RmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMENCMDM5QyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQzAzRDAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJudW1lcmljRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQzAzRDEiDQotCQkJCWxhYmVsICAgICAgCSJudW1lcmljRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQ0YwMTk5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQyMDA4NSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heExlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDIwMDhGIg0KLQkJCQlsYWJlbCAgICAgIAkibWF4TGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBENTAwQzUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDFEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWluTGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBENjAwMjciDQotCQkJCWxhYmVsICAgICAgCSJtaW5MZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ4MDBERSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAzQ0QiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0b3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0Q3Ig0KLQkJCQlsYWJlbCAgICAgIAkidG90YWxEaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwREIwMzc3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERDMDM1QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQzAzNjQiDQotCQkJCWxhYmVsICAgICAgCSJmcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAwNDgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREYwM0I5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAib3JkZXJlZEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREYwM0MzIg0KLQkJCQlsYWJlbCAgICAgIAkib3JkZXJlZEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEUzMDBEOSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBFNDAzOEUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJib3VuZGVkRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBFNDAzOTgiDQotCQkJCWxhYmVsICAgICAgCSJib3VuZGVkRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI0NDQwMUVDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ1MDM2MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1heEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI0NDUwMzZBIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4RmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjU0RjAxNDUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1NTAwMzhDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1NTAwMzk2Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTYiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNUM0MDExQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTciDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNTAyMEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNUM1MDIxNyINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5OCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI2MkEwMEFBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5OSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNjJCMDEzOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQjAxNDIiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMDAzQTYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2QjEwMzExIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlUGF0dGVybkZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2QjEwMzEyIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlUGF0dGVybkZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDIiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCN0NBMDI2QiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQjAxODYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTkwIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI4NDAwMDYyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODQxMDAxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MTAwMjciDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5ODAxNkQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDU2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5OTAwNjAiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDA1MiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAzQjkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVMZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDNDMyINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUxlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI5NzAwMURCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOTcxMDBDRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1pbkZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI5NzEwMEQ5Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEyIg0KLQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRTAxQ0MiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzEzIg0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTBGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljRmFjZXRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRjAxMUEiDQotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNGYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzE0Ig0KLQkJCXF1aWQgICAgICAgCSIzRDRCQjREMzAyOEUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzE1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkYzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1BhcnRpY2xlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRENDAyRkQiDQotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNQYXJ0aWNsZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTYiDQotCQkJcXVpZCAgICAgICAJIjNENEJCNEQ5MDFGNiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTciDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyODQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljV2lsZGNhcmQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNERBMDI4RSINCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxOCINCi0JCQlxdWlkICAgICAgIAkiM0Q0QzY4RkYwMUJGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxOSINCi0JCQkJcXVpZCAgICAgICAJIjNENEM2OTAyMDMxNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJcXVpZCAgICAgICAJIjNENEM2OTAyMDMxOCINCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkNCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIxLiBDb21wb25lbnQgSGllcmFyY2h5IChQYXJ0IDE6IFN0cnVjdHVyZXMpIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4NDc2ODAxMzgiDQotCQkJdGl0bGUgICAgICAJIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDQwMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgODApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDAwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAzNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDQwMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExNjgsIDU2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDAsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiDQotCQkJCXdpZHRoICAgICAgCTQ3NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQwMg0KLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAyMjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDQwMA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg5MjgsIDIyNSkNCi0JCQkJICAgICg5MjgsIDEzNSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDQwMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYwLCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCXdpZHRoICAgICAgCTIzNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQwNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwMywgNzA2KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA0MDENCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTIwMywgNzA2KQ0KLQkJCQkgICAgKDEyMDMsIDYxNSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IiBANDA1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDYyNCwgNTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM3MiwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJCXdpZHRoICAgICAgCTUyMg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQwNg0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ0LCA3MDkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDQwNQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0NDQsIDcwOSkNCi0JCQkJICAgICg0NDQsIDYxNSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDA3DQotCQkJCWxvY2F0aW9uICAgCSgxNTcyLCA0NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDQwMw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNTcyLCA0NjUpDQotCQkJCSAgICAoMTU3MiwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDQwOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDgwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDA4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjkwLCA3NTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDQwOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDEwNTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjYyLCAxMDEzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANDEwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMDQsIDMyMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM2LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJd2lkdGggICAgICAJMzU0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDExDQotCQkJCWxvY2F0aW9uICAgCSg0NTMsIDEyMDMpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDQwOQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0NTMsIDEyMDMpDQotCQkJCSAgICAoNDUzLCAxMTExKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDQxMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMzIwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDEzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgODAwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NDYsIDc1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDE0DQotCQkJCWxvY2F0aW9uICAgCSgxODcyLCA5NTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDQxMw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxODcyLCA5NTApDQotCQkJCSAgICAoMTg3MiwgODU1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MTUNCi0JCQkJbG9jYXRpb24gICAJKDE4MSwgNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA0MTINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTgxLCA0NjUpDQotCQkJCSAgICAoMTgxLCAzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANDE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzAsIDEyMzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk1NTANCi0JCQkJaGVpZ2h0ICAgICAJMTE4DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA0MTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMTA1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNCwgMTAxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANDE4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjksIDE0NDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTY1Ng0KLQkJCQloZWlnaHQgICAgIAkxMTINCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA0MTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgMTQ4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTAzLCAxNDQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU2Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQl3aWR0aCAgICAgIAk1ODENCi0JCQkJaGVpZ2h0ICAgICAJMTEyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDQyMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1NjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANDIxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEwNTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc3OCwgMTAxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA0MjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgNTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA2LCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANDIzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTI5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2LCAxMjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJd2lkdGggICAgICAJNTEwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANDI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgNTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDQyNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxMjgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEyMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANDI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTQ4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAsIDE0NDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNjk0DQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBANDI3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQyNiwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQl3aWR0aCAgICAgIAkzMTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA0MjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDgsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQl3aWR0aCAgICAgIAk0MDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDI5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3QkIwMzQ5Ig0KLQkJCQljbGllbnQgICAgIAlANDEwDQotCQkJCXN1cHBsaWVyICAgCUA0MDANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTQsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTQsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAyKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA0MzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDgwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2OTAsIDc1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDMxDQotCQkJCWxvY2F0aW9uICAgCSg5NjIsIDk0NykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANDMwDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDk2MiwgOTQ3KQ0KLQkJCQkgICAgKDk2MiwgODU1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzMg0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzMNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE4LCAxMTU0KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMTYzNTM0DQotCQkJCSAgICBoZWlnaHQgICAgIAk2OQ0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjU1MDMyQiINCi0JCQkJY2xpZW50ICAgICAJQDQyMw0KLQkJCQlzdXBwbGllciAgIAlANDA1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDksIDEyNDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDksIDcwOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUA0MjMNCi0JCQkJc3VwcGxpZXIgICAJQDQwOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjU2LCAxMjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjU2LCAxMjAzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiINCi0JCQkJY2xpZW50ICAgICAJQDQyNA0KLQkJCQlzdXBwbGllciAgIAlANDEyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODQsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NCwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzNg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTY0MDI3OSINCi0JCQkJY2xpZW50ICAgICAJQDQyMg0KLQkJCQlzdXBwbGllciAgIAlANDAzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDAyLCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDAyLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDQwNykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QUEwMUQzIg0KLQkJCQljbGllbnQgICAgIAlANDAzDQotCQkJCXN1cHBsaWVyICAgCUA0MDANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjksIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjksIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiDQotCQkJCWNsaWVudCAgICAgCUA0MjANCi0JCQkJc3VwcGxpZXIgICAJQDQwMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5MCwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5MCwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEZDMDFFNyINCi0JCQkJY2xpZW50ICAgICAJQDQwOA0KLQkJCQlzdXBwbGllciAgIAlANDA1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MTAsIDc0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNzA5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM4MDBEMiINCi0JCQkJY2xpZW50ICAgICAJQDQyNQ0KLQkJCQlzdXBwbGllciAgIAlANDMwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzIxLCAxMjI1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyMSwgOTQ3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MzEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0MQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDINCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNywgODg2KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMjE1ODEyDQotCQkJCSAgICBoZWlnaHQgICAgIAk2NA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjE3MDAyRSINCi0JCQkJY2xpZW50ICAgICAJQDQxNw0KLQkJCQlzdXBwbGllciAgIAlANDAzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjAwLCAxMDAxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIwMCwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJY2xpZW50ICAgICAJQDQxNw0KLQkJCQlzdXBwbGllciAgIAlANDEzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDkzLCAxMDAxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgOTUwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCINCi0JCQkJY2xpZW50ICAgICAJQDQwOQ0KLQkJCQlzdXBwbGllciAgIAlANDMwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTAsIDEwMDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDk0NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDMxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0Q2NDAyMzEiDQotCQkJCWNsaWVudCAgICAgCUA0MTINCi0JCQkJc3VwcGxpZXIgICAJQDQwMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODRGNzAwOTIiDQotCQkJCWNsaWVudCAgICAgCUA0MjgNCi0JCQkJc3VwcGxpZXIgICAJQDQwMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxMiwgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxMiwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEI4MDI4NiINCi0JCQkJY2xpZW50ICAgICAJQDQwNQ0KLQkJCQlzdXBwbGllciAgIAlANDAwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzQsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgzNCwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUEyMDE5NyINCi0JCQkJY2xpZW50ICAgICAJQDQwMQ0KLQkJCQlzdXBwbGllciAgIAlANDAwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUwLCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzUwLCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDQwMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUxNzcwMTE2Ig0KLQkJCQljbGllbnQgICAgIAlANDI3DQotCQkJCXN1cHBsaWVyICAgCUA0MDANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3MiwgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTcyLCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDQwMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDUwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIg0KLQkJCQljbGllbnQgICAgIAlANDE2DQotCQkJCXN1cHBsaWVyICAgCUA0MTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTMsIDEyMjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjkzLCA5NTApDQotCQkJCWRyYXdTdXBwbGllciAJQDQxNCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDUxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBQTMwMjQyIg0KLQkJCQljbGllbnQgICAgIAlANDE4DQotCQkJCXN1cHBsaWVyICAgCUA0MDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1OTAsIDE0MzIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTkwLCA3MDYpDQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDUyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ5NDMwMkYxIg0KLQkJCQljbGllbnQgICAgIAlANDE5DQotCQkJCXN1cHBsaWVyICAgCUA0MDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzEsIDE0MzIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDMxLCA3MDYpDQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDUzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIg0KLQkJCQljbGllbnQgICAgIAlANDMwDQotCQkJCXN1cHBsaWVyICAgCUA0MDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1OSwgNzQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCA3MDYpDQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDU0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3Ig0KLQkJCQljbGllbnQgICAgIAlANDEzDQotCQkJCXN1cHBsaWVyICAgCUA0MDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NzIsIDc0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzIsIDcwNikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDNDAwOTAiDQotCQkJCWNsaWVudCAgICAgCUA0MjENCi0JCQkJc3VwcGxpZXIgICAJQDQzMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYyLCAxMDAxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTYyLCA5NDcpDQotCQkJCWRyYXdTdXBwbGllciAJQDQzMSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDU2DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQ1Nw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NSwgMTM4OCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxODcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0MjUzMQ0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjcNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QkFBMjAzMTAiDQotCQkJCWNsaWVudCAgICAgCUA0MjYNCi0JCQkJc3VwcGxpZXIgICAJQDQxMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjgsIDE0MjkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOCwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSINCi0JCQkJY2xpZW50ICAgICAJQDQyNg0KLQkJCQlzdXBwbGllciAgIAlANDA5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NTYsIDE0MjkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTYsIDEyMDMpDQotCQkJCWRyYXdTdXBwbGllciAJQDQxMSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLiBDb21wb25lbnQgUmVsYXRpb25zIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSINCi0JCQlxdWlkICAgICAgIAkiMzc0QjE4MTkwMDI4Ig0KLQkJCXRpdGxlICAgICAgCSIyLiBDb21wb25lbnQgUmVsYXRpb25zIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSINCi0JCQl6b29tICAgICAgIAk5Ng0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDQ1OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDc4NCwgMTYzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NzAsIDE1OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDYwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxNjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCAxNTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzQiIEA0NjENCi0JCQkJbG9jYXRpb24gICAJKDQ5NCwgMTYyNykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1MzAxN0EiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NvcGUiIEA0NjINCi0JCQkJCVBhcmVudF9WaWV3IAlANDYxDQotCQkJCQlsb2NhdGlvbiAgIAkoMjg2LCAtNDg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU1LCAxNTg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Njb3BlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzcxMjU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1NDAwNkQiDQotCQkJCQljbGllbnQgICAgIAlANDYxDQotCQkJCQlzdXBwbGllciAgIAlANDU5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMTYyNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjEsIDE2MjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDE2NjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTEwMTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzNSIgQDQ2NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjENCi0JCQkJCWxvY2F0aW9uICAgCSgyODYsIC00ODUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTQwMDZFIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ2MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDE2MjcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzI3LCAxNjI3KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDQ2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAxMjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODQsIDExOTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCXdpZHRoICAgICAgCTIzNA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANDY3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNzYsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1MSwgOTUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjY4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY2IiBANDY4DQotCQkJCWxvY2F0aW9uICAgCSgyMjI5LCAxMTEyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzg5MDEyMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjciIEA0NjkNCi0JCQkJCVBhcmVudF9WaWV3IAlANDY4DQotCQkJCQlsb2NhdGlvbiAgIAkoNTQ5LCAtMjQ4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzQzhBMDExMCINCi0JCQkJCWNsaWVudCAgICAgCUA0NjgNCi0JCQkJCXN1cHBsaWVyICAgCUA0NjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyOSwgMTExMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjI5LCAxMDQ1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInRlcm0iIEA0NzANCi0JCQkJCVBhcmVudF9WaWV3IAlANDY4DQotCQkJCQlsb2NhdGlvbiAgIAkoNTQ5LCAtMjQ4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE1NywgMTEyMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0ZXJtIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTM0MzI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4QTAxMTEiDQotCQkJCQljbGllbnQgICAgIAlANDY4DQotCQkJCQlzdXBwbGllciAgIAlANDY2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMjksIDExMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTE3OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNzQsIDExMTkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMTk0MDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IiBANDczDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDEyMzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgMTE5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQl3aWR0aCAgICAgIAk1MjINCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANDc0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDc2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3NywgNzI3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAkzNTINCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTQiIEA0NzUNCi0JCQkJbG9jYXRpb24gICAJKDIyMTksIDg4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzYwNjAyNkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU1IiBANDc2DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ3NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zNTcsIC0yNDApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDcwMjIxIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ3NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ3NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE5LCA4ODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxOSwgODIxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhcnRpY2xlcyIgQDQ3Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU3LCAtMjQwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwNSwgODg4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhcnRpY2xlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NjYyNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNjA3MDIyMiINCi0JCQkJCWNsaWVudCAgICAgCUA0NzUNCi0JCQkJCXN1cHBsaWVyICAgCUA0NjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxOSwgODgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDkzOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyODEsIDg4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NjYyNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDQ4MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzksIDk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5Mg0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDQ4MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDUsIDEzODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJd2lkdGggICAgICAJMzUyDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA0ODINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NywgOTUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJd2lkdGggICAgICAJNTA4DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAwIiBANDgzDQotCQkJCWxvY2F0aW9uICAgCSg1OTAsIDExNDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QUIwMjczIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwMSIgQDQ4NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODMNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDIsIDE0OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyOTEiDQotCQkJCQljbGllbnQgICAgIAlANDgzDQotCQkJCQlzdXBwbGllciAgIAlANDgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNTkwLCAxMTQwKQ0KLQkJCQkJICAgICg1NDAsIDExNDApDQotCQkJCQkgICAgKDU0MCwgMTA0NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MCwgMTE0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDAsIDEwNDUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANDg1DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4Mw0KLQkJCQkJbG9jYXRpb24gICAJKDMwMiwgMTQ4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAxMTcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjA1MzU3MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ4Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDU5MCwgMTE0MCkNCi0JCQkJCSAgICAoNjQxLCAxMTQwKQ0KLQkJCQkJICAgICg2NDEsIDEwNDUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQxLCAxMDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTg0LCAxMDk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjEyMjQ0OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA0ODgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk1NDQNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDIiIEA0ODkNCi0JCQkJbG9jYXRpb24gICAJKDExMTksIDExMTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3REYwMjRGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwMyIgQDQ5MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZEIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ4OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDEwNDUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudFR5cGUiIEA0OTENCi0JCQkJCVBhcmVudF9WaWV3IAlANDg5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1NjksIC04KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1OSwgMTEyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50VHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwODk1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0UxMDBGRSINCi0JCQkJCWNsaWVudCAgICAgCUA0ODkNCi0JCQkJCXN1cHBsaWVyICAgCUA0NzMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTExMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTc5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2MywgMTEyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwODk1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDgiIEA0OTQNCi0JCQkJbG9jYXRpb24gICAJKDE0NTUsIDk4MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQTAxMjYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA5IiBANDk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ5NA0KLQkJCQkJbG9jYXRpb24gICAJKDE1OSwgLTU3MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQjAxNTAiDQotCQkJCQljbGllbnQgICAgIAlANDk0DQotCQkJCQlzdXBwbGllciAgIAlANDg4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTUsIDk4MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjgwLCA5ODIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmQiIEA0OTYNCi0JCQkJCVBhcmVudF9WaWV3IAlANDk0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NSwgOTI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2Mjg1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkIwMTUxIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU1LCA5ODIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMCwgOTgyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDk4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1MCwgMTAyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU0Mjg1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDQiIEA0OTkNCi0JCQkJbG9jYXRpb24gICAJKDkyMSwgMTIwOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4Mzk1OTAwNkUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA1IiBANTAwDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ5OQ0KLQkJCQkJbG9jYXRpb24gICAJKC04NzEsIC0zNzYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMzQ5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ5OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIxLCAxMDQ1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVVzZXMiIEA1MDENCi0JCQkJCVBhcmVudF9WaWV3IAlANDk5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg3MSwgLTM3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTAxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3OCwgMTI1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVVc2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjY5OTM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMzRBIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ5OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIxLCAxMzcxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc5LCAxMjU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjg4MzQ0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDUwNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDc2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMiwgNzI3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTM5OA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDUwNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCAxNjMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjIzLCAxNTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQl3aWR0aCAgICAgIAk0ODQNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDUwNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCA0NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDMsIDQwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUwOA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1OCIgQDUwNw0KLQkJCQlsb2NhdGlvbiAgIAkoMjIxNiwgNjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0FDMDI1QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTkiIEA1MDgNCi0JCQkJCVBhcmVudF9WaWV3IAlANTA3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU1MiwgLTgxNikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzgiDQotCQkJCQljbGllbnQgICAgIAlANTA3DQotCQkJCQlzdXBwbGllciAgIAlANTA2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE2LCA1MDEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cCIgQDUwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTUyLCAtODE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTEwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgNjI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXAiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODI2MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzkiDQotCQkJCQljbGllbnQgICAgIAlANTA3DQotCQkJCQlzdXBwbGllciAgIAlANDc0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE2LCA3MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjU2LCA2MzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMzM2NDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANTEyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTksIDEzODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU2DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODgiIEA1MTMNCi0JCQkJbG9jYXRpb24gICAJKDE2NzYsIDEyMDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QkYwMTUwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDg5IiBANTE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDUxMw0KLQkJCQkJbG9jYXRpb24gICAJKDQxMiwgLTM0NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdDMDAwQTciDQotCQkJCQljbGllbnQgICAgIAlANTEzDQotCQkJCQlzdXBwbGllciAgIAlANTEyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NzYsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NiwgMTM3MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDUxNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTMNCi0JCQkJCWxvY2F0aW9uICAgCSg0MTIsIC0zNDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODU3LCAxMTA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjI1NzY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QzAwMEE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzYsIDEwNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjE4LCAxMTA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjE5NjMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg0IiBANTE4DQotCQkJCWxvY2F0aW9uICAgCSgxNDI5LCAxNDM4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTlGMDA4NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4NSIgQDUxOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzYzLCAtMTQ2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNUEwMDA2OSINCi0JCQkJCWNsaWVudCAgICAgCUA1MTgNCi0JCQkJCXN1cHBsaWVyICAgCUA1MTINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjEwLCAxNDM4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVVzZXMiIEA1MjANCi0JCQkJCVBhcmVudF9WaWV3IAlANTE4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDUsIDE1MDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzMjU5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDZBIg0KLQkJCQkJY2xpZW50ICAgICAJQDUxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDgsIDE0MzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI3LCAxMzkxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTYzNTM2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANTIzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDg0DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTIiIEA1MjQNCi0JCQkJbG9jYXRpb24gICAJKDc3NywgMTQyNSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NTAxMEQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTMiIEA1MjUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTI0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTUxOSwgLTM2NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NjAwRkEiDQotCQkJCQljbGllbnQgICAgIAlANTI0DQotCQkJCQlzdXBwbGllciAgIAlANDgxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTYsIDE0MjUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlRGVjbGFyYXRpb24iIEA1MjYNCi0JCQkJCVBhcmVudF9WaWV3IAlANTI0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTUxOSwgLTM2NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc4NCwgMTUwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNTkyNTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTg2MDBGQiINCi0JCQkJCWNsaWVudCAgICAgCUA1MjQNCi0JCQkJCXN1cHBsaWVyICAgCUA1MjMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc3LCAxNDI1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1OCwgMTQyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMSwgMTM4NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3MjQ0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3NiIgQDUyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM3LCAxMjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTZCMDJDQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3NyIgQDUzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUyOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUyMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzcsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3LCAxMzcxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANTMxDQotCQkJCQlQYXJlbnRfVmlldyAJQDUyOQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDQzLCA3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTMxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM4OCwgMTI0NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMzkyNjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2RDAwQTciDQotCQkJCQljbGllbnQgICAgIAlANTI5DQotCQkJCQlzdXBwbGllciAgIAlANDgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzcsIDEwNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTUsIDEyNDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjM5MjY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANTM0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgNzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OCwgNzQzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTgiIEA1MzUNCi0JCQkJbG9jYXRpb24gICAJKDcyOCwgNzc1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzM1MDM0MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5OSIgQDUzNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzUNCi0JCQkJCWxvY2F0aW9uICAgCSgtODU2LCAtNTcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzYwMjhEIg0KLQkJCQkJY2xpZW50ICAgICAJQDUzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDcyOCwgNzc1KQ0KLQkJCQkJICAgICg3ODgsIDc3NSkNCi0JCQkJCSAgICAoNzg4LCA5MzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjgsIDc3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODgsIDkzOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA1MzcNCi0JCQkJCVBhcmVudF9WaWV3IAlANTM1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1NiwgLTU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU4LCA4ODMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMTQwOTQwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzYwMjhFIg0KLQkJCQkJY2xpZW50ICAgICAJQDUzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUzNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjgsIDc3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzksIDc3NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTM3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1MCwgODEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE1MjQzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANTQwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDQ0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTQwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxNywgNDA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDAiIEA1NDENCi0JCQkJbG9jYXRpb24gICAJKDE2MjksIDU3NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RDI5RTAxNEQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVmZXJlbmNlZEtleSIgQDU0Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDENCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MSwgNjA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jZWRLZXkiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNzk3Mjk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNjUiDQotCQkJCQljbGllbnQgICAgIAlANTQxDQotCQkJCQlzdXBwbGllciAgIAlANTQwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYyOSwgNTc0KQ0KLQkJCQkJICAgICgxNTU1LCA1NzQpDQotCQkJCQkgICAgKDE1NTUsIDUwMSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjksIDU3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCA1MDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjIyLCA1MzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDc2MTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0MSIgQDU0NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDENCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEMkE4MDE2RiINCi0JCQkJCWNsaWVudCAgICAgCUA1NDENCi0JCQkJCXN1cHBsaWVyICAgCUA1NDANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjI5LCA1NzQpDQotCQkJCQkgICAgKDE2ODksIDU3NCkNCi0JCQkJCSAgICAoMTY4OSwgNDQ0KQ0KLQkJCQkJICAgICgxNjE2LCA0NDQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxNiwgNDQ0KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ0IiBANTQ2DQotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCA2MDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0NSIgQDU0Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE1LCAzMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNjUiDQotCQkJCQljbGllbnQgICAgIAlANTQ2DQotCQkJCQlzdXBwbGllciAgIAlANTQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA1MDEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmllbGRzIiBANTQ4DQotCQkJCQlQYXJlbnRfVmlldyAJQDU0Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExOSwgNjU1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQzOTI1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTc4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU0Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDUwNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNzE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MywgNjU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5OTA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MiIgQDU1MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQxNSwgNjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNEMDAzRSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDMiIEA1NTINCi0JCQkJCVBhcmVudF9WaWV3IAlANTUxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzLCAzMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMkEiDQotCQkJCQljbGllbnQgICAgIAlANTUxDQotCQkJCQlzdXBwbGllciAgIAlANTQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTUsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE1LCA1MDEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2VsZWN0b3IiIEA1NTMNCi0JCQkJCVBhcmVudF9WaWV3IAlANTUxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzLCAzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTMsIDY1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzZWxlY3RvciINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQxMTIxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTk4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjM0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU1MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDUwNA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE1LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNSwgNzE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTU1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MSwgNjUwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzkyNTIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDU1Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDIyLCA2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAk1OTkNCi0JCQkJaGVpZ2h0ICAgICAJMjA5DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODYiIEA1NTcNCi0JCQkJbG9jYXRpb24gICAJKDIzOTUsIDYwNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBNzAyM0UiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg3IiBANTU4DQotCQkJCQlQYXJlbnRfVmlldyAJQDU1Nw0KLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIDE3NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBODAzOEEiDQotCQkJCQljbGllbnQgICAgIAlANTU3DQotCQkJCQlzdXBwbGllciAgIAlANTU2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM5NSwgNjA2KQ0KLQkJCQkJICAgICgyMzk1LCA2NSkNCi0JCQkJCSAgICAoMTYxMSwgNjUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzk1LCA2MDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgNjUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibm90YXRpb25EZWNsYXJhdGlvbnMiIEA1NTkNCi0JCQkJCVBhcmVudF9WaWV3IAlANTU3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgMTc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4OSwgMTA0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK25vdGF0aW9uRGVjbGFyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQ4OTc3Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRUE4MDM4QiINCi0JCQkJCWNsaWVudCAgICAgCUA1NTcNCi0JCQkJCXN1cHBsaWVyICAgCUA1MDUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzk1LCA2MDYpDQotCQkJCQkgICAgKDIzOTUsIDE2MzMpDQotCQkJCQkgICAgKDIwOTgsIDE2MzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzk1LCA2MDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5OCwgMTYzMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNDQsIDEwNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODc4MjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgyIiBANTYyDQotCQkJCWxvY2F0aW9uICAgCSgxNzcyLCAyNDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFRkYwMjRGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4MyIgQDU2Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjINCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQ4LCAtMzI3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRjAwMDI1QSINCi0JCQkJCWNsaWVudCAgICAgCUA1NjINCi0JCQkJCXN1cHBsaWVyICAgCUA1NTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMjQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDI0OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiIEA1NjQNCi0JCQkJCVBhcmVudF9WaWV3IAlANTYyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzYsIDMzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTM1OTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNjQiDQotCQkJCQljbGllbnQgICAgIAlANTYyDQotCQkJCQlzdXBwbGllciAgIAlANTA2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTc3MiwgMjQ5KQ0KLQkJCQkJICAgICgxODMyLCAyNDkpDQotCQkJCQkgICAgKDE4MzIsIDM5NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODMyLCAzOTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAzNDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mzc4NjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc4IiBANTY3DQotCQkJCWxvY2F0aW9uICAgCSgyMzQ2LCA1MTgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTIwMjE2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3OSIgQDU2OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjcNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTQsIDg2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3MiwgMTg1NykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy42MzAwNzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU5MzAxOEIiDQotCQkJCQljbGllbnQgICAgIAlANTY3DQotCQkJCQlzdXBwbGllciAgIAlANTU2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0NiwgNTE4KQ0KLQkJCQkJICAgICgyMzQ2LCAxNDkpDQotCQkJCQkgICAgKDE2MTEsIDE0OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDUxOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCAxNDkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIgQDU3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjcNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTQsIDg2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwOCwgMTk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzQ5OTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTMwMThDIg0KLQkJCQkJY2xpZW50ICAgICAJQDU2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDUxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzNDYsIDUxOCkNCi0JCQkJCSAgICAoMjM0NiwgMTQ0MSkNCi0JCQkJCSAgICAoMjE2NiwgMTQ0MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDUxOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTY2LCAxNDQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI5OSwgMTk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0ODg2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODAiIEA1NzMNCi0JCQkJbG9jYXRpb24gICAJKDIwMywgMTU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDA0OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODEiIEA1NzQNCi0JCQkJCVBhcmVudF9WaWV3IAlANTczDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4NSwgLTI3MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU3NjAzNzQiDQotCQkJCQljbGllbnQgICAgIAlANTczDQotCQkJCQlzdXBwbGllciAgIAlANTU2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDE1OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbnMiIEA1NzUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTczDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4NSwgLTI3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM0OSwgMTk2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS40NzU3MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDM3RSINCi0JCQkJCWNsaWVudCAgICAgCUA1NzMNCi0JCQkJCXN1cHBsaWVyICAgCUA1MzQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMDMsIDE1OSkNCi0JCQkJCSAgICAoMTA0LCAxNTkpDQotCQkJCQkgICAgKDEwNCwgNzg0KQ0KLQkJCQkJICAgICgxODksIDc4NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OSwgNzg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1LCAyMDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk3MDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg0IiBANTc4DQotCQkJCWxvY2F0aW9uICAgCSgxMDg3LCAzMjkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMTcwMUVEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NSIgQDU3OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTc3LCAtMjMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMUEwMjczIg0KLQkJCQkJY2xpZW50ICAgICAJQDU3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDU1Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCAzMjkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgMjY0KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBANTgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDU3OA0KLQkJCQkJbG9jYXRpb24gICAJKC01NzcsIC0yMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzUsIDMzOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzMDk1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI4OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3RCINCi0JCQkJCWNsaWVudCAgICAgCUA1NzgNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgMzI5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDM5NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTgsIDMzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEwNzE0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzYiIEA1ODMNCi0JCQkJbG9jYXRpb24gICAJKDQ4LCAzMjApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkZERkEwMEMzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3NyIgQDU4NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0QiDQotCQkJCQljbGllbnQgICAgIAlANTgzDQotCQkJCQlzdXBwbGllciAgIAlANTU2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNDksIDMyMikNCi0JCQkJCSAgICAoNDksIDY4KQ0KLQkJCQkJICAgICgxMDEzLCA2OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5LCAzMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgNjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlRGVjbGFyYXRpb25zIiBANTg1DQotCQkJCQlQYXJlbnRfVmlldyAJQDU4Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtMjg4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM4LCAxMDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE5ODUzNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI4OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZGREZCMDI3RSINCi0JCQkJCWNsaWVudCAgICAgCUA1ODMNCi0JCQkJCXN1cHBsaWVyICAgCUA1MjMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0OSwgMzIyKQ0KLQkJCQkJICAgICg0OSwgMTQxNSkNCi0JCQkJCSAgICAoMTc0LCAxNDE1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDksIDMyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQsIDE0MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MSwgMTA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE5NjcwNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA1ODgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA0NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NSwgNDEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTUwMQ0KLQkJCQloZWlnaHQgICAgIAk5Nw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI2IiBANTg5DQotCQkJCWxvY2F0aW9uICAgCSg0OTksIDU4OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QzA1OTAxOTgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI3IiBANTkwDQotCQkJCQlQYXJlbnRfVmlldyAJQDU4OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMywgMTA5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFMyINCi0JCQkJCWNsaWVudCAgICAgCUA1ODkNCi0JCQkJCXN1cHBsaWVyICAgCUA1ODgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0OTksIDU4OSkNCi0JCQkJCSAgICAoNDUyLCA1ODkpDQotCQkJCQkgICAgKDQ1MiwgNDk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk5LCA1ODkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUyLCA0OTYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiIgQDU5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgxMSwgNTg1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJNi41MjA4MzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNUQwMUVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDU4OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU4OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ5OSwgNTg5KQ0KLQkJCQkJICAgICg1NDcsIDU4OSkNCi0JCQkJCSAgICAoNTQ3LCA0OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTksIDU4OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDcsIDQ5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ5OSwgNTU5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMCIgQDU5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMjQxLCA2MTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwMDU4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyMSIgQDU5NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1OTQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAzQkYiDQotCQkJCQljbGllbnQgICAgIAlANTk0DQotCQkJCQlzdXBwbGllciAgIAlANTg4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MSwgNDk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANTk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDU5NA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMzQzLCAtMjE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA4LCA2OTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODY0NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNjcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAzQzAiDQotCQkJCQljbGllbnQgICAgIAlANTk0DQotCQkJCQlzdXBwbGllciAgIAlANTM0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MSwgNzMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTk4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyLCA2ODUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MTAxNjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIyIiBANTk5DQotCQkJCWxvY2F0aW9uICAgCSg4MzcsIDQ2MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIzIiBANjAwDQotCQkJCQlQYXJlbnRfVmlldyAJQDU5OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xODE5LCAtNjgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU5OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU4OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzcsIDQ2MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDQ2MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDYwMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1OTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgxOSwgLTY4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCA1MjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNTE0NjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OSINCi0JCQkJCWNsaWVudCAgICAgCUA1OTkNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwOCwgNDYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCA0MDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA0MzUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc0IiBANjA0DQotCQkJCWxvY2F0aW9uICAgCSg1NDEsIDI0NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RDAxQkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc1IiBANjA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDYwNA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTIzLCAtMTg2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRThFMDE5OCINCi0JCQkJCWNsaWVudCAgICAgCUA2MDQNCi0JCQkJCXN1cHBsaWVyICAgCUA1NTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTQxLCAyNDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMjQ2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVsZW1lbnREZWNsYXJhdGlvbnMiIEA2MDYNCi0JCQkJCVBhcmVudF9WaWV3IAlANjA0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMjMsIC0xODYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDMsIDMzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA5MzAyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTkiDQotCQkJCQljbGllbnQgICAgIAlANjA0DQotCQkJCQlzdXBwbGllciAgIAlANTg4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNTQxLCAyNDYpDQotCQkJCQkgICAgKDIyNCwgMjQ2KQ0KLQkJCQkJICAgICgyMjQsIDQwMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyNCwgNDAwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2LCAzMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjQ2OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI4IiBANjA5DQotCQkJCWxvY2F0aW9uICAgCSgzNTMsIDYyMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzQyREJERDAyOTciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI5IiBANjEwDQotCQkJCQlQYXJlbnRfVmlldyAJQDYwOQ0KLQkJCQkJbG9jYXRpb24gICAJKC02MywgMTczKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNDJEQkUwMDExRSINCi0JCQkJCWNsaWVudCAgICAgCUA2MDkNCi0JCQkJCXN1cHBsaWVyICAgCUA1ODgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzNTMsIDYyMSkNCi0JCQkJCSAgICAoMzA2LCA2MjEpDQotCQkJCQkgICAgKDMwNiwgNDk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA2LCA0OTYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3Vic3RpdHV0aW9uR3JvdXAiIEA2MTENCi0JCQkJCVBhcmVudF9WaWV3IAlANjA5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzLCAxNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzksIDYzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzdWJzdGl0dXRpb25Hcm91cCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAk0LjgwODUxMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCRTAwMTI4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDYwOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU4OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDM1MywgNjIxKQ0KLQkJCQkJICAgICg0MDAsIDYyMSkNCi0JCQkJCSAgICAoNDAwLCA0OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTMsIDYyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MDAsIDQ5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM1MCwgNTgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2OTc2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMy4gQ29tcG9uZW50IEF0dHJpYnV0ZXMgIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSINCi0JCQlxdWlkICAgICAgIAkiM0I2OUU3ODYwMkM1Ig0KLQkJCXRpdGxlICAgICAgCSIzLiBDb21wb25lbnQgQXR0cmlidXRlcyAgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDYxNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDEyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NiwgNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NiwgMTA3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI0DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbmFtZSA6IFN0cmluZyINCi0JCQkJCSIrIHRhcmdldE5hbWVzcGFjZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1MzQNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANjE1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxNjQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTU2NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTUxMg0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANjE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzNjgsIDE2ODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDE1MjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTE3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDE1ODQpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk1DQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTc3DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZGVyaXZhdGlvbk1ldGhvZCA6IFhTRERlcml2YXRpb25NZXRob2QgPSByZXN0cmljdGlvbiINCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEQ29tcGxleEZpbmFsIg0KLQkJCQkJIisgYWJzdHJhY3QgOiBib29sZWFuIg0KLQkJCQkJIisgY29udGVudFR5cGVDYXRlZ29yeSA6IFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJCQkiPDwwLi4qPj4gKyBwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikpDQotCQkJCXdpZHRoICAgICAgCTExOTINCi0JCQkJaGVpZ2h0ICAgICAJMzM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYxNw0KLQkJCQlsb2NhdGlvbiAgIAkoNDYzLCAzNjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDYxNA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0NjMsIDM2MikNCi0JCQkJICAgICg0NjMsIDIyMSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA2MTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgMTYwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5NCwgMTUxOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDE1NzkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YXJpZXR5IDogWFNEVmFyaWV0eSINCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkNCi0JCQkJd2lkdGggICAgICAJNjQ2DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA2MTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTEyLCAxNDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY0NywgMzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCA5OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHJlcXVpcmVkIDogYm9vbGVhbiINCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiDQotCQkJCQkiKyBjb25zdHJhaW50IDogWFNEQ29uc3RyYWludCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NDgNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANjIwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgMTkzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4MzApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTI4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4OTApDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjk0DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IDogWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQkJIjw8MC4uKj4+ICsgbmFtZXNwYWNlQ29uc3RyYWludCA6IFN0cmluZyINCi0JCQkJCSIrIHByb2Nlc3NDb250ZW50cyA6IFhTRFByb2Nlc3NDb250ZW50cyIpKQ0KLQkJCQl3aWR0aCAgICAgIAkxMzA0DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANjIxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAxNDQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgMTM4NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJNTk2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANjIyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCA0MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCA0OTEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIg0KLQkJCQkJIisgY29uc3RyYWludCA6IFhTRENvbnN0cmFpbnQiKSkNCi0JCQkJd2lkdGggICAgICAJNTU0DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MjMNCi0JCQkJbG9jYXRpb24gICAJKDI5NCwgNjk3KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2MjINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjk0LCA2OTcpDQotCQkJCSAgICAoMjk0LCA2MDUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDYyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNTYsIDEyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NSwgNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNTQwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDYyNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjg4LCA1MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxOCwgNDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTU4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MjYNCi0JCQkJbG9jYXRpb24gICAJKDI2ODQsIDk2MikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjI1DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI2ODQsIDk2MikNCi0JCQkJICAgICgyNjg0LCA1NzYpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvc2l0b3IiIEA2MjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxMTE2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvc2l0b3IiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTA2NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlCNjIwMDM3Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbnQiIEA2MjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDUyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM4LCA0NjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWludCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDE5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2OUUyNjAxQUUiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGVyaXZhdGlvbk1ldGhvZCIgQDYyOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDIyNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODAsIDIyMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGVyaXZhdGlvbk1ldGhvZCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODAsIDIxNjMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODZBMEIwMDBDRSINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIgQDYzMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1ODQsIDE3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4MSwgODgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjA3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCAzOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjA3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NkExRTAwMjcyIg0KLQkJCQl3aWR0aCAgICAgIAk2MjUNCi0JCQkJaGVpZ2h0ICAgICAJMzAwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiIEA2MzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzA0LCAyMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDU2LCAyMTE1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDU2LCAyMDY1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTc5RjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTUxNA0KLQkJCQloZWlnaHQgICAgIAkzNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDYzMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMTYwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNTE2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFZhcmlldHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MDgsIDE0NjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSINCi0JCQkJd2lkdGggICAgICAJMzYyDQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9jZXNzQ29udGVudHMiIEA2MzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDIyNDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc2NiwgMjE1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDIxMDYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOEZGOEM3MDI4NCINCi0JCQkJd2lkdGggICAgICAJNDM4DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aFZhcmlldHkiIEA2MzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzY4LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI1ODcsIDk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoVmFyaWV0eSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI1ODcsIDQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjhGRkI4OTAzM0EiDQotCQkJCXdpZHRoICAgICAgCTM4MQ0KLQkJCQloZWlnaHQgICAgIAkyNTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA2MzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMTg3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTc4OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3MzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTg0OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MQ0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGxpc3QiDQotCQkJCQkiKyByZXN0cmljdGlvbiINCi0JCQkJCSIrIHVuaW9uIikpDQotCQkJCXdpZHRoICAgICAgCTM0NA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleEZpbmFsIiBANjM2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDIwMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDE5NDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleEZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMTg5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyQ0EwMUNCIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAyMDAxKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkNCi0JCQkJd2lkdGggICAgICAJMzgyDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiIEA2MzcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4NSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDEwNzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNTkxMDBBRSINCi0JCQkJd2lkdGggICAgICAJNjQ4DQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIgQDYzOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDQwLCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMTE2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTA2NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QTQwM0RGIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMTc2KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgc3Vic3RpdHV0aW9uIg0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkNCi0JCQkJd2lkdGggICAgICAJNTU2DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIgQDYzOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjY0LCAyMjcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMjEzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjE2MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QkUwMjcyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMjczKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkNCi0JCQkJd2lkdGggICAgICAJNTUwDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiIEA2NDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDIyNDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAyMTU0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAyMTA0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVFQTAwMjMiDQotCQkJCXdpZHRoICAgICAgCTY5Ng0KLQkJCQloZWlnaHQgICAgIAkyOTYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANjQxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyNjQsIDg4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCA3NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTM4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgODA5KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTM5Ng0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIG5pbGxhYmxlIDogYm9vbGVhbiINCi0JCQkJCSI8PDAuLio+PiArIGRpc2FsbG93ZWRTdWJzdGl0dXRpb25zIDogWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCQkiPDwwLi4qPj4gKyBzdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMgOiBYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiDQotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJMTQwNA0KLQkJCQloZWlnaHQgICAgIAkyODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiDQotCQkJCWNsaWVudCAgICAgCUA2NDENCi0JCQkJc3VwcGxpZXIgICAJQDYyMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjgxLCA3MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODEsIDY5NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjIzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA2NDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA4NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCA4MTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0OTINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDY0NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjg4LCAxMTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDIwLCAxMTAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiDQotCQkJCWNsaWVudCAgICAgCUA2NDQNCi0JCQkJc3VwcGxpZXIgICAJQDYyNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg2MiwgMTA4OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NjIsIDk2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjI2KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA2NDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM1MiwgMTMxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTY4LCAxMjYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzg2DQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NDcNCi0JCQkJbG9jYXRpb24gICAJKDIzNzUsIDE0NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDY0Ng0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyMzc1LCAxNDY1KQ0KLQkJCQkgICAgKDIzNzUsIDEzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQljbGllbnQgICAgIAlANjQ2DQotCQkJCXN1cHBsaWVyICAgCUA2MjUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNjgsIDEyNDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzY4LCA5NjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYyNikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlANjE2DQotCQkJCXN1cHBsaWVyICAgCUA2NDYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4MTgsIDE1MTIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODE4LCAxNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NDcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDYxOA0KLQkJCQlzdXBwbGllciAgIAlANjQ2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA2LCAxNTA3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwNiwgMTQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjQ3KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA2NTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxOCwgMTEwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDNDAwOTAiDQotCQkJCWNsaWVudCAgICAgCUA2NTENCi0JCQkJc3VwcGxpZXIgICAJQDYyNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExNSwgMTA4OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDk2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjI2KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDY1Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDUyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNCwgNDY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTExMzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJd2lkdGggICAgICAJMTE1MA0KLQkJCQloZWlnaHQgICAgIAkxNDQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEFBMzAyNDIiDQotCQkJCWNsaWVudCAgICAgCUA2NTMNCi0JCQkJc3VwcGxpZXIgICAJQDYxNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2OCwgNDU2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OCwgMzYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTcpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANjU1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgNzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDc4LCA3MDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDg0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTUwMg0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANjU2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MywgMjY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDk0MzAyRjEiDQotCQkJCWNsaWVudCAgICAgCUA2NTUNCi0JCQkJc3VwcGxpZXIgICAJQDYxNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI5MCwgNjkxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5MCwgMzYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCN0RDMDE5MyINCi0JCQkJY2xpZW50ICAgICAJQDY0Mw0KLQkJCQlzdXBwbGllciAgIAlANjIyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDEsIDgwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MSwgNjk3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MjMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDYyMg0KLQkJCQlzdXBwbGllciAgIAlANjE0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNzIsIDQxOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM3MiwgMzYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDYyNQ0KLQkJCQlzdXBwbGllciAgIAlANjE0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjg3LCA0NDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjg3LCAzNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYxNykpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSINCi0JCQlxdWlkICAgICAgIAkiM0I2QzMyNjUwMDVGIg0KLQkJCXRpdGxlICAgICAgCSI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIgQDY2MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgODk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDMyLCA4NDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERml4ZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiDQotCQkJCXdpZHRoICAgICAgCTMzOA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IiBANjYyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA4OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA0LCA4NDUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVwZWF0YWJsZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSINCi0JCQkJd2lkdGggICAgICAJNDUwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0IiBANjYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjYsIDExMTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERW51bWVyYXRpb25GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJCXdpZHRoICAgICAgCTQ3OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IiBANjY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc3LCAxMTEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjY1DQotCQkJCWxvY2F0aW9uICAgCSg3MTgsIDEwNDkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDY2Mg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg3MTgsIDEwNDkpDQotCQkJCSAgICAoNzE4LCA5NTkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIgQDY2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDkyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc5OSwgODcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJCXdpZHRoICAgICAgCTQyMA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IiBANjY3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgOTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzgzLCA4NzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQm91bmRlZEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTFEMDM0NCINCi0JCQkJd2lkdGggICAgICAJMzg4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IiBANjY4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAzMiwgMTEwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNywgMTA0OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQkJd2lkdGggICAgICAJNDY4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROdW1lcmljRmFjZXQiIEA2NjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCAxMTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzE5LCAxMDQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE51bWVyaWNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiDQotCQkJCXdpZHRoICAgICAgCTM4OA0KLQkJCQloZWlnaHQgICAgIAkxMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEA2NzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NTYsIDEzNzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5MSwgMTMyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCXdpZHRoICAgICAgCTM0OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiIEA2NzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDE1NTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQwNSwgMTQ5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5MZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCXdpZHRoICAgICAgCTQyNA0KLQkJCQloZWlnaHQgICAgIAkxMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjcyDQotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDEyNjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNDQsIDEyNjIpDQotCQkJCSAgICAoMTQ0LCA5NjQpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IiBANjczDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMTU1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNywgMTQ5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJCXdpZHRoICAgICAgCTQzNg0KLQkJCQloZWlnaHQgICAgIAkxMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IiBANjc0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTM3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCAxMzIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCXdpZHRoICAgICAgCTQ5OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEA2NzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDkwLCAxNjc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEluY2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSINCi0JCQkJd2lkdGggICAgICAJNDYyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCIgQDY3Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE5MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDE4NTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RXhjbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIg0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IiBANjc3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyODIsIDE2NzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDYNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBANjc4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxOTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQsIDE4NTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRXhjbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIg0KLQkJCQl3aWR0aCAgICAgIAk0NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiIEA2NzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUyLCAyMDU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRvdGFsRGlnaXRzRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCQl3aWR0aCAgICAgIAk0MjYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiIEA2ODANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzE4LCAyMDU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjgxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOUQwM0M3Ig0KLQkJCQljbGllbnQgICAgIAlANjYzDQotCQkJCXN1cHBsaWVyICAgCUA2NjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM5NCwgMTEwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM5NCwgMTA0OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg2MjAwNDUiDQotCQkJCWNsaWVudCAgICAgCUA2NzQNCi0JCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTMwOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY3MikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDY4Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMzNiwgMTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NCwgMTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkNBNTAzOEQiDQotCQkJCWNsaWVudCAgICAgCUA2NjQNCi0JCQkJc3VwcGxpZXIgICAJQDY2Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA0NCwgMTEwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNDQsIDEwNDkpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjg1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3ODAwMkRGIg0KLQkJCQljbGllbnQgICAgIAlANjcwDQotCQkJCXN1cHBsaWVyICAgCUA2NjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2MywgMTMwOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MywgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjcyKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZCIgQDY4Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNDgsIDE0MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEzMjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEyNzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCQzc3MTUyMDJFNCINCi0JCQkJd2lkdGggICAgICAJNDQ0DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eSIgQDY4Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNDgsIDE3MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDE2NjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjE5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkM3NzE1RDAwOUIiDQotCQkJCXdpZHRoICAgICAgCTQ0NA0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZSIgQDY4OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDIwMzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjEsIDE5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjEsIDE5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCRUVEMEY2MDM0MiINCi0JCQkJd2lkdGggICAgICAJNDI0DQotCQkJCWhlaWdodCAgICAgCTI4Nw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpWYWx1ZSIgQDY4OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMjA5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDYyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlZhbHVlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MwNDBCNUIwMzFGIg0KLQkJCQl3aWR0aCAgICAgIAk2MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjkwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNjEwMzM3Ig0KLQkJCQljbGllbnQgICAgIAlANjc5DQotCQkJCXN1cHBsaWVyICAgCUA2NjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAyMDQ0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY3MikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IiBANjkxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMTM3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTMsIDEzMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTMsIDEzODApDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTANCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIikpDQotCQkJCXdpZHRoICAgICAgCTMwNA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiIEA2OTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTM3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMzIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTM4MCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkNCi0JCQkJd2lkdGggICAgICAJMzA2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExRDI0MDA5OCINCi0JCQkJY2xpZW50ICAgICAJQDY5MQ0KLQkJCQlzdXBwbGllciAgIAlANjYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzUsIDEzMDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzUsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY3MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjk0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFEMzEwM0FEIg0KLQkJCQljbGllbnQgICAgIAlANjkyDQotCQkJCXN1cHBsaWVyICAgCUA2NjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDEzMDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTgxLCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjUyMDM1MyINCi0JCQkJY2xpZW50ICAgICAJQDY3Nw0KLQkJCQlzdXBwbGllciAgIAlANjkxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODUsIDE2NjQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODUsIDE0NDQpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I4MzAzQjgiDQotCQkJCWNsaWVudCAgICAgCUA2NzUNCi0JCQkJc3VwcGxpZXIgICAJQDY5Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwMCwgMTY2NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDAsIDE0NDQpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I4RTAzMDkiDQotCQkJCWNsaWVudCAgICAgCUA2NzYNCi0JCQkJc3VwcGxpZXIgICAJQDY5Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyMiwgMTg0MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjIsIDE0NDQpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNDAwQzAiDQotCQkJCWNsaWVudCAgICAgCUA2NzENCi0JCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDQ3LCAxNDg1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ3LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjdEMDBGQyINCi0JCQkJY2xpZW50ICAgICAJQDY3Mw0KLQkJCQlzdXBwbGllciAgIAlANjYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzk3LCAxNDg1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM5NywgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjcyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MDANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I5OTAwMTYiDQotCQkJCWNsaWVudCAgICAgCUA2ODANCi0JCQkJc3VwcGxpZXIgICAJQDY2MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3NSwgMjA0NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzUsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDY3MikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANzAxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMzY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NCwgMzE4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJd2lkdGggICAgICAJNDA2DQotCQkJCWhlaWdodCAgICAgCTEyNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3MDINCi0JCQkJbG9jYXRpb24gICAJKDM2NiwgNTIyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA3MDENCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMzY2LCA1MjIpDQotCQkJCSAgICAoMzY2LCA0MzApKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBANzAzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA2MjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQsIDU3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCXdpZHRoICAgICAgCTQ2Mg0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANzA0DQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDc4MSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANzAzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI3MiwgNzgxKQ0KLQkJCQkgICAgKDI3MiwgNjg3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzhGMDAyRSINCi0JCQkJY2xpZW50ICAgICAJQDY2Mg0KLQkJCQlzdXBwbGllciAgIAlANzAzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTQsIDgzMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU5NCwgNzgxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3MDQpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IiBANzA2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzUyLCA2MjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERnVuZGFtZW50YWxGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiDQotCQkJCXdpZHRoICAgICAgCTQ3MA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANzA3DQotCQkJCWxvY2F0aW9uICAgCSg3NjgsIDc4OSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANzA2DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDc2OCwgNzg5KQ0KLQkJCQkgICAgKDc2OCwgNjg3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwOA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjU5MDEyQyINCi0JCQkJY2xpZW50ICAgICAJQDY2Ng0KLQkJCQlzdXBwbGllciAgIAlANzA2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDUwLCA4NjApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDUwLCA3ODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDcwNykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzA5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2M0MwMjI0Ig0KLQkJCQljbGllbnQgICAgIAlANjY3DQotCQkJCXN1cHBsaWVyICAgCUA3MDYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MjUsIDg2MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjUsIDc4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANzA3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0RjAxMzEiDQotCQkJCWNsaWVudCAgICAgCUA2NjgNCi0JCQkJc3VwcGxpZXIgICAJQDcwNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIzNywgMTAzNikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMzcsIDc4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANzA3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0MjAwNzQiDQotCQkJCWNsaWVudCAgICAgCUA2NjkNCi0JCQkJc3VwcGxpZXIgICAJQDcwNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMTAzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDc4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANzA3KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA3MTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NiwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCA0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDEwNykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTYyOA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHZhcmlldHkgOiBYU0RWYXJpZXR5Ig0KLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk2NTYNCi0JCQkJaGVpZ2h0ICAgICAJMjUwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMiIgQDcxMw0KLQkJCQlsb2NhdGlvbiAgIAkoNzc1LCAxNzgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzEwMkVBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzMyIgQDcxNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwOSwgLTQ2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA5LCAyMzUpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3NTAxMTkiDQotCQkJCQljbGllbnQgICAgIAlANzEzDQotCQkJCQlzdXBwbGllciAgIAlANzAxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzc1LCAxNzgpDQotCQkJCQkgICAgKDU1MCwgMTc4KQ0KLQkJCQkJICAgICg1NTAsIDMwNikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NSwgMTc4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU1MCwgMzA2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzE2DQotCQkJCQlQYXJlbnRfVmlldyAJQDcxMw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjA5LCAtNDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzUsIDEzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4MzEzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzUwMTA1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDcxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDcxMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzUsIDE3OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAxNzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYxLCAyMTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTI1MDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk0IiBANzE5DQotCQkJCWxvY2F0aW9uICAgCSgzNjksIDcyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQzhBRTAyMDNBOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmYWNldHMiIEA3MjANCi0JCQkJCVBhcmVudF9WaWV3IAlANzE5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDQ5NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4NjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCQzhBRTA2MDA2NSINCi0JCQkJCWNsaWVudCAgICAgCUA3MTkNCi0JCQkJCXN1cHBsaWVyICAgCUA3MDMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzNjksIDcyKQ0KLQkJCQkJICAgICgxMDAsIDcyKQ0KLQkJCQkJICAgICgxMDAsIDU2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM2OSwgNzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwLCA1NjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNDk4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3OTAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTUiIEA3MjMNCi0JCQkJCVBhcmVudF9WaWV3IAlANzE5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzYsIDMxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JDOEFFMDYwMDUxIg0KLQkJCQkJY2xpZW50ICAgICAJQDcxOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDcxMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjksIDcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDcyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM2IiBANzI1DQotCQkJCWxvY2F0aW9uICAgCSgxNTM4LCA1MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyNg0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTM4LCA0NDkpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJCSAgICBoZWlnaHQgICAgIAk2MA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNzZEQTAwMERFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzNyIgQDcyNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDQ2LCAyODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ2LCAzNDApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwREYiDQotCQkJCQljbGllbnQgICAgIAlANzI1DQotCQkJCQlzdXBwbGllciAgIAlANzEyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzOCwgNTA4KQ0KLQkJCQkJICAgICgxNDg3LCA1MDgpDQotCQkJCQkgICAgKDE0ODcsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAyODUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaXRlbVR5cGVEZWZpbml0aW9uIiBANzI5DQotCQkJCQlQYXJlbnRfVmlldyAJQDcyNQ0KLQkJCQkJbG9jYXRpb24gICAJKC00NDYsIDI4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzI5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjMsIDU3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpdGVtVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuMjExNTM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwRTAiDQotCQkJCQljbGllbnQgICAgIAlANzI1DQotCQkJCQlzdXBwbGllciAgIAlANzEyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzOCwgNTA4KQ0KLQkJCQkJICAgICgxNTkwLCA1MDgpDQotCQkJCQkgICAgKDE1OTAsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTkwLCAyODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTM5LCA0NjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDM5ODQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk2IiBANzMyDQotCQkJCWxvY2F0aW9uICAgCSgxNzI5LCA1NzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QjcwMjA4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5NyIgQDczMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzINCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjM3LCAzNTMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzRCRTAyNTgiDQotCQkJCQljbGllbnQgICAgIAlANzMyDQotCQkJCQlzdXBwbGllciAgIAlANzEyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTcyOSwgNTc0KQ0KLQkJCQkJICAgICgxNjc4LCA1NzQpDQotCQkJCQkgICAgKDE2NzgsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MjksIDU3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc4LCAyODUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWVtYmVyVHlwZURlZmluaXRpb25zIiBANzM1DQotCQkJCQlQYXJlbnRfVmlldyAJQDczMg0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDM1MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTksIDY1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittZW1iZXJUeXBlRGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuMjY5MjMxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzRCRTAyNTkiDQotCQkJCQljbGllbnQgICAgIAlANzMyDQotCQkJCQlzdXBwbGllciAgIAlANzEyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTcyOSwgNTc0KQ0KLQkJCQkJICAgICgxNzgxLCA1NzQpDQotCQkJCQkgICAgKDE3ODEsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MjksIDU3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzgxLCAyODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzMwLCA1MjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMTIxMjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk4IiBANzM4DQotCQkJCWxvY2F0aW9uICAgCSg3NDgsIDI2OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzMjAxREIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZnVuZGFtZW50YWxGYWNldHMiIEA3MzkNCi0JCQkJCVBhcmVudF9WaWV3IAlANzM4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMzYsIDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCAzMTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZnVuZGFtZW50YWxGYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDA5MDkxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzNTAwNjMiDQotCQkJCQljbGllbnQgICAgIAlANzM4DQotCQkJCQlzdXBwbGllciAgIAlANzA2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzQ4LCAyNjkpDQotCQkJCQkgICAgKDY1OSwgMjY5KQ0KLQkJCQkJICAgICg2NTksIDU2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc0OCwgMjY5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1OSwgNTYxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzI4LCAzODUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzgwMjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5OSIgQDc0Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIzNiwgNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDUyLCAyMjgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzNTAwNTkiDQotCQkJCQljbGllbnQgICAgIAlANzM4DQotCQkJCQlzdXBwbGllciAgIAlANzEyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc0OCwgMjY5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDI2OSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMCIgQDc0NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3NSwgMzk2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDEiIEA3NDUNCi0JCQkJCVBhcmVudF9WaWV3IAlANzQ0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTgwOSwgMTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQ2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5NCwgMzE2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMjkxIg0KLQkJCQkJY2xpZW50ICAgICAJQDc0NA0KLQkJCQkJc3VwcGxpZXIgICAJQDcxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzUsIDM5NikNCi0JCQkJCSAgICAoMTEzNSwgMzk2KQ0KLQkJCQkJICAgICgxMTM1LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc1LCAzOTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzNSwgMjg1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDc0Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NDQNCi0JCQkJCWxvY2F0aW9uICAgCSgtODA5LCAxNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA0NDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjUzMzMzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc0NA0KLQkJCQkJc3VwcGxpZXIgICAJQDcxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzUsIDM5NikNCi0JCQkJCSAgICAoMTIxNSwgMzk2KQ0KLQkJCQkJICAgICgxMjE1LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc1LCAzOTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxNSwgMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQ5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MiwgMzU5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA5NjE1NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDIiIEA3NTANCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDQ0NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3MjAxNkMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAzIiBANzUxDQotCQkJCQlQYXJlbnRfVmlldyAJQDc1MA0KLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzUxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNjgsIDMyNykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1NTc1MDIyRiINCi0JCQkJCWNsaWVudCAgICAgCUA3NTANCi0JCQkJCXN1cHBsaWVyICAgCUA3MTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzYwLCA0NDYpDQotCQkJCQkgICAgKDEzMDksIDQ0NikNCi0JCQkJCSAgICAoMTMwOSwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MCwgNDQ2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDksIDI4NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIgQDc1Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNjI0LCAyMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjA0LCA1MDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcHJpbWl0aXZlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuMDAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3NTAyNDMiDQotCQkJCQljbGllbnQgICAgIAlANzUwDQotCQkJCQlzdXBwbGllciAgIAlANzEyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM2MCwgNDQ2KQ0KLQkJCQkJICAgICgxNDEyLCA0NDYpDQotCQkJCQkgICAgKDE0MTIsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDEyLCAyODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzczLCA0MDkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjIxNDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA3NTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgNTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCA0MjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCAzNzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDg4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbGlzdCINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIg0KLQkJCQkJIisgdW5pb24iKSkNCi0JCQkJd2lkdGggICAgICAJMzQ0DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RWYXJpZXR5IiBANzU3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE4LCA5MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgNDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc1OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzdCMDM5NiINCi0JCQkJY2xpZW50ICAgICAJQDcwNg0KLQkJCQlzdXBwbGllciAgIAlANzAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTEsIDU2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU5MSwgNTIyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3MDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc1OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzgwMDM5NCINCi0JCQkJY2xpZW50ICAgICAJQDcwMw0KLQkJCQlzdXBwbGllciAgIAlANzAxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzIsIDU2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MiwgNTIyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3MDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc2MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQyNTY4MDI1OSINCi0JCQkJY2xpZW50ICAgICAJQDcwMQ0KLQkJCQlzdXBwbGllciAgIAlANjgzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjYsIDMwNikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM2NiwgMjE1KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzYxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODgwMUI0Ig0KLQkJCQljbGllbnQgICAgIAlANjYxDQotCQkJCXN1cHBsaWVyICAgCUA3MDMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgODI4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3LCA3ODEpDQotCQkJCWRyYXdTdXBwbGllciAJQDcwNCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzYyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTkwMjgxIg0KLQkJCQljbGllbnQgICAgIAlANjc4DQotCQkJCXN1cHBsaWVyICAgCUA2OTENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MCwgMTg0MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MCwgMTQ0NCkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNS4gQ29tcG9uZW50IEFubm90YXRpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5RDY4RDAwRDIiDQotCQkJdGl0bGUgICAgICAJIjUuIENvbXBvbmVudCBBbm5vdGF0aW9ucyINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANzYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCXdpZHRoICAgICAgCTM1NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA3NjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE2OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgyLCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDc2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDE1MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjYsIDE0NjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBANzY2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMzA0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NjMsIDI2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCXdpZHRoICAgICAgCTQ2OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDc2Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEzMTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTYwNg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA3NjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDcwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDY2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA3NjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMTQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTEwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANzcwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA1NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA1MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANzcxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwMCwgODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNjgsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANzcyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzUwLCAxMTczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3NzMNCi0JCQkJbG9jYXRpb24gICAJKDE5OTQsIDE0MTIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDc3Mg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxOTk0LCAxNDEyKQ0KLQkJCQkgICAgKDE5OTQsIDEyNzEpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzc0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlANzY1DQotCQkJCXN1cHBsaWVyICAgCUA3NzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwODQsIDE0NDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDg0LCAxNDEyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3NzMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA3NzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDg2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAsIDgyMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQl3aWR0aCAgICAgIAk0MDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANzc2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgODApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg5MiwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAkyMzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDc3Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NCwgMzQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANzc4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCAxODEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA3NzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzkyLCAxNzEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDY3LCAxNjc0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTY2OQ0KLQkJCQloZWlnaHQgICAgIAkxMDANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzgwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlANzc5DQotCQkJCXN1cHBsaWVyICAgCUA3NzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NzIsIDE2NjIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTcyLCAxNDEyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3NzMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANzgxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxMDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3OCwgOTgxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA3ODINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA1NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzgyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4OCwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlcGVhdGFibGVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTQ1MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA3ODMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE1MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcxLCAxNDkzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJd2lkdGggICAgICAJMjkyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDc4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODcyLCA2ODUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCXdpZHRoICAgICAgCTczOA0KLQkJCQloZWlnaHQgICAgIAk1NDMNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzOCIgQDc4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoODY1LCAxMzU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDE4MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzkiIEA3ODYNCi0JCQkJCVBhcmVudF9WaWV3IAlANzg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgNTU5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDMzQyINCi0JCQkJCWNsaWVudCAgICAgCUA3ODUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY3MSwgMTM1OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDc4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5OCwgMTMyMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjExNjY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMzQ2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc4NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDg2NSwgMTM1OSkNCi0JCQkJCSAgICAoOTI1LCAxMzU5KQ0KLQkJCQkJICAgICg5MjUsIDEyMTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjUsIDEzNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI1LCAxMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTg3LCAxMjc2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA2NDIyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2MiIgQDc5MA0KLQkJCQlsb2NhdGlvbiAgIAkoNzEzLCA3MDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEYwMjEyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2MyIgQDc5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA3LCAtOTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTAwMEM5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc5MA0KLQkJCQkJc3VwcGxpZXIgICAJQDc2OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTMsIDcwOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDcwOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzkyDQotCQkJCQlQYXJlbnRfVmlldyAJQDc5MA0KLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzkyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNjY3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wOTUyMzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEwMDBEMyINCi0JCQkJCWNsaWVudCAgICAgCUA3OTANCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCA3MDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTYsIDc1MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1MzU3MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTYiIEA3OTUNCi0JCQkJbG9jYXRpb24gICAJKDcxOSwgMTE5MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNTAwOEEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU3IiBANzk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDc5NQ0KLQkJCQkJbG9jYXRpb24gICAJKC00MDEsIDM5MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNjAwOTYiDQotCQkJCQljbGllbnQgICAgIAlANzk1DQotCQkJCQlzdXBwbGllciAgIAlANzY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTE5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDExOTMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc5Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjAsIDExNDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNjk5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMEEwIg0KLQkJCQkJY2xpZW50ICAgICAJQDc5NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc4NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTksIDExOTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMTkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA2LCAxMjQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA0MTY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNiIgQDgwMA0KLQkJCQlsb2NhdGlvbiAgIAkoNzg1LCA1NTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEEwMDY2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNyIgQDgwMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDANCi0JCQkJCWxvY2F0aW9uICAgCSgtMzM1LCAtMjUwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBCMDIzRiINCi0JCQkJCWNsaWVudCAgICAgCUA4MDANCi0JCQkJCXN1cHBsaWVyICAgCUA3NzANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg1LCA1NTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCA1NTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgwMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDANCi0JCQkJCWxvY2F0aW9uICAgCSgtMzM1LCAtMjUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc5LCA1MTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzA3MDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBCMDI0OSINCi0JCQkJCWNsaWVudCAgICAgCUA4MDANCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3ODUsIDU1MCkNCi0JCQkJCSAgICAoODg0LCA1NTApDQotCQkJCQkgICAgKDg4NCwgNjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg1LCA1NTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODg0LCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MzUsIDYxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyOTczMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODgiIEA4MDUNCi0JCQkJbG9jYXRpb24gICAJKDExODQsIDQwNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NjAyOTAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg5IiBAODA2DQotCQkJCQlQYXJlbnRfVmlldyAJQDgwNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMiwgLTQxMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NzAxNjUiDQotCQkJCQljbGllbnQgICAgIAlAODA1DQotCQkJCQlzdXBwbGllciAgIAlANzcxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg0LCAxMzUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4MDcNCi0JCQkJCVBhcmVudF9WaWV3IAlAODA1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyLCAtNDEyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNCwgMjI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0OQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjY2NTQyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFNDU3MDE2RiINCi0JCQkJCWNsaWVudCAgICAgCUA4MDUNCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE4NCwgNDA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYxNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4NDM4Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDQiIEA4MTANCi0JCQkJbG9jYXRpb24gICAJKDE3NTIsIDEwMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUyOTEwMTU4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNSIgQDgxMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTANCi0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxOUYiDQotCQkJCQljbGllbnQgICAgIAlAODEwDQotCQkJCQlzdXBwbGllciAgIAlANzcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTc1MiwgMTAzNCkNCi0JCQkJCSAgICAoMTgxMiwgMTAzNCkNCi0JCQkJCSAgICAoMTgxMiwgMTE2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTIsIDEwMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgMTE2MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODEyDQotCQkJCQlQYXJlbnRfVmlldyAJQDgxMA0KLQkJCQkJbG9jYXRpb24gICAJKDUzNiwgMjE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODEzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0MywgOTk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk2MDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFMjkyMDFBOSINCi0JCQkJCWNsaWVudCAgICAgCUA4MTANCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MiwgMTAzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCAxMDM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NCwgMTA2NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MDMzMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDYiIEA4MTUNCi0JCQkJbG9jYXRpb24gICAJKDE4OTYsIDg4MSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZDRjAwODgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA3IiBAODE2DQotCQkJCQlQYXJlbnRfVmlldyAJQDgxNQ0KLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgNDApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2RDEwMTVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDgxNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE4OTYsIDg4MSkNCi0JCQkJCSAgICAoMTk1NiwgODgxKQ0KLQkJCQkJICAgICgxOTU2LCAxMTYxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg5NiwgODgxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTYsIDExNjEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGVyaXZhdGlvbkFubm90YXRpb24iIEA4MTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAODE1DQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCA0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDg0MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitkZXJpdmF0aW9uQW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1NDIzNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2RDEwMTY3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgxNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc4NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgODgxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4OSwgOTE0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA1MDg1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwOCIgQDgyMA0KLQkJCQlsb2NhdGlvbiAgIAkoMjA0MCwgNzE1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjMzMDI2NCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDkiIEA4MjENCi0JCQkJCVBhcmVudF9WaWV3IAlAODIwDQotCQkJCQlsb2NhdGlvbiAgIAkoOTIwLCAtODUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzQwMjg0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgyMA0KLQkJCQkJc3VwcGxpZXIgICAJQDc3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIwNDAsIDcxNSkNCi0JCQkJCSAgICAoMjEwMCwgNzE1KQ0KLQkJCQkJICAgICgyMTAwLCAxMTYxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA0MCwgNzE1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDAsIDExNjEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4MjINCi0JCQkJCVBhcmVudF9WaWV3IAlAODIwDQotCQkJCQlsb2NhdGlvbiAgIAkoOTIwLCAtODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzU4LCA2ODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDMxOTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjM0MDI4RSINCi0JCQkJCWNsaWVudCAgICAgCUA4MjANCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA0MCwgNzE1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDcxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDc0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwOTMxMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjYiIEA4MjUNCi0JCQkJbG9jYXRpb24gICAJKDY2OCwgODY1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjM5MTM0MDA0RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjciIEA4MjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAODI1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYxMiwgMzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzYwMENBIg0KLQkJCQkJY2xpZW50ICAgICAJQDgyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc3NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NzMsIDg2NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODI3DQotCQkJCQlQYXJlbnRfVmlldyAJQDgyNQ0KLQkJCQkJbG9jYXRpb24gICAJKC02MTIsIDMzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzE0LCA4MjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzNDE0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzYwMEQ0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc4NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDg2NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODI3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMSwgOTAzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjgyMDUxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMCIgQDgzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgMTY3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQyM0I5MDFDRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzEiIEA4MzENCi0JCQkJCVBhcmVudF9WaWV3IAlAODMwDQotCQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAtNjQ5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQyM0JBMDFDNCINCi0JCQkJCWNsaWVudCAgICAgCUA4MzANCi0JCQkJCXN1cHBsaWVyICAgCUA3NzYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDcyLCAxNjcpDQotCQkJCQkgICAgKDE0NzIsIDcyKQ0KLQkJCQkJICAgICgxODgzLCA3MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODgzLCA3MikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODMyDQotCQkJCQlQYXJlbnRfVmlldyAJQDgzMA0KLQkJCQkJbG9jYXRpb24gICAJKDI1NiwgLTY0OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgzMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDEyOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA3NjMwNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQyM0JBMDFDRSINCi0JCQkJCWNsaWVudCAgICAgCUA4MzANCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3MiwgMTY3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzIsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgzNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTksIDYxOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MzU3NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4MCIgQDgzNQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTI3LCAzNTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDYwMjkxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgxIiBAODM2DQotCQkJCQlQYXJlbnRfVmlldyAJQDgzNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xOTMsIC00NTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDcwMTcxIg0KLQkJCQkJY2xpZW50ICAgICAJQDgzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc3Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjcsIDM1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MjksIDM1MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODM3DQotCQkJCQlQYXJlbnRfVmlldyAJQDgzNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xOTMsIC00NTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDMxMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjgxNjY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDcwMTcyIg0KLQkJCQkJY2xpZW50ICAgICAJQDgzNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc4NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkyNywgMzUwKQ0KLQkJCQkJICAgICg5ODcsIDM1MCkNCi0JCQkJCSAgICAoOTg3LCA2NzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjcsIDM1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODcsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgzOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODM3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzcsIDYxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MzM0Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3MiIgQDg0MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyNywgMjIyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQURDMDJGNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MyIgQDg0MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDANCi0JCQkJCWxvY2F0aW9uICAgCSgtOTMsIC01NzgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREQwMjM4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg0MA0KLQkJCQkJc3VwcGxpZXIgICAJQDc3OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI3LCAyMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCAyMjIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg0Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDANCi0JCQkJCWxvY2F0aW9uICAgCSgtOTMsIC01NzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDAzLCAxODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40MDYyNTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDI0MiINCi0JCQkJCWNsaWVudCAgICAgCUA4NDANCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMDI3LCAyMjIpDQotCQkJCQkgICAgKDEwODcsIDIyMikNCi0JCQkJCSAgICAoMTA4NywgNjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDYxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODI1ODMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTYiIEA4NDUNCi0JCQkJbG9jYXRpb24gICAJKDE0OTQsIDE0MzgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2ODgwMUMyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk3IiBAODQ2DQotCQkJCQlQYXJlbnRfVmlldyAJQDg0NQ0KLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExMSINCi0JCQkJCWNsaWVudCAgICAgCUA4NDUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NzkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5NCwgMTQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk0LCAxNjYyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRBbm5vdGF0aW9uIiBAODQ3DQotCQkJCQlQYXJlbnRfVmlldyAJQDg0NQ0KLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NiwgMTM1NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50QW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM2NzcxMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIwMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExQiINCi0JCQkJCWNsaWVudCAgICAgCUA4NDUNCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5NCwgMTQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk0LCAxMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MywgMTI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxMzAwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTAiIEA4NTANCi0JCQkJbG9jYXRpb24gICAJKDYzNywgMTAyMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNzAyQzgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUxIiBAODUxDQotCQkJCQlQYXJlbnRfVmlldyAJQDg1MA0KLQkJCQkJbG9jYXRpb24gICAJKC00ODMsIDIyMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxODAzRTIiDQotCQkJCQljbGllbnQgICAgIAlAODUwDQotCQkJCQlzdXBwbGllciAgIAlANzgxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzNywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTEsIDEwMjIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg1Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MTAsIDk3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzI4ODg5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxOTAwMDQiDQotCQkJCQljbGllbnQgICAgIAlAODUwDQotCQkJCQlzdXBwbGllciAgIAlANzg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzNywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDEwMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEwNjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzAwODgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzAiIEA4NTUNCi0JCQkJbG9jYXRpb24gICAJKDE1ODEsIDYwNykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBNzAxMDIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzEiIEA4NTYNCi0JCQkJCVBhcmVudF9WaWV3IAlAODU1DQotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUE5MDE5MSINCi0JCQkJCWNsaWVudCAgICAgCUA4NTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3ODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTgxLCA2MDcpDQotCQkJCQkgICAgKDE1ODEsIDU0NykNCi0JCQkJCSAgICAoMTY3OSwgNTQ3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgNjA3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzksIDU0NykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDg1Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTUNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDEsIC0yMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjY5LCA0NjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuMTk2OTcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTIiDQotCQkJCQljbGllbnQgICAgIAlAODU1DQotCQkJCQlzdXBwbGllciAgIAlANzg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTgxLCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTM5LCA2MjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xOTY5NzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEwIiBAODYwDQotCQkJCWxvY2F0aW9uICAgCSg4NDksIDE0OTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTEwMjZGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMSIgQDg2MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NjANCi0JCQkJCWxvY2F0aW9uICAgCSgtMjcxLCA2OTYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTIwMUY5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg2MA0KLQkJCQkJc3VwcGxpZXIgICAJQDc4Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNDk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NjINCi0JCQkJCVBhcmVudF9WaWV3IAlAODYwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQyLCAxNDY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODgyNTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDIwMyINCi0JCQkJCWNsaWVudCAgICAgCUA4NjANCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg4NDksIDE0OTYpDQotCQkJCQkgICAgKDEwNjIsIDE0OTYpDQotCQkJCQkgICAgKDEwNjIsIDEyMTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2MiwgMTIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODYyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTUsIDEyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzI2OTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEyIiBAODY1DQotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE1NjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjMwMDA1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMyIgQDg2Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI4LCA3MzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjQwMzI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc4Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE1NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNTY1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODY3DQotCQkJCQlQYXJlbnRfVmlldyAJQDg2NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODY3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDE1MzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDQ5NTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUI0MDMzMiINCi0JCQkJCWNsaWVudCAgICAgCUA4NjUNCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5NTIsIDE1NjUpDQotCQkJCQkgICAgKDEyMDAsIDE1NjUpDQotCQkJCQkgICAgKDEyMDAsIDEyMTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE1NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwMCwgMTIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODY3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTQsIDEyNzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NzANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4MDAzOTQiDQotCQkJCWNsaWVudCAgICAgCUA3NjYNCi0JCQkJc3VwcGxpZXIgICAJQDc3Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk4NCwgMjQ5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk4NCwgMTM1KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODcxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOEYwMDJFIg0KLQkJCQljbGllbnQgICAgIAlANzgyDQotCQkJCXN1cHBsaWVyICAgCUA3NjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5OTcsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTcsIDM1OSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNi4gQ29uY3JldGUgQ29tcG9uZW50cyINCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ3NEQwM0M0Ig0KLQkJCXRpdGxlICAgICAgCSI2LiBDb25jcmV0ZSBDb21wb25lbnRzIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA4NzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiIEA4NzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MzIsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjgsIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5Ig0KLQkJCQl3aWR0aCAgICAgIAk1NDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIgQDg3NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMDAsIDY3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5OTEsIDYyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIg0KLQkJCQl3aWR0aCAgICAgIAk0MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEA4NzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1NiwgMzczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCQl3aWR0aCAgICAgIAk0MjYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg3Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNTYxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4NzUNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTM2MCwgNTYxKQ0KLQkJCQkgICAgKDEzNjAsIDQ3MSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSIgQDg3Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDExNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW5jbHVkZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM3RDAyNTAiDQotCQkJCXdpZHRoICAgICAgCTI1OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCIgQDg3OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbXBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIg0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIgQDg3OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDUsIDExNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQl3aWR0aCAgICAgIAkyODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBAODgwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODgwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzc1LCAxMTUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg1MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQl3aWR0aCAgICAgIAk4NjkNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDgiIEA4ODENCi0JCQkJbG9jYXRpb24gICAJKDEzNjgsIDEyMDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzUwMDdFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0OSIgQDg4Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4ODENCi0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzYwMDZCIg0KLQkJCQkJY2xpZW50ICAgICAJQDg4MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg3Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY4LCAxMjA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDEyMDYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg4Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4ODENCi0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzQ3LCAxMTU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTQ0MTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M2MDA2QyINCi0JCQkJCWNsaWVudCAgICAgCUA4ODENCi0JCQkJCXN1cHBsaWVyICAgCUA4ODANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM0LCAxMjA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODg1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMwMCwgMTI1MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDcNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTQ3MDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ2IiBAODg2DQotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCAxMDIyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q4MDJGQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDciIEA4ODcNCi0JCQkJCVBhcmVudF9WaWV3IAlAODg2DQotCQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAyMjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDkwMThCIg0KLQkJCQkJY2xpZW50ICAgICAJQDg4Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDg3OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNjgsIDEwMjIpDQotCQkJCQkgICAgKDExNjgsIDk2MikNCi0JCQkJCSAgICAoMTI4NSwgOTYyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjg1LCA5NjIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg4OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4ODYNCi0JCQkJCWxvY2F0aW9uICAgCSg5NjAsIDIyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODg4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTAsIDEwNzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NTM3OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q5MDE4QyINCi0JCQkJCWNsaWVudCAgICAgCUA4ODYNCi0JCQkJCXN1cHBsaWVyICAgCUA4ODANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTY4LCAxMTQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyNywgMTA3NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQzNjk3NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjgiIEA4OTENCi0JCQkJbG9jYXRpb24gICAJKDE1NjMsIDEzNTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDIwMDlBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2OSIgQDg5Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTENCi0JCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1NTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDMwMkZFIg0KLQkJCQkJY2xpZW50ICAgICAJQDg5MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg3OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1NjMsIDEzNTMpDQotCQkJCQkgICAgKDE5NDAsIDEzNTMpDQotCQkJCQkgICAgKDE5NDAsIDEyNTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NDAsIDEyNTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4OTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAODkxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTM1NSwgNTUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxNywgMTMyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxNjgwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDMwMzA4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg5MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg4MA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1NjMsIDEzNTMpDQotCQkJCQkgICAgKDExODEsIDEzNTMpDQotCQkJCQkgICAgKDExODEsIDEyNTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODEsIDEyNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTMwLCAxMzI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYxMzQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg5Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA1NjEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyODgsIDU2MSkNCi0JCQkJICAgICgyODgsIDQ3MSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA4OTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDY3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NjAsIDYyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiDQotCQkJCXdpZHRoICAgICAgCTQ3NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IiBAODk4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NTgsIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2Ig0KLQkJCQl3aWR0aCAgICAgIAk0MTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAODk5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA5NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODk5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUwLCA5MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAOTAwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI0LCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTAwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwLCA2MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTAxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIg0KLQkJCQljbGllbnQgICAgIAlAOTAwDQotCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMSwgNjE3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxLCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDg5NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTAyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3Ig0KLQkJCQljbGllbnQgICAgIAlAODk3DQotCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU4OSwgNjE3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg5LCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDg5NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTAzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyQjMwMUQ1Ig0KLQkJCQljbGllbnQgICAgIAlAODc0DQotCQkJCXN1cHBsaWVyICAgCUA4NzUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMTYsIDYxNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTYsIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODc2KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDkwNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDk0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTkwLCA5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTA1DQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCAxMDg5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5MDQNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTgyNCwgMTA4OSkNCi0JCQkJICAgICgxODI0LCA5OTkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTA2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4REMwMzgxIg0KLQkJCQljbGllbnQgICAgIAlAODc3DQotCQkJCXN1cHBsaWVyICAgCUA5MDQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjYsIDExNDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY2LCAxMDg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwNw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjY0MDI0MCINCi0JCQkJY2xpZW50ICAgICAJQDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTA0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTM0LCAxMTQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkzNCwgMTA4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTA1KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAOTA4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDY3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjMwLCA2MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJd2lkdGggICAgICAJNDM4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTA5DQotCQkJCWxvY2F0aW9uICAgCSgxNzYyLCA4MTkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDkwOA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNzYyLCA4MTkpDQotCQkJCSAgICAoMTc2MiwgNzI3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEQ5MDAzRSINCi0JCQkJY2xpZW50ICAgICAJQDg3OA0KLQkJCQlzdXBwbGllciAgIAlAOTA4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE2LCA4ODkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE2LCA4MTkpDQotCQkJCWRyYXdTdXBwbGllciAJQDkwOSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTExDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIg0KLQkJCQljbGllbnQgICAgIAlAOTA4DQotCQkJCXN1cHBsaWVyICAgCUA4NzUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTYsIDYxNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTYsIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODc2KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA5MTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDE0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzUsIDEwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCXdpZHRoICAgICAgCTUwOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMjg5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5MTINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTEyMCwgMjg5KQ0KLQkJCQkgICAgKDExMjAsIDE5OSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEwIiBAOTE0DQotCQkJCWxvY2F0aW9uICAgCSgxNDg1LCAyMTUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMDgwM0M3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRhaW5lciIgQDkxNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MTQNCi0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkxNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDIxMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250YWluZXIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMzMxMTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0UiDQotCQkJCQljbGllbnQgICAgIAlAOTE0DQotCQkJCQlzdXBwbGllciAgIAlAOTEyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ4NSwgMjE1KQ0KLQkJCQkJICAgICgxNDg1LCAxNzYpDQotCQkJCQkgICAgKDEzNzQsIDE3NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODUsIDIxNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzc0LCAxNzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM1LCAyMjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjkNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDI2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExMSIgQDkxOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MTQNCi0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0YiDQotCQkJCQljbGllbnQgICAgIAlAOTE0DQotCQkJCQlzdXBwbGllciAgIAlAOTEyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ4NSwgMjE1KQ0KLQkJCQkJICAgICgxNDg1LCAyNTQpDQotCQkJCQkgICAgKDEzNDUsIDI1NCkNCi0JCQkJCSAgICAoMTM0NSwgMTk5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NSwgMjE1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNDUsIDE5OSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExMiIgQDkxOQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAyMTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNDgwMjYxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RDb250YWluZXIiIEA5MjANCi0JCQkJCVBhcmVudF9WaWV3IAlAOTE5DQotCQkJCQlsb2NhdGlvbiAgIAkoNTMsIDEwNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMjE3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RDb250YWluZXIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI1MDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTYwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNEMwMjg1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDkxOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDkxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc3MywgMjE2KQ0KLQkJCQkJICAgICg3NzMsIDE3NikNCi0JCQkJCSAgICAoODY2LCAxNzYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjMwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEzIiBAOTIzDQotCQkJCQlQYXJlbnRfVmlldyAJQDkxOQ0KLQkJCQkJbG9jYXRpb24gICAJKDUzLCAxMDQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNEMwMjg2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDkxOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDkxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc3MywgMjE2KQ0KLQkJCQkJICAgICg3NzMsIDI1NykNCi0JCQkJCSAgICAoODk1LCAyNTcpDQotCQkJCQkgICAgKDg5NSwgMTk5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAyMTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk1LCAxOTkpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkyNA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiINCi0JCQkJY2xpZW50ICAgICAJQDg3NQ0KLQkJCQlzdXBwbGllciAgIAlAOTEyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY3LCAzNjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY3LCAyODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDkxMykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTI1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ4RTIwMEVBIg0KLQkJCQljbGllbnQgICAgIAlAODczDQotCQkJCXN1cHBsaWVyICAgCUA5MTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MiwgMzYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUyLCAyODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDkxMykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTI2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTkwM0QyIg0KLQkJCQljbGllbnQgICAgIAlAODcyDQotCQkJCXN1cHBsaWVyICAgCUA5MTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5OSwgMzYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk5LCAyODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDkxMykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDkyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxLCAxMTU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MjgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiDQotCQkJCWNsaWVudCAgICAgCUA5MjcNCi0JCQkJc3VwcGxpZXIgICAJQDkwMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE2LCAxMTQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2LCA3MjcpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI0IiBAOTI5DQotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCAxNDI1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFERDBDMDNEQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjUiIEA5MzANCi0JCQkJCVBhcmVudF9WaWV3IAlAOTI5DQotCQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMjI1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCINCi0JCQkJCWNsaWVudCAgICAgCUA5MjkNCi0JCQkJCXN1cHBsaWVyICAgCUA5MDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzgyLCAxNDI1KQ0KLQkJCQkJICAgICgyMTQ3LCAxNDI1KQ0KLQkJCQkJICAgICgyMTQ3LCA5NDMpDQotCQkJCQkgICAgKDIwNjcsIDk0MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDE0MjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NywgOTQzKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFNjaGVtYSIgQDkzMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MjkNCi0JCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAyMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDUsIDEzODkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA2NTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDUiDQotCQkJCQljbGllbnQgICAgIAlAOTI5DQotCQkJCQlzdXBwbGllciAgIAlAOTI3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM4MiwgMTQyNSkNCi0JCQkJCSAgICAoMjI1LCAxNDI1KQ0KLQkJCQkJICAgICgyMjUsIDEyNTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyNSwgMTI1NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTMxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MywgMTM5MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NjkxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjIiIEA5MzQNCi0JCQkJbG9jYXRpb24gICAJKDE1MDUsIDE1MDMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMyIgQDkzNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MzQNCi0JCQkJCWxvY2F0aW9uICAgCSgxMzEzLCAzMDMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQyIg0KLQkJCQkJY2xpZW50ICAgICAJQDkzNA0KLQkJCQkJc3VwcGxpZXIgICAJQDkwOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MDUsIDE1MDMpDQotCQkJCQkgICAgKDIxODgsIDE1MDMpDQotCQkJCQkgICAgKDIxODgsIDY3NSkNCi0JCQkJCSAgICAoMjA1OSwgNjc1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNSwgMTUwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDU5LCA2NzUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRTY2hlbWEiIEA5MzYNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTM0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTMxMywgMzAzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAzLCAxNDcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzMzMzMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDMiDQotCQkJCQljbGllbnQgICAgIAlAOTM0DQotCQkJCQlzdXBwbGllciAgIAlAOTI3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUwNSwgMTUwMykNCi0JCQkJCSAgICAoMTEzLCAxNTAzKQ0KLQkJCQkJICAgICgxMTMsIDEyNTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA1LCAxNTAzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMywgMTI1NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTM2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY3NjgzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNCIgQDkzOQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjYsIDI0NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMTAzNTYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE1IiBAOTQwDQotCQkJCQlQYXJlbnRfVmlldyAJQDkzOQ0KLQkJCQkJbG9jYXRpb24gICAJKC05NCwgLTQ0NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMzAzMzEiDQotCQkJCQljbGllbnQgICAgIAlAOTM5DQotCQkJCQlzdXBwbGllciAgIAlAOTEyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjYsIDI0NCkNCi0JCQkJCSAgICAoNjYsIDE0NCkNCi0JCQkJCSAgICAoODY2LCAxNDQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NiwgMjQ0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTQ0KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDk0MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5MzkNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQsIC00NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjUsIDkzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xNjgxMTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQzMzMDMzQiINCi0JCQkJCWNsaWVudCAgICAgCUA5MzkNCi0JCQkJCXN1cHBsaWVyICAgCUA5MjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYsIDI0NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NiwgMTE0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNiwgMTg0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTExMw0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjY1OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjc4MEJEOTAwNTkiDQotCQkJCWNsaWVudCAgICAgCUA4OTgNCi0JCQkJc3VwcGxpZXIgICAJQDkxMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1OSwgMzYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1OSwgMjg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJY2xpZW50ICAgICAJQDg4MA0KLQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0MDAsIDExNDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MDAsIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODk2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTQ2DQotCQkJCWxvY2F0aW9uICAgCSgxMDEyLCA4MzcpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDg3NA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMDEyLCA4MzcpDQotCQkJCSAgICAoMTAxMiwgNzI3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0Nw0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5NDgNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MSwgODcxKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI0Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODg4MTU4DQotCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZENEUyMDM2NiINCi0JCQkJY2xpZW50ICAgICAJQDg4MA0KLQkJCQlzdXBwbGllciAgIAlAODc0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM3LCAxMTQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAzNywgODM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0OQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5NTANCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODkwLCA4NjUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODE2MzMNCi0JCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0QkEwMjNDIg0KLQkJCQljbGllbnQgICAgIAlAODk5DQotCQkJCXN1cHBsaWVyICAgCUA4NzQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNSwgOTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI1LCA4MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDk0NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTUxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIg0KLQkJCQljbGllbnQgICAgIAlAOTA0DQotCQkJCXN1cHBsaWVyICAgCUA5MDgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjgsIDg4OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjgsIDgxOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTA5KSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjcuIENvbmNyZXRlIEF0dHJpYnV0ZXMiDQotCQkJcXVpZCAgICAgICAJIjNCOUY4Rjc2MDJDNyINCi0JCQl0aXRsZSAgICAgIAkiNy4gQ29uY3JldGUgQXR0cmlidXRlcyINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDk1Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCAxNDQwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzgsIDEzNTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDEyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzgsIDE0MTkpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBmb3JtIDogWFNERm9ybSINCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0MzANCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZvcm0iIEA5NTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYwLCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzY1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZvcm0iKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzE1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjlGOTEzQjAxRUIiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA5NTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCA5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgOTcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBlbGVtZW50IDogRE9NRWxlbWVudCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk2NzUNCi0JCQkJaGVpZ2h0ICAgICAJMTQzDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA5NTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4NDgsIDM4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODcsIDMzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDk1Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDk0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjc4LCA4OTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAOTU3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDE0MDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMTM1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJCXdpZHRoICAgICAgCTU2Mg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA5NTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4NjQsIDYyNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDU3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiDQotCQkJCXdpZHRoICAgICAgCTI1Ng0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTU5DQotCQkJCWxvY2F0aW9uICAgCSg4NTAsIDUzNykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTU1DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDg1MCwgNTM3KQ0KLQkJCQkgICAgKDg1MCwgNDQ3KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01FbGVtZW50IiBAOTYwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI0OCwgMTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDkwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTUVsZW1lbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4MTg5NzkwMjAwIg0KLQkJCQl3aWR0aCAgICAgIAk3NjkNCi0JCQkJaGVpZ2h0ICAgICAJMjAwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDk2MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNjQwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCA1ODQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJd2lkdGggICAgICAJNTEyDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDk2Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAzMzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiDQotCQkJCXdpZHRoICAgICAgCTQyMg0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTYzDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDI2MykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTU0DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDM2OCwgMjYzKQ0KLQkJCQkgICAgKDM2OCwgMTY3KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIgQDk2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDE0NTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTM0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTI5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QTQwM0RGIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDE0MDcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBzdWJzdGl0dXRpb24iDQotCQkJCQkiKyBleHRlbnNpb24iDQotCQkJCQkiKyByZXN0cmljdGlvbiINCi0JCQkJCSIrIGFsbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTYNCi0JCQkJaGVpZ2h0ICAgICAJMzQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBAOTY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMTc5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNzA4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNjU4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVCRTAyNzIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTc2OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTIzNA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIg0KLQkJCQkJIisgYWxsIikpDQotCQkJCXdpZHRoICAgICAgCTU1MA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA5NjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTEyLCAyMDk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MzIsIDIwNDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MzIsIDIxMDApDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjQNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk3NzgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBAOTY3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg3NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJCXdpZHRoICAgICAgCTM0NA0KLQkJCQloZWlnaHQgICAgIAkzNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleEZpbmFsIiBAOTY4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU0NCwgMjAxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM2MiwgMTkzMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxODgyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzJDQTAxQ0IiDQotCQkJCXdpZHRoICAgICAgCTM4Mg0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAOTY5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDEyNzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDEzMzkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzANCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB1c2UgOiBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSINCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk2NDANCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IiBAOTcwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxNjMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTU0OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNDk4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkE3QjBFODAxQTgiDQotCQkJCXdpZHRoICAgICAgCTUxMg0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDk3MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2MDgsIDkyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDk4LCA4ODEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCXdpZHRoICAgICAgCTIzOA0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDk3Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjQwLCAxNzEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU3LCAxNjMxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTk2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTcsIDE2OTEpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk5NzMNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJCSI8PDAuLio+PiArIGJsb2NrIDogWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKSkNCi0JCQkJd2lkdGggICAgICAJOTg0DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDk3Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjcyLCAxMTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMDk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTczDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTE1NikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg4OA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSI8PDAuLio+PiArIGxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50IDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTkwNg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAOTc0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTAwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIyLCA3NzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJOTk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMTAxNA0KLQkJCQloZWlnaHQgICAgIAk0ODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAOTc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCA5NjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM3LCA5MDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiINCi0JCQkJd2lkdGggICAgICAJNDI0DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA5NzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM0NCwgNjU2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDYwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDY2MCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxNA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0MzANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDk3Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDEwLCAxOTQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTAsIDIwMDIpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk4NzANCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RDb21wbGV4RmluYWwiDQotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQkJIisgbWl4ZWQgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTg3OA0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA5NzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDg4LCAxNjk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDQsIDE2NDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzODYNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTc5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQljbGllbnQgICAgIAlAOTc4DQotCQkJCXN1cHBsaWVyICAgCUA5NTcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDYsIDE2MzIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA2LCAxNDcyKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA5ODANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjA4LCA3MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTgsIDU5OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk5MDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJd2lkdGggICAgICAJOTE4DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyINCi0JCQkJY2xpZW50ICAgICAJQDk3MQ0KLQkJCQlzdXBwbGllciAgIAlAOTU1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjk2LCA4NjkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjk2LCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDk1OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTgyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQljbGllbnQgICAgIAlAOTcyDQotCQkJCXN1cHBsaWVyICAgCUA5NTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTQsIDE2MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDk0LCAxNTMzKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk4Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NywgMTg1NikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTc4DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE0ODcsIDE4NTYpDQotCQkJCSAgICAoMTQ4NywgMTc2MCkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NQXR0ciIgQDk4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MDAsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMzUwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTUF0dHIiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCAzMDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQkJGOEM4OTAxQjYiDQotCQkJCXdpZHRoICAgICAgCTY1OA0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUA5NzcNCi0JCQkJc3VwcGxpZXIgICAJQDk3OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczNCwgMTkzMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MzQsIDE4NTYpDQotCQkJCWRyYXdTdXBwbGllciAJQDk4MykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDI1NjgwMjU5Ig0KLQkJCQljbGllbnQgICAgIAlAOTc2DQotCQkJCXN1cHBsaWVyICAgCUA5NTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDU4OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiDQotCQkJCWNsaWVudCAgICAgCUA5ODANCi0JCQkJc3VwcGxpZXIgICAJQDk1NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE5MCwgNTg2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE5MCwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiINCi0JCQkJY2xpZW50ICAgICAJQDk2MQ0KLQkJCQlzdXBwbGllciAgIAlAOTYyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjIsIDU3MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMiwgNDQ3KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RTYwMzcyIg0KLQkJCQljbGllbnQgICAgIAlAOTYyDQotCQkJCXN1cHBsaWVyICAgCUA5NTQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MCwgMzIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwLCAyNjMpDQotCQkJCWRyYXdTdXBwbGllciAJQDk2MykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTkwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RDkwMDNFIg0KLQkJCQljbGllbnQgICAgIAlAOTc1DQotCQkJCXN1cHBsaWVyICAgCUA5NjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMywgODkyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIzLCA3MDgpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiDQotCQkJCWNsaWVudCAgICAgCUA5NzMNCi0JCQkJc3VwcGxpZXIgICAJQDk3MQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwMCwgMTA4NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDAsIDk4NykpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Eb2N1bWVudCIgQDk5Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDEyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1NywgOTQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzU4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NRG9jdW1lbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTU3LCA0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzU4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjc4NTBFMDM4MSINCi0JCQkJd2lkdGggICAgICAJNzc2DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiINCi0JCQkJY2xpZW50ICAgICAJQDk1NQ0KLQkJCQlzdXBwbGllciAgIAlAOTU0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTYsIDMyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NiwgMjYzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NjMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Ob2RlIiBAOTk0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjM0LCAzNTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NTm9kZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzQsIDMwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2NEE1MDExNyINCi0JCQkJd2lkdGggICAgICAJNjg2DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSINCi0JCQkJY2xpZW50ICAgICAJQDk1OA0KLQkJCQlzdXBwbGllciAgIAlAOTU1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTAsIDU2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1MCwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSINCi0JCQkJY2xpZW50ICAgICAJQDk2OQ0KLQkJCQlzdXBwbGllciAgIAlAOTU1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzUsIDEyNjcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCWNsaWVudCAgICAgCUA5NTYNCi0JCQkJc3VwcGxpZXIgICAJQDk1NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5NCwgODgwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5NCwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiINCi0JCQkJY2xpZW50ICAgICAJQDk3NA0KLQkJCQlzdXBwbGllciAgIAlAOTU4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTYsIDc2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NiwgNjg3KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk5OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcwMywgMTI5MCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTU2DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE3MDMsIDEyOTApDQotCQkJCSAgICAoMTcwMywgMTAwOCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIg0KLQkJCQljbGllbnQgICAgIAlAOTU3DQotCQkJCXN1cHBsaWVyICAgCUA5NTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDMsIDEzNDQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMjkwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5OTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMDENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciDQotCQkJCWNsaWVudCAgICAgCUA5NTINCi0JCQkJc3VwcGxpZXIgICAJQDk1Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5MywgMTM0NykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDEyOTApDQotCQkJCWRyYXdTdXBwbGllciAJQDk5OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAwMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDk2Ng0KLQkJCQlzdXBwbGllciAgIAlAOTc4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUzLCAyMDI4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1MywgMTg1NikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTgzKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjguIENvbmNyZXRlIENvbnRhaW5tZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBODA5NzAyN0EiDQotCQkJdGl0bGUgICAgICAJIjguIENvbmNyZXRlIENvbnRhaW5tZW50Ig0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBAMTAwMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NzIsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MzksIDk0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNDg0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAMTAwNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NDAsIDU3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQzMSwgNTMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTQzNg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiIEAxMDA1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgNzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAxMywgNzQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQkJd2lkdGggICAgICAJMjgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IiBAMTAwNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDU3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NCwgNTMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiDQotCQkJCXdpZHRoICAgICAgCTQzOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTAwNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTk0MywgODY4KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDA2DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE5NDMsIDg2OCkNCi0JCQkJICAgICgxOTQzLCA2MzEpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3MCIgQDEwMDgNCi0JCQkJbG9jYXRpb24gICAJKDIxMjUsIDY4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNDAwNTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTcxIiBAMTAwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU3LCAzNDQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjYwMkFEIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwMDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDA1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMjUsIDY4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCA3MjkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDEwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMDgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1NSwgNjcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTc1NDM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjYwMkI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDA2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMjUsIDY4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCA2MzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNjcsIDY3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE3NTQzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAMTAxMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMzIwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDgsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQkJd2lkdGggICAgICAJMjM0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTAxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA0NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEwMTMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjcyLCA0NjUpDQotCQkJCSAgICAoMjcyLCAzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTAxNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NTYsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzcyLCAxMTIxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU2OQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTg3DQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDEwMTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDU3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg5LCA1MzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCXdpZHRoICAgICAgCTM1Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1OCIgQDEwMTcNCi0JCQkJbG9jYXRpb24gICAJKDExNzAsIDEzNTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUMwMjVBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEAxMDE4DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTcNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY5LCAxMzg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXAiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzQwNDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDE3DQotCQkJCQlzdXBwbGllciAgIAlAMTAxNg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzAsIDEzNTYpDQotCQkJCQkgICAgKDIwNiwgMTM1NikNCi0JCQkJCSAgICAoMjA2LCA2MzEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTcwLCAxMzU2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNiwgNjMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYsIDEzMjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTkxNDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1OSIgQDEwMjENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAxNw0KLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNTIxLCAxMzk4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMTcNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDE1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3MCwgMTM1NikNCi0JCQkJCSAgICAoMjczMSwgMTM1NikNCi0JCQkJCSAgICAoMjczMSwgMTIyNykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjczMSwgMTIyNykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMTAyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MCwgMTY5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjY4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUyIiBAMTAyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyLCAxMTM2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJDRUIxMDJGOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTMiIEAxMDI1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMwLCAtMjU2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkJDRUI2MDAxQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDI0DQotCQkJCQlzdXBwbGllciAgIAlAMTAxNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIsIDExMzYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyLCA2MzEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDI2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMwLCAtMjU2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjMsIDE1MTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTA0OTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMjUiDQotCQkJCQljbGllbnQgICAgIAlAMTAyNA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMjMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIyLCAxMTM2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMiwgMTY0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwLCAxNTgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgxMTg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDEwMjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQkJd2lkdGggICAgICAJNTEzDQotCQkJCWhlaWdodCAgICAgCTEwMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY0IiBAMTAzMA0KLQkJCQlsb2NhdGlvbiAgIAkoNDcsIDg4NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxNTAxMTkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY1IiBAMTAzMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDMwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0NzFBMDNBQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDMwDQotCQkJCQlzdXBwbGllciAgIAlAMTAyMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3LCAxNjQxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDMyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzANCi0JCQkJCWxvY2F0aW9uICAgCSgtMjg5LCA4MjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MiwgMTg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjE4NTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0NzFBMDNCNSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDMwDQotCQkJCQlzdXBwbGllciAgIAlAMTAyOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3LCAxMzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDM0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI4LCAxOTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTc4ODENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAMTAzNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDg5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTIsIDg0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAkzNjMNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTAzNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTc1LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDg0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTQiIEAxMDM3DQotCQkJCWxvY2F0aW9uICAgCSgxMzE5LCAxMDM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkYxREU5MDE4QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5NSIgQDEwMzgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAzNw0KLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFQTAzNkMiDQotCQkJCQljbGllbnQgICAgIAlAMTAzNw0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMzUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMxOSwgMTAzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCA5NTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDEwMzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAzNw0KLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTAzOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDczMTcxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTIwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzgwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwMzcNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDM2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxOSwgMTExMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI3OSwgMTAzMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNDA4MTYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEAxMDQyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTY5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NSwgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCXdpZHRoICAgICAgCTQ2OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMDQzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTY5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzUsIDE2NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTAiIEAxMDQ0DQotCQkJCWxvY2F0aW9uICAgCSgxMzUxLCAxODQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E1MDExMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTEiIEAxMDQ1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjk3LCAyMjQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTcwM0I0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNDQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM1MSwgMTg0MCkNCi0JCQkJCSAgICAoMTI5NCwgMTg0MCkNCi0JCQkJCSAgICAoMTI5NCwgMTc1MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTEsIDE4NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NCwgMTc1MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwNDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0NA0KLQkJCQkJbG9jYXRpb24gICAJKC0yOTcsIDIyNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNywgMTgwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzMjY1Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E3MDNDOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDQ0DQotCQkJCQlzdXBwbGllciAgIAlAMTA0Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNTEsIDE4NDApDQotCQkJCQkgICAgKDE0MDksIDE4NDApDQotCQkJCQkgICAgKDE0MDksIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDksIDE3NTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjEsIDE4MDEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzI4NDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzQiIEAxMDQ5DQotCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAxNDMyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDA2RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIgQDEwNTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0OQ0KLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDE1MjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDQ5NzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAzMTgiDQotCQkJCQljbGllbnQgICAgIAlAMTA0OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MCwgMTQzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxNjQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAxNTI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDU0NTQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3NSIgQDEwNTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0OQ0KLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDksIDEyNjYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTBENjAzMEUiDQotCQkJCQljbGllbnQgICAgIAlAMTA0OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMzYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MCwgMTQzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxMjIzKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkyIiBAMTA1NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTY5MCwgMTY4NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRDAzNzQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmFjZXRDb250ZW50cyIgQDEwNTYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA1NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjYsIC0xMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgMTczMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldENvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDMyMDUxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMTAiDQotCQkJCQljbGllbnQgICAgIAlAMTA1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNDINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMTY4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODQ2LCAxNjg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxNjQ0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTk0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNzMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTMiIEAxMDU5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI2LCAtMTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjYsIDE2NDMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMDYiDQotCQkJCQljbGllbnQgICAgIAlAMTA1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMTY4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTM0LCAxNjg0KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDEwNjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjI0LCA3ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzODgsIDc0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJd2lkdGggICAgICAJNDkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAMTA2Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOCwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCQl3aWR0aCAgICAgIAk0MjYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMDYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NTcsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzIiIEAxMDY0DQotCQkJCWxvY2F0aW9uICAgCSg5NjMsIDMxOSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QjAwM0QiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDY1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjQNCi0JCQkJCWxvY2F0aW9uICAgCSg1OTUsIC0xNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc0LCAzNjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODEwODENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4RTZDMDExMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDY0DQotCQkJCQlzdXBwbGllciAgIAlAMTA2Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjMsIDMxOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk5LCAzMTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDY3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTYsIDI5MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5NjM5Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTczIiBAMTA2OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDY0DQotCQkJCQlsb2NhdGlvbiAgIAkoNTk1LCAtMTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDY5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NSwgMzYxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkMwMTA3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNjQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDYzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MywgMzE5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgyOCwgMzE5KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxMDcwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE2MCwgOTkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTc0LCA5NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzOTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMDcxDQotCQkJCWxvY2F0aW9uICAgCSgyMzIyLCAxNTkzKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDcwDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDIzMjIsIDE1OTMpDQotCQkJCSAgICAoMjMyMiwgMTA0NykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDcyDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDEwNzMNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNDYsIDkwNSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2MDAwMA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNQ0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkY1MDEzQSINCi0JCQkJY2xpZW50ICAgICAJQDEwNzANCi0JCQkJc3VwcGxpZXIgICAJQDEwMDYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNTAsIDkzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTAsIDg2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAwNykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDEwNzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MzIsIDU3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgNTMyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTY2Mg0KLQkJCQloZWlnaHQgICAgIAkxMTINCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExOCIgQDEwNzUNCi0JCQkJbG9jYXRpb24gICAJKDE0OTgsIDE0MzEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTQwMUFGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFub255bW91c1R5cGVEZWZpbml0aW9uIiBAMTA3Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDc1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzOCwgLTE4MTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMjcsIDE0NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQzODkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MTE1MDAxNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMDc1DQotCQkJCQlzdXBwbGllciAgIAlAMTA3MA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0OTgsIDE0MzEpDQotCQkJCQkgICAgKDIyODEsIDE0MzEpDQotCQkJCQkgICAgKDIyODEsIDEwNDcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCAxNDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyODEsIDEwNDcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDc4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyMDQsIDEzOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDU0MTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExOSIgQDEwNzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3NQ0KLQkJCQkJbG9jYXRpb24gICAJKDEwMzgsIC0xODEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDkwLCA4NjYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTYiDQotCQkJCQljbGllbnQgICAgIAlAMTA3NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNzQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDk4LCAxNDMxKQ0KLQkJCQkJICAgICgxMTMxLCAxNDMxKQ0KLQkJCQkJICAgICgxMTMxLCA2MzIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCAxNDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMzEsIDYzMikpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDEwODENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4NDgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NTUsIDExMjUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNDA0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBAMTA4Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgODk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA1LCA4NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTkwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTYwOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMiIgQDEwODMNCi0JCQkJbG9jYXRpb24gICAJKDUzNCwgNzM2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzM0VGMDE2MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDEwODQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA4Mw0KLQkJCQkJbG9jYXRpb24gICAJKDg2LCAtMjE0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIwLCA3NDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMTExMTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTkiDQotCQkJCQljbGllbnQgICAgIAlAMTA4Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEwODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTM0LCA3MzYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTM0LCA4NDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU5NSwgODA3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjc1OTI2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjMiIEAxMDg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwODMNCi0JCQkJCWxvY2F0aW9uICAgCSg4NiwgLTIxNDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgNjUzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwODMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDc0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUzNCwgNzM2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNCwgNjMyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQyIiBAMTA4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTAwLCAxMDMyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNEMDAzRSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzZWxlY3RvciIgQDEwOTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA4OQ0KLQkJCQkJbG9jYXRpb24gICAJKDg0LCAxMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDkxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTMsIDEwNDIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2VsZWN0b3IiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMjMyODgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMzQiDQotCQkJCQljbGllbnQgICAgIAlAMTA4OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwODENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTAwLCAxMDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMCwgMTExMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAxMDQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDk1ODkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDMiIEAxMDkzDQotCQkJCQlQYXJlbnRfVmlldyAJQDEwODkNCi0JCQkJCWxvY2F0aW9uICAgCSg4NCwgMTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDk2OCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIyQSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDg5DQotCQkJCQlzdXBwbGllciAgIAlAMTA4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDAsIDEwMzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAwLCA5NTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDQiIEAxMDk1DQotCQkJCWxvY2F0aW9uICAgCSg3MDAsIDEwMzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZpZWxkcyIgQDEwOTYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA5NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTYsIDEyMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE2LCAxMDM2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1NDc5NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwOTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDgxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcwMCwgMTAzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDAsIDExMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3MSwgMTA0MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEyMzA3Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ1IiBAMTA5OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDk1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTksIDk2OCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM2NSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDk1DQotCQkJCQlzdXBwbGllciAgIAlAMTA4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDAsIDEwMzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAwLCA5NTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEAxMTAxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzUyLCAxNDQwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDAsIDEzOTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJd2lkdGggICAgICAJNTIyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTEwMg0KLQkJCQlsb2NhdGlvbiAgIAkoNTUwLCAxNTkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMTAxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDU1MCwgMTU5MCkNCi0JCQkJICAgICg1NTAsIDE0OTUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDExMDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCA1NzYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNDAsIDUzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5Ig0KLQkJCQl3aWR0aCAgICAgIAk1NDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTA0DQotCQkJCWxvY2F0aW9uICAgCSgxNDA2LCA3NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDExMDMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTQwNiwgNzY1KQ0KLQkJCQkgICAgKDE0MDYsIDYzMSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAMTEwNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NTYsIDE2OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzkzLCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTU0NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMCIgQDExMDYNCi0JCQkJbG9jYXRpb24gICAJKDE2MTQsIDE4NjgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RkRERDcwMTEzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwMSIgQDExMDcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEwNg0KLQkJCQkJbG9jYXRpb24gICAJKDUyNiwgNDc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkZERERBMDI2QiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTA2DQotCQkJCQlzdXBwbGllciAgIAlAMTEwNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MTQsIDE4NjgpDQotCQkJCQkgICAgKDI1MDAsIDE4NjgpDQotCQkJCQkgICAgKDI1MDAsIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjE0LCAxODY4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1MDAsIDE3NTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDExMDgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEwNg0KLQkJCQkJbG9jYXRpb24gICAJKDUyNiwgNDc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4OTYsIDE3ODcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTg3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RkREREEwMjc1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExMDYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTAxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYxNCwgMTg2OCkNCi0JCQkJCSAgICAoOTg0LCAxODY4KQ0KLQkJCQkJICAgICg5ODQsIDE0OTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjE0LCAxODY4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4NCwgMTQ5NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0MiwgMTgyNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU3MTI4Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDYiIEAxMTExDQotCQkJCWxvY2F0aW9uICAgCSgyOTI3LCAzODcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzYwMzg2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUNvbnRlbnRzIiBAMTExMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTExDQotCQkJCQlsb2NhdGlvbiAgIAkoMjQ2MywgLTM3NTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTEzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTEyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTUsIDM1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVDb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3MzA2MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzgwMDdDIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMTENCi0JCQkJCXN1cHBsaWVyICAgCUAxMTAzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjkyNywgMzg3KQ0KLQkJCQkJICAgICgxNzUwLCAzODcpDQotCQkJCQkgICAgKDE3NTAsIDUyMSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCA1MjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTEyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDQsIDQyNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzI0Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA3IiBAMTExNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTExDQotCQkJCQlsb2NhdGlvbiAgIAkoMjQ2MywgLTM3NTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI5NDYsIDE0NDgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzODAwNzIiDQotCQkJCQljbGllbnQgICAgIAlAMTExMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExMDUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyOTI3LCAzODcpDQotCQkJCQkgICAgKDI5ODcsIDM4NykNCi0JCQkJCSAgICAoMjk4NywgMTY3MSkNCi0JCQkJCSAgICAoMjkyOCwgMTY3MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTI4LCAxNjcxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTExNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjk5LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgyIiBAMTExOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTc1MCwgODcyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDRFMDA2NyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDExMTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTExOA0KLQkJCQkJbG9jYXRpb24gICAJKDE0NjIsIC0yMzkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTExOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQwLCA2OTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTEwMzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5NDA1MDAyQTUiDQotCQkJCQljbGllbnQgICAgIAlAMTExOA0KLQkJCQkJc3VwcGxpZXIgICAJQDExMDMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgODcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDYzMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNCwgNjk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM0NDQwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4MyIgQDExMjINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTExOA0KLQkJCQkJbG9jYXRpb24gICAJKDE0NjIsIC0yMzkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzA5LCAxMDY1KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNTAwMjlCIg0KLQkJCQkJY2xpZW50ICAgICAJQDExMTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTE3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCAxMTEzKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEAxMTI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjc5LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJd2lkdGggICAgICAJMjkyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE0IiBAMTEyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI1MiwgMTg5NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4NzAyNDciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE1IiBAMTEyNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTI1DQotCQkJCQlsb2NhdGlvbiAgIAkoNzA4LCAxMjg4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRUJEQzhDMDJGOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTI1DQotCQkJCQlzdXBwbGllciAgIAlAMTEwNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNTIsIDE4OTYpDQotCQkJCQkgICAgKDI2MDMsIDE4OTYpDQotCQkJCQkgICAgKDI2MDMsIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUyLCAxODk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDMsIDE3NTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTEyNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTI1DQotCQkJCQlsb2NhdGlvbiAgIAkoNzA4LCAxMjg4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2ODIsIDE4NTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzgxMTQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4QzAzMDMiDQotCQkJCQljbGllbnQgICAgIAlAMTEyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExMjQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjUyLCAxODk2KQ0KLQkJCQkJICAgICg0MjgsIDE4OTYpDQotCQkJCQkgICAgKDQyOCwgMTIyMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTIsIDE4OTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDI4LCAxMjIzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzODIsIDE4NjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzUwMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODYiIEAxMTMwDQotCQkJCWxvY2F0aW9uICAgCSgxMTk5LCAxMzIxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjc1RDMyMDIyMCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4NyIgQDExMzENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEzMA0KLQkJCQkJbG9jYXRpb24gICAJKDY1NSwgNzEzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc1RDNDMDEwQyINCi0JCQkJCWNsaWVudCAgICAgCUAxMTMwDQotCQkJCQlzdXBwbGllciAgIAlAMTExNw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExOTksIDEzMjEpDQotCQkJCQkgICAgKDE4OTcsIDEzMjEpDQotCQkJCQkgICAgKDE4OTcsIDEyMjMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk5LCAxMzIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTcsIDEyMjMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTEzMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTMwDQotCQkJCQlsb2NhdGlvbiAgIAkoNjU1LCA3MTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTMzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NywgMTI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40Mjk1NjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc1RDNDMDEwRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMTMwDQotCQkJCQlzdXBwbGllciAgIAlAMTEyNA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExOTksIDEzMjEpDQotCQkJCQkgICAgKDUwMCwgMTMyMSkNCi0JCQkJCSAgICAoNTAwLCAxMjIzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5OSwgMTMyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDAsIDEyMjMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTM0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgMTI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4MjMwNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMzUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUAxMTA1DQotCQkJCXN1cHBsaWVyICAgCUAxMDcwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjA2LCAxNjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwNiwgMTU5MykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA3MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEzNg0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTM3DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTksIDQ5NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NjQyOQ0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNg0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjE3MDAyRSINCi0JCQkJY2xpZW50ICAgICAJQDEwNzQNCi0JCQkJc3VwcGxpZXIgICAJQDEwMTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MywgNTIwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUzLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwMTQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMzgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUAxMDQzDQotCQkJCXN1cHBsaWVyICAgCUAxMDcwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA5LCAxNjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwOSwgMTU5MykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA3MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEzOQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQwDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTksIDE1OTEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE5DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC45ODAzOTINCi0JCQkJICAgIGhlaWdodCAgICAgCTM4NQ0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjU1MDMyQiINCi0JCQkJY2xpZW50ICAgICAJQDEwNDMNCi0JCQkJc3VwcGxpZXIgICAJQDExMDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNDQsIDE2NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ0LCAxNTkwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTAyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5Ig0KLQkJCQljbGllbnQgICAgIAlAMTAxNg0KLQkJCQlzdXBwbGllciAgIAlAMTAxMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2LCA1MjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjYsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAxNCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExNDINCi0JCQkJbG9jYXRpb24gICAJKDQzMSwgMjIyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMDI5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQzMSwgMjIyKQ0KLQkJCQkgICAgKDQzMSwgMTMwKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDMNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE0NA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYxLCAyMjQpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NzY3NDQNCi0JCQkJICAgIGhlaWdodCAgICAgCTg2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyNDQwMDY5Ig0KLQkJCQljbGllbnQgICAgIAlAMTAxMw0KLQkJCQlzdXBwbGllciAgIAlAMTAyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjc1LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzUsIDIyMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE0MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExNDUNCi0JCQkJbG9jYXRpb24gICAJKDEzMDksIDQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTA2Mg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMzA5LCA0NjUpDQotCQkJCSAgICAoMTMwOSwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDYNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE0Nw0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQ2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQxLCA0OTUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjQyODYNCi0JCQkJICAgIGhlaWdodCAgICAgCTEwDQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjYwMzM5Ig0KLQkJCQljbGllbnQgICAgIAlAMTA3NA0KLQkJCQlzdXBwbGllciAgIAlAMTA2Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTMxLCA1MjApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzEsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE0NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEZDMDFFNyINCi0JCQkJY2xpZW50ICAgICAJQDEwMjMNCi0JCQkJc3VwcGxpZXIgICAJQDExMDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI1MCwgMTY0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1MCwgMTU5MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0OQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUwDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjA1LCA0OTMpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjEyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NTgzMzMNCi0JCQkJICAgIGhlaWdodCAgICAgCTgNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2MTAzQkUiDQotCQkJCWNsaWVudCAgICAgCUAxMDM2DQotCQkJCXN1cHBsaWVyICAgCUAxMDYyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTQ1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTUxDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNTINCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTEsIDkwNSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0ODk4MA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNzMNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJFQjAyQTgiDQotCQkJCWNsaWVudCAgICAgCUAxMTE3DQotCQkJCXN1cHBsaWVyICAgCUAxMDA2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODc4LCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg3OCwgODY4KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDA3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTUzDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNTQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDIsIDgwNykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxODcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3OTMxMA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjENCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAzQTAyMjEiDQotCQkJCWNsaWVudCAgICAgCUAxMTE3DQotCQkJCXN1cHBsaWVyICAgCUAxMTAzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAzLCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMywgNzY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTU1DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNTYNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTQsIDgwMSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNzANCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDczNzAzOEYiDQotCQkJCWNsaWVudCAgICAgCUAxMDM1DQotCQkJCXN1cHBsaWVyICAgCUAxMTAzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjg0LCA4MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjg0LCA3NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMDQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiDQotCQkJCWNsaWVudCAgICAgCUAxMDA1DQotCQkJCXN1cHBsaWVyICAgCUAxMDYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjg0LCA3NjIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzc5LCA3NjIpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTU4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIg0KLQkJCQljbGllbnQgICAgIAlAMTAwNA0KLQkJCQlzdXBwbGllciAgIAlAMTA2Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzNywgNTIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTQ1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTU5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIg0KLQkJCQljbGllbnQgICAgIAlAMTA2MQ0KLQkJCQlzdXBwbGllciAgIAlAMTAwNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzNywgNzI5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgNjMxKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE2MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkIzMDFENSINCi0JCQkJY2xpZW50ICAgICAJQDEwMDYNCi0JCQkJc3VwcGxpZXIgICAJQDEwNjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5NTAsIDUyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTAsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE0NSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE2MQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYyDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyODIxLCA4OTcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTgxDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODc3MTkNCi0JCQkJICAgIGhlaWdodCAgICAgCTc2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNEYwMjNDIg0KLQkJCQljbGllbnQgICAgIAlAMTAwMw0KLQkJCQlzdXBwbGllciAgIAlAMTA2Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg5NiwgOTM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg5NiwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTQ1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTYzDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNjQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMTMsIDkwNCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1MDYyMg0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjgNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJFMjAzODEiDQotCQkJCWNsaWVudCAgICAgCUAxMDE1DQotCQkJCXN1cHBsaWVyICAgCUAxMDA2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzgxLCAxMTA5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM4MSwgODY4KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDA3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTY1DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNjYNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI4NzgsIDI2OSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0NjY2Nw0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDI1NTAzODUiDQotCQkJCWNsaWVudCAgICAgCUAxMDE1DQotCQkJCXN1cHBsaWVyICAgCUAxMDI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTQzLCAxMTA5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk0MywgMjIyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTQyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTY3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQljbGllbnQgICAgIAlAMTEyNA0KLQkJCQlzdXBwbGllciAgIAlAMTAxMw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDYyLCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDYyLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwMTQpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOS4gQ29uY3JldGUgU2NoZW1hIENvbXBvc2l0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUI3QTAzOEMiDQotCQkJdGl0bGUgICAgICAJIjkuIENvbmNyZXRlIFNjaGVtYSBDb21wb3NpdGlvbiINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTE2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTUzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDkzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI0IiBAMTE2OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI4LCAxNjk1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0MUU2MDI1MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjUiIEAxMTcwDQotCQkJCQlQYXJlbnRfVmlldyAJQDExNjkNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDc2LCAtMzg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcsIDE2MjMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDFFQTAyRjciDQotCQkJCQljbGllbnQgICAgIAlAMTE2OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExNjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMjgsIDE2OTUpDQotCQkJCQkgICAgKDE3NSwgMTY5NSkNCi0JCQkJCSAgICAoMTc1LCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4LCAxNjk1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NSwgMTU5MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiIgQDExNzINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE2OQ0KLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTczDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMyOSwgMTc0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjkyNDUyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMzBCIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNjkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTY4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjI4LCAxNjk1KQ0KLQkJCQkJICAgICgyODEsIDE2OTUpDQotCQkJCQkgICAgKDI4MSwgMTU5MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOCwgMTY5NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODEsIDE1OTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOSwgMTY0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNTcxNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDExNzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxNTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzkwLCAxNDkzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTE4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjAiIEAxMTc2DQotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE2OTgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDUwMzk4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2MSIgQDExNzcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjg4LCAtMzE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NjAsIDE2MjMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0OTAzOEEiDQotCQkJCQljbGllbnQgICAgIAlAMTE3Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDExNzUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5NTIsIDE2OTgpDQotCQkJCQkgICAgKDkwMSwgMTY5OCkNCi0JCQkJCSAgICAoOTAxLCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNjk4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMSwgMTU5MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTE3OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTc2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTc5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjAsIDE3MzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjMyNjkyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzlFIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNzYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTc1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTUyLCAxNjk4KQ0KLQkJCQkJICAgICgxMDA0LCAxNjk4KQ0KLQkJCQkJICAgICgxMDA0LCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNjk4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDQsIDE1OTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTc5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgMTY0OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAMTE4Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgOTkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjAsIDk0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJd2lkdGggICAgICAJNDkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEAxMTgzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCA3ODQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxMiwgNzM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCXdpZHRoICAgICAgCTQ3NQ0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTE4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgNDE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ2LCAyODUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNDA2DQotCQkJCWhlaWdodCAgICAgCTI4Nw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjQiIEAxMTg1DQotCQkJCWxvY2F0aW9uICAgCSgxMzAzLCA2NzkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMEMwM0RCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFNjaGVtYSIgQDExODYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC00MSwgLTg1NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1OSwgMzgxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwMDM4NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTMwMywgNjc5KQ0KLQkJCQkJICAgICgxMzAzLCA0MTkpDQotCQkJCQkgICAgKDg0MywgNDE5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwMywgNjc5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNDE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjIsIDQ1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MDc0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI1IiBAMTE4OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ1LCA5NTYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDQiDQotCQkJCQljbGllbnQgICAgIAlAMTE4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzAzLCA2NzkpDQotCQkJCQkgICAgKDEzMDMsIDk5NykNCi0JCQkJCSAgICAoOTAxLCA5OTcpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzAzLCA2NzkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAxLCA5OTcpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjIiIEAxMTkxDQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCA2NDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkU2NoZW1hIiBAMTE5Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkxDQotCQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAtMTM5OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzOCwgNTAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjAxOTIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDMiDQotCQkJCQljbGllbnQgICAgIAlAMTE5MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjE2LCA2NDkpDQotCQkJCQkgICAgKDEyMTYsIDUzNCkNCi0JCQkJCSAgICAoODQzLCA1MzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA1MzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkyNiwgNTc3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODMxNjQzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjMiIEAxMTk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTENCi0JCQkJCWxvY2F0aW9uICAgCSgzMzYsIC0xMzk5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzQsIDc1NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTkxDQotCQkJCQlzdXBwbGllciAgIAlAMTE4Mw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMTYsIDY0OSkNCi0JCQkJCSAgICAoMTIxNiwgNzk3KQ0KLQkJCQkJICAgICg4NzcsIDc5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTYsIDY0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDc5NykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyOCIgQDExOTcNCi0JCQkJbG9jYXRpb24gICAJKDY2MiwgNjQyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVEM0E2MDEzMSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiIEAxMTk4DQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjM0LCAxMTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgNjc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jaW5nRGlyZWN0aXZlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQwODc1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIxNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVEM0E5MDM3MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTk3DQotCQkJCQlzdXBwbGllciAgIAlAMTE4Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjIsIDcyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE1LCA2NzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzA2NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyOSIgQDEyMDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5Nw0KLQkJCQkJbG9jYXRpb24gICAJKC0yMzQsIDExNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIxLCA1NzYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzAiDQotCQkJCQljbGllbnQgICAgIAlAMTE5Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYyLCA2NDIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYyLCA1NTkpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzAiIEAxMjAzDQotCQkJCWxvY2F0aW9uICAgCSg3NSwgMTg4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVFQ0YwMDA1RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzEiIEAxMjA0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAtMzA4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFQ0Y0MDAxRSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjAzDQotCQkJCQlzdXBwbGllciAgIAlAMTE4NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc1LCAxODgpDQotCQkJCQkgICAgKDc1LCAxMjgpDQotCQkJCQkgICAgKDUxMCwgMTI4KQ0KLQkJCQkJICAgICg1MTAsIDI3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAxODgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCAyNzMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFZlcnNpb24iIEAxMjA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAtMzA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDc0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RWZXJzaW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjU5Mzc1MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFQ0Y0MDAyOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjAzDQotCQkJCQlzdXBwbGllciAgIAlAMTE4NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc1LCAxODgpDQotCQkJCQkgICAgKDc1LCAzODApDQotCQkJCQkgICAgKDQzNywgMzgwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDE4OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDM4MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzY4LCAzMjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzQ3NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMyIiBAMTIwOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMTM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjVFRDBCMDExQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzMiIEAxMjA5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDgNCi0JCQkJCWxvY2F0aW9uICAgCSgzMzQsIC0zNjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTIxIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2MiwgMTM0KQ0KLQkJCQkJICAgICg3NjYsIDEzNCkNCi0JCQkJCSAgICAoNzY2LCAyNzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAxMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzY2LCAyNzMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JpZ2luYWxWZXJzaW9uIiBAMTIxMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjA4DQotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTY0LCA5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitvcmlnaW5hbFZlcnNpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNjUwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwRjAxMkIiDQotCQkJCQljbGllbnQgICAgIAlAMTIwOA0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYyLCAxMzQpDQotCQkJCQkgICAgKDEzMjIsIDEzNCkNCi0JCQkJCSAgICAoMTMyMiwgMzM0KQ0KLQkJCQkJICAgICg4NDMsIDMzNCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDMzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTgxMDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM0IiBAMTIxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTI2LCA2NTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVFQUIwMDFGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzNSIgQDEyMTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxMw0KLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMEIiDQotCQkJCQljbGllbnQgICAgIAlAMTIxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYsIDY1NikNCi0JCQkJCSAgICAoNTEzLCA2NTYpDQotCQkJCQkgICAgKDUxMywgNTU5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2LCA2NTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEzLCA1NTkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiIEAxMjE1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtODM0LCAxNjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgNDMxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFZlcnNpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzOTAyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMTUiDQotCQkJCQljbGllbnQgICAgIAlAMTIxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYsIDY1NikNCi0JCQkJCSAgICAoNjYsIDY1NikNCi0JCQkJCSAgICAoNjYsIDQ3MikNCi0JCQkJCSAgICAoNDM3LCA0NzIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYsIDY1NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDQ3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzU2LCA1MjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Njg0NjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM4IiBAMTIxOA0KLQkJCQlsb2NhdGlvbiAgIAkoNjQyLCAxMjYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzMwMTk0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzOSIgQDEyMTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxOA0KLQkJCQkJbG9jYXRpb24gICAJKDgyLCAtNDE4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc4NDc1MDFGMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjE4DQotCQkJCQlzdXBwbGllciAgIAlAMTE4NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDY0MiwgMTI2KQ0KLQkJCQkJICAgICg1ODgsIDEyNikNCi0JCQkJCSAgICAoNTg4LCAyNzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODgsIDI3MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWFGb3JTY2hlbWEiIEAxMjIwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTgNCi0JCQkJCWxvY2F0aW9uICAgCSg4MiwgLTQxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM5LCA3NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWFGb3JTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU1NTU2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3NTAxRkIiDQotCQkJCQljbGllbnQgICAgIAlAMTIxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDExODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2NDIsIDEyNikNCi0JCQkJCSAgICAoNjk3LCAxMjYpDQotCQkJCQkgICAgKDY5NywgMjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjQyLCAxMjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjk3LCAyNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0MywgMjEzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAxODYzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTIyMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiINCi0JCQkJY2xpZW50ICAgICAJQDExODINCi0JCQkJc3VwcGxpZXIgICAJQDExODMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzOCwgOTM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM4LCA4NDMpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMjI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcsIDExNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0OTINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc4IiBAMTIyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCAxMzQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0MjZCMDE5NCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3OSIgQDEyMjYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIyNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAsIDEyNzEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2RDAzMDkiDQotCQkJCQljbGllbnQgICAgIAlAMTIyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMjQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQsIDEzNDApDQotCQkJCQkgICAgKDE4MSwgMTM0MCkNCi0JCQkJCSAgICAoMTgxLCAxMjM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MSwgMTIzOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTIyOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxMCwgLTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjI5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzMywgMTM4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuODY3OTI1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2RDAzMTMiDQotCQkJCQljbGllbnQgICAgIAlAMTIyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMjQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzQsIDEzNDApDQotCQkJCQkgICAgKDI4NywgMTM0MCkNCi0JCQkJCSAgICAoMjg3LCAxMjM5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NywgMTIzOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCAxMjk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQyOTQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTIzMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NjAsIDE0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTcsIDEwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUwNA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEAxMjMyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcxMiwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk5LCAzNzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAkyNDQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxMiIgQDEyMzMNCi0JCQkJbG9jYXRpb24gICAJKDE2NjgsIDI4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRTAxQ0MiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzEzIiBAMTIzNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjMzDQotCQkJCQlsb2NhdGlvbiAgIAkoOCwgLTE1MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRjAxMEYiDQotCQkJCQljbGllbnQgICAgIAlAMTIzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjgsIDE5OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNGYWNldHMiIEAxMjM1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzMNCi0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUyLCAzMDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljRmFjZXRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjQ2MTU0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTFBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjMyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjgsIDI4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY4LCAzNjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjUsIDMwMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjkyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEyMzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDI2LCA5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEyMzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA2NDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE1LCA1OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNTQwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTQiIEAxMjQwDQotCQkJCWxvY2F0aW9uICAgCSgxNTA4LCA3OTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDMwMjhFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxNSIgQDEyNDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI0MA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRjMiDQotCQkJCQljbGllbnQgICAgIAlAMTI0MA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMzkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwOCwgNzkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDgsIDY5NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNQYXJ0aWNsZSIgQDEyNDINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI0MA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgNzY3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY1BhcnRpY2xlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI1OTI1OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE4Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEQ0MDJGRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjQwDQotCQkJCQlzdXBwbGllciAgIAlAMTIzOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwOCwgODg5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDU0LCA4MjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTUwNjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTI0NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTYsIDExNDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5MCIgQDEyNDYNCi0JCQkJbG9jYXRpb24gICAJKDkxOSwgMTM0OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI1RTAxRjkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTEiIEAxMjQ3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQ4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyNSwgMTI3MykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjYyMDA0NiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjQ2DQotCQkJCQlzdXBwbGllciAgIAlAMTI0NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkxOSwgMTM0OSkNCi0JCQkJCSAgICAoODY2LCAxMzQ5KQ0KLQkJCQkJICAgICg4NjYsIDEyMzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxMjM5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTI0OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTIzMywgLTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5OTMsIDEzOTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4zNzczNTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjYyMDA1MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjQ2DQotCQkJCQlzdXBwbGllciAgIAlAMTI0NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkxOSwgMTM0OSkNCi0JCQkJCSAgICAoOTczLCAxMzQ5KQ0KLQkJCQkJICAgICg5NzMsIDEyMzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTczLCAxMjM5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MTksIDEyOTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDE0OTI1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTI1Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NTIsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTYsIDkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiDQotCQkJCXdpZHRoICAgICAgCTI5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzE2IiBAMTI1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMjAyNSwgNzkyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQ5MDFGNiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTciIEAxMjU0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNTMNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0REEwMjg0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjM5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMjUsIDc5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA2OTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjU1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNTMNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjU2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjYsIDgzOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4ODA5NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIwMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNERBMDI4RSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjUzDQotCQkJCQlzdXBwbGllciAgIAlAMTI1Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyNSwgODg5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI1Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDk4LCA4NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYxNzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzE4IiBAMTI1OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTc1NCwgMTE3OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRDNjhGRjAxQkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzE5IiBAMTI1OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjU4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE5OCwgMjM0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjU4DQotCQkJCQlzdXBwbGllciAgIAlAMTI0NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDEsIDExNzgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjYwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjYxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEyNjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNjMzNTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjU4DQotCQkJCQlzdXBwbGllciAgIAlAMTI1Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3NTQsIDExNzgpDQotCQkJCQkgICAgKDIwMjgsIDExNzgpDQotCQkJCQkgICAgKDIwMjgsIDk5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTQsIDExNzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyOCwgOTk5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgyLCAxMDk4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzgzNjY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIxMC4gRGlhZ25vc3RpY3MiDQotCQkJcXVpZCAgICAgICAJIjNCRkU1RjA4MDNFMiINCi0JCQl0aXRsZSAgICAgIAkiMTAuIERpYWdub3N0aWNzIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Ob2RlIiBAMTI2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMTAyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCA5OTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NTm9kZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgOTQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3Ig0KLQkJCQl3aWR0aCAgICAgIAk2ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWNTZXZlcml0eSIgQDEyNjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCA2NTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTgsIDU0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA0OTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2OEE3MDMyRiINCi0JCQkJd2lkdGggICAgICAJNDYyDQotCQkJCWhlaWdodCAgICAgCTM0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMjY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTksIDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjY2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg5NiwgMTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NDAsIDYyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcxMw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJd2lkdGggICAgICAJNzMxDQotCQkJCWhlaWdodCAgICAgCTEyNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIiBAMTI2Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgNjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQsIDQwMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJd2lkdGggICAgICAJNjU4DQotCQkJCWhlaWdodCAgICAgCTQzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjAiIEAxMjY4DQotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDI4MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMTAzNUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIxIiBAMTI2OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjY4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwODgsIC02NjEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzIwMUM2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMTc2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFsbERpYWdub3N0aWNzIiBAMTI3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjY4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwODgsIC02NjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwOSwgMzMwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2FsbERpYWdub3N0aWNzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ4NTk4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzIwMUM3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMzkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgMzI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNTYxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNiIgQDEyNzMNCi0JCQkJbG9jYXRpb24gICAJKDEwMjgsIDQ0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyNzAzQ0QiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE3IiBAMTI3NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjczDQotCQkJCQlsb2NhdGlvbiAgIAkoLTM5NiwgLTcyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjczDQotCQkJCQlzdXBwbGllciAgIAlAMTI2Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI4LCA0NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzEzLCA0NDApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcG9uZW50cyIgQDEyNzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI3Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0zOTYsIC03MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM4LCAyMzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29tcG9uZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyOTE4MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2QyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjczDQotCQkJCQlzdXBwbGllciAgIAlAMTI2Ng0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwMjgsIDQ0MCkNCi0JCQkJCSAgICAoMTA4OCwgNDQwKQ0KLQkJCQkJICAgICgxMDg4LCAxNzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI4LCA0NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4OCwgMTc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAyMzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjM4NDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE4IiBAMTI3OA0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAyODIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNjkwMTY1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxOSIgQDEyNzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI3OA0KLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjYiDQotCQkJCQljbGllbnQgICAgIAlAMTI3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCAyODIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjg4LCAxNzQpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGlhZ25vc3RpY3MiIEAxMjgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNzgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNjAsIC0yNzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMiwgMzMwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2RpYWdub3N0aWNzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDUyNjMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNkEwMDI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyNzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgMjgyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMzkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDUsIDMzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5NDczNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyODMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRDMEY0QzAxQTEiDQotCQkJCWNsaWVudCAgICAgCUAxMjY3DQotCQkJCXN1cHBsaWVyICAgCUAxMjY2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzUsIDM5MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTc0KSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIxMS4gU3VwcGxlbWVudGFsIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4N0U0OTAxOUIiDQotCQkJdGl0bGUgICAgICAJIjExLiBTdXBwbGVtZW50YWwiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NjQsIDgxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA3NjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJODUyDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyODUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTEyLCA4ODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzMxLCA4MjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk3ODANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAMTI4Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDExMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJd2lkdGggICAgICAJNDk4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIiBAMTI4Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzg0LCAxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMjM2LCA2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDIiIEAxMjg4DQotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCA4NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNTAxMzciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWFyeUNvbXBvbmVudCIgQDEyODkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI4OA0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTAsIC01MDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1NiwgMTE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3ByaW1hcnlDb21wb25lbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDA4MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MkM3MDExMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjg4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCA4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzcsIDg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjQsIDU1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk3MjYwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDMiIEAxMjkyDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDU4LCAxMjYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNzAxMTIiDQotCQkJCQljbGllbnQgICAgIAlAMTI4OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyNywgODQpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMjk0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNjAsIDY4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDYwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3OCwgNjY3KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzY0DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIDogYm9vbGVhbiINCi0JCQkJCSIrIGNpcmN1bGFyIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk3ODINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTI5NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAxMDcyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCA5OTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgMTA1MSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1OQ0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGZhY2V0TmFtZSA6IFN0cmluZyINCi0JCQkJCSIrIGVmZmVjdGl2ZVZhbHVlIDogVmFsdWUiKSkNCi0JCQkJd2lkdGggICAgICAJNDU4DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEyOTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCA2MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgNTY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTgwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA2MjgpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4MDUNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBtb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJODIwDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDEyOTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgMjg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCAxNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNSwgMjE3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgYWxpYXNOYW1lIDogU3RyaW5nIg0KLQkJCQkJIisgdVJJIDogU3RyaW5nIg0KLQkJCQkJIisgYWxpYXNVUkkgOiBTdHJpbmciDQotCQkJCQkiKyBxTmFtZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0NzINCi0JCQkJaGVpZ2h0ICAgICAJMjg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAMTI5OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMzUyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgMjk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTYyDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMjk5DQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDUxMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTI5OA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgzMjAsIDUxMCkNCi0JCQkJICAgICgzMjAsIDQyMCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMzAwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQljbGllbnQgICAgIAlAMTI5Ng0KLQkJCQlzdXBwbGllciAgIAlAMTI5OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODEsIDU1NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxLCA1MTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEyOTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEzMDENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiDQotCQkJCWNsaWVudCAgICAgCUAxMjg0DQotCQkJCXN1cHBsaWVyICAgCUAxMjk4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NzcsIDc0OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg3NywgNTEwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjk5KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEAxMzAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDE4MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAxLCAxNzYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEluY2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSINCi0JCQkJd2lkdGggICAgICAJNDU2DQotCQkJCWhlaWdodCAgICAgCTExOQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDEzMDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxNzc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE3MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5Ig0KLQkJCQl3aWR0aCAgICAgIAk0OTMNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBAMTMwNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDE5MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTg4OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5FeGNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiDQotCQkJCXdpZHRoICAgICAgCTQ5Mw0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiIEAxMzA1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDE5NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDczLCAxOTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiINCi0JCQkJd2lkdGggICAgICAJNDgwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IiBAMTMwNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNCwgMTM3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQkJd2lkdGggICAgICAJNDIyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RCb3VuZGVkRmFjZXQiIEAxMzA3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEyNjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTYzLCAxMjEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREJvdW5kZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiDQotCQkJCXdpZHRoICAgICAgCTM5Ng0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0IiBAMTMwOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDEzOTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MywgMTM0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4Ig0KLQkJCQl3aWR0aCAgICAgIAkzODANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIgQDEzMDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxMjMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDksIDExNzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETnVtZXJpY0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQkJd2lkdGggICAgICAJNDAwDQotCQkJCWhlaWdodCAgICAgCTEzMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIgQDEzMTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTYxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNSwgMTUzNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM1LCAxNTk1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA1DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgaW5jbHVzaXZlIDogYm9vbGVhbiINCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJNDIwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiIEAxMzExDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDIyODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMjM2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCXdpZHRoICAgICAgCTQ1NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIgQDEzMTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMwNCwgMjYyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzQsIDI1NzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERnJhY3Rpb25EaWdpdHNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiDQotCQkJCXdpZHRoICAgICAgCTQ3OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IiBAMTMxMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzY4LCAyMTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE5NiwgMjA3NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXR0ZXJuRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQl3aWR0aCAgICAgIAkzNjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiIEAxMzE0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMjA5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCAyMDQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCQl3aWR0aCAgICAgIAk0NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IiBAMTMxNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDIyNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMjIyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCXdpZHRoICAgICAgCTM1OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiIEAxMzE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTU4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDE1MDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDE1NjMpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDUNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBpbmNsdXNpdmUgOiBib29sZWFuIg0KLQkJCQkJIisgZXhjbHVzaXZlIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0MjINCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IiBAMTMxNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyNDY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjExMSwgMjQxMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJCXdpZHRoICAgICAgCTQzNg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiIEAxMzE4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMjQ0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM5LCAyMzk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkxlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSINCi0JCQkJd2lkdGggICAgICAJNDIwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IiBAMTMxOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI2MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMjU1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJd2lkdGggICAgICAJNDIyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMzIwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY2NywgMTEwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk1NDANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMTMyMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDEwNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MCwgMTAyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMzIyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDEzMDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzY0KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTc1DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIjw8MC4uKj4+ICsgdmFsaWRGYWNldHMgOiBTdHJpbmciKSkNCi0JCQkJd2lkdGggICAgICAJNTk0DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTQiIEAxMzIzDQotCQkJCWxvY2F0aW9uICAgCSgxNDQ2LCAxMjE4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBOTk0MDMwQSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxMzI0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjMNCi0JCQkJCWxvY2F0aW9uICAgCSg1ODIsIC03OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4MCwgMTE3MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMy4yNjgyOTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBOTk3MDBERCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzIzDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0NDYsIDEyMTgpDQotCQkJCQkgICAgKDE0ODcsIDEyMTgpDQotCQkJCQkgICAgKDE0ODcsIDEyOTIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDEyOTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzksIDEyNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTg0MjExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTUiIEAxMzI3DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjMNCi0JCQkJCWxvY2F0aW9uICAgCSg1ODIsIC03OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTk5NzAwRTciDQotCQkJCQljbGllbnQgICAgIAlAMTMyMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDQ2LCAxMjE4KQ0KLQkJCQkJICAgICgxNDA1LCAxMjE4KQ0KLQkJCQkJICAgICgxNDA1LCAxMjkyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0NiwgMTIxOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA1LCAxMjkyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU4IiBAMTMyOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTczMywgMTU3NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RDAyNTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU5IiBAMTMyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzI4DQotCQkJCQlsb2NhdGlvbiAgIAkoOTE3LCA3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDhFMDA5MSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzI4DQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE3MzMsIDE1NzUpDQotCQkJCQkgICAgKDE0ODcsIDE1NzUpDQotCQkJCQkgICAgKDE0ODcsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RmFjZXQiIEAxMzMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjgNCi0JCQkJCWxvY2F0aW9uICAgCSg5MTcsIDcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTEsIDE1NDEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDYyNDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDhFMDA5QiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzI4DQotCQkJCQlzdXBwbGllciAgIAlAMTMxMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE1NzUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDIsIDE1MzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODkxNTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYwIiBAMTMzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4NywgMTc5MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQjAzOTYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYxIiBAMTMzNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMzDQotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUMwM0M5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU4NywgMTc5MykNCi0JCQkJCSAgICAoMTQ0NywgMTc5MykNCi0JCQkJCSAgICAoMTQ0NywgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODcsIDE3OTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhJbmNsdXNpdmVGYWNldCIgQDEzMzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzMw0KLQkJCQkJbG9jYXRpb24gICAJKDcwNywgLTMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxNzUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjk4NDQxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzRDQiDQotCQkJCQljbGllbnQgICAgIAlAMTMzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4NywgMTc5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkyLCAxNzkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIwLCAxNzU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU5MTU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2MiIgQDEzMzgNCi0JCQkJbG9jYXRpb24gICAJKDkzNywgMTc4NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBRjAzMzgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYzIiBAMTMzOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzM4DQotCQkJCQlsb2NhdGlvbiAgIAkoNjE3LCAtNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMDAxRjkiDQotCQkJCQljbGllbnQgICAgIAlAMTMzOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5MzcsIDE3ODcpDQotCQkJCQkgICAgKDk5NywgMTc4NykNCi0JCQkJCSAgICAoOTk3LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTM3LCAxNzg3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5JbmNsdXNpdmVGYWNldCIgQDEzNDANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzOA0KLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5MiwgMTc0NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5JbmNsdXNpdmVGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0NjA2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMjAzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzAzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE3ODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NSwgMTc0MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2Mzk2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjQiIEAxMzQzDQotCQkJCWxvY2F0aW9uICAgCSg5ODEsIDE5MzcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjMwMjA3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2NSIgQDEzNDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0Mw0KLQkJCQkJbG9jYXRpb24gICAJKDY3NywgLTc5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI0MDE5MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQzDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDk4MSwgMTkzNykNCi0JCQkJCSAgICAoMTA0MSwgMTkzNykNCi0JCQkJCSAgICAoMTA0MSwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQxLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkV4Y2x1c2l2ZUZhY2V0IiBAMTM0NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQzDQotCQkJCQlsb2NhdGlvbiAgIAkoNjc3LCAtNzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMywgMTkwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0MTI1Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjQwMTlBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE5MzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4OSwgMTg5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NjY1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjYiIEAxMzQ4DQotCQkJCWxvY2F0aW9uICAgCSgxNDY5LCAxOTUzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEI2MDI4RCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjciIEAxMzQ5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDgNCi0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNzAyMTciDQotCQkJCQljbGllbnQgICAgIAlAMTM0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDY5LCAxOTUzKQ0KLQkJCQkJICAgICgxNDAwLCAxOTUzKQ0KLQkJCQkJICAgICgxNDAwLCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OSwgMTk1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDAwLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEV4Y2x1c2l2ZUZhY2V0IiBAMTM1MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCAtOTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDYsIDE5MTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RXhjbHVzaXZlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yOTgwOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIyMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQ4DQotCQkJCQlzdXBwbGllciAgIAlAMTMwNQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY5LCAxOTUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjQsIDE5NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NjEsIDE5MTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjcyMzYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY4IiBAMTM1Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjE4MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAwNTEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY5IiBAMTM1NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzUzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxOCwgNjI4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDI0NiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzUzDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibGVuZ3RoRmFjZXQiIEAxMzU1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzE4LCA2MjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzU2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzU1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNCwgMjIwNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitsZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3NTQ3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkMwMjUwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzE1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTEyMiwgMjE4MCkNCi0JCQkJCSAgICAoMTEyMiwgMjI0MCkNCi0JCQkJCSAgICAoMzg3LCAyMjQwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjE4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIyNDApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzU3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzU1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MSwgMjIwNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NTU5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzIiIEAxMzU4DQotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAxOTg5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEMyMDIxRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzMiIEAxMzU5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzU4DQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZW51bWVyYXRpb25GYWNldHMiIEAxMzYwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzcsIDIwMTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZW51bWVyYXRpb25GYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjU4NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzU4DQotCQkJCQlzdXBwbGllciAgIAlAMTMxNA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwODQsIDE5ODkpDQotCQkJCQkgICAgKDEwODQsIDIwNDkpDQotCQkJCQkgICAgKDQ4NSwgMjA0OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDE5ODkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMDQ5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODMsIDIwMjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTEyOTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc0IiBAMTM2Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1MSwgMjA3NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNTAxNTkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc1IiBAMTM2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzYzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MjUsIDUzOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNjAwQjAiDQotCQkJCQljbGllbnQgICAgIAlAMTM2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDUxLCAyMDc0KQ0KLQkJCQkJICAgICgxMzYyLCAyMDc0KQ0KLQkJCQkJICAgICgxMzYyLCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1MSwgMjA3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhdHRlcm5GYWNldHMiIEAxMzY1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzIwLCAyMDM4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhdHRlcm5GYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNjcyMjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCQSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzYzDQotCQkJCQlzdXBwbGllciAgIAlAMTMxMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDUxLCAyMDc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxODcsIDIwNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzY3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzY1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzIsIDIwMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDg2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc2IiBAMTM2OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNywgMTQwMCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDODAyQTciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc3IiBAMTM2OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzY4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNDksIC00NzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzkwMUVBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyOSwgMTQwMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjYXJkaW5hbGl0eUZhY2V0IiBAMTM3MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzY4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNDksIC00NzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NDcsIDEzNTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY2FyZGluYWxpdHlGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3MTczMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzkwMUY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgMTQwMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MywgMTM1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MzQyNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODYiIEAxMzczDQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDEzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMERCMDM3NyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODciIEAxMzc0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzg2LCAzMDEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREMwMzVBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0MTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2MiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTM3NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzczDQotCQkJCQlsb2NhdGlvbiAgIAkoLTc4NiwgMzAxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA4LCAyNTU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzczOTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERDMDM2NCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzczDQotCQkJCQlzdXBwbGllciAgIAlAMTMxMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNjIsIDI0MTMpDQotCQkJCQkgICAgKDEyNjIsIDI1OTYpDQotCQkJCQkgICAgKDIwNjUsIDI1OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDEzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjUsIDI1OTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzksIDI1NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4ODYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkwIiBAMTM3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTg0MSwgMTMwNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFMzAwRDkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkxIiBAMTM3OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMzUsIC03OTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTQwMzhFIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyOSwgMTMwNikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJib3VuZGVkRmFjZXQiIEAxMzgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEzNSwgLTc5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzMiwgMTI3MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitib3VuZGVkRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDMxNzQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFNDAzOTgiDQotCQkJCQljbGllbnQgICAgIAlAMTM3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg0MSwgMTMwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTU0LCAxMzA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc3LCAxMjc1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU0NzE3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3MCIgQDEzODMNCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIxODYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkYwMThDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3MSIgQDEzODQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM4Mw0KLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNkIiDQotCQkJCQljbGllbnQgICAgIAlAMTM4Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjE4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIndoaXRlU3BhY2VGYWNldCIgQDEzODUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM4Mw0KLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MywgMjIwNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit3aGl0ZVNwYWNlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTA5MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMwMDA3NSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzgzDQotCQkJCQlzdXBwbGllciAgIAlAMTMxMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzMjgsIDIxODYpDQotCQkJCQkgICAgKDEzMjgsIDIyNDYpDQotCQkJCQkgICAgKDIwOTMsIDIyNDYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMTg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDIyNDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzg1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMzMsIDIyMDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY3NjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg4IiBAMTM4OA0KLQkJCQlsb2NhdGlvbiAgIAkoNjc0LCAxMzkwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMERGMDA0OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODkiIEAxMzg5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTg1NCwgLTcwNikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQjkiDQotCQkJCQljbGllbnQgICAgIAlAMTM4OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjc0LCAxMzkwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzNSwgMTM5MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJvcmRlcmVkRmFjZXQiIEAxMzkwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTg1NCwgLTcwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU4LCAxMzUzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK29yZGVyZWRGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MTUzOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwM0MzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzODgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY3NCwgMTM5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEzOTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgMTM1NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNDYxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzgiIEAxMzkzDQotCQkJCWxvY2F0aW9uICAgCSg2ODcsIDEyOTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0IwMzlDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3OSIgQDEzOTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMENDMDNEMCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzkzDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODcsIDEyOTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMjk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm51bWVyaWNGYWNldCIgQDEzOTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjgsIDEyNTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbnVtZXJpY0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgwOTcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDQzAzRDEiDQotCQkJCQljbGllbnQgICAgIAlAMTM5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0MCwgMTI5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA2LCAxMjYwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2ODQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5MiIgQDEzOTgNCi0JCQkJbG9jYXRpb24gICAJKDE2ODksIDE2NjIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDQwMUVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5MyIgQDEzOTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xODMsIC0zNTQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDUwMzYwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzOTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTY4OSwgMTY2MikNCi0JCQkJCSAgICAoMTQ4NywgMTY2MikNCi0JCQkJCSAgICAoMTQ4NywgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2ODksIDE2NjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhGYWNldCIgQDE0MDANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xODMsIC0zNTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NjksIDE2MjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWF4RmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODIwNTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNDQ1MDM2QSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzk4DQotCQkJCQlzdXBwbGllciAgIAlAMTMxMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjg5LCAxNjYyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE2NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDAyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDQsIDE2MjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTUzODUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk0IiBAMTQwMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjI1OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU0RjAxNDUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk1IiBAMTQwNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDAzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NTAwMzhDIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIyNTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiIEAxNDA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTQ2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NSwgMjI4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDg1NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNTUwMDM5NiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDAzDQotCQkJCQlzdXBwbGllciAgIAlAMTMxMQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzMjgsIDIyNTgpDQotCQkJCQkgICAgKDEzMjgsIDIzMjQpDQotCQkJCQkgICAgKDIwOTMsIDIzMjQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMjU4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDIzMjQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDksIDIyOTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg4MTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk2IiBAMTQwOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI5NywgMjM2NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNDAxMUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk3IiBAMTQwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYwNywgLTcyMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMEQiDQotCQkJCQljbGllbnQgICAgIAlAMTQwOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0IiBAMTQxMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYwNywgLTcyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1NywgMjQ2MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUyNjkwNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzUwMjE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzE3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI5NywgMjM2NikNCi0JCQkJCSAgICAoMTI5NywgMjQ5OSkNCi0JCQkJCSAgICAoMjEwMiwgMjQ5OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzNjYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQ5OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwNywgMjQ3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTMwOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTgiIEAxNDEzDQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDQ5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCNjJBMDBBQSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTkiIEAxNDE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxMzgiDQotCQkJCQljbGllbnQgICAgIAlAMTQxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQ0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxNDE1DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgMjYzNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTg1MzE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxNDIiDQotCQkJCQljbGllbnQgICAgIAlAMTQxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYyLCAyNDQ5KQ0KLQkJCQkJICAgICgxMjYyLCAyNjY4KQ0KLQkJCQkJICAgICgyMDY1LCAyNjY4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQ0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNjY4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTg5LCAyNjI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI2NDg1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwMCIgQDE0MTgNCi0JCQkJbG9jYXRpb24gICAJKDE0MjIsIDIxNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjAwM0E2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwMSIgQDE0MTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQxOA0KLQkJCQkJbG9jYXRpb24gICAJKC03NzAsIC0xMzEzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDE4DQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0MjIsIDIxNTkpDQotCQkJCQkgICAgKDEzNjIsIDIxNTkpDQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlUGF0dGVybkZhY2V0IiBAMTQyMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDE4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjcsIDIxMjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlUGF0dGVybkZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk5MDkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMTAzMTIiDQotCQkJCQljbGllbnQgICAgIAlAMTQxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyMiwgMjE1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMTU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMTE5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5MjI2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwMiIgQDE0MjMNCi0JCQkJbG9jYXRpb24gICAJKDEwODQsIDIwODMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0EwMjZCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwMyIgQDE0MjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyMw0KLQkJCQkJbG9jYXRpb24gICAJKDgyOCwgLTEzNzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTg2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IiBAMTQyNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDIzDQotCQkJCQlsb2NhdGlvbiAgIAkoODI4LCAtMTM3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAyMTAxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40ODg2MTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCN0NCMDE5MCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDIzDQotCQkJCQlzdXBwbGllciAgIAlAMTMxNA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwODQsIDIwODMpDQotCQkJCQkgICAgKDEwODQsIDIxNDMpDQotCQkJCQkgICAgKDQ4NSwgMjE0MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMTQzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzEsIDIxMDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MzE3MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzA4IiBAMTQyOA0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjI0MSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAwNTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA5IiBAMTQyOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDI4DQotCQkJCQlsb2NhdGlvbiAgIAkoODY2LCAtNDc5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOERDMDNCOSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDI4DQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMjQxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiIEAxNDMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjgNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVMZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5MTczMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0MzIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MjgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzE1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTEyMiwgMjI0MSkNCi0JCQkJCSAgICAoMTEyMiwgMjMxOCkNCi0JCQkJCSAgICAoMzg3LCAyMzE4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIzMTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MCwgMjI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODU2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTYiIEAxNDMzDQotCQkJCWxvY2F0aW9uICAgCSg3NzMsIDE1NjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODUwMjVCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1NyIgQDE0MzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzMw0KLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjcwIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzczLCAxNTY1KQ0KLQkJCQkJICAgICg5NTksIDE1NjUpDQotCQkJCQkgICAgKDk1OSwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluRmFjZXQiIEAxNDM1DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzMNCi0JCQkJCWxvY2F0aW9uICAgCSg0NjksIDEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTMsIDE1MzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjMwOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDg2MDI3QSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDMzDQotCQkJCQlzdXBwbGllciAgIAlAMTMxNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDE1NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAxNTY1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDE1MjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEwIiBAMTQzOA0KLQkJCQlsb2NhdGlvbiAgIAkoODE2LCAxNjUwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCOTcwMDFEQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTEiIEAxNDM5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzgNCi0JCQkJCWxvY2F0aW9uICAgCSg0OTYsIC0zMzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzEwMENGIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoODE2LCAxNjUwKQ0KLQkJCQkJICAgICg5NTksIDE2NTApDQotCQkJCQkgICAgKDk1OSwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWluRmFjZXQiIEAxNDQwDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzgNCi0JCQkJCWxvY2F0aW9uICAgCSg0OTYsIC0zMzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc2NCwgMTYxNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5GYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE0MTYxOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzEwMEQ5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzE2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDE2NTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyMywgMTYwNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMjc0MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODAiIEAxNDQzDQotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzIxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENGMDE5OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODEiIEAxNDQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzE5LCA0OTcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDg1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0NDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhMZW5ndGhGYWNldCIgQDE0NDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0Mw0KLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgMjM4MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhMZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3MjI1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDhGIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzE3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI5NywgMjMyMSkNCi0JCQkJCSAgICAoMTI5NywgMjQwOSkNCi0JCQkJCSAgICAoMjEwMiwgMjQwOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzMjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NCwgMjM2NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3OTIwOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODIiIEAxNDQ4DQotCQkJCWxvY2F0aW9uICAgCSgxMTU5LCAyMjczKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ1MDBDNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODMiIEAxNDQ5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDFEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNTksIDIyNzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE1OSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5MZW5ndGhGYWNldCIgQDE0NTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0OA0KLQkJCQkJbG9jYXRpb24gICAJKC0yODEsIDQ0OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU3LCAyMzcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkxlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE5NTI3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENjAwMjciDQotCQkJCQljbGllbnQgICAgIAlAMTQ0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMTgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTU5LCAyMjczKQ0KLQkJCQkJICAgICgxMTU5LCAyNDA5KQ0KLQkJCQkJICAgICg0NTAsIDI0MDkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTU5LCAyMjczKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MCwgMjQwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAyMzY5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzNjEwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNiIgQDE0NTMNCi0JCQkJbG9jYXRpb24gICAJKDExOTcsIDIzMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTgwMTZEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNyIgQDE0NTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1Mw0KLQkJCQkJbG9jYXRpb24gICAJKDk0MSwgLTYxMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5OTAwNTYiDQotCQkJCQljbGllbnQgICAgIAlAMTQ1Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0IiBAMTQ1NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDUzDQotCQkJCQlsb2NhdGlvbiAgIAkoOTQxLCAtNjEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTYsIDI0NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTI2MDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODk5MDA2MCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDUzDQotCQkJCQlzdXBwbGllciAgIAlAMTMxOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExOTcsIDIzMzQpDQotCQkJCQkgICAgKDExOTcsIDI0OTMpDQotCQkJCQkgICAgKDQ1MCwgMjQ5MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDIzMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCAyNDkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjcsIDI0NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTYwNDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzA0IiBAMTQ1OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjQzOCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MDAwNjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA1IiBAMTQ1OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDU4DQotCQkJCQlsb2NhdGlvbiAgIAkoODYzLCAtNzQ2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAxRCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDU4DQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCIgQDE0NjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1OA0KLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAyNjMyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTcwMzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAyNyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDU4DQotCQkJCQlzdXBwbGllciAgIAlAMTMxOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMzEsIDI0MzgpDQotCQkJCQkgICAgKDEyMzEsIDI2NjgpDQotCQkJCQkgICAgKDQ1MSwgMjY2OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDI0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNjY4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDI2MzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTg4MTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg0IiBAMTQ2Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjM5NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAwREUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg1IiBAMTQ2NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDYzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTIwOSwgMjUzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNDRCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDYzDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyMzk3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidG90YWxEaWdpdHNGYWNldCIgQDE0NjUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0yMDksIDI1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODUzLCAyNTUwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3RvdGFsRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODU1NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNENyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDYzDQotCQkJCQlzdXBwbGllciAgIAlAMTMxOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMzEsIDIzOTcpDQotCQkJCQkgICAgKDEyMzEsIDI1ODcpDQotCQkJCQkgICAgKDQ1MSwgMjU4NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDIzOTcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNTg3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzUsIDI1NjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTQ2NDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxNDY4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgNzY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDE5LCA1NzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDQNCi0JCQkJaGVpZ2h0ICAgICAJNDEzDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0NjkNCi0JCQkJbG9jYXRpb24gICAJKDEyMDksIDEwNjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDE0NjgNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTIwOSwgMTA2NSkNCi0JCQkJICAgICgxMjA5LCA5NzQpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0MCIgQDE0NzANCi0JCQkJbG9jYXRpb24gICAJKDEwOTAsIDEwMzEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjUwM0Q5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlRGVmaW5pdGlvbiIgQDE0NzENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3MA0KLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4OTcsIDEwMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA5ODc2NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE5NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDAzQyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDcwDQotCQkJCQlzdXBwbGllciAgIAlAMTQ2OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDk3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMSwgMTAzNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjE3MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0MSIgQDE0NzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3MA0KLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDA0NiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDcwDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDMxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDEwODgpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDYiIEAxNDc1DQotCQkJCWxvY2F0aW9uICAgCSgxNTM4LCA4NzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE2REIwMUU1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlIiBAMTQ3Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDc1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTc4LCAxMDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDc2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTgsIDc5MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43NjA4NzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNkREMDNERCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDc1DQotCQkJCQlzdXBwbGllciAgIAlAMTQ2OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDg3MykNCi0JCQkJCSAgICAoMTUzOCwgOTE5KQ0KLQkJCQkJICAgICgxNDU0LCA5MTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA4NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgOTE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTA5LCA4NzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMTY2NjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NyIgQDE0NzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3NQ0KLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNkREMDNERSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDc1DQotCQkJCQlzdXBwbGllciAgIAlAMTQ2OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzgsIDg3MykNCi0JCQkJCSAgICAoMTUzOCwgODI4KQ0KLQkJCQkJICAgICgxNDU0LCA4MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM4LCA4NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgODI4KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ4IiBAMTQ4MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzNSwgNjg0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBNzEyMDEwOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZSIgQDE0ODENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ4MA0KLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA1OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuOTc3MjczDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxNDAxNTEiDQotCQkJCQljbGllbnQgICAgIAlAMTQ4MA0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM1LCA2ODQpDQotCQkJCQkgICAgKDE1MzUsIDcyOCkNCi0JCQkJCSAgICAoMTQ1NCwgNzI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzNSwgNjg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDcyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0ODMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwNiwgNjgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNzc3OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQ5IiBAMTQ4NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDgwDQotCQkJCQlsb2NhdGlvbiAgIAkoMTc1LCAtODQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTVCIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0ODANCi0JCQkJCXN1cHBsaWVyICAgCUAxNDY4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzNSwgNjg0KQ0KLQkJCQkJICAgICgxNTM1LCA2NDEpDQotCQkJCQkgICAgKDE0NTQsIDY0MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzUsIDY4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA2NDEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTIiIEAxNDg1DQotCQkJCWxvY2F0aW9uICAgCSg2MTMsIDk0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdFRDAzQzAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcGxleFR5cGUiIEAxNDg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0ODUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ2NSwgOTgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBsZXhUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzczMDU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdGNDAxMTciDQotCQkJCQljbGllbnQgICAgIAlAMTQ4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEzMjENCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg2MTMsIDk0MCkNCi0JCQkJCSAgICAoMjg0LCA5NDApDQotCQkJCQkgICAgKDI4NCwgMTAwOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYxMywgOTQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NCwgMTAwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0ODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI0LCA5NzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDkzMjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1MyIgQDE0ODkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC03NDcsIDE3MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdGNDAxMjEiDQotCQkJCQljbGllbnQgICAgIAlAMTQ4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMCwgOTQwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDkwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQljbGllbnQgICAgIAlAMTQ2OA0KLQkJCQlzdXBwbGllciAgIAlAMTI5OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExMiwgNTYyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExMiwgNTEwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjk5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDkxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlAMTMyMA0KLQkJCQlzdXBwbGllciAgIAlAMTQ2OA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE0NiwgMTA4OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDYsIDEwNjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE0NjkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTAiIEAxNDkyDQotCQkJCWxvY2F0aW9uICAgCSgxMzYyLCAxMTMzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBNzRCMDE3OCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlIiBAMTQ5Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDkyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5OSwgMTA5NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI0Njc1Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE3QiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDkyDQotCQkJCQlzdXBwbGllciAgIAlAMTMyMg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDEyOTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDk1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDkzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjEsIDEwOTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjI3MjczDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTEiIEAxNDk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0OTINCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU4LCAtMTYzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE4NSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDkyDQotCQkJCQlzdXBwbGllciAgIAlAMTQ2OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDk3NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEAxNDk3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNzIsIDM4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDk3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwMiwgMzAzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDk3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwMiwgMzYzKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTUwDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZ2xvYmFsIDogYm9vbGVhbiINCi0JCQkJCSIrIGZlYXR1cmVSZWZlcmVuY2UgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTQ5OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjI2MiwgNTY4KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxNDk3DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDIyNjIsIDU2OCkNCi0JCQkJICAgICgyMjYyLCA0NzcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJY2xpZW50ICAgICAJQDEyOTQNCi0JCQkJc3VwcGxpZXIgICAJQDE0OTcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDU5NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNDYsIDU2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ5OCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0NCIgQDE1MDANCi0JCQkJbG9jYXRpb24gICAJKDE1NTMsIDQ1MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMjAxQTQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZSIgQDE1MDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUwMA0KLQkJCQkJbG9jYXRpb24gICAJKDgwMSwgMjkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUwMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzMxLCA0OTkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwNjI2Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjMwMkU1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE1MDANCi0JCQkJCXN1cHBsaWVyICAgCUAxNDY4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTU1MywgNDUzKQ0KLQkJCQkJICAgICgxMjIyLCA0NTMpDQotCQkJCQkgICAgKDEyMjIsIDU2MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIyLCA1NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTAxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExODUsIDQ3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjAzMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQ1IiBAMTUwNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTAwDQotCQkJCQlsb2NhdGlvbiAgIAkoODAxLCAyOTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEEwRjMwMkYwIg0KLQkJCQkJY2xpZW50ICAgICAJQDE1MDANCi0JCQkJCXN1cHBsaWVyICAgCUAxNDk3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCA0NTMpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzYiIEAxNTA1DQotCQkJCWxvY2F0aW9uICAgCSgxOTA4LCAzNTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMDYwMkQ3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkRmVhdHVyZSIgQDE1MDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUwNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNjgsIC0xNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTA2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjksIDM1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEZlYXR1cmUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI5NDEyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMEIwMDBFIg0KLQkJCQkJY2xpZW50ICAgICAJQDE1MDUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDk3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTkwOCwgMzUzKQ0KLQkJCQkJICAgICgxOTA4LCAzODcpDQotCQkJCQkgICAgKDE5OTMsIDM4NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCAzODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTA2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NDUsIDM1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NjYzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM3IiBAMTUwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTA1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMTgiDQotCQkJCQljbGllbnQgICAgIAlAMTUwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE0OTcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxOTA4LCAzNTMpDQotCQkJCQkgICAgKDE5MDgsIDMxOSkNCi0JCQkJCSAgICAoMTk5MywgMzE5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkwOCwgMzUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDMxOSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUxMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDEyOTgNCi0JCQkJc3VwcGxpZXIgICAJQDEyOTcNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDk0LCAyODQpDQotCQkJCSAgICAoNDk0LCAyNDQpDQotCQkJCSAgICAoOTk2LCAyNDQpKQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAyODQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTYsIDI0NCkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCWNsaWVudCAgICAgCUAxMjg1DQotCQkJCXN1cHBsaWVyICAgCUAxNDk3DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzE4LCA4MTIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzE4LCA1NjgpDQotCQkJCWRyYXdTdXBwbGllciAJQDE0OTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MTINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiDQotCQkJCWNsaWVudCAgICAgCUAxMzIyDQotCQkJCXN1cHBsaWVyICAgCUAxNDY4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY1LCAxMjkyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2NSwgMTA2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ2OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUxMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDE0OTcNCi0JCQkJc3VwcGxpZXIgICAJQDEyOTcNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjE0NywgMjkxKQ0KLQkJCQkgICAgKDIxNDcsIDI0NCkNCi0JCQkJICAgICgxNDY4LCAyNDQpKQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE0NywgMjkxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMjQ0KSkpKSkpKQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBQzkxMDUxMDNCMiINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6bWltZSIgQDE1MTQNCi0JCQlsb2NhdGlvbiAgIAkoNDAwLCAyNDApDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTE0DQotCQkJICAgIGxvY2F0aW9uICAgCSgyNTYsIDE1NikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkibWltZSIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNBQzkxMjdDMDI2NiINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d3NkbCIgQDE1MTUNCi0JCQlsb2NhdGlvbiAgIAkoODgwLCAyNDApDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTE1DQotCQkJICAgIGxvY2F0aW9uICAgCSg3MzYsIDE1NikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkid3NkbCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjNBREZCOEU1MDIxRSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6eHNkIiBAMTUxNg0KLQkJCWxvY2F0aW9uICAgCSgxMzc2LCAyNDApDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTE2DQotCQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAxNTYpDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJInhzZCIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM5QUJEQzZGMDFBQSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQ0KLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0FDOTEwNTEwMzFGIg0KLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0FDOTEwNTIwMDFBIg0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3Nlcw0KLQlxdWlkICAgICAgIAkiM0FDOTEwNTEwMzI2Ig0KLQlQcm9jc05EZXZzIAkobGlzdA0KLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyINCi0JCXF1aWQgICAgICAgCSIzQUM5MTA1MTAzMjgiDQotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3Ig0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMNCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFCYXNlU2V0IiA4MDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiQU5TSSINCi0JCQkJdmFsdWUgICAgICAJODAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiT3JhY2xlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJTUUxTZXJ2ZXIiDQotCQkJCXZhbHVlICAgICAgCTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIlN5YmFzZSINCi0JCQkJdmFsdWUgICAgICAJODAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiV2F0Y29tIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJJZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJWXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIlRfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkluaGVyaXRTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIl9WIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJCYXNlVmlld3MiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJWQVJDSEFSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIk51bGxzT0siDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcmVzZXJ2ZVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETEVsZW1lbnQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETFNwZWNpZmljYXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSURMU3BlY1NldCIgMjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMU3BlY1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiVHlwZWRlZiINCi0JCQkJdmFsdWUgICAgICAJNTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkV4Y2VwdGlvbiINCi0JCQkJdmFsdWUgICAgICAJNjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTdHJ1Y3QiDQotCQkJCXZhbHVlICAgICAgCTUxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiVW5pb24iDQotCQkJCXZhbHVlICAgICAgCTgxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcubWltZS9zcmMvcm9zZS9taW1lYmluZGluZ01ETC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJRExNb2R1bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcubWltZS9zcmMvcm9zZS9taW1lYmluZGluZ01ETC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIlJhaXNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJtXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkic18iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9vdERpciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTSINCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdW4iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJNaWNyb3NvZnQiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJJQk0iDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiDQotCQkJdmFsdWUgICAgICAJMykNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0F1dGhvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1ZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW1wb3J0cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAk3MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCb3VuZCINCi0JCQkJdmFsdWUgICAgICAJNzMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTc0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiDQotCQkJCXZhbHVlICAgICAgCTgzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIg0KLQkJCXZhbHVlICAgICAgCSJfSUQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiDQotCQkJCXZhbHVlICAgICAgCTE5MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciINCi0JCQkJdmFsdWUgICAgICAJMTkwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSINCi0JCQkJdmFsdWUgICAgICAJMTgwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlJPVyINCi0JCQkJdmFsdWUgICAgICAJMTcwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiDQotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCINCi0JCQkJdmFsdWUgICAgICAJMTYwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIjIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSI2IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc0luZGV4Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5Ig0KLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcubWltZS9zcmMvcm9zZS9taW1lYmluZGluZ01ETC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLm1pbWUvc3JjL3Jvc2UvbWltZWJpbmRpbmdNREwubWRsLCBjdGMsIGlibWN0YyIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJhaXNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kZW50Ig0KLQkJCXZhbHVlICAgICAgCTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNDbGFzc1R5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNDbGFzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluY3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0ZJRUxEX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSgiT0xFRmFjdG9yeVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNsYXNzSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVUeXBlTGliIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1pbm9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcGF0Y2hNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoRGVmVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW50ZXJmYWNlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlByb3BOb3RpZnlTaW5rcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25Qb2ludElJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ29tbWFuZHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBVExfRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uUG9pbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlzcGF0Y2hfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAk1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0ZF9PTEVfTWV0aG9kIg0KLQkJCQl2YWx1ZSAgICAgIAk2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIg0KLQkJCQl2YWx1ZSAgICAgIAk3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9TZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlNDQyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlR5cGVMaWJJbXBvcnRlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0YWJsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiDQotCQkJCXZhbHVlICAgICAgCTIxMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiMCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGFibGUiDQotCQkJdmFsdWUgICAgICAJKCJDcmVhdGFibGVTZXQiIDIyMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluaXRpYWxpemF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUZXJtaW5hdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25DbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiQ29sbGVjdGlvbiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiVGV4dCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRvcGVyYXRpb24iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSMkVkaXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJvc2UgV2ViIFB1Ymxpc2hlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZlcnNpb24gQ29udHJvbCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQlxdWlkICAgICAgIAkiM0FDOTEwNTEwMzI3IikpDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9zb2FwLm1kbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjL3Jvc2Uvc29hcC5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTkzZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMvcm9zZS9zb2FwLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDMxNzA4ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNDINCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNC41LjgwNTRhIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzDQotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMA0KLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMA0KLQl0b3BNYXJnaW4gIAkwLjI1MDAwMA0KLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwDQotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMA0KLQljbGlwSWNvbkxhYmVscyAJVFJVRQ0KLQlhdXRvUmVzaXplIAlUUlVFDQotCXNuYXBUb0dyaWQgCVRSVUUNCi0JZ3JpZFggICAgICAJMTYNCi0JZ3JpZFkgICAgICAJMTYNCi0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udA0KLQkgICAgc2l6ZSAgICAgICAJMTANCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JICAgIGJvbGQgICAgICAgCUZBTFNFDQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCSAgICBjb2xvciAgICAgIAkwDQotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQlzaG93TWVzc2FnZU51bSAJMQ0KLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQ0KLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpDQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3Ig0KLQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDY0Ig0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDc4Ig0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyINCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2MyINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciDQotCXF1aWR1ICAgICAgCSIzOUUyN0YwODAwNjUiDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3c2RsIg0KLQkJcXVpZCAgICAgICAJIjNBREZCOEU1MDIxRSINCi0JCWRvY3VtZW50YXRpb24gCQ0KLXxUaGUgV1NETCBtb2RlbCBjb250YWlucyBjbGFzc2VzIGZvciB0aGUgV2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIExhbmd1YWdlIChXU0RMKS4NCi18DQotfFdTREwgZGVzY3JpYmVzIG5ldHdvcmsgc2VydmljZXMgYXMgc2V0cyBvZiBlbmRwb2ludHMgb3BlcmF0aW5nIG9uIG1lc3NhZ2VzLiBUaGUgb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgYXJlIGRlc2NyaWJlZCBhYnN0cmFjdGx5LCBhbmQgdGhlbiBib3VuZCB0byBhIGNvbmNyZXRlIG5ldHdvcmsgcHJvdG9jb2wgYW5kIG1lc3NhZ2UgZm9ybWF0IHRvIGRlZmluZSBhbiBlbmRwb2ludC4NCi18DQotfFdTREwgZGVzY3JpYmVzIHRoZSBmb3JtYXRzIG9mIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYnkgdGhlIHNlcnZpY2VzLCBhbmQgc3VwcG9ydHMgdGhlIFhNTCBTY2hlbWFzIHNwZWNpZmljYXRpb24gYXMgaXRzIGNhbm9uaWNhbCB0eXBlIHN5c3RlbS4gVGhpcyBwYWNrYWdlIHVzZXMgYW4gWE1MIFNjaGVtYSBJbmZvc2V0IG1vZGVsIHBhY2thZ2UgKHNlZSB0aGUgWFNEIHBhY2thZ2UpIHRvIGRlc2NyaWJlIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdHMuDQotfA0KLXxUaGUgbW9kZWwgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkaWFncmFtcywgbmFtZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcHRlcnMgaW4gdGhlIFdTREwgMS4xIHNwZWNpZmljYXRpb24gKGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvTk9URS13c2RsLTIwMDEwMzE1KQ0KLXwtIDIuMSBEZWZpbml0aW9uLCBzaG93cyB0aGUgV1NETCBkZWZpbml0aW9uIGVsZW1lbnQgYW5kIHRoZSBXU0RMIGRvY3VtZW50IHN0cnVjdHVyZQ0KLXwtIDIuMS4xIE5hbWluZyBhbmQgTGlua2luZywgc2hvd3MgdGhlIG5hbWVzcGFjZSBhbmQgaW1wb3J0IG1lY2hhbmlzbQ0KLXwtIDIuMS4zIEV4dGVuc2liaWxpdHksIHNob3dzIHRoZSBXU0RMIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtDQotfC0gMi4yIFR5cGVzLCBzaG93cyB0aGUgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gV1NETA0KLXwtIDIuMyBNZXNzYWdlcywgMi40IFBvcnRUeXBlcywgMi41IEJpbmRpbmdzIGFuZCAyLjcgU2VydmljZXMsIHNob3cgdGhlIG1ham9yIFdTREwgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9ucy4NCi18DQotfFRoZSBXU0RMIGNsYXNzZXMgZXh0ZW5kIHRoZSBqYXZheC53c2RsIGludGVyZmFjZXMgZGVmaW5lZCBieSBKU1IgMTEwLiBDbGFzc2VzIHdpdGggaW50ZXJmYWNlIGFuZCBkYXRhdHlwZSBzdGVyZW90eXBlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlc2Ugbm9uLU1PRiBpbnRlcmZhY2VzLg0KLQkJDQotCQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzICJXU0RMRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0FENUM2QTMwMkREIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGxhbmd1YWdlIGVsZW1lbnQuIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEVuY2xvc2luZ0RlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTI5NjAwQzgiDQotCQkJCXJlc3VsdCAgICAgCSJEZWZpbml0aW9uIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEVuY2xvc2luZ0RlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTJCODAzNDciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJkZWZpbml0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIkRlZmluaXRpb24iKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvY3VtZW50YXRpb25FbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NDRTQ0MzYwMkEzIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzRjk3REJEMzAyMDciDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJQb3J0VHlwZSINCi0JCQlxdWlkICAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnRUeXBlIGVsZW1lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMSBhbmQgYW4gSW50ZXJmYWNlIGNvbXBvbmVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLiBBIHBvcnQgdHlwZSBvciBJbnRlcmZhY2UgaXMgYSBuYW1lZCBzZXQgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBhbmQgdGhlIGFic3RyYWN0IG1lc3NhZ2VzIGludm9sdmVkLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzlCNzAxNTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkQ4MDE5RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg4RTAwMjMiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUUzMDFFNSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThDREVCMDMxNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENEZEMDFCQSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudC4gQSBXU0RMIG9wZXJhdGlvbiBpcyBhbiBhYnN0cmFjdCBkZXNjcmlwdGlvbiBvZiBhbiBhY3Rpb24gc3VwcG9ydGVkIGJ5IGEgc2VydmljZS4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FFOURFOTgwMDNDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZFMjAxNzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTc3NjAwRDEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHlsZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0NzI2MDFBQyINCi0JCQkJdHlwZSAgICAgICAJIk9wZXJhdGlvblR5cGUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0JERDk2NDMwMDRDIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JEREYyMzUwMDNFIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0QxOENFMjIwMUFEIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ1MjAwMTFCIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIk1lc3NhZ2UiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBtZXNzYWdlIGVsZW1lbnQuIEEgV1NETCBtZXNzYWdlIGlzIGFuIGFic3RyYWN0LCB0eXBlZCBkZWZpbml0aW9uIG9mIHRoZSBkYXRhIGJlaW5nIGNvbW11bmljYXRlZC4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQwNTUwMUM0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QThEMTAyQkEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4QUYwMDRGIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg3QzAxRkUiDQotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCINCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUQyMDIyNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTRCMDJCMCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTQyMDBGMSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJQYXJ0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcGFydCBlbGVtZW50LiBQYXJ0cyBkZXNjcmliZSB0aGUgbG9naWNhbCBhYnN0cmFjdCBjb250ZW50IG9mIGEgbWVzc2FnZS4gRWFjaCBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUgZnJvbSBzb21lIHR5cGUgc3lzdGVtLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NkQwMkYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUGFydCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOTNGMDFCRSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg5N0UyMzAyMzciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEI3MDNDOCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnROYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIwODcwM0RCIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEMzMDNDNSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmciDQotCQkJcXVpZCAgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBiaW5kaW5nIGVsZW1lbnQuIEEgYmluZGluZyBkZWZpbmVzIG1lc3NhZ2UgZm9ybWF0IGFuZCBwcm90b2NvbCBkZXRhaWxzIGZvciBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBkZWZpbmVkIGJ5IGEgcGFydGljdWxhciBwb3J0VHlwZS4gVGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgYmluZGluZ3MgZm9yIGEgZ2l2ZW4gcG9ydFR5cGUuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGQTBGMDJGMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NDEwMTI5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4OTkwMTRCIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjFGNDAxQTMiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4Q0U2RDAxNTEiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRERjAzNUMiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ09wZXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcuIEFuIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBvcGVyYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIHdpdGhpbiB0aGUgYmluZGluZydzIHBvcnRUeXBlLiAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0FENjAwOTIwMkY3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QURFNDAxREMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODlDNENCMDE5OSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJTZXJ2aWNlIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDhGMDAyRjgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgc2VydmljZSBlbGVtZW50LiBBIHNlcnZpY2UgZ3JvdXBzIGEgc2V0IG9mIHJlbGF0ZWQgcG9ydHMgdG9nZXRoZXIuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGQTIwMDI1RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NEUwMUI0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJU2VydmljZSINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4QTQwMTUxIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQkRERjIwRDAyMDMiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDQ4MTAyMjAiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRDNTAxRTIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiUG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5MTcwMjg2Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnQgZWxlbWVudC4gQSBwb3J0IGRlZmluZXMgYW4gaW5kaXZpZHVhbCBlbmRwb2ludCBieSBzcGVjaWZ5aW5nIGEgc2luZ2xlIGFkZHJlc3MgZm9yIGEgYmluZGluZyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUQ2MDBDQjAwQUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQ1MDJDOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI4MDAzMjYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QTAwMzkxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1REJCNjAyQTkiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LiBXU0RMIGFsbG93cyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHRlY2hub2xvZ3kgdW5kZXIgdmFyaW91cyBlbGVtZW50cyBkZWZpbmVkIGJ5IFdTREwuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMTQ5MDNEMCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCRERGNTM1MDJDMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCINCi0JCQkJcXVpZCAgICAgICAJIjNBRjk1NDNDMDA3MyINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50VHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUIyMUEwMjcxIg0KLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIFdTREwgZG9jdW1lbnQuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGREI4MDNENCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRjgwMzgyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldERvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0NEMTRGQzIwMTJCIg0KLQkJCQlyZXN1bHQgICAgIAkiRE9NRG9jdW1lbnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTBERTAxRTciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJkb2N1bWVudCINCi0JCQkJCXR5cGUgICAgICAgCSJET01Eb2N1bWVudCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU0NzQwMDRFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSI0MDM1MkI3QzAzOTYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODU3MDJGNSINCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW5jb2RpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDAwRDAwMEQiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSW1wb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTRGOTAzREUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBXU0RMIGltcG9ydCBlbGVtZW50LiBXU0RMIGFsbG93cyBhc3NvY2lhdGluZyBhIG5hbWVzcGFjZSB3aXRoIGEgZG9jdW1lbnQgbG9jYXRpb24gdXNpbmcgYW4gaW1wb3J0IGVsZW1lbnQuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFRTU4MDM3QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjIwMEQwMzQwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5IikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjcyQzEwMzc5Ig0KLQkJCQlyZXN1bHQgICAgIAkiWFNEU2NoZW1hIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFNjaGVtYSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MkMxMDM5NyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInNjaGVtYSINCi0JCQkJCXR5cGUgICAgICAgCSJYU0RTY2hlbWEiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNTBBMDAzNiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUU1MTQwMjExIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RkNGQTAzM0EiDQotCQkJZG9jdW1lbnRhdGlvbiAJIiBXU0RMIGFsbG93cyBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IChyZWZlcnJlZCB0byBoZXJlIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMpIHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvaW50IG9mIGV4dGVuc2liaWxpdHkuIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRTNDMDNENCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzEyQzAzQ0QiDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMTQ3MDI5NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dEVsZW1lbnQiDQotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSINCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudC4gQW4gaW5wdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MDQwMjVGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIyODAyRTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRUUwMzFEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3V0cHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQuIEFuIG91dHB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4iDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MEMwMzVCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzNTAwREQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRjgwMUNEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkZhdWx0Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudC4gRmF1bHQgZWxlbWVudHMgc3BlY2lmeSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIGFueSBlcnJvciBtZXNzYWdlcyB0aGF0IG1heSBiZSBvdXRwdXQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUUxQzgyMDAyRjIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjNEMDMxOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSINCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzRjZGMjAwMjAwMkQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nSW5wdXQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA4QTgyMDJENCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUUxQjAxMTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUI1OUIwMDcyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzQTQwMjAzIg0KLQkJCQlyZXN1bHQgICAgIAkiSUlucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzQjUwM0EyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSUlucHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxRUEwMjBFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPdXRwdXQiDQotCQkJcXVpZCAgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gb3V0cHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU0MzAyQUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFMjEwMTExIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNUE0MDI3RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkNCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNEOTAwRjEiDQotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0YxMDMyNiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dCINCi0JCQkJCXR5cGUgICAgICAgCSJJT3V0cHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUMyMDIwMEJFIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdGYXVsdCINCi0JCQlxdWlkICAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEEgZmF1bHQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBmYXVsdCB3aXRoIHRoZSBzYW1lIG5hbWUuICINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQUUwOTM4NjAyQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTcxMDMzMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCIpKQ0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0MTMwMzdGIg0KLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0MjEwMTA5Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZmF1bHQiDQotCQkJCQl0eXBlICAgICAgIAkiSUZhdWx0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NUJGOUUwMTRBIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlFOYW1lIg0KLQkJCXF1aWQgICAgICAgCSIzQUU4RUQyMjAxNDAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5RTmFtZSBjbGFzcy4gQSBRTmFtZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODQ5REE5MDAzRCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQ0KLQkJCWxhbmd1YWdlICAgCSJKYXZhIikNCi0JCSAgICAob2JqZWN0IENsYXNzICJOYW1lc3BhY2UiDQotCQkJcXVpZCAgICAgICAJIjNBRUEzQ0QzMDAzMCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmFtZXNwYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gYSBXU0RMIGRvY3VtZW50LiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0QyOTAxQjEiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVmaXgiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBM0QzMjAyMzYiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uVHlwZSINCi0JCQlxdWlkICAgICAgIAkiM0FFQjQ3ODIwMjRGIg0KLQkJCWRvY3VtZW50YXRpb24gCQ0KLXxPTkVfV0FZPTENCi18UkVRVUVTVF9SRVNQT05TRT0yDQotfFNPTElDSVRfUkVTUE9OU0U9Mw0KLXxOT1RJRklDQVRJT049NA0KLQkJCQ0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk9wZXJhdGlvblR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzM1MzAzRTMiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkNCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBvcnRUeXBlIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTVCRTAzMzEiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5Qb3J0VHlwZSBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkFDMTAxQ0EiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iDQotCQkJCQl0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QkFGMDFBNCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCRjcwMzFBIg0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEE2MzIwMDBEIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklPcGVyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCODRBNzc2MDBEMSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk9wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzQyMDA2NSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImZhdWx0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNTkwMjhGIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM3MTAyQjEiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDODEwMUIwIg0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UGFyYW1ldGVyT3JkZXJpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM5OTAzMUQiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJPcmRlciINCi0JCQkJCXR5cGUgICAgICAgCSJJTGlzdCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0RTUwMThEIg0KLQkJCQlyZXN1bHQgICAgIAkiSUlucHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyQzQwMTA3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSUlucHV0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRTQwMDk0Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJGMDAxRDIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTc5OTAxMkIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUlucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTdFRTAwMTUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbnB1dCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjYzMzEwMEVGIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MzQ3MDI3NyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTgwMDAwMzkiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU91dHB1dCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEE4MjkwMjdEIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQzQTAzNUQiDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NDUwMUM4Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSINCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTgzOTAxRDUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUZhdWx0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QTg2MTAzMUQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5GYXVsdCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NkEwMEJEIg0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDc1MDEzMSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiDQotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QTg3MTAyMDgiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1lc3NhZ2UiDQotCQkJcXVpZCAgICAgICAJIjNCODRBOEFGMDA0RiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk1lc3NhZ2Ugbm9uLU1PRiBpbnRlcmZhY2UiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQYXJ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyMjQwMjczIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFydCINCi0JCQkJCXR5cGUgICAgICAgCSJJUGFydCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NzIzRDAyMzMiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVBhcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NzI1NDAyNUUiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9yZGVyZWRQYXJ0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjYxMDIwRCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnRPcmRlciINCi0JCQkJCXR5cGUgICAgICAgCSJJTGlzdCIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QThCQzAyNjAiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBhcnQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBOTNGMDFCRSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBhcnQgbm9uLU1PRiBpbnRlcmZhY2UiDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25BdHRyaWJ1dGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODg0NTAwNTIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJ2YWx1ZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlleGNlcHRpb25zIAkiV1NETEV4Y2VwdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4QTAxMDFDMyINCi0JCQkJcmVzdWx0ICAgICAJIklJdGVyYXRvciINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25BdHRyaWJ1dGUiDQotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEyRDAyRDUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJRTmFtZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUGFydCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOTUwMDIzMSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJU2VydmljZSINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCNDkwMjg3Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuU2VydmljZSBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVENTYwMUQxIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydCINCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVEQTIwMDM2Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU1hcCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTVEQjAwMUJDIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5TZXJ2aWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCNUIwMDNFIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklQb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUI4MDAzMjYiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5Qb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTFGMzAyQjUiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyNjMwMkYyIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZyINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCOEMwMDE2Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUJDNjAyMTkiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NUYxNjAxNTMiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RjUwMDA2NiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5NUZBNDAxQzUiDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MkE5MDI4NCINCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQb3J0VHlwZSINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MkJFMDFBOCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIg0KLQkJCQkJdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCQ0YwMzAyIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjg0QURDMDAwNzIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEJDMDA0MSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdGYXVsdCINCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ0ZhdWx0IikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTYwRDkwMDlEIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nRmF1bHQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEZDMDA2MSINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzMkQwMDE3Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NTMzRjAzN0IiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iDQotCQkJCQl0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTA5MDBEQSINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ0lucHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MUQwMDdGIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0lucHV0Ig0KLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nSW5wdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MzQwMzQ5Ig0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPdXRwdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTQ3MDJBNiINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdPdXRwdXQiDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRENCMDIxQyINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ0lucHV0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QURFQjAxMDAiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QURGRTAwMEQiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdPdXRwdXQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRTIxMDExMSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFMkQwMDUwIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nRmF1bHQiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRTRGMDBCRCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTVGMDAyQSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01FbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QUYzMjAzREIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QUY1NjAyOTIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg0QjEyNDAyQUIiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iDQotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjEzNTAzRDEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSURlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCODRCMUQ5MDE0MiINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkRlZmluaXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OEYxMDM5RCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciDQotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRJbXBvcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODk0OTAyNTkiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbXBvcnREZWYiDQotCQkJCQl0eXBlICAgICAgIAkiSUltcG9ydCIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5ODk2RTAwNUUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIg0KLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkTmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5ODQwMDRCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicHJlZml4Ig0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5QzUwMDQ1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydFR5cGUiDQotCQkJCQl0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkU2VydmljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUU0MDFFRSINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInNlcnZpY2UiDQotCQkJCQl0eXBlICAgICAgIAkiSVNlcnZpY2UiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEExNzAzOEMiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTMyMDI4NiINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ091dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTQ2MDEzQiINCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE1QzAwQjAiDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5RkUwMzdDIg0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlRmF1bHQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE3NTAyRTciDQotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW1wb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBODMwMTRDIg0KLQkJCQlyZXN1bHQgICAgIAkiSUltcG9ydCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTlEMDMzRSINCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBQUYwMjU0Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3BlcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThBQzIwM0M0Ig0KLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFFODAwRUQiDQotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBhcnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFGODAyNkQiDQotCQkJCXJlc3VsdCAgICAgCSJJUGFydCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMDgwMURBIg0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnQiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIxNTAzOUIiDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlU2VydmljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjMyMDEzQSINCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEI0MjAwNzUiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5ncyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjkyMDM0MSINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QkNEMDA2MCINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QkU3MDE0NCINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSINCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkNCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEMxNzAxMDciDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzNFMDAxRCINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDNjIwMTRCIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicHJlZml4Ig0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEM3NDAxMTUiDQotCQkJCXJlc3VsdCAgICAgCSJJTWFwIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDQkUwMDcxIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0RBMDFDNiINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHJlZml4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OThDRkQwMDE3Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5OEQyMzAwQTgiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlcyINCi0JCQkJcXVpZCAgICAgICAJIjNCODk4RDNCMDNDRSINCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVCODAxMkIiDQotCQkJCXJlc3VsdCAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVENzAzQkIiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJleHRlbnNpb25SZWdpc3RyeSINCi0JCQkJCXR5cGUgICAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiKSkNCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudEJhc2VVUkkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVGRTAyMDgiDQotCQkJCXJlc3VsdCAgICAgCSJTdHJpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnRCYXNlVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ2MTgwMzI4Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnRCYXNlIg0KLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQ0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwNTYwMDgwIg0KLQkJCQlyZXN1bHQgICAgIAkiSVR5cGVzIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVNlcnZpY2UiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDA3RTAwNEMiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApDQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0NBREQwQkEwMzU1Ig0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSINCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQ0KLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlUG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBEODAyOUEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIg0KLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpDQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlTWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEZBMDMwNyINCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycw0KLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiDQotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkNCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwNkYwMzFCIg0KLQkJCQlyZXN1bHQgICAgIAkiSVR5cGVzIg0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwOTUwMEVFIg0KLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzDQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAidHlwZXMiDQotCQkJCQl0eXBlICAgICAgIAkiSVR5cGVzIikpDQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCINCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIg0KLQkJCQl1aWQgICAgICAgIAkwKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkRlZmluaXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg0QjFFNzAyQTEiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUltcG9ydCINCi0JCQlxdWlkICAgICAgIAkiM0I4NEIyMDIwMTE5Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW1wb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW1wb3J0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEIyMEMwMkVBIg0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIklMaXN0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjg1QzBBMjAzQzUiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTGlzdCBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkxpc3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjg1QzBBRjAyOTciDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1hcCINCi0JCQlxdWlkICAgICAgIAkiM0I4OTZCMDMwMEQ0Ig0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLk1hcCBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLk1hcCINCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QjExMDJCNSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJVVJMIg0KLQkJCXF1aWQgICAgICAgCSIzQjg5RDU2MzAyNzQiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLm5ldC5VUkwgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubmV0LlVSTCINCi0JCQkJcXVpZCAgICAgICAJIjNCODlENTZFMDNFMiINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJRXh0ZW5zaW9uUmVnaXN0cnkiDQotCQkJcXVpZCAgICAgICAJIjNCODlENTkzMDJBNSINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1OUYwMkU4Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQjhCRTlBNjAzQTgiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgdHlwZXMgZWxlbWVudC4gVGhlIHR5cGVzIGVsZW1lbnQgZW5jbG9zZXMgZGF0YSB0eXBlIGRlZmluaXRpb25zIHRoYXQgYXJlIHJlbGV2YW50IGZvciB0aGUgZXhjaGFuZ2VkIG1lc3NhZ2VzLiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjhCRUIwMTAzMTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRDNCMDM4MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIg0KLQkJCQlxdWlkdSAgICAgIAkiM0NBRENCQjIwMDUwIikpDQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucw0KLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyINCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRjM4MDNFNiINCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0Ig0KLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiDQotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCQkJdWlkICAgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiDQotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0Y3RTAzMDEiDQotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMNCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiDQotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpDQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCINCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIg0KLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCQkJCXVpZCAgICAgICAgCTApKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJSXRlcmF0b3IiDQotCQkJcXVpZCAgICAgICAJIjNDNDY4N0RBMDE2NyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkl0ZXJhdG9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0Njg4MDgwMEI5Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFeGNlcHRpb24iDQotCQkJcXVpZCAgICAgICAJIjNDNDY4OTY1MDMxMyINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkV4Y2VwdGlvbiBjbGFzcy4iDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuV1NETEV4Y2VwdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4OTc0MDMxNSINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJJVHlwZXMiDQotCQkJcXVpZCAgICAgICAJIjNDQURDQkIyMDA1MCINCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlR5cGVzIG5vbi1NT0YgaW50ZXJmYWNlIg0KLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5UeXBlcyINCi0JCQkJcXVpZCAgICAgICAJIjNDQURDQkYxMDE3MyINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQ0IyNEFFQzAxQ0IiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQ0MzNjBENzAzOUMiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0NDMzYyN0YwMEI3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCINCi0JCQlxdWlkICAgICAgIAkiM0NEMTUwMkMwMjNCIg0KLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkRvY3VtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTA2MDAxODIiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiTWVzc2FnZVJlZmVyZW5jZSINCi0JCQlxdWlkICAgICAgIAkiM0Y2NzcxREIwMkRDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNGNzYyQTZBMDMwOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIg0KLQkJCQlxdWlkICAgICAgIAkiM0Y2NzgwQTAwMUFCIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHJvdGVjdGVkIikpDQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNDAxOEMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicG9ydFR5cGUiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNzAxQzMiDQotCQkJCWxhYmVsICAgICAgCSJwb3J0VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUNEIg0KLQkJCQlsYWJlbCAgICAgIAkiZU9wZXJhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEiDQotCQkJcXVpZCAgICAgICAJIjNBRDVDRUJFMDBFMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUNFQkYwMDU3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNjEiDQotCQkJCWxhYmVsICAgICAgCSJlUGFydHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1MjAxMEYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRUeXBlIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQzNTQwMTc2Ig0KLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNCINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEMzU0MDE4MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMTAxNzkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNiINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIyNSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQzRTIwMjM5Ig0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdPcGVyYXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNyINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ0MjUwMzhBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVPcGVyYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNjAyRjUiDQotCQkJCWxhYmVsICAgICAgCSJlT3BlcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNjAyRkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5NDAwMzkzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0cyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOTQxMDMxQyINCi0JCQkJbGFiZWwgICAgICAJImVQb3J0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMCINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOTQxMDMxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMSINCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5QjgwMTFGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QjkwMjREIg0KLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QjkwMjYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwMzAxRTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQjciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlcyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjA0MDBDMSINCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MTAxMDQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNEEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZXMiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNTQiDQotCQkJCWxhYmVsICAgICAgCSJlUG9ydFR5cGVzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3NzAwOTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3ODAzNzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5ncyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3QiINCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5ncyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5Ig0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3QjAzMTEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAiDQotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3RDAwN0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVTZXJ2aWNlcyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjdEMDA4OSINCi0JCQkJbGFiZWwgICAgICAJImVTZXJ2aWNlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxMzAwNzkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RCINCi0JCQkJbGFiZWwgICAgICAJImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyIg0KLQkJCQlxdWlkICAgICAgIAkiM0FENUZEMTQwMTlFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMyINCi0JCQlxdWlkICAgICAgIAkiM0FERjJFNjQwMUY1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkU2NTAyNTEiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ0lucHV0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjJFNjUwMjUyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1Ig0KLQkJCXF1aWQgICAgICAgCSIzQURGMkVCMzAxNjMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdPdXRwdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkVCNDAxM0MiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ091dHB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkVCNDAxM0QiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjciDQotCQkJcXVpZCAgICAgICAJIjNBREYyRjk0MDI0RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkY5NTAxOTAiDQotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRjk1MDE5QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5Ig0KLQkJCXF1aWQgICAgICAgCSIzQURGMkZCODAyRjkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRkI5MDIwQSINCi0JCQkJbGFiZWwgICAgICAJImVPdXRwdXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMkZCOTAyMEIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMSINCi0JCQlxdWlkICAgICAgIAkiM0FERjMzMTYwMUE0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODciDQotCQkJCWxhYmVsICAgICAgCSJlRmF1bHRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMiINCi0JCQkJcXVpZCAgICAgICAJIjNBREYzMzE4MDM4OCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMzIg0KLQkJCXF1aWQgICAgICAgCSIzQURGMzQwMDAzRTUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmdGYXVsdHMiDQotCQkJCXF1aWQgICAgICAgCSIzQURGMzQwMTAzQUEiDQotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ0ZhdWx0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM1Ig0KLQkJCXF1aWQgICAgICAgCSIzQUUwOTFGNDAyRjMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUZhdWx0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZFIg0KLQkJCQlsYWJlbCAgICAgIAkiZUZhdWx0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzYiDQotCQkJCXF1aWQgICAgICAgCSIzQUUwOTFGODAxRkYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNyINCi0JCQlxdWlkICAgICAgIAkiM0FFQTNENTUwMDJEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNENTYwMzI4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTmFtZXNwYWNlcyINCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDU2MDMzMiINCi0JCQkJbGFiZWwgICAgICAJImVOYW1lc3BhY2VzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpOYW1lc3BhY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzOSINCi0JCQlxdWlkICAgICAgIAkiM0FFQTNFM0EwMDJEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNFM0MwMUU4Ig0KLQkJCQlsYWJlbCAgICAgIAkiZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQwIg0KLQkJCQlxdWlkICAgICAgIAkiM0FFQTNFM0MwMUYyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDEiDQotCQkJcXVpZCAgICAgICAJIjNBRUE0MTJGMDAzNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFyYW1ldGVyT3JkZXJpbmciDQotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNTUiDQotCQkJCWxhYmVsICAgICAgCSJlUGFyYW1ldGVyT3JkZXJpbmciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDIiDQotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNUYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MyINCi0JCQlxdWlkICAgICAgIAkiM0I4NEFEMjQwMEJEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbnB1dCINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4MyINCi0JCQkJbGFiZWwgICAgICAJImVJbnB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEMjUwMDg0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDUiDQotCQkJcXVpZCAgICAgICAJIjNCODRBRDc5MDBGMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3V0cHV0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEN0EwMTREIg0KLQkJCQlsYWJlbCAgICAgIAkiZU91dHB1dCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NiINCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCINCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NyINCi0JCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMEM0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMzI3Ig0KLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMzMxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhCMUMxMjAzQjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDFDIg0KLQkJCQlsYWJlbCAgICAgIAkiZWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTAiDQotCQkJCXF1aWQgICAgICAgCSIzQjhCMUMxNDAwMjYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTEiDQotCQkJcXVpZCAgICAgICAJIjNCOEIxRENDMDJFNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlU2NoZW1hIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjcwIg0KLQkJCQlsYWJlbCAgICAgIAkiZVNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUyIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjdBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTMiDQotCQkJcXVpZCAgICAgICAJIjNCOEJFQTI3MDI5RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NCINCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQTI5MDM1NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQ0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZVR5cGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4QkVBMjkwMzZBIg0KLQkJCQlsYWJlbCAgICAgIAkiZVR5cGVzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyINCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NSINCi0JCQlxdWlkICAgICAgIAkiM0M0NjgyOTMwM0U1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlIg0KLQkJCQlxdWlkICAgICAgIAkiM0M0NjgyOTYwMTBFIg0KLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2UiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiDQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU2Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M0NjgyOTYwMTE4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU3Ig0KLQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZUltcG9ydHMiDQotCQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUQiDQotCQkJCWxhYmVsICAgICAgCSJlSW1wb3J0cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU4Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU5Ig0KLQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NTAwRjIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjAiDQotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0QiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYwRDcwMzlDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY2hlbWEiDQotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0UiDQotCQkJCWxhYmVsICAgICAgCSJzY2hlbWEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYxIg0KLQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NDAxQjEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiZU1lc3NhZ2UiDQotCQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NjAwMEYiDQotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSINCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjIiDQotCQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NjAwMjMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiDQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjMiDQotCQkJcXVpZCAgICAgICAJIjNGNzg5NkEyMDI2RSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkIiDQotCQkJCWxhYmVsICAgICAgCSJwYXJlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCINCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY2hpbGRyZW4iDQotCQkJCXF1aWQgICAgICAgCSIzRjc4OTZBNzAxMkMiDQotCQkJCWxhYmVsICAgICAgCSJjaGlsZHJlbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkNCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjcgU2VydmljZXMiDQotCQkJcXVpZCAgICAgICAJIjM5QUQzRUY2MDEyNyINCi0JCQl0aXRsZSAgICAgIAkiMi43IFNlcnZpY2VzIg0KLQkJCXpvb20gICAgICAgCTkwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgODAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MywgNjYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDYxMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5Ig0KLQkJCQl3aWR0aCAgICAgIAk1MjANCi0JCQkJaGVpZ2h0ICAgICAJNDA0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydCIgQDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODE2LCA1MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDQ4MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUG9ydCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDQzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2Ig0KLQkJCQl3aWR0aCAgICAgIAkyNzgNCi0JCQkJaGVpZ2h0ICAgICAJMjE4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJU2VydmljZSIgQDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgOTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVNlcnZpY2UiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCA0MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCNDkwMjg3Ig0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMjY0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBANA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgNTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDM4OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCINCi0JCQkJd2lkdGggICAgICAJNDEwDQotCQkJCWhlaWdodCAgICAgCTMwMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0RTAxQjQiDQotCQkJCWNsaWVudCAgICAgCUA0DQotCQkJCXN1cHBsaWVyICAgCUAzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDAsIDM3NykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MCwgMjkyKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBANg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0NDAsIDEyNjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQ0LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQl3aWR0aCAgICAgIAk0MTANCi0JCQkJaGVpZ2h0ICAgICAJMzAyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSINCi0JCQkJY2xpZW50ICAgICAJQDYNCi0JCQkJc3VwcGxpZXIgICAJQDENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzAsIDExMTMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDMwLCAxMDAyKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IiBAOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgOTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjc1LCA4NDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiDQotCQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCQloZWlnaHQgICAgIAkxNjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDUwMkM5Ig0KLQkJCQljbGllbnQgICAgIAlAOA0KLQkJCQlzdXBwbGllciAgIAlAMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODA5LCA4MjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDksIDYzNykpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5IiBAMTANCi0JCQkJbG9jYXRpb24gICAJKDM0MywgOTE2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTQwMDM5MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydHMiIEAxMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjEsIDY0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MTMsIDk0NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTg5NzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxQyINCi0JCQkJCWNsaWVudCAgICAgCUAxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY2LCA5MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM5LCA4ODApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA4MDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDk5MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODQ2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTc0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAiIEAxNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjEsIDY0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTYsIDc0NCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5NDEwMzFEIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwDQotCQkJCQlzdXBwbGllciAgIAlANA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDM0MywgOTE2KQ0KLQkJCQkJICAgICgyNTcsIDkxNikNCi0JCQkJCSAgICAoMjU3LCA2NzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTcsIDY3OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDEsIDc5NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNzA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMSIgQDE4DQotCQkJCWxvY2F0aW9uICAgCSg4ODYsIDEyNzApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjgwMTFGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nIiBAMTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTIsIDEyMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmciDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDg1NzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI0RCINCi0JCQkJCWNsaWVudCAgICAgCUAxOA0KLQkJCQkJc3VwcGxpZXIgICAJQDYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzUsIDEyNzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MCwgMTMxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNDI4Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIiIEAyMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxOA0KLQkJCQkJbG9jYXRpb24gICAJKDM4LCA0MjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODUyLCAxMTA2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4Nzk0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjYxIg0KLQkJCQkJY2xpZW50ICAgICAJQDE4DQotCQkJCQlzdXBwbGllciAgIAlAOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDg4NiwgMTI3MCkNCi0JCQkJCSAgICAoODEyLCAxMjcwKQ0KLQkJCQkJICAgICg4MTIsIDk5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTIsIDk5NikpKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjUgQmluZGluZ3MiDQotCQkJcXVpZCAgICAgICAJIjM5QUQ1MTI3MDI1MiINCi0JCQl0aXRsZSAgICAgIAkiMi41IEJpbmRpbmdzIg0KLQkJCXpvb20gICAgICAgCTg1DQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAyNDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDExNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDY0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkzNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIiBAMjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDM1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3ODAsIDEzMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCA4MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIg0KLQkJCQl3aWR0aCAgICAgIAk0MTANCi0JCQkJaGVpZ2h0ICAgICAJNTY4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0IiBAMjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAxMzM0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nSW5wdXQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAxMjg0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiDQotCQkJCXdpZHRoICAgICAgCTI3OA0KLQkJCQloZWlnaHQgICAgIAkxNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IiBAMjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxLCAxNjM4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nT3V0cHV0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTU4OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFMjEwMTExIg0KLQkJCQl3aWR0aCAgICAgIAkzMTINCi0JCQkJaGVpZ2h0ICAgICAJMTc2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0IiBAMjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE5ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIsIDE5NTgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdGYXVsdCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIsIDE5MDgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCINCi0JCQkJd2lkdGggICAgICAJMjkwDQotCQkJCWhlaWdodCAgICAgCTE3Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAyOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDYyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCA0ODYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjczDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1Ig0KLQkJCQl3aWR0aCAgICAgIAk2OTENCi0JCQkJaGVpZ2h0ICAgICAJMzAxDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDMwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxMjgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklucHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTE3OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCAxNjY0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDE1ODcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiT3V0cHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiINCi0JCQkJd2lkdGggICAgICAJMzE0DQotCQkJCWhlaWdodCAgICAgCTE3OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDMyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCA2ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTcsIDUzOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJd2lkdGggICAgICAJNDMyDQotCQkJCWhlaWdodCAgICAgCTMyMg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5Ig0KLQkJCQljbGllbnQgICAgIAlAMzINCi0JCQkJc3VwcGxpZXIgICAJQDI0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzksIDUyNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3OSwgNDI4KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMiIEAzNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTAzOSwgNzQyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMzUyMDEwRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGUiIEAzNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNA0KLQkJCQkJbG9jYXRpb24gICAJKDU3NSwgNTk4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDksIDc4MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydFR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODkyOTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEMzU0MDE3NiINCi0JCQkJCWNsaWVudCAgICAgCUAzNA0KLQkJCQkJc3VwcGxpZXIgICAJQDI5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzksIDc0MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU5LCA3NDIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MiwgNzE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyMTkzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0IiBAMzgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzQNCi0JCQkJCWxvY2F0aW9uICAgCSg1NzUsIDU5OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzYsIDY5NykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDk0NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEMzU0MDE4MCINCi0JCQkJCWNsaWVudCAgICAgCUAzNA0KLQkJCQkJc3VwcGxpZXIgICAJQDMyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzksIDc0MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MjAsIDc0MikpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEA0MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDEwMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MiwgODUxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCXdpZHRoICAgICAgCTQ1MA0KLQkJCQloZWlnaHQgICAgIAkzNzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIgQDQxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjI0LCAxNDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3NiwgMTI4MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0Ig0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMjc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQzIiBANDINCi0JCQkJbG9jYXRpb24gICAJKDEyNjQsIDEzNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjQwMEJEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbnB1dCIgQDQzDQotCQkJCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjM3LCAxMzE2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbnB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3NTE0OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjUwMDgzIg0KLQkJCQkJY2xpZW50ICAgICAJQDQyDQotCQkJCQlzdXBwbGllciAgIAlAMzANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NCwgMTM1OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxMzU5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTQsIDEzOTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODk1NDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ0IiBANDYNCi0JCQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQkJCWxvY2F0aW9uICAgCSg5NiwgMjg3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDI1MDA4NCINCi0JCQkJCWNsaWVudCAgICAgCUA0Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDQxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzgxLCAxMzU5KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEA0Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk2MCwgMTY2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTIsIDE1MzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkyNzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDUiIEA0OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQzMiwgMTY1NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQ3OTAwRjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDQ5DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDUsIDE2MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU91dHB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY3NDc3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEN0EwMTREIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ4DQotCQkJCQlzdXBwbGllciAgIAlAMzENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxNjU0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODEsIDE2OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTAyNzQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ2IiBANTINCi0JCQkJCVBhcmVudF9WaWV3IAlANDgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwLCAzNzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEN0EwMTRFIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ4DQotCQkJCQlzdXBwbGllciAgIAlANDcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxNjU0KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iIEA1Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDk5MiwgMTAwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTksIDkzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3BlcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSINCi0JCQkJd2lkdGggICAgICAJMzY0DQotCQkJCWhlaWdodCAgICAgCTE3OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERTQwMURDIg0KLQkJCQljbGllbnQgICAgIAlANTMNCi0JCQkJc3VwcGxpZXIgICAJQDI1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjYsIDkxOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2NiwgNjM2KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEA1NQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDU3LCAxMDIyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0UxMDE3OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2IiBANTYNCi0JCQkJCVBhcmVudF9WaWV3IAlANTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMxOSwgNDk0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNSwgOTIwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMjUiDQotCQkJCQljbGllbnQgICAgIAlANTUNCi0JCQkJCXN1cHBsaWVyICAgCUAzMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ1NywgMTAyMikNCi0JCQkJCSAgICAoMjc2LCAxMDIyKQ0KLQkJCQkJICAgICgyNzYsIDg0OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzYsIDg0OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMzAsIDg4NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdPcGVyYXRpb25zIiBANTkNCi0JCQkJCVBhcmVudF9WaWV3IAlANTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMxOSwgNDk0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzMSwgOTc3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM4NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3BlcmF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIxMTY5OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTIwMjM5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU1DQotCQkJCQlzdXBwbGllciAgIAlANTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDU3LCAxMDIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxMCwgMTAyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjksIDk4MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4NDk1Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzE0LCAxMDY3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzI3NTY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDciIEA2Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQxOCwgMTA0MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDQyNTAzOEEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbiIgQDY0DQotCQkJCQlQYXJlbnRfVmlldyAJQDYzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTM1OCwgNDY0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDEwNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU9wZXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDYwMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDYzDQotCQkJCQlzdXBwbGllciAgIAlANDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjYzLCAxMDQwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODksIDEwMDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTY3MjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgiIEA2Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjczLCAxMDcwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NTQyMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkZGIg0KLQkJCQkJY2xpZW50ICAgICAJQDYzDQotCQkJCQlzdXBwbGllciAgIAlANTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTc0LCAxMDQwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMiIEA2OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzg3LCAxMTkwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYyRTY0MDFGNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0lucHV0IiBANzANCi0JCQkJCVBhcmVudF9WaWV3IAlANjkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzgxLCA0NTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY5LCAxMTUyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nSW5wdXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTE5MDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MSINCi0JCQkJCWNsaWVudCAgICAgCUA2OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzg3LCAxMTkwKQ0KLQkJCQkJICAgICg2MzYsIDExOTApDQotCQkJCQkgICAgKDYzNiwgMTI3MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzYsIDEyNzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg1LCAxMjIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQwNDc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNCIgQDczDQotCQkJCQlQYXJlbnRfVmlldyAJQDY5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4NSwgMTE0NCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUyIg0KLQkJCQkJY2xpZW50ICAgICAJQDY5DQotCQkJCQlzdXBwbGllciAgIAlANTMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3ODcsIDExOTApDQotCQkJCQkgICAgKDkyNiwgMTE5MCkNCi0JCQkJCSAgICAoOTI2LCAxMDk3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg3LCAxMTkwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNiwgMTA5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzEsIDExMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3NTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUiIEA3Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgMTMxMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkVCMzAxNjMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdPdXRwdXQiIEA3Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3Ng0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEyLCAxNDI5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMwNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3V0cHV0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTQ1MDgyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkVCNDAxM0MiDQotCQkJCQljbGllbnQgICAgIAlANzYNCi0JCQkJCXN1cHBsaWVyICAgCUA0Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjQsIDE1MjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxNDc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc0NTkwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNiIgQDgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDc2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgNTc4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4MywgMTE0MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNEIg0KLQkJCQkJY2xpZW50ICAgICAJQDc2DQotCQkJCQlzdXBwbGllciAgIAlANTMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgMTMxMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxMDk3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzEsIDExODYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTAxNjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEA4Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MjAsIDE5ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3MiwgMTkwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkxNzgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDg0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgMTk4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjEyLCAxODU5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdGYXVsdCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiDQotCQkJCXdpZHRoICAgICAgCTMxNA0KLQkJCQloZWlnaHQgICAgIAkyNzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTcxMDMzMyINCi0JCQkJY2xpZW50ICAgICAJQDg0DQotCQkJCXN1cHBsaWVyICAgCUAyOA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwMywgMjAwNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1MywgMjAwNykpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMyIgQDg2DQotCQkJCWxvY2F0aW9uICAgCSgxMzU2LCAxMzUyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYzNDAwMDNFNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0ZhdWx0cyIgQDg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDg2DQotCQkJCQlsb2NhdGlvbiAgIAkoMTg4LCA2MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MiwgMTc1MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ0ZhdWx0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMzE1MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FBIg0KLQkJCQkJY2xpZW50ICAgICAJQDg2DQotCQkJCQlzdXBwbGllciAgIAlAODQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1NiwgMTM1MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU2LCAxODQ3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDksIDE3OTcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkxOTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTYsIDE4MDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTkyOTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNCIgQDkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDg2DQotCQkJCQlsb2NhdGlvbiAgIAkoMTg4LCA2MTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgMTE5NykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FCIg0KLQkJCQkJY2xpZW50ICAgICAJQDg2DQotCQkJCQlzdXBwbGllciAgIAlANTMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzU2LCAxMzUyKQ0KLQkJCQkJICAgICgxMzU2LCAxMjE3KQ0KLQkJCQkJICAgICgxMTE3LCAxMjE3KQ0KLQkJCQkJICAgICgxMTE3LCAxMDk3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1NiwgMTM1MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxMDk3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTIsIDExNjQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODcwMDgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzUiIEA5NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTY0MCwgMTk3MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGNDAyRjMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0IiBAOTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAOTQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NCwgMTkxNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzY0MjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRSINCi0JCQkJCWNsaWVudCAgICAgCUA5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDgzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2MywgMTk3MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzE4LCAyMDEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQyMjc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNiIgQDk4DQotCQkJCQlQYXJlbnRfVmlldyAJQDk0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRiINCi0JCQkJCWNsaWVudCAgICAgCUA5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDg0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUxNywgMTk3MCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0MzAyQUIiDQotCQkJCWNsaWVudCAgICAgCUA0Nw0KLQkJCQlzdXBwbGllciAgIAlAMjcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwMywgMTY1NikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM2NCwgMTY1NikpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTFCMDExMyINCi0JCQkJY2xpZW50ICAgICAJQDQxDQotCQkJCXN1cHBsaWVyICAgCUAyNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDY3LCAxMzg1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzMxLCAxMzg1KSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjQgUG9ydFR5cGVzIg0KLQkJCXF1aWQgICAgICAgCSIzQUQ1RDFDNDAzNjYiDQotCQkJdGl0bGUgICAgICAJIjIuNCBQb3J0VHlwZXMiDQotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiINCi0JCQl6b29tICAgICAgIAk4MA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIiBAMTAxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAyMDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMTcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTcwMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklQb3J0VHlwZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMTIyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiDQotCQkJCXdpZHRoICAgICAgCTcxOA0KLQkJCQloZWlnaHQgICAgIAkxOTYNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3BlcmF0aW9uIiBAMTAyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxNzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODczDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSU9wZXJhdGlvbiIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDEyNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODczDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIg0KLQkJCQl3aWR0aCAgICAgIAk4OTENCi0JCQkJaGVpZ2h0ICAgICAJMTg4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiIEAxMDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDE0NzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxNDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklJbnB1dCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxMzg3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiDQotCQkJCXdpZHRoICAgICAgCTY0NA0KLQkJCQloZWlnaHQgICAgIAkxOTQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPdXRwdXQiIEAxMDQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDE3OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU2LCAxNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklPdXRwdXQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTcwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIg0KLQkJCQl3aWR0aCAgICAgIAk2NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTk0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiIEAxMDUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDIxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklGYXVsdCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDI2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTg2MTAzMUQiDQotCQkJCXdpZHRoICAgICAgCTY0NA0KLQkJCQloZWlnaHQgICAgIAkxOTYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMTA2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OCwgNjcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJd2lkdGggICAgICAJNjk1DQotCQkJCWhlaWdodCAgICAgCTI4MQ0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAxMDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTc2LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMjUsIDY5MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJd2lkdGggICAgICAJNTIwDQotCQkJCWhlaWdodCAgICAgCTI0MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEAxMDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAyMDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkZhdWx0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDEwOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDE0NzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MCwgMTQyMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiIEAxMTANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxNzkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAxNzQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk91dHB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiDQotCQkJCXdpZHRoICAgICAgCTI3NA0KLQkJCQloZWlnaHQgICAgIAkxMjUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIgQDExMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDc4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxNCwgNjIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Nw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiDQotCQkJCXdpZHRoICAgICAgCTY5NQ0KLQkJCQloZWlnaHQgICAgIAkzNTINCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxMTINCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDc5NykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNDAxOEMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbnMiIEAxMTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyDQotCQkJCQlsb2NhdGlvbiAgIAkoNTkyLCAyNjkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA3NDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQ5DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU9wZXJhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNTk2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDODI3MDFDRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMTINCi0JCQkJCXN1cHBsaWVyICAgCUAxMTENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDUsIDc5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzYsIDg2MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MDM5MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA5MjMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzYyNDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwb3J0VHlwZSIgQDExNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTINCi0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQzMiDQotCQkJCQljbGllbnQgICAgIAlAMTEyDQotCQkJCQlzdXBwbGllciAgIAlAMTA2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDc5NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4OCwgNzU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUzNDg4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQxIiBAMTE5DQotCQkJCWxvY2F0aW9uICAgCSgyMTA3LCA3NzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMkYwMDM1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJhbWV0ZXJPcmRlcmluZyIgQDEyMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkNCi0JCQkJCWxvY2F0aW9uICAgCSgxODE5LCAxMDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ1LCA2NDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcmFtZXRlck9yZGVyaW5nIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgzMzMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMzEwMjU1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjMxNiwgNzczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3MiwgODIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk2NjEwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNzEsIDg4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMwNjIyMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQyIiBAMTI0DQotCQkJCQlQYXJlbnRfVmlldyAJQDExOQ0KLQkJCQkJbG9jYXRpb24gICAJKDE4MTksIDEwMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEzMTAyNUYiDQotCQkJCQljbGllbnQgICAgIAlAMTE5DQotCQkJCQlzdXBwbGllciAgIAlAMTExDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMDcsIDc3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk5LCA3NzMpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMSIgQDEyNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcwMiwgMTUwNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxNjAxQTQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0cyIgQDEyNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjUNCi0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE1LCAxOTgyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VGYXVsdHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Nzg5OTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxODAzODciDQotCQkJCQljbGllbnQgICAgIAlAMTI1DQotCQkJCQlzdXBwbGllciAgIAlAMTA4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDIsIDE1MDQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgMjA0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDQsIDIwMjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDk1ODANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MywgMTk2MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NTM3OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMyIiBAMTMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNQ0KLQkJCQkJbG9jYXRpb24gICAJKDE0MTQsIDgzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NjEsIDEwNjkpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYzMzE4MDM4OCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAyLCA5NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMDM5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU3MzYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNyIgQDEzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3OCwgMTIzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NDAyNEQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBAMTM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMw0KLQkJCQkJbG9jYXRpb24gICAJKDg5MCwgNTYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAxMzQzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbnB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxOTgyMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRjk1MDE5MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTc4LCAxMjM0KQ0KLQkJCQkJICAgICg5ODAsIDEyMzQpDQotCQkJCQkgICAgKDk4MCwgMTQxMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAxNDEwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0NiwgMTM2NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3NzY2MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgiIEAxMzcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzDQotCQkJCQlsb2NhdGlvbiAgIAkoODkwLCA1NjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjM2LCAxMDM2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOUEiDQotCQkJCQljbGllbnQgICAgIAlAMTMzDQotCQkJCQlzdXBwbGllciAgIAlAMTExDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE3OCwgMTIzNCkNCi0JCQkJCSAgICAoMTI3NywgMTIzNCkNCi0JCQkJCSAgICAoMTI3NywgOTYwKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc3LCA5NjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTk3LCAxMDU4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2NDEzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5IiBAMTQwDQotCQkJCWxvY2F0aW9uICAgCSgxNDY4LCAxMzQ1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBREYyRkI4MDJGOSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3V0cHV0IiBAMTQxDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MA0KLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjIsIDE2NjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU91dHB1dCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MDkwOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDANCi0JCQkJCXN1cHBsaWVyICAgCUAxMTANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OCwgMTM0NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAxNzMwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU0NiwgMTY3NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MzYzNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTc4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAiIEAxNDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwDQotCQkJCQlsb2NhdGlvbiAgIAkoMTE4MCwgNjczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNywgMTAzNykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBCIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MA0KLQkJCQkJc3VwcGxpZXIgICAJQDExMQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDk2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjMsIDEwODApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTAzNDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZEODAxOUYiDQotCQkJCWNsaWVudCAgICAgCUAxMDYNCi0JCQkJc3VwcGxpZXIgICAJQDEwMQ0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZFMjAxNzEiDQotCQkJCWNsaWVudCAgICAgCUAxMTENCi0JCQkJc3VwcGxpZXIgICAJQDEwMg0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZFRTAzMUQiDQotCQkJCWNsaWVudCAgICAgCUAxMDkNCi0JCQkJc3VwcGxpZXIgICAJQDEwMw0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZGODAxQ0QiDQotCQkJCWNsaWVudCAgICAgCUAxMTANCi0JCQkJc3VwcGxpZXIgICAJQDEwNA0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMjAwMjAwMkQiDQotCQkJCWNsaWVudCAgICAgCUAxMDgNCi0JCQkJc3VwcGxpZXIgICAJQDEwNQ0KLQkJCQlsaW5lX3N0eWxlIAkwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAxNTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjI0LCAxNDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM3LCAxMzEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU3NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQl3aWR0aCAgICAgIAk1OTMNCi0JCQkJaGVpZ2h0ICAgICAJMzEyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIgQDE1Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1MjAsIDI1NDQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5MywgMjQ2NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlUmVmZXJlbmNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyINCi0JCQkJd2lkdGggICAgICAJNjcyDQotCQkJCWhlaWdodCAgICAgCTE4MA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTU0DQotCQkJCWxvY2F0aW9uICAgCSgxNTI0LCAyMjc1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxNTMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTUyNCwgMjI3NSkNCi0JCQkJICAgICgxNTI0LCAyNDU0KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjNEMDMxOSINCi0JCQkJY2xpZW50ICAgICAJQDEwOA0KLQkJCQlzdXBwbGllciAgIAlAMTUzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc2LCAyMTc2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3NiwgMjI3NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTU0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIzNTAwREQiDQotCQkJCWNsaWVudCAgICAgCUAxMTANCi0JCQkJc3VwcGxpZXIgICAJQDE1Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM3MSwgMTg1NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNzEsIDIyNzUpDQotCQkJCWRyYXdTdXBwbGllciAJQDE1NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU3DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyMjgwMkU3Ig0KLQkJCQljbGllbnQgICAgIAlAMTA5DQotCQkJCXN1cHBsaWVyICAgCUAxNTMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MCwgMTUzNCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMjI3NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTU0KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjEiIEAxNTgNCi0JCQkJbG9jYXRpb24gICAJKDIyMDYsIDIyNTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODQwMUIxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMTU5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE1OA0KLQkJCQkJbG9jYXRpb24gICAJKDczNCwgLTI4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNjgsIDE2NzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2UiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTIyMzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NjAwMEYiDQotCQkJCQljbGllbnQgICAgIAlAMTU4DQotCQkJCQlzdXBwbGllciAgIAlAMTUyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIwNiwgMTYxMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNjAsIDE2NzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYyIiBAMTYyDQotCQkJCQlQYXJlbnRfVmlldyAJQDE1OA0KLQkJCQkJbG9jYXRpb24gICAJKDczNCwgLTI4NSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NjAwMjMiDQotCQkJCQljbGllbnQgICAgIAlAMTU4DQotCQkJCQlzdXBwbGllciAgIAlAMTUzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjIwNiwgMjI1OSkNCi0JCQkJCSAgICAoMjIwNiwgMjU1NikNCi0JCQkJCSAgICAoMTg1NiwgMjU1NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg1NiwgMjU1NikpKSkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEgRGVmaW5pdGlvbnMiDQotCQkJcXVpZCAgICAgICAJIjNBRDVFNDhBMDI2MiINCi0JCQl0aXRsZSAgICAgIAkiMi4xIERlZmluaXRpb25zIg0KLQkJCXpvb20gICAgICAgCTgzDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiIgQDE2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgMTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMTYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIklEZWZpbml0aW9uIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDExMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRDkwMTQyIg0KLQkJCQl3aWR0aCAgICAgIAk3MDYNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDE2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NiwgODk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQkJd2lkdGggICAgICAJMjk0DQotCQkJCWhlaWdodCAgICAgCTEyMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMTY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgNjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTEwLCA1NDUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTE4Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTEyLCAxMTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTAwLCAxMDU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjgwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDE2Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODA4LCAxNDg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk2LCAxMzYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI4MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDE2OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTI0LCAxNjAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIg0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjgwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMTY5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCAzOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJd2lkdGggICAgICAJNTI4DQotCQkJCWhlaWdodCAgICAgCTQyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDE3MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTM1OCwgODYwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NCIgQDE3MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzANCi0JCQkJCWxvY2F0aW9uICAgCSg2MiwgLTM2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxNywgNTM1KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkJCQljbGllbnQgICAgIAlAMTcwDQotCQkJCQlzdXBwbGllciAgIAlAMTY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU4LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAzLCA1MTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTY2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDE3NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzANCi0JCQkJCWxvY2F0aW9uICAgCSg2MiwgLTM2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4NiwgOTA5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VUeXBlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3OTA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzZBIg0KLQkJCQkJY2xpZW50ICAgICAJQDE3MA0KLQkJCQkJc3VwcGxpZXIgICAJQDE2NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzNTgsIDg2MCkNCi0JCQkJCSAgICAoMTM1OCwgOTQ4KQ0KLQkJCQkJICAgICgxNjc3LCA5NDgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU4LCA4NjApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NywgOTQ4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgOTg3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkyNjU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMTc3DQotCQkJCWxvY2F0aW9uICAgCSgxNjEyLCA1OTUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMTc4DQotCQkJCQlQYXJlbnRfVmlldyAJQDE3Nw0KLQkJCQkJbG9jYXRpb24gICAJKDEyLCAyMjcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIzLCA1MTIpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSINCi0JCQkJCWNsaWVudCAgICAgCUAxNzcNCi0JCQkJCXN1cHBsaWVyICAgCUAxNjkNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjEyLCA1OTUpDQotCQkJCQkgICAgKDE0NjQsIDU5NSkNCi0JCQkJCSAgICAoMTQ2NCwgNDUzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjQsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjQsIDQ5NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1ODY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAxODENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTc3DQotCQkJCQlsb2NhdGlvbiAgIAkoMTIsIDIyNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTIsIDU1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4MDMzNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE3Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDE2NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjEyLCA1OTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkwMSwgNTk1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NCwgNjUyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQxMDA0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzYsIDY0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIyNTk0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDE4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI3OSwgMTEzNykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwMzAxRTIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAxODYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTg1DQotCQkJCQlsb2NhdGlvbiAgIAkoMjcxLCAyNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjM4LCA1OTEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjA0MDBCNyINCi0JCQkJCWNsaWVudCAgICAgCUAxODUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc5LCA0NTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzIwLCA1ODYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDQ5NzQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlcyIgQDE4OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxODUNCi0JCQkJCWxvY2F0aW9uICAgCSgyNzEsIDI3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDcsIDExNzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTM3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwNDAwQzEiDQotCQkJCQljbGllbnQgICAgIAlAMTg1DQotCQkJCQlzdXBwbGllciAgIAlAMTY2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI3OSwgMTEzNykNCi0JCQkJCSAgICAoMTI3OSwgMTIwOCkNCi0JCQkJCSAgICAoMTg5MSwgMTIwOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5MSwgMTIwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDExNzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzNDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc5NywgMTI0NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NDQwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDE5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIxMiwgMTE1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MTAxMDQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYiIEAxOTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTkzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNCwgMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgNTk0KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNEEiDQotCQkJCQljbGllbnQgICAgIAlAMTkzDQotCQkJCQlzdXBwbGllciAgIAlAMTY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxMiwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MSwgNjI0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU3OTYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGVzIiBAMTk3DQotCQkJCQlQYXJlbnRfVmlldyAJQDE5Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjQsIDIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTEsIDE0NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRUeXBlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyMzY5OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzIwMzU0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDE2Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMTIsIDExNTkpDQotCQkJCQkgICAgKDEyMTIsIDE0OTApDQotCQkJCQkgICAgKDE1ODcsIDE0OTApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEyLCAxMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODcsIDE0OTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTMzLCAxNDUxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI1NjExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDE1NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMw0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU4NTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTciIEAyMDENCi0JCQkJbG9jYXRpb24gICAJKDExMTQsIDE1ODUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzcwMDk1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4IiBAMjAyDQotCQkJCQlQYXJlbnRfVmlldyAJQDIwMQ0KLQkJCQkJbG9jYXRpb24gICAJKC00MDYsIDI0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDY4MCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzcxIg0KLQkJCQkJY2xpZW50ICAgICAJQDIwMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTQsIDQ1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTUsIDc1MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjcwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdzIiBAMjA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDIwMQ0KLQkJCQkJbG9jYXRpb24gICAJKC00MDYsIDI0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTEsIDE2NzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY2MzQ3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzN0IiDQotCQkJCQljbGllbnQgICAgIAlAMjAxDQotCQkJCQlzdXBwbGllciAgIAlAMTY4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTExNCwgMTU4NSkNCi0JCQkJCSAgICAoMTExNCwgMTcxNikNCi0JCQkJCSAgICAoMjExNSwgMTcxNikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTQsIDE1ODUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgMTcxNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTMsIDE2NzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDUwNzQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAxNCwgMTc1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMTA3Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDIwOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI4LCAxOTIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDINCi0JCQkJaGVpZ2h0ICAgICAJMjgwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5IiBAMjEwDQotCQkJCWxvY2F0aW9uICAgCSgxMDY2LCAxNTMzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjdCMDMxMSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMCIgQDIxMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNTIxLCAtMTExKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyNSwgNjY5KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwN0YiDQotCQkJCQljbGllbnQgICAgIAlAMjEwDQotCQkJCQlzdXBwbGllciAgIAlAMTY5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjYsIDE1MzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NiwgNDUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOSwgNzU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzE5Njk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2VydmljZXMiIEAyMTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTMsIDIwMjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVNlcnZpY2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkxODI0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwODkiDQotCQkJCQljbGllbnQgICAgIAlAMjEwDQotCQkJCQlzdXBwbGllciAgIAlAMjA5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTA2NiwgMTUzMykNCi0JCQkJCSAgICAoMTA2NiwgMjA1OSkNCi0JCQkJCSAgICAoMTYxOSwgMjA1OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjYsIDE1MzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxOSwgMjA1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTQsIDIwMzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDAxOTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMiwgMjExMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyMDUxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIxOA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMUY4MDM4MiINCi0JCQkJY2xpZW50ICAgICAJQDE2OQ0KLQkJCQlzdXBwbGllciAgIAlAMTYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY0LCAyNjMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODUsIDI2MykpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjMgRXh0ZW5zaWJpbGl0eSINCi0JCQlxdWlkICAgICAgIAkiM0FENjBDNTEwMTkyIg0KLQkJCXRpdGxlICAgICAgCSIyLjEuMyBFeHRlbnNpYmlsaXR5Ig0KLQkJCXpvb20gICAgICAgCTgwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMjE5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg1NzYsIDE1ODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5NCwgMTUzMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSINCi0JCQkJd2lkdGggICAgICAJMTgyDQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDIyMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMTg4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4NywgMTgzNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBAMjIxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzQyLCAxNjc1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4Ig0KLQkJCQl3aWR0aCAgICAgIAkxODINCi0JCQkJaGVpZ2h0ICAgICAJMTMwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiIEAyMjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDIzMzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDIyODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiINCi0JCQkJd2lkdGggICAgICAJMjc0DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDIyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzM2LCAxNzYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjMsIDE3MDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiDQotCQkJCXdpZHRoICAgICAgCTM2NA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyMjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDEzNikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3ODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCA4NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpDQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiDQotCQkJCWljb25fc3R5bGUgCSJMYWJlbCINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIg0KLQkJCQl3aWR0aCAgICAgIAk4MDQNCi0JCQkJaGVpZ2h0ICAgICAJMTcyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEAyMjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMTk1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAxODk5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiDQotCQkJCXdpZHRoICAgICAgCTI3NA0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEAyMjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDIxNDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg2MywgMjA5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3V0cHV0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyINCi0JCQkJd2lkdGggICAgICAJMzA4DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDIyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTIzNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSINCi0JCQkJd2lkdGggICAgICAJMjIyDQotCQkJCWhlaWdodCAgICAgCTE0Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAyMjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxNDA4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMzUsIDEzNTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4Ig0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMjI5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCA2ODgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5LCA1ODApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJCQl3aWR0aCAgICAgIAk1NjANCi0JCQkJaGVpZ2h0ICAgICAJMjQwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDIzMA0KLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCAxMDM5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDgwLCAxMDM5KQ0KLQkJCQkgICAgKDQ4MCwgODA4KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDYwMENCMDBBQSINCi0JCQkJY2xpZW50ICAgICAJQDIyMA0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY2LCAxODI0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2NiwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg1QjVBNDAyN0UiDQotCQkJCWNsaWVudCAgICAgCUAyMjYNCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5NywgMjA3OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTcsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkzODYwMkM5Ig0KLQkJCQljbGllbnQgICAgIAlAMjIyDQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTksIDIyNzEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjE5LCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzNA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCODVCNTlCMDA3MiINCi0JCQkJY2xpZW50ICAgICAJQDIyNQ0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODgsIDE4ODcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODgsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwOTIwMkY3Ig0KLQkJCQljbGllbnQgICAgIAlAMjIzDQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc5NywgMTY5NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc5NywgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEwRjAyRjAiDQotCQkJCWNsaWVudCAgICAgCUAyMTkNCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjAxLCAxNTE5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjAxLCAxMDM5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzNw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGREI4MDNENCINCi0JCQkJY2xpZW50ICAgICAJQDIyNw0KLQkJCQlzdXBwbGllciAgIAlAMjI5DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTEsIDEyMjMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTEsIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJCQljbGllbnQgICAgIAlAMjI4DQotCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQxNCwgMTM0NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxNCwgMTAzOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEyMDAyNUUiDQotCQkJCWNsaWVudCAgICAgCUAyMjENCi0JCQkJc3VwcGxpZXIgICAJQDIyOQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTY2MykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MjksIDEwMzkpDQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI0MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDY4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgNTgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCQkJd2lkdGggICAgICAJNTYzDQotCQkJCWhlaWdodCAgICAgCTIzNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDI0MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5MSwgNjcyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMiIgQDI0Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNDENCi0JCQkJCWxvY2F0aW9uICAgCSgyMywgNTYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODQ3LCA2MzEpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RSINCi0JCQkJCWNsaWVudCAgICAgCUAyNDENCi0JCQkJCXN1cHBsaWVyICAgCUAyMjkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2MCwgNjcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODMwLCA2MjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzk2OTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAyNDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjQxDQotCQkJCQlsb2NhdGlvbiAgIAkoMjMsIDU2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTUsIDUyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzc5MDcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIg0KLQkJCQkJY2xpZW50ICAgICAJQDI0MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDI0MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkxLCA2NzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyMywgNjcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NiwgNjI3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA5NDAyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjMsIDc2NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzMjQ3OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTkyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiIEAyNDkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTkyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYzMCwgODQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiV1NETEVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIg0KLQkJCQl3aWR0aCAgICAgIAk3NzQNCi0JCQkJaGVpZ2h0ICAgICAJMjQwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI1MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgNDAyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAyNDkNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTAwOCwgNDAyKQ0KLQkJCQkgICAgKDEwMDgsIDMxMikpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkUzQzAzRDQiDQotCQkJCWNsaWVudCAgICAgCUAyMjkNCi0JCQkJc3VwcGxpZXIgICAJQDI0OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDkyLCA1NjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0OTIsIDQwMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjUwKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjE0OTAzRDAiDQotCQkJCWNsaWVudCAgICAgCUAyNDANCi0JCQkJc3VwcGxpZXIgICAJQDIyNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxNSwgNTcxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNSwgMjQ2KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JEREY1MzUwMkMzIg0KLQkJCQljbGllbnQgICAgIAlAMjQwDQotCQkJCXN1cHBsaWVyICAgCUAyNDkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NjIsIDU3MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjIsIDQwMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjUwKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI1NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMTYsIDEzNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDEzMDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTcwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSINCi0JCQkJd2lkdGggICAgICAJNTg4DQotCQkJCWhlaWdodCAgICAgCTEzMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUVDMDFDQiINCi0JCQkJY2xpZW50ICAgICAJQDI1NA0KLQkJCQlzdXBwbGllciAgIAlAMjQwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzk2LCAxMjk1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc5NiwgODA1KSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYzIiBAMjU2DQotCQkJCWxvY2F0aW9uICAgCSgyMzExLCAxNjg2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNzg5NkEyMDI2RSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJlbnQiIEAyNTcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjU2DQotCQkJCQlsb2NhdGlvbiAgIAkoMjc5LCAyOTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDIyLCAxMzMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhcmVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJCIg0KLQkJCQkJY2xpZW50ICAgICAJQDI1Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDI1NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzMTEsIDE2ODYpDQotCQkJCQkgICAgKDI0MzIsIDE2ODYpDQotCQkJCQkgICAgKDI0MzIsIDEzNzQpDQotCQkJCQkgICAgKDIzMTAsIDEzNzQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzExLCAxNjg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTAsIDEzNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzY2LCAxNDI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjaGlsZHJlbiIgQDI2MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNTYNCi0JCQkJCWxvY2F0aW9uICAgCSgyNzksIDI5NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjYwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTksIDE1MzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY2hpbGRyZW4iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTg1NjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkMiDQotCQkJCQljbGllbnQgICAgIAlAMjU2DQotCQkJCQlzdXBwbGllciAgIAlAMjU0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjMxMSwgMTY4NikNCi0JCQkJCSAgICAoMjAxNiwgMTY4NikNCi0JCQkJCSAgICAoMjAxNiwgMTQyNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNiwgMTQyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjYwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzAsIDE0ODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyINCi0JCQlxdWlkICAgICAgIAkiM0FFOEVENzIwMUJEIg0KLQkJCXRpdGxlICAgICAgCSIyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmciDQotCQkJem9vbSAgICAgICAJOTANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbXBvcnQiIEAyNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjIsIDE3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW1wb3J0IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTI3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiDQotCQkJCXdpZHRoICAgICAgCTU5OA0KLQkJCQloZWlnaHQgICAgIAkyMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok5hbWVzcGFjZSIgQDI2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgMTEzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyLCAxMDQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk5hbWVzcGFjZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiDQotCQkJCXdpZHRoICAgICAgCTQ3OQ0KLQkJCQloZWlnaHQgICAgIAkyMTUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMjY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDExNDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNjk0DQotCQkJCWhlaWdodCAgICAgCTE3Mw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDI2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0MDAsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0LCAyMzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTQ5MA0KLQkJCQloZWlnaHQgICAgIAkzMjANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzciIEAyNjcNCi0JCQkJbG9jYXRpb24gICAJKDMwOSwgNzg2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzRDU1MDAyRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTmFtZXNwYWNlcyIgQDI2OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNjcNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTEsIDI1OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjY4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ2MSwgOTU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VOYW1lc3BhY2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk4ODQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTYwMzMyIg0KLQkJCQkJY2xpZW50ICAgICAJQDI2Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDI2NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDEwMjkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDgsIDk3MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2ODcwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDkxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkzDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUyNTA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzgiIEAyNzINCi0JCQkJCVBhcmVudF9WaWV3IAlAMjY3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTkxLCAyNTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNjgsIDU5MikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRDU2MDMyOCINCi0JCQkJCWNsaWVudCAgICAgCUAyNjcNCi0JCQkJCXN1cHBsaWVyICAgCUAyNjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA5LCA1NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzksIDU4MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NDk2MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMjc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgNzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjU1LCA1ODApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDM0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSINCi0JCQkJd2lkdGggICAgICAJNDUyDQotCQkJCWhlaWdodCAgICAgCTMwNA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MSIgQDI3Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NiwgMTAwMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDQzAyRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVNjaGVtYSIgQDI3Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAyNzYNCi0JCQkJCWxvY2F0aW9uICAgCSg1MTAsIC0xMDMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxMDE4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTI1OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyNzAiDQotCQkJCQljbGllbnQgICAgIAlAMjc2DQotCQkJCQlzdXBwbGllciAgIAlAMjY1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ4NiwgMTAwMSkNCi0JCQkJCSAgICAoMTYzMiwgMTAwMSkNCi0JCQkJCSAgICAoMTYzMiwgMTEzMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMiwgMTEzMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjMsIDEwMTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTI1OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUyIiBAMjgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDI3Ng0KLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyN0EiDQotCQkJCQljbGllbnQgICAgIAlAMjc2DQotCQkJCQlzdXBwbGllciAgIAlAMjc1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NiwgODcyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzkiIEAyODENCi0JCQkJbG9jYXRpb24gICAJKDEwODcsIDQwMykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQTAwMkQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDAiIEAyODINCi0JCQkJCVBhcmVudF9WaWV3IAlAMjgxDQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjgzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNiwgNDgwKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0MwMUYyIg0KLQkJCQkJY2xpZW50ICAgICAJQDI4MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDI3NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEwODcsIDQwMykNCi0JCQkJCSAgICAoMTM2NCwgNDAzKQ0KLQkJCQkJICAgICgxMzY0LCA1NjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NCwgNTY4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVEZWZpbml0aW9uIiBAMjg0DQotCQkJCQlQYXJlbnRfVmlldyAJQDI4MQ0KLQkJCQkJbG9jYXRpb24gICAJKDY4NywgLTEyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNSwgMzYzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3NTMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRTgiDQotCQkJCQljbGllbnQgICAgIAlAMjgxDQotCQkJCQlzdXBwbGllciAgIAlAMjY2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDUsIDQwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNDU2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE0OTEwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMjg3DQotCQkJCWxvY2F0aW9uICAgCSg3MzcsIDgyNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTgiIEAyODgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMjg3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUyLCA2NDcpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiDQotCQkJCQljbGllbnQgICAgIAlAMjg3DQotCQkJCQlzdXBwbGllciAgIAlAMjY2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzM3LCA4MjYpDQotCQkJCQkgICAgKDUxMCwgODI2KQ0KLQkJCQkJICAgICg1MTAsIDU0NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNTQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjkwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDU3LCA1OTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMjkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDI4Nw0KLQkJCQkJbG9jYXRpb24gICAJKC02NzEsIDEwNikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDQsIDc3MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5OTE4OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDI4Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDI3NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ2LCA4MjYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTgwLCA4NzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzIyMTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2MiwgOTMzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM3NzI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNGNkYyMDBEMDM0MCINCi0JCQkJY2xpZW50ICAgICAJQDI3NQ0KLQkJCQlzdXBwbGllciAgIAlAMjYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTU1LCA1NjgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCAzMzMpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMiBUeXBlcyINCi0JCQlxdWlkICAgICAgIAkiM0I4NUFFNTkwMzdFIg0KLQkJCXRpdGxlICAgICAgCSIyLjIgVHlwZXMiDQotCQkJem9vbSAgICAgICAJOTANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTgxDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMjk2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEzNiwgMTIzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OTUsIDExNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAk1MDANCi0JCQkJaGVpZ2h0ICAgICAJMTc0DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDI5Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxNjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDYsIDE1MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDc4DQotCQkJCWhlaWdodCAgICAgCTE2Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDI5OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE5NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDE4MjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTE3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiDQotCQkJCXdpZHRoICAgICAgCTUzNQ0KLQkJCQloZWlnaHQgICAgIAkzMDUNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAyOTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTA2NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSINCi0JCQkJd2lkdGggICAgICAJNDY2DQotCQkJCWhlaWdodCAgICAgCTI1OA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NyIgQDMwMA0KLQkJCQlsb2NhdGlvbiAgIAkoNzM1LCAxMTcyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDBDNCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDMwMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDANCi0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzAxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3NSwgMTEzMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI2OTAwNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDMwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDI5Ng0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzUsIDExNzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODg2LCAxMTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM5LCAxMjA3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg4NzA1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0OCIgQDMwNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDANCi0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMzEiDQotCQkJCQljbGllbnQgICAgIAlAMzAwDQotCQkJCQlzdXBwbGllciAgIAlAMjk5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1ODUsIDExNzIpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0OSIgQDMwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNTI3LCAxNTkyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEIxQzEyMDNCMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb24iIEAzMDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzA1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTY1LCAxMDk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY2LCAxNTU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3NTM5NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTQwMDFDIg0KLQkJCQkJY2xpZW50ICAgICAJQDMwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDI5Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk3LCAxNTkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA3LCAxNjQ1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU1ODc3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MCIgQDMwOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjUsIDEwOTYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTQwMDI2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDMwNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDI5OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDUyNywgMTU5MikNCi0JCQkJCSAgICAoNDM3LCAxNTkyKQ0KLQkJCQkJICAgICg0MzcsIDEzMTMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAxMzEzKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTUiIEAzMTANCi0JCQkJbG9jYXRpb24gICAJKDMyMiwgMTkxMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5MzAzRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2UiIEAzMTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMzEwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM4LCAxODcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ4NTYwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMEUiDQotCQkJCQljbGllbnQgICAgIAlAMzEwDQotCQkJCQlzdXBwbGllciAgIAlAMjk4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMyMiwgMTkxMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAxOTExKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQzLCAxOTY1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NiIgQDMxNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTANCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTYwMTE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDMxMA0KLQkJCQkJc3VwcGxpZXIgICAJQDI5OQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDMyMiwgMTkxMSkNCi0JCQkJCSAgICAoMjI5LCAxOTExKQ0KLQkJCQkJICAgICgyMjksIDEzMTMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5LCAxMzEzKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMzE1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA2MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNSwgNTEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCINCi0JCQkJd2lkdGggICAgICAJMzg5DQotCQkJCWhlaWdodCAgICAgCTIxNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDMxNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiDQotCQkJCXdpZHRoICAgICAgCTIyMg0KLQkJCQloZWlnaHQgICAgIAkxMzANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTMiIEAzMTcNCi0JCQkJbG9jYXRpb24gICAJKDIzNCwgNjA0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAzMTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMzE3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgwLCA2NDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA3DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVR5cGVzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjYxMDE3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiDQotCQkJCQljbGllbnQgICAgIAlAMzE3DQotCQkJCQlzdXBwbGllciAgIAlAMzE1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwNiwgNjA0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM4ODMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMzIxDQotCQkJCQlQYXJlbnRfVmlldyAJQDMxNw0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDM5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzIxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMywgMzEzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiDQotCQkJCQljbGllbnQgICAgIAlAMzE3DQotCQkJCQlzdXBwbGllciAgIAlAMzE2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0LCA2MDQpDQotCQkJCQkgICAgKDE3NCwgNjA0KQ0KLQkJCQkJICAgICgxNzQsIDIyNSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NCwgMjI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4LCAyNzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTc3MjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyIgQDMyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDIyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI1LCAyMDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiSVR5cGVzIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI1LCAxNTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCINCi0JCQkJd2lkdGggICAgICAJMjQ4DQotCQkJCWhlaWdodCAgICAgCTE2Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzMjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTksIDc1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MzkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiDQotCQkJCXdpZHRoICAgICAgCTc1Nw0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMzI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDEyMTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjksIDExMDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJNjczDQotCQkJCWhlaWdodCAgICAgCTI1MA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1OSIgQDMyNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTgyNiwgOTc1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ1MDBGMiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MCIgQDMyOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMjcNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0QiDQotCQkJCQljbGllbnQgICAgIAlAMzI3DQotCQkJCQlzdXBwbGllciAgIAlAMzI1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCA4NTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzc0LCA5MDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTY0ODkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDMzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMjcNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDYsIDEwMzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA3NTc2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDYwMjNFIg0KLQkJCQkJY2xpZW50ICAgICAJQDMyNw0KLQkJCQkJc3VwcGxpZXIgICAJQDMyNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgMTA5MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODgsIDEwNTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTE1MTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMzMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0QzQjAzODAiDQotCQkJCWNsaWVudCAgICAgCUAzMTUNCi0JCQkJc3VwcGxpZXIgICAJQDMyNA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzA1LCA1MDApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDUsIDMwNykpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAzMzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAyMjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE1LCAxMzApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIg0KLQkJCQl3aWR0aCAgICAgIAk1MDANCi0JCQkJaGVpZ2h0ICAgICAJMjEyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzM1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIg0KLQkJCQljbGllbnQgICAgIAlAMzE1DQotCQkJCXN1cHBsaWVyICAgCUAzMzQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NCwgNTAwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU0LCAzMzApKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzM2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDQ2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MCwgMzY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSINCi0JCQkJd2lkdGggICAgICAJNjg3DQotCQkJCWhlaWdodCAgICAgCTIxNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDMzNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwNiwgNDkzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMiIgQDMzOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzMzcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTg2LCAyMzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTM2LCAzODYpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiDQotCQkJCQljbGllbnQgICAgIAlAMzM3DQotCQkJCQlzdXBwbGllciAgIAlAMzM0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIwNiwgNDkzKQ0KLQkJCQkJICAgICgxMDk0LCA0OTMpDQotCQkJCQkgICAgKDEwOTQsIDMzMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAzMzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCAzNzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjgzMjYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAzNDENCi0JCQkJCVBhcmVudF9WaWV3IAlAMzM3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NiwgNDU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDM5NzExDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiDQotCQkJCQljbGllbnQgICAgIAlAMzM3DQotCQkJCQlzdXBwbGllciAgIAlAMzM2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDgxLCA0OTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDE1LCA1NDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NjQ5NTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5NiwgMzkyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk0OTE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM0NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MjdGMDBCNyINCi0JCQkJY2xpZW50ICAgICAJQDMyNQ0KLQkJCQlzdXBwbGllciAgIAlAMzM2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODEyLCA3NDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEyLCA1NzIpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMyBNZXNzYWdlcyINCi0JCQlxdWlkICAgICAgIAkiM0JDRTg1M0QwMkM4Ig0KLQkJCXRpdGxlICAgICAgCSIyLjMgTWVzc2FnZXMiDQotCQkJem9vbSAgICAgICAJODUNCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIiBAMzQ2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDEyMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTWVzc2FnZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgNzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQ0KLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiINCi0JCQkJd2lkdGggICAgICAJMzgwDQotCQkJCWhlaWdodCAgICAgCTMyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiIEAzNDcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDEyNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUGFydCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDc0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikNCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSINCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiDQotCQkJCXdpZHRoICAgICAgCTYxNw0KLQkJCQloZWlnaHQgICAgIAkzMjQNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMzQ4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgODE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCA2OTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiDQotCQkJCXdpZHRoICAgICAgCTQ5Mg0KLQkJCQloZWlnaHQgICAgIAkyNzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNDkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTk2RDAyRjEiDQotCQkJCWNsaWVudCAgICAgCUAzNDgNCi0JCQkJc3VwcGxpZXIgICAJQDM0Nw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwNCwgNjc4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwNCwgMzg2KSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMzUwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCA2NTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgNTA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4Ig0KLQkJCQl3aWR0aCAgICAgIAk0MzINCi0JCQkJaGVpZ2h0ICAgICAJMzIyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzUxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4RDEwMkJBIg0KLQkJCQljbGllbnQgICAgIAlAMzUwDQotCQkJCXN1cHBsaWVyICAgCUAzNDYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NSwgNDk1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCAzODgpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMSIgQDM1Mg0KLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA5NTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkUwMEUyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJ0cyIgQDM1Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTINCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgODk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJ0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5NzQ1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkYwMDYxIg0KLQkJCQkJY2xpZW50ICAgICAJQDM1Mg0KLQkJCQkJc3VwcGxpZXIgICAJQDM0OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDk1MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA5NTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEwMDUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODk4MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxMDYxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTMNCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQyMDM4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMiIgQDM1Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTINCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzU3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwNCwgODkzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNTciDQotCQkJCQljbGllbnQgICAgIAlAMzUyDQotCQkJCQlzdXBwbGllciAgIAlAMzUwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjg4LCA5NTIpDQotCQkJCQkgICAgKDQ0NSwgOTUyKQ0KLQkJCQkJICAgICg0NDUsIDgxNykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NSwgODE3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzkzLCA5MTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDc2MDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKSkpKSkNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInNvYXAiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRWQUJBU0VfUExVR0lOU19QQVRIXFxjb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzXFxzcmNcXHJvc2VcXGNvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuU09BUC5jYXQiDQotCQlxdWlkICAgICAgIAkiM0EwMUNGMEMwMUEyIikNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInhzZCINCi0JCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJYU0QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkib3JnLmVjbGlwc2UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkieHNkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNVUkkiDQotCQkJdmFsdWUgICAgICAJImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcveHNkLzIwMDIvWFNEIikpDQotCQlxdWlkICAgICAgIAkiMzlBQkRDNkYwMUFBIg0KLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQW5ub3RhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0RTIwMzY2Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXBwbGljYXRpb25JbmZvcm1hdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RUJGMDJDOCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlckluZm9ybWF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFRUEwMTU3Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVzIg0KLQkJCQlxdWlkICAgICAgIAkiM0JCRjdGMDUwMUUyIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIkRPTUF0dHIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjdEQzAxOTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2MTAzQkUiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg3RjUyMDJCNCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ4RTIwMEVBIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY5NDAzQTAyMjEiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRUIwMkE4Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUM4MDBEMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODdGN0IwMzg2Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVVc2UiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjcyRDczNzAzOEYiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ3QkIwMzQ5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNDRjMwMjdEIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNEREIwM0I3Ig0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNERTAwMkQ4Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMDIyMDM4MiINCi0JCQkJdHlwZSAgICAgICAJIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzE5RDkwMzQxIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREJvdW5kZWRGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1MUQwMzQ0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjNDMDIyNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzUyQTAwQ0MiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5RmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzY0RjAxMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1NkMwMTUzIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ2FyZGluYWxpdHkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4M0JBMDAxOTYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4QjgwMjg2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJBQTIwMzEwIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVyaXZhdGlvbk1ldGhvZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNkU0MDIwRSINCi0JCQkJdHlwZSAgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiDQotCQkJCWluaXR2ICAgICAgCSJyZXN0cmljdGlvbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MUQwMjZBIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBsZXhGaW5hbCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MzgwMEM1Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0E0MjAyQjgiDQotCQkJCXR5cGUgICAgICAgCSJYU0RDb250ZW50VHlwZUNhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0I4QTAzRTYiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjYxODAxNEQiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2siDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRkI5NzAwNkUiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMzFBRjVFMDNBNiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcG9uZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0JBMENFQTkwM0QyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRERCNTAxQTUiDQotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZCMzQwMDkzIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzgwMDM5NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpYyINCi0JCQlxdWlkICAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNENEMwRjRDMDFBMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNldmVyaXR5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY5MUMwMDVEIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERGlhZ25vc3RpY1NldmVyaXR5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWVzc2FnZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU1RkREMDI4MCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwNjM3NDMwMTZCIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGluZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MDdFMDIxMyINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJaW5pdHYgICAgICAJIjEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb2x1bW4iDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjExRTAyOTYiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWluaXR2ICAgICAgCSIxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm9kZSINCi0JCQkJcXVpZCAgICAgICAJIjNDMDE2QjZCMDIwMCINCi0JCQkJdHlwZSAgICAgICAJIkRPTU5vZGUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbm5vdGF0aW9uVVJJIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwNjM3NEYwMTg2Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFREVFMDFCRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1RjE3MDAyRSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNjYwMzM5Ig0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5pbGxhYmxlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGQjQwMjlGIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0NjgwMzY4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0QTAwM0I5Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0RTAwMDBFIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMTRDMDBCMiINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEQxNjgwMUMxIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4OUY2MjAzQ0YiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMzREQ0IwMDAxOCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERW51bWVyYXRpb25GYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBQ0UwMTQxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzlEMDNDNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QzY0MDA1NCINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyNTY4MDI1OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzM3NDAyNTMiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYWNldE5hbWUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg5RkI0MDFFQyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVmZmVjdGl2ZVZhbHVlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QUFFMzAzQjYiDQotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERmVhdHVyZSINCi0JCQlxdWlkICAgICAgIAkiM0I2OUI1MzcwMjZDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGODEwMjBGIg0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUJGODgwMEM1Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZvcm0iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTAyQjAzM0UiDQotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzFBMUIwMTZGIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZ2xvYmFsIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTAwNzAzNzIiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmVhdHVyZVJlZmVyZW5jZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwNDQwMTg1Ig0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERml4ZWRGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5OUUwMEMxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2Qzg4MDFCNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzZBNjAwMjAxIg0KLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qjk5MDAxNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlEMjAwOEEiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnVuZGFtZW50YWxGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5RTgwMUQ2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzdCMDM5NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QUEzMDI0MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkZW50aXR5Q29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQxQzcwMTQzIg0KLQkJCQl0eXBlICAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESW1wb3J0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4RDkwMDNFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQjE1MDM2QyINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJbmNsdWRlIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEM3RDAyNTAiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4REMwMzgxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiDQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETGVuZ3RoRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc4MDAyREYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3NkMwMDRCIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzg5NjAwQzIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOEUwMzA5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzBBMUNFQjAxMEUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MwQTFEMzEwM0FEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRUUyMDFGNyINCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVzaXZlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE3NDAyN0QiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhjbHVzaXZlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE5MzAzNTQiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhJbmNsdXNpdmVGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4N0QwMERBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjgzMDNCOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhMZW5ndGhGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjdEMDBGQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzdEQTAwRjMiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRXhjbHVzaXZlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1OTAyODEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNDMEExQ0RFMDM3QyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQyNDAwOTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRDEwMzk4Ig0KLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUEyMDA4RSINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUJFMDNFMiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzg4NzAyQzkiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNTIwMzUzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkxlbmd0aEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3QzQwMEMwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Nzk5MDE1RSINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBNjQwMjc5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21wb3NpdG9yIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGMUQwMUNGIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcG9zaXRvciINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkUyMDM4MSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZCRDI1NTAzODUiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUY2MDJFOCINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZWRDb21wb25lbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNjg0NkQzMDNBNCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzAwMDE0MiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzA0MDMxRSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzTmFtZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1N0YwMTI3Ig0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidVJJIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTU4NzAwRTIiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGlhc1VSSSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1QUEwMkFGIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwOTYzMDI1RSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETm90YXRpb25EZWNsYXJhdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OTQzMDJGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU0RjAyM0MiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3lzdGVtSWRlbnRpZmllciINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzJFMDBGMCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInB1YmxpY0lkZW50aWZpZXIiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDMzNDAzOTciDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETnVtZXJpY0ZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzU5NTAyMDYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NDIwMDc0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NUEzMDAxMiINCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNET3JkZXJlZEZhY2V0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NTkwMTJDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NEY2MDJEQSINCi0JCQkJdHlwZSAgICAgICAJIlhTRE9yZGVyZWQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGUiDQotCQkJcXVpZCAgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhGQzAxRTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWluT2NjdXJzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOEUwM0IyIg0KLQkJCQl0eXBlICAgICAgIAkiaW50Ig0KLQkJCQlpbml0diAgICAgIAkiMSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1heE9jY3VycyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRjk5MDNBRSINCi0JCQkJdHlwZSAgICAgICAJImludCINCi0JCQkJaW5pdHYgICAgICAJIjEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGVDb250ZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCRDIyMzAwQzYiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3ODBCRDkwMDU5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXR0ZXJuRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM2QURCMDI2QyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkNBNTAzOEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDN0M3OTAzMTEiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0QkEwMjNDIg0KLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNpcmN1bGFyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTY4MDAyMTYiDQotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJcXVpZCAgICAgICAJIjNCNkFFMjA2MDE3MiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJCMzAxRDUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmUiDQotCQkJcXVpZCAgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREI2NDAyNDAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciINCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZXBlYXRhYmxlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM2QUE2MDMxQSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4RjAwMkUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiKSkNCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYSINCi0JCQlxdWlkICAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQzRBMDE4MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvY3VtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0RTUwM0REIg0KLQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg2OEVDMDIyNiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5QkZGMDE4MCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUZvcm1EZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNEIwMTAyIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSINCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudEZvcm1EZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNzgwMEFDIg0KLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSINCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWxEZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEM0QTcwMDM4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2tEZWZhdWx0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY1OUQwMkQ4Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNEMjJENkQ4MDM1NiINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb21wb3NpdG9yIg0KLQkJCXF1aWQgICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0MyMURCNTYwMDkyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hQ29udGVudCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOEU2MDM3MiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCXF1aWQgICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUUzMjEwMkFGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOUIzMDMzMCINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NvcGUiDQotCQkJcXVpZCAgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0Q2NDAyMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NUY1NTAzMkIiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkNCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YXJpZXR5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzMxNTgwMEE5Ig0KLQkJCQl0eXBlICAgICAgIAkiWFNEVmFyaWV0eSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU0NEYwMTQ2Ig0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2NUUwMzVBIg0KLQkJCQlzdGVyZW90eXBlIAkiMC4uKiINCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsaWRGYWNldHMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QUIwRjAwQjYiDQotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIg0KLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFRlcm0iDQotCQkJcXVpZCAgICAgICAJIjNCNjgzQzVFMDE3NCINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhBQTAxRDMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjQ0MDA2OSINCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpKQ0KLQkJCWFic3RyYWN0ICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVG90YWxEaWdpdHNGYWNldCINCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjYxMDMzNyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlBQjAyMzIiDQotCQkJCXR5cGUgICAgICAgCSJpbnQiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVHlwZURlZmluaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJGNTAxM0EiDQotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpDQotCQkJYWJzdHJhY3QgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlRmFjZXQiDQotCQkJcXVpZCAgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkJCXF1aWQgICAgICAgCSIzQjZDNzg2MjAwNDUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc4NTAwMjAxIg0KLQkJCQl0eXBlICAgICAgIAkiWFNEV2hpdGVTcGFjZSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaWxkY2FyZCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTNBMDA0MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikpDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUQwRTkwMTlFIg0KLQkJCQl0eXBlICAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDRjg2MDIyMyINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9jZXNzQ29udGVudHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDEyRTAxRTQiDQotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCREI3MDFGOSINCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiDQotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCXF1aWQgICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDg0RjcwMDkyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQ0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhcmlldHkiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOTAxNTAzREUiDQotCQkJCXR5cGUgICAgICAgCSJYU0RYUGF0aFZhcmlldHkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCN0JCQkUxMDFCMSINCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJET01BdHRyIg0KLQkJCXF1aWQgICAgICAgCSIzQkJGOEM4OTAxQjYiDQotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkF0dHIiDQotCQkJCXF1aWQgICAgICAgCSIzQkJGOENCMDAwRDUiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiDQotCQkJcXVpZCAgICAgICAJIjNDMjc4NTBFMDM4MSINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODUxQjAzQzYiDQotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCINCi0JCQlxdWlkICAgICAgIAkiM0I4MTg5NzkwMjAwIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4MTg5REIwMzc0Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTU5vZGUiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2NEE1MDExNyINCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uTm9kZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NUJGMDAyRCINCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJWYWx1ZSINCi0JCQlxdWlkICAgICAgIAkiM0MwNDBCNUIwMzFGIg0KLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLmxhbmcuT2JqZWN0Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MwNDBCOEQwM0Q1Ig0KLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkE3QjBFODAxQTgiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9wdGlvbmFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMTUwMkI3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTIyMDJEMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjkwMkYwIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1RDAwOUIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbml0ZSINCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MURDMDJFRCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvdW50YWJseUluZmluaXRlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxRUMwMTQxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhGaW5hbCINCi0JCQlxdWlkICAgICAgIAkiM0I5N0MyQ0EwMUNCIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzJFNzAwREEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMkVBMDE2QSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNkQyMDExMiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wb3NpdG9yIg0KLQkJCXF1aWQgICAgICAgCSIzQjg2OUI2MjAwMzciDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5QkQwMDAwMyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNob2ljZSINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5Q0I4MDExRSINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlcXVlbmNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDRTUwMDU3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbnQiDQotCQkJcXVpZCAgICAgICAJIjNCODY5RTI2MDFBRSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVmYXVsdCINCi0JCQkJcXVpZCAgICAgICAJIjNCODY5RThFMDI1OCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NjlFOTkwMjcxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJcXVpZCAgICAgICAJIjNCODZBNzlGMDNBMiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW1wdHkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdDRDAyRjAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzaW1wbGUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdEMTAwQ0UiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCINCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0QzMDFCNyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRPbmx5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDcwMkU5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERlcml2YXRpb25NZXRob2QiDQotCQkJcXVpZCAgICAgICAJIjNCODZBMEIwMDBDRSINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4NkEwQzgwMzI5Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDQzAxNjIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpY1NldmVyaXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQkZFNjhBNzAzMkYiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhdGFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4QzMwM0QwIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXJyb3IiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhFNzAwRTMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3YXJuaW5nIg0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4RUEwMUZGIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5mb3JtYXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQkZFN0ZDMjAxOUEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJcXVpZCAgICAgICAJIjNCOTdDNUE0MDNERiINCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NzkwMDQ1Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2N0YwMUFDIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY4MzAyMEIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiDQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjI0NTAwNjkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERm9ybSINCi0JCQlxdWlkICAgICAgIAkiM0I5RjkxM0IwMUVCIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxdWFsaWZpZWQiDQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTE2RjAwMjMiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bnF1YWxpZmllZCINCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MThDMDA3RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSINCi0JCQlxdWlkICAgICAgIAkiM0I4NkExRTAwMjcyIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXkiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxMjAwODUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXlyZWYiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxMzAxNEYiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlxdWUiDQotCQkJCXF1aWQgICAgICAgCSIzQjg2QTIxNjAzNjUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzVFQTAwMjMiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFueSINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYwMDAzNCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vdCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYyMDA1RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNldCINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDY1MDExNyINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RPcmRlcmVkIg0KLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1MjAyRTQiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhbHNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQTkwMjcxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFydGlhbCINCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUJCMDFGRiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRvdGFsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQzQwMUIyIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2Nlc3NDb250ZW50cyINCi0JCQlxdWlkICAgICAgIAkiM0I4RkY4QzcwMjg0Ig0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHJpY3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhGODAwNDUiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYXgiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhGNjAzOEIiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJza2lwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RTgwMkJBIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzVCRTAyNzIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjhCMDBCOCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2OTQwMjkxIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEYyNTAwMjk1Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNpbXBsZUZpbmFsIg0KLQkJCXF1aWQgICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4MTAyMzAiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgzMDEzOCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODgwMjRFIg0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIg0KLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2RTAwMzc0Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyINCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1OTEwMEFFIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY2NDAyMzEiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjZEMDIxNiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RWYXJpZXR5Ig0KLQkJCXF1aWQgICAgICAgCSIzQjhGRjc3MzAyNDkiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0b21pYyINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0E3MDJERiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiDQotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBRDAxMzkiDQotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0FGMDM5RiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlIg0KLQkJCXF1aWQgICAgICAgCSIzQkVFRDBGNjAzNDIiDQotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIg0KLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByZXNlcnZlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMEYwMTE3Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVwbGFjZSINCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTI3MDM0RCINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbGxhcHNlIg0KLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjkwMzk2Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFhQYXRoVmFyaWV0eSINCi0JCQlxdWlkICAgICAgIAkiM0I4RkZCODkwMzNBIg0KLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiINCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZWxlY3RvciINCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGQkFDMDE5MiINCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpZWxkIg0KLQkJCQlxdWlkICAgICAgIAkiM0I4RkZCQjMwMjc4Ig0KLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzYyNkVBNzAxMDIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjUiDQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVBOTAxOTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjYiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQURDMDJGNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQUREMDIzOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REFERDAyNDIiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjgiDQotCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDA2RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MEQ2MDMwRSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzE4Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzAiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTZCMDJDQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU2RDAwQTciDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzIiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MjZCMDE5NCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMwOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMxMyINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzQiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjA2MDI5MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjA3MDE3MSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcyIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5NDA0RTAwNjciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzciDQotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyOUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyQTUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzgiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzNTlGMDA4NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2OSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVVc2VzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzVBMDAwNkEiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4MCINCi0JCQlxdWlkICAgICAgIAkiM0MyNzVEMzIwMjIwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc1RDNDMDEwRCINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4MiINCi0JCQlxdWlkICAgICAgIAkiM0I2ODg3QkYwMTUwIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODg3QzAwMEE3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4ODdDMDAwQTgiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODQiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MjVFMDFGOSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjYyMDA0NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNjIwMDUwIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NTAxMEQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODciDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NjAwRkEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTg2MDBGQiINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4OCINCi0JCQlxdWlkICAgICAgIAkiM0I2RjFERTkwMThBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RjFERUEwMzZDIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZGMURFQTAzODAiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkwIg0KLQkJCXF1aWQgICAgICAgCSIzQjkwMDY4ODAxQzIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTEiDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMTEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudEFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMUIiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50QW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNTAzNDAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEUiDQotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZGRERENzAxMTMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZGREREQTAyNkIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI3NSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzdERjAyNEYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTciDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdFMTAwRkQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0UxMDBGRSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5OCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMDZFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzQ5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVVzZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzOTU5MDM0QSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVVzZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDAiDQotCQkJcXVpZCAgICAgICAJIjNCNjk4RTM2MDM4NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwNzIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlQ29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwN0MiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVDb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQTAxMjYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODUxQkIwMTUwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTEiDQotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjc1MUIwODAzQzciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGFpbmVyIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNFIg0KLQkJCQlsYWJlbCAgICAgIAkiY29udGFpbmVyIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUIwQzAxQ0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjc1MUI0ODAyNjEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdENvbnRhaW5lciINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjRDMDI4NSINCi0JCQkJbGFiZWwgICAgICAJInJvb3RDb250YWluZXIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwNyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjRDMDI4NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDgiDQotCQkJcXVpZCAgICAgICAJIjNCNzUxQzMxMDM1NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMzAzMzEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzQiINCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIwQTAwNjYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTExIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEIwMjNGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyNDkiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY4OTExNDAxQUYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkxMTUwMDE2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODkxMTUwMDE3Ig0KLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAwNTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0JGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAzQzAiDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4MzNFRjAxNjAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk5Ig0KLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTgiDQotCQkJcXVpZCAgICAgICAJIjNCNkI0MUU2MDI1MSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTkiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDFFQTAyRjciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDMwQiINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjAiDQotCQkJcXVpZCAgICAgICAJIjNCNjlDMDU5MDE5OCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRTMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRUQiDQotCQkJCWxhYmVsICAgICAgCSJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjIiDQotCQkJcXVpZCAgICAgICAJIjNDNDJEQkREMDI5NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjMiDQotCQkJCXF1aWQgICAgICAgCSIzQzQyREJFMDAxMUUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3Vic3RpdHV0aW9uR3JvdXAiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDEyOCINCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjQiDQotCQkJcXVpZCAgICAgICAJIjNCNkQyM0I5MDFDRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjUiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMjNCQTAxQzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDIzQkEwMUNFIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyNiINCi0JCQlxdWlkICAgICAgIAkiM0I2RDU5NzEwMkVBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDEwNSINCi0JCQkJbGFiZWwgICAgICAJInNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjciDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQjZENTk3NTAxMTkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5QjY1MzAxN0EiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAic2NvcGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjY1NDAwNkQiDQotCQkJCWxhYmVsICAgICAgCSJzY29wZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI5MDEwNjAyRDciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRGZWF0dXJlIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOTAxMEIwMDBFIg0KLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRGZWF0dXJlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzMSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwMTBCMDAxOCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzMiINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMTgzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzMyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDMzQyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDM0NiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzQiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEMjlFMDE0RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2VkS2V5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNjUiDQotCQkJCWxhYmVsICAgICAgCSJyZWZlcmVuY2VkS2V5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMkE4MDE2RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzNiINCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEM0QwMDNFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNFMDIyQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic2VsZWN0b3IiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRTAyMzQiDQotCQkJCWxhYmVsICAgICAgCSJzZWxlY3RvciINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM4Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAwMjUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEMzMwMzY1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmaWVsZHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNzkiDQotCQkJCWxhYmVsICAgICAgCSJmaWVsZHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0MCINCi0JCQlxdWlkICAgICAgIAkiM0I2QURDRDgwMkZDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q5MDE4QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURDRDkwMThDIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0MiINCi0JCQlxdWlkICAgICAgIAkiM0I2QURDQzUwMDdFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbmNsdWRlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDN0QwMjUwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QyINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDQiDQotCQkJcXVpZCAgICAgICAJIjNCNjlEQjE3MDJDOCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxODAzRTIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxOTAwMDQiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCMTAyRjgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDFCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkJDRUI2MDAyNSINCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0OCINCi0JCQlxdWlkICAgICAgIAkiM0I2ODM2MDYwMjZGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicGFydGljbGVzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzYwNzAyMjIiDQotCQkJCWxhYmVsICAgICAgCSJwYXJ0aWNsZXMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUwIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIxNTAwOEEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTUxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMDk2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE2MDBBMCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTIiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzN0FDMDI1QSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTMiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdBRDAzMzgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3QUQwMzM5Ig0KLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1NCINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNDUwMzk4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ5MDM4QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ5MDM5RSINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRjAyMTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEM5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEQzIg0KLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1OCINCi0JCQlxdWlkICAgICAgIAkiM0I2QjQ3MTUwMTE5Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0NzFBMDNBQiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQjUiDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjAiDQotCQkJcXVpZCAgICAgICAJIjNCNjgzQzg5MDEyMiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjEiDQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0ZXJtIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTEiDQotCQkJCWxhYmVsICAgICAgCSJ0ZXJtIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYyIg0KLQkJCXF1aWQgICAgICAgCSIzQjZBREU0MjAwOUEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QURFNDMwMkZFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkFERTQzMDMwOCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNDAwNTEiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkFEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiDQotCQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNjAyQjciDQotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QjAwM0QiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTA3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTExIg0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjgiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRThEMDFCRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjkiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RTAxOTgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk5Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWxlbWVudERlY2xhcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3MCINCi0JCQlxdWlkICAgICAgIAkiM0I2NkZERkEwMEMzIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RSINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZURlY2xhcmF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTcyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY2RUU5MjAyMTYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTczIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOTMwMThCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QyINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzQiDQotCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDA0OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzUiDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzNzQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzN0UiDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3NiINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFRkYwMjRGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3NyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI1QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI2NCINCi0JCQkJbGFiZWwgICAgICAJIm1vZGVsR3JvdXBEZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc4Ig0KLQkJCXF1aWQgICAgICAgCSIzQkZDMkExNzAxRUQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JGQzJBMUEwMjczIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkZDMkExQTAyN0QiDQotCQkJCWxhYmVsICAgICAgCSJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4MCINCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFQTcwMjNFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRUE4MDM4QSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJub3RhdGlvbkRlY2xhcmF0aW9ucyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhCIg0KLQkJCQlsYWJlbCAgICAgIAkibm90YXRpb25EZWNsYXJhdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgyIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NjAyOTAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2OUU0NTcwMTY1Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNkYiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4NCINCi0JCQlxdWlkICAgICAgIAkiM0I2RDVDQTUwMTEyIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4NSINCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNCNCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDVDQTcwM0M4Ig0KLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRDAzNzQiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM1QUYwMDA2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRDb250ZW50cyINCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAxMCINCi0JCQkJbGFiZWwgICAgICAJImZhY2V0Q29udGVudHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg4Ig0KLQkJCXF1aWQgICAgICAgCSIzQkM4QUUwMjAzQTgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JDOEFFMDYwMDUxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkM4QUUwNjAwNjUiDQotCQkJCWxhYmVsICAgICAgCSJmYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkwIg0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzRCNzAyMDgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM0QkUwMjU4Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWVtYmVyVHlwZURlZmluaXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTkiDQotCQkJCWxhYmVsICAgICAgCSJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkyIg0KLQkJCXF1aWQgICAgICAgCSIzQjZDMzYzMjAxREIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkzIg0KLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDU5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZnVuZGFtZW50YWxGYWNldHMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNjM1MDA2MyINCi0JCQkJbGFiZWwgICAgICAJImZ1bmRhbWVudGFsRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk0Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZEMzVBQjAyNzMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMjkxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjZEMzVCMjAyQTUiDQotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk2Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZENTU3MjAxNkMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0I2RDU1NzUwMjJGIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDI0MyINCi0JCQkJbGFiZWwgICAgICAJInByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5OCINCi0JCQlxdWlkICAgICAgIAkiM0I2OUUyOTEwMTU4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5OSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMjkyMDE5RiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxQTkiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAwIg0KLQkJCXF1aWQgICAgICAgCSIzQjkwMDZDRjAwODgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAxIg0KLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2RDEwMTVEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZGVyaXZhdGlvbkFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjkwMDZEMTAxNjciDQotCQkJCWxhYmVsICAgICAgCSJkZXJpdmF0aW9uQW5ub3RhdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMiINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMzMwMjY0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMyINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4NCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIzNDAyOEUiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwNCINCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTEwMjZGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwNSINCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDFGOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iDQotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMjAyMDMiDQotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzYyNkVCMzAwMDUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzI3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUI0MDMzMiINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA4Ig0KLQkJCXF1aWQgICAgICAgCSIzQkVCREM4NzAyNDciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMkY5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJcXVpZCAgICAgICAJIjNCRUJEQzhDMDMwMyINCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTAiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2MjI3MDNDRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjIyQjAwNjEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyINCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcG9uZW50cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyMkIwMDZDIg0KLQkJCQlsYWJlbCAgICAgIAkiY29tcG9uZW50cyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTIiDQotCQkJcXVpZCAgICAgICAJIjNCRkU2MjY5MDE2NSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTMiDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjI2QTAwMjYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJkaWFnbm9zdGljcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjI2QTAwMjciDQotCQkJCWxhYmVsICAgICAgCSJkaWFnbm9zdGljcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIg0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxNCINCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0MzEwMzVGIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxNSINCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbGxEaWFnbm9zdGljcyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0JGRTY0MzIwMUM3Ig0KLQkJCQlsYWJlbCAgICAgIAkiYWxsRGlhZ25vc3RpY3MiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyINCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTYiDQotCQkJcXVpZCAgICAgICAJIjNDMjFEQ0M3MDBFQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTciDQotCQkJCXF1aWQgICAgICAgCSIzQzIxRENDRTAwNDIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRTY2hlbWEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQ0NFMDA0MyINCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkU2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTgiDQotCQkJcXVpZCAgICAgICAJIjNDMjFERDBDMDNEQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTkiDQotCQkJCXF1aWQgICAgICAgCSIzQzIxREQxMDAzMDQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciINCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyMUREMTAwMzA1Ig0KLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkU2NoZW1hIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjAiDQotCQkJcXVpZCAgICAgICAJIjNDMjM5MTM0MDA0RiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjEiDQotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwQ0EiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiINCi0JCQkJcXVpZCAgICAgICAJIjNDMjM5MTM2MDBENCINCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjIiDQotCQkJcXVpZCAgICAgICAJIjNDMjVEM0E2MDEzMSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RDNBOTAzNzAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjVEM0E5MDM3MSINCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jaW5nRGlyZWN0aXZlcyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUNGMDAwNUUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDFFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFZlcnNpb24iDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUNGNDAwMjgiDQotCQkJCWxhYmVsICAgICAgCSJyb290VmVyc2lvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI1RUQwQjAxMUIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTIxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpDQotCQkJICAgIChvYmplY3QgUm9sZSAib3JpZ2luYWxWZXJzaW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTJCIg0KLQkJCQlsYWJlbCAgICAgIAkib3JpZ2luYWxWZXJzaW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSINCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjgiDQotCQkJcXVpZCAgICAgICAJIjNDMjVFRUFCMDAxRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUVBRjAxMEIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTE1Ig0KLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIg0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzMCINCi0JCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMERFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzMSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIml0ZW1UeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMEUwIg0KLQkJCQlsYWJlbCAgICAgIAkiaXRlbVR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzMiINCi0JCQlxdWlkICAgICAgIAkiM0MyNzg0NzMwMTk0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzMyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NDc1MDFGMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYUZvclNjaGVtYSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NDc1MDFGQiINCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYUZvclNjaGVtYSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiDQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4ODBGNTAzRDkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyODgwRjkwMDNDIg0KLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGVEZWZpbml0aW9uIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwNDYiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNiINCi0JCQlxdWlkICAgICAgIAkiM0MyODgyQzUwMTM3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIg0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IikNCi0JCQkgICAgKG9iamVjdCBSb2xlICJwcmltYXJ5Q29tcG9uZW50Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNzAxMTMiDQotCQkJCWxhYmVsICAgICAgCSJwcmltYXJ5Q29tcG9uZW50Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzOCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEEwRjIwMUE0Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRTUiDQotCQkJCWxhYmVsICAgICAgCSJ0eXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzkiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhBNkRCMDFFNSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNkREMDNERCINCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDEiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTZERDAzREUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTcxMjAxMDgiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNTEiDQotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQzIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3MTQwMTVCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0NCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3NEIwMTc4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxN0IiDQotCQkJCWxhYmVsICAgICAgCSJzaW1wbGVUeXBlIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxODUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QTdFRDAzQzAiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcGxleFR5cGUiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTdGNDAxMTciDQotCQkJCWxhYmVsICAgICAgCSJjb21wbGV4VHlwZSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ3Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3RjQwMTIxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0OCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEE5OTQwMzBBIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBOTk3MDBERCINCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ5Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEE5OTcwMEU3Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIikpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1MCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwODUwMjVCIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1MSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDg2MDI3MCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwODYwMjdBIg0KLQkJCQlsYWJlbCAgICAgIAkibWluRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RDAyNTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwOEUwMDkxIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4RmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOUIiDQotCQkJCWxhYmVsICAgICAgCSJtYXhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFCMDM5NiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzQzkiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhJbmNsdXNpdmVGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEFDMDNENCINCi0JCQkJbGFiZWwgICAgICAJIm1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4N0QwMERBIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQUYwMzM4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1NyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEIwMDFGOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjAwMjAzIg0KLQkJCQlsYWJlbCAgICAgIAkibWluSW5jbHVzaXZlRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMzAyMDciDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjQwMTkwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibWluRXhjbHVzaXZlRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOUEiDQotCQkJCWxhYmVsICAgICAgCSJtaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEI2MDI4RCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhFeGNsdXNpdmVGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI3MDIyMSINCi0JCQkJbGFiZWwgICAgICAJIm1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2MiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMDUxIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2MyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDI0NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMjUwIg0KLQkJCQlsYWJlbCAgICAgIAkibGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBCRjAxOEMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzAwMDZCIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAid2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzAwMDc1Ig0KLQkJCQlsYWJlbCAgICAgIAkid2hpdGVTcGFjZUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjYiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMEMyMDIxRCINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjciDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUIiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlbnVtZXJhdGlvbkZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMzMDBBQyINCi0JCQkJbGFiZWwgICAgICAJImVudW1lcmF0aW9uRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDNTAxNTkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzYwMEIwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAicGF0dGVybkZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCQSINCi0JCQkJbGFiZWwgICAgICAJInBhdHRlcm5GYWNldHMiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3MCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzgwMkE3Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3MSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM5MDFFQSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImNhcmRpbmFsaXR5RmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDOTAxRjUiDQotCQkJCWxhYmVsICAgICAgCSJjYXJkaW5hbGl0eUZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQjAzOUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjczIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QwIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAibnVtZXJpY0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QxIg0KLQkJCQlsYWJlbCAgICAgIAkibnVtZXJpY0ZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMENGMDE5OSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEMjAwODUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhMZW5ndGhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQyMDA4RiINCi0JCQkJbGFiZWwgICAgICAJIm1heExlbmd0aEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2Ig0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3NiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwRDUwMEM1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3NyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ2MDAxRCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDI3Ig0KLQkJCQlsYWJlbCAgICAgIAkibWluTGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc4Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAwREUiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc5Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0NEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAidG90YWxEaWdpdHNGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ4MDNENyINCi0JCQkJbGFiZWwgICAgICAJInRvdGFsRGlnaXRzRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODAiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCMERCMDM3NyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODEiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQzAzNUEiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJmcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzY0Ig0KLQkJCQlsYWJlbCAgICAgIAkiZnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MiINCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwREYwMDQ4Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MyINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDNCOSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgIm9yZGVyZWRGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDNDMyINCi0JCQkJbGFiZWwgICAgICAJIm9yZGVyZWRGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg0Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjBFMzAwRDkiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg1Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzhFIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiYm91bmRlZEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzk4Ig0KLQkJCQlsYWJlbCAgICAgIAkiYm91bmRlZEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTFEMDM0NCINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyODYiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ0MDFFQyINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyODciDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NTAzNjAiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ1MDM2QSINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZU1heEZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4OCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI1NEYwMTQ1Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4OSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNTUwMDM4QyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNTUwMDM5NiINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkwIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNDAxMUMiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkxIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjBEIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNTAyMTciDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M3MDE0NiINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTIiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCNjJBMDBBQSINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTMiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQjAxMzgiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTQyIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI2QjAwM0E2Ig0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNkIxMDMxMSINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVBhdHRlcm5GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNkIxMDMxMiINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVBhdHRlcm5GYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk2Ig0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQTAyNkIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk3Ig0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTg2Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCN0NCMDE5MCINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOTgiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCODQwMDA2MiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOTkiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MTAwMUQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDI3Ig0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMCINCi0JCQlxdWlkICAgICAgIAkiM0MyOEI4OTgwMTZEIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMSINCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODk5MDA1NiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0Ig0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDYwIg0KLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiDQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAyIg0KLQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAwNTIiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAzIg0KLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0I5Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiDQotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAzQzMiDQotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVMZW5ndGhGYWNldCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCINCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMDQiDQotCQkJcXVpZCAgICAgICAJIjNDMjhCOTcwMDFEQiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMDUiDQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MTAwQ0YiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5GYWNldCINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOTcxMDBEOSINCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZU1pbkZhY2V0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNiINCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0QUUwMUNDIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNyINCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEFGMDEwRiINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY0ZhY2V0cyINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTFBIg0KLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljRmFjZXRzIg0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0Ig0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwOCINCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0RDMwMjhFIg0KLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwOSINCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEQ0MDJGMyINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNQYXJ0aWNsZSINCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQ0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkZEIg0KLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljUGFydGljbGUiDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiDQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEwIg0KLQkJCXF1aWQgICAgICAgCSIzRDRCQjREOTAxRjYiDQotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzExIg0KLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0REEwMjg0Ig0KLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpDQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyOEUiDQotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTIiDQotCQkJcXVpZCAgICAgICAJIjNENEM2OEZGMDFCRiINCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTMiDQotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTciDQotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIg0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljV2lsZGNhcmQiDQotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTgiDQotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCINCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpDQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMS4gQ29tcG9uZW50IEhpZXJhcmNoeSAoUGFydCAxOiBTdHJ1Y3R1cmVzKSINCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ3NjgwMTM4Ig0KLQkJCXRpdGxlICAgICAgCSIxLiBDb21wb25lbnQgSGllcmFyY2h5IChQYXJ0IDE6IFN0cnVjdHVyZXMpIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEAzNjANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDgwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc2NiwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEAzNjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCA1NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQwLCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNjINCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMjI1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzNjANCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoOTI4LCAyMjUpDQotCQkJCSAgICAoOTI4LCAxMzUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEAzNjMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAzMjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MCwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQl3aWR0aCAgICAgIAkyMzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNjQNCi0JCQkJbG9jYXRpb24gICAJKDEyMDMsIDcwNikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzYxDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDEyMDMsIDcwNikNCi0JCQkJICAgICgxMjAzLCA2MTUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDM2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2MjQsIDU2MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNzIsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQl3aWR0aCAgICAgIAk1MjINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNjYNCi0JCQkJbG9jYXRpb24gICAJKDQ0NCwgNzA5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzNjUNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDQ0LCA3MDkpDQotCQkJCSAgICAoNDQ0LCA2MTUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTU3MiwgNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzNjMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTU3MiwgNDY1KQ0KLQkJCQkgICAgKDE1NzIsIDM3NSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAzNjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA4MDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI5MCwgNzU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAzNjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAxMDU2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI2MiwgMTAxMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTM5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDM3MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMTA0LCAzMjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkzNiwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCXdpZHRoICAgICAgCTM1NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM3MQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDUzLCAxMjAzKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzNjkNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNDUzLCAxMjAzKQ0KLQkJCQkgICAgKDQ1MywgMTExMSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEAzNzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDM3Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDgwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQ2LCA3NTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgOTUwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAzNzMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTg3MiwgOTUwKQ0KLQkJCQkgICAgKDE4NzIsIDg1NSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzc1DQotCQkJCWxvY2F0aW9uICAgCSgxODEsIDQ2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzcyDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE4MSwgNDY1KQ0KLQkJCQkgICAgKDE4MSwgMzc1KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDM3Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTM2LCAxMjgwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjcwLCAxMjMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNTUwDQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMzc3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDEwNTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzQsIDEwMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDM3OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNDg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTY5LCAxNDQ0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTEyDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBAMzc5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExODQsIDE0ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDkwMywgMTQ0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NjMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNTgxDQotCQkJCWhlaWdodCAgICAgCTExMg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEAzODANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgNTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYyLCA1MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDM4MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMDU2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NzgsIDEwMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBAMzgyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDU2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzgyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNiwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDM4Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDEyOTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNiwgMTI1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDM4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDU2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjAsIDUxNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAkyODINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAzODUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3MiwgMTI4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAyLCAxMjM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDM4Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDE0ODgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDMwLCAxNDQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTY5NA0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDM4Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjYsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJd2lkdGggICAgICAJMzE4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBAMzg4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA4LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzg0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNDAyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM4OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSINCi0JCQkJY2xpZW50ICAgICAJQDM3MA0KLQkJCQlzdXBwbGllciAgIAlAMzYwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDk0LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAMzkwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTYwLCA4MDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjkwLCA3NTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM5MQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTYyLCA5NDcpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDM5MA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg5NjIsIDk0NykNCi0JCQkJICAgICg5NjIsIDg1NSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTINCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMzkzDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxOCwgMTE1NCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjE2MzUzNA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjkNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiDQotCQkJCWNsaWVudCAgICAgCUAzODMNCi0JCQkJc3VwcGxpZXIgICAJQDM2NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5LCAxMjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5LCA3MDkpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlAMzgzDQotCQkJCXN1cHBsaWVyICAgCUAzNjkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI1NiwgMTI0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NiwgMTIwMykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzcxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiDQotCQkJCWNsaWVudCAgICAgCUAzODQNCi0JCQkJc3VwcGxpZXIgICAJQDM3Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg0LCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzc1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEE2NDAyNzkiDQotCQkJCWNsaWVudCAgICAgCUAzODINCi0JCQkJc3VwcGxpZXIgICAJQDM2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAwMiwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAwMiwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyINCi0JCQkJY2xpZW50ICAgICAJQDM2Mw0KLQkJCQlzdXBwbGllciAgIAlAMzYwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY5LCAyNjUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY5LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIg0KLQkJCQljbGllbnQgICAgIAlAMzgwDQotCQkJCXN1cHBsaWVyICAgCUAzNjMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTAsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTAsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhGQzAxRTciDQotCQkJCWNsaWVudCAgICAgCUAzNjgNCi0JCQkJc3VwcGxpZXIgICAJQDM2NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTEwLCA3NDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTAsIDcwOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiDQotCQkJCWNsaWVudCAgICAgCUAzODUNCi0JCQkJc3VwcGxpZXIgICAJQDM5MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyMSwgMTIyNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjEsIDk0NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkxKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDENCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDAyDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzcsIDg4NikNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjIxNTgxMg0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjQNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiDQotCQkJCWNsaWVudCAgICAgCUAzNzcNCi0JCQkJc3VwcGxpZXIgICAJQDM2Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwMCwgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMDAsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDMNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiDQotCQkJCWNsaWVudCAgICAgCUAzNzcNCi0JCQkJc3VwcGxpZXIgICAJQDM3Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5MywgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDk1MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzc0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCWNsaWVudCAgICAgCUAzNjkNCi0JCQkJc3VwcGxpZXIgICAJQDM5MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDUwLCAxMDAxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCA5NDcpDQotCQkJCWRyYXdTdXBwbGllciAJQDM5MSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIg0KLQkJCQljbGllbnQgICAgIAlAMzcyDQotCQkJCXN1cHBsaWVyICAgCUAzNjANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3LCAyMjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDg0RjcwMDkyIg0KLQkJCQljbGllbnQgICAgIAlAMzg4DQotCQkJCXN1cHBsaWVyICAgCUAzNjANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMTIsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTIsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhCODAyODYiDQotCQkJCWNsaWVudCAgICAgCUAzNjUNCi0JCQkJc3VwcGxpZXIgICAJQDM2MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM0LCA1MDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MzQsIDIyNSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCWNsaWVudCAgICAgCUAzNjENCi0JCQkJc3VwcGxpZXIgICAJQDM2MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MCwgNTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1MCwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJY2xpZW50ICAgICAJQDM4Nw0KLQkJCQlzdXBwbGllciAgIAlAMzYwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzIsIDI2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3MiwgMjI1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCN0RDMDE5MyINCi0JCQkJY2xpZW50ICAgICAJQDM3Ng0KLQkJCQlzdXBwbGllciAgIAlAMzczDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkzLCAxMjIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5MywgOTUwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNzQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiINCi0JCQkJY2xpZW50ICAgICAJQDM3OA0KLQkJCQlzdXBwbGllciAgIAlAMzYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTkwLCAxNDMyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU5MCwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxMg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OTQzMDJGMSINCi0JCQkJY2xpZW50ICAgICAJQDM3OQ0KLQkJCQlzdXBwbGllciAgIAlAMzYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMxLCAxNDMyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMSwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxMw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDM5MA0KLQkJCQlzdXBwbGllciAgIAlAMzYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTksIDc0NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgNzA2KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxNA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDM3Mw0KLQkJCQlzdXBwbGllciAgIAlAMzYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODcyLCA3NDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODcyLCA3MDYpDQotCQkJCWRyYXdTdXBwbGllciAJQDM2NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDE1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIg0KLQkJCQljbGllbnQgICAgIAlAMzgxDQotCQkJCXN1cHBsaWVyICAgCUAzOTANCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MiwgMTAwMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2MiwgOTQ3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxNg0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA0MTcNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUsIDEzODgpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDI1MzENCi0JCQkJICAgIGhlaWdodCAgICAgCTY3DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUJBQTIwMzEwIg0KLQkJCQljbGllbnQgICAgIAlAMzg2DQotCQkJCXN1cHBsaWVyICAgCUAzNzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4LCAxNDI5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzc1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUAzODYNCi0JCQkJc3VwcGxpZXIgICAJQDM2OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjU2LCAxNDI5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU2LCAxMjAzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAzNzEpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJcXVpZCAgICAgICAJIjM3NEIxODE5MDAyOCINCi0JCQl0aXRsZSAgICAgIAkiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiDQotCQkJem9vbSAgICAgICAJOTYNCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA0MTkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3ODQsIDE2MzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcwLCAxNTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiINCi0JCQkJd2lkdGggICAgICAJMjQ2DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDQyMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTYzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgMTU5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI4IiBANDIxDQotCQkJCWxvY2F0aW9uICAgCSg0OTQsIDE2MjcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTMwMTdBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjb3BlIiBANDIyDQotCQkJCQlQYXJlbnRfVmlldyAJQDQyMQ0KLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1NSwgMTU4OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY29wZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3MTI1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTQwMDZEIg0KLQkJCQkJY2xpZW50ICAgICAJQDQyMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQxOQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDE2MjcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYxLCAxNjI3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDI0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxNjY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxMDE4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjkiIEA0MjUNCi0JCQkJCVBhcmVudF9WaWV3IAlANDIxDQotCQkJCQlsb2NhdGlvbiAgIAkoMjg2LCAtNDg1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlCNjU0MDA2RSINCi0JCQkJCWNsaWVudCAgICAgCUA0MjENCi0JCQkJCXN1cHBsaWVyICAgCUA0MjANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMyNywgMTYyNykpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA0MjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE5MiwgMTIzMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDg0LCAxMTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQl3aWR0aCAgICAgIAkyMzQNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDQyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTc2LCA5OTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTEsIDk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI2OA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2MCIgQDQyOA0KLQkJCQlsb2NhdGlvbiAgIAkoMjIyOSwgMTExMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4OTAxMjIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYxIiBANDI5DQotCQkJCQlQYXJlbnRfVmlldyAJQDQyOA0KLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4QTAxMTAiDQotCQkJCQljbGllbnQgICAgIAlANDI4DQotCQkJCQlzdXBwbGllciAgIAlANDI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMjksIDExMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTA0NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0ZXJtIiBANDMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDQyOA0KLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNTcsIDExMjEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdGVybSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzNDMyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDOEEwMTExIg0KLQkJCQkJY2xpZW50ICAgICAJQDQyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDQyNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjksIDExNzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjc0LCAxMTE5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTE5NDAzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDQzMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAxMjMyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiINCi0JCQkJd2lkdGggICAgICAJNTIyDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDQzNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3NjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzcsIDcyNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJMzUyDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ4IiBANDM1DQotCQkJCWxvY2F0aW9uICAgCSgyMjE5LCA4ODApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDYwMjZGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0OSIgQDQzNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0MzUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU3LCAtMjQwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNjA3MDIyMSINCi0JCQkJCWNsaWVudCAgICAgCUA0MzUNCi0JCQkJCXN1cHBsaWVyICAgCUA0MzQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxOSwgODgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDgyMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJ0aWNsZXMiIEA0MzcNCi0JCQkJCVBhcmVudF9WaWV3IAlANDM1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM1NywgLTI0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDM3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDUsIDg4OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJ0aWNsZXMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzYwNzAyMjIiDQotCQkJCQljbGllbnQgICAgIAlANDM1DQotCQkJCQlzdXBwbGllciAgIAlANDI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE5LCA5MzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgxLCA4ODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA0NDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc3NiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjM5LCA5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIg0KLQkJCQl3aWR0aCAgICAgIAkyOTINCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA0NDENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTA3MiwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTA1LCAxMzgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCXdpZHRoICAgICAgCTM1Mg0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANDQyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDk1MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUwOA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NCIgQDQ0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNTkwLCAxMTQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTUiIEA0NDQNCi0JCQkJCVBhcmVudF9WaWV3IAlANDQzDQotCQkJCQlsb2NhdGlvbiAgIAkoMzAyLCAxNDgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMjkxIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ0Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDU5MCwgMTE0MCkNCi0JCQkJCSAgICAoNTQwLCAxMTQwKQ0KLQkJCQkJICAgICg1NDAsIDEwNDUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTQwLCAxMDQ1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDQ0NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NDMNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDIsIDE0OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0MywgMTE3MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4wNTM1NzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDJBNSINCi0JCQkJCWNsaWVudCAgICAgCUA0NDMNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg1OTAsIDExNDApDQotCQkJCQkgICAgKDY0MSwgMTE0MCkNCi0JCQkJCSAgICAoNjQxLCAxMDQ1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkwLCAxMTQwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY0MSwgMTA0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDQ1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4NCwgMTA5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xMjI0NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANDQ4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDk5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQ4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ1LCA5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNTQ0DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTYiIEA0NDkNCi0JCQkJbG9jYXRpb24gICAJKDExMTksIDExMTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3REYwMjRGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk3IiBANDUwDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ0OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTY5LCAtOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdFMTAwRkQiDQotCQkJCQljbGllbnQgICAgIAlANDQ5DQotCQkJCQlzdXBwbGllciAgIAlANDQ4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDExMTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExOSwgMTA0NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50VHlwZSIgQDQ1MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NDkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU5LCAxMTI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA4OTU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZFIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ0OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQzMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTEyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDExNzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYzLCAxMTI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA4OTU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMiIgQDQ1NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NSwgOTgyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1MUJBMDEyNiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDMiIEA0NTUNCi0JCQkJCVBhcmVudF9WaWV3IAlANDU0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg1MUJCMDE1MCINCi0JCQkJCWNsaWVudCAgICAgCUA0NTQNCi0JCQkJCXN1cHBsaWVyICAgCUA0NDgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1NSwgOTgyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODAsIDk4MikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDQ1Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NTQNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTksIC01NzApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ1LCA5MjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDYyODU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQjAxNTEiDQotCQkJCQljbGllbnQgICAgIAlANDU0DQotCQkJCQlzdXBwbGllciAgIAlANDQwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTUsIDk4MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMwLCA5ODIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTUwLCAxMDIyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTQyODU3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk4IiBANDU5DQotCQkJCWxvY2F0aW9uICAgCSg5MjEsIDEyMDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMDZFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk5IiBANDYwDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ1OQ0KLQkJCQkJbG9jYXRpb24gICAJKC04NzEsIC0zNzYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMzQ5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ1OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIxLCAxMDQ1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVVzZXMiIEA0NjENCi0JCQkJCVBhcmVudF9WaWV3IAlANDU5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg3MSwgLTM3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDYxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3OCwgMTI1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVVc2VzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjY5OTM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMzRBIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ1OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIxLCAxMzcxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc5LCAxMjU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjg4MzQ0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDQ2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDc2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMiwgNzI3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiDQotCQkJCXdpZHRoICAgICAgCTM5OA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDQ2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCAxNjMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjIzLCAxNTkxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIg0KLQkJCQl3aWR0aCAgICAgIAk0ODQNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDQ2Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCA0NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDMsIDQwNykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUwOA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1MiIgQDQ2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMjIxNiwgNjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0FDMDI1QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTMiIEA0NjgNCi0JCQkJCVBhcmVudF9WaWV3IAlANDY3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTU1MiwgLTgxNikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzgiDQotCQkJCQljbGllbnQgICAgIAlANDY3DQotCQkJCQlzdXBwbGllciAgIAlANDY2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE2LCA1MDEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cCIgQDQ2OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTUyLCAtODE2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgNjI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXAiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODI2MDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzkiDQotCQkJCQljbGllbnQgICAgIAlANDY3DQotCQkJCQlzdXBwbGllciAgIAlANDM0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE2LCA3MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjU2LCA2MzMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMzM2NDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANDcyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTksIDEzODMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCINCi0JCQkJd2lkdGggICAgICAJNTU2DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODIiIEA0NzMNCi0JCQkJbG9jYXRpb24gICAJKDE2NzYsIDEyMDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QkYwMTUwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgzIiBANDc0DQotCQkJCQlQYXJlbnRfVmlldyAJQDQ3Mw0KLQkJCQkJbG9jYXRpb24gICAJKDQxMiwgLTM0NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdDMDAwQTciDQotCQkJCQljbGllbnQgICAgIAlANDczDQotCQkJCQlzdXBwbGllciAgIAlANDcyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NzYsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NiwgMTM3MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDQ3NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzMNCi0JCQkJCWxvY2F0aW9uICAgCSg0MTIsIC0zNDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODU3LCAxMTA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjI1NzY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QzAwMEE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0MA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzYsIDEwNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjE4LCAxMTA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjE5NjMyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc4IiBANDc4DQotCQkJCWxvY2F0aW9uICAgCSgxNDI5LCAxNDM4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTlGMDA4NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3OSIgQDQ3OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzYzLCAtMTQ2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNUEwMDA2OSINCi0JCQkJCWNsaWVudCAgICAgCUA0NzgNCi0JCQkJCXN1cHBsaWVyICAgCUA0NzINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjEwLCAxNDM4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVVzZXMiIEA0ODANCi0JCQkJCVBhcmVudF9WaWV3IAlANDc4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDUsIDE1MDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzMjU5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDZBIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNDM4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDgsIDE0MzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI3LCAxMzkxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTYzNTM2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANDgzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDgzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzgzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiINCi0JCQkJd2lkdGggICAgICAJNDg0DQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODYiIEA0ODQNCi0JCQkJbG9jYXRpb24gICAJKDc3NywgMTQyNSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NTAxMEQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODciIEA0ODUNCi0JCQkJCVBhcmVudF9WaWV3IAlANDg0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTUxOSwgLTM2NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NjAwRkEiDQotCQkJCQljbGllbnQgICAgIAlANDg0DQotCQkJCQlzdXBwbGllciAgIAlANDQxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTYsIDE0MjUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlRGVjbGFyYXRpb24iIEA0ODYNCi0JCQkJCVBhcmVudF9WaWV3IAlANDg0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTUxOSwgLTM2NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc4NCwgMTUwOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVEZWNsYXJhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNTkyNTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTg2MDBGQiINCi0JCQkJCWNsaWVudCAgICAgCUA0ODQNCi0JCQkJCXN1cHBsaWVyICAgCUA0ODMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc3LCAxNDI1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1OCwgMTQyNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMSwgMTM4NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3MjQ0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3MCIgQDQ4OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM3LCAxMjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTZCMDJDQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MSIgQDQ5MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDQ4OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ4Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzcsIDEyMDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3LCAxMzcxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANDkxDQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDQzLCA3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM4OCwgMTI0NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMzkyNjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2RDAwQTciDQotCQkJCQljbGllbnQgICAgIAlANDg5DQotCQkJCQlzdXBwbGllciAgIAlANDQyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzcsIDEwNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTUsIDEyNDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjM5MjY0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANDk0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgNzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OCwgNzQzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTEwNw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTIiIEA0OTUNCi0JCQkJbG9jYXRpb24gICAJKDcyOCwgNzc1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzM1MDM0MCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5MyIgQDQ5Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUA0OTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtODU2LCAtNTcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzYwMjhEIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ5NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ0OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDcyOCwgNzc1KQ0KLQkJCQkJICAgICg3ODgsIDc3NSkNCi0JCQkJCSAgICAoNzg4LCA5MzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjgsIDc3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODgsIDkzOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA0OTcNCi0JCQkJCVBhcmVudF9WaWV3IAlANDk1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1NiwgLTU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDk4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU4LCA4ODMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMTQwOTQwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzYwMjhFIg0KLQkJCQkJY2xpZW50ICAgICAJQDQ5NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ5NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjgsIDc3NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzksIDc3NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1MCwgODEyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE1MjQzOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANTAwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDQ0OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTAwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxNywgNDA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIg0KLQkJCQl3aWR0aCAgICAgIAk2MDgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzQiIEA1MDENCi0JCQkJbG9jYXRpb24gICAJKDE2MjksIDU3NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RDI5RTAxNEQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVmZXJlbmNlZEtleSIgQDUwMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDENCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MSwgNjA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jZWRLZXkiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNzk3Mjk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNjUiDQotCQkJCQljbGllbnQgICAgIAlANTAxDQotCQkJCQlzdXBwbGllciAgIAlANTAwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYyOSwgNTc0KQ0KLQkJCQkJICAgICgxNTU1LCA1NzQpDQotCQkJCQkgICAgKDE1NTUsIDUwMSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjksIDU3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCA1MDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjIyLCA1MzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDc2MTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzNSIgQDUwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDENCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEMkE4MDE2RiINCi0JCQkJCWNsaWVudCAgICAgCUA1MDENCi0JCQkJCXN1cHBsaWVyICAgCUA1MDANCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjI5LCA1NzQpDQotCQkJCQkgICAgKDE2ODksIDU3NCkNCi0JCQkJCSAgICAoMTY4OSwgNDQ0KQ0KLQkJCQkJICAgICgxNjE2LCA0NDQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxNiwgNDQ0KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM4IiBANTA2DQotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCA2MDgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzOSIgQDUwNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE1LCAzMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNjUiDQotCQkJCQljbGllbnQgICAgIAlANTA2DQotCQkJCQlzdXBwbGllciAgIAlANTAwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA1MDEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmllbGRzIiBANTA4DQotCQkJCQlQYXJlbnRfVmlldyAJQDUwNg0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTA5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExOSwgNjU1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQzOTI1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTc4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUwNg0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNzE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTEwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MywgNjU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5OTA3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNiIgQDUxMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQxNSwgNjA4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNEMDAzRSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzciIEA1MTINCi0JCQkJCVBhcmVudF9WaWV3IAlANTExDQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzLCAzMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMkEiDQotCQkJCQljbGllbnQgICAgIAlANTExDQotCQkJCQlzdXBwbGllciAgIAlANTAwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTUsIDYwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE1LCA1MDEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2VsZWN0b3IiIEA1MTMNCi0JCQkJCVBhcmVudF9WaWV3IAlANTExDQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzLCAzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTMsIDY1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzZWxlY3RvciINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQxMTIxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTk4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjM0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDUxMQ0KLQkJCQkJc3VwcGxpZXIgICAJQDQ2NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE1LCA2MDgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNSwgNzE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTE1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MSwgNjUwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzkyNTIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDUxNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDIyLCA2OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAk1OTkNCi0JCQkJaGVpZ2h0ICAgICAJMjA5DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODAiIEA1MTcNCi0JCQkJbG9jYXRpb24gICAJKDIzOTUsIDYwNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBNzAyM0UiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgxIiBANTE4DQotCQkJCQlQYXJlbnRfVmlldyAJQDUxNw0KLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIDE3NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBODAzOEEiDQotCQkJCQljbGllbnQgICAgIAlANTE3DQotCQkJCQlzdXBwbGllciAgIAlANTE2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM5NSwgNjA2KQ0KLQkJCQkJICAgICgyMzk1LCA2NSkNCi0JCQkJCSAgICAoMTYxMSwgNjUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzk1LCA2MDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgNjUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibm90YXRpb25EZWNsYXJhdGlvbnMiIEA1MTkNCi0JCQkJCVBhcmVudF9WaWV3IAlANTE3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgMTc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTIwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4OSwgMTA0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK25vdGF0aW9uRGVjbGFyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQ4OTc3Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRUE4MDM4QiINCi0JCQkJCWNsaWVudCAgICAgCUA1MTcNCi0JCQkJCXN1cHBsaWVyICAgCUA0NjUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMzk1LCA2MDYpDQotCQkJCQkgICAgKDIzOTUsIDE2MzMpDQotCQkJCQkgICAgKDIwOTgsIDE2MzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzk1LCA2MDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5OCwgMTYzMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTE5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNDQsIDEwNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODc4MjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc2IiBANTIyDQotCQkJCWxvY2F0aW9uICAgCSgxNzcyLCAyNDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFRkYwMjRGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3NyIgQDUyMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjINCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQ4LCAtMzI3KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRjAwMDI1QSINCi0JCQkJCWNsaWVudCAgICAgCUA1MjINCi0JCQkJCXN1cHBsaWVyICAgCUA1MTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMjQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDI0OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiIEA1MjQNCi0JCQkJCVBhcmVudF9WaWV3IAlANTIyDQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyNQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI0DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzYsIDMzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTM1OTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNjQiDQotCQkJCQljbGllbnQgICAgIAlANTIyDQotCQkJCQlzdXBwbGllciAgIAlANDY2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTc3MiwgMjQ5KQ0KLQkJCQkJICAgICgxODMyLCAyNDkpDQotCQkJCQkgICAgKDE4MzIsIDM5NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODMyLCAzOTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAzNDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mzc4NjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTcyIiBANTI3DQotCQkJCWxvY2F0aW9uICAgCSgyMzQ2LCA1MTgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTIwMjE2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MyIgQDUyOA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjcNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTQsIDg2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3MiwgMTg1NykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy42MzAwNzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU5MzAxOEIiDQotCQkJCQljbGllbnQgICAgIAlANTI3DQotCQkJCQlzdXBwbGllciAgIAlANTE2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjM0NiwgNTE4KQ0KLQkJCQkJICAgICgyMzQ2LCAxNDkpDQotCQkJCQkgICAgKDE2MTEsIDE0OSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDUxOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCAxNDkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIgQDUzMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjcNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTQsIDg2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwOCwgMTk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzQ5OTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTMwMThDIg0KLQkJCQkJY2xpZW50ICAgICAJQDUyNw0KLQkJCQkJc3VwcGxpZXIgICAJQDQ3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzNDYsIDUxOCkNCi0JCQkJCSAgICAoMjM0NiwgMTQ0MSkNCi0JCQkJCSAgICAoMjE2NiwgMTQ0MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDUxOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTY2LCAxNDQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI5OSwgMTk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0ODg2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzQiIEA1MzMNCi0JCQkJbG9jYXRpb24gICAJKDIwMywgMTU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDA0OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzUiIEA1MzQNCi0JCQkJCVBhcmVudF9WaWV3IAlANTMzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4NSwgLTI3MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU3NjAzNzQiDQotCQkJCQljbGllbnQgICAgIAlANTMzDQotCQkJCQlzdXBwbGllciAgIAlANTE2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDE1OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbnMiIEA1MzUNCi0JCQkJCVBhcmVudF9WaWV3IAlANTMzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4NSwgLTI3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM0OSwgMTk2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS40NzU3MjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTc2MDM3RSINCi0JCQkJCWNsaWVudCAgICAgCUA1MzMNCi0JCQkJCXN1cHBsaWVyICAgCUA0OTQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMDMsIDE1OSkNCi0JCQkJCSAgICAoMTA0LCAxNTkpDQotCQkJCQkgICAgKDEwNCwgNzg0KQ0KLQkJCQkJICAgICgxODksIDc4NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OSwgNzg0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1LCAyMDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk3MDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc4IiBANTM4DQotCQkJCWxvY2F0aW9uICAgCSgxMDg3LCAzMjkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMTcwMUVEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3OSIgQDUzOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTc3LCAtMjMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMUEwMjczIg0KLQkJCQkJY2xpZW50ICAgICAJQDUzOA0KLQkJCQkJc3VwcGxpZXIgICAJQDUxNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCAzMjkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgMjY0KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBANTQwDQotCQkJCQlQYXJlbnRfVmlldyAJQDUzOA0KLQkJCQkJbG9jYXRpb24gICAJKC01NzcsIC0yMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzUsIDMzOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzMDk1Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI4OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3RCINCi0JCQkJCWNsaWVudCAgICAgCUA1MzgNCi0JCQkJCXN1cHBsaWVyICAgCUA1MDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgMzI5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDM5NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTgsIDMzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEwNzE0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTcwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzAiIEA1NDMNCi0JCQkJbG9jYXRpb24gICAJKDQ4LCAzMjApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkZERkEwMEMzIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MSIgQDU0NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0QiDQotCQkJCQljbGllbnQgICAgIAlANTQzDQotCQkJCQlzdXBwbGllciAgIAlANTE2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNDksIDMyMikNCi0JCQkJCSAgICAoNDksIDY4KQ0KLQkJCQkJICAgICgxMDEzLCA2OCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5LCAzMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgNjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlRGVjbGFyYXRpb25zIiBANTQ1DQotCQkJCQlQYXJlbnRfVmlldyAJQDU0Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtMjg4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM4LCAxMDYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE5ODUzNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI4OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZGREZCMDI3RSINCi0JCQkJCWNsaWVudCAgICAgCUA1NDMNCi0JCQkJCXN1cHBsaWVyICAgCUA0ODMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0OSwgMzIyKQ0KLQkJCQkJICAgICg0OSwgMTQxNSkNCi0JCQkJCSAgICAoMTc0LCAxNDE1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDksIDMyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQsIDE0MTUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MSwgMTA4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE5NjcwNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA1NDgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA0NDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NSwgNDEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCXdpZHRoICAgICAgCTUwMQ0KLQkJCQloZWlnaHQgICAgIAk5Nw0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIwIiBANTQ5DQotCQkJCWxvY2F0aW9uICAgCSg0OTksIDU4OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QzA1OTAxOTgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIxIiBANTUwDQotCQkJCQlQYXJlbnRfVmlldyAJQDU0OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xMywgMTA5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFMyINCi0JCQkJCWNsaWVudCAgICAgCUA1NDkNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg0OTksIDU4OSkNCi0JCQkJCSAgICAoNDUyLCA1ODkpDQotCQkJCQkgICAgKDQ1MiwgNDk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk5LCA1ODkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUyLCA0OTYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiIgQDU1MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgxMSwgNTg1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUwNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJNi41MjA4MzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNUQwMUVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDU0OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU0OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDQ5OSwgNTg5KQ0KLQkJCQkJICAgICg1NDcsIDU4OSkNCi0JCQkJCSAgICAoNTQ3LCA0OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTksIDU4OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDcsIDQ5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ5OSwgNTU5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNCIgQDU1NA0KLQkJCQlsb2NhdGlvbiAgIAkoMjQxLCA2MTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwMDU4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNSIgQDU1NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTQNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAzQkYiDQotCQkJCQljbGllbnQgICAgIAlANTU0DQotCQkJCQlzdXBwbGllciAgIAlANTQ4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MSwgNDk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANTU2DQotCQkJCQlQYXJlbnRfVmlldyAJQDU1NA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMzQzLCAtMjE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTU3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA4LCA2OTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODY0NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNjcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAzQzAiDQotCQkJCQljbGllbnQgICAgIAlANTU0DQotCQkJCQlzdXBwbGllciAgIAlANDk0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MSwgNzMxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTU4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyLCA2ODUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MTAxNjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE2IiBANTU5DQotCQkJCWxvY2F0aW9uICAgCSg4MzcsIDQ2MCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE3IiBANTYwDQotCQkJCQlQYXJlbnRfVmlldyAJQDU1OQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xODE5LCAtNjgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU1OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU0OA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzcsIDQ2MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDQ2MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDU2MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgxOSwgLTY4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCA1MjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNTE0NjINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OSINCi0JCQkJCWNsaWVudCAgICAgCUA1NTkNCi0JCQkJCXN1cHBsaWVyICAgCUA1MDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwOCwgNDYwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCA0MDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA0MzUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY4IiBANTY0DQotCQkJCWxvY2F0aW9uICAgCSg1NDEsIDI0NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RDAxQkYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY5IiBANTY1DQotCQkJCQlQYXJlbnRfVmlldyAJQDU2NA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTIzLCAtMTg2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRThFMDE5OCINCi0JCQkJCWNsaWVudCAgICAgCUA1NjQNCi0JCQkJCXN1cHBsaWVyICAgCUA1MTYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTQxLCAyNDYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMjQ2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVsZW1lbnREZWNsYXJhdGlvbnMiIEA1NjYNCi0JCQkJCVBhcmVudF9WaWV3IAlANTY0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMjMsIC0xODYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDMsIDMzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA5MzAyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTkiDQotCQkJCQljbGllbnQgICAgIAlANTY0DQotCQkJCQlzdXBwbGllciAgIAlANTQ4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNTQxLCAyNDYpDQotCQkJCQkgICAgKDIyNCwgMjQ2KQ0KLQkJCQkJICAgICgyMjQsIDQwMCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyNCwgNDAwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2LCAzMzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjQ2OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIyIiBANTY5DQotCQkJCWxvY2F0aW9uICAgCSgzNTMsIDYyMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzQyREJERDAyOTciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIzIiBANTcwDQotCQkJCQlQYXJlbnRfVmlldyAJQDU2OQ0KLQkJCQkJbG9jYXRpb24gICAJKC02MywgMTczKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNDJEQkUwMDExRSINCi0JCQkJCWNsaWVudCAgICAgCUA1NjkNCi0JCQkJCXN1cHBsaWVyICAgCUA1NDgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzNTMsIDYyMSkNCi0JCQkJCSAgICAoMzA2LCA2MjEpDQotCQkJCQkgICAgKDMwNiwgNDk2KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA2LCA0OTYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3Vic3RpdHV0aW9uR3JvdXAiIEA1NzENCi0JCQkJCVBhcmVudF9WaWV3IAlANTY5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzLCAxNzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzksIDYzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzdWJzdGl0dXRpb25Hcm91cCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAk0LjgwODUxMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCRTAwMTI4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDU2OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDU0OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDM1MywgNjIxKQ0KLQkJCQkJICAgICg0MDAsIDYyMSkNCi0JCQkJCSAgICAoNDAwLCA0OTYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTMsIDYyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MDAsIDQ5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTcxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM1MCwgNTgzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2OTc2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMy4gQ29tcG9uZW50IEF0dHJpYnV0ZXMgIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSINCi0JCQlxdWlkICAgICAgIAkiM0I2OUU3ODYwMkM1Ig0KLQkJCXRpdGxlICAgICAgCSIzLiBDb21wb25lbnQgQXR0cmlidXRlcyAgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDU3NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDEyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NiwgNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NiwgMTA3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbmFtZSA6IFN0cmluZyINCi0JCQkJCSIrIHRhcmdldE5hbWVzcGFjZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1MzQNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANTc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxNjQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTU2NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTUxMg0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANTc2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzNjgsIDE2ODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDE1MjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTE3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDE1ODQpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk1DQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTM5DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZGVyaXZhdGlvbk1ldGhvZCA6IFhTRERlcml2YXRpb25NZXRob2QgPSByZXN0cmljdGlvbiINCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEQ29tcGxleEZpbmFsIg0KLQkJCQkJIisgYWJzdHJhY3QgOiBib29sZWFuIg0KLQkJCQkJIisgY29udGVudFR5cGVDYXRlZ29yeSA6IFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiDQotCQkJCQkiPDwwLi4qPj4gKyBwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikpDQotCQkJCXdpZHRoICAgICAgCTExOTINCi0JCQkJaGVpZ2h0ICAgICAJMzM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDU3Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNDYzLCAzNjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDU3NA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0NjMsIDM2MikNCi0JCQkJICAgICg0NjMsIDIyMSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA1NzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgMTYwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5NCwgMTUxOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDE1NzkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YXJpZXR5IDogWFNEVmFyaWV0eSINCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkNCi0JCQkJd2lkdGggICAgICAJNjQ2DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA1NzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTEyLCAxNDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY0NywgMzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCA5OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHJlcXVpcmVkIDogYm9vbGVhbiINCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiDQotCQkJCQkiKyBjb25zdHJhaW50IDogWFNEQ29uc3RyYWludCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NDgNCi0JCQkJaGVpZ2h0ICAgICAJMjM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANTgwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgMTkzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTgwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4MzApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTI4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTgwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4OTApDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjYwDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IDogWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5Ig0KLQkJCQkJIjw8MC4uKj4+ICsgbmFtZXNwYWNlQ29uc3RyYWludCA6IFN0cmluZyINCi0JCQkJCSIrIHByb2Nlc3NDb250ZW50cyA6IFhTRFByb2Nlc3NDb250ZW50cyIpKQ0KLQkJCQl3aWR0aCAgICAgIAkxMzA0DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANTgxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAxNDQwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgMTM4NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJNTk2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANTgyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCA0MzEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCA0OTEpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDYNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIg0KLQkJCQkJIisgY29uc3RyYWludCA6IFhTRENvbnN0cmFpbnQiKSkNCi0JCQkJd2lkdGggICAgICAJNTU0DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1ODMNCi0JCQkJbG9jYXRpb24gICAJKDI5NCwgNjk3KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA1ODINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjk0LCA2OTcpDQotCQkJCSAgICAoMjk0LCA2MDUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDU4NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNTYsIDEyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NSwgNDcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSINCi0JCQkJd2lkdGggICAgICAJNTQwDQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDU4NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjg4LCA1MTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxOCwgNDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiINCi0JCQkJd2lkdGggICAgICAJNTU4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1ODYNCi0JCQkJbG9jYXRpb24gICAJKDI2ODQsIDk2MikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANTg1DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI2ODQsIDk2MikNCi0JCQkJICAgICgyNjg0LCA1NzYpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvc2l0b3IiIEA1ODcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxMTE2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvc2l0b3IiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTA2NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlCNjIwMDM3Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDQNCi0JCQkJaGVpZ2h0ICAgICAJMjkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbnQiIEA1ODgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDUyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM4LCA0NjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWludCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDE5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2OUUyNjAxQUUiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGVyaXZhdGlvbk1ldGhvZCIgQDU4OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDIyNzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODAsIDIyMTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGVyaXZhdGlvbk1ldGhvZCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODAsIDIxNjMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCODZBMEIwMDBDRSINCi0JCQkJd2lkdGggICAgICAJNDQyDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIgQDU5MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1ODQsIDE3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4MSwgODgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjA3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCAzOCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjA3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I4NkExRTAwMjcyIg0KLQkJCQl3aWR0aCAgICAgIAk2MjUNCi0JCQkJaGVpZ2h0ICAgICAJMzAwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiIEA1OTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzA0LCAyMjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDU2LCAyMTE1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDU2LCAyMDY1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTc5RjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTUxNA0KLQkJCQloZWlnaHQgICAgIAkzNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDU5Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMTYwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNTE2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFZhcmlldHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MDgsIDE0NjYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSINCi0JCQkJd2lkdGggICAgICAJMzYyDQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9jZXNzQ29udGVudHMiIEA1OTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDIyNDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc2NiwgMjE1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDIxMDYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOEZGOEM3MDI4NCINCi0JCQkJd2lkdGggICAgICAJNDM4DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aFZhcmlldHkiIEA1OTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzY4LCAxNjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI1ODcsIDk3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoVmFyaWV0eSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI1ODcsIDQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjhGRkI4OTAzM0EiDQotCQkJCXdpZHRoICAgICAgCTM4MQ0KLQkJCQloZWlnaHQgICAgIAkyNTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA1OTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMTg3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTc4OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3MzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTg0OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTE5OQ0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGxpc3QiDQotCQkJCQkiKyByZXN0cmljdGlvbiINCi0JCQkJCSIrIHVuaW9uIikpDQotCQkJCXdpZHRoICAgICAgCTM0NA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleEZpbmFsIiBANTk2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDIwMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDE5NDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleEZpbmFsIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMTg5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyQ0EwMUNCIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAyMDAxKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjAyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkNCi0JCQkJd2lkdGggICAgICAJMzgyDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiIEA1OTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4NSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDEwNzUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYzMA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDNTkxMDBBRSINCi0JCQkJd2lkdGggICAgICAJNjQ4DQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIgQDU5OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDQwLCAxMjAwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMTE2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTA2NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QTQwM0RGIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMTc2KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM2DQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgc3Vic3RpdHV0aW9uIg0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkNCi0JCQkJd2lkdGggICAgICAJNTU2DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIgQDU5OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjY0LCAyMjcyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMjEzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjE2MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QkUwMjcyIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMjczKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjAyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZXh0ZW5zaW9uIg0KLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkNCi0JCQkJd2lkdGggICAgICAJNTUwDQotCQkJCWhlaWdodCAgICAgCTI0Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiIEA2MDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDIyNDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAyMTU0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY3OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAyMTA0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVFQTAwMjMiDQotCQkJCXdpZHRoICAgICAgCTY5Ng0KLQkJCQloZWlnaHQgICAgIAkyOTYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANjAxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyNjQsIDg4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCA3NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTM4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgODA5KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJNA0KLQkJCQkgICAgbWF4X3dpZHRoICAJMTM1Nw0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIG5pbGxhYmxlIDogYm9vbGVhbiINCi0JCQkJCSI8PDAuLio+PiArIGRpc2FsbG93ZWRTdWJzdGl0dXRpb25zIDogWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiDQotCQkJCQkiPDwwLi4qPj4gKyBzdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMgOiBYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiDQotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJMTQwNA0KLQkJCQloZWlnaHQgICAgIAkyODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MDINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiDQotCQkJCWNsaWVudCAgICAgCUA2MDENCi0JCQkJc3VwcGxpZXIgICAJQDU4Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjgxLCA3MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODEsIDY5NykNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTgzKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA2MDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA4NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCA4MTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0OTINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDYwNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNjg4LCAxMTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDIwLCAxMTAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiDQotCQkJCWNsaWVudCAgICAgCUA2MDQNCi0JCQkJc3VwcGxpZXIgICAJQDU4NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg2MiwgMTA4OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NjIsIDk2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTg2KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA2MDYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM1MiwgMTMxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTY4LCAxMjYxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzg2DQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MDcNCi0JCQkJbG9jYXRpb24gICAJKDIzNzUsIDE0NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDYwNg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyMzc1LCAxNDY1KQ0KLQkJCQkgICAgKDIzNzUsIDEzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjA4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQljbGllbnQgICAgIAlANjA2DQotCQkJCXN1cHBsaWVyICAgCUA1ODUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNjgsIDEyNDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzY4LCA5NjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDU4NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjA5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlANTc2DQotCQkJCXN1cHBsaWVyICAgCUA2MDYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4MTgsIDE1MTIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODE4LCAxNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MDcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYxMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDU3OA0KLQkJCQlzdXBwbGllciAgIAlANjA2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA2LCAxNTA3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwNiwgMTQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjA3KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA2MTENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMTE1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjExDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxOCwgMTEwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTUxMA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MTINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDNDAwOTAiDQotCQkJCWNsaWVudCAgICAgCUA2MTENCi0JCQkJc3VwcGxpZXIgICAJQDU4NQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExNSwgMTA4OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDk2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANTg2KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDYxMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDUyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjEzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNCwgNDY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTExMzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJd2lkdGggICAgICAJMTE1MA0KLQkJCQloZWlnaHQgICAgIAkxNDQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MTQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEFBMzAyNDIiDQotCQkJCWNsaWVudCAgICAgCUA2MTMNCi0JCQkJc3VwcGxpZXIgICAJQDU3NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2OCwgNDU2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OCwgMzYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA1NzcpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANjE1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgNzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDc4LCA3MDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDg0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTUwMg0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANjE2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MywgMjY4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4NA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDk0MzAyRjEiDQotCQkJCWNsaWVudCAgICAgCUA2MTUNCi0JCQkJc3VwcGxpZXIgICAJQDU3NA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI5MCwgNjkxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5MCwgMzYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA1NzcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYxOA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCN0RDMDE5MyINCi0JCQkJY2xpZW50ICAgICAJQDYwMw0KLQkJCQlzdXBwbGllciAgIAlANTgyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDEsIDgwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MSwgNjk3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA1ODMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYxOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyINCi0JCQkJY2xpZW50ICAgICAJQDU4Mg0KLQkJCQlzdXBwbGllciAgIAlANTc0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNzIsIDQxOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM3MiwgMzYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA1NzcpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYyMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCINCi0JCQkJY2xpZW50ICAgICAJQDU4NQ0KLQkJCQlzdXBwbGllciAgIAlANTc0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjg3LCA0NDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjg3LCAzNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDU3NykpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSINCi0JCQlxdWlkICAgICAgIAkiM0I2QzMyNjUwMDVGIg0KLQkJCXRpdGxlICAgICAgCSI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIgQDYyMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgODk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDMyLCA4NDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERml4ZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiDQotCQkJCXdpZHRoICAgICAgCTMzOA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IiBANjIyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA4OTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA0LCA4NDUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVwZWF0YWJsZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSINCi0JCQkJd2lkdGggICAgICAJNDUwDQotCQkJCWhlaWdodCAgICAgCTEyNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0IiBANjIzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjYsIDExMTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERW51bWVyYXRpb25GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJCXdpZHRoICAgICAgCTQ3OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IiBANjI0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc3LCAxMTEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiDQotCQkJCXdpZHRoICAgICAgCTQ4MA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjI1DQotCQkJCWxvY2F0aW9uICAgCSg3MTgsIDEwNDkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDYyMg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg3MTgsIDEwNDkpDQotCQkJCSAgICAoNzE4LCA5NTkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIgQDYyNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDkyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc5OSwgODcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJCXdpZHRoICAgICAgCTQyMA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IiBANjI3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgOTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzgzLCA4NzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzcwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQm91bmRlZEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTFEMDM0NCINCi0JCQkJd2lkdGggICAgICAJMzg4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IiBANjI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAzMiwgMTEwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNywgMTA0OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiINCi0JCQkJd2lkdGggICAgICAJNDY4DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROdW1lcmljRmFjZXQiIEA2MjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCAxMTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzE5LCAxMDQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE51bWVyaWNGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiDQotCQkJCXdpZHRoICAgICAgCTM4OA0KLQkJCQloZWlnaHQgICAgIAkxMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEA2MzANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NTYsIDEzNzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5MSwgMTMyMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciDQotCQkJCXdpZHRoICAgICAgCTM0OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluTGVuZ3RoRmFjZXQiIEA2MzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDE1NTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQwNSwgMTQ5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5MZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiDQotCQkJCXdpZHRoICAgICAgCTQyNA0KLQkJCQloZWlnaHQgICAgIAkxMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjMyDQotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDEyNjIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDYyMQ0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNDQsIDEyNjIpDQotCQkJCSAgICAoMTQ0LCA5NjQpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IiBANjMzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMTU1MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNywgMTQ5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhMZW5ndGhGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiDQotCQkJCXdpZHRoICAgICAgCTQzNg0KLQkJCQloZWlnaHQgICAgIAkxMzQNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IiBANjM0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTM3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCAxMzIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciDQotCQkJCXdpZHRoICAgICAgCTQ5OA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEA2MzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDkwLCAxNjc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEluY2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSINCi0JCQkJd2lkdGggICAgICAJNDYyDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCIgQDYzNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE5MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDE4NTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RXhjbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIg0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IiBANjM3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxNzI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyODIsIDE2NzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5Ig0KLQkJCQl3aWR0aCAgICAgIAk0NDYNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBANjM4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxOTA0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQsIDE4NTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRXhjbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIg0KLQkJCQl3aWR0aCAgICAgIAk0NzQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiIEA2MzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUyLCAyMDU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRvdGFsRGlnaXRzRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCQl3aWR0aCAgICAgIAk0MjYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiIEA2NDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAyMTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzE4LCAyMDU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIg0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOUQwM0M3Ig0KLQkJCQljbGllbnQgICAgIAlANjIzDQotCQkJCXN1cHBsaWVyICAgCUA2MjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM5NCwgMTEwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM5NCwgMTA0OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjI1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDINCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg2MjAwNDUiDQotCQkJCWNsaWVudCAgICAgCUA2MzQNCi0JCQkJc3VwcGxpZXIgICAJQDYyMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTMwOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDY0Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDMzNiwgMTYwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NCwgMTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkNBNTAzOEQiDQotCQkJCWNsaWVudCAgICAgCUA2MjQNCi0JCQkJc3VwcGxpZXIgICAJQDYyMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA0NCwgMTEwMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNDQsIDEwNDkpDQotCQkJCWRyYXdTdXBwbGllciAJQDYyNSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3ODAwMkRGIg0KLQkJCQljbGllbnQgICAgIAlANjMwDQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2MywgMTMwOCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MywgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZCIgQDY0Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNDgsIDE0MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEzMjQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEyNzQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCQzc3MTUyMDJFNCINCi0JCQkJd2lkdGggICAgICAJNDQ0DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eSIgQDY0Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNDgsIDE3MjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDE2NjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHkiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjE5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkM3NzE1RDAwOUIiDQotCQkJCXdpZHRoICAgICAgCTQ0NA0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZSIgQDY0OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDIwMzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjEsIDE5NTEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjEsIDE5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCRUVEMEY2MDM0MiINCi0JCQkJd2lkdGggICAgICAJNDI0DQotCQkJCWhlaWdodCAgICAgCTI4Nw0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpWYWx1ZSIgQDY0OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMjA5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDYyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTYxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlZhbHVlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MwNDBCNUIwMzFGIg0KLQkJCQl3aWR0aCAgICAgIAk2MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTkyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjUwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNjEwMzM3Ig0KLQkJCQljbGllbnQgICAgIAlANjM5DQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAyMDQ0KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IiBANjUxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMTM3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTMsIDEzMjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjg2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTMsIDEzODApDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTQNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB2YWx1ZSA6IFZhbHVlIikpDQotCQkJCXdpZHRoICAgICAgCTMwNA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiIEA2NTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTM3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMzIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTM4MCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1OA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkNCi0JCQkJd2lkdGggICAgICAJMzA2DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExRDI0MDA5OCINCi0JCQkJY2xpZW50ICAgICAJQDY1MQ0KLQkJCQlzdXBwbGllciAgIAlANjIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzUsIDEzMDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzUsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFEMzEwM0FEIg0KLQkJCQljbGllbnQgICAgIAlANjUyDQotCQkJCXN1cHBsaWVyICAgCUA2MjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDEzMDgpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTgxLCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjUyMDM1MyINCi0JCQkJY2xpZW50ICAgICAJQDYzNw0KLQkJCQlzdXBwbGllciAgIAlANjUxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODUsIDE2NjQpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODUsIDE0NDQpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTYNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I4MzAzQjgiDQotCQkJCWNsaWVudCAgICAgCUA2MzUNCi0JCQkJc3VwcGxpZXIgICAJQDY1Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwMCwgMTY2NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDAsIDE0NDQpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I4RTAzMDkiDQotCQkJCWNsaWVudCAgICAgCUA2MzYNCi0JCQkJc3VwcGxpZXIgICAJQDY1Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyMiwgMTg0MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjIsIDE0NDQpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNDAwQzAiDQotCQkJCWNsaWVudCAgICAgCUA2MzENCi0JCQkJc3VwcGxpZXIgICAJQDYyMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDQ3LCAxNDg1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ3LCAxMjYyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1OQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjdEMDBGQyINCi0JCQkJY2xpZW50ICAgICAJQDYzMw0KLQkJCQlzdXBwbGllciAgIAlANjIxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzk3LCAxNDg1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM5NywgMTI2MikNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I5OTAwMTYiDQotCQkJCWNsaWVudCAgICAgCUA2NDANCi0JCQkJc3VwcGxpZXIgICAJQDYyMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3NSwgMjA0NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzUsIDEyNjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANjYxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMzY4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NCwgMzE4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiINCi0JCQkJd2lkdGggICAgICAJNDA2DQotCQkJCWhlaWdodCAgICAgCTEyNQ0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NjINCi0JCQkJbG9jYXRpb24gICAJKDM2NiwgNTIyKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA2NjENCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMzY2LCA1MjIpDQotCQkJCSAgICAoMzY2LCA0MzApKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBANjYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA2MjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQsIDU3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCXdpZHRoICAgICAgCTQ2Mg0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjY0DQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDc4MSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjYzDQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDI3MiwgNzgxKQ0KLQkJCQkgICAgKDI3MiwgNjg3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzhGMDAyRSINCi0JCQkJY2xpZW50ICAgICAJQDYyMg0KLQkJCQlzdXBwbGllciAgIAlANjYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTQsIDgzMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU5NCwgNzgxKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjQpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IiBANjY2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzUyLCA2MjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjY2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERnVuZGFtZW50YWxGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiDQotCQkJCXdpZHRoICAgICAgCTQ3MA0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjY3DQotCQkJCWxvY2F0aW9uICAgCSg3NjgsIDc4OSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlANjY2DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDc2OCwgNzg5KQ0KLQkJCQkgICAgKDc2OCwgNjg3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjU5MDEyQyINCi0JCQkJY2xpZW50ICAgICAJQDYyNg0KLQkJCQlzdXBwbGllciAgIAlANjY2DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDUwLCA4NjApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDUwLCA3ODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2NykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjY5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2M0MwMjI0Ig0KLQkJCQljbGllbnQgICAgIAlANjI3DQotCQkJCXN1cHBsaWVyICAgCUA2NjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MjUsIDg2MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjUsIDc4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NzANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0RjAxMzEiDQotCQkJCWNsaWVudCAgICAgCUA2MjgNCi0JCQkJc3VwcGxpZXIgICAJQDY2Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIzNywgMTAzNikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMzcsIDc4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NzENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0MjAwNzQiDQotCQkJCWNsaWVudCAgICAgCUA2MjkNCi0JCQkJc3VwcGxpZXIgICAJQDY2Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMTAzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDc4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY3KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA2NzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NiwgMTYwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCA0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDEwNykNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTU5OA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIHZhcmlldHkgOiBYU0RWYXJpZXR5Ig0KLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk2NTYNCi0JCQkJaGVpZ2h0ICAgICAJMjUwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNiIgQDY3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNzc1LCAxNzgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzEwMkVBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyNyIgQDY3NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2NzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwOSwgLTQ2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjc1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA5LCAyMzUpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3NTAxMTkiDQotCQkJCQljbGllbnQgICAgIAlANjczDQotCQkJCQlzdXBwbGllciAgIAlANjYxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzc1LCAxNzgpDQotCQkJCQkgICAgKDU1MCwgMTc4KQ0KLQkJCQkJICAgICg1NTAsIDMwNikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NSwgMTc4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU1MCwgMzA2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNpbXBsZVR5cGVEZWZpbml0aW9uIiBANjc2DQotCQkJCQlQYXJlbnRfVmlldyAJQDY3Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMjA5LCAtNDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzUsIDEzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4MzEzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzUwMTA1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDY3Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzUsIDE3OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAxNzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYxLCAyMTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTI1MDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg4IiBANjc5DQotCQkJCWxvY2F0aW9uICAgCSgzNjksIDcyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQzhBRTAyMDNBOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmYWNldHMiIEA2ODANCi0JCQkJCVBhcmVudF9WaWV3IAlANjc5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2ODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDQ5NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4NjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCQzhBRTA2MDA2NSINCi0JCQkJCWNsaWVudCAgICAgCUA2NzkNCi0JCQkJCXN1cHBsaWVyICAgCUA2NjMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgzNjksIDcyKQ0KLQkJCQkJICAgICgxMDAsIDcyKQ0KLQkJCQkJICAgICgxMDAsIDU2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM2OSwgNzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwLCA1NjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2ODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNDk4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3OTAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODkiIEA2ODMNCi0JCQkJCVBhcmVudF9WaWV3IAlANjc5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2ODQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzYsIDMxKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JDOEFFMDYwMDUxIg0KLQkJCQkJY2xpZW50ICAgICAJQDY3OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjksIDcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDcyKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMwIiBANjg1DQotCQkJCWxvY2F0aW9uICAgCSgxNTM4LCA1MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4Ng0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTM4LCA0NDkpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwDQotCQkJCSAgICBoZWlnaHQgICAgIAk2MA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNzZEQTAwMERFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzMSIgQDY4Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2ODUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDQ2LCAyODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2ODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ2LCAzNDApDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwREYiDQotCQkJCQljbGllbnQgICAgIAlANjg1DQotCQkJCQlzdXBwbGllciAgIAlANjcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzOCwgNTA4KQ0KLQkJCQkJICAgICgxNDg3LCA1MDgpDQotCQkJCQkgICAgKDE0ODcsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAyODUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaXRlbVR5cGVEZWZpbml0aW9uIiBANjg5DQotCQkJCQlQYXJlbnRfVmlldyAJQDY4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC00NDYsIDI4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY5MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjg5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjMsIDU3NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpdGVtVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuMjExNTM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NkRBMDAwRTAiDQotCQkJCQljbGllbnQgICAgIAlANjg1DQotCQkJCQlzdXBwbGllciAgIAlANjcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzOCwgNTA4KQ0KLQkJCQkJICAgICgxNTkwLCA1MDgpDQotCQkJCQkgICAgKDE1OTAsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTkwLCAyODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTM5LCA0NjgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDM5ODQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkwIiBANjkyDQotCQkJCWxvY2F0aW9uICAgCSgxNzI5LCA1NzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QjcwMjA4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5MSIgQDY5Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2OTINCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjM3LCAzNTMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzRCRTAyNTgiDQotCQkJCQljbGllbnQgICAgIAlANjkyDQotCQkJCQlzdXBwbGllciAgIAlANjcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTcyOSwgNTc0KQ0KLQkJCQkJICAgICgxNjc4LCA1NzQpDQotCQkJCQkgICAgKDE2NzgsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MjksIDU3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc4LCAyODUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWVtYmVyVHlwZURlZmluaXRpb25zIiBANjk1DQotCQkJCQlQYXJlbnRfVmlldyAJQDY5Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDM1MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY5Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTksIDY1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittZW1iZXJUeXBlRGVmaW5pdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuMjY5MjMxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzRCRTAyNTkiDQotCQkJCQljbGllbnQgICAgIAlANjkyDQotCQkJCQlzdXBwbGllciAgIAlANjcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTcyOSwgNTc0KQ0KLQkJCQkJICAgICgxNzgxLCA1NzQpDQotCQkJCQkgICAgKDE3ODEsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MjksIDU3NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzgxLCAyODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzMwLCA1MjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMTIxMjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkyIiBANjk4DQotCQkJCWxvY2F0aW9uICAgCSg3NDgsIDI2OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzMjAxREIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZnVuZGFtZW50YWxGYWNldHMiIEA2OTkNCi0JCQkJCVBhcmVudF9WaWV3IAlANjk4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMzYsIDQ1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzAwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCAzMTIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZnVuZGFtZW50YWxGYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDA5MDkxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzNTAwNjMiDQotCQkJCQljbGllbnQgICAgIAlANjk4DQotCQkJCQlzdXBwbGllciAgIAlANjY2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzQ4LCAyNjkpDQotCQkJCQkgICAgKDY1OSwgMjY5KQ0KLQkJCQkJICAgICg2NTksIDU2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc0OCwgMjY5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1OSwgNTYxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzAxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzI4LCAzODUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzgwMjgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5MyIgQDcwMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA2OTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIzNiwgNDUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDUyLCAyMjgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzNTAwNTkiDQotCQkJCQljbGllbnQgICAgIAlANjk4DQotCQkJCQlzdXBwbGllciAgIAlANjcyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc0OCwgMjY5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDI2OSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NCIgQDcwNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE3NSwgMzk2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTUiIEA3MDUNCi0JCQkJCVBhcmVudF9WaWV3IAlANzA0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTgwOSwgMTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzA2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5NCwgMzE2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMjkxIg0KLQkJCQkJY2xpZW50ICAgICAJQDcwNA0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzUsIDM5NikNCi0JCQkJCSAgICAoMTEzNSwgMzk2KQ0KLQkJCQkJICAgICgxMTM1LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc1LCAzOTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzNSwgMjg1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDcwNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MDQNCi0JCQkJCWxvY2F0aW9uICAgCSgtODA5LCAxNzIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA0NDMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjUzMzMzMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDcwNA0KLQkJCQkJc3VwcGxpZXIgICAJQDY3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNzUsIDM5NikNCi0JCQkJCSAgICAoMTIxNSwgMzk2KQ0KLQkJCQkJICAgICgxMjE1LCAyODUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc1LCAzOTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxNSwgMjg1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzA5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MiwgMzU5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA5NjE1NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTYiIEA3MTANCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDQ0NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3MjAxNkMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTk3IiBANzExDQotCQkJCQlQYXJlbnRfVmlldyAJQDcxMA0KLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzExDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNjgsIDMyNykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1NTc1MDIyRiINCi0JCQkJCWNsaWVudCAgICAgCUA3MTANCi0JCQkJCXN1cHBsaWVyICAgCUA2NzINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzYwLCA0NDYpDQotCQkJCQkgICAgKDEzMDksIDQ0NikNCi0JCQkJCSAgICAoMTMwOSwgMjg1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MCwgNDQ2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDksIDI4NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIgQDcxMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNjI0LCAyMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjA0LCA1MDgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDMyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcHJpbWl0aXZlVHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuMDAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3NTAyNDMiDQotCQkJCQljbGllbnQgICAgIAlANzEwDQotCQkJCQlzdXBwbGllciAgIAlANjcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM2MCwgNDQ2KQ0KLQkJCQkJICAgICgxNDEyLCA0NDYpDQotCQkJCQkgICAgKDE0MTIsIDI4NSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDEyLCAyODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzczLCA0MDkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjIxNDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA3MTYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgNTEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCA0MjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCAzNzgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzE2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDg4KQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMw0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjAyDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgbGlzdCINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIg0KLQkJCQkJIisgdW5pb24iKSkNCi0JCQkJd2lkdGggICAgICAJMzQ0DQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RWYXJpZXR5IiBANzE3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE4LCA5MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzE3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgNDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcNCi0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSINCi0JCQkJd2lkdGggICAgICAJMzQyDQotCQkJCWhlaWdodCAgICAgCTI5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcxOA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzdCMDM5NiINCi0JCQkJY2xpZW50ICAgICAJQDY2Ng0KLQkJCQlzdXBwbGllciAgIAlANjYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTEsIDU2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU5MSwgNTIyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcxOQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzgwMDM5NCINCi0JCQkJY2xpZW50ICAgICAJQDY2Mw0KLQkJCQlzdXBwbGllciAgIAlANjYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzIsIDU2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MiwgNTIyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcyMA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQyNTY4MDI1OSINCi0JCQkJY2xpZW50ICAgICAJQDY2MQ0KLQkJCQlzdXBwbGllciAgIAlANjQzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjYsIDMwNikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM2NiwgMjE1KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzIxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODgwMUI0Ig0KLQkJCQljbGllbnQgICAgIAlANjIxDQotCQkJCXN1cHBsaWVyICAgCUA2NjMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgODI4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3LCA3ODEpDQotCQkJCWRyYXdTdXBwbGllciAJQDY2NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzIyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTkwMjgxIg0KLQkJCQljbGllbnQgICAgIAlANjM4DQotCQkJCXN1cHBsaWVyICAgCUA2NTENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MCwgMTg0MCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MCwgMTQ0NCkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNS4gQ29tcG9uZW50IEFubm90YXRpb25zIg0KLQkJCXF1aWQgICAgICAgCSIzQjY5RDY4RDAwRDIiDQotCQkJdGl0bGUgICAgICAJIjUuIENvbXBvbmVudCBBbm5vdGF0aW9ucyINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANzIzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiDQotCQkJCXdpZHRoICAgICAgCTM1NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA3MjQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE2OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgyLCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDcyNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDE1MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjYsIDE0NjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQl3aWR0aCAgICAgIAk1MTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBANzI2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMzA0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NjMsIDI2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiDQotCQkJCXdpZHRoICAgICAgCTQ2OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDcyNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzI3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEzMTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTg4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiDQotCQkJCXdpZHRoICAgICAgCTYwNg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA3MjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDcwNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDY2MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA3MjkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMTQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSINCi0JCQkJd2lkdGggICAgICAJNTEwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANzMwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA1NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA1MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDg2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANzMxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwMCwgODApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNjgsIDM3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANzMyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzUwLCAxMTczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3MzMNCi0JCQkJbG9jYXRpb24gICAJKDE5OTQsIDE0MTIpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDczMg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxOTk0LCAxNDEyKQ0KLQkJCQkgICAgKDE5OTQsIDEyNzEpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzM0DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlANzI1DQotCQkJCXN1cHBsaWVyICAgCUA3MzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwODQsIDE0NDkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDg0LCAxNDEyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3MzMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA3MzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDg2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzM1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAsIDgyMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQl3aWR0aCAgICAgIAk0MDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANzM2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgODApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzM2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg5MiwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAkyMzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDczNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NCwgMzQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANzM4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCAyMjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCAxODEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIg0KLQkJCQl3aWR0aCAgICAgIAk0ODYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA3MzkNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzkyLCAxNzEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDY3LCAxNjc0KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY1MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTY2OQ0KLQkJCQloZWlnaHQgICAgIAkxMDANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIg0KLQkJCQljbGllbnQgICAgIAlANzM5DQotCQkJCXN1cHBsaWVyICAgCUA3MzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NzIsIDE2NjIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTcyLCAxNDEyKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA3MzMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANzQxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxMDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDENCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3OCwgOTgxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIg0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA3NDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA1NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4OCwgNTE3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlcGVhdGFibGVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTQ1MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA3NDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE1MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcxLCAxNDkzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJd2lkdGggICAgICAJMjkyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDc0NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODcyLCA2ODUpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiDQotCQkJCXdpZHRoICAgICAgCTczOA0KLQkJCQloZWlnaHQgICAgIAk1NDMNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMiIgQDc0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoODY1LCAxMzU5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDE4MyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzMiIEA3NDYNCi0JCQkJCVBhcmVudF9WaWV3IAlANzQ1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgNTU5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDMzQyINCi0JCQkJCWNsaWVudCAgICAgCUA3NDUNCi0JCQkJCXN1cHBsaWVyICAgCUA3MjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY3MSwgMTM1OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzQ3DQotCQkJCQlQYXJlbnRfVmlldyAJQDc0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQ3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5OCwgMTMyMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjExNjY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMzQ2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc0NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDg2NSwgMTM1OSkNCi0JCQkJCSAgICAoOTI1LCAxMzU5KQ0KLQkJCQkJICAgICg5MjUsIDEyMTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjUsIDEzNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI1LCAxMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQ5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTg3LCAxMjc2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA2NDIyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1NiIgQDc1MA0KLQkJCQlsb2NhdGlvbiAgIAkoNzEzLCA3MDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEYwMjEyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NyIgQDc1MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA3LCAtOTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTAwMEM5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc1MA0KLQkJCQkJc3VwcGxpZXIgICAJQDcyOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTMsIDcwOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDcwOSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzUyDQotCQkJCQlQYXJlbnRfVmlldyAJQDc1MA0KLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzUyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNjY3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wOTUyMzgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEwMDBEMyINCi0JCQkJCWNsaWVudCAgICAgCUA3NTANCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCA3MDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTYsIDc1MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1MzU3MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTAiIEA3NTUNCi0JCQkJbG9jYXRpb24gICAJKDcxOSwgMTE5MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNTAwOEEiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUxIiBANzU2DQotCQkJCQlQYXJlbnRfVmlldyAJQDc1NQ0KLQkJCQkJbG9jYXRpb24gICAJKC00MDEsIDM5MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNjAwOTYiDQotCQkJCQljbGllbnQgICAgIAlANzU1DQotCQkJCQlzdXBwbGllciAgIAlANzI5DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTE5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDExOTMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc1Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjAsIDExNDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNjk5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMEEwIg0KLQkJCQkJY2xpZW50ICAgICAJQDc1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTksIDExOTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMTkzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA2LCAxMjQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA0MTY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExMCIgQDc2MA0KLQkJCQlsb2NhdGlvbiAgIAkoNzg1LCA1NTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEEwMDY2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExMSIgQDc2MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NjANCi0JCQkJCWxvY2F0aW9uICAgCSgtMzM1LCAtMjUwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBCMDIzRiINCi0JCQkJCWNsaWVudCAgICAgCUA3NjANCi0JCQkJCXN1cHBsaWVyICAgCUA3MzANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg1LCA1NTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCA1NTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc2Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NjANCi0JCQkJCWxvY2F0aW9uICAgCSgtMzM1LCAtMjUwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzYzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc5LCA1MTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzA3MDcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBCMDI0OSINCi0JCQkJCWNsaWVudCAgICAgCUA3NjANCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3ODUsIDU1MCkNCi0JCQkJCSAgICAoODg0LCA1NTApDQotCQkJCQkgICAgKDg4NCwgNjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg1LCA1NTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODg0LCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NjQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MzUsIDYxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyOTczMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODIiIEA3NjUNCi0JCQkJbG9jYXRpb24gICAJKDExODQsIDQwNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NjAyOTAiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgzIiBANzY2DQotCQkJCQlQYXJlbnRfVmlldyAJQDc2NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMiwgLTQxMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NzAxNjUiDQotCQkJCQljbGllbnQgICAgIAlANzY1DQotCQkJCQlzdXBwbGllciAgIAlANzMxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg0LCAxMzUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA3NjcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzY1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyLCAtNDEyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzY4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNCwgMjI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0OQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjY2NTQyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFNDU3MDE2RiINCi0JCQkJCWNsaWVudCAgICAgCUA3NjUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE4NCwgNDA0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzY3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYxNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4NDM4Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTY3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTgiIEA3NzANCi0JCQkJbG9jYXRpb24gICAJKDE3NTIsIDEwMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUyOTEwMTU4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5OSIgQDc3MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzANCi0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxOUYiDQotCQkJCQljbGllbnQgICAgIAlANzcwDQotCQkJCQlzdXBwbGllciAgIAlANzMyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTc1MiwgMTAzNCkNCi0JCQkJCSAgICAoMTgxMiwgMTAzNCkNCi0JCQkJCSAgICAoMTgxMiwgMTE2MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTIsIDEwMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgMTE2MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzcyDQotCQkJCQlQYXJlbnRfVmlldyAJQDc3MA0KLQkJCQkJbG9jYXRpb24gICAJKDUzNiwgMjE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzczDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0MywgOTk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk2MDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFMjkyMDFBOSINCi0JCQkJCWNsaWVudCAgICAgCUA3NzANCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MiwgMTAzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCAxMDM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzc0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NCwgMTA2NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MDMzMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDAiIEA3NzUNCi0JCQkJbG9jYXRpb24gICAJKDE4OTYsIDg4MSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjkwMDZDRjAwODgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAxIiBANzc2DQotCQkJCQlQYXJlbnRfVmlldyAJQDc3NQ0KLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgNDApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2RDEwMTVEIg0KLQkJCQkJY2xpZW50ICAgICAJQDc3NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDczMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE4OTYsIDg4MSkNCi0JCQkJCSAgICAoMTk1NiwgODgxKQ0KLQkJCQkJICAgICgxOTU2LCAxMTYxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg5NiwgODgxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTYsIDExNjEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGVyaXZhdGlvbkFubm90YXRpb24iIEA3NzcNCi0JCQkJCVBhcmVudF9WaWV3IAlANzc1DQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCA0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzc3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDg0MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitkZXJpdmF0aW9uQW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1NDIzNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2RDEwMTY3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc3NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgODgxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzc5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4OSwgOTE0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA1MDg1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMiIgQDc4MA0KLQkJCQlsb2NhdGlvbiAgIAkoMjA0MCwgNzE1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjMzMDI2NCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDMiIEA3ODENCi0JCQkJCVBhcmVudF9WaWV3IAlANzgwDQotCQkJCQlsb2NhdGlvbiAgIAkoOTIwLCAtODUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzQwMjg0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc4MA0KLQkJCQkJc3VwcGxpZXIgICAJQDczMg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIwNDAsIDcxNSkNCi0JCQkJCSAgICAoMjEwMCwgNzE1KQ0KLQkJCQkJICAgICgyMTAwLCAxMTYxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA0MCwgNzE1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDAsIDExNjEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA3ODINCi0JCQkJCVBhcmVudF9WaWV3IAlANzgwDQotCQkJCQlsb2NhdGlvbiAgIAkoOTIwLCAtODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzU4LCA2ODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDMxOTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjM0MDI4RSINCi0JCQkJCWNsaWVudCAgICAgCUA3ODANCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA0MCwgNzE1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDcxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzgyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDc0NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwOTMxMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjAiIEA3ODUNCi0JCQkJbG9jYXRpb24gICAJKDY2OCwgODY1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjM5MTM0MDA0RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjEiIEA3ODYNCi0JCQkJCVBhcmVudF9WaWV3IAlANzg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTYxMiwgMzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzYwMENBIg0KLQkJCQkJY2xpZW50ICAgICAJQDc4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDczNQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NzMsIDg2NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzg3DQotCQkJCQlQYXJlbnRfVmlldyAJQDc4NQ0KLQkJCQkJbG9jYXRpb24gICAJKC02MTIsIDMzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzg4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzE0LCA4MjUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzNDE0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzYwMEQ0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDc4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDg2NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMSwgOTAzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjgyMDUxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNCIgQDc5MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgMTY3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkQyM0I5MDFDRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjUiIEA3OTENCi0JCQkJCVBhcmVudF9WaWV3IAlANzkwDQotCQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAtNjQ5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQyM0JBMDFDNCINCi0JCQkJCWNsaWVudCAgICAgCUA3OTANCi0JCQkJCXN1cHBsaWVyICAgCUA3MzYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNDcyLCAxNjcpDQotCQkJCQkgICAgKDE0NzIsIDcyKQ0KLQkJCQkJICAgICgxODgzLCA3MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODgzLCA3MikpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzkyDQotCQkJCQlQYXJlbnRfVmlldyAJQDc5MA0KLQkJCQkJbG9jYXRpb24gICAJKDI1NiwgLTY0OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzkyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDEyOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA3NjMwNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQyM0JBMDFDRSINCi0JCQkJCWNsaWVudCAgICAgCUA3OTANCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3MiwgMTY3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzIsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzkyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTksIDYxOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MzU3NA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3NCIgQDc5NQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTI3LCAzNTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDYwMjkxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc1IiBANzk2DQotCQkJCQlQYXJlbnRfVmlldyAJQDc5NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xOTMsIC00NTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDcwMTcxIg0KLQkJCQkJY2xpZW50ICAgICAJQDc5NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDczNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjcsIDM1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MjksIDM1MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzk3DQotCQkJCQlQYXJlbnRfVmlldyAJQDc5NQ0KLQkJCQkJbG9jYXRpb24gICAJKC0xOTMsIC00NTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDMxMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjgxNjY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDcwMTcyIg0KLQkJCQkJY2xpZW50ICAgICAJQDc5NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkyNywgMzUwKQ0KLQkJCQkJICAgICg5ODcsIDM1MCkNCi0JCQkJCSAgICAoOTg3LCA2NzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjcsIDM1MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODcsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzk3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzcsIDYxMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MzM0Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NiIgQDgwMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyNywgMjIyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlEQURDMDJGNSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NyIgQDgwMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDANCi0JCQkJCWxvY2F0aW9uICAgCSgtOTMsIC01NzgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREQwMjM4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgwMA0KLQkJCQkJc3VwcGxpZXIgICAJQDczOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI3LCAyMjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCAyMjIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgwMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDANCi0JCQkJCWxvY2F0aW9uICAgCSgtOTMsIC01NzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDAzLCAxODgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40MDYyNTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDI0MiINCi0JCQkJCWNsaWVudCAgICAgCUA4MDANCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMDI3LCAyMjIpDQotCQkJCQkgICAgKDEwODcsIDIyMikNCi0JCQkJCSAgICAoMTA4NywgNjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDY3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDYxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODI1ODMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTAiIEA4MDUNCi0JCQkJbG9jYXRpb24gICAJKDE0OTQsIDE0MzgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2ODgwMUMyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkxIiBAODA2DQotCQkJCQlQYXJlbnRfVmlldyAJQDgwNQ0KLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExMSINCi0JCQkJCWNsaWVudCAgICAgCUA4MDUNCi0JCQkJCXN1cHBsaWVyICAgCUA3MzkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5NCwgMTQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk0LCAxNjYyKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRBbm5vdGF0aW9uIiBAODA3DQotCQkJCQlQYXJlbnRfVmlldyAJQDgwNQ0KLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NiwgMTM1NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50QW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM2NzcxMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIwMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExQiINCi0JCQkJCWNsaWVudCAgICAgCUA4MDUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5NCwgMTQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk0LCAxMjE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MywgMTI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxMzAwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDQiIEA4MTANCi0JCQkJbG9jYXRpb24gICAJKDYzNywgMTAyMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNzAyQzgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ1IiBAODExDQotCQkJCQlQYXJlbnRfVmlldyAJQDgxMA0KLQkJCQkJbG9jYXRpb24gICAJKC00ODMsIDIyMikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxODAzRTIiDQotCQkJCQljbGllbnQgICAgIAlAODEwDQotCQkJCQlzdXBwbGllciAgIAlANzQxDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzNywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTEsIDEwMjIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgxMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTANCi0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MTAsIDk3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzI4ODg5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxOTAwMDQiDQotCQkJCQljbGllbnQgICAgIAlAODEwDQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzNywgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDEwMjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEwNjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzAwODgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjQiIEA4MTUNCi0JCQkJbG9jYXRpb24gICAJKDE1ODEsIDYwNykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBNzAxMDIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjUiIEA4MTYNCi0JCQkJCVBhcmVudF9WaWV3IAlAODE1DQotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUE5MDE5MSINCi0JCQkJCWNsaWVudCAgICAgCUA4MTUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTgxLCA2MDcpDQotCQkJCQkgICAgKDE1ODEsIDU0NykNCi0JCQkJCSAgICAoMTY3OSwgNTQ3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgNjA3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzksIDU0NykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDgxNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTUNCi0JCQkJCWxvY2F0aW9uICAgCSgzMDEsIC0yMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjY5LCA0NjIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuMTk2OTcwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTIiDQotCQkJCQljbGllbnQgICAgIAlAODE1DQotCQkJCQlzdXBwbGllciAgIAlANzQ0DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTgxLCA2NzMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxNw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTM5LCA2MjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xOTY5NzANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA0IiBAODIwDQotCQkJCWxvY2F0aW9uICAgCSg4NDksIDE0OTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTEwMjZGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNSIgQDgyMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjANCi0JCQkJCWxvY2F0aW9uICAgCSgtMjcxLCA2OTYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTIwMUY5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgyMA0KLQkJCQkJc3VwcGxpZXIgICAJQDc0Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNDk2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MjINCi0JCQkJCVBhcmVudF9WaWV3IAlAODIwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODIzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQyLCAxNDY0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODgyNTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDIwMyINCi0JCQkJCWNsaWVudCAgICAgCUA4MjANCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg4NDksIDE0OTYpDQotCQkJCQkgICAgKDEwNjIsIDE0OTYpDQotCQkJCQkgICAgKDEwNjIsIDEyMTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2MiwgMTIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyNA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODIyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTUsIDEyNzkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzI2OTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA2IiBAODI1DQotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE1NjUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjMwMDA1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNyIgQDgyNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI4LCA3MzMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjQwMzI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDgyNQ0KLQkJCQkJc3VwcGxpZXIgICAJQDc0Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE1NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNTY1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODI3DQotCQkJCQlQYXJlbnRfVmlldyAJQDgyNQ0KLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyOA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODI3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDE1MzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDQ5NTkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUI0MDMzMiINCi0JCQkJCWNsaWVudCAgICAgCUA4MjUNCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5NTIsIDE1NjUpDQotCQkJCQkgICAgKDEyMDAsIDE1NjUpDQotCQkJCQkgICAgKDEyMDAsIDEyMTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE1NjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwMCwgMTIxNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODI3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTQsIDEyNzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4MzANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4MDAzOTQiDQotCQkJCWNsaWVudCAgICAgCUA3MjYNCi0JCQkJc3VwcGxpZXIgICAJQDczNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk4NCwgMjQ5KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk4NCwgMTM1KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODMxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOEYwMDJFIg0KLQkJCQljbGllbnQgICAgIAlANzQyDQotCQkJCXN1cHBsaWVyICAgCUA3MjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5OTcsIDUwNSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTcsIDM1OSkpKSkNCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNi4gQ29uY3JldGUgQ29tcG9uZW50cyINCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ3NEQwM0M0Ig0KLQkJCXRpdGxlICAgICAgCSI2LiBDb25jcmV0ZSBDb21wb25lbnRzIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA4MzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiIEA4MzMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4MzIsIDQxNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjgsIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5Ig0KLQkJCQl3aWR0aCAgICAgIAk1NDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIgQDgzNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEyMDAsIDY3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5OTEsIDYyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIg0KLQkJCQl3aWR0aCAgICAgIAk0MzYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEA4MzUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODM1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1NiwgMzczKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIg0KLQkJCQl3aWR0aCAgICAgIAk0MjYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDgzNg0KLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNTYxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4MzUNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTM2MCwgNTYxKQ0KLQkJCQkgICAgKDEzNjAsIDQ3MSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSIgQDgzNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDExNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW5jbHVkZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM3RDAyNTAiDQotCQkJCXdpZHRoICAgICAgCTI1OA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCIgQDgzOA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCA5NDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbXBvcnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIg0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIgQDgzOQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzOQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDUsIDExNTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIg0KLQkJCQl3aWR0aCAgICAgIAkyODANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBAODQwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgMTIwMCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODQwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzc1LCAxMTUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg1MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIg0KLQkJCQl3aWR0aCAgICAgIAk4NjkNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDIiIEA4NDENCi0JCQkJbG9jYXRpb24gICAJKDEzNjgsIDEyMDYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzUwMDdFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0MyIgQDg0Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDENCi0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzYwMDZCIg0KLQkJCQkJY2xpZW50ICAgICAJQDg0MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDgzNw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY4LCAxMjA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDEyMDYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg0Mw0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDENCi0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzQ3LCAxMTU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTQ0MTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M2MDA2QyINCi0JCQkJCWNsaWVudCAgICAgCUA4NDENCi0JCQkJCXN1cHBsaWVyICAgCUA4NDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM0LCAxMjA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ1DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMwMCwgMTI1MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDcNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTQ3MDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQwIiBAODQ2DQotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCAxMDIyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q4MDJGQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDEiIEA4NDcNCi0JCQkJCVBhcmVudF9WaWV3IAlAODQ2DQotCQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAyMjIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDkwMThCIg0KLQkJCQkJY2xpZW50ICAgICAJQDg0Ng0KLQkJCQkJc3VwcGxpZXIgICAJQDgzOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNjgsIDEwMjIpDQotCQkJCQkgICAgKDExNjgsIDk2MikNCi0JCQkJCSAgICAoMTI4NSwgOTYyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjg1LCA5NjIpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg0OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDYNCi0JCQkJCWxvY2F0aW9uICAgCSg5NjAsIDIyMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTAsIDEwNzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NTM3OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q5MDE4QyINCi0JCQkJCWNsaWVudCAgICAgCUA4NDYNCi0JCQkJCXN1cHBsaWVyICAgCUA4NDANCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTY4LCAxMTQxKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyNywgMTA3NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQzNjk3NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjIiIEA4NTENCi0JCQkJbG9jYXRpb24gICAJKDE1NjMsIDEzNTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDIwMDlBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2MyIgQDg1Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTENCi0JCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1NTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDMwMkZFIg0KLQkJCQkJY2xpZW50ICAgICAJQDg1MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDgzOQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1NjMsIDEzNTMpDQotCQkJCQkgICAgKDE5NDAsIDEzNTMpDQotCQkJCQkgICAgKDE5NDAsIDEyNTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NDAsIDEyNTUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4NTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAODUxDQotCQkJCQlsb2NhdGlvbiAgIAkoMTM1NSwgNTUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxNywgMTMyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxNjgwNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDMwMzA4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg1MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg0MA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1NjMsIDEzNTMpDQotCQkJCQkgICAgKDExODEsIDEzNTMpDQotCQkJCQkgICAgKDExODEsIDEyNTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODEsIDEyNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTMwLCAxMzI2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYxMzQ1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg1Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA1NjEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDgzMg0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyODgsIDU2MSkNCi0JCQkJICAgICgyODgsIDQ3MSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA4NTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDY3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NjAsIDYyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiDQotCQkJCXdpZHRoICAgICAgCTQ3NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IiBAODU4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgNDE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NTgsIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2Ig0KLQkJCQl3aWR0aCAgICAgIAk0MTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAODU5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA5NjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODU5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUwLCA5MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAODYwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI0LCA2NzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODYwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwLCA2MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIg0KLQkJCQl3aWR0aCAgICAgIAkyNDYNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODYxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIg0KLQkJCQljbGllbnQgICAgIAlAODYwDQotCQkJCXN1cHBsaWVyICAgCUA4MzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMSwgNjE3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxLCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDg1NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODYyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3Ig0KLQkJCQljbGllbnQgICAgIAlAODU3DQotCQkJCXN1cHBsaWVyICAgCUA4MzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU4OSwgNjE3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg5LCA1NjEpDQotCQkJCWRyYXdTdXBwbGllciAJQDg1NikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODYzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyQjMwMUQ1Ig0KLQkJCQljbGllbnQgICAgIAlAODM0DQotCQkJCXN1cHBsaWVyICAgCUA4MzUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMTYsIDYxNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTYsIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODM2KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDg2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDk0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTkwLCA5MDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJCXdpZHRoICAgICAgCTQ4Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODY1DQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCAxMDg5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4NjQNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTgyNCwgMTA4OSkNCi0JCQkJICAgICgxODI0LCA5OTkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODY2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4REMwMzgxIg0KLQkJCQljbGllbnQgICAgIAlAODM3DQotCQkJCXN1cHBsaWVyICAgCUA4NjQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjYsIDExNDUpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY2LCAxMDg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NjUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2Nw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjY0MDI0MCINCi0JCQkJY2xpZW50ICAgICAJQDgzOQ0KLQkJCQlzdXBwbGllciAgIAlAODY0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTM0LCAxMTQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkzNCwgMTA4OSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODY1KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAODY4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDY3MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjMwLCA2MjkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJd2lkdGggICAgICAJNDM4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODY5DQotCQkJCWxvY2F0aW9uICAgCSgxNzYyLCA4MTkpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDg2OA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNzYyLCA4MTkpDQotCQkJCSAgICAoMTc2MiwgNzI3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg3MA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEQ5MDAzRSINCi0JCQkJY2xpZW50ICAgICAJQDgzOA0KLQkJCQlzdXBwbGllciAgIAlAODY4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE2LCA4ODkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE2LCA4MTkpDQotCQkJCWRyYXdTdXBwbGllciAJQDg2OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODcxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIg0KLQkJCQljbGllbnQgICAgIAlAODY4DQotCQkJCXN1cHBsaWVyICAgCUA4MzUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTYsIDYxNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTYsIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODM2KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA4NzINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDE0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzUsIDEwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiDQotCQkJCXdpZHRoICAgICAgCTUwOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg3Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMjg5KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTEyMCwgMjg5KQ0KLQkJCQkgICAgKDExMjAsIDE5OSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA0IiBAODc0DQotCQkJCWxvY2F0aW9uICAgCSgxNDg1LCAyMTUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMDgwM0M3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRhaW5lciIgQDg3NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzQNCi0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDIxMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250YWluZXIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMzMxMTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0UiDQotCQkJCQljbGllbnQgICAgIAlAODc0DQotCQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ4NSwgMjE1KQ0KLQkJCQkJICAgICgxNDg1LCAxNzYpDQotCQkJCQkgICAgKDEzNzQsIDE3NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODUsIDIxNSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzc0LCAxNzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM1LCAyMjYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjkNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDI2NDkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwNSIgQDg3OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzQNCi0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0YiDQotCQkJCQljbGllbnQgICAgIAlAODc0DQotCQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ4NSwgMjE1KQ0KLQkJCQkJICAgICgxNDg1LCAyNTQpDQotCQkJCQkgICAgKDEzNDUsIDI1NCkNCi0JCQkJCSAgICAoMTM0NSwgMTk5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NSwgMjE1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNDUsIDE5OSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwNiIgQDg3OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAyMTYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNDgwMjYxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RDb250YWluZXIiIEA4ODANCi0JCQkJCVBhcmVudF9WaWV3IAlAODc5DQotCQkJCQlsb2NhdGlvbiAgIAkoNTMsIDEwNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMjE3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RDb250YWluZXIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI1MDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTYwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNEMwMjg1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg3OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc3MywgMjE2KQ0KLQkJCQkJICAgICg3NzMsIDE3NikNCi0JCQkJCSAgICAoODY2LCAxNzYpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE3NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjMwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA3IiBAODgzDQotCQkJCQlQYXJlbnRfVmlldyAJQDg3OQ0KLQkJCQkJbG9jYXRpb24gICAJKDUzLCAxMDQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNEMwMjg2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDg3OQ0KLQkJCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDc3MywgMjE2KQ0KLQkJCQkJICAgICg3NzMsIDI1NykNCi0JCQkJCSAgICAoODk1LCAyNTcpDQotCQkJCQkgICAgKDg5NSwgMTk5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAyMTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk1LCAxOTkpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4NA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiINCi0JCQkJY2xpZW50ICAgICAJQDgzNQ0KLQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY3LCAzNjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY3LCAyODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDg3MykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODg1DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ4RTIwMEVBIg0KLQkJCQljbGllbnQgICAgIAlAODMzDQotCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MiwgMzYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUyLCAyODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDg3MykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODg2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTkwM0QyIg0KLQkJCQljbGllbnQgICAgIAlAODMyDQotCQkJCXN1cHBsaWVyICAgCUA4NzINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5OSwgMzYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk5LCAyODkpDQotCQkJCWRyYXdTdXBwbGllciAJQDg3MykNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDg4Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDEyMDApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxLCAxMTU3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiDQotCQkJCXdpZHRoICAgICAgCTI4MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0M0QTAxODIiDQotCQkJCWNsaWVudCAgICAgCUA4ODcNCi0JCQkJc3VwcGxpZXIgICAJQDg2MA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE2LCAxMTQ1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2LCA3MjcpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE4IiBAODg5DQotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCAxNDI1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFERDBDMDNEQiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTkiIEA4OTANCi0JCQkJCVBhcmVudF9WaWV3IAlAODg5DQotCQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMjI1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCINCi0JCQkJCWNsaWVudCAgICAgCUA4ODkNCi0JCQkJCXN1cHBsaWVyICAgCUA4NjQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzgyLCAxNDI1KQ0KLQkJCQkJICAgICgyMTQ3LCAxNDI1KQ0KLQkJCQkJICAgICgyMTQ3LCA5NDMpDQotCQkJCQkgICAgKDIwNjcsIDk0MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDE0MjUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NywgOTQzKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFNjaGVtYSIgQDg5MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4ODkNCi0JCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAyMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NDUsIDEzODkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA2NTQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDUiDQotCQkJCQljbGllbnQgICAgIAlAODg5DQotCQkJCQlzdXBwbGllciAgIAlAODg3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM4MiwgMTQyNSkNCi0JCQkJCSAgICAoMjI1LCAxNDI1KQ0KLQkJCQkJICAgICgyMjUsIDEyNTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyNSwgMTI1NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODkxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MywgMTM5MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NjkxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTYiIEA4OTQNCi0JCQkJbG9jYXRpb24gICAJKDE1MDUsIDE1MDMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxNyIgQDg5NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTQNCi0JCQkJCWxvY2F0aW9uICAgCSgxMzEzLCAzMDMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQyIg0KLQkJCQkJY2xpZW50ICAgICAJQDg5NA0KLQkJCQkJc3VwcGxpZXIgICAJQDg2OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MDUsIDE1MDMpDQotCQkJCQkgICAgKDIxODgsIDE1MDMpDQotCQkJCQkgICAgKDIxODgsIDY3NSkNCi0JCQkJCSAgICAoMjA1OSwgNjc1KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNSwgMTUwMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDU5LCA2NzUpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRTY2hlbWEiIEA4OTYNCi0JCQkJCVBhcmVudF9WaWV3IAlAODk0DQotCQkJCQlsb2NhdGlvbiAgIAkoMTMxMywgMzAzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAzLCAxNDcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzMzMzMzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDMiDQotCQkJCQljbGllbnQgICAgIAlAODk0DQotCQkJCQlzdXBwbGllciAgIAlAODg3DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUwNSwgMTUwMykNCi0JCQkJCSAgICAoMTEzLCAxNTAzKQ0KLQkJCQkJICAgICgxMTMsIDEyNTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA1LCAxNTAzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMywgMTI1NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODk2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDcyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY3NjgzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwOCIgQDg5OQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjYsIDI0NCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMTAzNTYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA5IiBAOTAwDQotCQkJCQlQYXJlbnRfVmlldyAJQDg5OQ0KLQkJCQkJbG9jYXRpb24gICAJKC05NCwgLTQ0NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMzAzMzEiDQotCQkJCQljbGllbnQgICAgIAlAODk5DQotCQkJCQlzdXBwbGllciAgIAlAODcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjYsIDI0NCkNCi0JCQkJCSAgICAoNjYsIDE0NCkNCi0JCQkJCSAgICAoODY2LCAxNDQpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NiwgMjQ0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTQ0KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDkwMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTkNCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQsIC00NDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjUsIDkzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xNjgxMTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQzMzMDMzQiINCi0JCQkJCWNsaWVudCAgICAgCUA4OTkNCi0JCQkJCXN1cHBsaWVyICAgCUA4ODcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYsIDI0NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NiwgMTE0NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTAxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNiwgMTg0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTExMw0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjY1OTMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDQNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjc4MEJEOTAwNTkiDQotCQkJCWNsaWVudCAgICAgCUA4NTgNCi0JCQkJc3VwcGxpZXIgICAJQDg3Mg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1OSwgMzYxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1OSwgMjg5KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA4NzMpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwNQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiINCi0JCQkJY2xpZW50ICAgICAJQDg0MA0KLQkJCQlzdXBwbGllciAgIAlAODMyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0MDAsIDExNDEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MDAsIDU2MSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODU2KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTA2DQotCQkJCWxvY2F0aW9uICAgCSgxMDEyLCA4MzcpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDgzNA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMDEyLCA4MzcpDQotCQkJCSAgICAoMTAxMiwgNzI3KSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwNw0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5MDgNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTA3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MSwgODcxKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI0Mw0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODg4MTU4DQotCQkJCSAgICBoZWlnaHQgICAgIAkzNA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZENEUyMDM2NiINCi0JCQkJY2xpZW50ICAgICAJQDg0MA0KLQkJCQlzdXBwbGllciAgIAlAODM0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM3LCAxMTQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAzNywgODM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDYpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwOQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5MTANCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTA5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODkwLCA4NjUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODE2MzMNCi0JCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0QkEwMjNDIg0KLQkJCQljbGllbnQgICAgIAlAODU5DQotCQkJCXN1cHBsaWVyICAgCUA4MzQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNSwgOTA1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI1LCA4MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDkwNikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTExDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIg0KLQkJCQljbGllbnQgICAgIAlAODY0DQotCQkJCXN1cHBsaWVyICAgCUA4NjgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjgsIDg4OSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjgsIDgxOSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAODY5KSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjcuIENvbmNyZXRlIEF0dHJpYnV0ZXMiDQotCQkJcXVpZCAgICAgICAJIjNCOUY4Rjc2MDJDNyINCi0JCQl0aXRsZSAgICAgIAkiNy4gQ29uY3JldGUgQXR0cmlidXRlcyINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDkxMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCAxNDQwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzgsIDEzNTkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDEyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzgsIDE0MTkpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBmb3JtIDogWFNERm9ybSINCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0MzANCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZvcm0iIEA5MTMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYwLCAxNDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzY1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZvcm0iKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzE1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjlGOTEzQjAxRUIiDQotCQkJCXdpZHRoICAgICAgCTM0Mg0KLQkJCQloZWlnaHQgICAgIAkyNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA5MTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCA5NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgMzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjU3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgOTcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDYNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBlbGVtZW50IDogRE9NRWxlbWVudCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk2NzUNCi0JCQkJaGVpZ2h0ICAgICAJMTQzDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA5MTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4NDgsIDM4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODcsIDMzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5Ig0KLQkJCQl3aWR0aCAgICAgIAkzNDANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDkxNg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDk0NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjc4LCA4OTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0Ig0KLQkJCQl3aWR0aCAgICAgIAk0NzANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAOTE3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDE0MDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE3DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMTM1NikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiDQotCQkJCXdpZHRoICAgICAgCTU2Mg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA5MTgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg4NjQsIDYyNCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDU3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiDQotCQkJCXdpZHRoICAgICAgCTI1Ng0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTE5DQotCQkJCWxvY2F0aW9uICAgCSg4NTAsIDUzNykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTE1DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDg1MCwgNTM3KQ0KLQkJCQkgICAgKDg1MCwgNDQ3KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01FbGVtZW50IiBAOTIwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI0OCwgMTI4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDkwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc1MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTUVsZW1lbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTENCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I4MTg5NzkwMjAwIg0KLQkJCQl3aWR0aCAgICAgIAk3NjkNCi0JCQkJaGVpZ2h0ICAgICAJMjAwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDkyMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNjQwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCA1ODQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJd2lkdGggICAgICAJNTEyDQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDkyMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAzMzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiDQotCQkJCXdpZHRoICAgICAgCTQyMg0KLQkJCQloZWlnaHQgICAgIAkxMjYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTIzDQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDI2MykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTE0DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDM2OCwgMjYzKQ0KLQkJCQkgICAgKDM2OCwgMTY3KSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIgQDkyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDE0NTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTM0NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTI5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QTQwM0RGIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDE0MDcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBzdWJzdGl0dXRpb24iDQotCQkJCQkiKyBleHRlbnNpb24iDQotCQkJCQkiKyByZXN0cmljdGlvbiINCi0JCQkJCSIrIGFsbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1NTYNCi0JCQkJaGVpZ2h0ICAgICAJMzQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBAOTI1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMTc5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNzA4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNjU4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVCRTAyNzIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTc2OCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTMNCi0JCQkJICAgIG1heF93aWR0aCAgCTE5OA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGV4dGVuc2lvbiINCi0JCQkJCSIrIHJlc3RyaWN0aW9uIg0KLQkJCQkJIisgYWxsIikpDQotCQkJCXdpZHRoICAgICAgCTU1MA0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA5MjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTEyLCAyMDk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MzIsIDIwNDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzYwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIg0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MzIsIDIxMDApDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MjMNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQ0KLQkJCQl3aWR0aCAgICAgIAk3NzgNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBAOTI3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg3NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiDQotCQkJCXdpZHRoICAgICAgCTM0NA0KLQkJCQloZWlnaHQgICAgIAkzNDINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleEZpbmFsIiBAOTI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU0NCwgMjAxNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM2MiwgMTkzMikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjgNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxODgyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzJDQTAxQ0IiDQotCQkJCXdpZHRoICAgICAgCTM4Mg0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAOTI5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDEyNzkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjIyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDEzMzkpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyB1c2UgOiBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSINCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk2NDANCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IiBAOTMwDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxNjMyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTU0OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNDk4KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3DQotCQkJCXF1aWR1ICAgICAgCSIzQkE3QjBFODAxQTgiDQotCQkJCXdpZHRoICAgICAgCTUxMg0KLQkJCQloZWlnaHQgICAgIAkyOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDkzMQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2MDgsIDkyOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDk4LCA4ODEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjIwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiDQotCQkJCXdpZHRoICAgICAgCTIzOA0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDkzMg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjQwLCAxNzEyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU3LCAxNjMxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTk2Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTcsIDE2OTEpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk5MzQNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyINCi0JCQkJCSI8PDAuLio+PiArIGJsb2NrIDogWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKSkNCi0JCQkJd2lkdGggICAgICAJOTg0DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDkzMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjcyLCAxMTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMDk2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg4OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTE1NikNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg1Mg0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSI8PDAuLio+PiArIGxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50IDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTkwNg0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAOTM0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTAwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIyLCA3NzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJOTk2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMTAxNA0KLQkJCQloZWlnaHQgICAgIAk0ODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAOTM1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCA5NjApDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM3LCA5MDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW1wb3J0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiINCi0JCQkJd2lkdGggICAgICAJNDI0DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA5MzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTM0NCwgNjU2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDYwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDY2MCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3OA0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0MzANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDkzNw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDEwLCAxOTQyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTg2MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTAsIDIwMDIpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkzDQotCQkJCSAgICBtYXhfd2lkdGggIAk4MjINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RDb21wbGV4RmluYWwiDQotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIg0KLQkJCQkJIisgbWl4ZWQgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTg3OA0KLQkJCQloZWlnaHQgICAgIAkyMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA5MzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDg4LCAxNjk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDQsIDE2NDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5Ig0KLQkJCQl3aWR0aCAgICAgIAkzODYNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTM5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIg0KLQkJCQljbGllbnQgICAgIAlAOTM4DQotCQkJCXN1cHBsaWVyICAgCUA5MTcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDYsIDE2MzIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA2LCAxNDcyKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA5NDANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMjA4LCA3MDQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTgsIDU5OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk5MDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyINCi0JCQkJd2lkdGggICAgICAJOTE4DQotCQkJCWhlaWdodCAgICAgCTIzNg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyINCi0JCQkJY2xpZW50ICAgICAJQDkzMQ0KLQkJCQlzdXBwbGllciAgIAlAOTE1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjk2LCA4NjkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjk2LCA1MzcpDQotCQkJCWRyYXdTdXBwbGllciAJQDkxOSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQyDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQljbGllbnQgICAgIAlAOTMyDQotCQkJCXN1cHBsaWVyICAgCUA5MTINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTQsIDE2MTkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDk0LCAxNTMzKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NywgMTg1NikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTM4DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE0ODcsIDE4NTYpDQotCQkJCSAgICAoMTQ4NywgMTc2MCkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NQXR0ciIgQDk0NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MDAsIDM4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMzUwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTUF0dHIiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCAzMDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQkJGOEM4OTAxQjYiDQotCQkJCXdpZHRoICAgICAgCTY1OA0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUA5MzcNCi0JCQkJc3VwcGxpZXIgICAJQDkzOA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczNCwgMTkzMCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MzQsIDE4NTYpDQotCQkJCWRyYXdTdXBwbGllciAJQDk0MykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ2DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDI1NjgwMjU5Ig0KLQkJCQljbGllbnQgICAgIAlAOTM2DQotCQkJCXN1cHBsaWVyICAgCUA5MTUNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDU4OCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiDQotCQkJCWNsaWVudCAgICAgCUA5NDANCi0JCQkJc3VwcGxpZXIgICAJQDkxNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE5MCwgNTg2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE5MCwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiINCi0JCQkJY2xpZW50ICAgICAJQDkyMQ0KLQkJCQlzdXBwbGllciAgIAlAOTIyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjIsIDU3MikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMiwgNDQ3KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RTYwMzcyIg0KLQkJCQljbGllbnQgICAgIAlAOTIyDQotCQkJCXN1cHBsaWVyICAgCUA5MTQNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MCwgMzIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwLCAyNjMpDQotCQkJCWRyYXdTdXBwbGllciAJQDkyMykNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTUwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RDkwMDNFIg0KLQkJCQljbGllbnQgICAgIAlAOTM1DQotCQkJCXN1cHBsaWVyICAgCUA5MjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMywgODkyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIzLCA3MDgpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiDQotCQkJCWNsaWVudCAgICAgCUA5MzMNCi0JCQkJc3VwcGxpZXIgICAJQDkzMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwMCwgMTA4NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDAsIDk4NykpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Eb2N1bWVudCIgQDk1Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDEyOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1NywgOTQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzU4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NRG9jdW1lbnQiKQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTU3LCA0NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzU4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjc4NTBFMDM4MSINCi0JCQkJd2lkdGggICAgICAJNzc2DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiINCi0JCQkJY2xpZW50ICAgICAJQDkxNQ0KLQkJCQlzdXBwbGllciAgIAlAOTE0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTYsIDMyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NiwgMjYzKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MjMpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Ob2RlIiBAOTU0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMzg0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjM0LCAzNTApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NTm9kZSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzQsIDMwMCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2NEE1MDExNyINCi0JCQkJd2lkdGggICAgICAJNjg2DQotCQkJCWhlaWdodCAgICAgCTE5Mg0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1NQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSINCi0JCQkJY2xpZW50ICAgICAJQDkxOA0KLQkJCQlzdXBwbGllciAgIAlAOTE1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTAsIDU2MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1MCwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1Ng0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSINCi0JCQkJY2xpZW50ICAgICAJQDkyOQ0KLQkJCQlzdXBwbGllciAgIAlAOTE1DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzUsIDEyNjcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDUzNykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTcNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciDQotCQkJCWNsaWVudCAgICAgCUA5MTYNCi0JCQkJc3VwcGxpZXIgICAJQDkxNQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5NCwgODgwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5NCwgNTM3KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1OA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiINCi0JCQkJY2xpZW50ICAgICAJQDkzNA0KLQkJCQlzdXBwbGllciAgIAlAOTE4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTYsIDc2NSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NiwgNjg3KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk1OQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTcwMywgMTI5MCkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTE2DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDE3MDMsIDEyOTApDQotCQkJCSAgICAoMTcwMywgMTAwOCkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiDQotCQkJCWNsaWVudCAgICAgCUA5MTcNCi0JCQkJc3VwcGxpZXIgICAJQDkxNg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwMywgMTM0NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDEyOTApDQotCQkJCWRyYXdTdXBwbGllciAJQDk1OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTYxDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3Ig0KLQkJCQljbGllbnQgICAgIAlAOTEyDQotCQkJCXN1cHBsaWVyICAgCUA5MTYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTMsIDEzNDcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAxMjkwKQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk2Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDkyNg0KLQkJCQlzdXBwbGllciAgIAlAOTM4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUzLCAyMDI4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1MywgMTg1NikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTQzKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjguIENvbmNyZXRlIENvbnRhaW5tZW50Ig0KLQkJCXF1aWQgICAgICAgCSIzQjZBODA5NzAyN0EiDQotCQkJdGl0bGUgICAgICAJIjguIENvbmNyZXRlIENvbnRhaW5tZW50Ig0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBAOTYzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY3MiwgOTkyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDM5LCA5NDkpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiDQotCQkJCXdpZHRoICAgICAgCTQ4NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDk2NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI2NDAsIDU3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDMxLCA1MzMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJd2lkdGggICAgICAJNDM2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIgQDk2NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDc4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAxMywgNzQxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCINCi0JCQkJd2lkdGggICAgICAJMjgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IiBAOTY2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgNTc2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTQsIDUzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIg0KLQkJCQl3aWR0aCAgICAgIAk0MzgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk2Nw0KLQkJCQlsb2NhdGlvbiAgIAkoMTk0MywgODY4KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5NjYNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTk0MywgODY4KQ0KLQkJCQkgICAgKDE5NDMsIDYzMSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY0IiBAOTY4DQotCQkJCWxvY2F0aW9uICAgCSgyMTI1LCA2ODApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjQwMDUxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2NSIgQDk2OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5NjgNCi0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNjAyQUQiDQotCQkJCQljbGllbnQgICAgIAlAOTY4DQotCQkJCQlzdXBwbGllciAgIAlAOTY1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMjUsIDY4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCA3MjkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEA5NzANCi0JCQkJCVBhcmVudF9WaWV3IAlAOTY4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTU3LCAzNDQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjU1LCA2NzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzU0MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNjAyQjciDQotCQkJCQljbGllbnQgICAgIAlAOTY4DQotCQkJCQlzdXBwbGllciAgIAlAOTY2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMjUsIDY4MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCA2MzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NzINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY3LCA2NzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzU0MzkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDk3Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMzIwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OCwgMjc3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0Ig0KLQkJCQl3aWR0aCAgICAgIAkyMzQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NzQNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgNDY1KQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUA5NzMNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjcyLCA0NjUpDQotCQkJCSAgICAoMjcyLCAzNzUpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAOTc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY1NiwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc1DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM3MiwgMTEyMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NjkNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiDQotCQkJCXdpZHRoICAgICAgCTU4Nw0KLQkJCQloZWlnaHQgICAgIAkxMTgNCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA5NzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDU3NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODksIDUzMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSINCi0JCQkJd2lkdGggICAgICAJMzUyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUyIiBAOTc3DQotCQkJCWxvY2F0aW9uICAgCSgxMTcwLCAxMzU2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0FDMDI1QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtb2RlbEdyb3VwIiBAOTc4DQotCQkJCQlQYXJlbnRfVmlldyAJQDk3Nw0KLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTc5DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY5LCAxMzg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXAiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzQwNDQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSINCi0JCQkJCWNsaWVudCAgICAgCUA5NzcNCi0JCQkJCXN1cHBsaWVyICAgCUA5NzYNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTcwLCAxMzU2KQ0KLQkJCQkJICAgICgyMDYsIDEzNTYpDQotCQkJCQkgICAgKDIwNiwgNjMxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3MCwgMTM1NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDYsIDYzMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTc4DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNiwgMTMyMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1OTE0Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUzIiBAOTgxDQotCQkJCQlQYXJlbnRfVmlldyAJQDk3Nw0KLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjUyMSwgMTM5OCkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOCINCi0JCQkJCWNsaWVudCAgICAgCUA5NzcNCi0JCQkJCXN1cHBsaWVyICAgCUA5NzUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTcwLCAxMzU2KQ0KLQkJCQkJICAgICgyNzMxLCAxMzU2KQ0KLQkJCQkJICAgICgyNzMxLCAxMjI3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3MCwgMTM1NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzMxLCAxMjI3KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA5ODMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNjAsIDE2OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4Mw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjY4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ2IiBAOTg0DQotCQkJCWxvY2F0aW9uICAgCSgxMjIsIDExMzYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjEwMkY4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0NyIgQDk4NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5ODQNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMwLCAtMjU2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkJDRUI2MDAxQiINCi0JCQkJCWNsaWVudCAgICAgCUA5ODQNCi0JCQkJCXN1cHBsaWVyICAgCUA5NzYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIyLCAxMTM2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMiwgNjMxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAOTg2DQotCQkJCQlQYXJlbnRfVmlldyAJQDk4NA0KLQkJCQkJbG9jYXRpb24gICAJKC02MzAsIC0yNTYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5ODcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjMsIDE1MTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTA0OTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMjUiDQotCQkJCQljbGllbnQgICAgIAlAOTg0DQotCQkJCQlzdXBwbGllciAgIAlAOTgzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMiwgMTEzNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIsIDE2NDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5ODgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODAsIDE1ODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODExODgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IiBAOTg5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA4MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNDIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDk1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGVDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiINCi0JCQkJd2lkdGggICAgICAJNTEzDQotCQkJCWhlaWdodCAgICAgCTEwMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU4IiBAOTkwDQotCQkJCWxvY2F0aW9uICAgCSg0NywgODg1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0NzE1MDExOSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTkiIEA5OTENCi0JCQkJCVBhcmVudF9WaWV3IAlAOTkwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0NzFBMDNBQiINCi0JCQkJCWNsaWVudCAgICAgCUA5OTANCi0JCQkJCXN1cHBsaWVyICAgCUA5ODMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDcsIDg4NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NywgMTY0MSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAOTkyDQotCQkJCQlQYXJlbnRfVmlldyAJQDk5MA0KLQkJCQkJbG9jYXRpb24gICAJKC0yODksIDgyMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTkyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MiwgMTg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjE4NTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk5NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0NzFBMDNCNSINCi0JCQkJCWNsaWVudCAgICAgCUA5OTANCi0JCQkJCXN1cHBsaWVyICAgCUA5ODkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDcsIDg4NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NywgMTMwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgsIDE5MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNzg4MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTE5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA5OTUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA4OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTIsIDg0OSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4Ig0KLQkJCQl3aWR0aCAgICAgIAkzNjMNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAOTk2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTk2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3NSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTQ4NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg4IiBAOTk3DQotCQkJCWxvY2F0aW9uICAgCSgxMzE5LCAxMDM0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkYxREU5MDE4QSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4OSIgQDk5OA0KLQkJCQkJUGFyZW50X1ZpZXcgCUA5OTcNCi0JCQkJCWxvY2F0aW9uICAgCSgtNTcsIC0xMDIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzZDIg0KLQkJCQkJY2xpZW50ICAgICAJQDk5Nw0KLQkJCQkJc3VwcGxpZXIgICAJQDk5NQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzE5LCAxMDM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMTksIDk1NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAOTk5DQotCQkJCQlQYXJlbnRfVmlldyAJQDk5Nw0KLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM5LCAxMDM5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzMxNzENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFQTAzODAiDQotCQkJCQljbGllbnQgICAgIAlAOTk3DQotCQkJCQlzdXBwbGllciAgIAlAOTk2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxOSwgMTExMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjc5LCAxMDMxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA0MDgxNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDEwMDINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMDgwLCAxNjk2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODU1LCAxNjUzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyINCi0JCQkJd2lkdGggICAgICAJNDY4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEwMDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjgwLCAxNjk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNSwgMTY1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCXdpZHRoICAgICAgCTUwOA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4NCIgQDEwMDQNCi0JCQkJbG9jYXRpb24gICAJKDEzNTEsIDE4NDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTUwMTEyIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NSIgQDEwMDUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAwNA0KLQkJCQkJbG9jYXRpb24gICAJKC0yOTcsIDIyNCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNzAzQjQiDQotCQkJCQljbGllbnQgICAgIAlAMTAwNA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMDMNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzUxLCAxODQwKQ0KLQkJCQkJICAgICgxMjk0LCAxODQwKQ0KLQkJCQkJICAgICgxMjk0LCAxNzUxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MSwgMTg0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk0LCAxNzUxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTAwNg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA0DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI5NywgMjI0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwNg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxODA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjMyNjUzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTcwM0M4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMDQNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDAzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTM1MSwgMTg0MCkNCi0JCQkJCSAgICAoMTQwOSwgMTg0MCkNCi0JCQkJCSAgICAoMTQwOSwgMTc1MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTEsIDE4NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwOSwgMTc1MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2MSwgMTgwMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3Mjg0OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2OCIgQDEwMDkNCi0JCQkJbG9jYXRpb24gICAJKDExOTAsIDE0MzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODkwRDYwMDZGIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFub255bW91c1R5cGVEZWZpbml0aW9uIiBAMTAxMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA5DQotCQkJCQlsb2NhdGlvbiAgIAkoNzc0LCAtMTgzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MiwgMTUyNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NDk3Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI3Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDMxOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDA5DQotCQkJCQlzdXBwbGllciAgIAlAMTAwMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkwLCAxNDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTAsIDE2NDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDEyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDMsIDE1MjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQ1NDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY5IiBAMTAxMw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA5DQotCQkJCQlsb2NhdGlvbiAgIAkoNzc0LCAtMTgzMikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0OSwgMTI2NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDMwRSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDA5DQotCQkJCQlzdXBwbGllciAgIAlAOTk2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5MCwgMTIyMykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4NiIgQDEwMTUNCi0JCQkJbG9jYXRpb24gICAJKDE2OTAsIDE2ODQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUQwMzc0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZhY2V0Q29udGVudHMiIEAxMDE2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI2LCAtMTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDE3MzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmFjZXRDb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAzMjA1MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUYwMDEwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwMTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDAyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTAsIDE2ODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg0NiwgMTY4NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTY0NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk5NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDczMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg3IiBAMTAxOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNiwgLTEyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyMA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxOQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTY2LCAxNjQzKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUYwMDA2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDAzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2OTAsIDE2ODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUzNCwgMTY4NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEAxMDIxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjYyNCwgNzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjENCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzg4LCA3NDEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiDQotCQkJCXdpZHRoICAgICAgCTQ5MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDEwMjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAzMjApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyMg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDExMDgsIDI3NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSINCi0JCQkJd2lkdGggICAgICAJNDI2DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTAyMw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgMzIwKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU3LCAyNzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY2IiBAMTAyNA0KLQkJCQlsb2NhdGlvbiAgIAkoOTYzLCAzMTkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkIwMDNEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTAyNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDI0DQotCQkJCQlsb2NhdGlvbiAgIAkoNTk1LCAtMTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDI2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NCwgMzYxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgxMDgxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QzAxMTEiDQotCQkJCQljbGllbnQgICAgIAlAMTAyNA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMjINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYzLCAzMTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5OSwgMzE5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDE2LCAyOTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTYzOTYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2NyIgQDEwMjgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAyNA0KLQkJCQkJbG9jYXRpb24gICAJKDU5NSwgLTE3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyOQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyOA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTUsIDM2MSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4RTZDMDEwNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMDI0DQotCQkJCQlzdXBwbGllciAgIAlAMTAyMw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjMsIDMxOSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MjgsIDMxOSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMTAzMA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxNjAsIDk5MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3NCwgOTQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSINCi0JCQkJd2lkdGggICAgICAJMzkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTAzMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMiwgMTU5MykNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTAzMA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyMzIyLCAxNTkzKQ0KLQkJCQkgICAgKDIzMjIsIDEwNDcpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAzMg0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMzDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzINCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ2LCA5MDUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjAwMDANCi0JCQkJICAgIGhlaWdodCAgICAgCTUNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJGNTAxM0EiDQotCQkJCWNsaWVudCAgICAgCUAxMDMwDQotCQkJCXN1cHBsaWVyICAgCUA5NjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNTAsIDkzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTAsIDg2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTY3KQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTAzNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDgzMiwgNTc2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTEwLCA1MzIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNjQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNjYyDQotCQkJCWhlaWdodCAgICAgCTExMg0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEyIiBAMTAzNQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ5OCwgMTQzMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNDAxQUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iIEAxMDM2DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzUNCi0JCQkJCWxvY2F0aW9uICAgCSgxMDM4LCAtMTgxMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyNywgMTQ3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1NDM4OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTUwMDE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwMzUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDMwDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ5OCwgMTQzMSkNCi0JCQkJCSAgICAoMjI4MSwgMTQzMSkNCi0JCQkJCSAgICAoMjI4MSwgMTA0NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDE0MzEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI4MSwgMTA0NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMzgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjIwNCwgMTM5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwNTQxOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEzIiBAMTAzOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDM1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzOCwgLTE4MTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTAsIDg2NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MTE1MDAxNiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDM1DQotCQkJCQlzdXBwbGllciAgIAlAMTAzNA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0OTgsIDE0MzEpDQotCQkJCQkgICAgKDExMzEsIDE0MzEpDQotCQkJCQkgICAgKDExMzEsIDYzMikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDE0MzEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzMSwgNjMyKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBAMTA0MQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDg0OCwgMTE2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY1NSwgMTEyNSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1Ig0KLQkJCQl3aWR0aCAgICAgIAk0MDQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEAxMDQyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA4OTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDUsIDg1MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiINCi0JCQkJd2lkdGggICAgICAJNjA4DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE2IiBAMTA0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoNTM0LCA3MzYpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRUYwMTYwIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBAMTA0NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDQzDQotCQkJCQlsb2NhdGlvbiAgIAkoODYsIC0yMTQ0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjAsIDc0OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExMTExMQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI4Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDQzDQotCQkJCQlzdXBwbGllciAgIAlAMTA0Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MzQsIDczNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzQsIDg0MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTk1LCA4MDcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NzU5MjYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNyIgQDEwNDcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0Mw0KLQkJCQkJbG9jYXRpb24gICAJKDg2LCAtMjE0NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCA2NTMpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTgiDQotCQkJCQljbGllbnQgICAgIAlAMTA0Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEwMzQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTM0LCA3MzYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTM0LCA2MzIpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzYiIEAxMDQ5DQotCQkJCWxvY2F0aW9uICAgCSg5MDAsIDEwMzIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNlbGVjdG9yIiBAMTA1MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDQ5DQotCQkJCQlsb2NhdGlvbiAgIAkoODQsIDEyMCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxMywgMTA0MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzZWxlY3RvciINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEyMzI4OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTExMw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIzNCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDQ5DQotCQkJCQlzdXBwbGllciAgIAlAMTA0MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDAsIDEwMzIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAwLCAxMTEzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDEwNDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wOTU4OTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzNyIgQDEwNTMNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0OQ0KLQkJCQkJbG9jYXRpb24gICAJKDg0LCAxMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUzDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgOTY4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjJBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwNDkNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkwMCwgMTAzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDAsIDk1MSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzOCIgQDEwNTUNCi0JCQkJbG9jYXRpb24gICAJKDcwMCwgMTAzMikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAwMjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmllbGRzIiBAMTA1Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDU1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTYsIDEwMzYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTIwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmllbGRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU0Nzk1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNzkiDQotCQkJCQljbGllbnQgICAgIAlAMTA1NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNDENCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzAwLCAxMDMyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwMCwgMTExMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzcxLCAxMDQyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTIzMDc3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzkiIEAxMDU5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNTUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE2LCAxMjApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY1OSwgOTY4KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzY1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNTUNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcwMCwgMTAzMikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDAsIDk1MSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDEwNjENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDE0NDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwMCwgMTM5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2Ig0KLQkJCQl3aWR0aCAgICAgIAk1MjINCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMDYyDQotCQkJCWxvY2F0aW9uICAgCSg1NTAsIDE1OTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEwNjENCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoNTUwLCAxNTkwKQ0KLQkJCQkgICAgKDU1MCwgMTQ5NSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IiBAMTA2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1MDQsIDU3NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0MCwgNTMzKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiDQotCQkJCXdpZHRoICAgICAgCTU0Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwNjQNCi0JCQkJbG9jYXRpb24gICAJKDE0MDYsIDc2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTA2Mw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxNDA2LCA3NjUpDQotCQkJCSAgICAoMTQwNiwgNjMxKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMDY1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjY1NiwgMTY5NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTMsIDE2NTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTI2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSINCi0JCQkJd2lkdGggICAgICAJNTQ0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTQiIEAxMDY2DQotCQkJCWxvY2F0aW9uICAgCSgxNjE0LCAxODY4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkZEREQ3MDExMyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5NSIgQDEwNjcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA2Ng0KLQkJCQkJbG9jYXRpb24gICAJKDUyNiwgNDc2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkZERERBMDI2QiINCi0JCQkJCWNsaWVudCAgICAgCUAxMDY2DQotCQkJCQlzdXBwbGllciAgIAlAMTA2NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE2MTQsIDE4NjgpDQotCQkJCQkgICAgKDI1MDAsIDE4NjgpDQotCQkJCQkgICAgKDI1MDAsIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjE0LCAxODY4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1MDAsIDE3NTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDEwNjgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA2Ng0KLQkJCQkJbG9jYXRpb24gICAJKDUyNiwgNDc2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4OTYsIDE3ODcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTg3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTg5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RkREREEwMjc1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEwNjYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDYxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTYxNCwgMTg2OCkNCi0JCQkJCSAgICAoOTg0LCAxODY4KQ0KLQkJCQkJICAgICg5ODQsIDE0OTUpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjE0LCAxODY4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4NCwgMTQ5NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0MiwgMTgyNCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU3MTI4Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDAiIEAxMDcxDQotCQkJCWxvY2F0aW9uICAgCSgyOTI3LCAzODcpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzYwMzg2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUNvbnRlbnRzIiBAMTA3Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDcxDQotCQkJCQlsb2NhdGlvbiAgIAkoMjQ2MywgLTM3NTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDczDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTUsIDM1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVDb250ZW50cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3MzA2MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzgwMDdDIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwNzENCi0JCQkJCXN1cHBsaWVyICAgCUAxMDYzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMjkyNywgMzg3KQ0KLQkJCQkJICAgICgxNzUwLCAzODcpDQotCQkJCQkgICAgKDE3NTAsIDUyMSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCA1MjEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDc0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDQsIDQyNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzI0Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAxIiBAMTA3NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDcxDQotCQkJCQlsb2NhdGlvbiAgIAkoMjQ2MywgLTM3NTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDc2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI5NDYsIDE0NDgpDQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDINCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzODAwNzIiDQotCQkJCQljbGllbnQgICAgIAlAMTA3MQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyOTI3LCAzODcpDQotCQkJCQkgICAgKDI5ODcsIDM4NykNCi0JCQkJCSAgICAoMjk4NywgMTY3MSkNCi0JCQkJCSAgICAoMjkyOCwgMTY3MSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTI4LCAxNjcxKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTA3Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDExNjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjk5LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiDQotCQkJCXdpZHRoICAgICAgCTU1Ng0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOCkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc2IiBAMTA3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTc1MCwgODcyKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDRFMDA2NyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwNzkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3OA0KLQkJCQkJbG9jYXRpb24gICAJKDE0NjIsIC0yMzkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3OQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQwLCA2OTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTEwMzcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjY5NDA1MDAyQTUiDQotCQkJCQljbGllbnQgICAgIAlAMTA3OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEwNjMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgODcyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDYzMSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNCwgNjk1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM0NDQwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3NyIgQDEwODINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3OA0KLQkJCQkJbG9jYXRpb24gICAJKDE0NjIsIC0yMzkyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzA5LCAxMDY1KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNTAwMjlCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEwNzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMDc3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCAxMTEzKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEAxMDg0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxMTY4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjc5LCAxMTI1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJd2lkdGggICAgICAJMjkyDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA4IiBAMTA4NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTI1MiwgMTg5NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4NzAyNDciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA5IiBAMTA4Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDg1DQotCQkJCQlsb2NhdGlvbiAgIAkoNzA4LCAxMjg4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRUJEQzhDMDJGOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMDg1DQotCQkJCQlzdXBwbGllciAgIAlAMTA2NQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNTIsIDE4OTYpDQotCQkJCQkgICAgKDI2MDMsIDE4OTYpDQotCQkJCQkgICAgKDI2MDMsIDE3NTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUyLCAxODk2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDMsIDE3NTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTA4Nw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDg1DQotCQkJCQlsb2NhdGlvbiAgIAkoNzA4LCAxMjg4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2ODIsIDE4NTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmRDb250ZW50Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzgxMTQyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4QzAzMDMiDQotCQkJCQljbGllbnQgICAgIAlAMTA4NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDEwODQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjUyLCAxODk2KQ0KLQkJCQkJICAgICg0MjgsIDE4OTYpDQotCQkJCQkgICAgKDQyOCwgMTIyMykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTIsIDE4OTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDI4LCAxMjIzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4OQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4Nw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzODIsIDE4NjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzUwMzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Nw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODAiIEAxMDkwDQotCQkJCWxvY2F0aW9uICAgCSgxMTk5LCAxMzIxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjc1RDMyMDIyMCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4MSIgQDEwOTENCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA5MA0KLQkJCQkJbG9jYXRpb24gICAJKDY1NSwgNzEzKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc1RDNDMDEwQyINCi0JCQkJCWNsaWVudCAgICAgCUAxMDkwDQotCQkJCQlzdXBwbGllciAgIAlAMTA3Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExOTksIDEzMjEpDQotCQkJCQkgICAgKDE4OTcsIDEzMjEpDQotCQkJCQkgICAgKDE4OTcsIDEyMjMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk5LCAxMzIxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTcsIDEyMjMpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTA5Mg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDkwDQotCQkJCQlsb2NhdGlvbiAgIAkoNjU1LCA3MTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDkzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NywgMTI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40Mjk1NjkNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc1RDNDMDEwRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMDkwDQotCQkJCQlzdXBwbGllciAgIAlAMTA4NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExOTksIDEzMjEpDQotCQkJCQkgICAgKDUwMCwgMTMyMSkNCi0JCQkJCSAgICAoNTAwLCAxMjIzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5OSwgMTMyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDAsIDEyMjMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgMTI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4MjMwNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwOTUNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUAxMDY1DQotCQkJCXN1cHBsaWVyICAgCUAxMDMwDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjA2LCAxNjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwNiwgMTU5MykNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAzMSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA5Ng0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk3DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTksIDQ5NSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDMNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NjQyOQ0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNg0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjE3MDAyRSINCi0JCQkJY2xpZW50ICAgICAJQDEwMzQNCi0JCQkJc3VwcGxpZXIgICAJQDk3Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUzLCA1MjApDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTMsIDQ2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTc0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDk4DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIg0KLQkJCQljbGllbnQgICAgIAlAMTAwMw0KLQkJCQlzdXBwbGllciAgIAlAMTAzMA0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQwOSwgMTY0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDksIDE1OTMpDQotCQkJCWRyYXdTdXBwbGllciAJQDEwMzEpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwOTkNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEwMA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk5DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU5LCAxNTkxKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIxOQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTgwMzkyDQotCQkJCSAgICBoZWlnaHQgICAgIAkzODUNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiDQotCQkJCWNsaWVudCAgICAgCUAxMDAzDQotCQkJCXN1cHBsaWVyICAgCUAxMDYxDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTQ0LCAxNjQxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE0NCwgMTU5MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA2MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEwMQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTY0MDI3OSINCi0JCQkJY2xpZW50ICAgICAJQDk3Ng0KLQkJCQlzdXBwbGllciAgIAlAOTczDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjYsIDUyMSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NiwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzQpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTAyDQotCQkJCWxvY2F0aW9uICAgCSg0MzEsIDIyMikNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAOTg5DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDQzMSwgMjIyKQ0KLQkJCQkgICAgKDQzMSwgMTMwKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMDMNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEwNA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTAzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYxLCAyMjQpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjM3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NzY3NDQNCi0JCQkJICAgIGhlaWdodCAgICAgCTg2DQotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyNDQwMDY5Ig0KLQkJCQljbGllbnQgICAgIAlAOTczDQotCQkJCXN1cHBsaWVyICAgCUA5ODkNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3NSwgMjY1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc1LCAyMjIpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMDIpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTA1DQotCQkJCWxvY2F0aW9uICAgCSgxMzA5LCA0NjUpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDEwMjINCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMTMwOSwgNDY1KQ0KLQkJCQkgICAgKDEzMDksIDM3NSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTA2DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMDcNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk0MSwgNDk1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDY0Mjg2DQotCQkJCSAgICBoZWlnaHQgICAgIAkxMA0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTY2MDMzOSINCi0JCQkJY2xpZW50ICAgICAJQDEwMzQNCi0JCQkJc3VwcGxpZXIgICAJQDEwMjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzMSwgNTIwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTMxLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMDUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMDgNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhGQzAxRTciDQotCQkJCWNsaWVudCAgICAgCUA5ODMNCi0JCQkJc3VwcGxpZXIgICAJQDEwNjENCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI1MCwgMTY0MSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1MCwgMTU5MCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA2MikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEwOQ0KLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTEwDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjA1LCA0OTMpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCXNpemUgICAgICAgCTgpDQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjEyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+Ig0KLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NTgzMzMNCi0JCQkJICAgIGhlaWdodCAgICAgCTgNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2MTAzQkUiDQotCQkJCWNsaWVudCAgICAgCUA5OTYNCi0JCQkJc3VwcGxpZXIgICAJQDEwMjINCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDExMTMpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMDUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTENCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTExMg0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTExDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1MSwgOTA1KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODQ4OTgwDQotCQkJCSAgICBoZWlnaHQgICAgIAk3Mw0KLQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkVCMDJBOCINCi0JCQkJY2xpZW50ICAgICAJQDEwNzcNCi0JCQkJc3VwcGxpZXIgICAJQDk2Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg3OCwgMTExMykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzgsIDg2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTY3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTEzDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMTQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDIsIDgwNykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkxODcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3OTMxMA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjENCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAzQTAyMjEiDQotCQkJCWNsaWVudCAgICAgCUAxMDc3DQotCQkJCXN1cHBsaWVyICAgCUAxMDYzDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAzLCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMywgNzY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDY0KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTE1DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMTYNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTQsIDgwMSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMA0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNzANCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDczNzAzOEYiDQotCQkJCWNsaWVudCAgICAgCUA5OTUNCi0JCQkJc3VwcGxpZXIgICAJQDEwNjMNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyODQsIDgzNykNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODQsIDc2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA2NCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExNw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjY0MDI0MCINCi0JCQkJY2xpZW50ICAgICAJQDk2NQ0KLQkJCQlzdXBwbGllciAgIAlAMTAyMQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4NCwgNzYyKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3OSwgNzYyKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExOA0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiINCi0JCQkJY2xpZW50ICAgICAJQDk2NA0KLQkJCQlzdXBwbGllciAgIAlAMTAyMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzNywgNTIxKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTE5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIg0KLQkJCQljbGllbnQgICAgIAlAMTAyMQ0KLQkJCQlzdXBwbGllciAgIAlAOTY0DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjM3LCA3MjkpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjM3LCA2MzEpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTIwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyQjMwMUQ1Ig0KLQkJCQljbGllbnQgICAgIAlAOTY2DQotCQkJCXN1cHBsaWVyICAgCUAxMDIyDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTUwLCA1MjEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTUwLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDExMDUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjENCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEyMg0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTIxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgyMSwgODk3KQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlzaXplICAgICAgIAk4KQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTE4MQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiINCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMDg3NzE5DQotCQkJCSAgICBoZWlnaHQgICAgIAk3Ng0KLQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTRGMDIzQyINCi0JCQkJY2xpZW50ICAgICAJQDk2Mw0KLQkJCQlzdXBwbGllciAgIAlAMTAyMg0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg5NiwgOTM3KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg5NiwgNDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA1KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTIzDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMjQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMTMsIDkwNCkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDcNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1MDYyMg0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjgNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJFMjAzODEiDQotCQkJCWNsaWVudCAgICAgCUA5NzUNCi0JCQkJc3VwcGxpZXIgICAJQDk2Ng0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM4MSwgMTEwOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzODEsIDg2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTY3KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTI1DQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMjYNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDI4NzgsIDI2OSkNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJc2l6ZSAgICAgICAJOCkNCi0JCQkJICAgIGFuY2hvciAgICAgCTEwDQotCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iDQotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0NjY2Nw0KLQkJCQkgICAgaGVpZ2h0ICAgICAJNjYNCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDI1NTAzODUiDQotCQkJCWNsaWVudCAgICAgCUA5NzUNCi0JCQkJc3VwcGxpZXIgICAJQDk4OQ0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjk0MywgMTEwOSkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5NDMsIDIyMikNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwMikNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyNw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSINCi0JCQkJY2xpZW50ICAgICAJQDEwODQNCi0JCQkJc3VwcGxpZXIgICAJQDk3Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDYyLCAxMTEzKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDYyLCA0NjUpDQotCQkJCWRyYXdTdXBwbGllciAJQDk3NCkpKQ0KLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI5LiBDb25jcmV0ZSBTY2hlbWEgQ29tcG9zaXRpb24iDQotCQkJcXVpZCAgICAgICAJIjNDMjVFQjdBMDM4QyINCi0JCQl0aXRsZSAgICAgIAkiOS4gQ29uY3JldGUgU2NoZW1hIENvbXBvc2l0aW9uIg0KLQkJCXpvb20gICAgICAgCTEwMA0KLQkJCW1heF9oZWlnaHQgCTI4MzUwDQotCQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCQlvcmlnaW5feCAgIAkwDQotCQkJb3JpZ2luX3kgICAJMA0KLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMTI4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxNTM2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTI4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDE0OTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCINCi0JCQkJd2lkdGggICAgICAJNDgwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTgiIEAxMTI5DQotCQkJCWxvY2F0aW9uICAgCSgyMjgsIDE2OTUpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRTYwMjUxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExOSIgQDExMzANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyOQ0KLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTMxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgMTYyMykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MUVBMDJGNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMTI5DQotCQkJCQlzdXBwbGllciAgIAlAMTEyOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIyOCwgMTY5NSkNCi0JCQkJCSAgICAoMTc1LCAxNjk1KQ0KLQkJCQkJICAgICgxNzUsIDE1OTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjgsIDE2OTUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1LCAxNTkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIiBAMTEzMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTI5DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ3NiwgLTM4NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMzMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzI5LCAxNzQwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuOTI0NTI4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDFFQTAzMEIiDQotCQkJCQljbGllbnQgICAgIAlAMTEyOQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExMjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgyMjgsIDE2OTUpDQotCQkJCQkgICAgKDI4MSwgMTY5NSkNCi0JCQkJCSAgICAoMjgxLCAxNTkxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4LCAxNjk1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4MSwgMTU5MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMzQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI5LCAxNjQ2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDA1NzE0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTEzNQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDE1MzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3OTAsIDE0OTMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTAwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQl3aWR0aCAgICAgIAk1MTgNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1NCIgQDExMzYNCi0JCQkJbG9jYXRpb24gICAJKDk1MiwgMTY5OCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0NTAzOTgiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU1IiBAMTEzNw0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTM2DQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTM4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM3DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg2MCwgMTYyMykNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ5MDM4QSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTM2DQotCQkJCQlzdXBwbGllciAgIAlAMTEzNQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDk1MiwgMTY5OCkNCi0JCQkJCSAgICAoOTAxLCAxNjk4KQ0KLQkJCQkJICAgICg5MDEsIDE1OTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAxLCAxNTkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iIEAxMTM5DQotCQkJCQlQYXJlbnRfVmlldyAJQDExMzYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTI4OCwgLTMxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNDANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMCwgMTczOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1NjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMzI2OTIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0OTAzOUUiDQotCQkJCQljbGllbnQgICAgIAlAMTEzNg0KLQkJCQkJc3VwcGxpZXIgICAJQDExMzUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg5NTIsIDE2OTgpDQotCQkJCQkgICAgKDEwMDQsIDE2OTgpDQotCQkJCQkgICAgKDEwMDQsIDE1OTEpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwNCwgMTU5MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUyLCAxNjQ5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAwMDAwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEAxMTQyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjU2LCA5OTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQyMCwgOTQ5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIg0KLQkJCQl3aWR0aCAgICAgIAk0OTANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDExNDMNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDc4NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEyLCA3MzcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDU3DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiINCi0JCQkJd2lkdGggICAgICAJNDc1DQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMTQ0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCA0MTYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NDYsIDI4NSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIg0KLQkJCQl3aWR0aCAgICAgIAk0MDYNCi0JCQkJaGVpZ2h0ICAgICAJMjg3DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxOCIgQDExNDUNCi0JCQkJbG9jYXRpb24gICAJKDEzMDMsIDY3OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREQwQzAzREIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkU2NoZW1hIiBAMTE0Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTQ1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDU5LCAzODEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkU2NoZW1hIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAwMzg0DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDUiDQotCQkJCQljbGllbnQgICAgIAlAMTE0NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMzAzLCA2NzkpDQotCQkJCQkgICAgKDEzMDMsIDQxOSkNCi0JCQkJCSAgICAoODQzLCA0MTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzAzLCA2NzkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA0MTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQ4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQ2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkyMiwgNDU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkwNzQ2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTkiIEAxMTQ5DQotCQkJCQlQYXJlbnRfVmlldyAJQDExNDUNCi0JCQkJCWxvY2F0aW9uICAgCSgtNDEsIC04NTcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQ5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDUsIDk1NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCINCi0JCQkJCWNsaWVudCAgICAgCUAxMTQ1DQotCQkJCQlzdXBwbGllciAgIAlAMTE0Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEzMDMsIDY3OSkNCi0JCQkJCSAgICAoMTMwMywgOTk3KQ0KLQkJCQkJICAgICg5MDEsIDk5NykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDMsIDY3OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDk5NykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNiIgQDExNTENCi0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDY0OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDNzAwRUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRTY2hlbWEiIEAxMTUyDQotCQkJCQlQYXJlbnRfVmlldyAJQDExNTENCi0JCQkJCWxvY2F0aW9uICAgCSgzMzYsIC0xMzk5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1Mg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM4LCA1MDApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRTY2hlbWEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDE5MjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MyINCi0JCQkJCWNsaWVudCAgICAgCUAxMTUxDQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyMTYsIDY0OSkNCi0JCQkJCSAgICAoMTIxNiwgNTM0KQ0KLQkJCQkJICAgICg4NDMsIDUzNCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTYsIDY0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDUzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNTQNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTINCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTI2LCA1NzcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MzE2NDMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxNyIgQDExNTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE1MQ0KLQkJCQkJbG9jYXRpb24gICAJKDMzNiwgLTEzOTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTU1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NCwgNzU2KQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQyIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNTENCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQzDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIxNiwgNjQ5KQ0KLQkJCQkJICAgICgxMjE2LCA3OTcpDQotCQkJCQkgICAgKDg3NywgNzk3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxNiwgNjQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg3NywgNzk3KSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIyIiBAMTE1Nw0KLQkJCQlsb2NhdGlvbiAgIAkoNjYyLCA2NDIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTYwMTMxIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlZmVyZW5jaW5nRGlyZWN0aXZlcyIgQDExNTgNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE1Nw0KLQkJCQkJbG9jYXRpb24gICAJKC0yMzQsIDExNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNTkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCA2NzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVmZXJlbmNpbmdEaXJlY3RpdmVzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDA4NzU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjE2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTkwMzcxIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNTcNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQzDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2MiwgNjQyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MiwgNzI1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDY3OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQzMDY1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIzIiBAMTE2MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTU3DQotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjEsIDU3NikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVEM0E5MDM3MCINCi0JCQkJCWNsaWVudCAgICAgCUAxMTU3DQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjIsIDU1OSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyNCIgQDExNjMNCi0JCQkJbG9jYXRpb24gICAJKDc1LCAxODgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjAwMDVFIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyNSIgQDExNjQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE2Mw0KLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIC0zMDgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjQwMDFFIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzUsIDE4OCkNCi0JCQkJCSAgICAoNzUsIDEyOCkNCi0JCQkJCSAgICAoNTEwLCAxMjgpDQotCQkJCQkgICAgKDUxMCwgMjczKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDE4OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTAsIDI3MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VmVyc2lvbiIgQDExNjUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE2Mw0KLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIC0zMDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgNzQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFZlcnNpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNTkzNzUwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjQwMDI4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDExNjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNzUsIDE4OCkNCi0JCQkJCSAgICAoNzUsIDM4MCkNCi0JCQkJCSAgICAoNDM3LCAzODApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMTg4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgMzgwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNjgsIDMyOCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3NDc1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTUzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjYiIEAxMTY4DQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAxMzQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEIwMTFCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyNyIgQDExNjkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE2OA0KLQkJCQkJbG9jYXRpb24gICAJKDMzNCwgLTM2MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwRjAxMjEiDQotCQkJCQljbGllbnQgICAgIAlAMTE2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDExNDQNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjYyLCAxMzQpDQotCQkJCQkgICAgKDc2NiwgMTM0KQ0KLQkJCQkJICAgICg3NjYsIDI3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NjYsIDI3MykpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJvcmlnaW5hbFZlcnNpb24iIEAxMTcwDQotCQkJCQlQYXJlbnRfVmlldyAJQDExNjgNCi0JCQkJCWxvY2F0aW9uICAgCSgzMzQsIC0zNjIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTcxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNjQsIDk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK29yaWdpbmFsVmVyc2lvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS42NTAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRDBGMDEyQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTY4DQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNjIsIDEzNCkNCi0JCQkJCSAgICAoMTMyMiwgMTM0KQ0KLQkJCQkJICAgICgxMzIyLCAzMzQpDQotCQkJCQkgICAgKDg0MywgMzM0KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMTM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgMzM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MTksIDI3OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODEwOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjgiIEAxMTczDQotCQkJCWxvY2F0aW9uICAgCSgxMjYsIDY1NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBQjAwMUYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI5IiBAMTE3NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTczDQotCQkJCQlsb2NhdGlvbiAgIAkoLTgzNCwgMTYwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRUFGMDEwQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTczDQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNiwgNjU2KQ0KLQkJCQkJICAgICg1MTMsIDY1NikNCi0JCQkJCSAgICAoNTEzLCA1NTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYsIDY1NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTMsIDU1OSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRWZXJzaW9ucyIgQDExNzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3Mw0KLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3LCA0MzEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDA4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkVmVyc2lvbnMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDM5MDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRUFGMDExNSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTczDQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNiwgNjU2KQ0KLQkJCQkJICAgICg2NiwgNjU2KQ0KLQkJCQkJICAgICg2NiwgNDcyKQ0KLQkJCQkJICAgICg0MzcsIDQ3MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNiwgNjU2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgNDcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNTYsIDUyNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2ODQ2OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzIiIEAxMTc4DQotCQkJCWxvY2F0aW9uICAgCSg2NDIsIDEyNikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3MzAxOTQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMzIiBAMTE3OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTc4DQotCQkJCQlsb2NhdGlvbiAgIAkoODIsIC00MTgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzUwMUYxIg0KLQkJCQkJY2xpZW50ICAgICAJQDExNzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoNjQyLCAxMjYpDQotCQkJCQkgICAgKDU4OCwgMTI2KQ0KLQkJCQkJICAgICg1ODgsIDI3MykpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY0MiwgMTI2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OCwgMjczKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYUZvclNjaGVtYSIgQDExODANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3OA0KLQkJCQkJbG9jYXRpb24gICAJKDgyLCAtNDE4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MzksIDc0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM4NA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYUZvclNjaGVtYSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNTU1NTYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjc4NDc1MDFGQiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTc4DQotCQkJCQlzdXBwbGllciAgIAlAMTE0NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDY0MiwgMTI2KQ0KLQkJCQkJICAgICg2OTcsIDEyNikNCi0JCQkJCSAgICAoNjk3LCAyNzMpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2OTcsIDI3MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAyMTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDE4NjMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTgzDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIg0KLQkJCQljbGllbnQgICAgIAlAMTE0Mg0KLQkJCQlzdXBwbGllciAgIAlAMTE0Mw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjM4LCA5MzcpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzgsIDg0MykpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDExODQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDExODQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NywgMTE0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTQ5Mg0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzIiIEAxMTg1DQotCQkJCWxvY2F0aW9uICAgCSgyMzQsIDEzNDApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNkIwMTk0Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDczIiBAMTE4Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTg1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxMCwgLTQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MCwgMTI3MSkNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMwOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMTg1DQotCQkJCQlzdXBwbGllciAgIAlAMTE4NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzNCwgMTM0MCkNCi0JCQkJCSAgICAoMTgxLCAxMzQwKQ0KLQkJCQkJICAgICgxODEsIDEyMzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDEzNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxLCAxMjM5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMTg4DQotCQkJCQlQYXJlbnRfVmlldyAJQDExODUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzEwLCAtNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODkNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODgNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMzLCAxMzg5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMS44Njc5MjUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMxMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMTg1DQotCQkJCQlzdXBwbGllciAgIAlAMTE4NA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDIzNCwgMTM0MCkNCi0JCQkJCSAgICAoMjg3LCAxMzQwKQ0KLQkJCQkJICAgICgyODcsIDEyMzkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDEzNDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg3LCAxMjM5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5MA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4OA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDEyOTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDI5NDUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Ng0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEAxMTkxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTc2MCwgMTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkxDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNywgMTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCINCi0JCQkJd2lkdGggICAgICAJNTA0DQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDExOTINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCA0MTYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTksIDM3MykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCXdpZHRoICAgICAgCTI0NA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzA2IiBAMTE5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTY2OCwgMjgwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNENEJCNEFFMDFDQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDciIEAxMTk0DQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTMNCi0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEFGMDEwRiINCi0JCQkJCWNsaWVudCAgICAgCUAxMTkzDQotCQkJCQlzdXBwbGllciAgIAlAMTE5MQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY4LCAyODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OCwgMTk5KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY0ZhY2V0cyIgQDExOTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5Mw0KLQkJCQkJbG9jYXRpb24gICAJKDgsIC0xNTIpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTIsIDMwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNGYWNldHMiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNDYxNTQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRjAxMUEiDQotCQkJCQljbGllbnQgICAgIAlAMTE5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDExOTINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjgsIDM2MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyNSwgMzAxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2OTIzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMTE5OA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDk0NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjYsIDkwMSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciDQotCQkJCXdpZHRoICAgICAgCTI3MA0KLQkJCQloZWlnaHQgICAgIAkxMTANCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAMTE5OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NzYsIDY0MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTUsIDU5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIg0KLQkJCQl3aWR0aCAgICAgIAk1NDANCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwOCIgQDEyMDANCi0JCQkJbG9jYXRpb24gICAJKDE1MDgsIDc5MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREMzAyOEUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA5IiBAMTIwMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjAwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyLCAtMjgwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEQ0MDJGMyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjAwDQotCQkJCQlzdXBwbGllciAgIAlAMTE5OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwOCwgNjk1KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY1BhcnRpY2xlIiBAMTIwMg0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjAwDQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyLCAtMjgwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwMg0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk1LCA3NjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljUGFydGljbGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjU5MjU5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDQwMkZEIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMDANCi0JCQkJCXN1cHBsaWVyICAgCUAxMTk4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDgsIDc5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA4ODkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjA0DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NTQsIDgyOSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5NTA2Mg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMjA1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgMTE4NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwNQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDc1NiwgMTE0MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk1NTQNCi0JCQkJaGVpZ2h0ICAgICAJMTEwDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg0IiBAMTIwNg0KLQkJCQlsb2NhdGlvbiAgIAkoOTE5LCAxMzQ5KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkI0MjVFMDFGOSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4NSIgQDEyMDcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwNg0KLQkJCQkJbG9jYXRpb24gICAJKC0yMzMsIC01OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDcNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODI1LCAxMjczKQ0KLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDQ2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMDYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjA1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTE5LCAxMzQ5KQ0KLQkJCQkJICAgICg4NjYsIDEzNDkpDQotCQkJCQkgICAgKDg2NiwgMTIzOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkxOSwgMTM0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDEyMzkpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMjA5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDYNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjEwDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk5MywgMTM5MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MDANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjM3NzM1OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDUwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMDYNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjA1DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTE5LCAxMzQ5KQ0KLQkJCQkJICAgICg5NzMsIDEzNDkpDQotCQkJCQkgICAgKDk3MywgMTIzOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkxOSwgMTM0OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NzMsIDEyMzkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjExDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxOSwgMTI5NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMTQ5MjUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEAxMjEyDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTk1MiwgOTQ0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjEyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNiwgOTAxKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI3Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSINCi0JCQkJd2lkdGggICAgICAJMjkwDQotCQkJCWhlaWdodCAgICAgCTExMA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTAiIEAxMjEzDQotCQkJCWxvY2F0aW9uICAgCSgyMDI1LCA3OTIpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDkwMUY2Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxMSIgQDEyMTQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxMw0KLQkJCQkJbG9jYXRpb24gICAJKDE1MywgLTI4MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREQTAyODQiDQotCQkJCQljbGllbnQgICAgIAlAMTIxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDExOTkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAyNSwgNzkyKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMjUsIDY5NSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNXaWxkY2FyZCIgQDEyMTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxMw0KLQkJCQkJbG9jYXRpb24gICAJKDE1MywgLTI4MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyNiwgODM4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY1dpbGRjYXJkIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDg4MDk1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0REEwMjhFIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjEyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMjUsIDc5MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA4ODkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwOTgsIDg0MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwNjE3Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTczDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTIiIEAxMjE4DQotCQkJCWxvY2F0aW9uICAgCSgxNzU0LCAxMTc4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNENEM2OEZGMDFCRiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTMiIEAxMjE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY5MDIwMzE3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjA1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTQsIDExNzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwMSwgMTE3OCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNXaWxkY2FyZCIgQDEyMjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxOA0KLQkJCQkJbG9jYXRpb24gICAJKC0xOTgsIDIzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTI2MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNXaWxkY2FyZCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE2MzM1NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTgzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY5MDIwMzE4Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEyMTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjEyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTc1NCwgMTE3OCkNCi0JCQkJCSAgICAoMjAyOCwgMTE3OCkNCi0JCQkJCSAgICAoMjAyOCwgOTk5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NCwgMTE3OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI4LCA5OTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODIsIDEwOTgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM2NjQNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEwLiBEaWFnbm9zdGljcyINCi0JCQlxdWlkICAgICAgIAkiM0JGRTVGMDgwM0UyIg0KLQkJCXRpdGxlICAgICAgCSIxMC4gRGlhZ25vc3RpY3MiDQotCQkJem9vbSAgICAgICAJMTAwDQotCQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJCW9yaWdpbl94ICAgCTANCi0JCQlvcmlnaW5feSAgIAkwDQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTU5vZGUiIEAxMjIzDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDAwLCAxMDI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIzDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDk5MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Ob2RlIikNCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCA5NDApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMTANCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjRBNTAxMTciDQotCQkJCXdpZHRoICAgICAgCTY4Ng0KLQkJCQloZWlnaHQgICAgIAkxOTINCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpY1NldmVyaXR5IiBAMTIyNA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDY1NikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOCwgNTQ3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpYWdub3N0aWNTZXZlcml0eSIpDQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTgsIDQ5NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkxMA0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJODQzMjEyNw0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY4QTcwMzJGIg0KLQkJCQl3aWR0aCAgICAgIAk0NjINCi0JCQkJaGVpZ2h0ICAgICAJMzQyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDEyMjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMTIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1OSwgNjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiINCi0JCQkJd2lkdGggICAgICAJMjg0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDEyMjYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoODk2LCAxMTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDU0MCwgNjIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNzEzDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQl3aWR0aCAgICAgIAk3MzENCi0JCQkJaGVpZ2h0ICAgICAJMTI1DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiIEAxMjI3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA2MDgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NCwgNDAyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpYWdub3N0aWMiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCQl3aWR0aCAgICAgIAk2NTgNCi0JCQkJaGVpZ2h0ICAgICAJNDM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNCIgQDEyMjgNCi0JCQkJbG9jYXRpb24gICAJKDE0NCwgMjgzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2NDMxMDM1RiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTUiIEAxMjI5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA4OCwgLTY2MSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMjAxQzYiDQotCQkJCQljbGllbnQgICAgIAlAMTIyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMjUNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0LCAyODMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0LCAxNzYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYWxsRGlhZ25vc3RpY3MiIEAxMjMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA4OCwgLTY2MSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzA5LCAzMzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYWxsRGlhZ25vc3RpY3MiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDg1OTgNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNjUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMjAxQzciDQotCQkJCQljbGllbnQgICAgIAlAMTIyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0LCAyODMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0LCAzOTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2LCAzMjcpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzANCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA1NjENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEwIiBAMTIzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTAyOCwgNDQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCRkU2MjI3MDNDRCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTEiIEAxMjM0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzk2LCAtNzIpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMkIwMDYxIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI3DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MTMsIDQ0MCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb21wb25lbnRzIiBAMTIzNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjMzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTM5NiwgLTcyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MzgsIDIzMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb21wb25lbnRzIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODI5MTgxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMkIwMDZDIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI2DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTAyOCwgNDQwKQ0KLQkJCQkJICAgICgxMDg4LCA0NDApDQotCQkJCQkgICAgKDEwODgsIDE3NCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg4LCAxNzQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjM3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDMsIDIzMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyMzg0OA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTU1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTIiIEAxMjM4DQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDI4MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2OTAxNjUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjEzIiBAMTIzOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjM4DQotCQkJCQlsb2NhdGlvbiAgIAkoMTYwLCAtMjc4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjZBMDAyNiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjM4DQotCQkJCQlzdXBwbGllciAgIAlAMTIyNg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDI4MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODgsIDE3NCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJkaWFnbm9zdGljcyIgQDEyNDANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIzOA0KLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAzMzApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGlhZ25vc3RpY3MiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTI2MzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjciDQotCQkJCQljbGllbnQgICAgIAlAMTIzOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyMjcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCAyODIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjg4LCAzOTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0NSwgMzM1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTcwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDk0NzM3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI0Mw0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNENEMwRjRDMDFBMSINCi0JCQkJY2xpZW50ICAgICAJQDEyMjcNCi0JCQkJc3VwcGxpZXIgICAJQDEyMjYNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3NSwgMzkwKQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCAxNzQpKSkpDQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjExLiBTdXBwbGVtZW50YWwiDQotCQkJcXVpZCAgICAgICAJIjNDMjg3RTQ5MDE5QiINCi0JCQl0aXRsZSAgICAgIAkiMTEuIFN1cHBsZW1lbnRhbCINCi0JCQl6b29tICAgICAgIAkxMDANCi0JCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJCW1heF93aWR0aCAgCTIxNjAwDQotCQkJb3JpZ2luX3ggICAJMA0KLQkJCW9yaWdpbl95ICAgCTANCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTI0NA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDQ2NCwgODE2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDc2MCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk4MzQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIg0KLQkJCQl3aWR0aCAgICAgIAk4NTINCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTI0NQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIxMTIsIDg4MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDgyNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiDQotCQkJCXdpZHRoICAgICAgCTc4MA0KLQkJCQloZWlnaHQgICAgIAkxMzYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjQ2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgNjApDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDgwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1Ig0KLQkJCQl3aWR0aCAgICAgIAk0OTgNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiIEAxMjQ3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzODQsIDExMikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIyMzYsIDYwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI5Ng0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpYWdub3N0aWMiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2Ig0KLQkJCQl3aWR0aCAgICAgIAkzMTQNCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzNiIgQDEyNDgNCi0JCQkJbG9jYXRpb24gICAJKDEzODIsIDg0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjg4MkM1MDEzNyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwcmltYXJ5Q29tcG9uZW50IiBAMTI0OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1MCwgLTUwOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTANCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDkNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcHJpbWFyeUNvbXBvbmVudCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0MDgyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzcwMTEzIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyNDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjQ2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNywgODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ5DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYyNCwgNTUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTcyNjANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzNyIgQDEyNTINCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI0OA0KLQkJCQkJbG9jYXRpb24gICAJKC0yNTAsIC01MDgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUzDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjUyDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTgsIDEyNikNCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MkM3MDExMiINCi0JCQkJCWNsaWVudCAgICAgCUAxMjQ4DQotCQkJCQlzdXBwbGllciAgIAlAMTI0Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCA4NCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjI3LCA4NCkpKSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDEyNTQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjE2MCwgNjg4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3OCwgNjA3KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc2NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTQNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzc4LCA2NjcpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk3MjINCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBlbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UgOiBib29sZWFuIg0KLQkJCQkJIisgY2lyY3VsYXIgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTc4Mg0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEAxMjU1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDEwNzIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDAsIDk5MSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTUNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCAxMDUxKQ0KLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQ0KLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDIzDQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudA0KLQkJCQkJIisgZmFjZXROYW1lIDogU3RyaW5nIg0KLQkJCQkJIisgZWZmZWN0aXZlVmFsdWUgOiBWYWx1ZSIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0NTgNCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTI1Ng0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDYyNCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1Ng0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA1NjgpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJODAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1Ig0KLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU2DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDYyOCkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTc2OQ0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIG1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk4MjANCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAMTI1Nw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCAyODgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDUsIDE1NykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCAyMTcpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAk0DQotCQkJCSAgICBtYXhfd2lkdGggIAkzNTYNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBhbGlhc05hbWUgOiBTdHJpbmciDQotCQkJCQkiKyB1UkkgOiBTdHJpbmciDQotCQkJCQkiKyBhbGlhc1VSSSA6IFN0cmluZyINCi0JCQkJCSIrIHFOYW1lIDogU3RyaW5nIikpDQotCQkJCXdpZHRoICAgICAgCTQ3Mg0KLQkJCQloZWlnaHQgICAgIAkyODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEAxMjU4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCAzNTIpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4LCAyOTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OA0KLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIg0KLQkJCQl3aWR0aCAgICAgIAk1NjINCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEyNTkNCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgNTEwKQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXN1cHBsaWVyICAgCUAxMjU4DQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkgICAgKDMyMCwgNTEwKQ0KLQkJCQkgICAgKDMyMCwgNDIwKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNjANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDNDAwOTAiDQotCQkJCWNsaWVudCAgICAgCUAxMjU2DQotCQkJCXN1cHBsaWVyICAgCUAxMjU4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MSwgNTU2KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEsIDUxMCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTI1OSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI2MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM4MDBEMiINCi0JCQkJY2xpZW50ICAgICAJQDEyNDQNCi0JCQkJc3VwcGxpZXIgICAJQDEyNTgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg3NywgNzQ4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODc3LCA1MTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEyNTkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhJbmNsdXNpdmVGYWNldCIgQDEyNjINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMTgwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDEsIDE3NjEpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDM4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4N0QwMERBIg0KLQkJCQl3aWR0aCAgICAgIAk0NTYNCi0JCQkJaGVpZ2h0ICAgICAJMTE5DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IiBAMTI2Mw0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDE3NzYpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTcyOSkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzUNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5JbmNsdXNpdmVGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiDQotCQkJCXdpZHRoICAgICAgCTQ5Mw0KLQkJCQloZWlnaHQgICAgIAkxMTkNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiIEAxMjY0DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMTkzNikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxODg5KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NQ0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSINCi0JCQkJd2lkdGggICAgICAJNDkzDQotCQkJCWhlaWdodCAgICAgCTExOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCIgQDEyNjUNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMwNCwgMTk2OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzMsIDE5MTcpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RXhjbHVzaXZlRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIg0KLQkJCQl3aWR0aCAgICAgIAk0ODANCi0JCQkJaGVpZ2h0ICAgICAJMTI2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEAxMjY2DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE0MjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM0LCAxMzcyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5RmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIg0KLQkJCQl3aWR0aCAgICAgIAk0MjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIgQDEyNjcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM1MiwgMTI2NCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2Nw0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNjMsIDEyMTIpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJMzc4DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQm91bmRlZEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTFEMDM0NCINCi0JCQkJd2lkdGggICAgICAJMzk2DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEAxMjY4DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIyNCwgMTM5MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2OA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDQzLCAxMzQwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiDQotCQkJCXdpZHRoICAgICAgCTM4MA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBAMTI2OQ0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDEyMzIpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjkNCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OSwgMTE3OCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAkzODINCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROdW1lcmljRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2Ig0KLQkJCQl3aWR0aCAgICAgIAk0MDANCi0JCQkJaGVpZ2h0ICAgICAJMTMyDQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IiBAMTI3MA0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNjE2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzANCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM1LCAxNTM1KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgNCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSINCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzUsIDE1OTUpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBpbmNsdXNpdmUgOiBib29sZWFuIg0KLQkJCQkJIisgZXhjbHVzaXZlIDogYm9vbGVhbiIpKQ0KLQkJCQl3aWR0aCAgICAgIAk0MjANCi0JCQkJaGVpZ2h0ICAgICAJMTg2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDEyNzENCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMjI4OCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDIsIDIyMzYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDM2DQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZUZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyINCi0JCQkJd2lkdGggICAgICAJNDU0DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTI3Mg0KLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgyMzA0LCAyNjI0KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcyDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NCwgMjU3MikNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjANCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUJFMDJFRSINCi0JCQkJd2lkdGggICAgICAJNDc4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiIEAxMjczDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzNjgsIDIxMjgpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzMNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTk2LCAyMDc2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiDQotCQkJCXdpZHRoICAgICAgCTM2Mg0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIgQDEyNzQNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAyMDk2KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc0DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDIwNDQpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERW51bWVyYXRpb25GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiDQotCQkJCXdpZHRoICAgICAgCTQ1OA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEAxMjc1DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMjI3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAyMjIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTM0MA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyINCi0JCQkJd2lkdGggICAgICAJMzU4DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIgQDEyNzYNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxNTg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTUwMykNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5GYWNldCIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzYNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTU2MykNCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkJaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkJICAgIG1heF93aWR0aCAgCTM2Mw0KLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQNCi0JCQkJCSIrIGluY2x1c2l2ZSA6IGJvb2xlYW4iDQotCQkJCQkiKyBleGNsdXNpdmUgOiBib29sZWFuIikpDQotCQkJCXdpZHRoICAgICAgCTQyMg0KLQkJCQloZWlnaHQgICAgIAkxODYNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEAxMjc3DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDI0NjQpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTExLCAyNDEyKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heExlbmd0aEZhY2V0IikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M3MDE0NiINCi0JCQkJd2lkdGggICAgICAJNDM2DQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDEyNzgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAyNDQ4KQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc4DQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzksIDIzOTYpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1Ig0KLQkJCQl3aWR0aCAgICAgIAk0MjANCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiIEAxMjc5DQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMjYwOCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3OQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAyNTU2KQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNA0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRvdGFsRGlnaXRzRmFjZXQiKQ0KLQkJCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIg0KLQkJCQl3aWR0aCAgICAgIAk0MjINCi0JCQkJaGVpZ2h0ICAgICAJMTI4DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEyODANCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAxMTUyKQ0KLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgwDQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY3LCAxMTAwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiDQotCQkJCXdpZHRoICAgICAgCTU0MA0KLQkJCQloZWlnaHQgICAgIAkxMjgNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAxMjgxDQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMTA3MikNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MQ0KLQkJCQkgICAgbG9jYXRpb24gICAJKDUwLCAxMDIwKQ0KLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJICAgIG1heF93aWR0aCAgCTI1Mg0KLQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikNCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyINCi0JCQkJd2lkdGggICAgICAJMjcwDQotCQkJCWhlaWdodCAgICAgCTEyOA0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEyODINCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgMTM2MCkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4Mg0KLQkJCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMTMwNCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODINCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDEzNjQpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiPDwwLi4qPj4gKyB2YWxpZEZhY2V0cyA6IFN0cmluZyIpKQ0KLQkJCQl3aWR0aCAgICAgIAk1OTQNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCWFubm90YXRpb24gCTgNCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0OCIgQDEyODMNCi0JCQkJbG9jYXRpb24gICAJKDE0NDYsIDEyMTgpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTQwMzBBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlRGVmaW5pdGlvbiIgQDEyODQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI4Mw0KLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4NQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4NA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTgwLCAxMTczKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlRGVmaW5pdGlvbiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkzLjI2ODI5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTcwMEREIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyODMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQ0NiwgMTIxOCkNCi0JCQkJCSAgICAoMTQ4NywgMTIxOCkNCi0JCQkJCSAgICAoMTQ4NywgMTI5MikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NDYsIDEyMTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTI5MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyODYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODQNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTI1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xODQyMTENCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0OSIgQDEyODcNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI4Mw0KLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBOTk3MDBFNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMjgzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0NDYsIDEyMTgpDQotCQkJCQkgICAgKDE0MDUsIDEyMTgpDQotCQkJCQkgICAgKDE0MDUsIDEyOTIpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDUsIDEyOTIpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTIiIEAxMjg4DQotCQkJCWxvY2F0aW9uICAgCSgxNzMzLCAxNTc1KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMDhEMDI1MiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTMiIEAxMjg5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODgNCi0JCQkJCWxvY2F0aW9uICAgCSg5MTcsIDcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDkxIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyODgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTczMywgMTU3NSkNCi0JCQkJCSAgICAoMTQ4NywgMTU3NSkNCi0JCQkJCSAgICAoMTQ4NywgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzMsIDE1NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhGYWNldCIgQDEyOTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI4OA0KLQkJCQkJbG9jYXRpb24gICAJKDkxNywgNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MSwgMTU0MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0NjI0Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM1DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDlCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEyODgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjcwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzMsIDE1NzUpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNiwgMTU3NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA0MiwgMTUzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTE1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTQiIEAxMjkzDQotCQkJCWxvY2F0aW9uICAgCSgxNTg3LCAxNzkzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEFCMDM5NiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTUiIEAxMjk0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyOTMNCi0JCQkJCWxvY2F0aW9uICAgCSg3MDcsIC0zMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzQzkiDQotCQkJCQljbGllbnQgICAgIAlAMTI5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTg3LCAxNzkzKQ0KLQkJCQkJICAgICgxNDQ3LCAxNzkzKQ0KLQkJCQkJICAgICgxNDQ3LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4NywgMTc5MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQ3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEluY2x1c2l2ZUZhY2V0IiBAMTI5NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjkzDQotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjk2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzcsIDE3NTEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4SW5jbHVzaXZlRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yOTg0NDENCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEFDMDNENCINCi0JCQkJCWNsaWVudCAgICAgCUAxMjkzDQotCQkJCQlzdXBwbGllciAgIAlAMTI2Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTIsIDE3OTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMjAsIDE3NTQpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTkxNTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU2IiBAMTI5OA0KLQkJCQlsb2NhdGlvbiAgIAkoOTM3LCAxNzg3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEFGMDMzOCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTciIEAxMjk5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEyOTgNCi0JCQkJCWxvY2F0aW9uICAgCSg2MTcsIC01KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEIwMDFGOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMjk4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDkzNywgMTc4NykNCi0JCQkJCSAgICAoOTk3LCAxNzg3KQ0KLQkJCQkJICAgICg5OTcsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzcsIDE3ODcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTk3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkluY2x1c2l2ZUZhY2V0IiBAMTMwMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjk4DQotCQkJCQlsb2NhdGlvbiAgIAkoNjE3LCAtNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzkyLCAxNzQ1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkluY2x1c2l2ZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzQ2MDYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMDAyMDMiDQotCQkJCQljbGllbnQgICAgIAlAMTI5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjMNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTM3LCAxNzg3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxOCwgMTc4NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc1LCAxNzQzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzOTYyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1OCIgQDEzMDMNCi0JCQkJbG9jYXRpb24gICAJKDk4MSwgMTkzNykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMzAyMDciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU5IiBAMTMwNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzAzDQotCQkJCQlsb2NhdGlvbiAgIAkoNjc3LCAtNzkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjQwMTkwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoOTgxLCAxOTM3KQ0KLQkJCQkJICAgICgxMDQxLCAxOTM3KQ0KLQkJCQkJICAgICgxMDQxLCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTgxLCAxOTM3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNDEsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWluRXhjbHVzaXZlRmFjZXQiIEAxMzA1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMDMNCi0JCQkJCWxvY2F0aW9uICAgCSg2NzcsIC03OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMDYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIzLCAxOTAwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM3Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkV4Y2x1c2l2ZUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzQxMjUzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNDAxOUEiDQotCQkJCQljbGllbnQgICAgIAlAMTMwMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjQNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTgxLCAxOTM3KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxOCwgMTkzNykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTg5LCAxODk3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ2NjUyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDENCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2MCIgQDEzMDgNCi0JCQkJbG9jYXRpb24gICAJKDE0NjksIDE5NTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjYwMjhEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2MSIgQDEzMDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMwOA0KLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgLTk1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIxNyINCi0JCQkJCWNsaWVudCAgICAgCUAxMzA4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0NjksIDE5NTMpDQotCQkJCQkgICAgKDE0MDAsIDE5NTMpDQotCQkJCQkgICAgKDE0MDAsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY5LCAxOTUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDAsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RXhjbHVzaXZlRmFjZXQiIEAxMzEwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMDgNCi0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NiwgMTkxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhFeGNsdXNpdmVGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI5ODA5Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjcwMjIxIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMDgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY1DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NCwgMTk1MykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk2MSwgMTkxMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyNzIzNg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjIiIEAxMzEzDQotCQkJCWxvY2F0aW9uICAgCSgxMTIyLCAyMTgwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDA1MSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjMiIEAxMzE0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMzE4LCA2MjgpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkMwMjQ2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzMTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIxODApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJsZW5ndGhGYWNldCIgQDEzMTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMxMw0KLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMTYNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA0LCAyMjA0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2xlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDc1NDcyDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNTAiDQotCQkJCQljbGllbnQgICAgIAlAMTMxMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTIyLCAyMTgwKQ0KLQkJCQkJICAgICgxMTIyLCAyMjQwKQ0KLQkJCQkJICAgICgzODcsIDIyNDApKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM4NywgMjI0MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMTcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcxLCAyMjA0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk1NTk3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2NiIgQDEzMTgNCi0JCQkJbG9jYXRpb24gICAJKDEwODQsIDE5ODkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzIwMjFEIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2NyIgQDEzMTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMxOA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMzgwLCA0MzcpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzMwMEFCIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDE5ODkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NCwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbnVtZXJhdGlvbkZhY2V0cyIgQDEzMjANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMxOA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMzgwLCA0MzcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzIxDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzNywgMjAxNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbnVtZXJhdGlvbkZhY2V0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NTg1Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzMwMEFDIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTA4NCwgMTk4OSkNCi0JCQkJCSAgICAoMTA4NCwgMjA0OSkNCi0JCQkJCSAgICAoNDg1LCAyMDQ5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMTk4OSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODUsIDIwNDkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzIyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4MywgMjAyMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1MTI5MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI5DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjgiIEAxMzIzDQotCQkJCWxvY2F0aW9uICAgCSgxNDUxLCAyMDc0KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEM1MDE1OSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjkiIEAxMzI0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCMCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzIzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE0NTEsIDIwNzQpDQotCQkJCQkgICAgKDEzNjIsIDIwNzQpDQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDUxLCAyMDc0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGF0dGVybkZhY2V0cyIgQDEzMjUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMyMw0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTI1LCA1MzgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjAsIDIwMzgpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGF0dGVybkZhY2V0cyINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM2NzIyMw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzYwMEJBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzMjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjczDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE4NywgMjA3NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3MiwgMjAzNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwODY0OQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzAiIEAxMzI4DQotCQkJCWxvY2F0aW9uICAgCSgxODI3LCAxNDAwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEM4MDJBNyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzEiIEAxMzI5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE0OSwgLTQ3MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDOTAxRUEiDQotCQkJCQljbGllbnQgICAgIAlAMTMyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNywgMTQwMCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxNDAwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNhcmRpbmFsaXR5RmFjZXQiIEAxMzMwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE0OSwgLTQ3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg0NywgMTM1OCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitjYXJkaW5hbGl0eUZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDcxNzMwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDOTAxRjUiDQotCQkJCQljbGllbnQgICAgIAlAMTMyOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNywgMTQwMCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCAxNDAwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgzLCAxMzU3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzNDI2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4MCIgQDEzMzMNCi0JCQkJbG9jYXRpb24gICAJKDEyNjIsIDI0MTMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREIwMzc3Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4MSIgQDEzMzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzMw0KLQkJCQkJbG9jYXRpb24gICAJKC03ODYsIDMwMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQzAzNUEiDQotCQkJCQljbGllbnQgICAgIAlAMTMzMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQxMykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYyLCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxMzM1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzMNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzg2LCAzMDEpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzM2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzM1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDgsIDI1NTYpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZnJhY3Rpb25EaWdpdHNGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzNzM5Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREMwMzY0Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzMzMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjcyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTI2MiwgMjQxMykNCi0JCQkJCSAgICAoMTI2MiwgMjU5NikNCi0JCQkJCSAgICAoMjA2NSwgMjU5NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0MTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA2NSwgMjU5NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3OSwgMjU1NikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzg4Ng0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODQiIEAxMzM4DQotCQkJCWxvY2F0aW9uICAgCSgxODQxLCAxMzA2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEUzMDBEOSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODUiIEAxMzM5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTEzNSwgLTc5MCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBFNDAzOEUiDQotCQkJCQljbGllbnQgICAgIAlAMTMzOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg0MSwgMTMwNikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxMzA2KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJvdW5kZWRGYWNldCIgQDEzNDANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzOA0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODMyLCAxMjcwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2JvdW5kZWRGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMzE3NDYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM5OCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzM4DQotCQkJCQlzdXBwbGllciAgIAlAMTI2Nw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODQxLCAxMzA2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTQsIDEzMDYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzcsIDEyNzUpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTQ3MTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY0IiBAMTM0Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjE4NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCRjAxOEMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY1IiBAMTM0NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTY0MCwgNjM0KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMwMDA2QiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMTg2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAid2hpdGVTcGFjZUZhY2V0IiBAMTM0NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTY0MCwgNjM0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjczLCAyMjA3KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3doaXRlU3BhY2VGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5MDkwOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzAwMDc1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNDMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjcxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTMyOCwgMjE4NikNCi0JCQkJCSAgICAoMTMyOCwgMjI0NikNCi0JCQkJCSAgICAoMjA5MywgMjI0NikpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIxODYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgMjI0NikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAzMywgMjIwMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNjc2Mw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODIiIEAxMzQ4DQotCQkJCWxvY2F0aW9uICAgCSg2NzQsIDEzOTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwMDQ4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4MyIgQDEzNDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xODU0LCAtNzA2KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERGMDNCOSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzQ4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzQsIDEzOTApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMzkwKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm9yZGVyZWRGYWNldCIgQDEzNTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0OA0KLQkJCQkJbG9jYXRpb24gICAJKC0xODU0LCAtNzA2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTgsIDEzNTMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JkZXJlZEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYxNTM4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQzMiDQotCQkJCQljbGllbnQgICAgIAlAMTM0OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNjgNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjc0LCAxMzkwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxNCwgMTM5MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTEwLCAxMzU1KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM0NjE1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3MiIgQDEzNTMNCi0JCQkJbG9jYXRpb24gICAJKDY4NywgMTI5NikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDQjAzOUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjczIiBAMTM1NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzUzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MDksIC01NzYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0MwM0QwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4NywgMTI5NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzUsIDEyOTYpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibnVtZXJpY0ZhY2V0IiBAMTM1NQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzUzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MDksIC01NzYpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzU2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzU1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2OCwgMTI1NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitudW1lcmljRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODA5NzINCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMENDMDNEMSINCi0JCQkJCWNsaWVudCAgICAgCUAxMzUzDQotCQkJCQlzdXBwbGllciAgIAlAMTI2OQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODcsIDEyOTYpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQwLCAxMjk2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Nw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MDYsIDEyNjApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY4NDINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg2IiBAMTM1OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTY4OSwgMTY2MikNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NDAxRUMiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjg3IiBAMTM1OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NTAzNjAiDQotCQkJCQljbGllbnQgICAgIAlAMTM1OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNjg5LCAxNjYyKQ0KLQkJCQkJICAgICgxNDg3LCAxNjYyKQ0KLQkJCQkJICAgICgxNDg3LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY4OSwgMTY2MikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1heEZhY2V0IiBAMTM2MA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2OSwgMTYyMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNYXhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4MjA1MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDUwMzZBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjcwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2ODksIDE2NjIpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNiwgMTY2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA0NCwgMTYyNykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNTM4NQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM2DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODgiIEAxMzYzDQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMjU4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCNTRGMDE0NSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODkiIEAxMzY0DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTQ2MikNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU1MDAzOEMiDQotCQkJCQljbGllbnQgICAgIAlAMTM2Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjI1OCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIgQDEzNjUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM2Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtNDYyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg1LCAyMjg4KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5Mg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwODU0MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NTAwMzk2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzNjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjcxDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTMyOCwgMjI1OCkNCi0JCQkJCSAgICAoMTMyOCwgMjMyNCkNCi0JCQkJCSAgICAoMjA5MywgMjMyNCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIyNTgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgMjMyNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjUNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwOSwgMjI5MykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODgxNw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMyDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTAiIEAxMzY4DQotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzY2KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCNUM0MDExQyINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTEiIEAxMzY5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjgNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjA3LCAtNzIyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNUM1MDIwRCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzY4DQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzY2KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiIEAxMzcwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjgNCi0JCQkJCWxvY2F0aW9uICAgCSgtNjA3LCAtNzIyKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3MQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjU3LCAyNDYzKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTQ4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1heExlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTI2OTA2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMTciDQotCQkJCQljbGllbnQgICAgIAlAMTM2OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjk3LCAyMzY2KQ0KLQkJCQkJICAgICgxMjk3LCAyNDk5KQ0KLQkJCQkJICAgICgyMTAyLCAyNDk5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAyLCAyNDk5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3Mg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3MA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA3LCAyNDcxKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MzA4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5MiIgQDEzNzMNCi0JCQkJbG9jYXRpb24gICAJKDEyNjIsIDI0NDkpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2MkEwMEFBIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5MyIgQDEzNzQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTcwLCAtODE1KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNjJCMDEzOCINCi0JCQkJCWNsaWVudCAgICAgCUAxMzczDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjIsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCIgQDEzNzUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3Mw0KLQkJCQkJbG9jYXRpb24gICAJKC0xMTcwLCAtODE1KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQwLCAyNjM0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODUzMTUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNjJCMDE0MiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzczDQotCQkJCQlzdXBwbGllciAgIAlAMTI3Mg0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDEyNjIsIDI0NDkpDQotCQkJCQkgICAgKDEyNjIsIDI2NjgpDQotCQkJCQkgICAgKDIwNjUsIDI2NjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDQ5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjUsIDI2NjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzc1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODksIDI2MjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY0ODUNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk0IiBAMTM3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQyMiwgMjE1OSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMDAzQTYiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk1IiBAMTM3OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjEwMzExIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzNzgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTQyMiwgMjE1OSkNCi0JCQkJCSAgICAoMTM2MiwgMjE1OSkNCi0JCQkJCSAgICAoMTM2MiwgMTQyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjIsIDIxNTkpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiIEAxMzgwDQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzgNCi0JCQkJCWxvY2F0aW9uICAgCSgtNzcwLCAtMTMxMykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyNywgMjEyNSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTkwOTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMiINCi0JCQkJCWNsaWVudCAgICAgCUAxMzc4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3Mw0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxODcsIDIxNTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDIsIDIxMTkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODkyMjYNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk2IiBAMTM4Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4NCwgMjA4MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQTAyNkIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk3IiBAMTM4NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzgzDQotCQkJCQlsb2NhdGlvbiAgIAkoODI4LCAtMTM3MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQjAxODYiDQotCQkJCQljbGllbnQgICAgIAlAMTM4Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMjA4MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg0LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiIEAxMzg1DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODMNCi0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4Ng0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4NQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDIxMDEpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTA0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4ODYxOQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTkwIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzODMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc0DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTA4NCwgMjA4MykNCi0JCQkJCSAgICAoMTA4NCwgMjE0MykNCi0JCQkJCSAgICAoNDg1LCAyMTQzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMjA4MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODUsIDIxNDMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzg1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzMSwgMjEwMCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkzMTcxNQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDIiIEAxMzg4DQotCQkJCWxvY2F0aW9uICAgCSgxMTIyLCAyMjQxKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCOERDMDA1MiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDMiIEAxMzg5DQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODgNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0I5Ig0KLQkJCQkJY2xpZW50ICAgICAJQDEzODgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIyNDEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMiwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVMZW5ndGhGYWNldCIgQDEzOTANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM4OA0KLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTQ3OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAyMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTM5Ng0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUxlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxNzMxDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAzQzMiDQotCQkJCQljbGllbnQgICAgIAlAMTM4OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzUNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMTIyLCAyMjQxKQ0KLQkJCQkJICAgICgxMTIyLCAyMzE4KQ0KLQkJCQkJICAgICgzODcsIDIzMTgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMjQxKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM4NywgMjMxOCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcwLCAyMjc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4NTY3DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1MCIgQDEzOTMNCi0JCQkJbG9jYXRpb24gICAJKDc3MywgMTU2NSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4NTAyNUIiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUxIiBAMTM5NA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzkzDQotCQkJCQlsb2NhdGlvbiAgIAkoNDY5LCAxMykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4NjAyNzAiDQotCQkJCQljbGllbnQgICAgIAlAMTM5Mw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg3NzMsIDE1NjUpDQotCQkJCQkgICAgKDk1OSwgMTU2NSkNCi0JCQkJCSAgICAoOTU5LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAxNTY1KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5GYWNldCIgQDEzOTUNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5Mw0KLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzk2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1MywgMTUzMikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTINCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5GYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MzA5MQ0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjdBIg0KLQkJCQkJY2xpZW50ICAgICAJQDEzOTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc2DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDE1NjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzk3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzk1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzNCwgMTUyMykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0NjY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDQiIEAxMzk4DQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDE2NTApDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzAwMURCIg0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNSIgQDEzOTkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5OA0KLQkJCQkJbG9jYXRpb24gICAJKDQ5NiwgLTMzNCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjk3MTAwQ0YiDQotCQkJCQljbGllbnQgICAgIAlAMTM5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICg4MTYsIDE2NTApDQotCQkJCQkgICAgKDk1OSwgMTY1MCkNCi0JCQkJCSAgICAoOTU5LCAxNDI4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODE2LCAxNjUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNaW5GYWNldCIgQDE0MDANCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5OA0KLQkJCQkJbG9jYXRpb24gICAJKDQ5NiwgLTMzNCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDENCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY0LCAxNjE0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1pbkZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTQxNjE4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjk3MTAwRDkiDQotCQkJCQljbGllbnQgICAgIAlAMTM5OA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzYNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODE2LCAxNjUwKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTY1MCkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDINCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDANCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAxNjA2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAyNzQwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3NCIgQDE0MDMNCi0JCQkJbG9jYXRpb24gICAJKDEyOTcsIDIzMjEpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0YwMTk5Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3NSIgQDE0MDQNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwMw0KLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEMjAwODUiDQotCQkJCQljbGllbnQgICAgIAlAMTQwMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjMyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk3LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heExlbmd0aEZhY2V0IiBAMTQwNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDAzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTcxOSwgNDk3KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjMwLCAyMzgwKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heExlbmd0aEZhY2V0Ig0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyMjU1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEMjAwOEYiDQotCQkJCQljbGllbnQgICAgIAlAMTQwMw0KLQkJCQkJc3VwcGxpZXIgICAJQDEyNzcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxMjk3LCAyMzIxKQ0KLQkJCQkJICAgICgxMjk3LCAyNDA5KQ0KLQkJCQkJICAgICgyMTAyLCAyNDA5KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjMyMSkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAyLCAyNDA5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwNw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTk0LCAyMzY2KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc5MjA4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3NiIgQDE0MDgNCi0JCQkJbG9jYXRpb24gICAJKDExNTksIDIyNzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDUwMEM1Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3NyIgQDE0MDkNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwOA0KLQkJCQkJbG9jYXRpb24gICAJKC0yODEsIDQ0OSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENjAwMUQiDQotCQkJCQljbGllbnQgICAgIAlAMTQwOA0KLQkJCQkJc3VwcGxpZXIgICAJQDEyODINCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE1OSwgMjI3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTU5LCAxNDI4KSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkxlbmd0aEZhY2V0IiBAMTQxMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA4DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4MSwgNDQ5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTcsIDIzNzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluTGVuZ3RoRmFjZXQiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTk1MjcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ2MDAyNyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDA4DQotCQkJCQlzdXBwbGllciAgIAlAMTI3OA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDExNTksIDIyNzMpDQotCQkJCQkgICAgKDExNTksIDI0MDkpDQotCQkJCQkgICAgKDQ1MCwgMjQwOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNTksIDIyNzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCAyNDA5KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxMg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjMsIDIzNjkpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM2MTANCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQ0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAwIiBAMTQxMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgMjMzNCkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5ODAxNkQiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAxIiBAMTQxNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEzDQotCQkJCQlsb2NhdGlvbiAgIAkoOTQxLCAtNjEwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODk5MDA1NiINCi0JCQkJCWNsaWVudCAgICAgCUAxNDEzDQotCQkJCQlzdXBwbGllciAgIAlAMTI4Mg0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAyMzM0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDE0MjgpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiIEAxNDE1DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTMNCi0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDE2DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NiwgMjQ1NCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NjgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1MjYwNA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDYwIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MTMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTE5NywgMjMzNCkNCi0JCQkJCSAgICAoMTE5NywgMjQ5MykNCi0JCQkJCSAgICAoNDUwLCAyNDkzKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0OTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDE3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDE1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyNywgMjQ1MSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNjA0Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTQzDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTgiIEAxNDE4DQotCQkJCWxvY2F0aW9uICAgCSgxMjMxLCAyNDM4KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCODQwMDA2MiINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTkiIEAxNDE5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTgNCi0JCQkJCWxvY2F0aW9uICAgCSg4NjMsIC03NDYpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDEwMDFEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDI0MzgpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IiBAMTQyMA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDE4DQotCQkJCQlsb2NhdGlvbiAgIAkoODYzLCAtNzQ2KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyMQ0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyMA0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDI2MzIpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NzAzMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDEwMDI3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MTgNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIzMSwgMjQzOCkNCi0JCQkJCSAgICAoMTIzMSwgMjY2OCkNCi0JCQkJCSAgICAoNDUxLCAyNjY4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjQzOCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDI2NjgpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDIwDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzNCwgMjYzMSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxODgxMg0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzgiIEAxNDIzDQotCQkJCWxvY2F0aW9uICAgCSgxMjMxLCAyMzk3KQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDBERSINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzkiIEAxNDI0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjMNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjA5LCAyNTMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwM0NEIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDIzOTcpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMSwgMTQyOCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0b3RhbERpZ2l0c0ZhY2V0IiBAMTQyNQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDIzDQotCQkJCQlsb2NhdGlvbiAgIAkoLTIwOSwgMjUzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyNg0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyNQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTMsIDI1NTApDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyDQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdG90YWxEaWdpdHNGYWNldCINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4NTU2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTM4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwM0Q3Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MjMNCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc5DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTIzMSwgMjM5NykNCi0JCQkJCSAgICAoMTIzMSwgMjU4NykNCi0JCQkJCSAgICAoNDUxLCAyNTg3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjM5NykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDI1ODcpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI3DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDI1DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzNSwgMjU2MCkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNDY0Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTI4DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpDQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDE0MjgNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCA3NjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkNCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyOA0KLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTksIDU3NCkNCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYNCi0JCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiDQotCQkJCXdpZHRoICAgICAgCTQ0NA0KLQkJCQloZWlnaHQgICAgIAk0MTMNCi0JCQkJYW5ub3RhdGlvbiAJOA0KLQkJCQlhdXRvUmVzaXplIAlUUlVFKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTQyOQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTIwOSwgMTA2NSkNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgxMjA5LCAxMDY1KQ0KLQkJCQkgICAgKDEyMDksIDk3NCkpKQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM0IiBAMTQzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA5MCwgMTAzMSkNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODBGNTAzRDkiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGVEZWZpbml0aW9uIiBAMTQzMQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDMwDQotCQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAtMjUpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDMxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg5NywgMTAzNikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZURlZmluaXRpb24iDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDk4NzY1DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTk0DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjkwMDNDIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MzANCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTAsIDEwMzEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5MCwgOTc0KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzMw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzMQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTIxLCAxMDM0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2MTcyOA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM1IiBAMTQzNA0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDMwDQotCQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAtMjUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjkwMDQ2Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0MzANCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgwDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTAsIDEwMzEpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5MCwgMTA4OCkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0MCIgQDE0MzUNCi0JCQkJbG9jYXRpb24gICAJKDE1MzgsIDg3MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZEQjAxRTUiDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGUiIEAxNDM2DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzUNCi0JCQkJCWxvY2F0aW9uICAgCSgxNzgsIDEwNSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OCwgNzkyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjc2MDg3MA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTIwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE2REQwM0REIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MzUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzOCwgODczKQ0KLQkJCQkJICAgICgxNTM4LCA5MTkpDQotCQkJCQkgICAgKDE0NTQsIDkxOSkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA5MTkpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDM4DQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDM2DQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MDksIDg3NSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAxNjY2Nw0KLQkJCQkJICAgIGhlaWdodCAgICAgCTMwDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQxIiBAMTQzOQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM1DQotCQkJCQlsb2NhdGlvbiAgIAkoMTc4LCAxMDUpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE2REQwM0RFIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0MzUNCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJCSAgICAoMTUzOCwgODczKQ0KLQkJCQkJICAgICgxNTM4LCA4MjgpDQotCQkJCQkgICAgKDE0NTQsIDgyOCkpDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA4MjgpKSkpDQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDIiIEAxNDQwDQotCQkJCWxvY2F0aW9uICAgCSgxNTM1LCA2ODQpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTIwMTA4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlIiBAMTQ0MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQwDQotCQkJCQlsb2NhdGlvbiAgIAkoMTc1LCAtODQpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTksIDU5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS45NzcyNzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNA0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzE0MDE1MSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDQwDQotCQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE1MzUsIDY4NCkNCi0JCQkJCSAgICAoMTUzNSwgNzI4KQ0KLQkJCQkJICAgICgxNDU0LCA3MjgpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM1LCA2ODQpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgNzI4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0Mw0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MQ0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTA2LCA2ODMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMg0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI3Nzc4DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDMiIEAxNDQ0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDANCi0JCQkJCWxvY2F0aW9uICAgCSgxNzUsIC04NCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxNDAxNUIiDQotCQkJCQljbGllbnQgICAgIAlAMTQ0MA0KLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTM1LCA2ODQpDQotCQkJCQkgICAgKDE1MzUsIDY0MSkNCi0JCQkJCSAgICAoMTQ1NCwgNjQxKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzNSwgNjg0KQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDY0MSkpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0NiIgQDE0NDUNCi0JCQkJbG9jYXRpb24gICAJKDYxMywgOTQwKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBN0VEMDNDMCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb21wbGV4VHlwZSIgQDE0NDYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0NQ0KLQkJCQkJbG9jYXRpb24gICAJKC03NDcsIDE3MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDY1LCA5ODMpDQotCQkJCQkgICAgYW5jaG9yICAgICAJMQ0KLQkJCQkJICAgIGFuY2hvcl9sb2MgCTENCi0JCQkJCSAgICBubGluZXMgICAgIAkxDQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29tcGxleFR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzMwNTcNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mw0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBN0Y0MDExNyINCi0JCQkJCWNsaWVudCAgICAgCUAxNDQ1DQotCQkJCQlzdXBwbGllciAgIAlAMTI4MQ0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDYxMywgOTQwKQ0KLQkJCQkJICAgICgyODQsIDk0MCkNCi0JCQkJCSAgICAoMjg0LCAxMDA4KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg0LCAxMDA4KQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0OA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0Ng0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDk3MikNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwOTMyMA0KLQkJCQkJICAgIGhlaWdodCAgICAgCTYxDQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQ0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQ3IiBAMTQ0OQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQ1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTc0NywgMTcyKQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBN0Y0MDEyMSINCi0JCQkJCWNsaWVudCAgICAgCUAxNDQ1DQotCQkJCQlzdXBwbGllciAgIAlAMTQyOA0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MTMsIDk0MCkNCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEwLCA5NDApKSkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NTANCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiDQotCQkJCWNsaWVudCAgICAgCUAxNDI4DQotCQkJCXN1cHBsaWVyICAgCUAxMjU4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTEyLCA1NjIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTEyLCA1MTApDQotCQkJCWRyYXdTdXBwbGllciAJQDEyNTkpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NTENCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiDQotCQkJCWNsaWVudCAgICAgCUAxMjgwDQotCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDg4KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE0NiwgMTA2NSkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQyOSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0NCIgQDE0NTINCi0JCQkJbG9jYXRpb24gICAJKDEzNjIsIDExMzMpDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3NEIwMTc4Ig0KLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNpbXBsZVR5cGUiIEAxNDUzDQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTINCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU4LCAtMTYzKQ0KLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1NA0KLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1Mw0KLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDk5LCAxMDk0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MA0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NpbXBsZVR5cGUiDQotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjQ2NzUzDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM3DQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3NEQwMTdCIg0KLQkJCQkJY2xpZW50ICAgICAJQDE0NTINCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyDQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjIsIDExMzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgMTI5MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTUNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTMNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyMSwgMTA5NykNCi0JCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQ0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMjcyNzMNCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0Mg0KLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkNCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NSIgQDE0NTYNCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1Mg0KLQkJCQkJbG9jYXRpb24gICAJKC0xNTgsIC0xNjMpDQotCQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3NEQwMTg1Ig0KLQkJCQkJY2xpZW50ICAgICAJQDE0NTINCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4DQotCQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjIsIDExMzMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgOTc0KSkpKQ0KLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDE0NTcNCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgMzg0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpDQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDAyLCAzMDMpDQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwDQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpDQotCQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4DQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiDQotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTcNCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDAyLCAzNjMpDQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJCWl0YWxpY3MgICAgCVRSVUUpDQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJCSAgICBhbmNob3IgICAgIAkyDQotCQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDgNCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50DQotCQkJCQkiKyBnbG9iYWwgOiBib29sZWFuIg0KLQkJCQkJIisgZmVhdHVyZVJlZmVyZW5jZSA6IGJvb2xlYW4iKSkNCi0JCQkJd2lkdGggICAgICAJNTU4DQotCQkJCWhlaWdodCAgICAgCTE4Ng0KLQkJCQlhbm5vdGF0aW9uIAk4DQotCQkJCWF1dG9SZXNpemUgCVRSVUUpDQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNDU4DQotCQkJCWxvY2F0aW9uICAgCSgyMjYyLCA1NjgpDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkJc3VwcGxpZXIgICAJQDE0NTcNCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSAgICAoMjI2MiwgNTY4KQ0KLQkJCQkgICAgKDIyNjIsIDQ3NykpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDU5DQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIg0KLQkJCQljbGllbnQgICAgIAlAMTI1NA0KLQkJCQlzdXBwbGllciAgIAlAMTQ1Nw0KLQkJCQlsaW5lX3N0eWxlIAkzDQotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTk1KQ0KLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM0NiwgNTY4KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDU4KQ0KLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM4IiBAMTQ2MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU1MywgNDUzKQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNDMjhBMEYyMDFBNCINCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlIiBAMTQ2MQ0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDYwDQotCQkJCQlsb2NhdGlvbiAgIAkoODAxLCAyOTMpDQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYyDQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYxDQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMzEsIDQ5OSkNCi0JCQkJCSAgICBhbmNob3IgICAgIAkxDQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQ0KLQkJCQkJICAgIG5saW5lcyAgICAgCTENCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgNCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA2MjY2DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRTUiDQotCQkJCQljbGllbnQgICAgIAlAMTQ2MA0KLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxNTUzLCA0NTMpDQotCQkJCQkgICAgKDEyMjIsIDQ1MykNCi0JCQkJCSAgICAoMTIyMiwgNTYyKSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU1MywgNDUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMjIsIDU2MikNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjMNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjENCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE4NSwgNDc5KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODEyMDMwDQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzkiIEAxNDY0DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjANCi0JCQkJCWxvY2F0aW9uICAgCSg4MDEsIDI5MykNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRjAiDQotCQkJCQljbGllbnQgICAgIAlAMTQ2MA0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NTcNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU1MywgNDUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDQ1MykpKSkNCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMCIgQDE0NjUNCi0JCQkJbG9jYXRpb24gICAJKDE5MDgsIDM1MykNCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwNjAyRDciDQotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRGZWF0dXJlIiBAMTQ2Ng0KLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY1DQotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjcNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyOSwgMzUyKQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTENCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMg0KLQkJCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkRmVhdHVyZSINCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjk0MTINCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxODANCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkNCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMEUiDQotCQkJCQljbGllbnQgICAgIAlAMTQ2NQ0KLQkJCQkJc3VwcGxpZXIgICAJQDE0NTcNCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkJICAgICgxOTA4LCAzNTMpDQotCQkJCQkgICAgKDE5MDgsIDM4NykNCi0JCQkJCSAgICAoMTk5MywgMzg3KSkNCi0JCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkwOCwgMzUzKQ0KLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDM4NykNCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjgNCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjYNCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk0NSwgMzU0KQ0KLQkJCQkJICAgIGFuY2hvciAgICAgCTINCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxDQotCQkJCQkgICAgbmxpbmVzICAgICAJMQ0KLQkJCQkJICAgIG1heF93aWR0aCAgCTE1DQotCQkJCQkgICAganVzdGlmeSAgICAJMA0KLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIg0KLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk2NjM5DQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQNCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpDQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzEiIEAxNDY5DQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjUNCi0JCQkJCWxvY2F0aW9uICAgCSgtMjY4LCAtMTU5KQ0KLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQkJcXVpZHUgICAgICAJIjNDMjkwMTBCMDAxOCINCi0JCQkJCWNsaWVudCAgICAgCUAxNDY1DQotCQkJCQlzdXBwbGllciAgIAlAMTQ1Nw0KLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCQkgICAgKDE5MDgsIDM1MykNCi0JCQkJCSAgICAoMTkwOCwgMzE5KQ0KLQkJCQkJICAgICgxOTkzLCAzMTkpKQ0KLQkJCQkJbGluZV9zdHlsZSAJMw0KLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTA4LCAzNTMpDQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5MywgMzE5KSkpKQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDcwDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIg0KLQkJCQljbGllbnQgICAgIAlAMTI1OA0KLQkJCQlzdXBwbGllciAgIAlAMTI1Nw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICg0OTQsIDI4NCkNCi0JCQkJICAgICg0OTQsIDI0NCkNCi0JCQkJICAgICg5OTYsIDI0NCkpDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDI4NCkNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NiwgMjQ0KSkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3MQ0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCN0RDMDE5MyINCi0JCQkJY2xpZW50ICAgICAJQDEyNDUNCi0JCQkJc3VwcGxpZXIgICAJQDE0NTcNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MTgsIDgxMikNCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MTgsIDU2OCkNCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ1OCkNCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3Mg0KLQkJCQlzdGVyZW90eXBlIAlUUlVFDQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiINCi0JCQkJY2xpZW50ICAgICAJQDEyODINCi0JCQkJc3VwcGxpZXIgICAJQDE0MjgNCi0JCQkJbGluZV9zdHlsZSAJMw0KLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjUsIDEyOTIpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjY1LCAxMDY1KQ0KLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDI5KQ0KLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDczDQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3Ig0KLQkJCQljbGllbnQgICAgIAlAMTQ1Nw0KLQkJCQlzdXBwbGllciAgIAlAMTI1Nw0KLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJICAgICgyMTQ3LCAyOTEpDQotCQkJCSAgICAoMjE0NywgMjQ0KQ0KLQkJCQkgICAgKDE0NjgsIDI0NCkpDQotCQkJCWxpbmVfc3R5bGUgCTMNCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTQ3LCAyOTEpDQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAyNDQpKSkpKSkpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDc2Ig0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp3c2RsIiBAMTQ3NA0KLQkJCWxvY2F0aW9uICAgCSgyNzIsIDI1NikNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzQNCi0JCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTcyKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJ3c2RsIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiM0FERkI4RTUwMjFFIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojpzb2FwIiBAMTQ3NQ0KLQkJCWxvY2F0aW9uICAgCSg3MDQsIDI1NikNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzUNCi0JCQkgICAgbG9jYXRpb24gICAJKDU2MCwgMTcyKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJzb2FwIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiM0EwMUNGMEMwMUEyIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp4c2QiIEAxNDc2DQotCQkJbG9jYXRpb24gICAJKDExNTIsIDI1NikNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzYNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwMDgsIDE3MikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkieHNkIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzlBQkRDNkYwMUFBIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpDQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciDQotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjUiDQotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNzciDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzDQotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjYiDQotCVByb2NzTkRldnMgCShsaXN0DQotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3Ig0KLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2OCINCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcw0KLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlIg0KLQkJCXZhbHVlICAgICAgCSgiRGF0YUJhc2VTZXQiIDgwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJBTlNJIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJPcmFjbGUiDQotCQkJCXZhbHVlICAgICAgCTgwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIlNRTFNlcnZlciINCi0JCQkJdmFsdWUgICAgICAJODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiU3liYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJXYXRjb20iDQotCQkJCXZhbHVlICAgICAgCTgwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIklkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWUiDQotCQkJdmFsdWUgICAgICAJIlZfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVF8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdFN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiX1YiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkJhc2VWaWV3cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIlZBUkNIQVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNPSyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMRWxlbWVudCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMU3BlY2lmaWNhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJJRExTcGVjU2V0IiAyMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExTcGVjU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJUeXBlZGVmIg0KLQkJCQl2YWx1ZSAgICAgIAk1NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTcxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiRXhjZXB0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk2MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlN0cnVjdCINCi0JCQkJdmFsdWUgICAgICAJNTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJVbmlvbiINCi0JCQkJdmFsdWUgICAgICAJODEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuYmluZGluZy5zb2FwL3NyYy9yb3NlL3NvYXBiaW5kaW5nTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUlETE1vZHVsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuYmluZGluZy5zb2FwL3NyYy9yb3NlL3NvYXBiaW5kaW5nTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiUmFpc2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkSGFzUmVsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkhhc1JlbFR5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVByZWZpeGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIm1fIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJzXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJ2b2lkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSb290RGlyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkF1dG9TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNob3dDb2RlZ2VuRGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0VmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFNpbmNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNYXhOdW1DaGFycyINCi0JCQl2YWx1ZSAgICAgIAk4MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZNIg0KLQkJCXZhbHVlICAgICAgCSgiVk1UeXBlIiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTVR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN1biINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk1pY3Jvc29mdCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIklCTSINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHbG9iYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VDbGFzc1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVNwYWNlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyINCi0JCQl2YWx1ZSAgICAgIAkzKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXN0ZXJpc2tDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jQXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEltcG9ydHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIl9JRCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIg0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTkwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTE5MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiDQotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQUZURVIiDQotCQkJCXZhbHVlICAgICAgCTE4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiDQotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUk9XIg0KLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCINCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIjYiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJlcG9zaXRvcnkiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5Ig0KLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuc29hcC9zcmMvcm9zZS9zb2FwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSJBTUlSIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLnNvYXAvc3JjL3Jvc2Uvc29hcGJpbmRpbmdNZGwubWRsLCBjdGMsIGlibWN0YyIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJhaXNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiDQotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kZW50Ig0KLQkJCXZhbHVlICAgICAgCTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNDbGFzc1R5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNDbGFzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluY3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0ZJRUxEX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSgiT0xFRmFjdG9yeVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNsYXNzSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVUeXBlTGliIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1pbm9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcGF0Y2hNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoRGVmVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW50ZXJmYWNlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlByb3BOb3RpZnlTaW5rcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25Qb2ludElJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ29tbWFuZHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBVExfRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uUG9pbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlzcGF0Y2hfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAk1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0ZF9PTEVfTWV0aG9kIg0KLQkJCQl2YWx1ZSAgICAgIAk2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIg0KLQkJCQl2YWx1ZSAgICAgIAk3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9TZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlNDQyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlR5cGVMaWJJbXBvcnRlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0YWJsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiDQotCQkJCXZhbHVlICAgICAgCTIxMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiMCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGFibGUiDQotCQkJdmFsdWUgICAgICAJKCJDcmVhdGFibGVTZXQiIDIyMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluaXRpYWxpemF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUZXJtaW5hdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25DbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiQ29sbGVjdGlvbiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiVGV4dCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRvcGVyYXRpb24iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTYyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSMkVkaXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJvc2UgV2ViIFB1Ymxpc2hlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZlcnNpb24gQ29udHJvbCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpKQ0KLQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDY3IikpDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1YjM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQ1MGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTExMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzaS51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWRjZmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gd3NpdWkuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCi1zb3VyY2Uud3NpdWkuamFyID0gc3JjLwotamFycy5jb21waWxlLm9yZGVyID0gd3NpdWkuamFyCi1vdXRwdXQud3NpdWkuamFyID0gYmluLwotc3JjLmluY2x1ZGVzID0gaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvYnVpbGQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5N2QwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud3NpLnVpIiBkZWZhdWx0PSJidWlsZC5qYXJzIiBiYXNlZGlyPSIuIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJiYXNld3MiIHZhbHVlPSIke3dzfSIvPgotCTxwcm9wZXJ0eSBuYW1lPSJiYXNlb3MiIHZhbHVlPSIke29zfSIvPgotCTxwcm9wZXJ0eSBuYW1lPSJiYXNlYXJjaCIgdmFsdWU9IiR7YXJjaH0iLz4KLQk8cHJvcGVydHkgbmFtZT0iYmFzZW5sIiB2YWx1ZT0iJHtubH0iLz4KLQotCTwhLS0gQ29tcGlsZXIgc2V0dGluZ3MuIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJqYXZhY0ZhaWxPbkVycm9yIiB2YWx1ZT0iZmFsc2UiLz4KLQk8cHJvcGVydHkgbmFtZT0iamF2YWNEZWJ1Z0luZm8iIHZhbHVlPSJvbiIvPgotCTxwcm9wZXJ0eSBuYW1lPSJqYXZhY1ZlcmJvc2UiIHZhbHVlPSJ0cnVlIi8+Ci0JPHByb3BlcnR5IG5hbWU9ImphdmFjU291cmNlIiB2YWx1ZT0iMS4zIi8+Ci0JPHByb3BlcnR5IG5hbWU9ImphdmFjVGFyZ2V0IiB2YWx1ZT0iMS4yIi8+Ci0JPHByb3BlcnR5IG5hbWU9ImNvbXBpbGVyQXJnIiB2YWx1ZT0iIi8+Ci0JPHBhdGggaWQ9InBhdGhfYm9vdGNsYXNzcGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHtqYXZhLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotCQk8L2ZpbGVzZXQ+Ci0JPC9wYXRoPgotCTxwcm9wZXJ0eSBuYW1lPSJib290Y2xhc3NwYXRoIiByZWZpZD0icGF0aF9ib290Y2xhc3NwYXRoIi8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnRpZXMiPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJwbHVnaW5UZW1wIiB2YWx1ZT0iJHtidWlsZFRlbXBGb2xkZXJ9L3BsdWdpbnMiPgotCQkJPGlzc2V0IHByb3BlcnR5PSJidWlsZFRlbXBGb2xkZXIiLz4KLQkJPC9jb25kaXRpb24+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5UZW1wIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtwbHVnaW5UZW1wfS9vcmcuZWNsaXBzZS53c3Qud3NpLnVpIj4KLQkJCTxpc3NldCBwcm9wZXJ0eT0iYnVpbGRUZW1wRm9sZGVyIi8+Ci0JCTwvY29uZGl0aW9uPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQucmVzdWx0LmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRlbXAuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfS90ZW1wLmZvbGRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLmRlc3RpbmF0aW9uIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQudXBkYXRlLmphciIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IkJ1aWxkIHRoZSBwbHVnLWluOiBvcmcuZWNsaXBzZS53c3Qud3NpLnVpIGZvciBhbiB1cGRhdGUgc2l0ZS4iPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC5qYXJzIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS8iLz4KLQkJPC9hbnRjYWxsPgotCQk8emlwIGRlc3RmaWxlPSIke3BsdWdpbi5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2Uud3N0LndzaS51aV8xLjAuMC5qYXIiIGJhc2VkaXI9IiR7dGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLndzdC53c2kudWlfMS4wLjAiIGZpbGVzb25seT0iZmFsc2UiIHdoZW5lbXB0eT0ic2tpcCIgdXBkYXRlPSJmYWxzZSIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0id3NpdWkuamFyIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9IndzaXVpLmphciIgZGVzY3JpcHRpb249IkNyZWF0ZSBqYXI6IG9yZy5lY2xpcHNlLndzdC53c2kudWkgd3NpdWkuamFyLiI+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfS93c2l1aS5qYXIuYmluIi8+Ci0JCTxta2RpciBkaXI9IiR7dGVtcC5mb2xkZXJ9L3dzaXVpLmphci5iaW4iLz4KLQkJPCEtLSBjb21waWxlIHRoZSBzb3VyY2UgY29kZSAtLT4KLQkJPGphdmFjIGRlc3RkaXI9IiR7dGVtcC5mb2xkZXJ9L3dzaXVpLmphci5iaW4iIGZhaWxvbmVycm9yPSIke2phdmFjRmFpbE9uRXJyb3J9IiB2ZXJib3NlPSIke2phdmFjVmVyYm9zZX0iIGRlYnVnPSIke2phdmFjRGVidWdJbmZvfSIgaW5jbHVkZUFudFJ1bnRpbWU9Im5vIiBib290Y2xhc3NwYXRoPSIke2Jvb3RjbGFzc3BhdGh9IiBzb3VyY2U9IiR7amF2YWNTb3VyY2V9IiB0YXJnZXQ9IiR7amF2YWNUYXJnZXR9IgkJPgotCQkJPGNvbXBpbGVyYXJnIGxpbmU9IiR7Y29tcGlsZXJBcmd9Ii8+Ci0JCQk8Y2xhc3NwYXRoPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLmpmYWNlLnRleHRfMy4xLjAvamZhY2V0ZXh0LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUucnVudGltZV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5ccGx1Z2luc1xvcmcuZWNsaXBzZS5vc2dpXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnRleHRfMy4xLjAvdGV4dC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5ccGx1Z2luc1xvcmcuZWNsaXBzZS5zd3RfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXHBsdWdpbnNcb3JnLmVjbGlwc2Uuc3d0LndpbjMyXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlxwbHVnaW5zXG9yZy5lY2xpcHNlLmpmYWNlXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHNfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXNfMy4xLjAvcmVzb3VyY2VzLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbXBhdGliaWxpdHlfMy4xLjAvcmVzb3VyY2VzLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbXBhdGliaWxpdHlfMy4xLjAvY29tcGF0aWJpbGl0eS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy53aW4zMl8zLjAuMC9yZXNvdXJjZXMuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMud2luMzJfMy4wLjAvcmVzb3VyY2VzLXdpbjMyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5XzMuMS4wL2NvbXBhdGliaWxpdHkuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXHBsdWdpbnNcb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcl8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5ccGx1Z2luc1xvcmcuZWNsaXBzZS51aV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5ccGx1Z2luc1xvcmcuZWNsaXBzZS5oZWxwXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaF8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eV8zLjEuMC9jb21wYXRpYmlsaXR5LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5jb21wYXRpYmlsaXR5XzMuMS4wL0Bkb3QiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5ccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmlkZV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5ccGx1Z2luc1xvcmcuZWNsaXBzZS51aS53aW4zMl8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5ccGx1Z2luc1xvcmcuZWNsaXBzZS51aS52aWV3c18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5ccGx1Z2luc1xvcmcuZWNsaXBzZS51cGRhdGUuY29yZV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMl8zLjEuMC9AZG90Ii8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXHBsdWdpbnNcb3JnLmVjbGlwc2UudXBkYXRlLnVpXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmZvcm1zXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnVpLmVkaXRvcnNfMy4xLjAvZWRpdG9ycy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcl8zLjEuMC90ZXh0ZWRpdG9yLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnNfMy4xLjAvZmlsZWJ1ZmZlcnMuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UuZGVidWcuY29yZV8zLjEuMC9kdGNvcmUuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXNfMy4xLjAvdmFyaWFibGVzLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24udWlfMS4wLjAvdWkuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb25fMS4wLjAvdmFsaWRhdGUuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb25fMS4wLjAvY29tbW9uLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrc18xLjAuMC9jb21tb24uamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzXzEuMC4wL2NvbW1vbl9jb3JlLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsXzEuMS4wL3V0aWwuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlXzIuMS4wL3J1bnRpbWUvZWNvcmUuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmNvbW1vbl8yLjEuMC9ydW50aW1lL2NvbW1vbi5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pXzIuMS4wL3J1bnRpbWUvZWNvcmUueG1pLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLmpkdC5jb3JlXzMuMS4wL2pkdGNvcmUuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjIvbGliL2FudC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuMi9saWIvYW50LWFudGxyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi4yL2xpYi9hbnQtYXBhY2hlLWJjZWwuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjIvbGliL2FudC1hcGFjaGUtYnNmLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi4yL2xpYi9hbnQtYXBhY2hlLWxvZzRqLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi4yL2xpYi9hbnQtYXBhY2hlLW9yby5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuMi9saWIvYW50LWFwYWNoZS1yZWdleHAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjIvbGliL2FudC1hcGFjaGUtcmVzb2x2ZXIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjIvbGliL2FudC1jb21tb25zLWxvZ2dpbmcuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjIvbGliL2FudC1jb21tb25zLW5ldC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuMi9saWIvYW50LWljb250cmFjdC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuMi9saWIvYW50LWphaS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuMi9saWIvYW50LWphdmFtYWlsLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi4yL2xpYi9hbnQtamRlcGVuZC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuMi9saWIvYW50LWptZi5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuMi9saWIvYW50LWpzY2guamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjIvbGliL2FudC1qdW5pdC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuMi9saWIvYW50LWxhdW5jaGVyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi4yL2xpYi9hbnQtbmV0cmV4eC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuMi9saWIvYW50LW5vZGVwcy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuMi9saWIvYW50LXN0YXJ0ZWFtLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi4yL2xpYi9hbnQtc3R5bGVib29rLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi4yL2xpYi9hbnQtc3dpbmcuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjIvbGliL2FudC10cmF4LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi4yL2xpYi9hbnQtdmFqLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi4yL2xpYi9hbnQtd2VibG9naWMuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjIvbGliL2FudC14YWxhbjEuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjIvbGliL2FudC14c2xwLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnRlYW0uY29yZV8zLjEuMC90ZWFtLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbl8xLjAuMC9ydW50aW1lL3ZhbGlkYXRleG1sLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbl8xLjAuMC9qYXJzL3hlcmNlc0ltcGwuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uXzEuMC4wL2phcnMveG1sUGFyc2VyQVBJcy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyXzEuMC4wL3VyaXJlc29sdmVyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb25fMS4wLjAvd3NkbHZhbGlkYXRldWkuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbl8xLjAuMC93c2RsdmFsaWRhdGUuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbl8xLjAuMC9saWIvd3NkbDRqLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb25fMS4wLjAvbGliL3FuYW1lLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZGVwZW5kZW5jeWNoZWNrZXJfMS4wLjAvZGVwZW5kZW5jeWNoZWNrZXIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uL29yZy5lY2xpcHNlLndzdC53c2kvYmluIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnZfMS4wLjAvZW52LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlXzEuMC4wL2VudmNvcmUuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpXzEuMC4wL2VudnVpLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53cy51ZGRpNGpfMS4wLjAvbGliL3VkZGk0ai5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLmF4aXNfMS4wLjAvbGliL2F4aXMtYW50LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUuYXhpc18xLjAuMC9saWIvYXhpcy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud3MuYXBhY2hlLmF4aXNfMS4wLjAvbGliL2NvbW1vbnMtZGlzY292ZXJ5LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUuYXhpc18xLjAuMC9saWIvamF4cnBjLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUuYXhpc18xLjAuMC9saWIvbG9nNGotMS4yLjguamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS5heGlzXzEuMC4wL2xpYi9zYWFqLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53cy5hcGFjaGUuYXhpc18xLjAuMC9saWIvd3NkbDRqLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF80LjEuMzAuMS90b21jYXR3cmFwcGVyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF80LjEuMzAuMS9jYXRhbGluYS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS50b21jYXRfNC4xLjMwLjEvYm9vdHN0cmFwLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF80LjEuMzAuMS9jb21tb25zLWJlYW51dGlscy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS50b21jYXRfNC4xLjMwLjEvY29tbW9ucy1jb2xsZWN0aW9ucy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS50b21jYXRfNC4xLjMwLjEvY29tbW9ucy1kaWdlc3Rlci5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS50b21jYXRfNC4xLjMwLjEvY29tbW9ucy1sb2dnaW5nLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF80LjEuMzAuMS9jb21tb25zLWxvZ2dpbmctYXBpLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF80LjEuMzAuMS9jb21tb25zLW1vZGVsZXIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XzQuMS4zMC4xL2pha2FydGEtcmVnZXhwLTEuMy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS50b21jYXRfNC4xLjMwLjEvamFzcGVyLWNvbXBpbGVyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF80LjEuMzAuMS9qYXNwZXItcnVudGltZS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS50b21jYXRfNC4xLjMwLjEvbXg0ai1qbXguamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XzQuMS4zMC4xL25hbWluZy1jb21tb24uamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XzQuMS4zMC4xL25hbWluZy1mYWN0b3J5LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF80LjEuMzAuMS9uYW1pbmctcmVzb3VyY2VzLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF80LjEuMzAuMS9zZXJ2bGV0LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLnRvbWNhdF80LjEuMzAuMS9zZXJ2bGV0cy1jb21tb24uamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XzQuMS4zMC4xL3NlcnZsZXRzLWRlZmF1bHQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XzQuMS4zMC4xL3NlcnZsZXRzLWludm9rZXIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XzQuMS4zMC4xL3NlcnZsZXRzLW1hbmFnZXIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XzQuMS4zMC4xL3RvbWNhdC1jb3lvdGUuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XzQuMS4zMC4xL3RvbWNhdC1odHRwMTEuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uL3BsdWdpbnMvb3JnLmVjbGlwc2UudG9tY2F0XzQuMS4zMC4xL3RvbWNhdC11dGlsLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlxwbHVnaW5zXG9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi9vcmcuZWNsaXBzZS53c3Qud3MudWkvYmluLyIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi9vcmcuZWNsaXBzZS53c3Qud3MudWkvd3N1aS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlXzEuMC4wL21vbml0b3Jjb3JlLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpXzEuMC4wL21vbml0b3J1aS5qYXIiLz4KLQkJCTwvY2xhc3NwYXRoPgotCQkJPHNyYyBwYXRoPSJzcmMvIgkJCS8+Ci0JCQk8L2phdmFjPgotCQk8IS0tIENvcHkgbmVjZXNzYXJ5IHJlc291cmNlcyAtLT4KLQkJPGNvcHkgdG9kaXI9IiR7dGVtcC5mb2xkZXJ9L3dzaXVpLmphci5iaW4iIGZhaWxvbmVycm9yPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0ic3JjLyIgZXhjbHVkZXM9IioqLyouamF2YSwgKiovcGFja2FnZS5odG0qIgkJCS8+Ci0JCTwvY29weT4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfSIvPgotCQk8amFyIGRlc3RmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L3dzaXVpLmphciIgYmFzZWRpcj0iJHt0ZW1wLmZvbGRlcn0vd3NpdWkuamFyLmJpbiIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0vd3NpdWkuamFyLmJpbiIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJ3c2l1aXNyYy56aXAiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0id3NpdWlzcmMuemlwIj4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfSIvPgotCQk8emlwIGRlc3RmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L3dzaXVpc3JjLnppcCIgZmlsZXNvbmx5PSJmYWxzZSIgd2hlbmVtcHR5PSJza2lwIiB1cGRhdGU9ImZhbHNlIj4KLQkJCTxmaWxlc2V0IGRpcj0ic3JjLyIgaW5jbHVkZXM9IioqLyouamF2YSIJCQkvPgotCQk8L3ppcD4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQuamFycyIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IkJ1aWxkIGFsbCB0aGUgamFycyBmb3IgdGhlIHBsdWctaW46IG9yZy5lY2xpcHNlLndzdC53c2kudWkuIj4KLQkJPGF2YWlsYWJsZSBwcm9wZXJ0eT0id3NpdWkuamFyIiBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L3dzaXVpLmphciIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9IndzaXVpLmphciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC5zb3VyY2VzIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGF2YWlsYWJsZSBwcm9wZXJ0eT0id3NpdWlzcmMuemlwIiBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L3dzaXVpc3JjLnppcCIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9IndzaXVpc3JjLnppcCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJnYXRoZXIuYmluLnBhcnRzIiBkZXBlbmRzPSJpbml0IiBpZj0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiPgotCQk8bWtkaXIgZGlyPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfS9vcmcuZWNsaXBzZS53c3Qud3NpLnVpXzEuMC4wIi8+Ci0JCTxjb3B5IHRvZGlyPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfS9vcmcuZWNsaXBzZS53c3Qud3NpLnVpXzEuMC4wIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0iIGluY2x1ZGVzPSJ3c2l1aS5qYXIiCQkJLz4KLQkJPC9jb3B5PgotCQk8Y29weSB0b2Rpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2Uud3N0LndzaS51aV8xLjAuMCIgZmFpbG9uZXJyb3I9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0id3NpdWkuamFyLHBsdWdpbi5wcm9wZXJ0aWVzLHBsdWdpbi54bWwsaWNvbnMvIgkJCS8+Ci0JCTwvY29weT4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQuemlwcyIgZGVwZW5kcz0iaW5pdCI+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImdhdGhlci5zb3VyY2VzIiBkZXBlbmRzPSJpbml0IiBpZj0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiPgotCQk8bWtkaXIgZGlyPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfS9vcmcuZWNsaXBzZS53c3Qud3NpLnVpXzEuMC4wIi8+Ci0JCTxjb3B5IGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vd3NpdWlzcmMuemlwIiB0b2Rpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2Uud3N0LndzaS51aV8xLjAuMCIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+Ci0JCTxjb3B5IHRvZGlyPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfS9vcmcuZWNsaXBzZS53c3Qud3NpLnVpXzEuMC4wIiBmYWlsb25lcnJvcj0iZmFsc2UiPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlcz0iaWNvbnMvLHBsdWdpbi5wcm9wZXJ0aWVzLHBsdWdpbi54bWwsc3JjLyxidWlsZC5wcm9wZXJ0aWVzIgkJCS8+Ci0JCTwvY29weT4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2F0aGVyLmxvZ3MiIGRlcGVuZHM9ImluaXQiIGlmPSJkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciI+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLndzdC53c2kudWlfMS4wLjAiLz4KLQkJPGNvcHkgZmlsZT0iJHt0ZW1wLmZvbGRlcn0vd3NpdWkuamFyLmJpbi5sb2ciIHRvZGlyPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfS9vcmcuZWNsaXBzZS53c3Qud3NpLnVpXzEuMC4wIiBmYWlsb25lcnJvcj0iZmFsc2UiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJDbGVhbiB0aGUgcGx1Zy1pbjogb3JnLmVjbGlwc2Uud3N0LndzaS51aSBvZiBhbGwgdGhlIHppcHMsIGphcnMgYW5kIGxvZ3MgY3JlYXRlZC4iPgotCQk8ZGVsZXRlIGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vd3NpdWkuamFyIi8+Ci0JCTxkZWxldGUgZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS93c2l1aXNyYy56aXAiLz4KLQkJPGRlbGV0ZSBmaWxlPSIke3BsdWdpbi5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2Uud3N0LndzaS51aV8xLjAuMC5qYXIiLz4KLQkJPGRlbGV0ZSBmaWxlPSIke3BsdWdpbi5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2Uud3N0LndzaS51aV8xLjAuMC56aXAiLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InJlZnJlc2giIGRlcGVuZHM9ImluaXQiIGlmPSJlY2xpcHNlLnJ1bm5pbmciIGRlc2NyaXB0aW9uPSJSZWZyZXNoIHRoaXMgZm9sZGVyLiI+Ci0JCTxlY2xpcHNlLmNvbnZlcnRQYXRoIGZpbGVTeXN0ZW1QYXRoPSJkOi93dHAvZWNsaXBzZS93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LndzaS51aSIgcHJvcGVydHk9InJlc291cmNlUGF0aCIvPgotCQk8ZWNsaXBzZS5yZWZyZXNoTG9jYWwgcmVzb3VyY2U9IiR7cmVzb3VyY2VQYXRofSIgZGVwdGg9ImluZmluaXRlIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InppcC5wbHVnaW4iIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSB6aXAgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIGZvciB0aGUgcGx1Zy1pbjogb3JnLmVjbGlwc2Uud3N0LndzaS51aS4iPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC5qYXJzIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYnVpbGQuc291cmNlcyIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImdhdGhlci5iaW4ucGFydHMiPgotCQkJPHBhcmFtIG5hbWU9ImRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIiB2YWx1ZT0iJHt0ZW1wLmZvbGRlcn0vIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPGFudGNhbGwgdGFyZ2V0PSJnYXRoZXIuc291cmNlcyI+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS8iLz4KLQkJPC9hbnRjYWxsPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke3RlbXAuZm9sZGVyfSIgaW5jbHVkZXM9IioqLyouYmluLmxvZyIJCQkvPgotCQk8L2RlbGV0ZT4KLQkJPHppcCBkZXN0ZmlsZT0iJHtwbHVnaW4uZGVzdGluYXRpb259L29yZy5lY2xpcHNlLndzdC53c2kudWlfMS4wLjAuemlwIiBiYXNlZGlyPSIke3RlbXAuZm9sZGVyfSIgZmlsZXNvbmx5PSJ0cnVlIiB3aGVuZW1wdHk9InNraXAiIHVwZGF0ZT0iZmFsc2UiLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9pY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9pY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlYjExNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvaWNvbnMvZnVsbC9vYmoxNi92YWxpZGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvaWNvbnMvd3NpX2xvZ2ZpbGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9pY29ucy93c2lfbG9nZmlsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGIxMTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9pY29ucy93c2lfbG9nZmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjA0ZTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIS0tIENvbnN0YW50cyBmb3Igc3RyaW5ncyAgCi0KLV9QTFVHSU5fTkFNRSAgICAgICAgICAgICAgICAgID0gU29hcCBNb25pdG9yCi1fUFJPVklERVJfTkFNRSAgICAgICAgICAgICAgICA9IEVjbGlwc2Uub3JnCi1fVUlfWE1MX0VESVRPUiAgICAgICAgICAgICAgICA9IFhNTCBFZGl0b3IKLV9VSV9XU0lfVkFMSURBVE9SICAgICAgICAgICAgID0gV1MtSSBNZXNzYWdlIFZhbGlkYXRvcgotX1VJX0FDVElPTl9WQUxJREFURSAgICAgICAgICAgPSBWYWxpZGF0ZSBXUy1JIExvZyBGaWxlCi1fVUlfV0laQVJEX1ZBTElEQVRFX0xPR19USVRMRSA9IFZhbGlkYXRlIFdTLUkgTWVzc2FnZSBMb2cgRmlsZQotCi0KLV9VSV9WSUVXX1NTX0ZJTEVfSU1QT1JUX0JVVFRPTiA9IEltcG9ydCBGaWxlcy4uLgotX1VJX1ZJRVdfU1NfRklMRV9TT1VSQ0VfRklMRVMgPSBXb3JrYmVuY2ggRmlsZXMKLQotX1VJX0RJQUxPR19TU19GSUxFX1NIRUxMX1RFWFQgID0gU2VsZWN0IEZpbGUKLV9VSV9ESUFMT0dfU1NfRklMRV9USVRMRSAgICAgICA9IFNlbGVjdCBhIEZpbGUKLV9VSV9ESUFMT0dfU1NfRklMRV9ERVNDUklQVElPTiA9IFNlbGVjdCBhIGZpbGUgZnJvbSB0aGUgd29ya2JlbmNoLgotCi1fVUlfV0laQVJEX1ZfU0VMRUNUX0xPR19GSUxFTkFNRV9IRUFESU5HICAgPSBTcGVjaWZ5IHRoZSBXUy1JIE1lc3NhZ2UgTG9nIEZpbGUgTmFtZQotX1VJX1dJWkFSRF9WX1NFTEVDVF9MT0dfRklMRU5BTUVfRVhQTCAgICAgID0gU2VsZWN0IGEgZm9sZGVyIGFuZCBzcGVjaWZ5IGEgbWVzc2FnZSBsb2cgZmlsZSBuYW1lCi1fVUlfV0laQVJEX1ZfU0VMRUNUX1dTRExfRklMRU5BTUVfSEVBRElORyAgPSBJbmNsdWRlIFdTREwgRmlsZQotX1VJX1dJWkFSRF9WX1NFTEVDVF9XU0RMX0ZJTEVOQU1FX0VYUEwgICAgID0gT3B0aW9uYWxseSBzZWxlY3QgYSBXU0RMIGZpbGUgZm9yIHRoZSBXZWIgc2VydmljZQotX1VJX1dJWkFSRF9WX1NFTEVDVF9XU0RMX0VMRU1FTlRfSEVBRElORyAgID0gU3BlY2lmeSB0aGUgV1NETCBlbGVtZW50IHRvIGJlIEFuYWx5emVkCi1fVUlfV0laQVJEX1ZfU0VMRUNUX1dTRExfRUxFTUVOVF9FWFBMICAgICAgPSBJbmRpY2F0ZSB0aGUgbmFtZSwgdHlwZSwgYW5kIG5hbWVzcGFjZSBvZiB0aGUgV1NETCBlbGVtZW50IHRvIGJlIGFuYWx5emVkCi0KLV9VSV9XSVpBUkRfVl9JTkNMVURFX1dTRExfQlVUVE9OICAgICAgICAgICA9IEluY2x1ZGUgV1NETCBkb2N1bWVudCBmb3IgV2ViIHNlcnZpY2UKLV9VSV9XSVpBUkRfVl9JTkNMVURFX1dTRExfTEFCRUwgICAgICAgICAgICA9IEVudGVyIHRoZSBsb2NhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudCBmb3IgdGhlIFdlYiBzZXJ2aWNlCi1fVUlfV0laQVJEX1ZfVkFMSURfV1NETF9MQUJFTCAgICAgICAgICAgICAgPSAqTm90ZTogWW91IGNhbiBvbmx5IHNlbGVjdCB0aGUgTmV4dCBidXR0b24gaWYgdGhlIFdTREwgZG9jdW1lbnQgaXMgdmFsaWQuCi1fVUlfV0laQVJEX1ZfV09SS0JFTkNIX0JVVFRPTiAgICAgICAgICAgICAgPSBXb3JrYmVuY2guLi4KLV9VSV9XSVpBUkRfVl9CUk9XU0VfQlVUVE9OICAgICAgICAgICAgICAgICA9IEJyb3dzZS4uLgotX1VJX1dJWkFSRF9WX1NFQVJDSF9VRERJX0JVVFRPTiAgICAgICAgICAgID0gU2VhcmNoIFVEREkuLi4KLQotX1VJX1dJWkFSRF9WX0dST1VQX1RFWFRfRUxFTUVOVCAgICAgICAgICAgID0gVGhlIFdTREwgZWxlbWVudAotX1VJX1dJWkFSRF9WX0dST1VQX1RFWFRfVFlQRSAgICAgICAgICAgICAgID0gdHlwZQotX1VJX1dJWkFSRF9WX1JBRElPX1BPUlQgICAgICAgICAgICAgICAgICAgID0gcG9ydAotX1VJX1dJWkFSRF9WX1JBRElPX0JJTkRJTkcgICAgICAgICAgICAgICAgID0gYmluZGluZwotX1VJX1dJWkFSRF9WX1JBRElPX1BPUlRfVFlQRSAgICAgICAgICAgICAgID0gcG9ydFR5cGUKLV9VSV9XSVpBUkRfVl9SQURJT19PUEVSQVRJT04gICAgICAgICAgICAgICA9IG9wZXJhdGlvbgotX1VJX1dJWkFSRF9WX1JBRElPX01FU1NBR0UgICAgICAgICAgICAgICAgID0gbWVzc2FnZQotX1VJX1dJWkFSRF9WX0xBQkVMX05BTUUgICAgICAgICAgICAgICAgICAgID0gbmFtZToKLV9VSV9XSVpBUkRfVl9MQUJFTF9OQU1FU1BBQ0UgICAgICAgICAgICAgICA9IG5hbWVzcGFjZToKLV9VSV9XSVpBUkRfVl9MQUJFTF9QQVJFTlQgICAgICAgICAgICAgICAgICA9IHBhcmVudDoKLQotX1VJX0xPR19FRElUT1IgICAgICAgICAgICAgICAgICAgID0gVGV4dCBFZGl0b3IKLV9VSV9XU0lfVkFMSURBVE9SICAgICAgICAgICAgICAgICA9IFdTLUkgTWVzc2FnZSBWYWxpZGF0b3IKLV9VSV9BQ1RJT05fVkFMSURBVEUgICAgICAgICAgICAgICA9IFZhbGlkYXRlIFdTLUkgTG9nIEZpbGUKLV9VSV9XSVpBUkRfVkFMSURBVEVfTE9HX1RJVExFICAgICAgICAgICA9IFZhbGlkYXRlIFdTLUkgTWVzc2FnZSBMb2cgRmlsZQotX1VJX1dJWkFSRF9TRUxFQ1RfTE9HX0ZJTEVOQU1FX0hFQURJTkcgID0gU3BlY2lmeSB0aGUgV1MtSSBNZXNzYWdlIExvZyBGaWxlIE5hbWUKLV9VSV9XSVpBUkRfU0VMRUNUX0xPR19GSUxFTkFNRV9FWFBMICAgICA9IFNlbGVjdCBhIGZvbGRlciBhbmQgc3BlY2lmeSBhIG1lc3NhZ2UgbG9nIGZpbGUgbmFtZQotCi1fVUlfVkFMSURBVElPTl9GQUlMRUQgICAgICAgICAgICAgPSBWYWxpZGF0aW9uIEZhaWxlZAotX1VJX1VOQUJMRV9UT19WQUxJREFURSAgICAgICAgICAgID0gVW5hYmxlIHRvIFZhbGlkYXRlCi1fVUlfVEhFX1dTSU1TR19GSUxFX0lTX05PVF9WQUxJRCAgPSBUaGUgV1MtSSBNZXNzYWdlIExvZyBmaWxlIGlzIG5vdCB2YWxpZC4gIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgYSBsaXN0IG9mIHRoZSB2YWxpZGF0aW9uIGVycm9ycy4KLV9VSV9QUk9CTEVNU19SRUFESU5HX1dTSU1TR19GSUxFICA9IFByb2JsZW1zIHJlYWRpbmcgdGhlIFdTLUkgTWVzc2FnZSBMb2cgZmlsZS4gIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgYSBsaXN0IG9mIGVycm9ycy4KLV9VSV9WQUxJREFUSU9OX1NVQ0VFREVEICAgICAgICAgICA9IFZhbGlkYXRpb24gU3VjY2VlZGVkCi1fVUlfVkFMSURBVElPTl9XQVJOSU5HU19ERVRFQ1RFRCAgPSBIb3dldmVyIHdhcm5pbmdzIGhhdmUgYmVlbiBpc3N1ZWQuIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgYSBsaXN0IG9mIHRoZSB2YWxpZGF0aW9uIHdhcm5pbmdzLgotX1VJX1RIRV9XU0lNU0dfRklMRV9JU19WQUxJRCAgICAgID0gVGhlIFdTLUkgTWVzc2FnZSBMb2cgZmlsZSBpcyB2YWxpZC4KLV9VSV9WQUxJREFUSU9OX0ZBSUxFRCAgICAgICAgICAgICA9IFZhbGlkYXRpb24gRmFpbGVkCi1fVUlfTUVTU0FHRV9MSU1JVEVfRVhDRUVERUQgICAgICAgPSBUaGUgV1MtSSBNZXNzYWdlIExvZyBmaWxlIGlzIG5vdCB2YWxpZC4gIFRoZSBtZXNzYWdlIGxpbWl0IGZvciB0aGUgUHJvYmxlbXMgdmlldyBoYXMgYmVlbiBleGNlZWRlZC4gIFBsZWFzZSBpbmNyZWFzZSB0aGUgbGltaXQgYW5kIHRyeSBhZ2Fpbi4KLQotX0VSUk9SX0lOVkFMSURfTE9HX0ZJTEVfRVhURU5TSU9OID0gVGhlIGZpbGUgbmFtZSBleHRlbnNpb24gY2FuIG9ubHkgYmUgIi53c2ltc2ciLgotX1dBUk5JTkdfRklMRV9BTFJFQURZX0VYSVNUUyAgICAgID0gV2FybmluZzogVGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIHdpbGwgYmUgb3ZlcndyaXR0ZW4uIAotX0VSUk9SX0lOVkFMSURfTE9HX0ZJTEVfRVhURU5TSU9OID0gVGhlIGZpbGUgbmFtZSBleHRlbnNpb24gY2FuIG9ubHkgYmUgIi53c2ltc2ciLgotX1dBUk5JTkdfRklMRV9BTFJFQURZX0VYSVNUUyAgICAgID0gV2FybmluZzogVGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIHdpbGwgYmUgb3ZlcndyaXR0ZW4uIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNTdhYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4gCi0KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NpLnVpIgotICAgbmFtZT0iJV9QTFVHSU5fTkFNRSIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iJV9QUk9WSURFUl9OQU1FIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuV1NJVUlQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzaXVpLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzaSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ii8+Ci0gICA8L3JlcXVpcmVzPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFB1cnBvc2U6IEFkZCB2YWxpZGF0b3IgYWN0aW9uIHRvIFRDUElQIG1vbml0b3IuICAgICAgICAgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2UudWkudmlld0FjdGlvbnMgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdBY3Rpb25zIj4KLSAgICAgIDx2aWV3Q29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0Lm1vbml0b3IudmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5hcnRpY2xlcy5hY3Rpb24uY29udHJpYnV0aW9uLnZpZXciPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IldTLUkgUHJvZmlsZSBWYWxpZGF0b3IiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZiIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVfVUlfV0laQVJEX1ZBTElEQVRFX0xPR19USVRMRSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnMuYWN0aW9uRGVsZWdhdGVzLlZhbGlkYXRlV1NJUHJvZmlsZUFjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9Imdyb3VwMSIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IioiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLmFjdGlvbkRlbGVnYXRlcy5WYWxpZGF0ZVdTSVByb2ZpbGVBY3Rpb25EZWxlZ2F0ZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvdmlld0NvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uLS0+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gUHVycG9zZTogVG8gcmVnaXN0ZXIgV1MtSSBtZXNzYWdlIHZhbGlkYXRvci4gICAgICAgICAgICAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS51aS52aWV3QWN0aW9ucyAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS1leHRlbnNpb24KLSAgICAgICAgIGlkPSJ3c2lWYWxpZGF0b3IiCi0gICAgICAgICBuYW1lPSIlX1VJX1dTSV9WQUxJREFUT1IiCi0gICAgICAgICBwb2ludD0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotICAgICAgPHZhbGlkYXRvcj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2ltc2ciPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8aGVscGVyCi0gICAgICAgICAgICAgICBjbGFzcz0iY29tLmlibS5ldG9vbHMueG1sLnRvb2xzLnZhbGlkYXRpb24uSGVscGVyIj4KLSAgICAgICAgIDwvaGVscGVyPgotICAgICAgICAgPHJ1bgotICAgICAgICAgICAgICAgY2xhc3M9IiBjb20uaWJtLmV0b29scy53c2kudGVzdC50b29scy52YWxpZGF0ZS5XU0lNZXNzYWdlVmFsaWRhdG9yIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbi0tPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvTG9nQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL0xvZ0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhZTk0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvTG9nQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQmFzZTY0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5Ub29sSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuY29tbW9uLkFkZFN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5pbXBsLkFkZFN0eWxlU2hlZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2dXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsLkxvZ0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsLkxvZ1dyaXRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsLk1lc3NhZ2VFbnRyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLk1hbkluVGhlTWlkZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5pbXBsLkNvbW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5pbXBsLk1hbkluVGhlTWlkZGxlSW1wbDsKLQotLyoqCi0gKiBHaXZlbiBhIGxpc3Qgb2YgUmVxdWVzdFJlc3BvbnNlcyBmcm9tIGEgVENQSVAgTW9uaXRvciwgCi0gKiB0aGlzIGNsYXNzIGJ1aWxkcyBhIFdTLUkgY29tcGxpYW50IE1lc3NhZ2UgTG9nIGZpbGUuCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgTGF1em9uLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIExvZ0J1aWxkZXIKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgICogSURzIHRvIGlkZW50aWZ5IHJlcXVlc3RzIGFuZCBjb3JyZXNwb25kaW5nIHJlc3BvbnNlcy4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgY29udmVyc2F0aW9uSWQgPSAxOwotCi0gIC8qKgotICAgKiBJRHMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCBhbmQgZXZlcnkgbWVzc2FnZSB3aXRoaW4gdGhlIGxvZyBmaWxlLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBpZCA9IDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBsaXN0IG9mIFJlcXVlc3RSZXNwb25jZXMgZnJvbSBhIFRDUElQIE1vbml0b3IgdXNlZCB0byBnZW5lcmF0ZSB0aGUgbG9nIGZpbGUuCi0gICAqLwotICBwcm90ZWN0ZWQgUmVxdWVzdFtdIHJlcXVlc3RSZXNwb25zZXM7Ci0KLSAgLyoqCi0gICAqIFRoZSBhY3R1YWwgbG9nIG9iamVjdC4KLSAgICovCi0gIHByb3RlY3RlZCBMb2cgbG9nID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGxvZyBmaWxlLgotICAgKi8KLSAgcHJvdGVjdGVkIElGaWxlIGlmaWxlOwotCi0gIC8qKgotICAgKiBUb29sIGluZm9ybWF0aW9uIHByb3BlcnR5IHZhbHVlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX05BTUUgPSAiTW9uaXRvciI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX1ZFUlNJT04gPSAiMS4wIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfUkVMRUFTRV9EQVRFID0gIjIwMDMtMDMtMjAiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9JTVBMRU1FTlRFUiA9ICJJQk0iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9MT0NBVElPTiA9ICIiOwotCi0gIC8qKgotICAgKiBQcm9wZXJ0aWVzIG9mIGEgUmVxdWVzdFJlc3BvbnNlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1JFUVVFU1RfSEVBREVSID0gInJlcXVlc3QtaGVhZGVyIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1JFU1BPTlNFX0hFQURFUiA9ICJyZXNwb25zZS1oZWFkZXIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVFVRVNUX0JPRFkgPSAiaHR0cC1yZXF1ZXN0LWJvZHkiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVNQT05TRV9CT0RZID0gImh0dHAtcmVzcG9uc2UtYm9keSI7Ci0KLSAgLyoqCi0gICAqIENvbW1vbiB0aW1lc3RhbXAgZm9ybWF0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IHRpbWVzdGFtcEZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0ICgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTUydaJyIpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIGlmaWxlOiB0aGUgZmlsZSBoYW5kbGVyIGZvciB0aGUgbG9nLgotICAgKi8KLSAgcHVibGljIExvZ0J1aWxkZXIoSUZpbGUgaWZpbGUpCi0gIHsKLSAgICB0aGlzLmlmaWxlID0gaWZpbGU7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBidWlsZHMgYW5kIHRoZW4gcmV0dXJucyBhIGxvZyBiYXNlZCBvbiB0aGUgbGlzdCBvZiByZXF1ZXN0LXJlc3BvbnNlIHBhaXJzLgotICAgKiBAcGFyYW0gcmVxdWVzdFJlc3BvbnNlczogYSBsaXN0IG9mIG1lc3NhZ2VzIGluIHRoZSBmb3JtIG9mIHJlcXVlc3QtcmVzcG9uc2UgcGFpcnMuCi0gICAqIEByZXR1cm4gYSBsb2cgYmFzZWQgb24gYSBsaXN0IG9mIHJlcXVlc3QtcmVzcG9uc2UgcGFpcnMuCi0gICAqLwotICBwdWJsaWMgTG9nIGJ1aWxkTG9nKFJlcXVlc3RbXSByZXF1ZXN0UmVzcG9uc2VzKQotICB7Ci0gICAgdGhpcy5yZXF1ZXN0UmVzcG9uc2VzID0gcmVxdWVzdFJlc3BvbnNlczsKLQotICAgIGxvZyA9IG5ldyBMb2dJbXBsKCk7Ci0gICAgbG9nTW9uaXRvckluZm9ybWF0aW9uKCk7Ci0KLSAgICAvLyBsb2cgdGhlIG1lc3NhZ2VzCi0gICAgZm9yIChpbnQgaT0wOyBpPHJlcXVlc3RSZXNwb25zZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgUmVxdWVzdCByciA9IHJlcXVlc3RSZXNwb25zZXNbaV07Ci0gICAgICBpZiAoKHJyICE9IG51bGwpICYmICghb21pdFJlcXVlc3RSZXNwb25zZShycikpKQotICAgICAgewotICAgICAgICBsb2dSZXF1ZXN0UmVzcG9uc2UocnIpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbG9nOwotICB9Ci0KLSAgLyoqCi0gICAqIEN1cnJlbnRseSBhIG5vLW9wLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nTW9uaXRvckluZm9ybWF0aW9uKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIExvZyB0aGUgcmVxdWVzdC1yZXNwb25zZSBwYWlyLgotICAgKkBwYXJhbSBycjogYSByZXF1ZXN0LXJlc3BvbnNlIHBhaXIuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBsb2dSZXF1ZXN0UmVzcG9uc2UoUmVxdWVzdCBycikKLSAgewotICAgIGlmIChyciAhPSBudWxsKQotICAgIHsKLSAgICAgIGJ5dGVbXSByZXF1ZXN0ID0gcnIuZ2V0UmVxdWVzdChSZXF1ZXN0LkFMTCk7Ci0gICAgICBieXRlW10gcmVzcG9uc2UgPSByci5nZXRSZXNwb25zZShSZXF1ZXN0LkFMTCk7Ci0gICAgICAgIAotICAgICAgU3RyaW5nIHJlcXVlc3RIZWFkZXIgPSBuZXcgU3RyaW5nKHJyLmdldFJlcXVlc3QoUmVxdWVzdC5UUkFOU1BPUlQpKTsKLSAgICAgIFN0cmluZyByZXNwb25zZUhlYWRlciA9IG5ldyBTdHJpbmcocnIuZ2V0UmVzcG9uc2UoUmVxdWVzdC5UUkFOU1BPUlQpKTsKLSAgICAgIGJ5dGVbXSB1bmNodW5rZWRSZXF1ZXN0Qm9keSA9IHJyLmdldFJlcXVlc3QoUmVxdWVzdC5DT05URU5UKTsKLSAgICAgIGJ5dGVbXSB1bmNodW5rZWRSZXNwb25zZUJvZHkgPSByci5nZXRSZXNwb25zZShSZXF1ZXN0LkNPTlRFTlQpOwotICAgICAgU3RyaW5nIHJlcXVlc3RCb2R5ID0gbnVsbDsKLSAgICAgIFN0cmluZyByZXNwb25zZUJvZHkgPSBudWxsOwotCi0gICAgICBpZiAodW5jaHVua2VkUmVxdWVzdEJvZHkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVxdWVzdEJvZHkgPSBuZXcgU3RyaW5nKEJhc2U2NC5lbmNvZGUodW5jaHVua2VkUmVxdWVzdEJvZHkpKTsgCi0gICAgICB9Ci0KLSAgICAgIGlmICh1bmNodW5rZWRSZXNwb25zZUJvZHkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzcG9uc2VCb2R5ID0gbmV3IFN0cmluZyhCYXNlNjQuZW5jb2RlKHVuY2h1bmtlZFJlc3BvbnNlQm9keSkpOyAKLSAgICAgIH0KLQotICAgICAgbG9uZyB0aW1lc3RhbXAgPSByci5nZXREYXRlKCkuZ2V0VGltZSgpOwotICAgICAgU3RyaW5nIGxvY2FsSG9zdEFuZFBvcnQgPSAibG9jYWxob3N0OiIgKyByci5nZXRMb2NhbFBvcnQoKTsKLSAgICAgIFN0cmluZyByZW1vdGVIb3N0QW5kUG9ydCA9IHJyLmdldFJlbW90ZUhvc3QoKSArICI6IiArIHJyLmdldFJlbW90ZVBvcnQoKTsKLQotICAgICAgaW50IHJlcXVlc3RJZCAgPSBnZXROZXh0QXZhaWxhYmxlSWQoKTsKLSAgICAgIGludCByZXNwb25zZUlkID0gZ2V0TmV4dEF2YWlsYWJsZUlkKCk7Ci0gICAgICBpbnQgY29udmVyc2F0aW9uSWQgPSBnZXROZXh0QXZhaWxhYmxlQ29udmVyc2F0aW9uSWQoKTsKLQotICAgICAgTWVzc2FnZUVudHJ5IG1lc3NhZ2VFbnRyeVJlcXVlc3QgPSBjcmVhdGVNZXNzYWdlRW50cnkocmVxdWVzdElkLCBjb252ZXJzYXRpb25JZCwgCi0gICAgICAgICAgICAgICAgTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVCwgdGltZXN0YW1wLCBsb2NhbEhvc3RBbmRQb3J0LAotICAgICAgICAgICAgICAgIHJlbW90ZUhvc3RBbmRQb3J0LCByZXF1ZXN0Qm9keSwgcmVxdWVzdEhlYWRlcik7Ci0KLSAgICAgIE1lc3NhZ2VFbnRyeSBtZXNzYWdlRW50cnlSZXNwb25zZSA9IGNyZWF0ZU1lc3NhZ2VFbnRyeShyZXNwb25zZUlkLCBjb252ZXJzYXRpb25JZCwgCi0gICAgICAgICAgICAgICAgTWVzc2FnZUVudHJ5LlRZUEVfUkVTUE9OU0UsIHRpbWVzdGFtcCArIHJyLmdldFJlc3BvbnNlVGltZSgpLCByZW1vdGVIb3N0QW5kUG9ydCwKLSAgICAgICAgICAgICAgICBsb2NhbEhvc3RBbmRQb3J0LCByZXNwb25zZUJvZHksIHJlc3BvbnNlSGVhZGVyKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAoKG1lc3NhZ2VFbnRyeVJlcXVlc3QgIT0gbnVsbCkgJiYgaXNNZXNzYWdlV2l0aEJyYWNrZXRzKHJlcXVlc3RCb2R5KSkKLSAgICAgICAgewotICAgICAgICAgICBpZiAobWVzc2FnZUVudHJ5UmVzcG9uc2UgIT0gbnVsbCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGxvZy5hZGRMb2dFbnRyeShtZXNzYWdlRW50cnlSZXF1ZXN0KTsKLSAgICAgICAgICAgICBsb2cuYWRkTG9nRW50cnkobWVzc2FnZUVudHJ5UmVzcG9uc2UpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gaWdub3JlIHRoZSByZXF1ZXN0IHJlc3BvbnNlIHBhaXIKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlIGhhcyBhdCBsZWFzdAotICAgKiBvbmUgbGVmdCBhbmQgb25lIHJpZ2h0IGJyYWNrZXQuCi0gICAqIEBwYXJhbSBtZXNzYWdlOiBhIG1lc3NhZ2UgY29udGVudC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlIGhhcyBhdCBsZWFzdAotICAgKiAgICAgICAgIG9uZSBsZWZ0IGFuZCBvbmUgcmlnaHQgYnJhY2tldC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTWVzc2FnZVdpdGhCcmFja2V0cyhTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIHJldHVybiAoKG1lc3NhZ2UgIT0gbnVsbCkgJiYgCi0gICAgICAgICAgICAobWVzc2FnZS5pbmRleE9mKCI8IikhPSAtMSkgJiYgCi0gICAgICAgICAgICAobWVzc2FnZS5pbmRleE9mKCI+IikgIT0gLTEpKTsKLSAgfQotICAgICAgCi0gIC8qKgotICAgKiBDcmVhdGUgYSBsb2cgZW50cnkuCi0gICAqIEBwYXJhbSBpZDogdW5pcXVlIG1lc3NhZ2UgaWQgd2l0aGluIHRoZSBsb2cuCi0gICAqIEBwYXJhbSBjb252ZXJzYXRpb25JZDogY29udmVyc2F0aW9uIGlkIHRvIGlkZW50aWZ5IHJlcXVlc3QtcmVzcG9uc2UgcGFpcnMuCi0gICAqIEBwYXJhbSB0eXBlOiB0eXBlIGluZGljYXRpbmcgYSByZXF1ZXN0IG9yIHJlc3BvbnNlLgotICAgKiBAcGFyYW0gdGltZXN0YW1wOiB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHNlbmRlckhvc3RBbmRQb3J0OiB0aGUgaG9zdCBhbmQgcG9ydCBvZiB0aGUgc2VuZGVyLgotICAgKiBAcGFyYW0gcmVjZWl2ZXJIb3N0QW5kUG9ydDogdGhlIGhvc3QgYW5kIHBvcnQgb2YgdGhlIHJlY2VpdmVyLgotICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRlbnQ6IHRoZSBjb250ZW50IG9yIGJvZHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBoZWFkZXI6IHRoZSBoZWFkZXIgb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gYSBsb2cgZW50cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgTWVzc2FnZUVudHJ5IGNyZWF0ZU1lc3NhZ2VFbnRyeShpbnQgaWQsIGludCBjb252ZXJzYXRpb25JZCwgU3RyaW5nIHR5cGUsIGxvbmcgdGltZXN0YW1wLCAKLSAgICAgICAgU3RyaW5nIHNlbmRlckhvc3RBbmRQb3J0LCBTdHJpbmcgcmVjZWl2ZXJIb3N0QW5kUG9ydCwgU3RyaW5nIG1lc3NhZ2VDb250ZW50LCBTdHJpbmcgaGVhZGVyKSAKLSAgewotIAkvLyBDcmVhdGUgbG9nIGVudHJ5Ci0gICAgTWVzc2FnZUVudHJ5IG1lc3NhZ2VFbnRyeSA9IG5ldyBNZXNzYWdlRW50cnlJbXBsKCk7Ci0JbWVzc2FnZUVudHJ5LnNldEhUVFBIZWFkZXJzKGhlYWRlcik7Ci0JbWVzc2FnZUVudHJ5LnNldE1lc3NhZ2UobWVzc2FnZUNvbnRlbnQpOwotICAgIG1lc3NhZ2VFbnRyeS5zZXRJZChTdHJpbmcudmFsdWVPZihpZCkpOwotICAgIG1lc3NhZ2VFbnRyeS5zZXRDb252ZXJzYXRpb25JZChTdHJpbmcudmFsdWVPZihjb252ZXJzYXRpb25JZCkpOwotICAgIG1lc3NhZ2VFbnRyeS5zZXRUeXBlKHR5cGUpOwotICAgIG1lc3NhZ2VFbnRyeS5zZXRUaW1lc3RhbXAoZ2V0VGltZXN0YW1wKG5ldyBEYXRlKHRpbWVzdGFtcCkpKTsKLSAgICBtZXNzYWdlRW50cnkuc2V0U2VuZGVySG9zdEFuZFBvcnQoc2VuZGVySG9zdEFuZFBvcnQpOwotICAgIG1lc3NhZ2VFbnRyeS5zZXRSZWNlaXZlckhvc3RBbmRQb3J0KHJlY2VpdmVySG9zdEFuZFBvcnQpOwotICAgICAgICAgICAgCi0gICAgcmV0dXJuIG1lc3NhZ2VFbnRyeTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF2YWlsYWJsZSBpZCwgdGhlbiBpbmNyZW1lbnRzIHRoZSBpZCB2YWx1ZS4KLSAgICogQHJldHVybiB0aGUgbmV4dCBhdmFpbGFibGUgaWQuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGdldE5leHRBdmFpbGFibGVJZCgpCi0gIHsKLSAgICByZXR1cm4gaWQrKzsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBuZXh0IGF2YWlsYWJsZSBjb252ZXJzYXRpb24gaWQsIHRoZW4gaW5jcmVtZW50cyB0aGUgY29udmVyc2F0aW9uIGlkIHZhbHVlLgotICAgKiBBIGNvbnZlcnNhdGlvbiBpZCBpZGVudGZpZXMgYSByZXF1ZXN0IGFuZCBpdHMgY29ycmVzcG9uZGluZyByZXNwb25zZS4KLSAgICogQHJldHVybiB0aGUgbmV4dCBhdmFpbGFibGUgY29udmVyYXNhdGlvbmlkLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBnZXROZXh0QXZhaWxhYmxlQ29udmVyc2F0aW9uSWQoKQotICB7Ci0gICAgcmV0dXJuIGNvbnZlcnNhdGlvbklkKys7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgZm9yIEhUVFAgbWVzc2FnZXMgdGhhdCBzaG91bGQgbm90IGJlIGxvZ2dlZC4KLSAgICogQHBhcmFtIHJyOiBhIHJlcXVlc3QtcmVzcG9uc2UgcGFpci4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXN0LXJlc3BvbnNlIHBhaXIgc2hvdWxkIGJlIG9taXR0ZWQgZnJvbSB0aGUgbG9nLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIG9taXRSZXF1ZXN0UmVzcG9uc2UoUmVxdWVzdCBycikgCi0gIHsKLSAgICBib29sZWFuIG9taXQgPSBmYWxzZTsKLSAgICBpZiAocnIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVxdWVzdCA9IHJyLmdldFJlcXVlc3QoUmVxdWVzdC5UUkFOU1BPUlQpLnRvU3RyaW5nKCk7Ci0gICAgICBpZiAoKHJlcXVlc3QgIT0gbnVsbCkgJiYKLSAgICAgICAgICAoKHJlcXVlc3Quc3RhcnRzV2l0aCgiQ09OTkVDVCIpKSB8fAotICAgICAgICAgICAocmVxdWVzdC5zdGFydHNXaXRoKCJUUkFDRSIpKSB8fCAKLSAgICAgICAgICAgKHJlcXVlc3Quc3RhcnRzV2l0aCgiREVMRVRFIikpIHx8IAotICAgICAgICAgICAocmVxdWVzdC5zdGFydHNXaXRoKCJPUFRJT05TIikpIHx8IAotICAgICAgICAgICAocmVxdWVzdC5zdGFydHNXaXRoKCJIRUFEIikpKSkKLSAgICAgIHsgCi0gICAgICAgIG9taXQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb21pdDsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBsb2cgb3V0IHRvIGZpbGUuCi0gICAqIEBwYXJhbSBsb2c6IGxvZyB0byBiZSB3cml0dGVuIHRvIGZpbGUuCi0gICAqLwotCi0gIHB1YmxpYyB2b2lkIHdyaXRlTG9nKExvZyBsb2cpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXQgbG9nIHdyaXRlcgotICAgICAgTG9nV3JpdGVyIGxvZ1dyaXRlciA9IG5ldyBMb2dXcml0ZXJJbXBsKCk7Ci0gICAgCi0gICAgICBsb2dXcml0ZXIuc2V0V3JpdGVyKGlmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLSAgICAgIAotICAgICAgLy8gV3JpdGUgc3RhcnQgb2YgbG9nIGZpbGUKLSAgICAgIGxvZ1dyaXRlci53cml0ZShuZXcgU3RyaW5nUmVhZGVyKGxvZy5nZXRTdGFydFhNTFN0cmluZygiIikpKTsKLSAgICAKLSAgICAgIC8vIFdyaXRlIG1vbml0b3IgdG9vbCBpbmZvcm1hdGlvbgotICAgICAgU3RyaW5nIG1vbml0b3JJbmZvID0gZ2VuZXJhdGVNb25pdG9yVG9vbEluZm8oKTsKLSAgICAgIGxvZ1dyaXRlci53cml0ZShuZXcgU3RyaW5nUmVhZGVyKG1vbml0b3JJbmZvKSk7Ci0KLSAgICAgIGZvciAoaW50IGk9MDsgaTxsb2cuZ2V0RW50cnlDb3VudCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE1lc3NhZ2VFbnRyeSBtZSA9IGxvZy5nZXRMb2dFbnRyeShpKTsKLSAgICAgICAgbG9nV3JpdGVyLndyaXRlKG5ldyBTdHJpbmdSZWFkZXIobWUudG9YTUxTdHJpbmcoIiIpKSk7Ci0gICAgICB9Ci0gICAgICBsb2dXcml0ZXIud3JpdGUobmV3IFN0cmluZ1JlYWRlcihsb2cuZ2V0RW5kWE1MU3RyaW5nKCIiKSkpOwotICAgICAgbG9nV3JpdGVyLmNsb3NlKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiB0aHJvd24gd2hlbiBwcmludGluZyBsb2cgZmlsZS4iKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIFhNTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIE1vbml0b3IgdG9vbC4KLSAgICogQHJldHVybiBYTUwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBNb25pdG9yIHRvb2wuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlTW9uaXRvclRvb2xJbmZvKCkKLSAgewotCi0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsgCi0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBUb29sIGluZm9ybWF0aW9uCi0gICAgICBUb29sSW5mbyB0b29sSW5mbyA9IG5ldyBUb29sSW5mbyhUT09MX05BTUUsIFRPT0xfVkVSU0lPTiwgVE9PTF9SRUxFQVNFX0RBVEUsIFRPT0xfSU1QTEVNRU5URVIsIFRPT0xfTE9DQVRJT04pOwotCi0gICAgICBEb2N1bWVudEZhY3RvcnkgZG9jdW1lbnRGYWN0b3J5ID0gRG9jdW1lbnRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBNb25pdG9yQ29uZmlnIG1vbml0b3JDb25maWcgPSBkb2N1bWVudEZhY3RvcnkubmV3TW9uaXRvckNvbmZpZygpOwotICAgIAotICAgICAgQ29tbWVudCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsKCk7Ci0gICAgICBjb21tZW50LnNldFRleHQoIkNvbW1lbnQiKTsKLSAgICAgIG1vbml0b3JDb25maWcuc2V0Q29tbWVudChjb21tZW50KTsKLSAgICAgIG1vbml0b3JDb25maWcuc2V0TG9nTG9jYXRpb24oIlVSTCIpOwotICAgICAgbW9uaXRvckNvbmZpZy5zZXRSZXBsYWNlTG9nKHRydWUpOwotCi0gICAgICBBZGRTdHlsZVNoZWV0IGFkZFN0eWxlU2hlZXQgPSBuZXcgQWRkU3R5bGVTaGVldEltcGwoKTsKLSAgICAgIG1vbml0b3JDb25maWcuc2V0QWRkU3R5bGVTaGVldChhZGRTdHlsZVNoZWV0KTsKLQotICAgICAgbW9uaXRvckNvbmZpZy5zZXRMb2dEdXJhdGlvbig2MDApOwotICAgICAgbW9uaXRvckNvbmZpZy5zZXRUaW1lb3V0KDMpOwotICAgICAKLSAgICAgIE1hbkluVGhlTWlkZGxlIG1hbkluVGhlTWlkZGxlID0gbmV3IE1hbkluVGhlTWlkZGxlSW1wbCgpOwotICAgICAgbW9uaXRvckNvbmZpZy5zZXRNYW5JblRoZU1pZGRsZShtYW5JblRoZU1pZGRsZSk7Ci0KLSAgICAgIG1vbml0b3JDb25maWcuc2V0TG9jYXRpb24oImRvY3VtZW50VVJJIik7Ci0gICAgICBtb25pdG9yQ29uZmlnLnNldFZlcmJvc2VPcHRpb24oZmFsc2UpOwotCi0gICAgICAvLyBTdGFydCAgICAgCi0gICAgICBwdy5wcmludCh0b29sSW5mby5nZXRTdGFydFhNTFN0cmluZygiIikpOwotICAgIAotICAgICAgLy8gQ29uZmlnCi0gICAgICBwdy5wcmludChtb25pdG9yQ29uZmlnLnRvWE1MU3RyaW5nKFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9NT05JVE9SX0NPTkZJRykpOwotCi0gICAgICAvLyBFbmQKLSAgICAgIHB3LnByaW50bG4odG9vbEluZm8uZ2V0RW5kWE1MU3RyaW5nKCIiKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZ2l2ZW4gZGF0ZSBhbmQgdGltZSBhcyBhIHRpbWVzdGFtcC4KLSAgICogQHBhcmFtIGRhdGU6IGEgZGF0ZSBvYmplY3QuCi0gICAqIEByZXR1cm4gdGhlIGdpdmVuIGRhdGUgYW5kIHRpbWUgYXMgYSB0aW1lc3RhbXAuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUaW1lc3RhbXAoRGF0ZSBkYXRlKQotICB7Ci0gICAgdGltZXN0YW1wRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldERlZmF1bHQoKSk7Ci0gICAgcmV0dXJuIHRpbWVzdGFtcEZvcm1hdC5mb3JtYXQoZGF0ZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9SZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YjIwY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1Jlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsOwotCi0vKioKLSAqIEdJRiBjb25zdGFudHMKLSAqIAotICogQGF1dGhvciBEYXZpZCBMYXV6b24sIElCTQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX1dTSV9MT0dGSUxFX1dJWiA9ICJhY3Rpb25zL2ljb25zL3dzaV9sb2dmaWxlX3dpei5naWYiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1Jlc291cmNlRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvUmVzb3VyY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4MTM1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvUmVzb3VyY2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgCi17Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBmRXh0ZW5zaW9uczsKLSAgcHJvdGVjdGVkIElGaWxlW10gZkV4Y2x1ZGVkRmlsZXM7Ci0gIHByb3RlY3RlZCBDb2xsZWN0aW9uIGZFeGNsdWRlczsKLQkKLSAgcHVibGljIFJlc291cmNlRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMsIENvbGxlY3Rpb24gZXhjbHVkZSkgCi0gIHsKLSAgICBmRXh0ZW5zaW9ucz0gZXh0ZW5zaW9uczsKLSAgICBmRXhjbHVkZXM9IGV4Y2x1ZGU7Ci0gICAgZkV4Y2x1ZGVkRmlsZXMgPSBudWxsOwotICB9Ci0KLSAgcHVibGljIFJlc291cmNlRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMsIElGaWxlW10gZXhjbHVkZWRGaWxlcywgQ29sbGVjdGlvbiBleGNsdWRlKSAKLSAgewotICAgIGZFeHRlbnNpb25zPSBleHRlbnNpb25zOwotICAgIGZFeGNsdWRlcz0gZXhjbHVkZTsKLSAgICBmRXhjbHVkZWRGaWxlcyA9IGV4Y2x1ZGVkRmlsZXM7Ci0gIH0KLQkKLSAgcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHByb3BlcnR5KSAKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCQotICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIAotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgCi0gICAgewotICAgICAgaWYgKGZFeGNsdWRlcyAhPSBudWxsICYmIGZFeGNsdWRlcy5jb250YWlucyhlbGVtZW50KSkgCi0gICAgICB7Ci0JcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgU3RyaW5nIG5hbWU9ICgoSUZpbGUpZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgICAgaWYgKGZFeGNsdWRlZEZpbGVzICE9IG51bGwpIAotICAgICAgewotICAgICAgICBmb3IgKGludCBqPSAwOyBqIDwgZkV4Y2x1ZGVkRmlsZXMubGVuZ3RoOyBqKyspIAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAoKElGaWxlKWVsZW1lbnQpLmdldExvY2F0aW9uKCkuCi0gICAgICAgICAgICAgICB0b09TU3RyaW5nKCkuY29tcGFyZVRvKCgoSUZpbGUpZkV4Y2x1ZGVkRmlsZXNbal0pLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKSA9PSAwICkKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgfQotICAgICAgaWYgKGZFeHRlbnNpb25zLmxlbmd0aCA9PSAwKSAKLSAgICAgIHsKLSAgICAgICAgLy8gYXNzdW1lIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBmaWx0ZXIgYW55IGZpbGVzIGJhc2VkIG9uIAotICAgICAgICAvLyBleHRlbnNpb24KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBpPSAwOyBpIDwgZkV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIAotICAgICAgewotICAgICAgICBpZiAobmFtZS5lbmRzV2l0aChmRXh0ZW5zaW9uc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IAotICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSAKLSAgICB7IC8vIElQcm9qZWN0LCBJRm9sZGVyCi0gICAgICB0cnkgCi0gICAgICB7Ci0gICAgICAJSVJlc291cmNlW10gcmVzb3VyY2VzPSAoKElDb250YWluZXIpZWxlbWVudCkubWVtYmVycygpOwotCWZvciAoaW50IGk9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIAotICAgICAgICB7Ci0JICAvLyByZWN1cnNpdmUhCi0JICBpZiAoc2VsZWN0KHZpZXdlciwgcGFyZW50LCByZXNvdXJjZXNbaV0pKSAKLSAgICAgICAgICB7Ci0JICAgIHJldHVybiB0cnVlOwotCSAgfQotCX0KLSAgICAgIH0gCi0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSAKLSAgICAgIHsKLSAgICAgIH0JCQkJCi0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSU1lc3NhZ2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9XU0lNZXNzYWdlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Mzc1YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSU1lc3NhZ2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnMuV1NJVmFsaWRhdGVBY3Rpb247Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGwuRGVmYXVsdFJlcG9ydGVyOwotCi0vKioKLSAqIEEgVmFsaWRhdG9yIHRoYXQgcGVyZm9ybXMgdmFsaWRhdGlvbiBvbiBhIFdTLUkgTWVzc2FnZSBMb2cgZmlsZS4gCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgTGF1em9uLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIFdTSU1lc3NhZ2VWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBJUmVwb3J0ZXIgcmVwb3J0ZXI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTSV9NRVNTQUdFX1ZBTElEQVRPUl9JRCA9ICJ3c2ltZXNzYWdldmFsaWRhdG9yIi5pbnRlcm4oKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudmFsaWRhdGUuSVZhbGlkYXRvciN2YWxpZGF0ZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKElGaWxlIGZpbGUpCi0gIHsgIAotICAgIFdTSVZhbGlkYXRlQWN0aW9uIHZhbGlkYXRlQWN0aW9uID0gbmV3IFdTSVZhbGlkYXRlQWN0aW9uKGZpbGUsIGZhbHNlKTsKLSAgICAvL3ZhbGlkYXRlQWN0aW9uLnNldFZhbGlkYXRvcih0aGlzKTsKLSAgICB2YWxpZGF0ZUFjdGlvbi5zZXRSZXBvcnRlcihnZXRSZXBvcnRlcigpKTsKLSAgICB2YWxpZGF0ZUFjdGlvbi5ydW4oKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZhbGlkYXRlLklWYWxpZGF0b3IjZ2V0UmVwb3J0ZXIoKQotICAgKi8KLSAgcHVibGljIElSZXBvcnRlciBnZXRSZXBvcnRlcigpCi0gIHsKLSAgICBpZiAocmVwb3J0ZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL3JlcG9ydGVyID0gbmV3IERlZmF1bHRSZXBvcnRlcihXU0lfTUVTU0FHRV9WQUxJREFUT1JfSUQpOwkKLSAgICB9CQotICAgIHJldHVybiByZXBvcnRlcjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS5JVmFsaWRhdG9yI3NldFJlcG9ydGVyKG9yZy5lY2xpcHNlLnZhbGlkYXRlLklSZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKElSZXBvcnRlciByZXBvcnRlcikKLSAgewotICAJdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyOwotICB9Ci0KLXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQotfQotCi1wdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlRGVsdGFbXSBjaGFuZ2VkRmlsZXMpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCi19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvV1NJVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9XU0lVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmJmNWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9XU0lVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogV1NJVmFsaWRhdGVQbHVnaW4gaXMgYSBwbHVnaW4gdGhhdCBpbnRlZ3JhdGVzIHdpdGggdGhlIEVjbGlwc2UgcGxhdGZvcm0gVUkuIAotICogCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiwgSUJNCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLQotcHVibGljIGNsYXNzIFdTSVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcGx1Z2luUkIgPSBudWxsOwotICAvKioKLSAgICogVGhlIHNpbmdsZXRvbi4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgV1NJVUlQbHVnaW4gaW5zdGFuY2U7ICAgICAgICAgICAgICAgIAotCi0vLyAgLyoqCi0vLyAgICogTWVzc2FnZSBMb2dnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGx1Z2luLgotLy8gICAqLwotLy8gIHByaXZhdGUgc3RhdGljIE1zZ0xvZ2dlciBteU1zZ0xvZ2dlcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NJVUlQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikKLSAgewotICAgIHN1cGVyKGRlc2NyaXB0b3IpOwotICAgIGluc3RhbmNlID0gdGhpczsKLSAgICBwbHVnaW5SQiA9IGRlc2NyaXB0b3IuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLSAgfSAgICAKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uLiAoQmFzZWQgb24gdGhlIFNpbmdsZXRvbiBQYXR0ZXJuKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV1NJVUlQbHVnaW4gZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZpZW5jZSBBUEkuICAKLSAgICogRmluZHMgdGhlIHNwZWNpZmllZCBpbWFnZSBzdG9yZWQgaW4gdGhpcyBwbHVnLWluJ3MgaW1hZ2UgcmVnaXN0cnkuCi0gICAqIEBwYXJhbSBpY29uTmFtZTogdGhlIG5hbWUgb2YgdGhlIGltYWdlLgotICAgKiBAcmV0dXJuIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEltYWdlIGdldFJlc291cmNlSW1hZ2UoU3RyaW5nIGljb25OYW1lKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoaWNvbk5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZpZW5jZSBBUEkuICAgICAKLSAgICogVGhpcyBnZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgYmFzZWQgb24gdGhlIGtleS4KLSAgICogQHBhcmFtIGtleToga2V5IGFzc29jaWF0ZWQgd2l0aGEgc3RyaW5nIHJlc291cmNlLgotICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KQotICB7Ci0gIAkKLSAgICByZXR1cm4gaW5zdGFuY2UucGx1Z2luUkIuZ2V0U3RyaW5nKGtleSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9XU0lWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9XU0lWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiNjQ0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvV1NJVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLldTSVZhbGlkYXRlQWN0aW9uOwotCi0vKioKLSAqIEEgc2ltcGxlIGludGVyZmFjZSB0byB0aGUgV1MtSSBtZXNzYWdlIGxvZyB2YWxpZGF0b3IuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIFdTSVZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgV1NJVmFsaWRhdG9yKCkKLQl7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBnaXZlbiBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSBUaGUgbG9nIGZpbGUgdG8gdmFsaWRhdGUuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUZpbGUgZmlsZSkKLQl7Ci0JCVdTSU1lc3NhZ2VWYWxpZGF0b3IgbWVzc2FnZVZhbGlkYXRvciA9IG5ldyBXU0lNZXNzYWdlVmFsaWRhdG9yKCk7Ci0JCVdTSVZhbGlkYXRlQWN0aW9uIHZhbGlkYXRlQWN0aW9uID0gbmV3IFdTSVZhbGlkYXRlQWN0aW9uKGZpbGUsIHRydWUpOwotCQl2YWxpZGF0ZUFjdGlvbi5zZXRWYWxpZGF0b3IobWVzc2FnZVZhbGlkYXRvcik7Ci0JCXZhbGlkYXRlQWN0aW9uLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gbG9nIGZpbGUgd2l0aCBhIFdTREwgZG9jdW1lbnQgc3BlY2lmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIFRoZSBsb2cgZmlsZSB0byB2YWxpZGF0ZS4KLQkgKiBAcGFyYW0gd3NkbGZpbGUgVGhlIFdTREwgZmlsZSB0byB1c2UgZm9yIHZhbGlkYXRpb24uCi0JICogQHBhcmFtIGVsZW1lbnRuYW1lIFRoZSBXU0RMIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0JICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBXU0RMIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0JICogQHBhcmFtIHBhcmVudG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBhcmVudCBlbGVtZW50IG9mIHRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotCSAqLwotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBnaXZlbiBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSBUaGUgbG9nIGZpbGUgdG8gdmFsaWRhdGUuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSUZpbGUgZmlsZSwgU3RyaW5nIHdzZGxmaWxlLCBTdHJpbmcgZWxlbWVudG5hbWUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBwYXJlbnRuYW1lLCBTdHJpbmcgdHlwZSkKLQl7Ci0JCVdTSU1lc3NhZ2VWYWxpZGF0b3IgbWVzc2FnZVZhbGlkYXRvciA9IG5ldyBXU0lNZXNzYWdlVmFsaWRhdG9yKCk7Ci0JCVdTSVZhbGlkYXRlQWN0aW9uIHZhbGlkYXRlQWN0aW9uID0gbmV3IFdTSVZhbGlkYXRlQWN0aW9uKGZpbGUsIHRydWUsIHdzZGxmaWxlLCBlbGVtZW50bmFtZSwgbmFtZXNwYWNlLCBwYXJlbnRuYW1lLCB0eXBlKTsKLQkJdmFsaWRhdGVBY3Rpb24uc2V0VmFsaWRhdG9yKG1lc3NhZ2VWYWxpZGF0b3IpOwotCQl2YWxpZGF0ZUFjdGlvbi5ydW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0lWYWxpZGF0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvV1NJVmFsaWRhdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1YmZkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0lWYWxpZGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotLy9pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotLy9pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5hbmFseXplci5NZXNzYWdlQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5hbmFseXplci5XU0lBbmFseXplckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLldTSVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIEFjdGlvbiBmb3IgcnVubmluZyB0aGUgdmFsaWRhdG9yLgotICogCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiwgSUJNCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0lWYWxpZGF0ZUFjdGlvbiBleHRlbmRzIFZhbGlkYXRlQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZToiOwotICBwcm90ZWN0ZWQgSVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxmaWxlID0gbnVsbDsKLSAgcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50bmFtZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgcHJvdGVjdGVkIFN0cmluZyBwYXJlbnRuYW1lID0gbnVsbDsKLSAgcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gbnVsbDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gd3NkbHNwZWNpZmllZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBleGNlcHRpb25DYXVnaHQgPSBmYWxzZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gZiBUaGUgZmlsZSB0byB2YWxpZGF0ZQotICAgKiBAcGFyYW0gc2hvd0RpYWxvZyBXaGV0aGVyIG9yIG5vdCB0byBzaG93IGEgc3RhdHVzIGRpYWxvZyBhZnRlciB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIFdTSVZhbGlkYXRlQWN0aW9uKElGaWxlIGYsIGJvb2xlYW4gc2hvd0RpYWxvZykKLSAgewotICAJc3VwZXIoZiwgc2hvd0RpYWxvZyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB3aXRoIFdTREwgZWxlbWVudCBzcGVjaWZpZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZiBUaGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIHNob3dEaWFsb2cgV2hldGhlciBvciBub3QgdG8gc2hvdyBhIHN0YXR1cyBkaWFsb2cgYWZ0ZXIgdmFsaWRhdGlvbi4KLSAgICogQHBhcmFtIHdzZGxmaWxlIFRoZSBXU0RMIGZpbGUgdG8gdXNlIGZvciB2YWxpZGF0aW9uLgotICAgKiBAcGFyYW0gZWxlbWVudG5hbWUgVGhlIG5hbWUgb2YgdGhlIFdTREwgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBXU0RMIGVsZW1lbnQgdG8gdmFsaWRhdGUKLSAgICogQHBhcmFtIHBhcmVudG5hbWUgVGhlIHBhcmVudCBuYW1lIG9mIHRoZSBXU0RMIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqLwotICBwdWJsaWMgV1NJVmFsaWRhdGVBY3Rpb24oSUZpbGUgZiwgYm9vbGVhbiBzaG93RGlhbG9nLCBTdHJpbmcgd3NkbGZpbGUsIFN0cmluZyBlbGVtZW50bmFtZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHBhcmVudG5hbWUsIFN0cmluZyB0eXBlKQotICB7Ci0gIAl0aGlzKGYsIHNob3dEaWFsb2cpOwotICAJdGhpcy53c2RsZmlsZSA9IHdzZGxmaWxlOwotICAJdGhpcy5lbGVtZW50bmFtZSA9IGVsZW1lbnRuYW1lOwotICAJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gIAl0aGlzLnBhcmVudG5hbWUgPSBwYXJlbnRuYW1lOwotICAJdGhpcy50eXBlID0gdHlwZTsKLSAgCXRoaXMud3NkbHNwZWNpZmllZCA9IHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudmFsaWRhdGUuVmFsaWRhdGVBY3Rpb24jdmFsaWRhdGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZShmaW5hbCBJRmlsZSBmaWxlKQotICB7Ci0gIAlmaW5hbCBNZXNzYWdlQW5hbHl6ZXIgbWVzc2FnZWFuYWx5emVyOwotICAJCi0gIAlpZih3c2Rsc3BlY2lmaWVkKQotICAJewotICAJICBtZXNzYWdlYW5hbHl6ZXIgPSBuZXcgTWVzc2FnZUFuYWx5emVyKEZJTEVfUFJPVE9DT0wgKyBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpLCB3c2RsZmlsZSwgZWxlbWVudG5hbWUsIG5hbWVzcGFjZSwgcGFyZW50bmFtZSwgdHlwZSk7CQotICAJfQotICAJZWxzZQotICAJewkKLSAgCSAgbWVzc2FnZWFuYWx5emVyID0gbmV3IE1lc3NhZ2VBbmFseXplcihGSUxFX1BST1RPQ09MICsgZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0gIAl9Ci0gIAkKLSAgCUlXb3Jrc3BhY2VSdW5uYWJsZSBvcCA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSAKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICAgICAgeyAgICAgICAgCi0gICAgICAgIGNsZWFyTWFya2VycyhmaWxlKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBtZXNzYWdlYW5hbHl6ZXIudmFsaWRhdGVDb25mb3JtYW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXU0lBbmFseXplckV4Y2VwdGlvbiBhZSkKLSAgICAgICAgewotICAgICAgICAJaWYgKGFlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICAgIAl7Ci0gICAgICAgIAkgIGV4Y2VwdGlvbkNhdWdodCA9IHRydWU7Ci0vLyAgICAgICAgCSAgY3JlYXRlTWFya2VyKGZpbGUsIGFlLCBFUlJPUl9NQVJLRVIpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0vLyAgICAgICAgY3JlYXRlTWFya2VycyhmaWxlLCBtZXNzYWdlYW5hbHl6ZXIuZ2V0QXNzZXJ0aW9uV2FybmluZ3MoKSwgV0FSTklOR19NQVJLRVIpOwotLy8gICAgICAgIGNyZWF0ZU1hcmtlcnMoZmlsZSwgbWVzc2FnZWFuYWx5emVyLmdldEFzc2VydGlvbkVycm9ycygpLCBFUlJPUl9NQVJLRVIpOwotLy8KLQkJfQotICAgIH07Ci0gICAKLSAgICAKLSAgICAgdHJ5Ci0gICAgewotICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihvcCwgbnVsbCk7Ci0gICAgIGlmIChzaG93RGlhbG9nKQotICAgICAgewotICAgICAgICBpZiAoZXhjZXB0aW9uQ2F1Z2h0KQotICAgICAgICB7Ci0gICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgCi0gICAgICAgICAgCQlXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1VOQUJMRV9UT19WQUxJREFURSIpLCAKLSAgICAgICAgICAJCVdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfUFJPQkxFTVNfUkVBRElOR19XU0lNU0dfRklMRSIpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXNzYWdlYW5hbHl6ZXIuZ2V0QXNzZXJ0aW9uRXJyb3JzKCkuc2l6ZSgpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCAKLSAgICAgICAgICAJCVdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfVkFMSURBVElPTl9GQUlMRUQiKSwgCi0gICAgICAgICAgCQlXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1RIRV9XU0lNU0dfRklMRV9JU19OT1RfVkFMSUQiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobWVzc2FnZWFuYWx5emVyLmdldEFzc2VydGlvbldhcm5pbmdzKCkuc2l6ZSgpICE9IDApCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyB0aXRsZSA9IFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfVkFMSURBVElPTl9TVUNFRURFRCIpOwotICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9WQUxJREFUSU9OX1dBUk5JTkdTX0RFVEVDVEVEIik7Ci0gICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB0aXRsZSA9IFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfVkFMSURBVElPTl9TVUNFRURFRCIpOwotICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9USEVfV1NJTVNHX0ZJTEVfSVNfVkFMSUQiKTsKLSAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goRXhjZXB0aW9uIGUpe30KLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIG1hcmtlciBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eS4KLSAgICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSB0aGF0IAotICAgKiBAcGFyYW0gYWUgdGhlIFdTLUkgQW5hbHl6ZXIgZXhjZXB0aW9uCi0gICAqIEBwYXJhbSBlcnJvcl9tYXJrZXIgZmxhZyBpbmRpY2F0aW5nIHNldmVyaXR5IG9mIHByb2JsZW0KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWFya2VyKElSZXNvdXJjZSByZXNvdXJjZSwgV1NJQW5hbHl6ZXJFeGNlcHRpb24gYWUsIGludCBlcnJvcl9tYXJrZXIpIAotLy8gIHsKLS8vIAlUaHJvd2FibGUgdGhyb3dhYmxlID0gYWUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0vLwotLy8JaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIFNBWFBhcnNlRXhjZXB0aW9uKQotLy8JewotLy8JCWludCBuID0gKChTQVhQYXJzZUV4Y2VwdGlvbil0aHJvd2FibGUpLmdldExpbmVOdW1iZXIoKTsKLS8vCQlpbnQgYyA9ICgoU0FYUGFyc2VFeGNlcHRpb24pdGhyb3dhYmxlKS5nZXRDb2x1bW5OdW1iZXIoKTsKLS8vCQkKLS8vCQlnZXRPckNyZWF0ZVJlcG9ydGVyKCkuYWRkRXJyb3JNZXNzYWdlKHJlc291cmNlLCAoKFNBWFBhcnNlRXhjZXB0aW9uKXRocm93YWJsZSkuZ2V0TWVzc2FnZSgpLCBuLCBjKTsKLS8vCX0KLS8vCWVsc2UKLS8vCXsKLS8vCQlnZXRPckNyZWF0ZVJlcG9ydGVyKCkuYWRkRXJyb3JNZXNzYWdlKHJlc291cmNlLCBhZS5nZXRNZXNzYWdlKCksIDAsIDApOwotLy8JfQotLy8gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudmFsaWRhdGUuVmFsaWRhdGVBY3Rpb24jY3JlYXRlTWFya2VycyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UsIGphdmEudXRpbC5MaXN0LCBpbnQpCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGNyZWF0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBMaXN0IGxpc3QsIGludCBtYXJrZXIpCi0vLyAgeyAKLS8vICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLS8vICAgIHsKLS8vICAgICAgQXNzZXJ0aW9uRXJyb3IgYXNzZXJ0aW9uRXJyb3IgPSAoQXNzZXJ0aW9uRXJyb3IpIGkubmV4dCgpOwotLy8KLS8vICAgICAgaW50IG4gPSBhc3NlcnRpb25FcnJvci5nZXRMaW5lKCk7Ci0vLyAgICAgIGludCBjID0gYXNzZXJ0aW9uRXJyb3IuZ2V0Q29sdW1uKCk7Ci0vLyAgICAgIAotLy8gICAgICBpZihtYXJrZXIgPT0gV0FSTklOR19NQVJLRVIpCi0vLyAgICAgIHsKLS8vICAgICAgICBnZXRPckNyZWF0ZVJlcG9ydGVyKCkuYWRkV2FybmluZ01lc3NhZ2UocmVzb3VyY2UsIGFzc2VydGlvbkVycm9yLmdldEVycm9yTWVzc2FnZSgpLCBuLCBjKTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChtYXJrZXIgPT0gRVJST1JfTUFSS0VSKQotLy8gICAgICB7Ci0vLyAgICAgICAgZ2V0T3JDcmVhdGVSZXBvcnRlcigpLmFkZEVycm9yTWVzc2FnZShyZXNvdXJjZSwgYXNzZXJ0aW9uRXJyb3IuZ2V0RXJyb3JNZXNzYWdlKCksIG4sIGMpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotICAKLSAgLyoqCi0gICAqIENsZWFyIGFsbCB0aGUgbWFya2VycyBvbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgZ2VuZXJhdGVkIGJ5IHRoaXMgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSB3aXRoIHRoZSBtYXJrZXJzIHRvIGNsZWFyLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBjbGVhck1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlKQotLy8gIHsKLS8vICAgIGdldE9yQ3JlYXRlUmVwb3J0ZXIoKS5yZW1vdmVBbGxNZXNzYWdlcyhyZXNvdXJjZSk7Ci0vLyAgfQotCi0gLyoqCi0gICogSWYgYSByZXBvcnRlciBkb2Vzbid0IGV4aXN0IGNyZWF0ZXMgaXQgb3IgdXNlcyB0aGUgcmVwb3J0ZXIgYWxyZWFkeSBjcmVhdGVkLgotICAqIAotICAqIEByZXR1cm4gVGhlIHJlcG9ydGVyLgotICAqLwotLy8gIHByb3RlY3RlZCBJUmVwb3J0ZXIgZ2V0T3JDcmVhdGVSZXBvcnRlcigpCi0vLyAgewotLy8gICAgaWYgKHJlcG9ydGVyID09IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIHJlcG9ydGVyID0gUmVwb3J0ZXJSZWdpc3Rlci5nZXRJbnN0YW5jZSgpLmdldFJlcG9ydGVyKFdTSU1lc3NhZ2VWYWxpZGF0b3IuV1NJX01FU1NBR0VfVkFMSURBVE9SX0lEKTsKLS8vICAgIH0KLS8vICAgIHJldHVybiByZXBvcnRlcjsKLS8vICB9Ci0KLSAvKioKLSAgKiBHZXRzIHRoZSB2YWxpZGF0b3IuCi0gICogCi0gICogQHJldHVybiBSZXR1cm5zIGEgSVZhbGlkYXRvci4KLSAgKi8KLSAgcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLQotIC8qKgotICAqIFNldHMgdGhlIHZhbGlkYXRvci4KLSAgKiAKLSAgKiBAcGFyYW0gdmFsaWRhdG9yIFRoZSB2YWxpZGF0b3IgdG8gc2V0LgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoSVZhbGlkYXRvciB2YWxpZGF0b3IpCi0gIHsKLSAgICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvYWN0aW9uRGVsZWdhdGVzL1ZhbGlkYXRlV1NJTG9nRmlsZUFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9hY3Rpb25EZWxlZ2F0ZXMvVmFsaWRhdGVXU0lMb2dGaWxlQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0MTBlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9hY3Rpb25EZWxlZ2F0ZXMvVmFsaWRhdGVXU0lMb2dGaWxlQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuYWN0aW9ucy5hY3Rpb25EZWxlZ2F0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLldTSU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLldTSVZhbGlkYXRlQWN0aW9uOwotCi0KLS8qKgotICogQWN0aW9uIGRlbGVnYXRlIGZvciB2YWxpZGF0aW5nIGEgV1MtSSBsb2cgZmlsZS4KLSAqIAotICogQGF1dGhvciBEYXZpZCBMYXV6b24sIElCTQotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVXU0lMb2dGaWxlQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUKLXsKLSAgLyoqCi0gICAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24uCi0gICAqLwotICBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGVXU0lMb2dGaWxlQWN0aW9uRGVsZWdhdGUoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBPYmplY3QgIG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgICB7Ci0gICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSlvYmo7Ci0gICAgICAgICAgV1NJTWVzc2FnZVZhbGlkYXRvciBtZXNzYWdlVmFsaWRhdG9yID0gbmV3IFdTSU1lc3NhZ2VWYWxpZGF0b3IoKTsKLSAgICAgICAgICBXU0lWYWxpZGF0ZUFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IG5ldyBXU0lWYWxpZGF0ZUFjdGlvbihmaWxlLCB0cnVlKTsKLSAgICAgICAgICB2YWxpZGF0ZUFjdGlvbi5zZXRWYWxpZGF0b3IobWVzc2FnZVZhbGlkYXRvcik7Ci0gICAgICAgICAgdmFsaWRhdGVBY3Rpb24ucnVuKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL2FjdGlvbkRlbGVnYXRlcy9WYWxpZGF0ZVdTSVByb2ZpbGVBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvYWN0aW9uRGVsZWdhdGVzL1ZhbGlkYXRlV1NJUHJvZmlsZUFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MjZjMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvYWN0aW9uRGVsZWdhdGVzL1ZhbGlkYXRlV1NJUHJvZmlsZUFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLmFjdGlvbkRlbGVnYXRlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5Mb2dCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwud2l6YXJkcy5WYWxpZGF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuV1NJVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2c7Ci0KLS8qKgotICogQWN0aW9uIGRlbGVnYXRlIGZvciB0aGUgV1MtSSB2YWxpZGF0b3IuCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgTGF1em9uLCBJQk0KLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlV1NJUHJvZmlsZUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZQotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgV1MtSSBNZXNzYWdlIExvZyBmaWxlbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HX0ZJTEVOQU1FID0gImxvZy53c2ltc2ciOwotCi0gIC8qKgotICAgKiBUaGUgSFRUUCBwcm90b2NvbC4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFAgPSAiaHR0cDovLyI7Ci0gIAotICAKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHRhZyBmb3IgV1NETCBsb2NhdGlvbnMuCi0gICAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBXU0RMID0gIj9XU0RMIjsKLSAgCi0gIC8qKgotICAgKiBUaGUgY3VycmVudCBzZWxlY3Rpb24sIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc2VsZWN0aW9uLgotICAgKi8KLSAgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgLyoqCi0gICAqIFRoZSBsaXN0IG9mIG1lc3NhZ2VzIGluIHRoZSBmb3JtIG9mIHJlcXVlc3QtcmVzcG9uc2UgcGFpcnMuCi0gICAqLwotICBSZXF1ZXN0W10gcmVxdWVzdFJlc3BvbnNlczsKLQotICAvKioKLSAgICogVGhlIHZpZXcgdGhhdCBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhpcyBkZWxlZ2F0ZS4KLSAgICovCi0gIElWaWV3UGFydCB2aWV3OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0ZVdTSVByb2ZpbGVBY3Rpb25EZWxlZ2F0ZSgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KQotICB7Ci0gICAgdGhpcy52aWV3ID0gdmlldzsKLSAgfQotCi0gIC8qKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotICB7Ci0gICAgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpCi0gICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgewotICAgICAgICB2YWxpZGF0ZShwcm9ncmVzc01vbml0b3IpOwotICAgICAgfQotICAgIH07Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgb3BlcmF0aW9uLnJ1bihudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICB7Ci0gICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHZhbGlkYXRlIGFjdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVmFsaWRhdGlvbldpemFyZCB2YWxpZGF0ZVdpemFyZCA9IG5ldyBWYWxpZGF0aW9uV2l6YXJkKERFRkFVTFRfTE9HX0ZJTEVOQU1FKTsKLQotICAgICAgLy9UT0RPIHJlcXVlc3RSZXNwb25zZXMgPSBNb25pdG9yQ29yZS5nZXRSZXF1ZXN0cygpOwotICAgICAgTGlzdCB3c2RsbG9jcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGlmKHJlcXVlc3RSZXNwb25zZXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAJZm9yIChpbnQgaT0wOyBpPHJlcXVlc3RSZXNwb25zZXMubGVuZ3RoOyBpKyspCi0gICAgICAJewotICAgICAgCSAgUmVxdWVzdCByZXFyZXNwID0gcmVxdWVzdFJlc3BvbnNlc1tpXTsKLSAgICAgIAkgIFN0cmluZyByZW1vdGVob3N0ID0gcmVxcmVzcC5nZXRSZW1vdGVIb3N0KCk7Ci0gICAgICAJICBpbnQgcmVtb3RlcG9ydCA9IHJlcXJlc3AuZ2V0UmVtb3RlUG9ydCgpOwotICAgICAgCSAgU3RyaW5nIHJlbW90ZWxhYmVsID0gcmVxcmVzcC5nZXROYW1lKCk7Ci0gICAgICAJICBTdHJpbmcgbG9jYXRpb24gPSBIVFRQICsgcmVtb3RlaG9zdCArICI6IiArIHJlbW90ZXBvcnQgKyByZW1vdGVsYWJlbCArIFdTREw7Ci0gICAgICAJICBpZighd3NkbGxvY3MuY29udGFpbnMobG9jYXRpb24pKQotICAgICAgCSAgewotICAgICAgCSAgICB3c2RsbG9jcy5hZGQobG9jYXRpb24pOwotICAgICAgCSAgfQotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIHZhbGlkYXRlV2l6YXJkLnNldFdTRExMb2NhdGlvbnMoKFN0cmluZ1tdKXdzZGxsb2NzLnRvQXJyYXkobmV3IFN0cmluZ1t3c2RsbG9jcy5zaXplKCldKSk7Ci0gICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgdmFsaWRhdGVXaXphcmQpOwotICAgICAgd2l6YXJkRGlhbG9nLmNyZWF0ZSgpOwotCi0gICAgICBpbnQgcmVzdWx0ID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQotICAgICAgaWYgKHZhbGlkYXRlV2l6YXJkLmlzVmFsaWQoKSAmJiAocmVzdWx0ICE9IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cuQ0FOQ0VMKSkKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgdGhlIGNvbnRhaW5lciBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgaXQgbm93Ci0gICAgICAgIGNoZWNrQW5kQ3JlYXRlQ29udGFpbmVyKHZhbGlkYXRlV2l6YXJkLmdldENvbnRhaW5lckZ1bGxQYXRoKCkpOwotCi0gICAgICAgIElGaWxlIGZpbGUgPSB2YWxpZGF0ZVdpemFyZC5nZXRGaWxlKCk7Ci0gICAgICAgIC8vU3RyaW5nIGZpbGVuYW1lID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgLy9JTW9uaXRvciBtb25pdG9yID0gTW9uaXRvckNvcmUuZ2V0UmVxdWVzdHMoKTsKLSAgICAgICAgLy9tb25pdG9yLmdldEVsZW1lbnRzKCk7Ci0gICAgICAgIExvZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBMb2dCdWlsZGVyKGZpbGUpOwotICAgICAgICBMb2cgbG9nID0gYnVpbGRlci5idWlsZExvZyhyZXF1ZXN0UmVzcG9uc2VzKTsKLQotICAgICAgICBidWlsZGVyLndyaXRlTG9nKGxvZyk7Ci0gICAgICAgIGZpbGUucmVmcmVzaExvY2FsKDEsIHByb2dyZXNzTW9uaXRvcik7Ci0gICAgICAgIAotICAgICAgICBXU0lWYWxpZGF0b3IgbWVzc2FnZVZhbGlkYXRvciA9IG5ldyBXU0lWYWxpZGF0b3IoKTsKLSAgICAgICAgaWYodmFsaWRhdGVXaXphcmQuaW5jbHVkZVdTRExGaWxlKCkpCi0gICAgICAgIHsJCi0gICAgICAgIAlTdHJpbmcgd3NkbGZpbGUgPSB2YWxpZGF0ZVdpemFyZC5nZXRXU0RMRmlsZSgpOwotICAgICAgICAJU3RyaW5nIG5hbWUgPSB2YWxpZGF0ZVdpemFyZC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAJU3RyaW5nIG5hbWVzcGFjZSA9IHZhbGlkYXRlV2l6YXJkLmdldE5hbWVzcGFjZSgpOwotICAgICAgICAJU3RyaW5nIHBhcmVudG5hbWUgPSB2YWxpZGF0ZVdpemFyZC5nZXRQYXJlbnROYW1lKCk7Ci0gICAgICAgIAlTdHJpbmcgdHlwZSA9IHZhbGlkYXRlV2l6YXJkLmdldFR5cGUoKTsKLSAgICAgICAgCW1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGUoZmlsZSwgd3NkbGZpbGUsIG5hbWUsIG5hbWVzcGFjZSwgcGFyZW50bmFtZSwgdHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CQotICAgICAgICAJbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZShmaWxlKTsKLSAgICAgICAgfQotICAgICAgICAvL1dTSVZhbGlkYXRlQWN0aW9uIHZhbGlkYXRlQWN0aW9uID0gbmV3IFdTSVZhbGlkYXRlQWN0aW9uKGZpbGUsIHRydWUpOwotLy8gICAgICAgIHZhbGlkYXRlQWN0aW9uLnNldFZhbGlkYXRvcihtZXNzYWdlVmFsaWRhdG9yKTsKLSAgICAgICAgLy92YWxpZGF0ZUFjdGlvbi5ydW4oKTsKLS8vICAgICAgICBXU0lWYWxpZGF0b3Igd3NpVmFsaWRhdG9yID0gbmV3IFdTSVZhbGlkYXRvcigpOwotLy8gICAgICAgIHdzaVZhbGlkYXRvci52YWxpZGF0ZShmaWxlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIH0KLSAKLSAgLyoqCi0gICAqIElmIHRoZSBjb250YWluZXIgZG9lc24ndCBleGlzdCBmb3IgdGhlIHNlbGVjdGVkIElGaWxlLCBjcmVhdGUgaXQgbm93LgotICAgKiAKLSAgICogQHBhcmFtIGNvbnRhaW5lclBhdGggVGhlIGNvbnRhaW5lciBmb3IgdGhlIHNlbGVjdGVkIElGaWxlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQW5kQ3JlYXRlQ29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgpCi0gIHsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoY29udGFpbmVyUGF0aCk7Ci0gICAgCi0gICAgLy8gSWYgdGhlIGNvbnRhaW5lciBkb2Vzbid0IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UsIGNyZWF0ZSBpdC4KLSAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkgCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIENvbnRhaW5lckdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29udGFpbmVyR2VuZXJhdG9yKGNvbnRhaW5lclBhdGgpOwotICAgICAgICBnZW5lcmF0b3IuZ2VuZXJhdGVDb250YWluZXIobnVsbCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvaWNvbnMvd3NpX2xvZ2ZpbGVfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL2ljb25zL3dzaV9sb2dmaWxlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYzhkM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvaWNvbnMvd3NpX2xvZ2ZpbGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFNpbmdsZUZpbGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFNpbmdsZUZpbGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4NzExMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RTaW5nbGVGaWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLklXb3JrYmVuY2hHcmFwaGljQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaEltYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlVmlldzsKLWltcG9ydCAgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5XU0lVSVBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZwoteyAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU2VsZWN0U2luZ2xlRmlsZVZpZXcgc2VsZWN0U2luZ2xlRmlsZVZpZXc7IAotICBwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotIAotICBwdWJsaWMgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkgCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotICAgIH0KLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldyA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlVmlldyhzZWxlY3Rpb24sIGlzRmlsZU1hbmRhdG9yeSkKLSAgICB7Ci0JICBwdWJsaWMgdm9pZCBjcmVhdGVGaWx0ZXJDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0JICB7Ci0JCVNlbGVjdFNpbmdsZUZpbGVEaWFsb2cudGhpcy5jcmVhdGVGaWx0ZXJDb250cm9sKGNvbXBvc2l0ZSk7Ci0JICB9Ci0gICAgfTsgIAotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIAotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gMzUwOwotICAgIGdkLmhlaWdodEhpbnQgPSAzNTA7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOyAgIAotICAgICAgICAgICAgCi0gICAgU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIoKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xDb21wbGV0ZShib29sZWFuIGlzQ29tcGxldGUpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBva0J1dHRvbi5zZXRFbmFibGVkKGlzQ29tcGxldGUpOwotICAgICAgfQotICAgIH07Ci0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0TGlzdGVuZXIobGlzdGVuZXIpOwotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3LmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLSAgICByZXR1cm4gZGlhbG9nQXJlYTsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSAKLSAgewotICAgIG9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0gICAgb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0gIH0gIAotICAgICAgIAotICBwdWJsaWMgdm9pZCBjcmVhdGUoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlKCk7Ci0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0VmlzaWJsZUhlbHBlcih0cnVlKTsKLSAgICBnZXRTaGVsbCgpLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9ESUFMT0dfU1NfRklMRV9TSEVMTF9URVhUIikpOwotICAgIHNldFRpdGxlKFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfRElBTE9HX1NTX0ZJTEVfVElUTEUiKSk7Ci0gICAgc2V0TWVzc2FnZShXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX0RJQUxPR19TU19GSUxFX0RFU0NSSVBUSU9OIikpOwotICAgIHNldFRpdGxlSW1hZ2UoV29ya2JlbmNoSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJV29ya2JlbmNoR3JhcGhpY0NvbnN0YW50cy5JTUdfRExHQkFOX1NBVkVBU19ETEcpLmNyZWF0ZUltYWdlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlRmlsdGVyQ29tYm8oQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgewotICB9IAotCi0gIHB1YmxpYyBJRmlsZSBnZXRGaWxlKCkKLSAgeyAgCi0gICAgcmV0dXJuIHNlbGVjdFNpbmdsZUZpbGVWaWV3LmdldEZpbGUoKTsKLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykKLSAgeyAKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjcmVhdGVGaWx0ZXJDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC93aXphcmRzL1ZhbGlkYXRpb25XaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC93aXphcmRzL1ZhbGlkYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUzZjM5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvd2l6YXJkcy9WYWxpZGF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLldTSVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlTmF2aWdhdG9yOwotCi0vKioKLSAqIFRoaXMgd2l6YXJkIGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgCi0gKiBXUy1JIE1lc3NhZ2UgTG9nIGZpbGUgZm9yIHB1cnBvc2VzIG9mIHZhbGlkYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgTGF1em9uLCBJQk0KLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbldpemFyZCBleHRlbmRzIFdpemFyZAotewotICAvKioKLSAgICogV2l6YXJkIHBhZ2UgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIAotICAgKiBXUy1JIE1lc3NhZ2UgTG9nIGZpbGUgZm9yIHB1cnBvc2VzIG9mIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgVmFsaWRhdGlvbldpemFyZExvZ1BhZ2UgbG9nUGFnZTsKLQotICAvKioKLSAgICogV2l6YXJkIHBhZ2UgdG8gb3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBsb2NhdGlvbgotICAgKiBvZiB0aGUgV1NETCBkb2N1bWVudCBmb3IgdGhlIFdlYiBzZXJ2aWNlLgotICAgKi8KLSAgcHJvdGVjdGVkIFZhbGlkYXRpb25XaXphcmRXU0RMUGFnZSB3c2RsUGFnZTsKLQotICAvKioKLSAgICogV2l6YXJkIHBhZ2UgdG8gc3BlY2lmeSB0aGUgbmFtZSwgdHlwZSBhbmQgbmFtZXNwYWNlCi0gICAqIGZvciB0aGUgV1NETCBlbGVtZW50IHRvIGFuYWx5emUuCi0gICAqLwotICBwcm90ZWN0ZWQgVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZSB3c2RsQ29udGVudFBhZ2U7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgV1MtSSBNZXNzYWdlIGZpbGVuYW1lIHBhc3NlZCBpbiB0aGUgQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGVuYW1lOwotCi0gIC8qKgotICAgKiBUaGUgc2VsZWN0ZWQgV1MtSSBNZXNzYWdlIExvZyBmaWxlLgotICAgKi8KLSAgcHJvdGVjdGVkIElGaWxlIGZpbGU7Ci0KLSAgLyoqCi0gICAqIFRoZSBjb250YWluZXIgaG9sZGluZyB0aGUgc2VsZWN0ZWQgV1MtSSBNZXNzYWdlIExvZyBmaWxlLgotICAgKi8KLSAgcHJvdGVjdGVkIElQYXRoIGNvbnRhaW5lckZ1bGxQYXRoOwotCi0gIC8qKgotICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciBzZWxlY3RlZCBmaWxlIGlzIHZhbGlkLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZDsKLQotICAvKioKLSAgICogVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnRuYW1lOwotCi0gIC8qKgotICAgKiBUaGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudG5hbWU7Ci0KLSAgLyoqCi0gICAqIFRoZSB0eXBlIG9mIHRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCi0gIC8qKgotICAgKiBUaGUgV1NETCBmaWxlIHRvIHVzZSBmb3IgdmFsaWRhdGlvbjsKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbGZpbGU7Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgYSBXU0RMIGZpbGUgaXMgaW5jbHVkZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGluY2x1ZGV3c2RsZmlsZTsKLQotICAKLSAgLyoqCi0gICAqIFRoaXMgbGlzdCBvZiBXU0RMIGxvY2F0aW9ucyB0aGUgdXNlciBjYW4gY2hvb3NlIGZyb20uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nW10gd3NkbGxvY2F0aW9ucyA9IG51bGw7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBEZWZhdWx0IG1lc3NhZ2UgbG9nIGZpbGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uV2l6YXJkKFN0cmluZyBmaWxlbmFtZSkKLSAgewotICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgICB0aGlzLnNldFdpbmRvd1RpdGxlKFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfV0laQVJEX1ZBTElEQVRFX0xPR19USVRMRSIpKTsKLSAgICBzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigKLSAgICAgIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShXU0lVSVBsdWdpbi5jbGFzcywgUmVzb3VyY2UuVkFMSURBVEVfV1NJX0xPR0ZJTEVfV0laKSk7Ci0gICAgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNhZGRQYWdlcygpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpCi0gIHsKLSAgICBsb2dQYWdlID0gbmV3IFZhbGlkYXRpb25XaXphcmRMb2dQYWdlKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0UmVzb3VyY2VOYXZpZ2F0b3JTZWxlY3Rpb24oKSwgZmlsZW5hbWUpOwotICAgIHdzZGxQYWdlID0gbmV3IFZhbGlkYXRpb25XaXphcmRXU0RMUGFnZSgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFJlc291cmNlTmF2aWdhdG9yU2VsZWN0aW9uKCkpOwotICAgIHdzZGxDb250ZW50UGFnZSA9IG5ldyBWYWxpZGF0aW9uV2l6YXJkV1NETENvbnRlbnRQYWdlKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0UmVzb3VyY2VOYXZpZ2F0b3JTZWxlY3Rpb24oKSk7Ci0gICAgYWRkUGFnZShsb2dQYWdlKTsKLSAgICBhZGRQYWdlKHdzZGxQYWdlKTsKLSAgICBhZGRQYWdlKHdzZGxDb250ZW50UGFnZSk7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFRydWUgaWYgYSBXU0RMIGZpbGUgaXMgaW5jbHVkZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGluY2x1ZGVXU0RMRmlsZSgpCi0gIHsKLSAgICBpZiAoIWlzVmFsaWQpCi0gICAgewotICAgICAgcmV0dXJuIHdzZGxQYWdlLmluY2x1ZGVXU0RMRmlsZSgpOwotICAgIH0KLSAgICByZXR1cm4gaW5jbHVkZXdzZGxmaWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZWxlbWVudCBuYW1lIHRvIHZhbGlkYXRlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZWxlbWVudCBuYW1lIHRvIHZhbGlkYXRlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbmFtZXNwYWNlIGZvciB0aGUgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHBhcmVudG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdHlwZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETEZpbGUoKQotICB7Ci0gICAgaWYgKCFpc1ZhbGlkKQotICAgIHsKLSAgICAgIHJldHVybiB3c2RsUGFnZS5nZXRXU0RMRmlsZSgpOwotICAgIH0KLSAgICByZXR1cm4gd3NkbGZpbGU7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXROZXh0UGFnZShvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UpCi0gICAqLwotICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgY3VycmVudFBhZ2UpCi0gIHsKLSAgICBpZiAoY3VycmVudFBhZ2UgPT0gd3NkbFBhZ2UpCi0gICAgewotICAgICAgaWYgKCF3c2RsUGFnZS5pbmNsdWRlV1NETEZpbGUoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgV1NETEZhY3RvcnkgZmFjdG9yeSA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBmYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZkVsZW0gPSByZWFkZXIucmVhZFdTREwoZ2V0V1NETEZpbGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIFdTREwgZmlsZSB0aGVyZSBpcyBubyBuZXh0IHBhZ2UuCi0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldE5leHRQYWdlKGN1cnJlbnRQYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdGVkIGZpbGUgaXMgYSB2YWxpZCBXUy1JIE1lc3NhZ2UgTG9nIGZpbGVuYW1lLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzZWxlY3RlZCBmaWxlIGlzIGEgdmFsaWQgV1MtSSBNZXNzYWdlIExvZyBmaWxlbmFtZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotICB7Ci0gICAgcmV0dXJuIGlzVmFsaWQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7Ci0gICAgZmlsZSA9IGxvZ1BhZ2UuZ2V0RmlsZSgpOwotICAgIGNvbnRhaW5lckZ1bGxQYXRoID0gbG9nUGFnZS5nZXRDb250YWluZXJGdWxsUGF0aCgpOwotICAgIGluY2x1ZGV3c2RsZmlsZSA9IHdzZGxQYWdlLmluY2x1ZGVXU0RMRmlsZSgpOwotICAgIHdzZGxmaWxlID0gd3NkbFBhZ2UuZ2V0V1NETEZpbGUoKTsKLSAgICBlbGVtZW50bmFtZSA9IHdzZGxDb250ZW50UGFnZS5nZXRFbGVtZW50TmFtZSgpOwotICAgIG5hbWVzcGFjZSA9IHdzZGxDb250ZW50UGFnZS5nZXROYW1lc3BhY2UoKTsKLSAgICBwYXJlbnRuYW1lID0gd3NkbENvbnRlbnRQYWdlLmdldFBhcmVudE5hbWUoKTsKLSAgICB0eXBlID0gd3NkbENvbnRlbnRQYWdlLmdldFR5cGUoKTsKLSAgICBpc1ZhbGlkID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmaWxlIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIGluIHRoZSBjaG9vc2UgcGFnZS4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGZpbGUgc2VsZWN0ZWRieSB0aGUgdXNlciBpbiB0aGUgY2hvb3NlIHBhZ2UuCi0gICAqLwotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0gIHsKLSAgICByZXR1cm4gZmlsZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBJUGF0aCBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBJRmlsZS4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIElQYXRoIGNvbnRhaW5pbmcgdGhlIHNlbGVjdGVkIElGaWxlLgotICAgKi8KLSAgcHVibGljIElQYXRoIGdldENvbnRhaW5lckZ1bGxQYXRoKCkKLSAgewotICAgIHJldHVybiBjb250YWluZXJGdWxsUGF0aDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gaW4gdGhlIFJlc291cmNlIE5hdmlnYXRvciB2aWV3LgotICAgKiAKLSAgICogQHJldHVybiB0aGUgc2VsZWN0aW9uIGluIHRoZSBSZXNvdXJjZSBOYXZpZ2F0b3Igdmlldy4KLSAgICovCi0gIHB1YmxpYyBJU2VsZWN0aW9uIGdldFJlc291cmNlTmF2aWdhdG9yU2VsZWN0aW9uKCkKLSAgewotICAgIElWaWV3UmVmZXJlbmNlIHZpZXdQYXJ0c1tdID0KLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldFZpZXdSZWZlcmVuY2VzKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZpZXdQYXJ0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAodmlld1BhcnRzW2ldIGluc3RhbmNlb2YgUmVzb3VyY2VOYXZpZ2F0b3IpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKFJlc291cmNlTmF2aWdhdG9yKSB2aWV3UGFydHNbaV0pLmdldFZpZXdTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBsaXN0IG9mIFdTREwgbG9jYXRpb25zIHRvIGxldCB0aGUgdXNlciBjaG9vc2UgZnJvbS4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsbG9jYXRpb25zIEEgbGlzdCBvZiBXU0RMIGRvY3VtZW50IGxvY2F0aW9ucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdTRExMb2NhdGlvbnMoU3RyaW5nW10gd3NkbGxvY2F0aW9ucykgCi0gIHsKLQl0aGlzLndzZGxsb2NhdGlvbnMgPSB3c2RsbG9jYXRpb25zOwotCQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsaXN0IG9mIFdTREwgbG9jYXRpb25zIHRoZSB1c2VyIGNhbiBjaG9vc2UgZnJvbS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgV1NETCBsb2NhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0V1NETExvY2F0aW9ucygpCi0gIHsKLSAgCXJldHVybiB3c2RsbG9jYXRpb25zOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvd2l6YXJkcy9WYWxpZGF0aW9uV2l6YXJkTG9nUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZExvZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyYzRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvd2l6YXJkcy9WYWxpZGF0aW9uV2l6YXJkTG9nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5XU0lVSVBsdWdpbjsKLQotLyoqCi0gKiBXaXphcmQgcGFnZSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgCi0gKiBXUy1JIE1lc3NhZ2UgTG9nIGZpbGUgZm9yIHB1cnBvc2VzIG9mIHZhbGlkYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgTGF1em9uLCBJQk0KLSAqLwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbldpemFyZExvZ1BhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlCi17Ci0gIC8qKgotICAgKiBSZWNvbW1lbmRlZCBleHRlbnNpb24gZm9yIGEgV1MtSSBNZXNzYWdlIExvZyBmaWxlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NJX0xPR19FWFRFTlNJT04gPSAid3NpbXNnIjsKLSAKLSAgLyoqCi0gICAqIERlZmF1bHQgV1MtSSBNZXNzYWdlIGZpbGVuYW1lIHBhc3NlZCBpbiB0aGUgQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGVuYW1lOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHNlbGVjdGlvbjogc2VsZWN0aW9uIGluIHRoZSBSZXNvdXJjZSBOYXZpZ2F0b3Igdmlldy4KLSAgICogQHBhcmFtIGZpbGVuYW1lOiBkZWZhdWx0IG1lc3NhZ2UgbG9nIGZpbGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uV2l6YXJkTG9nUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIFN0cmluZyBmaWxlbmFtZSkKLSAgewotICAgIHN1cGVyKCJWYWxpZGF0aW9uV2l6YXJkTG9nUGFnZSIsIHNlbGVjdGlvbik7Ci0gICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgIHRoaXMuc2V0VGl0bGUoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9TRUxFQ1RfTE9HX0ZJTEVOQU1FX0hFQURJTkciKSk7Ci0gICAgdGhpcy5zZXREZXNjcmlwdGlvbihXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX1NFTEVDVF9MT0dfRklMRU5BTUVfRVhQTCIpKTsKLSAgfQotCi0KLSAgLyoqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgIHN1cGVyLnNldEZpbGVOYW1lKGZpbGVuYW1lKTsKLSAgICBzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgZmlsZS4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIElGaWxlLiAgCi0gICAqLwotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0gIHsKLSAgICBTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotICAgIFN0cmluZyBmaWxlRXh0ZW5zaW9uID0gKG5ldyBQYXRoKGZpbGVOYW1lKSkuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgIAotICAgIGlmIChmaWxlRXh0ZW5zaW9uID09IG51bGwpCi0gICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLmNvbmNhdCgiLiIgKyBXU0lfTE9HX0VYVEVOU0lPTik7Ci0gICAgICAKLSAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGdldENvbnRhaW5lckZ1bGxQYXRoKCkuYXBwZW5kKGZpbGVOYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHNlbGVjdGVkIGZpbGUgaXMgYSB2YWxpZCBXUy1JIE1lc3NhZ2UgTG9nIGZpbGVuYW1lLgotICAgKiAKLSAgICogU2luY2UgdGhlIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgZG9lcyBub3QgcHJvdmlkZSBhbiBpbnRlcmZhY2UgdG8KLSAgICogYWxsb3cgdGhlIGZpbGUgc3BlY2lmaWVkIHRvIGFscmVhZHkgZXhpc3QgKGl0IGdpdmVzIGFuIGVycm9yIHRoYXQgdGhlCi0gICAqIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBhbiBubyB3YXkgb2YgYWxsb3dpbmcgaXQgdG8gcGFzcyksIGFuZCB3ZSB3YW50Ci0gICAqIHRvIGFsbG93IHRoZSBmaWxlIHRvIGV4aXN0LCBzbyB0aGF0IHdlIGNhbiBvdmVyd3JpdGUgaXQsIHdlIGhhdmUgdG8KLSAgICogb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGFuZCBkbyBzb21lIG1hZ2ljIHRvIGFsbG93IHRoaXMgY2FzZSB0byBwYXNzLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgc2VsZWN0ZWQgZmlsZSBpcyBhIHZhbGlkIFdTLUkgTWVzc2FnZSBMb2cgZmlsZW5hbWUuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlI3ZhbGlkYXRlUGFnZSgpCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSAKLSAgewotICAgIFN0cmluZyBmaWxlRXh0ZW5zaW9uID0gKG5ldyBQYXRoKGdldEZpbGVOYW1lKCkpKS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0gICAgaWYgKGZpbGVFeHRlbnNpb24gIT0gbnVsbCkgCi0gICAgewotICAgICAgaWYgKGZpbGVFeHRlbnNpb24uY29tcGFyZVRvKFdTSV9MT0dfRVhURU5TSU9OKSAhPSAwKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX0VSUk9SX0lOVkFMSURfTE9HX0ZJTEVfRVhURU5TSU9OIikpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIEVzc2VudGlhbGx5LCB3ZSB0YWtlIHRoZSBjb250YWluZXIgYW5kIGNvbmNhdCB0aGUgZmlsZSB0byBpdCwgYW5kCi0gICAgLy8gY2hlY2sgaWYgaXRzIGluIHRoZSB3b3Jrc3BhY2UsIGlmIGl0IGlzLCB0aGVuIGl0IGV4aXN0cyBhbmQgd2UgY2FuIAotICAgIC8vIHByb2NlZWQuIE90aGVyd2lzZSwgY29udGludWUgd2l0aCB0aGUgZGVmYXVsdCB2YWxpZGF0aW5nLgotICAgIGlmICggKGdldENvbnRhaW5lckZ1bGxQYXRoKCkgIT0gbnVsbCkgJiYgKGdldENvbnRhaW5lckZ1bGxQYXRoKCkuaXNFbXB0eSgpID09IGZhbHNlKQotICAgICAgICAgICAmJiAoZ2V0RmlsZU5hbWUoKS5jb21wYXJlVG8oIiIpICE9IDApKQotICAgIHsKLSAgICAgIFBhdGggZnVsbFBhdGg7Ci0gICAgICAgICAgICAKLSAgICAgIGlmIChmaWxlRXh0ZW5zaW9uICE9IG51bGwpCi0gICAgICAgIGZ1bGxQYXRoID0gbmV3IFBhdGgoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS50b1N0cmluZygpICsgJy8nICsgZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGZ1bGxQYXRoID0gbmV3IFBhdGgoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS50b1N0cmluZygpICsgJy8nICsgZ2V0RmlsZU5hbWUoKSArICIuIiArIFdTSV9MT0dfRVhURU5TSU9OKTsKLSAgICAgIAotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGZ1bGxQYXRoKTsKLSAgICAgIAotICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCi0gICAgICAgIHNldE1lc3NhZ2UoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOSU5HX0ZJTEVfQUxSRUFEWV9FWElTVFMiKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNldE1lc3NhZ2UobnVsbCk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjU3YTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC93aXphcmRzL1ZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLldTSVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogV2l6YXJkIHBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIAotICogV1NETCBkb2N1bWVudCBmb3IgdGhlIFdlYiBzZXJ2aWNlLgotICogCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiwgSUJNCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLSAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlQgPSAicG9ydCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElPTiA9ICJvcGVyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HID0gImJpbmRpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUVFlQRSA9ICJwb3J0dHlwZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAibWVzc2FnZSI7Ci0gIC8qKgotICAgKiBBY2Nlc3MgdG8gdGhlIGluY2x1ZGVXU0RMIGZsYWcuICAKLSAgICovCi0gIHByb3RlY3RlZCBCdXR0b24gd3NkbFBvcnRCdXR0b247Ci0gIHByb3RlY3RlZCBCdXR0b24gd3NkbEJpbmRpbmdCdXR0b247Ci0gIHByb3RlY3RlZCBCdXR0b24gd3NkbFBvcnRUeXBlQnV0dG9uOwotICBwcm90ZWN0ZWQgQnV0dG9uIHdzZGxPcGVyYXRpb25CdXR0b247Ci0gIHByb3RlY3RlZCBCdXR0b24gd3NkbE1lc3NhZ2VCdXR0b247Ci0KLSAgcHJvdGVjdGVkIENvbWJvIG5hbWVDb21ibzsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZXNwYWNlVGV4dDsKLSAgLy9wcm90ZWN0ZWQgQ29tYm8gcGFyZW50Q29tYm87Ci0gIC8vcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0gIHByb3RlY3RlZCBUZXh0IHBhcmVudG5hbWVUZXh0OwotCi0gIHByb3RlY3RlZCBMaXN0IHBvcnRzID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3Qgb3BlcmF0aW9ucyA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IGJpbmRpbmdzID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3QgcG9ydHR5cGVzID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3QgbWVzc2FnZXMgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBzZWxlY3Rpb246IHNlbGVjdGlvbiBpbiB0aGUgUmVzb3VyY2UgTmF2aWdhdG9yIHZpZXcuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlcigiVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZSIpOwotICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIHRoaXMuc2V0VGl0bGUoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9TRUxFQ1RfV1NETF9FTEVNRU5UX0hFQURJTkciKSk7Ci0gICAgdGhpcy5zZXREZXNjcmlwdGlvbihXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX1NFTEVDVF9XU0RMX0VMRU1FTlRfRVhQTCIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbHdheXMgcmV0dXJucyB0cnVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKQotICB7Ci0gICAgaWYgKCgoVmFsaWRhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLmluY2x1ZGVXU0RMRmlsZSgpKQotICAgIHsKLSAgICAgIGludCBzZWxlY3Rpb24gPSBuYW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGlmIChzZWxlY3Rpb24gIT0gLTEgJiYgIW5hbWVDb21iby5nZXRJdGVtKHNlbGVjdGlvbikuZXF1YWxzKCIiKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoKLSAgICogQ3JlYXRlcyB0aGUgdG9wIGxldmVsIGNvbnRyb2wgZm9yIHRoaXMgcGFnZSB1bmRlciB0aGUgZ2l2ZW4gCi0gICAqIHBhcmVudCBjb21wb3NpdGUuIEltcGxlbWVudG9ycyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nCi0gICAqIHRoYXQgdGhlIGNyZWF0ZWQgY29udHJvbCBjYW4gYmUgYWNjZXNzZWQgdmlhIGdldENvbnRyb2wgCi0gICAqCi0gICAqIEBwYXJhbSBwYXJlbnQgLSB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGJhc2UgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGJhc2Uuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIEdyaWREYXRhIGRhdGE7Ci0KLSAgICAvLyBjcmVhdGUgYSBncm91cAotICAgIEdyb3VwIHdzZGxFbGVtZW50R3JvdXAgPSBuZXcgR3JvdXAoYmFzZSwgU1dULlNIQURPV19FVENIRURfSU4pOwotICAgIHdzZGxFbGVtZW50R3JvdXAuc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX0dST1VQX1RFWFRfRUxFTUVOVCIpKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIHdzZGxFbGVtZW50R3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIHdzZGxFbGVtZW50R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICAvLyBjcmVhdGUgYSBiYXNlIHBhbmVsIHdpdGggMiBjb2x1bW5zCi0gICAgQ29tcG9zaXRlIGJhc2VQYW5lbCA9IG5ldyBDb21wb3NpdGUod3NkbEVsZW1lbnRHcm91cCwgU1dULk5PTkUpOwotICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLSAgICBiYXNlUGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBiYXNlUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIGNvbnRlbnQgZm9yIGZpcnN0IGNvbHVtbgotICAgIGNyZWF0ZVdTRExFbGVtZW50VHlwZUNvbnRlbnQoYmFzZVBhbmVsKTsKLQotICAgIC8vIGNvbnRlbnQgZm9yIHNlY29uZCBjb2x1bW4KLSAgICBjcmVhdGVXU0RMRWxlbWVudENvbnRlbnQoYmFzZVBhbmVsKTsKLQotICAgIHNldENvbnRyb2woYmFzZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgZ3JvdXAgb2YgcmFkaW8gYnV0dG9ucyBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIFdTREwgZWxlbWVudC4KLSAgICogVGhlIGZpdmUgdHBlcyBhcmU6IHBvcnQsIGJpbmRpbmcsIHBvcnRUeXBlLCBvcGVyYXRpb24gYW5kIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250YWluZXIuIAotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlV1NETEVsZW1lbnRUeXBlQ29udGVudChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIGEgZ3JvdXAKLSAgICBHcm91cCB3c2RsVHlwZUdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULlNIQURPV19FVENIRURfSU4pOwotICAgIHdzZGxUeXBlR3JvdXAuc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX0dST1VQX1RFWFRfVFlQRSIpKTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICB3c2RsVHlwZUdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICB3c2RsVHlwZUdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0gICAgd3NkbFBvcnRCdXR0b24gPSBuZXcgQnV0dG9uKHdzZGxUeXBlR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgd3NkbFBvcnRCdXR0b24uc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX1JBRElPX1BPUlQiKSk7Ci0gICAgd3NkbFBvcnRCdXR0b24uc2V0RGF0YSgid3NkbFBvcnRCdXR0b24iKTsKLSAgICB3c2RsUG9ydEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgd3NkbFBvcnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFBvcnRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotICAgIHdzZGxCaW5kaW5nQnV0dG9uID0gbmV3IEJ1dHRvbih3c2RsVHlwZUdyb3VwLCBTV1QuUkFESU8pOwotICAgIHdzZGxCaW5kaW5nQnV0dG9uLnNldERhdGEoIndzZGxCaW5kaW5nQnV0dG9uIik7Ci0gICAgd3NkbEJpbmRpbmdCdXR0b24uc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX1JBRElPX0JJTkRJTkciKSk7Ci0gICAgd3NkbEJpbmRpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICB3c2RsQmluZGluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQmluZGluZ0J1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0gICAgd3NkbFBvcnRUeXBlQnV0dG9uID0gbmV3IEJ1dHRvbih3c2RsVHlwZUdyb3VwLCBTV1QuUkFESU8pOwotICAgIHdzZGxQb3J0VHlwZUJ1dHRvbi5zZXREYXRhKCJ3c2RsUG9ydFR5cGVCdXR0b24iKTsKLSAgICB3c2RsUG9ydFR5cGVCdXR0b24uc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX1JBRElPX1BPUlRfVFlQRSIpKTsKLSAgICB3c2RsUG9ydFR5cGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICB3c2RsUG9ydFR5cGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFBvcnRUeXBlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLSAgICB3c2RsT3BlcmF0aW9uQnV0dG9uID0gbmV3IEJ1dHRvbih3c2RsVHlwZUdyb3VwLCBTV1QuUkFESU8pOwotICAgIHdzZGxPcGVyYXRpb25CdXR0b24uc2V0RGF0YSgid3NkbE9wZXJhdGlvbkJ1dHRvbiIpOwotICAgIHdzZGxPcGVyYXRpb25CdXR0b24uc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX1JBRElPX09QRVJBVElPTiIpKTsKLSAgICB3c2RsT3BlcmF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgd3NkbE9wZXJhdGlvbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgT3BlcmF0aW9uQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLSAgICB3c2RsTWVzc2FnZUJ1dHRvbiA9IG5ldyBCdXR0b24od3NkbFR5cGVHcm91cCwgU1dULlJBRElPKTsKLSAgICB3c2RsTWVzc2FnZUJ1dHRvbi5zZXREYXRhKCJ3c2RsTWVzc2FnZUJ1dHRvbiIpOwotICAgIHdzZGxNZXNzYWdlQnV0dG9uLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9SQURJT19NRVNTQUdFIikpOwotICAgIHdzZGxNZXNzYWdlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgd3NkbE1lc3NhZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IE1lc3NhZ2VCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBwYW5lbCB0byBjYXB0dXJlIHRoZSBuYW1lLCBuYW1lc3BhY2UgYW5kIHBhcmVudCBvZiBhbgotICAgKiBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250YWluZXIuIAotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlV1NETEVsZW1lbnRDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgYSBncm91cGluZyB3aXRoIDIgY29sdW1ucywgb25lIGZvciBsYWJlbHMgYW5kIHRoZW90aGVyIGZvciBmaWVsZHMKLSAgICBDb21wb3NpdGUgZmllbGRDb2x1bW4gPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotICAgIGZpZWxkQ29sdW1uLnNldExheW91dChsYXlvdXQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZmllbGRDb2x1bW4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIFRoZSBXU0RMIGVsZW1lbnQgbmFtZSBsYWJlbAotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGZpZWxkQ29sdW1uLCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX0xBQkVMX05BTUUiKSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIFRoZSBXU0RMIGVsZW1lbnQgbmFtZSBmaWVsZAotICAgIG5hbWVDb21ibyA9IG5ldyBDb21ibyhmaWVsZENvbHVtbiwgU1dULlJFQURfT05MWSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBuYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBuYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IE5hbWVTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLSAgICAvL25hbWVUZXh0ID0gbmV3IFRleHQoZmllbGRDb2x1bW4sIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAvL2RhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAvL2RhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgLy9kYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIC8vZGF0YS53aWR0aEhpbnQgPSA1MDsKLSAgICAvL25hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgLy9uYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgVGV4dEJveExpc3RlbmVyKCkpOwotCi0gICAgLy8gVGhlIFdTREwgZWxlbWVudCBuYW1lc3BhY2UgbGFiZWwKLSAgICBsYWJlbCA9IG5ldyBMYWJlbChmaWVsZENvbHVtbiwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9MQUJFTF9OQU1FU1BBQ0UiKSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIFRoZSBXU0RMIGVsZW1lbnQgbmFtZXNwYWNlIGZpZWxkCi0gICAgbmFtZXNwYWNlVGV4dCA9IG5ldyBUZXh0KGZpZWxkQ29sdW1uLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IDUwOwotICAgIG5hbWVzcGFjZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBuYW1lc3BhY2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBUZXh0Qm94TGlzdGVuZXIoKSk7Ci0gICAgbmFtZXNwYWNlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLSAgICAvLyBUaGUgV1NETCBlbGVtZW50IHBhcmVudCBsYWJlbAotICAgIGxhYmVsID0gbmV3IExhYmVsKGZpZWxkQ29sdW1uLCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX0xBQkVMX1BBUkVOVCIpKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gVGhlIFdTREwgZWxlbWVudCBwYXJlbnQgZmllbGQKLSAgICAvLyAgICBwYXJlbnRDb21ibyA9IG5ldyBDb21ibyhmaWVsZENvbHVtbiwgU1dULlJFQURfT05MWSk7Ci0gICAgLy8gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIC8vICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgLy8gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAvLyAgICBwYXJlbnRDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHBhcmVudG5hbWVUZXh0ID0gbmV3IFRleHQoZmllbGRDb2x1bW4sIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEud2lkdGhIaW50ID0gNTA7Ci0gICAgcGFyZW50bmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBwYXJlbnRuYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgVGV4dEJveExpc3RlbmVyKCkpOwotICAgIHBhcmVudG5hbWVUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbHdheXMgcmV0dXJuIHRydWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNlbnQgd2hlbiBkZWZhdWx0IHNlbGVjdGlvbiBvY2N1cnMgaW4gdGhlIGNvbnRyb2wuCi0gICAqIEBwYXJhbSBlIC0gYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VsZWN0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAge30KLQotICAvKioKLSAgICogSGFuZGxlcyB0aGUgaW5jbHVkZVdTREwgY2hlY2tib3guCi0gICAqIFNlbnQgd2hlbiBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZSBjb250cm9sLiAKLSAgICogQHBhcmFtIGUgLSBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWxlY3Rpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHt9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZWxlbWVudCBuYW1lLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpCi0gIHsKLSAgICBpbnQgc2VsZWN0aW9uID0gbmFtZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgaWYoc2VsZWN0aW9uICE9IC0xKQotICAgIHsgIAotICAgICAgcmV0dXJuIG5hbWVDb21iby5nZXRJdGVtKHNlbGVjdGlvbik7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG5hbWVzcGFjZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiBuYW1lc3BhY2VUZXh0LmdldFRleHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHBhcmVudCBvZiB0aGUgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHBhcmVudCBvZiB0aGUgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZSgpCi0gIHsKLSAgICAvL3JldHVybiBwYXJlbnRDb21iby5nZXRJdGVtKHBhcmVudENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotICAgIHJldHVybiBwYXJlbnRuYW1lVGV4dC5nZXRUZXh0KCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gIHsKLSAgICBpZiAod3NkbEJpbmRpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgewotICAgICAgcmV0dXJuIEJJTkRJTkc7Ci0gICAgfQotICAgIGVsc2UgaWYgKHdzZGxNZXNzYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAgIHJldHVybiBNRVNTQUdFOwotICAgIH0KLSAgICBlbHNlIGlmICh3c2RsT3BlcmF0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAgIHJldHVybiBPUEVSQVRJT047Ci0gICAgfQotICAgIGVsc2UgaWYgKHdzZGxQb3J0QnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAgIHJldHVybiBQT1JUOwotICAgIH0KLSAgICBlbHNlIGlmICh3c2RsUG9ydFR5cGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgewotICAgICAgcmV0dXJuIFBPUlRUWVBFOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRWxlbWVudChTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBwYXJlbnQpCi0gIHsKLSAgICBpZiAocG9ydHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXNldEVsZW1lbnRzKCk7Ci0gICAgfQotICAgIGlmICh0eXBlLmVxdWFscyhQT1JUKSkKLSAgICB7Ci0gICAgICBwb3J0cy5hZGQobmV3IFdTRExFbGVtZW50KG5hbWUsIG5hbWVzcGFjZSwgcGFyZW50KSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzSWdub3JlQ2FzZShPUEVSQVRJT04pKQotICAgIHsKLSAgICAgIG9wZXJhdGlvbnMuYWRkKG5ldyBXU0RMRWxlbWVudChuYW1lLCBuYW1lc3BhY2UsIHBhcmVudCkpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQklORElORykpCi0gICAgewotICAgICAgYmluZGluZ3MuYWRkKG5ldyBXU0RMRWxlbWVudChuYW1lLCBuYW1lc3BhY2UsIHBhcmVudCkpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoUE9SVFRZUEUpKQotICAgIHsKLSAgICAgIHBvcnR0eXBlcy5hZGQobmV3IFdTRExFbGVtZW50KG5hbWUsIG5hbWVzcGFjZSwgcGFyZW50KSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzSWdub3JlQ2FzZShNRVNTQUdFKSkKLSAgICB7Ci0gICAgICBtZXNzYWdlcy5hZGQobmV3IFdTRExFbGVtZW50KG5hbWUsIG5hbWVzcGFjZSwgcGFyZW50KSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzZXRFbGVtZW50cygpCi0gIHsKLSAgICBwb3J0cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBvcGVyYXRpb25zID0gbmV3IFZlY3RvcigpOwotICAgIGJpbmRpbmdzID0gbmV3IFZlY3RvcigpOwotICAgIHBvcnR0eXBlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBtZXNzYWdlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBuYW1lQ29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLSAgICBuYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIHZhbHVlIHRvIHRoZSBsaXN0IGJveAotICAgKi8KLSAgY2xhc3MgV29ya3NwYWNlQnV0dG9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLSAgfQotCi0gIC8qKgotICAgKiBBZGQgdmFsdWUgdG8gdGhlIGxpc3QgYm94Ci0gICAqLwotICBjbGFzcyBCcm93c2VCdXR0b25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7fQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7fQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCB2YWx1ZSB0byB0aGUgbGlzdCBib3gKLSAgICovCi0gIGNsYXNzIFNlYXJjaFVERElCdXR0b25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7fQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7fQotICB9Ci0gIC8qKgotICAgKiBBZGQgdmFsdWUgdG8gdGhlIGZpbGUgZmllbGQuCi0gICAqLwotICBjbGFzcyBUZXh0Qm94TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lcgotICB7Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLSAgICB7Ci0gICAgICBnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0KLSAgICB9Ci0KLSAgfQotICBwcml2YXRlIGNsYXNzIFdTRExFbGVtZW50Ci0gIHsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJlbnQ7Ci0KLSAgICBwdWJsaWMgV1NETEVsZW1lbnQoU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBwYXJlbnQpCi0gICAgewotICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gICAgewotICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKQotICB7Ci0gICAgcmVzZXRFbGVtZW50cygpOwotICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgaWYgKHZpc2libGUpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFdTRExGYWN0b3J5IGZhY3RvcnkgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBXU0RMUmVhZGVyIHJlYWRlciA9IGZhY3RvcnkubmV3V1NETFJlYWRlcigpOwotICAgICAgICBEZWZpbml0aW9uIGRlZkVsZW0gPSByZWFkZXIucmVhZFdTREwoKChWYWxpZGF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuZ2V0V1NETEZpbGUoKSk7Ci0gICAgICAgIFFOYW1lIGRlZlFOYW1lID0gZGVmRWxlbS5nZXRRTmFtZSgpOwotICAgICAgICBTdHJpbmcgZGVmbmFtZSA9ICIiOwotICAgICAgICBpZiAoZGVmUU5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGRlZm5hbWUgPSBkZWZRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZGVmRWxlbS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgICAgICAvLyByZWdpc3RlciB0aGUgcG9ydHMKLSAgICAgICAgTWFwIHNlcnZtYXAgPSBkZWZFbGVtLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgIGlmIChzZXJ2bWFwICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb2xsZWN0aW9uIHNlcnZzID0gc2Vydm1hcC52YWx1ZXMoKTsKLSAgICAgICAgICBpZiAoc2VydnMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJdGVyYXRvciBzZXJ2SXRlciA9IHNlcnZzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoc2Vydkl0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgc2Vydkl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICBTdHJpbmcgc2Vydm5hbWUgPSBzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgICAgICAgTWFwIHBvcnRtYXAgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgICAgICAgIGlmIChwb3J0bWFwICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIHBvcnRzID0gcG9ydG1hcC52YWx1ZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAocG9ydHMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBJdGVyYXRvciBwb3J0SXRlciA9IHBvcnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICB3aGlsZSAocG9ydEl0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgcG9ydEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBvcnQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KFZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UuUE9SVCwgbmFtZSwgbmFtZXNwYWNlLCBzZXJ2bmFtZSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIEJpbmRpbmdzCi0gICAgICAgIE1hcCBiaW5kaW5nbWFwID0gZGVmRWxlbS5nZXRCaW5kaW5ncygpOwotICAgICAgICBpZiAoYmluZGluZ21hcCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ29sbGVjdGlvbiBiaW5kaW5ncyA9IGJpbmRpbmdtYXAudmFsdWVzKCk7Ci0gICAgICAgICAgaWYgKGJpbmRpbmdzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3IgYmluZEl0ZXIgPSBiaW5kaW5ncy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGJpbmRJdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGJpbmRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgIGFkZEVsZW1lbnQoVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZS5CSU5ESU5HLCBuYW1lLCBuYW1lc3BhY2UsIGRlZm5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBQb3J0VHlwZXMgYW5kIE9wZXJhdGlvbnMKLSAgICAgICAgTWFwIHBvcnR0eXBlbWFwID0gZGVmRWxlbS5nZXRQb3J0VHlwZXMoKTsKLSAgICAgICAgaWYgKHBvcnR0eXBlbWFwICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb2xsZWN0aW9uIHBvcnR0eXBlcyA9IHBvcnR0eXBlbWFwLnZhbHVlcygpOwotICAgICAgICAgIGlmIChwb3J0dHlwZXMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJdGVyYXRvciBwb3J0dHlwZUl0ZXIgPSBwb3J0dHlwZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChwb3J0dHlwZUl0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBQb3J0VHlwZSBwb3J0dHlwZSA9IChQb3J0VHlwZSkgcG9ydHR5cGVJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIHBvcnR0eXBlbmFtZSA9IHBvcnR0eXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgIGFkZEVsZW1lbnQoVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZS5QT1JUVFlQRSwgcG9ydHR5cGVuYW1lLCBuYW1lc3BhY2UsIGRlZm5hbWUpOwotCi0gICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBPcGVyYXRpb25zCi0gICAgICAgICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IHBvcnR0eXBlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbnMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG9wZXJJdGVyID0gb3BlcmF0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChvcGVySXRlci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIG9wZXJJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZS5PUEVSQVRJT04sIG5hbWUsIG5hbWVzcGFjZSwgcG9ydHR5cGVuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTWFwIG1lc3NhZ2VtYXAgPSBkZWZFbGVtLmdldE1lc3NhZ2VzKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlbWFwICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb2xsZWN0aW9uIG1lc3NhZ2VzID0gbWVzc2FnZW1hcC52YWx1ZXMoKTsKLSAgICAgICAgICBpZiAobWVzc2FnZXMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJdGVyYXRvciBtZXNzSXRlciA9IG1lc3NhZ2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAobWVzc0l0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgbWVzc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgYWRkRWxlbWVudChWYWxpZGF0aW9uV2l6YXJkV1NETENvbnRlbnRQYWdlLk1FU1NBR0UsIG5hbWUsIG5hbWVzcGFjZSwgZGVmbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIGludCBudW1FbGVtcyA9IHBvcnRzLnNpemUoKTsKLSAgICAgICAgV1NETEVsZW1lbnRbXSBlbGVtcyA9IChXU0RMRWxlbWVudFtdKSBwb3J0cy50b0FycmF5KG5ldyBXU0RMRWxlbWVudFtudW1FbGVtc10pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUVsZW1zOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lQ29tYm8uYWRkKGVsZW1zW2ldLmdldE5hbWUoKSwgaSk7Ci0gICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lQ29tYm8uc2VsZWN0KDApOwotICAgICAgICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KGVsZW1zW2ldLmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoZWxlbXNbaV0uZ2V0UGFyZW50TmFtZSgpKTsKLQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3c2RsUG9ydEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIHdzZGxCaW5kaW5nQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIHdzZGxNZXNzYWdlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIHdzZGxPcGVyYXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgd3NkbFBvcnRUeXBlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIFRoZSBXU0RMIGZpbGUgaXMgbm90IHZhbGlkLgotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzZXRFbGVtZW50cygpOwotICAgIH0KLQotICB9Ci0KLSAgY2xhc3MgUG9ydEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgewotCi0gICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIHdpZGdldFNlbGVjdGVkKGUpOwotCi0gICAgfQotCi0gICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBuYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQoIiIpOwotICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICBpbnQgbnVtRWxlbXMgPSBwb3J0cy5zaXplKCk7Ci0gICAgICBXU0RMRWxlbWVudFtdIGVsZW1zID0gKFdTRExFbGVtZW50W10pIHBvcnRzLnRvQXJyYXkobmV3IFdTRExFbGVtZW50W251bUVsZW1zXSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUVsZW1zOyBpKyspCi0gICAgICB7Ci0gICAgICAgIG5hbWVDb21iby5hZGQoZWxlbXNbaV0uZ2V0TmFtZSgpLCBpKTsKLSAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KGVsZW1zW2ldLmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICBwYXJlbnRuYW1lVGV4dC5zZXRUZXh0KGVsZW1zW2ldLmdldFBhcmVudE5hbWUoKSk7Ci0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0gIGNsYXNzIEJpbmRpbmdCdXR0b25TZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICB3aWRnZXRTZWxlY3RlZChlKTsKLQotICAgIH0KLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgbmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoIiIpOwotICAgICAgaW50IG51bUVsZW1zID0gYmluZGluZ3Muc2l6ZSgpOwotICAgICAgV1NETEVsZW1lbnRbXSBlbGVtcyA9IChXU0RMRWxlbWVudFtdKSBiaW5kaW5ncy50b0FycmF5KG5ldyBXU0RMRWxlbWVudFtudW1FbGVtc10pOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbGVtczsgaSsrKQotICAgICAgewotICAgICAgICBuYW1lQ29tYm8uYWRkKGVsZW1zW2ldLmdldE5hbWUoKSwgaSk7Ci0gICAgICAgIGlmIChpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lQ29tYm8uc2VsZWN0KDApOwotICAgICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXRQYXJlbnROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgfQotICBjbGFzcyBQb3J0VHlwZUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgewotCi0gICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIHdpZGdldFNlbGVjdGVkKGUpOwotCi0gICAgfQotCi0gICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBuYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQoIiIpOwotICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICBpbnQgbnVtRWxlbXMgPSBwb3J0dHlwZXMuc2l6ZSgpOwotICAgICAgV1NETEVsZW1lbnRbXSBlbGVtcyA9IChXU0RMRWxlbWVudFtdKSBwb3J0dHlwZXMudG9BcnJheShuZXcgV1NETEVsZW1lbnRbbnVtRWxlbXNdKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRWxlbXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgbmFtZUNvbWJvLmFkZChlbGVtc1tpXS5nZXROYW1lKCksIGkpOwotICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZUNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQoZWxlbXNbaV0uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoZWxlbXNbaV0uZ2V0UGFyZW50TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotCi0gIH0KLSAgY2xhc3MgT3BlcmF0aW9uQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0KLSAgICB9Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIG5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICBwYXJlbnRuYW1lVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIGludCBudW1FbGVtcyA9IG9wZXJhdGlvbnMuc2l6ZSgpOwotICAgICAgV1NETEVsZW1lbnRbXSBlbGVtcyA9IChXU0RMRWxlbWVudFtdKSBvcGVyYXRpb25zLnRvQXJyYXkobmV3IFdTRExFbGVtZW50W251bUVsZW1zXSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUVsZW1zOyBpKyspCi0gICAgICB7Ci0gICAgICAgIG5hbWVDb21iby5hZGQoZWxlbXNbaV0uZ2V0TmFtZSgpLCBpKTsKLSAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KGVsZW1zW2ldLmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICBwYXJlbnRuYW1lVGV4dC5zZXRUZXh0KGVsZW1zW2ldLmdldFBhcmVudE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLQotICB9Ci0gIGNsYXNzIE1lc3NhZ2VCdXR0b25TZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICB3aWRnZXRTZWxlY3RlZChlKTsKLQotICAgIH0KLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgbmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoIiIpOwotICAgICAgaW50IG51bUVsZW1zID0gbWVzc2FnZXMuc2l6ZSgpOwotICAgICAgV1NETEVsZW1lbnRbXSBlbGVtcyA9IChXU0RMRWxlbWVudFtdKSBtZXNzYWdlcy50b0FycmF5KG5ldyBXU0RMRWxlbWVudFtudW1FbGVtc10pOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbGVtczsgaSsrKQotICAgICAgewotICAgICAgICBuYW1lQ29tYm8uYWRkKGVsZW1zW2ldLmdldE5hbWUoKSwgaSk7Ci0gICAgICAgIGlmIChpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lQ29tYm8uc2VsZWN0KDApOwotICAgICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXRQYXJlbnROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgfQotCi0gIGNsYXNzIE5hbWVTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICB3aWRnZXRTZWxlY3RlZChlKTsKLQotICAgIH0KLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaW50IHNlbGVjdGlvbiA9ICgoQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBTdHJpbmcgdHlwZSA9IGdldFR5cGUoKTsKLSAgICAgIFdTRExFbGVtZW50IGVsZW0gPSBudWxsOwotICAgICAgaWYgKHR5cGUuZXF1YWxzKFBPUlQpKQotICAgICAgewotICAgICAgICBlbGVtID0gKFdTRExFbGVtZW50KSBwb3J0cy5nZXQoc2VsZWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKEJJTkRJTkcpKQotICAgICAgewotICAgICAgICBlbGVtID0gKFdTRExFbGVtZW50KSBiaW5kaW5ncy5nZXQoc2VsZWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFBPUlRUWVBFKSkKLSAgICAgIHsKLSAgICAgICAgZWxlbSA9IChXU0RMRWxlbWVudCkgcG9ydHR5cGVzLmdldChzZWxlY3Rpb24pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoT1BFUkFUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgZWxlbSA9IChXU0RMRWxlbWVudCkgb3BlcmF0aW9ucy5nZXQoc2VsZWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKE1FU1NBR0UpKQotICAgICAgewotICAgICAgICBlbGVtID0gKFdTRExFbGVtZW50KSBtZXNzYWdlcy5nZXQoc2VsZWN0aW9uKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGVsZW0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KGVsZW0uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBwYXJlbnRuYW1lVGV4dC5zZXRUZXh0KGVsZW0uZ2V0UGFyZW50TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZFdTRExQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvd2l6YXJkcy9WYWxpZGF0aW9uV2l6YXJkV1NETFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0NjhlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvd2l6YXJkcy9WYWxpZGF0aW9uV2l6YXJkV1NETFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5XU0lVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0U2luZ2xlRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBXaXphcmQgcGFnZSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgCi0gKiBXU0RMIGRvY3VtZW50IGZvciB0aGUgV2ViIHNlcnZpY2UuCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgTGF1em9uLCBJQk0KLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbldpemFyZFdTRExQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0KLSAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gIHByb3RlY3RlZCBib29sZWFuIHdzZGxpbnZhbGlkID0gZmFsc2U7Ci0gIC8qKgotICAgKiBBY2Nlc3MgdG8gdGhlIGluY2x1ZGVXU0RMIGZsYWcuICAKLSAgICovCi0gIHByb3RlY3RlZCBCdXR0b24gaW5jbHVkZVdTRExCdXR0b247Ci0KLSAgLyoqCi0gICAqIEFjY2VzcyB0byB0aGUgd3NkbCBkb2N1bWVudCBncm91cC4KLSAgICovCi0gIHByb3RlY3RlZCBHcm91cCBkb2N1bWVudEdyb3VwOwotICBwcm90ZWN0ZWQgVGV4dCBkb2N1bWVudExvY2F0aW9uVGV4dDsKLSAgcHJvdGVjdGVkIENvbWJvIGZpbGVGaWVsZDsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHNlbGVjdGlvbjogc2VsZWN0aW9uIGluIHRoZSBSZXNvdXJjZSBOYXZpZ2F0b3Igdmlldy4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uV2l6YXJkV1NETFBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIoIlZhbGlkYXRpb25XaXphcmRXU0RMUGFnZSIpOwotICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIHRoaXMuc2V0VGl0bGUoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9TRUxFQ1RfV1NETF9GSUxFTkFNRV9IRUFESU5HIikpOwotICAgIHRoaXMuc2V0RGVzY3JpcHRpb24oV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9TRUxFQ1RfV1NETF9GSUxFTkFNRV9FWFBMIikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFsd2F5cyByZXR1cm5zIHRydWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpCi0gIHsKLSAgICBpZiAoaW5jbHVkZVdTRExGaWxlKCkpCi0gICAgewotCi0gICAgICBpZiAoZmlsZUZpZWxkLmdldFRleHQoKSA9PSBudWxsIHx8IGZpbGVGaWVsZC5nZXRUZXh0KCkuZXF1YWxzKCIiKSB8fCB3c2RsaW52YWxpZCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qCi0gICAqIENyZWF0ZXMgdGhlIHRvcCBsZXZlbCBjb250cm9sIGZvciB0aGlzIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIHBhcmVudAotICAgKiBjb21wb3NpdGUuIEltcGxlbWVudG9ycyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIGNyZWF0ZWQKLSAgICogY29udHJvbCBjYW4gYmUgYWNjZXNzZWQgdmlhIGdldENvbnRyb2wKLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnQgLSB0aGUgcGFyZW50IGNvbXBvc2l0ZQotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGJhc2UgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGJhc2Uuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIEdyaWREYXRhIGRhdGE7Ci0KLSAgICAvLyBhZGQgaW5jbHVkZVdTREwgZmxhZwotICAgIGluY2x1ZGVXU0RMQnV0dG9uID0gbmV3IEJ1dHRvbihiYXNlLCBTV1QuQ0hFQ0spOwotICAgIGluY2x1ZGVXU0RMQnV0dG9uLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9JTkNMVURFX1dTRExfQlVUVE9OIikpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGluY2x1ZGVXU0RMQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaW5jbHVkZVdTRExCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgaW5jbHVkZVdTRExCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQotICAgIC8vIGNyZWF0ZSBhIFdTREwgZG9jdW1lbnQgZ3JvdXAKLSAgICBkb2N1bWVudEdyb3VwID0gbmV3IEdyb3VwKGJhc2UsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRvY3VtZW50R3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGRvY3VtZW50R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgZG9jdW1lbnRHcm91cC5zZXRWaXNpYmxlKGZhbHNlKTsKLQotICAgIGNyZWF0ZURvY3VtZW50R3JvdXBDb250ZW50cyhkb2N1bWVudEdyb3VwKTsKLQotICAgIHNldENvbnRyb2woYmFzZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEb2N1bWVudEdyb3VwQ29udGVudHMoQ29tcG9zaXRlIGRvY3VtZW50R3JvdXApCi0gIHsKLSAgICAvL3JhZGlvIGJ1dHRvbnMnIGNvbnRhaW5lcgotICAgIENvbXBvc2l0ZSBiYXNlUGFuZWwgPSBuZXcgQ29tcG9zaXRlKGRvY3VtZW50R3JvdXAsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGJhc2VQYW5lbC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGJhc2VQYW5lbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgQ29tcG9zaXRlIGdyb3VwMSA9IG5ldyBDb21wb3NpdGUoYmFzZVBhbmVsLCBTV1QuTk9ORSk7Ci0gICAgZ3JvdXAxLnNldEZvbnQoZ2V0Rm9udCgpKTsKLSAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBncm91cDEuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JvdXAxLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBMYWJlbCBkb2N1bWVudExhYmVsID0gbmV3IExhYmVsKGdyb3VwMSwgU1dULkxFRlQpOwotICAgIGRvY3VtZW50TGFiZWwuc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX0lOQ0xVREVfV1NETF9MQUJFTCIpKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkb2N1bWVudExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgLyoqCi0JICogTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoYmFzZVBhbmVsLCBTV1QuTEVGVCk7IGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkgKiBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOyBkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkgKiBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCSAqLwotICAgIGZpbGVGaWVsZCA9IG5ldyBDb21ibyhncm91cDEsIFNXVC5EUk9QX0RPV04pOwotICAgIFN0cmluZ1tdIHdzZGxsb2NhdGlvbnMgPSAoKFZhbGlkYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5nZXRXU0RMTG9jYXRpb25zKCk7Ci0gICAgaWYod3NkbGxvY2F0aW9ucyAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBudW1sb2NzID0gd3NkbGxvY2F0aW9ucy5sZW5ndGg7Ci0gICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtbG9jczsgaSsrKQotICAgICAgewotICAgICAgCWZpbGVGaWVsZC5hZGQod3NkbGxvY2F0aW9uc1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS53aWR0aEhpbnQgPSAzMDsKLSAgICBmaWxlRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBmaWxlRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IEZpbGVGaWVsZExpc3RlbmVyKCkpOwotCi0gICAgTGFiZWwgd3NkbExhYmVsID0gbmV3IExhYmVsKGdyb3VwMSwgU1dULkxFRlQpOwotICAgIHdzZGxMYWJlbC5zZXRUZXh0KFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfV0laQVJEX1ZfVkFMSURfV1NETF9MQUJFTCIpKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkb2N1bWVudExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBkb2N1bWVudExvY2F0aW9uVGV4dCA9IG5ldyBUZXh0KGRvY3VtZW50R3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAvLyBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgLy8gZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAvLyBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIC8vIGRhdGEud2lkdGhIaW50ID0gMzA7Ci0gICAgLy8gZG9jdW1lbnRMb2NhdGlvblRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIENvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUoYmFzZVBhbmVsLCBTV1QuTk9ORSk7Ci0gICAgZ3JvdXAuc2V0Rm9udChnZXRGb250KCkpOwotICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBCdXR0b24gd29ya3NwYWNlQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotICAgIHdvcmtzcGFjZUJ1dHRvbi5zZXRUZXh0KFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfV0laQVJEX1ZfV09SS0JFTkNIX0JVVFRPTiIpKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB3b3Jrc3BhY2VCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICB3b3Jrc3BhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFdvcmtzcGFjZUJ1dHRvbkxpc3RlbmVyKCkpOwotCi0gICAgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLSAgICBicm93c2VCdXR0b24uc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX0JST1dTRV9CVVRUT04iKSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBCcm93c2VCdXR0b25MaXN0ZW5lcigpKTsKLQotICAgIC8vIEJ1dHRvbiBzZWFyY2hVRERJQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotICAgIC8vIHNlYXJjaFVERElCdXR0b24uc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX1NFQVJDSF9VRERJX0JVVFRPTiIpKTsKLSAgICAvLyBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgLy8gZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAvLyBzZWFyY2hVRERJQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgLy8gc2VhcmNoVURESUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VhcmNoVURESUJ1dHRvbkxpc3RlbmVyKCkpOwotCi0gICAgcmV0dXJuIGRvY3VtZW50R3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlV1NETEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGluY2x1ZGVXU0RMQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXU0RMRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gZmlsZUZpZWxkLmdldFRleHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbHdheXMgcmV0dXJuIHRydWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNlbnQgd2hlbiBkZWZhdWx0IHNlbGVjdGlvbiBvY2N1cnMgaW4gdGhlIGNvbnRyb2wuCi0gICAqIAotICAgKiBAcGFyYW0gZSAtCi0gICAqICAgICAgICAgICAgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VsZWN0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAge30KLQotICAvKioKLSAgICogSGFuZGxlcyB0aGUgaW5jbHVkZVdTREwgY2hlY2tib3guIFNlbnQgd2hlbiBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZQotICAgKiBjb250cm9sLgotICAgKiAKLSAgICogQHBhcmFtIGUgLQotICAgKiAgICAgICAgICAgIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBpbmNsdWRlV1NETEJ1dHRvbikKLSAgICB7Ci0gICAgICBpZiAoaW5jbHVkZVdTRExCdXR0b24uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICB7Ci0gICAgICAgIGRvY3VtZW50R3JvdXAuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZG9jdW1lbnRHcm91cC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXU0RMSW52YWxpZCgpCi0gIHsKLSAgICB3c2RsaW52YWxpZCA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIHZhbHVlIHRvIHRoZSBsaXN0IGJveAotICAgKi8KLSAgY2xhc3MgV29ya3NwYWNlQnV0dG9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBzZWxlY3Rpb24sIGZhbHNlKTsKLSAgICAgIGRpYWxvZy5hZGRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIud3NkbCIgfSk7Ci0gICAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQotICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIElGaWxlIGN1cnJlbnRJRmlsZSA9IGRpYWxvZy5nZXRGaWxlKCk7Ci0gICAgICAgIGlmIChjdXJyZW50SUZpbGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGZpbGVGaWVsZC5hZGQoY3VycmVudElGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgMCk7Ci0gICAgICAgICAgZmlsZUZpZWxkLnNlbGVjdCgwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBZGQgdmFsdWUgdG8gdGhlIGxpc3QgYm94Ci0gICAqLwotICBjbGFzcyBCcm93c2VCdXR0b25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7fQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIioud3NkbCIgfSk7Ci0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZmlsZUZpZWxkLmFkZChzZWxlY3Rpb24sIDApOwotICAgICAgICBmaWxlRmllbGQuc2VsZWN0KDApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBZGQgdmFsdWUgdG8gdGhlIGxpc3QgYm94Ci0gICAqLwotICAvLyBjbGFzcyBTZWFyY2hVRERJQnV0dG9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICAvLyB7Ci0gIC8vICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgLy8gIHt9Ci0gIC8vCi0gIC8vICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAvLyAgewotICAvLyAgICBTdHJpbmcgdGl0bGUgPSAiSW5mb3JtYXRpb24iOwotICAvLyAgICBTdHJpbmcgbWVzc2FnZSA9ICJUaGUgY2hvc2VuIG9wZXJhdGlvbiBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4iOwotICAvLyAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0gIC8vICB9Ci0gIC8vfQotCi0gIC8qKgotICAgKiBBZGQgdmFsdWUgdG8gdGhlIGZpbGUgZmllbGQuCi0gICAqLwotICBjbGFzcyBGaWxlRmllbGRMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyCi0gIHsKLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICAgIHsKLSAgICAgIHdzZGxpbnZhbGlkID0gZmFsc2U7Ci0gICAgICBnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0KLSAgICB9Ci0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDY3ZGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3c2ljb3JlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id3NpdmFsaWRhdGUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzYwYzFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53c2k8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiNmZhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXNvdXJjZS53c2ljb3JlLmphciA9IHdzaWNvcmUvCi1iaW4uaW5jbHVkZXMgPSB3c2ljb3JlLmphcixcCi0gICAgICAgICAgICAgICB3c2l2YWxpZGF0ZS5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gd3NpY29yZS5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgd3NpdmFsaWRhdGUuamFyCi1zb3VyY2Uud3NpdmFsaWRhdGUuamFyID0gd3NpdmFsaWRhdGUvCi1vdXRwdXQud3NpY29yZS5qYXIgPSBiaW4vCi1vdXRwdXQud3NpdmFsaWRhdGUuamFyID0gYmluLwotc3JjLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhMTNhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzaSI+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0iZmFsc2UiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzaSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzaS51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzY1ZTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotX1BMVUdJTl9OQU1FICAgPSBXU0kgQ29uZm9ybWFuY2UgVG9vbHMKLV9VSV9XU0RMX1dTSV9WQUxJREFUT1IgPSBXU0RMIFdTLUkgVmFsaWRhdG9yCi1fUFJPVklERVJfTkFNRSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjliMjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+IAotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzaSIKLSAgIG5hbWU9IiVfUExVR0lOX05BTUUiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWUgPSAiJV9QUk9WSURFUl9OQU1FIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuV1NJVGVzdFRvb2xzUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ3c2ljb3JlLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzaXZhbGlkYXRlLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICA8L3J1bnRpbWU+Ci0gICAKLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MudWRkaTRqIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLmFwYWNoZS5heGlzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gIAotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0id3NkbFdTSVZhbGlkYXRvciIKLSAgICAgICAgIG5hbWU9IiVfVUlfV1NETF9XU0lfVkFMSURBVE9SIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uZXh0dmFsaWRhdG9yIj4KLSAgICAgIDxleHR2YWxpZGF0b3IKLSAgICAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC52YWxpZGF0ZS53c2RsLldTRExWYWxpZGF0b3IiCi0gICAgICAgICAgICByZXNvdXJjZWJ1bmRsZT0id3NpdmFsaWRhdGUiPgotICAgICAgPC9leHR2YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9Ub29sRW52aXJvbm1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9Ub29sRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiZWUzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvVG9vbEVudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlhNTEluZm87Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBUb29sIGVudmlyb25tZW50IGluZm9ybWF0aW9uLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sRW52aXJvbm1lbnQKLXsKLSAgLyoqCi0gICAqIEVsZW1lbnQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTkFNRSA9IFdTSUNvbnN0YW50cy5FTEVNX0VOVklST05NRU5UOwotCi0gIC8qKgotICAgKiBRTmFtZS4KLSAgICovCi0gIC8vcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9IG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9DT01NT04sIEVMRU1fTkFNRSk7Ci0KLSAgLyoqCi0gICAqIFRvb2wgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJ1bnRpbWVOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnJ1bnRpbWUubmFtZSIpOwotICBwcm90ZWN0ZWQgU3RyaW5nIHJ1bnRpbWVWZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnJ1bnRpbWUudmVyc2lvbiIpOwotCi0gIHByb3RlY3RlZCBTdHJpbmcgb3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7Ci0gIHByb3RlY3RlZCBTdHJpbmcgb3NWZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy52ZXJzaW9uIik7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyB4bWxQYXJzZXJOYW1lID0gIj8iOwotICBwcm90ZWN0ZWQgU3RyaW5nIHhtbFBhcnNlclZlcnNpb24gPSAiPyI7Ci0KLSAgLyoqCi0gICAqIEFkZGl0aW9uYWwgdG9vbCBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBYTUxJbmZvIHhtbEluZm8gPSBudWxsOwotCi0gIC8qKgotICAgKiBDcmVhdGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0b29sIHJ1bnRpbWUgZW52aXJvbm1lbnQuCi0gICAqLwotICBwdWJsaWMgVG9vbEVudmlyb25tZW50KCkKLSAgewotICAgIHRyeQotICAgIHsKLQotICAgICAgLy8gRlVUVVJFOiBtYWRlIGNvbXBhdGlibGUgd2l0aCBsYXRlciB2ZXJzaW9ucyBvZiBYZXJjZXMgd2hlcmUgZ2V0VmVyc2lvbgotICAgICAgLy8gaXMgbm8gbG9uZ2VyIHN0YXRpY2FsbHkgYXZhaWxhYmxlLgotICAgICAgLy8geG1sUGFyc2VyVmVyc2lvbiA9IG5ldyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlZlcnNpb24oKS5nZXRWZXJzaW9uKCk7Ci0gICAgICB4bWxQYXJzZXJWZXJzaW9uID0gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5WZXJzaW9uLmdldFZlcnNpb24oKTsKLQotICAgICAgeG1sUGFyc2VyTmFtZSA9ICJBcGFjaGUgWGVyY2VzIjsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gQUREOiBIb3cgZWxzZSBjYW4gd2UgZ2V0IHRoZSBuYW1lIHZlcnNpb24gbnVtYmVyCi0gICAgfQotCi0gICAgY2F0Y2ggKEVycm9yIGVycikKLSAgICB7Ci0gICAgICAvLyBBREQ6IEhvdyBlbHNlIGNhbiB3ZSBnZXQgdGhlIG5hbWUgdmVyc2lvbiBudW1iZXIKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdG9vbCBydW50aW1lIGVudmlyb25tZW50LgotICAgKiBAcGFyYW0geG1sSW5mbyBhZGRpdGlvbmFsIHRvb2wgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgVG9vbEVudmlyb25tZW50KFhNTEluZm8geG1sSW5mbykKLSAgewotICAgIHRoaXMueG1sSW5mbyA9IHhtbEluZm87Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgb3NOYW1lLgotICAgKiBAcmV0dXJuIHRoZSBvc05hbWUuCi0gICAqIEBzZWUgI3NldE9TTmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRPU05hbWUoKQotICB7Ci0gICAgcmV0dXJuIG9zTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBvc1ZlcnNpb24uCi0gICAqIEByZXR1cm4gdGhlIG9zVmVyc2lvbi4KLSAgICogQHNlZSAjc2V0T1NWZXJzaW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE9TVmVyc2lvbigpCi0gIHsKLSAgICByZXR1cm4gb3NWZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBhcnNlck5hbWUuCi0gICAqIEByZXR1cm4gdGhlIHBhcnNlck5hbWUuCi0gICAqIEBzZWUgI3NldFhNTFBhcnNlck5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0WE1MUGFyc2VyTmFtZSgpCi0gIHsKLSAgICByZXR1cm4geG1sUGFyc2VyTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwYXJzZXJWZXJzaW9uLgotICAgKiBAcmV0dXJuIHRoZSBwYXJzZXJWZXJzaW9uLgotICAgKiBAc2VlICNzZXRYTUxQYXJzZXJWZXJzaW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFhNTFBhcnNlclZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIHhtbFBhcnNlclZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcnVudGltZU5hbWUuCi0gICAqIEByZXR1cm4gdGhlIHJ1bnRpbWVOYW1lLgotICAgKiBAc2VlICNzZXRSdW50aW1lTmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSdW50aW1lTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcnVudGltZU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcnVudGltZVZlcnNpb24uCi0gICAqIEByZXR1cm4gdGhlIHJ1bnRpbWVWZXJzaW9uLgotICAgKiBAc2VlICNzZXRSdW50aW1lVmVyc2lvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSdW50aW1lVmVyc2lvbigpCi0gIHsKLSAgICByZXR1cm4gcnVudGltZVZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgb3NOYW1lLgotICAgKiBAcGFyYW0gb3NOYW1lIHRoZSBvc05hbWUgdG8gc2V0LgotICAgKiBAc2VlICNnZXRPU05hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE9TTmFtZShTdHJpbmcgb3NOYW1lKQotICB7Ci0gICAgdGhpcy5vc05hbWUgPSBvc05hbWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgb3NWZXJzaW9uLgotICAgKiBAcGFyYW0gb3NWZXJzaW9uIHRoZSBvc1ZlcnNpb24gdG8gc2V0LgotICAgKiBAc2VlICNnZXRPU1ZlcnNpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE9TVmVyc2lvbihTdHJpbmcgb3NWZXJzaW9uKQotICB7Ci0gICAgdGhpcy5vc1ZlcnNpb24gPSBvc1ZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcGFyc2VyTmFtZS4KLSAgICogQHBhcmFtIHhtbFBhcnNlck5hbWUgdGhlIHBhcnNlck5hbWUgdG8gc2V0LgotICAgKiBAc2VlICNnZXRYTUxQYXJzZXJOYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRYTUxQYXJzZXJOYW1lKFN0cmluZyB4bWxQYXJzZXJOYW1lKQotICB7Ci0gICAgdGhpcy54bWxQYXJzZXJOYW1lID0geG1sUGFyc2VyTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBwYXJzZXJWZXJzaW9uLgotICAgKiBAcGFyYW0geG1sUGFyc2VyVmVyc2lvbiB0aGUgcGFyc2VyVmVyc2lvbiB0byBzZXQuCi0gICAqIEBzZWUgI2dldFhNTFBhcnNlclZlcnNpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFhNTFBhcnNlclZlcnNpb24oU3RyaW5nIHhtbFBhcnNlclZlcnNpb24pCi0gIHsKLSAgICB0aGlzLnhtbFBhcnNlclZlcnNpb24gPSB4bWxQYXJzZXJWZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJ1bnRpbWVOYW1lLgotICAgKiBAcGFyYW0gcnVudGltZU5hbWUgdGhlIHJ1bnRpbWVOYW1lIHRvIHNldC4KLSAgICogQHNlZSAjZ2V0UnVudGltZU5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWVOYW1lKFN0cmluZyBydW50aW1lTmFtZSkKLSAgewotICAgIHRoaXMucnVudGltZU5hbWUgPSBydW50aW1lTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBydW50aW1lVmVyc2lvbi4KLSAgICogQHBhcmFtIHJ1bnRpbWVWZXJzaW9uIHRoZSBydW50aW1lVmVyc2lvbiB0byBzZXQuCi0gICAqIEBzZWUgI2dldFJ1bnRpbWVWZXJzaW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSdW50aW1lVmVyc2lvbihTdHJpbmcgcnVudGltZVZlcnNpb24pCi0gIHsKLSAgICB0aGlzLnJ1bnRpbWVWZXJzaW9uID0gcnVudGltZVZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgYWRkaXRpb25hbCBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIHhtbEluZm8gYWRkaXRpb25hbCB0b29sIGVudmlyb25tZW50IGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbFRvb2xFbnZpcm9ubWVudChYTUxJbmZvIHhtbEluZm8pCi0gIHsKLSAgICB0aGlzLnhtbEluZm8gPSB4bWxJbmZvOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBYTUwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgIHRoZSBuYW1lc3BhY2UgcHJlZml4LgotICAgKiBAcmV0dXJuIHRoZSBYTUwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LiAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCFuc05hbWUuZXF1YWxzKCIiKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBTdGFydCBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigiICAgIDwiICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLQotICAgIHB3LnByaW50KCIgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1JVTlRJTUUgKyAiICIpOwotICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX05BTUUgKyAiPVwiIiArIHJ1bnRpbWVOYW1lICsgIlwiICIpOwotICAgIHB3LnByaW50bG4oV1NJQ29uc3RhbnRzLkFUVFJfVkVSU0lPTiArICI9XCIiICsgcnVudGltZVZlcnNpb24gKyAiXCIvPiIpOwotICAgIHB3LnByaW50KCIgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX09QRVJBVElOR19TWVNURU0gKyAiICIpOwotICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX05BTUUgKyAiPVwiIiArIG9zTmFtZSArICJcIiAiKTsKLSAgICBwdy5wcmludGxuKFdTSUNvbnN0YW50cy5BVFRSX1ZFUlNJT04gKyAiPVwiIiArIG9zVmVyc2lvbiArICJcIi8+Iik7Ci0gICAgcHcucHJpbnQoIiAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fWE1MX1BBUlNFUiArICIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSArICI9XCIiICsgeG1sUGFyc2VyTmFtZSArICJcIiAiKTsKLSAgICBwdy5wcmludGxuKFdTSUNvbnN0YW50cy5BVFRSX1ZFUlNJT04gKyAiPVwiIiArIHhtbFBhcnNlclZlcnNpb24gKyAiXCIvPiIpOwotCi0gICAgLy8gSWYgYWRkdGlvbmFsIGluZm8sIHRoZW4gZ2V0IGl0Ci0gICAgaWYgKHhtbEluZm8gIT0gbnVsbCkKLSAgICAgIHB3LnByaW50KHhtbEluZm8udG9YTUxTdHJpbmcobnNOYW1lKSk7Ci0KLSAgICAvLyBFbmQgZWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICA8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9Ub29sSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1Rvb2xJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTdhNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1Rvb2xJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5YTUxJbmZvOwotCi0vKioKLSAqIEluZm9ybWF0aW9uIHRoYXQgZGVzY3JpYmVzIGEgY29uZm9ybWFuY2UgdG9vbC4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sSW5mbwotewotICAvKioKLSAgICogVG9vbCBpbmZvcm1hdGlvbiBwcm9wZXJ0eSBuYW1lcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVE9PTF9WRVJTSU9OID0gIndzaS50b29sLnZlcnNpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RPT0xfUkVMRUFTRV9EQVRFID0gIndzaS50b29sLnJlbGVhc2UuZGF0ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVE9PTF9JTVBMRU1FTlRFUiA9ICJ3c2kudG9vbC5pbXBsZW1lbnRlciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVE9PTF9MT0NBVElPTiA9ICJ3c2kudG9vbC5sb2NhdGlvbiI7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgdG9vbCBpbmZvcm1hdGlvbiBwcm9wZXJ0eSB2YWx1ZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGX1RPT0xfVkVSU0lPTiA9ICIxLjAuMSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZfVE9PTF9SRUxFQVNFX0RBVEUgPSAiMjAwNC0wMS0yMiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZfVE9PTF9JTVBMRU1FTlRFUiA9ICJFY2xpcHNlLm9yZyBPcmdhbml6YXRpb24iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGX1RPT0xfTE9DQVRJT04gPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93c3Z0IjsKLQotICAvKioKLSAgICogVG9vbCBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlbGVhc2VEYXRlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGltcGxlbWVudGVyOwotICBwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uOwotCi0gIC8qKgotICAgKiBUb29sIGVudmlyb25tZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIFRvb2xFbnZpcm9ubWVudCB0b29sRW52aXJvbm1lbnQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUb29sIGluZm8gcHJvcGVydGllcyBmaWxlbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRklMRU5BTUUgPSAib3JnLndzaS50ZXN0LnRvb2xpbmZvIjsKLQotICAvKioKLSAgICogQ3JlYXRlIHRvb2wgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgVG9vbEluZm8oKQotICB7Ci0gICAgdGhpcy50b29sRW52aXJvbm1lbnQgPSBuZXcgVG9vbEVudmlyb25tZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHRvb2wgaW5mb3JtYXRpb24gZnJvbSBpbmZvcm1hdGlvbiBpbiB0aGUgdG9vbGluZm8ucHJvcGVydGllcyBmaWxlLgotICAgKiBAcGFyYW0gbmFtZSAgdGhlIHRvb2wgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBUb29sSW5mbyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0KLSAgICBnZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICB0aGlzLnRvb2xFbnZpcm9ubWVudCA9IG5ldyBUb29sRW52aXJvbm1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgdG9vbCBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIG5hbWUgICAgICAgICB0aGUgdG9vbCBuYW1lLgotICAgKiBAcGFyYW0gdmVyc2lvbiAgICAgIHRoZSB2ZXJzaW9uIG9mIHRoZSB0b29sLgotICAgKiBAcGFyYW0gcmVsZWFzZURhdGUgIHRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRvb2wuCi0gICAqIEBwYXJhbSBpbXBsZW1lbnRlciAgdGhlIGltcGxlbWVudGVyIG9mIHRoZSB0b29sLgotICAgKiBAcGFyYW0gbG9jYXRpb24gICAgIHRoZSBpbXBsZW1lbnRlciBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBUb29sSW5mbygKLSAgICBTdHJpbmcgbmFtZSwKLSAgICBTdHJpbmcgdmVyc2lvbiwKLSAgICBTdHJpbmcgcmVsZWFzZURhdGUsCi0gICAgU3RyaW5nIGltcGxlbWVudGVyLAotICAgIFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLSAgICB0aGlzLnJlbGVhc2VEYXRlID0gcmVsZWFzZURhdGU7Ci0gICAgdGhpcy5pbXBsZW1lbnRlciA9IGltcGxlbWVudGVyOwotICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQotICAgIHRoaXMudG9vbEVudmlyb25tZW50ID0gbmV3IFRvb2xFbnZpcm9ubWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSB0b29sIGluZm9ybWF0aW9uIHdpdGggdG9vbCB1bmlxdWUgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24uCi0gICAqIEBwYXJhbSBuYW1lICAgICAgICAgdGhlIHRvb2wgbmFtZS4KLSAgICogQHBhcmFtIHZlcnNpb24gICAgICB0aGUgdmVyc2lvbiBvZiB0aGUgdG9vbC4KLSAgICogQHBhcmFtIHJlbGVhc2VEYXRlICB0aGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0b29sLgotICAgKiBAcGFyYW0gaW1wbGVtZW50ZXIgIHRoZSBpbXBsZW1lbnRlciBvZiB0aGUgdG9vbC4KLSAgICogQHBhcmFtIGxvY2F0aW9uICAgICB0aGUgaW1wbGVtZW50ZXIgbG9jYXRpb24uCi0gICAqIEBwYXJhbSB4bWxJbmZvICAgICAgYWRkaXRpb25hbCB0b29sIGVudmlyb25tZW50IGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHVibGljIFRvb2xJbmZvKAotICAgIFN0cmluZyBuYW1lLAotICAgIFN0cmluZyB2ZXJzaW9uLAotICAgIFN0cmluZyByZWxlYXNlRGF0ZSwKLSAgICBTdHJpbmcgaW1wbGVtZW50ZXIsCi0gICAgU3RyaW5nIGxvY2F0aW9uLAotICAgIFhNTEluZm8geG1sSW5mbykKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLSAgICB0aGlzLnJlbGVhc2VEYXRlID0gcmVsZWFzZURhdGU7Ci0gICAgdGhpcy5pbXBsZW1lbnRlciA9IGltcGxlbWVudGVyOwotICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQotICAgIHRoaXMudG9vbEVudmlyb25tZW50ID0gbmV3IFRvb2xFbnZpcm9ubWVudCh4bWxJbmZvKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbmFtZS4KLSAgICogQHJldHVybiBuYW1lLgotICAgKiBAc2VlICNzZXROYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHZlcnNpb24uCi0gICAqIEByZXR1cm4gdmVyc2lvbi4KLSAgICogQHNlZSAjc2V0VmVyc2lvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkKLSAgewotICAgIHJldHVybiB2ZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCByZWxlYXNlIGRhdGUuCi0gICAqIEByZXR1cm4gcmVsZWFzZSBkYXRlLgotICAgKiBAc2VlICNzZXRSZWxlYXNlRGF0ZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZWxlYXNlRGF0ZSgpCi0gIHsKLSAgICByZXR1cm4gcmVsZWFzZURhdGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGltcGxlbWVudGVyLgotICAgKiBAcmV0dXJuIGltcGxlbWVudGVyLgotICAgKiBAc2VlICNzZXRJbXBsZW1lbnRlcgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRlcigpCi0gIHsKLSAgICByZXR1cm4gaW1wbGVtZW50ZXI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGltcGxlbWVudGVyIGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIGltcGxlbWVudGVyIGxvY2F0aW9uLgotICAgKiBAc2VlICNzZXRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdG9vbEVudmlyb25tZW50LgotICAgKiBAcmV0dXJuIFRvb2xFbnZpcm9ubWVudAotICAgKiBAc2VlICNzZXRUb29sRW52aXJvbm1lbnQKLSAgICovCi0gIHB1YmxpYyBUb29sRW52aXJvbm1lbnQgZ2V0VG9vbEVudmlyb25tZW50KCkKLSAgewotICAgIHJldHVybiB0b29sRW52aXJvbm1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgaW1wbGVtZW50ZXIuCi0gICAqIEBwYXJhbSBpbXBsZW1lbnRlciB0aGUgaW1wbGVtZW50ZXIgdG8gc2V0LgotICAgKiBAc2VlICNnZXRJbXBsZW1lbnRlcgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW1wbGVtZW50ZXIoU3RyaW5nIGltcGxlbWVudGVyKQotICB7Ci0gICAgdGhpcy5pbXBsZW1lbnRlciA9IGltcGxlbWVudGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIHRvIHNldC4KLSAgICogQHNlZSAjZ2V0TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBuYW1lLgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBzZXQuCi0gICAqIEBzZWUgI2dldE5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlbGVhc2VEYXRlLgotICAgKiBAcGFyYW0gcmVsZWFzZURhdGUgdGhlIHJlbGVhc2VEYXRlIHRvIHNldC4KLSAgICogQHNlZSAjZ2V0UmVsZWFzZURhdGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlbGVhc2VEYXRlKFN0cmluZyByZWxlYXNlRGF0ZSkKLSAgewotICAgIHRoaXMucmVsZWFzZURhdGUgPSByZWxlYXNlRGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB0b29sRW52aXJvbm1lbnQuCi0gICAqIEBwYXJhbSB0b29sRW52aXJvbm1lbnQgdGhlIHRvb2xFbnZpcm9ubWVudCB0byBzZXQuCi0gICAqIEBzZWUgI2dldFRvb2xFbnZpcm9ubWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VG9vbEVudmlyb25tZW50KFRvb2xFbnZpcm9ubWVudCB0b29sRW52aXJvbm1lbnQpCi0gIHsKLSAgICB0aGlzLnRvb2xFbnZpcm9ubWVudCA9IHRvb2xFbnZpcm9ubWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB0b29sRW52aXJvbm1lbnQuCi0gICAqIEBwYXJhbSB4bWxJbmZvIGFkZGl0aW9uYWwgdG9vbCBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxUb29sRW52aXJvbm1lbnQoWE1MSW5mbyB4bWxJbmZvKQotICB7Ci0gICAgdGhpcy50b29sRW52aXJvbm1lbnQuc2V0QWRkaXRpb25hbFRvb2xFbnZpcm9ubWVudCh4bWxJbmZvKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2ZXJzaW9uLgotICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiB0byBzZXQuCi0gICAqIEBzZWUgI2dldFZlcnNpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pCi0gIHsKLSAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBzdGFydCBYTUwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSAgdGhlIG5hbWVzcGFjZSBwcmVmaXguCi0gICAqIEByZXR1cm4gdGhlIHN0YXJ0IFhNTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdGFydFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoIW5zTmFtZS5lcXVhbHMoIiIpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIHB3LnByaW50KCIgIDwiICsgbnNOYW1lICsgZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkgKyAiICIpOwotICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX1ZFUlNJT04gKyAiPVwiIiArIGdldFZlcnNpb24oKSArICJcIiAiKTsKLSAgICBwdy5wcmludGxuKAotICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfUkVMRUFTRV9EQVRFICsgIj1cIiIgKyBnZXRSZWxlYXNlRGF0ZSgpICsgIlwiPiIpOwotCi0gICAgcHcucHJpbnQoIiAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0lNUExFTUVOVEVSICsgIiAiKTsKLSAgICBwdy5wcmludChXU0lDb25zdGFudHMuQVRUUl9OQU1FICsgIj1cIiIgKyBnZXRJbXBsZW1lbnRlcigpICsgIlwiICIpOwotICAgIHB3LnByaW50bG4oV1NJQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04gKyAiPVwiIiArIGdldExvY2F0aW9uKCkgKyAiXCIvPiIpOwotCi0gICAgLy8gRW52aXJvbm1lbnQKLSAgICBwdy5wcmludCh0b29sRW52aXJvbm1lbnQudG9YTUxTdHJpbmcobmFtZXNwYWNlTmFtZSkpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBlbmQgWE1MIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgIHRoZSBuYW1lc3BhY2UgcHJlZml4LgotICAgKiBAcmV0dXJuIHRoZSBlbmQgWE1MIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4gCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVuZFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoIW5zTmFtZS5lcXVhbHMoIiIpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIHB3LnByaW50bG4oIiAgPC8iICsgbnNOYW1lICsgZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHZhbHVlcyBmcm9tIHRoZSB0b29scy5wcm9wZXJ0aWVzIGZpbGUuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBnZXRQcm9wZXJ0aWVzKCkKLSAgewotICAgIC8vUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBUcnkgdG8gbG9hZCBwcm9wZXJ0aWVzIGZyb20gd3NpLnByb3BlcnRpZXMKLSAgICAgIC8vSW5wdXRTdHJlYW0gaXMgPSBVdGlscy5nZXRJbnB1dFN0cmVhbShQUk9QX0ZJTEVOQU1FKTsKLQotICAgICAgLy8gTG9hZCBwcm9wZXJ0aWVzIGZyb20gZmlsZQotICAgICAgLy9wcm9wcy5sb2FkKGlzKTsKLQotICAgICAgLy8gR2V0IHJlc291cmNlCi0gICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShQUk9QX0ZJTEVOQU1FKTsKLQotICAgICAgLy8gR2V0IHByb3BlcnR5IHZhbHVlcwotICAgICAgdGhpcy52ZXJzaW9uID0KLSAgICAgICAgZ2V0UHJvcGVydHkocmVzb3VyY2VCdW5kbGUsIFBST1BfVE9PTF9WRVJTSU9OLCBERUZfVE9PTF9WRVJTSU9OKTsKLSAgICAgIHRoaXMucmVsZWFzZURhdGUgPQotICAgICAgICBnZXRQcm9wZXJ0eSgKLSAgICAgICAgICByZXNvdXJjZUJ1bmRsZSwKLSAgICAgICAgICBQUk9QX1RPT0xfUkVMRUFTRV9EQVRFLAotICAgICAgICAgIERFRl9UT09MX1JFTEVBU0VfREFURSk7Ci0gICAgICB0aGlzLmltcGxlbWVudGVyID0KLSAgICAgICAgZ2V0UHJvcGVydHkoCi0gICAgICAgICAgcmVzb3VyY2VCdW5kbGUsCi0gICAgICAgICAgUFJPUF9UT09MX0lNUExFTUVOVEVSLAotICAgICAgICAgIERFRl9UT09MX0lNUExFTUVOVEVSKTsKLSAgICAgIHRoaXMubG9jYXRpb24gPQotICAgICAgICBnZXRQcm9wZXJ0eShyZXNvdXJjZUJ1bmRsZSwgUFJPUF9UT09MX0xPQ0FUSU9OLCBERUZfVE9PTF9MT0NBVElPTik7Ci0gICAgfQotCi0gICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpCi0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIGxvYWRpbmcgcHJvcGVydGllczogICIgKyBlLnRvU3RyaW5nKCkpOwotCi0gICAgICAvLyBTZXQgZGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZXMKLSAgICAgIHRoaXMudmVyc2lvbiA9IERFRl9UT09MX1ZFUlNJT047Ci0gICAgICB0aGlzLnJlbGVhc2VEYXRlID0gREVGX1RPT0xfUkVMRUFTRV9EQVRFOwotICAgICAgdGhpcy5pbXBsZW1lbnRlciA9IERFRl9UT09MX0lNUExFTUVOVEVSOwotICAgICAgdGhpcy5sb2NhdGlvbiA9IERFRl9UT09MX0xPQ0FUSU9OOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcHJvcGVydHkuCi0gICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZSAgYSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgYSBrZXkuCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgICAgYSBkZWZhdWx0IHZhbHVlLgotICAgKiBAcmV0dXJuIHByb3BlcnR5LiBJZiBub3QgZm91bmQgcmV0dXJuIGRlZmF1bHQgdmFsdWUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5KAotICAgIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLAotICAgIFN0cmluZyBrZXksCi0gICAgU3RyaW5nIGRlZmF1bHRWYWx1ZSkKLSAgewotICAgIFN0cmluZyB2YWx1ZTsKLQotICAgIGlmICgodmFsdWUgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KSkgPT0gbnVsbCkKLSAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlOwotCi0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEZvcm1hdCB0b29sIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gbG9jYXRpb24gIHRvb2wgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gZm9ybWF0dGVkIHRvb2wgbG9jYXRpb24uCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBmb3JtYXRUb29sTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgLy8gU3RhcnQgd2l0aCBzcGVjaWZpZWQgbG9jYXRpb24KLSAgICBTdHJpbmcgcmV0dXJuTG9jYXRpb24gPSBsb2NhdGlvbjsKLQotICAgIC8vIE1ha2Ugc3VyZSBzdHJpbmcgZW5kcyB0aGUgIi8iCi0gICAgaWYgKCFyZXR1cm5Mb2NhdGlvbi5lbmRzV2l0aCgiLyIpKQotICAgICAgcmV0dXJuTG9jYXRpb24gKz0gIi8iOwotCi0gICAgLy8gQWRkIHRvb2wgbmFtZSBhbmQgLmh0bWwKLSAgICByZXR1cm4gcmV0dXJuTG9jYXRpb24gKyBnZXROYW1lKCkgKyAiLmh0bWwiOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSB0aGUgdG9vbHMucHJvcGVydGllcyBmaWxlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICogVGhlIGlucHV0IGFyZ3VlbWVudHMgYXJlOgotICAgKiA8b2w+Ci0gICAqIDxsaT5GaWxlbmFtZSBmb3IgdGhlIHByb3BlcnRpZXMgZmlsZSB0byBjcmVhdGUKLSAgICogPGxpPlZlcnNpb24gbnVtYmVyCi0gICAqIDxsaT4KLSAgICogPC9vbD4KLSAgICogQHBhcmFtIGFyZ3MgIHRoZSBhcmd1bWVudHMgZm9yIG1haW4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAgaW50IHN0YXR1c0NvZGUgPSAwOwotICAgIFN0cmluZyBmaWxlbmFtZSA9IFBST1BfRklMRU5BTUU7Ci0gICAgU3RyaW5nIHZlcnNpb24gPSBERUZfVE9PTF9WRVJTSU9OOwotICAgIFN0cmluZyBpbXBsZW1lbnRlciA9IERFRl9UT09MX0lNUExFTUVOVEVSOwotICAgIFN0cmluZyBsb2NhdGlvbiA9IERFRl9UT09MX0xPQ0FUSU9OOwotCi0gICAgLy8gU2V0IHRoZSBmaWxlIG5hbWUKLSAgICBpZiAoYXJncy5sZW5ndGggPj0gMSkKLSAgICAgIGZpbGVuYW1lID0gYXJnc1swXTsKLQotICAgIGlmIChhcmdzLmxlbmd0aCA+PSAyKQotICAgICAgdmVyc2lvbiA9IGFyZ3NbMV07Ci0KLSAgICBpZiAoYXJncy5sZW5ndGggPj0gMykKLSAgICAgIGltcGxlbWVudGVyID0gYXJnc1syXTsKLQotICAgIGlmIChhcmdzLmxlbmd0aCA+PSA0KQotICAgICAgbG9jYXRpb24gPSBhcmdzWzNdOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gQ3JlYXRlIGZpbGUgd3JpdGVyCi0gICAgICBGaWxlV3JpdGVyIGZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSk7Ci0KLSAgICAgIC8vIENyZWF0ZSBwcmludCB3cml0ZXIKLSAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGZpbGVXcml0ZXIpOwotCi0gICAgICAvLyBXcml0ZSBvdXQgY29udGVudHMgb2YgcHJvcGVydGllcyBmaWxlCi0gICAgICBwcmludFdyaXRlci5wcmludGxuKENPTU1FTlRTKTsKLSAgICAgIHByaW50V3JpdGVyLnByaW50bG4oUFJPUF9UT09MX1ZFUlNJT04gKyAiPSIgKyB2ZXJzaW9uKTsKLSAgICAgIHByaW50V3JpdGVyLnByaW50bG4oUFJPUF9UT09MX1JFTEVBU0VfREFURSArICI9IiArIFV0aWxzLmdldERhdGUoKSk7Ci0gICAgICBwcmludFdyaXRlci5wcmludGxuKFBST1BfVE9PTF9JTVBMRU1FTlRFUiArICI9IiArIGltcGxlbWVudGVyKTsKLSAgICAgIHByaW50V3JpdGVyLnByaW50bG4oUFJPUF9UT09MX0xPQ0FUSU9OICsgIj0iICsgbG9jYXRpb24pOwotCi0gICAgICAvLyBDbG9zZSBmaWxlIHdyaXRlcgotICAgICAgZmlsZVdyaXRlci5jbG9zZSgpOwotCi0gICAgICAvLyBEb25lCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgWyIgKyBmaWxlbmFtZSArICJdIGNyZWF0ZWQuIik7Ci0gICAgfQotCi0gICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIHN0YXR1c0NvZGUgPSAxOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFWENFUFRJT046ICIgKyBpb2UudG9TdHJpbmcoKSk7Ci0gICAgICBpb2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotCi0gICAgLy8gRXhpdAotICAgIFN5c3RlbS5leGl0KHN0YXR1c0NvZGUpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRTID0gIiI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDc1MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1dTSUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBJQk0gQ29ycG9yYXRpb24sIFBhcmFzb2Z0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICBQYXJhc29mdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZTsKLQotLyoqCi0gKiBXUy1JIGNvbnN0YW50cy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQGF1dGhvciBKaW0gQ2x1bmUKLSAqIEBhdXRob3IgR3JhaGFtIFR1cnJlbGwgKGd0dXJyZWxsQHVrLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NJQ29uc3RhbnRzIHsKLQkvKioKLQkgKiBDb3B5cmlnaHQgbm90aWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFlSSUdIVCA9ICJDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBieSBUaGUgV2ViIFNlcnZpY2VzLUludGVyb3BlcmFiaWxpdHkgT3JnYW5pemF0aW9uIGFuZCBDZXJ0YWluICIKLQkJCSsgIm9mIGl0cyBNZW1iZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuVXNlIG9mIHRoaXMgTWF0ZXJpYWwgaXMgZ292ZXJuZWQgYnkgV1MtSSBsaWNlbnNlcyBpbmNsdWRlZCB3aXRoaW4gdGhlIGRvY3VtZW50YXRpb24uIjsKLQotCS8qKgotCSAqIFhNTCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RFQ0wgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IjsKLQotCS8qKgotCSAqIFhNTCBuYW1lc3BhY2UgVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9YTUxOUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1hNTCA9ICAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjsKLQkvKioKLQkgKiBYTUwgc2NoZW1hIG5hbWVzcGFjZSBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1hTRCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0KLQkvKioKLQkgKiBYTUwgc2NoZW1hIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9TQ0hFTUFfTE9DQVRJT04gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEueHNkIjsKLQotCS8qKgotCSAqIFhNTCBzY2hlbWEgbmFtZXNwYWNlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfTkFNRV9YU0QgPSAieHNkIjsKLQotCS8qKgotCSAqIFhNTCBzY2hlbWEgaW5zdGFuY2UgbmFtZXNwYWNlIFVSSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfWFNJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsKLQotCS8qKgotCSAqIFhNTCBzY2hlbWEgbmFtZXNwYWNlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfTkFNRV9YU0kgPSAieHNpIjsKLQotCi0JLyoqCi0JICogV1MtSSBtZXNzYWdlIGxvZyBuYW1lc3BhY2UgVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9XU0lfTE9HID0gImh0dHA6Ly93d3cud3MtaS5vcmcvdGVzdGluZy8yMDA0LzA3L2xvZy8iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfTkFNRV9XU0lfTE9HID0gIndzaS1sb2ciOwotCi0JLyoqCi0JICogV1MtSSBjb25mb3JtYW5jZSByZXBvcnQgbmFtZXNwYWNlIFVSSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfV1NJX1JFUE9SVCA9ICJodHRwOi8vd3d3LndzLWkub3JnL3Rlc3RpbmcvMjAwNC8wNy9yZXBvcnQvIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19OQU1FX1dTSV9SRVBPUlQgPSAid3NpLXJlcG9ydCI7Ci0KLQkvKioKLQkgKiBXUy1JIHByb2ZpbGUgdGVzdCBhc3NlcnRpb25zIG5hbWVzcGFjZSBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1dTSV9BU1NFUlRJT05TXzIwMDMgPSAiaHR0cDovL3d3dy53cy1pLm9yZy90ZXN0aW5nLzIwMDMvMDMvYXNzZXJ0aW9ucy8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9XU0lfQVNTRVJUSU9OUyA9ICJodHRwOi8vd3d3LndzLWkub3JnL3Rlc3RpbmcvMjAwNC8wNy9hc3NlcnRpb25zLyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19OQU1FX1dTSV9BU1NFUlRJT05TID0gIndzaS1hc3NlcnRpb25zIjsKLQotCS8qKgotCSAqIFdTLUkgbW9uaXRvciBjb25maWd1cmF0aW9uIGZpbGUgbmFtZXNhcGNlIFVSSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfV1NJX01PTklUT1JfQ09ORklHXzIwMDMgPSAiaHR0cDovL3d3dy53cy1pLm9yZy90ZXN0aW5nLzIwMDMvMDMvbW9uaXRvckNvbmZpZy8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9XU0lfTU9OSVRPUl9DT05GSUcgPSAiaHR0cDovL3d3dy53cy1pLm9yZy90ZXN0aW5nLzIwMDQvMDcvbW9uaXRvckNvbmZpZy8iOwotCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfTkFNRV9XU0lfTU9OSVRPUl9DT05GSUcgPSAid3NpLW1vbkNvbmZpZyI7Ci0KLQkvKioKLQkgKiBXUy1JIGFuYWx5emVyIGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lc2FwY2UgVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9XU0lfQU5BTFlaRVJfQ09ORklHXzIwMDMgPSAiaHR0cDovL3d3dy53cy1pLm9yZy90ZXN0aW5nLzIwMDMvMDMvYW5hbHl6ZXJDb25maWcvIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfV1NJX0FOQUxZWkVSX0NPTkZJRyA9ICJodHRwOi8vd3d3LndzLWkub3JnL3Rlc3RpbmcvMjAwNC8wNy9hbmFseXplckNvbmZpZy8iOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX05BTUVfV1NJX0FOQUxZWkVSX0NPTkZJRyA9ICJ3c2ktYW5hbHl6ZXJDb25maWciOwotCi0JLyoqCi0JICogV1MtSSBjb21tb24gbmFtZXNhcGNlIFVSSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfV1NJX0NPTU1PTl8yMDAzID0gImh0dHA6Ly93d3cud3MtaS5vcmcvdGVzdGluZy8yMDAzLzAzL2NvbW1vbi8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9XU0lfQ09NTU9OID0gImh0dHA6Ly93d3cud3MtaS5vcmcvdGVzdGluZy8yMDA0LzA3L2NvbW1vbi8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX05BTUVfV1NJX0NPTU1PTiA9ICJ3c2ktY29tbW9uIjsKLQotCS8qKgotCSAqIFNPQVAgVjEuMSBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfVVJJX1NPQVAgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOwotCi0JLyoqCi0JICogU09BUC8xLjEgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfVVJJX1NPQVBfRU5DT0RJTkcgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1NPQVBfTkVYVF9BQ1RPUiA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiIDsKLQkvKioKLQkgKiBIVFRQIHRyYW5zcG9ydC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19VUklfU09BUF9IVFRQID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCI7Ci0KLQkvKioKLQkgKiBXU0RMIFYxLjEgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9XU0RMID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIjsKLQotCS8qKgotCSAqIFdTREwgU09BUCBiaW5kaW5nIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19VUklfV1NETF9TT0FQID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfTkFNRV9XU0RMX1NPQVAgPSAic29hcCI7Ci0KLQkvKioKLQkgKiBXU0RMIE1JTUUgYmluZGluZyBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfTkFNRV9XU0RMX01JTUUgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyI7Ci0KLQkvKioKLQkgKiBXU0RMIEhUVFAgR0VUICYgUE9TVCBiaW5kaW5nIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19OQU1FX1dTRExfSFRUUCA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIjsKLQotCS8qKgotCSAqIFdTREwgRElNRSBiaW5kaW5nIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19OQU1FX1dTRExfRElNRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvd3NkbC8iOwotCi0JLyoqCi0JICogQ29uZm9ybWFuY2UgQ2xhaW0gbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9DTEFJTSA9ICJodHRwOi8vd3MtaS5vcmcvc2NoZW1hcy9jb25mb3JtYW5jZUNsYWltLyI7Ci0KLQkvKioKLQkgKiBVRERJIFYyIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19VUklfVURESV9WMiA9ICJ1cm46dWRkaS1vcmc6YXBpX3YyIjsKLQotCS8qKgotCSAqIFRoZSBYTUwgU2NoZW1hIGZvciB0aGUgdHlwZSB1c2VkIHRvIHJlZmVyIHRvIGF0dGFjaG1lbnRzIGZyb20gdGhlIFNPQVAKLQkgKiBlbnZlbG9wZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19VUklfU1dBX1JFRiA9ICJodHRwOi8vd3MtaS5vcmcvcHJvZmlsZXMvYmFzaWMvMS4xL3hzZCI7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTQ0hFTUFfVFlQRV9TV0FfUkVGID0gInN3YVJlZiI7Ci0KLQkvKioKLQkgKiBFbGVtZW50IG5hbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQUREX1NUWUxFX1NIRUVUID0gImFkZFN0eWxlU2hlZXQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9BRERJVElPTkFMX0VOVFJZX1RZUEVfTElTVCA9ICJhZGRpdGlvbmFsRW50cnlUeXBlTGlzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0FOQUxZWkVSX0ZBSUxVUkUgPSAiYW5hbHl6ZXJGYWlsdXJlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQVJUSUZBQ1QgPSAiYXJ0aWZhY3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9BUlRJRkFDVF9SRUZFUkVOQ0UgPSAiYXJ0aWZhY3RSZWZlcmVuY2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9BU1NFUlRJT05fQ09WRVJBR0UgPSAiYXNzZXJ0aW9uQ292ZXJhZ2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9BU1NFUlRJT05fREVTQ1JJUFRJT04gPSAiYXNzZXJ0aW9uRGVzY3JpcHRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9BU1NFUlRJT05fUkVTVUxUID0gImFzc2VydGlvblJlc3VsdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0FTU0VSVElPTl9SRVNVTFRfU1VNTUFSWSA9ICJhc3NlcnRpb25SZXN1bHRTdW1tYXJ5IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQVNTRVJUSU9OX1JFU1VMVFMgPSAiYXNzZXJ0aW9uUmVzdWx0cyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0NMRUFOVVBfVElNRU9VVF9TRUNPTkRTID0gImNsZWFudXBUaW1lb3V0U2Vjb25kcyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0NPTkZJRyA9ICJjb25maWd1cmF0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQ09NTUVOVCA9ICJjb21tZW50IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQ09OVEVYVCA9ICJjb250ZXh0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fREVUQUlMID0gImRldGFpbCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0RFVEFJTF9ERVNDUklQVElPTiA9ICJkZXRhaWxEZXNjcmlwdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fRU5WSVJPTk1FTlQgPSAiZW52aXJvbm1lbnQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9FTlRSWSA9ICJlbnRyeSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBSUxVUkVfREVUQUlMID0gImZhaWx1cmVEZXRhaWwiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9GQUlMVVJFX0RFVEFJTF9ERVNDUklQVElPTiA9ICJmYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9GQUlMVVJFX01FU1NBR0UgPSAiZmFpbHVyZU1lc3NhZ2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9IVFRQX0hFQURFUlMgPSAiaHR0cEhlYWRlcnMiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9JTVBMRU1FTlRFUiA9ICJpbXBsZW1lbnRlciI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0lOUVVJUllfVVJMID0gImlucXVpcnlVUkwiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9MSVNURU5fUE9SVCA9ICJsaXN0ZW5Qb3J0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTE9HID0gImxvZyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0xPR19EVVJBVElPTiA9ICJsb2dEdXJhdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0xPR19GSUxFID0gImxvZ0ZpbGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9NQU5fSU5fVEhFX01JRERMRSA9ICJtYW5JblRoZU1pZGRsZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX01BWF9DT05ORUNUSU9OUyA9ICJtYXhDb25uZWN0aW9ucyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX01FU1NBR0VfQ09OVEVOVCA9ICJtZXNzYWdlQ29udGVudCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9NRVNTQUdFX0NPTlRFTlRfV0lUSF9BVFRBQ0hNRU5UUyA9ICJtZXNzYWdlQ29udGVudFdpdGhBdHRhY2htZW50cyI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9NRVNTQUdFX0VOVFJZID0gIm1lc3NhZ2VFbnRyeSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX01FU1NBR0VfSU5QVVQgPSAibWVzc2FnZUlucHV0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTU9OSVRPUiA9ICJtb25pdG9yIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fT1BFUkFUSU5HX1NZU1RFTSA9ICJvcGVyYXRpbmdTeXN0ZW0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9QUkVSRVFfRkFJTEVEX0xJU1QgPSAicHJlcmVxRmFpbGVkTGlzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1BSRVJFUV9MSVNUID0gInByZXJlcUxpc3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9QUk9GSUxFID0gInByb2ZpbGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9QUk9GSUxFX0FTU0VSVElPTlMgPSAicHJvZmlsZUFzc2VydGlvbnMiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9SRUFEX1RJTUVPVVRfU0VDT05EUyA9ICJyZWFkVGltZW91dFNlY29uZHMiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9SRUNFSVZFUl9IT1NUX0FORF9QT1JUID0gInJlY2VpdmVySG9zdEFuZFBvcnQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9SRURJUkVDVCA9ICJyZWRpcmVjdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1JFUE9SVCA9ICJyZXBvcnQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9SRVBPUlRfRklMRSA9ICJyZXBvcnRGaWxlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fUlVOVElNRSA9ICJydW50aW1lIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fU0NIRU1FX0FORF9IT1NUUE9SVCA9ICJzY2hlbWVBbmRIb3N0UG9ydCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1NFTkRFUl9IT1NUX0FORF9QT1JUID0gInNlbmRlckhvc3RBbmRQb3J0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fU0VSVklDRV9MT0NBVElPTiA9ICJzZXJ2aWNlTG9jYXRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9TVU1NQVJZID0gInN1bW1hcnkiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9URVNUX0FTU0VSVElPTiA9ICJ0ZXN0QXNzZXJ0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVEVTVF9BU1NFUlRJT05TX0ZJTEUgPSAidGVzdEFzc2VydGlvbnNGaWxlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVEVTVF9BU1NFUlRJT05fSUQgPSAidGVzdEFzc2VydGlvbklEIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVEVTVF9DT1ZFUkFHRSA9ICJ0ZXN0Q292ZXJhZ2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9VRERJX0VOVFJZID0gInVkZGlFbnRyeSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1VERElfS0VZID0gInVkZGlLZXkiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9VRERJX1JFRkVSRU5DRSA9ICJ1ZGRpUmVmZXJlbmNlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVkVSQk9TRSA9ICJ2ZXJib3NlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fV1NETF9FTEVNRU5UID0gIndzZGxFbGVtZW50IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fV1NETF9JTlBVVCA9ICJ3c2RsSW5wdXQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9XU0RMX1JFRkVSRU5DRSA9ICJ3c2RsUmVmZXJlbmNlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fV1NETF9VUkkgPSAid3NkbFVSSSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1hNTF9QQVJTRVIgPSAieG1sUGFyc2VyIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX01JTUVfUEFSVCA9ICJtaW1lUGFydCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX01JTUVfSEVBREVSUyA9ICJtaW1lSGVhZGVycyI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9NSU1FX0NPTlRFTlQgPSAibWltZUNvbnRlbnQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9CT1VOREFSWV9TVFJJTkcgPSAiYm91bmRhcnlTdHJpbmciOwotCi0JLyoqCi0JICogQXR0cmlidXRlIG5hbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQUxURVJOQVRFID0gImFsdGVybmF0ZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FSUkFZX1RZUEUgPSAiYXJyYXlUeXBlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVNTRVJUSU9OX0RFU0NSSVBUSU9OID0gImFzc2VydGlvbkRlc2NyaXB0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQk9NID0gIkJPTSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NIQVJTRVQgPSAiY2hhcnNldCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NPREUgPSAiY29kZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NPTFVNTl9OVU1CRVIgPSAiY29sdW1uTnVtYmVyIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09OVkVSU0FUSU9OX0lEID0gImNvbnZlcnNhdGlvbklEIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09SUkVMQVRJT05fVFlQRSA9ICJjb3JyZWxhdGlvblR5cGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9EQVRFID0gImRhdGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9FTkFCTEVEID0gImVuYWJsZWQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9FTlRSWV9UWVBFID0gImVudHJ5VHlwZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZBSUxVUkVfTUVTU0FHRSA9ICJmYWlsdXJlTWVzc2FnZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZBSUxVUkVfREVUQUlMID0gImZhaWx1cmVEZXRhaWwiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9IUkVGID0gImhyZWYiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEX1VDID0gIklEIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSU1QTEVNRU5URVIgPSAiaW1wbGVtZW50ZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MSU5FX05VTUJFUiA9ICJsaW5lTnVtYmVyIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTE9DQVRJT04gPSAibG9jYXRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRURJQSA9ICJtZWRpYSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01FU1NBR0VfRU5UUlkgPSAibWVzc2FnZUVudHJ5IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUVTU0FHRVMgPSAibWVzc2FnZXMiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUEFSRU5UX0VMRU1FTlRfTkFNRSA9ICJwYXJlbnRFbGVtZW50TmFtZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFRkVSRU5DRV9JRCA9ICJyZWZlcmVuY2VJRCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFRkVSRU5DRV9UWVBFID0gInJlZmVyZW5jZVR5cGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRUxFQVNFX0RBVEUgPSAicmVsZWFzZURhdGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRVBMQUNFID0gInJlcGxhY2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRVNVTFQgPSAicmVzdWx0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU0VSVklDRV9OQU1FID0gInNlcnZpY2VOYW1lIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1BFQ0lGSUNBVElPTiA9ICJzcGVjaWZpY2F0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1RJVExFID0gInRpdGxlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVFlQRSA9ICJ0eXBlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKLQotCS8qKgotCSAqIERlZmF1bHQgdmFsdWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVQT1JUX1VSSSA9ICJyZXBvcnQueG1sIjsKLQotCS8vIFRFTVA6IFVzZSB0aGUgZm9sbG93aW5nIHJlcG9ydCB0aXRsZSBmb3IgdGhlIGRyYWZ0IHJlbGVhc2Ugb25seS4KLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVQT1JUX1RJVExFID0gIldTLUkgUHJvZmlsZQotCS8vIENvbmZvcm1hbmNlIFJlcG9ydCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRVBPUlRfVElUTEUgPSAiV1MtSSBCYXNpYyBQcm9maWxlIENvbmZvcm1hbmNlIFJlcG9ydC4iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9URVNUX0FTU0VSVElPTlNfRE9DVU1FTlRfVVJJID0gIi4uL2NvbW1vbi9wcm9maWxlcy9TU0JQMTBfQlAxMV9UQUQueG1sIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HX1hTTCA9ICIuLi9jb21tb24veHNsL2xvZy54c2wiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRVBPUlRfWFNMID0gIi4uL2NvbW1vbi94c2wvcmVwb3J0LnhzbCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1hTTF9UWVBFID0gInRleHQveHNsIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfWE1MX0VOQ09ESU5HID0gIlVURi04IjsKLQotCS8qKgotCSAqIEJPTSBjb25zdGFudHMuCi0JICogIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IEJPTV9VVEYxNiA9IDB4RkZGRTsKLQotCXB1YmxpYyBzdGF0aWMgaW50IEJPTV9VVEYxNl9CSUdfRU5ESUFOID0gMHhGRUZGOwotCi0JcHVibGljIHN0YXRpYyBpbnQgQk9NX1VURjggPSAweEVGQkJCRjsKLQotCS8qKgotCSAqIFZhbGlkYXRpb24gY29uc3RhbnRzLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElUID0gImxpdGVyYWwiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0VOQyA9ICJlbmNvZGVkIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQyA9ICJkb2N1bWVudCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMgPSAicnBjIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJWQUxfQ09SUkVMQVRJT05fVFlQRV9FTkRQT0lOVCA9ICJlbmRwb2ludCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMX0NPUlJFTEFUSU9OX1RZUEVfTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMX0NPUlJFTEFUSU9OX1RZUEVfT1BFUkFUSU9OID0gIm9wZXJhdGlvbiI7Ci0KLQkvKioKLQkgKiBXUy1JIGNvbnN0YW50cyAtIGF0dHJpYnV0ZXMgZm9yIGNvbmZvcm1hbmNlIGNsYWltcyAoZGlzY292ZXJ5KS4KLQkgKiAgCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMX1VERElfQ0xBSU1fS0VZVkFMVUUgPSAiaHR0cDovL3dzLWkub3JnL3Byb2ZpbGVzL2Jhc2ljLzEuMCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMX1VERElfQ0xBSU1fVE1PREVMS0VZID0gInV1aWQ6NjU3MTkxNjgtNzJjNi0zZjI5LThjMjAtNjJkZWZiMDk2MWMwIjsKLQotCS8qKgotCSAqIFdTLUkgbmFtZXMgYW5kIHZlcnNpb25zIG9mIHRoZSBwcm9maWxlIHRlc3QgYXNzZXJ0aW9uIGRvY3VtZW50IHN1cHBvcnRlZAotCSAqIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRlc3QgdG9vbHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUNfUFJPRklMRV9UQURfTkFNRSA9ICJCYXNpYyBQcm9maWxlIFRlc3QgQXNzZXJ0aW9ucyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19QUk9GSUxFXzFfMV9UQURfTkFNRSA9ICJCYXNpYyBQcm9maWxlIDEuMSBUZXN0IEFzc2VydGlvbnMiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lNUExFX1NPQVBfQklORElOR1NfUFJPRklMRV9UQURfTkFNRSA9ICJTaW1wbGUgU29hcCBCaW5kaW5nIFByb2ZpbGUgWzEuMF0gKHdpdGggQmFzaWMgUHJvZmlsZSBbMS4xXSkgVGVzdCBBc3NlcnRpb25zIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEFDSE1FTlRTX1BST0ZJTEVfVEFEX05BTUUgPSAiQXR0YWNobWVudHMgUHJvZmlsZSBbMS4wXSAod2l0aCBCYXNpYyBQcm9maWxlIFsxLjFdIGFuZCBTaW1wbGUgU29hcCBCaW5kaW5nIFByb2ZpbGUgWzEuMF0pIFRlc3QgQXNzZXJ0aW9ucyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19QUk9GSUxFX1RBRF9WRVJTSU9OID0gIjEuMS4wIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDX1BST0ZJTEVfMV8xX1RBRF9WRVJTSU9OID0gIjEuMS4wIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTVBMRV9TT0FQX0JJTkRJTkdTX1BST0ZJTEVfVEFEX1ZFUlNJT04gPSAiMS4wLjAiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNITUVOVFNfUFJPRklMRV9UQURfVkVSU0lPTiA9ICIxLjAuMCI7Ci0KLQkvKioKLQkgKiBTeXN0ZW0gZGVwZW5kZW50IGxpbmUgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUEFSQVRPUiA9IFN5c3RlbQotCQkJLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0JLyoqCi0JICogU3lzdGVtIGRlcGVuZGVudCBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9TRVBBUkFUT1IgPSBTeXN0ZW0KLQkJCS5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiKTsKLQotCS8qKgotCSAqIEZpbGUgd2hpY2ggY29udGFpbnMgdGhlIGNvcHlyaWdodCwgbGljZW5zZSBhbmQgZmVlZGJhY2sgY29tbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVFNfRklMRSA9ICJjb21tZW50cy54bWwiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFX1RFWFRfWE1MID0gInRleHQveG1sIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRV9NVUxUSVBBUlQgPSAibXVsdGlwYXJ0L3JlbGF0ZWQiOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1dTSUV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1dTSUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzkzNDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9XU0lFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLS8qKgotICogUHJpbWFyeSBXUy1JIGV4Y2VwdGlvbi4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0lFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgLyoqCi0gICAqIFRocm93YWJsZS4KLSAgICovCi0gIHByb3RlY3RlZCBUaHJvd2FibGUgdGhyb3dhYmxlID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlIGFuIGV4Y2VwdGlvbiB3aXRob3V0IGEgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBXU0lFeGNlcHRpb24oKQotICB7Ci0gICAgLy8gRXhjZXB0aW9uCi0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gZXhjZXB0aW9uIHdpdGggYSBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1zZyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBXU0lFeGNlcHRpb24oU3RyaW5nIG1zZykKLSAgewotICAgIC8vIEV4Y2VwdGlvbgotICAgIHN1cGVyKG1zZyk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGFuIGV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBhbmQgcmVsYXRlZCBleGNlcHRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gbXNnICAgICAgICB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICogQHBhcmFtIHRocm93YWJsZSAgdGhyb3dhYmxlIHRoYXQgaXMgcmVsYXRlZCB0byB0aGlzIGV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIFdTSUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKQotICB7Ci0gICAgLy8gRXhjZXB0aW9uCi0gICAgc3VwZXIobXNnKTsKLQotICAgIC8vIFNhdmUgaW5wdXQgcmVmZXJlbmNlCi0gICAgdGhpcy50aHJvd2FibGUgPSB0aHJvd2FibGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0J3MgdmFsdWVzLgotICAgKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRldGFpbCBtZXNzYWdlIG9mIHRoaXMgdGhyb3dhYmxlIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdCdzIHZhbHVlcy4KLSAgICoKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXRhaWwgbWVzc2FnZSBvZiB0aGlzIHRocm93YWJsZSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIC8vU3RyaW5nV3JpdGVyIHN3OwotICAgIC8vUHJpbnRXcml0ZXIgcHc7Ci0KLSAgICAvLyBBbHdheXMgZ2V0IG1lc3NhZ2UgZnJvbSBzdXBlciBjbGFzcwotICAgIFN0cmluZyBtc2cgPSBzdXBlci5nZXRNZXNzYWdlKCk7Ci0KLSAgICAvLyBJZiB0aGlzIGV4Y2VwdGlvbiBjb250YWlucyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIGV4Y2VwdGlvbiwKLSAgICAvLyB0aGVuIGFkZCBpdCB0byB0aGUgbWVzc2FnZQotICAgIGlmICh0aHJvd2FibGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBtc2cgKz0gIlxuIgotICAgICAgICArICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKLSAgICAgICAgKyAiICBOZXN0ZWQgZXhjZXB0aW9uIGlzOiBcblxuICAiCi0gICAgICAgICsgdGhyb3dhYmxlLnRvU3RyaW5nKCkKLSAgICAgICAgKyAiXG4iOwotCi0gICAgICAvLyBJZiB0aHJvd2FibGUgaXMgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCAKLSAgICAgIC8vIHRoZW4gYWRkIGNsYXNzIG5hbWUgYW5kIGtleSB0byBvdXRwdXQKLSAgICAgIGlmICh0aHJvd2FibGUgaW5zdGFuY2VvZiBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUgPSAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKSB0aHJvd2FibGU7Ci0KLSAgICAgICAgLy8gR2V0IGNsYXNzIG5hbWUgYW5kIGtleQotICAgICAgICBtc2cgKz0gIiAtICIKLSAgICAgICAgICArIG1yZS5nZXRLZXkoKQotICAgICAgICAgICsgIlxuXHQiCi0gICAgICAgICAgKyAiW0NsYXNzIE5hbWU6ICIKLSAgICAgICAgICArIG1yZS5nZXRDbGFzc05hbWUoKQotICAgICAgICAgICsgIl0iOwotICAgICAgfQotCi0gICAgICAvLyBJZiB0aHJvd2FibGUgaXMgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgCi0gICAgICAvLyB0aGVuIHRhcmdldCBvZiBleGNlcHRpb24KLSAgICAgIGVsc2UgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlID0gKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHRocm93YWJsZTsKLQotICAgICAgICAvLyBHZXQgdGFyZ2V0Ci0gICAgICAgIG1zZyArPSAiIC0gIiArIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKS50b1N0cmluZygpOwotICAgICAgfQotCi0gICAgICAvLyBBREQ6IFByaW50IHN0YWNrIHRyYWNlCi0gICAgICAvL3N3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgLy9wdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0gICAgICAvL3Rocm93YWJsZS5wcmludFN0YWNrVHJhY2UocHcpOwotCi0gICAgICAvLyBBZGQgaXQgdG8gdGhlIG1lc3NhZ2UKLSAgICAgIC8vbXNnICs9IHN3LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIG1lc3NhZ2UKLSAgICByZXR1cm4gbXNnOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbiB0byBiZSBjcmVhdGVkLgotICAgKiAKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBlbmNhcHN1bGF0ZWQgdGhyb3dhYmxlIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBUaHJvd2FibGUgZ2V0VGFyZ2V0RXhjZXB0aW9uKCkKLSAgewotICAgIC8vIFJldHVybiB0aHJvd2FibGUKLSAgICByZXR1cm4gdGhyb3dhYmxlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZTIzOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1dTSUZpbGVOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhbiBhdHRlbXB0IHRvIG9wZW4gdGhlIGZpbGUgZGVub3RlZCBieSBhIHNwZWNpZmllZCAKLSAqIHBhdGhuYW1lIGhhcyBmYWlsZWQuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0lGaWxlTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBXU0lFeGNlcHRpb24KLXsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFdTSUZpbGVOb3RGb3VuZEV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBXU0lGaWxlTm90Rm91bmRFeGNlcHRpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uLgotICAgKiBAcGFyYW0gbXNnICB0aGUgZGV0YWlsIG1lc3NhZ2UuCi0gIAotICAgKi8KLSAgcHVibGljIFdTSUZpbGVOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgbXNnKQotICB7Ci0gICAgc3VwZXIobXNnKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uLgotICAgKiBAcGFyYW0gbXNnICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB0aHJvd2FibGUgIGluaXRpYWwgZXhjZXB0aW9uIHRocm93bi4KLSAgICovCi0gIHB1YmxpYyBXU0lGaWxlTm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRocm93YWJsZSkKLSAgewotICAgIHN1cGVyKG1zZywgdGhyb3dhYmxlKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1dTSVJ1bnRpbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4MGUzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJUnVudGltZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBydW50aW1lIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBhZnRlciBwcm9jZXNzaW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgY2xhc3MgV1NJUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFdTSUV4Y2VwdGlvbgotewotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgV1NJUnVudGltZUV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBXU0lSdW50aW1lRXhjZXB0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFdTSVJ1bnRpbWVFeGNlcHRpb24uCi0gICAqIEBwYXJhbSBtc2cgIHRoZSBkZXRhaWwgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBXU0lSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBtc2cpCi0gIHsKLSAgICBzdXBlcihtc2cpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBXU0lSdW50aW1lRXhjZXB0aW9uLgotICAgKiBAcGFyYW0gbXNnICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB0aHJvd2FibGUgIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiB0aHJvd24uCi0gIAotICAgKi8KLSAgcHVibGljIFdTSVJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRocm93YWJsZSkKLSAgewotICAgIHN1cGVyKG1zZywgdGhyb3dhYmxlKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJVGFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NjM4YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1dTSVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVGFnczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogV1MtSSBjb25zdGFudHMuICAKLSAqICAKLSAqIEBhdXRob3IgS3VsaWsKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0lUYWcgZXh0ZW5kcyBYTUxUYWdzCi17Ci0gIC8qKgotICAgKiBRdWFsaWZpZWQgbmFtZXMgb2YgV1NETCBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgV1NETF9JTVBPUlQgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwsICJpbXBvcnQiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBXU0RMX1RZUEVTID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAidHlwZXMiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBXU0RMX01FU1NBR0UgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwsICJtZXNzYWdlIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgV1NETF9ET0NVTUVOVEFUSU9OID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAiZG9jdW1lbnRhdGlvbiIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIFdTRExfREVGSU5JVElPTlMgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwsICJkZWZpbml0aW9ucyIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIFdTRExfQklORElORyA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCwgImJpbmRpbmciKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBXU0RMX09QRVJBVElPTiA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCwgIm9wZXJhdGlvbiIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIFdTRExfUEFSVCA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCwgInBhcnQiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBXU0RMX0lOUFVUID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAiaW5wdXQiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBXU0RMX09VVFBVVCA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCwgIm91dHB1dCIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIFdTRExfRkFVTFQgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwsICJmYXVsdCIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIFdTRExfU0VSVklDRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCwgInNlcnZpY2UiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBXU0RMX1BPUlQgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwsICJwb3J0Iik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgV1NETF9QT1JUVFlQRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCwgInBvcnRUeXBlIik7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBXU0RMX1NPQVBfQklORElORyA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETF9TT0FQLCAiYmluZGluZyIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFdTRExfU09BUF9CT0RZID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMX1NPQVAsICJib2R5Iik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgV1NETF9TT0FQX0hFQURFUiA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETF9TT0FQLCAiaGVhZGVyIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgV1NETF9TT0FQX0hFQURFUkZBVUxUID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMX1NPQVAsICJoZWFkZXJmYXVsdCIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFdTRExfU09BUF9GQVVMVCA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETF9TT0FQLCAiZmF1bHQiKTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFdTRExfTUlNRV9DT05URU5UID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NETF9NSU1FLCAiY29udGVudCIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFdTRExfTUlNRV9YTUwgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfTkFNRV9XU0RMX01JTUUsICJtaW1lWG1sIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgV1NETF9NSU1FX1BBUlQgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfTkFNRV9XU0RMX01JTUUsICJwYXJ0Iik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgV1NETF9NSU1FX01VTFRJUEFSVCA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19OQU1FX1dTRExfTUlNRSwgIm11bHRpcGFydFJlbGF0ZWQiKTsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEFUVFJfV1NETF9BUlJBWVRZUEUgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwsICJhcnJheVR5cGUiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBBVFRSX1dTRExfTkFNRVNQQUNFID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAibmFtZXNwYWNlIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgQVRUUl9XU0RMX0xPQ0FUSU9OID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAibG9jYXRpb24iKTsKLQotICAvKioKLSAgICogTmFtZXNwYWNlcy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9DTEFJTSA9Ci0gICAgImh0dHA6Ly93cy1pLm9yZy9zY2hlbWFzL2NvbmZvcm1hbmNlQ2xhaW0vIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfVVJJX1NPQVAgPQotICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9TT0FQRU5DID0KLSAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19VUklfQkFTSUNfUFJPRklMRTEwID0KLSAgICAiaHR0cDovL3dzaS5vcmcvcHJvZmlsZXMvYmFzaWMxLjAvIjsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIFNPQVBFTkNfQVJSQVkgPSBuZXcgUU5hbWUoTlNfVVJJX1NPQVBFTkMsICJBcnJheSIpOwotCi0gIC8qKgotICAgKiBRdWFsaWZpZWQgbmFtZXMgb2YgV1MtSSBjbGFpbSBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgV1NJX0NMQUlNID0gbmV3IFFOYW1lKE5TX1VSSV9DTEFJTSwgIkNsYWltIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgQVRUUl9DTEFJTV9DT05GT1JNU1RPID0KLSAgICBuZXcgUU5hbWUoTlNfVVJJX0NMQUlNLCAiY29uZm9ybXNUbyIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEFUVFJfU09BUF9NVVNUVU5ERVJTVEFORCA9Ci0gICAgbmV3IFFOYW1lKE5TX1VSSV9TT0FQLCAibXVzdFVuZGVyc3RhbmQiKTsKLQotICAvKioKLSAgICogUXVhbGlmaWVkIG5hbWVzIG9mIFNPQVAgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEVMRU1fU09BUF9FTlZFTE9QRSA9IG5ldyBRTmFtZShOU19VUklfU09BUCwgIkVudmVsb3BlIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRUxFTV9TT0FQX0JPRFkgPSBuZXcgUU5hbWUoTlNfVVJJX1NPQVAsICJCb2R5Iik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRUxFTV9TT0FQX0ZBVUxUID0gbmV3IFFOYW1lKE5TX1VSSV9TT0FQLCAiRmF1bHQiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBFTEVNX1NPQVBfSEVBREVSID0gbmV3IFFOYW1lKE5TX1VSSV9TT0FQLCAiSGVhZGVyIik7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvQW5hbHl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9BbmFseXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDVlNDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9BbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLlRvb2xJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLlByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVGVzdFV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFRoZSBBbmFseXplciB3aWxsIHByb2Nlc3MgYWxsIFByb2ZpbGUgY29uZm9ybWFuY2UgZnVuY3Rpb25zLgotICogVGhpcyBjbGFzcyBzaG91bGQgYmUgc3ViLWNsYXNzZWQgZm9yIGVhY2ggcHJvZmlsZS4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBKaW0gQ2x1bmUKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5hbHl6ZXIKLXsKLSAgLyoqCi0gICAqIE1lc3NhZ2UgbGlzdC4KLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlTGlzdCBtZXNzYWdlTGlzdCA9IG51bGw7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfQlVORExFX05BTUUgPQotICAgICJvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQW5hbHl6ZXIiOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTQUdFX01FU1NBR0UgPQotICAgICJVc2FnZTogQW5hbHl6ZXIgLWNvbmZpZyA8Y29uZmlnRmlsZW5hbWU+IjsKLQotICBwcm90ZWN0ZWQgUmVwb3J0ZXIgcmVwb3J0ZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCA9IG51bGw7Ci0gIHByb3RlY3RlZCBDYW5kaWRhdGVJbmZvIGNhbmRpZGF0ZUluZm8gPSBudWxsOwotCi0gIC8qKgotICAgKiBBbmFseXplciB0b29sIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFRvb2xJbmZvIHRvb2xJbmZvID0gbnVsbDsKLQotICAvKioKLSAgICogUHJvZmlsZSB2YWxpZGF0b3IgZmFjdG9yeS4KLSAgICovCi0gIHByb3RlY3RlZCBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQotICAvKioKLSAgICogUHJvZmlsZSB2YWxpZGF0b3IgZmFjdG9yeS4KLSAgICovCi0gIHByb3RlY3RlZCBEb2N1bWVudEZhY3RvcnkgZG9jdW1lbnRGYWN0b3J5ID0gbnVsbDsKLQotICAvKioKLSAgICogQW5hbHl6ZXIgY29uZmlnIGZpbGUgbGlzdC4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IGFuYWx5emVyQ29uZmlnTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJvdGVjdGVkIGludCBhbmFseXplckNvbmZpZ0luZGV4ID0gMDsKLQotICAvKioKLSAgICogUHJvZmlsZSBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIFByb2ZpbGVBc3NlcnRpb25zIHByb2ZpbGVBc3NlcnRpb25zID0gbnVsbDsKLQotICAvKioKLSAgICogTG9nIGZpbGUuCi0gICAqLwotICBwcm90ZWN0ZWQgTG9nIGxvZyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgYW5hbHl6ZXIgdG9vbC4KLSAgICogQHBhcmFtIGFyZ3MgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgKiBAcGFyYW0gdG9vbEluZm8gIGFuYWx5emVyIHRvb2wgaW5mb3JtYXRpb24uCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIGNyZWF0aW5nIHRoZSBpbnN0YW5jZSBvZiB0aGUgYW5hbHl6ZXIgdG9vbC4KLSAgICovCi0gIHB1YmxpYyBBbmFseXplcihTdHJpbmdbXSBhcmdzLCBUb29sSW5mbyB0b29sSW5mbykgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgaW5pdCh0b29sSW5mbyk7Ci0KLSAgICAvLyBHZXQgbmV3IGNvbmZpZyBvYmplY3QgICAKLSAgICB0aGlzLmFuYWx5emVyQ29uZmlnTGlzdC5hZGQoCi0gICAgICBhbmFseXplckNvbmZpZ0luZGV4LAotICAgICAgZG9jdW1lbnRGYWN0b3J5Lm5ld0FuYWx5emVyQ29uZmlnKCkpOwotICAgIGdldEFuYWx5emVyQ29uZmlnKCkuaW5pdChtZXNzYWdlTGlzdCk7Ci0KLSAgICAvLyBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gICAgZ2V0QW5hbHl6ZXJDb25maWcoKS5wYXJzZUFyZ3MoYXJncywgdHJ1ZSk7Ci0KLSAgICAvLyBEaXNwbGF5IGNvcHlyaWdodCBhbmQgb3B0aW9ucyB0aGF0IHdlcmUgc3BlY2lmaWVkCi0gICAgVGVzdFV0aWxzLnByaW50VG9vbEluZm8odG9vbEluZm8pOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRBbmFseXplckNvbmZpZygpLnRvU3RyaW5nKCkpOwotCi0gICAgLy8gRGlzcGxheSBtZXNzYWdlCi0gICAgcHJpbnRNZXNzYWdlKAotICAgICAgInByb2dyZXNzMDEiLAotICAgICAgbnVsbCwKLSAgICAgICJQbGVhc2Ugd2FpdCB3aGlsZSB0aGUgc3BlY2lmaWVkIGFydGlmYWN0cyBhcmUgYW5hbHl6ZWQuLi4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGFuYWx5emVyIHRvb2wuCi0gICAqIEBwYXJhbSBhcmdzICAgICAgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICogQHBhcmFtIHRvb2xJbmZvICBhbmFseXplciB0b29sIGluZm9ybWF0aW9uLgotICAgKiBAcGFyYW0gdmFsaWRhdGUgIGZsYWcgZm9yIGNvbmZpZyBvcHRpb25zIHZhbGlkYXRpb24uIAotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBjcmVhdGluZyB0aGUgaW5zdGFuY2Ugb2YgdGhlIGFuYWx5emVyIHRvb2wuCi0gICAqLwotICBwdWJsaWMgQW5hbHl6ZXIoU3RyaW5nW10gYXJncywgVG9vbEluZm8gdG9vbEluZm8sIGJvb2xlYW4gdmFsaWRhdGUpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGluaXQodG9vbEluZm8pOwotCi0gICAgLy8gR2V0IG5ldyBjb25maWcgb2JqZWN0ICAgCi0gICAgdGhpcy5hbmFseXplckNvbmZpZ0xpc3QuYWRkKAotICAgICAgICBhbmFseXplckNvbmZpZ0luZGV4LAotICAgICAgICBkb2N1bWVudEZhY3RvcnkubmV3QW5hbHl6ZXJDb25maWcoKSk7Ci0gICAgZ2V0QW5hbHl6ZXJDb25maWcoKS5pbml0KG1lc3NhZ2VMaXN0KTsKLQotICAgIC8vIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLSAgICBnZXRBbmFseXplckNvbmZpZygpLnBhcnNlQXJncyhhcmdzLCB2YWxpZGF0ZSk7Ci0KLSAgICAvLyBEaXNwbGF5IGNvcHlyaWdodCBhbmQgb3B0aW9ucyB0aGF0IHdlcmUgc3BlY2lmaWVkCi0gICAgVGVzdFV0aWxzLnByaW50VG9vbEluZm8odG9vbEluZm8pOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRBbmFseXplckNvbmZpZygpLnRvU3RyaW5nKCkpOwotCi0gICAgLy8gRGlzcGxheSBtZXNzYWdlCi0gICAgcHJpbnRNZXNzYWdlKAotICAgICAgICAicHJvZ3Jlc3MwMSIsCi0gICAgICAgIG51bGwsCi0gICAgIlBsZWFzZSB3YWl0IHdoaWxlIHRoZSBzcGVjaWZpZWQgYXJ0aWZhY3RzIGFyZSBhbmFseXplZC4uLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgYW5hbHl6ZXIgdG9vbC4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29uZmlnTGlzdCAgYW5hbHl6ZXIgY29uZmlnIGZpbGUgbGlzdC4KLSAgICogQHBhcmFtIHRvb2xJbmZvICAgICAgICAgICAgYW5hbHl6ZXIgdG9vbCBpbmZvcm1hdGlvbi4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIGluc3RhbmNlIG9mIHRoZSBhbmFseXplciB0b29sLgotICAgKi8KLSAgcHVibGljIEFuYWx5emVyKExpc3QgYW5hbHl6ZXJDb25maWdMaXN0LCBUb29sSW5mbyB0b29sSW5mbykKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBpbml0KHRvb2xJbmZvKTsKLQotICAgIHRoaXMuYW5hbHl6ZXJDb25maWdMaXN0ID0gYW5hbHl6ZXJDb25maWdMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIENvbW1vbiBpbml0aWFsaXphdGlvbi4KLSAgICogQHBhcmFtIHRvb2xJbmZvICBhbmFseXplciB0b29sIGluZm9ybWF0aW9uLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgY29tbW9uIGluaXRpYWxpemF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdChUb29sSW5mbyB0b29sSW5mbykgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdGhpcy50b29sSW5mbyA9IHRvb2xJbmZvOwotCi0gICAgLy8gQ3JlYXRlIG1lc3NhZ2UgbGlzdAotICAgIG1lc3NhZ2VMaXN0ID0gbmV3IE1lc3NhZ2VMaXN0KFJFU09VUkNFX0JVTkRMRV9OQU1FKTsKLQotICAgIC8vIENyZWF0ZSBwcm9maWxlIHZhbGlkYXRvciBmYWN0b3J5Ci0gICAgZmFjdG9yeSA9IFByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAvLyBDcmVhdGUgZG9jdW1lbnQgZmFjdG9yeQotICAgIGRvY3VtZW50RmFjdG9yeSA9IERvY3VtZW50RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgYWxsIGNvbmZvcm1hbmNlIHZhbGlkYXRpb24gZnVuY3Rpb25zLgotICAgKiBAcmV0dXJuIHN0YXR1cyBjb2RlLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBpbnQgdmFsaWRhdGVBbGwoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBpbnQgc3RhdHVzQ29kZSA9IDA7Ci0gICAgaW50IHRlbXBTdGF0dXNDb2RlOwotCi0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGFuYWx5emVyQ29uZmlnTGlzdC5zaXplKCk7IGluZGV4KyspCi0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiaW5kZXg6ICIgKyBpbmRleCk7Ci0KLSAgICAgIC8vIFNldCBjdXJyZW50IGFuYWx5emVyIGNvbmZpZyBpbmRleCAKLSAgICAgIHNldEFuYWx5emVyQ29uZmlnKGluZGV4KTsKLQotICAgICAgaWYgKCh0ZW1wU3RhdHVzQ29kZSA9IHZhbGlkYXRlQ29uZm9ybWFuY2UoKSkgPiBzdGF0dXNDb2RlKQotICAgICAgICBzdGF0dXNDb2RlID0gdGVtcFN0YXR1c0NvZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1c0NvZGU7Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBhbGwgY29uZm9ybWFuY2UgdmFsaWRhdGlvbiBmdW5jdGlvbnMuCi0gICAqIEByZXR1cm4gc3RhdHVzIGNvZGUuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGR1cmluZyBjb25mb3JtYW5jZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGludCB2YWxpZGF0ZUNvbmZvcm1hbmNlKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogR2V0IHRvb2wgaW5mb3JtYXRpb24uCi0gICAqIEByZXR1cm4gdGhlIHRvb2wgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgVG9vbEluZm8gZ2V0VG9vbEluZm8oKQotICAKLSAgewotICAgIHJldHVybiB0aGlzLnRvb2xJbmZvOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBjdXJyZW50IGFuYWx5emVyIGNvbmZpZ3VyYXRpb24uCi0gICAqIEBwYXJhbSBpbmRleCAgdXJyZW50IGFuYWx5emVyIGNvbmZpZ3VyYXRpb24uCi0gICAqIEBzZWUgI2dldEFuYWx5emVyQ29uZmlnCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRBbmFseXplckNvbmZpZyhpbnQgaW5kZXgpCi0gIHsKLSAgICB0aGlzLmFuYWx5emVyQ29uZmlnSW5kZXggPSBpbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYW5hbHl6ZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICogQHJldHVybiBhbmFseXplciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAgKiBAc2VlICNzZXRBbmFseXplckNvbmZpZwotICAgKi8KLSAgcHVibGljIEFuYWx5emVyQ29uZmlnIGdldEFuYWx5emVyQ29uZmlnKCkKLSAgewotICAgIHJldHVybiAoQW5hbHl6ZXJDb25maWcpIHRoaXMuYW5hbHl6ZXJDb25maWdMaXN0LmdldChhbmFseXplckNvbmZpZ0luZGV4KTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBhIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgIGEga2V5LgotICAgKiBAcGFyYW0gbWVzc2FnZURhdGEgICAgIG1lc3NhZ2UgZGF0YS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlICBhIGRlZmF1bHQgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50TWVzc2FnZSgKLSAgICBTdHJpbmcga2V5LAotICAgIFN0cmluZyBtZXNzYWdlRGF0YSwKLSAgICBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICBtZXNzYWdlTGlzdC5wcmludE1lc3NhZ2Uoa2V5LCBtZXNzYWdlRGF0YSwgZGVmYXVsdE1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgYSBrZXkuCi0gICAqIEBwYXJhbSBtZXNzYWdlRGF0YSAgICAgbWVzc2FnZSBkYXRhLgotICAgKiBAcGFyYW0gZGVmYXVsdE1lc3NhZ2UgIGEgZGVmYXVsdCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXRpY1ByaW50TWVzc2FnZSgKLSAgICBTdHJpbmcga2V5LAotICAgIFN0cmluZyBtZXNzYWdlRGF0YSwKLSAgICBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICBNZXNzYWdlTGlzdC5wcmludE1lc3NhZ2UoCi0gICAgICBSRVNPVVJDRV9CVU5ETEVfTkFNRSwKLSAgICAgIGtleSwKLSAgICAgIG1lc3NhZ2VEYXRhLAotICAgICAgZGVmYXVsdE1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBYTUwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSAgYSBuYW1lc3BhY2UgcHJlZml4LgotICAgKiBAcmV0dXJuIFhNTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIC8vIFN0YXJ0ICAgICAKLSAgICBwdy5wcmludCh0b29sSW5mby5nZXRTdGFydFhNTFN0cmluZyhuYW1lc3BhY2VOYW1lKSk7Ci0KLSAgICAvLyBDb25maWcKLSAgICBwdy5wcmludCgKLSAgICAgIGdldEFuYWx5emVyQ29uZmlnKCkudG9YTUxTdHJpbmcoCi0gICAgICAgIFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9BTkFMWVpFUl9DT05GSUcpKTsKLQotICAgIC8vIEVuZAotICAgIHB3LnByaW50bG4odG9vbEluZm8uZ2V0RW5kWE1MU3RyaW5nKG5hbWVzcGFjZU5hbWUpKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IGEgbWVzc2FnZS4KLSAgICogQHBhcmFtIG1lc3NhZ2UgYSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJpbnRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgaWYgKGdldEFuYWx5emVyQ29uZmlnKCkuZ2V0VmVyYm9zZU9wdGlvbigpKQotICAgIHsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9BbmFseXplci5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0FuYWx5emVyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NmNiNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0FuYWx5emVyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIC8qKgotIyAgKiA8Y29weXJpZ2h0PgotIyAgKgotIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICoKLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqLwotCi0jCi0jIEFuYWx5emVyIHJlc291cmNlIGJ1bmRsZS4KLSMKLXVzYWdlMDE9VXNhZ2U6IEFuYWx5emVyIC1jb25maWcgPGNvbmZpZ0ZpbGVuYW1lPgotY3JlYXRlZDAxPUNvbmZvcm1hbmNlIHJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkLgotcHJvZ3Jlc3MwMT1QbGVhc2Ugd2FpdCB3aGlsZSB0aGUgc3BlY2lmaWVkIGFydGlmYWN0cyBhcmUgYW5hbHl6ZWQuLi4KLWVycm9yMDE9QW5hbHl6ZXIgRXJyb3I6Ci1lcnJvcjAyPUFuYWx5emVyIFN0b3BwZWQgQnkgRXhjZXB0aW9uOgotZXJyb3IwMz1UaGUgY29uZm9ybWFuY2UgdmFsaWRhdGlvbiBwcm9jZXNzIGZhaWxlZC4KLWV4Y2VwdGlvbjAxPUV4Y2VwdGlvbjoKLWNvbmZpZzAxPUFuYWx5emVyIGNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgbm90IGZvdW5kLiAgU3BlY2lmaWVkIGZpbGUgbG9jYXRpb246Ci1jb25maWcwMj1Db3VsZCBub3QgZmluZCBsb2cgZmlsZS4gIFNwZWNpZmllZCBmaWxlIGxvY2F0aW9uOgotY29uZmlnMDM9Q291bGQgbm90IGZpbmQgV1NETCBmaWxlLiAgU3BlY2lmaWVkIGZpbGUgbG9jYXRpb246Ci1jb25maWcwND1DYW4gbm90IHNwZWNpZnkgYm90aCB0aGUgV1NETCByZWZlcmVuY2UgYW5kIFVEREkgcmVmZXJlbmNlIG9wdGlvbnMuCi1jb25maWcwNT1XU0RMIGRvY3VtZW50IHdhcyBlaXRoZXIgbm90IGZvdW5kIG9yIGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuCi1jb25maWcwNj1JbnZhbGlkIGFuYWx5emVyIGNvbmZpZ3VyYXRpb24gZWxlbWVudDoKLWNvbmZpZzA3PUJvdGggdGhlIDx3c2RsRWxlbWVudD4gYW5kIDx3c2RsVVJJPiBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZC4KLWNvbmZpZzA4PUNvdWxkIG5vdCByZWFkIGFuYWx5emVyIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNwZWNpZmllZCBmaWxlIGxvY2F0aW9uOgotY29uZmlnMDk9VGhlIHBhcmVudEVsZW1lbnROYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIGEgV1NETCB0eXBlIG9mIHBvcnQgb3Igb3BlcmF0aW9uLgotY29uZmlnMTA9VGhlIC13c2RsRWxlbWVudCBvcHRpb24gbXVzdCBhcHBlYXIgYWZ0ZXIgdGhlIC13c2RsVVJJIG9yIC11ZGRpS2V5IG9wdGlvbnMuCi1jb25maWcxMT1UaGUgLXNlcnZpY2VMb2NhdGlvbiBvcHRpb24gbXVzdCBhcHBlYXIgYWZ0ZXIgdGhlIC13c2RsVVJJIG9yIC11ZGRpS2V5IG9wdGlvbnMuCi1jb25maWcxMj1UaGUgc3BlY2lmaWVkIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkOgotY29uZmlnMTM9T3B0aW9uIGRpZCBub3QgY29udGFpbiBhIHZhbHVlLiAgU3BlY2lmaWVkIG9wdGlvbjoKLWNvbmZpZzE0PUNvdWxkIG5vdCBmaW5kIHRlc3QgYXNzZXJ0aW9uIGRvY3VtZW50LiAgU3BlY2lmaWVkIGZpbGUgbG9jYXRpb246Ci1jb25maWcxNT1SZXBvcnQgZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgcmVwbGFjZSBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1jb25maWcxNj1UZXN0IGFzc2VydGlvbiBkb2N1bWVudCBsb2NhdGlvbiBtdXN0IGJlIHNwZWNpZmllZC4KLWNvbmZpZzE3PUNvdWxkIG5vdCBnZXQgcmVwb3J0IGZpbGUgbG9jYXRpb24uCi1jb25maWcxOD1JbnZhbGlkIGNvcnJlbGF0aW9uIHR5cGUgc3BlY2lmaWVkLgotY29uZmlnMTk9VGhlIFdTREwgZWxlbWVudCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0FuYWx5emVyQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0FuYWx5emVyQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzIxZjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9BbmFseXplckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxEb2N1bWVudENhY2hlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgY29udGV4dHVhbCBpbmZvcm1hdGlvbiB3aGljaCBpcyByZXF1aXJlZCBieSB0ZXN0IGFzc2VydGlvbnMgYWNyb3NzIGFsbCBhcnRpZmFjdHMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmFseXplckNvbnRleHQKLXsKLSAgcHJvdGVjdGVkIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBDYW5kaWRhdGVJbmZvIGNhbmRpZGF0ZUluZm8gPSBudWxsOwotICBwcm90ZWN0ZWQgWE1MRG9jdW1lbnRDYWNoZSBkb2N1bWVudExpc3QgPSBuZXcgWE1MRG9jdW1lbnRDYWNoZSgpOwotCi0gIC8qKgotICAgKiBEbyBub3QgYWxsb3cgdGhlIHVzYWdlIG9mIHRoZSBudWxsIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJpdmF0ZSBBbmFseXplckNvbnRleHQoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGFuYWx5emVyIGNvbnRleHQgd2l0aCBzZXJ2aWNlIHJlZmVyZW5jZS4KLSAgICogQHBhcmFtIHNlcnZpY2VSZWZlcmVuY2UgYSBzZXJ2aWNlIHJlZmVyZW5jZS4KLSAgICovCi0gIHB1YmxpYyBBbmFseXplckNvbnRleHQoU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlKQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlUmVmZXJlbmNlID0gc2VydmljZVJlZmVyZW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEByZXR1cm4gc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldFNlcnZpY2VSZWZlcmVuY2UKLSAgICovCi0gIHB1YmxpYyBTZXJ2aWNlUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZlcmVuY2UoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuc2VydmljZVJlZmVyZW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSBzZXJ2aWNlUmVmZXJlbmNlIGEgc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldFNlcnZpY2VSZWZlcmVuY2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VSZWZlcmVuY2UoU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlKQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlUmVmZXJlbmNlID0gc2VydmljZVJlZmVyZW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjYW5kaWRhdGVJbmZvLgotICAgKiBAcmV0dXJuIENhbmRpZGF0ZUluZm8uCi0gICAqIEBzZWUgI3NldENhbmRpZGF0ZUluZm8KLSAgICovCi0gIHB1YmxpYyBDYW5kaWRhdGVJbmZvIGdldENhbmRpZGF0ZUluZm8oKQotICB7Ci0gICAgcmV0dXJuIGNhbmRpZGF0ZUluZm87Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY2FuZGlkYXRlSW5mby4KLSAgICogQHBhcmFtIGNhbmRpZGF0ZUluZm8gdGhlIGNhbmRpZGF0ZUluZm8gdG8gc2V0LgotICAgKiBAc2VlICNnZXRDYW5kaWRhdGVJbmZvCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDYW5kaWRhdGVJbmZvKENhbmRpZGF0ZUluZm8gY2FuZGlkYXRlSW5mbykKLSAgewotICAgIHRoaXMuY2FuZGlkYXRlSW5mbyA9IGNhbmRpZGF0ZUluZm87Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBsaXN0IG9mIGNhY2hlZCBkb2N1bWVudHMuCi0gICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2FjaGVkIGRvY3VtZW50cy4KLSAgICogQHNlZSAjc2V0RG9jdW1lbnRMaXN0Ci0gICAqLwotICBwdWJsaWMgWE1MRG9jdW1lbnRDYWNoZSBnZXREb2N1bWVudExpc3QoKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50TGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGxpc3Qgb2YgY2FjaGVkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIGRvY3VtZW50TGlzdCBhIGxpc3Qgb2YgY2FjaGVkIGRvY3VtZW50cy4KLSAgICogQHNlZSAjZ2V0RG9jdW1lbnRMaXN0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExpc3QoWE1MRG9jdW1lbnRDYWNoZSBkb2N1bWVudExpc3QpCi0gIHsKLSAgICB0aGlzLmRvY3VtZW50TGlzdCA9IGRvY3VtZW50TGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBkb2N1bWVudCB0byB0aGUgbGlzdCBvZiBjYWNoZWQgZG9jdW1lbnRzLgotICAgKiBAcGFyYW0ga2V5IGEga2V5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBnaXZlbiBkb2N1bWVudC4KLSAgICogQHBhcmFtIGRvY3VtZW50IGEgZG9jdW1lbnQgdG8gYmUgaWRlbnRpZmllZCB3aXRoIHRoZSBnaXZlbiBrZXkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGREb2N1bWVudChPYmplY3Qga2V5LCBPYmplY3QgZG9jdW1lbnQpCi0gIHsKLSAgICB0aGlzLmRvY3VtZW50TGlzdC5wdXQoa2V5LCBkb2N1bWVudCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Fzc2VydGlvbkZhaWxFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9Bc3NlcnRpb25GYWlsRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZjVhMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Fzc2VydGlvbkZhaWxFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplcjsKLQotLyoqCi0gKiBCYXNlIEV4Y2VwdGlvbiBmb3IgQXNzZXJ0aW9uIEZhaWwuCi0gKiAKLSAqIEBhdXRob3IgZ3R1cnJlbGwKLSAqICovCi1wdWJsaWMgY2xhc3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotCi0gIC8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzAwNzYzNTc0MzI1ODkzM0w7Ci0KLQkvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFzc2VydGlvbkV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFzc2VydGlvbkV4Y2VwdGlvbi4KLSAgICogQHBhcmFtIGFyZzAgdGhlIGRldGFpbCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvbkZhaWxFeGNlcHRpb24oU3RyaW5nIGFyZzApCi0gIHsKLSAgICBzdXBlcihhcmcwKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Fzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzNGE1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi0vKioKLSAqIEV4Y2VwdGlvbiBmb3IgQXNzZXJ0aW9uIE5vdCBBcHBsaWNhYmxlLgotICogCi0gKiBAYXV0aG9yIGd0dXJyZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0KLSAgLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTA1NTIzNzgyOTk0MTEyNTY0TDsKLQotCS8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24uCi0gICAqIEBwYXJhbSBhcmcwIHRoZSBkZXRhaWwgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKFN0cmluZyBhcmcwKQotICB7Ci0gICAgc3VwZXIoYXJnMCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Fzc2VydGlvblBhc3NFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9Bc3NlcnRpb25QYXNzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NTdkNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Fzc2VydGlvblBhc3NFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplcjsKLQotLyoqCi0gKiBFeGNlcHRpb24gZm9yIEFzc2VydGlvbiBQYXNzLgotICogCi0gKiBAYXV0aG9yIGd0dXJyZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTcyODU4NDIyODM1NDE4MTBMOwotCi0JLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBBc3NlcnRpb25QQXNzRXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblBhc3NFeGNlcHRpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQXNzZXJ0aW9uUEFzc0V4Y2VwdGlvbi4KLSAgICogQHBhcmFtIGFyZzAgdGhlIGRldGFpbCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblBhc3NFeGNlcHRpb24oU3RyaW5nIGFyZzApCi0gIHsKLSAgICBzdXBlcihhcmcwKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvQXNzZXJ0aW9uUmVzdWx0RXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvQXNzZXJ0aW9uUmVzdWx0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDVhZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Fzc2VydGlvblJlc3VsdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi0vKioKLSAqIEV4Y2VwdGlvbiBmb3IgQXNzZXJ0aW9uIFJlc3VsdC4KLSAqIAotICogQGF1dGhvciBndHVycmVsbAotICovCi1wdWJsaWMgY2xhc3MgQXNzZXJ0aW9uUmVzdWx0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0KLSAgLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU2NzIwNjg0NzAwMTUyNjMyTDsKLQlwcml2YXRlIFN0cmluZyBkZXRhaWxNZXNzYWdlOwotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFzc2VydGlvbnJlc3VsdEV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHRFeGNlcHRpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBkZXRhaWxNZXNzYWdlID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQXNzZXJ0aW9uUmVzdWx0RXhjZXB0aW9uLgotICAgKiBAcGFyYW0gYXJnMCB0aGUgZGV0YWlsIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0RXhjZXB0aW9uKFN0cmluZyBhcmcwKQotICB7Ci0gICAgc3VwZXIoYXJnMCk7Ci0gICAgZGV0YWlsTWVzc2FnZSA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFzc2VydGlvblJlc3VsdEV4Y2VwdGlvbi4KLSAgICogQHBhcmFtIGFyZzAgdGhlIGRldGFpbCBtZXNzYWdlLgotICAgKiBAcGFyYW0gYXJnMSAgZnVydGhlciBkZXRhaWxlZCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdEV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpCi0gIHsKLSAgICBzdXBlcihhcmcwKTsKLSAgICBkZXRhaWxNZXNzYWdlID0gYXJnMTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZXRhaWxNZXNzYWdlLgotICAgKiBAcmV0dXJuIHRoZSBkZXRhaWxNZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXRhaWxNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBkZXRhaWxNZXNzYWdlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9CYXNpY1Byb2ZpbGVBbmFseXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Jhc2ljUHJvZmlsZUFuYWx5emVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzk0ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Jhc2ljUHJvZmlsZUFuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiwgUGFyYXNvZnQsIEJlYWNvbiBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIFBhcmFzb2Z0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIEJlYWNvbklUIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLlRvb2xJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9uc1JlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnZlbG9wZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuVURESVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuV1NETFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFydGlmYWN0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0QXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbC5EZWZhdWx0UmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuQXJ0aWZhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLldTSVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwuV1NETERvY3VtZW50OwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBBbmFseXplcyBsb2cgZmlsZXMgdG8gY29uZmlybSBjb25mb3JtYW5jZSB0byBhIHByb2ZpbGUuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgSmltIENsdW5lCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0KLSAqIEBhdXRob3IgR3JhaGFtIFR1cnJlbGwKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljUHJvZmlsZUFuYWx5emVyIGV4dGVuZHMgQW5hbHl6ZXIKLXsKLSAgLyoqCi0gICAqIFRvb2wgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX05BTUUgPSAiQW5hbHl6ZXIiOwotCi0gIC8qKgotICAgKiBXU0RMIGRvY3VtZW50IHRvIGFuYWx5emUuCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEJhc2ljIHByb2ZpbGUgYW5hbHl6ZXIuCi0gICAqIEBwYXJhbSBhcmdzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBjcmVhdGUgYSBCYXNpYyBwcm9maWxlIGFuYWx5emVyLgotICAgKi8KLSAgcHVibGljIEJhc2ljUHJvZmlsZUFuYWx5emVyKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKGFyZ3MsIG5ldyBUb29sSW5mbyhUT09MX05BTUUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBCYXNpYyBwcm9maWxlIGFuYWx5emVyLgotICAgKiBAcGFyYW0gYXJncyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgKiBAcGFyYW0gdmFsaWRhdGUgZmxhZyBmb3IgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHZhbGlkYXRpb24uCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBjcmVhdGUgYSBCYXNpYyBwcm9maWxlIGFuYWx5emVyLgotICAgKi8KLSAgcHVibGljIEJhc2ljUHJvZmlsZUFuYWx5emVyKFN0cmluZ1tdIGFyZ3MsIGJvb2xlYW4gdmFsaWRhdGUpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKGFyZ3MsIG5ldyBUb29sSW5mbyhUT09MX05BTUUpLCB2YWxpZGF0ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQmFzaWMgcHJvZmlsZSBhbmFseXplci4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29uZmlnTGlzdCBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBhbmFseXplci4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGNyZWF0ZSBhIEJhc2ljIHByb2ZpbGUgYW5hbHl6ZXIuCi0gICAqLwotICBwdWJsaWMgQmFzaWNQcm9maWxlQW5hbHl6ZXIoTGlzdCBhbmFseXplckNvbmZpZ0xpc3QpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKGFuYWx5emVyQ29uZmlnTGlzdCwgbmV3IFRvb2xJbmZvKFRPT0xfTkFNRSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEJhc2ljIHByb2ZpbGUgYW5hbHl6ZXIuCi0gICAqIEBwYXJhbSBhbmFseXplckNvbmZpZ0xpc3QgYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYW5hbHl6ZXIuCi0gICAqIEBwYXJhbSB3c2RsVVJJIGEgd3NkbCBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGNyZWF0ZSBhIEJhc2ljIHByb2ZpbGUgYW5hbHl6ZXIuCi0gICAqLwotICBwdWJsaWMgQmFzaWNQcm9maWxlQW5hbHl6ZXIoTGlzdCBhbmFseXplckNvbmZpZ0xpc3QsIFN0cmluZyB3c2RsVVJJKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKGFuYWx5emVyQ29uZmlnTGlzdCwgbmV3IFRvb2xJbmZvKFRPT0xfTkFNRSkpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0IHRoZSBXU0RMIGRvY3VtZW50Ci0gICAgICBpZiAod3NkbFVSSSAhPSBudWxsKQotICAgICAgICB0aGlzLndzZGxEb2N1bWVudCA9IG5ldyBXU0RMRG9jdW1lbnQod3NkbFVSSSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gd2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbih3ZS5nZXRNZXNzYWdlKCksIHdlKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGFsbCBjb25mb3JtYW5jZSB2YWxpZGF0aW9uIGZ1bmN0aW9ucy4KLSAgICogQHJldHVybiBzdGF0dXMgY29kZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgY29uZm9ybWFuY2UgdmFsaWRhdGlvbiBwcm9jZXNzIGZhaWxlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgdmFsaWRhdGVDb25mb3JtYW5jZSgpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGludCBzdGF0dXNDb2RlID0gMDsKLQotICAgIFJlcG9ydCByZXBvcnQgPSBudWxsOwotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0ID0gbnVsbDsKLSAgICBTdHJpbmcgd3NkbFVSSSA9IG51bGw7Ci0gICAgLy9XU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50ID0gbnVsbDsKLQotICAgIC8vIFNldCB1cCBpbml0aWFsIGFuYWx5emVyIGNvbnRleHQgYmFzZWQgb24gZW50cmllcyBpbiB0aGUgY29uZmlnIGZpbGUKLSAgICB0aGlzLmFuYWx5emVyQ29udGV4dCA9Ci0gICAgICBuZXcgQW5hbHl6ZXJDb250ZXh0KG5ldyBTZXJ2aWNlUmVmZXJlbmNlKGdldEFuYWx5emVyQ29uZmlnKCkpKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFJlYWQgcHJvZmlsZSBhc3NlcnRpb25zCi0gICAgICBQcm9maWxlQXNzZXJ0aW9uc1JlYWRlciBwcm9maWxlQXNzZXJ0aW9uc1JlYWRlciA9Ci0gICAgICAgIGRvY3VtZW50RmFjdG9yeS5uZXdQcm9maWxlQXNzZXJ0aW9uc1JlYWRlcigpOwotICAgICAgdGhpcy5wcm9maWxlQXNzZXJ0aW9ucyA9Ci0gICAgICAgIHByb2ZpbGVBc3NlcnRpb25zUmVhZGVyLnJlYWRQcm9maWxlQXNzZXJ0aW9ucygKLSAgICAgICAgICBnZXRBbmFseXplckNvbmZpZygpLmdldFRlc3RBc3NlcnRpb25zRG9jdW1lbnRMb2NhdGlvbigpKTsKLQotICAgICAgLy8gQ3JlYXRlIHJlcG9ydCBmcm9tIGRvY3VtZW50IGZhY3RvcnkKLSAgICAgIHJlcG9ydCA9IGRvY3VtZW50RmFjdG9yeS5uZXdSZXBvcnQoKTsKLSAgICAgIHJlcG9ydC5zZXRMb2NhdGlvbihnZXRBbmFseXplckNvbmZpZygpLmdldFJlcG9ydExvY2F0aW9uKCkpOwotCi0gICAgICAvLyBDcmVhdGUgcmVwb3J0IGNvbnRleHQKLSAgICAgIFJlcG9ydENvbnRleHQgcmVwb3J0Q29udGV4dCA9Ci0gICAgICAgIG5ldyBSZXBvcnRDb250ZXh0KAotICAgICAgICAgIFdTSUNvbnN0YW50cy5ERUZBVUxUX1JFUE9SVF9USVRMRSwKLSAgICAgICAgICBwcm9maWxlQXNzZXJ0aW9ucywKLSAgICAgICAgICB0aGlzKTsKLSAgICAgIHJlcG9ydC5zZXRSZXBvcnRDb250ZXh0KHJlcG9ydENvbnRleHQpOwotCi0gICAgICAvLyBDcmVhdGUgcmVwb3J0IHdyaXRlcgotICAgICAgUmVwb3J0V3JpdGVyIHJlcG9ydFdyaXRlciA9IGRvY3VtZW50RmFjdG9yeS5uZXdSZXBvcnRXcml0ZXIoKTsKLSAgICAgIC8vIEkxOE46IDIwMDMuMDIuMjYgbW9kaWZpZWQgYnkgSy5OYWthZ29tZUBCZWFjb25JVCAKLSAgICAgIC8vcmVwb3J0V3JpdGVyLnNldFdyaXRlcihuZXcgRmlsZVdyaXRlcihhbmFseXplckNvbmZpZy5nZXRSZXBvcnRMb2NhdGlvbigpKSk7Ci0gICAgICByZXBvcnRXcml0ZXIuc2V0V3JpdGVyKGdldEFuYWx5emVyQ29uZmlnKCkuZ2V0UmVwb3J0TG9jYXRpb24oKSk7Ci0KLSAgICAgIC8vIENyZWF0ZSByZXBvcnRlcgotICAgICAgdGhpcy5yZXBvcnRlciA9IG5ldyBEZWZhdWx0UmVwb3J0ZXIocmVwb3J0LCByZXBvcnRXcml0ZXIpOwotCi0gICAgICAvLyBTdGFydCB3cml0aW5nIHJlcG9ydAotICAgICAgdGhpcy5yZXBvcnRlci5zdGFydFJlcG9ydCgpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gRElTQ09WRVJZIEFSVElGQUNUOgotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgLy8gU2V0IGN1cnJlbnQgYXJ0aWZhY3QKLSAgICAgIHJlcG9ydEFydGlmYWN0ID0gc2V0Q3VycmVudEFydGlmYWN0KEFydGlmYWN0VHlwZS5BUlRJRkFDVF9UWVBFX0RJU0NPVkVSWSk7Ci0KLSAgICAgIC8vIElmIFVEREkgb3B0aW9ucyBzcGVjaWZpZWQsIHRoZW4gcHJvY2VzcyBVRERJIHRlc3QgYXNzZXJ0aW9ucwotICAgICAgaWYgKCh3c2RsVVJJID0gdmFsaWRhdGVVRERJKHJlcG9ydEFydGlmYWN0LCBmYWN0b3J5Lm5ld1VERElWYWxpZGF0b3IoKSkpCi0gICAgICAgID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChnZXRBbmFseXplckNvbmZpZygpLmlzV1NETFJlZmVyZW5jZVNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgV1NETCBvcHRpb25zIHRvIGdldCB0aGUgV1NETCBsb2NhdGlvbgotICAgICAgICAgIHdzZGxVUkkgPSBnZXRBbmFseXplckNvbmZpZygpLmdldFdTRExMb2NhdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGFydGlmYWN0Ci0gICAgICB0aGlzLnJlcG9ydGVyLmVuZEN1cnJlbnRBcnRpZmFjdCgpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gREVTQ1JJUFRJT04gQVJUSUZBQ1Q6Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAvLyBTZXQgY3VycmVudCBhcnRpZmFjdAotICAgICAgcmVwb3J0QXJ0aWZhY3QgPQotICAgICAgICBzZXRDdXJyZW50QXJ0aWZhY3QoQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfREVTQ1JJUFRJT04pOwotCi0gICAgICAvLyBDYWxsIFdTRExWYWxpZGF0b3IgCi0gICAgICB3c2RsRG9jdW1lbnQgPQotICAgICAgICB2YWxpZGF0ZVdTREwoCi0gICAgICAgICAgcmVwb3J0QXJ0aWZhY3QsCi0gICAgICAgICAgZmFjdG9yeS5uZXdXU0RMVmFsaWRhdG9yKCksCi0gICAgICAgICAgd3NkbFVSSSwKLSAgICAgICAgICB3c2RsRG9jdW1lbnQpOwotCi0gICAgICAvLyBJZiBXU0RMIGRvY3VtZW50IG9iamVjdCBpcyBudWxsLCB0aGVuIHRocm93IGV4Y2VwdGlvbgotICAgICAgaWYgKCh3c2RsRG9jdW1lbnQgPT0gbnVsbCkgJiYgKGdldEFuYWx5emVyQ29uZmlnKCkuaXNXU0RMUmVmZXJlbmNlU2V0KCkpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAgIG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAiY29uZmlnMDUiLAotICAgICAgICAgICAgIldTREwgZG9jdW1lbnQgd2FzIGVpdGhlciBub3QgZm91bmQgb3IgY291bGQgbm90IGJlIHByb2Nlc3NlZC4iKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGFydGlmYWN0Ci0gICAgICB0aGlzLnJlcG9ydGVyLmVuZEN1cnJlbnRBcnRpZmFjdCgpOwotCi0gICAgICAvLyBSRU1PVkU6Ci0gICAgICAvLyBJZiBwcm9jZXNzaW5nIGxvZyBlbnRyaWVzIGFuZCB0aGVyZSBpc24ndCBhIFdTREwgVVJJLCAKLSAgICAgIC8vIHRoZW4gdGhyb3cgYW4gZXhjZXB0aW9uIHNpbmNlIGl0IGlzIHJlcXVpcmVkIHRvIHByb2Nlc3MgdGhlIGxvZyBlbnRyaWVzCi0gICAgICAvL2lmICgod3NkbFVSSSA9PSBudWxsKSAmJiAoYW5hbHl6ZXJDb25maWcuZ2V0TG9nTG9jYXRpb24oKSAhPSBudWxsKSkgewotICAgICAgLy8gIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSB0aGUgV1NETCBkb2N1bWVudCBsb2NhdGlvbiB0byB2YWxpZGF0ZSBtZXNzYWdlIGxvZy4iKTsKLSAgICAgIC8vfQotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gTUVTU0FHRSBBUlRJRkFDVDoKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIC8vIFNldCBjdXJyZW50IGFydGlmYWN0Ci0gICAgICByZXBvcnRBcnRpZmFjdCA9IHNldEN1cnJlbnRBcnRpZmFjdChBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9NRVNTQUdFKTsKLQotICAgICAgLy8gUHJvY2VzcyB0ZXN0IGFzc2VydGlvbnMgZm9yIHRoZSBtZXNzYWdlcwotICAgICAgdmFsaWRhdGVNZXNzYWdlcygKLSAgICAgICAgcmVwb3J0QXJ0aWZhY3QsCi0gICAgICAgIGZhY3RvcnkubmV3TWVzc2FnZVZhbGlkYXRvcigpLAotICAgICAgICB3c2RsRG9jdW1lbnQpOwotCi0gICAgICAvLyBJbmRpY2F0ZSB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhpcyBhcnRpZmFjdAotICAgICAgdGhpcy5yZXBvcnRlci5lbmRDdXJyZW50QXJ0aWZhY3QoKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIEVOVkVMT1BFIEFSVElGQUNUOgotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgLy8gSWYgdGhhdCBpcyBub3QgdGhlIEJhc2ljIFByb2ZpbGUgMS4wLCB0aGVuIHByb2Nlc3MKLSAgICAgIC8vIHRoZSBlbnZlbG9wZSBhcnRpZmFjdAotICAgICAgaWYgKCFwcm9maWxlQXNzZXJ0aW9ucy5nZXRUQUROYW1lKCkKLSAgICAgICAgLmVxdWFscyhXU0lDb25zdGFudHMuQkFTSUNfUFJPRklMRV9UQURfTkFNRSkpCi0gICAgICB7Ci0KLSAgICAgICAgLy8gU2V0IGN1cnJlbnQgYXJ0aWZhY3QKLSAgICAgICAgcmVwb3J0QXJ0aWZhY3QgPSBzZXRDdXJyZW50QXJ0aWZhY3QoQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfRU5WRUxPUEUpOwotCi0gICAgICAgIC8vIFByb2Nlc3MgdGVzdCBhc3NlcnRpb25zIGZvciB0aGUgZW52ZWxvcGVzCi0gICAgICAgIHZhbGlkYXRlRW52ZWxvcGVzKAotICAgICAgICAgIHJlcG9ydEFydGlmYWN0LAotICAgICAgICAgIGZhY3RvcnkubmV3RW52ZWxvcGVWYWxpZGF0b3IoKSwKLSAgICAgICAgICB3c2RsRG9jdW1lbnQpOwotCi0gICAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGFydGlmYWN0Ci0gICAgICAgIHRoaXMucmVwb3J0ZXIuZW5kQ3VycmVudEFydGlmYWN0KCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEZpbmlzaCB0aGUgY29uZm9ybWFuY2UgcmVwb3J0Ci0gICAgICByZXBvcnRlci5maW5pc2hSZXBvcnQoKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgICBTdHJpbmcgbWVzc2FnZSA9Ci0gICAgICAgIG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UoCi0gICAgICAgICAgImVycm9yMDMiLAotICAgICAgICAgICJUaGUgY29uZm9ybWFuY2UgdmFsaWRhdGlvbiBwcm9jZXNzIGZhaWxlZC4iKTsKLQotICAgICAgLy8gRmluaXNoIHJlcG9ydAotICAgICAgaWYgKHJlcG9ydGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHB3LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgIHB3LnByaW50bG4oCi0gICAgICAgICAgbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZSgiZXhjZXB0aW9uMDEiLCAiRXhjZXB0aW9uOiAiKQotICAgICAgICAgICAgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICByZXBvcnRlci5maW5pc2hSZXBvcnRXaXRoRXJyb3Ioc3cudG9TdHJpbmcoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChlIGluc3RhbmNlb2YgV1NJRXhjZXB0aW9uKQotICAgICAgICB0aHJvdyAoV1NJRXhjZXB0aW9uKSBlOwotICAgICAgZWxzZQotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKG1lc3NhZ2UsIGUpOwotICAgIH0KLQotICAgIGlmIChyZXBvcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdGF0dXNDb2RlID0KLSAgICAgICAgKHJlcG9ydC5nZXRTdW1tYXJ5UmVzdWx0KCkuZXF1YWxzKEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEKQotICAgICAgICAgID8gMAotICAgICAgICAgIDogMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1c0NvZGU7Ci0gIH0KLQotICAvKioKLSAgICogUnVuIFVEREkgdGVzdCBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGVVRERJKAotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0LAotICAgIFVERElWYWxpZGF0b3IgdWRkaVZhbGlkYXRvcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgd3NkbFVSSSA9IG51bGw7Ci0KLSAgICAvLyBJbml0IFVERElWYWxpZGF0b3IKLSAgICB1ZGRpVmFsaWRhdG9yLmluaXQoCi0gICAgICB0aGlzLmFuYWx5emVyQ29udGV4dCwKLSAgICAgIHRoaXMucHJvZmlsZUFzc2VydGlvbnMuZ2V0QXJ0aWZhY3QoQXJ0aWZhY3RUeXBlLlRZUEVfRElTQ09WRVJZKSwKLSAgICAgIHJlcG9ydEFydGlmYWN0LAotICAgICAgZ2V0QW5hbHl6ZXJDb25maWcoKS5nZXRVRERJUmVmZXJlbmNlKCksCi0gICAgICB0aGlzLnJlcG9ydGVyKTsKLQotICAgIC8vIENhbGwgVURESVZhbGlkYXRvciAKLSAgICBpZiAoZ2V0QW5hbHl6ZXJDb25maWcoKS5pc1VERElSZWZlcmVuY2VTZXQoKSkKLSAgICB7Ci0gICAgICB3c2RsVVJJID0gdWRkaVZhbGlkYXRvci52YWxpZGF0ZSgpOwotCi0gICAgICAvLyBDbGVhbnVwCi0gICAgICB1ZGRpVmFsaWRhdG9yLmNsZWFudXAoKTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU2V0IGFsbCBtaXNzaW5nSW5wdXQKLSAgICAgIHVkZGlWYWxpZGF0b3Iuc2V0QWxsTWlzc2luZ0lucHV0KCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHdzZGxVUkk7Ci0gIH0KLQotICAvKioKLSAgICogUnVuIFdTREwgdGVzdCBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJpdmF0ZSBXU0RMRG9jdW1lbnQgdmFsaWRhdGVXU0RMKAotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0LAotICAgIFdTRExWYWxpZGF0b3Igd3NkbFZhbGlkYXRvciwKLSAgICBTdHJpbmcgd3NkbFVSSSwKLSAgICBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFdTRExEb2N1bWVudCByZXR1cm5XU0RMRG9jdW1lbnQgPSBudWxsOwotCi0gICAgLy8gSW5pdCBXU0RMVmFsaWRhdG9yCi0gICAgd3NkbFZhbGlkYXRvci5pbml0KAotICAgICAgdGhpcy5hbmFseXplckNvbnRleHQsCi0gICAgICB0aGlzLnByb2ZpbGVBc3NlcnRpb25zLmdldEFydGlmYWN0KEFydGlmYWN0VHlwZS5UWVBFX0RFU0NSSVBUSU9OKSwKLSAgICAgIHJlcG9ydEFydGlmYWN0LAotICAgICAgd3NkbFVSSSwKLSAgICAgIHdzZGxEb2N1bWVudCwKLSAgICAgIHRoaXMucmVwb3J0ZXIpOwotCi0gICAgLy8gSWYgYSBXU0RMIFVSSSB3YXMgc3BlY2lmaWVkIG9yIGxvY2F0ZWQgaW4gYSBVRERJIHJlZ2lzdHJ5LCB0aGVuIHByb2Nlc3MgdGhlIFdTREwgdGVzdHMKLSAgICBpZiAod3NkbFVSSSAhPSBudWxsIHx8IHdzZGxEb2N1bWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIENhbGwgV1NETFZhbGlkYXRvciAKLSAgICAgIHJldHVybldTRExEb2N1bWVudCA9IHdzZGxWYWxpZGF0b3IudmFsaWRhdGUoKTsKLQotICAgICAgLy8gQ2xlYW51cAotICAgICAgd3NkbFZhbGlkYXRvci5jbGVhbnVwKCk7Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFNldCBhbGwgbWlzc2luZ0lucHV0Ci0gICAgICB3c2RsVmFsaWRhdG9yLnNldEFsbE1pc3NpbmdJbnB1dCgpOwotICAgIH0KLQotICAgIHJldHVybiByZXR1cm5XU0RMRG9jdW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogUnVuIG1lc3NhZ2UgdGVzdCBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWVzc2FnZXMoCi0gICAgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QsCi0gICAgTWVzc2FnZVZhbGlkYXRvciBtZXNzYWdlVmFsaWRhdG9yLAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy9Mb2cgbG9nID0gbnVsbDsKLSAgICAvL01lc3NhZ2VFbnRyeSBsb2dFbnRyeSA9IG51bGw7Ci0KLSAgICAvLyBJbml0IE1lc3NhZ2VWYWxpZGF0b3IKLSAgICBtZXNzYWdlVmFsaWRhdG9yLmluaXQoCi0gICAgICB0aGlzLmFuYWx5emVyQ29udGV4dCwKLSAgICAgIHRoaXMucHJvZmlsZUFzc2VydGlvbnMuZ2V0QXJ0aWZhY3QoQXJ0aWZhY3RUeXBlLlRZUEVfTUVTU0FHRSksCi0gICAgICByZXBvcnRBcnRpZmFjdCwKLSAgICAgIHdzZGxEb2N1bWVudCwKLSAgICAgIHRoaXMucmVwb3J0ZXIpOwotCi0gICAgLy8gSWYgdGhlIGxvZyBmaWxlIGxvY2F0aW9uIHdhcyBzcGVjaWZpZWQsIHRoZW4gcHJvY2VzcyB0ZXN0IGFzc2VydGlvbnMgZm9yIHRoZSBtZXNzYWdlcwotICAgIGlmIChnZXRBbmFseXplckNvbmZpZygpLmdldExvZ0xvY2F0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIGxvZyBmaWxlIHJlYWRlcgotICAgICAgTG9nUmVhZGVyIGxvZ1JlYWRlciA9IGRvY3VtZW50RmFjdG9yeS5uZXdMb2dSZWFkZXIoKTsKLQotICAgICAgLy8gQ3JlYXRlIGxvZyByZWFkZXIgY2FsbGJhY2sKLSAgICAgIE1lc3NhZ2VQcm9jZXNzb3IgbWVzc2FnZVByb2Nlc3NvciA9Ci0gICAgICAgIG5ldyBNZXNzYWdlUHJvY2Vzc29yKG1lc3NhZ2VWYWxpZGF0b3IpOwotCi0gICAgICAvLyBTdGFydCByZWFkaW5nIHRoZSBsb2cgZmlsZQotICAgICAgbG9nUmVhZGVyLnJlYWRMb2coZ2V0QW5hbHl6ZXJDb25maWcoKS5nZXRMb2dMb2NhdGlvbigpLCBtZXNzYWdlUHJvY2Vzc29yKTsKLQotICAgICAgLy8gQ2xlYW51cAotICAgICAgbWVzc2FnZVZhbGlkYXRvci5jbGVhbnVwKCk7Ci0gICAgfQotCi0gICAgLy8gT3RoZXJ3aXNlIGFsbCBhcmUgbWlzc2luZ0lucHV0Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFNldCBhbGwgbWlzc2luZ0lucHV0Ci0gICAgICBtZXNzYWdlVmFsaWRhdG9yLnNldEFsbE1pc3NpbmdJbnB1dCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSdW4gZW52ZWxvcGUgdGVzdCBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRW52ZWxvcGVzKAotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0LAotICAgIEVudmVsb3BlVmFsaWRhdG9yIGVudmVsb3BlVmFsaWRhdG9yLAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gSW5pdCBlbnZlbG9wZVZhbGlkYXRvcgotICAgIGVudmVsb3BlVmFsaWRhdG9yLmluaXQoCi0gICAgICB0aGlzLmFuYWx5emVyQ29udGV4dCwKLSAgICAgIHRoaXMucHJvZmlsZUFzc2VydGlvbnMuZ2V0QXJ0aWZhY3QoQXJ0aWZhY3RUeXBlLlRZUEVfRU5WRUxPUEUpLAotICAgICAgcmVwb3J0QXJ0aWZhY3QsCi0gICAgICB3c2RsRG9jdW1lbnQsCi0gICAgICB0aGlzLnJlcG9ydGVyKTsKLQotICAgIC8vIElmIHRoZSBsb2cgZmlsZSBsb2NhdGlvbiB3YXMgc3BlY2lmaWVkLCB0aGVuIHByb2Nlc3MgdGVzdCBhc3NlcnRpb25zIGZvciB0aGUgbWVzc2FnZXMKLSAgICBpZiAoZ2V0QW5hbHl6ZXJDb25maWcoKS5nZXRMb2dMb2NhdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBsb2cgZmlsZSByZWFkZXIKLSAgICAgIExvZ1JlYWRlciBsb2dSZWFkZXIgPSBkb2N1bWVudEZhY3RvcnkubmV3TG9nUmVhZGVyKCk7Ci0KLSAgICAgIC8vIENyZWF0ZSBsb2cgcmVhZGVyIGNhbGxiYWNrCi0gICAgICBFbnZlbG9wZVByb2Nlc3NvciBlbnZlbG9wZVByb2Nlc3NvciA9Ci0gICAgICAgIG5ldyBFbnZlbG9wZVByb2Nlc3NvcihlbnZlbG9wZVZhbGlkYXRvcik7Ci0KLSAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgdGhlIGxvZyBmaWxlCi0gICAgICBsb2dSZWFkZXIucmVhZExvZyhnZXRBbmFseXplckNvbmZpZygpLmdldExvZ0xvY2F0aW9uKCksIGVudmVsb3BlUHJvY2Vzc29yKTsKLQotICAgICAgLy8gQ2xlYW51cAotICAgICAgZW52ZWxvcGVWYWxpZGF0b3IuY2xlYW51cCgpOwotICAgIH0KLQotICAgIC8vIE90aGVyd2lzZSBhbGwgYXJlIG1pc3NpbmdJbnB1dAotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTZXQgYWxsIG1pc3NpbmdJbnB1dAotICAgICAgZW52ZWxvcGVWYWxpZGF0b3Iuc2V0QWxsTWlzc2luZ0lucHV0KCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENvbW1hbmQgbGluZSBpbnRlcmZhY2UgZm9yIHRoZSBhbmFseXplciB0b29sLgotICAgKiBAcGFyYW0gYXJncyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIElPIHByb2JsZW1zIG9jY3VyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpbnQgc3RhdHVzQ29kZSA9IDA7Ci0gICAgQW5hbHl6ZXIgYW5hbHl6ZXIgPSBudWxsOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gU2V0IGRvY3VtZW50IGJ1aWxkZXIgZmFjdG9yeSBjbGFzcwotICAgICAgU3lzdGVtLnNldFByb3BlcnR5KAotICAgICAgICBXU0lQcm9wZXJ0aWVzLlBST1BfSkFYUF9ET0NVTUVOVF9GQUNUT1JZLAotICAgICAgICBXU0lQcm9wZXJ0aWVzLmdldFByb3BlcnR5KFdTSVByb3BlcnRpZXMuUFJPUF9KQVhQX0RPQ1VNRU5UX0ZBQ1RPUlkpKTsKLQotICAgICAgLy8gU2V0IHRoZSBzeXN0ZW0gcHJvcGVydHkgZm9yIFVEREk0SiB0cmFuc3BvcnQKLSAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgKLSAgICAgICAgVHJhbnNwb3J0RmFjdG9yeS5QUk9QRVJUWV9OQU1FLAotICAgICAgICBXU0lQcm9wZXJ0aWVzLmdldFByb3BlcnR5KFRyYW5zcG9ydEZhY3RvcnkuUFJPUEVSVFlfTkFNRSkpOwotCi0gICAgICAvLyBDcmVhdGUgdGhlIGFuYWx5emVyIG9iamVjdAotICAgICAgYW5hbHl6ZXIgPSBuZXcgQmFzaWNQcm9maWxlQW5hbHl6ZXIoYXJncyk7Ci0KLSAgICAgIC8vIEhhdmUgaXQgcHJvY2VzcyB0aGUgY29uZm9ybWFuY2UgdmFsaWRhdGlvbiBmdW5jdGlvbnMKLSAgICAgIHN0YXR1c0NvZGUgPSBhbmFseXplci52YWxpZGF0ZUNvbmZvcm1hbmNlKCk7Ci0KLSAgICAgIC8vIERpc3BsYXkgbWVzc2FnZQotICAgICAgYW5hbHl6ZXIucHJpbnRNZXNzYWdlKAotICAgICAgICAiY3JlYXRlZDAxIiwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgIkNvbmZvcm1hbmNlIHJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkLiIpOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBzdGF0dXNDb2RlID0gMTsKLQotICAgICAgYm9vbGVhbiBwcmludFN0YWNrVHJhY2UgPSB0cnVlOwotICAgICAgU3RyaW5nIG1lc3NhZ2VJRDsKLSAgICAgIFN0cmluZyBkZWZhdWx0TWVzc2FnZTsKLSAgICAgIFN0cmluZyBtZXNzYWdlRGF0YTsKLQotICAgICAgaWYgKChlIGluc3RhbmNlb2YgV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uKQotICAgICAgICB8fCAoZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikpCi0gICAgICB7Ci0gICAgICAgIC8vcHJpbnRTdGFja1RyYWNlID0gZmFsc2U7Ci0gICAgICAgIG1lc3NhZ2VJRCA9ICJlcnJvcjAxIjsKLSAgICAgICAgZGVmYXVsdE1lc3NhZ2UgPSAiQW5hbHl6ZXIgRXJyb3I6IjsKLSAgICAgICAgbWVzc2FnZURhdGEgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL3ByaW50U3RhY2tUcmFjZSA9IHRydWU7Ci0gICAgICAgIG1lc3NhZ2VJRCA9ICJlcnJvcjAyIjsKLSAgICAgICAgZGVmYXVsdE1lc3NhZ2UgPSAiQW5hbHl6ZXIgU3RvcHBlZCBCeSBFeGNlcHRpb246IjsKLSAgICAgICAgbWVzc2FnZURhdGEgPSBlLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChhbmFseXplciAhPSBudWxsKQotICAgICAgICBhbmFseXplci5wcmludE1lc3NhZ2UobWVzc2FnZUlELCBtZXNzYWdlRGF0YSwgZGVmYXVsdE1lc3NhZ2UpOwotICAgICAgZWxzZQotICAgICAgICBBbmFseXplci5zdGF0aWNQcmludE1lc3NhZ2UobWVzc2FnZUlELCBtZXNzYWdlRGF0YSwgZGVmYXVsdE1lc3NhZ2UpOwotCi0gICAgICBpZiAoYW5hbHl6ZXIgIT0gbnVsbAotICAgICAgICAmJiBhbmFseXplci5nZXRBbmFseXplckNvbmZpZygpICE9IG51bGwKLSAgICAgICAgJiYgYW5hbHl6ZXIuZ2V0QW5hbHl6ZXJDb25maWcoKS5nZXRWZXJib3NlT3B0aW9uKCkpCi0gICAgICAgIGR1bXAoZSk7Ci0gICAgfQotCi0gICAgLy8gRXhpdAotICAgIFN5c3RlbS5leGl0KHN0YXR1c0NvZGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBjdXJyZW50IGFydGlmYWN0LgotICAgKiBAcGFyYW0gYXJ0aWZhY3RUeXBlIGFuIEFydGlmYWN0VHlwZSBvYmplY3QuCi0gICAqIEByZXR1cm4gYSBSZXBvcnRBcnRpZmFjdCBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIGNyZWF0aW5nIHJlcG9ydCBhcnRpZmFjdC4KLSAgICovCi0gIHByb3RlY3RlZCBSZXBvcnRBcnRpZmFjdCBzZXRDdXJyZW50QXJ0aWZhY3QoQXJ0aWZhY3RUeXBlIGFydGlmYWN0VHlwZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgYXJ0aWZhY3QKLSAgICBSZXBvcnRBcnRpZmFjdCByZXBvcnRBcnRpZmFjdCA9IHJlcG9ydGVyLmNyZWF0ZUFydGlmYWN0KCk7Ci0gICAgcmVwb3J0QXJ0aWZhY3Quc2V0VHlwZShhcnRpZmFjdFR5cGUpOwotCi0gICAgLy8gQWRkIGFydGlmYWN0IHRvIHJlcG9ydAotICAgIHRoaXMucmVwb3J0ZXIuc2V0Q3VycmVudEFydGlmYWN0KHJlcG9ydEFydGlmYWN0KTsKLQotICAgIHJldHVybiByZXBvcnRBcnRpZmFjdDsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBleGNlcHRpb24uCi0gICAqIEBwYXJhbSB0IGEgVGhyb3dhYmxlIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKFRocm93YWJsZSB0KQotICB7Ci0gICAgd2hpbGUgKHQgaW5zdGFuY2VvZiBXU0lFeGNlcHRpb24pCi0gICAgewotICAgICAgVGhyb3dhYmxlIG5lc3RlZCA9ICgoV1NJRXhjZXB0aW9uKSB0KS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgIGlmIChuZXN0ZWQgPT0gbnVsbCkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBlbHNlCi0gICAgICAgIHQgPSBuZXN0ZWQ7Ci0gICAgfQotICAgIHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gIH0KLQotICAvKioKLSAgICogTWVzc2FnZSBwcm9jZXNzb3IgY2xhc3MuCi0gICAqLwotICBjbGFzcyBNZXNzYWdlUHJvY2Vzc29yIGltcGxlbWVudHMgTWVzc2FnZUVudHJ5SGFuZGxlcgotICB7Ci0gICAgTWVzc2FnZVZhbGlkYXRvciBtZXNzYWdlVmFsaWRhdG9yID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBtZXNzYWdlIHByb2Nlc3NvciBhcyBhIGxvZyByZWFkZXIgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgICovCi0gICAgTWVzc2FnZVByb2Nlc3NvcihNZXNzYWdlVmFsaWRhdG9yIG1lc3NhZ2VWYWxpZGF0b3IpCi0gICAgewotICAgICAgdGhpcy5tZXNzYWdlVmFsaWRhdG9yID0gbWVzc2FnZVZhbGlkYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGFydGlmYWN0IHJlZmVyZW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQXJ0aWZhY3RSZWZlcmVuY2UoQXJ0aWZhY3RSZWZlcmVuY2UgYXJ0aWZhY3RSZWZlcmVuY2UpCi0gICAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gICAgewotICAgICAgcmVwb3J0ZXIuYWRkQXJ0aWZhY3RSZWZlcmVuY2UoYXJ0aWZhY3RSZWZlcmVuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYSBzaW5nbGUgbG9nIGVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NMb2dFbnRyeShFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gICAgewotICAgICAgLy8gVmFsaWRhdGUgbWVzc2FnZQotICAgICAgbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZShlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEVudmVsb3BlIHByb2Nlc3NvciBjbGFzcy4KLSAgICovCi0gIGNsYXNzIEVudmVsb3BlUHJvY2Vzc29yIGltcGxlbWVudHMgTWVzc2FnZUVudHJ5SGFuZGxlcgotICB7Ci0gICAgRW52ZWxvcGVWYWxpZGF0b3IgZW52ZWxvcGVWYWxpZGF0b3IgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGVudmVsb3BlIHByb2Nlc3NvciBhcyBhIGxvZyByZWFkZXIgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgICovCi0gICAgRW52ZWxvcGVQcm9jZXNzb3IoRW52ZWxvcGVWYWxpZGF0b3IgZW52ZWxvcGVWYWxpZGF0b3IpCi0gICAgewotICAgICAgdGhpcy5lbnZlbG9wZVZhbGlkYXRvciA9IGVudmVsb3BlVmFsaWRhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYXJ0aWZhY3QgcmVmZXJlbmNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NBcnRpZmFjdFJlZmVyZW5jZShBcnRpZmFjdFJlZmVyZW5jZSBhcnRpZmFjdFJlZmVyZW5jZSkKLSAgICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgICB7Ci0gICAgICByZXBvcnRlci5hZGRBcnRpZmFjdFJlZmVyZW5jZShhcnRpZmFjdFJlZmVyZW5jZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBhIHNpbmdsZSBsb2cgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xvZ0VudHJ5KEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgICB7Ci0gICAgICAvLyBWYWxpZGF0ZSBlbnZlbG9wZXMKLSAgICAgIGVudmVsb3BlVmFsaWRhdG9yLnZhbGlkYXRlKGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9DYW5kaWRhdGVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvQ2FuZGlkYXRlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmU4MmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9DYW5kaWRhdGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC5XU0RMVXRpbHM7Ci0KLS8qKgotICogUHJvdmlkZSBhIG5vcm1hbGl6ZWQgc2V0IG9mIGRhdGEgcmVsYXRpbmcgdG8gdGhlIHNlcnZpY2UgdW5kZXIgdGVzdC4KLSAqIEZvciBleGFtcGxlLCB3aXRoIGVuZHBvaW50IGNvcnJlbGF0aW9uIGFuZCB3c2RsRWxlbWVudCBvZiB0eXBlICJtZXNzYWdlIiAKLSAqIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIG1hdGNoZXMgZm9yIG1vc3QgZWxlbWVudCB0eXBlcyBpbmNsdWRpbmcgV1NETCBTZXJ2aWNlLgotICogKHRob3VnaCB0aGUgb2JqZWN0aXZlIGlzIHRvIGVuc3VyZSBmaWx0ZXJpbmcgdG8gYSBzaW5nbGUgc2VydmljZSBpZiBhdCBhbGwgcG9zc2libGUpLiAKLSAqIAotICogQGF1dGhvciBndHVycmVsbAotICovCi0KLS8vIEFERDpjb3VsZCBiZSBiZXR0ZXIgYXMgYSBzaW5nbGV0b24/Ci0KLXB1YmxpYyBjbGFzcyBDYW5kaWRhdGVJbmZvCi17Ci0KLSAgLy8gTm9ybWFsaXplZCBmaXhlZCBjb3JyZWxhdGlvbiBkYXRhIGRlcml2ZWQgZnJvbSB0aGUgYW5hbHl6ZXIgY29uZmlnIGFuZCB0aGUgd3NkbCwKLSAgLy8gcmVwcmVzZW50aW5nIHdoYXQgd2Uga25vdyBhYm91dCB0aGUgc2VydmljZSBmcm9tIHRoZXNlIHR3byBzb3VyY2VzLiAgCi0gIHByaXZhdGUgRGVmaW5pdGlvbltdIGRlZmluaXRpb25zID0gbnVsbDsKLQotICBwcml2YXRlIEltcG9ydFtdIGltcG9ydHMgPSBudWxsOwotICBwcml2YXRlIFR5cGVzW10gdHlwZXMgPSBudWxsOwotCi0gIHByaXZhdGUgTWVzc2FnZVtdIG1lc3NhZ2VzID0gbnVsbDsKLSAgcHJpdmF0ZSBPcGVyYXRpb25bXSBvcGVyYXRpb25zID0gbnVsbDsKLSAgcHJpdmF0ZSBQb3J0VHlwZVtdIHBvcnRUeXBlcyA9IG51bGw7Ci0gIHByaXZhdGUgQmluZGluZ1tdIGJpbmRpbmdzID0gbnVsbDsKLSAgcHJpdmF0ZSBQb3J0W10gcG9ydHMgPSBudWxsOwotCi0gIHByaXZhdGUgVVJJW10gZW5kUG9pbnRzID0gbnVsbDsgLy8gbGlzdCBvYnRhaW5hYmxlIGZyb20gYSBwb3J0Ci0KLSAgcHJpdmF0ZSBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50OyAvLyByZWZlcmVuY2UgcHJvYmFibHkgbm90IGRlc2lyYWJsZSBoZXJlCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDYW5kaWRhdGVJbmZvLgotICAgKiBFeHRyYWN0IG5vcm1hbGlzZWQgZW50cnkgZGF0YSBmcm9tIHdzZGwsIGFjY29yZGluZyB0byBjb25maWcgd3NkbEVsZW1lbnQgJiBzZXJ2aWNlTG9jYXRpb24KLSAgICogQHBhcmFtIHNlcnZpY2VSZWZlcmVuY2UgYSBTZXJ2aWNlUmVmZXJlbmNlIG9iamVjdC4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCBhIFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGNyZWF0aW5nIENhbmRpZGF0ZUluZm8gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIENhbmRpZGF0ZUluZm8oCi0gICAgU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlLAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyBBREQ6IGNoZWNrIGZvciBudWxsIGRvY3VtZW50PwotCi0gICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSBzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCk7Ci0KLSAgICB0aGlzLndzZGxEb2N1bWVudCA9IHdzZGxEb2N1bWVudDsKLQotICAgIC8qCi0gICAgICogR2VuZXJhbGlzZWQgZmllbGRzIGluZGVwZW5kZW50IG9mIHdzZGxFbGVtZW50OgotICAgICAqLwotICAgIC8vIEFERDogY2hlY2sgd2hldGhlciB0aGVzZSBuZWVkIHRvIGJlIGVpdGhlciBleHBhbmRlZCBvciBmaWx0ZXJlZCBkb3duLgotICAgIC8vIEFzc3VtZSBXU0RMNEogcHVsbHMgaW50IHRoZSBmdWxsIHRyZWUgYXQgdGhlIHJvb3QgZG9jdW1lbnQgZm9yIG5vdwkJCi0gICAgLy90aGlzLmltcG9ydHMgPSB3c2RsRG9jdW1lbnQuZ2V0SW1wb3J0cygpOwotCi0gICAgLy8gLi4uIG9yIGlmIG9ubHkgZG93biB0byBmaXJzdCBsZXZlbC4uLi4KLSAgICB0aGlzLmltcG9ydHMgPQotICAgICAgKEltcG9ydFtdKSBnZXRBbGxJbXBvcnRzKAotICAgICAgICB3c2RsRG9jdW1lbnQuZ2V0RGVmaW5pdGlvbnMoKSkudG9BcnJheShuZXcgSW1wb3J0W10gewotICAgIH0pOwotCi0gICAgLyogRGVmaW5pdGlvbnMuIAotICAgICAqIE5vdGUgdGhhdCB0aGUgdGhlIGZpcnN0IGFycmF5IGVsZW1lbnQgaXMgZm9yIHRoZSByb290IGRvYwotICAgICAqIHdoaWNoIGNvbnRhaW5zIGFsbCBXU0RMIGVsZW1lbnRzIGluIHNjb3BlIHZpYSA8aW1wb3J0PiBkZWNsYXJhdGlvbnMsCi0gICAgICogYXMgd2VsbCBhcyB0aGUgcm9vdCBkb2N1bWVudCBpdHNlbGYuIFRoZXJlZm9yZSB0aGUgc2Vjb25kIGRlZmluaXRpb25zIAotICAgICAqIGFycmF5IGVsZW1lbnQgYW5kIGFib3ZlIGFyZSByZWR1bmRhbnQsIGJ1dCAqbWF5KiBwcm92ZSB1c2VmdWwgdG8gdGhlIGFzc2VydGlvbgotICAgICAqIGNvZGUuCi0gICAgICovCi0KLSAgICB0aGlzLmRlZmluaXRpb25zID0gbmV3IERlZmluaXRpb25baW1wb3J0cy5sZW5ndGggKyAxXTsKLSAgICAvLyBhbGxvdyByb29tIGZvciByb290IGRvYwkJCi0KLSAgICB0aGlzLmRlZmluaXRpb25zWzBdID0gd3NkbERvY3VtZW50LmdldERlZmluaXRpb25zKCk7IC8vIHJvb3QgZG9jdW1lbnQgICAgCi0KLSAgICAvLyBBbGxvY2F0ZSBhcnJheSBmb3IgdHlwZXMgZWxlbWVudHMKLSAgICBUeXBlc1tdIHRlbXBUeXBlcyA9IG5ldyBUeXBlc1tkZWZpbml0aW9ucy5sZW5ndGhdOwotCi0gICAgaW50IHR5cGVzQ291bnQgPSAwOwotCi0gICAgaWYgKGRlZmluaXRpb25zWzBdLmdldFR5cGVzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0ZW1wVHlwZXNbMF0gPSB0aGlzLmRlZmluaXRpb25zWzBdLmdldFR5cGVzKCk7IC8vIHJvb3QgZG9jdW1lbnQJCi0gICAgICB0eXBlc0NvdW50Kys7Ci0gICAgfQotCi0gICAgLy8gRGVmaW5pdGlvbnMgZnJvbSBvdGhlciAoaW1wb3J0ZWQpIHdzZGxzIGNvcnJlbGF0aW5nIHRvIHRoZSBjYW5kaWRhdGUKLSAgICAvLyBPbmx5IG9uZSBsZXZlbCBkb3duIGZvciBub3cKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKCgoZGVmaW5pdGlvbnNbaSArIDFdID0gaW1wb3J0c1tpXS5nZXREZWZpbml0aW9uKCkpICE9IG51bGwpCi0gICAgICAgICYmIChkZWZpbml0aW9uc1tpICsgMV0uZ2V0VHlwZXMoKSAhPSBudWxsKSkKLSAgICAgIHsKLSAgICAgICAgdGVtcFR5cGVzW3R5cGVzQ291bnRdID0gZGVmaW5pdGlvbnNbaSArIDFdLmdldFR5cGVzKCk7Ci0gICAgICAgIHR5cGVzQ291bnQrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHlwZXNDb3VudCA+IDApCi0gICAgewotICAgICAgdGhpcy50eXBlcyA9IG5ldyBUeXBlc1t0eXBlc0NvdW50XTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlc0NvdW50OyBpKyspCi0gICAgICAgIHRoaXMudHlwZXNbaV0gPSB0ZW1wVHlwZXNbaV07Ci0gICAgfQotICAgIC8qIAotICAgICAqIFBvcHVsYXRlIGVsZW1lbnQgaGllcmFjaHk6Ci0gICAgICogUG9ydAotICAgICAqIEJpbmRpbmcKLSAgICAgKiBQb3J0VHlwZQotICAgICAqIG9wZXJhdGlvbihzKQotICAgICAqIG1lc3NhZ2UocykKLSAgICAgKi8KLQotICAgIGlmICh3c2RsRWxlbWVudC5pc1BvcnQoKSkKLSAgICB7Ci0KLSAgICAgIFBvcnQgcG9ydCA9IG51bGw7Ci0KLSAgICAgIC8vIFVzZSBwYXJlbnRFbGVtZW50TmFtZSB0byBxdWFsaWZ5IHRoZSBwb3J0IHdpdGhpbiBhIHNlcnZpY2UuCQkKLSAgICAgIFFOYW1lIHNlcnZpY2VOYW1lID0gd3NkbEVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudFFOYW1lKCk7Ci0gICAgICBTZXJ2aWNlW10gcyA9IHdzZGxEb2N1bWVudC5nZXRTZXJ2aWNlcygpOwotICAgICAgU3RyaW5nIHBvcnROYW1lID0gd3NkbEVsZW1lbnQuZ2V0TmFtZSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCAmJiBwb3J0ID09IG51bGw7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHNbaV0uZ2V0UU5hbWUoKS5lcXVhbHMoc2VydmljZU5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgcG9ydCA9IHNbaV0uZ2V0UG9ydChwb3J0TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHBvcnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgICAiV1NETCBQb3J0IFwnIgotICAgICAgICAgICAgKyBwb3J0TmFtZQotICAgICAgICAgICAgKyAiXCcgZm9yIFNlcnZpY2UgXCciCi0gICAgICAgICAgICArIHNlcnZpY2VOYW1lCi0gICAgICAgICAgICArICJcJyBub3QgZm91bmQgaW4gc2VydmljZSBkZXNjcmlwdGlvbiIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aGlzLnBvcnRzID0gbmV3IFBvcnRbXSB7IHBvcnQgfTsKLSAgICAgICAgLy8gQUREOiBkbyBzZXJ2aWNlTG9jYXRpb24gY2hlY2sgZm9yIHNvYXBiaW5kOmFkZHJlc3M/Ci0gICAgICAgIGRlc2NlbmRlbnRzKHBvcnQpOwotICAgICAgfQotCi0gICAgICAvLyBBREQ6IHRoZSBmb2xsb3dpbmcgY291bGQgYmUgaW5zdGFudGlhdGVkIGhlcmUgaW5zdGVhZCB0byByZWZpbmUgY29udGV4dCBpbmZvCi0gICAgICAvLyBkZWZpbml0aW9ucyAKLSAgICAgIC8vIGltcG9ydHMgCi0gICAgICAvLyB0eXBlcwotCi0gICAgfQotCi0gICAgZWxzZSBpZiAod3NkbEVsZW1lbnQuaXNCaW5kaW5nKCkpCi0gICAgewotICAgICAgaWYgKHdzZGxFbGVtZW50LmdldFFOYW1lKCkgIT0gbnVsbAotICAgICAgICAmJiB3c2RsRWxlbWVudC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICE9IG51bGwKLSAgICAgICAgJiYgd3NkbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9Ci0gICAgICAgICAgd3NkbERvY3VtZW50LmdldERlZmluaXRpb25zKCkuZ2V0QmluZGluZyh3c2RsRWxlbWVudC5nZXRRTmFtZSgpKTsKLQotICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICJXU0RMIEJpbmRpbmcgbmFtZWQgXCciCi0gICAgICAgICAgICAgICsgd3NkbEVsZW1lbnQuZ2V0UU5hbWUoKQotICAgICAgICAgICAgICArICJcJyBub3QgZm91bmQgaW4gc2VydmljZSBkZXNjcmlwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRoaXMuYmluZGluZ3MgPSBuZXcgQmluZGluZ1tdIHsgYmluZGluZyB9OwotCi0gICAgICAgICAgLy8gdGhlIHJlc3QgLi4uIGJlbG93IGJpbmRpbmc6CQotICAgICAgICAgIC8vIHBvcnRUeXBlcyBmcm9tIGJpbmRpbmcKLSAgICAgICAgICAvLyBvcGVyYXRpb25zIGZyb20gcG9ydFR5cGVzCi0gICAgICAgICAgLy8gbWVzc2FnZXMgZnJvbSBvcGVyYXRpb25zCi0gICAgICAgICAgZGVzY2VuZGVudHMoYmluZGluZyk7Ci0KLSAgICAgICAgICAvLyBhYm92ZSBiaW5kaW5nOgotICAgICAgICAgIC8vIHBvcnRzCi0gICAgICAgICAgLy8gZGVmaW5pdGlvbnMsIGltcG9ydHMsIHR5cGVzIChmdXR1cmU/KQkJCQkKLSAgICAgICAgICAvLyBhbmNlc3RvcnMoYmluZGluZ3MpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZWxzZSBpZiAod3NkbEVsZW1lbnQuaXNQb3J0VHlwZSgpKQotICAgIHsKLQotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPQotICAgICAgICB3c2RsRG9jdW1lbnQuZ2V0RGVmaW5pdGlvbnMoKS5nZXRQb3J0VHlwZSh3c2RsRWxlbWVudC5nZXRRTmFtZSgpKTsKLSAgICAgIHRoaXMucG9ydFR5cGVzID0gbmV3IFBvcnRUeXBlW10geyBwb3J0VHlwZSB9OwotCi0gICAgICBpZiAocG9ydFR5cGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgICAiV1NETCBQb3J0VHlwZSBuYW1lZCBcJyIKLSAgICAgICAgICAgICsgd3NkbEVsZW1lbnQuZ2V0UU5hbWUoKQotICAgICAgICAgICAgKyAiXCcgbm90IGZvdW5kIGluIHNlcnZpY2UgZGVzY3JpcHRpb24iKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGhpcy5wb3J0VHlwZXMgPSBuZXcgUG9ydFR5cGVbXSB7IHBvcnRUeXBlIH07Ci0gICAgICAgIC8vIHRoZSByZXN0IC4uLiBiZWxvdyBwb3J0VHlwZToJCi0gICAgICAgIGRlc2NlbmRlbnRzKHBvcnRUeXBlKTsKLQotICAgICAgICAvLyBhYm92ZSBwb3J0VHlwZToKLSAgICAgICAgLy8gcG9ydHMKLSAgICAgICAgLy8gZGVmaW5pdGlvbnMsIGltcG9ydHMsIHR5cGVzIChmdXR1cmUpID8KLSAgICAgICAgLy9hbmNlc3RvcnMocG9ydFR5cGVzKTsJCQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh3c2RsRWxlbWVudC5pc09wZXJhdGlvbigpKQotICAgIHsKLQotICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG51bGw7Ci0gICAgICBTdHJpbmcgY29uZmlnT3BOYW1lID0gd3NkbEVsZW1lbnQuZ2V0TmFtZSgpOwotCi0gICAgICAvLyBVc2UgcGFyZW50RWxlbWVudE5hbWUgdG8gcXVhbGlmeSB0aGUgb3BlcmF0aW9uIHdpdGhpbiBhIHBvcnRUeXBlLgotICAgICAgUU5hbWUgcG9ydFR5cGVOYW1lID0gd3NkbEVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudFFOYW1lKCk7Ci0gICAgICBQb3J0VHlwZVtdIHAgPSB3c2RsRG9jdW1lbnQuZ2V0UG9ydFR5cGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHAubGVuZ3RoICYmIG9wZXJhdGlvbiA9PSBudWxsOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChwW2ldLmdldFFOYW1lKCkuZXF1YWxzKHBvcnRUeXBlTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB3c2RsNGogYXZhaWxhYmxlIG1ldGhvZCBjYWxsIGJlbG93IGltcGxpZXMgdGhhdCBvbmx5IAotICAgICAgICAgIC8vIG5hbWUraW5wdXRuYW1lK291dHB1dG5hbWUgdW5pcXVlbHkgZGVmaW5lcyBvcGVyYXRpb24hIAotICAgICAgICAgIC8vIFNpbmNlIHdlIGRvIG5vdCBoYXZlIDxpbnB1dD4gJiA8b3V0cHV0PiBuYW1lIGluZm9ybWF0aW9uCi0gICAgICAgICAgLy8gYXZhaWxhYmxlIGluIHRoZSBjb25maWcsIHVzZSB0aGlzIGluc3RlYWQgZm9yIG5vdzogLSAKLSAgICAgICAgICAvLyBHZXQgdGhlIGZpcnN0IG9wZXJhdGlvbiB3ZSBmaW5kOgotICAgICAgICAgIEl0ZXJhdG9yIG9wSXQgPSBwW2ldLmdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgIE9wZXJhdGlvbiBvcCA9IG51bGw7Ci0gICAgICAgICAgd2hpbGUgKG9wSXQuaGFzTmV4dCgpICYmIG9wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wID0gKE9wZXJhdGlvbikgb3BJdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnT3BOYW1lLmVxdWFscyhvcC5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcGVyYXRpb24gPSBvcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAgICJObyBXU0RMIE9wZXJhdGlvbiBuYW1lZCBcJyIKLSAgICAgICAgICAgICsgd3NkbEVsZW1lbnQuZ2V0UU5hbWUoKQotICAgICAgICAgICAgKyAiXCcgZm91bmQgaW4gc2VydmljZSBkZXNjcmlwdGlvbiIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBuZXcgT3BlcmF0aW9uW10geyBvcGVyYXRpb24gfTsKLQotICAgICAgICBkZXNjZW5kZW50cyhvcGVyYXRpb24pOwotICAgICAgICAvL2FuY2VzdG9ycyhvcGVyYXRpb25zKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBlbHNlIGlmICh3c2RsRWxlbWVudC5pc01lc3NhZ2UoKSkKLSAgICB7Ci0KLSAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9Ci0gICAgICAgIHdzZGxEb2N1bWVudC5nZXREZWZpbml0aW9ucygpLmdldE1lc3NhZ2Uod3NkbEVsZW1lbnQuZ2V0UU5hbWUoKSk7Ci0gICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAgICJObyBXU0RMIE1lc3NhZ2UgbmFtZWQgXCciCi0gICAgICAgICAgICArIHdzZGxFbGVtZW50LmdldFFOYW1lKCkKLSAgICAgICAgICAgICsgIlwnIGZvdW5kIGluIHNlcnZpY2UgZGVzY3JpcHRpb24iKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG5ldyBNZXNzYWdlW10geyBtZXNzYWdlIH07Ci0KLSAgICAgICAgLy9hbmNlc3RvcnMobWVzc2FnZXMpOyAKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgIlVucmVjb2duaXNlZCA8V1NETEVsZW1lbnQgdHlwZT4gaW4gY29uZmlnOiAiICsgd3NkbEVsZW1lbnQuZ2V0VHlwZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBnZXQgaW5mbyBhYm91dCB0aGUgZWZmZWN0aXZlIHNlcnZpY2UgbG9jYXRpb24gKHMpCi0gICAgLy90aGlzLmVuZFBvaW50cyA9IGRlcml2ZUVuZHBvaW50cyhhbmFseXplckNvbmZpZywgdGhpcy5wb3J0cywgdGhpcy5kZWZpbml0aW9ucyk7Ci0gICAgdGhpcy5lbmRQb2ludHMgPQotICAgICAgZGVyaXZlRW5kcG9pbnRzKHNlcnZpY2VSZWZlcmVuY2UsIHRoaXMucG9ydHMsIHRoaXMuZGVmaW5pdGlvbnMpOwotICB9Ci0KLSAgLyoqIAotICAgICAqIGFuY2VzdG9yIGNvZGUgaXMgbm90IHVzZWQgYXQgcHJlc2VudC4KLSAgICAgKiAKLSAgICAgKi8KLSAgLyogICAKLSAgICAgcHJvdGVjdGVkIHZvaWQgYW5jZXN0b3JzKFBvcnRbXSBwb3J0cykgewotICAgICAJLy8gbm8gYW5jZXN0b3JzIG9mIFBvcnQgcmVxdWlyZWQgKGZvciBub3cpCi0gICAgIH0gCSAgICAKLSAgICAgcHJvdGVjdGVkIHZvaWQgYW5jZXN0b3JzKEJpbmRpbmdbXSBiaW5kaW5ncykgewkgICAgCi0gICAgCQkvLyBQb3J0cyBmcm9tIEJpbmRpbmdzICAxLTItMQotICAgICAJCi0gICAgIAkvLyAqKiogY2hlYXQgZm9yIG5vdyAtIGdldCBwb3J0cyBmcm9tIGFsbCBzZXJ2aWNlcyBpbiB0aGUgd3NkbCBkb2MKLSAgICAgCS8vIEFERDogZmluZCBjb3JyZWN0IG1hcHBpbmcgYmFzZWQgb24gdGhlIHN1cHBsaWVkIGJpbmRpbmdzCi0gICAgIAlTZXJ2aWNlW10gc2VydmljZSA9IHdzZGxEb2N1bWVudC5nZXRTZXJ2aWNlcygpOwotICAgICAJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotICAJCWZvciAoaW50IGk9MDsgaT5zZXJ2aWNlLmxlbmd0aDsgaSsrKSB7Ci0gIAkJCXNldC5hZGQoc2VydmljZVtpXS5nZXRQb3J0cygpKTsgIAotICAJCX0KLSAgCQkJCi0gIAkJLy8gYXNzaWduIHRoZSBwYXJlbnQgZ3JvdXAgYW5kIHByb2Nlc3MgdGhlIGdyYW5kcGFyZW50cyBpZiBhbnkJCQkJCQkJCQotICAJCWFuY2VzdG9ycyh0aGlzLnBvcnRzID0gKFBvcnRbXSlzZXQudG9BcnJheSh0aGlzLnBvcnRzID0gbmV3IFBvcnRbMF0pKTsKLSAgICAgfQotICAgICBwcm90ZWN0ZWQgdm9pZCBhbmNlc3RvcnMoUG9ydFR5cGVbXSBwb3J0VHlwZXMpIHsJICAgIAotICAgIAkJLy8gQmluZGluZ3MgZnJvbSBQb3J0VHlwZXMgIDEtMi0xCi0gICAgIAkKLSAgICAgCS8vIGFkZCBoYXZlIHRvIHN0YXJ0IHdpdGggYWxsIGJpbmRpbmdzIGluIGRvYyBhbmQgc2VhcmNoIGZvciB0aG9zZQotICAgICAJLy8gd2l0aCB0aGUgcG9ydFR5cGUgIAotICAgICAJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotICAJCWZvciAoaW50IGk9MDsgaT5wb3J0VHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgCQkvLyBzZXQuYWRkKHBvcnRUeXBlc1tpXS5nZXQoKSk7ICAKLSAgCQl9Ci0gIAkJCQotICAJCS8vIGFzc2lnbiB0aGUgcGFyZW50IGdyb3VwIGFuZCBwcm9jZXNzIHRoZSBncmFuZHBhcmVudHMgaWYgYW55CQkJCQkJCQkKLSAgCQlhbmNlc3RvcnModGhpcy5iaW5kaW5ncyA9IChCaW5kaW5nW10pc2V0LnRvQXJyYXkodGhpcy5iaW5kaW5ncyA9IG5ldyBCaW5kaW5nWzBdKSk7Ci0gICAgIH0KLSAgICAgcHJvdGVjdGVkIHZvaWQgYW5jZXN0b3JzKE9wZXJhdGlvbltdIG9wZXJhdGlvbnMpIHsJICAgIAotICAgIAkJLy8gUG9ydFR5cGVzIGZyb20gT3BlcmF0aW9ucyAgMS0yLTEKLSAgICAgCSAgCi0gICAgIAlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gIAkJZm9yIChpbnQgaT0wOyBpPm9wZXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgCQkJLy8gc2V0LmFkZChvcGVyYXRpb25zW2ldLmdldCgpKTsgIAotICAJCX0KLSAgCQkJCi0gIAkJLy8gYXNzaWduIHRoZSBwYXJlbnQgZ3JvdXAgYW5kIHByb2Nlc3MgdGhlIGdyYW5kcGFyZW50cyBpZiBhbnkJCQkJCQkJCQotICAJCWFuY2VzdG9ycyh0aGlzLnBvcnRUeXBlcyA9IChQb3J0VHlwZVtdKXNldC50b0FycmF5KHRoaXMucG9ydFR5cGVzID0gbmV3IFBvcnRUeXBlWzBdKSk7Ci0gICAgIH0KLSAgICAgcHJvdGVjdGVkIHZvaWQgYW5jZXN0b3JzKE1lc3NhZ2VbXSBtZXNzYWdlcykgewkgICAgCi0gICAgCQkvLyBPcGVyYXRpb25zIGZyb20gTWVzc2FnZXMgIDEtMi0xCi0gICAgIAkvLyBBREQgZml4IGl0ISAgCi0gICAgIAlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gIAkJZm9yIChpbnQgaT0wOyBpPm1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gIAkJCS8vIHNldC5hZGQobWVzc2FnZXNbaV0uZ2V0KCkpOyAgCi0gIAkJfQotICAJCQkKLSAgCQkvLyBhc3NpZ24gdGhlIHBhcmVudCBncm91cCAJCi0gIAkJdGhpcy5wb3J0VHlwZXMgPSAoUG9ydFR5cGVbXSlzZXQudG9BcnJheSh0aGlzLnBvcnRUeXBlcyA9IG5ldyBQb3J0VHlwZVswXSk7Ci0gICAgIH0KLSAgKi8KLQotICAvKioKLSAgICogRGVzY2VuZGFudCBtZXRob2QgZm9yIGNvbXBsZXRpbmcgY2FuZGlkYXRlIHNlcnZpY2UgY29udGV4dCBjcmVhdGlvbi4KLSAgICogQHBhcmFtIHBvcnQgIGEgUG9ydCBvYmplY3QKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcG9ydCBpcyBudWxsLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZGVzY2VuZGVudHMoUG9ydCBwb3J0KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBCaW5kaW5nIGZyb20gUG9ydCAgMS0yLTEKLQotICAgIGlmIChwb3J0ID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IGV4cGVjdGVkIGEgUG9ydCB2YWx1ZSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhpcy5iaW5kaW5ncyA9IG5ldyBCaW5kaW5nW10geyBwb3J0LmdldEJpbmRpbmcoKX07Ci0gICAgICBpZiAodGhpcy5iaW5kaW5nc1swXSAhPSBudWxsKQotICAgICAgewotICAgICAgICAvKiBBc3NpZ24gdGhlIGNoaWxkIGdyb3VwIGFuZCBwcm9jZXNzIHRoZSBncmFuZGNoaWxkcmVuIGlmIGFueS4KLSAgICAgICAgKiBOdWxsIGFyZ3VtZW50IHZhbHVlIHBhc3NlZCBpbnRvIHRoZSBmb2xsb3dpbmcgbWV0aG9kIHdvdWxkIAotICAgICAgICAqIHN1Z2dlc3QgYSBXU0RMIGRlZmluaXRpb24gaW5jb25zaXN0ZW5jeQotICAgICAgICAqIHdoaWNoIHdpbGwgYmUgcGlja2VkIHVwIGR1cmluZyBEZXNjcmlwdGlvbiBBcnRpZmFjdCBUQSB0ZXN0aW5nLgotICAgICAgICAqLwotICAgICAgICBkZXNjZW5kZW50cyh0aGlzLmJpbmRpbmdzWzBdKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRGVzY2VuZGFudCBtZXRob2QgZm9yIGNvbXBsZXRpbmcgY2FuZGlkYXRlIHNlcnZpY2UgY29udGV4dCBjcmVhdGlvbi4KLSAgICogQHBhcmFtIGJpbmRpbmcgIGEgQmluZGluZyBvYmplY3QKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgYmluZGluZyBpcyBudWxsLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZGVzY2VuZGVudHMoQmluZGluZyBiaW5kaW5nKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBwb3J0VHlwZSBmcm9tIEJpbmRpbmcgMS0yLTEKLQotICAgIGlmIChiaW5kaW5nID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IGV4cGVjdGVkIGEgQmluZGluZyB2YWx1ZSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhpcy5wb3J0VHlwZXMgPSBuZXcgUG9ydFR5cGVbXSB7IGJpbmRpbmcuZ2V0UG9ydFR5cGUoKX07Ci0gICAgICBpZiAodGhpcy5wb3J0VHlwZXNbMF0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLyogQXNzaWduIHRoZSBjaGlsZCBncm91cCBhbmQgcHJvY2VzcyB0aGUgZ3JhbmRjaGlsZHJlbiBpZiBhbnkuCi0gICAgICAgIAkqIE51bGwgYXJndW1lbnQgdmFsdWUgcGFzc2VkIGludG8gdGhlIGZvbGxvd2luZyBtZXRob2Qgd291bGQgCi0gICAgICAgIAkqIHN1Z2dlc3QgYSBXU0RMIGRlZmluaXRpb24gaW5jb25zaXN0ZW5jeQotICAgICAgICAJKiB3aGljaCB3aWxsIGJlIHBpY2tlZCB1cCBkdXJpbmcgRGVzY3JpcHRpb24gQXJ0aWZhY3QgVEEgdGVzdGluZy4KLSAgICAgICAgCSovCi0gICAgICAgIGRlc2NlbmRlbnRzKHRoaXMucG9ydFR5cGVzWzBdKTsKLQotICAgICAgICAvLyBHZXQgYW55IG1lc3NhZ2VzIHRoYXQgYXJlIHJlZmVyZW5jZWQgZnJvbSBoZWFkZXJzIGFuZCBoZWFkZXJmYXVsdHMKLQotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb247Ci0KLSAgICAgICAgLy8gR2V0IHJlZmVyZW5jZSB0byBkZWZpbml0aW9uCi0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGRlZmluaXRpb25zWzBdOwotCi0gICAgICAgIC8vIElmIHRoZXJlIGFyZSBtZXNzYWdlcyBhbHJlYWR5LCB0aGVuIGdldCB0aGVtIGFzIGEgY29sbGVjdGlvbgotICAgICAgICBIYXNoU2V0IG1lc3NhZ2VTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBpZiAobWVzc2FnZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZVNldC5hZGQobWVzc2FnZXNbaV0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgbWVzc2FnZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBvbmx5IGJ5IGEgYmluZGluZyAKLSAgICAgICAgSGFzaFNldCBiaW5kaW5nTWVzc2FnZXMgPSBXU0RMVXRpbHMuZmluZE1lc3NhZ2VzKGRlZmluaXRpb24sIGJpbmRpbmcpOwotCi0gICAgICAgIC8vIEFkZCB0aGVzZSBtZXNzYWdlcyB0byB0aGUgY29tcGxldGUgbWVzc2FnZSBsaXN0ICAKLSAgICAgICAgbWVzc2FnZVNldC5hZGRBbGwoYmluZGluZ01lc3NhZ2VzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYXJyYXkgZnJvbSBtZXNzYWdlIHNldAotICAgICAgICB0aGlzLm1lc3NhZ2VzID0KLSAgICAgICAgICAoTWVzc2FnZVtdKSBtZXNzYWdlU2V0LnRvQXJyYXkodGhpcy5tZXNzYWdlcyA9IG5ldyBNZXNzYWdlWzBdKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRGVzY2VuZGFudCBtZXRob2QgZm9yIGNvbXBsZXRpbmcgY2FuZGlkYXRlIHNlcnZpY2UgY29udGV4dCBjcmVhdGlvbi4KLSAgICogQHBhcmFtIHBvcnRUeXBlICBhIFBvcnRUeXBlIG9iamVjdAotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwb3J0VHlwZSBpcyBudWxsLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZGVzY2VuZGVudHMoUG9ydFR5cGUgcG9ydFR5cGUpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIE9wZXJhdGlvbnMgZnJvbSBQb3J0VHlwZSAxLTItbgotCi0gICAgaWYgKHBvcnRUeXBlID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IGV4cGVjdGVkIGEgUG9ydFR5cGUgdmFsdWUiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRoaXMub3BlcmF0aW9ucyA9Ci0gICAgICAgIChPcGVyYXRpb25bXSkgKHBvcnRUeXBlCi0gICAgICAgICAgLmdldE9wZXJhdGlvbnMoKQotICAgICAgICAgIC50b0FycmF5KHRoaXMub3BlcmF0aW9ucyA9IG5ldyBPcGVyYXRpb25bMF0pKTsKLSAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgZGVzY2VuZGVudHModGhpcy5vcGVyYXRpb25zKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICAgKiBEZXNjZW5kYW50IG1ldGhvZCBmb3IgY29tcGxldGluZyBjYW5kaWRhdGUgc2VydmljZSBjb250ZXh0IGNyZWF0aW9uLgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gIGEgT3BlcmF0aW9uIG9iamVjdAotICAgICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIG9wZXJhdGlvbiBpcyBudWxsLgotICAgICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkZXNjZW5kZW50cyhPcGVyYXRpb24gb3BlcmF0aW9uKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBNZXNzYWdlcyBmcm9tIE9wZXJhdGlvbgotCi0gICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBleHBlY3RlZCBhbiBPcGVyYXRpb24gdmFsdWUiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGRlc2NlbmRlbnRzKG5ldyBPcGVyYXRpb25bXSB7IG9wZXJhdGlvbiB9KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRGVzY2VuZGFudCBtZXRob2QgZm9yIGNvbXBsZXRpbmcgY2FuZGlkYXRlIHNlcnZpY2UgY29udGV4dCBjcmVhdGlvbi4KLSAgICogQHBhcmFtIG9wZXJhdGlvbnMgIGFuIGFycmF5IG9mIG9wZXJhdGlvbnMuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIG9wZXJhdGlvbnMgaXMgbnVsbC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGRlc2NlbmRlbnRzKE9wZXJhdGlvbltdIG9wZXJhdGlvbnMpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIE1lc3NhZ2VzIGZyb20gT3BlcmF0aW9ucyAxLTItbgotCi0gICAgaWYgKG9wZXJhdGlvbnMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogZXhwZWN0ZWQgYW4gT3BlcmF0aW9uW10gdmFsdWUiKTsKLSAgICB9Ci0KLSAgICBIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChvcGVyYXRpb25zW2ldLmdldElucHV0KCkgIT0gbnVsbCkKLSAgICAgICAgc2V0LmFkZChvcGVyYXRpb25zW2ldLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpKTsgLy8xLTItMQotICAgICAgaWYgKG9wZXJhdGlvbnNbaV0uZ2V0T3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgICAgc2V0LmFkZChvcGVyYXRpb25zW2ldLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKSk7IC8vMS0yLTEKLQotICAgICAgLy8gZ2V0IG1lc3NhZ2VzIGFzc29jaWF0ZWQgd2l0aCBmYXVsdHMgZm9yIHRoaXMgb3BlcmF0aW9uIAotICAgICAgLy8gMS0yLW4KLSAgICAgIEl0ZXJhdG9yIGl0ID0gb3BlcmF0aW9uc1tpXS5nZXRGYXVsdHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgc2V0LmFkZCgoKEZhdWx0KSBpdC5uZXh0KCkpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHRoaXMubWVzc2FnZXMgPSAoTWVzc2FnZVtdKSBzZXQudG9BcnJheSh0aGlzLm1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VbMF0pOwotICAgIC8vIG5vIGRlc2NlbmRlbnRzIG9mIG1lc3NhZ2VzIHNvIHN0b3AuCi0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZSBhIHJlY3Vyc2l2ZSBub24tcmVwZWF0aW5nIGxpc3Qgb2YgaW1wb3J0cyBmb3IgdGhlIHNwZWNpZmllZAotICAgKiBXU0RMIGRvY3VtZW50IGRlZmluaXRpb24uCi0gICAqLwotICAvKiAgIHByaXZhdGUgSGFzaFNldCBnZXRBbGxJbXBvcnRzKERlZmluaXRpb24gcm9vdERlZikgdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0gICAgIAkKLSAgICAgCUhhc2hTZXQgaW1wb3J0U2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgCQotICAgICAJQ29sbGVjdGlvbiBpbXBvcnRMaXN0ID0gIHJvb3REZWYuZ2V0SW1wb3J0cygpLnZhbHVlcygpOwotICAgICAJSXRlcmF0b3IgaSA9IGltcG9ydExpc3QuaXRlcmF0b3IoKTsKLSAgICAgCQotICAgICAJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgIAkJSW1wb3J0IG5leHRJbXBvcnQgPSAoSW1wb3J0KShpLm5leHQoKSk7Ci0gICAgIAkJaWYgKG5leHRJbXBvcnQgIT0gbnVsbCkgewotICAgICAJCQkvLyBpdHMgYSB3c2RsIGRvY3VtZW50Ci0gICAgIAkJCWltcG9ydFNldC5hZGRBbGwoZ2V0QWxsSW1wb3J0cyhuZXh0SW1wb3J0LmdldERlZmluaXRpb24oKSkpOwotICAgICAJCX0gICAJCQkKLSAgICAgCX0KLSAgICAgCQotICAgICAJcmV0dXJuIChpbXBvcnRTZXQpOwotICAgICB9Ci0gICAqLwotICBwcml2YXRlIEhhc2hTZXQgZ2V0QWxsSW1wb3J0cyhEZWZpbml0aW9uIHJvb3REZWYpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgSGFzaFNldCBpbXBvcnRTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgTWFwIGltcG9ydE1hcCA9IHJvb3REZWYuZ2V0SW1wb3J0cygpOwotICAgIEl0ZXJhdG9yIGkgPSBpbXBvcnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBMaXN0IG5leHRJbXBvcnRMaXN0ID0gKExpc3QpIChpLm5leHQoKSk7Ci0gICAgICBJdGVyYXRvciBsaXN0SXQgPSBuZXh0SW1wb3J0TGlzdC5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGxpc3RJdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIEltcG9ydCBuZXh0SW1wb3J0ID0gKEltcG9ydCkgbGlzdEl0Lm5leHQoKTsKLSAgICAgICAgaWYgKG5leHRJbXBvcnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIGl0cyBhIHdzZGwgZG9jdW1lbnQKLSAgICAgICAgICBpbXBvcnRTZXQuYWRkKG5leHRJbXBvcnQpOwotICAgICAgICAgIGlmIChuZXh0SW1wb3J0LmdldERlZmluaXRpb24oKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEhhc2hTZXQgc3ViVHJlZUltcG9ydHMgPSBnZXRBbGxJbXBvcnRzKG5leHRJbXBvcnQuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHN1Ykl0ID0gc3ViVHJlZUltcG9ydHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChzdWJJdC5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGltcG9ydFNldC5hZGQoKEltcG9ydCkgKHN1Ykl0Lm5leHQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAoaW1wb3J0U2V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBnZXQgYWxsIHNlcnZpY2UgbG9jYXRpb24gZW5kcG9pbnQgdmFsdWVzCi0gICAqIHJlbGV2YW50IHRvIHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QuCi0gICAqIAotICAgKiBJZiB0aGUgc2VydmljZSBsb2NhdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZyB3ZSB1c2UKLSAgICoganVzdCB0aGF0LgotICAgKiBPdGhlcndpc2UsIGlmIHRoZSBwb3J0IGlzIHNwZWNpZmllZCwgd2UgZ2V0IGFsbCBlbmRwb2ludHMKLSAgICogYXNzb2NpYXRlZCB3aXRoIHRoYXQgcG9ydC4KLSAgICogSWYgd2UgaGF2ZSBuZWl0aGVyIHRoZSBzZXJ2aWNlIGxvY2F0aW9uIHZhbHVlIG9yIHRoZSBwb3J0LAotICAgKiB0aGVuIGFsbCBlbmRwb2ludHMgaW4gdGhlIGRlZmluaXRpb24gYXJlIHVzZWQuCi0gICAqLwotICBwcml2YXRlIFVSSVtdIGRlcml2ZUVuZHBvaW50cygKLSAgLy9BbmFseXplckNvbmZpZyBhbmFseXplckNvbmZpZywgCi0gIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSwgUG9ydFtdIHBvcnRzLCBEZWZpbml0aW9uW10gZGVmaW5pdGlvbnMpCi0gIHsKLQotICAgIFVSSVtdIGVuZHAgPSBudWxsOwotICAgIC8vUG9ydCBwb3J0ID0gbnVsbDsJCi0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIHNlcnZpY2VMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAvLyB0cnkgc2VydmljZSBsb2NhdGlvbi4uLgotICAgICAgLy9pZiAoKHNlcnZpY2VMb2NhdGlvbiA9IGFuYWx5emVyQ29uZmlnLmdldFNlcnZpY2VMb2NhdGlvbigpKSAhPSBudWxsKSB7ICAgICAgCi0gICAgICBpZiAoKHNlcnZpY2VMb2NhdGlvbiA9IHNlcnZpY2VSZWZlcmVuY2UuZ2V0U2VydmljZUxvY2F0aW9uKCkpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGVuZHAgPSBuZXcgVVJJW10geyBuZXcgVVJJKHNlcnZpY2VMb2NhdGlvbil9OwotICAgICAgfQotICAgICAgLy9lbHNlIGlmIChhbmFseXplckNvbmZpZy5nZXRXU0RMRWxlbWVudCgpLmlzUG9ydCgpKSB7Ci0gICAgICBlbHNlIGlmIChzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuaXNQb3J0KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChwb3J0cy5sZW5ndGggIT0gMSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkludGVybmFsIGVycm9yIC0gZXhwZWN0ZWQgMS1lbGVtZW50IFBvcnQgYXJyYXkiKTsKLSAgICAgICAgfQotICAgICAgICAvL2Vsc2UgewotICAgICAgICAvLwlwb3J0ID0gcG9ydHNbMF07IC8vIGlmIFBvcnQgd2FzIGdpdmVuIGluIGNvbmZpZywgdGhlcmUgaXMganVzdCBvbmUKLSAgICAgICAgLy99Ci0gICAgICAgIC8vUU5hbWUgc29hcEFkZHJlc3MgPSBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMX1NPQVAsICJhZGRyZXNzIik7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBwb3J0c1swXS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkgJiYgc2VydmljZUxvY2F0aW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoZXh0RWxlbSBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vaWYgKGV4dEVsLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKHNvYXBBZGRyZXNzKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGVsZW1lbnQgaXMgb3VyIFNPQVBBZGRyZXNzIC0gZ2V0IHRoZSBsb2NhdGlvbgotICAgICAgICAgICAgc2VydmljZUxvY2F0aW9uID0gKChTT0FQQWRkcmVzcykgZXh0RWxlbSkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgICAgIGVuZHAgPSBuZXcgVVJJW10geyBuZXcgVVJJKHNlcnZpY2VMb2NhdGlvbil9OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAvLyBubyBwb3J0IGluZm8gZnJvbSBjb25maWcsIHNvIHN1cHBseSBhbGwgaW4gZG9jdW1lbnQKLSAgICAgICAgLy8gUU5hbWUgc29hcEFkZHJlc3MgPSBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMX1NPQVAsICJhZGRyZXNzIik7Ci0gICAgICAgIEhhc2hTZXQgZW5kcG9pbnRTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBJdGVyYXRvciBpID0gZGVmaW5pdGlvbnNbMF0uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGV4dEVsZW0gaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL2lmIChleHRFbC5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhzb2FwQWRkcmVzcykgewotICAgICAgICAgICAgLy8gdGhpcyBlbGVtZW50IGlzIG91ciBTT0FQQWRkcmVzcyAtIGdldCB0aGUgbG9jYXRpb24KLSAgICAgICAgICAgIGVuZHBvaW50U2V0LmFkZCgoKFNPQVBBZGRyZXNzKSBleHRFbGVtKS5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgZGVyaXZlZCBMaXN0IHRvIGEgVVJJIGFycmF5Ci0gICAgICAgIGVuZHAgPSAoVVJJW10pIGVuZHBvaW50U2V0LnRvQXJyYXkoZW5kcCA9IG5ldyBVUklbMF0pOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gZW5kcDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBiaW5kaW5nLgotICAgKiBAcmV0dXJuIEJpbmRpbmcKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nW10gZ2V0QmluZGluZ3MoKQotICB7Ci0gICAgcmV0dXJuIGJpbmRpbmdzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGVuZFBvaW50cy4KLSAgICogQHJldHVybiBVUklbXQotICAgKi8KLSAgcHVibGljIFVSSVtdIGdldEVuZFBvaW50cygpCi0gIHsKLSAgICAvLyBnZXQgbGlzdCBvZiBtYXRjaGluZyBlbmRwb2ludChzKSBhc3NvY2lhdGVkIHdpdGggc2VydmljZS4KLSAgICByZXR1cm4gZW5kUG9pbnRzOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgZW5kUG9pbnRzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4KLSAgKiBAcGFyYW0gaG9zdEFuZFBvcnQgIGhvc3QgYW5kIHBvcnQgbG9jYXRpb24uCi0gICogQHJldHVybiBVUklbXSBpZiBtYXRjaGVkLCBudWxsIG90aGVyd2lzZS4KLSAgKi8KLSAgcHVibGljIFVSSVtdIGdldEVuZFBvaW50cyhTdHJpbmcgaG9zdEFuZFBvcnQpCi0gIHsKLSAgICAvLyBnZXQgbGlzdCBvZiBtYXRjaGluZyBlbmRwb2ludHMgYXNzb2NpYXRlZCB3aXRoIHNlcnZpY2UsCi0gICAgLy8gaGF2aW5nIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydCBjb25maWd1cmF0aW9uCi0gICAgU3RyaW5nIHBvcnQ7Ci0KLSAgICBWZWN0b3IgbWF0Y2hlZEVuZHBvaW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZFBvaW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICAvLyBQQjogSWYgdGhlIGVuZHBvaW50IGRvZXMgbm90IGNvbnRhaW4gYSBwb3J0IG51bWJlciwgdGhlbiBkZWZhdWx0IGl0IHRvICI4MCIKLSAgICAgIHBvcnQgPQotICAgICAgICAoZW5kUG9pbnRzW2ldLmdldFBvcnQoKSA9PSAtMSkKLSAgICAgICAgICA/ICI4MCIKLSAgICAgICAgICA6IFN0cmluZy52YWx1ZU9mKGVuZFBvaW50c1tpXS5nZXRQb3J0KCkpOwotICAgICAgaWYgKGhvc3RBbmRQb3J0LmVxdWFscyhlbmRQb2ludHNbaV0uZ2V0SG9zdCgpICsgIjoiICsgcG9ydCkpCi0gICAgICB7Ci0gICAgICAgIG1hdGNoZWRFbmRwb2ludHMuYWRkKGVuZFBvaW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoVVJJW10pIG1hdGNoZWRFbmRwb2ludHMudG9BcnJheShuZXcgVVJJWzBdKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBvcGVyYXRpb24uCi0gICAqIEByZXR1cm4gT3BlcmF0aW9uCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uW10gZ2V0T3BlcmF0aW9ucygpCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwb3J0VHlwZS4KLSAgICogQHJldHVybiBQb3J0VHlwZQotICAgKi8KLSAgcHVibGljIFBvcnRUeXBlW10gZ2V0UG9ydFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHBvcnRUeXBlczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGhvc3RBbmRQb3J0IG1hdGNoZXMgYXQgbGVhc3Qgb25lIGNvbnRleHQgZW5kcG9pbnQuCi0gICAqIEBwYXJhbSBob3N0QW5kUG9ydFN0cmluZyBhIGhvc3QgYW5kIHBvcnQgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaG9zdEFuZFBvcnQgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgY29udGV4dCBlbmRwb2ludC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgZ2l2ZW4gaG9zdGFuZFBvcnQgU3RyaW5nIGRvZXMgbm90IGNvbnZlcnQgdG8gVVJJLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzSG9zdEFuZFBvcnQoU3RyaW5nIGhvc3RBbmRQb3J0U3RyaW5nKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBVUkkgaG9zdEFuZFBvcnQ7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaG9zdEFuZFBvcnQgPSBuZXcgVVJJKGhvc3RBbmRQb3J0U3RyaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgICJDb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gVVJJOiAiICsgaG9zdEFuZFBvcnRTdHJpbmcpOwotICAgIH0KLSAgICBTdHJpbmcgaG9zdCA9IGhvc3RBbmRQb3J0LmdldEhvc3QoKTsKLSAgICBpbnQgcG9ydCA9IGhvc3RBbmRQb3J0LmdldFBvcnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZW5kUG9pbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICh0aGlzLmVuZFBvaW50c1tpXS5nZXRIb3N0KCkuZXF1YWxzKGhvc3QpCi0gICAgICAgICYmIHRoaXMuZW5kUG9pbnRzW2ldLmdldFBvcnQoKSA9PSBwb3J0KQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOyAvLyBmb3Igbm93Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVmaW5pdGlvbnMuCi0gICAqIEByZXR1cm4gRGVmaW5pdGlvbltdCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbltdIGdldERlZmluaXRpb25zKCkKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbXBvcnRzLgotICAgKiBAcmV0dXJuIEltcG9ydFtdCi0gICAqLwotICBwdWJsaWMgSW1wb3J0W10gZ2V0SW1wb3J0cygpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlcy4KLSAgICogQHJldHVybiBNZXNzYWdlW10KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlW10gZ2V0TWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBvcnRzLgotICAgKiBAcmV0dXJuIFBvcnRbXQotICAgKi8KLSAgcHVibGljIFBvcnRbXSBnZXRQb3J0cygpCi0gIHsKLSAgICByZXR1cm4gcG9ydHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcG9ydFR5cGVzLgotICAgKiBAcmV0dXJuIFBvcnRUeXBlW10KLSAgICovCi0gIHB1YmxpYyBQb3J0VHlwZVtdIGdldFBvcnRUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gcG9ydFR5cGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHR5cGVzLgotICAgKiBAcmV0dXJuIFR5cGVzW10KLSAgICovCi0gIHB1YmxpYyBUeXBlc1tdIGdldFR5cGVzKCkKLSAgewotICAgIHJldHVybiB0eXBlczsKLSAgfQotICAvKioKLSAgICogUmV0dXJucyB0aGUgd3NkbERvY3VtZW50LgotICAgKiBAcmV0dXJuIFdTRExEb2N1bWVudAotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudCBnZXRXc2RsRG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxEb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGRlZmluaXRpb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSB0eXBlcyBlbGVtZW50LgotICAgKiBAcGFyYW0gdHlwZXMgYSBUeXBlcyBvYmplY3QuCi0gICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSB0eXBlcyBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbihUeXBlcyB0eXBlcykKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgVHlwZXMgY2hlY2tUeXBlczsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmaW5pdGlvbnMubGVuZ3RoICYmIGRlZmluaXRpb24gPT0gbnVsbDsgaSsrKQotICAgIHsKLSAgICAgIGlmICgoKGNoZWNrVHlwZXMgPSBkZWZpbml0aW9uc1tpXS5nZXRUeXBlcygpKSAhPSBudWxsKQotICAgICAgICAmJiAoY2hlY2tUeXBlcy5lcXVhbHModHlwZXMpKSkKLSAgICAgIHsKLSAgICAgICAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb25zW2ldOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZGVmaW5pdGlvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGJpbmRpbmcgZWxlbWVudC4KLSAgICogQHBhcmFtIGJpbmRpbmcgYSBCaW5kaW5nIG9iamVjdC4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGJpbmRpbmcgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldERlZmluaXRpb24oQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmaW5pdGlvbnMubGVuZ3RoICYmIGRlZmluaXRpb24gPT0gbnVsbDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChkZWZpbml0aW9uc1tpXS5nZXRCaW5kaW5nKGJpbmRpbmcuZ2V0UU5hbWUoKSkgIT0gbnVsbCkKLSAgICAgICAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb25zW2ldOwotICAgIH0KLQotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZGVmaW5pdGlvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIHBvcnRUeXBlIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwb3J0VHlwZSBhIFBvcnRUeXBlIG9iamVjdC4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIHBvcnRUeXBlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmaW5pdGlvbnMubGVuZ3RoICYmIGRlZmluaXRpb24gPT0gbnVsbDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChkZWZpbml0aW9uc1tpXS5nZXRQb3J0VHlwZShwb3J0VHlwZS5nZXRRTmFtZSgpKSAhPSBudWxsKQotICAgICAgICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbnNbaV07Ci0gICAgfQotCi0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBkZWZpbml0aW9uIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIG1lc3NhZ2UgYSBNZXNzYWdlIG9iamVjdC4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlZmluaXRpb25zLmxlbmd0aCAmJiBkZWZpbml0aW9uID09IG51bGw7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZGVmaW5pdGlvbnNbaV0uZ2V0TWVzc2FnZShtZXNzYWdlLmdldFFOYW1lKCkpICE9IG51bGwpCi0gICAgICAgIGRlZmluaXRpb24gPSBkZWZpbml0aW9uc1tpXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvRW52aXJvbm1lbnRJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvRW52aXJvbm1lbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzVjMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Vudmlyb25tZW50SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5YTUxJbmZvOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFpbnRhaW5zIHRoZSBFbnZpcm9ubWVudCBpbmZvcm1hdGlvbi4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIEVudmlyb25tZW50SW5mbyBpbXBsZW1lbnRzIFhNTEluZm8KLXsKLSAgLyoqCi0gICAqIExvZyB0aW1lc3RhbXAuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGxvZ1RpbWVzdGFtcCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIE1vbml0b3IgY29uZmlnIGNvbW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG1vbml0b3JDb25maWdDb21tZW50ID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlIG9iamVjdC4KLSAgICogQHBhcmFtIGxvZ1RpbWVzdGFtcCB0aGUgbG9nIHRpbWVzdGFtcC4KLSAgICogQHBhcmFtIG1vbml0b3JDb25maWdDb21tZW50IHRoZSBNb25pdG9yIGNvbmZpZyBjb21tZW50LgotICAgKi8KLSAgcHVibGljIEVudmlyb25tZW50SW5mbyhTdHJpbmcgbG9nVGltZXN0YW1wLCBTdHJpbmcgbW9uaXRvckNvbmZpZ0NvbW1lbnQpCi0gIHsKLSAgICB0aGlzLmxvZ1RpbWVzdGFtcCA9IGxvZ1RpbWVzdGFtcDsKLSAgICB0aGlzLm1vbml0b3JDb25maWdDb21tZW50ID0gbW9uaXRvckNvbmZpZ0NvbW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5YTUxJbmZvI3RvWE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCFuc05hbWUuZXF1YWxzKCIiKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBTdGFydCBlbGVtZW50Ci0gICAgcHcucHJpbnQoIiAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTE9HICsgIiAiKTsKLSAgICBwdy5wcmludGxuKAotICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfVElNRVNUQU1QICsgIj1cIiIgKyB0aGlzLmxvZ1RpbWVzdGFtcCArICJcIi8+Iik7Ci0KLSAgICBwdy5wcmludCgKLSAgICAgICIgICAgICAgIDwiCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NJX0xPRwotICAgICAgICArIFdTSUNvbnN0YW50cy5FTEVNX0NPTU1FTlQKLSAgICAgICAgKyAiPiIpOwotICAgIHB3LnByaW50KHRoaXMubW9uaXRvckNvbmZpZ0NvbW1lbnQpOwotICAgIHB3LnByaW50bG4oCi0gICAgICAiICAgICAgICA8LyIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfTkFNRV9XU0lfTE9HCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLkVMRU1fQ09NTUVOVAotICAgICAgICArICI+Iik7Ci0KLSAgICAvLyBFbmQgZWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICA8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9MT0cgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL1NlcnZpY2VSZWZlcmVuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9TZXJ2aWNlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3M2U0ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL1NlcnZpY2VSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETEVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgaXMgbmVlZGVkIHRvIHByb2Nlc3MgZGVzY3JpcHRpb24gdGVzdCBhc3NlcnRpb25zLiAgVGhlIGluZnJvbWF0aW9uCi0gKiBpbiB0aGlzIG9iamVjdCB3aWxsIGJlIGRlcml2ZWQgZnJvbSBhbmFseXplciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLCBVRERJIGVudHJpZXMsIG9yIHRoZSBXU0RMIHBvcnQgZWxlbWVudC4gCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUmVmZXJlbmNlCi17Ci0gIHByb3RlY3RlZCBXU0RMRWxlbWVudCB3c2RsRWxlbWVudDsKLSAgcHJvdGVjdGVkIFN0cmluZyB3c2RsTG9jYXRpb247Ci0gIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZUxvY2F0aW9uOwotCi0gIC8qKgotICAgKiBDcmVhdGUgc2VydmljZSByZWZlcmVuY2Ugd2l0aG91dCByZWZlcmVuY2VzLiAgQWxsIG9mIHRoZW0gd2lsbCBiZSBzZXQgbGF0ZXIgYXMgdGVzdCBhc3NlcnRpb25zIGFyZSAKLSAgICogYmVpbmcgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIFNlcnZpY2VSZWZlcmVuY2UoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHNlcnZpY2UgcmVmZXJlbmNlIGZyb20gZW50cmllcyBzcGVjaWZpZWQgaW4gdGhlIGFuYWx5emVyIGNvbmZpZyBmaWxlLiAgVGhpcyBpbmZvcm1hdGlvbiBtYXkgaW5jbHVkZQotICAgKiB0aGUgaW5mb3JtYXRpb24gZXh0cmFjdGVkIGZyb20gdGhlIHdzZGxFbGVtZW50LCB3c2RsVVJJIGFuZCBzZXJ2aWNlTG9jYXRpb24gZWxlbWVudHMuCi0gICAqIEBwYXJhbSBhbmFseXplckNvbmZpZyBhbiBBbmFseXplckNvbmZpZyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU2VydmljZVJlZmVyZW5jZShBbmFseXplckNvbmZpZyBhbmFseXplckNvbmZpZykKLSAgewotICAgIHRoaXMud3NkbEVsZW1lbnQgPSBhbmFseXplckNvbmZpZy5nZXRXU0RMRWxlbWVudCgpOwotICAgIHRoaXMud3NkbExvY2F0aW9uID0gYW5hbHl6ZXJDb25maWcuZ2V0V1NETExvY2F0aW9uKCk7Ci0gICAgdGhpcy5zZXJ2aWNlTG9jYXRpb24gPSBhbmFseXplckNvbmZpZy5nZXRTZXJ2aWNlTG9jYXRpb24oKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgV1NETCBlbGVtZW50IHdoZXJlIGFuYWx5c2lzIHNob3VsZCBiZWdpbi4KLSAgICogQHJldHVybiBoZSBXU0RMIGVsZW1lbnQgd2hlcmUgYW5hbHlzaXMgc2hvdWxkIGJlZ2luLgotICAgKiBAc2VlICNzZXRXU0RMRWxlbWVudAotICAgKi8KLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiB0aGlzLndzZGxFbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgV1NETCBlbGVtZW50IHdoZXJlIGFuYWx5c2lzIHNob3VsZCBiZWdpbi4KLSAgICogQHBhcmFtIHdzZGxFbGVtZW50IHRoZSBXU0RMIGVsZW1lbnQgd2hlcmUgYW5hbHlzaXMgc2hvdWxkIGJlZ2luLgotICAgKiBAc2VlICNnZXRXU0RMRWxlbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V1NETEVsZW1lbnQoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQpCi0gIHsKLSAgICB0aGlzLndzZGxFbGVtZW50ID0gd3NkbEVsZW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IFdTREwgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gV1NETCBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHNlZSAjc2V0V1NETExvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdTRExMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy53c2RsTG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0IFdTREwgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSB3c2RsTG9jYXRpb24gV1NETCBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHNlZSAjZ2V0V1NETExvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXU0RMTG9jYXRpb24oU3RyaW5nIHdzZGxMb2NhdGlvbikKLSAgewotICAgIHRoaXMud3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBXZWIgc2VydmljZSBsb2NhdGlvbi4KLSAgICogQHJldHVybiBXZWIgc2VydmljZSBsb2NhdGlvbi4KLSAgICogQHNlZSAjc2V0U2VydmljZUxvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0IFdlYiBzZXJ2aWNlIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gc2VydmljZUxvY2F0aW9uIGViIHNlcnZpY2UgbG9jYXRpb24uCi0gICAqIEBzZWUgI2dldFNlcnZpY2VMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUxvY2F0aW9uKFN0cmluZyBzZXJ2aWNlTG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLnNlcnZpY2VMb2NhdGlvbiA9IHNlcnZpY2VMb2NhdGlvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9BbmFseXplckNvbmZpZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9BbmFseXplckNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGEyMTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvQW5hbHl6ZXJDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuY29tbW9uLkFkZFN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LldTSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VMaXN0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgdGhlIGFuYWx6eWVyIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFuYWx5emVyQ29uZmlnIGV4dGVuZHMgV1NJRG9jdW1lbnQKLXsKLSAgLyoqCi0gICAqIEVsZW1lbnQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTkFNRSA9IFdTSUNvbnN0YW50cy5FTEVNX0NPTkZJRzsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfQU5BTFlaRVJfQ09ORklHLCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBDb3JyZWxhdGlvbiB0eXBlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUlJFTEFUSU9OX1RZUEVfT1BFUkFUSU9OID0gIm9wZXJhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUlJFTEFUSU9OX1RZUEVfTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUlJFTEFUSU9OX1RZUEVfRU5EUE9JTlQgPSAiZW5kcG9pbnQiOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGFuYWx5emVyIGNvbmZpZy4KLSAgICogQHBhcmFtIG1lc3NhZ2VMaXN0IGEgTWVzc2FnZUxpc3Qgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChNZXNzYWdlTGlzdCBtZXNzYWdlTGlzdCk7Ci0KLSAgLyoqCi0gICAqIEdldCBvcHRpb25hbCBkZXNjcmlwdGlvbi4KLSAgICogQHJldHVybiBvcHRpb25hbCBkZXNjcmlwdGlvbi4KLSAgICogQHNlZSAjc2V0RGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAvKioKLSAgICogU2V0IG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgKiBAc2VlICNnZXREZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKTsKLQotICAvKioKLSAgICogR2V0IHZlcmJvc2Ugb3B0aW9uLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdmVyYm9zZS4KLSAgICogQHNlZSAjc2V0VmVyYm9zZU9wdGlvbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0VmVyYm9zZU9wdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgdmVyYm9zZSBvcHRpb24uCi0gICAqIEBwYXJhbSB2ZXJib3NlIHZlcmJvc2Ugb3B0aW9uLgotICAgKiBAc2VlICNnZXRWZXJib3NlT3B0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlT3B0aW9uKGJvb2xlYW4gdmVyYm9zZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBhc3NlcnRpb24gcmVzdWx0cyBvcHRpb24uCi0gICAqIEByZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uLgotICAgKiBAc2VlICNzZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBnZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBhc3NlcnRpb24gcmVzdWx0cyBvcHRpb24uCi0gICAqIEBwYXJhbSBhc3NlcnRpb25SZXN1bHRzT3B0aW9uICBhc3NlcnRpb24gcmVzdWx0cyBvcHRpb24uCi0gICAqIEBzZWUgI2dldEFzc2VydGlvblJlc3VsdHNPcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFzc2VydGlvblJlc3VsdHNPcHRpb24oQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBhc3NlcnRpb25SZXN1bHRzT3B0aW9uKTsKLQotICAvKioKLSAgICogR2V0IHJlcGxhY2UgcmVwb3J0IGZpbGUgb3B0aW9uLgotICAgKiBAcmV0dXJuIHJlcGxhY2UgcmVwb3J0IGZpbGUgb3B0aW9uLgotICAgKiBAc2VlICNzZXRSZXBsYWNlUmVwb3J0Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRSZXBsYWNlUmVwb3J0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCByZXBsYWNlIHJlcG9ydCBmaWxlIG9wdGlvbi4KLSAgICogQHBhcmFtIHJlcGxhY2VSZXBvcnQgIGVwbGFjZSByZXBvcnQgZmlsZSBvcHRpb24uCi0gICAqIEBzZWUgI2dldFJlcGxhY2VSZXBvcnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcGxhY2VSZXBvcnQoYm9vbGVhbiByZXBsYWNlUmVwb3J0KTsKLQotICAvKioKLSAgICogR2V0IHJlcG9ydCBmaWxlIGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIHJlcG9ydCBmaWxlIGxvY2F0aW9uLgotICAgKiBAc2VlICNzZXRSZXBvcnRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXBvcnRMb2NhdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgcmVwbGFjZSByZXBvcnQgZmlsZSBvcHRpb24uCi0gICAqIEBwYXJhbSByZXBvcnRVUkkgcmVwb3J0IGxvY2F0aW9uLgotICAgKiBAc2VlICNnZXRSZXBvcnRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVwb3J0TG9jYXRpb24oU3RyaW5nIHJlcG9ydFVSSSk7Ci0KLSAgLyoqCi0gICAqIEdldCBzdHlsZSBzaGVldC4KLSAgICogQHJldHVybiBzdHlsZSBzaGVldC4KLSAgICogQHNlZSAjc2V0QWRkU3R5bGVTaGVldAotICAgKi8KLSAgcHVibGljIEFkZFN0eWxlU2hlZXQgZ2V0QWRkU3R5bGVTaGVldCgpOwotCi0gIC8qKgotICAgKiBTZXQgc3R5bGUgc2hlZXQuCi0gICAqIEBwYXJhbSBhZGRTdHlsZVNoZWV0IGEgc3R5bGUgc2hlZXQuCi0gICAqIEBzZWUgI2dldEFkZFN0eWxlU2hlZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFkZFN0eWxlU2hlZXQoQWRkU3R5bGVTaGVldCBhZGRTdHlsZVNoZWV0KTsKLQotICAvKioKLSAgICogR2V0IHByb2ZpbGUgdGVzdCBhc3NlcnRpb25zIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIHJvZmlsZSB0ZXN0IGFzc2VydGlvbnMgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqIEBzZWUgI3NldFRlc3RBc3NlcnRpb25zRG9jdW1lbnRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXN0QXNzZXJ0aW9uc0RvY3VtZW50TG9jYXRpb24oKTsKLQotICAvKioKLSAgICogU2V0IHByb2ZpbGUgdGVzdCBhc3NlcnRpb25zIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAcGFyYW0gdGVzdEFzc2VydGlvbnNEb2N1bWVudFVSSSBwcm9maWxlIHRlc3QgYXNzZXJ0aW9ucyBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHNlZSAjZ2V0VGVzdEFzc2VydGlvbnNEb2N1bWVudExvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUZXN0QXNzZXJ0aW9uc0RvY3VtZW50TG9jYXRpb24oU3RyaW5nIHRlc3RBc3NlcnRpb25zRG9jdW1lbnRVUkkpOwotCi0gIC8qKgotICAgKiBHZXQgbWVzYWdlIGxvZyBsb2NhdGlvbi4KLSAgICogQHJldHVybiBtZXNhZ2UgbG9nIGxvY2F0aW9uLgotICAgKiBAc2VlICNzZXRMb2dMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2dMb2NhdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgbWVzc2FnZSBsb2cgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBsb2dVUkkgbWVzc2FnZSBsb2cgbG9jYXRpb24uCi0gICAqIEBzZWUgI2dldExvZ0xvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2dMb2NhdGlvbihTdHJpbmcgbG9nVVJJKTsKLQotICAvKioKLSAgICogSXMgbWVzc2FnZSBsb2cgbG9jYXRpb24gc3BlY2lmaWVkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgbWVzc2FnZSBsb2cgbG9jYXRpb24gaXMgc2V0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMb2dTZXQoKTsKLQotICAvKioKLSAgICogR2V0IGNvcnJlbGF0aW9uIHR5cGUuCi0gICAqIEByZXR1cm4gY29ycmVsYXRpb24gdHlwZS4KLSAgICogQHNlZSAjc2V0Q29ycmVsYXRpb25UeXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvcnJlbGF0aW9uVHlwZSgpOwotCi0gIC8qKgotICAgKiBTZXQgY29ycmVsYXRpb24gdHlwZS4KLSAgICogQHBhcmFtIGNvcnJlbGF0aW9uVHlwZSBjb3JyZWxhdGlvbiB0eXBlLgotICAgKiBAc2VlICNnZXRDb3JyZWxhdGlvblR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvcnJlbGF0aW9uVHlwZShTdHJpbmcgY29ycmVsYXRpb25UeXBlKTsKLQotICAvKioKLSAgICogSXMgV1NETCByZWZlcmVuY2Ugc2V0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgV1NETCByZWZlcmVuY2UgaXMgc2V0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXU0RMUmVmZXJlbmNlU2V0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIHJlZmVyZW5jZS4KLSAgICogQHJldHVybiBXU0RMIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0V1NETFJlZmVyZW5jZQotICAgKi8KLSAgcHVibGljIFdTRExSZWZlcmVuY2UgZ2V0V1NETFJlZmVyZW5jZSgpOwotCi0gIC8qKgotICAgKiBTZXQgV1NETCByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSB3c2RsUmVmZXJlbmNlIFdTREwgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRXU0RMUmVmZXJlbmNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXU0RMUmVmZXJlbmNlKFdTRExSZWZlcmVuY2Ugd3NkbFJlZmVyZW5jZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gV1NETCBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIFdTREwgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdTRExMb2NhdGlvbigpOwotCi0gIC8qKgotICAgKiBHZXQgc2VydmljZSBsb2NhdGlvbi4KLSAgICogQHJldHVybiBzZXJ2aWNlIGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTG9jYXRpb24oKTsKLQotICAvKioKLSAgICogSXMgVURESSByZWZlcmVuY2Ugc2V0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgVURESSByZWZlcmVuY2UgaXMgc2V0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVRERJUmVmZXJlbmNlU2V0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCBVRERJIHJlZmVyZW5jZS4KLSAgICogQHJldHVybiBVRERJIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0VURESVJlZmVyZW5jZQotICAgKi8KLSAgcHVibGljIFVERElSZWZlcmVuY2UgZ2V0VURESVJlZmVyZW5jZSgpOwotCi0gIC8qKgotICAgKiBTZXQgVURESSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSB1ZGRpUmVmZXJlbmNlIFVEREkgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRVRERJUmVmZXJlbmNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVRERJUmVmZXJlbmNlKFVERElSZWZlcmVuY2UgdWRkaVJlZmVyZW5jZSk7Ci0KLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgKiBAcGFyYW0gYXJncyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICogQHBhcmFtIHZhbGlkYXRlIGZsYWcgZm9yIGNvbW1hbmQgbGluZSB2YWxpZGF0aW9uLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBwYXJzaW5nIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VBcmdzKFN0cmluZ1tdIGFyZ3MsIGJvb2xlYW4gdmFsaWRhdGUpIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9BbmFseXplckNvbmZpZ1JlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9BbmFseXplckNvbmZpZ1JlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTIwMTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvQW5hbHl6ZXJDb25maWdSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlTGlzdDsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0KLS8qKgotICogRGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgdG8gcmVhZCB0aGUgYW5hbHl6ZXIgY29uZmlnIGRvY3VtZW50cy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFuYWx5emVyQ29uZmlnUmVhZGVyIGV4dGVuZHMgRG9jdW1lbnRSZWFkZXIgewotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGFuYWx5emVyIGNvbmZpZyByZWFkZXIuCi0gICAqIEBwYXJhbSBtZXNzYWdlTGlzdCBhIE1lc3NhZ2VMaXN0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoTWVzc2FnZUxpc3QgbWVzc2FnZUxpc3QpOwotICAKLSAgLyoqCi0gICAqIFJlYWQgdGhlIGFuYWx5emVyIGNvbmZpZyBmaWxlLgotICAgKiBAcGFyYW0gYW5hbHl6ZXJDb25maWdVUkkgdGhlIGFuYWx5emVyIGNvbmZpZyBmaWxlIGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBBbmFseXplckNvbmZpZyBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHVuYWJsZSB0byByZWFkIHRoZSBhbmFseXplciBjb25maWcgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBBbmFseXplckNvbmZpZyByZWFkQW5hbHl6ZXJDb25maWcoU3RyaW5nIGFuYWx5emVyQ29uZmlnVVJJKSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotICAKLSAgLyoqCi0gICAqIFJlYWQgdGhlIGFuYWx5emVyIGNvbmZpZyBmaWxlLgotICAgKiBAcGFyYW0gcmVhZGVyIGEgUmVhZGVyIG9iamVjdC4KLSAgICogQHJldHVybiB0aGUgQW5hbHl6ZXJDb25maWcgb2JqZWN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gcGFyc2UgdGhlIGFuYWx5emVyIGNvbmZpZyBmaWxlLgotICAgKi8KLSAgcHVibGljIEFuYWx5emVyQ29uZmlnIHJlYWRBbmFseXplckNvbmZpZyhSZWFkZXIgcmVhZGVyKSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvQXNzZXJ0aW9uUmVzdWx0VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9Bc3NlcnRpb25SZXN1bHRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMGM5ZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9Bc3NlcnRpb25SZXN1bHRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotCi0vKioKLSAqIFRlc3QgYXNzZXJ0aW9uIHJlc3VsdCB0eXBlLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydGlvblJlc3VsdFR5cGUKLXsKLSAgLyoqCi0gICAqIFRoaXMgdHlwZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlc3VsdFR5cGUgPSBfQUxMOwotCi0gIC8qKgotICAgKiBTdHJpbmcgdmVyc2lvbiBvZiByZXN1bHQgdHlwZXMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0FMTCA9ICJhbGwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX05PVF9JTkZPID0gIm5vdEluZm8iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX09OTFlfRkFJTEVEID0gIm9ubHlGYWlsZWQiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX05PVF9QQVNTRUQgPSAibm90UGFzc2VkIjsKLQotICAvKioKLSAgICogUmVzdWx0IHR5cGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBBc3NlcnRpb25SZXN1bHRUeXBlIEFMTCA9IG5ldyBBc3NlcnRpb25SZXN1bHRUeXBlKF9BTEwpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEFzc2VydGlvblJlc3VsdFR5cGUgTk9UX0lORk8gPSBuZXcgQXNzZXJ0aW9uUmVzdWx0VHlwZShfTk9UX0lORk8pOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEFzc2VydGlvblJlc3VsdFR5cGUgT05MWV9GQUlMRUQgPQotICAgIG5ldyBBc3NlcnRpb25SZXN1bHRUeXBlKF9PTkxZX0ZBSUxFRCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQXNzZXJ0aW9uUmVzdWx0VHlwZSBOT1RfUEFTU0VEID0KLSAgICBuZXcgQXNzZXJ0aW9uUmVzdWx0VHlwZShfTk9UX1BBU1NFRCk7Ci0KLSAgLyoqCi0gICAqIERvIG5vdCBhbGxvdyB0aGlzIG9iamVjdCB0byBiZSBjcmVhdGVkIHdpdGggbnVsbCBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByaXZhdGUgQXNzZXJ0aW9uUmVzdWx0VHlwZSgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgcmVzdWx0IHR5cGUuCi0gICAqIEBwYXJhbSByZXN1bHRUeXBlIGEgcmVzdWx0IHR5cGUuCi0gICAqLwotICBwcml2YXRlIEFzc2VydGlvblJlc3VsdFR5cGUoU3RyaW5nIHJlc3VsdFR5cGUpCi0gIHsKLSAgICB0aGlzLnJlc3VsdFR5cGUgPSByZXN1bHRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHJlc3VsdCB0eXBlIGFsbC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXN1bHQgdHlwZSBpcyBhbGwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0FsbCgpCi0gIHsKLSAgICByZXR1cm4gcmVzdWx0VHlwZS5lcXVhbHMoX0FMTCk7Ci0gIH0KLQotICAvKioKLSAgICogSXMgcmVzdWx0IHR5cGUgZmFpbGVkIG9ubHkuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgZmFpbGVkIG9ubHkuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ZhaWxlZE9ubHkoKQotICB7Ci0gICAgcmV0dXJuIHJlc3VsdFR5cGUuZXF1YWxzKF9PTkxZX0ZBSUxFRCk7Ci0gIH0KLQotICAvKioKLSAgICogSXMgcmVzdWx0IHR5cGUgbm90IHBhc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXN1bHQgdHlwZSBpcyBub3QgcGFzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNOb3RQYXNzZWQoKQotICB7Ci0gICAgcmV0dXJuIHJlc3VsdFR5cGUuZXF1YWxzKF9OT1RfUEFTU0VEKTsKLSAgfQotCi0gIC8qKgotICAgKiBJcyByZXN1bHQgdHlwZSBub3QgaW5mby4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXN1bHQgdHlwZSBpcyBub3QgaW5mby4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTm90SW5mbygpCi0gIHsKLSAgICByZXR1cm4gcmVzdWx0VHlwZS5lcXVhbHMoX05PVF9JTkZPKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcmVzdWx0IHR5cGUuCi0gICAqIEByZXR1cm4gcmVzdWx0IHR5cGUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHJlc3VsdFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIG5ldyBhc3NlcnRpb24gcmVzdWx0IHR5cGUuCi0gICAqIEBwYXJhbSByZXN1bHRUeXBlIGFuIGFzc2VydGlvbiByZXN1bHQgdHlwZS4KLSAgICogQHJldHVybiBuZXcgYXNzZXJ0aW9uIHJlc3VsdCB0eXBlLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBpbnZhbGlkIGFzc2VydGlvbiByZXN1bHQgdHlwZSB3YXMgc3BlY2lmaWVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBBc3NlcnRpb25SZXN1bHRUeXBlIG5ld0luc3RhbmNlKFN0cmluZyByZXN1bHRUeXBlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIEFzc2VydGlvblJlc3VsdFR5cGUgYXNzZXJ0aW9uUmVzdWx0VHlwZSA9IG51bGw7Ci0KLSAgICBpZiAocmVzdWx0VHlwZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGFzc2VydGlvblJlc3VsdFR5cGUgPSBOT1RfSU5GTzsKLSAgICB9Ci0KLSAgICBlbHNlIGlmIChyZXN1bHRUeXBlLmVxdWFscyhfQUxMKSkKLSAgICB7Ci0gICAgICBhc3NlcnRpb25SZXN1bHRUeXBlID0gQUxMOwotICAgIH0KLQotICAgIGVsc2UgaWYgKHJlc3VsdFR5cGUuZXF1YWxzKF9PTkxZX0ZBSUxFRCkpCi0gICAgewotICAgICAgYXNzZXJ0aW9uUmVzdWx0VHlwZSA9IE9OTFlfRkFJTEVEOwotICAgIH0KLQotICAgIGVsc2UgaWYgKHJlc3VsdFR5cGUuZXF1YWxzKF9OT1RfUEFTU0VEKSkKLSAgICB7Ci0gICAgICBhc3NlcnRpb25SZXN1bHRUeXBlID0gTk9UX1BBU1NFRDsKLSAgICB9Ci0gICAgZWxzZSBpZiAocmVzdWx0VHlwZS5lcXVhbHMoX05PVF9JTkZPKSkKLSAgICB7Ci0gICAgICBhc3NlcnRpb25SZXN1bHRUeXBlID0gTk9UX0lORk87Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgICJBbiBpbnZhbGlkIGFzc2VydGlvbiByZXN1bHQgdHlwZSB3YXMgc3BlY2lmaWVkOiAiICsgcmVzdWx0VHlwZSArICIuIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFzc2VydGlvblJlc3VsdFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiByZXN1bHRUeXBlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL0Fzc2VydGlvblJlc3VsdHNPcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvQXNzZXJ0aW9uUmVzdWx0c09wdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGVkNTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvQXNzZXJ0aW9uUmVzdWx0c09wdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGEgZGVmaW5pdGlvbiBvZiB0aGUgYXNzZXJ0aW9uIHJlc3VsdHMgdGhhdCAKLSAqIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LiAgSXQgYWxzbyBjb250YWlucyBpbmZvcm1hdGlvbiAKLSAqIHRoYXQgaW5kaWNhdGVzIHdoaWNoIG1lc3NhZ2VzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICogR2V0IGFzc2VydGlvbiByZXN1bHQgdHlwZS4KLSAgICogQHJldHVybiBhc3NlcnRpb24gcmVzdWx0IHR5cGUuCi0gICAqIEBzZWUgI3NldEFzc2VydGlvblJlc3VsdFR5cGUKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHRUeXBlIGdldEFzc2VydGlvblJlc3VsdFR5cGUoKTsKLQotICAvKioKLSAgICogU2V0IGFzc2VydGlvbiByZXN1bHQgdHlwZS4KLSAgICogQHBhcmFtIHJlc3VsdFR5cGUgYXNzZXJ0aW9uIHJlc3VsdCB0eXBlLgotICAgKiBAc2VlICNnZXRBc3NlcnRpb25SZXN1bHRUeXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBc3NlcnRpb25SZXN1bHRUeXBlKEFzc2VydGlvblJlc3VsdFR5cGUgcmVzdWx0VHlwZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBzaG93IG1lc3NhZ2UgZW50cnkgaW5kaWNhdG9yLgotICAgKiBAcmV0dXJuIHNob3cgbWVzc2FnZSBlbnRyeSBpbmRpY2F0b3IuCi0gICAqIEBzZWUgI3NldFNob3dNZXNzYWdlRW50cnkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dNZXNzYWdlRW50cnkoKTsKLQotICAvKioKLSAgICogU2V0IHNob3cgbWVzc2FnZSBlbnRyeSBpbmRpY3Rvci4KLSAgICogQHBhcmFtIHNob3dNZXNzYWdlRW50cnkgc2hvdyBtZXNzYWdlIGVudHJ5IGluZGljdG9yLgotICAgKiBAc2VlICNnZXRTaG93TWVzc2FnZUVudHJ5Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93TWVzc2FnZUVudHJ5KGJvb2xlYW4gc2hvd01lc3NhZ2VFbnRyeSk7Ci0KLSAgLyoqCi0gICAqIEdldCBzaG93IGFzc2VydGlvbiBkZXNjcmlwdGlvbiBpbmRpY2F0b3IuCi0gICAqIEByZXR1cm4gc2hvdyBhc3NlcnRpb24gZGVzY3JpcHRpb24gaW5kaWNhdG9yLgotICAgKiBAc2VlICNzZXRTaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dBc3NlcnRpb25EZXNjcmlwdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgc2hvdyBhc3NlcnRpb24gZGVzY3JpcHRpb24gaW5kaWN0b3IuCi0gICAqIEBwYXJhbSBzaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24gc2hvdyBhc3NlcnRpb24gZGVzY3JpcHRpb24gaW5kaWN0b3IuCi0gICAqIEBzZWUgI2dldFNob3dBc3NlcnRpb25EZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uKGJvb2xlYW4gc2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uKTsKLQotICAvKioKLSAgICogR2V0IHNob3cgZmFpbHVyZSBtZXNzYWdlIGluZGljYXRvci4KLSAgICogQHJldHVybiBzaG93IGZhaWx1cmUgbWVzc2FnZSBpbmRpY2F0b3IuCi0gICAqIEBzZWUgI3NldFNob3dGYWlsdXJlTWVzc2FnZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd0ZhaWx1cmVNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBzaG93IGZhaWx1cmUgbWVzc2FnZSBpbmRpY2F0b3IuCi0gICAqIEBwYXJhbSBzaG93RmFpbHVyZU1lc3NhZ2Ugc2hvdyBmYWlsdXJlIG1lc3NhZ2UgaW5kaWNhdG9yLgotICAgKiBAc2VlICNnZXRTaG93RmFpbHVyZU1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dGYWlsdXJlTWVzc2FnZShib29sZWFuIHNob3dGYWlsdXJlTWVzc2FnZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBzaG93IGVycm9yIGRldGFpbCBpbmRpY2F0b3IuCi0gICAqIEByZXR1cm4gc2hvdyBlcnJvciBkZXRhaWwgaW5kaWNhdG9yLgotICAgKiBAc2VlICNzZXRTaG93RmFpbHVyZURldGFpbAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd0ZhaWx1cmVEZXRhaWwoKTsKLQotICAvKioKLSAgICogU2V0IHNob3cgZXJyb3IgZGV0YWlsIGluZGljYXRvci4KLSAgICogQHBhcmFtIHNob3dmYWlsdXJlRGV0YWlsIHNob3cgZXJyb3IgZGV0YWlsIGluZGljYXRvci4KLSAgICogQHNlZSAjZ2V0U2hvd0ZhaWx1cmVEZXRhaWwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dGYWlsdXJlRGV0YWlsKGJvb2xlYW4gc2hvd2ZhaWx1cmVEZXRhaWwpOwotCi0gIC8qKgotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKiBAcmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvVURESVJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9VRERJUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDljYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9VRERJUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByZWZlcmVuY2UgdG8gYSBkaXNjb3ZlcnkgYXJ0aWZhY3QuICAKLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBVRERJUmVmZXJlbmNlIGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9VRERJX1JFRkVSRU5DRTsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfQU5BTFlaRVJfQ09ORklHLCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBVRERJIGtleSB0eXBlOiBiaW5kaW5nS2V5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19LRVkgPSAiYmluZGluZ0tleSI7Ci0KLSAgLyoqCi0gICAqIFVEREkga2V5IHR5cGU6IHRNb2RlbEtleS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRNT0RFTF9LRVkgPSAidE1vZGVsS2V5IjsKLQotICAvKioKLSAgICogR2V0IFVEREkgIGtleSB0eXBlLgotICAgKiBAcmV0dXJuIFVEREkgIGtleSB0eXBlLgotICAgKiBAc2VlICNzZXRLZXlUeXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEtleVR5cGUoKTsKLQotICAvKioKLSAgICogU2V0IFVEREkga2V5IHR5cGUuCi0gICAqIEBwYXJhbSBrZXlUeXBlIFVEREkga2V5IHR5cGUuCi0gICAqIEBzZWUgI2dldEtleVR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEtleVR5cGUoU3RyaW5nIGtleVR5cGUpOwotCi0gIC8qKgotICAgKiBHZXQgVURESSBrZXkuCi0gICAqIEByZXR1cm4gVURESSBrZXkuCi0gICAqIEBzZWUgI3NldEtleQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRLZXkoKTsKLQotICAvKioKLSAgICogU2V0IFVEREkga2V5LgotICAgKiBAcGFyYW0ga2V5IFVEREkga2V5LgotICAgKiBAc2VlICNnZXRLZXkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KTsKLQotICAvKioKLSAgICogR2V0IFVEREkgaW5xdWlyeSBVUkwuCi0gICAqIEByZXR1cm4gVURESSBpbnF1aXJ5IFVSTC4KLSAgICogQHNlZSAjc2V0SW5xdWlyeVVSTAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBVRERJIGlucXVpcnlVUkwuCi0gICAqIEBwYXJhbSBpbnF1aXJ5VVJMIFVEREkgaW5xdWlyeVVSTC4KLSAgICogQHNlZSAjZ2V0SW5xdWlyeVVSTAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5xdWlyeVVSTChTdHJpbmcgaW5xdWlyeVVSTCk7Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gV1NETCBlbGVtZW50LgotICAgKiBAc2VlICNzZXRXU0RMRWxlbWVudAotICAgKi8KLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB3c2RsRWxlbWVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBzZWUgI2dldFdTRExFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXU0RMRWxlbWVudChXU0RMRWxlbWVudCB3c2RsRWxlbWVudCk7Ci0KLSAgLyoqCi0gICAqIEdldCBzZXJ2aWNlIGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIHNlcnZpY2UgbG9jYXRpb24uCi0gICAqIEBzZWUgI3NldFNlcnZpY2VMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTG9jYXRpb24oKTsKLQotICAvKioKLSAgICogU2V0IHNlcnZpY2UgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBzZXJ2aWNlTG9jYXRpb24gc2VydmljZSBsb2NhdGlvbi4KLSAgICogQHNlZSAjZ2V0U2VydmljZUxvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTG9jYXRpb24oU3RyaW5nIHNlcnZpY2VMb2NhdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL1dTRExFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL1dTRExFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDg3MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9XU0RMRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoZSBiYXNlIGludGVyZmFjZSBmb3IgV1NETCBkZWZpbml0aW9ucy4gCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETEVsZW1lbnQgZXh0ZW5kcyBEb2N1bWVudEVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIEVsZW1lbnQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTkFNRSA9IFdTSUNvbnN0YW50cy5FTEVNX1dTRExfRUxFTUVOVDsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfQU5BTFlaRVJfQ09ORklHLCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBHZXQgV1NETCBlbGVtZW50IHR5cGUuCi0gICAqIEByZXR1cm4gV1NETCBlbGVtZW50IHR5cGUuCi0gICAqIEBzZWUgI3NldFR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotCi0gIC8qKgotICAgKiBTZXQgV1NETCBlbGVtZW50IHR5cGUuCi0gICAqIEBwYXJhbSB0eXBlIFdTREwgZWxlbWVudCB0eXBlLgotICAgKiBAc2VlICNnZXRUeXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKTsKLQotICAvKioKLSAgICogR2V0IFdTREwgZWxlbWVudCBuYW1lc3BhY2UuCi0gICAqIEByZXR1cm4gV1NETCBlbGVtZW50IG5hbWVzcGFjZS4KLSAgICogQHNlZSAjc2V0TmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCi0gIC8qKgotICAgKiBTZXQgV1NETCBlbGVtZW50IG5hbWVzcGFjZS4KLSAgICogQHBhcmFtIG5hbWVzcGFjZSBXU0RMIGVsZW1lbnQgbmFtZXNwYWNlLgotICAgKiBAc2VlICNnZXROYW1lc3BhY2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKTsKLQotICAvKioKLSAgICogR2V0IFdTREwgZWxlbWVudCBuYW1lLgotICAgKiBAcmV0dXJuIFdTREwgZWxlbWVudCBuYW1lLgotICAgKiBAc2VlICNzZXROYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0IFdTREwgZWxlbWVudCBuYW1lLgotICAgKiBAcGFyYW0gbmFtZSBXU0RMIGVsZW1lbnQgbmFtZS4KLSAgICogQHNlZSAjZ2V0TmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIGVsZW1lbnQgcXVhbGlmaWVkIG5hbWUuCi0gICAqIEByZXR1cm4gV1NETCBlbGVtZW50IHF1YWxpZmllZCBuYW1lLgotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldFFOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIHBhcmVudCBlbGVtZW50IG5hbWUuCi0gICAqIEByZXR1cm4gV1NETCBwYXJlbnQgZWxlbWVudCBuYW1lLgotICAgKiBAc2VlICNzZXRQYXJlbnRFbGVtZW50TmFtZQotICAgKiAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50RWxlbWVudE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0IFdTREwgcGFyZW50IGVsZW1lbnQgbmFtZS4KLSAgICogQHBhcmFtIHBhcmVudEVsZW1lbnROYW1lIFdTREwgcGFyZW50IGVsZW1lbnQgbmFtZS4KLSAgICogQHNlZSAjZ2V0UGFyZW50RWxlbWVudE5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBhcmVudEVsZW1lbnROYW1lKFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIHBhcmVudCBlbGVtZW50IFFOYW1lLgotICAgKiBAcmV0dXJuIFdTREwgcGFyZW50IGVsZW1lbnQgUU5hbWUuCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0UGFyZW50RWxlbWVudFFOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIElzIHBvcnQgZWxlbWVudC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIGEgcG9ydC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUG9ydCgpOwotCi0gIC8qKgotICAgKiBJcyBiaW5kaW5nIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGVtZW50IGlzIGEgYmluZGluZy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQmluZGluZygpOwotCi0gIC8qKgotICAgKiBJcyBwb3J0VHlwZSBlbGVtZW50LgotICAgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCBpcyBhIHBvcnQgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUG9ydFR5cGUoKTsKLQotICAvKioKLSAgICogSXMgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBhbiBvcGVyYXRpb24uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc09wZXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBJcyBtZXNzYWdlIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBlbGVtZW50IGlzIGEgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTWVzc2FnZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9XU0RMUmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL1dTRExSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmM2RjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL1dTRExSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmVmZXJlbmNlIHRvIGEgZGVzY3JpcHRpb24gYXJ0aWZhY3QuICAKLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMUmVmZXJlbmNlIGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9XU0RMX1JFRkVSRU5DRTsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfQU5BTFlaRVJfQ09ORklHLCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBHZXQgV1NETCBlbGVtZW50LgotICAgKiBAcmV0dXJuIFdTREwgZWxlbWVudC4KLSAgICogQHNlZSAjc2V0V1NETEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBTZXQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gd3NkbEVsZW1lbnQgV1NETCBlbGVtZW50LgotICAgKiBAc2VlICNnZXRXU0RMRWxlbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V1NETEVsZW1lbnQoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBHZXQgV1NETCBsb2NhdGlvbi4KLSAgICogQHJldHVybiBXU0RMIGxvY2F0aW9uLgotICAgKiBAc2VlICNzZXRXU0RMTG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETExvY2F0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBXU0RMIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gd3NkbExvY2F0aW9uIFdTREwgbG9jYXRpb24uCi0gICAqIEBzZWUgI2dldFdTRExMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V1NETExvY2F0aW9uKFN0cmluZyB3c2RsTG9jYXRpb24pOwotCi0gIC8qKgotICAgKiBHZXQgc2VydmljZSBsb2NhdGlvbi4KLSAgICogQHJldHVybiBzZXJ2aWNlIGxvY2F0aW9uLgotICAgKiBAc2VlICNzZXRTZXJ2aWNlTG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUxvY2F0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBzZXJ2aWNlIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gc2VydmljZUxvY2F0aW9uIHNlcnZpY2UgbG9jYXRpb24uCi0gICAqIEBzZWUgI2dldFNlcnZpY2VMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUxvY2F0aW9uKFN0cmluZyBzZXJ2aWNlTG9jYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9pbXBsL0FuYWx5emVyQ29uZmlnSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9pbXBsL0FuYWx5emVyQ29uZmlnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzFjZWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9BbmFseXplckNvbmZpZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5BbmFseXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQW5hbHl6ZXJDb25maWdSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5Bc3NlcnRpb25SZXN1bHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQXNzZXJ0aW9uUmVzdWx0c09wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLlVERElSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5BZGRTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uaW1wbC5BZGRTdHlsZVNoZWV0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGFuYWx5emVyIGNvbmZpZ3VyYXRpb24gZmlsZSBpbnRlcmZhY2UuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIEFuYWx5emVyQ29uZmlnSW1wbCBpbXBsZW1lbnRzIEFuYWx5emVyQ29uZmlnCi17Ci0gIC8qKgotICAgKiBNZXNzYWdlIGxpc3QgcmVmZXJlbmNlLgotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2VMaXN0IG1lc3NhZ2VMaXN0ID0gbnVsbDsKLQotICAvKioKLSAgICogQW5hbHl6ZXIgY29uZmlndXJhdGlvbiBmaWxlIFVSSS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgY29uZmlnVVJJID0gbnVsbDsKLQotICAvKioKLSAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogVmVyYm9zZSBvcHRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIEFzc2VydGlvbiByZXN1bHRzIG9wdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGFzc2VydGlvblJlc3VsdHNPcHRpb24gPQotICAgIG5ldyBBc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbCgpOwotCi0gIC8qKgotICAgKiBSZXBvcnQgbG9jYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlcG9ydFVSSSA9IFdTSUNvbnN0YW50cy5ERUZBVUxUX1JFUE9SVF9VUkk7Ci0KLSAgLyoqCi0gICAqIFJlcGxhY2UgcmVwb3J0IGluZGljYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHJlcGxhY2VSZXBvcnQgPSBmYWxzZTsKLQotICAvKioKLSAgICogQWRkIHN0eWxlIHNoZWV0LgotICAgKi8KLSAgcHJvdGVjdGVkIEFkZFN0eWxlU2hlZXQgYWRkU3R5bGVTaGVldDsKLQotICAvKioKLSAgICogUHJvZmlsZSB0ZXN0IGFzc2VydGlvbnMgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHRlc3RBc3NlcnRpb25zRG9jdW1lbnRVUkkgPQotICAgIFdTSUNvbnN0YW50cy5ERUZBVUxUX1RFU1RfQVNTRVJUSU9OU19ET0NVTUVOVF9VUkk7Ci0KLSAgLyoqCi0gICAqIE1lc3NhZ2UgbG9nIGxvY2F0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsb2dVUkkgPSBudWxsOwotCi0gIC8qKgotICAgKiBNZXNzYWdlIGNvcnJlbGF0aW9uIHR5cGUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNvcnJlbGF0aW9uVHlwZSA9Ci0gICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfQ09SUkVMQVRJT05fVFlQRV9PUEVSQVRJT047Ci0KLSAgLyoqCi0gICAqIFdTREwgcmVmZXJlbmNlLgotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExSZWZlcmVuY2Ugd3NkbFJlZmVyZW5jZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFVEREkgcmVmZXJlbmNlLgotICAgKi8KLSAgcHJvdGVjdGVkIFVERElSZWZlcmVuY2UgdWRkaVJlZmVyZW5jZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgQW5hbHl6ZXJDb25maWdJbXBsKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIHdpdGggYWxsIHNldHRpbmdzLgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gICAqIEBwYXJhbSB2ZXJib3NlICAgICAgICAgICAgICAgICAgICB0aGUgdmVyYm9zZSBvcHRpb24uCi0gICAqIEBwYXJhbSBhc3NlcnRpb25SZXN1bHRzT3B0aW9uICAgICBhbiBhc3NlcnRpb24gcmVzdWx0cyBvcHRpb24uCi0gICAqIEBwYXJhbSByZXBvcnRVUkkgICAgICAgICAgICAgICAgICByZXBvcnQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSByZXBsYWNlUmVwb3J0ICAgICAgICAgICAgICBhIHJlcGxhY2UgcmVwb3J0IGluZGljYXRvci4KLSAgICogQHBhcmFtIGFkZFN0eWxlU2hlZXQgICAgICAgICAgICAgIGFkZCBzdHlsZSBzaGVldC4KLSAgICogQHBhcmFtIHRlc3RBc3NlcnRpb25zRG9jdW1lbnRVUkkgIHByb2ZpbGUgdGVzdCBhc3NlcnRpb25zIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAcGFyYW0gbG9nVVJJICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSBsb2cgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBjb3JyZWxhdGlvblR5cGUgICAgICAgICAgICBtZXNzYWdlIGNvcnJlbGF0aW9uIHR5cGUuCi0gICAqIEBwYXJhbSB3c2RsUmVmZXJlbmNlICAgICAgICAgICAgICBhIFdTREwgcmVmZXJlbmNlLi4KLSAgICogQHBhcmFtIHVkZGlSZWZlcmVuY2UgICAgICAgICAgICAgIGEgVVVEREkgcmVmZXJlbmNlLgotICAgKi8KLSAgcHVibGljIEFuYWx5emVyQ29uZmlnSW1wbCgKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24sCi0gICAgYm9vbGVhbiB2ZXJib3NlLAotICAgIEFzc2VydGlvblJlc3VsdHNPcHRpb24gYXNzZXJ0aW9uUmVzdWx0c09wdGlvbiwKLSAgICBTdHJpbmcgcmVwb3J0VVJJLAotICAgIGJvb2xlYW4gcmVwbGFjZVJlcG9ydCwKLSAgICBBZGRTdHlsZVNoZWV0IGFkZFN0eWxlU2hlZXQsCi0gICAgU3RyaW5nIHRlc3RBc3NlcnRpb25zRG9jdW1lbnRVUkksCi0gICAgU3RyaW5nIGxvZ1VSSSwKLSAgICBTdHJpbmcgY29ycmVsYXRpb25UeXBlLAotICAgIFdTRExSZWZlcmVuY2Ugd3NkbFJlZmVyZW5jZSwKLSAgICBVRERJUmVmZXJlbmNlIHVkZGlSZWZlcmVuY2UpCi0gIHsKLSAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKLSAgICB0aGlzLmFzc2VydGlvblJlc3VsdHNPcHRpb24gPSBhc3NlcnRpb25SZXN1bHRzT3B0aW9uOwotICAgIHRoaXMucmVwb3J0VVJJID0gcmVwb3J0VVJJOwotICAgIHRoaXMucmVwbGFjZVJlcG9ydCA9IHJlcGxhY2VSZXBvcnQ7Ci0gICAgdGhpcy5hZGRTdHlsZVNoZWV0ID0gYWRkU3R5bGVTaGVldDsKLSAgICB0aGlzLnRlc3RBc3NlcnRpb25zRG9jdW1lbnRVUkkgPSB0ZXN0QXNzZXJ0aW9uc0RvY3VtZW50VVJJOwotICAgIHRoaXMubG9nVVJJID0gbG9nVVJJOwotICAgIHRoaXMuY29ycmVsYXRpb25UeXBlID0gY29ycmVsYXRpb25UeXBlOwotICAgIHRoaXMud3NkbFJlZmVyZW5jZSA9IHdzZGxSZWZlcmVuY2U7Ci0gICAgdGhpcy51ZGRpUmVmZXJlbmNlID0gdWRkaVJlZmVyZW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGFuYWx5emVyIGNvbmZpZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoTWVzc2FnZUxpc3QgbWVzc2FnZUxpc3QpCi0gIHsKLSAgICB0aGlzLm1lc3NhZ2VMaXN0ID0gbWVzc2FnZUxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgKiBAc2VlICNzZXREZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gICAqIEBzZWUgI2dldERlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSAjc2V0VmVyYm9zZU9wdGlvbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0VmVyYm9zZU9wdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy52ZXJib3NlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgI2dldFZlcmJvc2VPcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZlcmJvc2VPcHRpb24oYm9vbGVhbiB2ZXJib3NlKQotICB7Ci0gICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uLgotICAgKiBAc2VlICNzZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBnZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLmFzc2VydGlvblJlc3VsdHNPcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGFzc2VydGlvbiByZXN1bHRzIG9wdGlvbi4KLSAgICogQHNlZSAjZ2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbihBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGFzc2VydGlvblJlc3VsdHNPcHRpb24pCi0gIHsKLSAgICB0aGlzLmFzc2VydGlvblJlc3VsdHNPcHRpb24gPSBhc3NlcnRpb25SZXN1bHRzT3B0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgI3NldFJlcG9ydExvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlcG9ydExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLnJlcG9ydFVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlICNnZXRSZXBvcnRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVwb3J0TG9jYXRpb24oU3RyaW5nIHJlcG9ydFVSSSkKLSAgewotICAgIHRoaXMucmVwb3J0VVJJID0gcmVwb3J0VVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCByZXBsYWNlIHJlcG9ydCBmaWxlIG9wdGlvbi4KLSAgICogQHNlZSAjc2V0UmVwbGFjZVJlcG9ydAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0UmVwbGFjZVJlcG9ydCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5yZXBsYWNlUmVwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCByZXBvcnQgZmlsZSBsb2NhdGlvbi4KLSAgICogQHNlZSAjZ2V0UmVwbGFjZVJlcG9ydAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVwbGFjZVJlcG9ydChib29sZWFuIHJlcGxhY2VSZXBvcnQpCi0gIHsKLSAgICB0aGlzLnJlcGxhY2VSZXBvcnQgPSByZXBsYWNlUmVwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhZGQgc3R5bGUgc2hlZXQuCi0gICAqIEBzZWUgI3NldEFkZFN0eWxlU2hlZXQKLSAgICovCi0gIHB1YmxpYyBBZGRTdHlsZVNoZWV0IGdldEFkZFN0eWxlU2hlZXQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuYWRkU3R5bGVTaGVldDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgcmVwbGFjZSByZXBvcnQgZmlsZSBvcHRpb24uCi0gICAqIEBzZWUgI2dldEFkZFN0eWxlU2hlZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFkZFN0eWxlU2hlZXQoQWRkU3R5bGVTaGVldCBhZGRTdHlsZVNoZWV0KQotICB7Ci0gICAgdGhpcy5hZGRTdHlsZVNoZWV0ID0gYWRkU3R5bGVTaGVldDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlICNzZXRUZXN0QXNzZXJ0aW9uRG9jdW1lbnRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXN0QXNzZXJ0aW9uc0RvY3VtZW50TG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMudGVzdEFzc2VydGlvbnNEb2N1bWVudFVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlICNnZXRUZXN0QXNzZXJ0aW9uRG9jdW1lbnRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGVzdEFzc2VydGlvbnNEb2N1bWVudExvY2F0aW9uKFN0cmluZyB0ZXN0QXNzZXJ0aW9uc0RvY3VtZW50VVJJKQotICB7Ci0gICAgdGhpcy50ZXN0QXNzZXJ0aW9uc0RvY3VtZW50VVJJID0gdGVzdEFzc2VydGlvbnNEb2N1bWVudFVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlICNzZXRMb2dMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2dMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbG9nVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgI2dldExvZ0xvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2dMb2NhdGlvbihTdHJpbmcgbG9nVVJJKQotICB7Ci0gICAgdGhpcy5sb2dVUkkgPSBsb2dVUkk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0xvZ1NldCgpCi0gIHsKLSAgICByZXR1cm4gKGxvZ1VSSSAhPSBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgY29ycmVsYXRpb24gdHlwZS4KLSAgICogQHNlZSAjc2V0Q29ycmVsYXRpb25UeXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvcnJlbGF0aW9uVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5jb3JyZWxhdGlvblR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGNvcnJlbGF0aW9uIHR5cGUuCi0gICAqIEBzZWUgI2dldENvcnJlbGF0aW9uVHlwZQotICAgKiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvcnJlbGF0aW9uVHlwZShTdHJpbmcgY29ycmVsYXRpb25UeXBlKQotICB7Ci0gICAgdGhpcy5jb3JyZWxhdGlvblR5cGUgPSBjb3JyZWxhdGlvblR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogSXMgV1NETCByZWZlcmVuY2Ugc2V0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXU0RMUmVmZXJlbmNlU2V0KCkKLSAgewotICAgIHJldHVybiAodGhpcy53c2RsUmVmZXJlbmNlID09IG51bGwgPyBmYWxzZSA6IHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0V1NETFJlZmVyZW5jZQotICAgKi8KLSAgcHVibGljIFdTRExSZWZlcmVuY2UgZ2V0V1NETFJlZmVyZW5jZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy53c2RsUmVmZXJlbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBXU0RMIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0V1NETFJlZmVyZW5jZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V1NETFJlZmVyZW5jZShXU0RMUmVmZXJlbmNlIHdzZGxSZWZlcmVuY2UpCi0gIHsKLSAgICB0aGlzLndzZGxSZWZlcmVuY2UgPSB3c2RsUmVmZXJlbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIGVsZW1lbnQuCi0gICAqIAotICAgKi8KLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiAodGhpcy53c2RsUmVmZXJlbmNlID09IG51bGwpCi0gICAgICA/IG51bGwKLSAgICAgIDogdGhpcy53c2RsUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHNlcnZpY2UgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKHRoaXMud3NkbFJlZmVyZW5jZSA9PSBudWxsKQotICAgICAgPyBudWxsCi0gICAgICA6IHRoaXMud3NkbFJlZmVyZW5jZS5nZXRTZXJ2aWNlTG9jYXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQW5hbHl6ZXJDb25maWcjZ2V0V1NETExvY2F0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiAodGhpcy53c2RsUmVmZXJlbmNlID09IG51bGwpCi0gICAgICA/IG51bGwKLSAgICAgIDogdGhpcy53c2RsUmVmZXJlbmNlLmdldFdTRExMb2NhdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmFuYWx5emVyLmNvbmZpZy5BbmFseXplckNvbmZpZyNpc1VkZGlSZWZlcmVuY2VTZXQpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VERElSZWZlcmVuY2VTZXQoKQotICB7Ci0gICAgcmV0dXJuICh0aGlzLnVkZGlSZWZlcmVuY2UgPT0gbnVsbCA/IGZhbHNlIDogdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IFVEREkgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRVRERJUmVmZXJlbmNlCi0gICAqLwotICBwdWJsaWMgVURESVJlZmVyZW5jZSBnZXRVRERJUmVmZXJlbmNlKCkKLSAgewotICAgIHJldHVybiB0aGlzLnVkZGlSZWZlcmVuY2U7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IFVEREkgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRVRERJUmVmZXJlbmNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVRERJUmVmZXJlbmNlKFVERElSZWZlcmVuY2UgdWRkaVJlZmVyZW5jZSkKLSAgewotICAgIHRoaXMudWRkaVJlZmVyZW5jZSA9IHVkZGlSZWZlcmVuY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSAjc2V0TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGNvbmZpZ1VSSTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIGdldExvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgY29uZmlnVVJJKQotICB7Ci0gICAgdGhpcy5jb25maWdVUkkgPSBjb25maWdVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuV1NJRG9jdW1lbnQjdG9YTUxTdHJpbmcoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gU3RhcnQgZWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0KLSAgICAvLyBWZXJib3NlIG9wdGlvbgotICAgIHB3LnByaW50KCIgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1ZFUkJPU0UgKyAiPiIpOwotICAgIHB3LnByaW50KGdldFZlcmJvc2VPcHRpb24oKSk7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fVkVSQk9TRSArICI+Iik7Ci0KLSAgICAvLyBHZXQgYXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uCi0gICAgcHcucHJpbnQoYXNzZXJ0aW9uUmVzdWx0c09wdGlvbi50b1hNTFN0cmluZyhuc05hbWUpKTsKLQotICAgIC8vIHJlcG9ydCBmaWxlCi0gICAgcHcucHJpbnQoIiAgICAgICAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9SRVBPUlRfRklMRSArICIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfUkVQTEFDRSArICI9XCIiICsgZ2V0UmVwbGFjZVJlcG9ydCgpICsgIlwiICIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICBXU0lDb25zdGFudHMuQVRUUl9MT0NBVElPTiArICI9XCIiICsgZ2V0UmVwb3J0TG9jYXRpb24oKSArICJcIj4iKTsKLSAgICBwdy5wcmludChnZXRBZGRTdHlsZVNoZWV0KCkudG9YTUxTdHJpbmcobmFtZXNwYWNlTmFtZSkpOwotICAgIHB3LnByaW50bG4oIiAgICAgICAgPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fUkVQT1JUX0ZJTEUgKyAiPiIpOwotCi0gICAgLy8gdGVzdCBhc3NlcnRpb24gZmlsZQotICAgIHB3LnByaW50KAotICAgICAgIiAgICAgICAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9URVNUX0FTU0VSVElPTlNfRklMRSArICI+Iik7Ci0gICAgcHcucHJpbnQoZ2V0VGVzdEFzc2VydGlvbnNEb2N1bWVudExvY2F0aW9uKCkpOwotICAgIHB3LnByaW50bG4oIjwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1RFU1RfQVNTRVJUSU9OU19GSUxFICsgIj4iKTsKLQotICAgIC8vIGxvZyBmaWxlCi0gICAgcHcucHJpbnQoIiAgICAgICAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9MT0dfRklMRSk7Ci0gICAgcHcucHJpbnQoCi0gICAgICAiICIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuQVRUUl9DT1JSRUxBVElPTl9UWVBFCi0gICAgICAgICsgIj1cIiIKLSAgICAgICAgKyB0aGlzLmNvcnJlbGF0aW9uVHlwZQotICAgICAgICArICJcIj4iKTsKLSAgICBwdy5wcmludChnZXRMb2dMb2NhdGlvbigpKTsKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9MT0dfRklMRSArICI+Iik7Ci0KLSAgICAvLyBXU0RMIHJlZmVyZW5jZSAKLSAgICBpZiAodGhpcy53c2RsUmVmZXJlbmNlICE9IG51bGwpCi0gICAgewotICAgICAgcHcucHJpbnQoZ2V0V1NETFJlZmVyZW5jZSgpLnRvWE1MU3RyaW5nKG5zTmFtZSkpOwotICAgIH0KLQotICAgIC8vIFVEREkgUmVmZXJlbmNlCi0gICAgaWYgKHRoaXMudWRkaVJlZmVyZW5jZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50KGdldFVERElSZWZlcmVuY2UoKS50b1hNTFN0cmluZyhuc05hbWUpKTsKLSAgICB9Ci0KLSAgICAvLyBFbmQgZWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICA8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIC8vIHZlcmJvc2Ugb3B0aW9uCi0gICAgcHcucHJpbnRsbigiICB2ZXJib3NlIC4uLi4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLnZlcmJvc2UpOwotCi0gICAgLy8gYXNzZXJ0aW9uUmVzdWx0cyBvcHRpb25zCi0gICAgcHcucHJpbnQodGhpcy5hc3NlcnRpb25SZXN1bHRzT3B0aW9uLnRvU3RyaW5nKCkpOwotCi0gICAgLy8gcmVwb3J0RmlsZSBvcHRpb25zCi0gICAgcHcucHJpbnRsbigiICBSZXBvcnQgRmlsZToiKTsKLSAgICBwdy5wcmludGxuKCIgICAgcmVwbGFjZSAuLi4uLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMucmVwbGFjZVJlcG9ydCk7Ci0gICAgcHcucHJpbnRsbigiICAgIGxvY2F0aW9uIC4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLnJlcG9ydFVSSSk7Ci0gICAgaWYgKHRoaXMuYWRkU3R5bGVTaGVldCAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50bG4oIiAgICBTdHlsZSBTaGVldDoiKTsKLSAgICAgIGlmICh0aGlzLmFkZFN0eWxlU2hlZXQuZ2V0SHJlZigpICE9IG51bGwpCi0gICAgICAgIHB3LnByaW50bG4oCi0gICAgICAgICAgIiAgICAgIGhyZWYgLi4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5hZGRTdHlsZVNoZWV0LmdldEhyZWYoKSk7Ci0gICAgICBpZiAodGhpcy5hZGRTdHlsZVNoZWV0LmdldFR5cGUoKSAhPSBudWxsKQotICAgICAgICBwdy5wcmludGxuKAotICAgICAgICAgICIgICAgICB0eXBlIC4uLi4uLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMuYWRkU3R5bGVTaGVldC5nZXRUeXBlKCkpOwotICAgICAgaWYgKHRoaXMuYWRkU3R5bGVTaGVldC5nZXRUaXRsZSgpICE9IG51bGwpCi0gICAgICAgIHB3LnByaW50bG4oCi0gICAgICAgICAgIiAgICAgIHRpdGxlIC4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5hZGRTdHlsZVNoZWV0LmdldFRpdGxlKCkpOwotICAgICAgaWYgKHRoaXMuYWRkU3R5bGVTaGVldC5nZXRNZWRpYSgpICE9IG51bGwpCi0gICAgICAgIHB3LnByaW50bG4oCi0gICAgICAgICAgIiAgICAgIG1lZGlhIC4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5hZGRTdHlsZVNoZWV0LmdldE1lZGlhKCkpOwotICAgICAgaWYgKHRoaXMuYWRkU3R5bGVTaGVldC5nZXRDaGFyc2V0KCkgIT0gbnVsbCkKLSAgICAgICAgcHcucHJpbnRsbigKLSAgICAgICAgICAiICAgICAgY2hhcnNldCAuLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLmFkZFN0eWxlU2hlZXQuZ2V0Q2hhcnNldCgpKTsKLSAgICAgIGlmICh0aGlzLmFkZFN0eWxlU2hlZXQuZ2V0QWx0ZXJuYXRlKCkgIT0gbnVsbCkKLSAgICAgICAgcHcucHJpbnRsbigKLSAgICAgICAgICAiICAgICAgYWx0ZXJuYXRlIC4uLi4uLi4uLi4uLi4uICIKLSAgICAgICAgICAgICsgdGhpcy5hZGRTdHlsZVNoZWV0LmdldEFsdGVybmF0ZSgpKTsKLSAgICB9Ci0KLSAgICAvLyB0ZXN0QXNzZXJ0aW9uc0ZpbGUgcGFyYW1ldGVyCi0gICAgcHcucHJpbnRsbigKLSAgICAgICIgIHRlc3RBc3NlcnRpb25zRmlsZSAuLi4uLi4uLi4gIiArIHRoaXMudGVzdEFzc2VydGlvbnNEb2N1bWVudFVSSSk7Ci0KLSAgICAvLyBsb2dGaWxlIG9wdGlvbnMKLSAgICBpZiAodGhpcy5sb2dVUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwdy5wcmludGxuKCIgIE1lc3NhZ2UgTG9nIEZpbGU6Iik7Ci0gICAgICBwdy5wcmludGxuKCIgICAgbG9jYXRpb24gLi4uLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMubG9nVVJJKTsKLSAgICAgIHB3LnByaW50bG4oIiAgICBjb3JyZWxhdGlvblR5cGUgLi4uLi4uLi4uLiAiICsgdGhpcy5jb3JyZWxhdGlvblR5cGUpOwotICAgIH0KLQotICAgIC8vIHdzZGxSZWZlcmVuY2Ugb3B0aW9ucyAgIAotICAgIGlmICh0aGlzLmlzV1NETFJlZmVyZW5jZVNldCgpKQotICAgIHsKLSAgICAgIHB3LnByaW50KHRoaXMud3NkbFJlZmVyZW5jZS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvLyB1ZGRpUmVmZXJlbmNlIG9wdGlvbnMKLSAgICBpZiAodGhpcy5pc1VERElSZWZlcmVuY2VTZXQoKSkKLSAgICB7Ci0gICAgICBwdy5wcmludCh0aGlzLnVkZGlSZWZlcmVuY2UudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLy8gZGVzY3JpcHRpb24gcGFyYW1ldGVyCi0gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwdy5wcmludGxuKCIgIGRlc2NyaXB0aW9uIC4uLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMuZGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBjb25maWcgdmFsdWVzIGZyb20gYW5vdGhlciBhbmFseXplciBjb25maWcgb2JqZWN0LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldENvbmZpZyhBbmFseXplckNvbmZpZyBhbmFseXplckNvbmZpZykKLSAgewotICAgIHRoaXMuY29uZmlnVVJJID0gYW5hbHl6ZXJDb25maWcuZ2V0TG9jYXRpb24oKTsKLSAgICB0aGlzLmRlc2NyaXB0aW9uID0gYW5hbHl6ZXJDb25maWcuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB0aGlzLnZlcmJvc2UgPSBhbmFseXplckNvbmZpZy5nZXRWZXJib3NlT3B0aW9uKCk7Ci0gICAgdGhpcy5hc3NlcnRpb25SZXN1bHRzT3B0aW9uID0gYW5hbHl6ZXJDb25maWcuZ2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbigpOwotICAgIHRoaXMucmVwb3J0VVJJID0gYW5hbHl6ZXJDb25maWcuZ2V0UmVwb3J0TG9jYXRpb24oKTsKLSAgICB0aGlzLnJlcGxhY2VSZXBvcnQgPSBhbmFseXplckNvbmZpZy5nZXRSZXBsYWNlUmVwb3J0KCk7Ci0gICAgdGhpcy5sb2dVUkkgPSBhbmFseXplckNvbmZpZy5nZXRMb2dMb2NhdGlvbigpOwotICAgIHRoaXMuY29ycmVsYXRpb25UeXBlID0gYW5hbHl6ZXJDb25maWcuZ2V0Q29ycmVsYXRpb25UeXBlKCk7Ci0gICAgdGhpcy50ZXN0QXNzZXJ0aW9uc0RvY3VtZW50VVJJID0KLSAgICAgIGFuYWx5emVyQ29uZmlnLmdldFRlc3RBc3NlcnRpb25zRG9jdW1lbnRMb2NhdGlvbigpOwotICAgIHRoaXMuYWRkU3R5bGVTaGVldCA9IGFuYWx5emVyQ29uZmlnLmdldEFkZFN0eWxlU2hlZXQoKTsKLSAgICB0aGlzLndzZGxSZWZlcmVuY2UgPSBhbmFseXplckNvbmZpZy5nZXRXU0RMUmVmZXJlbmNlKCk7Ci0gICAgdGhpcy51ZGRpUmVmZXJlbmNlID0gYW5hbHl6ZXJDb25maWcuZ2V0VURESVJlZmVyZW5jZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZUFyZ3MoU3RyaW5nW10gYXJncywgYm9vbGVhbiB2YWxpZGF0ZSkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgV1NETFJlZmVyZW5jZSB3c2RsUmVmZXJlbmNlID0gbnVsbDsKLSAgICBVRERJUmVmZXJlbmNlIHVkZGlSZWZlcmVuY2UgPSBudWxsOwotCi0gICAgLy8gR2V0IG5ldyBjb25maWcgcmVhZGVyCi0gICAgQW5hbHl6ZXJDb25maWdSZWFkZXIgYW5hbHl6ZXJDb25maWdSZWFkZXIgPSBuZXcgQW5hbHl6ZXJDb25maWdSZWFkZXJJbXBsKCk7Ci0gICAgYW5hbHl6ZXJDb25maWdSZWFkZXIuaW5pdCh0aGlzLm1lc3NhZ2VMaXN0KTsKLQotICAgIC8vIEFuYWx5emVyIGNvbmZpZyBvYmplY3Qgd2hpY2ggd2lsbCBiZSBtZXJnZWQgYWZ0ZXIgYWxsIG9mIHRoZSBpbnB1dCBwYXJtcyBhcmUgcHJvY2Vzc2VkCi0gICAgQW5hbHl6ZXJDb25maWcgYW5hbHl6ZXJDb25maWdGcm9tQXJncyA9IG51bGw7Ci0KLSAgICAvLyBBc3NlcnRpb24gcmVzdWx0cyBvcHRpb24KLSAgICBBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGFzc2VydGlvblJlc3VsdHNPcHRpb24gPSBudWxsOwotCi0gICAgLy8gSWYgbm8gaW5wdXQgYXJndW1lbnRzLCB0aGVuIHRocm93IGV4Y2VwdGlvbgotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIC8vIEFERDogCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKCJ1c2FnZTAxIiwgQW5hbHl6ZXIuVVNBR0VfTUVTU0FHRSkpOwotICAgIH0KLQotICAgIC8vIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGxvY2F0ZSB0aGUgY29uZmlnIGZpbGUgb3B0aW9uIChpZiBpdCB3YXMgc3BlY2lmaWVkKQotICAgIGZvciAoaW50IGFyZ0NvdW50ID0gMDsgYXJnQ291bnQgPCBhcmdzLmxlbmd0aDsgYXJnQ291bnQrKykKLSAgICB7Ci0gICAgICAvLyAtY29uZmlnCi0gICAgICBpZiAoKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1jb25maWciKSkKLSAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLWMiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIGFuYWx5emVyQ29uZmlnRnJvbUFyZ3MgPQotICAgICAgICAgIGFuYWx5emVyQ29uZmlnUmVhZGVyLnJlYWRBbmFseXplckNvbmZpZygKLSAgICAgICAgICAgIGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50KSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgY29uZmlnIGZpbGUgd2FzIG5vdCBzcGVjaWZpZWQsIHRoZW4gY3JlYXRlIGFuYWx5emVyIGNvbmZpZyBvYmplY3QKLSAgICBpZiAoYW5hbHl6ZXJDb25maWdGcm9tQXJncyA9PSBudWxsKQotICAgIHsKLSAgICAgIGFuYWx5emVyQ29uZmlnRnJvbUFyZ3MgPSBuZXcgQW5hbHl6ZXJDb25maWdJbXBsKCk7Ci0gICAgICBhbmFseXplckNvbmZpZ0Zyb21BcmdzLmluaXQodGhpcy5tZXNzYWdlTGlzdCk7Ci0gICAgfQotCi0gICAgLy8gR2V0IGFzc2VydGlvbiByZXN1bHRzIG9wdGlvbgotICAgIGlmICgoYXNzZXJ0aW9uUmVzdWx0c09wdGlvbiA9Ci0gICAgICBhbmFseXplckNvbmZpZ0Zyb21BcmdzLmdldEFzc2VydGlvblJlc3VsdHNPcHRpb24oKSkKLSAgICAgID09IG51bGwpCi0gICAgewotICAgICAgYXNzZXJ0aW9uUmVzdWx0c09wdGlvbiA9IG5ldyBBc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbCgpOwotICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5zZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKGFzc2VydGlvblJlc3VsdHNPcHRpb24pOwotICAgIH0KLQotICAgIC8vIFBhcnNlIGFsbCBvZiB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotICAgIGZvciAoaW50IGFyZ0NvdW50ID0gMDsgYXJnQ291bnQgPCBhcmdzLmxlbmd0aDsgYXJnQ291bnQrKykKLSAgICB7Ci0gICAgICAvLyAtY29uZmlnCi0gICAgICBpZiAoKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1jb25maWciKSkKLSAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLWMiKSkpCi0gICAgICB7Ci0gICAgICAgIC8vIFNraXAgdGhpcyBvcHRpb24gc2luY2UgaXQgd2FzIGFscmVhZHkgcHJvY2Vzc2VkCi0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC12ZXJib3NlCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi12ZXJib3NlIikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLXYiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIGFuYWx5emVyQ29uZmlnRnJvbUFyZ3Muc2V0VmVyYm9zZU9wdGlvbigKLSAgICAgICAgICBCb29sZWFuLnZhbHVlT2YoZ2V0T3B0aW9uVmFsdWUoYXJncywgYXJnQ291bnQpKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC1hc3NlcnRpb25SZXN1bHRzCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1hc3NlcnRpb25SZXN1bHRzIikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLWEiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIGFzc2VydGlvblJlc3VsdHNPcHRpb24uc2V0QXNzZXJ0aW9uUmVzdWx0VHlwZSgKLSAgICAgICAgICBBc3NlcnRpb25SZXN1bHRUeXBlLm5ld0luc3RhbmNlKGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50KSkpOwotICAgICAgfQotCi0gICAgICAvLyAtbWVzc2FnZUVudHJ5Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1tZXNzYWdlRW50cnkiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItTSIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgYXNzZXJ0aW9uUmVzdWx0c09wdGlvbi5zZXRTaG93TWVzc2FnZUVudHJ5KAotICAgICAgICAgIEJvb2xlYW4udmFsdWVPZihnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCkpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gLWFzc2VydGlvbkRlc2NyaXB0aW9uCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1hc3NlcnRpb25EZXNjcmlwdGlvbiIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1BIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBhc3NlcnRpb25SZXN1bHRzT3B0aW9uLnNldFNob3dBc3NlcnRpb25EZXNjcmlwdGlvbigKLSAgICAgICAgICBCb29sZWFuLnZhbHVlT2YoYXJnc1thcmdDb3VudF0pLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gLWZhaWx1cmVNZXNzYWdlCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1mYWlsdXJlTWVzc2FnZSIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1GIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBhc3NlcnRpb25SZXN1bHRzT3B0aW9uLnNldFNob3dGYWlsdXJlTWVzc2FnZSgKLSAgICAgICAgICBCb29sZWFuLnZhbHVlT2YoZ2V0T3B0aW9uVmFsdWUoYXJncywgYXJnQ291bnQpKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC1mYWlsdXJlRGV0YWlsCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1mYWlsdXJlRGV0YWlsIikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLUQiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIGFzc2VydGlvblJlc3VsdHNPcHRpb24uc2V0U2hvd0ZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgQm9vbGVhbi52YWx1ZU9mKGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50KSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgfQotCi0gICAgICAvLyAtbG9nRmlsZQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItbG9nRmlsZSIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1sIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBhbmFseXplckNvbmZpZ0Zyb21BcmdzLnNldExvZ0xvY2F0aW9uKGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC10ZXN0QXNzZXJ0aW9uRmlsZQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItdGVzdEFzc2VydGlvbkZpbGUiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItdCIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5zZXRUZXN0QXNzZXJ0aW9uc0RvY3VtZW50TG9jYXRpb24oCi0gICAgICAgICAgZ2V0T3B0aW9uVmFsdWUoYXJncywgYXJnQ291bnQpKTsKLSAgICAgIH0KLQotICAgICAgLy8gLXJlcG9ydEZpbGUKLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLXJlcG9ydEZpbGUiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItciIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5zZXRSZXBvcnRMb2NhdGlvbigKLSAgICAgICAgICBnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCkpOwotICAgICAgfQotCi0gICAgICAvLyAtcmVwbGFjZQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItcmVwbGFjZSIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1SIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBhbmFseXplckNvbmZpZ0Zyb21BcmdzLnNldFJlcGxhY2VSZXBvcnQoCi0gICAgICAgICAgQm9vbGVhbi52YWx1ZU9mKGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50KSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgfQotCi0gICAgICAvLyAtY29ycmVsYXRpb25UeXBlCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1jb3JyZWxhdGlvblR5cGUiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItQyIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5zZXRDb3JyZWxhdGlvblR5cGUoCi0gICAgICAgICAgZ2V0T3B0aW9uVmFsdWUoYXJncywgYXJnQ291bnQpKTsKLSAgICAgIH0KLQotICAgICAgLy8gLXdzZGxFbGVtZW50Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi13c2RsRWxlbWVudCIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1XIikpKQotICAgICAgewotICAgICAgICBTdHJpbmcgb3B0aW9uTmFtZSA9IGFyZ3NbYXJnQ291bnRdOwotICAgICAgICBhcmdDb3VudCsrOwotCi0gICAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gbmV3IFdTRExFbGVtZW50SW1wbCgpOwotICAgICAgICB3c2RsRWxlbWVudC5zZXROYW1lKGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50LCBvcHRpb25OYW1lKSk7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIHdzZGxFbGVtZW50LnNldFR5cGUoZ2V0T3B0aW9uVmFsdWUoYXJncywgYXJnQ291bnQsIG9wdGlvbk5hbWUpKTsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgd3NkbEVsZW1lbnQuc2V0TmFtZXNwYWNlKGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50LCBvcHRpb25OYW1lKSk7Ci0gICAgICAgIGlmICghYXJnc1thcmdDb3VudF0uc3RhcnRzV2l0aCgiLSIpKQotICAgICAgICB7Ci0gICAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgICB3c2RsRWxlbWVudC5zZXRQYXJlbnRFbGVtZW50TmFtZSgKLSAgICAgICAgICAgIGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50LCBvcHRpb25OYW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod3NkbFJlZmVyZW5jZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgd3NkbFJlZmVyZW5jZS5zZXRXU0RMRWxlbWVudCh3c2RsRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodWRkaVJlZmVyZW5jZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdWRkaVJlZmVyZW5jZS5zZXRXU0RMRWxlbWVudCh3c2RsRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICJjb25maWcxMCIsCi0gICAgICAgICAgICAgICJUaGUgLXdzZGxFbGVtZW50IG9wdGlvbiBtdXN0IGFwcGVhciBhZnRlciB0aGUgLXdzZGxVUkkgb3IgLXVkZGlLZXkgb3B0aW9ucy4iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhbmFseXplckNvbmZpZ0Zyb21BcmdzLnNldFdTRExSZWZlcmVuY2Uod3NkbFJlZmVyZW5jZSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC1zZXJ2aWNlTG9jYXRpb24KLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLXNlcnZpY2VMb2NhdGlvbiIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1TIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotCi0gICAgICAgIGlmICh3c2RsUmVmZXJlbmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB3c2RsUmVmZXJlbmNlLnNldFNlcnZpY2VMb2NhdGlvbihnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHVkZGlSZWZlcmVuY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHVkZGlSZWZlcmVuY2Uuc2V0U2VydmljZUxvY2F0aW9uKGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50KSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICJjb25maWcxMSIsCi0gICAgICAgICAgICAgICJUaGUgLXNlcnZpY2VMb2NhdGlvbiBvcHRpb24gbXVzdCBhcHBlYXIgYWZ0ZXIgdGhlIC13c2RsVVJJIG9yIC11ZGRpS2V5IG9wdGlvbnMuIikpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIC13c2RsVVJJCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi13c2RsVVJJIikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLVciKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIGlmICh3c2RsUmVmZXJlbmNlID09IG51bGwpCi0gICAgICAgICAgd3NkbFJlZmVyZW5jZSA9IG5ldyBXU0RMUmVmZXJlbmNlSW1wbCgpOwotICAgICAgICB3c2RsUmVmZXJlbmNlLnNldFdTRExMb2NhdGlvbihnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCkpOwotICAgICAgICBhbmFseXplckNvbmZpZ0Zyb21BcmdzLnNldFdTRExSZWZlcmVuY2Uod3NkbFJlZmVyZW5jZSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC11ZGRpS2V5VHlwZQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItdWRkaUtleVR5cGUiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItSyIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgaWYgKHVkZGlSZWZlcmVuY2UgPT0gbnVsbCkKLSAgICAgICAgICB1ZGRpUmVmZXJlbmNlID0gbmV3IFVERElSZWZlcmVuY2VJbXBsKCk7Ci0gICAgICAgIHVkZGlSZWZlcmVuY2Uuc2V0S2V5VHlwZShnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCkpOwotICAgICAgICBhbmFseXplckNvbmZpZ0Zyb21BcmdzLnNldFVERElSZWZlcmVuY2UodWRkaVJlZmVyZW5jZSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC11ZGRpS2V5Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi11ZGRpS2V5IikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLWsiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIGlmICh1ZGRpUmVmZXJlbmNlID09IG51bGwpCi0gICAgICAgICAgdWRkaVJlZmVyZW5jZSA9IG5ldyBVRERJUmVmZXJlbmNlSW1wbCgpOwotICAgICAgICB1ZGRpUmVmZXJlbmNlLnNldEtleShnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCkpOwotICAgICAgICBhbmFseXplckNvbmZpZ0Zyb21BcmdzLnNldFVERElSZWZlcmVuY2UodWRkaVJlZmVyZW5jZSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC1pbnF1aXJ5VVJMCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1pbnF1aXJ5VVJMIikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLWkiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIGlmICh1ZGRpUmVmZXJlbmNlID09IG51bGwpCi0gICAgICAgICAgdWRkaVJlZmVyZW5jZSA9IG5ldyBVRERJUmVmZXJlbmNlSW1wbCgpOwotICAgICAgICB1ZGRpUmVmZXJlbmNlLnNldElucXVpcnlVUkwoZ2V0T3B0aW9uVmFsdWUoYXJncywgYXJnQ291bnQpKTsKLSAgICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5zZXRVRERJUmVmZXJlbmNlKHVkZGlSZWZlcmVuY2UpOwotICAgICAgfQotCi0gICAgICAvLyBBREQ6IE5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIG90aGVyIG9wdGlvbnMgKC1jb25maWcsIC1iaW5kaW5nLCBldGMuKQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgICAiY29uZmlnMTIiLAotICAgICAgICAgICAgYXJnc1thcmdDb3VudF0sCi0gICAgICAgICAgICAiVGhlIHNwZWNpZmllZCBvcHRpb24gaXMgbm90IHN1cHBvcnRlZDoiKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgYWRkU3R5bGVTaGVldCB3YXMgbm90IHNwZWNpZmllZCwgdGhlbiBjcmVhdGUgYSBjb21tZW50IHZlcnNpb24gb2YgaXQKLSAgICBpZiAoYW5hbHl6ZXJDb25maWdGcm9tQXJncy5nZXRBZGRTdHlsZVNoZWV0KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBBZGRTdHlsZVNoZWV0IGFkZFN0eWxlU2hlZXQgPSBuZXcgQWRkU3R5bGVTaGVldEltcGwoKTsKLSAgICAgIGFkZFN0eWxlU2hlZXQuc2V0SHJlZihXU0lDb25zdGFudHMuREVGQVVMVF9SRVBPUlRfWFNMKTsKLSAgICAgIGFkZFN0eWxlU2hlZXQuc2V0VHlwZShXU0lDb25zdGFudHMuREVGQVVMVF9YU0xfVFlQRSk7Ci0gICAgICBhZGRTdHlsZVNoZWV0LnNldENvbW1lbnQodHJ1ZSk7Ci0gICAgICBhbmFseXplckNvbmZpZ0Zyb21BcmdzLnNldEFkZFN0eWxlU2hlZXQoYWRkU3R5bGVTaGVldCk7Ci0gICAgfQotCi0gICAgLy8gTWVyZ2UgY29uZmlnIGluZm8gaW50byB0aGlzIG9iamVjdAotICAgIHNldENvbmZpZyhhbmFseXplckNvbmZpZ0Zyb21BcmdzKTsKLQotICAgIGlmICh2YWxpZGF0ZSkKLSAgICB7ICAKLSAgICAgIC8vIFZlcmlmeSB0aGF0IGFsbCByZXF1aXJlZCBvcHRpb25zIHdlcmUgc3BlY2lmaWVkIGFuZCAKLSAgICAgIC8vIHRoYXQgdGhlIHNwZWNpZmllZCBvbmVzIHdlcmUgY29ycmVjdAotICAgICAgY2hlY2tDb25maWdPcHRpb25zKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFZlcmlmeSBjb25maWcgb3B0aW9ucy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja0NvbmZpZ09wdGlvbnMoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZmlsZUxvY2F0aW9uOwotCi0gICAgLy8gSWYgd3NkbFJlZmVyZW5jZSBhbmQgdWRkaVJlZmVyZW5jZSBzcGVjaWZpZWQsIHRoZW4gdGhyb3cgZXhjZXB0aW9uCi0gICAgaWYgKCh0aGlzLmlzV1NETFJlZmVyZW5jZVNldCgpKSAmJiAodGhpcy5pc1VERElSZWZlcmVuY2VTZXQoKSkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMDQiLAotICAgICAgICAgICJDYW4gbm90IHNwZWNpZnkgYm90aCB0aGUgV1NETCByZWZlcmVuY2UgYW5kIFVEREkgcmVmZXJlbmNlIG9wdGlvbnMiKSk7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgdGVzdCBhc3NlcnRpb24gZmlsZSBleGlzdHMKLSAgICBpZiAoKGZpbGVMb2NhdGlvbiA9IHRoaXMuZ2V0VGVzdEFzc2VydGlvbnNEb2N1bWVudExvY2F0aW9uKCkpID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMTYiLAotICAgICAgICAgICJUZXN0IGFzc2VydGlvbiBkb2N1bWVudCBsb2NhdGlvbiBtdXN0IGJlIHNwZWNpZmllZC4iKSk7Ci0gICAgfQotCi0gICAgZWxzZSBpZiAoIVV0aWxzLmZpbGVFeGlzdHMoZmlsZUxvY2F0aW9uKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcxNCIsCi0gICAgICAgICAgZmlsZUxvY2F0aW9uLAotICAgICAgICAgICJDb3VsZCBub3QgZmluZCB0ZXN0IGFzc2VydGlvbiBkb2N1bWVudC4gIFNwZWNpZmllZCBmaWxlIGxvY2F0aW9uOiIpKTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBpZiBsb2cgZmlsZSBleGlzdHMKLSAgICBpZiAoKGZpbGVMb2NhdGlvbiA9IHRoaXMuZ2V0TG9nTG9jYXRpb24oKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoIVV0aWxzLmZpbGVFeGlzdHMoZmlsZUxvY2F0aW9uKSkKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICBtZXNzYWdlTGlzdC5nZXRNZXNzYWdlKAotICAgICAgICAgICAgImNvbmZpZzAyIiwKLSAgICAgICAgICAgIGZpbGVMb2NhdGlvbiwKLSAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBsb2cgZmlsZToiKSk7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgV1NETCBmaWxlIGV4aXN0cwotICAgIGlmICgodGhpcy5nZXRXU0RMUmVmZXJlbmNlKCkgIT0gbnVsbCkKLSAgICAgICYmIChmaWxlTG9jYXRpb24gPSB0aGlzLmdldFdTRExSZWZlcmVuY2UoKS5nZXRXU0RMTG9jYXRpb24oKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoIVV0aWxzLmZpbGVFeGlzdHMoZmlsZUxvY2F0aW9uKSkKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICBtZXNzYWdlTGlzdC5nZXRNZXNzYWdlKAotICAgICAgICAgICAgImNvbmZpZzAzIiwKLSAgICAgICAgICAgIGZpbGVMb2NhdGlvbiwKLSAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBXU0RMIGZpbGU6IikpOwotICAgIH0KLQotICAgIEZpbGUgZmlsZSA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0IGZpbGUgb2JqZWN0IGZvciByZXBvcnQgZmlsZQotICAgICAgZmlsZSA9IG5ldyBGaWxlKHRoaXMuZ2V0UmVwb3J0TG9jYXRpb24oKSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzE3IiwKLSAgICAgICAgICAiQ291bGQgbm90IGdldCByZXBvcnQgZmlsZSBsb2NhdGlvbi4iKSk7Ci0gICAgfQotCi0gICAgLy8gSWYgcmVwbGFjZSBmbGFnIGlzIGZhbHNlIGFuZCBmaWxlIGV4aXN0cywgdGhlbiB0aHJvdyBleGNlcHRpb24KLSAgICBpZiAoZmlsZS5leGlzdHMoKSAmJiAhdGhpcy5nZXRSZXBsYWNlUmVwb3J0KCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMTUiLAotICAgICAgICAgICJSZXBvcnQgZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgcmVwbGFjZSBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQuIikpOwotICAgIH0KLQotICAgIGlmIChjb3JyZWxhdGlvblR5cGUgIT0gbnVsbAotICAgICAgJiYgIXRoaXMuY29ycmVsYXRpb25UeXBlLmVxdWFscygKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfQ09SUkVMQVRJT05fVFlQRV9FTkRQT0lOVCkKLSAgICAgICYmICF0aGlzLmNvcnJlbGF0aW9uVHlwZS5lcXVhbHMoCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX0NPUlJFTEFUSU9OX1RZUEVfTkFNRVNQQUNFKQotICAgICAgJiYgIXRoaXMuY29ycmVsYXRpb25UeXBlLmVxdWFscygKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfQ09SUkVMQVRJT05fVFlQRV9PUEVSQVRJT04pKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzE4IiwKLSAgICAgICAgICAiSW52YWxpZCBjb3JyZWxhdGlvbiB0eXBlIHNwZWNpZmllZC4iKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBvcHRpb24gdmFsdWUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRPcHRpb25WYWx1ZShTdHJpbmdbXSBhcmdzLCBpbnQgaW5kZXgpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBnZXRPcHRpb25WYWx1ZShhcmdzLCBpbmRleCwgYXJnc1tpbmRleCAtIDFdKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgb3B0aW9uIHZhbHVlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0T3B0aW9uVmFsdWUoU3RyaW5nW10gYXJncywgaW50IGluZGV4LCBTdHJpbmcgb3B0aW9uTmFtZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBJZiBpbmRleCBncmVhdGVyIHRoYW4gYXJyYXkgbGVuZ3RoLCB0aGVuIHRocm93IGV4Y2VwdGlvbgotICAgIGlmIChpbmRleCA+PSBhcmdzLmxlbmd0aCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcxMyIsCi0gICAgICAgICAgb3B0aW9uTmFtZSwKLSAgICAgICAgICAiT3B0aW9uIGRpZCBub3QgY29udGFpbiBhIHZhbHVlLiAgU3BlY2lmaWVkIG9wdGlvbjoiKSk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIG9wdGlvbiAoaS5lLiBzdGFydHMgd2l0aCBhICItIiksIHRoZW4gdGhyb3cgZXhjZXB0aW9uCi0gICAgaWYgKGFyZ3NbaW5kZXhdLnN0YXJ0c1dpdGgoIi0iKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcxMyIsCi0gICAgICAgICAgb3B0aW9uTmFtZSwKLSAgICAgICAgICAiT3B0aW9uIGRpZCBub3QgY29udGFpbiBhIHZhbHVlLiAgU3BlY2lmaWVkIG9wdGlvbjoiKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIChhcmdzW2luZGV4XSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG1lc3NhZ2UgZnJvbSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlSUQsIFN0cmluZyBkZWZhdWx0TWVzc2FnZSkKLSAgewotICAgIHJldHVybiBnZXRNZXNzYWdlKG1lc3NhZ2VJRCwgbnVsbCwgZGVmYXVsdE1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBtZXNzYWdlIGZyb20gcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZSgKLSAgICBTdHJpbmcgbWVzc2FnZUlELAotICAgIFN0cmluZyBtZXNzYWdlRGF0YSwKLSAgICBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICBTdHJpbmcgbWVzc2FnZSA9IGRlZmF1bHRNZXNzYWdlOwotICAgIGlmIChtZXNzYWdlTGlzdCAhPSBudWxsKQotICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UobWVzc2FnZUlELCBtZXNzYWdlRGF0YSwgZGVmYXVsdE1lc3NhZ2UpOwotICAgIGVsc2UgaWYgKG1lc3NhZ2VEYXRhICE9IG51bGwpCi0gICAgICBtZXNzYWdlICs9ICIgIiArIG1lc3NhZ2VEYXRhICsgIi4iOwotCi0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9BbmFseXplckNvbmZpZ1JlYWRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9BbmFseXplckNvbmZpZ1JlYWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5NDNhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL2ltcGwvQW5hbHl6ZXJDb25maWdSZWFkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQW5hbHl6ZXJDb25maWdSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5Bc3NlcnRpb25SZXN1bHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQXNzZXJ0aW9uUmVzdWx0c09wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLlVERElSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5BZGRTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uaW1wbC5BZGRTdHlsZVNoZWV0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gcmVhZCB0aGUgYW5hbHl6ZXIgY29uZmlnIGRvY3VtZW50cy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgQW5hbHl6ZXJDb25maWdSZWFkZXJJbXBsIGltcGxlbWVudHMgQW5hbHl6ZXJDb25maWdSZWFkZXIKLXsKLSAgLyoqCi0gICAqIE1lc3NhZ2UgbGlzdC4KLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlTGlzdCBtZXNzYWdlTGlzdDsKLQotICAvKioKLSAgICogRG9jdW1lbnQgbG9jYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGRvY3VtZW50VVJJOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIGFuYWx5emVyIGNvbmZpZyByZWFkZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KE1lc3NhZ2VMaXN0IG1lc3NhZ2VMaXN0KQotICB7Ci0gICAgdGhpcy5tZXNzYWdlTGlzdCA9IG1lc3NhZ2VMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5BbmFseXplckNvbmZpZ1JlYWRlciNyZWFkQW5hbHl6ZXJDb25maWcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIEFuYWx5emVyQ29uZmlnIHJlYWRBbmFseXplckNvbmZpZyhTdHJpbmcgYW5hbHl6ZXJDb25maWdVUkkpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZVJlYWRlciBmaWxlUmVhZGVyID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoYW5hbHl6ZXJDb25maWdVUkkpOwotICAgIH0KLQotICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcwMSIsCi0gICAgICAgICAgYW5hbHl6ZXJDb25maWdVUkksCi0gICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIGFuYWx5emVyIGNvbmZpZyBmaWxlOiAiKSwKLSAgICAgICAgZm5mZSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzA4IiwKLSAgICAgICAgICBhbmFseXplckNvbmZpZ1VSSSwKLSAgICAgICAgICAiQ291bGQgbm90IHJlYWQgYW5hbHl6ZXIgY29uZmlnIGZpbGU6ICIpLAotICAgICAgICBlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVhZEFuYWx5emVyQ29uZmlnKGZpbGVSZWFkZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5BbmFseXplckNvbmZpZ1JlYWRlciNyZWFkQW5hbHl6ZXJDb25maWcoUmVhZGVyKQotICAgKi8KLSAgcHVibGljIEFuYWx5emVyQ29uZmlnIHJlYWRBbmFseXplckNvbmZpZyhSZWFkZXIgcmVhZGVyKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBBbmFseXplckNvbmZpZyBhbmFseXplckNvbmZpZyA9IG5ldyBBbmFseXplckNvbmZpZ0ltcGwoKTsKLQotICAgIC8vIFBhcnNlIFhNTAotICAgIERvY3VtZW50IGRvYyA9IFhNTFV0aWxzLnBhcnNlWE1MKHJlYWRlcik7Ci0KLSAgICAvLyBQYXJzZSBlbGVtZW50cyBpbiB0aGUgY29uZmlnIGRvY3VtZW50Ci0gICAgcGFyc2VDb25maWdFbGVtZW50KGFuYWx5emVyQ29uZmlnLCBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCi0gICAgcmV0dXJuIGFuYWx5emVyQ29uZmlnOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyI2dldExvY2F0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXIjc2V0TG9jYXRpb24oU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGRvY3VtZW50VVJJKQotICB7Ci0gICAgdGhpcy5kb2N1bWVudFVSSSA9IGRvY3VtZW50VVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGNvbmZpZyBlbGVtZW50LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHBhcnNlQ29uZmlnRWxlbWVudCgKLSAgICBBbmFseXplckNvbmZpZyBhbmFseXplckNvbmZpZywKLSAgICBFbGVtZW50IGVsZW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQUREOiBHZXQgbmFtZSBhbmQgdmVyc2lvbgotCi0gICAgLy8gQUREOiBWZXJpZnkgdGhhdCB0aGlzIGlzIHRoZSBjb25maWcgZWxlbWVudAotCi0gICAgLy8gR2V0IGZpcnN0IGNoaWxkIGVsZW1lbnQKLSAgICBFbGVtZW50IG5leHRFbGVtZW50ID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChlbGVtZW50KTsKLQotICAgIC8vIERFQlVHOgotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJFbGVtZW50IG5hbWU6ICIgKyBuZXh0RWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICAvLyBQcm9jZXNzIGVhY2ggY2hpbGQgZWxlbWVudAotICAgIHdoaWxlIChuZXh0RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIDxkZXNjcmlwdGlvbj4KLSAgICAgIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX0RFU0NSSVBUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgYW5hbHl6ZXJDb25maWcuc2V0RGVzY3JpcHRpb24oWE1MVXRpbHMuZ2V0VGV4dChuZXh0RWxlbWVudCkpOwotICAgICAgfQotCi0gICAgICAvLyA8dmVyYm9zZT4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fVkVSQk9TRSkpCi0gICAgICB7Ci0gICAgICAgIGFuYWx5emVyQ29uZmlnLnNldFZlcmJvc2VPcHRpb24oCi0gICAgICAgICAgWE1MVXRpbHMuZ2V0Qm9vbGVhblZhbHVlKG5leHRFbGVtZW50LCBmYWxzZSkpOwotICAgICAgfQotCi0gICAgICAvLyA8YXNzZXJ0aW9uUmVzdWx0cz4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fQVNTRVJUSU9OX1JFU1VMVFMpKQotICAgICAgewotICAgICAgICAvLyBDcmVhdGUgYXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uIG9iamVjdAotICAgICAgICBBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGFzc2VydGlvblJlc3VsdHNPcHRpb24gPQotICAgICAgICAgIG5ldyBBc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbCgpOwotICAgICAgICBhbmFseXplckNvbmZpZy5zZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKGFzc2VydGlvblJlc3VsdHNPcHRpb24pOwotCi0gICAgICAgIC8vIFNldCByZXN1bHQgdHlwZQotICAgICAgICBTdHJpbmcgcmVzdWx0VHlwZSA9Ci0gICAgICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5BVFRSX1RZUEUpOwotICAgICAgICBhc3NlcnRpb25SZXN1bHRzT3B0aW9uLnNldEFzc2VydGlvblJlc3VsdFR5cGUoCi0gICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0VHlwZS5uZXdJbnN0YW5jZShyZXN1bHRUeXBlKSk7Ci0KLSAgICAgICAgLy8gU2V0IHNob3cgbG9nIGVudHJ5Ci0gICAgICAgIGFzc2VydGlvblJlc3VsdHNPcHRpb24uc2V0U2hvd01lc3NhZ2VFbnRyeSgKLSAgICAgICAgICBYTUxVdGlscy5nZXRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICBuZXh0RWxlbWVudCwKLSAgICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX01FU1NBR0VfRU5UUlksCi0gICAgICAgICAgICBhc3NlcnRpb25SZXN1bHRzT3B0aW9uLmdldFNob3dNZXNzYWdlRW50cnkoKSkpOwotCi0gICAgICAgIC8vIFNldCBzaG93IGZhaWx1cmUgbWVzc2FnZQotICAgICAgICBhc3NlcnRpb25SZXN1bHRzT3B0aW9uLnNldFNob3dGYWlsdXJlTWVzc2FnZSgKLSAgICAgICAgICBYTUxVdGlscy5nZXRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICBuZXh0RWxlbWVudCwKLSAgICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX0ZBSUxVUkVfTUVTU0FHRSwKLSAgICAgICAgICAgIGFzc2VydGlvblJlc3VsdHNPcHRpb24uZ2V0U2hvd0ZhaWx1cmVNZXNzYWdlKCkpKTsKLQotICAgICAgICAvLyBTZXQgc2hvdyBmYWlsdXJlIGRldGFpbAotICAgICAgICBhc3NlcnRpb25SZXN1bHRzT3B0aW9uLnNldFNob3dGYWlsdXJlRGV0YWlsKAotICAgICAgICAgIFhNTFV0aWxzLmdldEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgIG5leHRFbGVtZW50LAotICAgICAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfRkFJTFVSRV9ERVRBSUwsCi0gICAgICAgICAgICBhc3NlcnRpb25SZXN1bHRzT3B0aW9uLmdldFNob3dGYWlsdXJlRGV0YWlsKCkpKTsKLQotICAgICAgICAvLyBSRU1PVkU6IFNldCBzaG93IHdhcm5pbmcgbWVzc2FnZQotICAgICAgICAvL2Fzc2VydGlvblJlc3VsdHNPcHRpb24uc2V0U2hvd1dhcm5pbmdNZXNzYWdlKFhNTFV0aWxzLmdldEJvb2xlYW5WYWx1ZShuZXh0RWxlbWVudCwgCi0gICAgICAgIC8vICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfV0FSTklOR19NRVNTQUdFLCBhc3NlcnRpb25SZXN1bHRzT3B0aW9uLmdldFNob3dXYXJuaW5nTWVzc2FnZSgpKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxyZXBvcnRGaWxlPgotICAgICAgZWxzZSBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9SRVBPUlRfRklMRSkpCi0gICAgICB7Ci0gICAgICAgIHBhcnNlUmVwb3J0RmlsZUVsZW1lbnQoYW5hbHl6ZXJDb25maWcsIG5leHRFbGVtZW50KTsKLSAgICAgIH0KLQotICAgICAgLy8gPHRlc3RBc3NlcnRpb25GaWxlPgotICAgICAgZWxzZSBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9URVNUX0FTU0VSVElPTlNfRklMRSkpCi0gICAgICB7Ci0gICAgICAgIGFuYWx5emVyQ29uZmlnLnNldFRlc3RBc3NlcnRpb25zRG9jdW1lbnRMb2NhdGlvbigKLSAgICAgICAgICBYTUxVdGlscy5nZXRUZXh0KG5leHRFbGVtZW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxsb2dGaWxlPgotICAgICAgZWxzZSBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9MT0dfRklMRSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjb3JyZWxhdGlvblR5cGUgPQotICAgICAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZVZhbHVlKAotICAgICAgICAgICAgbmV4dEVsZW1lbnQsCi0gICAgICAgICAgICBXU0lDb25zdGFudHMuQVRUUl9DT1JSRUxBVElPTl9UWVBFKTsKLSAgICAgICAgYW5hbHl6ZXJDb25maWcuc2V0Q29ycmVsYXRpb25UeXBlKAotICAgICAgICAgIGNvcnJlbGF0aW9uVHlwZSA9PSBudWxsID8gIm9wZXJhdGlvbiIgOiBjb3JyZWxhdGlvblR5cGUpOwotICAgICAgICBhbmFseXplckNvbmZpZy5zZXRMb2dMb2NhdGlvbihYTUxVdGlscy5nZXRUZXh0KG5leHRFbGVtZW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDx3c2RsUmVmZXJlbmNlPgotICAgICAgZWxzZSBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9XU0RMX1JFRkVSRU5DRSkpCi0gICAgICB7Ci0gICAgICAgIHBhcnNlV3NkbFJlZmVyZW5jZShhbmFseXplckNvbmZpZywgbmV4dEVsZW1lbnQpOwotICAgICAgfQotCi0gICAgICAvLyA8dWRkaVJlZmVyZW5jZT4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fVURESV9SRUZFUkVOQ0UpKQotICAgICAgewotICAgICAgICBwYXJzZVVkZGlSZWZlcmVuY2UoYW5hbHl6ZXJDb25maWcsIG5leHRFbGVtZW50KTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICAgImNvbmZpZzA2IiwKLSAgICAgICAgICAgIG5leHRFbGVtZW50LmdldExvY2FsTmFtZSgpLAotICAgICAgICAgICAgIkludmFsaWQgYW5hbHl6ZXIgY29uZmlnIGVsZW1lbnQ6IikpOwotICAgICAgfQotCi0gICAgICAvLyBHZXQgbmV4dCBlbGVtZW50Ci0gICAgICBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKG5leHRFbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgcmVwb3J0RmlsZSBlbGVtZW50LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHBhcnNlUmVwb3J0RmlsZUVsZW1lbnQoCi0gICAgQW5hbHl6ZXJDb25maWcgYW5hbHl6ZXJDb25maWcsCi0gICAgRWxlbWVudCBlbGVtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCByZXBvcnQgbG9jYXRpb24gYW5kIHJlcGxhY2UgaW5kaWNhdG9yCi0gICAgYW5hbHl6ZXJDb25maWcuc2V0UmVwbGFjZVJlcG9ydCgKLSAgICAgIFhNTFV0aWxzLmdldEJvb2xlYW5WYWx1ZShlbGVtZW50LCBXU0lDb25zdGFudHMuQVRUUl9SRVBMQUNFLCBmYWxzZSkpOwotICAgIGFuYWx5emVyQ29uZmlnLnNldFJlcG9ydExvY2F0aW9uKAotICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoCi0gICAgICAgIGVsZW1lbnQsCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLAotICAgICAgICBXU0lDb25zdGFudHMuREVGQVVMVF9SRVBPUlRfVVJJKSk7Ci0KLSAgICAvLyBBREQ6IElmIHRoZSByZXBvcnQgbG9jYXRpb24gd2Fzbid0IHNwZWNpZmllZCwgdGhlbiB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAvL2lmIChhbmFseXplckNvbmZpZy5nZXRSZXBvcnRMb2NhdGlvbigpID09IG51bGwpCi0gICAgLy8gIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIlRoZSBhbmFseXplciBjb25maWd1cmF0aW9uIGZpbGUgbXVzdCBjb250YWluIHRoZSByZXBvcnQgZmlsZSBsb2NhdGlvbi4iKTsKLQotICAgIC8vIEdldCBmaXJzdCBjaGlsZCBlbGVtZW50Ci0gICAgRWxlbWVudCBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbWVudCk7Ci0KLSAgICAvLyBQcm9jZXNzIGVhY2ggY2hpbGQgZWxlbWVudAotICAgIHdoaWxlIChuZXh0RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIDxhZGRTdHlsZVNoZWV0PgotICAgICAgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fQUREX1NUWUxFX1NIRUVUKSkKLSAgICAgIHsKLSAgICAgICAgQWRkU3R5bGVTaGVldCBhZGRTdHlsZVNoZWV0ID0gbmV3IEFkZFN0eWxlU2hlZXRJbXBsKCk7Ci0KLSAgICAgICAgLy8gUGFyc2UgdGhlIGVsZW1lbnQgIAotICAgICAgICBUZXN0VXRpbHMucGFyc2VBZGRTdHlsZVNoZWV0KAotICAgICAgICAgIG5leHRFbGVtZW50LAotICAgICAgICAgIGFkZFN0eWxlU2hlZXQsCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkRFRkFVTFRfUkVQT1JUX1hTTCk7Ci0KLSAgICAgICAgLy8gU2V0IGFkZCBzdHlsZSBzaGVldAotICAgICAgICBhbmFseXplckNvbmZpZy5zZXRBZGRTdHlsZVNoZWV0KGFkZFN0eWxlU2hlZXQpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgICAiY29uZmlnMDYiLAotICAgICAgICAgICAgbmV4dEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCksCi0gICAgICAgICAgICAiSW52YWxpZCBhbmFseXplciBjb25maWcgZWxlbWVudDoiKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEdldCBuZXh0IGVsZW1lbnQKLSAgICAgIG5leHRFbGVtZW50ID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcobmV4dEVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSB3c2RsIHJlZmVyZW5jZSBlbGVtZW50LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHBhcnNlV3NkbFJlZmVyZW5jZSgKLSAgICBBbmFseXplckNvbmZpZyBhbmFseXplckNvbmZpZywKLSAgICBFbGVtZW50IGVsZW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ3JlYXRlIFVEREkgcmVmZXJlbmNlCi0gICAgV1NETFJlZmVyZW5jZSB3c2RsUmVmZXJlbmNlID0gbmV3IFdTRExSZWZlcmVuY2VJbXBsKCk7Ci0KLSAgICAvLyBTZXQgV1NETCByZWZlcmVuY2UKLSAgICBhbmFseXplckNvbmZpZy5zZXRXU0RMUmVmZXJlbmNlKHdzZGxSZWZlcmVuY2UpOwotCi0gICAgLy8gR2V0IGZpcnN0IGNoaWxkIGVsZW1lbnQKLSAgICBFbGVtZW50IG5leHRFbGVtZW50ID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChlbGVtZW50KTsKLQotICAgIC8vIFByb2Nlc3MgZWFjaCBjaGlsZCBlbGVtZW50Ci0gICAgd2hpbGUgKG5leHRFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgLy8gPHdzZGxVUkk+Ci0gICAgICBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9XU0RMX1VSSSkpCi0gICAgICB7Ci0gICAgICAgIC8vIFNldCBXU0RMIGxvY2F0aW9uCi0gICAgICAgIHdzZGxSZWZlcmVuY2Uuc2V0V1NETExvY2F0aW9uKFhNTFV0aWxzLmdldFRleHQobmV4dEVsZW1lbnQpKTsKLSAgICAgIH0KLQotICAgICAgLy8gPHNlcnZpY2VMb2NhdGlvbj4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fU0VSVklDRV9MT0NBVElPTikpCi0gICAgICB7Ci0gICAgICAgIC8vIFNldCBzZXJ2aWNlIGxvY2F0aW9uCi0gICAgICAgIHdzZGxSZWZlcmVuY2Uuc2V0U2VydmljZUxvY2F0aW9uKFhNTFV0aWxzLmdldFRleHQobmV4dEVsZW1lbnQpKTsKLSAgICAgIH0KLQotICAgICAgLy8gPHdzZGxFbGVtZW50PgotICAgICAgZWxzZSBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9XU0RMX0VMRU1FTlQpKQotICAgICAgewotICAgICAgICAvLyBTZXQgV1NETCBlbGVtZW50Ci0gICAgICAgIHdzZGxSZWZlcmVuY2Uuc2V0V1NETEVsZW1lbnQocGFyc2VXc2RsRWxlbWVudChuZXh0RWxlbWVudCkpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgICAiY29uZmlnMDYiLAotICAgICAgICAgICAgbmV4dEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCksCi0gICAgICAgICAgICAiSW52YWxpZCBhbmFseXplciBjb25maWcgZWxlbWVudDoiKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEdldCBuZXh0IGVsZW1lbnQKLSAgICAgIG5leHRFbGVtZW50ID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcobmV4dEVsZW1lbnQpOwotICAgIH0KLQotICAgIC8vIElmIFdTREwgZWxlbWVudCBvciBXU0wgVVJJIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhyb3cgZXhjZXB0aW9uCi0gICAgaWYgKCh3c2RsUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkgPT0gbnVsbCkKLSAgICAgIHx8ICh3c2RsUmVmZXJlbmNlLmdldFdTRExMb2NhdGlvbigpID09IG51bGwpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzA3IiwKLSAgICAgICAgICAiQm90aCB0aGUgPHdzZGxFbGVtZW50PiBhbmQgPHdzZGxVUkk+IGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkLiIpKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0eXBlIGlzIHBvcnQgb3Igb3BlcmF0aW9uLCB0aGVuIHBhcmVudCBlbGVtZW50IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQKLSAgICBpZiAoKCh3c2RsUmVmZXJlbmNlCi0gICAgICAuZ2V0V1NETEVsZW1lbnQoKQotICAgICAgLmdldFR5cGUoKQotICAgICAgLmVxdWFsc0lnbm9yZUNhc2UoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fUE9SVCkpCi0gICAgICB8fCAod3NkbFJlZmVyZW5jZQotICAgICAgICAuZ2V0V1NETEVsZW1lbnQoKQotICAgICAgICAuZ2V0VHlwZSgpCi0gICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTikpKQotICAgICAgJiYgKHdzZGxSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXRQYXJlbnRFbGVtZW50TmFtZSgpID09IG51bGwpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzA5IiwKLSAgICAgICAgICAiVGhlIHBhcmVudEVsZW1lbnROYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIGEgV1NETCB0eXBlIG9mICIKLSAgICAgICAgICAgICsgRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fUE9SVAotICAgICAgICAgICAgKyAiIG9yICIKLSAgICAgICAgICAgICsgRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fT1BFUkFUSU9OCi0gICAgICAgICAgICArICIuIikpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSB1ZGRpIHJlZmVyZW5jZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBwYXJzZVVkZGlSZWZlcmVuY2UoCi0gICAgQW5hbHl6ZXJDb25maWcgYW5hbHl6ZXJDb25maWcsCi0gICAgRWxlbWVudCBlbGVtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSBVRERJIHJlZmVyZW5jZQotICAgIFVERElSZWZlcmVuY2UgdWRkaVJlZmVyZW5jZSA9IG5ldyBVRERJUmVmZXJlbmNlSW1wbCgpOwotCi0gICAgLy8gU2V0IFVEREkgcmVmZXJlbmNlCi0gICAgYW5hbHl6ZXJDb25maWcuc2V0VURESVJlZmVyZW5jZSh1ZGRpUmVmZXJlbmNlKTsKLQotICAgIC8vIEdldCBmaXJzdCBjaGlsZCBlbGVtZW50Ci0gICAgRWxlbWVudCBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbWVudCk7Ci0KLSAgICAvLyBQcm9jZXNzIGVhY2ggY2hpbGQgZWxlbWVudAotICAgIHdoaWxlIChuZXh0RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIDxpbnF1aXJ5VVJMPgotICAgICAgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fSU5RVUlSWV9VUkwpKQotICAgICAgewotICAgICAgICAvLyBTZXQgaW5xdWlyeSBVUkwKLSAgICAgICAgdWRkaVJlZmVyZW5jZS5zZXRJbnF1aXJ5VVJMKFhNTFV0aWxzLmdldFRleHQobmV4dEVsZW1lbnQpKTsKLSAgICAgIH0KLQotICAgICAgLy8gPHVkZGlLZXk+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX1VERElfS0VZKSkKLSAgICAgIHsKLSAgICAgICAgLy8gU2V0IFVEREkga2V5IGFuZCBrZXkgdHlwZQotICAgICAgICB1ZGRpUmVmZXJlbmNlLnNldEtleShYTUxVdGlscy5nZXRUZXh0KG5leHRFbGVtZW50KSk7Ci0gICAgICAgIHVkZGlSZWZlcmVuY2Uuc2V0S2V5VHlwZSgKLSAgICAgICAgICBYTUxVdGlscy5nZXRBdHRyaWJ1dGVWYWx1ZShuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkFUVFJfVFlQRSkpOwotICAgICAgfQotCi0gICAgICAvLyA8d3NkbEVsZW1lbnQ+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX1dTRExfRUxFTUVOVCkpCi0gICAgICB7Ci0gICAgICAgIC8vIFNldCBXU0RMIGVsZW1lbnQKLSAgICAgICAgdWRkaVJlZmVyZW5jZS5zZXRXU0RMRWxlbWVudChwYXJzZVdzZGxFbGVtZW50KG5leHRFbGVtZW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxzZXJ2aWNlTG9jYXRpb24+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX1NFUlZJQ0VfTE9DQVRJT04pKQotICAgICAgewotICAgICAgICAvLyBTZXQgc2VydmljZSBsb2NhdGlvbgotICAgICAgICB1ZGRpUmVmZXJlbmNlLnNldFNlcnZpY2VMb2NhdGlvbihYTUxVdGlscy5nZXRUZXh0KG5leHRFbGVtZW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFJFTU9WRToKLSAgICAgIC8vIDx3c2RsRWxlbWVudD4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fV1NETF9FTEVNRU5UKSkgewotICAgICAgICAvLyBTZXQgc2VydmljZSBsb2NhdGlvbgotICAgICAgICBwYXJzZVdzZGxFbGVtZW50KGFuYWx5emVyQ29uZmlnLCBuZXh0RWxlbWVudCk7Ci0gICAgICAgfQotICAgICAgICovCi0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICJjb25maWcwNiIsCi0gICAgICAgICAgICBuZXh0RWxlbWVudC5nZXRMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgICJJbnZhbGlkIGFuYWx5emVyIGNvbmZpZyBlbGVtZW50OiIpKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0IG5leHQgZWxlbWVudAotICAgICAgbmV4dEVsZW1lbnQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhuZXh0RWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIFdTREwgZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgV1NETEVsZW1lbnQgcGFyc2VXc2RsRWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gbmV3IFdTRExFbGVtZW50SW1wbCgpOwotCi0gICAgLy8gU2V0IHR5cGUsIG5hbWVzcGFjZSwgcGFyZW50IGVsZW1lbnQgbmFtZSBhbmQgbmFtZQotICAgIHdzZGxFbGVtZW50LnNldFR5cGUoCi0gICAgICBYTUxVdGlscy5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBXU0lDb25zdGFudHMuQVRUUl9UWVBFKSk7Ci0gICAgd3NkbEVsZW1lbnQuc2V0TmFtZXNwYWNlKAotICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgV1NJQ29uc3RhbnRzLkFUVFJfTkFNRVNQQUNFKSk7Ci0gICAgd3NkbEVsZW1lbnQuc2V0UGFyZW50RWxlbWVudE5hbWUoCi0gICAgICBYTUxVdGlscy5nZXRBdHRyaWJ1dGVWYWx1ZSgKLSAgICAgICAgZWxlbWVudCwKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfUEFSRU5UX0VMRU1FTlRfTkFNRSkpOwotCi0gICAgU3RyaW5nIHdzZGxFbGVtZW50TmFtZSA9IFhNTFV0aWxzLmdldFRleHQoZWxlbWVudCk7Ci0gICAgaWYgKHdzZGxFbGVtZW50TmFtZS5lcXVhbHMoIiIpKQotICAgIHsKLSAgICAgIC8vIFRocm93IGV4Y2VwdGlvbgotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgiY29uZmlnMTkiLCAiVGhlIFdTREwgZWxlbWVudCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLiIpKTsKLSAgICB9Ci0gICAgd3NkbEVsZW1lbnQuc2V0TmFtZSh3c2RsRWxlbWVudE5hbWUpOwotCi0gICAgcmV0dXJuIHdzZGxFbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGlzIGVsZW1lbnQgbWF0Y2hlcyBzcGVjaWZpZWQgbG9jYWwgbmFtZSBpbiB0aGUgYW5hbHl6ZXIgY29uZmlnIG5hbWVzcGFjZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0VsZW1lbnQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgcmV0dXJuIGlzRWxlbWVudCgKLSAgICAgIGVsZW1lbnQsCi0gICAgICBnZXRWYWxpZFdTSUFuYWx5emVyQ29uZmlnTmFtZXNwYWNlcygpLAotICAgICAgbG9jYWxOYW1lKTsKLSAgfQotCi0gIAotICBzdGF0aWMgcHVibGljIExpc3QgZ2V0VmFsaWRXU0lBbmFseXplckNvbmZpZ05hbWVzcGFjZXMoKQotICB7Ci0gIAlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCWxpc3QuYWRkKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FOQUxZWkVSX0NPTkZJR18yMDAzKTsKLSAgCWxpc3QuYWRkKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FOQUxZWkVSX0NPTkZJRyk7Ci0gIAlyZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGlzIGVsZW1lbnQgbWF0Y2hlcyBzcGVjaWZpZWQgbG9jYWwgbmFtZSBpbiB0aGUgYW5hbHl6ZXIgY29uZmlnIG5hbWVzcGFjZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0VsZW1lbnQoCi0gICAgRWxlbWVudCBlbGVtZW50LAotICAgIExpc3QgbmFtZXNwYWNlcywKLSAgICBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgcmV0dXJuIFhNTFV0aWxzLmlzRWxlbWVudChlbGVtZW50LCBuYW1lc3BhY2VzLCBsb2NhbE5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGlzIGVsZW1lbnQgbWF0Y2hlcyBzcGVjaWZpZWQgbG9jYWwgbmFtZSBpbiB0aGUgYW5hbHl6ZXIgY29uZmlnIG5hbWVzcGFjZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0VsZW1lbnQoCi0gICAgRWxlbWVudCBlbGVtZW50LAotICAgIFN0cmluZyBuYW1lc3BhY2UsCi0gICAgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIHJldHVybiBYTUxVdGlscy5pc0VsZW1lbnQoZWxlbWVudCwgbmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBtZXNzYWdlIGZyb20gcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZUlELCBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZShtZXNzYWdlSUQsIG51bGwsIGRlZmF1bHRNZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbWVzc2FnZSBmcm9tIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoCi0gICAgU3RyaW5nIG1lc3NhZ2VJRCwKLSAgICBTdHJpbmcgbWVzc2FnZURhdGEsCi0gICAgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQotICB7Ci0gICAgU3RyaW5nIG1lc3NhZ2UgPSBkZWZhdWx0TWVzc2FnZTsKLSAgICBpZiAobWVzc2FnZUxpc3QgIT0gbnVsbCkKLSAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlTGlzdC5nZXRNZXNzYWdlKG1lc3NhZ2VJRCwgbWVzc2FnZURhdGEsIGRlZmF1bHRNZXNzYWdlKTsKLSAgICBlbHNlCi0gICAgICBtZXNzYWdlICs9ICIgIiArIG1lc3NhZ2VEYXRhICsgIi4iOwotCi0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9Bc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9pbXBsL0Fzc2VydGlvblJlc3VsdHNPcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MTI5ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9pbXBsL0Fzc2VydGlvblJlc3VsdHNPcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiwgUGFyYXNvZnQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIFBhcmFzb2Z0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFzc2VydGlvblJlc3VsdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5Bc3NlcnRpb25SZXN1bHRzT3B0aW9uOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIGFzc2VydGlvbiByZXN1bHRzIG9wdGlvbiBkZWZpbml0aW9uLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbCBpbXBsZW1lbnRzIEFzc2VydGlvblJlc3VsdHNPcHRpb24KLXsKLSAgLyoqCi0gICAqIEFzc2VydGlvbiByZXN1bHQgdHlwZS4KLSAgICovCi0gIHByb3RlY3RlZCBBc3NlcnRpb25SZXN1bHRUeXBlIHJlc3VsdFR5cGUgPSBBc3NlcnRpb25SZXN1bHRUeXBlLkFMTDsKLQotICAvKioKLSAgICogU2hvdyBtZXNzYWdlIGVudHJ5IGluZGljYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3dNZXNzYWdlRW50cnkgPSB0cnVlOwotCi0gIC8qKgotICAgKiBTaG93IGFzc2VydGlvbiBkZXNjcmlwdGlvbiBpbmRpY2F0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24gPSBmYWxzZTsKLQotICAvKioKLSAgICogU2hvdyBmYWlsdXJlIG1lc3NhZ2UgaW5kaWNhdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0ZhaWx1cmVNZXNzYWdlID0gdHJ1ZTsKLQotICAvKioKLSAgICogU2hvdyBmYWlsdXJlIGRldGFpbCBpbmRpY2F0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93RmFpbHVyZURldGFpbCA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIEdldCBhc3NlcnRpb24gcmVzdWx0IHR5cGUuCi0gICAqIEBzZWUgI3NldEFzc2VydGlvblJlc3VsdFR5cGUKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHRUeXBlIGdldEFzc2VydGlvblJlc3VsdFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHJlc3VsdFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGFzc2VydGlvbiByZXN1bHQgdHlwZS4KLSAgICogQHNlZSAjZ2V0QXNzZXJ0aW9uUmVzdWx0VHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXNzZXJ0aW9uUmVzdWx0VHlwZShBc3NlcnRpb25SZXN1bHRUeXBlIHJlc3VsdFR5cGUpCi0gIHsKLSAgICB0aGlzLnJlc3VsdFR5cGUgPSByZXN1bHRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzaG93IG1lc3NhZ2UgZW50cnkgaW5kaWNhdG9yLgotICAgKiBAc2VlICNzZXRTaG93TWVzc2FnZUVudHJ5Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93TWVzc2FnZUVudHJ5KCkKLSAgewotICAgIHJldHVybiB0aGlzLnNob3dNZXNzYWdlRW50cnk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHNob3cgbWVzc2FnZSBlbnRyeSBpbmRpY3Rvci4KLSAgICogQHNlZSAjZ2V0U2hvd01lc3NhZ2VFbnRyeQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2hvd01lc3NhZ2VFbnRyeShib29sZWFuIHNob3dNZXNzYWdlRW50cnkpCi0gIHsKLSAgICB0aGlzLnNob3dNZXNzYWdlRW50cnkgPSBzaG93TWVzc2FnZUVudHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzaG93IGFzc2VydGlvbiBkZXNjcmlwdGlvbiBpbmRpY2F0b3IuCi0gICAqIEBzZWUgI3NldFNob3dBc3NlcnRpb25EZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLnNob3dBc3NlcnRpb25EZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgc2hvdyBhc3NlcnRpb24gZGVzY3JpcHRpb24gaW5kaWN0b3IuCi0gICAqIEBzZWUgI2dldFNob3dBc3NlcnRpb25EZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uKGJvb2xlYW4gc2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uKQotICB7Ci0gICAgdGhpcy5zaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24gPSBzaG93QXNzZXJ0aW9uRGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHNob3cgZmFpbHVyZSBtZXNzYWdlIGluZGljYXRvci4KLSAgICogQHNlZSAjc2V0U2hvd0ZhaWx1cmVNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93RmFpbHVyZU1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuc2hvd0ZhaWx1cmVNZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBzaG93IGZhaWx1cmUgbWVzYWdlIGluZGljYXRvci4KLSAgICogQHNlZSAjZ2V0U2hvd0ZhaWx1cmVNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93RmFpbHVyZU1lc3NhZ2UoYm9vbGVhbiBzaG93RmFpbHVyZU1lc3NhZ2UpCi0gIHsKLSAgICB0aGlzLnNob3dGYWlsdXJlTWVzc2FnZSA9IHNob3dGYWlsdXJlTWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc2hvdyBmYWlsdXJlIGRldGFpbCBpbmRpY2F0b3IuCi0gICAqIEBzZWUgI3NldFNob3dGYWlsdXJlRGV0YWlsCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93RmFpbHVyZURldGFpbCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5zaG93RmFpbHVyZURldGFpbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgc2hvdyBmYWlsdXJlIGRldGFpbCBpbmRpY2F0b3IuCi0gICAqIEBzZWUgI2dldFNob3dGYWlsdXJlRGV0YWlsCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93RmFpbHVyZURldGFpbChib29sZWFuIHNob3dGYWlsdXJlRGV0YWlsKQotICB7Ci0gICAgdGhpcy5zaG93RmFpbHVyZURldGFpbCA9IHNob3dGYWlsdXJlRGV0YWlsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBwdy5wcmludGxuKCIgIEFzc2VydGlvbiBSZXN1bHRzOiIpOwotICAgIHB3LnByaW50bG4oIiAgICB0eXBlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5yZXN1bHRUeXBlKTsKLSAgICBwdy5wcmludGxuKCIgICAgbWVzc2FnZUVudHJ5IC4uLi4uLi4uLi4uLi4gIiArIHRoaXMuc2hvd01lc3NhZ2VFbnRyeSk7Ci0gICAgcHcucHJpbnRsbigKLSAgICAgICIgICAgYXNzZXJ0aW9uRGVzY3JpcHRpb24gLi4uLi4gIiArIHRoaXMuc2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uKTsKLSAgICBwdy5wcmludGxuKCIgICAgZmFpbHVyZU1lc3NhZ2UgLi4uLi4uLi4uLi4gIiArIHRoaXMuc2hvd0ZhaWx1cmVNZXNzYWdlKTsKLSAgICBwdy5wcmludGxuKCIgICAgZmFpbHVyZURldGFpbCAuLi4uLi4uLi4uLi4gIiArIHRoaXMuc2hvd0ZhaWx1cmVEZXRhaWwpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0IGFzIGFuIFhNTCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBDb25maWcgb3B0aW9ucwotICAgIHB3LnByaW50KCIgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0FTU0VSVElPTl9SRVNVTFRTICsgIiAiKTsKLSAgICBwdy5wcmludChXU0lDb25zdGFudHMuQVRUUl9UWVBFICsgIj1cIiIgKyBnZXRBc3NlcnRpb25SZXN1bHRUeXBlKCkgKyAiXCIgIik7Ci0gICAgcHcucHJpbnQoCi0gICAgICBXU0lDb25zdGFudHMuQVRUUl9NRVNTQUdFX0VOVFJZICsgIj1cIiIgKyBnZXRTaG93TWVzc2FnZUVudHJ5KCkgKyAiXCIgIik7Ci0gICAgcHcucHJpbnQoCi0gICAgICBXU0lDb25zdGFudHMuQVRUUl9BU1NFUlRJT05fREVTQ1JJUFRJT04KLSAgICAgICAgKyAiPVwiIgotICAgICAgICArIGdldFNob3dBc3NlcnRpb25EZXNjcmlwdGlvbigpCi0gICAgICAgICsgIlwiICIpOwotICAgIHB3LnByaW50KAotICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfRkFJTFVSRV9NRVNTQUdFCi0gICAgICAgICsgIj1cIiIKLSAgICAgICAgKyBnZXRTaG93RmFpbHVyZU1lc3NhZ2UoKQotICAgICAgICArICJcIiAiKTsKLSAgICBwdy5wcmludGxuKAotICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfRkFJTFVSRV9ERVRBSUwKLSAgICAgICAgKyAiPVwiIgotICAgICAgICArIGdldFNob3dGYWlsdXJlRGV0YWlsKCkKLSAgICAgICAgKyAiXCIvPiIpOwotICAgIC8vIFJFTU9WRToKLSAgICAvL3B3LnByaW50bG4oV1NJQ29uc3RhbnRzLkFUVFJfV0FSTklOR19NRVNTQUdFICsgIj1cIiIgKyBnZXRTaG93V2FybmluZ01lc3NhZ2UoKSArICJcIi8+Iik7Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9pbXBsL1VERElSZWZlcmVuY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL2ltcGwvVURESVJlZmVyZW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjN2I2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL2ltcGwvVURESVJlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5VRERJUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETEVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGlpbXBsZW1lbnRhdGlvbiBmb3IgYSByZWZlcmVuY2UgdG8gYSBkaXNjb3ZlcnkgYXJ0aWZhY3QuICAKLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFVERElSZWZlcmVuY2VJbXBsIGltcGxlbWVudHMgVURESVJlZmVyZW5jZQotewotICAvKioKLSAgICogVURESSBrZXkgdHlwZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcga2V5VHlwZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFVEREkga2V5LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBrZXkgPSBudWxsOwotCi0gIC8qKgotICAgKiBVRERJIGlucXVpcnkgVVJMLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpbnF1aXJ5VVJMID0gbnVsbDsKLQotICAvKioKLSAgICogV1NETCBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gbnVsbDsKLQotICAvKioKLSAgICogU2VydmljZSBsb2NhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZUxvY2F0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLlVERElSZWZlcmVuY2UjZ2V0S2V5VHlwZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEtleVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMua2V5VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuVURESVJlZmVyZW5jZSNzZXRLZXlUeXBlKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEtleVR5cGUoU3RyaW5nIGtleVR5cGUpCi0gIHsKLSAgICBpZiAoa2V5VHlwZS5lcXVhbHMoQklORElOR19LRVkpIHx8IGtleVR5cGUuZXF1YWxzKFRNT0RFTF9LRVkpKQotICAgICAgdGhpcy5rZXlUeXBlID0ga2V5VHlwZTsKLSAgICBlbHNlCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiSW52YWxpZCBVRERJIGtleSB0eXBlOiBbIiArIGtleVR5cGUgKyAiXS4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuVURESVJlZmVyZW5jZSNnZXRLZXkoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMua2V5OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5VRERJUmVmZXJlbmNlI3NldEtleShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkKLSAgewotICAgIHRoaXMua2V5ID0ga2V5OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5VRERJUmVmZXJlbmNlI2dldElucXVpcnlVUkwoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkKLSAgewotICAgIHJldHVybiB0aGlzLmlucXVpcnlVUkw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLlVERElSZWZlcmVuY2Ujc2V0SW5xdWlyeVVSTChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnF1aXJ5VVJMKFN0cmluZyBpbnF1aXJ5VVJMKQotICB7Ci0gICAgdGhpcy5pbnF1aXJ5VVJMID0gaW5xdWlyeVVSTDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETFJlZmVyZW5jZSNnZXRXU0RMRWxlbWVudCgpCi0gICAqLwotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMud3NkbEVsZW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExSZWZlcmVuY2Ujc2V0V1NETEVsZW1lbnQoV1NETEVsZW1lbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXU0RMRWxlbWVudChXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgewotICAgIHRoaXMud3NkbEVsZW1lbnQgPSB3c2RsRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETFJlZmVyZW5jZSNnZXRTZXJ2aWNlTG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuc2VydmljZUxvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMUmVmZXJlbmNlI3NldFNlcnZpY2VMb2NhdGlvbigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTG9jYXRpb24oU3RyaW5nIHNlcnZpY2VMb2NhdGlvbikKLSAgewotICAgIHRoaXMuc2VydmljZUxvY2F0aW9uID0gc2VydmljZUxvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBwdy5wcmludGxuKCIgIFVEREkgUmVmZXJlbmNlOiAiKTsKLSAgICBwdy5wcmludGxuKCIgICAgVURESSBLZXk6ICIpOwotICAgIHB3LnByaW50bG4oIiAgICAgIHR5cGUgLi4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5rZXlUeXBlKTsKLSAgICBwdy5wcmludGxuKCIgICAgICBrZXkgLi4uLi4uLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMua2V5KTsKLSAgICBwdy5wcmludGxuKCIgICAgaW5xdWlyeVVSTCAuLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMuaW5xdWlyeVVSTCk7Ci0gICAgaWYgKHRoaXMuc2VydmljZUxvY2F0aW9uICE9IG51bGwpCi0gICAgICBwdy5wcmludGxuKCIgICAgc2VydmljZUxvY2F0aW9uIC4uLi4uLi4uLi4gIiArIHRoaXMuc2VydmljZUxvY2F0aW9uKTsKLSAgICBpZiAodGhpcy53c2RsRWxlbWVudCAhPSBudWxsKQotICAgICAgcHcucHJpbnQodGhpcy53c2RsRWxlbWVudC50b1N0cmluZygpKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudCN0b1hNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBFbGVtZW50Ci0gICAgcHcucHJpbnRsbigiICAgICAgPCIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotICAgIHB3LnByaW50KCIgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fVURESV9LRVkgKyAiICIpOwotICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX1RZUEUgKyAiPVwiIiArIGdldEtleVR5cGUoKSArICJcIj4iKTsKLSAgICBwdy5wcmludChnZXRLZXkoKSk7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fVURESV9LRVkgKyAiPiIpOwotICAgIHB3LnByaW50KCIgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fSU5RVUlSWV9VUkwgKyAiPiIpOwotICAgIHB3LnByaW50KGdldElucXVpcnlVUkwoKSk7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fSU5RVUlSWV9VUkwgKyAiPiIpOwotCi0gICAgaWYgKHRoaXMud3NkbEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHB3LnByaW50KGdldFdTRExFbGVtZW50KCkudG9YTUxTdHJpbmcobnNOYW1lKSk7Ci0KLSAgICBpZiAodGhpcy5zZXJ2aWNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwdy5wcmludCgiICAgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1NFUlZJQ0VfTE9DQVRJT04gKyAiPiIpOwotICAgICAgcHcucHJpbnQoZ2V0U2VydmljZUxvY2F0aW9uKCkpOwotICAgICAgcHcucHJpbnRsbigKLSAgICAgICAgIiAgICAgICAgPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fU0VSVklDRV9MT0NBVElPTiArICI+Iik7Ci0gICAgfQotCi0gICAgcHcucHJpbnRsbigiICAgICAgPC8iICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9XU0RMRWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9XU0RMRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4MzAxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL2ltcGwvV1NETEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVudHJ5VHlwZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogVGhlIGltcGxlbWVudGF0aW9uIGZvciBXU0RMIGRlZmluaXRpb25zLiAKLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFdTRExFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdTRExFbGVtZW50Ci17Ci0gIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZTsKLQotICAvKioKLSAgICogQHNlZSAjc2V0VHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiB0aGlzLnR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSAjZ2V0VHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkKLSAgewotICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSAjc2V0TmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgI3NldE5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5uYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgI2dldE5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkKLSAgewotICAgIHJldHVybiBuZXcgUU5hbWUodGhpcy5uYW1lc3BhY2UsIHRoaXMubmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IFdTREwgcGFyZW50IGVsZW1lbnQgbmFtZS4KLSAgICogQHNlZSAjc2V0UGFyZW50RWxlbWVudE5hbWUKLSAgCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudEVsZW1lbnROYW1lKCkKLSAgewotICAgIHJldHVybiB0aGlzLnBhcmVudEVsZW1lbnROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBXU0RMIHBhcmVudCBlbGVtZW50IG5hbWUuCi0gICAqIEBzZWUgI2dldFBhcmVudEVsZW1lbnROYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRFbGVtZW50TmFtZShTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUpCi0gIHsKLSAgICB0aGlzLnBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50RWxlbWVudE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QuYW5hbHl6ZXIuY29uZmlnLldTRExFbGVtZW50I2dldFBhcmVudEVsZW1lbnRRTmFtZSgpCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0UGFyZW50RWxlbWVudFFOYW1lKCkKLSAgewotICAgIHJldHVybiBuZXcgUU5hbWUodGhpcy5uYW1lc3BhY2UsIHRoaXMucGFyZW50RWxlbWVudE5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHBvcnQgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUG9ydCgpCi0gIHsKLSAgICByZXR1cm4gdHlwZS5lcXVhbHMoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fUE9SVCk7Ci0gIH0KLQotICAvKioKLSAgICogSXMgYmluZGluZyBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiB0eXBlLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9CSU5ESU5HKTsKLSAgfQotCi0gIC8qKgotICAgKiBJcyBwb3J0VHlwZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQb3J0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdHlwZS5lcXVhbHMoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fUE9SVFRZUEUpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNPcGVyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHR5cGUuZXF1YWxzKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTik7Ci0gIH0KLQotICAvKioKLSAgICogSXMgbWVzc2FnZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiB0eXBlLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9NRVNTQUdFKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgcHcucHJpbnRsbigiICAgIFdTREwgRWxlbWVudDogIik7Ci0gICAgcHcucHJpbnRsbigiICAgICAgdHlwZSAuLi4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLnR5cGUpOwotICAgIHB3LnByaW50bG4oIiAgICAgIG5hbWVzcGFjZSAuLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5uYW1lc3BhY2UpOwotICAgIHB3LnByaW50bG4oIiAgICAgIG5hbWUgLi4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5uYW1lKTsKLQotICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgICBwdy5wcmludGxuKCIgICAgICBwYXJlbnRFbGVtZW50TmFtZSAuLi4uLi4gIiArIHRoaXMucGFyZW50RWxlbWVudE5hbWUpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0IGFzIGFuIFhNTCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBDb25maWcgb3B0aW9ucwotICAgIHB3LnByaW50KCIgICAgICAgIDwiICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIiAiKTsKLSAgICBwdy5wcmludChXU0lDb25zdGFudHMuQVRUUl9UWVBFICsgIj1cIiIgKyBnZXRUeXBlKCkgKyAiXCIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRVNQQUNFICsgIj1cIiIgKyBnZXROYW1lc3BhY2UoKSArICJcIiAiKTsKLSAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50TmFtZSAhPSBudWxsKQotICAgICAgcHcucHJpbnQoCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1BBUkVOVF9FTEVNRU5UX05BTUUKLSAgICAgICAgICArICI9XCIiCi0gICAgICAgICAgKyBnZXRQYXJlbnRFbGVtZW50TmFtZSgpCi0gICAgICAgICAgKyAiXCIiKTsKLSAgICBwdy5wcmludCgiPiIpOwotICAgIHB3LnByaW50KGdldE5hbWUoKSk7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL2ltcGwvV1NETFJlZmVyZW5jZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9XU0RMUmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2FjNDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9XU0RMUmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gZm9yIGEgcmVmZXJlbmNlIHRvIGEgZGVzY3JpcHRpb24gYXJ0aWZhY3QuICAKLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFdTRExSZWZlcmVuY2VJbXBsIGltcGxlbWVudHMgV1NETFJlZmVyZW5jZQotewotICAvKioKLSAgICogV1NETCBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gbnVsbDsKLQotICAvKioKLSAgICogU2VydmljZSBsb2NhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZUxvY2F0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogV1NETCBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbExvY2F0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBXU0RMUmVmZXJlbmNlSW1wbCgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB3aXRoIGFsbCBzZXR0aW5ncy4KLSAgICogQHBhcmFtIHdzZGxFbGVtZW50ICAgICAgYSBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB3c2RsTG9jYXRpb24gICAgIGEgV1NETCBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHBhcmFtIHNlcnZpY2VMb2NhdGlvbiAgYSBzZXJ2aWNlIGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIFdTRExSZWZlcmVuY2VJbXBsKAotICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50LAotICAgIFN0cmluZyB3c2RsTG9jYXRpb24sCi0gICAgU3RyaW5nIHNlcnZpY2VMb2NhdGlvbikKLSAgewotICAgIHRoaXMud3NkbEVsZW1lbnQgPSB3c2RsRWxlbWVudDsKLSAgICB0aGlzLndzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvbjsKLSAgICB0aGlzLnNlcnZpY2VMb2NhdGlvbiA9IHNlcnZpY2VMb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETFJlZmVyZW5jZSNnZXRXU0RMRWxlbWVudCgpCi0gICAqLwotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMud3NkbEVsZW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExSZWZlcmVuY2Ujc2V0V1NETEVsZW1lbnQoV1NETEVsZW1lbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXU0RMRWxlbWVudChXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgewotICAgIHRoaXMud3NkbEVsZW1lbnQgPSB3c2RsRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETFJlZmVyZW5jZSNnZXRXU0RMTG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMud3NkbExvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMUmVmZXJlbmNlI3NldFdTRExMb2NhdGlvbigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXU0RMTG9jYXRpb24oU3RyaW5nIHdzZGxMb2NhdGlvbikKLSAgewotICAgIHRoaXMud3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMUmVmZXJlbmNlI2dldFNlcnZpY2VMb2NhdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExSZWZlcmVuY2Ujc2V0U2VydmljZUxvY2F0aW9uKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VMb2NhdGlvbihTdHJpbmcgc2VydmljZUxvY2F0aW9uKQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlTG9jYXRpb24gPSBzZXJ2aWNlTG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIHB3LnByaW50bG4oIiAgV1NETCBSZWZlcmVuY2U6Iik7Ci0gICAgcHcucHJpbnQodGhpcy53c2RsRWxlbWVudC50b1N0cmluZygpKTsKLSAgICBwdy5wcmludGxuKCIgICAgd3NkbFVSSSAuLi4uLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMud3NkbExvY2F0aW9uKTsKLSAgICBpZiAodGhpcy5zZXJ2aWNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICAgIHB3LnByaW50bG4oIiAgc2VydmljZUxvY2F0aW9uIC4uLi4uLi4uLi4gIiArIHRoaXMuc2VydmljZUxvY2F0aW9uKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudCN0b1hNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBFbGVtZW50Ci0gICAgcHcucHJpbnRsbigiICAgICAgPCIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotICAgIHB3LnByaW50KGdldFdTRExFbGVtZW50KCkudG9YTUxTdHJpbmcobnNOYW1lKSk7Ci0gICAgcHcucHJpbnQoIiAgICAgICAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9XU0RMX1VSSSArICI+Iik7Ci0gICAgcHcucHJpbnQoZ2V0V1NETExvY2F0aW9uKCkpOwotICAgIHB3LnByaW50bG4oIjwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1dTRExfVVJJICsgIj4iKTsKLQotICAgIGlmICh0aGlzLnNlcnZpY2VMb2NhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50KCIgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fU0VSVklDRV9MT0NBVElPTiArICI+Iik7Ci0gICAgICBwdy5wcmludChYTUxVdGlscy54bWxFc2NhcGVkU3RyaW5nKGdldFNlcnZpY2VMb2NhdGlvbigpKSk7Ci0gICAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9TRVJWSUNFX0xPQ0FUSU9OICsgIj4iKTsKLSAgICB9Ci0KLSAgICBwdy5wcmludGxuKCIgICAgICA8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2NvbW1vbi9BZGRTdHlsZVNoZWV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvY29tbW9uL0FkZFN0eWxlU2hlZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkZjdmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvY29tbW9uL0FkZFN0eWxlU2hlZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIEFkZFN0eWxlU2hlZXQgZWxlbWVudC4gCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWRkU3R5bGVTaGVldCBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fQUREX1NUWUxFX1NIRUVUOwotCi0gIC8qKgotICAgKiBHZXQgaHJlZi4KLSAgICogQHJldHVybiBocmVmLgotICAgKiBAc2VlICNzZXRIcmVmCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEhyZWYoKTsKLQotICAvKioKLSAgICogU2V0IGhyZWYuCi0gICAqIEBwYXJhbSBocmVmIGEgaHJlZi4KLSAgICogQHNlZSAjZ2V0SHJlZgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgaHJlZik7Ci0KLSAgLyoqCi0gICAqIEdldCB0eXBlLgotICAgKiBAcmV0dXJuIHR5cGUuCi0gICAqIEBzZWUgI3NldFR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotCi0gIC8qKgotICAgKiBTZXQgdHlwZS4KLSAgICogQHBhcmFtIHR5cGUgYSB0eXBlLgotICAgKiBAc2VlICNnZXRUeXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKTsKLQotICAvKioKLSAgICogR2V0IHRpdGxlLgotICAgKiBAcmV0dXJuIHRpdGxlLgotICAgKiBAc2VlICNzZXRUaXRsZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpOwotCi0gIC8qKgotICAgKiBTZXQgdGl0bGUuCi0gICAqIEBwYXJhbSB0aXRsZSBhIHRpdGxlLgotICAgKiBAc2VlICNnZXRUaXRsZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKTsKLQotICAvKioKLSAgICogR2V0IG1lZGlhLgotICAgKiBAcmV0dXJuIG1lZGlhLgotICAgKiBAc2VlICNzZXRNZWRpYQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZWRpYSgpOwotCi0gIC8qKgotICAgKiBTZXQgdGl0bGUuCi0gICAqIEBwYXJhbSBtZWRpYSBtZWRpYS4KLSAgICogQHNlZSAjZ2V0TWVkaWEKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1lZGlhKFN0cmluZyBtZWRpYSk7Ci0KLSAgLyoqCi0gICAqIEdldCBjaGFyc2V0LgotICAgKiBAcmV0dXJuIGNoYXJzZXQuCi0gICAqIEBzZWUgI3NldENoYXJzZXQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpOwotCi0gIC8qKgotICAgKiBTZXQgY2hhcnNldC4KLSAgICogQHBhcmFtIGNoYXJzZXQgY2hhcnNldC4KLSAgICogQHNlZSAjZ2V0Q2hhcnNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2hhcnNldChTdHJpbmcgY2hhcnNldCk7Ci0KLSAgLyoqCi0gICAqIEdldCBhbHRlcm5hdGUuCi0gICAqIEByZXR1cm4gYWx0ZXJuYXRlLgotICAgKiBAc2VlICNzZXRBbHRlcm5hdGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBhbHRlcm5hdGUuCi0gICAqIEBwYXJhbSBhbHRlcm5hdGUgYWx0ZXJuYXRlLgotICAgKiBAc2VlICNnZXRBbHRlcm5hdGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFsdGVybmF0ZShTdHJpbmcgYWx0ZXJuYXRlKTsKLQotICAvKioKLSAgICogU2V0IGlmIHRoZSBzdHlsZSBzaGVldCBkZWNsYXJhdGlvbiBzaG91bGQgYmUgYSBjb21tZW50LgotICAgKiBAcGFyYW0gY29tbWVudCBhIGJvb2xlYW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KGJvb2xlYW4gY29tbWVudCk7Ci0KLSAgLyoqCi0gICAqIEdldCBzdHlsZSBzaGVldCBkZWNsYXJhdGlvbi4KLSAgICogQHJldHVybiBzdHlsZSBzaGVldCBkZWNsYXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3R5bGVTaGVldFN0cmluZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2NvbW1vbi9pbXBsL0FkZFN0eWxlU2hlZXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvY29tbW9uL2ltcGwvQWRkU3R5bGVTaGVldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3OWZkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvY29tbW9uL2ltcGwvQWRkU3R5bGVTaGVldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuY29tbW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uQWRkU3R5bGVTaGVldDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gZm9yIEFkZFN0eWxlU2hlZXQgZWxlbWVudC4gCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRTdHlsZVNoZWV0SW1wbCBpbXBsZW1lbnRzIEFkZFN0eWxlU2hlZXQKLXsKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB2YWx1ZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgVHJlZU1hcCBhdHRyaWJ1dGVWYWx1ZUxpc3QgPSBuZXcgVHJlZU1hcCgpOwotCi0gIC8qKgotICAgKiBMaXN0IG9mIGF0dHJpYnV0ZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nW10gYXR0cmlidXRlTmFtZUxpc3QgPQotICAgIHsKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSX0hSRUYsCi0gICAgICBXU0lDb25zdGFudHMuQVRUUl9UWVBFLAotICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfVElUTEUsCi0gICAgICBXU0lDb25zdGFudHMuQVRUUl9NRURJQSwKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSX0NIQVJTRVQsCi0gICAgICBXU0lDb25zdGFudHMuQVRUUl9BTFRFUk5BVEUgfTsKLQotICAvKioKLSAgICogU2V0IGlmIHRoZSBzdHlsZSBzaGVldCBkZWNsYXJhdGlvbiBzaG91bGQgYmUgYSBjb21tZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY29tbWVudCA9IGZhbHNlOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuY29tbW9uLkFkZFN0eWxlU2hlZXQjZ2V0SHJlZigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEhyZWYoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpIHRoaXMuYXR0cmlidXRlVmFsdWVMaXN0LmdldChXU0lDb25zdGFudHMuQVRUUl9IUkVGKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuY29tbW9uLkFkZFN0eWxlU2hlZXQjc2V0SHJlZihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKQotICB7Ci0gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZUxpc3QucHV0KFdTSUNvbnN0YW50cy5BVFRSX0hSRUYsIGhyZWYpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5jb21tb24uQWRkU3R5bGVTaGVldCNnZXRUeXBlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZykgdGhpcy5hdHRyaWJ1dGVWYWx1ZUxpc3QuZ2V0KFdTSUNvbnN0YW50cy5BVFRSX1RZUEUpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5jb21tb24uQWRkU3R5bGVTaGVldCNzZXRUeXBlKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlTGlzdC5wdXQoV1NJQ29uc3RhbnRzLkFUVFJfVFlQRSwgdHlwZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmNvbW1vbi5BZGRTdHlsZVNoZWV0I2dldFRpdGxlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpIHRoaXMuYXR0cmlidXRlVmFsdWVMaXN0LmdldChXU0lDb25zdGFudHMuQVRUUl9USVRMRSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmNvbW1vbi5BZGRTdHlsZVNoZWV0I3NldFRpdGxlKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkKLSAgewotICAgIHRoaXMuYXR0cmlidXRlVmFsdWVMaXN0LnB1dChXU0lDb25zdGFudHMuQVRUUl9USVRMRSwgdGl0bGUpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5jb21tb24uQWRkU3R5bGVTaGVldCNnZXRNZWRpYSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lZGlhKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nKSB0aGlzLmF0dHJpYnV0ZVZhbHVlTGlzdC5nZXQoV1NJQ29uc3RhbnRzLkFUVFJfTUVESUEpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5jb21tb24uQWRkU3R5bGVTaGVldCNzZXRNZWRpYShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNZWRpYShTdHJpbmcgbWVkaWEpCi0gIHsKLSAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlTGlzdC5wdXQoV1NJQ29uc3RhbnRzLkFUVFJfTUVESUEsIG1lZGlhKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuY29tbW9uLkFkZFN0eWxlU2hlZXQjZ2V0Q2hhcnNldCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENoYXJzZXQoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpIHRoaXMuYXR0cmlidXRlVmFsdWVMaXN0LmdldChXU0lDb25zdGFudHMuQVRUUl9DSEFSU0VUKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuY29tbW9uLkFkZFN0eWxlU2hlZXQjc2V0Q2hhcnNldChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDaGFyc2V0KFN0cmluZyBjaGFyc2V0KQotICB7Ci0gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZUxpc3QucHV0KFdTSUNvbnN0YW50cy5BVFRSX0NIQVJTRVQsIGNoYXJzZXQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5jb21tb24uQWRkU3R5bGVTaGVldCNnZXRBbHRlcm5hdGUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBbHRlcm5hdGUoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpIHRoaXMuYXR0cmlidXRlVmFsdWVMaXN0LmdldChXU0lDb25zdGFudHMuQVRUUl9BTFRFUk5BVEUpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5jb21tb24uQWRkU3R5bGVTaGVldCNzZXRBbHRlcm5hdGUoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWx0ZXJuYXRlKFN0cmluZyBhbHRlcm5hdGUpCi0gIHsKLSAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlTGlzdC5wdXQoV1NJQ29uc3RhbnRzLkFUVFJfQUxURVJOQVRFLCBhbHRlcm5hdGUpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBTZXQgaWYgdGhlIHN0eWxlIHNoZWV0IGRlY2xhcmF0aW9uIHNob3VsZCBiZSBhIGNvbW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KGJvb2xlYW4gY29tbWVudCkKLSAgewotICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmNvbW1vbi5BZGRTdHlsZVNoZWV0I2dldFN0eWxlU2hlZXRTdHJpbmcoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHlsZVNoZWV0U3RyaW5nKCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzdHlsZVNoZWV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgaWYgKGNvbW1lbnQpCi0gICAgICBzdHlsZVNoZWV0LmFwcGVuZCgiPCEtLSAiKTsKLQotICAgIHN0eWxlU2hlZXQuYXBwZW5kKCI8P3htbC1zdHlsZXNoZWV0Iik7Ci0KLSAgICBTdHJpbmcgdmFsdWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVOYW1lTGlzdC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlID0gKFN0cmluZykgYXR0cmlidXRlVmFsdWVMaXN0LmdldChhdHRyaWJ1dGVOYW1lTGlzdFtpXSkpCi0gICAgICAgICE9IG51bGwpCi0gICAgICAgIHN0eWxlU2hlZXQuYXBwZW5kKCIgIiArIGF0dHJpYnV0ZU5hbWVMaXN0W2ldICsgIj1cIiIgKyB2YWx1ZSArICJcIiIpOwotICAgIH0KLQotICAgIC8vIEVuZCBlbGVtZW50Ci0gICAgc3R5bGVTaGVldC5hcHBlbmQoIiA/PiIpOwotCi0gICAgaWYgKGNvbW1lbnQpCi0gICAgICBzdHlsZVNoZWV0LmFwcGVuZCgiIC0tPiIpOwotCi0gICAgcmV0dXJuIHN0eWxlU2hlZXQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gZ2V0U3R5bGVTaGVldFN0cmluZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gQ29uZmlnIG9wdGlvbnMKLSAgICBwdy5wcmludCgiICAgICAgPCIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiICIpOwotICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX0hSRUYgKyAiPVwiIiArIGdldEhyZWYoKSArICJcIiAiKTsKLSAgICBwdy5wcmludChXU0lDb25zdGFudHMuQVRUUl9UWVBFICsgIj1cIiIgKyBnZXRUeXBlKCkgKyAiXCIgIik7Ci0gICAgaWYgKGdldFRpdGxlKCkgIT0gbnVsbCkKLSAgICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX1RJVExFICsgIj1cIiIgKyBnZXRUaXRsZSgpICsgIlwiICIpOwotICAgIGlmIChnZXRNZWRpYSgpICE9IG51bGwpCi0gICAgICBwdy5wcmludChXU0lDb25zdGFudHMuQVRUUl9NRURJQSArICI9XCIiICsgZ2V0TWVkaWEoKSArICJcIiAiKTsKLSAgICBpZiAoZ2V0Q2hhcnNldCgpICE9IG51bGwpCi0gICAgICBwdy5wcmludChXU0lDb25zdGFudHMuQVRUUl9DSEFSU0VUICsgIj1cIiIgKyBnZXRDaGFyc2V0KCkgKyAiXCIgIik7Ci0gICAgaWYgKGdldEFsdGVybmF0ZSgpICE9IG51bGwpCi0gICAgICBwdy5wcmludChXU0lDb25zdGFudHMuQVRUUl9BTFRFUk5BVEUgKyAiPVwiIiArIGdldEFsdGVybmF0ZSgpICsgIlwiICIpOwotICAgIHB3LnByaW50bG4oIi8+Iik7Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NmQyNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2RvY3VtZW50L0RvY3VtZW50RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50OwotCi0vKioKLSAqIERlZmluZXMgdGhlIGludGVyZmFjZSB1c2VkIGZvciBhbGwgQ29uZm9ybWFuY2UgWE1MIGRvY3VtZW50cy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICogUmV0dXJuIFhNTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VOYW1lICBhIG5hbWVzcGFjZSBwcmVmaXguCi0gICAqIEByZXR1cm4gWE1MIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTkwY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2RvY3VtZW50L0RvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5BbmFseXplckNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLldTSVByb3BlcnRpZXM7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBkZWZpbmVzIHRoZSBmYWN0b3J5IGludGVyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIHRvIAotICogcmVhZCBhbmQgd3JpdGUgYWxsIG9mIHRoZSBDb25mb3JtYW5jZSBYTUwgZG9jdW1lbnRzLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEb2N1bWVudEZhY3RvcnkKLXsKLSAgLyoqCi0gICAqIEdldCBhIG5ldyBpbnN0YW5jZSBvZiBhIERvY3VtZW50RmFjdG9yeS4KLSAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBhIERvY3VtZW50RmFjdG9yeS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgZHVyaW5nIGNyZWF0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBEb2N1bWVudEZhY3RvcnkgbmV3SW5zdGFuY2UoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBSZXR1cm4gaW5zdGFuY2Ugb2YgZmFjdG9yeQotICAgIHJldHVybiBuZXdJbnN0YW5jZShnZXRGYWN0b3J5Q2xhc3NOYW1lKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIG5ldyBpbnN0YW5jZSBvZiBhIERvY3VtZW50RmFjdG9yeSB1c2luZyB0aGUgc3BlY2lmaWVkCi0gICAqIGZhY3RvcnkgY2xhc3MgbmFtZS4KLSAgICogQHBhcmFtIGZhY3RvcnlDbGFzc05hbWUgZmFjdG9yeSBjbGFzcyBuYW1lLgotICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIGEgRG9jdW1lbnRGYWN0b3J5LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgY3JlYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIERvY3VtZW50RmFjdG9yeSBuZXdJbnN0YW5jZShTdHJpbmcgZmFjdG9yeUNsYXNzTmFtZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBEb2N1bWVudEZhY3RvcnkgZG9jdW1lbnRGYWN0b3J5ID0gbnVsbDsKLQotICAgIC8vIElmIGEgZmFjdG9yeSBjbGFzcyBuYW1lIHdhcyBzcGVjaWZpZWQsIHRoZW4gY3JlYXRlIG9iamVjdAotICAgIGlmIChmYWN0b3J5Q2xhc3NOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIEdldCBjbGFzcyBvYmplY3QKLSAgICAgICAgQ2xhc3MgZmFjdG9yeUNsYXNzID0gQ2xhc3MuZm9yTmFtZShmYWN0b3J5Q2xhc3NOYW1lKTsKLQotICAgICAgICAvLyBDcmVhdGUgbmV3IGZhY3RvcnkKLSAgICAgICAgZG9jdW1lbnRGYWN0b3J5ID0gKERvY3VtZW50RmFjdG9yeSkgZmFjdG9yeUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICB9Ci0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgICAiQ291bGQgbm90IGluc3RhbnRpYXRlIGRvY3VtZW50IGZhY3RvcnkgY2xhc3M6ICIKLSAgICAgICAgICAgICsgZmFjdG9yeUNsYXNzTmFtZQotICAgICAgICAgICAgKyAiLiIsCi0gICAgICAgICAgZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJBIFdTSURvY3VtZW50RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB3YXMgbm90IGZvdW5kLiIpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBmYWN0b3J5Ci0gICAgcmV0dXJuIGRvY3VtZW50RmFjdG9yeTsKLSAgfQotCi0gIC8vIERPQ1VNRU5UIFRZUEVTCi0KLSAgLyoqCi0gICAqIENyZWF0ZSBsb2cgZmlsZS4KLSAgICogQHJldHVybiBsb2cgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBMb2cgbmV3TG9nKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBtb25pdG9yIGNvbmZpZy4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIG1vbml0b3IgY29uZmlnLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IE1vbml0b3JDb25maWcgbmV3TW9uaXRvckNvbmZpZygpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYW5hbHl6ZXIgY29uZmlnLgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgYW5hbHl6ZXIgY29uZmlnLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IEFuYWx5emVyQ29uZmlnIG5ld0FuYWx5emVyQ29uZmlnKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBwcm9maWxlIGFzc2VydGlvbnMuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBwcm9maWxlIGFzc2VydGlvbnMuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgUHJvZmlsZUFzc2VydGlvbnMgbmV3UHJvZmlsZUFzc2VydGlvbnMoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIHJlcG9ydC4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBSZXBvcnQgbmV3UmVwb3J0KCk7Ci0KLSAgLy8gUkVBREVSUwotCi0gIC8qKgotICAgKiBDcmVhdGUgcHJvZmlsZSBhc3NlcnRpb25zIHJlYWRlci4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHByb2ZpbGUgYXNzZXJ0aW9ucyByZWFkZXIuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgUHJvZmlsZUFzc2VydGlvbnNSZWFkZXIgbmV3UHJvZmlsZUFzc2VydGlvbnNSZWFkZXIoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIG1vbml0b3IgY29uZmlnIHJlYWRlci4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIG1vbml0b3IgY29uZmlnIHJlYWRlci4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBNb25pdG9yQ29uZmlnUmVhZGVyIG5ld01vbml0b3JDb25maWdSZWFkZXIoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGFuYWx5emVyIGNvbmZpZyByZWFkZXIuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBhbmFseXplciBjb25maWcgcmVhZGVyLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IEFuYWx5emVyQ29uZmlnUmVhZGVyIG5ld0FuYWx5emVyQ29uZmlnUmVhZGVyKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBsb2cgcmVhZGVyLgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgbG9nIHJlYWRlci4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBMb2dSZWFkZXIgbmV3TG9nUmVhZGVyKCk7Ci0KLSAgLy8gQUREOiBBZGQgb3RoZXIgcmVhZGVycwotCi0gIC8vIFdSSVRFUlMKLQotICAvKioKLSAgICogQ3JlYXRlIHJlcG9ydCB3cml0ZXIuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCByZXBvcnQgd3JpdGVyLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFJlcG9ydFdyaXRlciBuZXdSZXBvcnRXcml0ZXIoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGxvZyB3cml0ZXIuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBsb2cgd3JpdGVyLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IExvZ1dyaXRlciBuZXdMb2dXcml0ZXIoKTsKLQotICAvLyBBREQ6IEFkZCBvdGhlciB3cml0ZXJzCi0KLSAgLyoqCi0gICAqIEZpbmQgdGhlIGZhY3RvcnkgY2xhc3MgbmFtZSB3aGljaCBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgSmF2YSBwcm9wZXJ0eS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGYWN0b3J5Q2xhc3NOYW1lKCkKLSAgewotICAgIC8vIEdldCBwcm9wZXJ0eSB2YWx1ZQotICAgIHJldHVybiBXU0lQcm9wZXJ0aWVzLmdldFByb3BlcnR5KAotICAgICAgV1NJUHJvcGVydGllcy5QUk9QX0RPQ1VNRU5UX0ZBQ1RPUlksCi0gICAgICBXU0lQcm9wZXJ0aWVzLkRFRl9ET0NVTUVOVF9GQUNUT1JZKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2RvY3VtZW50L0RvY3VtZW50UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg3Y2U1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudDsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgdXNlZCB0byByZWFkIHRoZSBDb25mb3JtYW5jZSBYTUwgZG9jdW1lbnRzLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRSZWFkZXIKLXsKLSAgLyoqCi0gICAqIEdldCBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHJldHVybiBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHNlZSAjc2V0TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKTsKLQotICAvKioKLSAgICogU2V0IGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAcGFyYW0gZG9jdW1lbnRVUkkgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqIEBzZWUgI2dldExvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgZG9jdW1lbnRVUkkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2RvY3VtZW50L0RvY3VtZW50V3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljMzkwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGludGVyZmFjZSB1c2VkIHRvIHdyaXRlIHRoZSBDb25mb3JtYW5jZSBYTUwgZG9jdW1lbnRzLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRXcml0ZXIKLXsKLSAgLyoqCi0gICAqIEdldCB0aGUgRG9jdW1lbnQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbmZvcm1hbmNlIGRvY3VtZW50LgotICAgKiBAcmV0dXJuIHRoZSBEb2N1bWVudCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29uZm9ybWFuY2UgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFNldCB3cml0ZXIuCi0gICAqIEBwYXJhbSBkb2N1bWVudExvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgZmFpbGVkIG9yIGludGVycnVwdGVkIEkvTyBvcGVyYXRpb25zLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdyaXRlcihTdHJpbmcgZG9jdW1lbnRMb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBXcml0ZSBvdXQgb25seSBhIHBhcnQgb2YgYSBkb2N1bWVudCB0byB0aGUgbG9jYXRpb24KLSAgICogdGhhdCB3YXMgcHJldmlvdXNseSBzZXQgdXNpbmcgdGhlIHNldExvY2F0aW9uIG1ldGhvZC4KLSAgICogQHBhcmFtIHJlYWRlciBhIFJlYWRlciBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIHRyb3VibGUgd3JpdGluZyBvdXQgdGhlIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBoYXMgYmVlbiBpbnZva2VkIAotICAgKiAgICAgICAgIGF0IGFuIGlsbGVnYWwgb3IgaW5hcHByb3ByaWF0ZSB0aW1lLgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoUmVhZGVyIHJlYWRlcikgdGhyb3dzIFdTSUV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBXcml0ZSBvdXQgb25seSBhIHBhcnQgb2YgYSBkb2N1bWVudC4KLSAgICogQHBhcmFtIHJlYWRlciBhIFJlYWRlciBvYmplY3QuCi0gICAqIEBwYXJhbSB3cml0ZXIgYSBXcml0ZXIgb2JqZWN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyB0cm91YmxlIHdyaXRpbmcgb3V0IHRoZSBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlKFJlYWRlciByZWFkZXIsIFdyaXRlciB3cml0ZXIpIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENsb3NlIHdyaXRlci4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgdHJvdWJsZSBjbG9zaW5nIHRoZSB3cml0ZXIuCi0gICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGhhcyBiZWVuIGludm9rZWQgCi0gICAqICAgICAgICAgYXQgYW4gaWxsZWdhbCBvciBpbmFwcHJvcHJpYXRlIHRpbWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBXU0lFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9kb2N1bWVudC9XU0lEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2RvY3VtZW50L1dTSURvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZGIwZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2RvY3VtZW50L1dTSURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQ7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgZm9yIGFsbCBDb25mb3JtYW5jZSBYTUwgZG9jdW1lbnRzLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NJRG9jdW1lbnQgZXh0ZW5kcyBEb2N1bWVudEVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGRvY3VtZW50LgotICAgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgZG9jdW1lbnQuCi0gICAqIEBzZWUgI3NldExvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIGRvY3VtZW50LgotICAgKiBAcGFyYW0gZG9jdW1lbnRVUkkgdGhlIGxvY2F0aW9uIG9mIHRoZSBkb2N1bWVudC4KLSAgICogQHNlZSAjZ2V0TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBkb2N1bWVudFVSSSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvaW1wbC9Eb2N1bWVudEZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvaW1wbC9Eb2N1bWVudEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjRkOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2RvY3VtZW50L2ltcGwvRG9jdW1lbnRGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5BbmFseXplckNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbC5BbmFseXplckNvbmZpZ0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5pbXBsLkFuYWx5emVyQ29uZmlnUmVhZGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuaW1wbC5Mb2dJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuaW1wbC5Mb2dSZWFkZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuaW1wbC5Mb2dXcml0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5pbXBsLk1vbml0b3JDb25maWdJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5pbXBsLk1vbml0b3JDb25maWdSZWFkZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLmltcGwuUHJvZmlsZUFzc2VydGlvbnNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLmltcGwuUHJvZmlsZUFzc2VydGlvbnNSZWFkZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbC5SZXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbC5SZXBvcnRXcml0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLldTSVByb3BlcnRpZXM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvbmZvcm1hbmNlIGRvY3VtZW50IGZhY3Rvcnkgd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvCi0gKiBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGRvY3VtZW50cywgcmVhZGVycyBhbmQgd3JpdGVycy4gCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50RmFjdG9yeUltcGwgZXh0ZW5kcyBEb2N1bWVudEZhY3RvcnkKLXsKLSAgLyoqCi0gICAqIERvY3VtZW50IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnRGYWN0b3J5SW1wbCgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgbG9nIGZpbGUuCi0gICAqLwotICBwdWJsaWMgTG9nIG5ld0xvZygpCi0gIHsKLSAgICByZXR1cm4gbmV3IExvZ0ltcGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgbW9uaXRvciBjb25maWcuCi0gICAqLwotICBwdWJsaWMgTW9uaXRvckNvbmZpZyBuZXdNb25pdG9yQ29uZmlnKCkKLSAgewotICAgIHJldHVybiBuZXcgTW9uaXRvckNvbmZpZ0ltcGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW5hbHl6ZXIgY29uZmlnLgotICAgKi8KLSAgcHVibGljIEFuYWx5emVyQ29uZmlnIG5ld0FuYWx5emVyQ29uZmlnKCkKLSAgewotICAgIHJldHVybiBuZXcgQW5hbHl6ZXJDb25maWdJbXBsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHByb2ZpbGUgYXNzZXJ0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBQcm9maWxlQXNzZXJ0aW9ucyBuZXdQcm9maWxlQXNzZXJ0aW9ucygpCi0gIHsKLSAgICByZXR1cm4gbmV3IFByb2ZpbGVBc3NlcnRpb25zSW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgUmVwb3J0IG5ld1JlcG9ydCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFJlcG9ydEltcGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgbW9uaXRvciBjb25maWcgcmVhZGVyLgotICAgKi8KLSAgcHVibGljIE1vbml0b3JDb25maWdSZWFkZXIgbmV3TW9uaXRvckNvbmZpZ1JlYWRlcigpCi0gIHsKLSAgICByZXR1cm4gbmV3IE1vbml0b3JDb25maWdSZWFkZXJJbXBsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGFuYWx5emVyIGNvbmZpZyByZWFkZXIuCi0gICAqLwotICBwdWJsaWMgQW5hbHl6ZXJDb25maWdSZWFkZXIgbmV3QW5hbHl6ZXJDb25maWdSZWFkZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBBbmFseXplckNvbmZpZ1JlYWRlckltcGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgcHJvZmlsZSBhc3NlcnRpb25zIHJlYWRlci4KLSAgICovCi0gIHB1YmxpYyBQcm9maWxlQXNzZXJ0aW9uc1JlYWRlciBuZXdQcm9maWxlQXNzZXJ0aW9uc1JlYWRlcigpCi0gIHsKLSAgICAvLyBSZXR1cm4gaW1wbGVtZW50YXRpb24KLSAgICByZXR1cm4gbmV3IFByb2ZpbGVBc3NlcnRpb25zUmVhZGVySW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBsb2cgcmVhZGVyLgotICAgKi8KLSAgcHVibGljIExvZ1JlYWRlciBuZXdMb2dSZWFkZXIoKQotICB7Ci0gICAgLy8gUmV0dXJuIGltcGxlbWVudGF0aW9uCi0gICAgcmV0dXJuIG5ldyBMb2dSZWFkZXJJbXBsKCk7Ci0gIH0KLQotICAvLyBXUklURVJTCi0KLSAgLyoqCi0gICAqIENyZWF0ZSBsb2cgd3JpdGVyLgotICAgKi8KLSAgcHVibGljIExvZ1dyaXRlciBuZXdMb2dXcml0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBMb2dXcml0ZXJJbXBsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgRG9jdW1lbnRSZWFkZXIuCi0gICAqLwotICBwdWJsaWMgUmVwb3J0V3JpdGVyIG5ld1JlcG9ydFdyaXRlcigpCi0gIHsKLSAgICAvLyBSZXR1cm4gaW1wbGVtZW50YXRpb24KLSAgICByZXR1cm4gbmV3IFJlcG9ydFdyaXRlckltcGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kIHRoZSBmYWN0b3J5IGNsYXNzIG5hbWUgd2hpY2ggY2FuIGJlIHNwZWNpZmllZCBhcyBhIEphdmEgcHJvcGVydHkuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzTmFtZSgpCi0gIHsKLSAgICAvLyBHZXQgcHJvcGVydHkgdmFsdWUKLSAgICByZXR1cm4gV1NJUHJvcGVydGllcy5nZXRQcm9wZXJ0eSgKLSAgICAgIFdTSVByb3BlcnRpZXMuUFJPUF9ET0NVTUVOVF9GQUNUT1JZLAotICAgICAgV1NJUHJvcGVydGllcy5ERUZfRE9DVU1FTlRfRkFDVE9SWSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9kb2N1bWVudC9pbXBsL0RvY3VtZW50V3JpdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2RvY3VtZW50L2ltcGwvRG9jdW1lbnRXcml0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTllMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2RvY3VtZW50L2ltcGwvRG9jdW1lbnRXcml0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiwgQmVhY29uIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNICAgICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgQmVhY29uSVQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50V3JpdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gd3JpdGUgdGhlIENvbmZvcm1hbmNlIFhNTCAKLSAqIGRvY3VtZW50cy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG9jdW1lbnRXcml0ZXJJbXBsIGltcGxlbWVudHMgRG9jdW1lbnRXcml0ZXIKLXsKLSAgLyoqCi0gICAqIERvY3VtZW50IHdyaXRlci4KLSAgICovCi0gIHByb3RlY3RlZCBXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50V3JpdGVyI2dldERvY3VtZW50KCkKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQUREOgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudFdyaXRlciNzZXRXcml0ZXIoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3JpdGVyKFN0cmluZyBkb2N1bWVudExvY2F0aW9uKQotICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgewotICAgIC8vIEkxOE46IDIwMDMuMDIuMjYgbW9kaWZpZWQgYnkgSy5OYWthZ29tZUBCZWFjb25JVCAKLSAgICB0aGlzLndyaXRlciA9Ci0gICAgICBuZXcgUHJpbnRXcml0ZXIoCi0gICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0oZG9jdW1lbnRMb2NhdGlvbiksCi0gICAgICAgICAgIlVURi04IikpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudFdyaXRlciN3cml0ZShSZWFkZXIpCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoUmVhZGVyIHJlYWRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgewotICAgIC8vIElmIHRoZSB3cml0ZXIgd2FzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgaWYgKHdyaXRlciA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ291bGQgbm90IHdyaXRlIGRvY3VtZW50IHNpbmNlIHdyaXRlciB3YXMgbm90IHNldC4iKTsKLQotICAgIHdyaXRlKHJlYWRlciwgd3JpdGVyKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRXcml0ZXIjd3JpdGUoUmVhZGVyLCBXcml0ZXIpCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoUmVhZGVyIHJlYWRlciwgV3JpdGVyIHdyaXRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgYnVmZmVyZWQgcmVhZGVyCi0gICAgQnVmZmVyZWRSZWFkZXIgYnVmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7Ci0KLSAgICAvLyBDcmVhdGUgcHJpbnQgd3JpdGVyCi0gICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKLQotICAgIFN0cmluZyBuZXh0TGluZSA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBSZWFkIGVhY2ggbGluZSBmcm9tIHRoZSByZWFkZXIKLSAgICAgIHdoaWxlICgobmV4dExpbmUgPSBidWZSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gV3JpdGUgdGV4dCBhbmQgZmx1c2ggc3RyZWFtCi0gICAgICAgIHByaW50V3JpdGVyLnByaW50bG4obmV4dExpbmUpOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3Qgd3JpdGUgZG9jdW1lbnQuIiwgZSk7Ci0gICAgfQotCi0gICAgLy8gRmx1c2ggYW5kIGNsb3NlIHRoZSB3cml0ZXIKLSAgICBwcmludFdyaXRlci5mbHVzaCgpOwotICAgIC8vcHJpbnRXcml0ZXIuY2xvc2UoKTsgICAgCi0gIH0KLQotICAvKioKLSAgICogQ2xvc2Ugd3JpdGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgV1NJRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgewotICAgIC8vIElmIHRoZSB3cml0ZXIgd2FzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgaWYgKHdyaXRlciA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ291bGQgbm90IHdyaXRlIGxvZyBmaWxlIHNpbmNlIHdyaXRlciB3YXMgbm90IHNldC4iKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIENsb3NlIHRoZSB3cml0ZXIKLSAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgIH0KLQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbihpb2UudG9TdHJpbmcoKSwgaW9lKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9Mb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZWI5ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9Mb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LldTSURvY3VtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBtZXNzYWdlIGxvZyBmaWxlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9nIGV4dGVuZHMgV1NJRG9jdW1lbnQKLXsKLSAgLyoqCi0gICAqIEVsZW1lbnQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTkFNRSA9IFdTSUNvbnN0YW50cy5FTEVNX0xPRzsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfTE9HLCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBBZGQgbWVzc2FnZSB0byBsb2cgZmlsZS4gIFRoZSBtZXNzYWdlIHdpbGwgY29udGFpbiBib3RoIAotICAgKiB0cmFuc3BvcnQgYW5kIGNvbnRlbnQgaW5mb3JtYXRpb24uCi0gICAqIEBwYXJhbSBsb2dFbnRyeSBtZXNzYWdlIGNvbnRhaW5pbmcgYm90aCB0cmFuc3BvcnQgYW5kIGNvbnRlbnQgaW5mb3JtYXRpb24uCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGFkZGluZyB0aGUgbWVzc2FnZSB0byBsb2cgZmlsZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZExvZ0VudHJ5KE1lc3NhZ2VFbnRyeSBsb2dFbnRyeSkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogR2V0IHRoZSBudW1iZXIgb2YgbG9nIGVudHJpZXMuCi0gICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsb2cgZW50cmllcy4gCi0gICAqLwotICBwdWJsaWMgaW50IGdldEVudHJ5Q291bnQoKTsKLQotICAvKioKLSAgICogR2V0IGEgc3BlY2lmaWMgbG9nIGZpbGUgZW50cnkuIAotICAgKiBAcGFyYW0gaW5kZXggaW5kZXggaW50byBsb2cgZW50cmllcy4KLSAgICogQHJldHVybiBsb2cgZmlsZSBlbnRyeSBhdCBzcGVjaWZpZWQgaW5kZXguCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZUVudHJ5IGdldExvZ0VudHJ5KGludCBpbmRleCk7Ci0KLSAgLyoqCi0gICAqIEdldCBsb2cgZW50cnkgbGlzdC4KLSAgICogQHJldHVybiBsaXN0IG9mIGxvZyBlbnRyaWVzLgotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRMb2dFbnRyeUxpc3QoKTsKLQotICAvKioKLSAgICogR2V0IGxhc3QgbG9nIGVudHJ5LgotICAgKiBAcmV0dXJuIGFzdCBsb2cgZW50cnkuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZUVudHJ5IGdldExhc3RMb2dFbnRyeSgpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgbG9nIGVudHJ5IG9iamVjdC4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIGxvZyBlbnRyeS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlRW50cnkgY3JlYXRlTG9nRW50cnkoKTsKLQotICAvKioKLSAgICogU2V0IHN0eWxlIHNoZWV0IHN0cmluZy4KLSAgICogQHBhcmFtIHN0eWxlU2hlZXRTdHJpbmcgYSBzdHlsZSBzaGVldCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdHlsZVNoZWV0U3RyaW5nKFN0cmluZyBzdHlsZVNoZWV0U3RyaW5nKTsKLQotICAvKioKLSAgICogR2V0IHN0YXJ0IGVsZW1lbnQgc3RyaW5nLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSBhIG5hbWVzcGFjZSBwcmVmaXguCi0gICAqIEByZXR1cm4gc3RhcnQgZWxlbWVudCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0YXJ0WE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKTsKLQotICAvKioKLSAgICogR2V0IGVuZCBlbGVtZW50IHN0cmluZy4KLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgYSBuYW1lc3BhY2UgcHJlZml4LgotICAgKiBAcmV0dXJuIGVuZCBlbGVtZW50IHN0cmluZy4gCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVuZFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL0xvZ1JlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9Mb2dSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiNzFmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL0xvZ1JlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGludGVyZmFjZSB1c2VkIHRvIHJlYWQgdGhlIExvZyBmaWxlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBOZWlsIERlbGltYSAobmRkZWxpbWFAY2EuaWJtLmNvbSkKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvZ1JlYWRlciBleHRlbmRzIERvY3VtZW50UmVhZGVyCi17Ci0gIC8qKgotICAgKiBTdGFydCByZWFkaW5nIGxvZyBlbnRyaWVzIGZyb20gYSBzcGVjaWZpZWQgVVJJIGxvY2F0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2suCi0gICAqIAotICAgKiBAcGFyYW0gbG9nVVJJIHRoZSBsb2NhdGlvbiBvZiB0aGUgbG9nIGZpbGUuCi0gICAqIEBwYXJhbSBsb2dFbnRyeUhhbmRsZXIgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gcHJvY2VzcyBlYWNoIGxvZyBlbnRyeS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSByZWFkaW5nIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRMb2coU3RyaW5nIGxvZ1VSSSwgTWVzc2FnZUVudHJ5SGFuZGxlciBsb2dFbnRyeUhhbmRsZXIpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogU3RhcnQgcmVhZGluZyBsb2cgZW50cmllcyBmcm9tIGEgcmVhZGVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2suCi0gICAqIAotICAgKiBAcGFyYW0gcmVhZGVyIHRoZSBzb3VyY2UgZm9yIHRoZSBsb2cgZmlsZS4KLSAgICogQHBhcmFtIGxvZ0VudHJ5SGFuZGxlciB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0byBwcm9jZXNzIGVhY2ggbG9nIGVudHJ5LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtIHJlYWRpbmcgbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZExvZyhSZWFkZXIgcmVhZGVyLCBNZXNzYWdlRW50cnlIYW5kbGVyIGxvZ0VudHJ5SGFuZGxlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8vIEFERDogRG8gd2UgbmVlZCB0byBhZGQgZnVuY3Rpb25zIHRoYXQgd2lsbCByZWFkIHRoZSBlbnRpcmUgbG9nIGZpbGU/Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL0xvZ1dyaXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9Mb2dXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZlZTZmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL0xvZ1dyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nOwotCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgdG8gd3JpdGUgdGhlIExvZyBmaWxlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBOZWlsIERlbGltYSAobmRkZWxpbWFAY2EuaWJtLmNvbSkKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvZ1dyaXRlciBleHRlbmRzIERvY3VtZW50V3JpdGVyCi17Ci0gIC8qKgotICAgKiBXcml0ZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBkb2N1bWVudCB1c2luZyB0aGUgbG9jYXRpb24KLSAgICogdGhhdCB3YXMgcHJldmlvdXNseSBzZXQgdXNpbmcgdGhlIHNldExvY2F0aW9uIG1ldGhvZC4KLSAgICogQHBhcmFtIGxvZyB0aGUgTG9nIG9iamVjdC4KLSAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaGFzIGJlZW4gaW52b2tlZCAKLSAgICogICAgICAgICBhdCBhbiBpbGxlZ2FsIG9yIGluYXBwcm9wcmlhdGUgdGltZQotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgdGhlIHdyaXRpbmcgb2YgCi0gICAqICAgICAgICAgdGhlIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlKExvZyBsb2cpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogV3JpdGUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBsb2cgdGhlIExvZyBvYmplY3QuCi0gICAqIEBwYXJhbSB3cml0ZXIgYSBXcml0ZXIgb2JqZWN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgdGhlIHdyaXRpbmcgb2YgCi0gICAqICAgICAgICAgdGhlIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlKExvZyBsb2csIFdyaXRlciB3cml0ZXIpIHRocm93cyBXU0lFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL01lc3NhZ2VFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9NZXNzYWdlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1OGZmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL01lc3NhZ2VFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2c7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuZG9tLkVsZW1lbnRMb2NhdGlvbjsKLQotLyoqCi0qIE1lc3NhZ2UgZW50cnkgaW50ZXJmYWNlLgotKgotKiBAdmVyc2lvbiAxLjAuMQotKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VFbnRyeSBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotIC8qKgotICAqIEVsZW1lbnQgbmFtZS4KLSAgKi8KLSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9NRVNTQUdFX0VOVFJZOwotCi0gLyoqCi0gICogUU5hbWUuCi0gICovCi0gcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfTE9HLCBFTEVNX05BTUUpOwotCi0gLyoqCi0gICogVHlwZSBvZiBsb2cgZW50cnkuCi0gICovCi0gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9SRVFVRVNUID0gInJlcXVlc3QiOwotIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfUkVTUE9OU0UgPSAicmVzcG9uc2UiOwotCi0gLyoqCi0gICogR2V0cyB0aGUgaWQuCi0gICogQHJldHVybiB0aGUgaWQuCi0gICogQHNlZSAjc2V0SWQKLSAgKi8KLSBwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSBpZC4KLSAgKiBAcGFyYW0gaWQgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2cgZW50cnkuCi0gICogQHNlZSAjZ2V0SWQKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpOwotCi0gLyoqCi0gICogR2V0cyB0aGUgY29udmVyc2F0aW9uIGlkLgotICAqIEByZXR1cm4gdGhlIGNvbnZlcnNhdGlvbiBpZC4KLSAgKiBAc2VlICNzZXRDb252ZXJzYXRpb25JZAotICAqLwotIHB1YmxpYyBTdHJpbmcgZ2V0Q29udmVyc2F0aW9uSWQoKTsKLQotIC8qKgotICAqIFNldHMgdGhlIGNvbnZlcnNhdGlvbiBpZC4KLSAgKiBAcGFyYW0gY29udmVyc2F0aW9uSWQgdGhlIGNvbnZlcnNhdGlvbiBpZC4KLSAgKiBAc2VlICNnZXRDb252ZXJzYXRpb25JZAotICAqLwotIHB1YmxpYyB2b2lkIHNldENvbnZlcnNhdGlvbklkKFN0cmluZyBjb252ZXJzYXRpb25JZCk7Ci0KLSAvKioKLSAgKiBHZXRzIHRoZSB0aW1lc3RhbXAuCi0gICogQHJldHVybiB0aGUgdGltZXN0YW1wLgotICAqIEBzZWUgI3NldFRpbWVzdGFtcAotICAqLwotIHB1YmxpYyBTdHJpbmcgZ2V0VGltZXN0YW1wKCk7Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSB0aW1lc3RhbXAuCi0gICogQHBhcmFtIHRpbWVzdGFtcCB0aGUgdGltZXN0YW1wLgotICAqIEBzZWUgI2dldFRpbWVzdGFtcAotICAqLwotIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChTdHJpbmcgdGltZXN0YW1wKTsKLQotIC8qKgotICAqIEdldHMgdGhlIHR5cGUuCi0gICogQHJldHVybiB0aGUgdHlwZS4KLSAgKiBAc2VlICNzZXRUeXBlCi0gICovCi0gcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSB0eXBlLgotICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlLgotICAqIEBzZWUgI2dldFR5cGUKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKTsKLQotIC8qKgotICAqIEdldHMgdGhlIHNlbmRlciBob3N0IGFuZCBwb3J0LgotICAqIEByZXR1cm4gIHRoZSBzZW5kZXIgaG9zdCBhbmQgcG9ydC4KLSAgKiBAc2VlICNzZXRTZW5kZXJIb3N0QW5kUG9ydAotICAqLwotIHB1YmxpYyBTdHJpbmcgZ2V0U2VuZGVySG9zdEFuZFBvcnQoKTsKLQotIC8qKgotICAqIFNldHMgdGhlIHNlbmRlciBob3N0IGFuZCBwb3J0LgotICAqIEBwYXJhbSBzZW5kZXJIb3N0QW5kUG9ydCB0aGUgc2VuZGVyIGhvc3QgYW5kIHBvcnQuCi0gICogQHNlZSAjZ2V0U2VuZGVySG9zdEFuZFBvcnQKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRTZW5kZXJIb3N0QW5kUG9ydChTdHJpbmcgc2VuZGVySG9zdEFuZFBvcnQpOwotCi0gLyoqCi0gICogR2V0cyB0aGUgcmVjZWl2ZXIgaG9zdCBhbmQgcG9ydC4KLSAgKiBAcmV0dXJuIHRoZSByZWNlaXZlciBob3N0IGFuZCBwb3J0LgotICAqIEBzZWUgI3NldFJlY2VpdmVySG9zdEFuZFBvcnQKLSAgKi8KLSBwdWJsaWMgU3RyaW5nIGdldFJlY2VpdmVySG9zdEFuZFBvcnQoKTsKLQotIC8qKgotICAqIFNldHMgdGhlIHJlY2VpdmVyIGhvc3QgYW5kIHBvcnQuCi0gICogQHBhcmFtIHJlY2VpdmVySG9zdEFuZFBvcnQgdGhlIHJlY2VpdmVyIGhvc3QgYW5kIHBvcnQuCi0gICogQHNlZSAjZ2V0UmVjZWl2ZXJIb3N0QW5kUG9ydAotICAqLwotIHB1YmxpYyB2b2lkIHNldFJlY2VpdmVySG9zdEFuZFBvcnQoU3RyaW5nIHJlY2VpdmVySG9zdEFuZFBvcnQpOwotCi0gLyoqCi0gICogR2V0cyB0aGUgbWVzc2FnZS4KLSAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlLgotICAqIEBzZWUgI3NldE1lc3NhZ2UKLSAgKi8KLSBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKLQotIC8qKgotICAqIFNldHMgdGhlIG1lc3NhZ2UuCi0gICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UuCi0gICogQHNlZSAjZ2V0TWVzc2FnZQotICAqLwotIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpOwotCi0gLyoqCi0gICogU2V0cyB0aGUgZW5jb2RpbmcuCi0gICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZy4KLSAgKiBAc2VlICNnZXRNZXNzYWdlCi0gICovCi0gcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKTsKLQotIC8qKgotICAqIEdldHMgdGhlIEJPTS4KLSAgKiBAcmV0dXJuIHRoZSBCT00uCi0gICogQHNlZSAjc2V0Qk9NCi0gICovCi0gcHVibGljIGludCBnZXRCT00oKTsKLQotIC8qKgotICAqIFNldHMgdGhlIEJPTS4KLSAgKiBAcGFyYW0gYm9tIHRoZSBCT00uCi0gICogQHNlZSAjZ2V0Qk9NCi0gICovCi0gcHVibGljIHZvaWQgc2V0Qk9NKGludCBib20pOwotCi0gLyoqCi0gICogR2V0cyB0aGUgSFRUUCBoZWFkZXJzLgotICAqIEByZXR1cm4gdGhlIEhUVFAgaGVhZGVycy4KLSAgKiBAc2VlICNzZXRIVFRQSGVhZGVycwotICAqLwotIHB1YmxpYyBTdHJpbmcgZ2V0SFRUUEhlYWRlcnMoKTsKLQotIC8qKgotICAqIFNldHMgdGhlIEhUVFAgaGVhZGVycy4KLSAgKiBAcGFyYW0gaHR0cEhlYWRlcnMgdGhlIEhUVFAgaGVhZGVycy4KLSAgKiBAc2VlICNnZXRIVFRQSGVhZGVycwotICAqLwotIHB1YmxpYyB2b2lkIHNldEhUVFBIZWFkZXJzKFN0cmluZyBodHRwSGVhZGVycyk7Ci0KLSAvKioKLSAgKiBHZXRzIGVsZW1lbnQgbG9jYXRpb24uCi0gICogQHJldHVybiBlbGVtZW50IGxvY2F0aW9uLgotICAqIEBzZWUgI3NldEVsZW1lbnRMb2NhdGlvbgotICAqLwotIHB1YmxpYyBFbGVtZW50TG9jYXRpb24gZ2V0RWxlbWVudExvY2F0aW9uKCk7Ci0KLSAvKioKLSAgKiBTZXRzIGVsZW1lbnQgbG9jYXRpb24uCi0gICogQHBhcmFtIGVsZW1lbnRMb2NhdGlvbiBlbGVtZW50IGxvY2F0aW9uLgotICAqIEBzZWUgI2dldEVsZW1lbnRMb2NhdGlvbgotICAqLwotIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRMb2NhdGlvbihFbGVtZW50TG9jYXRpb24gZWxlbWVudExvY2F0aW9uKTsKLSAKLSAvKioKLSAgKiBJZiBjb250ZW50IGlzIE1JTUUgdHlwZSByZXR1cm5zIHRydWUsIG90aGVyd2lzZSBmYWxzZSAgCi0gICogQHJldHVybiBpZiBjb250ZW50IGlzIE1JTUUgdHlwZSByZXR1cm5zIHRydWUsIG90aGVyd2lzZSBmYWxzZQotICAqLwotIHB1YmxpYyBib29sZWFuIGlzTWltZUNvbnRlbnQoKTsKLSAKLSAvKioKLSAgKiBTZXQgZmxhZyB0byBkZXRlcm1pbmUgaWYgY29udGVudCBpcyBNSU1FIHR5cGUuIAotICAqIEBwYXJhbSBpc01pbWVDb250ZW50IGEgYm9vb2xlYW4gdmFsdWUKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRNaW1lQ29udGVudChib29sZWFuIGlzTWltZUNvbnRlbnQpOwotCi0gLyoqCi0gICogUmV0dXJucyBhcnJheSBvZiB0aGUgTUlNRSBwYXJ0cyBvZiB0aGUgbWVzc2FnZS4KLSAgKiBAcmV0dXJuIGFycmF5IG9mIHRoZSBNSU1FIHBhcnRzIG9mIHRoZSBtZXNzYWdlLgotICAqIEBzZWUgI2lzTUlNRUNvbnRlbnQoKSAKLSAgKi8KLSBwdWJsaWMgTWltZVBhcnRzIGdldE1pbWVQYXJ0cygpOwotIAotIC8qKgotICAqIFNldHMgdGhlIE1JTUUgcGFydHMgb2YgdGhlIG1lc3NhZ2UuCi0gICogQHBhcmFtIG1pbWVQYXJ0cyBoZSBNSU1FIHBhcnRzIG9mIHRoZSBtZXNzYWdlLgotICAqIEBzZWUgI2dldE1pbWVQYXJ0cwotICAqLwotIHB1YmxpYyB2b2lkIHNldE1pbWVQYXJ0cyhNaW1lUGFydHMgbWltZVBhcnRzKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9NZXNzYWdlRW50cnlIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL01lc3NhZ2VFbnRyeUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwMWUyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL01lc3NhZ2VFbnRyeUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5BcnRpZmFjdFJlZmVyZW5jZTsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBNZXNzYWdlRW50cnkgaGFuZGxlci4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQGF1dGhvciBHcmFoYW0gVHVycmVsbCAoZ3R1cnJlbGxAdWsuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlRW50cnlIYW5kbGVyCi17Ci0gIC8qKgotICAgKiBQcm9jZXNzIGFydGlmYWN0IHJlZmVyZW5jZS4KLSAgICogQHBhcmFtIGFydGlmYWN0UmVmZXJlbmNlIGFydGlmYWN0IHJlZmVyZW5jZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgd2hpbGUgcHJvY2Vzc2luZyBhcnRpZmFjdCByZWZlcmVuY2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcm9jZXNzQXJ0aWZhY3RSZWZlcmVuY2UoQXJ0aWZhY3RSZWZlcmVuY2UgYXJ0aWZhY3RSZWZlcmVuY2UpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUHJvY2VzcyBhIHNpbmdsZSBsb2cgZW50cnkuCi0gICAqIEBwYXJhbSBlbnRyeUNvbnRleHQgYSBzaW5nbGUgbG9nIGVudHJ5LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciB3aGlsZSBwcm9jZXNzaW5nIGEgc2luZ2xlIGxvZyBlbnRyeS4KLSAgCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcm9jZXNzTG9nRW50cnkoRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvTWltZVBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvTWltZVBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2ODc5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL01pbWVQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjIsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50OwotCi0vKioKLSAqIEBhdXRob3IgbGF1em9uZAotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLQotICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWltZVBhcnQgZXh0ZW5kcyBEb2N1bWVudEVsZW1lbnQgewotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCBmb3IgdGhlIG1pbWUgcGFydC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtaW1lIGNvbnRlbnQuCi0JICogQHNlZSAjc2V0Q29udGVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudCBmb3IgdGhlIG1pbWUgcGFydC4KLQkgKiAKLQkgKiBAcGFyYW0gbWltZUNvbnRlbnQKLQkgKiAgICAgICAgICAgIHRoZSBtaW1lIGNvbnRlbnQuCi0JICogQHNlZSAjZ2V0Q29udGVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoU3RyaW5nIG1pbWVDb250ZW50KTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGhlYWRlcnMgZm9yIHRoZSBtaW1lIHBhcnQuCi0JICogCi0JICogQHJldHVybiB0aGUgbWltZSBoZWFkZXJzLgotCSAqIEBzZWUgI3NldE1pbWVIZWFkZXJzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIZWFkZXJzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBoZWFkZXJzIGZvciB0aGUgbWltZSBwYXJ0LgotCSAqIAotCSAqIEBwYXJhbSBtaW1lSGVhZGVycwotCSAqICAgICAgICAgICAgdGhlIG1pbWUgaGVhZGVycy4KLQkgKiBAc2VlICNnZXRIZWFkZXJzCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVhZGVycyhTdHJpbmcgbWltZUhlYWRlcnMpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYm91bmRhcnkgc3RyaW5ncyBmb3IgdGhlIG1pbWUgcGFydC4gTm90ZSB0aGF0IHRoZSBsYXN0IHBhcnQgb2YgYQotCSAqIG11bHRpcGFydC8gcmVsYXRlZCBtZXNzYWdlIHdpbGwgaGF2ZSAyIGJvdW5kYXJ5IHN0cmluZ3MuIEFsbCBvdGhlciBwYXJ0cwotCSAqIHdpbGwgaGF2ZSBvbmUuCi0JICogCi0JICogQHJldHVybiB0aGUgYm91bmRhcnkgc3RyaW5ncy4KLQkgKiBAc2VlICNzZXRCb3VuZGFyeVN0cmluZ3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Qm91bmRhcnlTdHJpbmdzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBib3VuZGFyeSBzdHJpbmdzIGZvciB0aGUgbWltZSBwYXJ0LiBOb3RlIHRoYXQgdGhlIGxhc3QgcGFydCBvZiBhCi0JICogbXVsdGlwYXJ0LyByZWxhdGVkIG1lc3NhZ2Ugd2lsbCBoYXZlIDIgYm91bmRhcnkgc3RyaW5ncy4gQWxsIG90aGVyIHBhcnRzCi0JICogd2lsbCBoYXZlIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gYm91bmRhcnlTdHJpbmdzCi0JICogICAgICAgICAgICB0aGUgYm91bmRhcnkgc3RyaW5ncy4KLQkgKiBAc2VlICNnZXRCb3VuZGFyeVN0cmluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3VuZGFyeVN0cmluZ3MoU3RyaW5nW10gbWltZUhlYWRlcnMpOwotCi0JcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL01pbWVQYXJ0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9NaW1lUGFydHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlM2YxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL01pbWVQYXJ0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIE1pbWUgcGFydHMgaW50ZXJmYWNlLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiAobGF1em9uZEBjYS5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1pbWVQYXJ0cwotewotICAvKioKLSAgICogUmV0dXJucyB0aGUgc3RhcnQgYXR0cmlidXRlIHZhbHVlIGZyb20gdGhlIC4KLSAgICogQHJldHVybiB0aGUgaGUgc3RhcnQgYXR0cmlidXRlIHZhbHVlLgotICAgKiBAc2VlICNzZXRSb290UGFydAotICAgKi8KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJvb3QgcGFydCwgb3RoZXJ3aXNlIG51bGwuCi0gICAqIEByZXR1cm4gdGhlIHJvb3QgcGFydC4KLSAgICogQHNlZSAjc2V0Um9vdFBhcnQKLSAgICovCi0gIHB1YmxpYyBNaW1lUGFydCBnZXRSb290UGFydCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByb290IHBhcnQuCi0gICAqIEBwYXJhbSByb290UGFydCB0aGUgcm9vdCBwYXJ0LgotICAgKiBAc2VlICNnZXRSb290UGFydAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdFBhcnQoTWltZVBhcnQgcm9vdFBhcnQpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFydHMuCi0gICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJ0cy4KLSAgICovCi0gIHB1YmxpYyBpbnQgY291bnQoKTsKLQotICAvKioKLSAgICogR2V0cyB0aGUgY29udmVyc2F0aW9uIGlkLgotICAgKiBAcmV0dXJuIHRoZSBjb252ZXJzYXRpb24gaWQuCi0gICAqIEBzZWUgI3NldENvbnZlcnNhdGlvbklkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQYXJ0KE1pbWVQYXJ0IHBhcnQpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBtaW1lIHBhcnRzLgotICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBtaW1lIHBhcnRzLgotICAgKi8KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0UGFydHMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvaW1wbC9Mb2dJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTG9nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjc2ODdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvaW1wbC9Mb2dJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UZXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBtZXNzYWdlIGxvZyBmaWxlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dJbXBsIGltcGxlbWVudHMgTG9nCi17Ci0gIC8qKgotICAgKiBMb2cgVVJJLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsb2dVUkkgPSBudWxsOwotCi0gIC8qKgotICAgKiBTdGFydCB0aW1lIHN0YW1wLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBzdGFydFRpbWVzdGFtcCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIExvZyBlbnRyaWVzLgotICAgKi8KLSAgcHJvdGVjdGVkIFZlY3RvciBsb2dFbnRyeUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgLyoqCi0gICAqIExhc3QgbG9nIGVudHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2VFbnRyeSBsYXN0TG9nRW50cnkgPSBudWxsOwotCi0gIC8qKgotICAgKiBMb2cgdGl0bGUuCi0gICAqLwotICAvLyBBREQ6IFNob3VsZCB3ZSBwcm92aWRlIGEgd2F5IHRvIHNldCB0aGUgbG9nIHRpdGxlPwotICBwcm90ZWN0ZWQgU3RyaW5nIGxvZ1RpdGxlID0gIk1lc3NhZ2UgTG9nIEZpbGUiOwotCi0gIC8qKgotICAgKiBTdHlsZSBzaGVldCBzdHJpbmcuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHN0eWxlU2hlZXRTdHJpbmcgPSBudWxsOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nI2FkZExvZ0VudHJ5KExvZ0VudHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTG9nRW50cnkoTWVzc2FnZUVudHJ5IGxvZ0VudHJ5KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBTYXZlIGxhc3QgbG9nIGVudHJ5Ci0gICAgbGFzdExvZ0VudHJ5ID0gbG9nRW50cnk7Ci0KLSAgICAvLyBBZGQgbG9nIGVudHJ5Ci0gICAgbG9nRW50cnlMaXN0LmFkZChsb2dFbnRyeSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZyNnZXRFbnRyeUNvdW50KCkKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RW50cnlDb3VudCgpCi0gIHsKLSAgICByZXR1cm4gbG9nRW50cnlMaXN0LnNpemUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nI2dldExvZ0VudHJ5KGludCkKLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlRW50cnkgZ2V0TG9nRW50cnkoaW50IGluZGV4KQotICB7Ci0gICAgcmV0dXJuIChNZXNzYWdlRW50cnkpIGxvZ0VudHJ5TGlzdC5lbGVtZW50QXQoaW5kZXgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2cjZ2V0TG9nRW50cnlMaXN0KCkKLSAgICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0TG9nRW50cnlMaXN0KCkKLSAgewotICAgIHJldHVybiBsb2dFbnRyeUxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGxhc3QgbG9nIGVudHJ5LgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VFbnRyeSBnZXRMYXN0TG9nRW50cnkoKQotICB7Ci0gICAgcmV0dXJuIGxhc3RMb2dFbnRyeTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgbG9nIGVudHJ5IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlRW50cnkgY3JlYXRlTG9nRW50cnkoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBNZXNzYWdlRW50cnlJbXBsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuV1NJRG9jdW1lbnQjZ2V0TG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5sb2dVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuV1NJRG9jdW1lbnQjc2V0TG9jYXRpb24oU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGRvY3VtZW50VVJJKQotICB7Ci0gICAgdGhpcy5sb2dVUkkgPSBkb2N1bWVudFVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgc3R5bGUgc2hlZXQgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3R5bGVTaGVldFN0cmluZyhTdHJpbmcgc3R5bGVTaGVldFN0cmluZykKLSAgewotICAgIHRoaXMuc3R5bGVTaGVldFN0cmluZyA9IHN0eWxlU2hlZXRTdHJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0YXJ0IGVsZW1lbnQgc3RyaW5nLiAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIENyZWF0ZSByZXBvcnQgZWxlbWVudCAKLSAgICBwdy5wcmludGxuKFdTSUNvbnN0YW50cy5YTUxfREVDTCk7Ci0gICAgaWYgKHRoaXMuc3R5bGVTaGVldFN0cmluZyAhPSBudWxsKQotICAgICAgcHcucHJpbnRsbih0aGlzLnN0eWxlU2hlZXRTdHJpbmcpOwotCi0gICAgLy8gQWRkIFhNTCBjb21tZW50Ci0gICAgU3RyaW5nIGNvbW1lbnQ7Ci0gICAgaWYgKChjb21tZW50ID0gVGVzdFV0aWxzLmdldFhNTENvbW1lbnQoKSkgIT0gbnVsbCkKLSAgICAgIHB3LnByaW50KGNvbW1lbnQpOwotCi0gICAgLy8gTG9nCi0gICAgcHcucHJpbnQoIjwiICsgbnNOYW1lICsgRUxFTV9OQU1FKTsKLQotICAgIC8vIFJFTU9WRUQ6IE5vIGxvbmdlciByZXF1aXJlZCBieSB0aGUgbW9uaXRvciBzcGVjCi0gICAgLy9wdy5wcmludCgiICIgKyBXU0lDb25zdGFudHMuQVRUUl9OQU1FICsgIj1cIiIgKyBsb2dUaXRsZSArICJcIiIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICAiICIgKyBXU0lDb25zdGFudHMuQVRUUl9USU1FU1RBTVAgKyAiPVwiIiArIFV0aWxzLmdldFRpbWVzdGFtcCgpICsgIlwiIik7Ci0gICAgcHcucHJpbnRsbigiICAgIHhtbG5zPVwiIiArIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0xPRyArICJcIiIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICAiICAgIHhtbG5zOiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfTkFNRV9XU0lfTU9OSVRPUl9DT05GSUcKLSAgICAgICAgKyAiPVwiIgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX01PTklUT1JfQ09ORklHCi0gICAgICAgICsgIlwiIik7Ci0gICAgLy9wdy5wcmludGxuKCIgICAgeG1sbnM6IiArIFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9DT01NT04gKyAiPVwiIiArIAotICAgIC8vICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfQ09NTU9OICsgIlwiIik7Ci0gICAgcHcucHJpbnRsbigKLSAgICAgICIgICAgeG1sbnM6IgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19OQU1FX1hTSQotICAgICAgICArICI9XCIiCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLk5TX1VSSV9YU0kKLSAgICAgICAgKyAiXCI+Iik7Ci0KLSAgICAvLyBBZGQgIG1vbml0b3IgdG9vbCBpbmZvCi0gICAgLy9wdy5wcmludGxuKG1vbml0b3IudG9YTUxTdHJpbmcobnNOYW1lKSk7Ci0KLSAgICAvLyBSZXR1cm4gWE1MIHN0cmluZwotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBlbmQgZWxlbWVudCBzdHJpbmcuIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbmRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIEVuZCBsb2cgZWxlbWVudCAKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgLy8gUmV0dXJuIFhNTCBzdHJpbmcKLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIC8vIEFERDoKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTG9nUmVhZGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9pbXBsL0xvZ1JlYWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiN2VmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTG9nUmVhZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5Ub29sRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLlRvb2xJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZ1JlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLmltcGwuTWltZVBhcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuaW1wbC5NaW1lUGFydHNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5pbXBsLkNvbW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5BcnRpZmFjdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbC5BcnRpZmFjdFJlZmVyZW5jZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsLkVudHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmRvbS5FbGVtZW50TG9jYXRpb247Ci0KLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHJlYWQgdGhlIExvZyBmaWxlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBOZWlsIERlbGltYSAobmRkZWxpbWFAY2EuaWJtLmNvbSkKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQGF1dGhvciBHcmFoYW0gVHVycmVsbCAoZ3R1cnJlbGxAdWsuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIExvZ1JlYWRlckltcGwgaW1wbGVtZW50cyBMb2dSZWFkZXIKLXsKLSAgLyoqCi0gICAqIERvY3VtZW50IGxvY2F0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZG9jdW1lbnRVUkk7Ci0KLSAgLyoqIFVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGltcGxlbWVudGVyIGlzIHRoZSBmaXJzdCBlbGVtZW50IGFmdGVyIHRoZSBsb2cgZWxlbWVudCAqKi8KLSAgcHJpdmF0ZSBpbnQgZmlyc3RMb2dFbGVtZW50ID0gMDsKLSAgcHJpdmF0ZSBpbnQgZWxlbWVudENvdW50ID0gMDsKLSAgcHJpdmF0ZSBib29sZWFuIGJNb25pdG9yRmlyc3QgPSBmYWxzZTsKLQotICBwcml2YXRlIFdTSUV4Y2VwdGlvbiB3c2lFeGNlcHRpb24gPSBudWxsOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nUmVhZGVyI3JlYWRMb2coU3RyaW5nLCBMb2dFbnRyeUhhbmRsZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkTG9nKFN0cmluZyBsb2dVUkksIE1lc3NhZ2VFbnRyeUhhbmRsZXIgbG9nUmVhZGVyQ2FsbGJhY2spCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gUmVhZCB0aGUgbG9nIGZpbGUgZW50cmllcwotICAgIHJlYWRMb2cobmV3IElucHV0U291cmNlKGxvZ1VSSSksIGxvZ1JlYWRlckNhbGxiYWNrKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nUmVhZGVyI3JlYWRMb2coUmVhZGVyLCBMb2dFbnRyeUhhbmRsZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkTG9nKFJlYWRlciByZWFkZXIsIE1lc3NhZ2VFbnRyeUhhbmRsZXIgbG9nUmVhZGVyQ2FsbGJhY2spCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gUmVhZCB0aGUgbG9nIGZpbGUgZW50cmllcwotICAgIHJlYWRMb2cobmV3IElucHV0U291cmNlKHJlYWRlciksIGxvZ1JlYWRlckNhbGxiYWNrKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGFuZCBwYXJzZSB0aGUgbG9nIGZpbGUuCi0gICAqIEBwYXJhbSBpbnB1dFNvdXJjZSAgICAgICAgICBhbiBJbnB1dFNvdXJjZSBvYmplY3QKLSAgICogQHBhcmFtIG1lc3NhZ2VFbnRyeUhhbmRsZXIgIGEgTWVzc2FnZUVudHJ5SGFuZGxlciBvYmplY3QKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSBsb2cgZmlsZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRMb2coCi0gICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UsCi0gICAgTWVzc2FnZUVudHJ5SGFuZGxlciBtZXNzYWdlRW50cnlIYW5kbGVyKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgWE1MIHJlYWRlcgotICAgICAgWE1MUmVhZGVyIHhtbFJlYWRlciA9IFhNTFV0aWxzLmdldFhNTFJlYWRlcigpOwotCi0gICAgICAvKiogVE8gRE86ICBUaGUgTG9nRmlsZSBtdXN0IGJlIHZhbGlkIHdydCBpdHMgc2NoZW1hLiAgVGhlIHNjaGVtYUxvY2F0aW9uIHByb2JhYmx5Ci0gICAgICAgKiBuZWVkcyB0byBiZSBzZXQgaW4gc29tZSBwcm9wZXJ0aWVzIGZpbGUuCi0gICAgICAgKiBUaGVzZSB0d28gYXJlIHRvIHR1cm4gb24gdmFsaWRhdGlvbiAKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKEZFQVRVUkVfVkFMSURBVElPTix0cnVlKTsKLSAgICAgICovCi0KLSAgICAgIC8vIFNldCB0aGUgY29udGVudCBoYW5kbGVyCi0gICAgICB4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IExvZ0ZpbGVIYW5kbGVyKG1lc3NhZ2VFbnRyeUhhbmRsZXIpKTsKLQotICAgICAgLy8gU3RhcnQgcGFyc2luZyB0aGUgZmlsZQotICAgICAgeG1sUmVhZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLQotICAgICAgLy8gQUREOiBOZWVkIHRvIGZpbmQgYSB3YXkgdG8gZGV0ZXJtaW5lIHdoZW4gdGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biwgCi0gICAgICAvLyBzaW5jZSBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZSBhbGwgb2YgdGhlIHRlc3QgYXNzZXJ0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgotICAgICAgLy8gQWxzbywgb25seSB0aGUgbGFzdCBleGNlcHRpb24gaXMgcHJvcG9nYXRlZCBiYWNrLiAgU2hvdWxkIGFsbCBvZiB0aGUgZXhjZXB0aW9ucwotICAgICAgLy8gYmUgY2FwdHVyZWQgYW5kIHByb3BvZ2F0ZWQgYmFjaz8KLSAgICAgIGlmICh3c2lFeGNlcHRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVEVNUDogRm9yIG5vdywgZG9uJ3QgdGhyb3cgdGhlIGV4Y2VwdGlvbgotICAgICAgICAvL3Rocm93IHdzaUV4Y2VwdGlvbjsKLSAgICAgIH0KLQotICAgICAgLy9SZXF1aXJlbWVudCwgdGhlIG1vbml0b3IgTVVTVCBiZSB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxvZy4KLSAgICAgIC8vUGVyaGFwcyB3ZSBuZWVkIHRvIHByZXByb2Nlc3MgdGhlIGxvZyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjb25kaXRpb24gdG8gYmUgbWV0LgotICAgICAgaWYgKCFiTW9uaXRvckZpcnN0KQotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAgICJUaGUgRWxlbWVudCBcIiIKLSAgICAgICAgICAgICsgV1NJQ29uc3RhbnRzLkVMRU1fTU9OSVRPUgotICAgICAgICAgICAgKyAiXCIgaXMgbm90IHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgRWxlbWVudCBcImxvZ1wiIik7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgbWVzc2FnZSBsb2cgZmlsZS4iLAotICAgICAgICBlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXIjZ2V0TG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5kb2N1bWVudFVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudFJlYWRlciNzZXRMb2NhdGlvbihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgZG9jdW1lbnRVUkkpCi0gIHsKLSAgICB0aGlzLmRvY3VtZW50VVJJID0gZG9jdW1lbnRVUkk7Ci0gIH0KLQotICAvKioKLSAgKiBQcm9jZXNzIGFuZCBoYW5kbGVzIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGUgaW4gdGhlIGxvZyBmaWxlIGFuZCBpbnZva2VzCi0gICogbWVzc2FnZSB2YWxpZGF0aW9uIGFzc2VydGlvbnMgc2VyaWFsbHkgYXMgdGhlIGZpbGUgaXMgYmVpbmcgcHJvY2Vzc2VkLAotICAqIGlmIGEgbWVzc2FnZXZhbGlkYXRvciBleGlzdHMuCi0gICovCi0gIHByaXZhdGUgY2xhc3MgTG9nRmlsZUhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgotICB7Ci0KLSAgICAvKiogcHJpdmF0ZSBtZW1iZXJzIHRoYXQgcmVwcmVzZW50IGEgTWVzc2FnZUVudHJ5LiovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29udmVyc2F0aW9uSUQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyB0aW1lc3RhbXA7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgc2VuZGVySG9zdEFuZFBvcnQgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIHJlY2VpdmVySG9zdEFuZFBvcnQgID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBtZXNzYWdlQ29udGVudCAgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGh0dHBIZWFkZXJzICA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYm91bmRhcnkgID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBtaW1lSGVhZGVycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgbWltZUNvbnRlbnQgPSBudWxsOwotICAgIHByaXZhdGUgTWltZVBhcnRzIG1pbWVQYXJ0cyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0IGJvdW5kYXJpZXMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBpbnQgYm9tID0gMDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGxvZ1RpbWVzdGFtcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgbW9uaXRvckNvbW1lbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZUNvbW1lbnQgPSBmYWxzZTsKLQotICAgIC8qKiBPdGhlciBwcml2YXRlIG1lbWJlcnMgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjdXJyZW50RWxlbWVudDsKLQotICAgIHByaXZhdGUgRWxlbWVudExvY2F0aW9uIGVudHJ5RWxlbWVudExvY2F0aW9uID0gbnVsbDsKLQotICAgIHByaXZhdGUgVG9vbEluZm8gdG9vbEluZm8gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBWZWN0b3IgbWVzc2FnZUVudHJ5TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHByaXZhdGUgTWVzc2FnZUVudHJ5SGFuZGxlciBsb2dFbnRyeUhhbmRsZXIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogTG9nIGZpbGUgaGFuZGxlci4gCi0gICAgICovCi0gICAgcHVibGljIExvZ0ZpbGVIYW5kbGVyKE1lc3NhZ2VFbnRyeUhhbmRsZXIgbG9nRW50cnlIYW5kbGVyKQotICAgIHsKLSAgICAgIHRoaXMubG9nRW50cnlIYW5kbGVyID0gbG9nRW50cnlIYW5kbGVyOwotCi0gICAgICB0b29sSW5mbyA9IG5ldyBUb29sSW5mbygpOwotICAgICAgdG9vbEluZm8uc2V0VG9vbEVudmlyb25tZW50KG5ldyBUb29sRW52aXJvbm1lbnQoKSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFN0YXJ0IGRvY3VtZW50LiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFNldCBkb2N1bWVudCBsb2NhdG8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikKLSAgICB7Ci0gICAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOwotCi0gICAgICAvLyBERUJVRzoKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiICsgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgKyAiLCBjb2x1bW46ICIgKyBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogU3RhcnQgZWxlbWVudC4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICBTdHJpbmcgcU5hbWUsCi0gICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigibG9jYWxOYW1lOiIgKyBsb2NhbE5hbWUgKyAiLCBsaW5lOiAiICsgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgKyAiLCBjb2x1bW46ICIgKyBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKLQotICAgICAgLy9SZXF1aXJlbWVudCwgdGhlIGltcGxlbWVudGVyIE1VU1QgYmUgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBsb2cgICAgICAgCi0gICAgICBpZiAoZWxlbWVudENvdW50ID09IDIpCi0gICAgICAgIGlmIChmaXJzdExvZ0VsZW1lbnQgPT0gMSkKLSAgICAgICAgICBiTW9uaXRvckZpcnN0ID0gdHJ1ZTsKLQotICAgICAgZWxlbWVudENvdW50Kys7Ci0KLSAgICAgIC8vIDxsb2c+Ci0gICAgICBpZiAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX0xPRykKLSAgICAgIHsKLSAgICAgICAgLy8gU2F2ZSB0aGUgdGltZXN0YW1wIHZhbHVlCi0gICAgICAgIHRoaXMubG9nVGltZXN0YW1wID0gYXR0cmlidXRlcy5nZXRWYWx1ZShXU0lDb25zdGFudHMuQVRUUl9USU1FU1RBTVApOwotICAgICAgfQotCi0gICAgICAvLyA8d3NpLWNvbmZpZzpjb25maWd1cmF0aW9uPgotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fQ09ORklHKQotICAgICAgICAgICYmIChuYW1lc3BhY2VVUkkgPT0gV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfTU9OSVRPUl9DT05GSUcpKQotICAgICAgewotICAgICAgICAvLyBTYXZlIGNvbW1lbnQgZWxlbWVudCBpZiBpdCBleGlzdHMKLSAgICAgICAgaWdub3JlQ29tbWVudCA9IGZhbHNlOwotICAgICAgfQotCi0gICAgICAvLyA8d3NpLWNvbmZpZzpjb21tZW50PgotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fQ09NTUVOVCkKLSAgICAgICAgICAmJiAobmFtZXNwYWNlVVJJID09IFdTSUNvbnN0YW50cy5OU19VUklfV1NJX01PTklUT1JfQ09ORklHKSkKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgY29tbWVudCBlbGVtZW50IHdpdGhpbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LCB0aGVuIGdldCBpdHMgY29udGVudAotICAgICAgICBpZiAoIWlnbm9yZUNvbW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IFdTSUNvbnN0YW50cy5FTEVNX0NPTU1FTlQ7Ci0gICAgICAgICAgbW9uaXRvckNvbW1lbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gPHdzaS1jb25maWc6cmVkaXJlY3Q+Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGxvY2FsTmFtZSA9PSBXU0lDb25zdGFudHMuRUxFTV9SRURJUkVDVCkKLSAgICAgICAgICAmJiAobmFtZXNwYWNlVVJJID09IFdTSUNvbnN0YW50cy5OU19VUklfV1NJX01PTklUT1JfQ09ORklHKSkKLSAgICAgIHsKLSAgICAgICAgLy8gQWZ0ZXIgaGl0dGluZyB0aGUgZmlyc3QgcmVkaXJlY3Qgc3RhdGVtZW50LCBpZ25vcmUgYWxsIGNvbW1lbnQgZWxlbWVudHMKLSAgICAgICAgaWdub3JlQ29tbWVudCA9IHRydWU7Ci0gICAgICAgIG1vbml0b3JDb21tZW50ID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgLy8gPG1vbml0b3I+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fTU9OSVRPUikKLSAgICAgIHsKLSAgICAgICAgZmlyc3RMb2dFbGVtZW50Kys7Ci0gICAgICAgIHRvb2xJbmZvLnNldE5hbWUoV1NJQ29uc3RhbnRzLkVMRU1fTU9OSVRPUik7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBtb25pdG9yIHZlcnNpb24gYW5kIHJlbGVhc2UgZGF0ZQotICAgICAgICB0b29sSW5mby5zZXRWZXJzaW9uKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfVkVSU0lPTikpOwotICAgICAgICB0b29sSW5mby5zZXRSZWxlYXNlRGF0ZSgKLSAgICAgICAgICBhdHRyaWJ1dGVzLmdldFZhbHVlKFdTSUNvbnN0YW50cy5BVFRSX1JFTEVBU0VfREFURSkpOwotICAgICAgfQotCi0gICAgICAvLyA8aW1wbGVtZW50ZXI+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fSU1QTEVNRU5URVIpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gV1NJQ29uc3RhbnRzLkVMRU1fSU1QTEVNRU5URVI7Ci0gICAgICAgIHRvb2xJbmZvLnNldEltcGxlbWVudGVyKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSkpOwotICAgICAgICB0b29sSW5mby5zZXRMb2NhdGlvbihhdHRyaWJ1dGVzLmdldFZhbHVlKFdTSUNvbnN0YW50cy5BVFRSX0xPQ0FUSU9OKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxydW50aW1lPgotICAgICAgZWxzZSBpZiAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX1JVTlRJTUUpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gV1NJQ29uc3RhbnRzLkVMRU1fUlVOVElNRTsKLSAgICAgICAgdG9vbEluZm8uZ2V0VG9vbEVudmlyb25tZW50KCkuc2V0UnVudGltZU5hbWUoCi0gICAgICAgICAgYXR0cmlidXRlcy5nZXRWYWx1ZShXU0lDb25zdGFudHMuQVRUUl9OQU1FKSk7Ci0gICAgICAgIHRvb2xJbmZvLmdldFRvb2xFbnZpcm9ubWVudCgpLnNldFJ1bnRpbWVWZXJzaW9uKAotICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfVkVSU0lPTikpOwotICAgICAgfQotCi0gICAgICAvLyA8b3BlcmF0aW5nU3lzdGVtPgotICAgICAgZWxzZSBpZiAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX09QRVJBVElOR19TWVNURU0pCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gV1NJQ29uc3RhbnRzLkVMRU1fT1BFUkFUSU5HX1NZU1RFTTsKLSAgICAgICAgdG9vbEluZm8uZ2V0VG9vbEVudmlyb25tZW50KCkuc2V0T1NOYW1lKAotICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSkpOwotICAgICAgICB0b29sSW5mby5nZXRUb29sRW52aXJvbm1lbnQoKS5zZXRPU1ZlcnNpb24oCi0gICAgICAgICAgYXR0cmlidXRlcy5nZXRWYWx1ZShXU0lDb25zdGFudHMuQVRUUl9WRVJTSU9OKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDx4bWxQYXJzZXI+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fWE1MX1BBUlNFUikKLSAgICAgIHsKLSAgICAgICAgY3VycmVudEVsZW1lbnQgPSBXU0lDb25zdGFudHMuRUxFTV9YTUxfUEFSU0VSOwotICAgICAgICB0b29sSW5mby5nZXRUb29sRW52aXJvbm1lbnQoKS5zZXRYTUxQYXJzZXJOYW1lKAotICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSkpOwotICAgICAgICB0b29sSW5mby5nZXRUb29sRW52aXJvbm1lbnQoKS5zZXRYTUxQYXJzZXJWZXJzaW9uKAotICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfVkVSU0lPTikpOwotICAgICAgfQotCi0gICAgICAvLyA8bWVzc2FnZUVudHJ5PgotICAgICAgZWxzZSBpZiAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX01FU1NBR0VfRU5UUlkpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9FTlRSWTsKLSAgICAgICAgZW50cnlFbGVtZW50TG9jYXRpb24gPSBuZXcgRWxlbWVudExvY2F0aW9uKHRoaXMubG9jYXRvcik7Ci0gICAgICAgIHRpbWVzdGFtcCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfVElNRVNUQU1QKTsKLSAgICAgICAgY29udmVyc2F0aW9uSUQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKFdTSUNvbnN0YW50cy5BVFRSX0NPTlZFUlNBVElPTl9JRCk7Ci0gICAgICAgIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZShXU0lDb25zdGFudHMuQVRUUl9JRF9VQyk7Ci0gICAgICAgIHR5cGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKFdTSUNvbnN0YW50cy5BVFRSX1RZUEUpOwotICAgICAgfQotCi0gICAgICAvLyA8aHR0cEhlYWRlcnM+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fSFRUUF9IRUFERVJTKQotICAgICAgewotICAgICAgICAvL05vdGU6IENoYXJhY3RlciBkYXRhIGNvdWxkIGJlIHNwbGl0IHVwIGFuZCByZXR1cm5lZCAKLSAgICAgICAgLy9pbiBtb3JlIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVycyBjYWxsLiAKLSAgICAgICAgaHR0cEhlYWRlcnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gV1NJQ29uc3RhbnRzLkVMRU1fSFRUUF9IRUFERVJTOwotICAgICAgfQotCi0gICAgICAvLyA8bWVzc2FnZUNvbnRlbnQ+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9DT05URU5UKQotICAgICAgewotICAgICAgICBtZXNzYWdlQ29udGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgbWltZVBhcnRzID0gbnVsbDsKLSAgICAgICAgY3VycmVudEVsZW1lbnQgPSBXU0lDb25zdGFudHMuRUxFTV9NRVNTQUdFX0NPTlRFTlQ7Ci0gICAgICAgIFN0cmluZyBib21TdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKFdTSUNvbnN0YW50cy5BVFRSX0JPTSk7Ci0gICAgICAgIGlmIChib21TdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgICBib20gPSBJbnRlZ2VyLnZhbHVlT2YoYm9tU3RyaW5nKS5pbnRWYWx1ZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYm9tID0gMDsKLSAgICAgIH0KLQotICAgICAgLy8gPG1lc3NhZ2VDb250ZW50V2l0aEF0dGFjaG1lbnRzPgotICAgICAgZWxzZSBpZiAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX01FU1NBR0VfQ09OVEVOVF9XSVRIX0FUVEFDSE1FTlRTKQotICAgICAgewotICAgICAgICBtZXNzYWdlQ29udGVudCA9IG51bGw7Ci0gICAgICAgIG1pbWVQYXJ0cyA9IG5ldyBNaW1lUGFydHNJbXBsKCk7Ci0KLSAgICAgICAgU3RyaW5nIGJvbVN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfQk9NKTsKLSAgICAgICAgaWYgKGJvbVN0cmluZyAhPSBudWxsKQotICAgICAgICAgIGJvbSA9IEludGVnZXIudmFsdWVPZihib21TdHJpbmcpLmludFZhbHVlKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBib20gPSAwOwotICAgICAgfQotCi0gICAgICAvLyA8bWltZVBhcnQ+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9QQVJUKQotICAgICAgewotICAgICAgICBpZiAoYm91bmRhcmllcyA9PSBudWxsKQotICAgICAgICAgIGJvdW5kYXJpZXMgPSBuZXcgQXJyYXlMaXN0KDIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYm91bmRhcmllcy5jbGVhcigpOwotICAgICAgfQotCi0gICAgICAvLyA8Ym91bmRhcnlTdHJpbmc+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fQk9VTkRBUllfU1RSSU5HKQotICAgICAgewotICAgICAgICBib3VuZGFyeSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgY3VycmVudEVsZW1lbnQgPSBXU0lDb25zdGFudHMuRUxFTV9CT1VOREFSWV9TVFJJTkc7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxtaW1lSGVhZGVycz4KLSAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZSA9PSBXU0lDb25zdGFudHMuRUxFTV9NSU1FX0hFQURFUlMpCi0gICAgICB7Ci0gICAgICAgIG1pbWVIZWFkZXJzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBjdXJyZW50RWxlbWVudCA9IFdTSUNvbnN0YW50cy5FTEVNX01JTUVfSEVBREVSUzsKLSAgICAgIH0KLQotICAgICAgLy8gPG1pbWVDb250ZW50PgotICAgICAgZWxzZSBpZiAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX01JTUVfQ09OVEVOVCkKLSAgICAgIHsKLSAgICAgICAgbWltZUNvbnRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9DT05URU5UOwotICAgICAgfQotCi0gICAgICAvLyA8c2VuZGVySG9zdEFuZFBvcnQ+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fU0VOREVSX0hPU1RfQU5EX1BPUlQpCi0gICAgICB7Ci0gICAgICAgIHNlbmRlckhvc3RBbmRQb3J0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBjdXJyZW50RWxlbWVudCA9IFdTSUNvbnN0YW50cy5FTEVNX1NFTkRFUl9IT1NUX0FORF9QT1JUOwotICAgICAgfQotCi0gICAgICAvLyA8cmVjZWl2ZXJIb3N0QW5kUG9ydD4KLSAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZSA9PSBXU0lDb25zdGFudHMuRUxFTV9SRUNFSVZFUl9IT1NUX0FORF9QT1JUKQotICAgICAgewotICAgICAgICByZWNlaXZlckhvc3RBbmRQb3J0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBjdXJyZW50RWxlbWVudCA9IFdTSUNvbnN0YW50cy5FTEVNX1JFQ0VJVkVSX0hPU1RfQU5EX1BPUlQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIAotICAgICogQ2hhcmFjdGVycyBjYWxsYmFjay4gCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotICAgIHsKLSAgICAgIC8vIElnbm9yaW5nIENSTEYgdGhhdCBhcHBlYXJzIGluIGxvZyBlbGVtZW50cwotICAgICAgaW50IGFsdFN0YXJ0ID0gc3RhcnQ7Ci0gICAgICBpbnQgYWx0TGVuZ3RoID0gbGVuZ3RoOwotICAgICAgaWYgKHN0YXJ0ID4gMCAmJiBjaFtzdGFydC0xXSA9PSAxMyAmJiBjaFtzdGFydF0gPT0gMTApCi0gICAgICB7Ci0gICAgICAgIGFsdFN0YXJ0Kys7Ci0gICAgICAgIGFsdExlbmd0aC0tOwotICAgICAgfQotCi0gICAgICAvLyA8d3NpLW1vbkNvbmZpZzpjb21tZW50PgotICAgICAgaWYgKG1vbml0b3JDb21tZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnQgPT0gV1NJQ29uc3RhbnRzLkVMRU1fQ09NTUVOVCkKLSAgICAgIHsKLSAgICAgICAgbW9uaXRvckNvbW1lbnQuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIH0KLQotICAgICAgLy8gPG1lc3NhZ2VDb250ZW50PgotICAgICAgZWxzZSBpZiAobWVzc2FnZUNvbnRlbnQgIT0gbnVsbAotICAgICAgICAmJiBjdXJyZW50RWxlbWVudCA9PSBXU0lDb25zdGFudHMuRUxFTV9NRVNTQUdFX0NPTlRFTlQpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2VDb250ZW50LmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxodHRwSGVhZGVycz4KLSAgICAgIGVsc2UgaWYgKGh0dHBIZWFkZXJzICE9IG51bGwKLSAgICAgICAgJiYgY3VycmVudEVsZW1lbnQgPT0gV1NJQ29uc3RhbnRzLkVMRU1fSFRUUF9IRUFERVJTKQotICAgICAgewotICAgICAgICBodHRwSGVhZGVycy5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgfQotCi0gICAgICAvLyA8Ym91bmRhcnlTdHJpbmc+Ci0gICAgICBlbHNlIGlmIChib3VuZGFyeSAhPSBudWxsCi0gICAgICAgICYmIGN1cnJlbnRFbGVtZW50ID09IFdTSUNvbnN0YW50cy5FTEVNX0JPVU5EQVJZX1NUUklORykKLSAgICAgIHsKLSAgICAgICAgYm91bmRhcnkuYXBwZW5kKGNoLCBhbHRTdGFydCwgYWx0TGVuZ3RoKTsKLSAgICAgIH0KLQotICAgICAgLy8gPG1pbWVIZWFkZXJzPgotICAgICAgZWxzZSBpZiAobWltZUhlYWRlcnMgIT0gbnVsbAotICAgICAgICAmJiBjdXJyZW50RWxlbWVudCA9PSBXU0lDb25zdGFudHMuRUxFTV9NSU1FX0hFQURFUlMpCi0gICAgICB7Ci0gICAgICAgIG1pbWVIZWFkZXJzLmFwcGVuZChjaCwgYWx0U3RhcnQsIGFsdExlbmd0aCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxtaW1lQ29udGVudD4KLSAgICAgIGVsc2UgaWYgKG1pbWVDb250ZW50ICE9IG51bGwKLSAgICAgICAgJiYgY3VycmVudEVsZW1lbnQgPT0gV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9DT05URU5UKQotICAgICAgewotICAgICAgICBtaW1lQ29udGVudC5hcHBlbmQoY2gsIGFsdFN0YXJ0LCBhbHRMZW5ndGgpOwotICAgICAgfQotCi0gICAgICAvLyA8c2VuZGVySG9zdEFuZFBvcnQ+Ci0gICAgICBlbHNlIGlmIChzZW5kZXJIb3N0QW5kUG9ydCAhPSBudWxsCi0gICAgICAgICYmIGN1cnJlbnRFbGVtZW50ID09IFdTSUNvbnN0YW50cy5FTEVNX1NFTkRFUl9IT1NUX0FORF9QT1JUKQotICAgICAgewotICAgICAgICBzZW5kZXJIb3N0QW5kUG9ydC5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgfQotCi0gICAgICAvLyA8cmVjZWl2ZXJIb3N0QW5kUG9ydD4KLSAgICAgIGVsc2UgaWYgKHJlY2VpdmVySG9zdEFuZFBvcnQgIT0gbnVsbAotICAgICAgICAmJiBjdXJyZW50RWxlbWVudCA9PSBXU0lDb25zdGFudHMuRUxFTV9SRUNFSVZFUl9IT1NUX0FORF9QT1JUKQotICAgICAgewotICAgICAgICByZWNlaXZlckhvc3RBbmRQb3J0LmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEVuZCBFbGVtZW50LiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkKLSAgICB7Ci0gICAgICAvLyA8d3NpLWNvbmZpZzpjb21tZW50PgotICAgICAgaWYgKAotICAgICAgICAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX0NPTU1FTlQpCi0gICAgICAgICAgJiYgKG5hbWVzcGFjZVVSSSA9PSBXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9NT05JVE9SX0NPTkZJRykpCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHdlIHNhdmVkIHRoZSBjb21tZW50LCB0aGVuIHByb2Nlc3MgaXQgYW5kIHRoZSBsb2cgdGltZXN0YW1wCi0gICAgICAgIGlmICh0aGlzLm1vbml0b3JDb21tZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBBcnRpZmFjdFJlZmVyZW5jZSBhcnRpZmFjdFJlZmVyZW5jZSA9IG5ldyBBcnRpZmFjdFJlZmVyZW5jZUltcGwoKTsKLSAgICAgICAgICBhcnRpZmFjdFJlZmVyZW5jZS5zZXRUaW1lc3RhbXAodGhpcy5sb2dUaW1lc3RhbXApOwotICAgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG5ldyBDb21tZW50SW1wbCgpOwotICAgICAgICAgIGNvbW1lbnQuc2V0VGV4dChtb25pdG9yQ29tbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgICBhcnRpZmFjdFJlZmVyZW5jZS5zZXREb2N1bWVudEVsZW1lbnQoCi0gICAgICAgICAgICBjb21tZW50LAotICAgICAgICAgICAgV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NJX01PTklUT1JfQ09ORklHKTsKLSAgICAgICAgICBwcm9jZXNzQXJ0aWZhY3RSZWZlcmVuY2UoYXJ0aWZhY3RSZWZlcmVuY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxib3VuZGFyeVN0cmluZz4KLSAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZSA9PSBXU0lDb25zdGFudHMuRUxFTV9CT1VOREFSWV9TVFJJTkcpCi0gICAgICB7Ci0gICAgICAgIC8vIEFkZGluZyBib3VuZGFyeSBzdHJpbmcgdG8gYSBsaXN0Ci0gICAgICAgIGJvdW5kYXJpZXMuYWRkKGJvdW5kYXJ5LnRvU3RyaW5nKCkpOwotICAgICAgfQotCi0gICAgICAvLyA8bWltZVBhcnQ+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9QQVJUKQotICAgICAgewotICAgICAgICAvLyBDcmVhdGluZyBhIE1lc3NhZ2VNSU1FUGFydCBpbnN0YW5jZQotICAgICAgICBNaW1lUGFydCBwYXJ0ID0gbmV3IE1pbWVQYXJ0SW1wbCgpOwotICAgICAgICBwYXJ0LnNldEhlYWRlcnMobWltZUhlYWRlcnMudG9TdHJpbmcoKSk7Ci0gICAgICAgIHBhcnQuc2V0Q29udGVudChtaW1lQ29udGVudC50b1N0cmluZygpKTsKLSAgICAgICAgcGFydC5zZXRCb3VuZGFyeVN0cmluZ3MoKFN0cmluZ1tdKWJvdW5kYXJpZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0KLSAgICAgICAgbWltZVBhcnRzLmFkZFBhcnQocGFydCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxtZXNzYWdlRW50cnk+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9FTlRSWSkKLSAgICAgIHsKLSAgICAgICAgLy8gQXNzdW1wdGlvbjogUmVsYXRlZCBtZXNzYWdlcyBhcmUgc2VxdWVudGlhbGx5IGF2YWlsYWJsZSBpbiB0aGUgbWVzc2FnZSBsb2cuCi0gICAgICAgIGlmIChNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNULmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBDcmVhdGUgbG9nIGVudHJ5Ci0gICAgICAgICAgTWVzc2FnZUVudHJ5IG1lc3NhZ2VFbnRyeVJlcXVlc3QgPQotICAgICAgICAgICAgY3JlYXRlTWVzc2FnZUVudHJ5KAotICAgICAgICAgICAgICAgIGlkLAotICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklELAotICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgIHNlbmRlckhvc3RBbmRQb3J0LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgcmVjZWl2ZXJIb3N0QW5kUG9ydC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50ID09IG51bGwgPyAiIiA6IG1lc3NhZ2VDb250ZW50LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgaHR0cEhlYWRlcnMudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBtaW1lUGFydHMsCi0gICAgICAgICAgICAgICAgZW50cnlFbGVtZW50TG9jYXRpb24pOwotCi0gICAgICAgICAgLy8gQWRkIGxvZyBlbnRyeSB0byB0aGUgbGlzdAotICAgICAgICAgIG1lc3NhZ2VFbnRyeUxpc3QuYWRkKG1lc3NhZ2VFbnRyeVJlcXVlc3QpOwotCi0gICAgICAgICAgLy8gUmVxdWVzdCBpcyBub3cgcHJvY2Vzc2VkIG9ubHkgd2hlbiB0aGUgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuICAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSBpZiAoTWVzc2FnZUVudHJ5LlRZUEVfUkVTUE9OU0UuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIENyZWF0ZSBsb2cgZW50cnkKLSAgICAgICAgICBNZXNzYWdlRW50cnkgbWVzc2FnZUVudHJ5UmVzcG9uc2UgPQotICAgICAgICAgICAgY3JlYXRlTWVzc2FnZUVudHJ5KAotICAgICAgICAgICAgICAgIGlkLAotICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklELAotICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgIHNlbmRlckhvc3RBbmRQb3J0LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgcmVjZWl2ZXJIb3N0QW5kUG9ydC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50ID09IG51bGwgPyAiIiA6IG1lc3NhZ2VDb250ZW50LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgaHR0cEhlYWRlcnMudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBtaW1lUGFydHMsCi0gICAgICAgICAgICAgICAgZW50cnlFbGVtZW50TG9jYXRpb24pOwotCi0gICAgICAgICAgLy8gQWRkIGxvZyBlbnRyeSB0byB0aGUgbGlzdAotICAgICAgICAgIG1lc3NhZ2VFbnRyeUxpc3QuYWRkKG1lc3NhZ2VFbnRyeVJlc3BvbnNlKTsKLQotICAgICAgICAgIGlmIChsb2dFbnRyeUhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBsb29rIHVwIHRoZSByZXF1ZXN0IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIElTU1VFIDogbmVlZCB0byB0aHJvdyAmIGNhdGNoIGEgbnVsbHBvaW50ZXJleGNlcHRpb24gaW4gaGVyZS4uLgotICAgICAgICAgICAgTWVzc2FnZUVudHJ5IG1lc3NhZ2VFbnRyeVJlcXVlc3QgPSBmaW5kUmVsYXRlZFJlcXVlc3QobWVzc2FnZUVudHJ5UmVzcG9uc2UpOwotCi0gICAgICAgICAgICBpZiAobWVzc2FnZUVudHJ5UmVxdWVzdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBDcmVhdGUgZW50cnkgCi0gICAgICAgICAgICAgIC8vIEFERDogTmVlZCB0byBjcmVhdGUgZW50cnkgZnJvbSByZXBvcnQKLSAgICAgICAgICAgICAgLy9FbnRyeSBlbnRyeSA9IHRoaXMucmVwb3J0ZXIuZ2V0UmVwb3J0KCkuY3JlYXRlRW50cnkoKTsKLSAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSBuZXcgRW50cnlJbXBsKCk7Ci0gICAgICAgICAgICAgIGVudHJ5LnNldEVudHJ5VHlwZSgKLSAgICAgICAgICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfTUVTU0FHRV9SRVFVRVNUKSk7Ci0gICAgICAgICAgICAgIGVudHJ5LnNldFJlZmVyZW5jZUlEKG1lc3NhZ2VFbnRyeVJlcXVlc3QuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgIGVudHJ5LnNldEVudHJ5RGV0YWlsKG1lc3NhZ2VFbnRyeVJlcXVlc3QpOwotCi0gICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29udGV4dCBmb3IgdGhlIHJlcXVlc3QtcmVzcG9uc2UgcGFpcgotICAgICAgICAgICAgICBFbnRyeUNvbnRleHQgcmVxdWVzdFRhcmdldENvbnRleHQgPQotICAgICAgICAgICAgICAgIG5ldyBFbnRyeUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRW50cnlSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRW50cnlSZXNwb25zZSk7Ci0gICAgICAgICAgICAgIGlmIChyZXF1ZXN0VGFyZ2V0Q29udGV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHByb2Nlc3NMb2dFbnRyeShyZXF1ZXN0VGFyZ2V0Q29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBlbnRyeSAKLSAgICAgICAgICAgIC8vIEFERDogTmVlZCB0byBjcmVhdGUgZW50cnkgZnJvbSByZXBvcnQKLSAgICAgICAgICAgIC8vRW50cnkgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG5ldyBFbnRyeUltcGwoKTsKLSAgICAgICAgICAgIGVudHJ5LnNldEVudHJ5VHlwZSgKLSAgICAgICAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX01FU1NBR0VfUkVTUE9OU0UpKTsKLSAgICAgICAgICAgIGVudHJ5LnNldFJlZmVyZW5jZUlEKG1lc3NhZ2VFbnRyeVJlc3BvbnNlLmdldElkKCkpOwotICAgICAgICAgICAgZW50cnkuc2V0RW50cnlEZXRhaWwobWVzc2FnZUVudHJ5UmVzcG9uc2UpOwotCi0gICAgICAgICAgICBFbnRyeUNvbnRleHQgcmVzcG9uc2VUYXJnZXRDb250ZXh0ID0KLSAgICAgICAgICAgICAgbmV3IEVudHJ5Q29udGV4dCgKLSAgICAgICAgICAgICAgICAgIGVudHJ5LAotICAgICAgICAgICAgICAgICAgbWVzc2FnZUVudHJ5UmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbnRyeVJlc3BvbnNlKTsKLSAgICAgICAgICAgIGlmIChyZXNwb25zZVRhcmdldENvbnRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgcHJvY2Vzc0xvZ0VudHJ5KHJlc3BvbnNlVGFyZ2V0Q29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGN1cnJlbnRFbGVtZW50ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgKiBFbmQgRG9jdW1lbnQuIAotICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIC8vSWYgd2Ugd2FudCB0byBzZXJpYWxseSBwcm9jZXNzIHRoZSBsb2cgZmlsZS4gIEludm9rZSB2YWxpZGF0ZU1lc3NhZ2VzIHdpdGgKLSAgICAgIC8vbXNnVmFsaWRhdG9yIT1udWxsLiAgSGVyZSB3ZSBoYXZlIHRoZSBvcHRpb24gb2YgY2xlYXJpbmcgdGhlIGxvZ0VudHJ5IHZlY3RvcgotICAgICAgLy9vbmNlIG1lc3NhZ2UgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgLy9pZiAobXNnVmFsaWRhdG9yIT1udWxsKQotICAgICAgLy9sb2dFbnRyeUxpc3QuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIHRoZSBtZXNzYWdlIGluIHRoZSBsb2cgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xvZ0VudHJ5KEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vQmVmb3JlIHZhbGlkYXRpbmcgYW55IG1lc3NhZ2VzIGNoZWNrIGlmIGltcGxlbWVudGVyIGlzIHRoZSBmaXJzdCBlbGVtZW50LgotICAgICAgICBsb2dFbnRyeUhhbmRsZXIucHJvY2Vzc0xvZ0VudHJ5KGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHdzaUV4Y2VwdGlvbiA9Ci0gICAgICAgICAgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB2YWxpZGF0aW5nIgotICAgICAgICAgICAgICArICIgdGhlIG1lc3NhZ2UgbG9nRW50cnk6ICIKLSAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SWQoKSwKLSAgICAgICAgICAgIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgdGhlIGFydGlmYWN0IHJlZmVyZW5jZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0FydGlmYWN0UmVmZXJlbmNlKEFydGlmYWN0UmVmZXJlbmNlIGFydGlmYWN0UmVmZXJlbmNlKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvL0JlZm9yZSB2YWxpZGF0aW5nIGFueSBtZXNzYWdlcyBjaGVjayBpZiBpbXBsZW1lbnRlciBpcyB0aGUgZmlyc3QgZWxlbWVudC4KLSAgICAgICAgbG9nRW50cnlIYW5kbGVyLnByb2Nlc3NBcnRpZmFjdFJlZmVyZW5jZShhcnRpZmFjdFJlZmVyZW5jZSk7Ci0gICAgICB9Ci0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgd3NpRXhjZXB0aW9uID0KLSAgICAgICAgICBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAgICAgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmciCi0gICAgICAgICAgICAgICsgIiB0aGUgYXJ0aWZhY3QgcmVmZXJlbmNlOiAiCi0gICAgICAgICAgICAgICsgYXJ0aWZhY3RSZWZlcmVuY2UudG9TdHJpbmcoKSwKLSAgICAgICAgICAgIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAgICogRmluZCB0aGUgcmVsYXRlZCBSZXF1ZXN0IExvZ0VudHJ5LiAgVGhlIGN1cnJlbnQgcnVsZSBmb3IgcmVsYXRlZCBsb2cgZW50aXJlcyBpcwotICAgICAgICogdGhhdCBhIHJlcXVlc3Qgd2lsbCBhbHdheXMgcHJlY2VkZSBpdHMgcmVzcG9uc2UuCi0gICAgICAgKiBJU1NVRTogU2VxdWVuY2UgaW4gbG9nIGZpbGUgaXMgdGltZXN0YW1wIGRyaXZlbiAobW9uaXRvciBzcGVjKS4gCi0gICAgICAgKiBBc3NlcnRpb24gaXMgdGhhdCBmb3IgYSBnaXZlbiBjb252ZXJzYXRpb25JRCwgYSBzZWNvbmQgcmVxdWVzdCBpcyBub3Qgc2VudCAKLSAgICAgICAqIHVudGlsIGl0cyByZXNwb25zZSBpcyByZWNlaXZlZCAoY2hyb25vbG9naWNhbGx5KS4gCi0gICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGhhdmUgdG8gYmUgbW9kaWZpZWQgaWYgdGhlIHJ1bGUgY2hhbmdlcy4KLSAgICAgICAqLwotICAgIC8vIGNvdWxkIGJlIG1hZGUgbW9yZSBlZmZpY2llbnQgYnkga2VlcGluZyBhIG11Y2ggc21hbGxlciBsaXN0IG9mIHVucmVzcG9uZGVkIHJlcXVlc3RzLi4uCi0gICAgcHVibGljIE1lc3NhZ2VFbnRyeSBmaW5kUmVsYXRlZFJlcXVlc3QoTWVzc2FnZUVudHJ5IGxvZ0VudHJ5UmVzcG9uc2UpCi0gICAgewotICAgICAgZm9yIChpbnQgZW50cnkgPSBtZXNzYWdlRW50cnlMaXN0LnNpemUoKSAtIDE7IGVudHJ5ID49IDA7IGVudHJ5LS0pCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCB0aGUgbG9nIGVudHJ5IG9mIHRoZSBtYXRjaGluZyByZXF1ZXN0Ci0gICAgICAgIE1lc3NhZ2VFbnRyeSBsb2dFbnRyeSA9IChNZXNzYWdlRW50cnkpIG1lc3NhZ2VFbnRyeUxpc3QuZ2V0KGVudHJ5KTsKLSAgICAgICAgLy8gSWdub3JlIG93biBlbnRyeQotICAgICAgICBpZiAoIWxvZ0VudHJ5UmVzcG9uc2UuZXF1YWxzKGxvZ0VudHJ5KSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChsb2dFbnRyeVJlc3BvbnNlCi0gICAgICAgICAgICAuZ2V0Q29udmVyc2F0aW9uSWQoKQotICAgICAgICAgICAgLmVxdWFscyhsb2dFbnRyeS5nZXRDb252ZXJzYXRpb25JZCgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmb3VuZCB0aGUgbW9zdCByZWNlbnRseSByZWFkIG1lc3NhZ2Ugd2l0aCB0aGUgc2FtZSBjb252ZXJzYXRpb25JRC4KLSAgICAgICAgICAgIC8vIEZyb20gYWJvdmUsIHRoaXMgc2hvdWxkIGJlIHRoZSBjb3JyZXNwb25kaW5nIHJlcXVlc3QuIENoZWNrIGFzIGZhciBhcyBwb3NzaWJsZS4KLSAgICAgICAgICAgIGlmIChsb2dFbnRyeS5nZXRUeXBlKCkuZXF1YWxzKE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gbG9nRW50cnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBleHBlY3RlZCBhIHJlcXVlc3QuIG5lZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAvLyBjb252ZXJzYXRpb25JRCBtYXRjaCBub3QgZm91bmQgYW55d2hlcmUuIG5lZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBsb2cgZW50cnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlRW50cnkgY3JlYXRlTWVzc2FnZUVudHJ5KAotICAgICAgU3RyaW5nIGlkLAotICAgICAgU3RyaW5nIGNvbnZlcnNhdGlvbklkLAotICAgICAgU3RyaW5nIHR5cGUsCi0gICAgICBTdHJpbmcgdGltZXN0YW1wLAotICAgICAgU3RyaW5nIHNlbmRlcklQUG9ydCwKLSAgICAgIFN0cmluZyByZWNlaXZlcklQUG9ydCwKLSAgICAgIFN0cmluZyBtZXNzYWdlQ29udGVudCwKLSAgICAgIFN0cmluZyBodHRwSGVhZGVycywKLSAgICAgIE1pbWVQYXJ0cyBtaW1lUGFydHMsCi0gICAgICBFbGVtZW50TG9jYXRpb24gZWxlbWVudExvY2F0aW9uKQotICAgIHsKLSAgICAgIC8vIENyZWF0ZSBsb2cgZW50cnkKLSAgICAgIE1lc3NhZ2VFbnRyeSBtZXNzYWdlRW50cnkgPSBuZXcgTWVzc2FnZUVudHJ5SW1wbCgpOwotICAgICAgbWVzc2FnZUVudHJ5LnNldElkKGlkKTsKLSAgICAgIG1lc3NhZ2VFbnRyeS5zZXRDb252ZXJzYXRpb25JZChjb252ZXJzYXRpb25JRCk7Ci0gICAgICBtZXNzYWdlRW50cnkuc2V0VHlwZSh0eXBlKTsKLSAgICAgIG1lc3NhZ2VFbnRyeS5zZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICAgIG1lc3NhZ2VFbnRyeS5zZXRTZW5kZXJIb3N0QW5kUG9ydChzZW5kZXJJUFBvcnQpOwotICAgICAgbWVzc2FnZUVudHJ5LnNldFJlY2VpdmVySG9zdEFuZFBvcnQocmVjZWl2ZXJJUFBvcnQpOwotICAgICAgbWVzc2FnZUVudHJ5LnNldEhUVFBIZWFkZXJzKGh0dHBIZWFkZXJzKTsKLSAgICAgIG1lc3NhZ2VFbnRyeS5zZXRCT00oYm9tKTsKLSAgICAgIG1lc3NhZ2VFbnRyeS5zZXRFbGVtZW50TG9jYXRpb24oZWxlbWVudExvY2F0aW9uKTsKLQotICAgICAgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLSAgICAgIGlmIChtaW1lUGFydHMgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IHRoZSBlbmNvZGluZyBmb3IgdGhpcyBtZXNzYWdlIGNvbnRlbnQKLSAgICAgICAgZW5jb2RpbmcgPSBVdGlscy5nZXRYTUxFbmNvZGluZyhtZXNzYWdlQ29udGVudCk7Ci0gICAgICAgIG1lc3NhZ2VFbnRyeS5zZXRNZXNzYWdlKG1lc3NhZ2VDb250ZW50KTsKLSAgICAgICAJbWVzc2FnZUVudHJ5LnNldE1pbWVDb250ZW50KGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAJbWVzc2FnZUVudHJ5LnNldE1pbWVQYXJ0cyhtaW1lUGFydHMpOwotICAgICAgIAlNaW1lUGFydCByb290ID0gVXRpbHMuZmluZFJvb3RQYXJ0KGh0dHBIZWFkZXJzLCBtaW1lUGFydHMuZ2V0UGFydHMoKSk7Ci0gICAgICAgCWlmIChyb290ICE9IG51bGwpCi0gICAgICAgCXsKLSAgICAgICAgICAvLyBHZXQgdGhlIGVuY29kaW5nIGZvciB0aGlzIG1lc3NhZ2UgY29udGVudAotICAgICAgICAgIGVuY29kaW5nID0gVXRpbHMuZ2V0WE1MRW5jb2Rpbmcocm9vdC5nZXRDb250ZW50KCkpOwotICAgICAgICAgIG1pbWVQYXJ0cy5zZXRSb290UGFydChyb290KTsKLSAgICAgICAJfQotICAgCQkvLyBlbHNlIGVtcHR5IGJvZHkKLSAgICAgICAJbWVzc2FnZUVudHJ5LnNldE1pbWVDb250ZW50KHRydWUpOwotICAgICAgfQotICAgICAgaWYgKChlbmNvZGluZyA9PSBudWxsKSB8fCAoZW5jb2RpbmcuZXF1YWxzKCIiKSkpCi0gICAgICAgICBlbmNvZGluZyA9IFdTSUNvbnN0YW50cy5ERUZBVUxUX1hNTF9FTkNPRElORzsKLSAgICAgIG1lc3NhZ2VFbnRyeS5zZXRFbmNvZGluZyhlbmNvZGluZyk7Ci0KLSAgICAgIHJldHVybiBtZXNzYWdlRW50cnk7Ci0gICAgfQotCi0gIH0gLy9FbmQgQ29udGVudEhhbmRsZXIKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTG9nV3JpdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9pbXBsL0xvZ1dyaXRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlZTk4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTG9nV3JpdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5pbXBsLkRvY3VtZW50V3JpdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZ1dyaXRlcjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHdyaXRlIHRoZSBMb2cgZmlsZS4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgTmVpbCBEZWxpbWEgKG5kZGVsaW1hQGNhLmlibS5jb20pCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIExvZ1dyaXRlckltcGwgZXh0ZW5kcyBEb2N1bWVudFdyaXRlckltcGwgaW1wbGVtZW50cyBMb2dXcml0ZXIKLXsKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2dXcml0ZXIjd3JpdGUoTG9nKQotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKExvZyBsb2cpCi0gICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBJZiB0aGUgd3JpdGVyIHdhcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRocm93IGFuIGV4Y2VwdGlvbgotICAgIGlmICh3cml0ZXIgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvdWxkIG5vdCB3cml0ZSBsb2cgZmlsZSBzaW5jZSB3cml0ZXIgd2FzIG5vdCBzZXQuIik7Ci0KLSAgICAvLyBXcml0ZSBsb2cgZmlsZQotICAgIHdyaXRlKGxvZywgd3JpdGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nV3JpdGVyI3dyaXRlKExvZywgV3JpdGVyKQotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKExvZyBsb2csIFdyaXRlciB3cml0ZXIpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEFERDoKLSAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJXcml0ZSBlbnRpcmUgbG9nIGZpbGUgZnVuY3Rpb24gbm90IHN1cHBvcnRlZCB5ZXQuIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvaW1wbC9NZXNzYWdlRW50cnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTWVzc2FnZUVudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWNlMzI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvaW1wbC9NZXNzYWdlRW50cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5kb20uRWxlbWVudExvY2F0aW9uOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogTWVzc2FnZSBlbnRyeSBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUVudHJ5SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VFbnRyeQotewotICAvKioKLSAgICogTG9nIGVudHJ5IGlkLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZDsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnNhdGlvbklkOwotICBwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGltZXN0YW1wOwotICBwcm90ZWN0ZWQgU3RyaW5nIHNlbmRlckhvc3RBbmRQb3J0OwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlY2VpdmVySG9zdEFuZFBvcnQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZSA9ICIiOwotICBwcm90ZWN0ZWQgU3RyaW5nIGh0dHBIZWFkZXJzID0gIiI7Ci0gIHByb3RlY3RlZCBpbnQgYm9tOwotICBwcm90ZWN0ZWQgU3RyaW5nIGVuY29kaW5nID0gIiI7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzTWltZUNvbnRlbnQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIE1pbWVQYXJ0cyBtaW1lUGFydHMgPSBuZXcgTWltZVBhcnRzSW1wbCgpOwotCi0gIHByb3RlY3RlZCBFbGVtZW50TG9jYXRpb24gZWxlbWVudExvY2F0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogRW1wdHkgY29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZUVudHJ5SW1wbCgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTG9nRW50cnkjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5pZDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLkxvZ0VudHJ5I3NldElkKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkKLSAgewotICAgIHRoaXMuaWQgPSBpZDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLkxvZ0VudHJ5I2dldENvbnZlcnNhdGlvbklkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udmVyc2F0aW9uSWQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuY29udmVyc2F0aW9uSWQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5Mb2dFbnRyeSNzZXRDb252ZXJzYXRpb25JZChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb252ZXJzYXRpb25JZChTdHJpbmcgY29udmVyc2F0aW9uSWQpCi0gIHsKLSAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5Mb2dFbnRyeSNnZXRUaW1lc3RhbXAoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUaW1lc3RhbXAoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMudGltZXN0YW1wOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTG9nRW50cnkjc2V0VGltZXN0YW1wKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChTdHJpbmcgdGltZXN0YW1wKQotICB7Ci0gICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5Mb2dFbnRyeSNnZXRUeXBlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy50eXBlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTG9nRW50cnkjc2V0VHlwZShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKQotICB7Ci0gICAgdGhpcy50eXBlID0gdHlwZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLkxvZ0VudHJ5I2dldFNlbmRlckhvc3RBbmRQb3J0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VuZGVySG9zdEFuZFBvcnQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuc2VuZGVySG9zdEFuZFBvcnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5Mb2dFbnRyeSNzZXRTZW5kZXJIb3N0QW5kUG9ydChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZW5kZXJIb3N0QW5kUG9ydChTdHJpbmcgc2VuZGVySG9zdEFuZFBvcnQpCi0gIHsKLSAgICB0aGlzLnNlbmRlckhvc3RBbmRQb3J0ID0gc2VuZGVySG9zdEFuZFBvcnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5Mb2dFbnRyeSNnZXRSZWNlaXZlckhvc3RBbmRQb3J0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVjZWl2ZXJIb3N0QW5kUG9ydCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5yZWNlaXZlckhvc3RBbmRQb3J0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTG9nRW50cnkjc2V0UmVjZWl2ZXJIb3N0QW5kUG9ydChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWNlaXZlckhvc3RBbmRQb3J0KFN0cmluZyByZWNlaXZlckhvc3RBbmRQb3J0KQotICB7Ci0gICAgdGhpcy5yZWNlaXZlckhvc3RBbmRQb3J0ID0gcmVjZWl2ZXJIb3N0QW5kUG9ydDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLkxvZ0VudHJ5I2dldE1lc3NhZ2UoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKLSAgewotICAJaWYgKCF0aGlzLmlzTWltZUNvbnRlbnQpCi0gICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTsKLSAgCWVsc2UKLSAgCXsKLSAgCSAgIGlmICh0aGlzLm1pbWVQYXJ0cy5nZXRSb290UGFydCgpID09IG51bGwpIHJldHVybiAiIjsKLSAgCSAgIGVsc2UgcmV0dXJuIHRoaXMubWltZVBhcnRzLmdldFJvb3RQYXJ0KCkuZ2V0Q29udGVudCgpOwotICAJfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTG9nRW50cnkjc2V0TWVzc2FnZShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLkxvZ0VudHJ5I3NldEVuY29kaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykKLSAgewotICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1lc3NhZ2VFbnRyeSNnZXRCT00oKQotICAgKi8KLSAgcHVibGljIGludCBnZXRCT00oKQotICB7Ci0gICAgcmV0dXJuIGJvbTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1lc3NhZ2VFbnRyeSNzZXRCT00oaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Qk9NKGludCBib20pCi0gIHsKLSAgICB0aGlzLmJvbSA9IGJvbTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLkxvZ0VudHJ5I2dldEhUVFBIZWFkZXJzKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SFRUUEhlYWRlcnMoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuaHR0cEhlYWRlcnM7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5Mb2dFbnRyeSNzZXRIVFRQSGVhZGVycyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRIVFRQSGVhZGVycyhTdHJpbmcgaHR0cEhlYWRlcnMpCi0gIHsKLSAgICB0aGlzLmh0dHBIZWFkZXJzID0gaHR0cEhlYWRlcnM7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5NZXNzYWdlRW50cnkjZ2V0RWxlbWVudExvY2F0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50TG9jYXRpb24gZ2V0RWxlbWVudExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLmVsZW1lbnRMb2NhdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1lc3NhZ2VFbnRyeSNzZXRFbGVtZW50TG9jYXRpb24ob3JnLndzaS54bWwuZG9tLkVsZW1lbnRMb2NhdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRMb2NhdGlvbihFbGVtZW50TG9jYXRpb24gZWxlbWVudExvY2F0aW9uKQotICB7Ci0gICAgdGhpcy5lbGVtZW50TG9jYXRpb24gPSBlbGVtZW50TG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIHRvWE1MU3RyaW5nKFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9MT0cpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gQUREOiBOZWVkIHRvIGFkZCB3YXkgdG8gaW5kaWNhdGUgWE1MIHNjaGVtYSB0eXBlIGZvciBsb2dFbnRyeQotICAgIC8vIEFkZCBsb2cgZW50cnkKLSAgICBwdy5wcmludCgiPCIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiICIpOwotICAgIHB3LnByaW50KAotICAgICAgInhzaTp0eXBlPVwiaHR0cE1lc3NhZ2VFbnRyeVwiICIpOwotICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX0lEX1VDICsgIj1cIiIgKyBpZCArICJcIiAiKTsKLSAgICBwdy5wcmludCgKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSX0NPTlZFUlNBVElPTl9JRCArICI9XCIiICsgY29udmVyc2F0aW9uSWQgKyAiXCIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfVFlQRSArICI9XCIiICsgdHlwZSArICJcIiAiKTsKLSAgICBwdy5wcmludGxuKFdTSUNvbnN0YW50cy5BVFRSX1RJTUVTVEFNUCArICI9XCIiICsgdGltZXN0YW1wICsgIlwiPiIpOwotCi0gICAgaWYgKGlzTWltZUNvbnRlbnQoKSkKLSAgICB7Ci0gICAgICAgIC8vIEFkZCBtZXNzYWdlIGNvbnRlbnQgd2l0aCBhdHRhY2htZW50cyBlbGVtZW50Ci0gICAgICAgIHB3LnByaW50KCI8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX01FU1NBR0VfQ09OVEVOVF9XSVRIX0FUVEFDSE1FTlRTKTsKLSAgICAgICAgaWYgKGJvbSAhPSAwKQotICAgICAgICAgIHB3LnByaW50KCIgIiArIFdTSUNvbnN0YW50cy5BVFRSX0JPTSArICI9XCIiICsgYm9tICsgIlwiIik7Ci0gICAgICAgIHB3LnByaW50KCI+Iik7Ci0KLSAgICAgICAgQ29sbGVjdGlvbiBwYXJ0TGlzdCA9IG1pbWVQYXJ0cy5nZXRQYXJ0cygpOwotICAgICAgICBpZiAoIXBhcnRMaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgCUl0ZXJhdG9yIGlNaW1lUGFydHMgPSBwYXJ0TGlzdC5pdGVyYXRvcigpOwotICAgICAgICAJd2hpbGUgKGlNaW1lUGFydHMuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAJICBNaW1lUGFydCBtaW1lUGFydCA9IChNaW1lUGFydClpTWltZVBhcnRzLm5leHQoKTsKLSAgICAgICAgIAkgIHB3LnByaW50KG1pbWVQYXJ0LnRvWE1MU3RyaW5nKG5hbWVzcGFjZU5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBlbmQgbWVzc2FnZSBlbGVtZW50Ci0gICAgICAgIHB3LnByaW50bG4oIjwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX01FU1NBR0VfQ09OVEVOVF9XSVRIX0FUVEFDSE1FTlRTICsgIj4iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIEFkZCBtZXNzYWdlIGNvbnRlbnQgZWxlbWVudAotICAgICAgcHcucHJpbnQoIjwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9DT05URU5UKTsKLSAgICAgIGlmIChib20gIT0gMCkKLSAgICAgICAgcHcucHJpbnQoIiAiICsgV1NJQ29uc3RhbnRzLkFUVFJfQk9NICsgIj1cIiIgKyBib20gKyAiXCIiKTsKLSAgICAgIHB3LnByaW50KCI+Iik7Ci0KLSAgICAgIC8vIEFkZCBlbmNvZGVkIG1lc3NhZ2UKLSAgICAgIHB3LnByaW50KFhNTFV0aWxzLnhtbEVzY2FwZWRTdHJpbmcobWVzc2FnZSkpOwotICAgICAgCi0gICAgICAvLyBBZGQgZW5kIG1lc3NhZ2UgZWxlbWVudAotICAgICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9DT05URU5UICsgIj4iKTsKLSAgICB9Ci0KLSAgICAvLyBBZGQgc2VuZGVySVBQb3J0IGVsZW1lbnQKLSAgICBwdy5wcmludGxuKAotICAgICAgIjwiCi0gICAgICAgICsgbnNOYW1lCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLkVMRU1fU0VOREVSX0hPU1RfQU5EX1BPUlQKLSAgICAgICAgKyAiPiIKLSAgICAgICAgKyBzZW5kZXJIb3N0QW5kUG9ydAotICAgICAgICArICI8LyIKLSAgICAgICAgKyBuc05hbWUKLSAgICAgICAgKyBXU0lDb25zdGFudHMuRUxFTV9TRU5ERVJfSE9TVF9BTkRfUE9SVAotICAgICAgICArICI+Iik7Ci0KLSAgICAvLyBBZGQgcmVjZWl2ZXJJUCBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigKLSAgICAgICI8IgotICAgICAgICArIG5zTmFtZQotICAgICAgICArIFdTSUNvbnN0YW50cy5FTEVNX1JFQ0VJVkVSX0hPU1RfQU5EX1BPUlQKLSAgICAgICAgKyAiPiIKLSAgICAgICAgKyByZWNlaXZlckhvc3RBbmRQb3J0Ci0gICAgICAgICsgIjwvIgotICAgICAgICArIG5zTmFtZQotICAgICAgICArIFdTSUNvbnN0YW50cy5FTEVNX1JFQ0VJVkVSX0hPU1RfQU5EX1BPUlQKLSAgICAgICAgKyAiPiIpOwotCi0gICAgLy8gQWRkIEhUVFBIZWFkZXJzIGVsZW1lbnQKLSAgICBwdy5wcmludCgiPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9IVFRQX0hFQURFUlMgKyAiPiIpOwotCi0gICAgLy8gQUREOiBEb2VzIHRoaXMgc3RyaW5nIG5lZWQgdG8gYmUgWE1MIGVuY29kZWQ/Ci0gICAgLy8gQWRkIEhUVFAgaGVhZGVycwotICAgIHB3LnByaW50KFhNTFV0aWxzLnhtbEVzY2FwZWRTdHJpbmcoaHR0cEhlYWRlcnMpKTsKLQotICAgIC8vIEVuZCBIVFRQSGVhZGVycyBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fSFRUUF9IRUFERVJTICsgIj4iKTsKLQotICAgIC8vIEVuZCBsb2cgZW50cnkKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgLy8gUmV0dXJuIHN0cmluZwotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTWVzc2FnZUVudHJ5I2lzTWltZUNvbnRlbnQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNNaW1lQ29udGVudCgpCi0gIHsKLSAgICByZXR1cm4gaXNNaW1lQ29udGVudDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1lc3NhZ2VFbnRyeSNzZXRNaW1lQ29udGVudCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNaW1lQ29udGVudChib29sZWFuIGlzTWltZUNvbnRlbnQpCi0gIHsKLSAgICB0aGlzLmlzTWltZUNvbnRlbnQgPSBpc01pbWVDb250ZW50OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTWVzc2FnZUVudHJ5I2dldE1JTUVQYXJ0cygpCi0gICAqLwotICBwdWJsaWMgTWltZVBhcnRzIGdldE1pbWVQYXJ0cygpCi0gIHsKLSAgICByZXR1cm4gbWltZVBhcnRzOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTWVzc2FnZUVudHJ5I3NldE1pbWVQYXJ0cygpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNaW1lUGFydHMoTWltZVBhcnRzIG1pbWVQYXJ0cykKLSAgewotICAgIHRoaXMubWltZVBhcnRzID0gbWltZVBhcnRzOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvaW1wbC9NaW1lUGFydEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvaW1wbC9NaW1lUGFydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyNWZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTWltZVBhcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTm92IDIyLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci0KLS8qKgotICogQGF1dGhvciBsYXV6b25kCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgTWltZVBhcnRJbXBsIGltcGxlbWVudHMgTWltZVBhcnQgCi17Ci0gIHByaXZhdGUgU3RyaW5nIG1pbWVDb250ZW50OwotICBwcml2YXRlIFN0cmluZyBtaW1lSGVhZGVyczsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBib3VuZGFyeVN0cmluZ3MgPSBuZXcgU3RyaW5nWzBdOwotICAKLSAgcHVibGljIE1pbWVQYXJ0SW1wbCAoKQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1pbWVQYXJ0I2dldENvbnRlbnQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkKLSAgewotICAgIHJldHVybiB0aGlzLm1pbWVDb250ZW50OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTWltZVBhcnQjc2V0Q29udGVudChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb250ZW50KFN0cmluZyBtaW1lQ29udGVudCkKLSAgewotICAJdGhpcy5taW1lQ29udGVudCA9IG1pbWVDb250ZW50OwotICB9Ci0KLSAgLyoqCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0I2dldEhlYWRlcnMoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJzKCkKLSAgewotICAJcmV0dXJuIHRoaXMubWltZUhlYWRlcnM7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5NaW1lUGFydCNzZXRIZWFkZXJzKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhlYWRlcnMoU3RyaW5nIG1pbWVIZWFkZXJzKQotICB7Ci0gIAl0aGlzLm1pbWVIZWFkZXJzID0gbWltZUhlYWRlcnM7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5NaW1lUGFydCNnZXRCb3VuZGFyeVN0cmluZ3MoKQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldEJvdW5kYXJ5U3RyaW5ncygpCi0gIHsKLSAgCXJldHVybiB0aGlzLmJvdW5kYXJ5U3RyaW5nczsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1pbWVQYXJ0I3NldEJvdW5kYXJ5U3RyaW5ncyhTdHJpbmdbXSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEJvdW5kYXJ5U3RyaW5ncyhTdHJpbmdbXSBib3VuZGFyeVN0cmluZ3MpCi0gIHsKLSAgCXRoaXMuYm91bmRhcnlTdHJpbmdzID0gYm91bmRhcnlTdHJpbmdzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiB0b1hNTFN0cmluZyhXU0lDb25zdGFudHMuTlNfTkFNRV9XU0lfTE9HKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50I3RvWE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIEFkZCBtaW1lUGFydCBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigiPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9NSU1FX1BBUlQgICsgIj4iKTsKLSAgICAKLSAgICAvLyBBZGQgYm91bmRhcnkgc3RyaW5nIGVsZW1lbnQKLSAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZGFyeVN0cmluZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgICBwdy5wcmludCgiPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9CT1VOREFSWV9TVFJJTkcgKyAiPiIpOwotICAgICAgICBwdy5wcmludChib3VuZGFyeVN0cmluZ3NbaV0pOwotICAgICAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9CT1VOREFSWV9TVFJJTkcgKyAiPiIpOwotICAgIH0KLSAgIAotICAgIC8vIEFkZCBtaW1lSGVhZGVycyBlbGVtZW50Ci0gICAgcHcucHJpbnQoIjwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9IRUFERVJTICsgIj4iKTsKLSAgICBwdy5wcmludChYTUxVdGlscy54bWxFc2NhcGVkU3RyaW5nKG1pbWVIZWFkZXJzKSk7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9IRUFERVJTICsgIj4iKTsKLQotICAgIC8vIEFkZCBlbmNvZGVkIGNvbnRlbnQKLSAgICBwdy5wcmludCgiPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9NSU1FX0NPTlRFTlQgKyAiPiIpOwotICAgIGlmICgobWltZUNvbnRlbnQuaW5kZXhPZigiPCIpICE9IC0xKSAgfHwgCi0gICAgICAgIChtaW1lQ29udGVudC5pbmRleE9mKCI+IikgIT0gLTEpICB8fCAKLQkJKG1pbWVDb250ZW50LmluZGV4T2YoIlwiIikgIT0gLTEpIHx8Ci0JCShtaW1lQ29udGVudC5pbmRleE9mKCJcJyIpICE9IC0xKSkKLSAgICAJcHcucHJpbnQoWE1MVXRpbHMueG1sRXNjYXBlZFN0cmluZyhtaW1lQ29udGVudCkpOwotICAgIGVsc2UKLSAgICAgICAgcHcucHJpbnQoZ2V0Q29udGVudCgpKTsKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9NSU1FX0NPTlRFTlQgKyAiPiIpOwotIAotICAgIC8vIEFkZCBlbmQgbWVzc2FnZSBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9QQVJUICsgIj4iKTsKLQotICAgIC8vIFJldHVybiBzdHJpbmcKLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTWltZVBhcnRzSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9pbXBsL01pbWVQYXJ0c0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzOTJjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTWltZVBhcnRzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydHM7Ci0KLS8qKgotICogTWltZVBhcnRzSW1wbCBjbGFzcy4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBEYXZpZCBMYXV6b24gKGxhdXpvbmRAY2EuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIE1pbWVQYXJ0c0ltcGwgaW1wbGVtZW50cyBNaW1lUGFydHMKLXsKLQkKLSAgcHJvdGVjdGVkIE1pbWVQYXJ0IHJvb3RQYXJ0OwotICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBtaW1lUGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgcHVibGljIE1pbWVQYXJ0c0ltcGwoKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5NaW1lUGFydHMjZ2V0Um9vdFBhcnQoKQotICAgKi8KLSAgcHVibGljIE1pbWVQYXJ0IGdldFJvb3RQYXJ0KCkKLSAgewotCXJldHVybiByb290UGFydDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1pbWVQYXJ0cyNzZXRSb290UGFydChNaW1lUGFydCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJvb3RQYXJ0KE1pbWVQYXJ0IHJvb3RQYXJ0KQotICB7Ci0gIAl0aGlzLnJvb3RQYXJ0ID0gcm9vdFBhcnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5NaW1lUGFydHMjY291bnQoKQotICAgKi8KLSAgcHVibGljIGludCBjb3VudCgpCi0gIHsKLQlyZXR1cm4gbWltZVBhcnRzLnNpemUoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1pbWVQYXJ0cyNhZGRQYXJ0KE1pbWVQYXJ0KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUGFydChNaW1lUGFydCBwYXJ0KQotICB7Ci0gIAlpZiAocGFydCAhPSBudWxsKQotICAJICBtaW1lUGFydHMuYWRkKHBhcnQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTWltZVBhcnRzI2dldFBhcnRzKCkKLSAgICovCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldFBhcnRzKCkKLSAgewotICAJcmV0dXJuIG1pbWVQYXJ0czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvQ2h1bmtlZERhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL0NodW5rZWREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYjhhZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvQ2h1bmtlZERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHdpbGwgcHJvY2VzcyBjaHVua2VkIGRhdGEuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBDaHVua2VkRGF0YQotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBtb3JlQ2h1bmtlZERhdGEgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBjaHVua2VkRGF0YSA9ICIiOwotICBwcm90ZWN0ZWQgU29ja2V0SGFuZGxlciBzb2NrZXRIYW5kbGVyID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIENodW5rZWREYXRhIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBDaHVua2VkRGF0YSgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgQ2h1bmtlZERhdGEgb2JqZWN0LgotICAgKiBAcGFyYW0gc29ja2V0SGFuZGxlciBzb2NrZXQgaGFuZGxlci4KLSAgICogQHBhcmFtIG1vcmVDaHVua2VkRGF0YSBjaHVua2VkIGRhdGEuCi0gICAqLwotICBwdWJsaWMgQ2h1bmtlZERhdGEoU29ja2V0SGFuZGxlciBzb2NrZXRIYW5kbGVyLCBib29sZWFuIG1vcmVDaHVua2VkRGF0YSkKLSAgewotICAgIHRoaXMuc29ja2V0SGFuZGxlciA9IHNvY2tldEhhbmRsZXI7Ci0gICAgdGhpcy5tb3JlQ2h1bmtlZERhdGEgPSBtb3JlQ2h1bmtlZERhdGE7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIENodW5rZWREYXRhIG9iamVjdC4KLSAgICogQHBhcmFtIHNvY2tldEhhbmRsZXIgc29ja2V0IGhhbmRsZXIuCi0gICAqIEBwYXJhbSBjaHVua2VkRGF0YSBjaHVua2VkIGRhdGEuCi0gICAqLwotICBwdWJsaWMgQ2h1bmtlZERhdGEoU29ja2V0SGFuZGxlciBzb2NrZXRIYW5kbGVyLCBTdHJpbmcgY2h1bmtlZERhdGEpCi0gIHsKLSAgICB0aGlzLnNvY2tldEhhbmRsZXIgPSBzb2NrZXRIYW5kbGVyOwotICAgIHRoaXMuY2h1bmtlZERhdGEgPSBjaHVua2VkRGF0YTsKLSAgICB0aGlzLm1vcmVDaHVua2VkRGF0YSA9IGNoZWNrRGF0YShjaHVua2VkRGF0YSk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIHRoZSBjaHVua2VkIGRhdGEgdG8gdGhlIGJ1ZmZlci4KLSAgICogQHBhcmFtIGNodW5rZWREYXRhIGNodW5rZWQgZGF0YS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZERhdGEoU3RyaW5nIGNodW5rZWREYXRhKQotICB7Ci0gICAgdGhpcy5jaHVua2VkRGF0YSArPSBjaHVua2VkRGF0YTsKLSAgICB0aGlzLm1vcmVDaHVua2VkRGF0YSA9IGNoZWNrRGF0YShjaHVua2VkRGF0YSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGRhdGEgYnVmZmVyLgotICAgKiBAcmV0dXJuICBkYXRhIGJ1ZmZlci4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5jaHVua2VkRGF0YTsKLSAgfQotCi0gIC8qKgotICAgKiBDbGVhciBkYXRhIGJ1ZmZlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyRGF0YSgpCi0gIHsKLSAgICB0aGlzLmNodW5rZWREYXRhID0gIiI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIG1vcmUgY2h1bmtlZCBkYXRhLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgbW9yZSBjaHVua2VkIGRhdGEuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc01vcmVDaHVua2VkRGF0YSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5tb3JlQ2h1bmtlZERhdGE7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlIGFuZCBhZGQgZGF0YSB0byB0aGUgYnVmZmVyLgotICAgKiBAcGFyYW0gbWVzc2FnZUJ1ZmZlciBhIFN0cmluZ0J1ZmZlciBvYmplY3QuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBkYXRhIGlzIGFkZGVkIHRvIHRoZSBidWZmZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVBbmRBZGREYXRhVG9CdWZmZXIoU3RyaW5nQnVmZmVyIG1lc3NhZ2VCdWZmZXIpCi0gIHsKLSAgICBib29sZWFuIG1vcmVDaHVua2VkRGF0YSA9IGZhbHNlOwotICAgIGlmICghdGhpcy5tb3JlQ2h1bmtlZERhdGEpCi0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICBkZWJ1ZygiZGVjb2RlQW5kQWRkRGF0YVRvQnVmZmVyIiwgImNodW5rZWREYXRhOiAiICsgY2h1bmtlZERhdGEpOwotCi0gICAgICBtb3JlQ2h1bmtlZERhdGEgPSBkZWNvZGVEYXRhKGNodW5rZWREYXRhLCBtZXNzYWdlQnVmZmVyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9yZUNodW5rZWREYXRhOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGRhdGEuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tEYXRhKFN0cmluZyBjaHVua2VkRGF0YSkKLSAgewotICAgIGJvb2xlYW4gbW9yZUNodW5rZWREYXRhID0gZmFsc2U7Ci0gICAgaW50IGluZGV4OwotCi0gICAgLy8gTG9vayBmb3IgW0NSTEZdWzBdW0NSTEZdIGluIHRoZSBjaHVua2VkIGRhdGEgICAgICAKLSAgICBpZiAoKGluZGV4ID0KLSAgICAgIGNodW5rZWREYXRhLmluZGV4T2YoU29ja2V0SGFuZGxlci5DUkxGICsgIjAiICsgU29ja2V0SGFuZGxlci5DUkxGKSkKLSAgICAgICE9IC0xKQotICAgIHsKLSAgICAgIG1vcmVDaHVua2VkRGF0YSA9IGZhbHNlOwotCi0gICAgICAvLyBERUJVRzoKLSAgICAgIGRlYnVnKAotICAgICAgICAiY2hlY2tEYXRhIiwKLSAgICAgICAgIkNodW5rIGNvbnRhaW5zIFtDUkxGXVswXVtDUkxGXSwgc28gdGhlcmUgaXMgbm8gbW9yZSBkYXRhLiIpOwotICAgIH0KLQotICAgIC8vIExvb2sgZm9yIFswXVtDUkxGXSBhdCBzdGFydCBvZiBjaHVua2VkIGRhdGEgICAgICAKLSAgICBlbHNlIGlmIChjaHVua2VkRGF0YS5zdGFydHNXaXRoKCIwIiArIFNvY2tldEhhbmRsZXIuQ1JMRikpCi0gICAgewotICAgICAgbW9yZUNodW5rZWREYXRhID0gZmFsc2U7Ci0KLSAgICAgIC8vIERFQlVHOgotICAgICAgZGVidWcoCi0gICAgICAgICJjaGVja0RhdGEiLAotICAgICAgICAiQ2h1bmsgZGF0YSBzdGFydHMgd2l0aCBbMF1bQ1JMRl0sIHNvIHRoZXJlIGlzIG5vIG1vcmUgZGF0YS4iKTsKLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2Ugc3RlcCB0aHJvdWdoIGl0IHRvIHNlZSBpZiB3ZSBoYXZlIGFsbCBvZiB0aGUgZGF0YQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtb3JlQ2h1bmtlZERhdGEgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBtb3JlQ2h1bmtlZERhdGE7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlIGNodW5rZWQgZGF0YS4KLSAgICogCi0gICAqIERhdGEgZm9ybWF0OgotICAgKiA8cHJlPgotICAgKiAgIFtDaHVuayBTaXplXVtDUkxGXVtEYXRhIENodW5rXVtDUkxGXVtDaHVuayBTaXplXVtDUkxGXVtEYXRhIENodW5rXVtDUkxGXS4uLlswXVtDUkxGXVtPcHRpb25hbCBGb290ZXJdW0NSTEZdCi0gICAqIDwvcHJlPgotICAgKiAKLSAgICogQHBhcmFtIGNodW5rZWREYXRhCi0gICAqIEBwYXJhbSBtZXNzYWdlTG9nZ2luZ0J1ZmZlcgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGRlY29kZURhdGEoU3RyaW5nIGNodW5rZWREYXRhLCBTdHJpbmdCdWZmZXIgbWVzc2FnZUJ1ZmZlcikKLSAgewotICAgIGJvb2xlYW4gZW5kT2ZEYXRhID0gZmFsc2U7Ci0gICAgaW50IG5leHRJbmRleCA9IDA7Ci0gICAgaW50IHByZXZJbmRleCA9IDA7Ci0gICAgaW50IGNodW5rU2l6ZSA9IDA7Ci0KLSAgICBTdHJpbmcgbmV4dENodW5rRGF0YSA9IG51bGw7Ci0KLSAgICAvLyBQcm9jZXNzIGVhY2ggY2h1bmsgb2YgZGF0YQotICAgIHdoaWxlICghKGVuZE9mRGF0YSkKLSAgICAgICYmIChuZXh0SW5kZXggPCBjaHVua2VkRGF0YS5sZW5ndGgoKSkKLSAgICAgICYmIChuZXh0SW5kZXggPSBjaHVua2VkRGF0YS5pbmRleE9mKFNvY2tldEhhbmRsZXIuQ1JMRiwgcHJldkluZGV4KSkgIT0gLTEpCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBkYXRhIGxlbmd0aCB3aGljaCBpcyByaWdodCBhZnRlciB0aGlzCi0gICAgICBTdHJpbmcgaGV4Q2h1bmtlZFNpemUgPSBjaHVua2VkRGF0YS5zdWJzdHJpbmcocHJldkluZGV4LCBuZXh0SW5kZXgpOwotCi0gICAgICAvLyBEZWNvZGUgbGVuZ3RoCi0gICAgICBjaHVua1NpemUgPSBJbnRlZ2VyLmRlY29kZSgiMHgiICsgaGV4Q2h1bmtlZFNpemUpLmludFZhbHVlKCk7Ci0KLSAgICAgIC8vIERFQlVHOgotICAgICAgZGVidWcoImRlY29kZURhdGEiLCAiY2h1bmtlZFNpemU6ICIgKyBjaHVua1NpemUpOwotCi0gICAgICAvLyBJZiBzaXplIGlzIHplcm8sIHRoZW4gd2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiB0aGUgY2h1bmtlZCBkYXRhCi0gICAgICBpZiAoY2h1bmtTaXplID09IDApCi0gICAgICB7Ci0gICAgICAgIGVuZE9mRGF0YSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYWxsIG9mIHRoZSBkYXRhIHRoZW4gc3RvcAotICAgICAgZWxzZSBpZiAobmV4dEluZGV4ICsgMiArIGNodW5rU2l6ZSA+IGNodW5rZWREYXRhLmxlbmd0aCgpKQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBuZXh0Q2h1bmtEYXRhID0KLSAgICAgICAgICBjaHVua2VkRGF0YS5zdWJzdHJpbmcobmV4dEluZGV4ICsgMiwgbmV4dEluZGV4ICsgMiArIGNodW5rU2l6ZSk7Ci0KLSAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgIGRlYnVnKCJkZWNvZGVEYXRhIiwgIm5leHRDaHVua0RhdGE6ICIgKyBuZXh0Q2h1bmtEYXRhKTsKLQotICAgICAgICAvLyBHZXQgbWVzc2FnZSBiYXNlZCBvbiBsZW5ndGgKLSAgICAgICAgaWYgKG1lc3NhZ2VCdWZmZXIgIT0gbnVsbCkKLSAgICAgICAgICBtZXNzYWdlQnVmZmVyLmFwcGVuZChuZXh0Q2h1bmtEYXRhKTsKLSAgICAgIH0KLQotICAgICAgLy8gUG9pbnQgYXQgdGhlIG5leHQgY2h1bmsgc2l6ZQotICAgICAgcHJldkluZGV4ID0gbmV4dEluZGV4ICsgMiArIGNodW5rU2l6ZSArIDI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVuZE9mRGF0YTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWJ1Zy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIHRoaXMuc29ja2V0SGFuZGxlci5kZWJ1ZygiQ2h1bmtlZERhdGEiLCBtZXRob2QsIG1lc3NhZ2UpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGNlOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvcjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBmb3IgcmVjZWl2aW5nIGNvbm5lY3Rpb24gZXZlbnRzLgotICogCi0gKiBAYXV0aG9yIFNlcmdleSBTdWhvcnVjaGtpbgotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uTGlzdGVuZXIKLXsKLSAgLyoqCi0gICAqIEludm9rZWQgd2hlbiBjb25uZWN0aW9uIGlzIGNsb3NlZC4KLSAgICogQHBhcmFtIGNvbm5lY3Rpb24gc29ja2V0IGNvbm5lY3Rpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb25uZWN0aW9uQ2xvc2VkKFNvY2tldENvbm5lY3Rpb24gY29ubmVjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9NZXNzYWdlRW50cnlRdWV1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvTWVzc2FnZUVudHJ5UXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1NDc1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9NZXNzYWdlRW50cnlRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZ1dyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBxdWV1ZSB0aGF0IGlzIHVzZWQgdG8gd3JpdGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWVzc2FnZXMKLSAqIHRvIHRoZSBsb2cgZmlsZSBpbiB0aGUgY29ycmVjdCBvcmRlci4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRW50cnlRdWV1ZQotewotICAvKioKLSAgICogUmVxdWVzdCB0eXBlIG1lc3NhZ2UgZW50cnkgcXVldWUuCi0gICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIHJlcXVlc3RMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gIC8qKgotICAgKiBSZXNwb25zZSB0eXBlIG1lc3NhZ2UgZW50cnkgcXVldWUuCi0gICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIHJlc3BvbnNlTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAvKioKLSAgICogTW9uaXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBNb25pdG9yIG1vbml0b3IgPSBudWxsOwotCi0gIC8qKgotICAgKiBMb2cgZmlsZS4KLSAgICovCi0gIHByb3RlY3RlZCBMb2cgbG9nID0gbnVsbDsKLQotICAvKioKLSAgICogTG9nIHdyaXRlci4KLSAgICovCi0gIHByb3RlY3RlZCBMb2dXcml0ZXIgbG9nV3JpdGVyID0gbnVsbDsKLQotICAvKioKLSAgICogTGlzdCBsb2NrLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsaXN0TG9jayA9ICJsaXN0TG9jayI7Ci0KLSAgLyoqCi0gICAqIE1lc3NhZ2UgSUQgd2hpY2ggaXMgaW5jcmVtZW50ZWQgd2hlbiBhIG5ldyBsb2cgZW50cnkgaXMgYWRkZWQgdG8gdGhlIGxvZyBmaWxlLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBtZXNzYWdlSWQgPSAxOwotCi0gIC8qKgotICAgKiBDcmVhdGUgbWVzc2FnZSBlbnRyeSBxdWV1ZS4KLSAgICogQHBhcmFtIG1vbml0b3IgYSBtb25pdG9yLgotICAgKiBAcGFyYW0gbG9nIHRoZSBsb2cuCi0gICAqIEBwYXJhbSBsb2dXcml0ZXIgYSBsb2cgd3JpdGVyLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VFbnRyeVF1ZXVlKE1vbml0b3IgbW9uaXRvciwgTG9nIGxvZywgTG9nV3JpdGVyIGxvZ1dyaXRlcikKLSAgewotICAgIC8vIFNhdmUgaW5wdXQgcmVmZXJlbmNlcwotICAgIHRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0gICAgdGhpcy5sb2cgPSBsb2c7Ci0gICAgdGhpcy5sb2dXcml0ZXIgPSBsb2dXcml0ZXI7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGxvZyBlbnRyeSB0byBxdWV1ZS4KLSAgICogQHBhcmFtIG1lc3NhZ2VFbnRyeSBhIG1lc3NhZ2UgZW50cnkuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlzIHRoZXJlIGlzIGEgcHJvYmxlbSBhZGRpbmcgdGhlIGxvZyAKLSAgICogICAgICAgICBlbnRyeSB0byB0aGUgcXVldWUuCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTWVzc2FnZUVudHJ5KE1lc3NhZ2VFbnRyeSBtZXNzYWdlRW50cnkpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgc3luY2hyb25pemVkIChsaXN0TG9jaykKLSAgICB7Ci0gICAgICAvLyBJZiB0aGlzIGlzIGEgcmVxdWVzdCB0eXBlIG9mIG1lc3NhZ2UgZW50cnksIHRoZW4gYWRkIHRvIHJlcXVlc3QgbGlzdAotICAgICAgaWYgKG1lc3NhZ2VFbnRyeS5nZXRUeXBlKCkuZXF1YWxzKE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QpKQotICAgICAgewotICAgICAgICByZXF1ZXN0TGlzdC5hZGQobWVzc2FnZUVudHJ5KTsKLSAgICAgIH0KLQotICAgICAgLy8gT3RoZXJ3aXNlIHRoaXMgaXMgYSByZXNwb25zZSB0eXBlIG9mIG1lc3NhZ2UgZW50cnkKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzcG9uc2VMaXN0LmFkZChtZXNzYWdlRW50cnkpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRlbGwgdGhlIGxvZyBlbnRyeSB3cml0ZXIgdGhyZWFkIHRvIHJ1bgotICAgIHdyaXRlRnJvbVF1ZXVlKCk7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIGFueSBsb2cgZW50cmllcyBuZWVkIHRvIGJlIHdyaXR0ZW4uCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlzIHRoZXJlIGlzIGEgcHJvYmxlbSBhZGRpbmcgbG9nIGVudHJpZXMuCi0gIAotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlRnJvbVF1ZXVlKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgTWVzc2FnZUVudHJ5IHJlcXVlc3RNZXNzYWdlRW50cnkgPSBudWxsOwotICAgIE1lc3NhZ2VFbnRyeSByZXNwb25zZU1lc3NhZ2VFbnRyeSA9IG51bGw7Ci0gICAgYm9vbGVhbiByZXNwb25zZUZvdW5kID0gZmFsc2U7Ci0KLSAgICAvLyBDcmVhdGUgYXJyYXkgdGhhdCB3aWxsIGNvbnRhaW4gbGlzdCBvZiBpbmRleCB0byByZW1vdmUgZnJvbSByZXF1ZXN0IGxpc3QKLSAgICBpbnRbXSByZXF1ZXN0SW5kZXhMaXN0ID0gbmV3IGludFtyZXF1ZXN0TGlzdC5zaXplKCldOwotICAgIGludCByZXFJbmRleENvdW50ID0gMDsKLQotICAgIHN5bmNocm9uaXplZCAobGlzdExvY2spCi0gICAgewotICAgICAgLy8gSWYgdGhlcmUgYXJlIGVudHJpZXMgaW4gdGhlIHJlcXVlc3QgcXVldWUsCi0gICAgICAvLyB0aGVuIHRyeSB0byBtYXRjaCB0aGVtIHdpdGggZW50cmllcyBpbiB0aGUgcmVzcG9uc2UgcXVldWUKLSAgICAgIGZvciAoaW50IHJlcUluZGV4ID0gMDsgcmVxSW5kZXggPCByZXF1ZXN0TGlzdC5zaXplKCk7IHJlcUluZGV4KyspCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCByZXF1ZXN0IGxvZyBlbnRyeQotICAgICAgICByZXF1ZXN0TWVzc2FnZUVudHJ5ID0gKE1lc3NhZ2VFbnRyeSkgcmVxdWVzdExpc3QuZWxlbWVudEF0KHJlcUluZGV4KTsKLQotICAgICAgICAvLyBDaGVjayBlYWNoIHJlc3BvbnNlIGxvZyBlbnRyeSB0byBzZWUgaWYgdGhlIGNvbnZlcnNhdGlvbklkIG1hdGNoZXMKLSAgICAgICAgcmVzcG9uc2VGb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCByZXNwSW5kZXggPSAwOwotICAgICAgICAgIHJlc3BJbmRleCA8IHJlc3BvbnNlTGlzdC5zaXplKCkgJiYgIXJlc3BvbnNlRm91bmQ7Ci0gICAgICAgICAgcmVzcEluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXQgcmVzcG9uc2UgbG9nIGVudHJ5Ci0gICAgICAgICAgcmVzcG9uc2VNZXNzYWdlRW50cnkgPQotICAgICAgICAgICAgKE1lc3NhZ2VFbnRyeSkgcmVzcG9uc2VMaXN0LmVsZW1lbnRBdChyZXNwSW5kZXgpOwotCi0gICAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGhhdmUgdGhlIHNhbWUgY29udmVyc2F0aW9uSWQsCi0gICAgICAgICAgLy8gdGhlbiB3cml0ZSB0aGVtIG91dCB0byB0aGUgbG9nIGZpbGUKLSAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2VFbnRyeQotICAgICAgICAgICAgLmdldENvbnZlcnNhdGlvbklkKCkKLSAgICAgICAgICAgIC5lcXVhbHMocmVzcG9uc2VNZXNzYWdlRW50cnkuZ2V0Q29udmVyc2F0aW9uSWQoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzcG9uc2VGb3VuZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aGUgaWQgZm9yIHRoZSBsb2cgZW50cmllcwotICAgICAgICAgICAgcmVxdWVzdE1lc3NhZ2VFbnRyeS5zZXRJZChnZXROZXh0TWVzc2FnZUlkKCkpOwotICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlRW50cnkuc2V0SWQoZ2V0TmV4dE1lc3NhZ2VJZCgpKTsKLQotICAgICAgICAgICAgLy8gV3JpdGUgb3V0IHJlcXVlc3QgYW5kIHRoZW4gcmVzcG9uc2UKLSAgICAgICAgICAgIC8vPT09PSBTUyBzdGFydCA6IHdoYXQgdGhpcyBsaW5lIGlzIHVzZWQgZm9yPz8/IC0gY2F1c2VzIG1lbW9yeSBsZWFrLCBhcyBubyByZW1vdmVMb2dFbnRyeSBpcyBjYWxsZWQgPT09PQotICAgICAgICAgICAgLy8gICAgICAgICAgICBsb2cuYWRkTG9nRW50cnkocmVxdWVzdE1lc3NhZ2VFbnRyeSk7Ci0gICAgICAgICAgICAvLz09PT0gU1MgZW5kID09PQotICAgICAgICAgICAgU3RyaW5nUmVhZGVyIHJlcXVlc3RSZWFkZXIgPQotICAgICAgICAgICAgICBuZXcgU3RyaW5nUmVhZGVyKHJlcXVlc3RNZXNzYWdlRW50cnkudG9YTUxTdHJpbmcoIiIpKTsKLSAgICAgICAgICAgIGxvZ1dyaXRlci53cml0ZShyZXF1ZXN0UmVhZGVyKTsKLQotICAgICAgICAgICAgLy8gRGlzcGxheSBtZXNzYWdlCi0gICAgICAgICAgICBwcmludE1lc3NhZ2UocmVxdWVzdE1lc3NhZ2VFbnRyeSk7Ci0KLSAgICAgICAgICAgIC8vIFdyaXRlIG91dCByZXNwb25zZQotICAgICAgICAgICAgLy89PT09IFNTIHN0YXJ0IDogd2hhdCB0aGlzIGxpbmUgaXMgdXNlZCBmb3I/Pz8gLSBjYXVzZXMgbWVtb3J5IGxlYWssIGFzIG5vIHJlbW92ZUxvZ0VudHJ5IGlzIGNhbGxlZCA9PT09Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIGxvZy5hZGRMb2dFbnRyeShyZXNwb25zZU1lc3NhZ2VFbnRyeSk7Ci0gICAgICAgICAgICAvLz09PT0gU1MgZW5kID09PQotICAgICAgICAgICAgU3RyaW5nUmVhZGVyIHJlc3BvbnNlUmVhZGVyID0KLSAgICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcihyZXNwb25zZU1lc3NhZ2VFbnRyeS50b1hNTFN0cmluZygiIikpOwotICAgICAgICAgICAgbG9nV3JpdGVyLndyaXRlKHJlc3BvbnNlUmVhZGVyKTsKLQotICAgICAgICAgICAgLy8gRGlzcGxheSBtZXNzYWdlCi0gICAgICAgICAgICBwcmludE1lc3NhZ2UocmVzcG9uc2VNZXNzYWdlRW50cnkpOwotCi0gICAgICAgICAgICAvLyBBZGQgcmVxdWVzdCB0byBsaXN0IHNvIHRoYXQgaXQgY2FuIGJlIHJlbW92ZWQgbGF0ZXIKLSAgICAgICAgICAgIHJlcXVlc3RJbmRleExpc3RbcmVxSW5kZXhDb3VudCsrXSA9IHJlcUluZGV4OwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgbG9nIGVudHJ5IGZyb20gcmVzcG9uc2UgbGlzdAotICAgICAgICAgICAgcmVzcG9uc2VMaXN0LnJlbW92ZShyZXNwSW5kZXgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBSZW1vdmUgcmVxdWVzdHMgdGhhdCB3ZXJlIHdyaXR0ZW4gb3V0Ci0gICAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgcmVxSW5kZXhDb3VudDsgY291bnQrKykKLSAgICAgICAgcmVxdWVzdExpc3QucmVtb3ZlKHJlcXVlc3RJbmRleExpc3RbY291bnRdKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuZXh0IG1lc3NhZ2UgaWRlbnRpZmllci4KLSAgICogQHJldHVybiB0aGUgbmV4dCBtZXNzYWdlIGlkZW50aWZpZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIFN0cmluZyBnZXROZXh0TWVzc2FnZUlkKCkKLSAgewotICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihtZXNzYWdlSWQrKyk7Ci0gIH0KLQotICAvKioKLSAgICogRGlzcGxheSBtZXNzYWdlLgotICAgKiBAcGFyYW0gbWVzc2FnZUVudHJ5IGEgbWVzc2FnZSBlbnRyeS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHByaW50TWVzc2FnZShNZXNzYWdlRW50cnkgbWVzc2FnZUVudHJ5KQotICB7Ci0gICAgLy8gRGlzcGxheSBtZXNzYWdlCi0gICAgbW9uaXRvci5wcmludE1lc3NhZ2UoCi0gICAgICAibG9nMDEiLAotICAgICAgbWVzc2FnZUVudHJ5LmdldElkKCkKLSAgICAgICAgKyAiLCAiCi0gICAgICAgICsgbWVzc2FnZUVudHJ5LmdldFR5cGUoKQotICAgICAgICArICIsICIKLSAgICAgICAgKyBtZXNzYWdlRW50cnkuZ2V0U2VuZGVySG9zdEFuZFBvcnQoKSwKLSAgICAgICJMb2cgbWVzc2FnZSBlbnRyeSAtICBJRDogIgotICAgICAgICArIG1lc3NhZ2VFbnRyeS5nZXRJZCgpCi0gICAgICAgICsgIiwgVHlwZTogIgotICAgICAgICArIG1lc3NhZ2VFbnRyeS5nZXRUeXBlKCkKLSAgICAgICAgKyAiLCBTZW5kZXI6ICIKLSAgICAgICAgKyBtZXNzYWdlRW50cnkuZ2V0U2VuZGVySG9zdEFuZFBvcnQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL01vbml0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5NzYyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9Nb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuVG9vbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lGaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZ1dyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UZXN0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogTWVzc2FnZSBNb25pdG9yLgotICoKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJici51cy5pYm0uY29tKQotICovCi0KLXB1YmxpYyBjbGFzcyBNb25pdG9yCi17Ci0gIC8qKgotICAgKiBNZXNzYWdlIGxpc3QuCi0gICAqLwotICBwcm90ZWN0ZWQgTWVzc2FnZUxpc3QgbWVzc2FnZUxpc3QgPSBudWxsOwotCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9CVU5ETEVfTkFNRSA9Ci0gICAgIm9yZy53c2kudGVzdC5tb25pdG9yLk1vbml0b3IiOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTQUdFX01FU1NBR0UgPQotICAgICJVc2FnZTogTW9uaXRvciAtY29uZmlnIDxjb25maWdGaWxlbmFtZT4iOwotCi0gIC8qKgotICAgKiBDb252ZXJzdGF0aW9uIElELgotICAgKi8KLSAgcHJpdmF0ZSBpbnQgY29udmVyc2F0aW9uSWQgPSAxOwotCi0gIHByaXZhdGUgTG9nIGxvZyA9IG51bGw7Ci0gIHByaXZhdGUgTG9nV3JpdGVyIGxvZ1dyaXRlciA9IG51bGw7Ci0gIHByaXZhdGUgTW9uaXRvckNvbmZpZyBtb25pdG9yQ29uZmlnID0gbnVsbDsKLQotICAvKioKLSAgKiBUb29sIGluZm9ybWF0aW9uLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX05BTUUgPSAiTW9uaXRvciI7Ci0KLSAgcHJvdGVjdGVkIFRvb2xJbmZvIHRvb2xJbmZvID0gbnVsbDsKLQotICBwcm90ZWN0ZWQgVmVjdG9yIGxpc3RlbmVyTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICBwcm90ZWN0ZWQgTWVzc2FnZUVudHJ5UXVldWUgbWVzc2FnZUVudHJ5UXVldWUgPSBudWxsOwotCi0gIC8qKgotICAgKiBNZXNzYWdlIG1vbml0b3IuCi0gICAqIEBwYXJhbSBhcmdzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBjcmVhdGluZyBhIE1vbml0b3Igb2JqZWN0LgotICAgKi8KLSAgcHVibGljIE1vbml0b3IoU3RyaW5nW10gYXJncykgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ3JlYXRlIG1lc3NhZ2UgbGlzdAotICAgIHRoaXMubWVzc2FnZUxpc3QgPSBuZXcgTWVzc2FnZUxpc3QoUkVTT1VSQ0VfQlVORExFX05BTUUpOwotCi0gICAgLy8gVG9vbCBpbmZvcm1hdGlvbgotICAgIHRvb2xJbmZvID0gbmV3IFRvb2xJbmZvKFRPT0xfTkFNRSk7Ci0KLSAgICAvLyBDcmVhdGUgZG9jdW1lbnQgZmFjdG9yeQotICAgIERvY3VtZW50RmFjdG9yeSBkb2N1bWVudEZhY3RvcnkgPSBEb2N1bWVudEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIC8vIEdldCBuZXcgY29uZmlnIG9iamVjdAotICAgIG1vbml0b3JDb25maWcgPSBkb2N1bWVudEZhY3RvcnkubmV3TW9uaXRvckNvbmZpZygpOwotICAgIG1vbml0b3JDb25maWcuaW5pdCh0aGlzLm1lc3NhZ2VMaXN0KTsKLQotICAgIC8vIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLSAgICBtb25pdG9yQ29uZmlnLnBhcnNlQXJncyhhcmdzKTsKLQotICAgIFN0cmluZyBsb2dMb2NhdGlvbiA9IG1vbml0b3JDb25maWcuZ2V0TG9nTG9jYXRpb24oKTsKLSAgICBpZiAobG9nTG9jYXRpb24uaW5kZXhPZihXU0lDb25zdGFudHMuUEFUSF9TRVBBUkFUT1IpID4gLTEpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMTEiLAotICAgICAgICAgIG1vbml0b3JDb25maWcuZ2V0TG9nTG9jYXRpb24oKSwKLSAgICAgICAgICAiVGhlIGxvZyBmaWxlIGxvY2F0aW9uIHZhbHVlIGNhbm5vdCBjb250YWluIHRoZSBwYXNzIHNlcGFyYXRvciBjaGFyYWN0ZXI6IikpOwotICAgIH0KLQotICAgIEZpbGUgZmlsZSA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0IGZpbGUgb2JqZWN0IGZvciBsb2cgZmlsZQotICAgICAgZmlsZSA9IG5ldyBGaWxlKG1vbml0b3JDb25maWcuZ2V0TG9nTG9jYXRpb24oKSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgIG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UoImNvbmZpZzA3IiwgIkNvdWxkIG5vdCBnZXQgbG9nIGZpbGUgbG9jYXRpb24uIiksCi0gICAgICAgIGUpOwotICAgIH0KLQotICAgIC8vIElmIHJlcGxhY2UgZmxhZyBpcyBmYWxzZSBhbmQgZmlsZSBleGlzdHMsIHRoZW4gdGhyb3cgZXhjZXB0aW9uCi0gICAgaWYgKGZpbGUuZXhpc3RzKCkgJiYgIW1vbml0b3JDb25maWcuZ2V0UmVwbGFjZUxvZygpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzA4IiwKLSAgICAgICAgICBtb25pdG9yQ29uZmlnLmdldExvZ0xvY2F0aW9uKCksCi0gICAgICAgICAgIkxvZyBmaWxlIGFscmVhZHkgZXhpc3RzOiIpKTsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBDcmVhdGUgb3V0cHV0IGZpbGUKLSAgICAgIGxvZyA9IGRvY3VtZW50RmFjdG9yeS5uZXdMb2coKTsKLQotICAgICAgLy8gU2V0IHN0eWxlIHNoZWV0IHN0cmluZwotICAgICAgbG9nLnNldFN0eWxlU2hlZXRTdHJpbmcoCi0gICAgICAgIG1vbml0b3JDb25maWcuZ2V0QWRkU3R5bGVTaGVldCgpLmdldFN0eWxlU2hlZXRTdHJpbmcoKSk7Ci0KLSAgICAgIC8vIEdldCBsb2cgd3JpdGVyCi0gICAgICBsb2dXcml0ZXIgPSBkb2N1bWVudEZhY3RvcnkubmV3TG9nV3JpdGVyKCk7Ci0gICAgICBsb2dXcml0ZXIuc2V0V3JpdGVyKG1vbml0b3JDb25maWcuZ2V0TG9nTG9jYXRpb24oKSk7Ci0KLSAgICAgIC8vIFdyaXRlIHN0YXJ0IG9mIGxvZyBmaWxlCi0gICAgICBsb2dXcml0ZXIud3JpdGUobmV3IFN0cmluZ1JlYWRlcihsb2cuZ2V0U3RhcnRYTUxTdHJpbmcoIiIpKSk7Ci0KLSAgICAgIC8vIFdyaXRlIG1vbml0b3IgdG9vbCBpbmZvcm1hdGlvbgotICAgICAgbG9nV3JpdGVyLndyaXRlKG5ldyBTdHJpbmdSZWFkZXIodG9YTUxTdHJpbmcoIiIpKSk7Ci0KLSAgICAgIC8vIENyZWF0ZSBsb2cgZW50cnkgcXVldWUKLSAgICAgIG1lc3NhZ2VFbnRyeVF1ZXVlID0gbmV3IE1lc3NhZ2VFbnRyeVF1ZXVlKHRoaXMsIGxvZywgbG9nV3JpdGVyKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiZXJyb3IwMyIsCi0gICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgbG9nIG9yIGxvZyB3cml0ZXIuIiksCi0gICAgICAgIGUpOwotICAgIH0KLQotICAgIC8vIEdldCBtYW5JblRoZU1pZGRsZSBzZXR0aW5ncwotICAgIE1hbkluVGhlTWlkZGxlIG1hbkluVGhlTWlkZGxlID0gbW9uaXRvckNvbmZpZy5nZXRNYW5JblRoZU1pZGRsZSgpOwotCi0gICAgLy8gR2V0IGxpc3Qgb2YgcmVkaXJlY3RzCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBtYW5JblRoZU1pZGRsZS5nZXRSZWRpcmVjdExpc3QoKS5pdGVyYXRvcigpOwotCi0gICAgLy8gUHJvY2VzcyBlYWNoIHJlZGlyZWN0Ci0gICAgUmVkaXJlY3QgcmVkaXJlY3Q7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICAvLyBHZXQgbmV4dCByZWRpcmVjdAotICAgICAgcmVkaXJlY3QgPSAoUmVkaXJlY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgLy8gQ3JlYXRlIHNlcnZlciBzb2NrZXQgc29ja2V0IGxpc3RlbmVyCi0gICAgICBsaXN0ZW5lckxpc3QuYWRkKG5ldyBTZXJ2ZXJTb2NrZXRMaXN0ZW5lcih0aGlzLCByZWRpcmVjdCkpOwotICAgIH0KLQotICAgIC8vIEFkZCBzaHV0ZG93biBob29rCi0gICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBTaHV0ZG93bkhvb2soKSk7Ci0KLSAgICAvLyBDcmVhdGUgYW5kIHN0YXJ0IGNvbnNvbGUKLSAgICBDb25zb2xlIGNvbnNvbGUgPSBuZXcgQ29uc29sZSgpOwotICAgIGNvbnNvbGUuc3RhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1vbml0b3IgY29uZmlnIGZpbGUuCi0gICAqIEByZXR1cm4gdGhlIG1vbml0b3IgY29uZmlnIGZpbGUuCi0gICAqLwotICBwdWJsaWMgTW9uaXRvckNvbmZpZyBnZXRNb25pdG9yQ29uZmlnKCkKLSAgewotICAgIHJldHVybiBtb25pdG9yQ29uZmlnOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbG9nIG9iamVjdC4KLSAgICogQHJldHVybiB0aGUgbG9nIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBMb2cgZ2V0TG9nKCkKLSAgewotICAgIHJldHVybiB0aGlzLmxvZzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGxvZyBlbnRyeSBxdWV1ZSBvYmplY3QuCi0gICAqIEByZXR1cm4gdGhlIGxvZyBlbnRyeSBxdWV1ZSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZUVudHJ5UXVldWUgZ2V0TWVzc2FnZUVudHJ5UXVldWUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMubWVzc2FnZUVudHJ5UXVldWU7Ci0gIH0KLQotICAvKioKLSAgICogVGVybWluYXRlIHRoZSBtb25pdG9yLgotICAgKi8KLSAgdm9pZCBleGl0TW9uaXRvcigpCi0gIHsKLSAgICBwcmludE1lc3NhZ2UoInN0b3BwaW5nMDEiLCAiU3RvcHBpbmcgdGhlIG1vbml0b3IuLi4iKTsKLSAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIHRoZSBtb25pdG9yIGJlY2F1c2UgYW4gZXhjZXB0aW9uIG9jY3VycmVkLgotICAgKi8KLSAgdm9pZCBleGl0TW9uaXRvcihFeGNlcHRpb24gZSkKLSAgewotICAgIC8vIERpc3BsYXkgZXJyb3IgbWVzc2FnZQotICAgIHByaW50TWVzc2FnZSgKLSAgICAgICJzdG9wcGluZzAyIiwKLSAgICAgICJTdG9wcGluZyBtb25pdG9yIGJlY2F1c2UgYW4gZXhjZXB0aW9uIG9jY3VycmVkLiIpOwotICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRVhDRVBUSU9OOiAiICsgZS50b1N0cmluZygpKTsKLSAgICBpZiAodGhpcy5tb25pdG9yQ29uZmlnLmdldFZlcmJvc2VPcHRpb24oKSkKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0KLSAgICAvLyBFeGl0IG1vbml0b3IKLSAgICBleGl0TW9uaXRvcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3AgdGhlIG1vbml0b3IuCi0gICAqLwotICB2b2lkIHN0b3BNb25pdG9yKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCBsaXN0IG9mIGxpc3RlbmVycyB0byBzdG9wCi0gICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOwotCi0gICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICAoKFNlcnZlclNvY2tldExpc3RlbmVyKSBpdGVyYXRvci5uZXh0KCkpLnNodXRkb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdhaXQgZm9yIHRoZSBjbGVhbnVwIHRpbWVvdXQgc2Vjb25kcwotICAgICAgVGhyZWFkLnNsZWVwKG1vbml0b3JDb25maWcuZ2V0VGltZW91dCgpICogMTAwMCk7Ci0KLSAgICAgIC8vIFdyaXRlIGVuZCBvZiBsb2cgZmlsZQotICAgICAgaWYgKGxvZ1dyaXRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBsb2dXcml0ZXIud3JpdGUobmV3IFN0cmluZ1JlYWRlcihsb2cuZ2V0RW5kWE1MU3RyaW5nKCIiKSkpOwotCi0gICAgICAgIGxvZ1dyaXRlci5jbG9zZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBBREQ6IEhvdyBzaG91bGQgdGhpcyBleGVjcHRpb24gYmUgaGFuZGxlZD8KLSAgICB9Ci0KLSAgICBwcmludE1lc3NhZ2UoInN0b3BwZWQwMSIsICJNb25pdG9yIHN0b3BwZWQuIik7Ci0gIH0KLQotICAvKioKLSAgICogQ29tbWFuZCBsaW5lIGludGVyZmFjZS4KLSAgICogQHBhcmFtIGFyZ3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBNb25pdG9yIG1vbml0b3IgPSBudWxsOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIGNvbmZpZ0ZpbGVOYW1lOwotICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikKLSAgICAgIHsKLSAgICAgICAgc3RhdGljUHJpbnRNZXNzYWdlKCJ1c2FnZTAxIiwgVVNBR0VfTUVTU0FHRSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICBpZiAoIWFyZ3NbMF0uZXF1YWxzSWdub3JlQ2FzZSgiLWNvbmZpZyIpKQotICAgICAgewotICAgICAgICBzdGF0aWNQcmludE1lc3NhZ2UoInVzYWdlMDEiLCBVU0FHRV9NRVNTQUdFKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFJ1biB0aGUgbW9uaXRvcgotICAgICAgbW9uaXRvciA9IG5ldyBNb25pdG9yKGFyZ3MpOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBib29sZWFuIHByaW50U3RhY2tUcmFjZSA9IHRydWU7Ci0gICAgICBTdHJpbmcgbWVzc2FnZUlEOwotICAgICAgU3RyaW5nIGRlZmF1bHRNZXNzYWdlOwotICAgICAgU3RyaW5nIG1lc3NhZ2VEYXRhOwotCi0gICAgICBpZiAoKGUgaW5zdGFuY2VvZiBXU0lGaWxlTm90Rm91bmRFeGNlcHRpb24pCi0gICAgICAgIHx8IChlIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgcHJpbnRTdGFja1RyYWNlID0gZmFsc2U7Ci0gICAgICAgIG1lc3NhZ2VJRCA9ICJlcnJvcjAxIjsKLSAgICAgICAgZGVmYXVsdE1lc3NhZ2UgPSAiTW9uaXRvciBFcnJvcjoiOwotICAgICAgICBtZXNzYWdlRGF0YSA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByaW50U3RhY2tUcmFjZSA9IHRydWU7Ci0gICAgICAgIG1lc3NhZ2VJRCA9ICJlcnJvcjAyIjsKLSAgICAgICAgZGVmYXVsdE1lc3NhZ2UgPSAiTW9uaXRvciBTdG9wcGVkIEJ5IEV4Y2VwdGlvbjoiOwotICAgICAgICBtZXNzYWdlRGF0YSA9IGUudG9TdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgbW9uaXRvci5wcmludE1lc3NhZ2UobWVzc2FnZUlELCBtZXNzYWdlRGF0YSwgZGVmYXVsdE1lc3NhZ2UpOwotICAgICAgZWxzZQotICAgICAgICBNb25pdG9yLnN0YXRpY1ByaW50TWVzc2FnZShtZXNzYWdlSUQsIG1lc3NhZ2VEYXRhLCBkZWZhdWx0TWVzc2FnZSk7Ci0KLSAgICAgIGlmIChwcmludFN0YWNrVHJhY2UpCi0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0KLSAgICAgIC8vIEV4aXQKLSAgICAgIGlmIChtb25pdG9yICE9IG51bGwpCi0gICAgICAgIG1vbml0b3IuZXhpdE1vbml0b3IoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgU3lzdGVtLmV4aXQoMik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IGEgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBrZXkgYSBrZXkuCi0gICAqIEBwYXJhbSBkZWZhdWx0TWVzc2FnZSBhIGRlZmF1bHQgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICBwcmludE1lc3NhZ2Uoa2V5LCBudWxsLCBkZWZhdWx0TWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgYSBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICogQHBhcmFtIGtleSBhIGtleS4KLSAgICogQHBhcmFtIG1lc3NhZ2VEYXRhIG1lc3NhZ2UgZGF0YS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlIGEgZGVmYXVsdCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJpbnRNZXNzYWdlKAotICAgIFN0cmluZyBrZXksCi0gICAgU3RyaW5nIG1lc3NhZ2VEYXRhLAotICAgIFN0cmluZyBkZWZhdWx0TWVzc2FnZSkKLSAgewotICAgIG1lc3NhZ2VMaXN0LnByaW50TWVzc2FnZShrZXksIG1lc3NhZ2VEYXRhLCBkZWZhdWx0TWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSBhIGtleS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlIGEgZGVmYXVsdCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXRpY1ByaW50TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICBzdGF0aWNQcmludE1lc3NhZ2Uoa2V5LCBudWxsLCBkZWZhdWx0TWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSBhIGtleS4KLSAgICogQHBhcmFtIG1lc3NhZ2VEYXRhIG1lc3NhZ2UgZGF0YS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlIGEgZGVmYXVsdCBtZXNzYWdlLgotICAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGF0aWNQcmludE1lc3NhZ2UoCi0gICAgU3RyaW5nIGtleSwKLSAgICBTdHJpbmcgbWVzc2FnZURhdGEsCi0gICAgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQotICB7Ci0gICAgTWVzc2FnZUxpc3QucHJpbnRNZXNzYWdlKAotICAgICAgUkVTT1VSQ0VfQlVORExFX05BTUUsCi0gICAgICBrZXksCi0gICAgICBtZXNzYWdlRGF0YSwKLSAgICAgIGRlZmF1bHRNZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG5leHQgY29udmVyc2F0aW9uIGlkZW50aWZpZXIuCi0gICAqIEByZXR1cm4gdGhlIG5leHQgY29udmVyc2F0aW9uIGlkZW50aWZpZXIuCi0gICAqLwotICBzeW5jaHJvbml6ZWQgaW50IGdldE5leHRDb252ZXJzYXRpb25JZCgpCi0gIHsKLSAgICByZXR1cm4gY29udmVyc2F0aW9uSWQrKzsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gWE1MIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgbmFtZXNwYWNlIHByZWZpeC4KLSAgICogQHJldHVybiBYTUwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICAvLyBTdGFydAotICAgIHB3LnByaW50KHRvb2xJbmZvLmdldFN0YXJ0WE1MU3RyaW5nKG5hbWVzcGFjZU5hbWUpKTsKLQotICAgIC8vIENvbmZpZwotICAgIHB3LnByaW50KAotICAgICAgbW9uaXRvckNvbmZpZy50b1hNTFN0cmluZyhXU0lDb25zdGFudHMuTlNfTkFNRV9XU0lfTU9OSVRPUl9DT05GSUcpKTsKLQotICAgIC8vIEVuZAotICAgIHB3LnByaW50bG4odG9vbEluZm8uZ2V0RW5kWE1MU3RyaW5nKG5hbWVzcGFjZU5hbWUpKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNodXRkb3duIGhvb2suCi0gICAqLwotICBjbGFzcyBTaHV0ZG93bkhvb2sgZXh0ZW5kcyBUaHJlYWQKLSAgewotICAgIC8qKgotICAgICAqIFJ1biBzaHV0ZG93biBwcm9jZWR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBzdG9wTW9uaXRvcigpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSdW4gY29tbWFuZCBmcm9tIGNvbnNvbGUuCi0gICAqLwotICBjbGFzcyBDb25zb2xlIGV4dGVuZHMgVGhyZWFkCi0gIHsKLSAgICAvKioKLSAgICAgKiBQcm9tcHQgdXNlciBhbmQgd2FpdCBmb3IgaW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0KLSAgICAgIC8vIEdldCB0aGUgZXhpdCBzdHJpbmcKLSAgICAgIFN0cmluZyBleGl0U3RyaW5nID0gbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZSgiZXhpdDAxIiwgImV4aXQiKTsKLQotICAgICAgLy8gRGlzcGxheSBvcHRpb25zIGFuZCBob3cgdG8gc3RvcCBhcHBsaWNhdGlvbgotICAgICAgVGVzdFV0aWxzLnByaW50VG9vbEluZm8odG9vbEluZm8pOwotICAgICAgU3lzdGVtLm91dC5wcmludChtb25pdG9yQ29uZmlnLnRvU3RyaW5nKCkpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIik7Ci0gICAgICBwcmludE1lc3NhZ2UoCi0gICAgICAgICJzdGFydDAxIiwKLSAgICAgICAgIlRoZSAiCi0gICAgICAgICAgKyB0b29sSW5mby5nZXROYW1lKCkKLSAgICAgICAgICArICIgdG9vbCBpcyByZWFkeSB0byBpbnRlcmNlcHQgYW5kIGxvZyB3ZWIgc2VydmljZSBtZXNzYWdlcy4iKTsKLSAgICAgIHByaW50TWVzc2FnZSgKLSAgICAgICAgInN0YXJ0MDIiLAotICAgICAgICAiVHlwZSBcImV4aXRcIiB0byBzdG9wIHRoZSAiICsgdG9vbEluZm8uZ2V0TmFtZSgpICsgIi4iKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICIpOwotCi0gICAgICAvLyBHZXQgdGhlIHRpbWUgdG8gc3RvcCBhY2NlcHRpbmcgY29ubmVjdGlvbnMKLSAgICAgIGxvbmcgc3RvcFRpbWUgPQotICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIChtb25pdG9yQ29uZmlnLmdldExvZ0R1cmF0aW9uKCkgKiAxMDAwKTsKLSAgICAgIC8vIFNTCi0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBHZXQgc3RkaW4gYXMgYSBidWZmZXJlZCByZWFkZXIKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0KLSAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOwotCi0gICAgICAgIC8vIFByb2Nlc3MgaW5wdXQgZnJvbSBjb25zb2xlCi0gICAgICAgIGJvb2xlYW4gZXhpdCA9IGZhbHNlOwotICAgICAgICB3aGlsZSAoKCFleGl0KSAmJiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBzdG9wVGltZSkpCi0gICAgICAgIHsgLy8gU1MKLSAgICAgICAgICAvLyBTbGVlcAotICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOwotCi0gICAgICAgICAgLy8gQ2hlY2sgZm9yIHVzZXIgaW5wdXQKLSAgICAgICAgICBpZiAocmVhZGVyLnJlYWR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlYWRlci5yZWFkTGluZSgpLmVxdWFsc0lnbm9yZUNhc2UoZXhpdFN0cmluZykpCi0gICAgICAgICAgICAgIGV4aXQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIEFERDogSG93IHNob3VsZCB0aGlzIGJlIGhhbmRsZWQ/Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlLnRvU3RyaW5nKCkpOwotICAgICAgfQotCi0gICAgICAvLyBFeGl0Ci0gICAgICBleGl0TW9uaXRvcigpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvTW9uaXRvci5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvTW9uaXRvci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGQ2MDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL01vbml0b3IucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jCi0jIE1vbml0b3IgbWVzc2FnZSByZXNvdXJjZSBidW5kbGUuCi0jCi11c2FnZTAxPVVzYWdlOiBNb25pdG9yIC1jb25maWcgPGNvbmZpZ0ZpbGVuYW1lPgotc3RvcHBlZDAxPU1vbml0b3Igc3RvcHBlZC4KLWVycm9yMDE9TW9uaXRvciBFcnJvcjoKLWVycm9yMDI9TW9uaXRvciBTdG9wcGVkIEJ5IEV4Y2VwdGlvbjogCi1lcnJvcjAzPUNvdWxkIG5vdCBjcmVhdGUgbG9nIG9yIGxvZyB3cml0ZXIuCi1lcnJvcjA0PU1vbml0b3IgY2Fubm90IGNvbm5lY3QgdG8gYSByZWRpcmVjdCBob3N0Ogotc3RvcHBpbmcwMT1TdG9wcGluZyB0aGUgbW9uaXRvci4uLgotc3RvcHBpbmcwMj1TdG9wcGluZyBtb25pdG9yIGJlY2F1c2UgYW4gZXhjZXB0aW9uIG9jY3VycmVkLgotbG9nMDE9TG9nIG1lc3NhZ2UgZW50cnkgW0lELCBUeXBlLCBTZW5kZXJdOgotc3RhcnQwMT1UaGUgTW9uaXRvciB0b29sIGlzIHJlYWR5IHRvIGludGVyY2VwdCBhbmQgbG9nIHdlYiBzZXJ2aWNlIG1lc3NhZ2VzLgotc3RhcnQwMj1UeXBlICJleGl0IiB0byBzdG9wIHRoZSBNb25pdG9yLgotZXhpdDAxPWV4aXQKLWNvbmZpZzAxPVRoZSBzcGVjaWZpZWQgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQ6Ci1jb25maWcwMj1Nb25pdG9yIGNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgbm90IGZvdW5kLiAgU3BlY2lmaWVkIGZpbGUgbG9jYXRpb246Ci1jb25maWcwMz1Db3VsZCBub3QgcmVhZCBtb25pdG9yIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNwZWNpZmllZCBmaWxlIGxvY2F0aW9uOgotY29uZmlnMDQ9RWxlbWVudCBtdXN0IGNvbnRhaW4gYW4gaW50ZWdlciB2YWx1ZS4gIEVsZW1lbnQgbmFtZToKLWNvbmZpZzA1PU1vbml0b3IgY29uZmlndXJhdGlvbiBmaWxlIGRpZCBub3QgY29udGFpbiBhbnkgcmVkaXJlY3Qgc3RhdGVtZW50cy4KLWNvbmZpZzA2PU1vbml0b3IgY29uZmlndXJhdGlvbiBmaWxlIGRpZCBub3QgY29udGFpbiB0aGUgbG9nIGZpbGUgVVJJLgotY29uZmlnMDc9Q291bGQgbm90IGdldCBsb2cgZmlsZSBsb2NhdGlvbi4KLWNvbmZpZzA4PUxvZyBmaWxlIGFscmVhZHkgZXhpc3RzLiAgU3BlY2lmaWVkIGZpbGUgbG9jYXRpb246Ci1jb25maWcwOT1FbGVtZW50IGlzIG1pc3NpbmcuIEVsZW1lbnQgbmFtZToKLWNvbmZpZzEwPVBhcmFtZXRlciB2YWx1ZSBjYW4ndCBiZSBuZWdhdGl2ZS4gRWxlbWVudCBuYW1lOgotY29uZmlnMTE9VGhlIGxvZyBmaWxlIGxvY2F0aW9uIHZhbHVlIGNhbm5vdCBjb250YWluIHRoZSBwYXNzIHNlcGFyYXRvciBjaGFyYWN0ZXI6Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL1NlcnZlclNvY2tldExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9TZXJ2ZXJTb2NrZXRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQzNzYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL1NlcnZlclNvY2tldExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuUmVkaXJlY3Q7Ci0KLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIEEgc2VydmVyIHNvY2tldCBsaXN0ZW5lci4KLSAqCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyU29ja2V0TGlzdGVuZXIKLSAgZXh0ZW5kcyBUaHJlYWQKLSAgaW1wbGVtZW50cyBDb25uZWN0aW9uTGlzdGVuZXIgLy8gU1MKLXsKLSAgcHJvdGVjdGVkIE1vbml0b3IgbW9uaXRvciA9IG51bGw7Ci0gIHByb3RlY3RlZCBSZWRpcmVjdCByZWRpcmVjdCA9IG51bGw7Ci0KLSAgcHJvdGVjdGVkIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBudWxsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzdG9wU2VydmVyU29ja2V0ID0gZmFsc2U7Ci0KLSAgcHJvdGVjdGVkIFZlY3RvciBjb25uZWN0aW9uTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIHNlcnZlciBzb2NrZXQgbGlzdGVuZXIuCi0gICAqIEBwYXJhbSBtb25pdG9yIGEgTW9uaXRvciBvYmplY3QuCi0gICAqIEBwYXJhbSByZWRpcmVjdCBhIFJlZGlyZWN0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTZXJ2ZXJTb2NrZXRMaXN0ZW5lcihNb25pdG9yIG1vbml0b3IsIFJlZGlyZWN0IHJlZGlyZWN0KQotICB7Ci0gICAgdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLSAgICB0aGlzLnJlZGlyZWN0ID0gcmVkaXJlY3Q7Ci0KLSAgICAvLyBTdGFydCBsaXN0ZW5pbmcKLSAgICBzdGFydCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJ1biB0aGUgdGhyZWFkIGFuZCBsaXN0ZW4gZm9yIGEgY29ubmVjdGlvbiBvbiB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIENyZWF0ZSBzZXJ2ZXIgc29ja2V0Ci0gICAgICBzZXJ2ZXJTb2NrZXQgPQotICAgICAgICBuZXcgU2VydmVyU29ja2V0KAotICAgICAgICAgIHJlZGlyZWN0LmdldExpc3RlblBvcnQoKSwKLSAgICAgICAgICByZWRpcmVjdC5nZXRNYXhDb25uZWN0aW9ucygpKTsKLSAgICAgIC8vIFNTCi0KLSAgICAgIC8vIFNldCB0aW1lb3V0IHNvIHRoYXQgc2VydmVyIHNvY2tldCB3aWxsIGNvbnRpbnVlIHRvIGFjY2VwdCBjb25uZWN0aW9ucwotICAgICAgc2VydmVyU29ja2V0LnNldFNvVGltZW91dCgwKTsKLQotICAgICAgLy8gTGlzdGVuIGZvciBjb25uZWN0aW9ucyB1bnRpbCBpbnRlcnJ1cHRlZAotICAgICAgd2hpbGUgKCFzdG9wU2VydmVyU29ja2V0KQotICAgICAgewotICAgICAgICAvLyBBY2NlcHQgY29ubmVjdGlvbnMKLSAgICAgICAgU29ja2V0IHNvY2tldCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKLQotICAgICAgICAvLyBJZiB0aGUgc2VydmVyIHNvY2tldCB3YXMgTk9UIHN0b3BwZWQsIHByb2Nlc3MgY29ubmVjdGlvbgotICAgICAgICBpZiAoIXN0b3BTZXJ2ZXJTb2NrZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBDcmVhdGUgbmV3IGNvbm5lY3Rpb24KLSAgICAgICAgICBTb2NrZXRDb25uZWN0aW9uIHNvY2tldENvbm5lY3Rpb24gPQotICAgICAgICAgICAgbmV3IFNvY2tldENvbm5lY3Rpb24odGhpcy5tb25pdG9yLCB0aGlzLnJlZGlyZWN0LCBzb2NrZXQpOwotCi0gICAgICAgICAgLy9yZWdpc3RlciBhcyBhIGxpc3RlbmVyCi0gICAgICAgICAgc29ja2V0Q29ubmVjdGlvbi5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcyk7IC8vIFNTCi0KLSAgICAgICAgICAvLyBBZGQgdG8gY29ubmVjdGlvbiBsaXN0Ci0gICAgICAgICAgY29ubmVjdGlvbkxpc3QuYWRkKHNvY2tldENvbm5lY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIElmIHRoZSBleGNlcHRpb24gd2FzIE5PVCBjYXVzZWQgYnkgY2xvc2luZyB0aGUgc29ja2V0LCB0aGVuIHN0b3AgbW9uaXRvcgotICAgICAgaWYgKCFlLmdldE1lc3NhZ2UoKS5lcXVhbHMoInNvY2tldCBjbG9zZWQiKSkKLSAgICAgIHsKLSAgICAgICAgbW9uaXRvci5leGl0TW9uaXRvcihlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RvcCBsaXN0ZW5pbmcgZm9yIGEgY29ubmVjdGlvbiBvbiB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2h1dGRvd24oKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gU2h1dGRvd24gYWxsIGFjdGl2ZSBjb25uZWN0aW9ucwotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uZWN0aW9uTGlzdC5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgKChTb2NrZXRDb25uZWN0aW9uKSBpdGVyYXRvci5uZXh0KCkpLnNodXRkb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRlbGwgdGhlIHNlcnZlciBzb2NrZXQgbGlzdGVuaW5nIHRocmVhZCB0byBzdG9wCi0gICAgICB0aGlzLnN0b3BTZXJ2ZXJTb2NrZXQgPSB0cnVlOwotCi0gICAgICAvLyBTZXQgdGhlIHNlcnZlciBzb2NrZXQgdGltZW91dCB0byAxIG1zCi0gICAgICBzZXJ2ZXJTb2NrZXQuc2V0U29UaW1lb3V0KDEpOwotCi0gICAgICAvLyBDbG9zZSB0aGUgc2VydmVyIHNvY2tldAotICAgICAgaWYgKHNlcnZlclNvY2tldCAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgfQotCi0gIC8vID09PT0gU1Mgc3RhcnQgPT09PQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuQ29ubmVjdGlvbkxpc3RlbmVyI2Nvbm5lY3Rpb25DbG9zZWQoKQotICAgKi8KLSAgcHVibGljIHZvaWQgY29ubmVjdGlvbkNsb3NlZChTb2NrZXRDb25uZWN0aW9uIGNvbm5lY3Rpb24pCi0gIHsKLSAgICBjb25uZWN0aW9uTGlzdC5yZW1vdmUoY29ubmVjdGlvbik7Ci0gIH0KLSAgLy8gPT09PSBTUyBlbmQgPT09PQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvU29ja2V0Q29ubmVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvU29ja2V0Q29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmI3YjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL1NvY2tldENvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLlJlZGlyZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotCi1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC4qOyAvLyBTUwotCi0vKioKLSAqIEEgc29ja2V0IGNvbm5lY3Rpb24uCi0gKgotICogQGF1dGhvciBQZXRlciAgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGNsYXNzIFNvY2tldENvbm5lY3Rpb24gZXh0ZW5kcyBUaHJlYWQKLXsKLSAgcHJvdGVjdGVkIE1vbml0b3IgbW9uaXRvcjsKLSAgcHJvdGVjdGVkIFJlZGlyZWN0IHJlZGlyZWN0OwotICBwcm90ZWN0ZWQgU29ja2V0IGluU29ja2V0OwotICBwcm90ZWN0ZWQgU29ja2V0IG91dFNvY2tldDsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGh0dHBQcm94eUhvc3QgPSBudWxsOwotICBwcm90ZWN0ZWQgaW50IGh0dHBQcm94eVBvcnQ7Ci0KLSAgcHJvdGVjdGVkIFNvY2tldEhhbmRsZXIgcmVxdWVzdFNvY2tldEhhbmRsZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgU29ja2V0SGFuZGxlciByZXNwb25zZVNvY2tldEhhbmRsZXIgPSBudWxsOwotCi0gIHByaXZhdGUgVmVjdG9yIGxpc3RlbmVycyA9IG5ldyBWZWN0b3IoKTsgLy8gU1MKLQotICAvKioKLSAgICogQ3JlYXRlIHNvY2tldCBjb25uZWN0aW9uLgotICAgKiBAcGFyYW0gbW9uaXRvciAgYSBNb25pdG9yIG9iamVjdC4KLSAgICogQHBhcmFtIHJlZGlyZWN0IGEgUmVkaXJlY3Qgb2JqZWN0LgotICAgKiBAcGFyYW0gaW5Tb2NrZXQgaW4gc29ja2V0LgotICAgKi8KLSAgcHVibGljIFNvY2tldENvbm5lY3Rpb24oTW9uaXRvciBtb25pdG9yLCBSZWRpcmVjdCByZWRpcmVjdCwgU29ja2V0IGluU29ja2V0KQotICB7Ci0gICAgdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLSAgICB0aGlzLnJlZGlyZWN0ID0gcmVkaXJlY3Q7Ci0gICAgdGhpcy5pblNvY2tldCA9IGluU29ja2V0OwotCi0gICAgLy8gU3RhcnQgcHJvY2Vzc2luZyB0aGUgY29ubmVjdGlvbgotICAgIHN0YXJ0KCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgLy8gR2V0IHRoZSBIVFRQIHByb3h5IHNldHRpbmdzIGlmIHRoZXJlIGFyZSBhbnkgc2V0IChub3QgdXNlZCBjdXJyZW50bHkpCi0gICAgbG9hZEh0dHBQcm94eVNldHRpbmdzKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBPcGVuIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIKLSAgICAgIHRoaXMub3V0U29ja2V0ID0gbmV3IFNvY2tldChyZWRpcmVjdC5nZXRUb0hvc3QoKSwgcmVkaXJlY3QuZ2V0VG9Qb3J0KCkpOwotCi0gICAgICAvLyBTZXQgdGhlIHJlYWQgdGltZW91dCBmb3IgdGhlIGlucHV0IHNvY2tldAotICAgICAgdGhpcy5pblNvY2tldC5zZXRTb1RpbWVvdXQocmVkaXJlY3QuZ2V0UmVhZFRpbWVvdXRTZWNvbmRzKCkgKiAxMDAwKTsKLQotICAgICAgLy8gR2V0IHRoZSBuZXh0IGNvbnZlcnNhdGlvbiBJRAotICAgICAgaW50IGNvbnZlcnNhdGlvbklkID0gbW9uaXRvci5nZXROZXh0Q29udmVyc2F0aW9uSWQoKTsKLQotICAgICAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQgaGFuZGxlcnMgd2hpY2ggYXJlIHVzZWQgdG8gc2VuZCB0aGUgZGF0YSBmcm9tCi0gICAgICAvLyB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXIKLSAgICAgIHJlcXVlc3RTb2NrZXRIYW5kbGVyID0KLSAgICAgICAgbmV3IFNvY2tldEhhbmRsZXIoCi0gICAgICAgICAgdGhpcywKLSAgICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNULAotICAgICAgICAgIGNvbnZlcnNhdGlvbklkLAotICAgICAgICAgIHJlZGlyZWN0LmdldFRvSG9zdCgpLAotICAgICAgICAgIHRoaXMuaW5Tb2NrZXQsCi0gICAgICAgICAgdGhpcy5vdXRTb2NrZXQsCi0gICAgICAgICAgcmVkaXJlY3QuZ2V0UmVhZFRpbWVvdXRTZWNvbmRzKCkpOwotICAgICAgcmVzcG9uc2VTb2NrZXRIYW5kbGVyID0KLSAgICAgICAgbmV3IFNvY2tldEhhbmRsZXIoCi0gICAgICAgICAgdGhpcywKLSAgICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVNQT05TRSwKLSAgICAgICAgICBjb252ZXJzYXRpb25JZCwKLSAgICAgICAgICByZWRpcmVjdC5nZXRUb0hvc3QoKSwKLSAgICAgICAgICB0aGlzLm91dFNvY2tldCwKLSAgICAgICAgICB0aGlzLmluU29ja2V0LAotICAgICAgICAgIHJlZGlyZWN0LmdldFJlYWRUaW1lb3V0U2Vjb25kcygpKTsKLQotICAgICAgLy8gVGVsbCBlYWNoIHNvY2tldEhhbmRsZXIgYWJvdXQgdGhlIG90aGVyIG9uZQotICAgICAgcmVxdWVzdFNvY2tldEhhbmRsZXIuc2V0UGFpcmVkU29ja2V0SGFuZGxlcihyZXNwb25zZVNvY2tldEhhbmRsZXIpOwotICAgICAgcmVzcG9uc2VTb2NrZXRIYW5kbGVyLnNldFBhaXJlZFNvY2tldEhhbmRsZXIocmVxdWVzdFNvY2tldEhhbmRsZXIpOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBNb25pdG9yLnN0YXRpY1ByaW50TWVzc2FnZSgKLSAgICAgICAgImVycm9yMDQiLAotICAgICAgICByZWRpcmVjdC5nZXRUb0hvc3QoKSwKLSAgICAgICAgIk1vbml0b3IgY2Fubm90IGNvbm5lY3QgdG8gYSByZWRpcmVjdCBob3N0OiIpOwotCi0gICAgICBzaHV0ZG93bigpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgdGhpcy5pblNvY2tldC5jbG9zZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBMb2cgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbnZlcnNhdGlvbklEICAgICAgdGhlIGNvdmVyc2F0aW9uIGlkLgotICAgKiBAcGFyYW0gY29ubmVjdGlvblR5cGUgICAgICB0aGUgY29ubmVjdGlvbiB0eXBlLgotICAgKiBAcGFyYW0gdGltZXN0YW1wICAgICAgICAgICB0aGUgdGltZXN0YW1wLgotICAgKiBAcGFyYW0gc2VuZGVySG9zdEFuZFBvcnQgICB0aGUgc2VuZGVyIGhvc3QgYW5kIHBvcnQuCi0gICAqIEBwYXJhbSByZWNlaXZlckhvc3RBbmRQb3J0IHRoZSByZWNlaXZlciBob3N0IGFuZCBwb3J0LgotICAgKiBAcGFyYW0gbWVzc2FnZUJ1ZmZlciAgICAgICB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGJvbSAgICAgICAgICAgICAgICAgdGhlIEJPTS4KLSAgICogQHBhcmFtIGVuY29kaW5nICAgICAgICAgICAgdGhlIGVuY29kaW5nLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiAgdGhlcmUgaXMgYSBwcm9ibGVtIGxvZ2dpbmcgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgbG9nTWVzc2FnZSgKLSAgICBpbnQgY29udmVyc2F0aW9uSUQsCi0gICAgU3RyaW5nIGNvbm5lY3Rpb25UeXBlLAotICAgIFN0cmluZyB0aW1lc3RhbXAsCi0gICAgU3RyaW5nIHNlbmRlckhvc3RBbmRQb3J0LAotICAgIFN0cmluZyByZWNlaXZlckhvc3RBbmRQb3J0LAotICAgIFN0cmluZ0J1ZmZlciBtZXNzYWdlQnVmZmVyLAotICAgIGludCBib20sCi0gICAgU3RyaW5nIGVuY29kaW5nKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIE1lc3NhZ2VFbnRyeSBtZXNzYWdlRW50cnkgPSBudWxsOwotCi0gICAgLy8gQ3JlYXRlIG1lc3NhZ2UgZW50cnkKLSAgICBtZXNzYWdlRW50cnkgPQotICAgICAgY3JlYXRlTWVzc2FnZUVudHJ5KAotICAgICAgICBjb252ZXJzYXRpb25JRCwKLSAgICAgICAgY29ubmVjdGlvblR5cGUsCi0gICAgICAgIHRpbWVzdGFtcCwKLSAgICAgICAgc2VuZGVySG9zdEFuZFBvcnQsCi0gICAgICAgIHJlY2VpdmVySG9zdEFuZFBvcnQsCi0gICAgICAgIG1lc3NhZ2VCdWZmZXIudG9TdHJpbmcoKSwKLSAgICAgICAgYm9tLAotICAgICAgICBlbmNvZGluZyk7Ci0KLSAgICAvLyBERUJVRzoKLSAgICAvL2RlYnVnKCJsb2dNZXNzYWdlIiwgIiBtZXNzYWdlRW50cnk6ICIgKyBtZXNzYWdlRW50cnkpOwotCi0gICAgLy8gQWRkIGVudHJ5IHRvIHRoZSBxdWV1ZQotICAgIG1vbml0b3IuZ2V0TWVzc2FnZUVudHJ5UXVldWUoKS5hZGRNZXNzYWdlRW50cnkobWVzc2FnZUVudHJ5KTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBsb2cgZW50cnkgZnJvbSBhbGwgb2YgdGhlIGRhdGEgdGhhdCB3YXMgZ2F0aGVyZWQuCi0gICAqLwotICBwcml2YXRlIE1lc3NhZ2VFbnRyeSBjcmVhdGVNZXNzYWdlRW50cnkoCi0gICAgaW50IGNvbnZlcnNhdGlvbklELAotICAgIFN0cmluZyBtZXNzYWdlVHlwZSwKLSAgICBTdHJpbmcgdGltZXN0YW1wLAotICAgIFN0cmluZyBzZW5kZXJIb3N0QW5kUG9ydCwKLSAgICBTdHJpbmcgcmVjZWl2ZXJIb3N0QW5kUG9ydCwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBpbnQgYm9tLAotICAgIFN0cmluZyBlbmNvZGluZykKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgbG9nIGVudHJ5IG9iamVjdAotICAgIE1lc3NhZ2VFbnRyeSBtZXNzYWdlRW50cnkgPSBtb25pdG9yLmdldExvZygpLmNyZWF0ZUxvZ0VudHJ5KCk7Ci0KLSAgICAvLyBTZXQgaW5wdXQgaW5mb3JtYXRpb24gaW4gbG9nIGVudHJ5Ci0gICAgLy8gTk9URTogIFRoZSBJRCBpcyBzZXQganVzdCBiZWZvcmUgdGhlIGxvZyBlbnRyeSBpcyB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZSBpbiBMb2dFbnRyeVF1ZXVlCi0gICAgLy9sb2dFbnRyeS5zZXRJZChpZCk7Ci0gICAgbWVzc2FnZUVudHJ5LnNldENvbnZlcnNhdGlvbklkKFN0cmluZy52YWx1ZU9mKGNvbnZlcnNhdGlvbklEKSk7Ci0gICAgbWVzc2FnZUVudHJ5LnNldFR5cGUobWVzc2FnZVR5cGUpOwotICAgIG1lc3NhZ2VFbnRyeS5zZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICBtZXNzYWdlRW50cnkuc2V0U2VuZGVySG9zdEFuZFBvcnQoc2VuZGVySG9zdEFuZFBvcnQpOwotICAgIG1lc3NhZ2VFbnRyeS5zZXRSZWNlaXZlckhvc3RBbmRQb3J0KHJlY2VpdmVySG9zdEFuZFBvcnQpOwotICAgIG1lc3NhZ2VFbnRyeS5zZXRFbmNvZGluZyhlbmNvZGluZyk7Ci0KLSAgICAvLyBHZXQgSFRUUCBoZWFkZXJzIGZyb20gZnVsbCBtZXNzYWdlCi0gICAgU3RyaW5nIGh0dHBIZWFkZXJzID0gVXRpbHMuZ2V0SFRUUEhlYWRlcnMobWVzc2FnZSk7Ci0gICAgbWVzc2FnZUVudHJ5LnNldEhUVFBIZWFkZXJzKGh0dHBIZWFkZXJzKTsKLQkKLSAgIGlmIChVdGlscy5pc011bHRpcGFydFJlbGF0ZWRNZXNzYWdlKGh0dHBIZWFkZXJzKSkKLSAgICB7Ci0gICAgCU1pbWVQYXJ0cyBtaW1lUGFydHMgPSBVdGlscy5wYXJzZU11bHRpcGFydFJlbGF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGh0dHBIZWFkZXJzLCBlbmNvZGluZyk7Ci0gICAgCWlmIChtaW1lUGFydHMgPT0gbnVsbCkKLSAgICAJewotICAgIAkgIC8vIHByb2JsZW0gY3JlYXRpbmcgTWltZXBhcnRzIC0tIHRyZWF0IGl0IGFzIHNpbXBsZSBTT0FQIG1lc3NhZ2UKLSAgICAJICBTdHJpbmcgY29udGVudCA9IFV0aWxzLmdldENvbnRlbnQobWVzc2FnZSk7Ci0gICAgCSAgbWVzc2FnZUVudHJ5LnNldE1lc3NhZ2UoY29udGVudCk7Ci0gICAgCSAgbWVzc2FnZUVudHJ5LnNldE1pbWVDb250ZW50KGZhbHNlKTsKLSAgICAJfQotICAgIAllbHNlCi0gICAgCXsKLSAgICAgICAgICBtZXNzYWdlRW50cnkuc2V0TWltZVBhcnRzKG1pbWVQYXJ0cyk7Ci0gICAgICAgICAgbWVzc2FnZUVudHJ5LnNldE1pbWVDb250ZW50KHRydWUpOwotICAgIAl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIG1lc3NhZ2UgY29udGVudAotICAgICAgU3RyaW5nIGNvbnRlbnQgPSBVdGlscy5nZXRDb250ZW50KG1lc3NhZ2UpOwotICAgICAgbWVzc2FnZUVudHJ5LnNldE1lc3NhZ2UoY29udGVudCk7Ci0gICAgICBtZXNzYWdlRW50cnkuc2V0TWltZUNvbnRlbnQoZmFsc2UpOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgQk9NLCBpZiB0aGVyZSBpcyBvbmUKLSAgICBpZiAoYm9tICE9IDApCi0gICAgICBtZXNzYWdlRW50cnkuc2V0Qk9NKGJvbSk7Ci0KLSAgICByZXR1cm4gbWVzc2FnZUVudHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIExvYWQgSFRUUCBwcm94eSBzZXR0aW5ncy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvYWRIdHRwUHJveHlTZXR0aW5ncygpCi0gIHsKLSAgICAvLyBHZXQgdGhlIEhUVFAgcHJveHkgaG9zdCBzZXR0aW5nCi0gICAgdGhpcy5odHRwUHJveHlIb3N0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJodHRwLnByb3h5SG9zdCIpOwotICAgIGlmICh0aGlzLmh0dHBQcm94eUhvc3QgIT0gbnVsbCAmJiBodHRwUHJveHlIb3N0LmVxdWFscygiIikpCi0gICAgICB0aGlzLmh0dHBQcm94eUhvc3QgPSBudWxsOwotCi0gICAgLy8gSWYgdGhlcmUgd2FzIGFuIEhUVFAgcHJveHkgaG9zdCBzZXR0aW5nLCB0aGVuIGdldCB0aGUgcG9ydAotICAgIGlmICh0aGlzLmh0dHBQcm94eUhvc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcG9ydFN0cmluZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVBvcnQiKTsKLQotICAgICAgLy8gU2V0IGRlZmF1bHQgdG8gODAKLSAgICAgIGlmIChwb3J0U3RyaW5nID09IG51bGwgfHwgcG9ydFN0cmluZy5lcXVhbHMoIiIpKQotICAgICAgICB0aGlzLmh0dHBQcm94eVBvcnQgPSA4MDsKLSAgICAgIGVsc2UKLSAgICAgICAgaHR0cFByb3h5UG9ydCA9IEludGVnZXIucGFyc2VJbnQocG9ydFN0cmluZyk7Ci0gICAgfQotICB9Ci0KLSAgTW9uaXRvciBnZXRNb25pdG9yKCkKLSAgewotICAgIHJldHVybiB0aGlzLm1vbml0b3I7Ci0gIH0KLQotICBzeW5jaHJvbml6ZWQgdm9pZCB3YWtlVXAoKQotICB7Ci0gICAgZmlyZUNvbm5lY3Rpb25DbG9zZWQoKTsgLy8gU1MKLSAgICBub3RpZnlBbGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTaHV0ZG93bi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNodXRkb3duKCkKLSAgewotICAgIGlmICh0aGlzLnJlcXVlc3RTb2NrZXRIYW5kbGVyICE9IG51bGwpCi0gICAgICB0aGlzLnJlcXVlc3RTb2NrZXRIYW5kbGVyLnNodXRkb3duKCk7Ci0gICAgaWYgKHRoaXMucmVzcG9uc2VTb2NrZXRIYW5kbGVyICE9IG51bGwpCi0gICAgICB0aGlzLnJlc3BvbnNlU29ja2V0SGFuZGxlci5zaHV0ZG93bigpOwotICB9Ci0KLSAgLy8gPT09PSBTUyBzdGFydCA9PT09Ci0gIC8qKgotICAgKiBBZGQgY29ubmVjdGlvbiBldmVudCBsaXN0ZW5lci4KLSAgICogQHBhcmFtIGxpc3RlbmVyIGV2ZW50IGxpc3RlbmVyLgotICAgKiBAc2VlICNyZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgfQotICAvKioKLSAgICogUmVtb3ZlIGNvbm5lY3Rpb24gZXZlbnQgbGlzdGVuZXIuCi0gICAqIEBwYXJhbSBsaXN0ZW5lciBldmVudCBsaXN0ZW5lci4KLSAgICogQHNlZSAjYWRkQ29ubmVjdGlvbkxpc3RlbmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0KLSAgLyoqCi0gICAqIE5vdGlmeSBsaXN0ZW5lcnMgb24gY29ubmVjdGlvbiBjbG9zZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBmaXJlQ29ubmVjdGlvbkNsb3NlZCgpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IChDb25uZWN0aW9uTGlzdGVuZXIpIGkubmV4dCgpOwotICAgICAgbGlzdGVuZXIuY29ubmVjdGlvbkNsb3NlZCh0aGlzKTsKLSAgICB9Ci0gIH0KLSAgLy8gPT09PSBTUyBlbmQgPT09PQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvU29ja2V0SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvU29ja2V0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTM0ODVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL1NvY2tldEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgSUJNIENvcnBvcmF0aW9uLCBCZWFjb24gSW5mb3JtYXRpb24gVGVjaG5vbG9neSBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICBCZWFjb25JVCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotCi1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLS8qKgotICogU29ja2V0IEhhbmRsZXIuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBTb2NrZXRIYW5kbGVyIGV4dGVuZHMgVGhyZWFkCi17Ci0gIHByb3RlY3RlZCBTb2NrZXRDb25uZWN0aW9uIHNvY2tldENvbm5lY3Rpb247Ci0gIHByb3RlY3RlZCBTb2NrZXRIYW5kbGVyIHBhaXJlZFNvY2tldEhhbmRsZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvblR5cGU7Ci0gIHByb3RlY3RlZCBpbnQgY29udmVyc2F0aW9uSUQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0SG9zdDsKLSAgcHJvdGVjdGVkIGludCByZWFkVGltZW91dFNlY29uZHM7Ci0KLSAgcHJvdGVjdGVkIFNvY2tldCBpblNvY2tldDsKLSAgcHJvdGVjdGVkIFNvY2tldCBvdXRTb2NrZXQ7Ci0gIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0gIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZFRpbWVkT3V0ID0gZmFsc2U7Ci0KLSAgLy8gSTE4TjogMjAwMy4wMi4yNiBtb2RpZmllZCBieSBLLk5ha2Fnb21lQEJlYWNvbklUCi0gIHByaXZhdGUgU3RyaW5nIG1pbWVDaGFyc2V0ID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgeG1sRW5jb2RpbmcgPSBudWxsOwotCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSTEYgPSAiXHJcbiI7Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF8xMDBfQ09OVElOVUUgPQotICAgICIxMDAgQ29udGludWUiLnRvVXBwZXJDYXNlKCk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENIVU5LRUQgPQotICAgICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCIudG9VcHBlckNhc2UoKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hVTktFRF9XSVRIX1FVT1RFUyA9Ci0gICAgIlRyYW5zZmVyLUVuY29kaW5nOiBcImNodW5rZWRcIiIudG9VcHBlckNhc2UoKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9MRU5HVEggPQotICAgICJDb250ZW50LUxlbmd0aDoiLnRvVXBwZXJDYXNlKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBzb2NrZXQgaGFuZGxlci4KLSAgICogQHBhcmFtIHNvY2tldENvbm5lY3Rpb24gICBzb2NrZXQgY29ubmVjdGlvbi4KLSAgICogQHBhcmFtIGNvbm5lY3Rpb25UeXBlICAgICBjb25uZWN0aW9uIHR5cGUuCi0gICAqIEBwYXJhbSBjb252ZXJzYXRpb25JRCAgICAgY29udmVyc2F0aW9uIGlkLgotICAgKiBAcGFyYW0gdGFyZ2V0SG9zdCAgICAgICAgIHRhcmdldCBob3N0LgotICAgKiBAcGFyYW0gaW5Tb2NrZXQgICAgICAgICAgIGluIHNvY2tldC4KLSAgICogQHBhcmFtIG91dFNvY2tldCAgICAgICAgICBvdXQgc29ja2V0LgotICAgKiBAcGFyYW0gcmVhZFRpbWVvdXRTZWNvbmRzIHJlYWQgdGltZW91dCBzZWNvbmRzLgotICAgKi8KLSAgcHVibGljIFNvY2tldEhhbmRsZXIoCi0gICAgU29ja2V0Q29ubmVjdGlvbiBzb2NrZXRDb25uZWN0aW9uLAotICAgIFN0cmluZyBjb25uZWN0aW9uVHlwZSwKLSAgICBpbnQgY29udmVyc2F0aW9uSUQsCi0gICAgU3RyaW5nIHRhcmdldEhvc3QsCi0gICAgU29ja2V0IGluU29ja2V0LAotICAgIFNvY2tldCBvdXRTb2NrZXQsCi0gICAgaW50IHJlYWRUaW1lb3V0U2Vjb25kcykKLSAgewotICAgIHRoaXMuc29ja2V0Q29ubmVjdGlvbiA9IHNvY2tldENvbm5lY3Rpb247Ci0gICAgdGhpcy5jb25uZWN0aW9uVHlwZSA9IGNvbm5lY3Rpb25UeXBlOwotICAgIHRoaXMuY29udmVyc2F0aW9uSUQgPSBjb252ZXJzYXRpb25JRDsKLSAgICB0aGlzLnRhcmdldEhvc3QgPSB0YXJnZXRIb3N0OwotICAgIHRoaXMuaW5Tb2NrZXQgPSBpblNvY2tldDsKLSAgICB0aGlzLm91dFNvY2tldCA9IG91dFNvY2tldDsKLSAgICB0aGlzLnJlYWRUaW1lb3V0U2Vjb25kcyA9IHJlYWRUaW1lb3V0U2Vjb25kczsKLQotICAgIC8vIEFERDoKLSAgICB2ZXJib3NlID0KLSAgICAgIHNvY2tldENvbm5lY3Rpb24uZ2V0TW9uaXRvcigpLmdldE1vbml0b3JDb25maWcoKS5nZXRWZXJib3NlT3B0aW9uKCk7Ci0KLSAgICBzdGFydCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBwYWlyZWQgc29ja2V0IGhhbmRsZXIuCi0gICAqIEBwYXJhbSBwYWlyZWRTb2NrZXRIYW5kbGVyIHBhaXJlZCBzb2NrZXQgaGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBhaXJlZFNvY2tldEhhbmRsZXIoU29ja2V0SGFuZGxlciBwYWlyZWRTb2NrZXRIYW5kbGVyKQotICB7Ci0gICAgdGhpcy5wYWlyZWRTb2NrZXRIYW5kbGVyID0gcGFpcmVkU29ja2V0SGFuZGxlcjsKLSAgfQotCi0gIC8qKgotICAgKiBTZW5kIHRoZSBkYXRhIGZyb20gdGhlIGlucHV0IHNvY2tldCB0byB0aGUgb3V0cHV0IHNvY2tldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBpbnQgcmVhZExlbjsKLSAgICBTdHJpbmcgcmVhZE1zZzsKLSAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG51bGw7Ci0KLSAgICAvLyBDcmVhdGUgcmVhZCBidWZmZXIgICAgICAKLSAgICBieXRlW10gcmVhZEJ1ZmZlciA9IG5ldyBieXRlWzQwOTZdOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMKLSAgICAgIHRoaXMuaW5wdXRTdHJlYW0gPSB0aGlzLmluU29ja2V0LmdldElucHV0U3RyZWFtKCk7Ci0gICAgICB0aGlzLm91dHB1dFN0cmVhbSA9IHRoaXMub3V0U29ja2V0LmdldE91dHB1dFN0cmVhbSgpOwotCi0gICAgICAvLyBQcm9jZXNzIHdoaWxlIHRoZSBjb25uZWN0aW9uIGlzIGFjdGl2ZSAKLSAgICAgIC8vIChOT1RFOiB0aGVyZSBtaWdodCBiZSBtb3JlIHRoYW4gMSBtZXNzYWdlIHBlciBjb25uZWN0aW9uKQotICAgICAgYm9vbGVhbiBjb25uZWN0aW9uQWN0aXZlID0gdHJ1ZTsKLSAgICAgIHdoaWxlIChjb25uZWN0aW9uQWN0aXZlKQotICAgICAgewotICAgICAgICAvLyBSZXNldCBhbGwgZGF0YQotICAgICAgICByZWFkTGVuID0gMDsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICAvLyBSZWFkIHVudGlsIG1lc3NhZ2UgaXMgY29tcGxldGUKLSAgICAgICAgYm9vbGVhbiBtZXNzYWdlQ29tcGxldGUgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKCFtZXNzYWdlQ29tcGxldGUpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBERUJVRzoKLSAgICAgICAgICAgIGRlYnVnKCJydW4iLCAiUmVhZCBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbS4iKTsKLQotICAgICAgICAgICAgLy8gUmVhZCBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgcmVhZExlbiA9IGlucHV0U3RyZWFtLnJlYWQocmVhZEJ1ZmZlciwgMCwgcmVhZEJ1ZmZlci5sZW5ndGgpOwotCi0gICAgICAgICAgICAvLyBSZXNldCByZWFkIHRpbWVvdXQgZmxhZwotICAgICAgICAgICAgcmVhZFRpbWVkT3V0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIERFQlVHOgotICAgICAgICAgICAgZGVidWcoInJ1biIsICJyZWFkTGVuOiAiICsgcmVhZExlbik7Ci0KLSAgICAgICAgICAgIGlmIChyZWFkTGVuID09IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb25uZWN0aW9uQWN0aXZlID0gZmFsc2U7Ci0gICAgICAgICAgICAgIG1lc3NhZ2VDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIGRhdGEgd2FzIHJlYWQsIHRoZW4gY2hlY2sgZm9yIDEwMCBjb250aW51ZQotICAgICAgICAgICAgZWxzZSBpZiAocmVhZExlbiA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGRhdGEgdGhhdCB3YXMgcmVhZCwgdGhlbiBnZXQgdGhlIHRpbWVzdGFtcAotICAgICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQudGltZXN0YW1wID09IG51bGwpCi0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQudGltZXN0YW1wID0gVXRpbHMuZ2V0VGltZXN0YW1wKCk7Ci0KLSAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25UeXBlLmVxdWFscyhNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ5dGVbXSB0b0hvc3QgPQotICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgc29ja2V0Q29ubmVjdGlvbi5yZWRpcmVjdC5nZXRUb0hvc3QoKQotICAgICAgICAgICAgICAgICAgICAgICsgIjoiCi0gICAgICAgICAgICAgICAgICAgICAgKyBzb2NrZXRDb25uZWN0aW9uLnJlZGlyZWN0LmdldFRvUG9ydCgpKQotICAgICAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbmV3IFN0cmluZyhyZWFkQnVmZmVyLCAwLCByZWFkTGVuKTsKLQotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1lc3NhZ2UuaW5kZXhPZihDUkxGICsgIkhvc3Q6ICIpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDg7Ci0gICAgICAgICAgICAgICAgICBpbnQgc2Vjb25kUGFydCA9IG1lc3NhZ2UuaW5kZXhPZihDUkxGLCBpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCB0aGVuIGdvIGZvcm1hdCBpdAotICAgICAgICAgICAgICAgICAgd3JpdGUodGhpcy5vdXRwdXRTdHJlYW0sIHJlYWRCdWZmZXIsIDAsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgIHdyaXRlKHRoaXMub3V0cHV0U3RyZWFtLCB0b0hvc3QsIDAsIHRvSG9zdC5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgd3JpdGUoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICByZWFkQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBzZWNvbmRQYXJ0LAotICAgICAgICAgICAgICAgICAgICByZWFkTGVuIC0gc2Vjb25kUGFydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IHN0cmVhbSBhbmQgdGhlbiBnbyBmb3JtYXQgaXQKLSAgICAgICAgICAgICAgICAgIHdyaXRlKHRoaXMub3V0cHV0U3RyZWFtLCByZWFkQnVmZmVyLCAwLCByZWFkTGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBzdHJlYW0gYW5kIHRoZW4gZ28gZm9ybWF0IGl0Ci0gICAgICAgICAgICAgICAgd3JpdGUodGhpcy5vdXRwdXRTdHJlYW0sIHJlYWRCdWZmZXIsIDAsIHJlYWRMZW4pOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgICAgICAgIGlmICh2ZXJib3NlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJ1ZmZlclN0cmluZyA9IG5ldyBTdHJpbmcocmVhZEJ1ZmZlciwgMCwgcmVhZExlbik7Ci0gICAgICAgICAgICAgICAgZGVidWcoInJ1biIsICJidWZmZXIgYXMgc3RyaW5nOiBbIiArIGJ1ZmZlclN0cmluZyArICJdIik7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlclN0cmluZy5sZW5ndGgoKSA8PSA1MCkKLSAgICAgICAgICAgICAgICAgIGRlYnVnKAotICAgICAgICAgICAgICAgICAgICAicnVuIiwKLSAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBhcyBoZXhzdHJpbmc6IFsiCi0gICAgICAgICAgICAgICAgICAgICAgKyBVdGlscy50b0hleFN0cmluZyhidWZmZXJTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIGRlYnVnKAotICAgICAgICAgICAgICAgICAgICAicnVuIiwKLSAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBhcyBoZXhzdHJpbmc6IFsiCi0gICAgICAgICAgICAgICAgICAgICAgKyBVdGlscy50b0hleFN0cmluZyhidWZmZXJTdHJpbmcuc3Vic3RyaW5nKDAsIDUwKSkKLSAgICAgICAgICAgICAgICAgICAgICArICIgLi4uXSIpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgLy8gU2VlIGlmIHRoaXMgcGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5zIHRoZSBCT00KLSAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0LmJvbSA9PSAwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuYm9tID0gZ2V0Qk9NKHJlYWRCdWZmZXIpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgLy8gREVCVUcKLSAgICAgICAgICAgICAgZGVidWcoInJ1biIsICJib206ICIgKyBtZXNzYWdlQ29udGV4dC5ib20pOwotCi0gICAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZzsKLQotICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcoKTsKLSAgICAgICAgICAgICAgICByZWFkTXNnID0KLSAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIHJlYWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgIHJlYWRMZW4sCi0gICAgICAgICAgICAgICAgICAgIFV0aWxzLmdldEphdmFFbmNvZGluZyhlbmNvZGluZykpOwotICAgICAgICAgICAgICAgIHNldEVuY29kaW5nKHJlYWRNc2cpOwotICAgICAgICAgICAgICAgIGlmICghZW5jb2RpbmcuZXF1YWxzKGdldEVuY29kaW5nKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcoKTsKLSAgICAgICAgICAgICAgICAgIHJlYWRNc2cgPQotICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgIHJlYWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICByZWFkTGVuLAotICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLmdldEphdmFFbmNvZGluZyhlbmNvZGluZykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlYnVnKCJydW4iLCAiRVhDRVBUSU9OICgzKTogIiArIHVlZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih1ZWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAvLyBTZXQgZW5jb2RpbmcgaW4gdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5lbmNvZGluZyA9IGVuY29kaW5nOwotCi0gICAgICAgICAgICAgIC8vIERFQlVHCi0gICAgICAgICAgICAgIGRlYnVnKCJydW4iLCAiZW5jb2Rpbmc6ICIgKyBtZXNzYWdlQ29udGV4dC5lbmNvZGluZyk7Ci0KLSAgICAgICAgICAgICAgLy8gUHJvY2VzcyBtZXNzYWdlCi0gICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gcHJvY2Vzc01lc3NhZ2UocmVhZExlbiwgcmVhZE1zZywgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiBtZXNzYWdlIGlzIGNvbXBsZXRlLCB0aGVuIGxvZyBpdCBhbmQgcmVzZXQgYnVmZmVyCi0gICAgICAgICAgICBpZiAoKGlzTWVzc2FnZUNvbXBsZXRlKG1lc3NhZ2VDb250ZXh0KSkKLSAgICAgICAgICAgICAgfHwgKChyZWFkTGVuID09IC0xKSAmJiAobWVzc2FnZUNvbnRleHQubWVzc2FnZUJ1ZmZlci5sZW5ndGgoKSA+IDApKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gTG9nIG1lc3NhZ2UKLSAgICAgICAgICAgICAgbG9nTWVzc2FnZShtZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgLy8gU2V0IG1lc3NhZ2UgY29tcGxldGUKLSAgICAgICAgICAgICAgbWVzc2FnZUNvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBpZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTZXQgcmVhZCB0aW1lb3V0IGZsYWcKLSAgICAgICAgICAgIHJlYWRUaW1lZE91dCA9IHRydWU7Ci0KLSAgICAgICAgICAgIGRlYnVnKCJydW4iLCAiSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbjogIiArIGllLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAvLyBJZiB0aGUgcmVhZCBpcyBub3QgZG9uZSwgdGhlbiBzaHV0ZG93biAKLSAgICAgICAgICAgIGlmIChwYWlyZWRTb2NrZXRIYW5kbGVyICE9IG51bGwKLSAgICAgICAgICAgICAgJiYgcGFpcmVkU29ja2V0SGFuZGxlci5pc1JlYWRXYWl0aW5nKCkKLSAgICAgICAgICAgICAgJiYgcGFpcmVkU29ja2V0SGFuZGxlci5pc1JlYWRUaW1lZE91dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBERUJVRzoKLSAgICAgICAgICAgICAgZGVidWcoInJ1biIsICJyZWFkIHRpbWVkIG91dCBvbiBib3RoIHNvY2tldHMiKTsKLQotICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBkYXRhIGluIHRoZSBtZXNzYWdlIGJ1ZmZlciBhbmQgaXQgaXMgY29tcGxldGUsIHRoZW4gbG9nIGl0Ci0gICAgICAgICAgICAgIGlmICgoaXNNZXNzYWdlQ29tcGxldGUobWVzc2FnZUNvbnRleHQpKQotICAgICAgICAgICAgICAgIHx8IChtZXNzYWdlQ29udGV4dC5tZXNzYWdlQnVmZmVyLmxlbmd0aCgpID4gMCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBMb2cgbWVzc2FnZQotICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgLy8gU2V0IG1lc3NhZ2UgY29tcGxldGUKLSAgICAgICAgICAgICAgY29ubmVjdGlvbkFjdGl2ZSA9IGZhbHNlOwotICAgICAgICAgICAgICBtZXNzYWdlQ29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZTIpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgICAgICBkZWJ1ZygKLSAgICAgICAgICAgICAgInJ1biIsCi0gICAgICAgICAgICAgICJFWENFUFRJT04gKDIpOiAiCi0gICAgICAgICAgICAgICAgKyBlMi50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgKyAiXG4iCi0gICAgICAgICAgICAgICAgKyBVdGlscy5nZXRFeGNlcHRpb25EZXRhaWxzKGUyKSk7Ci0gICAgICAgICAgICAvL2UyLnByaW50U3RhY2tUcmFjZSgpOwotCi0gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBkYXRhIGluIHRoZSBtZXNzYWdlIGJ1ZmZlciBhbmQgaXQgaXMgY29tcGxldGUsIHRoZW4gbG9nIGl0Ci0gICAgICAgICAgICBpZiAoKGlzTWVzc2FnZUNvbXBsZXRlKG1lc3NhZ2VDb250ZXh0KSkKLSAgICAgICAgICAgICAgfHwgKG1lc3NhZ2VDb250ZXh0Lm1lc3NhZ2VCdWZmZXIubGVuZ3RoKCkgPiAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gTG9nIG1lc3NhZ2UKLSAgICAgICAgICAgICAgbG9nTWVzc2FnZShtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNldCBtZXNzYWdlIGNvbXBsZXRlCi0gICAgICAgICAgICBjb25uZWN0aW9uQWN0aXZlID0gZmFsc2U7Ci0gICAgICAgICAgICBtZXNzYWdlQ29tcGxldGUgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBERUJVRzoKLSAgICAgIGRlYnVnKAotICAgICAgICAicnVuIiwKLSAgICAgICAgIkVYQ0VQVElPTiAoMSk6ICIKLSAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpCi0gICAgICAgICAgKyAiXG4iCi0gICAgICAgICAgKyBVdGlscy5nZXRFeGNlcHRpb25EZXRhaWxzKGUpKTsKLSAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXJyb3IgZXJyKQotICAgIHsKLSAgICAgIC8vIERFQlVHOgotICAgICAgZGVidWcoInJ1biIsICJFUlJPUjogIiArIGVyci5nZXRNZXNzYWdlKCkpOwotICAgICAgLy9lcnIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotCi0gICAgZmluYWxseQotICAgIHsKLSAgICAgIHNodXRkb3duKCk7Ci0gICAgICBzb2NrZXRDb25uZWN0aW9uLndha2VVcCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBwcm9jZXNzTWVzc2FnZSgKLSAgICBpbnQgcmVhZExlbiwKLSAgICBTdHJpbmcgcmVhZE1zZywKLSAgICBNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2VDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gY29udGludWVSZWFkID0gZmFsc2U7Ci0KLSAgICAvLyBJbml0aWFsaXplIG1lc3NhZ2UgY29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gaW5NZXNzYWdlQ29udGV4dDsKLQotICAgIC8vIEdldCBtZXNzYWdlIGJ1ZmZlciBhbmQgY2h1bmtlZCBkYXRhIGZyb20gbWVzc2FnZSBjb250ZXh0Ci0gICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2VCdWZmZXIgPSBtZXNzYWdlQ29udGV4dC5tZXNzYWdlQnVmZmVyOwotICAgIENodW5rZWREYXRhIGNodW5rZWREYXRhID0gbWVzc2FnZUNvbnRleHQuY2h1bmtlZERhdGE7Ci0KLSAgICAvLyBJZiBhbGwgd2UgcmVjZWl2ZWQgd2FzIHRoZSBoZWFkZXIgd2l0aCAxMDAgY29udGludWUsIHRoZW4gaWdub3JlIGl0Ci0gICAgaWYgKChyZWFkTXNnLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihIVFRQXzEwMF9DT05USU5VRSkgIT0gLTEpCi0gICAgICAmJiAocmVhZExlbiA+PSAyNSkpCi0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICBkZWJ1ZygicHJvY2Vzc01lc3NhZ2UiLCAiSWdub3JlIEhUVFAgMTAwIENvbnRpbnVlLiIpOwotCi0gICAgICAvLyBGaW5kIHRoZSBlbmQgb2YgdGhlIEhUVFAgMTAwIG1lc3NhZ2UKLSAgICAgIGludCBpbmRleCA9IFV0aWxzLmdldEZpcnN0Q1JMRkNSTEYocmVhZE1zZyk7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgdGhlIEhUVFAgMTAwIG1lc3NhZ2UsIHRoZW4ganVzdCBpZ25vcmUgaXQKLSAgICAgIGlmIChpbmRleCA9PSByZWFkTXNnLmxlbmd0aCgpKQotICAgICAgICBjb250aW51ZVJlYWQgPSB0cnVlOwotCi0gICAgICAvLyBPdGhlcndpc2UgcmVtb3ZlIHRoZSBIVFRQIDEwMCBtZXNzYWdlIGFuZCBjb250aW51ZQotICAgICAgZWxzZQotICAgICAgICByZWFkTXNnID0gcmVhZE1zZy5zdWJzdHJpbmcoaW5kZXgpOwotICAgIH0KLQotICAgIC8vIEFERDogV2hhdCBpZiBhIGJ5cGFzc2VkIG1lc3NhZ2UgY29udGFpbnMgYW5vdGhlciBtZXNzYWdlIGFmdGVyIGl0PwotICAgIGlmICghY29udGludWVSZWFkICYmIGJ5cGFzc01lc3NhZ2UocmVhZE1zZykpCi0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICBkZWJ1ZygKLSAgICAgICAgInByb2Nlc3NNZXNzYWdlIiwKLSAgICAgICAgIkRvIG5vdCBsb2cgbWVzc2FnZSBhcyBkZWZpbmVkIGluIHRoZSBtb25pdG9yIHNwZWMsIGJ1dCBpdCB3aWxsIGJlIHNlbnQuIik7Ci0KLSAgICAgIGNvbnRpbnVlUmVhZCA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFjb250aW51ZVJlYWQpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gMDsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgY2h1bmtlZCBkYXRhLCB0aGVuIGdldCB0aGUgbGVuZ3RoCi0gICAgICBpZiAoKHJlYWRNc2cudG9VcHBlckNhc2UoKS5pbmRleE9mKENIVU5LRUQpICE9IC0xKQotICAgICAgICB8fCAocmVhZE1zZy50b1VwcGVyQ2FzZSgpLmluZGV4T2YoQ0hVTktFRF9XSVRIX1FVT1RFUykgIT0gLTEpKQotICAgICAgewotICAgICAgICAvLyBERUJVRzoKLSAgICAgICAgZGVidWcoInByb2Nlc3NNZXNzYWdlIiwgIlByb2Nlc3NpbmcgY2h1bmtlZCBkYXRhLi4uIik7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgQ0ZMRgotICAgICAgICBpZiAoKGluZGV4ID0gcmVhZE1zZy5pbmRleE9mKENSTEYgKyBDUkxGKSkgPT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9jYXRlIGVuZCBvZiBIVFRQIGhlYWRlci4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEluY2x1ZGUgdGhlIENSTEYrQ1JMRiBpbiB0aGUgaW5kZXgKLSAgICAgICAgaW5kZXggKz0gNDsKLQotICAgICAgICAvLyBERUJVRzoKLSAgICAgICAgZGVidWcoCi0gICAgICAgICAgInByb2Nlc3NNZXNzYWdlIiwKLSAgICAgICAgICAiQWRkIGhlYWRlciBiZWZvcmUgZGVjb2RpbmcgY2h1bmtlZCBkYXRhOiBbIgotICAgICAgICAgICAgKyByZWFkTXNnLnN1YnN0cmluZygwLCBpbmRleCkKLSAgICAgICAgICAgICsgIl0iKTsKLQotICAgICAgICAvLyBBZGQgSFRUUCBoZWFkZXIgdG8gYnVmZmVyCi0gICAgICAgIG1lc3NhZ2VCdWZmZXIuYXBwZW5kKHJlYWRNc2cuc3Vic3RyaW5nKDAsIGluZGV4KSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIChpLmUuIGhlYWRlciBvbmx5KSwgdGhlbiBqdXN0IGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbW9yZSBjaHVua2VkIGRhdGEKLSAgICAgICAgaWYgKHJlYWRNc2cubGVuZ3RoKCkgPT0gaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICBjaHVua2VkRGF0YSA9IG5ldyBDaHVua2VkRGF0YSh0aGlzLCB0cnVlKTsKLQotICAgICAgICAgIC8vIERFQlVHOgotICAgICAgICAgIGRlYnVnKAotICAgICAgICAgICAgInByb2Nlc3NNZXNzYWdlIiwKLSAgICAgICAgICAgICJUaGVyZSBpcyBjaHVuayBkYXRhLCBidXQgbm9uZSBpbiB0aGlzIHBhcnQgb2YgdGhlIG1lc3NhZ2UuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIHJlbWFpbmRlciBvZiB0aGUgZGF0YSBpcyBjb21wbGV0ZSAoaS5lLiBlbmRzIHdpdGggWzBdW0NSTEZdW09wdGlvbmFsIEZvb3Rlcl1bQ1JMRl0pCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIENyZWF0ZSBjaHVua2VkIGRhdGEgb2JqZWN0Ci0gICAgICAgICAgY2h1bmtlZERhdGEgPSBuZXcgQ2h1bmtlZERhdGEodGhpcywgcmVhZE1zZy5zdWJzdHJpbmcoaW5kZXgpKTsKLQotICAgICAgICAgIGlmICghY2h1bmtlZERhdGEuaXNNb3JlQ2h1bmtlZERhdGEoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaHVua2VkRGF0YS5kZWNvZGVBbmRBZGREYXRhVG9CdWZmZXIobWVzc2FnZUJ1ZmZlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGNodW5rZWREYXRhICE9IG51bGwgJiYgY2h1bmtlZERhdGEuaXNNb3JlQ2h1bmtlZERhdGEoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgIGRlYnVnKCJwcm9jZXNzTWVzc2FnZSIsICJQcm9jZXNzaW5nIE1PUkUgY2h1bmtlZCBkYXRhLi4uIik7Ci0KLSAgICAgICAgLy8gQWRkIGRhdGEKLSAgICAgICAgY2h1bmtlZERhdGEuYWRkRGF0YShyZWFkTXNnKTsKLQotICAgICAgICAvLyBEZWNvZGUgZGF0YQotICAgICAgICBpZiAoIWNodW5rZWREYXRhLmlzTW9yZUNodW5rZWREYXRhKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjaHVua2VkRGF0YS5kZWNvZGVBbmRBZGREYXRhVG9CdWZmZXIobWVzc2FnZUJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gRWxzZSBqdXN0IGFwcGVuZCB0aGUgZGF0YSB0byB0aGUgYnVmZmVyCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIERFQlVHOgotICAgICAgICBkZWJ1ZygKLSAgICAgICAgICAicHJvY2Vzc01lc3NhZ2UiLAotICAgICAgICAgICJBZGQgZGF0YSB0byBtZXNzYWdlIGVudHJ5IGJ1ZmZlcjogWyIgKyByZWFkTXNnICsgIl0iKTsKLQotICAgICAgICBtZXNzYWdlQnVmZmVyLmFwcGVuZChyZWFkTXNnKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTZXQgdXBkYXRlZCBtZXNzYWdlIGJ1ZmZlciBhbmQgY2h1bmtlZCBkYXRhIGluIG1lc3NhZ2UgY29udGV4dCAgICAKLSAgICBtZXNzYWdlQ29udGV4dC5tZXNzYWdlQnVmZmVyID0gbWVzc2FnZUJ1ZmZlcjsKLSAgICBtZXNzYWdlQ29udGV4dC5jaHVua2VkRGF0YSA9IGNodW5rZWREYXRhOwotCi0gICAgLy8gUmV0dXJuIG1lc3NhZ2UgY29udGV4dCAKLSAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQ7Ci0gIH0KLQotICAvKioKLSAgICogU2h1dGRvd24gaW5wdXQgc29ja2V0IGFuZCBjbG9zZSBpbnB1dCBzdHJlYW0uCi0gICAqIEBwYXJhbSBpblNvY2tldCBpbiBzb2NrZXQuCi0gICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzdG9wSW5wdXQoU29ja2V0IGluU29ja2V0LCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIElmIHRoZXJlIGlzIGEgaW5wdXQgc29ja2V0LCB0aGVuIHNodXRkb3duIHRoZSBpbnB1dAotICAgICAgaWYgKGluU29ja2V0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGluU29ja2V0LnNodXRkb3duSW5wdXQoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gaW5wdXQgc3RyZWFtIHRoZW4gY2xvc2UgaXQKLSAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gSWdub3JlIHNpbmNlIHdlIGFyZSBzdG9wcGluZyBldmVyeXRoaW5nCi0gICAgfQotCi0gICAgaW5wdXRTdHJlYW0gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNodXRkb3duIG91dHB1dCBzb2NrZXQgYW5kIGNsb3NlIG91dHB1dCBzdHJlYW0uCi0gICAqIEBwYXJhbSBvdXRTb2NrZXQgb3V0IHNvY2tldC4KLSAgICogQHBhcmFtIG91dHB1dFN0cmVhbSBvdXRwdXQgc3RyZWFtLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc3RvcE91dHB1dChTb2NrZXQgb3V0U29ja2V0LCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gb3V0cHV0IHN0cmVhbSwgdGhlbiBmbHVzaCBpdAotICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlcmUgaXMgYSBpbnB1dCBzb2NrZXQsIHRoZW4gc2h1dGRvd24gdGhlIGlucHV0Ci0gICAgICBpZiAob3V0U29ja2V0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dFNvY2tldC5zaHV0ZG93bk91dHB1dCgpOwotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBhbiBvdXRwdXQgc3RyZWFtIHRoZW4gY2xvc2UgaXQKLSAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIElnbm9yZSBzaW5jZSB3ZSBhcmUgc3RvcHBpbmcgZXZlcnl0aGluZwotICAgIH0KLQotICAgIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogU2h1dGRvd24gaGFuZGxlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNodXRkb3duKCkKLSAgewotICAgIC8vIFN0b3AgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dAotICAgIHN0b3BJbnB1dCh0aGlzLmluU29ja2V0LCB0aGlzLmlucHV0U3RyZWFtKTsKLSAgICBzdG9wT3V0cHV0KHRoaXMub3V0U29ja2V0LCB0aGlzLm91dHB1dFN0cmVhbSk7Ci0gIH0KLQotICAvKioKLSAgICogRGlzcGxheSBkZWJ1ZyBtZXNzYWdlcy4KLSAgICovCi0gIHZvaWQgZGVidWcoU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICBkZWJ1ZygiU29ja2V0SGFuZGxlciIsIG1ldGhvZCwgbWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogRGlzcGxheSBkZWJ1ZyBtZXNzYWdlcy4KLSAgICovCi0gIHZvaWQgZGVidWcoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICBpZiAodmVyYm9zZSkKLSAgICAgIHByaW50KGNsYXNzTmFtZSwgbWV0aG9kLCBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBEaXNwbGF5IG1lc3NhZ2VzLgotICAgKi8KLSAgdm9pZCBwcmludChTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICJbIgotICAgICAgICArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpCi0gICAgICAgICsgIl0gWyIKLSAgICAgICAgKyBjbGFzc05hbWUKLSAgICAgICAgKyAiLiIKLSAgICAgICAgKyBtZXRob2QKLSAgICAgICAgKyAiXSBbIgotICAgICAgICArIHRoaXMuY29ubmVjdGlvblR5cGUKLSAgICAgICAgKyAiXSAiCi0gICAgICAgICsgbWVzc2FnZSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFdyaXRlIGRhdGEuCi0gICAqLwotICBwcml2YXRlIHZvaWQgd3JpdGUoCi0gICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwKLSAgICBieXRlW10gYnVmZmVyLAotICAgIGludCBzdGFydCwKLSAgICBpbnQgbGVuZ3RoKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIERFQlVHOgotICAgICAgZGVidWcoIndyaXRlIiwgIkNvdWxkIG5vdCB3cml0ZSBidWZmZXIgYmVjYXVzZSBvdXRwdXQgc3RyZWFtIGlzIG51bGwuIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBERUJVRzoKLSAgICAgIGRlYnVnKCJ3cml0ZSIsICJidWZmZXI6IFsiICsgbmV3IFN0cmluZyhidWZmZXIsIHN0YXJ0LCBsZW5ndGgpICsgIl0iKTsKLQotICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGJ1ZmZlciwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIAotICAgKiBDaGVjayBpZiBtZXNzYWdlIGlzIGNvbXBsZXRlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNNZXNzYWdlQ29tcGxldGUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgaW50IGluZGV4LCBpbmRleDIsIGNvbnRlbnRMZW47Ci0gICAgYm9vbGVhbiBtZXNzYWdlQ29tcGxldGUgPSBmYWxzZTsKLQotICAgIGJvb2xlYW4gbW9yZUNodW5rZWREYXRhID0gbWVzc2FnZUNvbnRleHQuY2h1bmtlZERhdGEuaXNNb3JlQ2h1bmtlZERhdGEoKTsKLQotICAgIFN0cmluZyBtZXNzYWdlID0gbWVzc2FnZUNvbnRleHQubWVzc2FnZUJ1ZmZlci50b1N0cmluZygpOwotCi0gICAgLy8gRmluZCB0aGUgZmlyc3QgQ1JMRiArIENSTEYgd2hpY2ggbWFya3MgdGhlIGVuZCBvZiB0aGUgSFRUUCBoZWFkZXIKLSAgICBTdHJpbmcgaHR0cEhlYWRlcjsKLSAgICBpbmRleCA9IFV0aWxzLmdldEZpcnN0Q1JMRkNSTEYobWVzc2FnZSk7Ci0gICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgaHR0cEhlYWRlciA9IG1lc3NhZ2U7Ci0gICAgZWxzZQotICAgICAgaHR0cEhlYWRlciA9IG1lc3NhZ2Uuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotICAgIC8vIElmIGNodW5rZWQgZGF0YSwgdGhlbiBjb21wbGV0ZSBvbmx5IGlmIHRoZXJlIGlzIG5vIG1vcmUgZGF0YQotICAgIGlmICgoKGh0dHBIZWFkZXIudG9VcHBlckNhc2UoKS5pbmRleE9mKENIVU5LRUQpICE9IC0xKQotICAgICAgfHwgKGh0dHBIZWFkZXIudG9VcHBlckNhc2UoKS5pbmRleE9mKENIVU5LRURfV0lUSF9RVU9URVMpICE9IC0xKSkKLSAgICAgICYmICghbW9yZUNodW5rZWREYXRhKSkKLSAgICB7Ci0gICAgICBkZWJ1ZygKLSAgICAgICAgImlzTWVzc2FnZUNvbXBsZXRlIiwKLSAgICAgICAgIkhUVFAgaGVhZGVyIGluZGljYXRlcyBjaHVua2VkIGRhdGEgYW5kIHRoZXJlIGlzIG5vIG1vcmUgY2h1bmtlZCBkYXRhIik7Ci0gICAgICBtZXNzYWdlQ29tcGxldGUgPSB0cnVlOwotICAgIH0KLQotICAgIC8vIENoZWNrIGZvciBjb250ZW50IGxlbmd0aAotICAgIGVsc2UgaWYgKChpbmRleCA9IGh0dHBIZWFkZXIudG9VcHBlckNhc2UoKS5pbmRleE9mKENPTlRFTlRfTEVOR1RIKSkgPT0gLTEpCi0gICAgewotICAgICAgZGVidWcoImlzTWVzc2FnZUNvbXBsZXRlIiwgIkhUVFAgaGVhZGVyIGRvZXMgbm90IGNvbnRhaW4gY29udGVudCBsZW5ndGgiKTsKLQotICAgICAgLy8gU2hvdWxkIG5vdCBoYXZlIGNvbXBsZXRlIFBPU1QgaGVhZGVyIHdpdGhvdXQgY29udGVudCBsZW5ndGgKLSAgICAgIGlmIChodHRwSGVhZGVyLnN0YXJ0c1dpdGgoIlBPU1QiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGh0dHBIZWFkZXIuZW5kc1dpdGgoQ1JMRiArIENSTEYpKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiQ291bGQgbm90IGxvY2F0ZSBjb250ZW50LWxlbmd0aCBpbiBIVFRQIFBPU1QgaGVhZGVyLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVzc2FnZUNvbXBsZXRlID0gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRoaXMgY291bGQgYmUgYSBHRVQsIHNvIHNlZSBpZiB0aGUgdGhlIGNvbXBsZXRlIGhlYWRlciBoYXMgYmVlbiByZWNlaXZlZAotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIGh0dHBIZWFkZXIuc3RhcnRzV2l0aCgiR0VUIikKLSAgICAgICAgICAmJiAobWVzc2FnZS5sZW5ndGgoKSA9PSBodHRwSGVhZGVyLmxlbmd0aCgpCi0gICAgICAgICAgICAmJiBtZXNzYWdlLmVuZHNXaXRoKENSTEYgKyBDUkxGKSkpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2VDb21wbGV0ZSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZUNvbXBsZXRlID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlcmUgaXMgY29udGVudCBsZW5ndGgsIHRoZW4gc2VlIGlmIHRoZSBlbnRpcmUgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZAotICAgIGVsc2UgaWYgKChpbmRleCA9IGh0dHBIZWFkZXIudG9VcHBlckNhc2UoKS5pbmRleE9mKENPTlRFTlRfTEVOR1RIKSkgIT0gLTEpCi0gICAgewotICAgICAgLy8gRmluZCBlbmQgb2YgY29udGVudCBsZW5ndGggdmFsdWUKLSAgICAgIGluZGV4MiA9IGh0dHBIZWFkZXIuaW5kZXhPZihDUkxGLCBpbmRleCk7Ci0KLSAgICAgIGRlYnVnKCJpc01lc3NhZ2VDb21wbGV0ZSIsICJDUkxGOiAiICsgVXRpbHMudG9IZXhTdHJpbmcoQ1JMRikpOwotICAgICAgZGVidWcoCi0gICAgICAgICJpc01lc3NhZ2VDb21wbGV0ZSIsCi0gICAgICAgICJodHRwSGVhZGVyL2luZGV4OiAiICsgVXRpbHMudG9IZXhTdHJpbmcoaHR0cEhlYWRlci5zdWJzdHJpbmcoaW5kZXgpKSk7Ci0KLSAgICAgIC8vIEdldCBjb250ZW50IGxlbmd0aAotICAgICAgY29udGVudExlbiA9Ci0gICAgICAgIEludGVnZXIKLSAgICAgICAgICAuZGVjb2RlKAotICAgICAgICAgICAgaHR0cEhlYWRlci5zdWJzdHJpbmcoaW5kZXggKyBDT05URU5UX0xFTkdUSC5sZW5ndGgoKSArIDEsIGluZGV4MikpCi0gICAgICAgICAgLmludFZhbHVlKCk7Ci0KLSAgICAgIC8vIERFQlVHOgotICAgICAgZGVidWcoImlzTWVzc2FnZUNvbXBsZXRlIiwgImNvbnRlbnRMZW46ICIgKyBjb250ZW50TGVuKTsKLQotICAgICAgLy8gRmluZCB0aGUgZmlyc3QgQ1JMRiArIENSTEYgd2hpY2ggbWFya3MgdGhlIGVuZCBvZiB0aGUgSFRUUCBoZWFkZXIKLSAgICAgIGluZGV4ID0gVXRpbHMuZ2V0Rmlyc3RDUkxGQ1JMRihtZXNzYWdlKTsKLQotICAgICAgLy8gREVCVUc6Ci0gICAgICBkZWJ1ZygKLSAgICAgICAgImlzTWVzc2FnZUNvbXBsZXRlIiwKLSAgICAgICAgImFjdHVhbCByZWNlaXZlZCBtZXNzYWdlIGxlbmd0aDogIiArIChtZXNzYWdlLmxlbmd0aCgpIC0gKGluZGV4KSkpOwotCi0gICAgICAvLyBJZiBjb250ZW50IGxlbmd0aCBpcyBlcXVhbCB0byBhY3R1YWwgbWVzc2FnZSBjb250ZW50IGxlbmd0aCwgdGhlbiBtZXNzYWdlIGlzIGNvbXBsZXRlCi0gICAgICBpZiAoY29udGVudExlbiA9PSBtZXNzYWdlLmxlbmd0aCgpIC0gaW5kZXgpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2VDb21wbGV0ZSA9IHRydWU7Ci0KLSAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgIGRlYnVnKAotICAgICAgICAgICJpc01lc3NhZ2VDb21wbGV0ZSIsCi0gICAgICAgICAgImNvbnRlbnRMZW4gPSBhY3R1YWwgcmVjZWl2ZWQgbWVzc2FnZSBsZW5ndGguIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTWVzc2FnZSBpcyBub3QgY29tcGxldGUKLSAgICBlbHNlCi0gICAgewotICAgICAgbWVzc2FnZUNvbXBsZXRlID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gREVCVUc6Ci0gICAgZGVidWcoImlzTWVzc2FnZUNvbXBsZXRlIiwgIm1lc3NhZ2VDb21wbGV0ZTogIiArIG1lc3NhZ2VDb21wbGV0ZSk7Ci0KLSAgICByZXR1cm4gbWVzc2FnZUNvbXBsZXRlOwotICB9Ci0KLSAgLyoqIAotICAgKiBMb2cgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlQnVmZmVyCi0gICAqLwotICBwcml2YXRlIHZvaWQgbG9nTWVzc2FnZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgTWVzc2FnZUVudHJ5IG1lc3NhZ2VFbnRyeSA9IG51bGw7Ci0KLSAgICAvLyBEZXRlcm1pbmUgc2VuZGVyIGFuZCByZWNlaXZlciBob3N0L3BvcnQKLSAgICBTdHJpbmcgc2VuZGVySG9zdEFuZFBvcnQsIHJlY2VpdmVySG9zdEFuZFBvcnQ7Ci0KLSAgICAvLyBSZXF1ZXN0Ci0gICAgaWYgKGNvbm5lY3Rpb25UeXBlLmVxdWFscyhNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKSkKLSAgICB7Ci0gICAgICBzZW5kZXJIb3N0QW5kUG9ydCA9Ci0gICAgICAgIGluU29ja2V0LmdldEluZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKSArICI6IiArIGluU29ja2V0LmdldFBvcnQoKTsKLSAgICAgIHJlY2VpdmVySG9zdEFuZFBvcnQgPSB0YXJnZXRIb3N0ICsgIjoiICsgb3V0U29ja2V0LmdldFBvcnQoKTsKLSAgICB9Ci0KLSAgICAvLyBSZXNwb25zZSAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZW5kZXJIb3N0QW5kUG9ydCA9IHRhcmdldEhvc3QgKyAiOiIgKyBpblNvY2tldC5nZXRQb3J0KCk7Ci0gICAgICByZWNlaXZlckhvc3RBbmRQb3J0ID0KLSAgICAgICAgb3V0U29ja2V0LmdldEluZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKSArICI6IiArIG91dFNvY2tldC5nZXRQb3J0KCk7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIG1lc3NhZ2UgZW50cnkKLSAgICB0aGlzLnNvY2tldENvbm5lY3Rpb24ubG9nTWVzc2FnZSgKLSAgICAgIGNvbnZlcnNhdGlvbklELAotICAgICAgdGhpcy5jb25uZWN0aW9uVHlwZSwKLSAgICAgIG1lc3NhZ2VDb250ZXh0LnRpbWVzdGFtcCwKLSAgICAgIHNlbmRlckhvc3RBbmRQb3J0LAotICAgICAgcmVjZWl2ZXJIb3N0QW5kUG9ydCwKLSAgICAgIG1lc3NhZ2VDb250ZXh0Lm1lc3NhZ2VCdWZmZXIsCi0gICAgICBtZXNzYWdlQ29udGV4dC5ib20sCi0gICAgICBtZXNzYWdlQ29udGV4dC5lbmNvZGluZyk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgZm9yIEhUVFAgbWVzc2FnZXMgdGhhdCBzaG91bGQgbm90IGJlIGxvZ2dlZC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBieXBhc3NNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgYm9vbGVhbiBieXBhc3MgPSBmYWxzZTsKLSAgICBpZiAoKG1lc3NhZ2Uuc3RhcnRzV2l0aCgiQ09OTkVDVCIpKQotICAgICAgfHwgKG1lc3NhZ2Uuc3RhcnRzV2l0aCgiVFJBQ0UiKSkKLSAgICAgIHx8IChtZXNzYWdlLnN0YXJ0c1dpdGgoIkRFTEVURSIpKQotICAgICAgfHwgKG1lc3NhZ2Uuc3RhcnRzV2l0aCgiT1BUSU9OUyIpKQotICAgICAgfHwgKG1lc3NhZ2Uuc3RhcnRzV2l0aCgiSEVBRCIpKSkKLSAgICB7Ci0gICAgICBieXBhc3MgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBieXBhc3M7Ci0gIH0KLQotICAvLyBJMThOOiAyMDAzLjAyLjI2IG1vZGlmaWVkIGJ5IEsuTmFrYWdvbWVAQmVhY29uSVQKLSAgLyoqCi0gICAqIFNldCBFbmNvZGluZyBQYXJhbWV0ZXJzCi0gICAqIEBwYXJhbSBtZXNzYWdlRnJhZ21lbnQgU3RyaW5nIG9mIGEgSFRUUCBtZXNzYWdlIGZyYWdtZW50LgotICAgKiBAYXV0aG9yIEsuTmFrYWdvbWVAQmVhY29uSVQgSmFwYW4gU0lHIAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBtZXNzYWdlRnJhZ21lbnQpCi0gIHsKLSAgICBpZiAobWltZUNoYXJzZXQgPT0gbnVsbCB8fCBtaW1lQ2hhcnNldC5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIG1pbWVDaGFyc2V0ID0gVXRpbHMuZ2V0SFRUUENoYXJzZXQobWVzc2FnZUZyYWdtZW50KTsKLSAgICB9Ci0gICAgaWYgKHhtbEVuY29kaW5nID09IG51bGwgfHwgeG1sRW5jb2RpbmcubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICB4bWxFbmNvZGluZyA9IFV0aWxzLmdldFhNTEVuY29kaW5nKG1lc3NhZ2VGcmFnbWVudCk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEkxOE46IDIwMDMuMDIuMjYgbW9kaWZpZWQgYnkgSy5OYWthZ29tZUBCZWFjb25JVAotICAvKioKLSAgICogR2V0IEVuY29kaW5nIFBhcmFtZXRlcgotICAgKiBAcmV0dXJuIENoYXJhY3RlciBlbmNvZGluZyBvZiBIVFRQIG1lc3NhZ2UuCi0gICAqIEBhdXRob3IgSy5OYWthZ29tZUBCZWFjb25JVCBKYXBhbiBTSUcgCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRFbmNvZGluZygpCi0gIHsKLSAgICBTdHJpbmcgZW5jb2RpbmcgPSBXU0lDb25zdGFudHMuREVGQVVMVF9YTUxfRU5DT0RJTkc7Ci0gICAgaWYgKG1pbWVDaGFyc2V0ICE9IG51bGwgJiYgbWltZUNoYXJzZXQubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGVuY29kaW5nID0gbWltZUNoYXJzZXQ7Ci0gICAgfQotICAgIGlmICh4bWxFbmNvZGluZyAhPSBudWxsICYmIHhtbEVuY29kaW5nLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBlbmNvZGluZyA9IHhtbEVuY29kaW5nOwotICAgIH0KLSAgICByZXR1cm4gZW5jb2Rpbmc7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBCeXRlIE9yZGVyIE1hcmsgZnJvbSB0aGUgbWVzc2FnZSAoaWYgdGhlcmUgaXMgb25lKS4KLSAgICovCi0gIHByaXZhdGUgaW50IGdldEJPTShieXRlW10gbWVzc2FnZSkKLSAgewotICAgIGludCBib20gPSAwOwotCi0gICAgYnl0ZSBGRiA9IChieXRlKSAweEZGOwotICAgIGJ5dGUgRkUgPSAoYnl0ZSkgMHhGRTsKLSAgICBieXRlIEVGID0gKGJ5dGUpIDB4RUY7Ci0gICAgYnl0ZSBCQiA9IChieXRlKSAweEJCOwotICAgIGJ5dGUgQkYgPSAoYnl0ZSkgMHhCRjsKLQotICAgIC8vIFNlYXJjaCB0aHJvdWdoIHRoZSBieXRlIGFycmF5IGZvciBDUkxGK0NSTEYuICBUaGlzIHdpbGwgbWFyayB0aGUgZW5kIG9mIHRoZSBoZWFkZXIuCi0gICAgaW50IGkgPSBVdGlscy5nZXRGaXJzdENSTEZDUkxGKG1lc3NhZ2UsIDApOwotICAgIGlmIChpICE9IC0xKQotICAgIHsKLSAgICAgIC8vIERFQlVHOgotICAgICAgZGVidWcoCi0gICAgICAgICJnZXRCT00iLAotICAgICAgICAibWVzc2FnZVtpXTogIgotICAgICAgICAgICsgbWVzc2FnZVtpXQotICAgICAgICAgICsgIiwgbWVzc2FnZVtpKzFdOiAiCi0gICAgICAgICAgKyBtZXNzYWdlW2krMV0pOwotCi0gICAgICAvLyBDaGVjayBmb3IgVVRGLTggQk9NCi0gICAgICBpZiAoKChpICsgMikgPCBtZXNzYWdlLmxlbmd0aCkKLSAgICAgICAgJiYgbWVzc2FnZVtpXSA9PSBFRgotICAgICAgICAmJiBtZXNzYWdlW2krMV0gPT0gQkIKLSAgICAgICAgJiYgbWVzc2FnZVtpKzJdID09IEJGKQotICAgICAgewotICAgICAgICBib20gPSAweEVGQkJCRjsKLSAgICAgIH0KLSAgICAgIC8vIENoZWNrIGZvciBVVEYtMTYgYmlnLWVuZGlhbiBCT00KLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoKGkrMSkgPCBtZXNzYWdlLmxlbmd0aCkKLSAgICAgICAgICAmJiBtZXNzYWdlW2ldID09IEZFCi0gICAgICAgICAgJiYgbWVzc2FnZVtpICsgMV0gPT0gRkYpCi0gICAgICB7Ci0gICAgICAgIGJvbSA9IDB4RkVGRjsKLSAgICAgIH0KLSAgICAgIC8vIENoZWNrIGZvciBVVEYtMTYgbGl0dGxlLWVuZGlhbiBCT00KLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoKGkrMSkgPCBtZXNzYWdlLmxlbmd0aCkKLSAgICAgICAgICAmJiBtZXNzYWdlW2ldID09IEZGCi0gICAgICAgICAgJiYgbWVzc2FnZVtpKzFdID09IEZFKQotICAgICAgewotICAgICAgICBib20gPSAweEZGRkU7Ci0gICAgICB9Ci0gICAgICAvLyBBREQ6IERvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIG90aGVyIEJPTXMKLSAgICB9Ci0gICAgcmV0dXJuIGJvbTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhlIHJlYWQgaXMgc3RpbGwgd2FpdGluZyBmb3IgZGF0YS4KLSAgICovCi0gIGJvb2xlYW4gaXNSZWFkV2FpdGluZygpCi0gIHsKLSAgICBib29sZWFuIHJlYWRXYWl0aW5nID0gZmFsc2U7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBERUJVRzoKLSAgICAgIGRlYnVnKAotICAgICAgICAiaXNSZWFkV2FpdGluZyIsCi0gICAgICAgICJpblNvY2tldC5nZXRJbnB1dFN0cmVhbSgpLmF2YWlsYWJsZSgpOiAiCi0gICAgICAgICAgKyBpblNvY2tldC5nZXRJbnB1dFN0cmVhbSgpLmF2YWlsYWJsZSgpKTsKLQotICAgICAgaWYgKGluU29ja2V0LmdldElucHV0U3RyZWFtKCkuYXZhaWxhYmxlKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgcmVhZFdhaXRpbmcgPSB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgIH0KLQotICAgIHJldHVybiByZWFkV2FpdGluZzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcmVhZCB0aW1lZCBvdXQgZmxhZy4KLSAgICovCi0gIGJvb2xlYW4gaXNSZWFkVGltZWRPdXQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVhZFRpbWVkT3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIE1lc3NhZ2UgY29udGV4dCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVzc2FnZSB0aGF0IGlzIGJlaW5nIHByb2Nlc3NlZC4KLSAgICovCi0gIGNsYXNzIE1lc3NhZ2VDb250ZXh0Ci0gIHsKLSAgICBTdHJpbmdCdWZmZXIgbWVzc2FnZUJ1ZmZlcjsKLSAgICBDaHVua2VkRGF0YSBjaHVua2VkRGF0YTsKLSAgICBTdHJpbmcgdGltZXN0YW1wOwotICAgIGludCBib207Ci0gICAgU3RyaW5nIGVuY29kaW5nOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIG5ldyBtZXNzYWdlIGNvbnRleHQuCi0gICAgICovCi0gICAgTWVzc2FnZUNvbnRleHQoKQotICAgIHsKLSAgICAgIG1lc3NhZ2VCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBjaHVua2VkRGF0YSA9IG5ldyBDaHVua2VkRGF0YSgpOwotICAgICAgdGltZXN0YW1wID0gbnVsbDsKLSAgICAgIGJvbSA9IDA7Ci0gICAgICBlbmNvZGluZyA9IFdTSUNvbnN0YW50cy5ERUZBVUxUX1hNTF9FTkNPRElORzsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9Db21tZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvQ29tbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWFkNzA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9Db21tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIG1vbml0b3IgY29uZmlnIENvbW1lbnQgZWxlbWVudC4gIAotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1lbnQgZXh0ZW5kcyBEb2N1bWVudEVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIEVsZW1lbnQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTkFNRSA9IFdTSUNvbnN0YW50cy5FTEVNX0NPTU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX01PTklUT1JfQ09ORklHLCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBHZXQgY29tbWVudCB0ZXh0LgotICAgKiBAcmV0dXJuIGNvbW1lbnQgdGV4dC4KLSAgICogQHNlZSAjc2V0VGV4dAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBjb21tZW50IHRleHQuCi0gICAqIEBwYXJhbSB0ZXh0IHRoZSBjb21tZW50IHRleHQuCi0gICAqIEBzZWUgI2dldFRleHQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL01hbkluVGhlTWlkZGxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvTWFuSW5UaGVNaWRkbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjMGFhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvTWFuSW5UaGVNaWRkbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZzsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBtb25pdG9yIGNvbmZpZyBNYW5JblRoZU1pZGRsZSBlbGVtZW50LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFuSW5UaGVNaWRkbGUgZXh0ZW5kcyBEb2N1bWVudEVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIEVsZW1lbnQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTkFNRSA9IFdTSUNvbnN0YW50cy5FTEVNX01BTl9JTl9USEVfTUlERExFOwotCi0gIC8qKgotICAgKiBRTmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUUgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9NT05JVE9SX0NPTkZJRywgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogR2V0IGNvbW1lbnQuCi0gICAqIEByZXR1cm4gY29tbWVudC4KLSAgICogQHNlZSAjc2V0Q29tbWVudAotICAgKi8KLSAgcHVibGljIENvbW1lbnQgZ2V0Q29tbWVudCgpOwotCi0gIC8qKgotICAgKiBTZXQgY29tbWVudC4KLSAgICogQHBhcmFtIGNvbW1lbnQgdGhlIENvbW1lbnQgb2JqZWN0LgotICAgKiBAc2VlICNnZXRDb21tZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KENvbW1lbnQgY29tbWVudCk7Ci0KLSAgLyoqCi0gICAqIEdldCByZWRpcmVjdHMuCi0gICAqIEByZXR1cm4gdGhlIHJlZGlyaXJlY3RzLgotICAgKiBAc2VlICNzZXRSZWRpcmVjdExpc3QKLSAgICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0UmVkaXJlY3RMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIEFkZCByZWRpcmVjdC4KLSAgICogQHBhcmFtIHJlZGlyZWN0IHRoZSBSZWRpcmVjdCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRSZWRpcmVjdChSZWRpcmVjdCByZWRpcmVjdCk7Ci0KLSAgLyoqCi0gICAqIFNldCByZWRpcmVjdHMuCi0gICAqIEBwYXJhbSByZWRpcmVjdExpc3QgYSBsaXN0IG9mIHRoZSByZWRpcmVjdHMuCi0gICAqIEBzZWUgI2dldFJlZGlyZWN0TGlzdCAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlZGlyZWN0TGlzdChWZWN0b3IgcmVkaXJlY3RMaXN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9Nb25pdG9yQ29uZmlnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvTW9uaXRvckNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmYwZDU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9Nb25pdG9yQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uQWRkU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuV1NJRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZUxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgdGhlIG1vbml0b3IgY29uZmlndXJhdGlvbiBmaWxlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9uaXRvckNvbmZpZyBleHRlbmRzIFdTSURvY3VtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9DT05GSUc7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX01PTklUT1JfQ09ORklHLCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIG1vbml0b3IgY29uZmlnLgotICAgKiBAcGFyYW0gbWVzc2FnZUxpc3QgYSBsTWVzc2FnZUxpc3Qgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChNZXNzYWdlTGlzdCBtZXNzYWdlTGlzdCk7Ci0KLSAgLyoqCi0gICAqIEdldCBjb21tZW50LgotICAgKiBAcmV0dXJuIGNvbW1lbnQuCi0gICAqIEBzZWUgI3NldENvbW1lbnQKLSAgICovCi0gIHB1YmxpYyBDb21tZW50IGdldENvbW1lbnQoKTsKLQotICAvKioKLSAgICogU2V0IGNvbW1lbnQuCi0gICAqIEBwYXJhbSBjb21tZW50IGEgQ29tbWVudCBvYmplY3QuCi0gICAqIEBzZWUgI2dldENvbW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoQ29tbWVudCBjb21tZW50KTsKLQotICAvKioKLSAgICogR2V0IGxvZyBmaWxlIGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIGxvZyBmaWxlIGxvY2F0aW9uLgotICAgKiBAc2VlICNzZXRMb2dMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2dMb2NhdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgbG9nIGZpbGUgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBsb2dVUkkgbG9nIGZpbGUgbG9jYXRpb24uCi0gICAqIEBzZWUgI2dldExvZ0xvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2dMb2NhdGlvbihTdHJpbmcgbG9nVVJJKTsKLQotICAvKioKLSAgICogR2V0IHJlcGxhY2UgbG9nLgotICAgKiBAcmV0dXJuIHJlcGxhY2UgbG9nLgotICAgKiBAc2VlICNzZXRSZXBsYWNlTG9nCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRSZXBsYWNlTG9nKCk7Ci0KLSAgLyoqCi0gICAqIFNldCByZXBsYWNlIGxvZy4KLSAgICogQHBhcmFtIHJlcGxhY2VMb2cgYSByZXBsYWNlIGxvZy4KLSAgICogQHNlZSAjZ2V0UmVwbGFjZUxvZwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVwbGFjZUxvZyhib29sZWFuIHJlcGxhY2VMb2cpOwotCi0gIC8qKgotICAgKiBHZXQgYWRkIHN0eWxlIHNoZWV0LgotICAgKiBAcmV0dXJuIGFkZCBzdHlsZSBzaGVldC4KLSAgICogQHNlZSAjc2V0QWRkU3R5bGVTaGVldAotICAgKi8KLSAgcHVibGljIEFkZFN0eWxlU2hlZXQgZ2V0QWRkU3R5bGVTaGVldCgpOwotCi0gIC8qKgotICAgKiBTZXQgYWRkIHN0eWxlIHNoZWV0LgotICAgKiBAcGFyYW0gYWRkU3R5bGVTaGVldCBhZGQgc3R5bGUgc2hlZXQuCi0gICAqIEBzZWUgI2dldEFkZFN0eWxlU2hlZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFkZFN0eWxlU2hlZXQoQWRkU3R5bGVTaGVldCBhZGRTdHlsZVNoZWV0KTsKLQotICAvKioKLSAgICogR2V0IGxvZyBkdXJhdGlvbi4KLSAgICogQHJldHVybiBsb2cgZHVyYXRpb24uCi0gICAqIEBzZWUgI3NldExvZ0R1cmF0aW9uCi0gICAqLwotICBwdWJsaWMgaW50IGdldExvZ0R1cmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBsb2cgZHVyYXRpb24uCi0gICAqIEBwYXJhbSBsb2dEdXJhdGlvbiBsb2cgZHVyYXRpb24uCi0gICAqIEBzZWUgI2dldExvZ0R1cmF0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2dEdXJhdGlvbihpbnQgbG9nRHVyYXRpb24pOwotCi0gIC8qKgotICAgKiBHZXQgdGltZW91dC4KLSAgICogQHJldHVybiB0aW1lb3V0LgotICAgKiBAc2VlICNzZXRUaW1lb3V0Ci0gICAqLwotICBwdWJsaWMgaW50IGdldFRpbWVvdXQoKTsKLQotICAvKioKLSAgICogU2V0IHRpbWVvdXQuCi0gICAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQuCi0gICAqIEBzZWUgI2dldFRpbWVvdXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpOwotCi0gIC8qKgotICAgKiBHZXQgbWFuLWluLXRoZS1taWRkbGUgaW5mb3JtYXRpb24uCi0gICAqIEByZXR1cm4gbWFuLWluLXRoZS1taWRkbGUgaW5mb3JtYXRpb24uCi0gICAqIEBzZWUgI3NldE1hbkluVGhlTWlkZGxlCi0gICAqLwotICBwdWJsaWMgTWFuSW5UaGVNaWRkbGUgZ2V0TWFuSW5UaGVNaWRkbGUoKTsKLQotICAvKioKLSAgICogU2V0IG1hbi1pbi10aGUtbWlkZGxlIGluZm9ybWF0aW9uLgotICAgKiBAcGFyYW0gbWFuSW5UaGVNaWRkbGUgbWFuLWluLXRoZS1taWRkbGUgaW5mb3JtYXRpb24uCi0gICAqIEBzZWUgI2dldE1hbkluVGhlTWlkZGxlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNYW5JblRoZU1pZGRsZShNYW5JblRoZU1pZGRsZSBtYW5JblRoZU1pZGRsZSk7Ci0KLSAgLyoqCi0gICAqIEdldCB2ZXJib3NlIG9wdGlvbi4KLSAgICogQHJldHVybiB2ZXJib3NlIG9wdGlvbi4KLSAgICogQHNlZSAjc2V0VmVyYm9zZU9wdGlvbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0VmVyYm9zZU9wdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgdmVyYm9zZSBvcHRpb24uCi0gICAqIEBwYXJhbSB2ZXJib3NlIHZlcmJvc2Ugb3B0aW9uLgotICAgKiBAc2VlICNnZXRWZXJib3NlT3B0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlT3B0aW9uKGJvb2xlYW4gdmVyYm9zZSk7Ci0KLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgKiBAcGFyYW0gYXJncyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgd2hpbGUgcGFyc2luZyB0aGUgCi0gICAqICAgICAgICAgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywKLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlQXJncyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL01vbml0b3JDb25maWdSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9Nb25pdG9yQ29uZmlnUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNmYxYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL01vbml0b3JDb25maWdSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VMaXN0OwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgdG8gcmVhZCB0aGUgbW9uaXRvciBjb25maWcgZG9jdW1lbnRzLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9uaXRvckNvbmZpZ1JlYWRlciBleHRlbmRzIERvY3VtZW50UmVhZGVyCi17Ci0gIC8qKgotICAgKiBJbml0aWFsaXplIG1vbml0b3IgY29uZmlnLgotICAgKiBAcGFyYW0gbWVzc2FnZUxpc3QgYSBNZXNzYWdlTGlzdCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KE1lc3NhZ2VMaXN0IG1lc3NhZ2VMaXN0KTsKLQotICAvKioKLSAgICogUmVhZCB0aGUgbW9uaXRvciBjb25maWcgZmlsZS4KLSAgICogQHBhcmFtIG1vbml0b3JDb25maWdVUkkgdGhlIG1vbml0b3IgY29uZmlnIGZpbGUgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gYSBNb25pdG9yQ29uZmlnIG9iamVjdAotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciB3aGlsZSByZWFkaW5nIG1vbml0b3IgY29uZmlnIGZpbGUuCi0gICAqLwotICBwdWJsaWMgTW9uaXRvckNvbmZpZyByZWFkTW9uaXRvckNvbmZpZyhTdHJpbmcgbW9uaXRvckNvbmZpZ1VSSSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBtb25pdG9yIGNvbmZpZyBmaWxlLgotICAgKiBAcGFyYW0gcmVhZGVyIGEgUmVhZGVyIG9iamVjdC4KLSAgICogQHJldHVybiBhIE1vbml0b3JDb25maWcgb2JqZWN0Ci0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIHdoaWxlIHJlYWRpbmcgbW9uaXRvciBjb25maWcgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBNb25pdG9yQ29uZmlnIHJlYWRNb25pdG9yQ29uZmlnKFJlYWRlciByZWFkZXIpIHRocm93cyBXU0lFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvUmVkaXJlY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9SZWRpcmVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTMwODJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9SZWRpcmVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZzsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgbW9uaXRvciBjb25maWcgUmVkaXJlY3QgZWxlbWVudC4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZGlyZWN0IGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9SRURJUkVDVDsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfTU9OSVRPUl9DT05GSUcsIEVMRU1fTkFNRSk7Ci0KLSAgLyoqCi0gICAqIEdldCBjb21tZW50LgotICAgKiBAcmV0dXJuIGNvbW1lbnQuCi0gICAqIEBzZWUgI3NldENvbW1lbnQKLSAgICovCi0gIHB1YmxpYyBDb21tZW50IGdldENvbW1lbnQoKTsKLQotICAvKioKLSAgICogU2V0IGNvbW1lbnQuCi0gICAqIEBwYXJhbSBjb21tZW50IGEgQ29tbWVudG9iamVjdC4KLSAgICogQHNlZSAjZ2V0Q29tbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tbWVudChDb21tZW50IGNvbW1lbnQpOwotCi0gIC8qKgotICAgKiBHZXQgbGlzdGVuIHBvcnQuCi0gICAqIEByZXR1cm4gbGlzdGVuIHBvcnQuCi0gICAqIEBzZWUgI3NldExpc3RlblBvcnQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGlzdGVuUG9ydCgpOwotCi0gIC8qKgotICAgKiBTZXQgbGlzdGVuIHBvcnQuCi0gICAqIEBwYXJhbSBsaXN0ZW5Qb3J0IGxpc3RlbiBwb3J0LgotICAgKiBAc2VlICNnZXRMaXN0ZW5Qb3J0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5Qb3J0KGludCBsaXN0ZW5Qb3J0KTsKLQotICAvKioKLSAgICogR2V0IGhvc3QuCi0gICAqIEByZXR1cm4gaG9zdC4KLSAgICogQHNlZSAjc2V0SG9zdAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRIb3N0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBob3N0LgotICAgKiBAcGFyYW0gaG9zdCAgaG9zdC4KLSAgICogQHNlZSAjZ2V0SG9zdAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCk7Ci0KLSAgLyoqCi0gICAqIEdldCBzZW5kIHRvIHBvcnQuCi0gICAqIEByZXR1cm4gc2VuZCB0byBwb3J0LgotICAgKi8KLSAgcHVibGljIGludCBnZXRUb1BvcnQoKTsKLQotICAvKioKLSAgICogR2V0IHNlbmQgdG8gaG9zdC4KLSAgICogQHJldHVybiBzZW5kIHRvIGhvc3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRvSG9zdCgpOwotCi0gIC8qKgotICAgKiBHZXQgc2VuZCB0byBwcm90b2NvbC4KLSAgICogQHJldHVybiBzZW5kIHRvIHByb3RvY29sLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUb1Byb3RvY29sKCk7Ci0KLSAgLyoqCi0gICAqIEdldCBtYXhpbXVtIGNvbm5lY3Rpb25zLgotICAgKiBAcmV0dXJuIG1heGltdW0gY29ubmVjdGlvbnMuCi0gICAqIEBzZWUgI3NldE1heENvbm5lY3Rpb25zCi0gICAqLwotICBwdWJsaWMgaW50IGdldE1heENvbm5lY3Rpb25zKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBtYXhpbXVtIGNvbm5lY3Rpb25zLgotICAgKiBAcGFyYW0gbWF4Q29ubmVjdGlvbnMgbWF4aW11bSBjb25uZWN0aW9ucy4KLSAgICogQHNlZSAjZ2V0TWF4Q29ubmVjdGlvbnMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1heENvbm5lY3Rpb25zKGludCBtYXhDb25uZWN0aW9ucyk7Ci0KLSAgLyoqCi0gICAqIEdldCByZWFkIHRpbWVvdXQgc2Vjb25kcy4KLSAgICogQHJldHVybiByZWFkIHRpbWVvdXQgc2Vjb25kcy4KLSAgICogQHNlZSAjc2V0UmVhZFRpbWVvdXRTZWNvbmRzCi0gICAqLwotICBwdWJsaWMgaW50IGdldFJlYWRUaW1lb3V0U2Vjb25kcygpOwotCi0gIC8qKgotICAgKiBTZXQgcmVhZCB0aW1lb3V0IHNlY29uZHMuCi0gICAqIEBwYXJhbSByZWFkVGltZW91dFNlY29uZHMgcmVhZCB0aW1lb3V0IHNlY29uZHMuCi0gICAqIEBzZWUgI2dldFJlYWRUaW1lb3V0U2Vjb25kcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVhZFRpbWVvdXRTZWNvbmRzKGludCByZWFkVGltZW91dFNlY29uZHMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL2ltcGwvQ29tbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9pbXBsL0NvbW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzA5YjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL2ltcGwvQ29tbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5Db21tZW50OwotCi0vKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgbW9uaXRvciBjb25maWcgQ29tbWVudCBlbGVtZW50LiAKLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRJbXBsIGltcGxlbWVudHMgQ29tbWVudAotewotICAvKioKLSAgICogQ29tbWVudCB0ZXh0LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB0ZXh0ID0gbnVsbDsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLkNvbW1lbnQjZ2V0VGV4dCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMudGV4dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuQ29tbWVudCNzZXRUZXh0KFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpCi0gIHsKLSAgICB0aGlzLnRleHQgPSB0ZXh0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gQ29uZmlnIG9wdGlvbnMKLSAgICAvL3B3LnByaW50KCIgICAgPCIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiIHhtbG5zPVwiIiArIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX01PTklUT1JfQ09ORklHICsgIlwiPiIpOyAgICAKLSAgICBwdy5wcmludCgiICAgIDwiICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLSAgICBwdy5wcmludCh0aGlzLnRleHQpOwotCi0gICAgLy8gRW5kIGVsZW1lbnQKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9pbXBsL01hbkluVGhlTWlkZGxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL2ltcGwvTWFuSW5UaGVNaWRkbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OGZhNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL2ltcGwvTWFuSW5UaGVNaWRkbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLk1hbkluVGhlTWlkZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdDsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtb25pdG9yIGNvbmZpZyBNYW5JblRoZU1pZGRsZSBlbGVtZW50LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW5JblRoZU1pZGRsZUltcGwgaW1wbGVtZW50cyBNYW5JblRoZU1pZGRsZQotewotICAvKioKLSAgICogQ29tbWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBDb21tZW50IGNvbW1lbnQ7Ci0KLSAgLyoqCi0gICAqIFJlZGlyZWN0IGxpc3QuCi0gICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIHJlZGlyZWN0TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1hbkluVGhlTWlkZGxlI2dldENvbW1lbnQoKQotICAgKi8KLSAgcHVibGljIENvbW1lbnQgZ2V0Q29tbWVudCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5jb21tZW50OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5NYW5JblRoZU1pZGRsZSNzZXRDb21tZW50KENvbW1lbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KENvbW1lbnQgY29tbWVudCkKLSAgewotICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1hbkluVGhlTWlkZGxlI2dldFJlZGlyZWN0TGlzdCgpCi0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFJlZGlyZWN0TGlzdCgpCi0gIHsKLSAgICByZXR1cm4gcmVkaXJlY3RMaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5NYW5JblRoZU1pZGRsZSNhZGRSZWRpcmVjdChSZWRpcmVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFJlZGlyZWN0KFJlZGlyZWN0IHJlZGlyZWN0KQotICB7Ci0gICAgcmVkaXJlY3RMaXN0LmFkZChyZWRpcmVjdCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1hbkluVGhlTWlkZGxlI3NldFJlZGlyZWN0TGlzdChWZWN0b3IpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWRpcmVjdExpc3QoVmVjdG9yIHJlZGlyZWN0TGlzdCkKLSAgewotICAgIHRoaXMucmVkaXJlY3RMaXN0ID0gcmVkaXJlY3RMaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgcHcucHJpbnRsbigiICBtYW4taW4tdGhlLW1pZGRsZSBjb21tZW50IC4uLiAiICsgdGhpcy5jb21tZW50KTsKLQotICAgIC8vIFJlZGlyZWN0IGxpc3QKLSAgICBpbnQgY291bnQgPSAxOwotICAgIFJlZGlyZWN0IHJlZGlyZWN0OwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVkaXJlY3RMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICAvLyBHZXQgbmV4dCByZWRpcmVjdCBlbGVtZW50Ci0gICAgICByZWRpcmVjdCA9IChSZWRpcmVjdCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgcHcucHJpbnRsbigiICByZWRpcmVjdCBbIiArIGNvdW50KysgKyJdIik7Ci0gICAgICBwdy5wcmludChyZWRpcmVjdC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50I3RvWE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIFN0YXJ0IGVsZW1lbnQKLSAgICBwdy5wcmludGxuKCIgICAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0KLSAgICAvLyBDb21tZW50Ci0gICAgaWYgKHRoaXMuY29tbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50bG4odGhpcy5jb21tZW50LnRvWE1MU3RyaW5nKG5zTmFtZSkpOwotICAgIH0KLQotICAgIC8vIFJlZGlyZWN0Ci0gICAgUmVkaXJlY3QgcmVkaXJlY3Q7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSByZWRpcmVjdExpc3QuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIC8vIEdldCBuZXh0IHJlZGlyZWN0IGVsZW1lbnQKLSAgICAgIHJlZGlyZWN0ID0gKFJlZGlyZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBwdy5wcmludChyZWRpcmVjdC50b1hNTFN0cmluZyhuc05hbWUpKTsKLSAgICB9Ci0KLSAgICAvLyBFbmQgZWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICAgIDwvIiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvaW1wbC9Nb25pdG9yQ29uZmlnSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL2ltcGwvTW9uaXRvckNvbmZpZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmMDBkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvaW1wbC9Nb25pdG9yQ29uZmlnSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uQWRkU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuY29tbW9uLmltcGwuQWRkU3R5bGVTaGVldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlTGlzdDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG1vbml0b3IgY29uZmlndXJhdGlvbiBmaWxlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yQ29uZmlnSW1wbCBpbXBsZW1lbnRzIE1vbml0b3JDb25maWcKLXsKLSAgLyoqCi0gICAqIE1lc3NhZ2UgbGlzdCByZWZlcmVuY2UuCi0gICAqLwotICBwcm90ZWN0ZWQgTWVzc2FnZUxpc3QgbWVzc2FnZUxpc3QgPSBudWxsOwotCi0gIC8qKgotICAgKiBNb25pdG9yIGNvbmZpZ3VyYXRpb24gZmlsZSBVUkkuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGRvY3VtZW50VVJJID0gbnVsbDsKLQotICAvKioKLSAgICogQ29tbWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBDb21tZW50IGNvbW1lbnQgPSBudWxsOwotCi0gIC8qKgotICAgKiBMb2cgbG9jYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGxvZ1VSSTsKLQotICAvKioKLSAgICogUmVwbGFjZSBsb2cgaW5kaWNhdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmVwbGFjZUxvZyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBTdHlsZSBzaGVldCBkZWNsYXJhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBBZGRTdHlsZVNoZWV0IGFkZFN0eWxlU2hlZXQ7Ci0KLSAgLyoqCi0gICAqIExvZyBkdXJhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgbG9nRHVyYXRpb24gPSA2MDA7Ci0KLSAgLyoqCi0gICAqIFRpbWVvdXQuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IHRpbWVvdXQgPSAzOwotCi0gIC8qKgotICAgKiBNYW4taW4tdGhlLW1pZGRsZSBzZXR0aW5ncy4KLSAgICovCi0gIHByb3RlY3RlZCBNYW5JblRoZU1pZGRsZSBtYW5JblRoZU1pZGRsZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFZlcmJvc2Ugb3B0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIG1vbml0b3IgY29uZmlnLgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChNZXNzYWdlTGlzdCBtZXNzYWdlTGlzdCkKLSAgewotICAgIHRoaXMubWVzc2FnZUxpc3QgPSBtZXNzYWdlTGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZyNnZXRDb21tZW50KCkKLSAgICovCi0gIHB1YmxpYyBDb21tZW50IGdldENvbW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuY29tbWVudDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZyNzZXRDb21tZW50KENvbW1lbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KENvbW1lbnQgY29tbWVudCkKLSAgewotICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWcjZ2V0TG9nTG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2dMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5sb2dVUkk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWcjc2V0TG9nTG9jYXRpb24oU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9nTG9jYXRpb24oU3RyaW5nIGxvZ1VSSSkKLSAgewotICAgIHRoaXMubG9nVVJJID0gbG9nVVJJOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnI2dldFJlcGxhY2VMb2coKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0UmVwbGFjZUxvZygpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5yZXBsYWNlTG9nOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnI3NldFJlcGxhY2VMb2coYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcGxhY2VMb2coYm9vbGVhbiByZXBsYWNlTG9nKQotICB7Ci0gICAgdGhpcy5yZXBsYWNlTG9nID0gcmVwbGFjZUxvZzsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZyNnZXRBZGRTdHlsZVNoZWV0KCkKLSAgICovCi0gIHB1YmxpYyBBZGRTdHlsZVNoZWV0IGdldEFkZFN0eWxlU2hlZXQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuYWRkU3R5bGVTaGVldDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZyNzZXRBZGRTdHlsZVNoZWV0KG9yZy53c2kudGVzdC5jb21tb24uQWRkU3R5bGVTaGVldCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFkZFN0eWxlU2hlZXQoQWRkU3R5bGVTaGVldCBhZGRTdHlsZVNoZWV0KQotICB7Ci0gICAgdGhpcy5hZGRTdHlsZVNoZWV0ID0gYWRkU3R5bGVTaGVldDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZyNnZXRMb2dEdXJhdGlvbigpCi0gICAqLwotICBwdWJsaWMgaW50IGdldExvZ0R1cmF0aW9uKCkKLSAgewotICAgIHJldHVybiBsb2dEdXJhdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZyNzZXRMb2dEdXJhdGlvbihpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2dEdXJhdGlvbihpbnQgbG9nRHVyYXRpb24pCi0gIHsKLSAgICB0aGlzLmxvZ0R1cmF0aW9uID0gbG9nRHVyYXRpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWcjZ2V0VGltZW91dCgpCi0gICAqLwotICBwdWJsaWMgaW50IGdldFRpbWVvdXQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMudGltZW91dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZyNzZXRUaW1lb3V0KGludCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpCi0gIHsKLSAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnI2dldE1hbkluVGhlTWlkZGxlKCkKLSAgICovCi0gIHB1YmxpYyBNYW5JblRoZU1pZGRsZSBnZXRNYW5JblRoZU1pZGRsZSgpCi0gIHsKLSAgICByZXR1cm4gbWFuSW5UaGVNaWRkbGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWcjc2V0TWFuSW5UaGVNaWRkbGUoTWFuSW5UaGVNaWRkbGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNYW5JblRoZU1pZGRsZShNYW5JblRoZU1pZGRsZSBtYW5JblRoZU1pZGRsZSkKLSAgewotICAgIHRoaXMubWFuSW5UaGVNaWRkbGUgPSBtYW5JblRoZU1pZGRsZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuV1NJRG9jdW1lbnQjZ2V0TG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5kb2N1bWVudFVSSTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuV1NJRG9jdW1lbnQjc2V0TG9jYXRpb24oU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGRvY3VtZW50VVJJKQotICB7Ci0gICAgdGhpcy5kb2N1bWVudFVSSSA9IGRvY3VtZW50VVJJOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnI2dldFZlcmJvc2VPcHRpb24oKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0VmVyYm9zZU9wdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy52ZXJib3NlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnI3NldFZlcmJvc2VPcHRpb24oYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZlcmJvc2VPcHRpb24oYm9vbGVhbiB2ZXJib3NlKQotICB7Ci0gICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50I3RvWE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIENvbmZpZyBvcHRpb25zCi0gICAgcHcucHJpbnRsbigiICAgIDwiICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLQotICAgIC8vIENvbW1lbnQKLSAgICBpZiAodGhpcy5jb21tZW50ICE9IG51bGwpCi0gICAgewotICAgICAgcHcucHJpbnQoY29tbWVudC50b1hNTFN0cmluZyhuc05hbWUpKTsKLSAgICB9Ci0KLSAgICAvLyBMb2cgZmlsZQotICAgIHB3LnByaW50KCIgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0xPR19GSUxFICsgIiAiKTsKLSAgICBwdy5wcmludChXU0lDb25zdGFudHMuQVRUUl9SRVBMQUNFICsgIj1cIiIgKyB0aGlzLnJlcGxhY2VMb2cgKyAiXCIgIik7Ci0gICAgcHcucHJpbnRsbihXU0lDb25zdGFudHMuQVRUUl9MT0NBVElPTiArICI9XCIiICsgdGhpcy5sb2dVUkkgKyAiXCI+Iik7Ci0gICAgcHcucHJpbnQoZ2V0QWRkU3R5bGVTaGVldCgpLnRvWE1MU3RyaW5nKG5hbWVzcGFjZU5hbWUpKTsKLSAgICBwdy5wcmludGxuKCIgICAgPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTE9HX0ZJTEUgKyAiPiIpOwotCi0gICAgLy8gTG9nIGR1cmF0aW9uCi0gICAgcHcucHJpbnQoIiAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTE9HX0RVUkFUSU9OICsgIj4iKTsKLSAgICBwdy5wcmludCh0aGlzLmxvZ0R1cmF0aW9uKTsKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9MT0dfRFVSQVRJT04gKyAiPiIpOwotCi0gICAgLy8gVGltZW91dAotICAgIHB3LnByaW50KAotICAgICAgIiAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fQ0xFQU5VUF9USU1FT1VUX1NFQ09ORFMgKyAiPiIpOwotICAgIHB3LnByaW50KHRoaXMudGltZW91dCk7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fQ0xFQU5VUF9USU1FT1VUX1NFQ09ORFMgKyAiPiIpOwotCi0gICAgLy8gTWFuLWluLXRoZS1taWRkbGUKLSAgICBpZiAodGhpcy5tYW5JblRoZU1pZGRsZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50KG1hbkluVGhlTWlkZGxlLnRvWE1MU3RyaW5nKG5zTmFtZSkpOwotICAgIH0KLQotICAgIC8vIEVuZCBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigiICAgIDwvIiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgcHcucHJpbnRsbigiICBjb21tZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5jb21tZW50KTsKLSAgICBwdy5wcmludGxuKCIgIGxvZ1VSSSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLmxvZ1VSSSk7Ci0gICAgcHcucHJpbnRsbigiICByZXBsYWNlTG9nIC4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5yZXBsYWNlTG9nKTsKLSAgICBwdy5wcmludGxuKCIgIGxvZ0R1cmF0aW9uIC4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLmxvZ0R1cmF0aW9uKTsKLSAgICBwdy5wcmludGxuKCIgIHRpbWVvdXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLnRpbWVvdXQpOwotCi0gICAgLy8gYWRkU3R5bGVTaGVldAotICAgIGlmICh0aGlzLmFkZFN0eWxlU2hlZXQgIT0gbnVsbCkKLSAgICAgIHB3LnByaW50bG4oCi0gICAgICAgICIgIGFkZFN0eWxlU2hlZXQgLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLmFkZFN0eWxlU2hlZXQudG9TdHJpbmcoKSk7Ci0KLSAgICAvLyBNYW4taW4tdGhlLW1pZGRsZQotICAgIGlmICh0aGlzLm1hbkluVGhlTWlkZGxlICE9IG51bGwpCi0gICAgewotICAgICAgcHcucHJpbnQodGhpcy5tYW5JblRoZU1pZGRsZS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgY29uZmlnIHZhbHVlcyBmcm9tIGFub3RoZXIgbW9uaXRvciBjb25maWcgb2JqZWN0LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldENvbmZpZyhNb25pdG9yQ29uZmlnIG1vbml0b3JDb25maWcpCi0gIHsKLSAgICAvLyBBREQ6IFNob3VsZCB0aGlzIGJlIGEgY2xvbmUgb3BlcmF0aW9uPwotICAgIHRoaXMuY29tbWVudCA9IG1vbml0b3JDb25maWcuZ2V0Q29tbWVudCgpOwotICAgIHRoaXMuZG9jdW1lbnRVUkkgPSBtb25pdG9yQ29uZmlnLmdldExvY2F0aW9uKCk7Ci0gICAgdGhpcy5sb2dVUkkgPSBtb25pdG9yQ29uZmlnLmdldExvZ0xvY2F0aW9uKCk7Ci0gICAgdGhpcy5yZXBsYWNlTG9nID0gbW9uaXRvckNvbmZpZy5nZXRSZXBsYWNlTG9nKCk7Ci0gICAgdGhpcy5sb2dEdXJhdGlvbiA9IG1vbml0b3JDb25maWcuZ2V0TG9nRHVyYXRpb24oKTsKLSAgICB0aGlzLnRpbWVvdXQgPSBtb25pdG9yQ29uZmlnLmdldFRpbWVvdXQoKTsKLSAgICB0aGlzLm1hbkluVGhlTWlkZGxlID0gbW9uaXRvckNvbmZpZy5nZXRNYW5JblRoZU1pZGRsZSgpOwotICAgIHRoaXMuYWRkU3R5bGVTaGVldCA9IG1vbml0b3JDb25maWcuZ2V0QWRkU3R5bGVTaGVldCgpOwotICAgIHRoaXMudmVyYm9zZSA9IG1vbml0b3JDb25maWcuZ2V0VmVyYm9zZU9wdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZlcmlmeSBjb25maWcgb3B0aW9ucy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB2ZXJpZnlDb25maWcoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBJZiBubyByZWRpcmVjdCBzdGF0ZW1lbnRzLCB0aGVuIGV4aXQKLSAgICBpZiAoKHRoaXMubWFuSW5UaGVNaWRkbGUgPT0gbnVsbCkKLSAgICAgIHx8ICh0aGlzLm1hbkluVGhlTWlkZGxlLmdldFJlZGlyZWN0TGlzdCgpID09IG51bGwpCi0gICAgICB8fCAodGhpcy5tYW5JblRoZU1pZGRsZS5nZXRSZWRpcmVjdExpc3QoKS5zaXplKCkgPT0gMCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMDUiLAotICAgICAgICAgICJNb25pdG9yIGNvbmZpZyBmaWxlIGRpZCBub3QgY29udGFpbiBhbnkgcmVkaXJlY3Qgc3RhdGVtZW50cy4iKSk7Ci0gICAgfQotCi0gICAgaWYgKHRoaXMubG9nVVJJID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMDYiLAotICAgICAgICAgICJNb25pdG9yIGNvbmZpZyBmaWxlIGRpZCBub3QgY29udGFpbiB0aGUgbG9nIGZpbGUgVVJJLiIpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZUFyZ3MoU3RyaW5nW10gYXJncykgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gR2V0IG5ldyBjb25maWcgcmVhZGVyCi0gICAgTW9uaXRvckNvbmZpZ1JlYWRlciBtb25pdG9yQ29uZmlnUmVhZGVyID0gbmV3IE1vbml0b3JDb25maWdSZWFkZXJJbXBsKCk7Ci0KLSAgICAvLyBNb25pdG9yIGNvbmZpZyBvYmplY3Qgd2hpY2ggd2lsbCBiZSBtZXJnZWQgYWZ0ZXIgYWxsIG9mIHRoZSBpbnB1dCBwYXJtcyBhcmUgcHJvY2Vzc2VkCi0gICAgTW9uaXRvckNvbmZpZyBtb25pdG9yQ29uZmlnRnJvbUFyZ3MgPSBudWxsOwotCi0gICAgLy8gSWYgbm8gaW5wdXQgYXJndW1lbnRzLCB0aGVuIHRocm93IGV4Y2VwdGlvbgotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIC8vIEFERDogCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKCJ1c2FnZTAxIiwgTW9uaXRvci5VU0FHRV9NRVNTQUdFKSk7Ci0gICAgfQotCi0gICAgLy8gUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gbG9jYXRlIHRoZSBjb25maWcgZmlsZSBvcHRpb24gKGlmIGl0IHdhcyBzcGVjaWZpZWQpCi0gICAgZm9yIChpbnQgYXJnQ291bnQgPSAwOyBhcmdDb3VudCA8IGFyZ3MubGVuZ3RoOyBhcmdDb3VudCsrKQotICAgIHsKLSAgICAgIC8vIC1jb25maWdGaWxlCi0gICAgICBpZiAoKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1jb25maWciKSkKLSAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLWMiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIG1vbml0b3JDb25maWdGcm9tQXJncyA9Ci0gICAgICAgICAgbW9uaXRvckNvbmZpZ1JlYWRlci5yZWFkTW9uaXRvckNvbmZpZyhhcmdzW2FyZ0NvdW50XSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgY29uZmlnIGZpbGUgd2FzIG5vdCBzcGVjaWZpZWQsIHRoZW4gY3JlYXRlIGFuYWx5emVyIGNvbmZpZyBvYmplY3QKLSAgICBpZiAobW9uaXRvckNvbmZpZ0Zyb21BcmdzID09IG51bGwpCi0gICAgewotICAgICAgbW9uaXRvckNvbmZpZ0Zyb21BcmdzID0gbmV3IE1vbml0b3JDb25maWdJbXBsKCk7Ci0gICAgICBtb25pdG9yQ29uZmlnRnJvbUFyZ3MuaW5pdCh0aGlzLm1lc3NhZ2VMaXN0KTsKLSAgICB9Ci0KLSAgICAvLyBQYXJzZSBhbGwgb2YgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLSAgICBmb3IgKGludCBhcmdDb3VudCA9IDA7IGFyZ0NvdW50IDwgYXJncy5sZW5ndGg7IGFyZ0NvdW50KyspCi0gICAgewotICAgICAgLy8gLWNvbmZpZ0ZpbGUKLSAgICAgIGlmICgoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLWNvbmZpZyIpKQotICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItYyIpKSkKLSAgICAgIHsKLSAgICAgICAgLy8gU2tpcCB0aGlzIG9wdGlvbiBzaW5jZSBpdCB3YXMgYWxyZWFkeSBwcm9jZXNzZWQKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgIH0KLQotICAgICAgLy8gLWNvbW1lbnQKLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLWNvbW1lbnQiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItQyIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsKCk7Ci0gICAgICAgIGNvbW1lbnQuc2V0VGV4dChhcmdzW2FyZ0NvdW50XSk7Ci0gICAgICAgIG1vbml0b3JDb25maWdGcm9tQXJncy5zZXRDb21tZW50KGNvbW1lbnQpOwotICAgICAgfQotCi0gICAgICAvLyAtbG9nRmlsZQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItbG9nRmlsZSIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1sIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBtb25pdG9yQ29uZmlnRnJvbUFyZ3Muc2V0TG9nTG9jYXRpb24oYXJnc1thcmdDb3VudF0pOwotICAgICAgfQotCi0gICAgICAvLyAtcmVwbGFjZQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItcmVwbGFjZSIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1yIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBtb25pdG9yQ29uZmlnRnJvbUFyZ3Muc2V0UmVwbGFjZUxvZygKLSAgICAgICAgICBCb29sZWFuLnZhbHVlT2YoYXJnc1thcmdDb3VudF0pLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gLWxvZ0R1cmF0aW9uCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1sb2dEdXJhdGlvbiIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1kIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBtb25pdG9yQ29uZmlnRnJvbUFyZ3Muc2V0TG9nRHVyYXRpb24oCi0gICAgICAgICAgSW50ZWdlci52YWx1ZU9mKGFyZ3NbYXJnQ291bnRdKS5pbnRWYWx1ZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gLXRpbWVvdXQKLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLXRpbWVvdXQiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItdCIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgbW9uaXRvckNvbmZpZ0Zyb21BcmdzLnNldFRpbWVvdXQoCi0gICAgICAgICAgSW50ZWdlci52YWx1ZU9mKGFyZ3NbYXJnQ291bnRdKS5pbnRWYWx1ZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gLW1hbkluVGhlTWlkZGxlCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1tYW5JblRoZU1pZGRsZSIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1tIikpKQotICAgICAgewotICAgICAgICBNYW5JblRoZU1pZGRsZSBtYW5JblRoZU1pZGRsZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gSW5jcmVtZW50IGFyZyBjb3VudAotICAgICAgICBhcmdDb3VudCsrOwotCi0gICAgICAgIC8vIEdldCB0aGUgbWFuLWluLXRoZS1taWRkbGUgb2JqZWN0Ci0gICAgICAgIGlmICgobWFuSW5UaGVNaWRkbGUgPSBtb25pdG9yQ29uZmlnRnJvbUFyZ3MuZ2V0TWFuSW5UaGVNaWRkbGUoKSkKLSAgICAgICAgICA9PSBudWxsKQotICAgICAgICAgIG1hbkluVGhlTWlkZGxlID0gbmV3IE1hbkluVGhlTWlkZGxlSW1wbCgpOwotCi0gICAgICAgIC8vIEFERDogQ2hlY2sgZm9yIGNvcnJlY3QgbnVtYmVyIG9mIHJlbWFpbmluZyBhcmdzCi0KLSAgICAgICAgLy8gQ3JlYXRlIHJlZGlyZWN0Ci0gICAgICAgIFJlZGlyZWN0IHJlZGlyZWN0ID0gbmV3IFJlZGlyZWN0SW1wbCgpOwotCi0gICAgICAgIC8vIEdldCB0aGUgcmVkaXJlY3QgdmFsdWVzIAotICAgICAgICByZWRpcmVjdC5zZXRMaXN0ZW5Qb3J0KEludGVnZXIudmFsdWVPZihhcmdzW2FyZ0NvdW50KytdKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgcmVkaXJlY3Quc2V0SG9zdChhcmdzW2FyZ0NvdW50KytdKTsKLSAgICAgICAgcmVkaXJlY3Quc2V0TWF4Q29ubmVjdGlvbnMoCi0gICAgICAgICAgSW50ZWdlci52YWx1ZU9mKGFyZ3NbYXJnQ291bnQrK10pLmludFZhbHVlKCkpOwotICAgICAgICByZWRpcmVjdC5zZXRSZWFkVGltZW91dFNlY29uZHMoCi0gICAgICAgICAgSW50ZWdlci52YWx1ZU9mKGFyZ3NbYXJnQ291bnQrK10pLmludFZhbHVlKCkpOwotCi0gICAgICAgIC8vIEFkZCByZWRpcmVjdAotICAgICAgICBtYW5JblRoZU1pZGRsZS5hZGRSZWRpcmVjdChyZWRpcmVjdCk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBtYW4taW4tdGhlLW1pZGRsZQotICAgICAgICBtb25pdG9yQ29uZmlnRnJvbUFyZ3Muc2V0TWFuSW5UaGVNaWRkbGUobWFuSW5UaGVNaWRkbGUpOwotICAgICAgfQotCi0gICAgICAvLyAtdmVyYm9zZQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItdmVyYm9zZSIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi12IikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICAvL21vbml0b3JDb25maWdGcm9tQXJncy5zZXRWZXJib3NlT3B0aW9uKEJvb2xlYW4udmFsdWVPZihhcmdzW2FyZ0NvdW50XSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICBtb25pdG9yQ29uZmlnRnJvbUFyZ3Muc2V0VmVyYm9zZU9wdGlvbih0cnVlKTsKLSAgICAgIH0KLQotICAgICAgLy8gLUdVSQotICAgICAgZWxzZSBpZiAoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLUdVSSIpKQotICAgICAgewotICAgICAgICAvLyBJZ25vcmUgLUdVSSBvcHRpb24KLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgICAiY29uZmlnMDEiLAotICAgICAgICAgICAgYXJnc1thcmdDb3VudF0sCi0gICAgICAgICAgICAiVGhlIHNwZWNpZmllZCBvcHRpb24gaXMgbm90IHN1cHBvcnRlZC4iKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgYWRkU3R5bGVTaGVldCB3YXMgbm90IHNwZWNpZmllZCwgdGhlbiBjcmVhdGUgYSBjb21tZW50IHZlcnNpb24gb2YgaXQKLSAgICBpZiAobW9uaXRvckNvbmZpZ0Zyb21BcmdzLmdldEFkZFN0eWxlU2hlZXQoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIEFkZFN0eWxlU2hlZXQgYWRkU3R5bGVTaGVldCA9IG5ldyBBZGRTdHlsZVNoZWV0SW1wbCgpOwotICAgICAgYWRkU3R5bGVTaGVldC5zZXRIcmVmKFdTSUNvbnN0YW50cy5ERUZBVUxUX0xPR19YU0wpOwotICAgICAgYWRkU3R5bGVTaGVldC5zZXRUeXBlKFdTSUNvbnN0YW50cy5ERUZBVUxUX1hTTF9UWVBFKTsKLSAgICAgIGFkZFN0eWxlU2hlZXQuc2V0Q29tbWVudCh0cnVlKTsKLSAgICAgIG1vbml0b3JDb25maWdGcm9tQXJncy5zZXRBZGRTdHlsZVNoZWV0KGFkZFN0eWxlU2hlZXQpOwotICAgIH0KLQotICAgIC8vIE1lcmdlIGNvbmZpZyBpbmZvIGludG8gdGhpcyBvYmplY3QKLSAgICBzZXRDb25maWcobW9uaXRvckNvbmZpZ0Zyb21BcmdzKTsKLQotICAgIC8vIFZlcmlmeSBjb25maWcgb3B0aW9ucwotICAgIHZlcmlmeUNvbmZpZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBtZXNzYWdlIGZyb20gcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZUlELCBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZShtZXNzYWdlSUQsIG51bGwsIGRlZmF1bHRNZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbWVzc2FnZSBmcm9tIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoCi0gICAgU3RyaW5nIG1lc3NhZ2VJRCwKLSAgICBTdHJpbmcgbWVzc2FnZURhdGEsCi0gICAgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQotICB7Ci0gICAgU3RyaW5nIG1lc3NhZ2UgPSBkZWZhdWx0TWVzc2FnZTsKLSAgICBpZiAobWVzc2FnZUxpc3QgIT0gbnVsbCkKLSAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlTGlzdC5nZXRNZXNzYWdlKG1lc3NhZ2VJRCwgbWVzc2FnZURhdGEsIGRlZmF1bHRNZXNzYWdlKTsKLSAgICBlbHNlCi0gICAgICBtZXNzYWdlICs9ICIgIiArIG1lc3NhZ2VEYXRhICsgIi4iOwotCi0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9pbXBsL01vbml0b3JDb25maWdSZWFkZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvaW1wbC9Nb25pdG9yQ29uZmlnUmVhZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2FiY2NhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9pbXBsL01vbml0b3JDb25maWdSZWFkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuY29tbW9uLkFkZFN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5pbXBsLkFkZFN0eWxlU2hlZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlRlc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHJlYWQgdGhlIG1vbml0b3IgY29uZmlnIGRvY3VtZW50cy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvckNvbmZpZ1JlYWRlckltcGwgaW1wbGVtZW50cyBNb25pdG9yQ29uZmlnUmVhZGVyCi17Ci0gIC8qKgotICAgKiBNZXNzYWdlIGxpc3QgcmVmZXJlbmNlLgotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2VMaXN0IG1lc3NhZ2VMaXN0ID0gbnVsbDsKLQotICAvKioKLSAgICogRG9jdW1lbnQgbG9jYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGRvY3VtZW50VVJJOwotCi0gIC8qKgotICAgKiBJbml0aWFsaXplIG1vbml0b3IgY29uZmlnLgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChNZXNzYWdlTGlzdCBtZXNzYWdlTGlzdCkKLSAgewotICAgIHRoaXMubWVzc2FnZUxpc3QgPSBtZXNzYWdlTGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZ1JlYWRlciNyZWFkTW9uaXRvckNvbmZpZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgTW9uaXRvckNvbmZpZyByZWFkTW9uaXRvckNvbmZpZyhTdHJpbmcgbW9uaXRvckNvbmZpZ1VSSSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlUmVhZGVyIGZpbGVSZWFkZXIgPSBudWxsOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKG1vbml0b3JDb25maWdVUkkpOwotICAgIH0KLQotICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKCJjb25maWcwMiIsIG1vbml0b3JDb25maWdVUkksICJDb3VsZCBub3QgZmluZCBmaWxlOiIpLAotICAgICAgICBmbmZlKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgiY29uZmlnMDMiLCBtb25pdG9yQ29uZmlnVVJJLCAiQ291bGQgbm90IHJlYWQgZmlsZToiKSwKLSAgICAgICAgZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlYWRNb25pdG9yQ29uZmlnKGZpbGVSZWFkZXIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnUmVhZGVyI3JlYWRNb25pdG9yQ29uZmlnKFJlYWRlcikKLSAgICovCi0gIHB1YmxpYyBNb25pdG9yQ29uZmlnIHJlYWRNb25pdG9yQ29uZmlnKFJlYWRlciByZWFkZXIpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIE1vbml0b3JDb25maWcgbW9uaXRvckNvbmZpZyA9IG5ldyBNb25pdG9yQ29uZmlnSW1wbCgpOwotCi0gICAgLy8gUGFyc2UgWE1MCi0gICAgRG9jdW1lbnQgZG9jID0gWE1MVXRpbHMucGFyc2VYTUwocmVhZGVyKTsKLQotICAgIC8vIFBhcnNlIGVsZW1lbnRzIGluIHRoZSBjb25maWcgZG9jdW1lbnQKLSAgICBwYXJzZUNvbmZpZ0VsZW1lbnQobW9uaXRvckNvbmZpZywgZG9jLmdldERvY3VtZW50RWxlbWVudCgpKTsKLQotICAgIHJldHVybiBtb25pdG9yQ29uZmlnOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlciNnZXRMb2NhdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLmRvY3VtZW50VVJJOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlciNzZXRMb2NhdGlvbihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgZG9jdW1lbnRVUkkpCi0gIHsKLSAgICB0aGlzLmRvY3VtZW50VVJJID0gZG9jdW1lbnRVUkk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgY29uZmlnIGVsZW1lbnQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcGFyc2VDb25maWdFbGVtZW50KE1vbml0b3JDb25maWcgbW9uaXRvckNvbmZpZywgRWxlbWVudCBlbGVtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEFERDogVmVyaWZ5IHRoYXQgdGhpcyBpcyB0aGUgY29uZmlnIGVsZW1lbnQKLQotICAgIC8vIEdldCBmaXJzdCBjaGlsZCBlbGVtZW50Ci0gICAgRWxlbWVudCBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbWVudCk7Ci0KLSAgICBib29sZWFuIGlzTG9nRHVyYXRpb25EZWZpbmUgPSBmYWxzZTsKLSAgICBib29sZWFuIGlzQ2xlYW51cFRpbWVvdXRTZWNvbmRzRGVmaW5lID0gZmFsc2U7Ci0KLSAgICAvLyBQcm9jZXNzIGVhY2ggY2hpbGQgZWxlbWVudAotICAgIHdoaWxlIChuZXh0RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIDxsb2dGaWxlPgotICAgICAgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fTE9HX0ZJTEUpKQotICAgICAgewotICAgICAgICAvLyBQYXJzZSB0aGUgbG9nIGVsZW1lbnQKLSAgICAgICAgcGFyc2VMb2dGaWxlRWxlbWVudChtb25pdG9yQ29uZmlnLCBuZXh0RWxlbWVudCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxsb2dEdXJhdGlvbj4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fTE9HX0RVUkFUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgbW9uaXRvckNvbmZpZy5zZXRMb2dEdXJhdGlvbihnZXRJbnRWYWx1ZShuZXh0RWxlbWVudCkpOwotICAgICAgICBpZiAobW9uaXRvckNvbmZpZy5nZXRMb2dEdXJhdGlvbigpIDwgMCkKLSAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgImNvbmZpZzA5IiwKLSAgICAgICAgICAgICAgV1NJQ29uc3RhbnRzLkVMRU1fTE9HX0RVUkFUSU9OLAotICAgICAgICAgICAgICAiUGFyYW1ldGVyIHZhbHVlIGNhbid0IGJlIG5lZ2F0aXZlLiBFbGVtZW50IG5hbWU6IikpOwotICAgICAgICBpc0xvZ0R1cmF0aW9uRGVmaW5lID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgLy8gPGNsZWFudXBUaW1lb3V0U2Vjb25kcz4KLSAgICAgIGVsc2UgaWYgKAotICAgICAgICBpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX0NMRUFOVVBfVElNRU9VVF9TRUNPTkRTKSkKLSAgICAgIHsKLSAgICAgICAgbW9uaXRvckNvbmZpZy5zZXRUaW1lb3V0KGdldEludFZhbHVlKG5leHRFbGVtZW50KSk7Ci0gICAgICAgIGlmIChtb25pdG9yQ29uZmlnLmdldFRpbWVvdXQoKSA8IDApCi0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICJjb25maWcwOSIsCi0gICAgICAgICAgICAgIFdTSUNvbnN0YW50cy5FTEVNX0NMRUFOVVBfVElNRU9VVF9TRUNPTkRTLAotICAgICAgICAgICAgICAiUGFyYW1ldGVyIHZhbHVlIGNhbid0IGJlIG5lZ2F0aXZlLiBFbGVtZW50IG5hbWU6IikpOwotICAgICAgICBpc0NsZWFudXBUaW1lb3V0U2Vjb25kc0RlZmluZSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxtYW5JblRoZU1pZGRsZT4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fTUFOX0lOX1RIRV9NSURETEUpKQotICAgICAgewotICAgICAgICBNYW5JblRoZU1pZGRsZSBtYW5JblRoZU1pZGRsZSA9IG5ldyBNYW5JblRoZU1pZGRsZUltcGwoKTsKLSAgICAgICAgbW9uaXRvckNvbmZpZy5zZXRNYW5JblRoZU1pZGRsZShtYW5JblRoZU1pZGRsZSk7Ci0gICAgICAgIHBhcnNlTWFuSW5UaGVNaWRkbGVFbGVtZW50KG1hbkluVGhlTWlkZGxlLCBuZXh0RWxlbWVudCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxjb21tZW50PgotICAgICAgZWxzZSBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9DT01NRU5UKSkKLSAgICAgIHsKLSAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsKCk7Ci0gICAgICAgIGNvbW1lbnQuc2V0VGV4dChYTUxVdGlscy5nZXRUZXh0KG5leHRFbGVtZW50KSk7Ci0gICAgICAgIG1vbml0b3JDb25maWcuc2V0Q29tbWVudChjb21tZW50KTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBBREQ6IGhhbmRsZSBpbnZhbGlkIGVsZW1lbnRzCi0gICAgICB9Ci0KLSAgICAgIC8vIEdldCBuZXh0IGVsZW1lbnQKLSAgICAgIG5leHRFbGVtZW50ID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcobmV4dEVsZW1lbnQpOwotICAgIH0KLQotICAgIGlmICghaXNMb2dEdXJhdGlvbkRlZmluZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcxMCIsCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkVMRU1fTE9HX0RVUkFUSU9OLAotICAgICAgICAgICJFbGVtZW50IGlzIG1pc3NpbmcuIEVsZW1lbnQgbmFtZToiKSk7Ci0gICAgfQotICAgIGlmICghaXNDbGVhbnVwVGltZW91dFNlY29uZHNEZWZpbmUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMTAiLAotICAgICAgICAgIFdTSUNvbnN0YW50cy5FTEVNX0NMRUFOVVBfVElNRU9VVF9TRUNPTkRTLAotICAgICAgICAgICJFbGVtZW50IGlzIG1pc3NpbmcuIEVsZW1lbnQgbmFtZToiKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGxvZ0ZpbGUgZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBwYXJzZUxvZ0ZpbGVFbGVtZW50KAotICAgIE1vbml0b3JDb25maWcgbW9uaXRvckNvbmZpZywKLSAgICBFbGVtZW50IGVsZW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gR2V0IHRoZSBsb2NhdGlvbiBhdHRyaWJ1dGUKLSAgICBtb25pdG9yQ29uZmlnLnNldExvZ0xvY2F0aW9uKAotICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgV1NJQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04pKTsKLQotICAgIC8vIEdldCB0aGUgcmVwbGFjZSBhdHRyaWJ1dGUKLSAgICBtb25pdG9yQ29uZmlnLnNldFJlcGxhY2VMb2coCi0gICAgICBYTUxVdGlscy5nZXRCb29sZWFuVmFsdWUoZWxlbWVudCwgV1NJQ29uc3RhbnRzLkFUVFJfUkVQTEFDRSwgZmFsc2UpKTsKLQotICAgIC8vIEdldCBmaXJzdCBjaGlsZCBlbGVtZW50Ci0gICAgRWxlbWVudCBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbWVudCk7Ci0KLSAgICAvLyBQcm9jZXNzIGVhY2ggY2hpbGQgZWxlbWVudAotICAgIHdoaWxlIChuZXh0RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIDxhZGRTdHlsZVNoZWV0PgotICAgICAgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fQUREX1NUWUxFX1NIRUVUKSkKLSAgICAgIHsKLSAgICAgICAgQWRkU3R5bGVTaGVldCBhZGRTdHlsZVNoZWV0ID0gbmV3IEFkZFN0eWxlU2hlZXRJbXBsKCk7Ci0KLSAgICAgICAgLy8gUGFyc2UgdGhlIGVsZW1lbnQgIAotICAgICAgICBUZXN0VXRpbHMucGFyc2VBZGRTdHlsZVNoZWV0KAotICAgICAgICAgIG5leHRFbGVtZW50LAotICAgICAgICAgIGFkZFN0eWxlU2hlZXQsCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkRFRkFVTFRfTE9HX1hTTCk7Ci0KLSAgICAgICAgLy8gU2V0IGFkZCBzdHlsZSBzaGVldAotICAgICAgICBtb25pdG9yQ29uZmlnLnNldEFkZFN0eWxlU2hlZXQoYWRkU3R5bGVTaGVldCk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gQUREOiBoYW5kbGUgaW52YWxpZCBlbGVtZW50cwotICAgICAgfQotCi0gICAgICAvLyBHZXQgbmV4dCBlbGVtZW50Ci0gICAgICBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKG5leHRFbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgbWFuSW50aGVNaWRkbGUgZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBwYXJzZU1hbkluVGhlTWlkZGxlRWxlbWVudCgKLSAgICBNYW5JblRoZU1pZGRsZSBtYW5JblRoZU1pZGRsZSwKLSAgICBFbGVtZW50IGVsZW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gR2V0IGZpcnN0IGNoaWxkIGVsZW1lbnQKLSAgICBFbGVtZW50IG5leHRFbGVtZW50ID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChlbGVtZW50KTsKLQotICAgIC8vIFByb2Nlc3MgZWFjaCBjaGlsZCBlbGVtZW50Ci0gICAgd2hpbGUgKG5leHRFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgLy8gPHJlZGlyZWN0PgotICAgICAgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fUkVESVJFQ1QpKQotICAgICAgewotICAgICAgICBSZWRpcmVjdCByZWRpcmVjdCA9IG5ldyBSZWRpcmVjdEltcGwoKTsKLSAgICAgICAgbWFuSW5UaGVNaWRkbGUuYWRkUmVkaXJlY3QocmVkaXJlY3QpOwotICAgICAgICBwYXJzZVJlZGlyZWN0RWxlbWVudChyZWRpcmVjdCwgbmV4dEVsZW1lbnQpOwotICAgICAgfQotCi0gICAgICAvLyA8Y29tbWVudD4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fQ09NTUVOVCkpCi0gICAgICB7Ci0gICAgICAgIENvbW1lbnQgY29tbWVudCA9IG5ldyBDb21tZW50SW1wbCgpOwotICAgICAgICBjb21tZW50LnNldFRleHQoWE1MVXRpbHMuZ2V0VGV4dChuZXh0RWxlbWVudCkpOwotICAgICAgICBtYW5JblRoZU1pZGRsZS5zZXRDb21tZW50KGNvbW1lbnQpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIEFERDogaGFuZGxlIGludmFsaWQgZWxlbWVudHMKLSAgICAgIH0KLQotICAgICAgLy8gR2V0IG5leHQgZWxlbWVudAotICAgICAgbmV4dEVsZW1lbnQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhuZXh0RWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIHJlZGlyZWN0IGVsZW1lbnQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcGFyc2VSZWRpcmVjdEVsZW1lbnQoUmVkaXJlY3QgcmVkaXJlY3QsIEVsZW1lbnQgZWxlbWVudCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBHZXQgZmlyc3QgY2hpbGQgZWxlbWVudAotICAgIEVsZW1lbnQgbmV4dEVsZW1lbnQgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKGVsZW1lbnQpOwotCi0gICAgYm9vbGVhbiBpc0xpc3RlblBvcnREZWZpbmUgPSBmYWxzZTsKLSAgICBib29sZWFuIGlzU2NoZW1lQW5kSG9zdFBvcnREZWZpbmUgPSBmYWxzZTsKLSAgICBib29sZWFuIGlzTWF4Q29ubmVjdGlvbnNEZWZpbmUgPSBmYWxzZTsKLSAgICBib29sZWFuIGlzUmVhZFRpbWVvdXRTZWNvbmRzRGVmaW5lID0gZmFsc2U7Ci0KLSAgICAvLyBQcm9jZXNzIGVhY2ggY2hpbGQgZWxlbWVudAotICAgIHdoaWxlIChuZXh0RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIDxsaXN0ZW5Qb3J0PgotICAgICAgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fTElTVEVOX1BPUlQpKQotICAgICAgewotICAgICAgICByZWRpcmVjdC5zZXRMaXN0ZW5Qb3J0KGdldEludFZhbHVlKG5leHRFbGVtZW50KSk7Ci0gICAgICAgIGlzTGlzdGVuUG9ydERlZmluZSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxzY2hlbWVBbmRIb3N0UG9ydD4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fU0NIRU1FX0FORF9IT1NUUE9SVCkpCi0gICAgICB7Ci0gICAgICAgIHJlZGlyZWN0LnNldEhvc3QoWE1MVXRpbHMuZ2V0VGV4dChuZXh0RWxlbWVudCkpOwotICAgICAgICBpc1NjaGVtZUFuZEhvc3RQb3J0RGVmaW5lID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgLy8gPG1heENvbm5lY3Rpb25zPgotICAgICAgZWxzZSBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9NQVhfQ09OTkVDVElPTlMpKQotICAgICAgewotICAgICAgICByZWRpcmVjdC5zZXRNYXhDb25uZWN0aW9ucyhnZXRJbnRWYWx1ZShuZXh0RWxlbWVudCkpOwotICAgICAgICBpc01heENvbm5lY3Rpb25zRGVmaW5lID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgLy8gPHJlYWRUaW1lb3V0U2Vjb25kcz4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fUkVBRF9USU1FT1VUX1NFQ09ORFMpKQotICAgICAgewotICAgICAgICByZWRpcmVjdC5zZXRSZWFkVGltZW91dFNlY29uZHMoZ2V0SW50VmFsdWUobmV4dEVsZW1lbnQpKTsKLSAgICAgICAgaWYgKHJlZGlyZWN0LmdldFJlYWRUaW1lb3V0U2Vjb25kcygpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICAgICAiY29uZmlnMDkiLAotICAgICAgICAgICAgICBXU0lDb25zdGFudHMuRUxFTV9SRUFEX1RJTUVPVVRfU0VDT05EUywKLSAgICAgICAgICAgICAgIlBhcmFtZXRlciB2YWx1ZSBjYW4ndCBiZSBuZWdhdGl2ZS4gRWxlbWVudCBuYW1lOiIpKTsKLSAgICAgICAgfQotICAgICAgICBpc1JlYWRUaW1lb3V0U2Vjb25kc0RlZmluZSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxjb21tZW50PgotICAgICAgZWxzZSBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9DT01NRU5UKSkKLSAgICAgIHsKLSAgICAgICAgQ29tbWVudCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsKCk7Ci0gICAgICAgIGNvbW1lbnQuc2V0VGV4dChYTUxVdGlscy5nZXRUZXh0KG5leHRFbGVtZW50KSk7Ci0gICAgICAgIHJlZGlyZWN0LnNldENvbW1lbnQoY29tbWVudCk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gQUREOiBoYW5kbGUgaW52YWxpZCBlbGVtZW50cwotICAgICAgfQotCi0gICAgICAvLyBHZXQgbmV4dCBlbGVtZW50Ci0gICAgICBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKG5leHRFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzTGlzdGVuUG9ydERlZmluZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcxMCIsCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkVMRU1fTElTVEVOX1BPUlQsCi0gICAgICAgICAgIkVsZW1lbnQgaXMgbWlzc2luZy4gRWxlbWVudCBuYW1lOiIpKTsKLSAgICB9Ci0gICAgaWYgKCFpc1NjaGVtZUFuZEhvc3RQb3J0RGVmaW5lKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzEwIiwKLSAgICAgICAgICBXU0lDb25zdGFudHMuRUxFTV9TQ0hFTUVfQU5EX0hPU1RQT1JULAotICAgICAgICAgICJFbGVtZW50IGlzIG1pc3NpbmcuIEVsZW1lbnQgbmFtZToiKSk7Ci0KLSAgICB9Ci0gICAgaWYgKCFpc01heENvbm5lY3Rpb25zRGVmaW5lKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzEwIiwKLSAgICAgICAgICBXU0lDb25zdGFudHMuRUxFTV9NQVhfQ09OTkVDVElPTlMsCi0gICAgICAgICAgIkVsZW1lbnQgaXMgbWlzc2luZy4gRWxlbWVudCBuYW1lOiIpKTsKLSAgICB9Ci0gICAgaWYgKCFpc1JlYWRUaW1lb3V0U2Vjb25kc0RlZmluZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcxMCIsCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkVMRU1fUkVBRF9USU1FT1VUX1NFQ09ORFMsCi0gICAgICAgICAgIkVsZW1lbnQgaXMgbWlzc2luZy4gRWxlbWVudCBuYW1lOiIpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoaXMgZWxlbWVudCBtYXRjaGVzIHNwZWNpZmllZCBsb2NhbCBuYW1lIGluIHRoZSBhbmFseXplciBjb25maWcgbmFtZXNwYWNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzRWxlbWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICByZXR1cm4gaXNFbGVtZW50KAotICAgICAgZWxlbWVudCwKLSAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX01PTklUT1JfQ09ORklHLAotICAgICAgbG9jYWxOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhpcyBlbGVtZW50IG1hdGNoZXMgc3BlY2lmaWVkIGxvY2FsIG5hbWUgaW4gdGhlIGFuYWx5emVyIGNvbmZpZyBuYW1lc3BhY2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNFbGVtZW50KAotICAgIEVsZW1lbnQgZWxlbWVudCwKLSAgICBTdHJpbmcgbmFtZXNwYWNlLAotICAgIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICByZXR1cm4gWE1MVXRpbHMuaXNFbGVtZW50KGVsZW1lbnQsIG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgZWxlbWVudCB0ZXh0IGFzIGFuIGludC4KLSAgICovCi0gIHByaXZhdGUgaW50IGdldEludFZhbHVlKEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgaW50IHJldHVyblZhbHVlOwotICAgIFN0cmluZyBpbnRWYWx1ZSA9IG51bGw7Ci0KLSAgICAvLyBHZXQgdmFsdWUgYXMgYSBzdHJpbmcKLSAgICBpZiAoKGludFZhbHVlID0gWE1MVXRpbHMuZ2V0VGV4dChlbGVtZW50KSkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcwNCIsCi0gICAgICAgICAgZWxlbWVudC5nZXRMb2NhbE5hbWUoKSArICJFbGVtZW50IG11c3QgY29udGFpbiBhbiBpbnRlZ2VyIHZhbHVlOiIpKTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuVmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YoaW50VmFsdWUpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGludAotICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbWVzc2FnZSBmcm9tIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJRCwgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQotICB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2UobWVzc2FnZUlELCBudWxsLCBkZWZhdWx0TWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG1lc3NhZ2UgZnJvbSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKAotICAgIFN0cmluZyBtZXNzYWdlSUQsCi0gICAgU3RyaW5nIG1lc3NhZ2VEYXRhLAotICAgIFN0cmluZyBkZWZhdWx0TWVzc2FnZSkKLSAgewotICAgIFN0cmluZyBtZXNzYWdlID0gZGVmYXVsdE1lc3NhZ2U7Ci0gICAgaWYgKG1lc3NhZ2VMaXN0ICE9IG51bGwpCi0gICAgICBtZXNzYWdlID0gbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZShtZXNzYWdlSUQsIG1lc3NhZ2VEYXRhLCBkZWZhdWx0TWVzc2FnZSk7Ci0gICAgZWxzZQotICAgICAgbWVzc2FnZSArPSAiICIgKyBtZXNzYWdlRGF0YSArICIuIjsKLQotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvaW1wbC9SZWRpcmVjdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9pbXBsL1JlZGlyZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGRhYTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9pbXBsL1JlZGlyZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuUmVkaXJlY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi0vKioKLSAqICBUaGUgaW1wbGVtZW50YXRpb24gZm9yIG1vbml0b3IgY29uZmlnIFJlZGlyZWN0IGVsZW1lbnQuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFJlZGlyZWN0SW1wbCBpbXBsZW1lbnRzIFJlZGlyZWN0Ci17Ci0gIC8qKgotICAgKiBDb21tZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIENvbW1lbnQgY29tbWVudDsKLQotICAvKioKLSAgICogTGlzdGVuIHBvcnQuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGxpc3RlblBvcnQ7Ci0KLSAgLyoqCi0gICAqIEhvc3QuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGhvc3Q7Ci0KLSAgLyoqCi0gICAqIFRvIHByb3RvY29sLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB0b1Byb3RvY29sOwotCi0gIC8qKgotICAgKiBUbyBwb3J0LgotICAgKi8KLSAgcHJvdGVjdGVkIGludCB0b1BvcnQ7Ci0KLSAgLyoqCi0gICAqIFRvIGhvc3QuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHRvSG9zdDsKLQotICAvKioKLSAgICogTWF4aW11bSBjb25uZWN0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgbWF4Q29ubmVjdGlvbnM7Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGltZW91dCBzZWNvbmRzLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCByZWFkVGltZW91dFNlY29uZHM7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdCNnZXRDb21tZW50KCkKLSAgICovCi0gIHB1YmxpYyBDb21tZW50IGdldENvbW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuY29tbWVudDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuUmVkaXJlY3Qjc2V0Q29tbWVudChjb21tZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tbWVudChDb21tZW50IGNvbW1lbnQpCi0gIHsKLSAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdCNnZXRMaXN0ZW5Qb3J0KCkKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGlzdGVuUG9ydCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5saXN0ZW5Qb3J0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdCNzZXRMaXN0ZW5Qb3J0KGludCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExpc3RlblBvcnQoaW50IGxpc3RlblBvcnQpCi0gIHsKLSAgICB0aGlzLmxpc3RlblBvcnQgPSBsaXN0ZW5Qb3J0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdCNnZXRIb3N0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5ob3N0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdCNzZXRIb3N0KFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpCi0gIHsKLSAgICB0aGlzLmhvc3QgPSBob3N0OwotCi0gICAgLy8gUGFyc2UgbG9jYXRpb24gdG8gZ2V0IHByb3RvY29sLCBob3N0IGFuZCBwb3J0Ci0gICAgVVJMIHVybDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKGhvc3QpOwotICAgICAgdGhpcy50b1Byb3RvY29sID0gdXJsLmdldFByb3RvY29sKCk7Ci0gICAgICB0aGlzLnRvSG9zdCA9IHVybC5nZXRIb3N0KCk7Ci0gICAgICB0aGlzLnRvUG9ydCA9IHVybC5nZXRQb3J0KCk7Ci0gICAgICBpZiAodGhpcy50b1BvcnQgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGlmICh0aGlzLnRvUHJvdG9jb2wuZXF1YWxzSWdub3JlQ2FzZSgiaHR0cCIpKQotICAgICAgICAgIHRoaXMudG9Qb3J0ID0gODA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0aGlzLnRvUG9ydCA9IDgwOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJUaGUgIgotICAgICAgICAgICsgV1NJQ29uc3RhbnRzLkVMRU1fU0NIRU1FX0FORF9IT1NUUE9SVAotICAgICAgICAgICsgIiBvcHRpb24gY29udGFpbnMgYW4gaW52YWxpZCB2YWx1ZTogIgotICAgICAgICAgICsgaG9zdCk7Ci0gICAgfQotCi0gICAgaWYgKCh1cmwuZ2V0UGF0aCgpICE9IG51bGwgJiYgIXVybC5nZXRQYXRoKCkuZXF1YWxzKCIiKSkKLSAgICAgIHx8ICh1cmwuZ2V0UXVlcnkoKSAhPSBudWxsICYmICF1cmwuZ2V0UXVlcnkoKS5lcXVhbHMoIiIpKSkKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJUaGUgIgotICAgICAgICAgICsgV1NJQ29uc3RhbnRzLkVMRU1fU0NIRU1FX0FORF9IT1NUUE9SVAotICAgICAgICAgICsgIiBvcHRpb24gbXVzdCBjb250YWluIG9ubHkgYSBzY2hlbWUsIGhvc3QgYW5kIHBvcnQ6ICIKLSAgICAgICAgICArIGhvc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0byBwb3J0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kubW9uaXRvci5jb25maWcuUmVkaXJlY3QjZ2V0VG9Qb3J0KCkKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VG9Qb3J0KCkKLSAgewotICAgIHJldHVybiB0aGlzLnRvUG9ydDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdG8gaG9zdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLm1vbml0b3IuY29uZmlnLlJlZGlyZWN0I2dldFRvSG9zdCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRvSG9zdCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy50b0hvc3Q7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRvIHByb3RvY29sLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kubW9uaXRvci5jb25maWcuUmVkaXJlY3QjZ2V0VG9Qcm90b2NvbCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRvUHJvdG9jb2woKQotICB7Ci0gICAgcmV0dXJuIHRoaXMudG9Qcm90b2NvbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuUmVkaXJlY3QjZ2V0TWF4Q29ubmVjdGlvbnMoKQotICAgKi8KLSAgcHVibGljIGludCBnZXRNYXhDb25uZWN0aW9ucygpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5tYXhDb25uZWN0aW9uczsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuUmVkaXJlY3Qjc2V0TWF4Q29ubmVjdGlvbnMoaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWF4Q29ubmVjdGlvbnMoaW50IG1heENvbm5lY3Rpb25zKQotICB7Ci0gICAgdGhpcy5tYXhDb25uZWN0aW9ucyA9IG1heENvbm5lY3Rpb25zOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdCNnZXRSZWFkVGltZW91dFNlY29uZHMoKQotICAgKi8KLSAgcHVibGljIGludCBnZXRSZWFkVGltZW91dFNlY29uZHMoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVhZFRpbWVvdXRTZWNvbmRzOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdCNzZXRSZWFkVGltZW91dFNlY29uZHMoaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVhZFRpbWVvdXRTZWNvbmRzKGludCByZWFkVGltZW91dFNlY29uZHMpCi0gIHsKLSAgICB0aGlzLnJlYWRUaW1lb3V0U2Vjb25kcyA9IHJlYWRUaW1lb3V0U2Vjb25kczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgcHcucHJpbnRsbigiICAgIGNvbW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5jb21tZW50KTsKLSAgICBwdy5wcmludGxuKCIgICAgbGlzdGVuUG9ydCAuLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLmxpc3RlblBvcnQpOwotICAgIHB3LnByaW50bG4oIiAgICBob3N0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gIiArIGN1dEhvc3QodGhpcy5ob3N0KSk7Ci0gICAgcHcucHJpbnRsbigiICAgIG1heENvbm5lY3Rpb25zIC4uLi4uLi4uLi4uLiAiICsgdGhpcy5tYXhDb25uZWN0aW9ucyk7Ci0gICAgcHcucHJpbnRsbigiICAgIHJlYWRUaW1lb3V0U2Vjb25kcyAuLi4uLi4uLiAiICsgdGhpcy5yZWFkVGltZW91dFNlY29uZHMpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogRm9ybWF0cyBob3N0IG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIChwYXRoIGlzIG9tbWl0ZWQpLgotICAgKiBAcGFyYW0gaG9zdAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBjdXRIb3N0KFN0cmluZyBob3N0KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMIHVybCA9IG5ldyBVUkwoaG9zdCk7Ci0gICAgICBTdHJpbmcgcG9ydCA9IHVybC5nZXRQb3J0KCkgPiAtMSA/IFN0cmluZy52YWx1ZU9mKHVybC5nZXRQb3J0KCkpIDogIjgwIjsKLSAgICAgIC8vIFJFTU9WRUQ6IFRoaXMgY29kZSBvbmx5IHdvcmtzIG9uIDEuNAotICAgICAgLy8gU3RyaW5nLnZhbHVlT2YodXJsLmdldERlZmF1bHRQb3J0KCkpOwotICAgICAgcmV0dXJuIHVybC5nZXRQcm90b2NvbCgpICsgIjovLyIgKyB1cmwuZ2V0SG9zdCgpICsgIjoiICsgcG9ydDsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBob3N0OwotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50I3RvWE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIFN0YXJ0IGVsZW1lbnQKLSAgICBwdy5wcmludGxuKCIgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fUkVESVJFQ1QgKyAiPiIpOwotCi0gICAgLy8gQ29tbWVudAotICAgIGlmICh0aGlzLmNvbW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwdy5wcmludGxuKHRoaXMuY29tbWVudC50b1hNTFN0cmluZyhuc05hbWUpKTsKLSAgICB9Ci0KLSAgICAvLyBsaXN0ZW5Qb3J0Ci0gICAgcHcucHJpbnQoIiAgICAgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0xJU1RFTl9QT1JUICsgIj4iKTsKLSAgICBwdy5wcmludChnZXRMaXN0ZW5Qb3J0KCkpOwotICAgIHB3LnByaW50bG4oIjwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0xJU1RFTl9QT1JUICsgIj4iKTsKLQotICAgIC8vIHNjaGVtZUFuZEhvc3RQb3J0Ci0gICAgcHcucHJpbnQoCi0gICAgICAiICAgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fU0NIRU1FX0FORF9IT1NUUE9SVCArICI+Iik7Ci0gICAgcHcucHJpbnQoWE1MVXRpbHMueG1sRXNjYXBlZFN0cmluZyhnZXRIb3N0KCkpKTsKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9TQ0hFTUVfQU5EX0hPU1RQT1JUICsgIj4iKTsKLQotICAgIC8vIG1heENvbm5lY3Rpb25zCi0gICAgcHcucHJpbnQoIiAgICAgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX01BWF9DT05ORUNUSU9OUyArICI+Iik7Ci0gICAgcHcucHJpbnQoZ2V0TWF4Q29ubmVjdGlvbnMoKSk7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTUFYX0NPTk5FQ1RJT05TICsgIj4iKTsKLQotICAgIC8vIHJlYWRUaW1lb3V0U2Vjb25kcwotICAgIHB3LnByaW50KAotICAgICAgIiAgICAgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1JFQURfVElNRU9VVF9TRUNPTkRTICsgIj4iKTsKLSAgICBwdy5wcmludChnZXRSZWFkVGltZW91dFNlY29uZHMoKSk7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fUkVBRF9USU1FT1VUX1NFQ09ORFMgKyAiPiIpOwotCi0gICAgLy8gRW5kIEVsZW1lbnQKLSAgICBwdy5wcmludGxuKCIgICAgICAgIDwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1JFRElSRUNUICsgIj4iKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL0VudHJ5VHlwZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL0VudHJ5VHlwZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4ZDEzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9FbnRyeVR5cGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBtYWludGFpbiBhIHByb2ZpbGUgRW50cnlUeXBlTGlzdC4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBFbnRyeVR5cGVMaXN0IGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBMb2cgaW5wdXQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfSU5QVVRfTk9ORSA9ICJub25lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0lOUFVUX1JFUVVFU1QgPSAicmVxdWVzdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19JTlBVVF9SRVNQT05TRSA9ICJyZXNwb25zZSI7Ci0KLSAgLyoqCi0gICAqIFdTREwgaW5wdXQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0lOUFVUX05PTkUgPSAibm9uZSI7Ci0KLSAgLyoqCi0gICAqIFVEREkgaW5wdXQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVRERJX0lOUFVUX05PTkUgPSAibm9uZSI7Ci0KLSAgLyoqCi0gICAqIEdldCBsb2cgaW5wdXQuCi0gICAqIEByZXR1cm4gbG9nIGlucHV0LgotICAgKiBAc2VlICNzZXRMb2dJbnB1dAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2dJbnB1dCgpOwotCi0gIC8qKgotICAgKiBTZXQgbG9nIGlucHV0LgotICAgKiBAcGFyYW0gbG9nSW5wdXQgbG9nIGlucHV0LgotICAgKiBAc2VlICNnZXRMb2dJbnB1dAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9nSW5wdXQoU3RyaW5nIGxvZ0lucHV0KTsKLQotICAvKioKLSAgICogR2V0IFdTREwgaW5wdXQuCi0gICAqIEByZXR1cm4gV1NETCBpbnB1dC4KLSAgICogQHNlZSAjc2V0V1NETElucHV0Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdTRExJbnB1dCgpOwotCi0gIC8qKgotICAgKiBTZXQgV1NETCBpbnB1dC4KLSAgICogQHBhcmFtIHdzZGxJbnB1dCBXU0RMIGlucHV0LgotICAgKiBAc2VlICNnZXRXU0RMSW5wdXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdTRExJbnB1dChTdHJpbmcgd3NkbElucHV0KTsKLQotICAvKioKLSAgICogR2V0IFVEREkgaW5wdXQuCi0gICAqIEByZXR1cm4gVURESSBpbnB1dC4KLSAgICogQHNlZSAjc2V0VURESUlucHV0Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVERElJbnB1dCgpOwotCi0gIC8qKgotICAgKiBTZXQgVURESSBpbnB1dC4KLSAgICogQHBhcmFtIHVkZGlJbnB1dCBVRERJIGlucHV0LgotICAgKiBAc2VlICNnZXRVRERJSW5wdXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVERElJbnB1dChTdHJpbmcgdWRkaUlucHV0KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvUHJvZmlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzMyNmMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL1Byb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIG1haW50YWluIFByb2ZpbGUgaW5mb3JtYXRpb24uCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvZmlsZSBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9Qcm9maWxlQXJ0aWZhY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL1Byb2ZpbGVBcnRpZmFjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGEwYjc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL1Byb2ZpbGVBcnRpZmFjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuQXJ0aWZhY3RUeXBlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEFuIGFydGlmYWN0IGNvbnRhaW5zIGEgc2V0IG9mIHJlbGF0ZWQgdGVzdCBhc3NlcnRpb25zLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvZmlsZUFydGlmYWN0IGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9BUlRJRkFDVDsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfQVNTRVJUSU9OUywgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogR2V0IHR5cGUuCi0gICAqIEByZXR1cm4gYXJ0aWZhY3QgdHlwZS4KLSAgICogQHNlZSAjc2V0VHlwZQotICAgKi8KLSAgcHVibGljIEFydGlmYWN0VHlwZSBnZXRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0eXBlLgotICAgKiBAcGFyYW0gdHlwZSBhbiBhcnRpZmFjdCB0eXBlLgotICAgKiBAc2VlICNnZXRUeXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlKEFydGlmYWN0VHlwZSB0eXBlKTsKLQotICAvKioKLSAgICogR2V0IHNwZWNpZmljYXRpb24gbGlzdC4KLSAgICogQHJldHVybiBzcGVjaWZpY2F0aW9uIGxpc3QuCi0gICAqIEBzZWUgI3NldFNwZWNpZmljYXRpb25MaXN0Ci0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFNwZWNpZmljYXRpb25MaXN0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBzcGVjaWZpY2F0aW9uIGxpc3QuCi0gICAqIEBwYXJhbSBzcGVjaWZpY2F0aW9uTGlzdCBzcGVjaWZpY2F0aW9uIGxpc3QuCi0gICAqIEBzZWUgI2dldFNwZWNpZmljYXRpb25MaXN0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTcGVjaWZpY2F0aW9uTGlzdChWZWN0b3Igc3BlY2lmaWNhdGlvbkxpc3QpOwotCi0gIC8qKgotICAgKiBHZXQgdGVzdCBhc3NlcnRpb24gbGlzdC4KLSAgICogQHJldHVybiB0ZXN0IGFzc2VydGlvbiBsaXN0LgotICAgKi8KLSAgcHVibGljIExpbmtlZExpc3QgZ2V0VGVzdEFzc2VydGlvbkxpc3QoKTsKLQotICAvKioKLSAgICogR2V0IHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAcGFyYW0gaWQgdGVzdCBhc3NlcnRpb24gaWQuCi0gICAqIEByZXR1cm4gdGVzdCBhc3NlcnRpb24uCi0gICAqLwotICBwdWJsaWMgVGVzdEFzc2VydGlvbiBnZXRUZXN0QXNzZXJ0aW9uKFN0cmluZyBpZCk7Ci0KLSAgLyoqCi0gICAqIEFkZCB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHBhcmFtIHRlc3RBc3NlcnRpb24gdGVzdCBhc3NlcnRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRUZXN0QXNzZXJ0aW9uKFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9Qcm9maWxlQXNzZXJ0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvUHJvZmlsZUFzc2VydGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU2MjMxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9Qcm9maWxlQXNzZXJ0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuV1NJRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBtYWludGFpbnMgcHJvZmlsZSBhc3NlcnRpb25zLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2ZpbGVBc3NlcnRpb25zIGV4dGVuZHMgV1NJRG9jdW1lbnQKLXsKLSAgLyoqCi0gICAqIEVsZW1lbnQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTkFNRSA9IFdTSUNvbnN0YW50cy5FTEVNX1BST0ZJTEVfQVNTRVJUSU9OUzsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfQVNTRVJUSU9OUywgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogR2V0IGxpc3Qgb2YgcHJvZmlsZXMuCi0gICAqIEByZXR1cm4gbGlzdCBvZiBwcm9maWxlcy4KLSAgICogQHNlZSAjc2V0UHJvZmlsZUxpc3QKLSAgICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0UHJvZmlsZUxpc3QoKTsKLQotICAvKioKLSAgICogU2V0IGxpc3Qgb2YgcHJvZmlsZXMuCi0gICAqIEBwYXJhbSBwcm9maWxlTGlzdCBsaXN0IG9mIHByb2ZpbGVzLgotICAgKiBAc2VlICNnZXRQcm9maWxlTGlzdAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvZmlsZUxpc3QoVmVjdG9yIHByb2ZpbGVMaXN0KTsKLQotICAvKioKLSAgICogQWRkIHByb2ZpbGUuCi0gICAqIEBwYXJhbSBwcm9maWxlIHByb2ZpbGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQcm9maWxlKFByb2ZpbGUgcHJvZmlsZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBsaXN0IG9mIGFydGlmYWN0cy4KLSAgICogQHJldHVybiBsaXN0IG9mIGFydGlmYWN0cy4KLSAgICogQHNlZSAjc2V0QXJ0aWZhY3RMaXN0Ci0gICAqLwotICBwdWJsaWMgVHJlZU1hcCBnZXRBcnRpZmFjdExpc3QoKTsKLQotICAvKioKLSAgICogR2V0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gdHlwZSBhbiBhcnRpZmFjdCB0eXBlLgotICAgKiBAcmV0dXJuIGEgcHJvZmlsZSBhcnRpZmFjdCBiYXNlZCBvbiB0aGUgZ2l2ZW4gdHlwZS4KLSAgICovCi0gIHB1YmxpYyBQcm9maWxlQXJ0aWZhY3QgZ2V0QXJ0aWZhY3QoU3RyaW5nIHR5cGUpOwotCi0gIC8qKgotICAgKiBTZXQgbGlzdCBvZiBhcnRpZmFjdHMuCi0gICAqIEBwYXJhbSBhcnRpZmFjdExpc3QgYSBsaXN0IHBmIHByb2ZpbGUgYXJ0aWZpYWN0cy4KLSAgICogQHNlZSAjZ2V0QXJ0aWZhY3RMaXN0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdExpc3QoVHJlZU1hcCBhcnRpZmFjdExpc3QpOwotCi0gIC8qKgotICAgKiBBZGQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBhcnRpZmFjdCBwcm9maWxlIGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQXJ0aWZhY3QoUHJvZmlsZUFydGlmYWN0IGFydGlmYWN0KTsKLQotICAvKioKLSAgICogR2V0IHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAcGFyYW0gaWQgdGVzdCBhc3NlcnRpb24gaWQuCi0gICAqIEByZXR1cm4gdGVzdCBhc3NlcnRpb24uCi0gICAqLwotICBwdWJsaWMgVGVzdEFzc2VydGlvbiBnZXRUZXN0QXNzZXJ0aW9uKFN0cmluZyBpZCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhcnRpZmFjdC4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHByb2ZpbGUgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgUHJvZmlsZUFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb2ZpbGUgdGVzdCBhc3NlcnRpb24gZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGRvY3VtZW50LiAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VEFETmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHByb2ZpbGUgdGVzdCBhc3NlcnRpb24gZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBkb2N1bWVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VEFETmFtZShTdHJpbmcgZG9jdW1lbnROYW1lKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvZmlsZSB0ZXN0IGFzc2VydGlvbiBkb2N1bWVudC4KLSAgICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRBRFZlcnNpb24oKTsKLQotICAvKioKLSAgICogU2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9maWxlIHRlc3QgYXNzZXJ0aW9uIGRvY3VtZW50LgotICAgKiBAcGFyYW0gZG9jdW1lbnRWZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRBRFZlcnNpb24oU3RyaW5nIGRvY3VtZW50VmVyc2lvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9Qcm9maWxlQXNzZXJ0aW9uc1JlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvUHJvZmlsZUFzc2VydGlvbnNSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmZTg3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9Qcm9maWxlQXNzZXJ0aW9uc1JlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGludGVyZmFjZSB1c2VkIHRvIHJlYWQgYSBwcm9maWxlIGFzc2VydGlvbnMgZG9jdW1lbnRzLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvZmlsZUFzc2VydGlvbnNSZWFkZXIgZXh0ZW5kcyBEb2N1bWVudFJlYWRlcgotewotICAvKioKLSAgICogUmVhZCB0aGUgcHJvZmlsZSBhc3NlcnRpb25zIGZpbGUuCi0gICAqIEBwYXJhbSBhc3NlcnRpb25zVVJJIGhlIHByb2ZpbGUgYXNzZXJ0aW9ucyBmaWxlIGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBQcm9maWxlQXNzZXJ0aW9ucyBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXIgd2hpbGUgcmVhZGluZyB0aGUgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBQcm9maWxlQXNzZXJ0aW9ucyByZWFkUHJvZmlsZUFzc2VydGlvbnMoU3RyaW5nIGFzc2VydGlvbnNVUkkpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmVhZCB0aGUgcHJvZmlsZSBhc3NlcnRpb25zICBmaWxlLgotICAgKiBAcGFyYW0gcmVhZGVyIGEgUmVhZGVyIG9iamVjdC4KLSAgICogQHJldHVybiB0aGUgUHJvZmlsZUFzc2VydGlvbnMgb2JqZWN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiAgaWYgcHJvYmxlbSBvY2N1ciB3aGlsZSByZWFkaW5nIHRoZSBmaWxlLgotICAgKi8KLSAgcHVibGljIFByb2ZpbGVBc3NlcnRpb25zIHJlYWRQcm9maWxlQXNzZXJ0aW9ucyhSZWFkZXIgcmVhZGVyKQotICAgIHRocm93cyBXU0lFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9UZXN0QXNzZXJ0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9UZXN0QXNzZXJ0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMWI4ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvVGVzdEFzc2VydGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQSB0ZXN0IGFzc2VydGlvbiBpcyBvbmUgYXNzZXJ0aW9uIGluIGEgcHJvZmlsZSBkZWZpbml0aW9uLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBUZXN0QXNzZXJ0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSU5GT1JNQVRJT05BTCA9ICJpbmZvcm1hdGlvbmFsIjsKLSAgCi0gIC8qKgotICAgKiBHZXQgdGVzdCBhc3NlcnRpb24gaWQuCi0gICAqIEByZXR1cm4gdGVzdCBhc3NlcnRpb24gaWQuCi0gICAqIEBzZWUgI3NldElkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0ZXN0IGFzc2VydGlvbiBpZC4KLSAgICogQHBhcmFtIGlkIHRlc3QgYXNzZXJ0aW9uIGlkLgotICAgKiBAc2VlICNnZXRJZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKLQotICAvKioKLSAgICogR2V0IHRlc3QgYXNzZXJ0aW9uIHR5cGUuCi0gICAqIEByZXR1cm4gdGVzdCBhc3NlcnRpb24gdHlwZS4KLSAgICogQHNlZSAjc2V0VHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0ZXN0IGFzc2VydGlvbiB0eXBlLgotICAgKiBAcGFyYW0gIHR5cGUgdGVzdCBhc3NlcnRpb24gdHlwZS4KLSAgICogQHNlZSAjZ2V0VHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSk7Ci0KLSAgLyoqCi0gICAqIEdldCB0ZXN0IGFzc2VydGlvbiBwcmltYXJ5IGVudHJ5IHR5cGUgbmFtZS4KLSAgICogQHJldHVybiB0ZXN0IGFzc2VydGlvbiBwcmltYXJ5IGVudHJ5IHR5cGUgbmFtZS4KLSAgICogQHNlZSAjc2V0RW50cnlUeXBlTmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbnRyeVR5cGVOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0ZXN0IGFzc2VydGlvbiBwcmltYXJ5IGVudHJ5IHR5cGUgbmFtZS4KLSAgICogQHBhcmFtIGVudHJ5VHlwZU5hbWUgdGVzdCBhc3NlcnRpb24gcHJpbWFyeSBlbnRyeSB0eXBlIG5hbWUuCi0gICAqIEBzZWUgI2dldEVudHJ5VHlwZU5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZU5hbWUoU3RyaW5nIGVudHJ5VHlwZU5hbWUpOwotCi0gIC8qKgotICAgKiBHZXQgZW5hYmxlZCBpbmRpY2F0b3IuCi0gICAqIEByZXR1cm4gZW5hYmxlZCBpbmRpY2F0b3IuCi0gICAqIEBzZWUgI3NldEVuYWJsZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpOwotCi0gIC8qKgotICAgKiBTZXQgIGVuYWJsZWQgaW5kaWNhdG9yLgotICAgKiBAcGFyYW0gZW5hYmxlZCBlbmFibGVkIGluZGljYXRvci4KLSAgICogQHNlZSAjaXNFbmFibGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7Ci0KLSAgLyoqCi0gICAqIEdldCBjb250ZXh0LgotICAgKiBAcmV0dXJuIGNvbnRleHQuCi0gICAqIEBzZWUgI3NldENvbnRleHQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dCgpOwotCi0gIC8qKgotICAgKiBTZXQgY29udGV4dC4KLSAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dC4KLSAgICogQHNlZSAjZ2V0Q29udGV4dAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29udGV4dChTdHJpbmcgY29udGV4dCk7Ci0KLSAgLyoqCi0gICAqIEdldCBhc3NlcnRpb24gZGVzY3JpcHRpb24uCi0gICAqIEByZXR1cm4gYXNzZXJ0aW9uIGRlc2NyaXB0aW9uLgotICAgKiBAc2VlICNzZXRBc3NlcnRpb25EZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBc3NlcnRpb25EZXNjcmlwdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgYXNzZXJ0aW9uIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gYXNzZXJ0aW9uRGVzY3JpcHRpb24gYXNzZXJ0aW9uIGRlc2NyaXB0aW9uLgotICAgKiBAc2VlICNnZXRBc3NlcnRpb25EZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXNzZXJ0aW9uRGVzY3JpcHRpb24oU3RyaW5nIGFzc2VydGlvbkRlc2NyaXB0aW9uKTsKLQotICAvKioKLSAgICogR2V0IGZhaWx1cmUgbWVzc2FnZS4KLSAgICogQHJldHVybiBmYWlsdXJlIG1lc3NhZ2UuCi0gICAqIEBzZWUgI3NldEZhaWx1cmVNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZhaWx1cmVNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBmYWlsdXJlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBmYWlsdXJlTWVzc2FnZSBmYWlsdXJlIG1lc3NhZ2UuCi0gICAqIEBzZWUgI2dldEZhaWx1cmVNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlTWVzc2FnZShTdHJpbmcgZmFpbHVyZU1lc3NhZ2UpOwotCi0gIC8qKgotICAgKiBHZXQgZmFpbHVyZSBkZXRhaWwgZGVzY3JpcHRpb24uCi0gICAqIEByZXR1cm4gZmFpbHVyZSBkZXRhaWwgZGVzY3JpcHRpb24uCi0gICAqIEBzZWUgI3NldEZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24oKTsKLQotICAvKioKLSAgICogU2V0IGZhaWx1cmUgZGV0YWlsIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gZmFpbHVyZURldGFpbERlc2NyaXB0aW9uIGZhaWx1cmUgZGV0YWlsIGRlc2NyaXB0aW9uLgotICAgKiBAc2VlICNnZXRGYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbihTdHJpbmcgZmFpbHVyZURldGFpbERlc2NyaXB0aW9uKTsKLQotICAvKioKLSAgICogR2V0IGRldGFpbCBkZXNjcmlwdGlvbi4KLSAgICogQHJldHVybiBkZXRhaWwgZGVzY3JpcHRpb24uCi0gICAqIEBzZWUgI3NldERldGFpbERlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERldGFpbERlc2NyaXB0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBkZXRhaWwgZGVzY3JpcHRpb24uCi0gICAqIEBwYXJhbSBkZXRhaWxEZXNjcmlwdGlvbiBkZXRhaWwgZGVzY3JpcHRpb24uCi0gICAqIEBzZWUgI2dldERldGFpbERlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXRhaWxEZXNjcmlwdGlvbihTdHJpbmcgZGV0YWlsRGVzY3JpcHRpb24pOwotCi0gIC8qKgotICAgKiBHZXQgYWRkaXRpb25hbCBlbnRyeSB0eXBlIGxpc3QuCi0gICAqIEByZXR1cm4gYWRkaXRpb25hbCBlbnRyeSB0eXBlIGxpc3QuCi0gICAqIEBzZWUgI3NldEFkZGl0aW9uYWxFbnRyeVR5cGVMaXN0Ci0gICAqLwotICBwdWJsaWMgRW50cnlUeXBlTGlzdCBnZXRBZGRpdGlvbmFsRW50cnlUeXBlTGlzdCgpOwotCi0gIC8qKgotICAgKiBTZXQgYWRkaXRpb25hbCBlbnRyeSB0eXBlIGxpc3QuCi0gICAqIEBwYXJhbSBlbnRyeVR5cGVMaXN0IGFkZGl0aW9uYWwgZW50cnkgdHlwZSBsaXN0LgotICAgKiBAc2VlICNnZXRBZGRpdGlvbmFsRW50cnlUeXBlTGlzdAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbEVudHJ5VHlwZUxpc3QoRW50cnlUeXBlTGlzdCBlbnRyeVR5cGVMaXN0KTsKLQotICAvKioKLSAgICogR2V0IGxpc3Qgb2YgcHJlcmVxIGlkcy4KLSAgICogQHJldHVybiBsaXN0IG9mIHByZXJlcSBpZHMuCi0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFByZXJlcUlkTGlzdCgpOwotCi0gIC8qKgotICAgKiBBZGQgcHJlcmVxIHRlc3QgYXNzZXJ0aW9uIGlkLgotICAgKiBAcGFyYW0gIHByZXJlcUlkIHByZXJlcSB0ZXN0IGFzc2VydGlvbiBpZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFByZXJlcUlkKFN0cmluZyBwcmVyZXFJZCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9pbXBsL0VudHJ5VHlwZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9pbXBsL0VudHJ5VHlwZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkODFmMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9FbnRyeVR5cGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLkVudHJ5VHlwZUxpc3Q7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIG1haW50YWluIGEgcHJvZmlsZSBFbnRyeVR5cGVMaXN0LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgRW50cnlUeXBlTGlzdEltcGwgaW1wbGVtZW50cyBFbnRyeVR5cGVMaXN0Ci17Ci0gIC8qKgotICAgKiBMb2cgaW5wdXQuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGxvZ0lucHV0ID0gbnVsbDsKLQotICAvKioKLSAgICogV1NETCBpbnB1dC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbElucHV0ID0gbnVsbDsKLQotICAvKioKLSAgICogVURESSBpbnB1dC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdWRkaUlucHV0ID0gbnVsbDsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuRW50cnlUeXBlTGlzdCNnZXRMb2dJbnB1dCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvZ0lucHV0KCkKLSAgewotICAgIHJldHVybiB0aGlzLmxvZ0lucHV0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLkVudHJ5VHlwZUxpc3Qjc2V0TG9nSW5wdXQoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9nSW5wdXQoU3RyaW5nIGxvZ0lucHV0KQotICB7Ci0gICAgdGhpcy5sb2dJbnB1dCA9IGxvZ0lucHV0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLkVudHJ5VHlwZUxpc3QjZ2V0V1NETElucHV0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETElucHV0KCkKLSAgewotICAgIHJldHVybiB0aGlzLndzZGxJbnB1dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5FbnRyeVR5cGVMaXN0I3NldFdTRExJbnB1dChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXU0RMSW5wdXQoU3RyaW5nIHdzZGxJbnB1dCkKLSAgewotICAgIHRoaXMud3NkbElucHV0ID0gd3NkbElucHV0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLkVudHJ5VHlwZUxpc3QjZ2V0VURESUlucHV0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VURESUlucHV0KCkKLSAgewotICAgIHJldHVybiB0aGlzLnVkZGlJbnB1dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5FbnRyeVR5cGVMaXN0I3NldFVERElJbnB1dChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVRERJSW5wdXQoU3RyaW5nIHVkZGlJbnB1dCkKLSAgewotICAgIHRoaXMudWRkaUlucHV0ID0gdWRkaUlucHV0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL2ltcGwvUHJvZmlsZUFydGlmYWN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9Qcm9maWxlQXJ0aWZhY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYzNjNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9Qcm9maWxlQXJ0aWZhY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkFydGlmYWN0VHlwZTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBBbiBhcnRpZmFjdCBjb250YWlucyBhIHNldCBvZiByZWxhdGVkIHRlc3QgYXNzZXJ0aW9ucy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVBcnRpZmFjdEltcGwgaW1wbGVtZW50cyBQcm9maWxlQXJ0aWZhY3QKLXsKLSAgLyoqCi0gICAqIEFydGlmYWN0IHR5cGUuCi0gICAqLwotICBwcm90ZWN0ZWQgQXJ0aWZhY3RUeXBlIHR5cGU7Ci0KLSAgLyoqCi0gICAqIFRlc3QgYXNzZXJ0aW9uIG1hcC4KLSAgICovCi0gIHByb3RlY3RlZCBUcmVlTWFwIHRlc3RBc3NlcnRpb25NYXAgPSBuZXcgVHJlZU1hcCgpOwotCi0gIC8qKgotICAgKiBUZXN0IGFzc2VydGlvbiBsaXN0LgotICAgKi8KLSAgcHJvdGVjdGVkIExpbmtlZExpc3QgdGVzdEFzc2VydGlvbkxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5SZXBvcnRBcnRpZmFjdCNnZXRUeXBlKCkKLSAgICovCi0gIHB1YmxpYyBBcnRpZmFjdFR5cGUgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy50eXBlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlJlcG9ydEFydGlmYWN0I3NldFR5cGUoQXJ0aWZhY3RUeXBlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShBcnRpZmFjdFR5cGUgdHlwZSkKLSAgewotICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuUmVwb3J0QXJ0aWZhY3QjZ2V0U3BlY2lmaWNhdGlvbkxpc3QoKQotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRTcGVjaWZpY2F0aW9uTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5SZXBvcnRBcnRpZmFjdCNzZXRTcGVjaWZpY2F0aW9uTGlzdChWZWN0b3IpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTcGVjaWZpY2F0aW9uTGlzdChWZWN0b3Igc3BlY2lmaWNhdGlvbkxpc3QpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5SZXBvcnRBcnRpZmFjdCNnZXRUZXN0QXNzZXJ0aW9uTGlzdCgpCi0gICAqLwotICBwdWJsaWMgTGlua2VkTGlzdCBnZXRUZXN0QXNzZXJ0aW9uTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy50ZXN0QXNzZXJ0aW9uTGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5SZXBvcnRBcnRpZmFjdCNnZXRUZXN0QXNzZXJ0aW9uKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBUZXN0QXNzZXJ0aW9uIGdldFRlc3RBc3NlcnRpb24oU3RyaW5nIGlkKQotICB7Ci0gICAgcmV0dXJuIChUZXN0QXNzZXJ0aW9uKSB0aGlzLnRlc3RBc3NlcnRpb25NYXAuZ2V0KGlkKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5SZXBvcnRBcnRpZmFjdCNhZGRUZXN0QXNzZXJ0aW9uKFRlc3RBc3NlcnRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRUZXN0QXNzZXJ0aW9uKFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbikKLSAgewotICAgIC8vIEFERDogTmVlZCB0byBtZXJnZSB0aGUgbGlzdCBhbmQgbWFwCi0gICAgdGhpcy50ZXN0QXNzZXJ0aW9uTWFwLnB1dCh0ZXN0QXNzZXJ0aW9uLmdldElkKCksIHRlc3RBc3NlcnRpb24pOwotICAgIHRoaXMudGVzdEFzc2VydGlvbkxpc3QuYWRkKHRlc3RBc3NlcnRpb24pOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gUmVwb3J0QXJ0aWZhY3QKLSAgICBwdy5wcmludGxuKCIgICAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0KLSAgICBwdy5wcmludGxuKCIgICAgICA8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9Qcm9maWxlQXNzZXJ0aW9uc0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL2ltcGwvUHJvZmlsZUFzc2VydGlvbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZDg0MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9Qcm9maWxlQXNzZXJ0aW9uc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyAuLi4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVBc3NlcnRpb25zSW1wbCBpbXBsZW1lbnRzIFByb2ZpbGVBc3NlcnRpb25zCi17Ci0gIC8qKgotICAgKiBMb2NhdGlvbiBvZiB0aGUgcHJvZmlsZSBkZWZpbml0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkb2N1bWVudFVSSTsKLQotICAvKioKLSAgICogTmFtZSBvZiB0aGUgcHJvZmlsZSB0ZXN0IGFzc2VydGlvbiBkb2N1bWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZG9jdW1lbnROYW1lOwotCi0gIC8qKgotICAgKiBWZXJzaW9uIG9mIHRoZSBwcm9maWxlIHRlc3QgYXNzZXJ0aW9uIGRvY3VtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkb2N1bWVudFZlcnNpb247Ci0KLSAgLy8gQUREOiBBIHByb2ZpbGUgZGVmaW5pdGlvbiBzaG91bGQgYWxzbyBoYXZlIGEgZGVzY3JpcHRpb24uCi0KLSAgLyoqCi0gICAqIExpc3Qgb2YgcHJvZmlsZXMuCi0gICAqLwotICBWZWN0b3IgcHJvZmlsZUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgLyoqCi0gICAqIExpc3Qgb2YgYXJ0aWZhY3RzLgotICAgKi8KLSAgVHJlZU1hcCBhcnRpZmFjdExpc3QgPSBuZXcgVHJlZU1hcCgpOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9ucyNnZXRQcm9maWxlTGlzdCgpCi0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFByb2ZpbGVMaXN0KCkKLSAgewotICAgIHJldHVybiB0aGlzLnByb2ZpbGVMaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zI3NldFByb2ZpbGVMaXN0KFZlY3RvcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2ZpbGVMaXN0KFZlY3RvciBwcm9maWxlTGlzdCkKLSAgewotICAgIHRoaXMucHJvZmlsZUxpc3QgPSBwcm9maWxlTGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9ucyNhZGRQcm9maWxlKFByb2ZpbGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQcm9maWxlKFByb2ZpbGUgcHJvZmlsZSkKLSAgewotICAgIHRoaXMucHJvZmlsZUxpc3QuYWRkKHByb2ZpbGUpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zI2dldEFydGlmYWN0TGlzdCgpCi0gICAqLwotICBwdWJsaWMgVHJlZU1hcCBnZXRBcnRpZmFjdExpc3QoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuYXJ0aWZhY3RMaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zI2dldEFydGlmYWN0KGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgUHJvZmlsZUFydGlmYWN0IGdldEFydGlmYWN0KFN0cmluZyB0eXBlKQotICB7Ci0gICAgcmV0dXJuIChQcm9maWxlQXJ0aWZhY3QpIHRoaXMuYXJ0aWZhY3RMaXN0LmdldCh0eXBlKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9ucyNzZXRBcnRpZmFjdExpc3QoVHJlZU1hcCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFydGlmYWN0TGlzdChUcmVlTWFwIGFydGlmYWN0TGlzdCkKLSAgewotICAgIHRoaXMuYXJ0aWZhY3RMaXN0ID0gYXJ0aWZhY3RMaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zI2FkZEFydGlmYWN0KFJlcG9ydEFydGlmYWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQXJ0aWZhY3QoUHJvZmlsZUFydGlmYWN0IGFydGlmYWN0KQotICB7Ci0gICAgdGhpcy5hcnRpZmFjdExpc3QucHV0KGFydGlmYWN0LmdldFR5cGUoKSwgYXJ0aWZhY3QpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zI2dldFRlc3RBc3NlcnRpb24oU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFRlc3RBc3NlcnRpb24gZ2V0VGVzdEFzc2VydGlvbihTdHJpbmcgaWQpCi0gIHsKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24gPSBudWxsOwotCi0gICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBhcnRpZmFjdHMgYW5kIGZpbmQgdGhlIHRlc3QgYXNzZXJ0aW9uIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXJ0aWZhY3RMaXN0LnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKChpdGVyYXRvci5oYXNOZXh0KCkpICYmICh0ZXN0QXNzZXJ0aW9uID09IG51bGwpKQotICAgIHsKLSAgICAgIHRlc3RBc3NlcnRpb24gPSAoKFByb2ZpbGVBcnRpZmFjdCkgaXRlcmF0b3IubmV4dCgpKS5nZXRUZXN0QXNzZXJ0aW9uKGlkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGVzdEFzc2VydGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9ucyNjcmVhdGVBcnRpZmFjdCgpCi0gICAqLwotICBwdWJsaWMgUHJvZmlsZUFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCkKLSAgewotICAgIHJldHVybiBuZXcgUHJvZmlsZUFydGlmYWN0SW1wbCgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5XU0lEb2N1bWVudCNnZXRMb2NhdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLmRvY3VtZW50VVJJOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5XU0lEb2N1bWVudCNzZXRMb2NhdGlvbihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgZG9jdW1lbnRVUkkpCi0gIHsKLSAgICB0aGlzLmRvY3VtZW50VVJJID0gZG9jdW1lbnRVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9ucyNnZXRUQUROYW1lKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VEFETmFtZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5kb2N1bWVudE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9ucyNzZXRUQUROYW1lKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRBRE5hbWUoU3RyaW5nIGRvY3VtZW50TmFtZSkKLSAgewotICAgIHRoaXMuZG9jdW1lbnROYW1lID0gZG9jdW1lbnROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnMjZ2V0VEFEVmVyc2lvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRBRFZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRWZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnMjc2V0VEFEVmVyc2lvbihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUQURWZXJzaW9uKFN0cmluZyBkb2N1bWVudFZlcnNpb24pCi0gIHsKLSAgICB0aGlzLmRvY3VtZW50VmVyc2lvbiA9IGRvY3VtZW50VmVyc2lvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50I3RvWE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9Qcm9maWxlQXNzZXJ0aW9uc1JlYWRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL2ltcGwvUHJvZmlsZUFzc2VydGlvbnNSZWFkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOTE4MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9Qcm9maWxlQXNzZXJ0aW9uc1JlYWRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLkVudHJ5VHlwZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuQXJ0aWZhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIC4uLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgUHJvZmlsZUFzc2VydGlvbnNSZWFkZXJJbXBsIGltcGxlbWVudHMgUHJvZmlsZUFzc2VydGlvbnNSZWFkZXIKLXsKLSAgLyoqCi0gICAqIFByb2ZpbGUgYXNzZXJ0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCBQcm9maWxlQXNzZXJ0aW9ucyBwcm9maWxlQXNzZXJ0aW9uczsKLQotICAvKioKLSAgICogUmVwb3J0QXJ0aWZhY3QgbGlzdC4KLSAgICovCi0gIHByb3RlY3RlZCBUcmVlTWFwIGFydGlmYWN0TGlzdCA9IG5ldyBUcmVlTWFwKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBuZXcgcmVhZGVyLgotICAgKi8KLSAgcHVibGljIFByb2ZpbGVBc3NlcnRpb25zUmVhZGVySW1wbCgpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9uc1JlYWRlciNyZWFkUHJvZmlsZUFzc2VydGlvbnMoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFByb2ZpbGVBc3NlcnRpb25zIHJlYWRQcm9maWxlQXNzZXJ0aW9ucyhTdHJpbmcgYXNzZXJ0aW9uc1VSSSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcmVhZFByb2ZpbGVBc3NlcnRpb25zKG5ldyBJbnB1dFNvdXJjZShhc3NlcnRpb25zVVJJKSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnNSZWFkZXIjcmVhZFByb2ZpbGVBc3NlcnRpb25zKFJlYWRlcikKLSAgICovCi0gIHB1YmxpYyBQcm9maWxlQXNzZXJ0aW9ucyByZWFkUHJvZmlsZUFzc2VydGlvbnMoUmVhZGVyIHJlYWRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcmVhZFByb2ZpbGVBc3NlcnRpb25zKG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHByb2ZpbGUgYXNzZXJ0aW9ucy4KLSAgICovCi0gIHByaXZhdGUgUHJvZmlsZUFzc2VydGlvbnMgcmVhZFByb2ZpbGVBc3NlcnRpb25zKElucHV0U291cmNlIGlucHV0U291cmNlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSBwcm9maWxlIGFzc2VydGlvbnMKLSAgICBwcm9maWxlQXNzZXJ0aW9ucyA9IG5ldyBQcm9maWxlQXNzZXJ0aW9uc0ltcGwoKTsKLQotICAgIC8vIFByb2ZpbGUgcGFydHMgYXJlIHB1dCBpbnRvIGEgdmVjdG9yCi0gICAgYXJ0aWZhY3RMaXN0ID0gbmV3IFRyZWVNYXAoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIENyZWF0ZSB4bWwgcmVhZGVyCi0gICAgICBYTUxSZWFkZXIgcmVhZGVyID0gWE1MVXRpbHMuZ2V0WE1MUmVhZGVyKCk7Ci0KLSAgICAgIC8vIFNldCBjb250ZW50IGhhbmRsZXIgdG8gaW5uZXIgY2xhc3MKLSAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgUHJvZmlsZUFzc2VydGlvbnNIYW5kbGVyKCkpOwotCi0gICAgICAvLyBQYXJzZSBwcm9maWxlIGRlZmluaXRpb24gZmlsZQotICAgICAgcmVhZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiQ291bGQgbm90IHJlYWQgYW5kIHBhcnNlIHByb2ZpbGUgZGVmaW5pdGlvbi4iLCBlKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIC8vQ2hlY2sgdG8gc2VlIGlmIHRoZSB2ZXJzaW9uIG9mIHRlc3QgYXNzc2VydGlvbiBkb2N1bWVudCBpcyBzdXBwb3J0ZWQKLSAgICAgIGlmICghVXRpbHMuaXNWYWxpZFByb2ZpbGVUQURWZXJzaW9uKHByb2ZpbGVBc3NlcnRpb25zKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgICAiXG5WZXJzaW9uICIKLSAgICAgICAgICAgICsgcHJvZmlsZUFzc2VydGlvbnMuZ2V0VEFEVmVyc2lvbigpCi0gICAgICAgICAgICArICIgb2YgdGhlIFwiIgotICAgICAgICAgICAgKyBwcm9maWxlQXNzZXJ0aW9ucy5nZXRUQUROYW1lKCkKLSAgICAgICAgICAgICsgIlwiXG4iCi0gICAgICAgICAgICArICJkb2N1bWVudCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiIKLSAgICAgICAgICAgICsgIlxuIgotICAgICAgICAgICAgKyAidGhlIHRlc3QgdG9vbHMuIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIGFzc2VydGlvbnMgZnJvbSB0aGUgVEFEIGFyZSByZW9yZGVyZWQgZm9yIHB1cnBvc2VzIG9mIHByb2Nlc3NpbmcuIEFsbAotICAgIC8vIGFzc2VydGlvbnMgb2YgYW4gYXJ0aWZhY3QgYXJlIHJlb3JkZXJlZCBzdWNoIHRoYXQgcHJlcmVxdWlzaXRlcyBvY2N1cgotICAgIC8vIGJlZm9yZSB0aGUgYXNzZXJ0aW9ucyB0aGV5IHByZXJlcS4gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCAgcHJlcmVxdWlzaXRlcyBkbwotICAgIC8vIG5vdCBjcm9zcyBhcnRpZmFjdCB0eXBlcy4KLSAgICAvLwotICAgIEl0ZXJhdG9yIGl0ID0gYXJ0aWZhY3RMaXN0LmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgLy8gZm9yIGVhY2ggYXJ0aWZhY3QgdHlwZSBkbyByZW9yZGVyaW5nIGFzc2VydGlvbiAKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb2ZpbGVBcnRpZmFjdCBhcnQgPSAoUHJvZmlsZUFydGlmYWN0KSBhcnRpZmFjdExpc3QuZ2V0KGl0Lm5leHQoKSk7Ci0gICAgICAvLyByZXN1bHQgbGlzdCBvZiB0aGUgcmVvcmRlcmluZyBhc3NlcnRpb25zIAotICAgICAgTGlua2VkTGlzdCByZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgICAgSXRlcmF0b3IgaXQyID0gYXJ0LmdldFRlc3RBc3NlcnRpb25MaXN0KCkuaXRlcmF0b3IoKTsKLSAgICAgIC8vIHNvcnQgdGhlIGFydGlmYWN0IGFzc2VydGlvbnMgaW50byByZXN1bHQgbGlzdCAKLSAgICAgIHdoaWxlIChpdDIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICAvLyBjYWxsIGZvciBlYWNoIGFzc2VydGlvbiAsIAotICAgICAgICAvLyBpZiB0aGUgYXNzZXJ0aW9uIGhhcyB0aGUgcHJlcmVxLCB0aGUgcHJlcmVxIHdpbGwgYWRkZWQgZmlyc3QgaW50byByZXMgbGlzdAotICAgICAgICBzb3J0VGVzdEFzc2VydGlvbnMoYXJ0LCAoVGVzdEFzc2VydGlvbikgaXQyLm5leHQoKSwgcmVzKTsKLSAgICAgIH0KLSAgICAgIC8vIHJlcGxhY2UgdGhlIG9yaWdpbmFsIGFzc2VydGlvbnMgbGlzdCB0byB0aGUgcHJlcmVxIHJlb3JkZXJpbmcgYXNzZXJ0aW9ucyBsaXN0Ci0gICAgICBhcnQuZ2V0VGVzdEFzc2VydGlvbkxpc3QoKS5jbGVhcigpOwotICAgICAgYXJ0LmdldFRlc3RBc3NlcnRpb25MaXN0KCkuYWRkQWxsKHJlcyk7Ci0gICAgfQotICAgIC8vIFB1dCB0aGUgcHJvZmlsZSBwYXJ0cyBpbnRvIHRoZSBwcm9maWxlIGRlZmluaXRpb24KLSAgICBwcm9maWxlQXNzZXJ0aW9ucy5zZXRBcnRpZmFjdExpc3QoYXJ0aWZhY3RMaXN0KTsKLQotICAgIHJldHVybiBwcm9maWxlQXNzZXJ0aW9uczsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlciNnZXRMb2NhdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlciNzZXRMb2NhdGlvbihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgZG9jdW1lbnRVUkkpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBSZWN1cnNpdmUgd2FsayB0byBvcmRlciBhc3NlcnRpb25zIHNvIHRoYXQgYXNzZXJ0aW9ucyBhcmUgCi0gICAqIHByb2Nlc3NlZCBmb2xsb3dpbmcgdGhlIG9uZXMgdGhhdCBwcmVyZXEgdGhlbS4KLSAgICogSWYgYXNzZXJ0aW9uIGhhcyBwcmVyZXEsIHRoZW4gYWRkIGl0IHRvIHRoZSByZXN1bHQgbGlzdCBmaXJzdC4KLSAgICogIAotICAgKiBAcGFyYW0gYXJ0IHByb2ZpbGUgYXJ0aWZhY3QgZm9yIGNhbGwgQGxpbmsgUHJvZmlsZUFydGlmYWN0I2dldFRlc3RBc3NlcnRpb24oU3RyaW5nKQotICAgKiBAcGFyYW0gYXNydCB0ZXN0IGFzc2VydGlvbgotICAgKiBAcGFyYW0gbGlzdCByZXN1bHQgbGlzdCB0byBzb3J0Ci0gICAqLwotICBwcml2YXRlIHZvaWQgc29ydFRlc3RBc3NlcnRpb25zKFByb2ZpbGVBcnRpZmFjdCBhcnQsIFRlc3RBc3NlcnRpb24gYXNydCwgTGlzdCBsaXN0KQotICB7Ci0gICAgLy8gaWYgYXNzZXJ0aW9uIGlzIG51bGwgb3IgZG9lcyBub3QgZXhpc3QsIHRoZW4gZXhpdAotICAgIGlmKChhc3J0ID09IG51bGwpIHx8IGxpc3QuY29udGFpbnMoYXNydCkpIAotICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIGlmIGl0IGhhcyBub3QgcHJlcmVxLCBhZGQgdGhlIGFzZXJ0aW9uIGFuZCBleGl0Ci0gICAgaWYoYXNydC5nZXRQcmVyZXFJZExpc3QoKS5pc0VtcHR5KCkpIAotICAgIHsKLSAgICAgIGxpc3QuYWRkKGFzcnQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBnZXQgbGlzdCBwcmVyZXEgYXNzZXJ0aW9uIGFuZCByZXF1cnNpdmUgY2FsbCBzb3J0VGVzdEFzc2VydGlvbnMgdGhpcyBlYWNoICAgIAotICAgIEl0ZXJhdG9yIGl0ID0gYXNydC5nZXRQcmVyZXFJZExpc3QoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlKGl0Lmhhc05leHQoKSkgewotICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgc29ydFRlc3RBc3NlcnRpb25zKGFydCwgYXJ0LmdldFRlc3RBc3NlcnRpb24oaWQpLCBsaXN0KTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoYXNydCk7Ci0gIH0KLQotICAvKioKLSAgICogSW5uZXIgY2xhc3M6IFByb2ZpbGVBc3NlcnRpb25zSGFuZGxlcgotICAgKi8KLSAgY2xhc3MgUHJvZmlsZUFzc2VydGlvbnNIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLSAgewotICAgIHByaXZhdGUgUHJvZmlsZUFydGlmYWN0IGFydGlmYWN0ID0gcHJvZmlsZUFzc2VydGlvbnMuY3JlYXRlQXJ0aWZhY3QoKTsKLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBjb250ZXh0ID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBhc3NlcnRpb25EZXNjcmlwdGlvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZmFpbHVyZU1lc3NhZ2UgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZGV0YWlsRGVzY3JpcHRpb24gPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIHRlc3RBc3NlcnRpb25JZCA9IG51bGw7Ci0gICAgLy8gICAgcHJpdmF0ZSBWZWN0b3IgcHJlcmVxSWRMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIHByaXZhdGUgVHJlZU1hcCBhc3NlcnRpb25zID0gbmV3IFRyZWVNYXAoKTsKLSAgICBwcml2YXRlIFN0cmluZyBjdXJyZW50RWxlbWVudCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24gPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGxvZ0lucHV0ID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciB3c2RsSW5wdXQgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIHVkZGlJbnB1dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBFbnRyeVR5cGVMaXN0IGVudHJ5VHlwZUxpc3QgPSBudWxsOwotCi0gICAgLy8gUHJvY2VzcyBzdGFydCBlbGVtZW50IGV2ZW50Ci0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICBTdHJpbmcgcU5hbWUsCi0gICAgICBBdHRyaWJ1dGVzIGF0dHMpCi0gICAgewotICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsCi0gICAgICAgICYmIChuYW1lc3BhY2VVUkkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FTU0VSVElPTlNfMjAwMykKLSAgICAgICAgfHwgIG5hbWVzcGFjZVVSSS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfQVNTRVJUSU9OUykpKQotICAgICAgewotICAgICAgICAvLyBTYXZlIGVsZW1lbnQgbmFtZQotICAgICAgICBjdXJyZW50RWxlbWVudCA9IGxvY2FsTmFtZTsKLQotICAgICAgICAvLyA8YXJ0aWZhY3Q+Ci0gICAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX0FSVElGQUNUKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwcm9maWxlIGFydGlmYWN0IG9iamVjdAotICAgICAgICAgIGFydGlmYWN0ID0gcHJvZmlsZUFzc2VydGlvbnMuY3JlYXRlQXJ0aWZhY3QoKTsKLQotICAgICAgICAgIC8vIFNldCB0eXBlCi0gICAgICAgICAgYXJ0aWZhY3Quc2V0VHlwZSgKLSAgICAgICAgICAgIEFydGlmYWN0VHlwZS5uZXdBcnRpZmFjdFR5cGUoCi0gICAgICAgICAgICAgIGF0dHMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfVFlQRSkpKTsKLQotICAgICAgICAgIC8vIEFERDogR2V0IHNwZWNpZmljYXRpb24gbGlzdAotCi0gICAgICAgICAgLy8gQWRkIGFydGlmYWN0IHRvIGxpc3Qgb2YgYXJ0aWZhY3QgbGlzdAotICAgICAgICAgIGFydGlmYWN0TGlzdC5wdXQoYXJ0aWZhY3QuZ2V0VHlwZSgpLmdldFR5cGVOYW1lKCksIGFydGlmYWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDx0ZXN0QXNzZXJ0aW9uPgotICAgICAgICBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX1RFU1RfQVNTRVJUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIENyZWF0ZSB0ZXN0IGFzc2VydGlvbgotICAgICAgICAgIHRlc3RBc3NlcnRpb24gPSBuZXcgVGVzdEFzc2VydGlvbkltcGwoKTsKLQotICAgICAgICAgIC8vIEdldCBhdHRyaWJ1dGUgdmFsdWVzCi0gICAgICAgICAgdGVzdEFzc2VydGlvbi5zZXRJZChhdHRzLmdldFZhbHVlKCIiLCBXU0lDb25zdGFudHMuQVRUUl9JRCkpOwotICAgICAgICAgIHRlc3RBc3NlcnRpb24uc2V0VHlwZShhdHRzLmdldFZhbHVlKCIiLCBXU0lDb25zdGFudHMuQVRUUl9UWVBFKSk7Ci0gICAgICAgICAgdGVzdEFzc2VydGlvbi5zZXRFbnRyeVR5cGVOYW1lKAotICAgICAgICAgICAgYXR0cy5nZXRWYWx1ZSgiIiwgV1NJQ29uc3RhbnRzLkFUVFJfRU5UUllfVFlQRSkpOwotICAgICAgICAgIHRlc3RBc3NlcnRpb24uc2V0RW5hYmxlZCgKLSAgICAgICAgICAgIEJvb2xlYW4KLSAgICAgICAgICAgICAgLnZhbHVlT2YoYXR0cy5nZXRWYWx1ZSgiIiwgV1NJQ29uc3RhbnRzLkFUVFJfRU5BQkxFRCkpCi0gICAgICAgICAgICAgIC5ib29sZWFuVmFsdWUoKSk7Ci0KLSAgICAgICAgICAvLyBBZGQgdGVzdCBhc3NlcnRpb24gdG8gYXJ0aWZhY3QKLSAgICAgICAgICBhcnRpZmFjdC5hZGRUZXN0QXNzZXJ0aW9uKHRlc3RBc3NlcnRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gPGNvbnRleHQ+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fQ09OVEVYVCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gPGFzc2VydGlvbkRlc2NyaXB0aW9uPgotICAgICAgICBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX0FTU0VSVElPTl9ERVNDUklQVElPTikpCi0gICAgICAgIHsKLSAgICAgICAgICBhc3NlcnRpb25EZXNjcmlwdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDxmYWlsdXJlTWVzc2FnZT4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9GQUlMVVJFX01FU1NBR0UpKQotICAgICAgICB7Ci0gICAgICAgICAgZmFpbHVyZU1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8ZmFpbHVyZURldGFpbERlc2NyaXB0aW9uPgotICAgICAgICBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX0ZBSUxVUkVfREVUQUlMX0RFU0NSSVBUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgIGZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDxkZXRhaWxEZXNjcmlwdGlvbj4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9ERVRBSUxfREVTQ1JJUFRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgZGV0YWlsRGVzY3JpcHRpb24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8dGVzdEFzc2VydGlvbklEPgotICAgICAgICBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX1RFU1RfQVNTRVJUSU9OX0lEKSkKLSAgICAgICAgewotICAgICAgICAgIHRlc3RBc3NlcnRpb25JZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDxhZGRpdGlvbmFsRW50cnlUeXBlTGlzdD4KLSAgICAgICAgZWxzZSBpZiAoCi0gICAgICAgICAgbG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9BRERJVElPTkFMX0VOVFJZX1RZUEVfTElTVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBDcmVhdGUgZW50cnkgdHlwZSBsaXN0Ci0gICAgICAgICAgZW50cnlUeXBlTGlzdCA9IG5ldyBFbnRyeVR5cGVMaXN0SW1wbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gPG1lc3NhZ2VJbnB1dD4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9NRVNTQUdFX0lOUFVUKSkKLSAgICAgICAgewotICAgICAgICAgIGxvZ0lucHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gPHdzZGxJbnB1dD4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9XU0RMX0lOUFVUKSkKLSAgICAgICAgewotICAgICAgICAgIHdzZGxJbnB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgfQotICAgICAgICAvLyA8cHJvZmlsZUFzc2VydGlvbnM+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fUFJPRklMRV9BU1NFUlRJT05TKSkKLSAgICAgICAgewotICAgICAgICAgIHByb2ZpbGVBc3NlcnRpb25zLnNldFRBRE5hbWUoCi0gICAgICAgICAgICBhdHRzLmdldFZhbHVlKCIiLCBXU0lDb25zdGFudHMuQVRUUl9OQU1FKSk7Ci0gICAgICAgICAgcHJvZmlsZUFzc2VydGlvbnMuc2V0VEFEVmVyc2lvbigKLSAgICAgICAgICAgIGF0dHMuZ2V0VmFsdWUoIiIsIFdTSUNvbnN0YW50cy5BVFRSX1ZFUlNJT04pKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJFTU9WRTogICAgIAotICAgICAgICAvLyA8dWRkaUlucHV0PgotICAgICAgICBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX1VERElfSU5QVVQpKSB7Ci0gICAgICAgICAgdWRkaUlucHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB9IAotICAgICAgICAqLwotICAgICAgfQotICAgIH0gLy8gRU5EIHN0YXJ0RWxlbWVudAotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcW5hbWUpCi0gICAgewotICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgcHJvZmlsZSBuYW1lc3BhY2UsIHRoZW4gY2hlY2sgZm9yIGFuZCBwcm9jZXNzIHNlbGVjdGVkIGVsZW1lbnRzCi0gICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwKLSAgICAgICAgJiYgKG5hbWVzcGFjZVVSSS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfQVNTRVJUSU9OU18yMDAzKQotICAgICAgICB8fCBuYW1lc3BhY2VVUkkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FTU0VSVElPTlMpKSkKLSAgICAgIHsKLSAgICAgICAgLy8gPGNvbnRleHQ+Ci0gICAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX0NPTlRFWFQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU2V0IGNvbnRleHQgaW4gdGVzdCBhc3NlcnRpb24KLSAgICAgICAgICB0ZXN0QXNzZXJ0aW9uLnNldENvbnRleHQoY29udGV4dC50b1N0cmluZygpKTsKLSAgICAgICAgICBjb250ZXh0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDxhc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9BU1NFUlRJT05fREVTQ1JJUFRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU2V0IGFzc2VydGlvbiBkZXNjcmlwdGlvbiBpbiB0ZXN0IGFzc2VydGlvbgotICAgICAgICAgIHRlc3RBc3NlcnRpb24uc2V0QXNzZXJ0aW9uRGVzY3JpcHRpb24oCi0gICAgICAgICAgICBhc3NlcnRpb25EZXNjcmlwdGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICBhc3NlcnRpb25EZXNjcmlwdGlvbiA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8ZmFpbHVyZU1lc3NhZ2U+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fRkFJTFVSRV9NRVNTQUdFKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFNldCBmYWlsdXJlIG1lc3NhZ2UgaW4gdGVzdCBhc3NlcnRpb24KLSAgICAgICAgICB0ZXN0QXNzZXJ0aW9uLnNldEZhaWx1cmVNZXNzYWdlKGZhaWx1cmVNZXNzYWdlLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGZhaWx1cmVNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDxmYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fRkFJTFVSRV9ERVRBSUxfREVTQ1JJUFRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU2V0IGZhaWx1cmUgZGV0YWlsIGRlc2NyaXB0aW9uIGluIHRlc3QgYXNzZXJ0aW9uCi0gICAgICAgICAgdGVzdEFzc2VydGlvbi5zZXRGYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24oCi0gICAgICAgICAgICBmYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbERlc2NyaXB0aW9uID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDxkZXRhaWxEZXNjcmlwdGlvbj4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9ERVRBSUxfREVTQ1JJUFRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU2V0IGRldGFpbCBkZXNjcmlwdGlvbiBpbiB0ZXN0IGFzc2VydGlvbgotICAgICAgICAgIHRlc3RBc3NlcnRpb24uc2V0RGV0YWlsRGVzY3JpcHRpb24oZGV0YWlsRGVzY3JpcHRpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgZGV0YWlsRGVzY3JpcHRpb24gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gPHRlc3RBc3NlcnRpb25JRD4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9URVNUX0FTU0VSVElPTl9JRCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBTZXQgdGVzdCBhc3NlcnRpb24gaWQgaW4gcHJlcmVxIGxpc3QKLSAgICAgICAgICB0ZXN0QXNzZXJ0aW9uLmFkZFByZXJlcUlkKHRlc3RBc3NlcnRpb25JZC50b1N0cmluZygpKTsKLSAgICAgICAgICB0ZXN0QXNzZXJ0aW9uSWQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gPGFkZHRpb25hbEVudHJ5VHlwZUxpc3Q+Ci0gICAgICAgIGVsc2UgaWYgKAotICAgICAgICAgIGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fQURESVRJT05BTF9FTlRSWV9UWVBFX0xJU1QpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU2V0IHRhcmdldCBsaXN0Ci0gICAgICAgICAgdGVzdEFzc2VydGlvbi5zZXRBZGRpdGlvbmFsRW50cnlUeXBlTGlzdChlbnRyeVR5cGVMaXN0KTsKLSAgICAgICAgICBlbnRyeVR5cGVMaXN0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDxtZXNzYWdlSW5wdXQ+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9JTlBVVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBTZXQgdGVzdCBhc3NlcnRpb24gaWQgaW4gcHJlcmVxIGxpc3QKLSAgICAgICAgICBlbnRyeVR5cGVMaXN0LnNldExvZ0lucHV0KGxvZ0lucHV0LnRvU3RyaW5nKCkpOwotICAgICAgICAgIGxvZ0lucHV0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDx3c2RsSW5wdXQ+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fV1NETF9JTlBVVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBTZXQgdGVzdCBhc3NlcnRpb24gaWQgaW4gcHJlcmVxIGxpc3QKLSAgICAgICAgICBlbnRyeVR5cGVMaXN0LnNldFdTRExJbnB1dCh3c2RsSW5wdXQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgd3NkbElucHV0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDxwcm9maWxlQXNzZXJ0aW9ucz4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9QUk9GSUxFX0FTU0VSVElPTlMpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gYSBuby1vcAotICAgICAgICB9Ci0KLSAgICAgICAgLyogUkVNT1ZFOgotICAgICAgICAvLyA8dWRkaUlucHV0PgotICAgICAgICBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX1VERElfSU5QVVQpKSB7Ci0gICAgICAgICAgLy8gU2V0IHRlc3QgYXNzZXJ0aW9uIGlkIGluIHByZXJlcSBsaXN0Ci0gICAgICAgICAgIGVudHJ5VHlwZUxpc3Quc2V0VURESUlucHV0KHVkZGlJbnB1dC50b1N0cmluZygpKTsgICAgICAgICAKLSAgICAgICAgICB1ZGRpSW5wdXQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICB9Ci0gICAgfSAvLyBFTkQgZW5kRWxlbWVudAotCi0gICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkKLSAgICB7Ci0gICAgICAvLyA8Y29udGV4dD4KLSAgICAgIGlmICgoY29udGV4dCAhPSBudWxsKQotICAgICAgICAmJiAoY3VycmVudEVsZW1lbnQuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX0NPTlRFWFQpKSkKLSAgICAgIHsKLSAgICAgICAgY29udGV4dC5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgfQotCi0gICAgICAvLyA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFzc2VydGlvbkRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgICAgICAgJiYgKGN1cnJlbnRFbGVtZW50LmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9BU1NFUlRJT05fREVTQ1JJUFRJT04pKSkKLSAgICAgIHsKLSAgICAgICAgYXNzZXJ0aW9uRGVzY3JpcHRpb24uYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIH0KLQotICAgICAgLy8gPGZhaWx1cmVNZXNzYWdlPgotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChmYWlsdXJlTWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICYmIChjdXJyZW50RWxlbWVudC5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fRkFJTFVSRV9NRVNTQUdFKSkpCi0gICAgICB7Ci0gICAgICAgIGZhaWx1cmVNZXNzYWdlLmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxmYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24+Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbiAhPSBudWxsKSAmJiAoCi0gICAgICAgICAgY3VycmVudEVsZW1lbnQuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX0ZBSUxVUkVfREVUQUlMX0RFU0NSSVBUSU9OKSkpCi0gICAgICB7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbi5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgfQotCi0gICAgICAvLyA8ZGV0YWlsRGVzY3JpcHRpb24+Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGRldGFpbERlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgICAgICAgJiYgKGN1cnJlbnRFbGVtZW50LmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9ERVRBSUxfREVTQ1JJUFRJT04pKSkKLSAgICAgIHsKLSAgICAgICAgZGV0YWlsRGVzY3JpcHRpb24uYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIH0KLQotICAgICAgLy8gPHRlc3RBc3NlcnRpb25JRD4KLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAodGVzdEFzc2VydGlvbklkICE9IG51bGwpCi0gICAgICAgICAgJiYgKGN1cnJlbnRFbGVtZW50LmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9URVNUX0FTU0VSVElPTl9JRCkpKQotICAgICAgewotICAgICAgICB0ZXN0QXNzZXJ0aW9uSWQuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIH0KLQotICAgICAgLy8gPG1lc3NhZ2VJbnB1dD4KLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAobG9nSW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAmJiAoY3VycmVudEVsZW1lbnQuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX01FU1NBR0VfSU5QVVQpKSkKLSAgICAgIHsKLSAgICAgICAgbG9nSW5wdXQuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIH0KLQotICAgICAgLy8gPHdzZGxJbnB1dD4KLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAod3NkbElucHV0ICE9IG51bGwpCi0gICAgICAgICAgJiYgKGN1cnJlbnRFbGVtZW50LmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9XU0RMX0lOUFVUKSkpCi0gICAgICB7Ci0gICAgICAgIHdzZGxJbnB1dC5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgfQotCi0gICAgICAvKiBSRU1PVkU6Ci0gICAgICAvLyA8dWRkaUlucHV0PgotICAgICAgZWxzZSBpZiAoKHVkZGlJbnB1dCAhPSBudWxsKSAmJiAoY3VycmVudEVsZW1lbnQuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX1VERElfSU5QVVQpKSkgewotICAgICAgICB1ZGRpSW5wdXQuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgICovCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9pbXBsL1Rlc3RBc3NlcnRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9pbXBsL1Rlc3RBc3NlcnRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNjRmMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9UZXN0QXNzZXJ0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5FbnRyeVR5cGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgLi4uCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QXNzZXJ0aW9uSW1wbCBpbXBsZW1lbnRzIFRlc3RBc3NlcnRpb24KLXsKLSAgLyoqCi0gICAqIFRlc3QgYXNzZXJ0aW9uIGlkLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRlc3QgYXNzZXJ0aW9uIHR5cGUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBudWxsOwotCi0gIC8qKgotICAgKiBUZXN0IGFzc2VydGlvbiBwcmltYXJ5IGVudHJ5IHR5cGUgbmFtZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZW50cnlUeXBlTmFtZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRlc3QgYXNzZXJ0aW9uIGVuYWJsZWQgaW5kaWNhdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIENvbnRleHQuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCi0gIC8qKgotICAgKiBBc3NlcnRpb24gZGVzY3JpcHRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGFzc2VydGlvbkRlc2NyaXB0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogRmFpbHVyZSBtZXNzYWdlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmYWlsdXJlTWVzc2FnZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEZhaWx1cmUgZGV0YWlsIGRlc2NyaXB0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24gPSBudWxsOwotCi0gIC8qKgotICAgKiBEZXRhaWwgZGVzY3JpcHRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGRldGFpbERlc2NyaXB0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogQWRkdGlvbmFsIGVudHJ5IHR5cGUgbGlzdC4KLSAgICovCi0gIHByb3RlY3RlZCBFbnRyeVR5cGVMaXN0IGVudHJ5VHlwZUxpc3QgPSBudWxsOwotCi0gIC8qKgotICAgKiBQcmVyZXEgSUQgbGlzdC4KLSAgICovCi0gIHByb3RlY3RlZCBWZWN0b3IgcHJlcmVxSWRMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuaWQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNzZXRJZChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpCi0gIHsKLSAgICB0aGlzLmlkID0gaWQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNnZXRUeXBlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy50eXBlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jc2V0VHlwZShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKQotICB7Ci0gICAgdGhpcy50eXBlID0gdHlwZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI2dldEVudHJ5VHlwZU5hbWUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbnRyeVR5cGVOYW1lKCkKLSAgewotICAgIHJldHVybiB0aGlzLmVudHJ5VHlwZU5hbWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNzZXRFbnRyeVR5cGVOYW1lKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZU5hbWUoU3RyaW5nIGVudHJ5VHlwZU5hbWUpCi0gIHsKLSAgICB0aGlzLmVudHJ5VHlwZU5hbWUgPSBlbnRyeVR5cGVOYW1lOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jaXNFbmFibGVkKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gZW5hYmxlZDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI3NldEVuYWJsZWQoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQotICB7Ci0gICAgdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI2dldENvbnRleHQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0KCkKLSAgewotICAgIHJldHVybiBjb250ZXh0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jc2V0Q29udGV4dChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KFN0cmluZyBjb250ZXh0KQotICB7Ci0gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI2dldEFzc2VydGlvbkRlc2NyaXB0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QXNzZXJ0aW9uRGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuYXNzZXJ0aW9uRGVzY3JpcHRpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNzZXRBc3NlcnRpb25EZXNjcmlwdGlvbihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBc3NlcnRpb25EZXNjcmlwdGlvbihTdHJpbmcgYXNzZXJ0aW9uRGVzY3JpcHRpb24pCi0gIHsKLSAgICB0aGlzLmFzc2VydGlvbkRlc2NyaXB0aW9uID0gYXNzZXJ0aW9uRGVzY3JpcHRpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNnZXRGYWlsdXJlTWVzc2FnZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZhaWx1cmVNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiB0aGlzLmZhaWx1cmVNZXNzYWdlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jc2V0RmFpbHVyZU1lc3NhZ2UoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmFpbHVyZU1lc3NhZ2UoU3RyaW5nIGZhaWx1cmVNZXNzYWdlKQotICB7Ci0gICAgdGhpcy5mYWlsdXJlTWVzc2FnZSA9IGZhaWx1cmVNZXNzYWdlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jZ2V0RmFpbHVyZURldGFpbERlc2NyaXB0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmFpbHVyZURldGFpbERlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLmZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI3NldEZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24oU3RyaW5nIGZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbikKLSAgewotICAgIHRoaXMuZmFpbHVyZURldGFpbERlc2NyaXB0aW9uID0gZmFpbHVyZURldGFpbERlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jZ2V0RGV0YWlsRGVzY3JpcHRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXRhaWxEZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5kZXRhaWxEZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI3NldERldGFpbERlc2NyaXB0aW9uKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERldGFpbERlc2NyaXB0aW9uKFN0cmluZyBkZXRhaWxEZXNjcmlwdGlvbikKLSAgewotICAgIHRoaXMuZGV0YWlsRGVzY3JpcHRpb24gPSBkZXRhaWxEZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI2dldEFkZGl0aW9uYWxFbnRyeVR5cGVMaXN0KCkKLSAgICovCi0gIHB1YmxpYyBFbnRyeVR5cGVMaXN0IGdldEFkZGl0aW9uYWxFbnRyeVR5cGVMaXN0KCkKLSAgewotICAgIHJldHVybiB0aGlzLmVudHJ5VHlwZUxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNzZXRBZGRpdGlvbmFsRW50cnlUeXBlTGlzdChvcmcud3NpLnRlc3QucHJvZmlsZS5FbnRyeVR5cGVMaXN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbEVudHJ5VHlwZUxpc3QoRW50cnlUeXBlTGlzdCBlbnRyeVR5cGVMaXN0KQotICB7Ci0gICAgdGhpcy5lbnRyeVR5cGVMaXN0ID0gZW50cnlUeXBlTGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI2dldFByZXJlcUlkTGlzdCgpCi0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFByZXJlcUlkTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gcHJlcmVxSWRMaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jYWRkUHJlcmVxSWQoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUHJlcmVxSWQoU3RyaW5nIHByZXJlcUlkKQotICB7Ci0gICAgdGhpcy5wcmVyZXFJZExpc3QuYWRkKHByZXJlcUlkKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NjFjMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBUaGUgYmFzZSBpbnRlcmZhY2UgZm9yIHRoZSBwcm9maWxlIHZhbGlkYXRvci4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlVmFsaWRhdG9yCi17Ci0gIC8qKgotICAgKiBTZXQgYWxsIHRlc3QgYXNzZXJ0aW9ucyBmb3IgYW4gYXJ0aWZhY3QgdG8gbWlzc2luZ0lucHV0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbnkgcHJvYmxlbXMgd2hpbGUgcHJvY2Vzc2luZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFsbE1pc3NpbmdJbnB1dCgpIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENsZWFudXAgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgb2YgdGhlIHRlc3QgYXNzZXJ0aW9ucyBmb3IgYW4gYXJ0aWZhY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFueSBwcm9ibGVtcyBkdXJpbmcgY2xlYW51cC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgICAqIFBhcnNlIFhNTCBkb2N1bWVudCBhbmQgdmFsaWRhdGUgd2l0aCBhIHNjaGVtYSBkb2N1bWVudC4KLSAgICAgKiBAcGFyYW0gdXJsU3RyaW5nIFhNTCBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICAgKiBAcGFyYW0gYmFzZVVSSSBhIGJhc2UgdXJsIHRvIGFzc2lzdCBpbiBsb2NhdGluZyB0aGUgWE1MIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBzY2hlbWEgdGhlIHJlbGF0ZWQgWE1MIHNjaGVtYS4KLSAgICAgKiBAcmV0dXJuIFhNTCBkb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zIHdoaWxlIHBhcnNpbmcgb3IgCi0gICAgICogICAgICAgICB2YWxpZGF0aW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0gICAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBwYXJzZVhNTERvY3VtZW50VVJMKAotICAgIFN0cmluZyB1cmxTdHJpbmcsCi0gICAgU3RyaW5nIGJhc2VVUkksCi0gICAgU3RyaW5nIHNjaGVtYSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL0VudHJ5Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL0VudHJ5Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGNlODNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9FbnRyeUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5BbmFseXplckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVudHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC5XU0RMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIHRhcmdldCBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgYSB0ZXN0IGFzc2VydGlvbi4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEBhdXRob3IgR3JhaGFtIFR1cnJlbGwgKGd0dXJyZWxsQHVrLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRyeUNvbnRleHQKLXsKLSAgcHJvdGVjdGVkIEVudHJ5IGVudHJ5ID0gbnVsbDsKLQotICBwcm90ZWN0ZWQgTWVzc2FnZUVudHJ5IHJlcXVlc3QgPSBudWxsOwotICBwcm90ZWN0ZWQgTWVzc2FnZUVudHJ5IHJlc3BvbnNlID0gbnVsbDsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VFbnRyeSBtZXNzYWdlRW50cnkgPSBudWxsOwotCi0gIHByb3RlY3RlZCBEb2N1bWVudCByZXF1ZXN0RG9jdW1lbnQgPSBudWxsOwotICBwcm90ZWN0ZWQgRG9jdW1lbnQgcmVzcG9uc2VEb2N1bWVudCA9IG51bGw7Ci0gIHByb3RlY3RlZCBEb2N1bWVudCBtZXNzYWdlRW50cnlEb2N1bWVudCA9IG51bGw7Ci0KLSAgcHJvdGVjdGVkIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQgPSBudWxsOwotCi0gIHByb3RlY3RlZCBBbmFseXplckNvbnRleHQgYW5hbHl6ZXJDb250ZXh0ID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlIGVudHJ5IGNvbnRleHQuCi0gICAqIEBwYXJhbSBlbnRyeSAgICBhIG1lc3NhZ2UgZW50cnkuCi0gICAqIEBwYXJhbSByZXF1ZXN0ICB0aGUgcmVxdWVzdC4KLSAgICogQHBhcmFtIHJlc3BvbnNlIHRoZSByZXNwb25zZS4KLSAgICovCi0gIHB1YmxpYyBFbnRyeUNvbnRleHQoRW50cnkgZW50cnksIE1lc3NhZ2VFbnRyeSByZXF1ZXN0LCBNZXNzYWdlRW50cnkgcmVzcG9uc2UpCi0gIHsKLSAgICB0aGlzKGVudHJ5LCByZXF1ZXN0LCByZXNwb25zZSwgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGVudHJ5IGNvbnRleHQuCi0gICAqIEBwYXJhbSBlbnRyeSAgICAgICAgICAgYSBtZXNzYWdlIGVudHJ5LgotICAgKiBAcGFyYW0gcmVxdWVzdCAgICAgICAgIHRoZSByZXF1ZXN0LgotICAgKiBAcGFyYW0gcmVzcG9uc2UgICAgICAgIHRoZSByZXNwb25zZS4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29udGV4dCB0aGUgYW5hbHl6ZXJDb250ZXh0LgotICAgKi8KLSAgcHVibGljIEVudHJ5Q29udGV4dCgKLSAgICBFbnRyeSBlbnRyeSwKLSAgICBNZXNzYWdlRW50cnkgcmVxdWVzdCwKLSAgICBNZXNzYWdlRW50cnkgcmVzcG9uc2UsCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCkKLSAgewotICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKLSAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKLSAgICB0aGlzLmFuYWx5emVyQ29udGV4dCA9IGFuYWx5emVyQ29udGV4dDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFBhcnNlIGFsbCBkb2N1bWVudHMKLSAgICAgIGlmKHJlcXVlc3QuaXNNaW1lQ29udGVudCgpKSAKLSAgICAgIHsKLSAgICAgIAlNaW1lUGFydCBwYXJ0ID0gcmVxdWVzdC5nZXRNaW1lUGFydHMoKS5nZXRSb290UGFydCgpOwotICAgICAgICBpZiAoKHBhcnQgIT0gbnVsbCkgJiYgKHBhcnQuZ2V0Q29udGVudCgpLmxlbmd0aCgpID4gMCkpCi0gICAgICAgICAgcmVxdWVzdERvY3VtZW50ID0gWE1MVXRpbHMucGFyc2VYTUwocGFydC5nZXRDb250ZW50KCkpOwotICAgICAgfQotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICByZXF1ZXN0RG9jdW1lbnQgPSBYTUxVdGlscy5wYXJzZVhNTChyZXF1ZXN0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmKHJlc3BvbnNlLmlzTWltZUNvbnRlbnQoKSkgCi0gICAgICB7Ci0gICAgICAJTWltZVBhcnQgcGFydCA9IHJlc3BvbnNlLmdldE1pbWVQYXJ0cygpLmdldFJvb3RQYXJ0KCk7Ci0gICAgICAJaWYgKChwYXJ0ICE9IG51bGwpICYmIChwYXJ0LmdldENvbnRlbnQoKS5sZW5ndGgoKSA+IDApKQotICAgICAgICAgIHJlc3BvbnNlRG9jdW1lbnQgPSBYTUxVdGlscy5wYXJzZVhNTChwYXJ0LmdldENvbnRlbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIAotICAgICAgewotICAgICAgICBpZiAocmVzcG9uc2UuZ2V0TWVzc2FnZSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICByZXNwb25zZURvY3VtZW50ID0gWE1MVXRpbHMucGFyc2VYTUwocmVzcG9uc2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIHdlKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBuZWVkIHNvbWUgZXhjZXB0aW9uIGhhbmRsaW5nIGluIGhlcmUgYW5kIG1vcmUgY2FyZWZ1bCBjaGVja2luZwotICAgIGlmIChlbnRyeS5nZXRFbnRyeVR5cGUoKS5lcXVhbHMoRW50cnlUeXBlLkVOVFJZX1RZUEVfUkVRVUVTVCkpCi0gICAgewotICAgICAgdGhpcy5tZXNzYWdlRW50cnkgPSByZXF1ZXN0OwotICAgICAgdGhpcy5tZXNzYWdlRW50cnlEb2N1bWVudCA9IHJlcXVlc3REb2N1bWVudDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRoaXMubWVzc2FnZUVudHJ5ID0gcmVzcG9uc2U7Ci0gICAgICB0aGlzLm1lc3NhZ2VFbnRyeURvY3VtZW50ID0gcmVzcG9uc2VEb2N1bWVudDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGVudHJ5IGNvbnRleHQuCi0gICAqIEBwYXJhbSBlbnRyeSBhIG1lc3NhZ2UgZW50cnkuCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgYSBXU0RMIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIEVudHJ5Q29udGV4dChFbnRyeSBlbnRyeSwgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgewotICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKLSAgICB0aGlzLndzZGxEb2N1bWVudCA9IHdzZGxEb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgZW50cnkgY29udGV4dC4KLSAgICogQHBhcmFtIGVudHJ5IGEgbWVzc2FnZSBlbnRyeS4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29udGV4dCB0aGUgYW5hbHl6ZXJDb250ZXh0LgotICAgKi8KLSAgcHVibGljIEVudHJ5Q29udGV4dChFbnRyeSBlbnRyeSwgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCkKLSAgewotICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKLSAgICB0aGlzLmFuYWx5emVyQ29udGV4dCA9IGFuYWx5emVyQ29udGV4dDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBlbnRyeS4gCi0gICAqIEByZXR1cm4gdGhlIGVudHJ5LiAKLSAgICovCi0gIHB1YmxpYyBFbnRyeSBnZXRFbnRyeSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5lbnRyeTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXF1ZXN0LgotICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0LgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VFbnRyeSBnZXRSZXF1ZXN0KCkKLSAgewotICAgIHJldHVybiByZXF1ZXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3BvbnNlLgotICAgKiBAcmV0dXJuIHRoZSByZXNwb25zZS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlRW50cnkgZ2V0UmVzcG9uc2UoKQotICB7Ci0gICAgcmV0dXJuIHJlc3BvbnNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxvZyBlbnRyeSB3aGljaCBpcyBub3QgbnVsbC4KLSAgICogQHJldHVybiB0aGUgbG9nIGVudHJ5LgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VFbnRyeSBnZXRNZXNzYWdlRW50cnkoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VFbnRyeTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXF1ZXN0LgotICAgKiBAcmV0dXJuIE1lc3NhZ2VFbnRyeQotICAgKi8KLSAgcHVibGljIERvY3VtZW50IGdldFJlcXVlc3REb2N1bWVudCgpCi0gIHsKLSAgICByZXR1cm4gcmVxdWVzdERvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3BvbnNlLgotICAgKiBAcmV0dXJuIHRoZSByZXNwb25zZS4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBnZXRSZXNwb25zZURvY3VtZW50KCkKLSAgewotICAgIHJldHVybiByZXNwb25zZURvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxvZyBlbnRyeSB3aGljaCBpcyBub3QgbnVsbC4KLSAgICogQHJldHVybiB0aGUgbG9nIGVudHJ5LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50IGdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlRW50cnlEb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAcmV0dXJuIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudCBnZXRXU0RMRG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxEb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuYWx5emVyQ29udGV4dC4KLSAgICogQHJldHVybiBhbmFseXplckNvbnRleHQKLSAgICovCi0gIHB1YmxpYyBBbmFseXplckNvbnRleHQgZ2V0QW5hbHl6ZXJDb250ZXh0KCkKLSAgewotICAgIHJldHVybiB0aGlzLmFuYWx5emVyQ29udGV4dDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL0VudmVsb3BlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvRW52ZWxvcGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxZjNjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvRW52ZWxvcGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFuYWx5emVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExEb2N1bWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgZW52ZWxvcGUgdmFsaWRhdGlvbiB0ZXN0IHByb2NlZHVyZS4KLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBFbnZlbG9wZVZhbGlkYXRvciBleHRlbmRzIEJhc2VWYWxpZGF0b3IKLXsKLQotICAvKioKLSAgICogSW5pdGlhaWxpemUgdmFsaWRhdGlvbiB0ZXN0IHByb2NlZHVyZS4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29udGV4dCB0aGUgYW5hbHl6ZXJDb250ZXh0LgotICAgKiBAcGFyYW0gYXJ0aWZhY3QgICAgICAgIGFuIHByb2ZpbGUgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSByZXBvcnRBcnRpZmFjdCAgdGhlIHJlcG9ydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCB0aGUgV2ViIHNlcnZpY2UgZGVmaW5pdGlvbgotICAgKiBAcGFyYW0gcmVwb3J0ZXIgdGhlIHJlcG9ydGVyIHdoaWNoIGlzIHVzZWQgdG8gYWRkIGVycm9ycyB0byB0aGUgY29uZm9ybWFuY2UgcmVwb3J0Ci0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIG1lc3NhZ2UgdmFsaWRhdG9yIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgYXJ0aWZhY3QsCi0gICAgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QsCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCwKLSAgICBSZXBvcnRlciByZXBvcnRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZW52ZWxvcGUgbG9jYXRlZCBieSB0aGUgbG9nIGVudHJ5LiAKLSAgICogQHBhcmFtIGVudHJ5Q29udGV4dCBhIGxvZyBlbnRyeSBsb2NhdGluZyBhbiBlbnZlbG9wZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgYW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZQotICAgKiAgICAgICAgIHByb2Nlc3NpbmcgdGhlIGxvZyBlbnRyeS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpIHRocm93cyBXU0lFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL01lc3NhZ2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9NZXNzYWdlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNjE4YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL01lc3NhZ2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFuYWx5emVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExEb2N1bWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgbWVzc2FnZSB2YWxpZGF0aW9uIHRlc3QgcHJvY2VkdXJlLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0KLSAqIEBhdXRob3IgR3JhaGFtIFR1cnJlbGwgKGd0dXJyZWxsQHVrLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVZhbGlkYXRvciBleHRlbmRzIEJhc2VWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIEhUVFAgMS4wIHZlcnNpb24gaW5kaWNhdG9yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9WRVJTSU9OXzFfMCA9ICJIVFRQLzEuMCI7Ci0KLSAgLyoqCi0gICAqIEhUVFAgMS4xIHZlcnNpb24gaW5kaWNhdG9yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9WRVJTSU9OXzFfMSA9ICJIVFRQLzEuMSI7Ci0KLSAgLyoqCi0gICAqIEhUVFAgUE9TVCBtZXNzYWdlIGluZGljYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUE9TVCA9ICJQT1NUIjsKLQotICAvKioKLSAgICogSW5pdGlhaWxpemUgdmFsaWRhdGlvbiB0ZXN0IHByb2NlZHVyZS4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29udGV4dCB0aGUgYW5hbHl6ZXJDb250ZXh0LgotICAgKiBAcGFyYW0gYXJ0aWZhY3QgICAgICAgIGFuIHByb2ZpbGUgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSByZXBvcnRBcnRpZmFjdCAgdGhlIHJlcG9ydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCB0aGUgV2ViIHNlcnZpY2UgZGVmaW5pdGlvbgotICAgKiBAcGFyYW0gcmVwb3J0ZXIgdGhlIHJlcG9ydGVyIHdoaWNoIGlzIHVzZWQgdG8gYWRkIGVycm9ycyB0byB0aGUgY29uZm9ybWFuY2UgcmVwb3J0Ci0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIG1lc3NhZ2UgdmFsaWRhdG9yIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgYXJ0aWZhY3QsCi0gICAgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QsCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCwKLSAgICBSZXBvcnRlciByZXBvcnRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgbWVzc2FnZSBsb2NhdGVkIGJ5IHRoZSBsb2cgZW50cnkuIAotICAgKiBAcGFyYW0gZW50cnlDb250ZXh0IGEgbG9nIGVudHJ5IGxvY2F0aW5nIGEgbWVzc2FnZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgYW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSAKLSAgICogICAgICAgICBwcm9jZXNzaW5nIHRoZSBsb2cgZW50cnkuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL1Byb2ZpbGVWYWxpZGF0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvUHJvZmlsZVZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExOTM5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvUHJvZmlsZVZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuV1NJUHJvcGVydGllczsKLQotLyoqCi0qIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBhY2Nlc3MgYW4gaW1wbGVtZW50YXRpb24gb2YgYSBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeSBhYnN0cmFjdCBjbGFzcy4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeQotewotICAvKiogCi0gICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFVEREkgdmFsaWRhdG9yLgotICAgKiBAcmV0dXJuICBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBXU0RMVmFsaWRhdG9yIGludGVyZmFjZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgVURESSB2YWxpZGF0b3IgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgVURESVZhbGlkYXRvciBuZXdVRERJVmFsaWRhdG9yKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKiogCi0gICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFdTREwgdmFsaWRhdG9yLgotICAgKiBAcmV0dXJuIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIFdTRExWYWxpZGF0b3IgaW50ZXJmYWNlLiAKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgV1NETCB2YWxpZGF0b3IgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBXU0RMVmFsaWRhdG9yIG5ld1dTRExWYWxpZGF0b3IoKSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKiAKLSAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgbWVzc2FnZSB2YWxpZGF0b3IuCi0gICAqIE5PVEU6IERvIHdlIG5lZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSB0cmFucG9ydCBhbmQgU09BUCAKLSAgICogbWVzc2FnZSB2YWxpZGF0b3I/Ci0gICAqCi0gICAqIEByZXR1cm4gYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgTWVzc2FnZVZhbGlkYXRvciBpbnRlcmZhY2UuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIG1lc3NhZ2UgdmFsaWRhdG9yY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgTWVzc2FnZVZhbGlkYXRvciBuZXdNZXNzYWdlVmFsaWRhdG9yKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKiogCi0gICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhbiBlbnZlbG9wZSB2YWxpZGF0b3IuCi0gICAqIEByZXR1cm4gYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgRW52ZWxvcGVWYWxpZGF0b3IgaW50ZXJmYWNlLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBtZXNzYWdlIHZhbGlkYXRvciBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBFbnZlbG9wZVZhbGlkYXRvciBuZXdFbnZlbG9wZVZhbGlkYXRvcigpIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEluc3RhbnRpYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJvZmlsZVZhbGlkYXRvckZhY3RvcnkgY2xhc3MuCi0gICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhpcyBpbnRlcmZhY2UgaXMgc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcgCi0gICAqIEphdmEgc3lzdGVtIHByb3BlcnR5OgotICAgKiA8VUw+Ci0gICAqICAgPExJPndzaS5wcm9maWxlLnZhbGlkYXRvci5mYWN0b3J5Ci0gICAqIDwvVUw+Ci0gICAqCi0gICAqIEByZXR1cm4gdGhlIFByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5IG9iamVjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgZmFjdG9yeSBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeSBuZXdJbnN0YW5jZSgpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotICAgIFN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lID0gbnVsbDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCBmYWN0b3J5IGNsYXNzIG5hbWUKLSAgICAgIGZhY3RvcnlDbGFzc05hbWUgPQotICAgICAgICBXU0lQcm9wZXJ0aWVzLmdldFByb3BlcnR5KAotICAgICAgICAgIFdTSVByb3BlcnRpZXMuUFJPUF9WQUxJREFUT1JfRkFDVE9SWSwKLSAgICAgICAgICBXU0lQcm9wZXJ0aWVzLkRFRl9WQUxJREFUT1JfRkFDVE9SWSk7Ci0KLSAgICAgIC8vIENyZWF0ZSB0aGUgZmFjdG9yeSBjbGFzcwotICAgICAgQ2xhc3MgZmFjdG9yeUNsYXNzID0gQ2xhc3MuZm9yTmFtZShmYWN0b3J5Q2xhc3NOYW1lKTsKLQotICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIGZhY3RvcnkgCi0gICAgICBmYWN0b3J5ID0gKFByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5KSBmYWN0b3J5Q2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBmYWN0b3J5IGNsYXNzOiAiICsgZmFjdG9yeUNsYXNzTmFtZSArICIuIiwKLSAgICAgICAgZSk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGZhY3RvcnkKLSAgICByZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9VRERJVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvVURESVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjE4MzYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9VRERJVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5BbmFseXplckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5VRERJUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydEFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0ZXI7Ci0KLS8qKgotICogVGhlIFdTREwgdmFsaWRhdG9yIHdpbGwgdmVyaWZ5IHRoYXQgdGhlIFdTREwgYW5kIGFzc29jaWF0ZWQgWE1MIHNjaGVtYSBkZWZpbml0aW9ucwotICogYXJlIGluIGNvbmZvcm1hbmNlIHdpdGggdGhlIHByb2ZpbGUuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVERElWYWxpZGF0b3IgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yCi17Ci0gIC8qKgotICAgKiBJbml0aWFpbGl6ZSB2YWxpZGF0aW9uIHRlc3QgcHJvY2VkdXJlLgotICAgKiBAcGFyYW0gYW5hbHl6ZXJDb250ZXh0IHRoZSBhbmFseXplckNvbnRleHQuCi0gICAqIEBwYXJhbSBhcnRpZmFjdCAgICAgICAgYW4gcHJvZmlsZSBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHJlcG9ydEFydGlmYWN0ICB0aGUgcmVwb3J0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gdWRkaVJlZmVyZW5jZSAgIGEgVURESSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSByZXBvcnRlciAgICAgICAgYSBSZXBvcnRlciBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIFVEREkgdmFsaWRhdG9yIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgYXJ0aWZhY3QsCi0gICAgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QsCi0gICAgVURESVJlZmVyZW5jZSB1ZGRpUmVmZXJlbmNlLAotICAgIFJlcG9ydGVyIHJlcG9ydGVyKQotICAgIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBVRERJIGJhc2VkIHNlcnZpY2UgZGVzY3JpcHRpb24uCi0gICAqIEByZXR1cm4gSWYgdGhlIFVEREkgZW50cmllcyBhcmUgdmFsaWQsIHRoZW4gdGhlIHZhbHVlIHJldHVybmVkIAotICAgKiAgICAgICAgIGlzIHRoZSBVUkwgZm9yIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBXU0lFeGNlcHRpb24gaWYgYW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZAotICAgKiAgICAgICAgIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFVEREllbnRyaWVzLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB2YWxpZGF0ZSgpIHRocm93cyBXU0lFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvV1NETFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL1dTRExWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyYmQyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvV1NETFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQW5hbHl6ZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydEFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwuV1NETERvY3VtZW50OwotCi0vKioKLSAqIFRoZSBXU0RMIHZhbGlkYXRvciB3aWxsIHZlcmlmeSB0aGF0IHRoZSBXU0RMIGFuZCBhc3NvY2lhdGVkIFhNTCBzY2hlbWEgZGVmaW5pdGlvbnMKLSAqIGFyZSBpbiBjb25mb3JtYW5jZSB3aXRoIHRoZSBwcm9maWxlLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0KLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMVmFsaWRhdG9yIGV4dGVuZHMgQmFzZVZhbGlkYXRvcgotewotICAvKioKLSAgICogSW5pdGlhaWxpemUgdmFsaWRhdGlvbiB0ZXN0IHByb2NlZHVyZS4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29udGV4dCB0aGUgYW5hbHl6ZXJDb250ZXh0LgotICAgKiBAcGFyYW0gYXJ0aWZhY3QgICAgICAgIHRoZSBwcm9maWxlIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcmVwb3J0QXJ0aWZhY3QgIHRoZSByZXBvcnQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSB3c2RsVVJMICAgICAgICAgdGhlIFdTREwgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgICAgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSByZXBvcnRlciAgICAgICAgYSBSZXBvcnRlciBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIFdTREwgdmFsaWRhdG9yIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgYXJ0aWZhY3QsCi0gICAgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QsCi0gICAgU3RyaW5nIHdzZGxVUkwsCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCwKLSAgICBSZXBvcnRlciByZXBvcnRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgV1NETCBiYXNlZCBzZXJ2aWNlIGRlc2NyaXB0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBhbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkCi0gICAqICAgICAgICAgd2hpbGUgdmFsaWRhdGluZyBoZSBXU0RMIGJhc2VkIHNlcnZpY2UgZGVzY3JpcHRpb24uCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50IHZhbGlkYXRlKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Fzc2VydGlvblByb2Nlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Fzc2VydGlvblByb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhM2QyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9Bc3NlcnRpb25Qcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRmFpbHVyZURldGFpbDsKLQotCi0vKioKLSAqIFByb2Nlc3MgYXNzZXJ0aW9uLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdDsKLSAgcHJvdGVjdGVkIFN0cmluZyBmYWlsdXJlRGV0YWlsTWVzc2FnZTsKLSAgcHJvdGVjdGVkIEZhaWx1cmVEZXRhaWwgZmFpbHVyZURldGFpbDsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlVmFsaWRhdG9ySW1wbCBiYXNlX3ZhbGlkYXRvcjsKLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZVZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25Qcm9jZXNzKEJhc2VWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICB0aGlzLmJhc2VfdmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYXNzZXJ0aW9uIHJlc3VsdC4KLSAgICovCi0gIHZvaWQgcmVzZXQoKQotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPSBudWxsOwotICAgIGZhaWx1cmVEZXRhaWwgPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIGFzc2VydGlvbi4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCB0YXJnZXRDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFZlcmJvc2Ugb3V0cHV0LgotICAgKi8KLSAgcHVibGljIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICBpZiAoKGJhc2VfdmFsaWRhdG9yICE9IG51bGwpICYmIGJhc2VfdmFsaWRhdG9yLnZlcmJvc2VPcHRpb24pCi0gICAgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Fzc2VydGlvblByb2Nlc3NWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODdiMGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Fzc2VydGlvblByb2Nlc3NWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogUHJvY2VzcyBhc3NlcnRpb24gdXNpbmcgV1NETFZpc2l0b3IgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IKLSAgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi0gIGltcGxlbWVudHMgV1NETFZpc2l0b3IKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlVmFsaWRhdG9ySW1wbCBiYXNlX3ZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IoQmFzZVZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMuYmFzZV92YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdChQYXJ0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgcHVibGljIHZvaWQgdmlzaXQoU2VydmljZSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KFR5cGVzIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgcHVibGljIHZvaWQgdmlzaXQoT3BlcmF0aW9uIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgcHVibGljIHZvaWQgdmlzaXQoSW5wdXQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChPdXRwdXQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChGYXVsdCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KEJpbmRpbmcgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBCaW5kaW5nT3BlcmF0aW9uIG9iaiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIEJpbmRpbmdJbnB1dCBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBCaW5kaW5nT3V0cHV0IG9iaiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIEJpbmRpbmdGYXVsdCBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChJbXBvcnQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChFbGVtZW50IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgcHVibGljIHZvaWQgdmlzaXQoTWVzc2FnZSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KFBvcnQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChQb3J0VHlwZSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KERlZmluaXRpb24gb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQQmluZGluZyBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBCb2R5IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEhlYWRlciBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBIZWFkZXJGYXVsdCBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQRmF1bHQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQT3BlcmF0aW9uIG9iaiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvQmFzZU1lc3NhZ2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Jhc2VNZXNzYWdlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZGU2YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvQmFzZU1lc3NhZ2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiwgUGFyYXNvZnQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIFBhcmFzb2Z0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlVSSTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFuYWx5emVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQ2FuZGlkYXRlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuU2VydmljZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRmFpbHVyZURldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydEFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRW50cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC5XU0RMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTTJXcml0ZXI7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTVV0aWxzOwotCi0vKioKLSAqIFRoZSBXU0RMIHZhbGlkYXRvciB3aWxsIHZlcmlmeSB0aGF0IHRoZSBXU0RMIGFuZCBhc3NvY2lhdGVkIFhNTCBzY2hlbWEgZGVmaW5pdGlvbnMKLSAqIGFyZSBpbiBjb25mb3JtYW5jZSB3aXRoIHRoZSBwcm9maWxlLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEBhdXRob3IgSmltIENsdW5lCi0gKiBAYXV0aG9yIEdyYWhhbSBUdXJyZWxsIChndHVycmVsbEB1ay5pYm0uY29tKQotICogQGF1dGhvciBOZWlsIERlbGltYSAobmRkZWxpbWFAY2EuaWJtLmNvbSkgCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICBleHRlbmRzIEJhc2VWYWxpZGF0b3JJbXBsCi17Ci0gIC8qKgotICAqIFdTREwgZG9jdW1lbnQuCi0gICovCi0gIHByaXZhdGUgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudDsKLQotICAvKioKLSAgICogTG9nIGVudHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2VFbnRyeSBsb2dFbnRyeTsKLSAgcHJvdGVjdGVkIExvZyBsb2c7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5NZXNzYWdlVmFsaWRhdG9yI2luaXQob3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFuYWx5emVyQ29udGV4dCwgb3JnLndzaS50ZXN0LnByb2ZpbGUuUHJvZmlsZUFydGlmYWN0LCBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydEFydGlmYWN0LCBvcmcud3NpLndzZGwuV1NETERvY3VtZW50LCBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdCgKLSAgICBBbmFseXplckNvbnRleHQgYW5hbHl6ZXJDb250ZXh0LAotICAgIFByb2ZpbGVBcnRpZmFjdCBwcm9maWxlQXJ0aWZhY3QsCi0gICAgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QsCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCwKLSAgICBSZXBvcnRlciByZXBvcnRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBCYXNlVmFsaWRhdG9ySW1wbAotICAgIHN1cGVyLmluaXQoYW5hbHl6ZXJDb250ZXh0LCBwcm9maWxlQXJ0aWZhY3QsIHJlcG9ydEFydGlmYWN0LCByZXBvcnRlcik7Ci0KLSAgICAvLyBTYXZlIGlucHV0IHJlZmVyZW5jZXMKLSAgICB0aGlzLndzZGxEb2N1bWVudCA9IHdzZGxEb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHdzZGxEb2N1bWVudAotICAgKiBAcmV0dXJuIHdzZGxEb2N1bWVudAotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudCBnZXRXU0RMRG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxEb2N1bWVudDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLk1lc3NhZ2VWYWxpZGF0b3IjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vRW50cnkgZW50cnkgPSBudWxsOwotCi0gICAgLy8gU2F2ZSBsb2cgZW50cnkgdG8gYmUgcmVmZXJlbmNlZCBieSBvdGhlciBtZXRob2RzCi0gICAgdGhpcy5sb2dFbnRyeSA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKTsKLQotICAgIC8vIEdldCByZWZlcmVuY2UgdG8gdGhlIGFuYWx5emVyIGNvbmZpZyBvYmplY3QKLSAgICBBbmFseXplckNvbmZpZyBhbmFseXplckNvbmZpZyA9Ci0gICAgICByZXBvcnRlci5nZXRSZXBvcnQoKS5nZXRSZXBvcnRDb250ZXh0KCkuZ2V0QW5hbHl6ZXIoKS5nZXRBbmFseXplckNvbmZpZygpOwotCi0gICAgLyogSWYgU2VydmljZSBEZXNjcmlwdGlvbiAoV1NETC9VRERJKSBOT1Qgc3VwcGxpZWQgaW4gYW5hbHl6ZXIgY29uZmlnIE9SCi0gICAgICogU2VydmljZSBEZXNjcmlwdGlvbiBJUyBzdXBwbGllZCBhbmQgdGhlIGN1cnJlbnQgbWVzc2FnZSBjb3JyZWxhdGVzIHRvIGl0Li4uCi0gICAgICovCi0gICAgaWYgKCh3c2RsRG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIHx8IG1lc3NhZ2VDb3JyZWxhdGVzVG9TZXJ2aWNlKAotICAgICAgICBlbnRyeUNvbnRleHQsCi0gICAgICAgIGFuYWx5emVyQ29uZmlnLmdldENvcnJlbGF0aW9uVHlwZSgpKSkKLSAgICB7Ci0gICAgICAvLyBub3cgaW5uZXIgY2xhc3NlcyBtb3ZlZCBvdXQgZnJvbSB0aGUgdmFsaWRhdG9yCi0gICAgICAvL1N0cmluZyBjbGFzc1ByZWZpeCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJCI7Ci0gICAgICBTdHJpbmcgY2xhc3NQcmVmaXggPSB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSsiLiI7Ci0KLSAgICAgIC8vIFByb2Nlc3MgYXNzZXJ0aW9ucyBmb3IgdGhpcyBhcnRpZmFjdCBhZ2FpbnN0IHRoZSB0YXJnZXQgY29udGV4dAotICAgICAgcHJvY2Vzc0Fzc2VydGlvbnMoY2xhc3NQcmVmaXgsIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHdoZXRoZXIgdGhlIG1lc3NhZ2UgY29ycmVsYXRlcyB0byB0aGUgc2VydmljZSB1bmRlciB0ZXN0LgotICAgKiBVc2UgdGhlIHJlcXVlc3QgcGFydCBvZiB0aGUgcmVxdWVzdC1yZXNwb25zZSBwYWlyLCBmcm9tIHdoaWNoIHRoZSBjb3JyZWxhdGlvbiBvZiB0aGUgcmVzcG9uc2UgaXMgaW1wbGllZC4KLSAgICogRW50aXRpZXMgZnJvbSB0aGUgU2VydmljZSB1bmRlciB0ZXN0IGFyZSBkZXRlcm1pbmVkIG9uY2UgZm9yIGFsbC4KLSAgICogQHBhcmFtIGVudHJ5Q29udGV4dCAgICBhbiBlbnRyeSBjb250ZXh0LgotICAgKiBAcGFyYW0gY29ycmVsYXRpb25UeXBlIGEgY29ycmVsYXRpb24gdHlwZS4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIGNvcnJlbGF0ZXMgdG8gdGhlIHNlcnZpY2UgdW5kZXIgdGVzdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgY29ycmVsYXRpb24gdHlwZSBpcyBub3QgYXBwcm9wcmlhdGUuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gbWVzc2FnZUNvcnJlbGF0ZXNUb1NlcnZpY2UoCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCwKLSAgICBTdHJpbmcgY29ycmVsYXRpb25UeXBlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgVVJJW10gZW5kcG9pbnRzID0gbnVsbDsKLSAgICBib29sZWFuIGNvcnJlbGF0aW9uID0gZmFsc2U7Ci0KLSAgICAvKiBURU1QOiBHZXQgaXQgZnJvbSBhbmFseXplciBjb25maWcgcGFzc2VkIGluIG9uIGluaXQgbWV0aG9kCi0gICAgQ2FuZGlkYXRlSW5mbyBjYW5kaWRhdGUgPSBlbnRyeUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBbmFseXplckNvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENhbmRpZGF0ZUluZm8oKTsKLSAgICAqLwotICAgIENhbmRpZGF0ZUluZm8gY2FuZGlkYXRlID0gYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKTsKLQotICAgIC8vIFNlcnZpY2UgcmVmZXJlbmNlIAotICAgIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSA9IGFuYWx5emVyQ29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCk7Ci0KLSAgICAvLyBHZXQgdGhlIGRlZmluaXRpb24gZWxlbWVudAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGNhbmRpZGF0ZS5nZXRXc2RsRG9jdW1lbnQoKS5nZXREZWZpbml0aW9ucygpOwotCi0gICAgQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLSAgICBpZiAoc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmlzUG9ydCgpKQotICAgIHsKLSAgICAgIC8vIEdldCBzZXJ2aWNlCi0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICBkZWZpbml0aW9uLmdldFNlcnZpY2UoCi0gICAgICAgICAgc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmdldFBhcmVudEVsZW1lbnRRTmFtZSgpKTsKLQotICAgICAgLy8gR2V0IHBvcnQKLSAgICAgIFBvcnQgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0TmFtZSgpKTsKLQotICAgICAgLy8gR2V0IGJpbmRpbmcKLSAgICAgIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmlzQmluZGluZygpKQotICAgIHsKLSAgICAgIC8vIEdldCBiaW5kaW5nCi0gICAgICBiaW5kaW5nID0KLSAgICAgICAgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXRRTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBpZiAoYmluZGluZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoKGVuZHBvaW50cyA9IGhvc3RBbmRQb3J0Q29ycmVsYXRpb24oZW50cnlDb250ZXh0KSkgIT0gbnVsbAotICAgICAgJiYgdXJsUGF0aENvcnJlbGF0aW9uKGVudHJ5Q29udGV4dCwgZW5kcG9pbnRzKSkKLSAgICB7Ci0KLSAgICAgIC8qIElmIGNvcnJlbGF0aW9uIHR5cGUgaXMgImVuZHBvaW50IiwgdGhpcyBpcyBhbGwgdGhlIGNvcnJlbGF0aW9uIHRoYXQgY2FuIGJlIGRvbmUuCi0gICAgICAgKiAoTm90ZSAtIHRoaXMgaXMgaW5jb21wbGV0ZSBjb3JyZWxhdGlvbiBzaW5jZSA+MSBzZXJ2aWNlIGNvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kcG9pbnQuCi0gICAgICAgKiAgVGhlcmVmb3JlICwgaWYgbWVzc2FnZXMgZm9yIGRpZmZlcmVudCBzZXJ2aWNlcyBvbiB0aGUgc2FtZSBlbmRwb2ludCBhcHBlYXIgaW4gdGhlIGxvZyBmaWxlCi0gICAgICAgKiAgYW5kIGNvcnJlbGF0aW9uIHR5cGUgaXMgImVuZHBvaW50IiwgYWxsIHRob3NlIG1lc3NhZ2VzIHdpbGwgYmUgYW5hbHl6ZWQpLgotICAgICAgICovCi0gICAgICBpZiAoY29ycmVsYXRpb25UeXBlCi0gICAgICAgIC5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfQ09SUkVMQVRJT05fVFlQRV9FTkRQT0lOVCkpCi0gICAgICB7Ci0gICAgICAgIGNvcnJlbGF0aW9uID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gYWx3YXlzIGFsbG93IEdFVCByZXF1ZXN0cyByaWdodCB0aHJvdWdoIGlmIHRoZXkndmUgcGFzc2VkIEVuZHBvaW50IENvcnJlbGF0aW9uCi0gICAgICAgIFN0cmluZyByZXF1ZXN0VHlwZSA9IGdldEh0dHBSZXF1ZXN0VHlwZShlbnRyeUNvbnRleHQpOwotICAgICAgICBpZiAoKHJlcXVlc3RUeXBlICE9IG51bGwpICYmIHJlcXVlc3RUeXBlLmVxdWFsc0lnbm9yZUNhc2UoIkdFVCIpKQotICAgICAgICB7Ci0gICAgICAgICAgY29ycmVsYXRpb24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIFRoZSBjb3JyZWxhdGlvblR5cGUgaXMgbm90ICJlbmRwb2ludCIgc28gY29udGludWUgb24gdG8gcHJvY2Vzc2luZyBmb3IgYXQgbGVhc3QgCi0gICAgICAgICAgLy8gIm5hbWVzcGFjZSIgY29ycmVsYXRpb24uLi4KLQotICAgICAgICAgIC8vIGdldCB0aGUgb3BlcmF0aW9uIHNpZ25hdHVyZSAoaW5wdXQgJiBvdXRwdXQpIGZyb20gcmVxdWVzdCAmIHJlc3BvbnNlIG1lc3NhZ2VzLi4uCSAgIAotICAgICAgICAgIC8vIGFuZCBkbyBhIHF1aWNrIERPTSBwYXJzZSAKLSAgICAgICAgICBEb2N1bWVudCByZXF1ZXN0TWVzc2FnZSA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0RG9jdW1lbnQoKTsKLQotICAgICAgICAgIC8vIENoZWNrIGlmIG5hbWVzcGFjZSBpcyBmb3VuZCBpbiByZXF1ZXN0IG1lc3NhZ2Ugb25seQotICAgICAgICAgIGlmIChuYW1lc3BhY2VDb3JyZWxhdGlvbihiaW5kaW5nLCByZXF1ZXN0TWVzc2FnZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSWYgbmFtZXNwYWNlIGZvdW5kIGFuZCB0aGUgY29ycmVsYXRpb24gdHlwZSBpcyBuYW1lc3BhY2UsIHRoZW4gcHJvY2VzcyBtZXNzYWdlcwotICAgICAgICAgICAgaWYgKGNvcnJlbGF0aW9uVHlwZQotICAgICAgICAgICAgICAuZXF1YWxzKFdTSUNvbnN0YW50cy5BVFRSVkFMX0NPUlJFTEFUSU9OX1RZUEVfTkFNRVNQQUNFKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiBvcGVyYXRpb24gaXMgZm91bmQgYW5kIGNvcnJlbGF0aW9uIHR5cGUgaXMgb3BlcmF0aW9uLCB0aGVuIHByb2Nlc3MgbWVzc2FnZXMKLSAgICAgICAgICAgIGVsc2UgaWYgKAotICAgICAgICAgICAgICAob3BlcmF0aW9uQ29ycmVsYXRpb24oYmluZGluZywgcmVxdWVzdE1lc3NhZ2UpKQotICAgICAgICAgICAgICAgICYmIChjb3JyZWxhdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgIC5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfQ09SUkVMQVRJT05fVFlQRV9PUEVSQVRJT04pKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgY29uZmlnIHNjaGVtYSB3YXMgZm9sbG93ZWQgY29ycmVjdGx5Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkJhZCBjb3JyZWxhdGlvbiB0eXBlIGZvdW5kIGluIGNvbmZpZzogIiArIGNvcnJlbGF0aW9uVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvcnJlbGF0aW9uOwotICB9Ci0KLSAgLyoqIAotICAgKiAgQ29ycmVsYXRpb24gQ2hlY2sgMTogU2VydmljZSBEZXNjcmlwdGlvbiBlbmRwb2ludCB2cyBIVFRQIEhlYWRlciAodGVzdCAxKQotICAgKiAgQ2hlY2sgaWYgcmVjZWl2ZXJIb3N0QW5kUG9ydCBmcm9tIHJlcXVlc3QgbWVzc2FnZSBsb2cgbWF0Y2hlcyBob3N0ICYgcG9ydCBmcm9tIFdTREwgU09BUCBiaW5kaW5nIGZvcgotICAgKiAgdGhlIFNlcnZpY2UgdW5kZXIgdGVzdC4KLSAgICogIElmIGl0IGRvZXMgbm90LCBzdG9wIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlIHBhaXIuCi0gICAqIEBwYXJhbSBlbnRyeUNvbnRleHQgYW4gZW50cnkgY29udGV4dC4KLSAgICogQHJldHVybiBpZiByZWNlaXZlckhvc3RBbmRQb3J0IGZyb20gcmVxdWVzdCBtZXNzYWdlIGxvZyBtYXRjaGVzIAotICAgKiAgICAgICAgIGhvc3QgJiBwb3J0IGZyb20gV1NETCBTT0FQIGJpbmRpbmcgZm9yIHRoZSBTZXJ2aWNlLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtIG9jY3VycyBkdXJpbmcgY29ycmVsYXRpb24gY2hlY2suCi0gICAqLwotICBwcml2YXRlIFVSSVtdIGhvc3RBbmRQb3J0Q29ycmVsYXRpb24oRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vIGdldCA8cmVjZWl2ZXJIb3N0QW5kUG9ydD4gZnJvbSByZXF1ZXN0IG1lc3NhZ2UKLSAgICBTdHJpbmcgaHR0cEhvc3RBbmRQb3J0ID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRSZWNlaXZlckhvc3RBbmRQb3J0KCk7Ci0gICAgLy8gU2VhcmNoIGVuZHBvaW50IGxpc3QgZm9yIGEgbWF0Y2ggd2l0aCA8cmVjZWl2ZXJIb3N0QW5kUG9ydD4KLQotICAgIC8qIFRFTVA6IEdldCBpdCBmcm9tIGFuYWx5emVyIGNvbmZpZyBwYXNzZWQgaW4gb24gaW5pdCBtZXRob2QKLSAgICByZXR1cm4gZW50cnlDb250ZXh0LmdldEFuYWx5emVyQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgIC5nZXRDYW5kaWRhdGVJbmZvKCkKLSAgICAgICAgICAgICAgICAgICAgICAgLmdldEVuZFBvaW50cyhodHRwSG9zdEFuZFBvcnQpOwotICAgICovCi0gICAgcmV0dXJuIGFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0RW5kUG9pbnRzKGh0dHBIb3N0QW5kUG9ydCk7Ci0gIH0KLQotICAvKiogCi0gICAqIENvcnJlbGF0aW9uIENoZWNrIDI6IFNlcnZpY2UgRGVzY3JpcHRpb24gZW5kcG9pbnQgdnMgSFRUUCBIZWFkZXIgKHRlc3QgMikKLSAgICogCi0gICAqIFVzZSBhbmFseXplciBjb25maWcgaG9zdCAmIHBvcnQsIHBsdXMgVVJMIHBhdGggKGZyb20gcmVxdWVzdCBtZXNzYWdlIGhlYWRlciBIVFRQIFBPU1QpCi0gICAqIHRvIGxvb2sgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGVuZHBvaW50IGluIHRoZSBTZXJ2aWNlIERlZmluaXRpb24uCi0gICAqIElmIGl0IGRvZXMgbm90LCBzdG9wIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlIHBhaXIuCi0gICAqIEBwYXJhbSBlbnRyeUNvbnRleHQgYW4gZW50cnkgY29udGV4dC4KLSAgICogQHBhcmFtIGVuZHBvaW50cyBhbiBhcnJheSBvZiBlbmRwb2ludHMuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBjb3JyZXNwb25kaW5nIGVuZHBvaW50cyBhcmUgZm91bmQgaW4gdGhlIFNlcnZpY2UgRGVmaW5pdGlvbi4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIGNvcnJlbGF0aW9uIGNoZWNrLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHVybFBhdGhDb3JyZWxhdGlvbigKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0LAotICAgIFVSSVtdIGVuZHBvaW50cykKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vIGNvbXBhcmVzOiBwcm90b2NvbCAobXVzdCBiZSBodHRwIGZvciBQT1NUKSwgaG9zdCwgcG9ydCBhbmQgcGF0aC4KLQotICAgIC8vIGdldCBQT1NUIFVSSSBwYXRoIGZyb20gbWVzc2FnZSB1c2luZyBUb2tlbml6ZXIJCi0gICAgVmVjdG9yIHJlcXVlc3RMaW5lID0KLSAgICAgIGdldEh0dHBSZXF1ZXN0KGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0SFRUUEhlYWRlcnMoKSk7Ci0gICAgaWYgKHJlcXVlc3RMaW5lID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhbiB1bmV4cGVjdGVkIEhUVFAgcmVxdWVzdCB0eXBlICEKLSAgICB9Ci0KLSAgICBTdHJpbmcgcmVxdWVzdFBhdGggPSAoU3RyaW5nKSByZXF1ZXN0TGluZS5nZXQoMSk7Ci0gICAgLy8gUGF0aCBpbW1lZGlhdGVseSBmb2xsb3dzIFBPU1QKLQotICAgIC8vIGNvbXBhcmUgcGF0aCB3aXRoIHRob3NlIGluIHRoZSBwcmV2aW91cyBnZW5lcmF0ZWQgVVJJIGxpc3QJCi0gICAgVmVjdG9yIGZpbHRlcmVkRW5kcG9pbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5kcG9pbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChlbmRwb2ludHNbaV0udG9TdHJpbmcoKS5lbmRzV2l0aChyZXF1ZXN0UGF0aCkpCi0gICAgICB7Ci0gICAgICAgIGZpbHRlcmVkRW5kcG9pbnRzLmFkZChlbmRwb2ludHNbaV0pOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChmaWx0ZXJlZEVuZHBvaW50cy5zaXplKCkgPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIHRoaXMgVVJJIHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIFdTREwgLSB0aGVyZSBzaG91bGQgYmUgYXQgbW9zdCBvbmUgbWF0Y2gKLSAgICAvLyBidXQgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUsIHRoYXQncyBzdWZmaWNpZW50IHRvIGFjY2VwdCB0aGUgbWVzc2FnZQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiogCi0gICAqIENvcnJlbGF0aW9uIENoZWNrIDM6IFNlcnZpY2UgRGVzY3JpcHRpb24gbmFtZXNwYWNlLgotICAgKiAKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSBTZXJ2aWNlIERlc2NyaXB0aW9uIGRlY2xhcmVzIHRoZSBuYW1lc3BhY2UgdGhhdCBhcHBlYXJzIGluIHRoZSAocmVxdWVzdD8pIG1lc3NhZ2Ugc29hcCBib2R5LgotICAgKiBMb2NhdGlvbiBvZiByZWxldmVudCBuYW1lc3BhY2UgOgotICAgKiBPcGVyYXRpb24gdHlwZSAgICAgICAgICAgICAgICAgICAgCS0gTWVzc2FnZSBOYW1lc3BhY2U6IChjb21wYXJlIHdpdGgpICBTZXJ2aWNlIERlZmluaXRpb24gTmFtZXNwYWNlOgotICAgKiAoZnJvbSBtZXNzYWdlPyBlbmRwb2ludD8gd2hlcmU/KQotICAgKiBycGMtbGl0ZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICZsdDtzb2FwOkJvZHkmZ3Q7IGNoaWxkIG5hbWVzcGFjZS4gICAgICAgICZsdDtzb2FwYmluZDpib2R5Jmd0OyBuYW1lc3BhY2UuCi0gICAqIGRvYy1saXRlcmFsCQkJICAgICAgICAgICAgICAgICAmbHQ7c29hcDpCb2R5Jmd0OyBjaGlsZCBuYW1lc3BhY2UuICAgICAgIHRhcmdldE5hbWVTcGFjZSBvZiBzY2hlbWEgdGhhdAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lcyAgJmx0O3NvYXA6Ym9keSZndDsgY2hpbGQuCi0gICAqIElmIGl0IGRvZXNuJ3QgbWF0Y2gsIHN0b3AgcHJvY2Vzc2luZyB0aGlzIG1lc3NhZ2UgcGFpci4KLSAgICogQHBhcmFtIGJpbmRpbmcgYSBiaW5kaW5nLgotICAgKiBAcGFyYW0gcmVxdWVzdCBhIHJlcXVlc3QuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBkZXNjcmlwdGlvbiBkZWNsYXJlZCBpbiB0aGUgZGVzY3JpcHRpb24gYXJlIHRoZSAKLSAgICogICAgICAgICBzYW1lIGFzIHRob3NlIHRoYXQgYXBwZWFyIGluIHRoZSBtZXNzYWdlIHNvYXAgYm9keS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIGNvcnJlbGF0aW9uY2hlY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBuYW1lc3BhY2VDb3JyZWxhdGlvbihCaW5kaW5nIGJpbmRpbmcsIERvY3VtZW50IHJlcXVlc3QpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBuYW1lc3BhY2VGb3VuZCA9IGZhbHNlOwotICAgIFN0cmluZyBiaW5kaW5nU3R5bGUgPSBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DOwotCi0gICAgLy8gR2V0IG9wZXJhdGlvbiBuYW1lc3BhY2UgZnJvbSB0aGUgcmVxdWVzdCBzb2FwIG1lc3NhZ2UKLSAgICBTdHJpbmcgc29hcE9wTlMgPSBnZXRTb2FwQm9keUNoaWxkKHJlcXVlc3QpLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgLy8gR2V0IHNvYXBiaW5kOmJpbmRpbmcKLSAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IG51bGw7Ci0gICAgaWYgKChzb2FwQmluZGluZyA9IFdTRExVdGlscy5nZXRTb2FwQmluZGluZyhiaW5kaW5nKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiaW5kaW5nU3R5bGUgPSBzb2FwQmluZGluZy5nZXRTdHlsZSgpOwotICAgIH0KLQotICAgIC8vIEdvIHRocm91Z2ggZWFjaCBvcGVyYXRpb24gaW4gdGhlIGJpbmRpbmcgYW5kIGNoZWNrIGZvciBuYW1lc3BhY2UgbWF0Y2gKLSAgICBJdGVyYXRvciBvcGVyYXRpb25zID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpICYmICEobmFtZXNwYWNlRm91bmQpKQotICAgIHsKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsKLQotICAgICAgLy8gSWYgcnBjLWxpdGVyYWwsIHRoZW4gbG9vayBhdCBuYW1lc3BhY2UgYXR0cmlidXRlIG9uIHNvYXBiaW5kOmJvZHkKLSAgICAgIGlmIChXU0RMVXRpbHMuaXNScGNMaXRlcmFsKGJpbmRpbmdTdHlsZSwgYmluZGluZ09wZXJhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCBzb2FwYmluZDpib2R5IGVsZW1lbnQgCi0gICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gV1NETFV0aWxzLmdldElucHV0U29hcEJvZHkoYmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICAgICAgaWYgKChzb2FwQm9keS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKQotICAgICAgICAgICYmIChzb2FwQm9keS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoc29hcE9wTlMpKSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVzcGFjZUZvdW5kID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiBkb2MtbGl0ZXJhbCwgdGhlbiBjaGVjayBuYW1lc3BhY2UKLSAgICAgIGVsc2UgaWYgKFdTRExVdGlscy5pc0RvY0xpdGVyYWwoYmluZGluZ1N0eWxlLCBiaW5kaW5nT3BlcmF0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgaW50IHBhcnRDb3VudDsKLSAgICAgICAgSXRlcmF0b3IgcGFydHNJdGVyYXRvciA9IG51bGw7Ci0KLSAgICAgICAgLy8gR2V0IGZpcnN0IHBhcnQgbmFtZSBmcm9tIHNvYXBiaW5kOmJvZHkgZWxlbWVudCBwYXJ0cyBhdHRyaWJ1dGUKLSAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gZ2V0Rmlyc3RQYXJ0TmFtZShiaW5kaW5nT3BlcmF0aW9uKTsKLQotICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgcGFydHMgZnJvbSB0aGUgbWVzc2FnZSAgICAgICAgICAgCi0gICAgICAgIE1hcCBwYXJ0c01hcCA9IG51bGw7Ci0gICAgICAgIGlmICgocGFydHNNYXAgPQotICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCkuZ2V0UGFydHMoKSkKLSAgICAgICAgICAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcGFydHNJdGVyYXRvciA9IHBhcnRzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAvLyBJZiB0aGUgcGFydCBuYW1lIHdhc24ndCBzcGVjaWZpZWQgb24gdGhlIHNvYXBiaW5kOmJvZHkgZWxlbWVudCwgdGhlbiBwcm9jZXNzIGp1c3QgdGhlIGZpcnN0IG9uZQotICAgICAgICAgIGlmIChwYXJ0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcGFydENvdW50ID0gMTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBwYXJ0Q291bnQgPSBwYXJ0c01hcC5zaXplKCk7Ci0KLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRDb3VudCAmJiAhbmFtZXNwYWNlRm91bmQ7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBHZXQgbmV4dCBwYXJ0Ci0gICAgICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgcGFydHNJdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHBhcnQgbmFtZSBtYXRjaGVzIG9yIHRoZXJlIGlzIG5vIHBhcnQgbmFtZSwgdGhlbiBjaGVjayBuYW1lc3BhY2UKLSAgICAgICAgICAgIGlmICgocGFydE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgfHwgKChwYXJ0TmFtZSAhPSBudWxsKSAmJiAocGFydC5nZXROYW1lKCkuZXF1YWxzKHBhcnROYW1lKSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoKHBhcnQuZ2V0RWxlbWVudE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIChwYXJ0LmdldEVsZW1lbnROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHNvYXBPcE5TKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmFtZXNwYWNlRm91bmQ7Ci0gIH0KLQotICAvKiogCi0gICogQ29ycmVsYXRpb24gQ2hlY2sgNCA6IFNlcnZpY2UgRGVzY3JpcHRpb24gIm9wZXJhdGlvbiIKLSAgKgotICAqIENoZWNrIGlmIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF0Y2hlcyBhbnkgb2YgdGhlIGNhbmRpZGF0ZSBvcGVyYXRpb24gZGVmaW5pdGlvbnMgCi0gICogZm9yIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGluIHRoZSBTZXJ2aWNlIERlc2NyaXB0aW9uLgotICAqICAKLSAgKiBGb3IgYm90aCByZXF1ZXN0IGFuZCByZXNwb25zZSwgbG9vayBmb3IgdGhlIHNvYXAgYm9keSBjaGlsZCBlbGVtZW50IG5hbWUKLSAgKiBpbiB0aGUgbGlzdCBvZiBjYW5kaWRhdGUgb3BlcmF0aW9uIG5hbWVzLgotICAqIEBwYXJhbSBiaW5kaW5nICAgICAgICBhIGJpbmRpbmcuCi0gICogQHBhcmFtIHJlcXVlc3RNZXNzYWdlIGEgcmVxdWVzdCBtZXNzYWdlLgotICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBjb250ZW50IG1hdGNoZXMgYW55IG9mIHRoZSBjYW5kaWRhdGUgCi0gICogICAgICAgICBvcGVyYXRpb24gZGVmaW5pdGlvbnMgZm9yIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGluIHRoZSAKLSAgKiAgICAgICAgIFNlcnZpY2UgRGVzY3JpcHRpb24uCi0gICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIGNvcnJlbGF0aW9uY2hlY2suCi0gICovCi0gIHByaXZhdGUgYm9vbGVhbiBvcGVyYXRpb25Db3JyZWxhdGlvbigKLSAgICBCaW5kaW5nIGJpbmRpbmcsCi0gICAgRG9jdW1lbnQgcmVxdWVzdE1lc3NhZ2UpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBvcGVyYXRpb25Gb3VuZCA9IGZhbHNlOwotCi0gICAgU3RyaW5nIGJpbmRpbmdTdHlsZSA9IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0M7Ci0KLSAgICAvLyBHZXQgc29hcGJpbmQ6YmluZGluZwotICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gbnVsbDsKLSAgICBpZiAoKHNvYXBCaW5kaW5nID0gV1NETFV0aWxzLmdldFNvYXBCaW5kaW5nKGJpbmRpbmcpKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJpbmRpbmdTdHlsZSA9IHNvYXBCaW5kaW5nLmdldFN0eWxlKCk7Ci0gICAgfQotCi0gICAgLy8gR2V0IHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50IGZyb20gdGhlIHNvYXAgYm9keQotICAgIEVsZW1lbnQgc29hcEJvZHlDaGlsZCA9IGdldFNvYXBCb2R5Q2hpbGQocmVxdWVzdE1lc3NhZ2UpOwotCi0gICAgLy8gSWYgdGhlcmUgaXMgYSBjaGlsZCBlbGVtZW50LCB0aGVuIGNoZWNrIGl0Ci0gICAgaWYgKHNvYXBCb2R5Q2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBHZXQgb3BlcmF0aW9uIG5hbWUgZnJvbSB0aGUgc29hcDpib2R5Ci0gICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IHNvYXBCb2R5Q2hpbGQuZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgIC8vIEdldCBvcGVyYXRpb24gUU5hbWUKLSAgICAgIFFOYW1lIG9wZXJhdGlvblFOYW1lID0KLSAgICAgICAgbmV3IFFOYW1lKHNvYXBCb2R5Q2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCksIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAvLyBHbyB0aHJvdWdoIGVhY2ggb3BlcmF0aW9uIGluIHRoZSBiaW5kaW5nIGFuZCBjaGVjayBmb3IgbmFtZXNwYWNlIG1hdGNoCi0gICAgICBJdGVyYXRvciBvcGVyYXRpb25zID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkgJiYgIShvcGVyYXRpb25Gb3VuZCkpCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9Ci0gICAgICAgICAgKEJpbmRpbmdPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOwotCi0gICAgICAgIC8vIElmIHJwYy1saXRlcmFsLCB0aGVuIGxvb2sgYXQgbmFtZXNwYWNlIGF0dHJpYnV0ZSBvbiBzb2FwYmluZDpib2R5Ci0gICAgICAgIGlmIChXU0RMVXRpbHMuaXNScGNMaXRlcmFsKGJpbmRpbmdTdHlsZSwgYmluZGluZ09wZXJhdGlvbikpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXQgc29hcGJpbmQ6Ym9keSBlbGVtZW50IAotICAgICAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKS5lcXVhbHMob3BlcmF0aW9uTmFtZSkpCi0gICAgICAgICAgICBvcGVyYXRpb25Gb3VuZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBkb2MtbGl0ZXJhbCwgdGhlbiBjaGVjayBuYW1lc3BhY2UKLSAgICAgICAgZWxzZSBpZiAoV1NETFV0aWxzLmlzRG9jTGl0ZXJhbChiaW5kaW5nU3R5bGUsIGJpbmRpbmdPcGVyYXRpb24pKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IHBhcnRDb3VudDsKLSAgICAgICAgICBJdGVyYXRvciBwYXJ0c0l0ZXJhdG9yID0gbnVsbDsKLQotICAgICAgICAgIC8vIEdldCBmaXJzdCBwYXJ0IG5hbWUgZnJvbSBzb2FwYmluZDpib2R5IGVsZW1lbnQgcGFydHMgYXR0cmlidXRlCi0gICAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gZ2V0Rmlyc3RQYXJ0TmFtZShiaW5kaW5nT3BlcmF0aW9uKTsKLQotICAgICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBwYXJ0cyBmcm9tIHRoZSBtZXNzYWdlICAgICAgICAgICAKLSAgICAgICAgICBNYXAgcGFydHNNYXAgPSBudWxsOwotICAgICAgICAgIGlmICgocGFydHNNYXAgPQotICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKS5nZXRQYXJ0cygpKQotICAgICAgICAgICAgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJ0c0l0ZXJhdG9yID0gcGFydHNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIHBhcnQgbmFtZSB3YXNuJ3Qgc3BlY2lmaWVkIG9uIHRoZSBzb2FwYmluZDpib2R5IGVsZW1lbnQsIHRoZW4gcHJvY2VzcyBqdXN0IHRoZSBmaXJzdCBvbmUKLSAgICAgICAgICAgIGlmIChwYXJ0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICBwYXJ0Q291bnQgPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBwYXJ0Q291bnQgPSBwYXJ0c01hcC5zaXplKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydENvdW50ICYmICFvcGVyYXRpb25Gb3VuZDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBHZXQgbmV4dCBwYXJ0Ci0gICAgICAgICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBwYXJ0c0l0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgICAvLyBJZiBwYXJ0IG5hbWUgbWF0Y2hlcyBvciB0aGVyZSBpcyBubyBwYXJ0IG5hbWUsIHRoZW4gY2hlY2sgbmFtZXNwYWNlCi0gICAgICAgICAgICAgIGlmICgocGFydE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB8fCAoKHBhcnROYW1lICE9IG51bGwpICYmIChwYXJ0LmdldE5hbWUoKS5lcXVhbHMocGFydE5hbWUpKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKHBhcnQuZ2V0RWxlbWVudE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgJiYgKHBhcnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMob3BlcmF0aW9uUU5hbWUpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBvcGVyYXRpb25Gb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gR28gdGhyb3VnaCBlYWNoIG9wZXJhdGlvbiB0byBmaW5kIGEgbWF0Y2gKLSAgICByZXR1cm4gb3BlcmF0aW9uRm91bmQ7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGZhaWx1cmUgZGV0YWlsLgotICAgKiBAcGFyYW0gbWVzc2FnZSAgICAgICBhIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBlbnRyeUNvbnRleHQgIGFuIGVudHJ5IGNvbnRleHQuCi0gICAqIEByZXR1cm4gZmFpbHVyZSBkZXRhaWwuCi0gICAqLwotICBwdWJsaWMgRmFpbHVyZURldGFpbCBjcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gIHsKLSAgICBGYWlsdXJlRGV0YWlsIGZhaWx1cmVEZXRhaWwgPSByZXBvcnRlci5jcmVhdGVGYWlsdXJlRGV0YWlsKCk7Ci0gICAgZmFpbHVyZURldGFpbC5zZXRGYWlsdXJlTWVzc2FnZShtZXNzYWdlKTsKLSAgICBmYWlsdXJlRGV0YWlsLnNldEVsZW1lbnRMb2NhdGlvbigKLSAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRFbGVtZW50TG9jYXRpb24oKSk7Ci0gICAgcmV0dXJuIGZhaWx1cmVEZXRhaWw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwjaXNOb3RBcHBsaWNhYmxlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdEFwcGxpY2FibGUoVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uKQotICB7Ci0gICAgYm9vbGVhbiBub3RBcHBsaWNhYmxlID0gZmFsc2U7Ci0KLSAgICAvLyBJZiB0aGUgYWRkaXRpb25hbCBlbnRyeSBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIHNldCBub3RBcHBsaWNhYmxlCi0gICAgaWYgKHRlc3RBc3NlcnRpb24uZ2V0QWRkaXRpb25hbEVudHJ5VHlwZUxpc3QoKS5nZXRXU0RMSW5wdXQoKSAhPSBudWxsCi0gICAgICAmJiAhdGVzdEFzc2VydGlvbi5nZXRBZGRpdGlvbmFsRW50cnlUeXBlTGlzdCgpLmdldFdTRExJbnB1dCgpLmVxdWFscygibm9uZSIpCi0gICAgICAmJiBhbmFseXplckNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZSgpLmdldFdTRExMb2NhdGlvbigpID09IG51bGwpCi0gICAgewotICAgICAgbm90QXBwbGljYWJsZSA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5vdEFwcGxpY2FibGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXQgUE9TVCByZXF1ZXN0LgotICAgKiBAcGFyYW0gaHR0cEhlYWRlciBhbiBIVFRQIAotICAgKiBAcmV0dXJuIFBPU1QgcmVxdWVzdC4KLSAgICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0UG9zdFJlcXVlc3QoU3RyaW5nIGh0dHBIZWFkZXIpCi0gIHsKLSAgICAvL1JlcXVlc3QtTGluZSAgID0gTWV0aG9kIFNQIFJlcXVlc3QtVVJJIFNQIEhUVFAtVmVyc2lvbiBDUkxGCi0gICAgVmVjdG9yIHJlcXVlc3RMaW5lID0gbmV3IFZlY3RvcigpOwotICAgIFN0cmluZyBzdGFydExpbmUgPSBudWxsOwotCi0gICAgU3RyaW5nVG9rZW5pemVyIGh0dHBNZXNzYWdlVG9rZW5pemVyID0KLSAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoaHR0cEhlYWRlciwgIlxuXHJcZiIpOwotCi0gICAgaWYgKGh0dHBNZXNzYWdlVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICBzdGFydExpbmUgPSBodHRwTWVzc2FnZVRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhcnRMaW5lLnN0YXJ0c1dpdGgoIlBPU1QiKSkKLSAgICB7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3RhcnRMaW5lVG9rZW5pemVyID0KLSAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihzdGFydExpbmUsICJcdTAwMjAiKTsKLSAgICAgIHdoaWxlIChzdGFydExpbmVUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgewotICAgICAgICByZXF1ZXN0TGluZS5hZGQoc3RhcnRMaW5lVG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlcXVlc3RMaW5lOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBIVFRQIHJlcXVlc3QuCi0gICAqIEBwYXJhbSBodHRwSGVhZGVyIGFuIEhUVFAgCi0gICAqIEByZXR1cm4gSFRUUCByZXF1ZXN0LgotICAqLwotICBwcml2YXRlIFZlY3RvciBnZXRIdHRwUmVxdWVzdChTdHJpbmcgaHR0cEhlYWRlcikKLSAgewotICAgIC8vUmVxdWVzdC1MaW5lICAgPSBNZXRob2QgU1AgUmVxdWVzdC1VUkkgU1AgSFRUUC1WZXJzaW9uIENSTEYKLSAgICBWZWN0b3IgcmVxdWVzdExpbmUgPSBuZXcgVmVjdG9yKCk7Ci0gICAgU3RyaW5nIHN0YXJ0TGluZSA9IG51bGw7Ci0KLSAgICBTdHJpbmdUb2tlbml6ZXIgaHR0cE1lc3NhZ2VUb2tlbml6ZXIgPQotICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihodHRwSGVhZGVyLCAiXG5cclxmIik7Ci0KLSAgICBpZiAoaHR0cE1lc3NhZ2VUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIHN0YXJ0TGluZSA9IGh0dHBNZXNzYWdlVG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgIH0KLQotICAgIGlmIChzdGFydExpbmUuc3RhcnRzV2l0aCgiUE9TVCIpIHx8IHN0YXJ0TGluZS5zdGFydHNXaXRoKCJHRVQiKSkKLSAgICB7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3RhcnRMaW5lVG9rZW5pemVyID0KLSAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihzdGFydExpbmUsICJcdTAwMjAiKTsKLSAgICAgIHdoaWxlIChzdGFydExpbmVUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgewotICAgICAgICByZXF1ZXN0TGluZS5hZGQoc3RhcnRMaW5lVG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlcXVlc3RMaW5lID0gbnVsbDsgLy8gc2lnbmlmeSBub3QgUE9TVCBvciBHRVQKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVxdWVzdExpbmU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IEhUVFAgcmVxdWVzdCB0eXBlLgotICAgKiBAcGFyYW0gZW50cnlDb250ZXh0IGFuIGVudHJ5IGNvbnRleHQuCi0gICAqIEByZXR1cm4gSFRUUCByZXF1ZXN0IHR5cGUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRIdHRwUmVxdWVzdFR5cGUoRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgewotICAgIC8vUmVxdWVzdC1MaW5lICAgPSBNZXRob2QgU1AgUmVxdWVzdC1VUkkgU1AgSFRUUC1WZXJzaW9uIENSTEYKLQotICAgIFN0cmluZyBodHRwSGVhZGVyID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRIVFRQSGVhZGVycygpOwotICAgIFN0cmluZyBodHRwUmVxdWVzdFR5cGUgPSBudWxsOwotICAgIFN0cmluZyBzdGFydExpbmUgPSBudWxsOwotCi0gICAgU3RyaW5nVG9rZW5pemVyIGh0dHBNZXNzYWdlVG9rZW5pemVyID0KLSAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoaHR0cEhlYWRlciwgIlxuXHJcZiIpOwotCi0gICAgaWYgKGh0dHBNZXNzYWdlVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICBzdGFydExpbmUgPSBodHRwTWVzc2FnZVRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdGFydExpbmVUb2tlbml6ZXIgPQotICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKHN0YXJ0TGluZSwgIlx1MDAyMCIpOwotICAgICAgaWYgKHN0YXJ0TGluZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICB7Ci0gICAgICAgIGh0dHBSZXF1ZXN0VHlwZSA9IHN0YXJ0TGluZVRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGh0dHBSZXF1ZXN0VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhlIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBmb3IgYSBvbmUtd2F5IG9wZXJhdGlvbi4KLSAgICogQHBhcmFtIGVudHJ5Q29udGV4dCBhbiBlbnRyeSBjb250ZXh0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBmb3IgYSBvbmUtd2F5IG9wZXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzT25lV2F5UmVzcG9uc2UoRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgewotICAgIGJvb2xlYW4gb25ld2F5ID0gZmFsc2U7Ci0KLSAgICAvLyBURU1QOiBJZiB0aGlzIGlzIGEgcmVzcG9uc2UgbWVzc2FnZSBhbmQgdGhlcmUgaXMgbm8gY29udGVudCwgdGhlbiBzZXQgb25lLXdheSB0byB0cnVlCi0gICAgLy8gVEVNUDogTmVlZCB0byBmaW5kIGEgd2F5IHRvIGRldGVybWluZSBpZiB0aGUgcmVzcG9uc2UgaXMgZm9yIGEgb25lLXdheSBtZXNzYWdlCi0gICAgaWYgKGVudHJ5Q29udGV4dAotICAgICAgLmdldE1lc3NhZ2VFbnRyeSgpCi0gICAgICAuZ2V0VHlwZSgpCi0gICAgICAuZXF1YWxzSWdub3JlQ2FzZShNZXNzYWdlRW50cnkuVFlQRV9SRVNQT05TRSkKLSAgICAgICYmIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICBvbmV3YXkgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBvbmV3YXk7Ci0gIH0KLQotICAvKioKLSAgICogbWVzc2FnZUlzRG9jTGl0U2NoZW1hVmFsaWQuCi0gICAqCi0gICAqIFZhbGlkYXRlcyB0aGUgZG9jLWxpdCBtZXNzYWdlcyBhZ2FpbnN0IHRoZSBzY2hlbWEgZm91bmQgaW4gYSBjYW5kaWRhdGUgd3NkbCBkb2N1bWVudC4KLSAgICoKLSAgICogSWRlbnRpZnkgKG9yIGJlIGdpdmVuKSBhIHJlZmVyZW5jZSBpbiB0aGUgd3NkbCB0byBlbGVtZW50cyAoZm91bmQgaW4gJmx0O3dzZGw6dHlwZXMmZ3Q7Jmx0O3NjaGVtYSZndDsuLi4pCi0gICAqIHRoYXQgYXJlIGltbWVkaWF0ZSBjaGlsZHJlbiBlbGVtZW50cyBpbiB0aGUgc29hcCBib2R5LgotICAgKiBAcGFyYW0gZW50cnlDb250ZXh0IGFuIGVudHJ5IGNvbnRleHQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZG9jdW1lbnQgbGl0ZXJhbCBtZXNzYWdlIGlzIGNvbXBsaWFudCB0byB0aGUgCi0gICAqICAgICAgICAgc2NoZW1hIGZvdW5kIGluIGEgY2FuZGlkYXRlIFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcGFyc2luZyBwcm9ibGVtIGR1cmluZyB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gbWVzc2FnZUlzRG9jTGl0U2NoZW1hVmFsaWQoRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCB1c2UgYSB2YWxpZGF0aW5nIHBhcnNlciB0aGF0IGlzIGNhcGFibGUgb2YgYWNjZXBwdGluZyBtdWx0aXBsZSBzY2hlbWEgcmVmZXJlbmNlcwotICAgIC8vIHByb2dyYW1tYXRpY2FsbHkuIFRoZW4sIGV2ZXJ5IHNjaGVtYSBpbiBjYW5kaWRhdGUgd3NkbCBjYW4gYmUgcGFzc2VkIGluIHRvIHRoZSB2YWxpZGF0b3IuIFRoaXMgYXZvaWRzIHRoZQotICAgIC8vIG5lZWQgdG8gcGlucG9pbnQgYSBwYXJ0aWN1bGFyIHNjaGVtYSBlbGVtZW50IGZyb20gYWxsIGNhbmRpZGF0ZSB3c2RsOnR5cGVzLCBjb3JyZXNwb25kaW5nIHRvIHRoZSAKLSAgICAvLyB3c2RsOm9wZXJhdGlvbiBiZWluZyB1c2VkLiBUaGUgcGlucG9pbnRpbmcgaXMgYW4gaW5jb21wbGV0ZSB3b3JrYXJvdW5kIGZvciBwYXJzZXJzIG5vdCBjYXBhYmxlIAotICAgIC8vIG9mIGFjY2VwdGluZyBhcnJheXMgb2Ygc2NlaG1hIHJlZmVyZW5jZXMgCi0gICAgLy8gWyBpLmUuIHRoZSBET00gZmFjdG9yeS5zZXRBdHRyaWJ1dGUoSkFYUF9TQ0hFTUEgU09VUkNFLCBPYmplY3RbXSB7Li4ufSkgXQotICAgIC8vIGdldCBhbGwgeHM6c2NoZW1hIGZyb20gYWxsIGNhbmRpZGF0ZSB3c2RsOnR5cGVzICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyBhZGQgZWFjaCA8c2NoZW1hPiB0byBhbiBhcnJheSBhbmQgcGFzcyB0aGlzIGFycmF5IHRvIHRoZSB2YWxpZGF0aW5nIHBhcnNlcgotICAgIC8vIHdoZW4gdmFsaWRhdGluZyB0aGUvZWFjaCBzb2FwIGJvZHkgY2hpbGQuCi0KLSAgICAvLyB1c2UgdGhlIHJlZmVyZW5jZWQgV1NETCBmaWxlIGFuZCBpdHMgaW1wb3J0ZWQgZmlsZXMgdG8gZmluZCBzY2hlbWFzCi0gICAgTGlzdCBzY2hlbWFXU0RMcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBMaXN0IGlubGluZVNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgTGlzdCBzY2hlbWFTdHJpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgRGVmaW5pdGlvbltdIGFsbERlZnMgPQotICAgICAgYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXREZWZpbml0aW9ucygpOwotICAgIGZvciAoaW50IHRoaXNEZWYgPSAwOyB0aGlzRGVmIDwgYWxsRGVmcy5sZW5ndGg7IHRoaXNEZWYrKykKLSAgICB7Ci0gICAgICBzY2hlbWFXU0RMcy5hZGQoYWxsRGVmc1t0aGlzRGVmXS5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0gICAgfQotICAgIEl0ZXJhdG9yIGZpbGVJdGVyYXRvciA9IHNjaGVtYVdTRExzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGZpbGVJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgLy8gcGFyc2UgZmlsZSBpZiBwb3NzaWJsZQotICAgICAgRG9jdW1lbnQgd3NkbERvYyA9IG51bGw7Ci0gICAgICBTdHJpbmcgd3NkbFVSSSA9IChTdHJpbmcpIGZpbGVJdGVyYXRvci5uZXh0KCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgd3NkbERvYyA9IFhNTFV0aWxzLnBhcnNlWE1MRG9jdW1lbnRVUkwod3NkbFVSSSwgbnVsbCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgRWxlbWVudCByb290ID0gd3NkbERvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIC8vIGZpbmQgdGhlIHNjaGVtYQotICAgICAgTm9kZUxpc3Qgc2NoZW1hRWxlbWVudHMgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgIFdTSVRhZy5FTEVNX1hTRF9TQ0hFTUEuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgIFdTSVRhZy5FTEVNX1hTRF9TQ0hFTUEuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICBmb3IgKGludCBlbGVtID0gMDsgZWxlbSA8IHNjaGVtYUVsZW1lbnRzLmdldExlbmd0aCgpOyBlbGVtKyspCi0gICAgICB7ICAgICAKLSAgICAgICAgRWxlbWVudCBzY2hlbWEgPSAoRWxlbWVudCkgc2NoZW1hRWxlbWVudHMuaXRlbShlbGVtKTsKLSAgICAgICAgLy8gY29weWluZyBhbGwgdGhlIE5TIGRlY2xhcmF0aW9ucyBmcm9tIHdzZGw6ZGVmaW5pdGlvbnMgd3NkbDp0eXBlcwotICAgICAgICBjb3B5TlNEZWNsYXJhdGlvbnMocm9vdCwgc2NoZW1hKTsKLSAgICAgICAgY29weU5TRGVjbGFyYXRpb25zKChFbGVtZW50KSBzY2hlbWEuZ2V0UGFyZW50Tm9kZSgpLCBzY2hlbWEpOwotICAgICAgICAvLyBSZXBsYWNpbmcgYWxsIHJlbGF0aXZlIHNjaGVtYUxvY2F0aW9uIFVSSXMgd2l0aCBhYnNvbHV0ZSBvbmVzCi0gICAgICAgIHJlcGxhY2VSZWxhdGl2ZVVSSXMoc2NoZW1hLCB3c2RsVVJJKTsKLSAgICAgICAgaW5saW5lU2NoZW1hcy5hZGQoc2NoZW1hKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3RlIHRoYXQgdGhlIFhlcmNlcyBwYXJzZXIgT05MWSBhY2NlcHRzIGFuIGFycmF5Ci0gICAgLy8gb2Ygc2NoZW1hcyB3aXRoIHVuaXF1ZSBuYW1lc3BhY2VzLgotICAgIGlmICghZHVwbGljYXRlTmFtZXNwYWNlc0RldGVjdGVkKGlubGluZVNjaGVtYXMpKQotICAgIHsKLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgc2NoZW1hIGVsZW1lbnRzIGluc2lkZSB0aGUgVHlwZXMsIHRoZW4gdXNlIHRoaXMgYXMKLSAgICAgIC8vIHRoZSBzY2hlbWEgc3RyaW5nIGZvciB0aGUgdmFsaWRhdGlvbgotICAgICAgSXRlcmF0b3IgaSA9IGlubGluZVNjaGVtYXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAJRWxlbWVudCBzY2hlbWEgPSAoRWxlbWVudClpLm5leHQoKTsgCi0gICAgICAgIFN0cmluZyBzY2hlbWFTdHJpbmcgPSBET00yV3JpdGVyLm5vZGVUb1N0cmluZyhzY2hlbWEpOwotICAgICAgICBzY2hlbWFTdHJpbmdzLmFkZChzY2hlbWFTdHJpbmcpOwotICAgICAgfQotCi0gICAgICBOb2RlTGlzdCBlbGVtZW50TGlzdCA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpCi0gICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFdTSVRhZy5FTEVNX1NPQVBfQk9EWS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgIFdTSVRhZy5FTEVNX1NPQVBfQk9EWS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICBpZiAoZWxlbWVudExpc3QgPT0gbnVsbCB8fCBlbGVtZW50TGlzdC5nZXRMZW5ndGgoKSAhPSAxKQotICAgICAgewotICAgICAgICAvLyBzaG91bGQgb25seSBiZSBhIHNpbmdsZSBzb2FwIGJvZHkgIQotICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHByb2JhYmx5IGFuIGVycm9yIGNvbmRpdGlvbiB0aG91Z2gKLSAgICAgIH0KLQotICAgICAgTm9kZUxpc3Qgc29hcEJvZHlDaGlsZExpc3QgPSAoKEVsZW1lbnQpZWxlbWVudExpc3QuaXRlbSgwKSkuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgZm9yIChpbnQgY2hpbGQgPSAwOyBjaGlsZCA8IHNvYXBCb2R5Q2hpbGRMaXN0LmdldExlbmd0aCgpOyBjaGlsZCsrKQotICAgICAgewotICAgICAgICBOb2RlIHNvYXBCb2R5Q2hpbGQgPSBzb2FwQm9keUNoaWxkTGlzdC5pdGVtKGNoaWxkKTsKLSAgICAgICAgaWYgKHNvYXBCb2R5Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGRvIGFsbCBmb3Igbm93Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgLy8gV3JpdGUgb3V0IGVsZW1lbnQgdHJlZSB0byBTdHJpbmcKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlQ29udGVudCA9IERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKHNvYXBCb2R5Q2hpbGQpOwotICAgICAgICAgICAgLy8gcGFyc2UgdGhlIGNoaWxkIGVsZW1lbnQsIHZhbGlkYXRpbmcgYWdhaW5zdCB0aGUgc2NoZW1hIAotICAgICAgICAgICAgWE1MVXRpbHMucGFyc2VYTUwobWVzc2FnZUNvbnRlbnQsIHNjaGVtYVN0cmluZ3MpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBTQVhFeGNlcHRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIHZhbGlkYXRpb24gZmFpbGVkCi0gICAgICAgICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIlZhbGlkYXRpbmcgUGFyc2luZyBwcm9ibGVtIiwgZSk7Ci0gICAgICAgICAgICAvLyBCYWQgdGhpbmdzIGhhdmUgaGFwcGVuZWQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogQ29weSB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucy4KLSAgICogQHBhcmFtIHBhcmVudCBhIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjaGlsZCBhIHN0cmlwcGVkIG1lc3NhZ2UuCi0gICAqLwotICBwcml2YXRlIHZvaWQgY29weU5TRGVjbGFyYXRpb25zKEVsZW1lbnQgcGFyZW50LCBFbGVtZW50IGNoaWxkKQotICB7Ci0gICAgTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBwYXJlbnQuZ2V0QXR0cmlidXRlcygpOwotICAgIGZvciAoaW50IG5vZGVJZCA9IDA7IG5vZGVJZCA8IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7IG5vZGVJZCsrKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IG5vZGVNYXAuaXRlbShub2RlSWQpOwotCi0gICAgICBpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgICAgICAmJiAobm9kZS5nZXROb2RlTmFtZSgpLnN0YXJ0c1dpdGgoInhtbG5zOiIpKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgICAvLyBJZiBhbiBOUyBiZWluZyBjb3BpZWQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBjaGlsZCBlbGVtZW50IGhhcywgY29weSBpdAotICAgICAgICBpZiAoIWNoaWxkLmdldE5vZGVOYW1lKCkuc3RhcnRzV2l0aCgKLSAgICAgICAgICBub2RlTmFtZS5zdWJzdHJpbmcobm9kZU5hbWUuaW5kZXhPZigiOiIpICsgMSkgKyAiOiIpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG5vZGVWYWx1ZSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKG5vZGUuZ2V0Tm9kZU5hbWUoKSwgbm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVwbGFjZXMgYWxsIHJlbGF0aXZlIFVSSXMgZm9yIHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZXMuCi0gICAqIEBwYXJhbSBzY2hlbWEgYW4geHNkOnNjaGVtYSBlbGVtZW50LgotICAgKiBAcGFyYW0gd3NkbFVSSSBhbiBVUkkgb2YgV1NETCB0aGF0IGNvbnRhaW5zIHhzZDpzY2hlbWEgYmVpbmcgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VSZWxhdGl2ZVVSSXMoRWxlbWVudCBzY2hlbWEsIFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgLy8gUmV0cmlldmluZyBhbGwgeHNkOmltcG9ydCBlbGVtZW50cwotICAgIE5vZGVMaXN0IGltcG9ydHMgPSBzY2hlbWEuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgIFdTSVRhZy5FTEVNX1hTRF9JTVBPUlQuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICBXU0lUYWcuRUxFTV9YU0RfSU1QT1JULmdldExvY2FsUGFydCgpKTsKLSAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBlbGVtZW50cwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIEVsZW1lbnQgaW1wID0gKEVsZW1lbnQpIGltcG9ydHMuaXRlbShpKTsKLSAgICAgIC8vIEdldHRpbmcgdGhlIHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotICAgICAgQXR0ciBzY2hlbWFMb2NhdGlvbiA9Ci0gICAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZShpbXAsIFdTSVRhZy5BVFRSX1hTRF9TQ0hFTUFMT0NBVElPTik7Ci0gICAgICAvLyBJZiB0aGUgYXR0cmlidXRlIGlzIHByZXNlbnQKLSAgICAgIGlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBUcnlpbmcgdG8gY3JlYXRlIGFuIFVSSSBvYmplY3QgdXNpbmcgYXR0cmlidXRlJ3MgdmFsdWUKLSAgICAgICAgVVJJIHVyaSA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgdXJpID0gbmV3IFVSSShzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBub3QgYW4gYWJzb2x1dGUgVVJJICh0aGUgVVJJIGNvbnN0cnVjdG9yIHRocm93cyB0aGUKLSAgICAgICAgLy8gTWFsZm9ybWVkVVJJRXhjZXB0aW9uKSwgY3JlYXRpbmcgdGhlIGFic29sdXRlIFVSSSB1c2luZyB3c2RsVVJJCi0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBuZXdVUkkgPSB3c2RsVVJJLnN1YnN0cmluZygwLCB3c2RsVVJJLmxhc3RJbmRleE9mKCIvIikgKyAxKQotICAgICAgICAgICAgKyBzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVyaSA9IG5ldyBVUkkobmV3VVJJKTsKLSAgICAgICAgICAgIC8vIFNldHRpbmcgYSBuZXcgVVJJIGFzIGEgdmFsdWUgZm9yIHRoZSBzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKLSAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uLnNldFZhbHVlKHVyaS50b1N0cmluZygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYmluZGluZyBvcGVyYXRpb24gbWF0Y2hlZCBmb3IgU09BUCBtZXNzYWdlLgotICAgKiBAcGFyYW0gZW50cnlUeXBlIG1lc3NhZ2UgZW50cnkgdHlwZS4KLSAgICogQHBhcmFtIGRvYyBhIG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gYW55IGJpbmRpbmcgb3BlcmF0aW9uIG1hdGNoZWQsIG51bGwgaWYgaXQgaXMgbm90IGZvdW5kLgotICAgKi8KLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gZ2V0T3BlcmF0aW9uTWF0Y2goRW50cnlUeXBlIGVudHJ5VHlwZSwgRG9jdW1lbnQgZG9jKSAKLSAgewotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0dGluZyB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgU09BUCBCb2R5IGNoaWxkIGVsZW1lbnQKLSAgICAgIFFOYW1lIG9wZXJhdGlvbiA9IGdldE9wZXJhdGlvbkZyb21NZXNzYWdlKGRvYyk7Ci0gICAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIFJldHJpZXZpbmcgYWxsIHRoZSBSUEMgYmluZGluZyBvcGVyYXRpb25zIGZyb20gd3NkbDpiaW5kaW5nCi0gICAgICAgIEJpbmRpbmdPcGVyYXRpb25bXSBycGNCaW5kaW5nT3BzID0gZ2V0TWF0Y2hpbmdCaW5kaW5nT3BzKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMsCi0gICAgICAgICAgYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXRCaW5kaW5ncygpKTsKLSAgICAgICAgLy8gUmV0cmlldmluZyBiaW5kaW5nIG9wZXJhdGlvbiBieSB0aGUgZ2l2ZW4gb3BlcmF0aW9uIG5hbWUKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbiA9IGdldE9wZXJhdGlvbk1hdGNoKAotICAgICAgICAgIGVudHJ5VHlwZSwgb3BlcmF0aW9uLCBycGNCaW5kaW5nT3BzKTsKLSAgICAgICAgLy8gSWYgbm8gb25lIFJQQyBvcGVyYXRpb24gbWF0Y2hlZAotICAgICAgICBpZihiaW5kaW5nT3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBSZXRyaWV2aW5nIGFsbCB0aGUgZG9jdW1lbnQgYmluZGluZyBvcGVyYXRpb25zIGZyb20gd3NkbDpiaW5kaW5nCi0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbltdIGRvY0JpbmRpbmdPcGVyYXRpb25zID0gZ2V0TWF0Y2hpbmdCaW5kaW5nT3BzKAotICAgICAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQywKLSAgICAgICAgICAgIGFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKSk7Ci0gICAgICAgICAgLy8gUmV0cmlldmluZyBiaW5kaW5nIG9wZXJhdGlvbiBieSBnaXZlbiBlbGVtZW50IG5hbWUKLSAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uW10gcG90ZW50aWFsRG9jTGl0T3BzID0KLSAgICAgICAgICAgIGdldERvY0xpdE9wZXJhdGlvbnMoZW50cnlUeXBlLCBvcGVyYXRpb24sIGRvY0JpbmRpbmdPcGVyYXRpb25zKTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBleGFjdGx5IG9uZSBvcGVyYXRpb24gbWF0Y2hlZAotICAgICAgICAgIGlmIChwb3RlbnRpYWxEb2NMaXRPcHMubGVuZ3RoID09IDEpCi0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uID0gcG90ZW50aWFsRG9jTGl0T3BzWzBdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLQotICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIE1hdGNoIGVpdGhlciBJbnB1dCBvciBPdXRwdXQuCi0gICAqIEBwYXJhbSBtZXNzYWdlRW50cnlUeXBlIG1lc3NhZ2UgZW50cnkgdHlwZS4KLSAgICogQHBhcmFtIHNvYXBNZXNzYWdlIHNvYXAgbWVzc2FnZS4KLSAgICogQHBhcmFtIG9wIGJpbmRpbmcgb3BlcmF0aW9ucy4KLSAgICogQHJldHVybiBtYXRjaGVkIG9wZXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGdldE9wZXJhdGlvbk1hdGNoKAotICAgIEVudHJ5VHlwZSBtZXNzYWdlRW50cnlUeXBlLAotICAgIERvY3VtZW50IHNvYXBNZXNzYWdlLAotICAgIEJpbmRpbmdPcGVyYXRpb25bXSBvcCkKLSAgewotICAgIC8vIEdldCBvcGVyYXRpb24gZnJvbSBtZXNzYWdlCi0gICAgUU5hbWUgb3BlcmF0aW9uID0gZ2V0T3BlcmF0aW9uRnJvbU1lc3NhZ2Uoc29hcE1lc3NhZ2UpOwotICAgIC8vIGxpc3Qgb2YgUU5hbWVzCi0KLSAgICByZXR1cm4gZ2V0T3BlcmF0aW9uTWF0Y2gobWVzc2FnZUVudHJ5VHlwZSwgb3BlcmF0aW9uLCBvcCk7Ci0gIH0KLQotICAvKioKLSAgICogTWF0Y2ggZWl0aGVyIElucHV0IG9yIE91dHB1dC4KLSAgICogQHBhcmFtIG1lc3NhZ2VFbnRyeVR5cGUgbWVzc2FnZSBlbnRyeSB0eXBlLgotICAgKiBAcGFyYW0gb3BlcmF0aW9uIFNPQVAgb3BlcmF0aW9uIG5hbWUuCi0gICAqIEBwYXJhbSBvcCBiaW5kaW5nIG9wZXJhdGlvbnMuCi0gICAqIEByZXR1cm4gbWF0Y2hlZCBvcGVyYXRpb24uCi0gICAqLwotICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBnZXRPcGVyYXRpb25NYXRjaCgKLSAgICBFbnRyeVR5cGUgbWVzc2FnZUVudHJ5VHlwZSwKLSAgICBRTmFtZSBvcGVyYXRpb24sCi0gICAgQmluZGluZ09wZXJhdGlvbltdIG9wKQotICB7Ci0gICAgUU5hbWUgY2hlY2tPcGVyYXRpb247Ci0KLSAgICAvLyBMb29rIGZvciBhIGNhbmRpZGF0ZSBvcGVyYXRpb24gaW4gdGhlIHdzZGwgdGhhdCBtYXRjaGVzIHRoaXMgc2lnbmF0dXJlLgotICAgIGZvciAoaW50IGsgPSAwOyBrIDwgb3AubGVuZ3RoOyBrKyspCi0gICAgewotICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgICAgTGlzdCBleHRlbnNpYmxlcyA9IG51bGw7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcCA9IG9wW2tdOwotCi0gICAgICBpZiAobWVzc2FnZUVudHJ5VHlwZS5pc1R5cGUoRW50cnlUeXBlLlRZUEVfTUVTU0FHRV9SRVFVRVNUKQotICAgICAgICAmJiAoYmluZGluZ09wLmdldE9wZXJhdGlvbigpLmdldElucHV0KCkgIT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIG5hbWUgPSBiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgICAgICBleHRlbnNpYmxlcyA9IGJpbmRpbmdPcC5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKAotICAgICAgICBtZXNzYWdlRW50cnlUeXBlLmlzVHlwZShFbnRyeVR5cGUuVFlQRV9NRVNTQUdFX1JFU1BPTlNFKQotICAgICAgICAgICYmIChiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkgIT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIG5hbWUgPSBiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCkuZ2V0TmFtZSgpICsgIlJlc3BvbnNlIjsKLSAgICAgICAgZXh0ZW5zaWJsZXMgPSBiaW5kaW5nT3AuZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgfQotCi0gICAgICAvLyBHZXQgc29hcDpib2R5Ci0gICAgICBTT0FQQm9keSBzb2FwQm9keSA9IGdldFNvYXBCb2R5KGV4dGVuc2libGVzKTsKLSAgICAgIGlmIChzb2FwQm9keSA9PSBudWxsKQotICAgICAgICBjaGVja09wZXJhdGlvbiA9IG5ldyBRTmFtZShuYW1lKTsKLSAgICAgIGVsc2UKLSAgICAgICAgY2hlY2tPcGVyYXRpb24gPSBuZXcgUU5hbWUoc29hcEJvZHkuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWUpOwotCi0gICAgICBpZiAob3BlcmF0aW9uICE9IG51bGwgJiYgb3BlcmF0aW9uLmVxdWFscyhjaGVja09wZXJhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoYmluZGluZ09wKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogTWF0Y2ggZWl0aGVyIElucHV0IG9yIE91dHB1dC4KLSAgICogQHBhcmFtIG1lc3NhZ2VFbnRyeVR5cGUgYSBtZXNzYWdlIGVudHJ5IHR5cGUuCi0gICAqIEBwYXJhbSBzb2FwTWVzc2FnZSBhIHNvYXAgbWVzc2FnZS4KLSAgICogQHBhcmFtIG9wIGJpbnNpbmcgb3BlcmF0aW9ucy4KLSAgICogQHJldHVybiBtYXRjaGVkIG9wZXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGdldE9wZXJhdGlvblBhcnRzTWF0Y2goCi0gICAgRW50cnlUeXBlIG1lc3NhZ2VFbnRyeVR5cGUsCi0gICAgRG9jdW1lbnQgc29hcE1lc3NhZ2UsCi0gICAgQmluZGluZ09wZXJhdGlvbltdIG9wKQotICB7Ci0gICAgTWFwIHBhcnRzID0gZ2V0UGFydExpc3RGcm9tTWVzc2FnZShzb2FwTWVzc2FnZSk7IC8vIGxpc3Qgb2YgUU5hbWVzCi0KLSAgICAvLyBMb29rIGZvciBhIGNhbmRpZGF0ZSBvcGVyYXRpb24gaW4gdGhlIHdzZGwgdGhhdCBtYXRjaGVzIHRoaXMgc2lnbmF0dXJlLgotICAgIGZvciAoaW50IGsgPSAwOyBrIDwgb3AubGVuZ3RoOyBrKyspCi0gICAgewotCi0gICAgICBNZXNzYWdlIHdzZGxNZXNzYWdlID0gbnVsbDsKLSAgICAgIExpc3QgZXh0ZW5zaWJsZXMgPSBudWxsOwotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3AgPSBvcFtrXTsKLQotICAgICAgaWYgKG1lc3NhZ2VFbnRyeVR5cGUuaXNUeXBlKEVudHJ5VHlwZS5UWVBFX01FU1NBR0VfUkVRVUVTVCkKLSAgICAgICAgJiYgKGJpbmRpbmdPcC5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpICE9IG51bGwpKQotICAgICAgewotICAgICAgICB3c2RsTWVzc2FnZSA9IGJpbmRpbmdPcC5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgZXh0ZW5zaWJsZXMgPSBiaW5kaW5nT3AuZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgbWVzc2FnZUVudHJ5VHlwZS5pc1R5cGUoRW50cnlUeXBlLlRZUEVfTUVTU0FHRV9SRVNQT05TRSkKLSAgICAgICAgICAmJiAoYmluZGluZ09wLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpICE9IG51bGwpKQotICAgICAgewotICAgICAgICB3c2RsTWVzc2FnZSA9IGJpbmRpbmdPcC5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGV4dGVuc2libGVzID0gYmluZGluZ09wLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIC8vd3NkbEZhdWx0UGFydHMgPSBvcFtrXS5nZXRGYXVsdHMoKTsKLSAgICAgIC8vIEFERDogY2hlY2sgZm9yIGNhc2Ugd2hlbiByZXNwb25zZSBtZXNzYWdlIGlzIGEgZmF1bHQKLQotICAgICAgaWYgKHNhbWVQYXJ0cyhwYXJ0cywgd3NkbE1lc3NhZ2UsIGdldFNvYXBIZWFkZXIoZXh0ZW5zaWJsZXMpKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChiaW5kaW5nT3ApOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKiAKLSAgICogQmluZGluZ09wZXJhdGlvbiBnZXRPcGVyYXRpb25QYXJ0c01hdGNoKC4uKS4KLSAgICogCi0gICAqIEZpbmQgb25lIG9yIG1vcmUgbWF0Y2hpbmcgYmluZGluZyBvcGVyYXRpb25zIGZyb20gdGhlIFdTREwgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICogZ2l2ZW4gcmVxdWVzdC1yZXNwb25zZSBzaWduYXR1cmUuCi0gICAqIAotICAgKiBUaGlzIG92ZXJsb2FkZWQgdmVyc2lvbiBpcyBpbnRlbmRlZCBmb3IgcG9zc2libGUgQ29ycmVsYXRpb24gb25seSAobm90IGFzc2VydGlvbnMpLAotICAgKiBzaW5jZSBpdCBjaGVja3MgZm9yIGFuIG9wZXJhdGlvbiBzaWduYXR1cmUgb24gYSByZXF1ZXN0LXJlc3BvbnNlIHBhaXIuCi0gICAqIEFzc2VydGlvbnMgbm93IGNoZWNrIHJlcXVlc3QgJiByZXNwb25zZSBtZXNzYWdlcyBpbmRlcGVuZGVudGx5LiAKLSAgICogQHBhcmFtIHJlcXVlc3RNZXNzYWdlIGEgcmVxdWVzdCBtZXNzYWdlLgotICAgKiBAcGFyYW0gcmVzcG9uc2VNZXNzYWdlIGEgcmVzcG9uc2UgbWVzc2FnZS4KLSAgICogQHBhcmFtIG9wIGJpbmRpbmcgb3BlcmF0aW9ucy4KLSAgICogQHJldHVybiBtYXRjaGVkIG9wZXJhdGlvbi4KLSAgICovCi0gIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBnZXRPcGVyYXRpb25QYXJ0c01hdGNoKAotICAgIERvY3VtZW50IHJlcXVlc3RNZXNzYWdlLAotICAgIERvY3VtZW50IHJlc3BvbnNlTWVzc2FnZSwKLSAgICBCaW5kaW5nT3BlcmF0aW9uW10gb3ApCi0gIHsKLSAgICBNYXAgaW5QYXJ0cyA9IGdldFBhcnRMaXN0RnJvbU1lc3NhZ2UocmVxdWVzdE1lc3NhZ2UpOyAvLyBsaXN0IG9mIFFOYW1lcwotICAgIE1hcCBvdXRQYXJ0cyA9IGdldFBhcnRMaXN0RnJvbU1lc3NhZ2UocmVzcG9uc2VNZXNzYWdlKTsKLSAgICAvLyBsaXN0IG9mIFFOYW1lcwotCi0gICAgLy8gTG9vayBmb3IgYSBjYW5kaWRhdGUgb3BlcmF0aW9uIGluIHRoZSB3c2RsIHRoYXQgbWF0Y2hlcyB0aGlzIHNpZ25hdHVyZS4KLSAgICBmb3IgKGludCBrID0gMDsgayA8IG9wLmxlbmd0aDsgaysrKQotICAgIHsKLQotICAgICAgLy9NYXAgd3NkbEZhdWx0UGFydHMgPSBudWxsOwotICAgICAgTWVzc2FnZSB3c2RsSW5NZXNzYWdlID0gbnVsbDsKLSAgICAgIE1lc3NhZ2Ugd3NkbE91dE1lc3NhZ2UgPSBudWxsOwotCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcCA9IG9wW2tdOwotICAgICAgaWYgKGJpbmRpbmdPcC5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHdzZGxJbk1lc3NhZ2UgPSBiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd3NkbE91dE1lc3NhZ2UgPSBiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgfQotICAgICAgLy93c2RsRmF1bHRQYXJ0cyA9IG9wW2tdLmdldEZhdWx0cygpOwotICAgICAgLy8gQUREOiBjaGVjayBmb3IgY2FzZSB3aGVuIHJlc3BvbnNlIG1lc3NhZ2UgaXMgYSBmYXVsdAotCi0gICAgICBpZiAoc2FtZVBhcnRzKGluUGFydHMsCi0gICAgICAgIHdzZGxJbk1lc3NhZ2UsCi0gICAgICAgIGdldFNvYXBIZWFkZXIoYmluZGluZ09wLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKSkpCi0gICAgICB7Ci0gICAgICAgIC8vIG1hdGNoIG9uIHRoZSByZXF1ZXN0IC0gbm93IGNoZWNrIHJlc3BvbnNlIGlmIGl0cyBub3QgYSBmYXVsdAotICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlICE9IG51bGwgJiYgaXNGYXVsdChyZXNwb25zZU1lc3NhZ2UpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIChiaW5kaW5nT3ApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKAotICAgICAgICAgIHNhbWVQYXJ0cygKLSAgICAgICAgICAgIG91dFBhcnRzLAotICAgICAgICAgICAgd3NkbE91dE1lc3NhZ2UsCi0gICAgICAgICAgICBnZXRTb2FwSGVhZGVyKAotICAgICAgICAgICAgICBiaW5kaW5nT3AuZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJdCBkb2VzIG1hdGNoIHNvIHRyZWF0IHRoaXMgYXMgYSByZWxldmFudCBtZXNzYWdlIHBhaXIuIAotICAgICAgICAgIC8vIExldCB0aGUgbWVzc2FnZSB0aHJvdWdoIGZvciB2YWxpZGF0aW9uLgotICAgICAgICAgIC8vQUREOiBjb3VsZCBwYXNzIHRoZSBvcGVyYXRpb25zIGxpc3QgYmFjayB0byB0aGUgZW50cnlDb250ZXh0IGZvciB0aGUgbWVzc2FnZS4KLSAgICAgICAgICByZXR1cm4gKGJpbmRpbmdPcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBzb2FwOmJvZHkgZnJvbSBhIExpc3Qgb2YgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cy4KLSAgICogQHBhcmFtIGV4dEVsZW1zIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIHRoZSBzb2FwOmJvZHkgZnJvbSBhIExpc3Qgb2YgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cy4KLSAgICovCi0gIHByaXZhdGUgU09BUEJvZHkgZ2V0U29hcEJvZHkoTGlzdCBleHRFbGVtcykKLSAgewotICAgIC8vIEZpbmQgdGhlIHNvYXAgYm9keQotICAgIGlmIChleHRFbGVtcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0RWxlbXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1zLmdldChpKTsKLSAgICAgICAgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NJVGFnLldTRExfU09BUF9CT0RZKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoU09BUEJvZHkpIGV4dEVsZW07Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgIGVsc2UgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NJVGFnLldTRExfTUlNRV9NVUxUSVBBUlQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgbWltZTpwYXJ0IGVsZW1lbnRzIG9mIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgICBMaXN0IG1pbWVQYXJ0cyA9ICgoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dEVsZW0pLmdldE1JTUVQYXJ0cygpOwotICAgICAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1pbWVQYXJ0cy5zaXplKCk7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzIG9mIHRoaXMgbWltZTpwYXJ0Ci0gICAgICAgICAgICBTT0FQQm9keSBzb2FwQm9keSA9IGdldFNvYXBCb2R5KAotICAgICAgICAgICAgICAoKE1JTUVQYXJ0KSBtaW1lUGFydHMuZ2V0KGopKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgICAgICBpZiAoc29hcEJvZHkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgcmV0dXJuIHNvYXBCb2R5OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgU09BUEhlYWRlciBmcm9tIGEgTGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZXh0ZW5zaWJsZXMgYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gdGhlIFNPQVBIZWFkZXIgZnJvbSBhIExpc3Qgb2YgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cy4KLSAgICovCi0gIHByaXZhdGUgU09BUEhlYWRlciBnZXRTb2FwSGVhZGVyKExpc3QgZXh0ZW5zaWJsZXMpCi0gIHsKLSAgICBTT0FQSGVhZGVyIHNvYXBIZWFkZXIgPSBudWxsOwotCi0gICAgLy8gZmluZCB0aGUgc29hcCBoZWFkZXIKLSAgICBpZiAoZXh0ZW5zaWJsZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpID0gZXh0ZW5zaWJsZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSAmJiBzb2FwSGVhZGVyID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgc29hcEhlYWRlciA9IChTT0FQSGVhZGVyKSBpLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGMpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc29hcEhlYWRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgZmlyc3QgcGFydCBuYW1lIGZyb20gc29hcGJpbmQ6Ym9keSBlbGVtZW50LgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0Rmlyc3RQYXJ0TmFtZShCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBTdHJpbmcgcGFydE5hbWUgPSBudWxsOwotICAgIExpc3QgZXh0TGlzdCA9IG51bGw7Ci0gICAgSXRlcmF0b3IgcGFydHNJdGVyYXRvciA9IG51bGw7Ci0KLSAgICAvLyBEZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBsaXN0IG9mIHBhcnRzIGJ5IGZpbmRpbmcgdGhlIHNvYXBiaW5kOmJvZHkgZWxlbWVudAotICAgIGlmICgoZXh0TGlzdCA9Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKQotICAgICAgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IHBhcnRzTGlzdCA9IG51bGw7Ci0gICAgICBJdGVyYXRvciBleHRJdGVyYXRvciA9IGV4dExpc3QuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChleHRJdGVyYXRvci5oYXNOZXh0KCkgJiYgKHBhcnROYW1lID09IG51bGwpKQotICAgICAgewotICAgICAgICBPYmplY3QgZXh0RWxlbWVudCA9IGV4dEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQm9keSkKLSAgICAgICAgewotICAgICAgICAgIGlmICgocGFydHNMaXN0ID0gKChTT0FQQm9keSkgZXh0RWxlbWVudCkuZ2V0UGFydHMoKSkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJ0c0l0ZXJhdG9yID0gcGFydHNMaXN0Lml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBkb2MgbGl0ZXJhbCBiaW5kaW5nIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBwYXJ0IG5hbWUKLSAgICAgICAgICAgIGlmIChwYXJ0c0l0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgcGFydE5hbWUgPSAoU3RyaW5nKSBwYXJ0c0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcGFydE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbltdIGdldERvY0xpdE9wZXJhdGlvbnMoCi0gICAgRW50cnlUeXBlIG1lc3NhZ2VUeXBlLAotICAgIFFOYW1lIHBhcnRFbGVtZW50UU5hbWUsCi0gICAgQmluZGluZ09wZXJhdGlvbltdIHdzZGxPcGVyYXRpb25zKQotICB7Ci0KLSAgICBpZiAobWVzc2FnZVR5cGUuaXNUeXBlKEVudHJ5VHlwZS5FTlRSWV9UWVBFX1JFUVVFU1QpKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRJbnB1dERvY0xpdE9wZXJhdGlvbnMocGFydEVsZW1lbnRRTmFtZSwgd3NkbE9wZXJhdGlvbnMpOwotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzYWdlVHlwZS5pc1R5cGUoRW50cnlUeXBlLkVOVFJZX1RZUEVfUkVTUE9OU0UpKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRPdXRwdXREb2NMaXRPcGVyYXRpb25zKHBhcnRFbGVtZW50UU5hbWUsIHdzZGxPcGVyYXRpb25zKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOyAvLyBzaG91bGQgYmUgb25lIG9yIHRoZSBvdGhlcgotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbltdIGdldElucHV0RG9jTGl0T3BlcmF0aW9ucygKLSAgICBRTmFtZSBwYXJ0RWxlbWVudFFOYW1lLAotICAgIEJpbmRpbmdPcGVyYXRpb25bXSB3c2RsT3BlcmF0aW9ucykKLSAgewotCi0gICAgVmVjdG9yIHBvdGVudGlhbE9wcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbE9wZXJhdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHdzZGxPcGVyYXRpb25zW2ldLmdldE9wZXJhdGlvbigpLmdldElucHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gd3NkbE9wZXJhdGlvbnNbaV0uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIC8vIElmIFNPQVAgQm9keSBjaGlsZCBlbGVtZW50IGlzIG5vdCBwcmVzZW50IGFuZCB3c2RsOm1lc3NhZ2UgZG9lcyBub3QgaGF2ZSBhbnkgd3NkbDpwYXJ0cywgdGhhdCBpcyB0aGUgbWF0Y2ggCi0gICAgICAgIGlmIChwYXJ0RWxlbWVudFFOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobWVzc2FnZS5nZXRQYXJ0cygpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHBvdGVudGlhbE9wcy5hZGQod3NkbE9wZXJhdGlvbnNbaV0pOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgSXRlcmF0b3IgcGFydHNJdCA9IG1lc3NhZ2UuZ2V0UGFydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocGFydHNJdC5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBQYXJ0IG5leHRQYXJ0ID0gKFBhcnQpIHBhcnRzSXQubmV4dCgpOwotICAgICAgICAgIGlmIChwYXJ0RWxlbWVudFFOYW1lLmVxdWFscyhuZXh0UGFydC5nZXRFbGVtZW50TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBtYXRjaGluZyBwYXJ0IGZvdW5kIChkb2MtbGl0KSAtIGFkZCB0byBsaXN0IG9mIHBvc3NpYmxlIG9wZXJhdGlvbiBtYXRjaGVzCi0gICAgICAgICAgICBwb3RlbnRpYWxPcHMuYWRkKHdzZGxPcGVyYXRpb25zW2ldKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKEJpbmRpbmdPcGVyYXRpb25bXSkgcG90ZW50aWFsT3BzLnRvQXJyYXkobmV3IEJpbmRpbmdPcGVyYXRpb25bMF0pOwotICB9Ci0KLSAgcHJpdmF0ZSBCaW5kaW5nT3BlcmF0aW9uW10gZ2V0T3V0cHV0RG9jTGl0T3BlcmF0aW9ucygKLSAgICBRTmFtZSBwYXJ0RWxlbWVudFFOYW1lLAotICAgIEJpbmRpbmdPcGVyYXRpb25bXSB3c2RsT3BlcmF0aW9ucykKLSAgewotCi0gICAgVmVjdG9yIHBvdGVudGlhbE9wcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbE9wZXJhdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHdzZGxPcGVyYXRpb25zW2ldLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHdzZGxPcGVyYXRpb25zW2ldLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgLy8gSWYgU09BUCBCb2R5IGNoaWxkIGVsZW1lbnQgaXMgbm90IHByZXNlbnQgYW5kIHdzZGw6bWVzc2FnZSBkb2VzIG5vdCBoYXZlIGFueSB3c2RsOnBhcnRzLCB0aGF0IGlzIHRoZSBtYXRjaAotICAgICAgICBpZiAocGFydEVsZW1lbnRRTmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0UGFydHMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBwb3RlbnRpYWxPcHMuYWRkKHdzZGxPcGVyYXRpb25zW2ldKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIHBhcnRzSXQgPSBtZXNzYWdlLmdldFBhcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHBhcnRzSXQuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgUGFydCBuZXh0UGFydCA9IChQYXJ0KSBwYXJ0c0l0Lm5leHQoKTsKLSAgICAgICAgICBpZiAocGFydEVsZW1lbnRRTmFtZS5lcXVhbHMobmV4dFBhcnQuZ2V0RWxlbWVudE5hbWUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcGFydCBmb3VuZCAoZG9jLWxpdCkgLSBhZGQgdG8gbGlzdCBvZiBwb3NzaWJsZSBvcGVyYXRpb24gbWF0Y2hlcwotICAgICAgICAgICAgcG90ZW50aWFsT3BzLmFkZCh3c2RsT3BlcmF0aW9uc1tpXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChCaW5kaW5nT3BlcmF0aW9uW10pIHBvdGVudGlhbE9wcy50b0FycmF5KG5ldyBCaW5kaW5nT3BlcmF0aW9uWzBdKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wYXJlIHNvYXAgbWVzc2FnZSBlbGVtZW50IHBhcnQgbmFtZXMgd2l0aCBQYXJ0cyBmcm9tIHNwZWNpZmllZCB3c2RsIE9wZXJhdGlvbgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHNhbWVQYXJ0cyhIYXNoU2V0IG1lc3NhZ2VQYXJ0cywgTWFwIHdzZGxQYXJ0cykKLSAgewotCi0gICAgLy8gbG9vayBmb3IgdGhlIHNvYXAtbWVzc2FnZSBvcGVyYXRpb24gc2lnbmF0dXJlCi0gICAgSXRlcmF0b3IgaSA9IHdzZGxQYXJ0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIC8vIGJ1aWxkIGEgc2V0IG9mIFBhcnQgbmFtZXMKLSAgICBIYXNoU2V0IGggPSBuZXcgSGFzaFNldCgpOwotICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQYXJ0IHAgPSAoUGFydCkgaS5uZXh0KCk7Ci0gICAgICBoLmFkZChwLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLy8gY29tcGFyZSB3aXRoIHRoZSBwYXJ0cyBsaXN0IGZyb20gdGhlIG1lc3NhZ2UJKHVub3JkZXJlZCkKLSAgICByZXR1cm4gKGguZXF1YWxzKG1lc3NhZ2VQYXJ0cykpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXBhcmUgc29hcCBtZXNzYWdlIGVsZW1lbnQgcGFydCBuYW1lcyB3aXRoIFBhcnRzIGZyb20gc3BlY2lmaWVkIHdzZGwgT3BlcmF0aW9uCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gc2FtZVBhcnRzKAotICAgIE1hcCBtZXNzYWdlUGFydHMsCi0gICAgTWVzc2FnZSB3c2RsTWVzc2FnZSwKLSAgICBTT0FQSGVhZGVyIHNvYXBIZWFkZXIpCi0gIHsKLQotICAgIFN0cmluZyBzb2FwSGVhZGVyUGFydCA9IG51bGw7Ci0gICAgaWYgKHNvYXBIZWFkZXIgIT0gbnVsbCkKLSAgICAgIHNvYXBIZWFkZXJQYXJ0ID0gc29hcEhlYWRlci5nZXRQYXJ0KCk7Ci0KLSAgICAvLyBjaGVjayBudWxsIGNvbmRpdGlvbnMKLSAgICBpZiAobWVzc2FnZVBhcnRzID09IG51bGwgJiYgd3NkbE1lc3NhZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsgLy8gc2ltcGxlIGVxdWFsaXR5IHRlc3QKLSAgICB9Ci0gICAgZWxzZSBpZiAobWVzc2FnZVBhcnRzID09IG51bGwgfHwgd3NkbE1lc3NhZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgLy9MaXN0IHdzZGxQYXJ0cyA9IHdzZGxNZXNzYWdlLmdldE9yZGVyZWRQYXJ0cyhudWxsKTsKLSAgICBNYXAgd3NkbFBhcnRzID0gbnVsbDsKLSAgICBpZiAod3NkbE1lc3NhZ2UuZ2V0UGFydHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHdzZGxQYXJ0cyA9IHdzZGxNZXNzYWdlLmdldFBhcnRzKCk7Ci0gICAgICAvLyBsb29rIGZvciB0aGUgc29hcC1tZXNzYWdlIG9wZXJhdGlvbiBzaWduYXR1cmUKLSAgICAgIEl0ZXJhdG9yIGkgPSB3c2RsUGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIC8vIGJ1aWxkIGEgc2V0IG9mIFBhcnQgbmFtZXMgICAgCi0gICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcCA9IChQYXJ0KSBpLm5leHQoKTsKLSAgICAgICAgLy8gZG8gbm90IGluY2x1ZGUgdGhlIHBhcnQgZm9yIHRoZSBzb2FwOmhlYWRlciAoaWYgYW55KQotICAgICAgICBpZiAoIXAuZ2V0TmFtZSgpLmVxdWFscyhzb2FwSGVhZGVyUGFydCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc29hcDpib2R5Ci0gICAgICAgICAgdi5hZGQobmV3IFFOYW1lKHAuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGlmIG9uZSBvZiB0aGUgcGFydHMgaXMgYXNzb2NpYXRlZCB3aXRoIGEgc29hcDpoZWFkZXIgaW4gdGhlIGJpbmRpbmcKLSAgICAgIC8vIChieSA8c29hcDpoZWFkZXIgcGFydD0ie3BhcnRuYW1lfSI+KSwgcmVtb3ZlIHRoaXMgZnJvbSB0aGUgc2V0Ci0KLSAgICB9Ci0KLSAgICAvLyBjb21wYXJlIHdpdGggdGhlIHBhcnRzIGxpc3QgZnJvbSB0aGUgbWVzc2FnZQkob3JkZXJlZCkKLSAgICBpZiAodi5pc0VtcHR5KCkgJiYgbWVzc2FnZVBhcnRzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBQQjogQ2hhbmdlZCB0byBjb250YWluc0FsbCgpIHNpbmNlIGVxdWFscygpIGZhaWxzIHdoZW4gdXNpbmcgSlJFIDEuNAotICAgIGlmICh2LmNvbnRhaW5zQWxsKG1lc3NhZ2VQYXJ0cy5rZXlTZXQoKSkKLSAgICAgICYmICh2LnNpemUoKSA9PSBtZXNzYWdlUGFydHMuc2l6ZSgpKSkKLSAgICB7Ci0gICAgICAvLyBDaGVjayBmb3IgeHNpOnR5cGUgbWlzbWF0Y2gKLSAgICAgIEl0ZXJhdG9yIHBhcnRzID0gbWVzc2FnZVBhcnRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICBRTmFtZSBwYXJ0TmFtZSwgeHNpVHlwZTsKLSAgICAgIHdoaWxlIChwYXJ0cy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHBhcnROYW1lID0gKFFOYW1lKSBwYXJ0cy5uZXh0KCk7Ci0KLSAgICAgICAgLy8gR2V0IHhzaTp0eXBlIFFOYW1lCi0gICAgICAgIGlmICgoeHNpVHlwZSA9IChRTmFtZSkgbWVzc2FnZVBhcnRzLmdldChwYXJ0TmFtZSkpICE9IG51bGwKLSAgICAgICAgICAmJiB3c2RsUGFydHMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldCB0aGUgV1NETCBwYXJ0IGRlZmluaXRpb24KLSAgICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgd3NkbFBhcnRzLmdldChwYXJ0TmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgICAvLyBJZiB4c2lUeXBlIGlzIE5PVCBkZXJpdmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBwYXJ0Ci0gICAgICAgICAgaWYgKCFpc0Rlcml2ZWRUeXBlKHhzaVR5cGUsIHBhcnQuZ2V0VHlwZU5hbWUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gcmV0dXJuIGZhbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLy9yZXR1cm4gKHYuZXF1YWxzKG1lc3NhZ2VQYXJ0cykpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIG9uZSBzY2hlbWEgdHlwZSBpcyBkZXJpdmVkIGZyb20gYW5vdGhlci4KLSAgICogQHBhcmFtIGV4dFR5cGUgYW4gYXNzdW1lZCBkZXJpdmVkIHR5cGUuCi0gICAqIEBwYXJhbSB0eXBlIGFuIGFzc3VtZWQgYmFzZSB0eXBlLgotICAgKiBAcmV0dXJuIHRydWUgaWYgZXh0VHlwZSBpcyBkZXJpdmVkIGZyb20gdHlwZSwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0Rlcml2ZWRUeXBlKFFOYW1lIGV4dFR5cGUsIFFOYW1lIHR5cGUpCi0gIHsKLSAgICAvLyBJZiBlaXRoZXIgb2YgdHlwZXMgaXMgbnVsbCwgcmV0dXJuIGZhbHNlCi0gICAgaWYgKGV4dFR5cGUgPT0gbnVsbCB8fCB0eXBlID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLy8gSWYgdGhlIHR5cGVzIGFyZSBlcXVhbCwgcmV0dXJuIHRydWUKLSAgICBpZiAoZXh0VHlwZS5lcXVhbHModHlwZSkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHNjaGVtYXMgCi0gICAgSXRlcmF0b3IgaSA9IHdzZGxEb2N1bWVudC5nZXRTY2hlbWFzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgewotICAgICAgWFNNb2RlbCB4c01vZGVsID0gKFhTTW9kZWwpIGkubmV4dCgpOwotICAgICAgLy8gUmV0cmlldmluZyB0aGUgZGVyaXZlZCB0eXBlIGRlZmluaXRpb24KLSAgICAgIFhTVHlwZURlZmluaXRpb24geHNUeXBlID0geHNNb2RlbC5nZXRUeXBlRGVmaW5pdGlvbigKLSAgICAgICAgZXh0VHlwZS5nZXRMb2NhbFBhcnQoKSwgZXh0VHlwZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAvLyBJZiBpdCBpcyBmb3VuZCBhbmQgZGVyaXZlZCBmcm9tIHRoZSBiYXNlIHR5cGUsIHJldHVybiB0cnVlCi0gICAgICBpZiAoeHNUeXBlICE9IG51bGwgJiYgeHNUeXBlLmRlcml2ZWRGcm9tKHR5cGUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgIHR5cGUuZ2V0TG9jYWxQYXJ0KCksIFhTQ29uc3RhbnRzLkRFUklWQVRJT05fTk9ORSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICAvLyBleHRUeXBlIGlzIG5vdCBkZXJpdmVkIGZyb20gdHlwZSwgcmV0dXJuIGZhbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gIAkqIEdldCBhIGxpc3Qgb2YgUU5hbWVzIG9mIHBhcnRzIGZyb20gdGhlIHNvYXAgYm9keSBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UKLSAgCSovCi0gIHB1YmxpYyBFbGVtZW50IGdldFNvYXBCb2R5Q2hpbGQoRG9jdW1lbnQgZG9jKQotICB7Ci0KLSAgICBFbGVtZW50IG9wRWxlbSA9IG51bGw7Ci0gICAgaWYgKGRvYyAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIE5vZGVMaXN0IGJvZGllcyA9Ci0gICAgICAgIHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsICJCb2R5Iik7Ci0gICAgICAvLyBHZXQgdGhlIGxpc3Qgb2Ygc29hcDpib2R5IGNoaWxkIGVsZW1lbnQgbmFtZXMgZnJvbSB0aGUgcmVxdWVzdCBtZXNzYWdlCi0gICAgICBpZiAoYm9kaWVzICE9IG51bGwgJiYgYm9kaWVzLmdldExlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBib2R5ID0gKEVsZW1lbnQpIGJvZGllcy5pdGVtKDApOwotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IGJvZHkuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpICYmIG9wRWxlbSA9PSBudWxsOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG4gPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvcEVsZW0gPSAoRWxlbWVudCkgbjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG9wRWxlbTsKLSAgfQotCi0gIC8qKiBDaGVjayB3aGV0aGVyIHRoaXMgbWVzc2FnZSBpcyBhIHNvYXAgZmF1bHQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRmF1bHQoRG9jdW1lbnQgZG9jKQotICB7Ci0gICAgYm9vbGVhbiBpc0ZhdWx0ID0gZmFsc2U7Ci0KLSAgICBpZiAoZG9jICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgaXNGYXVsdCA9Ci0gICAgICAgIChyb290Ci0gICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCAiRmF1bHQiKQotICAgICAgICAgIC5nZXRMZW5ndGgoKQotICAgICAgICAgID4gMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGlzRmF1bHQ7Ci0gIH0KLQotICAvKiogCi0gICAqIENoZWNrIHdoZXRoZXIgdGhpcyBtZXNzYWdlIGhhcyBhIHNvYXAgYm9keSB3aXRoIGEgY2hpbGQgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zU29hcEJvZHlXaXRoQ2hpbGQoRG9jdW1lbnQgZG9jKQotICB7Ci0gICAgYm9vbGVhbiBjb250YWlucyA9IGZhbHNlOwotCi0gICAgaWYgKGRvYyAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbnRhaW5zID0gKChnZXRTb2FwQm9keUNoaWxkKGRvYykgPT0gbnVsbCkgPyBmYWxzZSA6IHRydWUpOwotICAgIH0KLQotICAgIHJldHVybiBjb250YWluczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgU09BUEFjdGlvbiB2YWx1ZSBmcm9tIHRoZSBIVFRQIGhlYWRlcnMuCi0gICAqIEBwYXJhbSBoZWFkZXJzIEhUVFAgaGVhZGVycwotICAgKiBAcmV0dXJuIFNPQVBBY3Rpb24gdmFsdWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U29hcEFjdGlvbihTdHJpbmcgaGVhZGVycykgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gZ2V0IFNPQVBBY3Rpb24KLSAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgICBpZiAoaGVhZGVycyAhPSBudWxsKQotICAgICAgYWN0aW9uID0gKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoaGVhZGVycywgIjoiKS5nZXQoIlNPQVBBY3Rpb24iLnRvVXBwZXJDYXNlKCkpOwotICAgIHJldHVybiBhY3Rpb247Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEgbGlzdCBvZiBRTmFtZXMgb2YgcGFydHMgZnJvbSB0aGUgc29hcCBib2R5IG9mIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLSAgICogVGhpcyBtZXRob2QgYXNzdW1lcyBSUEMgc3R5bGUgbWVzc2FnZSBjb250ZW50Ci0gICAqLwotICBwcml2YXRlIFFOYW1lIGdldE9wZXJhdGlvbkZyb21NZXNzYWdlKERvY3VtZW50IGRvYykKLSAgewotICAgIFFOYW1lIG9wZXJhdGlvbiA9IG51bGw7Ci0gICAgaWYgKGRvYyAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIE5vZGVMaXN0IGJvZGllcyA9Ci0gICAgICAgIHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsICJCb2R5Iik7Ci0gICAgICBpZiAoYm9kaWVzICE9IG51bGwgJiYgYm9kaWVzLmdldExlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBib2R5ID0gKEVsZW1lbnQpIGJvZGllcy5pdGVtKDApOwotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IGJvZHkuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG4gPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgIC8vIElmIGVsZW1lbnQsIHRoZW4gdGhpcyBpcyB0aGUgb3BlcmF0aW9uIG5hbWUKLSAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3BlcmF0aW9uID0gbmV3IFFOYW1lKG4uZ2V0TmFtZXNwYWNlVVJJKCksIG4uZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBvcGVyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEgbGlzdCBvZiBRTmFtZXMgb2YgcGFydHMgZnJvbSB0aGUgc29hcCBib2R5IG9mIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLSAgICogVGhpcyBtZXRob2QgYXNzdW1lcyBSUEMgc3R5bGUgbWVzc2FnZSBjb250ZW50Ci0gICAqLwotICBwcml2YXRlIE1hcCBnZXRQYXJ0TGlzdEZyb21NZXNzYWdlKERvY3VtZW50IGRvYykKLSAgewotICAgIE1hcCBwYXJ0cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgaWYgKGRvYyAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIE5vZGVMaXN0IGJvZGllcyA9Ci0gICAgICAgIHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsICJCb2R5Iik7Ci0gICAgICAvLyBHZXQgdGhlIGxpc3Qgb2Ygc29hcDpib2R5IGdyYW5kLWNoaWxkIGVsZW1lbnQgbmFtZXMgZnJvbSB0aGUgcmVxdWVzdCBtZXNzYWdlCi0gICAgICAvLyAoaW1tZWRpYXRlIGNoaWxkIGlzIHRoZSBtZXNzYWdlIG5hbWUpCi0gICAgICBpZiAoYm9kaWVzICE9IG51bGwgJiYgYm9kaWVzLmdldExlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBib2R5ID0gKEVsZW1lbnQpIGJvZGllcy5pdGVtKDApOwotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IGJvZHkuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG4gPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBvcGVyYXRpb24gbmFtZS4gSXRzIGNoaWxkcmVuIGFyZSB0aGUgcGFydHMKLSAgICAgICAgICAgIE5vZGVMaXN0IGdyYW5kQ2hpbGRyZW4gPSBuLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZ3JhbmRDaGlsZHJlbi5nZXRMZW5ndGgoKTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBOb2RlIG0gPSBncmFuZENoaWxkcmVuLml0ZW0oaik7Ci0gICAgICAgICAgICAgIGlmIChtIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgcGFydCBoYXMgYW4geHNpOnR5cGUKLSAgICAgICAgICAgICAgICBBdHRyIGF0dHIgPQotICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAoRWxlbWVudCkgbSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfWFNJLCAidHlwZSIpKTsKLQotICAgICAgICAgICAgICAgIFFOYW1lIHhzaVR5cGUgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4geHNpOnR5cGUgYXR0cmlidXRlLCB0aGVuIGdldCB0aGUgdmFsdWUgYXMgYSBRTmFtZSAKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB4c2lUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICBET01VdGlscy5nZXRRTmFtZShhdHRyLmdldE5vZGVWYWx1ZSgpLCAoRWxlbWVudCkgbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChqYXZheC53c2RsLldTRExFeGNlcHRpb24gd2UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGFkZCB0byB0aGUgY2hpbGQgZWxlbWVudCBsaXN0Ci0gICAgICAgICAgICAgICAgcGFydHMucHV0KAotICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKG0uZ2V0TmFtZXNwYWNlVVJJKCksIG0uZ2V0TG9jYWxOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgeHNpVHlwZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBhcnRzOwotICB9Ci0KLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb25bXSBnZXRNYXRjaGluZ0JpbmRpbmdPcHMoCi0gICAgU3RyaW5nIGJpbmRpbmdTdHlsZSwKLSAgICBCaW5kaW5nW10gYmluZGluZ3MpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBIYXNoU2V0IGJpbmRpbmdPcGVyYXRpb25zU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIC8vIHdoaXp6IHRocm91Z2ggdGhlIGJpbmRpbmdzLCBjaGVja2luZyBmb3IgYSBiaW5kaW5nT3BlcmF0aW9uIG1hdGNoaW5nIHRoZSBtZXNzYWdlCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0KLSAgICAgIEJpbmRpbmcgdHJ5QmluZGluZyA9IGJpbmRpbmdzW2ldOwotICAgICAgTGlzdCBiaW5kaW5nT3BzID0gdHJ5QmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotCi0gICAgICBpZiAoYmluZGluZ09wcyAhPSBudWxsKQotICAgICAgewotCi0gICAgICAgIC8vIHNlYXJjaCB0aHJvdWdoIGJpbmRpbmcgT3BlcmF0aW9ucwotICAgICAgICBJdGVyYXRvciBiaW5kaW5nT3BJdCA9IHRyeUJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoYmluZGluZ09wSXQuaGFzTmV4dCgpKQotICAgICAgICB7Ci0KLSAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcCA9IChCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nT3BJdC5uZXh0KCk7Ci0gICAgICAgICAgLy8gY2hlY2sgZGVwZW5kcyBvbiB3aGljaCBiaW5kaW5nIHN0eWxlIGlzIGRlY2xhcmVkIGluIHRoZSB3c2RsCi0gICAgICAgICAgU09BUE9wZXJhdGlvbiBzb2FwT3AgPSBXU0RMVmFsaWRhdG9ySW1wbC5nZXRTb2FwT3BlcmF0aW9uKGJpbmRpbmdPcCk7Ci0gICAgICAgICAgLy9HVDogbW92ZSB0aGlzIG1ldGhvZCB0byB1dGlscwotCi0gICAgICAgICAgU3RyaW5nIHN0eWxlOwotICAgICAgICAgIGlmICgoc29hcE9wID09IG51bGwpIHx8IChzdHlsZSA9IHNvYXBPcC5nZXRTdHlsZSgpKSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHVzZSB0aGUgc3R5bGUgb2YgdGhlIHBhcmVudCBiaW5kaW5nT3AKLQotICAgICAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmQgPSBXU0RMVmFsaWRhdG9ySW1wbC5nZXRTb2FwQmluZGluZyh0cnlCaW5kaW5nKTsKLSAgICAgICAgICAgIC8vR1Q6IG1vdmUgdGhpcyBtZXRob2QgdG8gdXRpbHMKLSAgICAgICAgICAgIGlmICgoc3R5bGUgPSBzb2FwQmluZC5nZXRTdHlsZSgpKSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzdHlsZSA9IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0M7Ci0gICAgICAgICAgICAgIC8vZGVmYXVsdAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc3R5bGUuZXF1YWxzKGJpbmRpbmdTdHlsZSkpCi0gICAgICAgICAgewotCi0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uc1NldC5hZGQoYmluZGluZ09wKTsKLQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAvLyBjdXJyZW50IGJpbmRpbmcgaGFzIG5vIGJpbmRpbmdPcGVyYXRpb25zLCBpZ25vcmUKLSAgICB9Ci0gICAgcmV0dXJuIChCaW5kaW5nT3BlcmF0aW9uW10pIGJpbmRpbmdPcGVyYXRpb25zU2V0LnRvQXJyYXkoCi0gICAgICBuZXcgQmluZGluZ09wZXJhdGlvblswXSk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHdoZXRoZXIgc29hcDpib2R5IGVsZW1lbnQgaXMgbGl0ZXJhbC4KLSAgICogQHBhcmFtIGV4dEVsZW1lbnRzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgb2Ygd3NkbDppbnB1dCBvciB3c2RsOm91dHB1dAotICAgKiBvZiBhIGJpbmRpbmcKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGl0ZXJhbChMaXN0IGV4dEVsZW1zKQotICB7Ci0gICAgU09BUEJvZHkgc29hcEJvZHkgPSBnZXRTT0FQQm9keShleHRFbGVtcyk7Ci0gICAgaWYgKHNvYXBCb2R5ICE9IG51bGwKLSAgICAgICYmIHNvYXBCb2R5LmdldFVzZSgpLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogT3JkZXJzIHdzZGw6cGFydCBuYW1lcyBrZWVwaW5nIGluIG1pbmQgdGhlICJwYXJ0cyIgYXR0cmlidXRlIG9mIFdTREwgc29hcDpib2R5Ci0gICAqIEBwYXJhbSBtZXNzYWdlUGFydHMgYSBsaXN0IG9mIHdzZGw6cGFydFMKLSAgICogQHBhcmFtIGV4dEVsZW1zIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcKLSAgICogQHJldHVybiB0aGUgb3JkZXJlZCBsaXN0IG9mIHBhcnQgbmFtZXMKLSAgICovCi0gIHB1YmxpYyBMaXN0IG9yZGVyUGFydE5hbWVzKExpc3QgbWVzc2FnZVBhcnRzLCBMaXN0IGV4dEVsZW1zKQotICB7Ci0gICAgTGlzdCBvcmRlcmVkUGFydE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIExpc3QgYm9keVBhcnRzID0gbnVsbDsKLQotICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gZ2V0U09BUEJvZHkoZXh0RWxlbXMpOwotICAgIGlmIChzb2FwQm9keSAhPSBudWxsKQotICAgICAgYm9keVBhcnRzID0gc29hcEJvZHkuZ2V0UGFydHMoKTsKLQotICAgIEl0ZXJhdG9yIGkgPSBtZXNzYWdlUGFydHMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIHBhcnROYW1lID0gKChQYXJ0KSBpLm5leHQoKSkuZ2V0TmFtZSgpOwotICAgICAgLy8gSWYgdGhlIHBhcnRzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGNvbnRhaW5zCi0gICAgICAvLyB0aGUgd3NkbDpwYXJ0IG5hbWUsIHRoZW4gYWRkaW5nIHBhcnQgbmFtZSB0byB0aGUgb3JkZXJlZCBsaXN0Ci0gICAgICBpZiAoYm9keVBhcnRzID09IG51bGwgfHwgYm9keVBhcnRzLmNvbnRhaW5zKHBhcnROYW1lKSkKLSAgICAgICAgb3JkZXJlZFBhcnROYW1lcy5hZGQocGFydE5hbWUpOwotICAgIH0KLQotICAgIHJldHVybiBvcmRlcmVkUGFydE5hbWVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHJpZXZlcyB0aGUgU09BUEJvZHkgb2JqZWN0IGZyb20gYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxtZW50cyBpbiBiaW5kaW5nCi0gICAqIEBwYXJhbSBleHRFbGVtcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAqIEByZXR1cm4gdGhlIFNPQVBCb2R5IGVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBTT0FQQm9keSBnZXRTT0FQQm9keShMaXN0IGV4dEVsZW1zKQotICB7Ci0gICAgaWYgKGV4dEVsZW1zID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleHRFbGVtcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgICByZXR1cm4gKFNPQVBCb2R5KSBvYmo7Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAKLSAgcHVibGljIExpc3QgcmVzb2x2ZVNhbWVOYW1lc3BhY2VzKExpc3Qgc2NoZW1hRWxlbWVudHMpCi0gIHsKLSAgCUxpc3QgbmFtZXNwYWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAJSXRlcmF0b3IgaSA9IHNjaGVtYUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgc2NoZW1hID0gKEVsZW1lbnQpIGkubmV4dCgpOwotICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICBpZiAoIW5hbWVzcGFjZXMuY29udGFpbnModGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgIHsKLSAgICAgICAgbmFtZXNwYWNlcy5hZGQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAJTGlzdCBzY2hlbWFzID0gZ2V0U2NoZW1hc1dpdGhTYW1lTmFtZXNwYWNlKHNjaGVtYUVsZW1lbnRzLCB0YXJnZXROYW1lc3BhY2UpOwotICAgIAlpZiAoc2NoZW1hcy5zaXplKCkgPT0gMSkKLSAgICAgIAl7Ci0gICAgICAJICByZXN1bHQuYWRkKHNjaGVtYSk7Ci0gICAgICAJfQotICAgIAllbHNlCi0gICAgCXsKLSAgICAJCS8vIGNvcHlpbmcgYWxsIHRoZSBOUyBkZWNsYXJhdGlvbnMgZnJvbSB3c2RsOmRlZmluaXRpb25zIHdzZGw6dHlwZXMKLSAgICAgIC8vY29weU5TRGVjbGFyYXRpb25zKHJvb3QsIHNjaGVtYSk7Ci0gICAgICBjb3B5TlNEZWNsYXJhdGlvbnMoKEVsZW1lbnQpIHNjaGVtYS5nZXRQYXJlbnROb2RlKCksIHNjaGVtYSk7Ci0gICAgICAvLyBSZXBsYWNpbmcgYWxsIHJlbGF0aXZlIHNjaGVtYUxvY2F0aW9uIFVSSXMgd2l0aCBhYnNvbHV0ZSBvbmVzCi0gICAgICAvL3JlcGxhY2VSZWxhdGl2ZVVSSXMoc2NoZW1hLCB3c2RsVVJJKTsKLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgc2NoZW1hIGVsZW1lbnRzIGluc2lkZSB0aGUgVHlwZXMsIHRoZW4gdXNlIHRoaXMgYXMKLSAgICAgIC8vIHRoZSBzY2hlbWEgc3RyaW5nIGZvciB0aGUgdmFsaWRhdGlvbgotICAgICAgU3RyaW5nIHNjaGVtYVN0cmluZyA9Ci0gICAgICAgIERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKHNjaGVtYSk7Ci0gICAgICAgLy8gc2NoZW1hU3RyaW5ncy5hZGQoc2NoZW1hU3RyaW5nKTsKLSAgICAgIAl9Ci0gICAgICB9Ci0gICAgfQotICAJcmV0dXJuIG51bGw7Ci0gIH0KLSAgCQotICBwdWJsaWMgTGlzdCBnZXRTY2hlbWFzV2l0aFNhbWVOYW1lc3BhY2UoTGlzdCBzY2hlbWFFbGVtZW50cywgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkKLSAgeyAKLSAgCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEl0ZXJhdG9yIGkgPSBzY2hlbWFFbGVtZW50cy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFbGVtZW50IHNjaGVtYSA9IChFbGVtZW50KWkubmV4dCgpOwotICAgICAgU3RyaW5nIHNjaGVtYVRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICBpZiAoc2NoZW1hVGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgCXNjaGVtYVRhcmdldE5hbWVzcGFjZSA9ICIiOwotICAgICAgICAKLSAgICAgIGlmIChzY2hlbWFUYXJnZXROYW1lc3BhY2UuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgCXJlc3VsdC5hZGQoc2NoZW1hKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGR1cGxpY2F0ZU5hbWVzcGFjZXNEZXRlY3RlZChMaXN0IHNjaGVtYUVsZW1lbnRzKQotICB7IAotICAJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBMaXN0IG5hbWVzcGFjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgSXRlcmF0b3IgaSA9IHNjaGVtYUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgIHsKLSAgICAJRWxlbWVudCBzY2hlbWEgPSAoRWxlbWVudClpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgCXRhcmdldE5hbWVzcGFjZSA9ICIiOwotICAgICAgICAKLSAgICAgICAgaWYgKG5hbWVzcGFjZXMuY29udGFpbnModGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAJcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgCWJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJbmFtZXNwYWNlcy5hZGQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvQmFzZVZhbGlkYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Jhc2VWYWxpZGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNzhlODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvQmFzZVZhbGlkYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5BbmFseXplckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkJhc2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW52ZWxvcGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkZhaWx1cmVEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5QcmVyZXFGYWlsZWRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0QXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGwuUHJlcmVxRmFpbGVkTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRW50cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MRG9jdW1lbnRDYWNoZVVzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5kb20uRWxlbWVudExvY2F0aW9uOwotCi0vKioKLSAqIFRoZSBXU0RMIHZhbGlkYXRvciB3aWxsIHZlcmlmeSB0aGF0IHRoZSBXU0RMIGFuZCBhc3NvY2lhdGVkIFhNTCBzY2hlbWEgZGVmaW5pdGlvbnMKLSAqIGFyZSBpbiBjb25mb3JtYW5jZSB3aXRoIHRoZSBwcm9maWxlLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEBhdXRob3IgR3JhaGFtIFR1cnJlbGwgICAoZ3R1cnJlbGxAdWsuaWJtLmNvbSkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VWYWxpZGF0b3JJbXBsCi0gIGV4dGVuZHMgWE1MRG9jdW1lbnRDYWNoZVVzZXIKLSAgaW1wbGVtZW50cyBCYXNlVmFsaWRhdG9yCi17Ci0KLSAgLyoqCi0gICAqIEEgaGFzaHRhYmxlIHRoYXQgbWFwcyBhc3NlcnRpb24gcmVzdWx0cyB0byB0aGVpciBwcmlvcml0aWVzLCAwIGlzIGxvd2VzdAotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaHRhYmxlIHJlc3VsdFByaW9yaXR5ID0gbmV3IEhhc2h0YWJsZSg2KTsKLSAgc3RhdGljIHsKLSAgICByZXN1bHRQcmlvcml0eS5wdXQoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQsIG5ldyBJbnRlZ2VyKDApKTsKLSAgICByZXN1bHRQcmlvcml0eS5wdXQoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRSwgbmV3IEludGVnZXIoMSkpOwotICAgIHJlc3VsdFByaW9yaXR5LnB1dChBc3NlcnRpb25SZXN1bHQuUkVTVUxUX01JU1NJTkdfSU5QVVQsIG5ldyBJbnRlZ2VyKDIpKTsKLSAgICByZXN1bHRQcmlvcml0eS5wdXQoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HLCBuZXcgSW50ZWdlcigzKSk7Ci0gICAgcmVzdWx0UHJpb3JpdHkucHV0KEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUFJFUkVRX0ZBSUxFRCwgbmV3IEludGVnZXIoNCkpOwotICAgIHJlc3VsdFByaW9yaXR5LnB1dChBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRCwgbmV3IEludGVnZXIoNSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBoaWdoZXN0IHByaW9yaXR5IHZhbHVlIGJlaW5nIHBhc3NlZCB3aGVuIHByb2Nlc3NpbmcgcHJlLXJlcXVpc2l0ZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVkFMSURfUFJJT1JJVFkgPSAxOwotCi0gIC8qKgotICAgKiBBbmFseXplciBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIEFuYWx5emVyQ29udGV4dCBhbmFseXplckNvbnRleHQ7Ci0KLSAgLyoqCi0gICAqIFByb2ZpbGUgYXJ0aWZhY3QuCi0gICAqLwotICBwcm90ZWN0ZWQgUHJvZmlsZUFydGlmYWN0IHByb2ZpbGVBcnRpZmFjdDsKLQotICAvKioKLSAgICogUmVwb3J0ZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgUmVwb3J0ZXIgcmVwb3J0ZXI7Ci0KLSAgLyoqCi0gICAqIEVudHJ5LgotICAgKi8KLSAgLy8gcHJvdGVjdGVkIEVudHJ5IGVudHJ5OwotCi0gIC8qKgotICAgKiBSZXBvcnQgYXJ0aWZhY3QuCi0gICAqLwotICBwcm90ZWN0ZWQgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3Q7Ci0KLSAgLyoqCi0gICAqIFZlcmJvc2Ugb3B0aW9uLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gdmVyYm9zZU9wdGlvbiA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUZXN0IGFzc2VydGlvbiBwcm9jZXNzZWQgY291bnQuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGFzc2VydGlvbkNvdW50ID0gMDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgQmFzZVZhbGlkYXRvckltcGwoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhaWxpemUgdmFsaWRhdGlvbiB0ZXN0IHByb2NlZHVyZS4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29udGV4dCB0aGUgYW5hbHl6ZXJDb250ZXh0LgotICAgKiBAcGFyYW0gcHJvZmlsZUFydGlmYWN0IHRoZSBwcm9maWxlIGFydGlmaWFjdC4KLSAgICogQHBhcmFtIHJlcG9ydEFydGlmYWN0ICB0aGUgcmVwb3J0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcmVwb3J0ZXIgICAgICAgIGEgUmVwb3J0ZXIgb2JqZWN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB2YWxpZGF0b3IgY291bGQgbm90IGJlIGluaXRpYWxpemVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdCgKLSAgICBBbmFseXplckNvbnRleHQgYW5hbHl6ZXJDb250ZXh0LAotICAgIFByb2ZpbGVBcnRpZmFjdCBwcm9maWxlQXJ0aWZhY3QsCi0gICAgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QsCi0gICAgUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gU2F2ZSBpbnB1dCByZWZlcmVuY2VzCi0gICAgdGhpcy5hbmFseXplckNvbnRleHQgPSBhbmFseXplckNvbnRleHQ7Ci0gICAgdGhpcy5wcm9maWxlQXJ0aWZhY3QgPSBwcm9maWxlQXJ0aWZhY3Q7Ci0gICAgdGhpcy5yZXBvcnRBcnRpZmFjdCA9IHJlcG9ydEFydGlmYWN0OwotICAgIHRoaXMucmVwb3J0ZXIgPSByZXBvcnRlcjsKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBYTUwgZG9jdW1lbnQgY2FjaGUgaXMgdXBkYXRlZCBpbiB0aGUgYW5hbHl6ZXIgY29udGV4dAotICAgIHRoaXMuZG9jdW1lbnRMaXN0ID0gdGhpcy5hbmFseXplckNvbnRleHQuZ2V0RG9jdW1lbnRMaXN0KCk7Ci0KLSAgICAvLyBHZXQgdmVyYm9zZSBvcHRpb24gICAgCi0gICAgdmVyYm9zZU9wdGlvbiA9Ci0gICAgICByZXBvcnRlcgotICAgICAgICAuZ2V0UmVwb3J0KCkKLSAgICAgICAgLmdldFJlcG9ydENvbnRleHQoKQotICAgICAgICAuZ2V0QW5hbHl6ZXIoKQotICAgICAgICAuZ2V0QW5hbHl6ZXJDb25maWcoKQotICAgICAgICAuZ2V0VmVyYm9zZU9wdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgYWxsIG9mIHRoZSB0ZXN0IGFzc2VydGlvbnMgZm9yIG9uZSBlbnRyeS4KLSAgICogQHBhcmFtIGNsYXNzUHJlZml4IGEgY2xhc3MgcHJlZml4LgotICAgKiBAcGFyYW0gZW50cnlDb250ZXh0IGFuIGVudHJ5IGNvbnRleHQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHNlcmlvdXMgcHJvYmxlbXMgb2NjdXIgd2hpbGUgcHJvY2Vzc2luZyAKLSAgICogICAgICAgICBhbGwgb2YgdGhlIHRlc3QgYXNzZXJ0aW9ucyBmb3IgYW4gZW50cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQXNzZXJ0aW9ucygKLSAgICBTdHJpbmcgY2xhc3NQcmVmaXgsCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBsb25nIHN0YXJ0VGltZSA9IDA7Ci0KLSAgICBIYXNoTWFwIHByb2Nlc3NMaXN0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24gPSBudWxsOwotICAgIEFzc2VydGlvblByb2Nlc3MgYXNzZXJ0aW9uUHJvY2VzczsKLSAgICBBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0OwotCi0gICAgVHJlZU1hcCBwcmVSZXFSZXN1bHRzOwotICAgIFByZXJlcUZhaWxlZExpc3QgcHJlcmVxRmFpbGVkTGlzdDsKLSAgICBTdHJpbmcgcHJlUmVxSWQ7Ci0KLSAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSBuZXcgQ2xhc3NbMV07Ci0gICAgLy8gSWYgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlVmFsaWRhdG9yIG9yIEVudmVsb3BlVmFsaWRhdG9yCi0gICAgLy8gdGhlbiB1c2UgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgYXMgYSBwYXJhbSB0eXBlIG9mIGFzc2VydGlvbnMgY29uc3RydWN0b3IKLSAgICBwYXJhbVR5cGVzWzBdID0gdGhpcyBpbnN0YW5jZW9mIEJhc2VNZXNzYWdlVmFsaWRhdG9yID8KLSAgICAgIEJhc2VNZXNzYWdlVmFsaWRhdG9yLmNsYXNzIDogdGhpcy5nZXRDbGFzcygpOwotCi0gICAgT2JqZWN0W10gcGFyYW1zID0gbmV3IE9iamVjdFsxXTsKLSAgICBwYXJhbXNbMF0gPSB0aGlzOwotCi0gICAgLy8gR2V0IGVudHJ5IGZyb20gY29udGV4dAotICAgIEVudHJ5IGVudHJ5ID0gZW50cnlDb250ZXh0LmdldEVudHJ5KCk7Ci0KLSAgICAvLyBBZGQgZW50cnkgdG8gYXJ0aWZhY3QKLSAgICB0aGlzLnJlcG9ydEFydGlmYWN0LmFkZEVudHJ5KGVudHJ5KTsKLQotICAgIC8vIEFkZCBlbnRyeSB0byByZXBvcnQKLSAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEVudmVsb3BlVmFsaWRhdG9yKQotICAgICAJdGhpcy5yZXBvcnRlci5zZXRDdXJyZW50RW52ZWxvcGVFbnRyeShlbnRyeSk7IAotCWVsc2UgdGhpcy5yZXBvcnRlci5zZXRDdXJyZW50RW50cnkoZW50cnkpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiB0ZXN0IGFzc2VydGlvbnMgZm9yIHRoZSBhcnRpZmFjdAotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9maWxlQXJ0aWZhY3QuZ2V0VGVzdEFzc2VydGlvbkxpc3QoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IG5leHQgdGVzdCBhc3NlcnRpb24KLSAgICAgICAgdGVzdEFzc2VydGlvbiA9IChUZXN0QXNzZXJ0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgLy8gUmVzZXQgdmFyaWFibGVzCi0gICAgICAgIGFzc2VydGlvblJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHRlc3QgYXNzZXJ0aW9uIGlzIGVuYWJsZWQsIHRoZW4gY29udGludWUKLSAgICAgICAgLy8gICAgICAgIGlmICgodGVzdEFzc2VydGlvbi5pc0VuYWJsZWQoKSkgJiYgCi0gICAgICAgIC8vICAgICAgICAgICAgdGVzdEFzc2VydGlvbi5nZXRFbnRyeVR5cGVOYW1lKCkuZXF1YWxzKHRhcmdldENvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKS5nZXRUeXBlTmFtZSgpKSkgeyAKLSAgICAgICAgaWYgKHRlc3RBc3NlcnRpb24uaXNFbmFibGVkKCkKLSAgICAgICAgICAmJiBpc1ByaW1hcnlFbnRyeVR5cGVNYXRjaCh0ZXN0QXNzZXJ0aW9uLCBlbnRyeUNvbnRleHQpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgLy8gQWRkIDEgdG8gYXNzZXJ0aW9uIHByb2Nlc3NlZCBjb3VudAotICAgICAgICAgICAgYXNzZXJ0aW9uQ291bnQrKzsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIGFzc2VydGlvbiBwcm9jZXNzIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LCB0aGVuIGNyZWF0ZSBpdAotICAgICAgICAgICAgaWYgKChhc3NlcnRpb25Qcm9jZXNzID0KLSAgICAgICAgICAgICAgKEFzc2VydGlvblByb2Nlc3MpIHByb2Nlc3NMaXN0LmdldCh0ZXN0QXNzZXJ0aW9uLmdldElkKCkpKQotICAgICAgICAgICAgICA9PSBudWxsKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBhc3NlcnRpb24gcHJvY2VzcwotICAgICAgICAgICAgICBDbGFzcyBhc3NlcnRpb25DbGFzcyA9Ci0gICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShjbGFzc1ByZWZpeCArIHRlc3RBc3NlcnRpb24uZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgICAgYXNzZXJ0aW9uUHJvY2VzcyA9Ci0gICAgICAgICAgICAgICAgKEFzc2VydGlvblByb2Nlc3MpIGFzc2VydGlvbkNsYXNzLmdldENvbnN0cnVjdG9yKAotICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlcykubmV3SW5zdGFuY2UoCi0gICAgICAgICAgICAgICAgICBwYXJhbXMpOwotCi0gICAgICAgICAgICAgIC8vIEFkZCBpdCB0byB0aGUgbGlzdAotICAgICAgICAgICAgICBwcm9jZXNzTGlzdC5wdXQodGVzdEFzc2VydGlvbi5nZXRJZCgpLCBhc3NlcnRpb25Qcm9jZXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBlbnRyeSBpcyBudWxsCi0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0RW50cnlEZXRhaWwoKSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhc3NlcnRpb25SZXN1bHQgPQotICAgICAgICAgICAgICAgIGNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgICAgICAgICAgICAgIHRlc3RBc3NlcnRpb24sCi0gICAgICAgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX01JU1NJTkdfSU5QVVQsCi0gICAgICAgICAgICAgICAgICAoU3RyaW5nKSBudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB0ZXN0IGFzc2VydGlvbiBzaG91bGQgYmUgcnVuCi0gICAgICAgICAgICAvL2lmIChpc05vdEFwcGxpY2FibGUodGVzdEFzc2VydGlvbiwgZW50cnlDb250ZXh0KSkgewotICAgICAgICAgICAgZWxzZSBpZiAoaXNOb3RBcHBsaWNhYmxlKHRlc3RBc3NlcnRpb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhc3NlcnRpb25SZXN1bHQgPQotICAgICAgICAgICAgICAgIGNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgICAgICAgICAgICAgIHRlc3RBc3NlcnRpb24sCi0gICAgICAgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFLAotICAgICAgICAgICAgICAgICAgKFN0cmluZykgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFByb2Nlc3NpbmcgYWxsIHRoZSBhc3NlcnRpb24gcHJlLXJlcXVpc2l0ZXMKLQotICAgICAgICAgICAgICBwcmVSZXFSZXN1bHRzID0gbnVsbDsKLSAgICAgICAgICAgICAgcHJlcmVxRmFpbGVkTGlzdCA9IG51bGw7Ci0gICAgICAgICAgICAgIC8vIEdldCBsaXN0IG9mIHByZS1yZXFzIGZvciBzcGVjaWZpZWQgYXNzZXJ0aW9uCi0gICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSB0ZXN0QXNzZXJ0aW9uLmdldFByZXJlcUlkTGlzdCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwcmVSZXFSZXN1bHRzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICBwcmVSZXFSZXN1bHRzID0gbmV3IFRyZWVNYXAoKTsKLSAgICAgICAgICAgICAgICAvLyBHZXQgbmV4dCBpZAotICAgICAgICAgICAgICAgIHByZVJlcUlkID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwcmVyZXEgcmVzdWx0Ci0gICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHByZVJlcVJlc3VsdCA9IHJlcG9ydGVyLmdldEFzc2VydGlvblJlc3VsdChwcmVSZXFJZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGRpbmcgYSByZXN1bHQgcHJpb3JpdHkgdmFsdWUgdG8gcHJlUmVxUmVzdWx0cwotICAgICAgICAgICAgICAgIHByZVJlcVJlc3VsdHMucHV0KAotICAgICAgICAgICAgICAgICAgcmVzdWx0UHJpb3JpdHkuZ2V0KHByZVJlcVJlc3VsdC5nZXRSZXN1bHQoKSksCi0gICAgICAgICAgICAgICAgICBwcmVSZXFSZXN1bHQuZ2V0UmVzdWx0KCkpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHByZXJlcSBmYWlsZWQsIHRoZW4gYWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgaWYgKCgoSW50ZWdlcilyZXN1bHRQcmlvcml0eS5nZXQocHJlUmVxUmVzdWx0LmdldFJlc3VsdCgpKSkuaW50VmFsdWUoKQotICAgICAgICAgICAgICAgICAgPiBNQVhfVkFMSURfUFJJT1JJVFkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gQWRkaW5nIGZhaWxlZCBwcmVyZXEgSUQgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgIGlmIChwcmVyZXFGYWlsZWRMaXN0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHByZXJlcUZhaWxlZExpc3QgPSBuZXcgUHJlcmVxRmFpbGVkTGlzdEltcGwoKTsKLSAgICAgICAgICAgICAgICAgIHByZXJlcUZhaWxlZExpc3QuYWRkVGVzdEFzc2VydGlvbklEKHByZVJlcUlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAocHJlcmVxRmFpbGVkTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gR2V0dGluZyB0aGUgaGlnaGVzdCBwcmUtcmVxdWlzaXRlcycgcmVzdWx0Ci0gICAgICAgICAgICAgICAgSW50ZWdlciBtYXhSZXMgPSAoSW50ZWdlcilwcmVSZXFSZXN1bHRzLmxhc3RLZXkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzU3RyaW5nID0gKFN0cmluZylwcmVSZXFSZXN1bHRzLmdldChtYXhSZXMpOwotICAgICAgICAgICAgICAgIGlmIChyZXNTdHJpbmcuZXF1YWxzKEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEKQotICAgICAgICAgICAgICAgICAgfHxyZXNTdHJpbmcuZXF1YWxzKEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORykpIHsKLSAgICAgICAgICAgICAgICAgIHJlc1N0cmluZyA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUFJFUkVRX0ZBSUxFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFzc2VydGlvbiByZXN1bHQgYmFzZWQgb24gcHJlLXJlcXVpc2l0ZXMgd2hpY2ggYXJlIG5vdCBwYXNzZWQKLSAgICAgICAgICAgICAgICBhc3NlcnRpb25SZXN1bHQgPSBjcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzU3RyaW5nLCBwcmVyZXFGYWlsZWRMaXN0KTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIC8vIFByZS1yZXF1aXNpdGVzIGFyZSBwYXNzZWQsIHZhbGlkYXRlIGN1cnJlbnQgYXNzZXJ0aW9uCi0gICAgICAgICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAgICAgLy8gUmVzZXQgdGVzdCBhc3NlcnRpb24KLSAgICAgICAgICAgICAgICBhc3NlcnRpb25Qcm9jZXNzLnJlc2V0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyAgVkVSQk9TRQotICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlT3B0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgIiAgUHJvY2Vzc2luZyAiCi0gICAgICAgICAgICAgICAgICAgICAgKyB0ZXN0QXNzZXJ0aW9uLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGVudHJ5IHJlZmVyZW5jZSBJRCBbIgotICAgICAgICAgICAgICAgICAgICAgICsgZW50cnkuZ2V0UmVmZXJlbmNlSUQoKQotICAgICAgICAgICAgICAgICAgICAgICsgIl0gLi4uIik7Ci0gICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgdGFyZ2V0Ci0gICAgICAgICAgICAgICAgYXNzZXJ0aW9uUmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgIGFzc2VydGlvblByb2Nlc3MudmFsaWRhdGUodGVzdEFzc2VydGlvbiwgZW50cnlDb250ZXh0KTsKLQotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBYTUwgZG9jdW1lbnQgY2FjaGUgaXMgdXBkYXRlZCBpbiB0aGUgYW5hbHl6ZXIgY29udGV4dAotICAgICAgICAgICAgICAgIHRoaXMuYW5hbHl6ZXJDb250ZXh0LnNldERvY3VtZW50TGlzdChkb2N1bWVudExpc3QpOwotCi0gICAgICAgICAgICAgICAgLy8gIFZFUkJPU0UKLSAgICAgICAgICAgICAgICBpZiAodmVyYm9zZU9wdGlvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICIgICAgRWxhcHNlZCB0aW1lOiAiCi0gICAgICAgICAgICAgICAgICAgICAgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUpCi0gICAgICAgICAgICAgICAgICAgICAgKyAibXMiKTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCByZXN1bHQgdG8gdGhlIHJlcG9ydAotICAgICAgICAgICAgcmVwb3J0ZXIuYWRkQXNzZXJ0aW9uUmVzdWx0KGFzc2VydGlvblJlc3VsdCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBERUJVRzoKLSAgICAgICAgICAgIGlmICh0ZXN0QXNzZXJ0aW9uICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlcG9ydGVyCi0gICAgICAgICAgICAgICAgLmdldFJlcG9ydCgpCi0gICAgICAgICAgICAgICAgLmdldFJlcG9ydENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRBbmFseXplcigpCi0gICAgICAgICAgICAgICAgLnByaW50TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAiV0FSTklORzogIgotICAgICAgICAgICAgICAgICAgKyB0ZXN0QXNzZXJ0aW9uLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICsgIiBpcyBub3Qgc3VwcG9ydGVkIGN1cnJlbnRseS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFWEVDRVBUSU9OOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgaWYgKHZlcmJvc2VPcHRpb24pCi0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0KLSAgICAgIGlmIChlIGluc3RhbmNlb2YgV1NJRXhjZXB0aW9uKQotICAgICAgICB0aHJvdyAoV1NJRXhjZXB0aW9uKSBlOwotICAgICAgZWxzZQotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICB9Ci0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgLy8gSW5kaWNhdGUgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgYXNzZXJ0aW9uIHRhcmdldAotICAgICAgdGhpcy5yZXBvcnRlci5lbmRDdXJyZW50RW50cnkoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSB0ZXN0IGFzc2VydGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkIGZvciB0aGUgY3VycmVudCBlbnRyeS4KLSAgICogQHBhcmFtIHRlc3RBc3NlcnRpb24gYSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHBhcmFtIGVudHJ5Q29udGV4dCAgdGhlIGVudHJ5IGNvbnRleHQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGVzdCBhc3NlcnRpb24gc2hvdWxkIGJlIHByb2Nlc3NlZCBmb3IgdGhlIGN1cnJlbnQgZW50cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc1ByaW1hcnlFbnRyeVR5cGVNYXRjaCgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCk7Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGUgdGVzdCBhc3NlcnRpb24gc2hvdWxkIGJlIHByb2Nlc3NlZCBmb3IgdGhlIGN1cnJlbnQgZW50cnkuCi0gICAqIEBwYXJhbSB0ZXN0QXNzZXJ0aW9uICBhIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAcGFyYW0gZW50cnkgICAgICAgICAgYW4gRW50cnkgb2JqZWN0Ci0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGVzdCBhc3NlcnRpb24gc2hvdWxkIGJlIHByb2Nlc3NlZCBmb3IgdGhlIGN1cnJlbnQgZW50cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByaW1hcnlFbnRyeVR5cGVNYXRjaCgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnkgZW50cnkpCi0gIHsKLSAgICBib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0KLSAgICAvLyBJZiB0aGUgdGVzdCBhc3NlcnRpb24gZW50cnkgdHlwZSBtYXRjaGVzIHRoZSB0YXJnZXQgY29udGV4dCBlbnRyeSB0eXBlLCB0aGVuIGNvbnRpbmUKLSAgICBpZiAodGVzdEFzc2VydGlvbgotICAgICAgLmdldEVudHJ5VHlwZU5hbWUoKQotICAgICAgLmVxdWFscyhlbnRyeS5nZXRFbnRyeVR5cGUoKS5nZXRUeXBlTmFtZSgpKSkKLSAgICB7Ci0gICAgICBtYXRjaCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1hdGNoOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGUgdGVzdCBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUuCi0gICAqIEBwYXJhbSB0ZXN0QXNzZXJ0aW9uIGEgdGVzdCBhc3NlcnRpb24uCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGVzdCBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc05vdEFwcGxpY2FibGUoVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkJhc2VWYWxpZGF0b3IjY2xlYW51cCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gSWYgbm8gYXNzZXJ0aW9ucyB3ZXJlIHByb2Nlc3NlZCwgdGhlbiBzZXQgYWxsIG1pc3NpbmdJbnB1dAotICAgIGlmIChhc3NlcnRpb25Db3VudCA9PSAwKQotICAgICAgc2V0QWxsTWlzc2luZ0lucHV0KCk7Ci0KLSAgICAvLyBTZXQgY2FjaGVkIGRvY3VtZW50IGxpc3QgaW4gY2FzZSBpdCB3YXMgdXBkYXRlZAotICAgIHRoaXMuYW5hbHl6ZXJDb250ZXh0LnNldERvY3VtZW50TGlzdCh0aGlzLmRvY3VtZW50TGlzdCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGFzc2VydGlvbiByZXN1bHQuCi0gICAqIEBwYXJhbSB0ZXN0QXNzZXJ0aW9uIGEgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBwYXJhbSByZXN1bHQgICAgICAgIGEgU3RyaW5nIG9iamVjdC4KLSAgICogQHBhcmFtIGZhaWx1cmVEZXRhaWwgYSBGYWlsdXJlRGV0YWlsIG9iamVjdC4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHRlc3QgcmVzdWx0LgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCBjcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIFN0cmluZyByZXN1bHQsCi0gICAgRmFpbHVyZURldGFpbCBmYWlsdXJlRGV0YWlsKQotICB7Ci0gICAgVmVjdG9yIGZhaWx1cmVEZXRhaWxMaXN0ID0gbnVsbDsKLQotICAgIC8vIENyZWF0ZSBmYWlsdXJlIGRldGFpbCBsaXN0Ci0gICAgaWYgKGZhaWx1cmVEZXRhaWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmYWlsdXJlRGV0YWlsTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZhaWx1cmVEZXRhaWxMaXN0LmFkZChmYWlsdXJlRGV0YWlsKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbExpc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhc3NlcnRpb24gcmVzdWx0LgotICAgKiBAcGFyYW0gdGVzdEFzc2VydGlvbiAgICAgICAgIGEgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBwYXJhbSByZXN1bHQgICAgICAgICAgICAgICAgYSBTdHJpbmcgb2JqZWN0LgotICAgKiBAcGFyYW0gZmFpbHVyZURldGFpbE1lc3NhZ2UgIGEgZmFpbHVyZSBkZXRhaWwgbWVzc2FnZS4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHRlc3QgcmVzdWx0LgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCBjcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIFN0cmluZyByZXN1bHQsCi0gICAgU3RyaW5nIGZhaWx1cmVEZXRhaWxNZXNzYWdlKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sCi0gICAgICByZXN1bHQsCi0gICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSwKLSAgICAgIG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhc3NlcnRpb24gcmVzdWx0LgotICAgKiBAcGFyYW0gdGVzdEFzc2VydGlvbiAgICAgICAgIGEgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBwYXJhbSByZXN1bHQgICAgICAgICAgICAgICAgYSBTdHJpbmcgb2JqZWN0LgotICAgKiBAcGFyYW0gZmFpbHVyZURldGFpbE1lc3NhZ2UgIGEgZmFpbHVyZSBkZXRhaWwgbWVzc2FnZS4KLSAgICogQHBhcmFtIGVsZW1lbnRMb2NhdGlvbiAgICAgICBlbGVtZW50IGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgdGVzdCByZXN1bHQuCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IGNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgU3RyaW5nIHJlc3VsdCwKLSAgICBTdHJpbmcgZmFpbHVyZURldGFpbE1lc3NhZ2UsCi0gICAgRWxlbWVudExvY2F0aW9uIGVsZW1lbnRMb2NhdGlvbikKLSAgewotICAgIC8vIENyZWF0ZSBmYWlsdXJlIGRldGFpbCBsaXN0Ci0gICAgVmVjdG9yIGZhaWx1cmVEZXRhaWxMaXN0ID0gbnVsbDsKLSAgICBpZiAoZmFpbHVyZURldGFpbE1lc3NhZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmYWlsdXJlRGV0YWlsTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIEZhaWx1cmVEZXRhaWwgZmFpbHVyZURldGFpbCA9IHJlcG9ydGVyLmNyZWF0ZUZhaWx1cmVEZXRhaWwoKTsKLSAgICAgIGZhaWx1cmVEZXRhaWwuc2V0RmFpbHVyZU1lc3NhZ2UoZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICAgICAgZmFpbHVyZURldGFpbC5zZXRFbGVtZW50TG9jYXRpb24oZWxlbWVudExvY2F0aW9uKTsKLSAgICAgIGZhaWx1cmVEZXRhaWxMaXN0LmFkZChmYWlsdXJlRGV0YWlsKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbExpc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhc3NlcnRpb24gcmVzdWx0LgotICAgKiBAcGFyYW0gdGVzdEFzc2VydGlvbiAgICAgYSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHBhcmFtIHJlc3VsdCAgICAgICAgICAgIGEgU3RyaW5nIG9iamVjdC4KLSAgICogQHBhcmFtIGZhaWx1cmVEZXRhaWxMaXN0IGEgZmFpbHVyZSBkZXRhaWwgbGlzdC4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHRlc3QgcmVzdWx0LgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCBjcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIFN0cmluZyByZXN1bHQsCi0gICAgVmVjdG9yIGZhaWx1cmVEZXRhaWxMaXN0KQotICB7Ci0gICAgLy8gQ3JlYXRlIGFzc2VydGlvbiByZXN1bHQKLSAgICBBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0ID0gcmVwb3J0ZXIuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KCk7Ci0KLSAgICAvLyBTZXQgdmFsdWVzIGluIGFzc2VydGlvbiByZXN1bHQKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0QXNzZXJ0aW9uKHRlc3RBc3NlcnRpb24pOwotICAgIGFzc2VydGlvblJlc3VsdC5zZXRSZXN1bHQocmVzdWx0KTsKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0RW50cnkocmVwb3J0ZXIuZ2V0UmVwb3J0KCkuZ2V0Q3VycmVudEVudHJ5KCkpOwotCi0gICAgLy8gU2V0IGZhaWx1cmUgZGV0YWlsIGxpc3QKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0RmFpbHVyZURldGFpbExpc3QoZmFpbHVyZURldGFpbExpc3QpOwotCi0gICAgcmV0dXJuIGFzc2VydGlvblJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYXNzZXJ0aW9uIHJlc3VsdC4KLSAgICogQHBhcmFtIHRlc3RBc3NlcnRpb24gICAgIGEgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBwYXJhbSByZXN1bHQgICAgICAgICAgICBhIFN0cmluZyBvYmplY3QuCi0gICAqIEBwYXJhbSBwcmVyZXFGYWlsZWRMaXN0ICBhIGxpc3QgZmFpbGVkIHByZS1yZXF1aXNpdGUgYXNzZXJ0aW9ucy4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHRlc3QgcmVzdWx0LgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCBjcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIFN0cmluZyByZXN1bHQsCi0gICAgUHJlcmVxRmFpbGVkTGlzdCBwcmVyZXFGYWlsZWRMaXN0KQotICB7Ci0gICAgLy8gQ3JlYXRlIGFzc2VydGlvbiByZXN1bHQKLSAgICBBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0ID0gcmVwb3J0ZXIuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KCk7Ci0KLSAgICAvLyBTZXQgdmFsdWVzIGluIGFzc2VydGlvbiByZXN1bHQKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0QXNzZXJ0aW9uKHRlc3RBc3NlcnRpb24pOwotICAgIGFzc2VydGlvblJlc3VsdC5zZXRSZXN1bHQocmVzdWx0KTsKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0RW50cnkocmVwb3J0ZXIuZ2V0UmVwb3J0KCkuZ2V0Q3VycmVudEVudHJ5KCkpOwotICAgIGFzc2VydGlvblJlc3VsdC5zZXRQcmVyZXFGYWlsZWRMaXN0KHByZXJlcUZhaWxlZExpc3QpOwotCi0gICAgcmV0dXJuIGFzc2VydGlvblJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYXNzZXJ0aW9uIHJlc3VsdCB0byByZXBvcnQuCi0gICAqIEBwYXJhbSBhc3NlcnRpb25JZCAgYXNzZXJ0aW9uIGlkLgotICAgKiBAcGFyYW0gcmVzdWx0ICAgICAgIGFzc2VydGlvbiByZXN1bHQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZSBhc3NlcnRpb24gcmVzdWx0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgcmVwb3J0LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQXNzZXJ0aW9uUmVzdWx0KFN0cmluZyBhc3NlcnRpb25JZCwgU3RyaW5nIHJlc3VsdCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgdGVzdCBhc3NlcnRpb24gcmVzdWx0Ci0gICAgQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdCA9IHJlcG9ydGVyLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgpOwotCi0gICAgLy8gU2V0IGFzc2VydGlvbiwgcmVzdWx0IGFuZCB0YXJnZXQKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0QXNzZXJ0aW9uKHByb2ZpbGVBcnRpZmFjdC5nZXRUZXN0QXNzZXJ0aW9uKGFzc2VydGlvbklkKSk7Ci0gICAgYXNzZXJ0aW9uUmVzdWx0LnNldFJlc3VsdChyZXN1bHQpOwotICAgIGFzc2VydGlvblJlc3VsdC5zZXRFbnRyeShyZXBvcnRlci5nZXRSZXBvcnQoKS5nZXRDdXJyZW50RW50cnkoKSk7Ci0KLSAgICAvLyBBZGQgaXQgdG8gdGhlIHJlcG9ydAotICAgIHJlcG9ydGVyLmFkZEFzc2VydGlvblJlc3VsdChhc3NlcnRpb25SZXN1bHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhc3NlcnRpb24gcmVzdWx0IHRvIHJlcG9ydCB3aXRoIGFuIGVycm9yIGRldGFpbCBtZXNzYWdlLgotICAgKiBAcGFyYW0gYXNzZXJ0aW9uSWQgICAgICAgICAgYXNzZXJ0aW9uIGlkLgotICAgKiBAcGFyYW0gcmVzdWx0ICAgICAgICAgICAgICAgYXNzZXJ0aW9uIHJlc3VsdC4KLSAgICogQHBhcmFtIGZhaWx1cmVEZXRhaWxNZXNzYWdlIGFuIGVycm9yIGRldGFpbCBtZXNzYWdlLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGUgYXNzZXJ0aW9uIHJlc3VsdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIHJlcG9ydC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZEFzc2VydGlvblJlc3VsdCgKLSAgICBTdHJpbmcgYXNzZXJ0aW9uSWQsCi0gICAgU3RyaW5nIHJlc3VsdCwKLSAgICBTdHJpbmcgZmFpbHVyZURldGFpbE1lc3NhZ2UpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ29udmVydCBtZXNzYWdlIHRvIHZlY3RvcgotICAgIFZlY3RvciBmYWlsdXJlRGV0YWlsTGlzdCA9IG51bGw7Ci0gICAgaWYgKGZhaWx1cmVEZXRhaWxNZXNzYWdlICE9IG51bGwpCi0gICAgewotICAgICAgZmFpbHVyZURldGFpbExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBGYWlsdXJlRGV0YWlsIGZhaWx1cmVEZXRhaWwgPSByZXBvcnRlci5jcmVhdGVGYWlsdXJlRGV0YWlsKCk7Ci0gICAgICBmYWlsdXJlRGV0YWlsTGlzdC5hZGQoZmFpbHVyZURldGFpbCk7Ci0gICAgfQotCi0gICAgLy8gQWRkIGFzc2VydGlvbiByZXN1bHQKLSAgICBhZGRBc3NlcnRpb25SZXN1bHQoYXNzZXJ0aW9uSWQsIHJlc3VsdCwgZmFpbHVyZURldGFpbExpc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhc3NlcnRpb24gcmVzdWx0IHRvIHJlcG9ydC4KLSAgICogQHBhcmFtIGFzc2VydGlvbklkICAgICAgICBhc3NlcnRpb24gaWQuCi0gICAqIEBwYXJhbSByZXN1bHQgICAgICAgICAgICAgYXNzZXJ0aW9uIHJlc3VsdC4KLSAgICogQHBhcmFtIGZhaWx1cmVEZXRhaWxMaXN0ICBhIGxpc3Qgb2YgZXJyb3IgZGV0YWlsIG1lc3NhZ2VzLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGUgYXNzZXJ0aW9uIHJlc3VsdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIHJlcG9ydC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZEFzc2VydGlvblJlc3VsdCgKLSAgICBTdHJpbmcgYXNzZXJ0aW9uSWQsCi0gICAgU3RyaW5nIHJlc3VsdCwKLSAgICBWZWN0b3IgZmFpbHVyZURldGFpbExpc3QpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ3JlYXRlIHRlc3QgYXNzZXJ0aW9uIHJlc3VsdAotICAgIEFzc2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1bHQgPSByZXBvcnRlci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoKTsKLQotICAgIC8vIFNldCBhc3NlcnRpb24sIHJlc3VsdCBhbmQgdGFyZ2V0Ci0gICAgYXNzZXJ0aW9uUmVzdWx0LnNldEFzc2VydGlvbihwcm9maWxlQXJ0aWZhY3QuZ2V0VGVzdEFzc2VydGlvbihhc3NlcnRpb25JZCkpOwotICAgIGFzc2VydGlvblJlc3VsdC5zZXRSZXN1bHQocmVzdWx0KTsKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0RW50cnkocmVwb3J0ZXIuZ2V0UmVwb3J0KCkuZ2V0Q3VycmVudEVudHJ5KCkpOwotICAgIGFzc2VydGlvblJlc3VsdC5zZXRGYWlsdXJlRGV0YWlsTGlzdChmYWlsdXJlRGV0YWlsTGlzdCk7Ci0KLSAgICAvLyBBZGQgaXQgdG8gdGhlIHJlcG9ydAotICAgIHJlcG9ydGVyLmFkZEFzc2VydGlvblJlc3VsdChhc3NlcnRpb25SZXN1bHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBtaXNzaW5nSW5wdXQgYXNzZXJ0aW9uIHJlc3VsdCB0byByZXBvcnQuCi0gICAqIEBwYXJhbSB0ZXN0QXNzZXJ0aW9uIGEgdGVzdCBhc3NlcnRpb24uCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFueSBwcm9ibGVtIGFkZGluZyBtaXNzaW5nSW5wdXQgCi0gICAqIAkJIGFzc2VydGlvbiByZXN1bHQgdG8gcmVwb3J0LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkTWlzc2luZ0lucHV0UmVzdWx0KFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgdGVzdCBhc3NlcnRpb24gcmVzdWx0Ci0gICAgQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdCA9IHJlcG9ydGVyLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgpOwotCi0gICAgLy8gU2V0IGFzc2VydGlvbiwgcmVzdWx0IGFuZCB0YXJnZXQKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0QXNzZXJ0aW9uKHRlc3RBc3NlcnRpb24pOwotICAgIGFzc2VydGlvblJlc3VsdC5zZXRSZXN1bHQoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9NSVNTSU5HX0lOUFVUKTsKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0RW50cnkocmVwb3J0ZXIuZ2V0UmVwb3J0KCkuZ2V0Q3VycmVudEVudHJ5KCkpOwotCi0gICAgLy8gQWRkIGl0IHRvIHRoZSByZXBvcnQKLSAgICByZXBvcnRlci5hZGRBc3NlcnRpb25SZXN1bHQoYXNzZXJ0aW9uUmVzdWx0KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuQmFzZVZhbGlkYXRvciNzZXRBbGxNaXNzaW5nSW5wdXQoKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWxsTWlzc2luZ0lucHV0KCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gSWYgcHJvZmlsZSBhcnRpZmFjdCBpcyBzZXQKLSAgICBpZiAocHJvZmlsZUFydGlmYWN0ICE9IG51bGwpCi0gICAgewotICAgICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uOwotICAKLSAgICAgIC8vIENyZWF0ZSBlbnRyeQotICAgICAgRW50cnkgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgICBlbnRyeS5zZXRBcnRpZmFjdE5hbWUodGhpcy5yZXBvcnRBcnRpZmFjdC5nZXRUeXBlKCkuZ2V0VHlwZU5hbWUoKSk7Ci0gIAotICAgICAgLy8gQWRkIGVudHJ5IHRvIGFydGlmYWN0Ci0gICAgICB0aGlzLnJlcG9ydEFydGlmYWN0LmFkZEVudHJ5KGVudHJ5KTsKLSAgCi0gICAgICAvLyBBZGQgZW50cnkgdG8gcmVwb3J0Ci0gICAgICB0aGlzLnJlcG9ydGVyLnNldEN1cnJlbnRFbnRyeShlbnRyeSk7Ci0gIAotICAgICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiB0ZXN0IGFzc2VydGlvbnMgZm9yIHRoZSBhcnRpZmFjdAotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9maWxlQXJ0aWZhY3QuZ2V0VGVzdEFzc2VydGlvbkxpc3QoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IG5leHQgdGVzdCBhc3NlcnRpb24KLSAgICAgICAgdGVzdEFzc2VydGlvbiA9IChUZXN0QXNzZXJ0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gIAotICAgICAgICAvLyBBZGQgbWlzc2luZ0lucHV0IHJlc3VsdAotICAgICAgICBpZiAodGVzdEFzc2VydGlvbi5pc0VuYWJsZWQoKSkKLSAgICAgICAgICBhZGRNaXNzaW5nSW5wdXRSZXN1bHQodGVzdEFzc2VydGlvbik7Ci0gICAgICB9Ci0gIAotICAgICAgLy8gSW5kaWNhdGUgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgYXNzZXJ0aW9uIHRhcmdldAotICAgICAgdGhpcy5yZXBvcnRlci5lbmRDdXJyZW50RW50cnkoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGFsbCByZXN1bHRzIGZvciBhbiBlbnRyeSB0eXBlIHRvIG1pc3NpbmdJbnB1dC4KLSAgICogQHBhcmFtIGVudHJ5VHlwZSBhbiBFbnRyeVR5cGUgb2JqZWN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbnkgcHJvYmxlbSB3aGlsZSBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0TWlzc2luZ0lucHV0KEVudHJ5VHlwZSBlbnRyeVR5cGUpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbjsKLQotICAgIC8vIENyZWF0ZSBlbnRyeSAKLSAgICBFbnRyeSBlbnRyeSA9IHRoaXMucmVwb3J0ZXIuZ2V0UmVwb3J0KCkuY3JlYXRlRW50cnkoKTsKLSAgICBlbnRyeS5zZXRFbnRyeVR5cGUoZW50cnlUeXBlKTsKLSAgICBlbnRyeS5zZXRSZWZlcmVuY2VJRCgiWyIgKyBlbnRyeVR5cGUuZ2V0VHlwZU5hbWUoKSArICJdIik7Ci0KLSAgICAvLyBBZGQgZW50cnkgdG8gYXJ0aWZhY3QKLSAgICB0aGlzLnJlcG9ydEFydGlmYWN0LmFkZEVudHJ5KGVudHJ5KTsKLQotICAgIC8vIEFkZCBlbnRyeSB0byByZXBvcnQKLSAgICB0aGlzLnJlcG9ydGVyLnNldEN1cnJlbnRFbnRyeShlbnRyeSk7Ci0KLSAgICAvL3RyeSB7Ci0gICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiB0ZXN0IGFzc2VydGlvbnMgZm9yIHRoZSBhcnRpZmFjdAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvZmlsZUFydGlmYWN0LmdldFRlc3RBc3NlcnRpb25MaXN0KCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIC8vIEdldCBuZXh0IHRlc3QgYXNzZXJ0aW9uCi0gICAgICB0ZXN0QXNzZXJ0aW9uID0gKFRlc3RBc3NlcnRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmICh0ZXN0QXNzZXJ0aW9uLmlzRW5hYmxlZCgpCi0gICAgICAgICYmIGlzUHJpbWFyeUVudHJ5VHlwZU1hdGNoKHRlc3RBc3NlcnRpb24sIGVudHJ5KSkKLSAgICAgIHsKLSAgICAgICAgYWRkTWlzc2luZ0lucHV0UmVzdWx0KHRlc3RBc3NlcnRpb24pOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIEluZGljYXRlIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGVudHJ5Ci0gICAgdGhpcy5yZXBvcnRlci5lbmRDdXJyZW50RW50cnkoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvUHJvZmlsZVZhbGlkYXRvckZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9Qcm9maWxlVmFsaWRhdG9yRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkZDE1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9Qcm9maWxlVmFsaWRhdG9yRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW52ZWxvcGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLk1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLlByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5VRERJVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5XU0RMVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkVudmVsb3BlVmFsaWRhdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlLk1lc3NhZ2VWYWxpZGF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLnVkZGkuVURESVZhbGlkYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbC5XU0RMVmFsaWRhdG9ySW1wbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXU0lMRG9jdW1lbnRGYWN0b3J5LgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yOiBQZXRlciBCcml0dGVuaGFtCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeUltcGwgZXh0ZW5kcyBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeQotewotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLlByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5I25ld1VERElWYWxpZGF0b3IoKQotICAgKi8KLSAgcHVibGljIFVERElWYWxpZGF0b3IgbmV3VURESVZhbGlkYXRvcigpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSBuZXcgVURESSB2YWxpZGF0b3IgCi0gICAgVURESVZhbGlkYXRvciB1ZGRpVmFsaWRhdG9yID0gbmV3IFVERElWYWxpZGF0b3JJbXBsKCk7Ci0gICAgLy8gUmV0dXJuIHZhbGlkYXRvcgotICAgIHJldHVybiB1ZGRpVmFsaWRhdG9yOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuUHJvZmlsZVZhbGlkYXRvckZhY3RvcnkjbmV3V1NETFZhbGlkYXRvcigpCi0gICAqLwotICBwdWJsaWMgV1NETFZhbGlkYXRvciBuZXdXU0RMVmFsaWRhdG9yKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBXU0RMIHZhbGlkYXRvciAKLSAgICBXU0RMVmFsaWRhdG9yIHdzZGxWYWxpZGF0b3IgPSBuZXcgV1NETFZhbGlkYXRvckltcGwoKTsKLQotICAgIC8vIFJldHVybiB2YWxpZGF0b3IKLSAgICByZXR1cm4gd3NkbFZhbGlkYXRvcjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuUHJvZmlsZVZhbGlkYXRvckZhY3RvcnkjbmV3TWVzc2FnZVZhbGlkYXRvcigpCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZVZhbGlkYXRvciBuZXdNZXNzYWdlVmFsaWRhdG9yKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBtZXNzYWdlIHZhbGlkYXRvciAKLSAgICBNZXNzYWdlVmFsaWRhdG9yIG1lc3NhZ2VWYWxpZGF0b3IgPSBuZXcgTWVzc2FnZVZhbGlkYXRvckltcGwoKTsKLSAgICAvLyBSZXR1cm4gdmFsaWRhdG9yCi0gICAgcmV0dXJuIG1lc3NhZ2VWYWxpZGF0b3I7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLlByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5I25ld0VudmVsb3BlVmFsaWRhdG9yKCkKLSAgICovCi0gIHB1YmxpYyBFbnZlbG9wZVZhbGlkYXRvciBuZXdFbnZlbG9wZVZhbGlkYXRvcigpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSBuZXcgZW52ZWxvcGUgdmFsaWRhdG9yIAotICAgIEVudmVsb3BlVmFsaWRhdG9yIGVudmVsb3BlVmFsaWRhdG9yID0gbmV3IEVudmVsb3BlVmFsaWRhdG9ySW1wbCgpOwotICAgIC8vIFJldHVybiB2YWxpZGF0b3IKLSAgICByZXR1cm4gZW52ZWxvcGVWYWxpZGF0b3I7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9BUDE5MjAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0FQMTkyMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2YyZWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0FQMTkyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRW50cnlUeXBlOwotCi0vKioKLSAqIEFQMTkyMAotICoKLSAqIDxjb250ZXh0PkZvciBhbiBlbnZlbG9wZSBpbiBhIHJlc3BvbnNlIG1lc3NhZ2UKLSAqIGNvbnRhaW5pbmcgYSBzb2FwOkZhdWx0IGVsZW1lbnQ8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+SW4gYSBkZXNjcmlwdGlvbiwgaWYgYW5kIG9ubHkgaWYsIHRoZSB3c2RsOm91dHB1dAotICogZWxlbWVudCBpcyBkZXNjcmliZWQgdXNpbmcgV1NETCBNSU1FIGJpbmRpbmcsIHRoZW4gdGhlIGVudmVsb3BlIGluIHRoZQotICogcmVzcG9uc2UgbWVzc2FnZSBjYW4gY29udGFpbiBmYXVsdHMgd2l0aCBhdHRhY2htZW50cy48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAxOTIwIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAxOTIwKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeSAKLSAgICB7Ci0gICAgICBpZiAoIWVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5pc01pbWVDb250ZW50KCkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGNoZWNrIGZvciBhIGZhdWx0IGVsZW1lbnQgd2l0aGluIHRoZSBtZXNzYWdlIAotICAgICAgaWYoKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpID09IG51bGwpIHx8IAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpLgotICAgICAgICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJVGFnLkVMRU1fU09BUF9GQVVMVC5nZXROYW1lc3BhY2VVUkkoKSwgCi0gICAgICAgICAgICAgIFdTSVRhZy5FTEVNX1NPQVBfRkFVTFQuZ2V0TG9jYWxQYXJ0KCkpLmdldExlbmd0aCgpICE9IDEpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICAKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IHZhbGlkYXRvci5nZXRPcGVyYXRpb25NYXRjaCgKLSAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX01FU1NBR0VfUkVRVUVTVCksCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldFJlcXVlc3REb2N1bWVudCgpKTsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWF0Y2hlZCBvcGVyYXRpb24sIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICAvLyBJZiB0aGUgZW52ZWxvcGUgaW4gYSByZXNwb25zZSBtZXNzYWdlIGNvbnRhaW5zIGEgZmF1bHQgd2l0aCBhdHRhY2htZW50cwotICAgICAgLy8gYW5kIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6b3V0cHV0IGVsZW1lbnQgaW4gdGhlIGRlc2NyaXB0aW9uIGlzIG5vdCAKLSAgICAgIC8vIGRlc2NyaWJlZCB1c2luZyB0aGUgV1NETCBNSU1FIGJpbmRpbmcsIHRoZSBhc3NlcnRpb24gaXMgZmFpbGVkICAKLSAgICAgIGlmICgoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1pbWVQYXJ0cygpLmNvdW50KCkgPiAxKSAmJgotICAgICAgICAgIChnZXRNdWx0aXBhcnRSZWxhdGVkQmluZGluZ3MoYmluZGluZ09wZXJhdGlvbikgPT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0gCi0gICAgICAgICAgdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoIlRoZSBtZXNzYWdlIGNvbnRhaW5zIFwiIiArIAotICAgICAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWltZVBhcnRzKCkuY291bnQoKSArICJcIiBwYXJ0KHMpIiwgCi0gICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsgCi0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBNdWx0aXBhcnQgcmVsYXRlZCBiaW5kaW5ncywgaWYgZG9lcyBub3QgZm91bmQsIHJldHVybnMgbnVsbC4KLSAgICogQHBhcmFtIG9wIGJpbmRpbmcgb3BlcmF0aW9uCi0gICAqIEByZXR1cm4gTXVsdGlwYXJ0IHJlbGF0ZWQgYmluZGluZ3MsIGlmIGRvZXMgbm90IGZvdW5kLCByZXR1cm5zIG51bGwuCi0gICAqLwotICBwcml2YXRlIE1JTUVNdWx0aXBhcnRSZWxhdGVkIGdldE11bHRpcGFydFJlbGF0ZWRCaW5kaW5ncygKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3ApIAotICB7Ci0gICAgLy8gRmluZGluZyBvcGVyYXRpb24gZXh0ZW5zaWJpbGl0eSBlbGVtcwotICAgIC8vIGluIHRoZSBiaW5kaW5nIGRlcGVuZGluZyBvbiBtZXNzYWdlIHR5cGUKLSAgICBMaXN0IGV4dEVsZW1zID0gb3AuZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIC8vIGNoZWNrIGxpc3Qgb24gZmlyc3QgZWxlbWVudAotICAgIGlmKChleHRFbGVtcyA9PSBudWxsKSB8fCAoZXh0RWxlbXMuc2l6ZSgpID09IDApIHx8IAotICAgICAgICEoZXh0RWxlbXMuZ2V0KDApIGluc3RhbmNlb2YgTUlNRU11bHRpcGFydFJlbGF0ZWQpKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuIChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbXMuZ2V0KDApOyAKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0FQMTkyOC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQVAxOTI4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjVmY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQVAxOTI4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNPYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNUZXJtOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NSU1FQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1JTUVVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQVAxOTI4Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIGVudmVsb3BlIGNvbnRhaW5pbmcgYSBVUkkgcmVmZXJlbmNlCi0gKiB0aGF0IGlzIHR5cGVkIHVzaW5nIHRoZSByZWY6c3dhUmVmIHNjaGVtYSB0eXBlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkluIGFuIGVudmVsb3BlLCBhIFVSSSByZWZlcmVuY2UgdGhhdCBpcyB0eXBlZCB1c2luZwotICogdGhlIHJlZjpzd2FSZWYgc2NoZW1hIHR5cGUgcmVzb2x2ZXMgdG8gYSBNSU1FIHBhcnQgaW4gdGhlIHNhbWUgbWVzc2FnZQotICogYXMgdGhlIGVudmVsb3BlLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDE5MjggZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBUDE5MjgoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKCFlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuaXNNaW1lQ29udGVudCgpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgLy8gZ2V0IHRoZSBycm90IHBhcnQgb2YgYSBtdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlCi0gICAgICBEb2N1bWVudCByb290ID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0gICAgICBNaW1lUGFydHMgbWltZVBhcnRzID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1pbWVQYXJ0cygpOwotCi0gICAgICAvLyBnZXQgYW4gb3BlcmF0aW9uIG1hdGNoZWQgZm9yIHRoZSBtZXNzYWdlCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSB2YWxpZGF0b3IuZ2V0T3BlcmF0aW9uTWF0Y2goCi0gICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLCByb290KTsKLSAKLSAgICAgIC8vIGlmIG5vIG9uZSBvcGVyYXRpb24gbWF0Y2hlcywgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gZ2V0IHRoZSBjb3JyZXNwb25kaW5nIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgYW5kIG1lc3NhZ2UKLSAgICAgIExpc3QgZXh0RWxlbXM7Ci0gICAgICBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgICBpZiAoTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVAotICAgICAgICAuZXF1YWxzKGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpKSkKLSAgICAgIHsKLSAgICAgICAgZXh0RWxlbXMgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpID09IG51bGwgPyBudWxsCi0gICAgICAgICAgOiBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICBtZXNzYWdlID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpID09IG51bGwgPyBudWxsCi0gICAgICAgICAgOiBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBleHRFbGVtcyA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpID09IG51bGwgPyBudWxsCi0gICAgICAgICAgOiBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgbWVzc2FnZSA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICA6IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBpbiB0aGUgV1NETCBiaW5kaW5nIG9wZXJhdGlvbiwKLSAgICAgIC8vIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChleHRFbGVtcyA9PSBudWxsIHx8IGV4dEVsZW1zLnNpemUoKSA8IDEpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIENvbGxlY3RpbmcgdGhlIG5hbWVzIG9mIHNjaGVtYSBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkCi0gICAgICAvLyB3aXRoIHRoZSByZWY6c3dhUmVmIHNjaGVtYSB0eXBlCi0gICAgICBMaXN0IHN3YVJlZnMgPSBnZXRTd2FSZWZzKChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtcy5nZXQoMCksIG1lc3NhZ2UpOwotICAgICAgLy8gSWYgc3VjaCBzY2hlbWEgZWxlbWVudHMgYXJlIG5vdCBmb3VuZCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKHN3YVJlZnMuaXNFbXB0eSgpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgc2NoZW1hIGVsZW1lbnQgbmFtZXMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3dhUmVmcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgUU5hbWUgZWxlbU5hbWUgPSAoUU5hbWUpIHN3YVJlZnMuZ2V0KGkpOwotICAgICAgICAvLyBMb29raW5nIGZvciBzdWNoIGVsZW1lbnRzIGluIHRoZSByb290IE1JTUUgcGFydAotICAgICAgICBOb2RlTGlzdCBlbGVtcyA9IHJvb3QuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgICAgIGVsZW1OYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBlbGVtTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSByZWY6c3dhUmVmIHJlZmVyZW5jZXMKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtcy5nZXRMZW5ndGgoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBlbGVtID0gZWxlbXMuaXRlbShqKTsKLSAgICAgICAgICAvLyBHZXR0aW5nIGEgdmFsdWUgb2YgdGhpcyByZWZlcmVuY2UKLSAgICAgICAgICBTdHJpbmcgcmVmID0gZWxlbS5nZXRGaXJzdENoaWxkKCkgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICAgIDogZWxlbS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIGludmFsaWQsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKHJlZiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBlbGVtZW50ICIgKyBlbGVtLmdldE5vZGVOYW1lKCkKLSAgICAgICAgICAgICAgKyAiIG9mIHRoZSByZWY6c3dhUmVmIHNjaGVtYSB0eXBlIGlzIHNwZWNpZmllZCwgYnV0IGl0cyB2YXVsZSIKLSAgICAgICAgICAgICAgKyAiIGlzIGludmFsaWQuIik7Ci0gICAgICAgICAgLy8gSWYgdGhlIFVSSSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSAiY2lkOiIgY29udGVudC1pZCBwcmVmaXgKLSAgICAgICAgICAvLyBUaGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmICghcmVmLnN0YXJ0c1dpdGgoImNpZDoiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIFVSSSAiICsgcmVmCi0gICAgICAgICAgICAgICsgIiBvZiB0aGUgcmVmOnN3YVJlZiBzY2hlbWEgdHlwZSBtdXN0IHVzZSB0aGUgY2lkOiBwcmVmaXguIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJvb2xlYW4gcmVmRm91bmQgPSBmYWxzZTsKLSAgICAgICAgICBJdGVyYXRvciBpTWltZVBhcnRzID0gbWltZVBhcnRzLmdldFBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgTUlNRSBwYXJ0cyBvZiB0aGUgU09BUCBtZXNzYWdlCi0gICAgICAgICAgd2hpbGUgKGlNaW1lUGFydHMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1pbWVQYXJ0IG1pbWVQYXJ0ID0gKE1pbWVQYXJ0KWlNaW1lUGFydHMubmV4dCgpOwotICAgICAgICAgICAgLy8gR2V0dGluZyBwYXJ0J3MgQ29udGVudC1JRCBoZWFkZXIKLSAgICAgICAgICAgIFN0cmluZyBjaWQgPSBNSU1FVXRpbHMuZ2V0TWltZUhlYWRlckF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBtaW1lUGFydC5nZXRIZWFkZXJzKCksIE1JTUVDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfSUQpOwotICAgICAgICAgICAgaWYgKGNpZCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBJZiB0aGUgaGVhZGVyIHZhbHVlIGVxdWFscyB0aGUgcmVmZXJlbmNlIFVSSSwKLSAgICAgICAgICAgICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgTUlNRSBwYXJ0IGlzIGZvdW5kCi0gICAgICAgICAgICAgIGlmIChjaWQuZXF1YWxzKCc8JyArIHJlZi5zdWJzdHJpbmcoNCkgKyAnPicpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVmRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIElmIHRoZSBjb3JyZXNwb25kaW5nIE1JTUUgcGFydCBpcyBub3QgZm91bmQKLSAgICAgICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmICghcmVmRm91bmQpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIFNPQVAgbWVzc2FnZSBkb2VzIG5vdCBjb250YWluIgotICAgICAgICAgICAgICArICIgYSBNSU1FIHBhcnQgd2l0aCB0aGUgPCIgKyByZWYuc3Vic3RyaW5nKDQpICsgIj4gQ29udGVudC1JRC4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgbmFtZXMgb2Ygc2NoZW1hIGVsZW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgd2l0aCB0aGUgcmVmOnN3YVJlZgotICAgKiBzY2hlbWEgdHlwZS4KLSAgICogQHBhcmFtIGV4dEVsZW0gYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBzdWNoIG5hbWVzIGZvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IGdldFN3YVJlZnMoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSwgTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgTGlzdCBzd2FSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChleHRFbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfTUlNRV9NVUxUSVBBUlQpKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgdGhlIHJvb3QgbWltZTpwYXJ0Ci0gICAgICBMaXN0IG1pbWVQYXJ0cyA9ICgoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dEVsZW0pLmdldE1JTUVQYXJ0cygpOwotICAgICAgaWYgKG1pbWVQYXJ0cy5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICAvLyBHZXR0aW5nIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgb2YgdGhlIGZpcnN0IG1pbWU6cGFydAotICAgICAgICBMaXN0IGVsZW1zID0gKChNSU1FUGFydCkgbWltZVBhcnRzLmdldCgwKSkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIExpc3QgYm91bmRQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIE1JTUUgcGFydCdzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBlbGVtcy5zaXplKCk7IGsgKyspCi0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlbGVtID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBlbGVtcy5nZXQoayk7Ci0gICAgICAgICAgLy8gSWYgdGhhdCBpcyBhIHNvYXA6Ym9keQotICAgICAgICAgIGlmIChlbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfU09BUF9CT0RZKSAmJiBtZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0dGluZyBwYXJ0cyBzcGVjaWZpZWQgYnkgdGhlIHBhcnRzIGF0dHJpYnV0ZQotICAgICAgICAgICAgTGlzdCBib2R5UGFydHMgPSAoKFNPQVBCb2R5KSBlbGVtKS5nZXRQYXJ0cygpOwotICAgICAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG1lc3NhZ2UgcGFydHMgYm91bmQgYnkgdGhpcyBzb2FwYmluZDpib2R5Ci0gICAgICAgICAgICBJdGVyYXRvciBpID0gbWVzc2FnZS5nZXRQYXJ0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgaWYgKGJvZHlQYXJ0cyA9PSBudWxsIHx8IGJvZHlQYXJ0cy5jb250YWlucyhwYXJ0LmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib3VuZFBhcnRzLmFkZChwYXJ0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBlbHNlIGlmIHRoYXQgaXMgYSBzb2FwOmhlYWRlcgotICAgICAgICAgIGVsc2UgaWYgKGVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9TT0FQX0hFQURFUikpCi0gICAgICAgICAgewotICAgICAgICAgICAgUU5hbWUgbXNnTmFtZTsKLSAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZTsKLSAgICAgICAgICAgIGlmIChlbGVtIGluc3RhbmNlb2YgU09BUEhlYWRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSAoU09BUEhlYWRlcikgZWxlbTsKLSAgICAgICAgICAgICAgLy8gSWYgdGhlIHBhcnQgaXMgYm91bmQgYnkgdGhpcyBlbGVtZW50Ci0gICAgICAgICAgICAgIG1zZ05hbWUgPSBoZWFkZXIuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICBwYXJ0TmFtZSA9IGhlYWRlci5nZXRQYXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBXU0RMNEogMS40IGRvZXMgbm90IHJlY29nbml6ZSBzb2FwOmhlYWRlciBlbGVtZW50cyB0aGF0Ci0gICAgICAgICAgICAvLyBhcmUgZW5jbG9zZWQgaW4gbWltZTptdWx0aXBhcnRSZWxhdGVkLCBzbyB1c2luZyBhIHdvcmthcm91bmQKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRWxlbWVudCBoZWFkZXIgPQotICAgICAgICAgICAgICAgICgoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBlbGVtKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgIC8vIEdldHRpbmcgdGhlIGVsZW1lbnQncyBtZXNzYWdlIGF0dHJpYnV0ZQotICAgICAgICAgICAgICBTdHJpbmcgbXNnVmFsID0gaGVhZGVyLmdldEF0dHJpYnV0ZSgibWVzc2FnZSIpOwotICAgICAgICAgICAgICAvLyBmaW5kaW5nIHRoZSBjb2xvbiBkZWxpbWl0ZXIKLSAgICAgICAgICAgICAgaW50IGNvbG9uUG9zID0gbXNnVmFsLmluZGV4T2YoIjoiKTsKLSAgICAgICAgICAgICAgU3RyaW5nIG5zID0gbnVsbDsKLSAgICAgICAgICAgICAgLy8gR2V0dGluZyBhIGxvY2FsIHBhcnQKLSAgICAgICAgICAgICAgU3RyaW5nIGxwID0gY29sb25Qb3MgPiAtMSA/IG1zZ1ZhbC5zdWJzdHJpbmcoY29sb25Qb3MgKyAxKSA6IG1zZ1ZhbDsKLSAgICAgICAgICAgICAgLy8gSWYgdGhlIGRlbGltaXRlciBpcyBmb3VuZAotICAgICAgICAgICAgICBpZiAoY29sb25Qb3MgPiAtMSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFJldHJpZXZpbmcgYSBuYW1lc3BhY2UgVVJJCi0gICAgICAgICAgICAgICAgbnMgPSB2YWxpZGF0b3IuZ2V0V1NETERvY3VtZW50KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmaW5pdGlvbnMoKS5nZXROYW1lc3BhY2UobXNnVmFsLnN1YnN0cmluZygwLCBjb2xvblBvcykpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1zZ05hbWUgPSBuZXcgUU5hbWUobnMsIGxwKTsKLSAgICAgICAgICAgICAgcGFydE5hbWUgPSBoZWFkZXIuZ2V0QXR0cmlidXRlKCJwYXJ0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBHZXR0aW5nIGEgbWVzc2FnZSByZWZlcmVuY2VkIGJ5IHRoaXMgc29hcGJpbmQ6aGVhZGVyIGVsZW1lbnQKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gCi0gICAgICAgICAgICAgIHZhbGlkYXRvci5nZXRXU0RMRG9jdW1lbnQoKS5nZXREZWZpbml0aW9ucygpLmdldE1lc3NhZ2UobXNnTmFtZSk7Ci0gICAgICAgICAgICBpZiAobXNnICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIEFkZGluZyB0aGUgcGFydCB0byB0aGUgbGlzdCBvZiBib3VuZCBwYXJ0cwotICAgICAgICAgICAgICBQYXJ0IHBhcnQgPSBtc2cuZ2V0UGFydChwYXJ0TmFtZSk7Ci0gICAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgYm91bmRQYXJ0cy5hZGQocGFydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWxsIHRoZSBib3VuZCBwYXJ0cyBmcm9tIHNvYXBiaW5kOmJvZHkgYW5kIHNvYXBiaW5kOmhlYWRlcgotICAgICAgICAvLyBhcmUgY29sbGVjdGVkLCBmaW5kaW5nIHN3YVJlZiByZWZlcmVuY2VzLgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJvdW5kUGFydHMuc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgYm91bmRQYXJ0cy5nZXQoaSk7Ci0gICAgICAgICAgUU5hbWUgcmVmOwotICAgICAgICAgIHNob3J0IHR5cGU7Ci0gICAgICAgICAgLy8gR2V0dGluZyBlaXRoZXIgcGFydCdzIGVsZW1lbnQgcmVmZXJlbmNlIG9yIHR5cGUgcmVmZXJlbmNlCi0gICAgICAgICAgaWYgKChyZWYgPSBwYXJ0LmdldFR5cGVOYW1lKCkpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZSA9IFhTQ29uc3RhbnRzLlRZUEVfREVGSU5JVElPTjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoKHJlZiA9IHBhcnQuZ2V0RWxlbWVudE5hbWUoKSkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlID0gWFNDb25zdGFudHMuRUxFTUVOVF9ERUNMQVJBVElPTjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gVGhlIHBhcnQgY29uYXRpbnMgbmVpdGhlciBlbGVtZW50IG5vciB0eXBlIGF0dHJpYnV0ZSwKLSAgICAgICAgICAvLyBwcm9jZWVkaW5nIHdpdGggdGhlIG5leHQgcGFydAotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gR2V0dGluZyBhIGxpc3Qgb2Ygc2NoZW1hcyBkZWZpbmVkCi0gICAgICAgICAgTWFwIHNjaGVtYXMgPSB2YWxpZGF0b3IuZ2V0V1NETERvY3VtZW50KCkuZ2V0U2NoZW1hcygpOwotICAgICAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIHNjaGVtYXMKLSAgICAgICAgICBJdGVyYXRvciBpdCA9IHNjaGVtYXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTTW9kZWwgeHNNb2RlbCA9IChYU01vZGVsKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBYU1R5cGVEZWZpbml0aW9uIHhzVHlwZSA9IG51bGw7Ci0gICAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBjb3JyZXNwb25kaW5nIHBhcnQgdHlwZQotICAgICAgICAgICAgaWYgKHR5cGUgPT0gWFNDb25zdGFudHMuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gR2V0dGluZyBzY2hlbWEgZWxlbWVudAotICAgICAgICAgICAgICBYU0VsZW1lbnREZWNsYXJhdGlvbiBlbGVtID0geHNNb2RlbC5nZXRFbGVtZW50RGVjbGFyYXRpb24oCi0gICAgICAgICAgICAgICAgcmVmLmdldExvY2FsUGFydCgpLCByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICBpZiAoZWxlbSAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gR2V0dGluZyBlbGVtZW50J3MgdHlwZQotICAgICAgICAgICAgICAgIHhzVHlwZSA9IGVsZW0uZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyByZWY6c3dhUmVmCi0gICAgICAgICAgICAgICAgaWYgKFdTSUNvbnN0YW50cy5OU19VUklfU1dBX1JFRi5lcXVhbHMoeHNUeXBlLmdldE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICYmIFdTSUNvbnN0YW50cy5TQ0hFTUFfVFlQRV9TV0FfUkVGLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgeHNUeXBlLmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBBZGRpbmcgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgIHN3YVJlZnMuYWRkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoZWxlbS5nZXROYW1lc3BhY2UoKSwgZWxlbS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeHNUeXBlID0geHNNb2RlbC5nZXRUeXBlRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICByZWYuZ2V0TG9jYWxQYXJ0KCksIHJlZi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgZWxlbWVudCBuYW1lcyxhZGRpbmcgZWxlbWVudCBuYW1lcyB0byB0aGUgbGlzdAotICAgICAgICAgICAgc3dhUmVmcy5hZGRBbGwoY29sbGVjdFN3YVJlZnMoeHNUeXBlKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzd2FSZWZzOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbGxlY3RzIG5hbWVzIG9mIHNjaGVtYSBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIHdpdGggdGhlIHJlZjpzd2FSZWYKLSAgICogc2NoZW1hIHR5cGUuCi0gICAqIEBwYXJhbSB4c1R5cGUgYSBzY2hlbWEgdHlwZS4KLSAgICogQHJldHVybiBhIGxpc3Qgb2YgbmFtZXMgZm91bmQuCi0gICAqLwotICBwcml2YXRlIExpc3QgY29sbGVjdFN3YVJlZnMoWFNUeXBlRGVmaW5pdGlvbiB4c1R5cGUpCi0gIHsKLSAgICBMaXN0IHN3YVJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHhzVHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIElmIHRoaXMgaXMgYSBjb21wbGV4IHR5cGUKLSAgICAgIGlmICh4c1R5cGUuZ2V0VHlwZUNhdGVnb3J5KCkgPT0gWFNUeXBlRGVmaW5pdGlvbi5DT01QTEVYX1RZUEUpCi0gICAgICB7Ci0gICAgICAgIFhTQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzQ29tcGxleFR5cGUgPQotICAgICAgICAgIChYU0NvbXBsZXhUeXBlRGVmaW5pdGlvbikgeHNUeXBlOwotICAgICAgICAvLyBJZiBpdCBjb250YWlucyBtaXhlZCBjb250ZXh0Ci0gICAgICAgIGlmICh4c0NvbXBsZXhUeXBlLmdldFBhcnRpY2xlKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIGNvbGxlY3RpbmcgZWxlbWVudCBuYW1lcyAKLSAgICAgICAgICBzd2FSZWZzLmFkZEFsbChjb2xsZWN0U3dhUmVmcyh4c0NvbXBsZXhUeXBlLmdldFBhcnRpY2xlKCkuZ2V0VGVybSgpKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN3YVJlZnM7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgbmFtZXMgb2Ygc2NoZW1hIGVsZW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgd2l0aCB0aGUgcmVmOnN3YVJlZgotICAgKiBzY2hlbWEgdHlwZS4KLSAgICogQHBhcmFtIHRlcm0gYSBzY2hlbWEgdGVybS4KLSAgICogQHJldHVybiBhIGxpc3Qgb2YgbmFtZXMgZm91bmQuCi0gICAqLwotICBwcml2YXRlIExpc3QgY29sbGVjdFN3YVJlZnMoWFNUZXJtIHRlcm0pCi0gIHsKLSAgICBMaXN0IHN3YVJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7IAotICAgIC8vIElmIGEgdGVybSBpcyBhbiBlbGVtZW50IGRlY2xhcmF0aW9uCi0gICAgaWYgKHRlcm0uZ2V0VHlwZSgpID09IFhTQ29uc3RhbnRzLkVMRU1FTlRfREVDTEFSQVRJT04pCi0gICAgewotICAgICAgWFNFbGVtZW50RGVjbGFyYXRpb24gZWxlbSA9IChYU0VsZW1lbnREZWNsYXJhdGlvbikgdGVybTsKLSAgICAgIFhTVHlwZURlZmluaXRpb24geHNUeXBlID0gZWxlbS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgLy8gSWYgZWxlbWVudCdzIHR5cGUgaXMgcmVmOnN3YVJlZgotICAgICAgaWYgKFdTSUNvbnN0YW50cy5OU19VUklfU1dBX1JFRi5lcXVhbHMoeHNUeXBlLmdldE5hbWVzcGFjZSgpKQotICAgICAgICAmJiBXU0lDb25zdGFudHMuU0NIRU1BX1RZUEVfU1dBX1JFRi5lcXVhbHMoeHNUeXBlLmdldE5hbWUoKSkpCi0gICAgICB7Ci0gICAgICAgIC8vIEFkZCBlbGVtZW50J3MgbmFtZSB0byB0aGUgbGlzdAotICAgICAgICBzd2FSZWZzLmFkZCgKLSAgICAgICAgICBuZXcgUU5hbWUoZWxlbS5nZXROYW1lc3BhY2UoKSwgZWxlbS5nZXROYW1lKCkpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gZWxzZSBjb2xsZWN0aW5nIGVsZW1lbnQgbmFtZXMgZnJvbSBlbGVtZW50J3MgdHlwZQotICAgICAgICBzd2FSZWZzLmFkZEFsbChjb2xsZWN0U3dhUmVmcyh4c1R5cGUpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gZWxzZSBpZiBhIHRlcm0gaXMgYSBtb2RlbCBncm91cAotICAgIGVsc2UgaWYodGVybS5nZXRUeXBlKCkgPT0gWFNDb25zdGFudHMuTU9ERUxfR1JPVVApCi0gICAgewotICAgICAgLy8gR2V0dGluZyBhIGxpc3Qgb2YgUGFydGljbGUgc2NoZW1hIGNvbXBvbmVudHMKLSAgICAgIFhTT2JqZWN0TGlzdCBsaXN0ID0gKChYU01vZGVsR3JvdXApIHRlcm0pLmdldFBhcnRpY2xlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIC8vIENvbGxlY3RpbmcgZWxlbWVudCBuYW1lcwotICAgICAgICBzd2FSZWZzLmFkZEFsbChjb2xsZWN0U3dhUmVmcygoKFhTUGFydGljbGUpIGxpc3QuaXRlbShpKSkuZ2V0VGVybSgpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzd2FSZWZzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDA1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FhNDY1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuT3BlcmF0aW9uU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlR5cGVzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogQlAxMDA1LgotICovCi1wdWJsaWMgY2xhc3MgQlAxMDA1IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMDA1KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIFBhcnNlIG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotCi0gICAgICAvLyBJZiB0aGlzIGlzIGEgZmF1bHQgbWVzYWdlLCB0aGVuIGl0IGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNGYXVsdChkb2MpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHNvYXAgYm9keSBlbGVtZW50Ci0gICAgICBpZiAoIXRoaXMudmFsaWRhdG9yLmNvbnRhaW5zU29hcEJvZHlXaXRoQ2hpbGQoZG9jKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gUGFyc2UgcmVxdWVzdCBtZXNzYWdlCi0gICAgICBEb2N1bWVudCBkb2NSZXF1ZXN0ID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3REb2N1bWVudCgpOwotCi0gICAgICAvLyBnZXQgU09BUEFjdGlvbgotICAgICAgU3RyaW5nIGhlYWRlcnMgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCk7Ci0gICAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpCi0gICAgICAgIGFjdGlvbiA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKGhlYWRlcnMsICI6IikuZ2V0KCJTT0FQQWN0aW9uIi50b1VwcGVyQ2FzZSgpKTsKLQotICAgICAgQmluZGluZyBiaW5kaW5nID0gdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKVswXTsKLSAgICAgIFR5cGVzUmVnaXN0cnkgcmVnaXN0cnkgPQotICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5nZXRXU0RMRG9jdW1lbnQoKS5nZXREZWZpbml0aW9ucygpLAotICAgICAgICAgIHZhbGlkYXRvcik7Ci0gICAgICBPcGVyYXRpb25TaWduYXR1cmUuT3BlcmF0aW9uTWF0Y2ggbWF0Y2ggPQotICAgICAgICBPcGVyYXRpb25TaWduYXR1cmUubWF0Y2hPcGVyYXRpb24oCi0gICAgICAgICAgZG9jUmVxdWVzdCwKLSAgICAgICAgICBhY3Rpb24sCi0gICAgICAgICAgYmluZGluZywKLSAgICAgICAgICByZWdpc3RyeSk7Ci0gICAgICBpZiAobWF0Y2ggPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gbWF0Y2guZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgICAgIC8vIElzIHJwYyBzdHlsZT8KLSAgICAgIGlmICghV1NJQ29uc3RhbnRzCi0gICAgICAgIC5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMKLSAgICAgICAgLmVxdWFscyhtYXRjaC5nZXRPcGVyYXRpb25TdHlsZSgpKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgTGlzdCBleHRFbGVtZW50cyA9IG51bGw7Ci0KLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSAhPSBudWxsKQotICAgICAgICBleHRFbGVtZW50cyA9Ci0gICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0KLSAgICAgIC8vIElzIG1lc3NhZ2UgUlBDLWxpdGVyYWw/Ci0gICAgICBpZiAoIXZhbGlkYXRvci5pc0xpdGVyYWwoZXh0RWxlbWVudHMpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvL0dldCBtZXNzYWdlCi0KLSAgICAgIC8vIEdldHMgYm9keQotICAgICAgTm9kZUxpc3Qgc29hcEJvZHlMaXN0ID0KLSAgICAgICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLAotICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9CT0RZKTsKLSAgICAgIGlmIChzb2FwQm9keUxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCB8fCBzb2FwQm9keUxpc3QuZ2V0TGVuZ3RoKCkgPiAxKQotICAgICAgewotICAgICAgICAvLyBUaGVyZSBpcyBub3QgYSBib2R5IG9yIG1vcmUgdGhhbiBvbmUgYm9kaWVzIGluIHRoZSBlbnZsb3BlLgotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgRWxlbWVudCBzb2FwQm9keUVsZW0gPSAoRWxlbWVudCkgc29hcEJvZHlMaXN0Lml0ZW0oMCk7Ci0KLSAgICAgIC8vIEZpbmQgd3JhcHBlciBlbGVtZW50IGluIHRoZSBib2R5Ci0gICAgICBFbGVtZW50IHdyYXBwZXJFbGVtZW50ID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChzb2FwQm9keUVsZW0pOwotICAgICAgaWYgKHdyYXBwZXJFbGVtZW50ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh3cmFwcGVyRWxlbWVudAotICAgICAgICAuZ2V0TG9jYWxOYW1lKCkKLSAgICAgICAgLmVxdWFscyhiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArICJSZXNwb25zZSIpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMDcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAwNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njk0ODY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAwNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0KLS8qKgotICogQlAxMDA3Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG1lc3NhZ2UsIGluIHRoZSBtZXNzYWdlIGxvZyBmaWxlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkRURHMgcmVsYXRpbmcgdG8gc29hcDpoZWFkZXIgb3Igc29hcDpib2R5IGRvY3VtZW50cywgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBtZXNzYWdlOiBubyBET0NUWVBFIGVsZW1lbnQgaXMgcHJlc2VudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAxMDA3IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMDA3KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFBhcnNlIGxvZyBtZXNzYWdlIAotICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBtZXNzYWdlIGlzIGVtcHR5IG9yIGludmFsaWQsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIC8vIGVsc2UgaWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgYSBEb2N1bWVudCBUeXBlIERlY2xhcmF0aW9uLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgIGVsc2UgaWYgKGRvYy5nZXREb2N0eXBlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgdGVzdEFzc2VydGlvbi5nZXRGYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24oKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTIwMjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvblBhc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuT3BlcmF0aW9uU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlR5cGVzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogQlAxMDA4LgotICogTWVzc2FnZSBoYXMgcGFydCBhY2Nlc3NvciBlbGVtZW50cyBmb3IgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlLCBpbiBubyBuYW1lc3BhY2VzLCAKLSAqIGJ1dCB0aGUgY2hpbGRyZW4gb2YgdGhlc2UgYXJlIG5hbWVzcGFjZSBxdWFsaWZpZWQgd2l0aCB0aGUgc2FtZSB0YXJnZXROYW1lc3BhY2Ugd2l0aCB3aGljaCAKLSAqIHRoZWlyIHR5cGVzIGFyZSBkZWZpbmVkLgotICovCi1wdWJsaWMgY2xhc3MgQlAxMDA4IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMDA4KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0KLSAgICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgIEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEUpOwotCi0gICAgICAvLyBQYXJzZSBtZXNzYWdlCi0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWVzc2FnZSwgdGhlbiB0aHJvdyBmYWlsIGV4Y2VwdGlvbgotICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigpOwotCi0gICAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNGYXVsdChkb2MpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBzb2FwIGJvZHkgZWxlbWVudAotICAgICAgaWYgKCF0aGlzLnZhbGlkYXRvci5jb250YWluc1NvYXBCb2R5V2l0aENoaWxkKGRvYykpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFBhcnNlIHJlcXVlc3QgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jUmVxdWVzdCA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0RG9jdW1lbnQoKTsKLQotICAgICAgLy8gZ2V0IFNPQVBBY3Rpb24KLSAgICAgIFN0cmluZyBhY3Rpb24gPQotICAgICAgICB2YWxpZGF0b3IuZ2V0U29hcEFjdGlvbihlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCkpOwotCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXRCaW5kaW5ncygpWzBdOwotICAgICAgLy9EZWZpbml0aW9uIGRlZmluaXRpb24gPSBlbnRyeUNvbnRleHQuZ2V0QW5hbHl6ZXJDb250ZXh0KCkuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldERlZmluaXRpb25zKClbMF07Ci0gICAgICBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0KLSAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuZ2V0V1NETERvY3VtZW50KCkuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICB2YWxpZGF0b3IpOwotICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLk9wZXJhdGlvbk1hdGNoIG1hdGNoID0KLSAgICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLm1hdGNoT3BlcmF0aW9uKAotICAgICAgICAgIGRvY1JlcXVlc3QsCi0gICAgICAgICAgYWN0aW9uLAotICAgICAgICAgIGJpbmRpbmcsCi0gICAgICAgICAgcmVnaXN0cnkpOwotICAgICAgaWYgKG1hdGNoID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IG1hdGNoLmdldE9wZXJhdGlvbigpOwotCi0gICAgICAvLyBJcyBycGMgc3R5bGU/Ci0gICAgICBpZiAoIVdTSUNvbnN0YW50cwotICAgICAgICAuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDCi0gICAgICAgIC5lcXVhbHMobWF0Y2guZ2V0T3BlcmF0aW9uU3R5bGUoKSkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgIEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEUpOwotCi0gICAgICAvLyBHZXRzIGJvZHkKLSAgICAgIE5vZGVMaXN0IHNvYXBCb2R5TGlzdCA9Ci0gICAgICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwKLSAgICAgICAgICBYTUxVdGlscy5TT0FQX0VMRU1fQk9EWSk7Ci0gICAgICBpZiAoc29hcEJvZHlMaXN0LmdldExlbmd0aCgpID09IDAgfHwgc29hcEJvZHlMaXN0LmdldExlbmd0aCgpID4gMSkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlcmUgaXMgbm90IGEgYm9keSBvciBtb3JlIHRoYW4gb25lIGJvZGllcyBpbiB0aGUgZW52bG9wZS4KLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIEVsZW1lbnQgc29hcEJvZHlFbGVtID0gKEVsZW1lbnQpIHNvYXBCb2R5TGlzdC5pdGVtKDApOwotCi0gICAgICByZXN1bHQgPSBudWxsOwotCi0gICAgICAvLyBGaW5kIG9wZXJhdGlvbiBpbiB0aGUgYm9keQotICAgICAgRWxlbWVudCBzb2FwT3BlcmF0aW9uID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChzb2FwQm9keUVsZW0pOwotICAgICAgaWYgKHNvYXBPcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gRmluZCBvcGVyYXRpb24gbWVzc2FnZSBhbmQgZXh0LiBlbGVtZW50cyBpbiB0aGUgYmluZGluZwotICAgICAgTWVzc2FnZSBvcGVyYXRpb25NZXNzYWdlID0gbnVsbDsKLSAgICAgIExpc3QgZXh0RWxlbWVudHMgPSBudWxsOwotICAgICAgaWYgKE1lc3NhZ2VFbnRyeQotICAgICAgICAuVFlQRV9SRVFVRVNUCi0gICAgICAgIC5lcXVhbHMoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldFR5cGUoKSkpCi0gICAgICB7Ci0gICAgICAgIG9wZXJhdGlvbk1lc3NhZ2UgPQotICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpICE9IG51bGwpCi0gICAgICAgICAgZXh0RWxlbWVudHMgPQotICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKE1lc3NhZ2VFbnRyeQotICAgICAgICAgIC5UWVBFX1JFU1BPTlNFCi0gICAgICAgICAgLmVxdWFscyhlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIG9wZXJhdGlvbk1lc3NhZ2UgPQotICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgICAgICAgICBleHRFbGVtZW50cyA9Ci0gICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIElzIG1lc3NhZ2UgUlBDLWxpdGVyYWw/Ci0gICAgICBpZiAoIXZhbGlkYXRvci5pc0xpdGVyYWwoZXh0RWxlbWVudHMpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFKTsKLQotICAgICAgLy8gZ2V0cyBmaXJzdCBjaGlsZCBvZiBtZXNzYWdlCi0gICAgICBFbGVtZW50IHNvYXBNZXNzYWdlUGFydCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoc29hcE9wZXJhdGlvbik7Ci0gICAgICBpZiAoc29hcE1lc3NhZ2VQYXJ0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIHdoaWxlIChzb2FwTWVzc2FnZVBhcnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gY2hlY2sgd2hldGhlciBwYXJ0IGFjY2Vzc29yIG9yIHJldHVybiBhcmUgaW4gbm8gbmFtZXNwYWNlCQkgICAgCQkKLQotICAgICAgICBpZiAoc29hcE1lc3NhZ2VQYXJ0LmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwKLSAgICAgICAgICB8fCAiIi5lcXVhbHMoc29hcE1lc3NhZ2VQYXJ0LmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAgICBjaGVjayB3aGV0aGVyIGNoaWxkcmVuIGFyZSBuYW1lc3BhY2UgcXVhbGlmaWVkIAotICAgICAgICAvLyAgd2l0aCB0aGUgc2FtZSB0YXJnZXROYW1lc3BhY2Ugd2l0aCB3aGljaCB0aGVpciB0eXBlcyBhcmUgZGVmaW5lZAotICAgICAgICBTdHJpbmcgdHlwZXNUYXJnZXROUyA9Ci0gICAgICAgICAgZ2V0VHlwZU5TKG9wZXJhdGlvbk1lc3NhZ2UsIHNvYXBNZXNzYWdlUGFydC5nZXRMb2NhbE5hbWUoKSk7Ci0KLSAgICAgICAgaWYgKHR5cGVzVGFyZ2V0TlMgPT0gbnVsbCkKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigpOwotCi0gICAgICAgIGlmICghY2hlY2tDaGlsZHJlbk5hbWVzcGFjZShzb2FwTWVzc2FnZVBhcnQsIHR5cGVzVGFyZ2V0TlMpKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNvYXBNZXNzYWdlUGFydCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKHNvYXBNZXNzYWdlUGFydCk7Ci0gICAgICB9Ci0KLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaWYgKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgZS5nZXRNZXNzYWdlKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICByZXN1bHQgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIGlmIChyZXN1bHQgPT0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQpCi0gICAgewotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwobnVsbCwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBwYXJ0IHR5cGUgTlMuCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqIEBwYXJhbSBwYXJ0TmFtZQotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VHlwZU5TKE1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIHBhcnROYW1lKQotICB7Ci0gICAgUGFydCBwYXJ0ID0gbWVzc2FnZS5nZXRQYXJ0KHBhcnROYW1lKTsKLSAgICBpZiAocGFydCA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHBhcnQuZ2V0VHlwZU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgY2hpbGRyZW4gZWxlbWVudHMnIG5hbWVzcGFjZS4KLSAgICogQHBhcmFtIG5vZGUKLSAgICogQHBhcmFtIHR5cGVzVGFyZ2V0TlMKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotCi0gIHByaXZhdGUgYm9vbGVhbiBjaGVja0NoaWxkcmVuTmFtZXNwYWNlKEVsZW1lbnQgbm9kZSwgU3RyaW5nIHR5cGVzVGFyZ2V0TlMpCi0gIHsKLSAgICBOb2RlTGlzdCBwYXJ0cyA9IG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgRWxlbWVudCBwYXJ0ID0gKEVsZW1lbnQpIHBhcnRzLml0ZW0oaSk7Ci0gICAgICBpZiAoIXR5cGVzVGFyZ2V0TlMuZXF1YWxzKHBhcnQuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoIWNoZWNrQ2hpbGRyZW5OYW1lc3BhY2UocGFydCwgdHlwZXNUYXJnZXROUykpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAwOS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDA5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjFlMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDA5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25QYXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5PcGVyYXRpb25TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVHlwZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBCUDEwMDkuCi0gKiBNZXNzYWdlIGluY2x1ZGVzIGFsbCBzb2FwYmluZDpoZWFkZXJzIHNwZWNpZmllZCBpbiB0aGUgd3NkbDppbnB1dCAKLSAqIChpZiByZXF1ZXN0KSBvciB3c2RsOm91dHB1dCAoaWYgcmVzcG9uc2UpIG9mIHRoZSBvcGVyYXRpb24gcmVmZXJyZWQgCi0gKiB0byBieSBpdHMgd3NkbDpiaW5kaW5nLCBhbmQgbWF5IGFsc28gaW5jbHVkZSBoZWFkZXJzIHRoYXQgd2VyZSBub3Qgc3BlY2lmaWVkLgotICovCi1wdWJsaWMgY2xhc3MgQlAxMDA5IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMDA5KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKFRlc3RBc3NlcnRpb24sIEVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gUGFyc2UgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICAgIC8vIFBhcnNlIHJlcXVlc3QgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jUmVxdWVzdCA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0RG9jdW1lbnQoKTsKLQotICAgICAgaWYgKGRvYyA9PSBudWxsIHx8IGRvY1JlcXVlc3QgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBzb2FwIGJvZHkgZWxlbWVudAotICAgICAgaWYgKCF0aGlzLnZhbGlkYXRvci5jb250YWluc1NvYXBCb2R5V2l0aENoaWxkKGRvYykpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc0ZhdWx0KGRvYykpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgIEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEUpOwotICAgICAgfQotCi0gICAgICAvLyBnZXQgU09BUEFjdGlvbgotICAgICAgU3RyaW5nIGhlYWRlcnMgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCk7Ci0gICAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpCi0gICAgICAgIGFjdGlvbiA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKGhlYWRlcnMsICI6IikuZ2V0KCJTT0FQQWN0aW9uIi50b1VwcGVyQ2FzZSgpKTsKLQotICAgICAgQmluZGluZyBiaW5kaW5nID0gdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKVswXTsKLSAgICAgIFR5cGVzUmVnaXN0cnkgcmVnaXN0cnkgPQotICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5nZXRXU0RMRG9jdW1lbnQoKS5nZXREZWZpbml0aW9ucygpLAotICAgICAgICAgIHZhbGlkYXRvcik7Ci0gICAgICBPcGVyYXRpb25TaWduYXR1cmUuT3BlcmF0aW9uTWF0Y2ggbWF0Y2ggPQotICAgICAgICBPcGVyYXRpb25TaWduYXR1cmUubWF0Y2hPcGVyYXRpb24oCi0gICAgICAgICAgZG9jUmVxdWVzdCwKLSAgICAgICAgICBhY3Rpb24sCi0gICAgICAgICAgYmluZGluZywKLSAgICAgICAgICByZWdpc3RyeSk7Ci0KLSAgICAgIGlmIChtYXRjaCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBtYXRjaC5nZXRPcGVyYXRpb24oKTsKLQotICAgICAgLy8gSWYgdGhpcyBpcyBhIG9uZS13YXkgb3BlcmF0aW9uIGFuZCB3ZSBhcmUgcHJvY2Vzc2luZyBhIHJlc3BvbnNlLCB0aGVuIHNldCByZXN1bHQgdG8gbm90QXBwbGljYWJsZQotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgLmdldE9wZXJhdGlvbigpCi0gICAgICAgIC5nZXRTdHlsZSgpCi0gICAgICAgIC5lcXVhbHMoT3BlcmF0aW9uVHlwZS5PTkVfV0FZKQotICAgICAgICAmJiAoZW50cnlDb250ZXh0Ci0gICAgICAgICAgLmdldE1lc3NhZ2VFbnRyeSgpCi0gICAgICAgICAgLmdldFR5cGUoKQotICAgICAgICAgIC5lcXVhbHMoTWVzc2FnZUVudHJ5LlRZUEVfUkVTUE9OU0UpKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gZmluZCBib2R5Ci0gICAgICBOb2RlTGlzdCBzb2FwQm9keUxpc3QgPQotICAgICAgICBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsCi0gICAgICAgICAgWE1MVXRpbHMuU09BUF9FTEVNX0JPRFkpOwotICAgICAgaWYgKHNvYXBCb2R5TGlzdC5nZXRMZW5ndGgoKSA9PSAwIHx8IHNvYXBCb2R5TGlzdC5nZXRMZW5ndGgoKSA+IDEpCi0gICAgICB7Ci0gICAgICAgIC8vIFRoZXJlIGlzIG5vdCBhIGJvZHkgb3IgbW9yZSB0aGFuIG9uZSBib2RpZXMgaW4gdGhlIGVudmxvcGUuCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBFbGVtZW50IHNvYXBCb2R5RWxlbSA9IChFbGVtZW50KSBzb2FwQm9keUxpc3QuaXRlbSgwKTsKLQotICAgICAgLy8gZmluZCBoZWFkZXJzCi0gICAgICBOb2RlTGlzdCBzb2FwSGVhZGVycyA9Ci0gICAgICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICAgIFdTSVRhZy5FTEVNX1NPQVBfSEVBREVSLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgIFdTSVRhZy5FTEVNX1NPQVBfSEVBREVSLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgLy9maW5kIGFsbCBvcGVyYXRpb24KLSAgICAgIC8vRWxlbWVudCBzb2FwT3BlcmF0aW9uID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChzb2FwQm9keUVsZW0pOwotCi0gICAgICAvLyBnZXRzIHNvYXBiaW5kOmhlYWRlcnMKLSAgICAgIExpc3QgYmluZGluZ0hlYWRlcnMgPSBudWxsOwotICAgICAgaWYgKGVudHJ5Q29udGV4dAotICAgICAgICAuZ2V0TWVzc2FnZUVudHJ5KCkKLSAgICAgICAgLmdldFR5cGUoKQotICAgICAgICAuZXF1YWxzKE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QpKQotICAgICAgewotICAgICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgICAgIGJpbmRpbmdIZWFkZXJzID0KLSAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigpOwotCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChlbnRyeUNvbnRleHQKLSAgICAgICAgICAuZ2V0TWVzc2FnZUVudHJ5KCkKLSAgICAgICAgICAuZ2V0VHlwZSgpCi0gICAgICAgICAgLmVxdWFscyhNZXNzYWdlRW50cnkuVFlQRV9SRVNQT05TRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgICAgICAgIGJpbmRpbmdIZWFkZXJzID0KLSAgICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGJpbmRpbmdIZWFkZXJzID09IG51bGwgfHwgYmluZGluZ0hlYWRlcnMuc2l6ZSgpID09IDApCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYmluZGluZ0hlYWRlcnMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBiaW5kaW5nSGVhZGVyID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBpZiAoYmluZGluZ0hlYWRlciBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBmaW5kIHNvYXBiaW5kOmhlYWRlciBpbiBTT0FQIG1lc3NhZ2UKLSAgICAgICAgICBpZiAoIWlzQmluZGluZ0hlYWRlckluU09BUE1lc3NhZ2UoZW50cnlDb250ZXh0LAotICAgICAgICAgICAgc29hcEhlYWRlcnMsCi0gICAgICAgICAgICAoU09BUEhlYWRlcikgYmluZGluZ0hlYWRlcikpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBlLmdldE1lc3NhZ2UoKS5sZW5ndGgoKSA+IDApCi0gICAgICAgIHJlc3VsdCA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvblBhc3NFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCA9PSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRCkKLSAgICB7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChudWxsLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAqIENoZWNrcyB3aGV0aGVyIHNwZWNpZmllZCBTT0FQSGVhZGVyIGlzIGluIHRoZSBTT0FQTWVzc2FnZS4KLSAgKiBAcGFyYW0gc29hcEhlYWRlckxpc3QKLSAgKiBAcGFyYW0gU09BUEhlYWRlcgotICAqIEByZXR1cm4gYm9vbGVhbgotICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNCaW5kaW5nSGVhZGVySW5TT0FQTWVzc2FnZSgKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0LAotICAgIE5vZGVMaXN0IHNvYXBIZWFkZXJzLAotICAgIFNPQVBIZWFkZXIgYmluZGluZ0hlYWRlcikKLSAgewotCi0gICAgTWVzc2FnZSBtc2cgPSBnZXRNZXNzYWdlQnlRTmFtZShlbnRyeUNvbnRleHQsIGJpbmRpbmdIZWFkZXIuZ2V0TWVzc2FnZSgpKTsKLSAgICBpZiAobXNnID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBQYXJ0IHBhcnQgPSBtc2cuZ2V0UGFydChiaW5kaW5nSGVhZGVyLmdldFBhcnQoKSk7Ci0gICAgaWYgKHBhcnQgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFFOYW1lIHBhcnRFbGVtZW50TmFtZSA9IHBhcnQuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICBRTmFtZSBwYXJ0VHlwZU5hbWUgPSBwYXJ0LmdldFR5cGVOYW1lKCk7Ci0KLSAgICBpZiAocGFydFR5cGVOYW1lID09IG51bGwgJiYgcGFydEVsZW1lbnROYW1lID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoc29hcEhlYWRlcnMgPT0gbnVsbCB8fCBzb2FwSGVhZGVycy5nZXRMZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgVmVjdG9yIGhlYWRlcnNMaXN0ID0KLSAgICAgIFhNTFV0aWxzLmdldENoaWxkRWxlbWVudHMoKEVsZW1lbnQpIHNvYXBIZWFkZXJzLml0ZW0oMCkpOwotCi0gICAgZm9yIChpbnQgaW5kZXhIZWFkZXIgPSAwOwotICAgICAgaW5kZXhIZWFkZXIgPCBoZWFkZXJzTGlzdC5zaXplKCk7Ci0gICAgICBpbmRleEhlYWRlcisrKQotICAgIHsKLSAgICAgIEVsZW1lbnQgc29hcEhlYWRlclBhcnQgPSAoRWxlbWVudCkgaGVhZGVyc0xpc3QuZ2V0KGluZGV4SGVhZGVyKTsKLSAgICAgIGlmIChzb2FwSGVhZGVyUGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBRTmFtZSBzb2FwSGVhZGVyUGFydFFOYW1lID0KLSAgICAgICAgICBuZXcgUU5hbWUoCi0gICAgICAgICAgICBzb2FwSGVhZGVyUGFydC5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgIHNvYXBIZWFkZXJQYXJ0LmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgaWYgKChwYXJ0VHlwZU5hbWUgIT0gbnVsbAotICAgICAgICAgICYmIHBhcnRUeXBlTmFtZS5lcXVhbHMoc29hcEhlYWRlclBhcnRRTmFtZSkpCi0gICAgICAgICAgfHwgKHBhcnRFbGVtZW50TmFtZSAhPSBudWxsCi0gICAgICAgICAgICAmJiBwYXJ0RWxlbWVudE5hbWUuZXF1YWxzKHNvYXBIZWFkZXJQYXJ0UU5hbWUpKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgbWVzc2FnZSBieSBRTmFtZS4KLSAgICogQHBhcmFtIGVudHJ5Q29udGV4dAotICAgKiBAcGFyYW0gbWVzc2FnZU5hbWUKLSAgICogQHJldHVybiBNZXNzYWdlCi0gICAqLwotICBwcml2YXRlIE1lc3NhZ2UgZ2V0TWVzc2FnZUJ5UU5hbWUoCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCwKLSAgICBRTmFtZSBtZXNzYWdlTmFtZSkKLSAgewotICAgIERlZmluaXRpb25bXSBkZWZzID0gdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0RGVmaW5pdGlvbnMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlZnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTWVzc2FnZSBtc2cgPSBkZWZzW2ldLmdldE1lc3NhZ2UobWVzc2FnZU5hbWUpOwotICAgICAgaWYgKG1zZyAhPSBudWxsKQotICAgICAgICByZXR1cm4gbXNnOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDExLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwN2E3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogQlAxMDExLgotICovCi1wdWJsaWMgY2xhc3MgQlAxMDExIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMDExKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFRPRE8gbmVlZCB0byBoYW5kbGUgc29hcCB3aXRoIGF0dGFjaG1lbnRzCi0gICAgICBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSkKLSAgICAgIAkgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgICAgIAotICAgICAgQmluZGluZ1tdIGJpbmRpbmdzID0gdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKTsKLQotICAgICAgLy8gZ2V0IHNvYXAgbWVzc2FnZSBjaGlsZCBuYW1lCi0gICAgICAvLyBHZXQgdGhlIERPTSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZSBzb2FwOmJvZHkgKGlmIG5vbi1lbXB0eSkKLSAgICAgIERvY3VtZW50IG1lc3NhZ2VEb2MgPSBudWxsOwotCi0gICAgICBRTmFtZSBtZXNzYWdlUGFydEVsZW1lbnRRTmFtZSA9IG51bGw7Ci0KLSAgICAgIGlmICghZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICBtZXNzYWdlRG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0gICAgICAgIC8vbWVzc2FnZURvYyA9IFhNTFV0aWxzLnBhcnNlWE1MKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCksIAotICAgICAgICAvLwlXU0lQcm9wZXJ0aWVzLkRFRl9TT0FQX1NDSEVNQSk7Ci0gICAgICAgIC8vIGdldCBzb2FwIG9wZXJhdGlvbiBuYW1lIGZyb20gdGhlIHNvYXA6Ym9keQotCi0gICAgICAgIC8vIE5PVEU6IGdldFNvYXBCb2R5Q2hpbGQoKSBtYXkgcmV0dXJuIG51bGwsIGlmIHRoZSBzb2FwOmJvZHkgZGlkIG5vdCBjb250YWluIGFueSBjaGlsZCBlbGVtZW50cwotICAgICAgICBFbGVtZW50IHNvYXBNZXNzYWdlRWxlbWVudCA9IHZhbGlkYXRvci5nZXRTb2FwQm9keUNoaWxkKG1lc3NhZ2VEb2MpOwotCi0gICAgICAgIC8vIGZvciBkb2MtbGl0Li4uIGZpbmQgdGhlIHdzZGw6cGFydCBmcm9tIG9uZSBvZiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbnMgdGhhdCBoYXMgCi0gICAgICAgIC8vIHRoZSBzb2FwIGVsZW1lbnQgdXNlZCBpbiB0aGUgbWVzc2FnZS4gICAgICAKLSAgICAgICAgLy8gd2UgYXJlIGxvb2tpbmcgZm9yIGEgcGFydCB3aXRoIGFuIGVsZW1lbnQgYXR0cmliIHZhbCBtYXRjaGluZyB0aGUgc29hcCBtZXNzYWdlIGVsZW1lbnQKLSAgICAgICAgaWYgKHNvYXBNZXNzYWdlRWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbWVzc2FnZVBhcnRFbGVtZW50UU5hbWUgPQotICAgICAgICAgICAgbmV3IFFOYW1lKAotICAgICAgICAgICAgICBzb2FwTWVzc2FnZUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgIHNvYXBNZXNzYWdlRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKChtZXNzYWdlRG9jID09IG51bGwpIHx8IHRoaXMudmFsaWRhdG9yLmlzRmF1bHQobWVzc2FnZURvYykpCi0gICAgICB7Ci0gICAgICAgIC8vIGVtcHR5IG1lc3NhZ2VzIGFuZCBmYXVsdCBtZXNzYWdlcyBkbyBub3QgcXVhbGlmeSBmb3IgdGhpcyBUQQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBsb29rIGZvciBtYXRjaChzKSBpbiBkb2Mgb3BlcmF0aW9ucwotICAgICAgLy8gaWYgZm91bmQsIHdlJ3JlIGRvbmUsIGVsc2UKLSAgICAgIC8vIGxvb2sgZm9yIG1hdGNoKHMpIGluIHJwYyBvcGVyYXRpb25zCi0KLSAgICAgIC8qIERvYy1saXQgCi0gICAgICAgKiBnZXQgbGlzdCBvZiBvcGVyYXRpb25zIChmcm9tIGNhbmRpZGF0ZXMpIGZvciB3aGljaCB0aGUgZmlyc3Qgc29hcDpib2R5IGNoaWxkIFFOYW1lIGlzIHRoZQotICAgICAgICogPHBhcnQgZWxlbWVudD0iLi4uIj4gdmFsdWUgb2YgdGhhdCBvcGVyYXRpb24ncyA8d3NkbDppbnB1dD4gb3IgPHdzZGw6b3V0cHV0PiBlbGVtZW50IChkZXBlbmRpbmcKLSAgICAgICAqIG9uIHdoZXRoZXIgbWVzc2FnZSBpcyBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZSkuCi0gICAgICAgKi8KLQotICAgICAgQmluZGluZ09wZXJhdGlvbltdIGRvY0JpbmRpbmdPcGVyYXRpb25zID0KLSAgICAgICAgdmFsaWRhdG9yLmdldE1hdGNoaW5nQmluZGluZ09wcygKLSAgICAgICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DLAotICAgICAgICAgIGJpbmRpbmdzKTsKLSAgICAgIC8vIGxpc3Qgb2Ygb3BlcmF0aW9ucyB0aGF0IG1hdGNoIHRoZSA8d3NkbDppbnB1dD4gb3IgPHdzZGw6b3V0cHV0PiAoZGVwZW5kaW5nIG9uIGVudHJ5VHlwZSkKLSAgICAgIC8vIGZvciBwYXJ0IGVsZW1lbnQ9Ii4uLiIKLSAgICAgIC8vIChJU1NVRTogd2hhdCBhYm91dCBwYXJ0IHR5cGU9Ii4uLiI/KQotICAgICAgQmluZGluZ09wZXJhdGlvbltdIHBvdGVudGlhbERvY0xpdE9wcyA9Ci0gICAgICAgIHZhbGlkYXRvci5nZXREb2NMaXRPcGVyYXRpb25zKAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLAotICAgICAgICAgIG1lc3NhZ2VQYXJ0RWxlbWVudFFOYW1lLAotICAgICAgICAgIGRvY0JpbmRpbmdPcGVyYXRpb25zKTsKLSAgICAgIGlmIChwb3RlbnRpYWxEb2NMaXRPcHMubGVuZ3RoICE9IDApCi0gICAgICB7Ci0gICAgICAgIC8vIGZvdW5kIGF0IGxlYXN0IG9uZSBkb2MgbGl0IG1hdGNoCi0KLSAgICAgICAgLy8gKioqIE5vdyB3ZSBrbm93IGl0J3MgZG9jdW1lbnQtbGl0ZXJhbCwgc2NoZW1hLXZhbGlkYXRlIHRoZSBTT0FQIHBheWxvYWQgYWNjb3JkaW5nbHkgICAgICAgICAgICAJCQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gaXNTY2hlbWFWYWxpZCA9IHRoaXMudmFsaWRhdG9yLm1lc3NhZ2VJc0RvY0xpdFNjaGVtYVZhbGlkKGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHNvYXAgbWVzc2FnZSBpcyBub3QgZG9jLWxpdCBzbyB0cnkgOgotICAgICAgICogUnBjLWxpdAotICAgICAgICovCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uW10gcnBjQmluZGluZ09wZXJhdGlvbnMgPQotICAgICAgICB0aGlzLnZhbGlkYXRvci5nZXRNYXRjaGluZ0JpbmRpbmdPcHMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQywKLSAgICAgICAgICBiaW5kaW5ncyk7Ci0KLSAgICAgIC8vIERldGVybWluZSBpZiB0aGVyZSBpcyBhbiBvcGVyYXRpb24gbWF0Y2gKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gcmNwT3BNYXRjaCA9Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yLmdldE9wZXJhdGlvbk1hdGNoKAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLAotICAgICAgICAgIG1lc3NhZ2VEb2MsCi0gICAgICAgICAgcnBjQmluZGluZ09wZXJhdGlvbnMpOwotICAgICAgaWYgKHJjcE9wTWF0Y2ggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBwYXJ0cyBtYXRjaAotICAgICAgICByY3BPcE1hdGNoID0KLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5nZXRPcGVyYXRpb25QYXJ0c01hdGNoKAotICAgICAgICAgICAgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCksCi0gICAgICAgICAgICBtZXNzYWdlRG9jLAotICAgICAgICAgICAgcnBjQmluZGluZ09wZXJhdGlvbnMpOwotICAgICAgfQotCi0gICAgICBpZiAocmNwT3BNYXRjaCA9PSBudWxsKQotICAgICAgewotICAgICAgICAvL25vdCBtYXRjaGVkIHdpdGggcnBjIGVpdGhlci4gUHJlcGFyZSBhc3NlcnRpb24gZmFpbHVyZS4KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJwY09wZXJhdGlvbkxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnBjQmluZGluZ09wZXJhdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBycGNPcGVyYXRpb25MaXN0LmFwcGVuZChycGNCaW5kaW5nT3BlcmF0aW9uc1tpXS50b1N0cmluZygpICsgIlxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWZmZXIgZG9jT3BlcmF0aW9uTGlzdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2NCaW5kaW5nT3BlcmF0aW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGRvY09wZXJhdGlvbkxpc3QuYXBwZW5kKGRvY0JpbmRpbmdPcGVyYXRpb25zW2ldLnRvU3RyaW5nKCkgKyAiXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgICItLU1FU1NBR0U6XG4iCi0gICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICsgIlxuLS1DQU5ESURBVEUgUlBDIFNUWUxFIE9QRVJBVElPTlMgKCIKLSAgICAgICAgICAgICsgKHJwY0JpbmRpbmdPcGVyYXRpb25zLmxlbmd0aCAhPSAwCi0gICAgICAgICAgICAgID8gKHJwY0JpbmRpbmdPcGVyYXRpb25zLmxlbmd0aCArICIpOlxuIiArIHJwY09wZXJhdGlvbkxpc3QpCi0gICAgICAgICAgICAgIDogIk5PTkUpIikKLSAgICAgICAgICAgICsgIlxuLS1DQU5ESURBVEUgRE9DVU1FTlQgU1RZTEUgT1BFUkFUSU9OUyAoIgotICAgICAgICAgICAgKyAoZG9jQmluZGluZ09wZXJhdGlvbnMubGVuZ3RoICE9IDAKLSAgICAgICAgICAgICAgPyAoZG9jQmluZGluZ09wZXJhdGlvbnMubGVuZ3RoICsgIik6XG4iICsgZG9jT3BlcmF0aW9uTGlzdCkKLSAgICAgICAgICAgICAgOiAiTk9ORSkiKSk7Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvblBhc3NFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMTIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVkNGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAxMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIEJQMTAxMi4KLSAqLwotcHVibGljIGNsYXNzIEJQMTAxMiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAxMihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBsb29rIGZvciA8c29hcDpFbnZlbG9wZT4gZWxlbWVudHM6Ci0gICAgICAvLyAoTm90ZTogc2luY2UgdGhpcyBpcyBhIFNvYXAgbWVzc2FnZSB3ZSBleHBlY3QgZXhhY3RseSBvbmUgc29hcCBlbnZlbG9wZSwgYnV0IHdlIGRvIG5vdCBhc3N1bWUgaXQpLgotICAgICAgRG9jdW1lbnQgcmVxdWVzdERvYyA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0RG9jdW1lbnQoKTsKLQotICAgICAgLy8gbWVzc2FnZSBpcyBlbXB0eSBvciBpbnZhbGlkLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAocmVxdWVzdERvYyA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICBFbGVtZW50IGVudkVsZW0gPSByZXF1ZXN0RG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgLy9Ob2RlTGlzdCBzb2FwRW52TGlzdCA9IHJlcXVlc3REb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsICJFbnZlbG9wZSIpOwotCi0gICAgICAvLyBJZiB0aGUgZG9jdW1lbnQgZWxlbWVudCB0YWcgbmFtZSBpcyBub3QgRW52ZWxvcGUKLSAgICAgIC8vIG9yIHRoZSBuYW1lc3BhY2UgaXMgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8KLSAgICAgIGlmICghZW52RWxlbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWE1MVXRpbHMuU09BUF9FTEVNX0VOVkVMT1BFKQotICAgICAgICB8fCBlbnZFbGVtLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVApKQotICAgICAgICAvLyBSZXF1ZXN0IGNvbnRhaW5zIHByb3BlciBzb2FwIEVudmVsb3BlIGVsZW1lbnQKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gd2UgZXhwZWN0IGEgU29hcCBGYXVsdCBhcyBhIHJlc3BvbnNlCQotICAgICAgRG9jdW1lbnQgcmVzcG9uc2VEb2MgPQotICAgICAgICBYTUxVdGlscy5wYXJzZVhNTChlbnRyeUNvbnRleHQuZ2V0UmVzcG9uc2UoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgTm9kZUxpc3Qgc29hcEZhdWx0TGlzdCA9Ci0gICAgICAgIHJlc3BvbnNlRG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLAotICAgICAgICAgICJGYXVsdCIpOwotICAgICAgLy8gQUREIGV4dHJhIGNoZWNrIGhlcmUgdGhhdCB0aGUgPHNvYXA6RmF1bHQ+IGlzIGEgY2hpbGQgb2YgPHNvYXA6RW52ZWxvcGU+ID8/CQkgICAgICAJCQkJCi0gICAgICBpZiAoKHNvYXBGYXVsdExpc3QgPT0gbnVsbCkgfHwgKHNvYXBGYXVsdExpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIC8vIE5vIFNvYXAgZmF1bHQgZm91bmQuCi0gICAgICAgIC8vIEFzc2VydGlvbiBmYWlsZWQgKEFERCBoaWdobGlnaHQgdGhlIGNoaWxkIGhlcmUgPykKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgIi0tLSBSRVFVRVNUOlxuIgotICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldE1lc3NhZ2UoKQotICAgICAgICAgICAgKyAiXG4tLS0gUkVTUE9OU0U6XG4iCi0gICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRSZXNwb25zZSgpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDEzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2ZjhlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLQotCi0vKioKLSAqIEJQMTAxMy4KLSAqLwotcHVibGljIGNsYXNzIEJQMTAxMyBleHRlbmRzIEJQMTAxMQotewotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMDEzKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAzMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDMxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYmRhZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDMxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25QYXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBCUDEwMzEuCi0gKiAKLSAqIEBhdXRob3I6IEdyYWhhbSBUdXJyZWxsLCBJQk0gVUsKLSAqLwotcHVibGljIGNsYXNzIEJQMTAzMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAzMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBmYWlsdXJlRGV0YWlsID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBEb2N1bWVudCBkb2M7Ci0gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG9uZSB3YXkgcmVzcG9uc2UKLSAgICAgIC8vIG9yIG1lc3NhZ2UgaXMgbWVwdHkgb3IgaW52YWxpZAotICAgICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KQotICAgICAgICAgIHx8IChkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKSkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCF0aGlzLnZhbGlkYXRvci5pc0ZhdWx0KGRvYykpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIE5vZGVMaXN0IGZhdWx0Q29kZXMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZhdWx0Y29kZSIpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXVsdENvZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGVMaXN0IGZhdWx0Q29kZU5vZGVzID0gKGZhdWx0Q29kZXMuaXRlbShpKSkuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZhdWx0Q29kZU5vZGVzLmdldExlbmd0aCgpOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZmF1bHRDb2RlTm9kZXMuaXRlbShqKSBpbnN0YW5jZW9mIFRleHQpCi0gICAgICAgICAgewotICAgICAgICAgICAgVGV4dCBmYXVsdENvZGVUZXh0ID0gKFRleHQpIGZhdWx0Q29kZU5vZGVzLml0ZW0oaik7Ci0gICAgICAgICAgICBpZiAoZmF1bHRDb2RlVGV4dC5nZXREYXRhKCkuaW5kZXhPZignLicpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgLy8gZG90dGVkIG5vdGF0aW9uIHVzZWQuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICAvLyBubyBkb3R0ZWQgbm90YXRpb24gdXNlZCBpbiBhIGZhdWx0Y29kZSBlbGVtZW50Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDMyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0MTMwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLQotLyoqCi0gKiBCUDEwMzIKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgZW52ZWxvcGU8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHNvYXA6RW52ZWxvcGUsIHNvYXA6SGVhZGVyLCBhbmQgc29hcDpCb2R5IGVsZW1lbnRzIGRvIG5vdCBoYXZlIGFueSBhdHRyaWJ1dGVzIGluIHRoZSBuYW1lc3BhY2UgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDEwMzIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEwMzIoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIGEgbWVzc2FnZSBkb2N1bWVudAotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGVtcHR5IG9yIGludmFsaWQsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gR2V0dGluZyBhIHJvb3QgZWxlbWVudAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAvLyBBc3N1bWluZyB0aGF0IHJvb3QgZWxlbWVudCBzaG91bGQgYmUgc29hcDpFbnZlbG9wZQotICAgICAgLy8gSWYgbm90LCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoIWVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhNTFV0aWxzLlNPQVBfRUxFTV9FTlZFTE9QRSkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIGxvb2tpbmcgZm9yIGFueSBhdHRyaWJ1dGUgb2Ygc29hcDpFbnZlbG9wZSBpbiB0aGUgbmFtZXNwYWNlCi0gICAgICAvLyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAvLyBJZiBhdCBsZWFzdCBvbmUgYXR0cmlidXRlIGlzIGZvdW5kLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlKGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJzb2FwOkVudmVsb3BlIGF0dHJpYnV0ZSBuYW1lIGlzICIKLSAgICAgICAgICArIGF0dHIuZ2V0TmFtZSgpKTsKLQotICAgICAgLy8gR2V0dGluZyB0aGUgZmlyc3QgY2hpbGQgb2Ygc29hcDpFbnZlbG9wZQotICAgICAgZWxlbWVudCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbWVudCk7Ci0KLSAgICAgIC8vIElmIHRoZSBjaGlsZCBpcyBzb2FwOkhlYWRlcgotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbAotICAgICAgICAmJiBlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhYTUxVdGlscy5TT0FQX0VMRU1fSEVBREVSKSkKLSAgICAgIHsKLSAgICAgICAgLy8gbG9va2luZyBmb3IgYW55IGF0dHJpYnV0ZSBvZiBzb2FwOkhlYWRlciBpbiB0aGUgbmFtZXNwYWNlCi0gICAgICAgIC8vICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgLy8gSWYgYXQgbGVhc3Qgb25lIGF0dHJpYnV0ZSBpcyBmb3VuZCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgYXR0ciA9IGdldEF0dHJpYnV0ZShlbGVtZW50LmdldEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIGlmIChhdHRyICE9IG51bGwpCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oInNvYXA6SGVhZGVyIGF0dHJpYnV0ZSBuYW1lIGlzICIKLSAgICAgICAgICAgICsgYXR0ci5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIE1vdmluZyB0byB0aGUgbmV4dCBzb2FwOkVudmVsb3BlIGNoaWxkCi0gICAgICAgIGVsZW1lbnQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhlbGVtZW50KTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlIGNoaWxkIGlzIHNvYXA6Qm9keQotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbAotICAgICAgICAmJiBlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhYTUxVdGlscy5TT0FQX0VMRU1fQk9EWSkpCi0gICAgICB7Ci0gICAgICAgIC8vIGxvb2tpbmcgZm9yIGFueSBhdHRyaWJ1dGUgb2Ygc29hcDpCb2R5IGluIHRoZSBuYW1lc3BhY2UKLSAgICAgICAgLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICAvLyBJZiBhdCBsZWFzdCBvbmUgYXR0cmlidXRlIGlzIGZvdW5kLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICBhdHRyID0gZ2V0QXR0cmlidXRlKGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpKTsKLSAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigic29hcDpCb2R5IGF0dHJpYnV0ZSBuYW1lIGlzICIKLSAgICAgICAgICAgICsgYXR0ci5nZXROYW1lKCkpOwotICAgICAgfQotCi0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBMb29rcyBmb3IgYW4gYXR0cmlidXRlIHRoYXQgaXMgaW4gdGhlIG5hbWVzcGFjZQotICAgKiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLwotICAgKiBAcGFyYW0gYXR0cnMgYSBjb2xsZWN0aW9uIG9mIGF0dHJpYnV0ZXMKLSAgICogQHJldHVybiBhbiBhdHRyaWJ1dGUgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2Ugb3IgbnVsbAotICAgKi8KLSAgcHJpdmF0ZSBBdHRyIGdldEF0dHJpYnV0ZShOYW1lZE5vZGVNYXAgYXR0cnMpCi0gIHsKLSAgICBBdHRyIHJldCA9IG51bGw7Ci0gICAgaWYgKGF0dHJzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBhdHRycy5pdGVtKGkpOwotICAgICAgICBpZiAoYXR0ci5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsCi0gICAgICAgICAgJiYgYXR0ci5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQKSkKLSAgICAgICAgewotICAgICAgICAgIHJldCA9IGF0dHI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDMzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJlYzhhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQlAxMDMzCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIGVudmVsb3BlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBTT0FQIGVudmVsb3BlIGRvZXMgbm90IGNvbnRhaW4gdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMTAzMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAzMyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIGEgbWVzc2FnZSBkb2N1bWVudAotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0gICAgICAvLyBJZiB0aGUgbWVzc2FnZSBpcyBlbXB0eSBvciBpbnZhbGlkLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEdldHRpbmcgdGhlIHJvb3QgZWxlbWVudAotICAgICAgRWxlbWVudCBlbGVtID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgLy8gSWYgaXQgaXMgbm90IHRoZSBzb2FwOkVudmVsb3BlLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoIWVsZW0uZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfU09BUCkKLSAgICAgICAgfHwgIWVsZW0uZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhNTFV0aWxzLlNPQVBfRUxFTV9FTlZFTE9QRSkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHRoZSBlbnZlbG9wZSBjb250YWlucyB0aGUgeG1sbnM6eG1sIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiwKLSAgICAgIC8vIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICBTdHJpbmcgaW5jb3JyZWN0RWxlbWVudE5hbWUgPSBnZXRJbmNvcnJlY3RFbGVtZW50TmFtZShlbGVtKTsKLSAgICAgIGlmIChpbmNvcnJlY3RFbGVtZW50TmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIG5hbWUgb2YgYW4gZWxlbWVudCBjb250YWluaW5nICIKLSAgICAgICAgICArICJzdWNoIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBpcyBcIiIgKyBpbmNvcnJlY3RFbGVtZW50TmFtZSArICJcIi4iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIExvb2tzIGZvciBhbnkgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGUgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLiAKLSAgICogQHBhcmFtIGVsZW0gdGhlIHJvb3QgZWxlbWVudC4KLSAgICogQHJldHVybiB0aGUgbmFtZSBvZiBhbiBlbGVtZW50IGZvdW5kIG9yIG51bGwuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRJbmNvcnJlY3RFbGVtZW50TmFtZShFbGVtZW50IGVsZW0pCi0gIHsKLSAgICAvLyBHZXR0aW5nIGEgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB4bWxuczp4bWwKLSAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGVOUygKLSAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfWE1MTlMsICJ4bWwiKTsKLSAgICAvLyBJZiBpdCBlcXVhbHMgdG8gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCi0gICAgLy8gcmV0dXJuIGFuIGVsZW1lbnQgbmFtZTsKLSAgICBpZiAoV1NJQ29uc3RhbnRzLk5TX1VSSV9YTUwuZXF1YWxzKGF0dHJWYWx1ZSkpCi0gICAgewotICAgICAgcmV0dXJuIGVsZW0uZ2V0Tm9kZU5hbWUoKTsKLSAgICB9Ci0gICAgLy8gR29pbmcgdGhyb3VnaCBlbGVtZW50J3MgY2hpbGRyZW4KLSAgICBFbGVtZW50IGNoaWxkID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChlbGVtKTsKLSAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBJZiBhbnkgb2YgdGhlbSBoYXMgeG1sbnM6eG1sIGF0dHJpYnV0ZSwgcmV0dXJuIGEgdmFsdWUKLSAgICAgIFN0cmluZyBuYW1lID0gZ2V0SW5jb3JyZWN0RWxlbWVudE5hbWUoY2hpbGQpOwotICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICB9Ci0gICAgICAvLyBHZXR0aW5nIHRoZSBuZXh0IGVsZW1lbnQncyBjaGlsZAotICAgICAgY2hpbGQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhjaGlsZCk7Ci0gICAgfQotICAgIC8vIE5vIHhtbG5zOnhtbCBhdHRyaWJ1dGVzIGZvdW5kLCByZXR1cm4gbnVsbAotICAgIHJldHVybiBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMTAwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDExMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiYWQ3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDExMDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogQlAxMTAwLgotICogQSBtZXNzYWdlIHRoYXQgZG9lcyBub3QgY29udGFpbiBhIFNPQVAgZmF1bHQgU0hPVUxEIHVzZSBhICIyMDAgT0siIAotICogSFRUUCBzdGF0dXMgY29kZS4KLSAqLwotcHVibGljIGNsYXNzIEJQMTEwMCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTEwMChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIGxvb2sgZm9yIDxzb2FwOkZhdWx0PiBlbGVtZW50OgotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0gICAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgTm9kZUxpc3QgZmF1bHRMaXN0ID0KLSAgICAgICAgICByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCAiRmF1bHQiKTsKLQotICAgICAgICAvLyBJZiByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGEgc29hcDpGYXVsdCwgdGhlbiBjaGVjayBpdAotICAgICAgICBpZiAoKGZhdWx0TGlzdCA9PSBudWxsKSB8fCAoZmF1bHRMaXN0LmdldExlbmd0aCgpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gUmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBhIHNvYXA6RmF1bHQKLSAgICAgICAgICAvLyBjaGVjayBIVFRQIHN0YXR1cyBjb2RlCi0gICAgICAgICAgU3RyaW5nIGh0dHBTdGF0dXMgPQotICAgICAgICAgICAgVXRpbHMuZ2V0SFRUUFN0YXR1c0NvZGUoCi0gICAgICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpKTsKLSAgICAgICAgICBpZiAoISIyMDAiLmVxdWFscyhodHRwU3RhdHVzKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0gICAgICAgICAgICAvL2ZhaWx1cmVEZXRhaWxNZXNzYWdlID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAgICJcblJlc3BvbnNlIG1lc3NhZ2U6XG5IZWFkZXJzOlxuIgotICAgICAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKQotICAgICAgICAgICAgICAgICAgKyAiXG5NZXNzYWdlOlxuIgotICAgICAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgaXQgaXMgYSBzb2FwOkZhdWx0LCB0aGVuIHRoZSByZXN1bHQgbXVzdCBiZSBub3RBcHBsaWNhYmxlCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDExMDcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTEwNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWM4NjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTEwNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk51bGxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk9wZXJhdGlvblNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UeXBlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBCUDExMDcuCi0gKiBUaGUgY29udGFpbmVkIHNvYXBiaW5kOmZhdWx0IGlzIGRlZmluZWQgaW4gdGhlIHdzZGw6YmluZGluZy4KLSAqLwotcHVibGljIGNsYXNzIEJQMTEwNyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yCi17Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTEwNyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBPcGVyYXRpb25TaWduYXR1cmUgcmVzcG9uc2VTaWcgPSBudWxsOwotICBwcml2YXRlIFZlY3RvciBmYXVsdHMgPSBudWxsOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoU09BUEZhdWx0LCBPYmplY3QsIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEZhdWx0IGZhdWx0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgZmF1bHROYW1lID0gZmF1bHQuZ2V0TmFtZSgpOwotCi0gICAgaWYgKGZhdWx0TmFtZSA9PSBudWxsKQotICAgICAgZmF1bHROYW1lID0gY3R4LmdldEJpbmRpbmdGYXVsdCgpLmdldE5hbWUoKTsKLQotICAgIE9wZXJhdGlvbiBvcCA9IGN0eC5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0T3BlcmF0aW9uKCk7Ci0gICAgaWYgKG9wID09IG51bGwgLyogfHwgZmF1bHROYW1lID09IG51bGwqLwotICAgICAgKSAvLyBtYXkgYmUgaXQncyBwb3NzaWJsZSB0byBoYXZlIGxlZ2FsIGZhdWx0IHdpdGggbnVsbCBuYW1lCi0gICAgICByZXR1cm47Ci0KLSAgICAvLyB3ZSBzdXBwb3NlIHRoYXQgU09BUEZhdWx0LmdldE5hbWUoKSBjb3JyZXNwb25kcyB0byB0aGUgYWJzdHJhY3Qgb3BlcmF0aW9uJ3MgZmF1bHQgbmFtZSAgICAgICAgICAgCi0gICAgRmF1bHQgZiA9IG9wLmdldEZhdWx0KGZhdWx0TmFtZSk7Ci0gICAgaWYgKGYgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLQotICAgIE1lc3NhZ2UgbSA9IGYuZ2V0TWVzc2FnZSgpOwotICAgIC8vIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgb25seSBvbmUgcGFydAotICAgIGlmIChtID09IG51bGwgfHwgbS5nZXRQYXJ0cygpID09IG51bGwgfHwgbS5nZXRQYXJ0cygpLnNpemUoKSAhPSAxKQotICAgICAgcmV0dXJuOwotCi0gICAgLy9QYXJ0IGZhdWx0UGFydCA9IFdTRExVdGlsLmdldFBhcnQobSwgZmF1bHROYW1lKTsKLSAgICBQYXJ0IGZhdWx0UGFydCA9IChQYXJ0KSBtLmdldFBhcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICBUeXBlc1JlZ2lzdHJ5IHRSZWcgPSAoVHlwZXNSZWdpc3RyeSkgY3R4LmdldFBhcmFtZXRlcigiVHlwZXNSZWdpc3RyeSIpOwotICAgIFFOYW1lIGVsZW1RTmFtZSA9IGZhdWx0UGFydC5nZXRFbGVtZW50TmFtZSgpOwotICAgIFFOYW1lIHR5cGVRTmFtZSA9IGZhdWx0UGFydC5nZXRUeXBlTmFtZSgpOwotICAgIGlmICh0eXBlUU5hbWUgPT0gbnVsbCkKLSAgICAgIHR5cGVRTmFtZSA9IHRSZWcuZ2V0VHlwZShmYXVsdFBhcnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgaWYgKHR5cGVRTmFtZSA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFydCB0eXBlIGNhbiBub3QgYmUgbnVsbC4iKTsKLQotICAgIC8vIGZvciBhbGwgZmF1bHRzOyBpZiBpdCBwcmVzZW50cyBpbiB0aGUgZGVmaW5pdGlvbiByZW1vdmUgaXQgZnJvbSBsaXN0Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXVsdHMuc2l6ZSgpOykKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW0gPSAoRWxlbWVudCkgZmF1bHRzLmdldChpKTsKLQotICAgICAgLy8gVE9ETzogSSBkb24ndCB1bmRlcnN0YW5kIHdoeSB0aGlzIGlzIGhlcmUuICBPbmx5IHRoZSBlbGVtZW50IHNldHRpbmcgc2hvdWxkIGJlIGNoZWNrZWQuIAotICAgICAgLy9ib29sZWFuIG1hdGNoQnlUeXBlID0KLSAgICAgIC8vICBlbGVtLmdldExvY2FsTmFtZSgpLmVxdWFscyh0eXBlUU5hbWUuZ2V0TG9jYWxQYXJ0KCkpICYmIE51bGxVdGlsLmVxdWFscyhlbGVtLmdldE5hbWVzcGFjZVVSSSgpLCB0eXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0gICAgICBib29sZWFuIG1hdGNoQnlFbGVtZW50ID0KLSAgICAgICAgZWxlbVFOYW1lICE9IG51bGwKLSAgICAgICAgICAmJiBlbGVtLmdldExvY2FsTmFtZSgpLmVxdWFscyhlbGVtUU5hbWUuZ2V0TG9jYWxQYXJ0KCkpCi0gICAgICAgICAgJiYgTnVsbFV0aWwuZXF1YWxzKAotICAgICAgICAgICAgZWxlbS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgIGVsZW1RTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0KLSAgICAgIC8vaWYgKG1hdGNoQnlUeXBlIHx8IG1hdGNoQnlFbGVtZW50KQotICAgICAgaWYgKG1hdGNoQnlFbGVtZW50KQotICAgICAgICBmYXVsdHMucmVtb3ZlKGkpOwotICAgICAgZWxzZQotICAgICAgICBpKys7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gUGFyc2UgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jUmVxdWVzdCA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0RG9jdW1lbnQoKTsKLSAgICAgIERvY3VtZW50IGRvY1Jlc3BvbnNlID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICAgIGlmICgoZG9jUmVxdWVzdCA9PSBudWxsKSB8fCAoZG9jUmVzcG9uc2UgPT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghdGhpcy52YWxpZGF0b3IuaXNGYXVsdChkb2NSZXNwb25zZSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIGNyZWF0ZSByZXF1ZXN0IHNpZ25hdHVyZQotICAgICAgICBPcGVyYXRpb25TaWduYXR1cmUuT3BlcmF0aW9uTWF0Y2ggbWF0Y2ggPQotICAgICAgICAgIE9wZXJhdGlvblNpZ25hdHVyZS5tYXRjaE9wZXJhdGlvbigKLSAgICAgICAgICAgIGRvY1JlcXVlc3QsCi0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5nZXRTb2FwQWN0aW9uKGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0SFRUUEhlYWRlcnMoKSksCi0gICAgICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXRCaW5kaW5ncygpWzBdLAotICAgICAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dAotICAgICAgICAgICAgICAgIC5nZXRDYW5kaWRhdGVJbmZvKCkKLSAgICAgICAgICAgICAgICAuZ2V0V3NkbERvY3VtZW50KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICAgICAgICB2YWxpZGF0b3IpKTsKLQotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotCi0gICAgICAgIGlmIChtYXRjaCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gTU9WRUQ6IFBhcnNlIHJlc3BvbnNlIG1lc3NhZ2UKLSAgICAgICAgICAvL2RvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotCi0gICAgICAgICAgcmVzcG9uc2VTaWcgPSBuZXcgT3BlcmF0aW9uU2lnbmF0dXJlKGRvY1Jlc3BvbnNlKTsKLSAgICAgICAgICBpZiAoV1NJQ29uc3RhbnRzCi0gICAgICAgICAgICAuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDCi0gICAgICAgICAgICAuZXF1YWxzKG1hdGNoLmdldE9wZXJhdGlvblN0eWxlKCkpKQotICAgICAgICAgICAgcmVzcG9uc2VTaWcuY3JlYXRlUlBDU2lnbmF0dXJlKCk7Ci0KLSAgICAgICAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgICAgICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICAgICAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICAgICAgICB0cmF2ZXJzYWwudmlzaXRTT0FQRmF1bHQodHJ1ZSk7Ci0gICAgICAgICAgdHJhdmVyc2FsLmlnbm9yZUJpbmRpbmdJbnB1dCgpOwotICAgICAgICAgIHRyYXZlcnNhbC5pZ25vcmVCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgICAgICAgICBpZiAocmVzcG9uc2VTaWcgPT0gbnVsbCB8fCAhcmVzcG9uc2VTaWcuaXNGYXVsdCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlU2lnICE9IG51bGwgJiYgcmVzcG9uc2VTaWcuaXNGYXVsdCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGV4dHJhY3QgYWxsIGZhdWx0cyBhbmQgdHJ5IGZpbmQgdGhlbSBpbiB0aGUgZGVmaW5pdGlvbgotICAgICAgICAgICAgLy8gZXh0cmFjdHMgb25seSBmYXVsdHMgd2l0aCBuYW1lc3BhY2UKLSAgICAgICAgICAgIEVsZW1lbnQgYm9keSA9Ci0gICAgICAgICAgICAgIFhNTFV0aWxzLmZpbmRDaGlsZEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgZG9jUmVzcG9uc2UuZ2V0RG9jdW1lbnRFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgV1NJVGFnLkVMRU1fU09BUF9CT0RZKTsKLSAgICAgICAgICAgIEVsZW1lbnQgZmF1bHQgPQotICAgICAgICAgICAgICBYTUxVdGlscy5maW5kQ2hpbGRFbGVtZW50KGJvZHksIFdTSVRhZy5FTEVNX1NPQVBfRkFVTFQpOwotICAgICAgICAgICAgRWxlbWVudCBkZXRhaWwgPSBYTUxVdGlscy5nZXRFbGVtZW50KCJkZXRhaWwiLCBmYXVsdCk7Ci0gICAgICAgICAgICBpZiAoZGV0YWlsID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgICAgICAgICAgIGZhdWx0cyA9IFhNTFV0aWxzLmdldENoaWxkRWxlbWVudHMoZGV0YWlsKTsKLQotICAgICAgICAgICAgICAvLyBSRU1PVkU6IFdoeSBkbyB0aGUgZmF1bHRzIGhhdmUgdG8gYmUgbmFtZXNwYWNlZCBxdWFsaWZpZWQ/Ci0gICAgICAgICAgICAgIC8vWE1MVXRpbHMucmVtb3ZlQWxsRWxlbWVudHNXaXRob3V0TlMoZmF1bHRzKTsKLQotICAgICAgICAgICAgICAvLyBpZiBmYXVsdHMgZXhpc3QgdHJ5IHRvIHZhbGlkYXRlIGl0Ci0gICAgICAgICAgICAgIGlmIChmYXVsdHMuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1hcCBtID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICBXU0RMVXRpbC5leHBhbmREZWZpbml0aW9uKAotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRDYW5kaWRhdGVJbmZvKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFdzZGxEb2N1bWVudCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXREZWZpbml0aW9ucygpKTsKLSAgICAgICAgICAgICAgICBtLnB1dCgKLSAgICAgICAgICAgICAgICAgICJkZWZpbml0aW9uIiwKLSAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldENhbmRpZGF0ZUluZm8oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0V3NkbERvY3VtZW50KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldERlZmluaXRpb25zKCkpOwotICAgICAgICAgICAgICAgIFR5cGVzUmVnaXN0cnkgdFJlZyA9Ci0gICAgICAgICAgICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgLmdldENhbmRpZGF0ZUluZm8oKQotICAgICAgICAgICAgICAgICAgICAgIC5nZXRXc2RsRG9jdW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZpbml0aW9ucygpLAotICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcik7Ci0gICAgICAgICAgICAgICAgbS5wdXQoIlR5cGVzUmVnaXN0cnkiLCB0UmVnKTsKLSAgICAgICAgICAgICAgICB0cmF2ZXJzYWwudHJhdmVyc2UobWF0Y2guZ2V0T3BlcmF0aW9uKCksIG0pOwotICAgICAgICAgICAgICAgIGlmIChmYXVsdHMuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhdWx0cy5zaXplKCk7IGkrKykKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5zZXJpYWxpemVFbGVtZW50KChFbGVtZW50KSBmYXVsdHMuZ2V0KGkpLCBzdyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICAgICAgICAgIlxuRmF1bHRzOlxuIiArIHN3LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWY2OTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIEJQMTIwMS4KLSAqIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHNvYXA6RW52ZWxvcGUgaW4gdGhlIG1lc3NhZ2UgaGFzIHZhbHVlOiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDEyMDEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEyMDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgRG9jdW1lbnQgZG9jOwotICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgb25lIHdheSByZXNwb25zZSBvciBtZXNzYWdlIGlzIG1lcHR5IG9yIGludmFsaWQKLSAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpIHx8Ci0gICAgICAoZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIFN0cmluZyBucyA9IHJvb3QuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBTdHJpbmcgbG9jYWwgPSByb290LmdldExvY2FsTmFtZSgpOwotICAgICAgaWYgKCFFTEVNX1NPQVBfRU5WRUxPUEUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5zKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAiUm9vdCBlbGVtZW50IGhhcyBuYW1lc3BhY2U6ICIgKyBucywgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoIUVMRU1fU09BUF9FTlZFTE9QRS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMobG9jYWwpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICJSb290IGVsZW1lbnQgaGFzIGxvY2FsIG5hbWU6ICIgKyBsb2NhbCwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YWJlZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogQlAxMjAyLiAKLSAqIEVhY2ggY2hpbGQgZWxlbWVudCAoaWYgYW55KSBvZiB0aGUgc29hcDpCb2R5IGVsZW1lbnQgaXMgbmFtZXNwYWNlIHF1YWxpZmllZCAobm90IHRoZSBncmFuZGNoaWxkcmVuKS4KLSAqLwotcHVibGljIGNsYXNzIEJQMTIwMiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTIwMihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBQYXJzZSBsb2cgbWVzc2FnZSAKLSAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgIGlmICh2YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBzb2FwIGJvZHkgZWxlbWVudAotICAgIGVsc2UgaWYgKCF2YWxpZGF0b3IuY29udGFpbnNTb2FwQm9keVdpdGhDaGlsZChkb2MpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIHJvb3QgZWxlbWVudAotICAgICAgRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAvLyBHZXQgYSBub2RlIGxpc3Qgd2hpY2ggc2hvdWxkIGNvbnRhaW4gdGhlIHNvYXA6Qm9keSBlbGVtZW50Ci0gICAgICBOb2RlTGlzdCByb290Tm9kZUxpc3QgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgIEVMRU1fU09BUF9CT0RZLmdldE5hbWVzcGFjZVVSSSgpLCBFTEVNX1NPQVBfQk9EWS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBzb2FwOkJvZHkgZWxlbWVudCwKLSAgICAgIC8vIHRoZW4gbWFrZSBzdXJlIHRoYXQgZWFjaCBjaGlsZCBpcyBuYW1lc3BhY2UgcXVhbGlmaWVkCi0gICAgICBpZiAocm9vdE5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IHRoZSBzb2FwOkJvZHkgZWxlbWVudAotICAgICAgICBFbGVtZW50IGJvZHkgPSAoRWxlbWVudCkgcm9vdE5vZGVMaXN0Lml0ZW0oMCk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHNvYXA6Qm9keSBjaGlsZCBlbGVtZW50cyAKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBib2R5LmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBlYWNoIGNoaWxkIGVsZW1lbnQgaXMgbmFtZXNwYWNlIHF1YWxpZmllZAotICAgICAgICBmb3IgKGludCBpID0gMDsKLSAgICAgICAgICBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgJiYgcmVzdWx0ID09IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgICAgICsraSkKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgbiA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBucyA9IG4uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobnMgPT0gbnVsbCB8fCBucy5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDcwYWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIEJQMTIwMy4gCi0gKiBUaGUgbmFtZXNwYWNlIG9mIHRoZSBkZXRhaWwgZWxlbWVudCBvZiBhIHF1YWxpZmllZCBhdHRyaWJ1dGUgaW4gdGhlIHNvYXA6RmF1bHQgaXMgYSAKLSAqIGZvcmVpZ24gbmFtZXNwYWNlLCBkaWZmZXJlbnQgZnJvbSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iLgotICovCi1wdWJsaWMgY2xhc3MgQlAxMjAzIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMjAzKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gcXVhbGlmaWVkQXR0cmlidXRlcyA9IGZhbHNlOwotCi0gICAgRG9jdW1lbnQgZG9jOwotICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgb25lIHdheSByZXNwb25zZSBvciBtZXNzYWdlIGlzIG1lcHR5IG9yIGludmFsaWQKLSAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpCi0gICAgICAgIHx8IChkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKSkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gQUREOiBOZWVkIHRvIGRldGVybWluZSBpZiB0aGlzIGNoZWNrIGlzIHJlcXVpcmVkLCBzaW5jZSBpdCBzaG91bGQgYWxyZWFkeSBiZSBkb25lCi0gICAgICAvLyBBcHBsaWNhYmxlIHRvIHJlc3BvbnNlIG1lc3NhZ2VzIG9ubHkKLSAgICAgIGlmIChlbnRyeUNvbnRleHQKLSAgICAgICAgLmdldE1lc3NhZ2VFbnRyeSgpCi0gICAgICAgIC5nZXRUeXBlKCkKLSAgICAgICAgLmVxdWFsc0lnbm9yZUNhc2UoTWVzc2FnZUVudHJ5LlRZUEVfUkVTUE9OU0UpKQotICAgICAgewotICAgICAgICAvLyBsb29rIGZvciA8c29hcDpGYXVsdD4gZWxlbWVudDoKLSAgICAgICAgTm9kZUxpc3QgZmF1bHRMaXN0ID0KLSAgICAgICAgICBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwKLSAgICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9GQVVMVCk7Ci0gICAgICAgIGlmICgoZmF1bHRMaXN0ID09IG51bGwpIHx8IChmYXVsdExpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBSZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGEgc29hcDpGYXVsdAotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3ZSBoYXZlIGEgc29hcDpGYXVsdC4gCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGxvb2sgYXQgZWFjaCBzb2FwOkZhdWx0IGluIHR1cm4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHRMaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEVsZW1lbnQgc29hcEZhdWx0ID0gKEVsZW1lbnQpIGZhdWx0TGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBkZXRhaWwgZWxlbWVudChzKSBpZiBhbnkKLSAgICAgICAgICAgICAgTm9kZUxpc3QgZGV0YWlsTGlzdCA9Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFhNTFV0aWxzLlNPQVBfRUxFTV9GQVVMVF9ERVRBSUwpOwotICAgICAgICAgICAgICBpZiAoZGV0YWlsTGlzdCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZm9yIGVhY2ggZGV0YWlsIGVsZW1lbnQuLi4gICAgIAkJCQkKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRldGFpbExpc3QuZ2V0TGVuZ3RoKCk7IGorKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBOYW1lZE5vZGVNYXAgZGV0YWlsQXR0cmlicyA9Ci0gICAgICAgICAgICAgICAgICAgIGRldGFpbExpc3QuaXRlbShqKS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgYW55IHF1YWxpZmllZCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgICBpZiAoZGV0YWlsQXR0cmlicyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGRldGFpbEF0dHJpYnMuZ2V0TGVuZ3RoKCk7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIEF0dHIgbmV4dEF0dHIgPSAoQXR0cikgKGRldGFpbEF0dHJpYnMuaXRlbShrKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGVhY2ggcXVhbGlmaWVkIGF0dHJpYnV0ZSwgY2hlY2sgdGhhdCAKLSAgICAgICAgICAgICAgICAgICAgICAvLyBxbmFtZSAhPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRBdHRyLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkQXR0cmlidXRlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEF0dHIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWVzcGFjZVVSSSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdW5leHBlY3RlZCBxbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFxdWFsaWZpZWRBdHRyaWJ1dGVzKQotICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIHRhcmdldCBtZXNzYWdlIGlzIG5vdCBhIFJlc3BvbnNlCi0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjA0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmNDgwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvblBhc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk9wZXJhdGlvblNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UeXBlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIEJQMTIwNC4KLSAqIFRoZSBzZXJpYWxpemVkIGFycmF5IGZvcm0gaW4gdGhlIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiB0aGUgCi0gKiBzb2FwZW5jOmFycmF5VHlwZSBhdHRyaWJ1dGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJQMTIwNCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTIwNChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLQotICAgICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gUGFyc2UgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jID0KLSAgICAgICAgWE1MVXRpbHMucGFyc2VYTUwoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc0ZhdWx0KGRvYykpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFBhcnNlIHJlcXVlc3QgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jUmVxdWVzdCA9Ci0gICAgICAgIFhNTFV0aWxzLnBhcnNlWE1MKGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgLy8gZ2V0IFNPQVBBY3Rpb24KLSAgICAgIFN0cmluZyBoZWFkZXJzID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRIVFRQSGVhZGVycygpOwotICAgICAgU3RyaW5nIGFjdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoaGVhZGVycyAhPSBudWxsKQotICAgICAgICBhY3Rpb24gPSAoU3RyaW5nKSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlclRva2VucyhoZWFkZXJzLCAiOiIpLmdldCgiU09BUEFjdGlvbiIudG9VcHBlckNhc2UoKSk7Ci0KLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKClbMF07Ci0gICAgICBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0KLSAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuZ2V0V1NETERvY3VtZW50KCkuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICB2YWxpZGF0b3IpOwotICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLk9wZXJhdGlvbk1hdGNoIG1hdGNoID0KLSAgICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLm1hdGNoT3BlcmF0aW9uKAotICAgICAgICAgIGRvY1JlcXVlc3QsCi0gICAgICAgICAgYWN0aW9uLAotICAgICAgICAgIGJpbmRpbmcsCi0gICAgICAgICAgcmVnaXN0cnkpOwotCi0gICAgICBpZiAobWF0Y2ggPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLQotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gbWF0Y2guZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgICAgIE1lc3NhZ2Ugb3BlcmF0aW9uTWVzc2FnZSA9IG51bGw7Ci0gICAgICBpZiAoTWVzc2FnZUVudHJ5Ci0gICAgICAgIC5UWVBFX1JFUVVFU1QKLSAgICAgICAgLmVxdWFscyhlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpKQotICAgICAgICAmJiAoYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpICE9IG51bGwpKQotICAgICAgewotICAgICAgICBvcGVyYXRpb25NZXNzYWdlID0KLSAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoTWVzc2FnZUVudHJ5Ci0gICAgICAgICAgLlRZUEVfUkVTUE9OU0UKLSAgICAgICAgICAuZXF1YWxzKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkpCi0gICAgICAgICAgJiYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkgIT0gbnVsbCkpCi0gICAgICAgIHsKLSAgICAgICAgICBvcGVyYXRpb25NZXNzYWdlID0KLSAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvcGVyYXRpb25NZXNzYWdlID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0KLSAgICAgIGJvb2xlYW4gaXNDb250YWluQXJyYXkgPSBmYWxzZTsKLQotICAgICAgQ29sbGVjdGlvbiBwYXJ0cyA9IG9wZXJhdGlvbk1lc3NhZ2UuZ2V0UGFydHMoKS52YWx1ZXMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHBhcnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGl0ZXIubmV4dCgpOwotCi0gICAgICAgIFFOYW1lIHR5cGUgPSBudWxsOwotCi0gICAgICAgIGlmIChwYXJ0LmdldFR5cGVOYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHR5cGUgPSByZWdpc3RyeS5nZXRUeXBlKHBhcnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZSA9IHBhcnQuZ2V0VHlwZU5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlzQ29udGFpbkFycmF5ID0KLSAgICAgICAgICByZWdpc3RyeS5pc0V4dGVuZHNBcnJheSh0eXBlKQotICAgICAgICAgICAgfHwgcmVnaXN0cnkuaXNVc2VzV1NETEFycmF5VHlwZSh0eXBlKQotICAgICAgICAgICAgfHwgaXNBcnJheVR5cGUodHlwZSk7Ci0gICAgICAgIGlmIChpc0NvbnRhaW5BcnJheSkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzQ29udGFpbkFycmF5KQotICAgICAgewotICAgICAgICAvLyBHZXRzIGJvZHkKLSAgICAgICAgTm9kZUxpc3Qgc29hcEJvZHlMaXN0ID0KLSAgICAgICAgICBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwKLSAgICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9CT0RZKTsKLSAgICAgICAgaWYgKHNvYXBCb2R5TGlzdC5nZXRMZW5ndGgoKSA9PSAwIHx8IHNvYXBCb2R5TGlzdC5nZXRMZW5ndGgoKSA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgRWxlbWVudCBzb2FwQm9keUVsZW0gPSAoRWxlbWVudCkgc29hcEJvZHlMaXN0Lml0ZW0oMCk7Ci0KLSAgICAgICAgTm9kZUxpc3Qgc29hcEJvZHlDaWxkcmVuTGlzdCA9Ci0gICAgICAgICAgc29hcEJvZHlFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIioiLCAiKiIpOwotICAgICAgICBmb3IgKGludCBpbmRleENoaWxkID0gMDsKLSAgICAgICAgICBpbmRleENoaWxkIDwgc29hcEJvZHlDaWxkcmVuTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgICAgICBpbmRleENoaWxkKyspCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGVsZW0gPSAoRWxlbWVudCkgc29hcEJvZHlDaWxkcmVuTGlzdC5pdGVtKGluZGV4Q2hpbGQpOwotICAgICAgICAgIGlmIChlbGVtCi0gICAgICAgICAgICAuaGFzQXR0cmlidXRlTlMoCi0gICAgICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUF9FTkNPRElORywKLSAgICAgICAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfQVJSQVlfVFlQRSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvblBhc3NFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHR5cGUgdXNlcyBhbiBhcnJheSBvciBub3QuCi0gICAqIEBwYXJhbSB0eXBlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzQXJyYXlUeXBlKFFOYW1lIHR5cGUpCi0gIHsKLSAgICBib29sZWFuIGFycmF5VHlwZSA9IGZhbHNlOwotCi0gICAgRWxlbWVudCB0eXBlRWxlbWVudCA9IGdldFR5cGVFbGVtZW50KHR5cGUpOwotICAgIGlmICh0eXBlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIE5vZGVMaXN0IGxpc3QgPQotICAgICAgICB0eXBlRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfWFNELAotICAgICAgICAgICJzZXF1ZW5jZSIpOwotICAgICAgaWYgKGxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICBhcnJheVR5cGUgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBhcnJheVR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBYTUwgZWxlbWVudCBkZWZpbmluZyB0aGUgdHlwZS4KLSAgICogQHBhcmFtIHR5cGUKLSAgICogQHJldHVybiBFbGVtZW50Ci0gICAqLwotICBwcml2YXRlIEVsZW1lbnQgZ2V0VHlwZUVsZW1lbnQoUU5hbWUgdHlwZSkKLSAgewotICAgIFR5cGVzW10gYWxsVHlwZXMgPSB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXRUeXBlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBhbGxUeXBlcyAhPSBudWxsICYmIGkgPCBhbGxUeXBlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBFbGVtZW50IHR5cGVzRWxlbWVudCA9IG51bGw7Ci0gICAgICBpZiAoYWxsVHlwZXNbaV0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHlwZXNFbGVtZW50ID0gYWxsVHlwZXNbaV0uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHR5cGVzRWxlbWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCBleHRMaXN0ID0gYWxsVHlwZXNbaV0uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZXh0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChleHRFbGVtCi0gICAgICAgICAgICAgIC5nZXRFbGVtZW50VHlwZSgpCi0gICAgICAgICAgICAgIC5lcXVhbHMobmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfWFNELCAic2NoZW1hIikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0eXBlc0VsZW1lbnQgPQotICAgICAgICAgICAgICAgICgoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZXNFbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlTGlzdCBjb21wbGV4VHlwZXNMaXN0ID0KLSAgICAgICAgICAgIHR5cGVzRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1hTRCwKLSAgICAgICAgICAgICAgImNvbXBsZXhUeXBlIik7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb21wbGV4VHlwZXNMaXN0LmdldExlbmd0aCgpOyBqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgRWxlbWVudCB0eXBlRWxlbSA9IChFbGVtZW50KSBjb21wbGV4VHlwZXNMaXN0Lml0ZW0oaik7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHModHlwZUVsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gdHlwZUVsZW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjZhZjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVHJhdmVyc2FsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotCi0vKioKLSAqIEJQMTIwOCBOT1QgRlVMTFkgVEVTVEVELgotICovCi1wdWJsaWMgY2xhc3MgQlAxMjA4IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMjA4KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFBhcnNlIGxvZyBtZXNzYWdlIAotICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotICAgIGlmIChkb2MgPT0gbnVsbCkgewotICAgICAgLy9tZXNzYWdlIGlzIGVtcHR5IG9yIGludmFsaWQsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0KLSAgICB9IGVsc2UgewotCi0gICAgICAvLyBUcmF2ZXJzZSBkb2N1bWVudCBsb29raW5nIGZvciBwcm9jZXNzaW5nIGluc3RydWN0aW9ucy4KLSAgICAgIC8vIElTU1VFOiB0aGlzIGlubmVyIGNsYXNzIG5lZWRzIC4uLiByZXZpc2l0aW5nL3JlcGxhY2luZwotICAgICAgLy8gRUcuIERvIHdlIHdhbnQgdG8gbGlzdCBhbGwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIAotICAgICAgLy8gb3IgaXMgdGhlIGZpcnN0IHN1ZmZpY2llbnQ/Ci0gICAgICBYTUxUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFhNTFRyYXZlcnNhbCgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPQotICAgICAgICAgICAgICAiVGFyZ2V0OiAiICsgcGkuZ2V0VGFyZ2V0KCkgKyAiLCBEYXRhOiAiICsgcGkuZ2V0RGF0YSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gQUREOiBIb3cgc2hvdWxkIHRoaXMgZXhjZXB0aW9uIGJlIGhhbmRsZWQ/Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc3VwZXIudmlzaXQocGkpOwotICAgICAgICB9Ci0gICAgICB9OwotCi0gICAgICB0cmF2ZXJzYWwudmlzaXQoZG9jKTsKLQotICAgICAgaWYgKHJlc3VsdCA9PSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRAotICAgICAgICAmJiBmYWlsdXJlRGV0YWlsTWVzc2FnZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChmYWlsdXJlRGV0YWlsTWVzc2FnZSwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMTEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTEzM2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk9wZXJhdGlvblNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UeXBlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFRhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBCUDEyMTEuCi0gKiAKLSAqIENvbnRleHQ6IAotICogRm9yIGEgY2FuZGlkYXRlIG1lc3NhZ2UgaW4gdGhlIG1lc3NhZ2UgbG9nIGZpbGUsIHRoYXQgaXMgcmVmZXJyZWQgYnkgYSBiaW5kaW5nIHN0eWxlIFJQQy1saXRlcmFsCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogUGFydCBhY2Nlc3NvciBlbGVtZW50cyBpbiB0aGUgbWVzc2FnZSBkbyBub3QgaGF2ZSBhbiB4c2k6bmlsIGF0dHJpYnV0ZSB3aXRoIGEgdmFsdWUgb2YgIjEiIG9yICJ0cnVlIi4KLSAqLwotcHVibGljIGNsYXNzIEJQMTIxMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBYTUxUYWdzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEyMTEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUoVGVzdEFzc2VydGlvbiwgRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAodmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gUGFyc2UgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0gICAgICBEb2N1bWVudCBkb2NSZXF1ZXN0ID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3REb2N1bWVudCgpOwotCi0gICAgICBFbGVtZW50IHNvYXBPcGVyYXRpb24gPSBudWxsOwotICAgICAgLy8gSWYgdGhlcmUgaXMgYSBGYXVsdCBlbnRyeSBvciBubyBib2R5IGVudHJpZXMsCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAodmFsaWRhdG9yLmlzRmF1bHQoZG9jKQotICAgICAgICB8fCAoc29hcE9wZXJhdGlvbiA9IHZhbGlkYXRvci5nZXRTb2FwQm9keUNoaWxkKGRvYykpID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEdldCBTT0FQQWN0aW9uCi0gICAgICBTdHJpbmcgaGVhZGVycyA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0SFRUUEhlYWRlcnMoKTsKLSAgICAgIFN0cmluZyBhY3Rpb24gPSBudWxsOwotICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkKLSAgICAgICAgYWN0aW9uID0gKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoaGVhZGVycywgIjoiKS5nZXQoIlNPQVBBY3Rpb24iLnRvVXBwZXJDYXNlKCkpOwotCi0gICAgICAvLyBHZXQgdGhlIGJpbmRpbmcgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQgICAgICAgICAgICAgICAgCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXRCaW5kaW5ncygpWzBdOwotCi0gICAgICAvL0NyZWF0ZSB0aGUgdHlwZXMgcmVnaXN0cnkKLSAgICAgIFR5cGVzUmVnaXN0cnkgcmVnaXN0cnkgPQotICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5nZXRXU0RMRG9jdW1lbnQoKS5nZXREZWZpbml0aW9ucygpLAotICAgICAgICAgIHZhbGlkYXRvcik7Ci0KLSAgICAgIC8vIEZpbmQgYW4gb3BlcmF0aW9uIG1hdGNoICAgICAgICAKLSAgICAgIE9wZXJhdGlvblNpZ25hdHVyZS5PcGVyYXRpb25NYXRjaCBtYXRjaCA9Ci0gICAgICAgIE9wZXJhdGlvblNpZ25hdHVyZS5tYXRjaE9wZXJhdGlvbigKLSAgICAgICAgICBkb2NSZXF1ZXN0LAotICAgICAgICAgIGFjdGlvbiwKLSAgICAgICAgICBiaW5kaW5nLAotICAgICAgICAgIHJlZ2lzdHJ5KTsKLSAgICAgIGlmIChtYXRjaCA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBHZXQgdGhlIGJpbmRpbmcgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBtYXRjaAotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gbWF0Y2guZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgICAgIC8vIElmIHRoaXMgaXMgbm90IHJwYy1saXRlcmFsLCB0aGVuIHJldHVybiBub3RBcHBsaWNhYmxlIHJlc3VsdAotICAgICAgaWYgKCFXU0RMVXRpbHMKLSAgICAgICAgLmlzUnBjTGl0ZXJhbChtYXRjaC5nZXRPcGVyYXRpb25TdHlsZSgpLCBiaW5kaW5nT3BlcmF0aW9uKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIGFjY2Vzc29ycwotICAgICAgRWxlbWVudCBhY2Nlc3NvciA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoc29hcE9wZXJhdGlvbik7Ci0gICAgICB3aGlsZSAoYWNjZXNzb3IgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGFjY2Vzc29yLCBBVFRSX1hTSV9OSUwpOwotICAgICAgICAvLyBJZiB0aGVyZSBpcyB4c2k6bmlsIGF0dHJpYnV0ZSBhbmQgaXRzIHZhbHVlIGlzICIxIiBvciAidHJ1ZSIKLSAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgaWYgKGF0dHIgIT0gbnVsbAotICAgICAgICAgICYmIChhdHRyLmdldFZhbHVlKCkuZXF1YWxzKCIxIikgfHwgYXR0ci5nZXRWYWx1ZSgpLmVxdWFscygidHJ1ZSIpKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgYWNjZXNzb3IgbmFtZSBpcyAiCi0gICAgICAgICAgICArIGFjY2Vzc29yLmdldE5vZGVOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEdldHRpbmcgdGhlIG5leHQgYWNjZXNzb3IKLSAgICAgICAgYWNjZXNzb3IgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhhY2Nlc3Nvcik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIxMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMWY3NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQlAxMjEyCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG5vbi1mYXVsdCBlbnZlbG9wZSBjb250YWluaW5nIGEgc29hcDpib2R5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQ8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIGVudmVsb3BlIGNvbnRhaW5zIGV4YWN0bHkgb25lIHBhcnQgYWNjZXNzb3IgZWxlbWVudCBmb3IgZWFjaCBvZiB0aGUgd3NkbDpwYXJ0IGVsZW1lbnRzIGJvdW5kIHRvIHRoZSBlbnZlbG9wZSdzIGNvcnJlc3BvbmRpbmcgc29hcGJpbmQ6Ym9keSBlbGVtZW50LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDEyMTIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIHsKLQotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMjEyKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICh2YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBHZXR0aW5nIGEgbWVzc2FnZSBkb2N1bWVudAotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICAgIEVsZW1lbnQgc29hcE9wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAvLyBJZiB0aGVyZSBpcyBhIEZhdWx0IGVudHJ5IG9yIG5vIGJvZHkgZW50cmllcywKLSAgICAgIC8vIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICh2YWxpZGF0b3IuaXNGYXVsdChkb2MpCi0gICAgICAgIHx8IChzb2FwT3BlcmF0aW9uID0gdmFsaWRhdG9yLmdldFNvYXBCb2R5Q2hpbGQoZG9jKSkgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gQ3JlYXRpbmcgYSBxdWFsaWZpZWQgbmFtZSBvZiBwb3RlbnRpYWwgU09BUCBvcGVyYXRpb24KLSAgICAgIFFOYW1lIG9wZXJhdGlvblFOYW1lID0gbmV3IFFOYW1lKAotICAgICAgICBzb2FwT3BlcmF0aW9uLmdldE5hbWVzcGFjZVVSSSgpLCBzb2FwT3BlcmF0aW9uLmdldExvY2FsTmFtZSgpKTsKLQotICAgICAgLy8gUmV0cmlldmluZyBhbGwgdGhlIFJQQyBiaW5kaW5nIG9wZXJhdGlvbnMgZnJvbSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmdPcGVyYXRpb25bXSBycGNCaW5kaW5nT3BlcmF0aW9ucyA9Ci0gICAgICAgIHZhbGlkYXRvci5nZXRNYXRjaGluZ0JpbmRpbmdPcHMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQywKLSAgICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXRCaW5kaW5ncygpKTsKLQotICAgICAgLy8gUmV0cmlldmluZyBiaW5kaW5nIG9wZXJhdGlvbiBieSBnaXZlbiBvcGVyYXRpb24gbmFtZQotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gdmFsaWRhdG9yLmdldE9wZXJhdGlvbk1hdGNoKAotICAgICAgICBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSwKLSAgICAgICAgb3BlcmF0aW9uUU5hbWUsCi0gICAgICAgIHJwY0JpbmRpbmdPcGVyYXRpb25zKTsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWF0Y2hlZCBvcGVyYXRpb24sIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEZpbmRpbmcgb3BlcmF0aW9uIG1lc3NhZ2UgcGFydHMgYW5kIGV4dGVuc2liaWxpdHkgZWxlbXMKLSAgICAgIC8vIGluIHRoZSBiaW5kaW5nIGRlcGVuZGluZyBvbiBtZXNzYWdlIHR5cGUKLSAgICAgIExpc3Qgb3BlcmF0aW9uTWVzc2FnZVBhcnRzID0gbnVsbDsKLSAgICAgIExpc3QgZXh0RWxlbXMgPSBudWxsOwotICAgICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKSkKLSAgICAgIHsKLSAgICAgICAgb3BlcmF0aW9uTWVzc2FnZVBhcnRzID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKQotICAgICAgICAgIC5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKS5nZXRPcmRlcmVkUGFydHMobnVsbCk7Ci0gICAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpICE9IG51bGwpCi0gICAgICAgICAgZXh0RWxlbXMgPQotICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3BlcmF0aW9uTWVzc2FnZVBhcnRzID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKQotICAgICAgICAgIC5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCkuZ2V0T3JkZXJlZFBhcnRzKG51bGwpOwotICAgICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgICAgICBleHRFbGVtcyA9Ci0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0dGluZyBhbGwgdGhlIGFjY2Vzc29ycyBvZiB0aGUgb3BlcmF0aW9uIGVsZW1lbnQKLSAgICAgIExpc3QgYWNjZXNzb3JzID0gWE1MVXRpbHMuZ2V0Q2hpbGRFbGVtZW50cyhzb2FwT3BlcmF0aW9uKTsKLSAgICAgIC8vIEdldHRpbmcgdGhlIG9yZGVyZWQgbGlzdCBvZiB3c2RsOnBhcnQgbmFtZXMKLSAgICAgIExpc3Qgb3JkZXJlZFBhcnROYW1lcyA9Ci0gICAgICAgIHZhbGlkYXRvci5vcmRlclBhcnROYW1lcyhvcGVyYXRpb25NZXNzYWdlUGFydHMsIGV4dEVsZW1zKTsKLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSB3c2RsOnBhcnQgbmFtZXMKLSAgICAgIEl0ZXJhdG9yIGkgPSBvcmRlcmVkUGFydE5hbWVzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAvLyBJZiB0aGVyZSBpcyBub3QgZXhhY3RseSBvbmUgYWNjZXNzb3IgZm9yIHRoZSBwYXJ0IHNwZWNpZmllZCwKLSAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgaWYgKGdldFBhcnRzQ291bnQoYWNjZXNzb3JzLCBwYXJ0TmFtZSkgIT0gMSkKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICJUaGUgbmFtZSBvZiB3c2RsOnBhcnQgaXMgIiArIHBhcnROYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvdW50cyB0aGUgYW1vdW50IG9mIGFjY2Vzc29ycyBvZiBhIHNwZWNpZmljIG5hbWUKLSAgICogQHBhcmFtIGFjY2Vzc29ycyBhIGxpc3Qgb2YgYWNjZXNzb3JzCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGFjY2Vzc29yIGVsZW1lbnRzIHRvIGJlIGNvdW50ZWQKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJpdmF0ZSBpbnQgZ2V0UGFydHNDb3VudChMaXN0IGFjY2Vzc29ycywgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBpbnQgY291bnQgPSAwOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY2Nlc3NvcnMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgRWxlbWVudCBhY2Nlc3NvciA9IChFbGVtZW50KSBhY2Nlc3NvcnMuZ2V0KGkpOwotICAgICAgaWYgKGFjY2Vzc29yLmdldExvY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkKLSAgICAgICAgY291bnQrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gY291bnQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMTMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIxMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTVkODQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQlAxMjEzCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG5vbi1mYXVsdCBlbnZlbG9wZSBjb250YWluaW5nIGEgc29hcDpCb2R5IGVsZW1lbnQsIGFuZCBpcyByZWZlcnJlZCBieSBhIGRvYy1saXRlcmFsIGJpbmRpbmc8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIGVudmVsb3BlIGhhcyBubyBlbGVtZW50IGNvbnRlbnQgaW4gdGhlIHNvYXA6Qm9keSBlbGVtZW50IGlmIHRoZSB2YWx1ZSBvZiB0aGUgcGFydHMgYXR0cmlidXRlIG9mIHRoZSBzb2FwYmluZDpib2R5IGlzIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUgY29ycmVzcG9uZGluZyBkb2MtbGl0ZXJhbCBkZXNjcmlwdGlvbi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAxMjEzIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTIxMyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAodmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gR2V0dGluZyBhIG1lc3NhZ2UgZG9jdW1lbnQKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotCi0gICAgICBFbGVtZW50IG1lc3NhZ2VFbGVtZW50ID0gbnVsbDsKLSAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGVtcHR5IG9yIGludmFsaWQgb3IgdGhlcmUgaXMgYSBGYXVsdCBlbnRyeQotICAgICAgLy8gb3IgdGhlcmUgaXMgbm8gYm9keSBlbnRyaWVzLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoZG9jID09IG51bGwKLSAgICAgICAgfHwgdmFsaWRhdG9yLmlzRmF1bHQoZG9jKQotICAgICAgICB8fCAobWVzc2FnZUVsZW1lbnQgPSB2YWxpZGF0b3IuZ2V0U29hcEJvZHlDaGlsZChkb2MpKSA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBHZXR0aW5nIGEgcXVhbGlmaWVkIG5hbWUgb2YgbWVzc2FnZSBlbGVtZW50Ci0gICAgICBRTmFtZSBtZXNzYWdlUGFydEVsZW1lbnRRTmFtZSA9IG5ldyBRTmFtZSgKLSAgICAgICAgbWVzc2FnZUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCksIG1lc3NhZ2VFbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLQotICAgICAgLy8gUmV0cmlldmluZyBhbGwgdGhlIGRvY3VtZW50IGJpbmRpbmcgb3BlcmF0aW9ucyBmcm9tIHdzZGw6YmluZGluZwotICAgICAgQmluZGluZ09wZXJhdGlvbltdIGRvY0JpbmRpbmdPcGVyYXRpb25zID0KLSAgICAgICAgdmFsaWRhdG9yLmdldE1hdGNoaW5nQmluZGluZ09wcygKLSAgICAgICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DLAotICAgICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKCkpOwotCi0gICAgICAvLyBSZXRyaWV2aW5nIGJpbmRpbmcgb3BlcmF0aW9uIGJ5IGdpdmVuIGVsZW1lbnQgbmFtZQotICAgICAgQmluZGluZ09wZXJhdGlvbltdIHBvdGVudGlhbERvY0xpdE9wcyA9Ci0gICAgICAgIHZhbGlkYXRvci5nZXREb2NMaXRPcGVyYXRpb25zKAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLAotICAgICAgICAgIG1lc3NhZ2VQYXJ0RWxlbWVudFFOYW1lLAotICAgICAgICAgIGRvY0JpbmRpbmdPcGVyYXRpb25zKTsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgbm90IGV4YWN0bHkgb25lIG9wZXJhdGlvbiBtYXRjaGVkLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKHBvdGVudGlhbERvY0xpdE9wcy5sZW5ndGggIT0gMSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gRmluZGluZyBvcGVyYXRpb24gZXh0ZW5zaWJpbGl0eSBlbGVtcwotICAgICAgLy8gaW4gdGhlIGJpbmRpbmcgZGVwZW5kaW5nIG9uIG1lc3NhZ2UgdHlwZQotICAgICAgTGlzdCBleHRFbGVtcyA9IG51bGw7Ci0gICAgICBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldFR5cGUoKS5lcXVhbHMoCi0gICAgICAgIE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QpCi0gICAgICAgICYmIHBvdGVudGlhbERvY0xpdE9wc1swXS5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBleHRFbGVtcyA9IHBvdGVudGlhbERvY0xpdE9wc1swXQotICAgICAgICAgIC5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVNQT05TRSkKLSAgICAgICAgJiYgcG90ZW50aWFsRG9jTGl0T3BzWzBdLmdldEJpbmRpbmdPdXRwdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBleHRFbGVtcyA9IHBvdGVudGlhbERvY0xpdE9wc1swXQotICAgICAgICAgIC5nZXRCaW5kaW5nT3V0cHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEdldHRpbmcgdGhlIHBhcnRzIGF0dHJpYnV0ZSBmcm9tIHNvYXBiaW5kOmJvZHkKLSAgICAgIExpc3QgcGFydHMgPSBudWxsOwotICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSB2YWxpZGF0b3IuZ2V0U09BUEJvZHkoZXh0RWxlbXMpOwotICAgICAgaWYgKHNvYXBCb2R5ICE9IG51bGwpCi0gICAgICAgIHBhcnRzID0gc29hcEJvZHkuZ2V0UGFydHMoKTsKLQotICAgICAgLy8gaWYgdGhlIHBhcnRzIGF0dHJpYnV0ZSBpcyBhbiBlbXB0eSBzdHJpbmcgYW5kIHRoZXJlIGlzCi0gICAgICAvLyBhdCBsZWFzdCBvbmUgYWNjZXNzb3IsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICBpZiAocGFydHMgIT0gbnVsbCAmJiBwYXJ0cy5pc0VtcHR5KCkKLSAgICAgICAgJiYgIVhNTFV0aWxzLmdldENoaWxkRWxlbWVudHMobWVzc2FnZUVsZW1lbnQpLmlzRW1wdHkoKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIndzZGw6b3BlcmF0aW9uIG5hbWUgaXMgIgotICAgICAgICAgICsgcG90ZW50aWFsRG9jTGl0T3BzWzBdLmdldE5hbWUoKSk7Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjE0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRhMTM0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEJQMTIxNAotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBub24tZmF1bHQgZW52ZWxvcGUgY29udGFpbmluZyBhIHNvYXA6Qm9keSBlbGVtZW50LCBhbmQgaXMgcmVmZXJyZWQgYnkgYSBycGMtbGl0ZXJhbCBiaW5kaW5nPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBlbnZlbG9wZSBkb2VzIG5vdCBjb250YWluIGFueSBwYXJ0IGFjY2Vzc29yIGVsZW1lbnRzIGlmIHRoZSB2YWx1ZSBvZiB0aGUgcGFydHMgYXR0cmlidXRlIG9mIHRoZSBzb2FwYmluZDpib2R5IGlzIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUgY29ycmVzcG9uZGluZyBycGMtbGl0ZXJhbCBkZXNjcmlwdGlvbi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAxMjE0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTIxNChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAodmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gR2V0dGluZyBhIG1lc3NhZ2UgZG9jdW1lbnQKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotCi0gICAgICBFbGVtZW50IHNvYXBPcGVyYXRpb24gPSBudWxsOwotICAgICAgLy8gSWYgdGhlcmUgaXMgYSBGYXVsdCBlbnRyeSBvciBubyBib2R5IGVudHJpZXMsCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAodmFsaWRhdG9yLmlzRmF1bHQoZG9jKQotICAgICAgICB8fCAoc29hcE9wZXJhdGlvbiA9IHZhbGlkYXRvci5nZXRTb2FwQm9keUNoaWxkKGRvYykpID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIENyZWF0aW5nIGEgcXVhbGlmaWVkIG5hbWUgb2YgcG90ZW50aWFsIFNPQVAgb3BlcmF0aW9uCi0gICAgICBRTmFtZSBvcGVyYXRpb25RTmFtZSA9IG5ldyBRTmFtZSgKLSAgICAgICAgc29hcE9wZXJhdGlvbi5nZXROYW1lc3BhY2VVUkkoKSwgc29hcE9wZXJhdGlvbi5nZXRMb2NhbE5hbWUoKSk7Ci0KLSAgICAgIC8vIFJldHJpZXZpbmcgYWxsIHRoZSBSUEMgYmluZGluZyBvcGVyYXRpb25zIGZyb20gd3NkbDpiaW5kaW5nCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uW10gcnBjQmluZGluZ09wZXJhdGlvbnMgPQotICAgICAgICB2YWxpZGF0b3IuZ2V0TWF0Y2hpbmdCaW5kaW5nT3BzKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMsCi0gICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKSk7Ci0KLSAgICAgIC8vIFJldHJpZXZpbmcgYmluZGluZyBvcGVyYXRpb24gYnkgZ2l2ZW4gb3BlcmF0aW9uIG5hbWUKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IHZhbGlkYXRvci5nZXRPcGVyYXRpb25NYXRjaCgKLSAgICAgICAgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCksCi0gICAgICAgIG9wZXJhdGlvblFOYW1lLAotICAgICAgICBycGNCaW5kaW5nT3BlcmF0aW9ucyk7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG1hdGNoZWQgb3BlcmF0aW9uLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBGaW5kaW5nIG9wZXJhdGlvbiBleHRlbnNpYmlsaXR5IGVsZW1zCi0gICAgICAvLyBpbiB0aGUgYmluZGluZyBkZXBlbmRpbmcgb24gbWVzc2FnZSB0eXBlCi0gICAgICBMaXN0IGV4dEVsZW1zID0gbnVsbDsKLSAgICAgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpLmVxdWFscygKLSAgICAgICAgTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVCkKLSAgICAgICAgJiYgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBleHRFbGVtcyA9Ci0gICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVNQT05TRSkKLSAgICAgICAgJiYgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZXh0RWxlbXMgPQotICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGUgbWVzc2FnZSBpcyBub3QgbGl0ZXJhbCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCF2YWxpZGF0b3IuaXNMaXRlcmFsKGV4dEVsZW1zKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gR2V0dGluZyB0aGUgcGFydHMgYXR0cmlidXRlIGZyb20gc29hcGJpbmQ6Ym9keQotICAgICAgTGlzdCBwYXJ0cyA9IG51bGw7Ci0gICAgICBTT0FQQm9keSBzb2FwQm9keSA9IHZhbGlkYXRvci5nZXRTT0FQQm9keShleHRFbGVtcyk7Ci0gICAgICBpZiAoc29hcEJvZHkgIT0gbnVsbCkKLSAgICAgICAgcGFydHMgPSBzb2FwQm9keS5nZXRQYXJ0cygpOwotCi0gICAgICAvLyBpZiB0aGUgcGFydHMgYXR0cmlidXRlIGlzIGFuIGVtcHR5IHN0cmluZyBhbmQgdGhlcmUgaXMKLSAgICAgIC8vIGF0IGxlYXN0IG9uZSBhY2Nlc3NvciwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgIGlmIChwYXJ0cyAhPSBudWxsICYmIHBhcnRzLmlzRW1wdHkoKQotICAgICAgICAmJiAhWE1MVXRpbHMuZ2V0Q2hpbGRFbGVtZW50cyhzb2FwT3BlcmF0aW9uKS5pc0VtcHR5KCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJ3c2RsOm9wZXJhdGlvbiBuYW1lIGlzICIKLSAgICAgICAgICArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmEyMGM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogQlAxMzAxLgotICovCi1wdWJsaWMgY2xhc3MgQlAxMzAxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMzAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgLy9HZXQgdGhlIHJlcXVldHMgbWVzc2FnZSBhbmQgY2hlY2sgdGhlIHZhbHVlIG9mIG11c3RVbmRlcnN0YW5kLgotICAgIFN0cmluZyBtZXNzYWdlID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKTsKLSAgICBPYmplY3RbXSBtdXN0VW5kZXJzdGFuZEF0dHJpYnV0ZXMgPSBnZXRNdXN0VW5kZXJzdGFuZEF0dHJpYnV0ZXMobWVzc2FnZSk7Ci0KLSAgICBpZiAobXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGVzID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBtdXN0VW5kZXJzdGFuZEF0dHJpYnV0ZXMubGVuZ3RoOyBpbmRleCsrKQotICAgICAgewotICAgICAgICBpZiAoKG11c3RVbmRlcnN0YW5kQXR0cmlidXRlc1tpbmRleF0gIT0gbnVsbCkKLSAgICAgICAgICAmJiAobXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGVzW2luZGV4XS5lcXVhbHMoIjEiKQotICAgICAgICAgICAgfHwgbXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGVzW2luZGV4XS5lcXVhbHMoIjAiKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICJUaGUgU09BUCBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgd2FzIHByZXNlbnQgIgotICAgICAgICAgICAgICAgICsgIiBhbmQgaXRzIHZhbHVlIHdhcyAgIgotICAgICAgICAgICAgICAgICsgbXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGVzW2luZGV4XSwKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfSAvL0VuZCBpZgotICAgICAgfSAvL0VuZCBmb3IKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvL1JldHJlaXZlcyB0aGUgdmFsdWUgb2YgdGhlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBmcm9tIEFMTCBTT0FQIGhlYWRlcgotICAvL0lmIHRoZSBIZWFkZXIgaXMgbWlzc2luZyBvciBpZiBpdCBkb2VzIG5vdCBjb250YWluIGFueSB0YXJnZXRzIG9yIGlmCi0gIC8vdGhlIGhlYWRlciBkb2VzIG5vdCBjb250YWluIGEgbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlIHRoZW4gc2V0IHRoZQotICAvL2Fzc2VydGlvblJlc3VsdCB0byBSRVNVTFRfTk9UX0FQUExJQ0FCTEUuCi0gIHByaXZhdGUgT2JqZWN0W10gZ2V0TXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGVzKFN0cmluZyBtZXNzYWdlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGlmIChtZXNzYWdlID09IG51bGwgfHwgbWVzc2FnZS50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgRG9jdW1lbnQgZG9jID0gWE1MVXRpbHMucGFyc2VYTUwobWVzc2FnZSk7Ci0gICAgTm9kZUxpc3QgaGVhZGVycyA9Ci0gICAgICBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsICJIZWFkZXIiKTsKLQotICAgIC8vSWYgYSBoZWFkZXIgbm90IHByZXNlbnQgc2V0IHJlc3VsdCB0byBub3RBcHBsaWNhYmxlCi0gICAgLy9lbHNlIHByb2Nlc3MgZWFjaCBoZWFkZXJFbnRyeQotICAgIGlmIChoZWFkZXJzLmdldExlbmd0aCgpIDw9IDApCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBWZWN0b3IgbXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGVzID0gbmV3IFZlY3RvcigpOwotICAgICAgRWxlbWVudCBoZWFkZXIgPSAoRWxlbWVudCkgaGVhZGVycy5pdGVtKDApOwotICAgICAgaWYgKGhlYWRlciA9PSBudWxsKQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgTm9kZUxpc3QgaGVhZGVyRW50cmllcyA9IGhlYWRlci5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAvL0ZvciBlYWNoIGhlYWRlciBlbnRyeSBjaGVjayByZXRyZWl2ZSB0aGUgbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlIAotICAgICAgLy9pZiBhbnksIGVsc2Ugc2V0IHRoZSB0ZXN0IHJlc3VsdCB0byBub3RBcHBsaWNhYmxlCi0KLSAgICAgIC8vVGhpcyBpcyB1c2VkIHRvIGluZGljYXRlIGlmIGEgaGVhZGVyIGNvbnRhaW5lZCBhbnkgY2hpbGQgRWxlbWVudHMKLSAgICAgIGJvb2xlYW4gaGVhZGVyVGFyZ2V0cyA9IGZhbHNlOwotCi0gICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgaGVhZGVyRW50cmllcy5nZXRMZW5ndGgoKTsgKytpbmRleCkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBoZWFkZXJFbnRyeSA9IGhlYWRlckVudHJpZXMuaXRlbShpbmRleCk7Ci0gICAgICAgIGlmIChoZWFkZXJFbnRyeS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgaGVhZGVyVGFyZ2V0cyA9IHRydWU7Ci0gICAgICAgICAgQXR0ciBtdXN0VW5kZXJzdGFuZCA9Ci0gICAgICAgICAgICAoKEVsZW1lbnQpIGhlYWRlckVudHJ5KS5nZXRBdHRyaWJ1dGVOb2RlTlMoCi0gICAgICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwKLSAgICAgICAgICAgICAgIm11c3RVbmRlcnN0YW5kIik7Ci0gICAgICAgICAgLy9SZXRyZWl2ZSB0aGUgdmFsdWUgb2YgdGhlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBvZiB0aGUgcmVxdWVzdC4KLSAgICAgICAgICBpZiAobXVzdFVuZGVyc3RhbmQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbXVzdFVuZGVyc3RhbmRWYWx1ZSA9IG11c3RVbmRlcnN0YW5kLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgbXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGVzLmFkZChtdXN0VW5kZXJzdGFuZFZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgICAgICAvL1RoZSBTT0FQIEhlYWRlciBkb2VzIG5vdCBjb250YWluIGEgbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlLiIKLSAgICAgICAgICB9IC8vCW11c3RVbmRlcnN0YW5kICE9IG51bGwKLSAgICAgICAgfQotICAgICAgfSAvL0VuZCBmb3IKLQotICAgICAgaWYgKCFoZWFkZXJUYXJnZXRzKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICAvL1RoZSBTT0FQIEhlYWRlciBkb2VzIG5vdCBjb250YWluIGFueSBoZWFkZXIgZW50cmllcy4KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIG11c3RVbmRlcnN0YW5kQXR0cmlidXRlcy50b0FycmF5KCk7Ci0gICAgfSAvL0VuZCBJZiBoZWFkZXJzLmdldExlbmd0aCgpIDwgMAkKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvYmplY3QgaXMgbXVzdCB1bmRlcnN0YW5kIGZhdWx0IGNvZGUuCi0gICAqIEBwYXJhbSBmYXVsdENvZGVFbGVtIHVuZGVyc3RhbmQgZmF1bHQgY29kZS4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgb2JqZWN0IGlzIG11c3QgdW5kZXJzdGFuZCBmYXVsdCBjb2RlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNNdXN0VW5kZXJzdGFuZEZhdWx0Q29kZShFbGVtZW50IGZhdWx0Q29kZUVsZW0pCi0gIHsKLSAgICAvL0EgZmF1bHRjb2RlIG1heSBvciBtYXlub3QgaGF2ZSBhIHByZWZpeCwgaWYgaXQgZG9lcyBpdHMgbmFtZXNwYWNlIHNob3VsZCBiZSAKLSAgICAvL2h0dDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZSB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgZmF1bHRjb2RlIGVsZW1lbnQuCi0gICAgLy9JZiBhIHByZWZpeCBpcyBwcmVzZW50IGFuZCBpdCBjb3JyZXNwb25kcyB0byBhIGRpZmZlcmVudCBuYW1lc3BhY2Ugb3IgaXMgbnVsbCAKLSAgICAvL3RoZW4gdGhpcyByZXR1cm5zIGZhbHNlLiAgVGhlIGxvY2FsIHBhcnQgb2YgdGhlIGZhdWx0Y29kZSBpcyB0aGVuIGNoZWNrIHRvIHNlZQotICAgIC8vaWYgaXQgaXMgb25lIG9mIHRoZSBwZXJtaXR0ZWQgdmFsdWVzLgotICAgIGlmIChmYXVsdENvZGVFbGVtID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTdHJpbmcgZmF1bHRDb2RlID0gZmF1bHRDb2RlRWxlbS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpOwotICAgIGlmIChmYXVsdENvZGUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFN0cmluZyBmYXVsdENvZGVFbGVtUHJlZml4ID0gZmF1bHRDb2RlRWxlbS5nZXRQcmVmaXgoKTsKLSAgICBTdHJpbmcgZmF1bHRDb2RlUHJlZml4ID0gZmF1bHRDb2RlLnN1YnN0cmluZygwLCBmYXVsdENvZGUuaW5kZXhPZignOicpKTsKLSAgICBTdHJpbmcgZmF1bHRDb2RlTmFtZSA9Ci0gICAgICBmYXVsdENvZGUuc3Vic3RyaW5nKGZhdWx0Q29kZS5pbmRleE9mKCc6JykgKyAxLCBmYXVsdENvZGUubGVuZ3RoKCkpOwotCi0gICAgaWYgKChmYXVsdENvZGVFbGVtUHJlZml4ICE9IG51bGwgfHwgZmF1bHRDb2RlUHJlZml4ICE9IG51bGwpKQotICAgIHsKLSAgICAgIGlmIChmYXVsdENvZGVQcmVmaXguZXF1YWxzKGZhdWx0Q29kZUVsZW1QcmVmaXgpCi0gICAgICAgICYmIChmYXVsdENvZGVOYW1lLmVxdWFscygiTXVzdFVuZGVyc3RhbmQiKQotICAgICAgICAgIHx8IGZhdWx0Q29kZU5hbWUuc3RhcnRzV2l0aCgiTXVzdFVuZGVyc3RhbmQuIikpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGZhdWx0Q29kZS5lcXVhbHMoIk11c3RVbmRlcnN0YW5kIikKLSAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5zdGFydHNXaXRoKCJNdXN0VW5kZXJzdGFuZC4iKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2FjZDU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAgICogQlAxMzAyLgotICAgKiBUaGUgc29hcDpmYXVsdGNvZGUgdmFsdWUgaW4gdGhlIHNvYXA6RmF1bHQgZWxlbWVudCBvZiB0aGUgcmVzcG9uc2UgCi0gICAqIG1lc3NhZ2UgaXMgbm90IGN1c3RvbSwgYW5kIGlzIG9uZSBvZjogVmVyc2lvbk1pc21hdGNoLCBNdXN0VW5kZXJzdGFuZCwgQ2xpZW50LCBTZXJ2ZXIuCi0gICAqLwotcHVibGljIGNsYXNzIEJQMTMwMiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTMwMihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLy9TT0FQIGZhdWx0IGNvZGUgdmFsdWVzIHNob3VsZCBub3QgYmUgY3VzdG9tOiBvbmx5IHN0YW5kYXJkIGNvZGUgcXVhbGlmaWVycyAKLSAgLy9hcmUgdXNlZDogVmVyc2lvbk1pc21hdGNoLCBNdXN0VW5kZXJzdGFuZCwgQ2xpZW50LCBTZXJ2ZXIKLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vU3RyaW5nIHJlcXVlc3RNZXNzYWdlID0gbnVsbDsKLSAgICBTdHJpbmcgcmVzcG9uc2VNZXNzYWdlID0gbnVsbDsKLQotICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vR2V0IHRoZSByZXNwb25zZSBtZXNzYWdlIGNoZWNrIHRoZSBmYXVsdGNvZGUuCi0gICAgICBNZXNzYWdlRW50cnkgbG9nRW50cnlSZXNwb25zZSA9IGVudHJ5Q29udGV4dC5nZXRSZXNwb25zZSgpOwotICAgICAgaWYgKGxvZ0VudHJ5UmVzcG9uc2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzcG9uc2VNZXNzYWdlID0gbG9nRW50cnlSZXNwb25zZS5nZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgdGFyZ2V0RG9jID0gWE1MVXRpbHMucGFyc2VYTUwocmVzcG9uc2VNZXNzYWdlKTsKLSAgICAgICAgTm9kZUxpc3QgZmF1bHRDb2RlcyA9IHRhcmdldERvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZmF1bHRjb2RlIik7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICB0YXJnZXREb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsICJmYXVsdGNvZGUiKTsKLQotICAgICAgICBpZiAoZmF1bHRDb2Rlcy5nZXRMZW5ndGgoKSA8PSAwKQotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgIC8vTm8gZmF1bHRjb2RlCQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHRDb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBmYXVsdENvZGVFbGVtID0gZmF1bHRDb2Rlcy5pdGVtKGkpOwotICAgICAgICAgIC8vSWYgdGhlIGZhdWx0Y29kZSB3YXMgTXVzdFVuZGVyc3RhbmQsIGNoZWNrIHRoZSB2YWx1ZSBvZiAKLSAgICAgICAgICAvL3RoZSBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgaW4gdGhlIHJlcXVlc3QuCi0gICAgICAgICAgaWYgKGZhdWx0Q29kZUVsZW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgICAgZWxzZSBpZiAoZmF1bHRDb2RlRWxlbS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc1ZhbGlkRmF1bHRDb2RlKChFbGVtZW50KSBmYXVsdENvZGVFbGVtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChyZXNwb25zZU1lc3NhZ2UsIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgICAgIC8vZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICAgIC8vICAgICJUaGUgZmF1bHRjb2RlIHZhbHVlIHdhcyA6ICIKLSAgICAgICAgICAgICAgLy8gICAgICAgICsgZmF1bHRDb2RlRWxlbS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpOwotICAgICAgICAgICAgfSAvL0VuZCBpZiAoZmF1bHRDb2RlLmVxdWFscy4uLikKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgICAgfQotICAgICAgICB9IC8vRW5kIGZvcgkKLSAgICAgIH0gLy9FbmQgaWYgbG9nRW50cnlSZXNwb25zZSE9IG51bGwKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgZmF1bHRDb2RlLgotICAgKiBAcGFyYW0gZmF1bHRDb2RlRWxlbSBhIGZhdWx0Y29kZS4KLSAgICogQHJldHVybiB0cnVlIGlmIGZhdWx0Y29kZSBpcyB2YWxpZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRGYXVsdENvZGUoRWxlbWVudCBmYXVsdENvZGVFbGVtKQotICB7Ci0gICAgLy9BIGZhdWx0Y29kZSBtYXkgb3IgbWF5bm90IGhhdmUgYSBwcmVmaXgsIGlmIGl0IGRvZXMgaXRzIG5hbWVzcGFjZSBzaG91bGQgYmUgCi0gICAgLy9odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBmYXVsdGNvZGUgZWxlbWVudC4KLSAgICAvL0lmIGEgcHJlZml4IGlzIHByZXNlbnQgYW5kIGl0IGNvcnJlc3BvbmRzIHRvIGEgZGlmZmVyZW50IG5hbWVzcGFjZSBvciBpcyBudWxsIAotICAgIC8vdGhlbiB0aGlzIHJldHVybnMgZmFsc2UuICBUaGUgbG9jYWwgcGFydCBvZiB0aGUgZmF1bHRjb2RlIGlzIHRoZW4gY2hlY2sgdG8gc2VlCi0gICAgLy9pZiBpdCBpcyBvbmUgb2YgdGhlIHBlcm1pdHRlZCB2YWx1ZXMuCi0gICAgaWYgKGZhdWx0Q29kZUVsZW0gPT0gbnVsbCkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgU3RyaW5nIGZhdWx0Q29kZSA9IGZhdWx0Q29kZUVsZW0uZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLSAgICBpZiAoZmF1bHRDb2RlID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBGSVg6IFRoaXMgaXMgbm90IGNvcnJlY3QsIHNpbmNlIHRoaXMgZWxlbWVudCBjYW4gbm90IGJlIG5hbWVzcGFjZSBxdWFsaWZpZWQKLSAgICBTdHJpbmcgZmF1bHRDb2RlRWxlbVByZWZpeCA9IGZhdWx0Q29kZUVsZW0uZ2V0UGFyZW50Tm9kZSgpLmdldFByZWZpeCgpOwotCi0gICAgLy8gSWYgdGhpcyBpcyBub3QgYSBRTmFtZSB0aGVuIHJldHVybiBmYWxzZQotICAgIGludCBpbmRleDsKLSAgICBTdHJpbmcgZmF1bHRDb2RlUHJlZml4ID0gbnVsbDsKLSAgICBTdHJpbmcgZmF1bHRDb2RlTmFtZSA9IGZhdWx0Q29kZTsKLSAgICBpZiAoKGluZGV4ID0gZmF1bHRDb2RlLmluZGV4T2YoJzonKSkgIT0gLTEpCi0gICAgewotICAgICAgZmF1bHRDb2RlUHJlZml4ID0gZmF1bHRDb2RlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICBmYXVsdENvZGVOYW1lID0gZmF1bHRDb2RlLnN1YnN0cmluZyhpbmRleCArIDEsIGZhdWx0Q29kZS5sZW5ndGgoKSk7Ci0gICAgfQotCi0gICAgaWYgKChmYXVsdENvZGVFbGVtUHJlZml4ICE9IG51bGwgJiYgZmF1bHRDb2RlUHJlZml4ICE9IG51bGwpKQotICAgIHsKLSAgICAgIGlmIChmYXVsdENvZGVQcmVmaXguZXF1YWxzKGZhdWx0Q29kZUVsZW1QcmVmaXgpKQotICAgICAgewotICAgICAgICBpZiAoKGZhdWx0Q29kZU5hbWUuZXF1YWxzKCJNdXN0VW5kZXJzdGFuZCIpCi0gICAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5lcXVhbHMoIlZlcnNpb25NaXNtYXRjaCIpCi0gICAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5lcXVhbHMoIkNsaWVudCIpCi0gICAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5lcXVhbHMoIlNlcnZlciIpKSkKLSAgICAgICAgICAvKiBSRU1PVkU6Ci0gICAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5zdGFydHNXaXRoKCJNdXN0VW5kZXJzdGFuZC4iKQotICAgICAgICAgIHx8IGZhdWx0Q29kZU5hbWUuc3RhcnRzV2l0aCgiVmVyc2lvbk1pc21hdGNoLiIpCi0gICAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5zdGFydHNXaXRoKCJDbGllbnQuIikKLSAgICAgICAgICB8fCBmYXVsdENvZGVOYW1lLnN0YXJ0c1dpdGgoIlNlcnZlci4iKSkpCi0gICAgICAgICAgKi8KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZmF1bHRDb2RlTmFtZS5lcXVhbHMoIk11c3RVbmRlcnN0YW5kIikKLSAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5lcXVhbHMoIlZlcnNpb25NaXNtYXRjaCIpCi0gICAgICAgIHx8IGZhdWx0Q29kZU5hbWUuZXF1YWxzKCJDbGllbnQiKQotICAgICAgICB8fCBmYXVsdENvZGVOYW1lLmVxdWFscygiU2VydmVyIikKLSAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5zdGFydHNXaXRoKCJNdXN0VW5kZXJzdGFuZC4iKQotICAgICAgICB8fCBmYXVsdENvZGVOYW1lLnN0YXJ0c1dpdGgoIlZlcnNpb25NaXNtYXRjaC4iKQotICAgICAgICB8fCBmYXVsdENvZGVOYW1lLnN0YXJ0c1dpdGgoIkNsaWVudC4iKQotICAgICAgICB8fCBmYXVsdENvZGVOYW1lLnN0YXJ0c1dpdGgoIlNlcnZlci4iKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzc5NzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gICAqIEJQMTMwNS4KLSAgICogSXQgaXMgaW4gYW4gSFRUUCA1MDAgbWVzc2FnZSB3aXRoICJTZXJ2ZXIiIEVycm9yIGNvZGUuCi0gICAqLwotcHVibGljIGNsYXNzIEJQMTMwNSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTMwNShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIERvY3VtZW50IGRvYzsKLSAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG9uZSB3YXkgcmVzcG9uc2UKLSAgICAvLyBvciBtZXNzYWdlIGlzIG1lcHR5IG9yIGludmFsaWQKLSAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpCi0gICAgICB8fCAoZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIGxvb2sgZm9yIDxzb2FwOkZhdWx0PiBlbGVtZW50OgotICAgICAgTm9kZUxpc3QgZmF1bHRMaXN0ID0KLSAgICAgICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLAotICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9GQVVMVCk7Ci0gICAgICBpZiAoKGZhdWx0TGlzdCA9PSBudWxsKSB8fCAoZmF1bHRMaXN0LmdldExlbmd0aCgpID09IDApKQotICAgICAgewotICAgICAgICAvLyBSZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGEgc29hcDpmYXVsdAotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyB3ZSBoYXZlIGEgc29hcDpGYXVsdC4gQ2hlY2sgdGhhdCBpdCBpcyBjb250YWluZWQgaW4gYSBIVFRQIDUwMCBtZXNzYWdlCi0gICAgICAgIC8vIEdUIDogYmFzZSBIVFRQIEhlYWRlciBwYXJzaW5nIG9uIEJQMTAwMSAtIHRoaXMgc2hvdWxkIGJlIGZhY3RvcmVkIHRvIGEgCi0gICAgICAgIC8vIGdlbmVyYWwtcHVycG9zZSBIVFRQIG1lc3NhZ2UgcGFyc2luZyBtZXRob2Qgb3IgbWV0aG9kcyAocmVxdWVzdCAmIHJlc3BvbnNlKQotICAgICAgICBTdHJpbmcgaHR0cEhlYWRlciA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpOwotICAgICAgICAvL1Jlc3BvbnNlLUxpbmUgICA9IEhUVFAtVmVyc2lvbiBSZXNwb25zZUNvZGUgUmVzcG9uc2VNc2cgU1AgQ1JMRgotICAgICAgICBWZWN0b3IgcmVzcG9uc2VMaW5lID0gbmV3IFZlY3RvcigpOwotICAgICAgICBTdHJpbmcgc3RhcnRMaW5lID0gbnVsbDsKLSAgICAgICAgLy9TdHJpbmcgaHR0cFZlcnNpb24gPSBudWxsOwotICAgICAgICAvL1N0cmluZyByZXNwb25zZUNvZGUgPSBudWxsOwotICAgICAgICBTdHJpbmcgc3RhdHVzQ29kZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBodHRwTWVzc2FnZVRva2VuaXplciA9Ci0gICAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihodHRwSGVhZGVyLCAiXG5cclxmIik7Ci0KLSAgICAgICAgaWYgKGh0dHBNZXNzYWdlVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICBzdGFydExpbmUgPSBodHRwTWVzc2FnZVRva2VuaXplci5uZXh0VG9rZW4oKTsKLQotICAgICAgICBpZiAoc3RhcnRMaW5lLnN0YXJ0c1dpdGgoIkhUVFAiKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdGFydExpbmVUb2tlbml6ZXIgPQotICAgICAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihzdGFydExpbmUsICJcdTAwMjAiKTsKLQotICAgICAgICAgIHdoaWxlIChzdGFydExpbmVUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3BvbnNlTGluZS5hZGQoc3RhcnRMaW5lVG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvL2h0dHBWZXJzaW9uID0gKFN0cmluZykgcmVzcG9uc2VMaW5lLmdldCgwKTsKLQotICAgICAgICAgIC8vIFBCOiBDaGVjayBmb3IgNTAwIHN0YXR1cyBjb2RlIHdoaWNoIHNob3VsZCBiZSB0aGUgc2Vjb25kIHRva2VuIGluIHRoZSBzdHJpbmcKLSAgICAgICAgICBzdGF0dXNDb2RlID0gKFN0cmluZykgcmVzcG9uc2VMaW5lLmdldCgxKTsKLQotICAgICAgICAgIC8vcmVzcG9uc2VDb2RlID0gKFN0cmluZykgcmVzcG9uc2VMaW5lLmdldCgxKTsKLSAgICAgICAgICAvL3N0YXR1c0NvZGUgPSAoU3RyaW5nKSByZXNwb25zZUxpbmUuZ2V0KDIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy8gUEI6IEp1c3QgY2hlY2sgZm9yIDUwMCBzdGF0dXMgY29kZQotICAgICAgICAgIGlmICghc3RhdHVzQ29kZQotICAgICAgICAgICAgLmVxdWFscyhTdHJpbmcudmFsdWVPZihIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX0lOVEVSTkFMX0VSUk9SKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy9pZiAoIXJlc3BvbnNlQ29kZS5lcXVhbHNJZ25vcmVDYXNlKCJPSyIpIHx8Ci0gICAgICAgICAgICAvLwkoIXN0YXR1c0NvZGUuZXF1YWxzSWdub3JlQ2FzZSgiU2VydmVyRXJyb3IiKSkpIHsgICAgIAkJCQotICAgICAgICAgICAgLy8gQXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oaHR0cEhlYWRlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZTQwZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICAgKiBCUDEzMDYuCi0gICAqIFRoZSBzb2FwOkZhdWx0IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBjaGlsZHJlbiBvdGhlciB0aGFuIHNvYXA6ZmF1bHRjb2RlLCBzb2FwOmZhdWx0c3RyaW5nLCBzb2FwOmZhdWx0YWN0b3Igb3Igc29hcDpkZXRhaWwuCi0gICAqLwotcHVibGljIGNsYXNzIEJQMTMwNiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTMwNihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIERvY3VtZW50IGRvYzsKLSAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG9uZSB3YXkgcmVzcG9uc2UKLSAgICAvLyBvciBtZXNzYWdlIGlzIG1lcHR5IG9yIGludmFsaWQKLSAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpCi0gCSAgICB8fCAoZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIGxvb2sgZm9yIDxzb2FwOkZhdWx0PiBlbGVtZW50OgotICAgICAgTm9kZUxpc3QgZmF1bHRMaXN0ID0KLSAgICAgICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLAotICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9GQVVMVCk7Ci0gICAgICBpZiAoKGZhdWx0TGlzdCA9PSBudWxsKSB8fCAoZmF1bHRMaXN0LmdldExlbmd0aCgpID09IDApKQotICAgICAgewotICAgICAgICAvLyBSZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGEgc29hcDpmYXVsdAotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBjaGVjayB0aGF0IG5vIHNvYXA6ZmF1bHQgY29udGFpbnMgb25seSBmYXVsdGNvZGUsIGZhdWx0c3RyaW5nLCBmYXVsdGFjdG9yLCBkZXRhaWwuCi0gICAgICAgIC8vIElmIGl0IGRvZXMsIGZ1cnRoZXIgY2hlY2sgdGhhdCBpdCBpcyB1bnF1YWxpZmllZC4KLSAgICAgICAgLy8gRm9yIGVhY2ggPHNvYXA6RmF1bHQ+Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBmYXVsdExpc3QuZ2V0TGVuZ3RoKCk7IG4rKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKE5vZGUgY2hpbGQgPSBmYXVsdExpc3QuaXRlbShuKS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICAgIGNoaWxkICE9IG51bGw7Ci0gICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICAgICYmICEoY2hpbGQKLSAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbE5hbWUoKQotICAgICAgICAgICAgICAgICAgLmVxdWFsc0lnbm9yZUNhc2UoWE1MVXRpbHMuU09BUF9FTEVNX0ZBVUxUX0NPREUpCi0gICAgICAgICAgICAgICAgICB8fCBjaGlsZC5nZXRMb2NhbE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKAotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5TT0FQX0VMRU1fRkFVTFRfU1RSSU5HKQotICAgICAgICAgICAgICAgICAgfHwgY2hpbGQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgKLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuU09BUF9FTEVNX0ZBVUxUX0FDVE9SKQotICAgICAgICAgICAgICAgICAgfHwgY2hpbGQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgKLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuU09BUF9FTEVNX0ZBVUxUX0RFVEFJTCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gUEI6IFRoaXMgaXMgY2hlY2tlZCBpbiAxMzE2IG5vdwotICAgICAgICAgICAgICAgIC8vfHwgKGNoaWxkLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzA3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2ZGQ2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBCUDEzMDcuCi0gKiBUaGUgZWxlbWVudHMgb2YgdGhlIG1lc3NhZ2UgdGhhdCBhcmUgbmFtZXNwYWNlZCAKLSAqICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgZG8gbm90IGhhdmUgYSBzb2FwOmVuY29kaW5nU3R5bGUgYXR0cmlidXRlLgotICovCi1wdWJsaWMgY2xhc3MgQlAxMzA3IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMzA3KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgRG9jdW1lbnQgZG9jOwotICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgb25lIHdheSByZXNwb25zZQotICAgIC8vIG9yIG1lc3NhZ2UgaXMgbWVwdHkgb3IgaW52YWxpZAotICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkKLSAgICAgIHx8IChkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKSkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gbG9vayBmb3IgPHNvYXA6eHh4PiBlbGVtZW50czoKLSAgICAgIE5vZGVMaXN0IHNvYXBMaXN0ID0KLSAgICAgICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCAiKiIpOwotICAgICAgaWYgKChzb2FwTGlzdCA9PSBudWxsKSB8fCAoc29hcExpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIC8vIFJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gYW55IHNvYXAgZW52ZWxvcGUgZWxlbWVudHMKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gY2hlY2sgdGhhdCBubyA8c29hcDp4eHg+IGVsZW1lbnRzIGNvbnRhaW5zIGEgc29hcDplbmNvZGluZ1N0eWxlIGF0dHJpYnV0ZQotICAgICAgICAvLyBGb3IgZWFjaCA8c29hcDp4eHg+Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBzb2FwTGlzdC5nZXRMZW5ndGgoKTsgbisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgbmV4dEVsZW0gPSAoRWxlbWVudCkgc29hcExpc3QuaXRlbShuKTsKLSAgICAgICAgICAgIGlmIChuZXh0RWxlbQotICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlTm9kZU5TKFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwgImVuY29kaW5nU3R5bGUiKQotICAgICAgICAgICAgICAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBBc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2MwYTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogQlAxMzA4LgotICogVGhlIGNoaWxkcmVuIGVsZW1lbnRzIG9mIHNvYXA6Qm9keSBkbyBub3QgaGF2ZSBhIHNvYXA6ZW5jb2RpbmdTdHlsZSBhdHRyaWJ1dGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDEzMDggZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEzMDgoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0dGluZyBhIG1lc3NhZ2UgZG9jdW1lbnQKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgZW1wdHkgb3IgaW52YWxpZCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBsb29rIGZvciBzb2FwOkJvZHkgZWxlbWVudHM6Ci0gICAgICBOb2RlTGlzdCBzb2FwQm9keUxpc3QgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgRUxFTV9TT0FQX0JPRFkuZ2V0TmFtZXNwYWNlVVJJKCksIEVMRU1fU09BUF9CT0RZLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgLy8gVGhlIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBhbnkgc29hcDpCb2R5LCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoKHNvYXBCb2R5TGlzdCA9PSBudWxsKSB8fCAoc29hcEJvZHlMaXN0LmdldExlbmd0aCgpID09IDApKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBjaGVjayB0aGF0IG5vIHNvYXA6Qm9keSBjaGlsZCBlbGVtZW50cyBjb250YWluIGEgc29hcDplbmNvZGluZ1N0eWxlIGF0dHJpYnV0ZQotICAgICAgLy8gR2V0dGluZyB0aGUgZmlyc3Qgc29hcDpCb2R5IGNoaWxkIGVsZW1lbnQKLSAgICAgIEVsZW1lbnQgY2hpbGQgPQotICAgICAgICBYTUxVdGlscy5nZXRGaXJzdENoaWxkKChFbGVtZW50KSBzb2FwQm9keUxpc3QuaXRlbSgwKSk7Ci0gICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoaWxkLmdldEF0dHJpYnV0ZU5vZGVOUygKLSAgICAgICAgICBFTEVNX1NPQVBfQk9EWS5nZXROYW1lc3BhY2VVUkkoKSwgImVuY29kaW5nU3R5bGUiKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBjaGlsZCBlbGVtZW50IG5hbWUgaXMgXCIiICsKLSAgICAgICAgICAgIGNoaWxkLmdldE5vZGVOYW1lKCkgKyAiXCIuIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0dGluZyB0aGUgbmV4dCBzb2FwOkJvZHkgY2hpbGQgZWxlbWVudAotICAgICAgICBjaGlsZCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKGNoaWxkKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjNiNmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIEJQMTMwOS4KLSAqIFRoZSBzb2FwOkVudmVsb3BlIGRvZXMgbm90IGhhdmUgZGlyZWN0IGNoaWxkcmVuIGFmdGVyIHRoZSBzb2FwOkJvZHkgZWxlbWVudCAKLSAqLwotcHVibGljIGNsYXNzIEJQMTMwOSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTMwOShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIERvY3VtZW50IGRvYzsKLSAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG9uZSB3YXkgcmVzcG9uc2UKLSAgICAvLyBvciBtZXNzYWdlIGlzIG1lcHR5IG9yIGludmFsaWQKLSAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpCi0gICAgICB8fCAoZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIGxvb2sgZm9yIDxzb2FwOkVudmVsb3BlPiBlbGVtZW50czoKLSAgICAgIC8vIChOb3RlOiBzaW5jZSB0aGlzIGlzIGEgU29hcCBtZXNzYWdlIHdlIGV4cGVjdCBleGFjdGx5IG9uZSBzb2FwIGVudmVsb3BlLCBidXQgd2UgZG8gbm90IGFzc3VtZSBpdCkuCi0gICAgICBOb2RlTGlzdCBzb2FwRW52TGlzdCA9Ci0gICAgICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwKLSAgICAgICAgICBYTUxVdGlscy5TT0FQX0VMRU1fRU5WRUxPUEUpOwotICAgICAgaWYgKChzb2FwRW52TGlzdCA9PSBudWxsKSB8fCAoc29hcEVudkxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIC8vIFJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gYW55IHNvYXAgRW52ZWxvcGUgZWxlbWVudChzKQotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBjaGVjayB0aGF0IGlmIGEgPHNvYXA6Qm9keT4gZXhpc3RzIGluIGEgPHNvYXA6RW52ZWxvcGU+LCB0aGF0IGl0cyB0aGUgbGFzdCBpbiB0aGUgZW52ZWxvcGUgICAgICAgIAkJICAgICAgCQkKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBGb3IgZWFjaCA8c29hcDpFbnZlbG9wZT4KLSAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IHNvYXBFbnZMaXN0LmdldExlbmd0aCgpOyBuKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIGFsbCBlbGVtZW50cyBpbiB0aGUgRW52ZWxvcGUgICAgICAgCQkJCQotICAgICAgICAgICAgRWxlbWVudCBzb2FwRW52ID0gKEVsZW1lbnQpIHNvYXBFbnZMaXN0Lml0ZW0obik7Ci0gICAgICAgICAgICBOb2RlTGlzdCBlbnZDaGlsZExpc3QgPSBzb2FwRW52LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgIFZlY3RvciBlbnZDaGlsZEVsZW1MaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgZm9yIChpbnQgdiA9IDA7IHYgPCBlbnZDaGlsZExpc3QuZ2V0TGVuZ3RoKCk7IHYrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTm9kZSBuZXh0Tm9kZSA9IGVudkNoaWxkTGlzdC5pdGVtKHYpOwotICAgICAgICAgICAgICBpZiAobmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVudkNoaWxkRWxlbUxpc3QuYWRkRWxlbWVudCgoRWxlbWVudCkgbmV4dE5vZGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBTZWFyY2ggdGhlIGxpc3QgZm9yIDxzb2FwOkJvZHk+Ci0gICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IGVudkNoaWxkRWxlbUxpc3Quc2l6ZSgpOyBtKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEVsZW1lbnQgZW52Q2hpbGRFbGVtID0gKEVsZW1lbnQpIGVudkNoaWxkRWxlbUxpc3QuZWxlbWVudEF0KG0pOwotICAgICAgICAgICAgICBpZiAoZW52Q2hpbGRFbGVtCi0gICAgICAgICAgICAgICAgLmdldE5hbWVzcGFjZVVSSSgpCi0gICAgICAgICAgICAgICAgLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVApCi0gICAgICAgICAgICAgICAgJiYgZW52Q2hpbGRFbGVtLmdldExvY2FsTmFtZSgpLmVxdWFscyhYTUxVdGlscy5TT0FQX0VMRU1fQk9EWSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBmb3VuZCBhIDxzb2FwOkJvZHk+IHNvIGNoZWNrIGl0cyB0aGUgbGFzdCBpbiB0aGUgbGlzdCBvZiBjaGlsZCBlbGVtZW50cyBvZiB0aGUgRW52ZWxvcGUKLSAgICAgICAgICAgICAgICBpZiAoZW52Q2hpbGRFbGVtICE9IGVudkNoaWxkRWxlbUxpc3QubGFzdEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMxNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NDE4MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzE2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogQlAxMzE2LgotICogVGhlIHNvYXA6RmF1bHQgZWxlbWVudCBjaGlsZHJlbiAoc29hcDpmYXVsdGNvZGUsIHNvYXA6ZmF1bHRzdHJpbmcsIHNvYXA6ZmF1bHRhY3RvciBvciBzb2FwOmRldGFpbCkgYXJlIHVucXVhbGlmaWVkLgotICovCi1wdWJsaWMgY2xhc3MgQlAxMzE2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMzE2KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgRG9jdW1lbnQgZG9jOwotICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgb25lIHdheSByZXNwb25zZQotICAgIC8vIG9yIG1lc3NhZ2UgaXMgbWVwdHkgb3IgaW52YWxpZAotICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkKLSAgICAgIHx8IChkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKSkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gbG9vayBmb3IgPHNvYXA6RmF1bHQ+IGVsZW1lbnQ6Ci0gICAgICBOb2RlTGlzdCBmYXVsdExpc3QgPQotICAgICAgICBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsCi0gICAgICAgICAgWE1MVXRpbHMuU09BUF9FTEVNX0ZBVUxUKTsKLSAgICAgIGlmICgoZmF1bHRMaXN0ID09IG51bGwpIHx8IChmYXVsdExpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIC8vIFJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gYSBzb2FwOmZhdWx0Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIGNoZWNrIHRoYXQgbm8gc29hcDpmYXVsdCBjb250YWlucyBvbmx5IGZhdWx0Y29kZSwgZmF1bHRzdHJpbmcsIGZhdWx0YWN0b3IsIGRldGFpbC4KLSAgICAgICAgLy8gSWYgaXQgZG9lcywgZnVydGhlciBjaGVjayB0aGF0IGl0IGlzIHVucXVhbGlmaWVkLgotICAgICAgICAvLyBGb3IgZWFjaCA8c29hcDpGYXVsdD4KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IGZhdWx0TGlzdC5nZXRMZW5ndGgoKTsgbisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoTm9kZSBjaGlsZCA9IGZhdWx0TGlzdC5pdGVtKG4pLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgICAgY2hpbGQgIT0gbnVsbDsKLSAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgICAgICAgJiYgKGNoaWxkCi0gICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxOYW1lKCkKLSAgICAgICAgICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKFhNTFV0aWxzLlNPQVBfRUxFTV9GQVVMVF9DT0RFKQotICAgICAgICAgICAgICAgICAgfHwgY2hpbGQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgKLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuU09BUF9FTEVNX0ZBVUxUX1NUUklORykKLSAgICAgICAgICAgICAgICAgIHx8IGNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9GQVVMVF9BQ1RPUikKLSAgICAgICAgICAgICAgICAgIHx8IGNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9GQVVMVF9ERVRBSUwpKQotICAgICAgICAgICAgICAgICYmIChjaGlsZC5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMxOC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODA4MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5PcGVyYXRpb25TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVHlwZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0JICogQlAxMzE4Ci0JICogCi0JICogVGhlIGdyYW5kY2hpbGRyZW4gZWxlbWVudHMgb2Ygc29hcDpCb2R5IGRvIG5vdCBoYXZlIGEgc29hcDplbmNvZGluZ1N0eWxlIGF0dHJpYnV0ZS4KLQkgKi8KLXB1YmxpYyBjbGFzcyBCUDEzMTggZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEzMTgoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gUGFyc2UgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgcmVzcG9uc2VEb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLSAgICAgIERvY3VtZW50IHJlcXVlc3REb2MgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdERvY3VtZW50KCk7Ci0KLSAgICAgIC8vIG1lc3NhZ2VzIGFyZSBlbXB0eSBvciBpbnZhbGlkLCBET00gb2JqZWN0cyBhcmUgbnVsbAotICAgICAgaWYgKHJlc3BvbnNlRG9jID09IG51bGwgfHwgcmVxdWVzdERvYyA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vaWYgKGlzRmF1bHQocmVzcG9uc2VEb2MpKQotICAgICAgLy8gIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEdldCBTT0FQQWN0aW9uCi0gICAgICBTdHJpbmcgaGVhZGVycyA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0SFRUUEhlYWRlcnMoKTsKLSAgICAgIFN0cmluZyBhY3Rpb24gPSBudWxsOwotICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkKLSAgICAgICAgYWN0aW9uID0gKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoaGVhZGVycywgIjoiKS5nZXQoIlNPQVBBY3Rpb24iLnRvVXBwZXJDYXNlKCkpOwotCi0gICAgICAvLyBHZXQgdGhlIGJpbmRpbmcgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQgICAgICAgICAgICAgICAgCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXRCaW5kaW5ncygpWzBdOwotCi0gICAgICAvL0NyZWF0ZSB0aGUgdHlwZXMgcmVnaXN0cnkKLSAgICAgIFR5cGVzUmVnaXN0cnkgcmVnaXN0cnkgPQotICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5nZXRXU0RMRG9jdW1lbnQoKS5nZXREZWZpbml0aW9ucygpLAotICAgICAgICAgIHZhbGlkYXRvcik7Ci0KLSAgICAgIC8vIEZpbmQgYW4gb3BlcmF0aW9uIG1hdGNoICAgICAgICAKLSAgICAgIE9wZXJhdGlvblNpZ25hdHVyZS5PcGVyYXRpb25NYXRjaCBtYXRjaCA9Ci0gICAgICAgIE9wZXJhdGlvblNpZ25hdHVyZS5tYXRjaE9wZXJhdGlvbigKLSAgICAgICAgICByZXF1ZXN0RG9jLAotICAgICAgICAgIGFjdGlvbiwKLSAgICAgICAgICBiaW5kaW5nLAotICAgICAgICAgIHJlZ2lzdHJ5KTsKLSAgICAgIGlmIChtYXRjaCA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBHZXQgdGhlIGJpbmRpbmcgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBtYXRjaAotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gbWF0Y2guZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgICAgIC8vIElmIHRoaXMgaXMgbm90IHJwYy1saXRlcmFsLCB0aGVuIHJldHVybiBub3RBcHBsaWNhYmxlIHJlc3VsdAotICAgICAgaWYgKCFXU0RMVXRpbHMKLSAgICAgICAgLmlzUnBjTGl0ZXJhbChtYXRjaC5nZXRPcGVyYXRpb25TdHlsZSgpLCBiaW5kaW5nT3BlcmF0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIC8vIGxvb2sgZm9yIDxzb2FwOkJvZHk+IGVsZW1lbnRzOgotICAgICAgTm9kZUxpc3Qgc29hcEJvZHlMaXN0ID0KLSAgICAgICAgcmVzcG9uc2VEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsCi0gICAgICAgICAgWE1MVXRpbHMuU09BUF9FTEVNX0JPRFkpOwotICAgICAgaWYgKChzb2FwQm9keUxpc3QgPT0gbnVsbCkgfHwgKHNvYXBCb2R5TGlzdC5nZXRMZW5ndGgoKSA9PSAwKSkKLSAgICAgICAgLy8gUmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBhbnkgc29hcCBCb2R5IGVsZW1lbnRzCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIGNoZWNrIHRoYXQgbm8gPHNvYXA6Qm9keT4gY2hpbGQgb3IgZ3JhbmRjaGlsZCBlbGVtZW50cyBjb250YWlucyBhIHNvYXA6ZW5jb2RpbmdTdHlsZSBhdHRyaWJ1dGUKLSAgICAgIC8vIEZvciBlYWNoIDxzb2FwOkJvZHk+Ci0gICAgICBib29sZWFuIGdyYW5kQ2hpbGRGb3VuZCA9IGZhbHNlOwotICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBzb2FwQm9keUxpc3QuZ2V0TGVuZ3RoKCk7IG4rKykKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBuZXh0Qm9keUVsZW0gPSAoRWxlbWVudCkgc29hcEJvZHlMaXN0Lml0ZW0obik7Ci0gICAgICAgIC8vIFJFTU9WRTogVGhpcyB3aWxsIGdldCBhbGwgbm9kZXMgKGNoaWxkLCBncmFuZGNoaWxkcmVuLCBldGMuKQotICAgICAgICAvL05vZGVMaXN0IGNoaWxkTGlzdCA9IG5leHRCb2R5RWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOwotICAgICAgICBOb2RlTGlzdCBjaGlsZExpc3QgPSBuZXh0Qm9keUVsZW0uZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBpZiAoY2hpbGRMaXN0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjaGVjayBhbGwgY2hpbGQgZWxlbWVudHMKLSAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IGNoaWxkTGlzdC5nZXRMZW5ndGgoKTsgbSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaGlsZExpc3QuaXRlbShtKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFbGVtZW50IG5leHRDaGlsZEVsZW0gPSAoRWxlbWVudCkgY2hpbGRMaXN0Lml0ZW0obSk7Ci0gICAgICAgICAgICAgIC8vIGNoZWNrIGNoaWxkcmVuIG9mIHRoaXMgY2hpbGQKLSAgICAgICAgICAgICAgLy8gUkVNT1ZFOiBUaGlzIHdpbGwgZ2V0IGFsbCBub2RlcyAoY2hpbGQsIGdyYW5kY2hpbGRyZW4sIGV0Yy4pCi0gICAgICAgICAgICAgIE5vZGVMaXN0IGdyYW5kQ2hpbGRMaXN0ID0gbmV4dENoaWxkRWxlbS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICAgIGlmIChncmFuZENoaWxkTGlzdCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBncmFuZENoaWxkTGlzdC5nZXRMZW5ndGgoKTsgcCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmIChncmFuZENoaWxkTGlzdC5pdGVtKHApLmdldE5vZGVUeXBlKCkKLSAgICAgICAgICAgICAgICAgICAgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAJZ3JhbmRDaGlsZEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBuZXh0R3JhbmRDaGlsZEVsZW0gPQotICAgICAgICAgICAgICAgICAgICAgIChFbGVtZW50KSBncmFuZENoaWxkTGlzdC5pdGVtKHApOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEdyYW5kQ2hpbGRFbGVtCi0gICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZU5vZGVOUygKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGluZ1N0eWxlIikKLSAgICAgICAgICAgICAgICAgICAgICAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gQXNzZXJ0aW9uIGZhaWxlZCAoQUREIGhpZ2hsaWdodCB0aGUgY2hpbGQgaGVyZSA/KQotICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghZ3JhbmRDaGlsZEZvdW5kKQotICAgICAgewotICAgICAgCXRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDE2MDAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTYwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhjNWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTYwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi0KLS8qKgotICogQlAxNjAwCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIGVudmVsb3BlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBlbnZlbG9wZSBjb25mb3JtcyB0byB0aGUgc3RydWN0dXJlIHNwZWNpZmllZCBpbiBTT0FQIDEuMSBTZWN0aW9uIDQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMTYwMCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTYwMChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIGEgbWVzc2FnZSBkb2N1bWVudAotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGVtcHR5IG9yIGludmFsaWQsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICB7Ci0gICAgICAJaWYgKHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KSkKLSAgICAgIAkJdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgICAgZWxzZSAKLSAgICAgICAgCXRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgbG9nIG1lc3NhZ2UgaXMgZW1wdHkgb3IgaW52YWxpZC4iKTsKLSAgICAgIH0KLSAgICAgIC8vIFNPQVAgMS4xIHNwZWNpZmljYXRpb25zLCBTZWN0aW9uIDQuCi0gICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL05PVEUtU09BUC0yMDAwMDUwOC8jX1RvYzQ3ODM4MzQ5NAotCi0gICAgICAvLyBUaGUgbmFtZXNwYWNlIGlkZW50aWZpZXIgZm9yIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBkZWZpbmVkCi0gICAgICAvLyBpbiB0aGlzIHNlY3Rpb24gaXMgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIi4KLQotICAgICAgLy8gIG8gVGhlIEVudmVsb3BlIGlzIHRoZSB0b3AgZWxlbWVudCBvZiB0aGUgWE1MIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGUgbWVzc2FnZS4KLQotICAgICAgLy8gUnVsZSAxLiBFbnZlbG9wZQotICAgICAgLy8gIG8gVGhlIGVsZW1lbnQgbmFtZSBpcyAiRW52ZWxvcGUiLgotICAgICAgLy8gIG8gVGhlIGVsZW1lbnQgTVVTVCBiZSBwcmVzZW50IGluIGEgU09BUCBtZXNzYWdlCi0gICAgICAvLyAgbyBUaGUgZWxlbWVudCBNQVkgY29udGFpbiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBhdHRyaWJ1dGVzLgotICAgICAgLy8gICAgSWYgcHJlc2VudCwgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgTVVTVCBiZSBuYW1lc3BhY2UtcXVhbGlmaWVkLiBTaW1pbGFybHksCi0gICAgICAvLyAgICB0aGUgZWxlbWVudCBNQVkgY29udGFpbiBhZGRpdGlvbmFsIHN1YiBlbGVtZW50cy4gSWYgcHJlc2VudCB0aGVzZSBlbGVtZW50cwotICAgICAgLy8gICAgTVVTVCBiZSBuYW1lc3BhY2UtcXVhbGlmaWVkIGFuZCBNVVNUIGZvbGxvdyB0aGUgU09BUCBCb2R5IGVsZW1lbnQuCi0KLSAgICAgIC8vIEdldHRpbmcgdGhlIHRvcCBlbGVtZW50Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhlIHRvcCBlbGVtZW50IHNob3VsZCBiZSBzb2FwOkVudmVsb3BlCi0gICAgICAvLyBJZiBub3QsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICBpZiAoIWVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhNTFV0aWxzLlNPQVBfRUxFTV9FTlZFTE9QRSkKLSAgICAgICAgfHwgIWlzU09BUE5hbWVzcGFjZShlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSB0b3AgZWxlbWVudCBpcyBub3Qgc29hcDpFbnZlbG9wZSIpOwotCi0gICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucwotICAgICAgQ29sbGVjdGlvbiBlbnZlbG9wZU5hbWVzcGFjZXMgPSBjb2xsZWN0TmFtZXNwYWNlcyhlbGVtZW50LmdldEF0dHJpYnV0ZXMoKSk7Ci0gICAgICBlbnZlbG9wZU5hbWVzcGFjZXMuYWRkKFdTSUNvbnN0YW50cy5OU19VUklfWE1MTlMpOwotCi0gICAgICAvLyBHZXR0aW5nIGFuIGF0dHJpYnV0ZSB0aGF0IGlzIG5vdCBpbiBhbnkgb2YgdGhlIG5hbWVzcGFjZXMKLSAgICAgIEF0dHIgbm90VmFsaWRBdHRyID0gZ2V0Tm90VmFsaWRBdHRyKAotICAgICAgICBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKSwKLSAgICAgICAgZW52ZWxvcGVOYW1lc3BhY2VzKTsKLQotICAgICAgLy8gSWYgZm91bmQgb25lLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgaWYgKG5vdFZhbGlkQXR0ciAhPSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGF0dHJpYnV0ZSAiCi0gICAgICAgICAgKyBub3RWYWxpZEF0dHIuZ2V0Tm9kZU5hbWUoKSArICIgaXMgbm90IG5hbWVzcGFjZS1xdWFsaWZpZWQiKTsKLQotCi0gICAgICAvLyBSdWxlIDIuIEhlYWRlciAKLSAgICAgIC8vICBvIFRoZSBlbGVtZW50IG5hbWUgaXMgIkhlYWRlciIuCi0gICAgICAvLyAgbyBUaGUgZWxlbWVudCBNQVkgYmUgcHJlc2VudCBpbiBhIFNPQVAgbWVzc2FnZS4gSWYgcHJlc2VudCwgdGhlIGVsZW1lbnQKLSAgICAgIC8vICAgIE1VU1QgYmUgdGhlIGZpcnN0IGltbWVkaWF0ZSBjaGlsZCBlbGVtZW50IG9mIGEgU09BUCBFbnZlbG9wZSBlbGVtZW50LgotICAgICAgLy8gIG8gVGhlIGVsZW1lbnQgTUFZIGNvbnRhaW4gYSBzZXQgb2YgaGVhZGVyIGVudHJpZXMgZWFjaCBiZWluZyBhbiBpbW1lZGlhdGUKLSAgICAgIC8vICAgIGNoaWxkIGVsZW1lbnQgb2YgdGhlIFNPQVAgSGVhZGVyIGVsZW1lbnQuIEFsbCBpbW1lZGlhdGUgY2hpbGQgZWxlbWVudHMKLSAgICAgIC8vICAgIG9mIHRoZSBTT0FQIEhlYWRlciBlbGVtZW50IE1VU1QgYmUgbmFtZXNwYWNlLXF1YWxpZmllZC4KLQotICAgICAgLy8gR2V0dGluZyB0aGUgZmlyc3Qgc3ViIGVsZW1lbnQgb2YgdGhlIGVudmVsb3BlCi0gICAgICBlbGVtZW50ID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChlbGVtZW50KTsKLQotICAgICAgLy8gSWYgdGhlIGNoaWxkIGlzIHNvYXA6SGVhZGVyCi0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsCi0gICAgICAgICYmIGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhNTFV0aWxzLlNPQVBfRUxFTV9IRUFERVIpCi0gICAgICAgICYmIGlzU09BUE5hbWVzcGFjZShlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgIHsKLQotICAgICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgSGVhZGVyIGVudHJpZXMKLSAgICAgICAgRWxlbWVudCBoZWFkZXJFbnRyeSA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbWVudCk7Ci0gICAgICAgIHdoaWxlIChoZWFkZXJFbnRyeSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG5hbWVzcGFjZXMgZm9yIHRoZSBjdXJyZW50IGVudHJ5Ci0gICAgICAgICAgQ29sbGVjdGlvbiBoZWFkZXJFbnRyeU5hbWVzcGFjZXMgPSBjb2xsZWN0TmFtZXNwYWNlcygKLSAgICAgICAgICAgIGhlYWRlckVudHJ5LmdldEF0dHJpYnV0ZXMoKSk7Ci0KLSAgICAgICAgICAvLyBJZiB0aGUgZW50cnkgaXMgbm90IGluIHRoZSBuYW1lc3BhY2VzLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmICghZW52ZWxvcGVOYW1lc3BhY2VzLmNvbnRhaW5zKGhlYWRlckVudHJ5LmdldE5hbWVzcGFjZVVSSSgpKQotICAgICAgICAgICAgJiYgIWhlYWRlckVudHJ5TmFtZXNwYWNlcy5jb250YWlucyhoZWFkZXJFbnRyeS5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGhlYWRlciBlbnRyeSAiCi0gICAgICAgICAgICAgICsgaGVhZGVyRW50cnkuZ2V0Tm9kZU5hbWUoKSArICIgaXMgbm90IG5hbWVzcGFjZS1xdWFsaWZpZWQiKTsKLQotICAgICAgICAgIC8vIEdldHRpbmcgdGhlIG5leHQgSGVhZGVyIGVudHJ5Ci0gICAgICAgICAgaGVhZGVyRW50cnkgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhoZWFkZXJFbnRyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXR0aW5nIHRoZSBuZXh0IHN1YiBlbGVtZW50IG9mIHRoZSBlbnZlbG9wZQotICAgICAgICBlbGVtZW50ID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0KLQotICAgICAgLy8gUnVsZSAzLiBCb2R5Ci0gICAgICAvLyAgbyBUaGUgZWxlbWVudCBuYW1lIGlzICJCb2R5Ii4KLSAgICAgIC8vICBvIFRoZSBlbGVtZW50IE1VU1QgYmUgcHJlc2VudCBpbiBhIFNPQVAgbWVzc2FnZSBhbmQgTVVTVCBiZSBhbiBpbW1lZGlhdGUKLSAgICAgIC8vICAgIGNoaWxkIGVsZW1lbnQgb2YgYSBTT0FQIEVudmVsb3BlIGVsZW1lbnQuIEl0IE1VU1QgZGlyZWN0bHkgZm9sbG93IHRoZQotICAgICAgLy8gICAgU09BUCBIZWFkZXIgZWxlbWVudCBpZiBwcmVzZW50LiBPdGhlcndpc2UgaXQgTVVTVCBiZSB0aGUgZmlyc3QgaW1tZWRpYXRlCi0gICAgICAvLyAgICBjaGlsZCBlbGVtZW50IG9mIHRoZSBTT0FQIEVudmVsb3BlIGVsZW1lbnQuCi0gICAgICAvLyAgbyBUaGUgZWxlbWVudCBNQVkgY29udGFpbiBhIHNldCBvZiBib2R5IGVudHJpZXMgZWFjaCBiZWluZyBhbiBpbW1lZGlhdGUKLSAgICAgIC8vICAgIGNoaWxkIGVsZW1lbnQgb2YgdGhlIFNPQVAgQm9keSBlbGVtZW50LiBJbW1lZGlhdGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlCi0gICAgICAvLyAgICBTT0FQIEJvZHkgZWxlbWVudCBNQVkgYmUgbmFtZXNwYWNlLXF1YWxpZmllZC4gU09BUCBkZWZpbmVzIHRoZSBTT0FQIEZhdWx0Ci0gICAgICAvLyAgICBlbGVtZW50LCB3aGljaCBpcyB1c2VkIHRvIGluZGljYXRlIGVycm9yIG1lc3NhZ2VzLgotCi0gICAgICAvLyBpZiB0aGUgU09BUCBCb2R5IGVsZW1lbnQgaXMgbm90IHByZXNlbnRlZCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgIGlmIChlbGVtZW50ID09IG51bGwKLSAgICAgICAgfHwgIWVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhNTFV0aWxzLlNPQVBfRUxFTV9CT0RZKQotICAgICAgICB8fCAhaXNTT0FQTmFtZXNwYWNlKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIHNvYXA6Qm9keSBlbGVtZW50IGlzIG5vdCBwcmVzZW50ZWQgIgotICAgICAgICAgICsgIm9yIGZvbGxvd3MgYW4gYWRkaXRpb25hbCBzdWIgZWxlbWVudCBvZiBzb2FwOkVudmVsb3BlIik7Ci0KLSAgICAgIC8vIFByb2Nlc3NpbmcgYWxsIG90aGVyIHN1YiBlbGVtZW50cyBvZiB0aGUgZW52ZWxvcGUKLSAgICAgIGVsZW1lbnQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhlbGVtZW50KTsKLSAgICAgIHdoaWxlIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIENoZWNraW5nIGZvciB0aGUgU09BUCBIZWFkZXIgZWxlbWVudAotICAgICAgICBpZiAoZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWE1MVXRpbHMuU09BUF9FTEVNX0hFQURFUikKLSAgICAgICAgICAmJiBpc1NPQVBOYW1lc3BhY2UoZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgIlRoZSBzb2FwOkhlYWRlciBlbGVtZW50IGNhbm5vdCBmb2xsb3cgdGhlIHNvYXA6Qm9keSBlbGVtZW50Iik7Ci0KLSAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG5hbWVzcGFjZXMgZm9yIHRoZSBjdXJyZW50IGVsZW1lbnQKLSAgICAgICAgQ29sbGVjdGlvbiBlbGVtZW50TmFtZXNwYWNlcyA9IGNvbGxlY3ROYW1lc3BhY2VzKAotICAgICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpKTsKLQotICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIG5hbWVzcGFjZXMsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgIGlmICghZW52ZWxvcGVOYW1lc3BhY2VzLmNvbnRhaW5zKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpCi0gICAgICAgICAgJiYgIWVsZW1lbnROYW1lc3BhY2VzLmNvbnRhaW5zKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgc3ViIGVudmVsb3BlIGVsZW1lbnQgIgotICAgICAgICAgICAgKyBlbGVtZW50LmdldE5vZGVOYW1lKCkgKyAiIGlzIG5vdCBuYW1lc3BhY2UtcXVhbGlmaWVkIik7Ci0KLSAgICAgICAgLy8gR2V0dGluZyB0aGUgbmV4dCBzdWIgZWxlbWVudCBvZiB0aGUgZW52ZWxvcGUKLSAgICAgICAgZWxlbWVudCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLQl7Ci0JICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotCX0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgZnJvbSBhdHRyaWJ1dGVzIGNvbGxlY3Rpb24KLSAgICogQHBhcmFtIGF0dHJzIGFuIGF0dHJpYnV0ZXMgY29sbGVjdGlvbgotICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBuYW1lc3BhY2VzCi0gICAqLwotICBwcml2YXRlIENvbGxlY3Rpb24gY29sbGVjdE5hbWVzcGFjZXMoTmFtZWROb2RlTWFwIGF0dHJzKQotICB7Ci0gICAgQ29sbGVjdGlvbiBucyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgaWYgKGF0dHJzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBhdHRycy5pdGVtKGkpOwotICAgICAgICBpZiAoYXR0ci5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsCi0gICAgICAgICAgJiYgYXR0ci5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9YTUxOUykpCi0gICAgICAgICAgbnMuYWRkKGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5zOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHJpZXZlcyBhbiBhdHRyaWJ1dGUgdGhhdCBpcyBub3QgaW4gbmFtZXNwYWNlcwotICAgKiBAcGFyYW0gYXR0cnMgYW4gYXR0cmlidXRlcyBjb2xsZWN0aW9uCi0gICAqIEBwYXJhbSBucyBhIG5hbWVzcGFjZXMgY29sbGVjdGlvbgotICAgKiBAcmV0dXJuIGFuIGF0dHJpYnR1ZSB0aGF0IGlzIG5vdCBpbiBhbnkgb2YgdGhlIG5hbWVzcGFjZXMgc3BlY2lmaWVkCi0gICAqLwotICBwcml2YXRlIEF0dHIgZ2V0Tm90VmFsaWRBdHRyKE5hbWVkTm9kZU1hcCBhdHRycywgQ29sbGVjdGlvbiBucykKLSAgewotICAgIEF0dHIgcmV0ID0gbnVsbDsKLSAgICBpZiAoYXR0cnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0gICAgICAgIGlmIChhdHRyLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwKLSAgICAgICAgICB8fCAhbnMuY29udGFpbnMoYXR0ci5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXQgPSBhdHRyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICAvKioKLSAgICogUXVhbGlmaWVzIHdoZXRoZXIgYSBuYW1lc3BhY2UgaXMgdGhlIFNPQVAgbmFtZXNwYWNlCi0gICAqICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICogQHBhcmFtIG5zIGEgbmFtZXNwYWNlIHRvIGJlIHF1YWxpZmllZAotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWVzcGFjZSBpcyBxdWFsaWZpZWQsIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzU09BUE5hbWVzcGFjZShTdHJpbmcgbnMpCi0gIHsKLSAgICBpZiAobnMgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiBucy5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTYwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxNjAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZTdjNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxNjAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBCUDE2MDEuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDE2MDEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDE2MDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gT25lLXdheSByZXNwb25zZXMgd2lsbCBub3QgY29udGFpbiBhIFNPQVAgbWVzc2FnZQotICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBUcnkgdG8gcGFyc2UgdGhlIFNPQVAgbWVzc2FnZQotICAgICAgICAvL0RvY3VtZW50IGRvYyA9IFhNTFV0aWxzLnBhcnNlWE1MKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICBYTUxVdGlscy5wYXJzZVhNTChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChXU0lFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBTQVhFeGNlcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxNzAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDE3MDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiOTQ1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDE3MDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UZXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET00yV3JpdGVyOwotCi0KLS8qKgotICogQlAxNzAxLgotICovCi1wdWJsaWMgY2xhc3MgQlAxNzAxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxNzAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBURU1QOiBVc2UgbG9jYWwgY29weSBvZiBzY2hlbWEgZm9yIG5vdwotICAgICAgICAvLyBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5wYXJzZVhNTChlbnRyeUNvbnRleHQuZ2V0TG9nRW50cnkoKS5nZXRNZXNzYWdlKCksIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCk7Ci0gICAgICAgIC8vIERvY3VtZW50IGRvYyA9IFhNTFV0aWxzLnBhcnNlWE1MKGVudHJ5Q29udGV4dC5nZXRMb2dFbnRyeSgpLmdldE1lc3NhZ2UoKSwgInNjaGVtYXMvc29hcEVudmVsb3BlLnhzZCIpOwotCi0gICAgICAgIC8vIEdldCBhIG5vbi12YWxpZGF0ZWQgYnV0ICh3ZWxsLWZvcm1lZCkgRE9NIHRyZWUgb2YgdGhlIG1lc3NhZ2UgY29udGVudAotICAgICAgICBEb2N1bWVudCBkb2MgPQotICAgICAgICAgIFhNTFV0aWxzLnBhcnNlWE1MKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbnkgeHNpOnR5cGVzIGF0dHJpYnV0ZXMgZnJvbSB0aGUgbWVzc2FnZSAoU09BUCBIZWFkZXIsIEJvZHkgYW5kIEVudmVsb3BlIGl0c2VsZikKLQotICAgICAgICBOb2RlTGlzdCBlbGVtZW50TGlzdCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOwotICAgICAgICBpZiAoZWxlbWVudExpc3QgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudExpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgZWxlbWVudExpc3QuaXRlbShpKTsKLSAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9YU0ksICJ0eXBlIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSAocG90ZW50aWFsbHkpIG1vZGlmaWVkIHRyZWUgdG8gU3RyaW5nCi0gICAgICAgIFN0cmluZyBmaWx0ZXJlZE1lc3NhZ2UgPSBET00yV3JpdGVyLm5vZGVUb1N0cmluZyhkb2MpOwotCi0gICAgICAgIC8vIFBhcnNlIHRoZSByZXN1bHQgd2l0aCB2YWxpZGF0aW9uICJvbiIKLSAgICAgICAgRG9jdW1lbnQgdmFsaWRhdGlvbkRvYyA9Ci0gICAgICAgICAgWE1MVXRpbHMucGFyc2VYTUwoCi0gICAgICAgICAgICBmaWx0ZXJlZE1lc3NhZ2UsCi0gICAgICAgICAgICBUZXN0VXRpbHMuZ2V0U09BUFNjaGVtYUxvY2F0aW9uKCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFdTSUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIFNBWEV4Y2VwdGlvbikKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgVXRpbHMuZ2V0RXhjZXB0aW9uRGV0YWlscyhlLmdldFRhcmdldEV4Y2VwdGlvbigpKSwKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChVdGlscy5nZXRFeGNlcHRpb25EZXRhaWxzKGUpLCBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTc1NS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxNzU1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiODNlZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxNzU1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQlAxNzU1Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG5vbi1mYXVsdCBlbnZlbG9wZSBjb250YWluaW5nIGEgc29hcDpib2R5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQsIGFuZCB0aGF0IGlzIHJlZmVycmVkIGJ5IGEgYmluZGluZyBzdHlsZSBSUEMtbGl0ZXJhbDwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5FYWNoIHBhcnQgYWNjZXNzb3IgZWxlbWVudCBpbiB0aGUgZW52ZWxvcGUgaGFzIGEgbG9jYWwgbmFtZSBvZiB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgbmFtZSBhdHRyaWJ1dGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgd3NkbDpwYXJ0IGVsZW1lbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMTc1NSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgewotCi0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDE3NTUoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSBtZXNzYWdlIGRvY3VtZW50Ci0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgICAgRWxlbWVudCBzb2FwT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgIC8vIElmIHRoZXJlIGlzIGEgRmF1bHQgZW50cnkgb3Igbm8gYm9keSBlbnRyaWVzLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKHZhbGlkYXRvci5pc0ZhdWx0KGRvYykKLSAgICAgICAgfHwgKHNvYXBPcGVyYXRpb24gPSB2YWxpZGF0b3IuZ2V0U29hcEJvZHlDaGlsZChkb2MpKSA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBDcmVhdGluZyBhIHF1YWxpZmllZCBuYW1lIG9mIHBvdGVudGlhbCBTT0FQIG9wZXJhdGlvbgotICAgICAgUU5hbWUgb3BlcmF0aW9uUU5hbWUgPSBuZXcgUU5hbWUoCi0gICAgICAgIHNvYXBPcGVyYXRpb24uZ2V0TmFtZXNwYWNlVVJJKCksIHNvYXBPcGVyYXRpb24uZ2V0TG9jYWxOYW1lKCkpOwotCi0gICAgICAvLyBSZXRyaWV2aW5nIGFsbCB0aGUgUlBDIGJpbmRpbmcgb3BlcmF0aW9ucyBmcm9tIHdzZGw6YmluZGluZwotICAgICAgQmluZGluZ09wZXJhdGlvbltdIHJwY0JpbmRpbmdPcGVyYXRpb25zID0KLSAgICAgICAgdmFsaWRhdG9yLmdldE1hdGNoaW5nQmluZGluZ09wcygKLSAgICAgICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDLAotICAgICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKCkpOwotCi0gICAgICAvLyBSZXRyaWV2aW5nIGJpbmRpbmcgb3BlcmF0aW9uIGJ5IGdpdmVuIG9wZXJhdGlvbiBuYW1lCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSB2YWxpZGF0b3IuZ2V0T3BlcmF0aW9uTWF0Y2goCi0gICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLAotICAgICAgICBvcGVyYXRpb25RTmFtZSwKLSAgICAgICAgcnBjQmluZGluZ09wZXJhdGlvbnMpOwotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyBtYXRjaGVkIG9wZXJhdGlvbiwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gRmluZGluZyBvcGVyYXRpb24gbWVzc2FnZSBwYXJ0cyBhbmQgZXh0ZW5zaWJpbGl0eSBlbGVtcwotICAgICAgLy8gaW4gdGhlIGJpbmRpbmcgZGVwZW5kaW5nIG9uIG1lc3NhZ2UgdHlwZQotICAgICAgTGlzdCBvcGVyYXRpb25NZXNzYWdlUGFydHMgPSBudWxsOwotICAgICAgTGlzdCBleHRFbGVtcyA9IG51bGw7Ci0gICAgICBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldFR5cGUoKS5lcXVhbHMoCi0gICAgICAgIE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QpKQotICAgICAgewotICAgICAgICBvcGVyYXRpb25NZXNzYWdlUGFydHMgPSBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpCi0gICAgICAgICAgLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpLmdldE9yZGVyZWRQYXJ0cyhudWxsKTsKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkgIT0gbnVsbCkKLSAgICAgICAgICBleHRFbGVtcyA9Ci0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvcGVyYXRpb25NZXNzYWdlUGFydHMgPSBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpCi0gICAgICAgICAgLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKS5nZXRPcmRlcmVkUGFydHMobnVsbCk7Ci0gICAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSAhPSBudWxsKQotICAgICAgICAgIGV4dEVsZW1zID0KLSAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGUgbWVzc2FnZSBpcyBub3QgbGl0ZXJhbCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCF2YWxpZGF0b3IuaXNMaXRlcmFsKGV4dEVsZW1zKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotCi0gICAgICAvKiBCYXNpYyBQcm9maWxlIFZlcnNpb24gMS4xIChodHRwOi8vd3d3LndzLWkub3JnL1Byb2ZpbGVzL0Jhc2ljLzIwMDMtMTIvQmFzaWNQcm9maWxlLTEuMS5odG0pCi0gICAgICAgKiBzYXlzIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc29hcDpib2R5IG9mIGFuIEVOVkVMT1BFIE1VU1QgYmUKLSAgICAgICAqIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIHdzZGw6cGFydHMgaW4gdGhlIHdzZGw6bWVzc2FnZSB0aGF0IGRlc2NyaWJlcyBpdC4KLSAgICAgICAqIEhvd2V2ZXIsIHdlIHNob3VsZCBrZWVwIGluIG1pbmQgdGhlcmUgaXMgdGhlICJwYXJ0cyIgYXR0cmlidXRlIG9mIHNvYXBiaW5kOmJvZHkKLSAgICAgICAqIHRoYXQgaW5kaWNhdGVzIHdoaWNoIHBhcnRzIGFwcGVhciB3aXRoaW4gdGhlIFNPQVAgQm9keS4gCi0gICAgICAgKi8KLQotICAgICAgLy8gR2V0dGluZyB0aGUgb3JkZXJlZCBsaXN0IG9mIHdzZGw6cGFydCBuYW1lcwotICAgICAgTGlzdCBvcmRlcmVkUGFydE5hbWVzID0KLSAgICAgICAgdmFsaWRhdG9yLm9yZGVyUGFydE5hbWVzKG9wZXJhdGlvbk1lc3NhZ2VQYXJ0cywgZXh0RWxlbXMpOwotICAgICAgSXRlcmF0b3IgaSA9IG9yZGVyZWRQYXJ0TmFtZXMuaXRlcmF0b3IoKTsKLSAgICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IGFjY2Vzc29yCi0gICAgICBFbGVtZW50IGFjY2Vzc29yID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChzb2FwT3BlcmF0aW9uKTsKLSAgICAgIHdoaWxlIChhY2Nlc3NvciAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyB0aGUgY29ycmVzcG9uZGluZyB3c2RsOnBhcnQgZWxlbWVudAotICAgICAgICAvLyBmb3IgYW4gYWNjZXNzb3IsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgIGlmICghaS5oYXNOZXh0KCkpCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAiVGhlIHBhcnQgYWNjZXNzb3IgZWxlbWVudCAnIiArIGFjY2Vzc29yLmdldExvY2FsTmFtZSgpCi0gICAgICAgICAgICArICInIGRvZXMgbm90IGhhdmUgdGhlIGNvcnJlc3BvbmRpbmcgd3NkbDpwYXJ0IGVsZW1lbnQuIik7Ci0KLSAgICAgICAgLy8gSWYgbG9jYWwgbmFtZSBvZiBhY2Nlc3NvciBkb2VzIG5vdCBlcXVhbCB0byB0aGUgbmFtZSBvZiB0aGUKLSAgICAgICAgLy8gY29ycmVzcG9uZGluZyB3c2RsOnBhcnQgZWxlbWVudCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgIGlmICghYWNjZXNzb3IuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKHBhcnROYW1lKSkKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICJUaGUgYWNjZXNzb3IgbG9jYWwgbmFtZSBpcyAiICsgYWNjZXNzb3IuZ2V0TG9jYWxOYW1lKCkKLSAgICAgICAgICAgICsgIiwgdGhlIGNvcnJlc3BvbmRpbmcgcGFydCBlbGVtZW50IG5hbWUgaXMgIiArIHBhcnROYW1lKTsKLQotICAgICAgICAvLyBHZXR0aW5nIHRoZSBuZXh0IGFjY2Vzc29yCi0gICAgICAgIGFjY2Vzc29yID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoYWNjZXNzb3IpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDQxMDAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQNDEwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTA5YzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQNDEwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvblBhc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotCi0vKioKLSAqIEJQNDEwMAotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIGVudmVsb3BlIGNvbnRhaW5pbmcgYSBoZWFkZXIgYmxvY2sgdGhhdCBpcyBlaXRoZXIgbWFuZGF0b3J5IG9yIGlzIG5vdCBkZXNjcmliZWQgaW4gdGhlIHdzZGw6YmluZGluZy48L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+QW4gZW52ZWxvcGUgY29udGFpbnMgYSBoZWFkZXIgYmxvY2sgdGhhdCBpcyBlaXRoZXIgbWFuZGF0b3J5IG9yIGlzIG5vdCBkZXNjcmliZWQgaW4gdGhlIHdzZGw6YmluZGluZy48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlA0MTAwIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQNDEwMChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBQYXJzaW5nIHRoZSBtZXNzYWdlCi0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgZW1wdHkgb3IgaW52YWxpZCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBHZXR0aW5nIGhlYWRlciBlbGVtZW50cyBmcm9tIGVudmVsb3BlCi0gICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICBOb2RlTGlzdCBoZWFkZXJMaXN0ID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsIFhNTFV0aWxzLlNPQVBfRUxFTV9IRUFERVIpOwotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyBoZWFkZXIsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChoZWFkZXJMaXN0ID09IG51bGwgfHwgaGVhZGVyTGlzdC5nZXRMZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBHZXR0aW5nIHRoZSBoZWFkZXIgZWxlbWVudAotICAgICAgTm9kZSBoZWFkZXIgPSBoZWFkZXJMaXN0Lml0ZW0oMCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgdGhlIGltbWVkaWF0ZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgaGVhZGVyCi0gICAgICBOb2RlTGlzdCBlbGVtcyA9IGhlYWRlci5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBjaGlsZCBlbGVtZW50cyBvZiB0aGUgaGVhZGVyCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoZWxlbXMgPT0gbnVsbCB8fCBlbGVtcy5nZXRMZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBXYWxraW5nIHRocm91Z2ggY2hpbGQgZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLQotICAgICAgICBpZiAoZWxlbXMuaXRlbShpKS5oYXNBdHRyaWJ1dGVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUKLSAgICAgICAgICBOb2RlIG11Tm9kZSA9IGVsZW1zLml0ZW0oaSkuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgKLSAgICAgICAgICAgIHJvb3QuZ2V0UHJlZml4KCkgKyAiOiIgKyBYTUxVdGlscy5TT0FQX0FUVFJfTVVTVF9VTkRFUlNUQU5EKTsKLSAgICAgICAgICAvLyBJZiBhIGhlYWRlciBibG9jayBpcyBtYW5kYXRvcnksIHRoZW4gdGhlIGFzc2VydGlvbiBwYXNzZWQKLSAgICAgICAgICBpZiAobXVOb2RlICE9IG51bGwgJiYgbXVOb2RlLmdldE5vZGVWYWx1ZSgpLmVxdWFscygiMSIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0dGluZyBoZWFkZXIgYmxvY2sgbmFtZQotICAgICAgICBTdHJpbmcgYmxvY2tOYW1lID0gZWxlbXMuaXRlbShpKS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgLy8gSWYgdGhlIG5hbWUgaXMgbm90IHByZXNlbnRlZCAob2NjdXJzIHdoZW4gZWxlbWVudCBpcyBlbXB0eSBzdHJpbmcpCi0gICAgICAgIC8vIHRoZW4gY29udGludWUgd2l0aCB0aGUgbmV4dCBlbGVtZW50Ci0gICAgICAgIGlmIChibG9ja05hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBibG9ja05hbWVFeGlzdHMgPSBmYWxzZTsKLQotICAgICAgICAvLyBHZXR0aW5nIFdTREwgYmluZGluZ3MKLSAgICAgICAgQmluZGluZ1tdIGJpbmRpbmdzID0gdmFsaWRhdG9yLmdldFdTRExEb2N1bWVudCgpLmdldEJpbmRpbmdzKCk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYmluZGluZ3MubGVuZ3RoOyBqKyspIAotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0dGluZyB3c2RsOm9wZXJhdGlvbnMKLSAgICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBiaW5kaW5nc1tqXS5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgICAgICAgIEl0ZXJhdG9yIGsgPSBvcGVyYXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGsuaGFzTmV4dCgpICYmICFibG9ja05hbWVFeGlzdHMpCi0gICAgICAgICAgewotICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgay5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSByZXF1ZXN0IG1lc3NhZ2UsCi0gICAgICAgICAgICAvLyB0aGVuIGdldHRpbmcgd3NkbDppbnB1dCBmb3IgYW4gb3BlcmF0aW9uIAotICAgICAgICAgICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQmluZGluZ0lucHV0IG9wSW5wdXQgPSBvcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgICAgICAgIGlmIChvcElucHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3c2RsOmlucHV0IGlzIHByZXNlbnRlZCB0aGVuIGNoZWNraW5nCi0gICAgICAgICAgICAgICAgLy8gd2hldGhlciB0aGUgYmxvY2sgbmFtZSBpcyBkZXNjcmliZWQgdGhlcmUgb3Igbm90Ci0gICAgICAgICAgICAgICAgYmxvY2tOYW1lRXhpc3RzID0gYmxvY2tOYW1lRXhpc3RzKAotICAgICAgICAgICAgICAgICAgb3BJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgYmxvY2tOYW1lKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHJlc3BvbnNlIG1lc3NhZ2UsCi0gICAgICAgICAgICAvLyB0aGVuIGdldHRpbmcgd3NkbDpvdXRwdXQgZm9yIGFuIG9wZXJhdGlvbgotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBCaW5kaW5nT3V0cHV0IG9wT3V0cHV0ID0gb3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLSAgICAgICAgICAgICAgaWYgKG9wT3V0cHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3c2RsOm91dHB1dCBpcyBwcmVzZW50ZWQgdGhlbiBjaGVja2luZwotICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIGJsb2NrIG5hbWUgaXMgZGVzY3JpYmVkIHRoZXJlIG9yIG5vdAotICAgICAgICAgICAgICAgIGJsb2NrTmFtZUV4aXN0cyA9IGJsb2NrTmFtZUV4aXN0cygKLSAgICAgICAgICAgICAgICAgIG9wT3V0cHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLCBibG9ja05hbWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgYSBoZWFkZXIgYmxvY2sgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgYXBwcm9wcmlhdGUgd3NkbDpiaW5kaW5nCi0gICAgICAgIC8vIHRoZW4gdGhlIGFzc2VydGlvbiBwYXNzZWQKLSAgICAgICAgaWYgKCFibG9ja05hbWVFeGlzdHMpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIE5vIG9uZSBoZWFkZXIgYmxvY2sgaXMgZWl0aGVyIG1hbmRhdG9yeSBvciBpcyBub3QgZGVzY3JpYmVkIGluIHRoZQotICAgICAgLy8gYXBwcm9wcmlhdGUgd3NkbDpiaW5kaW5nLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotCi0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGFwZSkKLSAgICB7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RGV0YWlsRGVzY3JpcHRpb24oKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgdGhlIGV4aXN0ZW5zZSBvZiBibG9ja05hbWUgaW4gd3NkbHNvYXA6aGVhZGVyLCBpZiBpdCBpcyBmb3VuZCBpbgotICAgKiBhIGxpc3Qgb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0cwotICAgKiAKLSAgICogQHBhcmFtIGVsZW1zIEEgbGlzdCBvZiBFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3RzCi0gICAqIEBwYXJhbSBibG9ja05hbWUgVGhlIG5hbWUgdGhhdCB3aWxsIGJlIGNoZWNrZWQgZm9yIGV4aXN0ZW5jZQotICAgKiBAcmV0dXJuIHRydWUgaWYgYmxvY2tOYW1lIGlzIGRlc2NyaWJlZCBpbiB0aGUgd3NkbHNvYXA6aGVhZGVyIGV4dGVuc2liaWxpdHkgZWxlbWVudAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGJsb2NrTmFtZUV4aXN0cyhMaXN0IGVsZW1zLCBTdHJpbmcgYmxvY2tOYW1lKQotICB7Ci0gICAgaWYgKGVsZW1zID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEl0ZXJhdG9yIGkgPSBlbGVtcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlbGVtID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgIFN0cmluZyBlbGVtTmFtZSA9IGVsZW0uZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgIGlmIChlbGVtTmFtZS5lcXVhbHMoImhlYWRlciIpKQotICAgICAgewotICAgICAgICBTT0FQSGVhZGVyIHNvYXBIZWFkZXIgPSAoU09BUEhlYWRlcikgZWxlbTsKLSAgICAgICAgaWYgKHNvYXBIZWFkZXIuZ2V0UGFydCgpLmVxdWFscyhibG9ja05hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDQxMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQNDEwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmQ5M2YzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQNDEwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25QYXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBCUDQxMDEKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBlbnZlbG9wZSBjb250YWluaW5nIGEgc29hcDphY3RvciBhdHRyaWJ1dGUgd2l0aCBhIHZhbHVlIG90aGVyIHRoYW4gdGhlIHNwZWNpYWwgdXJpICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiLjwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BIGhlYWRlciBlbGVtZW50IGluIHRoZSBlbnZlbG9wZSBjb250YWlucyBhIHNvYXA6YWN0b3IgYXR0cmlidXRlIHdpdGggYSB2YWx1ZSBvdGhlciB0aGFuIHRoZSBzcGVjaWFsIHVyaSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9hY3Rvci9uZXh0Ii48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlA0MTAxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQNDEwMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkgewotCi0gICAgICAvLyBQYXJzaW5nIHRoZSBtZXNzYWdlCi0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgZW1wdHkgb3IgaW52YWxpZCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBHZXR0aW5nIGhlYWRlciBlbGVtZW50cyBmcm9tIGVudmVsb3BlCi0gICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICBOb2RlTGlzdCBoZWFkZXJMaXN0ID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsIFhNTFV0aWxzLlNPQVBfRUxFTV9IRUFERVIpOwotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyBoZWFkZXIsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChoZWFkZXJMaXN0ID09IG51bGwgfHwgaGVhZGVyTGlzdC5nZXRMZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBHZXR0aW5nIHRoZSBoZWFkZXIgZWxlbWVudAotICAgICAgTm9kZSBoZWFkZXIgPSBoZWFkZXJMaXN0Lml0ZW0oMCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgdGhlIGltbWVkaWF0ZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgaGVhZGVyCi0gICAgICBOb2RlTGlzdCBlbGVtcyA9IGhlYWRlci5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBoZWFkZXIKLSAgICAgIC8vIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChlbGVtcyA9PSBudWxsIHx8IGVsZW1zLmdldExlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdhbGtpbmcgdGhyb3VnaCBjaGlsZCBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtcy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICAvLyBHZXR0aW5nIG5vZGUgYXR0cmlidXRlcwotICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cnMgPSBlbGVtcy5pdGVtKGkpLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICAvLyBJZiB0aGUgbm9kZSBkb2VzIG5vdCBoYXZlIGF0dHJpYnV0ZXMgdGhlbiBjb250aW51ZQotICAgICAgICBpZiAoYXR0cnMgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0dGluZyBhY3RvciBhdHRyaWJ1dGUKLSAgICAgICAgTm9kZSBhY3RvciA9IGF0dHJzLmdldE5hbWVkSXRlbShyb290LmdldFByZWZpeCgpCi0gICAgICAgICAgKyAiOiIgKyBYTUxVdGlscy5TT0FQX0FUVFJfQUNUT1IpOwotCi0gICAgICAgIC8vIElmIHRoZSBhY3RvciBhdHRyaWJ1dGUgaXMgcHJlc2VudGVkIGFuZCBkb2VzIG5vdCBlcXVhbAotICAgICAgICAvLyB0byAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9hY3Rvci9uZXh0IiwKLSAgICAgICAgLy8gdGhlbiB0aGUgYXNzZXJ0aW9uIHBhc3NlZAotICAgICAgICBpZiAoYWN0b3IgIT0gbnVsbAotICAgICAgICAgICYmICFhY3Rvci5nZXROb2RlVmFsdWUoKS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQX05FWFRfQUNUT1IpKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBObyBvbmUgYWN0b3IgYXR0cmlidXRlIGhhcyBhIHZhbHVlIG90aGVyIHRoYW4KLSAgICAgIC8vICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZSAKLSAgICAgIHJlc3VsdCAgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotCi0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGFwZSkKLSAgICB7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RGV0YWlsRGVzY3JpcHRpb24oKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQNDEwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlA0MTAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTE3OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlA0MTAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvblBhc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQlA0MTAyCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgZW52ZWxvcGUgY29udGFpbmluZyBhIGZhdWx0IHdpdGggYSBub24tZW1wdHkgZGV0YWlsIGVsZW1lbnQuPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkEgRmF1bHQgZWxlbWVudCBpbiBhbiBlbnZlbG9wZSBjb250YWlucyBhIG5vbi1lbXB0eSBkZXRhaWwgZWxlbWVudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlA0MTAyIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQNDEwMihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkgewotCi0gICAgICAvLyBQYXJzaW5nIHRoZSBtZXNzYWdlCi0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgZW1wdHkgb3IgaW52YWxpZCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBHZXR0aW5nIEZhdWx0IGVsZW1lbnRzIGZyb20gZW52ZWxvcGUKLSAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIE5vZGVMaXN0IGZhdWx0TGlzdCA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCBYTUxVdGlscy5TT0FQX0VMRU1fRkFVTFQpOwotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyBGYXVsdCBlbGVtZW50LCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoZmF1bHRMaXN0ID09IG51bGwgfHwgZmF1bHRMaXN0LmdldExlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEZhdWx0IGVsZW1lbnQgbXVzdCBub3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlCi0gICAgICAvLyB3aXRoaW4gYSBCb2R5IGVsZW1lbnQsIHNvIGdldHRpbmcgdGhlIGZpcnN0IG9uZQotICAgICAgRWxlbWVudCBmYXVsdCA9IChFbGVtZW50KSBmYXVsdExpc3QuaXRlbSgwKTsKLQotICAgICAgLy8gR2V0dGluZyBGdWFsdCdzIGRldGFpbCBlbGVtZW50cwotICAgICAgTm9kZUxpc3QgZGV0YWlscyA9IGZhdWx0LmdldEVsZW1lbnRzQnlUYWdOYW1lKAotICAgICAgICBYTUxVdGlscy5TT0FQX0VMRU1fRkFVTFRfREVUQUlMKTsKLSAgICAgIC8vIElmIHRoZXJlIGlzIGEgbm9uLWVtcHR5IGRldGFpbCBlbGVtZW50LCB0aGVuIHRoZSBhc3NlcnRpb24gcGFzc2VkCi0gICAgICBpZiAoZGV0YWlscyAhPSBudWxsCi0gICAgICAgICYmIGRldGFpbHMuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBOb2RlTGlzdCBsaXN0ID0gZGV0YWlscy5pdGVtKDApLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgLy8gc2VhcmNoIGZpcnN0IGVsZW1lbnQgbm9kZSAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZigobGlzdC5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIAotICAgICAgICAgICYmIChsaXN0Lml0ZW0oaSkuZ2V0TG9jYWxOYW1lKCkgIT0gbnVsbCkgKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBUaGVyZSBpcyBubyBkZXRhaWwgZWxlbWVudCBpbiBGYXVsdCwKLSAgICAgIC8vIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvblBhc3NFeGNlcHRpb24gYXBlKQotICAgIHsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgdGVzdEFzc2VydGlvbi5nZXREZXRhaWxEZXNjcmlwdGlvbigpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlA0MTA5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDQxMDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmOGQxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDQxMDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQlA0MTA5Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIGVudmVsb3BlIGNvbnRhaW5pbmcgYSBzb2FwOkJvZHkgZWxlbWVudCB3aXRoIGF0dHJpYnV0ZXM8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+QW4gZW52ZWxvcGUgY29udGFpbnMgYSBhIHNvYXA6Qm9keSBlbGVtZW50IHdpdGggYXR0cmlidXRlcy48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlA0MTA5IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQNDEwOShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkgewotCi0gICAgICAvLyBQYXJzaW5nIHRoZSBtZXNzYWdlCi0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgZW1wdHkgb3IgaW52YWxpZCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBHZXR0aW5nIHRoZSBzb2FwOkJvZHkgZWxlbWVudHMgZnJvbSBlbnZlbG9wZQotICAgICAgTm9kZUxpc3QgYm9keUxpc3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCBYTUxVdGlscy5TT0FQX0VMRU1fQk9EWSk7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIG5vIEJvZHkgZWxlbWVudCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGJvZHlMaXN0ID09IG51bGwgfHwgYm9keUxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0dGluZyB0aGUgZmlyc3Qgc29hcDpCb2R5IGVsZW1lbnQKLSAgICAgIEVsZW1lbnQgYm9keSA9IChFbGVtZW50KSBib2R5TGlzdC5pdGVtKDApOwotCi0gICAgICAvLyBJZiB0aGUgQm9keSBlbGVtZW50IGhhcyBhdHRyaWJ1dGVzIChleGNsdWRpbmcgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyksCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIHBhc3NlZAotICAgICAgTmFtZWROb2RlTWFwIGF0dHJzID0gYm9keS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBpZiAoYXR0cnMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKChBdHRyKSBhdHRycy5pdGVtKGkpKS5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKCFhdHRyTmFtZS5lcXVhbHMoInhtbG5zIikgJiYgIWF0dHJOYW1lLnN0YXJ0c1dpdGgoInhtbG5zOiIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGFwZSkKLSAgICB7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RGV0YWlsRGVzY3JpcHRpb24oKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0VudmVsb3BlVmFsaWRhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvRW52ZWxvcGVWYWxpZGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjAxNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvRW52ZWxvcGVWYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgSUJNIENvcnBvcmF0aW9uLCBQYXJhc29mdCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNICAgICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgUGFyYXNvZnQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW52ZWxvcGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRW50cnlUeXBlOwotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW52ZWxvcGVWYWxpZGF0b3JJbXBsCi0gIGV4dGVuZHMgQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgaW1wbGVtZW50cyBFbnZlbG9wZVZhbGlkYXRvcgotewotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwjaXNQcmltYXJ5RW50cnlUeXBlTWF0Y2gob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzUHJpbWFyeUVudHJ5VHlwZU1hdGNoKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICB7Ci0gICAgYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCi0gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGVudHJ5IGFuZCB0ZXN0IGFzc2VydGlvbiBoYXZlIHRoZSBzYW1lIHByaW1hcnkgY29udGV4dAotICAgIGlmICgodGVzdEFzc2VydGlvbi5nZXRFbnRyeVR5cGVOYW1lKCkuZXF1YWxzKEVudHJ5VHlwZS5UWVBFX0VOVkVMT1BFX0FOWSkpCi0gICAgICB8fCAodGVzdEFzc2VydGlvbi5nZXRFbnRyeVR5cGVOYW1lKCkuZXF1YWxzKEVudHJ5VHlwZS5UWVBFX0VOVkVMT1BFX1JFUVVFU1QpCi0gICAgICAgICYmIChlbnRyeUNvbnRleHQKLSAgICAgICAgICAuZ2V0RW50cnkoKQotICAgICAgICAgIC5nZXRFbnRyeVR5cGUoKQotICAgICAgICAgIC5nZXRUeXBlTmFtZSgpCi0gICAgICAgICAgLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9NRVNTQUdFX1JFUVVFU1QpKSkKLSAgICAgIHx8ICh0ZXN0QXNzZXJ0aW9uLmdldEVudHJ5VHlwZU5hbWUoKS5lcXVhbHMoRW50cnlUeXBlLlRZUEVfRU5WRUxPUEVfUkVTUE9OU0UpCi0gICAgICAgICYmIChlbnRyeUNvbnRleHQKLSAgICAgICAgICAuZ2V0RW50cnkoKQotICAgICAgICAgIC5nZXRFbnRyeVR5cGUoKQotICAgICAgICAgIC5nZXRUeXBlTmFtZSgpCi0gICAgICAgICAgLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9NRVNTQUdFX1JFU1BPTlNFKSkpKQotICAgIHsKLSAgICAgIG1hdGNoID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWF0Y2g7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9TU0JQMTYwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvU1NCUDE2MDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE5ZDM1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9TU0JQMTYwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLQotLyoqCi0gKiBTU0JQMTYwMQotICovCi1wdWJsaWMgY2xhc3MgU1NCUDE2MDEgZXh0ZW5kcyBCUDE2MDEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgU1NCUDE2MDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvU1NCUDk3MDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL1NTQlA5NzA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNTUyNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvU1NCUDk3MDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogU1NCUDk3MDQKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgZW52ZWxvcGU8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIEVOVkVMT1BFIGRvZXMgbm90IGNvbnRhaW4gdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIFNTQlA5NzA0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgU1NCUDk3MDQoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0dGluZyBhIG1lc3NhZ2UgZG9jdW1lbnQKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgZW1wdHkgb3IgaW52YWxpZCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBHZXR0aW5nIHRoZSByb290IGVsZW1lbnQKLSAgICAgIEVsZW1lbnQgZWxlbSA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIC8vIElmIGl0IGlzIG5vdCB0aGUgc29hcDpFbnZlbG9wZSwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFlbGVtLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVApCi0gICAgICAgIHx8ICFlbGVtLmdldExvY2FsTmFtZSgpLmVxdWFscyhYTUxVdGlscy5TT0FQX0VMRU1fRU5WRUxPUEUpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGUgZW52ZWxvcGUgY29udGFpbnMgdGhlIHhtbG5zOnhtbCBuYW1lc3BhY2UgZGVjbGFyYXRpb24sCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgU3RyaW5nIGluY29ycmVjdEVsZW1lbnROYW1lID0gZ2V0SW5jb3JyZWN0RWxlbWVudE5hbWUoZWxlbSk7Ci0gICAgICBpZiAoaW5jb3JyZWN0RWxlbWVudE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBuYW1lIG9mIGFuIGVsZW1lbnQgY29udGFpbmluZyAiCi0gICAgICAgICAgKyAic3VjaCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaXMgXCIiICsgaW5jb3JyZWN0RWxlbWVudE5hbWUgKyAiXCIuIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBMb29rcyBmb3IgYW55IGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgYXR0cmlidXRlIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIi4gCi0gICAqIEBwYXJhbSBlbGVtIHRoZSByb290IGVsZW1lbnQuCi0gICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgYW4gZWxlbWVudCBmb3VuZCBvciBudWxsLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5jb3JyZWN0RWxlbWVudE5hbWUoRWxlbWVudCBlbGVtKQotICB7Ci0gICAgLy8gR2V0dGluZyBhIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgeG1sbnM6eG1sCi0gICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlTlMoCi0gICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1hNTE5TLCAieG1sIik7Ci0gICAgLy8gSWYgaXQgZXF1YWxzIHRvICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLAotICAgIC8vIHJldHVybiBhbiBlbGVtZW50IG5hbWU7Ci0gICAgaWYgKFdTSUNvbnN0YW50cy5OU19VUklfWE1MLmVxdWFscyhhdHRyVmFsdWUpKQotICAgIHsKLSAgICAgIHJldHVybiBlbGVtLmdldE5vZGVOYW1lKCk7Ci0gICAgfQotICAgIC8vIEdvaW5nIHRocm91Z2ggZWxlbWVudCdzIGNoaWxkcmVuCi0gICAgRWxlbWVudCBjaGlsZCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbSk7Ci0gICAgd2hpbGUgKGNoaWxkICE9IG51bGwpCi0gICAgewotICAgICAgLy8gSWYgYW55IG9mIHRoZW0gaGFzIHhtbG5zOnhtbCBhdHRyaWJ1dGUsIHJldHVybiBhIHZhbHVlCi0gICAgICBTdHJpbmcgbmFtZSA9IGdldEluY29ycmVjdEVsZW1lbnROYW1lKGNoaWxkKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgICAgfQotICAgICAgLy8gR2V0dGluZyB0aGUgbmV4dCBlbGVtZW50J3MgY2hpbGQKLSAgICAgIGNoaWxkID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotICAgIH0KLSAgICAvLyBObyB4bWxuczp4bWwgYXR0cmlidXRlcyBmb3VuZCwgcmV0dXJuIG51bGwKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxMDAzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTAwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2ZmMzcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxMDAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLS8qKgotICogQVAxMDAzCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG5vbi1tdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlIGluIHRoZSBsb2cgZmlsZSwgd2hpY2ggaGFzIGEgbm9uLWVtcHR5IGVudGl0eS1ib2R5PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPgotICogIFRoZSBsb2dnZWQgU09BUCBlbnZlbG9wZSBpcyBhIFVURi04IHRyYW5zY3JpcHQgb2YgYW4gZW52ZWxvcGUgb3JpZ2luYWxseSBlbmNvZGVkIGFzIFVURi04IG9yIFVURi0xNi4gCi0gKiAgVGhlIEhUVFAgQ29udGVudC1UeXBlIGhlYWRlcidzIGNoYXJzZXQgdmFsdWUgaXMgZWl0aGVyIFVURi04IG9yIFVURi0xNi4gTG9va2luZyBhdCB0aGUgbWVzc2FnZUNvbnRlbnQgCi0gKiAgZWxlbWVudCBvZiB0aGUgbG9nZ2VkIG1lc3NhZ2UsIGVpdGhlciAKLSAqICAgICgxKSBpdCBoYXMgYSBCT00gYXR0cmlidXRlIHdoaWNoIG1hcHMgdGhlIGNoYXJzZXQgdmFsdWUgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIsIG9yIAotICogICAgKDIpIGl0IGhhcyBpdCBoYXMgYW4gWE1MIGRlY2xhcmF0aW9uIHdoaWNoIG1hdGNoZXMgdGhlIGNoYXJzZXQgdmFsdWUgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIsIG9yIAotICogICAgKDMpIHRoZXJlIGlzIG5vIEJPTSBhdHRyaWJ1dGUgYW5kIG5vIFhNTCBkZWNsYXJhdGlvbiwgYW5kIHRoZSBjaGFyc2V0IHZhbHVlIGlzIFVURi04LgotICogPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqCi0gKiBAYXV0aG9yIGxhdXpvbmQKLSAqLwotcHVibGljIGNsYXNzIEFQMTAwMyBleHRlbmRzIFNTQlAxMDAzIHsKLQotCS8qKgotCSAqIEBwYXJhbSBpbXBsCi0JICovCi0JcHVibGljIEFQMTAwMyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKSAKLQl7Ci0JCXN1cGVyKGltcGwpOwotCX0KLQotCXB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0JICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0JICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotCSAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotCXsKLQkgIC8vIElmIHRoZXJlIGlzIGEgU09BUCBNZXNzYWdlIHdpdGggQXR0YWNobWVudHMsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLQkgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuaXNNaW1lQ29udGVudCgpKQotCSAgewotCSAgCXJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEUsIGZhaWx1cmVEZXRhaWwpOwotCSAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gc3VwZXIudmFsaWRhdGUodGVzdEFzc2VydGlvbiwgZW50cnlDb250ZXh0KTsKLQkgIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5MDBlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLS8qKgotICogQVAxOTAyCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG1lc3NhZ2U8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+SW4gYSBkZXNjcmlwdGlvbiwgaWYgdGhlIHdzZGw6aW5wdXQgb3Igd3NkbDpvdXRwdXQKLSAqIGVsZW1lbnQgaW4gdGhlIHdzZGw6YmluZGluZyBzcGVjaWZpZXMgV1NETCBNSU1FIGJpbmRpbmcsIHRoZW4gdGhlIG1lc3NhZ2UKLSAqIGNhbiBjb250YWluIFNPQVAgYXR0YWNobWVudHMuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMTkwMiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMTkwMihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIGFuIG9wZXJhdGlvbiBtYXRjaGVkIGZvciBhIG1lc3NhZ2UKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IHZhbGlkYXRvci5nZXRPcGVyYXRpb25NYXRjaCgKLSAgICAgICAgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCksCi0gICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpKTsKLSAgICAgIC8vIElmIG5vIG9uZSBvcGVyYXRpb24gbWF0Y2hlcywgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIC8vIEdldHRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgTGlzdCBleHRFbGVtczsKLSAgICAgIFN0cmluZyB0eXBlOwotICAgICAgaWYgKE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QKLSAgICAgICAgLmVxdWFscyhlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSkpCi0gICAgICB7Ci0gICAgICAgIHR5cGUgPSAiaW5wdXQiOwotICAgICAgICBleHRFbGVtcyA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICA6IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHR5cGUgPSAib3V0cHV0IjsKLSAgICAgICAgZXh0RWxlbXMgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSA9PSBudWxsID8gbnVsbAotICAgICAgICAgIDogYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICAvLyBJZiB0aGUgTUlNRSBiaW5kaW5nIGlzIG5vdCB1c2VkLCBidXQgdGhlIG1lc3NhZ2UgaGFzCi0gICAgICAvLyBhdCBsZWFzdCBvbmUgbm9uLXJvb3QgTUlNRSBwYXJ0LCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgaWYgKCF1c2VzTWltZUJpbmRpbmcoZXh0RWxlbXMpCi0gICAgICAgICYmIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNaW1lUGFydHMoKS5jb3VudCgpID4gMSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSB3c2RsOiIgKyB0eXBlICsgIiBvZiB0aGUgXCIiCi0gICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArICJcIiBiaW5kaW5nIG9wZXJhdGlvbi4iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmaXJzdCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaXMgbWltZTptdWx0aXBhcnRSZWxhdGVkLgotICAgKiBAcGFyYW0gZXh0RWxlbXMgYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBtaW1lOm11bHRpcGFydFJlbGF0ZWQsIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHVzZXNNaW1lQmluZGluZyhMaXN0IGV4dEVsZW1zKSB7Ci0gICAgLy8gSWYgdGhlIGZpcnN0IGV4dGVuc2liaWxpdHkgZWxlbWVudCBpcyBtaW1lOm11bHRpcGFydFJlbGF0ZWQsCi0gICAgLy8gcmV0dXJuIHRydWUKLSAgICBpZiAoZXh0RWxlbXMgIT0gbnVsbCAmJiBleHRFbGVtcy5zaXplKCkgPiAwCi0gICAgICAmJiAoKEV4dGVuc2liaWxpdHlFbGVtZW50KWV4dEVsZW1zLmdldCgwKSkKLSAgICAgIC5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX01JTUVfTVVMVElQQVJUKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgLy8gb3RoZXJ3aXNlIHJldHVybiBmYWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTE1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkxNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODUyOTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1JTUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTUlNRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotCi0vKioKLSAqIEFQMTkxNQotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSByb290LXBhcnQgb2YgYSBtdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBlbnRpdHkgYm9keSBvZiB0aGUgcm9vdC1wYXJ0IG9mIGEKLSAqIG11bHRpcGFydC9yZWxhdGVkIG1lc3NhZ2UgaXMgc2VyaWFsaXplZCB1c2luZyBlaXRoZXIgVVRGLTggb3IgVVRGLTE2Ci0gKiBjaGFyYWN0ZXIgZW5jb2RpbmcuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMTkxNSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMTkxNShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBnZXQgTUlNRSBwYXJ0cwotICAgIGlmICghZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgTWltZVBhcnRzIG1pbWVQYXJ0cyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNaW1lUGFydHMoKTsgICAgCQotICAgICAgTWltZVBhcnQgcGFydCA9IG1pbWVQYXJ0cy5nZXRSb290UGFydCgpOwotICAgICAgaWYgKHBhcnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHhtbEVuY29kaW5nID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNoYXJzZXQgPSBNSU1FVXRpbHMuZ2V0TWltZUhlYWRlclN1YkF0dHJpYnV0ZSgKLSAgICAgICAgICBwYXJ0LmdldEhlYWRlcnMoKSwKLSAgICAgICAgICBNSU1FQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEUsIAotICAgICAgICAgICJjaGFyc2V0Iik7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy8gVGhlIEhUVFAgQ29udGVudC1UeXBlIGhlYWRlcidzIGNoYXJzZXQgdmFsdWUgaXMgZWl0aGVyIFVURi04IG9yIFVURi0xNi4gCi0gICAgICAgICAgaWYoKGNoYXJzZXQgIT0gbnVsbCkgJiYgKGNoYXJzZXQuZXF1YWxzSWdub3JlQ2FzZSgidXRmLTgiKSB8fAotICAgICAgICAgICAgICBjaGFyc2V0LmVxdWFsc0lnbm9yZUNhc2UoInV0Zi0xNiIpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBMb29raW5nIGF0IHRoZSBtZXNzYWdlQ29udGVudCBlbGVtZW50IG9mIHRoZSBsb2dnZWQgbWVzc2FnZSwgZWl0aGVyIAotICAgICAgICAgICAgLy8gKDEpIGl0IGhhcyBhIEJPTSBhdHRyaWJ1dGUgd2hpY2ggbWFwcyB0aGUgY2hhcnNldCB2YWx1ZSBpbiB0aGUgQ29udGVudC1UeXBlIGhlYWRlciwgb3IgCi0gICAgICAgICAgICBpbnQgYm9tID0gMDsKLSAgICAgICAgICAgIGlmICgoYm9tID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEJPTSgpKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoKGJvbSA9PSBXU0lDb25zdGFudHMuQk9NX1VURjgKLSAgICAgICAgICAgICAgICAmJiAhY2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJ1dGYtOCIpKQotICAgICAgICAgICAgICAgIHx8ICgoYm9tID09IFdTSUNvbnN0YW50cy5CT01fVVRGMTYKLSAgICAgICAgICAgICAgICAgICYmICFjaGFyc2V0LmVxdWFsc0lnbm9yZUNhc2UoInV0Zi0xNiIpKSkKLSAgICAgICAgICAgICAgICB8fCAoKGJvbSA9PSBXU0lDb25zdGFudHMuQk9NX1VURjE2X0JJR19FTkRJQU4KLSAgICAgICAgICAgICAgICAgICYmICFjaGFyc2V0LmVxdWFsc0lnbm9yZUNhc2UoInV0Zi0xNiIpKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIEJPTSAoIiArIGJvbSArIAotICAgICAgICAgICAgICAgICAgICAiKSBhbmQgY2hhcnNldCB2YWx1ZSAoIiArIGNoYXJzZXQgKyAiKWRvIG5vdCBtYXRjaC4iKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gKDIpIGl0IGhhcyBhbiBYTUwgZGVjbGFyYXRpb24gd2hpY2ggbWF0Y2hlcyB0aGUgY2hhcnNldCB2YWx1ZSBpbiB0aGUgQ29udGVudC1UeXBlIGhlYWRlciwgb3IgCi0gICAgICAgICAgICBlbHNlIGlmICgoKHhtbEVuY29kaW5nID0gCi0gICAgICAgICAgICAgIFV0aWxzLmdldFhNTEVuY29kaW5nKHBhcnQuZ2V0Q29udGVudCgpKSkgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICAgIXhtbEVuY29kaW5nLmVxdWFscygiIikpICAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYoIXhtbEVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoY2hhcnNldCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIFhNTCBkZWNsYXJhdGlvbiBlbmNvZGluZyAoIiArIAotICAgICAgICAgICAgICAgICAgICB4bWxFbmNvZGluZyArICIpIGFuZCBjaGFyc2V0IHZhbHVlICgiICsgY2hhcnNldCArIAotICAgICAgICAgICAgICAgICAgICAiKSBkbyBub3QgbWF0Y2guIik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gKDMpIHRoZXJlIGlzIG5vIEJPTSBhdHRyaWJ1dGUgYW5kIG5vIFhNTCBkZWNsYXJhdGlvbiwgYW5kIHRoZSBjaGFyc2V0IHZhbHVlIGlzIFVURi04LgotICAgICAgICAgICAgZWxzZSBpZighY2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJ1dGYtOCIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIG5vIEJPTSBhdHRyaWJ1dGUgYW5kIG5vIFhNTCAiKwotICAgICAgICAgICAgICAgICAgImRlY2xhcmF0aW9uLCBhbmQgdGhlIGNoYXJzZXQgdmFsdWUgaXMgKCIgKyBjaGFyc2V0ICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gaGVhZGVyIGRvIG5vdCBmb3VuZCBvciBpbmNvcnJlY3QgY2hhcnNldCB2YWx1ZQotICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIkVpdGhlciB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBpcyBub3QgIisKLSAgICAgICAgICAgICAgICAicHJlc2VudCBpbiB0aGUgUm9vdCBQYXJ0IG9yIGEgY2hhcnNldCB2YWx1ZSBpcyBpbnZhbGlkLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKSAKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTE3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkxNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTJkMGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotCi0vKioKLSAqIEFQMTkxNwotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtZXNzYWdlIGNvbnRhaW5pbmcgemVybyBhdHRhY2htZW50IHBhcnRzPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkEgbWVzc2FnZSBjb250YWluaW5nIHplcm8gYXR0YWNobWVudCBwYXJ0cyBpcyBzZW50Ci0gKiB1c2luZyBhIGNvbnRlbnQtdHlwZSBvZiBlaXRoZXIgInRleHQveG1sIiBhcyB0aG91Z2ggYSBTT0FQIEhUVFAgYmluZGluZyB3ZXJlCi0gKiB1c2VkIG9yICJtdWx0aXBhcnQvcmVsYXRlZCIgd2hlbiB0aGUgV1NETCBkZXNjcmlwdGlvbiBmb3IgdGhlIG1lc3NhZ2UKLSAqIHNwZWNpZmllcyB0aGUgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnQgb24gdGhlIGNvcnJlc3BvbmRpbmcgd3NkbDppbnB1dAotICogb3Igd3NkbDpvdXRwdXQgZWxlbWVudCBpbiBpdHMgd3NkbDpiaW5kaW5nLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDE5MTcgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBUDE5MTcoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gbm90IGFwcGxpY2FibGUgaWYgdGhlcmUgYXJlIGF0dGFjaG1lbnRzCi0gICAgICBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNaW1lUGFydHMoKS5jb3VudCgpID4gMSkKLSAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gdmFsaWRhdG9yLmdldE9wZXJhdGlvbk1hdGNoKAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpKTsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWF0Y2hlZCBvcGVyYXRpb24sIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEZpbmRpbmcgb3BlcmF0aW9uIGV4dGVuc2liaWxpdHkgZWxlbXMKLSAgICAgIC8vIGluIHRoZSBiaW5kaW5nIGRlcGVuZGluZyBvbiBtZXNzYWdlIHR5cGUKLSAgICAgIExpc3QgZXh0RWxlbXMgPSBudWxsOwotICAgICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKQotICAgICAgICAmJiBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGV4dEVsZW1zID0gYmluZGluZ09wZXJhdGlvbgotICAgICAgICAgIC5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVNQT05TRSkKLSAgICAgICAgJiYgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZXh0RWxlbXMgPSBiaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgICAgLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLQotICAgICAgLy8gY2hlY2sgbGlzdAotICAgICAgaWYoKGV4dEVsZW1zID09IG51bGwpIHx8IChleHRFbGVtcy5zaXplKCkgPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIGRldGVybWluZSB0eXBlIAotICAgICAgYm9vbGVhbiBpc011bHRpUGFydCA9IGZhbHNlOwotICAgICAgCi0gICAgICAvLyBpZiBNSU1FTXVsdGlwYXJ0UmVsYXRlZCB0aGVuIG9ubHkgcm9vdC1wYXJ0IGFsbG93ZWQgCi0gICAgICBpZihleHRFbGVtcy5nZXQoMCkgaW5zdGFuY2VvZiBNSU1FTXVsdGlwYXJ0UmVsYXRlZCkKLSAgICAgIHsKLSAgICAgICAgaWYoKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbXMuZ2V0KDApKS5nZXRNSU1FUGFydHMoKS5zaXplKCkgIT0gMSkgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaXNNdWx0aVBhcnQgPSB0cnVlOwotICAgICAgfQotICAgICAgLy8gZWxzZSBpZiBub3Qgc29hcGJpbmQ6Ym9keSByb290IGVsZW1lbnQKLSAgICAgIGVsc2UgaWYoIShleHRFbGVtcy5nZXQoMCkgaW5zdGFuY2VvZiBTT0FQQm9keSkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGdldCBIVFRQIGNvbnRlbnQgdHlwZQotICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJBdHRyaWJ1dGUoCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCksCi0gICAgICAgICAgSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFKTsKLSAKLSAgICAgIC8vYWxsb3cgInRleHQveG1sIiBvciAKLSAgICAgIC8vKCJtdWx0aXBhcnQvcmVsYXRlZCIgYW5kICJtaW1lOm11bHRpcGFydFJlbGF0ZWQiIFdTREwgYmluZGluZ3MpCi0gICAgICBpZigoY29udGVudFR5cGUgPT0gbnVsbCkgfHwgCi0gICAgICAgICAoIWNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoV1NJQ29uc3RhbnRzLkNPTlRFTlRfVFlQRV9NVUxUSVBBUlQpICYmCi0gICAgICAgICAhY29udGVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZShXU0lDb25zdGFudHMuQ09OVEVOVF9UWVBFX1RFWFRfWE1MKSkgfHwKLSAgICAgICAgICgoY29udGVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZShXU0lDb25zdGFudHMuQ09OVEVOVF9UWVBFX01VTFRJUEFSVCkgJiYgCi0gICAgICAgICAgICAgIWlzTXVsdGlQYXJ0KSkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgY29udGVudC10eXBlIGhlYWRlciBmaWVsZCAgIiArCi0gICAgICAgICAgICAidmFsdWUgXCIiICsgY29udGVudFR5cGUgKyAiXCIgaXMgaW5jb3JyZWN0Iik7Ci0gICAgICB9Ci0gICAgfSAKLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gCi0gICAgICAgIHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTI1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkyNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzUwMWY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTI1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotCi0vKioKLSAqIEFQMTkyNQotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtZXNzYWdlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPklmIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGxpc3RzIGF0IGxlYXN0IG9uZSBub24tcm9vdAotICogTUlNRSBwYXJ0LCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgaGFzIGEgQ29udGVudC1UeXBlIEhUVFAgaGVhZGVyCi0gKiBmaWVsZC12YWx1ZSB3aXRoIGEgbWVkaWEtdHlwZSBvZiAibXVsdGlwYXJ0L3JlbGF0ZWQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMTkyNSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMTkyNShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSB2YWxpZGF0b3IuZ2V0T3BlcmF0aW9uTWF0Y2goCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCksCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpOwotICAKLSAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG1hdGNoZWQgb3BlcmF0aW9uLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAKLSAgICAgIC8vIEZpbmRpbmcgb3BlcmF0aW9uIGV4dGVuc2liaWxpdHkgZWxlbXMKLSAgICAgIC8vIGluIHRoZSBiaW5kaW5nIGRlcGVuZGluZyBvbiBtZXNzYWdlIHR5cGUKLSAgICAgIExpc3QgZXh0RWxlbXMgPSBudWxsOwotICAgICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKQotICAgICAgICAmJiBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGV4dEVsZW1zID0gYmluZGluZ09wZXJhdGlvbgotICAgICAgICAgIC5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVNQT05TRSkKLSAgICAgICAgJiYgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZXh0RWxlbXMgPSBiaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgICAgLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIC8vIGNoZWNrIGxpc3Qgb24gZmlyc3QgZWxlbWVudAotICAgICAgaWYoKGV4dEVsZW1zID09IG51bGwpIHx8IChleHRFbGVtcy5zaXplKCkgPT0gMCkgfHwgCi0gICAgICAgICAhKGV4dEVsZW1zLmdldCgwKSBpbnN0YW5jZW9mIE1JTUVNdWx0aXBhcnRSZWxhdGVkKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIAotICAgICAgLy8gZ2V0IGxpc3QgbWltZSBwYXJ0cyBmcm9tIGRlZmluaXRpb24KLSAgICAgIE1JTUVNdWx0aXBhcnRSZWxhdGVkIG1pbWUgPSAoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dEVsZW1zLmdldCgwKTsKLSAgICAgIExpc3QgcGFydHMgPSBtaW1lLmdldE1JTUVQYXJ0cygpOwotICAgICAgLy8gaWYgcGFydHMgY291bnQgaXMgbW9yZSB0aGFuIG9uZSwgdGhhbiBhc3NlcnRpb24gaXMgbm90QXBwbGljYWJsZQotICAgICAgaWYocGFydHMuc2l6ZSgpIDw9IDEpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlckF0dHJpYnV0ZSgKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKSwKLSAgICAgICAgICBIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEUpOyAKLSAgICAgIGlmKChjb250ZW50VHlwZSA9PSBudWxsKSB8fCAKLSAgICAgICAgICFjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFdTSUNvbnN0YW50cy5DT05URU5UX1RZUEVfTVVMVElQQVJUKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIkluY29ycmVjdCBDb250ZW50LVR5cGUgdmFsdWUgXCIiICsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlICsgIlwiIGluIEhUVFAgaGVhZGVyIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSAKLSAgICAgICAgdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBhcnQgdmFsdWUgZnJvbSBNSU1FQ29udGVudCBlbGVtZW50Ci0gICAqIEBwYXJhbSBwYXJ0IE1JTUVQYXJ0IGVsZW1lbnQKLSAgICogQHJldHVybiB0aGUgcGFydCB2YWx1ZSBmcm9tIE1JTUVDb250ZW50IGVsZW1lbnQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldE1JTUVDb250ZW50UGFydChNSU1FUGFydCBwYXJ0KSB7Ci0gICAgTGlzdCBsaXN0ID0gcGFydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBpZihsaXN0LnNpemUoKSA9PSAwKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuICgoTUlNRUNvbnRlbnQpIGxpc3QuZ2V0KDApKS5nZXRQYXJ0KCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkyNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmMjRlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkyNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTUlNRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NSU1FVXRpbHM7Ci0KLS8qKgotICogQVAxOTI2Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG1lc3NhZ2U8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+QSBtZXNzYWdlIGluY2x1ZGVzIGFsbCBvZiB0aGUgTUlNRSBwYXJ0cyBkZXNjcmliZWQgYnkKLSAqIGl0cyBXU0RMIE1JTUUgYmluZGluZy48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAxOTI2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAxOTI2KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmKCFlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuaXNNaW1lQ29udGVudCgpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBnZXQgbWVzc2FnZSBtaW1lIHBhcnRzCi0gICAgICBNaW1lUGFydHMgbWltZVBhcnRzID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1pbWVQYXJ0cygpOwotICAgICAgCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSB2YWxpZGF0b3IuZ2V0T3BlcmF0aW9uTWF0Y2goCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCksCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpOwotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyBtYXRjaGVkIG9wZXJhdGlvbiwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gRmluZGluZyBvcGVyYXRpb24gZXh0ZW5zaWJpbGl0eSBlbGVtcwotICAgICAgLy8gaW4gdGhlIGJpbmRpbmcgZGVwZW5kaW5nIG9uIG1lc3NhZ2UgdHlwZQotICAgICAgTGlzdCBleHRFbGVtcyA9IG51bGw7Ci0gICAgICBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldFR5cGUoKS5lcXVhbHMoCi0gICAgICAgIE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QpCi0gICAgICAgICYmIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZXh0RWxlbXMgPSBiaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgICAgLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldFR5cGUoKS5lcXVhbHMoCi0gICAgICAgIE1lc3NhZ2VFbnRyeS5UWVBFX1JFU1BPTlNFKQotICAgICAgICAmJiBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBleHRFbGVtcyA9IGJpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAuZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgfQotICAgICAgLy8gY2hlY2sgbGlzdCBmb3IgdGhlIGZpcnN0IGVsZW1lbnQKLSAgICAgIGlmKChleHRFbGVtcyA9PSBudWxsKSB8fCAoZXh0RWxlbXMuc2l6ZSgpID09IDApIHx8IAotICAgICAgICAgIShleHRFbGVtcy5nZXQoMCkgaW5zdGFuY2VvZiBNSU1FTXVsdGlwYXJ0UmVsYXRlZCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICAKLSAgICAgIC8vIGdldCBsaXN0IG1pbWUgcGFydHMgZnJvbSBkZWZpbml0aW9uCi0gICAgICBNSU1FTXVsdGlwYXJ0UmVsYXRlZCBtaW1lID0gKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBleHRFbGVtcy5nZXQoMCk7Ci0gICAgICBMaXN0IHBhcnRzID0gbWltZS5nZXRNSU1FUGFydHMoKTsKLQotICAgICAgaWYobWltZVBhcnRzLmdldFJvb3RQYXJ0KCkgPT0gbnVsbCB8fCBtaW1lUGFydHMuY291bnQoKT09MCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIC8vIHNraXAgcm9vdCBwYXJ0Ci0gICAgICBmb3IgKGludCBpID0gMTsgaSA8IHBhcnRzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSBnZXRNSU1FQ29udGVudFBhcnQoKE1JTUVQYXJ0KSBwYXJ0cy5nZXQoaSkpOwotICAgICAgICAvLyBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIE1JTUUgcGFydAotICAgICAgICBpZiAoZmluZE1JTUVQYXJ0KG1pbWVQYXJ0cy5nZXRQYXJ0cygpLCBwYXJ0TmFtZSkgPT0gbnVsbCkgCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGNvcnJlc3BvbmRpbmcgYmluZGluZyAiICsKLSAgICAgICAgICAgICAgIm9wZXJhdGlvbiBcIiIgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArIAotICAgICAgICAgICAgICAiXCIgZG9lcyBub3QgY29udGFpbiBwYXJ0IFwiIiArIHBhcnROYW1lICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IAotICAgICAgICB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogZmluZCBjb3JyZXNwb25kaW5nIE1JTUUgcGFydAotICAgKiBAcGFyYW0gcGFydHMgYXJyYXkgb2Ygc29hcCBNSU1FIHBhcnRzCi0gICAqIEBwYXJhbSBwYXJ0TmFtZSBwYXJ0IG5hbWUgdG8gZmluZAotICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgTUlNRSBwYXJ0ICJDb250ZW50LUlEIiB2YWx1ZSwgCi0gICAqIGlmIHRoZSBwYXJ0IGRvZXNudCBmb3VuZCwgcmV0dW5zIG51bGwKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGZpbmRNSU1FUGFydChDb2xsZWN0aW9uIHBhcnRzLCBTdHJpbmcgcGFydE5hbWUpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgaWYocGFydE5hbWUgPT0gbnVsbCkKLSAgICAgICByZXR1cm4gbnVsbDsKLSAgICBJdGVyYXRvciBpcGFydHMgPSBwYXJ0cy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpcGFydHMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE1pbWVQYXJ0IHBhcnQgPSAoTWltZVBhcnQpaXBhcnRzLm5leHQoKTsKLSAgICAgIFN0cmluZyBtX3BhcnROYW1lID0gTUlNRVV0aWxzLmdldE1pbWVIZWFkZXJBdHRyaWJ1dGUoCi0gICAgICAgICAgcGFydC5nZXRIZWFkZXJzKCksIE1JTUVDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfSUQpOwotCi0gICAgICAvLyBjaGVjayB2YWx1ZSBmb3JtYXQgPHBhcnRuYW1lPVVJREBob3N0PgotICAgICAgaWYgKChtX3BhcnROYW1lICE9IG51bGwpICYmIChtX3BhcnROYW1lLnN0YXJ0c1dpdGgoIjwiKSkgJiYgCi0gICAgICAgICAgKG1fcGFydE5hbWUuaW5kZXhPZigiPSIpICE9IC0xKSAmJiAKLSAgICAgICAgICAoZW5jb2RlUGFydE5hbWUobV9wYXJ0TmFtZS5zdWJzdHJpbmcoMSwgbV9wYXJ0TmFtZS5pbmRleE9mKCI9IikpKS5lcXVhbHMocGFydE5hbWUpKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcGFydE5hbWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBhcnQgdmFsdWUgZnJvbSBNSU1FQ29udGVudCBlbGVtZW50Ci0gICAqIEBwYXJhbSBwYXJ0IE1JTUVQYXJ0IGVsZW1lbnQKLSAgICogQHJldHVybiB0aGUgcGFydCB2YWx1ZSBmcm9tIE1JTUVDb250ZW50IGVsZW1lbnQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldE1JTUVDb250ZW50UGFydChNSU1FUGFydCBwYXJ0KSB7Ci0gICAgTGlzdCBsaXN0ID0gcGFydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBpZihsaXN0LnNpemUoKSA9PSAwKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuICgoTUlNRUNvbnRlbnQpIGxpc3QuZ2V0KDApKS5nZXRQYXJ0KCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBFbmNvZGUgc3RyaW5nIGZyb20gJUhIIHRvIFVURgotICAgKiBAcGFyYW0gc3RyIHN0cmluZwotICAgKiBAcmV0dXJuIGVuY29kZWQgc3RyaW5nIGZyb20gJUhIIGZvcm1hdAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlUGFydE5hbWUoU3RyaW5nIHN0cikgewotICAgIFN0cmluZ0J1ZmZlciByZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIGlmKChzdHIuY2hhckF0KGkpID09ICclJykgJiYgKHN0ci5sZW5ndGgoKSA+IGkrMikpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludCgKLSAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2Yoc3RyLmNoYXJBdChpKzEpKSArCi0gICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHN0ci5jaGFyQXQoaSsyKSksIDE2KTsKLSAgICAgICAgICByZXMuYXBwZW5kKChjaGFyKSB2YWx1ZSk7Ci0gICAgICAgICAgaSArPTI7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpe30KLSAgICAgIH0gCi0gICAgICBlbHNlIAotICAgICAgewotICAgICAgICByZXMuYXBwZW5kKHN0ci5jaGFyQXQoaSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzLnRvU3RyaW5nKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkzMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjZGZjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQVAxOTMxCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHJvb3QtcGFydCBvZiBhIG11bHRpcGFydC9yZWxhdGVkIG1lc3NhZ2U8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIGVudGl0eSBib2R5IG9mIHRoZSByb290LXBhcnQgb2YgbXVsdGlwYXJ0L3JlbGF0ZWQKLSAqIG1lc3NhZ2UgaXMgYSBzb2FwOkVudmVsb3BlLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDE5MzEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBUDE5MzEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gY2hlY2sgZm9yIHRoZSByb290IHBhcnQKLSAgICBpZihlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuaXNNaW1lQ29udGVudCgpICYmCi0gICAgICAgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNaW1lUGFydHMoKS5nZXRSb290UGFydCgpICE9IG51bGwpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgLy8gcGFyc2Ugcm9vdCBwYXJ0IG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IGRvYyA9IFhNTFV0aWxzLnBhcnNlWE1MKAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNaW1lUGFydHMoKS5nZXRSb290UGFydCgpLmdldENvbnRlbnQoKSk7Ci0gICAgICAKLSAgICAgIC8vIGdldCBlbnRpdHkgYm9keQotICAgICAgRWxlbWVudCBlbCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIAotICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgbm90IHNvYXA6RW52ZWxvcGUsIHRoZW4gZmFpbCAgCi0gICAgICBpZighZWwuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFdTSVRhZy5FTEVNX1NPQVBfRU5WRUxPUEUuZ2V0TG9jYWxQYXJ0KCkpIHx8Ci0gICAgICAgICAhZWwuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTSVRhZy5FTEVNX1NPQVBfRU5WRUxPUEUuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgInRoZSBlbnRpdHkgYm9keSBvZiB0aGUgcm9vdCBwYXJ0IGlzIHsiICsKLSAgICAgICAgICAgIGVsLmdldE5hbWVzcGFjZVVSSSgpICsgIn0iICsgZWwuZ2V0TG9jYWxOYW1lKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgICB9IAotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgInRoZSBlbnRpdHkgYm9keSBvZiB0aGUgcm9vdCBwYXJ0IGRvZXMgbm90IGNvbnRhaW4gIiArCi0gICAgICAgICAgICAiXCJzb2FwOkVudmVsb3BlXCIgZWxlbWVudCIsIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgfSAKLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MzIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YzBmYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci0KLS8qKgotICogQVAxOTMyCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG1lc3NhZ2UgY29udGFpbmluZyBhIENvbnRlbnQtVHlwZSBIVFRQIGhlYWRlcgotICogZmllbGQtdmFsdWUgd2l0aCBhIG1lZGlhIHR5cGUgb2YgIm11bHRpcGFydC9yZWxhdGVkIjwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5JbiBhIG1lc3NhZ2UsIHRoZSBDb250ZW50LVR5cGUgSFRUUCBoZWFkZXIgZmllbGQtdmFsdWUKLSAqIGhhcyBhIHR5cGUgcGFyYW1ldGVyIHdpdGggYSB2YWx1ZSBvZiAidGV4dC94bWwiIHdoZW4gaXQgaGFzIGEgbWVkaWEgdHlwZSBvZgotICogIm11bHRpcGFydC9yZWxhdGVkIi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAxOTMyIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAxOTMyKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIGNoZWNrIGZvciBtdWx0aXBhcnQvcmVsYXRlZCBjb250ZW50IHR5cGUKLSAgICBTdHJpbmcgY29udGVudF90eXBlID0gSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJBdHRyaWJ1dGUoCi0gICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpLCAKLSAgICAgICAgSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFKTsKLSAgICAKLSAgICBpZigoY29udGVudF90eXBlID09IG51bGwpIHx8IAotICAgICAgICghY29udGVudF90eXBlLmVxdWFsc0lnbm9yZUNhc2UoV1NJQ29uc3RhbnRzLkNPTlRFTlRfVFlQRV9NVUxUSVBBUlQpKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0gCi0gICAgZWxzZSAgCi0gICAgewotICAgICAgU3RyaW5nIHN1YlR5cGUgPSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlclN1YkF0dHJpYnV0ZSgKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKSwgCi0gICAgICAgICAgSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLCAidHlwZSIpOwotICAgICAgaWYoKHN1YlR5cGUgPT0gbnVsbCkKLSAgICAgICAgfHwgIXN1YlR5cGUuZXF1YWxzSWdub3JlQ2FzZShXU0lDb25zdGFudHMuQ09OVEVOVF9UWVBFX1RFWFRfWE1MKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICJUaGUgXCJ0eXBlXCIgcGFyYW1ldGVyIHZhbHVlIGlzIFwiIiArIHN1YlR5cGUgKyAiXCIiLCBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTMzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkzMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQ5MWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTMzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1JTUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTUlNRVV0aWxzOwotCi0vKioKLSAqIEFQMTkzMwotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtZXNzYWdlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPklmIGEgZGVzY3JpcHRpb24gYmluZHMgYSB3c2RsOm1lc3NhZ2UgcGFydCB0byBhCi0gKiBtaW1lOmNvbnRlbnQgZWxlbWVudCwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyBNSU1FIHBhcnQgaW4gYSBtZXNzYWdlIGhhcyBhCi0gKiBjb250ZW50LWlkIGhlYWRlciB3aXRoIGEgZ2xvYmFsbHkgdW5pcXVlIHZhbHVlIG9mIHRoZSBmb3JtCi0gKiAmbHQ7cGFydG5hbWU9SURAaG9zdG5hbWUmZ3Q7LCB3aGVyZSAncGFydG5hbWUnIGlzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBhdHRyaWJ1dGUgb2YKLSAqIHRoZSB3c2RsOnBhcnQgZWxlbWVudCByZWZlcmVuY2VkIGJ5IHRoZSBtaW1lOmNvbnRlbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMTkzMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMTkzMyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGlmKCFlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuaXNNaW1lQ29udGVudCgpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBnZXQgbWVzc2FnZSBtaW1lIHBhcnRzCi0gICAgICBNaW1lUGFydHMgbWltZVBhcnRzID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1pbWVQYXJ0cygpOwotICAgICAgCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSB2YWxpZGF0b3IuZ2V0T3BlcmF0aW9uTWF0Y2goCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCksCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpOwotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyBtYXRjaGVkIG9wZXJhdGlvbiwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gRmluZGluZyBvcGVyYXRpb24gZXh0ZW5zaWJpbGl0eSBlbGVtcwotICAgICAgLy8gaW4gdGhlIGJpbmRpbmcgZGVwZW5kaW5nIG9uIG1lc3NhZ2UgdHlwZQotICAgICAgTGlzdCBleHRFbGVtcyA9IG51bGw7Ci0gICAgICBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldFR5cGUoKS5lcXVhbHMoCi0gICAgICAgIE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QpCi0gICAgICAgICYmIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZXh0RWxlbXMgPSBiaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgICAgLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldFR5cGUoKS5lcXVhbHMoCi0gICAgICAgIE1lc3NhZ2VFbnRyeS5UWVBFX1JFU1BPTlNFKQotICAgICAgICAmJiBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBleHRFbGVtcyA9IGJpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAuZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgfQotICAgICAgLy8gY2hlY2sgbGlzdCBmb3IgdGhlIGZpcnN0IGVsZW1lbnQKLSAgICAgIGlmKChleHRFbGVtcyA9PSBudWxsKSB8fCAoZXh0RWxlbXMuc2l6ZSgpID09IDApIHx8IAotICAgICAgICAgIShleHRFbGVtcy5nZXQoMCkgaW5zdGFuY2VvZiBNSU1FTXVsdGlwYXJ0UmVsYXRlZCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICAKLSAgICAgIC8vIGdldCBsaXN0IG1pbWUgcGFydHMgZnJvbSBkZWZpbml0aW9uCi0gICAgICBNSU1FTXVsdGlwYXJ0UmVsYXRlZCBtaW1lID0gKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBleHRFbGVtcy5nZXQoMCk7Ci0gICAgICBMaXN0IHBhcnRzID0gbWltZS5nZXRNSU1FUGFydHMoKTsKLSAgICAgIAotICAgICAgLy8gc2tpcCByb290IHBhcnQKLSAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFydHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IGdldE1JTUVDb250ZW50UGFydCgoTUlNRVBhcnQpIHBhcnRzLmdldChpKSk7Ci0gICAgICAgIC8vIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgTUlNRSBwYXJ0Ci0gICAgICAgIGlmIChmaW5kTUlNRVBhcnQobWltZVBhcnRzLmdldFBhcnRzKCksIHBhcnROYW1lKSA9PSBudWxsKSAKLSAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgY29ycmVzcG9uZGluZyBiaW5kaW5nICIgKwotICAgICAgICAgICAgICAib3BlcmF0aW9uIFwiIiArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpICsgCi0gICAgICAgICAgICAgICJcIiBkb2VzIG5vdCBjb250YWluIHBhcnQgXCIiICsgcGFydE5hbWUgKyAiXCIiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gCi0gICAgICAgIHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIGZpbmQgY29ycmVzcG9uZGluZyBNSU1FIHBhcnQKLSAgICogQHBhcmFtIHBhcnRzIGFycmF5IG9mIHNvYXAgTUlNRSBwYXJ0cwotICAgKiBAcGFyYW0gcGFydE5hbWUgcGFydCBuYW1lIHRvIGZpbmQKLSAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIE1JTUUgcGFydCAiQ29udGVudC1JRCIgdmFsdWUsIAotICAgKiBpZiB0aGUgcGFydCBkb2VzbnQgZm91bmQsIHJldHVucyBudWxsCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBmaW5kTUlNRVBhcnQoQ29sbGVjdGlvbiBwYXJ0cywgU3RyaW5nIHBhcnROYW1lKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24sIEFzc2VydGlvbkZhaWxFeGNlcHRpb24KLSAgewotICAgIGlmKHBhcnROYW1lID09IG51bGwpCi0gICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgSXRlcmF0b3IgaXBhcnRzID0gcGFydHMuaXRlcmF0b3IoKTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgd2hpbGUgKGlwYXJ0cy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgaSA9IGkgKyAxOwotICAgICAgTWltZVBhcnQgcGFydCA9IChNaW1lUGFydClpcGFydHMubmV4dCgpOwotICAgICAgU3RyaW5nIG1fcGFydE5hbWUgPSBNSU1FVXRpbHMuZ2V0TWltZUhlYWRlckF0dHJpYnV0ZSgKLSAgICAgICAgICBwYXJ0LmdldEhlYWRlcnMoKSwgTUlNRUNvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9JRCk7Ci0KLSAgICAgIC8vIGNoZWNrIHZhbHVlIGZvcm1hdCA8cGFydG5hbWU9VUlEQGhvc3RuYW1lPgotICAgICAgaWYgKChtX3BhcnROYW1lICE9IG51bGwpICYmIG1fcGFydE5hbWUuc3RhcnRzV2l0aCgiPCIpICYmIG1fcGFydE5hbWUuZW5kc1dpdGgoIj4iKSkgCi0gICAgICB7Ci0gICAgICAgIGludCBpZHgsIGF0SWR4OwotICAgICAgICBTdHJpbmcgZW5QYXJ0TmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB1aWQgPSBudWxsOwotICAgICAgICBTdHJpbmcgaG9zdCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgcGFydCBuYW1lIGZyb20gY29udGVudC1pZAotICAgICAgICBpZiAoKGlkeCA9IG1fcGFydE5hbWUuaW5kZXhPZigiPSIpKSAhPSAtMSkgCi0gICAgICAgIHsKLSAgICAgICAgICBlblBhcnROYW1lID0gZW5jb2RlUGFydE5hbWUobV9wYXJ0TmFtZS5zdWJzdHJpbmcoMSwgaWR4KSk7IAotICAgICAgICB9Ci0gICAgICAgIC8vIGdldCB1aWQgYW5kIGhvc3RuYW1lIGZyb20gY29udGVudC1pZAotICAgICAgICBpZiAoKChhdElkeCA9IG1fcGFydE5hbWUuaW5kZXhPZigiQCIpKSAhPSAtMSkgJiYgKGF0SWR4ID4gaWR4KSkgCi0gICAgICAgIHsKLSAgICAgICAgICB1aWQgPSBtX3BhcnROYW1lLnN1YnN0cmluZyhpZHgrMSwgYXRJZHgpOwotICAgICAgICAgIGhvc3QgPSBtX3BhcnROYW1lLnN1YnN0cmluZyhhdElkeCsxLCBtX3BhcnROYW1lLmxlbmd0aCgpLTEpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIHBhcnQgbmFtZXMgbWF0Y2gsIHZhbGlkYXRlIGZvcm1hdAotICAgICAgICBpZigoZW5QYXJ0TmFtZSAhPSBudWxsKSAmJiBlblBhcnROYW1lLmVxdWFscyhwYXJ0TmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZigodWlkID09IG51bGwpIHx8ICh1aWQubGVuZ3RoKCkgPT0gMCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVGhlIFwiQ29udGVudC1JRFwiIGF0dHJpYnV0ZSBvZiB0aGUgcGFydCBcIiIrKGkrMSkrCi0gICAgICAgICAgICAgICAgIlwiY29udGFpbnMgdmFsdWUgXCIiKyBtX3BhcnROYW1lKwotICAgICAgICAgICAgICAgICJcIiB3aGljaCBoYXMgYSBpbmNvcnJlY3QgVUlEIGZvcm1hdCIpOwotICAgICAgICAgIGlmKGhvc3QgPT0gbnVsbCkgCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVGhlIFwiQ29udGVudC1JRFwiIGF0dHJpYnV0ZSBvZiB0aGUgcGFydCBcIiIrKGkrMSkrCi0gICAgICAgICAgICAgICAgIlwiY29udGFpbnMgdmFsdWUgXCIiKyBtX3BhcnROYW1lKwotICAgICAgICAgICAgICAgICJcIiB3aGljaCBoYXMgYSBpbmNvcnJlY3QgaG9zdCBmb3JtYXQiKTsKLSAgICAgICAgICAvLyBjaGVjayBmb3IgbWFsZm9ybWVkIFVSTAotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5ldyBVUkwoIkhUVFAiLCBob3N0LCAiIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVGhlIFwiQ29udGVudC1JRFwiIGF0dHJpYnV0ZSBvZiB0aGUgcGFydCBcIiIrKGkrMSkrCi0gICAgICAgICAgICAgICAgIlwiY29udGFpbnMgdmFsdWUgXCIiKyBtX3BhcnROYW1lKwotICAgICAgICAgICAgICAgICJcIiB3aGljaCBoYXMgYSBpbmNvcnJlY3QgaG9zdCBmb3JtYXQiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIG1fcGFydE5hbWU7Ci0gICAgICAgIH0gCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgcGFydCB2YWx1ZSBmcm9tIE1JTUVDb250ZW50IGVsZW1lbnQKLSAgICogQHBhcmFtIHBhcnQgTUlNRVBhcnQgZWxlbWVudAotICAgKiBAcmV0dXJuIHRoZSBwYXJ0IHZhbHVlIGZyb20gTUlNRUNvbnRlbnQgZWxlbWVudAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TUlNRUNvbnRlbnRQYXJ0KE1JTUVQYXJ0IHBhcnQpIAotICB7Ci0gICAgTGlzdCBsaXN0ID0gcGFydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBpZihsaXN0LnNpemUoKSA9PSAwKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuICgoTUlNRUNvbnRlbnQpIGxpc3QuZ2V0KDApKS5nZXRQYXJ0KCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBFbmNvZGUgc3RyaW5nIGZyb20gJUhIIHRvIFVURgotICAgKiBAcGFyYW0gc3RyIHN0cmluZwotICAgKiBAcmV0dXJuIGVuY29kZWQgc3RyaW5nIGZyb20gJUhIIGZvcm1hdAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlUGFydE5hbWUoU3RyaW5nIHN0cikgewotICAgIFN0cmluZ0J1ZmZlciByZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIGlmKChzdHIuY2hhckF0KGkpID09ICclJykgJiYgKHN0ci5sZW5ndGgoKSA+IGkrMikpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludCgKLSAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2Yoc3RyLmNoYXJBdChpKzEpKSArCi0gICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHN0ci5jaGFyQXQoaSsyKSksIDE2KTsKLSAgICAgICAgICByZXMuYXBwZW5kKChjaGFyKSB2YWx1ZSk7Ci0gICAgICAgICAgaSArPTI7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpe30KLSAgICAgIH0gCi0gICAgICBlbHNlIAotICAgICAgewotICAgICAgICByZXMuYXBwZW5kKHN0ci5jaGFyQXQoaSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzLnRvU3RyaW5nKCk7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTM0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkzNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzA2MDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTM0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NSU1FQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1JTUVVdGlsczsKLQotLyoqCi0gKiBBUDE5MzQKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgcGFydCBvZiBhIG11bHRpcGFydC9yZWxhdGVkIG1lc3NhZ2U8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgZmllbGQgb2YgYSBwYXJ0IGluIGEKLSAqIG11bHRpcGFydC9yZWxhdGVkIG1lc3NhZ2UgaGFzIGEgdmFsdWUgb2YgIjdiaXQiLCAiOGJpdCIsICJiaW5hcnkiLAotICogInF1b3RlZC1wcmludGFibGUiIG9yICJiYXNlNjQiLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDE5MzQgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBUDE5MzQoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gY2hlY2sgZm9yIG11bHRpcGFydC9yZWxhdGVkIGNvbnRlbnQgdHlwZQotICAgIGlmKCFlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuaXNNaW1lQ29udGVudCgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfSAKLSAgICBlbHNlIAotICAgIHsKLSAgICAgIC8vIGdldCBNSU1FIHBhcnRzCi0gICAgICBNaW1lUGFydHMgcGFydHMgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWltZVBhcnRzKCk7Ci0gICAgICBpZihwYXJ0cy5jb3VudCgpID09IDApIAotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCUl0ZXJhdG9yIGlwYXJ0cyA9IHBhcnRzLmdldFBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgLy8gY2hlY2sgZWFjaCBwYXJ0IGZvciB0aGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBmaWVsZAotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChpcGFydHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgTWltZVBhcnQgcGFydCA9IChNaW1lUGFydClpcGFydHMubmV4dCgpOwotICAgICAgICAgIFN0cmluZyB0eXBlX3ZhbHVlID0gTUlNRVV0aWxzLmdldE1pbWVIZWFkZXJBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgIHBhcnQuZ2V0SGVhZGVycygpLAotICAgICAgICAgICAgICBNSU1FQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HKTsKLSAgICAgICAgICBpZiAodHlwZV92YWx1ZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKCh0eXBlX3ZhbHVlID09IG51bGwpIHx8ICEodHlwZV92YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCI3Yml0IikgfHwKLSAgICAgICAgICAgICAgICB0eXBlX3ZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIjhiaXQiKSB8fCAKLSAgICAgICAgICAgICAgICB0eXBlX3ZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoImJhc2U2NCIpIHx8Ci0gICAgICAgICAgICAgICAgdHlwZV92YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJxdW90ZWQtcHJpbnRhYmxlIikgfHwKLSAgICAgICAgICAgICAgICB0eXBlX3ZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoImJpbmFyeSIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgICAgICIoIiArIChpKzEpICsKLSAgICAgICAgICAgICAgICAgICIpLCBwYXJ0IGhlYWRlciBmaWVsZCBcIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmdcIiBoYXMgaW5jb3JyZWN0IHZhbHVlIFwiIisKLSAgICAgICAgICAgICAgICAgIHR5cGVfdmFsdWUrIlwiIiwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkzNS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4ZmNlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLQotLyoqCi0gKiBBUDE5MzUKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgcGFydCBvZiBhIG11bHRpcGFydC9yZWxhdGVkIG1lc3NhZ2U8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIGVuY29kaW5nIG9mIHRoZSBib2R5IG9mIGEgcGFydCBpbiBhCi0gKiBtdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlIGNvbmZvcm1zIHRvIHRoZSBlbmNvZGluZyBpbmRpY2F0ZWQgYnkgdGhlCi0gKiBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGZpZWxkLXZhbHVlLAotICogYXMgc3BlY2lmaWVkIGJ5IFJGQzIwNDUuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMTkzNSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMTkzNShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBpZighZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0gCi0gICAgZWxzZSAKLSAgICB7Ci0gICAgICAvLyBnZXQgTUlNRSBwYXJ0cwotICAgICAgTWltZVBhcnRzIHBhcnRzID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1pbWVQYXJ0cygpOwotICAgICAgaWYocGFydHMuY291bnQoKSA9PSAwKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBjaGVjayBlYWNoIHBhcnQgZm9yIHRoZSBlbmNvZGluZyBtYXRjaAotICAgICAgCUl0ZXJhdG9yIGlwYXJ0cyA9IHBhcnRzLmdldFBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIAlpbnQgaSA9IDA7Ci0gICAgICAJTWltZVBhcnQgcm9vdCA9IHBhcnRzLmdldFJvb3RQYXJ0KCk7Ci0gICAgICAgIHdoaWxlIChpcGFydHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaSA9IGkgPSAxOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgCU1pbWVQYXJ0IHBhcnQgPSAoTWltZVBhcnQpaXBhcnRzLm5leHQoKTsKLSAgICAgICAgCQotICAgICAgICAgICAgLy8gZ2V0IGVuY29kaW5nIGZyb20gaGVhZGVyCi0gICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSAgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJBdHRyaWJ1dGUocGFydC5nZXRIZWFkZXJzKCksIAotICAgICAgICAgICAgCUhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkcpOwotICAgICAgICAgIAotICAgICAgICAgICAJaWYgKChwYXJ0ID09IHJvb3QpIHx8IAotICAgICAgICAgICAJCSgoZW5jb2RpbmcgIT0gbnVsbCkgJiYgZW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiYmFzZTY0IikpKQotICAgICAgICAgICAgICBjaGVja1BhcnQocGFydCwgZW5jb2RpbmcsIGZhbHNlKTsKLSAgICAgICAgICAJZWxzZSAKLSAgICAgICAgICAJICBjaGVja1BhcnQocGFydCwgZW5jb2RpbmcsIHRydWUpOwotICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgICAicGFydCAiKyhpKzEpKyIgRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLSAgLyoqCi0gICAqIENoZWNrIG1lc3NhZ2UgZW50cnkgdG8gZW5jb2RpbmcgY29uZm9ybWl0eSAKLSAgICogQHBhcmFtIGVudHJ5IG1lc3NhZ2UgZW50cnkKLSAgICogQHRocm93cyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGlmIG1lc3NhZ2UgZG9lcyBub3QgZW5jb2RpbmcgY29uZm9ybWl0eSAgCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFydChNaW1lUGFydCBwYXJ0LCBTdHJpbmcgIGVuY29kaW5nLCBib29sZWFuIGVuY29kZWQpIAotICAgIHRocm93cyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uLCBXU0lFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBjb250ZW50ID0gbnVsbDsKLSAgICBpZiAoZW5jb2RlZCkKLSAgICAgICBjb250ZW50ID0gbmV3IFN0cmluZyhVdGlscy5kZWNvZGVCYXNlNjQocGFydC5nZXRDb250ZW50KCkpKTsKLSAgICAgZWxzZQotICAgIAljb250ZW50ID0gcGFydC5nZXRDb250ZW50KCk7Ci0gICAgCi0gICAgaWYoZW5jb2RpbmcgPT0gbnVsbCkgCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAvLyBjaGVjayA3Yml0Ci0gICAgfSBlbHNlIGlmKGVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIjdiaXQiKSkgewotICAgICAgY2hlY2tPbjdiaXQoY29udGVudCk7Ci0gICAgLy8gY2hlY2sgOGJpdAotICAgIH0gZWxzZSBpZihlbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCI4Yml0IikpIHsKLSAgICAgIGNoZWNrT244Yml0KGNvbnRlbnQpOwotICAgIC8vIGNoZWNrIHF1b3RlZC1wcmludGFibGUKLSAgICB9IGVsc2UgaWYoZW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgicXVvdGVkLXByaW50YWJsZSIpKSB7Ci0gICAgICBjaGVja09uUXVvdGVkUHJpbnRhYmxlKGNvbnRlbnQpOwotICAgIC8vIGNoZWNrIGJhc2U2NAotICAgIH0gZWxzZSBpZihlbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJiYXNlNjQiKSkgewotICAgICAgY2hlY2tPbkJhc2U2NChjb250ZW50KTsKLSAgICB9Ci0gICAgLy8gd2UgZG9udCBjaGVjayBiaW5hcnkgZW5jb2RpbmcsIHNpbmNlIG1lc3NhZ2UgY2FuIGNvbnRhaW5zIGFueSBjaGFycyAKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSBhIDdiaXQgZW5jb2RlZCBtZXNzYWdlIChSRkMyMDQ1KQotICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGNoZWNrCi0gICAqIEB0aHJvd3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBpZiBtZXNzYWdlIGRvZXMgbm90IGNvbmZvcm0KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja09uN2JpdChTdHJpbmcgbWVzc2FnZSkgCi0gICAgdGhyb3dzIEFzc2VydGlvbkZhaWxFeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1tdIHN0cnMgPSBzcGxpdChtZXNzYWdlKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIHN0ciA9IHN0cnNbaV07Ci0gICAgICAKLSAgICAgIC8vIGNoZWNrIHN0cmluZyBsZW5ndGgKLSAgICAgIGlmKHN0ci5sZW5ndGgoKSA+IDk5OCkgCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgbGVuZ3RoICgiICsgc3RyLmxlbmd0aCgpICsgCi0gICAgICAgICAgICAiKSBvZiB0aGUgbGluZSAoIiArIChpKzEpICsgIikgZ3JlYXRlciB0aGFuIDk5OCIpOwotICAgICAgfQotICAgICAgLy8gTm8gb2N0ZXRzIHdpdGggZGVjaW1hbCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNwotICAgICAgLy8gYXJlIGFsbG93ZWQgYW5kIG5laXRoZXIgYXJlIE5VTHMgKG9jdGV0cyB3aXRoIGRlY2ltYWwgdmFsdWUgMCkuICBDUgotICAgICAgLy8oZGVjaW1hbCB2YWx1ZSAxMykgYW5kIExGIChkZWNpbWFsIHZhbHVlIDEwKSBvY3RldHMgb25seSBvY2N1ciBhcwotICAgICAgLy8gcGFydCBvZiBDUkxGIGxpbmUgc2VwYXJhdGlvbiBzZXF1ZW5jZXMuCi0gICAgICBjaGFyW10gY2hhcnMgPSBzdHIudG9DaGFyQXJyYXkoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hhcnMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGlmKChjaGFyc1tqXSA+IDEyNykgfHwgKGNoYXJzW2pdID09IDApIHx8IAotICAgICAgICAgICAgKGNoYXJzW2pdID09IDEwKSB8fCAoY2hhcnNbal0gPT0gMTMpKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBjaGFyICgiICsgY2hhcnNbal0gKyAKLSAgICAgICAgICAgICAgIilbY29kZT0iICsgKGJ5dGUpIGNoYXJzW2pdICsgIiBwb3NpdGlvbj0iICsgaiArIAotICAgICAgICAgICAgICAiXSBkb2VzIG5vdCBhbGxvd3MgaW4gN2JpdCBlbmNvZGluZyBjb250ZW50Iik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgYW4gOGJpdCBlbmNvZGVkIG1lc3NhZ2UgKFJGQzIwNDUpCi0gICAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2UgdG8gY2hlY2sKLSAgICogQHRocm93cyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGlmIG1lc3NhZ2UgZG9lcyBub3QgY29uZm9ybQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrT244Yml0KFN0cmluZyBtZXNzYWdlKSAKLSAgICB0aHJvd3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nW10gc3RycyA9IHNwbGl0KG1lc3NhZ2UpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Rycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gc3Ryc1tpXTsKLSAgICAgIAotICAgICAgLy8gY2hlY2sgc3RyaW5nIGxlbmd0aAotICAgICAgaWYoc3RyLmxlbmd0aCgpID4gOTk4KSAKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBsZW5ndGggKCIgKyBzdHIubGVuZ3RoKCkgKyAKLSAgICAgICAgICAgICIpIG9mIHRoZSBsaW5lICgiICsgKGkrMSkgKyAiKSBncmVhdGVyIHRoYW4gOTk4Iik7Ci0gICAgICB9Ci0gICAgICAvLyBvY3RldHMgd2l0aCBkZWNpbWFsIHZhbHVlcyBncmVhdGVyIHRoYW4gMTI3Ci0gICAgICAvLyBtYXkgYmUgdXNlZC4gIEFzIHdpdGggIjdiaXQgZGF0YSIgQ1IgYW5kIExGIG9jdGV0cyBvbmx5IG9jY3VyIGFzIHBhcnQKLSAgICAgIC8vIG9mIENSTEYgbGluZSBzZXBhcmF0aW9uIHNlcXVlbmNlcyBhbmQgbm8gTlVMcyBhcmUgYWxsb3dlZC4gCi0gICAgICBjaGFyW10gY2hhcnMgPSBzdHIudG9DaGFyQXJyYXkoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hhcnMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGlmKChjaGFyc1tqXSA9PSAwKSB8fCAoY2hhcnNbal0gPT0gMTApIHx8IChjaGFyc1tqXSA9PSAxMykpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGNoYXIgKCIgKyBjaGFyc1tqXSArIAotICAgICAgICAgICAgICAiKVtjb2RlPSIgKyAoYnl0ZSkgY2hhcnNbal0gKyAiIHBvc2l0aW9uPSIgKyBqICsgCi0gICAgICAgICAgICAgICJdIGRvZXMgbm90IGFsbG93cyBpbiA4Yml0IGVuY29kaW5nIGNvbnRlbnQiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSBhIHF1b3RlZC1wcmludGFibGUgZW5jb2RlZCBtZXNzYWdlIChSRkMyMDQ1KQotICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGNoZWNrCi0gICAqIEB0aHJvd3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBpZiBtZXNzYWdlIGRvZXMgbm90IGNvbmZvcm0KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja09uUXVvdGVkUHJpbnRhYmxlKFN0cmluZyBtZXNzYWdlKQotICAgIHRocm93cyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmdbXSBzdHJzID0gc3BsaXQobWVzc2FnZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIC8vIGNoZWNrIGxlbmd0aAotICAgICAgLy8gUkZDMjA0NQotICAgICAgLy8gKDUpICAgKFNvZnQgTGluZSBCcmVha3MpIFRoZSBRdW90ZWQtUHJpbnRhYmxlIGVuY29kaW5nCi0gICAgICAvL1JFUVVJUkVTIHRoYXQgZW5jb2RlZCBsaW5lcyBiZSBubyBtb3JlIHRoYW4gNzYKLSAgICAgIC8vY2hhcmFjdGVycyBsb25nLiAgSWYgbG9uZ2VyIGxpbmVzIGFyZSB0byBiZSBlbmNvZGVkCi0gICAgICAvL3dpdGggdGhlIFF1b3RlZC1QcmludGFibGUgZW5jb2RpbmcsICJzb2Z0IiBsaW5lIGJyZWFrcwotICAgICAgLy9tdXN0IGJlIHVzZWQuICBBbiBlcXVhbCBzaWduIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBvbiBhCi0gICAgICAvL2VuY29kZWQgbGluZSBpbmRpY2F0ZXMgc3VjaCBhIG5vbi1zaWduaWZpY2FudCAoInNvZnQiKQotICAgICAgLy9saW5lIGJyZWFrIGluIHRoZSBlbmNvZGVkIHRleHQuCi0gICAgICBpZigoKHN0cnNbaV0uaW5kZXhPZigiXHQiKSAhPSAtMSkgfHwgKHN0cnNbaV0uaW5kZXhPZigiICIpICE9IC0xKSkgJiYKLSAgICAgICAgICAoc3Ryc1tpXS5sZW5ndGgoKSA+IDc2KSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBsZW5ndGggKCIgKyBzdHJzW2ldLmxlbmd0aCgpICsgCi0gICAgICAgICAgICAiKSBvZiB0aGUgbGluZSAoIiArIChpKzEpICsgCi0gICAgICAgICAgICAiKSBncmVhdGVyIHRoYW4gNzYsIFwic29mdFwiIGxpbmUgYnJlYWtzIG11c3QgYmUgdXNlZCIpOwotICAgICAgfQotCi0gICAgICBjaGFyW10gY2hhcnMgPSBzdHJzW2ldLnRvQ2hhckFycmF5KCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoYXJzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICAvLygxKSAgIChHZW5lcmFsIDhiaXQgcmVwcmVzZW50YXRpb24pIEFueSBvY3RldCwgZXhjZXB0IGEgQ1Igb3IKLSAgICAgICAgLy9MRiB0aGF0IGlzIHBhcnQgb2YgYSBDUkxGIGxpbmUgYnJlYWsgb2YgdGhlIGNhbm9uaWNhbAotICAgICAgICAvLyhzdGFuZGFyZCkgZm9ybSBvZiB0aGUgZGF0YSBiZWluZyBlbmNvZGVkLCBtYXkgYmUKLSAgICAgICAgLy9yZXByZXNlbnRlZCBieSBhbiAiPSIgZm9sbG93ZWQgYnkgYSB0d28gZGlnaXQKLSAgICAgICAgLy9oZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2N0ZXQncyB2YWx1ZS4gIFRoZQotICAgICAgICAvL2RpZ2l0cyBvZiB0aGUgaGV4YWRlY2ltYWwgYWxwaGFiZXQsIGZvciB0aGlzIHB1cnBvc2UsCi0gICAgICAgIC8vYXJlICIwMTIzNDU2Nzg5QUJDREVGIi4gIFVwcGVyY2FzZSBsZXR0ZXJzIG11c3QgYmUKLSAgICAgICAgLy91c2VkOyBsb3dlcmNhc2UgbGV0dGVycyBhcmUgbm90IGFsbG93ZWQuICBUaHVzLCBmb3IKLSAgICAgICAgLy9leGFtcGxlLCB0aGUgZGVjaW1hbCB2YWx1ZSAxMiAoVVMtQVNDSUkgZm9ybSBmZWVkKSBjYW4KLSAgICAgICAgLy9iZSByZXByZXNlbnRlZCBieSAiPTBDIiwgYW5kIHRoZSBkZWNpbWFsIHZhbHVlIDYxIChVUy0KLSAgICAgICAgLy9BU0NJSSBFUVVBTCBTSUdOKSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgIj0zRCIuICBUaGlzCi0gICAgICAgIC8vcnVsZSBtdXN0IGJlIGZvbGxvd2VkIGV4Y2VwdCB3aGVuIHRoZSBmb2xsb3dpbmcgcnVsZXMKLSAgICAgICAgLy9hbGxvdyBhbiBhbHRlcm5hdGl2ZSBlbmNvZGluZy4KLSAgICAgICAgLy8gKDIpICAgKExpdGVyYWwgcmVwcmVzZW50YXRpb24pIE9jdGV0cyB3aXRoIGRlY2ltYWwgdmFsdWVzIG9mCi0gICAgICAgIC8vMzMgdGhyb3VnaCA2MCBpbmNsdXNpdmUsIGFuZCA2MiB0aHJvdWdoIDEyNiwgaW5jbHVzaXZlLAotICAgICAgICAvL01BWSBiZSByZXByZXNlbnRlZCBhcyB0aGUgVVMtQVNDSUkgY2hhcmFjdGVycyB3aGljaAotICAgICAgICAvL2NvcnJlc3BvbmQgdG8gdGhvc2Ugb2N0ZXRzIChFWENMQU1BVElPTiBQT0lOVCB0aHJvdWdoCi0gICAgICAgIC8vTEVTUyBUSEFOLCBhbmQgR1JFQVRFUiBUSEFOIHRocm91Z2ggVElMREUsCi0gICAgICAgIC8vcmVzcGVjdGl2ZWx5KS4KLSAgICAgICAgaWYoKGNoYXJzW2pdID09IDYxKSAmJiAoY2hhcnMubGVuZ3RoID4gaisyKSkgCi0gICAgICAgIHsKLSAgICAgICAgICBpZighaXNIZXgoY2hhcnNbaisxXSkgfHwgIWlzSGV4KGNoYXJzW2orMl0pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJ0aGUgcXVvdGVkIGNoYXIgKCIgKyAKLSAgICAgICAgICAgICAgICAgY2hhcnNbal0gKyBjaGFyc1tqKzFdICsgY2hhcnNbaisyXSArICIpIGlzIGluY29ycmVjdCIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqICs9IDI7Ci0gICAgICAgICAgfQotICAgICAgICB9IAotICAgICAgICAvLyBjaGVjayBmb3Igc3BhY2UgYW5kIHRhYgotICAgICAgICBlbHNlIGlmKChjaGFyc1tqXSAhPSA5KSAmJiAoY2hhcnNbal0gIT0gMzIpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gY2hlY2sgaW52YWxpZCBzeW1ib2wKLSAgICAgICAgICBpZigoY2hhcnNbal0gPT0gMCkgfHwgKGNoYXJzW2pdID09IDEwKSB8fCAoY2hhcnNbal0gPT0gMTMpIHx8Ci0gICAgICAgICAgICAgKGNoYXJzW2pdIDwgMzMpIHx8IChjaGFyc1tqXSA+IDEyNikgfHwgKGNoYXJzW2pdID09IDYxKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGNoYXIgKCIgKyBjaGFyc1tqXSArIAotICAgICAgICAgICAgICAgICIpW2NvZGU9IiArIChieXRlKSBjaGFyc1tqXSArICIgcG9zaXRpb249IiArIGogKyAKLSAgICAgICAgICAgICAgICAiXSBtdXN0IGJlIHF1b3RlZCIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSBhIGJhc2U2NCBlbmNvZGVkIG1lc3NhZ2UgKFJGQzM1NDgpCi0gICAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2UgdG8gY2hlY2sKLSAgICogQHRocm93cyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGlmIG1lc3NhZ2UgZG9lcyBub3QgY29uZm9ybQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrT25CYXNlNjQoU3RyaW5nIG1lc3NhZ2UpCi0gIHRocm93cyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmdbXSBzdHJzID0gc3BsaXQobWVzc2FnZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHIgPSBzdHJzW2ldOwotICAgICAgCi0gICAgICAvLyBjaGVjayBzdHJpbmcgbGVuZ3RoCi0gICAgICBpZihzdHIubGVuZ3RoKCkgPiA3NikgCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgbGVuZ3RoICgiICsgc3RyLmxlbmd0aCgpICsgCi0gICAgICAgICAgICAiKSBvZiB0aGUgbGluZSAoIiArIChpKzEpICsgIikgZ3JlYXRlciB0aGFuIDk5OCIpOwotICAgICAgfQotICAgICAgLy8gY2hlY2sgZm9yICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2VmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LysiCi0gICAgICBjaGFyW10gY2hhcnMgPSBzdHIudG9DaGFyQXJyYXkoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hhcnMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGNoYXIgYyA9IGNoYXJzW2ldOwotICAgICAgICBpZigoYyA8IDQ3KSB8fCAoYyA+IDEyMikgfHwgKChjID4gNTcpICYmIChjIDwgNjUpKSB8fCAKLSAgICAgICAgICAgKChjID4gOTApICYmIChjIDwgOTcpKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgY2hhciAoIiArIGNoYXJzW2pdICsgCi0gICAgICAgICAgICAgICIpW2NvZGU9IiArIChieXRlKSBjaGFyc1tqXSArICIgcG9zaXRpb249IiArIGogKyAKLSAgICAgICAgICAgICAgIl0gZG9lcyBub3QgYWxsb3dzIGluIGJhc2U2NCBlbmNvZGluZyBjb250ZW50Iik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBzcGxpdCBzdHJpbmcgdG8gYXJyYXkgb2Ygc3RyaW5ncyBhbmQgdXNlIGFzIGRlbGltZXRlciBDUkxGCi0gICAqIEBwYXJhbSBzdHIgb3JpZ2luYWwgc3RyaW5nCi0gICAqIEByZXR1cm4gYXJyYXkgb2Ygc3RyaW5ncwotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmdbXSBzcGxpdChTdHJpbmcgc3RyKQotICB7Ci0gICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yKGludCBpZHggPSBzdHIuaW5kZXhPZigiXHJcbiIpOyBpZHggIT0gLTE7IGlkeCA9IHN0ci5pbmRleE9mKCJcclxuIikpCi0gICAgewotICAgICAgbGlzdC5hZGQoc3RyLnN1YnN0cmluZygwLCBpZHgpKTsKLSAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoaWR4KzIpOwotICAgIH0KLSAgICBsaXN0LmFkZChzdHIpOwotICAgIHJldHVybiAoU3RyaW5nW10pIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgYnl0ZSBpcyAiMDEyMzQ1Njc4OUFCQ0RFRiIgcmFuZ2UsIGZhbHNlIG90aGV3aXNlCi0gICAqIEBwYXJhbSBjIGNoYXIKLSAgICogQHJldHVybiB0cnVlIGlmIGJ5dGUgaXMgIjAxMjM0NTY3ODlBQkNERUYiIHJhbmdlLCBmYWxzZSBvdGhld2lzZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzSGV4KGNoYXIgYykgewotICAgIHJldHVybiAoKChjID49IDQ4KSAmJiAoYyA8PSA1NykpIHx8ICgoYyA+PSA2NSkgJiYgKGMgPD0gNzApKSk7IAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MzYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTM2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOGFlNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMTkzNgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG11bHRpcGFydC9yZWxhdGVkIG1lc3NhZ2U8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+SW4gYSBtZXNzYWdlLCBhbGwgTUlNRSBlbmNhcHN1bGF0aW9uIGJvdW5kYXJ5IHN0cmluZ3MgCi0gKiBhcmUgcHJlY2VkZWQgd2l0aCB0aGUgYXNjaWkgY2hhcmFjdGVycyBDUiAoMTMpIGFuZCBMRiAoMTApIAotICogaW4gdGhhdCBzZXF1ZW5jZS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAxOTM2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQVAxOTM2KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIGlmIGJvdW5kYXJ5IGVxdWFscyBudWxsLCB0aGVuIHJlc3VsdCBpcyBub3QgYXBwbGljYWJsZQotICAgIGlmICghZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0gICAgCi0gICAgLy8gb3RoZXJ3aXNlIGl0IGlzIHRydWUgLS0gY2hlY2tlZCBpbiBtb25pdG9yCi0gICAgLy8gTWltZVBhcnRzIG1pbWVQYXJ0cyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNaW1lUGFydHMoKTsKLSAgICAvLyBJdGVyYXRvciBpID0gbWltZVBhcnRzLmdldFBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAvLyBib29sZWFuIGludmFsaWRCb3VuZGFyeVN0cmluZ0ZvdW5kID0gZmFsc2U7Ci0gICAgLy93aGlsZSAoaS5oYXNOZXh0KCkgJiYgIWludmFsaWRCb3VuZGFyeVN0cmluZ0ZvdW5kKQotICAgIC8vewotICAgIC8vCU1pbWVQYXJ0IHBhcnQgPSAoTWltZVBhcnQpaS5uZXh0KCk7Ci0gICAgLy8JU3RyaW5nW10gYm91bmRhcmllcyA9IHBhcnQuZ2V0Qm91bmRhcnlTdHJpbmdzKCk7Ci0gICAgLy8JZm9yIChpbnQgaiA9IDA7IGo8Ym91bmRhcmllcy5sZW5ndGg7IGorKykKLSAgICAvLwl7Ci0gICAgLy8JCWlmICghYm91bmRhcmllc1tqXS5zdGFydHNXaXRoKCImI3hkO1xuIikpCi0gICAgLy8JCXsKLSAgICAvLwkJCWludmFsaWRCb3VuZGFyeVN0cmluZ0ZvdW5kID0gdHJ1ZTsKLSAgICAvLwkJCXJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgIC8vCQkJZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGJvdW5kYXJpZXNbal0sIGVudHJ5Q29udGV4dCk7Ci0gICAgLy8JCQlicmVhazsKLSAgICAvLwkJfQotICAgIC8vCX0KLSAgICAvL30KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTQyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTk0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI3OTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTUlNRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NSU1FVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBBUDE5NDIKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgcGFydCBvZiBhIG11bHRpcGFydC9yZWxhdGVkIG1lc3NhZ2UgdGhhdCBpcyBib3VuZAotICogdG8gYSBtaW1lOmNvbnRlbnQgdGhhdCByZWZlcnMgdG8gZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24gKHZpYSB0aGUgZWxlbWVudAotICogYXR0cmlidXRlIG9mIHRoZSB3c2RsOnBhcnQgZWxlbWVudCk8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIGJvdW5kIG1lc3NhZ2UgcGFydCBpcyBzZXJpYWxpemVkIHdpdGhpbiB0aGUgTUlNRQotICogcGFydCBhcyBhIHNlcmlhbGl6YXRpb24gb2YgYW4gWE1MIGluZm9zZXQgd2hvc2Ugcm9vdCBlbGVtZW50IGlzIGRlc2NyaWJlZCBieQotICogdGhlIHJlZmVyZW5jZWQgZWxlbWVudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAxOTQyIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAxOTQyKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICghZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSkKLSAgICAgIHsKLSAgICAgIAl0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCU1pbWVQYXJ0cyBtaW1lUGFydHMgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWltZVBhcnRzKCk7Ci0gICAgICAKLSAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBub24tcm9vdCBNSU1FIHBhcnRzCi0gICAgICAgIC8vIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgICAgaWYgKG1pbWVQYXJ0cy5jb3VudCgpPCAyKQotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICAKLSAgICAgICAgLy8gR2V0dGluZyBhbiBvcGVyYXRpb24gbWF0Y2hlZCBmb3IgYSBtZXNzYWdlCi0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IHZhbGlkYXRvci5nZXRPcGVyYXRpb25NYXRjaCgKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSwKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKSk7Ci0gICAgICAgIC8vIElmIG5vIG9uZSBvcGVyYXRpb24gbWF0Y2hlcywgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgICBpZiAoYmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgICAvLyBHZXR0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgYW5kIG1lc3NhZ2UKLSAgICAgICAgTGlzdCBleHRFbGVtczsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlOwotICAgICAgICBpZiAoTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVAotICAgICAgICAgIC5lcXVhbHMoZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgZXh0RWxlbXMgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICA6IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgbWVzc2FnZSA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKSA9PSBudWxsID8gbnVsbAotICAgICAgICAgICAgOiBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGV4dEVsZW1zID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICAgIDogYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgbWVzc2FnZSA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICAgIDogYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQSB2YXJpYWJsZSB0aGF0IGluZGljYXRlcyBhIGJpbmRpbmcgY29udGFpbnMgYXQgbGVhc3Qgb25lCi0gICAgICAgIC8vIG1pbWU6Y29udGVudCBlbGVtZW50IHRoYXQgcmVmZXJzIHRvIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uIAotICAgICAgICBib29sZWFuIG1pbWVDb250ZW50Rm91bmQgPSBmYWxzZTsKLSAgICAgICAgLy8gR29pbmcgdGhyb3VnaCB0aGUgbWVzc2FnZSBNSU1FIHBhcnRzCi0gICAgICAgIEl0ZXJhdG9yIGlNaW1lUGFydHMgPSBtaW1lUGFydHMuZ2V0UGFydHMoKS5pdGVyYXRvcigpOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChpTWltZVBhcnRzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgCSAgaSA9IGkgKyAxOwotICAgICAgICAgIC8vIEdldHRpbmcgYSBNSU1FIHBhcnQKLSAgICAgICAgICBNaW1lUGFydCBtaW1lUGFydCA9IChNaW1lUGFydClpTWltZVBhcnRzLm5leHQoKTsKLSAgICAgICAgICAvLyBHZXR0aW5nIGEgcGFydCBuYW1lIGZvcm0gdGhlIENvbnRlbnQtSUQgaGVhZGVyCi0gICAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gTUlNRVV0aWxzLmdldE1pbWVIZWFkZXJBdHRyaWJ1dGUoCi0gICAgICAgICAgICBtaW1lUGFydC5nZXRIZWFkZXJzKCksIE1JTUVDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfSUQpOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBpZHggPSBwYXJ0TmFtZS5pbmRleE9mKCI9Iik7Ci0gICAgICAgICAgICBpZigoaWR4ICE9IC0xKSAmJiBwYXJ0TmFtZS5zdGFydHNXaXRoKCI8IikpCi0gICAgICAgICAgICAgIHBhcnROYW1lID0gZW5jb2RlUGFydE5hbWUocGFydE5hbWUuc3Vic3RyaW5nKDEsIGlkeCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gQ291bGQgbm90IGV4dHJhY3QgYSBwYXJ0IG5hbWUgZnJvbSB0aGUgaGVhZGVyLAotICAgICAgICAgICAgLy8gcHJvY2VlZCB3aXRoIHRoZSBuZXh0IE1JTUUgcGFydAotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gSWYgdGhlIHBhcnQgaXMgYm91bmQgYnkgYSBtaW1lOmNvbnRlbnQgZWxlbWVudAotICAgICAgICAgIGlmIChib3VuZFRvTWltZUNvbnRlbnQoZXh0RWxlbXMsIHBhcnROYW1lKSAmJiBtZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0dGluZyB0aGUgY29ycmVzcG9uZGluZyBwYXJ0Ci0gICAgICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgbWVzc2FnZS5nZXRQYXJ0cygpLmdldChwYXJ0TmFtZSk7Ci0gICAgICAgICAgICBRTmFtZSByZWZOYW1lOwotICAgICAgICAgICAgLy8gSWYgdGhlIHBhcnQgcmVmZXJzIHRvIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uCi0gICAgICAgICAgICBpZiAocGFydCAhPSBudWxsICYmIChyZWZOYW1lID0gcGFydC5nZXRFbGVtZW50TmFtZSgpKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtaW1lQ29udGVudEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIHBhcnNlIHBhcnQgY29udGVudAotICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBudWxsOwotICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvYyA9IFhNTFV0aWxzLnBhcnNlWE1MKG1pbWVQYXJ0LmdldENvbnRlbnQoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgICAvLyBJZiB0aGUgbWVzc2FnZSBpcyBub3QgYW4gWE1MIGluZm9zZXQsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgYm91bmQgbWVzc2FnZSBwYXJ0IG9mIHRoZSAiCi0gICAgICAgICAgICAgICAgICArICJNSU1FIHBhcnQgbnVtYmVyICIgKyAoaSArIDEpICsgIiBpcyBpbnZhbGlkIFhNTCBpbmZvc2V0LiIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8vIENyZWF0aW5nIGEgUU5hbWUgb2JqZWN0IG9mIHRoZSByb290IGVsZW1lbnQKLSAgICAgICAgICAgICAgUU5hbWUgcm9vdE5hbWUgPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgIC8vIElmIHRoZSBuYW1lcyBvZiB0aGUgcm9vdCBlbGVtZW50IGFuZCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50Ci0gICAgICAgICAgICAgIC8vIGFyZSBub3QgZXF1YWwsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgICAgIGlmICghcmVmTmFtZS5lcXVhbHMocm9vdE5hbWUpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSByb290IGVsZW1lbnQgbmFtZSBpcyAiCi0gICAgICAgICAgICAgICAgICArIHJvb3ROYW1lICsgIiwgdGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBpcyAiCi0gICAgICAgICAgICAgICAgICArIHJlZk5hbWUgKyAiLiIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIElmIG5vIG1pbWU6Y29udGVudFMgZm91bmQsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgICAgaWYgKCFtaW1lQ29udGVudEZvdW5kKQotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB3aGV0aGVyIGEgcGFydCBpcyBib3VuZCBieSBhIG1pbWU6Y29udGVudCBlbGVtZW50LgotICAgKiBAcGFyYW0gZXh0RWxlbXMgYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBwYXJ0IGEgcGFydCBuYW1lLgotICAgKiBAcmV0dXJuIHRydWUgaWYgYSBwYXJ0IGlzIGJvdW5kIGJ5IG1pbWU6Y29udGVudCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGJvdW5kVG9NaW1lQ29udGVudChMaXN0IGV4dEVsZW1zLCBTdHJpbmcgcGFydCkKLSAgewotICAgIGlmIChleHRFbGVtcyAhPSBudWxsICYmIGV4dEVsZW1zLnNpemUoKSA+IDApCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbXMuZ2V0KDApOwotICAgICAgLy8gRXhwZWN0ZWQgdGhlIGZpcnN0IGV4dCBlbGVtIGlzIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICB7Ci0gICAgICAgIC8vIEdldHRpbmcgdGhlIG1pbWU6cGFydCBlbGVtZW50cyBvZiB0aGUgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgIExpc3QgbWltZVBhcnRzID0gKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbSkuZ2V0TUlNRVBhcnRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWltZVBhcnRzLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgbWltZTpwYXJ0IGVsZW1lbnQgbmVlZGVkCi0gICAgICAgICAgTGlzdCBlbGVtcyA9ICgoTUlNRVBhcnQpIG1pbWVQYXJ0cy5nZXQoaSkpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgIGlmIChlbGVtcy5zaXplKCkgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IGVsZW1lbnQKLSAgICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVsZW0gPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVsZW1zLmdldCgwKTsKLSAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIG1pbWU6Y29udGVudCBhbmQgaXQgYmluZHMgYSBwYXJ0Ci0gICAgICAgICAgICBpZiAoZWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX01JTUVfQ09OVEVOVCkKLSAgICAgICAgICAgICAgJiYgcGFydC5lcXVhbHMoKChNSU1FQ29udGVudCllbGVtKS5nZXRQYXJ0KCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogRW5jb2RlIHN0cmluZyBmcm9tICVISCB0byBVVEYKLSAgICogQHBhcmFtIHN0ciBzdHJpbmcKLSAgICogQHJldHVybiBlbmNvZGVkIHN0cmluZyBmcm9tICVISCBmb3JtYXQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGVuY29kZVBhcnROYW1lKFN0cmluZyBzdHIpIHsKLSAgICBTdHJpbmdCdWZmZXIgcmVzID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBpZigoc3RyLmNoYXJBdChpKSA9PSAnJScpICYmIChzdHIubGVuZ3RoKCkgPiBpKzIpKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGludCB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQoCi0gICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHN0ci5jaGFyQXQoaSsxKSkgKwotICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihzdHIuY2hhckF0KGkrMikpLCAxNik7Ci0gICAgICAgICAgcmVzLmFwcGVuZCgoY2hhcikgdmFsdWUpOwotICAgICAgICAgIGkgKz0yOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKXt9Ci0gICAgICB9IAotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgcmVzLmFwcGVuZChzdHIuY2hhckF0KGkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlcy50b1N0cmluZygpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5NDUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYmYzMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5NDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci0KLS8qKgotICogQVAxOTQ1Ci0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgbWVzc2FnZTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgQ29udGVudC1UeXBlIEhUVFAgaGVhZGVyIGZpZWxkLXZhbHVlIGluIGEgbWVzc2FnZSAKLSAqIGlzIGVpdGhlciAibXVsdGlwYXJ0L3JlbGF0ZWQiIG9yICJ0ZXh0L3htbCIuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMTk0NSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEFQMTk0NShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgaGVhZGVyTmFtZSA9IEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRTsKLQotICAgIC8vIEdldHRpbmcgYSBoZWFkZXIKLSAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlckF0dHJpYnV0ZSgKLSAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCksCi0gICAgICAgIGhlYWRlck5hbWUpOwotICAgIC8vIElmIGhlYWRlclZhbHVlIGlzIG51bGwsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICBpZiAoaGVhZGVyVmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0gCi0gICAgLy8gSWYgdGhlIGhlYWRlciBpcyAibXVsdGlwYXJ0L3JlbGF0ZWQiIG9yICJ0ZXh0L3htbCIsCi0gICAgLy8gdGhlbiB0aGUgYXNzZXJ0aW9uIHBhc3NlZAotICAgIGVsc2UgaWYgKGhlYWRlclZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoV1NJQ29uc3RhbnRzLkNPTlRFTlRfVFlQRV9NVUxUSVBBUlQpCi0gICAgICAgIHx8IGhlYWRlclZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoV1NJQ29uc3RhbnRzLkNPTlRFTlRfVFlQRV9URVhUX1hNTCkpCi0gICAgewotICAgIH0KLSAgICAvLyBlbHNlIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgZWxzZSB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICBoZWFkZXJWYWx1ZSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5NDYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjBmMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5NDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMTk0NgotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlCi0gKiBjb250YWluaW5nIG5vbi1yb290IHBhcnRzPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBjYW5kaWRhdGUgbXVsdGlwYXJ0L3JlbGF0ZWQgbWVzc2FnZQotICogY29udGFpbmluZyBub24tcm9vdCBwYXJ0cy48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAxOTQ2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAxOTQ2KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIE1JTUUgcGFydHMsIHRoZSBhc3NlcnRpb24gcGFzc2VkIAotICAgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWltZVBhcnRzKCkuY291bnQoKSA+IDEpCi0gICAgewotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RGV0YWlsRGVzY3JpcHRpb24oKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgLy8gVGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVA1MTAwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQNTEwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTBlNjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVA1MTAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLS8qKgotICogQVA1MTAwCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlICBub24tbXVsdGlwYXJ0L3JlbGF0ZWQgbWVzc2FnZSBpbiB0aGUgbG9nIGZpbGUsIHdpdGggYW4gSFRUUCBlbnRpdHktYm9keS48L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIFNPQVAgZW52ZWxvcGUgaXMgdGhlIGV4Y2x1c2l2ZSBwYXlsb2FkIG9mIHRoZSBIVFRQIGVudGl0eS1ib2R5LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKgotICogQGF1dGhvciBsYXV6b25kCi0gKi8KLXB1YmxpYyBjbGFzcyBBUDUxMDAgZXh0ZW5kcyBTU0JQNTEwMCAKLXsKLQkvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLQkgKiBAcGFyYW0gaW1wbAotCSAqLwotCXB1YmxpYyBBUDUxMDAoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkgCi0JewotCQlzdXBlcihpbXBsKTsKLQl9Ci0KLQlwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotCSAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotCSAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLQkgIHRocm93cyBXU0lFeGNlcHRpb24KLQl7Ci0JICAvLyBJZiB0aGVyZSBpcyBhIFNPQVAgTWVzc2FnZSB3aXRoIEF0dGFjaG1lbnRzLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0JICBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSkKLQkgIHsKLQkgIAlyZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFLCBmYWlsdXJlRGV0YWlsKTsKLQkgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHRlc3RBc3NlcnRpb24sIGVudHJ5Q29udGV4dCk7Ci0JICB9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDUxMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVA1MTAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYTJjYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDUxMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLS8qKgotICogQVA1MTAxCi0gKiA8Y29udGV4dD5Gb3IgYSBub24tbXVsdGlwYXJ0L3JlbGF0ZWQgY2FuZGlkYXRlIG1lc3NhZ2UgaW4gdGhlIGxvZyBmaWxlLjwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BIG1lc3NhZ2UgbXVzdCBoYXZlIGEgIkNvbnRlbnQtVHlwZSIgSFRUUCBoZWFkZXIgZmllbGQuICBUaGUgIkNvbnRlbnQtVHlwZSIgSFRUUCBoZWFkZXIgZmllbGQgbXVzdCBoYXZlIGEgZmllbGQtdmFsdWUgd2hvc2UgbWVkaWEgdHlwZSBpcyAidGV4dC94bWwiLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKiAKLSAqIEBhdXRob3IgbGF1em9uZAotICovCi1wdWJsaWMgY2xhc3MgQVA1MTAxIGV4dGVuZHMgU1NCUDUxMDEgewotCi0JLyoqCi0JICogQHBhcmFtIGltcGwKLQkgKi8KLQlwdWJsaWMgQVA1MTAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpIAotCXsKLQkJc3VwZXIoaW1wbCk7Ci0JfQotCi0JcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLQkgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLQkgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0JICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0JewotCSAgLy8gSWYgdGhlcmUgaXMgYSBTT0FQIE1lc3NhZ2Ugd2l0aCBBdHRhY2htZW50cywgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotCSAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5pc01pbWVDb250ZW50KCkpCi0JICB7Ci0JICAJcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRSwgZmFpbHVyZURldGFpbCk7Ci0JICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBzdXBlci52YWxpZGF0ZSh0ZXN0QXNzZXJ0aW9uLCBlbnRyeUNvbnRleHQpOwotCSAgfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMDAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTAwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWJjYmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMDAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSBwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLk1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAqIEJQMTAwMS4KLSAqIElmIGl0IGlzIGEgcmVxdWVzdCwgdGhlIGFyZyAjMiBvZiBQT1NUIGlzICZsdDtIVFRQLzEuMSZndDsuIElmIGFic2VudCwgZmlyc3QgbGluZSBvZiB0aGUgCi0gKiBib2R5IGlzOiBIVFRQLVZlcnNpb24gPSBIVFRQLzEuMS4gSWYgaXQgaXMgYSByZXNwb25zZSwgaXQgc3RhcnRzIHdpdGggJmx0O0hUVFAvMS4xJmd0Oy4KLSAqLwotcHVibGljIGNsYXNzIEJQMTAwMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAwMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgaHR0cEhlYWRlciA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpOwotCi0gICAgLy8gSWYgdGhpcyBpcyBhIHJlcXVlc3QgbWVzc2FnZSwgdGhlbiBjaGVjayBQT1NUIGhlYWRlcgotICAgIGlmIChlbnRyeUNvbnRleHQKLSAgICAgIC5nZXRNZXNzYWdlRW50cnkoKQotICAgICAgLmdldFR5cGUoKQotICAgICAgLmVxdWFsc0lnbm9yZUNhc2UoTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVCkpCi0gICAgewotICAgICAgVmVjdG9yIHJlcXVlc3RMaW5lOwotICAgICAgaWYgKCgocmVxdWVzdExpbmUgPSB0aGlzLnZhbGlkYXRvci5nZXRQb3N0UmVxdWVzdChodHRwSGVhZGVyKSkgPT0gbnVsbCkKLSAgICAgICAgfHwgKHJlcXVlc3RMaW5lLnNpemUoKSA9PSAwKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG1ldGhvZCA9IChTdHJpbmcpIHJlcXVlc3RMaW5lLmdldCgwKTsKLSAgICAgICAgLy9TdHJpbmcgcmVxdWVzdFVSSSA9IChTdHJpbmcpIHJlcXVlc3RMaW5lLmdldCgxKTsKLSAgICAgICAgU3RyaW5nIGh0dHBWZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdExpbmUuZ2V0KDIpOwotCi0gICAgICAgIC8vRm9yIGVhY2ggcmVxdWVzdCBtZXNzYWdlIHRoYXQgaXMgYW4gSFRUUCBQT1NUCi0gICAgICAgIGlmIChtZXRob2QuZXF1YWxzKE1lc3NhZ2VWYWxpZGF0b3IuSFRUUF9QT1NUKSAmJiBodHRwVmVyc2lvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGh0dHBWZXJzaW9uLmVxdWFscyhNZXNzYWdlVmFsaWRhdG9yLkhUVFBfVkVSU0lPTl8xXzEpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoaHR0cEhlYWRlciwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2UgaXQgbXVzdCBiZSBhIHJlc3BvbnNlCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChodHRwSGVhZGVyLnN0YXJ0c1dpdGgoTWVzc2FnZVZhbGlkYXRvci5IVFRQX1ZFUlNJT05fMV8xKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoaHR0cEhlYWRlciwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTAwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDEwMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2NGMxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTAwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLk1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAqIEJQMTAwMi4KLSAqIElmIGl0IGlzIGEgcmVxdWVzdCwgdGhlIGFyZyAjMiBvZiBQT1NUIGlzICZsdDtIVFRQLzEuMSZndDsgb3IgJmx0O0hUVFAvMS4wJmd0Oy4gSWYgYWJzZW50LCBmaXJzdCBsaW5lIAotICogb2YgdGhlIGJvZHkgaXM6IEhUVFAtVmVyc2lvbiA9IEhUVFAvMS4xLiAob3IgSFRUUC8xLjApLiBJZiBpdCBpcyBhIHJlc3BvbnNlLCBpdCBzdGFydHMgd2l0aCAKLSAqICZsdDtIVFRQLzEuMSZndDsgb3IgJmx0O0hUVFAvMS4wJmd0OyBvciBoaWdoZXI7Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDEwMDIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEwMDIoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGh0dHBIZWFkZXIgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKTsKLQotICAgIC8vIElmIHRoaXMgaXMgYSByZXF1ZXN0IG1lc3NhZ2UsIHRoZW4gY2hlY2sgUE9TVCBmb3IgMS4xIG9yIDEuMAotICAgIGlmIChlbnRyeUNvbnRleHQKLSAgICAgIC5nZXRNZXNzYWdlRW50cnkoKQotICAgICAgLmdldFR5cGUoKQotICAgICAgLmVxdWFsc0lnbm9yZUNhc2UoTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVCkpCi0gICAgewotICAgICAgLy8gR2V0IGVhY2ggZW50cnkgaW4gdGhlIHBvc3QgaGVhZGVyCi0gICAgICBTdHJpbmdUb2tlbml6ZXIgcG9zdE1lc3NhZ2UgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGh0dHBIZWFkZXIsICIgXHJcbiIpOwotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyB0aGlyZCB0b2tlbiwgdGhlbiBmYWlsCi0gICAgICBpZiAocG9zdE1lc3NhZ2UuY291bnRUb2tlbnMoKSA8IDMpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChodHRwSGVhZGVyLCBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBHZXQgdGhlIDNyZCB0b2tlbiAodGhlcmUgbXVzdCBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz8pCi0gICAgICAgIFN0cmluZyBodHRwVmVyc2lvbiA9ICIiOwotICAgICAgICBTdHJpbmcgbWVzc2FnZVR5cGUgPSAiIjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBNZXNzYWdlIHR5cGUKLSAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgbWVzc2FnZVR5cGUgPSBwb3N0TWVzc2FnZS5uZXh0VG9rZW4oKTsKLSAgICAgICAgICBlbHNlIGlmIChpID09IDIpCi0gICAgICAgICAgICBodHRwVmVyc2lvbiA9IHBvc3RNZXNzYWdlLm5leHRUb2tlbigpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBvc3RNZXNzYWdlLm5leHRUb2tlbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtZXNzYWdlVHlwZS5lcXVhbHMoIlBPU1QiKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgdGhpcmQgdG9rZW4gaXMgbm90IEhUVFAvMS4xIG90IEhUVFAvMS4wLCB0aGVuIGZhaWwKLSAgICAgICAgZWxzZSBpZiAoCi0gICAgICAgICAgKCFodHRwVmVyc2lvbi5lcXVhbHNJZ25vcmVDYXNlKE1lc3NhZ2VWYWxpZGF0b3IuSFRUUF9WRVJTSU9OXzFfMSkpCi0gICAgICAgICAgICAmJiAoIWh0dHBWZXJzaW9uLmVxdWFsc0lnbm9yZUNhc2UoTWVzc2FnZVZhbGlkYXRvci5IVFRQX1ZFUlNJT05fMV8wKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChodHRwSGVhZGVyLCBlbnRyeUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gRWxzZSBpdCBpcyBhIHJlc3BvbnNlIG1lc3NhZ2UKLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gUmVzcG9uc2UtTGluZSAoMXN0KSA9IEhUVFAtVmVyc2lvbiBTUCBSZXNwb25zZS1jb2RlIFNQIFJlc3BvbnNlLXRleHQgQ1JMRgotICAgICAgU3RyaW5nVG9rZW5pemVyIGh0dHBNZXNzYWdlVG9rZW5pemVyID0KLSAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihodHRwSGVhZGVyLCAiXG5cclxmIik7Ci0KLSAgICAgIFN0cmluZyBzdGFydExpbmUgPSBudWxsOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChodHRwTWVzc2FnZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzdGFydExpbmUgPSBodHRwTWVzc2FnZVRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBIVFRQIHZlcnNpb24gaW5mbyBleHBlY3RlZCBidXQgbm90IGZvdW5kCi0gICAgICAgICAgLy8gKHN0YXRlIHRoZSBmYWN0IGluIHRoZSBleGNlcHRpb24gbWVzc2FnZT8pCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oaHR0cEhlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayB0aGF0IHByb3RvY29sIHZlcnNpb24gaW5kaWNhdGVzIEhUVFAvMS4wIG9yIEhUVFAvMS4xCi0gICAgICAgIGlmICghc3RhcnRMaW5lLnN0YXJ0c1dpdGgoTWVzc2FnZVZhbGlkYXRvci5IVFRQX1ZFUlNJT05fMV8xKQotICAgICAgICAgICYmICFzdGFydExpbmUuc3RhcnRzV2l0aChNZXNzYWdlVmFsaWRhdG9yLkhUVFBfVkVSU0lPTl8xXzApKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oaHR0cEhlYWRlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTAwNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDEwMDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIwNmFlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTAwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0KLS8qKgotICogQlAxMDA0LiAKLSAqIFRoZSByZXF1ZXN0IG1lc3NhZ2UgaXMgYSBQT1NUIG1lc3NhZ2UsIHdpdGhvdXQgYW55IHVzZSBvZiBmcmFtZXdvcmsgZXh0ZW5zaW9uLgotICovCi1wdWJsaWMgY2xhc3MgQlAxMDA0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMDA0KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBodHRwSGVhZGVyID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCk7Ci0gICAgU3RyaW5nVG9rZW5pemVyIGh0dHBNZXNzYWdlVG9rZW5pemVyID0KLSAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoaHR0cEhlYWRlciwgIlxuXHJcZiIpOwotCi0gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIFBPU1QgbWVzc2FnZQotICAgIGlmICghaHR0cEhlYWRlci5zdGFydHNXaXRoKE1lc3NhZ2VWYWxpZGF0b3IuSFRUUF9QT1NUKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGh0dHBIZWFkZXIsIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIGxpbmUgPSBudWxsOwotICAgIHdoaWxlIChodHRwTWVzc2FnZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkKLSAgICAgICYmIChyZXN1bHQuZXF1YWxzKEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEKSkpCi0gICAgewotICAgICAgbGluZSA9IGh0dHBNZXNzYWdlVG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgaWYgKChsaW5lICE9IG51bGwpCi0gICAgICAgICYmIChsaW5lLnN0YXJ0c1dpdGgoIk0tUE9TVCIpIHx8IGxpbmUuc3RhcnRzV2l0aCgiRXh0OiIpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGh0dHBIZWFkZXIsIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgfSAvL0VuZCBXaGlsZQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDEwMDYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMDA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNjdjZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDEwMDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci0KLQotLyoqCi0gKiBCUDEwMDYuIAotICovCi1wdWJsaWMgY2xhc3MgQlAxMDA2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMDA2KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFBhcnNlIHRoZSBIVFRQIGhlYWRlcgotICAgIFN0cmluZyByYXdIVFRQSGVhZGVyID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCk7Ci0gICAgTWFwIGh0dHBIZWFkZXIgPSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlclRva2VucyhyYXdIVFRQSGVhZGVyLCAiOiIpOwotCi0gICAgLy8gR2V0IHRoZSBzb2FwIGFjdGlvbiBoZWFkZXIKLSAgICBTdHJpbmcgc29hcEFjdGlvbiA9IChTdHJpbmcpIGh0dHBIZWFkZXIuZ2V0KCJTT0FQQWN0aW9uIi50b1VwcGVyQ2FzZSgpKTsKLQotICAgIC8vIElmIHRoZXJlIGlzIG5vIHNvYXAgYWN0aW9uIGhlYWRlciwgdGhlbiBOQQotICAgIGlmIChzb2FwQWN0aW9uID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIShzb2FwQWN0aW9uLnN0YXJ0c1dpdGgoIlwiIikpIHx8ICEoc29hcEFjdGlvbi5lbmRzV2l0aCgiXCIiKSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAiSFRUUCBIZWFkZXI6IFwiIiArIHJhd0hUVFBIZWFkZXIgKyAiXCIuIiwKLSAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMDEwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTAxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWFjNzM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMDEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5PcGVyYXRpb25TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVHlwZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotCi0vKioKLSAqIEJQMTAxMC4KLSAqIEl0IE1VU1QgTk9UIGNvbnRhaW4gYSBTT0FQIEVudmVsb3BlOiB0aGUgSFRUUCBlbnRpdHktYm9keSBtdXN0IGJlIGVtcHR5LgotICovCi1wdWJsaWMgY2xhc3MgQlAxMDEwIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMDEwKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKFRlc3RBc3NlcnRpb24sIEVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBQYXJzZSByZXF1ZXN0IG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IGRvY1JlcXVlc3QgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdERvY3VtZW50KCk7Ci0KLSAgICAgIC8vIGdldCBTT0FQQWN0aW9uCi0gICAgICBTdHJpbmcgaGVhZGVycyA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0SFRUUEhlYWRlcnMoKTsKLSAgICAgIFN0cmluZyBhY3Rpb24gPSBudWxsOwotICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkKLSAgICAgICAgYWN0aW9uID0gKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoaGVhZGVycywgIjoiKS5nZXQoIlNPQVBBY3Rpb24iLnRvVXBwZXJDYXNlKCkpOwotCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXRCaW5kaW5ncygpWzBdOwotICAgICAgVHlwZXNSZWdpc3RyeSByZWdpc3RyeSA9Ci0gICAgICAgIG5ldyBUeXBlc1JlZ2lzdHJ5KAotICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmdldFdTRExEb2N1bWVudCgpLmdldERlZmluaXRpb25zKCksCi0gICAgICAgICAgdmFsaWRhdG9yKTsKLSAgICAgIE9wZXJhdGlvblNpZ25hdHVyZS5PcGVyYXRpb25NYXRjaCBtYXRjaCA9Ci0gICAgICAgIE9wZXJhdGlvblNpZ25hdHVyZS5tYXRjaE9wZXJhdGlvbigKLSAgICAgICAgICBkb2NSZXF1ZXN0LAotICAgICAgICAgIGFjdGlvbiwKLSAgICAgICAgICBiaW5kaW5nLAotICAgICAgICAgIHJlZ2lzdHJ5KTsKLQotICAgICAgaWYgKG1hdGNoID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0KLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gbWF0Y2guZ2V0T3BlcmF0aW9uKCk7Ci0gICAgICAgIC8vZmluZCBvcGVyYXRpb24gaW4gcG9ydCB0eXBlCi0gICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpOwotICAgICAgICBpZiAob3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAob3BlcmF0aW9uLmdldE91dHB1dCgpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHJlc3VsdCA9PSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRCkKLSAgICAgIHsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwobnVsbCwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDExMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMTAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZWNhYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDExMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotCi0KLS8qKgotICogQlAxMTAxLgotICogQSByZXNwb25zZSBtZXNzYWdlIHRoYXQgZG9lcyBub3QgY29udGFpbiBhIFNPQVAgbWVzc2FnZSBTSE9VTEQgYmUgc2VudCAKLSAqIHVzaW5nIGVpdGhlciBhICIyMDAgT0siIG9yICIyMDIgQWNjZXB0ZWQiIEhUVFAgc3RhdHVzIGNvZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDExMDEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDExMDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUoVGVzdEFzc2VydGlvbiwgRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vIHJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW5zIFNPQVAgbWVzc2FnZQotICAgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpID09IG51bGwKLSAgICAgIHx8ICIiLmVxdWFscyhlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpKSkKLSAgICB7Ci0gICAgICAvLyBjaGVjayBIVFRQIHN0YXR1cyBjb2RlIAotICAgICAgU3RyaW5nIGh0dHBTdGF0dXMgPQotICAgICAgICBVdGlscy5nZXRIVFRQU3RhdHVzQ29kZSgKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKSk7Ci0gICAgICBpZiAoIjIwMCIuZXF1YWxzKGh0dHBTdGF0dXMpKTsKLSAgICAgIGVsc2UgaWYgKCIyMDIiLmVxdWFscyhodHRwU3RhdHVzKSk7Ci0KLSAgICAgIC8vIElmIDR4eCwgdGhlbiByZXN1bHQgaXMgbm90QXBwbGljYWJsZQotICAgICAgZWxzZSBpZiAoaHR0cFN0YXR1cy5zdGFydHNXaXRoKCI0IikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICJcblJlc3BvbnNlIG1lc3NhZ2U6XG5IZWFkZXJzOlxuIgotICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpCi0gICAgICAgICAgICAgICsgIk1lc3NhZ2U6XG4iCi0gICAgICAgICAgICAgICsgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyByZXNwb25zZSBjb250YWlucyBTT0FQIG1lc3NhZ2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDExMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMDkzOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDExMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotCi0KLS8qKgotICogQlAxMTAzLgotICogVGhlIHJlcXVlc3QgbWVzc2FnZSBzaG91bGQgbm90IGNvbnRhaW4gYSBQT1NUIG1ldGhvZC4KLSAqLwotcHVibGljIGNsYXNzIEJQMTEwMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTEwMyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgTWVzc2FnZUVudHJ5IHJlcXVlc3QgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpOwotICAgIFN0cmluZyByZXF1ZXN0SGVhZGVycyA9IHJlcXVlc3QuZ2V0SFRUUEhlYWRlcnMoKTsKLQotICAgIC8vIEdldCBIVFRQIHN0YXR1cyBjb2RlCi0gICAgU3RyaW5nIGh0dHBTdGF0dXMgPQotICAgICAgVXRpbHMuZ2V0SFRUUFN0YXR1c0NvZGUoCi0gICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpKTsKLQotICAgIGlmIChyZXF1ZXN0SGVhZGVycy5zdGFydHNXaXRoKCJQT1NUICIpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCEiNDA1Ii5lcXVhbHMoaHR0cFN0YXR1cykpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgIlxuUmVxdWVzdCBtZXNzYWdlOlxuSGVhZGVyczpcbiIKLSAgICAgICAgICAgICsgZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRIVFRQSGVhZGVycygpCi0gICAgICAgICAgICArICJcbk1lc3NhZ2U6XG4iCi0gICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0TWVzc2FnZSgpCi0gICAgICAgICAgICArICJcblxuUmVzcG9uc2UgbWVzc2FnZTpcbkhlYWRlcnM6XG4iCi0gICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRSZXNwb25zZSgpLmdldEhUVFBIZWFkZXJzKCkKLSAgICAgICAgICAgICsgIlxuTWVzc2FnZTpcbiIKLSAgICAgICAgICAgICsgZW50cnlDb250ZXh0LmdldFJlc3BvbnNlKCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDExMDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMTA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmY2RiZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDExMDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbHM7Ci0KLQotLyoqCi0gKiBCUDExMDQuCi0gKiBUaGUgcmVxdWVzdCBtZXNzYWdlIHNob3VsZCBub3QgY29udGFpbiBhIGNvbnRlbnQtdHlwZSBvZiAidGV4dC94bWwiLgotICovCi1wdWJsaWMgY2xhc3MgQlAxMTA0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMTA0KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKFRlc3RBc3NlcnRpb24sIEVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gY2hlY2sgcmVxdWVzdCBmb3IgdGhlICJ0ZXh0L3htbCIgY29udGVudCB0eXBlCi0gICAgTWVzc2FnZUVudHJ5IHJlcXVlc3QgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpOwotICAgIFN0cmluZyBoZWFkZXJzID0gcmVxdWVzdC5nZXRIVFRQSGVhZGVycygpOwotICAgIFN0cmluZyBjb250ZW50VHlwZSA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKGhlYWRlcnMsICI6IikKLSAgICAgIC5nZXQoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLnRvVXBwZXJDYXNlKCkpOwotCi0gICAgLy8gR2V0IEhUVFAgc3RhdHVzIGNvZGUKLSAgICBTdHJpbmcgaHR0cFN0YXR1cyA9Ci0gICAgICBVdGlscy5nZXRIVFRQU3RhdHVzQ29kZSgKLSAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCkpOwotCi0gICAgLy8gSWYgdGhlIHJlcXVlc3QgbWVzc2FnZSBoYXMgYSBjb250ZW50IHR5cGUgb2YgdGV4dC94bWwsCi0gICAgLy8gdGhlbiB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwKLSAgICAgICYmIGNvbnRlbnRUeXBlLmluZGV4T2YoV1NJQ29uc3RhbnRzLkNPTlRFTlRfVFlQRV9URVhUX1hNTCkgIT0gLTEpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIGNoZWNrIEhUVFAgc3RhdHVzIGNvZGUKLSAgICAgIGlmICghIjQxNSIuZXF1YWxzKGh0dHBTdGF0dXMpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAiXG5SZXF1ZXN0IG1lc3NhZ2U6XG5IZWFkZXJzOlxuIgotICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0SFRUUEhlYWRlcnMoKQotICAgICAgICAgICAgICArICJcbk1lc3NhZ2U6XG4iCi0gICAgICAgICAgICAgICsgZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgKyAiXG5cblJlc3BvbnNlIG1lc3NhZ2U6XG5IZWFkZXJzOlxuIgotICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRSZXNwb25zZSgpLmdldEhUVFBIZWFkZXJzKCkKLSAgICAgICAgICAgICAgKyAiXG5NZXNzYWdlOlxuIgotICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRSZXNwb25zZSgpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTExNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDExMTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwZjg0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTExNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk9wZXJhdGlvblNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UeXBlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotCi0vKioKLSAqIEJQMTExNi4KLSAqIFNPQVBBY3Rpb24gaGVhZGVyIHNob3VsZCBjb250YWluIGEgcXVvdGVkIHN0cmluZyB0aGF0IGhhcyBzYW1lIAotICogdmFsdWUgYXMgdGhlIHZhbHVlIG9mIHRoZSBzb2FwYmluZDpvcGVyYXRpb24vQHNvYXBBY3Rpb24gYXR0cmlidXRlLCAKLSAqIGFuZCBhbiBlbXB0eSBzdHJpbmcgKCIiKSBpZiB0aGVyZSBpcyBubyBzdWNoIGF0dHJpYnV0ZS4KLSAqLwotcHVibGljIGNsYXNzIEJQMTExNiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yCi17Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTExNihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVycyA9IG51bGw7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbiwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXIsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc29hcEFjdGlvbiA9IHNvYXBPcGVyLmdldFNvYXBBY3Rpb25VUkkoKTsKLSAgICBpZiAoc29hcEFjdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmICghIiIuZXF1YWxzKGFjdGlvbikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9Ci0gICAgICAgICAgIlxuSFRUUCBoZWFkZXJzOlxuIiArIGhlYWRlcnMgKyAiXG5zb2FwQWN0aW9uOlxuIiArIHNvYXBBY3Rpb247Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIXNvYXBBY3Rpb24uZXF1YWxzKGFjdGlvbikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9Ci0gICAgICAgICAgIlxuSFRUUCBoZWFkZXJzOlxuIiArIGhlYWRlcnMgKyAiXG5zb2FwQWN0aW9uOlxuIiArIHNvYXBBY3Rpb247Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gUGFyc2UgcmVxdWVzdCBtZXNzYWdlCi0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgICAgLy8gZ2V0IFNPQVBBY3Rpb24KLSAgICAgIGhlYWRlcnMgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCk7Ci0gICAgICBpZiAoaGVhZGVycyAhPSBudWxsKQotICAgICAgICBhY3Rpb24gPSAoU3RyaW5nKSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlclRva2VucyhoZWFkZXJzLCAiOiIpLmdldCgiU09BUEFjdGlvbiIudG9VcHBlckNhc2UoKSk7Ci0KLSAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIGlmIChhY3Rpb24ubGVuZ3RoKCkgPiAxCi0gICAgICAgICYmIGFjdGlvbi5jaGFyQXQoMCkgPT0gJyInCi0gICAgICAgICYmIGFjdGlvbi5jaGFyQXQoYWN0aW9uLmxlbmd0aCgpIC0gMSkgPT0gJyInKQotICAgICAgewotICAgICAgICBhY3Rpb24gPSBhY3Rpb24uc3Vic3RyaW5nKDEsIGFjdGlvbi5sZW5ndGgoKSAtIDEpOwotICAgICAgfQotCi0gICAgICBPcGVyYXRpb25TaWduYXR1cmUuT3BlcmF0aW9uTWF0Y2ggbWF0Y2ggPQotICAgICAgICBPcGVyYXRpb25TaWduYXR1cmUubWF0Y2hPcGVyYXRpb24oCi0gICAgICAgICAgZG9jLAotICAgICAgICAgIG51bGwsCi0gICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKVswXSwKLSAgICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dAotICAgICAgICAgICAgICAuZ2V0Q2FuZGlkYXRlSW5mbygpCi0gICAgICAgICAgICAgIC5nZXRXc2RsRG9jdW1lbnQoKQotICAgICAgICAgICAgICAuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICAgICAgdmFsaWRhdG9yKSwKLSAgICAgICAgICBmYWxzZSk7Ci0KLSAgICAgIGlmIChtYXRjaCAhPSBudWxsKQotICAgICAgewotICAgICAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgICAgICB0cmF2ZXJzYWwudmlzaXRTT0FQT3BlcmF0aW9uKHRydWUpOwotICAgICAgICB0cmF2ZXJzYWwudHJhdmVyc2UobWF0Y2guZ2V0T3BlcmF0aW9uKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ID09IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVECi0gICAgICAmJiBmYWlsdXJlRGV0YWlsTWVzc2FnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGZhaWx1cmVEZXRhaWxNZXNzYWdlLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlA0MTAzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQNDEwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjNhNWNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlA0MTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci0KLS8qKgotICogQlA0MTAzCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG1lc3NhZ2UgaW4gdGhlIG1lc3NhZ2UgbG9nIGZpbGU8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIG1lc3NhZ2UgY29udGFpbnMgYW4gSFRUUCBBdXRoZW50aWNhdGlvbiBoZWFkZXIgZmllbGQ8L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlA0MTAzIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfQVVUSF9TQ0hFTUVfQkFTSUMgPSAiQmFzaWMiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9BVVRIX1NDSEVNRV9ESUdFU1QgPSAiRGlnZXN0IjsKLQotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlA0MTAzKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEdldHRpbmcgbWVzc2FnZSBoZWFkZXJzCi0gICAgU3RyaW5nIGhlYWRlcnMgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKTsKLSAgICAvLyBJZiB0aGlzIGlzIGEgcmVxdWVzdCBtZXNzYWdlCi0gICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QpKQotICAgIHsKLSAgICAgIC8vIElmIHRoZSByZXF1ZXN0IGhlYWRlcnMgY29udGFpbiBhdXRoZW50aWNhdGlvbiBzY2hlbWUgIkJhc2ljIiBvciAiRGlnZXN0IgotICAgICAgLy8gb3IgdGhlcmUgYXJlIG5vIEhUVFAgQXV0aGVudGljYXRpb24gaGVhZGVycywgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFjb250YWluc0ludmFsaWRBdXRoKGhlYWRlcnMsIEhUVFBDb25zdGFudHMuSEVBREVSX0FVVEhPUklaQVRJT04pCi0gICAgICAgICYmICFjb250YWluc0ludmFsaWRBdXRoKGhlYWRlcnMsIEhUVFBDb25zdGFudHMuSEVBREVSX1BST1hZX0FVVEhPUklaQVRJT04pKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgIH0KLSAgICAvLyBlbHNlIHRoaXMgaXMgYSByZXNwb25zZQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBJZiB0aGUgcmVzcG9uc2UgaGVhZGVycyBjb250YWluIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSAiQmFzaWMiIG9yICJEaWdlc3QiCi0gICAgICAvLyBvciB0aGVyZSBhcmUgbm8gSFRUUCBBdXRoZW50aWNhdGlvbiBoZWFkZXJzLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoIWNvbnRhaW5zSW52YWxpZEF1dGgoaGVhZGVycywgSFRUUENvbnN0YW50cy5IRUFERVJfV1dXX0FVVEhFTlRJQ0FURSkKLSAgICAgICAgJiYgIWNvbnRhaW5zSW52YWxpZEF1dGgoaGVhZGVycywgSFRUUENvbnN0YW50cy5IRUFERVJfUFJPWFlfQVVUSEVOVElDQVRFKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBc3NlcnRpb24gcmVzdWx0IGhhcyBub3QgYmVlbiBjaGFuZ2VkLCBIVFRQIEF1dGhlbnRpY2F0aW9uIGhlYWRlcnMKLSAgICAvLyBkb2VzIG5vdCBjb250YWluIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSAiQmFzaWMiIG9yICJEaWdlc3QiLAotICAgIC8vIHRoZSBhc3NlcnRpb24gcGFzc2VkCi0gICAgaWYgKHJlc3VsdC5lcXVhbHMoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQpKQotICAgIHsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgdGVzdEFzc2VydGlvbi5nZXREZXRhaWxEZXNjcmlwdGlvbigpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIEhUVFAgaGVhZGVycyBjb250YWluIEhUVFAgQXV0aGVudGljYXRpb24gaGVhZGVycyB0aGF0IHVzZXMKLSAgICogYXV0aGVudGljYXRpb24gc2NoZW1lIG90aGVyIHRoYW4gIkJhc2ljIiBvciAiRGlnZXN0Ii4KLSAgICogQHBhcmFtIGhlYWRlcnMgSFRUUCBoZWFkZXJzLgotICAgKiBAcGFyYW0gaGVhZGVyIGEgaGVhZGVyIG5hbWUgYmVpbmcgcmV0cmlldmVkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEhUVFAgQXV0aGVudGljYXRpb24gaGVhZGVyIHRoYXQgdXNlcyBhdXRoZW50aWNhdGlvbgotICAgKiBzY2hlbWUgb3RoZXIgdGhhbiAiQmFzaWMiIG9yICJEaWdlc3QiIGlzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNJbnZhbGlkQXV0aChTdHJpbmcgaGVhZGVycywgU3RyaW5nIGhlYWRlcikKLSAgewotICAgIC8vIEdldHRpbmcgYSBoZWFkZXIgdmFsdWUKLSAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIGhlYWRlclZhbHVlID0gKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoaGVhZGVycywiOiIpCi0gICAgICAgIC5nZXQoaGVhZGVyLnRvVXBwZXJDYXNlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0KLSAgICAvLyBJZiB0aGUgaGVhZGVyIGlzIHByZXNlbnRlZAotICAgIGlmIChoZWFkZXJWYWx1ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIFJldHJpZXZpbmcgYXV0aGVudGljYXRpb24gc2NoZW1lCi0gICAgICBpbnQgaWR4U1AgPSBoZWFkZXJWYWx1ZS5pbmRleE9mKCIgIik7Ci0gICAgICBpZiAoaWR4U1AgPiAtMSkKLSAgICAgIHsKLSAgICAgICAgaGVhZGVyVmFsdWUgPSBoZWFkZXJWYWx1ZS5zdWJzdHJpbmcoMCwgaWR4U1ApOwotICAgICAgfQotICAgICAgLy8gSWYgYSBzY2hlbWUgaXMgbmVpdGhlciAiQmFzaWMiIG5vciAiRGlnZXN0IiwgcmV0dXJuIHRydWUKLSAgICAgIGlmICghaGVhZGVyVmFsdWUuZXF1YWxzSWdub3JlQ2FzZShIVFRQX0FVVEhfU0NIRU1FX0JBU0lDKQotICAgICAgICAmJiAhaGVhZGVyVmFsdWUuZXF1YWxzSWdub3JlQ2FzZShIVFRQX0FVVEhfU0NIRU1FX0RJR0VTVCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQNDEwNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDQxMDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkMGNmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQNDEwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLQotLyoqCi0gKiBCUDQxMDQKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIGxvZyBmaWxlIGNvbnRhaW5pbmcgYW4gSFRUUCBIZWFkZXIgZmllbGQgdGhhdCBpcyBub3QgZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Qgb2Ygc3BlY2lmaWVkIGhlYWRlciBmaWVsZHM6IChodHRwOi8vd3d3Lm1ub3QubmV0L2RyYWZ0cy9kcmFmdC1ub3R0aW5naGFtLWh0dHAtaGVhZGVyLXJlZy0wMC50eHQpPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBtZXNzYWdlIGNvbnRhaW5zIGFuIEhUVFAgSGVhZGVyIGZpZWxkIHRoYXQgaXMgbm90IGZyb20gdGhlIGZvbGxvd2luZyBsaXN0IG9mIHNwZWNpZmllZCBoZWFkZXIgZmllbGRzOiAoaHR0cDovL3d3dy5tbm90Lm5ldC9kcmFmdHMvZHJhZnQtbm90dGluZ2hhbS1odHRwLWhlYWRlci1yZWctMDAudHh0KTwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDQxMDQgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIHsKLQotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICBwcml2YXRlIExpc3Qga25vd25IZWFkZXJOYW1lczsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlA0MTA0KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gICAga25vd25IZWFkZXJOYW1lcyA9IG51bGw7Ci0gIH0KLQotICBwcml2YXRlIExpc3QgZ2V0QWxsS25vd25IZWFkZXJOYW1lcygpIHsKLSAgICBpZiAoa25vd25IZWFkZXJOYW1lcyA9PSBudWxsKSB7Ci0gICAgICBrbm93bkhlYWRlck5hbWVzID0gSFRUUENvbnN0YW50cy5nZXRBbGxLbm93bkhlYWRlck5hbWVzKCk7Ci0gICAgfQotICAgIHJldHVybiBrbm93bkhlYWRlck5hbWVzOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vIGdldHRpbmcgSFRUUCBIZWFkZXJzCi0gICAgTWFwIGhtYXAgPSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlclRva2VucygKLSAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpLCAiOiIpOwotCi0gICAgSXRlcmF0b3IgaSA9IGhtYXAua2V5U2V0KCkuaXRlcmF0b3IoKSA7Ci0gICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICBTdHJpbmcgaGVhZGVyTmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgLy8gSWYgaGVhZGVyIG5hbWUgaXMgbm90IGtub3duLCB0aGVuIHRoZSBhc3NlcnRpb24gcGFzc2VkCi0gICAgICBpZiAoIWdldEFsbEtub3duSGVhZGVyTmFtZXMoKS5jb250YWlucyhoZWFkZXJOYW1lLnRvVXBwZXJDYXNlKCkpKQotICAgICAgewotICAgICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgdGVzdEFzc2VydGlvbi5nZXREZXRhaWxEZXNjcmlwdGlvbigpLCBlbnRyeUNvbnRleHQpOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHRoZXJlIGlzIG5vIEhUVFAgaGVhZGVyIHRoYXQgaXMgbm90IGZyb20gYSBsaXN0LAotICAgIC8vIHRoZW4gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZSAKLSAgICBpZiAoZmFpbHVyZURldGFpbCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDQxMDUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlA0MTA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNGY3NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDQxMDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLQotCi0vKioKLSAqIEJQNDEwNQotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG1lc3NhZ2UgaW4gdGhlIG1lc3NhZ2UgbG9nIGZpbGUgY29udGFpbmluZyBhIENvbnRlbnQtZW5jb2RpbmcgSFRUUCBoZWFkZXIgZmllbGQgd2l0aCBhIHZhbHVlIG90aGVyIHRoYW4gImd6aXAiLCAiY29tcHJlc3MiIG9yICJkZWZsYXRlIjwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgY29udGFpbmVkIENvbnRlbnQtZW5jb2RpbmcgSFRUUCBoZWFkZXIgZmllbGQgaGFzIGEgdmFsdWUgb3RoZXIgdGhhbiAiZ3ppcCIsICJjb21wcmVzcyIgb3IgImRlZmxhdGUiLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDQxMDUgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIHsKLQotICAvLyBBbGwgdGhlIHJlZ2lzdGVyZWQgY29udGVudC1jb2RpbmcgdmFsdWUgdG9rZW5zIChSRkMyNjE2KSBleGNlcHQgImlkZW50aXR5IgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1pJUF9WQUxVRSA9ICJnemlwIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBSRVNTX1ZBTFVFID0gImNvbXByZXNzIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkxBVEVfVkFMVUUgPSAiZGVmbGF0ZSI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQNDEwNShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vIEdldHRpbmcgdGhlIENvbnRlbnQtRW5jb2RpbmcgSFRUUCBoZWFkZXIgdmFsdWUKLSAgICBTdHJpbmcgY29udGVudEVuY29kaW5nID0gKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoCi0gICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKSwKLSAgICAgICI6IikuZ2V0KEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfRU5DT0RJTkcudG9VcHBlckNhc2UoKSk7Ci0KLSAgICBpZiAoY29udGVudEVuY29kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgLy8gTG93ZXJpbmcgdmFsdWUncyBjYXNlIGJlY2F1c2UgUkZDMjYxNiBzYXlzCi0gICAgICAvLyB0aGF0IGFsbCBjb250ZW50LWNvZGluZyB2YWx1ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKLSAgICAgIGNvbnRlbnRFbmNvZGluZyA9IGNvbnRlbnRFbmNvZGluZy50b0xvd2VyQ2FzZSgpOwotCi0gICAgICAvLyBNdWx0aXBsZSBlbmNvZGluZ3MgY2FuIGJlIGFwcGxpZWQgdG8gYW4gZW50aXR5LAotICAgICAgLy8gc28gYnJlYWtpbmcgdGhlIHZhbHVlIGludG8gdG9rZW5zCi0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbnRlbnRFbmNvZGluZywgIiwiKTsKLSAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgICAgLy8gSWYgYSB0b2tlbiBkb2VzIG5vdCBlcXVhbCB0byBhbnkgcmVnaXN0ZXJlZCBvbmUKLSAgICAgICAgLy8gdGhlbiB0aGUgYXNzZXJ0aW9uIHBhc3NlZAotICAgICAgICBpZiAoICF0b2tlbi5lcXVhbHMoR1pJUF9WQUxVRSkKLSAgICAgICAgICAmJiAhdG9rZW4uZXF1YWxzKENPTVBSRVNTX1ZBTFVFKQotICAgICAgICAgICYmICF0b2tlbi5lcXVhbHMoREVGTEFURV9WQUxVRSkpIHsKLQotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RGV0YWlsRGVzY3JpcHRpb24oKSwgZW50cnlDb250ZXh0KTsKLQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlcmUgaXMgbm8gdW5yZWdpc3RlcmVkIHZhbHVlIG9mIENvbnRlbnQtRW5jb2RpbmcsCi0gICAgLy8gdGhlbiB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlIAotICAgIGlmIChmYWlsdXJlRGV0YWlsID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQNDEwNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDQxMDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI3ODYzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQNDEwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci0KLQotLyoqCi0gKiBCUDQxMDYKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSByZXNwb25zZSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIGxvZyBmaWxlIHRoYXQgY29udGFpbnMgYSB0cmFuc2Zlci1lbmNvZGluZyBIVFRQIGhlYWRlciBmaWVsZC48L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIGNvbnRhaW5lZCB0cmFuc2Zlci1lbmNvZGluZyBIVFRQIGhlYWRlciBmaWVsZCBoYXMgYSB2YWx1ZSBvZiAiY2h1bmtlZCI8L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlA0MTA2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIVU5LRURfVkFMVUUgPSAiY2h1bmtlZCI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQNDEwNihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vIEdldHRpbmcgYSBUcmFuc2Zlci1FbmNvZGluZyBIVFRQIGhlYWRlciB2YWx1ZQotICAgIFN0cmluZyB0cmFuc2ZlckVuY29kaW5nID0gKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoCi0gICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKSwKLSAgICAgICI6IikuZ2V0KEhUVFBDb25zdGFudHMuSEVBREVSX1RSQU5TRkVSX0VOQ09ESU5HLnRvVXBwZXJDYXNlKCkpOwotCi0gICAgaWYgKHRyYW5zZmVyRW5jb2RpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBMb3dlcmluZyB2YWx1ZSdzIGNhc2UgYmVjYXVzZSBSRkMyNjE2IHNheXMKLSAgICAgIC8vIHRoYXQgYWxsIHRyYW5zZmVyLWNvZGluZyB2YWx1ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKLSAgICAgIHRyYW5zZmVyRW5jb2RpbmcgPSB0cmFuc2ZlckVuY29kaW5nLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBvdGhlciB0aGFuICJjaHVua2VkIiwgdGhlbiB0aGUgYXNzZXJ0aW9uIHBhc3NlZAotICAgICAgaWYgKCF0cmFuc2ZlckVuY29kaW5nLmVxdWFscyhDSFVOS0VEX1ZBTFVFKSkgewotICAgICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgdGVzdEFzc2VydGlvbi5nZXREZXRhaWxEZXNjcmlwdGlvbigpLCBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHRoZXJlIGlzIG5vIFRyYW5mZXItRW5jb2Rpbmcgb3IgaXRzIHZhbHVlIGlzICJjaHVua2VkIiwKLSAgICAvLyB0aGVuIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUgCi0gICAgaWYgKGZhaWx1cmVEZXRhaWwgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlA0MTA3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQNDEwNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjk5YTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlA0MTA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLQotCi0vKioKLSAqIEJQNDEwNwotICogPGNvbnRleHQ+Rm9yIGEgcmVxdWVzdCBtZXNzYWdlIGNvbnRhaW5pbmcgYW4gVXBncmFkZSBmaWVsZCBpbiB0aGUgSFRUUCBIZWFkZXJzLjwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgcmVxdWVzdCBtZXNzYWdlIGNvbnRhaW5zIGFuIFVwZ3JhZGUgZmllbGQgaW4gdGhlIEhUVFAgSGVhZGVycy48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlA0MTA3IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQNDEwNyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBHZXR0aW5nIHRoZSBVcGdyYWRlIEhUVFAgaGVhZGVyIHZhbHVlCi0gICAgU3RyaW5nIHVwZ3JhZ2UgPSAoU3RyaW5nKSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlclRva2VucygKLSAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpLAotICAgICAgIjoiKS5nZXQoSFRUUENvbnN0YW50cy5IRUFERVJfVVBHUkFERS50b1VwcGVyQ2FzZSgpKTsgCi0KLSAgICAvLyBJZiB0aGUgaGVhZGVyIGlzIHByZXNlbnRlZCwgdGhlbiB0aGUgYXNzZXJ0aW9uIHBhc3NlZAotICAgIGlmICh1cGdyYWdlICE9IG51bGwpCi0gICAgewotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICB0ZXN0QXNzZXJ0aW9uLmdldERldGFpbERlc2NyaXB0aW9uKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIGVsc2UgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvTWVzc2FnZVZhbGlkYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvTWVzc2FnZVZhbGlkYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1YmZmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL01lc3NhZ2VWYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgSUJNIENvcnBvcmF0aW9uLCBQYXJhc29mdCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICBQYXJhc29mdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLk1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRW50cnlUeXBlOwotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVZhbGlkYXRvckltcGwKLSAgZXh0ZW5kcyBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICBpbXBsZW1lbnRzIE1lc3NhZ2VWYWxpZGF0b3IKLXsKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsI2lzUHJpbWFyeUVudHJ5VHlwZU1hdGNoKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByaW1hcnlFbnRyeVR5cGVNYXRjaCgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgewotICAgIGJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQotICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBlbnRyeSBhbmQgdGVzdCBhc3NlcnRpb24gaGF2ZSB0aGUgc2FtZSBwcmltYXJ5IGNvbnRleHQKLSAgICBpZiAoKHRlc3RBc3NlcnRpb24uZ2V0RW50cnlUeXBlTmFtZSgpLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9NRVNTQUdFX0FOWSkpCi0gICAgICB8fCAodGVzdEFzc2VydGlvbi5nZXRFbnRyeVR5cGVOYW1lKCkuZXF1YWxzKEVudHJ5VHlwZS5UWVBFX01FU1NBR0VfUkVRVUVTVCkKLSAgICAgICAgJiYgKGVudHJ5Q29udGV4dAotICAgICAgICAgIC5nZXRFbnRyeSgpCi0gICAgICAgICAgLmdldEVudHJ5VHlwZSgpCi0gICAgICAgICAgLmdldFR5cGVOYW1lKCkKLSAgICAgICAgICAuZXF1YWxzKEVudHJ5VHlwZS5UWVBFX01FU1NBR0VfUkVRVUVTVCkpKQotICAgICAgfHwgKHRlc3RBc3NlcnRpb24uZ2V0RW50cnlUeXBlTmFtZSgpLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9NRVNTQUdFX1JFU1BPTlNFKQotICAgICAgICAmJiAoZW50cnlDb250ZXh0Ci0gICAgICAgICAgLmdldEVudHJ5KCkKLSAgICAgICAgICAuZ2V0RW50cnlUeXBlKCkKLSAgICAgICAgICAuZ2V0VHlwZU5hbWUoKQotICAgICAgICAgIC5lcXVhbHMoRW50cnlUeXBlLlRZUEVfTUVTU0FHRV9SRVNQT05TRSkpKQotICAgICAgfHwgdGVzdEFzc2VydGlvbi5nZXRFbnRyeVR5cGVOYW1lKCkuZXF1YWxzKEVudHJ5VHlwZS5UWVBFX01JTUVfUk9PVF9QQVJUKQotICAgICAgfHwgdGVzdEFzc2VydGlvbi5nZXRFbnRyeVR5cGVOYW1lKCkuZXF1YWxzKEVudHJ5VHlwZS5UWVBFX01JTUVfUEFSVCkpCi0gICAgewotICAgICAgbWF0Y2ggPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBtYXRjaDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvU1NCUDEwMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvU1NCUDEwMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxZWFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1NTQlAxMDAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvblBhc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotCi0KLS8qKgotICogU1NCUDEwMDMuCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG5vbi1tdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlIGluIHRoZSBsb2cgZmlsZSwgd2hpY2ggaGFzIGEgbm9uLWVtcHR5IGVudGl0eS1ib2R5PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPgotICogIFRoZSBsb2dnZWQgU09BUCBlbnZlbG9wZSBpcyBhIFVURi04IHRyYW5zY3JpcHQgb2YgYW4gZW52ZWxvcGUgb3JpZ2luYWxseSBlbmNvZGVkIGFzIFVURi04IG9yIFVURi0xNi4gCi0gKiAgVGhlIEhUVFAgQ29udGVudC1UeXBlIGhlYWRlcidzIGNoYXJzZXQgdmFsdWUgaXMgZWl0aGVyIFVURi04IG9yIFVURi0xNi4gTG9va2luZyBhdCB0aGUgbWVzc2FnZUNvbnRlbnQgCi0gKiAgZWxlbWVudCBvZiB0aGUgbG9nZ2VkIG1lc3NhZ2UsIGVpdGhlciAKLSAqICAgICgxKSBpdCBoYXMgYSBCT00gYXR0cmlidXRlIHdoaWNoIG1hcHMgdGhlIGNoYXJzZXQgdmFsdWUgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIsIG9yIAotICogICAgKDIpIGl0IGhhcyBpdCBoYXMgYW4gWE1MIGRlY2xhcmF0aW9uIHdoaWNoIG1hdGNoZXMgdGhlIGNoYXJzZXQgdmFsdWUgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIsIG9yIAotICogICAgKDMpIHRoZXJlIGlzIG5vIEJPTSBhdHRyaWJ1dGUgYW5kIG5vIFhNTCBkZWNsYXJhdGlvbiwgYW5kIHRoZSBjaGFyc2V0IHZhbHVlIGlzIFVURi04LgotICogPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqCi0gKiBAYXV0aG9yIGxhdXpvbmQKLSAqLyAKLXB1YmxpYyBjbGFzcyBTU0JQMTAwMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgU1NCUDEwMDMoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gSWYgdGhlcmUgaXMgYSByZXNwb25zZSBtZXNzYWdlIGZvciBvbmUtd2F5IG9wZXJhdGlvbiwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKHZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBodHRwSGVhZGVyID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCk7Ci0KLSAgICAgIE1hcCBodHRwSGVhZGVyTWFwID0gSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoaHR0cEhlYWRlciwgIjoiKTsKLSAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IChTdHJpbmcpIGh0dHBIZWFkZXJNYXAuZ2V0KCJDb250ZW50LVR5cGUiLnRvVXBwZXJDYXNlKCkpOwotCi0gICAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgIlRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGlzIG5vdCBwcmVzZW50LiIpOwotICAgICAgfQotCi0gICAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLnRyaW0oKTsKLSAgICAgIFN0cmluZyBjaGFyc2V0ID0gY29udGVudFR5cGUuc3Vic3RyaW5nKAotICAgICAgICBjb250ZW50VHlwZS5pbmRleE9mKCI7IikgKyAxLCBjb250ZW50VHlwZS5sZW5ndGgoKSk7Ci0gICAgICBjaGFyc2V0ID0gY2hhcnNldC50cmltKCk7Ci0gICAgICBpZiAoIWNoYXJzZXQuc3RhcnRzV2l0aCgiY2hhcnNldCIpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAiTWlzc2luZyBvciBiYWQgXCJjaGFyc2V0XCIgYXR0cmlidXRlIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyOiAiCi0gICAgICAgICAgKyBjaGFyc2V0KTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIGNoYXJzZXRWYWx1ZSA9IGNoYXJzZXQuc3Vic3RyaW5nKAotICAgICAgICBjaGFyc2V0LmluZGV4T2YoIj0iKSArIDEsIGNoYXJzZXQubGVuZ3RoKCkpOwotICAgICAgaWYgKGNoYXJzZXRWYWx1ZS5zdGFydHNXaXRoKCJcIiIpKQotICAgICAgewotICAgICAgICBjaGFyc2V0VmFsdWUgPSBjaGFyc2V0VmFsdWUuc3Vic3RyaW5nKDEsIGNoYXJzZXRWYWx1ZS5sZW5ndGgoKSAtIDEpOwotICAgICAgfQotCi0gICAgICBpZiAoIWNoYXJzZXRWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ1dGYtOCIpCi0gICAgICAgICAgJiYgIWNoYXJzZXRWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ1dGYtMTYiKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSB2YWx1ZSBvZiB0aGUgXCJjaGFyc2V0XCIgIgotICAgICAgICAgICsgImF0dHJpYnV0ZSBvZiB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBpcyAiICsgY29udGVudFR5cGUpOwotICAgICAgfQotICAgICAgLy8gUGFyc2UgbG9nIG1lc3NhZ2UKLSAgICAgIC8vZ2V0cyBmaXJzdCBzdHJpbmcKLSAgICAgIGludCBpZHggPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIjw/eG1sIik7Ci0gICAgICBpZiAoaWR4ID09IC0xKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBpbnQgaWR4MiA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiPz4iKTsKLSAgICAgIGlmIChpZHgyID09IC0xKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBTdHJpbmcgeG1sRGVjbGFyYXRpb24gPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpCi0gICAgICAgIC5zdWJzdHJpbmcoaWR4LCBpZHgyICsgIj8+Ii5sZW5ndGgoKSk7Ci0KLSAgICAgIGlkeCA9IHhtbERlY2xhcmF0aW9uLmluZGV4T2YoImVuY29kaW5nIik7Ci0gICAgICBpZiAoaWR4ID09IC0xKQotICAgICAgewotICAgICAgICBpZiAoY2hhcnNldFZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInV0Zi04IikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZXJlIGlzIG5vIFhNTCBkZWNsYXJhdGlvbiBhbmQgdGhlIgotICAgICAgICAgICAgKyAiIGNoYXJzZXQgdmFsdWUgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgaXMgbm90IFVURi04LiIKLSAgICAgICAgICAgICsgIlxuQ2hhcnNldCB2YWx1ZSBpbiB0aGUgQ29udGVudC1UeXBlIGhlYWRlcjogIiArIGNoYXJzZXRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaW50IGlkeFEgPSB4bWxEZWNsYXJhdGlvbi5pbmRleE9mKCdcJycsIGlkeCk7Ci0gICAgICBpbnQgaWR4UVEgPSB4bWxEZWNsYXJhdGlvbi5pbmRleE9mKCdcIicsIGlkeCk7Ci0gICAgICBpbnQgaWR4UXVvdGUgPSAtMTsKLSAgICAgIGNoYXIgcW91dGVDaCA9ICdcMCc7Ci0gICAgICBpZiAoaWR4USA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWR4UXVvdGUgPSBpZHhRUTsKLSAgICAgICAgcW91dGVDaCA9ICdcIic7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChpZHhRUSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgIGlkeFF1b3RlID0gaWR4UTsKLSAgICAgICAgICBxb3V0ZUNoID0gJ1wnJzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaWR4UVEgPCBpZHhRKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlkeFF1b3RlID0gaWR4UVE7Ci0gICAgICAgICAgICBxb3V0ZUNoID0gJ1wiJzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlkeFF1b3RlID0gaWR4UTsKLSAgICAgICAgICAgIHFvdXRlQ2ggPSAnXCcnOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoaWR4UXVvdGUgPT0gLTEgfHwgcW91dGVDaCA9PSAnXDAnKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBpbnQgaWR4TFFvdXRlID0geG1sRGVjbGFyYXRpb24uaW5kZXhPZihxb3V0ZUNoLCBpZHhRdW90ZSArIDEpOwotCi0gICAgICBpZiAoaWR4TFFvdXRlID09IC0xKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBTdHJpbmcgeG1sRW5jb2RpbmcgPQotICAgICAgICB4bWxEZWNsYXJhdGlvbi5zdWJzdHJpbmcoaWR4UXVvdGUgKyAxLCBpZHhMUW91dGUpOwotICAgICAgaWYgKGNoYXJzZXRWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKHhtbEVuY29kaW5nKSkKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBCT00sIHRoZW4gY2hlY2sgdGhhdCBpdCBpcyB0aGUgc2FtZSBhcyB0aGUgeG1sRW5jb2RpbmcKLSAgICAgICAgaW50IGJvbSA9IDA7Ci0gICAgICAgIGlmICgoYm9tID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEJPTSgpKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChib20gPT0gV1NJQ29uc3RhbnRzLkJPTV9VVEY4Ci0gICAgICAgICAgICAmJiAheG1sRW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgidXRmLTgiKSkKLSAgICAgICAgICAgIHx8ICgoYm9tID09IFdTSUNvbnN0YW50cy5CT01fVVRGMTYKLSAgICAgICAgICAgICAgJiYgIXhtbEVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoInV0Zi0xNiIpKSkKLSAgICAgICAgICAgIHx8ICgoYm9tID09IFdTSUNvbnN0YW50cy5CT01fVVRGMTZfQklHX0VORElBTgotICAgICAgICAgICAgICAmJiAheG1sRW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgidXRmLTE2IikpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgIlRoZSBCT00gYW5kIFhNTCBkZWNsYXJhdGlvbiBkbyBub3QgbWF0Y2guIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZXJlIGlzIGFuIFhNTCBkZWNsYXJhdGlvbiwgYnV0IGl0cyAiCi0gICAgICAgICAgKyAiZW5jb2RpbmcgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIGNoYXJzZXQgdmFsdWUuXG4iCi0gICAgICAgICAgKyAiQ2hhcnNldCB2YWx1ZSBpbiB0aGUgQ29udGVudC1UeXBlIGhlYWRlcjogIiArIGNoYXJzZXRWYWx1ZQotICAgICAgICAgICsgIlxuRW5jb2RpbmcgaW4gdGhlIFhNTCBkZWNsYXJhdGlvbjogIiArIHhtbEVuY29kaW5nKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvblBhc3NFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1NTQlA1MTAwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1NTQlA1MTAwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjE1MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9TU0JQNTEwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotCi0vKioKLSAqIFNTQlA1MTAwCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgbWVzc2FnZSBpbiB0aGUgbG9nIGZpbGUsIHdpdGggYW4gSFRUUCBlbnRpdHktYm9keS48L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIFNPQVAgZW52ZWxvcGUgaXMgdGhlIGV4Y2x1c2l2ZSBwYXlsb2FkIG9mIHRoZSBIVFRQIGVudGl0eS1ib2R5LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTU0JQNTEwMCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgewotCi0gIHByb3RlY3RlZCBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFNTQlA1MTAwKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0dGluZyBhIG1lc3NhZ2UgZG9jdW1lbnQKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotICAgICAgCi0gICAgICAvLyBJZiB0aGUgbWVzc2FnZSBpcyBlbXB0eSBvciBpbnZhbGlkLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICB7IAotICAgICAgCWlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgICAJCSB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgCWVsc2UJCi0gICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIGlmICghZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldExvY2FsTmFtZSgpLmVxdWFscyhYTUxVdGlscy5TT0FQX0VMRU1fRU5WRUxPUEUpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgdGVzdEFzc2VydGlvbi5nZXRGYWlsdXJlTWVzc2FnZSgpLAotICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1NTQlA1MTAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1NTQlA1MTAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYWU1MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9TU0JQNTEwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLQotLyoqCi0gKiBTU0JQNTEwMQotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG1lc3NhZ2UgaW4gdGhlIGxvZyBmaWxlLjwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BIG1lc3NhZ2UgbXVzdCBoYXZlIGEgIkNvbnRlbnQtVHlwZSIgSFRUUCBoZWFkZXIgZmllbGQuICBUaGUgIkNvbnRlbnQtVHlwZSIgSFRUUCBoZWFkZXIgZmllbGQgbXVzdCBoYXZlIGEgZmllbGQtdmFsdWUgd2hvc2UgbWVkaWEgdHlwZSBpcyAidGV4dC94bWwiLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKiAKLSAqIEBhdXRob3IgbGF1em9uZAotICovCi1wdWJsaWMgY2xhc3MgU1NCUDUxMDEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIHsKLQotICBwcm90ZWN0ZWQgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBTU0JQNTEwMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vIGdldHRpbmcgQ29udGVudC1UeXBlIEhUVFAgaGVhZGVyCi0gICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoCi0gICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKSwKLSAgICAgICI6IikuZ2V0KEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRS50b1VwcGVyQ2FzZSgpKTsKLQotICAgIC8vIGlmIENvbnRlbnQtVHlwZSBoZWFkZXIgaXMgbm90IHByZXNlbnRlZAotICAgIC8vIG9yIGRvZXMgbm90IGVxdWFsIHRvIHRleHQveG1sLCB0aGVuIHRoZSBhc3NlcnRpb24gaXMgZmFpbGVkCi0gICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwKLSAgICAgIHx8ICFjb250ZW50VHlwZS5zdGFydHNXaXRoKFdTSUNvbnN0YW50cy5DT05URU5UX1RZUEVfVEVYVF9YTUwpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICB0ZXN0QXNzZXJ0aW9uLmdldEZhaWx1cmVNZXNzYWdlKCksCi0gICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIHJldHVybiB0aGlzLnZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwNjZiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLQotLyoqCi0gKiBXU0kxMDAxCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMDAxIGV4dGVuZHMgQlAxMDAxCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEwMDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0MzA4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLQotLyoqCi0gKiBXU0kxMDAyCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMDAyIGV4dGVuZHMgQlAxMDAyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEwMDIoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDAzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNDEwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLQotLyoqCi0gKiBXU0kxMDAzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMDAzIGV4dGVuZHMgU1NCUDEwMDMKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTAwMyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGZhZDg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotCi0vKioKLSAqIFdTSTEwMDQKLSAqLwotcHVibGljIGNsYXNzIFdTSTEwMDQgZXh0ZW5kcyBCUDEwMDQKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTAwNChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzFjMDA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTAwNTsKLQotLyoqCi0gKiBXU0kxMDA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMDA1IGV4dGVuZHMgQlAxMDA1Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEwMDUoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDA2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJkNmY4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLQotLyoqCi0gKiBXU0kxMDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMDA2IGV4dGVuZHMgQlAxMDA2Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEwMDYoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDA3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4NWFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEwMDc7Ci0KLS8qKgotICogV1NJMTAwNwotICovCi1wdWJsaWMgY2xhc3MgV1NJMTAwNyBleHRlbmRzIEJQMTAwNwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMDA3KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwOC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyY2QwZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDA4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMDA4OwotCi0vKioKLSAqIFdTSTEwMDgKLSAqLwotcHVibGljIGNsYXNzIFdTSTEwMDggZXh0ZW5kcyBCUDEwMDgKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTAwOChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjY4ZWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTAwOTsKLQotLyoqCi0gKiBXU0kxMDA5Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMDA5IGV4dGVuZHMgQlAxMDA5Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEwMDkoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDEwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyZDk4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLQotLyoqCi0gKiBXU0kxMDEwCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMDEwIGV4dGVuZHMgQlAxMDEwCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEwMTAoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDExLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkY2RjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEwMTE7Ci0KLS8qKgotICogV1NJMTAxMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMTAxMSBleHRlbmRzIEJQMTAxMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMDExKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAxMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZjU3MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMDEyOwotCi0vKioKLSAqIFdTSTEwMTIKLSAqLwotcHVibGljIGNsYXNzIFdTSTEwMTIgZXh0ZW5kcyBCUDEwMTIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTAxMihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMTMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAxMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODdlNTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTAxMzsKLQotLyoqCi0gKiBXU0kxMDEzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMDEzIGV4dGVuZHMgQlAxMDEzCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEwMTMoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDMxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkMzkxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEwMzE7Ci0KLS8qKgotICogV1NJMTAzMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMTAzMSBleHRlbmRzIEJQMTAzMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMDMxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTAwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMjBhMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMTAwOwotCi0vKioKLSAqIFdTSTExMDAKLSAqLwotcHVibGljIGNsYXNzIFdTSTExMDAgZXh0ZW5kcyBCUDExMDAKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTEwMChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmIxMTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotCi0vKioKLSAqIFdTSTExMDEKLSAqLwotcHVibGljIGNsYXNzIFdTSTExMDEgZXh0ZW5kcyBCUDExMDEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTEwMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTM4MzJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkh0dHBIZWFkZXJzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEJQV1NJNC4KLSAqIFRoZSByZXF1ZXN0IG1lc3NhZ2Ugc2hvdWxkIGJlIGludmFsaWQgKEhUVFAgcmVxdWVzdCBtYWxmb3JtZWQsIAotICogWE1MIG5vdCB3ZWxsIGZvcm1lZCwgLi4uKS4KLSAqLwotcHVibGljIGNsYXNzIFdTSTExMDIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMTAyKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIFN0cmluZyBodHRwSGVhZGVyID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCk7Ci0KLSAgICBTdHJpbmcgcmVxdWVzdE1lc3NhZ2UgPSBudWxsOwotICAgIC8vU3RyaW5nIHJlc3BvbnNlTWVzc2FnZSA9IG51bGw7Ci0gICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gbnVsbDsKLSAgICByZXN1bHQgPSBudWxsOwotICAgIC8vCi0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBjaGVjayBIVFRQIHN0YXR1cyBjb2RlCi0gICAgICBTdHJpbmcgaHR0cFN0YXR1cyA9Ci0gICAgICAgIFV0aWxzLmdldEhUVFBTdGF0dXNDb2RlKAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpKTsKLSAgICAgIGlmICgiNDAwIi5lcXVhbHMoaHR0cFN0YXR1cykpCi0gICAgICB7Ci0KLSAgICAgICAgcmVxdWVzdE1lc3NhZ2UgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldE1lc3NhZ2UoKTsKLQotICAgICAgICBTdHJpbmcgcmVxdWVzdEhUVFBIZWFkZXJzID0KLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCk7Ci0KLSAgICAgICAgLy9jaGVjayByZXF1ZXN0IEhUVFAgSGVhZGVycwotCi0gICAgICAgIC8vSHR0cEhlYWRlcnNWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IEh0dHBIZWFkZXJzVmFsaWRhdG9yKCk7Ci0KLSAgICAgICAgaWYgKCFIdHRwSGVhZGVyc1ZhbGlkYXRvcgotICAgICAgICAgIC52YWxpZGF0ZUh0dHBSZXF1ZXN0SGVhZGVycyhyZXF1ZXN0SFRUUEhlYWRlcnMpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2NoZWNrIHJlcXVlc3QgeG1sIG1lc3NhZ2UKLQotICAgICAgICBjb250ZW50VHlwZSA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKGh0dHBIZWFkZXIsICI6IikKLSAgICAgICAgIC5nZXQoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLnRvVXBwZXJDYXNlKCkpOwotICAgICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZihXU0lDb25zdGFudHMuQ09OVEVOVF9UWVBFX1RFWFRfWE1MKSAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgICAvL0RvY3VtZW50IGRvYyA9IGJ1aWxkZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIocmVxdWVzdE1lc3NhZ2UpKSk7Ci0gICAgICAgICAgICAgIGJ1aWxkZXIucGFyc2UoCi0gICAgICAgICAgICAgICAgbmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIocmVxdWVzdE1lc3NhZ2UpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmV3IFdTSUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgIlxuUmVxdWVzdCBtZXNzYWdlOlxuSGVhZGVyczpcbiIKLSAgICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0SFRUUEhlYWRlcnMoKQotICAgICAgICAgICAgICAgICsgIk1lc3NhZ2U6XG4iCi0gICAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldE1lc3NhZ2UoKQotICAgICAgICAgICAgICAgICsgIlxuXG5SZXNwb25zZSBtZXNzYWdlOlxuSGVhZGVyczpcbiIKLSAgICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRSZXNwb25zZSgpLmdldEhUVFBIZWFkZXJzKCkKLSAgICAgICAgICAgICAgICArICJNZXNzYWdlOlxuIgotICAgICAgICAgICAgICAgICsgZW50cnlDb250ZXh0LmdldFJlc3BvbnNlKCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChXU0lFeGNlcHRpb24gd3NpZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDY1MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJMTEwMwotICovCi1wdWJsaWMgY2xhc3MgV1NJMTEwMyBleHRlbmRzIEJQMTEwMwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMTAzKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMmU0NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJMTEwNC4KLSAqIFRoZSByZXF1ZXN0IG1lc3NhZ2Ugc2hvdWxkIG5vdCBjb250YWluIGEgY29udGVudC10eXBlIG9mICJ0ZXh0L3htbCIuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMTA0IGV4dGVuZHMgQlAxMTA0Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTExMDQoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDFhM2JjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5TZXRDb29raWUyVmFsaWRhdG9yOwotCi0KLS8qKgotICogQlBXU0k0LgotICogVGhlIENvb2tpZXMgc2hvdWxkIGNvbmZvcm0gdG8gUkZDMjk2NS4KLSAqLwotcHVibGljIGNsYXNzIFdTSTExMDUgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMTA1KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKFRlc3RBc3NlcnRpb24sIEVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBTZXRDb29raWUyVmFsaWRhdG9yIGNvb2tpZVZhbCA9IG5ldyBTZXRDb29raWUyVmFsaWRhdG9yKCk7Ci0gICAgU3RyaW5nIGhlYWRlcnMgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKTsKLSAgICBpZiAoZW50cnlDb250ZXh0Ci0gICAgICAuZ2V0TWVzc2FnZUVudHJ5KCkKLSAgICAgIC5nZXRUeXBlKCkKLSAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKE1lc3NhZ2VFbnRyeS5UWVBFX1JFU1BPTlNFKSkKLSAgICB7Ci0gICAgICAvLyBpZiByZXNwb25zZSB0cm9tIHNlcnZlcgotICAgICAgU3RyaW5nIHNldENvb2tpZTIgPQotICAgICAgICAoU3RyaW5nKSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlclRva2VucyhoZWFkZXJzLCAiOiIpLmdldCgiU2V0LUNvb2tpZTIiLnRvVXBwZXJDYXNlKCkpOwotICAgICAgaWYgKHNldENvb2tpZTIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKGNvb2tpZVZhbC5pc1NldENvb2tpZTIoc2V0Q29va2llMi50cmltKCkpKQotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAiXG5NZXNzYWdlOlxuSGVhZGVyczpcbiIKLSAgICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpCi0gICAgICAgICAgICAgICAgKyAiXG5TT0FQIG1lc3NhZ2U6XG4iCi0gICAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBpZiByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIKLSAgICAgIFN0cmluZyBjb29raWUgPQotICAgICAgICAoU3RyaW5nKSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlclRva2VucyhoZWFkZXJzLCAiOiIpLmdldCgiQ29va2llIik7Ci0gICAgICBpZiAoY29va2llID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChjb29raWVWYWwuaXNDb29raWUoY29va2llLnRyaW0oKSkpCi0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICJcbk1lc3NhZ2U6XG5IZWFkZXJzOlxuIgotICAgICAgICAgICAgICAgICsgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCkKLSAgICAgICAgICAgICAgICArICJcblNPQVAgbWVzc2FnZTpcbiIKLSAgICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTA3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5MTNlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDExMDc7Ci0KLS8qKgotICogV1NJMTEwNwotICovCi1wdWJsaWMgY2xhc3MgV1NJMTEwNyBleHRlbmRzIEJQMTEwNwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMTA3KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwOC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MjM2ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTA4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5OdWxsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5PcGVyYXRpb25TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVHlwZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogQlBXU0k0LgotICogRWFjaCBzb2FwYmluZCBleHRlbnNpb24gZWxlbWVudCB3aXRoIGEgd3NkbDpyZXF1aXJlZCAKLSAqIGF0dHJpYnV0ZSBvZiBmYWxzZSBtdXN0IGFwcGVhciBpbiBhIG1lc3NhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMTA4IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLQotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTEwOChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBPcGVyYXRpb25TaWduYXR1cmUuT3BlcmF0aW9uTWF0Y2ggbWF0Y2ggPSBudWxsOwotICBwcml2YXRlIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQgPSBudWxsOwotICBwcml2YXRlIE9wZXJhdGlvblNpZ25hdHVyZSByZXNwb25zZVNpZyA9IG51bGw7Ci0gIHByaXZhdGUgVmVjdG9yIGhlYWRlclJhcnRzID0gbnVsbDsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0RmF1bHQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGV4aXN0U09BUEhlYWRlciA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1JlcXVlc3QgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGV4aXN0U09BUEhlYWRlckZhdWx0ID0gdHJ1ZTsKLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFNPQVBCb2R5LCBPYmplY3QsIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEJvZHkgYm9keSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0KLSAgICAvLyBpZiAid3NkbDpyZXF1aXJlZCIgaXMgdHJ1ZSB0aGVuIHJldHVybgotICAgIGlmIChib2R5LmdldFJlcXVpcmVkKCkgIT0gbnVsbAotICAgICAgJiYgYm9keS5nZXRSZXF1aXJlZCgpLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCi0gICAgICByZXR1cm47Ci0KLSAgICAvLyBhc3NlcnQgcGFyZW50IGluc3RhbmNlb2YgQmluZGluZ091dHB1dAotICAgIEJpbmRpbmdPcGVyYXRpb24gYm9wID0gY3R4LmdldEJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICBpZiAoYm9wLmdldE9wZXJhdGlvbigpID09IG51bGwKLSAgICAgIHx8IGJvcC5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKSA9PSBudWxsCi0gICAgICB8fCBib3AuZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgTWVzc2FnZSBtc2cgPSBib3AuZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgIExpc3QgcGFydHMgPQotICAgICAgV1NETFV0aWwuZ2V0UGFydHMoCi0gICAgICAgIGJvcC5nZXRPcGVyYXRpb24oKSwKLSAgICAgICAgbXNnLAotICAgICAgICBib2R5LAotICAgICAgICBtYXRjaC5nZXRPcGVyYXRpb25TdHlsZSgpKTsKLQotICAgIFFOYW1lIGFkZGl0aW9uYWxOYW1lID0gbnVsbDsKLSAgICAvLyBpZiBvcGVyYXRpb24gaXMgcnBjLCBhZGQgdG8gcGFydHMgcW5hbWUgcWl0aCBmdW5jdGlvbiBuYW1lCi0gICAgaWYgKFdTSUNvbnN0YW50cwotICAgICAgLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQwotICAgICAgLmVxdWFscyhtYXRjaC5nZXRPcGVyYXRpb25TdHlsZSgpKSkKLSAgICB7Ci0gICAgICAvLyBmb3VuZCBvdXQgdGFyZ2V0IG5hbWVzcGFjZQotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGJvZHkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBpZiAobmFtZXNwYWNlID09IG51bGwgfHwgbmFtZXNwYWNlLmxlbmd0aCgpID09IDApCi0gICAgICAgIC8vICEhIEFUVEVOVElPTgotICAgICAgICAvLyBuYW1lc3BhY2Ugc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tIHNlcnZpY2UgdGFyZ2V0IG5hbWVhcGNlICAgICAgICAgICAgCi0gICAgICAgIG5hbWVzcGFjZSA9IGN0eC5nZXRCaW5kaW5nKCkuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgLy8gaW5zZXJ0IG9wZXJhdGlvbiBuYW1lIGFzIGZpcnN0IHNpZ25hdHVyZSBwYXJ0Ci0gICAgICBhZGRpdGlvbmFsTmFtZSA9Ci0gICAgICAgIG5ldyBRTmFtZSgKLSAgICAgICAgICBuYW1lc3BhY2UsCi0gICAgICAgICAgYm9wCi0gICAgICAgICAgICAuZ2V0T3BlcmF0aW9uKCkKLSAgICAgICAgICAgIC5nZXRPdXRwdXQoKQotICAgICAgICAgICAgLmdldE1lc3NhZ2UoKQotICAgICAgICAgICAgLmdldFFOYW1lKCkKLSAgICAgICAgICAgIC5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotCi0gICAgLy8gY3JlYXRlIHRoZSBzaWduYXR1cmUgb2YgdGhpcyBvcGVyYXRpb24KLSAgICBPcGVyYXRpb25TaWduYXR1cmUgb3AgPQotICAgICAgbmV3IE9wZXJhdGlvblNpZ25hdHVyZSgKLSAgICAgICAgcGFydHMsCi0gICAgICAgIG51bGwsCi0gICAgICAgIG5ldyBUeXBlc1JlZ2lzdHJ5KAotICAgICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dAotICAgICAgICAgICAgLmdldENhbmRpZGF0ZUluZm8oKQotICAgICAgICAgICAgLmdldFdzZGxEb2N1bWVudCgpCi0gICAgICAgICAgICAuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICAgIHZhbGlkYXRvciksCi0gICAgICAgIGZhbHNlKTsKLSAgICBpZiAoYWRkaXRpb25hbE5hbWUgIT0gbnVsbCkKLSAgICAgIG9wLmdldFNpZ25hdHVyZSgpLmFkZCgwLCBhZGRpdGlvbmFsTmFtZSk7Ci0KLSAgICBpZiAob3AuZ2V0U2lnbmF0dXJlKCkuZXF1YWxzKHJlc3BvbnNlU2lnLmdldFNpZ25hdHVyZSgpKSkKLSAgICB7Ci0gICAgICAvLyAgICAgICAgICAgIGN0eC5jYW5jZWxCaW5kaW5nT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gY3JlYXRlIHRoZSBzaWduYXR1cmUgb2YgdGhpcyBvcGVyYXRpb24KLSAgICAgIG9wID0KLSAgICAgICAgbmV3IE9wZXJhdGlvblNpZ25hdHVyZSgKLSAgICAgICAgICBwYXJ0cywKLSAgICAgICAgICBudWxsLAotICAgICAgICAgIG5ldyBUeXBlc1JlZ2lzdHJ5KAotICAgICAgICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0Ci0gICAgICAgICAgICAgIC5nZXRDYW5kaWRhdGVJbmZvKCkKLSAgICAgICAgICAgICAgLmdldFdzZGxEb2N1bWVudCgpCi0gICAgICAgICAgICAgIC5nZXREZWZpbml0aW9ucygpLAotICAgICAgICAgICAgICB2YWxpZGF0b3IpLAotICAgICAgICAgIHRydWUpOwotCi0gICAgICBpZiAoYWRkaXRpb25hbE5hbWUgIT0gbnVsbCkKLSAgICAgICAgb3AuZ2V0U2lnbmF0dXJlKCkuYWRkKDAsIGFkZGl0aW9uYWxOYW1lKTsKLSAgICAgIGlmIChvcC5nZXRTaWduYXR1cmUoKS5lcXVhbHMocmVzcG9uc2VTaWcuZ2V0U2lnbmF0dXJlKCkpKQotICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgIlxuTWVzc2FnZTpcbiIgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlciwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBIZWFkZXIgaGVhZGVyLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0KLSAgICBpZiAoZXhpc3RTT0FQSGVhZGVyRmF1bHQgPT0gZmFsc2UpCi0gICAgewotICAgICAgZXhpc3RTT0FQSGVhZGVyID0gZmFsc2U7Ci0gICAgICBjdHguY2FuY2VsQmluZGluZ09wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gaWYgIndzZGw6cmVxdWlyZWQiIGlzIHRydWUgdGhlbiByZXR1cm4KLSAgICBpZiAoaGVhZGVyLmdldFJlcXVpcmVkKCkgIT0gbnVsbAotICAgICAgJiYgaGVhZGVyLmdldFJlcXVpcmVkKCkuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkKLSAgICAgIHJldHVybjsKLSAgICAvLyBmaW5kIGhlYWRyIHBhcnQKLSAgICBEZWZpbml0aW9uIGQgPSAoRGVmaW5pdGlvbikgY3R4LmdldFBhcmFtZXRlcigiZGVmaW5pdGlvbiIpOwotICAgIFR5cGVzUmVnaXN0cnkgdFJlZyA9IChUeXBlc1JlZ2lzdHJ5KSBjdHguZ2V0UGFyYW1ldGVyKCJUeXBlc1JlZ2lzdHJ5Iik7Ci0gICAgUGFydCBtZXNQYXJ0ID0KLSAgICAgIFdTRExVdGlsLmdldFBhcnQoZC5nZXRNZXNzYWdlKGhlYWRlci5nZXRNZXNzYWdlKCkpLCBoZWFkZXIuZ2V0UGFydCgpKTsKLQotICAgIC8vIHRlc3QgdGhpcyBwYXJ0IGFuZCBwYXJ0cyBmcm9tIGhlYWRlciAgICAgICAgCi0gICAgUU5hbWUgcGFydFFOYW1lID0gbWVzUGFydC5nZXRUeXBlTmFtZSgpOwotICAgIGlmIChwYXJ0UU5hbWUgPT0gbnVsbCkKLSAgICAgIHBhcnRRTmFtZSA9IHRSZWcuZ2V0VHlwZShtZXNQYXJ0LmdldEVsZW1lbnROYW1lKCkpOwotICAgIGlmIChwYXJ0UU5hbWUgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJQYXJ0IHR5cGUgY2FuIG5vdCBiZSBudWxsLiIgKyBtZXNQYXJ0LmdldEVsZW1lbnROYW1lKCkudG9TdHJpbmcoKSk7Ci0gICAgU3RyaW5nIGxvY2FsID0gcGFydFFOYW1lLmdldExvY2FsUGFydCgpOwotICAgIFN0cmluZyBucyA9IHBhcnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgIGV4aXN0U09BUEhlYWRlciA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyUmFydHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpIGhlYWRlclJhcnRzLmdldChpKTsKLSAgICAgIGlmIChlbGVtLmdldExvY2FsTmFtZSgpLmVxdWFscyhsb2NhbCkKLSAgICAgICAgJiYgTnVsbFV0aWwuZXF1YWxzKG5zLCBlbGVtLmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgIHsKLSAgICAgICAgZXhpc3RTT0FQSGVhZGVyID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChleGlzdFNPQVBIZWFkZXIgPT0gdHJ1ZSkKLSAgICAgIGN0eC5jYW5jZWxTT0FQSGVhZGVyUHJvY2Vzc2luZygpOwotICAgIGlmIChpc1JlcXVlc3QgPT0gdHJ1ZSkKLSAgICAgIGN0eC5jYW5jZWxCaW5kaW5nT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICAgIGlmIChleGlzdFNPQVBIZWFkZXIgPT0gZmFsc2UgJiYgaXNSZXF1ZXN0ID09IGZhbHNlKQotICAgICAgZXhpc3RTT0FQSGVhZGVyRmF1bHQgPSBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBIZWFkZXJGYXVsdCBoZWFkZXJGYXVsdCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIC8vIGZpbmQgaGVhZHIgcGFydAotICAgIERlZmluaXRpb24gZCA9IChEZWZpbml0aW9uKSBjdHguZ2V0UGFyYW1ldGVyKCJkZWZpbml0aW9uIik7Ci0gICAgVHlwZXNSZWdpc3RyeSB0UmVnID0gKFR5cGVzUmVnaXN0cnkpIGN0eC5nZXRQYXJhbWV0ZXIoIlR5cGVzUmVnaXN0cnkiKTsKLSAgICBQYXJ0IG1lc1BhcnQgPQotICAgICAgV1NETFV0aWwuZ2V0UGFydCgKLSAgICAgICAgZC5nZXRNZXNzYWdlKGhlYWRlckZhdWx0LmdldE1lc3NhZ2UoKSksCi0gICAgICAgIGhlYWRlckZhdWx0LmdldFBhcnQoKSk7Ci0KLSAgICAvLyB0ZXN0IHRoaXMgcGFydCBhbmQgcGFydHMgZnJvbSBoZWFkZXJmYXVsdAotICAgIFFOYW1lIHBhcnRRTmFtZSA9IG1lc1BhcnQuZ2V0VHlwZU5hbWUoKTsKLSAgICBpZiAocGFydFFOYW1lID09IG51bGwpCi0gICAgICBwYXJ0UU5hbWUgPSB0UmVnLmdldFR5cGUobWVzUGFydC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICBpZiAocGFydFFOYW1lID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiUGFydCB0eXBlIGNhbiBub3QgYmUgbnVsbC4iICsgbWVzUGFydC5nZXRFbGVtZW50TmFtZSgpLnRvU3RyaW5nKCkpOwotICAgIFN0cmluZyBsb2NhbCA9IHBhcnRRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICBTdHJpbmcgbnMgPSBwYXJ0UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlclJhcnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbSA9IChFbGVtZW50KSBoZWFkZXJSYXJ0cy5nZXQoaSk7Ci0gICAgICBpZiAoZWxlbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMobG9jYWwpCi0gICAgICAgICYmIE51bGxVdGlsLmVxdWFscyhucywgZWxlbS5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICB7Ci0gICAgICAgIGV4aXN0U09BUEhlYWRlckZhdWx0ID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChleGlzdFNPQVBIZWFkZXJGYXVsdCA9PSB0cnVlKQotICAgICAgY3R4LmNhbmNlbFNPQVBIZWFkZXJQcm9jZXNzaW5nKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQRmF1bHQgZmF1bHQsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIC8vIHNldCBpbiB0cnVlIGlmIGFueSBTT0FQRmF1bHQgZXhpc3QKLSAgICB2aXNpdEZhdWx0ID0gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhpcy5lbnRyeUNvbnRleHQgPSBlbnRyeUNvbnRleHQ7Ci0gICAgICAvLyBQYXJzZSByZXF1ZXN0IG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0RG9jdW1lbnQoKTsKLSAgICAgIC8vIGNyZWF0ZSByZXF1ZXN0IHNpZ25hdHVyZQotICAgICAgbWF0Y2ggPQotICAgICAgICBPcGVyYXRpb25TaWduYXR1cmUubWF0Y2hPcGVyYXRpb24oCi0gICAgICAgICAgZG9jLAotICAgICAgICAgIG51bGwsCi0gICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKVswXSwKLSAgICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dAotICAgICAgICAgICAgICAuZ2V0Q2FuZGlkYXRlSW5mbygpCi0gICAgICAgICAgICAgIC5nZXRXc2RsRG9jdW1lbnQoKQotICAgICAgICAgICAgICAuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICAgICAgdmFsaWRhdG9yKSwKLSAgICAgICAgICBmYWxzZSk7Ci0KLSAgICAgIC8vIGlmIHN1Y2ggb3BlcmF0aW9uIGV4aXN0ICAgICAgCi0gICAgICBpZiAobWF0Y2ggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaXNSZXF1ZXN0ID0KLSAgICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNULmVxdWFscygKLSAgICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkpOwotICAgICAgICAvLyBQYXJzZSBtZXNzYWdlCi0gICAgICAgIGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotCi0gICAgICAgIGlmICghaXNSZXF1ZXN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmVzcG9uc2VTaWcgPSBuZXcgT3BlcmF0aW9uU2lnbmF0dXJlKGRvYyk7Ci0gICAgICAgICAgaWYgKFdTSUNvbnN0YW50cwotICAgICAgICAgICAgLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQwotICAgICAgICAgICAgLmVxdWFscyhtYXRjaC5nZXRPcGVyYXRpb25TdHlsZSgpKSkKLSAgICAgICAgICAgIHJlc3BvbnNlU2lnLmNyZWF0ZVJQQ1NpZ25hdHVyZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGV4dHJhY3QgYWxsIGhlYWRlcnMgZnJvbSBtZXNzYWdlCi0gICAgICAgIEVsZW1lbnQgaGVhZGVyRWxlbSA9Ci0gICAgICAgICAgWE1MVXRpbHMuZmluZENoaWxkRWxlbWVudCgKLSAgICAgICAgICAgIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSwKLSAgICAgICAgICAgIFdTSVRhZy5FTEVNX1NPQVBfSEVBREVSKTsKLSAgICAgICAgaGVhZGVyUmFydHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGlmIChoZWFkZXJFbGVtICE9IG51bGwpCi0gICAgICAgICAgaGVhZGVyUmFydHMgPSBYTUxVdGlscy5nZXRDaGlsZEVsZW1lbnRzKGhlYWRlckVsZW0pOwotCi0gICAgICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAgICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICAgICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgICAgIHRyYXZlcnNhbC52aXNpdFNPQVBCb2R5KHRydWUpOwotICAgICAgICB0cmF2ZXJzYWwudmlzaXRTT0FQSGVhZGVyKHRydWUpOwotICAgICAgICB0cmF2ZXJzYWwudmlzaXRTT0FQSGVhZGVyRmF1bHQodHJ1ZSk7Ci0gICAgICAgIHRyYXZlcnNhbC52aXNpdFNPQVBGYXVsdCh0cnVlKTsKLQotICAgICAgICB0cmF2ZXJzYWwuaWdub3JlUmVmZXJlbmNlcygpOwotICAgICAgICB0cmF2ZXJzYWwuaWdub3JlQmluZGluZ0lucHV0MlNPQVBCb2R5KCk7Ci0KLSAgICAgICAgaWYgKGlzUmVxdWVzdCkKLSAgICAgICAgICB0cmF2ZXJzYWwuaWdub3JlQmluZGluZ091dHB1dCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgdHJhdmVyc2FsLmlnbm9yZUJpbmRpbmdJbnB1dDJTT0FQSGVhZGVyKCk7Ci0KLSAgICAgICAgaWYgKHJlc3BvbnNlU2lnICE9IG51bGwgJiYgcmVzcG9uc2VTaWcuaXNGYXVsdCgpKQotICAgICAgICAgIHRyYXZlcnNhbC5pZ25vcmVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0cmF2ZXJzYWwuaWdub3JlQmluZGluZ0ZhdWx0KCk7Ci0KLSAgICAgICAgZXhpc3RTT0FQSGVhZGVyRmF1bHQgPSB0cnVlOwotICAgICAgICBNYXAgbSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIFdTRExVdGlsLmV4cGFuZERlZmluaXRpb24oCi0gICAgICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0Ci0gICAgICAgICAgICAuZ2V0Q2FuZGlkYXRlSW5mbygpCi0gICAgICAgICAgICAuZ2V0V3NkbERvY3VtZW50KCkKLSAgICAgICAgICAgIC5nZXREZWZpbml0aW9ucygpKTsKLSAgICAgICAgbS5wdXQoCi0gICAgICAgICAgImRlZmluaXRpb24iLAotICAgICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQKLSAgICAgICAgICAgIC5nZXRDYW5kaWRhdGVJbmZvKCkKLSAgICAgICAgICAgIC5nZXRXc2RsRG9jdW1lbnQoKQotICAgICAgICAgICAgLmdldERlZmluaXRpb25zKCkpOwotICAgICAgICBUeXBlc1JlZ2lzdHJ5IHRSZWcgPQotICAgICAgICAgIG5ldyBUeXBlc1JlZ2lzdHJ5KAotICAgICAgICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0Ci0gICAgICAgICAgICAgIC5nZXRDYW5kaWRhdGVJbmZvKCkKLSAgICAgICAgICAgICAgLmdldFdzZGxEb2N1bWVudCgpCi0gICAgICAgICAgICAgIC5nZXREZWZpbml0aW9ucygpLAotICAgICAgICAgICAgICB2YWxpZGF0b3IpOwotICAgICAgICBtLnB1dCgiVHlwZXNSZWdpc3RyeSIsIHRSZWcpOwotICAgICAgICB0cmF2ZXJzYWwudHJhdmVyc2UobWF0Y2guZ2V0T3BlcmF0aW9uKCksIG0pOwotCi0gICAgICAgIGlmIChpc1JlcXVlc3QgPT0gZmFsc2UpCi0gICAgICAgICAgaWYgKGV4aXN0U09BUEhlYWRlckZhdWx0ID09IHRydWUpCi0gICAgICAgICAgICBleGlzdFNPQVBIZWFkZXIgPSB0cnVlOwotCi0gICAgICAgIGlmIChyZXNwb25zZVNpZyAhPSBudWxsCi0gICAgICAgICAgJiYgcmVzcG9uc2VTaWcuaXNGYXVsdCgpCi0gICAgICAgICAgJiYgdmlzaXRGYXVsdCA9PSBmYWxzZSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgIlxuTWVzc2FnZTpcbiIgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleGlzdFNPQVBIZWFkZXIgPT0gZmFsc2UpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICJcbk1lc3NhZ2U6XG4iICsgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwOS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTA5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjQ0Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTA5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogV1NJMTEwOS4KLSAqIEFueSBjb25mb3JtYW5jZSBjbGFpbXMgTVVTVCBiZSBjaGlsZHJlbiBvZiB0aGUgc29hcDpIZWFkZXIgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIFdTSTExMDkgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMTA5KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKFRlc3RBc3NlcnRpb24sIEVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBpZiAoKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKSAhPSBudWxsKQotICAgICAgJiYgKCF0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBQYXJzZSBtZXNzYWdlCi0gICAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIC8vIGZpbmQgIkhlYWRlciIgZWxlbWVudAotICAgICAgICBOb2RlTGlzdCBoZWFkZXJMaXN0ID0KLSAgICAgICAgICByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCAiSGVhZGVyIik7Ci0gICAgICAgIEVsZW1lbnQgaGVhZGVyRWxlbSA9IG51bGw7Ci0gICAgICAgIGlmIChoZWFkZXJMaXN0ICE9IG51bGwgJiYgaGVhZGVyTGlzdC5nZXRMZW5ndGgoKSAhPSAwKQotICAgICAgICAgIGhlYWRlckVsZW0gPSAoRWxlbWVudCkgaGVhZGVyTGlzdC5pdGVtKDApOwotCi0gICAgICAgIC8vIGZpbmQgIkNsYWltIiBlbGVtZW50Ci0gICAgICAgIE5vZGVMaXN0IGNsYWltTGlzdCA9Ci0gICAgICAgICAgcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFdTSUNvbnN0YW50cy5OU19VUklfQ0xBSU0sICJDbGFpbSIpOwotICAgICAgICBpZiAoY2xhaW1MaXN0ID09IG51bGwgfHwgY2xhaW1MaXN0LmdldExlbmd0aCgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhaW1MaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGhlYWRlckVsZW0gPT0gbnVsbAotICAgICAgICAgICAgICB8fCBjbGFpbUxpc3QuaXRlbShpKS5nZXRQYXJlbnROb2RlKCkgIT0gaGVhZGVyRWxlbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICAgICAiXG5TT0FQIG1lc3NhZ2U6XG4iCi0gICAgICAgICAgICAgICAgICAgICsgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTEwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzYjllMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIFdTSTExMTAuCi0gKiBBbnkgY29uZm9ybWFuY2UgY2xhaW1zIE1VU1QgYWRoZXJlIHRvIHRoZSBXUy1JIGNvbmZvcm1hbmNlIAotICogY2xhaW0gc2NoZW1hIGRlZmluZWQgaW4gdGhlIEJhc2ljIFByb2ZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMTEwIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTExMChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgRG9jdW1lbnQgZG9jOwotICAgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkgIT0gbnVsbAotICAgICAgJiYgIXRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KQotICAgICAgJiYgKGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIC8vIGZpbmQgIkNsYWltIiBlbGVtZW50Ci0gICAgICBOb2RlTGlzdCBjbGFpbUxpc3QgPQotICAgICAgICByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9DTEFJTSwgIkNsYWltIik7Ci0gICAgICBpZiAoY2xhaW1MaXN0ID09IG51bGwgfHwgY2xhaW1MaXN0LmdldExlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhaW1MaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGVsZW0gPSAoRWxlbWVudCkgY2xhaW1MaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgLy8gY2hlY2sgImNvbmZvcm1zVG8iIGF0dHJpYnV0ZQotICAgICAgICAgIE5vZGUgbm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiY29uZm9ybXNUbyIpOwotICAgICAgICAgIGlmIChub2RlID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgICAiXG5TT0FQIG1lc3NhZ2U6XG4iCi0gICAgICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAvKiBUaGlzIGlzIGNoZWNrZWQgaW4gV1NJMTExMQotICAgICAgICAgIC8vIGNoZWNrICJtdXN0VW5kZXJzdGFuZCIgYXR0cmlidXRlCi0gICAgICAgICAgbm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZU5TKFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwgIm11c3RVbmRlcnN0YW5kIik7Ci0gICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPSBjcmVhdGVGYWlsdXJlRGV0YWlsKCJcblNPQVAgbWVzc2FnZTpcbiIgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgICovCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTExLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg0ZTNmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIFdTSTExMTEuCi0gKiBBbnkgY29uZm9ybWFuY2UgY2xhaW1zIE1VU1QgTk9UIHVzZSBzb2FwOm11c3RVbmRlcnN0YW5kPScxJy4KLSAqLwotcHVibGljIGNsYXNzIFdTSTExMTEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMTExKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKFRlc3RBc3NlcnRpb24sIEVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBEb2N1bWVudCBkb2M7Ci0gICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKSAhPSBudWxsCi0gICAgICAmJiAhdGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpCi0gICAgICAmJiAoZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgLy8gZmluZCAiQ2xhaW0iIGVsZW1lbnQKLSAgICAgIE5vZGVMaXN0IGNsYWltTGlzdCA9Ci0gICAgICAgIHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXU0lDb25zdGFudHMuTlNfVVJJX0NMQUlNLCAiQ2xhaW0iKTsKLSAgICAgIGlmIChjbGFpbUxpc3QgIT0gbnVsbCAmJiBjbGFpbUxpc3QuZ2V0TGVuZ3RoKCkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgY29udGFpbnMgIkNsYWltIiBlbGVtZW50IGZpbmQgYWxsICJIZWFkZXIiIGVsZW1lbnRzCi0gICAgICAgIE5vZGVMaXN0IGhlYWRlckxpc3QgPQotICAgICAgICAgIHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsICJIZWFkZXIiKTsKLSAgICAgICAgaWYgKGhlYWRlckxpc3QgIT0gbnVsbCAmJiBoZWFkZXJMaXN0LmdldExlbmd0aCgpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpSGVhZGVyID0gMDsgaUhlYWRlciA8IGhlYWRlckxpc3QuZ2V0TGVuZ3RoKCk7IGlIZWFkZXIrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmaW5kIGFsbCAiSGVhZGVyIiBjaGlsZCBlbGVtZW50cwotICAgICAgICAgICAgTm9kZSBjaGlsZCA9IGhlYWRlckxpc3QuaXRlbShpSGVhZGVyKS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBjb250YWlucyAibXVzdFVuZGVyc3RhbmQiIC0+IGZhaWwKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXR0clZhbCA9Ci0gICAgICAgICAgICAgICAgICAoKEVsZW1lbnQpIGNoaWxkKS5nZXRBdHRyaWJ1dGVOUygKLSAgICAgICAgICAgICAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLAotICAgICAgICAgICAgICAgICAgICAibXVzdFVuZGVyc3RhbmQiKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0clZhbCAhPSBudWxsICYmICEiIi5lcXVhbHMoYXR0clZhbCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgICAgICAgICAiXG5TT0FQIG1lc3NhZ2U6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgIGlIZWFkZXIgPSBoZWFkZXJMaXN0LmdldExlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTE2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4OWRkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLQotLyoqCi0gKiBXU0kxMTE2Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMTE2IGV4dGVuZHMgQlAxMTE2Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTExMTYoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTIxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzZWJhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25QYXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIEJQV1NJNC4KLSAqLwotcHVibGljIGNsYXNzIFdTSTExMjEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMTIxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR1Q6IC0tIHN0YXJ0OiBiYXNlIG9uIHdzaTEwMTEgLSBzaG91bGQgcmVmYWN0b3IgdGhpcwotCi0gICAgICBCaW5kaW5nW10gYmluZGluZ3MgPSB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXRCaW5kaW5ncygpOwotCi0gICAgICAvLyBnZXQgc29hcCBtZXNzYWdlIGNoaWxkIG5hbWUKLSAgICAgIC8vIEdldCB0aGUgRE9NIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIHNvYXA6Ym9keSAoaWYgbm9uLWVtcHR5KQotICAgICAgRG9jdW1lbnQgbWVzc2FnZURvYyA9IG51bGw7Ci0KLSAgICAgIFFOYW1lIG1lc3NhZ2VQYXJ0RWxlbWVudFFOYW1lID0gbnVsbDsKLSAgICAgIGlmICghZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICBtZXNzYWdlRG9jID0KLSAgICAgICAgICBYTUxVdGlscy5wYXJzZVhNTChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgLy8gZ2V0IHNvYXAgb3BlcmF0aW9uIG5hbWUgZnJvbSB0aGUgc29hcDpib2R5Ci0KLSAgICAgICAgLy8gTk9URTogZ2V0U29hcEJvZHlDaGlsZCgpIG1heSByZXR1cm4gbnVsbCwgaWYgdGhlIHNvYXA6Ym9keSBkaWQgbm90IGNvbnRhaW4gYW55IGNoaWxkIGVsZW1lbnRzCi0gICAgICAgIEVsZW1lbnQgc29hcE1lc3NhZ2VFbGVtZW50ID0gdGhpcy52YWxpZGF0b3IuZ2V0U29hcEJvZHlDaGlsZChtZXNzYWdlRG9jKTsKLQotICAgICAgICAvLyBmb3IgZG9jLWxpdC4uLiBmaW5kIHRoZSB3c2RsOnBhcnQgZnJvbSBvbmUgb2YgdGhlIHNwZWNpZmllZCBvcGVyYXRpb25zIHRoYXQgaGFzIAotICAgICAgICAvLyB0aGUgc29hcCBlbGVtZW50IHVzZWQgaW4gdGhlIG1lc3NhZ2UuICAgICAgCi0gICAgICAgIC8vIHdlIGFyZSBsb29raW5nIGZvciBhIHBhcnQgd2l0aCBhbiBlbGVtZW50IGF0dHJpYiB2YWwgbWF0Y2hpbmcgdGhlIHNvYXAgbWVzc2FnZSBlbGVtZW50Ci0gICAgICAgIGlmIChzb2FwTWVzc2FnZUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG1lc3NhZ2VQYXJ0RWxlbWVudFFOYW1lID0KLSAgICAgICAgICAgIG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgc29hcE1lc3NhZ2VFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICBzb2FwTWVzc2FnZUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICgobWVzc2FnZURvYyA9PSBudWxsKSB8fCB0aGlzLnZhbGlkYXRvci5pc0ZhdWx0KG1lc3NhZ2VEb2MpKQotICAgICAgewotICAgICAgICAvLyBlbXB0eSBtZXNzYWdlcyBhbmQgbWVzc2FnZXMgY29udGFpbmluZyBzb2FwOkZhdWx0cyBkbyBub3QgcXVhbGlmeSBmb3IgdGhpcyBUQQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uW10gZG9jQmluZGluZ09wZXJhdGlvbnMgPQotICAgICAgICB0aGlzLnZhbGlkYXRvci5nZXRNYXRjaGluZ0JpbmRpbmdPcHMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQywKLSAgICAgICAgICBiaW5kaW5ncyk7Ci0gICAgICAvLyBsaXN0IG9mIG9wZXJhdGlvbnMgdGhhdCBtYXRjaCB0aGUgPHdzZGw6aW5wdXQ+IG9yIDx3c2RsOm91dHB1dD4gKGRlcGVuZGluZyBvbiBlbnRyeVR5cGUpCi0gICAgICAvLyBmb3IgcGFydCBlbGVtZW50PSIuLi4iCi0gICAgICAvLyAoSVNTVUU6IHdoYXQgYWJvdXQgcGFydCB0eXBlPSIuLi4iPykKLSAgICAgIEJpbmRpbmdPcGVyYXRpb25bXSBwb3RlbnRpYWxEb2NMaXRPcHMgPQotICAgICAgICB0aGlzLnZhbGlkYXRvci5nZXREb2NMaXRPcGVyYXRpb25zKAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLAotICAgICAgICAgIG1lc3NhZ2VQYXJ0RWxlbWVudFFOYW1lLAotICAgICAgICAgIGRvY0JpbmRpbmdPcGVyYXRpb25zKTsKLSAgICAgIC8vIEdUOiAtLS0gZW5kOiBiYXNlIG9uIHdzaTEwMTEKLQotICAgICAgLy8gICAgICAgICAgICAgICAKLSAgICAgIGlmIChwb3RlbnRpYWxEb2NMaXRPcHMubGVuZ3RoID09IDApCi0gICAgICB7Ci0gICAgICAgIC8vIG5vdCBkb2MtbGl0IHNvIHF1aXQKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gV2Uga25vdyB0aGVyZSBpcyBhIGRvYy1saXQgbWF0Y2gsIHNvIG5vdyB0cnkgdG8gdmFsaWRhdGUgdGhlIHNvYXAgbWVzc2FnZSBhZ2FpbnN0IHRoZQotICAgICAgLy8gcmVmZXJlbmNlZCBzY2hlbWEKLQotICAgICAgLy8gR1QgLSBob3cgdG8gcmVmZXJlbmNlIHRoZSBzY2hlbWEgZG9jdW1lbnQ/PyBuZWVkIHRvIHVzZSB0aGUgPHdzZGw6cGFydD4sIG9yIGRvIGl0IHB1cmVseQotICAgICAgLy8gZnJvbSB0aGUgc29hcCBtZXNzYWdlIGVsZW1lbnRzPwotICAgICAgLy8gaWUgYm9keSwgZW52ZWxvcGUgb3Igd3NkbD8/Ci0KLSAgICAgIC8vIDxleHBlcmltZW50PgotCi0gICAgICBib29sZWFuIGlzU2NoZW1hVmFsaWQ7Ci0gICAgICAKLSAgICAgIHRyeSB7Ci0gICAgICAJCWlzU2NoZW1hVmFsaWQgPSB0aGlzLnZhbGlkYXRvci5tZXNzYWdlSXNEb2NMaXRTY2hlbWFWYWxpZChlbnRyeUNvbnRleHQpOyAgICAgICAgIAotICAgICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigpOwotICAgICAgCX0KLSAgICAgIC8vIDwvZXhwZXJpbWVudD4KLSAgICAgIAotCi0gICAgICAvL2lzU2NoZW1hVmFsaWQgPSB0cnVlOyAvLyBmb3Igbm93LCBnZXR0aW5nIHRoaXMgZmFyIGRvZXMgaXQKLQotICAgICAgaWYgKGlzU2NoZW1hVmFsaWQpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvblBhc3NFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEyMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTIwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZmMDg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTIwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTIwMTsKLQotLyoqCi0gKiBXU0kxMjAxCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMjAxIGV4dGVuZHMgQlAxMjAxCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEyMDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMjAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEyMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzMWNkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEyMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEyMDI7Ci0KLS8qKgotICogV1NJMTIwMgotICovCi1wdWJsaWMgY2xhc3MgV1NJMTIwMiBleHRlbmRzIEJQMTIwMgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMjAyKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTIwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMjAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2M2JjYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMjAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMjAzOwotCi0vKioKLSAqIFdTSTEyMDMKLSAqLwotcHVibGljIGNsYXNzIFdTSTEyMDMgZXh0ZW5kcyBCUDEyMDMKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTIwMyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEyMDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTIwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmRkYTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTIwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTIwNDsKLQotLyoqCi0gKiBXU0kxMjA0Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMjA0IGV4dGVuZHMgQlAxMjA0Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEyMDQoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMjA4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEyMDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5NDk2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEyMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEyMDg7Ci0KLS8qKgotICogV1NJMTIwOAotICovCi1wdWJsaWMgY2xhc3MgV1NJMTIwOCBleHRlbmRzIEJQMTIwOAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMjA4KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTIxMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMjExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjU3YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMjExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMjExOwotCi0vKioKLSAqIFdTSTEyMTEKLSAqLwotcHVibGljIGNsYXNzIFdTSTEyMTEgZXh0ZW5kcyBCUDEyMTEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTIxMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjBlYjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTMwMTsKLQotLyoqCi0gKiBXU0kxMzAxCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMzAxIGV4dGVuZHMgQlAxMzAxCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEzMDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5NzZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEzMDI7Ci0KLS8qKgotICogV1NJMTMwMgotICovCi1wdWJsaWMgY2xhc3MgV1NJMTMwMiBleHRlbmRzIEJQMTMwMgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMzAyKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwNS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMmUxM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzA1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMzA1OwotCi0vKioKLSAqIFdTSTEzMDUKLSAqLwotcHVibGljIGNsYXNzIFdTSTEzMDUgZXh0ZW5kcyBCUDEzMDUKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTMwNShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjEwNjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTMwNjsKLQotLyoqCi0gKiBXU0kxMzA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMzA2IGV4dGVuZHMgQlAxMzA2Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEzMDYoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzA3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3MDVhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEzMDc7Ci0KLS8qKgotICogV1NJMTMwNwotICovCi1wdWJsaWMgY2xhc3MgV1NJMTMwNyBleHRlbmRzIEJQMTMwNwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMzA3KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwOC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMjcxY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzA4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMzA4OwotCi0vKioKLSAqIFdTSTEzMDgKLSAqLwotcHVibGljIGNsYXNzIFdTSTEzMDggZXh0ZW5kcyBCUDEzMDgKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTMwOChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTY0MzU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTMwOTsKLQotLyoqCi0gKiBXU0kxMzA5Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMzA5IGV4dGVuZHMgQlAxMzA5Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEzMDkoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzExLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5OGZhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuT3BlcmF0aW9uU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlR5cGVzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogQlBXU0k0LgotICogVGhlIHJlc3BvbnNlIChTT0FQIGVudmVsb3BlKSBzaG91bGQgYmUgY2FycmllZCBieSBhbiBIVFRQIAotICogcmVzcG9uc2UsIG92ZXIgc2FtZSBIVFRQIGNvbm5lY3Rpb24gYXMgdGhlIFJlcXVlc3QuIAotICovCi1wdWJsaWMgY2xhc3MgV1NJMTMxMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEzMTEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUoVGVzdEFzc2VydGlvbiwgRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIGJvb2xlYW4gaXNPbmVXYXlSZXNwb25zZSA9IHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KTsKLQotICAgIERvY3VtZW50IGRvY1Jlc3BvbnNlID0gbnVsbDsKLSAgICBpZiAoIWlzT25lV2F5UmVzcG9uc2UpCi0gICAgICBkb2NSZXNwb25zZSA9IGVudHJ5Q29udGV4dC5nZXRSZXNwb25zZURvY3VtZW50KCk7Ci0KLSAgICAvL2lmIGZhdWx0Ci0gICAgaWYgKCFpc09uZVdheVJlc3BvbnNlICYmIHRoaXMudmFsaWRhdG9yLmlzRmF1bHQoZG9jUmVzcG9uc2UpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAvLyBub3QgZmF1bHQKLSAgICAgIC8vIDEuIGdldCBhbiBvcGVyYXRpb24gZnJvbSByZXF1ZXN0Ci0gICAgICAvLyBQYXJzZSByZXF1ZXN0IG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IGRvY1JlcXVlc3QgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdERvY3VtZW50KCk7Ci0KLSAgICAgIC8vIGdldCBTT0FQQWN0aW9uCi0gICAgICBTdHJpbmcgaGVhZGVycyA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0SFRUUEhlYWRlcnMoKTsKLSAgICAgIFN0cmluZyBhY3Rpb24gPSBudWxsOwotICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkKLSAgICAgICAgYWN0aW9uID0gKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoaGVhZGVycywgIjoiKS5nZXQoIlNPQVBBY3Rpb24iLnRvVXBwZXJDYXNlKCkpOwotICAgICAgQmluZGluZyBiaW5kaW5nID0gdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKVswXTsKLSAgICAgIFR5cGVzUmVnaXN0cnkgcmVnaXN0cnkgPQotICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5nZXRXU0RMRG9jdW1lbnQoKS5nZXREZWZpbml0aW9ucygpLAotICAgICAgICAgIHZhbGlkYXRvcik7Ci0gICAgICBPcGVyYXRpb25TaWduYXR1cmUuT3BlcmF0aW9uTWF0Y2ggbWF0Y2ggPQotICAgICAgICBPcGVyYXRpb25TaWduYXR1cmUubWF0Y2hPcGVyYXRpb24oCi0gICAgICAgICAgZG9jUmVxdWVzdCwKLSAgICAgICAgICBhY3Rpb24sCi0gICAgICAgICAgYmluZGluZywKLSAgICAgICAgICByZWdpc3RyeSk7Ci0KLSAgICAgIGlmIChtYXRjaCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotCi0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gbWF0Y2guZ2V0T3BlcmF0aW9uKCk7Ci0gICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgICAvLyAgICBDaGVjayB3aGV0aGVyIHRoZSB0cmFuc3BvcnQgYXR0cmlidXRlIGhhcyB0aGUgdmFsdWUgCi0gICAgICAgICAgLy8gICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLiAKLSAgICAgICAgICBMaXN0IGV4dEVsZW0gPSBiaW5kaW5nLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaW5kZXggPSBleHRFbGVtLml0ZXJhdG9yKCk7IGluZGV4Lmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG8gPSAoT2JqZWN0KSBpbmRleC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IChTT0FQQmluZGluZykgbzsKLSAgICAgICAgICAgICAgaWYgKCFXU0lDb25zdGFudHMKLSAgICAgICAgICAgICAgICAuTlNfVVJJX1NPQVBfSFRUUAotICAgICAgICAgICAgICAgIC5lcXVhbHMoc29hcEJpbmRpbmcuZ2V0VHJhbnNwb3J0VVJJKCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy9maW5kIG9wZXJhdGlvbiBpbiBwb3J0IHR5cGUKLSAgICAgICAgICBvcGVyYXRpb24gPSBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpOwotICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChpc09uZVdheVJlc3BvbnNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb24uZ2V0T3V0cHV0KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyAgICBjaGVjayB3aGV0aGVyIHRoZSByZXNwb25zZSBtZXNzYWdlIGZyb20gdGhlIGxvZyAKLSAgICAgICAgICAvLyAgY29udGFpbnMgdGhlIG91dHB1dCBtZXNzYWdlCi0gICAgICAgICAgTm9kZUxpc3Qgc29hcEJvZHlMaXN0ID0KLSAgICAgICAgICAgIGRvY1Jlc3BvbnNlLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwKLSAgICAgICAgICAgICAgWE1MVXRpbHMuU09BUF9FTEVNX0JPRFkpOwotICAgICAgICAgIGlmICgoc29hcEJvZHlMaXN0ID09IG51bGwpIHx8IChzb2FwQm9keUxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gUmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBhbnkgc29hcCBCb2R5IGVsZW1lbnRzCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvYXBCb2R5TGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgbmV4dEJvZHlFbGVtID0gKEVsZW1lbnQpIHNvYXBCb2R5TGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgRWxlbWVudCBzb2FwTWVzc2FnZUVsZW1lbnQgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKG5leHRCb2R5RWxlbSk7Ci0gICAgICAgICAgICB3aGlsZSAoc29hcE1lc3NhZ2VFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBvdXRwdXQgaGFzIG1lc3NhZ2UgZnJvbSBTT0FQIHJlc3BvbnNlCi0gICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG9wZXJhdGlvbi5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgIFFOYW1lIHNvYXBNZXNzYWdlUU5hbWUgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIHNvYXBNZXNzYWdlUU5hbWUuZXF1YWxzKG1lc3NhZ2UuZ2V0UU5hbWUoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgc29hcE1lc3NhZ2VFbGVtZW50ID0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy5nZXROZXh0U2libGluZyhzb2FwTWVzc2FnZUVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXN1bHQgPT0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQpCi0gICAgewotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwobnVsbCwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzE2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkMzE2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEzMTY7Ci0KLS8qKgotICogV1NJMTMxNgotICovCi1wdWJsaWMgY2xhc3MgV1NJMTMxNiBleHRlbmRzIEJQMTMxNgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMzE2KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMxOC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2NkOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMzE4OwotCi0vKioKLSAqIFdTSTEzMTgKLSAqLwotcHVibGljIGNsYXNzIFdTSTEzMTggZXh0ZW5kcyBCUDEzMTgKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTMxOChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTE2MDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTYwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTkyMGY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTYwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTYwMTsKLQotLyoqCi0gKiBXU0kxNjAxCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxNjAxIGV4dGVuZHMgQlAxNjAxCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTE2MDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxNzAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTE3MDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE3YmVmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTE3MDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDE3MDE7Ci0KLS8qKgotICogV1NJMTcwMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMTcwMSBleHRlbmRzIEJQMTcwMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxNzAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTAwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzFhMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlA0MTAwOwotCi0vKioKLSAqIFdTSTQxMDAKLSAqLwotcHVibGljIGNsYXNzIFdTSTQxMDAgZXh0ZW5kcyBCUDQxMDAKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJNDEwMChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTQxMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTAxNjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQNDEwMTsKLQotLyoqCi0gKiBXU0k0MTAxCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0k0MTAxIGV4dGVuZHMgQlA0MTAxCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTQxMDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTQxMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1ZmZhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTQxMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDQxMDI7Ci0KLS8qKgotICogV1NJNDEwMgotICovCi1wdWJsaWMgY2xhc3MgV1NJNDEwMiBleHRlbmRzIEJQNDEwMgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0k0MTAyKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNjFkMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJNDEwMwotICovCi1wdWJsaWMgY2xhc3MgV1NJNDEwMyBleHRlbmRzIEJQNDEwMwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0k0MTAzKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTc2ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJNDEwNAotICovCi1wdWJsaWMgY2xhc3MgV1NJNDEwNCBleHRlbmRzIEJQNDEwNAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0k0MTA0KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwNS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZmY4ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTA1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJNDEwNQotICovCi1wdWJsaWMgY2xhc3MgV1NJNDEwNSBleHRlbmRzIEJQNDEwNQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0k0MTA1KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YTQ0YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJNDEwNgotICovCi1wdWJsaWMgY2xhc3MgV1NJNDEwNiBleHRlbmRzIEJQNDEwNgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0k0MTA2KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZDUyNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJNDEwNwotICovCi1wdWJsaWMgY2xhc3MgV1NJNDEwNyBleHRlbmRzIEJQNDEwNwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0k0MTA3KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvQlAzMDAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL0JQMzAwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjA2Y2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvQlAzMDAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwudWRkaTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExEb2N1bWVudDsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLk92ZXJ2aWV3RG9jOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLQotCi0vKioKLSAqIEJQMzAwMSAtIFRoZSB0TW9kZWwgZWxlbWVudCB1c2VzIFdTREwgYXMgdGhlIGRlc2NyaXB0aW9uIGxhbmd1YWdlOgotICogdGhlIHVkZGk6b3ZlcnZpZXdEb2MvdWRkaTpvdmVydmlld1VSTCBlbGVtZW50IGNvbnRhaW5zIGEgcmVmZXJlbmNlCi0gKiB0byBhIFdTREwgZGVmaW5pdGlvbiwgd2hpY2ggdXNlcyBhIG5hbWVzcGFjZQotICogb2YgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8uCi0gKiBUaGUgdWRkaTpvdmVydmlld1VSTCBtYXkgdXNlIHRoZSBmcmFnbWVudCBub3RhdGlvbiB0byByZXNvbHZlCi0gKiB0byBhIHdzZGw6YmluZGluZy4KLSAqLwotcHVibGljIGNsYXNzIEJQMzAwMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBVRERJVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBVRERJVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMzAwMShVRERJVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlc3VsdCB2YXJpYWJsZSB0byBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRCB2YWx1ZSBhbmQKLSAgICogcGxhY2VzIGEgdE1vZGVsIGtleSBpbiB0aGUgZmF1bHQgZGV0YWlsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB0TW9kZWxLZXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRGYXVsdE1lc3NhZ2UoU3RyaW5nIHRNb2RlbEtleSkKLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0gIlRoZSB0TW9kZWwga2V5IGlzOiBbIiArIHRNb2RlbEtleSArICJdLiI7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLQotICAgIC8vIEdldCB0aGUgdE1vZGVsIGZyb20gdGhlIGVudHJ5Q29udGV4dAotICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gSWYgdGhlIHRNb2RlbCBkb2VzIG5vdCBleGlzdCwgdGhlbiBmYWlsCi0gICAgaWYgKHRNb2RlbCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPSAiQ291bGQgbm90IGxvY2F0ZSBhIHRNb2RlbC4iOwotICAgICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICAgIHRlc3RBc3NlcnRpb24sCi0gICAgICAgIHJlc3VsdCwKLSAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICAgIH0KLQotICAgIFN0cmluZyBrZXkgPSB0TW9kZWwuZ2V0VE1vZGVsS2V5KCk7Ci0KLSAgICBPdmVydmlld0RvYyBkb2MgPSB0TW9kZWwuZ2V0T3ZlcnZpZXdEb2MoKTsKLSAgICBpZiAoZG9jICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHVybFRleHQgPSBkb2MuZ2V0T3ZlcnZpZXdVUkxTdHJpbmcoKTsKLQotICAgICAgLy8gVHJ5IHRvIHJlc29sdmUgdGhlIFVSTCAmIGNoZWNrIHRoZSBXU0RMCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCA9IG5ldyBXU0RMRG9jdW1lbnQodXJsVGV4dCk7Ci0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxEb2N1bWVudC5nZXREZWZpbml0aW9ucygpOwotICAgICAgICBNYXAgbmFtZXNwYWNlcyA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICBpZiAoIW5hbWVzcGFjZXMuY29udGFpbnNWYWx1ZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwpKQotICAgICAgICB7Ci0gICAgICAgICAgdXJsVGV4dCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgYmluZGluZwotICAgICAgICBiaW5kaW5nID0gdmFsaWRhdG9yLmdldEJpbmRpbmcodXJsVGV4dCwgd3NkbERvY3VtZW50KTsKLQotICAgICAgICAvLyBTZWUgaWYgdGhlIGJpbmRpbmcgaXMgaW4gdGhlIFdTREwgZG9jdW1lbnQKLSAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbAotICAgICAgICAgIHx8IGRlZmluaXRpb24uZ2V0QmluZGluZyhiaW5kaW5nLmdldFFOYW1lKCkpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB1cmxUZXh0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHVybFRleHQgPSBudWxsOwotICAgICAgfQotCi0gICAgICBpZiAodXJsVGV4dCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgZnJhZ21lbnRJRCA9IG51bGw7Ci0gICAgICAgIGludCBpbmRleCA9IHVybFRleHQuaW5kZXhPZigiIyIpOwotICAgICAgICBpZiAoaW5kZXggPiAtMSkKLSAgICAgICAgewotICAgICAgICAgIGZyYWdtZW50SUQgPSB1cmxUZXh0LnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChmcmFnbWVudElEICE9IG51bGwpCi0gICAgICAgICAgJiYgKGZyYWdtZW50SUQubGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgICAmJiAoZnJhZ21lbnRJRC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoInhwb2ludGVyKCIudG9VcHBlckNhc2UoKSkgPT0gLTEKLSAgICAgICAgICAgIHx8IGZyYWdtZW50SUQubGFzdEluZGV4T2YoIikiKSAhPSBmcmFnbWVudElELmxlbmd0aCgpIC0gMSkpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRGYXVsdE1lc3NhZ2Uoa2V5KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNldEZhdWx0TWVzc2FnZShrZXkpOwotICAgICAgfQotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRGYXVsdE1lc3NhZ2Uoa2V5KTsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ID09IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEKQotICAgIHsKLSAgICAgIC8vIFNldCB0aGUgYmluZGluZyB0aGF0IHdpbGwgYmUgdXNlZAotICAgICAgdmFsaWRhdG9yLnNldFdTRExCaW5kaW5nKGJpbmRpbmcpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsTWVzc2FnZSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL0JQMzAwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9CUDMwMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyY2RlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL0JQMzAwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwudWRkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLkJpbmRpbmdUZW1wbGF0ZTsKLQotCi0vKioKLSAqIEJQMzAwMiAtIFRoZSB1ZGRpOmJpbmRpbmdUZW1wbGF0ZSBlbGVtZW50IGNvbnRhaW5zIGEgdWRkaTphY2Nlc3NQb2ludCBlbGVtZW50LAotICogd2l0aCBhIG5vbi1lbXB0eSB2YWx1ZS4KLSAqLwotcHVibGljIGNsYXNzIEJQMzAwMiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBVRERJVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBVRERJVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMzAwMihVRERJVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHNlcnZpY2VMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIC8vIEdldCB0aGUgYmluZGluZ1RlbXBsYXRlIGZyb20gdGhlIGVudHJ5Q29udGV4dAotICAgIEJpbmRpbmdUZW1wbGF0ZSBiaW5kaW5nVGVtcGxhdGUgPQotICAgICAgKEJpbmRpbmdUZW1wbGF0ZSkgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIElmIHRoZSBiaW5kaW5nVGVtcGxhdGUgZG9lcyBub3QgY29udGFpbiBhbiBhY2Nlc3NQb2ludCwgdGhlbiBmYWlsCi0gICAgaWYgKChiaW5kaW5nVGVtcGxhdGUuZ2V0QWNjZXNzUG9pbnQoKSA9PSBudWxsKQotICAgICAgfHwgKChzZXJ2aWNlTG9jYXRpb24gPSBiaW5kaW5nVGVtcGxhdGUuZ2V0QWNjZXNzUG9pbnQoKS5nZXRUZXh0KCkpCi0gICAgICAgID09IG51bGwpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPQotICAgICAgICAiVGhlIGJpbmRpbmdUZW1wYXRlIGtleSBpczogWyIKLSAgICAgICAgICArIGJpbmRpbmdUZW1wbGF0ZS5nZXRCaW5kaW5nS2V5KCkKLSAgICAgICAgICArICJdLiI7Ci0gICAgfQotCi0gICAgLy8gRWxzZSBzYXZlIHRoZSBzZXJ2aWNlIGxvY2F0aW9uIGluIHRoZSBhc3NlcnRpb24gcmVzdWx0Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFNhdmUgc2VydmljZSBsb2NhdGlvbiBpbiBhbmFseXplciBjb250ZXh0Ci0gICAgICBlbnRyeUNvbnRleHQKLSAgICAgICAgLmdldEFuYWx5emVyQ29udGV4dCgpCi0gICAgICAgIC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCkKLSAgICAgICAgLnNldFNlcnZpY2VMb2NhdGlvbigKLSAgICAgICAgc2VydmljZUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9CUDMwMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvQlAzMDAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZTA0ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9CUDMwMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLQotCi0vKioKLSAqIEJQMzAwMyAtIFRoZSB1ZGRpOnRNb2RlbCBpcyBjYXRlZ29yaXplZCB1c2luZyB0aGUgdWRkaTp0eXBlcyB0YXhvbm9teSwKLSAqIGFzICJ3c2RsU3BlYyI6IHRoZSB1ZGRpOmtleWVkUmVmZXJlbmNlIGVsZW1lbnQgaGFzIGFuIGF0dHJpYnV0ZSBrZXlWYWx1ZQotICogZXF1YWwgdG8gIndzZGxTcGVjIiwgYW5kIGtleU5hbWUgZXF1YWwgdG8gInVkZGktb3JnOnR5cGVzIiBvciAidHlwZXMiLgotICovCi1wdWJsaWMgY2xhc3MgQlAzMDAzIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFVERElWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFVERElWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAzMDAzKFVERElWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIC8vIEdldCB0aGUgdE1vZGVsIGZyb20gdGhlIGVudHJ5Q29udGV4dAotICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gSWYgdGhlIHRNb2RlbCBkb2VzIG5vdCBleGlzdCwgdGhlbiBmYWlsCi0gICAgaWYgKHRNb2RlbCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPQotICAgICAgICAiQ291bGQgbm90IGxvY2F0ZSBhIHRNb2RlbCB3aXRoIGEgY2F0ZWdvcml6YXRpb24gb2YgJ3dzZGxTcGVjJy4iOwotICAgIH0KLQotICAgIC8vIElmIHRoZXJlIGlzIGEgdE1vZGVsIGFuZCBpdCBpcyBub3QgY2F0ZWdvcml6ZWQgYXMgIndzZGxTcGVjIiwgdGhlbiBmYWlsCi0gICAgZWxzZSBpZiAoISh2YWxpZGF0b3IuaXNXc2RsU3BlYyh0TW9kZWwpKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgIlRoZSB0TW9kZWwga2V5IGlzOiBbIgotICAgICAgICAgICsgdE1vZGVsLmdldFRNb2RlbEtleSgpCi0gICAgICAgICAgKyAiXVxuIgotICAgICAgICAgICsgIlRoZSBjYXRlZ29yeUJhZyBpczogWyIKLSAgICAgICAgICArIHRoaXMudmFsaWRhdG9yLmNhdGVnb3J5QmFnVG9TdHJpbmcodE1vZGVsLmdldENhdGVnb3J5QmFnKCkpCi0gICAgICAgICAgKyAiXSI7Ci0gICAgfQotCi0gICAgLy8gRWxzZSBnZXQgdGhlIFdTREwgZG9jdW1lbnQgbG9jYXRpb24gYW5kIHNldCBpdCBhbmQgdGhlIGJpbmRpbmcgZWxlbWVudCBpbiBhbmFseXplciBjb250ZXh0Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHNldCBXU0RMIGxvY2F0aW9uIGluIGFuYWx5emVyIGNvbnRleHQKLSAgICAgIHZhbGlkYXRvci5zZXRXU0RMTG9jYXRpb24odmFsaWRhdG9yLmdldFdTRExMb2NhdGlvbih2YWxpZGF0b3IuZ2V0T3ZlcnZpZXdVUkwodE1vZGVsKSkpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsTWVzc2FnZSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1VERElWYWxpZGF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1VERElWYWxpZGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjM1ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9VRERJVmFsaWRhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLnVkZGk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5BbmFseXplckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLlNlcnZpY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5VRERJUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5pbXBsLldTRExFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5VRERJVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVudHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VRERJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwuV1NETERvY3VtZW50OwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJpbmRpbmcuQmluZGluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYmluZGluZy5UTW9kZWxJbnN0YW5jZUluZm87Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuQmluZGluZ0RldGFpbDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlRNb2RlbERldGFpbDsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuQ2F0ZWdvcnlCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLlN0cmluZ1V0aWxzOwotCi0vKioKLSAqIFRoZSBVRERJIHZhbGlkYXRvciB3aWxsIHZlcmlmeSB0aGF0IGEgd2ViIHNlcnZpY2UgZGVzY3JpcHRpb24gd2FzIHB1Ymxpc2hlZCBjb3JyZWN0bHkgaW4gYSBVRERJIHJlZ2lzdHJ5LgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFVERElWYWxpZGF0b3JJbXBsCi0gIGV4dGVuZHMgQmFzZVZhbGlkYXRvckltcGwKLSAgaW1wbGVtZW50cyBVRERJVmFsaWRhdG9yCi17Ci0gIC8qKgotICAgKiBVRERJIHJlZmVyZW5jZS4KLSAgICovCi0gIHByb3RlY3RlZCBVRERJUmVmZXJlbmNlIHVkZGlSZWZlcmVuY2U7Ci0gIC8qKgotICAgKiBVRERJIHByb3h5LgotICAgKi8KLSAgcHJvdGVjdGVkIFVERElQcm94eSB1ZGRpUHJveHk7Ci0KLSAgLyoqCi0gICAqIFdTREwgYmluZGluZy4KLSAgICovCi0gIHByaXZhdGUgQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLlVERElWYWxpZGF0b3IjaW5pdChvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQW5hbHl6ZXJDb250ZXh0LCBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXJ0aWZhY3QsIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0QXJ0aWZhY3QsIG9yZy53c2kudGVzdC5hbmFseXplci5jb25maWcuVURESVJlZmVyZW5jZSwgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgcHJvZmlsZUFydGlmYWN0LAotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0LAotICAgIFVERElSZWZlcmVuY2UgdWRkaVJlZmVyZW5jZSwKLSAgICBSZXBvcnRlciByZXBvcnRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBCYXNlVmFsaWRhdG9ySW1wbAotICAgIHN1cGVyLmluaXQoYW5hbHl6ZXJDb250ZXh0LCBwcm9maWxlQXJ0aWZhY3QsIHJlcG9ydEFydGlmYWN0LCByZXBvcnRlcik7Ci0KLSAgICAvLyBTYXZlIGlucHV0IHJlZmVyZW5jZXMKLSAgICB0aGlzLnVkZGlSZWZlcmVuY2UgPSB1ZGRpUmVmZXJlbmNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5VRERJVmFsaWRhdG9yI3ZhbGlkYXRlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGUoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgd3NkbFVSTCA9IG51bGw7Ci0gICAgRW50cnkgZW50cnkgPSBudWxsOwotCi0gICAgQmluZGluZ1RlbXBsYXRlIGJpbmRpbmdUZW1wbGF0ZSA9IG51bGw7Ci0gICAgVE1vZGVsIHRNb2RlbCA9IG51bGw7Ci0KLSAgICAvLyBpdCBkZXByaWNhdGVkIGFmdGVyIHJlZmFjdG9yaW5nIAotICAgIC8vIG5vdyB0aGUgaW5uZXIgY2xhc3NlcyBtb3ZlZCBvdXQgZnJvbSB2YWxpZGF0b3IKLSAgICAvL1N0cmluZyBjbGFzc1ByZWZpeCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJCI7Ci0gICAgU3RyaW5nIGNsYXNzUHJlZml4ID0gdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkrIi4iOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gU2V0IHVwIGEgcmVmZXJlbmNlIHRvIHRoZSBVRERJIHJlZ2lzdHJ5Ci0gICAgICB1ZGRpUHJveHkgPSBuZXcgVURESVByb3h5KCk7Ci0KLSAgICAgIC8vbmV3IFNvY2tldChuZXcgSW5ldEFkZHJlc3ModWRkaVJlZmVyZW5jZS5nZXRJbnF1aXJ5VVJMKCkpKTsKLSAgICAgIHVkZGlQcm94eS5zZXRJbnF1aXJ5VVJMKHVkZGlSZWZlcmVuY2UuZ2V0SW5xdWlyeVVSTCgpKTsKLSAgICAgIGJvb2xlYW4gd2FzRXggPSBmYWxzZTsKLSAgICAgIElucHV0U3RyZWFtIHN0cmVhbTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBVUkwgdXJsID0gU3RyaW5nVXRpbHMuZ2V0VVJMKG51bGwsIHVkZGlSZWZlcmVuY2UuZ2V0SW5xdWlyeVVSTCgpKTsKLSAgICAgICAgc3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICB9Ci0KLSAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBleCkKLSAgICAgIHsKLSAgICAgICAgd2FzRXggPSB0cnVlOwotICAgICAgfQotCi0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghd2FzRXgpCi0gICAgICB7Ci0KLSAgICAgICAgLy8gSWYgdGhlIFVEREkgcmVmZXJlbmNlIGlzIHRvIGEgYmluZGluZ1RlbXBsYXRlIHRoZW4gZ2V0IGl0Ci0gICAgICAgIGlmICh1ZGRpUmVmZXJlbmNlLmdldEtleVR5cGUoKS5lcXVhbHMoVURESVJlZmVyZW5jZS5CSU5ESU5HX0tFWSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXQgYmluZGluZyBkZXRhaWwgd2hpY2ggd2lsbCBjb250YWluIHRoZSBiaW5kaW5nVGVtcGxhdGUKLSAgICAgICAgICBCaW5kaW5nRGV0YWlsIGJpbmRpbmdEZXRhaWwgPQotICAgICAgICAgICAgdWRkaVByb3h5LmdldF9iaW5kaW5nRGV0YWlsKHVkZGlSZWZlcmVuY2UuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgLy8gR2V0IGJpbmRpbmdUZW1wbGF0ZQotICAgICAgICAgIGJpbmRpbmdUZW1wbGF0ZSA9Ci0gICAgICAgICAgICAoQmluZGluZ1RlbXBsYXRlKSBiaW5kaW5nRGV0YWlsCi0gICAgICAgICAgICAgIC5nZXRCaW5kaW5nVGVtcGxhdGVWZWN0b3IoKQotICAgICAgICAgICAgICAuZWxlbWVudEF0KAotICAgICAgICAgICAgICAwKTsKLQotICAgICAgICAgIGlmICh2ZXJib3NlT3B0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICAgICAgICAgIiAgICBCaW5kaW5nVGVtcGxhdGUgLSAiCi0gICAgICAgICAgICAgICAgKyBVRERJVXRpbHMuYmluZGluZ1RlbXBsYXRlVG9TdHJpbmcoYmluZGluZ1RlbXBsYXRlKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gR2V0IHRoZSB3c2RsU3BlYyB0TW9kZWwKLSAgICAgICAgICB0TW9kZWwgPSBmaW5kVE1vZGVsKHVkZGlQcm94eSwgYmluZGluZ1RlbXBsYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVsc2UgaXQgaGFzIHRvIGJlIGEgdE1vZGVsCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFRNb2RlbERldGFpbCB0TW9kZWxEZXRhaWwgPQotICAgICAgICAgICAgdWRkaVByb3h5LmdldF90TW9kZWxEZXRhaWwodWRkaVJlZmVyZW5jZS5nZXRLZXkoKSk7Ci0gICAgICAgICAgdE1vZGVsID0gKFRNb2RlbCkgdE1vZGVsRGV0YWlsLmdldFRNb2RlbFZlY3RvcigpLmVsZW1lbnRBdCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2ZXJib3NlT3B0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAotICAgICAgICAgICAgIiAgICBUTW9kZWwgc3BlY2lmaWVkIG9yIGZvdW5kIGluIGJpbmRpbmdUZW1wbGF0ZSAtICIKLSAgICAgICAgICAgICAgKyBVRERJVXRpbHMudE1vZGVsVG9TdHJpbmcodE1vZGVsKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGJpbmRpbmdUZW1wbGF0ZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ESVNDT1ZFUllfQklORElOR1RFTVBMQVRFKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIGEgYmluZGluZ1RlbXBsYXRlLCB0aGVuIHByb2Nlc3MgdGVzdCBhc3NlcnRpb25zIGZvciBpdAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBDcmVhdGUgZW50cnkKLSAgICAgICAgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LnNldEVudHJ5VHlwZSgKLSAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RJU0NPVkVSWV9CSU5ESU5HVEVNUExBVEUpKTsKLSAgICAgICAgZW50cnkuc2V0UmVmZXJlbmNlSUQoYmluZGluZ1RlbXBsYXRlLmdldEJpbmRpbmdLZXkoKSk7Ci0gICAgICAgIGVudHJ5LnNldEVudHJ5RGV0YWlsKGJpbmRpbmdUZW1wbGF0ZSk7Ci0KLSAgICAgICAgLy8gUHJvY2VzcyB0ZXN0IGFzc2VydGlvbnMKLSAgICAgICAgcHJvY2Vzc0Fzc2VydGlvbnMoCi0gICAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgICAgbmV3IEVudHJ5Q29udGV4dChlbnRyeSwgdGhpcy5hbmFseXplckNvbnRleHQpKTsKLSAgICAgIH0KLQotICAgICAgLy8gTk9URTogRnJvbSB0aGlzIHBvaW50IGZvcndhcmQsIGlmIGEgYmluZGluZ1RlbXBsYXRlIGRvZXMgTk9UIGhhdmUgYSB3c2RsU3BlYyB0TW9kZWwsCi0gICAgICAvLyAgICAgICB0aGUgdE1vZGVsIHdpbGwgYmUgTlVMTC4KLQotICAgICAgLy9QYXJzZSBXU0RMIGRvY3VtZW50LCBhbmQgZ2V0IFdTREwgZG9jdW1lbnQgdXJsLCBiaW5kaW5nIG5hbWUgYW5kIG5hbWVzcGFjZQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFN0cmluZyBvdmVydmlld1VSTCA9IGdldE92ZXJ2aWV3VVJMKHRNb2RlbCk7Ci0gICAgICAgIHdzZGxVUkwgPSBnZXRXU0RMTG9jYXRpb24ob3ZlcnZpZXdVUkwpOwotICAgICAgICBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50ID0gZ2V0V1NETERvY3VtZW50KHdzZGxVUkwpOwotCi0gICAgICAgIC8vIEFERDogVGhlIFdTREwgYmluZGluZyBpcyB1c2VkIGluIFdTSTMwMDEgYW5kIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgZW50cnlDb250ZXh0Ci0gICAgICAgIGJpbmRpbmcgPSBnZXRCaW5kaW5nKG92ZXJ2aWV3VVJMLCB3c2RsRG9jdW1lbnQpOwotICAgICAgfQotCi0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIEFERDoKLSAgICAgICAgaWYgKHZlcmJvc2VPcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICBFWENFUFRJT046ICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIENyZWF0ZSBlbnRyeQotICAgICAgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgICBlbnRyeS5zZXRFbnRyeVR5cGUoCi0gICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfRElTQ09WRVJZX1RNT0RFTCkpOwotICAgICAgZW50cnkuc2V0UmVmZXJlbmNlSUQoCi0gICAgICAgICh0TW9kZWwgPT0gbnVsbCA/ICJbdE1vZGVsXSIgOiB0TW9kZWwuZ2V0VE1vZGVsS2V5KCkpKTsKLSAgICAgIGVudHJ5LnNldEVudHJ5RGV0YWlsKHRNb2RlbCk7Ci0KLSAgICAgIC8vIFByb2Nlc3MgdGVzdCBhc3NlcnRpb25zCi0gICAgICBwcm9jZXNzQXNzZXJ0aW9ucygKLSAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgIG5ldyBFbnRyeUNvbnRleHQoZW50cnksIHRoaXMuYW5hbHl6ZXJDb250ZXh0KSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFRocm93IFdTSUV4Y2VwdGlvbgotICAgICAgaWYgKGUgaW5zdGFuY2VvZiBXU0lFeGNlcHRpb24pCi0gICAgICAgIHRocm93IChXU0lFeGNlcHRpb24pIGU7Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgICAgIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBkaXNjb3ZlcnkgdGVzdCBhc3NlcnRpb25zLiIsCi0gICAgICAgICAgZSk7Ci0gICAgfQotCi0gICAgLy8gQ2xlYW51cAotICAgIGNsZWFudXAoKTsKLQotICAgIC8vIEdldCBXU0RMIGxvY2F0aW9uCi0gICAgd3NkbFVSTCA9IHRoaXMuYW5hbHl6ZXJDb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoKS5nZXRXU0RMTG9jYXRpb24oKTsKLQotICAgIC8vIFJldHVybiBXU0RMIFVSTAotICAgIHJldHVybiB3c2RsVVJMOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBXU0RMIGJpbmRpbmcgaW4gdGhlIHNlcnZpY2UgcmVmZXJlbmNlIHBvcnRpb24gb2YgdGhlIGFuYWx5emVyIGNvbnRleHQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRXU0RMQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgYmluZGluZ05hbWUgPQotICAgICAgYmluZGluZyA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0KLSAgICAgIGJpbmRpbmcgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAvLyBTZXQgdGhlIFdTREwgZG9jdW1lbnQgbG9jYXRpb24gaW4gYW5hbHl6ZXJDb250ZXh0Ci0gICAgU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlID0KLSAgICAgIHRoaXMuYW5hbHl6ZXJDb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoKTsKLQotICAgIC8vIElmIHRoZSB3c2RsRWxlbWVudCBkb2VzIG5vdCBleGlzdCwgdGhlbiBzZXQgaXQKLSAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudDsKLSAgICBpZiAoKHdzZGxFbGVtZW50ID0gc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpKSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgV1NETCBiaW5kaW5nIGZyb20gdGhlIG92ZXJ2aWV3VVJMIGFuZCBzZXQgaW4gYW5hbHl6ZXJDb250ZXh0Ci0gICAgICB3c2RsRWxlbWVudCA9IG5ldyBXU0RMRWxlbWVudEltcGwoKTsKLSAgICAgIHdzZGxFbGVtZW50LnNldE5hbWUoYmluZGluZ05hbWUpOwotICAgICAgd3NkbEVsZW1lbnQuc2V0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICB3c2RsRWxlbWVudC5zZXRUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX0JJTkRJTkcpOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgd3NkbEVsZW1lbnQgaW4gdGhlIHNlcnZpY2UgcmVmZXJlbmNlCi0gICAgc2VydmljZVJlZmVyZW5jZS5zZXRXU0RMRWxlbWVudCh3c2RsRWxlbWVudCk7Ci0KLSAgICAvLyBTZXQgdGhlIHNlcnZpY2UgcmVmZXJlbmNlIGJhY2sgaW50byB0aGUgYW5hbHl6ZXJDb250ZXh0Ci0gICAgYW5hbHl6ZXJDb250ZXh0LnNldFNlcnZpY2VSZWZlcmVuY2Uoc2VydmljZVJlZmVyZW5jZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBXU0RMIGxvY2F0aW9uIGluIHRoZSBzZXJ2aWNlIHJlZmVyZW5jZSBwb3J0aW9uIG9mIHRoZSBhbmFseXplciBjb250ZXh0LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0V1NETExvY2F0aW9uKFN0cmluZyB3c2RsVVJMKQotICB7Ci0gICAgLy8gU2V0IHRoZSBXU0RMIGRvY3VtZW50IGxvY2F0aW9uIGluIGFuYWx5emVyQ29udGV4dAotICAgIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSA9Ci0gICAgICB0aGlzLmFuYWx5emVyQ29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCk7Ci0gICAgc2VydmljZVJlZmVyZW5jZS5zZXRXU0RMTG9jYXRpb24od3NkbFVSTCk7Ci0KLSAgICAvLyBTZXQgdGhlIHNlcnZpY2UgcmVmZXJlbmNlIGJhY2sgaW50byB0aGUgYW5hbHl6ZXJDb250ZXh0Ci0gICAgYW5hbHl6ZXJDb250ZXh0LnNldFNlcnZpY2VSZWZlcmVuY2Uoc2VydmljZVJlZmVyZW5jZSk7Ci0gIH0KLQotICAvKioKLSAgICogRmluZCB0aGUgd3NkbFNwZWMgdE1vZGVsIGFzc29jaWF0ZWQgd2l0aCBhIGJpbmRpbmcuCi0gICAqLwotICBwcml2YXRlIFRNb2RlbCBmaW5kVE1vZGVsKAotICAgIFVERElQcm94eSB1ZGRpUHJveHksCi0gICAgQmluZGluZ1RlbXBsYXRlIGJpbmRpbmdUZW1wbGF0ZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBUTW9kZWwgdE1vZGVsID0gbnVsbDsKLQotICAgIC8vIEdldCB0aGUgbGlzdCBvZiB0TW9kZWwgcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kaW5nVGVtcGxhdGUKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9Ci0gICAgICBiaW5kaW5nVGVtcGxhdGUKLSAgICAgICAgLmdldFRNb2RlbEluc3RhbmNlRGV0YWlscygpCi0gICAgICAgIC5nZXRUTW9kZWxJbnN0YW5jZUluZm9WZWN0b3IoKQotICAgICAgICAuaXRlcmF0b3IoKTsKLQotICAgIC8vIFByb2Nlc3MgZWFjaCB0TW9kZWwgcmVmZXJlbmNlCi0gICAgVmVjdG9yIHRNb2RlbEtleUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICAvLyBHZXQgdE1vZGVsSW5zdGFuY2VJbmZvCi0gICAgICBUTW9kZWxJbnN0YW5jZUluZm8gdE1vZGVsSW5zdGFuY2VJbmZvID0KLSAgICAgICAgKFRNb2RlbEluc3RhbmNlSW5mbykgaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAvLyBBZGQga2V5IHRvIGxpc3QKLSAgICAgIHRNb2RlbEtleUxpc3QuYWRkKHRNb2RlbEluc3RhbmNlSW5mby5nZXRUTW9kZWxLZXkoKSk7Ci0gICAgfQotCi0gICAgLy8gR2V0IHRoZSB0TW9kZWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmluZGluZ1RlbXBsYXRlCi0gICAgaWYgKHRNb2RlbEtleUxpc3Quc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IHRoZSB0TW9kZWwgZGV0YWlscwotICAgICAgICBUTW9kZWxEZXRhaWwgdE1vZGVsRGV0YWlsID0gdWRkaVByb3h5LmdldF90TW9kZWxEZXRhaWwodE1vZGVsS2V5TGlzdCk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHRNb2RlbHMKLSAgICAgICAgSXRlcmF0b3IgdE1vZGVsSXRlcmF0b3IgPSB0TW9kZWxEZXRhaWwuZ2V0VE1vZGVsVmVjdG9yKCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAvL2Jvb2xlYW4gdE1vZGVsRm91bmQgPSBmYWxzZTsKLSAgICAgICAgVE1vZGVsIG5leHRUTW9kZWwgPSBudWxsOwotCi0gICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgdE1vZGVscwotICAgICAgICB3aGlsZSAoKHRNb2RlbEl0ZXJhdG9yLmhhc05leHQoKSkgJiYgKHRNb2RlbCA9PSBudWxsKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldCBuZXh0IHRNb2RlbCBpbiBsaXN0Ci0gICAgICAgICAgbmV4dFRNb2RlbCA9IChUTW9kZWwpIHRNb2RlbEl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgIGlmICh2ZXJib3NlT3B0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICAgICAgICAgIiAgICAgIFRNb2RlbCByZWZlcmVuY2VkIGZyb20gYmluZGluZ1RlbXBsYXRlIC0gIgotICAgICAgICAgICAgICAgICsgVURESVV0aWxzLnRNb2RlbFRvU3RyaW5nKG5leHRUTW9kZWwpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgd3NkbFNwZWMgdE1vZGVsLCB0aGVuIHRoaXMgaXMgdGhlIHRNb2RlbCB3ZSB3YW50Ci0gICAgICAgICAgaWYgKGlzV3NkbFNwZWMobmV4dFRNb2RlbCkpCi0gICAgICAgICAgICB0TW9kZWwgPSBuZXh0VE1vZGVsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhyb3cgV1NJRXhjZXB0aW9uCi0gICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgdE1vZGVsIGRldGFpbHMuIiwgZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFRocm93IGV4Y2VwdGlvbgotICAgICAgLy90aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJVRERJIGJpbmRpbmdUZW1wbGF0ZSBkaWQgbm90IGNvbnRhaW4gYW55IHRNb2RlbCByZWZlcmVuY2VzLiIpOwotICAgIH0KLQotICAgIHJldHVybiB0TW9kZWw7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSB3c2RsU3BlYyB0TW9kZWwuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1dzZGxTcGVjKFRNb2RlbCB0TW9kZWwpCi0gIHsKLSAgICBib29sZWFuIHRNb2RlbEZvdW5kID0gZmFsc2U7Ci0gICAgQ2F0ZWdvcnlCYWcgY2F0ZWdvcnlCYWcgPSBudWxsOwotICAgIEl0ZXJhdG9yIGNhdGVnb3J5QmFnSXRlcmF0b3IgPSBudWxsOwotCi0gICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYXRldGdvcnlCYWcgY29udGFpbnMgd3NkbFNwZWMKLSAgICBpZiAoKGNhdGVnb3J5QmFnID0gdE1vZGVsLmdldENhdGVnb3J5QmFnKCkpICE9IG51bGwpCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIGtleWVkIHJlZmVyZW5jZXMKLSAgICAgIGNhdGVnb3J5QmFnSXRlcmF0b3IgPSBjYXRlZ29yeUJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpLml0ZXJhdG9yKCk7Ci0KLSAgICAgIEtleWVkUmVmZXJlbmNlIGtleWVkUmVmZXJlbmNlID0gbnVsbDsKLQotICAgICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBrZXllZCByZWZlcmVuY2VzCi0gICAgICB3aGlsZSAoY2F0ZWdvcnlCYWdJdGVyYXRvci5oYXNOZXh0KCkgJiYgISh0TW9kZWxGb3VuZCkpCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCBuZXh0IGtleWVkIHJlZmVyZW5jZQotICAgICAgICBrZXllZFJlZmVyZW5jZSA9IChLZXllZFJlZmVyZW5jZSkgY2F0ZWdvcnlCYWdJdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHR5cGVzIHRheG9ub215IHRNb2RlbCBhbmQgdGhlIHZhbHVlIGlzIHdzZGxTcGVjLCB0aGVuIHRoaXMgaXMgdGhlIHRNb2RlbCB3ZSB3YW50Ci0gICAgICAgIC8vIFJFTU9WRTogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjaGVjayB0aGUga2V5IG5hbWUKLSAgICAgICAgLy9pZiAoa2V5ZWRSZWZlcmVuY2UuZ2V0VE1vZGVsS2V5KCkuZXF1YWxzSWdub3JlQ2FzZShUTW9kZWwuVFlQRVNfVE1PREVMX0tFWSkgJiYKLSAgICAgICAgLy8gICAid3NkbFNwZWMiLmVxdWFscyhrZXllZFJlZmVyZW5jZS5nZXRLZXlWYWx1ZSgpKSAmJgotICAgICAgICAvLyAgICgidHlwZXMiLmVxdWFscyhrZXllZFJlZmVyZW5jZS5nZXRLZXlOYW1lKCkpIHx8Ci0gICAgICAgIC8vICAgICJ1ZGRpLW9yZzp0eXBlcyIuZXF1YWxzKGtleWVkUmVmZXJlbmNlLmdldEtleU5hbWUoKSkpKSB7Ci0gICAgICAgIC8vICB0TW9kZWxGb3VuZCA9IHRydWU7Ci0gICAgICAgIC8vfQotICAgICAgICBpZiAoa2V5ZWRSZWZlcmVuY2UKLSAgICAgICAgICAuZ2V0VE1vZGVsS2V5KCkKLSAgICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZShUTW9kZWwuVFlQRVNfVE1PREVMX0tFWSkKLSAgICAgICAgICAmJiAid3NkbFNwZWMiLmVxdWFscyhrZXllZFJlZmVyZW5jZS5nZXRLZXlWYWx1ZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIHRNb2RlbEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0TW9kZWxGb3VuZDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYW4gT3ZlcnZpZXdVUkwgZnJvbSB0TW9kZWwuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJ2aWV3VVJMKFRNb2RlbCB0TW9kZWwpCi0gIHsKLSAgICBpZiAodE1vZGVsICE9IG51bGwKLSAgICAgICYmIHRNb2RlbC5nZXRPdmVydmlld0RvYygpICE9IG51bGwKLSAgICAgICYmIHRNb2RlbC5nZXRPdmVydmlld0RvYygpLmdldE92ZXJ2aWV3VVJMKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdE1vZGVsLmdldE92ZXJ2aWV3RG9jKCkuZ2V0T3ZlcnZpZXdVUkwoKS5nZXRUZXh0KCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIGRvY3VtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oU3RyaW5nIHdzZGxMb2NhdGlvbikKLSAgewotICAgIGludCBpbmRleDsKLQotICAgIC8vIENoZWNrIGlmIHRoZSBvdmVydmlld1VSTCBjb250YWlucyBhIGZyYWdtZW50IGlkZW50aWZpZXIKLSAgICBpZiAoKGluZGV4ID0gd3NkbExvY2F0aW9uLmluZGV4T2YoIiMiKSkgPiAtMSkKLSAgICB7Ci0gICAgICB3c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb24uc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIHdzZGxMb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgV1NETCBkb2N1bWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBXU0RMRG9jdW1lbnQgZ2V0V1NETERvY3VtZW50KFN0cmluZyB3c2RsTG9jYXRpb24pCi0gICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBXU0RMRG9jdW1lbnQoZ2V0V1NETExvY2F0aW9uKHdzZGxMb2NhdGlvbikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIGJpbmRpbmcgZnJvbSB0aGUgb3ZlcnZpZXdVUkwgaW4gdGhlIHRNb2RlbC4KLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nIGdldEJpbmRpbmcoU3RyaW5nIG92ZXJ2aWV3VVJMLCBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50KQotICB7Ci0gICAgaW50IGluZGV4OwotICAgIGludCBuYW1lSW5kZXg7Ci0KLSAgICBCaW5kaW5nW10gYmluZGluZ3MgPSB3c2RsRG9jdW1lbnQuZ2V0QmluZGluZ3MoKTsKLSAgICBpZiAoYmluZGluZ3MgPT0gbnVsbCB8fCBiaW5kaW5ncy5sZW5ndGggPT0gMCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgaWYgKG92ZXJ2aWV3VVJMICE9IG51bGwpCi0gICAgewotICAgICAgLy8gQ2hlY2sgaWYgdGhlIG92ZXJ2aWV3VVJMIGNvbnRhaW5zIGEgZnJhZ21lbnQgaWRlbnRpZmllcgotICAgICAgaWYgKChpbmRleCA9IG92ZXJ2aWV3VVJMLmluZGV4T2YoIiMiKSkgPiAtMSkKLSAgICAgIHsKLSAgICAgICAgLy8gVEVNUDogTmVlZCB0byB1c2UgYSByZWFsIFhQYXRoIGV2YWx1YXRvciBsaWtlIFhhbGFuCi0gICAgICAgIFN0cmluZyBuYW1lQXR0cmlidXRlID0gIkBuYW1lPSI7Ci0KLSAgICAgICAgLy8gTG9jYXRlIG5hbWUgcmVmZXJlbmNlCi0gICAgICAgIGlmICgobmFtZUluZGV4ID0KLSAgICAgICAgICBvdmVydmlld1VSTC5zdWJzdHJpbmcoaW5kZXggKyAxKS5pbmRleE9mKG5hbWVBdHRyaWJ1dGUpKQotICAgICAgICAgID4gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgY2hhcmFjdGVyIHdoaWNoIHNob3VsZCBiZSBhIHF1b3RlCi0gICAgICAgICAgaW50IGZpcnN0UXVvdGVJbmRleCA9IGluZGV4ICsgMSArIG5hbWVJbmRleCArIG5hbWVBdHRyaWJ1dGUubGVuZ3RoKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1b3RlID0KLSAgICAgICAgICAgIG92ZXJ2aWV3VVJMLnN1YnN0cmluZyhmaXJzdFF1b3RlSW5kZXgsIGZpcnN0UXVvdGVJbmRleCArIDEpOwotCi0gICAgICAgICAgLy8gR2V0IHRoZSBwYXJ0IG9mIHRoZSBVUkwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gdGhlIGJpbmRpbmcgbmFtZQotICAgICAgICAgIFN0cmluZyB1cmxQYXJ0ID0gb3ZlcnZpZXdVUkwuc3Vic3RyaW5nKGZpcnN0UXVvdGVJbmRleCArIDEpOwotCi0gICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCBxdW90ZQotICAgICAgICAgIGludCBuZXh0UXVvdGVJbmRleDsKLSAgICAgICAgICBpZiAoKG5leHRRdW90ZUluZGV4ID0gdXJsUGFydC5pbmRleE9mKHF1b3RlKSkgPiAtMSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYmluZGluZ05hbWUgPSB1cmxQYXJ0LnN1YnN0cmluZygwLCBuZXh0UXVvdGVJbmRleCk7Ci0gICAgICAgICAgICAvL2xvb2sgZm9yIGJpbmRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChiaW5kaW5nTmFtZS5lcXVhbHMoYmluZGluZ3NbaV0uZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBiaW5kaW5nc1swXTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGNhdGVnb3J5QmFnLgotICAgKiBAcGFyYW0gY2F0ZWdvcnlCYWcgYSBDYXRlZ29yeUJhZyBvYmplY3QuCi0gICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGNhdGVnb3J5QmFnLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjYXRlZ29yeUJhZ1RvU3RyaW5nKENhdGVnb3J5QmFnIGNhdGVnb3J5QmFnKQotICB7Ci0gICAgU3RyaW5nIHRvU3RyaW5nID0gIiI7Ci0KLSAgICBpZiAoY2F0ZWdvcnlCYWcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3Iga2V5ZWRSZWZlcmVuY2VMaXN0ID0gbnVsbDsKLSAgICAgIGlmICgoKGtleWVkUmVmZXJlbmNlTGlzdCA9IGNhdGVnb3J5QmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCkpCi0gICAgICAgID09IG51bGwpCi0gICAgICAgIHx8IChrZXllZFJlZmVyZW5jZUxpc3Quc2l6ZSgpID09IDApKQotICAgICAgewotICAgICAgICB0b1N0cmluZyArPSAiTm8gS2V5ZWRSZWZlcmVuY2VzIjsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbnQgY291bnQgPSAxOwotICAgICAgICBLZXllZFJlZmVyZW5jZSBrZXllZFJlZmVyZW5jZTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXllZFJlZmVyZW5jZUxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGtleWVkUmVmZXJlbmNlID0gKEtleWVkUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgdG9TdHJpbmcgKz0gIlxuICBbIgotICAgICAgICAgICAgKyBjb3VudCsrCi0gICAgICAgICAgICArICJdIHRNb2RlbEtleTogIgotICAgICAgICAgICAgKyBrZXllZFJlZmVyZW5jZS5nZXRUTW9kZWxLZXkoKQotICAgICAgICAgICAgKyAiLCBrZXlOYW1lOiAiCi0gICAgICAgICAgICArIGtleWVkUmVmZXJlbmNlLmdldEtleU5hbWUoKQotICAgICAgICAgICAgKyAiLCBrZXlWYWx1ZTogIgotICAgICAgICAgICAgKyBrZXllZFJlZmVyZW5jZS5nZXRLZXlWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0b1N0cmluZyA9ICJudWxsIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gdG9TdHJpbmc7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwjaXNQcmltYXJ5RW50cnlUeXBlTWF0Y2gob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzUHJpbWFyeUVudHJ5VHlwZU1hdGNoKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgdGFyZ2V0Q29udGV4dCkKLSAgewotICAgIGJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQotICAgIC8vIElmIHRoZSB0ZXN0IGFzc2VydGlvbiBlbnRyeSB0eXBlIG1hdGNoZXMgdGhlIHRhcmdldCBjb250ZXh0IGVudHJ5IHR5cGUsIHRoZW4gY29udGluZQotICAgIGlmICh0ZXN0QXNzZXJ0aW9uCi0gICAgICAuZ2V0RW50cnlUeXBlTmFtZSgpCi0gICAgICAuZXF1YWxzKHRhcmdldENvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKS5nZXRUeXBlTmFtZSgpKSkKLSAgICB7Ci0gICAgICBtYXRjaCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1hdGNoOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsI2lzTm90QXBwbGljYWJsZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uKQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNOb3RBcHBsaWNhYmxlKFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbikKLSAgewotICAgIGJvb2xlYW4gbm90QXBwbGljYWJsZSA9IGZhbHNlOwotCi0gICAgLy8gQUREOgotCi0gICAgcmV0dXJuIG5vdEFwcGxpY2FibGU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2ODRiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLnVkZGk7Ci0KLS8qKgotICogV1NJMzAwMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMzAwMSBleHRlbmRzIEJQMzAwMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gVURESVZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kzMDAxKFVERElWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvV1NJMzAwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGRkMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC51ZGRpOwotCi0vKioKLSAqIFdTSTMwMDIKLSAqLwotcHVibGljIGNsYXNzIFdTSTMwMDIgZXh0ZW5kcyBCUDMwMDIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFVERElWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMzAwMihVRERJVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvV1NJMzAwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWIwMTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvV1NJMzAwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwudWRkaTsKLQotLyoqCi0gKiBXU0kzMDAzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kzMDAzIGV4dGVuZHMgQlAzMDAzCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBVRERJVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTMwMDMoVURESVZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDA0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1NDgwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC51ZGRpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlVERElVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC5XU0RMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5DYXRlZ29yeUJhZzsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuS2V5ZWRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIFdTSTMwMDQgLSBUaGUgY29uZm9ybWFuY2UgY2xhaW1zIGluIHRoZSB1ZGRpOnRNb2RlbCBhcmUgdGhlIHNhbWUKLSAqIGFzIHRob3NlIGluIHRoZSB3c2RsOmJpbmRpbmcgd2hpY2ggaXMgcmVmZXJlbmNlZCBieSB0aGUgdWRkaTp0TW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kzMDA0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBVRERJVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBVRERJVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTMwMDQoVURESVZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUU19QQVJBTSA9ICJwb3J0cyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX1BBUkFNID0gImJpbmRpbmciOwotCi0gIC8qKgotICAgKiBHZXRzIFdTSSBjb25mb3JtYW5jZSBjbGFpbXMgZnJvbSBhIHRNb2RlbC4KLSAgICogQHBhcmFtIHRNb2RlbAotICAgKiBAcmV0dXJuIEhhc2hTZXQKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24KLSAgICovCi0gIHByaXZhdGUgSGFzaFNldCBnZXRDb25mb3JtYW5jZUNsYWltc0Zyb21VRERJKFRNb2RlbCB0TW9kZWwpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGNvbmZvcm1hbmNlS2V5ID0gVURESVV0aWxzLmdldFdTSUNvbmZvcm1hbmNlVE1vZGVsS2V5KHZhbGlkYXRvci51ZGRpUHJveHkpOwotCi0gICAgSGFzaFNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgQ2F0ZWdvcnlCYWcgYmFnID0gdE1vZGVsLmdldENhdGVnb3J5QmFnKCk7Ci0gICAgaWYgKGJhZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciByZWZlcmVuY2VzID0gYmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIHJlZiA9IChLZXllZFJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0KLSAgICAgICAgaWYgKHJlZi5nZXRUTW9kZWxLZXkoKS5lcXVhbHNJZ25vcmVDYXNlKGNvbmZvcm1hbmNlS2V5KSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hZGQocmVmLmdldEtleVZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIFdTSSBjb25mb3JtYW5jZSBjbGFpbXMgZnJvbSBXU0RMIGJpbmRpbmcKLSAgICogdGhhdCByZWZlcmVuY2VzIHNwZWNpZmllZCB0TW9kZWwuIEFkZGl0aW9uYWxseSwKLSAgICogV1NETCBwb3J0cywgd2hpY2ggdXNlcyB0aGUgYmluZGluZywgYXJlIHByb2Nlc3NlZC4KLSAgICoKLSAgICogQHBhcmFtIHRNb2RlbAotICAgKiBAcmV0dXJuIEhhc2hTZXQKLSAgICovCi0gIHByaXZhdGUgSGFzaFNldCBnZXRDb25mb3JtYW5jZUNsYWltc0Zyb21XU0RMKFRNb2RlbCB0TW9kZWwpCi0gIHsKLSAgICBIYXNoU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBSZWFkIHRoZSBXU0RMIGRvY3VtZW50Ci0gICAgICBTdHJpbmcgb3ZlcnZpZXdVUkwgPSB2YWxpZGF0b3IuZ2V0T3ZlcnZpZXdVUkwodE1vZGVsKTsKLSAgICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQgPSB2YWxpZGF0b3IuZ2V0V1NETERvY3VtZW50KG92ZXJ2aWV3VVJMKTsKLQotICAgICAgLy8gR2V0IGJpbmRpbmcKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IHZhbGlkYXRvci5nZXRCaW5kaW5nKG92ZXJ2aWV3VVJMLCB3c2RsRG9jdW1lbnQpOwotICAgICAgU3RyaW5nIGJpbmRpbmdOYW1lID0gYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCi0gICAgICAvLyBHZXQgY2xhaW1zCi0gICAgICByZXN1bHQgPQotICAgICAgICBnZXRDbGFpbXNGcm9tRWxlbWVudChiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksIHJlc3VsdCk7Ci0KLSAgICAgIC8vIEdldCBwb3J0cywgd2hpY2ggcmVmZXJlbmNlIHRoaXMgYmluZGluZywgYmVjYXVzZToKLSAgICAgIC8vICJBIGNsYWltIG9uIGEgd3NkbDpwb3J0IGlzIGluaGVyaXRlZCBieSB0aGUgcmVmZXJlbmNlZCB3c2RsOmJpbmRpbmdzLiIKLSAgICAgIFZlY3RvciBwb3J0cyA9IGdldFBvcnRzKHdzZGxEb2N1bWVudCwgYmluZGluZ05hbWUpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRzLmdldChpKTsKLQotICAgICAgICByZXN1bHQgPSBnZXRDbGFpbXNGcm9tRWxlbWVudChwb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksIHJlc3VsdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBBREQ6Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIFdTSSBjb25mb3JtYW5jZSBjbGFpbXMgZnJvbSB0aGUgJ2RvY3VtZW50YXRpb24nIFhNTCBlbGVtZW50Ci0gICAqIGFuZCBwdXRzIHRoZW0gaW50byB0aGUgSGFzaFNldC4KLSAgICogQHBhcmFtIGRvY0VsZW1lbnQKLSAgICogQHBhcmFtIHJlc3VsdAotICAgKiBAcmV0dXJuIEhhc2hTZXQKLSAgICovCi0gIHByaXZhdGUgSGFzaFNldCBnZXRDbGFpbXNGcm9tRWxlbWVudChFbGVtZW50IGRvY0VsZW1lbnQsIEhhc2hTZXQgcmVzdWx0KQotICB7Ci0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKGRvY0VsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGNsYWltRWxlbWVudCA9IFhNTFV0aWxzLmZpbmRDaGlsZEVsZW1lbnQoZG9jRWxlbWVudCwgV1NJX0NMQUlNKTsKLSAgICAgIHdoaWxlIChjbGFpbUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgTm9kZSBhdHRyID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGNsYWltRWxlbWVudCwgQVRUUl9DTEFJTV9DT05GT1JNU1RPKTsKLSAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICAgICAgCXJlc3VsdC5hZGQoYXR0ci5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgICovCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9Ci0gICAgICAgICAgY2xhaW1FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NMQUlNX0NPTkZPUk1TVE8uZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICByZXN1bHQuYWRkKHZhbHVlKTsKLQotICAgICAgICBjbGFpbUVsZW1lbnQgPSBYTUxVdGlscy5maW5kRWxlbWVudChjbGFpbUVsZW1lbnQsIFdTSV9DTEFJTSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHdzZGw6cG9ydHMsIHdoaWNoIHVzZSBzcGVjaWZpZWQgYmluZGluZy4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudAotICAgKiBAcGFyYW0gYmluZGluZ05hbWUKLSAgICogQHJldHVybiBWZWN0b3IKLSAgICovCi0gIHByaXZhdGUgVmVjdG9yIGdldFBvcnRzKFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQsIFN0cmluZyBiaW5kaW5nTmFtZSkKLSAgewotICAgIFZlY3RvciBwb3J0cyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIE1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHBhcmFtcy5wdXQoUE9SVFNfUEFSQU0sIHBvcnRzKTsKLSAgICBwYXJhbXMucHV0KEJJTkRJTkdfUEFSQU0sIGJpbmRpbmdOYW1lKTsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgIHRyYXZlcnNhbC52aXNpdFBvcnQodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKHdzZGxEb2N1bWVudC5nZXREZWZpbml0aW9ucygpLCBwYXJhbXMpOwotCi0gICAgcmV0dXJuIHBvcnRzOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5Qb3J0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUG9ydCBwb3J0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAocG9ydAotICAgICAgLmdldEJpbmRpbmcoKQotICAgICAgLmdldFFOYW1lKCkKLSAgICAgIC5nZXRMb2NhbFBhcnQoKQotICAgICAgLmVxdWFscyhjdHguZ2V0UGFyYW1ldGVyKEJJTkRJTkdfUEFSQU0pLnRvU3RyaW5nKCkpKQotICAgIHsKLSAgICAgICgoVmVjdG9yKSBjdHguZ2V0UGFyYW1ldGVyKFBPUlRTX1BBUkFNKSkuYWRkKHBvcnQpOwotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIC8vIEdldCB0aGUgdE1vZGVsIGZyb20gdGhlIGVudHJ5Q29udGV4dAotICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gSWYgdGhlIHRNb2RlbCBkb2VzIG5vdCBleGlzdCwgdGhlbiBmYWlsCi0gICAgaWYgKHRNb2RlbCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPSAiQ291bGQgbm90IGxvY2F0ZSBhIHRNb2RlbC4iOwotICAgIH0KLQotICAgIC8vIElmIHRoZXJlIGlzIGEgdE1vZGVsCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBIYXNoU2V0IGNsYWltc0Zyb21VRERJID0gZ2V0Q29uZm9ybWFuY2VDbGFpbXNGcm9tVURESSh0TW9kZWwpOwotICAgICAgICBIYXNoU2V0IGNsYWltc0Zyb21XU0RMID0gZ2V0Q29uZm9ybWFuY2VDbGFpbXNGcm9tV1NETCh0TW9kZWwpOwotCi0gICAgICAgIGlmIChjbGFpbXNGcm9tVURESS5zaXplKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNsYWltc0Zyb21VRERJLnNpemUoKSA9PSBjbGFpbXNGcm9tV1NETC5zaXplKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgY291bnRlciA9IDA7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY2xhaW1zRnJvbVdTREwuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFpbSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIyID0gY2xhaW1zRnJvbVVEREkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgaXRlcjIuaGFzTmV4dCgpOwotICAgICAgICAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyB1ZGRpQ2xhaW0gPSAoU3RyaW5nKSBpdGVyMi5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChjbGFpbS5lcXVhbHNJZ25vcmVDYXNlKHVkZGlDbGFpbSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudGVyKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoY291bnRlciAhPSBjbGFpbXNGcm9tV1NETC5zaXplKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gZmFpbGVkCi0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAgICAgIlRoZSB0TW9kZWwga2V5IGlzOiBbIiArIHRNb2RlbC5nZXRUTW9kZWxLZXkoKSArICJdLiI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIGZhaWxlZAotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAgICJUaGUgdE1vZGVsIGtleSBpczogWyIgKyB0TW9kZWwuZ2V0VE1vZGVsS2V5KCkgKyAiXS4iOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9Ci0gICAgICAgICAgIlRoZSB0TW9kZWwga2V5IGlzOiBbIiArIHRNb2RlbC5nZXRUTW9kZWxLZXkoKSArICJdLiI7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDA1X09CU09MRVRFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDVfT0JTT0xFVEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2ZjVhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDVfT0JTT0xFVEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC51ZGRpOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVURESVV0aWxzOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkNhdGVnb3J5QmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotCi0vKioKLSAqIFdTSTMwMDVfT0JTT0xFVEUgLSBBIHVkZGk6dE1vZGVsIHdoaWNoIGNsYWltcyBjb25mb3JtYW5jZSB3aXRoIGEgV1MtSSBwcm9maWxlCi0gKiBtdXN0IGJlIGNhdGVnb3JpemVkIHVzaW5nIHRoZSB3cy1pLW9yZzpjb25mb3Jtc1RvIHRheG9ub215LgotICovCi1wdWJsaWMgY2xhc3MgV1NJMzAwNV9PQlNPTEVURSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBVRERJVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBVRERJVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTMwMDVfT0JTT0xFVEUoVURESVZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIC8vIEdldCB0aGUgdE1vZGVsIGZyb20gdGhlIGVudHJ5Q29udGV4dAotICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gSWYgdGhlIHRNb2RlbCBkb2VzIG5vdCBleGlzdCwgdGhlbiBmYWlsCi0gICAgaWYgKHRNb2RlbCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPSAiQ291bGQgbm90IGxvY2F0ZSBhIHRNb2RlbC4iOwotICAgIH0KLQotICAgIC8vIElmIHRoZXJlIGlzIGEgdE1vZGVsCi0gICAgZWxzZQotICAgIHsKLSAgICAgIENhdGVnb3J5QmFnIGJhZyA9IHRNb2RlbC5nZXRDYXRlZ29yeUJhZygpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFjaGVja0NhdGVnb3J5QmFnKHRoaXMudmFsaWRhdG9yLnVkZGlQcm94eSwgYmFnKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGZhaWxlZAotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAgICJUaGUgdE1vZGVsIGtleSBpczogWyIgKyB0TW9kZWwuZ2V0VE1vZGVsS2V5KCkgKyAiXS4iOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9Ci0gICAgICAgICAgIlRoZSBVRERJIHJlZ2lzdHJ5IGRvZXMgbm90IGNvbnRhaW4gV1NJIGNvbmZvcm1hbmNlIHRheG9ub215IgotICAgICAgICAgICAgKyAiIHRNb2RlbCAoXCJ3cy1pLW9yZzpjb25mb3Jtc1RvOjIwMDJfMTJcIikuIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyBhIGNhdGVnb3J5IGJhZy4KLSAgICogQHBhcmFtIHByb3h5Ci0gICAqIEBwYXJhbSBiYWcKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tDYXRlZ29yeUJhZyhVRERJUHJveHkgcHJveHksIENhdGVnb3J5QmFnIGJhZykKLSAgewotICAgIFN0cmluZyBjb25mb3JtYW5jZUtleSA9IFVERElVdGlscy5nZXRXU0lDb25mb3JtYW5jZVRNb2RlbEtleShwcm94eSk7Ci0KLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgaWYgKGJhZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciByZWZlcmVuY2VzID0gYmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpICYmICFyZXN1bHQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2UgcmVmID0gKEtleWVkUmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChpKTsKLQotICAgICAgICByZXN1bHQgPSByZWYuZ2V0VE1vZGVsS2V5KCkuZXF1YWxzSWdub3JlQ2FzZShjb25mb3JtYW5jZUtleSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvV1NJMzAwNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOGMwMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwudWRkaTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvblJlc3VsdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VRERJVXRpbHM7Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuQ2F0ZWdvcnlCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotCi0KLS8qKgotICogV1NJMzAwNiAtIFRoZSB1ZGRpOnRNb2RlbCB1c2VzIHRoZSB3cy1pLW9yZzpjb25mb3Jtc1RvOjIwMDJfMTIgY2F0ZWdvcml6YXRpb24KLSAqIHZhbHVlIG9mICJodHRwOi8vd3MtaS5vcmcvcHJvZmlsZXMvYmFzZS8xLjAiLiBUaGUgY2F0ZWdvcnlCYWcgaW4gdGhlIHRNb2RlbAotICogY29udGFpbnMgYSBrZXllZFJlZmVyZW5jZSB3aXRoIGEgdE1vZGVsS2V5IHRoYXQgY29udGFpbnMgdGhlIGtleSB2YWx1ZQotICogdXVpZDo2NTcxOTE2OC03MmM2LTNmMjktOGMyMC02MmRlZmIwOTYxYzAgZm9yIHRoZSB3cy1pLW9yZzpjb25mb3Jtc1RvOjIwMDJfMTIKLSAqIHRNb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFdTSTMwMDYgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgVURESVZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotICAvKioKLSAgICogQHBhcmFtIFVERElWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMzAwNihVRERJVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0gbnVsbDsKLSAgICBLZXllZFJlZmVyZW5jZSBjbGFpbUtleWVkUmVmID0gbnVsbDsKLQotICAgIC8vIGNoZWNrIHdoZXRoZXIgYSBVRERJIGNvbmZvcm1hbmNlIGNsYWltIGlzIGJlaW5nIG1hZGUuLi4KLQotICAgIC8vIEdldCB0aGUgdE1vZGVsIGZyb20gdGhlIGVudHJ5Q29udGV4dAotICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICgoY2xhaW1LZXllZFJlZiA9IGNvbmZvcm1hbmNlQ2xhaW1NYWRlKHRNb2RlbCkpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25SZXN1bHRFeGNlcHRpb24oCi0gICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHdlIGhhdmUgYSBjb25mb3JtYW5jZSBjbGFpbSwgc28gY2hlY2sgdGhlIGtleWVkUmVmZXJlbmNlIGtleVZhbHVlCi0gICAgICBpZiAoIWNsYWltS2V5ZWRSZWYKLSAgICAgICAgLmdldEtleVZhbHVlKCkKLSAgICAgICAgLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9VRERJX0NMQUlNX0tFWVZBTFVFKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblJlc3VsdEV4Y2VwdGlvbigKLSAgICAgICAgICBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRCwKLSAgICAgICAgICAiVGhlIHRNb2RlbCBrZXkgaXM6IFsiCi0gICAgICAgICAgICArIHRNb2RlbC5nZXRUTW9kZWxLZXkoKQotICAgICAgICAgICAgKyAiXS5cblRoZSBjYXRlZ29yeUJhZyBpczogWyIKLSAgICAgICAgICAgICsgdE1vZGVsLmdldENhdGVnb3J5QmFnKCkKLSAgICAgICAgICAgICsgIl0uIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25SZXN1bHRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0gZS5nZXREZXRhaWxNZXNzYWdlKCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWxNZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgYSBjYXRlZ29yeSBiYWcgYW5kIGV4dHJhY3RzIEtleWVkUmVmZXJlbmNlIGNvbnRhaW5pbmcKLSAgICogdGhlIGNvbmZvcm1hbmNlIGNsYWltLgotICAgKiBAcGFyYW0gcHJveHkKLSAgICogQHBhcmFtIGJhZwotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgS2V5ZWRSZWZlcmVuY2UgY2hlY2tDYXRlZ29yeUJhZyhVRERJUHJveHkgcHJveHksIENhdGVnb3J5QmFnIGJhZykKLSAgewotICAgIFN0cmluZyBjb25mb3JtYW5jZUtleSA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgY29uZm9ybWFuY2VLZXkgPSBVRERJVXRpbHMuZ2V0V1NJQ29uZm9ybWFuY2VUTW9kZWxLZXkocHJveHkpOwotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBLZXllZFJlZmVyZW5jZSBjb25mb3JtYW5jZVJlZiA9IG51bGw7Ci0KLSAgICBpZiAoYmFnICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIHJlZmVyZW5jZXMgPSBiYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCkgJiYgcmVzdWx0OyBpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIHJlZiA9IChLZXllZFJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0KLSAgICAgICAgaWYgKHJlZgotICAgICAgICAgIC5nZXRUTW9kZWxLZXkoKQotICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKGNvbmZvcm1hbmNlS2V5KSAvLyYmIHJlZi5nZXRLZXlWYWx1ZSgpLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9VRERJX0NMQUlNX0tFWVZBTFVFKQotICAgICAgICAvLyB3ZSBuZWVkIG9ubHkgdE1vZGVsIGtleQotICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgIGNvbmZvcm1hbmNlUmVmID0gcmVmOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvbmZvcm1hbmNlUmVmOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIEtleWVkUmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIGNvbmZvcm1hbmNlIGNsYWltLgotICAgKiBAcGFyYW0gdE1vZGVsCi0gICAqIEByZXR1cm4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24KLSAgICovCi0gIHByaXZhdGUgS2V5ZWRSZWZlcmVuY2UgY29uZm9ybWFuY2VDbGFpbU1hZGUoVE1vZGVsIHRNb2RlbCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vIElmIHRoZSB0TW9kZWwgZG9lcyBub3QgZXhpc3QsIHRoZW4gZmFpbAotICAgIGlmICh0TW9kZWwgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0TW9kZWwgY2Fubm90IGJlIG51bGwiKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBhIHRNb2RlbAotICAgIGVsc2UKLSAgICB7Ci0gICAgICBDYXRlZ29yeUJhZyBiYWcgPSB0TW9kZWwuZ2V0Q2F0ZWdvcnlCYWcoKTsKLSAgICAgIHJldHVybiBjaGVja0NhdGVnb3J5QmFnKHRoaXMudmFsaWRhdG9yLnVkZGlQcm94eSwgYmFnKTsKLSAgICB9Ci0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvV1NJMzAwNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjNlZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwudWRkaTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlVERElVdGlsczsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLkJpbmRpbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkNhdGVnb3J5QmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotCi0vKioKLSAqIFdTSTMwMDcgLSBBIHVkZGk6YnVzaW5lc3NFbnRpdHkgb3IgdWRkaTpidXNpbmVzc1NlcnZpY2UgYXNzb2NpYXRlZAotICogd2l0aCB0aGlzIHVkZGk6YmluZGluZ1RlbXBsYXRlIGlzIG5vdCBjYXRlZ29yaXplZCB1c2luZwotICogdGhlIHdzLWktb3JnOmNvbmZvcm1zVG86MjAwMl8xMiB0YXhvbm9teS4KLSAqLwotcHVibGljIGNsYXNzIFdTSTMwMDcgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgVURESVZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gVURESVZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kzMDA3KFVERElWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBzZXJ2aWNlTG9jYXRpb24gPSBudWxsOwotCi0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICAvLyBHZXQgdGhlIGJpbmRpbmdUZW1wbGF0ZSBmcm9tIHRoZSBlbnRyeUNvbnRleHQKLSAgICBCaW5kaW5nVGVtcGxhdGUgYmluZGluZ1RlbXBsYXRlID0KLSAgICAgIChCaW5kaW5nVGVtcGxhdGUpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICBib29sZWFuIHZhbGlkU2VydmljZSA9IGZhbHNlOwotICAgIGJvb2xlYW4gdmFsaWRCdXNpbmVzcyA9IGZhbHNlOwotCi0gICAgU3RyaW5nIHNlcnZpY2VLZXkgPSBudWxsOwotICAgIFN0cmluZyBidXNpbmVzc0tleSA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgc2VydmljZUtleSA9IGJpbmRpbmdUZW1wbGF0ZS5nZXRTZXJ2aWNlS2V5KCk7Ci0gICAgICBCdXNpbmVzc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgIFVERElVdGlscy5nZXRCdXNpbmVzc1NlcnZpY2VCeUtleSh0aGlzLnZhbGlkYXRvci51ZGRpUHJveHksIHNlcnZpY2VLZXkpOwotCi0gICAgICBidXNpbmVzc0tleSA9IHNlcnZpY2UuZ2V0QnVzaW5lc3NLZXkoKTsKLSAgICAgIEJ1c2luZXNzRW50aXR5IGJ1c2luZXNzID0KLSAgICAgICAgVURESVV0aWxzLmdldEJ1c2luZXNzQnlLZXkodGhpcy52YWxpZGF0b3IudWRkaVByb3h5LCBidXNpbmVzc0tleSk7Ci0KLSAgICAgIHZhbGlkU2VydmljZSA9IGNoZWNrQ2F0ZWdvcnlCYWcodGhpcy52YWxpZGF0b3IudWRkaVByb3h5LCBzZXJ2aWNlLmdldENhdGVnb3J5QmFnKCkpOwotICAgICAgdmFsaWRCdXNpbmVzcyA9IGNoZWNrQ2F0ZWdvcnlCYWcodGhpcy52YWxpZGF0b3IudWRkaVByb3h5LCBidXNpbmVzcy5nZXRDYXRlZ29yeUJhZygpKTsKLQotICAgICAgaWYgKCF2YWxpZEJ1c2luZXNzIHx8ICF2YWxpZFNlcnZpY2UpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgICAgIGlmICghdmFsaWRCdXNpbmVzcykKLSAgICAgICAgewotICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAgICJUaGUgYnVzaW5lc3NFbnRpdHkga2V5IGlzOiBbIiArIGJ1c2luZXNzS2V5ICsgIl0uIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdmFsaWRTZXJ2aWNlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCF2YWxpZEJ1c2luZXNzKQotICAgICAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgKz0gIiAiOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0gIiI7Ci0KLSAgICAgICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSArPSAiVGhlIGJ1c2luZXNzU2VydmljZSBrZXkgaXM6IFsiCi0gICAgICAgICAgICArIHNlcnZpY2VLZXkKLSAgICAgICAgICAgICsgIl0uIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9Ci0gICAgICAgICJUaGUgVURESSByZWdpc3RyeSBkb2VzIG5vdCBjb250YWluIFdTSSBjb25mb3JtYW5jZSB0YXhvbm9teSIKLSAgICAgICAgICArICIgdE1vZGVsIChcIndzLWktb3JnOmNvbmZvcm1zVG86MjAwMl8xMlwiKS4iOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBkaXNjb3ZlcnkgdGVzdCBhc3NlcnRpb25zLiIsCi0gICAgICAgIGUpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsTWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhdGVnb3J5IGJhZyBjb250YWlucyB0aGUgY29uZm9ybWFuY2UgY2xhaW0uCi0gICAqIFJldHVybnMgPGI+dHJ1ZTwvYj4gaWYgdGhlIGJhZyBkb2VzIG5vdCBjb250YWluIHRoZSBjb25mb3JtYW5jZSBjbGFpbS4KLSAgICogQHBhcmFtIHByb3h5Ci0gICAqIEBwYXJhbSBiYWcKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tDYXRlZ29yeUJhZyhVRERJUHJveHkgcHJveHksIENhdGVnb3J5QmFnIGJhZykKLSAgewotICAgIFN0cmluZyBjb25mb3JtYW5jZUtleSA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgY29uZm9ybWFuY2VLZXkgPSBVRERJVXRpbHMuZ2V0V1NJQ29uZm9ybWFuY2VUTW9kZWxLZXkocHJveHkpOwotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLSAgICBpZiAoYmFnICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIHJlZmVyZW5jZXMgPSBiYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCkgJiYgcmVzdWx0OyBpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIHJlZiA9IChLZXllZFJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0KLSAgICAgICAgcmVzdWx0ID0gIXJlZi5nZXRUTW9kZWxLZXkoKS5lcXVhbHNJZ25vcmVDYXNlKGNvbmZvcm1hbmNlS2V5KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDIxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1MzUyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC51ZGRpOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVURESVV0aWxzOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuQ2F0ZWdvcnlCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotCi0KLS8qKgotKiBXU0kzMDIxIC0gVGhlIHVkZGk6dE1vZGVsIGhhcyBhICJuYW1lIiBlbGVtZW50IG9mIHZhbHVlICJ3cy1pLW9yZzpjb25mb3Jtc1RvOjIwMDJfMTIiICwKLSogaGFzIGFuIG92ZXJ2aWV3VVJMIHZhbHVlIG9mICJodHRwOi8vd3MtaS5vcmcvc2NoZW1hcy9jb25mb3JtYW5jZUNsYWltLyIsIGFuZCBoYXMKLSogYSBrZXllZFJlZmVyZW5jZSBlbGVtZW50IHdpdGgga2V5TmFtZSBhdHRyaWJ1dGUgdmFsdWUgb2YgInVkZGktb3JnOnR5cGVzOmNhdGVnb3JpemF0aW9uIi4KLSovCi1wdWJsaWMgY2xhc3MgV1NJMzAyMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBVRERJVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBVRERJVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTMwMjEoVURESVZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBUTW9kZWwgdE1vZGVsID0KLSAgICAgIFVERElVdGlscy5nZXRUTW9kZWxCeUtleSgKLSAgICAgICAgdGhpcy52YWxpZGF0b3IudWRkaVByb3h5LAotICAgICAgICBVRERJVXRpbHMuZ2V0V1NJQ29uZm9ybWFuY2VUTW9kZWxLZXkodGhpcy52YWxpZGF0b3IudWRkaVByb3h5KSk7Ci0KLSAgICAvLyBJZiB0aGUgdE1vZGVsIGRvZXMgbm90IGV4aXN0LCB0aGVuIGZhaWwKLSAgICBpZiAodE1vZGVsID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9ICJDb3VsZCBub3QgbG9jYXRlIGEgdE1vZGVsLiI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIHZhbGlkVVJMID0KLSAgICAgICAgdE1vZGVsLmdldE92ZXJ2aWV3RG9jKCkgIT0gbnVsbAotICAgICAgICAgICYmICJodHRwOi8vd3MtaS5vcmcvc2NoZW1hcy9jb25mb3JtYW5jZUNsYWltLyIuZXF1YWxzKAotICAgICAgICAgICAgdE1vZGVsLmdldE92ZXJ2aWV3RG9jKCkuZ2V0T3ZlcnZpZXdVUkxTdHJpbmcoKSk7Ci0gICAgICBib29sZWFuIHZhbGlkQ2F0ZWdvcnkgPSBjaGVja0NhdGVnb3J5QmFnKHRNb2RlbC5nZXRDYXRlZ29yeUJhZygpKTsKLQotICAgICAgaWYgKHZhbGlkVVJMICYmIHZhbGlkQ2F0ZWdvcnkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPSB0aGlzLnZhbGlkYXRvci51ZGRpUmVmZXJlbmNlLmdldElucXVpcnlVUkwoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjYXRlZ29yeSBiYWcgbWVldHMgdGhlIFdTSSdzIHJlcXVpcmVtZW50cy4KLSAgICogQHBhcmFtIGJhZwotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tDYXRlZ29yeUJhZyhDYXRlZ29yeUJhZyBiYWcpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgaWYgKGJhZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciByZWZlcmVuY2VzID0gYmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpICYmICFyZXN1bHQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2UgcmVmID0gKEtleWVkUmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChpKTsKLQotICAgICAgICByZXN1bHQgPQotICAgICAgICAgICJ1ZGRpLW9yZzp0eXBlczpjYXRlZ29yaXphdGlvbiIuZXF1YWxzKHJlZi5nZXRLZXlOYW1lKCkpCi0gICAgICAgICAgICAmJiAiY2F0ZWdvcml6YXRpb24iLmVxdWFscyhyZWYuZ2V0S2V5VmFsdWUoKSkKLSAgICAgICAgICAgICYmICJ1dWlkOkMxQUNGMjZELTk2NzItNDQwNC05RDcwLTM5Qjc1NkU2MkFCNCIuZXF1YWxzKAotICAgICAgICAgICAgICByZWYuZ2V0VE1vZGVsS2V5KCkpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlNTYxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMjkwMQotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudDwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BIGRlc2NyaXB0aW9uIHVzZXMgZWl0aGVyIHRoZSBXU0RMIE1JTUUgQmluZGluZyBhcyBkZXNjcmliZWQgaW4gV1NETCAxLjEgU2VjdGlvbiA1Ci0gKiBvciBXU0RMIFNPQVAgYmluZGluZyBhcyBkZXNjcmliZWQgaW4gV1NETCAxLjEgU2VjdGlvbiAzCi0gKiBvbiBlYWNoIG9mIHRoZSB3c2RsOmlucHV0IG9yIHdzZGw6b3V0cHV0IGVsZW1lbnRzIG9mIGEgd3NkbDpiaW5kaW5nLiA8L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAyOTAxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICAvKioKLSAgICogV1NETFZhbGlkYXRvcgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgcHJpdmF0ZSBDb2xsZWN0aW9uIG1pbWVFbGVtZW50czsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTAxKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0KLSAgICBtaW1lRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotICAgIG1pbWVFbGVtZW50cy5hZGQoV1NETF9NSU1FX0NPTlRFTlQpOwotICAgIG1pbWVFbGVtZW50cy5hZGQoV1NETF9NSU1FX1hNTCk7Ci0gICAgbWltZUVsZW1lbnRzLmFkZChXU0RMX01JTUVfTVVMVElQQVJUKTsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0dGluZyBhIHdzZGw6YmluZGluZwotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgaXRzIHdzZGw6b3BlcmF0aW9uIGVsZW1lbnRzCi0gICAgICBMaXN0IG9wcyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLQotICAgICAgLy8gR29pbmcgdGhyb3VnaCB0aGUgb3BlcmF0aW9uIGVsZW1lbnRzCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIG9wcy5nZXQoaSk7Ci0KLSAgICAgICAgLy8gR2V0dGluZyB3c2RsOmlucHV0IGFuZCB3c2RsOm91dHB1dCBlbGVtZW50cyBvZiBhbiBvcGVyYXRpb24KLSAgICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpOwotCi0gICAgICAgIFFOYW1lIGluYXBwbGljYWJsZUVsZW1lbnQgPSBudWxsOwotICAgICAgICAvLyBHZXR0aW5nIGFuIGluYXBwbGljYWJsZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgb2Ygd3NkbDppbnB1dAotICAgICAgICAvLyBJZiBzdWNoIGVsZW1lbnQgZXhpc3RzLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICBpZiAoYmluZGluZ0lucHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIGFuIGluYXBwbGljYWJsZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgb2Ygd3NkbDppbnB1dAotICAgICAgICAgIC8vIElmIHN1Y2ggZWxlbWVudCBleGlzdHMsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaW5hcHBsaWNhYmxlRWxlbWVudCA9IGdldEluYXBwbGljYWJsZUVsZW1lbnQoYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQotICAgICAgICAgIGlmIChpbmFwcGxpY2FibGVFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbihpbmFwcGxpY2FibGVFbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBHZXR0aW5nIGFuIGluYXBwbGljYWJsZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgb2Ygd3NkbDpvdXRwdXQKLSAgICAgICAgLy8gSWYgc3VjaCBlbGVtZW50IGV4aXN0cywgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgaWYgKGJpbmRpbmdPdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGluYXBwbGljYWJsZUVsZW1lbnQgPQotICAgICAgICAgICAgZ2V0SW5hcHBsaWNhYmxlRWxlbWVudChiaW5kaW5nT3V0cHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICAgICAgICBpZiAoaW5hcHBsaWNhYmxlRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oaW5hcHBsaWNhYmxlRWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIExvb2tzIGZvciBhbnkgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IG9mIHdzZGw6aW5wdXQgb3Igd3NkbDpvdXRwdXQKLSAgICogdGhhdCBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBTT0FQIGJpbmRpbmcgb3IgdGhlIE1JTUUgYmluZGluZy4KLSAgICogQHBhcmFtIGV4dEVsZW1zIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAqIEByZXR1cm4gdGhlIFFOYW1lIG9mIGFuIGluYXBwbGljYWJsZSBlbGVtZW50Ci0gICAqLwotICBwcml2YXRlIFFOYW1lIGdldEluYXBwbGljYWJsZUVsZW1lbnQoTGlzdCBleHRFbGVtcykKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0RWxlbXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPQotICAgICAgICAoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtcy5nZXQoaSkpLmdldEVsZW1lbnRUeXBlKCk7Ci0KLSAgICAgIGlmICghbWltZUVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnROYW1lKSAmJgotICAgICAgICAgICFlbGVtZW50TmFtZS5lcXVhbHMoV1NETF9TT0FQX0JPRFkpICYmCi0gICAgICAgICAgIWVsZW1lbnROYW1lLmVxdWFscyhXU0RMX1NPQVBfSEVBREVSKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnROYW1lOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYmMzMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotLyoqCi0gKiBBUDI5MDMKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIHdpdGggYXQgbGVhc3Qgb25lIG1pbWU6Y29udGVudCBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBwYXJ0IGF0dHJpYnV0ZSBvZiBlYWNoIG1pbWU6Y29udGVudCBlbGVtZW50IGluIGEgd3NkbDpiaW5kaW5nIHJlZmVyZW5jZXMKLSAqIGEgd3NkbDpwYXJ0IGVsZW1lbnQgb2YgYSB3c2RsOm1lc3NhZ2UgdGhhdCBpcyBwcmVzZW50IGluIHRoZSByZXNwZWN0aXZlIHdzZGw6aW5wdXQgb3Igd3NkbDpvdXRwdXQgb2YgdGhlCi0gKiBjb3JyZXNwb25kaW5nIHdzZGw6b3BlcmF0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6cG9ydFR5cGUuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjkwMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMjkwMyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBBIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIGEgYmluZGluZyBjb250YWlucyBhdCBsZWFzdCBvbmUKLSAgICAgIC8vIG1pbWU6Y29udGVudCBlbGVtZW50Ci0gICAgICBib29sZWFuIG1pbWVDb250ZW50c0ZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgICAvLyBHZXR0aW5nIGl0cyB3c2RsOm9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgTGlzdCBvcHMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcHMuZ2V0KGkpOwotCi0gICAgICAgIC8vIEdldHRpbmcgd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQgZWxlbWVudHMgb2YgYW4gb3BlcmF0aW9uCi0gICAgICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLQotICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzIGZyb20gd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQKLSAgICAgICAgTGlzdCBpbnB1dE1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50RWxlbWVudHMoCi0gICAgICAgICAgYmluZGluZ0lucHV0ID09IG51bGwgPyBudWxsIDogYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICAgICAgTGlzdCBvdXRwdXRNaW1lQ29udGVudHMgPSBnZXRNaW1lQ29udGVudEVsZW1lbnRzKAotICAgICAgICAgIGJpbmRpbmdPdXRwdXQgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nT3V0cHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDppbnB1dCBjb250YWlucyBtaW1lOmNvbnRlbnQgZWxlbWVudHMKLSAgICAgICAgaWYgKCFpbnB1dE1pbWVDb250ZW50cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW1lQ29udGVudHNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgSW5wdXQgcG9ydFR5cGVJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyB0aGUgY29ycmVzcG9uZGluZyB3c2RsOmlucHV0IGluIHdzZGw6cG9ydFR5cGUsCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAocG9ydFR5cGVJbnB1dCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJUaGVyZSBpcyBubyB0aGUgY29ycmVzcG9uZ2luZyB3c2RsOmlucHV0IGluIHRoZSB3c2RsOnBvcnRUeXBlIgotICAgICAgICAgICAgICArICIgb3BlcmF0aW9uIGZvciB0aGUgd3NkbDppbnB1dCBvZiB0aGUgXCIiCi0gICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIgYmluZGluZyBvcGVyYXRpb24uIik7Ci0KLSAgICAgICAgICAvLyBJZiB0aGUgd3NkbDpwb3J0VHlwZSBpbnB1dCBkb2VzIG5vdCByZWZlcmVuY2UgYW55IHdzZGw6bWVzc2FnZSwKLSAgICAgICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmIChwb3J0VHlwZUlucHV0LmdldE1lc3NhZ2UoKSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSB3c2RsOmlucHV0IG9mIHRoZSBcIiIKLSAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldE5hbWUoKSArICJcIiB3c2RsOnBvcnRUeXBlICIKLSAgICAgICAgICAgICAgKyAib3BlcmF0aW9uIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgd3NkbDptZXNzYWdlLiIpOwotCi0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgcGFydCBuYW1lIHRoYXQgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgd3NkbDptZXNzYWdlCi0gICAgICAgICAgLy8gdGhlIGlucHV0IG9mIHdzZGw6cG9ydFR5cGUgcmVmZXJzIHRvCi0gICAgICAgICAgU3RyaW5nIHBhcnQgPSBnZXRJbnZhbGlkTWltZUNvbnRlbnRQYXJ0KAotICAgICAgICAgICAgaW5wdXRNaW1lQ29udGVudHMsIHBvcnRUeXBlSW5wdXQuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICAgIC8vIElmIHN1Y2ggcGFydCBpcyBmb3VuZCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAocGFydCAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oInBhcnQ9XCIiICsgcGFydCArCi0gICAgICAgICAgICAgICJcIiwgdGhlIGlucHV0IG9mIHRoZSBiaW5kaW5nIG9wZXJhdGlvbiBcIiIKLSAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArICJcIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGw6b3V0cHV0IGNvbnRhaW5zIG1pbWU6Y29udGVudCBlbGVtZW50cwotICAgICAgICBpZiAoIW91dHB1dE1pbWVDb250ZW50cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW1lQ29udGVudHNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgT3V0cHV0IHBvcnRUeXBlT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyB0aGUgY29ycmVzcG9uZGluZyB3c2RsOmlucHV0IGluIHdzZGw6cG9ydFR5cGUsCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAocG9ydFR5cGVPdXRwdXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiVGhlcmUgaXMgbm8gdGhlIGNvcnJlc3Bvbmdpbmcgd3NkbDpvdXRwdXQgaW4gdGhlIHdzZGw6cG9ydFR5cGUiCi0gICAgICAgICAgICAgICsgIiBvcGVyYXRpb24gZm9yIHRoZSB3c2RsOm91dHB1dCBvZiB0aGUgXCIiCi0gICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIgYmluZGluZyBvcGVyYXRpb24uIik7Ci0KLSAgICAgICAgICAvLyBJZiB0aGUgd3NkbDpwb3J0VHlwZSBvdXRwdXQgZG9lcyBub3QgcmVmZXJlbmNlIGFueSB3c2RsOm1lc3NhZ2UsCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAocG9ydFR5cGVPdXRwdXQuZ2V0TWVzc2FnZSgpID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIHdzZGw6b3V0cHV0IG9mIHRoZSBcIiIKLSAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldE5hbWUoKSArICJcIiB3c2RsOnBvcnRUeXBlICIKLSAgICAgICAgICAgICAgKyAib3BlcmF0aW9uIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgd3NkbDptZXNzYWdlLiIpOwotCi0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgcGFydCBuYW1lIHRoYXQgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgd3NkbDptZXNzYWdlCi0gICAgICAgICAgLy8gdGhlIG91dHB1dCBvZiB3c2RsOnBvcnRUeXBlIHJlZmVycyB0bwotICAgICAgICAgIFN0cmluZyBwYXJ0ID0gZ2V0SW52YWxpZE1pbWVDb250ZW50UGFydCgKLSAgICAgICAgICAgICAgb3V0cHV0TWltZUNvbnRlbnRzLCBwb3J0VHlwZU91dHB1dC5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgICAgLy8gSWYgc3VjaCBwYXJ0IGlzIGZvdW5kLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigicGFydD1cIiIgKyBwYXJ0ICsKLSAgICAgICAgICAgICAgICAiXCIsIHRoZSBvdXRwdXQgb2YgdGhlIGJpbmRpbmcgb3BlcmF0aW9uIFwiIgotICAgICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIiKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGUgYmluZGluZyBjb250YWlucyBubyBtaW1lOmNvbnRlbnQgZWxlbWVudHMsCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoIW1pbWVDb250ZW50c0ZvdW5kKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgbWltZTpjb250ZW50IGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZXh0RWxlbXMgYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgdGhhdCBjYW4gY29udGFpbiBtaW1lOmNvbnRlbnRTLgotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIG1pbWU6Y29udGVudCBlbGVtZW50cyBmb3VuZC4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBnZXRNaW1lQ29udGVudEVsZW1lbnRzKExpc3QgZXh0RWxlbXMpCi0gIHsKLSAgICBMaXN0IG1pbWVDb250ZW50RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAoZXh0RWxlbXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRFbGVtcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbXMuZ2V0KGkpOwotICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMgb2YgdGhlIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgICAgIExpc3QgbWltZVBhcnRzID0gKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbSkuZ2V0TUlNRVBhcnRzKCk7Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWltZVBhcnRzLnNpemUoKTsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtaW1lOmNvbnRlbnQgZWxlbWVudHMgb2YgdGhpcyBtaW1lOnBhcnQKLSAgICAgICAgICAgIExpc3QgZWxlbXMgPSBnZXRNaW1lQ29udGVudEVsZW1lbnRzKAotICAgICAgICAgICAgICAoKE1JTUVQYXJ0KSBtaW1lUGFydHMuZ2V0KGopKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgICAgICAvLyBBZGRpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZSBsaXN0IGJlaW5nIHJldHVybmVkCi0gICAgICAgICAgICBtaW1lQ29udGVudEVsZW1lbnRzLmFkZEFsbChlbGVtcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEVsc2UgaWYgdGhlIGVsZW1lbnQgaXMgbWltZTpjb250ZW50Ci0gICAgICAgIGVsc2UgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX0NPTlRFTlQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQWRkaW5nIHRoZSBlbGVtZW50IHRvIHRoZSBsaXN0IGJlaW5nIHJldHVybmVkCi0gICAgICAgICAgbWltZUNvbnRlbnRFbGVtZW50cy5hZGQoZXh0RWxlbSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbWltZUNvbnRlbnRFbGVtZW50czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHBhcnQgbmFtZSBzcGVjaWZpZWQgaW4gbWltZTpjb250ZW50IGVsZW1lbnQgdGhhdCBpcyBub3QgcHJlc2VudGVkIGluIHdzZGw6bWVzc2FnZQotICAgKiBAcGFyYW0gbWltZUNvbnRlbnRzIGEgbGlzdCBvZiBtaW1lOmNvbnRlbnQgZWxlbWVudHMgd2hpY2ggcGFydCBhdHRyaWJ1dGVzIGFyZSB2YWxpZGF0ZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UgYSB3c2RsOm1lc3NhZ2UKLSAgICogQHJldHVybiBhIHBhcnQgbmFtZQotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW52YWxpZE1pbWVDb250ZW50UGFydChMaXN0IG1pbWVDb250ZW50cywgTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgLy8gR29pbmcgdGhyb3VnIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW1lQ29udGVudHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgLy8gR2V0dGluZyB0aGUgcGFydCBuYW1lIG9mIGEgbWltZTplbGVtZW50Ci0gICAgICBTdHJpbmcgcGFydCA9ICgoTUlNRUNvbnRlbnQpIG1pbWVDb250ZW50cy5nZXQoaSkpLmdldFBhcnQoKTsKLSAgICAgIC8vIElmIHRoZSB3c2RsOm1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBzdWNoIHBhcnQsIHJldHVybiB0aGUgcGFydAotICAgICAgaWYgKCFtZXNzYWdlLmdldFBhcnRzKCkua2V5U2V0KCkuY29udGFpbnMocGFydCkpCi0gICAgICAgIHJldHVybiBwYXJ0OwotICAgIH0KLSAgICAvLyBSZXR1cm4gbnVsbCBpZiBubyBvbmUgcGFydCBpcyBmb3VuZAotICAgIHJldHVybiBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZWMxNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotLyoqCi0gKiBBUDI5MDQKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbWltZTpjb250ZW50IGVsZW1lbnQ8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHBhcnQgYXR0cmlidXRlIG9mIGVhY2ggbWltZTpjb250ZW50IGVsZW1lbnQgaW4gYSB3c2RsOmJpbmRpbmcKLSAqIGRvZXMgbm90IHJlZmVyZW5jZSBhIHN1Yi1jb21wb25lbnQgb2YgYSB3c2RsOnBhcnQgb2YgdGhlIHdzZGw6bWVzc2FnZSB0aGF0IGlzIHByZXNlbnQgaW4gdGhlCi0gKiByZXNwZWN0aXZlIHdzZGw6aW5wdXQgb3Igd3NkbDpvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgd3NkbDpvcGVyYXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcKLSAqIHdzZGw6cG9ydFR5cGUuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjkwNCBleHRlbmRzIEFQMjkwMwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTA0KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHRlc3RBc3NlcnRpb24sIGVudHJ5Q29udGV4dCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkwNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5YzdjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMjkwNgotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgY29udGFpbmluZyBhIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkEgbm9uLXJvb3QgTUlNRSBwYXJ0IGluIGEgd3NkbDpiaW5kaW5nIGRvZXMgbm90IGNvbnRhaW4gYSBzb2FwYmluZDpoZWFkZXIgZWxlbWVudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAyOTA2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTA2KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgYSBiaW5kaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQotICAgICAgLy8gbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnQKLSAgICAgIGJvb2xlYW4gbXVsdGlwYXJ0c0ZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgICAvLyBHZXR0aW5nIGl0cyB3c2RsOm9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgTGlzdCBvcHMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcHMuZ2V0KGkpOwotCi0gICAgICAgIC8vIEdldHRpbmcgd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQgZWxlbWVudHMgb2YgYW4gb3BlcmF0aW9uCi0gICAgICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLQotICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzIGZyb20gd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQKLSAgICAgICAgTGlzdCBpbnB1dE11bHRpcGFydHMgPSBnZXRNaW1lTXVsdGlwYXJ0RWxlbWVudHMoCi0gICAgICAgICAgYmluZGluZ0lucHV0ID09IG51bGwgPyBudWxsIDogYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICAgICAgTGlzdCBvdXRwdXRNdWx0aXBhcnRzID0gZ2V0TWltZU11bHRpcGFydEVsZW1lbnRzKAotICAgICAgICAgIGJpbmRpbmdPdXRwdXQgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nT3V0cHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDppbnB1dCBjb250YWlucyBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMKLSAgICAgICAgaWYgKCFpbnB1dE11bHRpcGFydHMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgbXVsdGlwYXJ0c0ZvdW5kID0gdHJ1ZTsKLQotICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgc29hcDpoZWFkZXIgaW4gdGhlIG5vbi1yb290IG1pbWU6cGFydCwKLSAgICAgICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmIChjb250YWluc0ludmFsaWRNaW1lUGFydChpbnB1dE11bHRpcGFydHMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgaW52YWxpZCBtaW1lOnBhcnQgZWxlbWVudCAiCi0gICAgICAgICAgICAgICsgImlzIGluIHRoZSB3c2RsOmlucHV0IG9mIHRoZSBcIiIgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKQotICAgICAgICAgICAgICArICJcIiBiaW5kaW5nIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDpvdXRwdXQgY29udGFpbnMgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzCi0gICAgICAgIGlmICghb3V0cHV0TXVsdGlwYXJ0cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtdWx0aXBhcnRzRm91bmQgPSB0cnVlOwotCi0gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzb2FwOmhlYWRlciBpbiB0aGUgbm9uLXJvb3QgbWltZTpwYXJ0LAotICAgICAgICAgIC8vIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKGNvbnRhaW5zSW52YWxpZE1pbWVQYXJ0KG91dHB1dE11bHRpcGFydHMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgaW52YWxpZCBtaW1lOnBhcnQgZWxlbWVudCAiCi0gICAgICAgICAgICAgICAgKyAiaXMgaW4gdGhlIHdzZGw6b3V0cHV0IG9mIHRoZSBcIiIgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICsgIlwiIGJpbmRpbmcgb3BlcmF0aW9uLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gSWYgdGhlIGJpbmRpbmcgY29udGFpbnMgbm8gb25lIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50LAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFtdWx0aXBhcnRzRm91bmQpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIExvb2tzIGZvciBzdWNoIG5vbi1yb290IG1pbWU6cGFydCBlbGVtZW50IGZyb20gYSBsaXN0IG9mIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cwotICAgKiB0aGF0IGNvbnRhaW5zIGEgc29hcDpoZWFkZXIgZWxlbWVudC4KLSAgICogQHBhcmFtIG11bHRpcGFydHMgYSBsaXN0IG9mIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cwotICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2ggZWxlbWVudCBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNJbnZhbGlkTWltZVBhcnQoTGlzdCBtdWx0aXBhcnRzKQotICB7Ci0gICAgLy8gR29pbmcgdGhyb3VnaCBhIGxpc3Qgb2YgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdWx0aXBhcnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgYSBsaXN0IG9mIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgTGlzdCBtaW1lUGFydHMgPQotICAgICAgICAoKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBtdWx0aXBhcnRzLmdldChpKSkuZ2V0TUlNRVBhcnRzKCk7Ci0KLSAgICAgIC8vIExvb2tpbmcgZm9yIG5vbi1yb290IG1pbWU6cGFydFMKLSAgICAgIGlmIChtaW1lUGFydHMuc2l6ZSgpID4gMSkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBtaW1lUGFydHMuc2l6ZSgpOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIG9mIGEgbWltZTpwYXJ0Ci0gICAgICAgICAgTGlzdCBleHRFbGVtcyA9Ci0gICAgICAgICAgICAoKE1JTUVQYXJ0KSBtaW1lUGFydHMuZ2V0KGopKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBleHRFbGVtcy5zaXplKCk7IGsrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiBhbiBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaXMgYSBzb2FwOmhlYWRlciwKLSAgICAgICAgICAgIC8vIHJldHVybiB0cnVlCi0gICAgICAgICAgICBpZiAoKChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtcy5nZXQoaykpCi0gICAgICAgICAgICAgIC5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX1NPQVBfSEVBREVSKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIHJldHVybiBmYWxzZSwgaWYgdGhlIGVsZW1lbnQgaXMgbm90IGZvdW5kCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbGxlY3RzIGFsbCBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBleHRFbGVtcyBhIGxpc3Qgb2YgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyB0aGF0IGNhbiBjb250YWluIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cy4KLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMgZm91bmQuCi0gICAqLwotICBwcml2YXRlIExpc3QgZ2V0TWltZU11bHRpcGFydEVsZW1lbnRzKExpc3QgZXh0RWxlbXMpCi0gIHsKLSAgICBMaXN0IG1pbWVNdWx0aXBhcnRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGlmIChleHRFbGVtcyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dEVsZW1zLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtcy5nZXQoaSk7Ci0gICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgICBpZiAoZXh0RWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX01JTUVfTVVMVElQQVJUKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEFkZGluZyB0aGUgZWxlbWVudCB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgIG1pbWVNdWx0aXBhcnRFbGVtZW50cy5hZGQoZXh0RWxlbSk7Ci0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgbWltZTpwYXJ0IGVsZW1lbnRzIG9mIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgICBMaXN0IG1pbWVQYXJ0cyA9ICgoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dEVsZW0pLmdldE1JTUVQYXJ0cygpOwotICAgICAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1pbWVQYXJ0cy5zaXplKCk7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzIG9mIHRoaXMgbWltZTpwYXJ0Ci0gICAgICAgICAgICBMaXN0IGVsZW1zID0gZ2V0TWltZU11bHRpcGFydEVsZW1lbnRzKAotICAgICAgICAgICAgICAoKE1JTUVQYXJ0KSBtaW1lUGFydHMuZ2V0KGopKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgICAgICAvLyBBZGRpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZSBsaXN0IGJlaW5nIHJldHVybmVkCi0gICAgICAgICAgICBtaW1lTXVsdGlwYXJ0RWxlbWVudHMuYWRkQWxsKGVsZW1zKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbWltZU11bHRpcGFydEVsZW1lbnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NDQ0NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMjkwNwotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmc8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+RWFjaCBNSU1FIHBhcnQgaW4gYSBkZXNjcmlwdGlvbiBpcyBkZWZpbmVkIHVzaW5nCi0gKiBhbiBlbGVtZW50IHdpdGggYSBsb2NhbCBuYW1lIG9mIHBhcnQgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGUKLSAqIFdTREwgTUlNRSBCaW5kaW5nIGV4dGVuc2lvbi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAyOTA3IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTA3KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMDhjOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQVAyOTA4Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgbWltZTpwYXJ0IGVsZW1lbnQgaW4gYSBERVNDUklQVElPTiBkb2VzIG5vdCBoYXZlIGEgbmFtZSBhdHRyaWJ1dGUuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjkwOCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMjkwOChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIGEgd3NkbDpiaW5kaW5nCi0gICAgICBCaW5kaW5nIHdzZGxCaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAgIC8vIFNpbmNlIFdTREw0SiAxLjQgaWdub3JlcyBhbnkgYXR0cmlidXRlcyBvZiBtaW1lOnBhcnQsIHVzZSBYZXJjZXMgMi42LjIgaW5zdGVhZAotICAgICAgRG9jdW1lbnQgZG9jID0gWE1MVXRpbHMucGFyc2VYTUxEb2N1bWVudCh2YWxpZGF0b3Iud3NkbFVSTCk7Ci0KLSAgICAgIC8vIEZpbmRpbmcgdGhlIHdzZGw6YmluZGluZyBlbGVtZW50IGJlaW5nIHByb2Nlc3NlZAotICAgICAgRWxlbWVudCBiaW5kaW5nID0gZ2V0QmluZGluZ0VsZW1lbnQoCi0gICAgICAgIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSwgd3NkbEJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgIExpc3Qgb3BzID0gZ2V0Q2hpbGRFbGVtZW50cyhiaW5kaW5nLCBXU0RMX09QRVJBVElPTik7Ci0KLSAgICAgIC8vIEEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgYSBiaW5kaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQotICAgICAgLy8gbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnQKLSAgICAgIGJvb2xlYW4gbXVsdGlwYXJ0c0ZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbiA9IChFbGVtZW50KSBvcHMuZ2V0KGkpOwotCi0gICAgICAgIC8vIEdldHRpbmcgd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQgZWxlbWVudHMgb2YgYW4gb3BlcmF0aW9uCi0gICAgICAgIEVsZW1lbnQgYmluZGluZ0lucHV0ID0gZ2V0Q2hpbGRFbGVtZW50KGJpbmRpbmdPcGVyYXRpb24sIFdTRExfSU5QVVQpOwotICAgICAgICBFbGVtZW50IGJpbmRpbmdPdXRwdXQgPSBnZXRDaGlsZEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbiwgV1NETF9PVVRQVVQpOwotCi0gICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMgZnJvbSB3c2RsOmlucHV0IGFuZCB3c2RsOm91dHB1dAotICAgICAgICBMaXN0IGlucHV0TXVsdGlwYXJ0cyA9IGdldE1pbWVNdWx0aXBhcnRFbGVtZW50cyhiaW5kaW5nSW5wdXQpOwotICAgICAgICBMaXN0IG91dHB1dE11bHRpcGFydHMgPSBnZXRNaW1lTXVsdGlwYXJ0RWxlbWVudHMoYmluZGluZ091dHB1dCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGw6aW5wdXQgY29udGFpbnMgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzCi0gICAgICAgIGlmICghaW5wdXRNdWx0aXBhcnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIG11bHRpcGFydHNGb3VuZCA9IHRydWU7Ci0KLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG1pbWU6cGFydCBlbGVtZW50IGNvbnRhaW5pbmcgYSBuYW1lIGF0dHJpYnV0ZSwKLSAgICAgICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmIChjb250YWluc0ludmFsaWRNaW1lUGFydChpbnB1dE11bHRpcGFydHMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgaW52YWxpZCAiCi0gICAgICAgICAgICAgICAgKyAibWltZTpwYXJ0IGVsZW1lbnQgaXMgaW4gdGhlIHdzZGw6aW5wdXQgb2YgdGhlIFwiIgotICAgICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXRBdHRyaWJ1dGUoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSkKLSAgICAgICAgICAgICAgICArICJcIiBiaW5kaW5nIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDpvdXRwdXQgY29udGFpbnMgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzCi0gICAgICAgIGlmICghb3V0cHV0TXVsdGlwYXJ0cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtdWx0aXBhcnRzRm91bmQgPSB0cnVlOwotCi0gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBtaW1lOnBhcnQgZWxlbWVudCBjb250YWluaW5nIGEgbmFtZSBhdHRyaWJ1dGUsCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAoY29udGFpbnNJbnZhbGlkTWltZVBhcnQob3V0cHV0TXVsdGlwYXJ0cykpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBpbnZhbGlkICIKLSAgICAgICAgICAgICAgICArICJtaW1lOnBhcnQgZWxlbWVudCBpcyBpbiB0aGUgd3NkbDpvdXRwdXQgb2YgdGhlIFwiIgotICAgICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXRBdHRyaWJ1dGUoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSkKLSAgICAgICAgICAgICAgICArICJcIiBiaW5kaW5nIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIElmIHRoZSBiaW5kaW5nIGNvbnRhaW5zIG5vIG9uZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudCwKLSAgICAgIC8vIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICghbXVsdGlwYXJ0c0ZvdW5kKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgbWltZTpwYXJ0IGVsZW1lbnRzIGZvciBlYWNoIG9mIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50LgotICAgKiBAcGFyYW0gbXVsdGlwYXJ0cyBhIGxpc3Qgb2YgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIHRydWUsIGlmIGFueSBtaW1lOnBhcnQgY29udGFpbnMgYSBuYW1lIGF0dHJpYnV0ZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSW52YWxpZE1pbWVQYXJ0KExpc3QgbXVsdGlwYXJ0cykgewotICAgIC8vIEdvaW5nIHRocm91Z2ggYSBsaXN0IG9mIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXVsdGlwYXJ0cy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIGEgbGlzdCBvZiBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgIExpc3QgbWltZVBhcnRzID0KLSAgICAgICAgZ2V0Q2hpbGRFbGVtZW50cygoRWxlbWVudCkgbXVsdGlwYXJ0cy5nZXQoaSksIFdTRExfTUlNRV9QQVJUKTsKLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWltZVBhcnRzLnNpemUoKTsgaisrKQotICAgICAgewotICAgICAgICBFbGVtZW50IG1pbWVQYXJ0ID0gKEVsZW1lbnQpIG1pbWVQYXJ0cy5nZXQoaik7Ci0gICAgICAgIC8vIElmIHRoZSBtaW1lOnBhcnQgZWxlbWVudCBjb250YWlucyBhIG5hbWUgYXR0cmlidXRlLAotICAgICAgICAvLyByZXR1cm4gdHJ1ZQotICAgICAgICBpZiAobWltZVBhcnQuZ2V0QXR0cmlidXRlTm9kZShXU0lDb25zdGFudHMuQVRUUl9OQU1FKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gTm8gb25lIGludmFsaWQgbWltZTpwYXJ0IGVsZW1lbnQgaXMgZm91bmQsIHJldHVybiBmYWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzLgotICAgKiBAcGFyYW0gcGFyZW50IGFuIGVsZW1lbnQgd2hpY2ggdGhlIGNoaWxkIGVsZW1lbnRzIGFyZSBnYXRoZXJlZCBmcm9tLgotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cyBmb3VuZC4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBnZXRNaW1lTXVsdGlwYXJ0RWxlbWVudHMoRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICBMaXN0IG1pbWVNdWx0aXBhcnRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBJZiB0aGUgcGFyZW50IGlzIG5vdCBudWxsCi0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IHBhcmVudCdzIGNoaWxkCi0gICAgICBFbGVtZW50IGNoaWxkID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChwYXJlbnQpOwotICAgICAgd2hpbGUgKGNoaWxkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoZSBjaGlsZCBpcyBhIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50Ci0gICAgICAgIGlmIChjaGlsZC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVC5nZXROYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgICAmJiBjaGlsZC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVC5nZXRMb2NhbFBhcnQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBBZGRpbmcgdGhlIGVsZW1lbnQgdG8gdGhlIGxpc3QgYmVpbmcgcmV0dXJuZWQKLSAgICAgICAgICBtaW1lTXVsdGlwYXJ0RWxlbWVudHMuYWRkKGNoaWxkKTsKLQotICAgICAgICAgIC8vIEdldHRpbmcgbWltZTpwYXJ0UyBmcm9tIHRoZSBlbGVtZW50Ci0gICAgICAgICAgTGlzdCBtaW1lUGFydHMgPSBnZXRDaGlsZEVsZW1lbnRzKGNoaWxkLCBXU0RMX01JTUVfUEFSVCk7Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWltZVBhcnRzLnNpemUoKTsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMgb2YgdGhpcyBtaW1lOnBhcnQKLSAgICAgICAgICAgIExpc3QgZWxlbXMgPSBnZXRNaW1lTXVsdGlwYXJ0RWxlbWVudHMoKEVsZW1lbnQpIG1pbWVQYXJ0cy5nZXQoaSkpOwotICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBlbGVtZW50cyB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgICAgbWltZU11bHRpcGFydEVsZW1lbnRzLmFkZEFsbChlbGVtcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEdldHRpbmcgdGhlIG5leHQgY2hpbGQKLSAgICAgICAgY2hpbGQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhjaGlsZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbWVNdWx0aXBhcnRFbGVtZW50czsKLSAgfQotCi0gIC8qKgotICAgKiBMb29rcyBmb3IgYW4gZWxlbWVudCdzIGNoaWxkIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgZWxlbWVudC4KLSAgICogQHBhcmFtIGNoaWxkTmFtZSBhIHF1YWxpZmllZCBlbGVtZW50IG5hbWUgYmVpbmcgZm91bmQuCi0gICAqIEByZXR1cm4gYW4gZWxlbWVudCBvciBudWxsIGlmIGl0IGlzIG5vdCBmb3VuZC4KLSAgICovCi0gIHByaXZhdGUgRWxlbWVudCBnZXRDaGlsZEVsZW1lbnQoRWxlbWVudCBwYXJlbnQsIFFOYW1lIGNoaWxkTmFtZSkKLSAgewotICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IHBhcmVudCdzIGNoaWxkCi0gICAgRWxlbWVudCBjaGlsZCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQocGFyZW50KTsKLSAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBJZiB0aGUgY2hpbGQgaGFzIHRoZSByZXF1aXJlZCBxdWFsaWZpZWQgbmFtZQotICAgICAgaWYgKGNoaWxkLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhjaGlsZE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpCi0gICAgICAgICYmIGNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFscyhjaGlsZE5hbWUuZ2V0TG9jYWxQYXJ0KCkpKQotICAgICAgewotICAgICAgICAvLyByZXR1cm4gdGhlIGNoaWxkCi0gICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgIH0KLSAgICAgIC8vIEdldHRpbmcgdGhlIG5leHQgY2hpbGQKLSAgICAgIGNoaWxkID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBlbGVtZW50J3MgY2hpbGQgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgZWxlbWVudC4KLSAgICogQHBhcmFtIGNoaWxkTmFtZSBhIHF1YWxpZmllZCBlbGVtZW50IG5hbWUgYmVpbmcgZm91bmQuCi0gICAqIEByZXR1cm4gYSBsaXN0IG9mIGVsZW1lbnRzIGZvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IGdldENoaWxkRWxlbWVudHMoRWxlbWVudCBwYXJlbnQsIFFOYW1lIGNoaWxkTmFtZSkKLSAgewotICAgIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IHBhcmVudCdzIGNoaWxkCi0gICAgICBFbGVtZW50IGNoaWxkID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChwYXJlbnQpOwotICAgICAgd2hpbGUgKGNoaWxkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoZSBjaGlsZCBoYXMgdGhlIHJlcXVpcmVkIHF1YWxpZmllZCBuYW1lCi0gICAgICAgIGlmIChjaGlsZC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoY2hpbGROYW1lLmdldE5hbWVzcGFjZVVSSSgpKQotICAgICAgICAgICYmIGNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFscyhjaGlsZE5hbWUuZ2V0TG9jYWxQYXJ0KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQWRkaW5nIHRoZSBjaGlsZCB0byB0aGUgbGlzdAotICAgICAgICAgIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0dGluZyB0aGUgbmV4dCBiaW5kaW5nJ3MgY2hpbGQKLSAgICAgICAgY2hpbGQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhjaGlsZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaGlsZHJlbjsKLSAgfQotCi0gIC8qKgotICAgKiBMb29rcyBmb3Igd3NkbDpiaW5kaW5nIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWZpbml0aW9ucyBhIHdzZGw6ZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHBhcmFtIGJpbmRpbmdOYW1lIGEgbmFtZSBvZiB3c2RsOmJpbmRpbmcgZWxlbWVudC4KLSAgICogQHJldHVybiBhIHdzZGw6YmluZGluZyBlbGVtZW50IG9yIG51bGwgaWYgaXQgaXMgbm90IGZvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBFbGVtZW50IGdldEJpbmRpbmdFbGVtZW50KEVsZW1lbnQgZGVmaW5pdGlvbnMsIFN0cmluZyBiaW5kaW5nTmFtZSkKLSAgewotICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IGRlZmluaXRpb25zJyBjaGlsZAotICAgIEVsZW1lbnQgY2hpbGQgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKGRlZmluaXRpb25zKTsKLSAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBJZiBkZWZpbml0aW9ucycgY2hpbGQgaXMgd3NkbDpiaW5kaW5nIGVsZW1lbnQKLSAgICAgIC8vIGFuZCBpcyB0aGUgc2FtZSB0aGF0IGlzIGJlaW5nIHByb2Nlc3NlZCBieSBXU0RMVmFsaWRhdG9yCi0gICAgICBpZiAoY2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTRExfQklORElORy5nZXROYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgJiYgY2hpbGQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFdTRExfQklORElORy5nZXRMb2NhbFBhcnQoKSkKLSAgICAgICAgJiYgY2hpbGQuZ2V0QXR0cmlidXRlKFdTSUNvbnN0YW50cy5BVFRSX05BTUUpLmVxdWFscyhiaW5kaW5nTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIC8vIHJldHVybiB0aGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQKLSAgICAgICAgcmV0dXJuIGNoaWxkOwotICAgICAgfQotICAgICAgLy8gR2V0dGluZyB0aGUgbmV4dCBkZWZpbml0aW9ucycgY2hpbGQKLSAgICAgIGNoaWxkID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotICAgIH0KLSAgICAvLyByZXR1cm4gbnVsbCwgaXMgdGhlcmUgaXMgbm8gc3VjaCB3c2RsOmJpbmRpbmcKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTA5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkwOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjY4MWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTA5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLS8qKgotICogQVAyOTA5Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5NdWx0aXBsZSBtaW1lOmNvbnRlbnQgY2hpbGQgZWxlbWVudHMgb2YgYSBtaW1lOnBhcnQgZWxlbWVudAotICogaW4gYSBkZXNjaXB0aW9uIHJlZmVyZW5jZSB0aGUgc2FtZSB3c2RsOnBhcnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjkwOSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLy8gQSB2YXJpYWJsZSB0aGF0IGluZGljYXRlcyBhIGJpbmRpbmcgY29udGFpbnMKLSAgLy8gbXVsdGlwbGUgbWltZTpjb250ZW50IGVsZW1lbnRzCi0gIHByaXZhdGUgYm9vbGVhbiBtdWx0aXBsZUNvbnRlbnRGb3VuZDsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTA5KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFJlc2V0dGluZyB0aGUgdmFyaWFibGUKLSAgICBtdWx0aXBsZUNvbnRlbnRGb3VuZCA9IGZhbHNlOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0dGluZyBhIHdzZGw6YmluZGluZwotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgaXRzIHdzZGw6b3BlcmF0aW9uIGVsZW1lbnRzCi0gICAgICBMaXN0IG9wcyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLQotICAgICAgLy8gR29pbmcgdGhyb3VnaCB0aGUgb3BlcmF0aW9uIGVsZW1lbnRzCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIG9wcy5nZXQoaSk7Ci0KLSAgICAgICAgLy8gR2V0dGluZyB3c2RsOmlucHV0IGFuZCB3c2RsOm91dHB1dCBlbGVtZW50cyBvZiBhbiBvcGVyYXRpb24KLSAgICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpOwotCi0gICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMgZnJvbSB3c2RsOmlucHV0IGFuZCB3c2RsOm91dHB1dAotICAgICAgICBMaXN0IGlucHV0TWltZVBhcnRzID0gZ2V0TWltZVBhcnRzKAotICAgICAgICAgIGJpbmRpbmdJbnB1dCA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgIExpc3Qgb3V0cHV0TWltZVBhcnRzID0gZ2V0TWltZVBhcnRzKAotICAgICAgICAgIGJpbmRpbmdPdXRwdXQgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nT3V0cHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG1pbWU6cGFydCBjb250YWluaW5nIG11bHRpcGxlIG1pbWU6Y29udGVudFMKLSAgICAgICAgLy8gd2hpY2ggcmVmZXJlbmNlIGRpZmZlcmVudCB3c2RsOnBhcnRTLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICBpZiAoY29udGFpbnNJbnZhbGlkTWltZVBhcnQoaW5wdXRNaW1lUGFydHMpKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBpbnZhbGlkIG1pbWU6cGFydCBlbGVtZW50ICIKLSAgICAgICAgICAgICsgImlzIGluIHRoZSB3c2RsOmlucHV0IG9mIHRoZSBcIiIgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKQotICAgICAgICAgICAgKyAiXCIgYmluZGluZyBvcGVyYXRpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG1pbWU6cGFydCBjb250YWluaW5nIG11bHRpcGxlIG1pbWU6Y29udGVudFMKLSAgICAgICAgLy8gd2hpY2ggcmVmZXJlbmNlIGRpZmZlcmVudCB3c2RsOnBhcnRTLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICBpZiAoY29udGFpbnNJbnZhbGlkTWltZVBhcnQob3V0cHV0TWltZVBhcnRzKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgaW52YWxpZCBtaW1lOnBhcnQgZWxlbWVudCAiCi0gICAgICAgICAgICArICJpcyBpbiB0aGUgd3NkbDpvdXRwdXQgb2YgdGhlIFwiIiArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpCi0gICAgICAgICAgICArICJcIiBiaW5kaW5nIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICAvLyBJZiB0aGUgYmluZGluZyBkb2VzIG5vdCBjb250YWluIGEgbWltZTpwYXJ0IHdpdGggbXVsdGlwbGUKLSAgICAgIC8vIG1pbWU6Y29udGVudCBlbGVtZW50cywgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFtdWx0aXBsZUNvbnRlbnRGb3VuZCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyBtaW1lOnBhcnQgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBtaW1lUGFydHMgYSBsaXN0IG9mIG1pbWU6cGFydCBlbGVtZW50cy4KLSAgICogQHJldHVybiB0cnVlIGlmIG11bHRpcGxlIG1pbWU6Y29udGVudFMgb2YgYSBtaW1lOnBhcnQKLSAgICogcmVmZXJlbmNlIGRpZmZlcmVudCB3c2RsOnBhcnRTLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNJbnZhbGlkTWltZVBhcnQoTGlzdCBtaW1lUGFydHMpCi0gIHsKLSAgICAvLyBHb2luZyB0aHJvdWdoIGEgbGlzdCBvZiBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pbWVQYXJ0cy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICAvLyBBIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHRoZSBtaW1lOnBhcnQgY29udGFpbnMKLSAgICAgIC8vIGF0IGxlYXN0IG9uZSBtaW1lOmNvbnRlbnQgZWxlbWVudAotICAgICAgYm9vbGVhbiBtaW1lQ29udGVudEZvdW5kID0gZmFsc2U7Ci0gICAgICBTdHJpbmcgbWltZUNvbnRlbnRQYXJ0ID0gbnVsbDsKLQotICAgICAgLy8gR29pbmcgdGhyb3VnaCBtaW1lOnBhcnQgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgTGlzdCBleHRFbGVtcyA9ICgoTUlNRVBhcnQpIG1pbWVQYXJ0cy5nZXQoaSkpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHRFbGVtcy5zaXplKCk7IGorKykKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgYW4gZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGlzIG1pbWU6Y29udGVudAotICAgICAgICBpZiAoKChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtcy5nZXQoaikpCi0gICAgICAgICAgLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfTUlNRV9DT05URU5UKSkKLSAgICAgICAgewotICAgICAgICAgIE1JTUVDb250ZW50IG1pbWVDb250ZW50ICA9IChNSU1FQ29udGVudCkgZXh0RWxlbXMuZ2V0KGopOwotICAgICAgICAgIC8vIElmIGEgbWltZTpjb250ZW50IGVsZW1lbnQgd2FzIGFscmVhZHkgZm91bmQgaW4gdGhpcyBtaW1lOnBhcnQKLSAgICAgICAgICBpZiAobWltZUNvbnRlbnRGb3VuZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtdWx0aXBsZUNvbnRlbnRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAvLyBJZiBhIG1pbWU6Y29udGVudCByZWZlcmVuY2VzIG90aGVyIHdzZGw6cGFydCB0aGFuIHRoZQotICAgICAgICAgICAgLy8gcHJldmlvdXMgbWltZTpjb250ZW50IGRvLCByZXR1cm4gdHJ1ZQotICAgICAgICAgICAgaWYgKG1pbWVDb250ZW50LmdldFBhcnQoKSA9PSBudWxsCi0gICAgICAgICAgICAgIHx8ICFtaW1lQ29udGVudC5nZXRQYXJ0KCkuZXF1YWxzKG1pbWVDb250ZW50UGFydCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBtaW1lOmNvbnRlbnQgZWxlbWVudCBvZiBtaW1lOnBhcnQKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgbWltZUNvbnRlbnRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICBtaW1lQ29udGVudFBhcnQgPSBtaW1lQ29udGVudC5nZXRQYXJ0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFRoZXJlIGFyZSBubyBpbnZhbGlkIG1pbWU6cGFydCBlbGVtZW50cywgcmV0dXJuIGZhbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbGxlY3RzIGFsbCBtaW1lOnBhcnQgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBleHRFbGVtcyBhIGxpc3Qgb2YgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyB0aGF0IGNhbiBjb250YWluIG1pbWU6cGFydCBlbGVtZW50cy4KLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBtaW1lOnBhcnQgZWxlbWVudHMgZm91bmQuCi0gICAqLwotICBwcml2YXRlIExpc3QgZ2V0TWltZVBhcnRzKExpc3QgZXh0RWxlbXMpCi0gIHsKLSAgICBMaXN0IG1pbWVQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGlmIChleHRFbGVtcyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dEVsZW1zLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtcy5nZXQoaSk7Ci0gICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgICBpZiAoZXh0RWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX01JTUVfTVVMVElQQVJUKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldHRpbmcgdGhlIG1pbWU6cGFydCBlbGVtZW50cyBvZiB0aGUgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgICAgTGlzdCBtUGFydHMgPSAoKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBleHRFbGVtKS5nZXRNSU1FUGFydHMoKTsKLSAgICAgICAgICBtaW1lUGFydHMuYWRkQWxsKG1QYXJ0cyk7Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbVBhcnRzLnNpemUoKTsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgZWxlbXMgPSBnZXRNaW1lUGFydHMoCi0gICAgICAgICAgICAgICAgKChNSU1FUGFydCkgbVBhcnRzLmdldChqKSkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgICAvLyBBZGRpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZSBsaXN0IGJlaW5nIHJldHVybmVkCi0gICAgICAgICAgICAgIG1pbWVQYXJ0cy5hZGRBbGwoZWxlbXMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWltZVBhcnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MTAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmQzMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLS8qKgotICogQVAyOTEwCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BIG1pbWU6Y29udGVudCBpbiBhIERFU0NSSVBUSU9OIHJlZmVyZW5jZXMKLSAqIGEgd3NkbDpwYXJ0IHRoYXQgaXMgZGVmaW5lZCB1c2luZyBlaXRoZXIgdGhlIHR5cGUgYXR0cmlidXRlCi0gKiBvciB0aGUgZWxlbWVudCBhdHRyaWJ1dGUuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjkxMCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMjkxMChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBBIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIGEgYmluZGluZyBjb250YWlucyBhdCBsZWFzdCBvbmUKLSAgICAgIC8vIG1pbWU6Y29udGVudCBlbGVtZW50Ci0gICAgICBib29sZWFuIG1pbWVDb250ZW50c0ZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgICAvLyBHZXR0aW5nIGl0cyB3c2RsOm9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgTGlzdCBvcHMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcHMuZ2V0KGkpOwotCi0gICAgICAgIC8vIEdldHRpbmcgd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQgZWxlbWVudHMgb2YgYW4gb3BlcmF0aW9uCi0gICAgICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLQotICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzIGZyb20gd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQKLSAgICAgICAgTGlzdCBpbnB1dE1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50RWxlbWVudHMoCi0gICAgICAgICAgYmluZGluZ0lucHV0ID09IG51bGwgPyBudWxsIDogYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICAgICAgTGlzdCBvdXRwdXRNaW1lQ29udGVudHMgPSBnZXRNaW1lQ29udGVudEVsZW1lbnRzKAotICAgICAgICAgIGJpbmRpbmdPdXRwdXQgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nT3V0cHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDppbnB1dCBjb250YWlucyBtaW1lOmNvbnRlbnQgZWxlbWVudHMKLSAgICAgICAgaWYgKCFpbnB1dE1pbWVDb250ZW50cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW1lQ29udGVudHNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgSW5wdXQgcG9ydFR5cGVJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyB0aGUgY29ycmVzcG9uZGluZyB3c2RsOmlucHV0IGluIHdzZGw6cG9ydFR5cGUKLSAgICAgICAgICAvLyBvciB0aGUgd3NkbDppbnB1dCBkb2VzIG5vdCBzcGVjaWZ5IGEgbWVzc2FnZSBhdHRyaWJ1dGUsCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAocG9ydFR5cGVJbnB1dCA9PSBudWxsIHx8IHBvcnRUeXBlSW5wdXQuZ2V0TWVzc2FnZSgpID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgIlRoZSBjb3JyZXNwb25naW5nIG9wZXJhdGlvbiBpbiB0aGUgd3NkbDpwb3J0VHlwZSBmb3IgdGhlIFwiIgotICAgICAgICAgICAgICArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpICsgIlwiIGJpbmRpbmcgb3BlcmF0aW9uIGlzIGludmFsaWQuIik7Ci0gICAgICAgICAgLy8gR2V0dGluZyBhIG1pbWU6Y29udGVudCByZWZlcmVuY2luZyBhbiBpbnZhbGlkIHdzZGw6cGFydCAKLSAgICAgICAgICBTdHJpbmcgcGFydCA9IGdldEludmFsaWRNaW1lQ29udGVudFBhcnQoCi0gICAgICAgICAgICBpbnB1dE1pbWVDb250ZW50cywgcG9ydFR5cGVJbnB1dC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgIC8vIElmIHN1Y2ggcGFydCBpcyBmb3VuZCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAocGFydCAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oInBhcnQ9XCIiICsgcGFydCArCi0gICAgICAgICAgICAgICJcIiwgdGhlIGlucHV0IG9mIHRoZSBiaW5kaW5nIG9wZXJhdGlvbiBcIiIKLSAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArICJcIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGw6b3V0cHV0IGNvbnRhaW5zIG1pbWU6Y29udGVudCBlbGVtZW50cwotICAgICAgICBpZiAoIW91dHB1dE1pbWVDb250ZW50cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW1lQ29udGVudHNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgT3V0cHV0IHBvcnRUeXBlT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyB0aGUgY29ycmVzcG9uZGluZyB3c2RsOm91dHB1dCBpbiB3c2RsOnBvcnRUeXBlCi0gICAgICAgICAgLy8gb3IgdGhlIHdzZGw6b3V0cHV0IGRvZXMgbm90IHNwZWNpZnkgYSBtZXNzYWdlIGF0dHJpYnV0ZSwKLSAgICAgICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmIChwb3J0VHlwZU91dHB1dCA9PSBudWxsIHx8IHBvcnRUeXBlT3V0cHV0LmdldE1lc3NhZ2UoKSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJUaGUgY29ycmVzcG9uZ2luZyBvcGVyYXRpb24gaW4gdGhlIHdzZGw6cG9ydFR5cGUgZm9yIHRoZSBcIiIKLSAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArICJcIiBiaW5kaW5nIG9wZXJhdGlvbiBpcyBpbnZhbGlkLiIpOwotICAgICAgICAgIC8vIEdldHRpbmcgYSBtaW1lOmNvbnRlbnQgcmVmZXJlbmNpbmcgYW4gaW52YWxpZCB3c2RsOnBhcnQKLSAgICAgICAgICBTdHJpbmcgcGFydCA9IGdldEludmFsaWRNaW1lQ29udGVudFBhcnQoCi0gICAgICAgICAgICAgIG91dHB1dE1pbWVDb250ZW50cywgcG9ydFR5cGVPdXRwdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAvLyBJZiBzdWNoIHBhcnQgaXMgZm91bmQsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJwYXJ0PVwiIiArIHBhcnQgKwotICAgICAgICAgICAgICAgICJcIiwgdGhlIG91dHB1dCBvZiB0aGUgYmluZGluZyBvcGVyYXRpb24gXCIiCi0gICAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArICJcIiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHRoZSBiaW5kaW5nIGRvZXMgbm90IGNvbnRhaW4gbWltZTpjb250ZW50IGVsZW1lbnRzLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFtaW1lQ29udGVudHNGb3VuZCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyBldmVyeSBtaW1lOmNvbnRlbnQgZWxlbWVudC4gSWYgaXQgcmVmZXJlbmNlcyBhIHdzZGw6cGFydCB0aGF0Ci0gICAqIGlzIGRlZmluZWQgdXNpbmcgbmVpdGhlciB0aGUgdHlwZSBhdHRyaWJ1dGUgbm9yIHRoZSBlbGVtZW50IGF0dHJpYnV0ZQotICAgKiBvciB1c2luZyB0aGVtIHRvZ2V0aGVyLCBpdCBpcyBpbnZhbGlkLgotICAgKiBAcGFyYW0gbWltZUNvbnRlbnRzIGEgbGlzdCBvZiBtaW1lOmNvbnRlbnQgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6bWVzc2FnZSBlbGVtZW50IGZvciBtaW1lOmNvbnRlbnRTLgotICAgKiBAcmV0dXJuIGEgdmFsdWUgb2YgdGhlIHBhcnQgYXR0cmlidXRlIG9mIGFuIGludmFsaWQgbWltZTpjb250ZW50Ci0gICAqIG9yIG51bGwgaWYgYWxsIHRoZSBtaW1lOmNvbnRlbnQgZWxlbWVudHMgYXJlIHZhbGlkLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW52YWxpZE1pbWVDb250ZW50UGFydChMaXN0IG1pbWVDb250ZW50cywgTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgLy8gR29pbmcgdGhyb3VnIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW1lQ29udGVudHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgLy8gR2V0dGluZyBhIHZhbHVlIG9mIHRoZSBwYXJ0IGF0dHJpYnV0ZSBmcm9tIGEgbWltZTplbGVtZW50Ci0gICAgICBTdHJpbmcgcGFydE5hbWUgPSAoKE1JTUVDb250ZW50KSBtaW1lQ29udGVudHMuZ2V0KGkpKS5nZXRQYXJ0KCk7Ci0gICAgICAvLyBHZXR0aW5nIHRoZSBjb3JyZXNwb25naW5nIHdzZGw6cGFydAotICAgICAgUGFydCBwYXJ0ID0gbWVzc2FnZS5nZXRQYXJ0KHBhcnROYW1lKTsKLSAgICAgIC8vIGlmIGl0IGlzIGRlZmluZWQgYW5kIHVzZSBuZWl0aGVyIHRoZSB0eXBlIGF0dHJpYnV0ZQotICAgICAgLy8gbm9yIHRoZSBlbGVtZW50IGF0dHJpYnV0ZSBvciB1c2UgdGhlbSB0b2dldGhlciwgcmV0dXJuIHBhcnQgdmFsdWUKLSAgICAgIGlmIChwYXJ0ICE9IG51bGwKLSAgICAgICAgJiYgKChwYXJ0LmdldFR5cGVOYW1lKCkgPT0gbnVsbCAmJiBwYXJ0LmdldEVsZW1lbnROYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgfHwgKHBhcnQuZ2V0VHlwZU5hbWUoKSAhPSBudWxsICYmIHBhcnQuZ2V0RWxlbWVudE5hbWUoKSAhPSBudWxsKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBwYXJ0TmFtZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUmV0dXJuIG51bGwgaWYgbm8gb25lIHBhcnQgaXMgZm91bmQKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgbWltZTpjb250ZW50IGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZXh0RWxlbXMgYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgdGhhdCBjYW4gY29udGFpbiBtaW1lOmNvbnRlbnRTLgotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIG1pbWU6Y29udGVudCBlbGVtZW50cyBmb3VuZC4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBnZXRNaW1lQ29udGVudEVsZW1lbnRzKExpc3QgZXh0RWxlbXMpCi0gIHsKLSAgICBMaXN0IG1pbWVDb250ZW50RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAoZXh0RWxlbXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRFbGVtcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbXMuZ2V0KGkpOwotICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMgb2YgdGhlIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgICAgIExpc3QgbWltZVBhcnRzID0gKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbSkuZ2V0TUlNRVBhcnRzKCk7Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWltZVBhcnRzLnNpemUoKTsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtaW1lOmNvbnRlbnQgZWxlbWVudHMgb2YgdGhpcyBtaW1lOnBhcnQKLSAgICAgICAgICAgIExpc3QgZWxlbXMgPSBnZXRNaW1lQ29udGVudEVsZW1lbnRzKAotICAgICAgICAgICAgICAoKE1JTUVQYXJ0KSBtaW1lUGFydHMuZ2V0KGopKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgICAgICAvLyBBZGRpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZSBsaXN0IGJlaW5nIHJldHVybmVkCi0gICAgICAgICAgICBtaW1lQ29udGVudEVsZW1lbnRzLmFkZEFsbChlbGVtcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEVsc2UgaWYgdGhlIGVsZW1lbnQgaXMgbWltZTpjb250ZW50Ci0gICAgICAgIGVsc2UgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX0NPTlRFTlQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQWRkaW5nIHRoZSBlbGVtZW50IHRvIHRoZSBsaXN0IGJlaW5nIHJldHVybmVkCi0gICAgICAgICAgbWltZUNvbnRlbnRFbGVtZW50cy5hZGQoZXh0RWxlbSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbWltZUNvbnRlbnRFbGVtZW50czsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTExLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDMzODNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLS8qKgotICogQVAyOTExCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzIGluIHdzZGw6aW5wdXQgYW5kIHdzZGw6b3VwdXQgZWxlbWVudHMKLSAqIG9mIG9wZXJhdGlvbnMgaW4gYSB3c2RsOmJpbmRpbmcsIGNvbnRhaW4gZXhhY3RseSBvbmUgbWltZTpwYXJ0IGNoaWxkIGVsZW1lbnQgdGhhdCBjb250YWlucwotICogYSBzb2FwYmluZDpib2R5IGNoaWxkIGVsZW1lbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjkxMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMjkxMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBBIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIGEgYmluZGluZyBjb250YWlucyBhdCBsZWFzdCBvbmUKLSAgICAgIC8vIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50Ci0gICAgICBib29sZWFuIG11bHRpcGFydHNGb3VuZCA9IGZhbHNlOwotCi0gICAgICAvLyBHZXR0aW5nIGEgd3NkbDpiaW5kaW5nCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgICAgLy8gR2V0dGluZyBpdHMgd3NkbDpvcGVyYXRpb24gZWxlbWVudHMKLSAgICAgIExpc3Qgb3BzID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotCi0gICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBvcGVyYXRpb24gZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgb3BzLmdldChpKTsKLQotICAgICAgICAvLyBHZXR0aW5nIHdzZGw6aW5wdXQgYW5kIHdzZGw6b3V0cHV0IGVsZW1lbnRzIG9mIGFuIG9wZXJhdGlvbgotICAgICAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cyBmcm9tIHdzZGw6aW5wdXQgYW5kIHdzZGw6b3V0cHV0Ci0gICAgICAgIExpc3QgaW5wdXRNdWx0aXBhcnRzID0gZ2V0TWltZU11bHRpcGFydEVsZW1lbnRzKAotICAgICAgICAgIGJpbmRpbmdJbnB1dCA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgIExpc3Qgb3V0cHV0TXVsdGlwYXJ0cyA9IGdldE1pbWVNdWx0aXBhcnRFbGVtZW50cygKLSAgICAgICAgICBiaW5kaW5nT3V0cHV0ID09IG51bGwgPyBudWxsIDogYmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGw6aW5wdXQgY29udGFpbnMgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzCi0gICAgICAgIGlmICghaW5wdXRNdWx0aXBhcnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIG11bHRpcGFydHNGb3VuZCA9IHRydWU7Ci0KLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBub3QgZXhhY3RseSBvbmUgbWltZTpwYXJ0IGVsZW1lbnQgY29udGFpbmluZwotICAgICAgICAgIC8vIGEgc29hcGJpbmQ6Ym9keSBjaGlsZCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAoIWNvbnRhaW5zT25lU29hcEJvZHkoaW5wdXRNdWx0aXBhcnRzKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGludmFsaWQgIgotICAgICAgICAgICAgICAgICsgIm1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50IGlzIGluIHRoZSB3c2RsOmlucHV0IG9mIHRoZSBcIiIKLSAgICAgICAgICAgICAgICArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpICsgIlwiIGJpbmRpbmcgb3BlcmF0aW9uLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSB3c2RsOm91dHB1dCBjb250YWlucyBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMKLSAgICAgICAgaWYgKCFvdXRwdXRNdWx0aXBhcnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIG11bHRpcGFydHNGb3VuZCA9IHRydWU7Ci0KLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBub3QgZXhhY3RseSBvbmUgbWltZTpwYXJ0IGVsZW1lbnQgY29udGFpbmluZwotICAgICAgICAgIC8vIGEgc29hcGJpbmQ6Ym9keSBjaGlsZCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAoIWNvbnRhaW5zT25lU29hcEJvZHkob3V0cHV0TXVsdGlwYXJ0cykpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBpbnZhbGlkICIKLSAgICAgICAgICAgICAgICArICJtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudCBpcyBpbiB0aGUgd3NkbDpvdXRwdXQgb2YgdGhlIFwiIgotICAgICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIgYmluZGluZyBvcGVyYXRpb24uIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIC8vIElmIHRoZSBiaW5kaW5nIGNvbnRhaW5zIG5vIG9uZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudCwKLSAgICAgIC8vIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICghbXVsdGlwYXJ0c0ZvdW5kKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogTG9va3MgZm9yIG1pbWU6cGFydCBlbGVtZW50cyBjb250YWluaW5nIGEgc29hcDpib2R5IGNoaWxkCi0gICAqIGZvciBlYWNoIG9mIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50LgotICAgKiBAcGFyYW0gbXVsdGlwYXJ0cyBhIGxpc3Qgb2YgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgZXhhY3RseSBvbmUgbWltZTpwYXJ0IGNvbnRhaW5pbmcgYSBzb2FwOmJvZHkKLSAgICogY2hpbGQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjb250YWluc09uZVNvYXBCb2R5KExpc3QgbXVsdGlwYXJ0cykKLSAgewotICAgIC8vIEEgdmFyaWFibGUgaW5kaWNhdGVzIHRoYXQgYSBzb2FwOmJvZHkgZWxlbWVudCBpcyBmb3VuZAotICAgIGJvb2xlYW4gc29hcEJvZHlGb3VuZCA9IGZhbHNlOwotCi0gICAgLy8gR29pbmcgdGhyb3VnaCBhIGxpc3Qgb2YgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdWx0aXBhcnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgYSBsaXN0IG9mIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgTGlzdCBtaW1lUGFydHMgPQotICAgICAgICAoKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBtdWx0aXBhcnRzLmdldChpKSkuZ2V0TUlNRVBhcnRzKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWltZVBhcnRzLnNpemUoKTsgaisrKQotICAgICAgewotICAgICAgICAvLyBHZXR0aW5nIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIG9mIGEgbWltZTpwYXJ0Ci0gICAgICAgIExpc3QgZXh0RWxlbXMgPQotICAgICAgICAgICgoTUlNRVBhcnQpIG1pbWVQYXJ0cy5nZXQoaikpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZXh0RWxlbXMuc2l6ZSgpOyBrKyspCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJZiBhbiBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaXMgYSBzb2FwOmJvZHkKLSAgICAgICAgICBpZiAoKChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtcy5nZXQoaykpCi0gICAgICAgICAgICAuZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9TT0FQX0JPRFkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIGEgc29hcDpib2R5IGVsZW1lbnQgd2FzIGFscmVhZHkgZm91bmQsCi0gICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZQotICAgICAgICAgICAgaWYgKHNvYXBCb2R5Rm91bmQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGVsc2Ugc2V0IHRoZSB2YXJpYWJsZSB0byB0aGUgdHJ1ZSB2YWx1ZQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzb2FwQm9keUZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc29hcEJvZHlGb3VuZDsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZXh0RWxlbXMgYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgdGhhdCBjYW4gY29udGFpbiBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzIGZvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IGdldE1pbWVNdWx0aXBhcnRFbGVtZW50cyhMaXN0IGV4dEVsZW1zKQotICB7Ci0gICAgTGlzdCBtaW1lTXVsdGlwYXJ0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAoZXh0RWxlbXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRFbGVtcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbXMuZ2V0KGkpOwotICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBBZGRpbmcgdGhlIGVsZW1lbnQgdG8gdGhlIGxpc3QgYmVpbmcgcmV0dXJuZWQKLSAgICAgICAgICBtaW1lTXVsdGlwYXJ0RWxlbWVudHMuYWRkKGV4dEVsZW0pOwotICAgICAgICAgIC8vIEdldHRpbmcgdGhlIG1pbWU6cGFydCBlbGVtZW50cyBvZiB0aGUgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgICAgTGlzdCBtaW1lUGFydHMgPSAoKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBleHRFbGVtKS5nZXRNSU1FUGFydHMoKTsKLSAgICAgICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgbWltZTpwYXJ0IGVsZW1lbnRzCi0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtaW1lUGFydHMuc2l6ZSgpOyBqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cyBvZiB0aGlzIG1pbWU6cGFydAotICAgICAgICAgICAgTGlzdCBlbGVtcyA9IGdldE1pbWVNdWx0aXBhcnRFbGVtZW50cygKLSAgICAgICAgICAgICAgKChNSU1FUGFydCkgbWltZVBhcnRzLmdldChqKSkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBlbGVtZW50cyB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgICAgbWltZU11bHRpcGFydEVsZW1lbnRzLmFkZEFsbChlbGVtcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbWVNdWx0aXBhcnRFbGVtZW50czsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTMwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTczNGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMjkzMAotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmc8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+QSB3c2RsOmZhdWx0IGVsZW1lbnQgaW4gYSBkZXNjcmlwdGlvbiBkb2VzIG5vdCBoYXZlCi0gKiBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudCBhcyBpdHMgY2hpbGQgZWxlbWVudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAyOTMwIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTMwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgYSBiaW5kaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQotICAgICAgLy8gd3NkbDpmYXVsdCBlbGVtZW50Ci0gICAgICBib29sZWFuIGZhdWx0c0ZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgICAvLyBHZXR0aW5nIGl0cyB3c2RsOm9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgTGlzdCBvcHMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcHMuZ2V0KGkpOwotCi0gICAgICAgIC8vIEdldHRpbmcgd3NkbDpmYXVsdCBlbGVtZW50cwotICAgICAgICBDb2xsZWN0aW9uIGZhdWx0cyA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0ZhdWx0cygpLnZhbHVlcygpOwotICAgICAgICBpZiAoIWZhdWx0cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBmYXVsdHNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50LAotICAgICAgICAgIC8vIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKGNvbnRhaW5zTWltZU11bHRpcGFydHMoZmF1bHRzKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgYmluZGluZyBvcGVyYXRpb24gaXMgXCIiCi0gICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlIGJpbmRpbmcgZG9lcyBub3QgY29udGFpbiB3c2RsOmZhdWx0IGVsZW1lbnRzLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFmYXVsdHNGb3VuZCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB3c2RsOmZhdWx0IGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZmF1bHRzIGEgY29sbGVjdGlvbiBvZiB3c2RsOmZhdWx0IGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IHdzZGw6ZmF1bHQgaGFzIGEgbWltZTptdWx0aXBhcnRSZWxhdGVkIGNoaWxkCi0gICAqIGVsZW1lbnQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjb250YWluc01pbWVNdWx0aXBhcnRzKENvbGxlY3Rpb24gZmF1bHRzKQotICB7Ci0gICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIHdzZGw6ZmF1bHRTCi0gICAgSXRlcmF0b3IgaSA9IGZhdWx0cy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIHdzZGw6ZmF1bHQncyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICBMaXN0IGV4dEVsZW1zID0gKChCaW5kaW5nRmF1bHQpIGkubmV4dCgpKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXh0RWxlbXMuc2l6ZSgpOyBqKyspCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnQsIHJldHVybiB0cnVlCi0gICAgICAgIGlmICgoKEV4dGVuc2liaWxpdHlFbGVtZW50KWV4dEVsZW1zLmdldChqKSkKLSAgICAgICAgICAuZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBUaGVyZSBhcmUgbm8gbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzLCByZXR1cm4gZmFsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjk0MC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5NDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5MmExZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjk0MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmltcGwuZHYuWFNTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU1BhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTVGVybTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU1R5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQVAyOTQwCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5JbiBhIGRlc2NyaXB0aW9uLCBhIHdzZGw6cGFydCBkZWZpbmVkIHdpdGggdGhlCi0gKiByZWY6c3dhUmVmIHNjaGVtYSB0eXBlIGlzIGJvdW5kIHRvIGEgc29hcGJpbmQ6Ym9keSwgb3IgYSBzb2FwYmluZDpoZWFkZXIKLSAqIGluIGEgTUlNRSBiaW5kaW5nLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDI5NDAgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBUDI5NDAoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gQSB2YXJpYWJsZSB0aGF0IGluZGljYXRlcyB3c2RsOnBvcnRUeXBlIHJlZmVyZW5jZXMgYXQgbGVhc3Qgb25lCi0gICAgICAvLyB3c2RsOnBhcnQgZGVmaW5lZCB3aXRoIHRoZSByZWY6c3dhUmVmIHNjaGVtYSB0eXBlCi0gICAgICBib29sZWFuIHN3YVJlZkZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgICAvLyBHZXR0aW5nIGl0cyB3c2RsOm9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgTGlzdCBvcHMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcHMuZ2V0KGkpOwotCi0gICAgICAgIC8vIEdldHRpbmcgd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQgZWxlbWVudHMgb2YgYW4gb3BlcmF0aW9uCi0gICAgICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLQotICAgICAgICBJbnB1dCBwb3J0VHlwZUlucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpOwotICAgICAgICBPdXRwdXQgcG9ydFR5cGVPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpOwotICAgICAgICAvLyBJZiB0aGUgY29ycmVzcG9uZGluZyB3c2RsOmlucHV0IGV4aXN0cyBpbiB3c2RsOnBvcnRUeXBlCi0gICAgICAgIC8vIGFuZCBpbmNsdWRlcyB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUKLSAgICAgICAgaWYgKHBvcnRUeXBlSW5wdXQgIT0gbnVsbCAmJiBwb3J0VHlwZUlucHV0LmdldE1lc3NhZ2UoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG1lc3NhZ2UncyBwYXJ0cyBkZWZpbmVkIHdpdGggcmVmOnN3YVJlZgotICAgICAgICAgIExpc3Qgc3dhUmVmUGFydHMgPSBnZXRTd2FSZWZQYXJ0cyhwb3J0VHlwZUlucHV0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgaWYgKCFzd2FSZWZQYXJ0cy5pc0VtcHR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3dhUmVmRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgLy8gR2V0dGluZyBhIHdzZGw6cGFydCB0aGF0IGlzIHVuYm91bmQKLSAgICAgICAgICAgIFN0cmluZyB1bmJvdW5kUGFydCA9IGdldFVuYm91bmRQYXJ0KHN3YVJlZlBhcnRzLAotICAgICAgICAgICAgICBwb3J0VHlwZUlucHV0LmdldE1lc3NhZ2UoKS5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICBiaW5kaW5nSW5wdXQgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nSW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgLy8gSWYgc3VjaCB3c2RsOnBhcnQgZXhpc3RzLCBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgICBpZiAodW5ib3VuZFBhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBwYXJ0IFwiIiArIHVuYm91bmRQYXJ0Ci0gICAgICAgICAgICAgICAgKyAiXCIgaXMgbm90IGJvdW5kIHByb3Blcmx5IHRvIHRoZSB3c2RsOmlucHV0IG9mIHRoZSBcIiIKLSAgICAgICAgICAgICAgICArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpICsgIlwiIGJpbmRpbmcgb3BlcmF0aW9uLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6b3V0cHV0IGV4aXN0cyBpbiB3c2RsOnBvcnRUeXBlCi0gICAgICAgIC8vIGFuZCBpbmNsdWRlcyB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUKLSAgICAgICAgaWYgKHBvcnRUeXBlT3V0cHV0ICE9IG51bGwgJiYgcG9ydFR5cGVPdXRwdXQuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWVzc2FnZSdzIHBhcnRzIGRlZmluZWQgd2l0aCByZWY6c3dhUmVmCi0gICAgICAgICAgTGlzdCBzd2FSZWZQYXJ0cyA9IGdldFN3YVJlZlBhcnRzKHBvcnRUeXBlT3V0cHV0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgaWYgKCFzd2FSZWZQYXJ0cy5pc0VtcHR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3dhUmVmRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgLy8gR2V0dGluZyBhIHdzZGw6cGFydCB0aGF0IGlzIHVuYm91bmQKLSAgICAgICAgICAgIFN0cmluZyB1bmJvdW5kUGFydCA9IGdldFVuYm91bmRQYXJ0KHN3YVJlZlBhcnRzLAotICAgICAgICAgICAgICBwb3J0VHlwZU91dHB1dC5nZXRNZXNzYWdlKCkuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgYmluZGluZ091dHB1dCA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmdPdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgLy8gSWYgc3VjaCB3c2RsOnBhcnQgZXhpc3RzLCBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgICBpZiAodW5ib3VuZFBhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBwYXJ0IFwiIiArIHVuYm91bmRQYXJ0Ci0gICAgICAgICAgICAgICAgKyAiXCIgaXMgbm90IGJvdW5kIHByb3Blcmx5IHRvIHRoZSB3c2RsOmlucHV0IG9mIHRoZSBcIiIKLSAgICAgICAgICAgICAgICArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpICsgIlwiIGJpbmRpbmcgb3BlcmF0aW9uLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyB3c2RsOnBhcnRTIGRlZmluZWQgd2l0aCB0aGUgcmVmOnN3YVJlZgotICAgICAgLy8gc2NoZW1hIHR5cGUsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICghc3dhUmVmRm91bmQpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIC8vIFRoZSBhc3NlcnRpb24gaXMgInJlY29tbWVuZGVkIiwgdXNpbmcgdGhlICJ3YXJuaW5nIiByZXN1bHQKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBMb29rcyBmb3IgYSB3c2RsOnBhcnQgdGhhdCBpcyBub3QgYm91bmQgdG8gZWl0aGVyIHNvYXA6Ym9keSBvciBzb2FwOmhlYWRlcgotICAgKiBpbiBhIE1JTUUgYmluZGluZy4KLSAgICogQHBhcmFtIHN3YVJlZlBhcnRzIGEgbGlzdCBvZiB3c2RsOnBhcnQgbmFtZXMgdGhhdCBhcmUgZGVmaW5lZCB3aXRoIHRoZQotICAgKiByZWY6c3dhUmVmIHNjaGVtYSB0eXBlLgotICAgKiBAcGFyYW0gbWVzc2FnZU5hbWUgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSB3c2RsOm1lc3NhZ2UgYmVpbmcgdmFsaWRhdGVkLgotICAgKiBAcGFyYW0gZXh0RWxlbXMgYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgb2YgZWl0aGVyIHdzZGw6aW5wdXQgb3IKLSAgICogd3NkbDpvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYmluZGluZyBvcGVyYXRpb24uCi0gICAqIEByZXR1cm4gYSB3c2RsOnBhcnQgbmFtZSB0aGF0IGlzIG5vdCBib3VuZCBwcm9wZXJseSwgb3IgbnVsbC4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldFVuYm91bmRQYXJ0KExpc3Qgc3dhUmVmUGFydHMsIFFOYW1lIG1lc3NhZ2VOYW1lLCBMaXN0IGV4dEVsZW1zKSB7Ci0gICAgLy8gR29pbmcgdGhyb3VnaCB3c2RsOnBhcnQgbmFtZXMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN3YVJlZlBhcnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBwYXJ0ID0gKFN0cmluZykgc3dhUmVmUGFydHMuZ2V0KGkpOwotICAgICAgYm9vbGVhbiBib3VuZFByb3Blcmx5ID0gZmFsc2U7Ci0gICAgICBpZiAoZXh0RWxlbXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXh0RWxlbXMuc2l6ZSgpICYmICFib3VuZFByb3Blcmx5OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtcy5nZXQoaik7Ci0gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgICAgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0dGluZyB0aGUgbWltZTpwYXJ0IGVsZW1lbnRzIG9mIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgICAgIExpc3QgbWltZVBhcnRzID0gKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbSkuZ2V0TUlNRVBhcnRzKCk7Ci0gICAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBmaXJzdCBtaW1lOnBhcnQgZWxlbWVudCB3aGVyZSBzb2FwOmJvZHkKLSAgICAgICAgICAgIC8vIGFuZCBzb2FwOmhlYWRlciBjb3VsZCBhcHBlYXIKLSAgICAgICAgICAgIGlmIChtaW1lUGFydHMuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTGlzdCBlbGVtcyA9ICgoTUlNRVBhcnQpIG1pbWVQYXJ0cy5nZXQoMCkpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgTUlNRSBwYXJ0J3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGVsZW1zLnNpemUoKTsgayArKykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVsZW0gPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVsZW1zLmdldChrKTsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGF0IGlzIGEgc29hcDpib2R5Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9TT0FQX0JPRFkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIExpc3QgcHRzID0gKChTT0FQQm9keSkgZWxlbSkuZ2V0UGFydHMoKTsKLSAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwYXJ0IGlzIGJvdW5kIGJ5IHRoaXMgZWxlbWVudAotICAgICAgICAgICAgICAgICAgaWYgKHB0cyA9PSBudWxsIHx8IHB0cy5jb250YWlucyhwYXJ0KSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm91bmRQcm9wZXJseSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBlbHNlIGlmIHRoYXQgaXMgYSBzb2FwOmhlYWRlcgotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9TT0FQX0hFQURFUikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBTT0FQSGVhZGVyKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IChTT0FQSGVhZGVyKSBlbGVtOwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGFydCBpcyBib3VuZCBieSB0aGlzIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VOYW1lLmVxdWFscyhoZWFkZXIuZ2V0TWVzc2FnZSgpKQotICAgICAgICAgICAgICAgICAgICAgICYmIGhlYWRlci5nZXRQYXJ0KCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICYmIGhlYWRlci5nZXRQYXJ0KCkuZXF1YWxzKHBhcnQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgYm91bmRQcm9wZXJseSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIC8vIFdTREw0SiAxLjQgZG9lcyBub3QgcmVjb2duaXplIHNvYXA6aGVhZGVyIGVsZW1lbnRzIHRoYXQKLSAgICAgICAgICAgICAgICAgIC8vIGFyZSBlbmNsb3NlZCBpbiBtaW1lOm11bHRpcGFydFJlbGF0ZWQsIHNvIHVzaW5nIGEgd29ya2Fyb3VuZAotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGhlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgKChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVsZW0pLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBoZWFkZXIgcmVmZXJlbmNlcyB0aGUgY29ycmVzcG9uZGluZyBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgcGFydCBpcyBib3VuZCBieSB0aGlzIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZXNNZXNzYWdlKGhlYWRlciwgbWVzc2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgJiYgaGVhZGVyLmdldEF0dHJpYnV0ZSgicGFydCIpLmVxdWFscyhwYXJ0KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGJvdW5kUHJvcGVybHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBJZiB0aGlzIHBhcnQgaXMgdW5ib3VuZCBwcm9wZXJseSwgcmV0dXJuIGl0Ci0gICAgICBpZiAoIWJvdW5kUHJvcGVybHkpCi0gICAgICAgIHJldHVybiBwYXJ0OwotICAgIH0KLSAgICAvLyBBbGwgdGhlIHBhcnRzIGFyZSBib3VuZCBwcm9wZXJseSwgcmV0dXJuIG51bGwKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhbiBlbGVtZW50IGNvbnRhaW5zIGEgbWVzc2FnZSBhdHRyaWJ1dGUgdGhhdCByZWZlcmVuY2VzCi0gICAqIGEgbWVzc2FnZSB0aGF0IGhhdmUgdGhlIHF1YWxpZmllZCBuYW1lIHNwZWNpZmllZC4KLSAgICogQHBhcmFtIGVsZW0gYW4gZWxlbWVudCB0byBiZSB2YWxpZGF0ZWQuCi0gICAqIEBwYXJhbSBtZXNzYWdlTmFtZSB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgYSBtZXNzYWdlLgotICAgKiBAcmV0dXJuIHRydWUgaWYgYW4gZWxlbWVudCBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHJlZmVyZW5jZXNNZXNzYWdlKEVsZW1lbnQgZWxlbSwgUU5hbWUgbWVzc2FnZU5hbWUpCi0gIHsKLSAgICAvLyBHZXR0aW5nIHRoZSBlbGVtZW50J3MgbWVzc2FnZSBhdHRyaWJ1dGUKLSAgICBTdHJpbmcgbWVzc2FnZSA9IGVsZW0uZ2V0QXR0cmlidXRlKCJtZXNzYWdlIik7Ci0gICAgLy8gZmluZGluZyB0aGUgY29sb24gZGVsaW1pdGVyCi0gICAgaW50IGNvbG9uUG9zID0gbWVzc2FnZS5pbmRleE9mKCI6Iik7Ci0gICAgU3RyaW5nIG5zID0gbnVsbDsKLSAgICAvLyBHZXR0aW5nIGEgbG9jYWwgcGFydAotICAgIFN0cmluZyBscCA9IGNvbG9uUG9zID4gLTEgPyBtZXNzYWdlLnN1YnN0cmluZyhjb2xvblBvcyArIDEpIDogbWVzc2FnZTsKLSAgICAvLyBJZiB0aGUgZGVsaW1pdGVyIGlzIGZvdW5kCi0gICAgaWYgKGNvbG9uUG9zID4gLTEpCi0gICAgewotICAgICAgLy8gUmV0cmlldmluZyBhIG5hbWVzcGFjZSBVUkkKLSAgICAgIG5zID0gdmFsaWRhdG9yLndzZGxEb2N1bWVudC5nZXREZWZpbml0aW9ucygpCi0gICAgICAgIC5nZXROYW1lc3BhY2UobWVzc2FnZS5zdWJzdHJpbmcoMCwgY29sb25Qb3MpKTsKLSAgICB9Ci0gICAgLy8gSWYgdGhlIGxvY2FsIHBhcnQgYW5kIHRoZSBuYW1lc3BhY2UgVVJJIGFyZSB0aGUgc2FtZSBhcyBhIG1lc3NhZ2UgaGF2ZQotICAgIGlmIChtZXNzYWdlTmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMobHApCi0gICAgICAmJiBtZXNzYWdlTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMobnMpKQotICAgIHsKLSAgICAgIC8vIGVsZW1lbnQgaXMgdmFsaWQsIHJldHVybiB0cnVlCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgLy8gZWxlbWVudCBpcyBub3QgdmFsaWQsIHJldHVybiBmYWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgdGhlIHdzZGw6cGFydCBkZWZpbmVkIHdpdGggdGhlIHJlZjpzd2FSZWYgc2NoZW1hIHR5cGUuCi0gICAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZSBjb250YWluaWcgd3NkbDpwYXJ0IGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB3c2RsOnBhcnQgbmFtZXMuCi0gICAqLwotICBwcml2YXRlIExpc3QgZ2V0U3dhUmVmUGFydHMoTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgTGlzdCBzd2FSZWZQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8vIEdvaW5nIHRocm91Z2ggbWVzc2FnZSdzIHBhcnRzCi0gICAgSXRlcmF0b3IgaXQgPSBtZXNzYWdlLmdldFBhcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBpdC5uZXh0KCk7Ci0gICAgICBRTmFtZSByZWY7Ci0gICAgICBzaG9ydCB0eXBlOwotICAgICAgLy8gR2V0dGluZyBlaXRoZXIgcGFydCdzIGVsZW1lbnQgcmVmZXJlbmNlIG9yIHR5cGUgcmVmZXJlbmNlCi0gICAgICBpZiAoKHJlZiA9IHBhcnQuZ2V0VHlwZU5hbWUoKSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHlwZSA9IFhTQ29uc3RhbnRzLlRZUEVfREVGSU5JVElPTjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKChyZWYgPSBwYXJ0LmdldEVsZW1lbnROYW1lKCkpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHR5cGUgPSBYU0NvbnN0YW50cy5FTEVNRU5UX0RFQ0xBUkFUSU9OOwotICAgICAgfQotICAgICAgLy8gVGhlIHBhcnQgZG9lcyBjb25hdGlucyBuZWl0aGVyIGVsZW1lbnQgbm9yIHR5cGUgYXR0cmlidXRlLAotICAgICAgLy8gcHJvY2VlZGluZyB3aXRoIHRoZSBuZXh0IHBhcnQKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAvLyBHZXR0aW5nIGEgbGlzdCBvZiBzY2hlbWFzIGRlZmluZWQKLSAgICAgIE1hcCBzY2hlbWFzID0gdmFsaWRhdG9yLndzZGxEb2N1bWVudC5nZXRTY2hlbWFzKCk7Ci0gICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBzY2hlbWFzCi0gICAgICBJdGVyYXRvciBpdDIgPSBzY2hlbWFzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNNb2RlbCB4c01vZGVsID0gKFhTTW9kZWwpIGl0Mi5uZXh0KCk7Ci0gICAgICAgIFhTVHlwZURlZmluaXRpb24gcGFydFR5cGUgPSBudWxsOwotICAgICAgICAvLyBHZXR0aW5nIHRoZSBjb3JyZXNwb25kaW5nIHBhcnQgdHlwZQotICAgICAgICBpZiAodHlwZSA9PSBYU0NvbnN0YW50cy5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgWFNFbGVtZW50RGVjbGFyYXRpb24gZWxlbSA9IHhzTW9kZWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKAotICAgICAgICAgICAgcmVmLmdldExvY2FsUGFydCgpLCByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgIGlmIChlbGVtICE9IG51bGwpCi0gICAgICAgICAgICBwYXJ0VHlwZSA9IGVsZW0uZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJ0VHlwZSA9IHhzTW9kZWwuZ2V0VHlwZURlZmluaXRpb24oCi0gICAgICAgICAgICByZWYuZ2V0TG9jYWxQYXJ0KCksIHJlZi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhlIHBhcnQgdHlwZSBpcyBkZWZpbmVkIHVzaW5nIHRoZSByZWY6c3dhUmVmIHNjaGVtYSB0eXBlCi0gICAgICAgIGlmIChyZWZlcmVuY2VzU3dhUmVmKHBhcnRUeXBlLCBuZXcgQXJyYXlMaXN0KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQWRkaW5nIHRoZSBwYXJ0J3MgbmFtZSB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgIHN3YVJlZlBhcnRzLmFkZChwYXJ0LmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUmV0dXJuIHRoZSBsaXN0Ci0gICAgcmV0dXJuIHN3YVJlZlBhcnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHNjaGVtYSB0eXBlIHdoZXRoZXIgaXQgY29udGFpbnMgcmVmOnN3YVJlZiBzaW1wbGUgc2NoZW1hIHR5cGUKLSAgICogb3IgaGFzIGFuIGF0dHJpYnV0ZSBvZiB0aGlzIHNjaGVtYSB0eXBlLgotICAgKiBAcGFyYW0geHNUeXBlIGEgc2NoZW1hIHR5cGUgZGVmaW5pdGlvbiBlbGVtZW50Ci0gICAqIEByZXR1cm4gdHJ1ZSwgaWYgc2NoZW1hIHR5cGUgY29udGFpbnMgcmVmOnN3YVJlZiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHJlZmVyZW5jZXNTd2FSZWYoWFNUeXBlRGVmaW5pdGlvbiB4c1R5cGUsIExpc3QgdHlwZXMpCi0gIHsKLSAgICBpZiAoKHhzVHlwZSAhPSBudWxsKSAmJiAoIXR5cGVzLmNvbnRhaW5zKHhzVHlwZSkpKQotICAgIHsKLSAgICAgIHR5cGVzLmFkZCh4c1R5cGUpOwotICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbXBsZXggdHlwZQotICAgICAgaWYgKHhzVHlwZS5nZXRUeXBlQ2F0ZWdvcnkoKSA9PSBYU1R5cGVEZWZpbml0aW9uLkNPTVBMRVhfVFlQRSkKLSAgICAgIHsKLSAgICAgICAgWFNDb21wbGV4VHlwZURlZmluaXRpb24geHNDb21wbGV4VHlwZSA9Ci0gICAgICAgICAgKFhTQ29tcGxleFR5cGVEZWZpbml0aW9uKSB4c1R5cGU7Ci0gICAgICAgIC8vIElmIGl0IGNvbnRhaW5zIG1peGVkIGNvbnRleHQKLSAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgY29udGV4dCBjb250YWlucyByZWY6c3dhUmVmCi0gICAgICAgIGlmICh4c0NvbXBsZXhUeXBlLmdldFBhcnRpY2xlKCkgIT0gbnVsbAotICAgICAgICAgICYmIHJlZmVyZW5jZXNTd2FSZWYoeHNDb21wbGV4VHlwZS5nZXRQYXJ0aWNsZSgpLmdldFRlcm0oKSwgdHlwZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0dGluZyB0aGUgdHlwZSdzIGF0dHJpYnV0ZXMKLSAgICAgICAgWFNPYmplY3RMaXN0IGF0dHJMaXN0ID0geHNDb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVVc2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFhTQXR0cmlidXRlVXNlIHhzQXR0clVzZSA9IChYU0F0dHJpYnV0ZVVzZSkgYXR0ckxpc3QuaXRlbShpKTsKLSAgICAgICAgICAvLyBJZiBhbiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCB1c2luZyByZWY6c3dhUmVmLCByZXR1cm4gdHJ1ZQotICAgICAgICAgIGlmIChyZWZlcmVuY2VzU3dhUmVmKAotICAgICAgICAgICAgeHNBdHRyVXNlLmdldEF0dHJEZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCksIHR5cGVzKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGVsc2UgaWYgdGhpcyBpcyBhIHNpbXBsZSB0eXBlCi0gICAgICBlbHNlIGlmICh4c1R5cGUuZ2V0VHlwZUNhdGVnb3J5KCkgPT0gWFNUeXBlRGVmaW5pdGlvbi5TSU1QTEVfVFlQRSkKLSAgICAgIHsKLSAgICAgICAgWFNTaW1wbGVUeXBlIHhzU2ltcGxlVHlwZSA9IChYU1NpbXBsZVR5cGUpIHhzVHlwZTsKLSAgICAgICAgLy8gSWYgdGhpcyB0eXBlIGlzIHJlZjpzd2FSZWYsIHJldHVybiB0cnVlCi0gICAgICAgIGlmICh4c1NpbXBsZVR5cGUuZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfU1dBX1JFRikKLSAgICAgICAgICAmJiB4c1NpbXBsZVR5cGUuZ2V0TmFtZSgpLmVxdWFscyhXU0lDb25zdGFudHMuU0NIRU1BX1RZUEVfU1dBX1JFRikpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBUaGUgc2NoZW1hIHR5cGUgZG9lcyBub3QgY29udGFpbiBhbnkgZWxlbWVudCBkZWZpbmVkIHdpdGggdGhlIHJlZjpzd2FSZWYKLSAgICAvLyByZXR1cm4gZmFsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIGEgdGVybSB3aGV0aGVyIGl0IGlzIGRlZmluZWQgd2l0aCByZWY6c3dhUmVmLgotICAgKiBAcGFyYW0gdGVybSBhIHRlcm0gdGhhdCBjYW4gYmUgb25lIG9mIGEgbW9kZWwgZ3JvdXAgb3IgYW4KLSAgICogZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICogQHJldHVybiB0cnVlIGlmIGEgdGVybSBpcyBkZWZpbmVkIHdpdGggcmVmOnN3YVJlZiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHJlZmVyZW5jZXNTd2FSZWYoWFNUZXJtIHRlcm0sIExpc3QgdHlwZXMpCi0gIHsKLSAgICAvLyBJZiBhIHRlcm0gaXMgYW4gZWxlbWVudCBkZWNsYXJhdGlvbgotICAgIGlmICh0ZXJtLmdldFR5cGUoKSA9PSBYU0NvbnN0YW50cy5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgIHsKLSAgICAgIC8vIElmIGVsZW1lbnQncyB0eXBlIGlzIGRlZmluZWQgd2l0aCB0aGUgcmVmOnN3YVJlZiwgcmV0dXJuIHRydWUKLSAgICAgIGlmIChyZWZlcmVuY2VzU3dhUmVmKAotICAgICAgICAoKFhTRWxlbWVudERlY2xhcmF0aW9uKSB0ZXJtKS5nZXRUeXBlRGVmaW5pdGlvbigpLCB0eXBlcykpCi0gICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGVsc2UgaWYgYSB0ZXJtIGlzIGEgbW9kZWwgZ3JvdXAKLSAgICBlbHNlIGlmKHRlcm0uZ2V0VHlwZSgpID09IFhTQ29uc3RhbnRzLk1PREVMX0dST1VQKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgYSBsaXN0IG9mIFBhcnRpY2xlIHNjaGVtYSBjb21wb25lbnRzCi0gICAgICBYU09iamVjdExpc3QgbGlzdCA9ICgoWFNNb2RlbEdyb3VwKSB0ZXJtKS5nZXRQYXJ0aWNsZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICAvLyBJZiB0aGUgdGVybSBvZiBhIHBhcnRpY2xlIGlzIGRlZmluZWQgd2l0aCB0aGUgcmVmOnN3YVJlZiwKLSAgICAgICAgLy8gcmV0dXJuIHRydWUKLSAgICAgICAgaWYgKHJlZmVyZW5jZXNTd2FSZWYoKChYU1BhcnRpY2xlKSBsaXN0Lml0ZW0oaSkpLmdldFRlcm0oKSwgdHlwZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5NDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2E3YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5NDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBUDI5NDEKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkEgd3NkbDpiaW5kaW5nIGluIGEgZGVzY3JpcHRpb24gYmluZHMgZXZlcnkgd3NkbDpwYXJ0Ci0gKiBvZiBhIHdzZGw6bWVzc2FnZSBpbiB0aGUgd3NkbDpwb3J0VHlwZSB0byB3aGljaCBpdCByZWZlcnMgdG8gb25lIG9mCi0gKiBzb2FwYmluZDpib2R5LCBzb2FwYmluZDpoZWFkZXIsIHNvYXBiaW5kOmZhdWx0ICwgc29hcGJpbmQ6aGVhZGVyZmF1bHQsCi0gKiBvciBtaW1lOmNvbnRlbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjk0MSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMjk0MShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIGEgd3NkbDpiaW5kaW5nCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgICAgLy8gR2V0dGluZyBpdHMgd3NkbDpvcGVyYXRpb24gZWxlbWVudHMKLSAgICAgIExpc3Qgb3BzID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotCi0gICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBvcGVyYXRpb24gZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgb3BzLmdldChpKTsKLSAgICAgICAgSW5wdXQgcG9ydFR5cGVJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgT3V0cHV0IHBvcnRUeXBlT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKTsKLSAgICAgICAgLy8gSWYgdGhlIGNvcnJlc3BvbmRpbmcgd3NkbDppbnB1dCBleGlzdHMgaW4gd3NkbDpwb3J0VHlwZQotICAgICAgICAvLyBhbmQgaW5jbHVkZXMgdGhlIG1lc3NhZ2UgYXR0cmlidXRlCi0gICAgICAgIGlmIChwb3J0VHlwZUlucHV0ICE9IG51bGwgJiYgcG9ydFR5cGVJbnB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldHRpbmcgdGhlIGxpc3Qgb2YgYWxsIHRoZSBwYXJ0cyBib3VuZCBieSB3c2RsOmlucHV0J3MgY2hpbGQgZWxlbWVudHMKLSAgICAgICAgICBMaXN0IGlucHV0UGFydHMgPSBnZXRCaW5kaW5nUGFydHMoCi0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLAotICAgICAgICAgICAgcG9ydFR5cGVJbnB1dC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgIC8vIElmIG5vdCB0cnVlIHRoYXQgYWxsIHRoZSB3c2RsOnBhcnRTIGFyZSBib3VuZCwKLSAgICAgICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmICghaW5wdXRQYXJ0cwotICAgICAgICAgICAgLmNvbnRhaW5zQWxsKHBvcnRUeXBlSW5wdXQuZ2V0TWVzc2FnZSgpLmdldFBhcnRzKCkua2V5U2V0KCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgd3NkbDppbnB1dCBvZiB0aGUgXCIiCi0gICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIgYmluZGluZyBvcGVyYXRpb24gZG9lcyBub3QgIgotICAgICAgICAgICAgICArICJiaW5kIGFsbCB0aGUgY29ycmVzcG9uZGluZyB3c2RsOnBhcnRTLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6b3V0cHV0IGV4aXN0cyBpbiB3c2RsOnBvcnRUeXBlCi0gICAgICAgIC8vIGFuZCBpbmNsdWRlcyB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUKLSAgICAgICAgaWYgKHBvcnRUeXBlT3V0cHV0ICE9IG51bGwgJiYgcG9ydFR5cGVPdXRwdXQuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBsaXN0IG9mIGFsbCB0aGUgcGFydHMgYm91bmQgYnkgd3NkbDpvdXRwdXQncyBjaGlsZCBlbGVtZW50cwotICAgICAgICAgIExpc3Qgb3V0cHV0UGFydHMgPSBnZXRCaW5kaW5nUGFydHMoCi0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwKLSAgICAgICAgICAgIHBvcnRUeXBlT3V0cHV0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgLy8gSWYgbm90IHRydWUgdGhhdCBhbGwgdGhlIHdzZGw6cGFydFMgYXJlIGJvdW5kLAotICAgICAgICAgIC8vIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKCFvdXRwdXRQYXJ0cwotICAgICAgICAgICAgLmNvbnRhaW5zQWxsKHBvcnRUeXBlT3V0cHV0LmdldE1lc3NhZ2UoKS5nZXRQYXJ0cygpLmtleVNldCgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIHdzZGw6b3V0cHV0IG9mIHRoZSBcIiIKLSAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArICJcIiBiaW5kaW5nIG9wZXJhdGlvbiBkb2VzIG5vdCAiCi0gICAgICAgICAgICAgICsgImJpbmQgYWxsIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6cGFydFMuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSUYgdGhlcmUgYXJlIHdzZGw6ZmF1bHRTIGluIHRoZSB3c2RsOnBvcnRUeXBlIG9wZXJhdGlvbgotICAgICAgICBpZiAoIWJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0RmF1bHRzKCkuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIHNvYXA6ZmF1bHQgbmFtZXMKLSAgICAgICAgICBMaXN0IGZhdWx0TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgQ29sbGVjdGlvbiBmYXVsdHMgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdGYXVsdHMoKS52YWx1ZXMoKTsKLSAgICAgICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgd3NkbDpmYXVsdFMKLSAgICAgICAgICBJdGVyYXRvciBpdCA9IGZhdWx0cy5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0dGluZyB3c2RsOmZhdWx0J3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBleHRFbGVtcyA9ICgoQmluZGluZ0ZhdWx0KSBpdC5uZXh0KCkpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHRFbGVtcy5zaXplKCk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZXh0RWxlbXMuZ2V0KGopKQotICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX1NPQVBfRkFVTFQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmF1bHROYW1lcy5hZGQoKChTT0FQRmF1bHQpZXh0RWxlbXMuZ2V0KGopKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIElmIG5vdCB0cnVlIHRoYXQgYWxsIHRoZSB3c2RsOmZhdWx0UyBhcmUgYm91bmQsCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAoIWZhdWx0TmFtZXMuY29udGFpbnNBbGwoCi0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldEZhdWx0cygpLmtleVNldCgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgYmluZGluZyBvcGVyYXRpb24gXCIiCi0gICAgICAgICAgICAgICAgICArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpICsgIlwiIGRvZXMgbm90ICIKLSAgICAgICAgICAgICAgICAgICsgImJpbmQgYWxsIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6ZmF1bHRTLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgLy8gVGhlIGFzc2VydGlvbiBpcyAicmVjb21tZW5kZWQiLCB1c2luZyB0aGUgIndhcm5pbmciIHJlc3VsdAotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgdGhlIHBhcnRzIGJvdW5kIGJ5IGV4dGVuc2liaWxpdHkgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBleHRFbGVtcyBhIGxpdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLgotICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgd3NkbDptZXNzYWdlIGVsZW1lbnQgY29ycmVzcG9uZ2luZwotICAgKiB0byB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIGxpc3Qgb2Ygd3NkbDpwYXJ0IG5hbWVzIGJvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IGdldEJpbmRpbmdQYXJ0cyhMaXN0IGV4dEVsZW1zLCBNZXNzYWdlIG1lc3NhZ2UpCi0gIHsKLSAgICBMaXN0IHBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChleHRFbGVtcyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0RWxlbXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1zLmdldChpKTsKLSAgICAgICAgLy8gSWYgdGhhdCBpcyBhIHNvYXA6Ym9keQotICAgICAgICBpZiAoZXh0RWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX1NPQVBfQk9EWSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBBZGRpbmcgYWxsIHRoZSBwYXJ0cyBib3VuZCB0byB0aGUgbGlzdAotICAgICAgICAgIExpc3QgcHRzID0gKChTT0FQQm9keSkgZXh0RWxlbSkuZ2V0UGFydHMoKTsKLSAgICAgICAgICBpZiAocHRzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFydHMuYWRkQWxsKHB0cyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGVsc2UgdGhlIHBhcnRzIGF0dHJpYnV0ZSBpcyBvbWl0dGVkLAotICAgICAgICAgIC8vIGFsbCBwYXJ0cyBkZWZpbmVkIGJ5IHRoZSBtZXNzYWdlIGFyZSBhc3N1bWVkIHRvIGJlIGluY2x1ZGVkCi0gICAgICAgICAgLy8gaW4gdGhlIFNPQVAgQm9keSBwb3J0aW9uLgotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJ0cy5hZGRBbGwobWVzc2FnZS5nZXRQYXJ0cygpLmtleVNldCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZSBpZiB0aGF0IGlzIGEgc29hcDpoZWFkZXIKLSAgICAgICAgZWxzZSBpZiAoZXh0RWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX1NPQVBfSEVBREVSKSkKLSAgICAgICAgewotICAgICAgICAgIExpc3QgaGVhZGVyRmF1bHRzID0gbnVsbDsKLSAgICAgICAgICBpZiAoZXh0RWxlbSBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSAoU09BUEhlYWRlcikgZXh0RWxlbTsKLSAgICAgICAgICAgIC8vIElmIGEgaGVhZGVyIHJlZmVyZW5jZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSwKLSAgICAgICAgICAgIC8vIGFkZGluZyBwYXJ0IG5hbWUgdG8gdGhlIGxpc3QgCi0gICAgICAgICAgICBpZiAobWVzc2FnZS5nZXRRTmFtZSgpLmVxdWFscyhoZWFkZXIuZ2V0TWVzc2FnZSgpKSkKLSAgICAgICAgICAgICAgcGFydHMuYWRkKGhlYWRlci5nZXRQYXJ0KCkpOwotCi0gICAgICAgICAgICBoZWFkZXJGYXVsdHMgPSBoZWFkZXIuZ2V0U09BUEhlYWRlckZhdWx0cygpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBXU0RMNEogMS40IGRvZXMgbm90IHJlY29nbml6ZSBzb2FwOmhlYWRlciBlbGVtZW50cyB0aGF0IGFyZSBlbmNsb3NlZAotICAgICAgICAgIC8vIGluIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCwgc28gdXNpbmcgYSB3b3JrYXJvdW5kCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgaGVhZGVyID0KLSAgICAgICAgICAgICAgKChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW0pLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgIC8vIElmIGEgaGVhZGVyIHJlZmVyZW5jZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSwKLSAgICAgICAgICAgIC8vIGFkZGluZyBwYXJ0IG5hbWUgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VzTWVzc2FnZShoZWFkZXIsIG1lc3NhZ2UuZ2V0UU5hbWUoKSkpCi0gICAgICAgICAgICAgIHBhcnRzLmFkZChoZWFkZXIuZ2V0QXR0cmlidXRlKCJwYXJ0IikpOwotICAgICAgICAgICAgLy8gQ29sbGVjdGluZyBzb2FwOmhlYWRlcmZhdWx0IGVsZW1lbnRzIGZvciB0aGUgaGVhZGVyCi0gICAgICAgICAgICBoZWFkZXJGYXVsdHMgPSBnZXRIZWFkZXJGYXVsdHMoaGVhZGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCB0aGUgc29hcDpoZWFkZXJmYXVsdFMKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhlYWRlckZhdWx0cy5zaXplKCk7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaGVhZGVyRmF1bHRzLmdldChqKSBpbnN0YW5jZW9mIFNPQVBIZWFkZXJGYXVsdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU09BUEhlYWRlckZhdWx0IHNoZiA9IChTT0FQSGVhZGVyRmF1bHQpIGhlYWRlckZhdWx0cy5nZXQoaik7Ci0gICAgICAgICAgICAgIC8vIElmIGEgc29hcDpoZWFkZXJmYXVsdCByZWZlcmVuY2VzIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICAgICAgICAgIC8vIG1lc3NhZ2UsIGFkZGluZyBwYXJ0IG5hbWUgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXF1YWxzKHNoZi5nZXRNZXNzYWdlKCkpKQotICAgICAgICAgICAgICAgIHBhcnRzLmFkZChzaGYuZ2V0UGFydCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHRoZSBzYW1lIHdvcmthcm91bmQuLi4KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRWxlbWVudCBzaGYgPSAoRWxlbWVudCkgaGVhZGVyRmF1bHRzLmdldChqKTsKLSAgICAgICAgICAgICAgLy8gSWYgYSBzb2FwOmhlYWRlcmZhdWx0IHJlZmVyZW5jZXMgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAgICAgLy8gbWVzc2FnZSwgYWRkaW5nIHBhcnQgbmFtZSB0byB0aGUgbGlzdAotICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlc01lc3NhZ2Uoc2hmLCBtZXNzYWdlLmdldFFOYW1lKCkpKQotICAgICAgICAgICAgICAgIHBhcnRzLmFkZChzaGYuZ2V0QXR0cmlidXRlKCJwYXJ0IikpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBlbHNlIGlmIHRoYXQgaXMgYSBtaW1lOmNvbnRlbnQKLSAgICAgICAgZWxzZSBpZiAoZXh0RWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX01JTUVfQ09OVEVOVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBhZGRpbmcgcGFydCBuYW1lIHRvIHRoZSBsaXN0Ci0gICAgICAgICAgcGFydHMuYWRkKCgoTUlNRUNvbnRlbnQpIGV4dEVsZW0pLmdldFBhcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZSBpZiB0aGF0IGlzIGEgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgIGVsc2UgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMgb2YgdGhlIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgICAgIExpc3QgbWltZVBhcnRzID0gKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbSkuZ2V0TUlNRVBhcnRzKCk7Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWltZVBhcnRzLnNpemUoKTsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSB2YWx1ZXMgb2YgcGFydCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAvLyBvZiBtaW1lOnBhcnQncyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICAgICAgICBwYXJ0cy5hZGRBbGwoZ2V0QmluZGluZ1BhcnRzKAotICAgICAgICAgICAgICAoKE1JTUVQYXJ0KSBtaW1lUGFydHMuZ2V0KGopKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgbWVzc2FnZSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGFydHM7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW4gZWxlbWVudCBjb250YWlucyBhIG1lc3NhZ2UgYXR0cmlidXRlIHRoYXQgcmVmZXJlbmNlcwotICAgKiBhIG1lc3NhZ2UgdGhhdCBoYXZlIHRoZSBxdWFsaWZpZWQgbmFtZSBzcGVjaWZpZWQuCi0gICAqIEBwYXJhbSBlbGVtIGFuIGVsZW1lbnQgdG8gYmUgdmFsaWRhdGVkLgotICAgKiBAcGFyYW0gbWVzc2FnZU5hbWUgdGhlIHF1YWxpZmllZCBuYW1lIG9mIGEgbWVzc2FnZS4KLSAgICogQHJldHVybiB0cnVlIGlmIGFuIGVsZW1lbnQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiByZWZlcmVuY2VzTWVzc2FnZShFbGVtZW50IGVsZW0sIFFOYW1lIG1lc3NhZ2VOYW1lKQotICB7Ci0gICAgLy8gR2V0dGluZyB0aGUgZWxlbWVudCdzIG1lc3NhZ2UgYXR0cmlidXRlCi0gICAgU3RyaW5nIG1lc3NhZ2UgPSBlbGVtLmdldEF0dHJpYnV0ZSgibWVzc2FnZSIpOwotICAgIC8vIGZpbmRpbmcgdGhlIGNvbG9uIGRlbGltaXRlcgotICAgIGludCBjb2xvblBvcyA9IG1lc3NhZ2UuaW5kZXhPZigiOiIpOwotICAgIFN0cmluZyBucyA9IG51bGw7Ci0gICAgLy8gR2V0dGluZyBhIGxvY2FsIHBhcnQKLSAgICBTdHJpbmcgbHAgPSBjb2xvblBvcyA+IC0xID8gbWVzc2FnZS5zdWJzdHJpbmcoY29sb25Qb3MgKyAxKSA6IG1lc3NhZ2U7Ci0gICAgLy8gSWYgdGhlIGRlbGltaXRlciBpcyBmb3VuZAotICAgIGlmIChjb2xvblBvcyA+IC0xKQotICAgIHsKLSAgICAgIC8vIFJldHJpZXZpbmcgYSBuYW1lc3BhY2UgVVJJCi0gICAgICBucyA9IHZhbGlkYXRvci53c2RsRG9jdW1lbnQuZ2V0RGVmaW5pdGlvbnMoKQotICAgICAgICAuZ2V0TmFtZXNwYWNlKG1lc3NhZ2Uuc3Vic3RyaW5nKDAsIGNvbG9uUG9zKSk7Ci0gICAgfQotICAgIC8vIElmIHRoZSBsb2NhbCBwYXJ0IGFuZCB0aGUgbmFtZXNwYWNlIFVSSSBhcmUgdGhlIHNhbWUgYXMgYSBtZXNzYWdlIGhhdmUKLSAgICBpZiAobWVzc2FnZU5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKGxwKQotICAgICAgJiYgbWVzc2FnZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5zKSkKLSAgICB7Ci0gICAgICAvLyBlbGVtZW50IGlzIHZhbGlkLCByZXR1cm4gdHJ1ZQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIC8vIGVsZW1lbnQgaXMgbm90IHZhbGlkLCByZXR1cm4gZmFsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgYWxsIHRoZSBlbGVtZW50J3MgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHNvYXA6aGVhZGVyZmF1bHQgdHlwZS4KLSAgICogQHBhcmFtIGVsZW1lbnQgYW4gZWxlbWVudCB0aGF0IGNhbiBoYXZlIHNvYXA6aGVhZGVyZmF1bHQgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc29hcDpoZWFkZXJmYXVsdCBlbGVtZW50cyBmb3VuZC4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBnZXRIZWFkZXJGYXVsdHMoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTGlzdCBoZWFkZXJGYXVsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIHRoZSBmaXJzdCBoZWFkZXIncyBjaGlsZAotICAgICAgRWxlbWVudCBjaGlsZCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbWVudCk7Ci0gICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgdGhlIGNoaWxkIGlzIHNvYXA6aGVhZGVyZmF1bHQKLSAgICAgICAgaWYgKGNoaWxkLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhXU0RMX1NPQVBfSEVBREVSRkFVTFQuZ2V0TmFtZXNwYWNlVVJJKCkpCi0gICAgICAgICAgJiYgY2hpbGQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFdTRExfU09BUF9IRUFERVJGQVVMVC5nZXRMb2NhbFBhcnQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBBZGRpbmcgdGhlIGNoaWxkIHRvIHRoZSBsaXN0Ci0gICAgICAgICAgaGVhZGVyRmF1bHRzLmFkZChjaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0dGluZyB0aGUgbmV4dCBoZWFkZXIncyBjaGlsZAotICAgICAgICBjaGlsZCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKGNoaWxkKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGhlYWRlckZhdWx0czsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTQ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjk0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTkzYTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTQ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLS8qKgotICogQVAyOTQ0Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5JbiBhIERFU0NSSVBUSU9OLCBpZiBhIHdzZGw6cGFydCBlbGVtZW50IHJlZmVycyB0byBhCi0gKiBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbiAodmlhIHRoZSBlbGVtZW50IGF0dHJpYnV0ZSBvZiB0aGUgd3NkbDpwYXJ0IGVsZW1lbnQpCi0gKiB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBhdHRyaWJ1dGUgb2YgYSBtaW1lOmNvbnRlbnQgZWxlbWVudCB0aGF0IGJpbmRzIHRoYXQgcGFydAotICogaXMgYSBjb250ZW50IHR5cGUgc3VpdGFibGUgZm9yIGNhcnJ5aW5nIGFuIFhNTCBzZXJpYWxpemF0aW9uLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDI5NDQgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8vIEEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgYSBiaW5kaW5nIGNvbnRhaW5zIG1pbWU6Y29udGVudCBlbGVtZW50cwotICAvLyB0aGF0IGJpbmQgd3NkbDpwYXJ0UyBkZWZpbmVkIHdpdGggdGhlIGVsZW1lbnQgYXR0cmlidXRlCi0gIHByaXZhdGUgYm9vbGVhbiBtaW1lQ29udGVudEZvdW5kOwotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTQ0KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFJlc2V0dGluZyB0aGUgdmFyaWFibGUKLSAgICBtaW1lQ29udGVudEZvdW5kID0gZmFsc2U7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIGEgd3NkbDpiaW5kaW5nCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgICAgLy8gR2V0dGluZyBpdHMgd3NkbDpvcGVyYXRpb24gZWxlbWVudHMKLSAgICAgIExpc3Qgb3BzID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotCi0gICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBvcGVyYXRpb24gZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgb3BzLmdldChpKTsKLQotICAgICAgICAvLyBHZXR0aW5nIHdzZGw6aW5wdXQgYW5kIHdzZGw6b3V0cHV0IGVsZW1lbnRzIG9mIGFuIG9wZXJhdGlvbgotICAgICAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG1pbWU6Y29udGVudCBlbGVtZW50cyBmcm9tIHdzZGw6aW5wdXQgYW5kIHdzZGw6b3V0cHV0Ci0gICAgICAgIExpc3QgaW5wdXRNaW1lQ29udGVudHMgPSBnZXRNaW1lQ29udGVudEVsZW1lbnRzKAotICAgICAgICAgIGJpbmRpbmdJbnB1dCA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgIExpc3Qgb3V0cHV0TWltZUNvbnRlbnRzID0gZ2V0TWltZUNvbnRlbnRFbGVtZW50cygKLSAgICAgICAgICBiaW5kaW5nT3V0cHV0ID09IG51bGwgPyBudWxsIDogYmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGw6aW5wdXQgY29udGFpbnMgbWltZTpjb250ZW50IGVsZW1lbnRzCi0gICAgICAgIGlmICghaW5wdXRNaW1lQ29udGVudHMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgSW5wdXQgcG9ydFR5cGVJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAvLyBJZiB0aGUgY29ycmVzcG9uZGluZyB3c2RsOmlucHV0IGV4aXN0cyBpbiB3c2RsOnBvcnRUeXBlCi0gICAgICAgICAgLy8gYW5kIGluY2x1ZGVzIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZQotICAgICAgICAgIGlmIChwb3J0VHlwZUlucHV0ICE9IG51bGwgJiYgcG9ydFR5cGVJbnB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBpbnZhbGlkIG1pbWU6Y29udGVudCBlbGVtZW50Ci0gICAgICAgICAgICBNSU1FQ29udGVudCBpbWMgPSBnZXRJbnZhbGlkTWltZUNvbnRlbnQoCi0gICAgICAgICAgICAgICAgaW5wdXRNaW1lQ29udGVudHMsIHBvcnRUeXBlSW5wdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGlmIChpbWMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBtaW1lOmNvbnRlbnQgZWxlbWVudCBpbiAiCi0gICAgICAgICAgICAgICAgKyAidGhlIHdzZGw6aW5wdXQgb2YgdGhlIFwiIiArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiXCIgdGhhdCBiaW5kcyB0aGUgXCIiICsgaW1jLmdldFBhcnQoKQotICAgICAgICAgICAgICAgICsgIlwiIHdzZGw6cGFydCB1c2VzIHRoZSBpbnZhbGlkIGNvbnRlbnQgdHlwZSBcIiIKLSAgICAgICAgICAgICAgICArIGltYy5nZXRUeXBlKCkgKyAiXCIuICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSB3c2RsOm91dHB1dCBjb250YWlucyBtaW1lOmNvbnRlbnQgZWxlbWVudHMKLSAgICAgICAgaWYgKCFvdXRwdXRNaW1lQ29udGVudHMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgT3V0cHV0IHBvcnRUeXBlT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAvLyBJZiB0aGUgY29ycmVzcG9uZGluZyB3c2RsOm91dHB1dCBleGlzdHMgaW4gd3NkbDpwb3J0VHlwZQotICAgICAgICAgIC8vIGFuZCBpbmNsdWRlcyB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUKLSAgICAgICAgICBpZiAocG9ydFR5cGVPdXRwdXQgIT0gbnVsbCAmJiBwb3J0VHlwZU91dHB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBpbnZhbGlkIG1pbWU6Y29udGVudCBlbGVtZW50Ci0gICAgICAgICAgICBNSU1FQ29udGVudCBpbWMgPSBnZXRJbnZhbGlkTWltZUNvbnRlbnQoCi0gICAgICAgICAgICAgIG91dHB1dE1pbWVDb250ZW50cywgcG9ydFR5cGVPdXRwdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGlmIChpbWMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBtaW1lOmNvbnRlbnQgZWxlbWVudCBpbiAiCi0gICAgICAgICAgICAgICAgKyAidGhlIHdzZGw6b3V0cHV0IG9mIHRoZSBcIiIgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICsgIlwiIHRoYXQgYmluZHMgdGhlIFwiIiArIGltYy5nZXRQYXJ0KCkKLSAgICAgICAgICAgICAgICArICJcIiB3c2RsOnBhcnQgdXNlcyB0aGUgaW52YWxpZCBjb250ZW50IHR5cGUgXCIiCi0gICAgICAgICAgICAgICAgKyBpbWMuZ2V0VHlwZSgpICsgIlwiLiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIElmIG1pbWU6Y29udGVudCBlbGVtZW50cyBhcmUgbm90IGZvdW5kLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFtaW1lQ29udGVudEZvdW5kKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHdoZXRoZXIgYW55IG1pbWU6Y29udGVudCBlbGVtZW50IGJpbmRzIHdzZGw6cGFydCB0aGF0IGlzIGRlZmluZWQKLSAgICogd2l0aCB0aGUgZWxlbWVudCBhdHRyaWJ1dGUgYW5kIHVzZXMgdGhlIGNvbnRlbnQgdHlwZSAidGV4dC94bWwiLgotICAgKiBAcGFyYW0gbWltZUNvbnRlbnRzIGEgbGlzdCBvZiBtaW1lOmNvbnRlbnQgZWxlbWVudHMgb2YgYmluZGluZyBvcGVyYXRpb24uCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6bWVzc2FnZSBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgbWltZTpjb250ZW50IGVsZW1lbnQgdGhhdCB1c2VzIGEgY29udGVudCB0eXBlIG90aGVyIHRoYW4KLSAgICogInRleHQveG1sIiwgbnVsbCBpZiBubyBvbmUgc3VjaCBlbGVtZW50IGlzIGZvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBNSU1FQ29udGVudCBnZXRJbnZhbGlkTWltZUNvbnRlbnQoTGlzdCBtaW1lQ29udGVudHMsIE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIC8vIEdvaW5nIHRocm91Z2ggYSBsaXN0IG9mIG1pbWU6Y29udGVudCBlbGVtZW50cwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWltZUNvbnRlbnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIE1JTUVDb250ZW50IG1pbWVDb250ZW50ID0gKE1JTUVDb250ZW50KSBtaW1lQ29udGVudHMuZ2V0KGkpOwotICAgICAgLy8gR2V0dGluZyB0aGUgY29ycmVzcG9uZGluZyB3c2RsOnBhcnQKLSAgICAgIFBhcnQgcGFydCA9IG1lc3NhZ2UuZ2V0UGFydChtaW1lQ29udGVudC5nZXRQYXJ0KCkpOwotICAgICAgLy8gSWYgdGhlIHBhcnQgaXMgZGVmaW5lZCB3aXRoIHRoZSBlbGVtZW50IGF0dHJpYnV0ZQotICAgICAgaWYgKHBhcnQgIT0gbnVsbCAmJiBwYXJ0LmdldEVsZW1lbnROYW1lKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWltZUNvbnRlbnRGb3VuZCA9IHRydWU7Ci0gICAgICAgIC8vIElmIHRoZSB0eXBlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBvdGhlciB0aGFuICJ0ZXh0L3htbCIKLSAgICAgICAgaWYgKCFXU0lDb25zdGFudHMuQ09OVEVOVF9UWVBFX1RFWFRfWE1MLmVxdWFscyhtaW1lQ29udGVudC5nZXRUeXBlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gcmV0dXJuIHRoZSBpbnZhbGlkIGVsZW1lbnQKLSAgICAgICAgICByZXR1cm4gbWltZUNvbnRlbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgYWxsIG1pbWU6Y29udGVudCBlbGVtZW50cy4KLSAgICogQHBhcmFtIGV4dEVsZW1zIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHRoYXQgY2FuIGNvbnRhaW4gbWltZTpjb250ZW50Uy4KLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBtaW1lOmNvbnRlbnQgZWxlbWVudHMgZm91bmQuCi0gICAqLwotICBwcml2YXRlIExpc3QgZ2V0TWltZUNvbnRlbnRFbGVtZW50cyhMaXN0IGV4dEVsZW1zKQotICB7Ci0gICAgTGlzdCBtaW1lQ29udGVudEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgaWYgKGV4dEVsZW1zICE9IG51bGwpCi0gICAgewotICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0RWxlbXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1zLmdldChpKTsKLSAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgIGlmIChleHRFbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfTUlNRV9NVUxUSVBBUlQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgbWltZTpwYXJ0IGVsZW1lbnRzIG9mIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgICBMaXN0IG1pbWVQYXJ0cyA9ICgoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dEVsZW0pLmdldE1JTUVQYXJ0cygpOwotICAgICAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1pbWVQYXJ0cy5zaXplKCk7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzIG9mIHRoaXMgbWltZTpwYXJ0Ci0gICAgICAgICAgICBMaXN0IGVsZW1zID0gZ2V0TWltZUNvbnRlbnRFbGVtZW50cygKLSAgICAgICAgICAgICAgKChNSU1FUGFydCkgbWltZVBhcnRzLmdldChqKSkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBlbGVtZW50cyB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgICAgbWltZUNvbnRlbnRFbGVtZW50cy5hZGRBbGwoZWxlbXMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBFbHNlIGlmIHRoZSBlbGVtZW50IGlzIG1pbWU6Y29udGVudAotICAgICAgICBlbHNlIGlmIChleHRFbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfTUlNRV9DT05URU5UKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEFkZGluZyB0aGUgZWxlbWVudCB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgIG1pbWVDb250ZW50RWxlbWVudHMuYWRkKGV4dEVsZW0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbWVDb250ZW50RWxlbWVudHM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjk0Ni5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5NDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU1NTczOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjk0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMjk0NgotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgIHdpdGggYXQgbGVhc3Qgb25lIG1pbWU6Y29udGVudCBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkluIGEgREVTQ1JJUFRJT04sIGEgbWltZTpjb250ZW50IGVsZW1lbnQKLSAqIGluY2x1ZGVzIHRoZSBwYXJ0IGF0dHJpYnV0ZS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAyOTQ2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTQ2KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgYSBiaW5kaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQotICAgICAgLy8gbWltZTpjb250ZW50IGVsZW1lbnQKLSAgICAgIGJvb2xlYW4gbWltZUNvbnRlbnRzRm91bmQgPSBmYWxzZTsKLQotICAgICAgLy8gR2V0dGluZyBhIHdzZGw6YmluZGluZwotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgaXRzIHdzZGw6b3BlcmF0aW9uIGVsZW1lbnRzCi0gICAgICBMaXN0IG9wcyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLQotICAgICAgLy8gR29pbmcgdGhyb3VnaCB0aGUgb3BlcmF0aW9uIGVsZW1lbnRzCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIG9wcy5nZXQoaSk7Ci0KLSAgICAgICAgLy8gR2V0dGluZyB3c2RsOmlucHV0IGFuZCB3c2RsOm91dHB1dCBlbGVtZW50cyBvZiBhbiBvcGVyYXRpb24KLSAgICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpOwotCi0gICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtaW1lOmNvbnRlbnQgZWxlbWVudHMgZnJvbSB3c2RsOmlucHV0IGFuZCB3c2RsOm91dHB1dAotICAgICAgICBMaXN0IGlucHV0TWltZUNvbnRlbnRzID0gZ2V0TWltZUNvbnRlbnRFbGVtZW50cygKLSAgICAgICAgICBiaW5kaW5nSW5wdXQgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nSW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICBMaXN0IG91dHB1dE1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50RWxlbWVudHMoCi0gICAgICAgICAgYmluZGluZ091dHB1dCA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmdPdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCi0gICAgICAgIC8vIElmIHRoZSB3c2RsOmlucHV0IGNvbnRhaW5zIG1pbWU6Y29udGVudCBlbGVtZW50cwotICAgICAgICBpZiAoIWlucHV0TWltZUNvbnRlbnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIG1pbWVDb250ZW50c0ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG1pbWU6Y29udGVudCB0aGF0IGRvZXMgbm90IGluY2x1ZGUKLSAgICAgICAgICAvLyB0aGUgcGFydCBhdHRyaWJ1dGUsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKGhhc0ludmFsaWRNaW1lQ29udGVudChpbnB1dE1pbWVDb250ZW50cykpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGludmFsaWQgbWltZTpjb250ZW50IGVsZW1lbnQiCi0gICAgICAgICAgICAgICsgIiBpcyBpbiB0aGUgd3NkbDppbnB1dCBvZiB0aGUgXCIiICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkKLSAgICAgICAgICAgICAgKyAiXCIgYmluZGluZyBvcGVyYXRpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDpvdXRwdXQgY29udGFpbnMgbWltZTpjb250ZW50IGVsZW1lbnRzCi0gICAgICAgIGlmICghb3V0cHV0TWltZUNvbnRlbnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIG1pbWVDb250ZW50c0ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG1pbWU6Y29udGVudCB0aGF0IGRvZXMgbm90IGluY2x1ZGUKLSAgICAgICAgICAvLyB0aGUgcGFydCBhdHRyaWJ1dGUsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKGhhc0ludmFsaWRNaW1lQ29udGVudChvdXRwdXRNaW1lQ29udGVudHMpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBpbnZhbGlkIG1pbWU6Y29udGVudCBlbGVtZW50IgotICAgICAgICAgICAgICArICIgaXMgaW4gdGhlIHdzZGw6b3V0cHV0IG9mIHRoZSBcIiIgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKQotICAgICAgICAgICAgICArICJcIiBiaW5kaW5nIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGUgYmluZGluZyBjb250YWlucyBubyBtaW1lOmNvbnRlbnQgZWxlbWVudHMsCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoIW1pbWVDb250ZW50c0ZvdW5kKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgYWxsIG1pbWU6Y29udGVudCBlbGVtZW50cy4KLSAgICogQHBhcmFtIGV4dEVsZW1zIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHRoYXQgY2FuIGNvbnRhaW4gbWltZTpjb250ZW50Uy4KLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBtaW1lOmNvbnRlbnQgZWxlbWVudHMgZm91bmQuCi0gICAqLwotICBwcml2YXRlIExpc3QgZ2V0TWltZUNvbnRlbnRFbGVtZW50cyhMaXN0IGV4dEVsZW1zKQotICB7Ci0gICAgTGlzdCBtaW1lQ29udGVudEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgaWYgKGV4dEVsZW1zICE9IG51bGwpCi0gICAgewotICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0RWxlbXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1zLmdldChpKTsKLSAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgIGlmIChleHRFbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfTUlNRV9NVUxUSVBBUlQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgbWltZTpwYXJ0IGVsZW1lbnRzIG9mIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgICBMaXN0IG1pbWVQYXJ0cyA9ICgoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dEVsZW0pLmdldE1JTUVQYXJ0cygpOwotICAgICAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1pbWVQYXJ0cy5zaXplKCk7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzIG9mIHRoaXMgbWltZTpwYXJ0Ci0gICAgICAgICAgICBMaXN0IGVsZW1zID0gZ2V0TWltZUNvbnRlbnRFbGVtZW50cygKLSAgICAgICAgICAgICAgKChNSU1FUGFydCkgbWltZVBhcnRzLmdldChqKSkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBlbGVtZW50cyB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgICAgbWltZUNvbnRlbnRFbGVtZW50cy5hZGRBbGwoZWxlbXMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBFbHNlIGlmIHRoZSBlbGVtZW50IGlzIG1pbWU6Y29udGVudAotICAgICAgICBlbHNlIGlmIChleHRFbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfTUlNRV9DT05URU5UKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEFkZGluZyB0aGUgZWxlbWVudCB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgIG1pbWVDb250ZW50RWxlbWVudHMuYWRkKGV4dEVsZW0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbWVDb250ZW50RWxlbWVudHM7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIG1pbWU6Y29udGVudCBlbGVtZW50cy4KLSAgICogQHBhcmFtIG1pbWVDb250ZW50cyBhIGxpc3Qgb2YgbWltZTpjb250ZW50IGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IG1pbWU6Y29udGVudCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBwYXJ0IGF0dHJpYnV0ZSwKLSAgICogZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaGFzSW52YWxpZE1pbWVDb250ZW50KExpc3QgbWltZUNvbnRlbnRzKQotICB7Ci0gICAgLy8gR29pbmcgdGhyb3VnaCBhIGxpc3Qgb2YgbWltZTpjb250ZW50IGVsZW1lbnRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW1lQ29udGVudHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgLy8gSWYgYSBtaW1lOmNvbnRlbnQgZG9lcyBub3QgaW5jbHVkZSB0aGUgcGFydCBhdHRyaWJ1dGUsIHJldHVybiB0cnVlCi0gICAgICBpZiAoKChNSU1FQ29udGVudCkgbWltZUNvbnRlbnRzLmdldChpKSkuZ2V0UGFydCgpID09IG51bGwpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAvLyBUaGVyZSBhcmUgbm8gaW52YWxpZCBtaW1lOmNvbnRlbnRTLCByZXR1cm4gZmFsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAxMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1MTkzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSogQlAyMDEwLgotKiAiTmFtZSIgYXR0cmlidXRlcyBvZiBPcGVyYXRpb25zIGFyZSB1bmlxdWUgYWNyb3NzIHRoZSB3c2RsOnBvcnRUeXBlIGRlZmluaXRpb24gCi0qCi0qIEB2ZXJzaW9uIDEuMC4xIDI3LjA2LjIwMDMKLSogQGF1dGhvciBWaXRhbGkgRmVkb3NlbmtvCi0qKi8KLXB1YmxpYyBjbGFzcyBCUDIwMTAgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwMTAoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyBHZXQgdGhlIHBvcnRUeXBlIGZyb20gdGhlIGVudHJ5IGNvbnRleHQKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIENoZWNrIHRoZSBvcGVyYXRpb25zIG5hbWVzIGZvciB1bmlxdWVuZXNzIHdpdGhpbiB0aGUgY2FuZGlkYXRlIFBvcnQgVHlwZSBpbiB0aGUgV1NETCAKLSAgICBJdGVyYXRvciBvcHM7Ci0gICAgSGFzaFNldCBuYW1lc1NlZW4gPSBuZXcgSGFzaFNldCgpOwotICAgIEhhc2hTZXQgZHVwbGljYXRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgTGlzdCBvcHNMaXN0ID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgaWYgKG9wc0xpc3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgLy8gbm8gb3BlcmF0aW9ucyBmb3VuZCBpbiBwb3J0VHlwZQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvcHMgPSBvcHNMaXN0Lml0ZXJhdG9yKCk7IC8vIHdpbGwgdXNlIENhbmRpZGF0ZS5nZXRPcGVyYXRpb25zKCkKLSAgICAgICAgd2hpbGUgKG9wcy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBPcGVyYXRpb24gb3AgPSAoT3BlcmF0aW9uKSBvcHMubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBvcE5hbWUgPSBvcC5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKG5hbWVzU2Vlbi5jb250YWlucyhvcE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGR1cGxpY2F0ZXMuYWRkKG9wTmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lc1NlZW4uYWRkKG9wTmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICghZHVwbGljYXRlcy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBmYWlsSW5mbyA9Ci0gICAgICAgICAgbmV3IFN0cmluZ0J1ZmZlcigKLSAgICAgICAgICAgICJEdXBsaWNhdGUgb3BlcmF0aW9uIG5hbWVzIGluIHBvcnRUeXBlICIKLSAgICAgICAgICAgICAgKyBwb3J0VHlwZS5nZXRRTmFtZSgpCi0gICAgICAgICAgICAgICsgIjogIik7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBkdXBsaWNhdGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGZhaWxJbmZvLmFwcGVuZCgoU3RyaW5nKSBpLm5leHQoKSArICI7ICIpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKGZhaWxJbmZvLnRvU3RyaW5nKCkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkKLSAgICB7IC8vID8/IG5vIG9wZXJhdGlvbnMgZm91bmQsIGJ1dCBkb2VzIG5vdCBmYWlsIHRoZSBhc3NlcnRpb24uCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCwgcG9ydFR5cGUpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDExLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2UxNWNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogQlAyMDExLgotICogVGhlIGltcG9ydGVkIFhNTCBzY2hlbWEgaXMgYSB3ZWxsLWZvcm1lZCBYTUwgMS4wIGRvY3VtZW50IGFuZCBpZiBpdCBjb250YWlucyBhbiAKLSAqIFhNTCBkZWNsYXJhdGlvbiwgaXQgaXMgdmVyc2lvbiAxLjAuIAotICoKLSAqIEB2ZXJzaW9uIDEuMC4xIDI3LjA2LjIwMDMKLSAqIEBhdXRob3IgVml0YWxpIEZlZG9zZW5rbwotKiovCi1wdWJsaWMgY2xhc3MgQlAyMDExIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMDExKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gT01NSVRFRF9YTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUyA9Ci0gICAgbmV3IGNoYXJbXSB7IDB4MjAsIDB4OSwgMHhELCAweEEsICdcJycsICdcIicgfTsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gWE1MX0RFQ0xBUkFUSU9OX0RFTElNSVRFUlMgPSBuZXcgY2hhcltdIHsgJz0nIH07Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFZFUlNJT05fVE9LRU4gPSAidmVyc2lvbiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMS4wIjsKLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLQotICAgIC8vRGVmaW5pdGlvbiBkZWYgPSAoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIExpc3QgZXh0cyA9IG51bGw7Ci0gICAgLy9pZiAoZGVmLmdldFR5cGVzKCkhPW51bGwpCi0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgZXh0cyA9IHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIH0KLSAgICBpZiAoZXh0cyAhPSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoKGRlZmluaXRpb24gPQotICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXREZWZpbml0aW9uKHR5cGVzKSkKLSAgICAgICAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgdHlwZXMgZGVmaW5pdGlvbiBpbiBhbnkgV1NETCBkb2N1bWVudC4iKTsKLSAgICAgIH0KLQotICAgICAgSXRlcmF0b3IgaXQgPSBleHRzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlbCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotICAgICAgICBpZiAoZWwgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgICAgc2VhcmNoRm9yU2NoZW1hKCgoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBlbCkuZ2V0RWxlbWVudCgpLAotICAgICAgICAgICAgICBkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9IC8qZWxzZQotICAgICAgICAgCQkJcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ki8KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKiBTZWFyY2ggeHNkIHNjaGVtYSBvciB4c2QgaW1wb3J0IGZyb20gbm9kZS4gSWYgbm9kZSBpcyB4c2QgaW1wb3J0IGl0J3MgbG9hZGluZyBzY2hlbWEuCi0gICAqIEBwYXJhbSBuIC0gVW5rbm93bkV4dGVuY2liaWxpdHlFbGVtZW50Ci0gICovCi0gIHByaXZhdGUgdm9pZCBzZWFyY2hGb3JTY2hlbWEoTm9kZSBuLCBTdHJpbmcgY29udGV4dCkKLSAgewotICAgIHdoaWxlIChuICE9IG51bGwpCi0gICAgewotICAgICAgLy8gc2VhcmNoZXMgZm9yIHhzZDppbXBvcnQgZWxlbWVudAotICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IG4uZ2V0Tm9kZVR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgeHNkOnNjaGVtYSBlbGVtZW50IGlzIGZvdW5kIC0+IHByb2Nlc3Mgc2NoZW1hCi0gICAgICAgIGlmIChYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfU0NIRU1BKSkKLSAgICAgICAgICBwcm9jZXNzU2NoZW1hKG4sIGNvbnRleHQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgLy8gaWYgeHNkOmltcG9ydCBlbGVtZW50IGlzIGZvdW5kIC0+IGxvYWQgc2NoZW1hIGFuZCBwcm9jZXNzIHNjaGVtYQotICAgICAgICAgIC8vIEZJWEVEOiBpZiB4c2Q6aW1wb3J0IGlzIGZvdW5kIGFuZCBwYXJlbnQgZWxlbWVudCBpcyB4c2Q6c2NoZW1hCi0gICAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpCi0gICAgICAgICAgICAmJiBYTUxVdGlscy5lcXVhbHMobi5nZXRQYXJlbnROb2RlKCksIEVMRU1fWFNEX1NDSEVNQSkpCi0gICAgICAgICAgICBsb2FkU2NoZW1hKG4sIGNvbnRleHQpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIC8vIGVsc2UgaXRlcmF0ZSBlbGVtZW50IHJlY3Vyc2l2ZWx5Ci0gICAgICAgICAgICBzZWFyY2hGb3JTY2hlbWEobi5nZXRGaXJzdENoaWxkKCksIGNvbnRleHQpOwotICAgICAgfQotICAgICAgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBJdCBsb2FkcyB4c2Qgc2NoZW1hIGFuZCB0aGVuIGNoZWNrIHRoZSB2ZXJzaW9uIDEuMCBhbmQgbG9va2luZyBmb3IgeHNkOnNjaGVtYSBlbGVtZW50IGZvciBuZXh0IHByb2Nlc3MuCi0gICAqIEBwYXJhbSBpbXBvcnROb2RlIHhzZCBzY2hlbWEKLSAgKi8KLSAgcHJpdmF0ZSB2b2lkIGxvYWRTY2hlbWEoTm9kZSBpbXBvcnROb2RlLCBTdHJpbmcgY29udGV4dCkKLSAgewotICAgIEVsZW1lbnQgaW0gPSAoRWxlbWVudCkgaW1wb3J0Tm9kZTsKLSAgICBBdHRyIHNjaGVtYUxvY2F0aW9uID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGltLCBBVFRSX1hTRF9TQ0hFTUFMT0NBVElPTik7Ci0gICAgLy8gdHJ5IHRvIHBhcnNlIGltcG9ydGVkIFhTRAotICAgIGlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmIHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgYW55IGVycm9yIG9yIHJvb3QgZWxlbWVudCBpcyBub3QgWFNEIHNjaGVtYSAtPiBlcnJvcgotICAgICAgICBTdHJpbmcgZGVjbCA9Ci0gICAgICAgICAgcmVhZFhNTERlY2xhcmF0aW9uU3RhdGVtZW50KHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksIGNvbnRleHQpOwotICAgICAgICBpZiAoIXZhbGlkVmVyc2lvbihkZWNsKSkKLSAgICAgICAgewotICAgICAgICAgIEF0dHIgYSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZShpbSwgQVRUUl9YU0RfTkFNRVNQQUNFKTsKLSAgICAgICAgICBlcnJvcnMuYWRkKChhICE9IG51bGwpID8gYS5nZXRWYWx1ZSgpIDogIiIpOwotICAgICAgICB9Ci0gICAgICAgIERvY3VtZW50IHNjaGVtYSA9Ci0gICAgICAgICAgdmFsaWRhdG9yLnBhcnNlWE1MRG9jdW1lbnRVUkwoc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSwgY29udGV4dCk7Ci0gICAgICAgIGlmIChYTUxVdGlscy5lcXVhbHMoc2NoZW1hLmdldERvY3VtZW50RWxlbWVudCgpLCBFTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICB7Ci0gICAgICAgICAgQXR0ciBhID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGltLCBBVFRSX1hTRF9OQU1FU1BBQ0UpOwotICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoYSAhPSBudWxsKSA/IGEuZ2V0VmFsdWUoKSA6ICIiOwotICAgICAgICAgIHByb2Nlc3NTY2hlbWEoc2NoZW1hLmdldERvY3VtZW50RWxlbWVudCgpLAotICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlVVJMU3RyaW5nKHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksIGNvbnRleHQpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gZWxzZSBpZiB0aGVyZSBpcyBvbmx5IHRoZSBuYW1lc3BhY2UgYXR0cmlidXRlLCB0aGUgaW1wb3J0IHJlbGF0ZXMgdG8gaW5saW5lIHNjaGVtYQotICAgIGVsc2UgaWYgKFhNTFV0aWxzLmdldEF0dHJpYnV0ZShpbSwgQVRUUl9YU0RfTkFNRVNQQUNFKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFJlYWRzIGFuIFhNTCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuCi0gICogQHBhcmFtIGxvY2F0aW9uCi0gICogQHJldHVybiBTdHJpbmcKLSAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVhZFhNTERlY2xhcmF0aW9uU3RhdGVtZW50KFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIGJhc2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIC8vIG5vdGhpbmcKLSAgICAgIGludCBpID0gYmFzZVVSSS5sYXN0SW5kZXhPZignLycpOwotICAgICAgaW50IGogPSBiYXNlVVJJLmxhc3RJbmRleE9mKCdcXCcpOwotICAgICAgaWYgKGogPiBpKQotICAgICAgICBpID0gajsKLSAgICAgIGxvY2F0aW9uID0gYmFzZVVSSS5zdWJzdHJpbmcoMCwgaSArIDEpICsgbG9jYXRpb247Ci0gICAgfQotCi0gICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd2Ugc2hvdWxkIHRyeSB0byBhY2Nlc3MgbG9jYXRpb24gYXMgZmlsZQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVybCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHVybC5vcGVuU3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGxvY2F0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgY2hhckNvZGU7Ci0gICAgICAgIGJvb2xlYW4gZW5kID0gZmFsc2U7Ci0gICAgICAgIGlmIChyZWFkZXIucmVhZHkoKSkKLSAgICAgICAgewotICAgICAgICAgIGNoYXJDb2RlID0gcmVhZGVyLnJlYWQoKTsKLQotICAgICAgICAgIHdoaWxlIChyZWFkZXIucmVhZHkoKSAmJiAhKGNoYXJDb2RlID09ICc8JykpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hhckNvZGUgPSByZWFkZXIucmVhZCgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgaWYgKGNoYXJDb2RlID09ICc8JykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKChjaGFyKSBjaGFyQ29kZSk7Ci0gICAgICAgICAgICB3aGlsZSAocmVhZGVyLnJlYWR5KCkgJiYgIWVuZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2hhckNvZGUgPSByZWFkZXIucmVhZCgpOwotICAgICAgICAgICAgICBidWYuYXBwZW5kKChjaGFyKSBjaGFyQ29kZSk7Ci0KLSAgICAgICAgICAgICAgZW5kID0gY2hhckNvZGUgPT0gJz4nOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gTk9URTogVGhpcyByZXN1bHQgZG9lcyBub3QgZ2V0IHByb3BvZ2F0ZWQgYmFjayEKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPQotICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgdGhlIFhNTCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuIjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICByZXN1bHQgPSBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoKLSAgICogQHBhcmFtIHhtbERlY2wgLSB4bWwgZGVjbGFyYXRpb24KLSAgICogQHJldHVybiBpZiB4bWwgZGVjbGFyYXRpb24gY29udGFpbnMgdmVyc2lvbj0iMS4wIiBpdCByZXRpcm5zIHRydWUuIAotICAqLwotICBwcml2YXRlIGJvb2xlYW4gdmFsaWRWZXJzaW9uKFN0cmluZyB4bWxEZWNsKQotICB7Ci0gICAgLy9ib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBpZiAoeG1sRGVjbCAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9Ci0gICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0gICAgICAgICAgT01NSVRFRF9YTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUywKLSAgICAgICAgICBYTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUyk7Ci0gICAgICBFbnVtZXJhdGlvbiB0b2tlbnMgPSBzdC5wYXJzZSh4bWxEZWNsKTsKLSAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgIHdoaWxlICh0b2tlbnMuaGFzTW9yZUVsZW1lbnRzKCkgJiYgIWZvdW5kKQotICAgICAgewotICAgICAgICBTdHJpbmcgdG9rZW4gPSAoU3RyaW5nKSB0b2tlbnMubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAodG9rZW4uZXF1YWxzSWdub3JlQ2FzZShWRVJTSU9OX1RPS0VOKSkKLSAgICAgICAgewotICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLQotICAgICAgICAgIHRva2Vucy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIFN0cmluZyB2ZXIgPSAoU3RyaW5nKSB0b2tlbnMubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICAgIHJlc3VsdCA9IFZFUlNJT04uZXF1YWxzKHZlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoKLSAgICogSXQncyBsb2tpbmcgZm9yIHhzZCBpbXBvcnQgYW5kIGxvYWQgaXQgaWYgZmluZC4KLSAgICogQHBhcmFtIHNjaGVtYSB4c2Qgc2NoZW1hCi0gICovCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzU2NoZW1hKE5vZGUgc2NoZW1hLCBTdHJpbmcgY29udGV4dCkKLSAgewotICAgIE5vZGUgbiA9IHNjaGVtYS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKG4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpCi0gICAgICAgICYmIFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpKQotICAgICAgICBsb2FkU2NoZW1hKG4sIGNvbnRleHQpOwotCi0gICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDEyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTMzYzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsLldTRExWYWxpZGF0b3JJbXBsLkJpbmRpbmdNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAgKiBCUDIwMTIuCi0gICogRXhhbXBsZToKLSAgKiAKLSAgKiA8bWVzc2FnZSBuYW1lPSJnZXRDb25maWd1cmF0aW9uT3B0aW9uc1JlcXVlc3QiPgotICAqIAk8cGFydCBuYW1lPSJyZWZyZXNoIiBlbGVtZW50PSJjZmc6cmVmcmVzaCIgLz4gCi0gICogPC9tZXNzYWdlPgotICAqIDxwb3J0VHlwZSBuYW1lPSJDb25maWd1cmF0b3JQb3J0VHlwZSI+Ci0gICogCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q29uZmlndXJhdGlvbk9wdGlvbnMiPgotICAqIAkJPGlucHV0IG1lc3NhZ2U9InRuczpnZXRDb25maWd1cmF0aW9uT3B0aW9uc1JlcXVlc3QiIC8+IAotICAqIAkJPG91dHB1dCAuLi4uLiAvPiAKLSAgKiAJCTxmYXVsdCAuLi4uLiAvPiAKLSAgKiAJPC9vcGVyYXRpb24+Ci0gICogPC9wb3J0VHlwZT4KLSAgKiA8YmluZGluZyBuYW1lPSJDb25maWd1cmF0b3JCaW5kaW5nIiB0eXBlPSJ0bnM6Q29uZmlndXJhdG9yUG9ydFR5cGUiPgotICAqIAk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiIC8+IAotICAqIAk8b3BlcmF0aW9uIG5hbWU9ImdldENvbmZpZ3VyYXRpb25PcHRpb25zIj4KLSAgKgkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly93d3cuenp6LmNvbS96enoud3NkbC9nZXRDb25maWd1cmF0aW9uT3B0aW9ucyIgLz4gCi0gICogCQk8aW5wdXQ+Ci0gICogCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3d3dy56enouY29tL3p6ei53c2RsIiAvPiAKLSAgKiAJCTwvaW5wdXQ+Ci0gICogCQk8b3V0cHV0Pi4uLi4uPC9vdXRwdXQ+Ci0gICoJCTxmYXVsdD4uLi4uLi48L2ZhdWx0PgotICAqIAk8L29wZXJhdGlvbj4KLSAgKiA8L2JpbmRpbmc+Ci0gICogCi0gICogQWJvdmUsIHRoZSB0ZXN0IGZvciB0aGlzIGFzc2VydGlvbiBtaWdodCBiZSB0aGF0IHRoZSBlbGVtZW50IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgaW4gdGhlICJyZWZyZXNoIiAKLSAgKiBwYXJ0IG9mIHRoZSBnZXRDb25maWd1cmF0aW9uT3B0aW9uc1JlcXVlc3QgbWVzc2FnZS4gCi0gICogCi0gICogQ29udGV4dCA6IGZvciA8YmluZGluZz4gIkNvbmZpZ3VyYXRvckJpbmRpbmciLCA8c29hcDpiaW5kaW5nPiBzdHlsZT1kb2N1bWVudDsgPHNvYXA6Ym9keT4gdXNlPWxpdGVyYWwKLSAgKiBmb3IgdGhlIDxpbnB1dD4gb2YgYmluZGluZyBvcGVyYXRpb24gImdldENvbmZpZ3VyYXRpb25PcHRpb25zIi4gCi0gICogKDxpbnB1dD4gaXMgYW4gZXhhbXBsZS4gQ291bGQgYmUgPG91dHB1dD4gb3IgPGZhdWx0PiBlcXVhbGx5KS4KLSAgKiBBY3Rpb246IGNoZWNrIHRoZSBwYXJ0KHMpIG9mIHRoZSBtZXNzYWdlIHNwZWNpZmllZCBpbiB0aGUgPGlucHV0PiBlbGVtZW50IChpbiBleGFtcGxlKSBvZiB0aGUgPHBvcnRUeXBlPiwKLSAgKiBuYW1lbHkgdG5zOmdldENvbmZpZ3VyYXRpb25PcHRpb25zUmVxdWVzdCwgdGhhdCB0aGUgZWxlbWVudCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZQotICAqIDxwYXJ0IG5hbWU9InJlZnJlc2giIGVsZW1lbnQ9ImNmZzpyZWZyZXNoIiAvPiwgc28gdGhlIHRlc3QgcGFzc2VzLgotICAqIEFsbCBzdWNoIHBhcnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzZXJ0aW9uIGNhbmRpZGF0ZSBiaW5kaW5nKHMpIG11c3QgYmUgc2ltaWxhcmx5IGNoZWNrZWQgZm9yIHRoaXMgYXNzZXJ0aW9uCi0gICogdG8gcGFzcy4KLSAgKi8KLXB1YmxpYyBjbGFzcyBCUDIwMTIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwMTIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIAotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCBiaW5kaW5nIGZyb20gZW50cnkgY29udGV4dAotCi0gICAgLy8gT2xlZydzICYgR3JhaGFtJ3MgdmVyc2lvbjoKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIHRvIHVzZSBvcmlnaW5hbCB2ZXJzaW9uIHJlcXVpcmUgYSBiaW5kaW5nIGFycmF5Ci0gICAgLy9CaW5kaW5nW10gYmluZGluZyA9IHsoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKX07Ci0KLSAgICAvLyBnZXQgbGlzdCBvZiBjYW5kaWRhdGUgbWF0Y2hlcwotICAgIEJpbmRpbmdNYXRjaFtdIGJpbmRpbmdNYXRjaCA9Ci0gICAgICB0aGlzLnZhbGlkYXRvci5nZXRCaW5kaW5nTWF0Y2hlcygKLSAgICAgICAgYmluZGluZywKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQywKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQpOwotICAgIGlmIChiaW5kaW5nTWF0Y2gubGVuZ3RoID09IDApCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmICghdGhpcy52YWxpZGF0b3IuY2hlY2tQYXJ0QXR0cmlidXRlcyhiaW5kaW5nTWF0Y2gsICJ1c2VJbnB1dCIsICJ1c2VFbGVtZW50IikKLSAgICAgICAgICB8fCAhdGhpcy52YWxpZGF0b3IuY2hlY2tQYXJ0QXR0cmlidXRlcyhiaW5kaW5nTWF0Y2gsICJ1c2VPdXRwdXQiLCAidXNlRWxlbWVudCIpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oImRpYWdub3N0aWM6IGludGVybmFsIHByb2Nlc3NpbmcgZXJyb3IhIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQsIGJpbmRpbmcpOwotICAgICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5M2EzNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbC5XU0RMVmFsaWRhdG9ySW1wbC5CaW5kaW5nTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLQotLyoqCi0gKiBCUDIwMTMuCi0gKiBUaGUgYmluZGluZyAoaW4gc29hcGJpbmQ6Ym9keSBlbGVtZW50cykgb25seSByZWZlcnMgdG8gcGFydCBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIHVzaW5nIHRoZSAidHlwZSIgYXR0cmlidXRlLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xIDI3LjA2LjIwMDMKLSAqIEBhdXRob3IgVml0YWxpIEZlZG9zZW5rbwotICovCi1wdWJsaWMgY2xhc3MgQlAyMDEzIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMDEzKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCBiaW5kaW5nIGZyb20gZW50cnkgY29udGV4dAotCi0gICAgLy8gT2xlZydzICYgR3JhaGFtJ3MgdmVyc2lvbjoKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIHRvIHVzZSBvcmlnaW5hbCB2ZXJzaW9uIHJlcXVpcmUgYSBiaW5kaW5nIGFycmF5Ci0gICAgLy9CaW5kaW5nW10gYmluZGluZyA9IHsoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKX07Ci0KLSAgICAvLyBnZXQgbGlzdCBvZiBjYW5kaWRhdGUgbWF0Y2hlcwotICAgIEJpbmRpbmdNYXRjaFtdIGJpbmRpbmdNYXRjaCA9Ci0gICAgICB0aGlzLnZhbGlkYXRvci5nZXRCaW5kaW5nTWF0Y2hlcygKLSAgICAgICAgYmluZGluZywKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQywKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQpOwotICAgIGlmIChiaW5kaW5nTWF0Y2gubGVuZ3RoID09IDApCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmICghdGhpcy52YWxpZGF0b3IuY2hlY2tQYXJ0QXR0cmlidXRlcyhiaW5kaW5nTWF0Y2gsICJ1c2VJbnB1dCIsICJ1c2VUeXBlIikKLSAgICAgICAgICB8fCAhdGhpcy52YWxpZGF0b3IuY2hlY2tQYXJ0QXR0cmlidXRlcyhiaW5kaW5nTWF0Y2gsICJ1c2VPdXRwdXQiLCAidXNlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oImRpYWdub3N0aWM6IGludGVybmFsIHByb2Nlc3NpbmcgZXJyb3IhIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQsIGJpbmRpbmcpOwotICAgICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTA4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0gKiBCUDIwMTQuCi0gKiBDb250ZXh0OgotICogRm9yIGEgY2FuZGlkYXRlIHdzZGw6b3BlcmF0aW9uLCBpZiByZWZlcnJlZCB0byBieSBhIGNhbmRpZGF0ZSBycGMtbGl0ZXJhbCB3c2RsOmJpbmRpbmcgZWxlbWVudAotICogSWYgdGhlIHBhcmFtZXRlck9yZGVyIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCBpdCBvbWl0cyBhdCBtb3N0IDEgcGFydCBmcm9tIG91dHB1dCB3c2RsOm1lc3NhZ2UuCi0gKiovCi1wdWJsaWMgY2xhc3MgQlAyMDE0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjAxNChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotCi0gIC8qCi0gICAqIEBwYXJhbSBiaW5kaW5nIC0gYmluZGluZwotICAgKiBAcmV0dXJuIEl0IHJldHVybnMgc3R5bGUgb2Ygc29hcCBiaW5kaW5nIG9mIGJpbmRpbmcuIElmIHN0eWxlIG9taXR0ZWQgcmV0dXJucyAiZG9jdW1lbnQiIHN0eWxlLiAgIAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0U09BUEJpbmRpbmdTdHlsZShCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPSBudWxsOwotICAgIExpc3QgbGlzdCA9IGJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChsaXN0LmdldChpKSBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKQotICAgICAgewotICAgICAgICBzdHlsZSA9ICgoU09BUEJpbmRpbmcpIGxpc3QuZ2V0KGkpKS5nZXRTdHlsZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHN0eWxlID09IG51bGwpCi0gICAgICBzdHlsZSA9IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0M7Ci0gICAgcmV0dXJuIHN0eWxlOwotICB9Ci0KLSAgLyoKLSAgICogQHBhcmFtIGxpc3QgLSBMaXN0IG9mIGV4dGVuY2liaWxpdHkgZWxlbWVudHMgZnJvbSBiaW5kaW5nIG91dHB1dAotICAgKiBAcmV0dXJuIGZpcnN0IHNvYXAgYm9keSBpbiBsaXN0LgotICAgKi8KLSAgcHJpdmF0ZSBTT0FQQm9keSBnZXRTT0FQQm9keShMaXN0IGxpc3QpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspCi0gICAgICBpZiAobGlzdC5nZXQoaSkgaW5zdGFuY2VvZiBTT0FQQm9keSkKLSAgICAgICAgcmV0dXJuIChTT0FQQm9keSkgbGlzdC5nZXQoaSk7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKgotICAgKiBAcGFyYW0gbGlzdCAtIExpc3Qgb2YgZXh0ZW5jaWJpbGl0eSBlbGVtZW50cyBvZiBiaW5kaW5nIG9wZXJhdGlvbgotICAgKiBAcmV0dXJuIEZpcnN0IHNvYXAgb3BlcmF0aW9uIGluIGxpc3QuCi0gICAqLwotICBwcml2YXRlIFNPQVBPcGVyYXRpb24gZ2V0U09BUE9wZXJhdGlvbihMaXN0IGxpc3QpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspCi0gICAgICBpZiAobGlzdC5nZXQoaSkgaW5zdGFuY2VvZiBTT0FQT3BlcmF0aW9uKQotICAgICAgICByZXR1cm4gKFNPQVBPcGVyYXRpb24pIGxpc3QuZ2V0KGkpOwotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogICAgICAgICAgCi0gICAqIEBwYXJhbSBvcGVyIC0gb3BlcmF0aW9uCi0gICAqIEBwYXJhbSBiaW5kaW5nIC0gYmluZGluZwotICAgKiBAcmV0dXJuIGlmIHN0eWxlIG9mIHNvYXAgYmluZGluZyBvZiBiaW5kaW5nIGlzIHJwYyBhbmQgdXNlIG9mIHNvYXAgYm9keSBvZiBiaW5kaW5nIG91dHB1dCBvZiBiaW5kaW5nIG9wZXJhdGlvbiBpcyBsaXRlcmFsIHRoZW4gaXQgcmV0dXJucyB0cnVlLiAKLSAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGNoZWNrUnBjTGl0ZXJhbChCaW5kaW5nT3BlcmF0aW9uIG9wZXIsIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIExpc3QgbGlzdCA9IG9wZXIuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgU09BUE9wZXJhdGlvbiBzb3AgPSBnZXRTT0FQT3BlcmF0aW9uKGxpc3QpOwotICAgIGlmIChzb3AgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBTdHJpbmcgc3R5bGUgPQotICAgICAgKHNvcC5nZXRTdHlsZSgpID09IG51bGwKLSAgICAgICAgPyBnZXRTT0FQQmluZGluZ1N0eWxlKGJpbmRpbmcpCi0gICAgICAgIDogc29wLmdldFN0eWxlKCkpOwotICAgIGlmICghc3R5bGUuZXF1YWxzKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGxpc3QgPSBvcGVyLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBTT0FQQm9keSBib2R5ID0gZ2V0U09BUEJvZHkobGlzdCk7Ci0gICAgaWYgKGJvZHkgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBTdHJpbmcgdXNlID0gYm9keS5nZXRVc2UoKTsKLSAgICBpZiAodXNlID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdXNlLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVCk7Ci0gIH0KLQotICAvKiBJdCBjaGVja3Mgb3BlcmF0aW9uIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgcGFydCBpbiBwYXJhbWV0ZXIgb3JkZXIgCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLk9wZXJhdGlvbiwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KE9wZXJhdGlvbiBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIEJpbmRpbmdbXSBiaW5kaW5ncyA9IHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKCk7Ci0gICAgaWYgKG9iai5nZXRQYXJhbWV0ZXJPcmRlcmluZygpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYmluZGluZ3MgPT0gbnVsbCB8fCBvYmogPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChvYmouZ2V0T3V0cHV0KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChvYmouZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBGb3IgZWFjaCBiaW5kaW5nCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBiaW5kaW5nc1tpXS5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgICAgLy8gRm9yIGVhY2ggYmluZGluZyBvcGVyYXRpb24KLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGlzdC5zaXplKCk7IGorKykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBvcGVyID0gKEJpbmRpbmdPcGVyYXRpb24pIGxpc3QuZ2V0KGopOwotCi0gICAgICAgIC8vIElmIHRoZSBpbnB1dCBvcGVyYXRpb24gbmFtZSBhbmQgYmluZGluZyBvcGVyYXRpbm8gbmFtZSBhcmUgbm90IG51bGwKLSAgICAgICAgaWYgKG9iai5nZXROYW1lKCkgIT0gbnVsbCAmJiBvcGVyLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgdGhlIG9wZXJhdGlvbiBuYW1lcyBhcmUgZXF1YWwKLSAgICAgICAgICBpZiAob2JqLmdldE5hbWUoKS5lcXVhbHMob3Blci5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBvcGVyYXRpb24gaXMgUlBDIGxpdGVyYWwKLSAgICAgICAgICAgIGlmIChjaGVja1JwY0xpdGVyYWwob3BlciwgYmluZGluZ3NbaV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgcGFydHMgaW4gdGhlIHBhcmFtZXRlck9yZGVyIGF0dHJpYnV0ZQkJCQkKLSAgICAgICAgICAgICAgTGlzdCBwYXJ0cyA9IG9iai5nZXRQYXJhbWV0ZXJPcmRlcmluZygpOwotCi0gICAgICAgICAgICAgIE91dHB1dCBvdXRwdXQgPSBudWxsOwotICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICAgICAgICBNYXAgbWVzc2FnZVBhcnRzID0gbnVsbDsKLQotICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgcGFydHMgZm9yIHRoZSBvdXRwdXQgbWVzc2FnZQotICAgICAgICAgICAgICBpZiAoKG91dHB1dCA9IG9iai5nZXRPdXRwdXQoKSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgobWVzc2FnZSA9IG91dHB1dC5nZXRNZXNzYWdlKCkpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcnRzID0gbWVzc2FnZS5nZXRQYXJ0cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBwYXJ0cyBpbiB0aGUgcGFyYW1ldGVyT3JkZXIgYXR0cmlidXRlIAotICAgICAgICAgICAgICAvLyBhbmQgdGhlcmUgYXJlIG91dHB1dCBtZXNzYWdlIHBhcnRzLCB0aGVuIHByb2Nlc3MgYXNzZXJ0aW9uCi0gICAgICAgICAgICAgIGlmIChwYXJ0cyAhPSBudWxsICYmIG1lc3NhZ2VQYXJ0cyAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHBhcnRDb3VudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWU7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJ0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gR2V0IHBhcnQgbmFtZSBmcm9tIHBhcmFtZXRlck9yZGVyIGxpc3QKLSAgICAgICAgICAgICAgICAgIHBhcnROYW1lID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAvLyBDaGVjayBlYWNoIG91dHB1dCBtZXNzYWdlIHBhcnQgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2gKLSAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlUGFydHMuY29udGFpbnNLZXkocGFydE5hbWUpKQotICAgICAgICAgICAgICAgICAgICBwYXJ0Q291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHBhcnRDb3VudCA9PSBtZXNzYWdlUGFydHMuc2l6ZSgpKQotICAgICAgICAgICAgICAgICAgfHwgKHBhcnRDb3VudCA9PSBtZXNzYWdlUGFydHMuc2l6ZSgpIC0gMSkpCi0gICAgICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChvYmouZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgIGN0eC5jYW5jZWxPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwYXJ0cyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgIHRyYXZlcnNhbC52aXNpdE9wZXJhdGlvbih0cnVlKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKChPcGVyYXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgZXJyb3JzLnRvU3RyaW5nKCksCi0gICAgICAgICAgZW50cnlDb250ZXh0LAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotICAgIH0KLSAgICAvL2Vsc2UKLSAgICAvLyAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZjQ1OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAqIEJQMjAxNy4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmc8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlICJzdHlsZSIgYXR0cmlidXRlIG9mIGVhY2ggb3BlcmF0aW9uIGluIHRoZSBjb250YWluZWQgc29hcDpiaW5kaW5nIGhhcyB0aGUgc2FtZSB2YWx1ZSBvZiAiZG9jdW1lbnQiIG9yICJycGMiLCBmb3IgYWxsIG9wZXJhdGlvbnMgb2YgdGhlIHdzZGw6YmluZGluZy48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMDE3IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMDE3KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vU3RyaW5nIGZpcnN0U3R5bGUgPSBudWxsOyAvLyBHVDogaXMgdGhpcyBuZWVkZWQ/PwotICAgIFZlY3RvciBmYWlsdXJlRGV0YWlsTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vIEdldCB0aGUgYmluZGluZyBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0gICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsTGlzdCk7Ci0gICAgfQotICAgIFNPQVBCaW5kaW5nIHNvYXBCID0gV1NETFZhbGlkYXRvckltcGwuZ2V0U29hcEJpbmRpbmcoYmluZGluZyk7Ci0gICAgaWYgKHNvYXBCID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbExpc3QpOwotICAgIH0KLSAgICBTdHJpbmcgc3R5bGVCID0KLSAgICAgIChzb2FwQi5nZXRTdHlsZSgpID09IG51bGwKLSAgICAgICAgPyBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DCi0gICAgICAgIDogc29hcEIuZ2V0U3R5bGUoKSk7Ci0KLSAgICAvLyBUcnkgdG8gZ2V0IHRoZSBTT0FQIG9wZXJhdGlvbnMKLSAgICBIYXNoTWFwIHNvYXBPcGVyYXRpb25MaXN0ID0gdmFsaWRhdG9yLmdldFNvYXBPcGVyYXRpb25zKGJpbmRpbmcpOwotCi0gICAgaWYgKHNvYXBPcGVyYXRpb25MaXN0LmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gY2hlY2sgdGhhdCB0aGV5IGFsbCBoYXZlIHRoZSBzYW1lIHN0eWxlIGVsZW1lbnQgdmFsdWUKLSAgICAgIFN0cmluZyBzdHlsZSA9IG51bGw7Ci0gICAgICBTdHJpbmcgY2hlY2tTdHlsZTsKLSAgICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbjsKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc29hcE9wZXJhdGlvbkxpc3Qua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHNvYXBPcGVyYXRpb24gPSAoU09BUE9wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBjaGVja1N0eWxlID0gc29hcE9wZXJhdGlvbi5nZXRTdHlsZSgpOwotICAgICAgICBpZiAoY2hlY2tTdHlsZSA9PSBudWxsKQotICAgICAgICAgIGNoZWNrU3R5bGUgPSBzdHlsZUI7Ci0gICAgICAgIGlmIChjaGVja1N0eWxlICE9IG51bGwKLSAgICAgICAgICAmJiAhY2hlY2tTdHlsZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQykKLSAgICAgICAgICAmJiAhY2hlY2tTdHlsZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQykpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsTGlzdC5hZGQoCi0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAiT3BlcmF0aW9uIE5hbWU6ICIKLSAgICAgICAgICAgICAgICArIHNvYXBPcGVyYXRpb25MaXN0LmdldChzb2FwT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgICsgIlxuU09BUCBPcGVyYXRpb246ICIKLSAgICAgICAgICAgICAgICArIHNvYXBPcGVyYXRpb24udG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0LAotICAgICAgICAgICAgICBzb2FwT3BlcmF0aW9uKSk7Ci0gICAgICAgICAgLy8gUkVNT1ZFOiBOZWVkIHRvIHByb2Nlc3MgYWxsIG9wZXJhdGlvbnMKLSAgICAgICAgICAvL2JyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0eWxlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHlsZSA9IGNoZWNrU3R5bGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0eWxlLmVxdWFscyhjaGVja1N0eWxlKSB8fCAhc3R5bGUuZXF1YWxzKHN0eWxlQikpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsTGlzdC5hZGQoCi0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAiT3BlcmF0aW9uIE5hbWU6ICIKLSAgICAgICAgICAgICAgICArIHNvYXBPcGVyYXRpb25MaXN0LmdldChzb2FwT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgICsgIlxuU09BUCBPcGVyYXRpb246ICIKLSAgICAgICAgICAgICAgICArIHNvYXBPcGVyYXRpb24udG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0LAotICAgICAgICAgICAgICBzb2FwT3BlcmF0aW9uKSk7Ci0gICAgICAgICAgLy8gUkVNT1ZFOiBOZWVkIHRvIHByb2Nlc3MgYWxsIG9wZXJhdGlvbnMKLSAgICAgICAgICAvL2JyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdHlsZSA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyBubyBzdHlsZSBhdHRyaWJ1dGUgd2FzIGZvdW5kIGluIHRoZSBTT0FQIG9wZXJhdGlvbihzKSBvZiB0aGUgYmluZGluZy4KLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWxMaXN0KTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDE4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2QwYzExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogQlAyMDE4LiAKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBXZWIgc2VydmljZSBkZWZpbml0aW9uPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSB3c2RsOnR5cGVzIGVsZW1lbnQgb2NjdXJzIGVpdGhlciBhcyB0aGUgZmlyc3QgY2hpbGQgaW4gdGhlIFdTREwgbmFtZXNwYWNlIG9mIHRoZSB3c2RsOmRlZmluaXRpb25zIGVsZW1lbnQgaWYgbm8gd3NkbDpkb2N1bWVudGF0aW9uIG9yIHdzZGw6aW1wb3J0IGVsZW1lbnQgaXMgcHJlc2VudDsgb3IgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSB3c2RsOmRvY3VtZW50YXRpb24gZWxlbWVudChzKSBpZiB0aGV5IGFyZSBwcmVzZW50IGJ1dCB3c2RsOmltcG9ydChzKSBhcmUgbm90LCBvciBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYm90aCB0aGUgd3NkbDpkb2N1bWVudGF0aW9uIGFuZCB3c2RsOmltcG9ydCBlbGVtZW4ocykgaWYgcHJlc2VudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMDE4IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMDE4KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKgotICAgKiBAcGFyYW0gZWwgLSB4bWwgZWxlbWVudAotICAgKiBAcmV0dXJuIGlmIGVsZW1lbnQgaXMgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IHJldHVybnMgdHJ1ZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0V4dGVuc2liaWxpdHlFbGVtZW50KEVsZW1lbnQgZWwpCi0gIHsKLSAgICBib29sZWFuIGlzRXggPSB0cnVlOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfQklORElORyk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9ERUZJTklUSU9OUyk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9ET0NVTUVOVEFUSU9OKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0ZBVUxUKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0lNUE9SVCk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9JTlBVVCk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9NRVNTQUdFKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX09QRVJBVElPTik7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9PVVRQVVQpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfUEFSVCk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9QT1JUKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX1BPUlRUWVBFKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX1NFUlZJQ0UpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfVFlQRVMpOwotCi0gICAgcmV0dXJuIGlzRXg7Ci0gIH0KLQotICAvKgotICAgKiBDcmVhdGUgZmFpbGVkIHJlcG9ydC4KLSAgKiBAcGFyYW0gZWwgLSB4bWwgZWxlbWVudAotICAqIEBwYXJhbSBlbnRyeUNvbnRleHQgLSBFbnRyeSBjb250ZXh0Ci0gICovCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVGYWlsZWQoCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgRWxlbWVudCBlbCwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICB7Ci0gICAgUU5hbWUgY29udGV4dCA9Ci0gICAgICAoZWwgIT0gbnVsbCkKLSAgICAgICAgPyBuZXcgUU5hbWUoZWwuZ2V0TmFtZXNwYWNlVVJJKCksIGVsLmdldExvY2FsTmFtZSgpKQotICAgICAgICA6IG5ldyBRTmFtZSgiZGVmaW5pdGlvbiIpOwotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKG1lc3NhZ2UsIGVudHJ5Q29udGV4dCk7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9Ci0gICAgICAoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBQYXJzZSB0aGUgV1NETCBkb2N1bWVudCBhcyBhbiBYTUwgZmlsZQotICAgICAgRG9jdW1lbnQgZG9jID0KLSAgICAgICAgdmFsaWRhdG9yLnBhcnNlWE1MRG9jdW1lbnRVUkwoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSwgbnVsbCk7Ci0KLSAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsgLy8gZ2V0IGRlZmluaXRpb24KLQotICAgICAgRWxlbWVudCB0eXBlcyA9IFhNTFV0aWxzLmZpbmRDaGlsZEVsZW1lbnQoKEVsZW1lbnQpIHJvb3QsIFdTRExfVFlQRVMpOwotCi0gICAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBlbCA9IFhNTFV0aWxzLmZpbmRQcmV2aW91c1NpYmxpbmcodHlwZXMpOwotICAgICAgICB3aGlsZSAoaXNFeHRlbnNpYmlsaXR5RWxlbWVudChlbCkgJiYgZWwgIT0gbnVsbCkKLSAgICAgICAgICBpZiAoZWwgIT0gbnVsbCkKLSAgICAgICAgICAgIGVsID0gWE1MVXRpbHMuZmluZFByZXZpb3VzU2libGluZyhlbCk7Ci0KLSAgICAgICAgYm9vbGVhbiBkb2N1bWVudElzUHJlc2VudCA9Ci0gICAgICAgICAgKFhNTFV0aWxzLmZpbmRDaGlsZEVsZW1lbnQoKEVsZW1lbnQpIHJvb3QsIFdTRExfRE9DVU1FTlRBVElPTikKLSAgICAgICAgICAgICE9IG51bGwpOwotICAgICAgICBib29sZWFuIGltcG9ydElzUHJlc2VudCA9Ci0gICAgICAgICAgKFhNTFV0aWxzLmZpbmRDaGlsZEVsZW1lbnQoKEVsZW1lbnQpIHJvb3QsIFdTRExfSU1QT1JUKSAhPSBudWxsKTsKLQotICAgICAgICBpZiAoaW1wb3J0SXNQcmVzZW50KQotICAgICAgICAgIGlmICghWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0lNUE9SVCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY3JlYXRlRmFpbGVkKAotICAgICAgICAgICAgICAiVHlwZXMgZWxlbWVudCBjYW4gbm90IGZvbGxvdyBpbXBvcnQgZWxlbWVudC4iLAotICAgICAgICAgICAgICBlbCwKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgICAgICAgICB0ZXN0QXNzZXJ0aW9uLAotICAgICAgICAgICAgICByZXN1bHQsCi0gICAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBlbCA9IFhNTFV0aWxzLmZpbmRQcmV2aW91c1NpYmxpbmcoZWwpOwotCi0gICAgICAgIHdoaWxlIChpc0V4dGVuc2liaWxpdHlFbGVtZW50KGVsKSAmJiBlbCAhPSBudWxsKQotICAgICAgICAgIGlmIChlbCAhPSBudWxsKQotICAgICAgICAgICAgZWwgPSBYTUxVdGlscy5maW5kUHJldmlvdXNTaWJsaW5nKGVsKTsKLQotICAgICAgICBpZiAoZG9jdW1lbnRJc1ByZXNlbnQpCi0gICAgICAgICAgaWYgKCFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfRE9DVU1FTlRBVElPTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgY3JlYXRlRmFpbGVkKAotICAgICAgICAgICAgICAiVHlwZXMgZWxlbWVudCBtdXN0IGZvbGxvdyBvbmx5IGEgZG9jdW1lbnRhdGlvbiBlbGVtZW50LiIsCi0gICAgICAgICAgICAgIGVsLAotICAgICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICAgICAgICAgIHRlc3RBc3NlcnRpb24sCi0gICAgICAgICAgICAgIHJlc3VsdCwKLSAgICAgICAgICAgICAgZmFpbHVyZURldGFpbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVsID0gWE1MVXRpbHMuZmluZFByZXZpb3VzU2libGluZyhlbCk7Ci0KLSAgICAgICAgaWYgKCFpbXBvcnRJc1ByZXNlbnQgJiYgIWRvY3VtZW50SXNQcmVzZW50ICYmIGVsICE9IG51bGwpCi0gICAgICAgICAgY3JlYXRlRmFpbGVkKAotICAgICAgICAgICAgIlR5cGVzIGVsZW1lbnQgbXVzdCBmb2xsb3cgb25seSBhIGRvY3VtZW50YXRpb24gZWxlbWVudC4iLAotICAgICAgICAgICAgZWwsCi0gICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotCi0gICAgICAgIGlmIChpbXBvcnRJc1ByZXNlbnQKLSAgICAgICAgICAmJiBkb2N1bWVudElzUHJlc2VudAotICAgICAgICAgICYmIGVsICE9IG51bGwKLSAgICAgICAgICAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0RFRklOSVRJT05TKQotICAgICAgICAgICYmIGVsLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1dTREwpKQotICAgICAgICAgIGNyZWF0ZUZhaWxlZCgKLSAgICAgICAgICAgICJUeXBlcyBlbGVtZW50IG11c3Qgbm90IGZvbGxvdyB0aGUgIgotICAgICAgICAgICAgICArIGVsLmdldFRhZ05hbWUoKQotICAgICAgICAgICAgICArICIgZWxlbWVudC4iLAotICAgICAgICAgICAgZWwsCi0gICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGRvY3VtZW50IGF0ICIKLSAgICAgICAgICAgICsgZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKQotICAgICAgICAgICAgKyAiLlxuXG4iCi0gICAgICAgICAgICArIFV0aWxzLmdldEV4Y2VwdGlvbkRldGFpbHModCksCi0gICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDE5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTA3ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotCi0KLS8qKgotICogQlAyMDE5LgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZyBlbGVtZW50LCBpZiB0aGUgY29udGFpbmVkIHNvYXA6YmluZGluZyBlbGVtZW50IGhhcyBhICJzdHlsZSIgYXR0cmlidXRlIGVxdWFsIHRvICJkb2N1bWVudCIgYW5kIHNvYXA6b3BlcmF0aW9ucyBoYXZlICJ1c2UiIGF0dHJpYnV0ZSBlcXVhbCB0byAibGl0ZXJhbCI6PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSAibmFtZXNwYWNlIiBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCBpbiBhbnkgY29udGFpbmVkIHNvYXBiaW5kOmJvZHksIHNvYXBiaW5kOmhlYWRlciwgc29hcGJpbmQ6OmhlYWRlcmZhdWx0LCBzb2FwYmluZDpmYXVsdCBlbGVtZW50cyA8L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICogQHZlcnNpb24gMS4wLjEgMjcuMDYuMjAwMwotICogQGF1dGhvciBWaXRhbGkgRmVkb3NlbmtvCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDIwMTkgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwMTkoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIGRvY0xpdEZvdW5kID0gZmFsc2U7Ci0gICAgU3RyaW5nIGVycmFudEVsZW1lbnRzID0gbmV3IFN0cmluZygiIik7Ci0gICAgU3RyaW5nIHNvYXBFeHRlbnNpYmxlV2l0aE5hbWVzcGFjZSA9IG51bGw7Ci0KLSAgICAvLyBHZXQgdGhlIGJpbmRpbmcgZnJvbSB0aGUgZW50cnkgY29udGV4dAotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gVHJ5IHRvIGdldCB0aGUgU09BUCBiaW5kaW5nCi0gICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSBXU0RMVmFsaWRhdG9ySW1wbC5nZXRTb2FwQmluZGluZyhiaW5kaW5nKTsKLQotICAgIGlmIChzb2FwQmluZGluZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHlsZSA9Ci0gICAgICAgIChzb2FwQmluZGluZy5nZXRTdHlsZSgpID09IG51bGwpCi0gICAgICAgICAgPyBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DCi0gICAgICAgICAgOiBzb2FwQmluZGluZy5nZXRTdHlsZSgpOwotICAgICAgaWYgKHN0eWxlLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DKSkKLSAgICAgIHsKLSAgICAgICAgVmVjdG9yIHNvYXBFbGVtZW50cyA9IFV0aWxzLmFycmF5VG9WZWN0b3IodGhpcy52YWxpZGF0b3IuZ2V0U29hcEJvZGllcyhiaW5kaW5nKSk7Ci0gICAgICAgIHNvYXBFbGVtZW50cy5hZGRBbGwoVXRpbHMuYXJyYXlUb1ZlY3Rvcih0aGlzLnZhbGlkYXRvci5nZXRTb2FwRmF1bHRzKGJpbmRpbmcpKSk7Ci0gICAgICAgIHNvYXBFbGVtZW50cy5hZGRBbGwoVXRpbHMuYXJyYXlUb1ZlY3Rvcih0aGlzLnZhbGlkYXRvci5nZXRTb2FwSGVhZGVycyhiaW5kaW5nKSkpOwotICAgICAgICBzb2FwRWxlbWVudHMuYWRkQWxsKAotICAgICAgICAgIFV0aWxzLmFycmF5VG9WZWN0b3IodGhpcy52YWxpZGF0b3IuZ2V0U29hcEhlYWRlckZhdWx0cyhiaW5kaW5nKSkpOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSBzb2FwRWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgc29hcEVsZW1lbnQgPQotICAgICAgICAgICAgKEV4dGVuc2liaWxpdHlFbGVtZW50KSAoaS5uZXh0KCkpOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc0xpdGVyYWwoc29hcEVsZW1lbnQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkb2NMaXRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRvci5uYW1lc3BhY2VGb3VuZEluU29hcExpdGVyYWwoc29hcEVsZW1lbnQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyYW50RWxlbWVudHMgKz0gIlxuLS0tICIgKyAoc29hcEVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9IC8vIGNvbnRpbnVlIHdpdGggY2xlbmNoZWQgdGVldGgKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmICghZG9jTGl0Rm91bmQpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIElmIGEgbmFtZXNwYWNlIHdhcyBub3QgZm91bmQgdGhlbiB0ZXN0IGFzc2VydGlvbiBwYXNzZWQKLSAgICAgIGlmIChlcnJhbnRFbGVtZW50cy5sZW5ndGgoKSAhPSAwKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICJGYWlsaW5nIGVsZW1lbnRzOiIgKyBlcnJhbnRFbGVtZW50cywKLSAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMjAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOGJmOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5VUkkuTWFsZm9ybWVkVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSogQlAyMDIwLgotKiAgICA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQsIGlmIHRoZSBzdHlsZSBhdHRyaWJ1dGUgb2YgdGhlIGNvbnRhaW5lZCBzb2FwYmluZDpiaW5kaW5nIGlzICJycGMiIAotKiAgICAgICBhbmQgdGhlIHVzZSBhdHRyaWJ1dGUgaXMgImxpdGVyYWwiLjwvY29udGV4dD4KLSogICAgPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBuYW1lc3BhY2UgYXR0cmlidXRlIGlzIHNwZWNpZmllZCBvbiBhbGwgc29hcGJpbmQ6Ym9keSBlbGVtZW50cyBhbmQgdGhlIHZhbHVlIG9mIHRoZSAKLSogbmFtZXNwYWNlIGF0dHJpYnV0ZSBpcyBhbiBhYnNvbHV0ZSBVUkkuIDwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0qIEB2ZXJzaW9uIDEuMC4xIDI3LjA2LjIwMDMKLSogQGF1dGhvciBWaXRhbGkgRmVkb3NlbmtvCi0qKi8KLXB1YmxpYyBjbGFzcyBCUDIwMjAgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwMjAoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgYm9vbGVhbiBycGNMaXRGb3VuZCA9IGZhbHNlOwotCi0gICAgLy8gR2V0IHRoZSBiaW5kaW5nIGZyb20gdGhlIGVudHJ5IGNvbnRleHQKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIFRyeSB0byBnZXQgdGhlIFNPQVAgYmluZGluZwotICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gV1NETFZhbGlkYXRvckltcGwuZ2V0U29hcEJpbmRpbmcoYmluZGluZyk7Ci0KLSAgICAvLyBUZXN0IHRoZSBhc3NlcnRpb24gCi0gICAgLy8gQ2hlY2sgc3R5bGUgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgcnBjIC0gdGhlIHN1YmplY3Qgb2YgdGhlIGFzc2VydGlvbgotICAgIFN0cmluZyBzdHlsZSA9IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0M7Ci0gICAgaWYgKHNvYXBCaW5kaW5nICE9IG51bGwpCi0gICAgICBzdHlsZSA9Ci0gICAgICAgIChzb2FwQmluZGluZy5nZXRTdHlsZSgpID09IG51bGwKLSAgICAgICAgICA/IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MKLSAgICAgICAgICA6IHNvYXBCaW5kaW5nLmdldFN0eWxlKCkpOwotCi0gICAgaWYgKChzb2FwQmluZGluZyAhPSBudWxsKQotICAgICAgJiYgKHN0eWxlLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDKSkpCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIFNPQVAgYm9keSBlbGVtZW50cwotICAgICAgU09BUEJvZHlbXSBzb2FwQm9kaWVzID0gdGhpcy52YWxpZGF0b3IuZ2V0U29hcEJvZGllcyhiaW5kaW5nKTsKLQotICAgICAgLy8gQ2hlY2sgZm9yIFNvYXAgb3BlcmF0aW9uIG5hbWVzcGFjZQotICAgICAgYm9vbGVhbiBhc3NlcnRpb25GYWlsdXJlID0gZmFsc2U7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29hcEJvZGllcy5sZW5ndGggJiYgIShhc3NlcnRpb25GYWlsdXJlKTsgaSsrKQotICAgICAgewotICAgICAgICBTT0FQQm9keSBzb2FwQm9keSA9IHNvYXBCb2RpZXNbaV07Ci0gICAgICAgIC8vIEFkZGVkIGNoZWNrIGZvciBudWxsIHVzZSB2YWx1ZSwgc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgbGl0ZXJhbAotICAgICAgICBpZiAoc29hcEJvZHkuZ2V0VXNlKCkgPT0gbnVsbAotICAgICAgICAgIHx8IHNvYXBCb2R5LmdldFVzZSgpLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVCkpCi0gICAgICAgIHsKLSAgICAgICAgICBycGNMaXRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbmFtZXNwYWNlLCB0aGVuIGZsYWcgYXMgYSBmYWlsdXJlCi0gICAgICAgICAgaWYgKChuYW1lc3BhY2VVUkkgPSBzb2FwQm9keS5nZXROYW1lc3BhY2VVUkkoKSkgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRpb25GYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAgICItLS0gU09BUCBCT0RZOlxuIgotICAgICAgICAgICAgICAgICAgKyBzb2FwQm9keS50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICArICJcbi0tLSBCSU5ESU5HIFFOQU1FOlxuIgotICAgICAgICAgICAgICAgICAgKyBiaW5kaW5nLmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBFbHNlLCB2ZXJpZnkgdGhhdCB0aGUgbmFtZXNwYWNlIGlzIGFuIGFic29sdXRlIFVSSQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy9VUkwgdXJsID0gbmV3IFVSTChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICBVUkkgdXJpID0gbmV3IFVSSShuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICBpZiAodXJpLmdldFNjaGVtZSgpID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBubyBzY2hlbWUgaW1wbGllcyBub3QgYW4gYWJzb2x1dGUgVVJJCi0gICAgICAgICAgICAgICAgYXNzZXJ0aW9uRmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAgICAgICAiLS0tIFNPQVAgQk9EWTpcbiIKLSAgICAgICAgICAgICAgICAgICAgICArIHNvYXBCb2R5LnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICArICJcbi0tLSBCSU5ESU5HIFFOQU1FOlxuIgotICAgICAgICAgICAgICAgICAgICAgICsgYmluZGluZy5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJJRXhjZXB0aW9uIG11ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYXNzZXJ0aW9uRmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICAgICAiLS0tIFNPQVAgQk9EWTpcbiIKLSAgICAgICAgICAgICAgICAgICAgKyBzb2FwQm9keS50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICsgIlxuLS0tIEJJTkRJTkcgUU5BTUU6XG4iCi0gICAgICAgICAgICAgICAgICAgICsgYmluZGluZy5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFycGNMaXRGb3VuZCkKLSAgICAgIHsKLSAgICAgICAgLy8gc3R5bGUgaXMgcnBjIGJ1dCBubyBkb2N1bWVudCB1c2UgZWxlbWVudHMKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghYXNzZXJ0aW9uRmFpbHVyZSkKLSAgICAgIHsgLy8gSWYgbm8gYXNzZXJ0aW9uIGZhaWx1cmUsIHRoZW4gc2V0IHJlc3VsdCB0byBwYXNzZWQKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSBudWxsOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gc3R5bGUgaXMgbm90IHJwYwotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSBudWxsOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDIxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDUwODZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLQotCi0vKioKLSogIEJQMjAyMS4KLSogICAgIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudDwvY29udGV4dD4KLSogICAgIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgd3NkbDppbnB1dCBlbGVtZW50IGFuZCB3c2RsOm91dHB1dCBlbGVtZW50IG9mIGVhY2ggb3BlcmF0aW9uIHVzZXMgdGhlIGF0dHJpYnV0ZSBuYW1lICJwYXJ0IiB3aXRoIGEgU2NoZW1hIHR5cGUgb2YgIk5NVE9LRU4iIGFuZCBkb2VzIG5vdCB1c2UgInBhcnRzIiwgZm9yIGJvdGggc29hcGJpbmQ6aGVhZGVyIGVsZW1lbnRzIGFuZCBzb2FwYmluZDpoZWFkZXJmYXVsdCBlbGVtZW50cy4gPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSoKLSogQHZlcnNpb24gMS4wLjEgMjcuMDYuMjAwMwotKiBAYXV0aG9yIFZpdGFsaSBGZWRvc2Vua28KLSoqLwotcHVibGljIGNsYXNzIEJQMjAyMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjAyMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvL09wZXJhdGlvbiBvcGVyYXRpb24gPSBudWxsOwotCi0gICAgLy8gR2V0IHRoZSBiaW5kaW5nIGZyb20gdGhlIGVudHJ5IGNvbnRleHQKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIEdldCBTT0FQIGhlYWRlcnMgZm9yIHRoaXMgYmluZGluZwotICAgIFNPQVBIZWFkZXJbXSBzb2FwSGVhZGVycyA9IHRoaXMudmFsaWRhdG9yLmdldFNvYXBIZWFkZXJzKGJpbmRpbmcpOwotCi0gICAgaWYgKHNvYXBIZWFkZXJzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBDaGVjayBlYWNoIGhlYWRlciB0byBzZWUgaWYgaXQgaGFzIHBhcnQgZWxlbWVudCB3aXRoIE5NVE9LRU4gdHlwZQotICAgICAgZm9yIChpbnQgaGVhZGVyID0gMDsKLSAgICAgICAgaGVhZGVyIDwgc29hcEhlYWRlcnMubGVuZ3RoCi0gICAgICAgICAgJiYgcmVzdWx0LmVxdWFscyhBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRCk7Ci0gICAgICAgIGhlYWRlcisrKQotICAgICAgewotICAgICAgICBpZiAoKHNvYXBIZWFkZXJzW2hlYWRlcl0uZ2V0UGFydCgpID09IG51bGwpCi0gICAgICAgICAgfHwgKCFYTUxVdGlscy5pc05tdG9rZW4oc29hcEhlYWRlcnNbaGVhZGVyXS5nZXRQYXJ0KCkpKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChzb2FwSGVhZGVyc1toZWFkZXJdLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRWxzZSwgY2hlY2sgdGhlIGhlYWRlcmZhdWx0IGlmIHRoZXJlIGlzIG9uZQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0IHNvYXBIZWFkZXJGYXVsdExpc3QgPQotICAgICAgICAgICAgc29hcEhlYWRlcnNbaGVhZGVyXS5nZXRTT0FQSGVhZGVyRmF1bHRzKCk7Ci0gICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzb2FwSGVhZGVyRmF1bHRMaXN0Lml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAvLyBDaGVjayBlYWNoIGhlYWRlciBmYXVsdCB0byBzZWUgaWYgaXQgaGFzIHBhcnQgZWxlbWVudCB3aXRoIE5NVE9LRU4gdHlwZQotICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkKLSAgICAgICAgICAgICYmIHJlc3VsdC5lcXVhbHMoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJGYXVsdCBzb2FwSGVhZGVyRmF1bHQgPQotICAgICAgICAgICAgICAoU09BUEhlYWRlckZhdWx0KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoKHNvYXBIZWFkZXJGYXVsdC5nZXRQYXJ0KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgfHwgKCFYTUxVdGlscy5pc05tdG9rZW4oc29hcEhlYWRlckZhdWx0LmdldFBhcnQoKSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChzb2FwSGVhZGVyRmF1bHQudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAyMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0NWQ3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0KLS8qKgotICAqIEJQMjAyMi4KLSAgKiAgICA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQ8L2NvbnRleHQ+Ci0gICogIDxhc3NlcnRpb25EZXNjcmlwdGlvbj50aGUgbmFtZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIG9uIHRoZSBzb2FwYmluZDpmYXVsdCBlbGVtZW50LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0qKi8KLXB1YmxpYyBjbGFzcyBCUDIwMjIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwMjIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gR2V0IHRoZSBiaW5kaW5nIGZyb20gdGhlIGVudHJ5IGNvbnRleHQKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIEdldCBsaXN0IG9mIFNPQVAgZmF1bHRzIGZvciB0aGUgYmluZGluZwotICAgIFNPQVBGYXVsdFtdIHNvYXBGYXVsdHMgPSB0aGlzLnZhbGlkYXRvci5nZXRTb2FwRmF1bHRzKGJpbmRpbmcpOwotCi0gICAgaWYgKHNvYXBGYXVsdHMgPT0gbnVsbCB8fCBzb2FwRmF1bHRzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIGNoZWNrIGFsbCBzb2FwOmZhdWx0cy4gCi0gICAgICAvLyBNVVNUIGhhdmUgYSBuYW1lIGF0dHJpYnV0ZQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb2FwRmF1bHRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gc29hcEZhdWx0c1tpXTsKLSAgICAgICAgaWYgKHNvYXBGYXVsdC5nZXROYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgInNvYXBiaW5kOmZhdWx0IGVsZW1lbnQgOiAiICsgc29hcEZhdWx0LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAyMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzNjBhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLQotLyoqCi0gKiBCUDIwMjMuCi0gKiAgIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudCwgd2l0aCB0aGUgInVzZSIgYXR0cmlidXRlIHByZXNlbnQgb24gdGhlIHNvYXBiaW5kOmZhdWx0IGVsZW1lbnQ8L2NvbnRleHQ+Ci0gKiAgIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBpcyAibGl0ZXJhbCIuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjAyMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjAyMyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBHZXQgdGhlIGJpbmRpbmcgZnJvbSB0aGUgZW50cnkgY29udGV4dAotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gR2V0IGxpc3Qgb2YgU09BUCBmYXVsdHMgZm9yIHRoZSBiaW5kaW5nCi0gICAgU09BUEZhdWx0W10gc29hcEZhdWx0cyA9IHRoaXMudmFsaWRhdG9yLmdldFNvYXBGYXVsdHMoYmluZGluZyk7Ci0KLSAgICBpZiAoc29hcEZhdWx0cyA9PSBudWxsIHx8IHNvYXBGYXVsdHMubGVuZ3RoID09IDApCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gY2hlY2sgYWxsIHNvYXA6ZmF1bHRzLiAKLSAgICAgIC8vIE1VU1QgaGF2ZSBhIG5hbWUgYXR0cmlidXRlLCBhbmQgaWYgYSB1c2UgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgaXQgTVVTVCBiZSB2YWx1ZSAibGl0ZXJhbCIKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29hcEZhdWx0cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IHNvYXBGYXVsdHNbaV07Ci0gICAgICAgIGlmICgoc29hcEZhdWx0LmdldFVzZSgpICE9IG51bGwpCi0gICAgICAgICAgJiYgKCFzb2FwRmF1bHQKLSAgICAgICAgICAgIC5nZXRVc2UoKQotICAgICAgICAgICAgLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVCkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoc29hcEZhdWx0LnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAzMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkOTZkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0KLS8qKgotICogQlAyMDMyLgotICogICA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQ8L2NvbnRleHQ+Ci0gKiAgIDxhc3NlcnRpb25EZXNjcmlwdGlvbj50aGUgbmFtZSBhdHRyaWJ1dGUgdGhhdCBpcyBzcGVjaWZpZWQgb24gdGhlIHNvYXBiaW5kOmZhdWx0IGVsZW1lbnQgbWF0Y2hlcyB0aGUgdmFsdWUgc3BlY2lmaWVkIG9uIHRoZSBwYXJlbnQgZWxlbWVudCB3c2RsOmZhdWx0LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIwMzIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwMzIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gR2V0IHRoZSBiaW5kaW5nIGZyb20gdGhlIGVudHJ5IGNvbnRleHQKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIEdldCBsaXN0IG9mIEJpbmRpbmcgZmF1bHRzIGZvciB0aGUgYmluZGluZwotICAgIEJpbmRpbmdGYXVsdFtdIGJpbmRpbmdGYXVsdHMgPSB0aGlzLnZhbGlkYXRvci5nZXRBbGxCaW5kaW5nRmF1bHRzKGJpbmRpbmcpOwotCi0gICAgaWYgKGJpbmRpbmdGYXVsdHMgPT0gbnVsbCB8fCBiaW5kaW5nRmF1bHRzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBmb3IgZWFjaCBiaW5kaW5nIGZhdWx0LCBjb21wYXJlIHRoZSBjaGlsZCBzb2FwOmZhdWx0IG5hbWUgd2l0aCB0aGUgYmluZGluZyBmYXVsdCBuYW1lIAotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpbmRpbmdGYXVsdHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSBiaW5kaW5nRmF1bHRzW2ldOwotICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gdGhpcy52YWxpZGF0b3IuZ2V0U29hcEZhdWx0KGJpbmRpbmdGYXVsdCk7Ci0gICAgICAgIGlmIChzb2FwRmF1bHQgPT0gbnVsbAotICAgICAgICAgIHx8IHNvYXBGYXVsdC5nZXROYW1lKCkgPT0gbnVsbAotICAgICAgICAgIHx8IGJpbmRpbmdGYXVsdC5nZXROYW1lKCkgPT0gbnVsbAotICAgICAgICAgIHx8ICFiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLmVxdWFscyhzb2FwRmF1bHQuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICBzb2FwRmF1bHQgPT0gbnVsbCA/IG51bGwgOiBzb2FwRmF1bHQudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDM0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAzNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGU2MWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDM0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEJQMjAzNAotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBkZXNjcmlwdGlvbiB3aXRoaW4gYSBXU0RMIGRvY3VtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBjYW5kaWRhdGUgZGVzY3JpcHRpb24gZG9lcyBub3QgY29udGFpbiB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPiAKLSAqLwotcHVibGljIGNsYXNzIEJQMjAzNCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjAzNChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBHZXR0aW5nIHdzZGw6ZGVmaW5pdGlvbiBlbGVtZW50Ci0gICAgRGVmaW5pdGlvbiBkZWYgPSAoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLSAgICBUeXBlcyB0eXBlczsKLSAgICAvLyBHZXR0aW5nIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24geG1sbnM6eG1sCi0gICAgU3RyaW5nIHhtbE5zID0gKFN0cmluZykgZGVmLmdldE5hbWVzcGFjZXMoKS5nZXQoInhtbCIpOwotICAgIC8vIElmIGl0IGV4aXN0cyBhbmQgZXF1YWxzIHRvICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gICAgaWYgKHhtbE5zICE9IG51bGwgJiYgeG1sTnMuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfWE1MKSkKLSAgICB7Ci0gICAgICAvLyBzZXR0aW5nIGFzc2VydGlvbiByZXN1bHQgdG8gd2FybmluZwotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgIH0KLSAgICAvLyB0aGVyZSBpcyBubyBuYW1lc3BhY2UgZGVjbGFyYXRpb24geG1sbnM6eG1sIGluIHRoZSB3c2RsOmRlZmluaXRpb24KLSAgICAvLyBlbGVtZW50LCBjaGVja2luZyB3aGV0aGVyIHRoZSBkZWZpbml0aW9uIGhhcyB3c2RsOnR5cGUgZWxlbWVudAotICAgIGVsc2UgaWYgKCh0eXBlcyA9IGRlZi5nZXRUeXBlcygpKSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgdGhlIGxpc3Qgb2Ygd3NkbDpzY2hlbWFTCi0gICAgICBMaXN0IGV4dEVsZW1zID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dEVsZW1zLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICAvLyBHZXR0aW5nIHdzZGw6c2NoZW1hIGVsZW1lbnQKLSAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHNjaGVtYSA9Ci0gICAgICAgICAgKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbXMuZ2V0KGkpOwotICAgICAgICAvLyBHZXR0aW5nIGEgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB4bWxuczp4bWwKLSAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IHNjaGVtYS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlTlMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9YTUxOUywgInhtbCIpOwotICAgICAgICAvLyBJZiBpdCBlcXVhbHMgdG8gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCi0gICAgICAgIGlmIChXU0lDb25zdGFudHMuTlNfVVJJX1hNTC5lcXVhbHMoYXR0clZhbHVlKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIHNldHRpbmcgYXNzZXJ0aW9uIHJlc3VsdCB0byB3YXJuaW5nCi0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgiVGhlIG5hbWVzcGFjZSAiCi0gICAgICAgICAgICArICJkZWNsYXJhdGlvbiBuZXN0ZWQgaW4gd3NkbDpzY2hlbWEgZWxlbWVudC4iLCBlbnRyeUNvbnRleHQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjA5OC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwOTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiNjUzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjA5OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLQotCi0vKioKLSAqIEJQMjA5OC4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmltcG9ydCBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSAibG9jYXRpb24iIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgZm9yIHRoZSB3c2RsOmltcG9ydCBlbGVtZW50LCBhbmQgaGFzIGEgbm9uLWVtcHR5IHZhbHVlLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIwOTggZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwOTgoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgSW1wb3J0IGltID0gKEltcG9ydCkgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLSAgICAvLyBzdXBwb3NlIHRoYXQgaWYgbG9jYXRpb24gaXMgaW52YWxpZCwgdGhlIGRlZmluaXRpb24gZXF1YWxzIHRvIG51bGwKLSAgICBpZiAoaW0uZ2V0TG9jYXRpb25VUkkoKSA9PSBudWxsIHx8IGltLmdldExvY2F0aW9uVVJJKCkgPT0gIiIpCi0gICAgICBlcnJvcnMuYWRkKGltLmdldE5hbWVzcGFjZVVSSSgpLCBpbS5nZXRMb2NhdGlvblVSSSgpKTsKLQotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5YWM4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UZXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0KLS8qKgotICogQlAyMTAxLgotICAgKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpkZWZpbml0aW9uLCBpZiBpdCBjb250YWlucyB3c2RsOmltcG9ydCBzdGF0ZW1lbnRzPC9jb250ZXh0PgotICAgKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+RWFjaCB3c2RsOmltcG9ydCBzdGF0ZW1lbnQgaXMgb25seSB1c2VkIHRvIGltcG9ydCBhbm90aGVyIFdTREwgZGVzY3JpcHRpb24uPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjEwMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMDEoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLQotICBib29sZWFuIGltcG9ydEZvdW5kID0gZmFsc2U7Ci0KLSAgLyogQ3JlYXRlIGZhbHVyZSByZXBvcnQgaWYgaW1wb3J0IGNvbnRhaW5zIHJlZmVyZW5jZSB0byBub24gV1NETCBkZXNjcmlwdGlvbi4gCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLkltcG9ydCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEltcG9ydCBpbSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaW1wb3J0Rm91bmQgPSB0cnVlOwotCi0gICAgLy8gYnkgdGhlIHdheSA6IFdTREw0SiB0aHJvd3MgRXhjZXB0aW9uIGlmIGltcG9ydGVkIFdTREwgaXMgbm90IHJlc29sdmVkCi0gICAgLy8gYnV0IGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IGltLmdldERlZmluaXRpb24oKSB3aWxsIGJlIGVxdWFsIHRvIG51bGwKLSAgICBpZiAoaW0uZ2V0RGVmaW5pdGlvbigpID09IG51bGwpCi0gICAgICBlcnJvcnMuYWRkKAotICAgICAgICBpbS5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgICsgIjoiCi0gICAgICAgICAgKyBpbS5nZXRMb2NhdGlvblVSSSgpCi0gICAgICAgICAgKyAiXG5JbXBvcnQgZWxlbWVudCBkb2VzIG5vdCByZWZlcmVuY2UgYSBXU0RMIGRlZmluaXRpb24uIik7Ci0gICAgZWxzZQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRyeSB0byBwYXJzZSBXU0RMIGFjY29yZGluZyB0byB0aGUgV1NETCBzY2hlbWEKLSAgICAgICAgRG9jdW1lbnQgZG9jID0KLSAgICAgICAgICB2YWxpZGF0b3IucGFyc2VYTUxEb2N1bWVudFVSTCgKLSAgICAgICAgICAgIGltLmdldExvY2F0aW9uVVJJKCksCi0gICAgICAgICAgICAoKERlZmluaXRpb24pcGFyZW50KS5nZXREb2N1bWVudEJhc2VVUkkoKSwKLSAgICAgICAgICAgIFRlc3RVdGlscy5nZXRXU0RMU2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICAgIGVycm9ycy5hZGQoCi0gICAgICAgICAgaW0uZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICsgIjoiCi0gICAgICAgICAgICArIGltLmdldExvY2F0aW9uVVJJKCkKLSAgICAgICAgICAgICsgIlxuIgotICAgICAgICAgICAgKyBVdGlscy5nZXRFeGNlcHRpb25EZXRhaWxzKHQpKTsKLSAgICAgIH0KLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRJbXBvcnQodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoKERlZmluaXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgZWxzZSBpZiAoIWltcG9ydEZvdW5kKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNzJiOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogQlAyMTAyLgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6dHlwZXMgZWxlbWVudCwgd2l0aCBYTUwgc2NoZW1hIGltcG9ydCBlbGVtZW50czwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5FYWNoIFhNTCBzY2hlbWEgaW1wb3J0IHN0YXRlbWVudCAoeHNkOmltcG9ydCkgaXMgb25seSB1c2VkIHRvIGRpcmVjdGx5IHJlZmVyZW5jZSBhbiBYTUwgc2NoZW1hIGRlZmluaXRpb24sIHdoaWNoIGhhcyAic2NoZW1hIiBmcm9tIFhNTCBuYW1lc3BhY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBhcyByb290IGVsZW1lbnQuICBJdCBkb2VzIG5vdCBjb250YWluIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgZG9jdW1lbnQgZW1iZWRkaW5nIHRoZSBYTUwgc2NoZW1hIGRlZmluaXRpb24gKGUuZy4gV1NETCkuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjEwMiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjEwMihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGltcG9ydEZvdW5kID0gZmFsc2U7Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgLy8gcGFyc2UgV1NETCBhcyBYTUwKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUeXBlcyB0ID0gKFR5cGVzKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgICAgTGlzdCBleHRzID0gdC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICAgIGlmICgoZGVmaW5pdGlvbiA9IHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldERlZmluaXRpb24odCkpCi0gICAgICAgID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIHR5cGVzIGRlZmluaXRpb24gaW4gYW55IFdTREwgZG9jdW1lbnQuIik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChleHRzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gZXh0cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLSAgICAgICAgICBpZiAoZWwgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICAgICAgICAgICYmIGVsLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKEVMRU1fWFNEX1NDSEVNQSkpCi0gICAgICAgICAgICB0ZXN0Tm9kZSgoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgZWwpLmdldEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0KLSAgICAgICAgICBpZiAocmVzdWx0LmVxdWFscyhBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZmFpbHVyZURldGFpbE1lc3NhZ2UsIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICghaW1wb3J0Rm91bmQpCi0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgY2F0Y2ggKFRocm93YWJsZSB0dCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgIldTREwgZG9jdW1lbnQgY2FuIG5vdCBiZSBwcm9jZXNzZWQiLAotICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qCi0gICAqIENoZWNrIG5vZGUgaXMgeHNkIGltcG9ydCBhbmQgaXQgaXMgCi0gICAqIG9ubHkgdXNlZCB0byBkaXJlY3RseSByZWZlcmVuY2UgYW4gWE1MIHNjaGVtYSBkZWZpbml0aW9uLCB3aGljaCBoYXMgInNjaGVtYSIgCi0gICAqIGZyb20gWE1MIG5hbWVzcGFjZSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGFzIHJvb3QgZWxlbWVudC4gIAotICAgKiBBbmQgaXQgZG9lcyBub3QgY29udGFpbiBhIHJlZmVyZW5jZSB0byBhbm90aGVyIGRvY3VtZW50IGVtYmVkZGluZyB0aGUgWE1MIHNjaGVtYSAKLSAgICogZGVmaW5pdGlvbiAoZS5nLiBXU0RMKS4KLSAgKiBAcGFyYW0gbiAtIFVua25vd24gZXh0ZW5zaWJpbGl0eSBlbGVtZW50Ci0gICovCi0gIHByaXZhdGUgdm9pZCB0ZXN0Tm9kZShOb2RlIG4sIFN0cmluZyBjb250ZXh0KQotICB7Ci0gICAgd2hpbGUgKG4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBzZWFyY2hlcyBmb3IgeHNkOmltcG9ydCBlbGVtZW50Ci0gICAgICBpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpKQotICAgICAgewotICAgICAgICBpZiAoWE1MVXRpbHMuZXF1YWxzKG4sIEVMRU1fWFNEX0lNUE9SVCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbXBvcnRGb3VuZCA9IHRydWU7Ci0KLSAgICAgICAgICBFbGVtZW50IGltID0gKEVsZW1lbnQpIG47Ci0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgc2NoZW1hTG9jYXRpb24gYW5kIHRoZSBuYW1lc3BhY2UgYXR0cmlidXRlcwotICAgICAgICAgIEF0dHIgc2NoZW1hTG9jYXRpb24gPQotICAgICAgICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGltLCBBVFRSX1hTRF9TQ0hFTUFMT0NBVElPTik7Ci0gICAgICAgICAgQXR0ciBuYW1lc3BhY2UgPSBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoaW0sIEFUVFJfWFNEX05BTUVTUEFDRSk7Ci0gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25seSB0aGUgbmFtZXNwYWNlIGF0dHJpYnV0ZSBvZiBpbXBvcnQgZWxlbWVudAotICAgICAgICAgIGlmIChzY2hlbWFMb2NhdGlvbiA9PSBudWxsICYmIG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdldHRpbmcgYWxsIHRoZSBpbmxpbmUgc2NoZW1hcyBvZiB0aGUgd3NkbCBkZWZpbml0aW9uCi0gICAgICAgICAgICBNYXAgc2NoZW1hc01hcCA9IHZhbGlkYXRvci53c2RsRG9jdW1lbnQuZ2V0U2NoZW1hcygpOwotICAgICAgICAgICAgLy8gSWYgYW4gaW5saW5lIHNjaGVtYSBpbXBvcnRlZCBpcyBkZWZpbmVkCi0gICAgICAgICAgICBpZiAoc2NoZW1hc01hcC5rZXlTZXQoKS5jb250YWlucyhuYW1lc3BhY2UuZ2V0VmFsdWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIElmIGFuIGlubGluZSBzY2hlbWEgaW1wb3J0ZWQgaXMgZGVmaW5lZAotICAgICAgICAgICAgICAvLyAodGhhdCBtZWFucyB0aGUgc2NoZW1hIGlzIHZhbGlkKSwKLSAgICAgICAgICAgICAgLy8gY29udGludWUgd2l0aCB0aGUgbmV4dCBlbGVtZW50Ci0gICAgICAgICAgICAgIG4gPSBuLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBubyBzY2hlbWFMb2NhdGlvbiBzbyB0cnkgdGhlIG5hbWVzcGFjZSAKLSAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uID0gbmFtZXNwYWNlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIHRyeSB0byBwYXJzZSBpbXBvcnRlZCBYU0QKLSAgICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiBzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGlmIGFueSBlcnJvciBvciByb290IGVsZW1lbnQgaXMgbm90IFhTRCBzY2hlbWEgLT4gZXJyb3IKLSAgICAgICAgICAgICAgLy8gISEgQVRURU5USU9OCi0gICAgICAgICAgICAgIC8vIHJvb3QgWFNEIFNDSEVNQSBTQ0hFTUEgaXMgbm90IHZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAvL0RvY3VtZW50IHNjaGVtYSA9IFhNTFV0aWxzLnBhcnNlWE1MRG9jdW1lbnRVUkwoc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSwgWFNEX1NDSEVNQUxPQ0FUSU9OLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgRG9jdW1lbnQgc2NoZW1hID0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3IucGFyc2VYTUxEb2N1bWVudFVSTChzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpLCBjb250ZXh0KTsKLQotICAgICAgICAgICAgICAvLyBJZiB0aGUgaW1wb3J0IGlzIHZhbGlkLCB0aGVuIGNoZWNrIGl0cyBjb250ZW50cwotICAgICAgICAgICAgICBpZiAoWE1MVXRpbHMKLSAgICAgICAgICAgICAgICAuZXF1YWxzKHNjaGVtYS5nZXREb2N1bWVudEVsZW1lbnQoKSwgRUxFTV9YU0RfU0NIRU1BKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGNvbnRlbnQgb2YgaW1wb3J0ZWQgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICB0ZXN0Tm9kZShzY2hlbWEuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Rmlyc3RDaGlsZCgpLAotICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlVVJMU3RyaW5nKHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksIGNvbnRleHQpKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPSBzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPQotICAgICAgICAgICAgICAic2NoZW1hTG9jYXRpb24gPT0gbnVsbCBhbmQgbmFtZXNwYWNlID09IG51bGwiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRlc3ROb2RlKG4uZ2V0Rmlyc3RDaGlsZCgpLCBjb250ZXh0KTsKLSAgICAgIH0KLSAgICAgIG4gPSBuLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZGE5NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIEJQMjEwMy4KLSAgICogPGNvbnRleHQ+Rm9yIGVhY2ggYSBjYW5kaWRhdGUgd3NkbDpkZWZpbml0aW9uczwvY29udGV4dD4KLSAgICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkZvciB0aGUgcmVmZXJlbmNlZCBkZWZpbml0aW9ucyBhcyB3ZWxsIGFzIGFsbCBpbXBvcnRlZCAKLSAgICogZGVzY3JpcHRpb25zLCBUaGUgWE1MIHNjaGVtYSBpbXBvcnQgc3RhdGVtZW50IGlzIG9ubHkgdXNlZCB3aXRoaW4gYW4geHNkOnNjaGVtYSAKLSAgICogZWxlbWVudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMTAzIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjEwMyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotCi0gIC8qIENoZWNrIGFsbCB1bmtub3duIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgaXQgaXMgbm90IHhzZCBpbXBvcnQuCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlbCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChlbCBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgIHNlYXJjaEZvckltcG9ydCgoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgZWwpLmdldEVsZW1lbnQoKSk7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICAvL3Byb2Nlc3NXU0RMKGVudHJ5Q29udGV4dC5nZXRXU0RMRG9jdW1lbnQoKS5nZXRGaWxlbmFtZSgpKTsKLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQodHJ1ZSk7Ci0KLSAgICB0cmF2ZXJzYWwuaWdub3JlUmVmZXJlbmNlcygpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZSgoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKSk7Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoKLSAgICogQ3JlYXRlIGZhbHVyZSByZXBvcnQgaWYgbm9kZSBpcyB4c2QgaW1wb3J0LiAKLSAgICogQHBhcmFtIG4gLSBub2RlCi0gICAqLwotICBwcml2YXRlIHZvaWQgc2VhcmNoRm9ySW1wb3J0KE5vZGUgbikKLSAgewotICAgIHdoaWxlIChuICE9IG51bGwpCi0gICAgewotICAgICAgLy8gc2VhcmNoZXMgZm9yIHhzZDppbXBvcnQgZWxlbWVudAotICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IG4uZ2V0Tm9kZVR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpKQotICAgICAgICB7Ci0gICAgICAgICAgQXR0ciBhID0KLSAgICAgICAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZSgoRWxlbWVudCkgbiwgQVRUUl9YU0RfU0NIRU1BTE9DQVRJT04pOwotICAgICAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IChhICE9IG51bGwpID8gYS5nZXRWYWx1ZSgpIDogIiI7Ci0gICAgICAgICAgYSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZSgoRWxlbWVudCkgbiwgQVRUUl9YU0RfTkFNRVNQQUNFKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKGEgIT0gbnVsbCkgPyBhLmdldFZhbHVlKCkgOiAiIjsKLSAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIHNjaGVtYUxvY2F0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBpZiB4c2Q6c2NoZW1hIGVsZW1lbnQgaXMgZm91bmQgLT4gcHJvY2VzcyBzY2hlbWEKLSAgICAgICAgICBpZiAoIVhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICAgICAgc2VhcmNoRm9ySW1wb3J0KG4uZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTA0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTJmMzY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTnVsbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotCi0KLS8qKgotICogQlAyMTA0LgotICAgKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDppbXBvcnQ8L2NvbnRleHQ+Ci0gICAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZSBvbiB0aGUgd3NkbDpkZWZpbml0aW9ucyBlbGVtZW50IGZvciB0aGUgaW1wb3J0ZWQgV1NETCBkZXNjcmlwdGlvbiBoYXMgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIG5hbWVzcGFjZSBhdHRyaWJ1dGUgb24gdGhlIHdzZGw6aW1wb3J0IGVsZW1lbnQgdGhhdCBpbXBvcnRlZCB0aGUgV1NETCBkZXNjcmlwdGlvbi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMTA0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjEwNChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotCi0gIHByaXZhdGUgYm9vbGVhbiBpbXBvcnRGb3VuZCA9IGZhbHNlOwotCi0gIC8qIENyZWF0ZSBmYWx1cmUgcmVwb3J0IGlmIG5hbWVzcGFjZSBvZiB3c2RsOmltcG9ydCBkb2VzIG5vdCBlcXVhbCB0YXJnZXRuYW1lc3BhY2UgaW4gcmVmZXJlbmNlZCB3c2RsLiAgCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLkltcG9ydCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEltcG9ydCBpbSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaW1wb3J0Rm91bmQgPSB0cnVlOwotICAgIERlZmluaXRpb24gZGVmID0gaW0uZ2V0RGVmaW5pdGlvbigpOwotICAgIGlmIChkZWYgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoIU51bGxVdGlsLmVxdWFscyhpbS5nZXROYW1lc3BhY2VVUkkoKSwgZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgZXJyb3JzLmFkZCgKLSAgICAgICAgICBuZXcgUU5hbWUoaW0uZ2V0TmFtZXNwYWNlVVJJKCksIGltLmdldExvY2F0aW9uVVJJKCkpLAotICAgICAgICAgIG5ldyBRTmFtZShkZWYuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGRlZi5nZXREb2N1bWVudEJhc2VVUkkoKSkpOwotICAgIH0KLSAgfQotCi0gIC8qIAotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRJbXBvcnQodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoKERlZmluaXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgZWxzZSBpZiAoIWltcG9ydEZvdW5kKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTA1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTA0YzZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTA1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAgKiBCUDIxMDUuCi0gICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6ZGVmaW5pdGlvbnM8L2NvbnRleHQ+Ci0gICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkZvciB0aGUgcmVmZXJlbmNlZCBkZWZpbml0aW9ucywgYXMgd2VsbCBhcyBhbGwgaW1wb3J0ZWQgZGVzY3JpcHRpb25zLCBpbiB0aGUgV1NETCBuYW1lc3BhY2UgdW5kZXIgdGhlIHdzZGw6ZGVmaW50aXRpb25zIGVsZW1lbnQsIHRoZSB3c2RsOmltcG9ydCBlbGVtZW50IGlzIGVpdGhlciBkaXJlY3RseSBhZnRlciB0aGUgd3NkbDpkb2N1bWVudGF0aW9uIGVsZW1lbnQgb3IgaXMgdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgaWYgdGhlIHdzZGw6ZG9jdW1lbnRhdGlvbiBlbGVtZW50IGlzIG5vdCBwcmVzZW50LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gICovCi1wdWJsaWMgY2xhc3MgQlAyMTA1IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjEwNShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotCi0gIHByaXZhdGUgYm9vbGVhbiBpbXBvcnRGb3VuZCA9IGZhbHNlOwotCi0gIC8qIAotICAgKiBDaGVjayB3c2xkIGltcG9ydCBlbGVtZW50IGlzIGVpdGhlciBkaXJlY3RseSBhZnRlciB0aGUgd3NkbDpkb2N1bWVudGF0aW9uIGVsZW1lbnQgCi0gICAqIG9yIGlzIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50IGlmIHRoZSB3c2RsOmRvY3VtZW50YXRpb24gZWxlbWVudCBpcyBub3QgcHJlc2VudC4KLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuSW1wb3J0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoSW1wb3J0IGltLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpbXBvcnRGb3VuZCA9IHRydWU7Ci0gICAgaWYgKGltLmdldERlZmluaXRpb24oKSAhPSBudWxsICYmIGltLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkKLSAgICAgIHByb2Nlc3NXU0RMKGltLmdldERlZmluaXRpb24oKS5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0gIH0KLQotICAvKgotICAgKiBDaGVjayBlbGVtZW50IGlzIGV4dGVuc2liaWxpdHkuCi0gICAqIEBwYXJhbSBlbCAtIHhtbCBlbGVtZW50Ci0gICAqIEByZXR1cm4gYm9vbGVhbgotICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNFeHRlbnNpYmlsaXR5RWxlbWVudChFbGVtZW50IGVsKQotICB7Ci0gICAgYm9vbGVhbiBpc0V4ID0gdHJ1ZTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0JJTkRJTkcpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfREVGSU5JVElPTlMpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfRE9DVU1FTlRBVElPTik7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9GQVVMVCk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9JTVBPUlQpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfSU5QVVQpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfTUVTU0FHRSk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9PUEVSQVRJT04pOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfT1VUUFVUKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX1BBUlQpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfUE9SVCk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9QT1JUVFlQRSk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9TRVJWSUNFKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX1RZUEVTKTsKLQotICAgIHJldHVybiBpc0V4OwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgLy8gR2V0IHRoZSBkZWZpbml0aW9uIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGFuYWx5emVkICAgICAgIAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9Ci0gICAgICAoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIElmIGl0IGRvZXNuJ3QgY29udGFpbiBhbnkgaW1wb3J0cywgdGhlbiB0aGUgcmVzdWx0IGlzIG5vdEFwcGxpY2FibGUKLSAgICBpZiAoKGRlZmluaXRpb24uZ2V0SW1wb3J0cygpID09IG51bGwpCi0gICAgICB8fCAoZGVmaW5pdGlvbi5nZXRJbXBvcnRzKCkuc2l6ZSgpID09IDApKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgLy8gRWxzZSBhbmFseXplIHRoZSAKLSAgICBlbHNlCi0gICAgewotICAgICAgcHJvY2Vzc1dTREwoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0KLSAgICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICAgIHRyYXZlcnNhbC52aXNpdEltcG9ydCh0cnVlKTsKLQotICAgICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICAgIHRyYXZlcnNhbC5pZ25vcmVJbXBvcnQoKTsKLSAgICAgIHRyYXZlcnNhbC50cmF2ZXJzZSgKLSAgICAgICAgKERlZmluaXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotCi0gICAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoIWltcG9ydEZvdW5kKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKgotICAgKiB0aGUgbWV0aG9kIGxvYWRzIFdTREwgYW5kIGNoZWNrIHN0cnVjdHVyZQotICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICovCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzV1NETChTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBwYXJzZXMgV1NETAotICAgICAgRG9jdW1lbnQgZG9jID0gdmFsaWRhdG9yLnBhcnNlWE1MRG9jdW1lbnRVUkwobG9jYXRpb24sIG51bGwpOwotICAgICAgY2hlY2tXU0RMKGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSk7IC8vIGdldCBkZWZpbml0aW9uCi0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICAvLyBBREQ6IGFkZCBleGNlcHRpb24gaGFuZGxpbmcKLSAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCIyMTA1IC0gV1NETCBsb2FkIGZhaWxlZCIpOwotICAgICAgZXJyb3JzLmFkZCh0LnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIENyZWF0ZSBmYWx1cmUgcmVwb3J0IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9mIG5vZGUuCi0gICAqIEBwYXJhbSByb290Ci0gICAqLwotICBwcml2YXRlIHZvaWQgY3JlYXRlRmFpbGVkKE5vZGUgcm9vdCkKLSAgewotICAgIEF0dHIgYSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZSgoRWxlbWVudCkgcm9vdCwgQVRUUl9XU0RMX0xPQ0FUSU9OKTsKLSAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSAoYSAhPSBudWxsKSA/IGEuZ2V0VmFsdWUoKSA6ICIiOwotICAgIGEgPSBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoKEVsZW1lbnQpIHJvb3QsIEFUVFJfV1NETF9OQU1FU1BBQ0UpOwotICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoYSAhPSBudWxsKSA/IGEuZ2V0VmFsdWUoKSA6ICIiOwotICAgIGVycm9ycy5hZGQobmV3IFFOYW1lKG5hbWVzcGFjZSwgc2NoZW1hTG9jYXRpb24pKTsKLSAgfQotCi0gIC8qCi0gICAqIENoZWNrIHdzZGwgY29ycmVzcG9ucyBhc3NlcnRpb24gZGVzY3JpcHRpb24uCi0gICogQHBhcmFtIHJvb3QgLSBkZWZpbml0aW9uCi0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tXU0RMKE5vZGUgcm9vdCkKLSAgewotICAgIGlmIChyb290ICE9IG51bGwpCi0gICAgewotICAgICAgLy8gRmluZCB0aGUgZmlyc3QgaW1wb3J0IGVsZW1lbnQKLSAgICAgIEVsZW1lbnQgaW0gPSBYTUxVdGlscy5maW5kQ2hpbGRFbGVtZW50KChFbGVtZW50KSByb290LCBXU0RMX0lNUE9SVCk7Ci0KLSAgICAgIC8vIERldGVybWluZSBpZiBhIGRvY3VtZW50YXRpb24gZWxlbWVudCBpcyBwcmVzZW50IGluIHRoZSBXU0RMIGRvY3VtZW50Ci0gICAgICBib29sZWFuIGRvY3VtZW50SXNQcmVzZW50ID0KLSAgICAgICAgKFhNTFV0aWxzLmZpbmRDaGlsZEVsZW1lbnQoKEVsZW1lbnQpIHJvb3QsIFdTRExfRE9DVU1FTlRBVElPTikKLSAgICAgICAgICAhPSBudWxsKTsKLQotICAgICAgLy8gVmVyaWZ5IHRoYXQgYWxsIGltcG9ydCBlbGVtZW50cyBvY2N1ciBhZnRlciBhIGRvY3VtZW50YXRpb24gZWxlbWVudAotICAgICAgd2hpbGUgKGltICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIEZpbmQgZWxlbWVudHMgdGhhdCBhcmUgcHJldmlvdXMgdG8gdGhlIGltcG9ydCBlbGVtZW50Ci0gICAgICAgIEVsZW1lbnQgZWwgPSBYTUxVdGlscy5maW5kUHJldmlvdXNTaWJsaW5nKGltKTsKLSAgICAgICAgaWYgKGVsICE9IG51bGwpCi0gICAgICAgICAgd2hpbGUgKGlzRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZWwpICYmIGVsICE9IG51bGwpCi0gICAgICAgICAgICBpZiAoZWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgZWwgPSBYTUxVdGlscy5maW5kUHJldmlvdXNTaWJsaW5nKGVsKTsKLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDpkb2N1bWVudCBlbGVtbnQgaXMgcHJlc2VudAotICAgICAgICBpZiAoZG9jdW1lbnRJc1ByZXNlbnQgJiYgZWwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0RPQ1VNRU5UQVRJT04pICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfSU1QT1JUKSkKLSAgICAgICAgICAgIGNyZWF0ZUZhaWxlZChyb290KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVsc2UgY2hlY2sgaWYgaXQgaXMgYW5vdGhlciB3c2RsOiBlbGVtZW50Ci0gICAgICAgIGVsc2UgaWYgKGVsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJZiBub3QgdGhlIGRlZmluaXRpb25zIGVsZW1lbnQsIHRoZW4gY2hlY2sgZm9yIG90aGVyIHdzZGw6IGVsZW1lbnQKLSAgICAgICAgICBpZiAoIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9ERUZJTklUSU9OUykgJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9JTVBPUlQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlbC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMKSkKLSAgICAgICAgICAgICAgY3JlYXRlRmFpbGVkKHJvb3QpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgbmV4dCBpbXBvcnQgZWxlbWVudAotICAgICAgICBpbSA9IFhNTFV0aWxzLmZpbmRFbGVtZW50KGltLCBXU0RMX0lNUE9SVCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYzVlY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIEJQMjEwNy4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOnR5cGVzIGVsZW1lbnQgY29udGFpbmluZyBhbiB4c2Q6c2NoZW1hIGVsZW1lbnQ8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHhzZDpzY2hlbWEgZWxlbWVudCBjb250YWlucyBhIHRhcmdldE5hbWVzcGFjZSBhdHRyaWJ1dGUgd2l0aCBhIHZhbGlkIGFuZCBub24tbnVsbCB2YWx1ZSB1bmxlc3MgdGhlIHhzZDpzY2hlbWEgZWxlbWVudCBoYXMgeHNkOmltcG9ydCBhbmQvb3IgeHNkOmFubm90YXRpb24gYXMgaXRzIG9ubHkgY2hpbGQgZWxlbWVudChzKS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMTA3IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTA3KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gc2NoZW1hRm91bmQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotICBwcml2YXRlIFN0cmluZyBjb250ZXh0OwotCi0gIC8qIAotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBUeXBlcyB0ID0gKFR5cGVzKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgIExpc3QgZXh0cyA9IHQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgaWYgKGV4dHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb250ZXh0ID0KLSAgICAgICAgZW50cnlDb250ZXh0LmdldFdTRExEb2N1bWVudCgpLmdldERlZmluaXRpb25zKCkuZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0gICAgICBJdGVyYXRvciBpdCA9IGV4dHMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVsID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgICBzZWFyY2hGb3JTY2hlbWEoKChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVsKS5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vCQkJICBjb250ZXh0ID0gZW50cnlDb250ZXh0LmdldFdTRExEb2N1bWVudCgpLmdldERlZmluaXRpb25zKCkuZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0gICAgLy8JCQkgIHByb2Nlc3NXU0RMKGVudHJ5Q29udGV4dC5nZXRXU0RMRG9jdW1lbnQoKS5nZXRGaWxlbmFtZSgpKTsKLQotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIGVsc2UgaWYgKCFzY2hlbWFGb3VuZCkKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKgotICAgKiBDaGVjayBub2RlIHNjaGVtYSBvciBsb2FkIHNjaGVtYSBmcm9tIGlubXBvcnQgaWYgaXQgZXhpc3RzIGFuZCBwcm9jZXNzIGl0LiAKLSAgICogQHBhcmFtIG4gLSBub2RlCi0gICovCi0gIHByaXZhdGUgdm9pZCBzZWFyY2hGb3JTY2hlbWEoTm9kZSBuKQotICB7Ci0gICAgd2hpbGUgKG4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBzZWFyY2hlcyBmb3IgeHNkOmltcG9ydCBlbGVtZW50Ci0gICAgICBpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpKQotICAgICAgewotICAgICAgICAvLyBpZiB4c2Q6c2NoZW1hIGVsZW1lbnQgaXMgZm91bmQgLT4gcHJvY2VzcyBzY2hlbWEKLSAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICB7Ci0gICAgICAgICAgc2NoZW1hRm91bmQgPSB0cnVlOwotICAgICAgICAgIHByb2Nlc3NTY2hlbWEobiwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBpZiB4c2Q6aW1wb3J0IGVsZW1lbnQgaXMgZm91bmQgLT4gbG9hZCBzY2hlbWEgYW5kIHByb2Nlc3Mgc2NoZW1hCi0gICAgICAgICAgLy9pZiAoWE1MVXRpbHMuZXF1YWxzKG4sIEVMRU1fWFNEX0lNUE9SVCkpCi0gICAgICAgICAgLy8gIGxvYWRTY2hlbWEobik7Ci0gICAgICAgICAgLy9lbHNlCi0gICAgICAgICAgLy8gZWxzZSBpdGVyYXRlIGVsZW1lbnQgcmVjdXJzaXZlbHkKLSAgICAgICAgICBzZWFyY2hGb3JTY2hlbWEobi5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIG4gPSBuLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogTG9hZCBzY2hlbWEgYW5kIHByb2Nlc3MgaXQuCi0gICAqIEBwYXJhbSBpbXBvcnROb2RlIC0geHNkOmltcG9ydCBlbGVtZW50Ci0gICovCi0gIHByaXZhdGUgdm9pZCBsb2FkU2NoZW1hKE5vZGUgaW1wb3J0Tm9kZSkKLSAgewotICAgIEVsZW1lbnQgaW0gPSAoRWxlbWVudCkgaW1wb3J0Tm9kZTsKLSAgICBBdHRyIHNjaGVtYUxvY2F0aW9uID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGltLCBBVFRSX1hTRF9TQ0hFTUFMT0NBVElPTik7Ci0gICAgLy8gdHJ5IHRvIHBhcnNlIGltcG9ydGVkIFhTRAotICAgIGlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmIHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCkgIT0gbnVsbCkKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBpZiBhbnkgZXJyb3Igb3Igcm9vdCBlbGVtZW50IGlzIG5vdCBYU0Qgc2NoZW1hIC0+IGVycm9yCi0gICAgICAgIERvY3VtZW50IHNjaGVtYSA9Ci0gICAgICAgICAgdmFsaWRhdG9yLnBhcnNlWE1MRG9jdW1lbnRVUkwoc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSwgY29udGV4dCk7Ci0gICAgICAgIGlmIChYTUxVdGlscy5lcXVhbHMoc2NoZW1hLmdldERvY3VtZW50RWxlbWVudCgpLCBFTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICB7Ci0gICAgICAgICAgQXR0ciBhID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGltLCBBVFRSX1hTRF9OQU1FU1BBQ0UpOwotICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoYSAhPSBudWxsKSA/IGEuZ2V0VmFsdWUoKSA6ICIiOwotICAgICAgICAgIHByb2Nlc3NTY2hlbWEoc2NoZW1hLmdldERvY3VtZW50RWxlbWVudCgpLCBuYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICAgIC8vIG5vdGhpbmcuIGl0J3Mgbm90IGEgc2NoZW1hCi0gICAgICB9Ci0gIH0KLQotICAvKgotICAgKiBDcmVhdGUgZmFsdXJlIHJlcG9ydCBpZiBpdCdzIG5vdCBjb3JyZXNwb25zIGFzc2VydGlvbiBkZXNjcmlwdGlvbi4KLSAgICogQHBhcmFtIHNjaGVtYSAtIHhzZDpzY2hlbWEKLSAgICogQHBhcmFtIG5hbWVzcGFjZSAtIG5hbWVzcGFjZSBvZiBzY2hlbWEKLSAgKi8KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NTY2hlbWEoTm9kZSBzY2hlbWEsIFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBBdHRyIGEgPQotICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlKChFbGVtZW50KSBzY2hlbWEsIEFUVFJfWFNEX1RBUkdFVE5BTUVTUEFDRSk7Ci0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IChhICE9IG51bGwpID8gYS5nZXRWYWx1ZSgpIDogbnVsbDsKLQotICAgIE5vZGUgbiA9IHNjaGVtYS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgLy8JICAgISEgd2Ugc3VwcG9zZSB0aGF0IHhzZDppbXBvcnQgZWxlbWVudCBpcyBvY2N1cmVkIG9ubHkgd2l0aGluIHhzZDpzY2hlbWEgZWxlbWVudAotICAgIGJvb2xlYW4gY29udGFpbnNPbmx5SW1wb3J0QW5kQW5ub3RhdGlvbiA9IHRydWU7Ci0gICAgd2hpbGUgKG4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAobi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICBjb250YWluc09ubHlJbXBvcnRBbmRBbm5vdGF0aW9uCi0gICAgICAgICAgJj0gKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpCi0gICAgICAgICAgICB8fCBYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfQU5OT1RBVElPTikpOwotICAgICAgfQotCi0gICAgICAvL2lmIChOb2RlLkVMRU1FTlRfTk9ERSA9PSBuLmdldE5vZGVUeXBlKCkgJiYgWE1MVXRpbHMuZXF1YWxzKG4sIEVMRU1fWFNEX0lNUE9SVCkpCi0gICAgICAvLwlsb2FkU2NoZW1hKG4pOwotCi0gICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgIH0KLQotICAgIC8vIElmIHRoZSB0YXJnZXQgbmFtZXNwYWNlIGlzIG5vdCBzZXQgYW5kIHRoZXJlIGFyZSBlbGVtZW50cyBpbiBhZGRpdGlvbiB0byBpbXBvcnQgYW5kIGFubm90YXRpb24sIHRoZW4gZXJyb3IKLSAgICBpZiAoKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8IHRhcmdldE5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwKQotICAgICAgJiYgKCFjb250YWluc09ubHlJbXBvcnRBbmRBbm5vdGF0aW9uKSkKLSAgICB7Ci0gICAgICBlcnJvcnMuYWRkKHRhcmdldE5hbWVzcGFjZSwgWE1MVXRpbHMuc2VyaWFsaXplKChFbGVtZW50KSBzY2hlbWEpKTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgIW5hbWVzcGFjZS5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICBlcnJvcnMuYWRkKG5hbWVzcGFjZSwgWE1MVXRpbHMuc2VyaWFsaXplKChFbGVtZW50KSBzY2hlbWEpKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwOC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3MzNmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlR5cGVzUmVnaXN0cnk7Ci0KLQotLyoqCi0JICogQlAyMTA4LgotICAgICAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOnR5cGVzLCB3aXRoIEFycmF5IGRlY2xhcmF0aW9ucyBlaXRoZXIgbG9jYWxseSBkZWZpbmVkIG9yIGZyb20gYW4gaW1wb3J0ZWQgZGVzY3JpcHRpb248L2NvbnRleHQ+Ci0gICAgICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSB0eXBlIHNvYXBlbmM6QXJyYXkgZG9lcyBub3QgYXBwZWFyIGluIHRoZXNlIGRlY2xhcmF0aW9ucywgYW5kIHRoZSB3c2RsOmFycmF5VHlwZSBhdHRyaWJ1dGUgaXMgbm90IHVzZWQgaW4gdGhlIHR5cGUgZGVjbGFyYXRpb24uPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLQkgKi8KLXB1YmxpYyBjbGFzcyBCUDIxMDggZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMDgoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLQotICAvKiAKLSAgICogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgVHlwZXMgdCA9IChUeXBlcykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIFNlYXJjaCB0aGUgZGVmaW5pdGlvbnMgaW4gQ2FuZGlkYXRlSW5mbyB0byBsb2NhdGUgdGhlIGRlZmluaXRpb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdHlwZXMgZWxlbWVudAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgaWYgKChkZWZpbml0aW9uID0gdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0RGVmaW5pdGlvbih0KSkKLSAgICAgID09IG51bGwpCi0gICAgewotICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgaWYgaXQgZG9lcyB0aGVuIHRocm93IGFuIGV4ZWNwdGlvbgotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiQ291bGQgbm90IGxvY2F0ZSB0eXBlcyBlbGVtZW50IGRlZmluaXRpb24uIik7Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIFR5cGVzUmVnaXN0cnkgcmVnaXN0cnkgPQotICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICB0LAotICAgICAgICAgIGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCksCi0gICAgICAgICAgdmFsaWRhdG9yKTsKLQotICAgICAgSXRlcmF0b3IgaXQgPSByZWdpc3RyeS5nZXRBcnJheVR5cGVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICAgIGVycm9ycy5hZGQoKFFOYW1lKSBpdC5uZXh0KCkpOwotCi0gICAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTEwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTliNmYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVHlwZXNSZWdpc3RyeTsKLQotCi0vKioKLSAqIEJQMjExMC4KLSAgICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6dHlwZXM8L2NvbnRleHQ+Ci0gICAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BcnJheSBkZWNsYXJhdGlvbiB3cmFwcGVyIGVsZW1lbnRzIGRvZXMgbm90IHVzZSB0aGUgbmFtaW5nIGNvbnZlbnRpb24gQXJyYXlPZlhYWC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMTEwIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTEwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLQotICAgIFR5cGVzIHQgPSAoVHlwZXMpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAvLyBTZWFyY2ggdGhlIGRlZmluaXRpb25zIGluIENhbmRpZGF0ZUluZm8gdG8gbG9jYXRlIHRoZSBkZWZpbml0aW9uIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHR5cGVzIGVsZW1lbnQKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotICAgIGlmICgoZGVmaW5pdGlvbiA9IHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldERlZmluaXRpb24odCkpCi0gICAgICA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGlmIGl0IGRvZXMgdGhlbiB0aHJvdyBhbiBleGVjcHRpb24KLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2NhdGUgdHlwZXMgZWxlbWVudCBkZWZpbml0aW9uLiIpOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0KLSAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgdCwKLSAgICAgICAgICBkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpLAotICAgICAgICAgIHZhbGlkYXRvcik7Ci0KLSAgICAgIEl0ZXJhdG9yIGl0ID0gcmVnaXN0cnkuZ2V0RWxlbWVudExpc3QoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUU5hbWUgdHlwZSA9IChRTmFtZSkgaXQubmV4dCgpOwotICAgICAgICBpZiAodHlwZS5nZXRMb2NhbFBhcnQoKS5zdGFydHNXaXRoKCJBcnJheU9mIikpCi0gICAgICAgICAgZXJyb3JzLmFkZCh0eXBlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkOTQyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0gKiBCUDIxMTEuCi0gICAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcsIHdoaWNoIGNvbnRhaW5zIGEgZG9jdW1lbnQtbGl0ZXJhbCBzb2FwOmJpbmRpbmc8L2NvbnRleHQ+Ci0gICAqIAotICAgKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+SWYgdGhlICJwYXJ0cyIgYXR0cmlidXRlIGlzIHByZXNlbnQsIHRoZW4gdGhlIHNvYXBiaW5kOmJvZHkgZWxlbWVudChzKSBoYXZlIGF0IG1vc3Qgb25lIHBhcnQgbGlzdGVkIGluIHRoZSBwYXJ0cyBhdHRyaWJ1dGUuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjExMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMTEoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBkb2NMaXRlcmFsRm91bmQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotCi0gIC8qIAotICAgKiBQdXQgaW4gY29udGV4dCBzb2FwIGJpbmRpbmcncyBzdHlsZQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmcsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPQotICAgICAgKGJpbmRpbmcuZ2V0U3R5bGUoKSA9PSBudWxsKQotICAgICAgICA/IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MKLSAgICAgICAgOiBiaW5kaW5nLmdldFN0eWxlKCk7Ci0gICAgY3R4LmFkZFBhcmFtZXRlcigic3R5bGUiLCBzdHlsZSk7Ci0gIH0KLQotICAvKiAKLSAgICogVmVyaWZ5IHN0eWxlIG9mIHNvYXAgb3BlcmF0aW9uIGlzICJkb2N1bWVudCIgaWYgbm90IHRoZW4gaXQncyBjYW5jZWxlZCBwcm9jZXNzLiAKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb24sIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQT3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIFN0cmluZyBzdHlsZSA9IG9wZXJhdGlvbi5nZXRTdHlsZSgpOwotICAgIGlmIChzdHlsZSA9PSBudWxsKQotICAgICAgc3R5bGUgPSAoU3RyaW5nKSBjdHguZ2V0UGFyYW1ldGVyKCJzdHlsZSIpOwotICAgIC8vIGFzc2VydCBzdHlsZSAhPSBudWxsCi0gICAgaWYgKCFXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DLmVxdWFscyhzdHlsZSkpCi0gICAgICBjdHguY2FuY2VsQmluZGluZ09wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgfQotCi0gIC8qIAotICAgKiBJZiB1c2Ugb2Ygc29hcCBib2R5IGlzICJsaXRlcmFsIiBhbmQgcGFydHMgb2Ygc29hcCBib2R5IGlzIG1vcmUgdGhhbiBvbmUgaXQgY3JlYXRlcyBmYWx1cmUgcmVwb3J0LiAKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEJvZHkgYm9keSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgLy8gYXNzZXJ0IHN0eWxlID09ICJkb2N1bWVudCIKLSAgICBpZiAoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQuZXF1YWxzKGJvZHkuZ2V0VXNlKCkpKQotICAgIHsKLSAgICAgIGRvY0xpdGVyYWxGb3VuZCA9IHRydWU7Ci0KLSAgICAgIExpc3QgcGFydHMgPSBib2R5LmdldFBhcnRzKCk7Ci0gICAgICBpZiAocGFydHMgIT0gbnVsbCAmJiBwYXJ0cy5zaXplKCkgPiAxKQotICAgICAgICAvL2hvdyB0byBwaWNrIG91dCBvbmUgYm9keSBmcm9tIGFub3RoZXIgb25lID8JCQkJCQkKLSAgICAgICAgZXJyb3JzLmFkZChib2R5LmdldEVsZW1lbnRUeXBlKCksIGJvZHkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLSAgfQotCi0gIC8qIAotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTs7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEJpbmRpbmcodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEJvZHkodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUE9wZXJhdGlvbih0cnVlKTsKLQotICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZUltcG9ydCgpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZSgoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKSk7Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBlbHNlIGlmICghZG9jTGl0ZXJhbEZvdW5kKQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTEyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjlhM2I1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuV1NETFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotCi0KLS8qKgotICogQlAyMTEyLgotICAgKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nLCB3aXRoIGEgc3R5bGUgInJwYyIgYXR0cmlidXRlIGFuZCBjb250YWluaW5nIGF0IGxlYXN0IGEgc29hcGJpbmQ6Ym9keSBlbGVtZW50PC9jb250ZXh0PgotICAgKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+Tm8gd3NkbDpwYXJ0IHJlZmVycmVkIGJ5IHN1Y2ggYSBzb2FwYmluZDpib2R5IGVsZW1lbnQgaXMgZGVmaW5lZCB1c2luZyB0aGUgImVsZW1lbnQiIGF0dHJpYnV0ZS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMTEyIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjExMihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHJwY0xpdGVyYWxGb3VuZCA9IGZhbHNlOwotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0gIHByaXZhdGUgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLQotICAvKiAKLSAgICogUHV0IGluIGNvbnRleHQgc29hcCBiaW5kaW5nJ3Mgc3R5bGUKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLQotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQQmluZGluZyBiaW5kaW5nLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIHN0eWxlID0KLSAgICAgIChiaW5kaW5nLmdldFN0eWxlKCkgPT0gbnVsbCkKLSAgICAgICAgPyBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DCi0gICAgICAgIDogYmluZGluZy5nZXRTdHlsZSgpOwotICAgIGN0eC5hZGRQYXJhbWV0ZXIoImJpbmRpbmdTdHlsZSIsIHN0eWxlKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIEJpbmRpbmdPcGVyYXRpb24gb3AsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVtb3ZlUGFyYW1ldGVyKCJvcGVyYXRpb25TdHlsZSIpOwotICB9Ci0KLSAgLyogCi0gICAqIFZlcmlmeSBzdHlsZSBvZiBzb2FwIG9wZXJhdGlvbiBpcyAicnBjIiBpZiBub3QgdGhlbiBpdCdzIGNhbmNlbGVkIHByb2Nlc3MuIAotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbiwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBPcGVyYXRpb24gb3BlcmF0aW9uLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LmFkZFBhcmFtZXRlcigib3BlcmF0aW9uU3R5bGUiLCBvcGVyYXRpb24uZ2V0U3R5bGUoKSk7Ci0gIH0KLQotICAvKiAKLSAgICogSWYgdXNlIG9mIHNvYXAgYm9keSBpcyAibGl0ZXJhbCIgYW5kIGlmIGF0IGxlYXN0IG9uZSBwYXJ0IGlzIGRlZmluZSB1c2luZyAiZWxlbWVudCIgYXR0cmlidXRlIGl0IGNyZWF0ZXMgZmFsdXJlIHJlcG9ydC4gICAgCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBCb2R5IGJvZHksIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIFN0cmluZyBvcFN0eWxlID0gKFN0cmluZykgY3R4LmdldFBhcmFtZXRlcigib3BlcmF0aW9uU3R5bGUiKTsKLSAgICBTdHJpbmcgYlN0eWxlID0gKFN0cmluZykgY3R4LmdldFBhcmFtZXRlcigiYmluZGluZ1N0eWxlIik7Ci0KLSAgICBpZiAoKG9wU3R5bGUgPT0gbnVsbAotICAgICAgICAmJiAhV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQy5lcXVhbHMoYlN0eWxlKSkKLSAgICAgIHx8IChvcFN0eWxlICE9IG51bGwgCi0gICAgICAJJiYgIVdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMuZXF1YWxzKG9wU3R5bGUpKSkKLSAgICB7Ci0gICAgICBjdHguY2FuY2VsQmluZGluZ09wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gYXNzZXJ0IHVzZSA9PSAibGl0ZXJhbCIKLSAgICBpZiAoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQuZXF1YWxzKGJvZHkuZ2V0VXNlKCkpKQotICAgIHsKLSAgICAgIHJwY0xpdGVyYWxGb3VuZCA9IHRydWU7Ci0KLSAgICAgIC8vIGZpbmQgY29ycmVzcG9uZGluZyBtZXNzYWdlCi0gICAgICBPcGVyYXRpb24gb3AgPSBjdHguZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE9wZXJhdGlvbigpOwotICAgICAgLy8gaWYgc29tZSBsaW5rcyBhcmUgYnJva2VuLCBjYW5jZWwgcHJvY2Vzc2luZwotICAgICAgaWYgKG9wID09IG51bGwKLSAgICAgICAgfHwgKHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCAmJiBvcC5nZXRJbnB1dCgpID09IG51bGwpCi0gICAgICAgIHx8IChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0ICYmIG9wLmdldE91dHB1dCgpID09IG51bGwpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIE1lc3NhZ2UgbSA9Ci0gICAgICAgIChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQpCi0gICAgICAgICAgPyBvcC5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKQotICAgICAgICAgIDogb3AuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgLy8gUkVNT1ZFOiBjdXJyZW50IG1lc3NhZ2Ugc2hvdWxkIGVxdWFscyB0byBtZXNzYWdlIGdpdmVuIGFzIGVudHJ5Ci0gICAgICAvL2lmIChtID09IG51bGwgfHwgbWVzc2FnZSAhPSBtKQotICAgICAgaWYgKG0gPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBMaXN0IHBhcnRzID0KLSAgICAgICAgV1NETFV0aWwuZ2V0UGFydHMoCi0gICAgICAgICAgb3AsCi0gICAgICAgICAgbSwKLSAgICAgICAgICBib2R5LAotICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMpOwotICAgICAgaWYgKHBhcnRzID09IG51bGwpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgLyogY2hlY2sgd2hldGhlciBwYXJ0cyBsaXN0IGNvbnRhaW5zIGEgcGFydHMgd2hpY2ggdXNlcwotICAgICAgICogZWxlbWVudCBhdHRyaWJ1dGUuIElmIHNvLCBwYXJ0IG5hbWUgd2lsbCBiZSBhZGRlZCBpbnRvCi0gICAgICAgKiBlcnJvcnMgc2V0LgotICAgICAgICovCi0gICAgICBJdGVyYXRvciBpdCA9IHBhcnRzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgaXQubmV4dCgpOwotICAgICAgICBpZiAocGFydC5nZXRFbGVtZW50TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgZXJyb3JzLmFkZChwYXJ0LmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogCi0gICAqIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAvLyBzYXZlIG1lc3NhZ2UgCi0gICAgLy9tZXNzYWdlID0gKE1lc3NhZ2UpZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOzsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQmluZGluZyh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRCaW5kaW5nT3BlcmF0aW9uKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBPcGVyYXRpb24odHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEJvZHkodHJ1ZSk7Ci0KLSAgICB0cmF2ZXJzYWwuaWdub3JlUmVmZXJlbmNlcygpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVJbXBvcnQoKTsKLQotICAgIHRyYXZlcnNhbC50cmF2ZXJzZSgoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKSk7Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBlbHNlIGlmICghcnBjTGl0ZXJhbEZvdW5kKQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTEzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDMxY2RjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0gKiBCUDIxMTMuCi0gICAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudDwvY29udGV4dD4KLSAgICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBzb2FwYmluZDpoZWFkZXIsIHNvYXBiaW5kOmhlYWRlcmZhdWx0IGFuZCBzb2FwYmluZDpmYXVsdCBlbGVtZW50cyBvbmx5IHJlZmVyIHRvIHdzZGw6cGFydCBlbGVtZW50KHMpIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgdXNpbmcgdGhlICJlbGVtZW50IiBhdHRyaWJ1dGUuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjExMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMTMoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLQotICAvKiAKLSAgICogVmVyaWZ5IHNvYXAgaGVhZGVyIHVzZXMgcGFydCBpcyBkZWZpbmUgdXNpbmcgImVsZW1lbnQiIGF0dHJpYnV0ZSAgIAotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlciwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBIZWFkZXIgaGVhZGVyLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkID0gKERlZmluaXRpb24pIGN0eC5nZXRQYXJhbWV0ZXIoImRlZmluaXRpb24iKTsKLSAgICBNZXNzYWdlIG0gPSBkLmdldE1lc3NhZ2UoaGVhZGVyLmdldE1lc3NhZ2UoKSk7Ci0gICAgaWYgKG0gIT0gbnVsbCkKLSAgICAgIGNoZWNrUGFydChtLmdldFBhcnQoaGVhZGVyLmdldFBhcnQoKSksIGN0eC5nZXRCaW5kaW5nKCkpOwotICB9Ci0KLSAgLyogCi0gICAqIFZlcmlmeSBzb2FwIGhlYWRlcmZhdWx0IHVzZXMgcGFydCBpcyBkZWZpbmUgdXNpbmcgImVsZW1lbnQiIGF0dHJpYnV0ZQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckZhdWx0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUEhlYWRlckZhdWx0IGZhdWx0LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkID0gKERlZmluaXRpb24pIGN0eC5nZXRQYXJhbWV0ZXIoImRlZmluaXRpb24iKTsKLSAgICBNZXNzYWdlIG0gPSBkLmdldE1lc3NhZ2UoZmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAvLyBpZiBtZXNzYWdlIG9yIHBhcnQgaXMgbm90IGZvdW5kIC0gTk9UX0FQUExJQ0FCTEUgPz8/PwotICAgIGlmIChtICE9IG51bGwpCi0gICAgICBjaGVja1BhcnQobS5nZXRQYXJ0KGZhdWx0LmdldFBhcnQoKSksIGN0eC5nZXRCaW5kaW5nKCkpOwotICB9Ci0KLSAgLyogCi0gICAqIFZlcmlmeSBzb2FwIGZhdWx0IHVzZXMgcGFydCBpcyBkZWZpbmUgdXNpbmcgImVsZW1lbnQiIGF0dHJpYnV0ZQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEZhdWx0IGZhdWx0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgZmF1bHROYW1lID0gZmF1bHQuZ2V0TmFtZSgpOwotICAgIGlmIChmYXVsdE5hbWUgPT0gbnVsbCkKLSAgICAgIGZhdWx0TmFtZSA9IGN0eC5nZXRCaW5kaW5nRmF1bHQoKS5nZXROYW1lKCk7Ci0gICAgT3BlcmF0aW9uIG9wID0gY3R4LmdldEJpbmRpbmdPcGVyYXRpb24oKS5nZXRPcGVyYXRpb24oKTsKLSAgICBpZiAob3AgPT0gbnVsbCAvKiB8fCBmYXVsdE5hbWUgPT0gbnVsbCovCi0gICAgICApIC8vIG1heSBiZSBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgbGVnYWwgZmF1bHQgd2l0aCBudWxsIG5hbWUKLSAgICAgIHJldHVybjsKLSAgICAvLyB3ZSBzdXBwb3NlIHRoYXQgU09BUEZhdWx0LmdldE5hbWUoKSBjb3JyZXNwb25kcyB0byB0aGUgYWJzdHJhY3Qgb3BlcmF0aW9uJ3MgZmF1bHQgbmFtZQkJCQotICAgIEZhdWx0IGYgPSBvcC5nZXRGYXVsdChmYXVsdE5hbWUpOwotICAgIGlmIChmID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgTWVzc2FnZSBtID0gZi5nZXRNZXNzYWdlKCk7Ci0gICAgLy8gbWVzc2FnZSBzaG91bGQgaGF2ZSBvbmx5IG9uZSBwYXJ0Ci0gICAgaWYgKG0gPT0gbnVsbCB8fCBtLmdldFBhcnRzKCkgPT0gbnVsbCB8fCBtLmdldFBhcnRzKCkuc2l6ZSgpICE9IDEpCi0gICAgICByZXR1cm47Ci0gICAgY2hlY2tQYXJ0KChQYXJ0KSBtLmdldE9yZGVyZWRQYXJ0cyhudWxsKS5nZXQoMCksIGN0eC5nZXRCaW5kaW5nKCkpOwotICB9Ci0KLSAgLyoKLSAgICogVmVyaWZ5IHBhcnQgaXMgZGVmaW5lIHVzaW5nICJlbGVtZW50IiBhdHRyaWJ1dGUuCi0gICAqIEBwYXJhbSBwIC0gcGFydAotICAgKiBAcGFyYW0gYiAtIGJpbmRpbmcKLSAgKi8KLSAgLy8gcmVmYWN0b3JpbmcKLSAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFydChQYXJ0IHAsIEJpbmRpbmcgYikKLSAgewotICAgIGlmIChwICE9IG51bGwgJiYgcC5nZXRFbGVtZW50TmFtZSgpID09IG51bGwpCi0gICAgICBlcnJvcnMuYWRkKGIuZ2V0UU5hbWUoKSwgcC5nZXROYW1lKCkpOwotICB9Ci0KLSAgLyogCi0gICAqIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOzsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQSGVhZGVyKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBIZWFkZXJGYXVsdCh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQRmF1bHQodHJ1ZSk7Ci0KLSAgICBNYXAgbSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgRGVmaW5pdGlvbiBkZWYgPSBlbnRyeUNvbnRleHQuZ2V0V1NETERvY3VtZW50KCkuZ2V0RGVmaW5pdGlvbnMoKTsKLSAgICBXU0RMVXRpbC5leHBhbmREZWZpbml0aW9uKGRlZik7Ci0gICAgbS5wdXQoImRlZmluaXRpb24iLCBkZWYpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZSgoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKSwgbSk7Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTQ5ZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLQotCi0vKioKLSAqIEJQMjExNC4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudDwvY29udGV4dD4KLSAqIAotICogCi0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+RXZlcnkgd3NkbDpwYXJ0IGZyb20gZWFjaCB3c2RsOm1lc3NhZ2UgaW4gdGhlIGFzc29jaWF0ZWQgCi0gKiB3c2RsOnBvcnRUeXBlIGlzIHJlZmVyZW5jZWQgZWl0aGVyIGJ5IHRoZSBzb2FwYmluZDpib2R5LCBzb2FwYmluZDpoZWFkZXIsIAotICogc29hcGJpbmQ6ZmF1bHQsIG9yIHNvYXBiaW5kOmhlYWRlcmZhdWx0LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMTQgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTE0KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0gIC8vIG1hcCBNZXNzYWdlIFFOYW1lIC0+IHNldChQYXJ0IG5hbWUpCi0gIHB1YmxpYyBNYXAgbWVzc2FnZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gIC8qIAotICAgKiBBZGQgdG8gTWFwIHBhcnRzIHdoaWNoIHVzZWQgYnkgbWVzc2FnZQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5NZXNzYWdlLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoTWVzc2FnZSBtLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAobSAhPSBudWxsCi0gICAgICAmJiAhbWVzc2FnZXMuY29udGFpbnNLZXkobSkKLSAgICAgICYmIG0uZ2V0T3JkZXJlZFBhcnRzKG51bGwpICE9IG51bGwpCi0gICAgewotICAgICAgU2V0IHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgSXRlcmF0b3IgaXQgPSBtLmdldE9yZGVyZWRQYXJ0cyhudWxsKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgICAgcy5hZGQoKChQYXJ0KSBpdC5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLSAgICAgIC8vbWVzc2FnZXMucHV0KG0uZ2V0UU5hbWUoKSwgcyk7Ci0gICAgICBpZiAocy5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBtZXNzYWdlcy5wdXQobS5nZXRRTmFtZSgpLCBzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiAKLSAgICogUHV0IGluIGNvbnRleHQgc3R5bGUgb2Ygc29hcCBiaW5kaW5nCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZywgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPQotICAgICAgKGJpbmRpbmcuZ2V0U3R5bGUoKSA9PSBudWxsKQotICAgICAgICA/IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MKLSAgICAgICAgOiBiaW5kaW5nLmdldFN0eWxlKCk7Ci0gICAgY3R4LmFkZFBhcmFtZXRlcigic3R5bGUiLCBzdHlsZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUE9wZXJhdGlvbiBvcGVyYXRpb24sCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICBpZiAoc3R5bGUgIT0gbnVsbCkKLSAgICAgIGN0eC5hZGRQYXJhbWV0ZXIoInN0eWxlIiwgc3R5bGUpOwotICB9Ci0KLSAgLyogCi0gICAqIFJlbW92ZSBwYXJ0cyBvZiBzb2FwIGJvZHkgZnJvbSBNYXAuICAKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEJvZHkgYm9keSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgLy8gU3RyaW5nIHN0eWxlID0gKFN0cmluZyljdHguZ2V0UGFyYW1ldGVyKCJzdHlsZSIpOwotCi0gICAgLy8gZmluZCBjb3JyZXNwb25kaW5nIG1lc3NhZ2UKLSAgICBPcGVyYXRpb24gb3AgPSBjdHguZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE9wZXJhdGlvbigpOwotICAgIC8vIGlmIHNvbWUgbGlua3MgYXJlIGJyb2tlbiwgY2FuY2VsIHByb2Nlc3NpbmcKLSAgICBpZiAob3AgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBNZXNzYWdlIG0gPSBudWxsOwotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQpCi0gICAgewotICAgICAgaWYgKG9wLmdldElucHV0KCkgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgbSA9IG9wLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KQotICAgIHsKLSAgICAgIGlmIChvcC5nZXRPdXRwdXQoKSA9PSBudWxsKQotICAgICAgICByZXR1cm47Ci0gICAgICBtID0gb3AuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgIH0KLSAgICBpZiAobSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgLy8gZ2V0IHBhcnRzCi0gICAgTGlzdCBwYXJ0cyA9IFdTRExVdGlsLmdldFBhcnRzKG9wLCBtLCBib2R5LCBudWxsKTsKLSAgICBpZiAocGFydHMgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLQotICAgIC8vIGl0ZXJhdGUgYWxsIHBhcnRzIGFuZCBjaGVjawotICAgIEl0ZXJhdG9yIGl0ID0gcGFydHMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgcmVtb3ZlUGFydChtLmdldFFOYW1lKCksICgoUGFydCkgaXQubmV4dCgpKS5nZXROYW1lKCkpOwotICB9Ci0KLSAgLyogCi0gICAqIFJlbW92ZSBwYXJ0cyBvZiBzb2FwIGhlYWRlciBmcm9tIE1hcC4KLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXIsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQSGVhZGVyIGhlYWRlciwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIC8vIHdlIHN1cHBvc2UgdGhhdCBpdCBwb3NzaWJsZSB0byBoYXZlIGxlZ2FsIG1lc3NhZ2UgYW5kIHBhcnQgd2l0aCBudWxsIG5hbWVzCi0gICAgLy8gQVRURU5USU9OCi0gICAgLy8gc2hvdWxkIHdlIGFkZCBtZXNzYWdlIHdoaWNoIGlzIHJlZmVyZW5jZWQgYnkgaGVhZGVyIG9yIGhlYWRlcmZhdWx0IHRvIG1lc3NhZ2VzID8KLSAgICByZW1vdmVQYXJ0KGhlYWRlci5nZXRNZXNzYWdlKCksIGhlYWRlci5nZXRQYXJ0KCkpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckZhdWx0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUEhlYWRlckZhdWx0IGZhdWx0LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgLy8gd2Ugc3VwcG9zZSB0aGF0IGl0IHBvc3NpYmxlIHRvIGhhdmUgbGVnYWwgbWVzc2FnZSBhbmQgcGF0ciB3aXRoIG51bGwgbmFtZXMKLSAgICBRTmFtZSBtZXNzYWdlTmFtZSA9IGZhdWx0LmdldE1lc3NhZ2UoKTsKLSAgICBpZiAobWVzc2FnZU5hbWUgPT0gbnVsbCkKLSAgICAgIG1lc3NhZ2VOYW1lID0gY3R4LmdldFNPQVBIZWFkZXIoKS5nZXRNZXNzYWdlKCk7Ci0gICAgcmVtb3ZlUGFydChtZXNzYWdlTmFtZSwgZmF1bHQuZ2V0UGFydCgpKTsKLSAgfQotCi0gIC8qIAotICAgKiBSZW1vdmUgcGFydHMgb2Ygc29hcCBmYXVsdCBmcm9tIE1hcC4KLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBGYXVsdCBmYXVsdCwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIGZhdWx0TmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLSAgICBpZiAoZmF1bHROYW1lID09IG51bGwpCi0gICAgICBmYXVsdE5hbWUgPSBjdHguZ2V0QmluZGluZ0ZhdWx0KCkuZ2V0TmFtZSgpOwotICAgIE9wZXJhdGlvbiBvcCA9IGN0eC5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0T3BlcmF0aW9uKCk7Ci0gICAgaWYgKG9wID09IG51bGwpCi0gICAgICByZXR1cm47Ci0KLSAgICAvLyB3ZSBzdXBwb3NlIHRoYXQgU09BUEZhdWx0LmdldE5hbWUoKSBjb3JyZXNwb25kcyB0byB0aGUgYWJzdHJhY3Qgb3BlcmF0aW9uJ3MgZmF1bHQgbmFtZSAgICAgICAgICAgCi0gICAgRmF1bHQgZiA9IG9wLmdldEZhdWx0KGZhdWx0TmFtZSk7Ci0KLSAgICAvLyBmYXVsdCBtZXNzYWdlIHNob3VsZCBoYXZlIDEgcGFydAotICAgIGlmIChmID09IG51bGwKLSAgICAgIHx8IGYuZ2V0TWVzc2FnZSgpID09IG51bGwKLSAgICAgIHx8IGYuZ2V0TWVzc2FnZSgpLmdldFBhcnRzKCkuc2l6ZSgpICE9IDEpCi0gICAgICByZXR1cm47Ci0KLSAgICBQYXJ0IHAgPSAoUGFydCkgZi5nZXRNZXNzYWdlKCkuZ2V0T3JkZXJlZFBhcnRzKG51bGwpLmdldCgwKTsKLSAgICByZW1vdmVQYXJ0KGYuZ2V0TWVzc2FnZSgpLmdldFFOYW1lKCksIHAuZ2V0TmFtZSgpKTsKLSAgfQotCi0gIC8qCi0gICAqIFJlbW92ZSBwYXJ0IGZyb20gTWFwLiAKLSAgKiBAcGFyYW0gbWVzc2FnZU5hbWUgLSBtZXNzYWdlCi0gICogQHBhcmFtIHBhcnROYW1lIC0gcGFydAotICAqLwotICAvLyByZWZhdG9yaW5nCi0gIHByaXZhdGUgdm9pZCByZW1vdmVQYXJ0KFFOYW1lIG1lc3NhZ2VOYW1lLCBTdHJpbmcgcGFydE5hbWUpCi0gIHsKLSAgICBTZXQgcGFydHMgPSAoU2V0KSBtZXNzYWdlcy5nZXQobWVzc2FnZU5hbWUpOwotICAgIGlmIChwYXJ0cyAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhcnRzLnJlbW92ZShwYXJ0TmFtZSk7Ci0gICAgICBpZiAocGFydHMuc2l6ZSgpID09IDApCi0gICAgICAgIG1lc3NhZ2VzLnJlbW92ZShtZXNzYWdlTmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgLyogCi0gICAqIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRNZXNzYWdlKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBCaW5kaW5nKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBCb2R5KHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBIZWFkZXIodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEhlYWRlckZhdWx0KHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBGYXVsdCh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQT3BlcmF0aW9uKHRydWUpOwotCi0gICAgQmluZGluZyBiID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKGIpOwotCi0gICAgaWYgKG1lc3NhZ2VzLnNpemUoKSA+IDApCi0gICAgICBlcnJvcnMuYWRkKGIuZ2V0UU5hbWUoKSk7Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTgyOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVHlwZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0gKiBCUDIxMTUuCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDptZXNzYWdlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkFuICJlbGVtZW50IiBhdHRyaWJ1dGUgb24gYW55IHdzZGw6cGFydCBlbGVtZW50IHJlZmVycyB0byBhIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMTUgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTE1KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0gIHByaXZhdGUgVHlwZXNSZWdpc3RyeSByZWdpc3RyeSA9IG51bGw7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5QYXJ0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUGFydCBwYXJ0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAocGFydC5nZXRFbGVtZW50TmFtZSgpICE9IG51bGwKLSAgICAgICYmIHJlZ2lzdHJ5LmdldFR5cGUocGFydC5nZXRFbGVtZW50TmFtZSgpKSA9PSBudWxsKQotICAgIHsKLSAgICAgIGVycm9ycy5hZGQoY3R4LmdldE1lc3NhZ2UoKS5nZXRRTmFtZSgpKTsKLSAgICAgIGN0eC5jYW5jZWxNZXNzYWdlUHJvY2Vzc2luZygpOwotICAgIH0KLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgIHJlZ2lzdHJ5ID0KLSAgICAgIG5ldyBUeXBlc1JlZ2lzdHJ5KAotICAgICAgICBlbnRyeUNvbnRleHQuZ2V0V1NETERvY3VtZW50KCkuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgdmFsaWRhdG9yKTsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgIHRyYXZlcnNhbC52aXNpdFBhcnQodHJ1ZSk7Ci0KLSAgICB0cmF2ZXJzYWwuaWdub3JlUmVmZXJlbmNlcygpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVJbXBvcnQoKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoKE1lc3NhZ2UpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOWZmMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotCi0KLS8qKgotICogQlAyMTE2LgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6bWVzc2FnZSBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSB3c2RsOm1lc3NhZ2UgZWxlbWVudCBkb2VzIG5vdCBjb250YWluIHBhcnQgZWxlbWVudHMgdGhhdCB1c2UgYm90aCAidHlwZSIgYW5kICJlbGVtZW50IiBhdHRyaWJ1dGVzLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMTYgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotCi0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMTYoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuUGFydCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUGFydCBwYXJ0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAocGFydC5nZXRFbGVtZW50TmFtZSgpICE9IG51bGwgJiYgcGFydC5nZXRUeXBlTmFtZSgpICE9IG51bGwpCi0gICAgewotICAgICAgZXJyb3JzLmFkZChjdHguZ2V0TWVzc2FnZSgpLmdldFFOYW1lKCkpOwotICAgICAgY3R4LmNhbmNlbE1lc3NhZ2VQcm9jZXNzaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgIHRyYXZlcnNhbC52aXNpdFBhcnQodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKChNZXNzYWdlKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpKTsKLQotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwOWZhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLQotCi0vKioKLSAqIEJQMjExNy4KLSAgICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZyBlbGVtZW50LCByZWZlcnJlZCB0byBieSBhbiBycGMtbGl0ZXJhbCBzb2FwOmJpbmRpbmc8L2NvbnRleHQ+Ci0gICAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgcnBjLWxpdGVyYWwgYmluZGluZyBkb2VzIG5vdCBoYXZlIGEgbmFtZXNwYWNlIGF0dHJpYnV0ZSBzcGVjaWZpZWQgb24gYSBjb250YWluZWQgc29hcGJpbmQ6aGVhZGVyLCBzb2FwYmluZDpoZWFkZXJmYXVsdCwgYW5kIHNvYXBiaW5kOmZhdWx0IGVsZW1lbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjExNyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMTcoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBycGNMaXRlcmFsRm91bmQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUEJpbmRpbmcgYmluZGluZywKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIFN0cmluZyBzdHlsZSA9Ci0gICAgICAoYmluZGluZy5nZXRTdHlsZSgpID09IG51bGwpCi0gICAgICAgID8gV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQwotICAgICAgICA6IGJpbmRpbmcuZ2V0U3R5bGUoKTsKLSAgICBjdHguYWRkUGFyYW1ldGVyKCJzdHlsZSIsIHN0eWxlKTsKLSAgfQotCi0gIC8qIAotICAgKiBJZiB1c2Ugb2Ygc29hcCBib2R5IGlzICJsaXRlcmFsIiBhbmQgaWYgYXQgbGVhc3Qgb25lIHBhcnQgaXMgZGVmaW5lIHVzaW5nICJlbGVtZW50IiBhdHRyaWJ1dGUgaXQgY3JlYXRlcyBmYWx1cmUgcmVwb3J0LiAgICAKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEJvZHkgYm9keSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgLy8gYXNzZXJ0IHVzZSA9PSAibGl0ZXJhbCIKLSAgICBpZiAoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQuZXF1YWxzKGJvZHkuZ2V0VXNlKCkpCi0gICAgICAmJiAoKFN0cmluZykgY3R4LmdldFBhcmFtZXRlcigic3R5bGUiKSkuZXF1YWxzKAotICAgICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDKSkKLSAgICB7Ci0gICAgICBycGNMaXRlcmFsRm91bmQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb24sIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQT3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIFN0cmluZyBzdHlsZSA9IG9wZXJhdGlvbi5nZXRTdHlsZSgpOwotICAgIGlmIChzdHlsZSA9PSBudWxsKQotICAgICAgc3R5bGUgPSAoU3RyaW5nKSBjdHguZ2V0UGFyYW1ldGVyKCJzdHlsZSIpOwotCi0gICAgLy8gYXNzZXJ0IHN0eWxlICE9IG51bGwKLSAgICBpZiAoIVdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMuZXF1YWxzKHN0eWxlKSkKLSAgICAgIGN0eC5jYW5jZWxCaW5kaW5nT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlciwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBIZWFkZXIgaGVhZGVyLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY2hlY2soaGVhZGVyLmdldFVzZSgpLCBoZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCksIGN0eCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQSGVhZGVyRmF1bHQgZmF1bHQsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjaGVjayhmYXVsdC5nZXRVc2UoKSwgZmF1bHQuZ2V0TmFtZXNwYWNlVVJJKCksIGN0eCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQRmF1bHQgZmF1bHQsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGNoZWNrKGZhdWx0LmdldFVzZSgpLCBmYXVsdC5nZXROYW1lc3BhY2VVUkkoKSwgY3R4KTsKLSAgfQotCi0gIC8vIHJlZmFjdG9yaW5nCi0gIC8vIGNoZWNrIExJVEVSQUwgdXNlIGFuZCAhPSBuYW1lc3BhY2UKLSAgLy8gY2FuY2VsaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZwotICBwcml2YXRlIHZvaWQgY2hlY2soU3RyaW5nIHVzZSwgU3RyaW5nIG5hbWVzcGFjZSwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElULmVxdWFscyh1c2UpCi0gICAgICAmJiBuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBlcnJvcnMuYWRkKGN0eC5nZXRCaW5kaW5nKCkuZ2V0UU5hbWUoKSk7Ci0gICAgICAvLyAgICAgICAgICAgICAgc3VwcHJlc3NlcyBzdWJzZXF1ZW50IHByb2Nlc3NpbmcsIGJlY2F1c2UgZXJyb3IgbGlzdCBjb250YWlucyBvbmx5IGZhaWxlZCBiaW5kaW5nCi0gICAgICBjdHguY2FuY2VsUHJvY2Vzc2luZygpOwotICAgIH0KLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBCaW5kaW5nKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBCb2R5KHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBIZWFkZXIodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEhlYWRlckZhdWx0KHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBGYXVsdCh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQT3BlcmF0aW9uKHRydWUpOwotCi0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpKTsKLQotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIGVsc2UgaWYgKCFycGNMaXRlcmFsRm91bmQpCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotCi0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNGE3MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0gKiBCUDIxMTguCi0gICAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudDwvY29udGV4dD4KLSAgICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBsaXN0IChvciBzZXQpIG9mIHdzZGw6b3BlcmF0aW9uIGVsZW1lbnRzIGZvciB0aGUgY29udGFpbmVkIHdzZGw6YmluZGluZyBpcyB0aGUgc2FtZSBhcyB0aGUgbGlzdCBvZiB3c2RsOm9wZXJhdGlvbnMgZm9yIHRoZSByZWZlcnJlZCB3c2RsOnBvcnRUeXBlLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMTggZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotCi0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMTgoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLk9wZXJhdGlvbiwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KE9wZXJhdGlvbiBvcCwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgLy8gYXNzZXJ0IHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmdPcGVyYXRpb24KLSAgICBpZiAob3AgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlcnJvcnMuYWRkKGN0eC5nZXRCaW5kaW5nKCkuZ2V0UU5hbWUoKSk7Ci0gICAgICAvLwkJCQlzdXBwcmVzc2VzIHN1YnNlcXVlbnQgcHJvY2Vzc2luZywgYmVjYXVzZSBlcnJvciBsaXN0IGNvbnRhaW5zIG9ubHkgZmFpbGVkIGJpbmRpbmcKLSAgICAgIGN0eC5jYW5jZWxCaW5kaW5nUHJvY2Vzc2luZygpOwotICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgQmluZGluZyBiID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0gICAgLy8gaWYgb3BlcmF0aW9ucyBjb3VudCBpbiBwb3J0IHR5cGUgYW5kIGJpbmRpbmcgaXMgZGlmZmVyIC0+IGVycm9yCi0gICAgaWYgKGIuZ2V0UG9ydFR5cGUoKSA9PSBudWxsCi0gICAgICB8fCBiLmdldFBvcnRUeXBlKCkuZ2V0T3BlcmF0aW9ucygpLnNpemUoKQotICAgICAgICAhPSBiLmdldEJpbmRpbmdPcGVyYXRpb25zKCkuc2l6ZSgpKQotICAgICAgZXJyb3JzLmFkZChiLmdldFFOYW1lKCkpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOwotICAgICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgICB0cmF2ZXJzYWwudmlzaXRPcGVyYXRpb24odHJ1ZSk7Ci0gICAgICB0cmF2ZXJzYWwudHJhdmVyc2UoYik7Ci0gICAgfQotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGUxYTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLQotCi0vKioKLSAqIEJQMjExOS4KLSAgICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZywgd2hpY2ggaXMgb2YgdHlwZSBkb2N1bWVudC1saXRlcmFsPC9jb250ZXh0PgotICAgKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+SWYgaXQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgcGFydHMgYXR0cmlidXRlIG9uIGEgc29hcGJpbmQ6Ym9keSBlbGVtZW50LCB0aGUgY29ycmVzcG9uZGluZyBhYnN0cmFjdCB3c2RsOm1lc3NhZ2UgZGVmaW5lcyB6ZXJvIG9yIG9uZSB3c2RsOnBhcnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjExOSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMTkoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBkb2NMaXRlcmFsRm91bmQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUEJpbmRpbmcgYmluZGluZywKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIFN0cmluZyBzdHlsZSA9Ci0gICAgICAoYmluZGluZy5nZXRTdHlsZSgpID09IG51bGwpCi0gICAgICAgID8gV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQwotICAgICAgICA6IGJpbmRpbmcuZ2V0U3R5bGUoKTsKLSAgICBjdHguYWRkUGFyYW1ldGVyKCJzdHlsZSIsIHN0eWxlKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUE9wZXJhdGlvbiBvcGVyYXRpb24sCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICBpZiAoc3R5bGUgPT0gbnVsbCkKLSAgICAgIHN0eWxlID0gKFN0cmluZykgY3R4LmdldFBhcmFtZXRlcigic3R5bGUiKTsKLSAgICAvLyBhc3NlcnQgc3R5bGUgIT0gbnVsbAotICAgIGlmICghV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQy5lcXVhbHMoc3R5bGUpKQotICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHksIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQQm9keSBib2R5LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgdXNlID0KLSAgICAgIChib2R5LmdldFVzZSgpID09IG51bGwpCi0gICAgICAgID8gV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQKLSAgICAgICAgOiBib2R5LmdldFVzZSgpOwotCi0gICAgLy8gYXNzZXJ0IHN0eWxlID09ICJkb2N1bWVudCIKLSAgICBpZiAoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQuZXF1YWxzKHVzZSkpCi0gICAgewotICAgICAgZG9jTGl0ZXJhbEZvdW5kID0gdHJ1ZTsKLSAgICAgIGlmIChib2R5LmdldFBhcnRzKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgT3BlcmF0aW9uIG9wID0gY3R4LmdldEJpbmRpbmdPcGVyYXRpb24oKS5nZXRPcGVyYXRpb24oKTsKLSAgICAgICAgaWYgKG9wID09IG51bGwpCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIE1hcCBwYXJ0cyA9IG51bGw7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAob3AuZ2V0SW5wdXQoKSA9PSBudWxsIHx8IG9wLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgcGFydHMgPSBvcC5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKS5nZXRQYXJ0cygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmdPdXRwdXQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAob3AuZ2V0T3V0cHV0KCkgPT0gbnVsbCB8fCBvcC5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICBwYXJ0cyA9IG9wLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKS5nZXRQYXJ0cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcnRzICE9IG51bGwgJiYgcGFydHMuc2l6ZSgpID4gMSkKLSAgICAgICAgewotICAgICAgICAgIGVycm9ycy5hZGQoY3R4LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAvLwkJCQkJCXN1cHByZXNzZXMgc3Vic2VxdWVudCBwcm9jZXNzaW5nLCBiZWNhdXNlIGVycm9yIGxpc3QgY29udGFpbnMgb25seSBmYWlsZWQgYmluZGluZwotICAgICAgICAgIGN0eC5jYW5jZWxCaW5kaW5nUHJvY2Vzc2luZygpOwotICAgICAgICAgIGN0eC5jYW5jZWxCaW5kaW5nT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICAgICAgICAgIGN0eC5jYW5jZWxCaW5kaW5nSW5wdXRQcm9jZXNzaW5nKCk7Ci0gICAgICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPdXRwdXRQcm9jZXNzaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQmluZGluZyh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQm9keSh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQT3BlcmF0aW9uKHRydWUpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVJbXBvcnQoKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgZWxzZSBpZiAoIWRvY0xpdGVyYWxGb3VuZCkKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEyMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyNzI4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLQotCi0vKioKLSAqIEJQMjEyMC4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmc8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+RWFjaCBvcGVyYXRpb24gcmVmZXJlbmNlZCBieSB0aGUgYmluZGluZyByZXN1bHRzIGluIGEgdW5pcXVlIHdpcmUgc2lnbmF0dXJlLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMjAgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTIwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0gIHByaXZhdGUgU2V0IHdhcmVzID0gbmV3IEhhc2hTZXQoKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZywgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPQotICAgICAgKGJpbmRpbmcuZ2V0U3R5bGUoKSA9PSBudWxsKQotICAgICAgICA/IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MKLSAgICAgICAgOiBiaW5kaW5nLmdldFN0eWxlKCk7Ci0gICAgY3R4LmFkZFBhcmFtZXRlcigic3R5bGUiLCBzdHlsZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUE9wZXJhdGlvbiBvcGVyYXRpb24sCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICBpZiAoc3R5bGUgIT0gbnVsbCkKLSAgICAgIGN0eC5hZGRQYXJhbWV0ZXIoInN0eWxlIiwgc3R5bGUpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHksIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQQm9keSBib2R5LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBMaXN0IHNpZ25hdHVyZSA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLSAgICBTdHJpbmcgc3R5bGUgPSAoU3RyaW5nKSBjdHguZ2V0UGFyYW1ldGVyKCJzdHlsZSIpOwotCi0gICAgLy8gZmluZCBjb3JyZXNwb25kaW5nIG1lc3NhZ2UKLSAgICBPcGVyYXRpb24gb3AgPSBjdHguZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE9wZXJhdGlvbigpOwotCi0gICAgLy8gaWYgc29tZSBsaW5rcyBhcmUgYnJva2VuLCBjYW5jZWwgcHJvY2Vzc2luZwotICAgIGlmIChvcCA9PSBudWxsCi0gICAgICB8fCBvcC5nZXRJbnB1dCgpID09IG51bGwKLSAgICAgIHx8IG9wLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgTWVzc2FnZSBtID0gb3AuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCk7Ci0KLSAgICBMaXN0IHBhcnRzID0gV1NETFV0aWwuZ2V0UGFydHMob3AsIG0sIGJvZHksIHN0eWxlKTsKLSAgICBpZiAocGFydHMgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICAvLyAhISBBVFRFTlRJT04KLSAgICAvLyBtYXkgYmUgcmVxdWlyZWQgdG8gYWRkIHR5cGVzIGluc3RlYWQgb2YgcGFydCBpbnRvIHNpZ25hdHVyZSA/Ci0KLSAgICAvLyBjcmVhdGUgc2lnbmF0dXJlCi0gICAgc2lnbmF0dXJlLmFkZEFsbChwYXJ0cyk7Ci0KLSAgICAvLyBzdXBwb3NlIHRoYXQgd2lyZSBzaWduYXR1cmUgZm9yCi0gICAgLy8gLSBycGMgc3R5bGUgPSBvcGVyYXRpb24gbmFtZSArIHBhcnRzJyBxbmFtZQotICAgIC8vIC0gZG9jdW1lbnQgc3R5bGUgPSBwYXJ0cycgcW5hbWUKLSAgICBpZiAoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQy5lcXVhbHMoc3R5bGUpKQotICAgICAgc2lnbmF0dXJlLmFkZCgwLCBvcC5nZXROYW1lKCkpOwotCi0gICAgaWYgKHNhbWVTaWduYXR1cmUod2FyZXMsIHNpZ25hdHVyZSkpCi0gICAgICBlcnJvcnMuYWRkKG9wLmdldE5hbWUoKSk7Ci0gICAgZWxzZQotICAgICAgd2FyZXMuYWRkKHNpZ25hdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgaWYgdGhlIHNpZ25hdHVyZSBpcyBpbiB0aGUgc2V0IG1hdGNoLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHNhbWVTaWduYXR1cmUoU2V0IHNpZ25hdHVyZVNldCwgTGlzdCBzaWduYXR1cmUpCi0gIHsKLSAgICBib29sZWFuIHNhbWUgPSBmYWxzZTsKLQotICAgIC8vIEdldCBpdGVyYXRvciBmb3Igc2V0Ci0gICAgSXRlcmF0b3Igc2V0ID0gc2lnbmF0dXJlU2V0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKHNldC5oYXNOZXh0KCkgJiYgIXNhbWUpCi0gICAgewotICAgICAgLy8gR2V0IG5leHQgc2lnbmF0dXJlIGZyb20gdGhlIHNldAotICAgICAgTGlzdCBuZXh0U2lnbmF0dXJlID0gKExpc3QpIHNldC5uZXh0KCk7Ci0KLSAgICAgIC8vIE9ubHkgY29udGludWUgaWYgdGhlIHNpZ25hdHVyZXMgYXJlIHRoZSBzYW1lIHNpemUKLSAgICAgIGlmIChuZXh0U2lnbmF0dXJlLnNpemUoKSA9PSBzaWduYXR1cmUuc2l6ZSgpKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpdGVyYXRvcjEgPSBuZXh0U2lnbmF0dXJlLml0ZXJhdG9yKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yMiA9IHNpZ25hdHVyZS5pdGVyYXRvcigpOwotCi0gICAgICAgIC8vIEFzc3VtZSBzYW1lIHVudGlsIGEgZGlmZmVyZW5jZSBpcyBmb3VuZAotICAgICAgICBzYW1lID0gdHJ1ZTsKLQotICAgICAgICAvLyBQcm9jZXNzIGVhY2ggbGlzdCB1bnRpbCBhIGRpZmZlcmVuY2UgaXMgZm91bmQKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yMS5oYXNOZXh0KCkgJiYgaXRlcmF0b3IyLmhhc05leHQoKSAmJiBzYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IGVsZW1lbnRzCi0gICAgICAgICAgT2JqZWN0IGVsZW1lbnQxID0gaXRlcmF0b3IxLm5leHQoKTsKLSAgICAgICAgICBPYmplY3QgZWxlbWVudDIgPSBpdGVyYXRvcjIubmV4dCgpOwotCi0gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSBzdHJpbmcsIHRoZW4gaWYgZXF1YWwgY2hlY2sgcGFydHMKLSAgICAgICAgICBpZiAoKGVsZW1lbnQxIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgJiYgKGVsZW1lbnQyIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgJiYgKCgoU3RyaW5nKSBlbGVtZW50MSkuZXF1YWxzKChTdHJpbmcpIGVsZW1lbnQyKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2FtZSA9IHRydWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnRzIGFyZSBwYXJ0cywgdGhlbiBjaGVjayBpZiB0aGV5IGFyZSBlcXVhbAotICAgICAgICAgIGVsc2UgaWYgKChlbGVtZW50MSBpbnN0YW5jZW9mIFBhcnQpICYmIChlbGVtZW50MiBpbnN0YW5jZW9mIFBhcnQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNhbWUgPSBzYW1lUGFydHMoKFBhcnQpIGVsZW1lbnQxLCAoUGFydCkgZWxlbWVudDIpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzYW1lID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHNhbWU7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgaWYgdHdvIHBhcnRzIGFyZSB0aGUgc2FtZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBzYW1lUGFydHMoUGFydCBwYXJ0MSwgUGFydCBwYXJ0MikKLSAgewotICAgIGJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCi0gICAgLy8gSWYgdGhlIHBhcnQgaGFzIGFuIGVsZW1lbnQgdGhlbiBzZWUgaWYgdGhleSBhcmUgdGhlIHNhbWUKLSAgICBpZiAocGFydDEuZ2V0RWxlbWVudE5hbWUoKSAhPSBudWxsCi0gICAgICAmJiBwYXJ0Mi5nZXRFbGVtZW50TmFtZSgpICE9IG51bGwKLSAgICAgICYmIHBhcnQxLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHBhcnQyLmdldEVsZW1lbnROYW1lKCkpKQotICAgIHsKLSAgICAgIHNhbWUgPSB0cnVlOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBwYXJ0IGhhcyBhbiB0eXBlIHRoZW4gc2VlIGlmIHRoZXkgYXJlIHRoZSBzYW1lCi0gICAgZWxzZSBpZiAoCi0gICAgICBwYXJ0MS5nZXRUeXBlTmFtZSgpICE9IG51bGwKLSAgICAgICAgJiYgcGFydDIuZ2V0VHlwZU5hbWUoKSAhPSBudWxsCi0gICAgICAgICYmIHBhcnQxLmdldFR5cGVOYW1lKCkuZXF1YWxzKHBhcnQyLmdldFR5cGVOYW1lKCkpKQotICAgIHsKLSAgICAgIHNhbWUgPSB0cnVlOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzYW1lID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNhbWU7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQmluZGluZyh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQm9keSh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQT3BlcmF0aW9uKHRydWUpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpKTsKLQotICAgIC8vICEhIEFUVEVOVElPTgotICAgIC8vIEFuYWx5emUgc29hcGJpbmQ6Ym9keTpuYW1lc3BhY2UgYW5kIHNlcnZpY2UgdGFyZ2V0TmFtZXNwYWNlICAgICAgICAgICAgCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTIxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWQ1OTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UeXBlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLQotCi0vKioKLSAqIEJQMjEyMS4KLSAqIENvbnRleHQ6Ci0gKiBGb3IgIGEgd3NkbDpiaW5kaW5nIGVsZW1lbnQgd2hpY2ggaXMgcmVmZXJlbmNlZCBkaXJlY3RseSBvciBhc3NvY2lhdGVkCi0gKiB3aXRoIGEgc3BlY2lmaWVkIHdzZGw6cG9ydC4KLSAqIAotICogQXNzZXJ0aW9uIERlc2NyaXB0aW9uOgotICogRWFjaCAgb3BlcmF0aW9uIHJlZmVyZW5jZWQgYnkgYSBkb2N1bWVudC1saXRlcmFsIGJpbmRpbmcgbXVzdCBoYXZlIGEKLSAqIG1lc3NhZ2UgZGVmaW5pdGlvbiB3aGVyZSB0aGUgd3NkbDpwYXJ0IHJlZmVyZW5jZXMgYSBnbG9iYWwgZWxlbWVudAotICogZGVmaW5pdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEJQMjEyMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0KLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjEyMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotICBwcml2YXRlIFR5cGVzUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPQotICAgICAgKGJpbmRpbmcuZ2V0U3R5bGUoKSA9PSBudWxsKQotICAgICAgICA/IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MKLSAgICAgICAgOiBiaW5kaW5nLmdldFN0eWxlKCk7Ci0gICAgY3R4LmFkZFBhcmFtZXRlcigic3R5bGUiLCBzdHlsZSk7Ci0gIH0KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUE9wZXJhdGlvbiBvcGVyYXRpb24sCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICBpZiAoc3R5bGUgPT0gbnVsbCkKLSAgICAgIHN0eWxlID0gKFN0cmluZykgY3R4LmdldFBhcmFtZXRlcigic3R5bGUiKTsKLSAgICAvLyBhc3NlcnQgc3R5bGUgIT0gbnVsbAotICAgIGlmICghV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQy5lcXVhbHMoc3R5bGUpKQotICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQQm9keSBib2R5LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICAvLyAhISBBVFRFTlRJT04KLSAgICAvLyB3ZSBzdXBwb3NlIHRoYXQgc29hcGJvZHkgY2hpbGQgZWxlbWVudHMgaXMgaXRzIHBhcnRzLgotICAgIC8vIGFzc2VydCBzdHlsZSA9PSAiZG9jdW1lbnQiCi0gICAgaWYgKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElULmVxdWFscyhib2R5LmdldFVzZSgpKSkKLSAgICB7Ci0gICAgICAvLyBmaW5kIGNvcnJlc3BvbmRpbmcgbWVzc2FnZQotICAgICAgT3BlcmF0aW9uIG9wID0gY3R4LmdldEJpbmRpbmdPcGVyYXRpb24oKS5nZXRPcGVyYXRpb24oKTsKLSAgICAgIC8vIGlmIHNvbWUgbGlua3MgYXJlIGJyb2tlbiwgY2FuY2VsIHByb2Nlc3NpbmcKLSAgICAgIGlmIChvcCA9PSBudWxsCi0gICAgICAgIHx8IChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQgJiYgb3AuZ2V0SW5wdXQoKSA9PSBudWxsKQotICAgICAgICB8fCAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCAmJiBvcC5nZXRPdXRwdXQoKSA9PSBudWxsKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBNZXNzYWdlIG0gPQotICAgICAgICAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZ0lucHV0KQotICAgICAgICAgID8gb3AuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICA6IG9wLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICAgIGlmIChtID09IG51bGwpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgLy8gZmluZCBwYXJ0cyB3aGljaCBhcmUgaW52b2x2ZWQgaW4gdGhlIGdpdmVuIGJvZHkKLSAgICAgIExpc3QgcGFydHMgPQotICAgICAgICBXU0RMVXRpbC5nZXRQYXJ0cygKLSAgICAgICAgICBvcCwKLSAgICAgICAgICBtLAotICAgICAgICAgIGJvZHksCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQyk7Ci0gICAgICBpZiAocGFydHMgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICAvLyBjaGVjayBwYXJ0cwotICAgICAgSXRlcmF0b3IgaXQgPSBwYXJ0cy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUGFydCBwID0gKFBhcnQpIGl0Lm5leHQoKTsKLSAgICAgICAgLy8gY2hlY2sgd2hldGhlciBwIGRlY2xhcmVkIGFzIGdsb2JhbCBlbGVtZW50Ci0gICAgICAgIGlmIChwLmdldEVsZW1lbnROYW1lKCkgPT0gbnVsbAotICAgICAgICAgIHx8IHJlZ2lzdHJ5LmdldFR5cGUocC5nZXRFbGVtZW50TmFtZSgpKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3JzLmFkZChvcC5nZXROYW1lKCkpOwotICAgICAgICAgIC8vCQkJCQkJc3VwcHJlc3NlcyBzdWJzZXF1ZW50IHByb2Nlc3NpbmcsIGJlY2F1c2UgZXJyb3IgbGlzdCBjb250YWlucyBvbmx5IGZhaWxlZCBvcGVyYXRpb24KLSAgICAgICAgICBjdHguY2FuY2VsQmluZGluZ09wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICByZWdpc3RyeSA9Ci0gICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgZW50cnlDb250ZXh0LmdldFdTRExEb2N1bWVudCgpLmdldERlZmluaXRpb25zKCksCi0gICAgICAgIHZhbGlkYXRvcik7Ci0KLSAgICAvLyBjb2xsZWN0IGFsbCB0eXBlcyBmcm9tIG1lc3NhZ2VzIHRvIGNoZWNrZWRQYXJ0cyBtYXAKLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQmluZGluZyh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQm9keSh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQT3BlcmF0aW9uKHRydWUpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZUltcG9ydCgpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZSgoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKSk7Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMjIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTFlZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci0KLQotLyoqCi0gKiBCUDIxMjIuIAotICogICAgPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6dHlwZXMgZWxlbWVudDwvY29udGV4dD4KLSAqICAgIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgZGF0YSB0eXBlIGRlZmluaXRpb24gaWYgYW55IHdpdGhpbiB0aGUgd3NkbDp0eXBlcyBlbGVtZW50IGlzIGFuIFhNTCBzY2hlbWEgZGVmaW5pdGlvbiBkZWZpbmVkIGluIHRoZSBYTUwgU2NoZW1hIDEuMCBSZWNvbW1lbmRhdGlvbiB3aXRoIHRoZSBuYW1lc3BhY2UgVVJJICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjEyMiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjEyMihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dDsKLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKFRlc3RBc3NlcnRpb24sIEVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgRXJyb3JMaXN0IGVycm9yTGlzdCA9IG5ldyBFcnJvckxpc3QoKTsKLQotICAgIC8vIEdldCB0aGUgdHlwZXMgZnJvbSB0aGUgZW50cnkgY29udGV4dAotICAgIFR5cGVzIHR5cGVzID0gKFR5cGVzKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQotICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmICgoZGVmaW5pdGlvbiA9Ci0gICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldERlZmluaXRpb24odHlwZXMpKQotICAgICAgICA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCB0eXBlcyBkZWZpbml0aW9uIGluIGFueSBXU0RMIGRvY3VtZW50LiIpOwotICAgICAgfQotCi0gICAgICBjb250ZXh0ID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLQotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudDsKLSAgICAgIExpc3QgZXh0RWxlbWVudHMgPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQotICAgICAgLy8gUHJvY2VzcyBlYWNoIGV4dC4gZWxlbWVudAotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRFbGVtZW50cy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgaXQgaXMgYW4gdW5rbm93biBleHQuIGVsZW1lbnQgYW5kIGl0IGlzIGEgc2NoZW1hLCB0aGVuIGNoZWNrIGl0Ci0gICAgICAgIGlmICgoZXh0RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbWVudHMuZ2V0KGkpKQotICAgICAgICAgIGluc3RhbmNlb2YgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFleHRFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTSVRhZy5FTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIGl0IGlzIG5vdCBhIHNjaGVtYSBkZWZpbml0aW9uLCB0aGVuIGl0IGlzIGFuIGVycm9yCi0gICAgICAgICAgICBlcnJvckxpc3QuYWRkKAotICAgICAgICAgICAgICBleHRFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICsgIiBjYW4gbm90IGJlIGEgY2hpbGQgb2YgdGhlIHdzZGw6dHlwZXMgZWxlbWVudC4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiBYTUxTY2hlbWFWYWxpZGF0b3IgY291bGQgbm90IGZpbmQgYW55IGVycm9ycywgY2hlY2sgZXJyb3JzIGZyb20gdGhlIGlubGluZSBzY2hlbWEgdmFsaWRhdG9yCi0gICAgaWYgKGVycm9yTGlzdC5pc0VtcHR5KCkpCi0gICAgICBlcnJvckxpc3QuYWRkKHZhbGlkYXRvci53c2RsRG9jdW1lbnQuZ2V0U2NoZW1hc1ZhbGlkYXRpb25FcnJvcnMoKSk7Ci0KLSAgICBpZiAoIWVycm9yTGlzdC5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvckxpc3QudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMjMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNWY4MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogQlAyMTIzLiAKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmRlZmluaXRpb25zLCBpZiBpdCBjb250YWlucyBhIHdzZGw6cG9ydCwgd3NkbDpiaW5kaW5nLCB3c2RsOnBvcnRUeXBlLCB3c2RsOm9wZXJhdGlvbiwgb3Igd3NkbDptZXNzYWdlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkNvbnRhaW5lZCBXU0RMIGV4dGVuc2lvbiBlbGVtZW50cyBkbyBub3QgdXNlIHRoZSB3c2RsOnJlcXVpcmVkIGF0dHJpYnV0ZSB2YWx1ZSBvZiAidHJ1ZSIuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjEyMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMjMoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBjbGFpbUZvdW5kID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfS0VZID0gInBvcnQiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19LRVkgPSAiYmluZGluZyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX1RZUEVfS0VZID0gInBvcnQgdHlwZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJT05fS0VZID0gIm9wZXJhdGlvbiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0tFWSA9ICJtZXNzYWdlIjsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuUG9ydCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUG9ydCBwb3J0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAocG9ydCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChjb250YWluc0xlZ2FsQ2xhaW0ocG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKSkKLSAgICAgIHsKLSAgICAgICAgY2xhaW1Gb3VuZCA9IHRydWU7Ci0gICAgICAgIGN0eC5hZGRQYXJhbWV0ZXIoUE9SVF9LRVksIEJvb2xlYW4uVFJVRSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGN0eC5hZGRQYXJhbWV0ZXIoUE9SVF9LRVksIEJvb2xlYW4uRkFMU0UpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuQmluZGluZywgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEJpbmRpbmcgYmluZGluZywgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBCb29sZWFuIHBvcnQgPSAoQm9vbGVhbikgY3R4LmdldFBhcmFtZXRlcihQT1JUX0tFWSk7Ci0KLSAgICAgIGlmIChwb3J0LmJvb2xlYW5WYWx1ZSgpKQotICAgICAgewotICAgICAgICBjdHguYWRkUGFyYW1ldGVyKEJJTkRJTkdfS0VZLCBCb29sZWFuLlRSVUUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjbGFpbUZvdW5kID0gY29udGFpbnNDbGFpbShiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgICAgICBjdHguYWRkUGFyYW1ldGVyKAotICAgICAgICAgIEJJTkRJTkdfS0VZLAotICAgICAgICAgIG5ldyBCb29sZWFuKGNvbnRhaW5zTGVnYWxDbGFpbShiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5Qb3J0VHlwZSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFBvcnRUeXBlIHR5cGUsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgQm9vbGVhbiBiaW5kaW5nID0gKEJvb2xlYW4pIGN0eC5nZXRQYXJhbWV0ZXIoQklORElOR19LRVkpOwotCi0gICAgICBpZiAoYmluZGluZy5ib29sZWFuVmFsdWUoKSkKLSAgICAgIHsKLSAgICAgICAgY3R4LmFkZFBhcmFtZXRlcihQT1JUX1RZUEVfS0VZLCBCb29sZWFuLlRSVUUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjbGFpbUZvdW5kID0gY29udGFpbnNDbGFpbSh0eXBlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgICAgICBjdHguYWRkUGFyYW1ldGVyKAotICAgICAgICAgIFBPUlRfVFlQRV9LRVksCi0gICAgICAgICAgbmV3IEJvb2xlYW4oY29udGFpbnNMZWdhbENsYWltKHR5cGUuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSkpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLk9wZXJhdGlvbiwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24sCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgQm9vbGVhbiB0eXBlID0gKEJvb2xlYW4pIGN0eC5nZXRQYXJhbWV0ZXIoUE9SVF9UWVBFX0tFWSk7Ci0KLSAgICAgIGlmICh0eXBlLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgewotICAgICAgICBjdHguYWRkUGFyYW1ldGVyKE9QRVJBVElPTl9LRVksIEJvb2xlYW4uVFJVRSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNsYWltRm91bmQgPSBjb250YWluc0NsYWltKG9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAgICAgY3R4LmFkZFBhcmFtZXRlcigKLSAgICAgICAgICBPUEVSQVRJT05fS0VZLAotICAgICAgICAgIG5ldyBCb29sZWFuKAotICAgICAgICAgICAgY29udGFpbnNMZWdhbENsYWltKG9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKSkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuTWVzc2FnZSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KE1lc3NhZ2UgbWVzc2FnZSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBCb29sZWFuIG9wZXJhdGlvbiA9IChCb29sZWFuKSBjdHguZ2V0UGFyYW1ldGVyKE9QRVJBVElPTl9LRVkpOwotCi0gICAgICBpZiAob3BlcmF0aW9uLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgewotICAgICAgICBjdHguYWRkUGFyYW1ldGVyKE1FU1NBR0VfS0VZLCBCb29sZWFuLlRSVUUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjbGFpbUZvdW5kID0gY29udGFpbnNDbGFpbShtZXNzYWdlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgICAgICBjdHguYWRkUGFyYW1ldGVyKAotICAgICAgICAgIE1FU1NBR0VfS0VZLAotICAgICAgICAgIG5ldyBCb29sZWFuKGNvbnRhaW5zTGVnYWxDbGFpbShtZXNzYWdlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgcHVibGljIHZvaWQgdmlzaXQoQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24sIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkgewotICAJaWYgKG9wZXJhdGlvbiAhPSBudWxsKSB7Ci0gIAkJaWYgKGNvbnRhaW5zTGVnYWxDbGFpbShvcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSkpIHsKLSAgCQkJU3lzdGVtLm91dC5wcmludGxuKCJiaW5kaW5nIG9wZXJhdGlvbiBmb3VuZCIpOwotICAJCX0gZWxzZSB7Ci0gIAkJCQotICAJCX0KLSAgCX0KLSAgfQotICAqLwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBib29sZWFuIHJlcXVpcmVkID0KLSAgICAgIGVsICE9IG51bGwKLSAgICAgICAgJiYgZWwuZ2V0UmVxdWlyZWQoKSAhPSBudWxsCi0gICAgICAgICYmIGVsLmdldFJlcXVpcmVkKCkuYm9vbGVhblZhbHVlKCk7Ci0KLSAgICBpZiAoaXNQYXJlbnRDb25mb3JtcyhwYXJlbnQsIGN0eCkpCi0gICAgewotICAgICAgaWYgKHJlcXVpcmVkKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0gZWwudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBhcmVudCBlbGVtZW50IGNvbmZvcm1zIHRvIHRoZSBiYXNpYyBwcm9maWxlLgotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqIEBwYXJhbSBjdHgKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNQYXJlbnRDb25mb3JtcyhPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFBvcnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKChCb29sZWFuKSBjdHguZ2V0UGFyYW1ldGVyKFBPUlRfS0VZKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKAotICAgICAgcGFyZW50IGluc3RhbmNlb2YgQmluZGluZwotICAgICAgICB8fCBwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgIHx8IHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dAotICAgICAgICB8fCBwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0Ci0gICAgICAgIHx8IHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKEJvb2xlYW4pIGN0eC5nZXRQYXJhbWV0ZXIoQklORElOR19LRVkpKS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgUG9ydFR5cGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gKChCb29sZWFuKSBjdHguZ2V0UGFyYW1ldGVyKFBPUlRfVFlQRV9LRVkpKS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoCi0gICAgICBwYXJlbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24KLSAgICAgICAgfHwgcGFyZW50IGluc3RhbmNlb2YgSW5wdXQKLSAgICAgICAgfHwgcGFyZW50IGluc3RhbmNlb2YgT3V0cHV0Ci0gICAgICAgIHx8IHBhcmVudCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQm9vbGVhbikgY3R4LmdldFBhcmFtZXRlcihPUEVSQVRJT05fS0VZKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1lc3NhZ2UgfHwgcGFyZW50IGluc3RhbmNlb2YgUGFydCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKEJvb2xlYW4pIGN0eC5nZXRQYXJhbWV0ZXIoTUVTU0FHRV9LRVkpKS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgLy8gRXhwZWN0IHdzZGw6ZGVmaW50aW9ucwotICAgIERlZmluaXRpb24gZGVmID0gKERlZmluaXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0gICAgLy8oKFNlcnZpY2UpZGVmLmdldFNlcnZpY2VzKCkudmFsdWVzKCkudG9BcnJheSgpWzBdKS5nZXRQb3J0cygpCi0gICAgLy8gVHJhdmVyc2UgV1NETAotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvLyBWaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRPcGVyYXRpb24odHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0QmluZGluZyh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRNZXNzYWdlKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFBvcnQodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0UG9ydFR5cGUodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQodHJ1ZSk7Ci0KLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZURlZmluaXRpb24yQmluZGluZygpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVEZWZpbml0aW9uMkVsZW1lbnQoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlRGVmaW5pdGlvbjJFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVEZWZpbml0aW9uMk1lc3NhZ2UoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlRGVmaW5pdGlvbjJQb3J0VHlwZSgpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVEZWZpbml0aW9uMlR5cGVzKCk7Ci0KLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoZGVmKTsKLQotICAgIGlmICghY2xhaW1Gb3VuZCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIGVsc2UgaWYgKHJlc3VsdC5lcXVhbHMoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HKSkKLSAgICB7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChmYWlsdXJlRGV0YWlsTWVzc2FnZSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQgd2hldGhlciBjb250YWlucyBjb25mb3JtYW5jZSBjbGFpbXMuCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBkb2N1bWVudGF0aW9uIGVsZW1lbnQgY29udGFpbnMgY29uZm9ybWFuY2UgY2xhaW0gd2l0aAotICAgKiBsZWdhbCBzY2hlbWEgZGVmaW5pdGlvbiBVUkkuIAotICAgKiBsZWdhbCBpcyAnaHR0cDovL3dzLWkub3JnL3NjaGVtYXMvY29uZm9ybWFuY2VDbGFpbS8nCi0gICAqIEBwYXJhbSBlbAotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0NsYWltKEVsZW1lbnQgZWwpCi0gIHsKLSAgICBpZiAoZWwgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAvLyBmaW5kIGNsYWltCi0gICAgZWwgPSBYTUxVdGlscy5maW5kQ2hpbGRFbGVtZW50KGVsLCBXU0lfQ0xBSU0pOwotICAgIGlmIChlbCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudCB3aGV0aGVyIGNvbnRhaW5zIGNvbmZvcm1hbmNlIGNsYWltcy4KLSAgICogUmV0dXJucyB0cnVlIGlmIGRvY3VtZW50YXRpb24gZWxlbWVudCBjb250YWlucyBjb25mb3JtYW5jZSBjbGFpbSB3aXRoCi0gICAqIGxlZ2FsIHNjaGVtYSBkZWZpbml0aW9uIFVSSS4gCi0gICAqIGxlZ2FsIGlzICdodHRwOi8vd3MtaS5vcmcvc2NoZW1hcy9jb25mb3JtYW5jZUNsYWltLycKLSAgICogQHBhcmFtIGVsCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zTGVnYWxDbGFpbShFbGVtZW50IGVsKQotICB7Ci0gICAgaWYgKGVsID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLy8gZmluZCBjbGFpbQotICAgIGVsID0gWE1MVXRpbHMuZmluZENoaWxkRWxlbWVudChlbCwgV1NJX0NMQUlNKTsKLSAgICB3aGlsZSAoZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBlbC5nZXRBdHRyaWJ1dGUoQVRUUl9DTEFJTV9DT05GT1JNU1RPLmdldExvY2FsUGFydCgpKTsKLSAgICAgIGlmICh2YWx1ZSAhPSBudWxsCi0gICAgICAgICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoV1NJQ29uc3RhbnRzLkFUVFJWQUxfVURESV9DTEFJTV9LRVlWQUxVRSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgICBlbCA9IFhNTFV0aWxzLmZpbmRFbGVtZW50KGVsLCBXU0lfQ0xBSU0pOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjIwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIyMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0ZGRmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjIwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEJQMjIwMS4gCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgV2ViIHNlcnZpY2UgZGVmaW5pdGlvbiB3aXRoaW4gYSBXU0RMIGRvY3VtZW50IHdpdGggYSBYTUwgZGVjbGFyYXRpb24gc3RhdGVtZW50LiA8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIFhNTCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQgdXNlcyBVVEYtOCBvciBVVEYtMTYgZm9yIHRoZSBlbmNvZGluZy4gPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjIwMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjIwMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gT01NSVRFRF9YTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUyA9IG5ldyBjaGFyW117MHgyMCwKLSAgICAgIDB4OSwgMHhELCAweEEsICdcJycsICdcIid9OwotICBwcml2YXRlIGZpbmFsIGNoYXJbXSBYTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUyA9IG5ldyBjaGFyW117Jz0nfTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVVRGXzhfRU5DT0RJTkcgPSAiVVRGLTgiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBVVEZfMTZfRU5DT0RJTkcgPSAiVVRGLTE2IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfVE9LRU4gPSAiZW5jb2RpbmciOwotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwKLSAgICogICAgICBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkKLSAgICAgICAgLmdldEVudHJ5RGV0YWlsKCk7Ci0gICAgU3RyaW5nIGxvY2F0aW9uID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLSAgICBTdHJpbmcgeG1sRGVjbCA9IHJlYWRYTUxEZWNsYXJhdGlvblN0YXRlbWVudChsb2NhdGlvbik7Ci0gICAgaWYgKHhtbERlY2wgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgIGlmICghdmFsaWRFbmNvZGluZyh4bWxEZWNsKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCh4bWxEZWNsLCBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLSAgLyoqCi0gICAqIFJlYWRzIGFuIFhNTCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlYWRYTUxEZWNsYXJhdGlvblN0YXRlbWVudChTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgIFJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd2Ugc2hvdWxkIHRyeSB0byBhY2Nlc3MgbG9jYXRpb24gYXMgZmlsZQotICAgICAgICB9Ci0gICAgICAgIGlmICh1cmwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcih1cmwub3BlblN0cmVhbSgpKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShsb2NhdGlvbikpOwotICAgICAgICB9Ci0gICAgICAgIGludCBjaGFyQ29kZTsKLSAgICAgICAgYm9vbGVhbiBlbmQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHJlYWRlci5yZWFkeSgpKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhckNvZGUgPSByZWFkZXIucmVhZCgpOwotICAgICAgICAgIHdoaWxlIChyZWFkZXIucmVhZHkoKSAmJiAhKGNoYXJDb2RlID09ICc8JykpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hhckNvZGUgPSByZWFkZXIucmVhZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjaGFyW10gYyA9IG5ldyBjaGFyWzRdOwotICAgICAgICAgIHJlYWRlci5yZWFkKGMpOwotICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgaWYgKG5ldyBTdHJpbmcoYykudG9Mb3dlckNhc2UoKS5lcXVhbHMoIj94bWwiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCI8P3htbCIpOwotICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5yZWFkeSgpICYmICFlbmQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNoYXJDb2RlID0gcmVhZGVyLnJlYWQoKTsKLSAgICAgICAgICAgICAgYnVmLmFwcGVuZCgoY2hhcikgY2hhckNvZGUpOwotICAgICAgICAgICAgICBlbmQgPSBjaGFyQ29kZSA9PSAnPic7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gTk9URTogVGhpcyByZXN1bHQgZG9lcyBub3QgZ2V0IHByb3BvZ2F0ZWQgYmFjayEKLSAgICAgICAgICAgIHRoaXMucmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXN1bHQgPSBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vVkVSQk9TRQotICAgICAgICBpZiAodmFsaWRhdG9yLnZlcmJvc2VPcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgW1dTSTIyMDFdIEV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgfSBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAvKgotICAgKiBWZXJpZnkgeG1sIGRlY2xhcmF0aW9uIGNvbnRhaW5zIHV0Zi0xNiBvciB1dGYtOCBlbmNvZGluZy4gQHBhcmFtIHhtbERlY2wgLQotICAgKiB4bWwgZGVjbGFyYXRpb24gQHJldHVybgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHZhbGlkRW5jb2RpbmcoU3RyaW5nIHhtbERlY2wpCi0gIHsKLSAgICAvL2Jvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIGlmICh4bWxEZWNsICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgICBPTU1JVEVEX1hNTF9ERUNMQVJBVElPTl9ERUxJTUlURVJTLCBYTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUyk7Ci0gICAgICBFbnVtZXJhdGlvbiB0b2tlbnMgPSBzdC5wYXJzZSh4bWxEZWNsKTsKLSAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgIHdoaWxlICh0b2tlbnMuaGFzTW9yZUVsZW1lbnRzKCkgJiYgIWZvdW5kKQotICAgICAgewotICAgICAgICBTdHJpbmcgdG9rZW4gPSAoU3RyaW5nKSB0b2tlbnMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHRva2VuLmVxdWFscyhFTkNPRElOR19UT0tFTikpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgdG9rZW5zLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgU3RyaW5nIGVuYyA9IChTdHJpbmcpIHRva2Vucy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIHJlc3VsdCA9IFVURl84X0VOQ09ESU5HLmVxdWFsc0lnbm9yZUNhc2UoZW5jKQotICAgICAgICAgICAgICB8fCBVVEZfMTZfRU5DT0RJTkcuZXF1YWxzSWdub3JlQ2FzZShlbmMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMjAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjIwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Q4ODZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMjAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogQlAyMjAyLgotICogIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOnR5cGVzIGVsZW1lbnQgd2l0aGluIGEgV1NETCBkb2N1bWVudCB3aGljaCBpbXBvcnRzIGFuIFhNTCBzY2hlbWEgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS48L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIGltcG9ydGVkIHNjaGVtYSB1c2VzIFVURi04IG9yIFVURi0xNiBmb3IgdGhlIGVuY29kaW5nLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIyMDIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIyMDIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLSAgcHJpdmF0ZSBib29sZWFuIGltcG9ydEZvdW5kID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gT01NSVRFRF9YTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUyA9Ci0gICAgbmV3IGNoYXJbXSB7IDB4MjAsIDB4OSwgMHhELCAweEEsICdcJycsICdcIicgfTsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gWE1MX0RFQ0xBUkFUSU9OX0RFTElNSVRFUlMgPSBuZXcgY2hhcltdIHsgJz0nIH07Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFVURl84X0VOQ09ESU5HID0gIlVURi04IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVVRGXzE2X0VOQ09ESU5HID0gIlVURi0xNiI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfVE9LRU4gPSAiZW5jb2RpbmciOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBWRVJTSU9OX1RPS0VOID0gInZlcnNpb24iOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0KLSAgICAvL0RlZmluaXRpb24gZGVmID0gKERlZmluaXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0gICAgVHlwZXMgdHlwZXMgPSAoVHlwZXMpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0gICAgTGlzdCBleHRzID0gbnVsbDsKLSAgICAvL2lmIChkZWYuZ2V0VHlwZXMoKSAhPSBudWxsKQotICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgLy9leHRzID0gZGVmLmdldFR5cGVzKCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBleHRzID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgaWYgKGV4dHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotICAgICAgaWYgKChkZWZpbml0aW9uID0KLSAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0RGVmaW5pdGlvbih0eXBlcykpCi0gICAgICAgID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIHR5cGVzIGRlZmluaXRpb24gaW4gYW55IFdTREwgZG9jdW1lbnQuIik7Ci0gICAgICB9Ci0KLSAgICAgIEl0ZXJhdG9yIGl0ID0gZXh0cy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAgICAgICAgJiYgZWwuZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoRUxFTV9YU0RfU0NIRU1BKSkKLSAgICAgICAgICBzZWFyY2hGb3JTY2hlbWEoKChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVsKS5nZXRFbGVtZW50KCksCi0gICAgICAgICAgICAgIGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIGVsc2UgaWYgKCFpbXBvcnRGb3VuZCkKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKgotICAgKiBTZWFyY2ggeHNkIHNjaGVtYSBvciB4c2QgaW1wb3J0IGZyb20gbm9kZS4gSWYgbm9kZSBpcyB4c2QgaW1wb3J0IGl0J3MgbG9hZGluZyBzY2hlbWEuCi0gICAqIEBwYXJhbSBuIC0gbm9kZQotICAqLwotICBwcml2YXRlIHZvaWQgc2VhcmNoRm9yU2NoZW1hKE5vZGUgbiwgU3RyaW5nIGNvbnRleHQpCi0gIHsKLSAgICB3aGlsZSAobiAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIHNlYXJjaGVzIGZvciB4c2Q6aW1wb3J0IGVsZW1lbnQKLSAgICAgIGlmIChOb2RlLkVMRU1FTlRfTk9ERSA9PSBuLmdldE5vZGVUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIHhzZDpzY2hlbWEgZWxlbWVudCBpcyBmb3VuZCAtPiBwcm9jZXNzIHNjaGVtYQotICAgICAgICBpZiAoWE1MVXRpbHMuZXF1YWxzKG4sIEVMRU1fWFNEX1NDSEVNQSkpCi0gICAgICAgIHsKLSAgICAgICAgICBwcm9jZXNzU2NoZW1hKG4sIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIGlmIHhzZDppbXBvcnQgZWxlbWVudCBpcyBmb3VuZCAtPiBsb2FkIHNjaGVtYSBhbmQgcHJvY2VzcyBzY2hlbWEKLSAgICAgICAgICBpZiAoWE1MVXRpbHMuZXF1YWxzKG4sIEVMRU1fWFNEX0lNUE9SVCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW1wb3J0Rm91bmQgPSB0cnVlOwotICAgICAgICAgICAgbG9hZFNjaGVtYShuLCBjb250ZXh0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgLy8gZWxzZSBpdGVyYXRlIGVsZW1lbnQgcmVjdXJzaXZlbHkKLSAgICAgICAgICAgIHNlYXJjaEZvclNjaGVtYShuLmdldEZpcnN0Q2hpbGQoKSwgY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG4gPSBuLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogSXQgbG9hZHMgeHNkIHNjaGVtYSBhbmQgdGhlbiBjaGVjayB2YWxpZCBlbmNvZGluZyBhbmQgbG9va2luZyBmb3IgeHNkOnNjaGVtYSBlbGVtZW50IGZvciBuZXh0IHByb2Nlc3MuIAotICAgKiBAcGFyYW0gaW1wb3J0Tm9kZSAtIHhzZCBzY2hlbWEKLSAgKi8KLSAgcHJpdmF0ZSB2b2lkIGxvYWRTY2hlbWEoTm9kZSBpbXBvcnROb2RlLCBTdHJpbmcgY29udGV4dCkKLSAgewotICAgIEVsZW1lbnQgaW0gPSAoRWxlbWVudCkgaW1wb3J0Tm9kZTsKLSAgICBBdHRyIHNjaGVtYUxvY2F0aW9uID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGltLCBBVFRSX1hTRF9TQ0hFTUFMT0NBVElPTik7Ci0gICAgLy8gdHJ5IHRvIHBhcnNlIGltcG9ydGVkIFhTRAotICAgIGlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmIHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCkgIT0gbnVsbCkKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBpZiBhbnkgZXJyb3Igb3Igcm9vdCBlbGVtZW50IGlzIG5vdCBYU0Qgc2NoZW1hIC0+IGVycm9yCi0gICAgICAgIFN0cmluZyBkZWNsID0KLSAgICAgICAgICByZWFkWE1MRGVjbGFyYXRpb25TdGF0ZW1lbnQoc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSwgY29udGV4dCk7Ci0gICAgICAgIGlmICghdmFsaWREZWNsYXJhdGlvbihkZWNsLAotICAgICAgICAgIEVOQ09ESU5HX1RPS0VOLAotICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFVURl84X0VOQ09ESU5HLCBVVEZfMTZfRU5DT0RJTkcgfSkpCi0gICAgICAgIHsKLSAgICAgICAgICBBdHRyIGEgPSBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoaW0sIEFUVFJfWFNEX05BTUVTUEFDRSk7Ci0gICAgICAgICAgZXJyb3JzLmFkZCgoYSAhPSBudWxsKSA/IGEuZ2V0VmFsdWUoKSA6ICIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdmFsaWREZWNsYXJhdGlvbihkZWNsLCAidmVyc2lvbiIsIG5ldyBTdHJpbmdbXSB7ICIxLjAiIH0pKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3JzLmFkZCgKLSAgICAgICAgICAgICJWZXJzaW9uIG51bWJlciBpbiBYTUwgZGVjbGFyYXRpb24gaXMgbm90IDEuMC4gIFhNTCBzY2hlbWEgZmlsZTogIgotICAgICAgICAgICAgICArIHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpICsgIjoiICsgY29udGV4dCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgc2NoZW1hID0KLSAgICAgICAgICB2YWxpZGF0b3IucGFyc2VYTUxEb2N1bWVudFVSTChzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpLCBjb250ZXh0KTsKLQotICAgICAgICBpZiAoWE1MVXRpbHMuZXF1YWxzKHNjaGVtYS5nZXREb2N1bWVudEVsZW1lbnQoKSwgRUxFTV9YU0RfU0NIRU1BKSkKLSAgICAgICAgewotICAgICAgICAgIEF0dHIgYSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZShpbSwgQVRUUl9YU0RfTkFNRVNQQUNFKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKGEgIT0gbnVsbCkgPyBhLmdldFZhbHVlKCkgOiAiIjsKLSAgICAgICAgICBwcm9jZXNzU2NoZW1hKHNjaGVtYS5nZXREb2N1bWVudEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlVVJMU3RyaW5nKHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksIGNvbnRleHQpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFJlYWRzIGFuIFhNTCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuCi0gICogQHBhcmFtIGxvY2F0aW9uCi0gICogQHJldHVybiBTdHJpbmcKLSAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVhZFhNTERlY2xhcmF0aW9uU3RhdGVtZW50KFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIGJhc2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIC8vIG5vdGhpbmcKLSAgICAgIGludCBpID0gYmFzZVVSSS5sYXN0SW5kZXhPZignLycpOwotICAgICAgaW50IGogPSBiYXNlVVJJLmxhc3RJbmRleE9mKCdcXCcpOwotICAgICAgaWYgKGogPiBpKQotICAgICAgICBpID0gajsKLSAgICAgIGxvY2F0aW9uID0gYmFzZVVSSS5zdWJzdHJpbmcoMCwgaSArIDEpICsgbG9jYXRpb247Ci0gICAgfQotCi0gICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd2Ugc2hvdWxkIHRyeSB0byBhY2Nlc3MgbG9jYXRpb24gYXMgZmlsZQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVybCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHVybC5vcGVuU3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGxvY2F0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgY2hhckNvZGU7Ci0gICAgICAgIGJvb2xlYW4gZW5kID0gZmFsc2U7Ci0gICAgICAgIGlmIChyZWFkZXIucmVhZHkoKSkKLSAgICAgICAgewotICAgICAgICAgIGNoYXJDb2RlID0gcmVhZGVyLnJlYWQoKTsKLQotICAgICAgICAgIHdoaWxlIChyZWFkZXIucmVhZHkoKSAmJiAhKGNoYXJDb2RlID09ICc8JykpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hhckNvZGUgPSByZWFkZXIucmVhZCgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgaWYgKGNoYXJDb2RlID09ICc8JykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKChjaGFyKSBjaGFyQ29kZSk7Ci0gICAgICAgICAgICB3aGlsZSAocmVhZGVyLnJlYWR5KCkgJiYgIWVuZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2hhckNvZGUgPSByZWFkZXIucmVhZCgpOwotICAgICAgICAgICAgICBidWYuYXBwZW5kKChjaGFyKSBjaGFyQ29kZSk7Ci0KLSAgICAgICAgICAgICAgZW5kID0gY2hhckNvZGUgPT0gJz4nOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gTk9URTogVGhpcyByZXN1bHQgZG9lcyBub3QgZ2V0IHByb3BvZ2F0ZWQgYmFjayEKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPQotICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgdGhlIFhNTCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuIjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICByZXN1bHQgPSBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlcnJvcnMuYWRkKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qCi0gICAqIEBwYXJhbSB4bWxEZWNsIC0geG1sIGRlY2xhcmF0aW9uCi0gICAqIEByZXR1cm4gaWYgeG1sIGRlY2xhcmF0aW9uIGNvbnRhaW5zIGVuY29kaW5nPSJ1dGYtMTYiIG9yIGVuY29kaW5nPSJ1dGYtOCIgaXQgcmV0aXJucyB0cnVlLiAKLSAgKi8KLQotICBwcml2YXRlIGJvb2xlYW4gdmFsaWRFbmNvZGluZyhTdHJpbmcgeG1sRGVjbCkKLSAgewotICAgIC8vYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgaWYgKHhtbERlY2wgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPQotICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKAotICAgICAgICAgIE9NTUlURURfWE1MX0RFQ0xBUkFUSU9OX0RFTElNSVRFUlMsCi0gICAgICAgICAgWE1MX0RFQ0xBUkFUSU9OX0RFTElNSVRFUlMpOwotICAgICAgRW51bWVyYXRpb24gdG9rZW5zID0gc3QucGFyc2UoeG1sRGVjbCk7Ci0gICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVFbGVtZW50cygpICYmICFmb3VuZCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHRva2VuID0gKFN0cmluZykgdG9rZW5zLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKHRva2VuLmVxdWFscyhFTkNPRElOR19UT0tFTikpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0KLSAgICAgICAgICB0b2tlbnMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICBTdHJpbmcgZW5jID0gKFN0cmluZykgdG9rZW5zLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgICByZXN1bHQgPQotICAgICAgICAgICAgVVRGXzhfRU5DT0RJTkcuZXF1YWxzSWdub3JlQ2FzZShlbmMpCi0gICAgICAgICAgICAgIHx8IFVURl8xNl9FTkNPRElORy5lcXVhbHNJZ25vcmVDYXNlKGVuYyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB4bWxEZWNsIC0geG1sIGRlY2xhcmF0aW9uCi0gICAqIEByZXR1cm4gaWYgeG1sIGRlY2xhcmF0aW9uIGNvbnRhaW5zIHZhbGlkIHZlcnNpb24gbnVtYmVyIHRoZW4gdHJ1ZSBpcyByZXR1cm5lZC4gCi0gICovCi0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZERlY2xhcmF0aW9uKAotICAgIFN0cmluZyB4bWxEZWNsLAotICAgIFN0cmluZyB0b2tlbk5hbWUsCi0gICAgU3RyaW5nW10gY2hlY2tWYWx1ZUxpc3QpCi0gIHsKLSAgICAvL2Jvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIGlmICh4bWxEZWNsICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0KLSAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgICBPTU1JVEVEX1hNTF9ERUNMQVJBVElPTl9ERUxJTUlURVJTLAotICAgICAgICAgIFhNTF9ERUNMQVJBVElPTl9ERUxJTUlURVJTKTsKLSAgICAgIEVudW1lcmF0aW9uIHRva2VucyA9IHN0LnBhcnNlKHhtbERlY2wpOwotCi0gICAgICBpZiAodG9rZW5zLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlICh0b2tlbnMuaGFzTW9yZUVsZW1lbnRzKCkgJiYgIWZvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRva2VuID0gKFN0cmluZykgdG9rZW5zLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgICBpZiAodG9rZW4uZXF1YWxzKHRva2VuTmFtZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHRva2Vucy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgU3RyaW5nIHRva2VuVmFsdWUgPSAoU3RyaW5nKSB0b2tlbnMubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja1ZhbHVlTGlzdC5sZW5ndGggJiYgIXJlc3VsdDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoY2hlY2tWYWx1ZUxpc3RbaV0uZXF1YWxzSWdub3JlQ2FzZSh0b2tlblZhbHVlKSkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gdG9rZW5zIHRoZW4gaXQgaXMgbm90IGEgdmFsaWQgZGVjbGFyYWN0aW9uCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKgotICAgKiBJdCdzIGxvb2tpbmcgZm9yIHhzZCBpbXBvcnQgYW5kIGxvYWQgaXQgaWYgZmluZC4KLSAgICogQHBhcmFtIHNjaGVtYSAtIHhzZCBzY2hlbWEKLSAgICogQHBhcmFtIG5hbWVzcGFjZSAtIG5hbWVzcGFjZSBvZiBzY2hlbWEKLSAgICovCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzU2NoZW1hKE5vZGUgc2NoZW1hLCBTdHJpbmcgY29udGV4dCkKLSAgewotICAgIE5vZGUgbiA9IHNjaGVtYS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKG4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpCi0gICAgICAgICYmIFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpKQotICAgICAgewotICAgICAgICBpbXBvcnRGb3VuZCA9IHRydWU7Ci0gICAgICAgIGxvYWRTY2hlbWEobiwgY29udGV4dCk7Ci0gICAgICB9Ci0KLSAgICAgIG4gPSBuLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgfQotICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjIwOC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIyMDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1OTYzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjIwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLQotLyoqCi0gKiBCUDIyMDguCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpvcGVyYXRpb24gaW4gYSB3c2RsOnBvcnRUeXBlIGRlZmluaXRpb248L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHdzZGw6b3BlcmF0aW9uIGVsZW1lbnQgaXMgZWl0aGVyIGEgV1NETCByZXF1ZXN0L3Jlc3BvbnNlIG9yIGEgb25lLXdheSBvcGVyYXRpb24gKG5vIE5vdGlmaWNhdGlvbiBvciBTb2xsaWNpdC1SZXNwb25zZSkuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjIwOCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjIwOChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9Ci0gICAgICAoT3BlcmF0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgIE9wZXJhdGlvblR5cGUgb3BUeXBlID0gb3BlcmF0aW9uLmdldFN0eWxlKCk7Ci0gICAgaWYgKChvcFR5cGUgPT0gbnVsbCkKLSAgICAgIHx8ICghb3BUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLk9ORV9XQVkpCi0gICAgICAgICYmICFvcFR5cGUuZXF1YWxzKE9wZXJhdGlvblR5cGUuUkVRVUVTVF9SRVNQT05TRSkpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgaWYgKG9wVHlwZSA9PSBudWxsKQotICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgIkNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIG9wZXJhdGlvbiB0eXBlIGZvciAiCi0gICAgICAgICAgICAgICsgb3BlcmF0aW9uLmdldE5hbWUoKQotICAgICAgICAgICAgICArICIuIiwKLSAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICBlbHNlCi0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSBudWxsOyAvLyBub25lIGRlZmluZWQgaW4gVEFEIGF0IHByZXNlbnQgCi0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI0MDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjNkYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI0MDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0KLS8qKgotICogQlAyNDAyLgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZyBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSB3c2RsOmJpbmRpbmcgZWxlbWVudCBoYXMgYSBzb2FwYmluZDpiaW5kaW5nIGNoaWxkIGVsZW1lbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjQwMiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjQwMihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgLy8gR2V0IHRoZSBwb3J0IGZyb20gdGhlIGVudHJ5IGNvbnRleHQKLSAgICAvL1BvcnQgcG9ydCA9IChQb3J0KSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gVHJ5IHRvIGdldCB0aGUgU09BUCBiaW5kaW5nCi0gICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSBXU0RMVmFsaWRhdG9ySW1wbC5nZXRTb2FwQmluZGluZyhiaW5kaW5nKTsKLQotICAgIC8vIFRlc3QgdGhlIGFzc2VydGlvbiAKLSAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBTT0FQIEJpbmRpbmcKLSAgICBpZiAoc29hcEJpbmRpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSBudWxsOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDA0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjQwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODhlOGQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0KLS8qKgotICogQlAyNDA0LgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZyBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBjb250YWluZWQgc29hcDpiaW5kaW5nIGVsZW1lbnQgaGFzIGEgInRyYW5zcG9ydCIgYXR0cmlidXRlLCB3aGljaCBoYXMgdmFsdWU6IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyNDA0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyNDA0KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIC8vIEdldCB0aGUgYmluZGluZyBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAvLyBUcnkgdG8gZ2V0IHRoZSBTT0FQIGJpbmRpbmcKLSAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IFdTRExWYWxpZGF0b3JJbXBsLmdldFNvYXBCaW5kaW5nKGJpbmRpbmcpOwotCi0gICAgLy8gVGVzdCB0aGUgYXNzZXJ0aW9uIAotICAgIC8vIENoZWNrIGZvciBTb2FwIGJpbmRpbmcgbmFtZXNwYWNlIAotICAgIGlmICgoc29hcEJpbmRpbmcgPT0gbnVsbCkKLSAgICAgIHx8IChzb2FwQmluZGluZy5nZXRUcmFuc3BvcnRVUkkoKSA9PSBudWxsKQotICAgICAgfHwgIXNvYXBCaW5kaW5nLmdldFRyYW5zcG9ydFVSSSgpLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVBfSFRUUCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBzb2FwQmluZGluZyA9PSBudWxsCi0gICAgICAgICAgPyAiV1NETCBkb2N1bWVudCBkb2VzIG5vdCBjb250YWluIFNPQVAgYmluZGluZyBlbGVtZW50LiIKLSAgICAgICAgICA6IHNvYXBCaW5kaW5nLnRvU3RyaW5nKCksCi0gICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI0MDYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNWQ4ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI0MDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAqIEJQMjQwNi4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudCwgaWYgdGhlIHVzZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIG9uIHRoZSBzb2FwYmluZDpib2R5LCBzb2FwYmluZDpmYXVsdCwgc29hcGJpbmQ6aGVhZGVyLCBvciBzb2FwYmluZDpoZWFkZXJmYXVsdCBlbGVtZW50cy48L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHVzZSBhdHRyaWJ1dGUgaGFzIGEgdmFsdWUgb2YgImxpdGVyYWwiLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDI0MDYgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDI0MDYoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vIEdldCB0aGUgYmluZGluZyBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAvLyBHZXQgU09BUCBib2R5IGVsZW1lbnRzICAgICAgCi0gICAgU09BUEJvZHlbXSBzb2FwQm9kaWVzID0gdGhpcy52YWxpZGF0b3IuZ2V0U29hcEJvZGllcyhiaW5kaW5nKTsKLQotICAgIC8vIEFERDogV2hhdCBoYXBwZW5zIGlmIHRoZXJlIGFyZSBubyBzb2FwIGJvZHkgZWxlbWVudHM/ICBSaWdodCBub3cgdGhlIFRBIHJlc3VsdCBpcyBOQS4gICAgICAKLQotICAgIC8vIFRlc3QgdGhlIGFzc2VydGlvbiAKLSAgICAvLyBDaGVjayBmb3IgY29ycmVjdCB1c2UgdmFsdWUgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb2FwQm9kaWVzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gc29hcEJvZGllc1tpXTsKLSAgICAgIGlmIChzb2FwQm9keS5nZXRVc2UoKSAhPSBudWxsCi0gICAgICAgICYmICFzb2FwQm9keS5nZXRVc2UoKS5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChzb2FwQm9keS50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgU09BUCBmYXVsdCBlbGVtZW50cyAgICAgIAotICAgIFNPQVBGYXVsdFtdIHNvYXBGYXVsdHMgPSB0aGlzLnZhbGlkYXRvci5nZXRTb2FwRmF1bHRzKGJpbmRpbmcpOwotCi0gICAgLy8gVGVzdCB0aGUgYXNzZXJ0aW9uIAotICAgIC8vIENoZWNrIGZvciBjb3JyZWN0IHVzZSB2YWx1ZSAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvYXBGYXVsdHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IHNvYXBGYXVsdHNbaV07Ci0gICAgICBpZiAoc29hcEZhdWx0LmdldFVzZSgpICE9IG51bGwKLSAgICAgICAgJiYgIXNvYXBGYXVsdC5nZXRVc2UoKS5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPQotICAgICAgICAgIChmYWlsdXJlRGV0YWlsTWVzc2FnZSA9PSBudWxsCi0gICAgICAgICAgICA/IHNvYXBGYXVsdC50b1N0cmluZygpCi0gICAgICAgICAgICA6IGZhaWx1cmVEZXRhaWxNZXNzYWdlICsgIlxuXG4iICsgc29hcEZhdWx0LnRvU3RyaW5nKCkpOwotICAgICAgICBpZiAoZmFpbHVyZURldGFpbCA9PSBudWxsKQotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChmYWlsdXJlRGV0YWlsTWVzc2FnZSwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGZhaWx1cmVEZXRhaWwuc2V0RmFpbHVyZU1lc3NhZ2UoZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgU09BUCBoZWFkZXIgZWxlbWVudHMgICAgICAKLSAgICBTT0FQSGVhZGVyW10gc29hcEhlYWRlcnMgPSB0aGlzLnZhbGlkYXRvci5nZXRTb2FwSGVhZGVycyhiaW5kaW5nKTsKLQotICAgIC8vIFRlc3QgdGhlIGFzc2VydGlvbiAKLSAgICAvLyBDaGVjayBmb3IgY29ycmVjdCB1c2UgdmFsdWUgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb2FwSGVhZGVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTT0FQSGVhZGVyIHNvYXBIZWFkZXIgPSBzb2FwSGVhZGVyc1tpXTsKLSAgICAgIGlmIChzb2FwSGVhZGVyLmdldFVzZSgpICE9IG51bGwKLSAgICAgICAgJiYgIXNvYXBIZWFkZXIuZ2V0VXNlKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElUKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAoZmFpbHVyZURldGFpbE1lc3NhZ2UgPT0gbnVsbAotICAgICAgICAgICAgPyBzb2FwSGVhZGVyLnRvU3RyaW5nKCkKLSAgICAgICAgICAgIDogZmFpbHVyZURldGFpbE1lc3NhZ2UgKyAiXG5cbiIgKyBzb2FwSGVhZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICBpZiAoZmFpbHVyZURldGFpbCA9PSBudWxsKQotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChmYWlsdXJlRGV0YWlsTWVzc2FnZSwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGZhaWx1cmVEZXRhaWwuc2V0RmFpbHVyZU1lc3NhZ2UoZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgU09BUCBoZWFkZXIgZmF1bHQgZWxlbWVudHMgICAgICAKLSAgICBTT0FQSGVhZGVyRmF1bHRbXSBzb2FwSGVhZGVyRmF1bHRzID0gdGhpcy52YWxpZGF0b3IuZ2V0U29hcEhlYWRlckZhdWx0cyhiaW5kaW5nKTsKLQotICAgIC8vIFRlc3QgdGhlIGFzc2VydGlvbiAKLSAgICAvLyBDaGVjayBmb3IgY29ycmVjdCB1c2UgdmFsdWUgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb2FwSGVhZGVyRmF1bHRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFNPQVBIZWFkZXJGYXVsdCBzb2FwSGVhZGVyRmF1bHQgPSBzb2FwSGVhZGVyRmF1bHRzW2ldOwotICAgICAgaWYgKHNvYXBIZWFkZXJGYXVsdC5nZXRVc2UoKSAhPSBudWxsCi0gICAgICAgICYmICFzb2FwSGVhZGVyRmF1bHQuZ2V0VXNlKCkuZXF1YWxzKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElUKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAoZmFpbHVyZURldGFpbE1lc3NhZ2UgPT0gbnVsbAotICAgICAgICAgICAgPyBzb2FwSGVhZGVyRmF1bHQudG9TdHJpbmcoKQotICAgICAgICAgICAgOiBmYWlsdXJlRGV0YWlsTWVzc2FnZSArICJcblxuIiArIHNvYXBIZWFkZXJGYXVsdC50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKGZhaWx1cmVEZXRhaWwgPT0gbnVsbCkKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZmFpbHVyZURldGFpbE1lc3NhZ2UsIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsLnNldEZhaWx1cmVNZXNzYWdlKGZhaWx1cmVEZXRhaWxNZXNzYWdlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBwYXNzZWQsIGJ1dCB0aGVyZSB3YXMgbm90aGluZyB0byBjaGVjayB0aGVuIHNldCB0byBub3RBcHBsaWNhYmxlCi0gICAgaWYgKHJlc3VsdCA9PSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRAotICAgICAgJiYgKHNvYXBCb2RpZXMgPT0gbnVsbCB8fCBzb2FwQm9kaWVzLmxlbmd0aCA9PSAwKQotICAgICAgJiYgKHNvYXBGYXVsdHMgPT0gbnVsbCB8fCBzb2FwRmF1bHRzLmxlbmd0aCA9PSAwKQotICAgICAgJiYgKHNvYXBIZWFkZXJzID09IG51bGwgfHwgc29hcEhlYWRlcnMubGVuZ3RoID09IDApCi0gICAgICAmJiAoc29hcEhlYWRlckZhdWx0cyA9PSBudWxsIHx8IHNvYXBIZWFkZXJGYXVsdHMubGVuZ3RoID09IDApKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI0MTYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWViYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI0MTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotCi0KLS8qKgotKiBCUDI0MTYuIAotKiAgIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmRlZmluaXRpb25zPC9jb250ZXh0PgotKiAgIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5FdmVyeSBRTmFtZSBpbiB0aGUgV1NETCBkb2N1bWVudCBhbmQgaXRzIGltcG9ydHMsIGlzIHJlZmVyZW5jaW5nIGFuIGVsZW1lbnQgaW4gYSBuYW1lc3BhY2UgdGhhdCBoYXMgZWl0aGVyIGJlZW4gaW1wb3J0ZWQgb3IgZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudCB0aGF0IGNvbnRhaW5zIHRoZSByZWZlcmVuY2UuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSovCi1wdWJsaWMgY2xhc3MgQlAyNDE2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjQxNihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX0xJU1RfS0VZID0gIm5hbWVzcGFjZXMiOwotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbmFtZXNwYWNlIGlzIGRlZmluZWQgb3IgaW1wb3J0ZWQgaW4gdGhlIGRlZmluaXRpb24uCi0gICAqIEBwYXJhbSBxbmFtZQotICAgKiBAcGFyYW0gY3R4Ci0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tOYW1lc3BhY2UoUU5hbWUgcW5hbWUsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChxbmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBMaXN0IG5hbWVzcGFjZXMgPSAoTGlzdCkgY3R4LmdldFBhcmFtZXRlcihOU19MSVNUX0tFWSk7Ci0KLSAgICAgICAgaWYgKCFuYW1lc3BhY2VzLmNvbnRhaW5zKG5hbWVzcGFjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9IG5hbWVzcGFjZTsKLQotICAgICAgICAgIGN0eC5jYW5jZWxQcm9jZXNzaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0gLy8gPz8/IHNob3VsZCB3ZSBkbyBzb21ldGhpbmcgb3RoZXJ3aXNlICAKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLlBvcnQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChQb3J0IHBvcnQsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChwb3J0ICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0gICAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBjaGVja05hbWVzcGFjZShiaW5kaW5nLmdldFFOYW1lKCksIGN0eCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5CaW5kaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoQmluZGluZyBiaW5kaW5nLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFBvcnRUeXBlIHBUeXBlID0gYmluZGluZy5nZXRQb3J0VHlwZSgpOwotICAgICAgaWYgKHBUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNoZWNrTmFtZXNwYWNlKHBUeXBlLmdldFFOYW1lKCksIGN0eCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5PcGVyYXRpb24sIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIElucHV0IGlucHV0ID0gb3BlcmF0aW9uLmdldElucHV0KCk7Ci0gICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY2hlY2tOYW1lc3BhY2UoaW5wdXQuZ2V0TWVzc2FnZSgpLmdldFFOYW1lKCksIGN0eCk7Ci0gICAgICB9Ci0KLSAgICAgIE91dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0T3V0cHV0KCk7Ci0gICAgICBpZiAob3V0cHV0ICE9IG51bGwgJiYgb3V0cHV0LmdldE1lc3NhZ2UoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBjaGVja05hbWVzcGFjZShvdXRwdXQuZ2V0TWVzc2FnZSgpLmdldFFOYW1lKCksIGN0eCk7Ci0gICAgICB9Ci0KLSAgICAgIE1hcCBmYXVsdHMgPSBvcGVyYXRpb24uZ2V0RmF1bHRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmYXVsdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaXRlci5uZXh0KCk7Ci0KLSAgICAgICAgaWYgKGZhdWx0LmdldE1lc3NhZ2UoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgY2hlY2tOYW1lc3BhY2UoZmF1bHQuZ2V0TWVzc2FnZSgpLmdldFFOYW1lKCksIGN0eCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLk1lc3NhZ2UsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICAvKiBSRU1PVkU6IFRoaXMgaXMgYWxyZWFkeSBkb25lIGluIFdTSTI0MTcKLSAgcHVibGljIHZvaWQgdmlzaXQoTWVzc2FnZSBtZXNzYWdlLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpIHsKLSAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgTWFwIHBhcnRzID0gbWVzc2FnZS5nZXRQYXJ0cygpOwotICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXJ0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgaXRlci5uZXh0KCk7Ci0gICAgICAgCi0gICAgICAgY2hlY2tOYW1lc3BhY2UocGFydC5nZXRFbGVtZW50TmFtZSgpLCBjdHgpOyAgICAgICAgICAgICAgICAKLSAgICAgICBjaGVja05hbWVzcGFjZShwYXJ0LmdldFR5cGVOYW1lKCksIGN0eCk7Ci0gICAgIH0KLSAgIH0KLSAgfQotICAqLwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIC8vIEdldCB0aGUgZGVmaW5pdGlvbiBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0KLSAgICAgIChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gZ2V0IGxpc3Qgb2YgbmFtZXNwYWNlcyBpbXBvcnRlZCBhbmQgZGVmaW5lZCBpbiB0aGUgZGVmaW5pdGlvbgotICAgIExpc3QgbmFtZXNwYWNlcyA9IHRoaXMudmFsaWRhdG9yLmdldFdTRExUYXJnZXROYW1lc3BhY2VMaXN0KGRlZmluaXRpb24pOwotCi0gICAgLy8gUkVNT1ZFOgotICAgIC8vTWFwIG5hbWVzcGFjZXMgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLQotICAgIC8vIHRyYXZlcnNlIGRlZmluaXRpb24gdG8gY2hlY2sgbmFtZXNwYWNlcwotICAgIE1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHBhcmFtcy5wdXQoTlNfTElTVF9LRVksIG5hbWVzcGFjZXMpOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vIFZpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgIHRyYXZlcnNhbC52aXNpdE9wZXJhdGlvbih0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRCaW5kaW5nKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdE1lc3NhZ2UodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0UG9ydCh0cnVlKTsKLQotICAgIHRyYXZlcnNhbC5pZ25vcmVJbXBvcnQoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlUmVmZXJlbmNlcygpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZShkZWZpbml0aW9uLCBwYXJhbXMpOwotCi0gICAgaWYgKHJlc3VsdC5lcXVhbHMoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQpKQotICAgIHsKLSAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZmFpbHVyZURldGFpbE1lc3NhZ2UsIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI0MTcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDNkNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI0MTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0gKiBCUDI0MTcuIAotICogICA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpkZWZpbml0aW9uczwvY29udGV4dD4KLSAqICAgPGFzc2VydGlvbkRlc2NyaXB0aW9uPkV2ZXJ5IFFOYW1lIGluIHRoZSBXU0RMIGRvY3VtZW50IGFuZCBpdHMgaW1wb3J0cyBhbmQgdGhhdCAKLSAqICAgICAgaXMgcmVmZXJyaW5nIHRvIGEgc2NoZW1hIGNvbXBvbmVudCwgdXNlcyB0aGUgbmFtZXNwYWNlIGRlZmluZWQgaW4gdGhlIHRhcmdldE5hbWVzcGFjZSAKLSAqICAgICAgYXR0cmlidXRlIG9uIHRoZSB4czpzY2hlbWEgZWxlbWVudCwgb3IgYSBuYW1lc3BhY2UgZGVmaW5lZCBpbiB0aGUgbmFtZXNwYWNlIGF0dHJpYnV0ZSAKLSAqICAgICAgb24gYW4geHM6aW1wb3J0IGVsZW1lbnQgd2l0aGluIHRoZSB4czpzY2hlbWEgZWxlbWVudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyNDE3IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjQxNyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JMaXN0ID0gbmV3IEVycm9yTGlzdCgpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfTElTVF9LRVkgPSAibmFtZXNwYWNlcyI7Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBuYW1lc3BhY2UgaXMgZGVmaW5lZCBvciBpbXBvcnRlZCBpbiB0aGUgZGVmaW5pdGlvbi4KLSAgICogQHBhcmFtIHFuYW1lCi0gICAqIEBwYXJhbSBjdHgKLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja05hbWVzcGFjZShRTmFtZSBxbmFtZSwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExpc3QgbmFtZXNwYWNlTGlzdCA9IChMaXN0KSBjdHguZ2V0UGFyYW1ldGVyKE5TX0xJU1RfS0VZKTsKLQotICAgICAgICBpZiAoKG5hbWVzcGFjZUxpc3QgIT0gbnVsbCkgJiYgIW5hbWVzcGFjZUxpc3QuY29udGFpbnMobmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yTGlzdC5hZGQocW5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLk1lc3NhZ2UsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChNZXNzYWdlIG1lc3NhZ2UsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgewotICAgICAgTWFwIHBhcnRzID0gbWVzc2FnZS5nZXRQYXJ0cygpOwotCi0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXJ0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBpdGVyLm5leHQoKTsKLQotICAgICAgICBjaGVja05hbWVzcGFjZShwYXJ0LmdldEVsZW1lbnROYW1lKCksIGN0eCk7Ci0gICAgICAgIGNoZWNrTmFtZXNwYWNlKHBhcnQuZ2V0VHlwZU5hbWUoKSwgY3R4KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgLy8gR2V0IHRoZSBkZWZpbml0aW9uIGZyb20gdGhlIGVudHJ5IGNvbnRleHQKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPQotICAgICAgKERlZmluaXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAvLyBHZXQgYSBsaXN0IG9mIGFsbCBzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlcwotICAgIExpc3QgdG5zTGlzdCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKCh0bnNMaXN0ID0gdGhpcy52YWxpZGF0b3IuZ2V0U2NoZW1hTmFtZXNwYWNlTGlzdChkZWZpbml0aW9uKSkgPT0gbnVsbCkKLSAgICAgICAgdG5zTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gVGhpcyBleGNlcHRpb24gd291bGQgaW5kaWNhdGUgdGhhdCB0aGUgc2NoZW1hIGRlZmluaXRpb24gaGFkIGEgcHJvYmxlbQotICAgICAgdG5zTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICB9Ci0KLSAgICAvLyBBbHdheXMgYWRkIFhNTCBzY2hlbWEgbmFtZXNwYWNlIHRvIGNvdmVyIGJ1aWx0LWluIHR5cGVzCi0gICAgdG5zTGlzdC5hZGQoV1NJQ29uc3RhbnRzLk5TX1VSSV9YU0QpOwotCi0gICAgLy8gVHJhdmVyc2UgZGVmaW5pdGlvbiB0byBjaGVjayBzY2hlbWEgbmFtZXNwYWNlcwotICAgIE1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHBhcmFtcy5wdXQoTlNfTElTVF9LRVksIHRuc0xpc3QpOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgIHRyYXZlcnNhbC52aXNpdE1lc3NhZ2UodHJ1ZSk7Ci0KLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoZGVmaW5pdGlvbiwgcGFyYW1zKTsKLQotICAgIC8vIElmIHRoZXJlIHdlcmUgbm8gZXJyb3JzLCB0aGVuIHRoZSBhc3NlcnRpb24gcGFzc2VkCi0gICAgaWYgKGVycm9yTGlzdC5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgfQotCi0gICAgLy8gT3RoZXJ3aXNlIGl0IGZhaWxlZCAvIGNyZWF0ZSB0aGUgZmFpbHVyZSBkZXRhaWwgdXNpbmcgdGhlIFFOYW1lcyB0aGF0IHdlcmUgaW4gZXJyb3IKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvckxpc3QudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjcwMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI3MDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmMjMxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjcwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICAqIEJQMjcwMC4KLSAgKiAgIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmRlZmluaXRpb25zIGVsZW1lbnQgd2l0aGluIGEgV1NETCBkb2N1bWVudC48L2NvbnRleHQ+Ci0gICogICA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHdzZGw6ZGVmaW5pdGlvbnMgaXMgYSB3ZWxsLWZvcm1lZCBYTUwgMS4wIGRvY3VtZW50LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gICovCi1wdWJsaWMgY2xhc3MgQlAyNzAwIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyNzAwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vU3RyaW5nIHdzZGxVUkkgPSBlbnRyeUNvbnRleHQuZ2V0V1NETERvY3VtZW50KCkuZ2V0RGVmaW5pdGlvbnMoKS5nZXREb2N1bWVudEJhc2VVUkkoKTsgIAotICAgICAgLy8gVEVNUDogTmVlZCB0byBkZWZpbmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGUgV1NETCBVUkkKLSAgICAgIFN0cmluZyB3c2RsVVJJID0gZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0UmVmZXJlbmNlSUQoKTsKLSAgICAgIC8vIG5vbi12YWxpZGF0aW5nIHBhcnNlCi0gICAgICBYTUxVdGlscy5wYXJzZVhNTERvY3VtZW50KHdzZGxVUkkpOwotICAgIH0KLQotICAgIGNhdGNoIChXU0lFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIFNBWEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICBVdGlscy5nZXRFeGNlcHRpb25EZXRhaWxzKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpLAotICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChVdGlscy5nZXRFeGNlcHRpb25EZXRhaWxzKGUpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNzAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjcwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjRjMWY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNzAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0KLS8qKgotICAqIEJQMjcwMS4KLSAgKiAgIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmRlZmluaXRpb25zIGVsZW1lbnQgd2l0aGluIGEgV1NETCBkb2N1bWVudC48L2NvbnRleHQ+Ci0gICogICA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHdzZGw6ZGVmaW5pdGlvbnMgbmFtZXNwYWNlIGhhcyB2YWx1ZTogaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8uPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAgKi8KLXB1YmxpYyBjbGFzcyBCUDI3MDEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDI3MDEoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIERlZmluaXRpb24gZGVmID0gKERlZmluaXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAvKgotICAgIGlmIChkZWYgIT0gbnVsbCkgewotICAgIAlRTmFtZSBxbmFtZSA9IGRlZi5nZXRRTmFtZSgpOwotICAgIAkJCQkKLSAgICAJaWYgKHFuYW1lICE9IG51bGwpIHsJCi0gICAgCQkvL2lmIChkZWYuZ2V0TmFtZXNwYWNlKCIiKS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMKSB7Ci0gICAgCQlpZiAocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCkpIHsKLSAgICAJCQlyZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgICAqLwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIHNjaGVtYVVzZWQgPSB0aGlzLnZhbGlkYXRvci5nZXRTY2hlbWFVc2VkKGRlZik7Ci0gICAgICBpZiAoc2NoZW1hVXNlZC5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIC8vQUREOiBmYWlsdXJlIGRlc2NyaXB0aW9uPwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNzAzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjcwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNhNjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNzAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlRlc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEJQMjcwMy4KLSAqICAgPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIGRlc2NyaXB0aW9uIHdpdGhpbiBhIFdTREwgZG9jdW1lbnQsIGlmIGl0IHVzZXMgdGhlIFdTREwgbmFtZXNwYWNlPC9jb250ZXh0PgotICogICA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIGRlZmluaXRpb24gY29uZm9ybXMgdG8gdGhlIFdTREwgc2NoZW1hIGxvY2F0ZWQgYXQgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8yMDAzLTAyLTExLnhzZDwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDI3MDMgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDI3MDMoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZiA9IChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgICBpZiAoZGVmID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJEZWZpbml0aW9uIG51bGwiKTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIHdzZGxVUkkgPSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRSZWZlcmVuY2VJRCgpOwotCi0gICAgICBNYXAgbmFtZXNwYWNlcyA9IGRlZi5nZXROYW1lc3BhY2VzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuYW1lc3BhY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0KLSAgICAgICAgaWYgKFdTSUNvbnN0YW50cy5OU19VUklfV1NETC5lcXVhbHNJZ25vcmVDYXNlKG5zKSkKLSAgICAgICAgewotICAgICAgICAJWE1MVXRpbHMucGFyc2VYTUxEb2N1bWVudCh3c2RsVVJJLCBUZXN0VXRpbHMuZ2V0V1NETFNjaGVtYUxvY2F0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFdTSUNvbnN0YW50cy5OU19VUklfV1NETF9TT0FQLmVxdWFsc0lnbm9yZUNhc2UobnMpKQotICAgICAgICB7Ci0gICAgICAgIAlYTUxVdGlscy5wYXJzZVhNTERvY3VtZW50KHdzZGxVUkksIFRlc3RVdGlscy5nZXRXU0RMU09BUFNjaGVtYUxvY2F0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKFdTSUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgU0FYRXhjZXB0aW9uKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgIFV0aWxzLmdldEV4Y2VwdGlvbkRldGFpbHMoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSksCi0gICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKFV0aWxzLmdldEV4Y2VwdGlvbkRldGFpbHMoZSksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjgwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI4MDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2MDJhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjgwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAqIEJQMjgwMwotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6aW1wb3J0IGVsZW1lbnQ8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlICJuYW1lc3BhY2UiIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgZm9yIHRoZSB3c2RsOmltcG9ydCBlbGVtZW50LCBhbmQgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlIGlzIG5vdCBhIHJlbGF0aXZlIFVSSS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyODAzIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyODAzKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgLy8gR2V0dGluZyB3c2RsOmltcG9ydAotICAgIEltcG9ydCBpbSA9IChJbXBvcnQpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBJZiB0aGVyZSBpcyBubyB0aGUgIm5hbWVzcGFjZSIgYXR0cmlidXRlIGluIHRoZSBpbXBvcnQsCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoaW0uZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgYSBuYW1lc3BhY2UgVVJJIGlzIHJlbGF0aXZlIG9yIGludmFsaWQsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICBVUkkgdXJpID0gbmV3IFVSSShpbS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBpZiAoIXVyaS5pc0Fic29sdXRlKCkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgIGltLmdldE5hbWVzcGFjZVVSSSgpICsgIiBpcyByZWxhdGl2ZSBVUkkuIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQNDIwMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDQyMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjNzMzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQNDIwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQlA0MjAwLiAKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmRlZmluaXRpb25zIHRoYXQgY29udGFpbnMgYSB3c2RsIGV4dGVuc2lvbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSBmcm9tIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLjwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5Db250YWluZWQgV1NETCBleHRlbnNpb24gZWxlbWVudHMgdGhhdCBkbyBub3QgYmVsb25nIHRvIHRoZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgbmFtZXNwYWNlcyBtYXkgcmVxdWlyZSBvdXQgb2YgYmFuZCBuZWdvdGlhdGlvbi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotKi8KLXB1YmxpYyBjbGFzcyBCUDQyMDAgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JMaXN0ID0gbmV3IEVycm9yTGlzdCgpOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDQyMDAoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEV4dGVuc2liaWxpdHlFbGVtZW50IG9iaiwgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICAvLyBJZiBhIGNoaWxkIGVsZW1lbnQgb2Ygd3NkbDp0eXBlcyBpcyBmcm9tIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4KLSAgICAvLyAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFR5cGVzKQotICAgIHsKLSAgICAgIC8vaWYgKCFvYmouZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoCi0gICAgICAvLyAgV1NJQ29uc3RhbnRzLk5TX1VSSV9YU0QpKQotICAgICAgLy97Ci0gICAgICAvLyAgQWRkIGVsZW1lbnQgbmFtZSB0byBlcnJvciBsaXN0Ci0gICAgICAvLyAgZXJyb3JMaXN0LmFkZChvYmouZ2V0RWxlbWVudFR5cGUoKSk7Ci0gICAgICAvL30KLSAgICB9Ci0gICAgLy8gb3IgYW55IG90aGVyIGV4dCBlbGVtZW50IGNvbWluZyBmcm9tIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4KLSAgICAvLyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICBlbHNlIGlmICghb2JqLmdldEVsZW1lbnRUeXBlKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfV1NETF9TT0FQKQotICAgIAkgICYmICFvYmouZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMKSkKLSAgICB7Ci0gICAgICAvLyBBZGQgZWxlbWVudCBuYW1lIHRvIGVycm9yIGxpc3QKLSAgICAgIGVycm9yTGlzdC5hZGQob2JqLmdldEVsZW1lbnRUeXBlKCkpOyAKLSAgICB9Ci0gIH0KLQotICAgLyoqCi0gICogIChub24tSmF2YWRvYykKLSAgKiAgQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCB0aGUgZGVmaW5pdGlvbiBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0KLSAgICAgIChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotCi0gICAgdHJhdmVyc2FsLnZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0RWxlbWVudCh0cnVlKTsKLQotICAgIHRyYXZlcnNhbC5pZ25vcmVJbXBvcnQoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlUmVmZXJlbmNlcygpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZShkZWZpbml0aW9uKTsKLQotICAgIHRyeQotCXsKLSAgICAgIC8vIGdldHRpbmcgV1NETCBkb2N1bWVudC4KLSAgICAgIERvY3VtZW50IGRvYyA9IFhNTFV0aWxzLnBhcnNlWE1MRG9jdW1lbnQoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0gICAgICBpZiAoZG9jICE9IG51bGwpCi0gICAgICB7ICAgCi0gICAgICAgIGNoZWNrRWxlbWVudChkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCi0gICAgICAgIGlmIChlcnJvckxpc3QuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgdGVzdEFzc2VydGlvbi5nZXREZXRhaWxEZXNjcmlwdGlvbigpICsgIlxuXG4iICsgZXJyb3JMaXN0LnRvU3RyaW5nKCksCi0gICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotCX0gICAKLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotCX0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBvbiB3c2RsIGVsZW1lbnRzIHJlY3Vyc2l2ZWx5IHdoZXRoZXIgdGhleSBjb250YWluIGV4dGVuc2lvbiBhdHRyaWJ1dGVzLgotICAgKiBAcGFyYW0gZWxlbSBFbGVtZW50LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrRWxlbWVudChFbGVtZW50IGVsZW0pCi0gIHsKLSAgICB3aGlsZSAoZWxlbSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBlbGVtTlMgPSBlbGVtLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgTmFtZWROb2RlTWFwIGF0dHJzID0gZWxlbS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBpZiAoYXR0cnMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0gICAgICAgICAgU3RyaW5nIGF0dHJOUyA9IGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgaWYgKGF0dHJOUyAhPSBudWxsCi0gICAgICAgICAgICAmJiAhYXR0ck5TLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1hNTE5TKQotICAgICAgICAgICAgJiYgIWF0dHJOUy5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMKQotCQkJJiYgIWF0dHJOUy5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMX1NPQVApKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVycm9yTGlzdC5hZGQoIkV4dGVuc2liaWxpdHkgYXR0cmlidXRlICIgKyBhdHRyLmdldE5hbWUoKQotICAgICAgICAgICAgICArICJmb3IgdGhlICIgKyBlbGVtLmdldE5vZGVOYW1lKCkgKyAiIGVsZW1lbnQgaXMgZm91bmQuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICghZWxlbU5TLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1hTRCkpCi0gICAgICB7Ci0gICAgICAgIGNoZWNrRWxlbWVudChYTUxVdGlscy5nZXRGaXJzdENoaWxkKGVsZW0pKTsKLSAgICAgIH0KLSAgICAgIGVsZW0gPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhlbGVtKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQNDIwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDQyMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmMTMxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQNDIwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0qIEJQNDIwMS4gCi0qIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmltcG9ydCBlbGVtZW50LCB3aGVyZSB0aGUgbG9jYXRpb24gYXR0cmlidXRlIG9yIHRoZSBuYW1lc3BhY2UgYXR0cmlidXRlIGhhcyBhIHZhbHVlIHRoYXQgaXMgYSByZWxhdGl2ZSBVUkksIG9yIGEgZm9yIHNvYXA6YWRkcmVzcyBlbGVtZW50IHdoZXJlIHRoZSBsb2NhdGlvbiBhdHRyaWJ1dGUgaXMgYSByZWxhdGl2ZSBVUkkuPC9jb250ZXh0PgotKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHVzZSBvZiBhIHJlbGF0aXZlIFVSSSBhcyB0aGUgdmFsdWUgZm9yIGEgd3NkbDppbXBvcnQgbG9jYXRpb24gb3IgbmFtZXNwYWNlIGF0dHJpYnV0ZSwgb3IgZm9yIGEgc29hcDphZGRyZXNzIGxvY2F0aW9uIGF0dHJpYnV0ZSBtYXkgcmVxdWlyZSBvdXQgb2YgYmFuZCBjb29yZGluYXRpb24uPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSovCi1wdWJsaWMgY2xhc3MgQlA0MjAxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQNDIwMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9yTGlzdCA9IG5ldyBFcnJvckxpc3QoKTsKLQotICAvKiogCi0gICAqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KEltcG9ydCwgT2JqZWN0LCBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEltcG9ydCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmKG9iaiAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmKGlzUmVsYXRpdmVVUkkob2JqLmdldE5hbWVzcGFjZVVSSSgpKSB8fCAKLSAgICAgICAgICBpc1JlbGF0aXZlVVJJKG9iai5nZXRMb2NhdGlvblVSSSgpKSkKLSAgICAgIHsKLSAgICAgICAgZXJyb3JMaXN0LmFkZChvYmouZ2V0TmFtZXNwYWNlVVJJKCksIG9iai5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiogCi0gICAqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFBvcnQsIE9iamVjdCwgV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChQb3J0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYob2JqICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmouZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgICBPYmplY3QgZSA9IChPYmplY3QpIGl0Lm5leHQoKTsKLSAgICAgICAgIC8vIGZvciBlYWNoIFNPQVBBZGRyZXNzIGVsZW1lbnRzIGNoZWNrIExvY2F0aW9uVVJJIAotICAgICAgICAgaWYoZSBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKSB7Ci0gICAgICAgICAgIGlmKGlzUmVsYXRpdmVVUkkoKChTT0FQQWRkcmVzcykgZSkuZ2V0TG9jYXRpb25VUkkoKSkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBlcnJvckxpc3QuYWRkKCgoU09BUEFkZHJlc3MpIGUpLmdldEVsZW1lbnRUeXBlKCkgKyAKLSAgICAgICAgICAgICAgICAgIjoiICsgKChTT0FQQWRkcmVzcykgZSkuZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogIChub24tSmF2YWRvYykKLSAgICogIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIC8vIEdldCB0aGUgZGVmaW5pdGlvbiBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0KLSAgICAgIChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgIHRyYXZlcnNhbC52aXNpdEltcG9ydCh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRQb3J0KHRydWUpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKGRlZmluaXRpb24pOwotCi0gICAgaWYgKGVycm9yTGlzdC5pc0VtcHR5KCkpIAotICAgIHsKLSAgICAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCAKLSAgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFLCAoU3RyaW5nKSBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwodGVzdEFzc2VydGlvbi5nZXRGYWlsdXJlTWVzc2FnZSgpICsgCi0gICAgICAgICJcblxuIiArIGVycm9yTGlzdC50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIFVSSSBpcyByZWxhdGl2ZSAKLSAgICogQHBhcmFtIHMgLSBVUkkKLSAgICogQHJldHVybiB0cnVlIC0gaWYgVVJJIGlzIHJlbGF0aXZlLCBmYWxzZSAtIGluIG90aGVyIGNhc2UgIAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzUmVsYXRpdmVVUkkoU3RyaW5nIHMpCi0gIHsKLSAgICBpZihzID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYobmV3IGphdmEubmV0LlVSSShzKS5pc0Fic29sdXRlKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDQyMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlA0MjAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkN2NiYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDQyMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTERvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5zY2hlbWEuWE1MU2NoZW1hUHJvY2Vzc29yOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIEJQNDIwMi4gCi0gKiA8Y29udGV4dD5Gb3IgYW4gWE1MIHNjaGVtYSBkZWZpbml0aW9uIGRlZmluZWQgaW4gdGhlIHdzZGw6dHlwZXMgZWxlbWVudCwgb3IgaW1wb3J0ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBieSBhIHNjaGVtYSBkZWZpbml0aW9uIGRlZmluZWQgaW4gdGhlIHdzZGw6dHlwZXMgZWxlbWVudCwgd2hpY2ggY29udGFpbnMgYW55IHNjaGVtYSBhbm5vdGF0aW9uIGVsZW1lbnRzLjwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BbiBYTUwgc2NoZW1hIGRlZmluaXRpb24gZGVmaW5lZCBpbiB0aGUgd3NkbDp0eXBlcyBlbGVtZW50LCBvciBpbXBvcnRlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGJ5IGEgc2NoZW1hIGRlZmluaXRpb24gZGVmaW5lZCBpbiB0aGUgd3NkbDp0eXBlcyBlbGVtZW50LCBtYXkgdXNlIHNjaGVtYSBhbm5vdGF0aW9uIGVsZW1lbnRzIGFzIGFuIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLSBwdWJsaWMgY2xhc3MgQlA0MjAyIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcgCi0gewotICAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQNDIwMihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fS0VZID0gImFubm90YXRpb24iOwotICAgCi0gICBwcml2YXRlIEVycm9yTGlzdCBlcnJvckxpc3QgPSBuZXcgRXJyb3JMaXN0KCk7Ci0gICBwcml2YXRlIEFubm90YXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yOwotCi0gICAvKiogCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoTWVzc2FnZSwgT2JqZWN0LCBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAqLwotICAgcHVibGljIHZvaWQgdmlzaXQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICB7Ci0gICAgIGlmKChvYmogIT0gbnVsbCkgJiYgKG9iaiBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkpCi0gICAgIHsKLSAgICAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwgPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBvYmo7Ci0gICAgICAgdHJ5IHsKLSAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzQWxsU2NoZW1hKGVsLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgfSBjYXRjaCAoV1NJRXhjZXB0aW9uIGUpIHt9Ci0gICAgIH0KLSAgIH0KLQotICAgLyoqCi0gICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICogIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgICovCi0gICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgIHsKLSAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICAgLy8gR2V0IHRoZSB0eXBlcyBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgIFR5cGVzIHR5cGVzID0KLSAgICAgICAoVHlwZXMpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0gICAgIAotICAgICBwcm9jZXNzb3IgPSBuZXcgQW5ub3RhdGlvblByb2Nlc3NvcigKLSAgICAgICAgICAgZW50cnlDb250ZXh0LmdldFdTRExEb2N1bWVudCgpLmdldERlZmluaXRpb25zKCkuZ2V0RG9jdW1lbnRCYXNlVVJJKCksIAotICAgICAgICAgICB2YWxpZGF0b3IuZ2V0RG9jdW1lbnRMaXN0KCkpOwotICAgICAKLSAgICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICAgdHJhdmVyc2FsLnZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQodHJ1ZSk7Ci0gICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgIHRyYXZlcnNhbC50cmF2ZXJzZSh0eXBlcyk7Ci0gICAgIAotICAgICBpZiAoZXJyb3JMaXN0LmlzRW1wdHkoKSkgCi0gICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgCi0gICAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEUsIChTdHJpbmcpIG51bGwpOwotICAgICB9Ci0gICAgIAotICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCh0ZXN0QXNzZXJ0aW9uLmdldEZhaWx1cmVNZXNzYWdlKCkgKyAKLSAgICAgICAgICJcblxuIiArIGVycm9yTGlzdC50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICAgfQotICAgCi0gICAvKioKLSAgICAqIENsYXNzIGZvciBwYXJzZSBzY2hlbWEgYW5kIHNlYXJjaCBhbm5vdGF0aW9uIGVsZW1lbnRzIAotICAgICovCi0gICBjbGFzcyBBbm5vdGF0aW9uUHJvY2Vzc29yIGV4dGVuZHMgWE1MU2NoZW1hUHJvY2Vzc29yCi0gICB7Ci0gICAgIHB1YmxpYyBBbm5vdGF0aW9uUHJvY2Vzc29yKAotICAgICAgIFN0cmluZyBjb250ZXh0LAotICAgICAgIFhNTERvY3VtZW50Q2FjaGUgZG9jdW1lbnRMaXN0KQotICAgICB7Ci0gICAgICAgc3VwZXIoY29udGV4dCwgZG9jdW1lbnRMaXN0LCBmYWxzZSk7Ci0gICAgIH0KLQotICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzU2NoZW1hKEVsZW1lbnQgZWxlbWVudCkKLSAgICAgewotICAgICAgIGNoZWNrRm9yQW5ub3RhdGlvbihlbGVtZW50KTsKLSAgICAgfQotICAgICAKLSAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yQW5ub3RhdGlvbihOb2RlIG5vZGUpIAotICAgICB7Ci0gICAgICAgaWYoKG5vZGUuZ2V0TG9jYWxOYW1lKCkgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKEFOTk9UQVRJT05fS0VZKSkpIHsKLSAgICAgICAgIGVycm9yTGlzdC5hZGQobm9kZS50b1N0cmluZygpKTsKLSAgICAgICB9Ci0gICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgIHsKLSAgICAgICAgIGNoZWNrRm9yQW5ub3RhdGlvbihub2RlLmdldENoaWxkTm9kZXMoKS5pdGVtKGkpKTsKLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLSB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9TU0JQMjIwOS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9TU0JQMjIwOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzRkZDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvU1NCUDIyMDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLQotLyoqCi0gKiBTU0JQMjIwOQotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudDwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgd3NkbDpiaW5kaW5nIGJpbmRzIGV2ZXJ5IHdzZGw6cGFydCBvZiBhIHdzZGw6bWVzc2FnZSBpbiB0aGUgd3NkbDpwb3J0VHlwZSB0byB3aGljaCBpdCByZWZlcnMgdG8gb25lIG9mIHNvYXBiaW5kOmJvZHksIHNvYXBiaW5kOmhlYWRlciwgc29hcGJpbmQ6ZmF1bHQgb3Igc29hcGJpbmQ6aGVhZGVyZmF1bHQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIFNTQlAyMjA5IGV4dGVuZHMgQlAyMTE0Ci17Ci0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBTU0JQMjIwOShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1NTQlAyNDAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1NTQlAyNDAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOTFmMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9TU0JQMjQwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBTU0JQMjQwMgotICovCi1wdWJsaWMgY2xhc3MgU1NCUDI0MDIgZXh0ZW5kcyBCUDI0MDIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgU1NCUDI0MDIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9TU0JQMjQwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9TU0JQMjQwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDEzMjBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvU1NCUDI0MDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBTU0JQMjQwMy4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudDwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5EZXNjZW5kYW50IGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZSB3c2RsOmJpbmRpbmcgYXJlIG5vdCBmcm9tIHRoZSBuYW1lc3BhY2VzIGZvciB0aGUgV1NETCBNSU1FLCBIVFRQIEdFVC9QT1NUIG9yIERJTUUgYmluZGluZyBleHRlbnNpb25zLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTU0JQMjQwMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBTU0JQMjQwMyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGhlIG5hbWVzcGFjZSBzcGVjaWZpZXMgYW55IFdTREwgTUlNRSwKLSAgICogSFRUUCBHRVQvUE9TVCBvciBESU1FIGJpbmRpbmcgZXh0ZW5zaW9ucy4KLSAgICogQHBhcmFtIG5hbWVzcGFjZSBhIG5hbWVzcGFjZS4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0aGUgbmFtZXNwYWNlIHNwZWNpZmllcyBhbnkgV1NETCBNSU1FLAotICAgKiAgICAgICAgIEhUVFAgR0VUL1BPU1Qgb3IgRElNRSBiaW5kaW5nIGV4dGVuc2lvbnMuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNOb25Db25mb3JtYW50QmluZGluZ0V4dGVuc2lvbihTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NETF9NSU1FKQotICAgICAgICB8fCBuYW1lc3BhY2UuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19OQU1FX1dTRExfSFRUUCkKLSAgICAgICAgfHwgbmFtZXNwYWNlLmVxdWFscyhXU0lDb25zdGFudHMuTlNfTkFNRV9XU0RMX0RJTUUpKQotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXhlbCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChpc05vbkNvbmZvcm1hbnRCaW5kaW5nRXh0ZW5zaW9uKGV4ZWwKLSAgICAgIC5nZXRFbGVtZW50VHlwZSgpCi0gICAgICAuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgZXJyb3JzLmFkZChleGVsLmdldEVsZW1lbnRUeXBlKCkpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgCS8vIGV4dGVuc2liaWxpdHkgZWxlbWVudCBpcyBvaywgY2hlY2sgdGhlIGRlc2NlbmRhbnRzCi0gICAgICBpZiAoZXhlbCBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBlbCA9ICgoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBleGVsKS5nZXRFbGVtZW50KCk7Ci0KLSAgICAgICAgLy8gdHJhdmVyc2UgYWxsIG9mIHRoZSBkZXNjZW5kYW50cyBhbmQgY2hlY2sgZm9yIG5vbiBjb21wbGlhbnQgYmluZGluZyBleHRlbnNpb25zCi0gICAgICAgIFhNTFRyYXZlcnNhbENoZWNraW5nRXh0ZW5zaW9ucyB0cmF2ZXJzYWwgPQotICAgICAgICAgIG5ldyBYTUxUcmF2ZXJzYWxDaGVja2luZ0V4dGVuc2lvbnMoKTsKLSAgICAgICAgdHJhdmVyc2FsLnZpc2l0KGVsKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRFbGVtZW50KHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KHRydWUpOwotCi0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpKTsKLQotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEEgc3BlY2lhbGl6ZWQgWE1MVHJhdmVyc2FsIGNsYXNzIHRvIGNoZWNrIGlmIHRoZSB3c2RsOmJpbmRpbmcgZWxlbWVudCBoYXMgYW55IAotICAgKiBkZXNjZW5kYW50IGVsZW1lbnRzL2F0dHJpYnV0ZXMgZnJvbSB0aGUgbmFtZXNwYWNlcyBmb3IgdGhlIFdTREwgTUlNRSwgCi0gICAqIEhUVFAgR0VUL1BPU1Qgb3IgRElNRSBiaW5kaW5nIGV4dGVuc2lvbnMuCi0gICAqLwotICBwcml2YXRlIGNsYXNzIFhNTFRyYXZlcnNhbENoZWNraW5nRXh0ZW5zaW9ucyBleHRlbmRzIFhNTFRyYXZlcnNhbAotICB7Ci0gICAgYm9vbGVhbiBub25Db25mb3JtYW50RXh0ZW5zaW9uRm91bmQgPSBmYWxzZTsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy53c2kueG1sLlhNTFRyYXZlcnNhbCNhY3Rpb24ob3JnLnczYy5kb20uTm9kZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhY3Rpb24oTm9kZSBuKQotICAgIHsKLSAgICAgIHJldHVybiAhbm9uQ29uZm9ybWFudEV4dGVuc2lvbkZvdW5kOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy53c2kueG1sLlhNTFZpc2l0b3IjdmlzaXQob3JnLnczYy5kb20uQXR0cikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChBdHRyIG5vZGUpCi0gICAgewotICAgICAgaWYgKGFjdGlvbihub2RlKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzTm9uQ29uZm9ybWFudEJpbmRpbmdFeHRlbnNpb24obm9kZS5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvcnMuYWRkKG5vZGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBub25Db25mb3JtYW50RXh0ZW5zaW9uRm91bmQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLndzaS54bWwuWE1MVmlzaXRvciN2aXNpdChvcmcudzNjLmRvbS5FbGVtZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KEVsZW1lbnQgbm9kZSkKLSAgICB7Ci0gICAgICBpZiAoYWN0aW9uKG5vZGUpKQotICAgICAgewotICAgICAgICBpZiAoaXNOb25Db25mb3JtYW50QmluZGluZ0V4dGVuc2lvbihub2RlLmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgICAgewotICAgICAgICAgIGVycm9ycy5hZGQobm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgICBub25Db25mb3JtYW50RXh0ZW5zaW9uRm91bmQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIGVsZW1lbnQgaXMgY29tcGxpYW50LCBjaGVjayBhdHRyaWJ1dGVzIGFuZCBkZXNjZW5kYW50cwotICAgICAgICAgIHZpc2l0KG5vZGUuZ2V0QXR0cmlidXRlcygpKTsKLSAgICAgICAgICBmb3IgKE5vZGUgbiA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgbiAhPSBudWxsOwotICAgICAgICAgICAgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkb1Zpc2l0KG4pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NETFZhbGlkYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NETFZhbGlkYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzYTg0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTRExWYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5BbmFseXplckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkNhbmRpZGF0ZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLlNlcnZpY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5XU0RMVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5FbnRyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkZhaWx1cmVEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVudHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC5XU0RMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwuV1NETEVsZW1lbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmRvbS5FbGVtZW50TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5zY2hlbWEuVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuc2NoZW1hLlhNTFNjaGVtYVZhbGlkYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogVGhlIFdTREwgdmFsaWRhdG9yIHdpbGwgdmVyaWZ5IHRoYXQgdGhlIFdTREwgYW5kIGFzc29jaWF0ZWQgWE1MIHNjaGVtYSBkZWZpbml0aW9ucwotICogYXJlIGluIGNvbmZvcm1hbmNlIHdpdGggdGhlIHByb2ZpbGUuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQGF1dGhvciBHcmFoYW0gVHVycmVsbCAJKGd0dXJyZWxsQHVrLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMVmFsaWRhdG9ySW1wbAotICBleHRlbmRzIEJhc2VWYWxpZGF0b3JJbXBsCi0gIGltcGxlbWVudHMgV1NETFZhbGlkYXRvcgotewotICAvKioKLSAgICogV1NETCBVUkwuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxVUkw7Ci0KLSAgLyoqCi0gICAqIFdTREwgZG9jdW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEVudHJ5IGNvbnRhaW5lciBtYXAuCi0gICAqLwotICBwcm90ZWN0ZWQgSGFzaE1hcCBjb250YWluZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuV1NETFZhbGlkYXRvciNpbml0KG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5BbmFseXplckNvbnRleHQsIG9yZy53c2kudGVzdC5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdCwgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRBcnRpZmFjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLndzaS53c2RsLldTRExEb2N1bWVudCwgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgcHJvZmlsZUFydGlmYWN0LAotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0LAotICAgIFN0cmluZyB3c2RsVVJMLAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQsCi0gICAgUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQmFzZVZhbGlkYXRvckltcGwKLSAgICBzdXBlci5pbml0KGFuYWx5emVyQ29udGV4dCwgcHJvZmlsZUFydGlmYWN0LCByZXBvcnRBcnRpZmFjdCwgcmVwb3J0ZXIpOwotCi0gICAgdGhpcy53c2RsRG9jdW1lbnQgPSB3c2RsRG9jdW1lbnQ7Ci0gICAgaWYgKHdzZGxEb2N1bWVudCAhPSBudWxsKQotICAgICAgdGhpcy53c2RsVVJMID0gd3NkbERvY3VtZW50LmdldExvY2F0aW9uKCk7Ci0KLSAgICBpZiAod3NkbFVSTCAhPSBudWxsKQotICAgICAgdGhpcy53c2RsVVJMID0gd3NkbFVSTDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuV1NETFZhbGlkYXRvciN2YWxpZGF0ZSgpCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50IHZhbGlkYXRlKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy9XU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50ID0gbnVsbDsKLSAgICBFbnRyeSBlbnRyeSA9IG51bGw7Ci0KLSAgICBTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgIFBvcnQgcG9ydCA9IG51bGw7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IG51bGw7Ci0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG51bGw7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLQotICAgIC8vIGl0IGRlcHJpY2F0ZWQgYWZ0ZXIgcmVmYWN0b3JpbmcgCi0gICAgLy8gbm93IHRoZSBpbm5lciBjbGFzc2VzIG1vdmVkIG91dCBmcm9tIHZhbGlkYXRvcgotICAgIC8vU3RyaW5nIGNsYXNzUHJlZml4ID0gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkIjsKLSAgICBTdHJpbmcgY2xhc3NQcmVmaXggPSB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSsiLiI7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBWYWxpZGF0ZSB0aGUgV1NETCBzZXJ2aWNlIGRlc2NyaXB0aW9uCi0gICAgICBpZiAodGhpcy53c2RsRG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgICAgdGhpcy53c2RsRG9jdW1lbnQgPSBuZXcgV1NETERvY3VtZW50KHdzZGxVUkwpOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBBREQ6IENlcnRhaW4gZXhjZXB0aW9ucyBzaG91bGQgcmVzdWx0IGluIHZhbGlkYXRpb24gZXJyb3JzCi0KLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgIH0KLQotICAgIC8vIEdldCB0aGUgZGVmaW5pdGlvbiBlbGVtZW50Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd3NkbERvY3VtZW50LmdldERlZmluaXRpb25zKCk7Ci0KLSAgICAvLyBHZXQgc2VydmljZSByZWZlcmVuY2UgZnJvbSBhbmFseXplciBjb250ZXh0Ci0gICAgU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlID0gYW5hbHl6ZXJDb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoKTsKLQotICAgIC8vIENyZWF0ZSBub3JtYWxpemVkIGRhdGEgYWJvdXQgdGhlIHNlcnZpY2UgdW5kZXIgdGVzdC4KLSAgICBDYW5kaWRhdGVJbmZvIGNhbmRpZGF0ZSA9IG5ldyBDYW5kaWRhdGVJbmZvKHNlcnZpY2VSZWZlcmVuY2UsIHdzZGxEb2N1bWVudCk7Ci0KLSAgICBhbmFseXplckNvbnRleHQuc2V0Q2FuZGlkYXRlSW5mbyhjYW5kaWRhdGUpOwotCi0gICAgLy8gU2V0IHByZXJlcSB0eXBlIHRvIGVudHJ5IGNvbnRhaW5lcgotICAgIHJlcG9ydGVyLnNldFByZXJlcVR5cGUoUmVwb3J0ZXIuUFJFUkVRX1RZUEVfRU5UUllfQ09OVEFJTkVSKTsKLQotICAgIC8vIGFsd2F5cyBwcm9jZXNzIEltcG9ydCwgRGVmaW5pdGlvbnMgJiBUeXBlcyBhc3NlcnRpb25zIAotICAgIC8vIFRFTVA6Ci0gICAgcHJvY2Vzc0RlZmluaXRpb25Bc3NlcnRpb25zKGNsYXNzUHJlZml4LCBjYW5kaWRhdGUpOwotICAgIHByb2Nlc3NUeXBlc0Fzc2VydGlvbnMoY2xhc3NQcmVmaXgsIGNhbmRpZGF0ZSk7Ci0gICAgcHJvY2Vzc0ltcG9ydEFzc2VydGlvbnMoY2xhc3NQcmVmaXgsIGNhbmRpZGF0ZSk7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSBlbGVtZW50IGhpZXJhcmNoeSBpbiB0aGUgV1NETCBkb2N1bWVudCBzdGFydGluZyB3aXRoIHRoZSBvbmUgdGhhdCB3YXMgc3BlY2lmaWVkICAKLSAgICAvLyBGSVg6IEVsZW1lbnQgZmluZGluZyBhbHJlYWR5IGNvbXBsZXRlZCBieSBDYW5kaWRhdGVJbmZvIGNvbnN0cnVjdG9yIC0gc28gdXNlIHRoYXQgcmF0aGVyIHRoYW4gcmV0ZXN0IGhlcmUgIAotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gd3NkbDpwb3J0Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgaWYgKHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5pc1BvcnQoKSkKLSAgICB7Ci0gICAgICAvLyBGaW5kIHRoZSBzZXJ2aWNlIGVsZW1lbnQKLSAgICAgIGlmICgoc2VydmljZSA9Ci0gICAgICAgIGRlZmluaXRpb24uZ2V0U2VydmljZSgKLSAgICAgICAgICBzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0UGFyZW50RWxlbWVudFFOYW1lKCkpKQotICAgICAgICA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgV1NJUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAiQ291bGQgbm90IGxvY2F0ZSBXU0RMIHNlcnZpY2U6ICIKLSAgICAgICAgICAgICsgc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmdldFBhcmVudEVsZW1lbnROYW1lKCkpOwotICAgICAgfQotCi0gICAgICAvLyBGaW5kIHRoZSBwb3J0IGVsZW1lbnQKLSAgICAgIGlmICgocG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0TmFtZSgpKSkKLSAgICAgICAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSVJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIkNvdWxkIG5vdCBsb2NhdGUgV1NETCBwb3J0OiAiCi0gICAgICAgICAgICArIHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXROYW1lKCkpOwotICAgICAgfQotCi0gICAgICAvLyBURU1QOiBSZW1vdmUgdW50aWwgdGhlcmUgYXJlIHBvcnQgdGVzdCBhc3NlcnRpb25zICAgICAgCi0gICAgICAvL3Byb2Nlc3NQb3J0QXNzZXJ0aW9ucyhwb3J0LCBzZXJ2aWNlUmVmZXJlbmNlLCBjbGFzc1ByZWZpeCwgd3NkbERvY3VtZW50KTsJICAgICAKLQotICAgICAgLy8gTmV4dCwgcHJvY2VzcyB0aGUgYmluZGluZwotICAgICAgaWYgKCgoYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpKSA9PSBudWxsKSB8fCAoYmluZGluZy5pc1VuZGVmaW5lZCgpKSkKLSAgICAgIHsKLSAgICAgICAgLy90aHJvdyBuZXcgV1NJUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGxvY2F0ZSBXU0RMIGJpbmRpbmcgZm9yIHBvcnQ6ICIgKyBwb3J0LmdldE5hbWUoKSk7ICAKLSAgICAgICAgLy8gU2V0IG1pc3NpbmdJbnB1dCBmb3IgYWxsIGJpbmRpbmcsIHBvcnRUeXBlLCBvcGVyYXRpb24gYW5kIG1lc3NhZ2UgdGVzdCBhc3NlcnRpb25zIAotICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9CSU5ESU5HKSk7Ci0gICAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX1BPUlRUWVBFKSk7Ci0gICAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTikpOwotICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9NRVNTQUdFKSk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcHJvY2Vzc0JpbmRpbmdBc3NlcnRpb25zKAotICAgICAgICAgIGJpbmRpbmcsCi0gICAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICB3c2RsRG9jdW1lbnQpOwotCi0gICAgICAgIC8vIE5leHQsIHByb2Nlc3MgdGhlIHBvcnRUeXBlCi0gICAgICAgIGlmICgoKHBvcnRUeXBlID0gYmluZGluZy5nZXRQb3J0VHlwZSgpKSA9PSBudWxsKQotICAgICAgICAgIHx8IChwb3J0VHlwZS5pc1VuZGVmaW5lZCgpKSkKLSAgICAgICAgewotICAgICAgICAgIC8vdGhyb3cgbmV3IFdTSVJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2NhdGUgV1NETCBwb3J0VHlwZSBmb3IgYmluZGluZzogIiArIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgLy8gU2V0IG1pc3NpbmdJbnB1dCBmb3IgYWxsIHBvcnRUeXBlLCBvcGVyYXRpb24gYW5kIG1lc3NhZ2UgdGVzdCBhc3NlcnRpb25zIAotICAgICAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fUE9SVFRZUEUpKTsKLSAgICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTikpOwotICAgICAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fTUVTU0FHRSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgICAgICAgICAgYmluZGluZywKLSAgICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgICAgICAgcHJvY2Vzc1BvcnRUeXBlQXNzZXJ0aW9ucygKLSAgICAgICAgICAgIHBvcnRUeXBlLAotICAgICAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICAgICAgd3NkbERvY3VtZW50KTsKLSAgICAgICAgICBwcm9jZXNzT3BlcmF0aW9uQXNzZXJ0aW9ucygKLSAgICAgICAgICAgIHBvcnRUeXBlLAotICAgICAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICAgICAgd3NkbERvY3VtZW50KTsKLSAgICAgICAgICBwcm9jZXNzTWVzc2FnZUFzc2VydGlvbnMoCi0gICAgICAgICAgICBwb3J0VHlwZSwKLSAgICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHdzZGw6YmluZGluZwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGVsc2UgaWYgKHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5pc0JpbmRpbmcoKSkKLSAgICB7Ci0gICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKTsKLSAgICAgIC8vIEZpbmQgdGhlIGJpbmRpbmcgZWxlbWVudAotICAgICAgaWYgKHdzZGxFbGVtZW50LmdldFFOYW1lKCkgIT0gbnVsbAotICAgICAgICAmJiB3c2RsRWxlbWVudC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICE9IG51bGwKLSAgICAgICAgJiYgd3NkbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmICgoKGJpbmRpbmcgPQotICAgICAgICAgIGRlZmluaXRpb24uZ2V0QmluZGluZyhzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0UU5hbWUoKSkpCi0gICAgICAgICAgPT0gbnVsbCkKLSAgICAgICAgICB8fCAoYmluZGluZy5pc1VuZGVmaW5lZCgpKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBXU0lSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgIkNvdWxkIG5vdCBsb2NhdGUgV1NETCBiaW5kaW5nOiAiCi0gICAgICAgICAgICAgICsgc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9jZXNzQmluZGluZ0Fzc2VydGlvbnMoCi0gICAgICAgICAgYmluZGluZywKLSAgICAgICAgICBzZXJ2aWNlUmVmZXJlbmNlLAotICAgICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgICAgIHByb2Nlc3NNZXNzYWdlQXNzZXJ0aW9ucygKLSAgICAgICAgICBiaW5kaW5nLAotICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgICAgd3NkbERvY3VtZW50KTsKLQotICAgICAgICAvLyBOZXh0LCBwcm9jZXNzIHRoZSBwb3J0VHlwZQotICAgICAgICBpZiAoKChwb3J0VHlwZSA9IGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSkgPT0gbnVsbCkKLSAgICAgICAgICB8fCAocG9ydFR5cGUuaXNVbmRlZmluZWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvL3Rocm93IG5ldyBXU0lSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9jYXRlIFdTREwgUG9ydFR5cGUgZm9yIEJpbmRpbmc6ICIgKyBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgLy8gU2V0IG1pc3NpbmdJbnB1dCBmb3IgYWxsIHBvcnRUeXBlLCBvcGVyYXRpb24gYW5kIG1lc3NhZ2UgdGVzdCBhc3NlcnRpb25zIAotICAgICAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fUE9SVFRZUEUpKTsKLSAgICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTikpOwotICAgICAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fTUVTU0FHRSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcHJvY2Vzc1BvcnRUeXBlQXNzZXJ0aW9ucygKLSAgICAgICAgICAgIHBvcnRUeXBlLAotICAgICAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICAgICAgd3NkbERvY3VtZW50KTsKLSAgICAgICAgICBwcm9jZXNzT3BlcmF0aW9uQXNzZXJ0aW9ucygKLSAgICAgICAgICAgIHBvcnRUeXBlLAotICAgICAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICAgICAgd3NkbERvY3VtZW50KTsKLQotICAgICAgICAgIC8vIFByb2Nlc3MgZWFjaCBtZXNzYWdlIHdpdGhpbiBlYWNoIG9wZXJhdGlvbiBvZiB0aGUgcG9ydFR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiaW5kaW5nCi0gICAgICAgICAgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgICAgICAgICAgcG9ydFR5cGUsCi0gICAgICAgICAgICBzZXJ2aWNlUmVmZXJlbmNlLAotICAgICAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgICAgICB3c2RsRG9jdW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRoZXJlIHdhcyBhIHByb2JsZW0gd2l0aCB0aGUgYmluZGluZyBlbGVtZW50IHNwZWNpZmljYXRpb24uICBUaGlzIGNhbiAKLSAgICAgIC8vIGhhcHBlbiB3aGVuIGEgVURESSB0TW9kZWwgZGlkIG5vdCBoYXZlIGEgdmFsaWQgYmluZGluZyByZWZlcmVuY2UuCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFNldCBtaXNzaW5nSW5wdXQgZm9yIGFsbCBiaW5kaW5nLCBwb3J0VHlwZSwgb3BlcmF0aW9uIGFuZCBtZXNzYWdlIHRlc3QgYXNzZXJ0aW9ucyAKLSAgICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fQklORElORykpOwotICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9QT1JUVFlQRSkpOwotICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9PUEVSQVRJT04pKTsKLSAgICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fTUVTU0FHRSkpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHdzZGw6cG9ydFR5cGUKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBlbHNlIGlmIChzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuaXNQb3J0VHlwZSgpKQotICAgIHsKLSAgICAgIC8vIEZpbmQgdGhlIFBvcnRUeXBlIGVsZW1lbnQKLSAgICAgIGlmICgoKHBvcnRUeXBlID0KLSAgICAgICAgZGVmaW5pdGlvbi5nZXRQb3J0VHlwZShzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0UU5hbWUoKSkpCi0gICAgICAgID09IG51bGwpCi0gICAgICAgIHx8IChwb3J0VHlwZS5pc1VuZGVmaW5lZCgpKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSVJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIkNvdWxkIG5vdCBsb2NhdGUgV1NETCBQb3J0VHlwZTogIgotICAgICAgICAgICAgKyBzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gU2V0IG1pc3NpbmdJbnB1dCBmb3IgYWxsIGJpbmRpbmcgdGVzdCBhc3NlcnRpb25zIAotICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX0JJTkRJTkcpKTsKLQotICAgICAgcHJvY2Vzc1BvcnRUeXBlQXNzZXJ0aW9ucygKLSAgICAgICAgcG9ydFR5cGUsCi0gICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICB3c2RsRG9jdW1lbnQpOwotICAgICAgcHJvY2Vzc09wZXJhdGlvbkFzc2VydGlvbnMoCi0gICAgICAgIHBvcnRUeXBlLAotICAgICAgICBzZXJ2aWNlUmVmZXJlbmNlLAotICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgd3NkbERvY3VtZW50KTsKLQotICAgICAgLy8gUHJvY2VzcyBlYWNoIG1lc3NhZ2Ugd2l0aGluIGVhY2ggb3BlcmF0aW9uIG9mIHRoZSBwb3J0VHlwZQotICAgICAgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgICAgICBwb3J0VHlwZSwKLSAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gd3NkbDpvcGVyYXRpb24KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBlbHNlIGlmIChzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuaXNPcGVyYXRpb24oKSkKLSAgICB7Ci0gICAgICAvLyBGaW5kIHRoZSBvcGVyYXRpb24KLSAgICAgIC8vIGdldCBwb3J0VHlwZSBmcm9tIGNvbmZpZyBwYXJlbnQgZWxlbWVudAotICAgICAgaWYgKCgocG9ydFR5cGUgPQotICAgICAgICBkZWZpbml0aW9uLmdldFBvcnRUeXBlKAotICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXRQYXJlbnRFbGVtZW50UU5hbWUoKSkpCi0gICAgICAgID09IG51bGwpCi0gICAgICAgIHx8IChwb3J0VHlwZS5pc1VuZGVmaW5lZCgpKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSVJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIkNvdWxkIG5vdCBsb2NhdGUgV1NETCBwb3J0VHlwZTogIgotICAgICAgICAgICAgKyBzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0UGFyZW50RWxlbWVudFFOYW1lKCkpOwotICAgICAgfQotCi0gICAgICBpZiAoKChvcGVyYXRpb24gPQotICAgICAgICBnZXRPcGVyYXRpb25Gcm9tUG9ydFR5cGUoCi0gICAgICAgICAgcG9ydFR5cGUsCi0gICAgICAgICAgc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmdldE5hbWUoKSkpCi0gICAgICAgID09IG51bGwpCi0gICAgICAgIHx8IChvcGVyYXRpb24uaXNVbmRlZmluZWQoKSkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBXU0lSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJDb3VsZCBub3QgbG9jYXRlIFdTREwgT3BlcmF0aW9uOiAiCi0gICAgICAgICAgICArIHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICsgImluIHBvcnRUeXBlOiAiCi0gICAgICAgICAgICArIHBvcnRUeXBlLmdldFFOYW1lKCkpOwotICAgICAgfQotCi0gICAgICAvLyBTZXQgbWlzc2luZ0lucHV0IGZvciBhbGwgYmluZGluZyBhbmQgcG9ydFR5cGUgdGVzdCBhc3NlcnRpb25zIAotICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX0JJTkRJTkcpKTsKLSAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9QT1JUVFlQRSkpOwotCi0gICAgICBwcm9jZXNzT3BlcmF0aW9uQXNzZXJ0aW9ucygKLSAgICAgICAgb3BlcmF0aW9uLAotICAgICAgICBwb3J0VHlwZSwKLSAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgICBwcm9jZXNzTWVzc2FnZUFzc2VydGlvbnMoCi0gICAgICAgIG9wZXJhdGlvbiwKLSAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gd3NkbDptZXNzYWdlCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZWxzZSBpZiAoc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmlzTWVzc2FnZSgpKQotICAgIHsKLSAgICAgIC8vIEZpbmQgdGhlIG1lc3NhZ2UKLSAgICAgIGlmICgoKG1lc3NhZ2UgPQotICAgICAgICBkZWZpbml0aW9uLmdldE1lc3NhZ2Uoc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmdldFFOYW1lKCkpKQotICAgICAgICA9PSBudWxsKQotICAgICAgICB8fCAobWVzc2FnZS5pc1VuZGVmaW5lZCgpKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSVJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIkNvdWxkIG5vdCBsb2NhdGUgV1NETCBNZXNzYWdlOiAiCi0gICAgICAgICAgICArIHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXROYW1lKCkpOwotICAgICAgfQotCi0gICAgICAvLyBTZXQgbWlzc2luZ0lucHV0IGZvciBhbGwgYmluZGluZywgcG9ydFR5cGUsIGFuZCBvcGVyYXRpb24gdGVzdCBhc3NlcnRpb25zIAotICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX0JJTkRJTkcpKTsKLSAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9QT1JUVFlQRSkpOwotICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTikpOwotCi0gICAgICBwcm9jZXNzTWVzc2FnZUFzc2VydGlvbnMoCi0gICAgICAgIG1lc3NhZ2UsCi0gICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICB3c2RsRG9jdW1lbnQpOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgIlRoZSBmb2xsb3dpbmcgV1NETCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQ6ICIKLSAgICAgICAgICArIHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXRUeXBlKCkpOwotICAgIH0KLQotICAgIC8vIENsZWFudXAKLSAgICBjbGVhbnVwKCk7Ci0KLSAgICAvLyBSZXR1cm4gV1NETCBkb2N1bWVudAotICAgIHJldHVybiB0aGlzLndzZGxEb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgZW50cnkgY29udGFpbmVyIHVzaW5nIHRoZSBmaWxlbmFtZSBmb3IgV1NETCBkb2N1bWVudC4KLSAgICogQHBhcmFtIGZpbGVuYW1lIGEgZmlsZSBuYW1lLgotICAgKiBAcmV0dXJuIGVudHJ5IGNvbnRhaW5lciB1c2luZyB0aGUgZmlsZW5hbWUgZm9yIFdTREwgZG9jdW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgRW50cnlDb250YWluZXIgZ2V0RW50cnlDb250YWluZXIoU3RyaW5nIGZpbGVuYW1lKQotICB7Ci0gICAgRW50cnlDb250YWluZXIgZW50cnlDb250YWluZXIgPSBudWxsOwotCi0gICAgLy8gSWYgdGhlIGVudHJ5IGNvbnRhaW5lciBhbHJlYWR5IGV4aXN0cywgdGhlbiB1c2UgaXQKLSAgICBpZiAoKGVudHJ5Q29udGFpbmVyID0gKEVudHJ5Q29udGFpbmVyKSBjb250YWluZXJNYXAuZ2V0KGZpbGVuYW1lKSkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBDcmVhdGUgbmV3IGVudHJ5IGNvbnRhaW5lcgotICAgICAgZW50cnlDb250YWluZXIgPSB0aGlzLnJlcG9ydGVyLmNyZWF0ZUVudHJ5Q29udGFpbmVyKCk7Ci0KLSAgICAgIC8vIFNldCBjb250YWluZXIgaWQgdXNpbmcgdGhlIGZpbGVuYW1lIGZvciB0aGUgV1NETCBkb2N1bWVudAotICAgICAgZW50cnlDb250YWluZXIuc2V0SWQoZmlsZW5hbWUpOwotCi0gICAgICAvLyBQdXQgdGhlIG5ldyBlbnRyeSBjb250YWluZXIgaW50byB0aGUgY29udGFpbmVyIG1hcAotICAgICAgY29udGFpbmVyTWFwLnB1dChmaWxlbmFtZSwgZW50cnlDb250YWluZXIpOwotICAgIH0KLQotICAgIHJldHVybiBlbnRyeUNvbnRhaW5lcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgb3BlcmF0aW9uIGZyb20gcG9ydCB0eXBlLgotICAgKiBAcGFyYW0gcG9ydFR5cGUgcG9ydCB0eXBlLgotICAgKiBAcGFyYW0gb3BlcmF0aW9uTmFtZSBvcGVyYXRpb24gbmFtZS4KLSAgICogQHJldHVybiBvcGVyYXRpb24gZnJvbSBwb3J0IHR5cGUuCi0gICAqLwotICBwcm90ZWN0ZWQgT3BlcmF0aW9uIGdldE9wZXJhdGlvbkZyb21Qb3J0VHlwZSgKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSwKLSAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSkKLSAgewotICAgIC8vIEZJWDogd3NkbDRqIGF2YWlsYWJsZSBtZXRob2QgY2FsbCBiZWxvdyBpbXBsaWVzIHRoYXQgb25seSAKLSAgICAvLyBuYW1lK2lucHV0bmFtZStvdXRwdXRuYW1lIHVuaXF1ZWx5IGRlZmluZXMgb3BlcmF0aW9uIAotICAgIC8vIFVzZSB0aGlzIGluc3RlYWQgZm9yIG5vdzogLSBnZXQgdGhlIGZpcnN0IG9wZXJhdGlvbiB3ZSBmaW5kLi4uCi0gICAgT3BlcmF0aW9uIG9wID0gbnVsbDsKLSAgICBpZiAocG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3Igb3BJdCA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotCi0gICAgICB3aGlsZSAob3BJdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIG9wID0gKE9wZXJhdGlvbikgb3BJdC5uZXh0KCk7Ci0gICAgICAgIGlmIChvcGVyYXRpb25OYW1lLmVxdWFscyhvcC5nZXROYW1lKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG9wOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7IC8vIG5vIG1hdGNoaW5nIG9wZXJhdGlvbiBmb3VuZAotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgZGVmaW5pdGlvbiBhc3NlcnRpb25zLgotICAgKiBAcGFyYW0gY2xhc3NQcmVmaXggY2xhc3MgcHJlZml4LgotICAgKiBAcGFyYW0gY2FuZGlkYXRlIGNhbmRpZGF0ZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgZHVyaW5nIHByb2Nlc3NpbmcuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVmaW5pdGlvbkFzc2VydGlvbnMoCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIENhbmRpZGF0ZUluZm8gY2FuZGlkYXRlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgRW50cnkgZW50cnkgPSBudWxsOwotCi0gICAgRGVmaW5pdGlvbltdIHdzZGxEZWZpbml0aW9ucyA9IGNhbmRpZGF0ZS5nZXREZWZpbml0aW9ucygpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c2RsRGVmaW5pdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd3NkbERlZmluaXRpb25zW2ldOwotICAgICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICAvLyBDcmVhdGUgZW50cnkgCi0gICAgICBlbnRyeSA9IHRoaXMucmVwb3J0ZXIuZ2V0UmVwb3J0KCkuY3JlYXRlRW50cnkoKTsKLSAgICAgIGVudHJ5LnNldEVudHJ5VHlwZSgKLSAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9ERUZJTklUSU9OUykpOwotICAgICAgZW50cnkuc2V0UmVmZXJlbmNlSUQoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0gICAgICBlbnRyeS5zZXRFbnRyeURldGFpbChkZWZpbml0aW9uKTsKLQotICAgICAgLy8gU2V0IGVudHJ5IGNvbnRhaW5lcgotICAgICAgZW50cnkuc2V0RW50cnlDb250YWluZXIoCi0gICAgICAgIGdldEVudHJ5Q29udGFpbmVyKGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpKTsKLQotICAgICAgLy8gUHJvY2VzcyBhbGwgb2YgdGhlIGRlZmluaXRpb24gcmVsYXRlZCB0ZXN0IGFzc2VydGlvbnMKLSAgICAgIHByb2Nlc3NBc3NlcnRpb25zKAotICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgbmV3IEVudHJ5Q29udGV4dChlbnRyeSwgY2FuZGlkYXRlLmdldFdzZGxEb2N1bWVudCgpKSk7Ci0gICAgICAvLyBBREQ6IG5lZWQgdG8gdXNlIGhlcmUgdGhlIHNwZWNpZmljIGRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlZmluaXRpb24/PwotCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgdHlwZXMgYXNzZXJ0aW9ucy4KLSAgICogQHBhcmFtIGNsYXNzUHJlZml4IGNsYXNzIHByZWZpeC4KLSAgICogQHBhcmFtIGNhbmRpZGF0ZSBjYW5kaWRhdGUuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIAotICAgKiAgICAgICAgIHR5cGUgYXNzZXJ0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NUeXBlc0Fzc2VydGlvbnMoCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIENhbmRpZGF0ZUluZm8gY2FuZGlkYXRlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIEVudHJ5IGVudHJ5ID0gbnVsbDsKLQotICAgIFR5cGVzW10gd3NkbFR5cGVzID0gY2FuZGlkYXRlLmdldFR5cGVzKCk7Ci0gICAgRGVmaW5pdGlvbltdIHdzZGxEZWZpbml0aW9ucyA9IGNhbmRpZGF0ZS5nZXREZWZpbml0aW9ucygpOwotCi0gICAgLy8gSWYgdGhlcmUgYXJlIG5vIHR5cGVzIGVsZW1lbnRzLCB0aGVuIHNldCBhbGwgcmVzdWx0cyB0byBtaXNzaW5nSW5wdXQgICAKLSAgICBpZiAod3NkbFR5cGVzID09IG51bGwgfHwgd3NkbFR5cGVzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIC8vIFNldCBtaXNzaW5nSW5wdXQgZm9yIGFsbCB0ZXN0IGFzc2VydGlvbnMgd2l0aCB0aGlzIGVudHJ5IHR5cGUKLSAgICAgIHNldE1pc3NpbmdJbnB1dChFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX1RZUEVTKSk7Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbFR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBUeXBlcyB0eXBlcyA9IHdzZGxUeXBlc1tpXTsKLSAgICAgICAgaWYgKHR5cGVzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBubyBUeXBlcyBlbGVtZW50IGluIGktdGggZG9jdW1lbnQKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBlbnRyeSAKLSAgICAgICAgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LnNldEVudHJ5VHlwZSgKLSAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX1RZUEVTKSk7Ci0gICAgICAgIGVudHJ5LnNldFJlZmVyZW5jZUlEKAotICAgICAgICAgIGNhbmRpZGF0ZS5nZXREZWZpbml0aW9uKHR5cGVzKS5nZXREb2N1bWVudEJhc2VVUkkoKSArICItVHlwZXMiKTsKLSAgICAgICAgZW50cnkuc2V0RW50cnlEZXRhaWwodHlwZXMpOwotCi0gICAgICAgIC8vIFNldCBlbnRyeSBjb250YWluZXIKLSAgICAgICAgZW50cnkuc2V0RW50cnlDb250YWluZXIoCi0gICAgICAgICAgZ2V0RW50cnlDb250YWluZXIod3NkbERlZmluaXRpb25zW2ldLmdldERvY3VtZW50QmFzZVVSSSgpKSk7Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBhbGwgb2YgdGhlIFR5cGVzIHJlbGF0ZWQgdGVzdCBhc3NlcnRpb25zCi0gICAgICAgIHByb2Nlc3NBc3NlcnRpb25zKAotICAgICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICAgIG5ldyBFbnRyeUNvbnRleHQoZW50cnksIGNhbmRpZGF0ZS5nZXRXc2RsRG9jdW1lbnQoKSkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGltcG9ydCBhc3NlcnRpb25zLiAKLSAgICogQHBhcmFtIGNsYXNzUHJlZml4IGNsYXNzIHByZWZpeC4KLSAgICogQHBhcmFtIGNhbmRpZGF0ZSBjYW5kaWRhdGUuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIAotICAgKiAgICAgICAgIGltcG9ydCBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ltcG9ydEFzc2VydGlvbnMoCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIENhbmRpZGF0ZUluZm8gY2FuZGlkYXRlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgRW50cnkgZW50cnkgPSBudWxsOwotCi0gICAgSW1wb3J0W10gd3NkbEltcG9ydHMgPSBjYW5kaWRhdGUuZ2V0SW1wb3J0cygpOwotCi0gICAgLy8gSWYgdGhlcmUgYXJlIG5vIGltcG9ydCBlbGVtZW50cywgdGhlbiBzZXQgYWxsIHJlc3VsdHMgdG8gbWlzc2luZ0lucHV0ICAgCi0gICAgaWYgKHdzZGxJbXBvcnRzID09IG51bGwgfHwgd3NkbEltcG9ydHMubGVuZ3RoID09IDApCi0gICAgewotICAgICAgLy8gU2V0IG1pc3NpbmdJbnB1dCBmb3IgYWxsIHRlc3QgYXNzZXJ0aW9ucyB3aXRoIHRoaXMgZW50cnkgdHlwZQotICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX0lNUE9SVCkpOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGxJbXBvcnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBJbXBvcnQgd3NkbEltcG9ydCA9IHdzZGxJbXBvcnRzW2ldOwotICAgICAgICAvLyBDcmVhdGUgZW50cnkgCi0gICAgICAgIGVudHJ5ID0gdGhpcy5yZXBvcnRlci5nZXRSZXBvcnQoKS5jcmVhdGVFbnRyeSgpOwotICAgICAgICBlbnRyeS5zZXRFbnRyeVR5cGUoCi0gICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9JTVBPUlQpKTsKLSAgICAgICAgZW50cnkuc2V0UmVmZXJlbmNlSUQod3NkbEltcG9ydC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGVudHJ5LnNldEVudHJ5RGV0YWlsKHdzZGxJbXBvcnQpOwotCi0gICAgICAgIC8vIFNldCBlbnRyeSBjb250YWluZXIKLSAgICAgICAgZW50cnkuc2V0RW50cnlDb250YWluZXIoZ2V0RW50cnlDb250YWluZXIod3NkbEltcG9ydC5nZXRMb2NhdGlvblVSSSgpKSk7Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBhbGwgb2YgdGhlIGltcG9ydCByZWxhdGVkIHRlc3QgYXNzZXJ0aW9ucwotICAgICAgICBwcm9jZXNzQXNzZXJ0aW9ucygKLSAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICBuZXcgRW50cnlDb250ZXh0KGVudHJ5LCBjYW5kaWRhdGUuZ2V0V3NkbERvY3VtZW50KCkpKTsKLSAgICAgICAgLy8gQUREOiBuZWVkIHRvIHVzZSBoZXJlIHRoZSBzcGVjaWZpYyBkb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbXBvcnQhIQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIHBvcnQgYXNzZXJ0aW9ucy4KLSAgICogQHBhcmFtIHBvcnQgYSBwb3J0LgotICAgKiBAcGFyYW0gc2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlIHJlZmVyZW5jZS4KLSAgICogQHBhcmFtIGNsYXNzUHJlZml4IGNsYXNzIHByZWZpeC4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCBXU0RMIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtIG9jY3VycyBkdXJpbmcgcHJvY2Vzc2luZyAKLSAgICogICAgICAgICBwb3J0IGFzc2VydGlvbnMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUG9ydEFzc2VydGlvbnMoCi0gICAgUG9ydCBwb3J0LAotICAgIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSwKLSAgICBTdHJpbmcgY2xhc3NQcmVmaXgsCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IG51bGw7Ci0KLSAgICAvLyBDcmVhdGUgZW50cnkgCSAgCi0gICAgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgZW50cnkuc2V0RW50cnlUeXBlKEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fUE9SVCkpOwotICAgIGVudHJ5LnNldFJlZmVyZW5jZUlEKHBvcnQuZ2V0TmFtZSgpKTsKLSAgICBlbnRyeS5zZXRQYXJlbnRFbGVtZW50TmFtZSgKLSAgICAgIHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXRQYXJlbnRFbGVtZW50TmFtZSgpKTsKLSAgICBlbnRyeS5zZXRFbnRyeURldGFpbChwb3J0KTsKLQotICAgIC8vIFByb2Nlc3MgYXNzZXJ0aW9ucyBmb3IgdGhpcyBhcnRpZmFjdCBhZ2FpbnN0IHRoZSB0YXJnZXQgY29udGV4dAotICAgIHByb2Nlc3NBc3NlcnRpb25zKGNsYXNzUHJlZml4LCBuZXcgRW50cnlDb250ZXh0KGVudHJ5LCB3c2RsRG9jdW1lbnQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGJpbmRpbmcgYXNzZXJ0aW9ucy4KLSAgICogQHBhcmFtIGJpbmRpbmcgYmluZGluZy4KLSAgICogQHBhcmFtIHNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSBjbGFzc1ByZWZpeCBjbGFzcyBwcmVmaXguCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgV1NETCBkb2N1bWVudC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHByb2Nlc3NpbmcgCi0gICAqICAgICAgICAgYmluZGluZyBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0JpbmRpbmdBc3NlcnRpb25zKAotICAgIEJpbmRpbmcgYmluZGluZywKLSAgICBTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgRW50cnkgZW50cnkgPSBudWxsOwotICAgIFFOYW1lIGJpbmRpbmdRTmFtZSA9IGJpbmRpbmcuZ2V0UU5hbWUoKTsKLQotICAgIC8vIENyZWF0ZSBlbnRyeSAKLSAgICBlbnRyeSA9IHRoaXMucmVwb3J0ZXIuZ2V0UmVwb3J0KCkuY3JlYXRlRW50cnkoKTsKLSAgICBlbnRyeS5zZXRFbnRyeVR5cGUoCi0gICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX0JJTkRJTkcpKTsKLSAgICBlbnRyeS5zZXRSZWZlcmVuY2VJRChiaW5kaW5nUU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgZW50cnkuc2V0RW50cnlEZXRhaWwoYmluZGluZyk7Ci0KLSAgICAvLyBTZXQgZW50cnkgY29udGFpbmVyCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0KLSAgICAgIGFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0RGVmaW5pdGlvbihiaW5kaW5nKTsKLSAgICBlbnRyeS5zZXRFbnRyeUNvbnRhaW5lcigKLSAgICAgIGdldEVudHJ5Q29udGFpbmVyKAotICAgICAgICAoZGVmaW5pdGlvbiA9PSBudWxsID8gbnVsbCA6IGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpKSk7Ci0KLSAgICAvLyBQcm9jZXNzIGJpbmRpbmcgdGVzdCBhc3NlcnRpb25zCi0gICAgcHJvY2Vzc0Fzc2VydGlvbnMoY2xhc3NQcmVmaXgsIG5ldyBFbnRyeUNvbnRleHQoZW50cnksIHdzZGxEb2N1bWVudCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgcG9ydCB0eXBlIGFzc2VydGlvbnMuCi0gICAqIEBwYXJhbSBwb3J0VHlwZSBwb3J0IHR5cGUuCi0gICAqIEBwYXJhbSBzZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2UgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gY2xhc3NQcmVmaXggY2xhc3MgcHJlZml4LgotICAgKiBAcGFyYW0gd3NkbERvY3VtZW50IFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIAotICAgKiAgICAgICAgIHBvcnQgdHlwZSBhc3NlcnRpb25zLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUG9ydFR5cGVBc3NlcnRpb25zKAotICAgIFBvcnRUeXBlIHBvcnRUeXBlLAotICAgIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSwKLSAgICBTdHJpbmcgY2xhc3NQcmVmaXgsCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIEVudHJ5IGVudHJ5ID0gbnVsbDsKLSAgICBRTmFtZSBwb3J0VHlwZVFOYW1lID0gcG9ydFR5cGUuZ2V0UU5hbWUoKTsKLQotICAgIC8vIENyZWF0ZSBlbnRyeSAKLSAgICBlbnRyeSA9IHRoaXMucmVwb3J0ZXIuZ2V0UmVwb3J0KCkuY3JlYXRlRW50cnkoKTsKLSAgICBlbnRyeS5zZXRFbnRyeVR5cGUoCi0gICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX1BPUlRUWVBFKSk7Ci0gICAgZW50cnkuc2V0UmVmZXJlbmNlSUQocG9ydFR5cGVRTmFtZS50b1N0cmluZygpKTsKLSAgICBlbnRyeS5zZXRFbnRyeURldGFpbChwb3J0VHlwZSk7Ci0KLSAgICAvLyBTZXQgZW50cnkgY29udGFpbmVyCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0KLSAgICAgIGFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0RGVmaW5pdGlvbihwb3J0VHlwZSk7Ci0gICAgZW50cnkuc2V0RW50cnlDb250YWluZXIoCi0gICAgICBnZXRFbnRyeUNvbnRhaW5lcigKLSAgICAgICAgKGRlZmluaXRpb24gPT0gbnVsbCA/IG51bGwgOiBkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKSkpOwotCi0gICAgLy8gUHJvY2VzcyB0ZXN0IGFzc2VydGlvbnMKLSAgICBwcm9jZXNzQXNzZXJ0aW9ucyhjbGFzc1ByZWZpeCwgbmV3IEVudHJ5Q29udGV4dChlbnRyeSwgd3NkbERvY3VtZW50KSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBvcGVyYXRpb24gYXNzZXJ0aW9ucy4KLSAgICogQHBhcmFtIG9wZXJhdGlvbiBhbiBvcGVyYXRpb24uCi0gICAqIEBwYXJhbSBwb3J0VHlwZSBwb3J0IHR5cGUuCi0gICAqIEBwYXJhbSBzZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2UgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gY2xhc3NQcmVmaXggY2xhc3MgcHJlZml4LgotICAgKiBAcGFyYW0gd3NkbERvY3VtZW50IFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIAotICAgKiAgICAgICAgIG9wZXJhdGlvbiBhc3NlcnRpb25zLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzT3BlcmF0aW9uQXNzZXJ0aW9ucygKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uLAotICAgIFBvcnRUeXBlIHBvcnRUeXBlLAotICAgIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSwKLSAgICBTdHJpbmcgY2xhc3NQcmVmaXgsCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBxdWFsaWZ5IG9wZXJhdGlvbiB3aXRoIHNlcnZpY2UgbG9jYXRpb24gZnJvbSBjb25maWcuCQotICAgIEVudHJ5IGVudHJ5ID0gbnVsbDsKLQotICAgIC8vIENyZWF0ZSBlbnRyeSAKLSAgICBlbnRyeSA9IHRoaXMucmVwb3J0ZXIuZ2V0UmVwb3J0KCkuY3JlYXRlRW50cnkoKTsKLSAgICBlbnRyeS5zZXRFbnRyeVR5cGUoCi0gICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTikpOwotICAgIGVudHJ5LnNldFJlZmVyZW5jZUlEKG9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgIGVudHJ5LnNldFBhcmVudEVsZW1lbnROYW1lKHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIGVudHJ5LnNldEVudHJ5RGV0YWlsKG9wZXJhdGlvbik7Ci0KLSAgICAvLyBTZXQgZW50cnkgY29udGFpbmVyCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0KLSAgICAgIGFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0RGVmaW5pdGlvbihwb3J0VHlwZSk7Ci0gICAgZW50cnkuc2V0RW50cnlDb250YWluZXIoCi0gICAgICBnZXRFbnRyeUNvbnRhaW5lcigKLSAgICAgICAgKGRlZmluaXRpb24gPT0gbnVsbCA/IG51bGwgOiBkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKSkpOwotCi0gICAgLy8gUHJvY2VzcyB0ZXN0IGFzc2VydGlvbnMKLSAgICBwcm9jZXNzQXNzZXJ0aW9ucyhjbGFzc1ByZWZpeCwgbmV3IEVudHJ5Q29udGV4dChlbnRyeSwgd3NkbERvY3VtZW50KSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBvcGVyYXRpb24gYXNzZXJ0aW9ucy4KLSAgICogQHBhcmFtIHBvcnRUeXBlIHBvcnQgdHlwZS4KLSAgICogQHBhcmFtIHNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSBjbGFzc1ByZWZpeCBjbGFzcyBwcmVmaXguCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgV1NETCBkb2N1bWVudC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHByb2Nlc3NpbmcgCi0gICAqICAgICAgICAgb3BlcmF0aW9uIGFzc2VydGlvbnMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzT3BlcmF0aW9uQXNzZXJ0aW9ucygKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSwKLSAgICBTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gRm9yIGVhY2ggb3BlcmF0aW9uLCAKLSAgICBpZiAocG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpID09IG51bGwpCi0gICAgewotICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTikpOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBPcGVyYXRpb24gb3BlcmF0aW9uOwotICAgICAgSXRlcmF0b3Igb3BJdCA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKG9wSXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvcEl0Lm5leHQoKTsKLSAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsIHx8IG9wZXJhdGlvbi5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fT1BFUkFUSU9OKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwcm9jZXNzT3BlcmF0aW9uQXNzZXJ0aW9ucygKLSAgICAgICAgICAgIG9wZXJhdGlvbiwKLSAgICAgICAgICAgIHBvcnRUeXBlLAotICAgICAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICAgICAgd3NkbERvY3VtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBtZXNzYWdlIGFzc2VydGlvbnMuCi0gICAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZS4KLSAgICogQHBhcmFtIHNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSBjbGFzc1ByZWZpeCBjbGFzcyBwcmVmaXguCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgV1NETCBkb2N1bWVudC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHByb2Nlc3NpbmcgCi0gICAqICAgICAgICAgbWVzc2FnZSBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgIE1lc3NhZ2UgbWVzc2FnZSwKLSAgICBTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBFbnRyeSBlbnRyeSA9IG51bGw7Ci0gICAgUU5hbWUgbWVzc2FnZVFOYW1lID0gbWVzc2FnZS5nZXRRTmFtZSgpOwotCi0gICAgLy8gQ3JlYXRlIGVudHJ5IAotICAgIGVudHJ5ID0gdGhpcy5yZXBvcnRlci5nZXRSZXBvcnQoKS5jcmVhdGVFbnRyeSgpOwotICAgIGVudHJ5LnNldEVudHJ5VHlwZSgKLSAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fTUVTU0FHRSkpOwotICAgIGVudHJ5LnNldFJlZmVyZW5jZUlEKG1lc3NhZ2VRTmFtZS50b1N0cmluZygpKTsKLSAgICBlbnRyeS5zZXRFbnRyeURldGFpbChtZXNzYWdlKTsKLQotICAgIC8vIFNldCBlbnRyeSBjb250YWluZXIKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPQotICAgICAgYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXREZWZpbml0aW9uKG1lc3NhZ2UpOwotICAgIGVudHJ5LnNldEVudHJ5Q29udGFpbmVyKAotICAgICAgZ2V0RW50cnlDb250YWluZXIoCi0gICAgICAgIChkZWZpbml0aW9uID09IG51bGwgPyBudWxsIDogZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSkpKTsKLQotICAgIC8vIFByb2Nlc3MgYmluZGluZyB0ZXN0IGFzc2VydGlvbnMKLSAgICBwcm9jZXNzQXNzZXJ0aW9ucyhjbGFzc1ByZWZpeCwgbmV3IEVudHJ5Q29udGV4dChlbnRyeSwgd3NkbERvY3VtZW50KSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBtZXNzYWdlIGFzc2VydGlvbnMuCi0gICAqIEBwYXJhbSBiaW5kaW5nIGEgYmluZGluZy4KLSAgICogQHBhcmFtIHNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSBjbGFzc1ByZWZpeCBjbGFzcyBwcmVmaXguCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgV1NETCBkb2N1bWVudC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHByb2Nlc3NpbmcgCi0gICAqICAgICAgICAgbWVzc2FnZSBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgIEJpbmRpbmcgYmluZGluZywKLSAgICBTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgSGFzaFNldCBtZXNzYWdlU2V0OwotCi0gICAgaWYgKGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKSAhPSBudWxsKQotICAgIHsgLy8gY2FuIGRvIG5vdGhpbmcgaWYgaGF2ZSBubyBvcGVyYXRpb25zIGRlZmluZWQKLSAgICAgIG1lc3NhZ2VTZXQgPQotICAgICAgICBXU0RMVXRpbHMuZmluZE1lc3NhZ2VzKHdzZGxEb2N1bWVudC5nZXREZWZpbml0aW9ucygpLCBiaW5kaW5nKTsKLQotICAgICAgLy8gUHJvY2VzcyBhbnkgbWVzc2FnZXMgdGhhdCB3ZXJlIGZvdW5kICAgIAotICAgICAgaWYgKG1lc3NhZ2VTZXQuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgbWVzc2FnZUl0ID0gbWVzc2FnZVNldC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAobWVzc2FnZUl0Lmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBtZXNzYWdlSXQubmV4dCgpOwotICAgICAgICAgIGlmICghbWVzc2FnZS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICBzZXJ2aWNlUmVmZXJlbmNlLAotICAgICAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICAgICAgd3NkbERvY3VtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIG1lc3NhZ2UgYXNzZXJ0aW9ucy4KLSAgICogQHBhcmFtIHBvcnRUeXBlIHBvcnQgdHlwZS4KLSAgICogQHBhcmFtIHNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSBjbGFzc1ByZWZpeCBjbGFzcyBwcmVmaXguCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgV1NETCBkb2N1bWVudC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHByb2Nlc3NpbmcgCi0gICAqICAgICAgICAgbWVzc2FnZSBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgIFBvcnRUeXBlIHBvcnRUeXBlLAotICAgIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSwKLSAgICBTdHJpbmcgY2xhc3NQcmVmaXgsCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIEhhc2hTZXQgbWVzc2FnZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICBpZiAocG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpICE9IG51bGwpCi0gICAgewotICAgICAgLy8gY2FuIGRvIG5vdGhpbmcgaWYgaGF2ZSBubyBvcGVyYXRpb25zIGRlZmluZWQKLQotICAgICAgSXRlcmF0b3Igb3BJdCA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotCi0gICAgICB3aGlsZSAob3BJdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIG9wSXQubmV4dCgpOwotCi0gICAgICAgIC8vIFNpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHdlIGhhdmUgYm90aCBhbmQgaW5wdXQgYW5kIG91dHB1dCBtZXNzYWdlLCAKLSAgICAgICAgLy8gY2hlY2sgZm9yIGl0cyBleGlzdGVuY2UgYmVmb3JlIGFkZGluZyBpdAotICAgICAgICBpZiAob3AuZ2V0SW5wdXQoKSAhPSBudWxsICYmICFvcC5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIG1lc3NhZ2VTZXQuYWRkKG9wLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICBpZiAob3AuZ2V0T3V0cHV0KCkgIT0gbnVsbAotICAgICAgICAgICYmICFvcC5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCkuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICBtZXNzYWdlU2V0LmFkZChvcC5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIC8vIGFsc28gbWVzc2FnZXMgZnJvbSBhbnkgRmF1bHRzIGRlZmluZWQgd2l0aGluIHRoZSBvcGVyYXRpb24KLSAgICAgICAgaWYgKG9wLmdldEZhdWx0cygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBmYXVsdEl0ID0gb3AuZ2V0RmF1bHRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgICAgICAgd2hpbGUgKGZhdWx0SXQuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgPSAoKEZhdWx0KSBmYXVsdEl0Lm5leHQoKSkuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgaWYgKCFtZXNzYWdlLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgIG1lc3NhZ2VTZXQuYWRkKG1lc3NhZ2UpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAobWVzc2FnZVNldC5zaXplKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gU2V0IGFsbCBtZXNzYWdlIHRlc3QgYXNzZXJ0aW9uIHJlc3VsdHMgdG8gbWlzc2luZ0lucHV0Ci0gICAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX01FU1NBR0UpKTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBub3cgc3RlcCB0aHJvdWdoIGVhY2ggZGVyaXZlZCBNZXNzYWdlCi0gICAgICAgIEl0ZXJhdG9yIG1lc3NhZ2VJdCA9IG1lc3NhZ2VTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKG1lc3NhZ2VJdC5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBwcm9jZXNzTWVzc2FnZUFzc2VydGlvbnMoCi0gICAgICAgICAgICAoTWVzc2FnZSkgKG1lc3NhZ2VJdC5uZXh0KCkpLAotICAgICAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICAgICAgd3NkbERvY3VtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIG1lc3NhZ2UgYXNzZXJ0aW9ucy4KLSAgICogQHBhcmFtIG9wIC0gb3BlcmF0aW9uLgotICAgKiBAcGFyYW0gc2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlIHJlZmVyZW5jZS4KLSAgICogQHBhcmFtIGNsYXNzUHJlZml4IGNsYXNzIHByZWZpeC4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCBXU0RMIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtIG9jY3VycyBkdXJpbmcgcHJvY2Vzc2luZyAKLSAgICogICAgICAgICBtZXNzYWdlIGFzc2VydGlvbnMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTWVzc2FnZUFzc2VydGlvbnMoCi0gICAgT3BlcmF0aW9uIG9wLAotICAgIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSwKLSAgICBTdHJpbmcgY2xhc3NQcmVmaXgsCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIEhhc2hTZXQgbWVzc2FnZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgaWYgKG9wLmdldElucHV0KCkgIT0gbnVsbCAmJiAhb3AuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCkuaXNVbmRlZmluZWQoKSkKLSAgICAgIG1lc3NhZ2VTZXQuYWRkKG9wLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpKTsKLQotICAgIGlmIChvcC5nZXRPdXRwdXQoKSAhPSBudWxsICYmICFvcC5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCkuaXNVbmRlZmluZWQoKSkKLSAgICAgIG1lc3NhZ2VTZXQuYWRkKG9wLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAvLyBhbHNvIG1lc3NhZ2VzIGZyb20gYW55IEZhdWx0cyBkZWZpbmVkIHdpdGhpbiB0aGUgb3BlcmF0aW9uCi0gICAgSXRlcmF0b3IgZmF1bHRJdCA9IG9wLmdldEZhdWx0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgTWVzc2FnZSBtZXNzYWdlOwotICAgIHdoaWxlIChmYXVsdEl0Lmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBtZXNzYWdlID0gKChGYXVsdCkgZmF1bHRJdC5uZXh0KCkpLmdldE1lc3NhZ2UoKTsKLSAgICAgIGlmICghbWVzc2FnZS5pc1VuZGVmaW5lZCgpKQotICAgICAgICBtZXNzYWdlU2V0LmFkZChtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBpZiAobWVzc2FnZVNldC5zaXplKCkgPT0gMCkKLSAgICB7Ci0gICAgICAvLyBTZXQgYWxsIG1lc3NhZ2UgdGVzdCBhc3NlcnRpb24gcmVzdWx0cyB0byBtaXNzaW5nSW5wdXQKLSAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9NRVNTQUdFKSk7Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIG5vdyBzdGVwIHRocm91Z2ggZWFjaCBkZXJpdmVkIE1lc3NhZ2UKLSAgICAgIEl0ZXJhdG9yIG1lc3NhZ2VJdCA9IG1lc3NhZ2VTZXQuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChtZXNzYWdlSXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBwcm9jZXNzTWVzc2FnZUFzc2VydGlvbnMoCi0gICAgICAgICAgKE1lc3NhZ2UpIChtZXNzYWdlSXQubmV4dCgpKSwKLSAgICAgICAgICBzZXJ2aWNlUmVmZXJlbmNlLAotICAgICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsI2lzUHJpbWFyeUVudHJ5VHlwZU1hdGNoKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByaW1hcnlFbnRyeVR5cGVNYXRjaCgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IHRhcmdldENvbnRleHQpCi0gIHsKLSAgICBib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0KLSAgICAvLyBJZiB0aGUgdGVzdCBhc3NlcnRpb24gZW50cnkgdHlwZSBtYXRjaGVzIHRoZSB0YXJnZXQgY29udGV4dCBlbnRyeSB0eXBlLCB0aGVuIGNvbnRpbmUKLSAgICBpZiAodGVzdEFzc2VydGlvbgotICAgICAgLmdldEVudHJ5VHlwZU5hbWUoKQotICAgICAgLmVxdWFscyh0YXJnZXRDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCkuZ2V0VHlwZU5hbWUoKSkpCi0gICAgewotICAgICAgbWF0Y2ggPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBtYXRjaDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbCNpc05vdEFwcGxpY2FibGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzTm90QXBwbGljYWJsZShUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24pCi0gIHsKLSAgICBib29sZWFuIG5vdEFwcGxpY2FibGUgPSBmYWxzZTsKLQotICAgIC8vIEFERDoKLQotICAgIHJldHVybiBub3RBcHBsaWNhYmxlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRTb2FwRmF1bHRzLgotICAgKiAKLSAgICogQHBhcmFtIGluQmluZGluZyBpbiBiaW5kaW5nLgotICAgKiBAcmV0dXJuIHNvYXAgZmF1bHRzLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciB3aGlsZSBwcm9jZXNzaW5nIGJpbmRpbmcgZmF1bHRzLgotICAgKi8KLSAgcHJvdGVjdGVkIFNPQVBGYXVsdFtdIGdldFNvYXBGYXVsdHMoQmluZGluZyBpbkJpbmRpbmcpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgVmVjdG9yIHNvYXBGYXVsdHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvLyBHbyB0aHJvdWdoIGVhY2ggYmluZGluZ0ZhdWx0IG9uZSBhdCBhIHRpbWUKLSAgICBCaW5kaW5nRmF1bHRbXSBiaW5kaW5nRmF1bHRzID0gZ2V0QWxsQmluZGluZ0ZhdWx0cyhpbkJpbmRpbmcpOwotICAgIGZvciAoaW50IGZhdWx0ID0gMDsgZmF1bHQgPCBiaW5kaW5nRmF1bHRzLmxlbmd0aDsgZmF1bHQrKykKLSAgICB7Ci0gICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gZ2V0U29hcEZhdWx0KGJpbmRpbmdGYXVsdHNbZmF1bHRdKTsKLSAgICAgIGlmIChzb2FwRmF1bHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc29hcEZhdWx0cy5hZGQoc29hcEZhdWx0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBTT0FQRmF1bHRbXSBzb2FwRmF1bHRBcnJheSA9IG5ldyBTT0FQRmF1bHRbc29hcEZhdWx0cy5zaXplKCldOwotICAgIHNvYXBGYXVsdHMuY29weUludG8oc29hcEZhdWx0QXJyYXkpOwotCi0gICAgcmV0dXJuIHNvYXBGYXVsdEFycmF5OwotICB9Ci0KLSAgLyoqCi0gICogTWV0aG9kIGdldEFsbEJpbmRpbmdGYXVsdHMuCi0gICogCi0gICogQHBhcmFtIGluQmluZGluZyBiaW5kaW5nLgotICAqIEByZXR1cm4gYWxsIGJpbmRpbmcgZmF1bHRzLgotICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGR1cmluZyBwcm9jZXNzaW5nLgotICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ0ZhdWx0W10gZ2V0QWxsQmluZGluZ0ZhdWx0cyhCaW5kaW5nIGluQmluZGluZykKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIFZlY3RvciBmYXVsdHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0KLSAgICAgIEl0ZXJhdG9yIGJpbmRpbmdPcGVyYXRpb25zID0gaW5CaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLQotICAgICAgd2hpbGUgKGJpbmRpbmdPcGVyYXRpb25zLmhhc05leHQoKSkKLSAgICAgIHsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm8gPSAoQmluZGluZ09wZXJhdGlvbikgYmluZGluZ09wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICAgIEl0ZXJhdG9yIGJpbmRpbmdGYXVsdHMgPSBiby5nZXRCaW5kaW5nRmF1bHRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAoYmluZGluZ0ZhdWx0cy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotCi0gICAgICAgICAgICBmYXVsdHMuYWRkKChCaW5kaW5nRmF1bHQpIGJpbmRpbmdGYXVsdHMubmV4dCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIG5vIGJpbmRpbmcgb3BlcmF0aW9ucyBpbiB0aGlzIGJpbmRpbmcgLSBpZ25vcmUgJiBjb250aW51ZQotICAgIH0KLQotICAgIEJpbmRpbmdGYXVsdFtdIGZhdWx0QXJyYXkgPSBuZXcgQmluZGluZ0ZhdWx0W2ZhdWx0cy5zaXplKCldOwotICAgIGZhdWx0cy5jb3B5SW50byhmYXVsdEFycmF5KTsKLQotICAgIHJldHVybiBmYXVsdEFycmF5OwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRXU0RMRmF1bHRzLgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmdGYXVsdCBhIGJpbmRpbmcgZmF1bHQuCi0gICAqIEByZXR1cm4gV1NETCBmYXVsdHMuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGR1cmluZyBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIFNPQVBGYXVsdCBnZXRTb2FwRmF1bHQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGZhdWx0RXh0ZW5zaWJsZXMgPQotICAgICAgICBiaW5kaW5nRmF1bHQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQotICAgICAgd2hpbGUgKGZhdWx0RXh0ZW5zaWJsZXMuaGFzTmV4dCgpICYmIHNvYXBGYXVsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHNvYXBGYXVsdCA9IChTT0FQRmF1bHQpIGZhdWx0RXh0ZW5zaWJsZXMubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkKLSAgICAgICAgeyAvLyBpZ25vcmUgZXZlcnl0aGluZyBidXQgU09BUCBGYXVsdCBlbGVtZW50cy4KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNvYXBGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0U29hcEhlYWRlci4KLSAgICogCi0gICAqIEBwYXJhbSBpbkJpbmRpbmcgYSBiaW5kaW5nLgotICAgKiBAcmV0dXJuIFNPQVAgaGVhZGVycy4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgZHVyaW5nIHByb2Nlc3NpbmcuCi0gICAqLwotICBwcm90ZWN0ZWQgU09BUEhlYWRlcltdIGdldFNvYXBIZWFkZXJzKEJpbmRpbmcgaW5CaW5kaW5nKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBHZXQgYWxsIGJpbmRpbmdzCi0gICAgQmluZGluZ1tdIGJpbmRpbmdMaXN0ID0gbmV3IEJpbmRpbmdbMV07Ci0gICAgYmluZGluZ0xpc3RbMF0gPSBpbkJpbmRpbmc7Ci0KLSAgICBWZWN0b3Igc29hcEhlYWRlckxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvLyBHbyB0aHJvdWdoIGVhY2ggYmluZGluZyBvbmUgYXQgYSB0aW1lCi0gICAgZm9yIChpbnQgYmluZGluZyA9IDA7IGJpbmRpbmcgPCBiaW5kaW5nTGlzdC5sZW5ndGg7IGJpbmRpbmcrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IG9mIGJpbmRpbmcgT3BlcmF0aW9ucwotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uW10gYmluZGluZ09wZXJhdGlvbnMgPQotICAgICAgICAgIChCaW5kaW5nT3BlcmF0aW9uW10pIGJpbmRpbmdMaXN0W2JpbmRpbmddCi0gICAgICAgICAgICAuZ2V0QmluZGluZ09wZXJhdGlvbnMoKQotICAgICAgICAgICAgLnRvQXJyYXkoCi0gICAgICAgICAgICBuZXcgQmluZGluZ09wZXJhdGlvblswXSk7Ci0KLSAgICAgICAgLy8gZ2V0IHJlZmVyZW5jZXMgdG8gdGhlIGV4dGVuc2libGUgZWxlbWVudHMgd2l0aGluIHRoZSA8aW5wdXQ+IGFuZCA8b3V0cHV0PiBlbGVtZW50cyBvZiB0aGlzIGJpbmRpbmcgPG9wZXJhdGlvbj4uIAotICAgICAgICBmb3IgKGludCBibyA9IDA7IGJvIDwgYmluZGluZ09wZXJhdGlvbnMubGVuZ3RoOyBibysrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGlucHV0L291dHB1dCBleHRlbnNpYmxlcywgbG9va2luZyBmb3IgPFNPQVA6Qm9keT4gZWxlbWVudHMuCi0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb25zW2JvXS5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9Ci0gICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb25zW2JvXS5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGV4dEVsZW1lbnRzID0KLSAgICAgICAgICAgICAgYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZXh0RWxlbWVudHMuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJMaXN0LmFkZCgoU09BUEhlYWRlcikgZXh0RWxlbWVudHMubmV4dCgpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgIHsgLy8gaWdub3JlIGV2ZXJ5dGhpbmcgYnV0IFNPQVAgSGVhZGVyLgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGV4dEVsZW1lbnRzID0gYmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGV4dEVsZW1lbnRzLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzb2FwSGVhZGVyTGlzdC5hZGQoKFNPQVBIZWFkZXIpIGV4dEVsZW1lbnRzLm5leHQoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICB7IC8vIGlnbm9yZSBldmVyeXRoaW5nIGJ1dCBTT0FQIEhlYWRlci4KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICB7IC8vIG5vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIDxpbnB1dD4gb3IgPG91dHB1dD4gLSBpZ25vcmUgOiBub3QgY2hlY2tpbmcgdGhpcyBoZXJlLgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIG5vIGJpbmRpbmcgb3BlcmF0aW9ucyBpbiB0aGlzIGJpbmRpbmcgLSBpZ25vcmUgJiBjb250aW51ZQotICAgICAgfQotICAgIH0KLQotICAgIFNPQVBIZWFkZXJbXSBzb2FwSGVhZGVyQXJyYXkgPSBuZXcgU09BUEhlYWRlcltzb2FwSGVhZGVyTGlzdC5zaXplKCldOwotICAgIHNvYXBIZWFkZXJMaXN0LmNvcHlJbnRvKHNvYXBIZWFkZXJBcnJheSk7Ci0KLSAgICByZXR1cm4gc29hcEhlYWRlckFycmF5OwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRTb2FwSGVhZGVyRmF1bHRzLgotICAgKiAKLSAgICogV1NETERvY3VtZW50IGdldHRlciBtZXRob2QgLSBtYXliZSBiZXR0ZXIgb2ZmIGluIGNsYXNzIFdTRExEb2N1bWVudC4uLgotICAgKiAKLSAgICogQHBhcmFtIGluQmluZGluZyBhIGJpbmRpbmcuCi0gICAqIEByZXR1cm4gU09BUCBoZWFkZXIgZmF1bHRzLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgcHJvY2Vzc2luZy4KLSAgICovCi0gIHByb3RlY3RlZCBTT0FQSGVhZGVyRmF1bHRbXSBnZXRTb2FwSGVhZGVyRmF1bHRzKEJpbmRpbmcgaW5CaW5kaW5nKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFZlY3RvciBzb2FwSGVhZGVyRmF1bHRMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgLy8gR2V0IHRoZSBsaXN0IG9mIFNPQVAgaGVhZGVycwotICAgIFNPQVBIZWFkZXJbXSBzb2FwSGVhZGVyQXJyYXkgPSBnZXRTb2FwSGVhZGVycyhpbkJpbmRpbmcpOwotCi0gICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBhbmQgZ2V0IHRoZSBoZWFkZXIgZmF1bHRzCi0gICAgTGlzdCBsaXN0ID0gbnVsbDsKLSAgICBmb3IgKGludCBoZWFkZXIgPSAwOyBoZWFkZXIgPCBzb2FwSGVhZGVyQXJyYXkubGVuZ3RoOyBoZWFkZXIrKykKLSAgICB7Ci0gICAgICAvLyBHZXQgbGlzdCBmb3IgdGhpcyBoZWFkZXIKLSAgICAgIGlmICgobGlzdCA9IHNvYXBIZWFkZXJBcnJheVtoZWFkZXJdLmdldFNPQVBIZWFkZXJGYXVsdHMoKSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gQWRkIHRvIHByaW1hcnkgbGlzdCAgICAgIAotICAgICAgICBzb2FwSGVhZGVyRmF1bHRMaXN0LmFkZEFsbChsaXN0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBTT0FQSGVhZGVyRmF1bHRbXSBzb2FwSGVhZGVyRmF1bHRBcnJheSA9Ci0gICAgICBuZXcgU09BUEhlYWRlckZhdWx0W3NvYXBIZWFkZXJGYXVsdExpc3Quc2l6ZSgpXTsKLSAgICBzb2FwSGVhZGVyRmF1bHRMaXN0LmNvcHlJbnRvKHNvYXBIZWFkZXJGYXVsdEFycmF5KTsKLQotICAgIHJldHVybiBzb2FwSGVhZGVyRmF1bHRBcnJheTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0U29hcEJvZGllcy4KLSAgICogCi0gICAqIFdTRExEb2N1bWVudCBnZXR0ZXIgbWV0aG9kIC0gbWF5YmUgYmV0dGVyIG9mZiBpbiBjbGFzcyBXU0RMRG9jdW1lbnQuLi4KLSAgICogCi0gICAqIEBwYXJhbSBpbkJpbmRpbmcgYSBiaW5kaW5nLgotICAgKiBAcmV0dXJuIFNPQVAgYm9kaWVzLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgcHJvY2Vzc2luZy4KLSAgICovCi0gIHByb3RlY3RlZCBTT0FQQm9keVtdIGdldFNvYXBCb2RpZXMoQmluZGluZyBpbkJpbmRpbmcpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFJFTU9WRTogR2V0IGFsbCBiaW5kaW5ncwotICAgIC8vQmluZGluZ1tdIGJpbmRpbmdMaXN0ID0gd3NkbERvY3VtZW50LmdldEJpbmRpbmdzKCk7Ci0gICAgQmluZGluZ1tdIGJpbmRpbmdMaXN0ID0gbmV3IEJpbmRpbmdbMV07Ci0gICAgYmluZGluZ0xpc3RbMF0gPSBpbkJpbmRpbmc7Ci0KLSAgICBWZWN0b3Igc29hcEJvZGllcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vIEdvIHRocm91Z2ggZWFjaCBiaW5kaW5nIG9uZSBhdCBhIHRpbWUKLSAgICBmb3IgKGludCBiaW5kaW5nID0gMDsgYmluZGluZyA8IGJpbmRpbmdMaXN0Lmxlbmd0aDsgYmluZGluZysrKQotICAgIHsKLSAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiBiaW5kaW5nIE9wZXJhdGlvbnMKLSAgICAgIEJpbmRpbmdPcGVyYXRpb25bXSBiaW5kaW5nT3BlcmF0aW9ucyA9Ci0gICAgICAgIChCaW5kaW5nT3BlcmF0aW9uW10pIGJpbmRpbmdMaXN0W2JpbmRpbmddCi0gICAgICAgICAgLmdldEJpbmRpbmdPcGVyYXRpb25zKCkKLSAgICAgICAgICAudG9BcnJheSgKLSAgICAgICAgICBuZXcgQmluZGluZ09wZXJhdGlvblswXSk7Ci0KLSAgICAgIC8vIGdldCByZWZlcmVuY2VzIHRvIHRoZSBleHRlbnNpYmxlIGVsZW1lbnRzIHdpdGhpbiB0aGUgPGlucHV0PiBhbmQgPG91dHB1dD4gZWxlbWVudHMgb2YgdGhpcyBiaW5kaW5nIDxvcGVyYXRpb24+LiAKLSAgICAgIGZvciAoaW50IGJvID0gMDsgYm8gPCBiaW5kaW5nT3BlcmF0aW9ucy5sZW5ndGg7IGJvKyspCi0gICAgICB7Ci0KLSAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBpbnB1dC9vdXRwdXQgZXh0ZW5zaWJsZXMsIGxvb2tpbmcgZm9yIDxTT0FQOkJvZHk+IGVsZW1lbnRzLgotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIGlucHV0RXh0ZW5zaWJsZXMgPQotICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbnNbYm9dCi0gICAgICAgICAgICAgIC5nZXRCaW5kaW5nSW5wdXQoKQotICAgICAgICAgICAgICAuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkKLSAgICAgICAgICAgICAgLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGlucHV0RXh0ZW5zaWJsZXMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzb2FwQm9kaWVzLmFkZCgoU09BUEJvZHkpIGlucHV0RXh0ZW5zaWJsZXMubmV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsgLy8gaWdub3JlIGV2ZXJ5dGhpbmcgYnV0IFNPQVAgQm9keSBlbGVtZW50cy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpCi0gICAgICAgIHsgLy8gbm8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBmb3IgPGlucHV0PiAtIGlnbm9yZSA6IG5vdCBjaGVja2luZyB0aGlzIGhlcmUuCi0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIG91dHB1dEV4dGVuc2libGVzID0KLSAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb25zW2JvXQotICAgICAgICAgICAgICAuZ2V0QmluZGluZ091dHB1dCgpCi0gICAgICAgICAgICAgIC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKQotICAgICAgICAgICAgICAuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAob3V0cHV0RXh0ZW5zaWJsZXMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzb2FwQm9kaWVzLmFkZCgoU09BUEJvZHkpIG91dHB1dEV4dGVuc2libGVzLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7IC8vIGlnbm9yZSBldmVyeXRoaW5nIGJ1dCBTT0FQIEJvZHkgZWxlbWVudHMuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQotICAgICAgICB7IC8vIG5vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIDxvdXRwdXQ+LgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgU09BUEJvZHlbXSBzb2FwQm9keUFycmF5ID0gbmV3IFNPQVBCb2R5W3NvYXBCb2RpZXMuc2l6ZSgpXTsKLSAgICBzb2FwQm9kaWVzLmNvcHlJbnRvKHNvYXBCb2R5QXJyYXkpOwotCi0gICAgcmV0dXJuIHNvYXBCb2R5QXJyYXk7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldFNvYXBCb2R5LgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmdJbnB1dCBhIEJpbmRpbmdJbnB1dCBvYmplY3QuCi0gICAqIEByZXR1cm4gIGJvZHkuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGR1cmluZyBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIFNPQVBCb2R5IGdldFNvYXBCb2R5KEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgU09BUEJvZHkgc29hcEJvZHkgPSBudWxsOwotCi0gICAgSXRlcmF0b3IgZXh0ZW5zaWJsZXMgPSBiaW5kaW5nSW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZXh0ZW5zaWJsZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE9iamVjdCBleHRlbnNpYmxlID0gZXh0ZW5zaWJsZXMubmV4dCgpOwotICAgICAgaWYgKGV4dGVuc2libGUgaW5zdGFuY2VvZiBTT0FQQm9keSkKLSAgICAgIHsKLSAgICAgICAgc29hcEJvZHkgPSAoU09BUEJvZHkpIGV4dGVuc2libGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc29hcEJvZHk7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldFNvYXBCb2R5LgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmdPdXRwdXQgYSBCaW5kaW5nT3V0cHV0IG9iamVjdC4KLSAgICogQHJldHVybiBTT0FQIGJvZHkuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGR1cmluZyBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIFNPQVBCb2R5IGdldFNvYXBCb2R5KEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gbnVsbDsKLQotICAgIEl0ZXJhdG9yIGV4dGVuc2libGVzID0gYmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChleHRlbnNpYmxlcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgT2JqZWN0IGV4dGVuc2libGUgPSBleHRlbnNpYmxlcy5uZXh0KCk7Ci0gICAgICBpZiAoZXh0ZW5zaWJsZSBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgewotICAgICAgICBzb2FwQm9keSA9IChTT0FQQm9keSkgZXh0ZW5zaWJsZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzb2FwQm9keTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc2NoZW1hIHVzZWQuCi0gICAqIEBwYXJhbSBkZWYgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiBTY2hlbWEgdXNlZC4KLSAgICogQHRocm93cyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGlmIHByb2JsZW0gZ2V0dGluZyBXU0RMIGRlZmludGlvbnMgCi0gICAqICAgICAgICAgbmFtZXNwYWNlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRTY2hlbWFVc2VkKERlZmluaXRpb24gZGVmKSB0aHJvd3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHNjaGVtYVVzZWQgPSAiIjsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIE5lZWQgdG8gcmVhZCB0aGUgZmlsZSBkaXJlY3RseSwgc2luY2UgV1NETDRKIGFsd2F5cyBwdXRzIGluIHRoZSBkZWZhdWx0IFdTREwgbmFtZXNwYWNlCi0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9IHBhcnNlWE1MRG9jdW1lbnRVUkwoZGVmLmdldERvY3VtZW50QmFzZVVSSSgpLCBudWxsKTsKLQotICAgICAgaWYgKGRvY3VtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCB0aGUgcm9vdCBlbGVtZW50Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgIC8vIEdldCB0aGUgbmFtZXNwYWNlIGZvciB0aGlzIGVsZW1lbnQKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICBzY2hlbWFVc2VkID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIHdlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJwcm9ibGVtIGdldHRpbmcgV1NETCBkZWZpbnRpb25zIG5hbWVzcGFjZSIpOwotICAgIH0KLQotICAgIC8qCi0gICAgLy8gR2V0IHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgIFN0cmluZyBzY2hlbWFVc2VkID0gZGVmLmdldE5hbWVzcGFjZSgiIik7Ci0gICAgCi0gICAgLy8gSWYgdGhlIGRlZmF1bHQgd2FzIHNldCwgdGhlbiBwcm9jZXNzIGl0IHRvIGdldCB0aGUgbmFtZXNwYWNlCi0gICAgaWYgKHNjaGVtYVVzZWQgPT0gbnVsbCkgewotICAgICAgLy8gZG8gaXQgdGhlIGhhcmQgd2F5IChzdGlsbCBiZXR0ZXIgdGhhbiBhbm90aGVyIERPTSBwYXJzZSkuLi4gCQkJCQotICAgICAgLy9XU0RMV3JpdGVyIHcgPSBuZXcgV1NETFdyaXRlckltcGwoKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIFdTRExXcml0ZXIgdyA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3V1NETFdyaXRlcigpOwotICAgICAgCURvY3VtZW50IGRvYyA9IHcuZ2V0RG9jdW1lbnQoZGVmKTsKLSAgICAgIAlFbGVtZW50IGUgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAJc2NoZW1hVXNlZCA9IGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICB9IAotICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIAl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigicHJvYmxlbSBnZXR0aW5nIFdTREwgZGVmaW50aW9ucyBuYW1lc3BhY2UiKTsKLSAgICAgIH0gCi0gICAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oInByb2JsZW0gZ2V0dGluZyBkb2N1bWVudCBkZWZpbnRpb24iKTsKLSAgICAgIH0gICAgICAJCi0gICAgfQotICAgICovCi0KLSAgICByZXR1cm4gc2NoZW1hVXNlZDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0U29hcEJpbmRpbmcuCi0gICAqIAotICAgKiBHZXQgdGhlIFNPQVAgYmluZGluZyBmb3IgYSBCaW5kaW5nLgotICAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nIGEgYmluZGluZy4KLSAgICogQHJldHVybiBhIFNPQVAgYmluZGluZy4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgZHVyaW5nIHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFNPQVBCaW5kaW5nIGdldFNvYXBCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSBudWxsOwotCi0gICAgLy8gR2V0IHRoZSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICBMaXN0IGV4RWxlbWVudHMgPSBiaW5kaW5nLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIGlmIChleEVsZW1lbnRzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBiaW5kaW5nLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgIC8vICBDaGVjayBmb3IgPHNvYXA6YmluZGluZz4gZWxlbWVudAotICAgICAgd2hpbGUgKChpdGVyYXRvci5oYXNOZXh0KCkpICYmIChzb2FwQmluZGluZyA9PSBudWxsKSkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBzb2FwQmluZGluZyA9IChTT0FQQmluZGluZykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkKLSAgICAgICAgeyAvLyBpZ25vcmUgZXZlcnl0aGluZyBidXQgU09BUCBCaW5kaW5nIGVsZW1lbnQKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzb2FwQmluZGluZzsKLSAgfQotCi0gIC8qKiAKLSAgICogQ3JlYXRlIFhNTCBzY2hlbWEgdmFsaWRhdG9yLiAgVGhpcyBpcyBkb25lIGhlcmUgYmVjYXVzZSBzb21lIGNvbXBpbGVycyBkbyBub3QgYWxsb3cKLSAgICogdGhlIGRvY3VtZW50TGlzdCBmaWVsZCB0byBiZSBhY2Nlc3NlZCBmcm9tIHdpdGhpbiBhbiBpbm5lciBjbGFzcy4KLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSB0aGUgYmFzZSBVUkwuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBYTUwgc2NoZW1hIHZhbGlkYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBYTUxTY2hlbWFWYWxpZGF0b3IgY3JlYXRlWE1MU2NoZW1hVmFsaWRhdG9yKFN0cmluZyBkb2N1bWVudEJhc2VVUkkpCi0gIHsKLSAgICAvLyBDcmVhdGUgWE1MIHNjaGVtYSB2YWxpZGF0b3IKLSAgICByZXR1cm4gbmV3IFhNTFNjaGVtYVZhbGlkYXRvcihkb2N1bWVudEJhc2VVUkksIGRvY3VtZW50TGlzdCk7Ci0gIH0KLQotICAvKioKLSAgICogU2VhcmNoIHhzZCBzY2hlbWEgb3IgeHNkIGltcG9ydCBmcm9tIG5vZGUuIElmIG5vZGUgaXMgeHNkIGltcG9ydCBpdCdzIGxvYWRpbmcgc2NoZW1hLgotICAgKiBAcGFyYW0gZGVmaW5pdGlvbiBhIERlZmluaXRpb24gb2JqZWN0LgotICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBzY2hlbWEgdGFyZ2V0IG5hbWVzcGFjZXMuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gZHVyaW5nIHByb2Nlc3NpbmcgbWV0aG9kLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlTGlzdChEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgTGlzdCBsaXN0ID0gbnVsbCwgbmV4dExpc3QgPSBudWxsOwotCi0gICAgLy8gR2V0IGxpc3Qgb2YgZXh0ZW5zaW9uIGVsZW1lbnRzIHdpdGhpbiB0aGUgdHlwZXMgZWxlbWVudAotICAgIFR5cGVzIHR5cGVzID0gbnVsbDsKLSAgICBpZiAoKHR5cGVzID0gZGVmaW5pdGlvbi5nZXRUeXBlcygpKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCA9IG51bGw7Ci0gICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICAvLyBHZXQgbmV4dCBleHQuIGVsZW1lbnQKLSAgICAgICAgZXh0RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIHVua25vd24gZXh0LiBlbGVtZW50LCB0aGVuIHNlZSBpZiBpdCBpcyBhIHNjaGVtYSBlbGVtZW50Ci0gICAgICAgIFRhcmdldE5hbWVzcGFjZVByb2Nlc3NvciB0bnNQcm9jZXNzb3IgPSBudWxsOwotICAgICAgICBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIHRuc1Byb2Nlc3NvciA9Ci0gICAgICAgICAgICBuZXcgVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yKAotICAgICAgICAgICAgICBkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpLAotICAgICAgICAgICAgICBkb2N1bWVudExpc3QpOwotCi0gICAgICAgICAgaWYgKChuZXh0TGlzdCA9Ci0gICAgICAgICAgICB0bnNQcm9jZXNzb3IucHJvY2Vzc0FsbFNjaGVtYSgKLSAgICAgICAgICAgICAgKChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1lbnQpLmdldEVsZW1lbnQoKSkpCi0gICAgICAgICAgICAhPSBudWxsKQotICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkKLSAgICAgICAgICAgICAgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICBsaXN0LmFkZEFsbChuZXh0TGlzdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotIC8qKgotICAgKiBTZWFyY2ggeHNkIHNjaGVtYSBvciB4c2QgaW1wb3J0IGZyb20gbm9kZS4gSWYgbm9kZSBpcyB4c2QgaW1wb3J0IGl0J3MgbG9hZGluZyBzY2hlbWEuCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uIGEgRGVmaW5pdGlvbiBvYmplY3QuCi0gICAqIEByZXR1cm4gYSBsaXN0IG9mIHNjaGVtYSB0YXJnZXQgbmFtZXNwYWNlcy4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSBkdXJpbmcgcHJvY2Vzc2luZyBtZXRob2QuCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCBnZXRTY2hlbWFOYW1lc3BhY2VMaXN0KERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgLy8gQWx3YXlzIGFkZCBjdXJyZW50IGRvY3VtZW50IHRhcmdldE5hbWVzcGFjZQotICAgIExpc3QgdGFyZ2V0TmFtZXNwYWNlTGlzdCA9IGdldFNjaGVtYVRhcmdldE5hbWVzcGFjZUxpc3QoZGVmaW5pdGlvbik7Ci0gICAgCi0gICAgaWYgKCh0YXJnZXROYW1lc3BhY2VMaXN0ICE9IG51bGwpICYmICF0YXJnZXROYW1lc3BhY2VMaXN0LmlzRW1wdHkoKSkKLSAgICAgIGxpc3QuYWRkQWxsKHRhcmdldE5hbWVzcGFjZUxpc3QpOwotICAgIAotICAgIC8vIEdldCBsaXN0IG9mIGltcG9ydGVkIFdTREwgZG9jdW1lbnRzCi0gICAgTWFwIGltcG9ydE1hcCA9IGRlZmluaXRpb24uZ2V0SW1wb3J0cygpOwotCi0gICAgSW1wb3J0IGltcDsKLQotICAgIC8vIEFkZCBlYWNoIGltcG9ydHMgdGFyZ2V0TmFtZXNwYWNlIHRvIHRoZSBsaXN0Ci0gICAgaWYgKGltcG9ydE1hcCAhPSBudWxsICYmICFpbXBvcnRNYXAuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIHZhbHVlcyA9IGltcG9ydE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgTGlzdCBpbXBvcnRMaXN0OwotICAgICAgd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIGltcG9ydExpc3QgPSAoTGlzdCkgdmFsdWVzLm5leHQoKTsKLSAgICAgICAgSXRlcmF0b3IgaW1wb3J0cyA9IGltcG9ydExpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGltcG9ydHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaW1wID0gKEltcG9ydCkgaW1wb3J0cy5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGltcCAhPSBudWxsICYmIGltcC5nZXREZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAJbGlzdC5hZGRBbGwoZ2V0U2NoZW1hTmFtZXNwYWNlTGlzdChpbXAuZ2V0RGVmaW5pdGlvbigpKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBCdWlsZCBsaXN0IG9mIFdTREwgdGFyZ2V0TmFtZXNwYWNlcy4KLSAgICogQHBhcmFtIGRlZmluaXRpb24gYSBEZWZpbml0aW9uIG9iamVjdC4KLSAgICogQHJldHVybiBsaXN0IG9mIFdTREwgdGFyZ2V0TmFtZXNwYWNlcy4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IGdldFdTRExUYXJnZXROYW1lc3BhY2VMaXN0KERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vIEFsd2F5cyBhZGQgY3VycmVudCBkb2N1bWVudCB0YXJnZXROYW1lc3BhY2UKLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgbGlzdC5hZGQoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0KLSAgICAvLyBHZXQgbGlzdCBvZiBpbXBvcnRlZCBXU0RMIGRvY3VtZW50cwotICAgIE1hcCBpbXBvcnRNYXAgPSBkZWZpbml0aW9uLmdldEltcG9ydHMoKTsKLQotICAgIEltcG9ydCBpbXA7Ci0KLSAgICAvLyBBZGQgZWFjaCBpbXBvcnRzIHRhcmdldE5hbWVzcGFjZSB0byB0aGUgbGlzdAotICAgIGlmIChpbXBvcnRNYXAgIT0gbnVsbCAmJiAhaW1wb3J0TWFwLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBJdGVyYXRvciB2YWx1ZXMgPSBpbXBvcnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIExpc3QgaW1wb3J0TGlzdDsKLSAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBpbXBvcnRMaXN0ID0gKExpc3QpIHZhbHVlcy5uZXh0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGltcG9ydHMgPSBpbXBvcnRMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbXBvcnRzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGltcCA9IChJbXBvcnQpIGltcG9ydHMubmV4dCgpOwotICAgICAgICAgIGlmIChpbXAgIT0gbnVsbCAmJiBpbXAuZ2V0RGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgbGlzdC5hZGRBbGwoZ2V0V1NETFRhcmdldE5hbWVzcGFjZUxpc3QoaW1wLmdldERlZmluaXRpb24oKSkpOwotICAgICAgICAgICAgLy8gbGlzdC5hZGQoaW1wLmdldERlZmluaXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBCaW5kaW5nTWF0Y2gKLSAgewotICAgIHByaXZhdGUgQmluZGluZyBiaW5kaW5nOwotICAgIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uOwotICAgIHByaXZhdGUgU09BUEJpbmRpbmcgc29hcEJpbmRpbmc7Ci0gICAgLy9wcml2YXRlIFZlY3RvciBiaW5kaW5nQXJnczsgLy8gc2V0IG9mIEJpbmRpbmdJbnB1dHMgYW5kIEJpbmRpbmdPdXRwdXRzCi0gICAgcHJpdmF0ZSBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0OwotICAgIHByaXZhdGUgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0OwotCi0gICAgLy8gQUREOiBuZWVkIHRvIGluY2x1ZGUgQmluZGluZ0ZhdWx0IHN1cHBvcnQuLi4KLSAgICBwdWJsaWMgQmluZGluZ01hdGNoKAotICAgICAgQmluZGluZyBiLAotICAgICAgQmluZGluZ09wZXJhdGlvbiBibywKLSAgICAgIFNPQVBCaW5kaW5nIHNiLAotICAgICAgQmluZGluZ0lucHV0IGJpbiwKLSAgICAgIEJpbmRpbmdPdXRwdXQgYm91dCkKLSAgICB7Ci0gICAgICBiaW5kaW5nID0gYjsKLSAgICAgIGJpbmRpbmdPcGVyYXRpb24gPSBibzsKLSAgICAgIHNvYXBCaW5kaW5nID0gc2I7Ci0gICAgICAvL2JpbmRpbmdBcmdzID0gbmV3IFZlY3RvcigpOwotICAgICAgLy9pZiAoYmluICAhPSBudWxsKSB7IGJpbmRpbmdBcmdzLmFkZChiaW4pOyAgfQotICAgICAgLy9pZiAoYm91dCAhPSBudWxsKSB7IGJpbmRpbmdBcmdzLmFkZChib3V0KTsgfQotICAgICAgYmluZGluZ0lucHV0ID0gYmluOwotICAgICAgYmluZGluZ091dHB1dCA9IGJvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIEJpbmRpbmdNYXRjaCgKLSAgICAgIEJpbmRpbmcgYiwKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm8sCi0gICAgICBTT0FQQmluZGluZyBzYiwKLSAgICAgIEJpbmRpbmdJbnB1dCBiaW4pCi0gICAgewotICAgICAgdGhpcyhiLCBibywgc2IsIGJpbiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJpbmRpbmdNYXRjaCgKLSAgICAgIEJpbmRpbmcgYiwKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm8sCi0gICAgICBTT0FQQmluZGluZyBzYiwKLSAgICAgIEJpbmRpbmdPdXRwdXQgYm91dCkKLSAgICB7Ci0gICAgICB0aGlzKGIsIGJvLCBzYiwgbnVsbCwgYm91dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc29hcEJpbmRpbmcuCi0gICAgICogQHJldHVybiBTT0FQQmluZGluZwotICAgICAqLwotICAgIHB1YmxpYyBTT0FQQmluZGluZyBnZXRTb2FwQmluZGluZygpCi0gICAgewotICAgICAgcmV0dXJuIHNvYXBCaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJpbmRpbmdPcGVyYXRpb24uCi0gICAgICogQHJldHVybiBCaW5kaW5nT3BlcmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmluZGluZ0lucHV0LgotICAgICAqIEByZXR1cm4gQmluZGluZ0lucHV0Ci0gICAgICovCi0gICAgcHVibGljIEJpbmRpbmdJbnB1dCBnZXRCaW5kaW5nSW5wdXQoKQotICAgIHsKLSAgICAgIHJldHVybiBiaW5kaW5nSW5wdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmluZGluZ091dHB1dC4KLSAgICAgKiBAcmV0dXJuIEJpbmRpbmdPdXRwdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgQmluZGluZ091dHB1dCBnZXRCaW5kaW5nT3V0cHV0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmluZGluZ091dHB1dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNCaW5kaW5nSW5wdXQoKQotICAgIHsKLSAgICAgIHJldHVybiAodGhpcy5iaW5kaW5nSW5wdXQgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQmluZGluZ091dHB1dCgpCi0gICAgewotICAgICAgcmV0dXJuICh0aGlzLmJpbmRpbmdPdXRwdXQgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmluZGluZy4KLSAgICAgKiBAcmV0dXJuIEJpbmRpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYmluZGluZyBtYXRjaGVzLgotICAqIEBwYXJhbSBiaW5kaW5nIGEgYmluZGluZy4KLSAgKiBAcGFyYW0gc29hcEJpbmRpbmdTdHlsZSBzb2FwIGJpbmRpbmcgc3R5bGUuCi0gICogQHBhcmFtIHNvYXBCb2R5VXNlIHNvYXAgYm9keSB1c2UuCi0gICogQHJldHVybiBiaW5kaW5nIG1hdGNoZXMuCi0gICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgZHVyaW5nIHByb2Nlc3NpbmcuCi0gICovCi0gIHB1YmxpYyBCaW5kaW5nTWF0Y2hbXSBnZXRCaW5kaW5nTWF0Y2hlcygKLSAgICBCaW5kaW5nIGJpbmRpbmcsCi0gICAgU3RyaW5nIHNvYXBCaW5kaW5nU3R5bGUsCi0gICAgU3RyaW5nIHNvYXBCb2R5VXNlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgVmVjdG9yIGJpbmRpbmdNYXRjaGVzID0gbmV3IFZlY3RvcigpOwotCi0gICAgLy8gQ2hlY2sgYmluZGluZwotICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gZ2V0U29hcEJpbmRpbmcoYmluZGluZyk7Ci0KLSAgICAvLyBjaGVjayB0aGF0IHRoZSBzb2FwOmJpbmRpbmcgZm9yIHRoaXMgV1NETCBiaW5kaW5nIGlzIHRoZSBzcGVjaWZpZWQgc3R5bGUKLSAgICAvLyBBREQ6IGNoZWNrIGZvciBudWxsIHBvaW50ZXIKLSAgICBpZiAoc29hcEJpbmRpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZGVmYXVsdFN0eWxlID0gc29hcEJpbmRpbmcuZ2V0U3R5bGUoKTsKLQotICAgICAgaWYgKGRlZmF1bHRTdHlsZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBkZWZhdWx0U3R5bGUgPSBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DOwotICAgICAgfQotCi0gICAgICAvLyBHZXQgdGhlIHNldCBvZiBvcGVyYXRpb25zIGZvciB0aGlzIFdTREwgYmluZGluZwotICAgICAgTGlzdCBiaW5kaW5nT3BzTGlzdCA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLSAgICAgIGlmIChiaW5kaW5nT3BzTGlzdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBiaW5kaW5nT3BzID0gYmluZGluZ09wc0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgLy8gZm9yIGVhY2ggYmluZGluZyBvcGVyYXRpb246Ci0gICAgICAgIHdoaWxlIChiaW5kaW5nT3BzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wID0gKEJpbmRpbmdPcGVyYXRpb24pIGJpbmRpbmdPcHMubmV4dCgpOwotCi0gICAgICAgICAgU09BUE9wZXJhdGlvbiBzb2FwT3AgPSBnZXRTb2FwT3BlcmF0aW9uKGJpbmRpbmdPcCk7Ci0KLSAgICAgICAgICBpZiAoKHNvYXBPcCA9PSBudWxsICYmIGRlZmF1bHRTdHlsZS5lcXVhbHMoc29hcEJpbmRpbmdTdHlsZSkpCi0gICAgICAgICAgICB8fCAoc29hcE9wICE9IG51bGwKLSAgICAgICAgICAgICAgJiYgc29hcE9wLmdldFN0eWxlKCkgPT0gbnVsbAotICAgICAgICAgICAgICAmJiBkZWZhdWx0U3R5bGUuZXF1YWxzKHNvYXBCaW5kaW5nU3R5bGUpKQotICAgICAgICAgICAgfHwgKHNvYXBPcCAhPSBudWxsCi0gICAgICAgICAgICAgICYmIHNvYXBPcC5nZXRTdHlsZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgJiYgc29hcE9wLmdldFN0eWxlKCkuZXF1YWxzKHNvYXBCaW5kaW5nU3R5bGUpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjaGVjayBiaW5kaW5nIGlucHV0ICYgb3V0cHV0Ci0gICAgICAgICAgICBCaW5kaW5nSW5wdXQgYklucHV0ID0gYmluZGluZ09wLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGJJbnB1dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTT0FQQm9keSBpbnB1dFNvYXBCb2R5ID0gZ2V0U29hcEJvZHkoYklucHV0KTsKLSAgICAgICAgICAgICAgaWYgKGlucHV0U29hcEJvZHkgPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8IChpbnB1dFNvYXBCb2R5LmdldFVzZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICYmICFpbnB1dFNvYXBCb2R5LmdldFVzZSgpLmVxdWFscyhzb2FwQm9keVVzZSkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYklucHV0ID0gbnVsbDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCaW5kaW5nT3V0cHV0IGJPdXRwdXQgPSBiaW5kaW5nT3AuZ2V0QmluZGluZ091dHB1dCgpOwotICAgICAgICAgICAgaWYgKGJPdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU09BUEJvZHkgb3V0cHV0U29hcEJvZHkgPSBnZXRTb2FwQm9keShiT3V0cHV0KTsKLQotICAgICAgICAgICAgICBpZiAob3V0cHV0U29hcEJvZHkgPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8IChvdXRwdXRTb2FwQm9keS5nZXRVc2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAmJiAhb3V0cHV0U29hcEJvZHkuZ2V0VXNlKCkuZXF1YWxzKHNvYXBCb2R5VXNlKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiT3V0cHV0ID0gbnVsbDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKGJPdXRwdXQgIT0gbnVsbCkgfHwgKGJJbnB1dCAhPSBudWxsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIG1hdGNoLCBhZGQgdG8gdGhlIHZlY3RvcgotICAgICAgICAgICAgICBiaW5kaW5nTWF0Y2hlcy5hZGQoCi0gICAgICAgICAgICAgICAgbmV3IEJpbmRpbmdNYXRjaCgKLSAgICAgICAgICAgICAgICAgIGJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICBiaW5kaW5nT3AsCi0gICAgICAgICAgICAgICAgICBzb2FwQmluZGluZywKLSAgICAgICAgICAgICAgICAgIGJJbnB1dCwKLSAgICAgICAgICAgICAgICAgIGJPdXRwdXQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBCaW5kaW5nTWF0Y2hbXSBCaW5kaW5nTWF0Y2hBcnJheSA9IG5ldyBCaW5kaW5nTWF0Y2hbYmluZGluZ01hdGNoZXMuc2l6ZSgpXTsKLSAgICBiaW5kaW5nTWF0Y2hlcy5jb3B5SW50byhCaW5kaW5nTWF0Y2hBcnJheSk7Ci0gICAgcmV0dXJuIEJpbmRpbmdNYXRjaEFycmF5OwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRTb2FwT3BlcmF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gYmluZGluZ09wZXJhdGlvbiBhIGJpbmRpbmcgb3BlcmF0aW9uLgotICAgKiBAcmV0dXJuIGEgc29hcCBvcGVyYXRpb24uCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIHdoaWxlIHByb2Nlc3NpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFNPQVBPcGVyYXRpb24gZ2V0U29hcE9wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEl0ZXJhdG9yIGV4dGVuc2libGVzID0KLSAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZXh0ZW5zaWJsZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE9iamVjdCBleHRlbnNpYmxlID0gZXh0ZW5zaWJsZXMubmV4dCgpOwotICAgICAgaWYgKGV4dGVuc2libGUgaW5zdGFuY2VvZiBTT0FQT3BlcmF0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gKFNPQVBPcGVyYXRpb24pIGV4dGVuc2libGU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogCi0gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgU09BUE9wZXJhdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgd3NkbDpiaW5kaW5nIHN1cHBsaWVkLgotICAgKi8KLSAgcHJvdGVjdGVkIEhhc2hNYXAgZ2V0U29hcE9wZXJhdGlvbnMoQmluZGluZyBiaW5kaW5nKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBIYXNoTWFwIHNvYXBPcGVyYXRpb25MaXN0ID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIGlmIChiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvL1ZlY3RvciBzb2FwT3BWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgYmluZGluZyBvcGVyYXRpb25zCi0gICAgSXRlcmF0b3Igb3BlcmF0aW9ucyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotCi0gICAgLy8gQ2hlY2sgZWFjaCBiaW5kaW5nIG9wZXJhdGlvbiB0byBzZWUgaWYgaXQgaGFzIGEgc29hcCBvcGVyYXRpb24gZWxlbWVudAotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IG51bGw7Ci0gICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICBJdGVyYXRvciBleHRlbnNpYmxlcyA9Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChleHRlbnNpYmxlcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBleHRlbnNpYmxlID0gZXh0ZW5zaWJsZXMubmV4dCgpOwotICAgICAgICBpZiAoZXh0ZW5zaWJsZSBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBzb2FwT3BlcmF0aW9uTGlzdC5wdXQoZXh0ZW5zaWJsZSwgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy9yZXR1cm4gKFNPQVBPcGVyYXRpb25bXSlzb2FwT3BWZWN0b3IudG9BcnJheShuZXcgU09BUE9wZXJhdGlvbltdIHt9KTsKLSAgICByZXR1cm4gc29hcE9wZXJhdGlvbkxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgcGFydCBhdHRyaWJ1dGVzLgotICAgKiBAcGFyYW0gYmluZGluZ01hdGNoIGFuIGFycmF5IG9mIEJpbmRpbmdNYXRjaCBvYmplY3RzLgotICAgKiBAcGFyYW0gaW5Pck91dCBhIFN0cmluZyBvYmplY3QuCi0gICAqIEBwYXJhbSBhdHRyaWIgYXR0cmlidXRlLgotICAgKiBAcmV0dXJuIGEgYm9vbGVhbi4KLSAgICogQHRocm93cyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGlmIHRoZSBwYXJ0IGlzIG5vdCBjb21wbGlhbnQuCi0gICAqLwotICAvLyBHVCAtIHJld29yayB0aGlzIG1ldGhvZCB3aXRoIGEgYmV0dGVyIHdheSBvZiBwYXJhbWV0ZXJpemluZyB0aGUgZ2V0dGVycyByZXF1aXJlZCBmb3IgdGhlIGludm9jYXRpb24uCi0gIHByb3RlY3RlZCBib29sZWFuIGNoZWNrUGFydEF0dHJpYnV0ZXMoCi0gICAgQmluZGluZ01hdGNoW10gYmluZGluZ01hdGNoLAotICAgIFN0cmluZyBpbk9yT3V0LAotICAgIFN0cmluZyBhdHRyaWIpCi0gICAgdGhyb3dzIEFzc2VydGlvbkZhaWxFeGNlcHRpb24KLSAgewotCi0gICAgaWYgKCEoaW5Pck91dC5lcXVhbHMoInVzZUlucHV0IikgfHwgaW5Pck91dC5lcXVhbHMoInVzZU91dHB1dCIpKQotICAgICAgfHwgIShhdHRyaWIuZXF1YWxzKCJ1c2VUeXBlIikgfHwgYXR0cmliLmVxdWFscygidXNlRWxlbWVudCIpKSkKLSAgICB7Ci0gICAgICAvLyBpbnZhbGlkIGFyZ3VtZW50IHZhbHVlIHN1cHBsaWVkIGJ5IGNhbGxpbmcgbWV0aG9kIC0gImludGVybmFsIGVycm9yIgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ01hdGNoLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEJpbmRpbmdNYXRjaCBuZXh0TWF0Y2ggPSBiaW5kaW5nTWF0Y2hbaV07Ci0KLSAgICAgIC8vIGNoZWNrIHRoZSBhc3NvY2lhdGVkIHBhcnRzCi0gICAgICBNZXNzYWdlIG1zZzsKLSAgICAgIE1hcCBwYXJ0czsKLSAgICAgIEl0ZXJhdG9yIHBhcnRJdGVyYXRpb247Ci0KLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wID0gbmV4dE1hdGNoLmdldEJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgIGlmIChiaW5kaW5nT3AgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7IC8vIG5vIEJpbmRpbmcgT3BlcmF0aW9uIGZvciBzb21lIHJlYXNvbgotICAgICAgfQotCi0gICAgICBPcGVyYXRpb24gb3AgPSBiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgICAgIC8qCUFERDogaGFuZGxlIHNvYXA6ZmF1bHRzIGluIHNpbWlsYXIgd2F5CSAgIAkJCi0gICAgICB0cnkgewotICAgICAgLy8gY2hlY2sgZmF1bHRzIC0gcmVtYXJrYWJseSBzaW1pbGFyLi4uLiAobmVlZCB0byByZXRhaW4gb3BlcmF0aW9uIGlkIGZvciBmYWlsdXJlZGV0YWlsIG1zZykKLSAgICAgIAlpZiAobmV4dE1hdGNoLmhhc0JpbmRpbmdGYXVsdCgpKSB7Ci0gICAgICAJCQkJCi0gICAgICAJCW1zZyA9IG9wLmdldEZhdWx0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgCQlwYXJ0cyA9IG1zZy5nZXRQYXJ0cygpOwotICAgICAgCQkJCSAgICAJCQkJCSAgICAgCQkJCi0gICAgICAJCS8vY2hlY2sgdGhhdCBlYWNoIHBhcnQgaGFzIGFuIGVsZW1lbnQgYXR0cmlidXRlICAgIAkJCQotICAgICAgCQlwYXJ0SXRlcmF0aW9uID0gcGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIAkJd2hpbGUgKHBhcnRJdGVyYXRpb24uaGFzTmV4dCgpKSB7Ci0gICAgICAJCQlQYXJ0IHBhcnQgPSAoUGFydClwYXJ0SXRlcmF0aW9uLm5leHQoKTsKLSAgICAgIAkJCWlmIChwYXJ0LmdldEVsZW1lbnROYW1lKCkgPT0gbnVsbCkgewotICAgICAgCQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJPUEVSQVRJT046ICIgKyBvcCArICJNRVNTQUdFOiAiICsgbXNnKTsKLSAgICAgIAkJCX0KLSAgICAgIAkJfQkgCQkJCi0gICAgICAJfQotICAgICAgfQotICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG4pIHsKLSAgICAgIAkvLyBubyBwYXJ0cyBmb3VuZCAtIHRoaXMgcXVhbGlmaWVzIGFuIGFzc2VydGlvbiBmYWlsdXJlCi0gICAgICAJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24obi5nZXRNZXNzYWdlKCkpOwotICAgICAgfQotICAgICAgKi8KLQotICAgICAgdHJ5Ci0gICAgICB7Ci0KLSAgICAgICAgUU5hbWUgYXR0cmlidXRlTmFtZTsKLQotICAgICAgICAvL0dUOiBEbyB3ZSBuZWVkIHRvIGNoZWNrIEJpbmRpbmdJbnB1dCAvIE91dHB1dCBoZXJlID8/Ci0KLSAgICAgICAgaWYgKGluT3JPdXQuZXF1YWxzKCJ1c2VJbnB1dCIpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG9wLmdldElucHV0KCkgPT0gbnVsbCB8fCAhbmV4dE1hdGNoLmhhc0JpbmRpbmdJbnB1dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5vIElucHV0IHNvIG5vdGhpbmcgdG8gY2hlY2sKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIG1zZyA9IG9wLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7IC8vIExvb2tpbmcgZm9yIE91dHB1dAotICAgICAgICAgIGlmIChvcC5nZXRPdXRwdXQoKSA9PSBudWxsIHx8ICFuZXh0TWF0Y2guaGFzQmluZGluZ091dHB1dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5vIE91dHB1dCBzbyBub3RoaW5nIHRvIGNoZWNrCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtc2cgPSBvcC5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobXNnID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250aW51ZTsgLy8gbm90aGluZyB0byBjaGVjayBmcm9tIHRoaXMgQmluZGluZyBNYXRjaCAoPykKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBwYXJ0cyAKLSAgICAgICAgcGFydHMgPSBtc2cuZ2V0UGFydHMoKTsKLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHBhcnRzIGF0dHJpYnV0ZSwgdGhlbiBvbmx5IHByb2Nlc3MgdGhvc2UgcGFydHMKLSAgICAgICAgTGlzdCBwYXJ0c05hbWVMaXN0ID0gbnVsbDsKLSAgICAgICAgaWYgKChwYXJ0c05hbWVMaXN0ID0gZ2V0UGFydHNMaXN0KG5leHRNYXRjaCwgaW5Pck91dCkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBWZWN0b3IgcGFydHNMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgIEl0ZXJhdG9yIHBhcnRzTmFtZUl0ZXJhdG9yID0gcGFydHNOYW1lTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChwYXJ0c05hbWVJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFydHNMaXN0LmFkZChwYXJ0cy5nZXQoKFN0cmluZykgcGFydHNOYW1lSXRlcmF0b3IubmV4dCgpKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHBhcnRJdGVyYXRpb24gPSBwYXJ0c0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE90aGVyd2lzZSB1c2UgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgcGFydHMKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcGFydEl0ZXJhdGlvbiA9IHBhcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2NoZWNrIHRoYXQgZWFjaCBwYXJ0IGhhcyBhbiBlbGVtZW50IG9yIHR5cGUgYXR0cmlidXRlICAgIAkJCQotICAgICAgICB3aGlsZSAocGFydEl0ZXJhdGlvbi5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgcGFydEl0ZXJhdGlvbi5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGF0dHJpYi5lcXVhbHMoInVzZUVsZW1lbnQiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gcGFydC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgeyAvLyAidXNlVHlwZSIKLSAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBwYXJ0LmdldFR5cGVOYW1lKCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgIk5hbWUgb2Ygb3BlcmF0aW9uIHRoYXQgZmFpbGVkOiAiCi0gICAgICAgICAgICAgICAgKyBvcC5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICArICJcbiIKLSAgICAgICAgICAgICAgICArIG9wLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICJcbiIKLSAgICAgICAgICAgICAgICArICJcbk5hbWUgb2YgbWVzc2FnZSB0aGF0IGZhaWxlZDogIgotICAgICAgICAgICAgICAgICsgbXNnLmdldFFOYW1lKCkKLSAgICAgICAgICAgICAgICArICJcbiIKLSAgICAgICAgICAgICAgICArIG1zZy50b1N0cmluZygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBuKQotICAgICAgewotICAgICAgICAvLyBubyBwYXJ0cyBmb3VuZCAtIHRoaXMgcXVhbGlmaWVzIGFuIGFzc2VydGlvbiBmYWlsdXJlCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKG4udG9TdHJpbmcoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOyAvLyB0ZXN0cyBzdWNjZXNzZnVsCi0gIH0KLQotICAvKioKLSAgICogR2V0IHBhcnRzIGxpc3QgZnJvbSBhIHNvYXBiaW5kOmJvZHkgZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBnZXRQYXJ0c0xpc3QoQmluZGluZ01hdGNoIGJpbmRpbmdNYXRjaCwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBMaXN0IHBhcnRzTGlzdCA9IG51bGw7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBudWxsOwotCi0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3A7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIGJpbmRpbmcgb3BlcmF0aW9uCi0gICAgICBiaW5kaW5nT3AgPSBiaW5kaW5nTWF0Y2guZ2V0QmluZGluZ09wZXJhdGlvbigpOwotCi0gICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGJpbmRpbmcgb3BlcmF0aW9uIGNvbnRhaW5zIGEgc29hcGJpbmQ6Ym9keSB3aXRoIGEgcGFydHMgYXR0cmlidXRlCi0gICAgICBpZiAodHlwZS5lcXVhbHMoInVzZUlucHV0IikpCi0gICAgICB7Ci0gICAgICAgIGl0ZXJhdG9yID0KLSAgICAgICAgICBiaW5kaW5nT3AuZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaXRlcmF0b3IgPQotICAgICAgICAgIGJpbmRpbmdPcC5nZXRCaW5kaW5nT3V0cHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAvLyBlaXRoZXIgbm8gYmluZGluZyBvcGVyYXRpb24sIGJpbmRpbmcgaW5wdXQvb3V0cHV0LCBvciBTT0FQIGVsZW1lbnQKLSAgICB9Ci0KLSAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGJpbmRpbmcgb3BlcmF0aW9uIGNvbnRhaW5zIGEgc29hcGJpbmQ6Ym9keSB3aXRoIGEgcGFydHMgYXR0cmlidXRlCi0gICAgd2hpbGUgKChpdGVyYXRvci5oYXNOZXh0KCkpICYmIChwYXJ0c0xpc3QgPT0gbnVsbCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gKFNPQVBCb2R5KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIHBhcnRzTGlzdCA9IHNvYXBCb2R5LmdldFBhcnRzKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkKLSAgICAgIHsgLy8gbm90IGEgU09BUEJvZHkgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IHNvIGlnbm9yZQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBwYXJ0c0xpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGVsZW1lbnQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgV1NETCBkb2N1bWVudC4KLSAgICogQHBhcmFtIHdzZGxFbGVtZW50IFdTREwgZWxlbWVudC4KLSAgICogQHJldHVybiBlbGVtZW50IGxvY2F0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIEVsZW1lbnRMb2NhdGlvbiBnZXRFbGVtZW50TG9jYXRpb24oCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCwKLSAgICBPYmplY3Qgd3NkbEVsZW1lbnQpCi0gIHsKLSAgICBFbGVtZW50TG9jYXRpb24gZWxlbWVudExvY2F0aW9uID0gbnVsbDsKLSAgICBXU0RMRWxlbWVudExpc3Qgd3NkbEVsZW1lbnRMaXN0OwotCi0gICAgaWYgKCh3c2RsRWxlbWVudExpc3QgPSB3c2RsRG9jdW1lbnQuZ2V0RWxlbWVudExpc3QoKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbGVtZW50TG9jYXRpb24gPSB3c2RsRWxlbWVudExpc3QuZ2V0RWxlbWVudExvY2F0aW9uKHdzZGxFbGVtZW50KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZWxlbWVudExvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBmYWlsdXJlIGRldGFpbC4KLSAgICogQHBhcmFtIG1lc3NhZ2UgYSBtZXNzYWdlLgotICAgKiBAcGFyYW0gZW50cnlDb250ZXh0IGVudHJ5IGNvbnRleHQuCi0gICAqIEByZXR1cm4gZmFpbHVyZSBkZXRhaWwuCi0gICAqLwotICBwcm90ZWN0ZWQgRmFpbHVyZURldGFpbCBjcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgIG1lc3NhZ2UsCi0gICAgICBlbnRyeUNvbnRleHQsCi0gICAgICBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgZmFpbHVyZSBkZXRhaWwuCi0gICAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZS4KLSAgICogQHBhcmFtIGVudHJ5Q29udGV4dCBlbnRyeSBjb250ZXh0LgotICAgKiBAcGFyYW0gd3NkbEVsZW1lbnQgV1NETCBlbGVtZW50LgotICAgKiBAcmV0dXJuIGZhaWx1cmUgZGV0YWlsLgotICAgKi8KLSAgcHJvdGVjdGVkIEZhaWx1cmVEZXRhaWwgY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0LAotICAgIE9iamVjdCB3c2RsRWxlbWVudCkKLSAgewotICAgIEZhaWx1cmVEZXRhaWwgZmFpbHVyZURldGFpbCA9IHJlcG9ydGVyLmNyZWF0ZUZhaWx1cmVEZXRhaWwoKTsKLSAgICBmYWlsdXJlRGV0YWlsLnNldEZhaWx1cmVNZXNzYWdlKG1lc3NhZ2UpOwotICAgIGZhaWx1cmVEZXRhaWwuc2V0RWxlbWVudExvY2F0aW9uKAotICAgICAgZ2V0RWxlbWVudExvY2F0aW9uKGVudHJ5Q29udGV4dC5nZXRXU0RMRG9jdW1lbnQoKSwgd3NkbEVsZW1lbnQpKTsKLSAgICByZXR1cm4gZmFpbHVyZURldGFpbDsKLSAgfQotCi0gIC8qKiAKLSAgICogU09BUEJvZHksIFNPQVBGYXVsdCwgU09BUEhlYWRlciBhbmQgU09BUEhlYWRlckZhdWx0IGNsYXNzIAotICAgKiBpbnRlcmZhY2VzIGhhdmUgY29tcGF0aWJsZSBnZXRVc2UoKSBhbmQgZ2V0TmFtZXNwYWNlVVJJKCkgCi0gICAqIG1ldGhvZHMsIGJ1dCB3c2RsNGogZG9lcyBub3QgZGVjbGFyZSB0aGVtIGF0IHRoZSBwYXJlbnQgaW50ZXJmYWNlLiAKLSAgICogVGhlcmVmb3JlIHVzZSByZWZsZWN0aW9uIHRvIGFjY2VzcyB0aGVzZSBjb21tb24gbWV0aG9kcy4KLSAgICogCi0gICAqIEBwYXJhbSBleHRFbGVtZW50IGV4dGVuc2liaWxpdHkgZWxlbWVudC4KLSAgICogQHJldHVybiB0cnVlIGlmIG5hbWVzcGFjZSBpcyBmb3VuZCBpbiBTT0FQIGxpdGVyYWwuCi0gICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSBmb3VuZC4KLSAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGluIGFuIGludm9rZWQgbWV0aG9kIG9yIGNvbnN0cnVjdG9yCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbSBhdHRlbXB0IHRvIGxvYWQgYQotICAgKiAgICAgICAgIGNsYXNzIHRoYXQgaXQgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8uCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBuYW1lc3BhY2VGb3VuZEluU29hcExpdGVyYWwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCkKLSAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gIHsKLSAgICBDbGFzcyBjID0gZXh0RWxlbWVudC5nZXRDbGFzcygpOwotICAgIE1ldGhvZCBnZXRVc2VNZXRob2QgPSBjLmdldE1ldGhvZCgiZ2V0VXNlIiwgbmV3IENsYXNzWzBdKTsKLSAgICBNZXRob2QgZ2V0TmFtZXNwYWNlVVJJTWV0aG9kID0gYy5nZXRNZXRob2QoImdldE5hbWVzcGFjZVVSSSIsIG5ldyBDbGFzc1swXSk7Ci0KLSAgICAvLyAodXNlIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkgYnV0IHRoZSBudWxsIGNhc2UgaXMgY2hlY2tlZCBmb3Igc2luY2UgYSBtaXNzaW5nIHVzZSBpcyBub3QKLSAgICAvLyBjaGVja2VkIHdpdGggdGhpcyBUQS4gSWYgaXRzIG1pc3NpbmcgaXRzIGludmFsaWQgYnV0IHdlIGRvbid0IGtub3cgd2hldGhlciB3ZSBoYXZlIGRvYy1saXQpLiAgICAgCQkKLSAgICBpZiAoZ2V0VXNlTWV0aG9kLmludm9rZShleHRFbGVtZW50LCBudWxsKSA9PSBudWxsCi0gICAgICB8fCAhZ2V0VXNlTWV0aG9kLmludm9rZShleHRFbGVtZW50LCBudWxsKS5lcXVhbHMoCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElUKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJuIHRydWUgaWYgbmFtZXNwYWNlIGZvdW5kCi0gICAgYm9vbGVhbiBuYW1lc3BhY2VGb3VuZCA9Ci0gICAgICAoZ2V0TmFtZXNwYWNlVVJJTWV0aG9kLmludm9rZShleHRFbGVtZW50LCBudWxsKSAhPSBudWxsKTsKLQotICAgIC8vIHJldHVybiB0cnVlIGlmIG5hbWVzcGFjZSBmb3VuZAotICAgIHJldHVybiBuYW1lc3BhY2VGb3VuZDsKLQotICB9Ci0KLSAgLyoqCi0gICAqIFZlcmlmeSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgdXNlcyBsaXRlcmFsLgotICAgKiBAcGFyYW0gZXh0ZW5zaWJsZSAtIGV4dGVuc2liaWxpdHkgZWxlbWVudAotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgY2Fubm90IGJlIGZvdW5kLgotICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgaW4gYW4gaW52b2tlZCBtZXRob2Qgb3IgY29uc3RydWN0b3IKLSAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFtIGF0dGVtcHQgdG8gbG9hZCBhCi0gICAqICAgICAgICAgY2xhc3MgdGhhdCBpdCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0by4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzTGl0ZXJhbChFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmxlKQotICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgewotCi0gICAgQ2xhc3MgYyA9IGV4dGVuc2libGUuZ2V0Q2xhc3MoKTsKLSAgICBNZXRob2QgZ2V0VXNlTWV0aG9kID0gYy5nZXRNZXRob2QoImdldFVzZSIsIG5ldyBDbGFzc1swXSk7Ci0KLSAgICAvLyAodXNlIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkgYnV0IHRoZSBudWxsIGNhc2UgaXMgY2hlY2tlZCBmb3Igc2luY2UgYSBtaXNzaW5nIHVzZSBpcyBub3QKLSAgICAvLyBjaGVja2VkIHdpdGggdGhpcyBUQS4gSWYgaXRzIG1pc3NpbmcgaXRzIGludmFsaWQgYnV0IHdlIGRvbid0IGtub3cgd2hldGhlciB3ZSBoYXZlIGRvYy1saXQpLiAgICAgCQkKLSAgICBpZiAoZ2V0VXNlTWV0aG9kLmludm9rZShleHRlbnNpYmxlLCBudWxsKSA9PSBudWxsCi0gICAgICB8fCAhZ2V0VXNlTWV0aG9kLmludm9rZShleHRlbnNpYmxlLCBudWxsKS5lcXVhbHMoCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElUKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJuIHRydWUgaWYgc2hvd24gdG8gaGF2ZSB1c2U9ImxpdGVyYWwiCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDEwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzOWI1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjAxMAotICovCi1wdWJsaWMgY2xhc3MgV1NJMjAxMCBleHRlbmRzIEJQMjAxMAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMDEwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZDVkYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIwMTEKLSAqLwotcHVibGljIGNsYXNzIFdTSTIwMTEgZXh0ZW5kcyBCUDIwMTEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjAxMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWQ5ZWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMDEyCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMDEyIGV4dGVuZHMgQlAyMDEyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIwMTIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDEzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRmMDFjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjAxMwotICovCi1wdWJsaWMgY2xhc3MgV1NJMjAxMyBleHRlbmRzIEJQMjAxMwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMDEzKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYjZhNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDE0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIwMTQKLSAqLwotcHVibGljIGNsYXNzIFdTSTIwMTQgZXh0ZW5kcyBCUDIwMTQKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjAxNChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U5ODIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMDE3Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMDE3IGV4dGVuZHMgQlAyMDE3Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIwMTcoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDE4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0NWUzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjAxOAotICovCi1wdWJsaWMgY2xhc3MgV1NJMjAxOCBleHRlbmRzIEJQMjAxOAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMDE4KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxOS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDE5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMTk3ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDE5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIwMTkKLSAqLwotcHVibGljIGNsYXNzIFdTSTIwMTkgZXh0ZW5kcyBCUDIwMTkKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjAxOShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMjAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAyMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWYwMjA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMDIwCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMDIwIGV4dGVuZHMgQlAyMDIwCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIwMjAoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDIxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3ZjFiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjAyMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMjAyMSBleHRlbmRzIEJQMjAyMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMDIxKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAyMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjk5NjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIwMjIKLSAqLwotcHVibGljIGNsYXNzIFdTSTIwMjIgZXh0ZW5kcyBCUDIwMjIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjAyMihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMzIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzA3YWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMDMyCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMDMyIGV4dGVuZHMgQlAyMDMyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIwMzIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDk4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwOTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhOTA1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwOTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjA5OAotICovCi1wdWJsaWMgY2xhc3MgV1NJMjA5OCBleHRlbmRzIEJQMjA5OAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMDk4KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjA5OS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDk5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNGI1MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDk5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogV1NJMjA5OS4KLSAgICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6ZGVmaW5pdGlvbnMsIDwvY29udGV4dD4KLSAgICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkEgV1MtSSBjb25mb3JtYW5jZSBhbm5vdGF0aW9uIGRvZXMgbm90IGFwcGVhciBvdXRzaWRlIGEgd3NkbDpwb3J0LCB3c2RsOmJpbmRpbmcsIHdzZGw6cG9ydFR5cGUsIHdzZGw6b3BlcmF0aW9uLCBvciB3c2RsOm1lc3NhZ2UgZWxlbWVudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgV1NJMjA5OSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMDk5KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0gIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0NsYWltcyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiAgQ2hlY2sgYSBXUy1JIGNvbmZvcm1hbmNlIGFubm90YXRpb24gZG9lcyBub3QgYXBwZWFyIG91dHNpZGUgYSB3c2RsOnBvcnQsIHdzZGw6YmluZGluZywgd3NkbDpwb3J0VHlwZSwgd3NkbDpvcGVyYXRpb24sIG9yIHdzZGw6bWVzc2FnZSBlbGVtZW50IGlmIG5vdCBpdCBjcmVhdGVzIGZhaWx1cmUgcmVwb3J0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoRWxlbWVudCBlbCwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgLy8gY29uZm9ybWFuY2UgY2xhaW0gc2hvdWxkIGJlIHdpdGhpbiA6IHBvcnQsIGJpbmRpbmcsIHBvcnR0eXBlLCBvcGVyYXRpb24sIG1lc3NhZ2UKLSAgICBpZiAoY29udGFpbnNDb25mb3JtYW5jZUNsYWltKGVsKSkKLSAgICB7Ci0gICAgICBjb250YWluc0NsYWltcyA9IHRydWU7Ci0KLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nRmF1bHQpCi0gICAgICAgIGVycm9ycy5hZGQoV1NETF9GQVVMVCwgKChCaW5kaW5nRmF1bHQpIHBhcmVudCkuZ2V0TmFtZSgpKTsKLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkKLSAgICAgICAgZXJyb3JzLmFkZChXU0RMX0lOUFVULCAoKEJpbmRpbmdJbnB1dCkgcGFyZW50KS5nZXROYW1lKCkpOwotICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZ09wZXJhdGlvbikKLSAgICAgICAgZXJyb3JzLmFkZChXU0RMX09QRVJBVElPTiwgKChCaW5kaW5nT3BlcmF0aW9uKSBwYXJlbnQpLmdldE5hbWUoKSk7Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KQotICAgICAgICBlcnJvcnMuYWRkKFdTRExfT1VUUFVULCAoKEJpbmRpbmdPdXRwdXQpIHBhcmVudCkuZ2V0TmFtZSgpKTsKLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0gICAgICAgIGVycm9ycy5hZGQoV1NETF9ERUZJTklUSU9OUywgKChEZWZpbml0aW9uKSBwYXJlbnQpLmdldFFOYW1lKCkpOwotICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgU2VydmljZSkKLSAgICAgICAgZXJyb3JzLmFkZChXU0RMX1NFUlZJQ0UsICgoU2VydmljZSkgcGFyZW50KS5nZXRRTmFtZSgpKTsKLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEZhdWx0KQotICAgICAgICBlcnJvcnMuYWRkKFdTRExfRkFVTFQsICgoRmF1bHQpIHBhcmVudCkuZ2V0TmFtZSgpKTsKLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE91dHB1dCkKLSAgICAgICAgZXJyb3JzLmFkZChXU0RMX0lOUFVULCAoKE91dHB1dCkgcGFyZW50KS5nZXROYW1lKCkpOwotICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgSW1wb3J0KQotICAgICAgICBlcnJvcnMuYWRkKFdTRExfSU1QT1JULCAoKEltcG9ydCkgcGFyZW50KS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJbnB1dCkKLSAgICAgICAgZXJyb3JzLmFkZChXU0RMX0lOUFVULCAoKElucHV0KSBwYXJlbnQpLmdldE5hbWUoKSk7Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBQYXJ0KQotICAgICAgICBlcnJvcnMuYWRkKFdTRExfUEFSVCwgKChQYXJ0KSBwYXJlbnQpLmdldE5hbWUoKSk7Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBUeXBlcykKLSAgICAgICAgZXJyb3JzLmFkZChXU0RMX1RZUEVTKTsKLSAgICB9Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRFbGVtZW50KHRydWUpOwotICAgIC8qCi0gICAgdHJhdmVyc2FsLgotICAgIAlpZ25vcmVQb3J0MkVsZW1lbnQoKS4KLSAgICAJaWdub3JlTWVzc2FnZTJFbGVtZW50KCkuCi0gICAgCWlnbm9yZUJpbmRpbmcyRWxlbWVudCgpLgotICAgIAlpZ25vcmVQb3J0VHlwZTJFbGVtZW50KCkuCi0gICAgCWlnbm9yZU9wZXJhdGlvbjJFbGVtZW50KCk7CQkKLSAgICAgICovCi0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpKTsKLQotICAgIC8vIGNyZWF0ZSBkZXRhaWwgbWVzc2FnZSB3aXRoIHRoZSBsaXN0IG9mIGVycm9yIGVsZW1lbnRzCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgfQotCi0gICAgZWxzZSBpZiAoIWNvbnRhaW5zQ2xhaW1zKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudCB3aGV0aGVyIGNvbnRhaW5zIGNvbmZvcm1hbmNlIGNsYWltcy4gCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBkb2N1bWVudGF0aW9uIGVsZW1lbnQgY29udGFpbnMgY29uZm9ybWFuY2UgY2xhaW0uIAotICAgKiBAcGFyYW0gZWwKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNDb25mb3JtYW5jZUNsYWltKEVsZW1lbnQgZWwpCi0gIHsKLSAgICBpZiAoZWwgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbCA9IFhNTFV0aWxzLmZpbmRDaGlsZEVsZW1lbnQoZWwsIFdTSV9DTEFJTSk7Ci0gICAgcmV0dXJuIChlbCAhPSBudWxsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTAwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMTU1ODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIFdTSTIxMDAuCi0gICAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmRlZmluaXRpb25zLCBpZiBpdCBjb250YWlucyBhIHdzZGw6cG9ydCwgd3NkbDpiaW5kaW5nLCB3c2RsOnBvcnRUeXBlLCB3c2RsOm9wZXJhdGlvbiwgb3Igd3NkbDptZXNzYWdlLCB3aGljaCBpbiB0dXJuIGNvbnRhaW5zIGEgY29uZm9ybWFuY2UgYW5ub3RhdGlvbjwvY29udGV4dD4KLSAgICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBjb25mb3JtYW5jZSBhbm5vdGF0aW9uIG9mIHRoZSB3c2RsOnBvcnQsIHdzZGw6YmluZGluZywgd3NkbDpwb3J0VHlwZSwgd3NkbDpvcGVyYXRpb24sIG9yIHdzZGw6bWVzc2FnZSwgdmFsaWRhdGVzIHRvIHRoZSBzY2hlbWEgZGVmaW5lZCBpbiB0aGUgQmFzaWMgUHJvZmlsZSwgYW5kIGlzIGRpcmVjdCBjaGlsZCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50IGZvciB0aGUgV1NETCBlbGVtZW50LiBUaGUgc2NoZW1hIGRlZmluaXRpb24gdXNlcyAiaHR0cDovL3dzLWkub3JnL3NjaGVtYXMvY29uZm9ybWFuY2VDbGFpbS8iIGFzIHRoZSB0YXJnZXROYW1lc3BhY2UuIDwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTAwIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMDAoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0NsYWltcyA9IGZhbHNlOwotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgLyogQ3JlYXRlIGZhbHVyZSByZXBvcnQgaWYgcG9ydCBjb250YWlucyBpbGxlZ2FsIGNsYWltLgotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5Qb3J0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUG9ydCBwb3J0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAocG9ydCAhPSBudWxsICYmICFjb250YWluc0xlZ2FsQ2xhaW0ocG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKSkKLSAgICAgIGVycm9ycy5hZGQoV1NETF9QT1JULCBwb3J0LmdldE5hbWUoKSk7Ci0gIH0KLQotICAvKiBDcmVhdGUgZmFsdXJlIHJlcG9ydCBpZiBiaW5kaW5nIGNvbnRhaW5zIGlsbGVnYWwgY2xhaW0uCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLkJpbmRpbmcsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChCaW5kaW5nIGJpbmRpbmcsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChiaW5kaW5nICE9IG51bGwKLSAgICAgICYmICFjb250YWluc0xlZ2FsQ2xhaW0oYmluZGluZy5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKSkKLSAgICAgIGVycm9ycy5hZGQoV1NETF9CSU5ESU5HLCBiaW5kaW5nLmdldFFOYW1lKCkpOwotICB9Ci0KLSAgLyogQ3JlYXRlIGZhbHVyZSByZXBvcnQgaWYgcG9ydCB0eXBlIGNvbnRhaW5zIGlsbGVnYWwgY2xhaW0uCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLlBvcnRUeXBlLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUG9ydFR5cGUgdHlwZSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCAmJiAhY29udGFpbnNMZWdhbENsYWltKHR5cGUuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSkpCi0gICAgICBlcnJvcnMuYWRkKFdTRExfUE9SVFRZUEUsIHR5cGUuZ2V0UU5hbWUoKSk7Ci0gIH0KLQotICAvKiBDcmVhdGUgZmFsdXJlIHJlcG9ydCBpZiBvcGVyYXRpb24gY29udGFpbnMgaWxsZWdhbCBjbGFpbS4KLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuT3BlcmF0aW9uLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbAotICAgICAgJiYgIWNvbnRhaW5zTGVnYWxDbGFpbShvcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSkpCi0gICAgICBlcnJvcnMuYWRkKFdTRExfT1BFUkFUSU9OLCBvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgfQotCi0gIC8qIENyZWF0ZSBmYWx1cmUgcmVwb3J0IGlmIG1lc3NhZ2UgY29udGFpbnMgaWxsZWdhbCBjbGFpbS4KLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuTWVzc2FnZSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KE1lc3NhZ2UgbWVzc2FnZSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbAotICAgICAgJiYgIWNvbnRhaW5zTGVnYWxDbGFpbShtZXNzYWdlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpKQotICAgICAgZXJyb3JzLmFkZChXU0RMX01FU1NBR0UsIG1lc3NhZ2UuZ2V0UU5hbWUoKSk7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRPcGVyYXRpb24odHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0QmluZGluZyh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRNZXNzYWdlKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFBvcnQodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0UG9ydFR5cGUodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpKTsKLQotICAgIC8vIGNyZWF0ZSBkZXRhaWwgbWVzc2FnZSB3aXRoIHRoZSBsaXN0IG9mIGVycm9yIGVsZW1lbnRzCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgfQotCi0gICAgZWxzZSBpZiAoIWNvbnRhaW5zQ2xhaW1zKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50IHdoZXRoZXIgY29udGFpbnMgY29uZm9ybWFuY2UgY2xhaW1zLgotICAgKiBSZXR1cm5zIHRydWUgaWYgZG9jdW1lbnRhdGlvbiBlbGVtZW50IGNvbnRhaW5zIGNvbmZvcm1hbmNlIGNsYWltIHdpdGgKLSAgICogaWxsZWdhbCBzY2hlbWEgZGVmaW5pdGlvbiBVUkkuIAotICAgKiBsZWdhbCBpcyAnaHR0cDovL3dzLWkub3JnL3NjaGVtYXMvY29uZm9ybWFuY2VDbGFpbS8nCi0gICAqIEBwYXJhbSBlbAotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0xlZ2FsQ2xhaW0oRWxlbWVudCBlbCkKLSAgewotICAgIGlmIChlbCA9PSBudWxsKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgLy8gZmluZCBjbGFpbQotICAgIGVsID0gWE1MVXRpbHMuZmluZENoaWxkRWxlbWVudChlbCwgV1NJX0NMQUlNKTsKLQotICAgIGlmIChlbCAhPSBudWxsKQotICAgICAgY29udGFpbnNDbGFpbXMgPSB0cnVlOwotCi0gICAgd2hpbGUgKGVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFhNTFV0aWxzLmdldEF0dHJpYnV0ZShlbCwgQVRUUl9DTEFJTV9DT05GT1JNU1RPKSA9PSBudWxsCi0gICAgICAgIHx8IFhNTFV0aWxzLmdldEF0dHJpYnV0ZShlbCwgQVRUUl9TT0FQX01VU1RVTkRFUlNUQU5EKSAhPSBudWxsKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBlbCA9IFhNTFV0aWxzLmZpbmRFbGVtZW50KGVsLCBXU0lfQ0xBSU0pOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZjA5ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMDEKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMDEgZXh0ZW5kcyBCUDIxMDEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjEwMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzYyN2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTAyCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTAyIGV4dGVuZHMgQlAyMTAyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMDIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTAzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3NWYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjEwMwotICovCi1wdWJsaWMgY2xhc3MgV1NJMjEwMyBleHRlbmRzIEJQMjEwMwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTAzKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NDI3NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMDQKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMDQgZXh0ZW5kcyBCUDIxMDQKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjEwNChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmJkZGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTA1IGV4dGVuZHMgQlAyMTA1Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMDUoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTA3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1NzQyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjEwNwotICovCi1wdWJsaWMgY2xhc3MgV1NJMjEwNyBleHRlbmRzIEJQMjEwNwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTA3KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwOC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NmJlYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTA4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMDgKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMDggZXh0ZW5kcyBCUDIxMDgKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjEwOChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzBjYzRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTEwCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTEwIGV4dGVuZHMgQlAyMTEwCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMTAoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTExLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5Mjg2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjExMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMjExMSBleHRlbmRzIEJQMjExMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTExKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDBhYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMTIKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMTIgZXh0ZW5kcyBCUDIxMTIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjExMihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzExODk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTEzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTEzIGV4dGVuZHMgQlAyMTEzCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMTMoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTE0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1NWEyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjExNAotICovCi1wdWJsaWMgY2xhc3MgV1NJMjExNCBleHRlbmRzIEJQMjExNAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTE0KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExNS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNmVmN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMTUKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMTUgZXh0ZW5kcyBCUDIxMTUKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjExNShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzM1OGU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTE2Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTE2IGV4dGVuZHMgQlAyMTE2Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMTYoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTE3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdiMzc3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjExNwotICovCi1wdWJsaWMgY2xhc3MgV1NJMjExNyBleHRlbmRzIEJQMjExNwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTE3KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExOC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZDMzMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMTgKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMTggZXh0ZW5kcyBCUDIxMTgKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjExOChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDE2Y2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTE5Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTE5IGV4dGVuZHMgQlAyMTE5Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMTkoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTIwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYyZTIwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjEyMAotICovCi1wdWJsaWMgY2xhc3MgV1NJMjEyMCBleHRlbmRzIEJQMjEyMAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTIwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEyMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOTk0ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMjIKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMjIgZXh0ZW5kcyBCUDIxMjIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjEyMihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMjMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGYwNWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTIzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTIzIGV4dGVuZHMgQlAyMTIzCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMjMoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMjAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIyMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2NDU3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIyMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjIwMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMjIwMSBleHRlbmRzIEJQMjIwMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMjAxKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjIwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMjAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYjU5ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMjAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIyMDIKLSAqLwotcHVibGljIGNsYXNzIFdTSTIyMDIgZXh0ZW5kcyBCUDIyMDIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjIwMihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIyMDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjIwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQ3MTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjIwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMjA4Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMjA4IGV4dGVuZHMgQlAyMjA4Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIyMDgoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI0MDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjNTc4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI0MDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjQwMgotICovCi1wdWJsaWMgY2xhc3MgV1NJMjQwMiBleHRlbmRzIEJQMjQwMgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyNDAyKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYWNkNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTI0MDMKLSAqLwotcHVibGljIGNsYXNzIFdTSTI0MDMgZXh0ZW5kcyBTU0JQMjQwMwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyNDAzKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQwNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmE4ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTI0MDQKLSAqLwotcHVibGljIGNsYXNzIFdTSTI0MDQgZXh0ZW5kcyBCUDI0MDQKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjQwNChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI0MDYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQwNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmQ0MjBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyNDA2Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyNDA2IGV4dGVuZHMgQlAyNDA2Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTI0MDYoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDE2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI0MTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcwYmYzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI0MTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjQxNgotICovCi1wdWJsaWMgY2xhc3MgV1NJMjQxNiBleHRlbmRzIEJQMjQxNgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyNDE2KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQxNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMjM4MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTI0MTcKLSAqLwotcHVibGljIGNsYXNzIFdTSTI0MTcgZXh0ZW5kcyBCUDI0MTcKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjQxNyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI3MDAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjcwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWJiYjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjcwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyNzAwCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyNzAwIGV4dGVuZHMgQlAyNzAwCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTI3MDAoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNzAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI3MDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzN2Y1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI3MDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjcwMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMjcwMSBleHRlbmRzIEJQMjcwMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyNzAxKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjcwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNzAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NjM3MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNzAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTI3MDMKLSAqLwotcHVibGljIGNsYXNzIFdTSTI3MDMgZXh0ZW5kcyBCUDI3MDMKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjcwMyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTQyMDAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJNDIwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDQzYTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJNDIwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0k0MjAwCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0k0MjAwIGV4dGVuZHMgQlA0MjAwCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTQyMDAoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0k0MjAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTQyMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyMzNkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTQyMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJNDIwMQotICovCi1wdWJsaWMgY2xhc3MgV1NJNDIwMSBleHRlbmRzIEJQNDIwMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0k0MjAxKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJNDIwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0k0MjAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDliYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0k0MjAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTQyMDIKLSAqLwotcHVibGljIGNsYXNzIFdTSTQyMDIgZXh0ZW5kcyBCUDQyMDIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJNDIwMihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0FydGlmYWN0UmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0FydGlmYWN0UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZGQ1MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9BcnRpZmFjdFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQW4gYXJ0aWZhY3QgcmVmZXJlbmNlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFydGlmYWN0UmVmZXJlbmNlIGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9BUlRJRkFDVF9SRUZFUkVOQ0U7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX1JFUE9SVCwgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogR2V0IHRpbWVzdGFtcC4KLSAgICogQHJldHVybiB0aW1lc3RhbXAuCi0gICAqIEBzZWUgI3NldFRpbWVzdGFtcAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUaW1lc3RhbXAoKTsKLQotICAvKioKLSAgICogU2V0IHRpbWVzdGFtcC4KLSAgICogQHBhcmFtIHRpbWVzdGFtcCBhIHRpbWVzdGFtcC4KLSAgICogQHNlZSAjZ2V0VGltZXN0YW1wCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAoU3RyaW5nIHRpbWVzdGFtcCk7Ci0KLSAgLyoqCi0gICAqIEdldCBkb2N1bWVudCBlbGVtZW50LgotICAgKiBAcmV0dXJuIGRvY3VtZW50IGVsZW1lbnQuCi0gICAqIEBzZWUgI3NldERvY3VtZW50RWxlbWVudAotICAgKi8KLSAgcHVibGljIERvY3VtZW50RWxlbWVudCBnZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAvKioKLSAgICogU2V0IGRvY3VtZW50IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkb2N1bWVudEVsZW1lbnQgZG9jdW1lbnQgZWxlbWVudC4KLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgICBuYW1lc3BhY2UgcHJlZml4LgotICAgKiBAc2VlICNnZXREb2N1bWVudEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERvY3VtZW50RWxlbWVudCgKLSAgICBEb2N1bWVudEVsZW1lbnQgZG9jdW1lbnRFbGVtZW50LAotICAgIFN0cmluZyBuYW1lc3BhY2VOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvQXNzZXJ0aW9uUmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0Fzc2VydGlvblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTExM2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvQXNzZXJ0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFzc2VydGlvblJlc3VsdHNPcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotCi0vKioKLSAqIFRlc3QgYXNzZXJ0aW9uIHJlc3VsdC4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzZXJ0aW9uUmVzdWx0IGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9BU1NFUlRJT05fUkVTVUxUOwotCi0gIC8qKgotICAgKiBRTmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUUgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9SRVBPUlQsIEVMRU1fTkFNRSk7Ci0KLSAgLyoqCi0gICAqIFJlc3VsdCB2YWx1ZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfUEFTU0VEID0gInBhc3NlZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9GQUlMRUQgPSAiZmFpbGVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX1BSRVJFUV9GQUlMRUQgPSAicHJlcmVxRmFpbGVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX01JU1NJTkdfSU5QVVQgPSAibWlzc2luZ0lucHV0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX1dBUk5JTkcgPSAid2FybmluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9OT1RfQVBQTElDQUJMRSA9ICJub3RBcHBsaWNhYmxlIjsKLQotICAvKioKLSAgICogR2V0IHJlc3VsdC4KLSAgICogQHJldHVybiByZXN1bHQuCi0gICAqIEBzZWUgI3NldFJlc3VsdAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKTsKLQotICAvKioKLSAgICogU2V0IHJlc3VsdC4KLSAgICogQHBhcmFtIHJlc3VsdCB0aGUgcmVzdWx0IHZhbHVlLgotICAgKiBAc2VlICNnZXRSZXN1bHQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc3VsdChTdHJpbmcgcmVzdWx0KTsKLQotICAvKioKLSAgICogR2V0IGFzc2VydGlvbi4KLSAgICogQHJldHVybiBwcm9maWxlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlICNzZXRBc3NlcnRpb24KLSAgICovCi0gIHB1YmxpYyBUZXN0QXNzZXJ0aW9uIGdldEFzc2VydGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgYXNzZXJ0aW9uLgotICAgKiBAcGFyYW0gcHJvZmlsZUFzc2VydGlvbiBwcm9maWxlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlICNnZXRBc3NlcnRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFzc2VydGlvbihUZXN0QXNzZXJ0aW9uIHByb2ZpbGVBc3NlcnRpb24pOwotCi0gIC8qKgotICAgKiBHZXQgZW50cnkuCi0gICAqIEByZXR1cm4gZW50cnkuCi0gICAqIEBzZWUgI3NldEVudHJ5Ci0gICAqLwotICBwdWJsaWMgRW50cnkgZ2V0RW50cnkoKTsKLQotICAvKioKLSAgICogU2V0IGVudHJ5LgotICAgKiBAcGFyYW0gZW50cnkgYW4gZW50cnkuCi0gICAqIEBzZWUgI2dldEVudHJ5Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbnRyeShFbnRyeSBlbnRyeSk7Ci0KLSAgLyoqCi0gICAqIEdldCBmYWlsdXJlIGRldGFpbCBtZXNzYWdlcy4KLSAgICogQHJldHVybiBmYWlsdXJlIGRldGFpbCBtZXNzYWdlcy4KLSAgICogQHNlZSAjc2V0RmFpbHVyZURldGFpbExpc3QKLSAgICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0RmFpbHVyZURldGFpbExpc3QoKTsKLQotICAvKioKLSAgICogU2V0IGZhaWx1cmUgZGV0YWlsIG1lc3NhZ2VzLgotICAgKiBAcGFyYW0gZmFpbHVyZURldGFpbExpc3QgZmFpbHVyZSBkZXRhaWwgbWVzc2FnZXMuCi0gICAqIEBzZWUgI2dldEZhaWx1cmVEZXRhaWxMaXN0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlRGV0YWlsTGlzdChWZWN0b3IgZmFpbHVyZURldGFpbExpc3QpOwotCi0gIC8qKgotICAgKiBHZXQgd2FybmluZyBtZXNzYWdlcy4KLSAgICogQHJldHVybiB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKiBAc2VlICNzZXRXYXJuaW5nTWVzc2FnZXMKLSAgICovCi0gIC8vcHVibGljIFZlY3RvciBnZXRXYXJuaW5nTWVzc2FnZXMoKTsKLQotICAvKioKLSAgICogU2V0IHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqIEBwYXJhbSB3YXJuaW5nTWVzc2FnZXMgd2FybmluZyBtZXNzYWdlcy4KLSAgICogQHNlZSAjZ2V0V2FybmluZ01lc3NhZ2VzCi0gICAqLwotICAvL3B1YmxpYyB2b2lkIHNldFdhcm5pbmdNZXNzYWdlcyhWZWN0b3Igd2FybmluZ01lc3NhZ2VzKTsKLQotICAvKioKLSAgICogR2V0IGFzc2VydGlvbiByZXN1bHRzIG9wdGlvbi4KLSAgICogQHJldHVybiBzc2VydGlvbiByZXN1bHRzIG9wdGlvbi4KLSAgICogQHNlZSAjc2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdHNPcHRpb24gZ2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgYXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uLgotICAgKiBAcGFyYW0gYXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBhc3NlcnRpb24gcmVzdWx0cyBvcHRpb24uCi0gICAqIEBzZWUgI2dldEFzc2VydGlvblJlc3VsdHNPcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFzc2VydGlvblJlc3VsdHNPcHRpb24oQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBhc3NlcnRpb25SZXN1bHRzT3B0aW9uKTsKLQotICAvKioKLSAgICogR2V0IHByZXJlcSBmYWlsZWQgbGlzdC4KLSAgICogQHJldHVybiBwcmVyZXEgZmFpbGVkIGxpc3QuCi0gICAqIEBzZWUgI3NldFByZXJlcUZhaWxlZExpc3QKLSAgICovCi0gIHB1YmxpYyBQcmVyZXFGYWlsZWRMaXN0IGdldFByZXJlcUZhaWxlZExpc3QoKTsKLQotICAvKioKLSAgICogU2V0IHByZXJlcSBmYWlsZWQgbGlzdC4KLSAgICogQHBhcmFtIHByZXJlcUZhaWxlZExpc3QgcHJlcmVxIGZhaWxlZCBsaXN0LgotICAgKiBAc2VlICNnZXRQcmVyZXFGYWlsZWRMaXN0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcmVyZXFGYWlsZWRMaXN0KFByZXJlcUZhaWxlZExpc3QgcHJlcmVxRmFpbGVkTGlzdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0J1aWxkUmVwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0J1aWxkUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZGJjMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9CdWlsZFJlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIFByb2ZpbGUgcmVwb3J0LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQnVpbGRSZXBvcnQKLXsKLSAgLyoqCi0gICAqIFByZXJlcSB0eXBlIC0gZW50cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVSRVFfVFlQRV9FTlRSWSA9ICJlbnRyeSI7Ci0KLSAgLyoqCi0gICAqIFByZXJlcSB0eXBlIC0gZW50cnkgY29udGFpbmVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFUkVRX1RZUEVfRU5UUllfQ09OVEFJTkVSID0gImVudHJ5Q29udGFpbmVyIjsKLQotICAvKioKLSAgICogU3RhcnQgY3VycmVudCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHJlcG9ydEFydGlmYWN0IGN1cnJlbnQgcmVwb3J0IGFydGlmYWN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiB0aGUgYmFzZSBXUy1JIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRBcnRpZmFjdChSZXBvcnRBcnRpZmFjdCByZXBvcnRBcnRpZmFjdCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBBZGQgYXJ0aWZhY3QgcmVmZXJlcmVuY2UuCi0gICAqIEBwYXJhbSBhcnRpZmFjdFJlZmVyZW5jZSBhcnRpZmFjdCByZWZlcmVuY2UuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIHRoZSBiYXNlIFdTLUkgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQXJ0aWZhY3RSZWZlcmVuY2UoQXJ0aWZhY3RSZWZlcmVuY2UgYXJ0aWZhY3RSZWZlcmVuY2UpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogRW5kIGN1cnJlbnQgYXJ0aWZhY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIHRoZSBiYXNlIFdTLUkgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kQ3VycmVudEFydGlmYWN0KCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogU3RhcnQgY3VycmVudCBlbnRyeS4KLSAgICogQHBhcmFtIGVudHJ5IHRoZSBjdXJyZW50IGVudHJ5LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiB0aGUgYmFzZSBXUy1JIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRFbnRyeShFbnRyeSBlbnRyeSkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogU3RhcnQgY3VycmVudCBlbnRyeS4KLSAgICogQHBhcmFtIGVudHJ5IHRoZSBjdXJyZW50IGVudHJ5LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiB0aGUgYmFzZSBXUy1JIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRFbnZlbG9wZUVudHJ5KEVudHJ5IGVudHJ5KSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotICAvKioKLSAgICogRW5kIGN1cnJlbnQgZW50cnkuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIHRoZSBiYXNlIFdTLUkgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kQ3VycmVudEVudHJ5KCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQWRkIHRlc3QgYXNzZXJ0aW9uIHJlc3VsdC4KLSAgICogQHBhcmFtIGFzc2VydGlvblJlc3VsdCB0ZXN0IGFzc2VydGlvbiByZXN1bHQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIHRoZSBiYXNlIFdTLUkgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQXNzZXJ0aW9uUmVzdWx0KEFzc2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1bHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogR2V0IHRoZSBhc3NlcnRpb24gcmVzdWx0IGZvciBhIHNwZWNpZmljIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAcGFyYW0gYXNzZXJ0aW9uSWQgdGhlIHRlc3QgYXNzZXJ0aW9uIElELgotICAgKiBAcmV0dXJuICB0aGUgYXNzZXJ0aW9uIHJlc3VsdCBmb3IgdGhlIHNwZWNpZmllZCB0ZXN0IGFzc2VydGlvbiBJRC4KLSAgICogICAgICAgICAgSWYgYW4gYXNzZXJ0aW9uIHJlc3VsdCB3YXMgbm90IGZvdW5kLCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IGdldEFzc2VydGlvblJlc3VsdChTdHJpbmcgYXNzZXJ0aW9uSWQpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYXNzZXJ0aW9uIHJlc3VsdC4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIGFzc2VydGlvbiByZXN1bHQuCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IGNyZWF0ZUFzc2VydGlvblJlc3VsdCgpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgZW50cnkuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBlbnRyeS4KLSAgICovCi0gIHB1YmxpYyBFbnRyeSBjcmVhdGVFbnRyeSgpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgZW50cnkgY29udGFpbmVyLgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgZW50cnkgY29udGFpbmVyLgotICAgKi8KLSAgcHVibGljIEVudHJ5Q29udGFpbmVyIGNyZWF0ZUVudHJ5Q29udGFpbmVyKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhcnRpZmFjdC4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIFJlcG9ydEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBmYWlsdXJlIGRldGFpbC4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIGZhaWx1cmUgZGV0YWlsLgotICAgKi8KLSAgcHVibGljIEZhaWx1cmVEZXRhaWwgY3JlYXRlRmFpbHVyZURldGFpbCgpOwotCi0gIC8qKgotICAgKiBTZXQgdHlwZSBvZiBwcmVyZXEgcHJvY2Vzc2luZyAtIGVpdGhlciBlbnRyeSBvciBkb2N1bWVudC4KLSAgICogQHBhcmFtIHByZXJlcVR5cGUgdHlwZSBvZiBwcmVyZXEgcHJvY2Vzc2luZyAtIGVpdGhlciBlbnRyeSBvciBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByZXJlcVR5cGUoU3RyaW5nIHByZXJlcVR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9FbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWNkODlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FbnRyeVR5cGU7Ci0KLS8qKgotICogVGVzdCBhc3NlcnRpb24gdGFyZ2V0LgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBFbnRyeSBleHRlbmRzIEVudHJ5UmVzdWx0LCBEb2N1bWVudEVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIEVsZW1lbnQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTkFNRSA9IFdTSUNvbnN0YW50cy5FTEVNX0VOVFJZOwotCi0gIC8qKgotICAgKiBRTmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUUgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9SRVBPUlQsIEVMRU1fTkFNRSk7Ci0KLSAgLyoqCi0gICAqIEdldCBhc3NlcnRpb24gcmVzdWx0cyBvcHRpb24uCi0gICAqLwotICAvL3B1YmxpYyBBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGdldEFzc2VydGlvblJlc3VsdHNPcHRpb24oKTsKLQotICAvKioKLSAgICogU2V0IGFzc2VydGlvbiByZXN1bHRzIG9wdGlvbi4KLSAgICovCi0gIC8vcHVibGljIHZvaWQgc2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbihBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGFzc2VydGlvblJlc3VsdHNPcHRpb24pOwotCi0gIC8qKgotICAgKiBHZXQgZW50cnkgdHlwZS4KLSAgICogQHJldHVybiBlbnRyeSB0eXBlLgotICAgKiBAc2VlICNzZXRFbnRyeVR5cGUKLSAgICovCi0gIHB1YmxpYyBFbnRyeVR5cGUgZ2V0RW50cnlUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBlbnRyeSB0eXBlLgotICAgKiBAcGFyYW0gZW50cnlUeXBlIGVudHJ5IHR5cGUuCi0gICAqIEBzZWUgI2dldEVudHJ5VHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW50cnlUeXBlKEVudHJ5VHlwZSBlbnRyeVR5cGUpOwotCi0gIC8qKgotICAgKiBHZXQgYXJ0aWZhY3QgbmFtZS4KLSAgICogQHJldHVybiBhcnRpZmFjdCBuYW1lLgotICAgKiBAc2VlICNzZXRBcnRpZmFjdE5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3ROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBhcnRpZmFjdCBuYW1lLgotICAgKiBAcGFyYW0gYXJ0aWZhY3ROYW1lIGFydGlmYWN0IG5hbWUuCi0gICAqIEBzZWUgI2dldEFydGlmYWN0TmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXJ0aWZhY3ROYW1lKFN0cmluZyBhcnRpZmFjdE5hbWUpOwotCi0gIC8qKgotICAgKiBHZXQgcmVmZXJlbmNlIElELgotICAgKiBAcmV0dXJuIHJlZmVyZW5jZSBJRC4KLSAgICogQHNlZSAjc2V0UmVmZXJlbmNlSUQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlSUQoKTsKLQotICAvKioKLSAgICogU2V0IHJlZmVyZW5jZSBJRC4KLSAgICogQHBhcmFtIHJlZmVyZW5jZUlEIHJlZmVyZW5jZUlELgotICAgKiBAc2VlICNnZXRSZWZlcmVuY2VJRAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlSUQoU3RyaW5nIHJlZmVyZW5jZUlEKTsKLQotICAvKioKLSAgICogR2V0IHBhcmVudCBlbGVtZW50IG5hbWUuCi0gICAqIEByZXR1cm4gcGFyZW50IGVsZW1lbnQgbmFtZS4KLSAgICogQHNlZSAjc2V0UGFyZW50RWxlbWVudE5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50RWxlbWVudE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0IHBhcmVudCBlbGVtZW50IG5hbWUuCi0gICAqIEBwYXJhbSBwYXJlbnRFbGVtZW50TmFtZSBwYXJlbnQgZWxlbWVudCBuYW1lLgotICAgKiBAc2VlICNnZXRQYXJlbnRFbGVtZW50TmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UGFyZW50RWxlbWVudE5hbWUoU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lKTsKLQotICAvKioKLSAgICogR2V0IGVudHJ5IGRldGFpbC4KLSAgICogQHJldHVybiBlbnRyeSBkZXRhaWwuCi0gICAqIEBzZWUgI3NldEVudHJ5RGV0YWlsCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBlbnRyeSBkZXRhaWwuCi0gICAqIEBwYXJhbSBkZXRhaWwgZW50cnkgZGV0YWlsLgotICAgKiBAc2VlICNnZXRFbnRyeURldGFpbAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW50cnlEZXRhaWwoT2JqZWN0IGRldGFpbCk7Ci0KLSAgLyoqCi0gICAqIEdldCBlbnRyeSBjb250YWluZXIuCi0gICAqIEByZXR1cm4gZW50cnkgY29udGFpbmVyLgotICAgKiBAc2VlICNzZXRFbnRyeUNvbnRhaW5lcgotICAgKi8KLSAgcHVibGljIEVudHJ5Q29udGFpbmVyIGdldEVudHJ5Q29udGFpbmVyKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBlbnRyeSBjb250YWluZXIuCi0gICAqIEBwYXJhbSBlbnRyeUNvbnRhaW5lciBlbnRyeSBjb250YWluZXIuCi0gICAqIEBzZWUgI2dldEVudHJ5Q29udGFpbmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbnRyeUNvbnRhaW5lcihFbnRyeUNvbnRhaW5lciBlbnRyeUNvbnRhaW5lcik7Ci0KLSAgLyoqCi0gICAqIEdldCBzdGFydCBlbGVtZW50IHN0cmluZy4KLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgbmFtZXNwYWNlIHByZWZpeC4KLSAgICogQHBhcmFtIHNob3dMb2dFbnRyeSBzaG93IGxvZyBlbnRyeSBvcHRpb24uCi0gICAqIEByZXR1cm4gc3RhcnQgWE1MIGVsZW1lbnQgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdGFydFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSwgYm9vbGVhbiBzaG93TG9nRW50cnkpOwotCi0gIC8qKgotICAgKiBHZXQgc3RhcnQgZWxlbWVudCBzdHJpbmcuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VOYW1lIG5hbWVzcGFjZSBwcmVmaXguCi0gICAqIEBwYXJhbSBzaG93TG9nRW50cnkgc2hvdyBsb2cgZW50cnkgb3B0aW9uLgotICAgKiBAcmV0dXJuIHN0YXJ0IFhNTCBlbGVtZW50IHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUsIGJvb2xlYW4gc2hvd0xvZ0VudHJ5LCBib29sZWFuIGVudmVsb3BlQXJ0aWZhY3RUeXBlKTsKLSAgLyoqCi0gICAqIEdldCBlbmQgZWxlbWVudCBzdHJpbmcuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VOYW1lIG5hbWVzcGFjZSBwcmVmaXguCi0gICAqIEByZXR1cm4gZW5kIFhNTCBlbGVtZW50IHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5kWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvRW50cnlDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvRW50cnlDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5MWUxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0VudHJ5Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNvbnRhaW5lciB3aGljaCBoYXMgb25lIG9yIG1vcmUgZW50cmllcy4KLSAqIEZvciBleGFtcGxlLCBhIFdTREwgZG9jdW1lbnQgY29udGFpbnMgb25lIG9yIG1vcmUgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW50cnlDb250YWluZXIgZXh0ZW5kcyBFbnRyeVJlc3VsdAotewotICAvKioKLSAgICogR2V0IGNvbnRhaW5lciBpZC4KLSAgICogQHJldHVybiBjb250YWluZXIgaWQuCi0gICAqIEBzZWUgI3NldElkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBjb250YWluZXIgaWQuCi0gICAqIEBwYXJhbSBpZCBjb250YWluZXIgaWQuCi0gICAqIEBzZWUgI2dldElkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9FbnRyeVJlc3VsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9FbnRyeVJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2E0ZjU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvRW50cnlSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotLyoqCi0gKiBSZXN1bHQgZm9yIGEgc3BlY2lmaWMgdGVzdCBhc3NlcnRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW50cnlSZXN1bHQKLXsKLSAgLyoqCi0gICAqIEFkZCBhc3NlcnRpb24gcmVzdWx0LgotICAgKiBAcGFyYW0gYXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvbiByZXN1bHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRBc3NlcnRpb25SZXN1bHQoQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdCk7Ci0KLSAgLyoqCi0gICAqIEdldCBhc3NlcnRpb24gcmVzdWx0cy4KLSAgICogQHJldHVybiBhc3NlcnRpb24gcmVzdWx0cy4KLSAgICovCi0gIHB1YmxpYyBUcmVlTWFwIGdldEFzc2VydGlvblJlc3VsdExpc3QoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBhc3NlcnRpb24gcmVzdWx0IGZvciBhIHNwZWNpZmljIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAcGFyYW0gYXNzZXJ0aW9uSWQgdGVzdCBhc3NlcnRpb24gaWQuCi0gICAqIEByZXR1cm4gdGhlIGFzc2VydGlvbiByZXN1bHQgZm9yIHRoZSBzcGVjaWZpZWQgdGVzdCBhc3NlcnRpb24gSUQuCi0gICAqICAgICAgICAgSWYgYW4gYXNzZXJ0aW9uIHJlc3VsdCB3YXMgbm90IGZvdW5kLCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IGdldEFzc2VydGlvblJlc3VsdChTdHJpbmcgYXNzZXJ0aW9uSWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9GYWlsdXJlRGV0YWlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0ZhaWx1cmVEZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkY2YwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0ZhaWx1cmVEZXRhaWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5kb20uRWxlbWVudExvY2F0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBGYWlsdXJlIGRldGFpbC4KLSAqIAotICogQGF1dGhvciBQZXRlciAgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBGYWlsdXJlRGV0YWlsIGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9GQUlMVVJFX0RFVEFJTDsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfUkVQT1JULCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBHZXQgZmFpbHVyZSBkZXRhaWwgbWVzc2FnZS4KLSAgICogQHJldHVybiBmYWlsdXJlIGRldGFpbCBtZXNzYWdlLgotICAgKiBAc2VlICNzZXRGYWlsdXJlTWVzc2FnZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGYWlsdXJlTWVzc2FnZSgpOwotCi0gIC8qKgotICAgKiBTZXQgZmFpbHVyZSBkZXRhaWwgbWVzc2FnZS4KLSAgICogQHBhcmFtIGZhaWx1cmVNZXNzYWdlIGZhaWx1cmUgZGV0YWlsIG1lc3NhZ2UuCi0gICAqIEBzZWUgI2dldEZhaWx1cmVNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlTWVzc2FnZShTdHJpbmcgZmFpbHVyZU1lc3NhZ2UpOwotCi0gIC8qKgotICAgKiBHZXQgcmVmZXJlbmNlIHR5cGUuCi0gICAqIEByZXR1cm4gcmVmZXJlbmNlIHR5cGUuCi0gICAqIEBzZWUgI3NldFJlZmVyZW5jZVR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlVHlwZSgpOwotCi0gIC8qKgotICAgKiBTZXQgcmVmZXJlbmNlIHR5cGUuCi0gICAqIEBwYXJhbSByZWZlcmVuY2VUeXBlIHJlZmVyZW5jZSB0eXBlLgotICAgKiBAc2VlICNnZXRSZWZlcmVuY2VUeXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VUeXBlKFN0cmluZyByZWZlcmVuY2VUeXBlKTsKLQotICAvKioKLSAgICogR2V0IHJlZmVyZW5jZSBJRC4KLSAgICogQHJldHVybiByZWZlcmVuY2UgSUQuCi0gICAqIEBzZWUgI3NldFJlZmVyZW5jZUlEbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VJRCgpOwotCi0gIC8qKgotICAgKiBTZXQgcmVmZXJlbmNlIElELgotICAgKiBAcGFyYW0gcmVmZXJlbmNlSUQgcmVmZXJlbmNlIElELgotICAgKiBAc2VlICNnZXRSZWZlcmVuY2VJRAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlSURuKFN0cmluZyByZWZlcmVuY2VJRCk7Ci0KLSAgLyoqCi0gICAqIEdldCBlbGVtZW50IGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIGVsZW1lbnQgbG9jYXRpb24uCi0gICAqIEBzZWUgI3NldEVsZW1lbnRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIEVsZW1lbnRMb2NhdGlvbiBnZXRFbGVtZW50TG9jYXRpb24oKTsKLQotICAvKioKLSAgICogU2V0IGVsZW1lbnQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBlbGVtZW50TG9jYXRpb24gZWxlbWVudCBsb2NhdGlvbi4KLSAgICogQHNlZSAjZ2V0RWxlbWVudExvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TG9jYXRpb24oRWxlbWVudExvY2F0aW9uIGVsZW1lbnRMb2NhdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvUHJlcmVxRmFpbGVkTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9QcmVyZXFGYWlsZWRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTNkNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9QcmVyZXFGYWlsZWRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIG1haW50YWluIGFuZCBhY2Nlc3MgdGhlIFByZXJlcXVpc2l0ZSBGYWlsZWQgTGlzdC4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmVyZXFGYWlsZWRMaXN0IGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgICogRWxlbWVudCBuYW1lLgotICAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTkFNRSA9IFdTSUNvbnN0YW50cy5FTEVNX1BSRVJFUV9GQUlMRURfTElTVDsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfUkVQT1JULCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBBZGQgdGVzdCBhc3NlcnRpb24gSUQuCi0gICAqIEBwYXJhbSBhc3NlcnRpb25JRCB0ZXN0IGFzc2VydGlvbiBJRC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFRlc3RBc3NlcnRpb25JRChTdHJpbmcgYXNzZXJ0aW9uSUQpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L1JlcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwYWQ1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L1JlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5XU0lEb2N1bWVudDsKLQotLyoqCi0gKiBDb25mb3JtYW5jZSB0ZXN0IHJlcG9ydC4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVwb3J0IGV4dGVuZHMgV1NJRG9jdW1lbnQsIEJ1aWxkUmVwb3J0Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9SRVBPUlQ7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX1JFUE9SVCwgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogR2V0IHJlcG9ydCBjb250ZXh0LgotICAgKiBAcmV0dXJuIHJlcG9ydCBjb250ZXh0LgotICAgKiBAc2VlICNzZXRSZXBvcnRDb250ZXh0Ci0gICAqLwotICBwdWJsaWMgUmVwb3J0Q29udGV4dCBnZXRSZXBvcnRDb250ZXh0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCByZXBvcnQgY29udGV4dC4KLSAgICogQHBhcmFtIHJlcG9ydENvbnRleHQgcmVwb3J0IGNvbnRleHQuCi0gICAqIEBzZWUgI2dldFJlcG9ydENvbnRleHQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcG9ydENvbnRleHQoUmVwb3J0Q29udGV4dCByZXBvcnRDb250ZXh0KTsKLQotICAvKioKLSAgICogR2V0IGN1cnJlbnQgYXJ0aWZhY3QuCi0gICAqIEByZXR1cm4gY3VycmVudCBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyBSZXBvcnRBcnRpZmFjdCBnZXRDdXJyZW50QXJ0aWZhY3QoKTsKLQotICAvKioKLSAgICogR2V0IGN1cnJlbnQgZW50cnkuCi0gICAqIEByZXR1cm4gY3VycmVudCBlbnRyeS4KLSAgICovCi0gIHB1YmxpYyBFbnRyeSBnZXRDdXJyZW50RW50cnkoKTsKLQotICAvKioKLSAgICogTWV0aG9kIGdldEVudHJpZXMuCi0gICAqIEByZXR1cm4gZW50cnkgbGlzdC4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEVudHJpZXMoKTsKLQotICAvKioKLSAgICogTWV0aG9kIGdldEFydGlmYWN0cy4KLSAgICogQHJldHVybiBhcnRpZmFjdHMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRBcnRpZmFjdHMoKTsKLQotICAvKioKLSAgICogR2V0IHN0YXJ0IGVsZW1lbnQgc3RyaW5nLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSBuYW1lc3BhY2UgcHJlZml4Ci0gICAqIEByZXR1cm4gc3RhcnQgZWxlbWVudCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0YXJ0WE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKTsKLQotICAvKioKLSAgICogR2V0IGVuZCBlbGVtZW50IHN0cmluZy4KLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgbmFtZXNwYWNlIHByZWZpeAotICAgKiBAcmV0dXJuIGVuZCBlbGVtZW50IHN0cmluZy4gCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVuZFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBlcnJvciBYTUwgc3RyaW5nLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSBuYW1lc3BhY2UgcHJlZml4LgotICAgKiBAcGFyYW0gZXJyb3JEZXRhaWwgYW4gZXJyb3IgZGV0YWlsLgotICAgKiBAcmV0dXJuIGVycm9yIFhNTCBzdHJpbmcuIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFcnJvclhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSwgU3RyaW5nIGVycm9yRGV0YWlsKTsKLQotICAvKioKLSAgICogR2V0IHN1bW1hcnkgcmVzdWx0LiAKLSAgICogQHJldHVybiBzdW1tYXJ5IHJlc3VsdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeVJlc3VsdCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L1JlcG9ydEFydGlmYWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L1JlcG9ydEFydGlmYWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMWZiOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnRBcnRpZmFjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5BcnRpZmFjdFR5cGU7Ci0KLS8qKgotICogUmVwb3J0IGFydGlmYWN0LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlcG9ydEFydGlmYWN0IGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9BUlRJRkFDVDsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfUkVQT1JULCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBHZXQgYXJ0aWZhY3QgdHlwZS4KLSAgICogQHJldHVybiBhcnRpZmFjdCB0eXBlLgotICAgKiBAc2VlICNzZXRUeXBlCi0gICAqLwotICBwdWJsaWMgQXJ0aWZhY3RUeXBlIGdldFR5cGUoKTsKLQotICAvKioKLSAgICogU2V0IGFydGlmYWN0IHR5cGUuCi0gICAqIEBwYXJhbSBhcnRpZmFjdFR5cGUgYXJ0aWZhY3QgdHlwZS4KLSAgICogQHNlZSAjZ2V0VHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShBcnRpZmFjdFR5cGUgYXJ0aWZhY3RUeXBlKTsKLQotICAvKioKLSAgICogQWRkIGVudHJ5LgotICAgKiBAcGFyYW0gZW50cnkgYW4gZW50cnkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFbnRyeShFbnRyeSBlbnRyeSk7Ci0KLSAgLyoqCi0gICAqIEdldCBlbnRyeSBsaXN0LgotICAgKiBAcmV0dXJuIGVudHJ5IGxpc3QuCi0gICAqLwotICBwdWJsaWMgVHJlZU1hcCBnZXRFbnRyeUxpc3QoKTsKLQotICAvKioKLSAgICogR2V0IHN0YXJ0IGVsZW1lbnQgc3RyaW5nLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSBuYW1lc3BhY2UgcHJlZml4LgotICAgKiBAcmV0dXJuIHN0YXJ0IGVsZW1lbnQgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdGFydFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBlbmQgZWxlbWVudCBzdHJpbmcuIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSBuYW1lc3BhY2UgcHJlZml4LgotICAgKiBAcmV0dXJuIGVuZCBlbGVtZW50IHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5kWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvUmVwb3J0Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTA3YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFuYWx5emVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zOwotCi0vKioKLSAqIFJlcG9ydCBjb250ZXh0LgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFJlcG9ydENvbnRleHQKLXsKLSAgLyoqCi0gICAqIFJlcG9ydCB0aXRsZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVwb3J0VGl0bGUgPSBXU0lDb25zdGFudHMuREVGQVVMVF9SRVBPUlRfVElUTEU7Ci0KLSAgLyoqCi0gICAqIFByb2ZpbGUgZGVmaW5pdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBQcm9maWxlQXNzZXJ0aW9ucyBwcm9maWxlQXNzZXJ0aW9uczsKLQotICAvKioKLSAgICogQW5hbHl6ZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgQW5hbHl6ZXIgYW5hbHl6ZXI7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSByZXBvcnQgY29udGV4dC4KLSAgICogQHBhcmFtIHJlcG9ydFRpdGxlIHJlcG9ydCB0aXRsZS4KLSAgICogQHBhcmFtIHByb2ZpbGVBc3NlcnRpb25zIHByb2ZpbGUgdGVzdCBhc3NlcnRpb25zLgotICAgKiBAcGFyYW0gYW5hbHl6ZXIgYW4gQW5hbHl6ZXIgb2JqZWN0LgotICAqLwotICBwdWJsaWMgUmVwb3J0Q29udGV4dCgKLSAgICBTdHJpbmcgcmVwb3J0VGl0bGUsCi0gICAgUHJvZmlsZUFzc2VydGlvbnMgcHJvZmlsZUFzc2VydGlvbnMsCi0gICAgQW5hbHl6ZXIgYW5hbHl6ZXIpCi0gIHsKLSAgICB0aGlzLnJlcG9ydFRpdGxlID0gcmVwb3J0VGl0bGU7Ci0gICAgdGhpcy5wcm9maWxlQXNzZXJ0aW9ucyA9IHByb2ZpbGVBc3NlcnRpb25zOwotICAgIHRoaXMuYW5hbHl6ZXIgPSBhbmFseXplcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcmVwb3J0IHRpdGxlLgotICAgKiBAcmV0dXJuIHJlcG9ydCB0aXRsZS4KLSAgICogQHNlZSAjc2V0UmVwb3J0VGl0bGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3J0VGl0bGUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVwb3J0VGl0bGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHJlcG9ydCB0aXRsZS4KLSAgICogQHBhcmFtIHJlcG9ydFRpdGxlIHJlcG9ydCB0aXRsZS4KLSAgICogQHNlZSAjZ2V0UmVwb3J0VGl0bGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcG9ydFRpdGxlKFN0cmluZyByZXBvcnRUaXRsZSkKLSAgewotICAgIHRoaXMucmVwb3J0VGl0bGUgPSByZXBvcnRUaXRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcHJvZmlsZSBkZWZpbml0aW9uLgotICAgKiBAcmV0dXJuIHByb2ZpbGUgZGVmaW5pdGlvbi4KLSAgICogQHNlZSAjc2V0UHJvZmlsZUFzc2VydGlvbnMKLSAgICovCi0gIHB1YmxpYyBQcm9maWxlQXNzZXJ0aW9ucyBnZXRQcm9maWxlQXNzZXJ0aW9ucygpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5wcm9maWxlQXNzZXJ0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgcHJvZmlsZSBkZWZpbml0aW9uLgotICAgKiBAcGFyYW0gcHJvZmlsZUFzc2VydGlvbnMgcHJvZmlsZSBkZWZpbml0aW9uLgotICAgKiBAc2VlICNnZXRQcm9maWxlQXNzZXJ0aW9ucwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvZmlsZUFzc2VydGlvbnMoUHJvZmlsZUFzc2VydGlvbnMgcHJvZmlsZUFzc2VydGlvbnMpCi0gIHsKLSAgICB0aGlzLnByb2ZpbGVBc3NlcnRpb25zID0gcHJvZmlsZUFzc2VydGlvbnM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGFuYWx5emVyLgotICAgKiBAcmV0dXJuIGFuYWx5emVyLgotICAgKiBAc2VlICNzZXRBbmFseXplcgotICAgKi8KLSAgcHVibGljIEFuYWx5emVyIGdldEFuYWx5emVyKCkKLSAgewotICAgIHJldHVybiB0aGlzLmFuYWx5emVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBhbmFseXplci4KLSAgICogQHBhcmFtIGFuYWx5emVyIGFuIEFuYWx5emVyIG9iamVjdC4KLSAgICogQHNlZSAjZ2V0QW5hbHl6ZXIKLSAgICogCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBbmFseXplcihBbmFseXplciBhbmFseXplcikKLSAgewotICAgIHRoaXMuYW5hbHl6ZXIgPSBhbmFseXplcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnRXcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvUmVwb3J0V3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlN2ZjNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnRXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudFdyaXRlcjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgdXNlZCB0byB3cml0ZSB0aGUgcmVwb3J0IGRvY3VtZW50cy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlcG9ydFdyaXRlciBleHRlbmRzIERvY3VtZW50V3JpdGVyCi17Ci0gIC8qKgotICAgKiBXcml0ZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBkb2N1bWVudCB1c2luZyB0aGUgbG9jYXRpb24KLSAgICogdGhhdCB3YXMgcHJldmlvdXNseSBzZXQgdXNpbmcgdGhlIHNldExvY2F0aW9uIG1ldGhvZC4KLSAgICogQHBhcmFtIHJlcG9ydCBhIHJlcG9ydC4KLSAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaGFzIGJlZW4gaW52b2tlZCAKLSAgICogICAgICAgICBhdCBhbiBpbGxlZ2FsIG9yIGluYXBwcm9wcmlhdGUgdGltZQotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoUmVwb3J0IHJlcG9ydCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogV3JpdGUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSByZXBvcnQgYSByZXBvcnQuCi0gICAqIEBwYXJhbSB3cml0ZXIgYSBXcml0ZXIgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoUmVwb3J0IHJlcG9ydCwgV3JpdGVyIHdyaXRlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L1JlcG9ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L1JlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTc4NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydDsKLQotLyoqCi0gKiBDb25mb3JtYW5jZSB0ZXN0IHJlcG9ydGVyIGludGVyZmFjZS4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVwb3J0ZXIgZXh0ZW5kcyBCdWlsZFJlcG9ydCwgV3JpdGVSZXBvcnQKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvV3JpdGVSZXBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvV3JpdGVSZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3MGQ5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L1dyaXRlUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIC4uCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBXcml0ZVJlcG9ydAotewotICAvKioKLSAgICogU3RhcnQgY29uZm9ybWFuY2UgcmVwb3J0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiB0aGUgYmFzZSBXUy1JIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0UmVwb3J0KCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogRmluaXNoIHRoZSBjb25mb3JtYW5jZSByZXBvcnQgYnkgYWRkaW5nIHRoZSBzdW1tYXJ5IGFuZCB0ZXN0IGNvdmVyYWdlIGluZm9ybWF0aW9uLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiB0aGUgYmFzZSBXUy1JIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGZpbmlzaFJlcG9ydCgpIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEZpbmlzaCB0aGUgY29uZm9ybWFuY2UgcmVwb3J0IGJlY2F1c2Ugb2YgYW4gYW5hbHl6ZXIgZXJyb3IuCi0gICAqIEBwYXJhbSBlcnJvckRldGFpbCBhbmFseXplciBlcnJvci4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gdGhlIGJhc2UgV1MtSSBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBmaW5pc2hSZXBvcnRXaXRoRXJyb3IoU3RyaW5nIGVycm9yRGV0YWlsKSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBHZXQgcmVwb3J0LgotICAgKiBAcmV0dXJuIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBSZXBvcnQgZ2V0UmVwb3J0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvQXJ0aWZhY3RSZWZlcmVuY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvQXJ0aWZhY3RSZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNGZjMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0FydGlmYWN0UmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFydGlmYWN0UmVmZXJlbmNlOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEFuIGFydGlmYWN0IHJlZmVyZW5jZS4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0UmVmZXJlbmNlSW1wbCBpbXBsZW1lbnRzIEFydGlmYWN0UmVmZXJlbmNlCi17Ci0gIC8qKgotICAgKiBUaW1lc3RhbXAuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHRpbWVzdGFtcCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIE9wdGlvbmFsIGRvY3VtZW50IGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgRG9jdW1lbnRFbGVtZW50IGRvY3VtZW50RWxlbWVudCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIE9wdGlvbmFsIGRvY3VtZW50IGVsZW1lbnQgbmFtZXNwYWNlIG5hbWUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnROYW1lc3BhY2VOYW1lID0gbnVsbDsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5BcnRpZmFjdFJlZmVyZW5jZSNnZXRUaW1lc3RhbXAoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUaW1lc3RhbXAoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMudGltZXN0YW1wOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQXJ0aWZhY3RSZWZlcmVuY2Ujc2V0VGltZXN0YW1wKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChTdHJpbmcgdGltZXN0YW1wKQotICB7Ci0gICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5BcnRpZmFjdFJlZmVyZW5jZSNnZXREb2N1bWVudEVsZW1lbnQoKQotICAgKi8KLSAgcHVibGljIERvY3VtZW50RWxlbWVudCBnZXREb2N1bWVudEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQXJ0aWZhY3RSZWZlcmVuY2Ujc2V0RG9jdW1lbnRFbGVtZW50KERvY3VtZW50RWxlbWVudCwgU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRFbGVtZW50KAotICAgIERvY3VtZW50RWxlbWVudCBkb2N1bWVudEVsZW1lbnQsCi0gICAgU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICB0aGlzLmRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50RWxlbWVudDsKLSAgICB0aGlzLmVsZW1lbnROYW1lc3BhY2VOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIHB3LnByaW50bG4oIiAgQXJ0aWZhY3QgUmVmZXJlbmNlOiAiKTsKLSAgICBwdy5wcmludGxuKCIgICAgdGltZXN0YW1wIC4uLi4uLi4uLi4uICIgKyB0aGlzLnRpbWVzdGFtcCk7Ci0KLSAgICBpZiAodGhpcy5kb2N1bWVudEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHB3LnByaW50bG4oCi0gICAgICAgICIgICAgZG9jdW1lbnRFbGVtZW50IC4uLi4uICIKLSAgICAgICAgICArIHRoaXMuZG9jdW1lbnRFbGVtZW50LnRvWE1MU3RyaW5nKHRoaXMuZWxlbWVudE5hbWVzcGFjZU5hbWUpKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gQ3JlYXRlIGVsZW1lbnQgCi0gICAgcHcucHJpbnQoIiAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICIgIik7Ci0gICAgcHcucHJpbnRsbihXU0lDb25zdGFudHMuQVRUUl9USU1FU1RBTVAgKyAiPVwiIiArIGdldFRpbWVzdGFtcCgpICsgIlwiPiIpOwotCi0gICAgLy8gSWYgdGhlcmUgaXMgYSBkb2N1bWVudCBlbGVtZW50LCB0aGVuIGFkZCBpdAotICAgIGlmICh0aGlzLmRvY3VtZW50RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50KGRvY3VtZW50RWxlbWVudC50b1hNTFN0cmluZyh0aGlzLmVsZW1lbnROYW1lc3BhY2VOYW1lKSk7Ci0gICAgfQotCi0gICAgLy8gRW5kIGVsZW1lbnQKLSAgICBwdy5wcmludGxuKCIgICAgPC8iICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9Bc3NlcnRpb25SZXN1bHRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvQXNzZXJ0aW9uUmVzdWx0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjJkOGNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9Bc3NlcnRpb25SZXN1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5Bc3NlcnRpb25SZXN1bHRzT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbC5Bc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5GYWlsdXJlRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUHJlcmVxRmFpbGVkTGlzdDsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET01VdGlsczsKLQotLyoqCi0gKiBUZXN0IGFzc2VydGlvbiByZXN1bHQuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgQXNzZXJ0aW9uUmVzdWx0SW1wbCBpbXBsZW1lbnRzIEFzc2VydGlvblJlc3VsdAotewotICAvKioKLSAgICogQXNzZXJ0aW9uIHJlc3VsdC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotICAvKioKLSAgICogRW50cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgRW50cnkgZW50cnkgPSBudWxsOwotCi0gIC8qKgotICAgKiBQcm9maWxlIHRlc3QgYXNzZXJ0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEZhaWx1cmUgZGV0YWlsIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIFZlY3RvciBmYWlsdXJlRGV0YWlsTGlzdCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEFzc2VydGlvbiByZXN1bHRzIG9wdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGFzc2VydGlvblJlc3VsdHNPcHRpb24gPQotICAgIG5ldyBBc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbCgpOwotCi0gIC8qKgotICAgKiBQcmVyZXEgZmFpbGVkIGxpc3QuCi0gICAqLwotICBwcm90ZWN0ZWQgUHJlcmVxRmFpbGVkTGlzdCBwcmVyZXFGYWlsZWRMaXN0ID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGFzc2VydGlvbiByZXN1bHQuCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0SW1wbCgpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCNnZXRSZXN1bHQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVzdWx0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0I3NldFJlc3VsdChqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzdWx0KFN0cmluZyByZXN1bHQpCi0gIHsKLSAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCNnZXRBc3NlcnRpb24oKQotICAgKi8KLSAgcHVibGljIFRlc3RBc3NlcnRpb24gZ2V0QXNzZXJ0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLnRlc3RBc3NlcnRpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQjc2V0QXNzZXJ0aW9uKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBc3NlcnRpb24oVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uKQotICB7Ci0gICAgdGhpcy50ZXN0QXNzZXJ0aW9uID0gdGVzdEFzc2VydGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCNnZXRFbnRyeSgpCi0gICAqLwotICBwdWJsaWMgRW50cnkgZ2V0RW50cnkoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZW50cnk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQjc2V0RW50cnkob3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVudHJ5KEVudHJ5IGVudHJ5KQotICB7Ci0gICAgdGhpcy5lbnRyeSA9IGVudHJ5OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0I2dldEZhaWx1cmVEZXRhaWxMaXN0KCkKLSAgICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0RmFpbHVyZURldGFpbExpc3QoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZmFpbHVyZURldGFpbExpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQjc2V0RmFpbHVyZURldGFpbExpc3QoamF2YS51dGlsLlZlY3RvcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZhaWx1cmVEZXRhaWxMaXN0KFZlY3RvciBmYWlsdXJlRGV0YWlsTGlzdCkKLSAgewotICAgIHRoaXMuZmFpbHVyZURldGFpbExpc3QgPSBmYWlsdXJlRGV0YWlsTGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCNnZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGdldEFzc2VydGlvblJlc3VsdHNPcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuYXNzZXJ0aW9uUmVzdWx0c09wdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCNzZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKG9yZy53c2kudGVzdC5hbmFseXplci5jb25maWcuQXNzZXJ0aW9uUmVzdWx0c09wdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFzc2VydGlvblJlc3VsdHNPcHRpb24oQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBhc3NlcnRpb25SZXN1bHRzT3B0aW9uKQotICB7Ci0gICAgdGhpcy5hc3NlcnRpb25SZXN1bHRzT3B0aW9uID0gYXNzZXJ0aW9uUmVzdWx0c09wdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCNnZXRQcmVyZXFGYWlsZWRMaXN0KCkKLSAgICovCi0gIHB1YmxpYyBQcmVyZXFGYWlsZWRMaXN0IGdldFByZXJlcUZhaWxlZExpc3QoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucHJlcmVxRmFpbGVkTGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCNzZXRQcmVyZXFGYWlsZWRMaXN0KG9yZy53c2kudGVzdC5yZXBvcnQuUHJlcmVxRmFpbGVkTGlzdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByZXJlcUZhaWxlZExpc3QoUHJlcmVxRmFpbGVkTGlzdCBwcmVyZXFGYWlsZWRMaXN0KQotICB7Ci0gICAgdGhpcy5wcmVyZXFGYWlsZWRMaXN0ID0gcHJlcmVxRmFpbGVkTGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50I3RvWE1MU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBDcmVhdGUgZWxlbWVudCAKLSAgICBwdy5wcmludCgiICAgICAgPCIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiICIpOwotICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX0lEICsgIj1cIiIgKyB0aGlzLnRlc3RBc3NlcnRpb24uZ2V0SWQoKSArICJcIiAiKTsKLSAgICBwdy5wcmludGxuKFdTSUNvbnN0YW50cy5BVFRSX1JFU1VMVCArICI9XCIiICsgdGhpcy5yZXN1bHQgKyAiXCI+Iik7Ci0KLSAgICAvLyBBREQ6IEFkZCBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIHRhcmdldHMKLQotICAgIC8vIEFkZCBwcmVyZXEgZmFpbGVkIGxpc3QKLSAgICBpZiAodGhpcy5wcmVyZXFGYWlsZWRMaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgcHcucHJpbnQocHJlcmVxRmFpbGVkTGlzdC50b1hNTFN0cmluZyhuc05hbWUpKTsKLSAgICB9Ci0KLSAgICAvLyBBREQ6IEFkZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBsYW5ndWFnZXMKLSAgICAvLyBJZiByZXN1bHQgaXMgZmFpbGVkIG9yIHdhcm5pbmcsIHRoZW4gYWRkIGZhaWx1cmUgbWVzc2FnZQotICAgIGlmICgocmVzdWx0LmVxdWFscyhSRVNVTFRfRkFJTEVEKSB8fCByZXN1bHQuZXF1YWxzKFJFU1VMVF9XQVJOSU5HKSkKLSAgICAgICYmIChhc3NlcnRpb25SZXN1bHRzT3B0aW9uLmdldFNob3dGYWlsdXJlTWVzc2FnZSgpKSkKLSAgICB7Ci0gICAgICBwdy5wcmludCgKLSAgICAgICAgIiAgICAgICAgPCIKLSAgICAgICAgICArIG5zTmFtZQotICAgICAgICAgICsgV1NJQ29uc3RhbnRzLkVMRU1fRkFJTFVSRV9NRVNTQUdFCi0gICAgICAgICAgKyAiIHhtbDpsYW5nPVwiZW5cIj4iKTsKLSAgICAgIHB3LnByaW50KERPTVV0aWxzLmNsZWFuU3RyaW5nKHRoaXMudGVzdEFzc2VydGlvbi5nZXRGYWlsdXJlTWVzc2FnZSgpKSk7Ci0gICAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9GQUlMVVJFX01FU1NBR0UgKyAiPiIpOwotICAgIH0KLQotICAgIC8vIEFERDogQWRkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGxhbmd1YWdlcwotICAgIC8vIElmIGFueSBmYWlsdXJlIGRldGFpbCBtZXNzYWdlcyB3ZXJlIHNwZWNpZmllZCwgdGhlbiBhZGQgdGhlbQotICAgIGlmICgoZmFpbHVyZURldGFpbExpc3QgIT0gbnVsbCkKLSAgICAgICYmIChhc3NlcnRpb25SZXN1bHRzT3B0aW9uLmdldFNob3dGYWlsdXJlRGV0YWlsKCkpKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmFpbHVyZURldGFpbExpc3QuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHB3LnByaW50KCgoRmFpbHVyZURldGFpbCkgaXRlcmF0b3IubmV4dCgpKS50b1hNTFN0cmluZyhuc05hbWUpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBFbmQgdGhlIGVsZW1lbnQKLSAgICBwdy5wcmludGxuKCIgICAgICA8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgLy8gUmV0dXJuIHN0cmluZwotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvRGVmYXVsdFJlcG9ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvRGVmYXVsdFJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZmRjMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0RlZmF1bHRSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBJQk0gQ29ycG9yYXRpb24sIFBhcmFzb2Z0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICBQYXJhc29mdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQXNzZXJ0aW9uUmVzdWx0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXJ0aWZhY3RSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRmFpbHVyZURldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydEFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0ZXI7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgcmVwb3J0aW5nIGVycm9ycyBmcm9tIHRoZSBhbmFseXplci4KLSAqIEV4dGVuZCB0aGlzIGNsYXNzIGZvciBzcGVjaWZpYyB0eXBlcyBvZiByZXBvcnRpbmcsIHN1Y2ggYXMgcmVwb3J0aW5nCi0gKiBpbiBkaWZmZXJlbnQgZm9ybWF0cywgcmVwb3J0aW5nIHRvIGZpbGVzLCByZXBvcnRpbmcgdG8gYSBHVUkuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgSmltIENsdW5lCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRSZXBvcnRlciBpbXBsZW1lbnRzIFJlcG9ydGVyCi17Ci0gIC8qKgotICAgKiBDb25mb3JtYW5jZSByZXBvcnQuCi0gICAqLwotICBwcm90ZWN0ZWQgUmVwb3J0IHJlcG9ydDsKLQotICAvKioKLSAgICogRG9jdW1lbnQgd3JpdGVyLgotICAgKi8KLSAgcHJvdGVjdGVkIFJlcG9ydFdyaXRlciByZXBvcnRXcml0ZXI7Ci0KLSAgLyoqCi0gICAqIEFuYWx5emVyIGNvbmZpZy4KLSAgICovCi0gIHByb3RlY3RlZCBBbmFseXplckNvbmZpZyBhbmFseXplckNvbmZpZzsKLQotICAvKioKLSAgICogQXNzZXJ0b2luIHJlc3VsdCB0eXBlLgotICAgKi8KLSAgcHJvdGVjdGVkIEFzc2VydGlvblJlc3VsdFR5cGUgYXNzZXJ0aW9uUmVzdWx0VHlwZTsKLQotICAvKioKLSAgICogRG8gbm90IGFsbG93IHRoZSByZXBvcnRlciB0byBiZSBjcmVhdGVkIHdpdGggbnVsbCBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByaXZhdGUgRGVmYXVsdFJlcG9ydGVyKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSByZXN1bHQgcmVwb3J0ZXIuCi0gICAqIEBwYXJhbSByZXBvcnQgYSBSZXBvcnQgb2JqZWN0LgotICAgKiBAcGFyYW0gcmVwb3J0V3JpdGVyIGEgUmVwb3J0V3JpdGVyT2JqZWN0LgotICAgKi8KLSAgcHVibGljIERlZmF1bHRSZXBvcnRlcihSZXBvcnQgcmVwb3J0LCBSZXBvcnRXcml0ZXIgcmVwb3J0V3JpdGVyKQotICB7Ci0gICAgdGhpcy5yZXBvcnQgPSByZXBvcnQ7Ci0gICAgdGhpcy5yZXBvcnRXcml0ZXIgPSByZXBvcnRXcml0ZXI7Ci0KLSAgICAvLyBBREQ6IFZlcmlmeSB0aGF0IHdyaXRlciBzZXQgaW4gcmVwb3J0V3JpdGVyCi0KLSAgICAvLyBHZXQgcmVwb3J0IGNvbnRleHQKLSAgICB0aGlzLmFuYWx5emVyQ29uZmlnID0KLSAgICAgIHJlcG9ydC5nZXRSZXBvcnRDb250ZXh0KCkuZ2V0QW5hbHl6ZXIoKS5nZXRBbmFseXplckNvbmZpZygpOwotICAgIHRoaXMuYXNzZXJ0aW9uUmVzdWx0VHlwZSA9Ci0gICAgICB0aGlzLmFuYWx5emVyQ29uZmlnLmdldEFzc2VydGlvblJlc3VsdHNPcHRpb24oKS5nZXRBc3NlcnRpb25SZXN1bHRUeXBlKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNzZXRDdXJyZW50QXJ0aWZhY3Qob3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRBcnRpZmFjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRBcnRpZmFjdChSZXBvcnRBcnRpZmFjdCByZXBvcnRBcnRpZmFjdCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXBvcnQuc2V0Q3VycmVudEFydGlmYWN0KHJlcG9ydEFydGlmYWN0KTsKLSAgICByZXBvcnRXcml0ZXIud3JpdGUobmV3IFN0cmluZ1JlYWRlcihyZXBvcnRBcnRpZmFjdC5nZXRTdGFydFhNTFN0cmluZygiIikpKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2VuZEN1cnJlbnRBcnRpZmFjdCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbmRDdXJyZW50QXJ0aWZhY3QoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXBvcnRXcml0ZXIud3JpdGUoCi0gICAgICBuZXcgU3RyaW5nUmVhZGVyKHJlcG9ydC5nZXRDdXJyZW50QXJ0aWZhY3QoKS5nZXRFbmRYTUxTdHJpbmcoIiIpKSk7Ci0gICAgcmVwb3J0LmVuZEN1cnJlbnRBcnRpZmFjdCgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjYWRkQXJ0aWZhY3RSZWZlcmVuY2Uob3JnLndzaS50ZXN0LnJlcG9ydC5BcnRpZmFjdFJlZmVyZW5jZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEFydGlmYWN0UmVmZXJlbmNlKEFydGlmYWN0UmVmZXJlbmNlIGFydGlmYWN0UmVmZXJlbmNlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlcG9ydFdyaXRlci53cml0ZShuZXcgU3RyaW5nUmVhZGVyKGFydGlmYWN0UmVmZXJlbmNlLnRvWE1MU3RyaW5nKCIiKSkpOwotCi0gICAgLy8gQWRkIGFydGlmYWN0IHJlZmVyZW5jZSB0byByZXBvcnQKLSAgICByZXBvcnQuYWRkQXJ0aWZhY3RSZWZlcmVuY2UoYXJ0aWZhY3RSZWZlcmVuY2UpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjc2V0Q3VycmVudEVudHJ5KG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50RW50cnkoRW50cnkgZW50cnkpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlcG9ydC5zZXRDdXJyZW50RW50cnkoZW50cnkpOwotICAgIHJlcG9ydFdyaXRlci53cml0ZSgKLSAgICAgIG5ldyBTdHJpbmdSZWFkZXIoCi0gICAgICAgIGVudHJ5LmdldFN0YXJ0WE1MU3RyaW5nKAotICAgICAgICAgICIiLAotICAgICAgICAgIHRoaXMKLSAgICAgICAgICAgIC5yZXBvcnQKLSAgICAgICAgICAgIC5nZXRSZXBvcnRDb250ZXh0KCkKLSAgICAgICAgICAgIC5nZXRBbmFseXplcigpCi0gICAgICAgICAgICAuZ2V0QW5hbHl6ZXJDb25maWcoKQotICAgICAgICAgICAgLmdldEFzc2VydGlvblJlc3VsdHNPcHRpb24oKQotICAgICAgICAgICAgLmdldFNob3dNZXNzYWdlRW50cnkoKSkpKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I3NldEN1cnJlbnRFbnRyeShvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q3VycmVudEVudmVsb3BlRW50cnkoRW50cnkgZW50cnkpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlcG9ydC5zZXRDdXJyZW50RW50cnkoZW50cnkpOwotICAgIHJlcG9ydFdyaXRlci53cml0ZSgKLSAgICAgIG5ldyBTdHJpbmdSZWFkZXIoCi0gICAgICAgIGVudHJ5LmdldFN0YXJ0WE1MU3RyaW5nKAotICAgICAgICAgICIiLAotICAgICAgICAgIHRoaXMKLSAgICAgICAgICAgIC5yZXBvcnQKLSAgICAgICAgICAgIC5nZXRSZXBvcnRDb250ZXh0KCkKLSAgICAgICAgICAgIC5nZXRBbmFseXplcigpCi0gICAgICAgICAgICAuZ2V0QW5hbHl6ZXJDb25maWcoKQotICAgICAgICAgICAgLmdldEFzc2VydGlvblJlc3VsdHNPcHRpb24oKQotICAgICAgICAgICAgLmdldFNob3dNZXNzYWdlRW50cnkoKSwKLQkJICB0cnVlKSkpOwotICB9Ci0vKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNlbmRDdXJyZW50RW50cnkoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kQ3VycmVudEVudHJ5KCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVwb3J0V3JpdGVyLndyaXRlKAotICAgICAgbmV3IFN0cmluZ1JlYWRlcihyZXBvcnQuZ2V0Q3VycmVudEVudHJ5KCkuZ2V0RW5kWE1MU3RyaW5nKCIiKSkpOwotICAgIHJlcG9ydC5lbmRDdXJyZW50RW50cnkoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2FkZEFzc2VydGlvblJlc3VsdChvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEFzc2VydGlvblJlc3VsdChBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEJhc2VkIG9uIHRoZSBjb25maWcgb3B0aW9ucywgd3JpdGUgb3V0IGFzc2VydGlvbiByZXN1bHQKLSAgICBpZiAoKGFzc2VydGlvblJlc3VsdFR5cGUuaXNBbGwoKSkKLSAgICAgIHx8ICgoYXNzZXJ0aW9uUmVzdWx0VHlwZS5pc0ZhaWxlZE9ubHkoKSkKLSAgICAgICAgJiYgKGFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHQoKS5lcXVhbHMoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQpKSkKLSAgICAgIHx8ICgoYXNzZXJ0aW9uUmVzdWx0VHlwZS5pc05vdFBhc3NlZCgpKQotICAgICAgICAmJiAoIWFzc2VydGlvblJlc3VsdC5nZXRSZXN1bHQoKS5lcXVhbHMoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQpKSkKLQkgICAgICB8fCAoKGFzc2VydGlvblJlc3VsdFR5cGUuaXNOb3RJbmZvKCkpCi0JICAgICAgICAgICAgJiYgKCFhc3NlcnRpb25SZXN1bHQuZ2V0QXNzZXJ0aW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhUZXN0QXNzZXJ0aW9uLlRZUEVfSU5GT1JNQVRJT05BTCkpKSkKLSAgICB7Ci0gICAgICByZXBvcnRXcml0ZXIud3JpdGUobmV3IFN0cmluZ1JlYWRlcihhc3NlcnRpb25SZXN1bHQudG9YTUxTdHJpbmcoIiIpKSk7Ci0gICAgfQotCi0gICAgLy8gQWRkIGFzc2VydGlvbiB0byByZXBvcnQKLSAgICByZXBvcnQuYWRkQXNzZXJ0aW9uUmVzdWx0KGFzc2VydGlvblJlc3VsdCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNnZXRBc3NlcnRpb25SZXN1bHQoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgZ2V0QXNzZXJ0aW9uUmVzdWx0KFN0cmluZyBhc3NlcnRpb25JZCkKLSAgewotICAgIC8vIEdldCB0aGUgYXNzZXJ0aW9uIHJlc3VsdCBmcm9tIHRoZSBjdXJyZW50IGFzc2VydGlvbiB0YXJnZXQKLSAgICByZXR1cm4gcmVwb3J0LmdldEFzc2VydGlvblJlc3VsdChhc3NlcnRpb25JZCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5Xcml0ZVJlcG9ydCNzdGFydFJlcG9ydCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydFJlcG9ydCgpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFdyaXRlIG91dCBzdGFydCBvZiByZXBvcnQKLSAgICByZXBvcnRXcml0ZXIud3JpdGUobmV3IFN0cmluZ1JlYWRlcihyZXBvcnQuZ2V0U3RhcnRYTUxTdHJpbmcoIiIpKSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5Xcml0ZVJlcG9ydCNmaW5pc2hSZXBvcnQoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZmluaXNoUmVwb3J0KCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gRW5kIHRoZSByZXBvcnQgZmlsZQotICAgIHJlcG9ydFdyaXRlci53cml0ZShuZXcgU3RyaW5nUmVhZGVyKHJlcG9ydC5nZXRFbmRYTUxTdHJpbmcoIiIpKSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5Xcml0ZVJlcG9ydCNmaW5pc2hSZXBvcnRXaXRoRXJyb3IoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGZpbmlzaFJlcG9ydFdpdGhFcnJvcihTdHJpbmcgZXJyb3JEZXRhaWwpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIENoZWNrIGlmIGVudHJ5IG9yIGFydGlmYWN0IG5lZWQgdG8gYmUgY2xvc2VkCi0gICAgaWYgKHRoaXMucmVwb3J0LmdldEN1cnJlbnRFbnRyeSgpICE9IG51bGwpCi0gICAgICBlbmRDdXJyZW50RW50cnkoKTsKLSAgICBpZiAodGhpcy5yZXBvcnQuZ2V0Q3VycmVudEFydGlmYWN0KCkgIT0gbnVsbCkKLSAgICAgIGVuZEN1cnJlbnRBcnRpZmFjdCgpOwotCi0gICAgLy8gRW5kIHRoZSByZXBvcnQgZmlsZQotICAgIHJlcG9ydFdyaXRlci53cml0ZSgKLSAgICAgIG5ldyBTdHJpbmdSZWFkZXIocmVwb3J0LmdldEVycm9yWE1MU3RyaW5nKCIiLCBlcnJvckRldGFpbCkpKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2NyZWF0ZUFzc2VydGlvblJlc3VsdCgpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IGNyZWF0ZUFzc2VydGlvblJlc3VsdCgpCi0gIHsKLSAgICByZXR1cm4gcmVwb3J0LmNyZWF0ZUFzc2VydGlvblJlc3VsdCgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjY3JlYXRlQXJ0aWZhY3QoKQotICAgKi8KLSAgcHVibGljIFJlcG9ydEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCkKLSAgewotICAgIHJldHVybiByZXBvcnQuY3JlYXRlQXJ0aWZhY3QoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2NyZWF0ZUVudHJ5KCkKLSAgICovCi0gIHB1YmxpYyBFbnRyeSBjcmVhdGVFbnRyeSgpCi0gIHsKLSAgICByZXR1cm4gcmVwb3J0LmNyZWF0ZUVudHJ5KCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNjcmVhdGVFbnRyeUNvbnRhaW5lcigpCi0gICAqLwotICBwdWJsaWMgRW50cnlDb250YWluZXIgY3JlYXRlRW50cnlDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIHJlcG9ydC5jcmVhdGVFbnRyeUNvbnRhaW5lcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjY3JlYXRlRmFpbHVyZURldGFpbCgpCi0gICAqLwotICBwdWJsaWMgRmFpbHVyZURldGFpbCBjcmVhdGVGYWlsdXJlRGV0YWlsKCkKLSAgewotICAgIHJldHVybiByZXBvcnQuY3JlYXRlRmFpbHVyZURldGFpbCgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuV3JpdGVSZXBvcnQjZ2V0UmVwb3J0KCkKLSAgICovCi0gIHB1YmxpYyBSZXBvcnQgZ2V0UmVwb3J0KCkKLSAgewotICAgIHJldHVybiB0aGlzLnJlcG9ydDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I3NldFByZXJlcVR5cGUoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByZXJlcVR5cGUoU3RyaW5nIHByZXJlcVR5cGUpCi0gIHsKLSAgICB0aGlzLnJlcG9ydC5zZXRQcmVyZXFUeXBlKHByZXJlcVR5cGUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvRW50cnlDb250YWluZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvRW50cnlDb250YWluZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NmQwODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0VudHJ5Q29udGFpbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiwgUGFyYXNvZnQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIFBhcmFzb2Z0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5FbnRyeUNvbnRhaW5lcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjb250YWluZXIgZm9yIG9uZSBvciBtb3JlIGVudHJpZXMuICAKLSAqIEFuIGV4YW1wbGUgd291bGQgYmUgYSBXU0RMIGRvY3VtZW50LgotICogCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgY2xhc3MgRW50cnlDb250YWluZXJJbXBsCi0gIGV4dGVuZHMgRW50cnlSZXN1bHRJbXBsCi0gIGltcGxlbWVudHMgRW50cnlDb250YWluZXIKLXsKLSAgLyoqCi0gICAqIENvbnRhaW5lciBJRC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnlDb250YWluZXIjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5pZDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5Q29udGFpbmVyI3NldElkKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkKLSAgewotICAgIHRoaXMuaWQgPSBpZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gIlsiICsgdGhpcy5pZCArICJdICIgKyB0aGlzLmFzc2VydGlvblJlc3VsdExpc3Q7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0VudHJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0VudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTFhMWI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9FbnRyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRW50cnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRW50cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGVudHJ5IGluIGEgcmVwb3J0LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgRW50cnlJbXBsIGV4dGVuZHMgRW50cnlSZXN1bHRJbXBsIGltcGxlbWVudHMgRW50cnkKLXsKLSAgLyoqCi0gICAqIEVudHJ5IHR5cGUuCi0gICAqLwotICBwcm90ZWN0ZWQgRW50cnlUeXBlIGVudHJ5VHlwZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEFydGlmYWN0IG5hbWUgKG9wdGlvbmFsKS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgYXJ0aWZhY3ROYW1lID0gbnVsbDsKLQotICAvKioKLSAgICogUmVmZXJlbmNlIElELgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZWZlcmVuY2VJRCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFBhcmVudCBlbGVtZW50IG5hbWUgKG9ubHkgdXNlZCB3aGVuIGVudHJ5IHR5cGUgaXMgInBvcnQiIG9yICJvcGVyYXRpb24iKS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUgPSBudWxsOwotCi0gIC8qKgotICAgKiBFbnRyeSBkZXRhaWwgb2JqZWN0LgotICAgKi8KLSAgcHJvdGVjdGVkIE9iamVjdCBlbnRyeURldGFpbCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEVudHJ5IGNvbnRhaW5lci4KLSAgICovCi0gIHByb3RlY3RlZCBFbnRyeUNvbnRhaW5lciBlbnRyeUNvbnRhaW5lciA9IG51bGw7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkjZ2V0RW50cnlUeXBlKCkKLSAgICovCi0gIHB1YmxpYyBFbnRyeVR5cGUgZ2V0RW50cnlUeXBlKCkKLSAgewotICAgIHJldHVybiB0aGlzLmVudHJ5VHlwZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5I3NldEVudHJ5VHlwZShFbnRyeVR5cGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbnRyeVR5cGUoRW50cnlUeXBlIGVudHJ5VHlwZSkKLSAgewotICAgIHRoaXMuZW50cnlUeXBlID0gZW50cnlUeXBlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkjZ2V0QXJ0aWZhY3ROYW1lKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3ROYW1lKCkKLSAgewotICAgIHJldHVybiB0aGlzLmFydGlmYWN0TmFtZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5I3NldEFydGlmYWN0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXJ0aWZhY3ROYW1lKFN0cmluZyBhcnRpZmFjdE5hbWUpCi0gIHsKLSAgICB0aGlzLmFydGlmYWN0TmFtZSA9IGFydGlmYWN0TmFtZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5I2dldFJlZmVyZW5jZUlEKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlSUQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlSUQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeSNzZXRSZWZlcmVuY2VJRChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VJRChTdHJpbmcgcmVmZXJlbmNlSUQpCi0gIHsKLSAgICB0aGlzLnJlZmVyZW5jZUlEID0gcmVmZXJlbmNlSUQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeSNnZXRQYXJlbnRFbGVtZW50TmFtZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudEVsZW1lbnROYW1lKCkKLSAgewotICAgIHJldHVybiB0aGlzLnBhcmVudEVsZW1lbnROYW1lOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkjc2V0UGFyZW50RWxlbWVudE5hbWUoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UGFyZW50RWxlbWVudE5hbWUoU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lKQotICB7Ci0gICAgdGhpcy5wYXJlbnRFbGVtZW50TmFtZSA9IHBhcmVudEVsZW1lbnROYW1lOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkjZ2V0RW50cnlEZXRhaWwoKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRFbnRyeURldGFpbCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5lbnRyeURldGFpbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5I3NldEVudHJ5RGV0YWlsKE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVudHJ5RGV0YWlsKE9iamVjdCBlbnRyeURldGFpbCkKLSAgewotICAgIHRoaXMuZW50cnlEZXRhaWwgPSBlbnRyeURldGFpbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5I2dldEVudHJ5Q29udGFpbmVyKCkKLSAgICovCi0gIHB1YmxpYyBFbnRyeUNvbnRhaW5lciBnZXRFbnRyeUNvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5lbnRyeUNvbnRhaW5lcjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5I3NldEVudHJ5Q29udGFpbmVyKG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnlDb250YWluZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbnRyeUNvbnRhaW5lcihFbnRyeUNvbnRhaW5lciBlbnRyeUNvbnRhaW5lcikKLSAgewotICAgIHRoaXMuZW50cnlDb250YWluZXIgPSBlbnRyeUNvbnRhaW5lcjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5UmVzdWx0I2FkZEFzc2VydGlvblJlc3VsdChBc3NlcnRpb25SZXN1bHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRBc3NlcnRpb25SZXN1bHQoQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdCkKLSAgewotICAgIHN1cGVyLmFkZEFzc2VydGlvblJlc3VsdChhc3NlcnRpb25SZXN1bHQpOwotCi0gICAgaWYgKHRoaXMuZW50cnlDb250YWluZXIgIT0gbnVsbCkKLSAgICAgIHRoaXMuZW50cnlDb250YWluZXIuYWRkQXNzZXJ0aW9uUmVzdWx0KGFzc2VydGlvblJlc3VsdCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeSNnZXRTdGFydFhNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0YXJ0WE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lLCBib29sZWFuIHNob3dMb2dFbnRyeSwgYm9vbGVhbiBlbnZlbG9wZUFydGlmYWN0VHlwZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gQ3JlYXRlIGVsZW1lbnQgCi0gICAgcHcucHJpbnQoIiAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICIgIik7Ci0KLSAgICBpZiAodGhpcy5lbnRyeVR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZW52ZWxvcGVBcnRpZmFjdFR5cGUpCi0JICB7Ci0gICAgICAJLy8gd2UgdXNlIHRoZSBzYW1lIGFjdHVhbCBlbnRyeSBmb3IgYm90aCBtZXNzYWdlIGFuZCBlbnZlbG9wZSBhcnRpZmFjdHMKLSAgICAgIAkvLyB3ZSBub3cgbmVlZCB0byBvdXRwdXQgZW50cnkgdHlwZSBuYW1lcyB0aGF0IGFjdHVhbGx5IHBlcnRhaW4gdG8gdGhlIGFydGlmYWN0IHR5cGUKLSAgICAgIAlwdy5wcmludCgKLSAgICAgICAgICAgICAgICBXU0lDb25zdGFudHMuQVRUUl9UWVBFICsgIj1cIiIgKyBnZXRDb3JyZXNwb25kaW5nRW52ZWxvcGVFbnRyeVR5cGVOYW1lKHRoaXMuZW50cnlUeXBlLmdldFR5cGVOYW1lKCkpICsgIlwiICIpOwotCSAgfQotCSAgZWxzZQotCSAgewotICAgICAgICBwdy5wcmludCgKLSAgICAgICAgICBXU0lDb25zdGFudHMuQVRUUl9UWVBFICsgIj1cIiIgKyB0aGlzLmVudHJ5VHlwZS5nZXRUeXBlTmFtZSgpICsgIlwiICIpOwotCSAgfQotICAgIH0KLQotICAgIGVsc2UgaWYgKHRoaXMuYXJ0aWZhY3ROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfVFlQRSArICI9XCJbIiArIHRoaXMuYXJ0aWZhY3ROYW1lICsgIl1cIiAiKTsKLSAgICB9Ci0KLSAgICBpZiAodGhpcy5yZWZlcmVuY2VJRCAhPSBudWxsKQotICAgICAgcHcucHJpbnQoCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1JFRkVSRU5DRV9JRCArICI9XCIiICsgWE1MVXRpbHMueG1sRXNjYXBlZFN0cmluZyh0aGlzLnJlZmVyZW5jZUlEKSArICJcIiIpOwotCi0gICAgLy8gSWYgc2VydmljZSBuYW1lIHdhcyBzZXQgdGhlbiBhZGQgaXQKLSAgICAvL2lmIChwYXJlbnRFbGVtZW50TmFtZSAhPSBudWxsKSB7Ci0gICAgLy8gIHB3LnByaW50KCIgIiArIFdTSUNvbnN0YW50cy5BVFRSX1BBUkVOVF9FTEVNRU5UX05BTUUgKyAiPVwiIiArIHRoaXMucGFyZW50RWxlbWVudE5hbWUgKyAiXCIiKTsKLSAgICAvL30KLQotICAgIC8vIEVuZCBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigiPiIpOwotCi0gICAgLy8gQUREOiBOZWVkIHRvIGNoZWNrIGZvciBjb25maWcgb3B0aW9uIHRoYXQgc3BlY2lmaWVzIAotICAgIC8vICAgICAgdGhhdCBsb2cgZW50cmllcyBzaG91bGQgYmUgYWRkZWQKLQotICAgIC8vIElmIHRhcmdldCBpcyBhIGxvZyBlbnRyeSwgdGhlbiBhZGQgcmVmZXJlbmNlIHRvIGl0Ci0gICAgaWYgKChlbnRyeVR5cGUgIT0gbnVsbCkKLSAgICAgICYmIChlbnRyeVR5cGUuZ2V0QXJ0aWZhY3RUeXBlKCkuaXNNZXNzYWdlcygpKQotICAgICAgJiYgKHNob3dMb2dFbnRyeSkpCi0gICAgewotICAgICAgTWVzc2FnZUVudHJ5IGxvZ0VudHJ5ID0gKE1lc3NhZ2VFbnRyeSkgZW50cnlEZXRhaWw7Ci0gICAgICBwdy5wcmludGxuKGxvZ0VudHJ5LnRvWE1MU3RyaW5nKFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9MT0cpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5I2dldFN0YXJ0WE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUsIGJvb2xlYW4gc2hvd0xvZ0VudHJ5KQotICB7Ci0gIAlyZXR1cm4gZ2V0U3RhcnRYTUxTdHJpbmcobmFtZXNwYWNlTmFtZSwgc2hvd0xvZ0VudHJ5LCBmYWxzZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeSNnZXRFbmRYTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbmRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgcmV0dXJuICIgICAgPC8iICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIC8vIFJldHVybiBzdHJpbmcKLSAgICByZXR1cm4gZ2V0U3RhcnRYTUxTdHJpbmcoIiIsIGZhbHNlKSArIGdldEVuZFhNTFN0cmluZygiIik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvcnJlc3BvbmRpbmdFbnZlbG9wZUVudHJ5VHlwZU5hbWUoU3RyaW5nIG1lc3NhZ2VFbnRyeVR5cGVOYW1lKQotICB7Ci0gIAlTdHJpbmcgZW52ZWxvcGVFbnRyeVR5cGVOYW1lID0gbWVzc2FnZUVudHJ5VHlwZU5hbWU7Ci0gIAlpZiAobWVzc2FnZUVudHJ5VHlwZU5hbWUgIT0gbnVsbCkKLSAgCXsKLSAgCWlmIChtZXNzYWdlRW50cnlUeXBlTmFtZS5lcXVhbHMoRW50cnlUeXBlLlRZUEVfTUVTU0FHRV9BTlkpKQotICAJCWVudmVsb3BlRW50cnlUeXBlTmFtZSA9IEVudHJ5VHlwZS5UWVBFX0VOVkVMT1BFX0FOWTsKLSAgCWVsc2UgaWYgKG1lc3NhZ2VFbnRyeVR5cGVOYW1lLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9NRVNTQUdFX1JFUVVFU1QpKQotICAJCWVudmVsb3BlRW50cnlUeXBlTmFtZSA9IEVudHJ5VHlwZS5UWVBFX0VOVkVMT1BFX1JFUVVFU1Q7Ci0gIAllbHNlIGlmIChtZXNzYWdlRW50cnlUeXBlTmFtZS5lcXVhbHMoRW50cnlUeXBlLlRZUEVfTUVTU0FHRV9SRVNQT05TRSkpCi0gIAkJZW52ZWxvcGVFbnRyeVR5cGVOYW1lID0gRW50cnlUeXBlLlRZUEVfRU5WRUxPUEVfUkVTUE9OU0U7Ci0gIAl9Ci0KLSAgCXJldHVybiBlbnZlbG9wZUVudHJ5VHlwZU5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9FbnRyeVJlc3VsdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9FbnRyeVJlc3VsdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVlYTU0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvRW50cnlSZXN1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5UmVzdWx0OwotCi1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLS8qKgotICogUmVzdWx0IGZvciBhIHNwZWNpZmljIHRlc3QgYXNzZXJ0aW9uLgotICogCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW50cnlSZXN1bHRJbXBsIGltcGxlbWVudHMgRW50cnlSZXN1bHQKLXsKLSAgLyoqCi0gICAqIEFzc2VydGlvbiByZXN1bHQgbGlzdC4KLSAgICovCi0gIHByb3RlY3RlZCBUcmVlTWFwIGFzc2VydGlvblJlc3VsdExpc3QgPSBuZXcgVHJlZU1hcCgpOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5UmVzdWx0I2FkZEFzc2VydGlvblJlc3VsdChvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEFzc2VydGlvblJlc3VsdChBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0KQotICB7Ci0gICAgdGhpcy5hc3NlcnRpb25SZXN1bHRMaXN0LnB1dCgKLSAgICAgIGFzc2VydGlvblJlc3VsdC5nZXRBc3NlcnRpb24oKS5nZXRJZCgpLAotICAgICAgYXNzZXJ0aW9uUmVzdWx0KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5UmVzdWx0I2dldEFzc2VydGlvblJlc3VsdExpc3QoKQotICAgKi8KLSAgcHVibGljIFRyZWVNYXAgZ2V0QXNzZXJ0aW9uUmVzdWx0TGlzdCgpCi0gIHsKLSAgICByZXR1cm4gYXNzZXJ0aW9uUmVzdWx0TGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5UmVzdWx0I2dldEFzc2VydGlvblJlc3VsdChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IGdldEFzc2VydGlvblJlc3VsdChTdHJpbmcgYXNzZXJ0aW9uSWQpCi0gIHsKLSAgICByZXR1cm4gKEFzc2VydGlvblJlc3VsdCkgYXNzZXJ0aW9uUmVzdWx0TGlzdC5nZXQoYXNzZXJ0aW9uSWQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvRmFpbHVyZURldGFpbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9GYWlsdXJlRGV0YWlsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQwNzBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9GYWlsdXJlRGV0YWlsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5GYWlsdXJlRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuZG9tLkVsZW1lbnRMb2NhdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET01VdGlsczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHdpbGwgLi4uCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWlsdXJlRGV0YWlsSW1wbCBpbXBsZW1lbnRzIEZhaWx1cmVEZXRhaWwKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBmYWlsdXJlTWVzc2FnZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcmVmZXJlbmNlVHlwZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcmVmZXJlbmNlSUQgPSBudWxsOwotICBwcm90ZWN0ZWQgRWxlbWVudExvY2F0aW9uIGVsZW1lbnRMb2NhdGlvbiA9IG51bGw7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRmFpbHVyZURldGFpbCNnZXRGYWlsdXJlTWVzc2FnZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZhaWx1cmVNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiB0aGlzLmZhaWx1cmVNZXNzYWdlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRmFpbHVyZURldGFpbCNzZXRGYWlsdXJlTWVzc2FnZShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlTWVzc2FnZShTdHJpbmcgZmFpbHVyZU1lc3NhZ2UpCi0gIHsKLSAgICB0aGlzLmZhaWx1cmVNZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5GYWlsdXJlRGV0YWlsI2dldFJlZmVyZW5jZVR5cGUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlKCkKLSAgewotICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZVR5cGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5GYWlsdXJlRGV0YWlsI3NldFJlZmVyZW5jZVR5cGUoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlVHlwZShTdHJpbmcgcmVmZXJlbmNlVHlwZSkKLSAgewotICAgIHRoaXMucmVmZXJlbmNlVHlwZSA9IHJlZmVyZW5jZVR5cGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5GYWlsdXJlRGV0YWlsI2dldFJlZmVyZW5jZUlEKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlSUQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlSUQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5GYWlsdXJlRGV0YWlsI3NldFJlZmVyZW5jZUlEbihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VJRG4oU3RyaW5nIHJlZmVyZW5jZUlEKQotICB7Ci0gICAgdGhpcy5yZWZlcmVuY2VJRCA9IHJlZmVyZW5jZUlEOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRmFpbHVyZURldGFpbCNnZXRFbGVtZW50TG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIEVsZW1lbnRMb2NhdGlvbiBnZXRFbGVtZW50TG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZWxlbWVudExvY2F0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRmFpbHVyZURldGFpbCNzZXRFbGVtZW50TG9jYXRpb24oRWxlbWVudExvY2F0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudExvY2F0aW9uKEVsZW1lbnRMb2NhdGlvbiBlbGVtZW50TG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLmVsZW1lbnRMb2NhdGlvbiA9IGVsZW1lbnRMb2NhdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50I3RvWE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIENyZWF0ZSBlbGVtZW50IAotICAgIHB3LnByaW50KCIgICAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICIgeG1sOmxhbmc9XCJlblwiICIpOwotCi0gICAgaWYgKHRoaXMucmVmZXJlbmNlVHlwZSAhPSBudWxsKQotICAgICAgcHcucHJpbnQoCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1JFRkVSRU5DRV9UWVBFICsgIj1cIiIgKyB0aGlzLnJlZmVyZW5jZVR5cGUgKyAiXCIgIik7Ci0KLSAgICBpZiAodGhpcy5yZWZlcmVuY2VJRCAhPSBudWxsKQotICAgICAgcHcucHJpbnQoCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1JFRkVSRU5DRV9JRCArICI9XCIiICsgdGhpcy5yZWZlcmVuY2VJRCArICJcIiAiKTsKLQotICAgIC8vIEFERDogTmVlZCB0byB1c2UgYSBkaWZmZXJlbnQgbmFtZXNwYWNlCi0gICAgLyoKLSAgICBpZiAodGhpcy5lbGVtZW50TG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgU3RyaW5nIG5zTmFtZUV4dCA9ICJyZXBvcnRleHQiOwotICAgICAgcHcucHJpbnQoInhtbG5zOiIgKyBuc05hbWVFeHQgKyAiPVwiIiArIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX1JFUE9SVCArICIvZXh0L1wiIik7Ci0gICAgICBwdy5wcmludChuc05hbWVFeHQgKyAiOiIgKyBXU0lDb25zdGFudHMuQVRUUl9MSU5FX05VTUJFUiArICI9XCIiICsgdGhpcy5lbGVtZW50TG9jYXRpb24uZ2V0TGluZU51bWJlcigpICsgIlwiICIpOwotICAgICAgcHcucHJpbnQobnNOYW1lRXh0ICsgIjoiICsgV1NJQ29uc3RhbnRzLkFUVFJfQ09MVU1OX05VTUJFUiArICI9XCIiICsgdGhpcy5lbGVtZW50TG9jYXRpb24uZ2V0Q29sdW1uTnVtYmVyKCkgKyAiXCIgIik7Ci0gICAgfQotICAgICovCi0KLSAgICAvLyBDbG9zZSBzdGFydCBlbGVtZW50Ci0gICAgcHcucHJpbnQoIj4iKTsKLQotICAgIGlmICh0aGlzLmZhaWx1cmVNZXNzYWdlICE9IG51bGwpCi0gICAgICBwdy5wcmludGxuKERPTVV0aWxzLmNsZWFuU3RyaW5nKHRoaXMuZmFpbHVyZU1lc3NhZ2UpKTsKLQotICAgIGlmICh0aGlzLmVsZW1lbnRMb2NhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50bG4oIiAiKTsKLSAgICAgIHB3LnByaW50KHRoaXMuZWxlbWVudExvY2F0aW9uLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8vIEVuZCB0aGUgZWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICAgIDwvIiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0KLSAgICAvLyBSZXR1cm4gc3RyaW5nCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL1ByZXJlcUZhaWxlZExpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvUHJlcmVxRmFpbGVkTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzZTE5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvUHJlcmVxRmFpbGVkTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5QcmVyZXFGYWlsZWRMaXN0OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gbWFpbnRhaW4gYW5kIGFjY2VzcyB0aGUgUHJlcmVxdWlzaXRlIEZhaWxlZCBMaXN0LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgUHJlcmVxRmFpbGVkTGlzdEltcGwgaW1wbGVtZW50cyBQcmVyZXFGYWlsZWRMaXN0Ci17Ci0gIC8qKgotICAgKiBMaXN0IG9mIHRlc3QgYXNzZXJ0aW9uIElEcy4KLSAgICovCi0gIHByb3RlY3RlZCBWZWN0b3IgaWRMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlByZXJlcUZhaWxlZExpc3QjYWRkVGVzdEFzc2VydGlvbklEKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRUZXN0QXNzZXJ0aW9uSUQoU3RyaW5nIGFzc2VydGlvbklEKQotICB7Ci0gICAgaWRMaXN0LmFkZChhc3NlcnRpb25JRCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50RWxlbWVudCN0b1hNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICBpZiAodGhpcy5pZExpc3Quc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICAvLyBDcmVhdGUgZWxlbWVudCAKLSAgICAgIHB3LnByaW50bG4oIiAgICAgICAgPCIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgICAvLyBJbmNsdWRlIGVhY2ggdGVzdCBhc3NlcnRpb24gSUQKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gaWRMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBwdy5wcmludCgKLSAgICAgICAgICAiICAgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fVEVTVF9BU1NFUlRJT05fSUQgKyAiPiIpOwotICAgICAgICBwdy5wcmludCgoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9URVNUX0FTU0VSVElPTl9JRCArICI+Iik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEVuZCBlbGVtZW50Ci0gICAgICBwdy5wcmludGxuKCIgICAgICAgIDwvIiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL1JlcG9ydEFydGlmYWN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL1JlcG9ydEFydGlmYWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDI5OWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9SZXBvcnRBcnRpZmFjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0QXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuQXJ0aWZhY3RUeXBlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgYSByZXBvcnQgYXJ0aWZhY3QuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRBcnRpZmFjdEltcGwgaW1wbGVtZW50cyBSZXBvcnRBcnRpZmFjdAotewotICAvKioKLSAgICogQXJ0aWZhY3QgdHlwZS4KLSAgICovCi0gIHByb3RlY3RlZCBBcnRpZmFjdFR5cGUgYXJ0aWZhY3RUeXBlID0gbnVsbDsKLQotICAvKioKLSAgICogRW50cmllcy4KLSAgICovCi0gIHByb3RlY3RlZCBUcmVlTWFwIGVudHJ5TGlzdCA9IG5ldyBUcmVlTWFwKCk7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0QXJ0aWZhY3QjZ2V0VHlwZSgpCi0gICAqLwotICBwdWJsaWMgQXJ0aWZhY3RUeXBlIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuYXJ0aWZhY3RUeXBlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0QXJ0aWZhY3Qjc2V0VHlwZShBcnRpZmFjdFR5cGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlKEFydGlmYWN0VHlwZSBhcnRpZmFjdFR5cGUpCi0gIHsKLSAgICB0aGlzLmFydGlmYWN0VHlwZSA9IGFydGlmYWN0VHlwZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydEFydGlmYWN0I2FkZEVudHJ5KEVudHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRW50cnkoRW50cnkgZW50cnkpCi0gIHsKLSAgICAvLyBBZGQgZW50cnkKLSAgICBpZiAoZW50cnkuZ2V0RW50cnlUeXBlKCkgIT0gbnVsbCkKLSAgICAgIHRoaXMuZW50cnlMaXN0LnB1dChlbnRyeS5nZXRFbnRyeVR5cGUoKS5nZXRUeXBlTmFtZSgpLCBlbnRyeSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRBcnRpZmFjdCNnZXRFbnRyeUxpc3QoKQotICAgKi8KLSAgcHVibGljIFRyZWVNYXAgZ2V0RW50cnlMaXN0KCkKLSAgewotICAgIHJldHVybiB0aGlzLmVudHJ5TGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydEFydGlmYWN0I2dldFN0YXJ0WE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIENyZWF0ZSBlbGVtZW50IAotICAgIHB3LnByaW50KCIgIDwiICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIiAiKTsKLSAgICBwdy5wcmludCgKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1RZUEUgKyAiPVwiIiArIHRoaXMuYXJ0aWZhY3RUeXBlLmdldFR5cGVOYW1lKCkgKyAiXCI+Iik7Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydEFydGlmYWN0I2dldEVuZFhNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVuZFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICByZXR1cm4gIiAgPC8iICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIC8vIFJldHVybiBzdHJpbmcKLSAgICByZXR1cm4gZ2V0U3RhcnRYTUxTdHJpbmcoIiIpICsgZ2V0RW5kWE1MU3RyaW5nKCIiKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvUmVwb3J0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL1JlcG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiMTJmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvUmVwb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFydGlmYWN0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5FbnRyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkZhaWx1cmVEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci0KLS8qKgotICogV1MtSSBjb25mb3JtYW5jZSB0ZXN0IHJlcG9ydC4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRJbXBsIGltcGxlbWVudHMgUmVwb3J0Ci17Ci0gIC8qKgotICAgKiBSZXBvcnQgZmlsZW5hbWUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKLQotICAvKioKLSAgICogUmVwb3J0IGNvbnRleHQuCi0gICAqLwotICBwcm90ZWN0ZWQgUmVwb3J0Q29udGV4dCByZXBvcnRDb250ZXh0ID0gbnVsbDsKLQotICAvKioKLSAgICogTG9nIGZpbGUuCi0gICAqLwotICBwcm90ZWN0ZWQgTG9nIGxvZyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFN1bW1hcnkgYWxsIHBhc3NlZCBmbGFnLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWxsUGFzc2VkID0gdHJ1ZTsKLQotICAvKioKLSAgICogVGVzdCBjb3ZlcmFnZS4KLSAgICovCi0gIC8vcHJvdGVjdGVkIFRlc3RDb3ZlcmFnZSB0ZXN0Q292ZXJhZ2U7Ci0KLSAgLyoqCi0gICAqIEFydGlmYWN0IGxpc3QuCi0gICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIGFydGlmYWN0TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAvKioKLSAgICogRW50cnkgbGlzdC4KLSAgICovCi0gIHByb3RlY3RlZCBWZWN0b3IgZW50cnlMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gIC8qKgotICAgKiBDdXJyZW50IGFydGlmYWN0LgotICAgKi8KLSAgcHJvdGVjdGVkIFJlcG9ydEFydGlmYWN0IGN1cnJlbnRBcnRpZmFjdCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEN1cnJlbnQgZW50cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgRW50cnkgY3VycmVudEVudHJ5ID0gbnVsbDsKLQotICAvKioKLSAgICogUHJlcmVxIHR5cGUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHByZXJlcVR5cGU7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBjb25mb3JtYW5jZSByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgUmVwb3J0SW1wbCgpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuV1NJRG9jdW1lbnQjZ2V0TG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICAvLyBHZXQgcmVwb3J0IFVSSQotICAgIC8vcmV0dXJuIHJlcG9ydFVSSTsKLSAgICByZXR1cm4gdGhpcy5maWxlbmFtZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuV1NJRG9jdW1lbnQjc2V0TG9jYXRpb24oamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyByZXBvcnRVUkkpCi0gIHsKLSAgICB0aGlzLmZpbGVuYW1lID0gcmVwb3J0VVJJOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0I2dldFJlcG9ydENvbnRleHQoKQotICAgKi8KLSAgcHVibGljIFJlcG9ydENvbnRleHQgZ2V0UmVwb3J0Q29udGV4dCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5yZXBvcnRDb250ZXh0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0I3NldFJlcG9ydENvbnRleHQob3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVwb3J0Q29udGV4dChSZXBvcnRDb250ZXh0IHJlcG9ydENvbnRleHQpCi0gIHsKLSAgICAvLyBTYXZlIGlucHV0IHJlZmVyZW5jZXMKLSAgICB0aGlzLnJlcG9ydENvbnRleHQgPSByZXBvcnRDb250ZXh0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0I2dldEN1cnJlbnRBcnRpZmFjdCgpCi0gICAqLwotICBwdWJsaWMgUmVwb3J0QXJ0aWZhY3QgZ2V0Q3VycmVudEFydGlmYWN0KCkKLSAgewotICAgIC8vIFJldHVybiBhcnRpZmFjdAotICAgIHJldHVybiB0aGlzLmN1cnJlbnRBcnRpZmFjdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I3NldEN1cnJlbnRBcnRpZmFjdChvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydEFydGlmYWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q3VycmVudEFydGlmYWN0KFJlcG9ydEFydGlmYWN0IGFydGlmYWN0KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBTYXZlIHJlZmVyZW5jZSB0byBhcnRpZmFjdAotICAgIGFydGlmYWN0TGlzdC5hZGQoYXJ0aWZhY3QpOwotCi0gICAgLy8gU2V0IGFzIGN1cnJlbnQgYXJ0aWZhY3QKLSAgICB0aGlzLmN1cnJlbnRBcnRpZmFjdCA9IGFydGlmYWN0OwotCi0gICAgLy8gU2V0IGRlZmF1bHQgcHJlcmVxIHByb2Nlc3NpbmcKLSAgICB0aGlzLnByZXJlcVR5cGUgPSBQUkVSRVFfVFlQRV9FTlRSWTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2VuZEN1cnJlbnRBcnRpZmFjdCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbmRDdXJyZW50QXJ0aWZhY3QoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBSZW1vdmUgY3VycmVudCBhcnRpZmFjdAotICAgIHRoaXMuY3VycmVudEFydGlmYWN0ID0gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2FkZEFydGlmYWN0UmVmZXJlbmNlKG9yZy53c2kudGVzdC5yZXBvcnQuQXJ0aWZhY3RSZWZlcmVuY2UpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRBcnRpZmFjdFJlZmVyZW5jZShBcnRpZmFjdFJlZmVyZW5jZSBhcnRpZmFjdFJlZmVyZW5jZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBBREQ6IEhvdyBzaG91bGQgdGhpcyBiZSBzYXZlZD8gIFNob3VsZCBpdCBiZSBhZGRlZCB0byB0aGUgY3VycmVudCBhcnRpZmFjdD8KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydCNnZXRDdXJyZW50RW50cnkoKQotICAgKi8KLSAgcHVibGljIEVudHJ5IGdldEN1cnJlbnRFbnRyeSgpCi0gIHsKLSAgICAvLyBSZXR1cm4gZW50cnkKLSAgICByZXR1cm4gdGhpcy5jdXJyZW50RW50cnk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0I2dldEN1cnJlbnRFbnRyeSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50RW52ZWxvcGVFbnRyeShFbnRyeSBlbnRyeSkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I3NldEN1cnJlbnRFbnRyeShvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q3VycmVudEVudHJ5KEVudHJ5IGVudHJ5KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBTYXZlIHJlZmVyZW5jZSB0byBlbnRyeQotICAgIGVudHJ5TGlzdC5hZGQoZW50cnkpOwotCi0gICAgLy8gU2V0IGFzIGN1cnJlbnQgZW50cnkKLSAgICB0aGlzLmN1cnJlbnRFbnRyeSA9IGVudHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRFbnRyaWVzLgotICAgKiBAcmV0dXJuIGVudHJ5IGxpc3QuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRFbnRyaWVzKCkKLSAgewotICAgIHJldHVybiBlbnRyeUxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldEFydGlmYWN0cy4KLSAgICogQHJldHVybiBhcnRpZmFjdHMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRBcnRpZmFjdHMoKQotICB7Ci0gICAgcmV0dXJuIGFydGlmYWN0TGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2VuZEN1cnJlbnRFbnRyeSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbmRDdXJyZW50RW50cnkoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBSZW1vdmUgY3VycmVudCBlbnRyeQotICAgIHRoaXMuY3VycmVudEVudHJ5ID0gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2FkZEFzc2VydGlvblJlc3VsdChvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEFzc2VydGlvblJlc3VsdChBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0KQotICB7Ci0gICAgLy8gQUREOiBOZWVkIHRvIGtlZXAganVzdCBhIHN1bW1hcnkgCi0KLSAgICAvLyBBZGQgcmVzdWx0IHRvIGN1cnJlbnQgZW50cnkKLSAgICBpZiAoY3VycmVudEVudHJ5ICE9IG51bGwpCi0gICAgewotICAgICAgY3VycmVudEVudHJ5LmFkZEFzc2VydGlvblJlc3VsdChhc3NlcnRpb25SZXN1bHQpOwotICAgIH0KLQotICAgIC8vIElmIHRoZSByZXN1bHQgd2FzIG5vdCBwYXNzZWQsIHRoZW4gc2V0IHN1bW1hcnkgZmxhZwotICAgIGlmIChhc3NlcnRpb25SZXN1bHQuZ2V0UmVzdWx0KCkuZXF1YWxzKEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEKSkKLSAgICB7Ci0gICAgICBhbGxQYXNzZWQgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNnZXRBc3NlcnRpb25SZXN1bHQoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgZ2V0QXNzZXJ0aW9uUmVzdWx0KFN0cmluZyBhc3NlcnRpb25JZCkKLSAgewotICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQgPSBudWxsOwotCi0gICAgLy8gRGV0ZXJtaW5lIHdoZXJlIHRvIGdldCB0aGUgYXNzZXJ0aW9uIHJlc3VsdCBmcm9tIAotICAgIGlmICh0aGlzLnByZXJlcVR5cGUuZXF1YWxzKFBSRVJFUV9UWVBFX0VOVFJZKSkKLSAgICAgIHJlc3VsdCA9IGN1cnJlbnRFbnRyeS5nZXRBc3NlcnRpb25SZXN1bHQoYXNzZXJ0aW9uSWQpOwotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IGN1cnJlbnRFbnRyeS5nZXRFbnRyeUNvbnRhaW5lcigpLmdldEFzc2VydGlvblJlc3VsdChhc3NlcnRpb25JZCk7Ci0KLSAgICAvLyB0aGUgYXNzZXJ0aW9uIHJlc3VsdCBpcyBub3QgZm91bmQgYXQgdGhlIGN1cnJlbnQgZW50cnksIGdvaW5nIHRocm91Z2ggYWxsIHRoZSBlbnRyaWVzCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cnlMaXN0LnNpemUoKTsgaSArKykKLSAgICAgIHsKLSAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpIGVudHJ5TGlzdC5nZXQoaSk7Ci0gICAgICAgIGlmICgocmVzdWx0ID0gZW50cnkuZ2V0QXNzZXJ0aW9uUmVzdWx0KGFzc2VydGlvbklkKSkgIT0gbnVsbCkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2NyZWF0ZUFzc2VydGlvblJlc3VsdCgpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IGNyZWF0ZUFzc2VydGlvblJlc3VsdCgpCi0gIHsKLSAgICBBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0ID0gbmV3IEFzc2VydGlvblJlc3VsdEltcGwoKTsKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbigKLSAgICAgIHJlcG9ydENvbnRleHQKLSAgICAgICAgLmdldEFuYWx5emVyKCkKLSAgICAgICAgLmdldEFuYWx5emVyQ29uZmlnKCkKLSAgICAgICAgLmdldEFzc2VydGlvblJlc3VsdHNPcHRpb24oKSk7Ci0gICAgcmV0dXJuIGFzc2VydGlvblJlc3VsdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2NyZWF0ZUVudHJ5KCkKLSAgICovCi0gIHB1YmxpYyBFbnRyeSBjcmVhdGVFbnRyeSgpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IG5ldyBFbnRyeUltcGwoKTsKLSAgICAvL2VudHJ5LnNldEFzc2VydGlvblJlc3VsdHNPcHRpb24ocmVwb3J0Q29udGV4dC5nZXRBbmFseXplcigpLmdldEFuYWx5emVyQ29uZmlnKCkuZ2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbigpKTsKLSAgICByZXR1cm4gZW50cnk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNjcmVhdGVFbnRyeUNvbnRhaW5lcigpCi0gICAqLwotICBwdWJsaWMgRW50cnlDb250YWluZXIgY3JlYXRlRW50cnlDb250YWluZXIoKQotICB7Ci0gICAgRW50cnlDb250YWluZXIgZW50cnlDb250YWluZXIgPSBuZXcgRW50cnlDb250YWluZXJJbXBsKCk7Ci0gICAgcmV0dXJuIGVudHJ5Q29udGFpbmVyOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjY3JlYXRlQXJ0aWZhY3QoKQotICAgKi8KLSAgcHVibGljIFJlcG9ydEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCkKLSAgewotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0ID0gbmV3IFJlcG9ydEFydGlmYWN0SW1wbCgpOwotICAgIHJldHVybiByZXBvcnRBcnRpZmFjdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2NyZWF0ZUZhaWx1cmVEZXRhaWwoKQotICAgKi8KLSAgcHVibGljIEZhaWx1cmVEZXRhaWwgY3JlYXRlRmFpbHVyZURldGFpbCgpCi0gIHsKLSAgICBGYWlsdXJlRGV0YWlsIGZhaWx1cmVEZXRhaWwgPSBuZXcgRmFpbHVyZURldGFpbEltcGwoKTsKLSAgICByZXR1cm4gZmFpbHVyZURldGFpbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydCNnZXRTdW1tYXJ5UmVzdWx0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeVJlc3VsdCgpCi0gIHsKLSAgICByZXR1cm4gKAotICAgICAgYWxsUGFzc2VkCi0gICAgICAgID8gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQKLSAgICAgICAgOiBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNzZXRQcmVyZXFUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcmVyZXFUeXBlKFN0cmluZyBwcmVyZXFUeXBlKQotICB7Ci0gICAgdGhpcy5wcmVyZXFUeXBlID0gcHJlcmVxVHlwZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgLy8gQUREOiAKLSAgICByZXR1cm4gIlJlcG9ydDogICI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnQjZ2V0U3RhcnRYTUxTdHJpbmcoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIENyZWF0ZSByZXBvcnQgZWxlbWVudCAKLSAgICBwdy5wcmludGxuKFdTSUNvbnN0YW50cy5YTUxfREVDTCk7Ci0gICAgcHcucHJpbnRsbigKLSAgICAgIHJlcG9ydENvbnRleHQKLSAgICAgICAgLmdldEFuYWx5emVyKCkKLSAgICAgICAgLmdldEFuYWx5emVyQ29uZmlnKCkKLSAgICAgICAgLmdldEFkZFN0eWxlU2hlZXQoKQotICAgICAgICAuZ2V0U3R5bGVTaGVldFN0cmluZygpKTsKLQotICAgIC8vIEFkZCBYTUwgY29tbWVudAotICAgIFN0cmluZyBjb21tZW50OwotICAgIGlmICgoY29tbWVudCA9IFRlc3RVdGlscy5nZXRYTUxDb21tZW50KCkpICE9IG51bGwpCi0gICAgICBwdy5wcmludChjb21tZW50KTsKLQotICAgIC8vIHJlcG9ydAotICAgIHB3LnByaW50KAotICAgICAgIjwiCi0gICAgICAgICsgbnNOYW1lCi0gICAgICAgICsgRUxFTV9OQU1FCi0gICAgICAgICsgIiAiCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLkFUVFJfTkFNRQotICAgICAgICArICI9XCIiCi0gICAgICAgICsgcmVwb3J0Q29udGV4dC5nZXRSZXBvcnRUaXRsZSgpCi0gICAgICAgICsgIlwiIik7Ci0gICAgcHcucHJpbnRsbigKLSAgICAgICIgICAgIgotICAgICAgICArIFdTSUNvbnN0YW50cy5BVFRSX1RJTUVTVEFNUAotICAgICAgICArICI9XCIiCi0gICAgICAgICsgVXRpbHMuZ2V0VGltZXN0YW1wKCkKLSAgICAgICAgKyAiXCIiKTsKLSAgICBwdy5wcmludGxuKCIgICAgeG1sbnM9XCIiICsgV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfUkVQT1JUICsgIlwiIik7Ci0gICAgcHcucHJpbnRsbigKLSAgICAgICIgICAgeG1sbnM6IgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9SRVBPUlQKLSAgICAgICAgKyAiPVwiIgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX1JFUE9SVAotICAgICAgICArICJcIiIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICAiICAgIHhtbG5zOiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfTkFNRV9XU0lfTE9HCi0gICAgICAgICsgIj1cIiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9MT0cKLSAgICAgICAgKyAiXCIiKTsKLSAgICAvL3B3LnByaW50bG4oIiAgICB4bWxuczoiICsgV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NJX0NPTU1PTiArICI9XCIiICsgV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfQ09NTU9OICsgIlwiIik7Ci0gICAgcHcucHJpbnRsbigKLSAgICAgICIgICAgeG1sbnM6IgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9BTkFMWVpFUl9DT05GSUcKLSAgICAgICAgKyAiPVwiIgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FOQUxZWkVSX0NPTkZJRwotICAgICAgICArICJcIiIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICAiICAgIHhtbG5zOiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfTkFNRV9XU0lfTU9OSVRPUl9DT05GSUcKLSAgICAgICAgKyAiPVwiIgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX01PTklUT1JfQ09ORklHCi0gICAgICAgICsgIlwiIik7Ci0gICAgcHcucHJpbnRsbigKLSAgICAgICIgICAgeG1sbnM6IgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9BU1NFUlRJT05TCi0gICAgICAgICsgIj1cIiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9BU1NFUlRJT05TCi0gICAgICAgICsgIlwiIik7Ci0gICAgcHcucHJpbnRsbigKLSAgICAgICIgICAgeG1sbnM6IgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19OQU1FX1hTSQotICAgICAgICArICI9XCIiCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLk5TX1VSSV9YU0kKLSAgICAgICAgKyAiXCI+Iik7Ci0KLSAgICAvLyBBZGQgIGFuYWx5emVyIHRvb2wgaW5mbwotICAgIHB3LnByaW50KHJlcG9ydENvbnRleHQuZ2V0QW5hbHl6ZXIoKS50b1hNTFN0cmluZyhuc05hbWUpKTsKLQotICAgIC8vIFJldHVybiBYTUwgc3RyaW5nCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnQjZ2V0RW5kWE1MU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVuZFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gQnVpbGQgc3VtbWFyeQotICAgIHB3LnByaW50KCIgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fU1VNTUFSWSArICIgIik7Ci0gICAgcHcucHJpbnRsbihXU0lDb25zdGFudHMuQVRUUl9SRVNVTFQgKyAiPVwiIiArIGdldFN1bW1hcnlSZXN1bHQoKSArICJcIj4iKTsKLQotICAgIC8vIEFERDogIERldGFpbCBzdW1tYXJ5Ci0gICAgLyoKLSAgICBwdy5wcmludCgiICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fQVJUSUZBQ1RfU1VNTUFSWSArICIgIik7Ci0gICAgcHcucHJpbnRsbihXU0lDb25zdGFudHMuQVRUUl9SRVNVTFQgKyAiPVwieHh4eFwiPiIpOwotICAgIAotICAgIHB3LnByaW50bG4oIiAgICA8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9BUlRJRkFDVF9TVU1NQVJZICsgIj4iKTsKLSAgICAqLwotCi0gICAgLy8gRW5kIGVsZW1lbnQgCi0gICAgcHcucHJpbnRsbigiICA8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9TVU1NQVJZICsgIj4iKTsKLQotICAgIC8vIEVuZCByZXBvcnQgZWxlbWVudCAKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgLy8gUmV0dXJuIFhNTCBzdHJpbmcKLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydCNnZXRFcnJvclhNTFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFcnJvclhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSwgU3RyaW5nIGVycm9yRGV0YWlsKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBCdWlsZCBhbmFseXplciBmYWlsdXJlCi0gICAgcHcucHJpbnRsbigiICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0FOQUxZWkVSX0ZBSUxVUkUgKyAiPiIpOwotCi0gICAgLy8gQWRkIGVycm9yIGRldGFpbAotICAgIHB3LnByaW50KCIgICAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9GQUlMVVJFX0RFVEFJTCArICI+Iik7Ci0gICAgcHcucHJpbnQoWE1MVXRpbHMueG1sRXNjYXBlZFN0cmluZyhlcnJvckRldGFpbCkpOwotICAgIHB3LnByaW50bG4oIiAgICA8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9GQUlMVVJFX0RFVEFJTCArICI+Iik7Ci0KLSAgICAvLyBFbmQgcmVwb3J0IGVsZW1lbnQgCi0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fQU5BTFlaRVJfRkFJTFVSRSArICI+Iik7Ci0KLSAgICAvLyBFbmQgcmVwb3J0IGVsZW1lbnQgCi0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLQotICAgIC8vIFJldHVybiBYTUwgc3RyaW5nCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50RWxlbWVudCN0b1hNTFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgcmV0dXJuIGdldFN0YXJ0WE1MU3RyaW5nKG5hbWVzcGFjZU5hbWUpICsgZ2V0RW5kWE1MU3RyaW5nKG5hbWVzcGFjZU5hbWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvUmVwb3J0V3JpdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL1JlcG9ydFdyaXRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhMDQ5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvUmVwb3J0V3JpdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5pbXBsLkRvY3VtZW50V3JpdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydFdyaXRlcjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgdXNlZCB0byB3cml0ZSB0aGUgQ29uZm9ybWFuY2UgWE1MIGRvY3VtZW50cy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0V3JpdGVySW1wbAotICBleHRlbmRzIERvY3VtZW50V3JpdGVySW1wbAotICBpbXBsZW1lbnRzIFJlcG9ydFdyaXRlcgotewotICAvKioKLSAgICogUmVwb3J0IHdyaXRlci4KLSAgICovCi0gIHB1YmxpYyBSZXBvcnRXcml0ZXJJbXBsKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IHVzaW5nIHRoZSB3cml0ZXIKLSAgICogdGhhdCB3YXMgcHJldmlvdXNseSBzZXQgdXNpbmcgdGhlIHNldFdyaXRlciBtZXRob2QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZShSZXBvcnQgcmVwb3J0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBJZiB3cml0ZXIgd2FzIG5vdCBzZXQgcHJldmlvdXNseSwgdGhlbiB0aHJvdyBleGNlcHRpb24KLSAgICBpZiAod3JpdGVyID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVwb3J0IHdyaXRlciBtdXN0IGJlIHNldCBiZWZvcmUgd3JpdGluZyByZXBvcnQuIik7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgcmVwb3J0Ci0gICAgd3JpdGUocmVwb3J0LCB0aGlzLndyaXRlcik7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZShSZXBvcnQgcmVwb3J0LCBXcml0ZXIgd3JpdGVyKQotICB7Ci0gICAgLy8gQ3JlYXRlIHByaW50IHdyaXRlcgotICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7Ci0KLSAgICAvLyBBREQ6IFdyaXRlIG91dCBjb21wbGV0ZSByZXBvcnQKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Rvb2xpbmZvLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdG9vbGluZm8ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1MWQzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdG9vbGluZm8ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgLyoqCi0jICAqIDxjb3B5cmlnaHQ+Ci0jICAqCi0jICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzICBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgKiA8L2NvcHlyaWdodD4KLSMgICovCi0KLXdzaS50b29sLnZlcnNpb249MS4xCi13c2kudG9vbC5yZWxlYXNlLmRhdGU9MjAwNC0xMS0zMAotd3NpLnRvb2wuaW1wbGVtZW50ZXI9RWNsaXBzZS5vcmcgT3JnYW5pemF0aW9uCi13c2kudG9vbC5sb2NhdGlvbj1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dzdnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0FydGlmYWN0VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvQXJ0aWZhY3RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmRkNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvQXJ0aWZhY3RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyAuLi4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0VHlwZQotewotICAvKioKLSAgICogVGhpcyB0eXBlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotICAvKioKLSAgICogUmVwb3J0QXJ0aWZhY3QgdHlwZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VOVkVMT1BFID0gImVudmVsb3BlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NRVNTQUdFID0gIm1lc3NhZ2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ESVNDT1ZFUlkgPSAiZGlzY292ZXJ5IjsKLQotICAvKioKLSAgICogUmVwb3J0QXJ0aWZhY3QgdHlwZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEFydGlmYWN0VHlwZSBBUlRJRkFDVF9UWVBFX0VOVkVMT1BFID0KLSAgICBuZXcgQXJ0aWZhY3RUeXBlKFRZUEVfRU5WRUxPUEUpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEFydGlmYWN0VHlwZSBBUlRJRkFDVF9UWVBFX01FU1NBR0UgPQotICAgIG5ldyBBcnRpZmFjdFR5cGUoVFlQRV9NRVNTQUdFKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnRpZmFjdFR5cGUgQVJUSUZBQ1RfVFlQRV9ERVNDUklQVElPTiA9Ci0gICAgbmV3IEFydGlmYWN0VHlwZShUWVBFX0RFU0NSSVBUSU9OKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnRpZmFjdFR5cGUgQVJUSUZBQ1RfVFlQRV9ESVNDT1ZFUlkgPQotICAgIG5ldyBBcnRpZmFjdFR5cGUoVFlQRV9ESVNDT1ZFUlkpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYXJ0aWZhY3QgdHlwZS4KLSAgICovCi0gIHByaXZhdGUgQXJ0aWZhY3RUeXBlKFN0cmluZyB0eXBlKQotICB7Ci0gICAgdGhpcy50eXBlID0gdHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBJcyBhcnRpZmFjdCB0eXBlIGVudmVsb3BlLgotICAgKiBAcmV0dXJuIHRydWUgaWYgYXJ0aWZhY3QgdHlwZSBlbnZlbG9wZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRW52ZWxvcGUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGUuZXF1YWxzKFRZUEVfRU5WRUxPUEUpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIGFydGlmYWN0IHR5cGUgbWVzc2FnZXMuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBhcnRpZmFjdCB0eXBlIG1lc3NhZ2VzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gdHlwZS5lcXVhbHMoVFlQRV9NRVNTQUdFKTsKLSAgfQotCi0gIC8qKgotICAgKiBJcyBhcnRpZmFjdCB0eXBlIGRlc2NyaXB0aW9uLgotICAgKiBAcmV0dXJuIHRydWUgaWYgYXJ0aWZhY3QgdHlwZSBkZXNjcmlwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIHR5cGUuZXF1YWxzKFRZUEVfREVTQ1JJUFRJT04pOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIGFydGlmYWN0IHR5cGUgZGlzY292ZXJ5LgotICAgKiBAcmV0dXJuIHRydWUgaWYgYXJ0aWZhY3QgdHlwZSBkaXNjb3ZlcnkuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0Rpc2NvdmVyeSgpCi0gIHsKLSAgICByZXR1cm4gdHlwZS5lcXVhbHMoVFlQRV9ESVNDT1ZFUlkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhcnRpZmFjdCB0eXBlLgotICAgKiBAcmV0dXJuIGFydGlmYWN0IHR5cGUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkKLSAgewotICAgIHJldHVybiB0eXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhcnRpZmFjdCB0eXBlLgotICAgKiBAcGFyYW0gdHlwZU5hbWUgYXJ0aWZhY3QgdHlwZSBuYW1lLgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgYXJ0aWZhY3QgdHlwZS4KLSAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIGFydGlmYWN0IHR5cGUgbmFtZSBpcyBpbnZhbGlkIG9yIGluYXBwcm9wcmlhdGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEFydGlmYWN0VHlwZSBuZXdBcnRpZmFjdFR5cGUoU3RyaW5nIHR5cGVOYW1lKQotICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uCi0gIHsKLSAgICBBcnRpZmFjdFR5cGUgYXJ0aWZhY3RUeXBlID0gbnVsbDsKLQotICAgIGlmICh0eXBlTmFtZS5lcXVhbHMoVFlQRV9ERVNDUklQVElPTikpCi0gICAgewotICAgICAgYXJ0aWZhY3RUeXBlID0gQVJUSUZBQ1RfVFlQRV9ERVNDUklQVElPTjsKLSAgICB9Ci0KLSAgICBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoVFlQRV9NRVNTQUdFKSkKLSAgICB7Ci0gICAgICBhcnRpZmFjdFR5cGUgPSBBUlRJRkFDVF9UWVBFX01FU1NBR0U7Ci0gICAgfQotCi0gICAgZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKFRZUEVfRU5WRUxPUEUpKQotICAgIHsKLSAgICAgIGFydGlmYWN0VHlwZSA9IEFSVElGQUNUX1RZUEVfRU5WRUxPUEU7Ci0gICAgfQotCi0gICAgZWxzZSBpZiAodHlwZU5hbWUuZXF1YWxzKFRZUEVfRElTQ09WRVJZKSkKLSAgICB7Ci0gICAgICBhcnRpZmFjdFR5cGUgPSBBUlRJRkFDVF9UWVBFX0RJU0NPVkVSWTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICJDb3VsZCBub3QgY3JlYXRlIG5ldyBhcnRpZmFjdCB0eXBlIHVzaW5nIGludmFsaWQgdHlwZSBuYW1lOiAiCi0gICAgICAgICAgKyB0eXBlTmFtZQotICAgICAgICAgICsgIi4iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYXJ0aWZhY3RUeXBlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvQmFzaWNSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvQmFzaWNSdWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjM5NTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0Jhc2ljUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHZhbGlkYXRlcyBiYXNpYyBjb25zdHJ1Y3RzIG9mIFJGQyAyNjE2LgotICogCi0gKiBAYXV0aG9yIFZvbG9kaW4KLSAqLwotcHVibGljIGNsYXNzIEJhc2ljUnVsZXMKLXsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ1IgPSAxMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIExGID0gMTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTUCA9IDMyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSFQgPSA5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRFEgPSAzNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JMRiA9ICIiICsgQ1IgKyBMRjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBTRVBBUkFUT1JTID0KLSAgICB7Ci0gICAgICAnKCcsCi0gICAgICAnKScsCi0gICAgICAnPCcsCi0gICAgICAnPicsCi0gICAgICAnQCcsCi0gICAgICAnLCcsCi0gICAgICAnOycsCi0gICAgICAnOicsCi0gICAgICAnXFwnLAotICAgICAgJ1wiJywKLSAgICAgICcvJywKLSAgICAgICdbJywKLSAgICAgICddJywKLSAgICAgICc/JywKLSAgICAgICc9JywKLSAgICAgICd7JywKLSAgICAgICd9JywKLSAgICAgIFNQLAotICAgICAgSFQgfTsKLQotICAvKioKLSAgICogQ2hlY2tpbmcgcnVsZS4KLSAgICogCQlPQ1RFVCA9ICZsdDthbnkgOC1iaXQgc2VxdWVuY2Ugb2YgZGF0YSZndDsKLSAgICogQHBhcmFtIGNoIGNoYXJhY3Rlci4KLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY2ggaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPQ1RFVChjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tpbmcgcnVsZToKLSAgICogCQlDSEFSID0gJmx0O2FueSBVUy1BU0NJSSBjaGFyYWN0ZXIgKG9jdGV0cyAwIC0gMTI3KSZndDsuCi0gICAqIEBwYXJhbSBjaCBjaGFyYWN0ZXIuCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNoIGlzIGNvbmZvcm0gdG8gcnVsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ0hBUihjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChjaCA+PSAwICYmIGNoIDw9IDEyNykgPyB0cnVlIDogZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tpbmcgcnVsZToKLSAgICogCQlVUEFMUEhBID0gJmx0O2FueSBVUy1BU0NJSSB1cHBlcmNhc2UgbGV0dGVyICJBIi4uIloiJmd0Oy4KLSAgICogQHBhcmFtIGNoIGNoYXJhY3Rlci4KLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY2ggaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVUEFMUEhBKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gKGNoID49ICdBJyAmJiBjaCA8PSAnWicpID8gdHJ1ZSA6IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNraW5nIHJ1bGU6Ci0gICAqIAkJTE9BTFBIQSA9ICZsdDthbnkgVVMtQVNDSUkgbG93ZXJjYXNlIGxldHRlciAiYSIuLiJ6IiZndDsuCi0gICAqIEBwYXJhbSBjaCBjaGFyYWN0ZXIuCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNoIGlzIGNvbmZvcm0gdG8gcnVsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTE9BTFBIQShjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSA/IHRydWUgOiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCUFMUEhBID0gVVBBTFBIQSB8IExPQUxQSEEuCi0gICAqIEBwYXJhbSBjaCBjaGFyYWN0ZXIuCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNoIGlzIGNvbmZvcm0gdG8gcnVsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQUxQSEEoY2hhciBjaCkKLSAgewotICAgIHJldHVybiAoaXNMT0FMUEhBKGNoKSB8fCBpc1VQQUxQSEEoY2gpKSA/IHRydWUgOiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCURJR0lUID0gJmx0O2FueSBVUy1BU0NJSSBkaWdpdCAiMCIuLiI5IiZndDsuCi0gICAqIEBwYXJhbSBjaCBjaGFyYWN0ZXIuCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNoIGlzIGNvbmZvcm0gdG8gcnVsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRElHSVQoY2hhciBjaCkKLSAgewotICAgIHJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgPyB0cnVlIDogZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tpbmcgcnVsZToKLSAgICogCQlDVEwgPSAmbHQ7YW55IFVTLUFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVyIChvY3RldHMgMCAtIDMxKSBhbmQgREVMICgxMjcpJmd0Oy4KLSAgICogQHBhcmFtIGNoIGNoYXJhY3Rlci4KLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY2ggaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDVEwoY2hhciBjaCkKLSAgewotICAgIHJldHVybiAoKGNoID49IDAgJiYgY2ggPD0gMzEpIHx8IGNoID09IDEyNykgPyB0cnVlIDogZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tpbmcgcnVsZToKLSAgICogCQlDUiA9ICZsdDtVUy1BU0NJSSBDUiwgY2FycmlhZ2UgcmV0dXJuICgxMykmZ3Q7LgotICAgKiBAcGFyYW0gY2ggY2hhcmFjdGVyLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjaCBpcyBjb25mb3JtIHRvIHJ1bGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NSKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gKGNoID09IENSKSA/IHRydWUgOiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCUxGID0gJmx0O1VTLUFTQ0lJIExGLCBsaW5lZmVlZCAoMTApJmd0Oy4KLSAgICogQHBhcmFtIGNoIGNoYXJhY3RlcgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjaCBpcyBjb25mb3JtIHRvIHJ1bGUsIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTEYoY2hhciBjaCkKLSAgewotICAgIHJldHVybiAoY2ggPT0gTEYpID8gdHJ1ZSA6IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNraW5nIHJ1bGU6Ci0gICAqIAkJU1AgPSAmbHQ7VVMtQVNDSUkgU1AsIHNwYWNlICgzMikmZ3Q7LgotICAgKiBAcGFyYW0gY2ggY2hhcmFjdGVyLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjaCBpcyBjb25mb3JtIHRvIHJ1bGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NQKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gKGNoID09IFNQKSA/IHRydWUgOiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCUhUID0gJmx0O1VTLUFTQ0lJIEhULCBob3Jpem9udGFsLXRhYiAoOSkmZ3Q7LgotICAgKiBAcGFyYW0gY2ggY2hhcmFjdGVyCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNoIGlzIGNvbmZvcm0gdG8gcnVsZSwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIVChjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChjaCA9PSBIVCkgPyB0cnVlIDogZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tpbmcgcnVsZToKLSAgICogCQkmbHQ7IiZndDsgPSAmbHQ7VVMtQVNDSUkgZG91YmxlLXF1b3RlIG1hcmsgKDM0KSZndDsuCi0gICAqIEBwYXJhbSBjaCBjaGFyYWN0ZXIuCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNoIGlzIGNvbmZvcm0gdG8gcnVsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG91YmxlUXVvdGUoY2hhciBjaCkKLSAgewotICAgIHJldHVybiAoY2ggPT0gRFEpID8gdHJ1ZSA6IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNraW5nIHJ1bGU6Ci0gICAqIAkJQ1JMRiA9IENSIExGLgotICAgKiBAcGFyYW0gc3RyIHN0cmluZy4KLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY2ggaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDUkxGKFN0cmluZyBzdHIpCi0gIHsKLSAgICByZXR1cm4gQ1JMRi5lcXVhbHMoc3RyKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCUxXUyA9IFtDUkxGXSAxKiggU1AgfCBIVCApLgotICAgKiBAcGFyYW0gc3RyIHN0cmluZy4KLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgc3RyIGlzIGNvbmZvcm0gdG8gcnVsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTFdTKFN0cmluZyBzdHIpCi0gIHsKLQotICAgIGludCBpbmRleCA9IGdldExhc3RJbmRleExXUyhzdHIsIDApOwotICAgIGlmIChpbmRleCA9PSAtMSB8fCBpbmRleCAhPSBzdHIubGVuZ3RoKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGxhc3QgaW5kZXggb2YgdGhlIExXUyBzdHJpbmcuCi0gICAqIEBwYXJhbSBzdHIgc3RyaW5nLgotICAgKiBAcGFyYW0gc3RhcnRJbmRleCBzdGFydCBpbmRleC4KLSAgICogQHJldHVybiBpbnQgYW4gaW5kZXggb2YgdGhlIGZpcnN0IHN5bWJvbCB3aGljaCBpc24ndCBMV1MuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRMYXN0SW5kZXhMV1MoU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBzdHIuaW5kZXhPZihDUkxGLCBzdGFydEluZGV4KTsKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICBpbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgZWxzZSBpZiAoaW5kZXggPT0gc3RhcnRJbmRleCkKLSAgICAgIGluZGV4ICs9IENSTEYubGVuZ3RoKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgaWYgKCFpc1NQKHN0ci5jaGFyQXQoaW5kZXgpKSAmJiBpc0hUKHN0ci5jaGFyQXQoaW5kZXgpKSkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGluZGV4Kys7Ci0gICAgZm9yICg7IGluZGV4IDwgc3RyLmxlbmd0aCgpOyBpbmRleCsrKQotICAgICAgaWYgKCFpc1NQKHN0ci5jaGFyQXQoaW5kZXgpKSAmJiBpc0hUKHN0ci5jaGFyQXQoaW5kZXgpKSkKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIHJldHVybiBpbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGxhc3QgaW5kZXggb2YgdGhlIFRFWFQgc3RyaW5nLgotICAgKiBURVhUID0gJmx0O2FueSBPQ1RFVCBleGNlcHQgQ1RMcywgYnV0IGluY2x1ZGluZyBMV1MmZ3Q7Ci0gICAqIEBwYXJhbSBzdHIgc3RyaW5nLgotICAgKiBAcGFyYW0gc3RhcnRJbmRleCBzdGFydCBpbmRleC4KLSAgICogQHJldHVybiBpbnQgYW4gaW5kZXggb2YgdGhlIGZpcnN0IHN5bWJvbCB3aGljaCBpc24ndCBURVhULgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TGFzdFRFWFQoU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBpbnQgaW5kZXg7Ci0gICAgZm9yIChpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDwgc3RyLmxlbmd0aCgpOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGlmICghaXNPQ1RFVChzdHIuY2hhckF0KGluZGV4KSkpCi0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgIGlmIChpc0NUTChzdHIuY2hhckF0KGluZGV4KSkpCi0gICAgICB7Ci0gICAgICAgIGludCBsYXN0TFdTID0gZ2V0TGFzdEluZGV4TFdTKHN0ciwgaW5kZXgpOwotICAgICAgICBpZiAobGFzdExXUyA9PSAtMSkKLSAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgIGluZGV4ID0gbGFzdExXUyAtIDE7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCUhFWCA9ICJBIiB8ICJCIiB8ICJDIiB8ICJEIiB8ICJFIiB8ICJGIiB8ICJhIiB8ICJiIiB8ICJjIiB8ICJkIiB8ICJlIiB8ICJmIiB8IERJR0lULgotICAgKiBAcGFyYW0gY2ggY2hhcmFjdGVyLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjaCBpcyBjb25mb3JtIHRvIHJ1bGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hFWChjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuICgKLSAgICAgIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgfHwgaXNESUdJVChjaCkpCi0gICAgICA/IHRydWUKLSAgICAgIDogZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tpbmcgcnVsZToKLSAgICogCQl0b2tlbiA9IDEqJmx0O2FueSBDSEFSIGV4Y2VwdCBDVExzIG9yIHNlcGFyYXRvcnMmZ3Q7LgotICAgKiBAcGFyYW0gc3RyIHN0cmluZy4KLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgc3RyIGlzIGNvbmZvcm0gdG8gcnVsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVG9rZW4oU3RyaW5nIHN0cikKLSAgewotICAgIGlmIChzdHIubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzdHIubGVuZ3RoKCk7IGluZGV4KyspCi0gICAgewotICAgICAgY2hhciBjaCA9IHN0ci5jaGFyQXQoaW5kZXgpOwotICAgICAgaWYgKCFpc0NIQVIoY2gpIHx8IGlzU0VQQVJBVE9SKGNoKSB8fCBpc0NUTChjaCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBpbmRleCBvZiB0aGUgInRva2VuIiBzdHJpbmcuCi0gICAqIEBwYXJhbSBzdHIgc3RyaW5nLgotICAgKiBAcGFyYW0gc3RhcnRJbmRleCBzdGFydCBpbmRleC4KLSAgICogQHJldHVybiBpbnQgYW4gaW5kZXggb2YgdGhlIGZpcnN0IHN5bWJvbCB3aGljaCBpc24ndCAidG9rZW4iLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TGFzdFRva2VuKFN0cmluZyBzdHIsIGludCBzdGFydEluZGV4KQotICB7Ci0gICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKLSAgICBmb3IgKDsgaW5kZXggPCBzdHIubGVuZ3RoKCk7IGluZGV4KyspCi0gICAgewotICAgICAgY2hhciBjaCA9IHN0ci5jaGFyQXQoaW5kZXgpOwotICAgICAgaWYgKCFpc0NIQVIoY2gpIHx8IGlzU0VQQVJBVE9SKGNoKSB8fCBpc0NUTChjaCkpCi0gICAgICAgIHJldHVybiBpbmRleDsKLQotICAgIH0KLSAgICByZXR1cm4gaW5kZXg7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tpbmcgcnVsZToKLSAgICogCQlzZXBhcmF0b3JzID0gIigiIHwgIikiIHwgIjwiIHwgIj4iIHwgIkAiCi0gICAgICogICAgICAgICAgICAgICAgIHwgIiwiIHwgIjsiIHwgIjoiIHwgIlwiIHwgPCI+Ci0gICAgICogICAgICAgICAgICAgICAgIHwgIi8iIHwgIlsiIHwgIl0iIHwgIj8iIHwgIj0iCi0gICAgICogICAgICAgICAgICAgICAgIHwgInsiIHwgIn0iIHwgU1AgfCBIVC4KLSAgICogQHBhcmFtIGNoIGNoYXJhY3Rlci4KLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY2ggaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTRVBBUkFUT1IoY2hhciBjaCkKLSAgewotICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBTRVBBUkFUT1JTLmxlbmd0aDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoY2ggPT0gU0VQQVJBVE9SU1tpbmRleF0pCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBsYXN0IGluZGV4IG9mIHRoZSAiY29tbWVudCIgc3RyaW5nLgotICAgKiAJCWNvbW1lbnQgPSAiKCIgKiggY3RleHQgfCBxdW90ZWQtcGFpciB8IGNvbW1lbnQgKSAiKSIuCi0gICAqIEBwYXJhbSBzdHIgc3RyaW5nLgotICAgKiBAcGFyYW0gc3RhcnRJbmRleCBzdGFydCBpbmRleC4KLSAgICogQHJldHVybiBpbnQgYW4gaW5kZXggb2YgdGhlIGZpcnN0IHN5bWJvbCB3aGljaCBpc24ndCAiY29tbWVudCIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRMYXN0Q29tbWVudChTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgewotCi0gICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKLSAgICBpZiAoc3RyLmxlbmd0aCgpIDw9IHN0YXJ0SW5kZXgpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJygnKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICBib29sZWFuIGJFeGl0ID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBiUXVvdGVkUGFpciA9IGZhbHNlOwotICAgIGludCBpZHggPSBzdGFydEluZGV4ICsgMTsKLSAgICB3aGlsZSAoYkV4aXQgPT0gZmFsc2UpCi0gICAgewotICAgICAgd2hpbGUgKGJRdW90ZWRQYWlyID09IGZhbHNlKQotICAgICAgewotICAgICAgICBpZHggPSBnZXRMYXN0Q3RleHQoc3RyLCBpZHgpOwotICAgICAgICBpZiAoaWR4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgICAgICByZXR1cm4gaWR4OwotICAgICAgICBpZiAoIWlzUXVvdGVkUGFpcihzdHIsIGlkeCAtIDEpKQotICAgICAgICAgIGJRdW90ZWRQYWlyID0gdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGlkeCsrOwotICAgICAgfQotICAgICAgaWYgKHN0ci5jaGFyQXQoaWR4KSA9PSAnKCcpCi0gICAgICB7Ci0gICAgICAgIGludCBpZHhOZXcgPSBnZXRMYXN0Q29tbWVudChzdHIsIGlkeCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzdHIuY2hhckF0KGlkeCkgPT0gJyknKQotICAgICAgewotICAgICAgICByZXR1cm4gaWR4ICsgMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaWR4OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBpbmRleCBvZiB0aGUgImN0ZXh0IiBzdHJpbmcuCi0gICAqIAkJY3RleHQgPSAmbHQ7YW55IFRFWFQgZXhjbHVkaW5nICIoIiBhbmQgIikiJmd0OwotICAgKiBAcGFyYW0gc3RyIHN0cmluZy4KLSAgICogQHBhcmFtIHN0YXJ0SW5kZXggc3RhcnQgaW5kZXguCi0gICAqIEByZXR1cm4gaW50IGFuIGluZGV4IG9mIHRoZSBmaXJzdCBzeW1ib2wgd2hpY2ggaXNuJ3QgImN0ZXh0Ii4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBnZXRMYXN0Q3RleHQoU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBpbnQgaWR4ID0gZ2V0TGFzdFRFWFQoc3RyLCBzdGFydEluZGV4KTsKLSAgICBpbnQgaUJyYWNrZXQgPSBzdGFydEluZGV4OwotICAgIGZvciAoOyBpQnJhY2tldCA8IGlkeDsgaUJyYWNrZXQrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyLmNoYXJBdChpQnJhY2tldCkgPT0gJygnIHx8IHN0ci5jaGFyQXQoaUJyYWNrZXQpID09ICcpJykKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChpQnJhY2tldCA8IGlkeCkKLSAgICAgIGlkeCA9IGlCcmFja2V0OwotICAgIHJldHVybiBpZHg7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBsYXN0IGluZGV4IG9mIHRoZSAicWR0ZXh0IiBzdHJpbmcuCi0gICAqIAkJcWR0ZXh0ID0gJmx0O2FueSBURVhUIGV4Y2VwdCAmbHQ7IiZndDsmZ3Q7Ci0gICAqIEBwYXJhbSBzdHIgc3RyaW5nLgotICAgKiBAcGFyYW0gc3RhcnRJbmRleCBzdGFydCBpbmRleC4KLSAgICogQHJldHVybiBpbnQgYW4gaW5kZXggb2YgdGhlIGZpcnN0IHN5bWJvbCB3aGljaCBpc24ndCAicWR0ZXh0Ii4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBnZXRMYXN0UWR0ZXh0KFN0cmluZyBzdHIsIGludCBzdGFydEluZGV4KQotICB7Ci0gICAgaW50IGlkeCA9IGdldExhc3RURVhUKHN0ciwgc3RhcnRJbmRleCk7Ci0gICAgaW50IGlCcmFja2V0ID0gc3RhcnRJbmRleDsKLSAgICBmb3IgKDsgaUJyYWNrZXQgPCBpZHg7IGlCcmFja2V0KyspCi0gICAgewotICAgICAgaWYgKHN0ci5jaGFyQXQoaUJyYWNrZXQpID09ICdcIicpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoaUJyYWNrZXQgPCBpZHgpCi0gICAgICBpZHggPSBpQnJhY2tldDsKLSAgICByZXR1cm4gaWR4OwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNraW5nIHJ1bGU6Ci0gICAqIAkJcXVvdGVkLXBhaXIgPSAiXCIgQ0hBUi4KLSAgICogQHBhcmFtIHN0ciBzdHJpbmcuCi0gICAqIEBwYXJhbSBzdGFydEluZGV4IHN0YXJ0IGluZGV4LgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBzdHIgaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNRdW90ZWRQYWlyKFN0cmluZyBzdHIsIGludCBzdGFydEluZGV4KQotICB7Ci0gICAgaWYgKHN0ci5sZW5ndGgoKSA+PSBzdGFydEluZGV4ICsgMgotICAgICAgJiYgc3RyLmNoYXJBdChzdGFydEluZGV4KSA9PSAnXFwnCi0gICAgICAmJiBpc0NIQVIoc3RyLmNoYXJBdChzdGFydEluZGV4ICsgMSkpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBpbmRleCBvZiB0aGUgInF1b3RlZC1zdHJpbmciIHN0cmluZy4KLSAgICogCQlxdW90ZWQtc3RyaW5nICA9ICggJmx0OyImZ3Q7ICoocWR0ZXh0IHwgcXVvdGVkLXBhaXIgKSAmbHQ7IiZndDsgKQotICAgKiBAcGFyYW0gc3RyIHN0cmluZy4KLSAgICogQHBhcmFtIHN0YXJ0SW5kZXggc3RhcnQgaW5kZXguCi0gICAqIEByZXR1cm4gaW50IGFuIGluZGV4IG9mIHRoZSBmaXJzdCBzeW1ib2wgd2hpY2ggaXNuJ3QgInF1b3RlZC1zdHJpbmciLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TGFzdFF1b3RlZFN0cmluZyhTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgewotCi0gICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKLSAgICBpbnQgbmV3SW5kZXggPSAwOwotCi0gICAgLy8gaWYgZW5kIGlmIHRoZSBzdHJpbmcKLSAgICBpZiAoc3RhcnRJbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICAvLyBpZiB0aGUgYmVnaW4gaXMgbm90ICciJwotICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSBEUSkKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgaW5kZXgrKzsKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBpbmRleCA9IGdldExhc3RRZHRleHQoc3RyLCBpbmRleCk7Ci0gICAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICAgIGlmIChpc1F1b3RlZFBhaXIoc3RyLCBpbmRleCAtIDEpKQotICAgICAgewotICAgICAgICBpbmRleCsrOwotICAgICAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgLy8gaWYgdGhlIGVuZCBpcyBub3QgJyInCi0gICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9IERRKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICBpbmRleCsrOwotICAgIHJldHVybiBpbmRleDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvRW50cnlUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9FbnRyeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IyNzczMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9FbnRyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyAuLi4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIEVudHJ5VHlwZQotewotICAvKioKLSAgICogUmVwb3J0QXJ0aWZhY3QgdHlwZS4KLSAgICovCi0gIHByaXZhdGUgQXJ0aWZhY3RUeXBlIGFydGlmYWN0VHlwZTsKLQotICAvKioKLSAgICogVGhpcyB0eXBlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7Ci0KLSAgLyoqCi0gICAqIEVudHJ5IHR5cGVzIGFjY2Vzc2libGUgYnkgdHlwZSBuYW1lLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmVlTWFwIGVudHJ5VHlwZU1hcCA9IG5ldyBUcmVlTWFwKCk7Ci0KLSAgLyoqCi0gICAqIEVudHJ5IHR5cGUgbmFtZXMgYWNjZXNzaWJsZSBieSBhcnRpZmFjdC4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgVHJlZU1hcCBlbnRyeVR5cGVOYW1lTWFwID0gbmV3IFRyZWVNYXAoKTsKLSAgc3RhdGljIHsKLSAgICBlbnRyeVR5cGVOYW1lTWFwLnB1dChBcnRpZmFjdFR5cGUuVFlQRV9FTlZFTE9QRSwgbmV3IFZlY3RvcigpKTsKLSAgICBlbnRyeVR5cGVOYW1lTWFwLnB1dChBcnRpZmFjdFR5cGUuVFlQRV9NRVNTQUdFLCBuZXcgVmVjdG9yKCkpOwotICAgIGVudHJ5VHlwZU5hbWVNYXAucHV0KEFydGlmYWN0VHlwZS5UWVBFX0RFU0NSSVBUSU9OLCBuZXcgVmVjdG9yKCkpOwotICAgIGVudHJ5VHlwZU5hbWVNYXAucHV0KEFydGlmYWN0VHlwZS5UWVBFX0RJU0NPVkVSWSwgbmV3IFZlY3RvcigpKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnZlbG9wZSBlbnRyeSB0eXBlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRU5WRUxPUEVfUkVRVUVTVCA9ICJyZXF1ZXN0RW52ZWxvcGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VOVkVMT1BFX1JFU1BPTlNFID0gInJlc3BvbnNlRW52ZWxvcGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VOVkVMT1BFX0FOWSA9ICJhbnlFbnZlbG9wZSI7Ci0KLSAgLyoqCi0gICAqIE1lc3NhZ2UgZW50cnkgdHlwZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01FU1NBR0VfUkVRVUVTVCA9ICJyZXF1ZXN0TWVzc2FnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUVTU0FHRV9SRVNQT05TRSA9ICJyZXNwb25zZU1lc3NhZ2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01FU1NBR0VfQU5ZID0gImFueU1lc3NhZ2UiOwotCi0gIC8qKgotICAgKiBNSU1FIGVudHJ5IHR5cGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NSU1FX1BBUlQgPSAicGFydCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUlNRV9ST09UX1BBUlQgPSAicm9vdC1wYXJ0IjsKLQotICAvKioKLSAgICogRGVzY3JpcHRpb24gZW50cnkgdHlwZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RFU0NSSVBUSU9OX0RFRklOSVRJT05TID0gImRlZmluaXRpb25zIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ERVNDUklQVElPTl9JTVBPUlQgPSAiaW1wb3J0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ERVNDUklQVElPTl9UWVBFUyA9ICJ0eXBlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfREVTQ1JJUFRJT05fTUVTU0FHRSA9ICJtZXNzYWdlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ERVNDUklQVElPTl9PUEVSQVRJT04gPSAib3BlcmF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ERVNDUklQVElPTl9QT1JUVFlQRSA9ICJwb3J0VHlwZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfREVTQ1JJUFRJT05fQklORElORyA9ICJiaW5kaW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ERVNDUklQVElPTl9QT1JUID0gInBvcnQiOwotCi0gIC8qKgotICAgKiBEaXNjb3ZlcnkgZW50cnkgdHlwZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RJU0NPVkVSWV9CSU5ESU5HVEVNUExBVEUgPSAiYmluZGluZ1RlbXBsYXRlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ESVNDT1ZFUllfVE1PREVMID0gInRNb2RlbCI7Ci0KLSAgLyoqCi0gICAqIEVudmVsb3BlIGVudHJ5IHR5cGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRyeVR5cGUgRU5UUllfVFlQRV9SRVFVRVNURU5WID0KLSAgICBuZXdFbnRyeVR5cGUoQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfRU5WRUxPUEUsIFRZUEVfRU5WRUxPUEVfUkVRVUVTVCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIEVOVFJZX1RZUEVfUkVTUE9OU0VFTlYgPQotICAgIG5ld0VudHJ5VHlwZShBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9FTlZFTE9QRSwgVFlQRV9FTlZFTE9QRV9SRVNQT05TRSk7Ci0KLSAgLyoqCi0gICAqIE1lc3NhZ2UgZW50cnkgdHlwZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudHJ5VHlwZSBFTlRSWV9UWVBFX1JFUVVFU1QgPQotICAgIG5ld0VudHJ5VHlwZShBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9NRVNTQUdFLCBUWVBFX01FU1NBR0VfUkVRVUVTVCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIEVOVFJZX1RZUEVfUkVTUE9OU0UgPQotICAgIG5ld0VudHJ5VHlwZShBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9NRVNTQUdFLCBUWVBFX01FU1NBR0VfUkVTUE9OU0UpOwotICAvLyAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRyeVR5cGUgRU5UUllfVFlQRV9BTllFTlRSWSA9IAotICAvLyAgICAgICAgbmV3IEVudHJ5VHlwZShBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9NRVNTQUdFUywgVFlQRV9NRVNTQUdFX0FOWUVOVFJZKTsKLQotICAvKioKLSAgICogRGVzY3JpcHRpb24gZW50cnkgdHlwZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudHJ5VHlwZSBFTlRSWV9UWVBFX0RFRklOSVRJT05TID0KLSAgICBuZXdFbnRyeVR5cGUoCi0gICAgICBBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9ERVNDUklQVElPTiwKLSAgICAgIFRZUEVfREVTQ1JJUFRJT05fREVGSU5JVElPTlMpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudHJ5VHlwZSBFTlRSWV9UWVBFX0lNUE9SVCA9Ci0gICAgbmV3RW50cnlUeXBlKAotICAgICAgQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfREVTQ1JJUFRJT04sCi0gICAgICBUWVBFX0RFU0NSSVBUSU9OX0lNUE9SVCk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIEVOVFJZX1RZUEVfVFlQRVMgPQotICAgIG5ld0VudHJ5VHlwZSgKLSAgICAgIEFydGlmYWN0VHlwZS5BUlRJRkFDVF9UWVBFX0RFU0NSSVBUSU9OLAotICAgICAgVFlQRV9ERVNDUklQVElPTl9UWVBFUyk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIEVOVFJZX1RZUEVfTUVTU0FHRSA9Ci0gICAgbmV3RW50cnlUeXBlKAotICAgICAgQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfREVTQ1JJUFRJT04sCi0gICAgICBUWVBFX0RFU0NSSVBUSU9OX01FU1NBR0UpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudHJ5VHlwZSBFTlRSWV9UWVBFX09QRVJBVElPTiA9Ci0gICAgbmV3RW50cnlUeXBlKAotICAgICAgQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfREVTQ1JJUFRJT04sCi0gICAgICBUWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIEVOVFJZX1RZUEVfUE9SVFRZUEUgPQotICAgIG5ld0VudHJ5VHlwZSgKLSAgICAgIEFydGlmYWN0VHlwZS5BUlRJRkFDVF9UWVBFX0RFU0NSSVBUSU9OLAotICAgICAgVFlQRV9ERVNDUklQVElPTl9QT1JUVFlQRSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIEVOVFJZX1RZUEVfQklORElORyA9Ci0gICAgbmV3RW50cnlUeXBlKAotICAgICAgQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfREVTQ1JJUFRJT04sCi0gICAgICBUWVBFX0RFU0NSSVBUSU9OX0JJTkRJTkcpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudHJ5VHlwZSBFTlRSWV9UWVBFX1BPUlQgPQotICAgIG5ld0VudHJ5VHlwZShBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9ERVNDUklQVElPTiwgVFlQRV9ERVNDUklQVElPTl9QT1JUKTsKLQotICAvKioKLSAgICogRGlzY292ZXJ5IGVudHJ5IHR5cGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRyeVR5cGUgRU5UUllfVFlQRV9CSU5ESU5HVEVNUExBVEUgPQotICAgIG5ld0VudHJ5VHlwZSgKLSAgICAgIEFydGlmYWN0VHlwZS5BUlRJRkFDVF9UWVBFX0RJU0NPVkVSWSwKLSAgICAgIFRZUEVfRElTQ09WRVJZX0JJTkRJTkdURU1QTEFURSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIEVOVFJZX1RZUEVfVE1PREVMID0KLSAgICBuZXdFbnRyeVR5cGUoQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfRElTQ09WRVJZLCBUWVBFX0RJU0NPVkVSWV9UTU9ERUwpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgZW50cnkgdHlwZS4KLSAgICovCi0gIHByaXZhdGUgRW50cnlUeXBlKEFydGlmYWN0VHlwZSBhcnRpZmFjdFR5cGUsIFN0cmluZyB0eXBlTmFtZSkKLSAgewotICAgIHRoaXMuYXJ0aWZhY3RUeXBlID0gYXJ0aWZhY3RUeXBlOwotICAgIHRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBJcyBlbnRyeSB0eXBlIGVxdWFsIHRvIHNwZWNpZmllZCB0eXBlLgotICAgKiBAcGFyYW0gdHlwZU5hbWUgZW50cnkgdHlwZSBuYW1lLgotICAgKiBAcmV0dXJuIHRydWUgaWYgZW50cnkgdHlwZSBlcXVhbCB0byBzcGVjaWZpZWQgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVHlwZShTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICByZXR1cm4gdGhpcy50eXBlTmFtZS5lcXVhbHModHlwZU5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIGVudHJ5IHR5cGUgZXF1YWwgdG8gc3BlY2lmaWVkIHR5cGUuCi0gICAqIEBwYXJhbSBlbnRyeVR5cGUgZW50cnkgdHlwZS4KLSAgICogQHJldHVybiB0cnVlIGlmIGVudHJ5IHR5cGUgZXF1YWwgdG8gc3BlY2lmaWVkIHR5cGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1R5cGUoRW50cnlUeXBlIGVudHJ5VHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlTmFtZS5lcXVhbHMoZW50cnlUeXBlLmdldFR5cGVOYW1lKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhcnRpZmFjdCB0eXBlLgotICAgKiBAcmV0dXJuIGFydGlmYWN0IHR5cGUuCi0gICAqLwotICBwdWJsaWMgQXJ0aWZhY3RUeXBlIGdldEFydGlmYWN0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gYXJ0aWZhY3RUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBlbnRyeSB0eXBlIG5hbWUuCi0gICAqIEByZXR1cm4gZW50cnkgdHlwZSBuYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gdHlwZU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogSXMgdmFsaWQgZW50cnkgdHlwZS4KLSAgICogQHBhcmFtIHR5cGVOYW1lIGVudHJ5IHR5cGUgbmFtZS4KLSAgICogQHJldHVybiB0cnVlIGlmIGVudHJ5IHR5cGUgbmFtZSBpcyB2YWxpZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1ZhbGlkRW50cnlUeXBlKFN0cmluZyB0eXBlTmFtZSkKLSAgewotICAgIHJldHVybiAoZW50cnlUeXBlTWFwLmdldCh0eXBlTmFtZSkgPT0gbnVsbCA/IGZhbHNlIDogdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGVudHJ5IHR5cGUuCi0gICAqIEBwYXJhbSB0eXBlTmFtZSBlbnRyeSB0eXBlIG5hbWUuCi0gICAqIEByZXR1cm4gZW50cnkgdHlwZS4KLSAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIGVudHJ5IHR5cGUgbmFtZSBpcyBpbnZhbGlkIG9yIGluYXBwcm9wcmlhdGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudHJ5VHlwZSBnZXRFbnRyeVR5cGUoU3RyaW5nIHR5cGVOYW1lKQotICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBHZXQgdGhlIGVudHJ5IHR5cGUgYnkgdHlwZSBuYW1lCi0gICAgRW50cnlUeXBlIGVudHJ5VHlwZSA9IChFbnRyeVR5cGUpIGVudHJ5VHlwZU1hcC5nZXQodHlwZU5hbWUpOwotCi0gICAgaWYgKGVudHJ5VHlwZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAiQ291bGQgbm90IGdldCBlbnRyeSB0eXBlIGJlY2F1c2UgdHlwZSBuYW1lIGlzIGludmFsaWQ6ICIKLSAgICAgICAgICArIHR5cGVOYW1lCi0gICAgICAgICAgKyAiLiIpOwotICAgIH0KLQotICAgIHJldHVybiBlbnRyeVR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGxpc3Qgb2YgZW50cnkgdHlwZSBuYW1lcyBmb3IgYSBzcGVjaWZpZWQgYXJ0aWZhY3QgdHlwZSBuYW1lLgotICAgKiBAcGFyYW0gYXJ0aWZhY3RUeXBlTmFtZSBhcnRpZmFjdCB0eXBlIG5hbWUuCi0gICAqIEByZXR1cm4gbGlzdCBvZiBlbnRyeSB0eXBlIG5hbWVzIGZvciBhIHNwZWNpZmllZCBhcnRpZmFjdCB0eXBlIG5hbWUuCi0gICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiBlbnRyeSB0eXBlIG5hbWUgaXMgaW52YWxpZCBvciBpbmFwcHJvcHJpYXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBWZWN0b3IgZ2V0RW50cnlUeXBlTmFtZUxpc3QoU3RyaW5nIGFydGlmYWN0VHlwZU5hbWUpCi0gICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCBsaXN0Ci0gICAgVmVjdG9yIGVudHJ5VHlwZU5hbWVMaXN0ID0gKFZlY3RvcikgZW50cnlUeXBlTmFtZU1hcC5nZXQoYXJ0aWZhY3RUeXBlTmFtZSk7Ci0KLSAgICAvLyBJZiB0aGUgbGlzdCB3YXMgbm90IGZvdW5kLCB0aGVuIHRocm93IGFuIGV4Y2VwdGlvbgotICAgIGlmIChlbnRyeVR5cGVOYW1lTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAiQ291bGQgbm90IGdldCBlbnRyeSB0eXBlIG5hbWUgbGlzdCBiZWNhdXNlIGFydGlmYWN0IHR5cGUgbmFtZSBpcyBpbnZhbGlkOiAiCi0gICAgICAgICAgKyBhcnRpZmFjdFR5cGVOYW1lCi0gICAgICAgICAgKyAiLiIpOwotICAgIH0KLQotICAgIHJldHVybiBlbnRyeVR5cGVOYW1lTGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbGlzdCBvZiB0eXBlIG5hbWVzIGZvciBhIHNwZWNpZmllZCBhcnRpZmFjdCB0eXBlIG5hbWUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnRyeVR5cGUgbmV3RW50cnlUeXBlKAotICAgIEFydGlmYWN0VHlwZSBhcnRpZmFjdFR5cGUsCi0gICAgU3RyaW5nIHR5cGVOYW1lKQotICB7Ci0gICAgRW50cnlUeXBlIGVudHJ5VHlwZSA9IG51bGw7Ci0KLSAgICAvLyBDcmVhdGUgZW50cnkgdHlwZQotICAgIGVudHJ5VHlwZSA9IG5ldyBFbnRyeVR5cGUoYXJ0aWZhY3RUeXBlLCB0eXBlTmFtZSk7Ci0KLSAgICAvLyBBZGQgdG8gZW50cnkgdHlwZSBtYXAKLSAgICBlbnRyeVR5cGVNYXAucHV0KHR5cGVOYW1lLCBlbnRyeVR5cGUpOwotCi0gICAgLy8gR2V0IHRoZSBlbnRyeSB0eXBlIG5hbWUgdmVjdG9yIGZvciB0aGUgYXJ0aWZhY3QgdHlwZQotICAgIFZlY3RvciBlbnRyeVR5cGVOYW1lTGlzdCA9Ci0gICAgICAoVmVjdG9yKSBlbnRyeVR5cGVOYW1lTWFwLmdldChhcnRpZmFjdFR5cGUuZ2V0VHlwZU5hbWUoKSk7Ci0KLSAgICAvLyBBZGQgdGhlIHR5cGUgbmFtZSB0byB0aGUgbGlzdAotICAgIGVudHJ5VHlwZU5hbWVMaXN0LmFkZCh0eXBlTmFtZSk7Ci0KLSAgICByZXR1cm4gZW50cnlUeXBlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9FcnJvckxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0Vycm9yTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTU5N2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0Vycm9yTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoZSBjbGFzcyBhY2N1bXVsYXRlcyBhbGwgZXJyb3Igc3RyaW5ncyBpbnRvIHN0cmluZyBidWZmZXIuCi0gKiAKLSAqIEBhdXRob3IgS3VsaWsKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVycm9yTGlzdAotewotICBwcml2YXRlIFNldCBlcnJvcnMgPSBuZXcgSGFzaFNldCgpOwotICBwcml2YXRlIE1lc3NhZ2VGb3JtYXQgZm9ybWF0ID0gbmV3IE1lc3NhZ2VGb3JtYXQoInswfTp7MX0iKTsKLSAgcHJpdmF0ZSBGaWVsZFBvc2l0aW9uIHBvcyA9IG5ldyBGaWVsZFBvc2l0aW9uKDApOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjT2JqZWN0KCkKLSAgICovCi0gIHB1YmxpYyBFcnJvckxpc3QoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0IGVycm9yIGxpc3QgdXNpbmcgY29udGVudHMgb2YgYSBsaXN0LgotICAgKiBAcGFyYW0gbGlzdCBhIExpc3Qgb2JqZWN0LgotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjT2JqZWN0KCkKLSAgICovCi0gIHB1YmxpYyBFcnJvckxpc3QoTGlzdCBsaXN0KQotICB7Ci0gICAgYWRkKGxpc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlIGZvcm1hdC4KLSAgICogQHBhcmFtIGYgYSBtZXNzYWdlIGZvcm1hdC4KLSAgICovCi0gIHB1YmxpYyBFcnJvckxpc3QoTWVzc2FnZUZvcm1hdCBmKQotICB7Ci0gICAgaWYgKGYgIT0gbnVsbCkKLSAgICAgIGZvcm1hdCA9IGY7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGxpc3QuIAotICAgKiBAcGFyYW0gbGlzdCBsaXN0IG9mIGVycm9ycy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZChMaXN0IGxpc3QpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGFkZCgoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGVycm9yIGRlc2NyaXB0aW9uIGludG8gdGhlIGxpc3QuIAotICAgKiBAcGFyYW0gczEgYSBzdHJpbmcuCi0gICAqIEBwYXJhbSBzMiBhIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgczEsIFN0cmluZyBzMikKLSAgewotICAgIGVycm9ycy5hZGQobmV3IFBhaXIoczEsIHMyKSk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBlcnJvciBkZXNjcmlwdGlvbiBpbnRvIHRoZSBsaXN0LgotICAgKiBAcGFyYW0gcSBhIFFOYW1lIG9iamVjdC4KLSAgICogQHBhcmFtIHMgYSBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGQoUU5hbWUgcSwgU3RyaW5nIHMpCi0gIHsKLSAgICBlcnJvcnMuYWRkKG5ldyBQYWlyKE51bGxVdGlsLnRvU3RyaW5nKHEpLCBzKSk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBlcnJvciBkZXNjcmlwdGlvbiBpbnRvIHRoZSBsaXN0LgotICAgKiBAcGFyYW0gcTEgYSBRTmFtZSBvYmplY3QuCi0gICAqIEBwYXJhbSBxMiBhIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZChRTmFtZSBxMSwgUU5hbWUgcTIpCi0gIHsKLSAgICBlcnJvcnMuYWRkKG5ldyBQYWlyKE51bGxVdGlsLnRvU3RyaW5nKHExKSwgTnVsbFV0aWwudG9TdHJpbmcocTIpKSk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBlcnJvciBkZXNjcmlwdGlvbiBpbnRvIHRoZSBsaXN0Li4uCi0gICAqIEBwYXJhbSBxIGEgUU5hbWUgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkKFFOYW1lIHEpCi0gIHsKLSAgICBlcnJvcnMuYWRkKG5ldyBQYWlyKE51bGxVdGlsLnRvU3RyaW5nKHEpLCBudWxsKSk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBlcnJvciBkZXNjcmlwdGlvbiBpbnRvIHRoZSBsaXN0LgotICAgKiBAcGFyYW0gcyBhIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgcykKLSAgewotICAgIGVycm9ycy5hZGQobmV3IFBhaXIocywgbnVsbCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGVycm9yIGxpc3Qgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiAKLSAgICogQHJldHVybiB0aGUgZXJyb3IgbGlzdCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIAotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgSXRlcmF0b3IgaXQgPSBlcnJvcnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFBhaXIgcCA9IChQYWlyKSBpdC5uZXh0KCk7Ci0gICAgICBpZiAocC5nZXRGaXJzdCgpICE9IG51bGwgJiYgcC5nZXRTZWNvbmQoKSAhPSBudWxsKQotICAgICAgICBmb3JtYXQuZm9ybWF0KG5ldyBPYmplY3RbXSB7IHAuZ2V0Rmlyc3QoKSwgcC5nZXRTZWNvbmQoKX0sIGJ1ZiwgcG9zKTsKLSAgICAgIGVsc2UgaWYgKHAuZ2V0Rmlyc3QoKSAhPSBudWxsKQotICAgICAgICBidWYuYXBwZW5kKHAuZ2V0Rmlyc3QoKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGJ1Zi5hcHBlbmQocC5nZXRTZWNvbmQoKSk7Ci0gICAgICBpZiAoaXQuaGFzTmV4dCgpKQotICAgICAgICBidWYuYXBwZW5kKCIsXG4iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgZXJyb3IgbGlzdCBpcyBlbXB0eSBvciBub3QuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBlcnJvciBsaXN0IGlzIGVtcHR5LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JzLnNpemUoKSA9PSAwOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9IVFRQQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9IVFRQQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YjA1MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvSFRUUENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIHNldCBvZiBIVFRQIHZhbHVlcyB0aGF0IGFyZSBkZWZpbmVkIGJ5IE5ldHdvcmsgV29ya2luZyBHcm91cC4KLSAqIGh0dHA6Ly93d3cuaWV0Zi5vcmcvCi0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAYXV0aG9yIElseWEgS2Fub25pcm92IChraW9AaXNnLmF4bW9yLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIEhUVFBDb25zdGFudHMgewotICAvLyBUaGUgc3RhbmRhcmRpemVkIEhUVFAgSGVhZGVyIGZpZWxkLW5hbWVzCi0gIC8vIGh0dHA6Ly93d3cubW5vdC5uZXQvZHJhZnRzL2RyYWZ0LW5vdHRpbmdoYW0taHR0cC1oZWFkZXItcmVnLTAwLnR4dAotCi0gIC8vIEh5cGVydGV4dCBUcmFuc2ZlciBQcm90b2NvbCAtLSBIVFRQLzEuMSAob2Jzb2xldGVzIFJGQzIwNjgpCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BQ0NFUFQgPSAiQWNjZXB0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FDQ0VQVF9DSEFSU0VUID0gIkFjY2VwdC1DaGFyc2V0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FDQ0VQVF9FTkNPRElORyA9ICJBY2NlcHQtRW5jb2RpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUNDRVBUX0xBTkdVQUdFID0gIkFjY2VwdC1MYW5ndWFnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BQ0NFUFRfUkFOR0VTID0gIkFjY2VwdC1SYW5nZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUdFID0gIkFnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BTExPVyA9ICJBbGxvdyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BVVRIT1JJWkFUSU9OID0gIkF1dGhvcml6YXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ0FDSEVfQ09OVFJPTCA9ICJDYWNoZS1Db250cm9sIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTk5FQ1QgPSAiQ29ubmVjdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX0VOQ09ESU5HID0gIkNvbnRlbnQtRW5jb2RpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9MQU5HVUFHRSA9ICJDb250ZW50LUxhbmd1YWdlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfTEVOR1RIID0gIkNvbnRlbnQtTGVuZ3RoIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfTE9DQVRJT04gPSAiQ29udGVudC1Mb2NhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX01ENSA9ICJDb250ZW50LU1ENSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX1JBTkdFID0gIkNvbnRlbnQtUmFuZ2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9UWVBFID0gIkNvbnRlbnQtVHlwZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9EQVRFID0gIkRhdGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRVRBRyA9ICJFVGFnIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0VYUEVDVCA9ICJFeHBlY3QiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRVhQSVJFUyA9ICJFeHBpcmVzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0ZST00gPSAiRnJvbSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9IT1NUID0gIkhvc3QiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfSUZfTUFUQ0ggPSAiSWYtTWF0Y2giOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfSUZfTU9ESUZJRURfU0lOQ0UgPSAiSWYtTW9kaWZpZWQtU2luY2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfSUZfTk9ORV9NQVRDSCA9ICJJZi1Ob25lLU1hdGNoIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0lGX1JBTkdFID0gIklmLVJhbmdlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0lGX1VOTU9ESUZJRURfU0lOQ0UgPSAiSWYtVW5tb2RpZmllZC1TaW5jZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9MQVNUX01PRElGSUVEID0gIkxhc3QtTW9kaWZpZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTE9DQVRJT04gPSAiTG9jYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTUFYX0ZPUldBUkRTID0gIk1heC1Gb3J3YXJkcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QUkFHTUEgPSAiUHJhZ21hIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BST1hZX0FVVEhFTlRJQ0FURSA9ICJQcm94eS1BdXRoZW50aWNhdGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJPWFlfQVVUSE9SSVpBVElPTiA9ICJQcm94eS1BdXRob3JpemF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1JBTkdFID0gIlJhbmdlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1JFRkVSRVIgPSAiUmVmZXJlciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9SRVRSWV9BRlRFUiA9ICJSZXRyeS1BZnRlciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9TRVJWRVIgPSAiU2VydmVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RFID0gIlRFIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RSQUlMRVIgPSAiVHJhaWxlciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9UUkFOU0ZFUl9FTkNPRElORyA9ICJUcmFuc2Zlci1FbmNvZGluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9VUEdSQURFID0gIlVwZ3JhZGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVVNFUl9BR0VOVCA9ICJVc2VyLUFnZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1ZBUlkgPSAiVmFyeSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9WSUEgPSAiVmlhIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1dBUk5JTkcgPSAiV2FybmluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9XV1dfQVVUSEVOVElDQVRFID0gIldXVy1BdXRoZW50aWNhdGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTUlNRV9WRVJTSU9OID0gIk1JTUUtVmVyc2lvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX0RJU1BPU0lUSU9OID0gIkNvbnRlbnQtRGlzcG9zaXRpb24iOyAgCi0KLSAgLy8gSFRUUCBBdXRoZW50aWNhdGlvbjogQmFzaWMgYW5kIERpZ2VzdCBBY2Nlc3MgQXV0aGVudGljYXRpb24KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FVVEhFTlRJQ0FUSU9OX0lORk8gPSAiQXV0aGVudGljYXRpb24tSW5mbyI7Ci0KLSAgLy8gSFRUUCBTdGF0ZSBNYW5hZ2VtZW50IE1lY2hhbmlzbQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfU0VUX0NPT0tJRSA9ICJTZXQtQ29va2llIjsKLQotICAvLyBIVFRQIFN0YXRlIE1hbmFnZW1lbnQgTWVjaGFuaXNtIChvYnNvbGV0ZXMgUkZDMjEwOSkKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPT0tJRSA9ICJDb29raWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09PS0lFMiA9ICJDb29raWUyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1NFVF9DT09LSUUyID0gIlNldC1Db29raWUyIjsKLQotICAvLyBXZWIgRGlzdHJpYnV0ZWQgQXV0aG9yaW5nIGFuZCBWZXJzaW9uaW5nCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9EQVYgPSAiREFWIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0RFUFRIID0gIkRlcHRoIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0RFU1RJTkFUSU9OID0gIkRlc3RpbmF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0lGID0gIklmIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0xPQ0tfVE9LRU4gPSAiTG9jay1Ub2tlbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9PVkVSV1JJVEUgPSAiT3ZlcndyaXRlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1NUQVRVU19VUkkgPSAiU3RhdHVzLVVSSSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9USU1FT1VUID0gIlRpbWVvdXQiOwotCi0gIC8vIEh5cGVydGV4dCBUcmFuc2ZlciBQcm90b2NvbCAtLSBIVFRQLzEuMSAoUHJvcG9zZWQgU3RhbmRhcmQgLSB0aGVzZSBmaWVsZC1uYW1lcyBhcmUgbm93IGNvbnNpZGVyZWQgb2Jzb2xldGUpCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX0JBU0UgPSAiQ29udGVudC1CYXNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BVQkxJQyA9ICJQdWJsaWMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9WRVJTSU9OID0gIkNvbnRlbnQtVmVyc2lvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9ERVJJVkVEX0ZST00gPSAiRGVyaXZlZC1Gcm9tIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0xJTksgPSAiTGluayI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9VUkkgPSAiVVJJIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0tFRVBfQUxJVkUgPSAiS2VlcC1BbGl2ZSI7Ci0KLSAgLy8gRGVsdGEgRW5jb2RpbmcgaW4gSFRUUAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQV9JTSA9ICJBLUlNIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0RFTFRBX0JBU0UgPSAiRGVsdGEtQmFzZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9JTSA9ICJJTSI7Ci0KLSAgLy8gSW5zdGFuY2UgRGlnZXN0cyBpbiBIVFRQCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9ESUdFU1QgPSAiRGlnZXN0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1dBTlRfRElHRVNUID0gIldhbnQtRGlnZXN0IjsKLQotICAvLyBTaW1wbGUgSGl0LU1ldGVyaW5nIGFuZCBVc2FnZS1MaW1pdGluZyBmb3IgSFRUUAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTUVURVIgPSAiTWV0ZXIiOwotCi0gIC8vIFRoZSBLbm93biBOb24tU3RhbmRhcmRpemVkIEhUVFAgSGVhZGVyIGZpZWxkLW5hbWVzCi0KLSAgLy8gVHJhbnNwYXJlbnQgQ29udGVudCBOZWdvdGlhdGlvbiBpbiBIVFRQCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BQ0NFUFRfRkVBVFVSRVMgPSAiQWNjZXB0LUZlYXR1cmVzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FMVEVSTkFURVMgPSAiQWx0ZXJuYXRlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9ORUdPVElBVEUgPSAiTmVnb3RpYXRlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RDTiA9ICJUQ04iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVkFSSUFOVF9WQVJZID0gIlZhcmlhbnQtVmFyeSI7Ci0KLSAgLy8gVGhlIFNhZmUgUmVzcG9uc2UgSGVhZGVyIEZpZWxkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9TQUZFID0gIlNhZmUiOwotCi0gIC8vIEh5cGVyIFRleHQgQ29mZmVlIFBvdCBDb250cm9sIFByb3RvY29sIChIVENQQ1AvMS4wKQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUNDRVBUX0FERElUSU9OUyA9ICJBY2NlcHQtQWRkaXRpb25zIjsKLQotICAvLyBUaGUgU2VjdXJlIEh5cGVyVGV4dCBUcmFuc2ZlciBQcm90b2NvbAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9QUklWQUNZX0RPTUFJTiA9ICJDb250ZW50LVByaXZhY3ktRG9tYWluIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX01BQ19JTkZPID0gIk1BQy1JbmZvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BSRUFSUkFOR0VEX0tFWV9JTkZPID0gIlByZWFycmFuZ2VkLUtleS1JbmZvIjsKLQotICAvLyBBbiBIVFRQIEV4dGVuc2lvbiBGcmFtZXdvcmsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NfRVhUID0gIkMtRXh0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NfTUFOID0gIkMtTWFuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NfT1BUID0gIkMtT3B0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0VYVCA9ICJFeHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTUFOID0gIk1hbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9PUFQgPSAiT3B0IjsKLQotICAvLyBQSUNTIExhYmVsIERpc3RyaWJ1dGlvbiBMYWJlbCBTeW50YXggYW5kIENvbW11bmljYXRpb24gUHJvdG9jb2xzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QSUNTX0xBQkVMID0gIlBJQ1MtTGFiZWwiOwotCi0gIC8vIFBsYXRmb3JtIEZvciBQcml2YWN5IFByZWZlcmVuY2VzIDEuMAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUDNQID0gIlAzUCI7Ci0KLSAgLy8gUEVQIC0gYW4gRXh0ZW5zaW9uIE1lY2hhbmlzbSBmb3IgSFRUUAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ19QRVAgPSAiQy1QRVAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ19QRVBfSU5GTyA9ICJDLVBFUC1JbmZvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BFUCA9ICJQRVAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUEVQX0lORk8gPSAiUGVwLUluZm8iOwotCi0gIC8vIFRoZSBIVFRQIERpc3RyaWJ1dGlvbiBhbmQgUmVwbGljYXRpb24gUHJvdG9jb2wKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfSUQgPSAiQ29udGVudC1JRCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9ESUZGRVJFTlRJQUxfSUQgPSAiRGlmZmVyZW50aWFsLUlEIjsKLQotICAvLyBFU0kgQXJjaGl0ZWN0dXJlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9TVVJST0dBVEVfQ0FQQUJJTElUWSA9ICJTdXJyb2dhdGUtQ2FwYWJpbGl0eSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9TVVJST0dBVEVfQ09OVFJPTCA9ICJTdXJyb2dhdGUtQ29udHJvbCI7Ci0KLSAgLy8gU2VsZWN0aW5nIFBheW1lbnQgTWVjaGFuaXNtcyBPdmVyIEhUVFAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BST1RPQ09MID0gIlByb3RvY29sIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BST1RPQ09MX0lORk8gPSAiUHJvdG9jb2wtSW5mbyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QUk9UT0NPTF9RVUVSWSA9ICJQcm90b2NvbC1RdWVyeSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QUk9UT0NPTF9SRVFVRVNUID0gIlByb3RvY29sLVJlcXVlc3QiOwotCi0gIC8vIEltcGxlbWVudGF0aW9uIG9mIE9QUyBPdmVyIEhUVFAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0dFVFBST0ZJTEUgPSAiR2V0UHJvZmlsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QUk9GSUxFT0JKRUNUID0gIlByb2ZpbGVPYmplY3QiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfU0VUUFJPRklMRSA9ICJTZXRQcm9maWxlIjsKLQotICAvLyBOb3RpZmljYXRpb24gZm9yIFByb3h5IENhY2hlcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJPWFlfRkVBVFVSRVMgPSAiUHJveHktRmVhdHVyZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJPWFlfSU5TVFJVQ1RJT04gPSAiUHJveHktSW5zdHJ1Y3Rpb24iOwotCi0gIC8vIE9iamVjdCBIZWFkZXIgbGluZXMgaW4gSFRUUAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9UUkFOU0ZFUl9FTkNPRElORyA9ICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPU1QgPSAiQ29zdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9NRVNTQUdFX0lEID0gIk1lc3NhZ2UtSUQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVElUTEUgPSAiVGl0bGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVkVSU0lPTiA9ICJWZXJzaW9uIjsKLQotICAvLyBBIFByb3Bvc2VkIEV4dGVuc2lvbiBNZWNoYW5pc20gZm9yIEhUVFAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0VYVEVOU0lPTiA9ICJFeHRlbnNpb24iOwotCi0gIC8vIFdJUkUgLSBXMyBJZGVudGlmaWVyIFJlc29sdXRpb24gRXh0ZW5zaW9ucwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfT1BUSU9OQUwgPSAiT3B0aW9uYWwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUkVTT0xVVElPTl9ISU5UID0gIlJlc29sdXRpb24tSGludCI7Ci0KLSAgLy8gRHVwbGljYXRlIFN1cHByZXNzaW9uIGluIEhUVFAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1NVQk9LID0gIlN1Yk9LIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1NVQlNUID0gIlN1YnN0IjsKLQotICAvLyBTcGVjaWZpY2F0aW9uIG9mIEhUVFAvMS4xIE9QVElPTlMgbWVzc2FnZXMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTVBMSUFOQ0UgPSAiQ29tcGxpYW5jZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9OT05fQ09NUExJQU5DRSA9ICJOb24tQ29tcGxpYW5jZSI7Ci0KLSAgLy8gV2lkZWx5LXVzZWQgdW5kb2N1bWVudGVkIGhlYWRlcnMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1JFUVVFU1RfUkFOR0UgPSAiUmVxdWVzdC1SYW5nZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9VQV9DT0xPUiA9ICJVQS1Db2xvciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9VQV9DUFUgPSAiVUEtQ1BVIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1VBX09TID0gIlVBLU9TIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1VBX1BJWEVMUyA9ICJVQS1QaXhlbHMiOwotCi0gIC8vIEltcGxlbWVudGF0aW9uIGVycm9ycwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUkVGRVJSRVIgPSAiUmVmZXJyZXIiOwotCi0gIC8vIFByaXZhdGUgZmVhdHVyZXMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPUFlSSUdIVCA9ICJDb3B5cmlnaHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVCA9ICJDb250ZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FVVEhPUiA9ICJBdXRob3IiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEFDVCA9ICJDb250YWN0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0tFWVdPUkRTID0gIktleXdvcmRzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0dFTkVSQVRPUiA9ICJHZW5lcmF0b3IiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfREVTQ1JJUFRJT04gPSAiRGVzY3JpcHRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09NTUFORCA9ICJDb21tYW5kIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1NFU1NJT04gPSAiU2Vzc2lvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9UWVBFID0gIlR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTUVTU0FHRSA9ICJNZXNzYWdlIjsKLQotICAvLyBBYmFuZG9uZWQgcHJvcG9zYWxzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9VTkxFU1NfTU9ESUZJRURfU0lOQ0UgPSAiVW5sZXNzLU1vZGlmaWVkLVNpbmNlIjsKLQotICAvKioKLSAgICogUmV0dXJucyBhbGwgdGhlIHN0YW5kYXJkaXplZCBIVFRQIGhlYWRlciBuYW1lcyBwcmVzZW50ZWQgYXMgTGlzdAotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHN0YW5kYXJkaXplZCBIVFRQIGhlYWRlciBuYW1lcwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFN0YW5kYXJkaXplZEhlYWRlck5hbWVzKCkgewotICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7Ci0gICAgICBIRUFERVJfQUNDRVBULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQUNDRVBUX0NIQVJTRVQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BQ0NFUFRfRU5DT0RJTkcudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BQ0NFUFRfTEFOR1VBR0UudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BQ0NFUFRfUkFOR0VTLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQUdFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQUxMT1cudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BVVRIT1JJWkFUSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ0FDSEVfQ09OVFJPTC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTk5FQ1QudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05URU5UX0VOQ09ESU5HLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9MQU5HVUFHRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRFTlRfTEVOR1RILnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9MT0NBVElPTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRFTlRfTUQ1LnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9SQU5HRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRFTlRfVFlQRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0RBVEUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9FVEFHLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfRVhQRUNULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfRVhQSVJFUy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0ZST00udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9IT1NULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfSUZfTUFUQ0gudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9JRl9NT0RJRklFRF9TSU5DRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0lGX05PTkVfTUFUQ0gudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9JRl9SQU5HRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0lGX1VOTU9ESUZJRURfU0lOQ0UudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9MQVNUX01PRElGSUVELnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTE9DQVRJT04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9NQVhfRk9SV0FSRFMudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUkFHTUEudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9YWV9BVVRIRU5USUNBVEUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9YWV9BVVRIT1JJWkFUSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUkFOR0UudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9SRUZFUkVSLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUkVUUllfQUZURVIudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9TRVJWRVIudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9URS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RSQUlMRVIudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9UUkFOU0ZFUl9FTkNPRElORy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1VQR1JBREUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9VU0VSX0FHRU5ULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVkFSWS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1ZJQS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1dBUk5JTkcudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9XV1dfQVVUSEVOVElDQVRFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTUlNRV9WRVJTSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9ESVNQT1NJVElPTi50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQVVUSEVOVElDQVRJT05fSU5GTy50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfU0VUX0NPT0tJRS50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ09PS0lFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09PS0lFMi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1NFVF9DT09LSUUyLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9EQVYudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9ERVBUSC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0RFU1RJTkFUSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfSUYudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9MT0NLX1RPS0VOLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfT1ZFUldSSVRFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfU1RBVFVTX1VSSS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RJTUVPVVQudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0NPTlRFTlRfQkFTRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BVQkxJQy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRFTlRfVkVSU0lPTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0RFUklWRURfRlJPTS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0xJTksudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9VUkkudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9LRUVQX0FMSVZFLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9BX0lNLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfREVMVEFfQkFTRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0lNLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9ESUdFU1QudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9XQU5UX0RJR0VTVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfTUVURVIudG9VcHBlckNhc2UoKQotICAgIH0pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYWxsIHRoZSBub24tc3RhbmRhcmRpemVkIEhUVFAgaGVhZGVyIG5hbWVzIHByZXNlbnRlZCBhcyBMaXN0Ci0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2Ygbm9uLXN0YW5kYXJkaXplZCBIVFRQIGhlYWRlciBuYW1lcwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldE5vblN0YW5kYXJkaXplZEhlYWRlck5hbWVzKCkgewotICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7Ci0gICAgICBIRUFERVJfQUNDRVBUX0ZFQVRVUkVTLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQUxURVJOQVRFUy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX05FR09USUFURS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RDTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1ZBUklBTlRfVkFSWS50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfU0FGRS50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQUNDRVBUX0FERElUSU9OUy50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ09OVEVOVF9QUklWQUNZX0RPTUFJTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX01BQ19JTkZPLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJFQVJSQU5HRURfS0VZX0lORk8udG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0NfRVhULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ19NQU4udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DX09QVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0VYVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX01BTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX09QVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfUElDU19MQUJFTC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BST1RPQ09MLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJPVE9DT0xfUkVRVUVTVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfUDNQLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9DX1BFUC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NfUEVQX0lORk8udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QRVAudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QRVBfSU5GTy50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ09OVEVOVF9JRC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0RJRkZFUkVOVElBTF9JRC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfU1VSUk9HQVRFX0NBUEFCSUxJVFkudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9TVVJST0dBVEVfQ09OVFJPTC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfUFJPVE9DT0wudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9UT0NPTF9JTkZPLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJPVE9DT0xfUVVFUlkudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9UT0NPTF9SRVFVRVNULnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9HRVRQUk9GSUxFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJPRklMRU9CSkVDVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1NFVFBST0ZJTEUudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX1BST1hZX0ZFQVRVUkVTLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJPWFlfSU5TVFJVQ1RJT04udG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0NPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkcudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT1NULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTUVTU0FHRV9JRC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RJVExFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVkVSU0lPTi50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfRVhURU5TSU9OLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9PUFRJT05BTC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1JFU09MVVRJT05fSElOVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfU1VCT0sudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9TVUJTVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ09NUExJQU5DRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX05PTl9DT01QTElBTkNFLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9SRVFVRVNUX1JBTkdFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVUFfQ09MT1IudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9VQV9DUFUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9VQV9PUy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1VBX1BJWEVMUy50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfUkVGRVJSRVIudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0NPUFlSSUdIVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRFTlQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BVVRIT1IudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05UQUNULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfS0VZV09SRFMudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9HRU5FUkFUT1IudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9ERVNDUklQVElPTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTU1BTkQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9TRVNTSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVFlQRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX01FU1NBR0UudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX1VOTEVTU19NT0RJRklFRF9TSU5DRS50b1VwcGVyQ2FzZSgpCi0gICAgfSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbGwga25vd24gSFRUUCBoZWFkZXIgbmFtZXMgcHJlc2VudGVkIGFzIExpc3QKLSAgICogQHJldHVybiBUaGUgbGlzdCBvZiBhbGwga25vd24gSFRUUCBoZWFkZXIgbmFtZXMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxLbm93bkhlYWRlck5hbWVzKCkgewotICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7Ci0gICAgICBIRUFERVJfQUNDRVBULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQUNDRVBUX0NIQVJTRVQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BQ0NFUFRfRU5DT0RJTkcudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BQ0NFUFRfTEFOR1VBR0UudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BQ0NFUFRfUkFOR0VTLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQUdFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQUxMT1cudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BVVRIT1JJWkFUSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ0FDSEVfQ09OVFJPTC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTk5FQ1QudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05URU5UX0VOQ09ESU5HLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9MQU5HVUFHRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRFTlRfTEVOR1RILnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9MT0NBVElPTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRFTlRfTUQ1LnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9SQU5HRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRFTlRfVFlQRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0RBVEUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9FVEFHLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfRVhQRUNULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfRVhQSVJFUy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0ZST00udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9IT1NULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfSUZfTUFUQ0gudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9JRl9NT0RJRklFRF9TSU5DRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0lGX05PTkVfTUFUQ0gudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9JRl9SQU5HRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0lGX1VOTU9ESUZJRURfU0lOQ0UudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9MQVNUX01PRElGSUVELnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTE9DQVRJT04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9NQVhfRk9SV0FSRFMudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUkFHTUEudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9YWV9BVVRIRU5USUNBVEUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9YWV9BVVRIT1JJWkFUSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUkFOR0UudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9SRUZFUkVSLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUkVUUllfQUZURVIudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9TRVJWRVIudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9URS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RSQUlMRVIudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9UUkFOU0ZFUl9FTkNPRElORy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1VQR1JBREUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9VU0VSX0FHRU5ULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVkFSWS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1ZJQS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1dBUk5JTkcudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9XV1dfQVVUSEVOVElDQVRFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTUlNRV9WRVJTSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9ESVNQT1NJVElPTi50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQVVUSEVOVElDQVRJT05fSU5GTy50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfU0VUX0NPT0tJRS50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ09PS0lFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09PS0lFMi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1NFVF9DT09LSUUyLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9EQVYudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9ERVBUSC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0RFU1RJTkFUSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfSUYudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9MT0NLX1RPS0VOLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfT1ZFUldSSVRFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfU1RBVFVTX1VSSS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RJTUVPVVQudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0NPTlRFTlRfQkFTRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BVQkxJQy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRFTlRfVkVSU0lPTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0RFUklWRURfRlJPTS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0xJTksudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9VUkkudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9LRUVQX0FMSVZFLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9BX0lNLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfREVMVEFfQkFTRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0lNLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9ESUdFU1QudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9XQU5UX0RJR0VTVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfTUVURVIudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0FDQ0VQVF9GRUFUVVJFUy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0FMVEVSTkFURVMudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9ORUdPVElBVEUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9UQ04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9WQVJJQU5UX1ZBUlkudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX1NBRkUudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0FDQ0VQVF9BRERJVElPTlMudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0NPTlRFTlRfUFJJVkFDWV9ET01BSU4udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9NQUNfSU5GTy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BSRUFSUkFOR0VEX0tFWV9JTkZPLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9DX0VYVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NfTUFOLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ19PUFQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9FWFQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9NQU4udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9PUFQudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX1BJQ1NfTEFCRUwudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9UT0NPTC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BST1RPQ09MX1JFUVVFU1QudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX1AzUC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ19QRVAudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DX1BFUF9JTkZPLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUEVQLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUEVQX0lORk8udG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0NPTlRFTlRfSUQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9ESUZGRVJFTlRJQUxfSUQudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX1NVUlJPR0FURV9DQVBBQklMSVRZLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfU1VSUk9HQVRFX0NPTlRST0wudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX1BST1RPQ09MLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJPVE9DT0xfSU5GTy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BST1RPQ09MX1FVRVJZLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJPVE9DT0xfUkVRVUVTVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfR0VUUFJPRklMRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BST0ZJTEVPQkpFQ1QudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9TRVRQUk9GSUxFLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9QUk9YWV9GRUFUVVJFUy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BST1hZX0lOU1RSVUNUSU9OLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9DT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09TVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX01FU1NBR0VfSUQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9USVRMRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1ZFUlNJT04udG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0VYVEVOU0lPTi50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfT1BUSU9OQUwudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9SRVNPTFVUSU9OX0hJTlQudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX1NVQk9LLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfU1VCU1QudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0NPTVBMSUFOQ0UudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9OT05fQ09NUExJQU5DRS50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfUkVRVUVTVF9SQU5HRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1VBX0NPTE9SLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVUFfQ1BVLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVUFfT1MudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9VQV9QSVhFTFMudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX1JFRkVSUkVSLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9DT1BZUklHSFQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05URU5ULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQVVUSE9SLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEFDVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0tFWVdPUkRTLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfR0VORVJBVE9SLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfREVTQ1JJUFRJT04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT01NQU5ELnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfU0VTU0lPTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RZUEUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9NRVNTQUdFLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9VTkxFU1NfTU9ESUZJRURfU0lOQ0UudG9VcHBlckNhc2UoKQotICAgIH0pOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvSFRUUFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9IVFRQVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM1ZTQzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9IVFRQVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci0KLS8qKgotICogU2V0IG9mIEhUVFBMIHJlbGF0ZWQgdXRpbGl0aWVzLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSFRUUFV0aWxzCi17Ci0KLSAgLyoqCi0gICAqIEZpbmQgdGhlIFVSTCBzdHJpbmcgaW4gYSBIVFRQIFBPU1QgaGVhZGVyLgotICAgKiBAcGFyYW0gaHR0cFBvc3RIZWFkZXIgIGEgSFRUUCBQT1NUIGhlYWRlci4gCi0gICAqIEByZXR1cm4gdGhlIFVSTCBzdHJpbmcgaW4gYSBIVFRQIFBPU1QgaGVhZGVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VVJMU3RyaW5nKFN0cmluZyBodHRwUG9zdEhlYWRlcikKLSAgewotICAgIFN0cmluZyB1cmxTdHJpbmcgPSBudWxsOwotICAgIGludCBzdGFydCwgZW5kOwotCi0gICAgLy8gSWYgUE9TVCwgdGhlbiBjb250aW51ZQotICAgIGlmIChodHRwUG9zdEhlYWRlci5zdGFydHNXaXRoKCJQT1NUIikgfHwgaHR0cFBvc3RIZWFkZXIuc3RhcnRzV2l0aCgiR0VUIikpCi0gICAgewotICAgICAgLy8gU3RhcnQgYWZ0ZXIgZmlyc3Qgc3BhY2UKLSAgICAgIHN0YXJ0ID0gaHR0cFBvc3RIZWFkZXIuaW5kZXhPZignICcpICsgMTsKLQotICAgICAgLy8gTG9vayBmb3IgbmV4dCBub24tc3BhY2UgY2hhcmFjdGVyCi0gICAgICB3aGlsZSAoaHR0cFBvc3RIZWFkZXIuY2hhckF0KHN0YXJ0KSA9PSAnICcpCi0gICAgICAgIHN0YXJ0Kys7Ci0KLSAgICAgIC8vIEZpbmQgbmV4dCBzcGFjZSBjaGFyYWN0ZXIKLSAgICAgIGVuZCA9IGh0dHBQb3N0SGVhZGVyLmluZGV4T2YoJyAnLCBzdGFydCk7Ci0KLSAgICAgIC8vIEdldCBVUkwgc3RyaW5nIHdoaWNoIGlzIGxvY2F0ZWQgaW4gYmV0d2VlbiBzdGFydCBhbmQgZW5kCi0gICAgICB1cmxTdHJpbmcgPSBodHRwUG9zdEhlYWRlci5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0gICAgfQotCi0gICAgLy8gRWxzZSB0aHJvdyBleGNlcHRpb24KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgIkhUVFAgaGVhZGVyIGRvZXMgbm90IGNvbnRhaW4gUE9TVCBkYXRhICh3YXM6ICIgKyBodHRwUG9zdEhlYWRlciArICIpIik7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIFVSTCBzdHJpbmcKLSAgICByZXR1cm4gdXJsU3RyaW5nOwotICB9Ci0gIC8qKgotICAgKiBVdGlsaXR5IHRvIHByZXNlbnQgSFRUUCBoZWFkZXIgaW5mb3JtYXRpb24gYXMgYXR0cmlidXRlLXZhbHVlIHBhaXJzLCAKLSAgICogYmFzZWQgb24gJzonIGFzIGF0dHJpYnV0ZS12YWx1ZSBzZXBhcmF0b3IuCi0gICAqIEBwYXJhbSBodHRwSGVhZGVyU3RyaW5nIGFuIEhUVFAgaGVhZGVyIHN0cmluZy4KLSAgICogQHBhcmFtIHNlcGFyYXRvcnMgYXR0cmlidXRlLXZhbHVlIHNlcGFyYXRvciBsaXN0LgotICAgKiBAcmV0dXJuIEhUVFAgaGVhZGVyIGluZm9ybWF0aW9uIGFzIGF0dHJpYnV0ZS12YWx1ZSBwYWlycy4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGNyZWF0ZSBIVFRQIGhlYWRlciBpbmZvcm1hdGlvbiAKLSAgICogICAgICAgICBhcyBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE1hcCBnZXRIdHRwSGVhZGVyVG9rZW5zKFN0cmluZyBodHRwSGVhZGVyU3RyaW5nLCBTdHJpbmcgc2VwYXJhdG9ycykKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihodHRwSGVhZGVyU3RyaW5nLCAiXG5cclxmIik7Ci0gICAgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIFN0cmluZyBsaW5lID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgaW50IGluZGV4ID0gbGluZS5pbmRleE9mKHNlcGFyYXRvcnMpOwotICAgICAgaWYgKGluZGV4ID4gMCAmJiBpbmRleCA8IGxpbmUubGVuZ3RoKCkgLSAxKQotICAgICAgewotICAgICAgCW5hbWUgPSBsaW5lLnN1YnN0cmluZygwLCBpbmRleCkudG9VcHBlckNhc2UoKTsKLSAgICAgICAgbWFwLnB1dChuYW1lLCBsaW5lLnN1YnN0cmluZyhpbmRleCArIDEpLnRyaW0oKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICgobmFtZSAhPSBudWxsKSAmJiAobGluZS5sZW5ndGgoKT4wKSAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxpbmUuY2hhckF0KDApKSkKLSAgICAgICAgICAgbWFwLnB1dChuYW1lLCBtYXAuZ2V0KG5hbWUpICsgIiAiICsgbGluZS50cmltKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0gIAotICAvKioKLSAgICogVXRpbGl0eSB0byB0YWtlIHN1YiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBIVFRQIGhlYWRlcgotICAgKiBAcGFyYW0gaHR0cEhlYWRlclN0cmluZyBhbiBIVFRQIGhlYWRlciBzdHJpbmcuCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIGF0dHJpYnV0ZSBuYW1lLgotICAgKiBAcGFyYW0gc3ViQXR0cmlidXRlTmFtZSBzdWIgYXR0cmlidXRlIG5hbWUuCi0gICAqIEByZXR1cm4gc3ViIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIEhUVFAgaGVhZGVyLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gZ2V0IHN1YiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBIVFRQIGhlYWRlci4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIdHRwSGVhZGVyU3ViQXR0cmlidXRlKFN0cmluZyBodHRwSGVhZGVyU3RyaW5nLCAKLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgc3ViQXR0cmlidXRlTmFtZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBnZXQgYXR0cmlidXRlIHZhbHVlCi0gICAgU3RyaW5nIHZhbHVlID0gCi0gICAgICAoU3RyaW5nKSBnZXRIdHRwSGVhZGVyVG9rZW5zKGh0dHBIZWFkZXJTdHJpbmcsIjoiKS5nZXQoYXR0cmlidXRlTmFtZS50b1VwcGVyQ2FzZSgpKTsKLSAgICBpZih2YWx1ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIHNlYXJjaCBzdWIgYXR0cmlidXRlIHRva2VuCi0gICAgICBpbnQgaWR4USA9IHZhbHVlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihzdWJBdHRyaWJ1dGVOYW1lLnRvVXBwZXJDYXNlKCkrIj1cIiIpOwotICAgICAgaW50IGlkeCA9IHZhbHVlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihzdWJBdHRyaWJ1dGVOYW1lLnRvVXBwZXJDYXNlKCkrIj0iKTsKLSAgICAgIC8vIGlmIGF0dHJpYnV0ZSBpcyBxdW90ZWQKLSAgICAgIGlmIChpZHhRICE9IC0xKSAKLSAgICAgIHsKLSAgICAgICAgaWR4USArPSAoc3ViQXR0cmlidXRlTmFtZSsiPVwiIikubGVuZ3RoKCk7Ci0gICAgICAgIGludCBlSWR4USA9IHZhbHVlLmluZGV4T2YoIlwiIiwgaWR4USk7Ci0gICAgICAgIGlmIChlSWR4USAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoaWR4USwgZUlkeFEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gaWYgYXR0cmlidXRlIGRvIG5vdCBxdW90ZWQKLSAgICAgIGVsc2UgaWYgKGlkeCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWR4ICs9IChzdWJBdHRyaWJ1dGVOYW1lKyI9IikubGVuZ3RoKCk7Ci0gICAgICAgIGludCBlSWR4ID0gLTE7Ci0gICAgICAgIC8vIGZpbmQgZW5kIHNwYWNlIHNlcGFyYXRvcgotICAgICAgICBpZiAoKGVJZHggPSB2YWx1ZS5pbmRleE9mKCIgIiwgaWR4KSkgIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKGlkeCwgZUlkeCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZmluZCBjb21hIHNlcGFyYXRvcgotICAgICAgICBlbHNlIGlmICgoZUlkeCA9IHZhbHVlLmluZGV4T2YoIjsiLCBpZHgpKSAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoaWR4LCBlSWR4KTsKLSAgICAgICAgfQotICAgICAgICAvLyB0aGlzIGlzIGxhc3QgYXR0cmlidXRlCi0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKGlkeCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGlmIGF0dHJpYnV0ZSBkbyBub3QgZm91bmQKLSAgICAgIGVsc2UgCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogVXRpbGl0eSB0byB0YWtlIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIEhUVFAgaGVhZGVyCi0gICAqIEBwYXJhbSBodHRwSGVhZGVyU3RyaW5nIGFuIEhUVFAgaGVhZGVyIHN0cmluZy4KLSAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgYXR0cmlidXRlIG5hbWUuCi0gICAqIEByZXR1cm4gYXR0cmlidXRlIHZhbHVlIGZyb20gSFRUUCBoZWFkZXIuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBnZXQgYXR0cmlidXRlIHZhbHVlIGZyb20gSFRUUCBoZWFkZXIuIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SHR0cEhlYWRlckF0dHJpYnV0ZShTdHJpbmcgaHR0cEhlYWRlclN0cmluZywgCi0gICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSAKLSAgICAgICAgKFN0cmluZykgZ2V0SHR0cEhlYWRlclRva2VucyhodHRwSGVhZGVyU3RyaW5nLCI6IikuZ2V0KGF0dHJpYnV0ZU5hbWUudG9VcHBlckNhc2UoKSk7Ci0gICAgLy8gZ2V0IGZpcnN0IHRva2VuCi0gICAgaWYoKGF0dHJpYnV0ZVZhbHVlICE9IG51bGwpICYmIChhdHRyaWJ1dGVWYWx1ZS5pbmRleE9mKCI7IikgIT0gLTEpKSB7Ci0gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVZhbHVlLnN1YnN0cmluZygwLCBhdHRyaWJ1dGVWYWx1ZS5pbmRleE9mKCI7IikpOwotICAgIH0KLSAgICByZXR1cm4gYXR0cmlidXRlVmFsdWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0h0dHBIZWFkZXJzVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9IdHRwSGVhZGVyc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI0ODdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0h0dHBIZWFkZXJzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IHN1bi5uZXQud3d3Lk1lc3NhZ2VIZWFkZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgSFRUUCByZXF1ZXN0IGhlYWRlcnMgYWJvdXQgUkZDIDI2MTYuCi0gKgotICogQGF1dGhvciBWb2xvZGluIAotICovCi1wdWJsaWMgY2xhc3MgSHR0cEhlYWRlcnNWYWxpZGF0b3IKLXsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FMTE9XID0gIkFsbG93IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX1RZUEUgPSAiQ29udGVudC1UeXBlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX0VOQ09ESU5HID0gIkNvbnRlbnQtRW5jb2RpbmciOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfTEFOR1VBR0UgPSAiQ29udGVudC1MYW5ndWFnZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9MRU5HSFQgPSAiQ29udGVudC1MZW5ndGgiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfTE9DQVRJT04gPSAiQ29udGVudC1Mb2NhdGlvbiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9NRDUgPSAiQ29udGVudC1NRDUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfUkFOR0UgPSAiQ29udGVudC1SYW5nZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRVhQSVJFUyA9ICJFeHBpcmVzIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9MQVNUX01PRElGSUVEID0gIkxhc3QtTW9kaWZpZWQiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NBQ0hFX0NPTlRST0wgPSAiQ2FjaGUtQ29udHJvbCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OTkVDVElPTiA9ICJDb25uZWN0aW9uIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9EQVRFID0gIkRhdGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BSQUdNQSA9ICJQcmFnbWEiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RSQUlMRVIgPSAiVHJhaWxlciI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVFJBTlNGRVJfRU5DT0RJTkcgPSAiVHJhbnNmZXItRW5jb2RpbmciOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVVBHUkFERSA9ICJVcGdyYWRlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9WSUEgPSAiVmlhIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9XQVJOSU5HID0gIldhcm5pbmciOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUNDRVBUID0gIkFjY2VwdCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUNDRVBUX0NIQVJTRVQgPSAiQWNjZXB0LUNoYXJzZXQiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FDQ0VQVF9FTkNPRElORyA9ICJBY2NlcHQtRW5jb2RpbmciOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FDQ0VQVF9MQU5HVUFHRSA9ICJBY2NlcHQtTGFuZ3VhZ2UiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FVVEhPUklaQVRJT04gPSAiQXV0aG9yaXphdGlvbiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRVhQRUNUID0gIkV4cGVjdCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRlJPTSA9ICJGcm9tIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9IT1NUID0gIkhvc3QiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0lGX01BVENIID0gIklmLU1hdGNoIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9JRl9NT0RJRklFRF9TSU5DRSA9ICJJZi1Nb2RpZmllZC1TaW5jZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfSUZfTk9ORV9NQVRDSCA9ICJJZi1Ob25lLU1hdGNoIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9JRl9SQU5HRSA9ICJJZi1SYW5nZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfSUZfVU5NT0RJRklFRF9TSU5DRSA9Ci0gICAgIklmLVVubW9kaWZpZWQtU2luY2UiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX01BWF9GT1JXQVJEUyA9ICJNYXgtRm9yd2FyZHMiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BST1hZX0FVVEhPUklaQVRJT04gPQotICAgICJQcm94eS1BdXRob3JpemF0aW9uIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9SQU5HRSA9ICJSYW5nZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUkVGRVJFUiA9ICJSZWZlcmVyIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9URSA9ICJURSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVVNFUl9BR0VOVCA9ICJVc2VyLUFnZW50IjsKLQotICAvKioKLSAgICogVGhpcyBjbGFzcyBjaGVja3MgZS1tYWlsIHN0cmluZyBhYm91dCBSRkMgODIyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBNYWlsYm94VmFsaWRhdG9yCi0gIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gU1BFQ0lBTCA9Ci0gICAgICB7ICcoJywgJyknLCAnPCcsICc+JywgJ0AnLCAnLCcsICc7JywgJzonLCAnXFwnLCAnXCInLCAnLicsICdbJywgJ10nIH07Ci0KLSAgICAvKioKLSAgICAJKiBWYWxpZGF0ZXMgZS1tYWlsIHN0cmluZy4KLSAgICAqIEBwYXJhbSBtYWlsYm94IGUtbWFpbCBzdHJpbmcKLSAgICAqIEByZXR1cm4gYm9vbGVhbiAgdHJ1ZSBpZiBlLW1haWwgc3RyaW5nIGlzIGNvbmZvcm0gdG8gUkZDIDgyMiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVNYWlsYm94KFN0cmluZyBtYWlsYm94KQotICAgIHsKLQotICAgICAgaWYgKCFpc0Z1bGxBZGRyKG1haWxib3gpICYmICFpc1Nob3J0QWRkcihtYWlsYm94KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXNTaW1wbGVBZGRyLgotICAgICAqIEBwYXJhbSBtYWlsYm94Ci0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Nob3J0QWRkcihTdHJpbmcgbWFpbGJveCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXhBdCA9IG1haWxib3guaW5kZXhPZignQCcpOwotICAgICAgaWYgKGluZGV4QXQgPT0gLTEpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFpc0xvY2FsUGFydChtYWlsYm94LnN1YnN0cmluZygwLCBpbmRleEF0KSkKLSAgICAgICAgfHwgIWlzRG9tYWluKG1haWxib3guc3Vic3RyaW5nKGluZGV4QXQgKyAxKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGlzRG9tYWltLgotICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEb21haW4oU3RyaW5nIHN0cmluZykKLSAgICB7Ci0gICAgICBpZiAoc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0cmluZywgIi4iKTsKLSAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBzdWJEb21haW4gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgaWYgKCFpc0F0b20oc3ViRG9tYWluKSAmJiAhaXNEb21haW5MaXRlcmFsKHN1YkRvbWFpbikpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXNEb21haW5MaXRlcmFsLgotICAgICAqIEBwYXJhbSBzdWJEb21haW4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRG9tYWluTGl0ZXJhbChTdHJpbmcgc3ViRG9tYWluKQotICAgIHsKLSAgICAgIGlmIChnZXRMYXN0RG9tYWluTGl0ZXJhbChzdWJEb21haW4sIDApID09IHN1YkRvbWFpbi5sZW5ndGgoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGFzdERvbWFpbkxpdGVyYWwoU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gICAgewotCi0gICAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwotICAgICAgLy9pbnQgbmV3SW5kZXggPSAwOwotCi0gICAgICAvLyBpZiBlbmQgaWYgdGhlIHN0cmluZwotICAgICAgaWYgKHN0YXJ0SW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICAgIC8vIGlmIHRoZSBiZWdpbiBpcyBub3QgJ1snCi0gICAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJ1snKQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgICAgaW5kZXgrKzsKLSAgICAgIHdoaWxlICh0cnVlKQotICAgICAgewotICAgICAgICBpbmRleCA9IGdldExhc3REdGV4dChzdHIsIGluZGV4KTsKLSAgICAgICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICAgICAgaWYgKEJhc2ljUnVsZXMuaXNRdW90ZWRQYWlyKHN0ciwgaW5kZXggLSAxKSkKLSAgICAgICAgewotICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgICAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIC8vIGlmIHRoZSBlbmQgaXMgbm90ICddJwotICAgICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9ICddJykKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICAgIGluZGV4Kys7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldExhc3REdGV4dChTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgICB7Ci0gICAgICBpZiAoc3RyLmxlbmd0aCgpID09IHN0YXJ0SW5kZXgpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgICAgaW50IGkgPSAwOwotICAgICAgZm9yICg7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0gICAgICAgIGkgPSBCYXNpY1J1bGVzLmdldExhc3RJbmRleExXUyhzdHIsIGkpOwotICAgICAgICBpZiAoIUJhc2ljUnVsZXMuaXNDSEFSKGNoKQotICAgICAgICAgIHx8IHN0ci5jaGFyQXQoaSkgPT0gJ1snCi0gICAgICAgICAgfHwgc3RyLmNoYXJBdChpKSA9PSAnXScKLSAgICAgICAgICB8fCBzdHIuY2hhckF0KGkpID09ICdcXCcKLSAgICAgICAgICB8fCBzdHIuY2hhckF0KGkpID09IEJhc2ljUnVsZXMuQ1IpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gaSArIDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBpICsgMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXNMb2NhbFBhcnQuCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb2NhbFBhcnQoU3RyaW5nIHN0cmluZykKLSAgICB7Ci0gICAgICBpZiAoc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0cmluZywgIi4iKTsKLSAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNXb3JkKHN0Lm5leHRUb2tlbigpKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXNXb3JkLgotICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV29yZChTdHJpbmcgc3RyaW5nKQotICAgIHsKLSAgICAgIGlmICghaXNBdG9tKHN0cmluZykgJiYgIWlzUXVvdGVkU3RyaW5nKHN0cmluZykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc0F0b20uCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBdG9tKFN0cmluZyBzdHJpbmcpCi0gICAgewotICAgICAgaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBpZiAoIUJhc2ljUnVsZXMuaXNDSEFSKHN0cmluZy5jaGFyQXQoaSkpCi0gICAgICAgICAgfHwgaXNTcGVjaWFsKHN0cmluZy5jaGFyQXQoaSkpCi0gICAgICAgICAgfHwgc3RyaW5nLmNoYXJBdChpKSA9PSAnICcKLSAgICAgICAgICB8fCBCYXNpY1J1bGVzLmlzQ1RMKHN0cmluZy5jaGFyQXQoaSkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXNTcGVjaWFsLgotICAgICAqIEBwYXJhbSBjCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NwZWNpYWwoY2hhciBjaCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgU1BFQ0lBTC5sZW5ndGg7IGluZGV4KyspCi0gICAgICB7Ci0gICAgICAgIGlmIChjaCA9PSBTUEVDSUFMW2luZGV4XSkKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXNGdWxsQWRkci4KLSAgICAgKiBAcGFyYW0gbWFpbGJveAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGdWxsQWRkcihTdHJpbmcgbWFpbGJveCkKLSAgICB7Ci0gICAgICBpZiAobWFpbGJveC5sZW5ndGgoKSA9PSAwKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBpbnQgaWR4TFQgPSBtYWlsYm94LmluZGV4T2YoJzwnKTsKLSAgICAgIGlmIChpZHhMVCA9PSAtMSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAvL2lzIHBocmFzZQotICAgICAgU3RyaW5nIHBocmFzZSA9IG1haWxib3guc3Vic3RyaW5nKDAsIGlkeExUKTsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGhyYXNlLCAiICIpOwotICAgICAgaWYgKHN0LmNvdW50VG9rZW5zKCkgPT0gMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFpc1dvcmQoc3QubmV4dFRva2VuKCkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChwaHJhc2UuY2hhckF0KHBocmFzZS5sZW5ndGgoKSAtIDEpICE9IEJhc2ljUnVsZXMuU1ApCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgLy9pcyByb3V0ZS1hZGRyCi0gICAgICBTdHJpbmcgcm91dGVBZGRyID0gbWFpbGJveC5zdWJzdHJpbmcoaWR4TFQgKyAxKTsKLSAgICAgIC8vIGlzIHJvdXRlCi0gICAgICBpbnQgaWR4VHdvU3BvdCA9IHJvdXRlQWRkci5pbmRleE9mKCc6Jyk7Ci0gICAgICBpZiAoaWR4VHdvU3BvdCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0Um91dGVBZGRyID0KLSAgICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKHJvdXRlQWRkci5zdWJzdHJpbmcoMCwgaWR4VHdvU3BvdCksICIsIik7Ci0gICAgICAgIGlmICghc3RSb3V0ZUFkZHIuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgd2hpbGUgKHN0Um91dGVBZGRyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNEb21haW4oc3RSb3V0ZUFkZHIubmV4dFRva2VuKCkpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vaXMgYWRkciBzcGVjCi0gICAgICBpbnQgaWR4R1QgPSByb3V0ZUFkZHIuaW5kZXhPZignPicpOwotICAgICAgaWYgKGlkeEdUID09IC0xIHx8IGlkeEdUICE9IChyb3V0ZUFkZHIubGVuZ3RoKCkgLSAxKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWlzU2hvcnRBZGRyKHJvdXRlQWRkci5zdWJzdHJpbmcoaWR4VHdvU3BvdCArIDEsIGlkeEdUKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIEhUVFAgcmVxdWVzdCBoZWFkZXJzLgotICAgKiBAcGFyYW0gaGVhZGVycyBIVFRQIHJlcXVlc3QgaGVhZGVycwotICAgKiBAcmV0dXJuIGJvb2xlYW4gIHRydWUgaWYgYWxsIEhUVFAgaGVhZGVycyBzdHJpbmcgaXMgY29uZm9ybSB0byBSRkMgMjYxNiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVIdHRwUmVxdWVzdEhlYWRlcnMoU3RyaW5nIGhlYWRlcnMpCi0gIHsKLQotICAgIE1lc3NhZ2VIZWFkZXIgbWggPSBuZXcgTWVzc2FnZUhlYWRlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1oLnBhcnNlSGVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShoZWFkZXJzLmdldEJ5dGVzKCkpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFN0cmluZyBoZWFkZXIgPSBudWxsOwotICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLSAgICBoZWFkZXIgPSBtaC5nZXRLZXkoMCk7Ci0gICAgaWYgKGhlYWRlciAhPSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgdmFsdWUgPSBtaC5nZXRWYWx1ZSgwKTsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vbWV0aG9kCi0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIiAiKTsKLSAgICBpZiAoIXN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICBpZiAoIWlzVG9rZW4oc3RyKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0gICAgaWYgKCFpc1VSSShzdHIpICYmICFzdHIuZXF1YWxzKCIqIikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIXN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHN0ciA9IHN0Lm5leHRUb2tlbigpOwotICAgIGlmICghaXNIVFRQVmVyc2lvbihzdHIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW50IGkgPSAxOwotICAgIHRyeQotICAgIHsKLSAgICAgIHdoaWxlICgoaGVhZGVyID0gbWguZ2V0S2V5KGkpKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2YWx1ZSA9IG1oLmdldFZhbHVlKGkpOwotICAgICAgICBpKys7Ci0KLSAgICAgICAgLy8gaXMgbWVzc2FnZS1oZWFkZXIgdG9rZW4KLSAgICAgICAgaWYgKCFpc1Rva2VuKGhlYWRlcikpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vLS0tLSBlbnRpdHktaGVhZGVycwotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9BTExPVykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzVmFsaWRBbGxvdyh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfQ09OVEVOVF9UWVBFKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNNZWRpYVR5cGUodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9DT05URU5UX0VOQ09ESU5HKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNUb2tlbih2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0NPTlRFTlRfTEFOR1VBR0UpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc0xhbmd1YWdlVGFnKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfQ09OVEVOVF9MRU5HSFQpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc0RpZGdpdCh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0NPTlRFTlRfTE9DQVRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1VSSSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfQ09OVEVOVF9SQU5HRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzVmFsaWRDb250ZW50UmFuZ2UodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0VYUElSRVMpCi0gICAgICAgICAgfHwgaGVhZGVyLmVxdWFscyhIRUFERVJfTEFTVF9NT0RJRklFRCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzSFRUUERhdGUodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tIGdlbmVyYWwtaGVhZGVycwotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfQ0FDSEVfQ09OVFJPTCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzVmFsaWRDYWNoZUNvbnRyb2wodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgLy9yZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9DT05ORUNUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNUb2tlbih2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfREFURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzSFRUUERhdGUodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX1BSQUdNQSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzUHJhZ21hRGVyZWN0aXZlKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9UUkFJTEVSKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNUb2tlbih2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfVFJBTlNGRVJfRU5DT0RJTkcpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1RyYW5zZmVyQ29kaW5nKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9VUEdSQURFKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNWYWxpZFVwZ3JhZGUodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX1ZJQSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzVmFsaWRWaWEodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX1dBUk5JTkcpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1ZhbGlkV2FybmluZyh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfQUNDRVBUKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNWYWxpZEFjY2VwdCh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfQUNDRVBUX0NIQVJTRVQpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1ZhbGlkQWNjZXB0Q2hhclNldCh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfQUNDRVBUX0VOQ09ESU5HKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNWYWxpZEFjY2VwdEVuY29kaW5nKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9BQ0NFUFRfTEFOR1VBR0UpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1ZhbGlkQWNjZXB0TGFuZ3VhZ2UodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0FVVEhPUklaQVRJT04pCi0gICAgICAgICAgfHwgaGVhZGVyLmVxdWFscyhIRUFERVJfUFJPWFlfQVVUSE9SSVpBVElPTikpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzQ3JlZGVudGlhbHModmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9FWFBFQ1QpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc0V4cGVjdGF0aW9uKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9GUk9NKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghTWFpbGJveFZhbGlkYXRvci52YWxpZGF0ZU1haWxib3godmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0lGX01BVENIKQotICAgICAgICAgIHx8IGhlYWRlci5lcXVhbHMoSEVBREVSX0lGX05PTkVfTUFUQ0gpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1ZhbGlkSWZNYXRjaCh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0lGX1JBTkdFKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNFbnRpdHlUYWcodmFsdWUpICYmICFpc0hUVFBEYXRlKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tCQkJCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9JRl9NT0RJRklFRF9TSU5DRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzSFRUUERhdGUodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9JRl9VTk1PRElGSUVEX1NJTkNFKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNIVFRQRGF0ZSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX01BWF9GT1JXQVJEUykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzRGlkZ2l0KHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9VU0VSX0FHRU5UKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNWYWxpZFVzZXJBZ2VudCh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1ZhbGlkVEUodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX1JBTkdFKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNSYW5nZSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0hPU1QpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc0hvc3QodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9SRUZFUkVSKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNVUkkodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzVmFsaWRJZk1hdGNoLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJZk1hdGNoKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGlmICgiKiIuZXF1YWxzKHZhbHVlLnRyaW0oKSkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIsIik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICBpZiAoIWlzRW50aXR5VGFnKHN0cikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1ZhbGlkVXBncmFkZS4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkVXBncmFkZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIiwiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgIGlmICghaXNQcm9kdWN0KHN0cikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNWYWxpZENhY2hlQ29udHJvbC4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ2FjaGVDb250cm9sKFN0cmluZyB2YWx1ZSkKLSAgewotCi0gICAgaWYgKHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIiwiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgIGludCBpbmRleCA9IHN0ci5pbmRleE9mKCc9Jyk7Ci0gICAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICB7Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCFpc1Rva2VuKHN0ci5zdWJzdHJpbmcoMCwgaW5kZXgpKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzdHJBZnRlckVxID0gc3RyLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICBpZiAoIWlzVG9rZW4oc3RyQWZ0ZXJFcSkgJiYgIWlzUXVvdGVkU3RyaW5nKHN0ckFmdGVyRXEpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzSFRUUFZlcnNpb24uCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSFRUUFZlcnNpb24oU3RyaW5nIHN0cikKLSAgewotICAgIGlmICghc3RyLnN0YXJ0c1dpdGgoIkhUVFAvIikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaW50IGlkeCA9ICJIVFRQLyIubGVuZ3RoKCk7Ci0KLSAgICBpbnQgaWR4MiA9IHN0ci5pbmRleE9mKCIuIik7Ci0KLSAgICAvLyAxKkRJR0lUCi0gICAgU3RyaW5nIHMgPSBzdHIuc3Vic3RyaW5nKGlkeCwgaWR4Mik7Ci0gICAgaWYgKCFpc0RpZGdpdChzKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHMgPSBzdHIuc3Vic3RyaW5nKGlkeDIgKyAxKTsKLSAgICBpZiAoIWlzRGlkZ2l0KHMpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzVmFsaWRXYXJuaW5nLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXYXJuaW5nKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHZhbHVlID0gdmFsdWUudHJpbSgpOwotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIgIik7Ci0gICAgU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpOwotCi0gICAgaWYgKHN0ci5sZW5ndGgoKSA+IDMgfHwgIWlzRGlkZ2l0KHN0cikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIXN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICBpZiAoIWlzSG9zdChzdHIpICYmICFpc1Rva2VuKHN0cikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvL2lmKCFzdC5oYXNNb3JlVG9rZW5zKCkpIHJldHVybiBmYWxzZTsKLSAgICBzdHIgPSBzdC5uZXh0VG9rZW4oIiIpLnRyaW0oKTsKLSAgICAvLz8/PwotCi0gICAgaW50IGxhc3RRdW90ZWRTdHJpbmcgPSBCYXNpY1J1bGVzLmdldExhc3RRdW90ZWRTdHJpbmcoc3RyLCAwKTsKLSAgICBpZiAobGFzdFF1b3RlZFN0cmluZyA9PSBzdHIubGVuZ3RoKCkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgZGF0YSA9IHN0ci5zdWJzdHJpbmcobGFzdFF1b3RlZFN0cmluZyk7Ci0gICAgICBpZiAoZGF0YS5jaGFyQXQoZGF0YS5sZW5ndGgoKSkgIT0gJ1wiJykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHN0ci5jaGFyQXQoMCkgIT0gJ1wiJykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFpc0hUVFBEYXRlKHN0ci5zdWJzdHJpbmcoMSwgZGF0YS5sZW5ndGgoKSAtIDEpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1ZhbGlkVmlhLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRWaWEoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIiwiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotCi0gICAgICBTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotCi0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsICIgIik7Ci0KLSAgICAgIC8vIHByb3RvY29sL3ZlcnNpb24KLSAgICAgIHN0ciA9IHN0Mi5uZXh0VG9rZW4oKTsKLSAgICAgIGludCBpZHggPSBzdHIuaW5kZXhPZigiLyIpOwotICAgICAgaWYgKGlkeCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFpc1Rva2VuKHN0cikpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIWlzVG9rZW4oc3RyLnN1YnN0cmluZygwLCBpZHgpKQotICAgICAgICAgIHx8ICFpc1Rva2VuKHN0ci5zdWJzdHJpbmcoaWR4ICsgMSkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgLy9ob3N0Ci0gICAgICBzdHIgPSBzdDIubmV4dFRva2VuKCk7Ci0gICAgICBpZiAoIWlzSG9zdChzdHIpICYmICFpc1Rva2VuKHN0cikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgLy9jb21tZW50Ci0gICAgICBpZiAoc3QyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgIHsKLSAgICAgICAgc3RyID0gc3QyLm5leHRUb2tlbigiIik7Ci0gICAgICAgIGlmICghaXNDb21tZW50KHN0ci50cmltKCkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzSG9zdC4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0hvc3QoU3RyaW5nIHZhbHVlKQotICB7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkwgdXJsID0gbmV3IFVSTCgiaHR0cDovLyIgKyB2YWx1ZSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1ZhbGlkQWxsb3cuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEFsbG93KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIiwiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgIGlmICghaXNUb2tlbihzdHIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1ZhbGlkQ29udGVudFJhbmdlLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDb250ZW50UmFuZ2UoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCJieXRlcyIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFN0cmluZyBzdHIgPSB2YWx1ZS5zdWJzdHJpbmcoImJ5dGVzIi5sZW5ndGgoKSkudHJpbSgpOwotCi0gICAgaW50IGlkeCA9IHN0ci5pbmRleE9mKCIvIik7Ci0gICAgaWYgKGlkeCA9PSAtMSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFN0cmluZyBieXRlUmFuZ2UgPSBzdHIuc3Vic3RyaW5nKDAsIGlkeCk7Ci0gICAgaW50IGlkeDIgPSBieXRlUmFuZ2UuaW5kZXhPZigiLSIpOwotICAgIGlmIChpZHgyID09IC0xKQotICAgIHsKLSAgICAgIGlmICghYnl0ZVJhbmdlLmVxdWFscygiKiIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIWlzRGlkZ2l0KGJ5dGVSYW5nZS5zdWJzdHJpbmcoMCwgaWR4MikpCi0gICAgICAgIHx8ICFpc0RpZGdpdChieXRlUmFuZ2Uuc3Vic3RyaW5nKGlkeDIgKyAxKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzRGlkZ2l0KHN0ci5zdWJzdHJpbmcoaWR4ICsgMSkpCi0gICAgICAmJiAhc3RyLnN1YnN0cmluZyhpZHggKyAxKS5lcXVhbHMoIioiKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1JhbmdlLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUmFuZ2UoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCJieXRlcz0iKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBTdHJpbmcgc3RyQnl0ZVJhbmdlID0gdmFsdWUuc3Vic3RyaW5nKCJieXRlcz0iLmxlbmd0aCgpKTsKLQotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyQnl0ZVJhbmdlLCAiLCIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICBpbnQgaWR4ID0gc3RyLmluZGV4T2YoIi0iKTsKLSAgICAgIGlmIChpZHggPT0gLTEpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChpZHggPT0gMCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFpc0RpZGdpdChzdHIuc3Vic3RyaW5nKDEpKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChpZHggPT0gKHN0ci5sZW5ndGgoKSAtIDEpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc0RpZGdpdChzdHIuc3Vic3RyaW5nKDAsIHN0ci5sZW5ndGgoKSAtIDEpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzRGlkZ2l0KHN0ci5zdWJzdHJpbmcoMCwgaWR4KSkKLSAgICAgICAgICAgIHx8ICFpc0RpZGdpdChzdHIuc3Vic3RyaW5nKGlkeCArIDEpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzVmFsaWRURS4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkVEUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgaWYgKHN0LmVxdWFscygidHJhaWxlcnMiKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgIGludCBpZHggPSBzdHIuaW5kZXhPZigiOyIpOwotICAgICAgaWYgKGlkeCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFpc0xhbmd1YWdlUmFuZ2Uoc3RyKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBfMSA9IHN0ci5zdWJzdHJpbmcoMCwgaWR4KS50cmltKCk7Ci0gICAgICAgIFN0cmluZyBfMiA9IHN0ci5zdWJzdHJpbmcoaWR4ICsgMSkudHJpbSgpOwotICAgICAgICBpZiAoIWlzTGFuZ3VhZ2VSYW5nZShfMSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIWlzUUFuZFFWYWx1ZShfMikpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzVmFsaWRVc2VyQWdlbnQuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFVzZXJBZ2VudChTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiICIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICBpZiAoIWlzUHJvZHVjdChzdHIpICYmICFpc0NvbW1lbnQoc3RyKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzQ29tbWVudC4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb21tZW50KFN0cmluZyBzdHIpCi0gIHsKLSAgICBpZiAoQmFzaWNSdWxlcy5nZXRMYXN0Q29tbWVudChzdHIsIDApICE9IHN0ci5sZW5ndGgoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNWYWxpZEFjY2VwdExhbmd1YWdlLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRBY2NlcHRMYW5ndWFnZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgaW50IGlkeCA9IHN0ci5pbmRleE9mKCI7Iik7Ci0gICAgICBpZiAoaWR4ID09IC0xKQotICAgICAgewotICAgICAgICBpZiAoIWlzVG9rZW4oc3RyKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBfMSA9IHN0ci5zdWJzdHJpbmcoMCwgaWR4KS50cmltKCk7Ci0gICAgICAgIFN0cmluZyBfMiA9IHN0ci5zdWJzdHJpbmcoaWR4ICsgMSkudHJpbSgpOwotICAgICAgICBpZiAoIWlzVG9rZW4oXzEpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCFpc0FjY2VwdFBhcmFtcyhfMikpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzTGFuZ3VhZ2VSYW5nZS4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMYW5ndWFnZVJhbmdlKFN0cmluZyBzdHIpCi0gIHsKLSAgICBpZiAoc3RyLnRyaW0oKS5lcXVhbHMoIioiKSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiLSIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBpZiAoIWlzOEFMUEhBKHN0Lm5leHRUb2tlbigpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNWYWxpZEFjY2VwdEVuY29kaW5nLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRBY2NlcHRFbmNvZGluZyhTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgaW50IGlkeCA9IHN0ci5pbmRleE9mKCI7Iik7Ci0gICAgICBpZiAoaWR4ID09IC0xKQotICAgICAgewotICAgICAgICBpZiAoIWlzVG9rZW4oc3RyKSAmJiAhc3RyLmVxdWFscygiKiIpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIF8xID0gc3RyLnN1YnN0cmluZygwLCBpZHgpLnRyaW0oKTsKLSAgICAgICAgU3RyaW5nIF8yID0gc3RyLnN1YnN0cmluZyhpZHggKyAxKS50cmltKCk7Ci0KLSAgICAgICAgaWYgKCghaXNUb2tlbihfMSkgJiYgIV8xLmVxdWFscygiKiIpKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghaXNRQW5kUVZhbHVlKF8yKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNWYWxpZEFjY2VwdENoYXJTZXQuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEFjY2VwdENoYXJTZXQoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIiwiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgIGludCBpZHggPSBzdHIuaW5kZXhPZigiOyIpOwotICAgICAgaWYgKGlkeCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFpc1Rva2VuKHN0cikgJiYgIXN0ci5lcXVhbHMoIioiKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBfMSA9IHN0ci5zdWJzdHJpbmcoMCwgaWR4KS50cmltKCk7Ci0gICAgICAgIFN0cmluZyBfMiA9IHN0ci5zdWJzdHJpbmcoaWR4ICsgMSkudHJpbSgpOwotCi0gICAgICAgIGlmICgoIWlzVG9rZW4oXzEpICYmICFfMS5lcXVhbHMoIioiKSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIWlzUUFuZFFWYWx1ZShfMikpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzVmFsaWRBY2NlcHQuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEFjY2VwdChTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIsIik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICBpbnQgaWR4ID0gc3RyLmluZGV4T2YoIjsiKTsKLSAgICAgIGlmIChpZHggPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNNZWRpYVJhbmdlKHN0cikpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIWlzTWVkaWFSYW5nZShzdHIuc3Vic3RyaW5nKDAsIGlkeCkudHJpbSgpKQotICAgICAgICAgIHx8ICFpc0FjY2VwdFBhcmFtcyhzdHIuc3Vic3RyaW5nKGlkeCArIDEpLnRyaW0oKSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzQWNjZXB0UGFyYW1zLgotICAgKiBAcGFyYW0gc3RyaW5nCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FjY2VwdFBhcmFtcyhTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgaWYgKHN0cmluZy50cmltKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nLCAiOyIpOwotICAgIFN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLQotICAgIGludCBpZHggPSBzdHIuaW5kZXhPZigiPSIpOwotICAgIGlmIChpZHggPT0gLTEpCi0gICAgewotICAgICAgaWYgKHN0ci5lcXVhbHMoInEiKSB8fCAhaXNUb2tlbihzdHIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3RyLnN1YnN0cmluZygwLCBpZHgpLmVxdWFscygicSIpKQotICAgICAgewotICAgICAgICBpZiAoIWlzUVZhbHVlKHN0ci5zdWJzdHJpbmcoaWR4ICsgMSkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCFpc1BhcmFtZXRlcldpdGhvdXRWYWx1ZShzdHIpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICBpZiAoIWlzUGFyYW1ldGVyV2l0aG91dFZhbHVlKHN0cikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzUUFuZFFWYWx1ZS4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNRQW5kUVZhbHVlKFN0cmluZyBzdHIpCi0gIHsKLSAgICBzdHIgPSBzdHIudHJpbSgpOwotICAgIGlmICghc3RyLnRyaW0oKS5zdGFydHNXaXRoKCJxPSIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghaXNRVmFsdWUoc3RyLnN1YnN0cmluZygicT0iLmxlbmd0aCgpKSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzUVZhbHVlLgotICAgKiBAcGFyYW0gc3RyaW5nCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1FWYWx1ZShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgaWYgKHN0cmluZy50cmltKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGludCBpZHggPSBzdHJpbmcuaW5kZXhPZigiLiIpOwotICAgIGlmIChpZHggPT0gLTEpCi0gICAgewotICAgICAgaWYgKCEiMCIuZXF1YWxzKHN0cmluZykgJiYgISIxIi5lcXVhbHMoc3RyaW5nKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIHN0ckRpZyA9IHN0cmluZy5zdWJzdHJpbmcoaWR4ICsgMSk7Ci0gICAgICBpZiAoc3RyRGlnLmxlbmd0aCgpID4gMykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc3RyaW5nLnN1YnN0cmluZygwLCBpZHgpLmVxdWFscygiMCIpKQotICAgICAgewotICAgICAgICBpZiAoIWlzRGlkZ2l0KHN0ckRpZykpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICghc3RyaW5nLnN1YnN0cmluZygwLCBpZHgpLmVxdWFscygiMSIpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ckRpZy5sZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHN0ckRpZy5jaGFyQXQoaSkgIT0gJzAnKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzTWVkaWFSYW5nZS4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNZWRpYVJhbmdlKFN0cmluZyBzdHIpCi0gIHsKLSAgICBpZiAoc3RyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW50IGlkeCA9IHN0ci5pbmRleE9mKCIvIik7Ci0gICAgaWYgKGlkeCA9PSAtMSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghaXNUb2tlbihzdHIuc3Vic3RyaW5nKDAsIGlkeCkpICYmICFzdHIuc3Vic3RyaW5nKDAsIGlkeCkuZXF1YWxzKCIqIikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFpc1Rva2VuKHN0ci5zdWJzdHJpbmcoaWR4ICsgMSkpCi0gICAgICAmJiAhc3RyLnN1YnN0cmluZyhpZHggKyAxKS5lcXVhbHMoIioiKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc0VudGl0eVRhZy4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VudGl0eVRhZyhTdHJpbmcgdmFsdWUpCi0gIHsKLQotICAgIGludCBpZHggPSAwOwotICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCJXLyIpKQotICAgICAgaWR4ID0gMjsKLSAgICBpZiAoIWlzUXVvdGVkU3RyaW5nKHZhbHVlLnN1YnN0cmluZyhpZHgpKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNFeHBlY3RhdGlvbi4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4cGVjdGF0aW9uKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZS5lcXVhbHMoIjEwMC1jb250aW51ZSIpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiOyIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBpZiAoIWlzUGFyYW1ldGVyV2l0aG91dFZhbHVlKHN0Lm5leHRUb2tlbigpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc0NyZWRlbnRpYWxzLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ3JlZGVudGlhbHMoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIiAiKTsKLSAgICBpZiAoIWlzVG9rZW4oc3QubmV4dFRva2VuKCkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFN0cmluZyBwYXJhbSA9IHN0Lm5leHRUb2tlbigiLCIpOwotICAgICAgaWYgKCFpc1BhcmFtZXRlcihwYXJhbSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzUHJvZHVjdC4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Byb2R1Y3QoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaW50IGlkeCA9IHZhbHVlLmluZGV4T2YoIi8iKTsKLSAgICBpZiAoaWR4ID09IC0xKQotICAgIHsKLSAgICAgIGlmICghaXNUb2tlbih2YWx1ZSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICghaXNUb2tlbih2YWx1ZS5zdWJzdHJpbmcoMCwgaWR4KSkKLSAgICAgICAgfHwgIWlzVG9rZW4odmFsdWUuc3Vic3RyaW5nKGlkeCArIDEpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNUcmFuc2ZlckNvZGluZy4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RyYW5zZmVyQ29kaW5nKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZS5lcXVhbHMoImNodW5rZWQiKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICI7Iik7Ci0gICAgICBpZiAoIWlzVG9rZW4oc3QubmV4dFRva2VuKCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFpc1BhcmFtZXRlcihzdC5uZXh0VG9rZW4oKSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzUGFyYW1ldGVyLgotICAgKiBAcGFyYW0gc3RyaW5nCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1BhcmFtZXRlcihTdHJpbmcgc3RyaW5nKQotICB7Ci0KLSAgICAvLyBjaGVjayBwYXJhbWV0ZXIJCi0gICAgaW50IGlkeCA9IHN0cmluZy5pbmRleE9mKCI9Iik7Ci0gICAgaWYgKCFpc1Rva2VuKHN0cmluZy5zdWJzdHJpbmcoMCwgaWR4KSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTdHJpbmcgcGFyVmFsdWUgPSBzdHJpbmcuc3Vic3RyaW5nKGlkeCArIDEpOwotICAgIGlmICghaXNUb2tlbihwYXJWYWx1ZSkgJiYgIWlzUXVvdGVkU3RyaW5nKHBhclZhbHVlKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1BhcmFtZXRlcldpdGhvdXRWYWx1ZS4KLSAgICogQHBhcmFtIHN0cmluZwotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJXaXRob3V0VmFsdWUoU3RyaW5nIHN0cmluZykKLSAgewotCi0gICAgLy8gY2hlY2sgcGFyYW1ldGVyCQotICAgIGludCBpZHggPSBzdHJpbmcuaW5kZXhPZigiPSIpOwotICAgIGlmIChpZHggIT0gLTEpCi0gICAgewotICAgICAgaWYgKCFpc1Rva2VuKHN0cmluZy5zdWJzdHJpbmcoMCwgaWR4KSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIFN0cmluZyBwYXJWYWx1ZSA9IHN0cmluZy5zdWJzdHJpbmcoaWR4ICsgMSk7Ci0gICAgICBpZiAoIWlzVG9rZW4ocGFyVmFsdWUpICYmICFpc1F1b3RlZFN0cmluZyhwYXJWYWx1ZSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCFpc1Rva2VuKHN0cmluZykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNQcmFnbWFEZXJlY3RpdmUuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQcmFnbWFEZXJlY3RpdmUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLmVxdWFscygibm8tY2FjaGUiKSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgaWR4ID0gdmFsdWUuaW5kZXhPZigiPSIpOwotICAgICAgaWYgKGlkeCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzVG9rZW4odmFsdWUpKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmcgc3RyID0gdmFsdWUuc3Vic3RyaW5nKGlkeCArIDEpOwotICAgICAgICBpZiAoaXNUb2tlbih2YWx1ZS5zdWJzdHJpbmcoMCwgaWR4KSkKLSAgICAgICAgICAmJiAoaXNUb2tlbihzdHIpIHx8IGlzUXVvdGVkU3RyaW5nKHN0cikpKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNIVFRQRGF0ZS4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0hUVFBEYXRlKFN0cmluZyB2YWx1ZSkKLSAgewotCi0gICAgU3RyaW5nIHJmYzExMjNfZGF0ZSA9ICJFRUUsIGRkIE1NTSB5eXl5IGhoOm1tOnNzICdHTVQnIjsKLSAgICBTdHJpbmcgcmZjODUwX2RhdGUgPSAiRUVFRSwgZGQtTU1NLXl5IGhoOm1tOnNzICdHTVQnIjsKLSAgICBTdHJpbmcgYXNjdGltZV9kYXRlID0gIkVFRSBNTU0gZCBoaDptbTpzcyB5eXl5IjsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQocmZjMTEyM19kYXRlLCBMb2NhbGUuVVMpOwotICAgICAgaWYgKHNkZi5wYXJzZSh2YWx1ZSkgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KHJmYzg1MF9kYXRlLCBMb2NhbGUuVVMpOwotICAgICAgaWYgKHNkZi5wYXJzZSh2YWx1ZSkgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KGFzY3RpbWVfZGF0ZSwgTG9jYWxlLlVTKTsKLSAgICAgIGlmIChzZGYucGFyc2UodmFsdWUpICE9IG51bGwpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzVVJJLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVVJJKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIFVSTCB1cmw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKHZhbHVlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICB1cmwgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0IiArIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTIpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNMYW5ndWFnZVRhZy4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xhbmd1YWdlVGFnKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGludCBpZHggPSB2YWx1ZS5pbmRleE9mKCItIik7Ci0gICAgaWYgKGlkeCA9PSAtMSkKLSAgICB7Ci0gICAgICByZXR1cm4gaXM4QUxQSEEodmFsdWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCFpczhBTFBIQSh2YWx1ZS5zdWJzdHJpbmcoMCwgaWR4KSkKLSAgICAgICAgfHwgIWlzOEFMUEhBKHZhbHVlLnN1YnN0cmluZyhpZHggKyAxKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzOEFMUEhBLgotICAgKiBAcGFyYW0gc3RyaW5nCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpczhBTFBIQShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgaWYgKHN0cmluZy5sZW5ndGgoKSA+IDggfHwgIWlzQUxQSEEoc3RyaW5nKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNBTFBIQS4KLSAgICogQHBhcmFtIHN0cmluZwotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBTFBIQShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIUJhc2ljUnVsZXMuaXNDSEFSKHN0cmluZy5jaGFyQXQoaSkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzRGlkZ2l0LgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlkZ2l0KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNoYXJbXSBjaHMgPSB2YWx1ZS50b0NoYXJBcnJheSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChjaHNbaV0gPCAnMCcgfHwgY2hzW2ldID4gJzknKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzTWVkaWFUeXBlLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWVkaWFUeXBlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICI7Iik7Ci0gICAgU3RyaW5nIG1lZGlhVHlwZSA9IHN0Lm5leHRUb2tlbigpOwotCi0gICAgaW50IGlkeCA9IG1lZGlhVHlwZS5pbmRleE9mKCIvIik7Ci0gICAgaWYgKCFpc1Rva2VuKG1lZGlhVHlwZS5zdWJzdHJpbmcoMCwgaWR4KSkKLSAgICAgIHx8ICFpc1Rva2VuKG1lZGlhVHlwZS5zdWJzdHJpbmcoaWR4ICsgMSkpKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgaWYgKCFpc1BhcmFtZXRlcihzdC5uZXh0VG9rZW4oIjsiKS50cmltKCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1F1b3RlZFN0cmluZy4KLSAgICogQHBhcmFtIHBhclZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlZFN0cmluZyhTdHJpbmcgcGFyVmFsdWUpCi0gIHsKLSAgICBpZiAoQmFzaWNSdWxlcy5nZXRMYXN0UXVvdGVkU3RyaW5nKHBhclZhbHVlLCAwKSAhPSBwYXJWYWx1ZS5sZW5ndGgoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1RleHQuCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RleHQoU3RyaW5nIHRleHQpCi0gIHsKLSAgICBjaGFyW10gY2hzID0gdGV4dC50b0NoYXJBcnJheSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChjaHNbaV0gPT0gJ1wiJykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNUb2tlbi4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Rva2VuKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiBCYXNpY1J1bGVzLmlzVG9rZW4odmFsdWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9KYXZhRW5jb2RpbmcucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0phdmFFbmNvZGluZy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjkzNTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0phdmFFbmNvZGluZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyAvKioKLSMgICogPGNvcHlyaWdodD4KLSMgICoKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgIElCTSBDb3Jwb3JhdGlvbiwgQmVhY29uIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kgSW5jLiBhbmQgb3RoZXJzLgotIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAqIAotIyAgKiBDb250cmlidXRvcnM6IAotIyAgKiAgIElCTSAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqICAgQmVhY29uSVQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqLwotIyMgSTE4TjogMjAwMy4wMi4yNiBtb2RpZmllZCBieSBLLk5ha2Fnb21lQEJlYWNvbklUIAotIyMgUHJvcGVydHkgZmlsZSB1c2VkIHRvIGdldCBKYXZhVk0gc3VwcG9ydGVkIGNoYXJhY3RlciBlbmNvZGluZy4KLQotSVNPODg1OV8xPUlTTzg4NTlfMSAKLUlTTzg4NTktMT1JU084ODU5XzEgCi11dGY4PVVURjggCi11dGYtOD1VVEY4IAotVVRGLTg9VVRGOCAKLXV0ZjE2PVVURi0xNiAKLXV0Zi0xNj1VVEYtMTYgCi1VVEYxNj1VVEYtMTYgCi0KLSMjIAotU2hpZnRfSklTPVdpbmRvd3MtMzFKCi0KLU1TOTMyPVdpbmRvd3MtMzFKCi0jU0pJUz1TaGlmdF9KSVMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9NSU1FQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9NSU1FQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NGI0YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvTUlNRUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLS8qKgotICogQSBzZXQgb2YgSFRUUCB2YWx1ZXMgdGhhdCBhcmUgZGVmaW5lZCBieSBOZXR3b3JrIFdvcmtpbmcgR3JvdXAuCi0gKiBodHRwOi8vd3d3LmlldGYub3JnLwotICoKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvciBJbHlhIEthbm9uaXJvdiAoa2lvQGlzZy5heG1vci5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FQ29uc3RhbnRzIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfSUQgPSAiQ29udGVudC1JRCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HID0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9UWVBFID0gIkNvbnRlbnQtVHlwZSI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvTUlNRVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9NSU1FVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmZDk0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9NSU1FVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci0KLS8qKgotICogU2V0IG9mIEhUVFBMIHJlbGF0ZWQgdXRpbGl0aWVzLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTUlNRVV0aWxzCi17Ci0KLSAgLyoqCi0gICAqIFV0aWxpdHkgdG8gcHJlc2VudCBNSU1FIGhlYWRlciBpbmZvcm1hdGlvbiBhcyBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMsIAotICAgKiBiYXNlZCBvbiAnOicgYXMgYXR0cmlidXRlLXZhbHVlIHNlcGFyYXRvci4KLSAgICogQHBhcmFtIG1pbWVIZWFkZXJTdHJpbmcgYW4gTUlNRSBoZWFkZXIgc3RyaW5nLgotICAgKiBAcGFyYW0gc2VwYXJhdG9ycyBhdHRyaWJ1dGUtdmFsdWUgc2VwYXJhdG9yIGxpc3QuCi0gICAqIEByZXR1cm4gTUlNRSBoZWFkZXIgaW5mb3JtYXRpb24gYXMgYXR0cmlidXRlLXZhbHVlIHBhaXJzLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gY3JlYXRlIE1JTUUgaGVhZGVyIGluZm9ybWF0aW9uIAotICAgKiAgICAgICAgIGFzIGF0dHJpYnV0ZS12YWx1ZSBwYWlycy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTWFwIGdldE1pbWVIZWFkZXJUb2tlbnMoU3RyaW5nIG1pbWVIZWFkZXJTdHJpbmcsIFN0cmluZyBzZXBhcmF0b3JzKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1pbWVIZWFkZXJTdHJpbmcsICJcblxyXGYiKTsKLSAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbGluZSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgIGludCBpbmRleCA9IGxpbmUuaW5kZXhPZihzZXBhcmF0b3JzKTsKLSAgICAgIGlmIChpbmRleCA+IDAgJiYgaW5kZXggPCBsaW5lLmxlbmd0aCgpIC0gMSkKLSAgICAgIHsKLSAgICAgICAgbWFwLnB1dChsaW5lLnN1YnN0cmluZygwLCBpbmRleCkudG9VcHBlckNhc2UoKSwgbGluZS5zdWJzdHJpbmcoaW5kZXggKyAxKS50cmltKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0gIAotICAvKioKLSAgICogVXRpbGl0eSB0byB0YWtlIHN1YiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBNSU1FIGhlYWRlcgotICAgKiBAcGFyYW0gbWltZUhlYWRlclN0cmluZyBhbiBNSU1FIGhlYWRlciBzdHJpbmcuCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIGF0dHJpYnV0ZSBuYW1lLgotICAgKiBAcGFyYW0gc3ViQXR0cmlidXRlTmFtZSBzdWIgYXR0cmlidXRlIG5hbWUuCi0gICAqIEByZXR1cm4gc3ViIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIE1JTUUgaGVhZGVyLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gZ2V0IHN1YiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBNSU1FIGhlYWRlci4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNaW1lSGVhZGVyU3ViQXR0cmlidXRlKFN0cmluZyBtaW1lSGVhZGVyU3RyaW5nLCAKLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgc3ViQXR0cmlidXRlTmFtZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBnZXQgYXR0cmlidXRlIHZhbHVlCi0gICAgU3RyaW5nIHZhbHVlID0gCi0gICAgICAoU3RyaW5nKSBnZXRNaW1lSGVhZGVyVG9rZW5zKG1pbWVIZWFkZXJTdHJpbmcsIjoiKS5nZXQoYXR0cmlidXRlTmFtZS50b1VwcGVyQ2FzZSgpKTsKLSAgICBpZih2YWx1ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIHNlYXJjaCBzdWIgYXR0cmlidXRlIHRva2VuCi0gICAgICBpbnQgaWR4USA9IHZhbHVlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihzdWJBdHRyaWJ1dGVOYW1lLnRvVXBwZXJDYXNlKCkrIj1cIiIpOwotICAgICAgaW50IGlkeCA9IHZhbHVlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihzdWJBdHRyaWJ1dGVOYW1lLnRvVXBwZXJDYXNlKCkrIj0iKTsKLSAgICAgIC8vIGlmIGF0dHJpYnV0ZSBpcyBxdW90ZWQKLSAgICAgIGlmIChpZHhRICE9IC0xKSAKLSAgICAgIHsKLSAgICAgICAgaWR4USArPSAoc3ViQXR0cmlidXRlTmFtZSsiPVwiIikubGVuZ3RoKCk7Ci0gICAgICAgIGludCBlSWR4USA9IHZhbHVlLmluZGV4T2YoIlwiIiwgaWR4USk7Ci0gICAgICAgIGlmIChlSWR4USAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoaWR4USwgZUlkeFEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gaWYgYXR0cmlidXRlIGlzIG5vdCBxdW90ZWQKLSAgICAgIGVsc2UgaWYgKGlkeCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWR4ICs9IChzdWJBdHRyaWJ1dGVOYW1lKyI9IikubGVuZ3RoKCk7Ci0gICAgICAgIGludCBlSWR4ID0gLTE7Ci0gICAgICAgIC8vIGZpbmQgZW5kIHNwYWNlIHNlcGFyYXRvcgotICAgICAgICBpZiAoKGVJZHggPSB2YWx1ZS5pbmRleE9mKCIgIiwgaWR4KSkgIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKGlkeCwgZUlkeCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZmluZCBjb21hIHNlcGFyYXRvcgotICAgICAgICBlbHNlIGlmICgoZUlkeCA9IHZhbHVlLmluZGV4T2YoIjsiLCBpZHgpKSAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoaWR4LCBlSWR4KTsKLSAgICAgICAgfQotICAgICAgICAvLyB0aGlzIGlzIGxhc3QgYXR0cmlidXRlCi0gICAgICAgIGVsc2UgCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKGlkeCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGlmIGF0dHJpYnV0ZSBkbyBub3QgZm91bmQKLSAgICAgIGVsc2UgCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogVXRpbGl0eSB0byB0YWtlIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIE1JTUUgaGVhZGVyCi0gICAqIEBwYXJhbSBtaW1lSGVhZGVyU3RyaW5nIGFuIE1JTUUgaGVhZGVyIHN0cmluZy4KLSAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgYXR0cmlidXRlIG5hbWUuCi0gICAqIEByZXR1cm4gYXR0cmlidXRlIHZhbHVlIGZyb20gTUlNRSBoZWFkZXIuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBnZXQgYXR0cmlidXRlIHZhbHVlIGZyb20gTUlNRSBoZWFkZXIuIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWltZUhlYWRlckF0dHJpYnV0ZShTdHJpbmcgbWltZUhlYWRlclN0cmluZywgCi0gICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSAKLSAgICAgICAgKFN0cmluZykgZ2V0TWltZUhlYWRlclRva2VucyhtaW1lSGVhZGVyU3RyaW5nLCI6IikuZ2V0KGF0dHJpYnV0ZU5hbWUudG9VcHBlckNhc2UoKSk7Ci0gICAgLy8gZ2V0IGZpcnN0IHRva2VuCi0gICAgaWYoKGF0dHJpYnV0ZVZhbHVlICE9IG51bGwpICYmIChhdHRyaWJ1dGVWYWx1ZS5pbmRleE9mKCI7IikgIT0gLTEpKSB7Ci0gICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVZhbHVlLnN1YnN0cmluZygwLCBhdHRyaWJ1dGVWYWx1ZS5pbmRleE9mKCI7IikpOwotICAgIH0KLSAgICByZXR1cm4gYXR0cmlidXRlVmFsdWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL01lc3NhZ2VMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9NZXNzYWdlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDRmMDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL01lc3NhZ2VMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjcmVhdGVzIGFuZCBtYWludGFpbnMgYSBtZXNzYWdlIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlTGlzdAotewotICAvKioKLSAgICogTWVzc2FnZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwcml2YXRlIFJlc291cmNlQnVuZGxlIG1lc3NhZ2VSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIERvIG5vdCBhbGxvdyB0aGlzIG9iamVjdCB0byBiZSBjcmVhdGVkIHdpdGggbnVsbCBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByaXZhdGUgTWVzc2FnZUxpc3QoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIE1lc3NhZ2VMaXN0LgotICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGVOYW1lICBhIHJlc291cmNlIGJ1bmRsZSBuYW1lLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VMaXN0KFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUpCi0gIHsKLSAgICB0aGlzLm1lc3NhZ2VSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZU5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICAgICBhIGtleS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlICAgICAgYSBkZWZhdWx0IG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQotICB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2Uoa2V5LCBudWxsLCBkZWZhdWx0TWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgICAgIGEga2V5LgotICAgKiBAcGFyYW0gbWVzc2FnZURhdGEgICAgICAgICBtZXNzYWdlIGRhdGEuCi0gICAqIEBwYXJhbSBkZWZhdWx0TWVzc2FnZSAgICAgIGEgZGVmYXVsdCBtZXNzYWdlLgotICAgKiBAcmV0dXJuIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKAotICAgIFN0cmluZyBrZXksCi0gICAgU3RyaW5nIG1lc3NhZ2VEYXRhLAotICAgIFN0cmluZyBkZWZhdWx0TWVzc2FnZSkKLSAgewotICAgIFN0cmluZyBtZXNzYWdlID0gZGVmYXVsdE1lc3NhZ2U7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXQgbWVzc2FnZQotICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gSWdub3JlIGFuZCBqdXN0IHVzZSBkZWZhdWx0IG1lc3NhZ2UKLSAgICB9Ci0KLSAgICBpZiAobWVzc2FnZURhdGEgIT0gbnVsbCkKLSAgICAgIG1lc3NhZ2UgKz0gIiAiICsgbWVzc2FnZURhdGE7Ci0KLSAgICAvLyBSZXR1cm4gbWVzc2FnZQotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IGEgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgICAgIGEga2V5LgotICAgKiBAcGFyYW0gZGVmYXVsdE1lc3NhZ2UgICAgICBhIGRlZmF1bHQgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICBwcmludE1lc3NhZ2Uoa2V5LCBudWxsLCBkZWZhdWx0TWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgYSBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgICAgYSBrZXkuCi0gICAqIEBwYXJhbSBtZXNzYWdlRGF0YSAgICAgICAgIG1lc3NhZ2UgZGF0YS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlICAgICAgYSBkZWZhdWx0IG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcmludE1lc3NhZ2UoCi0gICAgU3RyaW5nIGtleSwKLSAgICBTdHJpbmcgbWVzc2FnZURhdGEsCi0gICAgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQotICB7Ci0gICAgLy8gUHJpbnQgbWVzc2FnZQotICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRNZXNzYWdlKGtleSwgbWVzc2FnZURhdGEsIGRlZmF1bHRNZXNzYWdlKSk7Ci0gIH0KLQotICAvKioKLSAgICogU3RhdGljIGdldCBtZXNzYWdlLgotICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGVOYW1lICByZXNvdXJjZSBidW5kbGUgbmFtZS4KLSAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgICAgYSBrZXkuCi0gICAqIEBwYXJhbSBtZXNzYWdlRGF0YSAgICAgICAgIG1lc3NhZ2UgZGF0YS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlICAgICAgYSBkZWZhdWx0IG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoCi0gICAgU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSwKLSAgICBTdHJpbmcga2V5LAotICAgIFN0cmluZyBtZXNzYWdlRGF0YSwKLSAgICBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICBTdHJpbmcgbWVzc2FnZSA9IGRlZmF1bHRNZXNzYWdlOwotICAgIFJlc291cmNlQnVuZGxlIG1lc3NhZ2VSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXQgcmVzb3VyY2UgYnVuZGxlCi0gICAgICBtZXNzYWdlUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocmVzb3VyY2VCdW5kbGVOYW1lKTsKLQotICAgICAgLy8gR2V0IG1lc3NhZ2UKLSAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIElnbm9yZSBhbmQganVzdCB1c2UgZGVmYXVsdCBtZXNzYWdlCi0gICAgfQotCi0gICAgaWYgKG1lc3NhZ2VEYXRhICE9IG51bGwpCi0gICAgICBtZXNzYWdlICs9ICIgIiArIG1lc3NhZ2VEYXRhOwotCi0gICAgaWYgKCFtZXNzYWdlLmVuZHNXaXRoKCIuIikpCi0gICAgICBtZXNzYWdlICs9ICIuIjsKLQotICAgIC8vIFJldHVybiBtZXNzYWdlCi0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgbWVzc2FnZS4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlTmFtZSAgcmVzb3VyY2UgYnVuZGxlIG5hbWUuCi0gICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgICAgIGEga2V5LgotICAgKiBAcGFyYW0gbWVzc2FnZURhdGEgICAgICAgICBtZXNzYWdlIGRhdGEuCi0gICAqIEBwYXJhbSBkZWZhdWx0TWVzc2FnZSAgICAgIGEgZGVmYXVsdCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50TWVzc2FnZSgKLSAgICBTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lLAotICAgIFN0cmluZyBrZXksCi0gICAgU3RyaW5nIG1lc3NhZ2VEYXRhLAotICAgIFN0cmluZyBkZWZhdWx0TWVzc2FnZSkKLSAgewotICAgIC8vIFByaW50IG1lc3NhZ2UKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICBnZXRNZXNzYWdlKHJlc291cmNlQnVuZGxlTmFtZSwga2V5LCBtZXNzYWdlRGF0YSwgZGVmYXVsdE1lc3NhZ2UpKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9OdWxsVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvTnVsbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3Y2NhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9OdWxsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLS8qKgotICogVGhlIHV0aWxpdHkgY2xhc3MgdG8gYXV0b21hdGUgbnVsbCBjaGVja2luZy4KLSAqIAotICogQGF1dGhvciBLdWxpawotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFV0aWwKLXsKLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgY2hlY2tzIG9iamVjdHMgb24gZXhpc3RlbmNlIGFuZCBjb21wYXJlIHdpdGggPGNvZGU+ZXF1YWxzPC9jb2RlPiBtZXRob2QuCi0gICAqIEBwYXJhbSBvMSBmaXJzdCBvYmplY3QuCi0gICAqIEBwYXJhbSBvMiBzZWNvbmQgb2JqZWN0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgZmlyc3Qgb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSBzZWNvbmQgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbzEsIE9iamVjdCBvMikKLSAgewotICAgIHJldHVybiAoKG8xID09IG51bGwgJiYgbzIgPT0gbnVsbCkgfHwgKG8xICE9IG51bGwgJiYgbzEuZXF1YWxzKG8yKSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgY2hlY2tzIG9iamVjdCBvbiBleGlzdGVuY2UgYW5kIHJldHVybnMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbiB3aXRoIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZC4KLSAgICogQHBhcmFtIG8gc291cmNlIG9iamVjdC4KLSAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0IG8pCi0gIHsKLSAgICByZXR1cm4gKG8gPT0gbnVsbCkgPyBudWxsIDogby50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9PcGVyYXRpb25TaWduYXR1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL09wZXJhdGlvblNpZ25hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQwZTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL09wZXJhdGlvblNpZ25hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC4qOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC4qOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoZSBjbGFzcyBpbXBsZW1lbnRzIG1lY2hhbmlzbSBmb3IgY3JlYXRpbmcgdW5pcXVlIHNpZ25hdHVyZSBvZiBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS3VsaWsKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE9wZXJhdGlvblNpZ25hdHVyZQotewotICAvLyB0aGUgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVzc2FnZXMgaXMgcmVwcmVzZW50ZWQgYXMgZG9jdW1lbnQgc3R5bGUKLSAgLy8gdmljZSB2ZXJzYSBpcyBub3QgZ2VuZXJhbGx5IHRydWUKLSAgcHJpdmF0ZSBib29sZWFuIGlzRG9jdW1lbnRTdHlsZSA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0ZhdWx0ID0gZmFsc2U7Ci0KLSAgcHJvdGVjdGVkIExpc3Qgc2lnbmF0dXJlID0gbmV3IExpbmtlZExpc3QoKTsKLSAgcHJpdmF0ZSBFbGVtZW50IGZpcnN0Qm9keSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENsYXNzIG9wZXJhdGVzIGFzIGNvbnRhaW5lciBmb3IgbWF0Y2hlZCBvcGVyYXRpb24uCi0gICogQGF1dGhvciBLdWxpawotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBPcGVyYXRpb25NYXRjaAotICB7Ci0gICAgZmluYWwgcHJpdmF0ZSBTdHJpbmcgc3R5bGU7Ci0gICAgZmluYWwgcHJpdmF0ZSBCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbjsKLSAgICBmaW5hbCBwcml2YXRlIExpc3Qgc2lnbmF0dXJlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogQHBhcmFtIHN0eWxlIG9wZXJhdGlvbiBzdHlsZS4KLSAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIGEgc2lnbmF0dXJlLgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gYSBiaW5kaW5nIG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT3BlcmF0aW9uTWF0Y2goCi0gICAgICBTdHJpbmcgc3R5bGUsCi0gICAgICBMaXN0IHNpZ25hdHVyZSwKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uKQotICAgIHsKLSAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICAgIHRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlOwotICAgICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgfQotICAgIC8qKgotICAgICAqIEdldHMgb3BlcmF0aW9uIHN0eWxlLgotICAgICAqIEByZXR1cm4gb3BlcmF0aW9uIHN0eWxlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3BlcmF0aW9uU3R5bGUoKQotICAgIHsKLSAgICAgIHJldHVybiBzdHlsZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogR2V0cyBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIFdTREwgYmluZGluZyBvcGVyYXRpb24gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIG9wZXJhdGlvbiBzaWduYXR1cmUgYXMgbGlzdC4KLSAgICAgKiBAcmV0dXJuIG9wZXJhdGlvbiBzaWduYXR1cmUgYXMgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRTaWduYXR1cmUoKQotICAgIHsKLSAgICAgIHJldHVybiBzaWduYXR1cmU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBjbGFzcyBzZWFyY2hlcyBCaW5kaW5nT3BlcmF0aW9uIGJ5IHRoZSBnaXZlbiBPcGVyYXRpb25TaWdibmF0dXJlLiAKLSAgKiBAYXV0aG9yIEt1bGlrCi0gICAqLwotICBwdWJsaWMgZmluYWwgY2xhc3MgVmlzaXRvciBpbXBsZW1lbnRzIFdTRExWaXNpdG9yCi0gIHsKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuUGFydCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChQYXJ0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuU2VydmljZSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChTZXJ2aWNlIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuVHlwZXMsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoVHlwZXMgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5PcGVyYXRpb24sIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoT3BlcmF0aW9uIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuSW5wdXQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoSW5wdXQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5PdXRwdXQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoT3V0cHV0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuRmF1bHQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoRmF1bHQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5CaW5kaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KEJpbmRpbmcgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgICAgQmluZGluZ09wZXJhdGlvbiBvYmosCi0gICAgICBPYmplY3QgcGFyZW50LAotICAgICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuQmluZGluZ0lucHV0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgICAgQmluZGluZ0lucHV0IG9iaiwKLSAgICAgIE9iamVjdCBwYXJlbnQsCi0gICAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgICAgQmluZGluZ091dHB1dCBvYmosCi0gICAgICBPYmplY3QgcGFyZW50LAotICAgICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KEJpbmRpbmdGYXVsdCwgT2JqZWN0LCBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICAgIEJpbmRpbmdGYXVsdCBvYmosCi0gICAgICBPYmplY3QgcGFyZW50LAotICAgICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpIAotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChJbXBvcnQsIE9iamVjdCwgV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoSW1wb3J0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpIAotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChFbGVtZW50LCBPYmplY3QsIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KEVsZW1lbnQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoTWVzc2FnZSwgT2JqZWN0LCBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChNZXNzYWdlIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFBvcnQsIE9iamVjdCwgV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoUG9ydCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChQb3J0VHlwZSwgT2JqZWN0LCBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChQb3J0VHlwZSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChEZWZpbml0aW9uLCBPYmplY3QsIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KERlZmluaXRpb24gb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykgCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KEV4dGVuc2liaWxpdHlFbGVtZW50LCBPYmplY3QsIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqLAotICAgICAgT2JqZWN0IHBhcmVudCwKLSAgICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKSAKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoU09BUEhlYWRlciwgT2JqZWN0LCBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQSGVhZGVyIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpIAotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChTT0FQSGVhZGVyRmF1bHQsIE9iamVjdCwgV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgICBTT0FQSGVhZGVyRmF1bHQgb2JqLAotICAgICAgT2JqZWN0IHBhcmVudCwKLSAgICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKSAKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoU09BUEZhdWx0LCBPYmplY3QsIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBGYXVsdCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWlyZWRTdHlsZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc29hcEFjdGlvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTT0FQQWN0aW9uUmVxdWlyZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICogQ29uc3RydWN0b3IuCi0gICAgKi8KLSAgICBwdWJsaWMgVmlzaXRvcigpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSByZXF1aXJlZFN0eWxlIHJlcXVpcmVkIHN0eWxlLgotICAgICAqIEBwYXJhbSByZWdpc3RyeSB0eXBlcyByZWdpc3RyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmlzaXRvcihTdHJpbmcgcmVxdWlyZWRTdHlsZSwgVHlwZXNSZWdpc3RyeSByZWdpc3RyeSkKLSAgICB7Ci0gICAgICB0aGlzLnJlcXVpcmVkU3R5bGUgPSByZXF1aXJlZFN0eWxlOwotICAgICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2QgcmV0dXJucyBtYXRjaGVkIGJpbmRpbmcgb3BlcmF0aW9uLgotICAgICAqIEByZXR1cm4gQmluZGluZ09wZXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGdldE1hdGNoZWRPcGVyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBvcGVyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGhvZCBzZXRzIHVwIHJlcXVpcmVkIG9wZXJhdGlvbiB0byBiZSBmb3VuZC4KLSAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIGlzIHJwYyBhbmQgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHJlcXVpcmVkU3R5bGUgb3BlcmF0aW9uIHN0eWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkU3R5bGUoU3RyaW5nIHJlcXVpcmVkU3R5bGUpCi0gICAgewotICAgICAgdGhpcy5yZXF1aXJlZFN0eWxlID0gcmVxdWlyZWRTdHlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0aG9kIGluZGljYXRlcyB3aGV0aGVyIFNPQVAgQWN0aW9uIGJlIGluY2x1ZGVkIGludG8gb3BlcmF0aW9uLgotICAgICAqIHNpZ25hdHVyZS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgU09BUCBBY3Rpb24gaXNkIHJlcXVpcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU09BUEFjdGlvblJlcXVpcmVkKCkKLSAgICB7Ci0gICAgICByZXR1cm4gaXNTT0FQQWN0aW9uUmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBTT0FQIGFjdGlvbiB0byBiZSBpbmNsdWRlZCBpbnRvIHNpZ25hdHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTT0FQQWN0aW9uUmVxdWlyZWQoKQotICAgIHsKLSAgICAgIGlzU09BUEFjdGlvblJlcXVpcmVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgICBTT0FQQmluZGluZyBiaW5kaW5nLAotICAgICAgT2JqZWN0IHBhcmVudCwKLSAgICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3R5bGUgPQotICAgICAgICAoYmluZGluZy5nZXRTdHlsZSgpID09IG51bGwpCi0gICAgICAgICAgPyBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DCi0gICAgICAgICAgOiBiaW5kaW5nLmdldFN0eWxlKCk7Ci0gICAgICBjdHguYWRkUGFyYW1ldGVyKCJzdHlsZSIsIHN0eWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgICBTT0FQT3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICAgIE9iamVjdCBwYXJlbnQsCi0gICAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgc29hcEFjdGlvbiA9IG51bGw7Ci0gICAgICBTdHJpbmcgc3R5bGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICAgIGlmIChzdHlsZSA9PSBudWxsKQotICAgICAgICBzdHlsZSA9IChTdHJpbmcpIGN0eC5nZXRQYXJhbWV0ZXIoInN0eWxlIik7Ci0gICAgICBpZiAoIXJlcXVpcmVkU3R5bGUuZXF1YWxzKHN0eWxlKSkKLSAgICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIC8vaWYgKGlzU09BUEFjdGlvblJlcXVpcmVkKQotICAgICAgICBzb2FwQWN0aW9uID0gb3BlcmF0aW9uLmdldFNvYXBBY3Rpb25VUkkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoU09BUEJvZHkgYm9keSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICAgIC8vIGFzc2VydCBwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm9wID0gY3R4LmdldEJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgIGlmIChib3AuZ2V0T3BlcmF0aW9uKCkgPT0gbnVsbAotICAgICAgICB8fCBib3AuZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKSA9PSBudWxsCi0gICAgICAgIHx8IGJvcC5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKSA9PSBudWxsKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIE1lc3NhZ2UgbXNnID0gYm9wLmdldE9wZXJhdGlvbigpLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgTGlzdCBwYXJ0cyA9Ci0gICAgICAgIFdTRExVdGlsLmdldFBhcnRzKGJvcC5nZXRPcGVyYXRpb24oKSwgbXNnLCBib2R5LCByZXF1aXJlZFN0eWxlKTsKLQotICAgICAgUU5hbWUgYWRkaXRpb25hbE5hbWUgPSBudWxsOwotICAgICAgLy8gaWYgb3BlcmF0aW9uIGlzIHJwYywgYWRkIHRvIHBhcnRzIHFuYW1lIHFpdGggZnVuY3Rpb24gbmFtZQotICAgICAgaWYgKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMuZXF1YWxzKHJlcXVpcmVkU3R5bGUpKQotICAgICAgewotICAgICAgICAvLyBmb3VuZCBvdXQgdGFyZ2V0IG5hbWVzcGFjZQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gYm9keS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsIHx8IG5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgIC8vICEhIEFUVEVOVElPTgotICAgICAgICAgIC8vIG5hbWVzcGFjZSBzaG91bGQgYmUgcmV0cmlldmVkIGZyb20gc2VydmljZSB0YXJnZXQgbmFtZWFwY2UgICAgICAgICAgICAKLSAgICAgICAgICBuYW1lc3BhY2UgPSBjdHguZ2V0QmluZGluZygpLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgLy8gaW5zZXJ0IG9wZXJhdGlvbiBuYW1lIGFzIGZpcnN0IHNpZ25hdHVyZSBwYXJ0Ci0gICAgICAgIGFkZGl0aW9uYWxOYW1lID0KLSAgICAgICAgICBuZXcgUU5hbWUobmFtZXNwYWNlLCBjdHguZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIE9wZXJhdGlvblNpZ25hdHVyZSBvcCA9Ci0gICAgICAgIG5ldyBPcGVyYXRpb25TaWduYXR1cmUocGFydHMsIG51bGwsIHJlZ2lzdHJ5LCBmYWxzZSk7Ci0KLSAgICAgIGlmIChhZGRpdGlvbmFsTmFtZSAhPSBudWxsKQotICAgICAgICBvcC5nZXRTaWduYXR1cmUoKS5hZGQoMCwgYWRkaXRpb25hbE5hbWUpOwotICAgICAgLy9pZiAoaXNTT0FQQWN0aW9uUmVxdWlyZWQpCi0gICAgICAvL2lmIChzb2FwQWN0aW9uICE9IG51bGwpCi0gICAgICBpZiAoaXNTT0FQQWN0aW9uUmVxdWlyZWQgJiYgc29hcEFjdGlvbiAhPSBudWxsKQotICAgICAgICBvcC5nZXRTaWduYXR1cmUoKS5hZGQoMCwgc29hcEFjdGlvbik7Ci0gICAgICBpZiAob3AuZ2V0U2lnbmF0dXJlKCkuZXF1YWxzKHNpZ25hdHVyZSkpCi0gICAgICB7Ci0gICAgICAgIC8vIHJlcXVpcmVkIG9wZXJhdGlvbiBpcyBmb3VuZAotICAgICAgICBvcGVyYXRpb24gPSBjdHguZ2V0QmluZGluZ09wZXJhdGlvbigpOwotICAgICAgICBjdHguY2FuY2VsQmluZGluZ09wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgICAgICAgY3R4LmNhbmNlbEJpbmRpbmdQcm9jZXNzaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3AgPSBuZXcgT3BlcmF0aW9uU2lnbmF0dXJlKHBhcnRzLCBudWxsLCByZWdpc3RyeSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChhZGRpdGlvbmFsTmFtZSAhPSBudWxsKQotICAgICAgICAgIG9wLmdldFNpZ25hdHVyZSgpLmFkZCgwLCBhZGRpdGlvbmFsTmFtZSk7Ci0KLSAgICAgICAgLy9pZiAoaXNTT0FQQWN0aW9uUmVxdWlyZWQpCi0gICAgICAgIC8vaWYgKHNvYXBBY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgaWYgKGlzU09BUEFjdGlvblJlcXVpcmVkICYmIHNvYXBBY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICBvcC5nZXRTaWduYXR1cmUoKS5hZGQoMCwgc29hcEFjdGlvbik7Ci0KLSAgICAgICAgaWYgKG9wLmdldFNpZ25hdHVyZSgpLmVxdWFscyhzaWduYXR1cmUpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gcmVxdWlyZWQgb3BlcmF0aW9uIGlzIGZvdW5kCi0gICAgICAgICAgb3BlcmF0aW9uID0gY3R4LmdldEJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgICAgICBjdHguY2FuY2VsQmluZGluZ09wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgICAgICAgICBjdHguY2FuY2VsQmluZGluZ1Byb2Nlc3NpbmcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgY29uc3RydWN0b3IgY3JlYXRlcyBPcGVyYXRpb25TaWduYXR1cmUgZm9yIFNPQVAgbWVzc2FnZS4KLSAgICogQHBhcmFtIGRvYyBhIERvY3VtZW50IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBPcGVyYXRpb25TaWduYXR1cmUoRG9jdW1lbnQgZG9jKQotICB7Ci0gICAgRWxlbWVudCBib2R5ID0KLSAgICAgIFhNTFV0aWxzLmZpbmRDaGlsZEVsZW1lbnQoCi0gICAgICAgIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSwKLSAgICAgICAgV1NJVGFnLkVMRU1fU09BUF9CT0RZKTsKLSAgICBwcm9jZXNzUGFydHMoYm9keSwgZmFsc2UpOwotICAgIGlzRG9jdW1lbnRTdHlsZSB8PSAoc2lnbmF0dXJlLnNpemUoKSA+IDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIE9wZXJhdGlvblNJZ25hdHVyZSBmb3IgCi0gICAqIGxpc3Qgb2YgPGNvZGU+UGFydDwvY29kZT4gb2JqZWN0cyBhbmQgZ2l2ZW4gV1NETCBkb2N1bWVudCB3aXRoaW4gdGhlc2UKLSAgICogcGFydHMgYXJlIGRlZmluZWQuCi0gICAqIAotICAgKiBAcGFyYW0gcGFydHMgYSBsaXN0IG9mIFBhcnQgb2JqZWN0cy4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCBhIFdTREwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSByZWdpc3RyeSBhIHR5cGVzIHJlZ2lzdHJ5LgotICAgKiBAcGFyYW0gcGFydGlhbCBhIHBhcnRpYWwgc3RhdHVzLgotICAgKi8KLSAgcHVibGljIE9wZXJhdGlvblNpZ25hdHVyZSgKLSAgICBMaXN0IHBhcnRzLAotICAgIERvY3VtZW50IHdzZGxEb2N1bWVudCwKLSAgICBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5LAotICAgIGJvb2xlYW4gcGFydGlhbCkKLSAgewotICAgIGlmIChwYXJ0cyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gcGFydHMuaXRlcmF0b3IoKTsKLQotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGl0Lm5leHQoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IChwYXJ0aWFsKSA/IHBhcnQuZ2V0TmFtZSgpIDogbnVsbDsKLSAgICAgICAgUU5hbWUgdHlwZU5hbWUgPSBwYXJ0LmdldFR5cGVOYW1lKCk7Ci0gICAgICAgIFFOYW1lIGVsZW1lbnROYW1lID0gcGFydC5nZXRFbGVtZW50TmFtZSgpOwotCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAiIjsKLQotICAgICAgICAvLyBJZiB0eXBlIG5hbWUgaXMgbm90IG51bGwsIHRoZW4gYSB0eXBlIGVsZW1lbnQgd2FzIHVzZWQgc28gaXQgc2hvdWxkIGJlIGFuIFJQQyBzdHlsZSBzaWduYXR1cmUgCi0gICAgICAgIGlmICh0eXBlTmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gUGFydCB3cmFwcGVycyBkbyBub3QgaGF2ZSBuYW1lc3BhY2VzIAotICAgICAgICAgIG5hbWVzcGFjZSA9ICIiOwotCi0gICAgICAgICAgaWYgKGxvY2FsTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgbG9jYWxOYW1lID0gdHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBlbGVtZW50IG5hbWUgaXMgbm90IG51bGwsIHRoZW4gaXQgc2hvdWxkIGJlIGEgZG9jdW1lbnQgc3R5bGUgc2lnbmF0dXJlCi0gICAgICAgIGVsc2UgaWYgKGVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2UgPSBlbGVtZW50TmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgIGlmIChsb2NhbE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIGxvY2FsTmFtZSA9IGVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2lnbmF0dXJlLmFkZChuZXcgUU5hbWUobmFtZXNwYWNlLCBsb2NhbE5hbWUpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpc0NyZWF0ZWQgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgcmVjcmVhdGVzIE9wZXJhdGlvblNpZ25hdHVyZSB3aXRoIGFzc3VtcHRpb24gdGhhdCBvcGVyYXRpb24gaXMKLSAgICogUlBDLgotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlUlBDU2lnbmF0dXJlKCkKLSAgewotICAgIGlzQ3JlYXRlZCA9IGZhbHNlOwotICAgIGlmIChmaXJzdEJvZHkgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBwcm9jZXNzUGFydHMoZmlyc3RCb2R5LCB0cnVlKTsKLSAgICBpc0RvY3VtZW50U3R5bGUgPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBJbnRlcm5hbCBtZXRob2QgcHJvY2Vzc2VzIFdTREwgcGFydHMgYW5kIGNyZWF0ZXMgb3BlcmF0aW9uIHNpZ25hdHVyZS4KLSAgICogQHBhcmFtIHBhcmVudAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYXJ0cyhOb2RlIHBhcmVudCwgYm9vbGVhbiBwcm9jZXNzV3JhcHBlcikKLSAgewotICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBOb2RlIG4gPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCi0gICAgICAvLyB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhhdCBmaXJzdCB0YWcgaXMgcHJvY2Vzc2VkCi0gICAgICBib29sZWFuIGlzRmlyc3QgPSB0cnVlOwotICAgICAgLy8gaXRlcmF0ZSBhbGwgYm9kaWVzCi0gICAgICB3aGlsZSAobiAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRmlyc3QgJiYgZmlyc3RCb2R5ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgZmlyc3RCb2R5ID0gKEVsZW1lbnQpIG47Ci0gICAgICAgICAgICAvLyBjaGVjayBzb2FwZW52OmZhdWx0Ci0gICAgICAgICAgICBpZiAoWE1MVXRpbHMuZXF1YWxzKG4sIFdTSVRhZy5FTEVNX1NPQVBfRkFVTFQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpc0ZhdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaXNDcmVhdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gbi5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gbi5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgICAgIC8qSSBoYXZlIG5vIGlkZWEgd2h5IHRoaXMgY29kZSBpcyBpbiBoZXJlIHNpbmNlIGl0IG1ha2VzIG5vIHNlbnNlIGF0IGFsbCwgc28gSSBhbSBjb21tZW50aW5nIGl0IG91dAotICAgICAgICAgIC8vIHRyeSB0byBnZXQgeHNpOnRhZwotICAgICAgICAgIGlmIChYTUxVdGlscy5nZXRBdHRyaWJ1dGUoKEVsZW1lbnQpIG4sIFdTSVRhZy5BVFRSX1hTSV9UWVBFKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIC8vIHdlIHN1cHBvc2UgdGhhdCBSUEMgc3R5bGUgZG9lcyBub3QgdXNlIHhzaTp0eXBlIGF0dHJpYnV0ZQotICAgICAgICAgICAgICBpc0RvY3VtZW50U3R5bGUgPSB0cnVlOwotICAgICAgICAgICAgICBBdHRyIHhzaVR5cGUgPSBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoKEVsZW1lbnQpIG4sIFdTSVRhZy5BVFRSX1hTSV9UWVBFKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIFN0cmluZyB4c2lWYWx1ZSA9IHhzaVR5cGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICAgIGludCBpID0geHNpVmFsdWUuaW5kZXhPZignOicpOwotICAgICAgICAgICAgICBpZiAoaSAhPSAtMSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gWE1MVXRpbHMuZmluZE5hbWVzcGFjZVVSSShuLCB4c2lWYWx1ZS5zdWJzdHJpbmcoMCwgaSkpOwotICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lID0geHNpVmFsdWUuc3Vic3RyaW5nKGkrMSk7Ci0gICAgICAgICAgICAgIH0gCi0gICAgICAgICAgfQotICAgICAgICAgICovCi0KLSAgICAgICAgICAvLyBJZiB0aGlzIGlzIHJwYy1saXRlcmFsIGFuZCBwcm9jZXNzaW5nIGEgcGFydCAobm90IHRoZSB3cmFwcGVyKSwgdGhlbiB0aGUgcGFydCBzaG91bGQgbm90IGhhdmUgYSBuYW1lc3BhY2UKLSAgICAgICAgICAvLyBBbmQgaWYgaXQgZG9lcywgdGhlbiBvbmUgb2YgdGhlIHRlc3QgYXNzZXJ0aW9ucyB3aWxsIGRldGVjdCBpdAotICAgICAgICAgIGlmICghaXNEb2N1bWVudFN0eWxlICYmIHByb2Nlc3NXcmFwcGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZSA9ICIiOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCB8fCBuYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNEb2N1bWVudFN0eWxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL0VsZW1lbnQgZmlyc3RDaGlsZCAgPSBudWxsOwotICAgICAgICAgICAgICBOb2RlIGl0ID0gbi5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICAgIHdoaWxlIChpdCAhPSBudWxsICYmICEoaXQgaW5zdGFuY2VvZiBFbGVtZW50KSkKLSAgICAgICAgICAgICAgICBpdCA9IGl0LmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgIGlmIChpdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IGl0LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIG5vcm1hbGl6ZSBuYW1lc3BhY2VzLiBBbGwgZW1wdHkgbmFtZXNwYWNlcyAtPiBudWxsIAotICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCAmJiBuYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIG5hbWVzcGFjZSA9IG51bGw7Ci0KLSAgICAgICAgICAvLyBwdXQgcGFydCBpbnRvIHNpZ25hdHVyZQotICAgICAgICAgIHNpZ25hdHVyZS5hZGQobmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxOYW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaXNDcmVhdGVkID0gZmFsc2U7IC8vIG5vdCBmb3VuZCA/Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaXNDcmVhdGVkID0gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvcGVyYXRpb24gaGFzIGRvY3VtZW50IHN0eWxlIG9yIFJQQy4gCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBvcGVyYXRpb24gaGFzIGRvY3VtZW50IHN0eWxlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudFN0eWxlKCkKLSAgewotICAgIHJldHVybiBpc0RvY3VtZW50U3R5bGU7Ci0gIH0KLQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgV1NETCBmYXVsdCBwYXJ0cyBzaG91bGQgYmUgaW5jbHVkZWQgaW50byBzaWduYXR1cmUgb3IKLSAgICogbm90LgotICAgKiBAcmV0dXJuIHRydWUgaWYgV1NETCBmYXVsdCBwYXJ0cyBzaG91bGQgYmUgaW5jbHVkZWQgaW50byBzaWduYXR1cmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ZhdWx0KCkKLSAgewotICAgIHJldHVybiBpc0ZhdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB0aGF0IG9wZXJhdGlvbiBzaWduYXR1cmUgd2FzIGNyZWF0ZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBvcGVyYXRpb24gc2lnbmF0dXJlIHdhcyBjcmVhdGVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNDcmVhdGVkKCkKLSAgewotICAgIHJldHVybiBpc0NyZWF0ZWQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBvcGVyYXRpb24gc2lnbmF0dXJlIGNyZWF0ZWQgZm9yIFNPQVAgbWVzc2FnZS4KLSAgICogQHJldHVybiBvcGVyYXRpb24gc2lnbmF0dXJlIGNyZWF0ZWQgZm9yIFNPQVAgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFNpZ25hdHVyZSgpCi0gIHsKLSAgICByZXR1cm4gc2lnbmF0dXJlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0gICAqLwotICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgewotICAgIHJldHVybiBzaWduYXR1cmUuaGFzaENvZGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKLSAgewotICAgIGlmIChvIGluc3RhbmNlb2YgT3BlcmF0aW9uU2lnbmF0dXJlKQotICAgICAgcmV0dXJuIHNpZ25hdHVyZS5lcXVhbHMoKChPcGVyYXRpb25TaWduYXR1cmUpIG8pLmdldFNpZ25hdHVyZSgpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBtYXRjaGVzIG9wZXJhdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gU09BUCBtZXNzYWdlIHJlcXVlc3QsCi0gICAqIFdTREwgYmluZGluZywgYW5kIHNvYXBBY3Rpb24uCi0gICAqIAotICAgKiBAcGFyYW0gaW5wdXRNZXNzYWdlIGFuIFNPQVAgbWVzc2FnZSByZXF1ZXN0LgotICAgKiBAcGFyYW0gc29hcEFjdGlvbiBhIHNvYXAgYWN0aW9uLgotICAgKiBAcGFyYW0gYmluZGluZyBhIFdTREwgYmluZGluZy4KLSAgICogQHBhcmFtIHJlZ2lzdHJ5IGEgdHlwZXMgcmVnaXN0cnkuCi0gICAqIEByZXR1cm4gT3BlcmF0aW9uTWF0Y2ggb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBPcGVyYXRpb25NYXRjaCBtYXRjaE9wZXJhdGlvbigKLSAgICBEb2N1bWVudCBpbnB1dE1lc3NhZ2UsCi0gICAgU3RyaW5nIHNvYXBBY3Rpb24sCi0gICAgQmluZGluZyBiaW5kaW5nLAotICAgIFR5cGVzUmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgICByZXR1cm4gbWF0Y2hPcGVyYXRpb24oaW5wdXRNZXNzYWdlLCBzb2FwQWN0aW9uLCBiaW5kaW5nLCByZWdpc3RyeSwgdHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICAgKiBUaGUgbWV0aG9kIG1hdGNoZXMgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBTT0FQIG1lc3NhZ2UgcmVxdWVzdCwKLSAgICAgKiBXU0RMIGJpbmRpbmcsIGFuZCBzb2FwQWN0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dE1lc3NhZ2UgU09BUCBtZXNzYWdlIHJlcXVlc3QuCi0gICAgICogQHBhcmFtIHNvYXBBY3Rpb24gYSBzb2FwIGFjdGlvbi4KLSAgICAgKiBAcGFyYW0gYmluZGluZyBhIFdTREwgYmluZGluZy4KLSAgICAgKiBAcGFyYW0gcmVnaXN0cnkgYSB0eXBlcyByZWdpc3RyeS4KLSAgICAgKiBAcGFyYW0gc29hcEFjdGlvblJlcXVpcmVkIG11c3QgcHJvY2VzcyB0aGUgc29hcEFjdGlvbiB2YWx1ZSBldmVuIGlmIGl0IGlzIG51bGwgCi0gICAgICogQHJldHVybiBPcGVyYXRpb25NYXRjaCBvYmplY3QuCi0gICAgICovCi0gIHB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uTWF0Y2ggbWF0Y2hPcGVyYXRpb24oCi0gICAgRG9jdW1lbnQgaW5wdXRNZXNzYWdlLAotICAgIFN0cmluZyBzb2FwQWN0aW9uLAotICAgIEJpbmRpbmcgYmluZGluZywKLSAgICBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5LAotICAgIGJvb2xlYW4gc29hcEFjdGlvblJlcXVpcmVkKQotICB7Ci0gICAgLy8gUGFyc2UgcmVxdWVzdCBtZXNzYWdlCi0gICAgT3BlcmF0aW9uU2lnbmF0dXJlIHNpZ25hdHVyZSA9IG5ldyBPcGVyYXRpb25TaWduYXR1cmUoaW5wdXRNZXNzYWdlKTsKLSAgICBpZiAoIXNpZ25hdHVyZS5pc0NyZWF0ZWQoKSkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgLy8gZmlyc3Qgb2YgYWxsIGxvb2tpbmcgZm9yIGRvY3VtZW50IHN0eWxlCi0gICAgLy8gYmVjYXVzZSBycGMgc3R5bGUgaXMgc3Vic2V0IG9mIGRvY3VtZW50IHN0eWxlICAKLSAgICBPcGVyYXRpb25TaWduYXR1cmUuVmlzaXRvciByZXNvbHZlciA9Ci0gICAgICBzaWduYXR1cmUubmV3IFZpc2l0b3IoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQywgcmVnaXN0cnkpOwotCi0gICAgLy8gbm9ybWFsaXplIFNPQVBBY3Rpb24KLSAgICBpZiAoc29hcEFjdGlvbiAhPSBudWxsCi0gICAgICAmJiBzb2FwQWN0aW9uLmxlbmd0aCgpID4gMQotICAgICAgJiYgc29hcEFjdGlvbi5jaGFyQXQoMCkgPT0gJyInCi0gICAgICAmJiBzb2FwQWN0aW9uLmNoYXJBdChzb2FwQWN0aW9uLmxlbmd0aCgpIC0gMSkgPT0gJyInKQotICAgICAgc29hcEFjdGlvbiA9IHNvYXBBY3Rpb24uc3Vic3RyaW5nKDEsIHNvYXBBY3Rpb24ubGVuZ3RoKCkgLSAxKTsKLQotICAgIC8vICAgICAgaWYgc29hcCBhY3Rpb24gVVJJIHByb2Nlc3NpbmcgcmVxdWlyZWQKLSAgICAvLyBpZiBzb2FwIGFjdGlvbiBVUkkgcHJvY2Vzc2luZyByZXF1aXJlZCAKLSAgICAvLyBhbmFseXplIFNPQVBBY3Rpb24gYWZ0ZXIgcGFydHMgYmVpbmcgcHJvY2Vzc2VkCi0gICAgLy8gcHV0IFNPQVBBY3Rpb24gaW50byBzaWduYXR1cmUKLSAgICAvL2lmIChzb2FwQWN0aW9uICE9IG51bGwgJiYgc29hcEFjdGlvbi5sZW5ndGgoKSA+IDApIHsKLSAgICBpZiAoc29hcEFjdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHNpZ25hdHVyZS5nZXRTaWduYXR1cmUoKS5hZGQoMCwgc29hcEFjdGlvbik7Ci0gICAgfQotCi0gICAgaWYgKHNvYXBBY3Rpb25SZXF1aXJlZCkKLSAgICAgIHJlc29sdmVyLnNldFNPQVBBY3Rpb25SZXF1aXJlZCgpOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQocmVzb2x2ZXIpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHJlc29sdmVyKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQmluZGluZyh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQm9keSh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQT3BlcmF0aW9uKHRydWUpOwotCi0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlQmluZGluZ091dHB1dCgpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZShiaW5kaW5nKTsKLQotICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gcmVzb2x2ZXIuZ2V0TWF0Y2hlZE9wZXJhdGlvbigpOwotICAgIGlmIChvcGVyYXRpb24gPT0gbnVsbCAmJiAhc2lnbmF0dXJlLmlzRG9jdW1lbnRTdHlsZSgpKQotICAgIHsKLSAgICAgIHJlc29sdmVyLnNldFJlcXVpcmVkU3R5bGUoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQyk7Ci0gICAgICBzaWduYXR1cmUuY3JlYXRlUlBDU2lnbmF0dXJlKCk7Ci0gICAgICB0cmF2ZXJzYWwudHJhdmVyc2UoYmluZGluZyk7Ci0gICAgICBvcGVyYXRpb24gPSByZXNvbHZlci5nZXRNYXRjaGVkT3BlcmF0aW9uKCk7Ci0gICAgICBpZiAob3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgT3BlcmF0aW9uTWF0Y2goCi0gICAgICByZXNvbHZlci5yZXF1aXJlZFN0eWxlLAotICAgICAgc2lnbmF0dXJlLmdldFNpZ25hdHVyZSgpLAotICAgICAgcmVzb2x2ZXIuZ2V0TWF0Y2hlZE9wZXJhdGlvbigpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvUGFpci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvUGFpci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzFhMTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1BhaXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi0vKioKLSAqIFRoZSBjbGFzcyByZXByZXNlbnRzIHBhaXIgb2YgdmFsdWVzLgotICogCi0gKiBAYXV0aG9yIEt1bGlrCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQYWlyCi17Ci0gIGZpbmFsIHByaXZhdGUgT2JqZWN0IGZpcnN0OwotICBmaW5hbCBwcml2YXRlIE9iamVjdCBzZWNvbmQ7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gZmlyc3Qgb2JqZWN0Ci0gICAqIEBwYXJhbSBzZWNvbmQgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFBhaXIoT2JqZWN0IGZpcnN0LCBPYmplY3Qgc2Vjb25kKQotICB7Ci0gICAgdGhpcy5maXJzdCA9IGZpcnN0OwotICAgIHRoaXMuc2Vjb25kID0gc2Vjb25kOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgZmlyc3Qgb2JqZWN0LgotICAgKiBAcmV0dXJuIE9iamVjdAotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRGaXJzdCgpCi0gIHsKLSAgICByZXR1cm4gZmlyc3Q7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBzZWNvbmQgb2JqZWN0LgotICAgKiBAcmV0dXJuIE9iamVjdAotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRTZWNvbmQoKQotICB7Ci0gICAgcmV0dXJuIHNlY29uZDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKLSAgewotICAgIGlmIChvID09IG51bGwgfHwgIShvIGluc3RhbmNlb2YgUGFpcikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgUGFpciBwID0gKFBhaXIpIG87Ci0gICAgcmV0dXJuICgKLSAgICAgIE51bGxVdGlsLmVxdWFscyhwLmdldEZpcnN0KCksIGZpcnN0KQotICAgICAgICAmJiBOdWxsVXRpbC5lcXVhbHMocC5nZXRTZWNvbmQoKSwgc2Vjb25kKSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLSAgICovCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICB7Ci0gICAgaW50IGNvZGUgPSAwOwotICAgIGlmIChmaXJzdCAhPSBudWxsKQotICAgICAgY29kZSArPSBmaXJzdC5oYXNoQ29kZSgpOwotICAgIGlmIChzZWNvbmQgIT0gbnVsbCkKLSAgICAgIGNvZGUgKz0gc2Vjb25kLmhhc2hDb2RlKCk7Ci0gICAgcmV0dXJuIGNvZGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1NldENvb2tpZTJWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1NldENvb2tpZTJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3MTRlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9TZXRDb29raWUyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgdGhlIGNvb2tpZXMgY29uZm9ybSB0byBSRkMyOTY1LgotICogCi0gKiBAYXV0aG9yIEJhbHRhawotICovCi1wdWJsaWMgY2xhc3MgU2V0Q29va2llMlZhbGlkYXRvcgotewotCi0gIHByaXZhdGUgVmVjdG9yIGNvbW1lbnRWZWN0ID0gbmV3IFZlY3RvcigpOwotICBwcml2YXRlIFZlY3RvciBjb21tZW50VVJMVmVjdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBWZWN0b3IgZG9tYWluVmVjdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBWZWN0b3IgbWF4X0FnZVZlY3QgPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgVmVjdG9yIHBhdGhWZWN0ID0gbmV3IFZlY3RvcigpOwotICBwcml2YXRlIFZlY3RvciBwb3J0VmVjdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBWZWN0b3IgdmVyc2lvblZlY3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGNvbW1lbnQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGNvbW1lbnRVUkwgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGRvbWFpbiA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gbWF4X2FnZSA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gcGF0aCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gcG9ydCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmVyc2lvbiA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBNZXRob2QgcmVzZXRGbGFncy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCByZXNldEZsYWdzKCkKLSAgewotICAgIGNvbW1lbnQgPSBmYWxzZTsKLSAgICBjb21tZW50VVJMID0gZmFsc2U7Ci0gICAgZG9tYWluID0gZmFsc2U7Ci0gICAgbWF4X2FnZSA9IGZhbHNlOwotICAgIHBhdGggPSBmYWxzZTsKLSAgICBwb3J0ID0gZmFsc2U7Ci0gICAgdmVyc2lvbiA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoZSBzdHJpbmcgc2F0aXNmeSB0aGUgIlNldC1Db29raWUyIiBoZWFkZXIgdmFsdWUuCi0gICAqIEBwYXJhbSBzdHIgU3RyaW5nIAotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzU2V0Q29va2llMihTdHJpbmcgc3RyKQotICB7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgaW50IG5ld0luZGV4ID0gMDsKLSAgICAgIHdoaWxlICh0cnVlKQotICAgICAgewotICAgICAgICBuZXdJbmRleCA9IGdldExhc3RDb29raWUoc3RyLCBpbmRleCk7Ci0gICAgICAgIGlmIChpbmRleCA9PSBuZXdJbmRleCkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8vIHNraXAgc3BhY2VzCi0gICAgICAgIGluZGV4ID0gbmV3SW5kZXg7Ci0gICAgICAgIGluZGV4ID0gc2tpcFNwYWNlcyhzdHIsIGluZGV4KTsKLSAgICAgICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnLCcpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAvLyBza2lwIHNwYWNlcwotICAgICAgICAgIGluZGV4ID0gc2tpcFNwYWNlcyhzdHIsIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRMYXN0Q29va2llLgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEBwYXJhbSBzdGFydEluZGV4Ci0gICAqIEByZXR1cm4gaW50Ci0gICAqLwotICBwcml2YXRlIGludCBnZXRMYXN0Q29va2llKFN0cmluZyBzdHIsIGludCBzdGFydEluZGV4KQotICB7Ci0KLSAgICByZXNldEZsYWdzKCk7Ci0KLSAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwotICAgIC8vIGZpbmQgdG9rZW4KLSAgICBpbnQgbmV3SW5kZXggPSBCYXNpY1J1bGVzLmdldExhc3RUb2tlbihzdHIsIGluZGV4KTsKLSAgICBpZiAoaW5kZXggPT0gbmV3SW5kZXgpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIGluZGV4ID0gbmV3SW5kZXg7Ci0gICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgLy8gaWYgbm90ICc9JyAtIGVycm9yCi0gICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9ICc9JykKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgaW5kZXgrKzsKLSAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICAvLyBnZXQgdmFsdWUKLSAgICBuZXdJbmRleCA9IGdldExhc3RWYWx1ZShzdHIsIGluZGV4KTsKLSAgICBpZiAoaW5kZXggPT0gbmV3SW5kZXgpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIHdoaWxlICh0cnVlKQotICAgIHsKLSAgICAgIGluZGV4ID0gbmV3SW5kZXg7Ci0gICAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0KLSAgICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnOycpCi0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgIGluZGV4Kys7Ci0gICAgICAvLyBza2lwIHNwYWNlcwotICAgICAgaW5kZXggPSBza2lwU3BhY2VzKHN0ciwgaW5kZXgpOwotCi0gICAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICAgIG5ld0luZGV4ID0gZ2V0TGFzdFNldENvb2tpZUF2KHN0ciwgaW5kZXgpOwotICAgICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldExhc3RWYWx1ZS4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcGFyYW0gc3RhcnRJbmRleAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgZ2V0TGFzdFZhbHVlKFN0cmluZyBzdHIsIGludCBzdGFydEluZGV4KQotICB7Ci0KLSAgICBpbnQgaW5kZXggPSBCYXNpY1J1bGVzLmdldExhc3RUb2tlbihzdHIsIHN0YXJ0SW5kZXgpOwotICAgIGlmIChpbmRleCAhPSBzdGFydEluZGV4KQotICAgICAgcmV0dXJuIGluZGV4OwotICAgIGluZGV4ID0gQmFzaWNSdWxlcy5nZXRMYXN0UXVvdGVkU3RyaW5nKHN0ciwgc3RhcnRJbmRleCk7Ci0gICAgaWYgKGluZGV4ICE9IHN0YXJ0SW5kZXgpCi0gICAgICByZXR1cm4gaW5kZXg7Ci0KLSAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0TGFzdFNldENvb2tpZUF2LgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEBwYXJhbSBzdGFydEluZGV4Ci0gICAqIEByZXR1cm4gaW50Ci0gICAqLwotICBwcml2YXRlIGludCBnZXRMYXN0U2V0Q29va2llQXYoU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLQotICAgIGludCBpbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgaW50IG5ld0luZGV4ID0gMDsKLQotICAgIFN0cmluZyB0b2tlbiA9IHN0ci5zdWJzdHJpbmcoaW5kZXgsIEJhc2ljUnVsZXMuZ2V0TGFzdFRva2VuKHN0ciwgaW5kZXgpKTsKLQotICAgIGlmIChzdHIuc3RhcnRzV2l0aCgiQ29tbWVudD0iLCBpbmRleCkpCi0gICAgewotICAgICAgaW5kZXggKz0gIkNvbW1lbnQ9Ii5sZW5ndGgoKTsKLSAgICAgIG5ld0luZGV4ID0gZ2V0TGFzdFZhbHVlKHN0ciwgaW5kZXgpOwotICAgICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICAgIC8vIGRlYnVnIC0+Ci0gICAgICBTdHJpbmcgcXFxID0gZ2V0VmFsdWUoc3RyLCBpbmRleCwgbmV3SW5kZXgpOwotICAgICAgY29tbWVudFZlY3QuYWRkKHFxcSk7Ci0gICAgICAvLyBkZWJ1ZyA8LQotICAgICAgY29tbWVudCA9IHRydWU7Ci0gICAgICByZXR1cm4gbmV3SW5kZXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKCJDb21tZW50VVJMPSIsIGluZGV4KSkKLSAgICB7Ci0gICAgICBpbmRleCArPSAiQ29tbWVudFVSTD0iLmxlbmd0aCgpOwotCi0gICAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJ1wiJykKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICAgIG5ld0luZGV4ID0gc3RyLmluZGV4T2YoJ1wiJywgaW5kZXggKyAxKTsKLSAgICAgIGlmIChuZXdJbmRleCA9PSAtMSkKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoc3RyLnN1YnN0cmluZyhpbmRleCArIDEsIG5ld0luZGV4KSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgICB9Ci0gICAgICAvLyBkZWJ1ZyAtPgotICAgICAgU3RyaW5nIHFxcSA9IGdldFZhbHVlKHN0ciwgaW5kZXggKyAxLCBuZXdJbmRleCk7Ci0gICAgICBjb21tZW50VVJMVmVjdC5hZGQocXFxKTsKLSAgICAgIC8vIGRlYnVnIDwtCi0gICAgICBuZXdJbmRleCsrOwotICAgICAgY29tbWVudFVSTCA9IHRydWU7Ci0gICAgICByZXR1cm4gbmV3SW5kZXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKCJEaXNjYXJkIiwgaW5kZXgpKQotICAgIHsKLSAgICAgIHJldHVybiBzdGFydEluZGV4ICsgIkRpc2NhcmQiLmxlbmd0aCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aCgiRG9tYWluPSIsIGluZGV4KSkKLSAgICB7Ci0gICAgICBpbmRleCArPSAiRG9tYWluPSIubGVuZ3RoKCk7Ci0KLSAgICAgIG5ld0luZGV4ID0gZ2V0TGFzdFZhbHVlKHN0ciwgaW5kZXgpOwotICAgICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgICAgLy8gZGVidWcgLT4KLSAgICAgIFN0cmluZyBxcXEgPSBnZXRWYWx1ZShzdHIsIGluZGV4LCBuZXdJbmRleCk7Ci0gICAgICBkb21haW5WZWN0LmFkZChxcXEpOwotICAgICAgLy8gZGVidWcgPC0KLSAgICAgIGRvbWFpbiA9IHRydWU7Ci0gICAgICByZXR1cm4gbmV3SW5kZXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKCJNYXgtQWdlPSIsIGluZGV4KSkKLSAgICB7Ci0gICAgICBpbmRleCArPSAiTWF4LUFnZT0iLmxlbmd0aCgpOwotCi0gICAgICBuZXdJbmRleCA9IGdldExhc3RWYWx1ZShzdHIsIGluZGV4KTsKLSAgICAgIGlmIChpbmRleCA9PSBuZXdJbmRleCkKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICAgIFN0cmluZyBxcXEgPSBnZXRWYWx1ZShzdHIsIGluZGV4LCBuZXdJbmRleCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSW50ZWdlci5wYXJzZUludChxcXEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgICAgfQotICAgICAgLy8gZGVidWcgLT4KLSAgICAgIG1heF9BZ2VWZWN0LmFkZChxcXEpOwotICAgICAgLy8gZGVidWcgPC0KLSAgICAgIG1heF9hZ2UgPSB0cnVlOwotICAgICAgcmV0dXJuIG5ld0luZGV4OwotICAgIH0KLSAgICBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aCgiUGF0aD0iLCBpbmRleCkpCi0gICAgewotICAgICAgaW5kZXggKz0gIlBhdGg9Ii5sZW5ndGgoKTsKLQotICAgICAgbmV3SW5kZXggPSBnZXRMYXN0VmFsdWUoc3RyLCBpbmRleCk7Ci0gICAgICBpZiAoaW5kZXggPT0gbmV3SW5kZXgpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgICBTdHJpbmcgcXFxID0gZ2V0VmFsdWUoc3RyLCBpbmRleCwgbmV3SW5kZXgpOwotICAgICAgaWYgKHBhdGggPT0gZmFsc2UpCi0gICAgICAgIHBhdGhWZWN0LmFkZChxcXEpOwotICAgICAgcGF0aCA9IHRydWU7Ci0gICAgICByZXR1cm4gbmV3SW5kZXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKCJQb3J0IiwgaW5kZXgpKQotICAgIHsKLSAgICAgIGluZGV4ICs9ICJQb3J0Ii5sZW5ndGgoKTsKLSAgICAgIHBvcnQgPSB0cnVlOwotICAgICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9ICc9JykKLSAgICAgICAgcmV0dXJuIGluZGV4OwotCi0gICAgICBpbmRleCsrOwotICAgICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9ICdcIicpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgICBpbmRleCsrOwotICAgICAgbmV3SW5kZXggPSBnZXRMYXN0UG9ydExpc3Qoc3RyLCBpbmRleCk7Ci0gICAgICBpZiAoaW5kZXggPT0gbmV3SW5kZXgpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgICAvLyBkZWJ1ZyAtPgotICAgICAgU3RyaW5nIHFxcSA9IGdldFZhbHVlKHN0ciwgaW5kZXgsIG5ld0luZGV4KTsKLSAgICAgIHBvcnRWZWN0LmFkZChxcXEpOwotICAgICAgLy8gZGVidWcgPC0KLQotICAgICAgaW5kZXggPSBuZXdJbmRleDsKLSAgICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnXCInKQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICAgIGluZGV4Kys7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0KLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoIlNlY3VyZSIsIGluZGV4KSkKLSAgICB7Ci0gICAgICByZXR1cm4gc3RhcnRJbmRleCArICJTZWN1cmUiLmxlbmd0aCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aCgiVmVyc2lvbj0iLCBpbmRleCkpCi0gICAgewotICAgICAgaW5kZXggKz0gIlZlcnNpb249Ii5sZW5ndGgoKTsKLQotICAgICAgbmV3SW5kZXggPSBnZXRMYXN0RElHSVQoc3RyLCBpbmRleCk7Ci0gICAgICBpZiAoaW5kZXggPT0gbmV3SW5kZXgpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgICAvLyBkZWJ1ZyAtPgotICAgICAgU3RyaW5nIHFxcSA9IGdldFZhbHVlKHN0ciwgaW5kZXgsIG5ld0luZGV4KTsKLSAgICAgIHZlcnNpb25WZWN0LmFkZChxcXEpOwotICAgICAgLy8gZGVidWcgPC0KLSAgICAgIHZlcnNpb24gPSB0cnVlOwotICAgICAgcmV0dXJuIG5ld0luZGV4OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRMYXN0UG9ydExpc3QuCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHBhcmFtIHN0YXJ0SW5kZXgKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHByaXZhdGUgaW50IGdldExhc3RQb3J0TGlzdChTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgewotICAgIGludCBpbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgaW50IG5ld0luZGV4ID0gMDsKLQotICAgIHdoaWxlICh0cnVlKQotICAgIHsKLSAgICAgIG5ld0luZGV4ID0gZ2V0TGFzdERJR0lUKHN0ciwgaW5kZXgpOwotICAgICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgICAgaW5kZXggPSBuZXdJbmRleDsKLSAgICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnLCcpCi0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgIGluZGV4Kys7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRMYXN0RElHSVQuCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHBhcmFtIHN0YXJ0SW5kZXgKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHByaXZhdGUgaW50IGdldExhc3RESUdJVChTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgewotICAgIGludCBpbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgZm9yICg7IGluZGV4IDwgc3RyLmxlbmd0aCgpOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGlmICghQmFzaWNSdWxlcy5pc0RJR0lUKHN0ci5jaGFyQXQoaW5kZXgpKSkKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgICByZXR1cm4gaW5kZXg7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgaWYgdGhlIHN0cmluZyBzYXRpc2Z5IHRoZSAiQ29va2llIiBoZWFkZXIgdmFsdWUuCi0gICAqIEBwYXJhbSBzdHIgU3RyaW5nCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNDb29raWUoU3RyaW5nIHN0cikKLSAgewotICAgIGludCBpbmRleCA9IDA7Ci0gICAgaW50IG5ld0luZGV4ID0gMDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIG5ld0luZGV4ID0gZ2V0TGFzdFZlcnNpb24oc3RyLCBpbmRleCk7Ci0gICAgICBpZiAoaW5kZXggPT0gbmV3SW5kZXgpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgaW5kZXggPSBuZXdJbmRleDsKLSAgICAgIGluZGV4ID0gc2tpcFNwYWNlcyhzdHIsIGluZGV4KTsKLSAgICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnOycgJiYgc3RyLmNoYXJBdChpbmRleCkgIT0gJywnKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGluZGV4Kys7Ci0gICAgICBpbmRleCA9IHNraXBTcGFjZXMoc3RyLCBpbmRleCk7Ci0KLSAgICAgIHdoaWxlICh0cnVlKQotICAgICAgewotICAgICAgICBuZXdJbmRleCA9IGdldExhc3RDb29raWVzVmFsdWUoc3RyLCBpbmRleCk7Ci0gICAgICAgIGlmIChpbmRleCA9PSBuZXdJbmRleCkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaW5kZXggPSBuZXdJbmRleDsKLSAgICAgICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJzsnICYmIHN0ci5jaGFyQXQoaW5kZXgpICE9ICcsJykKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGluZGV4Kys7Ci0gICAgICAgIGluZGV4ID0gc2tpcFNwYWNlcyhzdHIsIGluZGV4KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRMYXN0VmVyc2lvbi4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcGFyYW0gc3RhcnRJbmRleAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgZ2V0TGFzdFZlcnNpb24oU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwotICAgIGludCBuZXdJbmRleCA9IDA7Ci0gICAgaWYgKCFzdHIuc3RhcnRzV2l0aCgiJFZlcnNpb249IikpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICBpbmRleCArPSAiJFZlcnNpb249Ii5sZW5ndGgoKTsKLSAgICBuZXdJbmRleCA9IGdldExhc3RWYWx1ZShzdHIsIGluZGV4KTsKLSAgICBpZiAoaW5kZXggPT0gbmV3SW5kZXgpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIHJldHVybiBuZXdJbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0TGFzdENvb2tpZXNWYWx1ZS4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcGFyYW0gc3RhcnRJbmRleAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgZ2V0TGFzdENvb2tpZXNWYWx1ZShTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgewotICAgIGludCBpbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgaW50IG5ld0luZGV4ID0gMDsKLSAgICBpbnQgb2xkSW5kZXggPSAwOwotCi0gICAgLy8gZmluZCB0b2tlbgotICAgIG5ld0luZGV4ID0gQmFzaWNSdWxlcy5nZXRMYXN0VG9rZW4oc3RyLCBpbmRleCk7Ci0gICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICBpbmRleCA9IG5ld0luZGV4OwotICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIC8vIGlmIG5vdCAnPScgLSBlcnJvcgotICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnPScpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIGluZGV4Kys7Ci0gICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgLy8gZ2V0IHZhbHVlCi0gICAgbmV3SW5kZXggPSBnZXRMYXN0VmFsdWUoc3RyLCBpbmRleCk7Ci0gICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICBpbmRleCA9IG5ld0luZGV4OwotICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICByZXR1cm4gaW5kZXg7Ci0KLSAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJzsnKQotICAgICAgcmV0dXJuIGluZGV4OwotCi0gICAgLy8gcHJvY2VzcyBbIjsiIHBhdGhdIFsiOyIgZG9tYWluXSBbIjsiIHBvcnRdIAotICAgIG9sZEluZGV4ID0gaW5kZXg7Ci0gICAgaW5kZXgrKzsKLSAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICBpbmRleCA9IHNraXBTcGFjZXMoc3RyLCBpbmRleCk7Ci0gICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgLy8gcHJvY2VzcyBwYXRoCi0gICAgbmV3SW5kZXggPSBnZXRMYXN0UGF0aChzdHIsIGluZGV4KTsKLSAgICBpZiAoaW5kZXggIT0gbmV3SW5kZXgpCi0gICAgewotICAgICAgaW5kZXggPSBuZXdJbmRleDsKLSAgICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBpbmRleDsKLQotICAgICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9ICc7JykKLSAgICAgICAgcmV0dXJuIGluZGV4OwotCi0gICAgICBvbGRJbmRleCA9IGluZGV4OwotICAgICAgaW5kZXgrKzsKLSAgICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgICBpbmRleCA9IHNraXBTcGFjZXMoc3RyLCBpbmRleCk7Ci0gICAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIH0KLQotICAgIC8vIHByb2Nlc3MgZG9tYWluCi0gICAgbmV3SW5kZXggPSBnZXRMYXN0RG9tYWluKHN0ciwgaW5kZXgpOwotICAgIGlmIChpbmRleCAhPSBuZXdJbmRleCkKLSAgICB7Ci0gICAgICBpbmRleCA9IG5ld0luZGV4OwotICAgICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIGluZGV4OwotCi0gICAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJzsnKQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0KLSAgICAgIG9sZEluZGV4ID0gaW5kZXg7Ci0gICAgICBpbmRleCsrOwotICAgICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICAgIGluZGV4ID0gc2tpcFNwYWNlcyhzdHIsIGluZGV4KTsKLSAgICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgfQotCi0gICAgLy8gcHJvY2VzcyBwb3J0Ci0gICAgbmV3SW5kZXggPSBnZXRMYXN0UG9ydChzdHIsIGluZGV4KTsKLSAgICBpZiAoaW5kZXggIT0gbmV3SW5kZXgpCi0gICAgICByZXR1cm4gbmV3SW5kZXg7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG9sZEluZGV4OwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRMYXN0UGF0aC4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcGFyYW0gc3RhcnRJbmRleAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgZ2V0TGFzdFBhdGgoU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwotICAgIGludCBuZXdJbmRleCA9IDA7Ci0KLSAgICBpZiAoIXN0ci5zdGFydHNXaXRoKCIkUGF0aD0iLCBpbmRleCkpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICBpbmRleCArPSAiJFBhdGg9Ii5sZW5ndGgoKTsKLSAgICBuZXdJbmRleCA9IGdldExhc3RWYWx1ZShzdHIsIGluZGV4KTsKLSAgICBpZiAoaW5kZXggPT0gbmV3SW5kZXgpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIHJldHVybiBuZXdJbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0TGFzdERvbWFpbi4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcGFyYW0gc3RhcnRJbmRleAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgZ2V0TGFzdERvbWFpbihTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgewotICAgIGludCBpbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgaW50IG5ld0luZGV4ID0gMDsKLQotICAgIGlmICghc3RyLnN0YXJ0c1dpdGgoIiREb21haW49IiwgaW5kZXgpKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgaW5kZXggKz0gIiREb21haW49Ii5sZW5ndGgoKTsKLSAgICBuZXdJbmRleCA9IGdldExhc3RWYWx1ZShzdHIsIGluZGV4KTsKLSAgICBpZiAoaW5kZXggPT0gbmV3SW5kZXgpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIHJldHVybiBuZXdJbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0TGFzdFBvcnQuCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHBhcmFtIHN0YXJ0SW5kZXgKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHByaXZhdGUgaW50IGdldExhc3RQb3J0KFN0cmluZyBzdHIsIGludCBzdGFydEluZGV4KQotICB7Ci0gICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKLSAgICBpbnQgbmV3SW5kZXggPSAwOwotCi0gICAgaWYgKCFzdHIuc3RhcnRzV2l0aCgiJFBvcnQiLCBpbmRleCkpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIGluZGV4ICs9ICIkUG9ydCIubGVuZ3RoKCk7Ci0gICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9ICc9JykKLSAgICAgIHJldHVybiBpbmRleDsKLQotICAgIGluZGV4Kys7Ci0gICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9ICdcIicpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIGluZGV4Kys7Ci0gICAgbmV3SW5kZXggPSBnZXRMYXN0UG9ydExpc3Qoc3RyLCBpbmRleCk7Ci0gICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICBpbmRleCA9IG5ld0luZGV4OwotICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnXCInKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgaW5kZXgrKzsKLSAgICByZXR1cm4gaW5kZXg7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHNraXBTcGFjZXMuCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHBhcmFtIGluZGV4Ci0gICAqIEByZXR1cm4gaW50Ci0gICAqLwotICBwcml2YXRlIGludCBza2lwU3BhY2VzKFN0cmluZyBzdHIsIGludCBpbmRleCkKLSAgewotICAgIGZvciAoOyBpbmRleCA8IHN0ci5sZW5ndGgoKTsgaW5kZXgrKykKLSAgICAgIGlmICghQmFzaWNSdWxlcy5pc1NQKHN0ci5jaGFyQXQoaW5kZXgpKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgcmV0dXJuIGluZGV4OwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRWYWx1ZS4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcGFyYW0gYmVnCi0gICAqIEBwYXJhbSBlbmQKLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldFZhbHVlKFN0cmluZyBzdHIsIGludCBiZWcsIGludCBlbmQpCi0gIHsKLSAgICBTdHJpbmcgcXFxID0gbnVsbDsKLSAgICBpZiAoc3RyLmNoYXJBdChiZWcpID09ICdcIicpCi0gICAgICBxcXEgPSBzdHIuc3Vic3RyaW5nKGJlZyArIDEsIGVuZCAtIDEpOwotICAgIGVsc2UKLSAgICAgIHFxcSA9IHN0ci5zdWJzdHJpbmcoYmVnLCBlbmQpOwotICAgIHJldHVybiBxcXE7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvU3RyaW5nVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9TdHJpbmdUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjNzBkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9TdHJpbmdUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLS8qKgotICogU3RyaW5nIHRva2VuaXplci4KLSAqIAotICogQGF1dGhvcjogS3VsaWsKLSAqLwotZmluYWwgcHVibGljIGNsYXNzIFN0cmluZ1Rva2VuaXplcgotewotICBwcml2YXRlIGNoYXJbXSBzcGFjZURlbDsKLSAgcHJpdmF0ZSBjaGFyW10gZGVsOwotICBwcml2YXRlIGNoYXJbXSBhbGxEZWw7Ci0KLSAgLyoqCi0gICAqIEVudW1lcmF0aW9uIG9mIHN0cmluZ3MuCi0gICogQGF1dGhvciBLdWxpawotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBTdHJpbmdUb2tlbml6ZXJFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIGphdmEudXRpbC5FbnVtZXJhdGlvbgotICB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gc3RyOwotICAgIHByaXZhdGUgZmluYWwgaW50IHNpemU7Ci0gICAgcHJpdmF0ZSBpbnQgaW5kZXg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmV4dDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSBzCi0gICAgICovCi0gICAgU3RyaW5nVG9rZW5pemVyRW51bWVyYXRpb24oY2hhcltdIHMpCi0gICAgewotICAgICAgc3RyID0gczsKLSAgICAgIHNpemUgPSBzdHIubGVuZ3RoOwotICAgICAgaW5kZXggPSAwOwotCi0gICAgICAvLyBza2lwIHNwYWNlIGRlbGltaXRlcnMKLSAgICAgIHdoaWxlIChpbmRleCA8IHNpemUgJiYgY29udGFpbihzdHJbaW5kZXhdLCBzcGFjZURlbCkpCi0gICAgICAgIGluZGV4Kys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLnV0aWwuRW51bWVyYXRpb24jaGFzTW9yZUVsZW1lbnRzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKQotICAgIHsKLSAgICAgIHJldHVybiAoaW5kZXggPCBzaXplKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEudXRpbC5FbnVtZXJhdGlvbiNuZXh0RWxlbWVudCgpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpCi0gICAgewotICAgICAgaWYgKGluZGV4ID49IHNpemUpCi0gICAgICAgIHRocm93IG5ldyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiU3RyaW5nVG9rZW5pemVyIGVudW1lcmF0aW9uIik7Ci0KLSAgICAgIC8vIHNraXAgZGVsaW1pdGVycwotICAgICAgaW50IGJlZ1N0ciA9IGluZGV4OwotICAgICAgaWYgKGluZGV4IDwgc2l6ZSAmJiBjb250YWluKHN0cltpbmRleF0sIGRlbCkpCi0gICAgICAgIGluZGV4Kys7Ci0KLSAgICAgIC8vIHNraXAgd29yZAotICAgICAgaWYgKGJlZ1N0ciA9PSBpbmRleCkKLSAgICAgICAgd2hpbGUgKGluZGV4IDwgc2l6ZSAmJiAhY29udGFpbihzdHJbaW5kZXhdLCBhbGxEZWwpKQotICAgICAgICAgIGluZGV4Kys7Ci0KLSAgICAgIGludCBlbmRTdHIgPSBpbmRleDsKLQotICAgICAgLy8gc2tpcCBzcGFjZSBkZWxpbWl0ZXJzCi0gICAgICB3aGlsZSAoaW5kZXggPCBzaXplICYmIGNvbnRhaW4oc3RyW2luZGV4XSwgc3BhY2VEZWwpKQotICAgICAgICBpbmRleCsrOwotCi0gICAgICByZXR1cm4gU3RyaW5nLmNvcHlWYWx1ZU9mKHN0ciwgYmVnU3RyLCBlbmRTdHIgLSBiZWdTdHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgaW50IGkgPSBpbmRleDsKLSAgICAgIFN0cmluZyBzID0gKFN0cmluZykgbmV4dEVsZW1lbnQoKTsKLSAgICAgIGluZGV4ID0gaTsKLSAgICAgIHJldHVybiBzOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdHJpbmdUb2tlbml6ZXIgY29uc3RydWN0b3IuCi0gICAgICogQHBhcmFtIHNwYWNlRGVsaW1pdGVycyB0aGUgc2V0IG9mIGRlbGltaXRlcnMgdG8gYmUgaWdub3JlZAotICAgICAqIEBwYXJhbSBkZWxpbWl0ZXJzIHRoZSBzZXQgb2YgZGVsaW1pdGVycyB0byBiZSByZW1haW5lZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdUb2tlbml6ZXIoY2hhcltdIHNwYWNlRGVsaW1pdGVycywgY2hhcltdIGRlbGltaXRlcnMpCi0gIHsKLSAgICBzdXBlcigpOwotCi0gICAgaWYgKHNwYWNlRGVsaW1pdGVycyAhPSBudWxsKQotICAgIHsKLSAgICAgIHNwYWNlRGVsID0gbmV3IGNoYXJbc3BhY2VEZWxpbWl0ZXJzLmxlbmd0aF07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHNwYWNlRGVsaW1pdGVycywgMCwgc3BhY2VEZWwsIDAsIHNwYWNlRGVsaW1pdGVycy5sZW5ndGgpOwotICAgICAgc29ydChzcGFjZURlbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHNwYWNlRGVsID0gbnVsbDsKLQotICAgIGlmIChkZWxpbWl0ZXJzICE9IG51bGwpCi0gICAgewotICAgICAgZGVsID0gbmV3IGNoYXJbZGVsaW1pdGVycy5sZW5ndGhdOwotICAgICAgU3lzdGVtLmFycmF5Y29weShkZWxpbWl0ZXJzLCAwLCBkZWwsIDAsIGRlbGltaXRlcnMubGVuZ3RoKTsKLSAgICAgIHNvcnQoZGVsKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZGVsID0gbnVsbDsKLQotICAgIGlmIChkZWwgIT0gbnVsbCAmJiBzcGFjZURlbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGFsbERlbCA9IG5ldyBjaGFyW2RlbC5sZW5ndGggKyBzcGFjZURlbC5sZW5ndGhdOwotICAgICAgU3lzdGVtLmFycmF5Y29weShkZWwsIDAsIGFsbERlbCwgMCwgZGVsLmxlbmd0aCk7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHNwYWNlRGVsLCAwLCBhbGxEZWwsIGRlbC5sZW5ndGgsIHNwYWNlRGVsLmxlbmd0aCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGRlbCAhPSBudWxsKQotICAgICAgYWxsRGVsID0gZGVsOwotICAgIGVsc2UKLSAgICAgIGFsbERlbCA9IHNwYWNlRGVsOwotCi0gICAgc29ydChhbGxEZWwpOwotICB9Ci0gIC8qKgotICAgKiBQYXJzZXMgc3RyaW5nLgotICAgKiBAcmV0dXJuIGphdmEudXRpbC5FbnVtZXJhdGlvbgotICAgKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCi0gICAqLwotICBwdWJsaWMgamF2YS51dGlsLkVudW1lcmF0aW9uIHBhcnNlKFN0cmluZyBzKQotICB7Ci0gICAgaWYgKHMgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZ1Rva2VuaXplciA6IFN0cmluZyBjYW5ub3QgYmUgTlVMTCIpOwotCi0gICAgcmV0dXJuIG5ldyBTdHJpbmdUb2tlbml6ZXJFbnVtZXJhdGlvbihzLnRvQ2hhckFycmF5KCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEJpbmFyeSBzZWFyY2guCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKiBAcGFyYW0gYyBjaGFyCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW4oY2hhciBjLCBjaGFyW10gYSkKLSAgewotICAgIGlmIChhID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpbnQgbCA9IDAsIHIgPSBhLmxlbmd0aCAtIDEsIGNlbnRlcjsKLSAgICB3aGlsZSAobCA8IHIpCi0gICAgewotICAgICAgY2VudGVyID0gKGwgKyByKSAvIDI7Ci0gICAgICBpZiAoYyA+IGFbY2VudGVyXSkKLSAgICAgICAgbCA9IGNlbnRlciArIDE7Ci0gICAgICBlbHNlCi0gICAgICAgIHIgPSBjZW50ZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFbbF0gPT0gYzsKLSAgfQotICAvKioKLSAgICogSGVhcCBzb3J0Ci0gICAqIEBwYXJhbSBjIGNoYXJbXQotICAgKi8KLSAgc3RhdGljIHByaXZhdGUgdm9pZCBzb3J0KGNoYXJbXSBjKQotICB7Ci0gICAgaWYgKGMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaiwgazsKLSAgICAgIGNoYXIgY2k7Ci0KLSAgICAgIC8vIHB1c2ggaGVhcAotICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBqID0gKChrID0gaSkgLSAxKSAvIDI7Ci0gICAgICAgIGNpID0gY1tpXTsKLSAgICAgICAgd2hpbGUgKGsgPiAwICYmIGNbal0gPCBjaSkKLSAgICAgICAgewotICAgICAgICAgIGNba10gPSBjW2pdOwotICAgICAgICAgIGogPSAoKGsgPSBqKSAtIDEpIC8gMjsKLSAgICAgICAgfQotICAgICAgICBjW2tdID0gY2k7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHBvcCBoZWFwCi0gICAgICBmb3IgKGludCBpID0gYy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKQotICAgICAgewotICAgICAgICBqID0gMjsKLSAgICAgICAgayA9IDA7Ci0gICAgICAgIGNpID0gY1swXTsKLSAgICAgICAgd2hpbGUgKGogPD0gaSkKLSAgICAgICAgewotICAgICAgICAgIGNba10gPSAoY1tqIC0gMV0gPiBjW2pdKSA/IGNbLS1qXSA6IGNbal07Ci0gICAgICAgICAgaiA9ICgoayA9IGopICsgMSkgKiAyOwotICAgICAgICB9Ci0gICAgICAgIGNba10gPSBjW2ldOwotICAgICAgICBjW2ldID0gY2k7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9UZXN0VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1Rlc3RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQxYTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1Rlc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLlRvb2xJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5BZGRTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIFRlc3QgVXRpbGl0eSBjbGFzcy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RVdGlscwotewotICAvKioKLSAgICogRm9ybWF0IGEgc3R5bGUgc2hlZXQgZGVjbGFyYXRpb24gZnJvbSB0aGUgYWRkU3R5bGVTaGVldCBlbGVtZW50LgotICAgKiBAcGFyYW0gZWxlbWVudCBhbiBFbGVtZW50IG9iamVjdC4KLSAgICogQHBhcmFtIGFkZFN0eWxlU2hlZXQgYW4gYWRkU3R5bGVTaGVldCBlbGVtZW50LgotICAgKiBAcGFyYW0gZGVmYXVsdEhyZWYgZGVmYXVsdCBocmVmLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHBhcnNlQWRkU3R5bGVTaGVldCgKLSAgICBFbGVtZW50IGVsZW1lbnQsCi0gICAgQWRkU3R5bGVTaGVldCBhZGRTdHlsZVNoZWV0LAotICAgIFN0cmluZyBkZWZhdWx0SHJlZikKLSAgewotICAgIGFkZFN0eWxlU2hlZXQuc2V0SHJlZigKLSAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIFdTSUNvbnN0YW50cy5BVFRSX0hSRUYsIGRlZmF1bHRIcmVmKSk7Ci0gICAgYWRkU3R5bGVTaGVldC5zZXRUeXBlKAotICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoCi0gICAgICAgIGVsZW1lbnQsCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1RZUEUsCi0gICAgICAgIFdTSUNvbnN0YW50cy5ERUZBVUxUX1hTTF9UWVBFKSk7Ci0gICAgYWRkU3R5bGVTaGVldC5zZXRUaXRsZSgKLSAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIFdTSUNvbnN0YW50cy5BVFRSX1RJVExFKSk7Ci0gICAgYWRkU3R5bGVTaGVldC5zZXRNZWRpYSgKLSAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIFdTSUNvbnN0YW50cy5BVFRSX01FRElBKSk7Ci0gICAgYWRkU3R5bGVTaGVldC5zZXRDaGFyc2V0KAotICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgV1NJQ29uc3RhbnRzLkFUVFJfQ0hBUlNFVCkpOwotICAgIGFkZFN0eWxlU2hlZXQuc2V0QWx0ZXJuYXRlKAotICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgV1NJQ29uc3RhbnRzLkFUVFJfQUxURVJOQVRFKSk7Ci0gIH0KLQotICAvKioKLSAgICogRGlzcGxheSB0b29sIG5hbWUgYW5kIGNvcHlyaWdodCBub3RpY2UuCi0gICAqIEBwYXJhbSB0b29sSW5mbyBhIFRvb2xJbmZvIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFRvb2xJbmZvKFRvb2xJbmZvIHRvb2xJbmZvKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgIkNvbmZvcm1hbmNlICIKLSAgICAgICAgKyB0b29sSW5mby5nZXROYW1lKCkKLSAgICAgICAgKyAiIFRvb2wiCi0gICAgICAgICsgIiwgVmVyc2lvbjogIgotICAgICAgICArIHRvb2xJbmZvLmdldFZlcnNpb24oKQotICAgICAgICArICIsIFJlbGVhc2UgRGF0ZTogIgotICAgICAgICArIHRvb2xJbmZvLmdldFJlbGVhc2VEYXRlKCkpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihXU0lDb25zdGFudHMuQ09QWVJJR0hUKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAiKTsKLSAgfQotCi0gIC8qKiAKLSAgICogR2V0IFhNTCBjb21tZW50IHVzZWQgaW4gbG9nIGFuZCByZXBvcnQgZmlsZS4KLSAgICogQHJldHVybiBYTUwgY29tbWVudCB1c2VkIGluIGxvZyBhbmQgcmVwb3J0IGZpbGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYTUxDb21tZW50KCkKLSAgewotICAgIFN0cmluZyBjb21tZW50ID0gbnVsbDsKLSAgICBTdHJpbmcgcmVhZExpbmUgPSBudWxsOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gQWRkIHJlcXVpcmVkIGNvbW1lbnRzIChjb3B5cmlnaHQsIGV0Yy4pCi0gICAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9Ci0gICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcigKLSAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICBVdGlscy5nZXRJbnB1dFN0cmVhbShXU0lDb25zdGFudHMuQ09NTUVOVFNfRklMRSkpKTsKLQotICAgICAgLy8gSW5pdGlhbGl6ZSBzdHJpbmcgdG8gZW1wdHkgc3RyaW5nCi0gICAgICBjb21tZW50ID0gIiI7Ci0KLSAgICAgIHdoaWxlIChidWZmZXJlZFJlYWRlci5yZWFkeSgpKQotICAgICAgewotICAgICAgICBpZiAoKHJlYWRMaW5lID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkKLSAgICAgICAgICBjb21tZW50ICs9IHJlYWRMaW5lICsgV1NJQ29uc3RhbnRzLkxJTkVfU0VQQVJBVE9SOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBJZ25vcmUgZXhjZXB0aW9uIGFuZCBqdXN0IHJldHVybiBudWxsCi0gICAgfQotCi0gICAgcmV0dXJuIGNvbW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHNjaGVtYSBsb2NhdGlvbiBmb3IgWE1MIHNjaGVtYS4KLSAgICogQHJldHVybiBzY2hlbWEgbG9jYXRpb24gZm9yIFhNTCBzY2hlbWEuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYTUxTY2hlbWFMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0U2NoZW1hTG9jYXRpb24oCi0gICAgICBXU0lQcm9wZXJ0aWVzLlBST1BfWE1MX1NDSEVNQSwKLSAgICAgIFdTSVByb3BlcnRpZXMuREVGX1hNTF9TQ0hFTUEpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBTT0FQIHNjaGVtYSBsb2NhdGlvbi4KLSAgICogQHJldHVybiBTT0FQIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNPQVBTY2hlbWFMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0U2NoZW1hTG9jYXRpb24oCi0gICAgICBXU0lQcm9wZXJ0aWVzLlBST1BfU09BUF9TQ0hFTUEsCi0gICAgICBXU0lQcm9wZXJ0aWVzLkRFRl9TT0FQX1NDSEVNQSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IFdTREwgc2NoZW1hIGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIFdTREwgc2NoZW1hIGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NETFNjaGVtYUxvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRTY2hlbWFMb2NhdGlvbigKLSAgICAgIFdTSVByb3BlcnRpZXMuUFJPUF9XU0RMX1NDSEVNQSwKLSAgICAgIFdTSVByb3BlcnRpZXMuREVGX1dTRExfU0NIRU1BKTsKLSAgfQotCi0gIC8qKgotICAqIEdldCBXU0RMIFNPQVAgc2NoZW1hIGxvY2F0aW9uLgotICAqIEByZXR1cm4gV1NETCBTT0FQIHNjaGVtYSBsb2NhdGlvbi4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NETFNPQVBTY2hlbWFMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0U2NoZW1hTG9jYXRpb24oCi0gICAgICBXU0lQcm9wZXJ0aWVzLlBST1BfV1NETF9TT0FQX1NDSEVNQSwKLSAgICAgIFdTSVByb3BlcnRpZXMuREVGX1dTRExfU09BUF9TQ0hFTUEpOwotICB9Ci0gIC8qKgotICAgKiBHZXQgV1NETCBzY2hlbWEgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gV1NETCBzY2hlbWEgbG9jYXRpb24uCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb24oCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICBTdHJpbmcgZGVmYXVsdFZhbHVlKQotICB7Ci0gICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gbnVsbDsKLQotICAgIC8vIEdldCB0aGUgd3NpLmhvbWUgc3lzdGVtIHByb3BlcnR5Ci0gICAgU3RyaW5nIHdzaUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoV1NJUHJvcGVydGllcy5QUk9QX1dTSV9IT01FKTsKLSAgICBTdHJpbmcgZmlsZUxvY2F0aW9uID0gV1NJUHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGRlZmF1bHRWYWx1ZSk7Ci0KLSAgICAvLyBJZiB0aGUgZmlsZSBsb2NhdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIHdzaS5wcm9wZXJ0aWVzIGZpbGUgdGhlbiBidWlsZCBsb2NhdGlvbgotICAgIGlmIChmaWxlTG9jYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBJZiB3c2kuaG9tZSBpcyBzZXQsIHRoZW4gdXNlIGl0Ci0gICAgICBpZiAod3NpSG9tZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBzY2hlbWFMb2NhdGlvbiA9IHdzaUhvbWU7Ci0gICAgICB9Ci0gICAgICBpZiAoc2NoZW1hTG9jYXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2NoZW1hTG9jYXRpb24gPSBmaWxlTG9jYXRpb247Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICghc2NoZW1hTG9jYXRpb24uZW5kc1dpdGgoIi8iKSkKLSAgICAgICAgewotICAgICAgICAgIHNjaGVtYUxvY2F0aW9uICs9ICIvIjsKLSAgICAgICAgfQotCi0gICAgICAgIHNjaGVtYUxvY2F0aW9uICs9IGZpbGVMb2NhdGlvbjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNjaGVtYUxvY2F0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9UeXBlc1JlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9UeXBlc1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYTM4OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvVHlwZXNSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LndzZGwuKjsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLio7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkJhc2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogVGhlIGNsYXNzIGV4dHJhY3RzIFhTRCBzY2hlbWEgaW5mb3JtYXRpb24gZnJvbSB0aGUgZ2l2ZW4gV1NETC4KLSAqIAotICogQGF1dGhvciBLdWxpawotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHlwZXNSZWdpc3RyeSBpbXBsZW1lbnRzIFdTSVRhZywgV1NETFZpc2l0b3IKLXsKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5QYXJ0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUGFydCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5TZXJ2aWNlLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU2VydmljZSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChUeXBlcywgT2JqZWN0LAotICAgKiBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFR5cGVzIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KE9wZXJhdGlvbiwgT2JqZWN0LAotICAgKiBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KE9wZXJhdGlvbiBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChJbnB1dCwgT2JqZWN0LAotICAgKiBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KElucHV0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KE91dHB1dCwgT2JqZWN0LAotICAgKiBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KE91dHB1dCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChGYXVsdCwgT2JqZWN0LAotICAgKiBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEZhdWx0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KEJpbmRpbmcsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChCaW5kaW5nIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KEJpbmRpbmdPcGVyYXRpb24sIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBCaW5kaW5nT3BlcmF0aW9uIG9iaiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChCaW5kaW5nSW5wdXQsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChCaW5kaW5nSW5wdXQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoQmluZGluZ091dHB1dCwgT2JqZWN0LAotICAgKiBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEJpbmRpbmdPdXRwdXQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoQmluZGluZ0ZhdWx0LCBPYmplY3QsCi0gICAqIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoQmluZGluZ0ZhdWx0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KEVsZW1lbnQsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChFbGVtZW50IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KE1lc3NhZ2UsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChNZXNzYWdlIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFBvcnQsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChQb3J0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFBvcnRUeXBlLCBPYmplY3QsCi0gICAqIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUG9ydFR5cGUgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoRGVmaW5pdGlvbiwgT2JqZWN0LAotICAgKiBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KERlZmluaXRpb24gb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQsCi0gICAqIE9iamVjdCwgV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoU09BUEJpbmRpbmcsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQQmluZGluZyBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChTT0FQQm9keSwgT2JqZWN0LAotICAgKiBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBCb2R5IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFNPQVBIZWFkZXIsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQSGVhZGVyIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFNPQVBIZWFkZXJGYXVsdCwgT2JqZWN0LAotICAgKiBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBIZWFkZXJGYXVsdCBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoU09BUEZhdWx0LCBPYmplY3QsCi0gICAqIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEZhdWx0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFNPQVBPcGVyYXRpb24sIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQT3BlcmF0aW9uIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLQotICBwcml2YXRlIE1hcCBlbGVtZW50MlR5cGUgPSBuZXcgSGFzaE1hcCgpOwotICBwcml2YXRlIFNldCBleHRlbmRzQXJyYXkgPSBuZXcgSGFzaFNldCgpOwotICBwcml2YXRlIFNldCB1c2VzV3NkbEFycmF5VHlwZSA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgcHJvdGVjdGVkIEJhc2VWYWxpZGF0b3IgYmFzZVZhbGlkYXRvciA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGNyZWF0ZXMgdGhlIHR5cGVzIHJlZ2lzdHJ5LiBieSB0aGUgZ2l2ZW4gV1NETCBkZWZpbml0aW9uCi0gICAqIG9iamVjdC4KLSAgICogCi0gICAqIEBwYXJhbSBkZWYgYSBXU0RMIGRlZmluaXRpb24uCi0gICAqIEBwYXJhbSBiYXNlVmFsaWRhdG9yIGEgYmFzZSB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgVHlwZXNSZWdpc3RyeShEZWZpbml0aW9uIGRlZiwgQmFzZVZhbGlkYXRvciBiYXNlVmFsaWRhdG9yKQotICB7Ci0gICAgdGhpcy5iYXNlVmFsaWRhdG9yID0gYmFzZVZhbGlkYXRvcjsKLSAgICBpZiAoZGVmID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEZWZpbml0aW9uIGNhbiBub3QgYmUgbnVsbCIpOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0SW1wb3J0KHRydWUpOwotCi0gICAgcHJvY2Vzc1R5cGVzKGRlZi5nZXRUeXBlcygpLCBkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZShkZWYpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGNyZWF0ZXMgdGhlIHR5cGVzIHJlZ2lzdHJ5IGJ5IGdpdmVuIFdTREwgdHlwZXMgb2JqZWN0IGFuZAotICAgKiBsb2NhdGlvbiBjb250ZXh0IFVSSS4KLSAgICogQHBhcmFtIHR5cGVzIFdTREwgdHlwZXMgb2JqZWN0LgotICAgKiBAcGFyYW0gY29udGV4dCBsb2NhdGlvbiBjb250ZXh0IFVSSS4KLSAgICogQHBhcmFtIGJhc2VWYWxpZGF0b3IgYSBiYXNlIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBUeXBlc1JlZ2lzdHJ5KAotICAgIFR5cGVzIHR5cGVzLAotICAgIFN0cmluZyBjb250ZXh0LAotICAgIEJhc2VWYWxpZGF0b3IgYmFzZVZhbGlkYXRvcikKLSAgewotICAgIHRoaXMuYmFzZVZhbGlkYXRvciA9IGJhc2VWYWxpZGF0b3I7Ci0gICAgcHJvY2Vzc1R5cGVzKHR5cGVzLCBjb250ZXh0KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHJldHVybnMgdHlwZSdzIHFuYW1lIGJ5IGdpdmVuIGVsZW1lbnQncyBxbmFtZS4KLSAgICogQHBhcmFtIGVsZW1lbnROYW1lIGEgcXVhbGlmaWVkIGVsZW1lbnQgbmFtZS4KLSAgICogQHJldHVybiB0eXBlJ3MgcW5hbWUgYnkgZ2l2ZW4gZWxlbWVudCdzIHFuYW1lLgotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldFR5cGUoUU5hbWUgZWxlbWVudE5hbWUpCi0gIHsKLSAgICByZXR1cm4gKFFOYW1lKSBlbGVtZW50MlR5cGUuZ2V0KGVsZW1lbnROYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHJldHVybnMgc2V0IG9mIHR5cGVzIHdoaWNoIGlzIGFycmF5IGF0dHJpYnV0ZS4KLSAgICogQHJldHVybiBzZXQgb2YgdHlwZXMgd2hpY2ggaXMgYXJyYXkgYXR0cmlidXRlLgotICAgKi8KLSAgcHVibGljIFNldCBnZXRBcnJheVR5cGVzKCkKLSAgewotICAgIFNldCBzID0gbmV3IEhhc2hTZXQoKTsKLSAgICBzLmFkZEFsbCgoQ29sbGVjdGlvbikgdXNlc1dzZGxBcnJheVR5cGUpOwotICAgIHMuYWRkQWxsKChDb2xsZWN0aW9uKSBleHRlbmRzQXJyYXkpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgcmV0dXJucyBzZXQgb2YgZWxlbWVudHMgZGVmaW5lZCBpbiB0eXBlcyBlbGVtZW50LgotICAgKiBAcmV0dXJuIHNldCBvZiBlbGVtZW50cyBkZWZpbmVkIGluIHR5cGVzIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU2V0IGdldEVsZW1lbnRMaXN0KCkKLSAgewotICAgIHJldHVybiB0aGlzLmVsZW1lbnQyVHlwZS5rZXlTZXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBkZWNsYXJlcyB3c2RsOmFycmF5VHlwZQotICAgKiBhdHRyaWJ1dGUgd2l0aGluIGRlY2xhcmF0aW9uLgotICAgKiBAcGFyYW0gdHlwZSBhIHR5cGUuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdHlwZSBkZWNsYXJlcyB3c2RsOmFycmF5VHlwZQotICAgKiBhdHRyaWJ1dGUgd2l0aGluIGRlY2xhcmF0aW9uLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVc2VzV1NETEFycmF5VHlwZShRTmFtZSB0eXBlKQotICB7Ci0gICAgcmV0dXJuIHVzZXNXc2RsQXJyYXlUeXBlLmNvbnRhaW5zKHR5cGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgcmV0dXJucyB0cnVlIGlmIGdpdmVuIHR5cGUgZXh0ZW5kcyBzb2FwZW5jOkFycmF5IHR5cGUuCi0gICAqIEBwYXJhbSB0eXBlIGEgdHlwZS4KLSAgICogQHJldHVybiB0cnVlIGlmIGdpdmVuIHR5cGUgZXh0ZW5kcyBzb2FwZW5jOkFycmF5IHR5cGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0V4dGVuZHNBcnJheShRTmFtZSB0eXBlKQotICB7Ci0gICAgcmV0dXJuIGV4dGVuZHNBcnJheS5jb250YWlucyh0eXBlKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuSW1wb3J0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoSW1wb3J0IGltLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAoaW0uZ2V0RGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICBwcm9jZXNzV1NETChpbS5nZXREZWZpbml0aW9uKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEludGVybmFsIG1ldGhvZCBwcm9jZXNzZXMgV1NETCBkZWZpbml0aW9uLgotICAgKiBAcGFyYW0gZGVmIGEgV1NETCBkZWZpbml0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NXU0RMKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgaWYgKGRlZi5nZXRUeXBlcygpICE9IG51bGwpCi0gICAgICBwcm9jZXNzVHlwZXMoZGVmLmdldFR5cGVzKCksIGRlZi5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0gIH0KLQotICAvKioKLSAgICogSW50ZXJuYWwgbWV0aG9kIHByb2Nlc3NlcyBXU0RMIHR5cGVzLgotICAgKiBAcGFyYW0gdHlwZXMgV1NETCB0eXBlcy4KLSAgICogQHBhcmFtIGNvbnRleHQgYSBjb250ZXh0LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUeXBlcyhUeXBlcyB0eXBlcywgU3RyaW5nIGNvbnRleHQpCi0gIHsKLSAgICBpZiAodHlwZXMgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBMaXN0IGV4dHMgPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBpZiAoZXh0cyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gZXh0cy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICAgIHNlYXJjaEZvclNjaGVtYSgKLSAgICAgICAgICAgICgoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBlbCkuZ2V0RWxlbWVudCgpLAotICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEludGVybmFsIG1ldGhvZCBzZWFyY2hlcyBYU0Qgc2NoZW1hIGRlY2xhcmF0aW9uIGFuZCBYU0QgaW1wb3J0Ci0gICAqIHN0YXRlbWVudHMuCi0gICAqIEBwYXJhbSBuCi0gICAqIEBwYXJhbSBjb250ZXh0Ci0gICAqLwotICBwcml2YXRlIHZvaWQgc2VhcmNoRm9yU2NoZW1hKE5vZGUgbiwgU3RyaW5nIGNvbnRleHQpCi0gIHsKLSAgICB3aGlsZSAobiAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIHNlYXJjaGVzIGZvciB4c2Q6aW1wb3J0IGVsZW1lbnQKLSAgICAgIGlmIChOb2RlLkVMRU1FTlRfTk9ERSA9PSBuLmdldE5vZGVUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIHhzZDpzY2hlbWEgZWxlbWVudCBpcyBmb3VuZCAtPiBwcm9jZXNzIHNjaGVtYQotICAgICAgICBpZiAoWE1MVXRpbHMuZXF1YWxzKG4sIEVMRU1fWFNEX1NDSEVNQSkpCi0gICAgICAgICAgcHJvY2Vzc1NjaGVtYShuLCBjb250ZXh0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIC8vIGlmIHhzZDppbXBvcnQgZWxlbWVudCBpcyBmb3VuZCAtPiBsb2FkIHNjaGVtYSBhbmQgcHJvY2VzcyBzY2hlbWEKLSAgICAgICAgICBpZiAoWE1MVXRpbHMuZXF1YWxzKG4sIEVMRU1fWFNEX0lNUE9SVCkpCi0gICAgICAgICAgICBsb2FkU2NoZW1hKG4sIGNvbnRleHQpOwotICAgICAgICAgIC8vIGlmIHhzZDppbmNsdWRlIGVsZW1lbnQgaXMgZm91bmQgLT4gbG9hZCBzY2hlbWEgYW5kIHByb2Nlc3Mgc2NoZW1hCi0gICAgICAgICAgZWxzZSBpZiAoWE1MVXRpbHMuZXF1YWxzKG4sIEVMRU1fWFNEX0lOQ0xVREUpKQotICAgICAgICAgICAgbG9hZFNjaGVtYShuLCBjb250ZXh0KTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAvLyBlbHNlIGl0ZXJhdGUgZWxlbWVudCByZWN1cnNpdmVseQotICAgICAgICAgICAgc2VhcmNoRm9yU2NoZW1hKG4uZ2V0Rmlyc3RDaGlsZCgpLCBjb250ZXh0KTsKLSAgICAgIH0KLSAgICAgIG4gPSBuLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEludGVybmFsIG1ldGhvZCBsb2FkcyBYU0Qgc2NoZW1hIGJ5IHVzaW5nIHNjaGVtYSBsb2NhdGlvbiBhbmQKLSAgICogbG9jYXRpb24gY29udGV4dC4KLSAgICogQHBhcmFtIGltcG9ydE5vZGUKLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICovCi0gIHByaXZhdGUgdm9pZCBsb2FkU2NoZW1hKE5vZGUgaW1wb3J0Tm9kZSwgU3RyaW5nIGNvbnRleHQpCi0gIHsKLSAgICBFbGVtZW50IGltID0gKEVsZW1lbnQpIGltcG9ydE5vZGU7Ci0gICAgQXR0ciBzY2hlbWFMb2NhdGlvbiA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZShpbSwgQVRUUl9YU0RfU0NIRU1BTE9DQVRJT04pOwotICAgIC8vIHRyeSB0byBwYXJzZSBpbXBvcnRlZCBYU0QKLSAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiBzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpICE9IG51bGwpCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgYW55IGVycm9yIG9yIHJvb3QgZWxlbWVudCBpcyBub3QgWFNEIHNjaGVtYSAtPiBlcnJvcgotICAgICAgICBEb2N1bWVudCBzY2hlbWEgPQotICAgICAgICAgIGJhc2VWYWxpZGF0b3IucGFyc2VYTUxEb2N1bWVudFVSTCgKLSAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksCi0gICAgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIGlmIChYTUxVdGlscy5lcXVhbHMoc2NoZW1hLmdldERvY3VtZW50RWxlbWVudCgpLCBFTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICAgIHByb2Nlc3NTY2hlbWEoCi0gICAgICAgICAgICBzY2hlbWEuZ2V0RG9jdW1lbnRFbGVtZW50KCksCi0gICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVVUkxTdHJpbmcoc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSwgY29udGV4dCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgICAvL3QucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIC8vIG5vdGhpbmcuIGl0J3Mgbm90IGEgc2NoZW1hCi0gICAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW50ZXJuYWwgbWV0aG9kIHByb2Nlc3NlcyBYU0Qgc2NoZW1hIGFuZCByZXRyaWV2ZXMgdHlwZXMgZGVjbGFyYXRpb24gZnJvbQotICAgKiBpdC4KLSAgICogQHBhcmFtIHNjaGVtYQotICAgKiBAcGFyYW0gY29udGV4dAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NTY2hlbWEoTm9kZSBzY2hlbWEsIFN0cmluZyBjb250ZXh0KQotICB7Ci0gICAgQXR0ciBhID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKChFbGVtZW50KSBzY2hlbWEsIEFUVFJfWFNEX1RBUkdFVE5BTUVTUEFDRSk7Ci0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IChhICE9IG51bGwpID8gYS5nZXRWYWx1ZSgpIDogIiI7Ci0gICAgLy8gaXRlcmF0ZSBzY2hlbWEKLSAgICBOb2RlIG4gPSBzY2hlbWEuZ2V0Rmlyc3RDaGlsZCgpOwotICAgIC8vICEhIHdlIHN1cHBvc2UgdGhhdCB4c2Q6aW1wb3J0IGVsZW1lbnQgaXMgb2NjdXJlZCBvbmx5IHdpdGhpbiB4c2Q6c2NoZW1hIGVsZW1lbnQgICAgICAgIAotICAgIHdoaWxlIChuICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IG4uZ2V0Tm9kZVR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9FTEVNRU5UKSkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgZWwgPSAoRWxlbWVudCkgbjsKLSAgICAgICAgICBhID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGVsLCBBVFRSX1hTRF9OQU1FKTsKLSAgICAgICAgICBRTmFtZSBlbGVtZW50ID0KLSAgICAgICAgICAgIG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsIChhICE9IG51bGwpID8gYS5nZXRWYWx1ZSgpIDogIiIpOwotCi0gICAgICAgICAgYSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZShlbCwgQVRUUl9YU0RfVFlQRSk7Ci0gICAgICAgICAgUU5hbWUgdHlwZSA9IG51bGw7Ci0gICAgICAgICAgaWYgKGEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdCA9IGEuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIC8vIGlmIHR5cGUgY29udGFpbnMgJzonLCBpdCBtZWFucyB0aGF0IGl0IGNvbnRhaW5zIHFuYW1lCi0gICAgICAgICAgICBpbnQgaSA9IHQuaW5kZXhPZignOicpOwotICAgICAgICAgICAgaWYgKGkgIT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB0LnN1YnN0cmluZygwLCBpKTsKLSAgICAgICAgICAgICAgU3RyaW5nIG5zVVJJID0gWE1MVXRpbHMuZmluZE5hbWVzcGFjZVVSSShuLCBwcmVmaXgpOwotICAgICAgICAgICAgICB0eXBlID0gbmV3IFFOYW1lKG5zVVJJLCB0LnN1YnN0cmluZyhpICsgMSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB0eXBlID0gbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgdCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzdXBwb3NlIHRoYXQgZWxlbWVudCBkaXJlY3RseSBjb250YWlucyB0eXBlIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICB0eXBlID0gZWxlbWVudDsKLSAgICAgICAgICAgIGNoZWNrVHlwZShuLCB0eXBlKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBlbGVtZW50MlR5cGUucHV0KGVsZW1lbnQsIHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpKQotICAgICAgICAgIGxvYWRTY2hlbWEobiwgY29udGV4dCk7Ci0gICAgICAgIGVsc2UgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTkNMVURFKSkKLSAgICAgICAgICAgIGxvYWRTY2hlbWEobiwgY29udGV4dCk7Ci0gICAgICAgIGVsc2UgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9DT01QTEVYVFlQRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGVsID0gKEVsZW1lbnQpIG47Ci0gICAgICAgICAgYSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZShlbCwgQVRUUl9YU0RfTkFNRSk7Ci0gICAgICAgICAgUU5hbWUgdHlwZSA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCAoYSAhPSBudWxsKSA/IGEuZ2V0VmFsdWUoKSA6ICIiKTsKLSAgICAgICAgICBjaGVja1R5cGUobiwgdHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgfQotCi0gICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbnRlcm5hbCBtZXRob2QgY2hlY2tzIHdoZXRoZXIgc3BlY2lmaWVkIHR5cGUgaGFzIFdTREwgYXJyYXkgdHlwZQotICAgKiBhdHRyaWJ1dGUgaW4gdGhlIFhTRCBkZWNsYXJhdGlvbi4KLSAgICogQHBhcmFtIG4KLSAgICogQHBhcmFtIG5hbWUKLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja1R5cGUoTm9kZSBuLCBRTmFtZSBuYW1lKQotICB7Ci0gICAgd2hpbGUgKG4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpKQotICAgICAgewotICAgICAgICAvLyBjaGVjayBzdWNoIHNlbnRlbmNlCi0gICAgICAgIC8vICAgICAgICAgICAgICB4c2Q6YXR0cmlidXRlIHJlZj0ic29hcGVuYzphcnJheVR5cGUiIHdzZGw6YXJyYXlUeXBlPSJ0bnM6TXlBcnJheTJUeXBlW10iLz4KLSAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgQXR0ciBhID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKChFbGVtZW50KSBuLCBBVFRSX1dTRExfQVJSQVlUWVBFKTsKLSAgICAgICAgICBpZiAoYSAhPSBudWxsKQotICAgICAgICAgICAgdXNlc1dzZGxBcnJheVR5cGUuYWRkKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmV0cmlldmUgYmFzZSBhdHRyaWJ1dGUgbWF5IGJlIGZyb20gcmVzdHJpY3Rpb24gb3IgZXh0ZW5zaW9uCi0gICAgICAgIEF0dHIgYSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZSgoRWxlbWVudCkgbiwgQVRUUl9YU0RfQkFTRSk7Ci0gICAgICAgIGlmIChhICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYmFzZSA9IGEuZ2V0VmFsdWUoKTsKLSAgICAgICAgICBpbnQgaSA9IGJhc2UuaW5kZXhPZigiOiIpOwotICAgICAgICAgIGlmIChpICE9IC0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBiYXNlLnN1YnN0cmluZygwLCBpKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IGJhc2Uuc3Vic3RyaW5nKGkgKyAxKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBYTUxVdGlscy5maW5kTmFtZXNwYWNlVVJJKG4sIHByZWZpeCk7Ci0gICAgICAgICAgICBpZiAoU09BUEVOQ19BUlJBWS5lcXVhbHMobmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWwpKSkKLSAgICAgICAgICAgICAgZXh0ZW5kc0FycmF5LmFkZChuYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tUeXBlKG4uZ2V0Rmlyc3RDaGlsZCgpLCBuYW1lKTsKLSAgICAgIH0KLSAgICAgIG4gPSBuLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9VRERJVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1VERElVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTcyMzYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1VERElVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLkJpbmRpbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJpbmRpbmcuVE1vZGVsSW5zdGFuY2VJbmZvOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5CdXNpbmVzc0RldGFpbDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlNlcnZpY2VEZXRhaWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5UTW9kZWxEZXRhaWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5UTW9kZWxJbmZvOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsTGlzdDsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkNhdGVnb3J5QmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5GaW5kUXVhbGlmaWVyOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5GaW5kUXVhbGlmaWVyczsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuS2V5ZWRSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlIHNvbWUgc2VydmljZSBmdW5jdGlvbnMgdXNlZCBieSBVRERJVmFsaWRhdG9yLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVERElVdGlscwotewotICBzdGF0aWMgcHVibGljIGZpbmFsIEZpbmRRdWFsaWZpZXJzIEVYQUNUX05BTUVfTUFUQ0hfUVVBTElGSUVSOwotICBzdGF0aWMgewotICAgIFZlY3RvciB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgRVhBQ1RfTkFNRV9NQVRDSF9RVUFMSUZJRVIgPSBuZXcgRmluZFF1YWxpZmllcnMoKTsKLSAgICB2ZWN0b3IuYWRkKG5ldyBGaW5kUXVhbGlmaWVyKEZpbmRRdWFsaWZpZXIuZXhhY3ROYW1lTWF0Y2gpKTsKLSAgICB2ZWN0b3IuYWRkKG5ldyBGaW5kUXVhbGlmaWVyKEZpbmRRdWFsaWZpZXIuc29ydEJ5TmFtZUFzYykpOwotICAgIEVYQUNUX05BTUVfTUFUQ0hfUVVBTElGSUVSLnNldEZpbmRRdWFsaWZpZXJWZWN0b3IodmVjdG9yKTsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NfSV9DT05GT1JNQU5DRV9UTU9ERUxfTkFNRSA9Ci0gICAgIndzLWktb3JnOmNvbmZvcm1zVG86MjAwMl8xMiI7Ci0KLSAgc3RhdGljIHByaXZhdGUgSGFzaHRhYmxlIHdzaUNvbmZvcm1hbmNlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgYSBidXNpbmVzcyBzZXJ2aWNlIGJ5IGtleS4KLSAgICogQHBhcmFtIHByb3h5ICBhIFVEREkgcHJveHkuCi0gICAqIEBwYXJhbSBrZXkgICAgYSBrZXkgdG8gYSBidXNpbmVzcyBzZXJ2aWNlLgotICAgKiBAcmV0dXJuIGEgYnVzaW5lc3Mgc2VydmljZSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIGtleS4KLSAgICogQHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gaWYgZXJyb3Igb3JpZ2luYXRpbmcgd2l0aGluIHRoZSBTT0FQIHRyYW5zcG9ydC4KLSAgICogQHRocm93cyBVRERJRXhjZXB0aW9uIGlmIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBVRERJIEFQSSBjYW5ub3QgaW5kaWNhdGUgYW4gZXJyb3IgY29uZGl0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCdXNpbmVzc1NlcnZpY2UgZ2V0QnVzaW5lc3NTZXJ2aWNlQnlLZXkoCi0gICAgVURESVByb3h5IHByb3h5LAotICAgIFN0cmluZyBrZXkpCi0gICAgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiwgVURESUV4Y2VwdGlvbgotICB7Ci0gICAgQnVzaW5lc3NTZXJ2aWNlIHJlc3VsdCA9IG51bGw7Ci0KLSAgICBTZXJ2aWNlRGV0YWlsIHNkID0gcHJveHkuZ2V0X3NlcnZpY2VEZXRhaWwoa2V5KTsKLQotICAgIGlmIChzZCAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciB2ID0gc2QuZ2V0QnVzaW5lc3NTZXJ2aWNlVmVjdG9yKCk7Ci0KLSAgICAgIGlmICh2ICE9IG51bGwgJiYgdi5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAoQnVzaW5lc3NTZXJ2aWNlKSB2LmZpcnN0RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBidXNpbmVzcyBlbnRpdHkgYnkga2V5LgotICAgKiBAcGFyYW0gcHJveHkgIGEgVURESSBwcm94eS4KLSAgICogQHBhcmFtIGtleSAgICBhIGtleSB0byBhIGJ1c2luZXNzIGVudGl5LgotICAgKiBAcmV0dXJuIGEgYnVzaW5lc3MgZW50aXR5IHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4ga2V5LgotICAgKiBAdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBlcnJvciBvcmlnaW5hdGluZyB3aXRoaW4gdGhlIFNPQVAgdHJhbnNwb3J0LgotICAgKiBAdGhyb3dzIFVERElFeGNlcHRpb24gaWYgdGhlIHJldHVybiB2YWx1ZSBvZiBhIFVEREkgQVBJIGNhbm5vdCBpbmRpY2F0ZSAKLSAgICogICAgICAgICBhbiBlcnJvciBjb25kaXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ1c2luZXNzRW50aXR5IGdldEJ1c2luZXNzQnlLZXkoVURESVByb3h5IHByb3h5LCBTdHJpbmcga2V5KQotICAgIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24sIFVERElFeGNlcHRpb24KLSAgewotICAgIEJ1c2luZXNzRW50aXR5IHJlc3VsdCA9IG51bGw7Ci0KLSAgICBCdXNpbmVzc0RldGFpbCBiZCA9IHByb3h5LmdldF9idXNpbmVzc0RldGFpbChrZXkpOwotCi0gICAgaWYgKGJkICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIHYgPSBiZC5nZXRCdXNpbmVzc0VudGl0eVZlY3RvcigpOwotCi0gICAgICBpZiAodiAhPSBudWxsICYmIHYuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEJ1c2luZXNzRW50aXR5KSB2LmZpcnN0RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBhIHRNb2RlbCBieSBrZXkuCi0gICAqIEBwYXJhbSBwcm94eSAgYSBVRERJIHByb3h5LgotICAgKiBAcGFyYW0ga2V5ICAgIGEga2V5IHRvIGEgdE1vZGVsLgotICAgKiBAcmV0dXJuIGEgdE1vZGVsIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4ga2V5LgotICAgKiBAdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBlcnJvciBvcmlnaW5hdGluZyB3aXRoaW4gdGhlIFNPQVAgdHJhbnNwb3J0LgotICAgKiBAdGhyb3dzIFVERElFeGNlcHRpb24gaWYgdGhlIHJldHVybiB2YWx1ZSBvZiBhIFVEREkgQVBJIGNhbm5vdCBpbmRpY2F0ZSAKLSAgICogICAgICAgICBhbiBlcnJvciBjb25kaXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRNb2RlbCBnZXRUTW9kZWxCeUtleShVRERJUHJveHkgcHJveHksIFN0cmluZyBrZXkpCi0gIHsKLSAgICBUTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIFRNb2RlbERldGFpbCBiZCA9IHByb3h5LmdldF90TW9kZWxEZXRhaWwoa2V5KTsKLQotICAgICAgaWYgKGJkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFZlY3RvciB2ID0gYmQuZ2V0VE1vZGVsVmVjdG9yKCk7Ci0KLSAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2LnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAoVE1vZGVsKSB2LmZpcnN0RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGtleSBvZiB0aGUgV1NJIENvbmZvcm1hbmNlIHRNb2RlbC4KLSAgICogQHBhcmFtIHByb3h5ICBhIFVEREkgcHJveHkuCi0gICAqIEByZXR1cm4gdGhlIGtleSBvZiB0aGUgV1NJIENvbmZvcm1hbmNlIHRNb2RlbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTSUNvbmZvcm1hbmNlVE1vZGVsS2V5KFVERElQcm94eSBwcm94eSkKLSAgewotICAgIGlmIChwcm94eSA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVURESSBwcm94eSBjYW5ub3QgYmUgbnVsbC4iKTsKLQotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCi0gICAgaWYgKHdzaUNvbmZvcm1hbmNlVGFibGUuY29udGFpbnNLZXkocHJveHkpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHdzaUNvbmZvcm1hbmNlVGFibGUuZ2V0KHByb3h5KS50b1N0cmluZygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0VE1vZGVsS2V5QnlOYW1lKHByb3h5LCBXU19JX0NPTkZPUk1BTkNFX1RNT0RFTF9OQU1FKTsKLQotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJXUy1JIGNvbmZvcm1hbmNlIHRheG9ub215IHRNb2RlbCB3YXMgbm90IGZvdW5kIik7Ci0gICAgICB9Ci0KLSAgICAgIHdzaUNvbmZvcm1hbmNlVGFibGUucHV0KHByb3h5LCByZXN1bHQpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBhIHRNb2RlbCBrZXkgYnkgdE1vZGVsIG5hbWUuCi0gICAqIEBwYXJhbSBwcm94eSAgYSBVRERJIHByb3h5LgotICAgKiBAcGFyYW0gbmFtZSAgIGEgdE1vZGVsIG5hbWUuCi0gICAqIEByZXR1cm4gYSB0TW9kZWwga2V5IHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gdE1vZGVsIG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUTW9kZWxLZXlCeU5hbWUoVURESVByb3h5IHByb3h5LCBTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFRNb2RlbExpc3QgbGlzdCA9Ci0gICAgICAgIHByb3h5LmZpbmRfdE1vZGVsKG5hbWUsIG51bGwsIG51bGwsIEVYQUNUX05BTUVfTUFUQ0hfUVVBTElGSUVSLCAxKTsKLSAgICAgIFRNb2RlbEluZm8gaW5mbyA9Ci0gICAgICAgIChUTW9kZWxJbmZvKSBsaXN0LmdldFRNb2RlbEluZm9zKCkuZ2V0VE1vZGVsSW5mb1ZlY3RvcigpLmZpcnN0RWxlbWVudCgpOwotICAgICAgcmVzdWx0ID0gaW5mby5nZXRUTW9kZWxLZXkoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgIHsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYmluZGluZ1RlbXBsYXRlLgotICAgKiBAcGFyYW0gYmluZGluZ1RlbXBsYXRlICBhIEJpbmRpbmdUZW1wbGF0ZSBvYmplY3QuCi0gICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYmluZGluZ1RlbXBsYXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZGluZ1RlbXBsYXRlVG9TdHJpbmcoQmluZGluZ1RlbXBsYXRlIGJpbmRpbmdUZW1wbGF0ZSkKLSAgewotICAgIFN0cmluZyByZXR1cm5TdHJpbmcgPSAiIjsKLQotICAgIGlmIChiaW5kaW5nVGVtcGxhdGUgPT0gbnVsbCkKLSAgICAgIHJldHVyblN0cmluZyA9ICJudWxsIjsKLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm5TdHJpbmcgPQotICAgICAgICAiYWNjZXNzUG9pbnQ6ICIKLSAgICAgICAgICArIChiaW5kaW5nVGVtcGxhdGUuZ2V0QWNjZXNzUG9pbnQoKSA9PSBudWxsCi0gICAgICAgICAgICA/ICJudWxsIgotICAgICAgICAgICAgOiBiaW5kaW5nVGVtcGxhdGUuZ2V0QWNjZXNzUG9pbnQoKS5nZXRUZXh0KCkpOwotCi0gICAgICBpZiAoYmluZGluZ1RlbXBsYXRlLmdldFRNb2RlbEluc3RhbmNlRGV0YWlscygpID09IG51bGwKLSAgICAgICAgfHwgYmluZGluZ1RlbXBsYXRlCi0gICAgICAgICAgLmdldFRNb2RlbEluc3RhbmNlRGV0YWlscygpCi0gICAgICAgICAgLmdldFRNb2RlbEluc3RhbmNlSW5mb1ZlY3RvcigpCi0gICAgICAgICAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuU3RyaW5nICs9ICIsIFtubyB0TW9kZWwgcmVmZXJlbmNlXSI7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPQotICAgICAgICAgIGJpbmRpbmdUZW1wbGF0ZQotICAgICAgICAgICAgLmdldFRNb2RlbEluc3RhbmNlRGV0YWlscygpCi0gICAgICAgICAgICAuZ2V0VE1vZGVsSW5zdGFuY2VJbmZvVmVjdG9yKCkKLSAgICAgICAgICAgIC5pdGVyYXRvcigpOwotCi0gICAgICAgIGludCBpbmZvQ291bnQgPSAxOwotICAgICAgICBUTW9kZWxJbnN0YW5jZUluZm8gaW5mbzsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGluZm8gPSAoVE1vZGVsSW5zdGFuY2VJbmZvKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgcmV0dXJuU3RyaW5nICs9ICIsIFsiCi0gICAgICAgICAgICArIGluZm9Db3VudCsrCi0gICAgICAgICAgICArICJdIHRNb2RlbEtleTogIgotICAgICAgICAgICAgKyBpbmZvLmdldFRNb2RlbEtleSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHVyblN0cmluZzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRNb2RlbC4KLSAgICogQHBhcmFtIHRNb2RlbCAgYSBUTW9kZWwgb2JqZWN0LgotICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRNb2RlbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRNb2RlbFRvU3RyaW5nKFRNb2RlbCB0TW9kZWwpCi0gIHsKLSAgICBTdHJpbmcgcmV0dXJuU3RyaW5nID0gIiI7Ci0KLSAgICBpZiAodE1vZGVsID09IG51bGwpCi0gICAgICByZXR1cm5TdHJpbmcgPSAibnVsbCI7Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuU3RyaW5nID0KLSAgICAgICAgIm5hbWU6ICIKLSAgICAgICAgICArIHRNb2RlbC5nZXROYW1lU3RyaW5nKCkKLSAgICAgICAgICArICIsIGNhdGVnb3J5QmFnOiAiCi0gICAgICAgICAgKyAodE1vZGVsLmdldENhdGVnb3J5QmFnKCkgPT0gbnVsbAotICAgICAgICAgICAgPyAibnVsbCIKLSAgICAgICAgICAgIDogY2F0ZWdvcnlCYWdUb1N0cmluZyh0TW9kZWwuZ2V0Q2F0ZWdvcnlCYWcoKSkpCi0gICAgICAgICAgKyAiLCBvdmVydmlld1VSTDogIgotICAgICAgICAgICsgKHRNb2RlbC5nZXRPdmVydmlld0RvYygpID09IG51bGwKLSAgICAgICAgICAgID8gIm51bGwiCi0gICAgICAgICAgICA6IHRNb2RlbC5nZXRPdmVydmlld0RvYygpLmdldE92ZXJ2aWV3VVJMU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHJldHVybiByZXR1cm5TdHJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBjYXRlZ29yeUJhZy4KLSAgICogQHBhcmFtIGNhdGVnb3J5QmFnICBhIENhdGVnb3J5QmFnIG9iamVjdC4KLSAgICogQHJldHVybiBhIHRyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGNhdGVnb3J5QmFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlCYWdUb1N0cmluZyhDYXRlZ29yeUJhZyBjYXRlZ29yeUJhZykKLSAgewotICAgIFN0cmluZyByZXR1cm5TdHJpbmcgPSAiIjsKLQotICAgIGlmIChjYXRlZ29yeUJhZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVyblN0cmluZyArPSAibnVsbCI7Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVyblN0cmluZyArPSAiS2V5ZWRSZWZlcmVuY2VMaXN0OiAiOwotCi0gICAgICBWZWN0b3Iga3JMaXN0ID0gbnVsbDsKLSAgICAgIGlmICgoa3JMaXN0ID0gY2F0ZWdvcnlCYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKSkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuU3RyaW5nICs9ICJudWxsIjsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoa3JMaXN0LnNpemUoKSA9PSAwKQotICAgICAgewotICAgICAgICByZXR1cm5TdHJpbmcgKz0gImVtcHR5IjsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IG51bGw7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0ga3JMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBrciA9IChLZXllZFJlZmVyZW5jZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgIHJldHVyblN0cmluZyArPSAidE1vZGVsS2V5OiAiCi0gICAgICAgICAgICArIGtyLmdldFRNb2RlbEtleSgpCi0gICAgICAgICAgICArICIsIGtleU5hbWU6ICIKLSAgICAgICAgICAgICsga3IuZ2V0S2V5TmFtZSgpCi0gICAgICAgICAgICArICIsIGtleVZhbHVlOiAiCi0gICAgICAgICAgICArIGtyLmdldEtleVZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dXJuU3RyaW5nOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyMjU1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiwgQmVhY29uIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNICAgICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgQmVhY29uSVQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuaW1wbC5NaW1lUGFydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsLk1pbWVQYXJ0c0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLQotLyoqCi0gKiBHZW5lcmFsIHNldCBvZiB1dGlsaXRpZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVdGlscwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ1IgPSAoYnl0ZSkgJ1xyJzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIExGID0gKGJ5dGUpICdcbic7Ci0KLSAgLyoqCi0gICAqIENvbW1vbiB0aW1lc3RhbXAgZm9ybWF0LgotICAgKi8KLSAgLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IHRpbWVzdGFtcEZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0ICgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTUydaJyIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgdGltZXN0YW1wRm9ybWF0ID0KLSAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTUyIpOwotCi0gIC8qKgotICAgKiBCYXNpYyBkYXRlIGZvcm1hdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0KLSAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIpOwotCi0gIC8qKgotICAgKiBXcmFwcGVyIG1ldGhvZCBmb3IgZXJyb3IgbG9nZ2luZzsKLSAgICogZm9yIG5vdyBpdCBqdXN0IGdvZXMgdG8gc3RkZXJyLgotICAgKiBAcGFyYW0gaW5FcnJvciAgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgaW5FcnJvcikKLSAgewotICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3I6ICIgKyBpbkVycm9yKTsKLSAgfQotCi0gIC8qKiAKLSAgICogR2V0IGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBhcyBhIHN0cmluZy4KLSAgICogQHBhcmFtIHRocm93YWJsZSAgYSBUaHJvd2FibGUgb2JqZWN0LgotICAgKiBAcmV0dXJuIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBhcyBhIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGdldEV4Y2VwdGlvbkRldGFpbHMoVGhyb3dhYmxlIHRocm93YWJsZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBwdy5wcmludGxuKCJFeGNlcHRpb246ICIpOwotICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UocHcpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBhcyBhIHRpbWVzdGFtcC4KLSAgICogQHJldHVybiB1cnJlbnQgZGF0ZSBhbmQgdGltZSBhcyBhIHRpbWVzdGFtcC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRpbWVzdGFtcCgpCi0gIHsKLSAgICAvLyBVc2UgR01UIHRpbWV6b25lCi0gICAgLy90aW1lc3RhbXBGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKLSAgICB0aW1lc3RhbXBGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0RGVmYXVsdCgpKTsKLQotICAgIC8vIFJldHVybiB0aW1lc3RhbXAKLSAgICByZXR1cm4gdGltZXN0YW1wRm9ybWF0LmZvcm1hdChuZXcgRGF0ZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgY3VycmVudCBkYXRlIGZvciBkZWZhdWx0IHRpbWUgem9uZS4KLSAgICogQHJldHVybiBjdXJyZW50IGRhdGUgZm9yIGRlZmF1bHQgdGltZSB6b25lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGF0ZSgpCi0gIHsKLSAgICAvLyBVc2UgR01UIHRpbWV6b25lCi0gICAgZGF0ZUZvcm1hdC5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXREZWZhdWx0KCkpOwotCi0gICAgLy8gUmV0dXJuIGRhdGUKLSAgICByZXR1cm4gZGF0ZUZvcm1hdC5mb3JtYXQobmV3IERhdGUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IEhUVFAgc3RhdHVzIGNvZGUuCi0gICAqIEBwYXJhbSBodHRwSGVhZGVycyAgSFRUUCBoZWFkZXJzLgotICAgKiBAcmV0dXJuIEhUVFAgc3RhdHVzIGNvZGUuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZSBzdGF0dXMgY29kZSBpbiBodHRwIGhlYWRlcnMgd2FzIG5vdCBmb3VuZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEhUVFBTdGF0dXNDb2RlKFN0cmluZyBodHRwSGVhZGVycykKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgc3RhdHVzQ29kZSA9IG51bGw7Ci0KLSAgICBpZiAoaHR0cEhlYWRlcnMuc3RhcnRzV2l0aCgiSFRUUCIpKQotICAgIHsKLSAgICAgIC8vIEdldCBsb2NhdGlvbiBvZiBzdGF0dXMgY29kZQotICAgICAgaW50IGluZGV4ID0gaHR0cEhlYWRlcnMuaW5kZXhPZigiICIpOwotICAgICAgaW50IGluZGV4MiA9IGh0dHBIZWFkZXJzLmluZGV4T2YoIiAiLCBpbmRleCArIDEpOwotCi0gICAgICBpZiAoKGluZGV4ID09IC0xKSB8fCAoaW5kZXgyID09IC0xKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgICAiQ291bGQgbm90IGZpbmQgc3RhdHVzIGNvZGUgaW4gaHR0cCBoZWFkZXJzOiBbIiArIGh0dHBIZWFkZXJzICsgIl0uIik7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3RhdHVzQ29kZSA9IGh0dHBIZWFkZXJzLnN1YnN0cmluZyhpbmRleCArIDEsIGluZGV4Mik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgICJDb3VsZCBub3QgZmluZCBzdGF0dXMgY29kZSBpbiBodHRwIGhlYWRlcnM6IFsiICsgaHR0cEhlYWRlcnMgKyAiXS4iKTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gc3RhdHVzIGNvZGUKLSAgICByZXR1cm4gc3RhdHVzQ29kZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgSFRUUCBoZWFkZXJzIGZyb20gYSBmdWxsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBmdWxsTWVzc2FnZSAgYSBtZXNzYWdlLgotICAgKiBAcmV0dXJuIEhUVFAgaGVhZGVycyBmcm9tIGEgZnVsbCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SFRUUEhlYWRlcnMoU3RyaW5nIGZ1bGxNZXNzYWdlKQotICB7Ci0gICAgLy9TdHJpbmcgaHR0cEhlYWRlcnMgPSBudWxsOwotCi0gICAgLy8gVHJ5IGxvb2tpbmcgZm9yIHRoZSBkb3VibGUgbmV3bGluZQotICAgIGludCBpbmRleCA9IGZ1bGxNZXNzYWdlLmluZGV4T2YoIlxyXG5cclxuIik7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGluZGV4ICs9IDQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBjaGVjayBmb3IgY2FzZSAiXHJcci4uLlxyXG5cclxyLi4uXG4iCi0gICAgICAvLyBOb3RlIHRoZSBpbmRleCB0aGF0IGlzIHJldHVybmVkIHBvaW50cyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIAotICAgICAgLy8gaW1tZWRpYXRlZGx5IGZvbGxvd2luZyB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHRoZSBDUkxGQ1JMRi4gCi0gICAgICBpbmRleCA9IGdldEZpcnN0Q1JMRkNSTEYoZnVsbE1lc3NhZ2UpOwotICAgICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgewotICAgICAgICBsb2dFcnJvcigKLSAgICAgICAgICAiVW5hYmxlIHRvIHBhcnNlIEhUVFAgbWVzc2FnZSB0byBmaW5kIGhlYWRlcnMuICBGdWxsIG1lc3NhZ2U6ICIKLSAgICAgICAgICArIGZ1bGxNZXNzYWdlKTsKLSAgICAgICAgcmV0dXJuICJ4LVdTSS1UZXN0LVRvb2wtRXJyb3I6IENvdWxkbid0IGZpbmQgaGVhZGVycy4gIEZ1bGwgbWVzc2FnZTogWyIKLSAgICAgICAgICArIGZ1bGxNZXNzYWdlCi0gICAgICAgICAgKyAiXS4iOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBIVFRQIGhlYWRlcnMKLSAgICByZXR1cm4gZnVsbE1lc3NhZ2Uuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgU09BUCBtZXNzYWdlIGZyb20gYSBmdWxsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBmdWxsTWVzc2FnZSAgYSBtZXNzYWdlLgotICAgKiBAcmV0dXJuIFNPQVAgbWVzc2FnZSBmcm9tIGEgZnVsbCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGVudChTdHJpbmcgZnVsbE1lc3NhZ2UpCi0gIHsKLSAgICBTdHJpbmcgbWVzc2FnZSA9ICIiOwotCi0gICAgLy8gRmluZCBzdGFydCBvZiBtZXNzYWdlCi0gICAgaW50IGluZGV4ID0gZnVsbE1lc3NhZ2UuaW5kZXhPZigiXHJcblxyXG4iKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgaW5kZXggKz0gNDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIGNoZWNrIGZvciBjYXNlICJcclxyLi4uXHJcblxyXHIuLi5cbiIKLSAgICAgIC8vIE5vdGUgdGhlIGluZGV4IHRoYXQgaXMgcmV0dXJuZWQgcG9pbnRzIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgCi0gICAgICAvLyBpbW1lZGlhdGVkbHkgZm9sbG93aW5nIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2YgdGhlIENSTEZDUkxGLiAKLSAgICAgIGluZGV4ID0gZ2V0Rmlyc3RDUkxGQ1JMRihmdWxsTWVzc2FnZSk7Ci0gICAgfSAgICAJCi0KLSAgICBpZiAoaW5kZXggPCAwKQotICAgIHsKLSAgICAJLy8gSWYgd2UgY291bGRuJ3QgZmluZCB0aGUgZW5kIG9mIHRoZSBIVFRQIGhlYWRlcnMgb3IgdGhlIHN0YXJ0IG9mIHRoZSBtZXNzYWdlLCB0aGVuIHNob3cgZXJyb3IKLSAgICAgIGxvZ0Vycm9yKAotICAgICAgICAiVW5hYmxlIHRvIHBhcnNlIG1lc3NhZ2UgdG8gZ2V0IGNvbnRlbnQuICBGdWxsIG1lc3NhZ2U6ICIKLSAgICAgICAgICArIGZ1bGxNZXNzYWdlKTsKLSAgICAgIG1lc3NhZ2UgPQotICAgICAgICAieC1XU0ktVGVzdC1Ub29sLUVycm9yOiBDb3VsZG4ndCBmaW5kIG1lc3NhZ2UgY29udGVudC4gIEZ1bGwgbWVzc2FnZTogWyIKLSAgICAgICAgICArIGZ1bGxNZXNzYWdlCi0gICAgICAgICAgKyAiXS4iOwotICAgIH0KLSAgICAvLyBJZiB0aGUgaW5kZXggaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGgsIHRoZW4gdGhlcmUgaXMgbm8gbWVzc2FnZSBjb250ZW50Ci0gICAgZWxzZSBpZiAoaW5kZXggPj0gZnVsbE1lc3NhZ2UubGVuZ3RoKCkpCi0gICAgewotICAgICAgbWVzc2FnZSA9ICIiOwotICAgIH0KLQotICAgIC8vIEVsc2UgZ2V0IHRoZSBtZXNzYWdlIGNvbnRlbnQKLSAgICBlbHNlCi0gICAgewotICAgICAgbWVzc2FnZSA9IGZ1bGxNZXNzYWdlLnN1YnN0cmluZyhpbmRleCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIFNPQVAgbWVzc2FnZQotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0gCi0gIC8qKgotICAgKiBHZXQgSFRUUCBoZWFkZXJzIGZyb20gYSBmdWxsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBmdWxsTWVzc2FnZSAgYSBtZXNzYWdlLgotICAgKiBAcmV0dXJuIEhUVFAgaGVhZGVycyBmcm9tIGEgZnVsbCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0SFRUUEhlYWRlcnMoYnl0ZVtdIGZ1bGxNZXNzYWdlKQotICB7Ci0gICAgLy9TdHJpbmcgaHR0cEhlYWRlcnMgPSBudWxsOwotICAgIGludCBpbmRleCA9IGdldEZpcnN0Q1JMRkNSTEYoZnVsbE1lc3NhZ2UsIDApOwotICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICB7Ci0gICAgICBsb2dFcnJvcigKLSAgICAgICAgIlVuYWJsZSB0byBwYXJzZSBIVFRQIG1lc3NhZ2UgdG8gZmluZCBoZWFkZXJzLiAgRnVsbCBtZXNzYWdlOiAiCi0gICAgICAgICAgKyBmdWxsTWVzc2FnZSk7Ci0gICAgICByZXR1cm4gKCJ4LVdTSS1UZXN0LVRvb2wtRXJyb3I6IENvdWxkbid0IGZpbmQgaGVhZGVycy4gIEZ1bGwgbWVzc2FnZTogWyIKLSAgICAgICAgKyBmdWxsTWVzc2FnZSArICJdLiIpLmdldEJ5dGVzKCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIEhUVFAgaGVhZGVycwotCWJ5dGVbXSBiID0gbmV3IGJ5dGVbaW5kZXhdOwotCVN5c3RlbS5hcnJheWNvcHkoZnVsbE1lc3NhZ2UsIDAsIGIsIDAsIGluZGV4KTsKLQotICAgIHJldHVybiBiOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBIVFRQIGhlYWRlcnMgZnJvbSBhIGZ1bGwgbWVzc2FnZS4KLSAgICogQHBhcmFtIGZ1bGxNZXNzYWdlICBhIG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gSFRUUCBoZWFkZXJzIGZyb20gYSBmdWxsIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIVFRQSGVhZGVyc0FzU3RyaW5nKGJ5dGVbXSBmdWxsTWVzc2FnZSwgU3RyaW5nIGVuY29kaW5nKQotICB7Ci0gICAgLy9TdHJpbmcgaHR0cEhlYWRlcnMgPSBudWxsOwotICAgIGludCBpbmRleCA9IGdldEZpcnN0Q1JMRkNSTEYoZnVsbE1lc3NhZ2UsIDApOwotICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICB7Ci0gICAgICBsb2dFcnJvcigKLSAgICAgICAgIlVuYWJsZSB0byBwYXJzZSBIVFRQIG1lc3NhZ2UgdG8gZmluZCBoZWFkZXJzLiAgRnVsbCBtZXNzYWdlOiAiCi0gICAgICAgICAgKyBmdWxsTWVzc2FnZSk7Ci0gICAgICByZXR1cm4gIngtV1NJLVRlc3QtVG9vbC1FcnJvcjogQ291bGRuJ3QgZmluZCBoZWFkZXJzLiAgRnVsbCBtZXNzYWdlOiBbIgotICAgICAgICArIGZ1bGxNZXNzYWdlICsgIl0uIjsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gSFRUUCBoZWFkZXJzCi0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZnVsbE1lc3NhZ2UsIDAsIGluZGV4LCBlbmNvZGluZyk7Ci0gICAgfQotICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgICBsb2dFcnJvcigKLSAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgRW5jb2Rpbmc6ICIgKyBlbmNvZGluZyArICIuICBGdWxsIG1lc3NhZ2U6ICIKLSAgICAgICAgICAgICAgICAgICsgZnVsbE1lc3NhZ2UpOwotICAgICAgICAgICAgICByZXR1cm4gIngtV1NJLVRlc3QtVG9vbC1FcnJvcjogVW5zdXBwb3J0ZWQgRW5jb2RpbmcgXCIiICsgZW5jb2RpbmcgKyAiXCIuICBGdWxsIG1lc3NhZ2U6IFsiCi0gICAgICAgICAgICAgICAgKyBmdWxsTWVzc2FnZSArICJdLiI7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBTT0FQIG1lc3NhZ2UgZnJvbSBhIGZ1bGwgbWVzc2FnZS4KLSAgICogQHBhcmFtIGZ1bGxNZXNzYWdlICBhIG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gU09BUCBtZXNzYWdlIGZyb20gYSBmdWxsIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb250ZW50QXNTdHJpbmcoYnl0ZVtdIG1lc3NhZ2UpCi0gIHsKLSAgCVN0cmluZyBjb250ZW50ID0gIiI7Ci0gICAgLy9TdHJpbmcgaHR0cEhlYWRlcnMgPSBudWxsOwotICAgIGludCBpbmRleCA9IGdldEZpcnN0Q1JMRkNSTEYobWVzc2FnZSwgMCk7Ci0KLSAgICAvLyBJZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBlbmQgb2YgdGhlIEhUVFAgaGVhZGVycyBvciB0aGUgc3RhcnQgb2YgdGhlIG1lc3NhZ2UsIHRoZW4gc2hvdyBlcnJvcgotICAgIGlmIChpbmRleCA8IDApCi0gICAgewotICAgICAgbG9nRXJyb3IoCi0gICAgICAgICJVbmFibGUgdG8gcGFyc2UgbWVzc2FnZSB0byBnZXQgY29udGVudC4gIEZ1bGwgbWVzc2FnZTogIgotICAgICAgICAgICsgbWVzc2FnZSk7Ci0gICAgICBjb250ZW50ID0KLSAgICAgICAgIngtV1NJLVRlc3QtVG9vbC1FcnJvcjogQ291bGRuJ3QgZmluZCBtZXNzYWdlIGNvbnRlbnQuICBGdWxsIG1lc3NhZ2U6IFsiCi0gICAgICAgICAgKyBtZXNzYWdlLnRvU3RyaW5nKCkKLSAgICAgICAgICArICJdLiI7Ci0gICAgfQotCi0gICAgLy8gRWxzZSBnZXQgdGhlIG1lc3NhZ2UgY29udGVudAotICAgIGVsc2UgaWYgKGluZGV4IDwgbWVzc2FnZS5sZW5ndGgpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGNvbnRlbnQgPSBuZXcgU3RyaW5nKG1lc3NhZ2UsIGluZGV4LCBtZXNzYWdlLmxlbmd0aCAtIGluZGV4KTsKLSAgICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAJbG9nRXJyb3IoCi0gICAgICAJICAgICAgICAiVW5hYmxlIHRvIHBhcnNlIG1lc3NhZ2UgdG8gZ2V0IGNvbnRlbnQuICBGdWxsIG1lc3NhZ2U6ICIKLSAgICAgIAkgICAgICAgICAgKyBtZXNzYWdlKTsKLSAgICAgIAljb250ZW50ID0KLSAgICAgIAkgICAgICAgICJ4LVdTSS1UZXN0LVRvb2wtRXJyb3I6IENvdWxkbid0IGZpbmQgbWVzc2FnZSBjb250ZW50LiAgRnVsbCBtZXNzYWdlOiBbIgotICAgICAgCSAgICAgICAgICArIG1lc3NhZ2UudG9TdHJpbmcoKQotICAgICAgCSAgICAgICAgICArICJdLiI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIFNPQVAgbWVzc2FnZQotICAgIHJldHVybiBjb250ZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBTT0FQIG1lc3NhZ2UgZnJvbSBhIGZ1bGwgbWVzc2FnZS4KLSAgICogQHBhcmFtIGZ1bGxNZXNzYWdlICBhIG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gU09BUCBtZXNzYWdlIGZyb20gYSBmdWxsIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRDb250ZW50KGJ5dGVbXSBtZXNzYWdlKQotICB7Ci0gICAgYnl0ZVtdIGNvbnRlbnQgPSBuZXcgYnl0ZSBbMF07Ci0KLSAgICAvL1N0cmluZyBodHRwSGVhZGVycyA9IG51bGw7Ci0gICAgaW50IGluZGV4ID0gZ2V0Rmlyc3RDUkxGQ1JMRihtZXNzYWdlLCAwKTsKLSAKLSAgICAvLyBJZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBlbmQgb2YgdGhlIEhUVFAgaGVhZGVycyBvciB0aGUgc3RhcnQgb2YgdGhlIG1lc3NhZ2UsIHRoZW4gc2hvdyBlcnJvcgotICAgIGlmIChpbmRleCA8IDApCi0gICAgewotICAgICAgbG9nRXJyb3IoCi0gICAgICAgICJVbmFibGUgdG8gcGFyc2UgbWVzc2FnZSB0byBnZXQgY29udGVudC4gIEZ1bGwgbWVzc2FnZTogIgotICAgICAgICAgICsgbWVzc2FnZSk7Ci0gICAgICBtZXNzYWdlID0KLSAgICAgICAgKCJ4LVdTSS1UZXN0LVRvb2wtRXJyb3I6IENvdWxkbid0IGZpbmQgbWVzc2FnZSBjb250ZW50LiAgRnVsbCBtZXNzYWdlOiBbIgotICAgICAgICAgICsgbWVzc2FnZS50b1N0cmluZygpCi0gICAgICAgICAgKyAiXS4iKS5nZXRCeXRlcygpOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBpbmRleCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCwgdGhlbiB0aGVyZSBpcyBubyBtZXNzYWdlIGNvbnRlbnQKLSAgICAvL2Vsc2UgaWYgKGluZGV4ID49IGZ1bGxNZXNzYWdlLmxlbmd0aCgpKQotICAgIC8vewotICAgIC8vICBtZXNzYWdlID0gIiI7Ci0gICAgLy99Ci0KLSAgICAvLyBFbHNlIGdldCB0aGUgbWVzc2FnZSBjb250ZW50Ci0gICAgZWxzZSBpZiAoaW5kZXggPCBtZXNzYWdlLmxlbmd0aCkKLSAgICB7Ci0gICAgCWJ5dGVbXSBiID0gbmV3IGJ5dGVbbWVzc2FnZS5sZW5ndGggLSBpbmRleF07Ci0gICAgCVN5c3RlbS5hcnJheWNvcHkobWVzc2FnZSwgaW5kZXgsIGIsIDAsIG1lc3NhZ2UubGVuZ3RoIC0gaW5kZXgpOwotCi0gICAgICAgIGNvbnRlbnQgPSBiOwotICAgIH0KLQotICAgIC8vIFJldHVybiBTT0FQIG1lc3NhZ2UKLSAgICByZXR1cm4gY29udGVudDsKLSAgfQotCi0gIAotICAvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBsb2NhdGlvbiBvZiBhIENSTEYuCi0JICoKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEZpcnN0Q1JMRihieXRlW10gYnVmZmVyLCBpbnQgaW5kZXgpIAotCXsKLQkJaW50IHNpemUgPSBidWZmZXIubGVuZ3RoOwotCQlpbnQgaSA9IGluZGV4OwotCQl3aGlsZSAoaSA8IHNpemUgLSAxKSB7Ci0JCQlpZiAoYnVmZmVyW2ldID09IENSICYmIGJ1ZmZlcltpKzFdID09IExGKQotCQkJCXJldHVybiBpOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBsb2NhdGlvbiBvZiBhIENSTEYgZm9sbG93ZWQgaW1lZGlhdGVseSBieSBhbm90aGVyIENSTEYuCi0JICoKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEZpcnN0Q1JMRkNSTEYoYnl0ZVtdIGJ1ZmZlciwgaW50IGluZGV4KSAKLQl7Ci0JCWludCBzaXplID0gYnVmZmVyLmxlbmd0aDsKLQkJaW50IGkgPSBpbmRleDsKLQkJd2hpbGUgKGkgPCBzaXplIC0gMykgCi0JCXsKLQkJICBpZiAoYnVmZmVyW2ldID09IENSICYmIGJ1ZmZlcltpKzFdID09IExGICYmIGJ1ZmZlcltpKzJdID09IENSKQotCQkgIHsKLQkJCWlmIChidWZmZXJbaSszXSA9PSBMRikKLQkJCXsKLQkJCSAgcmV0dXJuIGkrNDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCSAgaW50IGogPSBpICsgMzsKLQkJCSAgd2hpbGUgKGogPCBidWZmZXIubGVuZ3RoICYmIGJ1ZmZlcltqXSA9PSBDUikKLQkJCSAgewotCQkJCWorKzsKLQkJCSAgfQotCQkJICBpZiAoaiA8IGJ1ZmZlci5sZW5ndGggJiYgYnVmZmVyW2pdID09IExGKQotCQkJICB7Ci0JCQkgIAlyZXR1cm4gaiArIDE7Ci0JCQkgIH0KLQkJCX0KLQkJICB9Ci0JCSAgaSsrOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBsb2NhdGlvbiBvZiBhIENSTEYgZm9sbG93ZWQgaW1lZGlhdGVseSBieSBhbm90aGVyIENSTEYuCi0JICoKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEZpcnN0Q1JMRkNSTEYoU3RyaW5nIGJ1ZmZlcikgCi0JewotCQlpbnQgaW5kZXggPSBidWZmZXIuaW5kZXhPZigiXHJcblxyIik7Ci0JCWlmIChpbmRleCAhPSAtMSkKLQkJewotCQkgIGludCBpID0gaW5kZXggKzM7Ci0JCSAgd2hpbGUgKGkgPCBidWZmZXIubGVuZ3RoKCkgJiYgYnVmZmVyLnN0YXJ0c1dpdGgoIlxyIiwgaSkpCi0JCSAgICAgaSsrOwotCQkKLQkJICBpZiAoaSA8IGJ1ZmZlci5sZW5ndGgoKSAmJiBidWZmZXIuc3RhcnRzV2l0aCgiXG4iLCBpKSkKLQkJCXJldHVybiBpKzE7Ci0JCSAgZWxzZQotCQkJcmV0dXJuIGdldEZpcnN0Q1JMRkNSTEYoYnVmZmVyLnN1YnN0cmluZyhpbmRleCArIDMpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJICByZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQkvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGluZGljZXMgd2hpY2ggbWFya3MgdGhlIHNlcGFyYXRpb24gb2YgcGFydHMuCi0gICAgICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBnZXRCb3VuZGFyeUluZGljZXMoYnl0ZVtdIG1lc3NhZ2UsIFN0cmluZyBib3VuZGFyeVN0cikKLQl7Ci0JICBpbnRbXSBpbmRpY2VzID0gbmV3IGludFsyNTZdOwotCSAgaW50IGluZGljZXNJbmRleCA9IDA7Ci0JICB0cnkKLQkgIHsKLQkgICAgYnl0ZVtdIGJvdW5kYXJ5ID0gKCJcclxuLS0iICsgYm91bmRhcnlTdHIpLmdldEJ5dGVzKCJVUy1BU0NJSSIpOwotCi0JICAgIGludCBpbmRleCA9IDA7Ci0JICAgIGludCBzdGFydCA9IDA7Ci0JICAgIGludCBlbmQgPSBtZXNzYWdlLmxlbmd0aDsKLQkgICAgd2hpbGUgKGluZGV4ICE9IC0xKQotCSAgICB7Ci0JICAgICAgaW5kZXggPSBpbmRleE9mKG1lc3NhZ2UsIGJvdW5kYXJ5LCBzdGFydCk7Ci0JICAgICAgCi0JICAgICAgaWYgKGluZGV4ICE9IC0xKSAKLQkgICAgICB7Ci0JCSAgICBzdGFydCA9IGluZGV4ICsgYm91bmRhcnkubGVuZ3RoOwotCSAgICAJaW5kaWNlc1tpbmRpY2VzSW5kZXhdID0gaW5kZXg7Ci0JICAgIAlpbmRpY2VzSW5kZXgrKzsKLQkgICAgICB9Ci0JICAgIH0KLSAgICAgIAlpbnRbXSBiID0gbmV3IGludFtpbmRpY2VzSW5kZXhdOwotICAgIAlTeXN0ZW0uYXJyYXljb3B5KGluZGljZXMsIDAsIGIsIDAsIGluZGljZXNJbmRleCk7Ci0gICAgCWluZGljZXMgPSBiOwotCSAgfQotCSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCSAge30KLQkgIHJldHVybiBpbmRpY2VzOwotCX0KLSAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBrZXkgaW4gdGhlIGJ1ZmZlci4KLSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKGJ5dGVbXSBidWZmZXIsIGJ5dGVbXSBrZXksIGludCBzdGFydCkKLQl7Ci0JCWludCBidWZmZXJMZW4gPSBidWZmZXIubGVuZ3RoOwotCQlpbnQga2V5TGVuID0ga2V5Lmxlbmd0aDsKLQkJaW50IGksaixrID0gMDsKLQkJCi0JCWlmIChrZXlMZW4gPiBidWZmZXJMZW4gLSBzdGFydCkKLQkJewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCi0JCWZvciAoayA9IHN0YXJ0ICsga2V5TGVuIC0gMTsgayA8IGJ1ZmZlckxlbjsgaysrKQotCQl7Ci0gICAgICAgICAgIGZvciAoaiA9IGtleUxlbiAtIDEsIGkgPSBrOyAoaiA+PSAwKSAmJiAoYnVmZmVyW2ldID09IGtleVtqXSk7IGotLSkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIGlmIChqID09ICgtMSkpIHsKLSAgICAgICAgICAgICAgIHJldHVybiBpICsgMTsKLSAgICAgICAgICAgfQotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQkvKioKLSAgICogR2V0IGNvbnRlbnRzIG9mIGEgcmVzb3VyY2UgYW5kIHJldHVybiBhcyBhIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIHJlc291cmNlTmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gZ2V0IGFuZCByZXR1cm4gYXMKLSAgICogICAgICAgICAgICAgICAgICAgICAgYW4gaW5wdXQgc3RyZWFtLgotICAgKiBAcmV0dXJuIGNvbnRlbnRzIG9mIGEgcmVzb3VyY2UgYXMgYW4gaW5wdXQgc3RyZWFtLgotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSByZXNvdXJjZSBjb3VsZCBub3QgYmUgbG9jYXRlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHJlc291cmNlTmFtZSkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLQotICAgIC8vIElmIHJlc291cmNlIHJlZmVyZW5jZSBpcyBhIFVSTCwgdGhlbiBpbnB1dCBzdHJlYW0gZnJvbSBVUkwKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBUcnkgdG8gY3JlYXRlIFVSTAotICAgICAgVVJMIHVybFJlc291cmNlID0gbmV3IFVSTChyZXNvdXJjZU5hbWUpOwotCi0gICAgICAvLyBJZiBzdWNjZXNzZnVsLCB0aGVuIGdldCBVUkwgaW5wdXQgc3RyZWFtCi0gICAgICBpcyA9IGdldElucHV0U3RyZWFtKHVybFJlc291cmNlKTsKLSAgICB9Ci0KLSAgICAvLyBFbHNlIHRyeSB0byByZWFkIHJlc291cmNlIGRpcmVjdGx5Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpCi0gICAgewotICAgICAgYm9vbGVhbiBiVHJ5Q2xhc3NMb2FkZXIgPSBmYWxzZTsKLQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIE9wZW4gZmlsZSBpbnB1dCBzdHJlYW0KLSAgICAgICAgaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHJlc291cmNlTmFtZSkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKQotICAgICAgewotICAgICAgICAvLyBTZXQgdHJ5IGNsYXNzIGxvYWRlciBmbGFnCi0gICAgICAgIGJUcnlDbGFzc0xvYWRlciA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc2UpCi0gICAgICB7Ci0gICAgICAgIC8vIFNldCB0cnkgY2xhc3MgbG9hZGVyIGZsYWcKLSAgICAgICAgYlRyeUNsYXNzTG9hZGVyID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIGluIGdldElucHV0U3RyZWFtIDoiICsgZS50b1N0cmluZygpKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdHJ5IGNsYXNzIGxvYWRlciwgdGhlbiB1c2UgaXQgdG8gZ2V0IGlucHV0IHN0cmVhbQotICAgICAgaWYgKGJUcnlDbGFzc0xvYWRlcikKLSAgICAgIHsKLSAgICAgICAgLy8gVXNlIGNsYXNzIGxvYWRlciB0byBsb2FkIHJlc291cmNlCi0gICAgICAgIGlzID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZU5hbWUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gaXMgbnVsbCwgdGhlbiB0aHJvdyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgICBpZiAoaXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL3RyeSB0aGlzCi0gICAgICBpcyA9Ci0gICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgKLSAgICAgICAgICByZXNvdXJjZU5hbWUpOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gaXMgbnVsbCwgdGhlbiB0aHJvdyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgICBpZiAoaXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL3RyeSB0aGlzCi0gICAgICBVUkwgYVVSTCA9Ci0gICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoCi0gICAgICAgICAgcmVzb3VyY2VOYW1lKTsKLSAgICAgIGlmIChhVVJMICE9IG51bGwpCi0gICAgICAgIGlzID0gZ2V0SW5wdXRTdHJlYW0oYVVSTCk7Ci0gICAgfQotCi0gICAgaWYgKGlzID09IG51bGwpCi0gICAgICAvLyBUaHJvdyBleGVjcHRpb24KLSAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oCi0gICAgICAgICJDb3VsZCBub3QgbG9jYXRlIHJlc291cmNlIGZpbGU6ICIgKyByZXNvdXJjZU5hbWUpOwotCi0gICAgLy8gUmV0dXJuIGlucHV0IHN0cmVhbQotICAgIHJldHVybiBpczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGlucHV0IHN0cmVhbSBmcm9tIGEgVVJMLgotICAgKiBAcGFyYW0gdXJsRmlsZSB0aGUgVVJMIHRvIGdldCB0aGUgaW5wdXQgc3RyZWFtIGZyb20uCi0gICAqIEByZXR1cm4gdGhlIGlucHV0IHN0cmVhbSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBVUkwuCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYXR0ZW1wdCB0byBvcGVuIHRoZSBmaWxlIGRlbm90ZWQgYnkgVVJMIGhhcyBmYWlsZWQuCi0gICAqIEB0aHJvd3MgQ29ubmVjdEV4Y2VwdGlvbiBpZiB0cm91YmxlIGNvbm5lY3RpbmcgdG8gVVJMLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShVUkwgdXJsRmlsZSkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENvbm5lY3RFeGNlcHRpb24KLSAgewotICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLQotICAgIC8vIEFERDogaG93IGFyZSBVUkxzIHRoYXQgYXJlIHBhc3N3b3JkIHByb3RlY3RlZCBoYW5kbGVkPz8/PwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gT3BlbiBmaWxlIGlucHV0IHN0cmVhbQotICAgICAgaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSh1cmxGaWxlLm9wZW5TdHJlYW0oKSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKENvbm5lY3RFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBSZS10aHJvdyB0aGlzIGV4Y3BldGlvbiB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICAgIHRocm93IG5ldyBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uKAotICAgICAgICAiQ291bGQgbm90IGNvbm5lY3QgdG8gVVJMOiAiICsgdXJsRmlsZS50b0V4dGVybmFsRm9ybSgpICsgIi4iKTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gaW5wdXQgc3RyZWFtCi0gICAgcmV0dXJuIGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBjb250ZW50cyBvZiBhIHJlc291cmNlIGFuZCByZXR1cm4gYXMgYSBpbnB1dCBzdHJlYW0uCi0gICAqIEBwYXJhbSBmaWxlTG9jYXRpb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlLgotICAgKiBAcmV0dXJuIGNvbnRlbnRzIG9mIGEgcmVzb3VyY2UgYXMgYSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZUV4aXN0cyhTdHJpbmcgZmlsZUxvY2F0aW9uKQotICB7Ci0gICAgYm9vbGVhbiBmaWxlRXhpc3RzID0gZmFsc2U7Ci0KLSAgICAvLyBJZiByZXNvdXJjZSByZWZlcmVuY2UgaXMgYSBVUkwsIHRoZW4gaW5wdXQgc3RyZWFtIGZyb20gVVJMCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBVUkwKLSAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGZpbGVMb2NhdGlvbik7Ci0KLSAgICAgIC8vIElmIHN1Y2Nlc3NmdWwsIHRoZW4gdHJ5IHRvIG9wZW4gY29ubmVjdGlvbgotICAgICAgSW5wdXRTdHJlYW0gaXMgPSB1cmwub3BlblN0cmVhbSgpOwotCi0gICAgICBmaWxlRXhpc3RzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBFbHNlIHRyeSB0byByZWFkIHJlc291cmNlIGRpcmVjdGx5Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVMb2NhdGlvbik7Ci0KLSAgICAgICAgZmlsZUV4aXN0cyA9IGZpbGUuZXhpc3RzKCk7Ci0gICAgICB9Ci0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZTIpCi0gICAgICB7Ci0gICAgICAgIGZpbGVFeGlzdHMgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpCi0gICAgewotICAgICAgZmlsZUV4aXN0cyA9IGZhbHNlOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBmaWxlRXhpc3RzID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGZpbGUgZXhpc3RzIGluZGljYXRvcgotICAgIHJldHVybiBmaWxlRXhpc3RzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBsb2NhbCBob3N0IG5hbWUuCi0gICAqIEByZXR1cm4gdGhlIGxvY2FsIGhvc3QgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsSG9zdE5hbWUoKQotICB7Ci0gICAgU3RyaW5nIHNMb2NhbEhvc3ROYW1lOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0IGxvY2FsIGhvc3QgbmFtZQotICAgICAgc0xvY2FsSG9zdE5hbWUgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0TmFtZSgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gU2V0IGRlZmF1bHQgbG9jYWwgaG9zdCBuYW1lCi0gICAgICBzTG9jYWxIb3N0TmFtZSA9ICIxMjcuMC4wLjEiOwotICAgIH0KLQotICAgIC8vIFJldHVybiBsb2NhbCBob3N0IG5hbWUKLSAgICByZXR1cm4gc0xvY2FsSG9zdE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQnVpbGQgYSBVUkwgc3RyaW5nIGZyb20gaG9zdG5hbWUsIHBvcnQgYW5kIFVSTi4KLSAgICoKLSAgICogQHBhcmFtIGhvc3RuYW1lIHRoZSBob3N0bmFtZS4KLSAgICogQHBhcmFtIHBvcnQgdGhlIHBvcnQuCi0gICAqIEBwYXJhbSB1cm4gdGhlIFVSTi4KLSAgICogQHJldHVybiBmb3JtYXR0ZWQgVVJMIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdFVSTChTdHJpbmcgaG9zdG5hbWUsIFN0cmluZyBwb3J0LCBTdHJpbmcgdXJuKQotICB7Ci0gICAgLy8gQnVpbGQgVVJOCi0gICAgU3RyaW5nIGZvcm1hdFVSTiA9IHVybjsKLQotICAgIC8vIElmIFVSTiBkb2Vzbid0IHN0YXJ0IHdpdGggIi8iLCB0aGVuIGFkZCBpdAotICAgIGlmICghKGZvcm1hdFVSTi5zdGFydHNXaXRoKCIvIikpKQotICAgIHsKLSAgICAgIC8vIEFkZCAiLyIgdG8gYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcKLSAgICAgIGZvcm1hdFVSTiA9ICIvIiArIHVybjsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gVVJMIHN0cmluZwotICAgIHJldHVybiAiaHR0cDovLyIgKyBob3N0bmFtZSArICI6IiArIHBvcnQgKyBmb3JtYXRVUk47Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2Qgd2lsbCByZXBsYWNlIGFsbCBvZiB0aGUgb2NjdXJhbmNlcyBvZiBhIHN0cmluZwotICAgKiB3aXRoIGEgc3Vic3RpdHV0aW9uIHN0cmluZy4KLSAgICoKLSAgICogQHBhcmFtIHNUZXh0IFN0cmluZyB0byB1ZHBhdGUuCi0gICAqIEBwYXJhbSBzRmluZCBTdHJpbmcgdG8gZmluZC4KLSAgICogQHBhcmFtIHNSZXBsYWNlIFN0cmluZyB0byB1c2UgZm9yIHN1YnN0aXR1dGlvbi4KLSAgICogQHJldHVybiB1cGRhdGVkIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VTdHJpbmcoCi0gICAgU3RyaW5nIHNUZXh0LAotICAgIFN0cmluZyBzRmluZCwKLSAgICBTdHJpbmcgc1JlcGxhY2UpCi0gIHsKLSAgICBpbnQgaVByZXZJbmRleCA9IDA7Ci0KLSAgICBpbnQgaUZpbmRMZW4gPSBzRmluZC5sZW5ndGgoKTsKLSAgICBpbnQgaVJlcGxhY2VMZW4gPSBzUmVwbGFjZS5sZW5ndGgoKTsKLQotICAgIFN0cmluZyBzVXBkYXRlZFRleHQgPSBzVGV4dDsKLQotICAgIC8vIFJlcGxhY2UgYWxsIG9jY3VyYW5jZXMgb2YgdGhlIGZpbmQgc3RyaW5nCi0gICAgZm9yIChpbnQgaUluZGV4ID0gc1VwZGF0ZWRUZXh0LmluZGV4T2Yoc0ZpbmQpOwotICAgICAgaUluZGV4IDwgKHNVcGRhdGVkVGV4dC5sZW5ndGgoKSAtIDEpICYmIGlJbmRleCAhPSAtMTsKLSAgICAgIGlJbmRleCA9IHNVcGRhdGVkVGV4dC5pbmRleE9mKHNGaW5kLCBpUHJldkluZGV4ICsgaVJlcGxhY2VMZW4pKQotICAgIHsKLSAgICAgIC8vIFNldCB1cGRhdGVkIHRleHQgZnJvbSB0aGUgZnJvbnQgcG9ydGlvbiArIHJlcGxhY2VtZW50IHRleHQgKyBiYWNrIHBvcnRpb24KLSAgICAgIHNVcGRhdGVkVGV4dCA9Ci0gICAgICAgIHNVcGRhdGVkVGV4dC5zdWJzdHJpbmcoMCwgaUluZGV4KQotICAgICAgICAgICsgc1JlcGxhY2UKLSAgICAgICAgICArIHNVcGRhdGVkVGV4dC5zdWJzdHJpbmcoaUluZGV4ICsgaUZpbmRMZW4pOwotCi0gICAgICAvLyBTZXQgdGhlIHByZXZpb3VzIGluZGV4IGZpZWxkCi0gICAgICBpUHJldkluZGV4ID0gaUluZGV4OwotICAgIH0KLQotICAgIC8vIFJldHVybiB1cGRhdGVkIHRleHQgc3RyaW5nCi0gICAgcmV0dXJuIHNVcGRhdGVkVGV4dDsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0IHN0cmluZyB0byBoZXggc3RyaW5nLgotICAgKiBAcGFyYW0gZGF0YSAgYSBTdHJpbmcgb2JqZWN0LgotICAgKiBAcmV0dXJuIGhleCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0hleFN0cmluZyhTdHJpbmcgZGF0YSkKLSAgewotICAgIGNoYXJbXSBIRVhfQ0hBUlMgPQotICAgICAgewotICAgICAgICAnMCcsCi0gICAgICAgICcxJywKLSAgICAgICAgJzInLAotICAgICAgICAnMycsCi0gICAgICAgICc0JywKLSAgICAgICAgJzUnLAotICAgICAgICAnNicsCi0gICAgICAgICc3JywKLSAgICAgICAgJzgnLAotICAgICAgICAnOScsCi0gICAgICAgICdBJywKLSAgICAgICAgJ0InLAotICAgICAgICAnQycsCi0gICAgICAgICdEJywKLSAgICAgICAgJ0UnLAotICAgICAgICAnRicgfTsKLQotICAgIC8vIEdldCBzdHJpbmcgYXMgYnl0ZSBhcnJheQotICAgIGJ5dGVbXSBieXRlRGF0YSA9IGRhdGEuZ2V0Qnl0ZXMoKTsKLQotICAgIC8vIEdldCBsZW5ndGgKLSAgICBpbnQgbGVuZ3RoID0gYnl0ZURhdGEubGVuZ3RoOwotCi0gICAgLy8gQ3JlYXRlIENoYXIgYnVmZmVyCi0gICAgY2hhcltdIGNoYXJCdWZmZXIgPSBuZXcgY2hhcltsZW5ndGggKiAyXTsKLQotICAgIGludCBuZXh0OwotICAgIGZvciAoaW50IGJ5dGVDbnQgPSAwLCBjaGFyQ250ID0gMDsgYnl0ZUNudCA8IGxlbmd0aDspCi0gICAgewotICAgICAgbmV4dCA9IGJ5dGVEYXRhW2J5dGVDbnQrK107Ci0gICAgICBjaGFyQnVmZmVyW2NoYXJDbnQrK10gPSBIRVhfQ0hBUlNbKG5leHQgPj4+IDQpICYgMHgwRl07Ci0gICAgICBjaGFyQnVmZmVyW2NoYXJDbnQrK10gPSBIRVhfQ0hBUlNbbmV4dCAmIDB4MEZdOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgU3RyaW5nKGNoYXJCdWZmZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgYnl0ZSBidWZmZXIgdG8gaGV4IHN0cmluZy4KLSAgICogQHBhcmFtIGRhdGEgIGEgYnl0ZSBhcnJheS4KLSAgICogQHJldHVybiBoZXggc3RyaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9IZXhTdHJpbmcoYnl0ZVtdIGJ5dGVEYXRhKQotICB7Ci0gICAgY2hhcltdIEhFWF9DSEFSUyA9Ci0gICAgICB7Ci0gICAgICAgICcwJywKLSAgICAgICAgJzEnLAotICAgICAgICAnMicsCi0gICAgICAgICczJywKLSAgICAgICAgJzQnLAotICAgICAgICAnNScsCi0gICAgICAgICc2JywKLSAgICAgICAgJzcnLAotICAgICAgICAnOCcsCi0gICAgICAgICc5JywKLSAgICAgICAgJ0EnLAotICAgICAgICAnQicsCi0gICAgICAgICdDJywKLSAgICAgICAgJ0QnLAotICAgICAgICAnRScsCi0gICAgICAgICdGJyB9OwotCi0KLSAgICAvLyBHZXQgbGVuZ3RoCi0gICAgaW50IGxlbmd0aCA9IGJ5dGVEYXRhLmxlbmd0aDsKLQotICAgIC8vIENyZWF0ZSBDaGFyIGJ1ZmZlcgotICAgIGNoYXJbXSBjaGFyQnVmZmVyID0gbmV3IGNoYXJbbGVuZ3RoICogMl07Ci0KLSAgICBpbnQgbmV4dDsKLSAgICBmb3IgKGludCBieXRlQ250ID0gMCwgY2hhckNudCA9IDA7IGJ5dGVDbnQgPCBsZW5ndGg7KQotICAgIHsKLSAgICAgIG5leHQgPSBieXRlRGF0YVtieXRlQ250KytdOwotICAgICAgY2hhckJ1ZmZlcltjaGFyQ250KytdID0gSEVYX0NIQVJTWyhuZXh0ID4+PiA0KSAmIDB4MEZdOwotICAgICAgY2hhckJ1ZmZlcltjaGFyQ250KytdID0gSEVYX0NIQVJTW25leHQgJiAweDBGXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFyQnVmZmVyKTsKLSAgfQotCi0gIC8vIEkxOE46IDIwMDMuMDIuMjYgbW9kaWZpZWQgYnkgSy5OYWthZ29tZUBCZWFjb25JVAotICAvKioKLSAgICogR2V0IE1JTUUgY2hhcnNldCBmcm9tIGEgSFRUUCBoZWFkZXJzLgotICAgKiBAcGFyYW0gaHR0cEhlYWRlcnMgU3RyaW5nIG9mIEhUVFAgaGVhZGVyLgotICAgKiBAcmV0dXJuIHRoZSBNSU1FIGNoYXJzZXQgc3RyaW5nLgotICAgKiBAYXV0aG9yIEsuTmFrYWdvbWVAQmVhY29uSVQgSmFwYW4gU0lHIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SFRUUENoYXJzZXQoU3RyaW5nIGh0dHBIZWFkZXJzKQotICB7Ci0gICAgU3RyaW5nIG1pbWVDaGFyc2V0ID0gbnVsbDsKLQotICAgIG1pbWVDaGFyc2V0ID0gaHR0cEhlYWRlcnMudG9VcHBlckNhc2UoKTsKLSAgICBpbnRbXSBpbmRleCA9IHsgLTEsIC0xLCAtMSB9OwotICAgIGludCBpbmRleFMgPSBtaW1lQ2hhcnNldC5pbmRleE9mKCJDSEFSU0VUIik7Ci0gICAgaW50IGluZGV4RSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgIGlmIChpbmRleFMgPCAxNykKLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIGluZGV4UyA9IG1pbWVDaGFyc2V0LmluZGV4T2YoIj0iLCBpbmRleFMgKyA3KTsKLSAgICBpZiAoaW5kZXhTID09IC0xKQotICAgIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gICAgaW5kZXhTKys7Ci0gICAgaW5kZXhbMF0gPSBtaW1lQ2hhcnNldC5pbmRleE9mKCInIiwgaW5kZXhTKTsKLSAgICBpbmRleFsxXSA9IG1pbWVDaGFyc2V0LmluZGV4T2YoIlxyXG4iLCBpbmRleFMpOwotICAgIGluZGV4WzJdID0gbWltZUNoYXJzZXQuaW5kZXhPZigiXCIiLCBpbmRleFMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpbmRleFtpXSAhPSAtMSAmIGluZGV4RSA+IGluZGV4W2ldKQotICAgICAgewotICAgICAgICBpbmRleEUgPSBpbmRleFtpXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaW5kZXhFICE9IEludGVnZXIuTUFYX1ZBTFVFKQotICAgIHsKLSAgICAgIG1pbWVDaGFyc2V0ID0gaHR0cEhlYWRlcnMuc3Vic3RyaW5nKGluZGV4UywgaW5kZXhFKTsKLSAgICAgIG1pbWVDaGFyc2V0LnRyaW0oKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1pbWVDaGFyc2V0ID0gIiI7Ci0gICAgfQotICAgIHJldHVybiBtaW1lQ2hhcnNldDsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgc2ltcGxlIFNPQVAgbWVzc2FnZSBvciB3aGV0aGVyIGl0IGlzIGEgU09BUCBtZXNzYWd3ZSB3aXRoIGF0dGFjaG1lbnRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTXVsdGlwYXJ0UmVsYXRlZE1lc3NhZ2UoU3RyaW5nIGh0dHBIZWFkZXJzKQotICB7Ci0gIAlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIHRyeSAKLSAgICB7Ci0gICAgICAvLyBjaGVjayBoZWFkZXIgZm9yIG1pbWUgdmVyc2lvbiBhbmQgYm91bmRhcnkKLSAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyQXR0cmlidXRlKGh0dHBIZWFkZXJzLCBIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEUpOwotICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIHRoZXJlIGlzIG5vIGNvbnRlbnRUeXBlLCBjaGVjayBpZiB0aGVyZSBpcyBhIGJvdW5kYXJ5IGF0dHJpYnV0ZQotICAgICAgICBTdHJpbmcgYm91bmRhcnkgPSBVdGlscy5nZXRIdHRwSGVhZGVyU3ViQXR0cmlidXRlKGh0dHBIZWFkZXJzLCBIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEUsICJib3VuZGFyeSIpOwotICAgICAgICBpZiAoKGJvdW5kYXJ5ICE9IG51bGwpICYmICghYm91bmRhcnkuZXF1YWxzKCIiKSkpCi0gICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoIm11bHRpcGFydC9yZWxhdGVkIik7Ci0gICAgICB9Ci0gICAgfSAKLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIGUpCi0JeyAKLSAgICAJcmVzdWx0ID0gZmFsc2U7IAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SHR0cEhlYWRlckF0dHJpYnV0ZShTdHJpbmcgaHR0cEhlYWRlcnMsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7IFN0cmluZyByZXN1bHQgPSBudWxsOwotICAJdHJ5Ci0gIAl7Ci0gICAgIHJlc3VsdCA9IEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyQXR0cmlidXRlKGh0dHBIZWFkZXJzLCBhdHRyaWJ1dGVOYW1lKTsKLSAgCX0KLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIGUpCi0JeyAKLSAgICAJcmVzdWx0ID0gbnVsbDsgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEh0dHBIZWFkZXJTdWJBdHRyaWJ1dGUoU3RyaW5nIGh0dHBIZWFkZXJzLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIHN1YkF0dHJpYnV0ZU5hbWUpCi0gIHsgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gIAl0cnkKLSAgCXsKLSAgICAgcmVzdWx0ID0gSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJTdWJBdHRyaWJ1dGUoaHR0cEhlYWRlcnMsIGF0dHJpYnV0ZU5hbWUsIHN1YkF0dHJpYnV0ZU5hbWUpOwotICAJfQotICAgIGNhdGNoIChXU0lFeGNlcHRpb24gZSkKLQl7IAotICAgIAlyZXN1bHQgPSBudWxsOyAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWltZUhlYWRlckF0dHJpYnV0ZShTdHJpbmcgbWltZUhlYWRlcnMsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7IFN0cmluZyByZXN1bHQgPSBudWxsOwotICAJdHJ5Ci0gIAl7Ci0gICAgIHJlc3VsdCA9IE1JTUVVdGlscy5nZXRNaW1lSGVhZGVyQXR0cmlidXRlKG1pbWVIZWFkZXJzLCBhdHRyaWJ1dGVOYW1lKTsKLSAgCX0KLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIGUpCi0JeyAKLSAgICAJcmVzdWx0ID0gbnVsbDsgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1pbWVIZWFkZXJTdWJBdHRyaWJ1dGUoU3RyaW5nIG1pbWVIZWFkZXJzLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIHN1YkF0dHJpYnV0ZU5hbWUpCi0gIHsgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gIAl0cnkKLSAgCXsKLSAgICAgcmVzdWx0ID0gTUlNRVV0aWxzLmdldE1pbWVIZWFkZXJTdWJBdHRyaWJ1dGUobWltZUhlYWRlcnMsIGF0dHJpYnV0ZU5hbWUsIHN1YkF0dHJpYnV0ZU5hbWUpOwotICAJfQotICAgIGNhdGNoIChXU0lFeGNlcHRpb24gZSkKLQl7IAotICAgIAlyZXN1bHQgPSBudWxsOyAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSB9Ci0gIC8vIEkxOE46IDIwMDMuMDIuMjYgbW9kaWZpZWQgYnkgSy5OYWthZ29tZUBCZWFjb25JVAotICAvKioKLSAgICogR2V0IFhNTCBlbmNvZGluZyBmcm9tIGEgU09BUCBNZXNzYWdlcy4KLSAgICogQHBhcmFtIG1lc3NhZ2UgIFNPQVAgTWVzc2FnZSBTdHJpbmcuIAotICAgKiBAcmV0dXJuIGNoYXJhY3RlciBlbmNvZGluZyBvZiBYTUwuCi0gICAqIEBhdXRob3IgSy5OYWthZ29tZUBCZWFjb25JVCBKYXBhbiBTSUcgCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYTUxFbmNvZGluZyhTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIFN0cmluZyB4bWxEZWYgPSBudWxsOwotCi0gICAgaW50IGluZGV4UyA9IG1lc3NhZ2UuaW5kZXhPZigiPD94bWwiKTsKLSAgICBpbnQgaW5kZXhFID0gLTE7Ci0gICAgaWYgKGluZGV4UyAhPSAtMSkKLSAgICB7Ci0gICAgICBpbmRleEUgPSBtZXNzYWdlLmluZGV4T2YoIj8+IiwgaW5kZXhTKTsKLSAgICAgIGlmIChpbmRleEUgPiBpbmRleFMpCi0gICAgICB7Ci0gICAgICAgIHhtbERlZiA9IG1lc3NhZ2Uuc3Vic3RyaW5nKGluZGV4UywgaW5kZXhFKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoeG1sRGVmICE9IG51bGwpCi0gICAgewotICAgICAgaW5kZXhTID0geG1sRGVmLmluZGV4T2YoImVuY29kaW5nIik7Ci0gICAgICBpZiAoaW5kZXhTID09IC0xKQotICAgICAgewotICAgICAgICB4bWxEZWYgPSAiIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgeG1sRGVmID0geG1sRGVmLnN1YnN0cmluZyhpbmRleFMgKyA4KTsKLSAgICAgICAgeG1sRGVmID0geG1sRGVmLnRyaW0oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBpZiAoeG1sRGVmLmxlbmd0aCgpID4gMykKLSAgICB7Ci0gICAgICBpbmRleFMgPSB4bWxEZWYuaW5kZXhPZigiPSIpOwotICAgICAgaWYgKGluZGV4UyA9PSAwKQotICAgICAgewotICAgICAgICB4bWxEZWYgPSB4bWxEZWYuc3Vic3RyaW5nKDEpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHhtbERlZi5sZW5ndGgoKSA+IDMpCi0gICAgewotICAgICAgU3RyaW5nIGVuZCA9ICJcIiI7Ci0gICAgICBpbmRleFMgPSB4bWxEZWYuaW5kZXhPZihlbmQpOwotICAgICAgaWYgKGluZGV4UyAhPSAwKQotICAgICAgewotICAgICAgICBpbmRleFMgPSB4bWxEZWYuaW5kZXhPZigoZW5kID0gIiciKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoaW5kZXhTID09IDApCi0gICAgICB7Ci0gICAgICAgIGluZGV4RSA9IHhtbERlZi5pbmRleE9mKGVuZCwgMyk7Ci0gICAgICAgIGlmIChpbmRleEUgIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICB4bWxEZWYgPSB4bWxEZWYuc3Vic3RyaW5nKDEsIGluZGV4RSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgeG1sRGVmID0gIiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgeG1sRGVmID0gIiI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB4bWxEZWY7Ci0gIH0KLQotICAvLyBJMThOOiAyMDAzLjAyLjI2IG1vZGlmaWVkIGJ5IEsuTmFrYWdvbWVAQmVhY29uSVQKLSAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgamF2YUVuY29kaW5nUmVzb3VyY2UgPSBudWxsOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9FTkNPRElOR19SRVNPVVJDRSA9Ci0gICAgIm9yZy53c2kudGVzdC51dGlsLkphdmFFbmNvZGluZyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0VOQ09ESU5HX0RFRkFVTFQgPSAiVVRGLTgiOwotCi0gIC8vIEkxOE46IDIwMDMuMDIuMjYgbW9kaWZpZWQgYnkgSy5OYWthZ29tZUBCZWFjb25JVAotICAvKioKLSAgICogR2V0IEphdmEgVk0gc3VwcG9ydGVkIGNoYXJhY3RlciBlbmNvZGluZy4KLSAgICogCi0gICAqIEBwYXJhbSBtaW1lRW5jb2RpbmcgIHN0cmluZyBvZiBNSU1FKElBTkEpIGNoYXJhY3RlciBlbmNvZGluZy4gCi0gICAqIEByZXR1cm4gc3RyaW5nIG9mIGNoYXJhY3RlciBlbmNvZGluZyBzdXBwb3J0ZWQgYnkgSmF2YSBWTS4KLSAgICogQGF1dGhvciBLLk5ha2Fnb21lQEJlYWNvbklUIEphcGFuIFNJRyAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmFFbmNvZGluZyhTdHJpbmcgbWltZUVuY29kaW5nKQotICB7Ci0gICAgaWYgKG1pbWVFbmNvZGluZyA9PSBudWxsIHx8IG1pbWVFbmNvZGluZy5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBKQVZBX0VOQ09ESU5HX0RFRkFVTFQ7Ci0gICAgfQotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChqYXZhRW5jb2RpbmdSZXNvdXJjZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBqYXZhRW5jb2RpbmdSZXNvdXJjZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShKQVZBX0VOQ09ESU5HX1JFU09VUkNFKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBqYXZhRW5jb2RpbmdSZXNvdXJjZS5nZXRTdHJpbmcobWltZUVuY29kaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHJldHVybiBtaW1lRW5jb2Rpbmc7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgYW4gYXJyYXkgdG8gYSBWZWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gYXJyYXkgIHRoZSBhcnJheSB0byBiZSBjb252ZXJ0ZWQgLgotICAgKiBAcmV0dXJuIGNvbnZlcnRlZCBWZWN0b3IgKG51bGwgaWYgYXJyYXkgaXMgbnVsbCwgZW1wdHkgaWYgZW1wdHkpLgotICAgKiBAYXV0aG9yIEdyYWhhbSBUdXJyZWxsIElCTQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBWZWN0b3IgYXJyYXlUb1ZlY3RvcihPYmplY3RbXSBhcnJheSkKLSAgewotICAgIGlmIChhcnJheSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKGFycmF5Lmxlbmd0aCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKLSAgICAgIHYuYWRkKGFycmF5W2ldKTsKLSAgICByZXR1cm4gdjsKLSAgfQotICAvKioKLSAgICogQ2hlY2tzIHRvIGVuc3VyZSB0aGF0IHZlcnNpb24gb2YgdGhlIHByb2ZpbGUgdGVzdCBhc3NlcnRpb24gCi0gICAqIGRvY3VtZW50IGlzIHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHRlc3QgdG9vbHMuCi0gICAqIEBwYXJhbSBwcm9maWxlQXNzZXJ0aW9ucyAtIGEgcHJvZmlsZSBUQUQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvZmlsZSB0ZXN0IGFzc2VydGlvbgotICAgKiAgICAgICAgIGRvY3VlbWVudCBpcyBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSB0ZXN0IHRvb2xzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRQcm9maWxlVEFEVmVyc2lvbihQcm9maWxlQXNzZXJ0aW9ucyBwcm9maWxlQXNzZXJ0aW9ucykKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IHByb2ZpbGVBc3NlcnRpb25zLmdldFRBRE5hbWUoKTsKLSAgICBTdHJpbmcgdmVyc2lvbiA9IHByb2ZpbGVBc3NlcnRpb25zLmdldFRBRFZlcnNpb24oKTsKLQotICAgIGlmIChXU0lDb25zdGFudHMuQkFTSUNfUFJPRklMRV9UQURfTkFNRS5lcXVhbHMobmFtZSkpCi0gICAgewotICAgICAgcmVzdWx0ID0KLSAgICAgICAgY2hlY2tWZXJzaW9uTnVtYmVyKFdTSUNvbnN0YW50cy5CQVNJQ19QUk9GSUxFX1RBRF9WRVJTSU9OLCB2ZXJzaW9uKTsKLSAgICB9IGVsc2UgaWYgKFdTSUNvbnN0YW50cy5CQVNJQ19QUk9GSUxFXzFfMV9UQURfTkFNRS5lcXVhbHMobmFtZSkpCi0gICAgeyAgCi0gICAgICByZXN1bHQgPQotICAgICAgICBjaGVja1ZlcnNpb25OdW1iZXIoV1NJQ29uc3RhbnRzLkJBU0lDX1BST0ZJTEVfMV8xX1RBRF9WRVJTSU9OLCB2ZXJzaW9uKTsKLSAgICB9IGVsc2UgaWYgKFdTSUNvbnN0YW50cy5TSU1QTEVfU09BUF9CSU5ESU5HU19QUk9GSUxFX1RBRF9OQU1FLmVxdWFscyhuYW1lKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPQotICAgICAgICBjaGVja1ZlcnNpb25OdW1iZXIoV1NJQ29uc3RhbnRzLlNJTVBMRV9TT0FQX0JJTkRJTkdTX1BST0ZJTEVfVEFEX1ZFUlNJT04sIHZlcnNpb24pOwotICAgIH0gZWxzZSBpZiAoV1NJQ29uc3RhbnRzLkFUVEFDSE1FTlRTX1BST0ZJTEVfVEFEX05BTUUuZXF1YWxzKG5hbWUpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9Ci0gICAgICAgIGNoZWNrVmVyc2lvbk51bWJlcihXU0lDb25zdGFudHMuQVRUQUNITUVOVFNfUFJPRklMRV9UQURfVkVSU0lPTiwgdmVyc2lvbik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHRvIGVuc3VyZSB0aGF0IHZlcnNpb24gbnVtYmVyIG9mIHRoZSBhY3R1YWwgcHJvZmlsZSB0ZXN0IGFzc2VydGlvbiAKLSAgICogZG9jdW1lbnQgaXMgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgdGVzdCB0b29scy4KLSAgICogQHBhcmFtIHN1cHBvcnRlZFZlcnNpb24gLSBzdXBwb3J0ZWQgdmVyc2lvbiBudW1iZXIgb2YgcHJvZmlsZSBUQUQuCi0gICAqIEBwYXJhbSBhY3R1YWxWZXJzaW9uICAgIC0gYWN0dWFsIHZlcnNpb24gbnVtYmVyIG9mIHByb2ZpbGUgVEFELiAKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgYWN0dWFsIHByb2ZpbGUgdGVzdCBhc3NlcnRpb24KLSAgICogICAgICAgICBkb2N1bWVudCBpcyBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSB0ZXN0IHRvb2xzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja1ZlcnNpb25OdW1iZXIoCi0gICAgU3RyaW5nIHN1cHBvcnRlZFZlcnNpb24sCi0gICAgU3RyaW5nIGFjdHVhbFZlcnNpb24pCi0gIHsKLSAgICBib29sZWFuIHZhbGlkVmVyc2lvbiA9IHRydWU7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3VwcG9ydGVkVmVyc2lvblRva2VuaXplciA9Ci0gICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoc3VwcG9ydGVkVmVyc2lvbiwgIi4iKTsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBhY3R1YWxWZXJzaW9uVG9rZW5pemVyID0KLSAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihhY3R1YWxWZXJzaW9uLCAiLiIpOwotCi0gICAgICB3aGlsZSAoc3VwcG9ydGVkVmVyc2lvblRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgJiYgdmFsaWRWZXJzaW9uKQotICAgICAgewotICAgICAgICBpbnQgc3VwcG9ydGVkVmVyc2lvblRva2VuID0KLSAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHN1cHBvcnRlZFZlcnNpb25Ub2tlbml6ZXIubmV4dFRva2VuKCkpOwotICAgICAgICBpZiAoYWN0dWFsVmVyc2lvblRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgYWN0dWFsVmVyc2lvblRva2VuID0KLSAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoYWN0dWFsVmVyc2lvblRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0gICAgICAgICAgaWYgKHN1cHBvcnRlZFZlcnNpb25Ub2tlbiA+IGFjdHVhbFZlcnNpb25Ub2tlbikgYnJlYWs7Ci0gICAgICAgICAgZWxzZSB2YWxpZFZlcnNpb24gPSAoc3VwcG9ydGVkVmVyc2lvblRva2VuID49IGFjdHVhbFZlcnNpb25Ub2tlbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHZhbGlkVmVyc2lvbiA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdmFsaWRWZXJzaW9uOwotICB9Ci0gIAotICAvKioKLSAgICogSWRlbnRpZmllcyB0aGUgcm9vdCBwYXJ0IGluIHRoZSBsaXN0IHVzaW5nIHRoZSAic3RhcnQiIGF0dHJpYnV0ZS4KLSAgICogSWYgdGhlICJzdGFydCIgYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0IHRoZW4gdGhlIGZpcnN0IHBhcnQgaXMgZGVzaWduYXRlZCB0aGUgcm9vdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTWltZVBhcnQgZmluZFJvb3RQYXJ0KFN0cmluZyBodHRwSGVhZGVycywgQ29sbGVjdGlvbiBwYXJ0cykKLSAgewotICAJTWltZVBhcnQgcm9vdCA9IG51bGw7Ci0gICAgU3RyaW5nIHN0YXJ0ID0gVXRpbHMuZ2V0SHR0cEhlYWRlclN1YkF0dHJpYnV0ZShodHRwSGVhZGVycywgSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLCAic3RhcnQiKTsKLSAgICBpZiAoIXBhcnRzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBmaXJzdCBwYXJ0IGluIHRoZSBjb2xsZWN0aW9uCi0gICAgICByb290ID0gKE1pbWVQYXJ0KXBhcnRzLml0ZXJhdG9yKCkubmV4dCgpOwotICAgIAkKLSAgICAgIGlmICgoc3RhcnQgIT0gbnVsbCkgJiYgKCFzdGFydC5lcXVhbHMoIiIpKSkKLSAgICAgIHsKLSAgICAJSXRlcmF0b3IgaSA9IHBhcnRzLml0ZXJhdG9yKCk7Ci0gICAgCWJvb2xlYW4gcm9vdE5vdEZvdW5kID0gdHJ1ZTsKLSAgICAJd2hpbGUgKGkuaGFzTmV4dCgpICYmIHJvb3ROb3RGb3VuZCkKLSAgICAJewotICAgIAkgIE1pbWVQYXJ0IHBhcnQgPSAoTWltZVBhcnQpaS5uZXh0KCk7Ci0gICAgCSAgU3RyaW5nIGhlYWRlcnMgPSBwYXJ0LmdldEhlYWRlcnMoKTsKLSAgICAJICBpZiAoaGVhZGVycyAhPSBudWxsKQotICAgIAkgIHsKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50SWQgPSBVdGlscy5nZXRNaW1lSGVhZGVyQXR0cmlidXRlKGhlYWRlcnMsIE1JTUVDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfSUQpOwotICAgICAgICAgICAgaWYgKHN0YXJ0LmVxdWFscyhjb250ZW50SWQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByb290ID0gcGFydDsKLQkJCSAgcm9vdE5vdEZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgCSAgfQotICAgIAl9Ci0gICAgICB9Ci0gICAgfQotICAJcmV0dXJuIHJvb3Q7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEZWNvZGVzIHRoZSBnaXZlbiBlbmNvZGVkIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZUJhc2U2NChTdHJpbmcgc3RyKQotICB7Ci0gIAl0cnkKLSAgCXsKLSAgICAJc3VuLm1pc2MuQkFTRTY0RGVjb2RlciBkZWNvZGVyID0gIG5ldyBzdW4ubWlzYy5CQVNFNjREZWNvZGVyKCk7Ci0gIAkgICAgcmV0dXJuIGRlY29kZXIuZGVjb2RlQnVmZmVyKHN0cik7Ci0gIAl9Ci0gIAljYXRjaCAoRXhjZXB0aW9uIGUpCi0gIAl7Ci0gIAkJcmV0dXJuIG5ldyBieXRlWzBdOwotICAJfQotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXMgdGhlIGdpdmVuIGJ5dGUgYXJyYXkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVCYXNlNjQoYnl0ZVtdIGJ1ZmZlcikKLSAgeyAgICAKLSAgCXN1bi5taXNjLkJBU0U2NEVuY29kZXIgZW5jb2RlciA9ICBuZXcgc3VuLm1pc2MuQkFTRTY0RW5jb2RlcigpOwotICAJcmV0dXJuIGVuY29kZXIuZW5jb2RlQnVmZmVyKGJ1ZmZlcik7ICAKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTWltZVBhcnRzIHBhcnNlTXVsdGlwYXJ0UmVsYXRlZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBodHRwSGVhZGVycywgU3RyaW5nIGVuY29kaW5nKQotICB7Ci0gIAlieXRlW10gYnVmZmVyID0gbnVsbDsKLSAgCXRyeQotCXsgCi0gIAkgIGJ1ZmZlciA9IG1lc3NhZ2UuZ2V0Qnl0ZXMoZW5jb2RpbmcpOwotCX0KLSAgCWNhdGNoIChFeGNlcHRpb24gZSkKLQl7Ci0gIAkJcmV0dXJuIG51bGw7Ci0JfQotICAJcmV0dXJuIHBhcnNlTXVsdGlwYXJ0UmVsYXRlZE1lc3NhZ2UoYnVmZmVyLCBodHRwSGVhZGVycywgZW5jb2RpbmcpOwotICB9Ci0gIHB1YmxpYyBzdGF0aWMgTWltZVBhcnRzIHBhcnNlTXVsdGlwYXJ0UmVsYXRlZE1lc3NhZ2UoYnl0ZVtdIG1lc3NhZ2UsIFN0cmluZyBodHRwSGVhZGVycywgU3RyaW5nIGVuY29kaW5nKQotICB7Ci0gICAgTWltZVBhcnRzIG1pbWVQYXJ0cyA9IG5ldyBNaW1lUGFydHNJbXBsKCk7Ci0gICAgU3RyaW5nIGJvdW5kYXJ5ID0gVXRpbHMuZ2V0SHR0cEhlYWRlclN1YkF0dHJpYnV0ZShodHRwSGVhZGVycywgSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLCAiYm91bmRhcnkiKTsKLSAgICBBcnJheUxpc3QgcGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgaWYgKGJvdW5kYXJ5ID09IG51bGwpCi0gICAgewotICAgIAkvLyBhc3N1bWUgaXQgaXMgYSBzaW1wbGUgU09BUCBtZXNzYWdlCi0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIHN0YXJ0ID0gVXRpbHMuZ2V0SHR0cEhlYWRlclN1YkF0dHJpYnV0ZShodHRwSGVhZGVycywgSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLCAic3RhcnQiKTsKLSAgICAgIGludFtdIGluZGljZXMgPSBVdGlscy5nZXRCb3VuZGFyeUluZGljZXMobWVzc2FnZSwgYm91bmRhcnkpOwotICAgICAgYm9vbGVhbiByb290Tm90Rm91bmQgPSB0cnVlOwotICAgICAgCi0gICAgICBmb3IgKGludCBpPSBpbmRpY2VzLmxlbmd0aCAtIDI7IGk+PTA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgCXsKLSAgICAgICAgICBNaW1lUGFydCBwYXJ0ID0gbmV3IE1pbWVQYXJ0SW1wbCgpOwotICAgICAgICAgIGludCBpbmRleCA9IFV0aWxzLmdldEZpcnN0Q1JMRkNSTEYobWVzc2FnZSwgaW5kaWNlc1tpXSk7Ci0gICAgICAgICAgaWYgKChpbmRleCA+IGluZGljZXNbaV0pICYmIChpbmRleCA8IGluZGljZXNbaSsxXSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gdGhlIGJvdW5kYXJ5IHN0cmluZyAmIG1pbWUgaGVhZGVycyAoaW5jbHVkZSB0aGUgdHJhaWxpbmcgQ1JMRiBDUkxGKQotICAgICAgICAJU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcobWVzc2FnZSwgaW5kaWNlc1tpXSwgKGluZGV4IC0gaW5kaWNlc1tpXSksICJVUy1BU0NJSSIpOwotICAgICAgICAJU3RyaW5nIGRlbGltaXRlciA9IHN0ci5zdWJzdHJpbmcoMCwgc3RyLmluZGV4T2YoIlxyXG4iLCAyKSArIDIpOwotCi0gICAgICAgIAlpZiAoaSA9PSBpbmRpY2VzLmxlbmd0aCAtMikKLSAgICAgICAgCXsKLSAgICAgICAgCSAgU3RyaW5nIGVuZERlbGltaXRlciA9IG5ldyBTdHJpbmcobWVzc2FnZSwgaW5kaWNlc1tpICsgMV0sIG1lc3NhZ2UubGVuZ3RoIC0gaW5kaWNlc1tpICsgMV0sICJVUy1BU0NJSSIpOwotICAgICAgICAJICBpbnQgaiA9IHN0ci5pbmRleE9mKCJcclxuIiwgMik7Ci0gICAgICAgIAkgIGlmIChqICE9IC0xKQotICAgICAgICAJICAgIGVuZERlbGltaXRlciA9IHN0ci5zdWJzdHJpbmcoMCwgc3RyLmluZGV4T2YoIlxyXG4iLCAyKSArIDIpOwotICAgICAgICAgICAgICBwYXJ0LnNldEJvdW5kYXJ5U3RyaW5ncyhuZXcgU3RyaW5nW117ZGVsaW1pdGVyLCBlbmREZWxpbWl0ZXJ9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCWVsc2UKLSAgICAgICAgCSAgcGFydC5zZXRCb3VuZGFyeVN0cmluZ3MobmV3IFN0cmluZ1tde2RlbGltaXRlcn0pOwotICAgICAgIAotICAgICAgICAJLy8gdGhlIGhlYWRlcnMKLSAgICAgICAgCVN0cmluZyBoZWFkZXJzID0gc3RyLnN1YnN0cmluZyhkZWxpbWl0ZXIubGVuZ3RoKCkpOwotICAgICAgICAgICAgaWYgKGhlYWRlcnMuc3RhcnRzV2l0aCgiXHJcbiIpKQotICAgICAgICAgICAgewotICAgICAgICAgIAkgIC8vIG5vIGhlYWRlcnMgcHJlc2VudAotICAgICAgICAgIAkgIHBhcnQuc2V0SGVhZGVycygiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgCSAgcGFydC5zZXRIZWFkZXJzKGhlYWRlcnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyB0aGUgY29udGVudAotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRJZCA9IFV0aWxzLmdldE1pbWVIZWFkZXJBdHRyaWJ1dGUoaGVhZGVycywgTUlNRUNvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9JRCk7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IGluZGljZXNbaSsxXSAtIChpbmRleCk7Ci0gICAgICAgICAJYnl0ZVtdIGNvbnRlbnQgPSBuZXcgYnl0ZVtzaXplXTsKLSAgICAgIAkgICAgU3lzdGVtLmFycmF5Y29weShtZXNzYWdlLCBpbmRleCwgY29udGVudCwgMCwgc2l6ZSk7Ci0gICAgICAJICAKLSAgICAgICAgICAgIGlmICgocm9vdE5vdEZvdW5kICYmIChpID09IDApKSB8fAotICAgICAgICAgICAgCSgoc3RhcnQgIT0gbnVsbCkgJiYgKCFzdGFydC5lcXVhbHMoIiIpKSAmJiAoc3RhcnQuZXF1YWxzKGNvbnRlbnRJZCkpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gcm9vdCBwYXJ0IC0tIGRvIG5vdCBlbmNvZGUKLSAgICAgICAgICAgICAgcGFydC5zZXRDb250ZW50KG5ldyBTdHJpbmcoY29udGVudCwgZW5jb2RpbmcpKTsKLSAgICAgICAgICAgICAgbWltZVBhcnRzLnNldFJvb3RQYXJ0KHBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgdHJhbnNmZXJFbmNvZGluZyA9ICBVdGlscy5nZXRNaW1lSGVhZGVyQXR0cmlidXRlKGhlYWRlcnMsIE1JTUVDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkcpOwotICAgCi0gICAgICAgICAgICAgIGlmICgodHJhbnNmZXJFbmNvZGluZyAhPSBudWxsKSAmJiB0cmFuc2ZlckVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoImJhc2U2NCIpKQotICAgICAgICAgICAgICAJcGFydC5zZXRDb250ZW50KG5ldyBTdHJpbmcoY29udGVudCwgZW5jb2RpbmcpKTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBhcnQuc2V0Q29udGVudChVdGlscy5lbmNvZGVCYXNlNjQoY29udGVudCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICBwYXJ0cy5hZGQocGFydCk7Ci0gICAgICAgICB9Ci0gICAgCX0KLSAgICAJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIAl7Ci0gICAgCSAgcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAgIH0KLSAgICAgIGludCBzaXplID0gcGFydHMuc2l6ZSgpOwotICAgICAgZm9yIChpbnQgaSA9IHNpemUtMTsgaT49MDsgaS0tKQotICAgICAgICAgbWltZVBhcnRzLmFkZFBhcnQoKE1pbWVQYXJ0KXBhcnRzLmdldChpKSk7Ci0gICAgfQotICAgIHJldHVybiBtaW1lUGFydHM7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1hNTFN0cmluZyhNaW1lUGFydHMgbWltZVBhcnRzKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIC8vIEFkZCBtZXNzYWdlIGNvbnRlbnQgd2l0aCBhdHRhY2htZW50cyBlbGVtZW50Ci0gICAgcHcucHJpbnQoIjwiICsgV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9DT05URU5UX1dJVEhfQVRUQUNITUVOVFMpOwotICAgIHB3LnByaW50KCI+Iik7Ci0KLSAgICBDb2xsZWN0aW9uIHBhcnRMaXN0ID0gbWltZVBhcnRzLmdldFBhcnRzKCk7Ci0gICAgaWYgKCFwYXJ0TGlzdC5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgIAlJdGVyYXRvciBpTWltZVBhcnRzID0gcGFydExpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgCXdoaWxlIChpTWltZVBhcnRzLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgCSAgTWltZVBhcnQgbWltZVBhcnQgPSAoTWltZVBhcnQpaU1pbWVQYXJ0cy5uZXh0KCk7Ci0gICAgICAgICAJICBwdy5wcmludChtaW1lUGFydC50b1hNTFN0cmluZygiIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIGVuZCBtZXNzYWdlIGVsZW1lbnQKLSAgICAgICAgcHcucHJpbnRsbigiPC8iICsgV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9DT05URU5UX1dJVEhfQVRUQUNITUVOVFMgKyAiPiIpOwotICAgIC8vIFJldHVybiBzdHJpbmcKLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKQotICB7Ci0gIAl0cnkKLQl7Ci0gIAkgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oImQ6XFxiLnhtbCIpOwotICAJICBpbnQgaSA9IGlucHV0U3RyZWFtLmF2YWlsYWJsZSgpOwotICAJICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbaV07Ci0gIAkgIGlucHV0U3RyZWFtLnJlYWQoYnVmZmVyKTsKLSAgCSAgU3RyaW5nIG1lc3NhZ2UgPSBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0gIAkgIG1lc3NhZ2UgPSBYTUxVdGlscy54bWxSZW1vdmVFc2NhcGVkU3RyaW5nKG1lc3NhZ2UpOwotICAJICBTdHJpbmcgaGVhZGVycyA9IFV0aWxzLmdldEhUVFBIZWFkZXJzKG1lc3NhZ2UpOwotICAJICBTdHJpbmcgY29udGVudCA9IFV0aWxzLmdldENvbnRlbnQobWVzc2FnZSk7Ci0gIAkgIE1pbWVQYXJ0cyBwYXJ0cyA9IFV0aWxzLnBhcnNlTXVsdGlwYXJ0UmVsYXRlZE1lc3NhZ2UobWVzc2FnZSwgaGVhZGVycywgVXRpbHMuSkFWQV9FTkNPRElOR19ERUZBVUxUKTsKLSAgCSAgU3lzdGVtLm91dC5wcmludGxuKFV0aWxzLnRvWE1MU3RyaW5nKHBhcnRzKSk7Ci0JfQotICAJY2F0Y2ggKEV4Y2VwdGlvbiBlKXt9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1dTRExVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9XU0RMVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWRjZjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1dTRExVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotCi0vKioKLSAqIFRoZSB1dGlsaXR5IGNsYXNzIHRvIGF1dG9tYXRlIFdTREwgcHJvY2Vzc2luZy4KLSAqIAotICogQGF1dGhvciBLdWxpawotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETFV0aWwKLXsKLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBleHRyYWN0cyBsaXN0IG9mIHBhcnRzIGZvciB0aGUgZ2l2ZW4gc29hcGJpbmQ6Ym9keSwKLSAgICogYmluZGluZyBvcGVyYXRpb24sIG1lc3NhZ2UsIGFuZCBzdHlsZS4KLSAgICogCi0gICAqIEBwYXJhbSBvcCBhbiBvcGVyYXRpb24uCi0gICAqIEBwYXJhbSBtICBhIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBib2R5IGEgU09BUCBib2R5LgotICAgKiBAcGFyYW0gc3R5bGUgYW4gb3BlcmF0aW9uIHN0eWxlLgotICAgKiBAcmV0dXJuIGxpc3Qgb2YgcGFydHMgZm9yIHRoZSBnaXZlbiBzb2FwYmluZDpib2R5LAotICAgKiAgICAgICAgIGJpbmRpbmcgb3BlcmF0aW9uLCBtZXNzYWdlLCBhbmQgc3R5bGUuCi0gICAqLwotICBzdGF0aWMgcHVibGljIExpc3QgZ2V0UGFydHMoCi0gICAgT3BlcmF0aW9uIG9wLAotICAgIE1lc3NhZ2UgbSwKLSAgICBTT0FQQm9keSBib2R5LAotICAgIFN0cmluZyBzdHlsZSkKLSAgewotICAgIC8vCQlpZiBudWxsLCBnZXQgcGFydHMgZnJvbSBtZXNzYWdlIAotICAgIGlmIChib2R5LmdldFBhcnRzKCkgPT0gbnVsbCkKLSAgICAgIC8vIGlmIHJwYyBzdHlsZSBpcyB1c2VkLCB0cnkgdG8gdXNlIHBhcnRPcmRlciBhdHRyaWJ1dGUgZnJvbSBvcGVyYXRpb24KLSAgICAgIGlmIChXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDLmVxdWFscyhzdHlsZSkpCi0gICAgICAgIHJldHVybiBtLmdldE9yZGVyZWRQYXJ0cyhvcC5nZXRQYXJhbWV0ZXJPcmRlcmluZygpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG0uZ2V0T3JkZXJlZFBhcnRzKG51bGwpOwotICAgIGVsc2UKLSAgICAgIC8vIGNvbnZlcnNlIHBhcnRzIG5hbWUgdG8gcGFydHMgb2JqZWN0cwotICAgICAgcmV0dXJuIG0uZ2V0T3JkZXJlZFBhcnRzKGJvZHkuZ2V0UGFydHMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBpdGVyYXRlcyBhbGwgaW1wb3J0cyBmcm9tIHRoZSBnaXZlbiBkZWZpbml0aW9uIGFuZCBleHBhbmRzIGFsbAotICAgKiBpbXBvcnRlZCBtZXNzYWdlcywgc2VydmljZSwgcG9ydFR5cGVzLCBhbmQgYmluZGluZ3MgdG8gdGhlIGRlZmluaXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZGVmIGEgV1NETCBkZWZpbml0aW9uLgotICAgKi8KLSAgc3RhdGljIHB1YmxpYyB2b2lkIGV4cGFuZERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICBpZiAoZGVmICE9IG51bGwgJiYgZGVmLmdldEltcG9ydHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gZGVmLmdldEltcG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCB2ID0gKExpc3QpIGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKHYgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIGl0MiA9IHYuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAoaXQyLmhhc05leHQoKSkKLSAgICAgICAgICAgIGV4cGFuZERlZmluaXRpb24oZGVmLCAoSW1wb3J0KSBpdDIubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgaW50ZXJuYWwgbWV0aG9kIHRvIGV4cGFuZCBkZWZpbml0aW9uLgotICAgKiBAcGFyYW0gdGFyZ2V0IFdTREwgZGVmaW5pdGlvbi4KLSAgICogQHBhcmFtIGltIGludGVybmFsIG1ldGhvZC4KLSAgICovCi0gIHN0YXRpYyBwcml2YXRlIHZvaWQgZXhwYW5kRGVmaW5pdGlvbihEZWZpbml0aW9uIHRhcmdldCwgSW1wb3J0IGltKQotICB7Ci0gICAgaWYgKGltICE9IG51bGwgJiYgaW0uZ2V0RGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkID0gaW0uZ2V0RGVmaW5pdGlvbigpOwotICAgICAgaWYgKGQuZ2V0TWVzc2FnZXMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpdCA9IGQuZ2V0TWVzc2FnZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgICAgIHRhcmdldC5hZGRNZXNzYWdlKChNZXNzYWdlKSBpdC5uZXh0KCkpOwotICAgICAgfQotICAgICAgaWYgKGQuZ2V0UG9ydFR5cGVzKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBkLmdldFBvcnRUeXBlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICAgICAgdGFyZ2V0LmFkZFBvcnRUeXBlKChQb3J0VHlwZSkgaXQubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChkLmdldEJpbmRpbmdzKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBkLmdldEJpbmRpbmdzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgICAgICB0YXJnZXQuYWRkQmluZGluZygoQmluZGluZykgaXQubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChkLmdldFNlcnZpY2VzKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBkLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgICAgICB0YXJnZXQuYWRkU2VydmljZSgoU2VydmljZSkgaXQubmV4dCgpKTsKLSAgICAgIH0KLQotICAgICAgSXRlcmF0b3IgaXQgPSBkLmdldEltcG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCB2ID0gKExpc3QpIGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKHYgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIGl0MiA9IHYuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAoaXQyLmhhc05leHQoKSkKLSAgICAgICAgICAgIGV4cGFuZERlZmluaXRpb24odGFyZ2V0LCAoSW1wb3J0KSBpdDIubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGV4dHJhY3RzIHBhcnQgZnJvbSB0aGUgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIGEgU09BUCBtZXNzYWdlLgotICAgKiBAcGFyYW0gcGFydCBhIHBhcnQgbmFtZS4KLSAgICogQHJldHVybiBwYXJ0IGZyb20gdGhlIHNwZWNpZmllZCBtZXNzYWdlLgotICAgKi8KLSAgc3RhdGljIHB1YmxpYyBQYXJ0IGdldFBhcnQoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgcGFydCkKLSAgewotICAgIFBhcnQgbWVzUGFydCA9IG51bGw7Ci0gICAgaWYgKHBhcnQgPT0gbnVsbCkKLSAgICAgIG1lc1BhcnQgPSAoUGFydCkgbWVzc2FnZS5nZXRPcmRlcmVkUGFydHMobnVsbCkuZ2V0KDApOwotICAgIGVsc2UKLSAgICAgIG1lc1BhcnQgPSBtZXNzYWdlLmdldFBhcnQocGFydCk7Ci0gICAgcmV0dXJuIG1lc1BhcnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1dTSVByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1dTSVByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI1NzcxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9XU0lQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIFdTSSBwcm9wZXJ0aWVzIGNhbiBiZSBkZWZpbmVkIGluIG9uZSBvZiB0aHJlZSBsb2NhdGlvbnMuICAKLSAqCi0gKiAgIDEuIFRoZSB3c2kucHJvcGVydGllcyBmaWxlIHdoaWNoIGNhbiBiZSBsb2NhdGVkIGFueXdoZXJlIGluIHRoZSBjbGFzc3BhdGguCi0gKiAgIDIuIFRoZSBzeXN0ZW0gcHJvcGVydHkgc2V0dGluZ3MuCi0gKiAgIDMuIFRoZSB0aHJlYWQgbG9jYWwgcHJvcGVydHkgc2V0dGluZ3MuCi0gKiAKLSAqIFRoZSBwcm9wZXJ0aWVzIGFyZSBzZXQgYmFzZWQgb24gdGhpcyBvcmRlcmluZy4gIEZvciBleGFtcGxlLCB0aGUgcHJvcGVydGllcyAKLSAqIGZyb20gdGhlIHdzaS5wcm9wZXJ0aWVzIGZpbGUgd2lsbCBiZSByZXBsYWNlZCBieSBwcm9wZXJ0aWVzIGZyb20gdGhlIHN5c3RlbSAKLSAqIHByb3BlcnR5IHNldHRpbmdzLCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB0aHJlYWQgbG9jYWwgcHJvcGVydHkgc2V0dGluZ3MuCi0gKgotICogVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgY2FuIGJlCi0gKiBzcGVjaWZpZWQgYXMgc3lzdGVtIHByb3BlcnRpZXMgb3IgYXMgcHJvcGVydGllcyB0aGF0IGFyZSBzZXQgaW4gYSB0aHJlYWQgCi0gKiBsb2NhbCB2YXJpYWJsZS4gIFN5c3RlbSBwcm9wZXJ0aWVzIHNob3VsZCBiZSB1c2VkIGlmIG9ubHkgb25lIGltcGxlbWVudGF0aW9uCi0gKiBpcyBuZWVkZWQgcGVyIEpWTS4gIElmIHR3byBvciBtb3JlIGltcGxlbWVudGF0aW9ucyBhcmUgbmVlZGVkIHBlciBKVk0sIHRoZW4KLSAqIHRoZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzZXQgdXNpbmcgdGhlIHRocmVhZCBsb2NhbCB2YXJpYWJsZS4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvcjogUGV0ZXIgQnJpdHRlbmhhbQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NJUHJvcGVydGllcwotewotICAvKioKLSAgICogUHJvcGVydGllcyBvYmplY3QuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIFByb3BlcnRpZXMgd3NpUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgUHJvZmlsZVZhbGlkYXRvckZhY3RvcnkgY2xhc3MgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9WQUxJREFUT1JfRkFDVE9SWSA9Ci0gICAgIm9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLlByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5SW1wbCI7Ci0KLSAgLyoqCi0gICAqIFByb3BlcnR5IHRoYXQgY29udGFpbnMgUHJvZmlsZVZhbGlkYXRvckZhY3RvcnkgY2xhc3MgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVkFMSURBVE9SX0ZBQ1RPUlkgPQotICAgICJ3c2kucHJvZmlsZS52YWxpZGF0b3IuZmFjdG9yeSI7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgZG9jdW1lbnQgZmFjdG9yeSBjbGFzcyBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGX0RPQ1VNRU5UX0ZBQ1RPUlkgPQotICAgICJvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuaW1wbC5Eb2N1bWVudEZhY3RvcnlJbXBsIjsKLQotICAvKioKLSAgICogUHJvcGVydHkgdGhhdCBjb250YWlucyBkb2N1bWVudCBmYWN0b3J5IGNsYXNzIG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0RPQ1VNRU5UX0ZBQ1RPUlkgPSAid3NpLmRvY3VtZW50LmZhY3RvcnkiOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IEpBWFAgWE1MIHBhcnNlciBkb2N1bWVudCBmYWN0b3J5IGJ1aWxkZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZfSkFYUF9ET0NVTUVOVF9GQUNUT1JZID0KLSAgICAib3JnLmFwYWNoZS54ZXJjZXMuamF4cC5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5SW1wbCI7Ci0KLSAgLyoqCi0gICAqIFByb3BlcnR5IHRoYXQgY29udGFpbnMgSkFYUCBYTUwgcGFyc2VyIGRvY3VtZW50IGZhY3RvcnkgYnVpbGRlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSkFYUF9ET0NVTUVOVF9GQUNUT1JZID0KLSAgICAiamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSI7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgV1NETCBzY2hlbWEgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZfV1NETF9TQ0hFTUEgPSAiY29tbW9uL3NjaGVtYXMvd3NkbDExLnhzZCI7Ci0KLSAgLyoqCi0gICAqIFByb3BlcnR5IHRoYXQgY29udGFpbnMgV1NETCBzY2hlbWEgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1dTRExfU0NIRU1BID0gIndzaS5hbmFseXplci53c2RsLnNjaGVtYSI7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgV1NETCBTT0FQIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9XU0RMX1NPQVBfU0NIRU1BID0KLSAgICAiY29tbW9uL3NjaGVtYXMvd3NkbHNvYXAueHNkIjsKLQotICAvKioKLSAgICogUHJvcGVydHkgdGhhdCBjb250YWlucyBXU0RMIFNPQVAgc2NoZW1hIGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9XU0RMX1NPQVBfU0NIRU1BID0KLSAgICAid3NpLmFuYWx5emVyLndzZGxzb2FwLnNjaGVtYSI7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgV1NETCBNSU1FIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9XU0RMX01JTUVfU0NIRU1BID0KLSAgICAiY29tbW9uL3NjaGVtYXMvd3NkbE1pbWUueHNkIjsKLQotICAvKioKLSAgICogUHJvcGVydHkgdGhhdCBjb250YWlucyBXU0RMIFNPQVAgc2NoZW1hIGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9XU0RMX01JTUVfU0NIRU1BID0KLSAgICAid3NpLmFuYWx5emVyLndzZGxtaW1lLnNjaGVtYSI7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgU09BUCBzY2hlbWEgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZfU09BUF9TQ0hFTUEgPQotICAgICJjb21tb24vc2NoZW1hcy9zb2FwRW52ZWxvcGUueHNkIjsKLQotICAvKioKLSAgICogUHJvcGVydHkgdGhhdCBjb250YWlucyBTT0FQIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU09BUF9TQ0hFTUEgPSAid3NpLmFuYWx5emVyLnNvYXAuc2NoZW1hIjsKLQotICAvKioKLSAgICogRGVmYXVsdCBTT0FQIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9YTUxfU0NIRU1BID0gImNvbW1vbi9zY2hlbWFzL1hNTFNjaGVtYS54c2QiOwotCi0gIC8qKgotICAgKiBQcm9wZXJ0eSB0aGF0IGNvbnRhaW5zIFNPQVAgc2NoZW1hIGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9YTUxfU0NIRU1BID0gIndzaS5hbmFseXplci54bWxzY2hlbWEuc2NoZW1hIjsKLQotICAvKioKLSAgICogUHJvcGVydHkgd2hpY2ggY29udGFpbnMgV1NJX0hPTUUgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1dTSV9IT01FID0gIndzaS5ob21lIjsKLQotICAvKioKLSAgICogUHJvcGVydHkgZmlsZSBuYW1lLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9GSUxFTkFNRSA9ICJvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC53c2kiOwotCi0gIC8qKgotICAqIFRocmVhZCBsb2NhbCB2YXJpYWJsZS4KLSAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgdGhyZWFkTG9jYWwgPSBuZXcgVGhyZWFkTG9jYWwoKTsKLQotICAvLyBMb2FkIHByb2ZpbGVzIGZpbGUKLSAgc3RhdGljIHsKLSAgICBsb2FkUHJvcGVydGllc0ZpbGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBMb2FkIHByb3BlcnRpZXMgZnJvbSB3c2kucHJvcGVydGllcyBmaWxlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkUHJvcGVydGllc0ZpbGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gVHJ5IHRvIGxvYWQgcHJvcGVydGllcyBmcm9tIHdzaS5wcm9wZXJ0aWVzCi0gICAgICAvL0lucHV0U3RyZWFtIGlzID0gVXRpbHMuZ2V0SW5wdXRTdHJlYW0oUFJPUF9GSUxFTkFNRSk7Ci0KLSAgICAgIC8vIExvYWQgcHJvcGVydGllcyBmcm9tIGZpbGUKLSAgICAgIC8vd3NpUHJvcGVydGllc0ZpbGUubG9hZChpcyk7Ci0KLSAgICAgIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFBST1BfRklMRU5BTUUpOwotCi0gICAgICBTdHJpbmcgbmV4dEtleTsKLSAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcmVzb3VyY2VCdW5kbGUuZ2V0S2V5cygpOwotICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBuZXh0S2V5ID0gKFN0cmluZykgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgd3NpUHJvcGVydGllcy5wdXQobmV4dEtleSwgcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKG5leHRLZXkpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkKLSAgICB7Ci0gICAgICAvLyBERUJVRzoKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICAgIldBUk5JTkc6ICBDb3VsZCBub3QgcmVhZCAiCi0gICAgICAgICAgKyBQUk9QX0ZJTEVOQU1FCi0gICAgICAgICAgKyAiLiAgIgotICAgICAgICAgICsgIlZlcmlmeSB0aGF0IGl0IGlzIGluIHRoZSBDTEFTU1BBVEguIik7Ci0KLSAgICAgIC8vIFNldCB1cCBkZWZhdWx0IHZhbHVlcwotICAgICAgd3NpUHJvcGVydGllcy5wdXQoUFJPUF9WQUxJREFUT1JfRkFDVE9SWSwgREVGX1ZBTElEQVRPUl9GQUNUT1JZKTsKLSAgICAgIHdzaVByb3BlcnRpZXMucHV0KFBST1BfRE9DVU1FTlRfRkFDVE9SWSwgREVGX0RPQ1VNRU5UX0ZBQ1RPUlkpOwotICAgICAgd3NpUHJvcGVydGllcy5wdXQoUFJPUF9KQVhQX0RPQ1VNRU5UX0ZBQ1RPUlksIERFRl9KQVhQX0RPQ1VNRU5UX0ZBQ1RPUlkpOwotICAgICAgd3NpUHJvcGVydGllcy5wdXQoCi0gICAgICAgIFRyYW5zcG9ydEZhY3RvcnkuUFJPUEVSVFlfTkFNRSwKLSAgICAgICAgIm9yZy51ZGRpNGoudHJhbnNwb3J0LkFwYWNoZUF4aXNUcmFuc3BvcnQiKTsKLSAgICB9Ci0gIH0KLQotICAvKiogCi0gICAqIERvIG5vdCBhbGxvdyB0aGlzIG9iamVjdCB0byBiZSBpbnN0YW50aWF0ZWQuCi0gICAqLwotICBwcml2YXRlIFdTSVByb3BlcnRpZXMoKQotICB7Ci0gIH0KLQotICAvKiogCi0gICAgKiBHZXQgcHJvcGVydGllcyB0aGF0IHdlcmUgc2V0IGZvciB0aGlzIHRocmVhZCBvbmx5LgotICAgICogQHJldHVybiB0aGUgcHJvcGVydGllcyB0aGF0IHdlcmUgc2V0IGZvciB0aGlzIHRocmVhZCBvbmx5LgotICAgICoKLSAgICAqIEBzZWUgI3NldFRocmVhZExvY2FsUHJvcGVydGllcwotICAgICovCi0gIHB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBnZXRUaHJlYWRMb2NhbFByb3BlcnRpZXMoKQotICB7Ci0gICAgLy8gUmV0dXJuIHByb3BlcnRpZXMKLSAgICByZXR1cm4gKFByb3BlcnRpZXMpIHRocmVhZExvY2FsLmdldCgpOwotICB9Ci0KLSAgLyoqIAotICAgKiBTZXQgcHJvcGVydGllcyBmb3IgdGhpcyB0aHJlYWQgb25seS4KLSAgICogQHBhcmFtIHByb3BzICBhIFByb3BlcnRpZXMgb2JqZWN0LgotICAgKgotICAgKiBAc2VlICNnZXRUaHJlYWRMb2NhbFByb3BlcnRpZXMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUaHJlYWRMb2NhbFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wcykKLSAgewotICAgIC8vIFNhdmUgdGhlIHByb3BlcnRpZXMgYXMgdGhyZWFkIGxvY2FsIHZhcmlhYmxlcwotICAgIHRocmVhZExvY2FsLnNldChwcm9wcyk7Ci0gIH0KLQotICAvKiogCi0gICAqIEdldCB0aGUgcHJvcGVydHkgdmFsdWUgZ2l2ZW4gdGhlIHByb3BlcnR5IG5hbWUuCi0gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIGEgcHJvcGVydHkgbmFtZS4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZS4gSWYgbm90IGZvdW5kIHJldHVybiBudWxsLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gbnVsbDsKLSAgICBQcm9wZXJ0aWVzIHRocmVhZExvY2FsUHJvcHMgPSBudWxsOwotCi0gICAgLy8gMS4gTG9vayBpbiB0aHJlYWQgbG9jYWwgcHJvcGVydGllcyBmaXJzdAotICAgIGlmICgodGhyZWFkTG9jYWxQcm9wcyA9IGdldFRocmVhZExvY2FsUHJvcGVydGllcygpKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VmFsdWUgPSB0aHJlYWRMb2NhbFByb3BzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgfQotCi0gICAgLy8gMi4gTmV4dCBsb29rIGluIHN5c3RlbSBwcm9wZXJ0aWVzIAotICAgIGlmIChwcm9wZXJ0eVZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlWYWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8vIDMuIExhc3QgbG9vayBpbiB0aGUgcHJvcGVydGllcyBmaWxlCi0gICAgaWYgKHByb3BlcnR5VmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVZhbHVlID0gd3NpUHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBwcm9wZXJ0eSB2YWx1ZQotICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlOwotICB9Ci0KLSAgLyoqIAotICAgKiBHZXQgdGhlIHByb3BlcnR5IHZhbHVlIGdpdmVuIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICBhIHByb3BlcnR5IG5hbWUuCi0gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LgotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHZhbHVlLiBJZiBub3QgZm91bmQgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkKLSAgewotICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gbnVsbDsKLQotICAgIC8vIElmIHRoZSBwcm9wZXJ0eVZhbHVlIHdhcyBub3QgZm91bmQsIHRoZW4gcmV0dXJuIGRlZmF1bHQgdmFsdWUKLSAgICBpZiAoKHByb3BlcnR5VmFsdWUgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIHByb3BlcnR5IHZhbHVlCi0gICAgcmV0dXJuIHByb3BlcnR5VmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byB1bml0IHRlc3QgdGhpcyBjbGFzcy4KLSAgICogQHBhcmFtIGFyZ3MgIHRoZSBhcmd1bWVudHMgZm9yIG1haW4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gU2V0IHByb3BlcnR5IGZvciB0aGlzIHRocmVhZAotICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICBwcm9wcy5zZXRQcm9wZXJ0eShQUk9QX1ZBTElEQVRPUl9GQUNUT1JZLCAibWFpbiIpOwotICAgICAgV1NJUHJvcGVydGllcy5zZXRUaHJlYWRMb2NhbFByb3BlcnRpZXMocHJvcHMpOwotCi0gICAgICAvLyBTdGFydCBmb3VyIHRocmVhZHMgdG8gdmVyaWZ5IHRoYXQgdGhlIG11bHRpdGhyZWFkZWQgdXNlIG9mIHRyZWFkIGxvY2FsIHZhcnMgd29ya3MKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQotICAgICAgewotICAgICAgICAvLyBDcmVhdGUgbmV3IHRocmVhZAotICAgICAgICAgKG5ldyBUaHJlYWQobmV3IFRocmVhZFRlc3QoInRlc3QiICsgaSkpKS5zdGFydCgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU2xlZXAKLSAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwKTsKLQotICAgICAgICAgIC8vIERpc3BsYXkgcHJvcGVydGllcywgd2hpY2ggc2hvdWxkIGJlIG1haW4KLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAiUFJPUF9WQUxJREFUT1JfRkFDVE9SWTogICIKLSAgICAgICAgICAgICAgKyBXU0lQcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1BfVkFMSURBVE9SX0ZBQ1RPUlkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIElubmVyIGNsYXNzIHVzZWQgZm9yIHVuaXQgdGVzdC4KLSAgICovCi0gIHN0YXRpYyBwcml2YXRlIGNsYXNzIFRocmVhZFRlc3QgZXh0ZW5kcyBUaHJlYWQKLSAgewotICAgIFN0cmluZyBuYW1lOwotCi0gICAgVGhyZWFkVGVzdChTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICBwcm9wcy5zZXRQcm9wZXJ0eShQUk9QX1ZBTElEQVRPUl9GQUNUT1JZLCBuYW1lKTsKLSAgICAgIFdTSVByb3BlcnRpZXMuc2V0VGhyZWFkTG9jYWxQcm9wZXJ0aWVzKHByb3BzKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgIlBST1BfVkFMSURBVE9SX0ZBQ1RPUlk6ICAiCi0gICAgICAgICAgKyBXU0lQcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1BfVkFMSURBVE9SX0ZBQ1RPUlkpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1hNTEluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1hNTEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyMTE5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9YTUxJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIC4uLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTEluZm8KLXsKLSAgLyoqCi0gICAqIEdldCBhZGR0aW9uYWwgdG9vbCBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbiBhcyBhbiBYTUwgc3RyaW5nLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSBhIG5hbWVzcGFjZSBwcmVmaXguCi0gICAqIEByZXR1cm4gYWRkdGlvbmFsIHRvb2wgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24gYXMgYW4gWE1MIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvd3NpLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC93c2kucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZTJlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC93c2kucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMgLyoqCi0jICAqIDxjb3B5cmlnaHQ+Ci0jICAqCi0jICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzICBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgKiA8L2NvcHlyaWdodD4KLSMgICovCi0jCi0jIFByb3BlcnR5IGZpbGUgdXNlZCB0byBzZXQgcGFyYW1ldGVycyBmb3IgQ29uZm9ybWFuY2UgVG9vbHMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEb2N1bWVudCBmYWN0b3J5LgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotd3NpLmRvY3VtZW50LmZhY3Rvcnk9b3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LmltcGwuRG9jdW1lbnRGYWN0b3J5SW1wbAotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFByb2ZpbGUgdmFsaWRhdGlvbiBmYWN0b3J5LgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotd3NpLnByb2ZpbGUudmFsaWRhdG9yLmZhY3Rvcnk9b3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuUHJvZmlsZVZhbGlkYXRvckZhY3RvcnlJbXBsCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUmVmZXJlbmNlIHRvIEpBWFAgZG9jdW1lbnQgYnVpbGRlcgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeT1vcmcuYXBhY2hlLnhlcmNlcy5qYXhwLkRvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsCi0jamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeT1vcmcuZWNsaXBlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuamF4cC5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5SW1wbAotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRyYW5zcG9ydCBjbGFzcyB1c2VkIGJ5IFVEREk0SgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotb3JnLnVkZGk0ai5UcmFuc3BvcnRDbGFzc05hbWU9b3JnLnVkZGk0ai50cmFuc3BvcnQuQXBhY2hlQXhpc1RyYW5zcG9ydAotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTG9jYXRpb24gb2YgWE1MIHNjaGVtYSBkb2N1bWVudHMgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbiBkaXJlY3RvcnkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXdzaS5hbmFseXplci54bWxzY2hlbWEuc2NoZW1hPWNvbW1vbi9zY2hlbWFzL1hNTFNjaGVtYS54c2QKLXdzaS5hbmFseXplci5zb2FwLnNjaGVtYT1jb21tb24vc2NoZW1hcy9zb2FwRW52ZWxvcGUueHNkCi13c2kuYW5hbHl6ZXIud3NkbC5zY2hlbWE9Y29tbW9uL3NjaGVtYXMvd3NkbDExLnhzZAotd3NpLmFuYWx5emVyLndzZGxzb2FwLnNjaGVtYT1jb21tb24vc2NoZW1hcy93c2RsU29hcC54c2QKLXdzaS5hbmFseXplci53c2RsbWltZS5zY2hlbWE9Y29tbW9uL3NjaGVtYXMvd3NkbE1pbWUueHNkCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC9XU0RMRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL1dTRExEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODQ1Mjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL1dTRExEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwueHNkLklubGluZVNjaGVtYVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFRhZ3M7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGludGVyZmFjZSB0byBhIHNpbmdsZSBXU0RMIGRvY3VtZW50LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgV1NETERvY3VtZW50Ci17Ci0gIC8qKgotICAgKiBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIERlZmluaXRpb24gZWxlbWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb25zID0gbnVsbDsKLQotICAvKioKLSAgICogV1NETCBlbGVtZW50IGxpc3Qgd2l0aCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KLSAgICovCi0gIHByb3RlY3RlZCBXU0RMRWxlbWVudExpc3Qgd3NkbEVsZW1lbnRMaXN0ID0gbnVsbDsKLQotICAvKioKLSAgICogTWFwIG9mIHRhcmdldE5hbWVzcGFjZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbCBvZiBzY2hlbWEgZWxlbWVudHMuCi0gICAqLwotICBwcml2YXRlIE1hcCBzY2hlbWFzID0gbmV3IEhhc2hNYXAoKTsKLQotICAvKioKLSAgICogTGlzdCBvZiBzY2hlbWFzIHZhbGlkYXRpb24gZXJyb3JzLgotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IHNjaGVtYXNWYWxpZGF0aW9uRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIC8qKgotICAgKiBSZWFkIFdTREwgZG9jdW1lbnQgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUuCi0gICAqIEBwYXJhbSBmaWxlTmFtZSBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24gaWYgcHJvYmxlbSByZWFkaW5nIFdTREwgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLSAgICBDbGFzc0xvYWRlciBjdXJyZW50TG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsgICAKLQotICAgIHRyeQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihXU0RMRG9jdW1lbnQuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7ICAgIAotCi0gICAgICAvLyBHZXQgdGhlIFdTRExSZWFkZXIKLSAgICAgIFdTRExSZWFkZXIgd3NkbFJlYWRlciA9IG5ldyBXU0RMUmVhZGVySW1wbCgpOwotCi0gICAgICAvLyBTZXQgZmVhdHVyZXMKLSAgICAgIHdzZGxSZWFkZXIuc2V0RmVhdHVyZShjb20uaWJtLndzZGwuQ29uc3RhbnRzLkZFQVRVUkVfVkVSQk9TRSwgZmFsc2UpOwotICAgICAgLy8gREVCVUc6Ci0gICAgICAvL3dzZGxSZWFkZXIuc2V0RmVhdHVyZShjb20uaWJtLndzZGwuQ29uc3RhbnRzLkZFQVRVUkVfVkVSQk9TRSwgdHJ1ZSk7Ci0gICAgICB3c2RsUmVhZGVyLnNldEZlYXR1cmUoCi0gICAgICAgIGNvbS5pYm0ud3NkbC5Db25zdGFudHMuRkVBVFVSRV9JTVBPUlRfRE9DVU1FTlRTLAotICAgICAgICB0cnVlKTsKLSAgICAgIC8vIERFQlVHOgotICAgICAgLy93c2RsUmVhZGVyLnNldEZlYXR1cmUoY29tLmlibS53c2RsLkNvbnN0YW50cy5GRUFUVVJFX0lNUE9SVF9ET0NVTUVOVFMsdHJ1ZSk7Ci0KLSAgICAgIC8vIFBhcnNlIHRoZSBXU0RMIGRvY3VtZW50Ci0gICAgICB0aGlzLmRlZmluaXRpb25zID0gd3NkbFJlYWRlci5yZWFkV1NETChudWxsLCBmaWxlTmFtZSk7Ci0KLSAgICAgIC8vIFNpbmNlIGlubGluZSBzY2hlbWEgdmFsaWRhdG9yIGlzIHVzZWQgYnkgc2V2ZXJhbCBhc3NlcnRpb25zLCB2YWxpZGF0ZSBhbGwKLSAgICAgIC8vIHNjaGVtYXMgcmlnaHQgYWZ0ZXIgV1NETCB2YWxpZGF0aW9uCi0gICAgICB2YWxpZGF0ZVNjaGVtYXMoKTsKLQotICAgICAgLy8gR2V0IHRoZSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVyIHJlZmVyZW5jZXMKLSAgICAgIHRoaXMud3NkbEVsZW1lbnRMaXN0ID0gKChXU0RMUmVhZGVySW1wbCkgd3NkbFJlYWRlcikuZ2V0RWxlbWVudExpc3QoKTsKLQotICAgICAgLy8gREVCVUc6Ci0gICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbih3c2RsRWxlbWVudExpc3QudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKQotICAgIHsKLSAgICAgIC8vIFNldCBlbGVtZW50IGxpc3QgdG8gbnVsbAotICAgICAgdGhpcy53c2RsRWxlbWVudExpc3QgPSBudWxsOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgeyAKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGN1cnJlbnRMb2FkZXIpOwotICAgIH0gICAgCi0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIFdTREwgZG9jdW1lbnQgZnJvbSBleGlzdGluZyBEZWZpbml0aW9uIG9iamVjdC4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlTmFtZSBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAcGFyYW0gZGVmaW5pdGlvbnMgRGVmaW5pdGlvbiBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50KFN0cmluZyBmaWxlTmFtZSwgRGVmaW5pdGlvbiBkZWZpbml0aW9ucykKLSAgewotICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLSAgICB0aGlzLmRlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7Ci0gICAgc2NoZW1hcy5jbGVhcigpOwotICAgIHNjaGVtYXNWYWxpZGF0aW9uRXJyb3JzLmNsZWFyKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIGhlIFdTREwgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIC8vIFJldHVybiB0aGUgZG9jdW1lbnQgbG9jYXRpb24KLSAgICByZXR1cm4gdGhpcy5maWxlTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGRlZmluaXRpb24gZWxlbWVudCBvZiB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbiBlbGVtZW50Ci0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9ucygpCi0gIHsKLSAgICAvLyBSZXR1cm4gdGhlIGRlZmluaXRpb24gZWxlbWVudAotICAgIHJldHVybiBkZWZpbml0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYWxsIHRoZSBwb3J0VHlwZSBlbGVtZW50cyBmcm9tIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHBvcnRUeXBlIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIFBvcnRUeXBlW10gZ2V0UG9ydFR5cGVzKCkKLSAgewotICAgIC8vIEdlbmVyYXRlIGFuIGFycmF5IG9mIFBvcnRUeXBlcyBmcm9tIHRoZSBQb3J0VHlwZSBtYXAgZm9yIHRoaXMgRGVmaW5pdGlvbgotICAgIHJldHVybiAoUG9ydFR5cGVbXSkgZGVmaW5pdGlvbnMuZ2V0UG9ydFR5cGVzKCkudmFsdWVzKCkudG9BcnJheSgKLSAgICAgIG5ldyBQb3J0VHlwZVswXSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGFsbCB0aGUgYmluZGluZyBlbGVtZW50cyBmcm9tIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGJpbmRpbmcgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgQmluZGluZ1tdIGdldEJpbmRpbmdzKCkKLSAgewotICAgIC8vIEdlbmVyYXRlIGFuIGFycmF5IG9mIEJpbmRpbmdzIGZyb20gdGhlIEJpbmRpbmcgbWFwIGZvciB0aGlzIERlZmluaXRpb24KLSAgICByZXR1cm4gKEJpbmRpbmdbXSkgZGVmaW5pdGlvbnMuZ2V0QmluZGluZ3MoKS52YWx1ZXMoKS50b0FycmF5KAotICAgICAgbmV3IEJpbmRpbmdbMF0pOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhbGwgdGhlIHNlcnZpY2UgZWxlbWVudHMgZnJvbSB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBzZXJ2aWNlIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIFNlcnZpY2VbXSBnZXRTZXJ2aWNlcygpCi0gIHsKLSAgICAvLyBHZW5lcmF0ZSBhbiBhcnJheSBvZiBTZXJ2aWNlcyBmcm9tIHRoZSBTZXJ2aWNlIG1hcCBmb3IgdGhpcyBEZWZpbml0aW9uCi0gICAgcmV0dXJuIChTZXJ2aWNlW10pIGRlZmluaXRpb25zLmdldFNlcnZpY2VzKCkudmFsdWVzKCkudG9BcnJheSgKLSAgICAgIG5ldyBTZXJ2aWNlWzBdKTsKLSAgfQotCi0gIC8qIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIC8vIFJldHVybiBzdHJpbmcKLSAgICByZXR1cm4gKGRlZmluaXRpb25zID09IG51bGwpCi0gICAgICA/ICJXU0RMIGRlZmluaXRpb24gZWxlbWVudCBub3QgZm91bmQuIgotICAgICAgOiBkZWZpbml0aW9ucy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZWxlbWVudCBsaXN0LgotICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGxpc3QuCi0gICAqLwotICBwdWJsaWMgV1NETEVsZW1lbnRMaXN0IGdldEVsZW1lbnRMaXN0KCkKLSAgewotICAgIHJldHVybiB0aGlzLndzZGxFbGVtZW50TGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc2NoZW1hcyBtYXAuCi0gICAqIEByZXR1cm4gYSBtYXAgb2YgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZSB2YWx1ZXMgb2YgdGhlIHNjaGVtYSBlbGVtZW50cwotICAgKiB0byB0aGUgY29ycmVzcG9uZGluZyBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsIG9iamVjdCBvZiB0aGF0IHNjaGVtYS4KLSAgICovCi0gIHB1YmxpYyBNYXAgZ2V0U2NoZW1hcygpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBzY2hlbWFzIHZhbGlkYXRpb24gZXJyb3JzIGNhdXNlZCBieSB0aGUgdmFsaWRhdGVTY2hlbWFzKCkgcHJvY2VkdXJlLgotICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBzY2hlbWFzIHZhbGlkYXRpb24gZXJyb3JzLgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0U2NoZW1hc1ZhbGlkYXRpb25FcnJvcnMoKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtYXNWYWxpZGF0aW9uRXJyb3JzOyAKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGludm9rZXMgdGhlIGlubGluZSBzY2hlbWEgdmFsaWRhdG9yIHdoaWNoIHZhbGlkYXRlcyBldmVyeSBzY2hlbWEgZWxlbWVudCBvZiB0aGUgV1NETC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVNjaGVtYXMoKQotICB7Ci0gICAgc2NoZW1hcy5jbGVhcigpOwotICAgIHNjaGVtYXNWYWxpZGF0aW9uRXJyb3JzLmNsZWFyKCk7Ci0KLSAgICAvKiBJTkxJTkUgU0NIRU1BIFZBTElEQVRPUiAqLwotICAgIGlmIChkZWZpbml0aW9ucyAhPSBudWxsCi0gICAgICAmJiBkZWZpbml0aW9ucy5nZXRUeXBlcygpICE9IG51bGwKLSAgICAgICYmIGRlZmluaXRpb25zLmdldFR5cGVzKCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJbmxpbmVTY2hlbWFWYWxpZGF0b3Igc2NoZW1hVmFsaWRhdG9yID0gbmV3IElubGluZVNjaGVtYVZhbGlkYXRvcigpOwotCi0gICAgICAvLyBDb2xsZWN0aW5nIHNjaGVtYSdzIHBhcmVudCBlbGVtZW50cwotICAgICAgTGlzdCBwYXJlbnRzID0gbmV3IEFycmF5TGlzdCgyKTsKLSAgICAgIHBhcmVudHMuYWRkKGRlZmluaXRpb25zLmdldFR5cGVzKCkpOwotICAgICAgcGFyZW50cy5hZGQoZGVmaW5pdGlvbnMpOwotICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIEV4dGVuc2liaWxpdHlFbGVtZW50UyBvZiB3c2RsOnR5cGVzCi0gICAgICAvLyBzaW5jZSB0aGV5IGFyZSBwb3RlbnRpYWwgc2NoZW1hcwotICAgICAgLy8gU2VlIEphdmEgQVBJcyBmb3IgV1NETCBWMS4wIChKU1IxMTApLCBzZWN0aW9uIDQKLSAgICAgIEl0ZXJhdG9yIGkgPSB0aGlzLmRlZmluaXRpb25zLmdldFR5cGVzKCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWwgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGkubmV4dCgpOwotICAgICAgICBpZiAoZXh0RWwuZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoWE1MVGFncy5FTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICB7Ci0gICAgICAgICAgTWFwIG1hcCA9IG51bGw7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgLy8gVmFsaWRhdGluZyBzY2hlbWEgZWxlbWVudAotICAgICAgICAgICAgbWFwID0gc2NoZW1hVmFsaWRhdG9yLnZhbGlkYXRlKGV4dEVsLCBwYXJlbnRzLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBZGRpbmcgYW4gZXhjZXB0aW9uIHRvIHRoZSBlcnJvcnMgbGlzdAotICAgICAgICAgICAgc2NoZW1hc1ZhbGlkYXRpb25FcnJvcnMuYWRkKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAobWFwICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gQWRkaW5nIHJldHVybmVkIFhTTW9kZWwgdG8gc2NoZW1hcyBtYXAKLSAgICAgICAgICAgIHNjaGVtYXMucHV0QWxsKG1hcCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotCi0gIC8qKgotICAgKiBDb21tYW5kIGxpbmUgaW50ZXJmYWNlLgotICAgKiBAcGFyYW0gYXJncyBmcm9tIGNvbW1hbmQgbGluZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50ID0gbmV3IFdTRExEb2N1bWVudChhcmdzWzBdKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih3c2RsRG9jdW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUudG9TdHJpbmcoKTsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotCi0gICAgU3lzdGVtLmV4aXQoMCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL1dTRExFbGVtZW50TGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvV1NETEVsZW1lbnRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYmVkNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvV1NETEVsZW1lbnRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuZG9tLkVsZW1lbnRMb2NhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFpbnRhaW5zIGEgV1NETCBlbGVtZW50IGxpc3QuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRWxlbWVudExpc3QKLXsKLSAgLyoqCi0gICAqIExpc3Qgb2YgV1NETCBlbGVtZW50cyB3aXRoIHRoZWlyIGxvY2F0aW9uLgotICAgKi8KLSAgSGFzaE1hcCB3c2RsRWxlbWVudExpc3QgPSBuZXcgSGFzaE1hcCgpOwotCi0gIC8qKgotICAgKiBXU0RMIGVsZW1lbnQgbG9jYXRvci4KLSAgICovCi0gIHB1YmxpYyBXU0RMRWxlbWVudExpc3QoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGVsZW1lbnQgd2l0aCBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIHdzZGxFbGVtZW50ICAgICAgYSBXU0RMIGVsZW1lbnQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBlbGVtZW50TG9jYXRpb24gIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KE9iamVjdCB3c2RsRWxlbWVudCwgRWxlbWVudExvY2F0aW9uIGVsZW1lbnRMb2NhdGlvbikKLSAgewotICAgIHRoaXMud3NkbEVsZW1lbnRMaXN0LnB1dCh3c2RsRWxlbWVudCwgZWxlbWVudExvY2F0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgZWxlbWVudCBsb2NhdGlvbi4KLSAgICogQHBhcmFtIHdzZGxFbGVtZW50ICBhIFdTREwgZWxlbWVudCBhcnRpZmFjdC4KLSAgICogQHJldHVybiB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIEVsZW1lbnRMb2NhdGlvbiBnZXRFbGVtZW50TG9jYXRpb24oT2JqZWN0IHdzZGxFbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIChFbGVtZW50TG9jYXRpb24pIHRoaXMud3NkbEVsZW1lbnRMaXN0LmdldCh3c2RsRWxlbWVudCk7Ci0gIH0KLQotICAvKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBTdHJpbmcgc3RyaW5nID0gIldTRExFbGVtZW50TGlzdDogXG4iOwotCi0gICAgLy8gR2V0IGxpc3QgZW50cmllcyAodmFsdWVzPykKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMud3NkbEVsZW1lbnRMaXN0LmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAvLyBBZGQgZWFjaCBlbnRyeSBpbiB0aGUgbGlzdCB0byB0aGUgc3RyaW5nCi0gICAgRWxlbWVudExvY2F0aW9uIHdzZGxFbGVtZW50TG9jYXRpb247Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgd3NkbEVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgIGlmICh3c2RsRWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzdHJpbmcgKz0gIiAgIiArIHdzZGxFbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogIjsKLSAgICAgICAgaWYgKCh3c2RsRWxlbWVudExvY2F0aW9uID0KLSAgICAgICAgICAoRWxlbWVudExvY2F0aW9uKSB3c2RsRWxlbWVudExpc3QuZ2V0KHdzZGxFbGVtZW50KSkKLSAgICAgICAgICA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyaW5nICs9ICJudWxsXG4iOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3RyaW5nICs9ICIgICIKLSAgICAgICAgICAgICsgd3NkbEVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICsgIjogIgotICAgICAgICAgICAgKyB3c2RsRWxlbWVudExvY2F0aW9uLmdldExpbmVOdW1iZXIoKQotICAgICAgICAgICAgKyAiLCAiCi0gICAgICAgICAgICArIHdzZGxFbGVtZW50TG9jYXRpb24uZ2V0Q29sdW1uTnVtYmVyKCkKLSAgICAgICAgICAgICsgIlxuIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzdHJpbmc7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL1dTRExSZWFkZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC9XU0RMUmVhZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2JjMWZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL1dTRExSZWFkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5kb20uRWxlbWVudExvY2F0aW9uOwotCi1pbXBvcnQgY29tLmlibS53c2RsLio7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLio7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLWltcG9ydCBqYXZheC53c2RsLio7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLio7Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5Lio7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzcGVjaWFsaXphdGlvbiBvZiBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsIGluIFdTREw0Si4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFdTRExSZWFkZXJJbXBsIGV4dGVuZHMgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbAotewotICAvLyBXU0RMIGVsZW1lbnQgbGlzdC4KLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50TGlzdCB3c2RsRWxlbWVudExpc3QgPSBuZXcgV1NETEVsZW1lbnRMaXN0KCk7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGwjcGFyc2VEZWZpbml0aW9ucyhqYXZhLmxhbmcuU3RyaW5nLCBvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZhLnV0aWwuTWFwKQotICAgKi8KLSAgcHJvdGVjdGVkIERlZmluaXRpb24gcGFyc2VEZWZpbml0aW9ucygKLSAgICBTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLAotICAgIEVsZW1lbnQgZGVmRWwsCi0gICAgTWFwIGltcG9ydGVkRGVmcykKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWYgPQotICAgICAgc3VwZXIucGFyc2VEZWZpbml0aW9ucyhkb2N1bWVudEJhc2VVUkksIGRlZkVsLCBpbXBvcnRlZERlZnMpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KGRlZkVsLCBkZWYpOwotCi0gICAgcmV0dXJuIGRlZjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlSW1wb3J0KG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbiwgamF2YS51dGlsLk1hcCkKLSAgICovCi0gIHByb3RlY3RlZCBJbXBvcnQgcGFyc2VJbXBvcnQoRWxlbWVudCBlbGVtZW50LCBEZWZpbml0aW9uIGRlZmluaXRpb24sIE1hcCBtYXApCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIC8qYm9vbGVhbiB3YXNFeCA9IGZhbHNlOwotICAgIGlmIChkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCkhPW51bGwpewotICAgIAlGaWxlIGYgPSBuZXcgRmlsZShkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgIAlpZiAoZi5nZXRQYXJlbnQoKSE9bnVsbCAmJiBpbXBvcnRFbC5nZXRBdHRyaWJ1dGUoImxvY2F0aW9uIikhPW51bGwpewkJCi0gICAgCSAgIGYgPSBuZXcgRmlsZShmLmdldFBhcmVudCgpKyIvIitpbXBvcnRFbC5nZXRBdHRyaWJ1dGUoImxvY2F0aW9uIikpOwotICAgIAkgICAKLSAgICAJfQotICAgIH0gZWxzZSB3YXNFeCA9IGZhbHNlOwotICAgICAgCi0gICAgSW1wb3J0IGltcG9ydERlZiA9IHN1cGVyLnBhcnNlSW1wb3J0KGltcG9ydEVsLCBkZWYsIGltcG9ydGVkRGVmcyk7Ci0gICAgCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KGltcG9ydEVsLCBpbXBvcnREZWYpOwotICAgIAotICAgIHJldHVybiBpbXBvcnREZWY7Ki8KLQotICAgIC8qSW1wb3J0IGltcG9ydDEgPSBkZWZpbml0aW9uLmNyZWF0ZUltcG9ydCgpOwotICAgIFN0cmluZyBzID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICJuYW1lc3BhY2UiKTsKLSAgICBTdHJpbmcgczEgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgImxvY2F0aW9uIik7Ci0gICAgaWYgKHMgIT0gbnVsbCkKLSAgICAJaW1wb3J0MS5zZXROYW1lc3BhY2VVUkkocyk7Ci0gICAgaWYgKHMxICE9IG51bGwpIHsKLSAgICAJaWYgKGltcG9ydERvY3VtZW50cykgewotICAgIAkJU3RyaW5nIHMyID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLSAgICAJCXRyeSB7Ci0gICAgCi0gICAgCQkJVVJMIHVybDEgPSBzMiA9PSBudWxsID8gbnVsbCA6IFN0cmluZ1V0aWxzLmdldFVSTChudWxsLCBzMik7Ci0gICAgCQkJVVJMIHVybCA9IFN0cmluZ1V0aWxzLmdldFVSTCh1cmwxLCBzMSk7Ci0gICAgCQkJSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0gPQotICAgIAkJCQlTdHJpbmdVdGlscy5nZXRDb250ZW50QXNJbnB1dFN0cmVhbSh1cmwpOwotICAgIAkJCWlucHV0c3RyZWFtLmNsb3NlKCk7Ci0gICAgCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgIAkJCS8vaW1wb3J0MS5zZXRMb2NhdGlvblVSSShudWxsKTsKLSAgICAJCQlhZGRFbGVtZW50VG9MaXN0KGVsZW1lbnQsIGltcG9ydDEpOwotICAgIAkJCXJldHVybiBpbXBvcnQxOwotICAgIAkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0gICAgCQkJdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oCi0gICAgCQkJCSJPVEhFUl9FUlJPUiIsCi0gICAgCQkJCSJVbmFibGUgdG8gcmVzb2x2ZSBpbXBvcnRlZCBkb2N1bWVudCBhdCAnIiArIHMxICsgIicuIiwKLSAgICAJCQkJZXgpOwotICAgIAkJfQotICAgIAotICAgIAl9Ci0gICAgfQotICAgIEltcG9ydCBpbXBvcnREZWYgPSBzdXBlci5wYXJzZUltcG9ydChlbGVtZW50LCBkZWZpbml0aW9uLCBtYXApOwotICAgIGFkZEVsZW1lbnRUb0xpc3QoZWxlbWVudCwgaW1wb3J0RGVmKTsqLwotICAgIEltcG9ydCBpbXBvcnQxID0gZGVmaW5pdGlvbi5jcmVhdGVJbXBvcnQoKTsKLSAgICBTdHJpbmcgcyA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShlbGVtZW50LCAibmFtZXNwYWNlIik7Ci0gICAgU3RyaW5nIHMxID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICJsb2NhdGlvbiIpOwotICAgIGlmIChzICE9IG51bGwpCi0gICAgICBpbXBvcnQxLnNldE5hbWVzcGFjZVVSSShzKTsKLSAgICAvLyBBREQ6IGNoZWNrICJsb2NhdGlvbiIgYXR0cmlidXRlIGZvciBlbXB0eSAKLSAgICAvLyBzdHJpbmcgdG8gcHJldmVudCBzZWxmLWRlZmVuaXRpb24gYXNzaWduaW5nCi0gICAgaWYgKChzMSAhPSBudWxsKSAmJiAoczEubGVuZ3RoKCkgPiAwKSkKLSAgICB7Ci0gICAgICBpbXBvcnQxLnNldExvY2F0aW9uVVJJKHMxKTsKLSAgICAgIGlmIChpbXBvcnREb2N1bWVudHMpCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHMyID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24xID0gbnVsbDsKLSAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRzb3VyY2UgPSBudWxsOwotICAgICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICAgIGlmIChsb2MgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dHNvdXJjZSA9IGxvYy5nZXRJbXBvcnRJbnB1dFNvdXJjZShzMiwgczEpOwotICAgICAgICAgICAgU3RyaW5nIHMzID0gbG9jLmdldExhdGVzdEltcG9ydFVSSSgpOwotICAgICAgICAgICAgZGVmaW5pdGlvbjEgPSAoRGVmaW5pdGlvbikgbWFwLmdldChzMyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBVUkwgdXJsMSA9IHMyID09IG51bGwgPyBudWxsIDogU3RyaW5nVXRpbHMuZ2V0VVJMKG51bGwsIHMyKTsKLSAgICAgICAgICAgIHVybCA9IFN0cmluZ1V0aWxzLmdldFVSTCh1cmwxLCBzMSk7Ci0gICAgICAgICAgICBkZWZpbml0aW9uMSA9IChEZWZpbml0aW9uKSBtYXAuZ2V0KHVybC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9uMSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgaW5wdXRzdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vaW1wb3J0MS5zZXRMb2NhdGlvblVSSShudWxsKTsKLSAgICAgICAgICAgICAgICBhZGRFbGVtZW50VG9MaXN0KGVsZW1lbnQsIGltcG9ydDEpOwotICAgICAgICAgICAgICAgIHJldHVybiBpbXBvcnQxOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChpbnB1dHN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGlucHV0c291cmNlID0gbmV3IElucHV0U291cmNlKGlucHV0c3RyZWFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRlZmluaXRpb24xID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGlucHV0c291cmNlID09IG51bGwpCi0gICAgICAgICAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJPVEhFUl9FUlJPUiIsCi0gICAgICAgICAgICAgICAgIlVuYWJsZSB0byBsb2NhdGUgaW1wb3J0ZWQgZG9jdW1lbnQgYXQgJyIKLSAgICAgICAgICAgICAgICAgICsgczEKLSAgICAgICAgICAgICAgICAgICsgIiciCi0gICAgICAgICAgICAgICAgICArIChzMiAhPSBudWxsID8gIiwgcmVsYXRpdmUgdG8gJyIgKyBzMiArICInLiIgOiAiLiIpKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkb2N1bWVudCA9IGdldERvY3VtZW50KGlucHV0c291cmNlLCBzMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYWRkRWxlbWVudFRvTGlzdChlbGVtZW50LCBpbXBvcnQxKTsKLSAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW5wdXRzdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgaW5wdXRzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudDIgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ERUZJTklUSU9OUywgZWxlbWVudDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAiUmV0cmlldmluZyBkb2N1bWVudCBhdCAnIgotICAgICAgICAgICAgICAgICAgICArIHMxCi0gICAgICAgICAgICAgICAgICAgICsgIiciCi0gICAgICAgICAgICAgICAgICAgICsgKHMyICE9IG51bGwgPyAiLCByZWxhdGl2ZSB0byAnIiArIHMyICsgIicuIiA6ICIuIikpOwotICAgICAgICAgICAgICBTdHJpbmcgczQgPQotICAgICAgICAgICAgICAgIGxvYyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICA/IHVybCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICA/IHMxCi0gICAgICAgICAgICAgICAgICA6IHVybC50b1N0cmluZygpIDogbG9jLmdldExhdGVzdEltcG9ydFVSSSgpOwotICAgICAgICAgICAgICBkZWZpbml0aW9uMSA9IHJlYWRXU0RMKHM0LCBlbGVtZW50MiwgbWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBRTmFtZVV0aWxzLm5ld1FOYW1lKGVsZW1lbnQyKTsKLSAgICAgICAgICAgICAgaWYgKENvbnN0YW50cy5YU0RfUU5BTUVfTElTVC5jb250YWlucyhxbmFtZSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXU0RMRmFjdG9yeSB3c2RsZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICBmYWN0b3J5SW1wbE5hbWUgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICA/IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgOiBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZShmYWN0b3J5SW1wbE5hbWUpOwotICAgICAgICAgICAgICAgIGRlZmluaXRpb24xID0gd3NkbGZhY3RvcnkubmV3RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChleHRSZWcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24xLnNldEV4dGVuc2lvblJlZ2lzdHJ5KGV4dFJlZyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHM1ID0KLSAgICAgICAgICAgICAgICAgIGxvYyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgID8gdXJsID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgPyBzMQotICAgICAgICAgICAgICAgICAgICA6IHVybC50b1N0cmluZygpIDogbG9jLmdldExhdGVzdEltcG9ydFVSSSgpOwotICAgICAgICAgICAgICAgIGRlZmluaXRpb24xLnNldERvY3VtZW50QmFzZVVSSShzNSk7Ci0gICAgICAgICAgICAgICAgLyogRG9uJ3QgYWRkIHR5cGVzIGVsZW1lbnQgc2luY2UgaXQgZG9lc24ndCBleGlzdC4gIEFkZGluZyBpdCBjYXVzZXMgcHJvYmxlbXMKLSAgICAgICAgICAgICAgICAgKiBzaW5jZSBpdCB3aWxsIGFkZCBhIHR5cGVzIGVsZW1lbnQgZm9yIHByb2Nlc3NpbmcgdGhhdCBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgICAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24xLmNyZWF0ZVR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHVua25vd25leHRlbnNpYmlsaXR5ZWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgCW5ldyBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB1bmtub3duZXh0ZW5zaWJpbGl0eWVsZW1lbnQuc2V0RWxlbWVudChlbGVtZW50Mik7Ci0gICAgICAgICAgICAgICAgdHlwZXMuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgCXVua25vd25leHRlbnNpYmlsaXR5ZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbjEuc2V0VHlwZXModHlwZXMpOwotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRlZmluaXRpb24xICE9IG51bGwpCi0gICAgICAgICAgICBpbXBvcnQxLnNldERlZmluaXRpb24oZGVmaW5pdGlvbjEpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIHdzZGxleGNlcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICB3c2RsZXhjZXB0aW9uLnNldExvY2F0aW9uKFhQYXRoVXRpbHMuZ2V0WFBhdGhFeHByRnJvbU5vZGUoZWxlbWVudCkpOwotICAgICAgICAgIHRocm93IHdzZGxleGNlcHRpb247Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aHJvd2FibGUpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbigKLSAgICAgICAgICAgICJPVEhFUl9FUlJPUiIsCi0gICAgICAgICAgICAiVW5hYmxlIHRvIHJlc29sdmUgaW1wb3J0ZWQgZG9jdW1lbnQgYXQgJyIgKyBzMSArICInLiIsCi0gICAgICAgICAgICB0aHJvd2FibGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoRWxlbWVudCBlbGVtZW50MSA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgZWxlbWVudDEgIT0gbnVsbDsKLSAgICAgIGVsZW1lbnQxID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KGVsZW1lbnQxKSkKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCBlbGVtZW50MSkpCi0gICAgICAgIGltcG9ydDEuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZWxlbWVudDEpOwotICAgICAgZWxzZQotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24oZWxlbWVudDEpOwotCi0gICAgcmV0dXJuIGltcG9ydDE7Ci0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlVHlwZXMob3JnLnczYy5kb20uRWxlbWVudCwgamF2YXgud3NkbC5EZWZpbml0aW9uKQotICAgKi8KLSAgcHJvdGVjdGVkIFR5cGVzIHBhcnNlVHlwZXMoRWxlbWVudCB0eXBlc0VsLCBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgVHlwZXMgdHlwZXMgPSBzdXBlci5wYXJzZVR5cGVzKHR5cGVzRWwsIGRlZik7Ci0KLSAgICAvLyBUcnkgdG8gYWRkIGVsZW1lbnQgdG8gbGlzdAotICAgIGFkZEVsZW1lbnRUb0xpc3QodHlwZXNFbCwgdHlwZXMpOwotCi0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGwjcGFyc2VCaW5kaW5nKG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nIHBhcnNlQmluZGluZyhFbGVtZW50IGJpbmRpbmdFbCwgRGVmaW5pdGlvbiBkZWYpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEJpbmRpbmcgYmluZGluZyA9IHN1cGVyLnBhcnNlQmluZGluZyhiaW5kaW5nRWwsIGRlZik7Ci0KLSAgICAvLyBUcnkgdG8gYWRkIGVsZW1lbnQgdG8gbGlzdAotICAgIGFkZEVsZW1lbnRUb0xpc3QoYmluZGluZ0VsLCBiaW5kaW5nKTsKLQotICAgIHJldHVybiBiaW5kaW5nOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGwjcGFyc2VCaW5kaW5nT3BlcmF0aW9uKG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuUG9ydFR5cGUsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nT3BlcmF0aW9uIHBhcnNlQmluZGluZ09wZXJhdGlvbigKLSAgICBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbCwKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSwKLSAgICBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gbnVsbDsKLQotICAgIC8vIFRoZSBmb2xsb3cgdHJ5LWNhdGNoIHdhcyBhZGRlZCB0byBkZXRlY3Qgd2hlbiBhIGR1cGxpY2F0ZSBvcGVyYXRpb24gbmFtZSB3YXMgZGV0ZWN0ZWQKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uID0KLSAgICAgICAgc3VwZXIucGFyc2VCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb25FbCwgcG9ydFR5cGUsIGRlZik7Ci0gICAgfQotCi0gICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpCi0gICAgewotICAgICAgaWYgKGlhZS5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aCgiRHVwbGljYXRlIikpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24gPQotICAgICAgICAgIHBhcnNlQmluZGluZ09wZXJhdGlvbldpdGhEdXBsaWNhdGVOYW1lcygKLSAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb25FbCwKLSAgICAgICAgICAgIHBvcnRUeXBlLAotICAgICAgICAgICAgZGVmKTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aHJvdyBpYWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBpZiAoYmluZGluZ09wZXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkZEVsZW1lbnRUb0xpc3QoYmluZGluZ09wZXJhdGlvbkVsLCBiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlQmluZGluZ0lucHV0KG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nSW5wdXQgcGFyc2VCaW5kaW5nSW5wdXQoCi0gICAgRWxlbWVudCBiaW5kaW5nSW5wdXRFbCwKLSAgICBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IHN1cGVyLnBhcnNlQmluZGluZ0lucHV0KGJpbmRpbmdJbnB1dEVsLCBkZWYpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KGJpbmRpbmdJbnB1dEVsLCBiaW5kaW5nSW5wdXQpOwotCi0gICAgcmV0dXJuIGJpbmRpbmdJbnB1dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlQmluZGluZ091dHB1dChvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ091dHB1dCBwYXJzZUJpbmRpbmdPdXRwdXQoCi0gICAgRWxlbWVudCBiaW5kaW5nT3V0cHV0RWwsCi0gICAgRGVmaW5pdGlvbiBkZWYpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9Ci0gICAgICBzdXBlci5wYXJzZUJpbmRpbmdPdXRwdXQoYmluZGluZ091dHB1dEVsLCBkZWYpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KGJpbmRpbmdPdXRwdXRFbCwgYmluZGluZ091dHB1dCk7Ci0KLSAgICByZXR1cm4gYmluZGluZ091dHB1dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlQmluZGluZ0ZhdWx0KG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nRmF1bHQgcGFyc2VCaW5kaW5nRmF1bHQoCi0gICAgRWxlbWVudCBiaW5kaW5nRmF1bHRFbCwKLSAgICBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IHN1cGVyLnBhcnNlQmluZGluZ0ZhdWx0KGJpbmRpbmdGYXVsdEVsLCBkZWYpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KGJpbmRpbmdGYXVsdEVsLCBiaW5kaW5nRmF1bHQpOwotCi0gICAgcmV0dXJuIGJpbmRpbmdGYXVsdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlTWVzc2FnZShvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgTWVzc2FnZSBwYXJzZU1lc3NhZ2UoRWxlbWVudCBtc2dFbCwgRGVmaW5pdGlvbiBkZWYpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIE1lc3NhZ2UgbXNnID0gc3VwZXIucGFyc2VNZXNzYWdlKG1zZ0VsLCBkZWYpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KG1zZ0VsLCBtc2cpOwotCi0gICAgcmV0dXJuIG1zZzsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlUGFydChvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgUGFydCBwYXJzZVBhcnQoRWxlbWVudCBwYXJ0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgLy9QYXJ0IHBhcnQgPSBzdXBlci5wYXJzZVBhcnQocGFydEVsLCBkZWYpOwotCi0gICAgUGFydCBwYXJ0ID0gZGVmLmNyZWF0ZVBhcnQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShwYXJ0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotCi0gICAgLy8gV1MtSTogVGhlIHRyeS1jYXRjaCB3YXMgYWRkZWQgZm9yIFdTSTI0MTYKLSAgICBRTmFtZSBlbGVtZW50TmFtZTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGVsZW1lbnROYW1lID0KLSAgICAgICAgRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUoCi0gICAgICAgICAgcGFydEVsLAotICAgICAgICAgIENvbnN0YW50cy5BVFRSX0VMRU1FTlQsCi0gICAgICAgICAgQ29uc3RhbnRzLkVMRU1fTUVTU0FHRSwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gd2UpCi0gICAgewotICAgICAgU3RyaW5nIHByZWZpeGVkVmFsdWUgPQotICAgICAgICBET01VdGlscy5nZXRBdHRyaWJ1dGUocGFydEVsLCBDb25zdGFudHMuQVRUUl9FTEVNRU5UKTsKLSAgICAgIGludCBpbmRleCA9IHByZWZpeGVkVmFsdWUuaW5kZXhPZignOicpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IChpbmRleCAhPSAtMSkgPyBwcmVmaXhlZFZhbHVlLnN1YnN0cmluZygwLCBpbmRleCkgOiBudWxsOwotICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHByZWZpeGVkVmFsdWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0KLSAgICAgIGVsZW1lbnROYW1lID0gbmV3IFFOYW1lKGxvY2FsUGFydCk7Ci0gICAgfQotCi0gICAgUU5hbWUgdHlwZU5hbWUgPQotICAgICAgRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUoCi0gICAgICAgIHBhcnRFbCwKLSAgICAgICAgQ29uc3RhbnRzLkFUVFJfVFlQRSwKLSAgICAgICAgQ29uc3RhbnRzLkVMRU1fTUVTU0FHRSwKLSAgICAgICAgZmFsc2UpOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYXJ0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKGVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcGFydC5zZXRFbGVtZW50TmFtZShlbGVtZW50TmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKHR5cGVOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcGFydC5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChwYXJ0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBwYXJ0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIERPTVV0aWxzLnRocm93V1NETEV4Y2VwdGlvbih0ZW1wRWwpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICBNYXAgZXh0ZW5zaW9uQXR0cmlidXRlcyA9IHBhcnQuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpOwotCi0gICAgZXh0ZW5zaW9uQXR0cmlidXRlcy5wdXRBbGwoZ2V0UGFydEF0dHJpYnV0ZXMocGFydEVsLCBkZWYpKTsKLQotICAgIC8vIE5lZWQgdG8gZG8gc29tZXRoaW5nIGhlcmUgdG8gbG9jYXRlIHBhcnQgZGVmaW5pdGlvbi4KLQotICAgIC8vIFRyeSB0byBhZGQgZWxlbWVudCB0byBsaXN0Ci0gICAgYWRkRWxlbWVudFRvTGlzdChwYXJ0RWwsIHBhcnQpOwotCi0gICAgcmV0dXJuIHBhcnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbCNwYXJzZVBvcnRUeXBlKG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBQb3J0VHlwZSBwYXJzZVBvcnRUeXBlKEVsZW1lbnQgcG9ydFR5cGVFbCwgRGVmaW5pdGlvbiBkZWYpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gc3VwZXIucGFyc2VQb3J0VHlwZShwb3J0VHlwZUVsLCBkZWYpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KHBvcnRUeXBlRWwsIHBvcnRUeXBlKTsKLQotICAgIHJldHVybiBwb3J0VHlwZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlT3BlcmF0aW9uKG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuUG9ydFR5cGUsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBPcGVyYXRpb24gcGFyc2VPcGVyYXRpb24oCi0gICAgRWxlbWVudCBvcEVsLAotICAgIFBvcnRUeXBlIHBvcnRUeXBlLAotICAgIERlZmluaXRpb24gZGVmKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBPcGVyYXRpb24gb3AgPSBzdXBlci5wYXJzZU9wZXJhdGlvbihvcEVsLCBwb3J0VHlwZSwgZGVmKTsKLQotICAgIC8vIFRyeSB0byBhZGQgZWxlbWVudCB0byBsaXN0Ci0gICAgYWRkRWxlbWVudFRvTGlzdChvcEVsLCBvcCk7Ci0KLSAgICByZXR1cm4gb3A7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbCNwYXJzZVNlcnZpY2Uob3JnLnczYy5kb20uRWxlbWVudCwgamF2YXgud3NkbC5EZWZpbml0aW9uKQotICAgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2UgcGFyc2VTZXJ2aWNlKEVsZW1lbnQgc2VydmljZUVsLCBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgU2VydmljZSBzZXJ2aWNlID0gc3VwZXIucGFyc2VTZXJ2aWNlKHNlcnZpY2VFbCwgZGVmKTsKLQotICAgIC8vIFRyeSB0byBhZGQgZWxlbWVudCB0byBsaXN0Ci0gICAgYWRkRWxlbWVudFRvTGlzdChzZXJ2aWNlRWwsIHNlcnZpY2UpOwotCi0gICAgcmV0dXJuIHNlcnZpY2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbCNwYXJzZVBvcnQob3JnLnczYy5kb20uRWxlbWVudCwgamF2YXgud3NkbC5EZWZpbml0aW9uKQotICAgKi8KLSAgcHJvdGVjdGVkIFBvcnQgcGFyc2VQb3J0KEVsZW1lbnQgcG9ydEVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIFBvcnQgcG9ydCA9IHN1cGVyLnBhcnNlUG9ydChwb3J0RWwsIGRlZik7Ci0KLSAgICAvLyBUcnkgdG8gYWRkIGVsZW1lbnQgdG8gbGlzdAotICAgIGFkZEVsZW1lbnRUb0xpc3QocG9ydEVsLCBwb3J0KTsKLQotICAgIHJldHVybiBwb3J0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGwjcGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChqYXZhLmxhbmcuQ2xhc3MsIG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBFeHRlbnNpYmlsaXR5RWxlbWVudCBwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KAotICAgIENsYXNzIHBhcmVudFR5cGUsCi0gICAgRWxlbWVudCBlbCwKLSAgICBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCA9Ci0gICAgICBzdXBlci5wYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KHBhcmVudFR5cGUsIGVsLCBkZWYpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KGVsLCBleHRFbGVtZW50KTsKLQotICAgIHJldHVybiBleHRFbGVtZW50OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGwjcGFyc2VJbnB1dChvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgSW5wdXQgcGFyc2VJbnB1dChFbGVtZW50IGlucHV0RWwsIERlZmluaXRpb24gZGVmKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBJbnB1dCBpbnB1dCA9IHN1cGVyLnBhcnNlSW5wdXQoaW5wdXRFbCwgZGVmKTsKLQotICAgIC8vIFRyeSB0byBhZGQgZWxlbWVudCB0byBsaXN0Ci0gICAgYWRkRWxlbWVudFRvTGlzdChpbnB1dEVsLCBpbnB1dCk7Ci0KLSAgICByZXR1cm4gaW5wdXQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbCNwYXJzZU91dHB1dChvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgT3V0cHV0IHBhcnNlT3V0cHV0KEVsZW1lbnQgb3V0cHV0RWwsIERlZmluaXRpb24gZGVmKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBPdXRwdXQgb3V0cHV0ID0gc3VwZXIucGFyc2VPdXRwdXQob3V0cHV0RWwsIGRlZik7Ci0KLSAgICAvLyBUcnkgdG8gYWRkIGVsZW1lbnQgdG8gbGlzdAotICAgIGFkZEVsZW1lbnRUb0xpc3Qob3V0cHV0RWwsIG91dHB1dCk7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGwjcGFyc2VGYXVsdChvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgRmF1bHQgcGFyc2VGYXVsdChFbGVtZW50IGZhdWx0RWwsIERlZmluaXRpb24gZGVmKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBGYXVsdCBmYXVsdCA9IHN1cGVyLnBhcnNlRmF1bHQoZmF1bHRFbCwgZGVmKTsKLQotICAgIC8vIFRyeSB0byBhZGQgZWxlbWVudCB0byBsaXN0Ci0gICAgYWRkRWxlbWVudFRvTGlzdChmYXVsdEVsLCBmYXVsdCk7Ci0KLSAgICByZXR1cm4gZmF1bHQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbCNnZXREb2N1bWVudChvcmcueG1sLnNheC5JbnB1dFNvdXJjZSwgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHByb3RlY3RlZCBEb2N1bWVudCBnZXREb2N1bWVudChJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSwgU3RyaW5nIGRlc2MpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIENsYXNzTG9hZGVyIGN1cnJlbnRMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgIHRyeQotCXsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKFdTRExSZWFkZXJJbXBsLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOyAgIAkKLQkKLSAgCSAgLy9Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICBuZXcgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5qYXhwLkRvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsKCk7Ci0KLSAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCi0gICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLQotICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKAotICAgICAgICBXU0RMRXhjZXB0aW9uLlBBUlNFUl9FUlJPUiwKLSAgICAgICAgIlByb2JsZW0gcGFyc2luZyAnIiArIGRlc2MgKyAiJy4iLAotICAgICAgICB0KTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsgCi0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjdXJyZW50TG9hZGVyKTsKLSAgICB9ICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBlbGVtZW50IGxpc3QuCi0gICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgbGlzdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMRWxlbWVudExpc3QgZ2V0RWxlbWVudExpc3QoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMud3NkbEVsZW1lbnRMaXN0OwotICB9Ci0KLSAgLyoqIAotICAgKiBBZGQgV1NETCBlbGVtZW50IHRvIGVsZW1lbnQgbGlzdC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBhZGRFbGVtZW50VG9MaXN0KEVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IHdzZGxFbGVtZW50KQotICB7Ci0gICAgRWxlbWVudExvY2F0aW9uIGVsZW1lbnRMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBTZWUgaWYgdGhlIGVsZW1lbnQgb2JqZWN0IGlzIGFuIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS54ZXJjZXMuZG9tLkVsZW1lbnRJbXBsCi0gICAgICBFbGVtZW50SW1wbCBlbGVtZW50SW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotICAgICAgLy8gSWYgaXQgaXMsIHRoZW4gZ2V0IHRoZSBlbGVtZW50IGxvY2F0aW9uIGluZm9ybWF0aW9uCi0gICAgICBlbGVtZW50TG9jYXRpb24gPQotICAgICAgICAoRWxlbWVudExvY2F0aW9uKSBlbGVtZW50SW1wbC5nZXRVc2VyRGF0YShFbGVtZW50TG9jYXRpb24uS0VZX05BTUUpOwotCi0gICAgICAvLyBBZGQgaXQgdG8gdGhlIGxpc3QKLSAgICAgIHRoaXMud3NkbEVsZW1lbnRMaXN0LmFkZEVsZW1lbnQod3NkbEVsZW1lbnQsIGVsZW1lbnRMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpCi0gICAgewotICAgICAgLy8gQUREOiBTaG91bGQgd2UgYWRkIHRoZSBlbGVtZW50IHdpdGggYSBudWxsIG9yIHplcm8gbG9jYXRpb24/Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiBhIFdTREwgZG9jdW1lbnQgY29udGFpbnMgZHVwbGljYXRlIG9wZXJhdGlvbiBuYW1lcy4KLSAgICogSXQgaXMgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIHBhcnNlQmluZGluZ09wZXJhdGlvbiBtZXRob2QsIGV4Y2VwdCB0aGF0IGl0IHdpbGwKLSAgICoganVzdCBmaW5kIHRoZSBmaXJzdCBvcGVyYXRpb24gdGhhdCBtYXRjaGVzIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSBCaW5kaW5nT3BlcmF0aW9uIHBhcnNlQmluZGluZ09wZXJhdGlvbldpdGhEdXBsaWNhdGVOYW1lcygKLSAgICBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbCwKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSwKLSAgICBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gZGVmLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICBTdHJpbmcgbmFtZSA9Ci0gICAgICBET01VdGlscy5nZXRBdHRyaWJ1dGUoYmluZGluZ09wZXJhdGlvbkVsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbkVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fSU5QVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ0lucHV0KHBhcnNlQmluZGluZ0lucHV0KHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9PVVRQVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dChwYXJzZUJpbmRpbmdPdXRwdXQodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0ZBVUxULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdChwYXJzZUJpbmRpbmdGYXVsdCh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KAotICAgICAgICAgIHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoQmluZGluZ09wZXJhdGlvbi5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLSAgICAgIFN0cmluZyBpbnB1dE5hbWUgPSAoYmluZGluZ0lucHV0ICE9IG51bGwgPyBiaW5kaW5nSW5wdXQuZ2V0TmFtZSgpIDogbnVsbCk7Ci0gICAgICBTdHJpbmcgb3V0cHV0TmFtZSA9Ci0gICAgICAgIChiaW5kaW5nT3V0cHV0ICE9IG51bGwgPyBiaW5kaW5nT3V0cHV0LmdldE5hbWUoKSA6IG51bGwpOwotCi0gICAgICAvL09wZXJhdGlvbiBvcCA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbihuYW1lLCBpbnB1dE5hbWUsIG91dHB1dE5hbWUpOwotICAgICAgLy8gR2V0IGFsbCBvcGVyYXRpb25zLCBhbmQgdGhlbiBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBtYXRjaGVzCi0gICAgICBPcGVyYXRpb24gb3AgPSBudWxsLCBjaGVja09wZXJhdGlvbjsKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpICYmIG9wID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCB0aGUgbmV4dCBvcGVyYXRpb24KLSAgICAgICAgY2hlY2tPcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gbmFtZSwgaW5wdXQgbmFtZSwgYW5kIG91dHB1dCBuYW1lCi0gICAgICAgIFN0cmluZyBjaGVja05hbWUgPSBjaGVja09wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBjaGVja0lucHV0TmFtZSA9Ci0gICAgICAgICAgKGNoZWNrT3BlcmF0aW9uLmdldElucHV0KCkgPT0gbnVsbAotICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICA6IGNoZWNrT3BlcmF0aW9uLmdldElucHV0KCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIGNoZWNrT3V0cHV0TmFtZSA9Ci0gICAgICAgICAgKGNoZWNrT3BlcmF0aW9uLmdldE91dHB1dCgpID09IG51bGwKLSAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgOiBjaGVja09wZXJhdGlvbi5nZXRPdXRwdXQoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIElmIHRoZSBuYW1lcyBtYXRjaCwgdGhlbiB0aGF0IG9wZXJhdGlvbgotICAgICAgICBpZiAoKGNoZWNrTmFtZSAhPSBudWxsICYmIGNoZWNrTmFtZS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgJiYgKChjaGVja0lucHV0TmFtZSAhPSBudWxsICYmIGNoZWNrSW5wdXROYW1lLmVxdWFscyhpbnB1dE5hbWUpKQotICAgICAgICAgICAgfHwgKGNoZWNrSW5wdXROYW1lID09IG51bGwgJiYgaW5wdXROYW1lID09IG51bGwpKQotICAgICAgICAgICYmICgoY2hlY2tPdXRwdXROYW1lICE9IG51bGwgJiYgY2hlY2tPdXRwdXROYW1lLmVxdWFscyhvdXRwdXROYW1lKSkKLSAgICAgICAgICAgIHx8IChjaGVja091dHB1dE5hbWUgPT0gbnVsbCAmJiBvdXRwdXROYW1lID09IG51bGwpKSkKLSAgICAgICAgewotICAgICAgICAgIG9wID0gY2hlY2tPcGVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG9wID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9wID0gZGVmLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgICAgICBvcC5zZXROYW1lKG5hbWUpOwotICAgICAgICBwb3J0VHlwZS5hZGRPcGVyYXRpb24ob3ApOwotICAgICAgfQotCi0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldE9wZXJhdGlvbihvcCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvV1NETFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC9XU0RMVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5OTM5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC9XU0RMVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBTZXQgb2YgWE1MIHJlbGF0ZWQgdXRpbGl0aWVzLgotICogCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETFV0aWxzCi17Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1JwY0xpdGVyYWwuCi0gICAqIEBwYXJhbSBiaW5kaW5nU3R5bGUgYSBiaW5kaW5nIHN0eWxlLgotICAgKiBAcGFyYW0gb3BlcmF0aW9uIGEgV1NETCBiaW5kaW5nIG9wZXJhdGlvbiBhcnRpZmFjdC4KLSAgICogQHJldHVybiB0cnVlIGlmIGJpbmRpbmcgaXMgcnBjIGxpdGVyYWwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNScGNMaXRlcmFsKAotICAgIFN0cmluZyBiaW5kaW5nU3R5bGUsCi0gICAgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICByZXR1cm4gY2hlY2tTdHlsZUFuZFVzZSgKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMsCi0gICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVCwKLSAgICAgIGJpbmRpbmdTdHlsZSwKLSAgICAgIG9wZXJhdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzRG9jTGl0ZXJhbC4KLSAgICogQHBhcmFtIGJpbmRpbmdTdHlsZSAgdGhlIGJpbmRpbmcgc3R5bGUuCi0gICAqIEBwYXJhbSBvcGVyYXRpb24gYSBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uLgotICAgKiBAcmV0dXJuIHRydWUgaWYgYmluZGluZyBpcyBkb2N1bWVudCBsaXRlcmFsLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvY0xpdGVyYWwoCi0gICAgU3RyaW5nIGJpbmRpbmdTdHlsZSwKLSAgICBCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIHJldHVybiBjaGVja1N0eWxlQW5kVXNlKAotICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQywKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElULAotICAgICAgYmluZGluZ1N0eWxlLAotICAgICAgb3BlcmF0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgY2hlY2tTdHlsZUFuZFVzZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tTdHlsZUFuZFVzZSgKLSAgICBTdHJpbmcgY2hlY2tTdHlsZSwKLSAgICBTdHJpbmcgY2hlY2tVc2UsCi0gICAgU3RyaW5nIGJpbmRpbmdTdHlsZSwKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBib29sZWFuIHN0eWxlRm91bmQgPSBmYWxzZTsKLSAgICBib29sZWFuIHN0eWxlQW5kVXNlRm91bmQgPSBmYWxzZTsKLQotICAgIC8vIEZpbmQgdGhlIHNvYXBiaW5kOm9wZXJhdGlvbiBlbGVtZW50Ci0gICAgU09BUE9wZXJhdGlvbiBzb2FwT3BlcmF0aW9uID0gZ2V0U29hcE9wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsKLQotICAgIC8vIElmIHRoZXJlIGFyZSBubyBleHQgZWxlbWVudHMsIHRoZW4gY2hlY2sgYWdhaW5zdCBiaW5kaW5nIHN0eWxlCi0gICAgaWYgKChzb2FwT3BlcmF0aW9uID09IG51bGwpIHx8IChzb2FwT3BlcmF0aW9uLmdldFN0eWxlKCkgPT0gbnVsbCkpCi0gICAgewotICAgICAgaWYgKGNoZWNrU3R5bGUuZXF1YWxzKGJpbmRpbmdTdHlsZSkpCi0gICAgICAgIHN0eWxlRm91bmQgPSB0cnVlOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoY2hlY2tTdHlsZS5lcXVhbHMoc29hcE9wZXJhdGlvbi5nZXRTdHlsZSgpKSkKLSAgICAgICAgc3R5bGVGb3VuZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gSWYgc3R5bGUgZm91bmQgdGhlbiBjaGVjayB1c2UKLSAgICBpZiAoc3R5bGVGb3VuZCkKLSAgICB7Ci0gICAgICAvLyBGaW5kIHRoZSBzb2FwYmluZDpib2R5IGVsZW1lbnQKLSAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gZ2V0SW5wdXRTb2FwQm9keShiaW5kaW5nT3BlcmF0aW9uKTsKLQotICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHNvYXBiaW5kOmJvZHksIHRoZW4gY2hlY2sgYWdhaW5zdCBkZWZhdWx0IHVzZSB2YWx1ZQotICAgICAgaWYgKChzb2FwQm9keSA9PSBudWxsKSB8fCAoc29hcEJvZHkuZ2V0VXNlKCkgPT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGVja1VzZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQpKQotICAgICAgICAgIHN0eWxlQW5kVXNlRm91bmQgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGVja1VzZS5lcXVhbHMoc29hcEJvZHkuZ2V0VXNlKCkpKQotICAgICAgICAgIHN0eWxlQW5kVXNlRm91bmQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzdHlsZUFuZFVzZUZvdW5kOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzb2FwYmluZDpiaW5kaW5nLgotICAgKiBAcGFyYW0gYmluZGluZyAgYSBCaW5kaW5nIG9iamVjdC4KLSAgICogQHJldHVybiBzb2FwYmluZDpiaW5kaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTT0FQQmluZGluZyBnZXRTb2FwQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IG51bGw7Ci0KLSAgICBMaXN0IGV4dEVsZW1lbnRzID0gbnVsbDsKLQotICAgIC8vIEZpbmQgdGhlIHNvYXBiaW5kOm9wZXJhdGlvbiBlbGVtZW50Ci0gICAgaWYgKChleHRFbGVtZW50cyA9IGJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgIGl0ZXJhdG9yLmhhc05leHQoKSAmJiAoc29hcEJpbmRpbmcgPT0gbnVsbCk7Ci0gICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU09BUEJpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBzb2FwQmluZGluZyA9IChTT0FQQmluZGluZykgb2JqOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHNvYXBCaW5kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzb2FwYmluZDpvcGVyYXRpb24uCi0gICAqIEBwYXJhbSBiaW5kaW5nT3BlcmF0aW9uICBhIEJpbmRpbmdPcGVyYXRpb24gb2JqZWN0LgotICAgKiBAcmV0dXJuIHNvYXBiaW5kOm9wZXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU09BUE9wZXJhdGlvbiBnZXRTb2FwT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IG51bGw7Ci0KLSAgICBMaXN0IGV4dEVsZW1lbnRzID0gbnVsbDsKLQotICAgIC8vIEZpbmQgdGhlIHNvYXBiaW5kOm9wZXJhdGlvbiBlbGVtZW50Ci0gICAgaWYgKChleHRFbGVtZW50cyA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgIGl0ZXJhdG9yLmhhc05leHQoKSAmJiAoc29hcE9wZXJhdGlvbiA9PSBudWxsKTsKLSAgICAgICAgKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTT0FQT3BlcmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgc29hcE9wZXJhdGlvbiA9IChTT0FQT3BlcmF0aW9uKSBvYmo7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc29hcE9wZXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc29hcGJpbmQ6Ym9keSBmcm9tIGlucHV0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBiaW5kaW5nT3BlcmF0aW9uICB0aGUgQmluZGluZ09wZXJhdGlvbiBvYmplY3QuCi0gICAqIEByZXR1cm4gc29hcGJpbmQ6Ym9keSBmcm9tIGlucHV0IGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFNPQVBCb2R5IGdldElucHV0U29hcEJvZHkoQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgU09BUEJvZHkgc29hcEJvZHkgPSBudWxsOwotCi0gICAgTGlzdCBleHRFbGVtZW50cyA9IG51bGw7Ci0KLSAgICAvLyBGaW5kIHRoZSBzb2FwYmluZDpib2R5IGVsZW1lbnQKLSAgICBpZiAoKGV4dEVsZW1lbnRzID0KLSAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpCi0gICAgICAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBleHRFbGVtZW50cy5pdGVyYXRvcigpOwotICAgICAgICBpdGVyYXRvci5oYXNOZXh0KCkgJiYgKHNvYXBCb2R5ID09IG51bGwpOwotICAgICAgICApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgICB7Ci0gICAgICAgICAgc29hcEJvZHkgPSAoU09BUEJvZHkpIG9iajsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzb2FwQm9keTsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kIG1lc3NhZ2VzIHJlZmVyZW5jZWQgYnkgYSBoZWFkZXIgb3IgaGVhZGVyZmF1bHQuCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uICBhIERlZmluaXRpb24gb2JqZWN0LgotICAgKiBAcGFyYW0gYmluZGluZyAgYSBCaW5kaW5nIG9iamVjdC4KLSAgICogQHJldHVybiBtZXNzYWdlcyByZWZlcmVuY2VkIGJ5IGEgaGVhZGVyIG9yIGhlYWRlcmZhdWx0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBIYXNoU2V0IGZpbmRNZXNzYWdlcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbjsKLQotICAgIEhhc2hTZXQgdGVtcE1lc3NhZ2VzLCBiaW5kaW5nTWVzc2FnZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgSGFzaFNldCBwb3J0VHlwZU1lc3NhZ2VzID0gZmluZE1lc3NhZ2VzKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSk7Ci0KLSAgICAvLyBQcm9jZXNzIGVhY2ggb3BlcmF0aW9uCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAvLyBQcm9jZXNzIHRoZSBpbnB1dCBhbmQgdGhlbiB0aGUgb3V0cHV0Ci0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB0ZW1wTWVzc2FnZXMgPQotICAgICAgICAgIGZpbmRNZXNzYWdlcygKLSAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAgICAgLmdldEJpbmRpbmdJbnB1dCgpCi0gICAgICAgICAgICAgIC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKQotICAgICAgICAgICAgICAuaXRlcmF0b3IoKSwKLSAgICAgICAgICAgIHBvcnRUeXBlTWVzc2FnZXMsCi0gICAgICAgICAgICBkZWZpbml0aW9uKTsKLQotICAgICAgICAvLyBBZGQgbWVzc2FnZXMgdG8gYmluZGluZyBtZXNzYWdlIHNldAotICAgICAgICBiaW5kaW5nTWVzc2FnZXMuYWRkQWxsKHRlbXBNZXNzYWdlcyk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFByb2Nlc3Mgb3V0cHV0Ci0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGVtcE1lc3NhZ2VzID0KLSAgICAgICAgICBmaW5kTWVzc2FnZXMoCi0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgICAgICAgIC5nZXRCaW5kaW5nT3V0cHV0KCkKLSAgICAgICAgICAgICAgLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gICAgICAgICAgICAgIC5pdGVyYXRvcigpLAotICAgICAgICAgICAgcG9ydFR5cGVNZXNzYWdlcywKLSAgICAgICAgICAgIGRlZmluaXRpb24pOwotCi0gICAgICAgIC8vIEFkZCBtZXNzYWdlcyB0byBiaW5kaW5nIG1lc3NhZ2Ugc2V0Ci0gICAgICAgIGJpbmRpbmdNZXNzYWdlcy5hZGRBbGwodGVtcE1lc3NhZ2VzKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYmluZGluZ01lc3NhZ2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmQgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgYSBoZWFkZXIgb3IgaGVhZGVyZmF1bHQuCi0gICAqIEBwYXJhbSBwb3J0VHlwZSBhIFBvcnRUeXBlIG9iamVjdC4KLSAgICogQHJldHVybiBoZSBtZXNzYWdlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IGEgaGVhZGVyIG9yIGhlYWRlcmZhdWx0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBIYXNoU2V0IGZpbmRNZXNzYWdlcyhQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIEhhc2hTZXQgbWVzc2FnZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudDsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uOwotCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIC8vIEdldCBuZXh0IG9wZXJhdGlvbiB0byBwcm9jZXNzCi0gICAgICBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgIC8vIEdldCBpbnB1dCBhbmQgb3V0cHV0IG1lc3NhZ2UKLSAgICAgIGlmIChvcGVyYXRpb24uZ2V0SW5wdXQoKSAhPSBudWxsKQotICAgICAgICBtZXNzYWdlU2V0LmFkZChvcGVyYXRpb24uZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgaWYgKG9wZXJhdGlvbi5nZXRPdXRwdXQoKSAhPSBudWxsKQotICAgICAgICBtZXNzYWdlU2V0LmFkZChvcGVyYXRpb24uZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgLy8gUHJvY2VzcyBhbnkgZmF1bHRzCi0gICAgICBJdGVyYXRvciBmYXVsdHMgPSBvcGVyYXRpb24uZ2V0RmF1bHRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChmYXVsdHMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBtZXNzYWdlU2V0LmFkZCgoKEZhdWx0KSBmYXVsdHMubmV4dCgpKS5nZXRNZXNzYWdlKCkpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtZXNzYWdlU2V0OwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmQgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgYSBoZWFkZXIgb3IgaGVhZGVyZmF1bHQuCi0gICAqIEBwYXJhbSBleHRFbGVtZW50TGlzdCBhIGxpc3Qgb2YgZXh0ZXJuYWwgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBtZXNzYWdlU2V0IGEgc2V0IG9mIG1lc3NhZ2VzLgotICAgKiBAcGFyYW0gZGVmaW5pdGlvbiBhIERlZmluaXRpb24gb2JqZWN0LgotICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IGEgaGVhZGVyIG9yIGhlYWRlcmZhdWx0LgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBIYXNoU2V0IGZpbmRNZXNzYWdlcygKLSAgICBJdGVyYXRvciBleHRFbGVtZW50TGlzdCwKLSAgICBIYXNoU2V0IG1lc3NhZ2VTZXQsCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgSGFzaFNldCByZXR1cm5TZXQgPSBuZXcgSGFzaFNldCgpOwotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQ7Ci0gICAgTWVzc2FnZSBzYXZlTWVzc2FnZSA9IG51bGw7Ci0KLSAgICB3aGlsZSAoZXh0RWxlbWVudExpc3QuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIC8vIEdldCBleHQuIGVsZW1lbnQKLSAgICAgIGV4dEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1lbnRMaXN0Lm5leHQoKTsKLQotICAgICAgUU5hbWUgbWVzc2FnZVFOYW1lOwotICAgICAgTWVzc2FnZSBtZXNzYWdlOwotCi0gICAgICAvLyBJZiB0aGlzIGlzIGEgc29hcDpoZWFkZXIgZWxlbWVudCwgdGhlbiBjaGVjayBmb3IgbWVzc2FnZSByZWZlcmVuY2UKLSAgICAgIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgU09BUEhlYWRlcikKLSAgICAgIHsKLSAgICAgICAgU09BUEhlYWRlciBzb2FwSGVhZGVyID0gKFNPQVBIZWFkZXIpIGV4dEVsZW1lbnQ7Ci0gICAgICAgIGlmICgobWVzc2FnZVFOYW1lID0gc29hcEhlYWRlci5nZXRNZXNzYWdlKCkpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJZiBtZXNzYWdlIG5vdCBmb3VuZCwgdGhlbiBjcmVhdGUgYSBkdW1teSBtZXNzYWdlIGVsZW1lbnQKLSAgICAgICAgICBpZiAoKG1lc3NhZ2UgPSBkZWZpbml0aW9uLmdldE1lc3NhZ2UobWVzc2FnZVFOYW1lKSkgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlID0gZGVmaW5pdGlvbi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBtZXNzYWdlLnNldFFOYW1lKG1lc3NhZ2VRTmFtZSk7Ci0gICAgICAgICAgICBtZXNzYWdlLnNldFVuZGVmaW5lZCh0cnVlKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoIW1lc3NhZ2VTZXQuY29udGFpbnMobWVzc2FnZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuU2V0LmFkZChtZXNzYWdlKTsKLSAgICAgICAgICAgIHNhdmVNZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQcm9jZXNzIGFueSBoZWFkZXIgZmF1bHRzIHdpdGhpbiB0aGlzIGhlYWRlcgotICAgICAgICBJdGVyYXRvciBoZWFkZXJGYXVsdExpc3QgPSBzb2FwSGVhZGVyLmdldFNPQVBIZWFkZXJGYXVsdHMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaGVhZGVyRmF1bHRMaXN0Lmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldCBzb2FwIGhlYWRlciBmYXVsdAotICAgICAgICAgIFNPQVBIZWFkZXJGYXVsdCBzb2FwSGVhZGVyRmF1bHQgPQotICAgICAgICAgICAgKFNPQVBIZWFkZXJGYXVsdCkgaGVhZGVyRmF1bHRMaXN0Lm5leHQoKTsKLSAgICAgICAgICBpZiAoKG1lc3NhZ2VRTmFtZSA9IHNvYXBIZWFkZXJGYXVsdC5nZXRNZXNzYWdlKCkpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSWYgbWVzc2FnZSBub3QgZm91bmQsIHRoZW4gY3JlYXRlIGEgZHVtbXkgbWVzc2FnZSBlbGVtZW50Ci0gICAgICAgICAgICBpZiAoKG1lc3NhZ2UgPSBkZWZpbml0aW9uLmdldE1lc3NhZ2UobWVzc2FnZVFOYW1lKSkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVzc2FnZSA9IGRlZmluaXRpb24uY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgICBtZXNzYWdlLnNldFFOYW1lKG1lc3NhZ2VRTmFtZSk7Ci0gICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0VW5kZWZpbmVkKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiBtZXNzYWdlIG5vdCBpbiBtZXNzYWdlIHNldCBhbmQgcmV0dXJuIHNldCwgdGhlbiBhZGQgaXQgIAotICAgICAgICAgICAgaWYgKCFtZXNzYWdlU2V0LmNvbnRhaW5zKG1lc3NhZ2UpCi0gICAgICAgICAgICAgICYmICgoc2F2ZU1lc3NhZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB8fCAoc2F2ZU1lc3NhZ2UgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgJiYgIXNhdmVNZXNzYWdlLmdldFFOYW1lKCkuZXF1YWxzKG1lc3NhZ2UuZ2V0UU5hbWUoKSkpKSkKLSAgICAgICAgICAgICAgcmV0dXJuU2V0LmFkZChtZXNzYWdlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dXJuU2V0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC90cmF2ZXJzYWwvVmlzaXRvckFkYXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3RyYXZlcnNhbC9WaXNpdG9yQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzVkZDkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3RyYXZlcnNhbC9WaXNpdG9yQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGNsYXNzIGFkYXB0cyB0aGUgZ2l2ZW4gb2JqZWN0IHdpdGggdGhlIGltcGxlbWVudGVkCi0gKiA8Y29kZT5XU0RMVmlzaXRvcjwvY29kZT4gbWV0aG9kcy4KLSAqIAotICogQGF1dGhvciBLdWxpawotICovCi1wdWJsaWMgY2xhc3MgVmlzaXRvckFkYXB0b3IgaW1wbGVtZW50cyBJbnZvY2F0aW9uSGFuZGxlcgotewotCi0gIC8vIG9wdGltaXphdGlvbiBoaW50Ci0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIENsYXNzW10gbnVsbENsYXNzID0gbmV3IENsYXNzW10gewotICB9OwotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBPYmplY3RbXSBudWxsT2JqZWN0ID0gbmV3IE9iamVjdFtdIHsKLSAgfTsKLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgQ2xhc3NbXSB2aXNpdG9yQ2xhc3MgPSBuZXcgQ2xhc3NbXSB7IFdTRExWaXNpdG9yLmNsYXNzIH07Ci0KLSAgLyoqCi0gICAqIFRoZSBhcnJheSBpcyB1c2VkIGZvciBkZXRlcm1pbmF0aW9uIG9mIGFjdHVhbCBqYXZheC53c2RsIGNsYXNzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBDbGFzc1tdIHdzZGwgPQotICAgIG5ldyBDbGFzc1tdIHsKLSAgICAgIFBhcnQuY2xhc3MsCi0gICAgICBTZXJ2aWNlLmNsYXNzLAotICAgICAgVHlwZXMuY2xhc3MsCi0gICAgICBPcGVyYXRpb24uY2xhc3MsCi0gICAgICBJbnB1dC5jbGFzcywKLSAgICAgIE91dHB1dC5jbGFzcywKLSAgICAgIEZhdWx0LmNsYXNzLAotICAgICAgQmluZGluZy5jbGFzcywKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24uY2xhc3MsCi0gICAgICBCaW5kaW5nSW5wdXQuY2xhc3MsCi0gICAgICBCaW5kaW5nT3V0cHV0LmNsYXNzLAotICAgICAgQmluZGluZ0ZhdWx0LmNsYXNzLAotICAgICAgSW1wb3J0LmNsYXNzLAotICAgICAgRWxlbWVudC5jbGFzcywKLSAgICAgIE1lc3NhZ2UuY2xhc3MsCi0gICAgICBQb3J0LmNsYXNzLAotICAgICAgUG9ydFR5cGUuY2xhc3MsCi0gICAgICBEZWZpbml0aW9uLmNsYXNzLAotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQuY2xhc3MsCi0gICAgICBTT0FQQmluZGluZy5jbGFzcywKLSAgICAgIFNPQVBCb2R5LmNsYXNzLAotICAgICAgU09BUEhlYWRlci5jbGFzcywKLSAgICAgIFNPQVBIZWFkZXJGYXVsdC5jbGFzcywKLSAgICAgIFNPQVBGYXVsdC5jbGFzcywKLSAgICAgIFNPQVBPcGVyYXRpb24uY2xhc3MgfTsKLQotICBmaW5hbCBwcml2YXRlIE9iamVjdCB2aXNpdG9yOwotCi0gIHByaXZhdGUgTWFwIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIG8gIGEgdmlzaXRvciBvYmplY3QuCi0gICAqLwotICBwcml2YXRlIFZpc2l0b3JBZGFwdG9yKE9iamVjdCBvKQotICB7Ci0gICAgdGhpcy52aXNpdG9yID0gbzsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIG1ldGhvZCB0byBtZXRob2QgYmluZGluZy4KLSAgICogQHBhcmFtIHdzZGxNZXRob2QgICAgYSBXU0RMIG1ldGhvZC4KLSAgICogQHBhcmFtIHRhcmdldE1ldGhvZCAgYSAgdGFyZ2V0IG1ldGhvZC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBhZGRNZXRob2RCaW5kaW5nKE1ldGhvZCB3c2RsTWV0aG9kLCBNZXRob2QgdGFyZ2V0TWV0aG9kKQotICB7Ci0gICAgbWV0aG9kcy5wdXQod3NkbE1ldGhvZCwgdGFyZ2V0TWV0aG9kKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHByb3hpZXMgYWxsICJ2aXNpdChYWFgpIiBtZXRob2RzIHRvIHRoZSBjb3JyZXNwb25kaW5nCi0gICAqICJ2aXNpdChYWFgpIiBtZXRob2RzIG9mIHRoZSB0YXJnZXQgdmlzaXRvciBvYmplY3QuIAotICAgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyI2ludm9rZShPYmplY3QsIE1ldGhvZCwgT2JqZWN0W10pCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE1ldGhvZCBtLCBPYmplY3RbXSBwYXJhbXMpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBNZXRob2QgdGFyZ2V0ID0gKE1ldGhvZCkgbWV0aG9kcy5nZXQobSk7Ci0gICAgICAvLyBhc3NlcnQgdGFyZ2V0ICE9IG51bGwKLSAgICAgIHJldHVybiB0YXJnZXQuaW52b2tlKHZpc2l0b3IsIHBhcmFtcyk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICB0LnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGV4dHJhY3QgdGhlIHNob3J0IGNsYXNzIG5hbWUuIAotICAgKiBAcGFyYW0gYyAgYSBjbGFzcy4KLSAgICogQHJldHVybiB0aGUgc2hvcnQgY2xhc3MgbmFtZS4KLSAgICovCi0gIHN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXROYW1lKENsYXNzIGMpCi0gIHsKLSAgICBpZiAoYyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lID0gYy5nZXROYW1lKCk7Ci0gICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgZ2VuZXJhdGVzIHByb3h5IGZvciB0aGUgZ2l2ZW4gdmlzaXRvci4KLSAgICogUHJveHkgcmVkaXJlY3RzIGFsbCB2aXNpdChYWFgpIGNhbGxiYWNrIHRvIHRoZSBpbXBsZW1lbnRlZCBpbiB2aXNpdG9yCi0gICAqIG9iamVjdC4KLSAgICogQHBhcmFtIHZpc2l0b3IgIGEgdmlzdG9yIG9iamVjdC4KLSAgICogQHJldHVybiBhIHByb3h5IGZvciB0aGUgZ2l2ZW4gdmlzaXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV1NETFRyYXZlcnNhbCBhZGFwdChPYmplY3QgdmlzaXRvcikKLSAgewotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLQotICAgIGlmICh2aXNpdG9yID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWaXNpdG9yIG9iamVjdCBjYW4gbm90IGJlIE5VTEwiKTsKLQotICAgIFZpc2l0b3JBZGFwdG9yIGFkYXB0b3IgPSBuZXcgVmlzaXRvckFkYXB0b3IodmlzaXRvcik7Ci0KLSAgICAvLyBjaGVjayB3aGV0aGVyIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkCi0gICAgLy8gZ2V0IHJlYWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICAgIENsYXNzIGMgPSB2aXNpdG9yLmdldENsYXNzKCk7Ci0gICAgLy8gaXRlcmF0ZXMgdGhyb3VnaCB3c2RsIGFydGlmYWN0cyBhbmQgbG9va2luZyBmb3IKLSAgICAvLyB2b2lkIHZpc2l0KFhYWCkgaW1wbGVtZW50ZWQgbWV0aG9kcy4gIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbC5sZW5ndGg7IGkrKykKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBpZiBtZXRob2QgaXMgbm90IGZvdW5kIHRoZSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24KLSAgICAgICAgTWV0aG9kIG0gPQotICAgICAgICAgIGMuZ2V0TWV0aG9kKAotICAgICAgICAgICAgInZpc2l0IiwKLSAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgd3NkbFtpXSwgT2JqZWN0LmNsYXNzLCBXU0RMVHJhdmVyc2FsQ29udGV4dC5jbGFzcyB9KTsKLSAgICAgICAgLy8gcmVnaXN0ZXIgYmluZGluZyBXU0RMVmlzaXRvciBtZXRob2QgLT4gdGFyZ2V0IHZpc2l0b3IgbWV0aG9kCi0gICAgICAgIGFkYXB0b3IuYWRkTWV0aG9kQmluZGluZygKLSAgICAgICAgICBXU0RMVmlzaXRvci5jbGFzcy5nZXRNZXRob2QoCi0gICAgICAgICAgICAidmlzaXQiLAotICAgICAgICAgICAgbmV3IENsYXNzW10geyB3c2RsW2ldLCBPYmplY3QuY2xhc3MsIFdTRExUcmF2ZXJzYWxDb250ZXh0LmNsYXNzIH0pLAotICAgICAgICAgIG0pOwotICAgICAgICAvLyByZWdpc3RlciB2aXNpdFhYWCBpbiBXU0RMVHJhdmVyc2FsQnVpbGRlcgotICAgICAgICBtID0KLSAgICAgICAgICBXU0RMVHJhdmVyc2FsLmNsYXNzLmdldE1ldGhvZCgKLSAgICAgICAgICAgICJ2aXNpdCIgKyBnZXROYW1lKHdzZGxbaV0pLAotICAgICAgICAgICAgbmV3IENsYXNzW10geyBib29sZWFuLmNsYXNzIH0pOwotICAgICAgICBtLmludm9rZSh0cmF2ZXJzYWwsIG5ldyBPYmplY3RbXSB7IEJvb2xlYW4uVFJVRSB9KTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLQotICAgIC8vIGNvbnN0cnVjdCB0aGUgV1NETFZpc2l0b3IgYnkgdXNpbmcgamF2YS5sYW5nLnJlZmxlY3QuUHJveHkKLSAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgIFdTRExWaXNpdG9yIHdzZGxWaXNpdG9yID0KLSAgICAgIChXU0RMVmlzaXRvcikgUHJveHkubmV3UHJveHlJbnN0YW5jZShsb2FkZXIsIHZpc2l0b3JDbGFzcywgYWRhcHRvcik7Ci0gICAgLy8gdHJhdmVyc2UgV1NETCBkb2N1bWVudAotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHdzZGxWaXNpdG9yKTsKLSAgICByZXR1cm4gdHJhdmVyc2FsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC90cmF2ZXJzYWwvV1NETFRyYXZlcnNhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvdHJhdmVyc2FsL1dTRExUcmF2ZXJzYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhMzc5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC90cmF2ZXJzYWwvV1NETFRyYXZlcnNhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWw7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBUaGUgY2xhc3MgaW1wbGVtZW50cyBwbGFpbiB0cmF2ZXJzZSBvdmVyIFdTREwgYXJ0aWZhY3RzLgotICogV1NETFRyYXZlcnNhbCBpcyBjb250ZXh0LWRyaXZlbiB0cmF2ZXJzYWwuIAotICogCi0gKiBAYXV0aG9yIEFuZHJleSBLdWxpawotICovCi1wdWJsaWMgY2xhc3MgV1NETFRyYXZlcnNhbAotewotCi0gIC8qKgotICAgKiBDdXJyZW50IFdTREwgdmlzaXRvciAoY2FsbGJhY2spLgotICAgKi8KLSAgcHJpdmF0ZSBXU0RMVmlzaXRvciB2aXNpdG9yOwotCi0gIC8qKgotICAgKiBGbGFncyB3aGljaCBzcGVjaWZ5IHdoZXRoZXIgdHJhdmVyc2FsIHdpbGwgdHJhdmVycyBmcm9tIG9uZSBXU0RMIGFydGlmYWN0Ci0gICAqIHRvIGFub3RoZXIuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nMkJpbmRpbmdPcGVyYXRpb24gPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nMkVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nMkV4dGVuc2liaWxpdHlFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQmluZGluZzJQb3J0VHlwZSA9IHRydWU7IC8vIHJlZmVyZW5jZQotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nRmF1bHQyRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdGYXVsdDJFeHRlbnNpYmlsaXR5RWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdJbnB1dDJFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQmluZGluZ0lucHV0MkV4dGVuc2liaWxpdHlFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJCaW5kaW5nRmF1bHQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdJbnB1dCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yQmluZGluZ091dHB1dCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMk9wZXJhdGlvbiA9IHRydWU7IC8vIHJlZmVyZW5jZSAgCi0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VEZWZpbml0aW9uMkJpbmRpbmcgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VEZWZpbml0aW9uMkVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VEZWZpbml0aW9uMkV4dGVuc2liaWxpdHlFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlRGVmaW5pdGlvbjJJbXBvcnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VEZWZpbml0aW9uMk1lc3NhZ2UgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VEZWZpbml0aW9uMlBvcnRUeXBlID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlRGVmaW5pdGlvbjJTZXJ2aWNlID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlRGVmaW5pdGlvbjJUeXBlcyA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUZhdWx0MkVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VGYXVsdDJNZXNzYWdlID0gdHJ1ZTsgLy8gcmVmZXJlbmNlIAotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VJbXBvcnQyRGVmaW5pdGlvbiA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUltcG9ydDJFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlSW5wdXQyRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUlucHV0Mk1lc3NhZ2UgPSB0cnVlOyAvLyByZWZlcmVuY2UgCi0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZU1lc3NhZ2UyRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZU1lc3NhZ2UyUGFydCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZU9wZXJhdGlvbjJFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlT3BlcmF0aW9uMkZhdWx0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlT3BlcmF0aW9uMklucHV0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlT3BlcmF0aW9uMk91dHB1dCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZU91dHB1dDJFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlT3V0cHV0Mk1lc3NhZ2UgPSB0cnVlOyAvLyByZWZlcmVuY2UgCi0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZVBhcnQyRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZVBvcnQyQmluZGluZyA9IHRydWU7IC8vIHJlZmVyZW5jZSAKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlUG9ydDJFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlUG9ydDJFeHRlbnNpYmlsaXR5RWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZVBvcnRUeXBlMkVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VQb3J0VHlwZTJPcGVyYXRpb24gPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VTZXJ2aWNlMkVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VTZXJ2aWNlMkV4dGVuc2liaWxpdHlFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlU2VydmljZTJQb3J0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlVHlwZXMyRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZVR5cGVzMkV4dGVuc2liaWxpdHlFbGVtZW50ID0gdHJ1ZTsKLSAgLy9wcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VTT0FQQm9keTJQYXJ0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlU09BUEhlYWRlcjJTT0FQSGVhZGVyRmF1bHQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nMlNPQVBCaW5kaW5nID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJTT0FQT3BlcmF0aW9uID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQmluZGluZ0lucHV0MlNPQVBIZWFkZXIgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nSW5wdXQyU09BUEJvZHkgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nT3V0cHV0MlNPQVBIZWFkZXIgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nT3V0cHV0MlNPQVBCb2R5ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQmluZGluZ0ZhdWx0MlNPQVBGYXVsdCA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIEZsYWdzIHdoaWNoIHNwZWNpZnkgd2hldGhlciB0cmF2ZXJzYWwgd2lsbCB2aXNpdCBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogYXJ0aWZhY3QuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRCaW5kaW5nID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdEJpbmRpbmdGYXVsdCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRCaW5kaW5nSW5wdXQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0QmluZGluZ09wZXJhdGlvbiA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRCaW5kaW5nT3V0cHV0ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdERlZmluaXRpb24gPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0RWxlbWVudCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRGYXVsdCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRJbXBvcnQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0SW5wdXQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0TWVzc2FnZSA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRPcGVyYXRpb24gPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0T3V0cHV0ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFBhcnQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0UG9ydCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRQb3J0VHlwZSA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRTZXJ2aWNlID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFR5cGVzID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFNPQVBCaW5kaW5nID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFNPQVBCb2R5ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFNPQVBGYXVsdCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRTT0FQSGVhZGVyID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFNPQVBIZWFkZXJGYXVsdCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRTT0FQT3BlcmF0aW9uID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNPYmplY3QoKQotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBzcGVjaWZpZXMgdGhhdCB0cmF2ZXJzYWwgd2lsbCBpZ25vcmUgaW5kaXJlY3QgcmVmZXJlbmNlcyBiZXR3ZWVuCi0gICAqIFdTREwgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZToKLSAgICogPG9sPgotICAgKiAgIDxsaT5iaW5kaW5nIHRvIHBvcnQgdHlwZTwvbGk+Ci0gICAqICAgPGxpPmJpbmRpbmcgb3BlcmF0aW9uIHRvIG9wZXJhdGlvbjwvbGk+Ci0gICAqICAgPGxpPmZhdWx0IHRvIG1lc3NhZ2U8L2xpPgotICAgKiAgIDxsaT5pbnB1dCB0byBtZXNzYWdlPC9saT4KLSAgICogICA8bGk+b3V0cHV0IHRvIG1lc3NhZ2U8L2xpPgotICAgKiAgIDxsaT5wb3J0IHRvIGJpbmRpbmc8L2xpPgotICAgKiA8L29sPgotICAgKi8KLSAgcHVibGljIHZvaWQgaWdub3JlUmVmZXJlbmNlcygpCi0gIHsKLSAgICBpZ25vcmVCaW5kaW5nMlBvcnRUeXBlKCk7Ci0gICAgaWdub3JlQmluZGluZ09wZXJhdGlvbjJPcGVyYXRpb24oKTsKLSAgICBpZ25vcmVGYXVsdDJNZXNzYWdlKCk7Ci0gICAgaWdub3JlSW5wdXQyTWVzc2FnZSgpOwotICAgIGlnbm9yZU91dHB1dDJNZXNzYWdlKCk7Ci0gICAgaWdub3JlUG9ydDJCaW5kaW5nKCk7Ci0gICAgLy9pZ25vcmVTT0FQQm9keTJQYXJ0KCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBzZXRzIHZpc2l0b3IuCi0gICAqIEBwYXJhbSB2aXNpdG9yICBhIFdTREwgdmlzaXRvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZpc2l0b3IoV1NETFZpc2l0b3IgdmlzaXRvcikKLSAgewotICAgIHRoaXMudmlzaXRvciA9IHZpc2l0b3I7Ci0gIH0KLQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiB0aGUgdHJhdmVyc2FsLgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZzJTT0FQQmluZGluZygpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmcyU09BUEJpbmRpbmcgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ09wZXJhdGlvbjJTT0FQT3BlcmF0aW9uKCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJTT0FQT3BlcmF0aW9uID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUJpbmRpbmdJbnB1dDJTT0FQSGVhZGVyKCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ0lucHV0MlNPQVBIZWFkZXIgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ0lucHV0MlNPQVBCb2R5KCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ0lucHV0MlNPQVBCb2R5ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUJpbmRpbmdPdXRwdXQyU09BUEhlYWRlcigpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyU09BUEhlYWRlciA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nT3V0cHV0MlNPQVBCb2R5KCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ091dHB1dDJTT0FQQm9keSA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nRmF1bHQyU09BUEZhdWx0KCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ0ZhdWx0MlNPQVBGYXVsdCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVTT0FQSGVhZGVyMlNPQVBIZWFkZXJGYXVsdCgpCi0gIHsKLSAgICB0cmF2ZXJzZVNPQVBIZWFkZXIyU09BUEhlYWRlckZhdWx0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUJpbmRpbmcyQmluZGluZ09wZXJhdGlvbigpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmcyQmluZGluZ09wZXJhdGlvbiA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nMkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nMkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZzJFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmcyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZzJQb3J0VHlwZSgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmcyUG9ydFR5cGUgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ0ZhdWx0MkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nRmF1bHQyRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nRmF1bHQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nRmF1bHQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ0lucHV0MkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nSW5wdXQyRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nSW5wdXQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nSW5wdXQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ09wZXJhdGlvbjJCaW5kaW5nRmF1bHQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdGYXVsdCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdJbnB1dCgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yQmluZGluZ0lucHV0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUJpbmRpbmdPcGVyYXRpb24yQmluZGluZ091dHB1dCgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yQmluZGluZ091dHB1dCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nT3BlcmF0aW9uMkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ09wZXJhdGlvbjJFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ09wZXJhdGlvbjJPcGVyYXRpb24oKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMk9wZXJhdGlvbiA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nT3V0cHV0MkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3V0cHV0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ091dHB1dDJFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRGVmaW5pdGlvbjJCaW5kaW5nKCkKLSAgewotICAgIHRyYXZlcnNlRGVmaW5pdGlvbjJCaW5kaW5nID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZURlZmluaXRpb24yRWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24yRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVEZWZpbml0aW9uMkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlRGVmaW5pdGlvbjJFeHRlbnNpYmlsaXR5RWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVEZWZpbml0aW9uMkltcG9ydCgpCi0gIHsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24ySW1wb3J0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZURlZmluaXRpb24yTWVzc2FnZSgpCi0gIHsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24yTWVzc2FnZSA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVEZWZpbml0aW9uMlBvcnRUeXBlKCkKLSAgewotICAgIHRyYXZlcnNlRGVmaW5pdGlvbjJQb3J0VHlwZSA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVEZWZpbml0aW9uMlNlcnZpY2UoKQotICB7Ci0gICAgdHJhdmVyc2VEZWZpbml0aW9uMlNlcnZpY2UgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRGVmaW5pdGlvbjJUeXBlcygpCi0gIHsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24yVHlwZXMgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRmF1bHQyRWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZUZhdWx0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRmF1bHQyTWVzc2FnZSgpCi0gIHsKLSAgICB0cmF2ZXJzZUZhdWx0Mk1lc3NhZ2UgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlSW1wb3J0MkRlZmluaXRpb24oKQotICB7Ci0gICAgdHJhdmVyc2VJbXBvcnQyRGVmaW5pdGlvbiA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVJbXBvcnQyRWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZUltcG9ydDJFbGVtZW50ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUlucHV0MkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VJbnB1dDJFbGVtZW50ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUlucHV0Mk1lc3NhZ2UoKQotICB7Ci0gICAgdHJhdmVyc2VJbnB1dDJNZXNzYWdlID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZU1lc3NhZ2UyRWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZU1lc3NhZ2UyRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVNZXNzYWdlMlBhcnQoKQotICB7Ci0gICAgdHJhdmVyc2VNZXNzYWdlMlBhcnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlT3BlcmF0aW9uMkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VPcGVyYXRpb24yRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVPcGVyYXRpb24yRmF1bHQoKQotICB7Ci0gICAgdHJhdmVyc2VPcGVyYXRpb24yRmF1bHQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlT3BlcmF0aW9uMklucHV0KCkKLSAgewotICAgIHRyYXZlcnNlT3BlcmF0aW9uMklucHV0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZU9wZXJhdGlvbjJPdXRwdXQoKQotICB7Ci0gICAgdHJhdmVyc2VPcGVyYXRpb24yT3V0cHV0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZU91dHB1dDJFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlT3V0cHV0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlT3V0cHV0Mk1lc3NhZ2UoKQotICB7Ci0gICAgdHJhdmVyc2VPdXRwdXQyTWVzc2FnZSA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVQYXJ0MkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VQYXJ0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlUG9ydDJCaW5kaW5nKCkKLSAgewotICAgIHRyYXZlcnNlUG9ydDJCaW5kaW5nID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVBvcnQyRWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZVBvcnQyRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVQb3J0MkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlUG9ydDJFeHRlbnNpYmlsaXR5RWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVQb3J0VHlwZTJFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlUG9ydFR5cGUyRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVQb3J0VHlwZTJPcGVyYXRpb24oKQotICB7Ci0gICAgdHJhdmVyc2VQb3J0VHlwZTJPcGVyYXRpb24gPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlU2VydmljZTJFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlU2VydmljZTJFbGVtZW50ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVNlcnZpY2UyRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VTZXJ2aWNlMkV4dGVuc2liaWxpdHlFbGVtZW50ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVNlcnZpY2UyUG9ydCgpCi0gIHsKLSAgICB0cmF2ZXJzZVNlcnZpY2UyUG9ydCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVUeXBlczJFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlVHlwZXMyRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLi4uCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVR5cGVzMkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlVHlwZXMyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdFNPQVBCaW5kaW5nKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICB2aXNpdFNPQVBCaW5kaW5nID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0U09BUEJvZHkoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0U09BUEJvZHkgPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRTT0FQRmF1bHQoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0U09BUEZhdWx0ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0U09BUEhlYWRlcihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRTT0FQSGVhZGVyID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0U09BUEhlYWRlckZhdWx0KGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICB2aXNpdFNPQVBIZWFkZXJGYXVsdCA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdFNPQVBPcGVyYXRpb24oYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0U09BUE9wZXJhdGlvbiA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdEJpbmRpbmcoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0QmluZGluZyA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdEJpbmRpbmdGYXVsdChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRCaW5kaW5nRmF1bHQgPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRCaW5kaW5nSW5wdXQoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0QmluZGluZ0lucHV0ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0QmluZGluZ09wZXJhdGlvbihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRCaW5kaW5nT3BlcmF0aW9uID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0QmluZGluZ091dHB1dChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRCaW5kaW5nT3V0cHV0ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0RGVmaW5pdGlvbihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXREZWZpbml0aW9uID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0RWxlbWVudChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRFbGVtZW50ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRGYXVsdChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRGYXVsdCA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdEltcG9ydChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRJbXBvcnQgPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRJbnB1dChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRJbnB1dCA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdE1lc3NhZ2UoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0TWVzc2FnZSA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdE9wZXJhdGlvbihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRPcGVyYXRpb24gPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRPdXRwdXQoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0T3V0cHV0ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0UGFydChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRQYXJ0ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0UG9ydChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRQb3J0ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0UG9ydFR5cGUoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0UG9ydFR5cGUgPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRTZXJ2aWNlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICB2aXNpdFNlcnZpY2UgPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRUeXBlcyhib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRUeXBlcyA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZygpCi0gIHsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24yQmluZGluZyA9IGZhbHNlOwotICAgIHRyYXZlcnNlUG9ydDJCaW5kaW5nID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ0ZhdWx0KCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJCaW5kaW5nRmF1bHQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdJbnB1dCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUJpbmRpbmdPcGVyYXRpb24oKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nMkJpbmRpbmdPcGVyYXRpb24gPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nT3V0cHV0KCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJCaW5kaW5nT3V0cHV0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRGVmaW5pdGlvbigpCi0gIHsKLSAgICB0cmF2ZXJzZUltcG9ydDJEZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmcyRWxlbWVudCA9IGZhbHNlOwotICAgIHRyYXZlcnNlQmluZGluZ0ZhdWx0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUJpbmRpbmdJbnB1dDJFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRWxlbWVudCA9IGZhbHNlOwotICAgIHRyYXZlcnNlRGVmaW5pdGlvbjJFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VQb3J0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZVNlcnZpY2UyRWxlbWVudCA9IGZhbHNlOwotICAgIHRyYXZlcnNlRmF1bHQyRWxlbWVudCA9IGZhbHNlOwotICAgIHRyYXZlcnNlT3V0cHV0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUltcG9ydDJFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VJbnB1dDJFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VPcGVyYXRpb24yRWxlbWVudCA9IGZhbHNlOwotICAgIHRyYXZlcnNlTWVzc2FnZTJFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VQYXJ0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZVBvcnRUeXBlMkVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZVR5cGVzMkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZVNlcnZpY2UyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZVBvcnQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24yRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUJpbmRpbmcyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUJpbmRpbmdGYXVsdDJFeHRlbnNpYmlsaXR5RWxlbWVudCA9IGZhbHNlOwotICAgIHRyYXZlcnNlQmluZGluZ0lucHV0MkV4dGVuc2liaWxpdHlFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkV4dGVuc2liaWxpdHlFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VUeXBlczJFeHRlbnNpYmlsaXR5RWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVNPQVBCaW5kaW5nKCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZzJTT0FQQmluZGluZyA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVNPQVBPcGVyYXRpb24oKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMlNPQVBPcGVyYXRpb24gPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVTT0FQQm9keSgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmdJbnB1dDJTT0FQQm9keSA9IGZhbHNlOwotICAgIHRyYXZlcnNlQmluZGluZ091dHB1dDJTT0FQQm9keSA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVNPQVBIZWFkZXIoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nSW5wdXQyU09BUEhlYWRlciA9IGZhbHNlOwotICAgIHRyYXZlcnNlQmluZGluZ091dHB1dDJTT0FQSGVhZGVyID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlU09BUEhlYWRlckZhdWx0KCkKLSAgewotICAgIHRyYXZlcnNlU09BUEhlYWRlcjJTT0FQSGVhZGVyRmF1bHQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVTT0FQRmF1bHQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nRmF1bHQyU09BUEZhdWx0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRmF1bHQoKQotICB7Ci0gICAgdHJhdmVyc2VPcGVyYXRpb24yRmF1bHQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVJbXBvcnQoKQotICB7Ci0gICAgdHJhdmVyc2VJbXBvcnQyRGVmaW5pdGlvbiA9IGZhbHNlOyAvLyBmaXgKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVJbnB1dCgpCi0gIHsKLSAgICB0cmF2ZXJzZU9wZXJhdGlvbjJJbnB1dCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZU1lc3NhZ2UoKQotICB7Ci0gICAgdHJhdmVyc2VGYXVsdDJNZXNzYWdlID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VEZWZpbml0aW9uMk1lc3NhZ2UgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUlucHV0Mk1lc3NhZ2UgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZU91dHB1dDJNZXNzYWdlID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlT3BlcmF0aW9uKCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJPcGVyYXRpb24gPSBmYWxzZTsKLSAgICB0cmF2ZXJzZVBvcnRUeXBlMk9wZXJhdGlvbiA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZU91dHB1dCgpCi0gIHsKLSAgICB0cmF2ZXJzZU9wZXJhdGlvbjJPdXRwdXQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVQYXJ0KCkKLSAgewotICAgIHRyYXZlcnNlTWVzc2FnZTJQYXJ0ID0gZmFsc2U7Ci0gICAgLy90cmF2ZXJzZVNPQVBCb2R5MlBhcnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVQb3J0KCkKLSAgewotICAgIHRyYXZlcnNlU2VydmljZTJQb3J0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlUG9ydFR5cGUoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nMlBvcnRUeXBlID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VEZWZpbml0aW9uMlBvcnRUeXBlID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlU2VydmljZSgpCi0gIHsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24yU2VydmljZSA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVR5cGVzKCkKLSAgewotICAgIHRyYXZlcnNlRGVmaW5pdGlvbjJUeXBlcyA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgYWRqdXN0cyB0cmF2ZXNlWFhYIHZhcmlhYmxlcyBhY2NvcmRpbmcgdG8gdGhlIHZpc2l0WFhYIHZhcmlhYmxlcwotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGFkanVzdCgpCi0gIHsKLSAgICBhZGp1c3RQYXJ0KCk7Ci0gICAgYWRqdXN0U2VydmljZSgpOwotICAgIGFkanVzdFR5cGVzKCk7Ci0gICAgYWRqdXN0T3BlcmF0aW9uKCk7Ci0gICAgYWRqdXN0SW5wdXQoKTsKLSAgICBhZGp1c3RPdXRwdXQoKTsKLSAgICBhZGp1c3RGYXVsdCgpOwotICAgIGFkanVzdEJpbmRpbmcoKTsKLSAgICBhZGp1c3RCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgYWRqdXN0QmluZGluZ0lucHV0KCk7Ci0gICAgYWRqdXN0QmluZGluZ091dHB1dCgpOwotICAgIGFkanVzdEJpbmRpbmdGYXVsdCgpOwotICAgIGFkanVzdEltcG9ydCgpOwotICAgIGFkanVzdEVsZW1lbnQoKTsKLSAgICBhZGp1c3RNZXNzYWdlKCk7Ci0gICAgYWRqdXN0UG9ydCgpOwotICAgIGFkanVzdFBvcnRUeXBlKCk7Ci0gICAgYWRqdXN0RGVmaW5pdGlvbigpOwotICAgIGFkanVzdEV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgYWRqdXN0U09BUEJpbmRpbmcoKTsKLSAgICBhZGp1c3RTT0FQQm9keSgpOwotICAgIGFkanVzdFNPQVBIZWFkZXIoKTsKLSAgICBhZGp1c3RTT0FQSGVhZGVyRmF1bHQoKTsKLSAgICBhZGp1c3RTT0FQRmF1bHQoKTsKLSAgICBhZGp1c3RTT0FQT3BlcmF0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9IHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RQYXJ0KCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPSB2aXNpdFBhcnQgfHwgKHRyYXZlcnNlUGFydDJFbGVtZW50ICYmIGFkanVzdEVsZW1lbnQoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVBhcnQoKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgYWRqdXN0cyB0cmF2ZXJzYWwgaWdub3JlIGZsYWdzIGFjY29yZGluZyB0byB0aGUKLSAgICogY29ycmVzcG9uZGluZyB2aXNpdCBmbGFncy4KLSAgICogQHJldHVybiBib29sZWFuIAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkanVzdFNPQVBIZWFkZXIoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdFNPQVBIZWFkZXIKLSAgICAgICAgfHwgKHRyYXZlcnNlU09BUEhlYWRlcjJTT0FQSGVhZGVyRmF1bHQgJiYgYWRqdXN0U09BUEhlYWRlckZhdWx0KCkpOwotICAgIGlmICghdmFsdWUpCi0gICAgICBpZ25vcmVTT0FQSGVhZGVyKCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RCaW5kaW5nT3V0cHV0KCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPQotICAgICAgdmlzaXRCaW5kaW5nT3V0cHV0Ci0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICAgICAgICAmJiBhZGp1c3RFeHRlbnNpYmlsaXR5RWxlbWVudCgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nT3V0cHV0MlNPQVBCb2R5Ci0gICAgICAgICAgJiYgYWRqdXN0U09BUEJvZHkoKQotICAgICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyU09BUEhlYWRlciAmJiBhZGp1c3RTT0FQSGVhZGVyKCkpKTsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgaWdub3JlQmluZGluZ091dHB1dCgpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0RWxlbWVudCgpCi0gIHsKLSAgICBib29sZWFuIHZhbHVlID0gdmlzaXRFbGVtZW50OwotICAgIGlmICghdmFsdWUpCi0gICAgICBpZ25vcmVFbGVtZW50KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RUeXBlcygpCi0gIHsKLSAgICBib29sZWFuIHZhbHVlID0KLSAgICAgIHZpc2l0VHlwZXMKLSAgICAgICAgfHwgKHRyYXZlcnNlVHlwZXMyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZVR5cGVzMkV4dGVuc2liaWxpdHlFbGVtZW50ICYmIGFkanVzdEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgIGlmICghdmFsdWUpCi0gICAgICBpZ25vcmVUeXBlcygpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0U09BUEJpbmRpbmcoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9IHZpc2l0U09BUEJpbmRpbmc7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVNPQVBCaW5kaW5nKCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RQb3J0KCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPQotICAgICAgdmlzaXRQb3J0Ci0gICAgICAgIHx8ICh0cmF2ZXJzZVBvcnQyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZVBvcnQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgJiYgYWRqdXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlUG9ydDJCaW5kaW5nICYmIGFkanVzdEJpbmRpbmcoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVBvcnQoKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgYWRqdXN0cyB0cmF2ZXJzYWwgaWdub3JlIGZsYWdzIGFjY29yZGluZyB0byB0aGUKLSAgICogY29ycmVzcG9uZGluZyB2aXNpdCBmbGFncy4KLSAgICogQHJldHVybiBib29sZWFuIAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkanVzdE9wZXJhdGlvbigpCi0gIHsKLSAgICBib29sZWFuIHZhbHVlID0KLSAgICAgIHZpc2l0T3BlcmF0aW9uCi0gICAgICAgIHx8ICh0cmF2ZXJzZU9wZXJhdGlvbjJFbGVtZW50ICYmIGFkanVzdEVsZW1lbnQoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlT3BlcmF0aW9uMklucHV0ICYmIGFkanVzdElucHV0KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZU9wZXJhdGlvbjJPdXRwdXQgJiYgYWRqdXN0T3V0cHV0KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZU9wZXJhdGlvbjJGYXVsdCAmJiBhZGp1c3RGYXVsdCgpKTsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgaWdub3JlT3BlcmF0aW9uKCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RCaW5kaW5nT3BlcmF0aW9uKCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPQotICAgICAgdmlzaXRCaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yQmluZGluZ0ZhdWx0ICYmIGFkanVzdEJpbmRpbmdGYXVsdCgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdPdXRwdXQgJiYgYWRqdXN0QmluZGluZ091dHB1dCgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMk9wZXJhdGlvbiAmJiBhZGp1c3RPcGVyYXRpb24oKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJCaW5kaW5nSW5wdXQgJiYgYWRqdXN0QmluZGluZ0lucHV0KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICAgICAgICAmJiBhZGp1c3RFeHRlbnNpYmlsaXR5RWxlbWVudCgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMlNPQVBPcGVyYXRpb24gJiYgYWRqdXN0U09BUE9wZXJhdGlvbigpKTsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgaWdub3JlQmluZGluZ09wZXJhdGlvbigpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0SW5wdXQoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdElucHV0Ci0gICAgICAgIHx8ICh0cmF2ZXJzZUlucHV0MkVsZW1lbnQgJiYgYWRqdXN0RWxlbWVudCgpKQotICAgICAgICB8fCAodHJhdmVyc2VJbnB1dDJNZXNzYWdlICYmIGFkanVzdE1lc3NhZ2UoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZUlucHV0KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RCaW5kaW5nKCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPQotICAgICAgdmlzaXRCaW5kaW5nCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmcyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmcyQmluZGluZ09wZXJhdGlvbiAmJiBhZGp1c3RCaW5kaW5nT3BlcmF0aW9uKCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmcyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgJiYgYWRqdXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlQmluZGluZzJQb3J0VHlwZSAmJiBhZGp1c3RQb3J0VHlwZSgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nMlNPQVBCaW5kaW5nICYmIGFkanVzdFNPQVBCaW5kaW5nKCkpOwotICAgIGlmICghdmFsdWUpCi0gICAgICBpZ25vcmVCaW5kaW5nKCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RTT0FQQm9keSgpCi0gIHsKLSAgICBib29sZWFuIHZhbHVlID0gdmlzaXRTT0FQQm9keTsKLSAgICAvKiB8fCAKLSAgICAJCSh0cmF2ZXJzZVNPQVBCb2R5MlBhcnQgJiYgYWRqdXN0UGFydCgpKTsqLwotICAgIGlmICghdmFsdWUpCi0gICAgICBpZ25vcmVTT0FQQm9keSgpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0U09BUEhlYWRlckZhdWx0KCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPSB2aXNpdFNPQVBIZWFkZXJGYXVsdDsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgaWdub3JlU09BUEhlYWRlckZhdWx0KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdEJpbmRpbmdJbnB1dAotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nSW5wdXQyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdJbnB1dDJFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgICAgICYmIGFkanVzdEV4dGVuc2liaWxpdHlFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdJbnB1dDJTT0FQQm9keQotICAgICAgICAgICYmIGFkanVzdFNPQVBCb2R5KCkKLSAgICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nSW5wdXQyU09BUEhlYWRlciAmJiBhZGp1c3RTT0FQSGVhZGVyKCkpKTsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgaWdub3JlQmluZGluZ0lucHV0KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RPdXRwdXQoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdE91dHB1dAotICAgICAgICB8fCAodHJhdmVyc2VPdXRwdXQyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZU91dHB1dDJNZXNzYWdlICYmIGFkanVzdE1lc3NhZ2UoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZU91dHB1dCgpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0QmluZGluZ0ZhdWx0KCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPQotICAgICAgdmlzaXRCaW5kaW5nRmF1bHQKLSAgICAgICAgfHwgKHRyYXZlcnNlQmluZGluZ0ZhdWx0MkVsZW1lbnQgJiYgYWRqdXN0RWxlbWVudCgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nRmF1bHQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICAgICAgICAmJiBhZGp1c3RFeHRlbnNpYmlsaXR5RWxlbWVudCgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nRmF1bHQyU09BUEZhdWx0ICYmIGFkanVzdFNPQVBGYXVsdCgpKTsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgaWdub3JlQmluZGluZ0ZhdWx0KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RTT0FQT3BlcmF0aW9uKCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPSB2aXNpdFNPQVBPcGVyYXRpb247Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVNPQVBPcGVyYXRpb24oKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgYWRqdXN0cyB0cmF2ZXJzYWwgaWdub3JlIGZsYWdzIGFjY29yZGluZyB0byB0aGUKLSAgICogY29ycmVzcG9uZGluZyB2aXNpdCBmbGFncy4KLSAgICogQHJldHVybiBib29sZWFuIAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkanVzdERlZmluaXRpb24oKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdERlZmluaXRpb24KLSAgICAgICAgfHwgKHRyYXZlcnNlRGVmaW5pdGlvbjJFbGVtZW50ICYmIGFkanVzdEVsZW1lbnQoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlRGVmaW5pdGlvbjJJbXBvcnQgJiYgYWRqdXN0SW1wb3J0KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZURlZmluaXRpb24yVHlwZXMgJiYgYWRqdXN0VHlwZXMoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlRGVmaW5pdGlvbjJNZXNzYWdlICYmIGFkanVzdE1lc3NhZ2UoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlRGVmaW5pdGlvbjJFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgICAgICYmIGFkanVzdEV4dGVuc2liaWxpdHlFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZURlZmluaXRpb24yUG9ydFR5cGUgJiYgYWRqdXN0UG9ydFR5cGUoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlRGVmaW5pdGlvbjJCaW5kaW5nICYmIGFkanVzdEJpbmRpbmcoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlRGVmaW5pdGlvbjJTZXJ2aWNlICYmIGFkanVzdFNlcnZpY2UoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZURlZmluaXRpb24oKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgYWRqdXN0cyB0cmF2ZXJzYWwgaWdub3JlIGZsYWdzIGFjY29yZGluZyB0byB0aGUKLSAgICogY29ycmVzcG9uZGluZyB2aXNpdCBmbGFncy4KLSAgICogQHJldHVybiBib29sZWFuIAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkanVzdFNPQVBGYXVsdCgpCi0gIHsKLSAgICBib29sZWFuIHZhbHVlID0gdmlzaXRTT0FQRmF1bHQ7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVNPQVBGYXVsdCgpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0SW1wb3J0KCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPSB2aXNpdEltcG9ydCB8fCAodHJhdmVyc2VJbXBvcnQyRGVmaW5pdGlvbgotICAgIC8qICYmIGFkanVzdERlZmluaXRpb24oKSovCi0gICAgICApCi0gICAgfHwgLy8gYXZvaWQgY3ljbGluZyBwcm9ibGVtLiBUaHVzLCB5b3Ugc2hvdWxkIGNhbGwgaWdub3JlSW1wb3J0IG1hbnVhbGx5ICAKLSAgICh0cmF2ZXJzZUltcG9ydDJFbGVtZW50ICYmIGFkanVzdEVsZW1lbnQoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZUltcG9ydCgpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0RmF1bHQoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdEZhdWx0Ci0gICAgICAgIHx8ICh0cmF2ZXJzZUZhdWx0MkVsZW1lbnQgJiYgYWRqdXN0RWxlbWVudCgpKQotICAgICAgICB8fCAodHJhdmVyc2VGYXVsdDJNZXNzYWdlICYmIGFkanVzdE1lc3NhZ2UoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZUZhdWx0KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RQb3J0VHlwZSgpCi0gIHsKLSAgICBib29sZWFuIHZhbHVlID0KLSAgICAgIHZpc2l0UG9ydFR5cGUKLSAgICAgICAgfHwgKHRyYXZlcnNlUG9ydFR5cGUyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZVBvcnRUeXBlMk9wZXJhdGlvbiAmJiBhZGp1c3RPcGVyYXRpb24oKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVBvcnRUeXBlKCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RTZXJ2aWNlKCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPQotICAgICAgdmlzaXRTZXJ2aWNlCi0gICAgICAgIHx8ICh0cmF2ZXJzZVNlcnZpY2UyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZVNlcnZpY2UyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgJiYgYWRqdXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlU2VydmljZTJQb3J0ICYmIGFkanVzdFBvcnQoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVNlcnZpY2UoKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgYWRqdXN0cyB0cmF2ZXJzYWwgaWdub3JlIGZsYWdzIGFjY29yZGluZyB0byB0aGUKLSAgICogY29ycmVzcG9uZGluZyB2aXNpdCBmbGFncy4KLSAgICogQHJldHVybiBib29sZWFuIAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkanVzdE1lc3NhZ2UoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdE1lc3NhZ2UKLSAgICAgICAgfHwgKHRyYXZlcnNlTWVzc2FnZTJFbGVtZW50ICYmIGFkanVzdEVsZW1lbnQoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlTWVzc2FnZTJQYXJ0ICYmIGFkanVzdFBhcnQoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZU1lc3NhZ2UoKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgYWNjb3JkaW5nIHRvIHRoZSAKLSAgICogc2V0dGluZ3MgaW4gdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9iakV4dGVuc2liaWxpdHlFbGVtZW50ICBhIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgICAgICAgICAgIHBhcmVudCBvZiB0aGUgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgICAgICAgICAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqRXh0ZW5zaWJpbGl0eUVsZW1lbnQsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lRXh0ZW5zaWJpbGl0eUVsZW1lbnRQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldEV4dGVuc2liaWxpdHlFbGVtZW50KG9iakV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBpZiAodmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIHBhcmVudCwgY3R4KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHBhcnQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBpbgotICAgKiB0aGUgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqUGFydCAgdGhlIFdTREwgcGFydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgIHBhcmVudCBvZiB0aGUgV1NETCBwYXJ0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoUGFydCBvYmpQYXJ0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lUGFydFByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0UGFydChvYmpQYXJ0KTsKLSAgICBpZiAodmlzaXRQYXJ0KQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqUGFydCwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc1BhcnQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqUGFydCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZVBhcnQyRWxlbWVudCkKLSAgICAgIHRyYXZlcnNlKG9ialBhcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgb2JqUGFydCwgY3R4KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIFNPQVAgaGVhZGVyIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgCi0gICAqIHNldHRpbmdzIGluIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpTT0FQSGVhZGVyICBhIFdTREwgU09BUCBoZWFkZXIgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJlbnQgICAgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgU09BUCBoZWFkZXIgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBTT0FQSGVhZGVyIG9ialNPQVBIZWFkZXIsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lU09BUEhlYWRlclByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0U09BUEhlYWRlcihvYmpTT0FQSGVhZGVyKTsKLSAgICBpZiAodmlzaXRTT0FQSGVhZGVyKQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqU09BUEhlYWRlciwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc1NPQVBIZWFkZXIoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqU09BUEhlYWRlciA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZVNPQVBIZWFkZXIyU09BUEhlYWRlckZhdWx0Ci0gICAgICAmJiBvYmpTT0FQSGVhZGVyLmdldFNPQVBIZWFkZXJGYXVsdHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqU09BUEhlYWRlci5nZXRTT0FQSGVhZGVyRmF1bHRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHRyYXZlcnNlKChTT0FQSGVhZGVyRmF1bHQpIGl0Lm5leHQoKSwgb2JqU09BUEhlYWRlciwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc1NPQVBIZWFkZXIoKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgZWxlbWVudCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzIGluCi0gICAqIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpFbGVtZW50ICBhIFdTREwgZWxlbWVudCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgIHBhcmVudCBvZiB0aGUgV1NETCBlbGVtZW50IGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgRWxlbWVudCBvYmpFbGVtZW50LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnNldEVsZW1lbnQob2JqRWxlbWVudCk7Ci0gICAgaWYgKHZpc2l0RWxlbWVudCkKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqRWxlbWVudCwgcGFyZW50LCBjdHgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgdHlwZXMgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBpbgotICAgKiB0aGUgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqVHlwZXMgIGEgV1NETCB0eXBlcyBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICBwYXJlbnQgb2YgdGhlIFdTREwgdHlwZXMgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgVHlwZXMgb2JqVHlwZXMsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lVHlwZXNQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldFR5cGVzKG9ialR5cGVzKTsKLSAgICBpZiAodmlzaXRUeXBlcykKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9ialR5cGVzLCBwYXJlbnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzVHlwZXMoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqVHlwZXMgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VUeXBlczJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9ialR5cGVzLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksIG9ialR5cGVzLCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc1R5cGVzKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlVHlwZXMyRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICAgICYmIG9ialR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpUeXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCksIG9ialR5cGVzLCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzVHlwZXMoKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBiaW5kaW5nIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgCi0gICAqIHNldHRpbmdzIGluIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpTT0FQQmluZGluZyAgYSBXU0RMIFNPQVAgYmluZGluZyBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICAgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgU09BUCBiaW5kaW5nIGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgICAgIHRoZSB0cmF2ZXJzYWwgY29udGV4LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlKAotICAgIFNPQVBCaW5kaW5nIG9ialNPQVBCaW5kaW5nLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnNldFNPQVBCaW5kaW5nKG9ialNPQVBCaW5kaW5nKTsKLSAgICBpZiAodmlzaXRTT0FQQmluZGluZykKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqU09BUEJpbmRpbmcsIHBhcmVudCwgY3R4KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGRlZmluaXRpb24gYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSAKLSAgICogc2V0dGluZ3MgaW4gdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9iakRlZmluaXRpb24gIGEgV1NETCBkZWZpbml0aW9uIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgcGFyZW50IG9mIHRoZSBXU0RMIGRlZmluaXRpb24gYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBEZWZpbml0aW9uIG9iakRlZmluaXRpb24sCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lRGVmaW5pdGlvblByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0RGVmaW5pdGlvbihvYmpEZWZpbml0aW9uKTsKLSAgICBpZiAodmlzaXREZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqRGVmaW5pdGlvbiwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0RlZmluaXRpb24oKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqRGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZURlZmluaXRpb24ySW1wb3J0ICYmIG9iakRlZmluaXRpb24uZ2V0SW1wb3J0cygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpEZWZpbml0aW9uLmdldEltcG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgVmVjdG9yIHYgPSAoVmVjdG9yKSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmICh2ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBpdDIgPSB2Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGl0Mi5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJhdmVyc2UoKEltcG9ydCkgaXQyLm5leHQoKSwgb2JqRGVmaW5pdGlvbiwgY3R4KTsKLSAgICAgICAgICAgIGlmICghY3R4LnByb2Nlc3NEZWZpbml0aW9uKCkpCi0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlRGVmaW5pdGlvbjJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9iakRlZmluaXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgb2JqRGVmaW5pdGlvbiwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NEZWZpbml0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlRGVmaW5pdGlvbjJUeXBlcykKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpEZWZpbml0aW9uLmdldFR5cGVzKCksIG9iakRlZmluaXRpb24sIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzRGVmaW5pdGlvbigpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZURlZmluaXRpb24yTWVzc2FnZSAmJiBvYmpEZWZpbml0aW9uLmdldE1lc3NhZ2VzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IG9iakRlZmluaXRpb24uZ2V0TWVzc2FnZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKE1lc3NhZ2UpIGl0Lm5leHQoKSwgb2JqRGVmaW5pdGlvbiwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc0RlZmluaXRpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZURlZmluaXRpb24yUG9ydFR5cGUgJiYgb2JqRGVmaW5pdGlvbi5nZXRQb3J0VHlwZXMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqRGVmaW5pdGlvbi5nZXRQb3J0VHlwZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKFBvcnRUeXBlKSBpdC5uZXh0KCksIG9iakRlZmluaXRpb24sIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NEZWZpbml0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHJhdmVyc2VEZWZpbml0aW9uMkJpbmRpbmcgJiYgb2JqRGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpEZWZpbml0aW9uLmdldEJpbmRpbmdzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHRyYXZlcnNlKChCaW5kaW5nKSBpdC5uZXh0KCksIG9iakRlZmluaXRpb24sIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NEZWZpbml0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHJhdmVyc2VEZWZpbml0aW9uMlNlcnZpY2UgJiYgb2JqRGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpEZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHRyYXZlcnNlKChTZXJ2aWNlKSBpdC5uZXh0KCksIG9iakRlZmluaXRpb24sIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NEZWZpbml0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHJhdmVyc2VEZWZpbml0aW9uMkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAgICAmJiBvYmpEZWZpbml0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpEZWZpbml0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB0cmF2ZXJzZSgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKSwgb2JqRGVmaW5pdGlvbiwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc0RlZmluaXRpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgcG9ydCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzIGluCi0gICAqIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpQb3J0ICBhIFdTREwgcG9ydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgIHBhcmVudCBvZiB0aGUgV1NETCBwb3J0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoUG9ydCBvYmpQb3J0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lUG9ydFByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0UG9ydChvYmpQb3J0KTsKLSAgICBpZiAodmlzaXRQb3J0KQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqUG9ydCwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc1BvcnQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqUG9ydCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZVBvcnQyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpQb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksIG9ialBvcnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzUG9ydCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZVBvcnQyQmluZGluZykKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpQb3J0LmdldEJpbmRpbmcoKSwgb2JqUG9ydCwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NQb3J0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlUG9ydDJFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgJiYgb2JqUG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqUG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCksIG9ialBvcnQsIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NQb3J0KCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIG9wZXJhdGlvbiBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzIGluCi0gICAqIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpPcGVyYXRpb24gIGEgV1NETCBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJlbnQgICAgICAgIHBhcmVudCBvZiB0aGUgV1NETCBvcGVyYXRpb24gYXJ0aWZhY3R0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBPcGVyYXRpb24gb2JqT3BlcmF0aW9uLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlc3VtZU9wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0T3BlcmF0aW9uKG9iak9wZXJhdGlvbik7Ci0gICAgaWYgKHZpc2l0T3BlcmF0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqT3BlcmF0aW9uLCBwYXJlbnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzT3BlcmF0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9iak9wZXJhdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZU9wZXJhdGlvbjJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9iak9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLCBvYmpPcGVyYXRpb24sIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzT3BlcmF0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlT3BlcmF0aW9uMklucHV0KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9iak9wZXJhdGlvbi5nZXRJbnB1dCgpLCBvYmpPcGVyYXRpb24sIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzT3BlcmF0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlT3BlcmF0aW9uMk91dHB1dCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpPcGVyYXRpb24uZ2V0T3V0cHV0KCksIG9iak9wZXJhdGlvbiwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NPcGVyYXRpb24oKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHJhdmVyc2VPcGVyYXRpb24yRmF1bHQgJiYgb2JqT3BlcmF0aW9uLmdldEZhdWx0cygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpPcGVyYXRpb24uZ2V0RmF1bHRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHRyYXZlcnNlKChGYXVsdCkgaXQubmV4dCgpLCBvYmpPcGVyYXRpb24sIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NPcGVyYXRpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgaW5wdXQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBpbgotICAgKiB0aGUgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqSW5wdXQgIGEgV1NETCBpbnB1dCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICBwYXJlbnQgb2YgdGhlIFdTREwgaW5wdXQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgSW5wdXQgb2JqSW5wdXQsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lSW5wdXRQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldElucHV0KG9iaklucHV0KTsKLSAgICBpZiAodmlzaXRJbnB1dCkKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9iaklucHV0LCBwYXJlbnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzSW5wdXQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqSW5wdXQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VJbnB1dDJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9iaklucHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksIG9iaklucHV0LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0lucHV0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlSW5wdXQyTWVzc2FnZSkKLSAgICAgIHRyYXZlcnNlKG9iaklucHV0LmdldE1lc3NhZ2UoKSwgb2JqSW5wdXQsIGN0eCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBTT0FQIGJvZHkgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSAKLSAgICogc2V0dGluZ3MgaW4gdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9ialNPQVBCb2R5ICBhIFdTREwgU09BUCBib2R5IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgIHBhcmVudCBvZiB0aGUgV1NETCBTT0FQIGJvZHkgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgU09BUEJvZHkgb2JqU09BUEJvZHksCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICAvLyAgCWN0eC5yZXN1bWVTT0FQQm9keVByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0U09BUEJvZHkob2JqU09BUEJvZHkpOwotICAgIGlmICh2aXNpdFNPQVBCb2R5KQotICAgICAgLy8JewotICAgICAgdmlzaXRvci52aXNpdChvYmpTT0FQQm9keSwgcGFyZW50LCBjdHgpOwotICAgIC8qCSAgaWYgKCFjdHgucHJvY2Vzc1NPQVBCb2R5KCkpCi0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJaWYgKG9ialNPQVBCb2R5ID09IG51bGwpCi0gICAgCQlyZXR1cm47Ci0gICAgCWlmICh0cmF2ZXJzZVNPQVBCb2R5MlBhcnQgJiYgb2JqU09BUEJvZHkuZ2V0UGFydHMoKSAhPSBudWxsKSB7Ci0gICAgCSAgaWYgKGN0eCkKLSAgICAJICBJdGVyYXRvciBpdCA9IG9ialNPQVBCb2R5LmdldFBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAJICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgCSAgCQotICAgIAkJdHJhdmVyc2UoKFBhcnQpaXQubmV4dCgpLCBvYmpTT0FQQm9keSwgY3R4KTsKLSAgICAJCWlmICghY3R4LnByb2Nlc3NTT0FQQm9keSgpKQotICAgIAkJICByZXR1cm47Ci0gICAgCSAgfQotICAgIAl9Ci0gICAgKi8KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIFNPQVAgaGVhZGVyIGZhdWx0IGFydGlmYWN0IGFjY29yZGluZyB0byAKLSAgICogdGhlIHNldHRpbmdzIGluIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpTT0FQSGVhZGVyRmF1bHQgIGEgV1NETCBTT0FQIGhlYWRlciBmYXVsdCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICAgICAgICAgICAgcGFyZW50IG9mIHRoZSBXU0RMIFNPQVAgaGVhZGVyIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBTT0FQSGVhZGVyRmF1bHQgb2JqU09BUEhlYWRlckZhdWx0LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnNldFNPQVBIZWFkZXJGYXVsdChvYmpTT0FQSGVhZGVyRmF1bHQpOwotICAgIGlmICh2aXNpdFNPQVBIZWFkZXJGYXVsdCkKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqU09BUEhlYWRlckZhdWx0LCBwYXJlbnQsIGN0eCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBvdXRwdXQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBpbgotICAgKiB0aGUgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqT3V0cHV0ICBhIFdTREwgb3V0cHV0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgcGFyZW50IG9mIHRoZSBXU0RMIG91dHB1dCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIGN0eCAgICAgIHRoZSB0cmF2ZXJzYWwgY29udGV4LgotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqIEBwYXJhbSBjdHgKLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBPdXRwdXQgb2JqT3V0cHV0LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlc3VtZU91dHB1dFByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0T3V0cHV0KG9iak91dHB1dCk7Ci0gICAgaWYgKHZpc2l0T3V0cHV0KQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqT3V0cHV0LCBwYXJlbnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzT3V0cHV0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9iak91dHB1dCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZU91dHB1dDJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9iak91dHB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLCBvYmpPdXRwdXQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzT3V0cHV0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlT3V0cHV0Mk1lc3NhZ2UpCi0gICAgICB0cmF2ZXJzZShvYmpPdXRwdXQuZ2V0TWVzc2FnZSgpLCBvYmpPdXRwdXQsIGN0eCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIGZhdWx0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgCi0gICAqIHNldHRpbmdzIGluIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpCaW5kaW5nRmF1bHQgIGEgV1NETCBiaW5kaW5nIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgYmluZGluZyBmYXVsdCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIGN0eCAgICAgICAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgQmluZGluZ0ZhdWx0IG9iakJpbmRpbmdGYXVsdCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGN0eC5yZXN1bWVCaW5kaW5nRmF1bHRQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldEJpbmRpbmdGYXVsdChvYmpCaW5kaW5nRmF1bHQpOwotICAgIGlmICh2aXNpdEJpbmRpbmdGYXVsdCkKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9iakJpbmRpbmdGYXVsdCwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdGYXVsdCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChvYmpCaW5kaW5nRmF1bHQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nRmF1bHQyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpCaW5kaW5nRmF1bHQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgb2JqQmluZGluZ0ZhdWx0LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdGYXVsdCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZUJpbmRpbmdGYXVsdDJTT0FQRmF1bHQKLSAgICAgICYmIG9iakJpbmRpbmdGYXVsdC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZ0ZhdWx0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTT0FQRmF1bHQpCi0gICAgICAgICAgdHJhdmVyc2UoKFNPQVBGYXVsdCkgbywgb2JqQmluZGluZ0ZhdWx0LCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZ0ZhdWx0KCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nRmF1bHQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICAgICYmIG9iakJpbmRpbmdGYXVsdC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZ0ZhdWx0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB0cmF2ZXJzZSgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKSwgb2JqQmluZGluZ0ZhdWx0LCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZ0ZhdWx0KCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIFNPQVAgb3BlcmF0aW9uIGFydGlmYWN0IGFjY29yZGluZyB0byAKLSAgICogdGhlIHNldHRpbmdzIGluIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpTT0FQT3BlcmF0aW9uICBhIFdTREwgU09BUCBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJlbnQgICAgICAgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgU09BUCBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBTT0FQT3BlcmF0aW9uIG9ialNPQVBPcGVyYXRpb24sCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHguc2V0U09BUE9wZXJhdGlvbihvYmpTT0FQT3BlcmF0aW9uKTsKLSAgICBpZiAodmlzaXRTT0FQT3BlcmF0aW9uKQotICAgICAgdmlzaXRvci52aXNpdChvYmpTT0FQT3BlcmF0aW9uLCBwYXJlbnQsIGN0eCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIGlucHV0IGFydGlmYWN0IGFjY29yZGluZyB0byAKLSAgICogdGhlIHNldHRpbmdzIGluIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpCaW5kaW5nSW5wdXQgIGEgV1NETCBiaW5kaW5nIGlucHV0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgYmluZGluZyBpbnB1dCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIGN0eCAgICAgICAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgQmluZGluZ0lucHV0IG9iakJpbmRpbmdJbnB1dCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGN0eC5yZXN1bWVCaW5kaW5nSW5wdXRQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldEJpbmRpbmdJbnB1dChvYmpCaW5kaW5nSW5wdXQpOwotICAgIGlmICh2aXNpdEJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9iakJpbmRpbmdJbnB1dCwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdJbnB1dCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChvYmpCaW5kaW5nSW5wdXQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nSW5wdXQyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpCaW5kaW5nSW5wdXQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgb2JqQmluZGluZ0lucHV0LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdJbnB1dCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgodHJhdmVyc2VCaW5kaW5nSW5wdXQyU09BUEJvZHkgfHwgdHJhdmVyc2VCaW5kaW5nSW5wdXQyU09BUEhlYWRlcikKLSAgICAgICYmIG9iakJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKHRyYXZlcnNlQmluZGluZ0lucHV0MlNPQVBCb2R5ICYmIChvIGluc3RhbmNlb2YgU09BUEJvZHkpKQotICAgICAgICAgIHRyYXZlcnNlKChTT0FQQm9keSkgbywgb2JqQmluZGluZ0lucHV0LCBjdHgpOwotICAgICAgICBlbHNlIGlmICh0cmF2ZXJzZUJpbmRpbmdJbnB1dDJTT0FQSGVhZGVyICYmIChvIGluc3RhbmNlb2YgU09BUEhlYWRlcikpCi0gICAgICAgICAgdHJhdmVyc2UoKFNPQVBIZWFkZXIpIG8sIG9iakJpbmRpbmdJbnB1dCwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdJbnB1dCgpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlQmluZGluZ0lucHV0MkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAgICAmJiBvYmpCaW5kaW5nSW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IG9iakJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCksIG9iakJpbmRpbmdJbnB1dCwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdJbnB1dCgpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIG9wZXJhdGlvbiBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gCi0gICAqIHRoZSBzZXR0aW5ncyBpbiB0aGUgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqQmluZGluZ09wZXJhdGlvbiAgYSBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgICAgICAgcGFyZW50IG9mIHRoZSBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgICAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgQmluZGluZ09wZXJhdGlvbiBvYmpCaW5kaW5nT3BlcmF0aW9uLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlc3VtZUJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldEJpbmRpbmdPcGVyYXRpb24ob2JqQmluZGluZ09wZXJhdGlvbik7Ci0gICAgaWYgKHZpc2l0QmluZGluZ09wZXJhdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9iakJpbmRpbmdPcGVyYXRpb24sIHBhcmVudCwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NCaW5kaW5nT3BlcmF0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9iakJpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkVsZW1lbnQpCi0gICAgewotICAgICAgdHJhdmVyc2UoCi0gICAgICAgIG9iakJpbmRpbmdPcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwKLSAgICAgICAgb2JqQmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NCaW5kaW5nT3BlcmF0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJTT0FQT3BlcmF0aW9uCi0gICAgICAmJiBvYmpCaW5kaW5nT3BlcmF0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpCaW5kaW5nT3BlcmF0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTT0FQT3BlcmF0aW9uKQotICAgICAgICAgIHRyYXZlcnNlKChTT0FQT3BlcmF0aW9uKSBvLCBvYmpCaW5kaW5nT3BlcmF0aW9uLCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZ09wZXJhdGlvbigpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgJiYgb2JqQmluZGluZ09wZXJhdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZ09wZXJhdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCksIG9iakJpbmRpbmdPcGVyYXRpb24sIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NCaW5kaW5nT3BlcmF0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMk9wZXJhdGlvbikKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpCaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLCBvYmpCaW5kaW5nT3BlcmF0aW9uLCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdPcGVyYXRpb24oKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpCaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpLCBvYmpCaW5kaW5nT3BlcmF0aW9uLCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdPcGVyYXRpb24oKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdPdXRwdXQpCi0gICAgewotICAgICAgdHJhdmVyc2UoCi0gICAgICAgIG9iakJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpLAotICAgICAgICBvYmpCaW5kaW5nT3BlcmF0aW9uLAotICAgICAgICBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdPcGVyYXRpb24oKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdGYXVsdAotICAgICAgJiYgb2JqQmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IG9iakJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0ZhdWx0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB0cmF2ZXJzZSgoQmluZGluZ0ZhdWx0KSBpdC5uZXh0KCksIG9iakJpbmRpbmdPcGVyYXRpb24sIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NCaW5kaW5nT3BlcmF0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIFNPQVAgZmF1bHQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSAKLSAgICogc2V0dGluZ3MgaW4gdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9ialNPQVBGYXVsdCAgYSBXU0RMIFNPQVAgZmF1bHQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJlbnQgICAgICAgIHBhcmVudCBvZiB0aGUgV1NETCBTT0FQIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBTT0FQRmF1bHQgb2JqU09BUEZhdWx0LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnNldFNPQVBGYXVsdChvYmpTT0FQRmF1bHQpOwotICAgIGlmICh2aXNpdFNPQVBGYXVsdCkKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqU09BUEZhdWx0LCBwYXJlbnQsIGN0eCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MgaW4KLSAgICogdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9iakJpbmRpbmcgIGEgV1NETCBiaW5kaW5nIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgcGFyZW50IG9mIHRoZSBXU0RMIGJpbmRpbmcgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBCaW5kaW5nIG9iakJpbmRpbmcsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lQmluZGluZ1Byb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0QmluZGluZyhvYmpCaW5kaW5nKTsKLSAgICBpZiAodmlzaXRCaW5kaW5nKQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqQmluZGluZywgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmcoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqQmluZGluZyA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZUJpbmRpbmcyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpCaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksIG9iakJpbmRpbmcsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZygpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZUJpbmRpbmcyU09BUEJpbmRpbmcKLSAgICAgICYmIG9iakJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IG9iakJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKQotICAgICAgICAgIHRyYXZlcnNlKChTT0FQQmluZGluZykgbywgb2JqQmluZGluZywgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmcoKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZUJpbmRpbmcyUG9ydFR5cGUpCi0gICAgewotICAgICAgdHJhdmVyc2Uob2JqQmluZGluZy5nZXRQb3J0VHlwZSgpLCBvYmpCaW5kaW5nLCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmcoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nMkJpbmRpbmdPcGVyYXRpb24KLSAgICAgICYmIG9iakJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB0cmF2ZXJzZSgoQmluZGluZ09wZXJhdGlvbikgaXQubmV4dCgpLCBvYmpCaW5kaW5nLCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZygpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlQmluZGluZzJFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgJiYgb2JqQmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCksIG9iakJpbmRpbmcsIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NCaW5kaW5nKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGZhdWx0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MgaW4KLSAgICogdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9iakZhdWx0ICBhIFdTREwgZmF1bHQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJlbnQgICAgcGFyZW50IG9mIHRoZSBXU0RMIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgIHRoZSB0cmF2ZXJzYWwgY29udGV4LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlKAotICAgIEZhdWx0IG9iakZhdWx0LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlc3VtZUZhdWx0UHJvY2Vzc2luZygpOwotICAgIGN0eC5zZXRGYXVsdChvYmpGYXVsdCk7Ci0gICAgaWYgKHZpc2l0RmF1bHQpCi0gICAgewotICAgICAgdmlzaXRvci52aXNpdChvYmpGYXVsdCwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0ZhdWx0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9iakZhdWx0ID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgaWYgKHRyYXZlcnNlRmF1bHQyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpGYXVsdC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLCBvYmpGYXVsdCwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NGYXVsdCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZUZhdWx0Mk1lc3NhZ2UpCi0gICAgICB0cmF2ZXJzZShvYmpGYXVsdC5nZXRNZXNzYWdlKCksIG9iakZhdWx0LCBjdHgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgc2VydmljZSBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzIGluCi0gICAqIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpTZXJ2aWNlICBhIFdTREwgc2VydmljZSBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICAgIHBhcmVudCBvZiB0aGUgV1NETCBzZXJ2aWNlIGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgU2VydmljZSBvYmpTZXJ2aWNlLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlc3VtZVNlcnZpY2VQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldFNlcnZpY2Uob2JqU2VydmljZSk7Ci0gICAgaWYgKHZpc2l0U2VydmljZSkKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9ialNlcnZpY2UsIHBhcmVudCwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NTZXJ2aWNlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9ialNlcnZpY2UgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VTZXJ2aWNlMkVsZW1lbnQpCi0gICAgewotICAgICAgdHJhdmVyc2Uob2JqU2VydmljZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLCBvYmpTZXJ2aWNlLCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc1NlcnZpY2UoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHJhdmVyc2VTZXJ2aWNlMkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAgICAmJiBvYmpTZXJ2aWNlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpTZXJ2aWNlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB0cmF2ZXJzZSgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKSwgb2JqU2VydmljZSwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc1NlcnZpY2UoKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZVNlcnZpY2UyUG9ydCAmJiBvYmpTZXJ2aWNlLmdldFBvcnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IG9ialNlcnZpY2UuZ2V0UG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKFBvcnQpIGl0Lm5leHQoKSwgb2JqU2VydmljZSwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc1NlcnZpY2UoKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgaW1wb3J0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MgaW4KLSAgICogdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9iakltcG9ydCAgYSBXU0RMIGltcG9ydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICAgcGFyZW50IG9mIHRoZSBXU0RMIGltcG9ydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIGN0eCAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgSW1wb3J0IG9iakltcG9ydCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGN0eC5yZXN1bWVJbXBvcnRQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldEltcG9ydChvYmpJbXBvcnQpOwotICAgIGlmICh2aXNpdEltcG9ydCkKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9iakltcG9ydCwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0ltcG9ydCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChvYmpJbXBvcnQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VJbXBvcnQyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpJbXBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgb2JqSW1wb3J0LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0ltcG9ydCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZUltcG9ydDJEZWZpbml0aW9uKQotICAgICAgdHJhdmVyc2Uob2JqSW1wb3J0LmdldERlZmluaXRpb24oKSwgb2JqSW1wb3J0LCBjdHgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgYmluZGluZyBvdXRwdXQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSAKLSAgICogc2V0dGluZ3MgaW4gdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9iakJpbmRpbmdPdXRwdXQgIGEgV1NETCBiaW5kaW5nIG91dHB1dCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICAgICAgICAgIHBhcmVudCBvZiB0aGUgV1NETCBiaW5kaW5nIG91dHB1dCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIGN0eCAgICAgICAgICAgICAgIHRoZSB0cmF2ZXJzYWwgY29udGV4LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlKAotICAgIEJpbmRpbmdPdXRwdXQgb2JqQmluZGluZ091dHB1dCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGN0eC5yZXN1bWVCaW5kaW5nT3V0cHV0UHJvY2Vzc2luZygpOwotICAgIGN0eC5zZXRCaW5kaW5nT3V0cHV0KG9iakJpbmRpbmdPdXRwdXQpOwotICAgIGlmICh2aXNpdEJpbmRpbmdPdXRwdXQpCi0gICAgewotICAgICAgdmlzaXRvci52aXNpdChvYmpCaW5kaW5nT3V0cHV0LCBwYXJlbnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZ091dHB1dCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChvYmpCaW5kaW5nT3V0cHV0ID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgaWYgKHRyYXZlcnNlQmluZGluZ091dHB1dDJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKAotICAgICAgICBvYmpCaW5kaW5nT3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksCi0gICAgICAgIG9iakJpbmRpbmdPdXRwdXQsCi0gICAgICAgIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZ091dHB1dCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgodHJhdmVyc2VCaW5kaW5nT3V0cHV0MlNPQVBCb2R5IHx8IHRyYXZlcnNlQmluZGluZ091dHB1dDJTT0FQSGVhZGVyKQotICAgICAgJiYgb2JqQmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmICh0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyU09BUEJvZHkgJiYgKG8gaW5zdGFuY2VvZiBTT0FQQm9keSkpCi0gICAgICAgICAgdHJhdmVyc2UoKFNPQVBCb2R5KSBvLCBvYmpCaW5kaW5nT3V0cHV0LCBjdHgpOwotICAgICAgICBlbHNlIGlmICh0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyU09BUEhlYWRlciAmJiAobyBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpKQotICAgICAgICAgIHRyYXZlcnNlKChTT0FQSGVhZGVyKSBvLCBvYmpCaW5kaW5nT3V0cHV0LCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZ091dHB1dCgpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlQmluZGluZ091dHB1dDJFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgJiYgb2JqQmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCksIG9iakJpbmRpbmdPdXRwdXQsIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NCaW5kaW5nT3V0cHV0KCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHBvcnQgdHlwZSBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzIGluCi0gICAqIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpQb3J0VHlwZSAgYSBXU0RMIHBvcnQgdHlwZSBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgcG9ydCB0eXBlLgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgIHRoZSB0cmF2ZXJzYWwgY29udGV4LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlKAotICAgIFBvcnRUeXBlIG9ialBvcnRUeXBlLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlc3VtZVBvcnRUeXBlUHJvY2Vzc2luZygpOwotICAgIGN0eC5zZXRQb3J0VHlwZShvYmpQb3J0VHlwZSk7Ci0gICAgaWYgKHZpc2l0UG9ydFR5cGUpCi0gICAgewotICAgICAgdmlzaXRvci52aXNpdChvYmpQb3J0VHlwZSwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc1BvcnRUeXBlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9ialBvcnRUeXBlID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgaWYgKHRyYXZlcnNlUG9ydFR5cGUyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpQb3J0VHlwZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLCBvYmpQb3J0VHlwZSwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NQb3J0VHlwZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZVBvcnRUeXBlMk9wZXJhdGlvbiAmJiBvYmpQb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IG9ialBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKE9wZXJhdGlvbikgaXQubmV4dCgpLCBvYmpQb3J0VHlwZSwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc1BvcnRUeXBlKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIG1lc3NhZ2UgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBpbgotICAgKiB0aGUgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqTWVzc2FnZSAgYSBXU0RMIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBwYXJlbnQgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgbWVzc2FnZS4KLSAgICogQHBhcmFtIGN0eCAgICAgICAgIHRoZSB0cmF2ZXJzYWwgY29udGV4LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlKAotICAgIE1lc3NhZ2Ugb2JqTWVzc2FnZSwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGN0eC5yZXN1bWVNZXNzYWdlUHJvY2Vzc2luZygpOwotICAgIGN0eC5zZXRNZXNzYWdlKG9iak1lc3NhZ2UpOwotICAgIGlmICh2aXNpdE1lc3NhZ2UpCi0gICAgewotICAgICAgdmlzaXRvci52aXNpdChvYmpNZXNzYWdlLCBwYXJlbnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzTWVzc2FnZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChvYmpNZXNzYWdlID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgaWYgKHRyYXZlcnNlTWVzc2FnZTJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9iak1lc3NhZ2UuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgb2JqTWVzc2FnZSwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NNZXNzYWdlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlTWVzc2FnZTJQYXJ0ICYmIG9iak1lc3NhZ2UuZ2V0UGFydHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqTWVzc2FnZS5nZXRQYXJ0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB0cmF2ZXJzZSgoUGFydCkgaXQubmV4dCgpLCBvYmpNZXNzYWdlLCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzTWVzc2FnZSgpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBwYXJ0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgcGFydCBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKFBhcnQgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgc2VydmljZSBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIHNlcnZpY2UgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShTZXJ2aWNlIGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHR5cGVzIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhIFdTREwgdHlwZXMgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShUeXBlcyBhKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpKTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBvcGVyYXRpb24gYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgIGEgV1NETCBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShPcGVyYXRpb24gYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgaW5wdXQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgIGEgV1NETCBpbnB1dCBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElucHV0IGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIG91dHB1dCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIG91dHB1dCBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKE91dHB1dCBhKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpKTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBmYXVsdCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIGZhdWx0IGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoRmF1bHQgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgYmluZGluZyBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIGJpbmRpbmcgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShCaW5kaW5nIGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgCi0gICAqIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoQmluZGluZ09wZXJhdGlvbiBhKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpKTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIGlucHV0IGFydGlmYWN0IGFjY29yZGluZyB0byAKLSAgICogdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIGJpbmRpbmcgaW5wdXQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShCaW5kaW5nSW5wdXQgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgYmluZGluZyBvdXRwdXQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIAotICAgKiB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgYmluZGluZyBvdXRwdXQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShCaW5kaW5nT3V0cHV0IGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGJpbmRpbmcgZmF1bHQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIAotICAgKiB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgYSBXU0RMIGJpbmRpbmcgZmF1bHQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShCaW5kaW5nRmF1bHQgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgaW1wb3J0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgaW1wb3J0IGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoSW1wb3J0IGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGVsZW1lbnQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgIGEgV1NETCBlbGVtZW50IGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoRWxlbWVudCBhKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpKTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBtZXNzYWdlIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgbWVzc2FnZSBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKE1lc3NhZ2UgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgcG9ydCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIHBvcnQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShQb3J0IGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHBvcnQgdHlwZSBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIHBvcnQgdHlwZSBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKFBvcnRUeXBlIGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGRlZmluaXRpb24gYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgIGEgV1NETCBkZWZpbml0aW9uIGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoRGVmaW5pdGlvbiBhKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpKTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBleHRlbnNpYmlsaXR5IGVsbWVudCBhcnRpZmFjdCBhY2NvcmRpbmcgCi0gICAqIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgIGEgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShFeHRlbnNpYmlsaXR5RWxlbWVudCBhKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpKTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBTT0FQIGJpbmRpbmcgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIAotICAgKiB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgU09BUCBiaW5kaW5nIGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoU09BUEJpbmRpbmcgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBib2R5IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgU09BUCBib2R5IGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoU09BUEJvZHkgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBoZWFkZXIgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgIGEgV1NETCBTT0FQIGhlYWRlciBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKFNPQVBIZWFkZXIgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBoZWFkZXIgZmF1bHQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIAotICAgKiB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgU09BUCBoZWFkZXIgZmF1bHQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShTT0FQSGVhZGVyRmF1bHQgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBmYXVsdCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIFNPQVAgZmF1bHQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShTT0FQRmF1bHQgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBvcGVyYXRpb24gYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIAotICAgKiB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgU09BUCBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShTT0FQT3BlcmF0aW9uIGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgcGFydCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgcGFydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmFtcyAgYSBNYXAgb2JqZWN0IHJlcHJlc2VudGluZyBzZXR0aW5ncy4gIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoUGFydCBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBzZXJ2aWNlIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBzZXJ2aWNlIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShTZXJ2aWNlIGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHR5cGVzIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCB0eXBlcyBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmFtcyAgYSBNYXAgb2JqZWN0IHJlcHJlc2VudGluZyBzZXR0aW5ncy4gIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoVHlwZXMgYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgb3BlcmF0aW9uIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKE9wZXJhdGlvbiBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBpbnB1dCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgaW5wdXQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElucHV0IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIG91dHB1dCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgb3V0cHV0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShPdXRwdXQgYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgZmF1bHQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShGYXVsdCBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBiaW5kaW5nIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShCaW5kaW5nIGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGFydGlmYWN0IGFjY29yZGluZyAKLSAgICogdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgYmluZGluZyBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKEJpbmRpbmdPcGVyYXRpb24gYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgYmluZGluZyBpbnB1dCBhcnRpZmFjdCBhY2NvcmRpbmcgCi0gICAqIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIGJpbmRpbmcgaW5wdXQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKEJpbmRpbmdJbnB1dCBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIG91dHB1dCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gCi0gICAqIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIGJpbmRpbmcgb3V0cHV0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShCaW5kaW5nT3V0cHV0IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGJpbmRpbmcgZmF1bHQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIAotICAgKiB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBiaW5kaW5nIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoQmluZGluZ0ZhdWx0IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGltcG9ydCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgaW1wb3J0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoSW1wb3J0IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGVsZW1lbnQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIGVsZW1lbnQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShFbGVtZW50IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIG1lc3NhZ2UgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShNZXNzYWdlIGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHBvcnQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIHBvcnQuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShQb3J0IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHBvcnQgdHlwZSBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgcG9ydCB0eXBlIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoUG9ydFR5cGUgYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgZGVmaW5pdGlvbiBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgZGVmaW5pdGlvbiBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmFtcyAgYSBNYXAgb2JqZWN0IHJlcHJlc2VudGluZyBzZXR0aW5ncy4gICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKERlZmluaXRpb24gYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShFeHRlbnNpYmlsaXR5RWxlbWVudCBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBTT0FQIGJpbmRpbmcgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIFNPQVAgYmluZGluZyBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmFtcyAgYSBNYXAgb2JqZWN0IHJlcHJlc2VudGluZyBzZXR0aW5ncy4gICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKFNPQVBCaW5kaW5nIGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIFNPQVAgYm9keSBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgU09BUCBib2R5IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoU09BUEJvZHkgYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBoZWFkZXIgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIFNPQVAgaGVhZGVyIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoU09BUEhlYWRlciBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBoZWFyZGVyIGZhdWx0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBTT0FQIGhlYWRlciBmYXVsdCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmFtcyAgYSBNYXAgb2JqZWN0IHJlcHJlc2VudGluZyBzZXR0aW5ncy4gICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKFNPQVBIZWFkZXJGYXVsdCBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBTT0FQIGZhdWx0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBTT0FQIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoU09BUEZhdWx0IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIFNPQVAgb3BlcmF0aW9uIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBTT0FQIG9wZXJhdGlvbiBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmFtcyAgYSBNYXAgb2JqZWN0IHJlcHJlc2VudGluZyBzZXR0aW5ncy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKFNPQVBPcGVyYXRpb24gYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3RyYXZlcnNhbC9XU0RMVHJhdmVyc2FsQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvdHJhdmVyc2FsL1dTRExUcmF2ZXJzYWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDAxYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvdHJhdmVyc2FsL1dTRExUcmF2ZXJzYWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci0KLS8qKgotICogVGhlIGNsYXNzIHJlcHJlc2VudHMgcnVudGltZSBjb250ZXh0IGZvciB0aGUgdHJhdmVyc2FsIHByb2Nlc3MuCi0gKiBDb250ZXh0IHN0b3JlcyBhcnRpZmFjdHMgYmVpbmcgcHJvY2Vzc2VkLgotICogCi0gKiBAYXV0aG9yIEFuZHJleSBLdWxpawotICovCi1wdWJsaWMgY2xhc3MgV1NETFRyYXZlcnNhbENvbnRleHQKLXsKLSAgLyoqCi0gICAqIEZsYWdzIHdoaWNoIGluZGljYXRlIHdoZXRoZXIgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHByb2Nlc3NlZAotICAgKiBvciBub3QuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1BhcnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1NlcnZpY2UgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1R5cGVzID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NPcGVyYXRpb24gPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0lucHV0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NPdXRwdXQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0ZhdWx0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NCaW5kaW5nID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NCaW5kaW5nT3BlcmF0aW9uID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NCaW5kaW5nSW5wdXQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0JpbmRpbmdPdXRwdXQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0JpbmRpbmdGYXVsdCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzSW1wb3J0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NNZXNzYWdlID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQb3J0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQb3J0VHlwZSA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzRGVmaW5pdGlvbiA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1NPQVBCaW5kaW5nID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NTT0FQSGVhZGVyID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NTT0FQSGVhZGVyRmF1bHQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1NPQVBGYXVsdCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzU09BUE9wZXJhdGlvbiA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIExhc3QgcHJvY2Vzc2VkIFdTREwgZWxlbWVudHMuIAotICAgKi8KLSAgcHJpdmF0ZSBQYXJ0IGFjdGl2ZVBhcnQgPSBudWxsOwotICBwcml2YXRlIFNlcnZpY2UgYWN0aXZlU2VydmljZSA9IG51bGw7Ci0gIHByaXZhdGUgVHlwZXMgYWN0aXZlVHlwZXMgPSBudWxsOwotICBwcml2YXRlIE9wZXJhdGlvbiBhY3RpdmVPcGVyYXRpb24gPSBudWxsOwotICBwcml2YXRlIElucHV0IGFjdGl2ZUlucHV0ID0gbnVsbDsKLSAgcHJpdmF0ZSBPdXRwdXQgYWN0aXZlT3V0cHV0ID0gbnVsbDsKLSAgcHJpdmF0ZSBGYXVsdCBhY3RpdmVGYXVsdCA9IG51bGw7Ci0gIHByaXZhdGUgQmluZGluZyBhY3RpdmVCaW5kaW5nID0gbnVsbDsKLSAgcHJpdmF0ZSBCaW5kaW5nT3BlcmF0aW9uIGFjdGl2ZUJpbmRpbmdPcGVyYXRpb24gPSBudWxsOwotICBwcml2YXRlIEJpbmRpbmdJbnB1dCBhY3RpdmVCaW5kaW5nSW5wdXQgPSBudWxsOwotICBwcml2YXRlIEJpbmRpbmdPdXRwdXQgYWN0aXZlQmluZGluZ091dHB1dCA9IG51bGw7Ci0gIHByaXZhdGUgQmluZGluZ0ZhdWx0IGFjdGl2ZUJpbmRpbmdGYXVsdCA9IG51bGw7Ci0gIHByaXZhdGUgSW1wb3J0IGFjdGl2ZUltcG9ydCA9IG51bGw7Ci0gIHByaXZhdGUgRWxlbWVudCBhY3RpdmVFbGVtZW50ID0gbnVsbDsKLSAgcHJpdmF0ZSBNZXNzYWdlIGFjdGl2ZU1lc3NhZ2UgPSBudWxsOwotICBwcml2YXRlIFBvcnQgYWN0aXZlUG9ydCA9IG51bGw7Ci0gIHByaXZhdGUgUG9ydFR5cGUgYWN0aXZlUG9ydFR5cGUgPSBudWxsOwotICBwcml2YXRlIERlZmluaXRpb24gYWN0aXZlRGVmaW5pdGlvbiA9IG51bGw7Ci0gIHByaXZhdGUgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgYWN0aXZlRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBudWxsOwotICBwcml2YXRlIFNPQVBCaW5kaW5nIGFjdGl2ZVNPQVBCaW5kaW5nID0gbnVsbDsKLSAgcHJpdmF0ZSBTT0FQQm9keSBhY3RpdmVTT0FQQm9keSA9IG51bGw7Ci0gIHByaXZhdGUgU09BUEhlYWRlciBhY3RpdmVTT0FQSGVhZGVyID0gbnVsbDsKLSAgcHJpdmF0ZSBTT0FQSGVhZGVyRmF1bHQgYWN0aXZlU09BUEhlYWRlckZhdWx0ID0gbnVsbDsKLSAgcHJpdmF0ZSBTT0FQRmF1bHQgYWN0aXZlU09BUEZhdWx0ID0gbnVsbDsKLSAgcHJpdmF0ZSBTT0FQT3BlcmF0aW9uIGFjdGl2ZVNPQVBPcGVyYXRpb24gPSBudWxsOwotCi0gIC8qKgotICAgKiBQYXJhbWV0ZXJzIG1hcAotICAgKi8KLSAgTWFwIHBhcmFtcyA9IG5ldyBUcmVlTWFwKCk7Ci0KLSAgLyoqCi0gICAqIEFjdGl2ZSB0cmF2ZXJzYWwuCi0gICAqLwotICBmaW5hbCBwcml2YXRlIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIHRyYXZlcnNhbAotICAgKi8KLSAgV1NETFRyYXZlcnNhbENvbnRleHQoV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwpCi0gIHsKLSAgICB0aGlzLnRyYXZlcnNhbCA9IHRyYXZlcnNhbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBhY3RpdmUgdHJhdmVyc2FsLgotICAgKiBAcmV0dXJuIHRoYSBhY3RpdmUgdHJhdmVyc2FsLgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgZ2V0VHJhdmVyc2FsKCkKLSAgewotICAgIHJldHVybiB0cmF2ZXJzYWw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBwYXJhbWV0ZXIgZnJvbSBjb250ZXh0IGJ5IHRoZSBnaXZlbiBrZXkuIAotICAgKiBAcGFyYW0ga2V5ICBhIGtleSB2YWx1ZS4KLSAgICogQHJldHVybiBhIHBhcmFtZXRlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBrZXkuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFBhcmFtZXRlcihPYmplY3Qga2V5KQotICB7Ci0gICAgcmV0dXJuIHBhcmFtcy5nZXQoa2V5KTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIHBhcmFtZXRlciBpbnRvIGNvbnRleHQgd2l0aCB0aGUgZ2l2ZW4ga2V5LgotICAgKiBAcGFyYW0ga2V5ICAgIHRoZSBrZXkuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIHBhcmFtcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlcyB0aGUgcGFyYW1ldGVyIGZyb20gY29udGV4dCBieSB0aGUgZ2l2ZW4ga2V5LgotICAgKiBAcGFyYW0ga2V5ICBhIGtleSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlcihPYmplY3Qga2V5KQotICB7Ci0gICAgcGFyYW1zLnJlbW92ZShrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHBhcnQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsUGFydFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc1BhcnQgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgc2VydmljZS4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxTZXJ2aWNlUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzU2VydmljZSA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCB0eXBlcy4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxUeXBlc1Byb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc1R5cGVzID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIG9wZXJhdGlvbi4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxPcGVyYXRpb25Qcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NPcGVyYXRpb24gPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgaW5wdXQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsSW5wdXRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NJbnB1dCA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBvdXRwdXQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsT3V0cHV0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzT3V0cHV0ID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGZhdWx0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbEZhdWx0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzRmF1bHQgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgYmluZGluZy4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxCaW5kaW5nUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzQmluZGluZyA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIG9wZXJhdGlvbi4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxCaW5kaW5nT3BlcmF0aW9uUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzQmluZGluZ09wZXJhdGlvbiA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIGlucHV0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbEJpbmRpbmdJbnB1dFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc0JpbmRpbmdJbnB1dCA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIG91dHB1dC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxCaW5kaW5nT3V0cHV0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzQmluZGluZ091dHB1dCA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIGZhdWx0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbEJpbmRpbmdGYXVsdFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc0JpbmRpbmdGYXVsdCA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBpbXBvcnQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsSW1wb3J0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzSW1wb3J0ID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsRWxlbWVudFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc0VsZW1lbnQgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgbWVzc2FnZS4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxNZXNzYWdlUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzTWVzc2FnZSA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBwb3J0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbFBvcnRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NQb3J0ID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHBvcnQgdHlwZS4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxQb3J0VHlwZVByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc1BvcnRUeXBlID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGRlZmluaXRpb24uIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsRGVmaW5pdGlvblByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc0RlZmluaXRpb24gPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbEV4dGVuc2liaWxpdHlFbGVtZW50UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBiaW5kaW5nLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbFNPQVBCaW5kaW5nUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzU09BUEJpbmRpbmcgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBoZWFkZXIuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsU09BUEhlYWRlclByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc1NPQVBIZWFkZXIgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBoZWFkZXIgZmF1bHQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsU09BUEhlYWRlckZhdWx0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzU09BUEhlYWRlckZhdWx0ID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIFNPQVAgZmF1bHQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsU09BUEZhdWx0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzU09BUEZhdWx0ID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIG9wZXJhdGlvbi4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxTT0FQT3BlcmF0aW9uUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzU09BUE9wZXJhdGlvbiA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbmNlbHMgV1NETCBlbGVtZW50cyBwcm9jZXNzaW5nLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbFByb2Nlc3NpbmcoKQotICB7Ci0gICAgY2FuY2VsUGFydFByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxTZXJ2aWNlUHJvY2Vzc2luZygpOwotICAgIGNhbmNlbFR5cGVzUHJvY2Vzc2luZygpOwotICAgIGNhbmNlbE9wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxJbnB1dFByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxPdXRwdXRQcm9jZXNzaW5nKCk7Ci0gICAgY2FuY2VsRmF1bHRQcm9jZXNzaW5nKCk7Ci0gICAgY2FuY2VsQmluZGluZ1Byb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxCaW5kaW5nT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICAgIGNhbmNlbEJpbmRpbmdJbnB1dFByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxCaW5kaW5nT3V0cHV0UHJvY2Vzc2luZygpOwotICAgIGNhbmNlbEJpbmRpbmdGYXVsdFByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxJbXBvcnRQcm9jZXNzaW5nKCk7Ci0gICAgY2FuY2VsRWxlbWVudFByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxNZXNzYWdlUHJvY2Vzc2luZygpOwotICAgIGNhbmNlbFBvcnRQcm9jZXNzaW5nKCk7Ci0gICAgY2FuY2VsUG9ydFR5cGVQcm9jZXNzaW5nKCk7Ci0gICAgY2FuY2VsRGVmaW5pdGlvblByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxFeHRlbnNpYmlsaXR5RWxlbWVudFByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxTT0FQQmluZGluZ1Byb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxTT0FQSGVhZGVyUHJvY2Vzc2luZygpOwotICAgIGNhbmNlbFNPQVBIZWFkZXJGYXVsdFByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxTT0FQRmF1bHRQcm9jZXNzaW5nKCk7Ci0gICAgY2FuY2VsU09BUE9wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBwYXJ0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZVBhcnRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NQYXJ0ID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgc2VydmljZS4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVTZXJ2aWNlUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzU2VydmljZSA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHR5cGVzLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZVR5cGVzUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzVHlwZXMgPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBvcGVyYXRpb24uIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lT3BlcmF0aW9uUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzT3BlcmF0aW9uID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgaW5wdXQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lSW5wdXRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NJbnB1dCA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIG91dHB1dC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVPdXRwdXRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NPdXRwdXQgPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBmYXVsdC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVGYXVsdFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc0ZhdWx0ID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgYmluZGluZy4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVCaW5kaW5nUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzQmluZGluZyA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZUJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NCaW5kaW5nT3BlcmF0aW9uID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgYmluZGluZyBpbnB1dC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVCaW5kaW5nSW5wdXRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NCaW5kaW5nSW5wdXQgPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIG91dHB1dC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVCaW5kaW5nT3V0cHV0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzQmluZGluZ091dHB1dCA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgZmF1bHQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lQmluZGluZ0ZhdWx0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzQmluZGluZ0ZhdWx0ID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgaW1wb3J0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZUltcG9ydFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc0ltcG9ydCA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lRWxlbWVudFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc0VsZW1lbnQgPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBtZXNzYWdlLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZU1lc3NhZ2VQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NNZXNzYWdlID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgcG9ydC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVQb3J0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzUG9ydCA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHBvcnQgdHlwZS4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVQb3J0VHlwZVByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc1BvcnRUeXBlID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZGVmaW5pdGlvbi4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVEZWZpbml0aW9uUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzRGVmaW5pdGlvbiA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVFeHRlbnNpYmlsaXR5RWxlbWVudFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc0V4dGVuc2liaWxpdHlFbGVtZW50ID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBiaW5kaW5nLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZVNPQVBCaW5kaW5nUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzU09BUEJpbmRpbmcgPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBTT0FQIGhlYWRlci4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVTT0FQSGVhZGVyUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzU09BUEhlYWRlciA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIFNPQVAgaGVhZGVyIGZhdWx0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZVNPQVBIZWFkZXJGYXVsdFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc1NPQVBIZWFkZXJGYXVsdCA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIFNPQVAgZmF1bHQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lU09BUEZhdWx0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzU09BUEZhdWx0ID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBvcGVyYXRpb24uIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lU09BUE9wZXJhdGlvblByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc1NPQVBPcGVyYXRpb24gPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHBhcnQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgcGFydCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1BhcnQoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NQYXJ0OwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHNlcnZpY2Ugc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgc2VydmljZSBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1NlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NTZXJ2aWNlOwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHR5cGVzIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHR5cGVzIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzVHlwZXMoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NUeXBlczsKLSAgfQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBvcGVyYXRpb24gc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgb3BlcmF0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzT3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBwcm9jZXNzT3BlcmF0aW9uOwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGlucHV0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGlucHV0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzSW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NJbnB1dDsKLSAgfQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBvdXRwdXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgb3V0cHV0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzT3V0cHV0KCkKLSAgewotICAgIHJldHVybiBwcm9jZXNzT3V0cHV0OwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGZhdWx0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGZhdWx0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzRmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NGYXVsdDsKLSAgfQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBwcm9jZXNzQmluZGluZzsKLSAgfQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc0JpbmRpbmdPcGVyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NCaW5kaW5nT3BlcmF0aW9uOwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgaW5wdXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgYmluZGluZyBpbnB1dCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc0JpbmRpbmdJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc0JpbmRpbmdJbnB1dDsKLSAgfQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIG91dHB1dCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIG91dHB1dCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc0JpbmRpbmdPdXRwdXQoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NCaW5kaW5nT3V0cHV0OwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgZmF1bHQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgYmluZGluZyBmYXVsdCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc0JpbmRpbmdGYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc0JpbmRpbmdGYXVsdDsKLSAgfQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBpbXBvcnQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgaW1wb3J0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzSW1wb3J0KCkKLSAgewotICAgIHJldHVybiBwcm9jZXNzSW1wb3J0OwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NFbGVtZW50OwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIG1lc3NhZ2Ugc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgbWVzc2FnZSBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NNZXNzYWdlOwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHBvcnQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgcG9ydCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1BvcnQoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NQb3J0OwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHBvcnQgdHlwZSBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBwb3J0IHR5cGUgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NQb3J0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc1BvcnRUeXBlOwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGRlZmluaXRpb24gc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZGVmaW5pdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc0RlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NEZWZpbml0aW9uOwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc0V4dGVuc2liaWxpdHlFbGVtZW50OwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIFNPQVAgYmluZGluZyBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBTT0FQIGJpbmRpbmcgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NTT0FQQmluZGluZygpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc1NPQVBCaW5kaW5nOwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIFNPQVAgaGVhZGVyIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIFNPQVAgaGVhZGVyIHNob3VsZCBiZSBwcm9jZXNzZWQubgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1NPQVBIZWFkZXIoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NTT0FQSGVhZGVyOwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIFNPQVAgaGVhZGVyIGZhdWx0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIFNPQSBoZWFkZXIgZmF1bHQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NTT0FQSGVhZGVyRmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NTT0FQSGVhZGVyRmF1bHQ7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBmYXVsdCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBTT0FQIGZhdWx0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzU09BUEZhdWx0KCkKLSAgewotICAgIHJldHVybiBwcm9jZXNzU09BUEZhdWx0OwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBvcGVyYXRpb24gc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NTT0FQT3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBwcm9jZXNzU09BUE9wZXJhdGlvbjsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIHBhcnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIHBhcnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRQYXJ0KFBhcnQgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVQYXJ0ID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBwYXJ0LgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIHBhcnQuCi0gICAqLwotICBwdWJsaWMgUGFydCBnZXRQYXJ0KCkKLSAgewotICAgIHJldHVybiBhY3RpdmVQYXJ0OwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgc2VydmljZSB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFdTREwgc2VydmljZSB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldFNlcnZpY2UoU2VydmljZSB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZVNlcnZpY2UgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIHNlcnZpY2UuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgc2VydmljZS4KLSAgICovCi0gIHB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZVNlcnZpY2U7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCB0eXBlcyB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFdTREwgdHlwZXMgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRUeXBlcyhUeXBlcyB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZVR5cGVzID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCB0eXBlcy4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCB0eXBlcy4KLSAgICovCi0gIHB1YmxpYyBUeXBlcyBnZXRUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlVHlwZXM7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBvcGVyYXRpb24gdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIG9wZXJhdGlvbiB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldE9wZXJhdGlvbihPcGVyYXRpb24gdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVPcGVyYXRpb24gPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIG9wZXJhdGlvbi4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBvcGVyYXRpb24uCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlT3BlcmF0aW9uOwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgaW5wdXQgdG8gYmUgcHJvY2Vzc2VkCi0gICAqIEBwYXJhbSB0aGUgV1NETCBpbnB1dCB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldElucHV0KElucHV0IHZhbHVlKQotICB7Ci0gICAgYWN0aXZlSW5wdXQgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIGlucHV0LgotICAgKiBAcmV0dXJuIGxhc3QgcHJvY2Vzc2VkIFdTREwgaW5wdXQuCi0gICAqLwotICBwdWJsaWMgSW5wdXQgZ2V0SW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZUlucHV0OwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgb3V0cHV0IHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBvdXRwdXQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRPdXRwdXQoT3V0cHV0IHZhbHVlKQotICB7Ci0gICAgYWN0aXZlT3V0cHV0ID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBvdXRwdXQuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgb3V0cHV0LgotICAgKi8KLSAgcHVibGljIE91dHB1dCBnZXRPdXRwdXQoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZU91dHB1dDsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGZhdWx0IHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBmYXVsdCB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldEZhdWx0KEZhdWx0IHZhbHVlKQotICB7Ci0gICAgYWN0aXZlRmF1bHQgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIGZhdWx0LgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIGZhdWx0LgotICAgKi8KLSAgcHVibGljIEZhdWx0IGdldEZhdWx0KCkKLSAgewotICAgIHJldHVybiBhY3RpdmVGYXVsdDsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGJpbmRpbmcgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIGJpbmRpbmcgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRCaW5kaW5nKEJpbmRpbmcgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVCaW5kaW5nID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBiaW5kaW5nLgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIGJpbmRpbmcuCi0gICAqLwotICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBhY3RpdmVCaW5kaW5nOwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgYmluZGluZyBvcGVyYXRpb24gdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBTREwgYmluZGluZyBvcGVyYXRpb24gdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVCaW5kaW5nT3BlcmF0aW9uID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBiaW5kaW5nIG9wZXJhdGlvbi4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBiaW5kaW5nIG9wZXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGdldEJpbmRpbmdPcGVyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZUJpbmRpbmdPcGVyYXRpb247Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBiaW5kaW5nIGlucHV0IHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBiaW5kaW5nIGlucHV0IHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0QmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZUJpbmRpbmdJbnB1dCA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgYmluZGluZyBpbnB1dC4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBiaW5kaW5nIGlucHV0LgotICAgKi8KLSAgcHVibGljIEJpbmRpbmdJbnB1dCBnZXRCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZUJpbmRpbmdJbnB1dDsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGJpbmRpbmcgb3V0cHV0IHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBiaW5kaW5nIG91dHB1dCB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldEJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZUJpbmRpbmdPdXRwdXQgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIGJpbmRpbmcgb3V0cHV0LgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIGJpbmRpbmcgb3V0cHV0LgotICAgKi8KLSAgcHVibGljIEJpbmRpbmdPdXRwdXQgZ2V0QmluZGluZ091dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlQmluZGluZ091dHB1dDsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGJpbmRpbmcgZmF1bHQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIGJpbmRpbmcgZmF1bHQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IHZhbHVlKQotICB7Ci0gICAgYWN0aXZlQmluZGluZ0ZhdWx0ID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBiaW5kaW5nIGZhdWx0LgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIGJpbmRpbmcgZmF1bHQuCi0gICAqLwotICBwdWJsaWMgQmluZGluZ0ZhdWx0IGdldEJpbmRpbmdGYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlQmluZGluZ0ZhdWx0OwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgaW1wb3J0IHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBpbXBvcnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRJbXBvcnQoSW1wb3J0IHZhbHVlKQotICB7Ci0gICAgYWN0aXZlSW1wb3J0ID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBpbXBvcnQuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgaW1wb3J0LgotICAgKi8KLSAgcHVibGljIEltcG9ydCBnZXRJbXBvcnQoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZUltcG9ydDsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVFbGVtZW50ID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBlbGVtZW50LgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBhY3RpdmVFbGVtZW50OwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgbWVzc2FnZSB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFdTREwgbWVzc2FnZSB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldE1lc3NhZ2UoTWVzc2FnZSB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZU1lc3NhZ2UgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZU1lc3NhZ2U7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBwb3J0IHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBwb3J0IHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0UG9ydChQb3J0IHZhbHVlKQotICB7Ci0gICAgYWN0aXZlUG9ydCA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgcG9ydC4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBwb3J0LgotICAgKi8KLSAgcHVibGljIFBvcnQgZ2V0UG9ydCgpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlUG9ydDsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIHBvcnQgdHlwZSB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFdTREwgcG9ydCB0eXBlIHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0UG9ydFR5cGUoUG9ydFR5cGUgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVQb3J0VHlwZSA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgcG9ydCB0eXBlLgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIHBvcnQgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBQb3J0VHlwZSBnZXRQb3J0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlUG9ydFR5cGU7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBkZWZpbml0aW9uIHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBkZWZpbml0aW9uIHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0RGVmaW5pdGlvbihEZWZpbml0aW9uIHZhbHVlKQotICB7Ci0gICAgYWN0aXZlRGVmaW5pdGlvbiA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBkZWZpbml0aW9uLgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlRGVmaW5pdGlvbjsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudCB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVFeHRlbnNpYmlsaXR5RWxlbWVudCA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBlbGVtZW50IHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBlbGVtZW50IHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0U09BUEJpbmRpbmcoU09BUEJpbmRpbmcgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVTT0FQQmluZGluZyA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgU09BUCBiaW5kaW5nLgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIFNPQVAgYmluZGluZy4KLSAgICovCi0gIHB1YmxpYyBTT0FQQmluZGluZyBnZXRTT0FQQmluZGluZygpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlU09BUEJpbmRpbmc7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBlbGVtZW50IHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICBXU0RMIGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRTT0FQQm9keShTT0FQQm9keSB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZVNPQVBCb2R5ID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBTT0FQIGJvZHkuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgU09BUCBib2R5LgotICAgKi8KLSAgcHVibGljIFNPQVBCb2R5IGdldFNPQVBCb2R5KCkKLSAgewotICAgIHJldHVybiBhY3RpdmVTT0FQQm9keTsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRTT0FQSGVhZGVyKFNPQVBIZWFkZXIgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVTT0FQSGVhZGVyID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBTT0FQIGhlYWRlci4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBTT0FQIGhlYWRlci4KLSAgICovCi0gIHB1YmxpYyBTT0FQSGVhZGVyIGdldFNPQVBIZWFkZXIoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZVNPQVBIZWFkZXI7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBlbGVtZW50IHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBlbGVtZW50IHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0U09BUEhlYWRlckZhdWx0KFNPQVBIZWFkZXJGYXVsdCB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZVNPQVBIZWFkZXJGYXVsdCA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgU09BUCBoZWFkZXIgZmF1bHQuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgU09BUCBoZWFkZXIgZmF1bHQuCi0gICAqLwotICBwdWJsaWMgU09BUEhlYWRlckZhdWx0IGdldFNPQVBIZWFkZXJGYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlU09BUEhlYWRlckZhdWx0OwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgZWxlbWVudCB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFdTREwgZWxlbWVudCB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldFNPQVBGYXVsdChTT0FQRmF1bHQgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVTT0FQRmF1bHQgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIFNPQVAgZmF1bHQuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgU09BUCBmYXVsdC4KLSAgICovCi0gIHB1YmxpYyBTT0FQRmF1bHQgZ2V0U09BUEZhdWx0KCkKLSAgewotICAgIHJldHVybiBhY3RpdmVTT0FQRmF1bHQ7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBlbGVtZW50IHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGVXU0RMIGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkCi0gICAqLwotICB2b2lkIHNldFNPQVBPcGVyYXRpb24oU09BUE9wZXJhdGlvbiB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZVNPQVBPcGVyYXRpb24gPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIFNPQVAgb3BlcmF0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIFNPQVAgb3BlcmF0aW9uLgotICAgKi8KLSAgcHVibGljIFNPQVBPcGVyYXRpb24gZ2V0U09BUE9wZXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlU09BUE9wZXJhdGlvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvdHJhdmVyc2FsL1dTRExWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC90cmF2ZXJzYWwvV1NETFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4MTYxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC90cmF2ZXJzYWwvV1NETFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWw7Ci0KLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBkZWZpbmVzIGNhbGxiYWNrIG1ldGhvZHMgZHVyaW5nIHRyYXZlcnNlIFdTREwuCi0gKiBXU0RMVmlzaXRvciBjb3VsZCBjYW5jZWwgYXJ0aWZhY3QgcHJvY2Vzc2luZyBieSB1c2luZyB0cmF2ZXJzYWwgY29udGV4dAotICogPGNvZGU+Y2FuY2VsWFhYUHJvY2Vzc2luZzwvY29kZT4gbWV0aG9kcy4KLSAqIAotICogQGF1dGhvciBLdWxpawotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExWaXNpdG9yCi17Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgcGFydCBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChQYXJ0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBzZXJ2aWNlIG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNlcnZpY2Ugb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIHR5cGVzIG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFR5cGVzIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBvcGVyYXRpb24gb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoT3BlcmF0aW9uIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBpbnB1dCBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChJbnB1dCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgb3V0cHV0IG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KE91dHB1dCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgZmF1bHQgb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoRmF1bHQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIGJpbmRpbmcgb2JqZWN0LgotICAgICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoQmluZGluZyBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgYmluZGluZyBvcGVyYXRpb24gb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgQmluZGluZ09wZXJhdGlvbiBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIGJpbmRpbmcgaW5wdXQgb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoQmluZGluZ0lucHV0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBiaW5kaW5nIG91dHB1dCBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChCaW5kaW5nT3V0cHV0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBiaW5kaW5nIGZhdWx0IG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEJpbmRpbmdGYXVsdCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgaW1wb3J0IG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEltcG9ydCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgZWxlbWVudCBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChFbGVtZW50IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBtZXNzYWdlIG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KE1lc3NhZ2Ugb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIHBvcnQgb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUG9ydCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgcG9ydCB0eXBlIG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFBvcnRUeXBlIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBkZWZpbml0aW9uIG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KERlZmluaXRpb24gb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudCBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIFNPQVAgYmluZGluZyBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQQmluZGluZyBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgU09BUCBib2R5IG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBCb2R5IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBTT0FQIGhlYWRlciBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQSGVhZGVyIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBTT0FQIGhlYWRlciBmYXVsdCBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQSGVhZGVyRmF1bHQgb2JqLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBTT0FQIGZhdWx0IG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBGYXVsdCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgU09BUCBvcGVyYXRpb24gb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4uCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBPcGVyYXRpb24gb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL0ZpbGVFbnRpdHlSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL0ZpbGVFbnRpdHlSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTA5MzA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9GaWxlRW50aXR5UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnhzZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEVudGl0eSByZXNvbHZlIHRvIHJlc29sdmUgZmlsZSBlbnRpdGllcy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgRmlsZUVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgWE1MRW50aXR5UmVzb2x2ZXIKLXsKLQotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcikKLSAgICovCi0gIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByZXNvdXJjZSkgdGhyb3dzIFhOSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwdWJsaWNJZCA9IHJlc291cmNlLmdldFB1YmxpY0lkKCk7Ci0gICAgU3RyaW5nIHN5c3RlbUlkID0gcmVzb3VyY2UuZ2V0RXhwYW5kZWRTeXN0ZW1JZCgpOwotICAgIFN0cmluZyBuYW1lc3BhY2UgPSByZXNvdXJjZS5nZXROYW1lc3BhY2UoKTsKLSAgICBVUkwgdXJsID0gbnVsbDsKLSAgICBpZihzeXN0ZW1JZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHVybCA9IG5ldyBVUkwoc3lzdGVtSWQpOwotICAgIH0KLSAgICBlbHNlIGlmKHB1YmxpY0lkICE9IG51bGwpCi0gICAgewotICAgICAgdXJsID0gbmV3IFVSTChwdWJsaWNJZCk7Ci0gICAgfQotICAgIGVsc2UgaWYobmFtZXNwYWNlICE9IG51bGwpCi0gICAgewotICAgICAgdXJsID0gbmV3IFVSTChuYW1lc3BhY2UpOwotICAgIH0KLSAgICBpZih1cmwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuU3RyZWFtKCk7Ci0gICAgICByZXR1cm4gbmV3IFhNTElucHV0U291cmNlKHB1YmxpY0lkLCByZXNvdXJjZS5nZXRFeHBhbmRlZFN5c3RlbUlkKCksIHJlc291cmNlLmdldEV4cGFuZGVkU3lzdGVtSWQoKSwgaXMsIG51bGwpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvSW5saW5lU2NoZW1hR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvSW5saW5lU2NoZW1hR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMTkwMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL0lubGluZVNjaGVtYUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogR2VuZXJhdGUgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzY2hlbWEgZm9yIGFuIGlubGluZSBzY2hlbWEuIFdpbGwgYWRkIGltcG9ydHMgZm9yIHVucmVzb2x2ZWQKLSAqIG5hbWVzcGFjZXMuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIElubGluZVNjaGVtYUdlbmVyYXRvcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNPQVBfRU5DT0RJTkdfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBGSUxFX1BSRUZJWCA9ICJmaWxlOi8vLyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRBUkdFVE5BTUVTUEFDRSA9ICJ0YXJnZXROYW1lc3BhY2UiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIElNUE9SVCA9ICJpbXBvcnQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIElOQ0xVREUgPSAiaW5jbHVkZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BID0gInNjaGVtYSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BTE9DQVRJT04gPSAic2NoZW1hTG9jYXRpb24iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGlnbm9yZU5hbWVzcGFjZXMgPQotICAgIHsgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSwgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCwgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMSB9OwotCi0gIHByb3RlY3RlZCBzdGF0aWMgSW5saW5lU2NoZW1hR2VuZXJhdG9yIGluc3RhbmNlID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgSW5saW5lU2NoZW1hR2VuZXJhdG9yKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgaW5zdGFuY2Ugb2YgdGhlIElubGluZVNjaGVtYUdlbmVyYXRvci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHRoZSBpbmxpbmUgc2NoZW1hIGdlbmVyYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgSW5saW5lU2NoZW1hR2VuZXJhdG9yIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IElubGluZVNjaGVtYUdlbmVyYXRvcigpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzY2hlbWEgZnJvbSB0aGUgZWxlbWVudCBwcm92aWRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGVsZW1lbnRzIEEgbGlzdCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSBpbiBvcmRlci4KLSAgICogQHBhcmFtIGZpbGVsb2NhdGlvbiBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHNjaGVtYS4KLSAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNjaGVtYS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVhTRFN0cmluZyhFbGVtZW50IGVsZW1lbnQsIExpc3QgZWxlbWVudHMsIFN0cmluZyBmaWxlbG9jYXRpb24pCi0gIHsKLSAgICByZXR1cm4gSW5saW5lU2NoZW1hR2VuZXJhdG9yLmNyZWF0ZVhTRFN0cmluZyhlbGVtZW50LCBlbGVtZW50cywgZmlsZWxvY2F0aW9uLCBuZXcgSGFzaHRhYmxlKCkpOwotICB9Ci0gIAotICAvKioKLSAgCSogQ3JlYXRlcyBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNjaGVtYSBtb2RlbCB3aXRoIHRoZSByb290IGVsZW1lbnQgb2YKLSAgCSogZXh0RWxlbS4gQ2FsbHMgY3JlYXRlWFNEU3RyaW5nUmVjdXJzaXZlbHkgdG8gdGFrZSBjYXJlIG9mIGJ1aWxkaW5nIHRoZSBTdHJpbmcKLSAgCSogYWZ0ZXIgaXQgb2J0YWlucyB0aGUgRWxlbWVudCBmcm9tIHRoZSBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQuCi0gIAkqIAotICAJKiBAcGFyYW0gZWxlbWVudCBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzY2hlbWEuCi0gIAkqIEBwYXJhbSBlbGVtZW50cyBBIGxpc3QgdG8gY29udGFpbiB0aGUgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSBpbiBvcmRlci4KLSAgCSogQHBhcmFtIGZpbGVsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgdGhlIHNjaGVtYSBpcyBsb2NhdGVkIGluLgotICAJKiBAcGFyYW0gcGFyZW50TlNzIEEgaGFzaHRhYmxlIG9mIHBhcmVudCBuYW1lc3BhY2VzIHRvIHVzZWQgdG8gcmVzb2x2ZSBwcmVmaXhlcy4KLSAgCSogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2NoZW1hIHdpdGggdGhlIHJvb3QgZWxlbWVudCAnZWxlbWVudCcuCi0gIAkqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVYU0RTdHJpbmcoRWxlbWVudCBlbGVtZW50LCBMaXN0IGVsZW1lbnRzLCBTdHJpbmcgZmlsZWxvY2F0aW9uLCBIYXNodGFibGUgcGFyZW50TlNzKQotICB7Ci0gICAgSW5saW5lU2NoZW1hR2VuZXJhdG9yIHNjaGVtYUdlbmVyYXRvciA9IElubGluZVNjaGVtYUdlbmVyYXRvci5nZXRJbnN0YW5jZSgpOwotICAgIEhhc2h0YWJsZSBuc1Jlc29sdmVyID0gc2NoZW1hR2VuZXJhdG9yLmdldE5TUmVzb2x2ZXIoZWxlbWVudCk7Ci0gICAgTGlzdCByZXFucyA9IHNjaGVtYUdlbmVyYXRvci5nZXRSZXF1aXJlZE5hbWVzcGFjZXMoZWxlbWVudCk7Ci0gICAgSGFzaHRhYmxlIHJlcU5TRGVjbCA9IHNjaGVtYUdlbmVyYXRvci5yZXNvbHZlTmFtZXNwYWNlcyhyZXFucywgbnNSZXNvbHZlciwgcGFyZW50TlNzKTsKLSAgICAvL0hhc2h0YWJsZSByZXFOU0RlY2wgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0UmVxdWlyZWROU0RlY2xhcmF0aW9ucyhyZXFucywgbnNSZXNvbHZlciwgcGFyZW50TlNzKTsKLSAgICBMaXN0IGltcG9ydE5TID0gc2NoZW1hR2VuZXJhdG9yLmdldEltcG9ydE5hbWVzcGFjZXMoZWxlbWVudCk7Ci0gICAgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IucmVtb3ZlSW1wb3J0cyhyZXFucywgaW1wb3J0TlMpOwotICAgIHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLnJlbW92ZUxvY2FsTmFtZXNwYWNlcyhyZXFucywgZWxlbWVudCk7Ci0gICAgcmV0dXJuIHNjaGVtYUdlbmVyYXRvci5jcmVhdGVYU0RTdHJpbmdSZWN1cnNpdmVseShlbGVtZW50LCBlbGVtZW50cywgcmVxbnMsIHJlcU5TRGVjbCwgZmlsZWxvY2F0aW9uKTsKLSAgfQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBpcyByZXF1aXJlZCBidXQgbm90IGltcG9ydGVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAgKiBAcGFyYW0gZmlsZWxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBwYXJlbnROU3MgQSBoYXNodGFibGUgb2YgdGhlIHBhcmVudCBuYW1lc3BhY2VzLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNvYXAgZW5jb2RpbmcgbmFtZXNwYWNlIGlzIHJlcXVpcmVkIGJ1dCBub3QgaW1wb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzb2FwRW5jb2RpbmdSZXF1aXJlZE5vdEltcG9ydGVkKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGZpbGVsb2NhdGlvbiwgSGFzaHRhYmxlIHBhcmVudE5TcykKLSAgewotICAgIElubGluZVNjaGVtYUdlbmVyYXRvciBzY2hlbWFHZW5lcmF0b3IgPSBJbmxpbmVTY2hlbWFHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLSAgICBIYXNodGFibGUgbnNSZXNvbHZlciA9IHNjaGVtYUdlbmVyYXRvci5nZXROU1Jlc29sdmVyKGVsZW1lbnQpOwotICAgIExpc3QgcmVxbnMgPSBudWxsOwotCi0gICAgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0UmVxdWlyZWROYW1lc3BhY2VzKGVsZW1lbnQpOwotICAgIHNjaGVtYUdlbmVyYXRvci5yZXNvbHZlTmFtZXNwYWNlcyhyZXFucywgbnNSZXNvbHZlciwgcGFyZW50TlNzKTsKLSAgICAvL3NjaGVtYUdlbmVyYXRvci5yZXNvbHZlVW5kZWNsYXJlZE5hbWVzcGFjZXMocmVxbnMsIHBhcmVudE5Tcyk7Ci0gICAgTGlzdCBpbXBvcnROUyA9IHNjaGVtYUdlbmVyYXRvci5nZXRJbXBvcnROYW1lc3BhY2VzKGVsZW1lbnQpOwotICAgIHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLnJlbW92ZUltcG9ydHMocmVxbnMsIGltcG9ydE5TKTsKLSAgICByZXFucyA9IHNjaGVtYUdlbmVyYXRvci5yZW1vdmVMb2NhbE5hbWVzcGFjZXMocmVxbnMsIGVsZW1lbnQpOwotCi0gICAgcmV0dXJuIHNjaGVtYUdlbmVyYXRvci5jaGVja1NPQVBFbmNvZGluZ1JlcXVpcmVkKHJlcW5zKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHJlY3Vyc2l2ZSBtZXRob2QgY3JlYXRlcyB0aGUgc2NoZW1hIFN0cmluZyBmcm9tIHRoZSByb290IEVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbSBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBlbGVtZW50cyBBIGxpc3QgdG8gYmUgY3JlYXRlZCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSBpbiBvcmRlci4KLSAgICogQHBhcmFtIHJlcXVpcmVkTmFtZXNwYWNlcyBBIGxpc3Qgb2YgcmVxdWlyZWQgbmFtZXNwYWNlcy4KLSAgICogQHBhcmFtIHJlcU5TRGVjbCBBIGhhc2h0YWJsZSBvZiByZXF1aXJlZCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLgotICAgKiBAcGFyYW0gZmlsZWxvY2F0aW9uIFRoZSB1cmkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGlzIHNjaGVtYS4KLSAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNjaGVtYS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlWFNEU3RyaW5nUmVjdXJzaXZlbHkoCi0gICAgRWxlbWVudCBlbGVtLAotICAgIExpc3QgZWxlbWVudHMsCi0gICAgTGlzdCByZXF1aXJlZE5hbWVzcGFjZXMsCi0gICAgSGFzaHRhYmxlIHJlcU5TRGVjbCwKLSAgICBTdHJpbmcgZmlsZWxvY2F0aW9uKQotICB7Ci0gICAgaWYgKGVsZW0gPT0gbnVsbCkKLSAgICAgIHJldHVybiAiIjsgLy8ganVzdCBpbiBjYXNlCi0KLSAgICBlbGVtZW50cy5hZGQoZWxlbSk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgeHNkU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IGVsZW0uZ2V0VGFnTmFtZSgpOwotICAgIHhzZFN0cmluZy5hcHBlbmQoIjwiKS5hcHBlbmQoZWxlbWVudE5hbWUpOwotCi0gICAgYm9vbGVhbiBmb3VuZFNjaGVtYUxvY2F0aW9uID0gZmFsc2U7IC8vIGZsYWcgaWYgc2NoZW1hbG9jYXRpb24gaXMgZGVmaW5lZAotICAgIFN0cmluZyBuYW1lc3BhY2UgPSAiIjsgLy8gdGhlIG5hbWVzcGFjZSBpZiB3ZSdyZSBjaGVja2luZyBhbiBpbXBvcnQgb3IgaW5jbHVkZQotICAgIFN0cmluZyBuYW1lUHJlZml4ID0gIiI7IC8vIHRoZSB4bWxucyBwcmVmaXggdXNlZCBmb3IgdGhlIGVsZW1lbnRzCi0gICAgLy8gR2V0IGFsbCBvZiB0aGUgYXR0cmlidXRlcyBmb3IgdGhpcyBlbGVtZW50IGFuZCBhcHBlbmQgdGhlbSB0byB0aGUgeHNkU3RyaW5nCi0gICAgTmFtZWROb2RlTWFwIGF0dHMgPSBlbGVtLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG4gPSBhdHRzLml0ZW0oaSk7Ci0gICAgICB4c2RTdHJpbmcuYXBwZW5kKCIgIikuYXBwZW5kKG4uZ2V0Tm9kZU5hbWUoKSkuYXBwZW5kKCI9XCIiKTsKLSAgICAgIFN0cmluZyBub2RlTmFtZSA9IG4uZ2V0Tm9kZU5hbWUoKTsKLSAgICAgIGlmIChub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNDSEVNQUxPQ0FUSU9OKSAmJiBmaWxlbG9jYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm91bmRTY2hlbWFMb2NhdGlvbiA9IHRydWU7Ci0gICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGggPSBuLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICB4c2RTdHJpbmcuYXBwZW5kKHJlbGF0aXZlUGF0aCkuYXBwZW5kKCJcIiIpOyAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmcgbm9kZVZhbHVlID0gbi5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTkFNRVNQQUNFKSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVzcGFjZSA9IG5vZGVWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBnZXQgdGhlIG5hbWUgcHJlZml4IGZvciB0aGlzIHNjaGVtYSB0byB1c2UgaW4gZ2VuZXJhdGluZyBpbXBvcnQgc3RhdGVtZW50cwotICAgICAgICBlbHNlIGlmIChub2RlTmFtZS5pbmRleE9mKFhNTE5TKSAhPSAtMSkKLSAgICAgICAgewotCi0gICAgICAgICAgaWYgKG5vZGVWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKGVsZW0uZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVQcmVmaXggPSBub2RlTmFtZTsKLSAgICAgICAgICAgIGlmIChuYW1lUHJlZml4LmVxdWFsc0lnbm9yZUNhc2UoWE1MTlMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuYW1lUHJlZml4ID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5hbWVQcmVmaXggPSBuYW1lUHJlZml4LnN1YnN0cmluZyg2KSArICI6IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVwbGFjZSBvbGQgc2NoZW1hIG5hbWVzcGFjZXMgd2l0aCB0aGUgbmV3IHNjaGVtYSBuYW1lc3BhY2UuCi0gICAgICAgIGlmKG5vZGVWYWx1ZS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSkgfHwgbm9kZVZhbHVlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAwKSkKLSAgICAgICAgIHsKLSAgICAgICAgICBub2RlVmFsdWUgPSBDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxOwotICAgICAgICB9Ci0gICAgICAgIHhzZFN0cmluZy5hcHBlbmQobm9kZVZhbHVlKS5hcHBlbmQoIlwiIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJpbXBvcnQiKSAmJiAhZm91bmRTY2hlbWFMb2NhdGlvbikKLSAgICB7Ci0gICAgICB4c2RTdHJpbmcuYXBwZW5kKCIgIikuYXBwZW5kKFNDSEVNQUxPQ0FUSU9OKS5hcHBlbmQoIj1cIiIpLmFwcGVuZChuYW1lc3BhY2UpLmFwcGVuZCgiXCIiKTsKLSAgICB9Ci0gICAgLy8gYWRkIGluIGFueSByZXF1aXJlZCBOUyBkZWNsYXJhdGlvbnMgZnJvbSBwYXJlbnQgZWxlbWVudHMKLSAgICBpZiAocmVxTlNEZWNsICE9IG51bGwpCi0gICAgewotICAgICAgRW51bWVyYXRpb24ga2V5cyA9IHJlcU5TRGVjbC5rZXlzKCk7Ci0gICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICBTdHJpbmcgZGVjbE5TID0gKFN0cmluZylyZXFOU0RlY2wuZ2V0KGtleSk7Ci0gICAgICAgIGlmKGRlY2xOUy5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSkgfHwgZGVjbE5TLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAwKSkKLSAgICAgICAgIHsKLSAgICAgICAgICBkZWNsTlMgPSBDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxOwotICAgICAgICB9Ci0gICAgICAgIHhzZFN0cmluZy5hcHBlbmQoIiAiKS5hcHBlbmQoa2V5KS5hcHBlbmQoIj1cIiIpLmFwcGVuZChkZWNsTlMpLmFwcGVuZCgiXCIiKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICB4c2RTdHJpbmcuYXBwZW5kKCI+Iik7Ci0gICAgaWYgKHJlcXVpcmVkTmFtZXNwYWNlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGlSZXF1aXJlZE5hbWVzcGFjZXMgPSByZXF1aXJlZE5hbWVzcGFjZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpUmVxdWlyZWROYW1lc3BhY2VzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZylpUmVxdWlyZWROYW1lc3BhY2VzLm5leHQoKTsKLQotICAgICAgICB4c2RTdHJpbmcKLSAgICAgICAgICAuYXBwZW5kKCI8IikKLSAgICAgICAgICAuYXBwZW5kKG5hbWVQcmVmaXgpCi0gICAgICAgICAgLmFwcGVuZChJTVBPUlQpCi0gICAgICAgICAgLmFwcGVuZCgiICIpCi0gICAgICAgICAgLmFwcGVuZChOQU1FU1BBQ0UpCi0gICAgICAgICAgLmFwcGVuZCgiPVwiIikKLSAgICAgICAgICAuYXBwZW5kKG5zKQotICAgICAgICAgIC5hcHBlbmQoIlwiICIpCi0gICAgICAgICAgLmFwcGVuZChTQ0hFTUFMT0NBVElPTikKLSAgICAgICAgICAuYXBwZW5kKCI9XCIiKQotICAgICAgICAgIC5hcHBlbmQobnMpCi0gICAgICAgICAgLmFwcGVuZCgiXCIvPiIpOwotICAgICAgfQotCi0gICAgfQotICAgIHhzZFN0cmluZy5hcHBlbmQoIlxuIik7Ci0KLSAgICAvLyBjYWxsIHRoZSBtZXRob2QgcmVjdXJzaXZlbHkgZm9yIGVhY2ggY2hpbGQgZWxlbWVudAotICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBlbGVtLmdldENoaWxkTm9kZXMoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSB8fCBpIDwgNTsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLSAgICAgIC8vIHdlIG9ubHkgd2FudCBub2RlcyB0aGF0IGFyZSBFbGVtZW50cwotICAgICAgaWYgKG4gaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBFbGVtZW50IGNoaWxkID0gKEVsZW1lbnQpbjsKLSAgICAgICAgeHNkU3RyaW5nLmFwcGVuZChjcmVhdGVYU0RTdHJpbmdSZWN1cnNpdmVseShjaGlsZCwgZWxlbWVudHMsIG51bGwsIG51bGwsIGZpbGVsb2NhdGlvbikpOwotICAgICAgfQotICAgIH0KLQotICAgIHhzZFN0cmluZy5hcHBlbmQoIjwvIikuYXBwZW5kKGVsZW0uZ2V0VGFnTmFtZSgpKS5hcHBlbmQoIj4iKTsKLQotICAgIHJldHVybiB4c2RTdHJpbmcudG9TdHJpbmcoKTsKLQotICB9Ci0gIC8qKgotICAgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgbmFtZXNwYWNlcyB0aGF0IGFyZSB1c2VkIGZvciBlbGVtZW50cyBvciB0eXBlcyBpbiB0aGUgc2NoZW1hLgotICAgKiBUaGVzZSBhcmUgdGhlIHJlcXVpcmVkIG5hbWVzcGFjZXMgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIHRoZSBlbG1lbnRzIGFyZSB2YWxpZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtIFRoZSBlbGVtZW50IHRvIGNoZWNrIGZvciByZXF1aXJlZCBuYW1lc3BhY2VzLgotICAgKiBAcmV0dXJuIEEgbGlzdCBvZiByZXF1aXJlZCBuYW1lc3BhY2VzIGZvciB0aGUgZWxlbWVudCBhbmQgYWxsIGl0cyBjaGlsZHJlbi4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IGdldFJlcXVpcmVkTmFtZXNwYWNlcyhFbGVtZW50IGVsZW0pCi0gIHsKLSAgICBMaXN0IG5hbWVzcGFjZSA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vIGNhbGwgdGhlIG1ldGhvZCByZWN1cnNpdmVseSBmb3IgZWFjaCBjaGlsZCBlbGVtZW50Ci0gICAgLy8gcmVnaXN0ZXIgYWxsIHRoZSBjaGlsZCB0eXBlcyBmaXJzdAotICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBlbGVtLmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgbnVtQ2hpbGRyZW4gPSBjaGlsZE5vZGVzLmdldExlbmd0aCgpOwotICAgIC8vIFRPRE86IHdoeSBpcyB0aGVyZSBhIDwgNSBjb25kaXRpb24/Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DaGlsZHJlbiAvKnx8IGkgPCA1Ki87IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG4gPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0gICAgICAvLyB3ZSBvbmx5IHdhbnQgbm9kZXMgdGhhdCBhcmUgRWxlbWVudHMKLSAgICAgIGlmIChuIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBjaGlsZCA9IChFbGVtZW50KW47Ci0gICAgICAgIExpc3QgY2hpbGRucyA9IGdldFJlcXVpcmVkTmFtZXNwYWNlcyhjaGlsZCk7Ci0gICAgICAgIGZvciAoaW50IGogPSBjaGlsZG5zLnNpemUoKSAtIDE7IGogPj0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZyljaGlsZG5zLmdldChqKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoIW5hbWVzcGFjZS5jb250YWlucyhucykpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZXNwYWNlLmFkZChucyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIEFkZCB0aGUgbmFtZXNwYWNlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQKLSAgICBTdHJpbmcgZWxlbU5TID0gZWxlbS5nZXRQcmVmaXgoKTsKLSAgICAvLyBpZiB0aGVyZSBpcyBubyBuYW1lc3BhY2UgcHJlZml4IHNldCBpdCB0byB0aGUgZW1wdHkgcHJlZml4LgotICAgIGlmKGVsZW1OUyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVsZW1OUyA9ICIiOwotICAgIH0KLSAgICBpZiAoIW5hbWVzcGFjZS5jb250YWlucyhlbGVtTlMuaW50ZXJuKCkpKQotICAgICB7Ci0gICAgICBuYW1lc3BhY2UuYWRkKGVsZW1OUy5pbnRlcm4oKSk7Ci0gICAgfQotICAgIC8vIG5vdyBhZGQgYWxsIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQncyBuYW1lc3BhY2VzCi0gICAgLy8gZG9uJ3QgaW5jbHVkZSBpbXBvcnQgYW5kIHNjaGVtYSBlbGVtZW50cwotICAgIFN0cmluZyBsb2NhbG5hbWUgPSBlbGVtLmdldExvY2FsTmFtZSgpOwotICAgIGlmICghbG9jYWxuYW1lLmVxdWFscyhJTVBPUlQpICYmICFsb2NhbG5hbWUuZXF1YWxzKElOQ0xVREUpICYmICFsb2NhbG5hbWUuZXF1YWxzKFNDSEVNQSkpCi0gICAgewotICAgICAgTmFtZWROb2RlTWFwIGF0dHMgPSBlbGVtLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIG4gPSBhdHRzLml0ZW0oaSk7Ci0KLSAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gbi5nZXROb2RlTmFtZSgpOwotICAgICAgICAvLyByZW1vdmVkIHJlc3RyaWN0aW9uIHRoYXQgd2UncmUgb25seSBsb29raW5nIGF0IHR5cGVzCi0gICAgICAgIC8vCQlpZiAobm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShUWVBFKSkKLSAgICAgICAgLy8JCXsKLSAgICAgICAgLy8gZG9uJ3QgdGFrZSBuYW1lc3BhY2UgaW5mbyBmcm9tIGF0dHJpYnV0ZXMgZGVmaW5pbmcgbmFtZXNwYWNlcy4KLSAgICAgICAgLy8gdGhhdCBpbmNsdWRlcyB4bWxucywgdGFyZ2V0TmFtZXNwYWNlCi0gICAgICAgIC8vIGRvbid0IHRha2UgbmFtZXNwYWNlIGluZm8gZnJvbSBuYW1lIGF0dHJpYnV0ZXMKLSAgICAgICAgaWYgKG5vZGVOYW1lLmluZGV4T2YoWE1MTlMpICE9IC0xIHx8IG5vZGVOYW1lLmVxdWFscyhUQVJHRVROQU1FU1BBQ0UpIHx8IG5vZGVOYW1lLmVxdWFscyhOQU1FKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBub2RlVmFsdWUgPSBuLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGludCBjb2xvbkluZGV4ID0gbm9kZVZhbHVlLmluZGV4T2YoIjoiKTsKLSAgICAgICAgLy8gRG9uJ3QgdGFrZSBuYW1lc3BhY2UgaW5mbyBmcm9tIGF0dHJpYnV0ZXMgd2l0aCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UsIHRoYXQgaXMgYXR0cmlidXRlcwotICAgICAgICAvLyB0aGF0IGFyZSBub3QgcHJlZml4ZWQuIChjb2xvbkluZGV4ID09IC0xKQotICAgICAgICAvLyBJZiB0aGUgY29sb25JbmRleCBpcyBmb2xsb3dlZCBieSBhIC8gdGhlbiBpdCBpcyBhIFVSSSBhbmQgbm90Ci0gICAgICAgIC8vIG5hbWVzcGFjZSBxdWFsaWZpZWQuCi0gICAgICAgIGlmIChjb2xvbkluZGV4ID09IC0xIHx8IG5vZGVWYWx1ZS5jaGFyQXQoY29sb25JbmRleCArIDEpID09ICcvJykKLSAgICAgICAgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGhlcmUgd2UgaGF2ZSBmb3VuZCBhIGNvbG9uIGRlbGltaXRlciBzbyB3ZSBuZWVkIHRoZSBuYW1lc3BhY2UgZGVmaW5lZCBoZXJlCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5vZGVWYWx1ZSA9IG5vZGVWYWx1ZS5zdWJzdHJpbmcoMCwgY29sb25JbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFuYW1lc3BhY2UuY29udGFpbnMobm9kZVZhbHVlLmludGVybigpKSkKLSAgICAgICAgewotCi0gICAgICAgICAgbmFtZXNwYWNlLmFkZChub2RlVmFsdWUuaW50ZXJuKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vCQl9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBuYW1lc3BhY2VzIHRoYXQgaGF2ZSBhbiBpbXBvcnQgc3RhdGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW0gVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBhbGwgdGhlIG5hbWVzcGFjZXMgdGhhdCBhcmUgaW1wb3J0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCBnZXRJbXBvcnROYW1lc3BhY2VzKEVsZW1lbnQgZWxlbSkKLSAgewotICAgIExpc3QgbmFtZXNwYWNlID0gbmV3IFZlY3RvcigpOwotCi0gICAgLy8gY2FsbCB0aGUgbWV0aG9kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICAvLyByZWdpc3RlciBhbGwgdGhlIGNoaWxkIHR5cGVzIGZpcnN0Ci0gICAgTm9kZUxpc3QgY2hpbGROb2RlcyA9IGVsZW0uZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpIHx8IGkgPCA1OyBpKyspCi0gICAgewotICAgICAgTm9kZSBuID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotICAgICAgLy8gd2Ugb25seSB3YW50IG5vZGVzIHRoYXQgYXJlIEVsZW1lbnRzCi0gICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCluOwotICAgICAgICBMaXN0IGNoaWxkbnMgPSBnZXRJbXBvcnROYW1lc3BhY2VzKGNoaWxkKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IGNoaWxkbnMuc2l6ZSgpIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKWNoaWxkbnMuZ2V0KGopOwotICAgICAgICAgIGlmICghbmFtZXNwYWNlLmNvbnRhaW5zKG5zKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lc3BhY2UuYWRkKG5zKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gaWYgdGhpcyBpcyBhbiBpbXBvcnQgZWxlbWVudCBnZXQgdGhlIG5hbWVzcGFjZSBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgaWYgKGVsZW0uZ2V0TG9jYWxOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShJTVBPUlQpKQotICAgIHsKLSAgICAgIE5hbWVkTm9kZU1hcCBhdHRzID0gZWxlbS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBuID0gYXR0cy5pdGVtKGkpOwotCi0gICAgICAgIFN0cmluZyBub2RlTmFtZSA9IG4uZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTkFNRVNQQUNFKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBub2RlVmFsdWUgPSBuLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgIGlmICghbmFtZXNwYWNlLmNvbnRhaW5zKG5vZGVWYWx1ZS5pbnRlcm4oKSkpCi0gICAgICAgICAgewotCi0gICAgICAgICAgICBuYW1lc3BhY2UuYWRkKG5vZGVWYWx1ZS5pbnRlcm4oKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIEhhc2h0YWJsZSB3aXRoIG5hbWVzcGFjZSBwcmVmaXhlcyBhcyBrZXlzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbSBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzY2hlbWEuCi0gICAqIEByZXR1cm4gQSBoYXNodGFibGUgd2l0aCBuYW1lc3BhY2UgcHJlZml4ZXMgbWFwcGVkIHRvIG5hbWVzcGFjZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldE5TUmVzb2x2ZXIoRWxlbWVudCBlbGVtKQotICB7Ci0gICAgSGFzaHRhYmxlIG5zUmVzb2x2ZXIgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW0uZ2V0QXR0cmlidXRlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cy5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbiA9IGF0dHMuaXRlbShpKTsKLQotICAgICAgU3RyaW5nIG5vZGVOYW1lID0gbi5nZXROb2RlTmFtZSgpOwotICAgICAgaWYgKG5vZGVOYW1lLmluZGV4T2YoWE1MTlMpICE9IC0xKQotICAgICAgewotICAgICAgICBTdHJpbmcgbm9kZVZhbHVlID0gbi5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVQcmVmaXggPSBub2RlTmFtZTsKLQotICAgICAgICBpZiAobmFtZVByZWZpeC5lcXVhbHNJZ25vcmVDYXNlKFhNTE5TKSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVQcmVmaXggPSAiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lUHJlZml4ID0gbmFtZVByZWZpeC5zdWJzdHJpbmcoNik7Ci0gICAgICAgIH0KLSAgICAgICAgbnNSZXNvbHZlci5wdXQobmFtZVByZWZpeCwgbm9kZVZhbHVlKTsKLQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnNSZXNvbHZlcjsKLQotICB9Ci0KLSAgLyoqCi0gICAqIFJlc29sdmUgdGhlIG5hbWVzcGFjZXMgaW4gdGhlIGdpdmVuIG5hbWVzcGFjZXMgbGlzdCB3aXRoIHRoZSB0d28gbmFtZXNwYWNlCi0gICAqIHJlc29sdmVyIGhhc2h0YWJsZXMgcHJvdmlkZWQuIFJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBuYW1lc3BhY2UgdGhhdCBuZWVkCi0gICAqIHRvIGJlIGRlY2xhcmVkLgotICAgKiBGaXJzdCByZXNvbHZlIGFnYWluc3QgdGhlIGxvY2FsIG5hbWVzcGFjZXMgd2l0aCBuc1Jlc29sdmVyLgotICAgKiBOZXh0IHJlc29sdmUgYWdhaW5zdCB0aGUgcGFyZW50IG5hbWVzcGFjZSB3aXRoIHBhcmVudE5TUmVzb2x2ZXIuCi0gICAqIEEgc2lkZSBhZmZlY3Qgb2YgdGhpcyBtZXRob2QgaXMgdGhlIG5hbWVzcGFjZXMgbGlzdCBpcyBsZWZ0IHdpdGggb25seSB0aG9zZSAKLSAgICogbmFtZXNwYWNlcyB0aGF0IGFyZSByZXNvbHZlZCBhbmQgdGhlIHJlc29sdmVkIGVudGl0aWVzIGFyZSBwbGFjZWQgaW4gdGhlIAotICAgKiBsaXN0IGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGVudHJpZXMuCi0gICAqIEZvciBleC4gSWYgeW91IHByb3ZpZGUgYSBsaXN0IHN1Y2ggYXMge3hzZCwgaW50Zn0gYW5kIG9ubHkgeHNkIGNhbiBiZSByZXNvbHZlZAotICAgKiB5b3Ugd2lsbCBlbmQgdXAgd2l0aCB0aGUgbGlzdCB7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9Ci0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlcyBUaGUgbGlzdCBvZiBuYW1lc3BhY2VzIHRvIHJlc29sdmUuCi0gICAqIEBwYXJhbSBuc1Jlc29sdmVyIFRoZSBoYXNodGFibGUgdG8gYmUgdXNlZCBhcyB0aGUgbG9jYWwgcmVzb2x2ZXIuCi0gICAqIEBwYXJhbSBwYXJlbnROU1Jlc29sdmVyIFRoZSBoYXNodGFibGUgdG8gYmUgdXNlZCBhcyB0aGUgcGFyZW50IG5hbWVzcGFjZSByZXNvbHZlci4KLSAgICogQHJldHVybiBBIEhhc2h0YWJsZSBvZiBuYW1lc3BhY2VzIHRoYXQgbXVzdCBiZSBkZWNsYXJlZC4KLSAgICovCi0gIHByb3RlY3RlZCBIYXNodGFibGUgcmVzb2x2ZU5hbWVzcGFjZXMoTGlzdCBuYW1lc3BhY2VzLCBIYXNodGFibGUgbnNSZXNvbHZlciwgSGFzaHRhYmxlIHBhcmVudE5TUmVzb2x2ZXIpCi0gIHsKLSAgCUhhc2h0YWJsZSByZXFOU0RlY2wgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgaWYgKG5hbWVzcGFjZXMgIT0gbnVsbCAmJiAhbmFtZXNwYWNlcy5pc0VtcHR5KCkgJiYgbnNSZXNvbHZlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSBuYW1lc3BhY2VzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgewotICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKW5hbWVzcGFjZXMuZ2V0KGkpOwotICAgICAgICAvLyBSZW1vdmUgdGhlIG5hbWVzcGFjZSBmcm9tIHRoZSBsaXN0LgotICAgICAgICBuYW1lc3BhY2VzLnJlbW92ZShpKTsKLSAgICAgICAgLy8gRmlyc3QgdHJ5IHRvIHJlc29sdmUgYWdhaW5zdCB0aGUgbG9jYWwgbmFtZXNwYWNlIHJlc29sdmVyLgotICAgICAgICBpZiAobnNSZXNvbHZlci5jb250YWluc0tleShucykpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3QgcmVzb2x2ZWROUyA9IG5zUmVzb2x2ZXIuZ2V0KG5zKTsKLSAgICAgICAgICAvLyBPbmx5IGFkZCB0aGUgbmFtZXNwYWNlIGlmIGl0J3Mgbm90IGFscmVhZHkgaW4gdGhlIGxpc3QuCi0gICAgICAgICAgaWYoIW5hbWVzcGFjZXMuY29udGFpbnMocmVzb2x2ZWROUykpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZXNwYWNlcy5hZGQoaSwgbnNSZXNvbHZlci5nZXQobnMpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTmV4dCB0cnkgdG8gcmVzb2x2ZSBhZ2FpbnN0IHRoZSBwYXJlbnQgbmFtZXNwYWNlIHJlc29sdmVyLgotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgCWlmIChucy5lcXVhbHMoIiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBucyA9IFhNTE5TOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBucyA9IFhNTE5TICsgIjoiICsgbnM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyZW50TlNSZXNvbHZlci5jb250YWluc0tleShucykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE9iamVjdCByZXNvbHZlZE5TID0gcGFyZW50TlNSZXNvbHZlci5nZXQobnMpOwotICAgICAgICAgICAgICAvLyBPbmx5IGFkZCB0aGUgbmFtZXNwYWNlIGlmIGl0J3Mgbm90IGFscmVhZHkgaW4gdGhlIGxpc3QuCi0gICAgICAgICAgICAgIGlmKCFuYW1lc3BhY2VzLmNvbnRhaW5zKHJlc29sdmVkTlMpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5hZGQoaSwgcmVzb2x2ZWROUyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgLy8gU3RpbGwgbmVlZCB0byBkZWNsYXJlIHRoZSBuYW1lc3BhY2UgdGhvdWdoLgotICAgICAgICAgICAgICByZXFOU0RlY2wucHV0KG5zLCByZXNvbHZlZE5TKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXFOU0RlY2w7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlIGFueSBuYW1lc3BhY2UgZnJvbSB0aGUgbmFtZXNwYWNlcyBsaXN0IGlmIGl0IGlzIGluIHRoZSBpbXBvcnQgbGlzdC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VzIFRoZSBuYW1lc3BhY2VzIGxpc3QuCi0gICAqIEBwYXJhbSBpbXBvcnRlZE5hbWVzcGFjZXMgQSBsaXN0IG9mIGltcG9ydGVkIG5hbWVzcGFjZXMuCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyB3aXRob3V0IHRoZSBpbXBvcnRlZCBuYW1lc3BhY2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgcmVtb3ZlSW1wb3J0cyhMaXN0IG5hbWVzcGFjZXMsIExpc3QgaW1wb3J0ZWROYW1lc3BhY2VzKQotICB7Ci0gICAgaWYgKG5hbWVzcGFjZXMgIT0gbnVsbCAmJiBpbXBvcnRlZE5hbWVzcGFjZXMgIT0gbnVsbCAmJiAhaW1wb3J0ZWROYW1lc3BhY2VzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpSW1wb3J0ZWROUyA9IGltcG9ydGVkTmFtZXNwYWNlcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGlJbXBvcnRlZE5TLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGlOUyA9IChTdHJpbmcpaUltcG9ydGVkTlMubmV4dCgpOwotCi0gICAgICAgIG5hbWVzcGFjZXMucmVtb3ZlKGlOUyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuYW1lc3BhY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSB0aGUgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgc2NoZW1hIGFuZCB0aGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gdGhlIGlnbm9yZU5hbWVzcGFjZXMKLSAgICogbGlzdCBmcm9tIHRoZSBuYW1lc3BhY2VzIGxpc3QgcHJvdmlkZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlcyBUaGUgbGlzdCBvZiBsb2NhbCBuYW1lc3BhY2VzLgotICAgKiBAcGFyYW0gZWxlbSBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzY2hlbWEuCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyB3aXRoIHRoZSBsb2NhbCBuYW1lc3BhY2VzIHJlbW92ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCByZW1vdmVMb2NhbE5hbWVzcGFjZXMoTGlzdCBuYW1lc3BhY2VzLCBFbGVtZW50IGVsZW0pCi0gIHsKLSAgICBpZiAobmFtZXNwYWNlcyAhPSBudWxsICYmIGVsZW0gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbnMgPSBlbGVtLmdldEF0dHJpYnV0ZShUQVJHRVROQU1FU1BBQ0UpOwotICAgICAgbmFtZXNwYWNlcy5yZW1vdmUobnMpOwotCi0gICAgICBmb3IgKGludCBpID0gaWdub3JlTmFtZXNwYWNlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgLy8ga2VlcCByZW1vdmluZyB0aGUgbmFtZXNwYWNlIHVudGlsIGl0IGlzIG5vdCBpbiB0aGUgbGlzdAotICAgICAgICBpZiAobmFtZXNwYWNlcy5yZW1vdmUoaWdub3JlTmFtZXNwYWNlc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5hbWVzcGFjZXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIGlzIGluIHRoZSBsaXN0IG9mIHJlcXVpcmVkIG5hbWVzcGFjZXMsCi0gICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEBwYXJhbSByZXFucyBUaGUgbGlzdCBvZiBuYW1lc3BhY2VzIHRvIGNoZWNrIGZvciB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2VzIGlzIGluIHRoZSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1NPQVBFbmNvZGluZ1JlcXVpcmVkKExpc3QgcmVxbnMpCi0gIHsKLSAgICBpZiAocmVxbnMuY29udGFpbnMoU09BUF9FTkNPRElOR19VUkkpKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9JbmxpbmVTY2hlbWFWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9JbmxpbmVTY2hlbWFWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1OWRlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvSW5saW5lU2NoZW1hVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwueHNkOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuQ29uc3RhbnRzOwotCi0vKioKLSAqIFBsdWdpbiB2YWxpZGF0b3IgZm9yIHRoZSBXU0RMIFZhbGlkYXRpb24gZnJhbWV3b3JrLiBWYWxpZGF0ZXMgaW5saW5lIHNjaGVtYSBmb3VuZCBpbiBhIFdTREwgZG9jdW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsIChsbWFuZGVsQGNhLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmxpbmVTY2hlbWFWYWxpZGF0b3IKLXsKLSAgTGlzdCBlbGVtZW50cyA9IG51bGw7Ci0KLQotICBwdWJsaWMgTWFwIHZhbGlkYXRlKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gIAllbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWxlbSA9IChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0gICAgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBwYXJlbnRzLmdldChwYXJlbnRzLnNpemUoKSAtIDEpOwotICAgIC8vIEFkZCBpbiB0aGUgbmFtZXNwYWNlcyBkZWZpbmVkIGluIHRoZSBkb2MgYWxyZWFkeSB0aGF0IGFyZW4ndCBkZWZpbmVkIGxvY2FsbHkgaW4gdGhpcyBzY2hlbWEuCi0gICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBmb3IgbmFtZXNwYWNlcyBvdGhlciB0aGVuIGluIHRoZSBkZWZpbnRpb25zIGFuZCB0eXBlcyBlbGVtZW50cyBhcwotICAgIC8vIGlubGluZSBzY2hlbWEgY2FuIG5vdCBoYXZlIGFueSBvdGhlciBwYXJlbnRzIGFuZCBtdXN0IGhhdmUgdGhlcmUgdHdvIHBhcmVudHMuCi0gICAgLy8gRmlyc3QgdGFrZSBjYXJlIG9mIHRoZSBkZWZpbml0aW9ucyBlbGVtZW50Ci0KLSAgICAvLyBjcmVhdGUgdGhlIGlubGluZSBzY2hlbWEgc3RyaW5nCi0JRWxlbWVudCB3M2NlbGVtZW50ID0gZWxlbS5nZXRFbGVtZW50KCk7Ci0JSGFzaHRhYmxlIHBhcmVudG5hbWVzcGFjZXMgPSBnZXROYW1lc3BhY2VEZWNsYXJhdGlvbnNGcm9tUGFyZW50cyh3c2RsRGVmaW5pdGlvbix3M2NlbGVtZW50KTsKLQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gdzNjZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfVEFSR0VUX05BTUVTUEFDRSk7Ci0JLy8gaWYgdGhlIHRhcmdldE5hbWVzcGFjZSBoYXNuJ3QgYmVlbiBkZWZpbmVkIGZvciB0aGUgc2NoZW1hIHVzZSB0aGUgCi0JLy8gdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSBkZWZpbml0aW9ucyBlbGVtZW50Ci0JLyppZih0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCB8fCB0YXJnZXROYW1lc3BhY2UuZXF1YWxzKCIiKSkKLQkgewotCSAgdGFyZ2V0TmFtZXNwYWNlID0gd3NkbERlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JICB3M2NlbGVtZW50LnNldEF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9UQVJHRVRfTkFNRVNQQUNFLHRhcmdldE5hbWVzcGFjZSk7Ci0JfSovCi0KLQlTdHJpbmcgeHNkID0gSW5saW5lU2NoZW1hR2VuZXJhdG9yLmNyZWF0ZVhTRFN0cmluZyh3M2NlbGVtZW50LCBlbGVtZW50cywgZmlsZW5hbWUsIHBhcmVudG5hbWVzcGFjZXMpOwotCi0gICAgLy8gSWYgdGhlIG5hbWVzcGFjZSBnaXZlbiBpcyBvbmUgb2YgdGhlIG9sZCBzY2hlbWEgbmFtZXNwYWNlcyBwcm9kdWNlIGEgd2FybmluZy4KLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gdzNjZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICBpZihuYW1lc3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpIHx8IG5hbWVzcGFjZS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQW4gb2xkIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLiIpOwotICAgIH0KLQotICAgIC8vIG5vdyBjcmVhdGUgYW5kIGNhbGwgdGhlIHZhbGlkYXRvciBmb3IgdGhlIGlubGluZSBzY2hlbWEKLSAgICBYU0RWYWxpZGF0b3Igc2NoZW1hdiA9IG5ldyBYU0RWYWxpZGF0b3IoKTsKLQotICAgIC8vU3RyaW5nIGZpbGVMb2NhdGlvbiA9IG5ldyBVUkwodmFsaWRhdG9ybWFuYWdlci5nZXRGaWxlbmFtZSgpKS5nZXRQYXRoKCk7Ci0gICAgSW5saW5lWFNEUmVzb2x2ZXIgaW5saW5lRW50aXR5UmVzb2x2ZXIgPQotICAgICAgZ2V0RW50aXR5UmVzb2x2ZXIod3NkbERlZmluaXRpb24sIChUeXBlcykgcGFyZW50cy5nZXQoMCksIGZpbGVuYW1lLCB0YXJnZXROYW1lc3BhY2UpOwotICAgIC8vCWFkZCBpbiB0aGUgZXh0ZXJuYWwgWFNEIENhdGFsb2cgdG8gcmVzb2x2ZSBzY2hlbWFzIG9mZmxpbmUKLSAgICBYTUxFbnRpdHlSZXNvbHZlckNoYWluIGVudGl0eVJlc29sdmVyQ2hhaW4gPSBuZXcgWE1MRW50aXR5UmVzb2x2ZXJDaGFpbigpOwotICAgIGVudGl0eVJlc29sdmVyQ2hhaW4uYWRkRW50aXR5UmVzb2x2ZXIoaW5saW5lRW50aXR5UmVzb2x2ZXIpOwotICAgIGVudGl0eVJlc29sdmVyQ2hhaW4uYWRkRW50aXR5UmVzb2x2ZXIobmV3IEZpbGVFbnRpdHlSZXNvbHZlcigpKTsKLSAgICBlbnRpdHlSZXNvbHZlckNoYWluLmFkZEVudGl0eVJlc29sdmVyKFhNTENhdGFsb2dSZXNvbHZlci5nZXRJbnN0YW5jZSgpKTsKLSAgICBzY2hlbWF2LnZhbGlkYXRlSW5saW5lU2NoZW1hKHhzZCwgdGFyZ2V0TmFtZXNwYWNlLCBmaWxlbmFtZSwgZW50aXR5UmVzb2x2ZXJDaGFpbiwgaW5saW5lRW50aXR5UmVzb2x2ZXIpOwotCi0gICAgLy8gY2hlY2sgaWYgdGhlIFNPQVAgRW5jb2RpbmcgbmFtZXNwYWNlIGlzIHJlcXVpcmVkIGJ1dCBub3QgaW1wb3J0ZWQKLSAgICBpZiAoSW5saW5lU2NoZW1hR2VuZXJhdG9yLnNvYXBFbmNvZGluZ1JlcXVpcmVkTm90SW1wb3J0ZWQoZWxlbS5nZXRFbGVtZW50KCksIGZpbGVuYW1lLHBhcmVudG5hbWVzcGFjZXMpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBpbmxpbmUgc2NoZW1hIHVzZXMgYW4gZWxlbWVudCBvciB0eXBlIGZyb20gIgotICAgICAgICArICJ0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UgYnV0IHRoZSBuYW1lc3BhY2UgaGFzIG5vdCBiZWVuIGltcG9ydGVkLiAiCi0gICAgICAgICsgIlRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBzaG91bGQgYmUgaW1wb3J0ZWQgd2l0aCBhbiBpbXBvcnQgIgotICAgICAgICArICJzdGF0ZW1lbnQgYmVmb3JlIGl0IGlzIHVzZWQuIik7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIHNjaGVtYSBpc24ndCB2YWxpZAotICAgIGlmICghc2NoZW1hdi5pc1ZhbGlkKCkpCi0gICAgewotICAgICAgLy8gR2F0aGVyaW5nIGFsbCB0aGUgZXJyb3JzCi0gICAgICBTdHJpbmdCdWZmZXIgZXhjZXB0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgSXRlcmF0b3IgaSA9IHNjaGVtYXYuZ2V0RXJyb3JzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgZXhjZXB0aW9uLmFwcGVuZChpLm5leHQoKSkuYXBwZW5kKCdcbicpOwotICAgICAgfQotICAgICAgLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGV4Y2VwdGlvbi50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgLy8gaWYgdGhlIHNjaGVtYSBpcyB2YWxpZAotICAgIGVsc2UKLSAgICB7Ci0gICAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoMSk7Ci0gICAgICBtYXAucHV0KHRhcmdldE5hbWVzcGFjZSwgc2NoZW1hdi5nZXRYU01vZGVsKCkpOwotICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGFuIGVudGl0eSByZXNvbHZlciB0aGF0IHdpbGwgcmVzb2x2ZSBpbmxpbmUgc2NoZW1hcy4gIEV2ZXJ5IGlubGluZSBzY2hlbWEgaXMgcHJlcmVnaXN0ZXJlZCB3aXRoCi0gICAqIHRoZSByZXNvbHZlci4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcGFyYW0gdHlwZXMgVGhlIHR5cGVzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSByZWZlcmVuY2VMb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGlzIHNjaGVtYS4KLSAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEuCi0gICAqIEByZXR1cm4gQW4gZW50aXR5IHJlc29sdmVyIHRoYXQgY2FuIHJlc29sdmUgaW5saW5lIHNjaGVtYXMuCi0gICAqLwotICBwcm90ZWN0ZWQgSW5saW5lWFNEUmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgVHlwZXMgdHlwZXMsIFN0cmluZyByZWZlcmVuY2VMb2NhdGlvbiwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkKLSAgewotICAgIElubGluZVhTRFJlc29sdmVyIGVudGl0eVJlc29sdmVyID0gbmV3IElubGluZVhTRFJlc29sdmVyKCk7Ci0vLyAgICBlbnRpdHlSZXNvbHZlci5zZXRSZWZlcmVuY2VMb2NhdGlvbihyZWZlcmVuY2VMb2NhdGlvbik7Ci0gICAgTGlzdCBzY2hlbWFzID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgaWYgKHNjaGVtYXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpU2NoZW1hcyA9IHNjaGVtYXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpU2NoZW1hcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgaVNjaGVtYXMubmV4dCgpOwotICAgICAgICBTdHJpbmcgdGhpc05hbWVzcGFjZSA9IGV4dEVsZW0uZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKHRoaXNOYW1lc3BhY2UgIT0gbnVsbCAmJiAhdGhpc05hbWVzcGFjZS5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgICAgIHsKLQotICAgICAgICAJRWxlbWVudCBlbGVtZW50ID0gZXh0RWxlbS5nZXRFbGVtZW50KCk7Ci0JCQkKLS8vCQkJY3JlYXRlIHRoZSBpbmxpbmUgc2NoZW1hIHN0cmluZwotCQkJIC8vRWxlbWVudCB3M2NlbGVtZW50ID0gZWxlbS5nZXRFbGVtZW50KCk7Ci0JCQkgSGFzaHRhYmxlIHBhcmVudG5hbWVzcGFjZXMgPSBnZXROYW1lc3BhY2VEZWNsYXJhdGlvbnNGcm9tUGFyZW50cyh3c2RsRGVmaW5pdGlvbixlbGVtZW50KTsKLQkJCSBTdHJpbmcgeHNkID0gSW5saW5lU2NoZW1hR2VuZXJhdG9yLmNyZWF0ZVhTRFN0cmluZyhlbGVtZW50LCBlbGVtZW50cywgcmVmZXJlbmNlTG9jYXRpb24sIHBhcmVudG5hbWVzcGFjZXMpOwotICAgICAgICAJLy9hZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNGcm9tUGFyZW50cyh3c2RsRGVmaW5pdGlvbixlbGVtZW50KTsKLSAgICAgICAgICBlbnRpdHlSZXNvbHZlci5hZGQodGhpc05hbWVzcGFjZSwgeHNkKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlbnRpdHlSZXNvbHZlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBhcyBpbiB0aGUgZm9ybSAKLSAgICogeG1sbnM9InNvbWVuYW1lc3BhY2UiCi0gICAqIGZyb20gdGhlIGRlZmluaXRpb25zIGFuZCB0eXBlcyBlbGVtZW50cyBhbmQgYWRkIHRoZW0gdG8gdGhlIHNjaGVtYSBlbGVtZW50IHNvIHRoZSBzY2hlbWEgCi0gICAqIHZhbGlkYXRvciB3aWxsIGhhdmUgYWNjZXNzIHRvIHRoZW0uCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb24gVGhlIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIHR5cGVzIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBoYXNodGFibGUgd2l0aCB0aGUgbmFtZXNwYWNlIGVsZW1lbnRzIGZyb20gdGhlIGVsZW1lbnRzIHByb3ZpZGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBnZXROYW1lc3BhY2VEZWNsYXJhdGlvbnNGcm9tUGFyZW50cyhEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgCUhhc2h0YWJsZSBuc3MgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgSXRlcmF0b3IgbmFtZVNwYWNlcyA9IHdzZGxEZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgU3RyaW5nIFhNTE5TID0gQ29uc3RhbnRzLkFUVFJfWE1MTlM7Ci0gICAgCi0gICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gIiI7Ci0gICAgd2hpbGUgKG5hbWVTcGFjZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBuc3ByZWZpeCA9IFhNTE5TOwotICAgICAgU3RyaW5nIG5zID0gKFN0cmluZykgbmFtZVNwYWNlcy5uZXh0KCk7Ci0gICAgICBpZiAoIW5zLmVxdWFsc0lnbm9yZUNhc2UoIiIpKQotICAgICAgewotICAgICAgICBuc3ByZWZpeCArPSAiOiI7Ci0gICAgICB9Ci0gICAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKG5zcHJlZml4ICsgbnMpKQotICAgICAgewotICAgICAgCW5zcy5wdXQobnNwcmVmaXggKyBucywgd3NkbERlZmluaXRpb24uZ2V0TmFtZXNwYWNlKG5zKSk7Ci0vLyAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobnNwcmVmaXggKyBucywgd3NkbERlZmluaXRpb24uZ2V0TmFtZXNwYWNlKG5zKSk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgLy8gTmV4dCBoYW5kbGUgdGhlIHBhcmVudCB0eXBlcyBlbGVtZW50Ci0gICAgTmFtZWROb2RlTWFwIGF0dHMgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IGF0dHNsZW5ndGggPSBhdHRzLmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0c2xlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgdGVtcG5vZGUgPSBhdHRzLml0ZW0oaSk7Ci0gICAgICBTdHJpbmcgbm9kZW5hbWUgPSB0ZW1wbm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgLy8gaWYgdGhpcyBpcyBhIG5hbWVzcGFjZSBhdHRyaWJ1dGUKLSAgICAgIGlmIChub2RlbmFtZS5pbmRleE9mKFhNTE5TKSAhPSAtMSkKLSAgICAgIHsKLQkJbnNzLnB1dChub2RlbmFtZSwgIHRlbXBub2RlLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICAgLy9lbGVtZW50LnNldEF0dHJpYnV0ZShub2RlbmFtZSwgdGVtcG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnNzOwotICB9Ci0gIAotICAvKioKLSAgICogR2l2ZW4gYSBsaW5lIG51bWJlciBmb3IgdGhlIHNjaGVtYSByZXR1cm5zIHRoZSBlbGVtZW50IGZvdW5kIG9uIHRoYXQgbGluZS4gCi0gICAqIFVzZWZ1bCBmb3Igb2J0YWluaW5nIGVsZW1lbnRzIGZyb20gc2NoZW1hIFN0cmluZ3MuCi0gICAqIAotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBudW1iZXIgZm9yIHRoZSBzY2hlbWEuCi0gICAqIEByZXR1cm4gVGhlIG9iamVjdCBsb2NhdGVkIGF0IHRoZSBsaW5lIG9yIGF0IGxpbmUgMCBpZiB0aGUgbGluZSBpcyBpbnZhbGlkLgotICAgKi8KLSAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0QXRMaW5lKGludCBsaW5lKQotICAgewotICAgCWlmKGxpbmUgPCAwIHx8IGxpbmUgPj0gZWxlbWVudHMuc2l6ZSgpKQotICAgCXsKLSAgIAkgIGxpbmUgPSAwOwotICAgCX0KLQlyZXR1cm4gZWxlbWVudHMuZ2V0KGxpbmUpOwotICAgfQotICAgCi0gIC8qKgotICAgKiBSZXBsYWNlIGFueSBpbnN0YW5jZSBvZiB0aGUgMjAwMSBzY2hlbWEgbmFtZXNwYWNlIGluIHRoZSBnaXZlbiBtZXNzYWdlIHdpdGgKLSAgICogdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHJlcGxhY2UgdGhlIG5hbWVzcGFjZSBpbi4KLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHVzZWQgZm9yIHJlcGxhY2VtZW50LgotICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHdpdGggdGhlIDIwMDEgc2NoZW1hIG5hbWVzcGFjZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZU5hbWVzcGFjZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIG5hbWVzcGFjZSkKLSAgIHsKLSAgICAgU3RyaW5nIHhzZDIwMDEgPSBDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxOwotICAgICBpbnQgc3RhcnQgPSBtZXNzYWdlLmluZGV4T2YoeHNkMjAwMSk7Ci0gICAgIGludCBlbmQgPSBzdGFydCArIHhzZDIwMDEubGVuZ3RoKCk7Ci0gICAgIGlmKHN0YXJ0IDwgMCkKLSAgICAgewotICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgICB9Ci0gICAgIFN0cmluZyBzdGFydFN0cmluZyA9IG1lc3NhZ2Uuc3Vic3RyaW5nKDAsc3RhcnQpOwotICAgICBTdHJpbmcgZW5kU3RyaW5nID0gbWVzc2FnZS5zdWJzdHJpbmcoZW5kLG1lc3NhZ2UubGVuZ3RoKCkpOwotICAgICByZXR1cm4gc3RhcnRTdHJpbmcgKyBuYW1lc3BhY2UgKyBlbmRTdHJpbmc7Ci0gICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvSW5saW5lWFNEUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9JbmxpbmVYU0RSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTMyNjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9JbmxpbmVYU0RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnhzZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogQW4gWE1MRW50aXR5UmVzb2x2ZXIgdGhhdCBhbGxvd3MgaW5saW5lIHNjaGVtYXMgdG8gcmVzb2x2ZSBlYWNoIG90aGVyIHRocm91Z2ggaW1wb3J0cy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwgKGxtYW5kZWxAY2EuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIElubGluZVhTRFJlc29sdmVyIGltcGxlbWVudHMgWE1MRW50aXR5UmVzb2x2ZXIKLXsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBlbnRpdGllcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgcHJvdGVjdGVkIFhNTElucHV0U291cmNlIHJlZmVycmluZ1NjaGVtYUlucHV0U291cmNlID0gbnVsbDsKLSAgcHJvdGVjdGVkIFN0cmluZyByZWZlcnJpbmdTY2hlbWFOYW1lc3BhY2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHVjdG9yLgotICAgKi8KLSAgcHVibGljIElubGluZVhTRFJlc29sdmVyKCkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJlc291cmNlSWRlbnRpZmllcikKLQkJIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlTdHJpbmcgc3lzdGVtSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0RXhwYW5kZWRTeXN0ZW1JZCgpOwotCVN0cmluZyBwdWJsaWNJZCA9IHJlc291cmNlSWRlbnRpZmllci5nZXRQdWJsaWNJZCgpOwotCVN0cmluZyBuYW1lc3BhY2UgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0TmFtZXNwYWNlKCk7Ci0JWE1MSW5wdXRTb3VyY2UgaXMgPSBudWxsOwotCVJlYWRlciByZWFkZXIgPSBudWxsOwotCVN0cmluZyBzY2hlbWEgPSBudWxsOwotCWlmIChzeXN0ZW1JZCA9PSBudWxsKQotCXsKLQkgIGlmKHB1YmxpY0lkID09IG51bGwpCi0JICB7Ci0JICAJaWYobmFtZXNwYWNlID09IG51bGwpCi0JICAJewkKLQkgICAgICByZXR1cm4gbnVsbDsKLQkgIAl9Ci0JICAJZWxzZQotCSAgCXsKLQkgIAkJc3lzdGVtSWQgPSBuYW1lc3BhY2U7Ci0JICAJfQotCSAgfQotCSAgZWxzZQotCSAgewkKLQkgICAgc3lzdGVtSWQgPSBwdWJsaWNJZDsKLQkgIH0KLQl9Ci0JICAKLQlpZihyZWZlcnJpbmdTY2hlbWFOYW1lc3BhY2UgIT0gbnVsbCAmJiByZWZlcnJpbmdTY2hlbWFOYW1lc3BhY2UuZXF1YWxzKHN5c3RlbUlkKSkKLQl7Ci0JCWlmKHJlZmVycmluZ1NjaGVtYUlucHV0U291cmNlIT1udWxsKQotCQl7Ci0JCQlyZXR1cm4gcmVmZXJyaW5nU2NoZW1hSW5wdXRTb3VyY2U7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoKHNjaGVtYSA9IChTdHJpbmcpIGVudGl0aWVzLmdldChzeXN0ZW1JZCkpICE9IG51bGwgJiYgIXNjaGVtYS5lcXVhbHMoIiIpKQotCXsKLQkJaXMgPSBuZXcgWE1MSW5wdXRTb3VyY2UocHVibGljSWQsIHN5c3RlbUlkLCBzeXN0ZW1JZCxuZXcgU3RyaW5nUmVhZGVyKHNjaGVtYSksbnVsbCk7Ci0JfQotCQotICAgIC8vaWYoaXMgPT0gbnVsbCkKLSAgICAvL3sKLSAgICAvLwl0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLSAgICAvL30KLQlyZXR1cm4gaXM7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGFuIGlubGluZSBzY2hlbWEuCi0gICAqIAotICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIC0gdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYQotICAgKiBAcGFyYW0gc2NoZW1hIC0gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjaGVtYQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkKFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIFN0cmluZyBzY2hlbWEpCi0gIHsKLSAgICBlbnRpdGllcy5wdXQodGFyZ2V0TmFtZXNwYWNlLCBzY2hlbWEpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIHRoZSByZWZlcnJpbmcgaW5saW5lIHNjaGVtYS4gCi0gICAqIAotICAgKiBAcGFyYW0gaW5wdXRTb3VyY2UgLSBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbmxpbmUgc2NoZW1hCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgLSB0aGUgbmFtZXNwYWNlIG9mIHRoZSBpbmxpbmUgc2NoZW1hCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRSZWZlcnJpbmdTY2hlbWEoWE1MSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UsIFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICByZWZlcnJpbmdTY2hlbWFJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOwotICAgIHJlZmVycmluZ1NjaGVtYU5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1NjaGVtYUF0dHJpYnV0ZVRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvU2NoZW1hQXR0cmlidXRlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5NzYyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvU2NoZW1hQXR0cmlidXRlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC54c2Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhzLlNjaGVtYVN5bWJvbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5TeW1ib2xUYWJsZTsKLS8qKgotICogVGhpcyBjbGFzcyB3aWxsIGFsbG93IHRoZSBjYWxsaW5nIGNvZGUgdG8gc2VlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBpbiBzY2hlbWEuCi0gKiBUaGlzIHNlcnZlcyBhcyBzY2hlbWEgZm9yIHNjaGVtYS4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwgKGxtYW5kZWxAY2EuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYUF0dHJpYnV0ZVRhYmxlIGV4dGVuZHMgU3ltYm9sVGFibGUKLXsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlVGFibGUoKQotICB7Ci0gICAgLy8gYWRkIGFsbCBvZiB0aGUgc3lib2xzIHRvIHRoZSB0YWJsZS4gU2NoZW1hU3ltYm9scyBwcm9iYWJseSBzaG91bGQgaGF2ZQotICAgIC8vIGEgU3ltYm9sVGFibGUgZm9yIHRoZXNlIGJ1dCBpdCBkb2Vzbid0Ci0KLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVFdPUE9VTkRBTlkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UV09QT1VORExPQ0FMKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVFdPUE9VTkRPVEhFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RXT1BPVU5EVEFSR0VUTlMpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9QT1VOREFMTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0ZBTFNFXzApOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UUlVFXzEpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9BTllTSU1QTEVUWVBFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfQU5ZVFlQRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0FOWVVSSSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0JBU0U2NEJJTkFSWSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0JPT0xFQU4pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9CWVRFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfQ09MTEFQU0UpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9EQVRFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREFURVRJTUUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9EQVkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9ERUNJTUFMKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRE9VQkxFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRFVSQVRJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9FTlRJVFkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9FTlRJVElFUyk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0VYVEVOU0lPTik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0ZBTFNFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRkxPQVQpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9IRVhCSU5BUlkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9JRCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lEUkVGKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSURSRUZTKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSU5UKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0xBTkdVQUdFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTEFYKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTElTVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0xPTkcpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OQU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTkVHQVRJVkVJTlRFR0VSKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTU9OVEgpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9NT05USERBWSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX05DTkFNRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX05NVE9LRU4pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OTVRPS0VOUyk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX05PTk5FR0FUSVZFSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX05PTlBPU0lUSVZFSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX05PUk1BTElaRURTVFJJTkcpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT1RBVElPTik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX09QVElPTkFMKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUE9TSVRJVkVJTlRFR0VSKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUFJFU0VSVkUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9QUk9ISUJJVEVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUU5BTUUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9RVUFMSUZJRUQpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9SRVBMQUNFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUkVRVUlSRUQpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9SRVNUUklDVElPTik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1NIT1JUKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfU0tJUCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1NUUklDVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1NUUklORyk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1NVQlNUSVRVVElPTik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RJTUUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UT0tFTik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RSVUUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9VTkJPVU5ERUQpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9VTklPTik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1VOUVVBTElGSUVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5TSUdORURCWVRFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5TSUdORURJTlQpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9VTlNJR05FRExPTkcpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9VTlNJR05FRFNIT1JUKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfWUVBUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1lFQVJNT05USCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9WYWxpZGF0ZUVycm9ySGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1ZhbGlkYXRlRXJyb3JIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYTczZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1ZhbGlkYXRlRXJyb3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC54c2Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFhNTEVycm9ySGFuZGxlciB0aGF0IGNhcHR1cmVzIGVycm9yIGZyb20gWGVyY2VzLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCAobG1hbmRlbEBjYS5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBYTUxFcnJvckhhbmRsZXIKLXsKLSAgQXJyYXlMaXN0IGVycm9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBlcnJvciBtZXNzYWdlcyBjcmVhdGVkIGJ5IFhlcmNlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVycm9ycyBsaXN0LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0RXJyb3JNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXIjZXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gIHsKLSAgICBlcnJvckxpc3QuYWRkKCJFcnJvcjogIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXIjZmF0YWxFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICB7Ci0gICAgZXJyb3JMaXN0LmFkZCgiRmF0YWwgZXJyb3I6ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRXJyb3JIYW5kbGVyI3dhcm5pbmcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdhcm5pbmcoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBYTklFeGNlcHRpb24KLSAgewotICAgIGVycm9yTGlzdC5hZGQoIldhcm5pbmc6ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9YTUxDYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvWE1MQ2F0YWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGFmYjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9YTUxDYXRhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC54c2Q7Ci0KLS8qKgotICogWE1MQ2F0YWxvZwotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byByZWdpc3Rlciwgb2J0YWluIGFuZCBkZWxldGUgYW4gaW5zdGFuY2Ugb2YgYW4gCi0gKiBYTUwgY2F0YWxvZy4gTWV0aG9kIGRlZmluaXRpb25zIGFyZSBwcm92aWRlZCBmb3IgdGhlIGNhdGFsb2cgdG8gc2V0Ci0gKiBhIGxvY2F0aW9uIGluIHRoZSBjYXRhbG9nIGFuZCByZXNvbHZlIGFuIGVudGl0eSBmcm9tIHRoZSBjYXRhbG9nLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCAobG1hbmRlbEBjYS5pYm0uY29tKQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MQ2F0YWxvZwotewotICBwcml2YXRlIHN0YXRpYyBYTUxDYXRhbG9nIGluc3RhbmNlID0gbnVsbDsKLSAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgeG1sY2F0YWxvZ2NsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBYTUwgY2F0YWxvZy4gSWYgbm8gaW5zdGFuY2UgaXMgcmVnaXN0ZXJlZCwKLSAgICogcmV0dXJucyBhIGRlZmF1bHQgaW5zdGFuY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGUgWE1MIGNhdGFsb2cKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgWE1MQ2F0YWxvZyBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoeG1sY2F0YWxvZ2NsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdGFuY2UgPSAoWE1MQ2F0YWxvZyl4bWxjYXRhbG9nY2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBYTUxDYXRhbG9nSW1wbCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGluc3RhbmNlID0gbmV3IFhNTENhdGFsb2dJbXBsKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGNsYXNzIG9mIHRoZSBYTUwgY2F0YWxvZyB0byBiZSB1c2VkLgotICAgKiAKLSAgICogQHBhcmFtIHhtbGNhdGFsb2cgLSB0aGUgY2xhc3Mgb2YgdGhlIFhNTCBjYXRhbG9nIHRvIGJlIHVzZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRYTUxDYXRhbG9nKENsYXNzIHhtbGNhdGFsb2cpCi0gIHsKLSAgICB4bWxjYXRhbG9nY2xhc3MgPSB4bWxjYXRhbG9nOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgaW5zdGFuY2Ugb2YgdGhlIFhNTCBjYXRhbG9nIHRvIG51bGwuIEFsbG93cyBzd2l0Y2hpbmcgWE1MIGNhdGFsb2dzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkKLSAgewotICAgIGluc3RhbmNlID0gbnVsbDsKLSAgICB4bWxjYXRhbG9nY2xhc3MgPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHB1YmxpYyBpZCBhbmQgYSBsb2NhdGlvbiB0byB0aGUgY2F0YWxvZy4KLSAgICogCi0gICAqIEBwYXJhbSBwdWJsaWNJZCAtIHRoZSBwdWJsaWMgaWQgb2YgdGhlIGVudHJ5Ci0gICAqIEBwYXJhbSBzeXN0ZW1JZCAtIHRoZSBzeXN0ZW0gaWQgb2YgdGhlIGVudHJ5Ci0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRFbnRyeVRvQ2F0YWxvZyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCk7Ci0KLSAgLyoqCi0gICAqIFJlc29sdmUgdGhlIGxvY2F0aW9uIG9mIGFuIGVudGl0eSBnaXZlbiBwdWJsaWMgYW5kIHN5c3RlbSBpZHMuCi0gICAqIAotICAgKiBAcGFyYW0gcHVibGljSWQgLSB0aGUgcHVibGljIGlkIG9mIHRoZSBlbnRpdHkgdG8gYmUgcmVzb2x2ZWQKLSAgICogQHBhcmFtIHN5c3RlbUlkIC0gdGhlIHN5c3RlbSBpZCBvZiB0aGUgZW50aXR5IHRvIGJlIHJlc29sdmVkCi0gICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBlbnRpdHkKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgcmVzb2x2ZUVudGl0eUxvY2F0aW9uKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvWE1MQ2F0YWxvZ0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9YTUxDYXRhbG9nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2M0MGU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9YTUxDYXRhbG9nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwueHNkOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBYTUwgQ2F0YWxvZy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwgKGxtYW5kZWxAY2EuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2dJbXBsIGV4dGVuZHMgWE1MQ2F0YWxvZwotewotICBwcm90ZWN0ZWQgTWFwIGNhdGFsb2cgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUueG1sY29uZm9ybWFuY2UuWE1MQ2F0YWxvZyNhZGRFbnRyeVRvQ2F0YWxvZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRW50cnlUb0NhdGFsb2coU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBjYXRhbG9nLnB1dChwdWJsaWNJZCwgc3lzdGVtSWQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUueG1sY29uZm9ybWFuY2UuWE1MQ2F0YWxvZyNyZXNvbHZlRW50aXR5TG9jYXRpb24oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZUVudGl0eUxvY2F0aW9uKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gIAkvLyBpZiB0aGVyZSdzIG5vIHN5c3RlbSBpZCB1c2UgdGhlIHB1YmxpYyBpZAotICAgIGlmIChzeXN0ZW1JZCA9PSBudWxsIHx8IHN5c3RlbUlkLmVxdWFscygiIikpCi0gICAgewotICAgICAgc3lzdGVtSWQgPSBwdWJsaWNJZDsKLSAgICB9Ci0gICAgcmV0dXJuIChTdHJpbmcpY2F0YWxvZy5nZXQoc3lzdGVtSWQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvWE1MQ2F0YWxvZ1Jlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvWE1MQ2F0YWxvZ1Jlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZWZkYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1hNTENhdGFsb2dSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwueHNkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogQSByZXNvbHZlciB0byByZXNvbHZlIGVudGl0aWVzIGZyb20gdGhlIFhNTCBjYXRhbG9nLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCAobG1hbmRlbEBjYS5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ1Jlc29sdmVyIGltcGxlbWVudHMgWE1MRW50aXR5UmVzb2x2ZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBYTUxDYXRhbG9nUmVzb2x2ZXIgeG1sQ2F0YWxvZzsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgWE1MQ2F0YWxvZ1Jlc29sdmVyKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgaW5zdGFuY2Ugb2YgdGhpcyByZXNvbHZlci4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoaXMgcmVzb2x2ZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgWE1MQ2F0YWxvZ1Jlc29sdmVyIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmICh4bWxDYXRhbG9nID09IG51bGwpCi0gICAgewotICAgICAgeG1sQ2F0YWxvZyA9IG5ldyBYTUxDYXRhbG9nUmVzb2x2ZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHhtbENhdGFsb2c7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgWE1MSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShYTUxSZXNvdXJjZUlkZW50aWZpZXIgcmVzb3VyY2VJZGVudGlmaWVyKSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHB1YmxpY0lkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldFB1YmxpY0lkKCk7Ci0gICAgU3RyaW5nIHN5c3RlbUlkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldEV4cGFuZGVkU3lzdGVtSWQoKTsKLSAgICBTdHJpbmcgbG9jYXRpb24gPSBYTUxDYXRhbG9nLmdldEluc3RhbmNlKCkucmVzb2x2ZUVudGl0eUxvY2F0aW9uKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgaWYgKGxvY2F0aW9uID09IG51bGwpCi0gICAgewotICAgICAgWE1MSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgWE1MSW5wdXRTb3VyY2UocHVibGljSWQsIHN5c3RlbUlkLCBzeXN0ZW1JZCwgbmV3IFN0cmluZ1JlYWRlcihsb2NhdGlvbiksIG51bGwpOwotICAgICAgcmV0dXJuIGlucHV0U291cmNlOwotICAgIH0KLSAgICAvLyBvdGhlcndpc2UgcmV0dXJuIG51bGwgdG8gdGVsbCB0aGUgcGFyc2VyIHRvIGxvY2F0ZSB0aGUgc3lzdGVtSWQgYXMgYSBVUkkKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1hNTEVudGl0eVJlc29sdmVyQ2hhaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9YTUxFbnRpdHlSZXNvbHZlckNoYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MWY4MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1hNTEVudGl0eVJlc29sdmVyQ2hhaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnhzZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEhhbmRsZSBhIGNoYWluIG9mIGVudGl0eSByZXNvbHZlcnMuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsIChsbWFuZGVsQGNhLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFbnRpdHlSZXNvbHZlckNoYWluIGltcGxlbWVudHMgWE1MRW50aXR5UmVzb2x2ZXIKLXsKLSAgcHJpdmF0ZSBMaXN0IGVudGl0eVJlc29sdmVycyA9IG5ldyBWZWN0b3IoKTsKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHhtbFJlc291cmNlSWRlbnRpZmllcikgdGhyb3dzIFhOSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFhNTElucHV0U291cmNlIGlzID0gbnVsbDsKLSAgICBJdGVyYXRvciBlbnRpdHlSZXNvbHZlckl0ZXIgPSBlbnRpdHlSZXNvbHZlcnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZW50aXR5UmVzb2x2ZXJJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IChYTUxFbnRpdHlSZXNvbHZlcillbnRpdHlSZXNvbHZlckl0ZXIubmV4dCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlzID0gZW50aXR5UmVzb2x2ZXIucmVzb2x2ZUVudGl0eSh4bWxSZXNvdXJjZUlkZW50aWZpZXIpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFhOSUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFRocm93IGFuZCBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSBpc24ndCBmb3VuZAotICAgIGlmIChpcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGxvY2F0ZSBmaWxlIik7Ci0gICAgfQotICAgIHJldHVybiBpczsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gZW50aXR5IHJlc29sdmVyIHRvIHRoaXMgY2hhaW4uCi0gICAqIAotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXIgVGhlIHJlc29sdmVyIHRvIGFkZCB0byB0aGUgY2hhaW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFbnRpdHlSZXNvbHZlcihYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikKLSAgewotICAgIGVudGl0eVJlc29sdmVycy5hZGQoZW50aXR5UmVzb2x2ZXIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvWFNEVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvWFNEVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTdhNDc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9YU0RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC54c2Q7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5YTUxHcmFtbWFyUHJlcGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MR3JhbW1hclBvb2xJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLmdyYW1tYXJzLlhNTEdyYW1tYXJMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLmdyYW1tYXJzLlhNTEdyYW1tYXJQb29sOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YU0dyYW1tYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci0KLQotLyoqCi0gKiBWYWxpZGF0ZSBzY2hlbWFzIGZyb20gZmlsZXMgb3IgU3RyaW5nLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCAobG1hbmRlbEBjYS5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgWFNEVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgWFNNb2RlbCB4c01vZGVsOwotICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFhTRDsKLSAgcHJpdmF0ZSBMaXN0IGVycm9yczsKLSAgcHJpdmF0ZSBTdHJpbmcgZmlsZWxvY2F0aW9uOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBYU0RWYWxpZGF0b3IoKQotICB7Ci0gICAgeHNNb2RlbCA9IG51bGw7Ci0gICAgaXNWYWxpZFhTRCA9IGZhbHNlOwotICAgIGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgfQotICAvKioKLSAgICogVmFsaWRhdGUgYW4gaW5saW5lIHNjaGVtYS4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEgQSBzY2hlbWEgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuCi0gICAqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UgVGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGZpbGVsb2MgVGhlIHVyaSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBzY2hlbWEuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUlubGluZVNjaGVtYShTdHJpbmcgc2NoZW1hLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgZmlsZWxvYykKLSAgewotICAgIHZhbGlkYXRlSW5saW5lU2NoZW1hKHNjaGVtYSwgdGFyZ2V0TmFtZXNwYWNlLCBmaWxlbG9jLCBudWxsLCBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSBhbiBpbmxpbmUgc2NoZW1hIGFuZCBzcGVjaWZ5IGFuIGVudGl0eSByZXNvbHZlci4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEgVGhpcyBzY2hlbWEgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuCi0gICAqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UgVGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGZpbGVsb2MgVGhlIHVyaSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgc2NoZW1hLgotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXJDaGFpbiBUaGUgZW50aXR5IHJlc29sdmVyIGNoYWluLgotICAgKiBAcGFyYW0gaW5saW5lU2NoZW1hRW50aXR5UmVzb2x2ZXIgQW4gaW5saW5lIHNjaGVtYSByZXNvbHZlciBmb3IgdGhpcyBzY2hlbWEuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUlubGluZVNjaGVtYSgKLSAgICBTdHJpbmcgc2NoZW1hLAotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgU3RyaW5nIGZpbGVsb2MsCi0gICAgWE1MRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXJDaGFpbiwKLSAgICBYTUxFbnRpdHlSZXNvbHZlciBpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlcikKLSAgewotICAgIGZpbGVsb2NhdGlvbiA9IGZpbGVsb2M7Ci0KLSAgICB2YWxpZGF0ZVhTRChzY2hlbWEsIHRydWUsIGVudGl0eVJlc29sdmVyQ2hhaW4sdGFyZ2V0TmFtZXNwYWNlLCBpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlcik7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGZpbGUgbG9jYXRlZCBhdCB0aGUgdXJpIHNwZWNpZmllZCB3aXRoIHRoZSBnaXZlbiBlbnRpdHkgcmVzb2x2ZXIuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIEFuIGFic29sdXRlIHVyaSBmb3IgdGhlIHNjaGVtYSBsb2NhdGlvbi4KLSAgICogQHBhcmFtIGVudGl0eVJlc29sdmVyIEFuIGVudGl0eSByZXNvbHZlciB0byBiZSB1c2VkLgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgWE1MRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIpCi0gIHsKLSAgICB2YWxpZGF0ZVhTRCh1cmksIGZhbHNlLCBlbnRpdHlSZXNvbHZlciwgbnVsbCwgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIHNjaGVtYS4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEgVGhlIHNjaGVtYSBvciBpdCdzIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gaW5saW5lWFNEIFRydWUgaWYgYW4gaW5saW5lIHNjaGVtYSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXIgQW4gZW50aXR5IHJlc29sdmVyIHRvIHVzZS4KLSAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hIGJlaW5nIHZhbGlkYXRlZC4KLSAgICogQHBhcmFtIGlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyIEFuIGlubGluZSBzY2hlbWEgZW50aXR5IHJlc29sdmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYU0QoU3RyaW5nIHNjaGVtYSwgYm9vbGVhbiBpbmxpbmVYU0QsIFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBYTUxFbnRpdHlSZXNvbHZlciBpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlcikKLSAgewotICAgIFZhbGlkYXRlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBWYWxpZGF0ZUVycm9ySGFuZGxlcigpOwotICAgIGVycm9ySGFuZGxlci5nZXRFcnJvck1lc3NhZ2VzKCkuY2xlYXIoKTsKLSAgICB0cnkKLSAgICB7Ci0JCVhNTEdyYW1tYXJQcmVwYXJzZXIgZ3JhbW1hclByZXBhcnNlciA9IG5ldyBYTUxHcmFtbWFyUHJlcGFyc2VyKCk7Ci0JCVhNTEdyYW1tYXJQb29sIGdyYW1tYXJQb29sID0gbmV3IFhNTEdyYW1tYXJQb29sSW1wbCgpOwotCQlncmFtbWFyUHJlcGFyc2VyLnNldEdyYW1tYXJQb29sKGdyYW1tYXJQb29sKTsKLQkgCi0gICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotICAgICAgaWYgKGVudGl0eVJlc29sdmVyICE9IG51bGwpCi0gICAgICB7Ci0JCWdyYW1tYXJQcmVwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIoZW50aXR5UmVzb2x2ZXIpOwotICAgICAgfQotCi0gICAgICB0cnkKLSAgICAgIHsKLQkJWE1MSW5wdXRTb3VyY2UgaXMgPSBudWxsOwotICAgICAgICAvLyB0aGlzIGFsbG93cyBzdXBwb3J0IGZvciB0aGUgaW5saW5lIHNjaGVtYSBpbiBXU0RMIGRvY3VtZW50cwotICAgICAgICBpZiAoaW5saW5lWFNEKQotICAgICAgICB7Ci0gICAgICAgIAkKLSAgICAgICAgCVJlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHNjaGVtYSk7Ci0JCQlpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShudWxsLGZpbGVsb2NhdGlvbixmaWxlbG9jYXRpb24scmVhZGVyLG51bGwpOwotCQkJCi0JCQkoKElubGluZVhTRFJlc29sdmVyKWlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyKS5hZGRSZWZlcnJpbmdTY2hlbWEoaXMsdGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICB9Ci0gICAgICAgIC8vIGdldCB0aGUgaW5wdXQgc291cmNlIGZvciBhbiBleHRlcm5hbCBzY2hlbWEgZmlsZQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShudWxsLHNjaGVtYSxzY2hlbWEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBncmFtbWFyUHJlcGFyc2VyLnJlZ2lzdGVyUHJlcGFyc2VyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BLG51bGwvKnNjaGVtYUxvYWRlciovKTsKLSAgICAgICAgWE1MR3JhbW1hckxvYWRlciBzY2hlbWFMb2FkZXIgPSBncmFtbWFyUHJlcGFyc2VyLmdldExvYWRlcihYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSk7Ci0KLQkJWFNHcmFtbWFyIGdyYW1tYXIgPSAoWFNHcmFtbWFyKWdyYW1tYXJQcmVwYXJzZXIucHJlcGFyc2VHcmFtbWFyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BLGlzKTsKLQkJeHNNb2RlbCA9IGdyYW1tYXIudG9YU01vZGVsKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vcGFyc2VyIHdpbGwgcmV0dXJuIG51bGwgcG9pbnRlciBleGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGlzIHN0cnVjdHVyYWxseSBpbnZhbGlkCi0gICAgICAgIGVycm9ycy5hZGQoIlNjaGVtYSBpcyBzdHJ1Y3R1cmFsbHkgaW52YWxpZC4iKTsKLSAgICAgIH0KLQotICAgICAgZXJyb3JzLmFkZEFsbChlcnJvckhhbmRsZXIuZ2V0RXJyb3JNZXNzYWdlcygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAJU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgICBpZiAoZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBpc1ZhbGlkWFNEID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgWFNNb2RlbCBjcmVhdGVkLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgWFNNb2RlbCBjcmVhdGVkLgotICAgKi8KLQotICBwdWJsaWMgWFNNb2RlbCBnZXRYU01vZGVsKCkKLSAgewotICAJcmV0dXJuIHhzTW9kZWw7Ci0gIH0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2NoZW1hIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNjaGVtYSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCi0gIHsKLSAgICByZXR1cm4gaXNWYWxpZFhTRDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGVycm9yIGxpc3QuCi0gICAqIAotICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBlcnJvciBmcm9tIHRoZSBzY2hlbWEuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRFcnJvcnMoKQotICB7Ci0gICAgcmV0dXJuIGVycm9yczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9YTUxDb252ZXJ0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MQ29udmVydG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjEzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9YTUxDb252ZXJ0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sOwotCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udmVydHMgYSBYTUwgZG9jdW1lbnQgdXNpbmcgYW4gWFNMIGZpbGUuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb252ZXJ0b3IKLXsKLQotICAvKioKLSAgICogVHJhbnNmb3JtcyBhbiBYTUwgZG9jdW1lbnQgdXNpbmcgYW4gWFNMIGZpbGUuCi0gICAqIEBwYXJhbSBhcmdzICBhcmd1bWVudHMgZm9yIG1haW4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMykKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICJVc2FnZTogWE1MQ29udmVydG9yIDx4c2xGaWxlPiA8aW5YTUxGaWxlPiA8b3V0RmlsZT4iKTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBHZXQgdHJhbnNmb3JtZXIgCi0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0KLSAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigKLSAgICAgICAgICAgIG5ldyBTdHJlYW1Tb3VyY2UoYXJnc1swXSkpOwotCi0gICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgWE1MIGRvY3VtZW50IHVzaW5nIHRoZSBzcGVjaWZpY2VkIFhTTCBmaWxlCi0gICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSgKLSAgICAgICAgICBuZXcgU3RyZWFtU291cmNlKGFyZ3NbMV0pLAotICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGVPdXRwdXRTdHJlYW0oYXJnc1syXSkpKTsKLQotICAgICAgICAvLyBEaXNwbGF5IHJlc3VsdHMKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICJDcmVhdGVkICIgKyBhcmdzWzJdICsgIiBmcm9tICIgKyBhcmdzWzBdICsgIiBhbmQgIiArIGFyZ3NbMV0gKyAiLiIpOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLQotICAgIFN5c3RlbS5leGl0KDApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTERvY3VtZW50Q2FjaGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MRG9jdW1lbnRDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTNlNjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MRG9jdW1lbnRDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjcmVhdGVzIGEgSGFzaE1hcCB0byBjYWNoZSBYTUwgZG9jdW1lbnRzLgotICogQGF1dGhvciBQZXRlciAgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGNsYXNzIFhNTERvY3VtZW50Q2FjaGUgZXh0ZW5kcyBIYXNoTWFwCi17Ci0KLSAgLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzODM0MDI4MDQzNzA5NjU3NDAxTDsKLQotCS8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgWE1MRG9jdW1lbnRDYWNoZS4KLSAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkuCi0gICAqIEBwYXJhbSBsb2FkRmFjdG9yICAgICAgIHRoZSBsb2FkIGZhY3Rvci4gCi0gICAqLwotICBwdWJsaWMgWE1MRG9jdW1lbnRDYWNoZShpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKQotICB7Ci0gICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgWE1MRG9jdW1lbnRDYWNoZS4KLSAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkuCi0gICAqLwotICBwdWJsaWMgWE1MRG9jdW1lbnRDYWNoZShpbnQgaW5pdGlhbENhcGFjaXR5KQotICB7Ci0gICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgWE1MRG9jdW1lbnRDYWNoZS4KLSAgICovCi0gIHB1YmxpYyBYTUxEb2N1bWVudENhY2hlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFhNTERvY3VtZW50Q2FjaGUuCi0gICAqIEBwYXJhbSB0ICB0aGUgbWFwIHdob3NlIG1hcHBpbmdzIGFyZSB0byBiZSBwbGFjZWQgaW4gdGhpcyBtYXAuCi0gICAqLwotICBwdWJsaWMgWE1MRG9jdW1lbnRDYWNoZShNYXAgdCkKLSAgewotICAgIHN1cGVyKHQpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MRG9jdW1lbnRDYWNoZVVzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MRG9jdW1lbnRDYWNoZVVzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwMDEzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTERvY3VtZW50Q2FjaGVVc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiBjYWNoZWQgWE1MIGRvY3VtZW50cy4KLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTERvY3VtZW50Q2FjaGVVc2VyCi17Ci0gIC8qKgotICAgKiBDYWNoZSBvZiBwYXJzZWQgZG9jdW1lbnRzLgotICAgKi8KLSAgcHJvdGVjdGVkIFhNTERvY3VtZW50Q2FjaGUgZG9jdW1lbnRMaXN0ID0gbnVsbDsKLQotICAvKioKLSAgICogR2V0IGRvY3VtZW50IGZyb20gY2FjaGUuCi0gICAqIEBzZWUgI3NldERvY3VtZW50Ci0gICAqCi0gICAqIEBwYXJhbSBrZXkgIGEgU3RyaW5nLiAKLSAgICogQHJldHVybiBhIERvY3VtZW50IG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXkuCi0gICAqLwotICBwcm90ZWN0ZWQgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIGtleSkKLSAgewotICAgIHJldHVybiAoRG9jdW1lbnQpIGRvY3VtZW50TGlzdC5nZXQoa2V5KTsKLSAgfQotCi0gIC8qKgotICAgKiBQdXQgZG9jdW1lbnQgd2l0aCBjb3JyZXNwb25kaW5nIGtleSBpbiBjYWNoZS4KLSAgICogQHNlZSAjZ2V0RG9jdW1lbnQKLSAgICoKLSAgICogQHBhcmFtIGtleSAgICAgICBhIFN0cmluZyB1c2VkIGFzIGEga2V5IHRvIGlkZW50aWZ5IHNwZWNpZmllZCBkb2N1bWVudC4KLSAgICogQHBhcmFtIGRvY3VtZW50ICBhIGRvY3VtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnQoU3RyaW5nIGtleSwgT2JqZWN0IGRvY3VtZW50KQotICB7Ci0gICAgZG9jdW1lbnRMaXN0LnB1dChrZXksIGRvY3VtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgZG9jdW1lbnQgbGlzdC4KLSAgICogQHJldHVybiBhIFhNTERvY3VtZW50Q2FjaGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZG9jdW1lbnQgbGlzdCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBYTUxEb2N1bWVudENhY2hlIGdldERvY3VtZW50TGlzdCgpCi0gIHsKLSAgICByZXR1cm4gZG9jdW1lbnRMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIFhNTCBkb2N1bWVudC4KLSAgICogQHBhcmFtIHVybFN0cmluZyAgYSBTdHJpbmcgbG9jYXRpbmcgdGhlIFhNTCBkb2N1bWVudC4KLSAgICogQHBhcmFtIGJhc2VVUkkgICAgYSBiYXNlIHVybCB0byBhc3Npc3QgaW4gbG9jYXRpbmcgdGhlIFhNTCBkb2N1bWVudC4KLSAgICogQHJldHVybiBhIERvY3VtZW50IG9iamVjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgZG9jdW1lbnQgY2Fubm90IGJlIHBhcnNlZC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBwYXJzZVhNTERvY3VtZW50VVJMKFN0cmluZyB1cmxTdHJpbmcsIFN0cmluZyBiYXNlVVJJKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBwYXJzZVhNTERvY3VtZW50VVJMKHVybFN0cmluZywgYmFzZVVSSSwgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgWE1MIGRvY3VtZW50IGFuZCB2YWxpZGF0ZSB3aXRoIGEgc2NoZW1hIGRvY3VtZW50LgotICAgKiBAcGFyYW0gdXJsU3RyaW5nICBhIFN0cmluZyBsb2NhdGluZyB0aGUgWE1MIGRvY3VtZW50LgotICAgKiBAcGFyYW0gYmFzZVVSSSAgICBhIGJhc2UgdXJsIHRvIGFzc2lzdCBpbiBsb2NhdGluZyB0aGUgWE1MIGRvY3VtZW50LgotICAgKiBAcGFyYW0gc2NoZW1hICAgICBhIFN0cmluZyBpZGVudGlmeWluZyByZWxhdGVkIHNjaGVtYSBkb2N1bWVudC4KLSAgICogQHJldHVybiBhIERvY3VtZW50IG9iamVjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgZG9jdW1lbnQgY2Fubm90IGJlIHBhcnNlZC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBwYXJzZVhNTERvY3VtZW50VVJMKAotICAgIFN0cmluZyB1cmxTdHJpbmcsCi0gICAgU3RyaW5nIGJhc2VVUkksCi0gICAgU3RyaW5nIHNjaGVtYSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBDcmVhdGUgVVJMIHJlZmVyZW5jZSB0byBkb2N1bWVudAotICAgICAgVVJMIHVybCA9IFhNTFV0aWxzLmNyZWF0ZVVSTCh1cmxTdHJpbmcsIGJhc2VVUkkpOwotICAgICAgICAgICAgICAgCi0gICAgICAvLyBUT0RPOiBBZGQgc2NoZW1hIHRvIHRoZSB4bWwgZG9jdW1lbnQgY2FjaGUsIHNvIHRoYXQgeW91IGNhbiBkZXRlY3Qgd2hlbiBpdCBoYXMgYWxyZWFkeSAKLSAgICAgIC8vICBiZWVuIHBhcnNlZCB1c2luZyBhIHNwZWNpZmljIHNjaGVtYSBkZWZpbml0aW9uIAotCi0gICAgICAvLyBJZiB0aGUgZG9jdW1lbnQgaXMgbm90IGluIHRoZSBjYWNoZSwgdGhlbiByZWFkIGFuZCBwYXJzZSBpdAotICAgCSAgaWYgKChkb2N1bWVudCA9IGdldERvY3VtZW50KHVybFN0cmluZykpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMucGFyc2VYTUxEb2N1bWVudFVSTCh1cmwsIHNjaGVtYSk7Ci0gICAgICAgIC8vIEFkZCBkb2N1bWVudCB0byBjYWNoZQotICAgICAgICBzZXREb2N1bWVudCh1cmxTdHJpbmcsIGRvY3VtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgZTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRvY3VtZW50OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTFRhZ3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MVGFncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTJkMDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MVGFncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBYTUwgdGFncy4KLSAqIAotICogQGF1dGhvciBQZXRlciAgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxUYWdzCi17Ci0gIC8qKgotICAgKiBOYW1lc3BhY2VzLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfVVJJX1hTSSA9Ci0gICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfVVJJX1hNTE5TID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfVVJJX1hTRCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhTRF9TQ0hFTUFMT0NBVElPTiA9Ci0gICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLnhzZCI7Ci0KLSAgLyoqCi0gICAqIFF1YWxpZmllZCBuYW1lcyBvZiBYU0QgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEVMRU1fWFNEX0FOTk9UQVRJT04gPQotICAgIG5ldyBRTmFtZShOU19VUklfWFNELCAiYW5ub3RhdGlvbiIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEVMRU1fWFNEX0lNUE9SVCA9IG5ldyBRTmFtZShOU19VUklfWFNELCAiaW1wb3J0Iik7ICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBFTEVNX1hTRF9JTkNMVURFID0gbmV3IFFOYW1lKE5TX1VSSV9YU0QsICJpbmNsdWRlIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRUxFTV9YU0RfU0NIRU1BID0gbmV3IFFOYW1lKE5TX1VSSV9YU0QsICJzY2hlbWEiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBFTEVNX1hTRF9FTEVNRU5UID0gbmV3IFFOYW1lKE5TX1VSSV9YU0QsICJlbGVtZW50Iik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRUxFTV9YU0RfQVRUUklCVVRFID0KLSAgICBuZXcgUU5hbWUoTlNfVVJJX1hTRCwgImF0dHJpYnV0ZSIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEVMRU1fWFNEX0NPTVBMRVhUWVBFID0KLSAgICBuZXcgUU5hbWUoTlNfVVJJX1hTRCwgImNvbXBsZXhUeXBlIik7Ci0KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBBVFRSX1hTSV9UWVBFID0gbmV3IFFOYW1lKE5TX1VSSV9YU0ksICJ0eXBlIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgQVRUUl9YU0lfTklMID0gbmV3IFFOYW1lKE5TX1VSSV9YU0ksICJuaWwiKTsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEFUVFJfWFNEX05BTUUgPSBuZXcgUU5hbWUoTlNfVVJJX1hTRCwgIm5hbWUiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBBVFRSX1hTRF9UWVBFID0gbmV3IFFOYW1lKE5TX1VSSV9YU0QsICJ0eXBlIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgQVRUUl9YU0RfQkFTRSA9IG5ldyBRTmFtZShOU19VUklfWFNELCAiYmFzZSIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEFUVFJfWFNEX05BTUVTUEFDRSA9Ci0gICAgbmV3IFFOYW1lKE5TX1VSSV9YU0QsICJuYW1lc3BhY2UiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBBVFRSX1hTRF9TQ0hFTUFMT0NBVElPTiA9Ci0gICAgbmV3IFFOYW1lKE5TX1VSSV9YU0QsICJzY2hlbWFMb2NhdGlvbiIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEFUVFJfWFNEX1RBUkdFVE5BTUVTUEFDRSA9Ci0gICAgbmV3IFFOYW1lKE5TX1VSSV9YU0QsICJ0YXJnZXROYW1lc3BhY2UiKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9YTUxUcmF2ZXJzYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MVHJhdmVyc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjMzZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9YTUxUcmF2ZXJzYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vdGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIFdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBub2RlIHNvdXJjZSBjb2RlLCBzbyB0aGlzIGRvZXMKLSAqIG91ciBkb3VibGUtZGlzcGF0Y2ggdGhlIGhhcmQgd2F5LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MVHJhdmVyc2FsIGV4dGVuZHMgWE1MVmlzaXRvcgotewotICAvKioKLSAgICAgKiBSZXR1cm5pbmcgZmFsc2UgZnJvbSBhY3Rpb24gd291bGQgdGVybWluYXRlcyB0cmF2ZXJzYWwuCi0gICAgICogSG93ZXZlciwgdGhpcyBhbHdheXMgcmV0dXJucyB0cnVlLiAtLSBhIG5vLW9wLgotICAgICAqIEBwYXJhbSBuIC0gYW4gWE1MIG5vZGUuCi0gICAgICogQHJldHVybiBhbHdheXMgdHJ1ZS4KLSAgICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWN0aW9uKE5vZGUgbikKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXQoQ0RBVEFTZWN0aW9uIHMpCi0gIHsKLSAgICBhY3Rpb24ocyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdChEb2N1bWVudCBlKQotICB7Ci0gICAgaWYgKGFjdGlvbihlKSkKLSAgICB7Ci0gICAgICAvLyBUaGlzIGRvZXMgdmlzaXQgRG9jdW1lbnRUeXBlLCB3aGljaCBpcyBjb25zaWRlcmVkIGEgY2hpbGQgTm9kZS4KLSAgICAgIGZvciAoTm9kZSBuID0gZS5nZXRGaXJzdENoaWxkKCk7IG4gIT0gbnVsbDsgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgZG9WaXNpdChuKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdChEb2N1bWVudFR5cGUgdHlwZSkKLSAgewotICAgIGlmIChhY3Rpb24odHlwZSkpCi0gICAgewotICAgICAgdmlzaXQodHlwZS5nZXRFbnRpdGllcygpKTsKLSAgICAgIHZpc2l0KHR5cGUuZ2V0Tm90YXRpb25zKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEF0dHIgZSkKLSAgewotICAgIGFjdGlvbihlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEVsZW1lbnQgbm9kZSkKLSAgewotICAgIGlmIChhY3Rpb24obm9kZSkpCi0gICAgewotICAgICAgdmlzaXQobm9kZS5nZXRBdHRyaWJ1dGVzKCkpOwotICAgICAgZm9yIChOb2RlIG4gPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgbiAhPSBudWxsOyBuID0gbi5nZXROZXh0U2libGluZygpKQotICAgICAgewotICAgICAgICBkb1Zpc2l0KG4pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0KENvbW1lbnQgZSkKLSAgewotICAgIGFjdGlvbihlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFRleHQgZSkKLSAgewotICAgIGFjdGlvbihlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEVudGl0eVJlZmVyZW5jZSBlKQotICB7Ci0gICAgYWN0aW9uKGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXQoRW50aXR5IGUpCi0gIHsKLSAgICBhY3Rpb24oZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdChOb3RhdGlvbiBuKQotICB7Ci0gICAgYWN0aW9uKG4pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXQoUHJvY2Vzc2luZ0luc3RydWN0aW9uIGkpCi0gIHsKLSAgICBhY3Rpb24oaSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdChOYW1lZE5vZGVNYXAgbWFwKQotICB7Ci0gICAgaWYgKG1hcCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLmdldExlbmd0aCgpOyArK2kpCi0gICAgICB7Ci0gICAgICAgIGRvVmlzaXQobWFwLml0ZW0oaSkpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vLyBFTkQgT0YgRklMRQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9YTUxVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9YTUxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTFlNDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5YTUxTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5OdWxsVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLlN0cmluZ1V0aWxzOwotCi0vKioKLSAqIFNldCBvZiBYTUwgcmVsYXRlZCB1dGlsaXRpZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTFV0aWxzCi17Ci0JLyoqCi0JICogU29tZSBzYXggZmVhdHVyZXMgdGhhdCBuZWVkIHRvIGJlIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX05BTUVTUEFDRV9QUkVGSVhFUyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX05BTUVTUEFDRVMgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfVkFMSURBVElPTl9TQ0hFTUEgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhQX1NDSEVNQV9MQU5HVUFHRSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhwL3Byb3BlcnRpZXMvc2NoZW1hTGFuZ3VhZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFczQ19YTUxfU0NIRU1BID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXM0NfU09BUF8xMl9TQ0hFTUEgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFBfU0NIRU1BX1NPVVJDRSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhwL3Byb3BlcnRpZXMvc2NoZW1hU291cmNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FWFRFUk5BTF9TQ0hFTUFfTE9DQVRJT04gPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvc2NoZW1hL2V4dGVybmFsLXNjaGVtYUxvY2F0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfRUxFTV9FTlZFTE9QRSA9ICJFbnZlbG9wZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9FTEVNX0hFQURFUiA9ICJIZWFkZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfRUxFTV9CT0RZID0gIkJvZHkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfRUxFTV9GQVVMVCA9ICJGYXVsdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9FTEVNX0ZBVUxUX0NPREUgPSAiZmF1bHRjb2RlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0VMRU1fRkFVTFRfU1RSSU5HID0gImZhdWx0c3RyaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0VMRU1fRkFVTFRfREVUQUlMID0gImRldGFpbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9FTEVNX0ZBVUxUX0FDVE9SID0gImZhdWx0YWN0b3IiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfQVRUUl9NVVNUX1VOREVSU1RBTkQgPSAibXVzdFVuZGVyc3RhbmQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfQVRUUl9BQ1RPUiA9ICJhY3RvciI7Ci0KLQkvKioKLQkgKiBHZXQgWE1MUmVhZGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFhNTFJlYWRlciB2YWx1ZQotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBwcm9ibGVtcyBnZXR0aW5nIHRoZSBYTUxSZWFkZXIKLQkgKiAgICAgICAgICAgaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxSZWFkZXIgZ2V0WE1MUmVhZGVyKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0JCVhNTFJlYWRlciB4bWxSZWFkZXIgPSBudWxsOwotCi0JCXRyeQotCQl7Ci0JCQl4bWxSZWFkZXIgPSAobmV3IG9yZy5hcGFjaGUueGVyY2VzLmpheHAuU0FYUGFyc2VyRmFjdG9yeUltcGwoKSkKLQkJCQkJLm5ld1NBWFBhcnNlcigpLmdldFhNTFJlYWRlcigpOwotCi0JCQkvLyBTZXQgbmFtZXNwYWNlIGF3YXJlCi0JCQl4bWxSZWFkZXIuc2V0RmVhdHVyZShGRUFUVVJFX05BTUVTUEFDRV9QUkVGSVhFUywgdHJ1ZSk7Ci0JCQl4bWxSZWFkZXIuc2V0RmVhdHVyZShGRUFUVVJFX05BTUVTUEFDRVMsIHRydWUpOwotCQl9Ci0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IFhNTFJlYWRlciBpbXBsZW1lbnRhdGlvbi4iLCBlKTsKLQkJfQotCi0JCXJldHVybiB4bWxSZWFkZXI7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGV4dCBzdHJpbmcgYXMgYW4gWE1MIGRvY3VtZW50IGFuZCByZXR1cm4gdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQgWE1MIGRvY3VtZW50IHRleHQuCi0JICogQHBhcmFtIHZhbGlkYXRlIHRydWUgaWYgdGhlIGRvY3VtZW50IHdpbGwgYmUgdmFsaWRhdGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKFN0cmluZyB0ZXh0LCBib29sZWFuIHZhbGlkYXRlKQotCQkJdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwYXJzZVhNTChuZXcgU3RyaW5nUmVhZGVyKHRleHQpLCB2YWxpZGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGV4dCBzdHJpbmcgYXMgYW4gWE1MIGRvY3VtZW50IGFuZCByZXR1cm4gdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQgWE1MIGRvY3VtZW50IHRleHQuCi0JICogQHJldHVybiBhIERvY3VtZW50IG9iamVjdC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUwoU3RyaW5nIHRleHQpIHRocm93cyBXU0lFeGNlcHRpb24gewotCQlyZXR1cm4gcGFyc2VYTUwobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGhlIFhNTCBkb2N1bWVudCBhbmQgcmV0dXJuIHRoZSBkb2N1bWVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSB1cmkgdGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgZG9jdW1lbnQuCi0JICogQHJldHVybiBhIERvY3VtZW50IG9iamVjdC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGV4Y2VwdGlvbiBvZiBzb21lIHNvcnQgaGFzIG9jY3VycmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUxEb2N1bWVudChTdHJpbmcgdXJpKSAKLQl0aHJvd3MgV1NJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiAKLQl7Ci0JCXJldHVybiBwYXJzZVhNTERvY3VtZW50KHVyaSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGhlIFhNTCBkb2N1bWVudCBhbmQgcmV0dXJuIHRoZSBkb2N1bWVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSB1cmkgdGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgZG9jdW1lbnQuCi0JICogQHBhcmFtIHNjaGVtYSBhIFN0cmluZyBpZGVudGlmeWluZyByZWxhdGVkIHNjaGVtYSBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIGEgRG9jdW1lbnQgb2JqZWN0LgotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXhjZXB0aW9uIG9mIHNvbWUgc29ydCBoYXMgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhNTERvY3VtZW50KFN0cmluZyB1cmksIFN0cmluZyBzY2hlbWEpCi0JdGhyb3dzIFdTSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gCi0JewotCSAgICAgIFVSTCB1cmwgPSBTdHJpbmdVdGlscy5nZXRVUkwobnVsbCwgdXJpKTsKLQkgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IChJbnB1dFN0cmVhbSl1cmwuZ2V0Q29udGVudCgpOwotCSAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKTsKLQkgICAgICBpbnB1dFNvdXJjZS5zZXRTeXN0ZW1JZCh1cmwudG9TdHJpbmcoKSk7Ci0JICAgICAgCi0JICAgICAgaWYgKHNjaGVtYSA9PSBudWxsKQotCSAgICAgIAlyZXR1cm4gcGFyc2VYTUwoaW5wdXRTb3VyY2UsIGZhbHNlKTsKLQkgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VYTUwoaW5wdXRTb3VyY2UsIHNjaGVtYSk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIGFuIFhNTCBkb2N1bWVudCBmcm9tIGEgcmVhZGVyIGFuZCByZXR1cm5zIHRoZSBkb2N1bWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHVybCBhIFN0cmluZyBsb2NhdGluZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEBwYXJhbSBzY2hlbWEgYSBTdHJpbmcgaWRlbnRpZnlpbmcgcmVsYXRlZCBzY2hlbWEgZG9jdW1lbnQuCi0JICogQHBhcmFtIGJhc2VVUkkgYSBiYXNlIHVybCB0byBhc3Npc3QgaW4gbG9jYXRpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIERvY3VtZW50LgotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhNTERvY3VtZW50VVJMKFN0cmluZyB1cmwsIFN0cmluZyBzY2hlbWEsCi0JCQlTdHJpbmcgYmFzZVVSSSkgdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQotCQl0cnkKLQkJewotCQkJZG9jdW1lbnQgPSBwYXJzZVhNTERvY3VtZW50VVJMKGNyZWF0ZVVSTCh1cmwsIGJhc2VVUkkpLCBzY2hlbWEpOwotCQl9Ci0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCXJldHVybiBwYXJzZVhNTERvY3VtZW50VVJMKHVybCwgc2NoZW1hKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgYW4gWE1MIGRvY3VtZW50IGZyb20gYSByZWFkZXIgYW5kIHJldHVybnMgdGhlIGRvY3VtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsIGEgVVJMIG9iamVjdCBpZGVudGlmeWluZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEBwYXJhbSBzY2hlbWEgYSBTdHJpbmcgaWRlbnRpZnlpbmcgcmVsYXRlZCBzY2hlbWEgZG9jdW1lbnQuCi0JICogQHJldHVybiBEb2N1bWVudC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUxEb2N1bWVudFVSTChVUkwgdXJsLCBTdHJpbmcgc2NoZW1hKQotCQkJdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0JCXRyeQotCQl7Ci0JICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSAoSW5wdXRTdHJlYW0pdXJsLmdldENvbnRlbnQoKTsKLQkgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbnB1dFN0cmVhbSk7Ci0JICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQodXJsLnRvU3RyaW5nKCkpOwotCi0JCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCi0JCQlpZiAoc2NoZW1hID09IG51bGwpCi0JCQkJZG9jID0gcGFyc2VYTUwoaW5wdXRTb3VyY2UpOwotCQkJZWxzZQotCQkJCWRvYyA9IHBhcnNlWE1MKGlucHV0U291cmNlLCBzY2hlbWEpOwotCi0JCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJcmV0dXJuIGRvYzsKLQkJfQotCi0JCWNhdGNoIChXU0lFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgZTsKLQkJfQotCi0JCWNhdGNoIChUaHJvd2FibGUgdCkKLQkJewotCQkJdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbih0LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgYW4gWE1MIGRvY3VtZW50IGZyb20gYSByZWFkZXIgYW5kIHJldHVybnMgdGhlIGRvY3VtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsU3RyaW5nIGEgU3RyaW5nIGxvY2F0aW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICogQHBhcmFtIGJhc2VVUkkgYSBiYXNlIHVybCB0byBhc3Npc3QgaW4gbG9jYXRpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIERvY3VtZW50IG9iamVjdC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUxEb2N1bWVudFVSTChTdHJpbmcgdXJsU3RyaW5nLCBTdHJpbmcgYmFzZVVSSSkKLQkJCXRocm93cyBXU0lFeGNlcHRpb24gewotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0KLQkJdHJ5Ci0JCXsKLQkJCVVSTCB1cmwgPSBjcmVhdGVVUkwodXJsU3RyaW5nLCBiYXNlVVJJKTsKLQotCQkJZG9jdW1lbnQgPSBwYXJzZVhNTERvY3VtZW50VVJMKHVybCk7Ci0JCX0KLQotCQljYXRjaCAoV1NJRXhjZXB0aW9uIHdlKQotCQl7Ci0JCQl0aHJvdyB3ZTsKLQkJfQotCi0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIGFuIFhNTCBkb2N1bWVudCBmcm9tIGEgcmVhZGVyIGFuZCByZXR1cm5zIHRoZSBkb2N1bWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHVybCBhIFVSTCBvYmplY3QgaWRlbnRpZnlpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIERvY3VtZW50LgotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhNTERvY3VtZW50VVJMKFVSTCB1cmwpIHRocm93cyBXU0lFeGNlcHRpb24gewotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0KLQkJdHJ5Ci0JCXsKLQkJCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIodXJsLm9wZW5TdHJlYW0oKSk7Ci0JCQlJbnB1dFNvdXJjZSBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UocmVhZGVyKTsKLQkJCXNvdXJjZS5zZXRTeXN0ZW1JZCh1cmwudG9TdHJpbmcoKSk7Ci0JCQlkb2N1bWVudCA9IHBhcnNlWE1MKHNvdXJjZSk7Ci0KLQkJCXJlYWRlci5jbG9zZSgpOwotCQl9Ci0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSBhbiBYTUwgZG9jdW1lbnQgZnJvbSBhIHJlYWRlciBhbmQgcmV0dXJuIHRoZSBkb2N1bWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHJlYWRlciBhIFJlYWRlciBvYmplY3QuCi0JICogQHBhcmFtIHZhbGlkYXRlIHRydWUgaWYgdGhlIGRvY3VtZW50IHdpbGwgYmUgdmFsaWRhdGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKElucHV0U291cmNlIHNvdXJjZSwgYm9vbGVhbiB2YWxpZGF0ZSkKLQkJCXRocm93cyBXU0lFeGNlcHRpb24gewotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCi0JCS8vIEdldCB0aGUgZG9jdW1lbnQgZmFjdG9yeQotCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5qYXhwLkRvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsKCk7Ci0KLQkJLy8gU2V0IG5hbWVzcGFjZSBhd2FyZSwgYnV0IGZvciBub3cgZG8gbm90IHZhbGlkYXRlCi0JCWZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCWZhY3Rvcnkuc2V0SWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UodHJ1ZSk7Ci0KLQkJLy8gQUREOiBUaGlzIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIHdlIGhhdmUgYWNjZXNzIHRvIHRoZSBzY2hlbWEKLQkJLy8gZG9jdW1lbnQKLQkJZmFjdG9yeS5zZXRWYWxpZGF0aW5nKHZhbGlkYXRlKTsKLQotCQl0cnkKLQkJewotCQkJLy8gUGFyc2UgdGhlIGRvY3VtZW50Ci0JCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlkb2MgPSBidWlsZGVyLnBhcnNlKHNvdXJjZSk7Ci0JCQkvLyB3b3JrYXJvdW5kIGZvciBjb21wYXRpYmlsaXR5IFhlcmNlcyAyLjIuMSB3aXRoIFhlcmNlcyAyLjYuMiwKLQkJCS8vIFhlcmNlcyAyLjYuMiBzdXBwb3J0ZWQgWE1MIDEuMSBidXQgV1NJLXRvb2wgYW5kIFhlcmNlcyAyLjIuMQotCQkJLy8gc3VwcG9ydGVkIG9ubHkgWE1MIDEuMAotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGwpCi0JCQl7Ci0JCQkJaWYgKCgob3JnLmFwYWNoZS54ZXJjZXMuZG9tLkRvY3VtZW50SW1wbCkgZG9jKS5nZXRYbWxWZXJzaW9uKCkuZXF1YWxzKAotCQkJCQkJIjEuMSIpKQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiRmF0YWwgRXJyb3I6IFhNTCB2ZXJzaW9uICZxdW90OzEuMSZxdW90OyAiCi0JCQkJCQkJKyAiaXMgbm90IHN1cHBvcnRlZCwgb25seSBYTUwgMS4wIGlzIHN1cHBvcnRlZC4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBXU0lFeGNlcHRpb24oIkNvdWxkIG5vdCBwYXJzZSBYTUwgZG9jdW1lbnQuIiwgZSk7Ci0JCX0KLQotCQkvLyBSZXR1cm4gZG9jdW1lbnQKLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSBhbiBYTUwgZG9jdW1lbnQgZnJvbSBhIHJlYWRlciBhbmQgcmV0dXJuIHRoZSBkb2N1bWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHJlYWRlciBhIFJlYWRlciBvYmplY3QuCi0JICogQHBhcmFtIHZhbGlkYXRlIHRydWUgaWYgdGhlIGRvY3VtZW50IHdpbGwgYmUgdmFsaWRhdGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKFJlYWRlciByZWFkZXIsIGJvb2xlYW4gdmFsaWRhdGUpCi0JCQl0aHJvd3MgV1NJRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJQ2xhc3NMb2FkZXIgY3VycmVudExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7ICAgCi0JCXRyeQotCQl7Ci0JCSAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoWE1MVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7ICAgCi0JCSAgQ2xhc3NMb2FkZXIgdGVtcExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCQotCQkgIC8vIENyZWF0ZSBpbnB1dCBzb3VyY2UKLQkJICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpOwotCi0JCSAgLy8gR2V0IHRoZSBkb2N1bWVudCBmYWN0b3J5Ci0JCSAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuamF4cC5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5SW1wbCgpOwotCi0JCSAgLy8gU2V0IG5hbWVzcGFjZSBhd2FyZSwgYnV0IGZvciBub3cgZG8gbm90IHZhbGlkYXRlCi0JCSAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJICBmYWN0b3J5LnNldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKHRydWUpOwotCi0JCSAgLy8gQUREOiBUaGlzIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIHdlIGhhdmUgYWNjZXNzIHRvIHRoZSBzY2hlbWEKLQkJICAvLyBkb2N1bWVudAotCQkgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyh2YWxpZGF0ZSk7Ci0KLQkJICAvLyBQYXJzZSB0aGUgZG9jdW1lbnQKLQkJICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCSAgZG9jID0gYnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0JICAgCSAgLy8gd29ya2Fyb3VuZCBmb3IgY29tcGF0aWJpbGl0eSBYZXJjZXMgMi4yLjEgd2l0aCBYZXJjZXMgMi42LjIsCi0JCSAgLy8gWGVyY2VzIDIuNi4yIHN1cHBvcnRlZCBYTUwgMS4xIGJ1dCBXU0ktdG9vbCBhbmQgWGVyY2VzIDIuMi4xCi0JCSAgLy8gc3VwcG9ydGVkIG9ubHkgWE1MIDEuMAotCQkgIGlmIChkb2MgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsKQotCQkgIHsKLQkJCWlmICgoKG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGwpIGRvYykuZ2V0WG1sVmVyc2lvbigpLmVxdWFscygKLQkJCQkJCSIxLjEiKSkKLQkJCXsKLQkJCSAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiRmF0YWwgRXJyb3I6IFhNTCB2ZXJzaW9uICZxdW90OzEuMSZxdW90OyAiCi0JCQkJCQkJKyAiaXMgbm90IHN1cHBvcnRlZCwgb25seSBYTUwgMS4wIGlzIHN1cHBvcnRlZC4iKTsKLQkJCX0KLQkgICAgICB9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2UgWE1MIGRvY3VtZW50LiIsIGUpOwotCQl9Ci0JICAgIGZpbmFsbHkKLQkgICAgeyAKLQkgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjdXJyZW50TG9hZGVyKTsKLQkgICAgfSAgICAKLQotCQkvLyBSZXR1cm4gZG9jdW1lbnQKLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSBhbiBYTUwgZG9jdW1lbnQgZnJvbSBhIGlucHV0IHNvdXJjZSBhbmQgcmV0dXJuIHRoZSBkb2N1bWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZSBhIElucHV0U291cmNlIG9iamVjdC4KLQkgKiBAcmV0dXJuIGEgRG9jdW1lbnQgb2JqZWN0LgotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhNTChSZWFkZXIgcmVhZGVyKSB0aHJvd3MgV1NJRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHBhcnNlWE1MKHJlYWRlciwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIGFuIFhNTCBkb2N1bWVudCBmcm9tIGEgaW5wdXQgc291cmNlIGFuZCByZXR1cm4gdGhlIGRvY3VtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlIGEgSW5wdXRTb3VyY2Ugb2JqZWN0LgotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKElucHV0U291cmNlIHNvdXJjZSkgdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwYXJzZVhNTChzb3VyY2UsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSB0ZXh0IHN0cmluZyBhcyBhbiBYTUwgZG9jdW1lbnQgYW5kIHJldHVybiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dCBYTUwgZG9jdW1lbnQgdGV4dC4KLQkgKiBAcGFyYW0gc2NoZW1hIGEgU3RyaW5nIGlkZW50aWZ5aW5nIHJlbGF0ZWQgc2NoZW1hIGRvY3VtZW50LgotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKFN0cmluZyB0ZXh0LCBTdHJpbmcgc2NoZW1hKQotCQkJdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwYXJzZVhNTChuZXcgU3RyaW5nUmVhZGVyKHRleHQpLCBzY2hlbWEpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRleHQgc3RyaW5nIGFzIGFuIFhNTCBkb2N1bWVudCBhbmQgcmV0dXJuIHRoZSBkb2N1bWVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IFhNTCBkb2N1bWVudCB0ZXh0LgotCSAqIEBwYXJhbSBzY2hlbWFzIGEgY29sbGVjdGlvbiBvZiByZWxhdGVkIHNjaGVtYSBkb2N1bWVudHMuCi0JICogQHJldHVybiBhIERvY3VtZW50IG9iamVjdC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUwoU3RyaW5nIHRleHQsIENvbGxlY3Rpb24gc2NoZW1hcykKLQkJCXRocm93cyBXU0lFeGNlcHRpb24gewotCQlyZXR1cm4gcGFyc2VYTUwobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSwgc2NoZW1hcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBQYXJzZSB0aGUgWE1MIGRvY3VtZW50IGFuZCByZXR1cm4gdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQgWE1MIGRvY3VtZW50IHRleHQuCi0JICogQHBhcmFtIHNjaGVtYVN0cmluZyBhIFN0cmluZ1JlYWRlciBvYmplY3QuCi0JICogQHJldHVybiBhIERvY3VtZW50IG9iamVjdC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGV4Y2VwdGlvbiBvZiBzb21lIHNvcnQgaGFzIG9jY3VycmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUwoU3RyaW5nIHRleHQsIFN0cmluZ1JlYWRlciBzY2hlbWFTdHJpbmcpCi0JCQl0aHJvd3MgV1NJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBwYXJzZVhNTChuZXcgU3RyaW5nUmVhZGVyKHRleHQpLCBzY2hlbWFTdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBYTUwgZG9jdW1lbnQgYW5kIHJldHVybiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyIGEgUmVhZGVyIG9iamVjdC4KLQkgKiBAcGFyYW0gc2NoZW1hIGEgU3RyaW5nIGlkZW50aWZ5aW5nIHJlbGF0ZWQgc2NoZW1hIGRvY3VtZW50LgotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKFJlYWRlciByZWFkZXIsIFN0cmluZyBzY2hlbWEpCi0JCQl0aHJvd3MgV1NJRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJQ2xhc3NMb2FkZXIgY3VycmVudExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7ICAgCi0JCXRyeQotCQl7Ci0gICAgCSAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoWE1MVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7ICAgCi0JCSAgLy8gQ3JlYXRlIGlucHV0IHNvdXJjZQotCQkgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7Ci0KLQkJICAvLyBHZXQgdGhlIGRvY3VtZW50IGZhY3RvcnkKLQkJICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5qYXhwLkRvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsKCk7Ci0KLQkJICAvLyBTZXQgbmFtZXNwYWNlIGF3YXJlLCBidXQgZm9yIG5vdyBkbyBub3QgdmFsaWRhdGUKLQkJICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkgIGZhY3Rvcnkuc2V0SWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UodHJ1ZSk7Ci0KLQkJICB0cnkKLQkJICB7Ci0JCSAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcodHJ1ZSk7Ci0JCQlmYWN0b3J5LnNldEF0dHJpYnV0ZShKQVhQX1NDSEVNQV9MQU5HVUFHRSwgVzNDX1hNTF9TQ0hFTUEpOwotIAkJICB9Ci0gICAJCSAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQotCQkgIHsKLQkJCVN0cmluZyBlcnJNZXNzYWdlID0gIkVycm9yOiBKQVhQIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYXR0cmlidXRlIG5vdCByZWNvZ25pemVkOiAiCi0JCQkJCSsgSkFYUF9TQ0hFTUFfTEFOR1VBR0UKLQkJCQkJKyAiXG4iCi0JCQkJCSsgIkNoZWNrIHRvIHNlZSBpZiBwYXJzZXIgY29uZm9ybXMgdG8gSkFYUCAxLjIgc3BlYy4iOwotCQkJdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbihlcnJNZXNzYWdlLCBlKTsKLQkJICB9Ci0JCSAgZmFjdG9yeS5zZXRBdHRyaWJ1dGUoSkFYUF9TQ0hFTUFfU09VUkNFLCBuZXcgSW5wdXRTb3VyY2Uoc2NoZW1hKSk7Ci0KLQkJICAvLyBQYXJzZSB0aGUgZG9jdW1lbnQKLQkJICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCSAgYnVpbGRlci5zZXRFcnJvckhhbmRsZXIobmV3IEVyckhhbmRsZXIoKSk7Ci0JCSAgZG9jID0gYnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0KLQkJICAvLyB3b3JrYXJvdW5kIGZvciBjb21wYXRpYmlsaXR5IFhlcmNlcyAyLjIuMSB3aXRoIFhlcmNlcyAyLjYuMiwKLQkJICAvLyBYZXJjZXMgMi42LjIgc3VwcG9ydGVkIFhNTCAxLjEgYnV0IFdTSS10b29sIGFuZCBYZXJjZXMgMi4yLjEKLQkJICAvLyBzdXBwb3J0ZWQgb25seSBYTUwgMS4wCi0JCSAgaWYgKGRvYyBpbnN0YW5jZW9mIG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGwpCi0JCSAgewotCQkJaWYgKCgob3JnLmFwYWNoZS54ZXJjZXMuZG9tLkRvY3VtZW50SW1wbCkgZG9jKS5nZXRYbWxWZXJzaW9uKCkuZXF1YWxzKCIxLjEiKSkKLQkJCXsKLQkJIAkgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkZhdGFsIEVycm9yOiBYTUwgdmVyc2lvbiAmcXVvdDsxLjEmcXVvdDsgIgotCQkJCQkJCSsgImlzIG5vdCBzdXBwb3J0ZWQsIG9ubHkgWE1MIDEuMCBpcyBzdXBwb3J0ZWQuIik7Ci0JCQl9Ci0JCSAgfQotCSAgICB9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiQ291bGQgbm90IHBhcnNlIFhNTCBkb2N1bWVudC4iLCBlKTsKLQkJfQotCSAgICBmaW5hbGx5Ci0JICAgIHsgCi0JICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY3VycmVudExvYWRlcik7Ci0JICAgIH0gICAgCi0JCS8vIFJldHVybiBkb2N1bWVudAotICAgIAlyZXR1cm4gZG9jOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBYTUwgZG9jdW1lbnQgYW5kIHJldHVybiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyIGEgUmVhZGVyIG9iamVjdC4KLQkgKiBAcGFyYW0gc2NoZW1hIGEgU3RyaW5nIGlkZW50aWZ5aW5nIHJlbGF0ZWQgc2NoZW1hIGRvY3VtZW50LgotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKElucHV0U291cmNlIHNvdXJjZSwgU3RyaW5nIHNjaGVtYSkKLQkJCXRocm93cyBXU0lFeGNlcHRpb24gewotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQkvLyBHZXQgdGhlIGRvY3VtZW50IGZhY3RvcnkKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuamF4cC5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5SW1wbCgpOwotCi0JCS8vIFNldCBuYW1lc3BhY2UgYXdhcmUsIGJ1dCBmb3Igbm93IGRvIG5vdCB2YWxpZGF0ZQotCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQlmYWN0b3J5LnNldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKHRydWUpOwotCi0JCWZhY3Rvcnkuc2V0VmFsaWRhdGluZyh0cnVlKTsKLQkJdHJ5Ci0JCXsKLQkJCWZhY3Rvcnkuc2V0QXR0cmlidXRlKEpBWFBfU0NIRU1BX0xBTkdVQUdFLCBXM0NfWE1MX1NDSEVNQSk7Ci0JCX0KLQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0JCXsKLQkJCVN0cmluZyBlcnJNZXNzYWdlID0gIkVycm9yOiBKQVhQIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYXR0cmlidXRlIG5vdCByZWNvZ25pemVkOiAiCi0JCQkJCSsgSkFYUF9TQ0hFTUFfTEFOR1VBR0UKLQkJCQkJKyAiXG4iCi0JCQkJCSsgIkNoZWNrIHRvIHNlZSBpZiBwYXJzZXIgY29uZm9ybXMgdG8gSkFYUCAxLjIgc3BlYy4iOwotCQkJdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbihlcnJNZXNzYWdlLCBlKTsKLQkJfQotCQlmYWN0b3J5LnNldEF0dHJpYnV0ZShKQVhQX1NDSEVNQV9TT1VSQ0UsIG5ldyBJbnB1dFNvdXJjZShzY2hlbWEpKTsKLQotCQl0cnkKLQkJewotCQkJLy8gUGFyc2UgdGhlIGRvY3VtZW50Ci0JCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlidWlsZGVyLnNldEVycm9ySGFuZGxlcihuZXcgRXJySGFuZGxlcigpKTsKLQkJCWRvYyA9IGJ1aWxkZXIucGFyc2Uoc291cmNlKTsKLQotCQkJLy8gd29ya2Fyb3VuZCBmb3IgY29tcGF0aWJpbGl0eSBYZXJjZXMgMi4yLjEgd2l0aCBYZXJjZXMgMi42LjIsCi0JCQkvLyBYZXJjZXMgMi42LjIgc3VwcG9ydGVkIFhNTCAxLjEgYnV0IFdTSS10b29sIGFuZCBYZXJjZXMgMi4yLjEKLQkJCS8vIHN1cHBvcnRlZCBvbmx5IFhNTCAxLjAKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsKQotCQkJewotCQkJCWlmICgoKG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGwpIGRvYykuZ2V0WG1sVmVyc2lvbigpLmVxdWFscygKLQkJCQkJCSIxLjEiKSkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBXU0lFeGNlcHRpb24oIkZhdGFsIEVycm9yOiBYTUwgdmVyc2lvbiAmcXVvdDsxLjEmcXVvdDsgIgotCQkJCQkJCSsgImlzIG5vdCBzdXBwb3J0ZWQsIG9ubHkgWE1MIDEuMCBpcyBzdXBwb3J0ZWQuIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2UgWE1MIGRvY3VtZW50LiIsIGUpOwotCQl9Ci0KLQkJLy8gUmV0dXJuIGRvY3VtZW50Ci0JCXJldHVybiBkb2M7Ci0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSB0aGUgWE1MIGRvY3VtZW50IGFuZCByZXR1cm4gdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lIGEgUmVhZGVyIG9iamVjdC4KLQkgKiBAcGFyYW0gc2NoZW1hU3RyaW5nIGEgU3RyaW5nUmVhZGVyIG9iamVjdC4KLQkgKiBAcmV0dXJuIGEgRG9jdW1lbnQgb2JqZWN0LgotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhNTChSZWFkZXIgZmlsZW5hbWUsIFN0cmluZ1JlYWRlciBzY2hlbWFTdHJpbmcpCi0JCQl0aHJvd3MgV1NJRXhjZXB0aW9uIHsKLQotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCi0JCS8vIENyZWF0ZSBpbnB1dCBzb3VyY2UKLQkJSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoZmlsZW5hbWUpOwotCi0JCS8vIEdldCB0aGUgZG9jdW1lbnQgZmFjdG9yeQotCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5qYXhwLkRvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsKCk7Ci0KLQkJLy8gU2V0IG5hbWVzcGFjZSBhd2FyZSwgYnV0IGZvciBub3cgZG8gbm90IHZhbGlkYXRlCi0JCWZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCWZhY3Rvcnkuc2V0SWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UodHJ1ZSk7Ci0KLQkJZmFjdG9yeS5zZXRWYWxpZGF0aW5nKHRydWUpOwotCQl0cnkKLQkJewotCQkJZmFjdG9yeS5zZXRBdHRyaWJ1dGUoSkFYUF9TQ0hFTUFfTEFOR1VBR0UsIFczQ19YTUxfU0NIRU1BKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0JCXsKLQkJCVN0cmluZyBlcnJNZXNzYWdlID0gIkVycm9yOiBKQVhQIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYXR0cmlidXRlIG5vdCByZWNvZ25pemVkOiAiCi0JCQkJCSsgSkFYUF9TQ0hFTUFfTEFOR1VBR0UKLQkJCQkJKyAiXG4iCi0JCQkJCSsgIkNoZWNrIHRvIHNlZSBpZiBwYXJzZXIgY29uZm9ybXMgdG8gSkFYUCAxLjIgc3BlYy4iOwotCQkJdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbihlcnJNZXNzYWdlLCBlKTsKLQkJfQotCQlmYWN0b3J5LnNldEF0dHJpYnV0ZShKQVhQX1NDSEVNQV9TT1VSQ0UsIG5ldyBJbnB1dFNvdXJjZShzY2hlbWFTdHJpbmcpKTsKLQkJdHJ5Ci0JCXsKLQkJCS8vIFBhcnNlIHRoZSBkb2N1bWVudAotCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJYnVpbGRlci5zZXRFcnJvckhhbmRsZXIobmV3IEVyckhhbmRsZXIoKSk7Ci0JCQlkb2MgPSBidWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBXU0lFeGNlcHRpb24oIkNvdWxkIG5vdCBwYXJzZSBYTUwgZG9jdW1lbnQuIiwgZSk7Ci0JCX0KLQotCQkvLyBSZXR1cm4gZG9jdW1lbnQKLQkJcmV0dXJuIGRvYzsKLQotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBYTUwgZG9jdW1lbnQgYW5kIHJldHVybiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUgYSBSZWFkZXIgb2JqZWN0Ci0JICogQHBhcmFtIHNjaGVtYVN0cmluZ3MgYSBjb2xsZWN0aW9uIG9mIHJlbGF0ZWQgc2NoZW1hIGRvY3VtZW50cy4KLQkgKiBAcmV0dXJuIGEgRG9jdW1lbnQgb2JqZWN0LgotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhNTChSZWFkZXIgZmlsZW5hbWUsIENvbGxlY3Rpb24gc2NoZW1hU3RyaW5ncykKLQkJCXRocm93cyBXU0lFeGNlcHRpb24gewotCi0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0KLQkJLy8gQ3JlYXRlIGlucHV0IHNvdXJjZQotCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShmaWxlbmFtZSk7Ci0KLQkJLy8gR2V0IHRoZSBkb2N1bWVudCBmYWN0b3J5Ci0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmpheHAuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUltcGwoKTsKLQotCQkvLyBTZXQgbmFtZXNwYWNlIGF3YXJlLCBidXQgZm9yIG5vdyBkbyBub3QgdmFsaWRhdGUKLQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJZmFjdG9yeS5zZXRJZ25vcmluZ0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSh0cnVlKTsKLQotCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcodHJ1ZSk7Ci0JCXRyeQotCQl7Ci0JCQlmYWN0b3J5LnNldEF0dHJpYnV0ZShKQVhQX1NDSEVNQV9MQU5HVUFHRSwgVzNDX1hNTF9TQ0hFTUEpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKLQkJewotCQkJU3RyaW5nIGVyck1lc3NhZ2UgPSAiRXJyb3I6IEpBWFAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBhdHRyaWJ1dGUgbm90IHJlY29nbml6ZWQ6ICIKLQkJCQkJKyBKQVhQX1NDSEVNQV9MQU5HVUFHRQotCQkJCQkrICJcbiIKLQkJCQkJKyAiQ2hlY2sgdG8gc2VlIGlmIHBhcnNlciBjb25mb3JtcyB0byBKQVhQIDEuMiBzcGVjLiI7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKGVyck1lc3NhZ2UsIGUpOwotCQl9Ci0JCS8vIGNvbnZlcnQgc2NoZW1hIHN0cmluZ3MgdG8gYXJyYXkgb2YgSW5wdXRTb3VyY2VzCi0JCUl0ZXJhdG9yIGkgPSBzY2hlbWFTdHJpbmdzLml0ZXJhdG9yKCk7Ci0JCVZlY3RvciByZWFkZXJzID0gbmV3IFZlY3RvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpCi0JCXsKLQkJCVN0cmluZyBuZXh0U2NoZW1hID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlyZWFkZXJzLmFkZChuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihuZXh0U2NoZW1hKSkpOwotCQl9Ci0JCUlucHV0U291cmNlW10gaW5wdXRTb3VyY2VzID0gKElucHV0U291cmNlW10pIHJlYWRlcnMKLQkJCQkudG9BcnJheShuZXcgSW5wdXRTb3VyY2VbXXt9KTsKLQkJLy8gcGFzcyBhbiBhcnJheSBvZiBzY2hlbWEgc3RyaW5ncyAoZWFjaCBvZiB3aGljaCBjb250YWlucyBhIHNjaGVtYSkKLQkJZmFjdG9yeS5zZXRBdHRyaWJ1dGUoSkFYUF9TQ0hFTUFfU09VUkNFLCBpbnB1dFNvdXJjZXMpOwotCi0JCXRyeQotCQl7Ci0JCQkvLyBQYXJzZSB0aGUgZG9jdW1lbnQKLQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCWJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBFcnJIYW5kbGVyKCkpOwotCQkJZG9jID0gYnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2UgWE1MIGRvY3VtZW50LiIsIGUpOwotCQl9Ci0KLQkJLy8gUmV0dXJuIGRvY3VtZW50Ci0JCXJldHVybiBkb2M7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgYXR0cmlidXRlIHZhbHVlIHdpdGggdGhlIGdpdmVuIG5hbWUgZGVmaW5lZCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGFuIEVsZW1lbnQgb2JqZWN0LgotCSAqIEBwYXJhbSBhdHRyTmFtZSBhIG5hbWUgb2YgYW4gYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCVN0cmluZyBhdHRyVmFsdWUgPSBudWxsOwotCQlBdHRyIGF0dHIgPSBudWxsOwotCi0JCS8vIEdldCB0aGUgYXR0cmlidXRlIHVzaW5nIGl0cyBuYW1lCi0JCWlmICgoYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShhdHRyTmFtZSkpICE9IG51bGwpCi0JCXsKLQkJCWF0dHJWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKS50cmltKCk7Ci0JCX0KLQotCQkvLyBSZXR1cm4gYXR0cmlidXRlIHZhbHVlCi0JCXJldHVybiBhdHRyVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0IGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhbiBFbGVtZW50IG9iamVjdC4KLQkgKiBAcGFyYW0gYXR0ck5hbWUgYSBuYW1lIG9mIGFuIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaWYgZm91bmQuIE90aGVyd2lzZSB0aGUgc3BlY2lmaWVkIGRlZmF1bHQKLQkgKiAgICAgICAgIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJOYW1lLAotCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlTdHJpbmcgcmV0dXJuVmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCVN0cmluZyBhdHRyVmFsdWUgPSBudWxsOwotCi0JCWlmICgoYXR0clZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgYXR0ck5hbWUpKSAhPSBudWxsKQotCQkJcmV0dXJuVmFsdWUgPSBhdHRyVmFsdWU7Ci0KLQkJcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldCBhdHRyaWJ1dGUgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYW4gRWxlbWVudCBvYmplY3QuCi0JICogQHBhcmFtIG5hbWVzcGFjZSBhIG5hbWVzcGFjZS4KLQkgKiBAcGFyYW0gYXR0ck5hbWUgYSBuYW1lIG9mIGFuIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZU5TKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZSwKLQkJCVN0cmluZyBhdHRyTmFtZSkgewotCQlTdHJpbmcgYXR0clZhbHVlID0gbnVsbDsKLQkJQXR0ciBhdHRyID0gbnVsbDsKLQotCQkvLyBHZXQgdGhlIGF0dHJpYnV0ZSB1c2luZyBpdHMgbmFtZQotCQlpZiAoKGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGVOUyhuYW1lc3BhY2UsIGF0dHJOYW1lKSkgIT0gbnVsbCkKLQkJewotCQkJYXR0clZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpLnRyaW0oKTsKLQkJfQotCi0JCS8vIFJldHVybiBhdHRyaWJ1dGUgdmFsdWUKLQkJcmV0dXJuIGF0dHJWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgZnJvbSB0aGUgaW5wdXQgZWxtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGFuIEVsZW1lbnQgb2JqZWN0LgotCSAqIEByZXR1cm4gdGhlIGZpcnN0Y2hpbGQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0Rmlyc3RDaGlsZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gUmV0dXJuIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50Ci0JCXJldHVybiBmaW5kTmV4dFNpYmxpbmcoZWxlbWVudC5nZXRGaXJzdENoaWxkKCkpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgLSBhbiBFbGVtZW50IG9iamVjdC4KLQkgKiBAcmV0dXJuIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0TmV4dFNpYmxpbmcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIFJldHVybiBuZXh0IHNpYmxpbmcgZWxlbWVudAotCQlyZXR1cm4gZmluZE5leHRTaWJsaW5nKGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0Tm9kZSBYTUwgc3RhcnQgbm9kZS4KLQkgKiBAcmV0dXJuIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEVsZW1lbnQgZmluZE5leHRTaWJsaW5nKE5vZGUgc3RhcnROb2RlKSB7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCUVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0KLQkJLy8gRmluZCB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQKLQkJZm9yIChub2RlID0gc3RhcnROb2RlOyBub2RlICE9IG51bGwgJiYgcmV0dXJuRWxlbWVudCA9PSBudWxsOyBub2RlID0gbm9kZQotCQkJCS5nZXROZXh0U2libGluZygpKQotCQl7Ci0JCQkvLyBJZiB0aGlzIG5vZGUgaXMgYW4gZWxlbWVudCBub2RlLCB0aGVuIHJldHVybiBpdAotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXsKLQkJCQlyZXR1cm5FbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQl9Ci0JCX0KLQotCQkvLyBSZXR1cm4gbmV4dCBzaWJsaW5nIGVsZW1lbnQKLQkJcmV0dXJuIChFbGVtZW50KSByZXR1cm5FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIHByZXZpb3VzIHNpYmxpbmcgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnROb2RlIFhNTCBzdGFydCBub2RlLgotCSAqIEByZXR1cm4gdGhlIHByZXZpb3VzIHNpYmxpbmcgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZmluZFByZXZpb3VzU2libGluZyhOb2RlIHN0YXJ0Tm9kZSkgewotCQlpZiAoc3RhcnROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl3aGlsZSAoc3RhcnROb2RlICE9IG51bGwpCi0JCXsKLQkJCXN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmIChzdGFydE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChzdGFydE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm4gKEVsZW1lbnQpIHN0YXJ0Tm9kZTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdGV4dCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYW4gRWxlbWVudCBvYmplY3QuCi0JICogQHJldHVybiB0aGUgdGV4dCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGV4dChFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCi0JCS8vIEdldCBmaXJzdCBjaGlsZCBlbGVtZW50Ci0JCU5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCi0JCS8vIE5vZGVMaXN0IG5vZGVMaXN0ID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0KLQkJLy8gaW50IGxlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCi0JCS8vIFByb2Nlc3Mgd2hpbGUgdGhlcmUgYXJlIG5vZGVzIGFuZCB0aGUgdGV4dCBoYXNuJ3QgYmVlbiBmb3VuZAotCQl3aGlsZSAoKG5vZGUgIT0gbnVsbCkgJiYgKHRleHQgPT0gbnVsbCkpCi0JCXsKLQkJCS8vIElmIGEgdGV4dCBub2RlIG9yIGNkYXRhIHNlY3Rpb24gaXMgZm91bmQsIHRoZW4gZ2V0IHRleHQKLQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQl8fCAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKSkKLQkJCXsKLQkJCQl0ZXh0ID0gKChDaGFyYWN0ZXJEYXRhKSBub2RlKS5nZXREYXRhKCk7Ci0JCQl9Ci0KLQkJCS8vIEdldCBuZXh0IHNpYmxpbmcKLQkJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQotCQlpZiAodGV4dCAhPSBudWxsKQotCQkJdGV4dCA9IHRleHQudHJpbSgpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBRTmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gcW5hbWUgYSBRTmFtZSBvYmplY3QuCi0JICogQHBhcmFtIGVsZW1lbnQgYW4gRWxlbWVudCBvYmplY3QuCi0JICogQHJldHVybiB0cnVlIGlmIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIFFOYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoUU5hbWUgcW5hbWUsIEVsZW1lbnQgZWxlbWVudCkgewotCQlib29sZWFuIGVxdWFscyA9IGZhbHNlOwotCi0JCS8vIElmIGJvdGggdGhlIG5hbWVzcGFjZSBVUkkgYW5kIGxvY2FsIG5hbWUgYXJlIHRoZSBzYW1lLCB0aGVuIHRoZXkgYXJlCi0JCS8vIGVxdWFsCi0JCWlmICgocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpKQotCQkJCSYmIChxbmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoZWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpKQotCQl7Ci0JCQllcXVhbHMgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGVxdWFsczsKLQl9Ci0KLQkvKioKLQkgKiBYTUwgZW5jb2RlIGEgdGV4dCBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHRleHQgLSBhIFN0cmluZy4KLQkgKiBAcmV0dXJuIGFuIFhNTCBlbmNvZGVkIHRleHQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbEVzY2FwZWRTdHJpbmcoU3RyaW5nIHRleHQpIAotCXsKLQkgIGlmICh0ZXh0ID09IG51bGwpIHJldHVybiB0ZXh0OwotCSAgZWxzZQotCSAgewotCSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHRleHQubGVuZ3RoKCkqMik7Ci0JICAgIGludCBzaXplID0gdGV4dC5sZW5ndGgoKTsKLQkgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykKLQkgICAgewotCSAgICAgIGNoYXIgYyA9IHRleHQuY2hhckF0KGkpOwotCSAgICAgIHN3aXRjaCAoYykKLQkJICB7Ci0gICAgICAgICAgICAgY2FzZSAnPCc6IAotICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImbHQ7Iik7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICBjYXNlICc+JzogCi0gICAgICAgICAgICAgCXNiLmFwcGVuZCgiJmd0OyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIGNhc2UgJyYnOiAKLSAgICAgICAgICAgICAJc2IuYXBwZW5kKCImYW1wOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIGNhc2UgJyInOiAKLSAgICAgICAgICAgICAJc2IuYXBwZW5kKCImcXVvdDsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICBjYXNlICdcJyc6IAotICAgICAgICAgICAgIAlzYi5hcHBlbmQoIiZhcG9zOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIGNhc2UgJ1xyJzogCi0gICAgICAgICAgICAgCXNiLmFwcGVuZCgiJiN4ZDsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgIAlzYi5hcHBlbmQoYyk7Ci0JCSAgfQotCQl9Ci0JICAgIHJldHVybiAgc2IudG9TdHJpbmcoKTsKLQkgIH0KLQl9Ci0KLQkvKioKLQkgKiBYTUwgZW5jb2RlIGEgdGV4dCBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHRleHQgLSBhIFN0cmluZy4KLQkgKiBAcmV0dXJuIGFuIFhNTCBlbmNvZGVkIHRleHQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbFJlbW92ZUVzY2FwZWRTdHJpbmcoU3RyaW5nIHRleHQpIAotCXsKLQkgIGlmICh0ZXh0ID09IG51bGwpIHJldHVybiB0ZXh0OwotCSAgZWxzZQotCSAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHRleHQpOwotICAgICAgCi0JICAgIGludCBpID0gc2IuaW5kZXhPZigiJiN4ZDsiKTsKLQkgICAgd2hpbGUoaSAhPSAtMSkKLQkgICAgewotCSAgICAgIHNiLnJlcGxhY2UoaSwgaSs1LCAiXHIiKTsKLQkgICAgICBpID0gc2IuaW5kZXhPZigiJiN4ZDsiKTsKLQkgICAgfQotCSAgICAKLQkgICAgaSA9IHNiLmluZGV4T2YoIiZsdDsiKTsKLQkgICAgd2hpbGUoaSAhPSAtMSkKLQkgICAgewotCSAgICAgIHNiLnJlcGxhY2UoaSwgaSs0LCAiPCIpOwotCSAgICAgIGkgPSBzYi5pbmRleE9mKCImbHQ7Iik7Ci0JICAgIH0KLQotCSAgICBpID0gc2IuaW5kZXhPZigiJmd0OyIpOwotCSAgICB3aGlsZShpICE9IC0xKQotCSAgICB7Ci0JICAgICAgc2IucmVwbGFjZShpLCBpKzQsICI+Iik7Ci0JICAgICAgaSA9IHNiLmluZGV4T2YoIiZndDsiKTsKLQkgICAgfQotCi0JICAgIGkgPSBzYi5pbmRleE9mKCImcXVvdDsiKTsKLQkgICAgd2hpbGUoaSAhPSAtMSkKLQkgICAgewotCSAgICAgIHNiLnJlcGxhY2UoaSwgaSs2LCAiXCIiKTsKLQkgICAgICBpID0gc2IuaW5kZXhPZigiJnF1b3Q7Iik7Ci0JICAgIH0KLQotCSAgICBpID0gc2IuaW5kZXhPZigiJmFwb3M7Iik7Ci0JICAgIHdoaWxlKGkgIT0gLTEpCi0JICAgIHsKLQkgICAgICBzYi5yZXBsYWNlKGksIGkrNiwgIlwnIik7Ci0JICAgICAgaSA9IHNiLmluZGV4T2YoIiZhcG9zOyIpOwotCSAgICB9Ci0KLQkgICAgaSA9IHNiLmluZGV4T2YoIiZhbXA7Iik7Ci0JICAgIHdoaWxlKGkgIT0gLTEpCi0JICAgIHsKLQkgICAgICBzYi5yZXBsYWNlKGksIGkrNSwgIiYiKTsKLQkgICAgICBpID0gc2IuaW5kZXhPZigiJmFtcDsiKTsKLQkgICAgfQotIAkgICAgcmV0dXJuICBzYi50b1N0cmluZygpOwotCSAgfQotCX0KLQkvKioKLQkgKiBHZXQgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gYSBwYXJlbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgdGFnIHRvIHNlcmFjaCBmb3IuCi0JICogQHBhcmFtIHBhcmVudEVsZW1lbnQgdGhlIHBhcmVudCBlbGVtZW50LgotCSAqIEByZXR1cm4gYW4gZWxlbWVudCBnaXZlbiB0aGUgbmFtZSBhbmQgdGhlIHBhcmVudCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudCBwYXJlbnRFbGVtZW50KSB7Ci0JCUVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0JCU5vZGVMaXN0IG5sOwotCi0JCS8vIEdldCB0aGUgbGlzdCBvZiBlbGVtZW50cwotCQlpZiAoKG5sID0gcGFyZW50RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShlbGVtZW50TmFtZSkpICE9IG51bGwpCi0JCXsKLQkJCS8vIFJldHVybiBmaXJzdCBlbGVtZW50IGZvdW5kCi0JCQlyZXR1cm5FbGVtZW50ID0gKEVsZW1lbnQpIG5sLml0ZW0oMCk7Ci0JCX0KLQotCQkvLyBSZXR1cm4gZWxlbWVudAotCQlyZXR1cm4gcmV0dXJuRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBlbGVtZW50IG1hdGNoZXMgc3BlY2lmaWVkIGxvY2FsIG5hbWUgaW4gdGhlIHNwZWNpZmllZAotCSAqIG5hbWVzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhbiBFbGVtZW50IG9iamVjdC4KLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIGEgbmFtZXNwYWNlLgotCSAqIEBwYXJhbSBsb2NhbE5hbWUgYSBsb2NhbCBuYW1lLgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgbWF0Y2hlcyBzcGVjaWZpZWQgbG9jYWwgbmFtZSBpbiB0aGUgc3BlY2lmaWVkCi0JICogICAgICAgICBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRWxlbWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lc3BhY2VVUkksCi0JCQlTdHJpbmcgbG9jYWxOYW1lKSB7Ci0JCWJvb2xlYW4gaXNFbGVtZW50ID0gZmFsc2U7Ci0KLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkJewotCQkJLy8gQ2hlY2sgaXMKLQkJCWlmIChlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhuYW1lc3BhY2VVUkkpCi0JCQkJCSYmIGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKGxvY2FsTmFtZSkpCi0JCQl7Ci0JCQkJaXNFbGVtZW50ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpc0VsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIHRoaXMgZWxlbWVudCBtYXRjaGVzIHNwZWNpZmllZCBsb2NhbCBuYW1lIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lc3BhY2UuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYW4gRWxlbWVudCBvYmplY3QuCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSXMgYSBsaXN0IG9mIHZhbGlkIG5hbWVzcGFjZXMuCi0JICogQHBhcmFtIGxvY2FsTmFtZSBhIGxvY2FsIG5hbWUuCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgZWxlbWVudCBtYXRjaGVzIHNwZWNpZmllZCBsb2NhbCBuYW1lIGluIHRoZSBzcGVjaWZpZWQKLQkgKiAgICAgICAgIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbGVtZW50KEVsZW1lbnQgZWxlbWVudCwgTGlzdCBuYW1lc3BhY2VVUklzLAotCQkJU3RyaW5nIGxvY2FsTmFtZSkgewotCQlib29sZWFuIGlzRWxlbWVudCA9IGZhbHNlOwotCi0JCWlmIChlbGVtZW50ICE9IG51bGwpCi0JCXsKLQkJCS8vIENoZWNrIGlzCi0JCQlpZiAobmFtZXNwYWNlVVJJcy5jb250YWlucyhlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKQotCQkJCQkmJiBlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhsb2NhbE5hbWUpKQotCQkJewotCQkJCWlzRWxlbWVudCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXNFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEdldCBlbGVtZW50IHRleHQgYXMgYSBib29sZWFuLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGFuIEVsZW1lbnQgb2JqZWN0LgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgYSBib29sZWFuIHRvIGJlIHVzZWQgYXMgYSBkZWZhdWx0IHZhbHVlLgotCSAqIEByZXR1cm4gZWxlbWVudCB0ZXh0IGFzIGEgYm9vbGVhbiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJYm9vbGVhbiByZXR1cm5WYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJU3RyaW5nIGJvb2xlYW5WYWx1ZSA9IG51bGw7Ci0KLQkJLy8gR2V0IHZhbHVlIGFzIGEgc3RyaW5nCi0JCWlmICgoYm9vbGVhblZhbHVlID0gWE1MVXRpbHMuZ2V0VGV4dChlbGVtZW50KSkgIT0gbnVsbCkKLQkJewotCQkJcmV0dXJuVmFsdWUgPSBCb29sZWFuLnZhbHVlT2YoYm9vbGVhblZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCS8vIFJldHVybiBib29sZWFuCi0JCXJldHVybiByZXR1cm5WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYXR0cmlidXRlIHZhbHVlIGFzIGEgYm9vbGVhbi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhbiBFbGVtZW50IG9iamVjdC4KLQkgKiBAcGFyYW0gYXR0ck5hbWUgYSBuYW1lIG9mIGFuIGF0dHJpYnV0ZS4KLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIGEgYm9vbGVhbiB0byBiZSB1c2VkIGFzIGEgZGVmYXVsdCB2YWx1ZS4KLQkgKiBAcmV0dXJuIGF0dHJpYnV0ZSB2YWx1ZSBhcyBhIGJvb2xlYW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEJvb2xlYW5WYWx1ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyTmFtZSwKLQkJCWJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCWJvb2xlYW4gcmV0dXJuVmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCVN0cmluZyBib29sZWFuVmFsdWUgPSBudWxsOwotCi0JCS8vIEdldCB2YWx1ZSBhcyBhIHN0cmluZwotCQlpZiAoKGJvb2xlYW5WYWx1ZSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIGF0dHJOYW1lKSkgIT0gbnVsbCkKLQkJewotCQkJcmV0dXJuVmFsdWUgPSBCb29sZWFuLnZhbHVlT2YoYm9vbGVhblZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCS8vIFJldHVybiBib29sZWFuCi0JCXJldHVybiByZXR1cm5WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgUU5hbWUuCi0JICogCi0JICogQHBhcmFtIHFuYW1lU3RyaW5nIGEgcXVhbGlmaWVkIG5hbWUuCi0JICogQHJldHVybiBhIFFOYW1lIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFFOYW1lIGNyZWF0ZVFOYW1lKFN0cmluZyBxbmFtZVN0cmluZykgewotCQlRTmFtZSBxbmFtZSA9IG51bGw7Ci0KLQkJLy8gTG9jYXRlIGxvY2FsIHBhcnQKLQkJaW50IGluZGV4ID0gcW5hbWVTdHJpbmcubGFzdEluZGV4T2YoIjoiKTsKLQotCQkvLyBDcmVhdGUgbmV3IFFOYW1lCi0JCWlmIChpbmRleCAhPSAtMSkKLQkJewotCQkJcW5hbWUgPSBuZXcgUU5hbWUocW5hbWVTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KSwgcW5hbWVTdHJpbmcKLQkJCQkJLnN1YnN0cmluZyhpbmRleCArIDEpKTsKLQkJfQotCi0JCWVsc2UKLQkJewotCQkJcW5hbWUgPSBuZXcgUU5hbWUocW5hbWVTdHJpbmcpOwotCQl9Ci0KLQkJcmV0dXJuIHFuYW1lOwotCX0KLQotCS8qKgotCSAqIEVycm9yIEhhbmRsZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFcnJIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyCi0JewotCQkvKioKLQkJICogV2FybmluZwotCQkgKi8KLQkJcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiV2FybmluZzogIiArIHNwZS5nZXRNZXNzYWdlKCk7Ci0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVycm9yCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiRXJyb3I6ICIgKyBzcGUuZ2V0TWVzc2FnZSgpOwotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBGYXRhbCBFcnJvcgotCQkgKi8KLQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiRmF0YWwgRXJyb3I6ICIgKyBzcGUuZ2V0TWVzc2FnZSgpOwotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiB0aGUgc3RyaW5nIGlzIGEgTk1UT0tFTiBkYXRhIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHRleHQgYSBzdHJpbmcgdmFsdWUuCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBOTVRPS0VOIGRhdGEgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNObXRva2VuKFN0cmluZyB0ZXh0KSB7Ci0JCWJvb2xlYW4gbm10b2tlbiA9IHRydWU7Ci0KLQkJLy8gQUREOiBOZWVkIHRvIGZpbmQgYSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGlzIG9yIHdyaXRlIGl0IGZyb20KLQkJLy8gc2NyYXRjaAotCi0JCXJldHVybiBubXRva2VuOwotCX0KLQotCS8qKgotCSAqIFRoZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGZpcnN0IGRpcmVjdCBkZXNjZW5kYW50IGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4KLQkgKiBxbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBET00gZWxlbWVudC4KLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgUU5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gYmUgc2VhcmNoZWQuCi0JICogQHJldHVybiBET00gZWxlbWVudCBpZiB0aGUgcmVxdWlyZWQgZWxlbWVudCBmb3VuZCwgYW5kIG51bGwgb3RoZXJ3aXNlLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgRWxlbWVudCBmaW5kQ2hpbGRFbGVtZW50KEVsZW1lbnQgcGFyZW50LCBRTmFtZSBlbGVtZW50TmFtZSkgewotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJlbnQgZWxlbWVudCBjYW4gbm90IGJlIE5VTEwiKTsKLQkJaWYgKGVsZW1lbnROYW1lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbGVtZW50IG5hbWUgY2FuIG5vdCBiZSBOVUxMIik7Ci0JCWlmIChlbGVtZW50TmFtZS5nZXRMb2NhbFBhcnQoKSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIkxvY2FsIHBhcnQgb2YgdGhlIGVsZW1lbnQgbmFtZSBjYW4gbm90IGJlIE5VTEwiKTsKLQotCQlOb2RlIG4gPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlTdHJpbmcgbG9jYWwgPSBlbGVtZW50TmFtZS5nZXRMb2NhbFBhcnQoKTsKLQkJU3RyaW5nIG5zID0gZWxlbWVudE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCXdoaWxlIChuICE9IG51bGwpCi0JCXsKLQkJCWlmIChOb2RlLkVMRU1FTlRfTk9ERSA9PSBuLmdldE5vZGVUeXBlKCkKLQkJCQkJJiYgbG9jYWwuZXF1YWxzKG4uZ2V0TG9jYWxOYW1lKCkpCi0JCQkJCSYmIE51bGxVdGlsLmVxdWFscyhucywgbi5nZXROYW1lc3BhY2VVUkkoKSkpCi0JCQkJcmV0dXJuIChFbGVtZW50KSBuOwotCQkJbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGZpcnN0IHNpYmxpbmcgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBxbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZlIERPTSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBRTmFtZSBvZiB0aGUgZWxlbWVudCB0byBiZSBzZWFyY2hlZC4KLQkgKiBAcmV0dXJuIERPTSBlbGVtZW50IGlmIHRoZSByZXF1aXJlZCBlbGVtZW50IGZvdW5kLCBhbmQgbnVsbCBvdGhlcndpc2UuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBFbGVtZW50IGZpbmRFbGVtZW50KEVsZW1lbnQgYWN0aXZlLCBRTmFtZSBlbGVtZW50TmFtZSkgewotCQlpZiAoYWN0aXZlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBY3RpdmUgZWxlbWVudCBjYW4gbm90IGJlIE5VTEwiKTsKLQkJaWYgKGVsZW1lbnROYW1lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbGVtZW50IG5hbWUgY2FuIG5vdCBiZSBOVUxMIik7Ci0JCWlmIChlbGVtZW50TmFtZS5nZXRMb2NhbFBhcnQoKSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIkxvY2FsIHBhcnQgb2YgdGhlIGVsZW1lbnQgbmFtZSBjYW4gbm90IGJlIE5VTEwiKTsKLQotCQlOb2RlIG4gPSBhY3RpdmUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJU3RyaW5nIGxvY2FsID0gZWxlbWVudE5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0JCVN0cmluZyBucyA9IGVsZW1lbnROYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCQl3aGlsZSAobiAhPSBudWxsKQotCQl7Ci0JCQlpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpCi0JCQkJCSYmIGxvY2FsLmVxdWFscyhuLmdldExvY2FsTmFtZSgpKQotCQkJCQkmJiBOdWxsVXRpbC5lcXVhbHMobnMsIG4uZ2V0TmFtZXNwYWNlVVJJKCkpKQotCQkJCXJldHVybiAoRWxlbWVudCkgbjsKLQkJCW4gPSBuLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWV0aG9kIHJldHVybnMgYXR0cmlidXRlIG5vZGUgYnkgdGhlIGdpdmVuIHFuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBlbCBvd25lciBlbGVtZW50LgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIFFOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgbm9kZSB0byBiZSBzZWFyY2hlZC4KLQkgKiBAcmV0dXJuIGF0dHJpYnV0ZSBub2RlIGJ5IHRoZSBnaXZlbiBxbmFtZS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIEF0dHIgZ2V0QXR0cmlidXRlKEVsZW1lbnQgZWwsIFFOYW1lIGF0dHJpYnV0ZU5hbWUpIHsKLQkJaWYgKGVsID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbGVtZW50IGNhbiBub3QgYmUgTlVMTCIpOwotCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXR0cmlidXRlIG5hbWUgY2FuIG5vdCBiZSBOVUxMIik7Ci0JCWlmIChhdHRyaWJ1dGVOYW1lLmdldExvY2FsUGFydCgpID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiTG9jYWwgcGFydCBvZiB0aGUgYXR0cmlidXRlIG5hbWUgY2FuIG5vdCBiZSBOVUxMIik7Ci0KLQkJQXR0ciBhID0gZWwuZ2V0QXR0cmlidXRlTm9kZU5TKGF0dHJpYnV0ZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0JCQkJYXR0cmlidXRlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0JCWlmIChhID09IG51bGwpCi0JCQkvLyB0cnkgdG8gZ2V0IHdpdGggbnVsbCBuYW1lc3BhY2UKLQkJCWEgPSBlbC5nZXRBdHRyaWJ1dGVOb2RlTlMobnVsbCwgYXR0cmlidXRlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qKgotCSAqIFRoZSBtZXRob2QgY29tcGFyZXMgbm9kZSdzIG5hbWUgdG8gdGhlIGdpdmVuIHFuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuIGEgbm9kZS4KLQkgKiBAcGFyYW0gbmFtZSBhIFFOYW1lIG9iamVjdC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUncyBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBxbmFtZS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gZXF1YWxzKE5vZGUgbiwgUU5hbWUgbmFtZSkgewotCQlpZiAobiA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChOdWxsVXRpbC5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSwgbi5nZXRMb2NhbE5hbWUoKSkgJiYgTnVsbFV0aWwKLQkJCQkuZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG4uZ2V0TmFtZXNwYWNlVVJJKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWV0aG9kIHNlYXJjaGVzIG5hbWVzcGFjZSBVUkkgZm9yIHRoZSBnaXZlbiBwcmVmaXguIFRoZSBzZWFyY2hpbmcKLQkgKiBtZWNoYW5pc20gaXMgaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIHRoZSAiWE1MIE5hbWVzcGFjZXMgcmVzb2x1dGlvbiIKLQkgKiBhbGdvcml0aG0gKCdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1dELURPTS1MZXZlbC0zLQotCSAqIENvcmUtMjAwMzAyMjYvbmFtZXNwYWNlcy1hbGdvcml0aG1zLmh0bWwnKS4KLQkgKiAKLQkgKiBAcGFyYW0gbiBhIG5vZGUuCi0JICogQHBhcmFtIHByZWZpeCBhIHByZWZpeC4KLQkgKiBAcmV0dXJuIHRoZSBuYW1lc3BhY2UgVVJJIGZvciB0aGUgZ2l2ZW4gcHJlZml4LgotCSAqLwotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGZpbmROYW1lc3BhY2VVUkkoTm9kZSBuLCBTdHJpbmcgcHJlZml4KSB7Ci0JCWlmIChwcmVmaXggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXdoaWxlIChuICE9IG51bGwpCi0JCXsKLQkJCWlmIChwcmVmaXguZXF1YWxzKG4uZ2V0UHJlZml4KCkpKQotCQkJCXJldHVybiBuLmdldE5hbWVzcGFjZVVSSSgpOwotCi0JCQlpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpKQotCQkJewotCQkJCU5hbWVkTm9kZU1hcCBtID0gbi5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJaWYgKG0gIT0gbnVsbCkKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtLmdldExlbmd0aCgpOyBpKyspCi0JCQkJCXsKLQkJCQkJCU5vZGUgYSA9IG0uaXRlbShpKTsKLQkJCQkJCWlmIChXU0lUYWcuTlNfVVJJX1hNTE5TLmVxdWFscyhhLmdldE5hbWVzcGFjZVVSSSgpKQotCQkJCQkJCQkmJiBwcmVmaXguZXF1YWxzKGEuZ2V0TG9jYWxOYW1lKCkpKQotCQkJCQkJCXJldHVybiBhLmdldE5vZGVWYWx1ZSgpOwotCQkJCQl9Ci0JCQl9Ci0KLQkJCW4gPSBuLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNlcmlhbGl6ZXMgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbiBhIERPTSBlbGVtZW50LgotCSAqIEByZXR1cm4gdGhlIHNlcmlhbGl6ZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJpYWxpemUoRWxlbWVudCBuKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCXRyeQotCQl7Ci0JCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWE1MU2VyaWFsaXplciBzID0gbmV3IFhNTFNlcmlhbGl6ZXIod3JpdGVyLCBuZXcgT3V0cHV0Rm9ybWF0KCJ4bWwiLAotCQkJCQkiVVRGLTgiLCB0cnVlKSk7Ci0JCQlzLnNlcmlhbGl6ZShuKTsKLQkJCXZhbHVlID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpCi0JCXsKLQkJCS8vIG5vdGhpbmcKLQkJCXZhbHVlID0gIkVYQ0VQVElPTiA6ICIgKyB0LmdldE1lc3NhZ2UoKTsKLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWV0aG9kIHJldHVybiBsaXN0IG9mIGNoaWxkIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgYW4gb3JnLnczYy5kb20uRWxlbWVudCBvYmplY3QuCi0JICogQHJldHVybiBsaXN0IG9mIGNoaWxkIGVsZW1lbnRzLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgVmVjdG9yIGdldENoaWxkRWxlbWVudHMoRWxlbWVudCBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRWxlbWVudCBjYW4gbm90IGJlIE5VTEwiKTsKLQotCQlWZWN0b3IgdmVjdCA9IG5ldyBWZWN0b3IoKTsKLQkJRWxlbWVudCBlbGVtID0gZ2V0Rmlyc3RDaGlsZChwYXJlbnQpOwotCQl3aGlsZSAoZWxlbSAhPSBudWxsKQotCQl7Ci0JCQl2ZWN0LmFkZChlbGVtKTsKLQkJCWVsZW0gPSBnZXROZXh0U2libGluZyhlbGVtKTsKLQkJfQotCQlyZXR1cm4gdmVjdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXJpYWxpemVzIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2MgYW4gb3JnLnczYy5kb20uRG9jdW1lbnQgb2JqZWN0LgotCSAqIEBwYXJhbSB3cml0ZXIgYSBqYXZhLmlvLldyaXRlciBvYmplY3QuCi0JICogQHRocm93cyBFeGNlcHRpb24gaWYgdW5hYmxlIHRvIHNlcmlhbGl6ZSB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZURvYyhEb2N1bWVudCBkb2MsIFdyaXRlciB3cml0ZXIpCi0JCQl0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0JCVhNTFNlcmlhbGl6ZXIgcyA9IG5ldyBYTUxTZXJpYWxpemVyKHdyaXRlciwgbmV3IE91dHB1dEZvcm1hdCgieG1sIiwKLQkJCQkiVVRGLTgiLCB0cnVlKSk7Ci0JCXMuc2VyaWFsaXplKGRvYyk7Ci0JfQotCi0JLyoqCi0JICogU2VyZWFsaXplcyBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtIGFuIG9yZy53M2MuZG9tLkVsZW1lbnQgb2JqZWN0LgotCSAqIEBwYXJhbSB3cml0ZXIgYSBqYXZhLmlvLldyaXRlciBvYmplY3QuCi0JICogQHRocm93cyBFeGNlcHRpb24gaWYgdW5hYmxlIHRvIHNlcmlhbGl6ZSB0aGUgRE9NIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZUVsZW1lbnQoRWxlbWVudCBlbGVtLCBXcml0ZXIgd3JpdGVyKQotCQkJdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCQlYTUxTZXJpYWxpemVyIHMgPSBuZXcgWE1MU2VyaWFsaXplcih3cml0ZXIsIG5ldyBPdXRwdXRGb3JtYXQoInhtbCIsCi0JCQkJIlVURi04IiwgdHJ1ZSkpOwotCQlzLnNlcmlhbGl6ZShlbGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gbGlzdCB3aXRob3V0IG5hbWVzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmVjdCBhIGxpc3Qgb2YgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbEVsZW1lbnRzV2l0aG91dE5TKFZlY3RvciB2ZWN0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmVjdC5zaXplKCk7KQotCQl7Ci0JCQlpZiAoKChFbGVtZW50KSB2ZWN0LmdldChpKSkuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbAotCQkJCQl8fCAoKEVsZW1lbnQpIHZlY3QuZ2V0KGkpKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoIiIpKQotCQkJCXZlY3QucmVtb3ZlKGkpOwotCQkJZWxzZQotCQkJCWkrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBVUkwgdXNpbmcgYmFzZSBVUkkuCi0JICogCi0JICogQHBhcmFtIHVybCBhIFVSTCBzdHJpbmcuCi0JICogQHBhcmFtIGJhc2VVUkkgYSBiYXNlIHVybCBzdHJpbmcgdG8gYXNzaXN0IGluIGNyZWF0aW5nIGEgVVJMLgotCSAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBVUkwuCi0JICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgYSBtYWxmb3JtZWQgVVJMIGhhcyBvY2N1cnJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBjcmVhdGVVUkwoU3RyaW5nIHVybCwgU3RyaW5nIGJhc2VVUkkpCi0JCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJVVJMIHJldHVyblVSTCA9IG51bGw7Ci0JCVVSSSB1cmkgPSBudWxsOwotCQl0cnkKLQkJewotICAgICAgICAgICAgcmV0dXJuVVJMID0gbmV3IFVSTCh1cmwpOwotCQkJdXJpID0gbmV3IFVSSSh1cmwpOwotCQkJdXJpID0gdXJpLm5vcm1hbGl6ZSgpOwotCQkJcmV0dXJuVVJMID0gIG5ldyBVUkwodXJpLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBtdWUpCi0JCXsKLQkJCWludCBpID0gYmFzZVVSSS5sYXN0SW5kZXhPZignLycpOwotCQkJaW50IGogPSBiYXNlVVJJLmxhc3RJbmRleE9mKCdcXCcpOwotCQkJaWYgKGogPiBpKQotCQkJCWkgPSBqOwotCQkJdHJ5Ci0JCQl7Ci0JCQkgIHVyaSA9IG5ldyBVUkkoYmFzZVVSSS5zdWJzdHJpbmcoMCwgaSArIDEpICsgdXJsKTsKLQkJCSAgdXJpID0gdXJpLm5vcm1hbGl6ZSgpOwotCQkJICByZXR1cm5VUkwgPSB1cmkudG9VUkwoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJCXsKLQkJCSAgcmV0dXJuIG5ldyBVUkwoYmFzZVVSSS5zdWJzdHJpbmcoMCwgaSArIDEpICsgdXJsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0dXJuVVJMOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBVUkwgdXNpbmcgYmFzZSBVUkkuCi0JICogCi0JICogQHBhcmFtIHVybCBhIFVSTCBzdHJpbmcuCi0JICogQHBhcmFtIGJhc2VVUkkgYSBiYXNlIHVybCBzdHJpbmcgdG8gYXNzaXN0IGluIGNyZWF0aW5nIGEgVVJMLgotCSAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBVUkwgc3RyaW5nLgotCSAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIGEgbWFsZm9ybWVkIFVSTCBoYXMgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVVJMU3RyaW5nKFN0cmluZyB1cmwsIFN0cmluZyBiYXNlVVJJKQotCQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVVUkwodXJsLCBiYXNlVVJJKS50b0V4dGVybmFsRm9ybSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgb25seSBmb3IgdW5pdCB0ZXN0aW5nLgotCSAqIAotCSAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyBmb3IgbWFpbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCXRyeQotCQl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVuYW1lOiAiICsgYXJnc1swXSArICIsIHNjaGVtYTogIiArIGFyZ3NbMV0pOwotCQkJRG9jdW1lbnQgZG9jID0gcGFyc2VYTUxEb2N1bWVudChhcmdzWzBdLCBhcmdzWzFdKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRG9uZS4iKTsKLQkJfQotCi0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjVmOTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi0vKioKLSAqIFdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBub2RlIHNvdXJjZSBjb2RlLCBzbyB0aGlzIGRvZXMKLSAqIG91ciBkb3VibGUtZGlzcGF0Y2ggdGhlIGhhcmQgd2F5LgotICovCi1wdWJsaWMgY2xhc3MgWE1MVmlzaXRvcgotewotICAvKioKLSAgKiBWaXNpdCBYTUwgQ0RBVEFTZWN0aW9uIG5vZGUuCi0gICogQHBhcmFtIHMgIGFuIFhNTCBDREFUQVNlY3Rpb24gbm9kZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoQ0RBVEFTZWN0aW9uIHMpCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIFZpc2l0IFhNTCBEb2N1bWVudCBub2RlLgotICAqIEBwYXJhbSBlICBhbiBYTUwgRG9jdW1lbnQgbm9kZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoRG9jdW1lbnQgZSkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogVmlzaXQgWE1MIERvY3VtZW50VHlwZSBub2RlLgotICAqIEBwYXJhbSBlICBhbiBNTCBEb2N1bWVudFR5cGUgbm9kZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoRG9jdW1lbnRUeXBlIGUpCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIFZpc2l0IFhNTCBBdHRyaWJ1dGUgbm9kZS4KLSAgKiBAcGFyYW0gZSAgYW4gWE1MIEF0cnJpYnV0ZSBub2RlLgotICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChBdHRyIGUpCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIFZpc2l0IFhNTCBFbGVtZW50IG5vZGUuCi0gICogQHBhcmFtIGUgIGFuIFhNTCBFbGVtZW50IG5vZGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEVsZW1lbnQgZSkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogVmlzaXQgWE1MIENvbW1lbnQgbm9kZS4KLSAgKiBAcGFyYW0gZSAgYW4gWE1MIENvbW1lbnQgbm9kZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoQ29tbWVudCBlKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogVmlzaXQgWE1MIFRleHQgbm9kZS4KLSAgKiBAcGFyYW0gZSAgYW4gWE1MIFRleHQgbm9kZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoVGV4dCBlKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogVmlzaXQgWE1MIEVudGl0eVJlZmVyZW5jZSBub2RlLiAKLSAgKiBAcGFyYW0gZSAgYW4gWE1MIEVudGl0eVJlZmVyZW5jZSBub2RlLgotICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChFbnRpdHlSZWZlcmVuY2UgZSkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFZpc2l0IFhNTCBFbnRpdHkgbm9kZS4gCi0gICogQHBhcmFtIGUgIGFuIFhNTCBFbnRpdHkgbm9kZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoRW50aXR5IGUpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBWaXNpdCBYTUwgTm90YXRpb24gbm9kZS4gCi0gICogQHBhcmFtIG4gIGFuIFhNTCBOb3RhdGlvbiBub2RlLgotICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChOb3RhdGlvbiBuKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogVmlzaXQgWE1MIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBub2RlLiAKLSAgKiBAcGFyYW0gaSAgYW4gWE1MIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBub2RlLgotICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gaSkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFZpc2l0IFhNTCBOYW1lZE5vZGVNYXAgbm9kZS4gCi0gICogQHBhcmFtIGkgIGFuIFhNTCBOYW1lZE5vZGVNYXAgbm9kZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoTmFtZWROb2RlTWFwIGkpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBWaXNpdCBYTUwgbm9kZS4gCi0gICogQHBhcmFtIG5vZGUgIGFuIFhNTCBub2RlLgotICAqLwotICBwdWJsaWMgdm9pZCBkb1Zpc2l0KE9iamVjdCBub2RlKQotICB7Ci0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIHZpc2l0KChFbGVtZW50KSBub2RlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpCi0gICAgewotICAgICAgdmlzaXQoKENvbW1lbnQpIG5vZGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ0RBVEFTZWN0aW9uKQotICAgIHsKLSAgICAgIC8vIENEQVRBU2VjdGlvbiBleHRlbmRzIFRleHQsIHNvIGl0IG11c3QgY29tZSBmaXJzdAotICAgICAgdmlzaXQoKENEQVRBU2VjdGlvbikgbm9kZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUZXh0KQotICAgIHsKLSAgICAgIHZpc2l0KChUZXh0KSBub2RlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHIpCi0gICAgewotICAgICAgdmlzaXQoKEF0dHIpIG5vZGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpCi0gICAgewotICAgICAgdmlzaXQoKERvY3VtZW50KSBub2RlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eVJlZmVyZW5jZSkKLSAgICB7Ci0gICAgICB2aXNpdCgoRW50aXR5UmVmZXJlbmNlKSBub2RlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkKLSAgICB7Ci0gICAgICB2aXNpdCgoRW50aXR5KSBub2RlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIERvY3VtZW50VHlwZSkKLSAgICB7Ci0gICAgICB2aXNpdCgoRG9jdW1lbnRUeXBlKSBub2RlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0KChOb3RhdGlvbikgbm9kZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pCi0gICAgewotICAgICAgdmlzaXQoKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApCi0gICAgewotICAgICAgdmlzaXQoKE5hbWVkTm9kZU1hcCkgbm9kZSk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIEVORCBPRiBGSUxFCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL2RvbS9ET01QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvZG9tL0RPTVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjJhMDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvZG9tL0RPTVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5kb207Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzcGVjaWFsaXplcyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkRPTVBhcnNlci4KLSAqIAotICogQGF1dGhvciBQZXRlciAgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGNsYXNzIERPTVBhcnNlciBleHRlbmRzIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRE9NUGFyc2VyCi17Ci0gIC8qKgotICAgKiBMb2NhdG9yLgotICAgKi8KLSAgWE1MTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTERvY3VtZW50SGFuZGxlciNzdGFydERvY3VtZW50KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxMb2NhdG9yLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuTmFtZXNwYWNlQ29udGV4dCwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnMpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KAotICAgIFhNTExvY2F0b3IgbG9jYXRvciwKLSAgICBTdHJpbmcgZW5jb2RpbmcsCi0gICAgTmFtZXNwYWNlQ29udGV4dCBjb250ZXh0LAotICAgIEF1Z21lbnRhdGlvbnMgYXVncykKLSAgICB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOwotICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQobG9jYXRvciwgZW5jb2RpbmcsIGNvbnRleHQsIGF1Z3MpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxEb2N1bWVudEhhbmRsZXIjc3RhcnRFbGVtZW50KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5RTmFtZSwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTEF0dHJpYnV0ZXMsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotICAgIFFOYW1lIHFuYW1lLAotICAgIFhNTEF0dHJpYnV0ZXMgYXR0cmlidXRlcywKLSAgICBBdWdtZW50YXRpb25zIGF1Z3MpCi0gICAgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50OwotICAgIEVsZW1lbnRJbXBsIGVsZW1lbnRJbXBsOwotCi0gICAgLy8gREVCVUc6Ci0gICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIjEtbGluZTogIiArIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpICsgIiwgY29sdW1uOiAiICsgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0KLSAgICBzdXBlci5zdGFydEVsZW1lbnQocW5hbWUsIGF0dHJpYnV0ZXMsIGF1Z3MpOwotCi0gICAgLy8gREVCVUc6Ci0gICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIjItbGluZTogIiArIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpICsgIiwgY29sdW1uOiAiICsgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSk7ICAgIAotCi0gICAgdHJ5Ci0gICAgewotICAgICAgZWxlbWVudCA9IChFbGVtZW50KSBnZXRQcm9wZXJ0eShDVVJSRU5UX0VMRU1FTlRfTk9ERSk7Ci0KLSAgICAgIGVsZW1lbnRJbXBsID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCi0gICAgICBlbGVtZW50SW1wbC5zZXRVc2VyRGF0YSgKLSAgICAgICAgRWxlbWVudExvY2F0aW9uLktFWV9OQU1FLAotICAgICAgICAoRWxlbWVudExvY2F0aW9uKW5ldyBFbGVtZW50TG9jYXRpb24obG9jYXRvci5nZXRMaW5lTnVtYmVyKCksIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpLAotICAgICAgICBudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHNuc2UpCi0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbihzbnNlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBzbnJlKQotICAgIHsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvZG9tL0VsZW1lbnRMb2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9kb20vRWxlbWVudExvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwY2M3NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9kb20vRWxlbWVudExvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmRvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciBhIG5vZGUgd2l0aGluIGFuIFhNTCBkb2N1bWVudC4KLSAqICAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50TG9jYXRpb24KLXsKLSAgLyoqCi0gICAqIExpbmUgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUUgPSBFbGVtZW50TG9jYXRpb24uY2xhc3MuZ2V0TmFtZSgpOwotCi0gIC8qKgotICAgKiBMaW5lIG51bWJlci4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgbGluZU51bWJlciA9IDA7Ci0KLSAgLyoqCi0gICAqIENvbHVtbiBudW1iZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGNvbHVtbk51bWJlciA9IDA7Ci0KLSAgLyoqCi0gICAqIEVsZW1lbnQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBsaW5lTnVtYmVyICAgIGEgbGluZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjb2x1bW5OdW1iZXIgIGEgY29sdW1uIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBFbGVtZW50TG9jYXRpb24oaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIpCi0gIHsKLSAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgIHRoaXMuY29sdW1uTnVtYmVyID0gY29sdW1uTnVtYmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEVsZW1lbnQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBsb2NhdG9yICBhIExvY2F0b3Igb2JqZWN0LgotICAgKi8KLSAgcHVibGljIEVsZW1lbnRMb2NhdGlvbihMb2NhdG9yIGxvY2F0b3IpCi0gIHsKLSAgICB0aGlzLmxpbmVOdW1iZXIgPSBsb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLSAgICB0aGlzLmNvbHVtbk51bWJlciA9IGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBsaW5lIG51bWJlci4KLSAgICogQHJldHVybiBhbiBpbnQgcmVwcmVzZW50aW5nIHRoZSBsaW5lIG51bWJlciB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5saW5lTnVtYmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgY29sdW1uIG51bWJlci4KLSAgICogQHJldHVybiBhbiBpbnQgcmVwcmVzZW50aW5nIHRoZSBjb2x1bW4gbnVtYmVyIHZhbHVlLgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuY29sdW1uTnVtYmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiAiRWxlbWVudCBMb2NhdGlvbjpcbiIKLSAgICAgICsgIiAgIgotICAgICAgKyBXU0lDb25zdGFudHMuQVRUUl9MSU5FX05VTUJFUgotICAgICAgKyAiPSIKLSAgICAgICsgdGhpcy5saW5lTnVtYmVyCi0gICAgICArICJcbiI7Ci0gICAgLy8rICIgICIgKyBXU0lDb25zdGFudHMuQVRUUl9DT0xVTU5fTlVNQkVSICsgIj0iICsgdGhpcy5jb2x1bW5OdW1iZXIgKyAiXG4iOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL2pheHAvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvamF4cC9Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODA2Y2VhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvamF4cC9Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5qYXhwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIGEgZmFjdG9yeSBBUEkgdGhhdCBlbmFibGVzIHVzIHRvIG9idGFpbiBhIHBhcnNlcgotICogdGhhdCBwcm9kdWNlcyBET00gb2JqZWN0IHRyZWVzIGZyb20gWE1MIGRvY3VtZW50cy4gTm90ZSB0aGlzIGNsYXNzIAotICogc3BlY2lhbGl6ZXMgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS4KLSAqIAotICogQGF1dGhvciBQZXRlciAgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsIGV4dGVuZHMgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotewotCi0gIHByb3RlY3RlZCBIYXNodGFibGUgYXR0cmlidXRlcyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIERvY3VtZW50QnVpbGRlciB1c2luZyB0aGUgY3VycmVudGx5IAotICAgKiBjb25maWd1cmVkIHBhcmFtZXRlcnMuCi0gICAqIAotICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIGEgRG9jdW1lbnRCdWlsZGVyLiAKLSAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGEgRG9jdW1lbnRCdWlsZGVyIGNhbm5vdAotICAgKiAgICAgICAgIGJlIGNyZWF0ZWQgd2hpY2ggc2F0aXNmaWVzIHRoZSBjb25maWd1cmF0aW9uIHJlcXVlc3RlZC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudEJ1aWxkZXIgbmV3RG9jdW1lbnRCdWlsZGVyKCkKLSAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBkb2N1bWVudEJ1aWxkZXIgPSBuZXcgRG9jdW1lbnRCdWlsZGVySW1wbCh0aGlzLCBhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIHJldHVybiBkb2N1bWVudEJ1aWxkZXI7Ci0gIH0KLQotICAvKioKLSAgICogQWxsb3dzIHRoZSB1c2VyIHRvIHJldHJpZXZlIHNwZWNpZmljIGF0dHJpYnV0ZXMgb24gdGhlIHVuZGVybHlpbmcgCi0gICAqIGltcGxlbWVudGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWUgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIAotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBmIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIAotICAgKiAgICAgICAgIGRvZXNuJ3QgcmVjb2duaXplIHRoZSBhdHRyaWJ1dGUuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFsbG93cyB0aGUgdXNlciB0byBzZXQgc3BlY2lmaWMgYXR0cmlidXRlcyBvbiB0aGUgdW5kZXJseWluZyAKLSAgICogaW1wbGVtZW50YXRpb24uIAotICAgKiAKLSAgICogQHBhcmFtIG5hbWUgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiAKLSAgICogICAgICAgICBkb2Vzbid0IHJlY29nbml6ZSB0aGUgYXR0cmlidXRlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpCi0gICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICB7Ci0gICAgYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL2pheHAvRG9jdW1lbnRCdWlsZGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9qYXhwL0RvY3VtZW50QnVpbGRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3NjA2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL2pheHAvRG9jdW1lbnRCdWlsZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuamF4cDsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuZG9tLkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRE9NSW1wbGVtZW50YXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5kb20uRE9NUGFyc2VyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSAqIFVzaW5nIHRoaXMgY2xhc3MsIHdlIGNhbiBvYnRhaW4gYSBEb2N1bWVudCBmcm9tIFhNTC4gVGhpcyBjbGFzcyBpcyBhIAotICogc3BlY2lhbGl6YXRpb24gb2YgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyLgotICogCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSAKLSAqIERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyIG1ldGhvZC4gT25jZSBhbiBpbnN0YW5jZSAKLSAqIG9mIHRoaXMgY2xhc3MgaXMgb2J0YWluZWQsIFhNTCBjYW4gYmUgcGFyc2VkIGZyb20gYSB2YXJpZXR5IG9mIGlucHV0IAotICogc291cmNlcy4gVGhlc2UgaW5wdXQgc291cmNlcyBhcmUgSW5wdXRTdHJlYW1zLCBGaWxlcywgVVJMcywgYW5kIFNBWCAKLSAqIElucHV0U291cmNlcy4KLQotVGhpcyBjbGFzcyB3aWxsIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkuLi4KLSAqIAotICogQGF1dGhvciBQZXRlciAgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50QnVpbGRlckltcGwgZXh0ZW5kcyBEb2N1bWVudEJ1aWxkZXIKLXsKLSAgcHJvdGVjdGVkIERPTVBhcnNlciBkb21QYXJzZXIgPSBudWxsOwotCi0gIHByb3RlY3RlZCBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IG51bGw7Ci0gIHByb3RlY3RlZCBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IERlZmF1bHRIYW5kbGVyKCk7Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFU19GRUFUVVJFID0KLSAgICBDb25zdGFudHMuU0FYX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLk5BTUVTUEFDRVNfRkVBVFVSRTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9GRUFUVVJFID0KLSAgICBDb25zdGFudHMuU0FYX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLlZBTElEQVRJT05fRkVBVFVSRTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIERvY3VtZW50QnVpbGRlckltcGwyLgotICAgKgotICAgKiBAcGFyYW0gZGJGYWN0b3J5ICBhIERvY3VtZW50QnVpbGRlckZhY3Rvcnkgb2JqZWN0LgotICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhbnkgcGFyc2UgZXJyb3JzIG9jY3VyLiAKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudEJ1aWxkZXJJbXBsKERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJGYWN0b3J5LCBIYXNodGFibGUgYXR0cmlidXRlcykKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgcGFyc2VyCi0gICAgZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwotCi0gICAgLy8gU2V0IG5hbWVzcGFjZSBhd2FyZQotICAgIGRvbVBhcnNlci5zZXRGZWF0dXJlKE5BTUVTUEFDRVNfRkVBVFVSRSwgZGJGYWN0b3J5LmlzTmFtZXNwYWNlQXdhcmUoKSk7Ci0KLSAgICAvLyBTZXQgdmFsaWRhdGluZwotICAgIGRvbVBhcnNlci5zZXRGZWF0dXJlKFZBTElEQVRJT05fRkVBVFVSRSwgZGJGYWN0b3J5LmlzVmFsaWRhdGluZygpKTsKLSAgICBpZiAoZGJGYWN0b3J5LmlzVmFsaWRhdGluZygpKSBkb21QYXJzZXIuc2V0RmVhdHVyZShYTUxVdGlscy5GRUFUVVJFX1ZBTElEQVRJT05fU0NIRU1BLCB0cnVlKTsKLQotICAgIC8vIERvIG5vdCBkZWZlciBub2RlIGV4cGFuc2lvbgotICAgIGRvbVBhcnNlci5zZXRGZWF0dXJlKAotICAgICAgQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5ERUZFUl9OT0RFX0VYUEFOU0lPTl9GRUFUVVJFLAotICAgICAgZmFsc2UpOwotCi0gICAgLy8gU2V0IG90aGVyIGZlYXR1cmVzIGZyb20gdGhlIGRvY3VtZW50IGZhY3RvcnkgYnVpbGRlcgotICAgIGRvbVBhcnNlci5zZXRGZWF0dXJlKAotICAgICAgQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5JTkNMVURFX0lHTk9SQUJMRV9XSElURVNQQUNFLAotICAgICAgIWRiRmFjdG9yeS5pc0lnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkpOwotICAgIGRvbVBhcnNlci5zZXRGZWF0dXJlKAotICAgICAgQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWAotICAgICAgICArIENvbnN0YW50cy5DUkVBVEVfRU5USVRZX1JFRl9OT0RFU19GRUFUVVJFLAotICAgICAgIWRiRmFjdG9yeS5pc0V4cGFuZEVudGl0eVJlZmVyZW5jZXMoKSk7Ci0gICAgZG9tUGFyc2VyLnNldEZlYXR1cmUoCi0gICAgICBDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLklOQ0xVREVfQ09NTUVOVFNfRkVBVFVSRSwKLSAgICAgICFkYkZhY3RvcnkuaXNJZ25vcmluZ0NvbW1lbnRzKCkpOwotICAgIGRvbVBhcnNlci5zZXRGZWF0dXJlKAotICAgICAgQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5DUkVBVEVfQ0RBVEFfTk9ERVNfRkVBVFVSRSwKLSAgICAgICFkYkZhY3RvcnkuaXNDb2FsZXNjaW5nKCkpOwotICAgCi0gICAgLy8gc2V0IGZlYXR1cmVzIGFuZCBwcm9wZXJ0aWVzIHNwZWNpZmllZCBhdCBmYWN0b3J5IGxldmVsCi0gICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEVudW1lcmF0aW9uIGk9YXR0cmlidXRlcy5rZXlzKCk7IGkuaGFzTW9yZUVsZW1lbnRzKCk7KQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gKFN0cmluZylpLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGUuZXF1YWxzKFhNTFV0aWxzLkpBWFBfU0NIRU1BX1NPVVJDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBmb3IgbXVsdGlwbGUgc2NoZW1hIHZhbGlkYXRpb24gbWF5IGJlIGFycmF5IG9mIElucHV0U291cmNlIAotICAgICAgICAgIGlmKGF0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZSkgaW5zdGFuY2VvZiBJbnB1dFNvdXJjZVtdKQotICAgICAgICAgICAgZG9tUGFyc2VyLnNldFByb3BlcnR5KGF0dHJpYnV0ZSwgKElucHV0U291cmNlW10pYXR0cmlidXRlcy5nZXQoYXR0cmlidXRlKSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZG9tUGFyc2VyLnNldFByb3BlcnR5KGF0dHJpYnV0ZSwgKElucHV0U291cmNlKWF0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRvbVBhcnNlci5zZXRQcm9wZXJ0eShhdHRyaWJ1dGUsIGF0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBpbnB1dCBzb3VyY2UgYXMgYW4gWE1MIGRvY3VtZW50IGFuZCByZXR1cm4gYSBuZXcgRE9NLgotICAgKiBAcGFyYW0gaXMgIElucHV0U3RyZWFtIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQgdG8gYmUgcGFyc2VkLiAKLSAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgYW55IHBhcnNlIGVycm9ycyBvY2N1ci4gCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW55IElPIGVycm9ycyBvY2N1ci4gCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnQgcGFyc2UoSW5wdXRTb3VyY2UgaXMpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLQlDbGFzc0xvYWRlciBjdXJyZW50TG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsgICAKLQl0cnkKLQl7Ci0JICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihYTUxVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsgICAKLSAJCi0gICAgICAvLyBTZXQgZW50aXR5IHJlc29sdmVyCi0gICAgICBpZiAodGhpcy5lbnRpdHlSZXNvbHZlciAhPSBudWxsKQotICAgICAgICBkb21QYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIodGhpcy5lbnRpdHlSZXNvbHZlcik7Ci0KLSAgICAgIC8vIFNldCBlcnJvciBoYW5kbGVyICAgIAotICAgICAgaWYgKHRoaXMuZXJyb3JIYW5kbGVyICE9IG51bGwpCi0gICAgICAgIGRvbVBhcnNlci5zZXRFcnJvckhhbmRsZXIodGhpcy5lcnJvckhhbmRsZXIpOwotCi0gICAgICAvLyBQYXJzZSBpbnB1dCBzb3VyY2UKLSAgICAgIGRvbVBhcnNlci5wYXJzZShpcyk7Ci0KLSAgICAgIC8vIFJldHVybiB0aGUgZG9jdW1lbnQgdGhhdCB3YXMgY3JlYXRlZAotICAgICAgcmV0dXJuIGRvbVBhcnNlci5nZXREb2N1bWVudCgpOwotCX0KLSAgICBmaW5hbGx5Ci0gICAgeyAKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGN1cnJlbnRMb2FkZXIpOwotICAgIH0gICAgCi0gIH0KLQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoaXMgcGFyc2VyIGlzIGNvbmZpZ3VyZWQgdG8gdW5kZXJzdGFuZCBuYW1lc3BhY2VzLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwYXJzZXIgaXMgY29uZmlndXJlZCB0byB1bmRlcnN0YW5kIG5hbWVzcGFjZXM7IGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUoKQotICB7Ci0gICAgYm9vbGVhbiBuYW1lc3BhY2VBd2FyZSA9IGZhbHNlOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgbmFtZXNwYWNlQXdhcmUgPSBkb21QYXJzZXIuZ2V0RmVhdHVyZShOQU1FU1BBQ0VTX0ZFQVRVUkUpOwotICAgIH0KLQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gc2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc2UudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5hbWVzcGFjZUF3YXJlOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHBhcnNlciBpcyBjb25maWd1cmVkIHRvIHZhbGlkYXRlIFhNTCBkb2N1bWVudHMuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHBhcnNlciBpcyBjb25maWd1cmVkIHRvIHZhbGlkYXRlIFhNTCBkb2N1bWVudHM7IGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpCi0gIHsKLSAgICBib29sZWFuIHZhbGlkYXRpbmcgPSBmYWxzZTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIHZhbGlkYXRpbmcgPSBkb21QYXJzZXIuZ2V0RmVhdHVyZShWQUxJREFUSU9OX0ZFQVRVUkUpOwotICAgIH0KLQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gc2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc2UudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRpbmc7Ci0gIH0KLQotICAvKioKLSAgICogU3BlY2lmeSB0aGUgRW50aXR5UmVzb2x2ZXIgdG8gYmUgdXNlZCB0byByZXNvbHZlIGVudGl0aWVzIHByZXNlbnQgCi0gICAqIGluIHRoZSBYTUwgZG9jdW1lbnQgdG8gYmUgcGFyc2VkLiBTZXR0aW5nIHRoaXMgdG8gbnVsbCB3aWxsIHJlc3VsdCAKLSAgICogaW4gdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gdXNpbmcgaXQncyBvd24gZGVmYXVsdCAKLSAgICogaW1wbGVtZW50YXRpb24gYW5kIGJlaGF2aW9yLgotICAgKiAKLSAgICogQHBhcmFtIGVyICB0aGUgRW50aXR5UmVzb2x2ZXIgdG8gYmUgdXNlZCB0byByZXNvbHZlIGVudGl0aWVzIAotICAgKiAgICAgICAgICAgIHByZXNlbnQgaW4gdGhlIFhNTCBkb2N1bWVudCB0byBiZSBwYXJzZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbnRpdHlSZXNvbHZlcihFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikKLSAgewotICAgIHRoaXMuZW50aXR5UmVzb2x2ZXIgPSBlbnRpdHlSZXNvbHZlcjsKLSAgfQotCi0gIC8qKgotICAgKiBTcGVjaWZ5IHRoZSBFcnJvckhhbmRsZXIgdG8gYmUgdXNlZCB0byByZXBvcnQgZXJyb3JzIHByZXNlbnQgaW4gCi0gICAqIHRoZSBYTUwgZG9jdW1lbnQgdG8gYmUgcGFyc2VkLiBTZXR0aW5nIHRoaXMgdG8gbnVsbCB3aWxsIHJlc3VsdCAKLSAgICogaW4gdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gdXNpbmcgaXQncyBvd24gZGVmYXVsdCAKLSAgICogaW1wbGVtZW50YXRpb24gYW5kIGJlaGF2aW9yLiAKLSAgICogCi0gICAqIHBhcmFtIGVoICB0aGUgRXJyb3JIYW5kbGVyIHRvIGJlIHVzZWQgdG8gcmVwb3J0IGVycm9ycyBwcmVzZW50IGluIAotICAgKiAgICAgICAgICAgdGhlIFhNTCBkb2N1bWVudCB0byBiZSBwYXJzZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFcnJvckhhbmRsZXIoRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikKLSAgewotICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIE9idGFpbiBhIG5ldyBpbnN0YW5jZSBvZiBhIERPTSBEb2N1bWVudCBvYmplY3QgdG8gYnVpbGQgYSBET00gCi0gICAqIHRyZWUgd2l0aC4gQW4gYWx0ZXJuYXRpdmUgd2F5IHRvIGNyZWF0ZSBhIERPTSBEb2N1bWVudCBvYmplY3QgCi0gICAqIGlzIHRvIHVzZSB0aGUgZ2V0RE9NSW1wbGVtZW50YXRpb24gbWV0aG9kIHRvIGdldCBhIERPTSBMZXZlbCAyIAotICAgKiBET01JbXBsZW1lbnRhdGlvbiBvYmplY3QgYW5kIHRoZW4gdXNlIERPTSBMZXZlbCAyIG1ldGhvZHMgb24gCi0gICAqIHRoYXQgb2JqZWN0IHRvIGNyZWF0ZSBhIERPTSBEb2N1bWVudCBvYmplY3QuCi0gICAqIAotICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIGEgRE9NIERvY3VtZW50IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBuZXdEb2N1bWVudCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IERvY3VtZW50SW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIE9idGFpbiBhbiBpbnN0YW5jZSBvZiBhIERPTUltcGxlbWVudGF0aW9uIG9iamVjdC4gCi0gICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgYSBET01JbXBsZW1lbnRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBET01JbXBsZW1lbnRhdGlvbiBnZXRET01JbXBsZW1lbnRhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbmV3IERPTUltcGxlbWVudGF0aW9uSW1wbCgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvc2NoZW1hL1RhcmdldE5hbWVzcGFjZVByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9zY2hlbWEvVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YzM2ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9zY2hlbWEvVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm9jZXNzZXMgdGFyZ2V0IG5hbWVzcGFjZXMuIE5vdGUgdGhpcyBjbGFzcyBpcyBhIHNwZWNpYWxpemF0aW9uCi0gKiBvZiBvcmcud3NpLnhtbC5zY2hlbWEuWE1MU2NoZW1hUHJvY2Vzc29yLgotICogCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3IgZXh0ZW5kcyBYTUxTY2hlbWFQcm9jZXNzb3IKLXsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFRhcmdldE5hbWVzcGFjZVByb2Nlc3MuCi0gICAqIAotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiAgICAgICAgICAgIGRvY3VtZW50IGNvbnRleHQKLSAgICogQHBhcmFtIGRvY3VtZW50TGlzdAotICAgKiAgICAgICAgICAgIGNhY2hlIG9mIHByZXZpb3VzbHkgcGFyc2VkIGRvY3VtZW50cwotICAgKi8KLSAgcHVibGljIFRhcmdldE5hbWVzcGFjZVByb2Nlc3NvcigKLSAgICBTdHJpbmcgY29udGV4dCwKLSAgICBYTUxEb2N1bWVudENhY2hlIGRvY3VtZW50TGlzdCkKLSAgewotICAgIHN1cGVyKGNvbnRleHQsIGRvY3VtZW50TGlzdCwgZmFsc2UpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1NjaGVtYShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgdG5zID0gbnVsbDsKLSAgICBBdHRyIGF0dHIgPSBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgQVRUUl9YU0RfVEFSR0VUTkFNRVNQQUNFKTsKLQotICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUgd2FzIGZvdW5kIGFuZCB2YWx1ZSBpcyBub3QgbnVsbCwgdGhlbiBhZGQgaXQgdG8gdGhlIGxpc3QKLSAgICBpZiAoKGF0dHIgIT0gbnVsbCkgJiYgKCh0bnMgPSBhdHRyLmdldFZhbHVlKCkpICE9IG51bGwpKQotICAgIHsKLSAgICAgIC8vIEFkZCB0aGUgdGFyZ2V0TmFtZXNwYWNlIHRvIHRoZSByZXR1cm4gbGlzdAotICAgICAgcmV0dXJuTGlzdC5hZGQodG5zKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2VhcmNoIGZvciBhbGwgc2NoZW1hIGVsZW1lbnRzLCBsb2FkIHRoZSB4c2QgZG9jdW1lbnRzLCBhbmQgdGhlbiBwcm9jZXNzCi0gICAqIHRoZW0uCi0gICAqIAotICAgKiBAcGFyYW0gbm9kZQotICAgKiAgICAgICAgICAgIG5vZGUuCi0gICAqIEByZXR1cm4gYSBsaXN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbgotICAgKiAgICAgICAgICAgICBpZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIG5vdCBmb3VuZCBvciBpZiBpdCBpcyBub3QgZm9ybWF0dGVkCi0gICAqICAgICAgICAgICAgIGNvcnJlY3RseS4KLSAgICovCi0gIHB1YmxpYyBMaXN0IHByb2Nlc3NBbGxTY2hlbWEoTm9kZSBub2RlKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc0FsbFNjaGVtYShub2RlLCBjb250ZXh0KTsKLSAgfQotCi0gIC8qKgotICAgKiBTZWFyY2ggZm9yIGFsbCBzY2hlbWEgZWxlbWVudHMsIGxvYWQgdGhlIHhzZCBkb2N1bWVudHMsIGFuZCB0aGVuIHByb2Nlc3MKLSAgICogdGhlbS4KLSAgICogCi0gICAqIEBwYXJhbSBub2RlCi0gICAqICAgICAgICAgICAgbm9kZS4KLSAgICogQHJldHVybiBhIGxpc3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gICAqICAgICAgICAgICAgIGlmIHRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgbm90IGZvdW5kIG9yIGlmIGl0IGlzIG5vdCBmb3JtYXR0ZWQKLSAgICogICAgICAgICAgICAgY29ycmVjdGx5LgotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IHByb2Nlc3NBbGxTY2hlbWEoTm9kZSBub2RlLCBTdHJpbmcgY3R4KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBpZiB4c2Q6c2NoZW1hIGVsZW1lbnQgaXMgZm91bmQgLT4gcHJvY2VzcyBzY2hlbWEKLSAgICBpZiAoWE1MVXRpbHMuZXF1YWxzKG5vZGUsIEVMRU1fWFNEX1NDSEVNQSkpCi0gICAgewotICAgICAgcHJvY2Vzc1NjaGVtYSgoRWxlbWVudCkgbm9kZSk7Ci0KLSAgICAgIE5vZGUgbiA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgd2hpbGUgKG4gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IG4uZ2V0Tm9kZVR5cGUoKSYmIFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpKQotICAgICAgICB7Ci0gICAgICAgICAgQXR0ciBzY2hlbWFMb2NhdGlvbiA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZSgoRWxlbWVudCkgbiwgQVRUUl9YU0RfU0NIRU1BTE9DQVRJT04pOwotCi0gICAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIGltcG9ydGVkIFhTRAotICAgICAgICAgIGlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmIHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAJaWYgKCFzY2hlbWFMb2NhdGlvbnMuY29udGFpbnMoc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSkpCi0gICAgICAgICAgCXsKLSAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb25zLmFkZChzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBSZWFkIGFuZCBwUGFyc2UgdGhlIFhNTCBzY2hlbWEgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IHBhcnNlWE1MRG9jdW1lbnRVUkwoc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSwgY3R4LCBUZXN0VXRpbHMuZ2V0WE1MU2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0FsbFNjaGVtYShkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSwgWE1MVXRpbHMuY3JlYXRlVVJMU3RyaW5nKHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksIGN0eCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChXU0lFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0aHJvd0V4Y2VwdGlvbikgdGhyb3cgZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBOT1RFOiBBbiBleGNlcHRpb24gd2lsbCBvY2N1ciBpZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIG5vdAotICAJCQkgICAgLy8gZm91bmQgb3IgaWYgaXQgaXMgbm90IGZvcm1hdHRlZCBjb3JyZWN0bHkKLSAgICAgICAgICAgICAgICBpZiAodGhyb3dFeGNlcHRpb24pIHRocm93IG5ldyBXU0lFeGNlcHRpb24odC5nZXRNZXNzYWdlKCksIHQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG4gPSBuLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGxpc3QgY3JlYXRlZCBieSB0aGUgY2xhc3MgdGhhdCBleHRlbmRzIHRoaXMgY2xhc3MKLSAgICByZXR1cm4gcmV0dXJuTGlzdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9zY2hlbWEvWE1MU2NoZW1hUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL3NjaGVtYS9YTUxTY2hlbWFQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4YTM5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL3NjaGVtYS9YTUxTY2hlbWFQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTERvY3VtZW50Q2FjaGVVc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgdXNlZCB0byBwcm9jZXNzIGFuIFhNTCBTY2hlbWEuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYTUxTY2hlbWFQcm9jZXNzb3IKLSAgZXh0ZW5kcyBYTUxEb2N1bWVudENhY2hlVXNlcgotICBpbXBsZW1lbnRzIFhNTFRhZ3MKLXsKLSAgcHJvdGVjdGVkIExpc3QgcmV0dXJuTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0OwotICBwcm90ZWN0ZWQgYm9vbGVhbiB0aHJvd0V4Y2VwdGlvbiA9IHRydWU7Ci0gIHByb3RlY3RlZCBMaXN0IHNjaGVtYUxvY2F0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFhNTFNjaGVtYVByb2Nlc3Nvci4KLSAgICogQHBhcmFtIGNvbnRleHQgICAgICAgZG9jdW1lbnQgY29udGV4dC4gCi0gICAqIEBwYXJhbSBkb2N1bWVudExpc3QgIGNhY2hlIG9mIHByZXZpb3VzbHkgcGFyc2VkIGRvY3VtZW50cy4KLSAgICovCi0gIHB1YmxpYyBYTUxTY2hlbWFQcm9jZXNzb3IoU3RyaW5nIGNvbnRleHQsIFhNTERvY3VtZW50Q2FjaGUgZG9jdW1lbnRMaXN0KQotICB7Ci0gICAgdGhpcyhjb250ZXh0LCBkb2N1bWVudExpc3QsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBYTUxTY2hlbWFQcm9jZXNzb3IuCi0gICAqIEBwYXJhbSBjb250ZXh0ICAgICAgICBkb2N1bWVudCBjb250ZXh0LiAKLSAgICogQHBhcmFtIGRvY3VtZW50TGlzdCAgIGNhY2hlIG9mIHByZXZpb3VzbHkgcGFyc2VkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIHRocm93RXhjZXB0aW9uIGluZGljYXRlcyBpZiBhbiBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpZiB0aGVyZSBpcyBhIHBhcnNpbmcgcHJvYmxlbS4KLSAgICovCi0gIHB1YmxpYyBYTUxTY2hlbWFQcm9jZXNzb3IoCi0gICAgU3RyaW5nIGNvbnRleHQsCi0gICAgWE1MRG9jdW1lbnRDYWNoZSBkb2N1bWVudExpc3QsCi0gICAgYm9vbGVhbiB0aHJvd0V4Y2VwdGlvbikKLSAgewotICAgIHN1cGVyKCk7Ci0KLSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIHRoaXMuZG9jdW1lbnRMaXN0ID0gZG9jdW1lbnRMaXN0OwotICAgIHRoaXMudGhyb3dFeGNlcHRpb24gPSB0aHJvd0V4Y2VwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZWFyY2ggZm9yIGFsbCBzY2hlbWEgZWxlbWVudHMsIGxvYWQgdGhlIHhzZCBkb2N1bWVudHMsIGFuZCB0aGVuIHByb2Nlc3MgdGhlbS4KLSAgICogQHBhcmFtIG5vZGUgIG5vZGUuCi0gICAqIEByZXR1cm4gYSBsaXN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIG5vdCBmb3VuZCBvciBpZiBpdCBpcyBub3QgZm9ybWF0dGVkIGNvcnJlY3RseS4KLSAgICovCi0gIHB1YmxpYyBMaXN0IHByb2Nlc3NBbGxTY2hlbWEoTm9kZSBub2RlKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc0FsbFNjaGVtYShub2RlLCBjb250ZXh0KTsKLSAgfQotCi0gIC8qKgotICAgKiBTZWFyY2ggZm9yIGFsbCBzY2hlbWEgZWxlbWVudHMsIGxvYWQgdGhlIHhzZCBkb2N1bWVudHMsIGFuZCB0aGVuIHByb2Nlc3MgdGhlbS4KLSAgICogQHBhcmFtIG5vZGUgIG5vZGUuCi0gICAqIEByZXR1cm4gYSBsaXN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIG5vdCBmb3VuZCBvciBpZiBpdCBpcyBub3QgZm9ybWF0dGVkIGNvcnJlY3RseS4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBwcm9jZXNzQWxsU2NoZW1hKE5vZGUgbm9kZSwgU3RyaW5nIGN0eCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gUHJvY2VzcyBhbGwgbm9kZXMKLSAgICB3aGlsZSAobm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIElmIHRoaXMgaXMgYW4gZWxlbWVudCBub2RlLCB0aGVuIGNvbnRpbnVlCi0gICAgICBpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbm9kZS5nZXROb2RlVHlwZSgpKQotICAgICAgewotICAgICAgICAvLyBpZiB4c2Q6c2NoZW1hIGVsZW1lbnQgaXMgZm91bmQgLT4gcHJvY2VzcyBzY2hlbWEKLSAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhub2RlLCBFTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICB7Ci0gICAgICAgICAgcHJvY2Vzc1NjaGVtYSgoRWxlbWVudCkgbm9kZSk7Ci0KLSAgICAgICAgICAvLyBQcm9jZXNzIGFsbCBjaGlsZHJlbiBvZiB0aGUgc2NoZW1hIGVsZW1lbnQKLSAgICAgICAgICBwcm9jZXNzQWxsU2NoZW1hKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLCBjdHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgeHNkOmltcG9ydCBlbGVtZW50IGlzIGZvdW5kIC0+IGxvYWQgc2NoZW1hIGFuZCBwcm9jZXNzIHNjaGVtYQotICAgICAgICBlbHNlIGlmIChYTUxVdGlscy5lcXVhbHMobm9kZSwgRUxFTV9YU0RfSU1QT1JUKSkKLSAgICAgICAgewotCi0gICAgICAgICAgQXR0ciBzY2hlbWFMb2NhdGlvbiA9Ci0gICAgICAgICAgICBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoKEVsZW1lbnQpIG5vZGUsIEFUVFJfWFNEX1NDSEVNQUxPQ0FUSU9OKTsKLQotICAgICAgICAgIC8vIFRyeSB0byBwYXJzZSBpbXBvcnRlZCBYU0QKLSAgICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiBzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgIAlpZiAoIXNjaGVtYUxvY2F0aW9ucy5jb250YWlucyhzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpKSkKLSAgICAgICAgICAJewotICAgICAgICAgIAkJc2NoZW1hTG9jYXRpb25zLmFkZChzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBSZWFkIGFuZCBwUGFyc2UgdGhlIFhNTCBzY2hlbWEgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9Ci0gICAgICAgICAgICAgICAgICBwYXJzZVhNTERvY3VtZW50VVJMKAotICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICBjdHgsCi0gICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5nZXRYTUxTY2hlbWFMb2NhdGlvbigpKTsKLQotICAgICAgICAgICAgICAgIHByb2Nlc3NBbGxTY2hlbWEoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZVVSTFN0cmluZyhzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpLCBjdHgpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodGhyb3dFeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gTk9URTogQW4gZXhjZXB0aW9uIHdpbGwgb2NjdXIgaWYgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBub3QgZm91bmQgb3IgaWYgaXQgaXMgbm90IGZvcm1hdHRlZCBjb3JyZWN0bHkKLSAgICAgICAgICAgICAgICBpZiAodGhyb3dFeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKHQuZ2V0TWVzc2FnZSgpLCB0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIGVsc2UgaXRlcmF0ZSBlbGVtZW50IHJlY3Vyc2l2ZWx5Ci0gICAgICAgICAgcHJvY2Vzc0FsbFNjaGVtYShub2RlLmdldEZpcnN0Q2hpbGQoKSwgY3R4KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBHZXQgbmV4dCBzaWJpbGluZwotICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gbGlzdCBjcmVhdGVkIGJ5IHRoZSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhpcyBjbGFzcwotICAgIHJldHVybiByZXR1cm5MaXN0OwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc1NjaGVtYShFbGVtZW50IGVsZW1lbnQpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL3NjaGVtYS9YTUxTY2hlbWFWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvc2NoZW1hL1hNTFNjaGVtYVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjVlNTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvc2NoZW1hL1hNTFNjaGVtYVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UZXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxEb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET00yV3JpdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHZhbGlkYXRlIGFuIFhNTCBTY2hlbWEuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxTY2hlbWFWYWxpZGF0b3IgZXh0ZW5kcyBYTUxTY2hlbWFQcm9jZXNzb3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TX1BSRUZJWCA9ICJ4bWxuczoiOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgWE1MU2NoZW1hVmFsaWRhdG9yLgotICAgKiBAcGFyYW0gY29udGV4dCAgICAgICBkb2N1bWVudCBjb250ZXh0LiAKLSAgICogQHBhcmFtIGRvY3VtZW50TGlzdCAgY2FjaGUgb2YgcHJldmlvdXNseSBwYXJzZWQgZG9jdW1lbnRzLgotICAgKi8KLSAgcHVibGljIFhNTFNjaGVtYVZhbGlkYXRvcihTdHJpbmcgY29udGV4dCwgWE1MRG9jdW1lbnRDYWNoZSBkb2N1bWVudExpc3QpCi0gIHsKLSAgICBzdXBlcihjb250ZXh0LCBkb2N1bWVudExpc3QpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1NjaGVtYShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOYW1lZE5vZGVNYXAgYXR0ckxpc3Q7Ci0gICAgU3RyaW5nIGVsZW1lbnRQcmVmaXggPSBudWxsOwotCi0gICAgSGFzaE1hcCBlbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBIYXNoTWFwIG5zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCBzY2hlbWEgY29udGVudCBhcyBhIHN0cmluZwotICAgICAgU3RyaW5nIHNjaGVtYSA9IERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKGVsZW1lbnQpOwotCi0gICAgICAvLyBHZXQgbGlzdCBvZiBlbGVtZW50IG5hbWVzcGFjZXMKLSAgICAgIGlmICgoYXR0ckxpc3QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYWRkTmFtZXNwYWNlcyhhdHRyTGlzdCwgZWxlbWVudE1hcCwgbnVsbCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIGVsZW1lbnRNYXAgZG9lcyBub3QgY29udGFpbiBlbnRyeSBmb3IgaXQncyBvd24gbmFtZXNwYWNlLCB0aGVuIGFkZCBpdAotICAgICAgaWYgKGVsZW1lbnRNYXAuZ2V0KFhNTE5TX1BSRUZJWCArIGVsZW1lbnQuZ2V0UHJlZml4KCkpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGVsZW1lbnRNYXAucHV0KAotICAgICAgICAgIFhNTE5TX1BSRUZJWCArIGVsZW1lbnQuZ2V0UHJlZml4KCksCi0gICAgICAgICAgZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEdldCBmaXJzdCBwYXJlbnQgbm9kZSBhbmQgdGhlbiBwcm9jZXNzIGFsbCBvZiB0aGVtIHVudGlsIHlvdSBoaXQgdGhlIHRvcCBvZiB0aGUgZG9jdW1lbnQKLSAgICAgIE5vZGUgcGFyZW50Tm9kZSA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgd2hpbGUgKHBhcmVudE5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gT25seSBwcm9jZXNzIEVsZW1lbnQgbm9kZXMKLSAgICAgICAgaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgcGFyZW50IG5vZGUKLSAgICAgICAgICBhdHRyTGlzdCA9IHBhcmVudE5vZGUuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGF0dHJpYnV0ZXMsIGxvb2sgZm9yIHRoZSB4bWxuczogYXR0cmlidXRlcwotICAgICAgICAgIGlmIChhdHRyTGlzdCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZE5hbWVzcGFjZXMoYXR0ckxpc3QsIG5zTWFwLCBlbGVtZW50TWFwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEJ1aWxkIG5hbWVzcGFjZSBsaXN0Ci0gICAgICBpZiAobnNNYXAuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGF0dHI7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VMaXN0ID0gIiI7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbnNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGF0dHIgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgbmFtZXNwYWNlTGlzdCArPSAiICIgKyBhdHRyICsgIj1cIiIgKyBuc01hcC5nZXQoYXR0cikgKyAiXCIiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIG5hbWVzcGFjZSBzZXR0aW5ncywgc2luY2UgdGhlIERPTTJXcml0ZXIgd2lsbCBtaXNzIGFueSB0aGF0IGFyZSB1c2VkIGFzIGF0dHJpYnV0ZSB2YWx1ZXMKLSAgICAgICAgaW50IGluZGV4ID0gc2NoZW1hLmluZGV4T2YoIj4iKTsKLSAgICAgICAgaWYgKGluZGV4ID4gMCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBzdGFydCA9IHNjaGVtYS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgIFN0cmluZyBlbmQgPSBzY2hlbWEuc3Vic3RyaW5nKGluZGV4KTsKLQotICAgICAgICAgIHNjaGVtYSA9IHN0YXJ0ICsgbmFtZXNwYWNlTGlzdCArIGVuZDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBTY2hlbWEgdmFsaWRhdGUgdGhlIFhNTCBzY2hlbWEgZG9jdW1lbnQKLSAgICAgIERvY3VtZW50IGRvYyA9Ci0gICAgICAgIFhNTFV0aWxzLnBhcnNlWE1MKHNjaGVtYSwgVGVzdFV0aWxzLmdldFhNTFNjaGVtYUxvY2F0aW9uKCkpOwotICAgIH0KLQotICAgIGNhdGNoIChXU0lFeGNlcHRpb24gd2UpCi0gICAgewotICAgICAgVGhyb3dhYmxlIHQgPSB3ZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgIGlmICh0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybkxpc3QuYWRkKHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkTmFtZXNwYWNlcyhOYW1lZE5vZGVNYXAgYXR0ckxpc3QsIE1hcCBuc01hcCwgTWFwIGVsZW1lbnRNYXApCi0gIHsKLSAgICBOb2RlIGF0dHI7Ci0gICAgU3RyaW5nIG5vZGVOYW1lOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIGF0dHIgPSBhdHRyTGlzdC5pdGVtKGkpOwotCi0gICAgICAvLyBHZXQgdGhlIGF0dHJpYnV0ZSBub2RlIG5hbWUKLSAgICAgIG5vZGVOYW1lID0gYXR0ci5nZXROb2RlTmFtZSgpOwotCi0gICAgICAvLyBJZiBpdCBzdGFydHMgd2l0aCB4bWxuczosIHRoZW4gZGV0ZXJtaW5lIGlmIGl0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBuYW1lc3BhY2VzIAotICAgICAgaWYgKG5vZGVOYW1lLnN0YXJ0c1dpdGgoWE1MTlNfUFJFRklYKQotICAgICAgICAmJiAoKGVsZW1lbnRNYXAgPT0gbnVsbAotICAgICAgICAgIHx8IChlbGVtZW50TWFwICE9IG51bGwgJiYgZWxlbWVudE1hcC5nZXQobm9kZU5hbWUpID09IG51bGwpKSkpCi0gICAgICB7Ci0gICAgICAgIGlmIChuc01hcC5nZXQobm9kZU5hbWUpID09IG51bGwpCi0gICAgICAgICAgbnNNYXAucHV0KG5vZGVOYW1lLCBhdHRyLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvVVJJRW5jb2Rlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvVVJJRW5jb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg5ZWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1VSSUVuY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0gKgotICogcGx1Z2lucy9jb20uaWJtLmV0b29scy54bWx1dGlsaXR5L3NyYy9jb20vaWJtL2V0b29scy94bWx1dGlsaXR5L3VyaS9VUklFbmNvZGVyLmphdmEsIGNvbS5pYm0uZXRvb2xzLnhtbHV0aWxpdHksIHdzYS54bWwudjUxLCAyMDAzMDcxOF8xNjA1Lm8KLSAqCi0gKiBAdmVyc2lvbiAxLjMgNy8xOC8wMwotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkJpdFNldDsKLQotLyoqCi0gKiAgVGhpcyBjbGFzcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgamF2YS5sYW5nLlVSTEVuY29kZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklFbmNvZGVyCi17Ci0gIHN0YXRpYyBCaXRTZXQgZG9udE5lZWRFbmNvZGluZzsKLSAgc3RhdGljIGZpbmFsIGludCBjYXNlRGlmZiA9ICgnYScgLSAnQScpOwotICBzdGF0aWMgU3RyaW5nIGRmbHRFbmNOYW1lID0gbnVsbDsKLQotICBzdGF0aWMgewotICAgIGRvbnROZWVkRW5jb2RpbmcgPSBuZXcgQml0U2V0KDI1Nik7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gJ2EnOyBpIDw9ICd6JzsgaSsrKQotICAgIHsKLSAgICAgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KGkpOwotICAgIH0KLSAgICBmb3IgKGkgPSAnQSc7IGkgPD0gJ1onOyBpKyspCi0gICAgewotICAgICAgZG9udE5lZWRFbmNvZGluZy5zZXQoaSk7Ci0gICAgfQotICAgIGZvciAoaSA9ICcwJzsgaSA8PSAnOSc7IGkrKykKLSAgICB7Ci0gICAgICBkb250TmVlZEVuY29kaW5nLnNldChpKTsKLSAgICB9Ci0KLSAgICAvL2RvbnROZWVkRW5jb2Rpbmcuc2V0KCcgJyk7IC8vIGNzLi4gcmVtb3ZlZCBzbyB0aGF0IHNwYWNlIGNoYXJhY3RlciB3aWxsIGJlIHJlcGxhY2VkIGJ5ICUyMAotICAgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCctJyk7Ci0gICAgZG9udE5lZWRFbmNvZGluZy5zZXQoJ18nKTsKLSAgICBkb250TmVlZEVuY29kaW5nLnNldCgnLicpOwotICAgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCcqJyk7Ci0gICAgZG9udE5lZWRFbmNvZGluZy5zZXQoJzonKTsgLy8gY3MuLiBhZGRlZCAKLSAgICBkb250TmVlZEVuY29kaW5nLnNldCgnLycpOwotICAgIC8vIGNzLi4gYWRkZWQgc28gdGhhdCBzbGFzaGVzIGRvbid0IGdldCBlbmNvZGVkIGFzICUyRgotCi0gICAgLy8gZGZsdEVuY05hbWUgPSAoU3RyaW5nKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBHZXRQcm9wZXJ0eUFjdGlvbigiZmlsZS5lbmNvZGluZyIpKTsKLSAgICAvLyBBcyBkaXNjdXNzZWQgd2l0aCBTYW5keSwgd2Ugc2hvdWxkIGVuY29kZSBVUklzIHdpdGggVVRGOAotICAgIGRmbHRFbmNOYW1lID0gIlVURjgiOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJkZmx0RW5jTmFtZSAiICsgZGZsdEVuY05hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFlvdSBjYW4ndCBjYWxsIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByaXZhdGUgVVJJRW5jb2RlcigpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFuc2xhdGVzIGEgc3RyaW5nIGludG8gPGNvZGU+eC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPgotICAgKiBmb3JtYXQuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBlbmNvZGluZwotICAgKiBhcyB0aGUgZW5jb2Rpbmcgc2NoZW1lIHRvIG9idGFpbiB0aGUgYnl0ZXMgZm9yIHVuc2FmZSBjaGFyYWN0ZXJzLgotICAgKgotICAgKiBAcGFyYW0gICBzICAgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBiZSB0cmFuc2xhdGVkLgotICAgKiBAcmV0dXJuICB0aGUgdHJhbnNsYXRlZCA8Y29kZT5TdHJpbmc8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKQotICB7Ci0gICAgU3RyaW5nIHN0ciA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgc3RyID0gZW5jb2RlKHMsIGRmbHRFbmNOYW1lKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBUaGUgc3lzdGVtIHNob3VsZCBhbHdheXMgaGF2ZSB0aGUgcGxhdGZvcm0gZGVmYXVsdAotICAgIH0KLSAgICByZXR1cm4gc3RyOwotICB9Ci0KLSAgLyoqCi0gICAqIFRyYW5zbGF0ZXMgYSBzdHJpbmcgaW50byA8Y29kZT5hcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ8L2NvZGU+Ci0gICAqIGZvcm1hdCB1c2luZyBhIHNwZWNpZmljIGVuY29kaW5nIHNjaGVtZS4gVGhpcyBtZXRob2QgdXNlcyB0aGUKLSAgICogc3VwcGxpZWQgZW5jb2Rpbmcgc2NoZW1lIHRvIG9idGFpbiB0aGUgYnl0ZXMgZm9yIHVuc2FmZQotICAgKiBjaGFyYWN0ZXJzLgotICAgKiA8cD4KLSAgICogPGVtPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIDxhIGhyZWY9Ci0gICAqICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAvYXBwZW5kaXgvbm90ZXMuaHRtbCNub24tYXNjaWktY2hhcnMiPgotICAgKiBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIFJlY29tbWVuZGF0aW9uPC9hPiBzdGF0ZXMgdGhhdAotICAgKiBVVEYtOCBzaG91bGQgYmUgdXNlZC4gTm90IGRvaW5nIHNvIG1heSBpbnRyb2R1Y2UKLSAgICogaW5jb21wYXRpYmlsaXRlcy48L2VtPgotICAgKgotICAgKiBAcGFyYW0gICBzICAgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBiZSB0cmFuc2xhdGVkLgotICAgKiBAcGFyYW0gICBlbmMgICBUaGUgbmFtZSBvZiBhIHN1cHBvcnRlZCAKLSAgICogICAgPGEgaHJlZj0iLi4vbGFuZy9wYWNrYWdlLXN1bW1hcnkuaHRtbCNjaGFyZW5jIj5jaGFyYWN0ZXIKLSAgICogICAgZW5jb2Rpbmc8L2E+LgotICAgKiBAcmV0dXJuICB0aGUgdHJhbnNsYXRlZCA8Y29kZT5TdHJpbmc8L2NvZGU+LgotICAgKiBAZXhjZXB0aW9uICBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAqICAgICAgICAgICAgIElmIHRoZSBuYW1lZCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkCi0gICAqIEBzZWUgVVJMRGVjb2RlciNkZWNvZGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcywgU3RyaW5nIGVuYykKLSAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBuZWVkVG9DaGFuZ2UgPSBmYWxzZTsKLSAgICBib29sZWFuIHdyb3RlVW5lbmNvZGVkQ2hhciA9IGZhbHNlOwotICAgIGludCBtYXhCeXRlc1BlckNoYXIgPSAxMDsgLy8gcmF0aGVyIGFyYml0cmFyeSBsaW1pdCwgYnV0IHNhZmUgZm9yIG5vdwotICAgIFN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKG1heEJ5dGVzUGVyQ2hhcik7Ci0gICAgQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0KLSAgICAgIG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJ1ZiwgZW5jKSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgYyA9IChpbnQpIHMuY2hhckF0KGkpOwotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkV4YW1pbmluZyBjaGFyYWN0ZXI6ICIgKyBjKTsKLSAgICAgIGlmIChkb250TmVlZEVuY29kaW5nLmdldChjKSkKLSAgICAgIHsKLSAgICAgICAgLy9pZiAoYyA9PSAnICcpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgYyA9ICcrJzsKLSAgICAgICAgLy8gIG5lZWRUb0NoYW5nZSA9IHRydWU7Ci0gICAgICAgIC8vfQotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiU3RvcmluZzogIiArIGMpOwotICAgICAgICBvdXQuYXBwZW5kKChjaGFyKSBjKTsKLSAgICAgICAgd3JvdGVVbmVuY29kZWRDaGFyID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gY29udmVydCB0byBleHRlcm5hbCBlbmNvZGluZyBiZWZvcmUgaGV4IGNvbnZlcnNpb24KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpZiAod3JvdGVVbmVuY29kZWRDaGFyKQotICAgICAgICAgIHsgLy8gRml4IGZvciA0NDA3NjEwCi0gICAgICAgICAgICB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihidWYsIGVuYykpOwotICAgICAgICAgICAgd3JvdGVVbmVuY29kZWRDaGFyID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdyaXRlci53cml0ZShjKTsKLQotICAgICAgICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIHJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIGEgVW5pY29kZQotICAgICAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlyLCB0aGVuIHBhc3MgaW4gdHdvIGNoYXJhY3RlcnMuIEl0J3Mgbm90Ci0gICAgICAgICAgLy8gY2xlYXIgd2hhdCBzaG91bGQgYmUgZG9uZSBpZiBhIGJ5dGVzIHJlc2VydmVkIGluIHRoZSAKLSAgICAgICAgICAvLyBzdXJyb2dhdGUgcGFpcnMgcmFuZ2Ugb2NjdXJzIG91dHNpZGUgb2YgYSBsZWdhbAotICAgICAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlyLiBGb3Igbm93LCBqdXN0IHRyZWF0IGl0IGFzIGlmIGl0IHdlcmUgCi0gICAgICAgICAgLy8gYW55IG90aGVyIGNoYXJhY3Rlci4KLSAgICAgICAgICAvLyAKLSAgICAgICAgICBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERCRkYpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gIFN5c3RlbS5vdXQucHJpbnRsbihJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpICsgIiBpcyBoaWdoIHN1cnJvZ2F0ZSIpOwkJCSAgICAgIAotICAgICAgICAgICAgaWYgKChpICsgMSkgPCBzLmxlbmd0aCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnQgZCA9IChpbnQpIHMuY2hhckF0KGkgKyAxKTsKLSAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdEV4YW1pbmluZyAiICsgSW50ZWdlci50b0hleFN0cmluZyhkKSk7CQkJICAgICAgCi0gICAgICAgICAgICAgIGlmIChkID49IDB4REMwMCAmJiBkIDw9IDB4REZGRikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgSW50ZWdlci50b0hleFN0cmluZyhkKSArICIgaXMgbG93IHN1cnJvZ2F0ZSIpOwkJCQkKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZCk7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgYnVmLnJlc2V0KCk7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIGJhID0gYnVmLnRvQnl0ZUFycmF5KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBiYS5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgIG91dC5hcHBlbmQoJyUnKTsKLSAgICAgICAgICBjaGFyIGNoID0gQ2hhcmFjdGVyLmZvckRpZ2l0KChiYVtqXSA+PiA0KSAmIDB4RiwgMTYpOwotICAgICAgICAgIC8vIGNvbnZlcnRpbmcgdG8gdXNlIHVwcGVyY2FzZSBsZXR0ZXIgYXMgcGFydCBvZgotICAgICAgICAgIC8vIHRoZSBoZXggdmFsdWUgaWYgY2ggaXMgYSBsZXR0ZXIuCi0gICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlcihjaCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2ggLT0gY2FzZURpZmY7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dC5hcHBlbmQoY2gpOwotICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGJhW2pdICYgMHhGLCAxNik7Ci0gICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlcihjaCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2ggLT0gY2FzZURpZmY7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dC5hcHBlbmQoY2gpOwotICAgICAgICB9Ci0gICAgICAgIGJ1Zi5yZXNldCgpOwotICAgICAgICBuZWVkVG9DaGFuZ2UgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKG5lZWRUb0NoYW5nZSA/IG91dC50b1N0cmluZygpIDogcyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1dTSVByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9XU0lQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGI4ZDIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1dTSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsOwotCi0vKioKLSAqIFdTLUkgdGVzdCB0b29scyBwcm9wZXJ0eS4KLSAqIAotICogQGF1dGhvciBEYXZpZCBMYXV6b24sIElCTQotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgV1NJUHJlZmVyZW5jZXMKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwgPSAiIjsKLSAgcHJvdGVjdGVkIFN0cmluZyB0YWRmaWxlID0gIiI7Ci0gIAotICAvKioKLSAgICogIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTSVByZWZlcmVuY2VzKCkKLSAgewotCWNvbXBsaWFuY2VMZXZlbCA9IFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuV0FSTl9OT05fV1NJOwotCXRhZGZpbGUgPSBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLkRFRkFVTFRfQVNTRVJUSU9OX0ZJTEU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBXUy1JIGNvbXBsaWFuY2UgbGV2ZWwuCi0gICAqIEByZXR1cm4gdGhlIFdTLUkgY29tcGxpYW5jZSBsZXZlbC4KLSAgICogQHNlZSAjc2V0Q29tcGxpYW5jZUxldmVsCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbXBsaWFuY2VMZXZlbCgpCi0gIHsKLSAgICByZXR1cm4gY29tcGxpYW5jZUxldmVsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgV1MtSSBjb21wbGlhbmNlIGxldmVsLgotICAgKiBAcGFyYW0gY29tcGxpYW5jZSB0aGUgV1MtSSBjb21wbGlhbmNlIGxldmVsLgotICAgKiBAc2VlICNnZXRDb21wbGlhbmNlTGV2ZWwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbXBsaWFuY2VMZXZlbChTdHJpbmcgY29tcGxpYW5jZSkKLSAgewotICAgIHRoaXMuY29tcGxpYW5jZUxldmVsID0gY29tcGxpYW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgQmFzaWMgUHJvZmlsZSBUZXN0IEFzc2VydGlvbnMgZmlsZS4KLSAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIEJhc2ljIFByb2ZpbGUgVGVzdCBBc3NlcnRpb25zIGZpbGUuCi0gICAqIEBzZWUgI3NldFRBREZpbGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VEFERmlsZSgpCi0gIHsKLSAgICByZXR1cm4gdGFkZmlsZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBCYXNpYyBQcm9maWxlIFRlc3QgQXNzZXJ0aW9ucyBmaWxlLgotICAgKiBAcGFyYW0gZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIEJhc2ljIFByb2ZpbGUgVGVzdCBBc3NlcnRpb25zIGZpbGUuCi0gICAqIEBzZWUgI2dldFRBREZpbGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRBREZpbGUoU3RyaW5nIGZpbGUpCi0gIHsKLSAgICB0aGlzLnRhZGZpbGUgPSBmaWxlOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1dTSVRlc3RUb29sc1BsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvV1NJVGVzdFRvb2xzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMWU5NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvV1NJVGVzdFRvb2xzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoZSBXUy1JIHRlc3QgdG9vbHMgcGx1Z2luLgotICogCi0gKiBAYXV0aG9yIGxhdXpvbmQKLSAqLwotCi1wdWJsaWMgY2xhc3MgV1NJVGVzdFRvb2xzUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotICBwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFVJUGx1Z2luIGluc3RhbmNlOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFBMVUdJTl9QUk9QRVJUSUVTID0gIndzaXZhbGlkYXRlIjsKLSAgcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIHJlc291cmNlYnVuZGxlID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3Igd3NpVGVzdFRvb2xzUGx1Z2luLgotICAgKiBAcGFyYW0gZGVzY3JpcHRvciBhbiBJUGx1Z2luRGVzY3JpcHRvciBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NJVGVzdFRvb2xzUGx1Z2luKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpCi0gIHsKLSAgICBzdXBlcihkZXNjcmlwdG9yKTsKLSAgICBpbnN0YW5jZSA9IHRoaXM7Ci0KLSAgICAvLyBzZXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5Ci0gICBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLnNldEluc3RhbGxEaXIoZ2V0SW5zdGFsbFVSTCgpKTsKLSAgIHJlc291cmNlYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFBMVUdJTl9QUk9QRVJUSUVTKTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0SW5zdGFuY2UuCi0gICAqIEByZXR1cm4gQWJzdHJhY3RVSVBsdWdpbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBBYnN0cmFjdFVJUGx1Z2luIGdldEluc3RhbmNlKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgcGx1Z2luLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGlzIHBsdWdpbi4KLSAgICovCi0gIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VidW5kbGU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldFBsdWdpbi4KLSAgICogQHJldHVybiBXU0lUb29sc1V0aWxQbHVnaW4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV1NJVGVzdFRvb2xzUGx1Z2luIGdldFBsdWdpbigpCi0gIHsKLSAgICByZXR1cm4gKFdTSVRlc3RUb29sc1BsdWdpbikgaW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBpbnN0YWxsYWJsZSBVUkwgZm9yIHRoaXMgcGx1Z2luLgotICAgKiBAcmV0dXJuIGluc3RhbGxhYmxlIFVSTCBmb3IgdGhpcyBwbHVnaW4uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEluc3RhbGxVUkwoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIFBsYXRmb3JtLnJlc29sdmUoZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKSkuZ2V0RmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1dTSVRlc3RUb29sc1Byb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1dTSVRlc3RUb29sc1Byb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRmOWNlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9XU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5XU0lQcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbi5XU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXMuUGVyc2lzdGVudFdTSUNvbnRleHQ7Ci0KLS8qKgotICogV1MtSSB0ZXN0IHRvb2xzIHByb3BlcnR5LgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGluc3RhbGxVUkwgPSAiIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgdGFkZmlsZSA9ICIiOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIHNjaGVtYURpciA9ICJjb21tb24vc2NoZW1hcy8iOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTU0JQX0FTU0VSVElPTl9GSUxFID0gImNvbW1vbi9wcm9maWxlcy9TU0JQMTBfQlAxMV9UQUQueG1sIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVBfQVNTRVJUSU9OX0ZJTEUgPSAiY29tbW9uL3Byb2ZpbGVzL0FQMTBfQlAxMV9TU0JQMTBfVEFELnhtbCI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQVNTRVJUSU9OX0ZJTEUgPSBBUF9BU1NFUlRJT05fRklMRTsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1BfTk9OX1dTSSA9ICIwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTl9OT05fV1NJID0gIjEiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfTk9OX1dTSSA9ICIyIjsKLQotICAvKioKLSAgICogIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFdTSVRlc3RUb29sc1Byb3BlcnRpZXMoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgc2NoZW1hIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gZGlyIHRoZSBzY2hlbWEgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5zdGFsbERpcihTdHJpbmcgZGlyKQotICB7Ci0gICAgaW5zdGFsbFVSTCA9IGRpcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCBsb2NhbCBwcm9wZXJ0aWVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldExvY2FsKCkKLSAgewotICAgIFByb3BlcnRpZXMgc2NoZW1hTG9jYXRpb25Qcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICBTdHJpbmcgc2NoZW1hVVJMID0gaW5zdGFsbFVSTCArIHNjaGVtYURpcjsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzY2hlbWFMb2NhdGlvblByb3BlcnRpZXMuc2V0UHJvcGVydHkoCi0gICAgICAgICJ3c2kuYW5hbHl6ZXIueG1sc2NoZW1hLnNjaGVtYSIsCi0gICAgICAgIFVSSUVuY29kZXIuZW5jb2RlKHNjaGVtYVVSTCArICJYTUxTY2hlbWEueHNkIiwgIlVURjgiKSk7Ci0gICAgICBzY2hlbWFMb2NhdGlvblByb3BlcnRpZXMuc2V0UHJvcGVydHkoCi0gICAgICAgICJ3c2kuYW5hbHl6ZXIud3NkbC5zY2hlbWEiLAotICAgICAgICBVUklFbmNvZGVyLmVuY29kZShzY2hlbWFVUkwgKyAid3NkbDExLnhzZCIsICJVVEY4IikpOwotICAgICAgc2NoZW1hTG9jYXRpb25Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KAotICAgICAgICAid3NpLmFuYWx5emVyLnNvYXAuc2NoZW1hIiwKLSAgICAgICAgVVJJRW5jb2Rlci5lbmNvZGUoc2NoZW1hVVJMICsgInNvYXBFbnZlbG9wZS54c2QiLCAiVVRGOCIpKTsKLSAgICAgIHNjaGVtYUxvY2F0aW9uUHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKLSAgICAgICAgIndzaS5hbmFseXplci53c2Rsc29hcC5zY2hlbWEiLAotICAgICAgICBVUklFbmNvZGVyLmVuY29kZShzY2hlbWFVUkwgKyAid3NkbFNvYXAueHNkIiwgIlVURjgiKSk7Ci0gICAgfQotICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgc2NoZW1hTG9jYXRpb25Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KAotICAgICAgICAid3NpLmFuYWx5emVyLnhtbHNjaGVtYS5zY2hlbWEiLAotICAgICAgICBVUklFbmNvZGVyLmVuY29kZShzY2hlbWFVUkwgKyAiWE1MU2NoZW1hLnhzZCIpKTsKLSAgICAgIHNjaGVtYUxvY2F0aW9uUHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKLSAgICAgICAgIndzaS5hbmFseXplci53c2RsLnNjaGVtYSIsCi0gICAgICAgIFVSSUVuY29kZXIuZW5jb2RlKHNjaGVtYVVSTCArICJ3c2RsMTEueHNkIikpOwotICAgICAgc2NoZW1hTG9jYXRpb25Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KAotICAgICAgICAid3NpLmFuYWx5emVyLnNvYXAuc2NoZW1hIiwKLSAgICAgICAgVVJJRW5jb2Rlci5lbmNvZGUoc2NoZW1hVVJMICsgInNvYXBFbnZlbG9wZS54c2QiKSk7Ci0gICAgICBzY2hlbWFMb2NhdGlvblByb3BlcnRpZXMuc2V0UHJvcGVydHkoCi0gICAgICAgICJ3c2kuYW5hbHl6ZXIud3NkbHNvYXAuc2NoZW1hIiwKLSAgICAgICAgVVJJRW5jb2Rlci5lbmNvZGUoc2NoZW1hVVJMICsgIndzZGxTb2FwLnhzZCIpKTsKLSAgICB9Ci0gICAgV1NJUHJvcGVydGllcy5zZXRUaHJlYWRMb2NhbFByb3BlcnRpZXMoc2NoZW1hTG9jYXRpb25Qcm9wZXJ0aWVzKTsKLSAgfQotCi0gCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS53c2kuQ2hlY2tXU0kjY2hlY2tXU0koamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV1NJUHJlZmVyZW5jZXMgY2hlY2tXU0lQcmVmZXJlbmNlcyhTdHJpbmcgZmlsZXVyaSkKLSAgewotICAJV1NJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBuZXcgV1NJUHJlZmVyZW5jZXMoKTsKLSAgCQotICAgIC8vIFJlbW92ZSBmaWxlOiBhbmQgYW55IHNsYXNoZXMgZnJvbSB0aGUgZmlsZXVyaS4gCi0gIAkvLyBFY2xpcHNlJ3MgcmVzb2x1dGlvbiBtZWNoYW5pc20gbmVlZHMgdG8gc3RhcnQgd2l0aCB0aGUgZHJpdmUuCi0gICAgU3RyaW5nIHVyaVN0ciA9IHRyaW1VUkkoZmlsZXVyaSk7Ci0KLSAgICBXU1VJUGx1Z2luIHdzdWkgPSBXU1VJUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0gICAgUGVyc2lzdGVudFdTSUNvbnRleHQgQVBjb250ZXh0ID0gd3N1aS5nZXRXU0lBUENvbnRleHQoKTsKLSAgICBQZXJzaXN0ZW50V1NJQ29udGV4dCBTU0JQY29udGV4dCA9IHdzdWkuZ2V0V1NJU1NCUENvbnRleHQoKTsKLSAgICAKLSAgICBJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aCh1cmlTdHIpKTsKLSAgICBpZiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPT0gMSkKLSAgICB7Ci0gICAgICAvL2NoZWNrIHByb2plY3QgbGV2ZWwgY29ucGxpYW5jZQotICAgICAgSVByb2plY3QgcHJvamVjdCA9IGZpbGVzWzBdLmdldFByb2plY3QoKTsKLSAgICAgIAotICAgICAgaWYgKEFQY29udGV4dC5wcm9qZWN0U3RvcE5vbldTSUNvbXBsaWFuY2VzKHByb2plY3QpKQotICAgICAgewotICAgICAgCXByZWZlcmVuY2VzLnNldFRBREZpbGUoaW5zdGFsbFVSTCArIEFQX0FTU0VSVElPTl9GSUxFKTsKLSAgICAgICAgcHJlZmVyZW5jZXMuc2V0Q29tcGxpYW5jZUxldmVsKFBlcnNpc3RlbnRXU0lDb250ZXh0LlNUT1BfTk9OX1dTSSk7Ci0gICAgICB9IAotICAgICAgZWxzZSBpZiAoQVBjb250ZXh0LnByb2plY3RXYXJuTm9uV1NJQ29tcGxpYW5jZXMocHJvamVjdCkpCi0gICAgICB7Ci0gICAgICAJcHJlZmVyZW5jZXMuc2V0VEFERmlsZShpbnN0YWxsVVJMICsgQVBfQVNTRVJUSU9OX0ZJTEUpOwotICAgICAgICBwcmVmZXJlbmNlcy5zZXRDb21wbGlhbmNlTGV2ZWwoUGVyc2lzdGVudFdTSUNvbnRleHQuV0FSTl9OT05fV1NJKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFNTQlBjb250ZXh0LnByb2plY3RTdG9wTm9uV1NJQ29tcGxpYW5jZXMocHJvamVjdCkpCi0gICAgICB7Ci0gICAgICAJcHJlZmVyZW5jZXMuc2V0VEFERmlsZShpbnN0YWxsVVJMICsgU1NCUF9BU1NFUlRJT05fRklMRSk7Ci0gICAgICAgIHByZWZlcmVuY2VzLnNldENvbXBsaWFuY2VMZXZlbChQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0kpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoU1NCUGNvbnRleHQucHJvamVjdFdhcm5Ob25XU0lDb21wbGlhbmNlcyhwcm9qZWN0KSkKLSAgICAgIHsKLSAgICAgIAlwcmVmZXJlbmNlcy5zZXRUQURGaWxlKGluc3RhbGxVUkwgKyBTU0JQX0FTU0VSVElPTl9GSUxFKTsKLSAgICAgICAgcHJlZmVyZW5jZXMuc2V0Q29tcGxpYW5jZUxldmVsKFBlcnNpc3RlbnRXU0lDb250ZXh0LldBUk5fTk9OX1dTSSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAJcHJlZmVyZW5jZXMuc2V0VEFERmlsZShpbnN0YWxsVVJMICsgREVGQVVMVF9BU1NFUlRJT05fRklMRSk7Ci0gICAgICAgIHByZWZlcmVuY2VzLnNldENvbXBsaWFuY2VMZXZlbChQZXJzaXN0ZW50V1NJQ29udGV4dC5JR05PUkVfTk9OX1dTSSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBJZiB3ZSBjYW4ndCBvYnRhaW4gdGhlIHByb2plY3QgcHJlZmVyZW5jZSB1c2UgdGhlIGdsb2JhbCBwcmVmZXJlbmNlLgotICAgICAgU3RyaW5nIEFQbGV2ZWwgPSBBUGNvbnRleHQuZ2V0UGVyc2lzdGVudFdTSUNvbXBsaWFuY2UoKTsKLSAgICAgIFN0cmluZyBTU0JQbGV2ZWwgPSBTU0JQY29udGV4dC5nZXRQZXJzaXN0ZW50V1NJQ29tcGxpYW5jZSgpOwotICAgICAgaWYoQVBsZXZlbC5lcXVhbHMoUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJKSkKLSAgICAgIHsKLSAgICAgIAlwcmVmZXJlbmNlcy5zZXRUQURGaWxlKGluc3RhbGxVUkwgKyBBUF9BU1NFUlRJT05fRklMRSk7Ci0gICAgICAgIHByZWZlcmVuY2VzLnNldENvbXBsaWFuY2VMZXZlbChQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0kpOwotICAgICAgfQotICAgICAgZWxzZSBpZihBUGxldmVsLmVxdWFscyhQZXJzaXN0ZW50V1NJQ29udGV4dC5XQVJOX05PTl9XU0kpKQotICAgICAgewotICAgICAgCXByZWZlcmVuY2VzLnNldFRBREZpbGUoaW5zdGFsbFVSTCArIEFQX0FTU0VSVElPTl9GSUxFKTsKLSAgICAgICAgcHJlZmVyZW5jZXMuc2V0Q29tcGxpYW5jZUxldmVsKFBlcnNpc3RlbnRXU0lDb250ZXh0LldBUk5fTk9OX1dTSSk7Ci0gICAgIH0KLSAgICAgaWYoU1NCUGxldmVsLmVxdWFscyhQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0kpKQotICAgICB7Ci0gICAJICAgcHJlZmVyZW5jZXMuc2V0VEFERmlsZShpbnN0YWxsVVJMICsgU1NCUF9BU1NFUlRJT05fRklMRSk7Ci0gICAgICAgcHJlZmVyZW5jZXMuc2V0Q29tcGxpYW5jZUxldmVsKFBlcnNpc3RlbnRXU0lDb250ZXh0LlNUT1BfTk9OX1dTSSk7Ci0gICAgIH0KLSAgICAgZWxzZSBpZihTU0JQbGV2ZWwuZXF1YWxzKFBlcnNpc3RlbnRXU0lDb250ZXh0LldBUk5fTk9OX1dTSSkpCi0gICAgIHsKLSAgICAJcHJlZmVyZW5jZXMuc2V0VEFERmlsZShpbnN0YWxsVVJMICsgU1NCUF9BU1NFUlRJT05fRklMRSk7Ci0gICAgICAgIHByZWZlcmVuY2VzLnNldENvbXBsaWFuY2VMZXZlbChQZXJzaXN0ZW50V1NJQ29udGV4dC5XQVJOX05PTl9XU0kpOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgCXByZWZlcmVuY2VzLnNldFRBREZpbGUoaW5zdGFsbFVSTCArIERFRkFVTFRfQVNTRVJUSU9OX0ZJTEUpOwotICAgICAgICBwcmVmZXJlbmNlcy5zZXRDb21wbGlhbmNlTGV2ZWwoUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJlZmVyZW5jZXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZW1vdmUgZmlsZTogYW5kIGFueSBzbGFzaGVzIGZyb20gdGhlIGZpbGV1cmkuIAotICAgKiBFY2xpcHNlJ3MgcmVzb2x1dGlvbiBtZWNoYW5pc20gbmVlZHMgdG8gc3RhcnQgd2l0aCB0aGUgZHJpdmUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdHJpbVVSSShTdHJpbmcgZmlsZXVyaSkKLSAgewotICAJU3RyaW5nIHVyaVN0ciA9IGZpbGV1cmk7Ci0gIAkKLSAgICBpZihmaWxldXJpLnN0YXJ0c1dpdGgoImZpbGU6IikpCi0gICAgewotICAgICAgdXJpU3RyID0gZmlsZXVyaS5zdWJzdHJpbmcoNSk7Ci0gICAgfQotICAgIHdoaWxlKHVyaVN0ci5zdGFydHNXaXRoKCIvIikgfHwgdXJpU3RyLnN0YXJ0c1dpdGgoIlxcIikpCi0gICAgewotICAgICAgdXJpU3RyID0gdXJpU3RyLnN1YnN0cmluZygxKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVyaVN0cjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9hbmFseXplci9NZXNzYWdlQW5hbHl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2FuYWx5emVyL01lc3NhZ2VBbmFseXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTNlMzE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2FuYWx5emVyL01lc3NhZ2VBbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuYW5hbHl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuVVJJRW5jb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuV1NJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5XU0lUZXN0VG9vbHNQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuYW5hbHl6ZXIuV1NJQW5hbHl6ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5BbmFseXplckNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFzc2VydGlvblJlc3VsdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5Bc3NlcnRpb25SZXN1bHRzT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbC5Bc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbC5XU0RMUmVmZXJlbmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuY29tbW9uLkFkZFN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5pbXBsLkFkZFN0eWxlU2hlZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLnJlcG9ydC5Bc3NlcnRpb25FcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbC5GYWlsdXJlRGV0YWlsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGwuUmVwb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmRvbS5FbGVtZW50TG9jYXRpb247Ci0KLS8qKgotICogTWVzc2FnZUFuYWx5emVyCi0gKiAKLSAqIEEgY2xhc3MgdGhhdCBhbGxvd3Mgc2ltcGxlIGFjY2VzcyB0byB0aGUgV1MtSSBUZXN0IFRvb2xzIGluIG9yZGVyIHRvIGFuYWx5emUKLSAqIG1lc3NhZ2VzIGluIGEgbG9nIGZpbGUuCi0gKi8KLQotcHVibGljIGNsYXNzIE1lc3NhZ2VBbmFseXplcgotewotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLndzaS50ZXN0LnRvb2xzIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfUE9SVCA9ICJwb3J0IjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFlQRV9CSU5ESU5HID0gImJpbmRpbmciOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUWVBFX1BPUlRUWVBFID0gInBvcnR0eXBlIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFlQRV9PUEVSQVRJT04gPSAib3BlcmF0aW9uIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFlQRV9NRVNTQUdFID0gIm1lc3NhZ2UiOwotCi0gIC8vIFRlc3QgcmVzdWx0IFN0cmluZ3MKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBOT1RQQVNTRUQgPSAibm90UGFzc2VkIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBXQVJOSU5HID0gIndhcm5pbmciOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEZBSUxFRCA9ICJmYWlsZWQiOwotICAKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBGSUxFID0gImZpbGU6IjsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGVuYW1lOwotICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxmaWxlID0gbnVsbDsKLSAgcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50bmFtZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgcHJvdGVjdGVkIFN0cmluZyBwYXJlbnRuYW1lID0gbnVsbDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gd3NkbHNwZWNpZmllZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3QgYXNzZXJ0aW9ud2FybmluZ3M7Ci0gIHByb3RlY3RlZCBMaXN0IGFzc2VydGlvbmVycm9yczsKLSAgcHJvdGVjdGVkIFdTSVByZWZlcmVuY2VzIHdzaVByZWZlcmVuY2VzID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgTWVzc2FnZUFuYWx5emVyLgotICAgKiBAcGFyYW0gZmlsZW5hbWUgbG9nIGZpbGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlQW5hbHl6ZXIoU3RyaW5nIGZpbGVuYW1lKQotICB7Ci0gICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOwotCi0gICAgYXNzZXJ0aW9ud2FybmluZ3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgYXNzZXJ0aW9uZXJyb3JzID0gbmV3IFZlY3RvcigpOwotICAJdGhpcy53c2lQcmVmZXJlbmNlcyA9IFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuY2hlY2tXU0lQcmVmZXJlbmNlcyhmaWxlbmFtZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgTWVzc2FnZUFuYWx5emVyLgotICAgKiBAcGFyYW0gZmlsZW5hbWUgbG9nIGZpbGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlQW5hbHl6ZXIoU3RyaW5nIGZpbGVuYW1lLCBXU0lQcmVmZXJlbmNlcyB3c2lQcmVmZXJlbmNlcykKLSAgewotICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQotICAgIGFzc2VydGlvbndhcm5pbmdzID0gbmV3IFZlY3RvcigpOwotICAgIGFzc2VydGlvbmVycm9ycyA9IG5ldyBWZWN0b3IoKTsKLSAgCXRoaXMud3NpUHJlZmVyZW5jZXMgPSB3c2lQcmVmZXJlbmNlczsKLSAgfQotCi0gIHB1YmxpYyBNZXNzYWdlQW5hbHl6ZXIoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgd3NkbGZpbGUsIFN0cmluZyBlbGVtZW50bmFtZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHBhcmVudG5hbWUsIFN0cmluZyB0eXBlKQotICB7Ci0gIAl0aGlzKGZpbGVuYW1lKTsKLSAgCXdzZGxzcGVjaWZpZWQgPSB0cnVlOwotICAJCi0gIAl0aGlzLndzZGxmaWxlID0gd3NkbGZpbGU7Ci0gIAl0aGlzLmVsZW1lbnRuYW1lID0gZWxlbWVudG5hbWU7Ci0gIAl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgCXRoaXMucGFyZW50bmFtZSA9IHBhcmVudG5hbWU7Ci0gIAl0aGlzLnR5cGUgPSB0eXBlOwotICB9Ci0KLSAgcHVibGljIE1lc3NhZ2VBbmFseXplcihTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB3c2RsZmlsZSwgU3RyaW5nIGVsZW1lbnRuYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgcGFyZW50bmFtZSwgU3RyaW5nIHR5cGUsIFdTSVByZWZlcmVuY2VzIHdzaVByZWZlcmVuY2VzKQotICB7Ci0gIAl0aGlzKGZpbGVuYW1lLCB3c2lQcmVmZXJlbmNlcyk7Ci0gIAl3c2Rsc3BlY2lmaWVkID0gdHJ1ZTsKLSAgCQotICAJdGhpcy53c2RsZmlsZSA9IHdzZGxmaWxlOwotICAJdGhpcy5lbGVtZW50bmFtZSA9IGVsZW1lbnRuYW1lOwotICAJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gIAl0aGlzLnBhcmVudG5hbWUgPSBwYXJlbnRuYW1lOwotICAJdGhpcy50eXBlID0gdHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgdmFsaWRhdGVDb25mb3JtYW5jZS4KLSAgICogCi0gICAqIENoZWNrcyB0aGUgY29uZm9ybWFuY2Ugb2YgdGhlIGdpdmVuIGxvZ2ZpbGUgYWdhaW5zdCB0aGUgV1MtSSBCYXNpYyBQcm9maWxlLgotICAgKiBJZiB0aGVyZSBhcmUgY29uZm9ybWFuY2UgcHJvYmxlbXMgdGhleSBjYW4gYmUgb2J0YWluZWQgZnJvbSBnZXRBc3NlcnRpb25FcnJvcnMuCi0gICAqIAotICAgKiBAdGhyb3dzIFdTSUFuYWx5emVyRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUNvbmZvcm1hbmNlKCkgdGhyb3dzIFdTSUFuYWx5emVyRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0JICBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLnNldExvY2FsKCk7Ci0JICAKLQkgIGlmICh3c2lQcmVmZXJlbmNlcy5nZXRDb21wbGlhbmNlTGV2ZWwoKSAhPSBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLklHTk9SRV9OT05fV1NJKQotCSAgewotICAgICAgICBEb2N1bWVudEZhY3RvcnkgZG9jdW1lbnRGYWN0b3J5ID0gRG9jdW1lbnRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEJhc2ljUHJvZmlsZUFuYWx5emVyIHVzaW5nIGFuIGFuYWx5emVyY29uZmlnIG9iamVjdAotICAgICAgICBBbmFseXplckNvbmZpZyBhbmFseXplcmNvbmZpZyA9IGRvY3VtZW50RmFjdG9yeS5uZXdBbmFseXplckNvbmZpZygpOwotICAgICAgICBpZih3c2Rsc3BlY2lmaWVkKQotICAgICAgICB7Ci0gICAgICAJICBXU0RMUmVmZXJlbmNlIHdzZGxyZWYgPSBuZXcgV1NETFJlZmVyZW5jZUltcGwoKTsKLSAgICAgIAkgIHdzZGxyZWYuc2V0V1NETExvY2F0aW9uKHdzZGxmaWxlKTsKLSAgICAgIAkKLSAgICAgIAkgIFdTRExFbGVtZW50IHdzZGxlbGVtID0gbmV3IFdTRExFbGVtZW50SW1wbCgpOwotICAgICAgCSAgd3NkbGVsZW0uc2V0TmFtZShlbGVtZW50bmFtZSk7Ci0gICAgICAJICB3c2RsZWxlbS5zZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgIAkgIHdzZGxlbGVtLnNldFBhcmVudEVsZW1lbnROYW1lKHBhcmVudG5hbWUpOwotICAgICAgCSAgd3NkbGVsZW0uc2V0VHlwZSh0eXBlKTsKLSAgICAgIAkKLSAgICAgIAkgIHdzZGxyZWYuc2V0V1NETEVsZW1lbnQod3NkbGVsZW0pOwotICAgICAgCQotICAgICAgCSAgYW5hbHl6ZXJjb25maWcuc2V0V1NETFJlZmVyZW5jZSh3c2RscmVmKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFzc2VydGlvblJlc3VsdHNPcHRpb24gYXJvID0gbmV3IEFzc2VydGlvblJlc3VsdHNPcHRpb25JbXBsKCk7Ci0gICAgICAgIGFyby5zZXRBc3NlcnRpb25SZXN1bHRUeXBlKEFzc2VydGlvblJlc3VsdFR5cGUubmV3SW5zdGFuY2UoTk9UUEFTU0VEKSk7Ci0gICAgICAgIGFyby5zZXRTaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24oZmFsc2UpOwotICAgICAgICBhcm8uc2V0U2hvd0ZhaWx1cmVEZXRhaWwoZmFsc2UpOwotICAgICAgICBhcm8uc2V0U2hvd0ZhaWx1cmVNZXNzYWdlKGZhbHNlKTsKLSAgICAgICAgYXJvLnNldFNob3dNZXNzYWdlRW50cnkoZmFsc2UpOwotCi0gICAgICAgIC8vIGFsdGhvdWdoIHdlIGRvbid0IHVzZSBhIHN0eWxlc2hlZXQgZm9yIG91ciBhcHBsaWNhdGlvbiBpdCBpcyByZXF1aXJlZCBvciB0aGUgCi0gICAgICAgIC8vIFdTLUkgdG9vbHMgd2lsbCBmYWlsCi0gICAgICAgIEFkZFN0eWxlU2hlZXQgYWRkc3R5bGVzaGVldCA9IG5ldyBBZGRTdHlsZVNoZWV0SW1wbCgpOwotCi0gICAgICAgIGFuYWx5emVyY29uZmlnLnNldEFzc2VydGlvblJlc3VsdHNPcHRpb24oYXJvKTsKLSAgICAgICAgYW5hbHl6ZXJjb25maWcuc2V0QWRkU3R5bGVTaGVldChhZGRzdHlsZXNoZWV0KTsKLSAgICAgIAotICAgICAgICBhbmFseXplcmNvbmZpZy5zZXRDb3JyZWxhdGlvblR5cGUoImVuZHBvaW50Iik7Ci0gIAkgICAgdHJ5Ci0JCXsKLQkJICBhbmFseXplcmNvbmZpZy5zZXRMb2dMb2NhdGlvbihVUklFbmNvZGVyLmVuY29kZShmaWxlbmFtZSwgIlVURjgiKSk7Ci0JCSAgYW5hbHl6ZXJjb25maWcuc2V0VGVzdEFzc2VydGlvbnNEb2N1bWVudExvY2F0aW9uKAotCQkJICAgVVJJRW5jb2Rlci5lbmNvZGUod3NpUHJlZmVyZW5jZXMuZ2V0VEFERmlsZSgpLCAiVVRGOCIpKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpCi0JCXsKLQkJICBhbmFseXplcmNvbmZpZy5zZXRMb2dMb2NhdGlvbihVUklFbmNvZGVyLmVuY29kZShmaWxlbmFtZSkpOwotCSAgICAgIGFuYWx5emVyY29uZmlnLnNldFRlc3RBc3NlcnRpb25zRG9jdW1lbnRMb2NhdGlvbihVUklFbmNvZGVyLmVuY29kZSh3c2lQcmVmZXJlbmNlcy5nZXRUQURGaWxlKCkpKTsKLQkJfQotICAgICAgICAvL2FuYWx5emVyY29uZmlnLnNldExvZ0xvY2F0aW9uKGZpbGVuYW1lKTsKLSAgICAgICAgLy9hbmFseXplcmNvbmZpZy5zZXRUZXN0QXNzZXJ0aW9uc0RvY3VtZW50TG9jYXRpb24oZ2V0QmFzaWNQcm9maWxlVGVzdEFzc2VydGlvbnNGaWxlKCkpOwotICAgICAgICBhbmFseXplcmNvbmZpZy5zZXRWZXJib3NlT3B0aW9uKGZhbHNlKTsKLSAgICAgIAotCi0gICAgICAgIExpc3QgYW5hbHl6ZXJDb25maWdzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBhbmFseXplckNvbmZpZ3MuYWRkKGFuYWx5emVyY29uZmlnKTsKLSAgICAgICAgLy8gaGVyZSdzIHdoZXJlIHRoZSB2YWxpZGF0aW9uIGFjdHVhbGx5IHN0YXJ0cyBoYXBwZW5pbmcKLSAgICAgICAgV1NJQmFzaWNQcm9maWxlQW5hbHl6ZXIgYnBhbmFseXplciA9IG5ldyBXU0lCYXNpY1Byb2ZpbGVBbmFseXplcihhbmFseXplckNvbmZpZ3MpOwotCi0gICAgICAgIGJwYW5hbHl6ZXIudmFsaWRhdGVBbGwoKTsKLSAgICAgICAgUmVwb3J0SW1wbCByZXBvcnQgPSAoUmVwb3J0SW1wbCkgYnBhbmFseXplci5nZXRSZXBvcnQoKTsKLQotICAgICAgICBMaXN0IGVudHJpZXMgPSByZXBvcnQuZ2V0RW50cmllcygpOwotCi0gICAgICAgIC8vIGlmIHRoZXJlIGFyZSByZXBvcnQgZW50cmllcyB3ZSBpdGVyYXRlIHRocm91Z2ggdGhlbSBhbmQgYWRkIGFsbAotICAgICAgICAvLyBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyB0byB0aGUgZXJyb3IgbGlzdC4KLSAgICAgICAgaWYgKGVudHJpZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIGllbnRyeSA9IGVudHJpZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAoaWVudHJ5Lmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSkgaWVudHJ5Lm5leHQoKTsKLSAgICAgICAgICAgIE1hcCBhc3NlcnRpb25SZXN1bHRzID0gZW50cnkuZ2V0QXNzZXJ0aW9uUmVzdWx0TGlzdCgpOwotCi0gICAgICAgICAgICBpZiAoYXNzZXJ0aW9uUmVzdWx0cyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJdGVyYXRvciBpYXNzZXJ0aW9uUmVzdWx0cyA9IGFzc2VydGlvblJlc3VsdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICB3aGlsZSAoaWFzc2VydGlvblJlc3VsdHMuaGFzTmV4dCgpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGFyID0gKEFzc2VydGlvblJlc3VsdCkgaWFzc2VydGlvblJlc3VsdHMubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGFyLmdldFJlc3VsdCgpLmVxdWFsc0lnbm9yZUNhc2UoRkFJTEVEKSAmJiAKLSAgICAgICAgICAgICAgICAJd3NpUHJlZmVyZW5jZXMuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZXF1YWxzKFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuU1RPUF9OT05fV1NJKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBUZXN0QXNzZXJ0aW9uIHRhID0gYXIuZ2V0QXNzZXJ0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICBpZiAodGEuaXNFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGVycm9yTWVzc2FnZXMgPSBhci5nZXRGYWlsdXJlRGV0YWlsTGlzdCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9ICIiOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZXJyb3JNZXNzYWdlcy5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlRGV0YWlsSW1wbCBmZGkgPSAoRmFpbHVyZURldGFpbEltcGwpZXJyb3JNZXNzYWdlcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAoU3RyaW5nKSBmZGkuZ2V0RmFpbHVyZU1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uTnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgRWxlbWVudExvY2F0aW9uIGVsID0gZmRpLmdldEVsZW1lbnRMb2NhdGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlciA9IGVsLmdldExpbmVOdW1iZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlciA9IGVsLmdldENvbHVtbk51bWJlcigpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogZ2V0IGFzc2VydGlvbiBsb2NhdGlvbnMgaW4gdGhlIGxvZyBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0aW9uZXJyb3JzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBc3NlcnRpb25FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiV1MtSSBNZXNzYWdlIElEICIgKyBlbnRyeS5nZXRSZWZlcmVuY2VJRCgpICsgIjoiICsgdGEuZ2V0RmFpbHVyZU1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhci5nZXRSZXN1bHQoKS5lcXVhbHNJZ25vcmVDYXNlKEZBSUxFRCkgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NpUHJlZmVyZW5jZXMuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZXF1YWxzKFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuV0FSTl9OT05fV1NJKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBUZXN0QXNzZXJ0aW9uIHRhID0gYXIuZ2V0QXNzZXJ0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICBpZiAodGEuaXNFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGVycm9yTWVzc2FnZXMgPSBhci5nZXRGYWlsdXJlRGV0YWlsTGlzdCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9ICIiOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZXJyb3JNZXNzYWdlcy5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlRGV0YWlsSW1wbCBmZGkgPSAoRmFpbHVyZURldGFpbEltcGwpZXJyb3JNZXNzYWdlcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAoU3RyaW5nKSBmZGkuZ2V0RmFpbHVyZU1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uTnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgRWxlbWVudExvY2F0aW9uIGVsID0gZmRpLmdldEVsZW1lbnRMb2NhdGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlciA9IGVsLmdldExpbmVOdW1iZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlciA9IGVsLmdldENvbHVtbk51bWJlcigpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGdldCBhc3NlcnRpb24gbG9jYXRpb25zIGluIHRoZSBsb2cgZmlsZQotICAgICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbndhcm5pbmdzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBc3NlcnRpb25FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBJRCAiICsgZW50cnkuZ2V0UmVmZXJlbmNlSUQoKSArICI6IiArIHRhLmdldEZhaWx1cmVNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gCi0JICB9Ci0gICAgfQotICAgIGNhdGNoIChXU0lFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJQW5hbHl6ZXJFeGNlcHRpb24oIlRoZSBNZXNzYWdlQW5hbHl6ZXIgd2FzIHVuYWJsZSB0byB2YWxpZGF0ZSB0aGUgZ2l2ZW4gbG9nZmlsZS4iLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lBbmFseXplckV4Y2VwdGlvbigiVGhlIE1lc3NhZ2VBbmFseXplciB3YXMgdW5hYmxlIHRvIHZhbGlkYXRlIHRoZSBnaXZlbiBsb2dmaWxlLiIpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRBc3NlcnRpb25XYXJuaW5ncy4KLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgYW55IGFzc2VydGlvbiB3YXJuaW5ncyBnZW5lcmF0ZWQgZnJvbSB2YWxpZGF0ZUNvbmZvcm1hbmNlLgotICAgKiBAcmV0dXJuIExpc3QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEFzc2VydGlvbldhcm5pbmdzKCkKLSAgewotICAgIHJldHVybiBhc3NlcnRpb253YXJuaW5nczsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0QXNzZXJ0aW9uRmFpbHVyZXMuCi0gICAqIFJldHVybnMgYSBsaXN0IG9mIGFueSBhc3NlcnRpb24gZXJyb3JzIGdlbmVyYXRlZCBmcm9tIHZhbGlkYXRlQ29uZm9ybWFuY2UuCi0gICAqIEByZXR1cm4gTGlzdAotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0QXNzZXJ0aW9uRXJyb3JzKCkKLSAgewotICAgIHJldHVybiBhc3NlcnRpb25lcnJvcnM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2FuYWx5emVyL1dTRExBbmFseXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvYW5hbHl6ZXIvV1NETEFuYWx5emVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNmQ0MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvYW5hbHl6ZXIvV1NETEFuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5hbmFseXplcjsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5VUklFbmNvZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuV1NJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5XU0lUZXN0VG9vbHNQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuYW5hbHl6ZXIuV1NJQW5hbHl6ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5BbmFseXplckNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFzc2VydGlvblJlc3VsdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5Bc3NlcnRpb25SZXN1bHRzT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbC5Bc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbC5XU0RMUmVmZXJlbmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuY29tbW9uLkFkZFN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5pbXBsLkFkZFN0eWxlU2hlZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLnJlcG9ydC5Bc3NlcnRpb25FcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbC5GYWlsdXJlRGV0YWlsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGwuUmVwb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmRvbS5FbGVtZW50TG9jYXRpb247Ci0KLS8qKgotICogV1NETEFuYWx5emVyCi0gKiBUaGUgaW50ZXJmYWNlIHRvIHRoZSBXUy1JIFRlc3QgVG9vbHMgZm9yIGFuYWx5emluZyBhIFdTREwgZmlsZS4gIEFsbG93cyBhIFdTREwgZmlsZSB0byBiZSBhbmFseXplZAotICogYXQgYW55IG9mIHRoZSBmb2xsb3dpbmcgbGV2ZWxzLgotICogIHBvcnQKLSAqICBiaW5kaW5nCi0gKiAgcG9ydFR5cGUKLSAqICBvcGVyYXRpb24KLSAqICBtZXNzYWdlCi0gKi8KLQotcHVibGljIGNsYXNzIFdTRExBbmFseXplcgotewotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLndzaS50ZXN0LnRvb2xzIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlQgPSAicG9ydCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkcgPSAiYmluZGluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRUWVBFID0gInBvcnRUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUSU9OID0gIm9wZXJhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAibWVzc2FnZSI7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBOT1RQQVNTRUQgPSAibm90UGFzc2VkIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBXQVJOSU5HID0gIndhcm5pbmciOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEZBSUxFRCA9ICJmYWlsZWQiOwotICAKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBGSUxFID0gImZpbGU6Ly8iOwotCi0gIHByb3RlY3RlZCBMaXN0IGFuYWx5emVyQ29uZmlnczsKLSAgcHJvdGVjdGVkIFN0cmluZyB3c2RsVVJJOwotICAvLyBhc3NlcnRpb25zIHRvIGlnbm9yZSAtIHVzZWQgZm9yIGFzc2VydGlvbnMgdGhhdCB0aGUgdG9vbHMgaGF2ZSBub3QgaW1wbGVtZW50ZWQgcHJvcGVybHkgeWV0Ci0gIC8vcHJvdGVjdGVkIFN0cmluZ1tdIGlnbm9yZUFzc2VydGlvbnMgPSB7IC8qIldTSTIxMDUiICwgIldTSTIxMTkiKi99OwotICBwcm90ZWN0ZWQgTGlzdCBhc3NlcnRpb25lcnJvcnM7Ci0gIHByb3RlY3RlZCBMaXN0IGFzc2VydGlvbndhcm5pbmdzOwotICBwcm90ZWN0ZWQgV1NJUHJlZmVyZW5jZXMgd3NpUHJlZmVyZW5jZXMgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogR2l2ZW4gdGhlIGZpbGUgbmFtZSwgcGFyZW50IGVsZW1lbnQgbmFtZSwgdGhlIGVsZW1lbnQgdG8gYW5hbHl6ZSBhbmQgdGhlIHR5cGUgb2YgZWxlbWVudAotICAgKiBzZXRzIHVwIHRoZSBXU0RMQW5hbHl6ZXIgdG8gYW5hbHl6ZSB0aGUgZmlsZS4KLSAgICogQHBhcmFtIGZpbGVOYW1lIGxvZyBmaWxlIG5hbWUuCi0gICAqIEBwYXJhbSBwYXJlbnROYW1lIHBhcmVudCBlbGVtZW50IG5hbWUuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgIGEgbmFtZXNwYWNlLgotICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgdG8gYW5hbHl6ZS4KLSAgICogQHBhcmFtIGVsZW1lbnRUeXBlIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50LgotICAgKiBAcGFyYW0gd3NpUHJlZmVyZW5jZXMgdGhlIHByZWZlcmVuY2VzLgotICAgKiBAdGhyb3dzIFdTSUFuYWx5emVyRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBhZGQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHB1YmxpYyBXU0RMQW5hbHl6ZXIoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgcGFyZW50TmFtZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgZWxlbWVudFR5cGUsIFdTSVByZWZlcmVuY2VzIHdzaVByZWZlcmVuY2VzKSB0aHJvd3MgV1NJQW5hbHl6ZXJFeGNlcHRpb24KLSAgewotICAgIHRoaXMoZmlsZU5hbWUsIHdzaVByZWZlcmVuY2VzKTsKLSAgICBhZGRDb25maWd1cmF0aW9uVG9UZXN0KHBhcmVudE5hbWUsIG5hbWVzcGFjZSwgZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBHaXZlbiB0aGUgZmlsZSBuYW1lLCBwYXJlbnQgZWxlbWVudCBuYW1lLCB0aGUgZWxlbWVudCB0byBhbmFseXplIGFuZCB0aGUgdHlwZSBvZiBlbGVtZW50Ci0gICAqIHNldHMgdXAgdGhlIFdTRExBbmFseXplciB0byBhbmFseXplIHRoZSBmaWxlLgotICAgKiBAcGFyYW0gZmlsZU5hbWUgbG9nIGZpbGUgbmFtZS4KLSAgICogQHBhcmFtIHBhcmVudE5hbWUgcGFyZW50IGVsZW1lbnQgbmFtZS4KLSAgICogQHBhcmFtIG5hbWVzcGFjZSAgYSBuYW1lc3BhY2UuCi0gICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCB0byBhbmFseXplLgotICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJQW5hbHl6ZXJFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGFkZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHVibGljIFdTRExBbmFseXplcihTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBwYXJlbnROYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBlbGVtZW50VHlwZSkgdGhyb3dzIFdTSUFuYWx5emVyRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzKGZpbGVOYW1lKTsKLSAgICBhZGRDb25maWd1cmF0aW9uVG9UZXN0KHBhcmVudE5hbWUsIG5hbWVzcGFjZSwgZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gZmlsZU5hbWUgIGxvZyBmaWxlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgV1NETEFuYWx5emVyKFN0cmluZyBmaWxlTmFtZSwgV1NJUHJlZmVyZW5jZXMgd3NpUHJlZmVyZW5jZXMpCi0gIHsKLSAgICByZXNldChmaWxlTmFtZSk7Ci0gICAgdGhpcy53c2lQcmVmZXJlbmNlcyA9IHdzaVByZWZlcmVuY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gZmlsZU5hbWUgIGxvZyBmaWxlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgV1NETEFuYWx5emVyKFN0cmluZyBmaWxlTmFtZSkKLSAgewotICAgIHJlc2V0KGZpbGVOYW1lKTsKLSAgCXRoaXMud3NpUHJlZmVyZW5jZXMgPSBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLmNoZWNrV1NJUHJlZmVyZW5jZXMoZmlsZU5hbWUpOwotICB9Ci0KLSAgcHVibGljIFdTSVByZWZlcmVuY2VzIGdldFdTSVByZWZlcmVuY2VzKCkKLSAgewotCSAgcmV0dXJuIHRoaXMud3NpUHJlZmVyZW5jZXM7Ci0gIH0KLQkgIAotICAvKioKLSAgICogdmFsaWRhdGVDb25mb3JtYW5jZS4KLSAgICogVmFsaWRhdGUgdGhlIFdTREwgZmlsZSBhcyBzZXR1cCBpbiB0aGUgY29uc3RydWN0b3IuCi0gICAqIEB0aHJvd3MgV1NJQW5hbHl6ZXJFeGNlcHRpb24gaWYgdW5hYmxlIHRvIHZhbGlkYXRlIHRoZSBnaXZlbiBXU0RMIEZpbGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUNvbmZvcm1hbmNlKCkgdGhyb3dzIFdTSUFuYWx5emVyRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLnNldExvY2FsKCk7Ci0JICAKLQkgIGlmICh3c2lQcmVmZXJlbmNlcy5nZXRDb21wbGlhbmNlTGV2ZWwoKSAhPSBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLklHTk9SRV9OT05fV1NJKQotCSAgewotICAgICAgICAvLyBoZXJlJ3Mgd2hlcmUgdGhlIHZhbGlkYXRpb24gYWN0dWFsbHkgc3RhcnRzIGhhcHBlbmluZwotICAgICAgICBXU0lCYXNpY1Byb2ZpbGVBbmFseXplciBicGFuYWx5emVyID0gbmV3IFdTSUJhc2ljUHJvZmlsZUFuYWx5emVyKGFuYWx5emVyQ29uZmlncyx3c2RsVVJJKTsKLSAgICAgICAgYnBhbmFseXplci52YWxpZGF0ZUFsbCgpOwotICAgICAgICBSZXBvcnRJbXBsIHJlcG9ydCA9IChSZXBvcnRJbXBsKSBicGFuYWx5emVyLmdldFJlcG9ydCgpOwotCi0gICAgICAgIExpc3QgZW50cmllcyA9IHJlcG9ydC5nZXRFbnRyaWVzKCk7Ci0KLSAgICAgICAgLy8gaWYgdGhlcmUgYXJlIHJlcG9ydCBlbnRyaWVzIHdlIGl0ZXJhdGUgdGhyb3VnaCB0aGVtIGFuZCBhZGQgYWxsCi0gICAgICAgIC8vIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIHRvIHRoZSBlcnJvciBsaXN0LiAKLSAgICAgICAgaWYgKGVudHJpZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIGllbnRyeSA9IGVudHJpZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAoaWVudHJ5Lmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSkgaWVudHJ5Lm5leHQoKTsKLSAgICAgICAgICAgIE1hcCBhc3NlcnRpb25SZXN1bHRzID0gZW50cnkuZ2V0QXNzZXJ0aW9uUmVzdWx0TGlzdCgpOwotCi0gICAgICAgICAgICBpZiAoYXNzZXJ0aW9uUmVzdWx0cyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJdGVyYXRvciBpYXNzZXJ0aW9uUmVzdWx0cyA9IGFzc2VydGlvblJlc3VsdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICB3aGlsZSAoaWFzc2VydGlvblJlc3VsdHMuaGFzTmV4dCgpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGFyID0gKEFzc2VydGlvblJlc3VsdCkgaWFzc2VydGlvblJlc3VsdHMubmV4dCgpOwotICAgICAgICAgICAgICAgIFRlc3RBc3NlcnRpb24gdGEgPSBhci5nZXRBc3NlcnRpb24oKTsKLSAgICAgICAgICAgICAgICAvLyBhZGQgaW4gdG8gc2tpcCBlcnJvcnMgZm9yIGFzc2VydGlvbnMgdGhhdCBhcmUgcmVwb3J0aW5nIGluY29ycmVjdCBwcm9ibGVtcy4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGFsbG93cyB1cyB0byBub3QgcmVwb3J0IGluY29ycmVjdCBlcnJvcnMgcmVwb3J0ZWQgaW4gdGhlIHRvb2xzIHdpdGhvdXQgZGlzYWJsaW5nIHRoZW0KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgU3RyaW5nIGFzc2VydGlvbklkID0gdGEuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgYm9vbGVhbiBpZ25vcmVBc3NlcnRpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgZm9yKGludCBpID0gaWdub3JlQXNzZXJ0aW9ucy5sZW5ndGgtMTsgaSA+PTA7aS0tKQotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIAlpZihpZ25vcmVBc3NlcnRpb25zW2ldLmVxdWFsc0lnbm9yZUNhc2UoYXNzZXJ0aW9uSWQpKQotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAJCWlnbm9yZUFzc2VydGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgaWYoaWdub3JlQXNzZXJ0aW9uKQotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIAljb250aW51ZTsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhci5nZXRSZXN1bHQoKS5lcXVhbHNJZ25vcmVDYXNlKEZBSUxFRCkgJiYgCi0gICAgICAgICAgICAgICAgCXdzaVByZWZlcmVuY2VzLmdldENvbXBsaWFuY2VMZXZlbCgpLmVxdWFscyhXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLlNUT1BfTk9OX1dTSSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKHRhLmlzRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBMaXN0IGVycm9yTWVzc2FnZUxpc3QgPSBhci5nZXRGYWlsdXJlRGV0YWlsTGlzdCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlTGlzdCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgZXJyb3JNZXNzYWdlcyA9IGVycm9yTWVzc2FnZUxpc3QuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlcnJvck1lc3NhZ2VzLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlRGV0YWlsSW1wbCBmZGkgPSAoRmFpbHVyZURldGFpbEltcGwpIGVycm9yTWVzc2FnZXMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAoU3RyaW5nKSBmZGkuZ2V0RmFpbHVyZU1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbk51bWJlciA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRMb2NhdGlvbiBlbCA9IGZkaS5nZXRFbGVtZW50TG9jYXRpb24oKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBlbC5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlciA9IGVsLmdldENvbHVtbk51bWJlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRpb25lcnJvcnMuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXNzZXJ0aW9uRXJyb3IodGEuZ2V0SWQoKSwgdGEuZ2V0RmFpbHVyZU1lc3NhZ2UoKSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlcnJvck1lc3NhZ2VMaXN0IGlzIG51bGwgYnV0IHRoZXJlIGlzIGFuIGVycm9yIHNvIGFzc2lnbiBpdCB0byBsaW5lIDAgZm9yIG5vdwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRpb25lcnJvcnMuYWRkKG5ldyBBc3NlcnRpb25FcnJvcih0YS5nZXRJZCgpLCB0YS5nZXRGYWlsdXJlTWVzc2FnZSgpLCAwLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXIuZ2V0UmVzdWx0KCkuZXF1YWxzSWdub3JlQ2FzZShGQUlMRUQpICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgIHdzaVByZWZlcmVuY2VzLmdldENvbXBsaWFuY2VMZXZlbCgpLmVxdWFscyhXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLldBUk5fTk9OX1dTSSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKHRhLmlzRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBMaXN0IGVycm9yTWVzc2FnZUxpc3QgPSBhci5nZXRGYWlsdXJlRGV0YWlsTGlzdCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlTGlzdCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgZXJyb3JNZXNzYWdlcyA9IGVycm9yTWVzc2FnZUxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZXJyb3JNZXNzYWdlcy5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRmFpbHVyZURldGFpbEltcGwgZmRpID0gKEZhaWx1cmVEZXRhaWxJbXBsKSBlcnJvck1lc3NhZ2VzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gKFN0cmluZykgZmRpLmdldEZhaWx1cmVNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW5OdW1iZXIgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50TG9jYXRpb24gZWwgPSBmZGkuZ2V0RWxlbWVudExvY2F0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gZWwuZ2V0TGluZU51bWJlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXIgPSBlbC5nZXRDb2x1bW5OdW1iZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbndhcm5pbmdzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFzc2VydGlvbkVycm9yKHRhLmdldElkKCksIHRhLmdldEZhaWx1cmVNZXNzYWdlKCksIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlcikpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXJyb3JNZXNzYWdlTGlzdCBpcyBudWxsIGJ1dCB0aGVyZSBpcyBhbiBlcnJvciBzbyBhc3NpZ24gaXQgdG8gbGluZSAwIGZvciBub3cKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0aW9ud2FybmluZ3MuYWRkKG5ldyBBc3NlcnRpb25FcnJvcih0YS5nZXRJZCgpLCB0YS5nZXRGYWlsdXJlTWVzc2FnZSgpLCAwLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQkgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUFuYWx5emVyRXhjZXB0aW9uKGUgKyAiVGhlIFdTRExBbmFseXplciB3YXMgdW5hYmxlIHRvIHZhbGlkYXRlIHRoZSBnaXZlbiBXU0RMIEZpbGUuIik7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogQWRkIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gICAqIEBwYXJhbSBwYXJlbnROYW1lIHBhcmVudCBlbGVtZW50IG5hbWUuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgIGEgbmFtZXNwYWNlLgotICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgdG8gYW5hbHl6ZS4KLSAgICogQHBhcmFtIGVsZW1lbnRUeXBlIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTSUFuYWx5emVyRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBhZGQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyYXRpb25Ub1Rlc3QoCi0gICAgU3RyaW5nIHBhcmVudE5hbWUsCi0gICAgU3RyaW5nIG5hbWVzcGFjZSwKLSAgICBTdHJpbmcgZWxlbWVudE5hbWUsCi0gICAgU3RyaW5nIGVsZW1lbnRUeXBlKSB0aHJvd3MgV1NJQW5hbHl6ZXJFeGNlcHRpb24KLSAgewotICAJdHJ5Ci0gIAl7Ci0gICAgICBXU0RMUmVmZXJlbmNlIHdzZGxSZWZlcmVuY2UgPSBuZXcgV1NETFJlZmVyZW5jZUltcGwoKTsKLQotICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIG5ldyBXU0RMRWxlbWVudEltcGwoKTsKLSAgICAgIHdzZGxFbGVtZW50LnNldFR5cGUoZWxlbWVudFR5cGUpOwotICAgICAgaWYgKHBhcmVudE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd3NkbEVsZW1lbnQuc2V0UGFyZW50RWxlbWVudE5hbWUocGFyZW50TmFtZSk7Ci0gICAgICB9Ci0gICAgICB3c2RsRWxlbWVudC5zZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgIHdzZGxFbGVtZW50LnNldE5hbWUoZWxlbWVudE5hbWUpOwotICAgICAgd3NkbFJlZmVyZW5jZS5zZXRXU0RMRWxlbWVudCh3c2RsRWxlbWVudCk7Ci0KLSAgICAgIHdzZGxSZWZlcmVuY2Uuc2V0V1NETExvY2F0aW9uKEZJTEUgKyB3c2RsVVJJKTsKLSAgICAgIERvY3VtZW50RmFjdG9yeSBkb2N1bWVudEZhY3RvcnkgPSBEb2N1bWVudEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIC8vIEluaXRpYWxpemUgdGhlIEJhc2ljUHJvZmlsZUFuYWx5emVyIHVzaW5nIGFuIGFuYWx5emVyY29uZmlnIG9iamVjdAotICAgICAgQW5hbHl6ZXJDb25maWcgYW5hbHl6ZXJjb25maWcgPSBkb2N1bWVudEZhY3RvcnkubmV3QW5hbHl6ZXJDb25maWcoKTsKLQotICAgICAgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBhcm8gPSBuZXcgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbkltcGwoKTsKLSAgICAgIGFyby5zZXRBc3NlcnRpb25SZXN1bHRUeXBlKEFzc2VydGlvblJlc3VsdFR5cGUubmV3SW5zdGFuY2UoTk9UUEFTU0VEKSk7Ci0gICAgICBhcm8uc2V0U2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uKGZhbHNlKTsKLSAgICAgIGFyby5zZXRTaG93RmFpbHVyZURldGFpbChmYWxzZSk7Ci0gICAgICBhcm8uc2V0U2hvd0ZhaWx1cmVNZXNzYWdlKGZhbHNlKTsKLSAgICAgIGFyby5zZXRTaG93TWVzc2FnZUVudHJ5KGZhbHNlKTsKLQotICAgICAgLy8gYWx0aG91Z2ggd2UgZG9uJ3QgdXNlIGEgc3R5bGVzaGVldCBmb3Igb3VyIGFwcGxpY2F0aW9uIGl0IGlzIHJlcXVpcmVkIG9yIHRoZSAKLSAgICAgIC8vIFdTLUkgdG9vbHMgd2lsbCBmYWlsCi0gICAgICBBZGRTdHlsZVNoZWV0IGFkZHN0eWxlc2hlZXQgPSBuZXcgQWRkU3R5bGVTaGVldEltcGwoKTsKLQotICAgICAgYW5hbHl6ZXJjb25maWcuc2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbihhcm8pOwotICAgICAgYW5hbHl6ZXJjb25maWcuc2V0QWRkU3R5bGVTaGVldChhZGRzdHlsZXNoZWV0KTsKLSAgICAgIGFuYWx5emVyY29uZmlnLnNldFJlcGxhY2VSZXBvcnQodHJ1ZSk7Ci0gICAgICAvL2FuYWx5emVyY29uZmlnLnNldExvZ0xvY2F0aW9uKGZpbGVuYW1lKTsKLQkgIHRyeQotCSB7Ci0JICAgYW5hbHl6ZXJjb25maWcuc2V0VGVzdEFzc2VydGlvbnNEb2N1bWVudExvY2F0aW9uKAotCQkgVVJJRW5jb2Rlci5lbmNvZGUod3NpUHJlZmVyZW5jZXMuZ2V0VEFERmlsZSgpLCAiVVRGOCIpKTsKLQkgfQotCSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpCi0JIHsKLQkgICBhbmFseXplcmNvbmZpZy5zZXRUZXN0QXNzZXJ0aW9uc0RvY3VtZW50TG9jYXRpb24oVVJJRW5jb2Rlci5lbmNvZGUod3NpUHJlZmVyZW5jZXMuZ2V0VEFERmlsZSgpKSk7Ci0KLQkgfQotICAgICAgYW5hbHl6ZXJjb25maWcuc2V0VmVyYm9zZU9wdGlvbihmYWxzZSk7Ci0KLSAgICAgIC8vIHNldCB0aGUgd3NkbFJlZmVyZW5jZQotICAgICAgYW5hbHl6ZXJjb25maWcuc2V0V1NETFJlZmVyZW5jZSh3c2RsUmVmZXJlbmNlKTsKLSAgICAgIGFuYWx5emVyQ29uZmlncy5hZGQoYW5hbHl6ZXJjb25maWcpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUFuYWx5emVyRXhjZXB0aW9uKCJVbmFibGUgdG8gYWRkIEFuYWx5emVyQ29uZmlnIHRvIGxpc3QuICIgKyBlKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRBc3NlcnRpb25GYWlsdXJlcy4KLSAgICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgYXNzZXJ0aW9uIGZhaWx1cmVzLgotICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgYXNzZXJ0aW9uIGZhaWx1cmVzLgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0QXNzZXJ0aW9uRXJyb3JzKCkKLSAgewotICAgIHJldHVybiBhc3NlcnRpb25lcnJvcnM7Ci0gIH0KLQotICAvKioKLSAgCSAqIE1ldGhvZCBnZXRBc3NlcnRpb25XYXJuaW5ncy4KLSAgCSAqIFJldHVybnMgYSBsaXN0IG9mIGFueSBhc3NlcnRpb24gd2FybmluZ3MgZ2VuZXJhdGVkIGZyb20gdmFsaWRhdGVDb25mb3JtYW5jZS4KLSAgCSAqIEByZXR1cm4gYSBsaXN0IG9mIGFueSBhc3NlcnRpb24gd2FybmluZ3MgZ2VuZXJhdGVkIGZyb20gdmFsaWRhdGVDb25mb3JtYW5jZS4KLSAgCSAqLwotICBwdWJsaWMgTGlzdCBnZXRBc3NlcnRpb25XYXJuaW5ncygpCi0gIHsKLSAgICByZXR1cm4gYXNzZXJ0aW9ud2FybmluZ3M7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXNldC4KLSAgICogQHBhcmFtIGZpbGVuYW1lIGxvZyBmaWxlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLQl0cnkKLQl7Ci0JICB3c2RsVVJJID0gVVJJRW5jb2Rlci5lbmNvZGUoZmlsZW5hbWUsICJVVEY4Iik7Ci0JfQotCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkKLQl7Ci0JICB3c2RsVVJJID0gVVJJRW5jb2Rlci5lbmNvZGUoZmlsZW5hbWUpOwotCX0KLSAgCWFuYWx5emVyQ29uZmlncyA9IG5ldyBWZWN0b3IoKTsKLSAgCWFzc2VydGlvbmVycm9ycyA9IG5ldyBWZWN0b3IoKTsKLSAgCWFzc2VydGlvbndhcm5pbmdzID0gbmV3IFZlY3RvcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9hbmFseXplci9XU0lBbmFseXplckV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvYW5hbHl6ZXIvV1NJQW5hbHl6ZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3Nzg1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9hbmFseXplci9XU0lBbmFseXplckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5hbmFseXplcjsKLQotLyoqCi0gKiBBbmFseXplckV4Y2VwdGlvbgotICogCi0gKiBFeGNlcHRpb24gdG8gYmUgdGhyb3duIGlmIGFuIGFuYWx5emVyIGZhaWxzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0lBbmFseXplckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM4MzUxNTgzNTAyMTkxOTQ2NzdMOwotCS8qKgotICAgKiBUaHJvd2FibGUuCi0gICAqLwotICBwcm90ZWN0ZWQgVGhyb3dhYmxlIHRocm93YWJsZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBBbmFseXplckV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBXU0lBbmFseXplckV4Y2VwdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBBbmFseXplckV4Y2VwdGlvbi4KLSAgICogQHBhcmFtIHMgZGV0YWlsIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgV1NJQW5hbHl6ZXJFeGNlcHRpb24oU3RyaW5nIHMpCi0gIHsKLSAgICBzdXBlcihzKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gZXhjZXB0aW9uIHdpdGggYSBtZXNzYWdlIGFuZCByZWxhdGVkIGV4Y2VwdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBtc2cgICAgICAgIHRoZSBleGNlcHRpb24gbWVzc2FnZQotICAgKiBAcGFyYW0gdGhyb3dhYmxlICB0aHJvd2FibGUgdGhhdCBpcyByZWxhdGVkIHRvIHRoaXMgZXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgV1NJQW5hbHl6ZXJFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRocm93YWJsZSkKLSAgewotICAgIC8vIEV4Y2VwdGlvbgotICAgIHN1cGVyKG1zZyk7Ci0KLSAgICAvLyBTYXZlIGlucHV0IHJlZmVyZW5jZQotICAgIHRoaXMudGhyb3dhYmxlID0gdGhyb3dhYmxlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdCdzIHZhbHVlcy4KLSAgICoKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXRhaWwgbWVzc2FnZSBvZiB0aGlzIHRocm93YWJsZSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24gdG8gYmUgY3JlYXRlZC4KLSAgICogCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZW5jYXBzdWxhdGVkIHRocm93YWJsZSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgVGhyb3dhYmxlIGdldFRhcmdldEV4Y2VwdGlvbigpCi0gIHsKLSAgICAvLyBSZXR1cm4gdGhyb3dhYmxlCi0gICAgcmV0dXJuIHRocm93YWJsZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9hbmFseXplci9XU0lCYXNpY1Byb2ZpbGVBbmFseXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvYW5hbHl6ZXIvV1NJQmFzaWNQcm9maWxlQW5hbHl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0MDc0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9hbmFseXplci9XU0lCYXNpY1Byb2ZpbGVBbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5hbmFseXplcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLlRvb2xJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkJhc2ljUHJvZmlsZUFuYWx5emVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuUHJvZmlsZVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZUxpc3Q7Ci0KLS8qKgotICogV1NJQmFzaWNQcm9maWxlQW5hbHl6ZXIKLSAqIAotICogQW4gZXh0ZW5zaW9uIG9mIHRoZSBCYXNpY1Byb2ZpbGVBbmFseXplciBmcm9tIHRoZSBXUy1JIFRlc3QgVG9vbHMgdGhhdAotICogYWxsb3dzIGNhbGxpbmcgY29kZSB0byBnZXQgdGhlIHJlcG9ydCBnZW5lcmF0ZWQgZnJvbSBXUy1JIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0lCYXNpY1Byb2ZpbGVBbmFseXplciBleHRlbmRzIEJhc2ljUHJvZmlsZUFuYWx5emVyCi17Ci0gIC8qKgotICAgKiBEZWZhdWx0IGRvY3VtZW50IGZhY3RvcnkgY2xhc3MgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9ET0NVTUVOVF9GQUNUT1JZID0gIm9yZy5lY2xpcHNlLndzaS50ZXN0LnRvb2xzLnV0aWwuZG9jdW1lbnQuRG9jdW1lbnRGYWN0b3J5SW1wbCI7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBXU0lCYXNpY1Byb2ZpbGVBbmFseXplci4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29uZmlnIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gICAqIEBwYXJhbSB3c2RsVVJJIHRoZSBsb2NhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGNyZWF0ZSBhIEJhc2ljIHByb2ZpbGUgYW5hbHl6ZXIuCi0gICAqLwotICBwdWJsaWMgV1NJQmFzaWNQcm9maWxlQW5hbHl6ZXIoTGlzdCBhbmFseXplckNvbmZpZywgU3RyaW5nIHdzZGxVUkkpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKGFuYWx5emVyQ29uZmlnLCB3c2RsVVJJKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgV1NJQmFzaWNQcm9maWxlQW5hbHl6ZXIuCi0gICAqIEBwYXJhbSBhbmFseXplckNvbmZpZyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gY3JlYXRlIGEgQmFzaWMgcHJvZmlsZSBhbmFseXplci4KLSAgICovCi0gIHB1YmxpYyBXU0lCYXNpY1Byb2ZpbGVBbmFseXplcihMaXN0IGFuYWx5emVyQ29uZmlnKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlcihhbmFseXplckNvbmZpZyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tbW9uIGluaXRpYWxpemF0aW9uLgotICAgKiBAcGFyYW0gdG9vbEluZm8gYSBUb29sSW5mbyBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIGR1cmluZyBpbml0aWFsaXphdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGluaXQoVG9vbEluZm8gdG9vbEluZm8pIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRoaXMudG9vbEluZm8gPSB0b29sSW5mbzsKLSAgICAKLSAgICAvLyBDcmVhdGUgbWVzc2FnZSBsaXN0Ci0gICAgbWVzc2FnZUxpc3QgPSBuZXcgTWVzc2FnZUxpc3QoUkVTT1VSQ0VfQlVORExFX05BTUUpOwotCi0gICAgLy8gQ3JlYXRlIHByb2ZpbGUgdmFsaWRhdG9yIGZhY3RvcnkKLSAgICBmYWN0b3J5ID0gUHJvZmlsZVZhbGlkYXRvckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIC8vIENyZWF0ZSBkb2N1bWVudCBmYWN0b3J5Ci0gICAgZG9jdW1lbnRGYWN0b3J5ID0gbmV3IERvY3VtZW50RmFjdG9yeUltcGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0UmVwb3J0LgotICAgKiAKLSAgICogUmV0dXJuIHRoZSBSZXBvcnQgZ2VuZXJhdGVkIGJ5IHRoZSB2YWxpZGF0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBSZXBvcnQgZ2VuZXJhdGVkIGJ5IHRoZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIFJlcG9ydCBnZXRSZXBvcnQoKQotICB7Ci0gICAgcmV0dXJuIHJlcG9ydGVyLmdldFJlcG9ydCgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5ZWFmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmRvY3VtZW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGwuUmVwb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLnJlcG9ydC5SZXBvcnROb1dyaXRlckltcGw7Ci0KLS8qKgotICogRG9jdW1lbnRGYWN0b3J5SW1wbAotICogCi0gKiBFeHRlbmRzIHRoZSBXUy1JIFRlc3QgVG9vbHMgZG9jdW1lbnQgZmFjdG9yeSB0byBzcGVjaWZ5IHNwZWNpZmljIFJlcG9ydAotICogYW5kIFJlcG9ydFdyaXRlciBjbGFzc2VzIG5lZWRlZCBmb3IgaW5jbHVzaW9uIG9mIHRoZSB0b29scyBpbiBXU0FELgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRGYWN0b3J5SW1wbCBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5pbXBsLkRvY3VtZW50RmFjdG9yeUltcGwKLXsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIERvY3VtZW50RmFjdG9yeUltcGwuCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnRGYWN0b3J5SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIERvY3VtZW50V3JpdGVyLgotICAgKi8KLSAgcHVibGljIFJlcG9ydFdyaXRlciBuZXdSZXBvcnRXcml0ZXIoKQotICB7Ci0gICAgLy8gUmV0dXJuIGltcGxlbWVudGF0aW9uCi0gICAgcmV0dXJuIG5ldyBSZXBvcnROb1dyaXRlckltcGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgcmVwb3J0LgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgcmVwb3J0LgotICAgKi8KLSAgcHVibGljIFJlcG9ydCBuZXdSZXBvcnQoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBSZXBvcnRJbXBsKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvcmVwb3J0L0Fzc2VydGlvbkVycm9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9yZXBvcnQvQXNzZXJ0aW9uRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UwZWM4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9yZXBvcnQvQXNzZXJ0aW9uRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIHBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5yZXBvcnQ7Ci0KLS8qKgotICogQXNzZXJ0aW9uRXJyb3IKLSAqIAotICogT2JqZWN0IHRvIGhvbGQgYW4gYXNzZXJ0aW9uIGVycm9yIGdlbmVyYXRlZCBieSB0aGUgV1MtSSBUZXN0IFRvb2xzLgotICogUHJvdmlkZXMgYWNjZXNzIHRvIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIGluY2x1ZGluZyB0aGUKLSAqIGlkLCBtZXNzYWdlIGFuZCBsb2NhdGlvbiBpbiB0aGUgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIEFzc2VydGlvbkVycm9yCi17Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGFzc2VydGlvbmlkOwotICBwcm90ZWN0ZWQgaW50IGNvbHVtbjsKLSAgcHJvdGVjdGVkIGludCBsaW5lOwotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFzc2VydGlvbkVycm9yLgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvbkVycm9yKCkKLSAgewotICAgIG1lc3NhZ2UgPSBhc3NlcnRpb25pZCA9ICIiOwotICAgIGxpbmUgPSBjb2x1bW4gPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBBc3NlcnRpb25FcnJvci4KLSAgICogQHBhcmFtIGlkIGFzc2VydGlvbiBpZC4KLSAgICogQHBhcmFtIG1lc3NhZ2UgYSBlcnJvciBtZXNzYWdlLgotICAgKiBAcGFyYW0gbGluZSBhIGxpbmUgbnVtYmVyLgotICAgKiBAcGFyYW0gY29sdW1uIGEgY29sdW1uIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25FcnJvcihTdHJpbmcgaWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbikKLSAgewotICAgIHRoaXMuYXNzZXJ0aW9uaWQgPSBpZDsKLSAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIHRoaXMubGluZSA9IGxpbmU7Ci0gICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHNldEFzc2VydGlvbklELgotICAgKiBAcGFyYW0gaWQgYXNzZXJ0aW9uIGlkLgotICAgKiBAc2VlICNnZXRBc3NlcnRpb25JRAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXNzZXJ0aW9uSUQoU3RyaW5nIGlkKQotICB7Ci0gICAgYXNzZXJ0aW9uaWQgPSBpZDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0QXNzZXJ0aW9uSUQuCi0gICAqIEByZXR1cm4gYXNzZXJpb24gaWQuCi0gICAqIEBzZWUgI3NldEFzc2VydGlvbklECi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFzc2VydGlvbklEKCkKLSAgewotICAgIHJldHVybiBhc3NlcnRpb25pZDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2Qgc2V0RXJyb3JNZXNzYWdlLgotICAgKiBAcGFyYW0gbWVzc2FnZSBhIGVycm9yIG1lc3NhZ2UuCi0gICAqIEBzZWUgI2dldEVycm9yTWVzc2FnZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0RXJyb3JNZXNzYWdlLgotICAgKiBAcmV0dXJuIGVycm9yIG1lc3NhZ2UuCi0gICAqIEBzZWUgI3NldEVycm9yTWVzc2FnZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHNldExpbmUuCi0gICAqIEBwYXJhbSBsaW5lIGxpbmUgbnVtYmVyLgotICAgKiBAc2VlICNnZXRMaW5lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMaW5lKGludCBsaW5lKQotICB7Ci0gICAgdGhpcy5saW5lID0gbGluZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0TGluZS4KLSAgICogQHJldHVybiBsaW5lIG51bWJlci4KLSAgICogQHNlZSAjc2V0TGluZQotICAgKi8KLSAgcHVibGljIGludCBnZXRMaW5lKCkKLSAgewotICAgIHJldHVybiBsaW5lOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBzZXRDb2x1bW4uCi0gICAqIEBwYXJhbSBjb2x1bW4gY29sdW1uIG51bWJlci4KLSAgICogQHNlZSAjZ2V0Q29sdW1uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb2x1bW4oaW50IGNvbHVtbikKLSAgewotICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRDb2x1bW4uCi0gICAqIEByZXR1cm4gY29sdW1uIG51bWJlci4KLSAgICogQHNlZSAjc2V0Q29sdW1uCi0gICAqLwotICBwdWJsaWMgaW50IGdldENvbHVtbigpCi0gIHsKLSAgICByZXR1cm4gY29sdW1uOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL3JlcG9ydC9SZXBvcnROb1dyaXRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL3JlcG9ydC9SZXBvcnROb1dyaXRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzNzI1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9yZXBvcnQvUmVwb3J0Tm9Xcml0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLnJlcG9ydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIFdTLUkgY29uZm9ybWFuY2UgdGVzdCBSZXBvcnRXcml0ZXIgZm9yIHdzaSBwbHVnaW4uCi0gKiBUaGlzIFJlcG9ydFdyaXRlciB3cml0ZXMgbm90aGluZyBzbyBubyByZXBvcnQgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnROb1dyaXRlckltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydFdyaXRlcgotewotCi0gIC8qKgotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjT2JqZWN0KCkKLSAgICovCi0gIHB1YmxpYyBSZXBvcnROb1dyaXRlckltcGwoKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50V3JpdGVyI2dldERvY3VtZW50KCkKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50V3JpdGVyI3NldFdyaXRlcihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXcml0ZXIoU3RyaW5nIGRvY3VtZW50TG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50V3JpdGVyI3dyaXRlKFJlYWRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlKFJlYWRlciByZWFkZXIpIHRocm93cyBXU0lFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50V3JpdGVyI3dyaXRlKFJlYWRlciwgV3JpdGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoUmVhZGVyIHJlYWRlciwgV3JpdGVyIHdyaXRlcikgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRXcml0ZXIjd3JpdGUoUmVwb3J0KQotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoUmVwb3J0IHJlcG9ydCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRXcml0ZXIjd3JpdGUoUmVwb3J0LCBXcml0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZShSZXBvcnQgcmVwb3J0LCBXcml0ZXIgd3JpdGVyKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50V3JpdGVyI2Nsb3NlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvdmFsaWRhdGUvd3NkbC9XU0RMVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC92YWxpZGF0ZS93c2RsL1dTRExWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ2NjIyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC92YWxpZGF0ZS93c2RsL1dTRExWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLnZhbGlkYXRlLndzZGw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklXU0RMVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbkluZm9JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZXhjZXB0aW9uLlZhbGlkYXRlV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLldTREwxMVZhbGlkYXRpb25JbmZvSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuV1NETFJlYWRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5XU0lQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLldTSVRlc3RUb29sc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLldTSVRlc3RUb29sc1Byb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5hbmFseXplci5XU0RMQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5hbmFseXplci5XU0lBbmFseXplckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLnJlcG9ydC5Bc3NlcnRpb25FcnJvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBUaGUgV1NJIHZhbGlkYXRvciBwbHVncyBpbnRvIHRoZSBXU0RMIHZhbGlkYXRvciB0byBwcm92aWRlCi0gKiB2YWxpZGF0aW9uIGZvciBhIFdTREwgZG9jdW1lbnQgd2l0aCByZXNwZWN0IHRvIHRoZSBXUy1JIEJhc2ljIFByb2ZpbGUgKGN1cnJlbnRseSAxLjApLgotICogVGhpcyBjbGFzcyBhY3RzIGFzIGFuIGJyaWRnZSBiZXR3ZWVuIHRoZSBXUy1JIHRvb2xzIGFuZCB0aGUgV1NETCBWYWxpZGF0b3IuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsIChsbWFuZGVsQGNhLmlibS5jb20pCi0gKiBAYXV0aG9yIFdhamloYSBSZWhtYW4KLSAqLwotcHVibGljIGNsYXNzIFdTRExWYWxpZGF0b3IgaW1wbGVtZW50cyBJV1NETFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFdTSV9QUkVGSVggPSAiV1MtSTogIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVhDX1VOQUJMRV9UT19WQUxJREFURV9XU0kgPSAiX0VYQ19VTkFCTEVfVE9fVkFMSURBVEVfV1NJIjsKLQotICAvLyBpbmRpY2F0aW9ucyBmb3IgdHlwZXMgb2YgZXJyb3JzCi0gIHByb3RlY3RlZCBmaW5hbCBpbnQgRVJST1IgPSAyOwotICBwcm90ZWN0ZWQgZmluYWwgaW50IFdBUk5JTkcgPSAxOwotICAKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvciA9IG51bGw7Ci0gIHByb3RlY3RlZCBib29sZWFuIHdzaVZhbGlkID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTRExWYWxpZGF0b3IoKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5JV1NETFZhbGlkYXRvciN2YWxpZGF0ZShvcmcudzNjLmRvbS5Eb2N1bWVudCwgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5WYWxpZGF0aW9uSW5mbykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKERvY3VtZW50IGRvbU1vZGVsLCBJVmFsaWRhdGlvbkluZm8gdmFsSW5mbykgdGhyb3dzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbgotICB7Ci0JYm9vbGVhbiB3aXRoQXR0YWNobWVudHMgPSBmYWxzZTsKLQlib29sZWFuIHdpdGhCYXNpYyA9IGZhbHNlOwotCU9iamVjdCBhdHRWYWx1ZSA9IHZhbEluZm8uZ2V0QXR0cmlidXRlKCJodHRwOi8vd3MtaS5vcmcvcHJvZmlsZXMvQmFzaWNXaXRoQXR0YWNobWVudHMvQ29tcGxpYW5jZUxldmVsIik7Ci0JaWYoYXR0VmFsdWUgPT0gbnVsbCkKLQl7Ci0JICBhdHRWYWx1ZSA9IHZhbEluZm8uZ2V0QXR0cmlidXRlKCJodHRwOi8vd3MtaS5vcmcvcHJvZmlsZXMvQmFzaWMvQ29tcGxpYW5jZUxldmVsIik7Ci0gICAJICBpZihhdHRWYWx1ZSAhPSBudWxsKQotCSAgewotCSAgICB3aXRoQmFzaWMgPSB0cnVlOwotCSAgfQotCX0KLQllbHNlCi0JewotCSAgd2l0aEF0dGFjaG1lbnRzID0gdHJ1ZTsKLQl9Ci0JU3RyaW5nIHdzaUxldmVsID0gV1NJVGVzdFRvb2xzUHJvcGVydGllcy5XQVJOX05PTl9XU0k7Ci0JaWYoYXR0VmFsdWUgIT0gbnVsbCkKLQl7Ci0JICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWF0dFZhbHVlOwotCSAgaWYodmFsdWUuZXF1YWxzKCJJR05PUkUiKSkKLQkgIHsKLQkgIAl3c2lMZXZlbCA9IFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuSUdOT1JFX05PTl9XU0k7Ci0JICB9Ci0JICBlbHNlIGlmKHZhbHVlLmVxdWFscygiUkVRVUlSRSIpKQotCSAgewotCSAgIAl3c2lMZXZlbCA9IFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuU1RPUF9OT05fV1NJOwotCSAgfQotCX0KLQkvLyBJZiB3ZSBhcmUgaWdub3JpbmcgV1MtSSB0aGVuIGRvbid0IHJ1biB0aGUgdGVzdHMuCi0JaWYod3NpTGV2ZWwuZXF1YWxzKFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuSUdOT1JFX05PTl9XU0kpKQotCXsKLQkgIHJldHVybjsKLQl9Ci0JICAgIAotICAJd3NpVmFsaWQgPSB0cnVlOwotICAJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQlib29sZWFuIGhhc0FuYWx5emVyQ29uZmlnID0gZmFsc2U7Ci0JU3RyaW5nIHVyaSA9IHZhbEluZm8uZ2V0RmlsZVVSSSgpOwotICAJdHJ5Ci0gIAl7Ci0gICAgICAvL1dTRExGYWN0b3J5IGZhY3RvcnkgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotIAkgIFZhbGlkYXRpb25JbmZvSW1wbCB2YWxpID0gbmV3IFZhbGlkYXRpb25JbmZvSW1wbCh2YWxJbmZvLmdldEZpbGVVUkkoKSwgbWVzc2FnZWdlbmVyYXRvcik7Ci0gIAkgIHZhbGkuc2V0VVJJUmVzb2x2ZXIoKFVSSVJlc29sdmVyKXZhbEluZm8uZ2V0VVJJUmVzb2x2ZXIoKSk7Ci0gICAgICBXU0RMUmVhZGVySW1wbCByZWFkZXIgPSBuZXcgV1NETFJlYWRlckltcGwobmV3IFdTREwxMVZhbGlkYXRpb25JbmZvSW1wbCh2YWxpKSk7Ci0gICAgICBXU0RMRG9jdW1lbnRbXSBkb2NzID0gcmVhZGVyLnJlYWRXU0RMKHVyaSwgZG9tTW9kZWwpOwotICAgICAgaW50IG51bWRvY3MgPSBkb2NzLmxlbmd0aDsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1kb2NzOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCB0ZW1wRG9jID0gZG9jc1tpXTsKLQkJaWYodGVtcERvYy5nZXREZWZpbml0aW9uKCkuZ2V0RG9jdW1lbnRCYXNlVVJJKCkuZXF1YWxzKHZhbEluZm8uZ2V0RmlsZVVSSSgpKSkKLSAgICAgICAgewotICAgICAgICAgIGRlZmluaXRpb24gPSB0ZW1wRG9jLmdldERlZmluaXRpb24oKTsgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gIAl9Ci0gIAljYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gIAl7Ci0gIAkgIHRocm93IG5ldyBWYWxpZGF0ZVdTRExFeGNlcHRpb24obWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VYQ19VTkFCTEVfVE9fVkFMSURBVEVfV1NJLHVyaSkpOwotICAJfQotCSAgICAKLSAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsICYmIHZhbEluZm8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgICAgLy8gZ2V0IGFsbCB0aGUgY29sbGVjdGlvbnMgd2UgbWF5IG5lZWQgdG8gdmFsaWRhdGUKLSAgICAgIENvbGxlY3Rpb24gc2VydmljZXMgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCk7Ci0gICAgICBDb2xsZWN0aW9uIGJpbmRpbmdzID0gZGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpLnZhbHVlcygpOwotICAgICAgQ29sbGVjdGlvbiBwb3J0VHlwZXMgPSBkZWZpbml0aW9uLmdldFBvcnRUeXBlcygpLnZhbHVlcygpOwotICAgICAgQ29sbGVjdGlvbiBtZXNzYWdlcyA9IGRlZmluaXRpb24uZ2V0TWVzc2FnZXMoKS52YWx1ZXMoKTsKLQotICAgICAgV1NETEFuYWx5emVyIHdzZGxBbmFseXplcjsKLQkgIGlmKHdpdGhBdHRhY2htZW50cykKLQkgIHsKLQkgIAlXU0lQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG5ldyBXU0lQcmVmZXJlbmNlcygpOwotICAgCSAgICBwcmVmZXJlbmNlcy5zZXRDb21wbGlhbmNlTGV2ZWwod3NpTGV2ZWwpOwotCSAgICBwcmVmZXJlbmNlcy5zZXRUQURGaWxlKFdTSVRlc3RUb29sc1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbnN0YWxsVVJMKCkgKyBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLkFQX0FTU0VSVElPTl9GSUxFKTsKLQkgICAgd3NkbEFuYWx5emVyID0gbmV3IFdTRExBbmFseXplcih1cmksIHByZWZlcmVuY2VzKTsKLQkgIH0KLQkgIGVsc2UgaWYod2l0aEJhc2ljKQotCSAgewotCSAgCVdTSVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gbmV3IFdTSVByZWZlcmVuY2VzKCk7Ci0JCXByZWZlcmVuY2VzLnNldENvbXBsaWFuY2VMZXZlbCh3c2lMZXZlbCk7CQotCSAgICBwcmVmZXJlbmNlcy5zZXRUQURGaWxlKFdTSVRlc3RUb29sc1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbnN0YWxsVVJMKCkgKyBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLlNTQlBfQVNTRVJUSU9OX0ZJTEUpOwotCSAgICB3c2RsQW5hbHl6ZXIgPSBuZXcgV1NETEFuYWx5emVyKHVyaSwgcHJlZmVyZW5jZXMpOwotCSAgfQotCSAgZWxzZQotCSAgewotCQkvLyBkZWZhdWx0IHByZWZlcmVuY2Ugc2V0dGluZwotCSAgCXdzZGxBbmFseXplciA9IG5ldyBXU0RMQW5hbHl6ZXIodXJpKTsKLQkgIH0KLQotCSAgLy8gVGhlIFdTLUkgY29uZm9ybWFuY2UgdG9vbHMgcmVxdWlyZSB0aGF0IGVhY2ggc2VydmljZSBiZSBhbmFseXplZCBzZXBhcmF0ZWx5LgotCSAgLy8gR2V0IGFsbCB0aGUgc2VydmljZXMgYW5kIGFuYWx5emUgdGhlbS4KLQkgIGlmIChzZXJ2aWNlcyAhPSBudWxsICYmICFzZXJ2aWNlcy5pc0VtcHR5KCkpCi0JICB7Ci0JICAgIEl0ZXJhdG9yIHNlcnZpY2VJdGVyYXRvciA9IHNlcnZpY2VzLml0ZXJhdG9yKCk7Ci0KLQkgICAgd2hpbGUgKHNlcnZpY2VJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgc2VydmljZUl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgIFN0cmluZyBzZXJ2aWNlbmFtZSA9IHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQotICAgICAgICAgIENvbGxlY3Rpb24gcG9ydHMgPSBzZXJ2aWNlLmdldFBvcnRzKCkudmFsdWVzKCk7Ci0gICAgICAgICAgaWYgKHBvcnRzICE9IG51bGwgJiYgIXBvcnRzLmlzRW1wdHkoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGUgV1MtSSB0b29scyBtdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIHBvcnQgd2l0aGluIGVhY2ggc2VydmljZS4KLSAgICAgICAgICAgIEl0ZXJhdG9yIHBvcnRJdGVyYXRvciA9IHBvcnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAocG9ydEl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRJdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3c2RsQW5hbHl6ZXIuYWRkQ29uZmlndXJhdGlvblRvVGVzdChzZXJ2aWNlbmFtZSwgbmFtZXNwYWNlLCBwb3J0LmdldE5hbWUoKSwgV1NETEFuYWx5emVyLlBPUlQpOwotCQkJCWhhc0FuYWx5emVyQ29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoV1NJQW5hbHl6ZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IEFkZCBjb2RlIHRvIGxvZyBlcnJvciAKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyB2YWxpZGF0ZSBhdCB0aGUgYmluZGluZyBsZXZlbCAtIGNoZWNrIGZvciBldmVyeSBiaW5kaW5nCi0gICAgICBlbHNlIGlmIChiaW5kaW5ncyAhPSBudWxsICYmICFiaW5kaW5ncy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGJpbmRpbmdJdGVyYXRvciA9IGJpbmRpbmdzLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGJpbmRpbmdJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ0l0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgIFN0cmluZyBiaW5kaW5nbmFtZSA9IGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3c2RsQW5hbHl6ZXIuYWRkQ29uZmlndXJhdGlvblRvVGVzdChudWxsLCBuYW1lc3BhY2UsIGJpbmRpbmduYW1lLCBXU0RMQW5hbHl6ZXIuQklORElORyk7Ci0JCQloYXNBbmFseXplckNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChXU0lBbmFseXplckV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IEFkZCBjb2RlIHRvIGxvZyBlcnJvciAKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJleGNlcHRpb24gIiArIGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gdmFsaWRhdGUgYXQgdGhlIHBvcnRUeXBlIGxldmVsIC0gY2hlY2sgZm9yIGV2ZXJ5IHBvcnRUeXBlCi0gICAgICBlbHNlIGlmIChwb3J0VHlwZXMgIT0gbnVsbCAmJiAhcG9ydFR5cGVzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgcG9ydFR5cGVJdGVyYXRvciA9IHBvcnRUeXBlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocG9ydFR5cGVJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgcG9ydFR5cGVJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIHBvcnRUeXBlbmFtZSA9IHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgd3NkbEFuYWx5emVyLmFkZENvbmZpZ3VyYXRpb25Ub1Rlc3QobnVsbCwgbmFtZXNwYWNlLCBwb3J0VHlwZW5hbWUsIFdTRExBbmFseXplci5QT1JUVFlQRSk7Ci0JCQloYXNBbmFseXplckNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChXU0lBbmFseXplckV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IEFkZCBjb2RlIHRvIGxvZyBlcnJvciAKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJleGNlcHRpb24gIiArIGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gdmFsaWRhdGUgYXQgdGhlIG1lc3NhZ2UgbGV2ZWwgLSBjaGVjayBmb3IgZXZlcnkgbWVzc2FnZQotICAgICAgZWxzZSBpZiAobWVzc2FnZXMgIT0gbnVsbCAmJiAhbWVzc2FnZXMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBtZXNzYWdlSXRlcmF0b3IgPSBtZXNzYWdlcy5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChtZXNzYWdlSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIG1lc3NhZ2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIG1lc3NhZ2VuYW1lID0gbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdzZGxBbmFseXplci5hZGRDb25maWd1cmF0aW9uVG9UZXN0KG51bGwsIG5hbWVzcGFjZSwgbWVzc2FnZW5hbWUsIFdTRExBbmFseXplci5NRVNTQUdFKTsKLQkJCWhhc0FuYWx5emVyQ29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFdTSUFuYWx5emVyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNvZGUgdG8gbG9nIGVycm9yIAotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gb25seSBydW4gdGhlIGFuYWx5emVyIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0byBjaGVjawotCQlpZihoYXNBbmFseXplckNvbmZpZykKLQkJewotCQkgIC8vIHJ1biB0aGUgY29uZm9ybWFuY2UgY2hlY2sgYW5kIGFkZCBlcnJvcnMgYW5kIHdhcm5pbmdzIGFzIG5lZWRlZAotCQkgIHdzZGxBbmFseXplci52YWxpZGF0ZUNvbmZvcm1hbmNlKCk7Ci0JCQkgIAotCQkgIC8vIElmIHRoZSBsZXZlbCBpcyBzdWdnZXN0IGFsbCBlcnJvcnMgc2hvdWxkIGJlIHJlcG9ydGVkIGFzIHdhcm5pbmdzLgotCQkgIGlmKHdzZGxBbmFseXplci5nZXRXU0lQcmVmZXJlbmNlcygpLmdldENvbXBsaWFuY2VMZXZlbCgpLmVxdWFscyhXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLldBUk5fTk9OX1dTSSkpCi0JCSAgewotCQkgICAgYWRkV2FybmluZ3Mod3NkbEFuYWx5emVyLmdldEFzc2VydGlvbkVycm9ycygpLCB2YWxJbmZvKTsKLQkJICB9Ci0JCSAgZWxzZQotCQkgIHsKLQkJICAgIGFkZEVycm9ycyh3c2RsQW5hbHl6ZXIuZ2V0QXNzZXJ0aW9uRXJyb3JzKCksIHZhbEluZm8pOwotCQkgIH0KLQkJICBhZGRXYXJuaW5ncyh3c2RsQW5hbHl6ZXIuZ2V0QXNzZXJ0aW9uV2FybmluZ3MoKSwgdmFsSW5mbyk7Ci0JCX0KLSAgICAgIH0KLQkgIGNhdGNoIChXU0lBbmFseXplckV4Y2VwdGlvbiBlKQotCSAgewotCQkvLyBUT0RPOiBBZGQgY29kZSB0byBsb2cgZXJyb3IgCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIHJ1biBXUy1JIFdTREwgY29uZm9ybWFuY2UgY2hlY2suXG4iICsgZSk7Ci0JICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBlcnJvciBtZXNzYWdlcyB0byB0aGUgdmFsaWRhdGlvbmNvbnRyb2xsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gZXJyb3JzIFRoZSBsaXN0IG9mIGVycm9ycyB0byBhZGQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZEVycm9ycyhMaXN0IGVycm9ycywgSVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICByZXBvcnRQcm9ibGVtcyhlcnJvcnMsIHZhbEluZm8sIEVSUk9SKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgd2FybmluZyBtZXNzYWdlcyB0byB0aGUgdmFsaWRhdGlvbmNvbnRyb2xsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gd2FybmluZ3MgVGhlIGxpc3Qgb2Ygd2FybmluZ3MgdG8gYWRkLgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRXYXJuaW5ncyhMaXN0IHdhcm5pbmdzLCBJVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIHJlcG9ydFByb2JsZW1zKHdhcm5pbmdzLCB2YWxJbmZvLCBXQVJOSU5HKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXBvcnQgdGhlIHByb2JsZW1zIHNwZWNpZmllZCBmb3IgdGhlIGdpdmVuIHR5cGUgdG8gdGhlIHZhbGlkYXRpb25jb250cm9sbGVyLgotICAgKiAKLSAgICogQHBhcmFtIHByb2JsZW1zIFRoZSBwcm9ibGVtcyB0byByZXBvcnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSBvYmplY3QgdG8gcmVwb3J0IHRoZSBwcm9ibGVtcyB0by4KLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgbWVzc2FnZXMgdG8gYWRkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVwb3J0UHJvYmxlbXMoTGlzdCBwcm9ibGVtcywgSVZhbGlkYXRpb25JbmZvIHZhbEluZm8sIGludCB0eXBlKQotICB7Ci0gICAgLy8gaWYgdGhlcmUgd2VyZSBubyBwcm9ibGVtcyBqdXN0IHJldHVybgotICAgIGlmIChwcm9ibGVtcyA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgCi0gICAgSXRlcmF0b3IgcHJvYmxlbXNJdGVyYXRvciA9IHByb2JsZW1zLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKHByb2JsZW1zSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEFzc2VydGlvbkVycm9yIGFzc2VydGlvbmVycm9yID0gKEFzc2VydGlvbkVycm9yKSBwcm9ibGVtc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmICh0eXBlID09IEVSUk9SKQotICAgICAgewotCQl3c2lWYWxpZCA9IGZhbHNlOwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIFdTSV9QUkVGSVggKyBhc3NlcnRpb25lcnJvci5nZXRFcnJvck1lc3NhZ2UoKSwKLSAgICAgICAgICBhc3NlcnRpb25lcnJvci5nZXRMaW5lKCksCi0gICAgICAgICAgYXNzZXJ0aW9uZXJyb3IuZ2V0Q29sdW1uKCksCi0gICAgICAgICAgdmFsSW5mby5nZXRGaWxlVVJJKCkpOwotCi0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0eXBlID09IFdBUk5JTkcpCi0gICAgICB7Ci0gICAgICAgIHZhbEluZm8uYWRkV2FybmluZygKLSAgICAgICAgICBXU0lfUFJFRklYICsgYXNzZXJ0aW9uZXJyb3IuZ2V0RXJyb3JNZXNzYWdlKCksCi0gICAgICAgICAgYXNzZXJ0aW9uZXJyb3IuZ2V0TGluZSgpLAotICAgICAgICAgIGFzc2VydGlvbmVycm9yLmdldENvbHVtbigpLAotICAgICAgICAgIHZhbEluZm8uZ2V0RmlsZVVSSSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLmNvbnRyb2xsZXIuSVdTRExWYWxpZGF0b3Ijc2V0UmVzb3VyY2VCdW5kbGUoamF2YS51dGlsLlJlc291cmNlQnVuZGxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5jb250cm9sbGVyLklXU0RMVmFsaWRhdG9yI2lzVmFsaWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCi0gIHsKLSAgICByZXR1cm4gd3NpVmFsaWQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL3dzaXZhbGlkYXRlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvd3NpdmFsaWRhdGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5MDZiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvd3NpdmFsaWRhdGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgLyoqCi0jICAqIDxjb3B5cmlnaHQ+Ci0jICAqCi0jICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqCi0jICAqIDwvY29weXJpZ2h0PgotIyAgKi8KLQotX0VYQ19VTkFCTEVfVE9fVkFMSURBVEVfV1NJID0gVW5hYmxlIHRvIHZhbGlkYXRlIFdTLUkgY29uZm9ybWFuY2UuICBBbiBlcnJvciBvY2N1cmVkIHJlYWRpbmcgdGhlIFdTREwgZG9jdW1lbnQgezB9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNmU4NjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4JCi0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLSAgICAgCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjRiMGY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS5wZXJmb3JtYW5jZS5qYXIgPSBwZXJmb3JtYW5jZS8KLW91dHB1dC5wZXJmb3JtYW5jZS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLmphcixcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBkYXRhLwotc3JjLmluY2x1ZGVzID0gZGF0YS8sXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvZGF0YS9TdG9ja1F1b3RlL1N0b2NrUXVvdGUud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL2RhdGEvU3RvY2tRdW90ZS9TdG9ja1F1b3RlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmY5NjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvZGF0YS9TdG9ja1F1b3RlL1N0b2NrUXVvdGUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvU3RvY2tRdW90ZS8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJTdG9ja1F1b3RlIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9TdG9ja1F1b3RlLyI+DQotICA8d3NkbDp0eXBlcz4NCi0gICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvU3RvY2tRdW90ZS8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZXRRdW90ZVJlc3BvbnNlIj4NCi0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4c2Q6YWxsPg0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aWNrZXJTeW1ib2wiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgPC94c2Q6YWxsPg0KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+DQotICAgICAgPC94c2Q6ZWxlbWVudD4NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2V0UXVvdGVSZXF1ZXN0Ij4NCi0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4c2Q6YWxsPg0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmljZSIgdHlwZT0ieHNkOmZsb2F0Ii8+DQotICAgICAgICAgIDwveHNkOmFsbD4NCi0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwveHNkOmVsZW1lbnQ+DQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkhlYWRlcnMiPg0KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGVhZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8L3hzZDplbGVtZW50Pg0KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwveHNkOmVsZW1lbnQ+DQotICAgIDwveHNkOnNjaGVtYT4NCi0gIDwvd3NkbDp0eXBlcz4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0UXVvdGVSZXNwb25zZSI+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmdldFF1b3RlUmVzcG9uc2UiIG5hbWU9ImdldFF1b3RlUmVzcG9uc2UiLz4NCi0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6SGVhZGVycyIgbmFtZT0iaGVhZGVycyIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFF1b3RlUmVxdWVzdCI+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmdldFF1b3RlUmVxdWVzdCIgbmFtZT0iZ2V0UXVvdGVSZXF1ZXN0Ii8+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOkhlYWRlcnMiIG5hbWU9ImhlYWRlcnMiLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iU3RvY2tRdW90ZSI+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRRdW90ZSI+DQotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmdldFF1b3RlUmVxdWVzdCIvPg0KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6Z2V0UXVvdGVSZXNwb25zZSIvPg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgPC93c2RsOnBvcnRUeXBlPg0KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJTdG9ja1F1b3RlU09BUCIgdHlwZT0idG5zOlN0b2NrUXVvdGUiPg0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFF1b3RlIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL1N0b2NrUXVvdGUvZ2V0UXVvdGUiLz4NCi0gICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImdldFF1b3RlUmVxdWVzdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICA8c29hcDpoZWFkZXIgbWVzc2FnZT0idG5zOmdldFF1b3RlUmVxdWVzdCIgcGFydD0iaGVhZGVycyIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImdldFF1b3RlUmVzcG9uc2UiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgPHNvYXA6aGVhZGVyIG1lc3NhZ2U9InRuczpnZXRRdW90ZVJlc3BvbnNlIiBwYXJ0PSJoZWFkZXJzIiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgPC93c2RsOmJpbmRpbmc+DQotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGUiPg0KLSAgICA8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpTdG9ja1F1b3RlU09BUCIgbmFtZT0iU3RvY2tRdW90ZVNPQVAiPg0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZyIvPg0KLSAgICA8L3dzZGw6cG9ydD4NCi0gIDwvd3NkbDpzZXJ2aWNlPg0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9BbGxUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0MmU1My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIKAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFsbFRlc3RzCi17Ci0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZSIpOwotICAgIC8vJEpVbml0LUJFR0lOJAotICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkU3RvY2tRdW90ZVdTRExUZXN0Q2FzZS5jbGFzcyk7Ci0gICAgc3VpdGUuYWRkVGVzdFN1aXRlKE9wZW5TdG9ja1F1b3RlV1NETFNldHVwLmNsYXNzKTsKLSAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoT3BlblN0b2NrUXVvdGVXU0RMVGVzdENhc2UuY2xhc3MpOwotICAgIC8vJEpVbml0LUVORCQKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL09wZW5TdG9ja1F1b3RlV1NETFNldHVwLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuU3RvY2tRdW90ZVdTRExTZXR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDVjNGNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL09wZW5TdG9ja1F1b3RlV1NETFNldHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvUGFydDsKLQotcHVibGljIGNsYXNzIE9wZW5TdG9ja1F1b3RlV1NETFNldHVwIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIlByb2plY3QiOwotCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShPcGVuU3RvY2tRdW90ZVdTRExTZXR1cC5jbGFzcywgIk9wZW5TdG9ja1F1b3RlV1NETFNldHVwIik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjbG9zZUludHJvKCkKLSAgewotICAgIElJbnRyb01hbmFnZXIgaW50cm9NYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRJbnRyb01hbmFnZXIoKTsKLSAgICBJSW50cm9QYXJ0IGludHJvUGFydCA9IGludHJvTWFuYWdlci5nZXRJbnRybygpOwotICAgIGlmIChpbnRyb1BhcnQgIT0gbnVsbCkKLSAgICAgIGludHJvTWFuYWdlci5jbG9zZUludHJvKGludHJvUGFydCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSVByb2plY3QgY3JlYXRlU2ltcGxlUHJvamVjdChTdHJpbmcgbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIElQcm9qZWN0IHNpbXBsZVByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0gICAgc2ltcGxlUHJvamVjdC5jcmVhdGUobnVsbCk7Ci0gICAgc2ltcGxlUHJvamVjdC5vcGVuKG51bGwpOwotICAgIHJldHVybiBzaW1wbGVQcm9qZWN0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY29weUZpbGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0RmlsZShkZXN0KTsKLSAgICBmaWxlLmNyZWF0ZShQZXJmb3JtYW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoc291cmNlKS5vcGVuU3RyZWFtKCksIHRydWUsIG51bGwpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgam9pbkF1dG9CdWlsZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIGludGVycnVwdGVkID0gdHJ1ZTsKLSAgICB3aGlsZSAoaW50ZXJydXB0ZWQpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0gICAgICAgIGludGVycnVwdGVkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgaW50ZXJydXB0ZWQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXR1cCgpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGNsb3NlSW50cm8oKTsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlU2ltcGxlUHJvamVjdChQUk9KRUNUX05BTUUpOwotICAgIGNvcHlGaWxlKHByb2plY3QsICJkYXRhL1N0b2NrUXVvdGUvU3RvY2tRdW90ZS53c2RsIiwgIlN0b2NrUXVvdGUud3NkbCIpOwotICAgIGpvaW5BdXRvQnVpbGQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvT3BlblN0b2NrUXVvdGVXU0RMVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL09wZW5TdG9ja1F1b3RlV1NETFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MTkxMmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvT3BlblN0b2NrUXVvdGVXU0RMVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi1wdWJsaWMgY2xhc3MgT3BlblN0b2NrUXVvdGVXU0RMVGVzdENhc2UgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RDYXNlCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC5lZGl0b3IuaW50ZXJuYWwuV1NETEVkaXRvciI7Ci0KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE9wZW5TdG9ja1F1b3RlV1NETFRlc3RDYXNlLmNsYXNzLCAiT3BlblN0b2NrUXVvdGVXU0RMVGVzdENhc2UiKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgIGFzc2VydFRydWUocHJvamVjdC5leGlzdHMoKSk7Ci0gICAgcHJvamVjdC5vcGVuKG51bGwpOwotICAgIHByb2plY3QucmVmcmVzaExvY2FsKElQcm9qZWN0LkRFUFRIX0lORklOSVRFLCBudWxsKTsKLSAgICBqb2luQXV0b0J1aWxkKCk7Ci0gICAgcmV0dXJuIHByb2plY3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBqb2luQXV0b0J1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gaW50ZXJydXB0ZWQgPSB0cnVlOwotICAgIHdoaWxlIChpbnRlcnJ1cHRlZCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLSAgICAgICAgaW50ZXJydXB0ZWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBpbnRlcnJ1cHRlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IG9wZW5FZGl0b3IoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBTdHJpbmcgZWRpdG9yaWQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgotICB7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIHJldHVybiB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IoZWRpdG9ySW5wdXQsIGVkaXRvcmlkLCB0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGNsb3NlRWRpdG9yKElFZGl0b3JQYXJ0IGVkaXRvcikKLSAgewotICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICByZXR1cm4gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUVkaXRvcihlZGl0b3IsIGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RPcGVuU3RvY2tRdW90ZVdTREwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChPcGVuU3RvY2tRdW90ZVdTRExTZXR1cC5QUk9KRUNUX05BTUUpOwotICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKXByb2plY3QuZmluZE1lbWJlcigiU3RvY2tRdW90ZS53c2RsIikpOwotICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG9wZW5FZGl0b3IoZWRpdG9ySW5wdXQsIEVESVRPUl9JRCk7Ci0gICAgc3RvcE1lYXN1cmluZygpOwotICAgIGNvbW1pdE1lYXN1cmVtZW50cygpOwotICAgIGFzc2VydFBlcmZvcm1hbmNlKCk7Ci0gICAgY2xvc2VFZGl0b3IoZWRpdG9yUGFydCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzhmNGFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJmb3JtYW5jZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFBlcmZvcm1hbmNlUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUGVyZm9ybWFuY2VQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcmZvcm1hbmNlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBQZXJmb3JtYW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL1JlYWRTdG9ja1F1b3RlV1NETFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OGZjNmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqLldTRExGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotcHVibGljIGNsYXNzIFJlYWRTdG9ja1F1b3RlV1NETFRlc3RDYXNlIGV4dGVuZHMgUGVyZm9ybWFuY2VUZXN0Q2FzZQotewotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UuY2xhc3MsICJSZWFkU3RvY2tRdW90ZVdTRExUZXN0Q2FzZSIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFN0b2NrUXVvdGVXU0RMKCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgc3RhcnRNZWFzdXJpbmcoKTsKLSAgICBVUkwgd3NkbCA9IFBlcmZvcm1hbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YS9TdG9ja1F1b3RlL1N0b2NrUXVvdGUud3NkbCIpOwotICAgIFdTRExGYWN0b3J5SW1wbCBmYWN0b3J5ID0gbmV3IFdTRExGYWN0b3J5SW1wbCgpOwotICAgIFdTRExSZWFkZXIgcmVhZGVyID0gZmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gcmVhZGVyLnJlYWRXU0RMKHdzZGwudG9TdHJpbmcoKSwgbmV3IElucHV0U291cmNlKHdzZGwub3BlblN0cmVhbSgpKSk7Ci0gICAgc3RvcE1lYXN1cmluZygpOwotCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCWFzc2VydFBlcmZvcm1hbmNlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzNkZDc0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgbmFtZT0iV1NETCBQZXJmb3JtYW5jZSBQbHVnLWluIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InBlcmZvcm1hbmNlLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwMzk0NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InBlcmZvcm1hbmNlIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KLQotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLQotICA8cHJvcGVydHkgbmFtZT0id29ya3NwYWNlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3dvcmtzcGFjZV93c2RsX3BlcmZvcm1hbmNlIi8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZSoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSBwZXJmb3JtYW5jZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZV9zdWl0ZSI+Ci0KLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlLlJlYWRTdG9ja1F1b3RlV1NETFRlc3RDYXNlIi8+Ci0gICAgPC9hbnQ+Ci0KLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS5PcGVuU3RvY2tRdW90ZVdTRExTZXR1cCIvPgotICAgIDwvYW50PgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS5PcGVuU3RvY2tRdW90ZVdTRExUZXN0Q2FzZSIvPgotICAgIDwvYW50PgotCi0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgcGVyZm9ybWFuY2UgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlIiBkZXBlbmRzPSJpbml0LHBlcmZvcm1hbmNlX3N1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOTg4ZDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5jb20uaWJtLmV0b29scy53c2RsPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS54c2Q8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5jb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnZhbGlkYXRpb25idWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPmNvbS5pYm0uc3NlLm1vZGVsLnN0cnVjdHVyZWRidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5zdHJ1Y3R1cmVkYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzBmMTE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1zb3VyY2Uud3NkbC50ZXN0cy51aS5qYXIgPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIHdzZGwudGVzdHMudWkuamFyLFwKLSAgICAgICAgICAgICAgIFRlbXBlcmF0dXJlU2VydmljZS53c2RsLFwKLSAgICAgICAgICAgICAgIGphcnMvCi1zcmMuaW5jbHVkZXMgPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBUZW1wZXJhdHVyZVNlcnZpY2Uud3NkbCxcCi0gICAgICAgICAgICAgICAucHJvamVjdCxcCi0gICAgICAgICAgICAgICAuY2xhc3NwYXRoLFwKLSAgICAgICAgICAgICAgIGphcnMvCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhZDBhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aSIKLSAgIG5hbWU9IldTREwgTW9kZWwgVUkgU2FtcGxlcyIKLSAgIHZlcnNpb249IjEuMC4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ3c2RsLnRlc3RzLnVpLmphciIvPgotICAgPC9ydW50aW1lPgotICAgCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UueHNkIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgPC9yZXF1aXJlcz4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkub2JqZWN0X2NvbnRyaWJ1dGlvbiI+Ci0gICAgICAgICA8IS0tCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgbGFiZWw9IkdlbmVyYXRlIFdTREwgU2FtcGxlIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS5HZW5lcmF0ZVdTRExBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS5nZW5lcmF0ZV93c2RsX2FjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIC0tPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGxhYmVsPSJDb252ZXJ0IHRvIFdTREwgMi4wIERvY3VtZW50IgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS5Db252ZXJ0V1NETDIwQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkuY29udmVydF93c2RsX2FjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdWkvQ29udmVydFdTREwyMEFjdGlvbkRlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdWkvQ29udmVydFdTREwyMEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhODdmMDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3VpL0NvbnZlcnRXU0RMMjBBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvbkxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLldTRExDb252ZXJ0ZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ29udmVydFdTREwyMEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlCi17Ci0gIHByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAgIElGaWxlIGlmaWxlID0gbnVsbDsKLSAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgT2JqZWN0IGVsZW1lbnQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgCWlmaWxlID0gKElGaWxlKSBlbGVtZW50OwotICAgICAgICBJUGF0aCBwYXRoID0gaWZpbGUuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgSVBhdGggcGF0aDIgPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLSAgICAgICAgU3RyaW5nIG91dHB1dCA9IHBhdGgyLnRvU3RyaW5nKCkgKyAiLyIgKyBnZXROZXdOYW1lKGlmaWxlKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotCQkgICAgeyAgCi0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZiA9IERlZmluaXRpb25Mb2FkZXIubG9hZCgiZmlsZTovIiArIHBhdGgudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBXU0RMQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBXU0RMQ29udmVydGVyKGRlZik7Ci0gICAgICAgICAgICBjb252ZXJ0ZXIuZ2VuZXJhdGUyMChvdXRwdXQpOwotICAgICAgICAgICAgSUNvbnRhaW5lciBmb2xkZXIgPSBpZmlsZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIGZvbGRlci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSxudWxsKTsKLQkJICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotCQkgICAgewotICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCSAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAgIAotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXROZXdOYW1lKElGaWxlIGlmaWxlKQotICB7Ci0gICAgLy8gQXNzZXJ0IGN1cnJlbnROYW1lIGhhcyBhIGZpbGUgZXh0ZW5zaW9uLCBlLmcuIGZvby53c2RsLgotICAgIC8vIFRoaXMgd2lsbCByZXR1cm4gZm9vVjIwLndzZGwuCi0gICAgU3RyaW5nIGN1cnJlbnROYW1lID0gaWZpbGUuZ2V0TmFtZSgpOwotICAgIFN0cmluZyBuYW1lID0gY3VycmVudE5hbWUuc3Vic3RyaW5nKDAsY3VycmVudE5hbWUuaW5kZXhPZigiLiIpKTsKLSAgICBTdHJpbmcgZXh0ZW5zaW9uID0gY3VycmVudE5hbWUuc3Vic3RyaW5nKGN1cnJlbnROYW1lLmluZGV4T2YoIi4iKSk7Ci0gICAgU3RyaW5nIG5ld05hbWUgPSBuYW1lICsgIlYyMCIgKyBleHRlbnNpb247Ci0gICAgcmV0dXJuIG5ld05hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3VpL0dlbmVyYXRlV1NETEFjdGlvbkRlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdWkvR2VuZXJhdGVXU0RMQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhZThjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdWkvR2VuZXJhdGVXU0RMQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLldTRExHZW5lcmF0aW9uVGVzdDsKLQotcHVibGljIGNsYXNzIEdlbmVyYXRlV1NETEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlCi17Ci0gIHByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAgIElGaWxlIGlmaWxlID0gbnVsbDsKLSAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgT2JqZWN0IGVsZW1lbnQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgCWlmaWxlID0gKElGaWxlKSBlbGVtZW50OwotICAgICAgICBJUGF0aCBwYXRoID0gaWZpbGUuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgcGF0aCA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcGF0aC50b1N0cmluZygpICsgIi9NeVNhbXBsZS53c2RsIjsKLSAgICAgICAgCi0gICAgICAgIHRyeQotCQl7Ci0gICAgICAgICAgKG5ldyBXU0RMR2VuZXJhdGlvblRlc3QoKSkuZ2VuZXJhdGVUZW1wZXJhdHVyZVNlcnZpY2Uob3V0cHV0KTsKLQkJfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLSAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMzFkOGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5jb20uaWJtLmV0b29scy53c2RsPC9wcm9qZWN0PgotCQk8cHJvamVjdD5jb20uaWJtLndzZGw8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5hcGFjaGUueGVyY2VzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmVtZi5lY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnhzZDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmp1bml0PC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnN0cnVjdHVyZWRidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZDg0MTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgdGVzdFJlc291cmNlcy8sXAotICAgICAgICAgICAgICAgcnVudGVzdHMuYmF0LFwKLSAgICAgICAgICAgICAgIEpVTklULlhTTCxcCi0gICAgICAgICAgICAgICBydW50aW1lLyxcCi0gICAgICAgICAgICAgICB3c2RsLnRlc3RzLmphcixcCi0gICAgICAgICAgICAgICBzYW1wbGVzLwotc291cmNlLndzZGwudGVzdHMuamFyID0gc3JjLwotc3JjLmluY2x1ZGVzID0gdGVzdC54bWwsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIC5jbGFzc3BhdGgsXAotICAgICAgICAgICAgICAgLmN2c2lnbm9yZSxcCi0gICAgICAgICAgICAgICAucHJvamVjdCxcCi0gICAgICAgICAgICAgICBKVU5JVC5YU0wsXAotICAgICAgICAgICAgICAgcnVudGVzdHMuYmF0LFwKLSAgICAgICAgICAgICAgIHRlc3RSZXNvdXJjZXMvLFwKLSAgICAgICAgICAgICAgIHJ1bnRpbWUvLFwKLSAgICAgICAgICAgICAgIFBUQVRpbWVEaXN0cmlidXRpb24ud3NkbCxcCi0gICAgICAgICAgICAgICBURERhdGFTZXQueHNkLFwKLSAgICAgICAgICAgICAgIHNhbXBsZXMvCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFmNzVmNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIKLSAgIG5hbWU9IldTREwgSlVuaXQgVGVzdCIKLSAgIHZlcnNpb249IjEuMC4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ3c2RsLnRlc3RzLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS54c2QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9Mb2FkQW5kUHJpbnRUZXN0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYjNhNTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9Mb2FkQW5kUHJpbnRUZXN0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvTG9hZEFuZFByaW50VGVzdC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJMb2FkQW5kUHJpbnRUZXN0IiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9Mb2FkQW5kUHJpbnRUZXN0LyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0xvYWRBbmRQcmludFRlc3QvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6TmV3T3BlcmF0aW9uUmVzcG9uc2UiIG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOk5ld09wZXJhdGlvblJlcXVlc3QiIG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkxvYWRBbmRQcmludFRlc3QiPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJOZXdPcGVyYXRpb24iPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk5ld09wZXJhdGlvblJlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iTG9hZEFuZFByaW50VGVzdFNPQVAiIHR5cGU9InRuczpMb2FkQW5kUHJpbnRUZXN0Ij4KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvTG9hZEFuZFByaW50VGVzdC9OZXdPcGVyYXRpb24iLz4KLSAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJMb2FkQW5kUHJpbnRUZXN0Ij4KLSAgICA8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpMb2FkQW5kUHJpbnRUZXN0U09BUCIgbmFtZT0iTG9hZEFuZFByaW50VGVzdFNPQVAiPgotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL0FsbFRlc3RDYXNlcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL0FsbFRlc3RDYXNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWRkMTY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9BbGxUZXN0Q2FzZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0Q2FzZXMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCi0gIHB1YmxpYyBBbGxUZXN0Q2FzZXMoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QoSW5saW5lU2NoZW1hVGVzdC5zdWl0ZSgpKTsgIAotICAgIHN1aXRlLmFkZFRlc3QoTG9hZEFuZFNlcmlhbGl6YXRpb25UZXN0LnN1aXRlKCkpOwotICAgIHN1aXRlLmFkZFRlc3QoU2VtYW50aWNUZXN0LnN1aXRlKCkpOwotICAgIHN1aXRlLmFkZFRlc3QoV1NETEdlbmVyYXRpb25UZXN0LnN1aXRlKCkpOwotICAgIHN1aXRlLmFkZFRlc3QoV1NETDRKQVBJVGVzdC5zdWl0ZSgpKTsKLSAgICBzdWl0ZS5hZGRUZXN0KFdTRExFTUZBUElUZXN0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVXRpbFRlc3Quc3VpdGUoKSk7Ci0gICAgCi0gICAgcmV0dXJuIHN1aXRlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9JbmxpbmVTY2hlbWFUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvSW5saW5lU2NoZW1hVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTU4MmIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9JbmxpbmVTY2hlbWFUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqLldTRExGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvbkxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmxpbmVTY2hlbWFUZXN0IGV4dGVuZHMgVGVzdENhc2UgCi17Ci0gIHB1YmxpYyBJbmxpbmVTY2hlbWFUZXN0KFN0cmluZyBuYW1lKSAKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0JCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIAotICB7Ci0gICAgLy9qdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4oSW5saW5lU2NoZW1hVGVzdC5jbGFzcyk7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0JCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QKLSAgICAgIChuZXcgSW5saW5lU2NoZW1hVGVzdCgiSW5saW5lU2NoZW1hIikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotCSAgICAgICAgIHRlc3RJbmxpbmVTY2hlbWEoKTsKLQkgICAgICAgfQotCSAgICAgfQotCSAgICk7Ci0gICAgCi0gICAgc3VpdGUuYWRkVGVzdAotICAgICAgKG5ldyBJbmxpbmVTY2hlbWFUZXN0KCJJbmxpbmVTY2hlbWFXaXRoV1NETDRKIikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlc3RJbmxpbmVTY2hlbWFXaXRoV1NETDRKKCk7Ci0gICAgICAgICAgIH0KLQkgICAgIH0KLQkgICApOwotICAgIAotCSAgcmV0dXJuIHN1aXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICAKLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgCi0gICAgLy8gV2UgbmVlZCB0aGlzIGZvciBYU0QgPGltcG9ydD4uCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoInhzZCIsIG5ldyBYU0RSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFhTRFBhY2thZ2UgeHNkcGtnID0gWFNEUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdElubGluZVNjaGVtYSgpIAotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKCIuL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIik7Ci0gICAgICB0cmF2ZXJzZURlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RJbmxpbmVTY2hlbWFXaXRoV1NETDRKKCkgCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBsb2FkRGVmaW5pdGlvbkZvcldTREw0SigiLi9zYW1wbGVzL0xvYWRBbmRQcmludFRlc3Qud3NkbCIpOwotICAgICAgdHJhdmVyc2VEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdHJhdmVyc2VEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZGVmaW5pdGlvbik7Ci0gICAgICAKLSAgICAvLyBHZXQgSW5saW5lIFNjaGVtYQotICAgIFR5cGVzIHR5cGVzID0gKG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzKWRlZmluaXRpb24uZ2V0VHlwZXMoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiPHR5cGVzPiBpcyBudWxsIix0eXBlcyk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlcy5nZXRTY2hlbWFzKCkuaXRlcmF0b3IoKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCI8dHlwZXM+IGRvZXMgbm90IGhhdmUgaW5saW5lIDxzY2hlbWE+cyIsaXRlcmF0b3IuaGFzTmV4dCgpKTsKLSAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdHJhdmVyc2VTY2hlbWEoc2NoZW1hKTsKLSAgICAgIH0KLSAgICB9ICAJCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZVNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gIAlJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IG51bGw7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUoIk5vIDxlbGVtZW50PnMgYXJlIGZvdW5kIixpdGVyYXRvci5oYXNOZXh0KCkpOwotICAJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBlbGVtZW50RGVjbCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24paXRlcmF0b3IubmV4dCgpOwotCi0gICAgICBpZiAoZWxlbWVudERlY2wuZ2V0TmFtZSgpLmVxdWFscygiTmV3T3BlcmF0aW9uUmVzcG9uc2UiKSkKLSAgICAgIAl0cmF2ZXJzZUVsZW1lbnREZWNsKGVsZW1lbnREZWNsKTsKLSAgICAgIGVsc2UgaWYgKGVsZW1lbnREZWNsLmdldE5hbWUoKS5lcXVhbHMoIk5ld09wZXJhdGlvblJlcXVlc3QiKSkKLSAgICAgICAgdHJhdmVyc2VFbGVtZW50RGVjbChlbGVtZW50RGVjbCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlRWxlbWVudERlY2woWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IGVsZW1lbnREZWNsLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUoIjxlbGVtZW50PiBkb2VzIG5vdCBoYXZlIDxzaW1wbGVUeXBlPiIsdHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKTsKLSAgICBpZiAodHlwZS5nZXRDb21wbGV4VHlwZSgpID09IG51bGwpIC8vIHNpbXBsZSB0eXBlCi0gICAgICByZXR1cm47IC8vIFRCRCAtIEN1cnJlbnRseSB0aGlzIGFsd2F5cyByZXR1cm5zIGF0IHRoaXMgcG9pbnQuCi0gICAgWFNEUGFydGljbGVDb250ZW50IGNvbnRlbnQgPSB0eXBlLmdldENvbXBsZXhUeXBlKCkuZ2V0Q29udGVudCgpOyAgIAotICAgIHRyYXZlcnNlTW9kZWxHcm91cCgoWFNETW9kZWxHcm91cCljb250ZW50KTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlTW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgIFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgcGFydGljbGVDb250ZW50ID0gKChYU0RQYXJ0aWNsZSlpdGVyYXRvci5uZXh0KCkpLmdldENvbnRlbnQoKTsKLSAgICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJ0aWNsZUNvbnRlbnQpLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgdHJhdmVyc2VFbGVtZW50RGVjbCgoKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJ0aWNsZUNvbnRlbnQpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgdHJhdmVyc2VFbGVtZW50RGVjbCgoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIERlZmluaXRpb24gbG9hZERlZmluaXRpb24oU3RyaW5nIHdzZGxGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHJldHVybiBEZWZpbml0aW9uTG9hZGVyLmxvYWQoIi4vUFRBVGltZURpc3RyaWJ1dGlvbi53c2RsIik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBsb2FkRGVmaW5pdGlvbkZvcldTREw0SihTdHJpbmcgd3NkbEZpbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFdTRExSZWFkZXIgcmVhZGVyID0gKG5ldyBXU0RMRmFjdG9yeUltcGwoKSkubmV3V1NETFJlYWRlcigpOwotICAgIElQbHVnaW5EZXNjcmlwdG9yIHBkID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIpOwotICAgIFVSTCB1cmwgPSBwZC5nZXRJbnN0YWxsVVJMKCk7Ci0gICAgdXJsID0gbmV3IFVSTCh1cmwsd3NkbEZpbGUpOwotICAgIFN0cmluZyBzID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldEZpbGUoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAob3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbilyZWFkZXIucmVhZFdTREwocyxuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShzKSkpOwotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9Mb2FkQW5kU2VyaWFsaXphdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9Mb2FkQW5kU2VyaWFsaXphdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhNWZkNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvTG9hZEFuZFNlcmlhbGl6YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBLaWh1cCBCb28KLSAqLwotcHVibGljIGNsYXNzIExvYWRBbmRTZXJpYWxpemF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17ICAgIAotICAvKioKLSAgICogRXhlY3V0ZXMgYSBzdGFuZC1hbG9uZSB0ZXN0LgotICAgKiBAcGFyYW0gb2JqZWN0cyBhbiBhcnJheSBvZiBTdHJpbmdzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICogQHNlZSAjcnVuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSAKLSAgewotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgTG9hZEFuZFNlcmlhbGl6YXRpb25UZXN0KFN0cmluZyBuYW1lKSAKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IExvYWRBbmRTZXJpYWxpemF0aW9uVGVzdCgiTG9hZCIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0TG9hZCgpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IExvYWRBbmRTZXJpYWxpemF0aW9uVGVzdCgiUHJpbnQiKSAKLSAgICAgICAgewotICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0ZXN0UHJpbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICk7Ci0gICAgcmV0dXJuIHN1aXRlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIAotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExQYWNrYWdlIHBrZyA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICAKLSAgICAvLyBXZSBuZWVkIHRoaXMgZm9yIFhTRCA8aW1wb3J0Pi4KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICB9ICAKLSAgCi0gIHN0YXRpYyBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gIAotICAvKioKLSAgICogTG9hZCB0aGUgV1NETCBkZWZpbml0aW9ucyBmaWxlIGFuZCBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBpdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RMb2FkKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoIi4vc2FtcGxlcy9Mb2FkQW5kUHJpbnRUZXN0LndzZGwiKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRlZmluaXRpb24uZVJlc291cmNlKCkgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKTsKLSAgICAgIFdTRExSZXNvdXJjZUltcGwgd3NkbFJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpZGVmaW5pdGlvbi5lUmVzb3VyY2UoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPCEtLSA9PT09PSBEZWZpbml0aW9uIENvbXBvc2l0aW9uID09PT09Iik7Ci0gICAgICBwcmludERlZmluaXRpb25TdGFydChkZWZpbml0aW9uKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0+Iik7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBkZWZpbml0aW9uLmdldEVsZW1lbnQoKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIFByaW50IHRoZSBzZXJpYWxpemF0aW9uIG9mIHRoZSBtb2RlbC4KLSAgICAgICAgLy8KLSAgICAgICAgV1NETFJlc291cmNlSW1wbC5zZXJpYWxpemUoU3lzdGVtLm91dCwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFByaW50KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFRoaXMgcmVtb3ZlcyB0aGUgYXNzb2NpYXRlZCBET00gZWxlbWVudCwgY3JlYXRlcyBhIG5ldyBhc3NvY2lhdGVkIERPTSBlbGVtZW50LCBhbmQgdGhlbiBwcmludHMgaXQuCi0gICAgICAvLyBUaGlzIGlzIGEgZ29vZCB0ZXN0IGZvciBob3cgd2VsbCBzZXJpYWxpemF0aW9uIHdvcmtzIGZvciBhIG1vZGVsIGNyZWF0ZWQgImJvdHRvbSB1cCIuCi0gICAgICAvLwotICAgICAgZGVmaW5pdGlvbi5zZXREb2N1bWVudChudWxsKTsKLSAgICAgIGRlZmluaXRpb24uc2V0RWxlbWVudChudWxsKTsKLSAgICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikudXBkYXRlRWxlbWVudCgpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI8IS0tIFsgZGVmaW5pdGlvbnM6ICIgKyBkZWZpbml0aW9uLmdldFFOYW1lKCkgKyAiIF0gLS0+Iik7Ci0gICAgICBXU0RMUmVzb3VyY2VJbXBsLnNlcmlhbGl6ZShTeXN0ZW0ub3V0LCBkZWZpbml0aW9uLmdldERvY3VtZW50KCkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgfSAgIAotICB9Ci0gIAotICAvKioKLSAgICogUHJpbnRzIGEgaGVhZGVyIHRhZyBmb3IgdGhlIGdpdmVuIFdTREwgZGVmaW5pdGlvbnMuCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uIGEgV1NETCBkZWZpbml0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJpbnREZWZpbml0aW9uU3RhcnQoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludCgiPGRlZmluaXRpb25zIG5hbWU9XCIiKTsKLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludChkZWZpbml0aW9uLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50KCJcIiB0YXJnZXROYW1lc3BhY2U9XCIiKTsKLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnQoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgfSAgICAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlwiPiIpOwotICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvU2VtYW50aWNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvU2VtYW50aWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDM1MzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1NlbWFudGljVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgY2xhc3MgU2VtYW50aWNUZXN0IGV4dGVuZHMgRGVmaW5pdGlvblZpc2l0b3IKLXsKLSAgCi0gIC8vcHJpdmF0ZSBTdHJpbmcgd3NkbE5hbWVzcGFjZVByZWZpeDsKLSAgLy9wcml2YXRlIFN0cmluZyB4c2ROYW1lc3BhY2VQcmVmaXg7Ci0gIAotICB7Ci0gICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRoZSBmb2xsb3dpbmcgaW4gdGhlIHBsdWdpbi54bWwKLSAgICAvLwotICAgIC8vICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS5lbWYuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgLy8gICAgIDxwYXJzZXIgdHlwZT0id3NkbCIgY2xhc3M9ImNvbS5pYm0uZXRvb2xzLndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCIvPgotICAgIC8vICAgPC9leHRlbnNpb24+Ci0gICAgLy8KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIAotICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBYU0RQYWNrYWdlIHhzZHBrZyA9IFhTRFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0gIAotICAvLyBBZGRlZCBmb3IgSlVuaXQKLSAgcHVibGljIFNlbWFudGljVGVzdChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAqLwotICBwdWJsaWMgU2VtYW50aWNUZXN0KERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGRlZmluaXRpb24pOwotICB9Ci0vKiAgCi0gIHByaXZhdGUgdm9pZCBzZXJpYWxpemUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBTb3VyY2UgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwieWVzIik7Ci0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywiVVRGLTgiKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCI0Iik7Ci0gICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKGRvbVNvdXJjZSxuZXcgU3RyZWFtUmVzdWx0KG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSkpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgY3JlYXRlRG9jdW1lbnQoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWxlbWVudCBjcmVhdGVXU0RMRWxlbWVudChTdHJpbmcgbmFtZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbCIsbmFtZSk7Ci0gICAgaWYgKHdzZGxOYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkKLSAgICAgIGVsZW1lbnQuc2V0UHJlZml4KHdzZGxOYW1lc3BhY2VQcmVmaXgpOwotICAgIAotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0gKi8gCi0gIHByaXZhdGUgdm9pZCB2aXNpdERvY3VtZW50YXRpb24oRWxlbWVudCBkb2NFbGVtZW50KQotICB7Ci0gICAgaWYgKGRvY0VsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBwcmludGxuKCJkb2N1bWVudGF0aW9uOiAiICsgZG9jRWxlbWVudCk7IC8vIFRCRCAtIHNlcmlhbGl6ZSBkb2NFbGVtZW50Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBwcmludGxuKFN0cmluZyBzKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKHMpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBkZWZpbml0aW9ucy4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihkZWYuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgCi0gICAgUU5hbWUgcW5hbWUgPSBkZWYuZ2V0UU5hbWUoKTsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICAgIHByaW50bG4oIm5hbWU6ICIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgCi0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICBwcmludGxuKCJ0YXJnZXROYW1lc3BhY2U6ICIgKyB0YXJnZXROYW1lc3BhY2UpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmLmdldE5hbWVzcGFjZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotCi0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwcmVmaXggPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG5hbWVzcGFjZSA9IGRlZi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgIHByaW50bG4oIm5hbWVzcGFjZSBwcmVmaXg6ICIgKyBwcmVmaXggKyAiLCBuYW1lc3BhY2UgVVJJOiAiICsgbmFtZXNwYWNlKTsKLSAgICB9Ci0gICAgc3VwZXIudmlzaXREZWZpbml0aW9uKGRlZik7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBkZWZpbml0aW9ucy4uLiIpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdEltcG9ydChvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgd3NkbEltcG9ydCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGltcG9ydC4uLiIpOwotICAgIC8vIERldGVybWluZSBpZiB3ZSA8aW1wb3J0PiBhIHNjaGVtYS4KLSAgICBpZiAoaW1wb3J0aW5nU2NoZW1hKHdzZGxJbXBvcnQpKQotICAgIHsKLSAgICAgIHByaW50bG4oIjxpbXBvcnQ+aW5nIFhNTCBTY2hlbWEiKTsKLSAgICAgIAotICAgICAgLy8gIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vZm9vLmNvbSIgc2NoZW1hTG9jYXRpb249ICJiYXIueHNkIi8+Ci0gICAgICBwcmludGxuKCJuYW1lc3BhY2U6ICIgKyB3c2RsSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIHByaW50bG4oInNjaGVtYUxvY2F0aW9uOiAiICsgd3NkbEltcG9ydC5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICAgIHZpc2l0RG9jdW1lbnRhdGlvbih3c2RsSW1wb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAgIAotICAgIH0KLSAgCWVsc2UKLSAgICB7Ci0gICAgICBwcmludGxuKCI8aW1wb3J0PmluZyBXU0RMIik7Ci0gICAgICB2aXNpdERvY3VtZW50YXRpb24od3NkbEltcG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICB9Ci0gICAgcHJpbnRsbigiTGVhdmluZyBpbXBvcnQuLi4iKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGltcG9ydGluZ1NjaGVtYShJbXBvcnQgbXlJbXBvcnQpCi0gIHsKLSAgICBpZiAobXlJbXBvcnQuZ2V0RGVmaW5pdGlvbigpICE9IG51bGwpIC8vIGl0IGlzIFdTREwgaW1wb3J0Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdFR5cGVzKG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRUeXBlcyhUeXBlcyB0eXBlcykKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIHR5cGVzLi4uIik7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHR5cGVzLmdldFNjaGVtYXMoKS5pdGVyYXRvcigpOwotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgc2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBwcmludGxuKCJpbi1saW5lIHNjaGVtYTogIiArIHNjaGVtYSk7Ci0gICAgfSAgIAotICAgIHByaW50bG4oIkxlYXZpbmcgdHlwZXMuLi4iKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0UGFydChvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQYXJ0KFBhcnQgcGFydCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIHBhcnQuLi4iKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBwb3J0VHlwZS4uLiIpOwotICAJdmlzaXREb2N1bWVudGF0aW9uKHBvcnRUeXBlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAJCi0gICAgUU5hbWUgcW5hbWUgPSBwb3J0VHlwZS5nZXRRTmFtZSgpOwotICAgIGlmIChxbmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAKLSAgICBzdXBlci52aXNpdFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIHBvcnRUeXBlLi4uIik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBvcGVyYXRpb24uLi4iKTsKLSAgICB2aXNpdERvY3VtZW50YXRpb24ob3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotCQotICAgIFN0cmluZyBuYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIG5hbWUpOwotCi0gICAgT3BlcmF0aW9uVHlwZSBvcFR5cGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIGRldGVybWluaW5nIE9wZXJhdGlvbiBUeXBlIixvcFR5cGUpOwotICAgIAotICAgIGlmIChPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UgPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZTogIiArICJpbi1vdXQiKTsKLSAgICBlbHNlIGlmIChPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UgPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZSIgKyAib3V0LWluIik7Ci0gICAgZWxzZSBpZiAoT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT04gPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZSIgKyAib3V0LW9ubHkiKTsKLSAgICBlbHNlIGlmIChPcGVyYXRpb25UeXBlLk9ORV9XQVkgPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZSIgKyAiaW4tb25seSIpOwotICAgIAotICAgIHN1cGVyLnZpc2l0T3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBvcGVyYXRpb24uLi4iKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRJbnB1dChvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0SW5wdXQoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBpbnB1dC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBTdHJpbmcgbmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIG5hbWUpOwotICAgIAotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkZhaWxlZCB0byByZXNvbHZlIHRoZSBtZXNzYWdlIixtZXNzYWdlKTsKLSAgICAKLSAgICBwcmludGxuKCJMZWF2aW5nIGlucHV0Li4uIik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWxlbWVudCBnZXRQYXJ0RWxlbWVudChNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWYpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2VSZWYuZ2V0RU1lc3NhZ2UoKS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotICAgIC8vIFRCRCAtIGZvciBub3csIHRha2UgdGhlIGZpcnN0IHBhcnQuCi0gICAgUGFydCBwYXJ0ID0gKFBhcnQpaXRlcmF0b3IubmV4dCgpOwotICAgIEVsZW1lbnQgcGFydEVsZW1lbnQgPSBwYXJ0LmdldEVsZW1lbnQoKTsKLSAgICByZXR1cm4gcGFydEVsZW1lbnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdE91dHB1dChvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE91dHB1dChPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgb3V0cHV0Li4uIik7Ci0gICAgdmlzaXREb2N1bWVudGF0aW9uKG91dHB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBTdHJpbmcgbmFtZSA9IG91dHB1dC5nZXROYW1lKCk7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHByaW50bG4oIm5hbWU6ICIgKyBuYW1lKTsKLSAgICAKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBvdXRwdXQuZ2V0RU1lc3NhZ2UoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIHJlc29sdmUgdGhlIG1lc3NhZ2UiLG1lc3NhZ2UpOwotICAgIAotICAgIHByaW50bG4oIkxlYXZpbmcgb3V0cHV0Li4uIik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdEZhdWx0KG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRGYXVsdChGYXVsdCBmYXVsdCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGZhdWx0Li4uIik7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBmYXVsdC4uLiIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRCaW5kaW5nKG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZy4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFFOYW1lIHFuYW1lID0gYmluZGluZy5nZXRRTmFtZSgpOwotICAgIGlmIChxbmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkZhaWxlZCB0byByZXNvbHZlIHRoZSBwb3J0VHlwZSIscG9ydFR5cGUpOwotCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nKGJpbmRpbmcpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKCI8c29hcEJvZHk+IGlzIG1pc3NpbmciLHNvYXBCb2R5VmlzaXRlZCk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUoIjxzb2FwQmluZGluZz4gaXMgbWlzc2luZyIsc29hcEJpbmRpbmdWaXNpdGVkKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiPHNvYXBPcGVyYXRpb24+IGlzIG1pc3NpbmciLHNvYXBPcGVyYXRpb25WaXNpdGVkKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcuLi4iKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGJpbmRpbmcgb3BlcmF0aW9uLi4uIik7Ci0gICAgdmlzaXREb2N1bWVudGF0aW9uKGJpbmRpbmdPcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpOwotICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gcmVzb2x2ZSB0aGUgb3BlcmF0aW9uIixvcGVyYXRpb24pOwotICAgIAotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgICBwcmludGxuKCJuYW1lOiAiICsgb3BlcmF0aW9uTmFtZSk7Ci0gICAgfQotIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcgb3BlcmF0aW9uLi4uIik7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGlucHV0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZyBpbnB1dC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBTdHJpbmcgaW5wdXROYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotICAgIGlmIChpbnB1dE5hbWUgIT0gbnVsbCkKLSAgICAgIHByaW50bG4oIm5hbWU6ICIgKyBpbnB1dE5hbWUpOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ0lucHV0KGlucHV0KTsKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcgaW5wdXQuLi4iKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZyBvdXRwdXQuLi4iKTsKLSAgICB2aXNpdERvY3VtZW50YXRpb24ob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFN0cmluZyBvdXRwdXROYW1lID0gb3V0cHV0LmdldE5hbWUoKTsKLSAgICBpZiAob3V0cHV0TmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIG91dHB1dE5hbWUpOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ091dHB1dChvdXRwdXQpOwotICAgIHByaW50bG4oIkxlYXZpbmcgYmluZGluZyBvdXRwdXQuLi4iKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGZhdWx0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZyBmYXVsdC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihmYXVsdC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBFbGVtZW50IGZhdWx0RWxlbWVudCA9IGZhdWx0LmdldEVsZW1lbnQoKTsKLSAgICBTdHJpbmcgZmF1bHROYW1lID0gZmF1bHQuZ2V0TmFtZSgpOwotICAgIGlmIChmYXVsdE5hbWUgIT0gbnVsbCkKLSAgICAgIGZhdWx0RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGZhdWx0TmFtZSk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nRmF1bHQoZmF1bHQpOyAKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcgZmF1bHQuLi4iKTsKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgc2VydmljZS4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihzZXJ2aWNlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFFOYW1lIHFuYW1lID0gc2VydmljZS5nZXRRTmFtZSgpOwotICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJWYWxpZGF0aW9uIEVycm9yOiBzZXJ2aWNlIGlzIG1pc3NpbmcgdGhlIG5hbWUgYXR0cmlidXRlIixxbmFtZSk7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgICBwcmludGxuKCJuYW1lOiAiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIAotICAgIHN1cGVyLnZpc2l0U2VydmljZShzZXJ2aWNlKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIHNlcnZpY2UuLi4iKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRQb3J0KG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnQoUG9ydCBwb3J0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgcG9ydC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihwb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFN0cmluZyBuYW1lID0gcG9ydC5nZXROYW1lKCk7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIlZhbGlkYXRpb24gRXJyb3I6IHBvcnQgaXMgbWlzc2luZyB0aGUgbmFtZSBhdHRyaWJ1dGUiLHBvcnQpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICBwcmludGxuKCJuYW1lOiAiICsgcG9ydC5nZXROYW1lKCkpOwotICAgIAotICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0RUJpbmRpbmcoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIHJlc29sdmUgdGhlIGJpbmRpbmciLGJpbmRpbmcpOwotICAgIAotICAgIHN1cGVyLnZpc2l0UG9ydChwb3J0KTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiPHNvYXBBZGRyZXNzPiBpcyBtaXNzaW5nIixzb2FwQWRkcmVzc1Zpc2l0ZWQpOwotICAgIHByaW50bG4oIkxlYXZpbmcgcG9ydC4uLiIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2libGVFbGVtZW50IG93bmVyLCBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGV4dGVuc2liaWxpdHkgZWxlbWVudC4uLiIpOwotICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgdmlzaXRTT0FQQm9keSgoU09BUEJvZHkpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEJpbmRpbmcpCi0gICAgICB2aXNpdFNPQVBCaW5kaW5nKChTT0FQQmluZGluZylleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgZWxzZSBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgIHZpc2l0U09BUEFkZHJlc3MoKFNPQVBBZGRyZXNzKWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pCi0gICAgICB2aXNpdFNPQVBPcGVyYXRpb24oKFNPQVBPcGVyYXRpb24pZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIHByaW50bG4oIkxlYXZpbmcgZXh0ZW5zaWJpbGl0eSBlbGVtZW50Li4uIik7Ci0gIH0KLSAKLSAgLy9OZWVkcyB0byBpbXByb3ZlIHRoaXMgcGFydAotICBwcml2YXRlIGJvb2xlYW4gc29hcE9wZXJhdGlvblZpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUE9wZXJhdGlvbihTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24pCi0gIHsKLSAgICBzb2FwT3BlcmF0aW9uVmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUE9wZXJhdGlvbi4uLiIpOwotICAgIHByaW50bG4oInNvYXBBY3Rpb246ICIgKyBzb2FwT3BlcmF0aW9uLmdldFNvYXBBY3Rpb25VUkkoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQT3BlcmF0aW9uLi4uIik7Ci0gIH0KLSAgCi0gIC8vTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBCb2R5VmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQm9keShTT0FQQm9keSBzb2FwQm9keSkKLSAgewotICAgIHNvYXBCb2R5VmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUEJvZHkuLi4iKTsKLSAgICBwcmludGxuKCJ1c2U6ICIgKyBzb2FwQm9keS5nZXRVc2UoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQQm9keS4uLiIpOwotICB9Ci0gIAotICAvL05lZWRzIHRvIGltcHJvdmUgdGhpcyBwYXJ0Ci0gIHByaXZhdGUgYm9vbGVhbiBzb2FwQmluZGluZ1Zpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEJpbmRpbmcoU09BUEJpbmRpbmcgc29hcEJpbmRpbmcpCi0gIHsKLSAgICBzb2FwQmluZGluZ1Zpc2l0ZWQgPSB0cnVlOwotICAgIHByaW50bG4oIlZpc2l0aW5nIFNPQVBCaW5kaW5nLi4uIik7Ci0gICAgcHJpbnRsbigic3R5bGU6ICIgKyBzb2FwQmluZGluZy5nZXRTdHlsZSgpKTsKLSAgICBwcmludGxuKCJ0cmFuc3BvcnQ6ICIgKyBzb2FwQmluZGluZy5nZXRUcmFuc3BvcnRVUkkoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQQmluZGluZy4uLiIpOyAgCi0gIH0KLSAKLSAgLy8gTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBBZGRyZXNzVmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQWRkcmVzcyhTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcykKLSAgewotICAgIHNvYXBBZGRyZXNzVmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUEFkZHJlc3MuLi4iKTsKLSAgICBwcmludGxuKCJsb2NhdGlvbjogIiArIHNvYXBBZGRyZXNzLmdldExvY2F0aW9uVVJJKCkpOwotICAgIHByaW50bG4oIkxlYXZpbmcgU09BUEFkZHJlc3MuLi4iKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QKLSAgICAgIChuZXcgU2VtYW50aWNUZXN0KCJNb2RlbFNlbWFudGljVGVzdCIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0TW9kZWxTZW1hbnRpYygpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgKTsKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFNlbWFudGljKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKCIuL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIix0cnVlKTsKLSAgICAgIFNlbWFudGljVGVzdCB0ZXN0ID0gbmV3IFNlbWFudGljVGVzdChkZWYpOwotICAgICAgdGVzdC52aXNpdCgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoZS50b1N0cmluZygpKTsKLSAgICB9ICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvVXRpbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9VdGlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWFkZDMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9VdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW47Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5leHRlbnNpYmlsaXR5LkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmV4dGVuc2liaWxpdHkuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25Mb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci0vLyBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUENvbnN0YW50czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBVdGlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCSAgcHVibGljIFV0aWxUZXN0KFN0cmluZyBuYW1lKSAKLQkgIHsKLQkgICAgc3VwZXIobmFtZSk7Ci0JICB9Ci0JCi0JICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSAKLQkgIHsKLQkgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCSAgfQotCi0JICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLQkgIHsKLQkgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCSAgICAKLQkgICAgc3VpdGUuYWRkVGVzdAotCSAgICAgIChuZXcgVXRpbFRlc3QoIldTRExDb25zdGFudHMiKSAKLQkgICAgICAgICB7Ci0JICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0JICAgICAgICAgICB7Ci0JCQkJIHRlc3RDb25zdGFudHMoKTsKLQkgICAgICAgICAgIH0KLQkgICAgICAgICB9Ci0JICAgICAgICk7Ci0JICAgIAotCSAgICBzdWl0ZS5hZGRUZXN0Ci0JICAgICAgKG5ldyBVdGlsVGVzdCgiV1NETFJlc291cmNlRmFjdG9yeUltcGwiKSAKLQkgICAgICAgIHsKLQkgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIAotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgdGVzdFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICApOwotCQkKLQkgICAgc3VpdGUuYWRkVGVzdAotCSAgICAgIChuZXcgVXRpbFRlc3QoIldTRExSZXNvdXJjZUltcGwiKSAKLQkgICAgICAgIHsKLQkgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIAotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgdGVzdFdTRExSZXNvdXJjZUltcGwoKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICk7Ci0JICAgIHN1aXRlLmFkZFRlc3QKLQkgICAgICAobmV3IFV0aWxUZXN0KCJFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkiKSAKLQkgICAgICAgIHsKLQkgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIAotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgdGVzdEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSgpOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgKTsKLQkgICAgc3VpdGUuYWRkVGVzdAotCSAgICAgIChuZXcgVXRpbFRlc3QoIkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5IikgCi0JICAgICAgICB7Ci0JICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIHRlc3RFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSgpOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgKTsKLQkJCi0KLQkJCi0JICAgIHJldHVybiBzdWl0ZTsKLQkgIH0KLQkgIAotCSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIAotCSAgewotCSAgICBzdXBlci5zZXRVcCgpOwotCSAgICAKLQkgICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JICAgIFdTRExQYWNrYWdlIHBrZyA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLQkgICAgCi0JICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotCSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JICAgIFhTRFBhY2thZ2UgeHNkcGtnID0gWFNEUGFja2FnZS5lSU5TVEFOQ0U7IAotCSAgfQotCi0JICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gCi0JICB7Ci0JICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0JICB9ICAKLQkgIAotCSAgc3RhdGljIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQkgIAotCSAgcHVibGljIHZvaWQgdGVzdENvbnN0YW50cygpCi0JICB7Ci0gICAgICAgIHRyeQotCQl7Ci0JCSAgV1NETENvbnN0YW50cyB3c2RsQ29uc3RhbnRzID0gbmV3IFdTRExDb25zdGFudHMoKTsKLQkJICBpbnQgdHlwZSA9IFdTRExDb25zdGFudHMubm9kZVR5cGUoV1NETENvbnN0YW50cy5QT1JUX0VMRU1FTlRfVEFHKTsKLQkJICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm9kZSB0eXBlIGlzIG5vdCB0aGF0IG9mIHBvcnQiLCB0eXBlID09IDEwKTsKLQkJICAKLQkgICAgICBkZWZpbml0aW9uID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKCIuL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIik7Ci0JICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZGVmaW5pdGlvbi5lUmVzb3VyY2UoKSBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpOwotCi0JCSAgaW50IGRlZmluaXRpb25Ob2RlVHlwZSA9IFdTRExDb25zdGFudHMubm9kZVR5cGUoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotCQkgIEFzc2VydC5hc3NlcnRUcnVlKCJOb2RlIHR5cGUgaXMgbm90IHRoYXQgb2YgZGVmaW5pdGlvbiIsIGRlZmluaXRpb25Ob2RlVHlwZSA9PSAxKTsKLQkJICAKLQkJICBib29sZWFuIGlzV1NETE5hbWVzcGFjZSA9IFdTRExDb25zdGFudHMuaXNXU0RMTmFtZXNwYWNlKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCQkgIEFzc2VydC5hc3NlcnRGYWxzZSgiVGhpcyBzaG91bGQgbm90IGJlIHRoZSBXU0RMIE5hbWVzcGFjZSIsIGlzV1NETE5hbWVzcGFjZSk7Ci0JCSAgCi0JCSAgYm9vbGVhbiBpc01hdGNoaW5nID0gV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKCJodHRwOi8vd3d3LmV4YW1wbGUub3JnIiwgImh0dHA6Ly93d3cuZXhhbXBsZS5vcmciKTsgIAotCQkgIEFzc2VydC5hc3NlcnRUcnVlKCJpc01hdGNoaW5nTmFtZXNwYWNlIGlzIGluY29ycmVjdCIsIGlzTWF0Y2hpbmcpOwotCQkgIAotCQkgIFN0cmluZyBhdHRyID0gV1NETENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCksICJuYW1lIik7Ci0JCSAgQXNzZXJ0LmFzc2VydFRydWUoImdldEF0dHJpYnV0ZSBpcyBpbmNvcnJlY3QiLCBhdHRyLmVxdWFscygiTG9hZEFuZFByaW50VGVzdCIpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JICAgIHsKLQkgICAgICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfQotCSAgfQotICAKLQkgIHB1YmxpYyB2b2lkIHRlc3RXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpCi0JICB7Ci0JICAgIHRyeQotCSAgICB7Ci0JCSAgV1NETFJlc291cmNlRmFjdG9yeUltcGwgZmFjdG9yeUltcGwgPSBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKTsKLQkJICBSZXNvdXJjZSByZXNvdXJjZSA9IGZhY3RvcnlJbXBsLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVGaWxlVVJJKCIuL3NhbXBsZXMvY3JlYXRlUmVzb3VyY2VUZXN0LndzZGwiKSk7Ci0gICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlJlc291cmNlIGlzIG5vdCBvZiB0eXBlIFdTRExSZXNvdXJjZUltcGwiLCByZXNvdXJjZSBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpOwotCSAgICB9Ci0JICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgICAgewotCSAgICAgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCSAgICB9ICAgCi0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHRlc3RXU0RMUmVzb3VyY2VJbXBsKCkKLQkgIHsKLQkgICAgdHJ5Ci0JCXsKLQkJICBXU0RMUmVzb3VyY2VJbXBsIHJlc291cmNlSW1wbCA9IG5ldyBXU0RMUmVzb3VyY2VJbXBsKFVSSS5jcmVhdGVGaWxlVVJJKCIuL3NhbXBsZXMvY3JlYXRlUmVzb3VyY2VUZXN0LndzZGwiKSk7Ci0gICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlJlc291cmNlIGlzIG5vdCBvZiB0eXBlIFdTRExSZXNvdXJjZUltcGwiLCByZXNvdXJjZUltcGwgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKTsKLQkJICAKLQkgICAgICBkZWZpbml0aW9uID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKCIuL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIik7Ci0JICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZGVmaW5pdGlvbi5lUmVzb3VyY2UoKSBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpOwotCQkgIEVsZW1lbnQgZWxlbWVudCA9IGRlZmluaXRpb24uZ2V0RWxlbWVudCgpOwotCQkgIERvY3VtZW50IGRvY3VtZW50ID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudCgpOwotCi0JICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICByZXNvdXJjZUltcGwuc2VyaWFsaXplKFN5c3RlbS5vdXQsIGVsZW1lbnQsIG51bGwpOwotCSAgICAgIH0KLQkJICAKLQkJICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJICB7Ci0JCQlyZXNvdXJjZUltcGwuc2VyaWFsaXplKFN5c3RlbS5vdXQsIGRvY3VtZW50LCBudWxsKTsKLQkJICB9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCSAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gICAKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSgpCi0JICB7Ci0JICAgIHRyeQotCSAgICB7Ci0JCSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZmFjdG9yeSA9IFdTRExQbHVnaW4uSU5TVEFOQ0UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KFNPQVBDb25zdGFudHMuTlNfVVJJX1NPQVApOwotCQkgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCXsKLQkJICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSBmYWN0b3J5LmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KFNPQVBDb25zdGFudHMuTlNfVVJJX1NPQVAsIFNPQVBDb25zdGFudHMuRUxFTV9CT0RZKTsKLSAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2JsZW0gY3JlYXRpbmcgU09BUCBleHRlbnNpYmlsaXR5IGVsZW1lbnQiLCBlZSAhPSBudWxsKTsKLQkJCX0KLQkgICAgfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLQkJICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfSAgIAotCSAgfQotCSAgCi0JICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkoKQotCSAgewotCSAgICB0cnkKLQkgICAgewotCSAgICB9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9ICAgCi0JICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMNEpBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvV1NETDRKQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU2MDc2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMNEpBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuV1NETDRKRGVmaW5pdGlvblZpc2l0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotCi1pbXBvcnQgamF2YXgud3NkbC4qOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLio7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMNEpBUElUZXN0IGV4dGVuZHMgV1NETDRKRGVmaW5pdGlvblZpc2l0b3IKLXsKLSAgcHJpdmF0ZSBXU0RMRmFjdG9yeSBmYWN0b3J5ID0gV1NETFBsdWdpbi5JTlNUQU5DRS5jcmVhdGVXU0RMNEpGYWN0b3J5KCk7IAotICBwcml2YXRlIERlZmluaXRpb24gbmV3RGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBNZXNzYWdlIGN1cnJlbnRNZXNzYWdlOwotICBwcml2YXRlIFNlcnZpY2UgY3VycmVudFNlcnZpY2U7Ci0gIHByaXZhdGUgUG9ydFR5cGUgY3VycmVudFBvcnRUeXBlOwotICBwcml2YXRlIE9wZXJhdGlvbiBjdXJyZW50T3BlcmF0aW9uOwotICBwcml2YXRlIEJpbmRpbmcgY3VycmVudEJpbmRpbmc7Ci0gIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBjdXJyZW50QmluZGluZ09wZXJhdGlvbjsKLSAgIAotICB7Ci0gICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRoZSBmb2xsb3dpbmcgaW4gdGhlIHBsdWdpbi54bWwKLSAgICAvLwotICAgIC8vICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS5lbWYuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgLy8gICAgIDxwYXJzZXIgdHlwZT0id3NkbCIgY2xhc3M9ImNvbS5pYm0uZXRvb2xzLndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCIvPgotICAgIC8vICAgPC9leHRlbnNpb24+Ci0gICAgLy8KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIAotICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBYU0RQYWNrYWdlIHhzZHBrZyA9IFhTRFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0gIAotICAvLyBBZGRlZCBmb3IgSlVuaXQKLSAgcHVibGljIFdTREw0SkFQSVRlc3QoU3RyaW5nIG5hbWUpIAotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gZGVmaW5pdGlvbgotICAgKi8KLSAgcHVibGljIFdTREw0SkFQSVRlc3QoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIoZGVmaW5pdGlvbik7Ci0gIH0KLS8qICAKLSAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7Ci0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCJ5ZXMiKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCJVVEYtOCIpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsIjQiKTsKLSAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZG9tU291cmNlLG5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVEb2N1bWVudCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBkb2MgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZVdTRExFbGVtZW50KFN0cmluZyBuYW1lKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsIixuYW1lKTsKLSAgICBpZiAod3NkbE5hbWVzcGFjZVByZWZpeCAhPSBudWxsKQotICAgICAgZWxlbWVudC5zZXRQcmVmaXgod3NkbE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgCi0gICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0KLSAqLyAKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0RG9jdW1lbnRhdGlvbihFbGVtZW50IGRvY0VsZW1lbnQpCi0gIHsKLSAgICBpZiAoZG9jRWxlbWVudCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIHByaW50bG4oImRvY3VtZW50YXRpb246ICIgKyBkb2NFbGVtZW50KTsgLy8gVEJEIC0gc2VyaWFsaXplIGRvY0VsZW1lbnQKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHByaW50bG4oU3RyaW5nIHMpCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4ocyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZikKLSAgewotICAgIG5ld0RlZmluaXRpb24gPSBmYWN0b3J5Lm5ld0RlZmluaXRpb24oKTsKLSAgICBuZXdEZWZpbml0aW9uLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRlZi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAgCi0gICAgbmV3RGVmaW5pdGlvbi5zZXRRTmFtZShkZWYuZ2V0UU5hbWUoKSk7ICAgIAotICAgIG5ld0RlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgbmV3RGVmaW5pdGlvbi5zZXREb2N1bWVudEJhc2VVUkkoZGVmLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGRlZi5nZXROYW1lc3BhY2VzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLQotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgcHJlZml4ID0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBuYW1lc3BhY2UgPSBkZWYuZ2V0TmFtZXNwYWNlKHByZWZpeCk7Ci0gICAgICBuZXdEZWZpbml0aW9uLmFkZE5hbWVzcGFjZShwcmVmaXgsbmFtZXNwYWNlKTsKLSAgICB9Ci0gICAgCi0gICAgc3VwZXIudmlzaXREZWZpbml0aW9uKGRlZik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0SW1wb3J0KEltcG9ydCB3c2RsSW1wb3J0KQotICB7Ci0gICAgSW1wb3J0IG15SW1wb3J0ID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVJbXBvcnQoKTsKLSAgICBuZXdEZWZpbml0aW9uLmFkZEltcG9ydChteUltcG9ydCk7Ci0gICAgCi0gICAgLy8gZS5nLiA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2Zvby5jb20iIHNjaGVtYUxvY2F0aW9uPSAiYmFyLnhzZCIvPgotICAgIG15SW1wb3J0LnNldE5hbWVzcGFjZVVSSSh3c2RsSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICBteUltcG9ydC5zZXRMb2NhdGlvblVSSSh3c2RsSW1wb3J0LmdldExvY2F0aW9uVVJJKCkpOwotICAgIG15SW1wb3J0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHdzZGxJbXBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgCi0gICAgbXlJbXBvcnQuc2V0RGVmaW5pdGlvbihuZXdEZWZpbml0aW9uKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRUeXBlcyhUeXBlcyB0eXBlcykKLSAgewotICAgIFR5cGVzIG15VHlwZXMgPSBuZXdEZWZpbml0aW9uLmNyZWF0ZVR5cGVzKCk7Ci0gICAgbXlUeXBlcy5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0eXBlcy5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgLyoKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlZSA9IG51bGw7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBlZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBteVR5cGVzLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGVlKTsKLSAgICB9Ki8KLSAgICBuZXdEZWZpbml0aW9uLnNldFR5cGVzKG15VHlwZXMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQYXJ0KFBhcnQgcGFydCkKLSAgewotICAgIFBhcnQgbXlQYXJ0ID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVQYXJ0KCk7Ci0gICAgbXlQYXJ0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHBhcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgbXlQYXJ0LnNldE5hbWUocGFydC5nZXROYW1lKCkpOwotICAgIG15UGFydC5zZXRFbGVtZW50TmFtZShwYXJ0LmdldEVsZW1lbnROYW1lKCkpOwotICAgIG15UGFydC5zZXRUeXBlTmFtZShwYXJ0LmdldFR5cGVOYW1lKCkpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFydC5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICBRTmFtZSBrZXkgPSBudWxsOwotICAgIFFOYW1lIHZhbHVlID0gbnVsbDsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGtleSA9IChRTmFtZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2YWx1ZSA9IChRTmFtZSlwYXJ0LmdldEV4dGVuc2lvbkF0dHJpYnV0ZShrZXkpOwotICAgICAgbXlQYXJ0LnNldEV4dGVuc2lvbkF0dHJpYnV0ZShrZXksdmFsdWUpOwotICAgIH0KLSAgICBjdXJyZW50TWVzc2FnZS5hZGRQYXJ0KG15UGFydCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0TWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpCi0gIHsKLSAgICBjdXJyZW50TWVzc2FnZSA9IG5ld0RlZmluaXRpb24uY3JlYXRlTWVzc2FnZSgpOwotICAgIHN1cGVyLnZpc2l0TWVzc2FnZShtZXNzYWdlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIGN1cnJlbnRQb3J0VHlwZSA9IG5ld0RlZmluaXRpb24uY3JlYXRlUG9ydFR5cGUoKTsKLSAgICBjdXJyZW50UG9ydFR5cGUuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQocG9ydFR5cGUuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgY3VycmVudFBvcnRUeXBlLnNldFFOYW1lKHBvcnRUeXBlLmdldFFOYW1lKCkpOwotICAgIGN1cnJlbnRQb3J0VHlwZS5zZXRVbmRlZmluZWQocG9ydFR5cGUuaXNVbmRlZmluZWQoKSk7Ci0gICAgbmV3RGVmaW5pdGlvbi5hZGRQb3J0VHlwZShjdXJyZW50UG9ydFR5cGUpOwotICAgIAotICAgIHN1cGVyLnZpc2l0UG9ydFR5cGUocG9ydFR5cGUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgY3VycmVudE9wZXJhdGlvbiA9IG5ld0RlZmluaXRpb24uY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChvcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXROYW1lKG9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0U3R5bGUob3BlcmF0aW9uLmdldFN0eWxlKCkpOwotICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0VW5kZWZpbmVkKG9wZXJhdGlvbi5pc1VuZGVmaW5lZCgpKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldFBhcmFtZXRlck9yZGVyaW5nKG9wZXJhdGlvbi5nZXRQYXJhbWV0ZXJPcmRlcmluZygpKTsKLSAgICBjdXJyZW50UG9ydFR5cGUuYWRkT3BlcmF0aW9uKGN1cnJlbnRPcGVyYXRpb24pOwotICAgCi0gICAgc3VwZXIudmlzaXRPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRJbnB1dChJbnB1dCBpbnB1dCkKLSAgewotICAgIElucHV0IG15SW5wdXQgPSBuZXdEZWZpbml0aW9uLmNyZWF0ZUlucHV0KCk7Ci0gICAgbXlJbnB1dC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAgCi0gICAgbXlJbnB1dC5zZXROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0gICAgbXlJbnB1dC5zZXRNZXNzYWdlKGlucHV0LmdldE1lc3NhZ2UoKSk7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXRJbnB1dChteUlucHV0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBPdXRwdXQgbXlPdXRwdXQgPSBuZXdEZWZpbml0aW9uLmNyZWF0ZU91dHB1dCgpOwotICAgIG15T3V0cHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KG91dHB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICBteU91dHB1dC5zZXROYW1lKG91dHB1dC5nZXROYW1lKCkpOwotICAgIG15T3V0cHV0LnNldE1lc3NhZ2Uob3V0cHV0LmdldE1lc3NhZ2UoKSk7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXRPdXRwdXQobXlPdXRwdXQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRGYXVsdChGYXVsdCBmYXVsdCkKLSAgewotICAgIEZhdWx0IG15RmF1bHQgPSBuZXdEZWZpbml0aW9uLmNyZWF0ZUZhdWx0KCk7Ci0gICAgbXlGYXVsdC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChmYXVsdC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICBteUZhdWx0LnNldE5hbWUoZmF1bHQuZ2V0TmFtZSgpKTsKLSAgICBteUZhdWx0LnNldE1lc3NhZ2UoZmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLmFkZEZhdWx0KG15RmF1bHQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIGN1cnJlbnRCaW5kaW5nID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgbmV3RGVmaW5pdGlvbi5hZGRCaW5kaW5nKGN1cnJlbnRCaW5kaW5nKTsKLSAgICAKLSAgICBjdXJyZW50QmluZGluZy5zZXREb2N1bWVudGF0aW9uRWxlbWVudChiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAKLSAgICBjdXJyZW50QmluZGluZy5zZXRRTmFtZShiaW5kaW5nLmdldFFOYW1lKCkpOwotICAgIGN1cnJlbnRCaW5kaW5nLnNldFBvcnRUeXBlKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSk7Ci0gICAgY3VycmVudEJpbmRpbmcuc2V0VW5kZWZpbmVkKGJpbmRpbmcuaXNVbmRlZmluZWQoKSk7Ci0KLSAgICBzdXBlci52aXNpdEJpbmRpbmcoYmluZGluZyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbiA9IG5ld0RlZmluaXRpb24uY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOwotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLnNldERvY3VtZW50YXRpb25FbGVtZW50KGJpbmRpbmdPcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7ICAgCi0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0T3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkpOwotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLnNldE5hbWUoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgIGN1cnJlbnRCaW5kaW5nLmFkZEJpbmRpbmdPcGVyYXRpb24oY3VycmVudEJpbmRpbmdPcGVyYXRpb24pOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBCaW5kaW5nSW5wdXQgbXlJbnB1dCA9IG5ld0RlZmluaXRpb24uY3JlYXRlQmluZGluZ0lucHV0KCk7Ci0gICAgbXlJbnB1dC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAgCi0gICAgbXlJbnB1dC5zZXROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ0lucHV0KG15SW5wdXQpOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ0lucHV0KGlucHV0KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgQmluZGluZ091dHB1dCBteU91dHB1dCA9IG5ld0RlZmluaXRpb24uY3JlYXRlQmluZGluZ091dHB1dCgpOwotICAgIG15T3V0cHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KG91dHB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICBteU91dHB1dC5zZXROYW1lKG91dHB1dC5nZXROYW1lKCkpOwotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLnNldEJpbmRpbmdPdXRwdXQobXlPdXRwdXQpOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ091dHB1dChvdXRwdXQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBCaW5kaW5nRmF1bHQgbXlGYXVsdCA9IG5ld0RlZmluaXRpb24uY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgbXlGYXVsdC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChmYXVsdC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICBteUZhdWx0LnNldE5hbWUoZmF1bHQuZ2V0TmFtZSgpKTsKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5hZGRCaW5kaW5nRmF1bHQobXlGYXVsdCk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nRmF1bHQoZmF1bHQpOyAKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgY3VycmVudFNlcnZpY2UgPSBuZXdEZWZpbml0aW9uLmNyZWF0ZVNlcnZpY2UoKTsKLSAgICBjdXJyZW50U2VydmljZS5zZXREb2N1bWVudGF0aW9uRWxlbWVudChzZXJ2aWNlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIGN1cnJlbnRTZXJ2aWNlLnNldFFOYW1lKHNlcnZpY2UuZ2V0UU5hbWUoKSk7Ci0gICAgbmV3RGVmaW5pdGlvbi5hZGRTZXJ2aWNlKGN1cnJlbnRTZXJ2aWNlKTsKLSAgICAKLSAgICBzdXBlci52aXNpdFNlcnZpY2Uoc2VydmljZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydChQb3J0IHBvcnQpCi0gIHsKLSAgICBQb3J0IG15UG9ydCA9IG5ld0RlZmluaXRpb24uY3JlYXRlUG9ydCgpOwotICAgIG15UG9ydC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChwb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIG15UG9ydC5zZXROYW1lKHBvcnQuZ2V0TmFtZSgpKTsKLSAgICBteVBvcnQuc2V0QmluZGluZyhwb3J0LmdldEJpbmRpbmcoKSk7Ci0gICAgY3VycmVudFNlcnZpY2UuYWRkUG9ydChteVBvcnQpOwotICAgIAotICAgIHN1cGVyLnZpc2l0UG9ydChwb3J0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQm9keSkKLSAgICAgIHZpc2l0U09BUEJvZHkoKFNPQVBCb2R5KWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKQotICAgICAgdmlzaXRTT0FQQmluZGluZygoU09BUEJpbmRpbmcpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpCi0gICAgICB2aXNpdFNPQVBBZGRyZXNzKChTT0FQQWRkcmVzcylleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgZWxzZSBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQT3BlcmF0aW9uKQotICAgICAgdmlzaXRTT0FQT3BlcmF0aW9uKChTT0FQT3BlcmF0aW9uKWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgfQotIAotICAvL05lZWRzIHRvIGltcHJvdmUgdGhpcyBwYXJ0Ci0gIHByaXZhdGUgYm9vbGVhbiBzb2FwT3BlcmF0aW9uVmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQT3BlcmF0aW9uKFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbikKLSAgewotICAgIHNvYXBPcGVyYXRpb25WaXNpdGVkID0gdHJ1ZTsKLSAgICBwcmludGxuKCJWaXNpdGluZyBTT0FQT3BlcmF0aW9uLi4uIik7Ci0gICAgcHJpbnRsbigic29hcEFjdGlvbjogIiArIHNvYXBPcGVyYXRpb24uZ2V0U29hcEFjdGlvblVSSSgpKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIFNPQVBPcGVyYXRpb24uLi4iKTsKLSAgfQotICAKLSAgLy9OZWVkcyB0byBpbXByb3ZlIHRoaXMgcGFydAotICBwcml2YXRlIGJvb2xlYW4gc29hcEJvZHlWaXNpdGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBCb2R5KFNPQVBCb2R5IHNvYXBCb2R5KQotICB7Ci0gICAgc29hcEJvZHlWaXNpdGVkID0gdHJ1ZTsKLSAgICBwcmludGxuKCJWaXNpdGluZyBTT0FQQm9keS4uLiIpOwotICAgIHByaW50bG4oInVzZTogIiArIHNvYXBCb2R5LmdldFVzZSgpKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIFNPQVBCb2R5Li4uIik7Ci0gIH0KLSAgCi0gIC8vTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBCaW5kaW5nVmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQmluZGluZyhTT0FQQmluZGluZyBzb2FwQmluZGluZykKLSAgewotICAgIHNvYXBCaW5kaW5nVmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUEJpbmRpbmcuLi4iKTsKLSAgICBwcmludGxuKCJzdHlsZTogIiArIHNvYXBCaW5kaW5nLmdldFN0eWxlKCkpOwotICAgIHByaW50bG4oInRyYW5zcG9ydDogIiArIHNvYXBCaW5kaW5nLmdldFRyYW5zcG9ydFVSSSgpKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIFNPQVBCaW5kaW5nLi4uIik7ICAKLSAgfQotIAotICAvLyBOZWVkcyB0byBpbXByb3ZlIHRoaXMgcGFydAotICBwcml2YXRlIGJvb2xlYW4gc29hcEFkZHJlc3NWaXNpdGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBBZGRyZXNzKFNPQVBBZGRyZXNzIHNvYXBBZGRyZXNzKQotICB7Ci0gICAgc29hcEFkZHJlc3NWaXNpdGVkID0gdHJ1ZTsKLSAgICBwcmludGxuKCJWaXNpdGluZyBTT0FQQWRkcmVzcy4uLiIpOwotICAgIHByaW50bG4oImxvY2F0aW9uOiAiICsgc29hcEFkZHJlc3MuZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQQWRkcmVzcy4uLiIpOyAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgCi0gIHsKLSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgCi0gICAgc3VpdGUuYWRkVGVzdAotICAgICAgKG5ldyBXU0RMNEpBUElUZXN0KCJNb2RlbFNlbWFudGljVGVzdCIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0TW9kZWxTZW1hbnRpYygpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgKTsKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFNlbWFudGljKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmID0gbG9hZERlZmluaXRpb25Gb3JXU0RMNEooIi4vc2FtcGxlcy9Mb2FkQW5kUHJpbnRUZXN0LndzZGwiKTsKLSAgICAgIFdTREw0SkFQSVRlc3QgdGVzdCA9IG5ldyBXU0RMNEpBUElUZXN0KGRlZik7Ci0gICAgICB0ZXN0LnZpc2l0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgQXNzZXJ0LmZhaWwoZS50b1N0cmluZygpKTsKLSAgICB9ICAgIAotICB9Ci0gIAotICBwcml2YXRlIERlZmluaXRpb24gbG9hZERlZmluaXRpb25Gb3JXU0RMNEooU3RyaW5nIHdzZGxGaWxlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsgICAgCi0gICAgV1NETFJlYWRlciByZWFkZXIgPSBmYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsKLSAgICBJUGx1Z2luRGVzY3JpcHRvciBwZCA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMiKTsKLSAgICBVUkwgdXJsID0gcGQuZ2V0SW5zdGFsbFVSTCgpOwotICAgIHVybCA9IG5ldyBVUkwodXJsLHdzZGxGaWxlKTsKLSAgICBTdHJpbmcgcyA9IFBsYXRmb3JtLnJlc29sdmUodXJsKS5nZXRGaWxlKCk7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24pcmVhZGVyLnJlYWRXU0RMKHMsbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0ocykpKTsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvV1NETEVNRkFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMRU1GQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDdjZWI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMRU1GQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25Mb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBLaWh1cCBCb28KLSAqLwotcHVibGljIGNsYXNzIFdTRExFTUZBUElUZXN0IGV4dGVuZHMgRGVmaW5pdGlvblZpc2l0b3IKLXsKLSAgcHJpdmF0ZSBXU0RMRmFjdG9yeSBmYWN0b3J5ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFOwotICAKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIG5ld0RlZmluaXRpb247Ci0gIHByaXZhdGUgTWVzc2FnZSBjdXJyZW50TWVzc2FnZTsKLSAgcHJpdmF0ZSBTZXJ2aWNlIGN1cnJlbnRTZXJ2aWNlOwotICBwcml2YXRlIFBvcnRUeXBlIGN1cnJlbnRQb3J0VHlwZTsKLSAgcHJpdmF0ZSBPcGVyYXRpb24gY3VycmVudE9wZXJhdGlvbjsKLSAgcHJpdmF0ZSBCaW5kaW5nIGN1cnJlbnRCaW5kaW5nOwotICBwcml2YXRlIEJpbmRpbmdPcGVyYXRpb24gY3VycmVudEJpbmRpbmdPcGVyYXRpb247Ci0gICAKLSAgewotICAgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgZm9sbG93aW5nIGluIHRoZSBwbHVnaW4ueG1sCi0gICAgLy8KLSAgICAvLyAgIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2UuZW1mLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgIC8vICAgICA8cGFyc2VyIHR5cGU9IndzZGwiIGNsYXNzPSJjb20uaWJtLmV0b29scy53c2RsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGwiLz4KLSAgICAvLyAgIDwvZXh0ZW5zaW9uPgotICAgIC8vCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAKLSAgICAvLyBXZSBuZWVkIHRoaXMgZm9yIFhTRCA8aW1wb3J0Pi4KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsKLSAgfQotICAKLSAgLy8gQWRkZWQgZm9yIEpVbml0Ci0gIHB1YmxpYyBXU0RMRU1GQVBJVGVzdChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAqLwotICBwdWJsaWMgV1NETEVNRkFQSVRlc3QoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIoZGVmaW5pdGlvbik7Ci0gIH0KLS8qICAKLSAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7Ci0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCJ5ZXMiKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCJVVEYtOCIpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsIjQiKTsKLSAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZG9tU291cmNlLG5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVEb2N1bWVudCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBkb2MgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZVdTRExFbGVtZW50KFN0cmluZyBuYW1lKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsIixuYW1lKTsKLSAgICBpZiAod3NkbE5hbWVzcGFjZVByZWZpeCAhPSBudWxsKQotICAgICAgZWxlbWVudC5zZXRQcmVmaXgod3NkbE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgCi0gICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0KLSAqLyAKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0RG9jdW1lbnRhdGlvbihFbGVtZW50IGRvY0VsZW1lbnQpCi0gIHsKLSAgICBpZiAoZG9jRWxlbWVudCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIHByaW50bG4oImRvY3VtZW50YXRpb246ICIgKyBkb2NFbGVtZW50KTsgLy8gVEJEIC0gc2VyaWFsaXplIGRvY0VsZW1lbnQKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHByaW50bG4oU3RyaW5nIHMpCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4ocyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZikKLSAgewotICAgIC8vIFVzZSBXU0RMRWxlbWVudCB0byBpbmNyZWFzZSB0aGUgQVBJIGNvdmVyYWdlIGluIHRoZSByZXBvcnRzCi0gICAgV1NETEVsZW1lbnQgcm9vdCA9IGZhY3RvcnkuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgIG5ld0RlZmluaXRpb24gPSAoRGVmaW5pdGlvbilyb290OwotICAgIAotICAgIHJvb3Quc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZGVmLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIHJvb3QuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICByb290LnNldEVuY2xvc2luZ0RlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gICAgcm9vdC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgcm9vdC5nZXRDb250YWluZXIoKTsKLSAgICAKLSAgICBuZXdEZWZpbml0aW9uLnNldFFOYW1lKGRlZi5nZXRRTmFtZSgpKTsgICAgCi0gICAgbmV3RGVmaW5pdGlvbi5zZXRUYXJnZXROYW1lc3BhY2UoZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICBuZXdEZWZpbml0aW9uLnNldERvY3VtZW50QmFzZVVSSShkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmLmdldEVOYW1lc3BhY2VzKCkuaXRlcmF0b3IoKTsKLSAgICBOYW1lc3BhY2UgbnMgPSBudWxsOyAgIAotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIFN0cmluZyB1cmkgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgbnMgPSBmYWN0b3J5LmNyZWF0ZU5hbWVzcGFjZSgpOwotICAgICAgcHJlZml4ID0gKChOYW1lc3BhY2UpaXRlcmF0b3IubmV4dCgpKS5nZXRQcmVmaXgoKTsKLSAgICAgIHVyaSA9ICgoTmFtZXNwYWNlKWl0ZXJhdG9yLm5leHQoKSkuZ2V0VVJJKCk7Ci0gICAgICBucy5zZXRVUkkodXJpKTsKLSAgICAgIG5zLnNldFByZWZpeChwcmVmaXgpOwotICAgICAgbmV3RGVmaW5pdGlvbi5nZXRFTmFtZXNwYWNlcygpLmFkZChucyk7Ci0gICAgfQotICAgIAotICAgIHN1cGVyLnZpc2l0RGVmaW5pdGlvbihkZWYpOwotICAgIAotICAgIHJvb3Quc2V0RWxlbWVudChudWxsKTsKLSAgICByb290LnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgcm9vdC5nZXRFbGVtZW50KCk7Ci0gICAgcm9vdC5zZXRFbGVtZW50KG51bGwpOwotICAgIHJvb3QudXBkYXRlRWxlbWVudCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgd3NkbEltcG9ydCkKLSAgewotICAgIEltcG9ydCBteUltcG9ydCA9IGZhY3RvcnkuY3JlYXRlSW1wb3J0KCk7Ci0gICAgbmV3RGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpLmFkZChteUltcG9ydCk7Ci0gICAgCi0gICAgLy8gZS5nLiA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2Zvby5jb20iIHNjaGVtYUxvY2F0aW9uPSAiYmFyLnhzZCIvPgotICAgIG15SW1wb3J0LnNldE5hbWVzcGFjZVVSSSh3c2RsSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICBteUltcG9ydC5zZXRMb2NhdGlvblVSSSh3c2RsSW1wb3J0LmdldExvY2F0aW9uVVJJKCkpOwotICAgIG15SW1wb3J0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHdzZGxJbXBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgbXlJbXBvcnQuc2V0RURlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gICAgbXlJbXBvcnQuc2V0RVNjaGVtYSh3c2RsSW1wb3J0LmdldEVTY2hlbWEoKSk7Ci0gICAgbXlJbXBvcnQuc2V0U2NoZW1hKHdzZGxJbXBvcnQuZ2V0U2NoZW1hKCkpOyAvLyBUQkQgLSByZXZpZXcKLSAgICBteUltcG9ydC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG5ld0RlZmluaXRpb24pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFR5cGVzKFR5cGVzIHR5cGVzKQotICB7Ci0gICAgVHlwZXMgbXlUeXBlcyA9IGZhY3RvcnkuY3JlYXRlVHlwZXMoKTsKLSAgICBteVR5cGVzLnNldERvY3VtZW50YXRpb25FbGVtZW50KHR5cGVzLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgbXlUeXBlcy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChlZSk7Ci0gICAgfQotICAgIG15VHlwZXMuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihuZXdEZWZpbml0aW9uKTsKLSAgICBuZXdEZWZpbml0aW9uLmdldEVUeXBlcygpOwotICAgIG5ld0RlZmluaXRpb24uc2V0RVR5cGVzKG15VHlwZXMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQYXJ0KFBhcnQgcGFydCkKLSAgewotICAgIFBhcnQgbXlQYXJ0ID0gZmFjdG9yeS5jcmVhdGVQYXJ0KCk7Ci0gICAgbXlQYXJ0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHBhcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgbXlQYXJ0LnNldE5hbWUocGFydC5nZXROYW1lKCkpOwotICAgIG15UGFydC5zZXRFbGVtZW50TmFtZShwYXJ0LmdldEVsZW1lbnROYW1lKCkpOwotICAgIG15UGFydC5zZXRUeXBlTmFtZShwYXJ0LmdldFR5cGVOYW1lKCkpOwotICAgIG15UGFydC5zZXRFTWVzc2FnZShwYXJ0LmdldEVNZXNzYWdlKCkpOwotICAgIG15UGFydC5zZXRFbGVtZW50RGVjbGFyYXRpb24ocGFydC5nZXRFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJ0LmdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIFFOYW1lIGtleSA9IG51bGw7Ci0gICAgUU5hbWUgdmFsdWUgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAga2V5ID0gKFFOYW1lKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZhbHVlID0gKFFOYW1lKXBhcnQuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKGtleSk7Ci0gICAgICBteVBhcnQuc2V0RXh0ZW5zaW9uQXR0cmlidXRlKGtleSx2YWx1ZSk7Ci0gICAgfQotICAgIGN1cnJlbnRNZXNzYWdlLnNldEVuY2xvc2luZ0RlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gICAgY3VycmVudE1lc3NhZ2UuZ2V0RVBhcnRzKCkuYWRkKG15UGFydCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgY3VycmVudFBvcnRUeXBlID0gZmFjdG9yeS5jcmVhdGVQb3J0VHlwZSgpOwotICAgIGN1cnJlbnRQb3J0VHlwZS5zZXREb2N1bWVudGF0aW9uRWxlbWVudChwb3J0VHlwZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICBjdXJyZW50UG9ydFR5cGUuc2V0UU5hbWUocG9ydFR5cGUuZ2V0UU5hbWUoKSk7Ci0gICAgY3VycmVudFBvcnRUeXBlLnNldFVuZGVmaW5lZChwb3J0VHlwZS5pc1VuZGVmaW5lZCgpKTsKLSAgICAKLSAgICBjdXJyZW50UG9ydFR5cGUuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihuZXdEZWZpbml0aW9uKTsKLSAgICBuZXdEZWZpbml0aW9uLmdldEVQb3J0VHlwZXMoKS5hZGQoY3VycmVudFBvcnRUeXBlKTsKLSAgICAKLSAgICBzdXBlci52aXNpdFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIGN1cnJlbnRPcGVyYXRpb24gPSBmYWN0b3J5LmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQob3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0TmFtZShvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldFN0eWxlKG9wZXJhdGlvbi5nZXRTdHlsZSgpKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldFVuZGVmaW5lZChvcGVyYXRpb24uaXNVbmRlZmluZWQoKSk7Ci0gICAgb3BlcmF0aW9uLmdldEVQYXJhbWV0ZXJPcmRlcmluZygpOyAvLyBUQkQKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldEVuY2xvc2luZ0RlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gICAgY3VycmVudFBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuYWRkKGN1cnJlbnRPcGVyYXRpb24pOwotICAgCi0gICAgc3VwZXIudmlzaXRPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRJbnB1dChJbnB1dCBpbnB1dCkKLSAgewotICAgIElucHV0IG15SW5wdXQgPSBmYWN0b3J5LmNyZWF0ZUlucHV0KCk7Ci0gICAgbXlJbnB1dC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAgCi0gICAgbXlJbnB1dC5zZXROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0gICAgbXlJbnB1dC5zZXRFTWVzc2FnZShpbnB1dC5nZXRFTWVzc2FnZSgpKTsKLSAgICBteUlucHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXRFSW5wdXQobXlJbnB1dCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE91dHB1dChPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgT3V0cHV0IG15T3V0cHV0ID0gZmFjdG9yeS5jcmVhdGVPdXRwdXQoKTsKLSAgICBteU91dHB1dC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChvdXRwdXQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7ICAgCi0gICAgbXlPdXRwdXQuc2V0TmFtZShvdXRwdXQuZ2V0TmFtZSgpKTsKLSAgICBteU91dHB1dC5zZXRFTWVzc2FnZShvdXRwdXQuZ2V0RU1lc3NhZ2UoKSk7Ci0gICAgbXlPdXRwdXQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihuZXdEZWZpbml0aW9uKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldEVPdXRwdXQobXlPdXRwdXQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRGYXVsdChGYXVsdCBmYXVsdCkKLSAgewotICAgIEZhdWx0IG15RmF1bHQgPSBmYWN0b3J5LmNyZWF0ZUZhdWx0KCk7Ci0gICAgbXlGYXVsdC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChmYXVsdC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICBteUZhdWx0LnNldE5hbWUoZmF1bHQuZ2V0TmFtZSgpKTsKLSAgICBteUZhdWx0LnNldEVNZXNzYWdlKGZhdWx0LmdldEVNZXNzYWdlKCkpOwotICAgIG15RmF1bHQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihuZXdEZWZpbml0aW9uKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLmdldEVGYXVsdHMoKS5hZGQobXlGYXVsdCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgY3VycmVudEJpbmRpbmcgPSBmYWN0b3J5LmNyZWF0ZUJpbmRpbmcoKTsKLSAgICBuZXdEZWZpbml0aW9uLmdldEVCaW5kaW5ncygpLmFkZChjdXJyZW50QmluZGluZyk7Ci0gICAgCi0gICAgY3VycmVudEJpbmRpbmcuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoYmluZGluZy5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAgCi0gICAgY3VycmVudEJpbmRpbmcuc2V0UU5hbWUoYmluZGluZy5nZXRRTmFtZSgpKTsKLSAgICBjdXJyZW50QmluZGluZy5zZXRFUG9ydFR5cGUoYmluZGluZy5nZXRFUG9ydFR5cGUoKSk7Ci0gICAgY3VycmVudEJpbmRpbmcuc2V0VW5kZWZpbmVkKGJpbmRpbmcuaXNVbmRlZmluZWQoKSk7Ci0KLSAgICBzdXBlci52aXNpdEJpbmRpbmcoYmluZGluZyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbiA9IGZhY3RvcnkuY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOwotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLnNldERvY3VtZW50YXRpb25FbGVtZW50KGJpbmRpbmdPcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7ICAgCi0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0RU9wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uLmdldEVPcGVyYXRpb24oKSk7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0TmFtZShiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgY3VycmVudEJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5hZGQoY3VycmVudEJpbmRpbmdPcGVyYXRpb24pOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBCaW5kaW5nSW5wdXQgbXlJbnB1dCA9IGZhY3RvcnkuY3JlYXRlQmluZGluZ0lucHV0KCk7Ci0gICAgbXlJbnB1dC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAgCi0gICAgbXlJbnB1dC5zZXROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0RUJpbmRpbmdJbnB1dChteUlucHV0KTsKLSAgICAKLSAgICBzdXBlci52aXNpdEJpbmRpbmdJbnB1dChpbnB1dCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IG91dHB1dCkKLSAgewotICAgIEJpbmRpbmdPdXRwdXQgbXlPdXRwdXQgPSBmYWN0b3J5LmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICBteU91dHB1dC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChvdXRwdXQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7ICAgCi0gICAgbXlPdXRwdXQuc2V0TmFtZShvdXRwdXQuZ2V0TmFtZSgpKTsKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5zZXRFQmluZGluZ091dHB1dChteU91dHB1dCk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nT3V0cHV0KG91dHB1dCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0ZhdWx0KEJpbmRpbmdGYXVsdCBmYXVsdCkKLSAgewotICAgIEJpbmRpbmdGYXVsdCBteUZhdWx0ID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nRmF1bHQoKTsKLSAgICBteUZhdWx0LnNldERvY3VtZW50YXRpb25FbGVtZW50KGZhdWx0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15RmF1bHQuc2V0TmFtZShmYXVsdC5nZXROYW1lKCkpOwotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nRmF1bHRzKCkuYWRkKG15RmF1bHQpOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ0ZhdWx0KGZhdWx0KTsgCi0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIGN1cnJlbnRTZXJ2aWNlID0gZmFjdG9yeS5jcmVhdGVTZXJ2aWNlKCk7Ci0gICAgY3VycmVudFNlcnZpY2Uuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoc2VydmljZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICBjdXJyZW50U2VydmljZS5zZXRRTmFtZShzZXJ2aWNlLmdldFFOYW1lKCkpOwotICAgIAotICAgIG5ld0RlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCkuYWRkKGN1cnJlbnRTZXJ2aWNlKTsKLSAgICAKLSAgICBzdXBlci52aXNpdFNlcnZpY2Uoc2VydmljZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydChQb3J0IHBvcnQpCi0gIHsKLSAgICBQb3J0IG15UG9ydCA9IGZhY3RvcnkuY3JlYXRlUG9ydCgpOwotICAgIG15UG9ydC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChwb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIG15UG9ydC5zZXROYW1lKHBvcnQuZ2V0TmFtZSgpKTsKLSAgICBteVBvcnQuc2V0RUJpbmRpbmcocG9ydC5nZXRFQmluZGluZygpKTsKLSAgICAKLSAgICBjdXJyZW50U2VydmljZS5nZXRFUG9ydHMoKS5hZGQobXlQb3J0KTsKLSAgICAKLSAgICBzdXBlci52aXNpdFBvcnQocG9ydCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2libGVFbGVtZW50IG93bmVyLCBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgewotICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgdmlzaXRTT0FQQm9keSgoU09BUEJvZHkpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEJpbmRpbmcpCi0gICAgICB2aXNpdFNPQVBCaW5kaW5nKChTT0FQQmluZGluZylleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgZWxzZSBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgIHZpc2l0U09BUEFkZHJlc3MoKFNPQVBBZGRyZXNzKWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pCi0gICAgICB2aXNpdFNPQVBPcGVyYXRpb24oKFNPQVBPcGVyYXRpb24pZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEZhdWx0KQotICAgICAgdmlzaXRTT0FQRmF1bHQoKFNPQVBGYXVsdClleHRlbnNpYmlsaXR5RWxlbWVudCk7ICAKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpCi0gICAgICB2aXNpdFNPQVBIZWFkZXIoKFNPQVBIZWFkZXIpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEhlYWRlckZhdWx0KQotICAgICAgdmlzaXRTT0FQSGVhZGVyRmF1bHQoKFNPQVBIZWFkZXJGYXVsdClleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gIH0KLSAKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEZhdWx0KFNPQVBGYXVsdCBzb2FwRmF1bHQpCi0gIHsKLSAgICBTT0FQRmF1bHQgbXlTb2FwRmF1bHQgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEZhdWx0KCk7Ci0gICAgbXlTb2FwRmF1bHQuc2V0RW5jb2RpbmdTdHlsZXMoc29hcEZhdWx0LmdldEVuY29kaW5nU3R5bGVzKCkpOwotICAgIG15U29hcEZhdWx0LnNldE5hbWUoc29hcEZhdWx0LmdldE5hbWUoKSk7Ci0gICAgbXlTb2FwRmF1bHQuc2V0TmFtZXNwYWNlVVJJKHNvYXBGYXVsdC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgbXlTb2FwRmF1bHQuc2V0VXNlKHNvYXBGYXVsdC5nZXRVc2UoKSk7Ci0gIH0gCi0gIAotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQSGVhZGVyKFNPQVBIZWFkZXIgc29hcEhlYWRlcikKLSAgewotICAgIC8vIFVzZSBTT0FQSGVhZGVyQmFzZSB0byBpbmNyZWFzZSB0aGUgQVBJIGNvdmVyYWdlIHZhbHVlcyBpbiB0aGUgcmVwb3J0cwotICAgIAotICAgIFNPQVBIZWFkZXJCYXNlIG15U29hcEhlYWRlciA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQSGVhZGVyKCk7Ci0gICAgbXlTb2FwSGVhZGVyLnNldE1lc3NhZ2Uoc29hcEhlYWRlci5nZXRNZXNzYWdlKCkpOwotICAgIG15U29hcEhlYWRlci5nZXRNZXNzYWdlKCk7Ci0gICAgbXlTb2FwSGVhZGVyLnNldFBhcnQoc29hcEhlYWRlci5nZXRQYXJ0KCkpOwotICAgIG15U29hcEhlYWRlci5nZXRQYXJ0KCk7Ci0gICAgbXlTb2FwSGVhZGVyLnNldE5hbWVzcGFjZVVSSShzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICBteVNvYXBIZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgbXlTb2FwSGVhZGVyLnNldFVzZShzb2FwSGVhZGVyLmdldFVzZSgpKTsKLSAgICBteVNvYXBIZWFkZXIuZ2V0VXNlKCk7Ci0gICAgKChTT0FQSGVhZGVyKXNvYXBIZWFkZXIpLmdldEhlYWRlckZhdWx0cygpOyAvLyBUQkQKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEhlYWRlckZhdWx0KFNPQVBIZWFkZXJGYXVsdCBzb2FwSGVhZGVyRmF1bHQpCi0gIHsKLSAgICBTT0FQSGVhZGVyRmF1bHQgbXlTb2FwSGVhZGVyRmF1bHQgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlckZhdWx0KCk7Ci0gICAgbXlTb2FwSGVhZGVyRmF1bHQuc2V0TWVzc2FnZShzb2FwSGVhZGVyRmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICBteVNvYXBIZWFkZXJGYXVsdC5zZXRQYXJ0KHNvYXBIZWFkZXJGYXVsdC5nZXRQYXJ0KCkpOwotICAgIG15U29hcEhlYWRlckZhdWx0LnNldE5hbWVzcGFjZVVSSShzb2FwSGVhZGVyRmF1bHQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIG15U29hcEhlYWRlckZhdWx0LnNldFVzZShzb2FwSGVhZGVyRmF1bHQuZ2V0VXNlKCkpOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gc29hcE9wZXJhdGlvblZpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUE9wZXJhdGlvbihTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24pCi0gIHsKLSAgICBzb2FwT3BlcmF0aW9uVmlzaXRlZCA9IHRydWU7Ci0gICAgU09BUE9wZXJhdGlvbiBteVNvYXBPcGVyYXRpb24gPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUE9wZXJhdGlvbigpOwotICAgIG15U29hcE9wZXJhdGlvbi5zZXRTb2FwQWN0aW9uVVJJKHNvYXBPcGVyYXRpb24uZ2V0U29hcEFjdGlvblVSSSgpKTsKLSAgICBteVNvYXBPcGVyYXRpb24uc2V0U3R5bGUoc29hcE9wZXJhdGlvbi5nZXRTdHlsZSgpKTsKLSAgfQotICAKLSAgLy9OZWVkcyB0byBpbXByb3ZlIHRoaXMgcGFydAotICBwcml2YXRlIGJvb2xlYW4gc29hcEJvZHlWaXNpdGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBCb2R5KFNPQVBCb2R5IHNvYXBCb2R5KQotICB7Ci0gICAgc29hcEJvZHlWaXNpdGVkID0gdHJ1ZTsKLSAgICBTT0FQQm9keSBteVNvYXBCb2R5ID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgbXlTb2FwQm9keS5zZXRFbmNvZGluZ1N0eWxlcyhzb2FwQm9keS5nZXRFbmNvZGluZ1N0eWxlcygpKTsKLSAgICBteVNvYXBCb2R5LnNldE5hbWVzcGFjZVVSSShzb2FwQm9keS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgbXlTb2FwQm9keS5zZXRQYXJ0cyhzb2FwQm9keS5nZXRQYXJ0cygpKTsKLSAgICBteVNvYXBCb2R5LnNldFVzZShzb2FwQm9keS5nZXRVc2UoKSk7Ci0gIH0KLSAgCi0gIC8vTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBCaW5kaW5nVmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQmluZGluZyhTT0FQQmluZGluZyBzb2FwQmluZGluZykKLSAgewotICAgIHNvYXBCaW5kaW5nVmlzaXRlZCA9IHRydWU7Ci0gICAgU09BUEJpbmRpbmcgbXlTb2FwQmluZGluZyA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQmluZGluZygpOwotICAgIG15U29hcEJpbmRpbmcuc2V0U3R5bGUoc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSk7Ci0gICAgbXlTb2FwQmluZGluZy5zZXRUcmFuc3BvcnRVUkkoc29hcEJpbmRpbmcuZ2V0VHJhbnNwb3J0VVJJKCkpOyAKLSAgfQotIAotICAvLyBOZWVkcyB0byBpbXByb3ZlIHRoaXMgcGFydAotICBwcml2YXRlIGJvb2xlYW4gc29hcEFkZHJlc3NWaXNpdGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBBZGRyZXNzKFNPQVBBZGRyZXNzIHNvYXBBZGRyZXNzKQotICB7Ci0gICAgc29hcEFkZHJlc3NWaXNpdGVkID0gdHJ1ZTsKLSAgICBTT0FQQWRkcmVzcyBteVNvYXBBZGRyZXNzID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBBZGRyZXNzKCk7Ci0gICAgbXlTb2FwQWRkcmVzcy5zZXRMb2NhdGlvblVSSShzb2FwQWRkcmVzcy5nZXRMb2NhdGlvblVSSSgpKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QKLSAgICAgIChuZXcgV1NETEVNRkFQSVRlc3QoIk1vZGVsU2VtYW50aWNUZXN0IikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlc3RNb2RlbFNlbWFudGljKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICApOwotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1vZGVsU2VtYW50aWMoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoIi4vc2FtcGxlcy9Mb2FkQW5kUHJpbnRUZXN0LndzZGwiLHRydWUpOwotICAgICAgU2VtYW50aWNUZXN0IHRlc3QgPSBuZXcgU2VtYW50aWNUZXN0KGRlZik7Ci0gICAgICB0ZXN0LnZpc2l0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBBc3NlcnQuZmFpbChlLnRvU3RyaW5nKCkpOwotICAgIH0gICAgIAotICB9IAotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1dTRExHZW5lcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1dTRExHZW5lcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTEwMTMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMR2VuZXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25Mb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlRmFjdG9yeUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMR2VuZXJhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwdWJsaWMgV1NETEdlbmVyYXRpb25UZXN0KCkKLSAgewotICAgIGluaXQoKTsKLSAgfQotICAKLSAgcHVibGljIFdTRExHZW5lcmF0aW9uVGVzdChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IFdTRExHZW5lcmF0aW9uVGVzdCgiU2FtcGxlV1NETEdlbmVyYXRpb24iKSAKLSAgICAgICAgIHsKLSAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdGVzdFNhbXBsZVdTRExHZW5lcmF0aW9uKCk7Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICApOwotICAgIAotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFNhbXBsZVdTRExHZW5lcmF0aW9uKCkgCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBnZW5lcmF0ZVRlbXBlcmF0dXJlU2VydmljZSgiLi9UZW1wZXJhdHVyZVNlcnZpY2Uud3NkbCIpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIAotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExQYWNrYWdlIHBrZyA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICAKLSAgICAvLyBXZSBuZWVkIHRoaXMgZm9yIFhTRCA8aW1wb3J0Pi4KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlVGVtcGVyYXR1cmVTZXJ2aWNlKFN0cmluZyBvdXRwdXRGaWxlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVGaWxlVVJJKG91dHB1dEZpbGUpKTsKLSAgICByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCi0gICAgLy8gQ3JlYXRlIGEgRGVmaW5pdGlvbiAtIFRlbXBlcmF0dXJlCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlZmluaXRpb24oKTsKLSAgICBkZWZpbml0aW9uLnNldFFOYW1lKG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSwiVGVtcGFyYXR1cmUiKSk7Ci0gICAgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGVmaW5pdGlvbik7Ci0gICAgCi0gICAgLy8gVGFyZ2V0IG5hbWVzcGFjZSAtIGh0dHA6Ly93d3cudGVtcGVyYXR1cmUuY29tCi0gICAgZGVmaW5pdGlvbi5zZXRUYXJnZXROYW1lc3BhY2UoImh0dHA6Ly93d3cudGVtcGVyYXR1cmUuY29tIik7Ci0gICAgZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoInRucyIsICJodHRwOi8vd3d3LnRlbXBlcmF0dXJlLmNvbSIpOwotICAgIAotICAgIC8vIE90aGVyIG5hbWVzcGFjZXMgLSB3c2RsLCBzb2FwLCB4c2QKLSAgICBkZWZpbml0aW9uLmFkZE5hbWVzcGFjZSgid3NkbCIsIFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKTsKLSAgICBkZWZpbml0aW9uLmFkZE5hbWVzcGFjZSgieHNkIiwgV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7Ci0gICAgZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCkucHV0KCJzb2FwIiwgU09BUENvbnN0YW50cy5TT0FQX05BTUVTUEFDRV9VUkkpOwotCi0gICAgLy8KLSAgICAvLyBMZXQncyBzdGFydCBidWlsZGluZyB0d28gbWVzc2FnZXMKLSAgICAvLwotICAgIAotICAgIC8vIENyZWF0ZSBhIFBhcnQgLSBaaXBDb2RlCi0gICAgUGFydCBwYXJ0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcnQoKTsKLSAgICBwYXJ0LnNldE5hbWUoIlppcENvZGUiKTsKLSAgICBwYXJ0LnNldFR5cGVOYW1lKG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCJzdHJpbmciKSk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgTWVzc2FnZSAtIEdldFRlbXBlcmF0dXJlSW5wdXQKLSAgICBNZXNzYWdlIGlucHV0TWVzc2FnZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgaW5wdXRNZXNzYWdlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCAiR2V0VGVtcGFyYXR1cmVJbnB1dCIpKTsKLSAgICBpbnB1dE1lc3NhZ2UuYWRkUGFydChwYXJ0KTsKLSAgICBkZWZpbml0aW9uLmFkZE1lc3NhZ2UoaW5wdXRNZXNzYWdlKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSBQYXJ0IC0gVGVtcGVyYXR1cmUKLSAgICBwYXJ0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcnQoKTsKLSAgICBwYXJ0LnNldE5hbWUoIlRlbXBlcmF0dXJlIik7Ci0gICAgcGFydC5zZXRUeXBlTmFtZShuZXcgUU5hbWUoV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwiZmxvYXQiKSk7Ci0KLSAgICAvLyBDcmVhdGUgYSBNZXNzYWdlIC0gR2V0VGVtcGVyYXR1cmVPdXRwdXQKLSAgICBNZXNzYWdlIG91dHB1dE1lc3NhZ2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZSgpOwotICAgIG91dHB1dE1lc3NhZ2Uuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksICJHZXRUZW1wYXJhdHVyZU91dHB1dCIpKTsKLSAgICBvdXRwdXRNZXNzYWdlLmFkZFBhcnQocGFydCk7Ci0gICAgZGVmaW5pdGlvbi5hZGRNZXNzYWdlKG91dHB1dE1lc3NhZ2UpOwotICAgIAotICAgIC8vCi0gICAgLy8gTmV4dCwgYnVpbGQgYSBQb3J0VHlwZQotICAgIC8vCi0gICAgCi0gICAgLy8gQ3JlYXRlIGFuIElucHV0IC0gR2V0VGVtcGVyYXR1cmVJbnB1dAotICAgIElucHV0IGlucHV0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlucHV0KCk7Ci0gICAgaW5wdXQuc2V0TWVzc2FnZShpbnB1dE1lc3NhZ2UpOwotCi0gICAgLy8gQ3JlYXRlIGFuIE91dHB1dCAtIEdldFRlbXBlcmF0dXJlT3V0cHV0Ci0gICAgT3V0cHV0IG91dHB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPdXRwdXQoKTsKLSAgICBvdXRwdXQuc2V0TWVzc2FnZShvdXRwdXRNZXNzYWdlKTsKLSAgIAotICAgIC8vIENyZWF0ZSBhbiBPcGVyYXRpb24gLSBHZXRUZW1wZXJhdHVyZUZvclppcENvZGUKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIG9wZXJhdGlvbi5zZXROYW1lKCJHZXRUZW1wZXJhdHVyZUZvclppcENvZGUiKTsKLSAgICBvcGVyYXRpb24uc2V0SW5wdXQoaW5wdXQpOwotICAgIG9wZXJhdGlvbi5zZXRPdXRwdXQob3V0cHV0KTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSBQb3J0VHlwZQotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcnRUeXBlKCk7Ci0gICAgcG9ydFR5cGUuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIkdldFRlbXBhcmF0dXJlSW5mb1NPQVAiKSk7Ci0gICAgcG9ydFR5cGUuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgZGVmaW5pdGlvbi5hZGRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgCi0gICAgLy8KLSAgICAvLyBOb3csIGxldCdzIHdvcmsgb24gQmluZGluZwotICAgIC8vCi0gICAgCi0gICAgLy8gQ3JlYXRlIGEgQmluZGluZyAtIEdldFRlbXBlcmF0dXJlSW5mb1NPQVAKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZygpOwotICAgIGJpbmRpbmcuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksICJHZXRUZW1wYXJhdHVyZUluZm9TT0FQIikpOwotICAgIGJpbmRpbmcuc2V0UG9ydFR5cGUocG9ydFR5cGUpOwotICAgIGRlZmluaXRpb24uYWRkQmluZGluZyhiaW5kaW5nKTsKLQotICAgIC8vIENyZWF0ZSBhIFNPQVAgQmluZGluZwotICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBCaW5kaW5nKCk7Ci0gICAgc29hcEJpbmRpbmcuc2V0U3R5bGUoInJwYyIpOwotICAgIHNvYXBCaW5kaW5nLnNldFRyYW5zcG9ydFVSSSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIik7Ci0gICAgYmluZGluZy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQmluZGluZyk7Ci0KLSAgICAvLyBDcmVhdGUgYSBCaW5kaW5nIE9wZXJhdGlvbgotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5zZXROYW1lKCJHZXRUZW1wZXJhdHVyZUZvclppcENvZGUiKTsKLSAgICBiaW5kaW5nLmFkZEJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICAvLyBDcmVhdGUgYSBTT0FQIE9wZXJhdGlvbgotICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQT3BlcmF0aW9uKCk7Ci0gICAgc29hcE9wZXJhdGlvbi5zZXRTb2FwQWN0aW9uVVJJKCJodHRwOi8vd3d3LnRlbXBlcmF0dXJlLmNvbS9HZXRUZW1wZXJhdHVyZUZvclppcENvZGUiKTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBPcGVyYXRpb24pOyAgICAKLQotICAgIC8vIENyZWF0ZSBhIFNPQVAgQm9keQotICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgc29hcEJvZHkuc2V0VXNlKCJlbmNvZGVkIik7Ci0gICAgc29hcEJvZHkuZ2V0RW5jb2RpbmdTdHlsZXMoKS5hZGQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgc29hcEJvZHkuc2V0TmFtZXNwYWNlVVJJKCJodHRwOi8vd3d3LnRlbXBlcmF0dXJlLmNvbS8iKTsKLQotICAgIC8vIENyZWF0ZSBhIEJpbmRpbmcgSW5wdXQKLSAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdJbnB1dCgpOwotICAgIGJpbmRpbmdJbnB1dC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQm9keSk7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nSW5wdXQoYmluZGluZ0lucHV0KTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSBTT0FQIEJvZHkKLSAgICBzb2FwQm9keSA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQm9keSgpOwotICAgIHNvYXBCb2R5LnNldFVzZSgiZW5jb2RlZCIpOwotICAgIHNvYXBCb2R5LmdldEVuY29kaW5nU3R5bGVzKCkuYWRkKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgIHNvYXBCb2R5LnNldE5hbWVzcGFjZVVSSSgiaHR0cDovL3d3dy50ZW1wZXJhdHVyZS5jb20vIik7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgQmluZGluZyBPdXRwdXQKLSAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgYmluZGluZ091cHV0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBCb2R5KTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEJpbmRpbmdPdXRwdXQoYmluZGluZ091cHV0KTsKLSAgICAKLSAgICAvLwotICAgIC8vIEZpbmFsbHksIHdlIGFyZSBidWlsZGluZyBhIFNlcnZpY2UKLSAgICAvLwotCi0gICAgLy8gQ3JlYXRlIGEgU09BUCBBZGRyZXNzCi0gICAgU09BUEFkZHJlc3Mgc29hcEFkZHJlc3MgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEFkZHJlc3MoKTsKLSAgICBzb2FwQWRkcmVzcy5zZXRMb2NhdGlvblVSSSgiaHR0cDovL3RvZG8tc29tZS1hZGRyZXNzLyIpOwotCi0gICAgLy8gQ3JlYXRlIGEgUG9ydCAtIEdldFRlbXBlcmF0dXJlSW5mb1NPQVAKLSAgICBQb3J0IHBvcnQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9ydCgpOwotICAgIHBvcnQuc2V0TmFtZSgiR2V0VGVtcGVyYXR1cmVJbmZvU09BUCIpOwotICAgIHBvcnQuc2V0QmluZGluZyhiaW5kaW5nKTsKLSAgICBwb3J0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBBZGRyZXNzKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSBTZXJ2aWNlIC0gVGVtcGVyYXR1cmVTZXJ2aWNlCi0gICAgU2VydmljZSBzZXJ2aWNlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2UoKTsKLSAgICBzZXJ2aWNlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCJUZW1wZXJhdHVyZVNlcnZpY2UiKSk7Ci0gICAgc2VydmljZS5hZGRQb3J0KHBvcnQpOwotICAgIGRlZmluaXRpb24uYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAKLSAgICAvLwotICAgIC8vIFBoZXcsIHdlIGFyZSBkb25lLiBMZXQncyBzZXJpYWxpemUgaXQuCi0gICAgLy8KLSAgICAKLSAgICByZXNvdXJjZS5zYXZlKG51bGwpOwotIAotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluaXQoKQotICB7Ci0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOyAgCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvRGVmaW5pdGlvbkxvYWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvRGVmaW5pdGlvbkxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGNiMjk1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL0RlZmluaXRpb25Mb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWZpbml0aW9uTG9hZGVyCi17Ci0gIHsKLSAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhlIGZvbGxvd2luZyBpbiB0aGUgcGx1Z2luLnhtbAotICAgIC8vCi0gICAgLy8gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLmVtZi5leHRlbnNpb25fcGFyc2VyIj4KLSAgICAvLyAgICAgPHBhcnNlciB0eXBlPSJ3c2RsIiBjbGFzcz0iY29tLmlibS5ldG9vbHMud3NkbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsIi8+Ci0gICAgLy8gICA8L2V4dGVuc2lvbj4KLSAgICAvLwotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExQYWNrYWdlIHBrZyA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgCi0gICAgLy8gV2UgbmVlZCB0aGlzIGZvciBYU0QgPGltcG9ydD4uCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoInhzZCIsIG5ldyBYU0RSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFhTRFBhY2thZ2UgeHNkcGtnID0gWFNEUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIG9ubHkuCi0gICAqLwotICBwcml2YXRlIERlZmluaXRpb25Mb2FkZXIoKQotICB7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIERlZmluaXRpb24gbG9hZChTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIGxvYWQoZmlsZW5hbWUsZmFsc2UpOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBEZWZpbml0aW9uIGxvYWQoU3RyaW5nIGZpbGVuYW1lLCBib29sZWFuIHVzZUV4dGVuc2lvbkZhY3RvcmllcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBVUkkgdXJpOwotICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKLSAgICBpZiAoZmlsZS5pc0ZpbGUoKSkKLSAgICAgIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvU3RyaW5nKCkpOwotICAgIGVsc2UKLSAgICB7IC8vIEFzc3VtZSB0aGF0IHRoaXMgaXMgcnVuIGFzIGEgSlVuaXQgUGx1Zy1pbiB0ZXN0LgotICAgICAgLy91cmkgPSBVUkkuY3JlYXRlVVJJKGZpbGVuYW1lKTsKLSAgICAgIElQbHVnaW5EZXNjcmlwdG9yIHBkID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIpOwotICAgICAgVVJMIHVybCA9IHBkLmdldEluc3RhbGxVUkwoKTsKLSAgICAgIHVybCA9IG5ldyBVUkwodXJsLGZpbGVuYW1lKTsKLSAgICAgIFN0cmluZyBzID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldEZpbGUoKTsKLSAgICAgIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHMpOwotICAgIH0KLSAgCi0gICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0gICAgcmVzb3VyY2VTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5KCkpOwotICAgIHJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAKLSAgICBXU0RMUmVzb3VyY2VJbXBsIHdzZGxNYWluUmVzb3VyY2UgPSAoV1NETFJlc291cmNlSW1wbClyZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLndzZGwiKSk7Ci0gICAgd3NkbE1haW5SZXNvdXJjZS5zZXRVUkkodXJpKTsKLSAgICBqYXZhLnV0aWwuTWFwIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBtYXAucHV0KFdTRExSZXNvdXJjZUltcGwuQ09OVElOVUVfT05fTE9BRF9FUlJPUixCb29sZWFuLnZhbHVlT2YodHJ1ZSkpOwotICAgIG1hcC5wdXQoV1NETFJlc291cmNlSW1wbC5VU0VfRVhURU5TSU9OX0ZBQ1RPUklFUyxCb29sZWFuLnZhbHVlT2YodXNlRXh0ZW5zaW9uRmFjdG9yaWVzKSk7Ci0gICAgd3NkbE1haW5SZXNvdXJjZS5sb2FkKG1hcCk7Ci0gIAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciByZXNvdXJjZXMgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyByZXNvdXJjZXMuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT2JqZWN0IHJlc291cmNlID0gcmVzb3VyY2VzLm5leHQoKTsKLSAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpCi0gICAgICB7Ci0gICAgICAgIFdTRExSZXNvdXJjZUltcGwgd3NkbFJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpcmVzb3VyY2U7Ci0gICAgICAgIGRlZmluaXRpb24gPSB3c2RsUmVzb3VyY2UuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIHZvaWQgc3RvcmUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWZpbml0aW9uLmVSZXNvdXJjZSgpOwotICAgIHJlc291cmNlLnNldFVSSShVUkkuY3JlYXRlRmlsZVVSSShmaWxlbmFtZSkpOwotICAgIHJlc291cmNlLnNhdmUobnVsbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL0RlZmluaXRpb25WaXNpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9EZWZpbml0aW9uVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODE0MTEzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL0RlZmluaXRpb25WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVmaW5pdGlvblZpc2l0b3IgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICAKLSAgLyoqCi0gICAqIFVzZSBEZWZpbml0aW9uVmlzaXRvcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAqLwotICBwcml2YXRlIERlZmluaXRpb25WaXNpdG9yKCkKLSAgewotICB9Ci0gIAotICAvLyBBZGRlZCBmb3IgSlVuaXQKLSAgcHVibGljIERlZmluaXRpb25WaXNpdG9yKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBEZWZpbml0aW9uVmlzaXRvcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICB9Ci0KLSAgLy8gbWFpbiBlbnRyeQotICBwdWJsaWMgdm9pZCB2aXNpdCgpCi0gIHsKLSAgICB2aXNpdERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZikKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmLmdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRJbXBvcnQoKEltcG9ydClpdGVyYXRvci5uZXh0KCkpOwotICAgIAotICAgIFR5cGVzIHR5cGVzID0gZGVmLmdldEVUeXBlcygpOwotICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgdmlzaXRUeXBlcyh0eXBlcyk7Ci0KLSAgICBpdGVyYXRvciA9IGRlZi5nZXRFTWVzc2FnZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdE1lc3NhZ2UoKE1lc3NhZ2UpaXRlcmF0b3IubmV4dCgpKTsKLSAgICAKLSAgICBpdGVyYXRvciA9IGRlZi5nZXRFUG9ydFR5cGVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRQb3J0VHlwZSgoUG9ydFR5cGUpaXRlcmF0b3IubmV4dCgpKTsKLQotICAgIGl0ZXJhdG9yID0gZGVmLmdldEVCaW5kaW5ncygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0QmluZGluZygoQmluZGluZylpdGVyYXRvci5uZXh0KCkpOwotICAgIAotICAgIGl0ZXJhdG9yID0gZGVmLmdldEVTZXJ2aWNlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0U2VydmljZSgoU2VydmljZSlpdGVyYXRvci5uZXh0KCkpOwotCi0gICAgaXRlcmF0b3IgPSBkZWYuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoZGVmLChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotCi0gIH0KLSAgCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHZpc2l0SW1wb3J0KEltcG9ydCB3c2RsSW1wb3J0KTsKLSAgCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHZpc2l0VHlwZXMoVHlwZXMgdHlwZXMpOwotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0TWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2UuZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRQYXJ0KChQYXJ0KWl0ZXJhdG9yLm5leHQoKSk7IAotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgdmlzaXRQYXJ0KFBhcnQgcGFydCk7Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0T3BlcmF0aW9uKChPcGVyYXRpb24paXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIElucHV0IGlucHV0ID0gb3BlcmF0aW9uLmdldEVJbnB1dCgpOwotICAgIHZpc2l0SW5wdXQoKElucHV0KWlucHV0KTsgIAotICAgIAotICAgIE91dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0RU91dHB1dCgpOwotICAgIHZpc2l0T3V0cHV0KChPdXRwdXQpb3V0cHV0KTsgCi0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBvcGVyYXRpb24uZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RmF1bHQoKEZhdWx0KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZpc2l0SW5wdXQoSW5wdXQgaW5wdXQpOwotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0IG91dHB1dCk7Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aXNpdEZhdWx0KEZhdWx0IGZhdWx0KTsKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0QmluZGluZ09wZXJhdGlvbigoQmluZGluZ09wZXJhdGlvbilpdGVyYXRvci5uZXh0KCkpOwotCi0gICAgaXRlcmF0b3IgPSBiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KGJpbmRpbmcsKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIEJpbmRpbmdJbnB1dCBpbnB1dCA9IG9wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCk7Ci0gICAgdmlzaXRCaW5kaW5nSW5wdXQoKEJpbmRpbmdJbnB1dClpbnB1dCk7ICAKLSAgICAKLSAgICBCaW5kaW5nT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpOwotICAgIHZpc2l0QmluZGluZ091dHB1dCgoQmluZGluZ091dHB1dClvdXRwdXQpOyAKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0QmluZGluZ0ZhdWx0KChCaW5kaW5nRmF1bHQpaXRlcmF0b3IubmV4dCgpKTsKLSAgICAKLSAgICBpdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChvcGVyYXRpb24sKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGlucHV0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KGlucHV0LChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG91dHB1dC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChvdXRwdXQsKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0ZhdWx0KEJpbmRpbmdGYXVsdCBmYXVsdCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmF1bHQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoZmF1bHQsKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0UG9ydCgoUG9ydClpdGVyYXRvci5uZXh0KCkpOwotCi0gICAgaXRlcmF0b3IgPSBzZXJ2aWNlLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KHNlcnZpY2UsKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydChQb3J0IHBvcnQpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHBvcnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQocG9ydCwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICAoRXh0ZW5zaWJsZUVsZW1lbnQgb3duZXIsCi0gICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvV1NETDRKRGVmaW5pdGlvblZpc2l0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1dTREw0SkRlZmluaXRpb25WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjljOGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvV1NETDRKRGVmaW5pdGlvblZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBqYXZheC53c2RsLio7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETDRKRGVmaW5pdGlvblZpc2l0b3IgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICAKLSAgLyoqCi0gICAqIFVzZSBEZWZpbml0aW9uVmlzaXRvcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAqLwotICBwcml2YXRlIFdTREw0SkRlZmluaXRpb25WaXNpdG9yKCkKLSAgewotICB9Ci0gIAotICAvLyBBZGRlZCBmb3IgSlVuaXQKLSAgcHVibGljIFdTREw0SkRlZmluaXRpb25WaXNpdG9yKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBXU0RMNEpEZWZpbml0aW9uVmlzaXRvcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICB9Ci0KLSAgLy8gbWFpbiBlbnRyeQotICBwdWJsaWMgdm9pZCB2aXNpdCgpCi0gIHsKLSAgICB2aXNpdERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZikKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmLmdldEltcG9ydHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0SW1wb3J0KChJbXBvcnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgICAKLSAgICBUeXBlcyB0eXBlcyA9IGRlZi5nZXRUeXBlcygpOwotICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgdmlzaXRUeXBlcyh0eXBlcyk7Ci0KLSAgICBpdGVyYXRvciA9IGRlZi5nZXRNZXNzYWdlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0TWVzc2FnZSgoTWVzc2FnZSlpdGVyYXRvci5uZXh0KCkpOwotICAgIAotICAgIGl0ZXJhdG9yID0gZGVmLmdldFBvcnRUeXBlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0UG9ydFR5cGUoKFBvcnRUeXBlKWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IGRlZi5nZXRCaW5kaW5ncygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0QmluZGluZygoQmluZGluZylpdGVyYXRvci5uZXh0KCkpOwotICAgIAotICAgIGl0ZXJhdG9yID0gZGVmLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRTZXJ2aWNlKChTZXJ2aWNlKWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IGRlZi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotCi0gIH0KLSAgCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHZpc2l0SW1wb3J0KEltcG9ydCB3c2RsSW1wb3J0KTsKLSAgCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHZpc2l0VHlwZXMoVHlwZXMgdHlwZXMpOwotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0TWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2UuZ2V0UGFydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdFBhcnQoKFBhcnQpaXRlcmF0b3IubmV4dCgpKTsgCi0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBhcnQoUGFydCBwYXJ0KTsKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdE9wZXJhdGlvbigoT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBJbnB1dCBpbnB1dCA9IG9wZXJhdGlvbi5nZXRJbnB1dCgpOwotICAgIHZpc2l0SW5wdXQoKElucHV0KWlucHV0KTsgIAotICAgIAotICAgIE91dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0T3V0cHV0KCk7Ci0gICAgdmlzaXRPdXRwdXQoKE91dHB1dClvdXRwdXQpOyAKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRGYXVsdHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RmF1bHQoKEZhdWx0KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZpc2l0SW5wdXQoSW5wdXQgaW5wdXQpOwotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0IG91dHB1dCk7Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aXNpdEZhdWx0KEZhdWx0IGZhdWx0KTsKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKChCaW5kaW5nT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IGJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgQmluZGluZ0lucHV0IGlucHV0ID0gb3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgIHZpc2l0QmluZGluZ0lucHV0KChCaW5kaW5nSW5wdXQpaW5wdXQpOyAgCi0gICAgCi0gICAgQmluZGluZ091dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpOwotICAgIHZpc2l0QmluZGluZ091dHB1dCgoQmluZGluZ091dHB1dClvdXRwdXQpOyAKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHRzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEJpbmRpbmdGYXVsdCgoQmluZGluZ0ZhdWx0KWl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgCi0gICAgaXRlcmF0b3IgPSBvcGVyYXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLQotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBpbnB1dCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gaW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBvdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGZhdWx0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBmYXVsdC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmljZS5nZXRQb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0UG9ydCgoUG9ydClpdGVyYXRvci5uZXh0KCkpOwotCi0gICAgaXRlcmF0b3IgPSBzZXJ2aWNlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydChQb3J0IHBvcnQpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9XU0RMQ29udmVydGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9XU0RMQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMTVlOTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvV1NETENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgY2xhc3MgV1NETENvbnZlcnRlciBleHRlbmRzIERlZmluaXRpb25WaXNpdG9yCi17Ci0gIHByaXZhdGUgRG9jdW1lbnQgZG9jOwotICBwcml2YXRlIEVsZW1lbnQgZGVzY3JpcHRpb247Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50VHlwZXM7Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50U2VydmljZTsKLSAgcHJpdmF0ZSBFbGVtZW50IGN1cnJlbnRFbmRwb2ludDsKLSAgcHJpdmF0ZSBFbGVtZW50IGN1cnJlbnRJbnRlcmZhY2U7Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50T3BlcmF0aW9uOwotICAKLSAgcHJpdmF0ZSBFbGVtZW50IGN1cnJlbnRCaW5kaW5nOwotICBwcml2YXRlIEVsZW1lbnQgY3VycmVudEJpbmRpbmdPcGVyYXRpb247Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50QmluZGluZ0lucHV0OwotICBwcml2YXRlIEVsZW1lbnQgY3VycmVudEJpbmRpbmdPdXRwdXQ7Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50QmluZGluZ0ZhdWx0OwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbE5hbWVzcGFjZVByZWZpeDsKLSAgcHJpdmF0ZSBTdHJpbmcgeHNkTmFtZXNwYWNlUHJlZml4OwotICAKLSAgewotICAgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgZm9sbG93aW5nIGluIHRoZSBwbHVnaW4ueG1sCi0gICAgLy8KLSAgICAvLyAgIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2UuZW1mLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgIC8vICAgICA8cGFyc2VyIHR5cGU9IndzZGwiIGNsYXNzPSJjb20uaWJtLmV0b29scy53c2RsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGwiLz4KLSAgICAvLyAgIDwvZXh0ZW5zaW9uPgotICAgIC8vCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAKLSAgICAvLyBXZSBuZWVkIHRoaXMgZm9yIFhTRCA8aW1wb3J0Pi4KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsKLSAgfQotICAKLSAgLy8gQWRkZWQgZm9yIEpVbml0Ci0gIHB1YmxpYyBXU0RMQ29udmVydGVyKFN0cmluZyBuYW1lKSAKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIGRlZmluaXRpb24KLSAgICovCi0gIHB1YmxpYyBXU0RMQ29udmVydGVyKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGRlZmluaXRpb24pOwotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGUyMChTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGNyZWF0ZURvY3VtZW50KCk7Ci0gICAgdmlzaXQoKTsKLSAgICBzZXJpYWxpemUoZmlsZW5hbWUpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2VyaWFsaXplKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jKTsKLSAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsInllcyIpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIlVURi04Iik7Ci0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwiNCIpOwotICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShkb21Tb3VyY2UsbmV3IFN0cmVhbVJlc3VsdChuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSkpKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURvY3VtZW50KCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIGRvYyA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotICB9Ci0gIAotICBwcml2YXRlIEVsZW1lbnQgY3JlYXRlV1NETEVsZW1lbnQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwiLG5hbWUpOwotICAgIGlmICh3c2RsTmFtZXNwYWNlUHJlZml4ICE9IG51bGwpCi0gICAgICBlbGVtZW50LnNldFByZWZpeCh3c2RsTmFtZXNwYWNlUHJlZml4KTsKLSAgICAKLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEb2N1bWVudGF0aW9uKEVsZW1lbnQgZG9jRWxlbWVudCwgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICBpZiAoZG9jRWxlbWVudCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgRWxlbWVudCBhZG9wdGVkRG9jRWxlbWVudCA9IChFbGVtZW50KWRvYy5pbXBvcnROb2RlKGRvY0VsZW1lbnQsdHJ1ZSk7Ci0gICAgcGFyZW50LmFwcGVuZENoaWxkKGFkb3B0ZWREb2NFbGVtZW50KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgZGVzY3JpcHRpb24gPSBjcmVhdGVXU0RMRWxlbWVudCgiZGVzY3JpcHRpb24iKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihkZWYuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxkZXNjcmlwdGlvbik7Ci0gICAgCi0gICAgLy8gVEJEIC0gRGV0ZXJtaW5lIGxhdGVyIGlmIHdlIHdhbnQgdG8gY29udmVydCB0aGUgZG9jdW1lbnQgdG8gdXNlIFNPQVAgMS4yLgotICAgIC8vIEhvd2V2ZXIgYWRkaW5nIHRoZXNlIHR3byBuYW1lc3BhY2VzIG1heSBub3QgYmUgaGFybWZ1bC4KLSAgICBkZXNjcmlwdGlvbi5zZXRBdHRyaWJ1dGUoInhtbG5zOnNvYXBlbnYiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcCIpOwotICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6d3NvYXAiLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3NvYXAxMiIpOwotCi0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICBkZXNjcmlwdGlvbi5zZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGRlZi5nZXROYW1lc3BhY2VzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAvKgotCXhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotCQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiovCi0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwcmVmaXggPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG5hbWVzcGFjZSA9IGRlZi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgIAotICAgICAgaWYgKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAJaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSAvLyBtZWFudCB0byBiZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgCSAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxucyIsImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbCIpOwotICAgICAgCWVsc2UKLSAgICAgIAl7Ci0gICAgICAgICAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwiKTsKLSAgICAgICAgICB3c2RsTmFtZXNwYWNlUHJlZml4ID0gcHJlZml4OwotICAgICAgICAgIGRlc2NyaXB0aW9uLnNldFByZWZpeCh3c2RsTmFtZXNwYWNlUHJlZml4KTsKLSAgICAgIAl9Ci0gICAgICAJY29udGludWU7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIFNPQVAgMS4yCi0gICAgICBpZiAoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgewotICAgICAgCS8vIFNPQVAgMS4yCi0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeCwiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3AiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdTREwgMi4wIGJpbmRpbmcgZm9yIFNPQVAgMS4yCi0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6d3NvYXAiLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3NvYXAxMiIpOwotICAgICAgCWNvbnRpbnVlOwotICAgICAgfQotICAgICAgCi0gICAgICAvL2lmICgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgLy8gIGNvbnRpbnVlOwotICAgICAgCi0gICAgICBpZiAoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgeHNkTmFtZXNwYWNlUHJlZml4ID0gcHJlZml4OyAvLyBXZSB3aWxsIHVzZSB0aGlzIGluIHZpc2l0SW1wb3J0KCkuCi0gICAgICAKLSAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkgLy8gbWVhbnQgdG8gYmUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxucyIgKyBwcmVmaXgsbmFtZXNwYWNlKTsKLSAgICAgIGVsc2UKLSAgICAgICAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LG5hbWVzcGFjZSk7Ci0gICAgfQotICAgIAotICAgIGRvYy5hcHBlbmRDaGlsZChkZXNjcmlwdGlvbik7Ci0gICAgc3VwZXIudmlzaXREZWZpbml0aW9uKGRlZik7Ci0gICAgCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0SW1wb3J0KG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0SW1wb3J0KEltcG9ydCB3c2RsSW1wb3J0KQotICB7Ci0gICAgLy8gRGV0ZXJtaW5lIGlmIHdlIDxpbXBvcnQ+IGEgc2NoZW1hLgotICAgIGlmIChpbXBvcnRpbmdTY2hlbWEod3NkbEltcG9ydCkpCi0gICAgewotICAgICAgY3VycmVudFR5cGVzID0gY3JlYXRlV1NETEVsZW1lbnQoInR5cGVzIik7Ci0gICAgICBkZXNjcmlwdGlvbi5hcHBlbmRDaGlsZChjdXJyZW50VHlwZXMpOwotICAgICAgCi0gICAgICAvLyAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9mb28uY29tIiBzY2hlbWFMb2NhdGlvbj0gImJhci54c2QiLz4KLSAgICAgIEVsZW1lbnQgc2NoZW1hSW1wb3J0ID0gZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCJpbXBvcnQiKTsKLSAgICAgIGlmICh4c2ROYW1lc3BhY2VQcmVmaXggPT0gbnVsbCkgLy8gbmVlZCB0byBhZGQgb25lCi0gICAgICB7Ci0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6eHMiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICB4c2ROYW1lc3BhY2VQcmVmaXggPSAieHMiOwotICAgICAgICBzY2hlbWFJbXBvcnQuc2V0UHJlZml4KHhzZE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghIiIuZXF1YWxzKHhzZE5hbWVzcGFjZVByZWZpeCkpIC8vIGl0IGlzIG5vdCBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgCXNjaGVtYUltcG9ydC5zZXRQcmVmaXgoeHNkTmFtZXNwYWNlUHJlZml4KTsKLSAgICAgIAotICAgICAgc2NoZW1hSW1wb3J0LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIix3c2RsSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIHNjaGVtYUltcG9ydC5zZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIix3c2RsSW1wb3J0LmdldExvY2F0aW9uVVJJKCkpOwotICAgICAgcHJvY2Vzc0RvY3VtZW50YXRpb24od3NkbEltcG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLHNjaGVtYUltcG9ydCk7Ci0gICAgICBjdXJyZW50VHlwZXMuYXBwZW5kQ2hpbGQoc2NoZW1hSW1wb3J0KTsKLSAgICB9Ci0gIAllbHNlCi0gICAgewotICAgICAgRWxlbWVudCBpbXBvcnRFbGVtZW50ID0gd3NkbEltcG9ydC5nZXRFbGVtZW50KCk7Ci0gICAgICBFbGVtZW50IGFkb3B0ZWRJbXBvcnRFbGVtZW50ID0gKEVsZW1lbnQpZG9jLmltcG9ydE5vZGUoaW1wb3J0RWxlbWVudCx0cnVlKTsKLSAgICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKHdzZGxJbXBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxhZG9wdGVkSW1wb3J0RWxlbWVudCk7Ci0gICAgICBkZXNjcmlwdGlvbi5hcHBlbmRDaGlsZChhZG9wdGVkSW1wb3J0RWxlbWVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gaW1wb3J0aW5nU2NoZW1hKEltcG9ydCBteUltcG9ydCkKLSAgewotICAgIGlmIChteUltcG9ydC5nZXREZWZpbml0aW9uKCkgIT0gbnVsbCkgLy8gaXQgaXMgV1NETCBpbXBvcnQKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0VHlwZXMob3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXMpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFR5cGVzKFR5cGVzIHR5cGVzKQotICB7Ci0gIAkvLyBjdXJyZW50VHlwZXMgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGluIHZpc2l0SW1wb3J0KCkuCi0gICAgaWYgKGN1cnJlbnRUeXBlcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRUeXBlcyA9IGNyZWF0ZVdTRExFbGVtZW50KCJ0eXBlcyIpOwotICAgICAgcHJvY2Vzc0RvY3VtZW50YXRpb24odHlwZXMuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50VHlwZXMpOwotICAgICAgZGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQoY3VycmVudFR5cGVzKTsKLSAgICB9Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlcy5nZXRTY2hlbWFzKCkuaXRlcmF0b3IoKTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gbnVsbDsKLSAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBudWxsOwotICAgIEVsZW1lbnQgYWRvcHRlZFNjaGVtYUVsZW1lbnQgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgc2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBzY2hlbWEudXBkYXRlRWxlbWVudCgpOwotICAgICAgc2NoZW1hRWxlbWVudCA9IHNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICBhZG9wdGVkU2NoZW1hRWxlbWVudCA9IChFbGVtZW50KWRvYy5pbXBvcnROb2RlKHNjaGVtYUVsZW1lbnQsdHJ1ZSk7Ci0gICAgICBjdXJyZW50VHlwZXMuYXBwZW5kQ2hpbGQoYWRvcHRlZFNjaGVtYUVsZW1lbnQpOwotICAgIH0gICAgCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdFBhcnQob3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UGFydChQYXJ0IHBhcnQpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgY3VycmVudEludGVyZmFjZSA9IGNyZWF0ZVdTRExFbGVtZW50KCJpbnRlcmZhY2UiKTsKLSAgCXByb2Nlc3NEb2N1bWVudGF0aW9uKHBvcnRUeXBlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEludGVyZmFjZSk7Ci0gIAkKLSAgICBFbGVtZW50IHBvcnRUeXBlRWxlbWVudCA9IHBvcnRUeXBlLmdldEVsZW1lbnQoKTsKLSAgICBpZiAocG9ydFR5cGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgibmFtZSIpKQotICAgICAgY3VycmVudEludGVyZmFjZS5zZXRBdHRyaWJ1dGUoIm5hbWUiLHBvcnRUeXBlRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgCi0gICAgZGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQoY3VycmVudEludGVyZmFjZSk7Ci0gICAgc3VwZXIudmlzaXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBjdXJyZW50T3BlcmF0aW9uID0gY3JlYXRlV1NETEVsZW1lbnQoIm9wZXJhdGlvbiIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKG9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLGN1cnJlbnRPcGVyYXRpb24pOwotCQotICAgIEVsZW1lbnQgb3BlcmF0aW9uRWxlbWVudCA9IG9wZXJhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKG9wZXJhdGlvbkVsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0gICAgICBjdXJyZW50T3BlcmF0aW9uLnNldEF0dHJpYnV0ZSgibmFtZSIsb3BlcmF0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0KLSAgICBPcGVyYXRpb25UeXBlIG9wVHlwZSA9IG9wZXJhdGlvbi5nZXRTdHlsZSgpOwotICAgIGlmIChPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UgPT0gb3BUeXBlKQotICAgICAgY3VycmVudE9wZXJhdGlvbi5zZXRBdHRyaWJ1dGUoInBhdHRlcm4iLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzAzL3dzZGwvaW4tb3V0Iik7Ci0gICAgZWxzZSBpZiAoT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFID09IG9wVHlwZSkKLSAgICAgICAgY3VycmVudE9wZXJhdGlvbi5zZXRBdHRyaWJ1dGUoInBhdHRlcm4iLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzAzL3dzZGwvb3V0LWluIik7Ci0gICAgZWxzZSBpZiAoT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT04gPT0gb3BUeXBlKQotICAgICAgICBjdXJyZW50T3BlcmF0aW9uLnNldEF0dHJpYnV0ZSgicGF0dGVybiIsImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDMvd3NkbC9vdXQtb25seSIpOwotICAgIGVsc2UgaWYgKE9wZXJhdGlvblR5cGUuT05FX1dBWSA9PSBvcFR5cGUpCi0gICAgICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0QXR0cmlidXRlKCJwYXR0ZXJuIiwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wMy93c2RsL2luLW9ubHkiKTsKLSAgICAKLSAgICBjdXJyZW50SW50ZXJmYWNlLmFwcGVuZENoaWxkKGN1cnJlbnRPcGVyYXRpb24pOwotICAgIHN1cGVyLnZpc2l0T3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0SW5wdXQob3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdElucHV0KElucHV0IGlucHV0KQotICB7Ci0gICAgRWxlbWVudCBjdXJyZW50SW5wdXQgPSBjcmVhdGVXU0RMRWxlbWVudCgiaW5wdXQiKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLGN1cnJlbnRJbnB1dCk7Ci0gICAgCi0gICAgRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBpbnB1dC5nZXRFbGVtZW50KCk7Ci0gICAgCi0gICAgaWYgKGlucHV0RWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgIGN1cnJlbnRJbnB1dC5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2VMYWJlbCIsaW5wdXRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICAKLSAgICBFbGVtZW50IHBhcnRFbGVtZW50ID0gZ2V0UGFydEVsZW1lbnQoaW5wdXQpOwotICAgIGlmIChwYXJ0RWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKSkKLSAgICAgIGN1cnJlbnRJbnB1dC5zZXRBdHRyaWJ1dGUoImVsZW1lbnQiLHBhcnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZWxlbWVudCIpKTsKLSAgICAvLyBUQkQgLSB3aGF0IGlmIHRoZSBwYXJ0IHVzZXMgInR5cGUiPwotICAgIAotICAgIGN1cnJlbnRPcGVyYXRpb24uYXBwZW5kQ2hpbGQoY3VycmVudElucHV0KTsKLSAgfQotICAKLSAgcHJpdmF0ZSBFbGVtZW50IGdldFBhcnRFbGVtZW50KE1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZikKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVzc2FnZVJlZi5nZXRFTWVzc2FnZSgpLmdldEVQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgLy8gVEJEIC0gZm9yIG5vdywgdGFrZSB0aGUgZmlyc3QgcGFydC4KLSAgICBQYXJ0IHBhcnQgPSAoUGFydClpdGVyYXRvci5uZXh0KCk7Ci0gICAgRWxlbWVudCBwYXJ0RWxlbWVudCA9IHBhcnQuZ2V0RWxlbWVudCgpOwotICAgIHJldHVybiBwYXJ0RWxlbWVudDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0T3V0cHV0KG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBFbGVtZW50IGN1cnJlbnRPdXRwdXQgPSBjcmVhdGVXU0RMRWxlbWVudCgib3V0cHV0Iik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24ob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudE91dHB1dCk7Ci0gICAgCi0gICAgRWxlbWVudCBvdXRwdXRFbGVtZW50ID0gb3V0cHV0LmdldEVsZW1lbnQoKTsKLSAgICAKLSAgICBpZiAob3V0cHV0RWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgIGN1cnJlbnRPdXRwdXQuc2V0QXR0cmlidXRlKCJtZXNzYWdlTGFiZWwiLG91dHB1dEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgIAotICAgIEVsZW1lbnQgcGFydEVsZW1lbnQgPSBnZXRQYXJ0RWxlbWVudChvdXRwdXQpOwotICAgIGlmIChwYXJ0RWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKSkKLSAgICAgIGN1cnJlbnRPdXRwdXQuc2V0QXR0cmlidXRlKCJlbGVtZW50IixwYXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGUoImVsZW1lbnQiKSk7Ci0gICAgLy8gVEJEIC0gd2hhdCBpZiB0aGUgcGFydCB1c2VzICJ0eXBlIj8KLSAgICAKLSAgICBjdXJyZW50T3BlcmF0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRPdXRwdXQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRGYXVsdChvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RmF1bHQoRmF1bHQgZmF1bHQpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0QmluZGluZyhvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIGN1cnJlbnRCaW5kaW5nID0gY3JlYXRlV1NETEVsZW1lbnQoImJpbmRpbmciKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmcpOwotICAgIAotICAgIEVsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSBiaW5kaW5nLmdldEVsZW1lbnQoKTsKLSAgICBpZiAoYmluZGluZ0VsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0gICAgICBjdXJyZW50QmluZGluZy5zZXRBdHRyaWJ1dGUoIm5hbWUiLGJpbmRpbmdFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICBpZiAoYmluZGluZ0VsZW1lbnQuaGFzQXR0cmlidXRlKCJ0eXBlIikpCi0gICAgICBjdXJyZW50QmluZGluZy5zZXRBdHRyaWJ1dGUoImludGVyZmFjZSIsYmluZGluZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpOwotICAgIAotICAgIC8vIFRCRCAtIGlzIHRoZSBuZXh0IGxpbmUgZml4ZWQgZm9yIFNPQVA/Ci0gICAgY3VycmVudEJpbmRpbmcuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL3NvYXAxMiIpOwotICAgIGN1cnJlbnRCaW5kaW5nLnNldEF0dHJpYnV0ZSgid3NvYXA6cHJvdG9jb2wiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUCIpOwotICAgIGN1cnJlbnRCaW5kaW5nLnNldEF0dHJpYnV0ZSgid3NvYXA6bWVwRGVmYXVsdCIsImh0dHA6Ly93d3cudzMub3JnLjIwMDMvMDUvc29hcC9tZXAvcmVxdWVzdC1yZXNwb25zZSIpOwotCi0gICAgZGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQoY3VycmVudEJpbmRpbmcpOwotICAgIHN1cGVyLnZpc2l0QmluZGluZyhiaW5kaW5nKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24gPSBjcmVhdGVXU0RMRWxlbWVudCgib3BlcmF0aW9uIik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24ob3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmdPcGVyYXRpb24pOwotICAgIAotICAgIEVsZW1lbnQgb3BlcmF0aW9uRWxlbWVudCA9IG9wZXJhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpLmdldE5hbWUoKTsKLSAKLSAgICAvLyBEZXRlcm1pbmUgcHJlZml4Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWYgPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIGlmIChkZWYgIT0gbnVsbCkKLSAgICAgIHRhcmdldE5hbWVzcGFjZSA9IGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICBwcmVmaXggPSBkZWYuZ2V0UHJlZml4KHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgCi0gICAgaWYgKHByZWZpeCA9PSBudWxsKQotICAgICAgcHJlZml4ID0gIiI7Ci0gICAgZWxzZQotICAgICAgcHJlZml4ICs9ICI6IjsKLSAgICAgIAotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLnNldEF0dHJpYnV0ZSgicmVmIixwcmVmaXggKyBvcGVyYXRpb25OYW1lKTsKLSAgICAKLSAgICBjdXJyZW50QmluZGluZy5hcHBlbmRDaGlsZChjdXJyZW50QmluZGluZ09wZXJhdGlvbik7Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGlucHV0KQotICB7Ci0gICAgY3VycmVudEJpbmRpbmdJbnB1dCA9IGNyZWF0ZVdTRExFbGVtZW50KCJpbnB1dCIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKGlucHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmdJbnB1dCk7Ci0gICAgCi0gICAgRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBpbnB1dC5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIGlucHV0TmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICBpZiAoaW5wdXROYW1lICE9IG51bGwpCi0gICAgICBpbnB1dEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIixpbnB1dE5hbWUpOwotICAgIAotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRCaW5kaW5nSW5wdXQpOwotICAgIHN1cGVyLnZpc2l0QmluZGluZ0lucHV0KGlucHV0KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgY3VycmVudEJpbmRpbmdPdXRwdXQgPSBjcmVhdGVXU0RMRWxlbWVudCgib3V0cHV0Iik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24ob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmdPdXRwdXQpOwotICAgIAotICAgIEVsZW1lbnQgb3V0cHV0RWxlbWVudCA9IG91dHB1dC5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIG91dHB1dE5hbWUgPSBvdXRwdXQuZ2V0TmFtZSgpOwotICAgIGlmIChvdXRwdXROYW1lICE9IG51bGwpCi0gICAgICBvdXRwdXRFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsb3V0cHV0TmFtZSk7Ci0gICAgCi0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uYXBwZW5kQ2hpbGQoY3VycmVudEJpbmRpbmdPdXRwdXQpOwotICAgIHN1cGVyLnZpc2l0QmluZGluZ091dHB1dChvdXRwdXQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBjdXJyZW50QmluZGluZ0ZhdWx0ID0gY3JlYXRlV1NETEVsZW1lbnQoImZhdWx0Iik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24oZmF1bHQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50QmluZGluZ0ZhdWx0KTsKLSAgICAKLSAgICBFbGVtZW50IGZhdWx0RWxlbWVudCA9IGZhdWx0LmdldEVsZW1lbnQoKTsKLSAgICBTdHJpbmcgZmF1bHROYW1lID0gZmF1bHQuZ2V0TmFtZSgpOwotICAgIGlmIChmYXVsdE5hbWUgIT0gbnVsbCkKLSAgICAgIGZhdWx0RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGZhdWx0TmFtZSk7Ci0gICAgCi0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uYXBwZW5kQ2hpbGQoY3VycmVudEJpbmRpbmdGYXVsdCk7Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nRmF1bHQoZmF1bHQpOyAKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgY3VycmVudFNlcnZpY2UgPSBjcmVhdGVXU0RMRWxlbWVudCgic2VydmljZSIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKHNlcnZpY2UuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50U2VydmljZSk7Ci0gICAgCi0gICAgRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IHNlcnZpY2UuZ2V0RWxlbWVudCgpOwotICAgIGlmIChzZXJ2aWNlRWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgIGN1cnJlbnRTZXJ2aWNlLnNldEF0dHJpYnV0ZSgibmFtZSIsc2VydmljZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgIAotICAgIGRlc2NyaXB0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRTZXJ2aWNlKTsKLSAgICBzdXBlci52aXNpdFNlcnZpY2Uoc2VydmljZSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0UG9ydChvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIGN1cnJlbnRFbmRwb2ludCA9IGNyZWF0ZVdTRExFbGVtZW50KCJlbmRwb2ludCIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKHBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50RW5kcG9pbnQpOwotICAgIAotICAgIEVsZW1lbnQgcG9ydEVsZW1lbnQgPSBwb3J0LmdldEVsZW1lbnQoKTsKLSAgICBpZiAocG9ydEVsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0gICAgICBjdXJyZW50RW5kcG9pbnQuc2V0QXR0cmlidXRlKCJuYW1lIixwb3J0RWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgaWYgKHBvcnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgiYmluZGluZyIpKQotICAgICAgY3VycmVudEVuZHBvaW50LnNldEF0dHJpYnV0ZSgiYmluZGluZyIscG9ydEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJiaW5kaW5nIikpOwotICAgIAotICAgIC8vIEFkZCBpbnRlcmZhY2UgdG8gY3VycmVudCBzZXJ2aWNlCi0gICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRFQmluZGluZygpOwotICAgIGlmIChiaW5kaW5nICE9IG51bGwpIC8vIGJpbmRpbmcgY291bGQgbm90IGJlIHJlc29sdmVkCi0gICAgewotICAgICAgRWxlbWVudCBiaW5kaW5nRWxlbWVudCA9IGJpbmRpbmcuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGJpbmRpbmdFbGVtZW50Lmhhc0F0dHJpYnV0ZSgidHlwZSIpKQotICAgICAgICBjdXJyZW50U2VydmljZS5zZXRBdHRyaWJ1dGUoImludGVyZmFjZSIsYmluZGluZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpOwotICAgIH0KLSAgIAotICAgIGN1cnJlbnRTZXJ2aWNlLmFwcGVuZENoaWxkKGN1cnJlbnRFbmRwb2ludCk7Ci0gICAgc3VwZXIudmlzaXRQb3J0KHBvcnQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2libGVFbGVtZW50IG93bmVyLCBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgewotICAgIC8vIFRCRCAtIEl0IGlzIG5vdCBqdXN0IFNPQVAgYmluZGluZwotICAgIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuUG9ydEltcGwpCi0gICAgewotICAgICAgRWxlbWVudCBzb2FwRWxlbWVudCA9IGV4dGVuc2liaWxpdHlFbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChzb2FwRWxlbWVudC5oYXNBdHRyaWJ1dGUoImxvY2F0aW9uIikpCi0gICAgICAgIGN1cnJlbnRFbmRwb2ludC5zZXRBdHRyaWJ1dGUoImFkZHJlc3MiLHNvYXBFbGVtZW50LmdldEF0dHJpYnV0ZSgibG9jYXRpb24iKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSBleHRlbnNpYmlsaXR5RWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBFbGVtZW50IGFkb3B0ZWRET01FbGVtZW50ID0gKEVsZW1lbnQpZG9jLmltcG9ydE5vZGUoZG9tRWxlbWVudCx0cnVlKTsKLSAgICAgIAotICAgICAgaWYgKG93bmVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5EZWZpbml0aW9uSW1wbCkKLSAgICAgICAgZGVzY3JpcHRpb24uaW5zZXJ0QmVmb3JlKGFkb3B0ZWRET01FbGVtZW50LGRlc2NyaXB0aW9uLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuU2VydmljZUltcGwpCi0gICAgICAgIGN1cnJlbnRTZXJ2aWNlLmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50U2VydmljZS5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlBvcnRUeXBlSW1wbCkKLSAgICAgIAljdXJyZW50SW50ZXJmYWNlLmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50SW50ZXJmYWNlLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuT3BlcmF0aW9uSW1wbCkKLSAgICAgIAljdXJyZW50T3BlcmF0aW9uLmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50T3BlcmF0aW9uLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ0ltcGwpCi0gICAgICAJY3VycmVudEJpbmRpbmcuaW5zZXJ0QmVmb3JlKGFkb3B0ZWRET01FbGVtZW50LGN1cnJlbnRCaW5kaW5nLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwpCi0gICAgICAJY3VycmVudEJpbmRpbmdPcGVyYXRpb24uaW5zZXJ0QmVmb3JlKGFkb3B0ZWRET01FbGVtZW50LGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ0lucHV0SW1wbCkKLSAgICAgIAljdXJyZW50QmluZGluZ0lucHV0Lmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50QmluZGluZ0lucHV0LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ091dHB1dEltcGwpCi0gICAgICAJY3VycmVudEJpbmRpbmdPdXRwdXQuaW5zZXJ0QmVmb3JlKGFkb3B0ZWRET01FbGVtZW50LGN1cnJlbnRCaW5kaW5nT3V0cHV0LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuQmluZGluZ0ZhdWx0SW1wbCkKLSAgICAgIAljdXJyZW50QmluZGluZ0ZhdWx0Lmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50QmluZGluZ0ZhdWx0LmdldEZpcnN0Q2hpbGQoKSk7Ci0KLSAgICB9Ci0KLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgCi0gIHsKLSAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgCi0gICAgc3VpdGUuYWRkVGVzdAotICAgICAgKG5ldyBXU0RMQ29udmVydGVyKCJDb252ZXJ0IikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlc3RDb252ZXJ0KCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICApOwotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdENvbnZlcnQoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoImQ6L2VjbGlwc2UzMDEvZWNsaXBzZS93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvUFRBVGltZURpc3RyaWJ1dGlvbi53c2RsIik7Ci0gICAgICBXU0RMQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBXU0RMQ29udmVydGVyKGRlZik7Ci0gICAgICBjb252ZXJ0ZXIuZ2VuZXJhdGUyMCgiZDovZWNsaXBzZTMwMS9lY2xpcHNlL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9QVEFUaW1lRGlzdHJpYnV0aW9uMjAud3NkbCIpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9ICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgIC8qCi0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoYXJnc1swXSk7Ci0gICAgICBXU0RMQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBXU0RMQ29udmVydGVyKGRlZik7Ci0gICAgICBjb252ZXJ0ZXIuZ2VuZXJhdGUyMCgidGVzdDIwLndzZGwiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfSovCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1dTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZGFjMTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExNb2RlbExvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgcHJvdGVjdGVkIEN1c3RvbVdTRExNb2RlbExvY2F0b3IgY3VzdG9tV1NETE1vZGVsTG9jYXRvciA9IG5ldyBDdXN0b21XU0RMTW9kZWxMb2NhdG9yKCk7Ci0gIAotICBjbGFzcyBDdXN0b21XU0RMTW9kZWxMb2NhdG9yIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBXU0RMTW9kZWxMb2NhdG9yCi0gIHsKLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotICAgIHsKLSAgICAgIHJldHVybiBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBuYW1lc3BhY2UsIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXRwZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFdTRExNb2RlbExvY2F0b3IuY2xhc3M7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IFdTRExNb2RlbExvY2F0b3IuY2xhc3M7Ci0gIH0KLQotICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICB7Ci0gICAgcmV0dXJuIGN1c3RvbVdTRExNb2RlbExvY2F0b3I7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmJiYTg3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsIHNjaGVtYUxvY2F0b3IgPSBuZXcgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlci5jbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiBzY2hlbWFMb2NhdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWI4YzE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlcgotewotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVNjaGVtYUxvY2F0aW9uKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBzY2hlbWFMb2NhdGlvblVSSSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYmFzZUxvY2F0aW9uID0geHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7ICAgICAgCi0gICAgICByZXR1cm4gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbmFtZXNwYWNlVVJJLCBzY2hlbWFMb2NhdGlvblVSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGF0cGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzOwotICAgIH0gIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhNTgzZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0JPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQk8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotCTwhLS0gPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iIC8+IC0tPgotCQkKLQkJPGVjaG8gbWVzc2FnZT0iYmFzZWRpciAke2Jhc2VkaXJ9IiAvPgotCQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLQkKLQk8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0JPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiIC8+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0JPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLQk8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wLz4KLQkJPGRlbGV0ZT4KLQkJCTxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMuKnhtbCIgLz4KLQkJPC9kZWxldGU+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotCTx0YXJnZXQgbmFtZT0ic3VpdGUiPgotCQk8cHJvcGVydHkgbmFtZT0id3N0LWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS93c3RfZm9sZGVyIi8+Ci0JCTxkZWxldGUgZGlyPSIke3dzdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIAk8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIAkJPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3c3QtZm9sZGVyfSIvPgotICAgICAgCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgCQk8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMuQWxsVGVzdENhc2VzIiAvPgotICAgCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAJPC9hbnQ+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLQk8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0JPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotCTx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0JCTwhLS08ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIgLz4tLT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLQk8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0JCTxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLip4bWwiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiIC8+Ci0JCTwvYW50PgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTA5NTZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5jb20uaWJtLnNzZS5tb2RlbC5zdHJ1Y3R1cmVkYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjVkNjQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBXU0RMIFZhbGlkYXRvciBUZXN0cyBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IHdzZGx2YWxpZGF0ZXRlc3RzLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy5pbnRlcm5hbC5XU0RMVmFsaWRhdG9yVGVzdHNQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2UKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbgotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhNjg3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS53c2RsdmFsaWRhdGV0ZXN0cy5qYXIgPSBzcmMvCi1vdXRwdXQud3NkbHZhbGlkYXRldGVzdHMuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB3c2RsdmFsaWRhdGV0ZXN0cy5qYXIsXAotICAgICAgICAgICAgICAgdGVzdHJlc291cmNlcy8sXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcnVudGVzdHMuYmF0LFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmNjVmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL1VSSVJlc29sdmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ExNzIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciBsbWFuZGVsCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSBVUklSZXNvbHZlciB1cmlSZXNvbHZlciA9IG51bGw7Ci0gLyoqCi0gICogQ3JlYXRlIGEgdGVzdHMgc3VpdGUgZnJvbSB0aGlzIHRlc3QgY2xhc3MuCi0gICogCi0gICogQHJldHVybiBBIHRlc3Qgc3VpdGUgY29udGFpbmluZyB0aGlzIHRlc3QgY2xhc3MuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShVUklSZXNvbHZlclRlc3QuY2xhc3MpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotCXVyaVJlc29sdmVyID0gbmV3IFVSSVJlc29sdmVyKCk7CQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplQWJzb2x1dGVGaWxlKCkKLSAgewotICAJLy8gU3lzdGVtIGlkIGlzIGFic29sdXRlIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi9jOi9zb21lcGF0aC9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSAiZmlsZTovYzovc29tZXBhdGgvbXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoInN5c3RlbUlkIGlzIGFic29sdXRlIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksIHN5c3RlbUlkKTsKLSAgCQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplUmVsYXRpdmVGaWxlKCkKLSAgewotICAJLy8gU3lzdGVtIGlkIGlzIHJlbGF0aXZlIAotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi9jOi9zb21lcGF0aC9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSAibXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoInN5c3RlbUlkIGlzIHNpbXBsZSByZWxhdGl2ZSBhbmQgaXMgbm90IG1vZGlmaWVkIGNvcnJlY3RseS4iLCB1cmlSZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbnVsbCwgc3lzdGVtSWQpLCAiZmlsZTovYzovc29tZXBhdGgvc29tZXBhdGgvbXlmaWxlLnR4dCIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplUmVsYXRpdmVGaWxlU3RhcnRzV2l0aERvdERvdCgpCi0gIHsKLSAgICAvLyBTeXN0ZW0gaWQgaXMgcmVsYXRpdmUgd2l0aCAuLi8KLSAgCVN0cmluZyBiYXNlTG9jYXRpb24gPSAiZmlsZTovYzovc29tZXBhdGgvc29tZXBhdGgvZmlsZS50eHQiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gIi4uL215ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJzeXN0ZW1JZCBpcyByZWxhdGl2ZSB3aXRoIC4uLyBhbmQgaXMgbm90IG1vZGlmaWVkIGNvcnJlY3RseS4iLCB1cmlSZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbnVsbCwgc3lzdGVtSWQpLCAiZmlsZTovYzovc29tZXBhdGgvbXlmaWxlLnR4dCIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplUmVsYXRpdmVGaWxlU3RhcnRzV2l0aERvdERvdFR3aWNlKCkKLSAgewotICAgIC8vIFN5c3RlbSBpZCBpcyByZWxhdGl2ZSB3aXRoIC4uLy4uLwotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi9jOi9zb21lcGF0aC9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSAiLi4vLi4vbXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoInN5c3RlbUlkIGlzIHJlbGF0aXZlIHdpdGggLi4vLi4vIGFuZCBpcyBub3QgbW9kaWZpZWQgY29ycmVjdGx5LiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi9jOi9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVSZWxhdGl2ZUZpbGVTdGFydHNXaXRoRG90KCkKLSAgewotICAgIC8vIFN5c3RlbSBpZCBpcyByZWxhdGl2ZSB3aXRoIC4vCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gImZpbGU6L2M6L3NvbWVwYXRoL3NvbWVwYXRoL2ZpbGUudHh0IjsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICIuL215ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJzeXN0ZW1JZCBpcyByZWxhdGl2ZSB3aXRoIC4vIGFuZCBpcyBub3QgbW9kaWZpZWQgY29ycmVjdGx5LiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi9jOi9zb21lcGF0aC9zb21lcGF0aC9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVSZWxhdGl2ZUZpbGVTdGFydHNXaXRoRG90VHdpY2UoKQotICB7Ci0gICAgLy8gU3lzdGVtIGlkIGlzIHJlbGF0aXZlIHdpdGggLi8uLwotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi9jOi9zb21lcGF0aC9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSAiLi8uL215ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJzeXN0ZW1JZCBpcyByZWxhdGl2ZSB3aXRoIC4vLi8gYW5kIGlzIG5vdCBtb2RpZmllZCBjb3JyZWN0bHkuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgImZpbGU6L2M6L3NvbWVwYXRoL3NvbWVwYXRoL215ZmlsZS50eHQiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVJlbGF0aXZlRmlsZVN0YXJ0c1dpdGhTbGFzaCgpCi0gIHsKLSAgICAvLyBTeXN0ZW0gaWQgaXMgcmVsYXRpdmUgYmVnaW5uaW5nIHdpdGggLwotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi9jOi9zb21lcGF0aC9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSAiL215ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJzeXN0ZW1JZCBpcyByZWxhdGl2ZSBiZWdpbm5pbmcgd2l0aCAvIGFuZCBpcyBub3QgbW9kaWZpZWQgY29ycmVjdGx5LiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi9jOi9zb21lcGF0aC9zb21lcGF0aC9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVSZWxhdGl2ZUZpbGVEb3REb3RJbk1pZGRsZSgpCi0gIHsKLSAgICAvLyBTeXN0ZW0gaWQgY29udGFpbnMgLi4vIGluIHRoZSBtaWRkbGUKLSAgCVN0cmluZyBiYXNlTG9jYXRpb24gPSAiZmlsZTovYzovc29tZXBhdGgvc29tZXBhdGgvZmlsZS50eHQiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gInNvbWVwYXRoLy4uL215ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJzeXN0ZW1JZCBpcyByZWxhdGl2ZSBhbmQgY29udGFpbnMgLi4vIGluIHRoZSBtaWRkbGUgYW5kIGlzIG5vdCBtb2RpZmllZCBjb3JyZWN0bHkuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgImZpbGU6L2M6L3NvbWVwYXRoL3NvbWVwYXRoL215ZmlsZS50eHQiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVJlbGF0aXZlRmlsZUZvdEluTWlkZGxlKCkKLSAgewotICAgIC8vIFN5c3RlbSBpZCBjb250YWlucyAuLyBpbiB0aGUgbWlkZGxlCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gImZpbGU6L2M6L3NvbWVwYXRoL3NvbWVwYXRoL2ZpbGUudHh0IjsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICJzb21lcGF0aC8uL215ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJzeXN0ZW1JZCBpcyByZWxhdGl2ZSBhbmQgY29udGFpbnMgLi8gaW4gdGhlIG1pZGRsZSBhbmQgaXMgbm90IG1vZGlmaWVkIGNvcnJlY3RseS4iLCB1cmlSZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbnVsbCwgc3lzdGVtSWQpLCAiZmlsZTovYzovc29tZXBhdGgvc29tZXBhdGgvc29tZXBhdGgvbXlmaWxlLnR4dCIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWxpemVSZWxhdGl2ZUZpbGVEb3REb3RJbk1pZGRsZU9mQmFzZSgpCi0gIHsKLSAgICAvLyBCYXNlIGxvY2F0aW9uIGNvbnRhaW5zIC4uLyBpbiB0aGUgbWlkZGxlCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gImZpbGU6L2M6L3NvbWVwYXRoLy4uL3NvbWVwYXRoL2ZpbGUudHh0IjsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICJteWZpbGUudHh0IjsKLSAgCWFzc2VydEVxdWFscygiYmFzZUxvY2F0aW9uIGNvbnRhaW5zIC4uLyBpbiB0aGUgbWlkZGxlIGFuZCBpcyBub3QgbW9kaWZpZWQgY29ycmVjdGx5LiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi9jOi9zb21lcGF0aC9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVSZWxhdGl2ZUZpbGVEb3RJbk1pZGRsZU9mQmFzZSgpCi0gIHsKLSAgICAvLyBCYXNlIGxvY2F0aW9uIGNvbnRhaW5zIC4vIGluIHRoZSBtaWRkbGUKLSAgCVN0cmluZyBiYXNlTG9jYXRpb24gPSAiZmlsZTovYzovc29tZXBhdGgvLi9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSAibXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoImJhc2VMb2NhdGlvbiBjb250YWlucyAuLyBpbiB0aGUgbWlkZGxlIGFuZCBpcyBub3QgbW9kaWZpZWQgY29ycmVjdGx5LiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi9jOi9zb21lcGF0aC9zb21lcGF0aC9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVSZWxhdGl2ZUZpbGVCYXNlU3RhcnRzV2l0aFNsYXNoRG90RG90KCkKLSAgewotICAgIC8vIEJhc2UgbG9jYXRpb24gc3RhcnRzIHdpdGggLy4uLyAKLSAgCVN0cmluZyBiYXNlTG9jYXRpb24gPSAiZmlsZTovLi4vc29tZXBhdGgvZmlsZS50eHQiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gIm15ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJiYXNlTG9jYXRpb24gc3RhcnRzIHdpdGggLi4vIGFuZCBpcyBub3QgbW9kaWZpZWQgY29ycmVjdGx5LiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi8uLi9zb21lcGF0aC9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVSZWxhdGl2ZUZpbGVCYXNlU3RhcnRzV2l0aFNsYXNoRG90KCkKLSAgewotICAgIC8vIEJhc2UgbG9jYXRpb24gc3RhcnRzIHdpdGggLy4vCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gImZpbGU6Ly4vc29tZXBhdGgvZmlsZS50eHQiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gIm15ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJiYXNlTG9jYXRpb24gc3RhcnRzIHdpdGggLi8gYW5kIGlzIG5vdCBtb2RpZmllZCBjb3JyZWN0bHkuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgImZpbGU6L3NvbWVwYXRoL215ZmlsZS50eHQiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVJlbGF0aXZlRmlsZUJhc2VTdGFydHNXaXRoRG90RG90KCkKLSAgewotICAgIC8vIEJhc2UgbG9jYXRpb24gc3RhcnRzIHdpdGggLi4vIAotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi4uL3NvbWVwYXRoL2ZpbGUudHh0IjsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICJteWZpbGUudHh0IjsKLSAgCWFzc2VydEVxdWFscygiYmFzZUxvY2F0aW9uIHN0YXJ0cyB3aXRoIC4uLyBhbmQgaXMgbm90IG1vZGlmaWVkIGNvcnJlY3RseS4iLCB1cmlSZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbnVsbCwgc3lzdGVtSWQpLCAiZmlsZTouLi9zb21lcGF0aC9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVSZWxhdGl2ZUZpbGVCYXNlU3RhcnRzV2l0aERvdCgpCi0gIHsKLSAgICAvLyBCYXNlIGxvY2F0aW9uIHN0YXJ0cyB3aXRoIC4vIAotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi4vc29tZXBhdGgvZmlsZS50eHQiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gIm15ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJiYXNlTG9jYXRpb24gc3RhcnRzIHdpdGggLi8gYW5kIGlzIG5vdCBtb2RpZmllZCBjb3JyZWN0bHkuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgImZpbGU6c29tZXBhdGgvbXlmaWxlLnR4dCIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplUmVsYXRpdmVGaWxlU29tZWRpckRvdERvdCgpCi0gIHsKLSAgICAvLyBTeXN0ZW0gaWQgY29udGFpbnMgc29tZWRpci4uLyBpbiB0aGUgbWlkZGxlCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gImZpbGU6L3NvbWVwYXRoL2ZpbGUudHh0IjsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICJzb21lZGlyLi4vbXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoInN5c3RlbUlkIGhhcyBzb21lZGlyLi4vIGFuZCBpcyBub3QgbW9kaWZpZWQgY29ycmVjdGx5LiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi9zb21lcGF0aC9zb21lZGlyLi4vbXlmaWxlLnR4dCIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplUmVsYXRpdmVGaWxlU29tZWRpckRvdCgpCi0gIHsKLSAgICAvLyBTeXN0ZW0gaWQgY29udGFpbnMgc29tZWRpci4vIGluIHRoZSBtaWRkbGUKLSAgCVN0cmluZyBiYXNlTG9jYXRpb24gPSAiZmlsZTovc29tZXBhdGgvZmlsZS50eHQiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gInNvbWVkaXIuL215ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJzeXN0ZW1JZCBoYXMgc29tZWRpci4vIGFuZCBpcyBub3QgbW9kaWZpZWQgY29ycmVjdGx5LiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi9zb21lcGF0aC9zb21lZGlyLi9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVOdWxsU3lzdGVtSWQoKQotICB7Ci0gICAgLy8gU3lzdGVtIGlkIGlzIG51bGwKLSAgCVN0cmluZyBiYXNlTG9jYXRpb24gPSAiZmlsZTovc29tZXBhdGgvZmlsZS50eHQiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLSAgCWFzc2VydEVxdWFscygic3lzdGVtSWQgaXMgbnVsbC4iLCB1cmlSZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbnVsbCwgc3lzdGVtSWQpLCBudWxsKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZU51bGxCYXNlTG9jYXRpb24oKQotICB7Ci0gICAgLy8gQmFzZSBsb2NhdGlvbiBpcyBudWxsCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICJzb21lZGlyLi9teWZpbGUudHh0IjsKLSAgCWFzc2VydEVxdWFscygic3lzdGVtSWQgaXMgbnVsbC4iLCB1cmlSZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbnVsbCwgc3lzdGVtSWQpLCBudWxsKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVN5c3RlbUlkQWJzb2x1dGVOdWxsQmFzZUxvY2F0aW9uKCkKLSAgewotICAgIC8vIEJhc2UgbG9jYXRpb24gaXMgbnVsbAotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJudWxsIjsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICJmaWxlOi9zb21lZGlyLi9teWZpbGUudHh0IjsKLSAgCWFzc2VydEVxdWFscygic3lzdGVtSWQgaXMgbnVsbC4iLCB1cmlSZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbnVsbCwgc3lzdGVtSWQpLCAiZmlsZTovc29tZWRpci4vbXlmaWxlLnR4dCIpOwotICB9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvQWxsV1NETFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL0FsbFdTRExUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmJjMjRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvQWxsV1NETFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMuaW50ZXJuYWw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLlVSSVJlc29sdmVyVGVzdDsKLS8qKgotICogVGhlIHJvb3QgdGVzdCBzdWl0ZSB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlciBXU0RMIHZhbGlkYXRvciB0ZXN0IHN1aXRlcy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgQWxsV1NETFRlc3RzIGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZQotewotICAvKioKLSAgICogQ3JlYXRlIHRoaXMgdGVzdCBzdWl0ZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhpcyB0ZXN0IHN1aXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQWxsV1NETFRlc3RzKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIEFsbFdTRExUZXN0cygpCi0gIHsKLSAgICBzdXBlcigiQWxsV1NETFRlc3RzIik7Ci0gICAgYWRkVGVzdChYU0RUZXN0LnN1aXRlKCkpOwotICAgIGFkZFRlc3QoV1NETFRlc3Quc3VpdGUoKSk7Ci0gICAgYWRkVGVzdChQYXRoc1Rlc3Quc3VpdGUoKSk7Ci0gICAgYWRkVGVzdChVUklSZXNvbHZlclRlc3Quc3VpdGUoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL0Jhc2VUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9CYXNlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1ODUzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL0Jhc2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5Qcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5lY2xpcHNlLldTRExWYWxpZGF0b3I7Ci0KLS8qKgotICogQmFzZSB0ZXN0IGNhc2UgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgbWV0aG9kcyB0byAKLSAqIC0gY3JlYXRlIGxvZ3MKLSAqIC0gcmVhZCBmcm9tIGxvZ3MKLSAqIC0gcnVuIGxvZyBjb21wYXJpc29uIHRlc3RzCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIEJhc2VUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8vIjsgCi0gIHByb3RlY3RlZCBTdHJpbmcgUExVR0lOX0FCU09MVVRFX1BBVEg7Ci0gIHByb3RlY3RlZCBTdHJpbmcgU0FNUExFU19ESVIgPSAidGVzdHJlc291cmNlcy9zYW1wbGVzLyI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgR0VORVJBVEVEX1JFU1VMVFNfRElSID0gInRlc3RyZXNvdXJjZXMvZ2VuZXJhdGVkUmVzdWx0cy8iOwotICBwcm90ZWN0ZWQgU3RyaW5nIElERUFMX1JFU1VMVFNfRElSID0gInRlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzLyI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgTE9HX0ZJTEVfTE9DQVRJT04gPSAicmVzdWx0cy5sb2ciOwotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cyI7Ci0gIHByaXZhdGUgV1NETFZhbGlkYXRvciB2YWxpZGF0b3IgPSBXU0RMVmFsaWRhdG9yLmdldEluc3RhbmNlKCk7Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkKLSAgewotICAgIFBMVUdJTl9BQlNPTFVURV9QQVRIID0gV1NETFZhbGlkYXRvclRlc3RzUGx1Z2luLmdldFBsdWdpbkxvY2F0aW9uKCk7Ci0gICAgCi0gICAgLy8gU2V0IHRoZSBXUy1JIHByZWZlcmVuY2UgdG8gaWdub3JlIHNvIG9ubHkgV1NETCBlcnJvcnMgd2lsbCBiZSB0ZXN0ZWQuCi0JLy8gVE9ETzogUmUtZW5hYmxlIHRoaXMgV1MtSSBkaXNhYmxlbWVudCBjb2RlIG9uY2UgV1MgcHJlZmVyZW5jZSBwbHVnaW4gaXMgbW92ZWQgdG8gV1NULgotICAgIC8vV2ViU2VydmljZVVJUGx1Z2luIHdzdWkgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLSAgICAvL1BlcnNpc3RlbnRXU0lDb250ZXh0IHdzaWNvbnRleHQgPSB3c3VpLmdldFdTSVNTQlBDb250ZXh0KCk7Ci0gICAgLy93c2ljb250ZXh0LnVwZGF0ZVdTSUNvbXBsaWFuY2VzKFBlcnNpc3RlbnRXU0lDb250ZXh0LklHTk9SRV9OT05fV1NJKTsKLSAgICAvL3dzaWNvbnRleHQgPSB3c3VpLmdldFdTSUFQQ29udGV4dCgpOwotICAgIC8vd3NpY29udGV4dC51cGRhdGVXU0lDb21wbGlhbmNlcyhQZXJzaXN0ZW50V1NJQ29udGV4dC5JR05PUkVfTk9OX1dTSSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSdW4gYSB2YWxpZGF0b3IgdGVzdC4gVGhlIHRlc3Qgd2lsbCBydW4gdGhlIHZhbGlkYXRvciwgbG9nIHRoZSByZXN1bHRzIGFuZCBjb21wYXJlIHRoZSByZXN1bHRzCi0gICAqIHdpdGggdGhlIGlkZWFsIHJlc3VsdHMuIFRoZSB0ZXN0IHdpbGwgb25seSBwYXNzIGlmIHRoZSB0d28gbG9nIGZpbGVzIGFyZSB0aGUgc2FtZS4KLSAgICogCi0gICAqIEBwYXJhbSB0ZXN0ZmlsZSBUaGUgZmlsZSB0byBydW4gdGhlIHZhbGlkYXRvciB0ZXN0IG9uLgotICAgKiBAcGFyYW0gbG9nbG9jYXRpb24gVGhlIGxvY2F0aW9uIHRvIGNyZWF0ZSB0aGUgbG9nIGZpbGUuCi0gICAqIEBwYXJhbSBpZGVhbGxvZ2xvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgaWRlYWwgbG9nIGZpbGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW5UZXN0KFN0cmluZyB0ZXN0ZmlsZSwgU3RyaW5nIGxvZ2xvY2F0aW9uLCBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbikKLSAgewotICAgIElWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh0ZXN0ZmlsZSk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgY3JlYXRlTG9nKGxvZ2xvY2F0aW9uLCB2YWxyZXBvcnQpOwotICAgICAgU3RyaW5nIGdlbmVyYXRlZExvZyA9IGdldFN0cmluZ0Zyb21GaWxlKGxvZ2xvY2F0aW9uKTsKLSAgICAgIFN0cmluZyBpZGVhbExvZyA9IGdldFN0cmluZ0Zyb21GaWxlKGlkZWFsbG9nbG9jYXRpb24pOwotICAgICAgYXNzZXJ0RXF1YWxzKGlkZWFsTG9nLCBnZW5lcmF0ZWRMb2cpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGZhaWwoIkNvdWxkIG5vdCBjb21wYXJlIGxvZyBmaWxlcyIpOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGZpbGUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGUgbmFtZSBvZiB0aGUgZmlsZSB0byBnZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlmIHN1Y2Nlc3NmdWwuCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gY3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGFpb24gb2YgdGhlIGZpbGUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmdGcm9tRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGlmKGZpbGVuYW1lLnN0YXJ0c1dpdGgoImZpbGU6IikpCi0gIAl7Ci0gIAkgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDYpOwotICAJICB3aGlsZShmaWxlbmFtZS5zdGFydHNXaXRoKCJcXCIpIHx8IGZpbGVuYW1lLnN0YXJ0c1dpdGgoIi8iKSkKLSAgCSAgewotICAJICAJZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMSk7Ci0gIAkgIH0KLSAgCX0KLSAgICBTdHJpbmdCdWZmZXIgZmlsZXN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICBCdWZmZXJlZFJlYWRlciBidWZyZWFkZXIgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKLSAgICAgIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGZpbGUpOwotICAgICAgYnVmcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7Ci0gICAgICB3aGlsZSAoYnVmcmVhZGVyLnJlYWR5KCkpCi0gICAgICB7Ci0gICAgICAgIGZpbGVzdHJpbmcuYXBwZW5kKGJ1ZnJlYWRlci5yZWFkTGluZSgpICsgIlxuIik7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigpOwotICAgIH0gZmluYWxseQotICAgIHsKLSAgICAgIGJ1ZnJlYWRlci5jbG9zZSgpOwotICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgfQotICAgIHJldHVybiBmaWxlc3RyaW5nLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYSBsb2cgZmlsZSBmb3IgYW4gWFNEIHRlc3QuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvZyBmaWxlIHRvIGNyZWF0ZS4KLSAgICogQHBhcmFtIHZhbHJlcG9ydCBUaGUgdmFsaWRhdGlvbiByZXBvcnQgZm9yIHRoaXMgZmlsZS4KLSAgICogQHJldHVybiBUaGUgZmlsZSBjb250ZW50cyBhcyBhIHN0cmluZyBpZiBzdWNjZXNzZnVsIG9yIG51bGwgaWYgbm90IHN1Y2Nlc3NmdWwuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBjcmVhdGVMb2coU3RyaW5nIGZpbGVuYW1lLCBJVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQpCi0gIHsKLSAgICBpZihmaWxlbmFtZS5zdGFydHNXaXRoKCJmaWxlOiIpKQotICAJewotICAJICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyg2KTsKLSAgCSAgd2hpbGUoZmlsZW5hbWUuc3RhcnRzV2l0aCgiXFwiKSB8fCBmaWxlbmFtZS5zdGFydHNXaXRoKCIvIikpCi0gIAkgIHsKLSAgCSAgCWZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDEpOwotICAJICB9Ci0gIAl9Ci0gICAgIElWYWxpZGF0aW9uTWVzc2FnZVtdIHZhbG1lc3NhZ2VzID0gdmFscmVwb3J0LmdldFZhbGlkYXRpb25NZXNzYWdlcygpOwotICAgICBpbnQgbnVtbWVzc2FnZXMgPSB2YWxtZXNzYWdlcy5sZW5ndGg7Ly92YWxpZGF0b3IuZ2V0RXJyb3JzKCkuc2l6ZSgpICsgdmFsaWRhdG9yLmdldFdhcm5pbmdzKCkuc2l6ZSgpOwotICAgICBTdHJpbmdCdWZmZXIgZXJyb3JzU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICBTdHJpbmdCdWZmZXIgd2FybmluZ3NTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgIGludCBudW1lcnJvcnMgPSAwOwotICAgICBpbnQgbnVtd2FybmluZ3MgPSAwOwotICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtbWVzc2FnZXM7IGkrKykKLSAgICAgewotICAgICAgIElWYWxpZGF0aW9uTWVzc2FnZSB2YWxtZXMgPSB2YWxtZXNzYWdlc1tpXTsKLSAgICAgICBpZih2YWxtZXMuZ2V0U2V2ZXJpdHkoKSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0gICAgICAgewotICAgICAgICAgbnVtd2FybmluZ3MrKzsKLSAgICAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGNvbnRhaW5zIGFueSBmaWxlIHJlZmVyZW5jZXMgbWFrZSB0aGVtIHJlbGF0aXZlLgotICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSB2YWxtZXMuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZUFsbCgiJ1teJ10qIiArIFBMVUdJTl9OQU1FLCAiJyIgKyBQTFVHSU5fTkFNRSk7Ci0gICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlQWxsKCJbKF1bXihdKiIgKyBQTFVHSU5fTkFNRSwgIlsoXSIgKyBQTFVHSU5fTkFNRSk7Ci0gICAgICAgICB3YXJuaW5nc1N0cmluZy5hcHBlbmQobWVzc2FnZSArICIgWyIgKyB2YWxtZXMuZ2V0TGluZSgpICsiLCAiICsgdmFsbWVzLmdldENvbHVtbigpICsiXVxuIik7Ci0gICAgICAgICB3YXJuaW5nc1N0cmluZy5hcHBlbmQoY3JlYXRlTmVzdGVkTWVzc2FnZVN0cmluZyh2YWxtZXMuZ2V0TmVzdGVkTWVzc2FnZXMoKSkpOwotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgbnVtZXJyb3JzKys7Ci0gICAgICAgICAvLyBJZiB0aGUgbWVzc2FnZSBjb250YWlucyBhbnkgZmlsZSByZWZlcmVuY2VzIG1ha2UgdGhlbSByZWxhdGl2ZS4KLSAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gdmFsbWVzLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2VBbGwoIidbXiddKiIgKyBQTFVHSU5fTkFNRSwgIiciICsgUExVR0lOX05BTUUpOwotICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZUFsbCgiWyhdW14oXSoiICsgUExVR0lOX05BTUUsICIoIiArIFBMVUdJTl9OQU1FKTsKLSAgICAgICAgIGVycm9yc1N0cmluZy5hcHBlbmQobWVzc2FnZSArICIgWyIgKyB2YWxtZXMuZ2V0TGluZSgpICsiLCAiICsgdmFsbWVzLmdldENvbHVtbigpICsiXVxuIik7Ci0gICAgICAgICBlcnJvcnNTdHJpbmcuYXBwZW5kKGNyZWF0ZU5lc3RlZE1lc3NhZ2VTdHJpbmcodmFsbWVzLmdldE5lc3RlZE1lc3NhZ2VzKCkpKTsKLSAgICAgICB9Ci0gICAgIH0KLSAgICAgU3RyaW5nQnVmZmVyIGxvZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgbG9nLmFwcGVuZCgibnVtYmVyIG9mIGVycm9ycyAgICAgIDogIiArIG51bWVycm9ycyArICJcbiIpOwotICAgICBsb2cuYXBwZW5kKCJudW1iZXIgb2Ygd2FybmluZ3MgICAgOiAiICsgbnVtd2FybmluZ3MgKyAiXG5cbiIpOwotICAgICBsb2cuYXBwZW5kKCItLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgIGlmKG51bWVycm9ycyA9PSAwKQotICAgICB7Ci0gICAgICAgbG9nLmFwcGVuZCgiKG5vbmUpXG4iKTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICBsb2cuYXBwZW5kKGVycm9yc1N0cmluZy50b1N0cmluZygpKTsKLSAgICAgfQotICAgICBsb2cuYXBwZW5kKCItLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgIGlmKG51bXdhcm5pbmdzID09IDApCi0gICAgIHsKLSAgICAgICBsb2cuYXBwZW5kKCIobm9uZSlcbiIpOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgIGxvZy5hcHBlbmQod2FybmluZ3NTdHJpbmcudG9TdHJpbmcoKSk7Ci0gICAgIH0KLSAgICAgbG9nLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgCi0gICAgIERhdGFPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlIGxvZ2ZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSk7Ci0gICAgICBGaWxlIHBhcmVudCA9IGxvZ2ZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAJaWYgKCFwYXJlbnQuZXhpc3RzKCkpIAotICAJewotICAJICBwYXJlbnQubWtkaXJzKCk7Ci0gIAl9Ci0gICAgICBpZihsb2dmaWxlLmV4aXN0cygpKQotICAgICAgewotICAgICAgICBsb2dmaWxlLmRlbGV0ZSgpOwotICAgICAgfQotICAgICAgbG9nZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAKLSAgICAgIG91dFN0cmVhbSA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lLCB0cnVlKSk7Ci0gICAgICBvdXRTdHJlYW0ud3JpdGVCeXRlcyhsb2cudG9TdHJpbmcoKSk7Ci0gICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKLQotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gSWYgd2UgY2FuJ3Qgd3JpdGUgdGhlIGxvZyB0aGVuIGNsZWFyIHRoZSBsb2cuCi0gICAgICBsb2cuZGVsZXRlKDAsIGxvZy5sZW5ndGgoKSk7Ci0gICAgfQotICAgIHJldHVybiBsb2cudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTmVzdGVkTWVzc2FnZVN0cmluZyhMaXN0IG5lc3RlZE1lc3NhZ2VzKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZU5lc3RlZE1lc3NhZ2VTdHJpbmcobmVzdGVkTWVzc2FnZXMsIDApOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBjcmVhdGVOZXN0ZWRNZXNzYWdlU3RyaW5nKExpc3QgbmVzdGVkTWVzc2FnZXMsIGludCBkZXB0aCkKLSAgewotICAgIGlmKG5lc3RlZE1lc3NhZ2VzICE9IG51bGwgJiYgbmVzdGVkTWVzc2FnZXMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbWVzc2FnZVN0cmluZyA9ICIiOwotICAgICAgSXRlcmF0b3IgbmVzdGVkTWVzSXRlciA9IG5lc3RlZE1lc3NhZ2VzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShuZXN0ZWRNZXNJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgSVZhbGlkYXRpb25NZXNzYWdlIG5lc3ZhbG1lcyA9IChJVmFsaWRhdGlvbk1lc3NhZ2UpbmVzdGVkTWVzSXRlci5uZXh0KCk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgbWVzc2FnZVN0cmluZyArPSAiICI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgYW55IGZpbGUgcmVmZXJlbmNlcyBtYWtlIHRoZW0gcmVsYXRpdmUuCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gbmVzdmFsbWVzLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZUFsbCgiJ1teJ10qIiArIFBMVUdJTl9OQU1FLCAiJyIgKyBQTFVHSU5fTkFNRSk7Ci0gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2VBbGwoIlsoXVteKF0qIiArIFBMVUdJTl9OQU1FLCAiWyhdIiArIFBMVUdJTl9OQU1FKTsKLSAgICAgICAgbWVzc2FnZVN0cmluZyArPSAoIi0+ICIgKyBtZXNzYWdlICsgIiBbIiArIG5lc3ZhbG1lcy5nZXRMaW5lKCkgKyIsICIgKyBuZXN2YWxtZXMuZ2V0Q29sdW1uKCkgKyJdXG4iKTsKLSAgICAgICAgbWVzc2FnZVN0cmluZyArPSBjcmVhdGVOZXN0ZWRNZXNzYWdlU3RyaW5nKG5lc3ZhbG1lcy5nZXROZXN0ZWRNZXNzYWdlcygpLCBkZXB0aCArIDEpOwotICAgICAgfQotICAgICAgcmV0dXJuIG1lc3NhZ2VTdHJpbmc7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgSVByb2plY3QgY3JlYXRlUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZ1tdIGZpbGVzLCBTdHJpbmdbXSBwcm9qZWN0TmF0dXJlcywgSVByb2plY3RbXSByZWZlcmVuY2VkUHJvamVjdHMpCi0gIHsKLSAgICBmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICBpZighcHJvamVjdC5leGlzdHMoKSkKLSAgICB7Ci0gICAgICB0cnkKLQkgIHsKLSAgICAgICAgcHJvamVjdC5jcmVhdGUobnVsbCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0JICB7Ci0gICAgICAgIGZhaWwoIkNvdWxkIG5vdCBjcmVhdGUgcHJvamVjdCAiICsgcHJvamVjdE5hbWUgKyBlKTsKLSAgICAgIH0gCi0gICAgfQotICAgIGlmKCFwcm9qZWN0LmlzT3BlbigpKQotICAgIHsKLSAgICAgIHRyeQotCSAgewotICAgICAgICBwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JICB9Ci0gICAgICBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGZhaWwoIkNvdWxkIG5vdCBvcGVuIHByb2plY3QgIiArIHByb2plY3ROYW1lICsgZSk7Ci0JICB9Ci0gICAgfQotICAgIHRyeQotICAgIHsKLSAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gcHJvamVjdERlc2NyaXB0aW9uID0gbmV3IFByb2plY3REZXNjcmlwdGlvbigpOwotICAgICAgcHJvamVjdERlc2NyaXB0aW9uLnNldE5hbWUocHJvamVjdE5hbWUpOwotICAgICAgcHJvamVjdERlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhwcm9qZWN0TmF0dXJlcyk7Ci0gICAgICBpZihyZWZlcmVuY2VkUHJvamVjdHMhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb2plY3REZXNjcmlwdGlvbi5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVmZXJlbmNlZFByb2plY3RzKTsKLSAgICAgIH0KLSAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24ocHJvamVjdERlc2NyaXB0aW9uLCBudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZmFpbCgiVW5hYmxlIHRvIHNldCBwcm9qZWN0IHByb3BlcnRpZXMgZm9yIHByb2plY3QgIiArIHByb2plY3ROYW1lICsgIi4gIiArIGUpOwotICAgIH0KLSAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgIHRyeQotICAgewotICAgICBqYXZhUHJvamVjdC5vcGVuKG51bGwpOwotICAgICBMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgIGVudHJpZXMuYWRkKEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCJkZWZhdWx0IikpKTsKLSAgICAgCi0gICAgIGlmKHJlZmVyZW5jZWRQcm9qZWN0cyAhPSBudWxsKQotICAgICB7Ci0gICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZWRQcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICAgICB7Ci0gICAgICAgICBlbnRyaWVzLmFkZChKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocmVmZXJlbmNlZFByb2plY3RzW2ldLmdldExvY2F0aW9uKCkpKTsKLSAgICAgICB9Ci0gICAgIH0KLSAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKChJQ2xhc3NwYXRoRW50cnlbXSllbnRyaWVzLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLnNpemUoKV0pLCBudWxsKTsKLSAgIH0KLSAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgewotICAgICBmYWlsKCJDYW4ndCBvcGVuIEphdmEgcHJvamVjdDogIiArIGUpOwotICAgfQotCi0gICAgaWYoZmlsZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgbnVtZmlsZXMgPSBmaWxlcy5sZW5ndGg7Ci0gICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtZmlsZXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0JCXsKLSAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlc1tpXSk7Ci0gICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICBJRmlsZSBpRmlsZSA9IHByb2plY3QuZ2V0RmlsZShmaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgaWYoIWlGaWxlLmV4aXN0cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlGaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgIH0KLQkJfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLQkJewotCQkgIGZhaWwoIlVuYWJsZSB0byBsb2NhdGUgZmlsZSAiICsgZmlsZXNbaV0pOwotCQl9IAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJvamVjdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9QYXRoc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvUGF0aHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ODM2MzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9QYXRoc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRlc3RzIGZvciBmaWxlIHBhdGhzLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoc1Rlc3QgZXh0ZW5kcyBCYXNlVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgUEFUSFNfRElSID0gIlBhdGhzLyI7Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgdGVzdHMgc3VpdGUgZnJvbSB0aGlzIHRlc3QgY2xhc3MuCi0gICAqIAotICAgKiBAcmV0dXJuIEEgdGVzdCBzdWl0ZSBjb250YWluaW5nIHRoaXMgdGVzdCBjbGFzcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShQYXRoc1Rlc3QuY2xhc3MpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkKLSAgewotICAgIHN1cGVyLnNldFVwKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBEZWxldGUgdGhlIHNpbXBsZSBwcm9qZWN0IGZvciBJbXBvcnRlZFNjaGVtYVdpdGhTY2hlbWFJbXBvcnQgdGVzdAotICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCAvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFNwYWNlSW5QYXRoVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlNwYWNlSW5QYXRoVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiU3BhY2UgSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiU3BhY2UgSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJTcGFjZSBJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0U3BhY2VJblBhdGhJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJTcGFjZUluUGF0aEludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiU3BhY2UgSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiU3BhY2UgSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJTcGFjZSBJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEFuZ2xlSGF0SW5QYXRoVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkFuZ2xlSGF0SW5QYXRoVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiQW5nbGVIYXReSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiQW5nbGVIYXReSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJBbmdsZUhhdF5JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0QW5nbGVIYXRJblBhdGhJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJBbmdsZUhhdEluUGF0aEludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiQW5nbGVIYXReSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiQW5nbGVIYXReSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJBbmdsZUhhdF5JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvQW5nbGVIYXRJbkZpbGVuYW1lL0FuZ2xlSGF0XkluRmlsZW5hbWVWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0QW5nbGVIYXRJbkZpbGVuYW1lVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkFuZ2xlSGF0XkluRmlsZW5hbWVWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJBbmdsZUhhdEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJBbmdsZUhhdEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkFuZ2xlSGF0SW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9BbmdsZUhhdEluRmlsZW5hbWUvQW5nbGVIYXReSW5GaWxlbmFtZUludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEFuZ2xlSGF0SW5GaWxlbmFtZUludmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkFuZ2xlSGF0XkluRmlsZW5hbWVJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIkFuZ2xlSGF0SW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkFuZ2xlSGF0SW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiQW5nbGVIYXRJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL0Nsb3NlQnJhY2tldClJblBhdGgvQ2xvc2VCcmFja2V0SW5QYXRoVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdENsb3NlQnJhY2tldEluUGF0aFZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJDbG9zZUJyYWNrZXRJblBhdGhWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJDbG9zZUJyYWNrZXQpSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiQ2xvc2VCcmFja2V0KUluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiQ2xvc2VCcmFja2V0KUluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9DbG9zZUJyYWNrZXQpSW5QYXRoL0Nsb3NlQnJhY2tldEluUGF0aEludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdENsb3NlQnJhY2tldEluUGF0aEludmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkNsb3NlQnJhY2tldEluUGF0aEludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiQ2xvc2VCcmFja2V0KUluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkNsb3NlQnJhY2tldClJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkNsb3NlQnJhY2tldClJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvQ2xvc2VCcmFja2V0SW5GaWxlbmFtZS9DbG9zZUJyYWNrZXQpSW5GaWxlbmFtZVZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUJyYWNrZXRJbkZpbGVuYW1lVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkNsb3NlQnJhY2tldClJbkZpbGVuYW1lVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiQ2xvc2VCcmFja2V0SW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkNsb3NlQnJhY2tldEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkNsb3NlQnJhY2tldEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvQ2xvc2VCcmFja2V0SW5GaWxlbmFtZS9DbG9zZUJyYWNrZXQpSW5GaWxlbmFtZUludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdENsb3NlQnJhY2tldEluRmlsZW5hbWVJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJDbG9zZUJyYWNrZXQpSW5GaWxlbmFtZUludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiQ2xvc2VCcmFja2V0SW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkNsb3NlQnJhY2tldEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkNsb3NlQnJhY2tldEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvRGFzaC1JblBhdGgvRGFzaEluUGF0aFZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3REYXNoSW5QYXRoVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkRhc2hJblBhdGhWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJEYXNoLUluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkRhc2gtSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJEYXNoLUluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9EYXNoLUluUGF0aC9EYXNoSW5QYXRoSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0RGFzaEluUGF0aEludmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkRhc2hJblBhdGhJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIkRhc2gtSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiRGFzaC1JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkRhc2gtSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL0Rhc2hJbkZpbGVuYW1lL0Rhc2gtSW5GaWxlbmFtZVZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3REYXNoSW5GaWxlbmFtZVZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJEYXNoLUluRmlsZW5hbWVWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJEYXNoSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkRhc2hJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJEYXNoSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9EYXNoSW5GaWxlbmFtZS9EYXNoLUluRmlsZW5hbWVJbnZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3REYXNoSW5GaWxlbmFtZUludmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkRhc2gtSW5GaWxlbmFtZUludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiRGFzaEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJEYXNoSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiRGFzaEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvRXhjbGFtYXRpb24hSW5QYXRoL0V4Y2xhbWF0aW9uSW5QYXRoVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEV4Y2xhbWF0aW9uSW5QYXRoVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkV4Y2xhbWF0aW9uSW5QYXRoVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiRXhjbGFtYXRpb24hSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiRXhjbGFtYXRpb24hSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJFeGNsYW1hdGlvbiFJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvRXhjbGFtYXRpb24hSW5QYXRoL0V4Y2xhbWF0aW9uSW5QYXRoSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0RXhjbGFtYXRpb25JblBhdGhJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJFeGNsYW1hdGlvbkluUGF0aEludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiRXhjbGFtYXRpb24hSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiRXhjbGFtYXRpb24hSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJFeGNsYW1hdGlvbiFJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvRXhjbGFtYXRpb25JbkZpbGVuYW1lL0V4Y2xhbWF0aW9uIUluRmlsZW5hbWVWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0RXhjbGFtYXRpb25JbkZpbGVuYW1lVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkV4Y2xhbWF0aW9uIUluRmlsZW5hbWVWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJFeGNsYW1hdGlvbkluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJFeGNsYW1hdGlvbkluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkV4Y2xhbWF0aW9uSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9FeGNsYW1hdGlvbkluRmlsZW5hbWUvRXhjbGFtYXRpb24hSW5GaWxlbmFtZUludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEV4Y2xhbWF0aW9uSW5GaWxlbmFtZUludmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkV4Y2xhbWF0aW9uIUluRmlsZW5hbWVJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIkV4Y2xhbWF0aW9uSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkV4Y2xhbWF0aW9uSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiRXhjbGFtYXRpb25JbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL09wZW5CcmFja2V0KEluUGF0aC9PcGVuQnJhY2tldEluUGF0aFZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RPcGVuQnJhY2tldEluUGF0aFZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJPcGVuQnJhY2tldEluUGF0aFZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIk9wZW5CcmFja2V0KEluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIk9wZW5CcmFja2V0KEluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiT3BlbkJyYWNrZXQoSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL09wZW5CcmFja2V0KEluUGF0aC9PcGVuQnJhY2tldEluUGF0aEludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE9wZW5CcmFja2V0SW5QYXRoSW52YWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiT3BlbkJyYWNrZXRJblBhdGhJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIk9wZW5CcmFja2V0KEluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIk9wZW5CcmFja2V0KEluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiT3BlbkJyYWNrZXQoSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL09wZW5CcmFja2V0SW5GaWxlbmFtZS9PcGVuQnJhY2tldChJbkZpbGVuYW1lVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE9wZW5CcmFja2V0SW5GaWxlbmFtZVZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJPcGVuQnJhY2tldChJbkZpbGVuYW1lVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiT3BlbkJyYWNrZXRJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiT3BlbkJyYWNrZXRJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJPcGVuQnJhY2tldEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvT3BlbkJyYWNrZXRJbkZpbGVuYW1lL09wZW5CcmFja2V0KEluRmlsZW5hbWVJbnZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RPcGVuQnJhY2tldEluRmlsZW5hbWVJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJPcGVuQnJhY2tldChJbkZpbGVuYW1lSW52YWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJPcGVuQnJhY2tldEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJPcGVuQnJhY2tldEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIk9wZW5CcmFja2V0SW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9QZXJpb2QuSW5QYXRoL1BlcmlvZEluUGF0aFZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RQZXJpb2RJblBhdGhWYWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiUGVyaW9kSW5QYXRoVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiUGVyaW9kLkluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlBlcmlvZC5JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlBlcmlvZC5JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvUGVyaW9kLkluUGF0aC9QZXJpb2RJblBhdGhJbnZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RQZXJpb2RJblBhdGhJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJQZXJpb2RJblBhdGhJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlBlcmlvZC5JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJQZXJpb2QuSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJQZXJpb2QuSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1BlcmlvZEluRmlsZW5hbWUvUGVyaW9kLkluRmlsZW5hbWVWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UGVyaW9kSW5GaWxlbmFtZVZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJQZXJpb2QuSW5GaWxlbmFtZVZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlBlcmlvZEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJQZXJpb2RJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJQZXJpb2RJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1BlcmlvZEluRmlsZW5hbWUvUGVyaW9kLkluRmlsZW5hbWVJbnZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RQZXJpb2RJbkZpbGVuYW1lSW52YWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiUGVyaW9kLkluRmlsZW5hbWVJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlBlcmlvZEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJQZXJpb2RJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJQZXJpb2RJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1F1b3RlJ0luUGF0aC9RdW90ZUluUGF0aFZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RRdW90ZUluUGF0aFZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJRdW90ZUluUGF0aFZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlF1b3RlJ0luUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlF1b3RlJ0luUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiUXVvdGUnSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1F1b3RlJ0luUGF0aC9RdW90ZUluUGF0aEludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFF1b3RlSW5QYXRoSW52YWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiUXVvdGVJblBhdGhJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlF1b3RlJ0luUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlF1b3RlJ0luUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiUXVvdGUnSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1F1b3RlSW5GaWxlbmFtZS9RdW90ZSdJbkZpbGVuYW1lVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFF1b3RlSW5GaWxlbmFtZVZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJRdW90ZSdJbkZpbGVuYW1lVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiUXVvdGVJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiUXVvdGVJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJRdW90ZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvUXVvdGVJbkZpbGVuYW1lL1F1b3RlJ0luRmlsZW5hbWVJbnZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RRdW90ZUluRmlsZW5hbWVJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJRdW90ZSdJbkZpbGVuYW1lSW52YWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJRdW90ZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJRdW90ZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlF1b3RlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9TcGFjZUluRmlsZW5hbWUvU3BhY2UgSW5GaWxlbmFtZVZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RTcGFjZUluRmlsZW5hbWVWYWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiU3BhY2UgSW5GaWxlbmFtZVZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlNwYWNlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlNwYWNlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiU3BhY2VJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1NwYWNlSW5GaWxlbmFtZS9TcGFjZSBJbkZpbGVuYW1lSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0U3BhY2VJbkZpbGVuYW1lSW52YWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiU3BhY2UgSW5GaWxlbmFtZUludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiU3BhY2VJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiU3BhY2VJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJTcGFjZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFRpbGRlSW5QYXRoVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlRpbGRlSW5QYXRoVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiVGlsZGV+SW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVGlsZGV+SW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJUaWxkZX5JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VGlsZGVJblBhdGhJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJUaWxkZUluUGF0aEludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiVGlsZGV+SW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVGlsZGV+SW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJUaWxkZX5JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvVGlsZGVJbkZpbGVuYW1lL1RpbGRlfkluRmlsZW5hbWVWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VGlsZGVJbkZpbGVuYW1lVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlRpbGRlfkluRmlsZW5hbWVWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJUaWxkZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJUaWxkZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlRpbGRlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9UaWxkZUluRmlsZW5hbWUvVGlsZGV+SW5GaWxlbmFtZUludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFRpbGRlSW5GaWxlbmFtZUludmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlRpbGRlfkluRmlsZW5hbWVJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlRpbGRlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlRpbGRlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVGlsZGVJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1VuZGVyc2NvcmVfSW5QYXRoL1VuZGVyc2NvcmVJblBhdGhWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VW5kZXJzY29yZUluUGF0aFZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJVbmRlcnNjb3JlSW5QYXRoVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiVW5kZXJzY29yZV9JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJVbmRlcnNjb3JlX0luUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVW5kZXJzY29yZV9JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvVW5kZXJzY29yZV9JblBhdGgvVW5kZXJzY29yZUluUGF0aEludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFVuZGVyc2NvcmVJblBhdGhJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJVbmRlcnNjb3JlSW5QYXRoSW52YWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJVbmRlcnNjb3JlX0luUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlVuZGVyc2NvcmVfSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJVbmRlcnNjb3JlX0luUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9VbmRlcnNjb3JlSW5GaWxlbmFtZS9VbmRlcnNjb3JlX0luRmlsZW5hbWVWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VW5kZXJzY29yZUluRmlsZW5hbWVWYWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiVW5kZXJzY29yZV9JbkZpbGVuYW1lVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiVW5kZXJzY29yZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJVbmRlcnNjb3JlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVW5kZXJzY29yZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvVW5kZXJzY29yZUluRmlsZW5hbWUvVW5kZXJzY29yZV9JbkZpbGVuYW1lSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VW5kZXJzY29yZUluRmlsZW5hbWVJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJVbmRlcnNjb3JlX0luRmlsZW5hbWVJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlVuZGVyc2NvcmVJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVW5kZXJzY29yZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlVuZGVyc2NvcmVJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9XU0RMVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9XU0RMVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTljZTg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvV1NETFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFdTREwgdmFsaWRhdGlvbiB0ZXN0cyBmb3IgdGhlIFdTREwgdmFsaWRhdG9yLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMVGVzdCBleHRlbmRzIEJhc2VUZXN0Q2FzZQotewotICBwcml2YXRlIFN0cmluZyBXU0RMX0RJUiA9ICJXU0RMLyI7Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgdGVzdHMgc3VpdGUgZnJvbSB0aGlzIHRlc3QgY2xhc3MuCi0gICAqIAotICAgKiBAcmV0dXJuIEEgdGVzdCBzdWl0ZSBjb250YWluaW5nIHRoaXMgdGVzdCBjbGFzcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShXU0RMVGVzdC5jbGFzcyk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKQotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIC8vIERlbGV0ZSB0aGUgc2ltcGxlIHByb2plY3QgZm9yIEltcG9ydGVkU2NoZW1hV2l0aFNjaGVtYUltcG9ydCB0ZXN0Ci0gICAgc3VwZXIudGVhckRvd24oKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIElNUE9SVCBURVNUUwotICAgKi8KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkltcG9ydFNjaGVtYVdpdGhXU0RMSW1wb3J0IjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvSW1wb3J0L0ltcG9ydFNjaGVtYVdpdGhXU0RMSW1wb3J0SW52YWxpZE5TLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydEludmFsaWROUygpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnRJbnZhbGlkTlMiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRXU0RMV2l0aFdTREwoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkltcG9ydFdTRExXaXRoV1NETCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML0ltcG9ydC9JbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkTlMud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEltcG9ydFdTRExXaXRoV1NETEludmFsaWROUygpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZE5TIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETEludmFsaWRGaWxlbmFtZS53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZEZpbGVuYW1lKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJJbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkRmlsZW5hbWUiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvV1NETEltcG9ydGluZ1R5cGVzLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RXU0RMSW1wb3J0aW5nVHlwZXMoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIldTRExJbXBvcnRpbmdUeXBlcyI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML0ltcG9ydC9JbXBvcnROb25FeGlzdGFudEZpbGUud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEltcG9ydE5vbkV4aXN0YW50RmlsZSgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiSW1wb3J0Tm9uRXhpc3RhbnRGaWxlIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvSW1wb3J0L1dTRExOYW1lc3BhY2VBQUEud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFdTRExOYW1lc3BhY2VBQUEoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIldTRExOYW1lc3BhY2VBQUEiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvSW1wb3J0aW5nV1NETFdpdGhJbXBvcnRlZFNjaGVtYS53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0aW5nV1NETFdpdGhJbXBvcnRlZFNjaGVtYSgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiSW1wb3J0aW5nV1NETFdpdGhJbXBvcnRlZFNjaGVtYSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML0ltcG9ydC9XU0RMSW1wb3J0aW5nU2NoZW1hSW5tcG9ydGluZ1NjaGVtYS53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0V1NETEltcG9ydGluZ1NjaGVtYUlubXBvcnRpbmdTY2hlbWEoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIldTRExJbXBvcnRpbmdTY2hlbWFJbXBvcnRpbmdTY2hlbWEiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvSW1wb3J0WE1MSW52YWxpZFdTREwvSW1wb3J0WE1MSW52YWxpZFdTREwud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEltcG9ydFhNTEludmFsaWRXU0RMKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJJbXBvcnRYTUxJbnZhbGlkV1NETCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9JbXBvcnRYTUxJbnZhbGlkV1NETC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0L0ltcG9ydFhNTEludmFsaWRXU0RMLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9JbXBvcnRYTUxJbnZhbGlkV1NETC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvSW1wb3J0L0ltcG9ydGluZ1VzaW5nQ2xhc3NwYXRoLndzZGwKLSAgICovCi0vLyAgcHVibGljIHZvaWQgdGVzdEltcG9ydGluZ1VzaW5nQ2xhc3NwYXRoKCkKLS8vICB7Ci0vLyAgICBmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLS8vICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJJbXBvcnRpbmdVc2luZ0NsYXNzcGF0aCI7Ci0vLyAgICBTdHJpbmcgaW1wb3J0aW5nZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArICJJbXBvcnRpbmdVc2luZ0NsYXNzcGF0aC53c2RsIjsKLS8vICAgIGltcG9ydGluZ2ZpbGUgPSBpbXBvcnRpbmdmaWxlLnJlcGxhY2UoJy8nLCdcXCcpOwotLy8gICAgaW1wb3J0aW5nZmlsZSA9IGltcG9ydGluZ2ZpbGUuc3Vic3RyaW5nKDUpOwotLy8gICAgU3RyaW5nIGltcG9ydGVkZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArICJJbXBvcnRlZFVzaW5nQ2xhc3NwYXRoLndzZGwiOwotLy8gICAgaW1wb3J0ZWRmaWxlID0gaW1wb3J0ZWRmaWxlLnJlcGxhY2UoJy8nLCdcXCcpOwotLy8gICAgaW1wb3J0ZWRmaWxlID0gaW1wb3J0ZWRmaWxlLnN1YnN0cmluZyg1KTsKLS8vICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotLy8gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotLy8gICAgCi0vLyAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSAiUHJvamVjdDEiOwotLy8gICAgU3RyaW5nIHByb2plY3ROYW1lMiA9ICJQcm9qZWN0MiI7Ci0vLyAgICAvLyBDcmVhdGUgYSBzaW1wbGUgcHJvamVjdCBmb3IgSW1wb3J0ZWRTY2hlbWFXaXRoU2NoZW1hSW1wb3J0IHRlc3QuCi0vLyAgICBJUHJvamVjdCBwcm9qZWN0MiA9IGNyZWF0ZVByb2plY3QocHJvamVjdE5hbWUyLCBuZXcgU3RyaW5nW117aW1wb3J0ZWRmaWxlfSxuZXcgU3RyaW5nW117Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiLCAiY29tLmlibS53dHAuamNhLkNvbm5lY3Rvck5hdHVyZSJ9LCBudWxsKTsKLS8vICAgIElQcm9qZWN0IHByb2plY3QxID0gY3JlYXRlUHJvamVjdChwcm9qZWN0TmFtZSwgbmV3IFN0cmluZ1tde2ltcG9ydGluZ2ZpbGV9LG5ldyBTdHJpbmdbXXsib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIsICJjb20uaWJtLnd0cC5qY2EuQ29ubmVjdG9yTmF0dXJlIn0sIG5ldyBJUHJvamVjdFtde3Byb2plY3QyfSk7Ci0vLyAgICAKLS8vICAgIFN0cmluZyB0ZXN0ZmlsZSA9ICJmaWxlOi8iICsgcHJvamVjdDEuZ2V0RmlsZSgiSW1wb3J0aW5nVXNpbmdDbGFzc3BhdGgud3NkbCIpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLS8vICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLS8vICAgIAotLy8gICAgdHJ5Ci0vLyAgICB7Ci0vLyAgICAgIHByb2plY3QxLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLS8vICAgICAgcHJvamVjdDIuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotLy8gICAgfQotLy8gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0vLyAgICB7Ci0vLyAgICB9Ci0vLyAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL0ltcG9ydE9uZUFuZFR3by53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0T25lQW5kVHdvKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJJbXBvcnRPbmVBbmRUd28iOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvb25lLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRPbmVBbmRUd29fT25lKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJvbmUiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvdHdvLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRPbmVBbmRUd29fVHdvKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJ0d28iOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogQ1lDTElDIFRFU1RTCi0gICAqLwotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvQ3ljbGljL1BvcnR0eXBlUmVmTWVzc2FnZTEud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFBvcnR0eXBlUmVmTWVzc2FnZTEoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlBvcnR0eXBlUmVmTWVzc2FnZTEiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJDeWNsaWMvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkN5Y2xpYy8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJDeWNsaWMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9DeWNsaWMvUG9ydHR5cGVSZWZNZXNzYWdlMi53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UG9ydHR5cGVSZWZNZXNzYWdlMigpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiUG9ydHR5cGVSZWZNZXNzYWdlMiI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIkN5Y2xpYy8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiQ3ljbGljLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkN5Y2xpYy8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML1NlbGZDb250YWluZWQvUmVmZXJlbmNlSW5saW5lVHlwZXMud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFJlZmVyZW5jZUlubGluZVR5cGVzKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJSZWZlcmVuY2VJbmxpbmVUeXBlcyI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiU2VsZkNvbnRhaW5lZC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML1NlbGZDb250YWluZWQvRW1wdHkud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJFbXB0eSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiU2VsZkNvbnRhaW5lZC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML1NlbGZDb250YWluZWQvU09BUEJvZHlFbmNvZGVkTm9OYW1lc3BhY2Uud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFNPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJTT0FQQm9keUVuY29kZWROb05hbWVzcGFjZSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiU2VsZkNvbnRhaW5lZC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML1NlbGZDb250YWluZWQvU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZS53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZSgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiU2VsZkNvbnRhaW5lZC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML1NlbGZDb250YWluZWQvTm9EZWZhdWx0TmFtZXNwYWNlL05vRGVmYXVsdE5hbWVzcGFjZS53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0Tm9EZWZhdWx0TmFtZXNwYWNlKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJOb0RlZmF1bHROYW1lc3BhY2UiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJTZWxmQ29udGFpbmVkL05vRGVmYXVsdE5hbWVzcGFjZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiU2VsZkNvbnRhaW5lZC9Ob0RlZmF1bHROYW1lc3BhY2UvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiU2VsZkNvbnRhaW5lZC9Ob0RlZmF1bHROYW1lc3BhY2UvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL1dTRExWYWxpZGF0b3JUZXN0c1BsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9XU0RMVmFsaWRhdG9yVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjZGM3NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL1dTRExWYWxpZGF0b3JUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMVmFsaWRhdG9yVGVzdHNQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0gIC8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgcHJpdmF0ZSBzdGF0aWMgV1NETFZhbGlkYXRvclRlc3RzUGx1Z2luIHBsdWdpbjsKLQotICAvL1Jlc291cmNlIGJ1bmRsZS4KLSAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotICAvKioKLSAgICogVGhlIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTRExWYWxpZGF0b3JUZXN0c1BsdWdpbigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHBsdWdpbiA9IHRoaXM7Ci0vLyAgICB0cnkKLS8vICAgIHsKLS8vICAgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUudGVzdHMuV1NETFZhbGlkYXRvclRlc3RzUGx1Z2luUmVzb3VyY2VzIik7Ci0vLyAgICB9Ci0vLyAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpCi0vLyAgICB7Ci0vLyAgICAgIHJlc291cmNlQnVuZGxlID0gbnVsbDsKLS8vICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBXU0RMVmFsaWRhdG9yVGVzdHNQbHVnaW4gZ2V0RGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gcGx1Z2luOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdAotICAgKiBmb3VuZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpCi0gIHsKLSAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBXU0RMVmFsaWRhdG9yVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0gICAgfQotICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4ga2V5OwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlQnVuZGxlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhpcyBwbHVnaW4gKGllLiB3aGVyZSB0aGlzIHBsdWdpbiBpcyBpbnN0YWxsZWQuKQotICAgKiAKLSAgICogQHJldHVybiBUaGUgbG9jYXRpb24gb2YgdGhpcyBwbHVnaW4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5Mb2NhdGlvbigpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkwgbG9jYXRpb24gPSBQbGF0Zm9ybS5yZXNvbHZlKGdldERlZmF1bHQoKS5maW5kKG5ldyBQYXRoKCIiKSkpOwotICAgICAgcmV0dXJuIGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgfQotICAgIGNhdGNoKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvWFNEVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9YU0RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDc4MDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9YU0RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBYU0QgdmFsaWRhdGlvbiB0ZXN0cyBmb3IgdGhlIFdTREwgdmFsaWRhdG9yLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RUZXN0IGV4dGVuZHMgQmFzZVRlc3RDYXNlCi17Ci0gIHByaXZhdGUgU3RyaW5nIFhTRF9ESVIgPSAiWFNELyI7Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgdGVzdHMgc3VpdGUgZnJvbSB0aGlzIHRlc3QgY2xhc3MuCi0gICAqIAotICAgKiBAcmV0dXJuIEEgdGVzdCBzdWl0ZSBjb250YWluaW5nIHRoaXMgdGVzdCBjbGFzcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShYU0RUZXN0LmNsYXNzKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvWFNEL0VudGl0aWVzL25vcm1hbGl6ZUVudGl0aWVzVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZUVudGl0aWVzVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIm5vcm1hbGl6ZUVudGl0aWVzVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBYU0RfRElSICsgIkVudGl0aWVzLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIkVudGl0aWVzLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiRW50aXRpZXMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvWFNEL0VudGl0aWVzL25vcm1hbGl6ZUVudGl0aWVzSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplRW50aXRpZXNJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJub3JtYWxpemVFbnRpdGllc0ludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBYU0RfRElSICsgIkVudGl0aWVzLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIkVudGl0aWVzLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiRW50aXRpZXMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvWFNEL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS9SZWZlclRvQW5vdGhlcklubGluZVR5cGUud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFJlZmVyVG9Bbm90aGVySW5saW5lVHlwZSgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgWFNEX0RJUiArICJSZWZlclRvQW5vdGhlcklubGluZVR5cGUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1hTRC9JbmxpbmVTY2hlbWFHZW5lcmF0ZWRJbXBvcnRzL05vSW1wb3J0Rm9yVW5wcmVmaXhlZEF0dHJpYnV0ZS53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0Tm9JbXBvcnRGb3JVbnByZWZpeGVkQXR0cmlidXRlKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJOb0ltcG9ydEZvclVucHJlZml4ZWRBdHRyaWJ1dGUiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBYU0RfRElSICsgIklubGluZVNjaGVtYUdlbmVyYXRlZEltcG9ydHMvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiSW5saW5lU2NoZW1hR2VuZXJhdGVkSW1wb3J0cy8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIklubGluZVNjaGVtYUdlbmVyYXRlZEltcG9ydHMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0Qud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE9uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNEIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgWFNEX0RJUiArICJPbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0QvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNELyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNELyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1hTRC9TY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0vU2NoZW1hRG9jRWxlbVdpdGhTb3VyY2VBbmRTdWJFbGVtLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0oKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlNjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFhTRF9ESVIgKyAiU2NoZW1hRG9jRWxlbVdpdGhTb3VyY2VBbmRTdWJFbGVtLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIlNjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIlNjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9YU0QvUmVzdHJpY3Rpb25QYXR0ZXJuV2l0aENvbG9uL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3Rpb25QYXR0ZXJuV2l0aENvbG9uKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJSZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24iOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBYU0RfRElSICsgIlJlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgWFNEX0RJUiArICJSZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24vIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgWFNEX0RJUiArICJSZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24vIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvWFNEL0ltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlL0ltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZSgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBYU0RfRElSICsgIkltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIkltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvWFNEL1ZhbHVlQ29sb24vVmFsdWVDb2xvbi53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVDb2xvbigpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiVmFsdWVDb2xvbiI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFhTRF9ESVIgKyAiVmFsdWVDb2xvbi8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgWFNEX0RJUiArICJWYWx1ZUNvbG9uLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiVmFsdWVDb2xvbi8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzMwZWE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotCi0gIDwhLS0gQ29uZmlndXJhYmxlIFByb3BlcnRpZXMgLS0+Ci0KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cyIvPgotCi0gIDwhLS0gRW5kIENvbmZpZ3VyYWJsZSBQcm9wZXJ0aWVzIC0tPgotCi0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidnR3b3Jrc3BhY2UiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0L2xpYnJhcnkueG1sIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ3b3Jrc3BhY2UtZm9sZGVyIiB2YWx1ZT0iJHtidnR3b3Jrc3BhY2V9LyR7cGx1Z2luLW5hbWV9Ii8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICAgPGRlbGV0ZT4KLSAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMuKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0KLSAgICA8IS0tIFN0YXJ0IHdpdGggY2xlYW4gZGF0YSB3b3Jrc3BhY2UgLS0+ICAKLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2UtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLQotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2UtZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLmludGVybmFsLkFsbFdTRExUZXN0cyIvPgotICAgIDwvYW50PgotCi0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2UtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjUzNTc0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZ2VuZXJhdGVkUmVzdWx0cwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9BbmdsZUhhdEluRmlsZW5hbWUvQW5nbGVIYXReSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0FuZ2xlSGF0SW5GaWxlbmFtZS9BbmdsZUhhdF5JbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0FuZ2xlSGF0SW5GaWxlbmFtZS9BbmdsZUhhdF5JbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9BbmdsZUhhdEluRmlsZW5hbWUvQW5nbGVIYXReSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9BbmdsZUhhdEluRmlsZW5hbWUvQW5nbGVIYXReSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQW5nbGVIYXRJbkZpbGVuYW1lL0FuZ2xlSGF0XkluRmlsZW5hbWVWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9BbmdsZUhhdF5JblBhdGgvQW5nbGVIYXRJblBhdGhJbnZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9BbmdsZUhhdF5JblBhdGgvQW5nbGVIYXRJblBhdGhJbnZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9BbmdsZUhhdF5JblBhdGgvQW5nbGVIYXRJblBhdGhWYWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoVmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9BbmdsZUhhdF5JblBhdGgvQW5nbGVIYXRJblBhdGhWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQ2xvc2VCcmFja2V0XDA1MUluUGF0aC9DbG9zZUJyYWNrZXRJblBhdGhJbnZhbGlkLndzZGwtbG9nIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Nsb3NlQnJhY2tldFwwNTFJblBhdGgvQ2xvc2VCcmFja2V0SW5QYXRoSW52YWxpZC53c2RsLWxvZyIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQ2xvc2VCcmFja2V0XDA1MUluUGF0aC9DbG9zZUJyYWNrZXRJblBhdGhJbnZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQ2xvc2VCcmFja2V0XDA1MUluUGF0aC9DbG9zZUJyYWNrZXRJblBhdGhWYWxpZC53c2RsLWxvZyIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9DbG9zZUJyYWNrZXRcMDUxSW5QYXRoL0Nsb3NlQnJhY2tldEluUGF0aFZhbGlkLndzZGwtbG9nIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9DbG9zZUJyYWNrZXRcMDUxSW5QYXRoL0Nsb3NlQnJhY2tldEluUGF0aFZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQ2xvc2VCcmFja2V0SW5GaWxlbmFtZS9DbG9zZUJyYWNrZXRcMDUxSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2ciICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQ2xvc2VCcmFja2V0SW5GaWxlbmFtZS9DbG9zZUJyYWNrZXRcMDUxSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2ciCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Nsb3NlQnJhY2tldEluRmlsZW5hbWUvQ2xvc2VCcmFja2V0XDA1MUluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQ2xvc2VCcmFja2V0SW5GaWxlbmFtZS9DbG9zZUJyYWNrZXRcMDUxSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Nsb3NlQnJhY2tldEluRmlsZW5hbWUvQ2xvc2VCcmFja2V0XDA1MUluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQ2xvc2VCcmFja2V0SW5GaWxlbmFtZS9DbG9zZUJyYWNrZXRcMDUxSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9EYXNoLUluUGF0aC9EYXNoSW5QYXRoSW52YWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRGFzaC1JblBhdGgvRGFzaEluUGF0aEludmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9EYXNoLUluUGF0aC9EYXNoSW5QYXRoSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9EYXNoLUluUGF0aC9EYXNoSW5QYXRoVmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Rhc2gtSW5QYXRoL0Rhc2hJblBhdGhWYWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Rhc2gtSW5QYXRoL0Rhc2hJblBhdGhWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9EYXNoSW5GaWxlbmFtZS9EYXNoLUluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9EYXNoSW5GaWxlbmFtZS9EYXNoLUluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRGFzaEluRmlsZW5hbWUvRGFzaC1JbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9EYXNoSW5GaWxlbmFtZS9EYXNoLUluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRGFzaEluRmlsZW5hbWUvRGFzaC1JbkZpbGVuYW1lVmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9EYXNoSW5GaWxlbmFtZS9EYXNoLUluRmlsZW5hbWVWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRXhjbGFtYXRpb25cMDQxSW5QYXRoL0V4Y2xhbWF0aW9uSW5QYXRoSW52YWxpZC53c2RsLWxvZyIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9FeGNsYW1hdGlvblwwNDFJblBhdGgvRXhjbGFtYXRpb25JblBhdGhJbnZhbGlkLndzZGwtbG9nIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9FeGNsYW1hdGlvblwwNDFJblBhdGgvRXhjbGFtYXRpb25JblBhdGhJbnZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRXhjbGFtYXRpb25cMDQxSW5QYXRoL0V4Y2xhbWF0aW9uSW5QYXRoVmFsaWQud3NkbC1sb2ciICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRXhjbGFtYXRpb25cMDQxSW5QYXRoL0V4Y2xhbWF0aW9uSW5QYXRoVmFsaWQud3NkbC1sb2ciCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0V4Y2xhbWF0aW9uXDA0MUluUGF0aC9FeGNsYW1hdGlvbkluUGF0aFZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRXhjbGFtYXRpb25JbkZpbGVuYW1lL0V4Y2xhbWF0aW9uXDA0MUluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0V4Y2xhbWF0aW9uSW5GaWxlbmFtZS9FeGNsYW1hdGlvblwwNDFJbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRXhjbGFtYXRpb25JbkZpbGVuYW1lL0V4Y2xhbWF0aW9uXDA0MUluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRXhjbGFtYXRpb25JbkZpbGVuYW1lL0V4Y2xhbWF0aW9uXDA0MUluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9FeGNsYW1hdGlvbkluRmlsZW5hbWUvRXhjbGFtYXRpb25cMDQxSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9FeGNsYW1hdGlvbkluRmlsZW5hbWUvRXhjbGFtYXRpb25cMDQxSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvT3BlbkJyYWNrZXRcMDUwSW5QYXRoL09wZW5CcmFja2V0SW5QYXRoSW52YWxpZC53c2RsLWxvZyIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9PcGVuQnJhY2tldFwwNTBJblBhdGgvT3BlbkJyYWNrZXRJblBhdGhJbnZhbGlkLndzZGwtbG9nIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9PcGVuQnJhY2tldFwwNTBJblBhdGgvT3BlbkJyYWNrZXRJblBhdGhJbnZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvT3BlbkJyYWNrZXRcMDUwSW5QYXRoL09wZW5CcmFja2V0SW5QYXRoVmFsaWQud3NkbC1sb2ciICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvT3BlbkJyYWNrZXRcMDUwSW5QYXRoL09wZW5CcmFja2V0SW5QYXRoVmFsaWQud3NkbC1sb2ciCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL09wZW5CcmFja2V0XDA1MEluUGF0aC9PcGVuQnJhY2tldEluUGF0aFZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvT3BlbkJyYWNrZXRJbkZpbGVuYW1lL09wZW5CcmFja2V0XDA1MEluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL09wZW5CcmFja2V0SW5GaWxlbmFtZS9PcGVuQnJhY2tldFwwNTBJbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvT3BlbkJyYWNrZXRJbkZpbGVuYW1lL09wZW5CcmFja2V0XDA1MEluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvT3BlbkJyYWNrZXRJbkZpbGVuYW1lL09wZW5CcmFja2V0XDA1MEluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9PcGVuQnJhY2tldEluRmlsZW5hbWUvT3BlbkJyYWNrZXRcMDUwSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9PcGVuQnJhY2tldEluRmlsZW5hbWUvT3BlbkJyYWNrZXRcMDUwSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9QZXJpb2QuSW5QYXRoL1BlcmlvZEluUGF0aEludmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1BlcmlvZC5JblBhdGgvUGVyaW9kSW5QYXRoSW52YWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1BlcmlvZC5JblBhdGgvUGVyaW9kSW5QYXRoSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9QZXJpb2QuSW5QYXRoL1BlcmlvZEluUGF0aFZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9QZXJpb2QuSW5QYXRoL1BlcmlvZEluUGF0aFZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUGVyaW9kLkluUGF0aC9QZXJpb2RJblBhdGhWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9QZXJpb2RJbkZpbGVuYW1lL1BlcmlvZC5JbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUGVyaW9kSW5GaWxlbmFtZS9QZXJpb2QuSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9QZXJpb2RJbkZpbGVuYW1lL1BlcmlvZC5JbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9QZXJpb2RJbkZpbGVuYW1lL1BlcmlvZC5JbkZpbGVuYW1lVmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1BlcmlvZEluRmlsZW5hbWUvUGVyaW9kLkluRmlsZW5hbWVWYWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1BlcmlvZEluRmlsZW5hbWUvUGVyaW9kLkluRmlsZW5hbWVWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUXVvdGVcMDQ3SW5QYXRoL1F1b3RlSW5QYXRoSW52YWxpZC53c2RsLWxvZyIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9RdW90ZVwwNDdJblBhdGgvUXVvdGVJblBhdGhJbnZhbGlkLndzZGwtbG9nIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9RdW90ZVwwNDdJblBhdGgvUXVvdGVJblBhdGhJbnZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUXVvdGVcMDQ3SW5QYXRoL1F1b3RlSW5QYXRoVmFsaWQud3NkbC1sb2ciICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUXVvdGVcMDQ3SW5QYXRoL1F1b3RlSW5QYXRoVmFsaWQud3NkbC1sb2ciCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1F1b3RlXDA0N0luUGF0aC9RdW90ZUluUGF0aFZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUXVvdGVJbkZpbGVuYW1lL1F1b3RlXDA0N0luRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1F1b3RlSW5GaWxlbmFtZS9RdW90ZVwwNDdJbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUXVvdGVJbkZpbGVuYW1lL1F1b3RlXDA0N0luRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUXVvdGVJbkZpbGVuYW1lL1F1b3RlXDA0N0luRmlsZW5hbWVWYWxpZC53c2RsLWxvZyIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9RdW90ZUluRmlsZW5hbWUvUXVvdGVcMDQ3SW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9RdW90ZUluRmlsZW5hbWUvUXVvdGVcMDQ3SW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9TcGFjZSBJblBhdGgvU3BhY2VJblBhdGhJbnZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9TcGFjZSBJblBhdGgvU3BhY2VJblBhdGhJbnZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9TcGFjZSBJblBhdGgvU3BhY2VJblBhdGhWYWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoVmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9TcGFjZSBJblBhdGgvU3BhY2VJblBhdGhWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9TcGFjZUluRmlsZW5hbWUvU3BhY2UgSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1NwYWNlSW5GaWxlbmFtZS9TcGFjZSBJbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1NwYWNlSW5GaWxlbmFtZS9TcGFjZSBJbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9TcGFjZUluRmlsZW5hbWUvU3BhY2UgSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9TcGFjZUluRmlsZW5hbWUvU3BhY2UgSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvU3BhY2VJbkZpbGVuYW1lL1NwYWNlIEluRmlsZW5hbWVWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9UaWxkZUluRmlsZW5hbWUvVGlsZGV+SW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1RpbGRlSW5GaWxlbmFtZS9UaWxkZX5JbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1RpbGRlSW5GaWxlbmFtZS9UaWxkZX5JbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9UaWxkZUluRmlsZW5hbWUvVGlsZGV+SW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9UaWxkZUluRmlsZW5hbWUvVGlsZGV+SW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVGlsZGVJbkZpbGVuYW1lL1RpbGRlfkluRmlsZW5hbWVWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9UaWxkZX5JblBhdGgvVGlsZGVJblBhdGhJbnZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9UaWxkZX5JblBhdGgvVGlsZGVJblBhdGhJbnZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9UaWxkZX5JblBhdGgvVGlsZGVJblBhdGhWYWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoVmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9UaWxkZX5JblBhdGgvVGlsZGVJblBhdGhWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9VbmRlcnNjb3JlSW5GaWxlbmFtZS9VbmRlcnNjb3JlX0luRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9VbmRlcnNjb3JlSW5GaWxlbmFtZS9VbmRlcnNjb3JlX0luRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVW5kZXJzY29yZUluRmlsZW5hbWUvVW5kZXJzY29yZV9JbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9VbmRlcnNjb3JlSW5GaWxlbmFtZS9VbmRlcnNjb3JlX0luRmlsZW5hbWVWYWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVW5kZXJzY29yZUluRmlsZW5hbWUvVW5kZXJzY29yZV9JbkZpbGVuYW1lVmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9VbmRlcnNjb3JlSW5GaWxlbmFtZS9VbmRlcnNjb3JlX0luRmlsZW5hbWVWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9VbmRlcnNjb3JlX0luUGF0aC9VbmRlcnNjb3JlSW5QYXRoSW52YWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVW5kZXJzY29yZV9JblBhdGgvVW5kZXJzY29yZUluUGF0aEludmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9VbmRlcnNjb3JlX0luUGF0aC9VbmRlcnNjb3JlSW5QYXRoSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFsyLCAxOTJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9VbmRlcnNjb3JlX0luUGF0aC9VbmRlcnNjb3JlSW5QYXRoVmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1VuZGVyc2NvcmVfSW5QYXRoL1VuZGVyc2NvcmVJblBhdGhWYWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1VuZGVyc2NvcmVfSW5QYXRoL1VuZGVyc2NvcmVJblBhdGhWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0N5Y2xpYy9Qb3J0dHlwZVJlZk1lc3NhZ2UxLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0N5Y2xpYy9Qb3J0dHlwZVJlZk1lc3NhZ2UxLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9DeWNsaWMvUG9ydHR5cGVSZWZNZXNzYWdlMS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0N5Y2xpYy9Qb3J0dHlwZVJlZk1lc3NhZ2UyLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0N5Y2xpYy9Qb3J0dHlwZVJlZk1lc3NhZ2UyLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9DeWNsaWMvUG9ydHR5cGVSZWZNZXNzYWdlMi53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy9JbXBvcnRPbmVBbmRUd28ud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL0ltcG9ydE9uZUFuZFR3by53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL0ltcG9ydE9uZUFuZFR3by53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy9vbmUud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL29uZS53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL29uZS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy90d28ud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL3R3by53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL3R3by53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnROb25FeGlzdGFudEZpbGUud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydE5vbkV4aXN0YW50RmlsZS53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzMDhmOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydE5vbkV4aXN0YW50RmlsZS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMQotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlICdUaGlzRmlsZURvZXNudEV4aXN0LndzZGwnIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBpbXBvcnRlZC4gQ2hlY2sgdGhhdCB0aGUgZG9jdW1lbnQgZXhpc3RzIGFuZCB0aGF0IHRoZSBsb2NhdGlvbiBpcyBjb3JyZWN0LiBbMywgODZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydEludmFsaWROUy53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnRJbnZhbGlkTlMud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZTJkMTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydEludmFsaWROUy53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMQotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIGZpbGUgY2Fubm90IGJlIGltcG9ydGVkIGJlY2F1c2UgdGhlIG5hbWVzcGFjZSAnaHR0cDovL2ludmFsaWRuYW1lc3BhY2UnIGRvZXMgbm90IG1hdGNoIHRoZSBpbXBvcnRlZCBkb2N1bWVudCdzIHRhcmdldCBuYW1lc3BhY2UgJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20nLiBbMywgNzNdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRXU0RMV2l0aFdTREwud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkRmlsZW5hbWUud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETEludmFsaWRGaWxlbmFtZS53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiY2E3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETEludmFsaWRGaWxlbmFtZS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMQotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlICdTSU1QTEVXU0RMLndzZGwnIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBpbXBvcnRlZC4gQ2hlY2sgdGhhdCB0aGUgZG9jdW1lbnQgZXhpc3RzIGFuZCB0aGF0IHRoZSBsb2NhdGlvbiBpcyBjb3JyZWN0LiBbMywgNzhdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkTlMud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETEludmFsaWROUy53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxOWYxMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETEludmFsaWROUy53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMQotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIGZpbGUgY2Fubm90IGJlIGltcG9ydGVkIGJlY2F1c2UgdGhlIG5hbWVzcGFjZSAnaHR0cDovL2ludmFsaWRuYW1lc3BhY2UnIGRvZXMgbm90IG1hdGNoIHRoZSBpbXBvcnRlZCBkb2N1bWVudCdzIHRhcmdldCBuYW1lc3BhY2UgJ2h0dHA6Ly90ZW1wdXJpLm9yZy9zaW1wbGV3c2RsLycuIFszLCA3OF0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydFhNTEludmFsaWRXU0RML0ltcG9ydFhNTEludmFsaWRXU0RMLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRYTUxJbnZhbGlkV1NETC9JbXBvcnRYTUxJbnZhbGlkV1NETC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwZjlmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydFhNTEludmFsaWRXU0RML0ltcG9ydFhNTEludmFsaWRXU0RMLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVJlZmVyZW5jZWQgZmlsZSBjb250YWlucyBlcnJvcnMgKG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFhNTEludmFsaWRXU0RML1hNTEludmFsaWRXU0RMLndzZGwpLiAgWzEsIDBdCi0tPiBFbGVtZW50IHR5cGUgIndzZGw6ZGVmaW5pdGlvbnMiIG11c3QgYmUgZm9sbG93ZWQgYnkgZWl0aGVyIGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9ucywgIj4iIG9yICIvPiIuIFs0LCAzXQotLT4gQXR0cmlidXRlIG5hbWUgInRhcmdldE5hbWVzcGFjZSIgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgdHlwZSAid3NkbDpkZWZpbml0aW9ucyIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgJyA9ICcgY2hhcmFjdGVyLiBbNCwgM10KLS0+IEF0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIiB3YXMgYWxyZWFkeSBzcGVjaWZpZWQgZm9yIGVsZW1lbnQgIndzZGw6ZGVmaW5pdGlvbnMiLiBbNCwgM10KLS0+IE9wZW4gcXVvdGUgaXMgZXhwZWN0ZWQgZm9yIGF0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIiBhc3NvY2lhdGVkIHdpdGggYW4gIGVsZW1lbnQgdHlwZSAgIndzZGw6ZGVmaW5pdGlvbnMiLiBbNCwgM10KLS0+IEVsZW1lbnQgdHlwZSAid3NkbDpkZWZpbml0aW9ucyIgbXVzdCBiZSBmb2xsb3dlZCBieSBlaXRoZXIgYXR0cmlidXRlIHNwZWNpZmljYXRpb25zLCAiPiIgb3IgIi8+Ii4gWzUsIDddCi0tPiBBdHRyaWJ1dGUgbmFtZSAieHNkOnNjaGVtYSIgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgdHlwZSAid3NkbDpkZWZpbml0aW9ucyIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgJyA9ICcgY2hhcmFjdGVyLiBbNSwgMThdCi0tPiBPcGVuIHF1b3RlIGlzIGV4cGVjdGVkIGZvciBhdHRyaWJ1dGUgInhzZDpzY2hlbWEiIGFzc29jaWF0ZWQgd2l0aCBhbiAgZWxlbWVudCB0eXBlICAid3NkbDpkZWZpbml0aW9ucyIuIFs1LCAxOF0KLS0+IEVsZW1lbnQgdHlwZSAid3NkbDpkZWZpbml0aW9ucyIgbXVzdCBiZSBmb2xsb3dlZCBieSBlaXRoZXIgYXR0cmlidXRlIHNwZWNpZmljYXRpb25zLCAiPiIgb3IgIi8+Ii4gWzUsIDI0XQotLT4gQXR0cmlidXRlICJ4bWxuczp4c2QiIHdhcyBhbHJlYWR5IHNwZWNpZmllZCBmb3IgZWxlbWVudCAid3NkbDpkZWZpbml0aW9ucyIuIFs1LCA4MV0KLS0+IGN2Yy1lbHQuMTogQ2Fubm90IGZpbmQgdGhlIGRlY2xhcmF0aW9uIG9mIGVsZW1lbnQgJ3dzZGw6ZGVmaW5pdGlvbnMnLiBbNSwgMTE2XQotLT4gVGhlIGVsZW1lbnQgdHlwZSAid3NkbDpkZWZpbml0aW9ucyIgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5IHRoZSBtYXRjaGluZyBlbmQtdGFnICI8L3dzZGw6ZGVmaW5pdGlvbnM+Ii4gWzgsIDddCi0tPiBUaGUgZW5kLXRhZyBmb3IgZWxlbWVudCB0eXBlICJ3c2RsOmRlZmluaXRpb25zIiBtdXN0IGVuZCB3aXRoIGEgJz4nIGRlbGltaXRlci4gWzgsIDddCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFs4LCA3XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbOCwgOF0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzgsIDldCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFs4LCAxMF0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzgsIDExXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbOCwgMTJdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFs4LCAxM10KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzgsIDE0XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbOCwgMTVdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFs4LCAxNl0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzgsIDE3XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzksIDVdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbOSwgNV0KLS0+IFRoZSBwcmVmaXggIndzZGwiIGZvciBlbGVtZW50ICJ3c2RsOnR5cGVzIiBpcyBub3QgYm91bmQuIFs5LCAxNl0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzksIDE2XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzEwLCA1XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6bWVzc2FnZSIgaXMgbm90IGJvdW5kLiBbMTAsIDQ2XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMTAsIDQ2XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzExLCA3XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6cGFydCIgaXMgbm90IGJvdW5kLiBbMTEsIDgxXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMTEsIDgxXQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzEyLCA2XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzEyLCA2XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6bWVzc2FnZSIgaXMgbm90IGJvdW5kLiBbMTIsIDE5XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMTIsIDE5XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzEzLCA1XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6bWVzc2FnZSIgaXMgbm90IGJvdW5kLiBbMTMsIDQ1XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMTMsIDQ1XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzE0LCA3XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6cGFydCIgaXMgbm90IGJvdW5kLiBbMTQsIDc5XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMTQsIDc5XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzE1LCA2XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzE1LCA2XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6bWVzc2FnZSIgaXMgbm90IGJvdW5kLiBbMTUsIDE5XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMTUsIDE5XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzE2LCA1XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6cG9ydFR5cGUiIGlzIG5vdCBib3VuZC4gWzE2LCA0MV0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzE2LCA0MV0KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFsxNywgN10KLS0+IFRoZSBwcmVmaXggIndzZGwiIGZvciBlbGVtZW50ICJ3c2RsOm9wZXJhdGlvbiIgaXMgbm90IGJvdW5kLiBbMTcsIDQyXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMTcsIDQyXQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzE4LCA5XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6aW5wdXQiIGlzIG5vdCBib3VuZC4gWzE4LCA1NV0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzE4LCA1NV0KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFsxOSwgOV0KLS0+IFRoZSBwcmVmaXggIndzZGwiIGZvciBlbGVtZW50ICJ3c2RsOm91dHB1dCIgaXMgbm90IGJvdW5kLiBbMTksIDU3XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMTksIDU3XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzIwLCA4XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzIwLCA4XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6b3BlcmF0aW9uIiBpcyBub3QgYm91bmQuIFsyMCwgMjNdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsyMCwgMjNdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMjEsIDZdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMjEsIDZdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpwb3J0VHlwZSIgaXMgbm90IGJvdW5kLiBbMjEsIDIwXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMjEsIDIwXQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzIyLCA1XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6YmluZGluZyIgaXMgbm90IGJvdW5kLiBbMjIsIDcwXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMjIsIDcwXQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzIzLCA3XQotLT4gVGhlIHByZWZpeCAic29hcCIgZm9yIGVsZW1lbnQgInNvYXA6YmluZGluZyIgaXMgbm90IGJvdW5kLiBbMjMsIDg3XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMjMsIDg3XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzI0LCA3XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6b3BlcmF0aW9uIiBpcyBub3QgYm91bmQuIFsyNCwgNDJdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsyNCwgNDJdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMjUsIDldCi0tPiBUaGUgcHJlZml4ICJzb2FwIiBmb3IgZWxlbWVudCAic29hcDpvcGVyYXRpb24iIGlzIG5vdCBib3VuZC4gWzI1LCA4NV0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzI1LCA4NV0KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFsyNiwgOV0KLS0+IFRoZSBwcmVmaXggIndzZGwiIGZvciBlbGVtZW50ICJ3c2RsOmlucHV0IiBpcyBub3QgYm91bmQuIFsyNiwgMjBdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsyNiwgMjBdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMjcsIDExXQotLT4gVGhlIHByZWZpeCAic29hcCIgZm9yIGVsZW1lbnQgInNvYXA6Ym9keSIgaXMgbm90IGJvdW5kLiBbMjcsIDM2XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMjcsIDM2XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzI4LCAxMF0KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFsyOCwgMTBdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDppbnB1dCIgaXMgbm90IGJvdW5kLiBbMjgsIDIxXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMjgsIDIxXQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzI5LCA5XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6b3V0cHV0IiBpcyBub3QgYm91bmQuIFsyOSwgMjFdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsyOSwgMjFdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzAsIDExXQotLT4gVGhlIHByZWZpeCAic29hcCIgZm9yIGVsZW1lbnQgInNvYXA6Ym9keSIgaXMgbm90IGJvdW5kLiBbMzAsIDM2XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMzAsIDM2XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzMxLCAxMF0KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFszMSwgMTBdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpvdXRwdXQiIGlzIG5vdCBib3VuZC4gWzMxLCAyMl0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzMxLCAyMl0KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFszMiwgOF0KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFszMiwgOF0KLS0+IFRoZSBwcmVmaXggIndzZGwiIGZvciBlbGVtZW50ICJ3c2RsOm9wZXJhdGlvbiIgaXMgbm90IGJvdW5kLiBbMzIsIDIzXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMzIsIDIzXQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzMzLCA2XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzMzLCA2XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6YmluZGluZyIgaXMgbm90IGJvdW5kLiBbMzMsIDE5XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMzMsIDE5XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzM0LCA1XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6c2VydmljZSIgaXMgbm90IGJvdW5kLiBbMzQsIDQwXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMzQsIDQwXQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzM1LCA3XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6cG9ydCIgaXMgbm90IGJvdW5kLiBbMzUsIDc2XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMzUsIDc2XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzM2LCA5XQotLT4gVGhlIHByZWZpeCAic29hcCIgZm9yIGVsZW1lbnQgInNvYXA6YWRkcmVzcyIgaXMgbm90IGJvdW5kLiBbMzYsIDU3XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMzYsIDU3XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzM3LCA4XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzM3LCA4XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6cG9ydCIgaXMgbm90IGJvdW5kLiBbMzcsIDE4XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMzcsIDE4XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzM4LCA2XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzM4LCA2XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6c2VydmljZSIgaXMgbm90IGJvdW5kLiBbMzgsIDE5XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMzgsIDE5XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzM5LCA0XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzM5LCA0XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6ZGVmaW5pdGlvbnMiIGlzIG5vdCBib3VuZC4gWzM5LCAyMV0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzM5LCAyMV0KLS0+IFhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbNDAsIDJdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRpbmdVc2luZ0NsYXNzcGF0aC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0aW5nVXNpbmdDbGFzc3BhdGgud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRpbmdVc2luZ0NsYXNzcGF0aC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRpbmdXU0RMV2l0aEltcG9ydGVkU2NoZW1hLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRpbmdXU0RMV2l0aEltcG9ydGVkU2NoZW1hLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0aW5nV1NETFdpdGhJbXBvcnRlZFNjaGVtYS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9XU0RMSW1wb3J0aW5nU2NoZW1hSW1wb3J0aW5nU2NoZW1hLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9XU0RMSW1wb3J0aW5nU2NoZW1hSW1wb3J0aW5nU2NoZW1hLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvV1NETEltcG9ydGluZ1NjaGVtYUltcG9ydGluZ1NjaGVtYS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9XU0RMSW1wb3J0aW5nVHlwZXMud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L1dTRExJbXBvcnRpbmdUeXBlcy53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L1dTRExJbXBvcnRpbmdUeXBlcy53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9XU0RMTmFtZXNwYWNlQUFBLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9XU0RMTmFtZXNwYWNlQUFBLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvV1NETE5hbWVzcGFjZUFBQS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML1NlbGZDb250YWluZWQvRW1wdHkud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9FbXB0eS53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9FbXB0eS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML1NlbGZDb250YWluZWQvTm9EZWZhdWx0TmFtZXNwYWNlL05vRGVmYXVsdE5hbWVzcGFjZS53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9TZWxmQ29udGFpbmVkL05vRGVmYXVsdE5hbWVzcGFjZS9Ob0RlZmF1bHROYW1lc3BhY2Uud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML1NlbGZDb250YWluZWQvTm9EZWZhdWx0TmFtZXNwYWNlL05vRGVmYXVsdE5hbWVzcGFjZS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML1NlbGZDb250YWluZWQvUmVmZXJlbmNlSW5saW5lVHlwZXMud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9SZWZlcmVuY2VJbmxpbmVUeXBlcy53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9SZWZlcmVuY2VJbmxpbmVUeXBlcy53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML1NlbGZDb250YWluZWQvU09BUEJvZHlFbmNvZGVkTm9OYW1lc3BhY2Uud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9TT0FQQm9keUVuY29kZWROb05hbWVzcGFjZS53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9TT0FQQm9keUVuY29kZWROb05hbWVzcGFjZS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML1NlbGZDb250YWluZWQvU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZS53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9TZWxmQ29udGFpbmVkL1NPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2Uud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML1NlbGZDb250YWluZWQvU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvRW50aXRpZXMvbm9ybWFsaXplRW50aXRpZXNJbnZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvRW50aXRpZXMvbm9ybWFsaXplRW50aXRpZXNJbnZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmRhZjQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL0VudGl0aWVzL25vcm1hbGl6ZUVudGl0aWVzSW52YWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIHZhbHVlIG9mIGF0dHJpYnV0ZSAidmFsdWUiIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IHR5cGUgInhzZDpwYXR0ZXJuIiBtdXN0IG5vdCBjb250YWluIHRoZSAnPCcgY2hhcmFjdGVyLiBbMTEsIDU1XQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL0VudGl0aWVzL25vcm1hbGl6ZUVudGl0aWVzVmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1hTRC9FbnRpdGllcy9ub3JtYWxpemVFbnRpdGllc1ZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL0VudGl0aWVzL25vcm1hbGl6ZUVudGl0aWVzVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL0ltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlL0ltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL0lubGluZVNjaGVtYUdlbmVyYXRlZEltcG9ydHMvTm9JbXBvcnRGb3JVbnByZWZpeGVkQXR0cmlidXRlLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvSW5saW5lU2NoZW1hR2VuZXJhdGVkSW1wb3J0cy9Ob0ltcG9ydEZvclVucHJlZml4ZWRBdHRyaWJ1dGUud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvSW5saW5lU2NoZW1hR2VuZXJhdGVkSW1wb3J0cy9Ob0ltcG9ydEZvclVucHJlZml4ZWRBdHRyaWJ1dGUud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0Qud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1hTRC9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0QvT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNELndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDViNjEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0Qud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXNyYy1yZXNvbHZlLjQuMjogRXJyb3IgcmVzb2x2aW5nIGNvbXBvbmVudCAneHNkOnN0cmluZ2EnLiBJdCB3YXMgZGV0ZWN0ZWQgdGhhdCAneHNkOnN0cmluZ2EnIGlzIGluIG5hbWVzcGFjZSAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnLCBidXQgY29tcG9uZW50cyBmcm9tIHRoaXMgbmFtZXNwYWNlIGFyZSBub3QgcmVmZXJlbmNlYWJsZSBmcm9tIHNjaGVtYSBkb2N1bWVudCAnb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0Qud3NkbCcuIElmIHRoaXMgaXMgdGhlIGluY29ycmVjdCBuYW1lc3BhY2UsIHBlcmhhcHMgdGhlIHByZWZpeCBvZiAneHNkOnN0cmluZ2EnIG5lZWRzIHRvIGJlIGNoYW5nZWQuIElmIHRoaXMgaXMgdGhlIGNvcnJlY3QgbmFtZXNwYWNlLCB0aGVuIGFuIGFwcHJvcHJpYXRlICdpbXBvcnQnIHRhZyBzaG91bGQgYmUgYWRkZWQgdG8gJ29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0QvT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNELndzZGwnLiBbNywgNjFdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS9SZWZlclRvQW5vdGhlcklubGluZVR5cGUud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvUmVzdHJpY3Rpb25QYXR0ZXJuV2l0aENvbG9uL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi9SZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24ud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvUmVzdHJpY3Rpb25QYXR0ZXJuV2l0aENvbG9uL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvU2NoZW1hRG9jRWxlbVdpdGhTb3VyY2VBbmRTdWJFbGVtL1NjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL1NjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS9TY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0ud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvU2NoZW1hRG9jRWxlbVdpdGhTb3VyY2VBbmRTdWJFbGVtL1NjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvVmFsdWVDb2xvbi9WYWx1ZUNvbG9uLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvVmFsdWVDb2xvbi9WYWx1ZUNvbG9uLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL1ZhbHVlQ29sb24vVmFsdWVDb2xvbi53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQW5nbGVIYXRJbkZpbGVuYW1lL0FuZ2xlSGF0XkluRmlsZW5hbWVJbnZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9BbmdsZUhhdEluRmlsZW5hbWUvQW5nbGVIYXReSW5GaWxlbmFtZUludmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9BbmdsZUhhdEluRmlsZW5hbWUvQW5nbGVIYXReSW5GaWxlbmFtZUludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQW5nbGVIYXRJbkZpbGVuYW1lL0FuZ2xlSGF0XkluRmlsZW5hbWVWYWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQW5nbGVIYXRJbkZpbGVuYW1lL0FuZ2xlSGF0XkluRmlsZW5hbWVWYWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0FuZ2xlSGF0SW5GaWxlbmFtZS9BbmdsZUhhdF5JbkZpbGVuYW1lVmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoSW52YWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoSW52YWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0FuZ2xlSGF0XkluUGF0aC9BbmdsZUhhdEluUGF0aEludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoVmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0FuZ2xlSGF0XkluUGF0aC9BbmdsZUhhdEluUGF0aFZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoVmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Nsb3NlQnJhY2tldFwwNTFJblBhdGgvQ2xvc2VCcmFja2V0SW5QYXRoSW52YWxpZC53c2RsIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9DbG9zZUJyYWNrZXRcMDUxSW5QYXRoL0Nsb3NlQnJhY2tldEluUGF0aEludmFsaWQud3NkbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Nsb3NlQnJhY2tldFwwNTFJblBhdGgvQ2xvc2VCcmFja2V0SW5QYXRoSW52YWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Nsb3NlQnJhY2tldFwwNTFJblBhdGgvQ2xvc2VCcmFja2V0SW5QYXRoVmFsaWQud3NkbCIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQ2xvc2VCcmFja2V0XDA1MUluUGF0aC9DbG9zZUJyYWNrZXRJblBhdGhWYWxpZC53c2RsIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQ2xvc2VCcmFja2V0XDA1MUluUGF0aC9DbG9zZUJyYWNrZXRJblBhdGhWYWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Nsb3NlQnJhY2tldEluRmlsZW5hbWUvQ2xvc2VCcmFja2V0XDA1MUluRmlsZW5hbWVJbnZhbGlkLndzZGwiICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Nsb3NlQnJhY2tldEluRmlsZW5hbWUvQ2xvc2VCcmFja2V0XDA1MUluRmlsZW5hbWVJbnZhbGlkLndzZGwiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9DbG9zZUJyYWNrZXRJbkZpbGVuYW1lL0Nsb3NlQnJhY2tldFwwNTFJbkZpbGVuYW1lSW52YWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Nsb3NlQnJhY2tldEluRmlsZW5hbWUvQ2xvc2VCcmFja2V0XDA1MUluRmlsZW5hbWVWYWxpZC53c2RsIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9DbG9zZUJyYWNrZXRJbkZpbGVuYW1lL0Nsb3NlQnJhY2tldFwwNTFJbkZpbGVuYW1lVmFsaWQud3NkbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Nsb3NlQnJhY2tldEluRmlsZW5hbWUvQ2xvc2VCcmFja2V0XDA1MUluRmlsZW5hbWVWYWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRGFzaC1JblBhdGgvRGFzaEluUGF0aEludmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Rhc2gtSW5QYXRoL0Rhc2hJblBhdGhJbnZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRGFzaC1JblBhdGgvRGFzaEluUGF0aEludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRGFzaC1JblBhdGgvRGFzaEluUGF0aFZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9EYXNoLUluUGF0aC9EYXNoSW5QYXRoVmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9EYXNoLUluUGF0aC9EYXNoSW5QYXRoVmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRGFzaEluRmlsZW5hbWUvRGFzaC1JbkZpbGVuYW1lSW52YWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRGFzaEluRmlsZW5hbWUvRGFzaC1JbkZpbGVuYW1lSW52YWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Rhc2hJbkZpbGVuYW1lL0Rhc2gtSW5GaWxlbmFtZUludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRGFzaEluRmlsZW5hbWUvRGFzaC1JbkZpbGVuYW1lVmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Rhc2hJbkZpbGVuYW1lL0Rhc2gtSW5GaWxlbmFtZVZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRGFzaEluRmlsZW5hbWUvRGFzaC1JbkZpbGVuYW1lVmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0V4Y2xhbWF0aW9uXDA0MUluUGF0aC9FeGNsYW1hdGlvbkluUGF0aEludmFsaWQud3NkbCIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRXhjbGFtYXRpb25cMDQxSW5QYXRoL0V4Y2xhbWF0aW9uSW5QYXRoSW52YWxpZC53c2RsIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRXhjbGFtYXRpb25cMDQxSW5QYXRoL0V4Y2xhbWF0aW9uSW5QYXRoSW52YWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0V4Y2xhbWF0aW9uXDA0MUluUGF0aC9FeGNsYW1hdGlvbkluUGF0aFZhbGlkLndzZGwiICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0V4Y2xhbWF0aW9uXDA0MUluUGF0aC9FeGNsYW1hdGlvbkluUGF0aFZhbGlkLndzZGwiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9FeGNsYW1hdGlvblwwNDFJblBhdGgvRXhjbGFtYXRpb25JblBhdGhWYWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0V4Y2xhbWF0aW9uSW5GaWxlbmFtZS9FeGNsYW1hdGlvblwwNDFJbkZpbGVuYW1lSW52YWxpZC53c2RsIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9FeGNsYW1hdGlvbkluRmlsZW5hbWUvRXhjbGFtYXRpb25cMDQxSW5GaWxlbmFtZUludmFsaWQud3NkbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0V4Y2xhbWF0aW9uSW5GaWxlbmFtZS9FeGNsYW1hdGlvblwwNDFJbkZpbGVuYW1lSW52YWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0V4Y2xhbWF0aW9uSW5GaWxlbmFtZS9FeGNsYW1hdGlvblwwNDFJbkZpbGVuYW1lVmFsaWQud3NkbCIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRXhjbGFtYXRpb25JbkZpbGVuYW1lL0V4Y2xhbWF0aW9uXDA0MUluRmlsZW5hbWVWYWxpZC53c2RsIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRXhjbGFtYXRpb25JbkZpbGVuYW1lL0V4Y2xhbWF0aW9uXDA0MUluRmlsZW5hbWVWYWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL09wZW5CcmFja2V0XDA1MEluUGF0aC9PcGVuQnJhY2tldEluUGF0aEludmFsaWQud3NkbCIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvT3BlbkJyYWNrZXRcMDUwSW5QYXRoL09wZW5CcmFja2V0SW5QYXRoSW52YWxpZC53c2RsIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvT3BlbkJyYWNrZXRcMDUwSW5QYXRoL09wZW5CcmFja2V0SW5QYXRoSW52YWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL09wZW5CcmFja2V0XDA1MEluUGF0aC9PcGVuQnJhY2tldEluUGF0aFZhbGlkLndzZGwiICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL09wZW5CcmFja2V0XDA1MEluUGF0aC9PcGVuQnJhY2tldEluUGF0aFZhbGlkLndzZGwiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9PcGVuQnJhY2tldFwwNTBJblBhdGgvT3BlbkJyYWNrZXRJblBhdGhWYWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL09wZW5CcmFja2V0SW5GaWxlbmFtZS9PcGVuQnJhY2tldFwwNTBJbkZpbGVuYW1lSW52YWxpZC53c2RsIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9PcGVuQnJhY2tldEluRmlsZW5hbWUvT3BlbkJyYWNrZXRcMDUwSW5GaWxlbmFtZUludmFsaWQud3NkbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL09wZW5CcmFja2V0SW5GaWxlbmFtZS9PcGVuQnJhY2tldFwwNTBJbkZpbGVuYW1lSW52YWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL09wZW5CcmFja2V0SW5GaWxlbmFtZS9PcGVuQnJhY2tldFwwNTBJbkZpbGVuYW1lVmFsaWQud3NkbCIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvT3BlbkJyYWNrZXRJbkZpbGVuYW1lL09wZW5CcmFja2V0XDA1MEluRmlsZW5hbWVWYWxpZC53c2RsIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvT3BlbkJyYWNrZXRJbkZpbGVuYW1lL09wZW5CcmFja2V0XDA1MEluRmlsZW5hbWVWYWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUGVyaW9kLkluUGF0aC9QZXJpb2RJblBhdGhJbnZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9QZXJpb2QuSW5QYXRoL1BlcmlvZEluUGF0aEludmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9QZXJpb2QuSW5QYXRoL1BlcmlvZEluUGF0aEludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUGVyaW9kLkluUGF0aC9QZXJpb2RJblBhdGhWYWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUGVyaW9kLkluUGF0aC9QZXJpb2RJblBhdGhWYWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1BlcmlvZC5JblBhdGgvUGVyaW9kSW5QYXRoVmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUGVyaW9kSW5GaWxlbmFtZS9QZXJpb2QuSW5GaWxlbmFtZUludmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1BlcmlvZEluRmlsZW5hbWUvUGVyaW9kLkluRmlsZW5hbWVJbnZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUGVyaW9kSW5GaWxlbmFtZS9QZXJpb2QuSW5GaWxlbmFtZUludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUGVyaW9kSW5GaWxlbmFtZS9QZXJpb2QuSW5GaWxlbmFtZVZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9QZXJpb2RJbkZpbGVuYW1lL1BlcmlvZC5JbkZpbGVuYW1lVmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9QZXJpb2RJbkZpbGVuYW1lL1BlcmlvZC5JbkZpbGVuYW1lVmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1F1b3RlXDA0N0luUGF0aC9RdW90ZUluUGF0aEludmFsaWQud3NkbCIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUXVvdGVcMDQ3SW5QYXRoL1F1b3RlSW5QYXRoSW52YWxpZC53c2RsIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUXVvdGVcMDQ3SW5QYXRoL1F1b3RlSW5QYXRoSW52YWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1F1b3RlXDA0N0luUGF0aC9RdW90ZUluUGF0aFZhbGlkLndzZGwiICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1F1b3RlXDA0N0luUGF0aC9RdW90ZUluUGF0aFZhbGlkLndzZGwiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9RdW90ZVwwNDdJblBhdGgvUXVvdGVJblBhdGhWYWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1F1b3RlSW5GaWxlbmFtZS9RdW90ZVwwNDdJbkZpbGVuYW1lSW52YWxpZC53c2RsIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9RdW90ZUluRmlsZW5hbWUvUXVvdGVcMDQ3SW5GaWxlbmFtZUludmFsaWQud3NkbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1F1b3RlSW5GaWxlbmFtZS9RdW90ZVwwNDdJbkZpbGVuYW1lSW52YWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1F1b3RlSW5GaWxlbmFtZS9RdW90ZVwwNDdJbkZpbGVuYW1lVmFsaWQud3NkbCIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUXVvdGVJbkZpbGVuYW1lL1F1b3RlXDA0N0luRmlsZW5hbWVWYWxpZC53c2RsIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUXVvdGVJbkZpbGVuYW1lL1F1b3RlXDA0N0luRmlsZW5hbWVWYWxpZC53c2RsIgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoSW52YWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoSW52YWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1NwYWNlIEluUGF0aC9TcGFjZUluUGF0aEludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoVmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1NwYWNlIEluUGF0aC9TcGFjZUluUGF0aFZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoVmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvU3BhY2VJbkZpbGVuYW1lL1NwYWNlIEluRmlsZW5hbWVJbnZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9TcGFjZUluRmlsZW5hbWUvU3BhY2UgSW5GaWxlbmFtZUludmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9TcGFjZUluRmlsZW5hbWUvU3BhY2UgSW5GaWxlbmFtZUludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvU3BhY2VJbkZpbGVuYW1lL1NwYWNlIEluRmlsZW5hbWVWYWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvU3BhY2VJbkZpbGVuYW1lL1NwYWNlIEluRmlsZW5hbWVWYWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1NwYWNlSW5GaWxlbmFtZS9TcGFjZSBJbkZpbGVuYW1lVmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVGlsZGVJbkZpbGVuYW1lL1RpbGRlfkluRmlsZW5hbWVJbnZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9UaWxkZUluRmlsZW5hbWUvVGlsZGV+SW5GaWxlbmFtZUludmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9UaWxkZUluRmlsZW5hbWUvVGlsZGV+SW5GaWxlbmFtZUludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVGlsZGVJbkZpbGVuYW1lL1RpbGRlfkluRmlsZW5hbWVWYWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVGlsZGVJbkZpbGVuYW1lL1RpbGRlfkluRmlsZW5hbWVWYWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1RpbGRlSW5GaWxlbmFtZS9UaWxkZX5JbkZpbGVuYW1lVmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoSW52YWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoSW52YWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1RpbGRlfkluUGF0aC9UaWxkZUluUGF0aEludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoVmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1RpbGRlfkluUGF0aC9UaWxkZUluUGF0aFZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoVmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVW5kZXJzY29yZUluRmlsZW5hbWUvVW5kZXJzY29yZV9JbkZpbGVuYW1lSW52YWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVW5kZXJzY29yZUluRmlsZW5hbWUvVW5kZXJzY29yZV9JbkZpbGVuYW1lSW52YWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1VuZGVyc2NvcmVJbkZpbGVuYW1lL1VuZGVyc2NvcmVfSW5GaWxlbmFtZUludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVW5kZXJzY29yZUluRmlsZW5hbWUvVW5kZXJzY29yZV9JbkZpbGVuYW1lVmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1VuZGVyc2NvcmVJbkZpbGVuYW1lL1VuZGVyc2NvcmVfSW5GaWxlbmFtZVZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVW5kZXJzY29yZUluRmlsZW5hbWUvVW5kZXJzY29yZV9JbkZpbGVuYW1lVmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVW5kZXJzY29yZV9JblBhdGgvVW5kZXJzY29yZUluUGF0aEludmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1VuZGVyc2NvcmVfSW5QYXRoL1VuZGVyc2NvcmVJblBhdGhJbnZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVW5kZXJzY29yZV9JblBhdGgvVW5kZXJzY29yZUluUGF0aEludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVW5kZXJzY29yZV9JblBhdGgvVW5kZXJzY29yZUluUGF0aFZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9VbmRlcnNjb3JlX0luUGF0aC9VbmRlcnNjb3JlSW5QYXRoVmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9VbmRlcnNjb3JlX0luUGF0aC9VbmRlcnNjb3JlSW5QYXRoVmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9DeWNsaWMvUG9ydHR5cGVSZWZNZXNzYWdlMS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9DeWNsaWMvUG9ydHR5cGVSZWZNZXNzYWdlMS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2U0YzU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvQ3ljbGljL1BvcnR0eXBlUmVmTWVzc2FnZTEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9jeWNsaWMxLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImN5Y2xpYzEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL2N5Y2xpYzEvIiB4bWxuczpjeWNsaWMyPSJodHRwOi8vdGVtcHVyaS5vcmcvY3ljbGljMi8iPgotICA8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvY3ljbGljMi8iIGxvY2F0aW9uPSJQb3J0dHlwZVJlZk1lc3NhZ2UyLndzZGwiPjwvd3NkbDppbXBvcnQ+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL2N5Y2xpYzEvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6TmV3T3BlcmF0aW9uUmVzcG9uc2UiIG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOk5ld09wZXJhdGlvblJlcXVlc3QiIG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9ImN5Y2xpYzEiPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJOZXdPcGVyYXRpb24iPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iY3ljbGljMjpOZXdPcGVyYXRpb25SZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iY3ljbGljMjpOZXdPcGVyYXRpb25SZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvQ3ljbGljL1BvcnR0eXBlUmVmTWVzc2FnZTIud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvQ3ljbGljL1BvcnR0eXBlUmVmTWVzc2FnZTIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEzNTI5MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0N5Y2xpYy9Qb3J0dHlwZVJlZk1lc3NhZ2UyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvY3ljbGljMi8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjeWNsaWMyIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9jeWNsaWMyLyIgeG1sbnM6Y3ljbGljMT0iaHR0cDovL3RlbXB1cmkub3JnL2N5Y2xpYzEvIj4KLSAgPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL2N5Y2xpYzEvIiBsb2NhdGlvbj0iUG9ydHR5cGVSZWZNZXNzYWdlMS53c2RsIj48L3dzZGw6aW1wb3J0PgotICA8d3NkbDp0eXBlcz4KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9jeWNsaWMyLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOk5ld09wZXJhdGlvblJlc3BvbnNlIiBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpOZXdPcGVyYXRpb25SZXF1ZXN0IiBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0Ii8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJjeWNsaWMyIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImN5Y2xpYzE6TmV3T3BlcmF0aW9uUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImN5Y2xpYzE6TmV3T3BlcmF0aW9uUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy9JbXBvcnRPbmVBbmRUd28ud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL0ltcG9ydE9uZUFuZFR3by53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzYzYWYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL0ltcG9ydE9uZUFuZFR3by53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCW5hbWU9IkltcG9ydE9uZUFuZFR3byIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9JbXBvcnRPbmVBbmRUd28iIAotCXhtbG5zOndzZGwxPSJodHRwOi8vdGVtcHVyaS5vcmcvb25lLndzZGwiCi0JeG1sbnM6d3NkbDI9Imh0dHA6Ly9hdGVtcHVyaS5vcmcvdHdvLndzZGwiPgotCi0JCi08d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvb25lLndzZGwiIGxvY2F0aW9uPSJvbmUud3NkbCIvPgotPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2F0ZW1wdXJpLm9yZy90d28ud3NkbCIgbG9jYXRpb249InR3by53c2RsIi8+Ci0JCi08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvb25lLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy9vbmUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwZmYxMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy9vbmUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9vbmUud3NkbCIKLQl4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJvbmUiCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvb25lLndzZGwiPgotCQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iTWVzc2FnZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iTWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy90d28ud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL3R3by53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGYxNjBjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL3R3by53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gSXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbmFtZXNwYWNlIG9mIHRoaXMgZG9jdW1lbnQgc3RhcnQgd2l0aCBhbiBhIGFzIGl0IHNob3VsZAotICAgICBiZSBpbXBvcnRlZCBmaXJzdCBieSBJbXBvcnRPbmVBbmRUd28ud3NkbC4gVGhlIG9yZGVyIG9mIHRoZSBpbXBvcnRzIGlzIGRldGVybWluZWQKLSAgICAgYnkgYWxwaGFiZXRpY2FsIG9yZGVyIG9mIHRoZSBuYW1lc3BhY2VzIGluIHRoaXMgZGVmZWN0LiAtLT4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL2F0ZW1wdXJpLm9yZy90d28ud3NkbCIKLQl4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgbmFtZT0idHdvIgotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2F0ZW1wdXJpLm9yZy90d28ud3NkbCIKLQl4bWxuczp3c2RsMT0iaHR0cDovL3RlbXB1cmkub3JnL29uZS53c2RsIiB4bWxuczp3c2RsMj0iaHR0cDovL2F0ZW1wdXJpLm9yZy90d28ud3NkbCI+Ci0JPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL29uZS53c2RsIgotCQlsb2NhdGlvbj0ib25lLndzZGwiPgotCTwvd3NkbDppbXBvcnQ+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iUG9ydFR5cGUiPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzZGwxOk1lc3NhZ2UiIG5hbWU9IklucHV0Ii8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0id3NkbDE6TWVzc2FnZSIgbmFtZT0iT3V0cHV0Ii8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0Tm9uRXhpc3RhbnRGaWxlLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnROb25FeGlzdGFudEZpbGUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3Njc1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnROb25FeGlzdGFudEZpbGUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydE5vbkV4aXN0YW50RmlsZS8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJJbXBvcnROb25FeGlzdGFudEZpbGUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydE5vbkV4aXN0YW50RmlsZS8iPgotCTx3c2RsOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9ub25leGlzdGluZ2ZpbGUiIGxvY2F0aW9uPSJUaGlzRmlsZURvZXNudEV4aXN0LndzZGwiPjwvd3NkbDppbXBvcnQ+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhZWViMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnQvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydFNjaGVtYVdpdGhXU0RMSW1wb3J0LyIgeG1sbnM6c2NoZW1hPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIj4KLSAgPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSIgbG9jYXRpb249InNjaGVtYS54c2QiPjwvd3NkbDppbXBvcnQ+ICAgIAotICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld01lc3NhZ2UiPgotICAgIAk8d3NkbDpwYXJ0IG5hbWU9Ik5ld01lc3NhZ2UiIGVsZW1lbnQ9InNjaGVtYTpOZXdHbG9iYWxFbGVtZW50Ij48L3dzZGw6cGFydD4KLSAgICA8L3dzZGw6bWVzc2FnZT4gICAKLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFNjaGVtYVdpdGhXU0RMSW1wb3J0SW52YWxpZE5TLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydEludmFsaWROUy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDFhMDI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFNjaGVtYVdpdGhXU0RMSW1wb3J0SW52YWxpZE5TLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydEludmFsaWROUy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJJbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydEludmFsaWROUyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnRJbnZhbGlkTlMvIj4KLQk8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vaW52YWxpZG5hbWVzcGFjZSIgbG9jYXRpb249InNjaGVtYS54c2QiPjwvd3NkbDppbXBvcnQ+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRXU0RMV2l0aFdTREwud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzhlMmYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0V1NETFdpdGhXU0RMLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IkltcG9ydFdTRExXaXRoV1NETCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0V1NETFdpdGhXU0RMLyI+Ci0JPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL3NpbXBsZXdzZGwvIiBsb2NhdGlvbj0ic2ltcGxld3NkbC53c2RsIj48L3dzZGw6aW1wb3J0PgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZEZpbGVuYW1lLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkRmlsZW5hbWUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViYjkzYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkRmlsZW5hbWUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydFdTRExXaXRoV1NETEludmFsaWRGaWxlbmFtZS8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJJbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkRmlsZW5hbWUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydFdTRExXaXRoV1NETEludmFsaWRGaWxlbmFtZS8iPgotCTx3c2RsOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9pbnZhbGlkbmFtZXNwYWNlIiBsb2NhdGlvbj0iU0lNUExFV1NETC53c2RsIj48L3dzZGw6aW1wb3J0PgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZE5TLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkTlMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4MmVhNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkTlMud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydFdTRExXaXRoV1NETEludmFsaWROUy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJJbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkTlMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydFdTRExXaXRoV1NETEludmFsaWROUy8iPgotCTx3c2RsOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9pbnZhbGlkbmFtZXNwYWNlIiBsb2NhdGlvbj0ic2ltcGxld3NkbC53c2RsIj48L3dzZGw6aW1wb3J0PgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0WE1MSW52YWxpZFdTREwvSW1wb3J0WE1MSW52YWxpZFdTREwud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFhNTEludmFsaWRXU0RML0ltcG9ydFhNTEludmFsaWRXU0RMLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYTc4ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0WE1MSW52YWxpZFdTREwvSW1wb3J0WE1MSW52YWxpZFdTREwud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydFhNTEludmFsaWRXU0RMLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IkltcG9ydFhNTEludmFsaWRXU0RMIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRYTUxJbnZhbGlkV1NETC8iPgotCTx3c2RsOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9YTUxJbnZhbGlkV1NETC8iIGxvY2F0aW9uPSJYTUxJbnZhbGlkV1NETC53c2RsIj48L3dzZGw6aW1wb3J0PgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0WE1MSW52YWxpZFdTREwvWE1MSW52YWxpZFdTREwud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFhNTEludmFsaWRXU0RML1hNTEludmFsaWRXU0RMLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTJkODEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0WE1MSW52YWxpZFdTREwvWE1MSW52YWxpZFdTREwud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudCBpc24ndCBjbG9zZWQuIC0tPgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvWE1MSW52YWxpZFdTREwvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iWE1MSW52YWxpZFdTREwiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1hNTEludmFsaWRXU0RMLyIKLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvWE1MSW52YWxpZFdTREwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6TmV3T3BlcmF0aW9uUmVzcG9uc2UiIG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOk5ld09wZXJhdGlvblJlcXVlc3QiIG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlhNTEludmFsaWRXU0RMIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpOZXdPcGVyYXRpb25SZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOk5ld09wZXJhdGlvblJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IlhNTEludmFsaWRXU0RMU09BUCIgdHlwZT0idG5zOlhNTEludmFsaWRXU0RMIj4KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvWE1MSW52YWxpZFdTREwvTmV3T3BlcmF0aW9uIi8+Ci0gICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iWE1MSW52YWxpZFdTREwiPgotICAgIDx3c2RsOnBvcnQgYmluZGluZz0idG5zOlhNTEludmFsaWRXU0RMU09BUCIgbmFtZT0iWE1MSW52YWxpZFdTRExTT0FQIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRlZFVzaW5nQ2xhc3NwYXRoLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRlZFVzaW5nQ2xhc3NwYXRoLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTU2NTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0ZWRVc2luZ0NsYXNzcGF0aC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0ZWRVc2luZ0NsYXNzcGF0aC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJJbXBvcnRlZFVzaW5nQ2xhc3NwYXRoIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRlZFVzaW5nQ2xhc3NwYXRoLyI+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJtZXNzYWdlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3dzZGw6cGFydD4KLQk8L3dzZGw6bWVzc2FnZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydGluZ1NjaGVtYU5vdEluRGlyLnhzZCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydGluZ1NjaGVtYU5vdEluRGlyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmZmRjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRpbmdTY2hlbWFOb3RJbkRpci54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiB4bWxuczpJbXBvcnRpbmdTY2hlbWFOb3RJbkRpcj0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSIgeG1sbnM6cGxhaW5zY2hlbWE9Imh0dHA6Ly9wbGFpbnNjaGVtYSI+Ci0JPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9wbGFpbnNjaGVtYSIgc2NoZW1hTG9jYXRpb249InN1YmZvbGRlci9QbGFpblNjaGVtYS54c2QiPjwvaW1wb3J0PgotCTxlbGVtZW50IG5hbWU9Ik5ld0dsb2JhbEVsZW1lbnQiIHR5cGU9InBsYWluc2NoZW1hOk5ld1NpbXBsZVR5cGUiPjwvZWxlbWVudD4KLQotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0aW5nVXNpbmdDbGFzc3BhdGgud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydGluZ1VzaW5nQ2xhc3NwYXRoLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZjU5ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0aW5nVXNpbmdDbGFzc3BhdGgud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRpbmdVc2luZ0NsYXNzcGF0aC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJJbXBvcnRpbmdVc2luZ0NsYXNzcGF0aCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0aW5nVXNpbmdDbGFzc3BhdGgvIiB4bWxuczpjbGFzc3BhdGg9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRlZFVzaW5nQ2xhc3NwYXRoLyI+Ci0JPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydGVkVXNpbmdDbGFzc3BhdGgvIiBsb2NhdGlvbj0iSW1wb3J0ZWRVc2luZ0NsYXNzcGF0aC53c2RsIj48L3dzZGw6aW1wb3J0PgotICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9InBvcnRUeXBlIj4KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvcGVyYXRpb24iPgotICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJjbGFzc3BhdGg6bWVzc2FnZSI+PC93c2RsOmlucHV0PgotICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iY2xhc3NwYXRoOm1lc3NhZ2UiPjwvd3NkbDpvdXRwdXQ+Ci0gICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpwb3J0VHlwZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydGluZ1dTRExXaXRoSW1wb3J0ZWRTY2hlbWEud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydGluZ1dTRExXaXRoSW1wb3J0ZWRTY2hlbWEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5YzdjMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRpbmdXU0RMV2l0aEltcG9ydGVkU2NoZW1hLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRpbmdXU0RMV2l0aEltcG9ydGVkU2NoZW1hLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IkltcG9ydGluZ1dTRExXaXRoSW1wb3J0ZWRTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydGluZ1dTRExXaXRoSW1wb3J0ZWRTY2hlbWEvIiB4bWxuczp3c2RsMT0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydGVkSW1wb3J0aW5nU2NoZW1hLyI+Ci0JPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydGVkSW1wb3J0aW5nU2NoZW1hLyIgbG9jYXRpb249InN1YmZvbGRlci9JbXBvcnRlZEltcG9ydGluZ1NjaGVtYS53c2RsIj48L3dzZGw6aW1wb3J0PgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3TWVzc2FnZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iTmV3TWVzc2FnZSIgZWxlbWVudD0id3NkbDE6TmV3R2xvYmFsRWxlbWVudCI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9TY2hlbWFOYW1lc3BhY2VBQUEueHNkIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvU2NoZW1hTmFtZXNwYWNlQUFBLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1MGQ0NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9TY2hlbWFOYW1lc3BhY2VBQUEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL0FBQSIgeG1sbnM6U2NoZW1hTmFtZXNwYWNlQUFBPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIj4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L1dTRExJbXBvcnRpbmdTY2hlbWFJbXBvcnRpbmdTY2hlbWEud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L1dTRExJbXBvcnRpbmdTY2hlbWFJbXBvcnRpbmdTY2hlbWEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiZTc4Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9XU0RMSW1wb3J0aW5nU2NoZW1hSW1wb3J0aW5nU2NoZW1hLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9XU0RMSW1wb3J0aW5nU2NoZW1hSW1wb3J0aW5nU2NoZW1hLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IldTRExJbXBvcnRpbmdTY2hlbWFJbXBvcnRpbmdTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1dTRExJbXBvcnRpbmdTY2hlbWFJbXBvcnRpbmdTY2hlbWEvIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgICAgICAgICA8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iIHNjaGVtYUxvY2F0aW9uPSJJbXBvcnRpbmdTY2hlbWFOb3RJbkRpci54c2QiLz4KLQkJPC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L1dTRExJbXBvcnRpbmdUeXBlcy53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvV1NETEltcG9ydGluZ1R5cGVzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDM3ZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvV1NETEltcG9ydGluZ1R5cGVzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9XU0RMSW1wb3J0aW5nVHlwZXMvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iV1NETEltcG9ydGluZ1R5cGVzIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9XU0RMSW1wb3J0aW5nVHlwZXMvIiB4bWxuczp3c2RsMT0iaHR0cDovL3RlbXB1cmkub3JnL1dTRExPbmx5VHlwZXMvIj4KLSAgICA8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvV1NETE9ubHlUeXBlcy8iIGxvY2F0aW9uPSJXU0RMT25seVR5cGVzLndzZGwiPjwvd3NkbDppbXBvcnQ+ICAgIAotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3TWVzc2FnZSI+Ci0gICAgCTx3c2RsOnBhcnQgbmFtZT0iTmV3TWVzc2FnZSIgZWxlbWVudD0id3NkbDE6TmV3R2xvYmFsRWxlbWVudCI+PC93c2RsOnBhcnQ+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgCi08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9XU0RMTmFtZXNwYWNlQUFBLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9XU0RMTmFtZXNwYWNlQUFBLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YzE4ZGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvV1NETE5hbWVzcGFjZUFBQS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vQUFBIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iV1NETE5hbWVzcGFjZUFBQSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vQUFBIj4KLQk8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vQUFBIiBsb2NhdGlvbj0iU2NoZW1hTmFtZXNwYWNlQUFBLnhzZCI+PC93c2RsOmltcG9ydD4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L1dTRExPbmx5VHlwZXMud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L1dTRExPbmx5VHlwZXMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmNGY2NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9XU0RMT25seVR5cGVzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9XU0RMT25seVR5cGVzLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IldTRExPbmx5VHlwZXMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1dTRExPbmx5VHlwZXMvIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvV1NETE9ubHlUeXBlcy8iPgotCQk8eHNkOmVsZW1lbnQgbmFtZT0iTmV3R2xvYmFsRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+PC94c2Q6ZWxlbWVudD48L3hzZDpzY2hlbWE+Ci0JPC93c2RsOnR5cGVzPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvc2NoZW1hLnhzZCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L3NjaGVtYS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZWU1MGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvc2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iIHhtbG5zOnNjaGVtYT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSI+Ci0JPGVsZW1lbnQgbmFtZT0iTmV3R2xvYmFsRWxlbWVudCIgdHlwZT0ic3RyaW5nIj48L2VsZW1lbnQ+Ci0KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L3NpbXBsZXdzZGwud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L3NpbXBsZXdzZGwud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmMzdhZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9zaW1wbGV3c2RsLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9zaW1wbGV3c2RsLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InNpbXBsZXdzZGwiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL3NpbXBsZXdzZGwvIi8+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9zdWJmb2xkZXIvSW1wb3J0ZWRJbXBvcnRpbmdTY2hlbWEud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L3N1YmZvbGRlci9JbXBvcnRlZEltcG9ydGluZ1NjaGVtYS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzJmZDJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L3N1YmZvbGRlci9JbXBvcnRlZEltcG9ydGluZ1NjaGVtYS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydGVkSW1wb3J0aW5nU2NoZW1hLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IkltcG9ydGVkSW1wb3J0aW5nU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRlZEltcG9ydGluZ1NjaGVtYS8iPgotCTx3c2RsOnR5cGVzPgotCQk8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRlZEltcG9ydGluZ1NjaGVtYS8iCi0gICAgICAgICAgICB4bWxuczpJbXBvcnRlZFdTRExJbXBvcnRlZFNjaGVtYT0iaHR0cDovL0ltcG9ydGVkV1NETEltcG9ydGVkU2NoZW1hIj4KLQkJPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vSW1wb3J0ZWRXU0RMSW1wb3J0ZWRTY2hlbWEiIHNjaGVtYUxvY2F0aW9uPSJJbXBvcnRlZFdTRExJbXBvcnRlZFNjaGVtYS54c2QiPjwveHNkOmltcG9ydD4KLQkJPHhzZDplbGVtZW50IG5hbWU9Ik5ld0dsb2JhbEVsZW1lbnQiIHR5cGU9IkltcG9ydGVkV1NETEltcG9ydGVkU2NoZW1hOk5ld1NpbXBsZVR5cGUiPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L3N1YmZvbGRlci9JbXBvcnRlZFdTRExJbXBvcnRlZFNjaGVtYS54c2QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9zdWJmb2xkZXIvSW1wb3J0ZWRXU0RMSW1wb3J0ZWRTY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTAyYzAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L3N1YmZvbGRlci9JbXBvcnRlZFdTRExJbXBvcnRlZFNjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vSW1wb3J0ZWRXU0RMSW1wb3J0ZWRTY2hlbWEiIHhtbG5zOkltcG9ydGVkV1NETEltcG9ydGVkU2NoZW1hPSJodHRwOi8vSW1wb3J0ZWRXU0RMSW1wb3J0ZWRTY2hlbWEiPgotICA8c2ltcGxlVHlwZSBuYW1lPSJOZXdTaW1wbGVUeXBlIj4KLSAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgIDxtaW5MZW5ndGggdmFsdWU9IjEiLz4KLSAgICA8L3Jlc3RyaWN0aW9uPgotICA8L3NpbXBsZVR5cGU+Ci08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9zdWJmb2xkZXIvUGxhaW5TY2hlbWEueHNkIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvc3ViZm9sZGVyL1BsYWluU2NoZW1hLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VkZTc1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9zdWJmb2xkZXIvUGxhaW5TY2hlbWEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3BsYWluc2NoZW1hIiB4bWxuczpQbGFpblNjaGVtYT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSI+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iTmV3U2ltcGxlVHlwZSI+Ci0gICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICA8bWluTGVuZ3RoIHZhbHVlPSIxIi8+Ci0gICAgPC9yZXN0cmljdGlvbj4KLSAgPC9zaW1wbGVUeXBlPgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL0VtcHR5LndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML1NlbGZDb250YWluZWQvRW1wdHkud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML1NlbGZDb250YWluZWQvRW1wdHkud3NkbAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML1NlbGZDb250YWluZWQvTm9EZWZhdWx0TmFtZXNwYWNlL05vRGVmYXVsdE5hbWVzcGFjZS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL05vRGVmYXVsdE5hbWVzcGFjZS9Ob0RlZmF1bHROYW1lc3BhY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTczM2U4Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML1NlbGZDb250YWluZWQvTm9EZWZhdWx0TmFtZXNwYWNlL05vRGVmYXVsdE5hbWVzcGFjZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvTm9EZWZhdWx0TmFtZXNwYWNlLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Ik5vRGVmYXVsdE5hbWVzcGFjZSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvTm9EZWZhdWx0TmFtZXNwYWNlLyI+Ci0gIDx3c2RsOmRvY3VtZW50YXRpb24+Ci0gICAgPGVsZW1lbnROb05hbWVzcGFjZS8+Ci0gIDwvd3NkbDpkb2N1bWVudGF0aW9uPiAgICAKLTwvd3NkbDpkZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML1NlbGZDb250YWluZWQvUmVmZXJlbmNlSW5saW5lVHlwZXMud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvU2VsZkNvbnRhaW5lZC9SZWZlcmVuY2VJbmxpbmVUeXBlcy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmMxMzMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvU2VsZkNvbnRhaW5lZC9SZWZlcmVuY2VJbmxpbmVUeXBlcy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL1JlZmVyZW5jZUlubGluZVR5cGVzLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IlJlZmVyZW5jZUlubGluZVR5cGVzIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9SZWZlcmVuY2VJbmxpbmVUeXBlcy8iPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3TWVzc2FnZSI+Ci0gICAgCTx3c2RsOnBhcnQgbmFtZT0iTmV3TWVzc2FnZSIgZWxlbWVudD0idG5zOk5ld0dsb2JhbEVsZW1lbnQiPjwvd3NkbDpwYXJ0PgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOnR5cGVzPgotCQk8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9SZWZlcmVuY2VJbmxpbmVUeXBlcy8iPgotCQk8eHNkOmVsZW1lbnQgbmFtZT0iTmV3R2xvYmFsRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+PC94c2Q6ZWxlbWVudD48L3hzZDpzY2hlbWE+Ci0JPC93c2RsOnR5cGVzPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL1NPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML1NlbGZDb250YWluZWQvU09BUEJvZHlFbmNvZGVkTm9OYW1lc3BhY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlYmNkOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML1NlbGZDb250YWluZWQvU09BUEJvZHlFbmNvZGVkTm9OYW1lc3BhY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9TT0FQQm9keUVuY29kZWROb05hbWVzcGFjZS8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJTT0FQQm9keUVuY29kZWROb05hbWVzcGFjZSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvU09BUEJvZHlFbmNvZGVkTm9OYW1lc3BhY2UvIj4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlNPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpOZXdPcGVyYXRpb25SZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOk5ld09wZXJhdGlvblJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IlNPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlU09BUCIgdHlwZT0idG5zOlNPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlIj4KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbiI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL1NPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlL05ld09wZXJhdGlvbiIvPgotICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHVzZT0iZW5jb2RlZCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB1c2U9ImVuY29kZWQiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iU09BUEJvZHlFbmNvZGVkTm9OYW1lc3BhY2UiPgotICAgIDx3c2RsOnBvcnQgYmluZGluZz0idG5zOlNPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlU09BUCIgbmFtZT0iU09BUEJvZHlFbmNvZGVkTm9OYW1lc3BhY2VTT0FQIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML1NlbGZDb250YWluZWQvU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL1NPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE0MTNmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML1NlbGZDb250YWluZWQvU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL1NPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2UvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZS8iPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iTmV3T3BlcmF0aW9uUmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZSI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbiI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpOZXdPcGVyYXRpb25SZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJTT0FQQm9keUVuY29kZWRXaXRoTmFtZXNwYWNlU09BUCIgdHlwZT0idG5zOlNPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2UiPgotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZS9OZXdPcGVyYXRpb24iLz4KLSAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICA8c29hcDpib2R5IGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9TT0FQQm9keUVuY29kZWRXaXRoTmFtZXNwYWNlLyIgdXNlPSJlbmNvZGVkIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1NPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2UvIiB1c2U9ImVuY29kZWQiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZSI+Ci0gICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6U09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZVNPQVAiIG5hbWU9IlNPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2VTT0FQIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvRW50aXRpZXMvbm9ybWFsaXplRW50aXRpZXNJbnZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvRW50aXRpZXMvbm9ybWFsaXplRW50aXRpZXNJbnZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNzIyOWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL0VudGl0aWVzL25vcm1hbGl6ZUVudGl0aWVzSW52YWxpZC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gSW52YWxpZCB0ZXN0IGZvciBFY2xpcHNlIGRlZmVjdCA3MDY3MC4gLS0+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9ub3JtYWxpemVFbnRpdGllc0ludmFsaWQvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ibm9ybWFsaXplRW50aXRpZXNJbnZhbGlkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9ub3JtYWxpemVFbnRpdGllc0ludmFsaWQvIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvbm9ybWFsaXplRW50aXRpZXNJbnZhbGlkLyI+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFTdHJpbmciPiAKLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+IAotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iRnw8fD58fnxIfEp8eCIvPiAKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPiAKLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPiAKLSAgICAgICAgICA8L3hzZDplbGVtZW50PiAKLQkJPC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9FbnRpdGllcy9ub3JtYWxpemVFbnRpdGllc1ZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvRW50aXRpZXMvbm9ybWFsaXplRW50aXRpZXNWYWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVlYTRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9FbnRpdGllcy9ub3JtYWxpemVFbnRpdGllc1ZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBWYWxpZCB0ZXN0IGZvciBFY2xpcHNlIGRlZmVjdCA3MDY3MC4gLS0+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9ub3JtYWxpemVFbnRpdGVzVmFsaWQvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ibm9ybWFsaXplRW50aXRlc1ZhbGlkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9ub3JtYWxpemVFbnRpdGVzVmFsaWQvIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvbm9ybWFsaXplRW50aXRlc1ZhbGlkLyI+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFTdHJpbmciPiAKLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+IAotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iRnwmbHQ7fCZndDt8fnxIfEp8eCIvPiAKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPiAKLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPiAKLSAgICAgICAgICA8L3hzZDplbGVtZW50PiAKLQkJPC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZS9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL0ltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlL0ltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzODc4MzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL0ltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlL0ltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGRlZmluaXRpb25zIG5hbWU9IkltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlIgotCXhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0LmNvbS9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZSIKLQl4bWxuczp0bnM9Imh0dHA6Ly90ZXN0LmNvbS9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZSIKLQl4bWxuczpzY2g9Imh0dHA6Ly90ZXN0LmNvbS9zY2hlbWEiCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0JCi0JPHR5cGVzPgotCQk8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0LmNvbS9zY2hlbWEiPgkJCQotCQkJPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWEueHNkIi8+Ci0JCTwveHNkOnNjaGVtYT4KLQkJCQotCQk8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0LmNvbS9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZSIgeG1sbnM6c2NoPSJodHRwOi8vdGVzdC5jb20vc2NoZW1hIj4KLQkJCTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3Rlc3QuY29tL3NjaGVtYSIvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9IkVsZW1lbnQiIHR5cGU9InNjaDpNeVR5cGUiLz4KLQkJPC94c2Q6c2NoZW1hPgotCTwvdHlwZXM+CQotCQotCTxtZXNzYWdlIG5hbWU9InJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJ0IiBlbGVtZW50PSJ0bnM6RWxlbWVudCIvPgotCTwvbWVzc2FnZT4JCQotCQotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUvc2NoZW1hLnhzZCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZS9zY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTA2ZTdiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZS9zY2hlbWEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0LmNvbS9zY2hlbWEiIAotCXhtbG5zOnRucz0iaHR0cDovL3Rlc3QuY29tL3NjaGVtYSI+Ci0JCi0JPGNvbXBsZXhUeXBlIG5hbWU9Ik15VHlwZSI+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0iYXR0b25lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJhdHR0d28iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCTwvY29tcGxleFR5cGU+Ci0JCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvSW5saW5lU2NoZW1hR2VuZXJhdGVkSW1wb3J0cy9Ob0ltcG9ydEZvclVucHJlZml4ZWRBdHRyaWJ1dGUud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9JbmxpbmVTY2hlbWFHZW5lcmF0ZWRJbXBvcnRzL05vSW1wb3J0Rm9yVW5wcmVmaXhlZEF0dHJpYnV0ZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA3OWNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9JbmxpbmVTY2hlbWFHZW5lcmF0ZWRJbXBvcnRzL05vSW1wb3J0Rm9yVW5wcmVmaXhlZEF0dHJpYnV0ZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9Ob0ltcG9ydEZvclVucHJlZml4ZWRBdHRyaWJ1dGUvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJOb0ltcG9ydEZvclVucHJlZml4ZWRBdHRyaWJ1dGUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9Ob0ltcG9ydEZvclVucHJlZml4ZWRBdHRyaWJ1dGUvIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vTm9JbXBvcnRGb3JVbnByZWZpeGVkQXR0cmlidXRlLyIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCI+Ci0JCQk8eHM6Y29tcGxleFR5cGUgbmFtZT0idHlwZVdpdGhNaW5NYXhPY2N1cnMiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImVsZW0xIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImVsZW0yIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpjb21wbGV4VHlwZT4KLQkJCTx4czpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlV2l0aFJlc3RyaWN0aW9uIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9ImVsZW0zIj4KLQkJCQkJCTx4czpzaW1wbGVUeXBlPgotCQkJCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLQkJCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzb21ldGhpbmciLz4KLQkJCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgotCQkJCQkJPC94czpzaW1wbGVUeXBlPgotCQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6Y29tcGxleFR5cGU+Ci0JCTwveHM6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLTwvd3NkbDpkZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhNTRkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJPbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0QiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC8iIHhtbG5zOnhzZDE9Imh0dHA6Ly90ZW1wdXJpLm9yZy9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0QvMSIgeG1sbnM6eHNkMj0iaHR0cDovL3RlbXB1cmkub3JnL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC8xIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNELzEiPgotCQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdHbG9iYWxFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nYSI+PC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2NoZW1hPgotCQk8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0QvMiI+Ci0JCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOZXdDb21wbGV4VHlwZSI+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJ4c2QxOk5ld0dsb2JhbEVsZW1lbnQiPjwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQkJPC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9SZWZlclRvQW5vdGhlcklubGluZVR5cGUvUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTk4ZmRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9SZWZlclRvQW5vdGhlcklubGluZVR5cGUvUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IlJlZmVyVG9Bbm90aGVySW5saW5lVHlwZSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlLyI+Ci0JPHdzZGw6dHlwZXM+Ci0JCTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZTEvIgotICAgICAgICAgICAgeG1sbnM6dHdvPSJodHRwOi8vdGVtcHVyaS5vcmcvUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlMi8iPgotICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJOZXdTaW1wbGVUeXBlIj4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6bWluTGVuZ3RoIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotCQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdHbG9iYWxFbGVtZW50IiB0eXBlPSJ0d286TmV3U2ltcGxlVHlwZSI+PC94c2Q6ZWxlbWVudD4KLQkJPC94c2Q6c2NoZW1hPgotCQk8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9SZWZlclRvQW5vdGhlcklubGluZVR5cGUyLyIKLSAgICAgICAgICAgIHhtbG5zOm9uZT0iaHR0cDovL3RlbXB1cmkub3JnL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZTEvIj4KLQkJICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTmV3U2ltcGxlVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICA8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLQkJICA8eHNkOmVsZW1lbnQgbmFtZT0iTmV3R2xvYmFsRWxlbWVudCIgdHlwZT0ib25lOk5ld1NpbXBsZVR5cGUiPjwveHNkOmVsZW1lbnQ+Ci0JCTwveHNkOnNjaGVtYT4KLQk8L3dzZGw6dHlwZXM+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvUmVzdHJpY3Rpb25QYXR0ZXJuV2l0aENvbG9uL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi9SZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxNDM3Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvUmVzdHJpY3Rpb25QYXR0ZXJuV2l0aENvbG9uL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJSZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi8iPgotCTx3c2RsOnR5cGVzPgotCQk8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9SZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24vIj4KLSAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0aW1lIj4gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IihbMC05XXsyfTpbMC05XXsyfTpbMC05XXsyfSl8KCNlbXB0eSB2YWx1ZSkiLz4gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4gICAgICAgICAgCi0JCTwveHNkOnNjaGVtYT4KLQk8L3dzZGw6dHlwZXM+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvU2NoZW1hRG9jRWxlbVdpdGhTb3VyY2VBbmRTdWJFbGVtL1NjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL1NjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS9TY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY1MzQzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvU2NoZW1hRG9jRWxlbVdpdGhTb3VyY2VBbmRTdWJFbGVtL1NjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zYW1wbGUvIiAKLSAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9zYW1wbGUvIiAKLSAgICAgICAgICAgICB4bWxuczppYm09Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iIAotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0JPHR5cGVzPgotCQk8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCI+Ci0JCQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iTmFtZSI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSI+Ci0JCQkJCQk8Y2hvaWNlIC8+Ci0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmNvbXBsZXhUeXBlPgotCQk8L3hzOnNjaGVtYT4KLQk8L3R5cGVzPgotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvVmFsdWVDb2xvbi9WYWx1ZUNvbG9uLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvVmFsdWVDb2xvbi9WYWx1ZUNvbG9uLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NDMzOWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL1ZhbHVlQ29sb24vVmFsdWVDb2xvbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL1ZhbHVlQ29sb24vIgotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IlZhbHVlQ29sb24iCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvVmFsdWVDb2xvbi8iPgotCTx3c2RsOnR5cGVzPgotCQk8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9WYWx1ZUNvbG9uLyI+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iTXlFbGVtZW50Ij4KLQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6YXBwaW5mbyBzb3VyY2U9Imh0dHA6Ly9zYW1wbGUuY29tIj4KLQkJCQkJCTx4c2Q6aW5pdGlhbFZhbHVlIGtpbmQ9InN0cmluZ192YWx1ZSIgdmFsdWU9IjoiLz4KLQkJCQkJPC94c2Q6YXBwaW5mbz4KLQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJPC94c2Q6ZWxlbWVudD4KLQkJPC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLTwvd3NkbDpkZWZpbml0aW9ucz4K